From ddba46086a9754c01f3b11d7521c49d4489de84b Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 4 Jul 2023 14:19:15 +0200 Subject: [PATCH 001/331] Better distinguish model and HTTP plugins (#2827) So far, servers have tacitly worked with the notion that plugins come in two flavors: "HTTP plugins" and "model plugins": - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. - A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. However, this notion was never reified in the type system. Thus, users who pass in a model plugin where a HTTP plugin is expected or viceversa in several APIs: ```rust let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); let app = SimpleService::builder_with_plugins(http_plugins, IdentityPlugin) .post_operation(handler) /* ... */ .build() .unwrap(); ``` would get the typical Tower service compilation errors, which can get very confusing: ``` error[E0631]: type mismatch in function arguments --> simple/rust-server-codegen/src/main.rs:47:6 | 15 | fn new_svc(inner: S) -> model_plugin::PostOperationService { | -------------------------------------------------------------------------- found signature defined here ... 47 | .post_operation(post_operation) | ^^^^^^^^^^^^^^ expected due to this | = note: expected function signature `fn(Upgrade, _>>) -> _` found function signature `fn(aws_smithy_http_server::operation::IntoService) -> _` = note: required for `LayerFn) -> ... {new_svc::<..., ...>}>` to implement `Layer, _>>>` = note: the full type name has been written to '/local/home/davidpz/workplace/smithy-ws/src/SmithyRsSource/target/debug/deps/simple-6577f9f79749ceb9.long-type-4938700695428041031.txt' ``` This commit introduces the `HttpPlugin` and `ModelPlugin` marker traits, allowing plugins to be marked as an HTTP plugin, a model plugin, or both. It also removes the primary way of concatenating plugins, `PluginPipeline`, in favor of `HttpPlugins` and `ModelPlugins`, which eagerly check that whenever a plugin is `push`ed, it is of the expected type. The generated service type in the server SDKs' `builder_with_plugins` constructor now takes an `HttpPlugin` as its first parameter, and a `ModelPlugin` as its second parameter. I think this change perhaps goes counter to the generally accepted wisdom that trait bounds in Rust should be enforced "at the latest possible moment", that is, only when the behavior encoded in the trait implementation is relied upon in the code (citation needed). However, the result is that exposing the concepts of HTTP plugin and model plugin in the type system makes for code that is easier to reason about, and produces more helpful compiler error messages. Documentation about the plugin system has been expanded, particularly on how to implement model plugins. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 40 ++- .../smithy/generators/ServerRootGenerator.kt | 9 +- .../ServerRuntimeTypesReExportsGenerator.kt | 7 +- .../generators/ServerServiceGenerator.kt | 35 +- design/src/server/anatomy.md | 32 +- design/src/server/instrumentation.md | 4 +- design/src/server/middleware.md | 28 +- .../tests/plugins_execution_order.rs | 16 +- examples/pokemon-service/src/main.rs | 6 +- examples/pokemon-service/src/plugin.rs | 13 +- .../aws-smithy-http-server/src/extension.rs | 14 +- .../src/instrumentation/plugin.rs | 10 +- .../src/plugin/alb_health_check.rs | 4 +- .../src/plugin/filter.rs | 11 +- .../plugin/{pipeline.rs => http_plugins.rs} | 113 ++++--- .../src/plugin/identity.rs | 6 +- .../src/plugin/layer.rs | 8 +- .../aws-smithy-http-server/src/plugin/mod.rs | 305 +++++++++++++++++- .../src/plugin/model_plugins.rs | 94 ++++++ .../src/plugin/scoped.rs | 7 +- .../src/plugin/stack.rs | 21 +- 21 files changed, 627 insertions(+), 156 deletions(-) rename rust-runtime/aws-smithy-http-server/src/plugin/{pipeline.rs => http_plugins.rs} (50%) create mode 100644 rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 35349116c0b..f3ac9bdc438 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -210,6 +210,7 @@ message = """The middleware system has been reworked as we push for a unified, s - A `ServiceShape` trait has been added. - The `Plugin` trait has been simplified. +- The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to. - The `Operation` structure has been removed. - A `Scoped` `Plugin` has been added. @@ -371,6 +372,8 @@ where PrintService { inner, name: Op::ID.name() } } } + +impl HttpMarker for PrintPlugin { } ``` Alternatively, using the new `ServiceShape`, implemented on `Ser`: @@ -397,6 +400,11 @@ let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plug .unwrap(); ``` +To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both: + +- A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. +- A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. + The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: @@ -413,6 +421,34 @@ let plugin = /* some plugin */; let layer = LayerPlugin::new::(plugin); ``` +## Removal of `PluginPipeline` + +Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type. + +This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful: + +```rust +use aws_smithy_http_server::plugin::PluginPipeline; + +let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); +``` + +Now collections of plugins must contain plugins of the same flavor: + +```rust +use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins}; + +let http_plugins = HttpPlugins::new() + .push(http_plugin) + // .push(model_plugin) // This fails to compile with a helpful error message. + .push(&http_and_model_plugin); +let model_plugins = ModelPlugins::new() + .push(model_plugin) + .push(&http_and_model_plugin); +``` + +In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections. + ## Removal of `Operation` The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to @@ -495,8 +531,8 @@ let scoped_plugin = Scoped::new::(plugin); ``` """ -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] -meta = { "breaking" = true, "tada" = false, "bug" = false } +references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779", "smithy-rs#2827"] +meta = { "breaking" = true, "tada" = true, "bug" = false } author = "hlbarber" [[smithy-rs]] diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt index c8c1dd8450a..e300d248b17 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt @@ -106,7 +106,8 @@ open class ServerRootGenerator( //! #### Plugins //! //! The [`$serviceName::builder_with_plugins`] method, returning [`$builderName`], - //! accepts a [`Plugin`](aws_smithy_http_server::plugin::Plugin). + //! accepts a plugin marked with [`HttpMarker`](aws_smithy_http_server::plugin::HttpMarker) and a + //! plugin marked with [`ModelMarker`](aws_smithy_http_server::plugin::ModelMarker). //! Plugins allow you to build middleware which is aware of the operation it is being applied to. //! //! ```rust @@ -114,13 +115,13 @@ open class ServerRootGenerator( //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin as LoggingPlugin; //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin as MetricsPlugin; //! ## use #{Hyper}::Body; - //! use #{SmithyHttpServer}::plugin::PluginPipeline; + //! use #{SmithyHttpServer}::plugin::HttpPlugins; //! use $crateName::{$serviceName, $builderName}; //! - //! let plugins = PluginPipeline::new() + //! let http_plugins = HttpPlugins::new() //! .push(LoggingPlugin) //! .push(MetricsPlugin); - //! let builder: $builderName = $serviceName::builder_with_plugins(plugins, IdentityPlugin); + //! let builder: $builderName = $serviceName::builder_with_plugins(http_plugins, IdentityPlugin); //! ``` //! //! Check out [`#{SmithyHttpServer}::plugin`] to learn more about plugins. diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt index 85a95076484..a6f62246d87 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt @@ -9,14 +9,12 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency -import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType class ServerRuntimeTypesReExportsGenerator( codegenContext: CodegenContext, ) { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( - "Router" to ServerRuntimeType.router(runtimeConfig), "SmithyHttpServer" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(), ) @@ -30,8 +28,11 @@ class ServerRuntimeTypesReExportsGenerator( pub use #{SmithyHttpServer}::operation::OperationShape; } pub mod plugin { + pub use #{SmithyHttpServer}::plugin::HttpPlugins; + pub use #{SmithyHttpServer}::plugin::ModelPlugins; + pub use #{SmithyHttpServer}::plugin::HttpMarker; + pub use #{SmithyHttpServer}::plugin::ModelMarker; pub use #{SmithyHttpServer}::plugin::Plugin; - pub use #{SmithyHttpServer}::plugin::PluginPipeline; pub use #{SmithyHttpServer}::plugin::PluginStack; } pub mod request { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index 2852734b3fa..2b4e2ee2e98 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -136,7 +136,7 @@ class ServerServiceGenerator( where HandlerType: #{SmithyHttpServer}::operation::Handler, - ModelPlugin: #{SmithyHttpServer}::plugin::Plugin< + ModelPl: #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, #{SmithyHttpServer}::operation::IntoService @@ -144,9 +144,9 @@ class ServerServiceGenerator( #{SmithyHttpServer}::operation::UpgradePlugin::: #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output >, - HttpPlugin: #{SmithyHttpServer}::plugin::Plugin< + HttpPl: #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, < @@ -154,13 +154,13 @@ class ServerServiceGenerator( as #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output > >::Output >, - HttpPlugin::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, - >>::Future: Send + 'static, + HttpPl::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, + >>::Future: Send + 'static, { use #{SmithyHttpServer}::operation::OperationShapeExt; @@ -199,7 +199,7 @@ class ServerServiceGenerator( where S: #{SmithyHttpServer}::operation::OperationService, - ModelPlugin: #{SmithyHttpServer}::plugin::Plugin< + ModelPl: #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, #{SmithyHttpServer}::operation::Normalize @@ -207,9 +207,9 @@ class ServerServiceGenerator( #{SmithyHttpServer}::operation::UpgradePlugin::: #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output >, - HttpPlugin: #{SmithyHttpServer}::plugin::Plugin< + HttpPl: #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, < @@ -217,13 +217,13 @@ class ServerServiceGenerator( as #{SmithyHttpServer}::plugin::Plugin< $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output > >::Output >, - HttpPlugin::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, - >>::Future: Send + 'static, + HttpPl::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, + >>::Future: Send + 'static, { use #{SmithyHttpServer}::operation::OperationShapeExt; @@ -394,7 +394,7 @@ class ServerServiceGenerator( /** Returns a `Writable` containing the builder struct definition and its implementations. */ private fun builder(): Writable = writable { - val builderGenerics = listOf(builderBodyGenericTypeName, "HttpPlugin", "ModelPlugin").joinToString(", ") + val builderGenerics = listOf(builderBodyGenericTypeName, "HttpPl", "ModelPl").joinToString(", ") rustTemplate( """ /// The service builder for [`$serviceName`]. @@ -402,8 +402,8 @@ class ServerServiceGenerator( /// Constructed via [`$serviceName::builder_with_plugins`] or [`$serviceName::builder_without_plugins`]. pub struct $builderName<$builderGenerics> { ${builderFields.joinToString(", ")}, - http_plugin: HttpPlugin, - model_plugin: ModelPlugin + http_plugin: HttpPl, + model_plugin: ModelPl } impl<$builderGenerics> $builderName<$builderGenerics> { @@ -473,9 +473,10 @@ class ServerServiceGenerator( /// /// Use [`$serviceName::builder_without_plugins`] if you don't need to apply plugins. /// - /// Check out [`PluginPipeline`](#{SmithyHttpServer}::plugin::PluginPipeline) if you need to apply + /// Check out [`HttpPlugins`](#{SmithyHttpServer}::plugin::HttpPlugins) and + /// [`ModelPlugins`](#{SmithyHttpServer}::plugin::ModelPlugins) if you need to apply /// multiple plugins. - pub fn builder_with_plugins(http_plugin: HttpPlugin, model_plugin: ModelPlugin) -> $builderName { + pub fn builder_with_plugins(http_plugin: HttpPl, model_plugin: ModelPl) -> $builderName { $builderName { #{NotSetFields:W}, http_plugin, diff --git a/design/src/server/anatomy.md b/design/src/server/anatomy.md index bc7a550c95d..d15f4fbcc04 100644 --- a/design/src/server/anatomy.md +++ b/design/src/server/anatomy.md @@ -466,40 +466,40 @@ stateDiagram-v2 The service builder API requires plugins to be specified upfront - they must be passed as an argument to `builder_with_plugins` and cannot be modified afterwards. You might find yourself wanting to apply _multiple_ plugins to your service. -This can be accommodated via [`PluginPipeline`]. +This can be accommodated via [`HttpPlugins`] and [`ModelPlugins`]. ```rust # extern crate aws_smithy_http_server; -use aws_smithy_http_server::plugin::PluginPipeline; +use aws_smithy_http_server::plugin::HttpPlugins; # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; -let pipeline = PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin); +let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin); ``` The plugins' runtime logic is executed in registration order. In the example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last. -If you are vending a plugin, you can leverage `PluginPipeline` as an extension point: you can add custom methods to it using an extension trait. +If you are vending a plugin, you can leverage `HttpPlugins` or `ModelPlugins` as an extension point: you can add custom methods to it using an extension trait. For example: ```rust # extern crate aws_smithy_http_server; -use aws_smithy_http_server::plugin::{PluginPipeline, PluginStack}; +use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack}; # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; pub trait AuthPluginExt { - fn with_auth(self) -> PluginPipeline>; + fn with_auth(self) -> HttpPlugins>; } -impl AuthPluginExt for PluginPipeline { - fn with_auth(self) -> PluginPipeline> { +impl AuthPluginExt for HttpPlugins { + fn with_auth(self) -> HttpPlugins> { self.push(AuthPlugin) } } -let pipeline = PluginPipeline::new() +let http_plugins = HttpPlugins::new() .push(LoggingPlugin) // Our custom method! .with_auth(); @@ -518,15 +518,15 @@ You can create an instance of a service builder by calling either `builder_witho /// The service builder for [`PokemonService`]. /// /// Constructed via [`PokemonService::builder`]. -pub struct PokemonServiceBuilder { +pub struct PokemonServiceBuilder { capture_pokemon_operation: Option>, empty_operation: Option>, get_pokemon_species: Option>, get_server_statistics: Option>, get_storage: Option>, health_check_operation: Option>, - http_plugin: HttpPlugin, - model_plugin: ModelPlugin + http_plugin: HttpPl, + model_plugin: ModelPl, } ``` @@ -537,7 +537,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g where HandlerType:Handler, - ModelPlugin: Plugin< + ModelPl: Plugin< PokemonService, GetPokemonSpecies, IntoService @@ -547,7 +547,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g GetPokemonSpecies, ModelPlugin::Output >, - HttpPlugin: Plugin< + HttpPl: Plugin< PokemonService, GetPokemonSpecies, UpgradePlugin::::Output @@ -565,7 +565,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g where S: OperationService, - ModelPlugin: Plugin< + ModelPl: Plugin< PokemonService, GetPokemonSpecies, Normalize @@ -575,7 +575,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g GetPokemonSpecies, ModelPlugin::Output >, - HttpPlugin: Plugin< + HttpPl: Plugin< PokemonService, GetPokemonSpecies, UpgradePlugin::::Output diff --git a/design/src/server/instrumentation.md b/design/src/server/instrumentation.md index dfb5ee52520..08c72a20980 100644 --- a/design/src/server/instrumentation.md +++ b/design/src/server/instrumentation.md @@ -66,11 +66,11 @@ This is enabled via the `instrument` method provided by the `aws_smithy_http_ser # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; use aws_smithy_http_server::{ instrumentation::InstrumentExt, - plugin::{IdentityPlugin, PluginPipeline} + plugin::{IdentityPlugin, HttpPlugins} }; use pokemon_service_server_sdk::PokemonService; -let http_plugins = PluginPipeline::new().instrument(); +let http_plugins = HttpPlugins::new().instrument(); let app = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) .get_pokemon_species(handler) /* ... */ diff --git a/design/src/server/middleware.md b/design/src/server/middleware.md index 409c8700fab..af394b1bcaa 100644 --- a/design/src/server/middleware.md +++ b/design/src/server/middleware.md @@ -226,7 +226,7 @@ scope! { // Construct `LoggingLayer`. let logging_plugin = LayerPlugin(LoggingLayer::new()); let logging_plugin = Scoped::new::(logging_plugin); -let http_plugins = PluginPipeline::new().push(logging_plugin); +let http_plugins = HttpPlugins::new().push(logging_plugin); let app /* : PokemonService> */ = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) .get_pokemon_species(handler) @@ -265,7 +265,7 @@ scope! { // Construct `BufferLayer`. let buffer_plugin = LayerPlugin(BufferLayer::new(3)); let buffer_plugin = Scoped::new::(buffer_plugin); -let model_plugins = PluginPipeline::new().push(buffer_plugin); +let model_plugins = ModelPlugins::new().push(buffer_plugin); let app /* : PokemonService> */ = PokemonService::builder_with_plugins(IdentityPlugin, model_plugins) .get_pokemon_species(handler) @@ -347,23 +347,24 @@ where } ``` -You can provide a custom method to add your plugin to a `PluginPipeline` via an extension trait: +You can provide a custom method to add your plugin to a collection of `HttpPlugins` or `ModelPlugins` via an extension trait. For example, for `HttpPlugins`: ```rust # extern crate aws_smithy_http_server; # pub struct PrintPlugin; -use aws_smithy_http_server::plugin::{PluginPipeline, PluginStack}; +# impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { } +use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack}; -/// This provides a [`print`](PrintExt::print) method on [`PluginPipeline`]. +/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`]. pub trait PrintExt { /// Causes all operations to print the operation name when called. /// /// This works by applying the [`PrintPlugin`]. - fn print(self) -> PluginPipeline>; + fn print(self) -> HttpPlugins>; } -impl PrintExt for PluginPipeline { - fn print(self) -> PluginPipeline> { +impl PrintExt for HttpPlugins { + fn print(self) -> HttpPlugins> { self.push(PrintPlugin) } } @@ -377,14 +378,15 @@ This allows for: # use aws_smithy_http_server::plugin::{PluginStack, Plugin}; # struct PrintPlugin; # impl Plugin for PrintPlugin { type Output = T; fn apply(&self, svc: T) -> Self::Output { svc }} -# trait PrintExt { fn print(self) -> PluginPipeline>; } -# impl PrintExt for PluginPipeline { fn print(self) -> PluginPipeline> { self.push(PrintPlugin) }} +# impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { } +# trait PrintExt { fn print(self) -> HttpPlugins>; } +# impl PrintExt for HttpPlugins { fn print(self) -> HttpPlugins> { self.push(PrintPlugin) }} # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; -use aws_smithy_http_server::plugin::{IdentityPlugin, PluginPipeline}; +use aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins}; use pokemon_service_server_sdk::PokemonService; -let http_plugins = PluginPipeline::new() +let http_plugins = HttpPlugins::new() // [..other plugins..] // The custom method! .print(); @@ -397,4 +399,4 @@ let app /* : PokemonService> */ = PokemonService::builder_with_plugins( ``` The custom `print` method hides the details of the `Plugin` trait from the average consumer. -They interact with the utility methods on `PluginPipeline` and enjoy the self-contained documentation. +They interact with the utility methods on `HttpPlugins` and enjoy the self-contained documentation. diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index de9f2632f1e..7a768cb0051 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -11,7 +11,7 @@ use std::{ }; use aws_smithy_http::body::SdkBody; -use aws_smithy_http_server::plugin::{IdentityPlugin, Plugin, PluginPipeline}; +use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, IdentityPlugin, Plugin}; use tower::{Layer, Service}; use pokemon_service_client::{operation::do_nothing::DoNothingInput, Config}; @@ -34,13 +34,15 @@ async fn plugin_layers_are_executed_in_registration_order() { // We can then check the vector content to verify the invocation order let output = Arc::new(Mutex::new(Vec::new())); - let pipeline = PluginPipeline::new() + let http_plugins = HttpPlugins::new() .push(SentinelPlugin::new("first", output.clone())) .push(SentinelPlugin::new("second", output.clone())); - let mut app = - pokemon_service_server_sdk::PokemonService::builder_with_plugins(pipeline, IdentityPlugin) - .do_nothing(do_nothing) - .build_unchecked(); + let mut app = pokemon_service_server_sdk::PokemonService::builder_with_plugins( + http_plugins, + IdentityPlugin, + ) + .do_nothing(do_nothing) + .build_unchecked(); let request = DoNothingInput::builder() .build() .unwrap() @@ -77,6 +79,8 @@ impl Plugin for SentinelPlugin { } } +impl HttpMarker for SentinelPlugin {} + /// A [`Service`] that adds a print log. #[derive(Clone, Debug)] pub struct SentinelService { diff --git a/examples/pokemon-service/src/main.rs b/examples/pokemon-service/src/main.rs index b3aa767f50c..b7566baa2e6 100644 --- a/examples/pokemon-service/src/main.rs +++ b/examples/pokemon-service/src/main.rs @@ -10,7 +10,7 @@ use std::{net::SocketAddr, sync::Arc}; use aws_smithy_http_server::{ extension::OperationExtensionExt, instrumentation::InstrumentExt, - plugin::{alb_health_check::AlbHealthCheckLayer, IdentityPlugin, PluginPipeline, Scoped}, + plugin::{alb_health_check::AlbHealthCheckLayer, HttpPlugins, IdentityPlugin, Scoped}, request::request_id::ServerRequestIdProviderLayer, AddExtensionLayer, }; @@ -51,9 +51,9 @@ pub async fn main() { } } // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope` - let print_plugin = Scoped::new::(PluginPipeline::new().print()); + let print_plugin = Scoped::new::(HttpPlugins::new().print()); - let plugins = PluginPipeline::new() + let plugins = HttpPlugins::new() // Apply the scoped `PrintPlugin` .push(print_plugin) // Apply the `OperationExtensionPlugin` defined in `aws_smithy_http_server::extension`. This allows other diff --git a/examples/pokemon-service/src/plugin.rs b/examples/pokemon-service/src/plugin.rs index e030d3a4727..971aebb0156 100644 --- a/examples/pokemon-service/src/plugin.rs +++ b/examples/pokemon-service/src/plugin.rs @@ -7,7 +7,7 @@ use aws_smithy_http_server::{ operation::OperationShape, - plugin::{Plugin, PluginPipeline, PluginStack}, + plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack}, service::ServiceShape, shape_id::ShapeId, }; @@ -63,16 +63,19 @@ where } } } -/// This provides a [`print`](PrintExt::print) method on [`PluginPipeline`]. + +impl HttpMarker for PrintPlugin {} + +/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`]. pub trait PrintExt { /// Causes all operations to print the operation name when called. /// /// This works by applying the [`PrintPlugin`]. - fn print(self) -> PluginPipeline>; + fn print(self) -> HttpPlugins>; } -impl PrintExt for PluginPipeline { - fn print(self) -> PluginPipeline> { +impl PrintExt for HttpPlugins { + fn print(self) -> HttpPlugins> { self.push(PrintPlugin) } } diff --git a/rust-runtime/aws-smithy-http-server/src/extension.rs b/rust-runtime/aws-smithy-http-server/src/extension.rs index a2a54affb2b..17ff01e9619 100644 --- a/rust-runtime/aws-smithy-http-server/src/extension.rs +++ b/rust-runtime/aws-smithy-http-server/src/extension.rs @@ -28,7 +28,7 @@ use thiserror::Error; use tower::Service; use crate::operation::OperationShape; -use crate::plugin::{Plugin, PluginPipeline, PluginStack}; +use crate::plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack}; use crate::shape_id::ShapeId; pub use crate::request::extension::{Extension, MissingExtension}; @@ -128,16 +128,18 @@ where } } -/// An extension trait on [`PluginPipeline`] allowing the application of [`OperationExtensionPlugin`]. +impl HttpMarker for OperationExtensionPlugin {} + +/// An extension trait on [`HttpPlugins`] allowing the application of [`OperationExtensionPlugin`]. /// /// See [`module`](crate::extension) documentation for more info. pub trait OperationExtensionExt { /// Apply the [`OperationExtensionPlugin`], which inserts the [`OperationExtension`] into every [`http::Response`]. - fn insert_operation_extension(self) -> PluginPipeline>; + fn insert_operation_extension(self) -> HttpPlugins>; } -impl OperationExtensionExt for PluginPipeline { - fn insert_operation_extension(self) -> PluginPipeline> { +impl OperationExtensionExt for HttpPlugins { + fn insert_operation_extension(self) -> HttpPlugins> { self.push(OperationExtensionPlugin) } } @@ -221,7 +223,7 @@ mod tests { } // Apply `Plugin`. - let plugins = PluginPipeline::new().insert_operation_extension(); + let plugins = HttpPlugins::new().insert_operation_extension(); // Apply `Plugin`s `Layer`. let layer = PluginLayer::new::(plugins); diff --git a/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs b/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs index ee88555d731..f2dcca9cac1 100644 --- a/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs +++ b/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::plugin::{PluginPipeline, PluginStack}; +use crate::plugin::{HttpMarker, HttpPlugins, PluginStack}; use crate::{operation::OperationShape, plugin::Plugin}; use super::sensitivity::Sensitivity; @@ -27,17 +27,19 @@ where } } +impl HttpMarker for InstrumentPlugin {} + /// An extension trait for applying [`InstrumentPlugin`]. pub trait InstrumentExt { /// Applies an [`InstrumentOperation`] to every operation, respecting the [@sensitive] trait given on the input and /// output models. See [`InstrumentOperation`](super::InstrumentOperation) for more information. /// /// [@sensitive]: https://awslabs.github.io/smithy/2.0/spec/documentation-traits.html#sensitive-trait - fn instrument(self) -> PluginPipeline>; + fn instrument(self) -> HttpPlugins>; } -impl InstrumentExt for PluginPipeline { - fn instrument(self) -> PluginPipeline> { +impl InstrumentExt for HttpPlugins { + fn instrument(self) -> HttpPlugins> { self.push(InstrumentPlugin) } } diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs b/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs index c87e86619cd..47b5460a3f6 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs @@ -9,9 +9,9 @@ //! # Example //! //! ```no_run -//! # use aws_smithy_http_server::{body, plugin::{PluginPipeline, alb_health_check::AlbHealthCheckLayer}}; +//! # use aws_smithy_http_server::{body, plugin::{HttpPlugins, alb_health_check::AlbHealthCheckLayer}}; //! # use hyper::{Body, Response, StatusCode}; -//! let plugins = PluginPipeline::new() +//! let plugins = HttpPlugins::new() //! // Handle all `/ping` health check requests by returning a `200 OK`. //! .layer(AlbHealthCheckLayer::from_handler("/ping", |_req| async { //! StatusCode::OK diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs b/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs index 0e4a195e6dc..f29fac8e505 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use super::{either::Either, IdentityPlugin}; +use super::{either::Either, IdentityPlugin, ModelMarker}; use crate::operation::OperationShape; use crate::service::ContainsOperation; -use super::Plugin; +use super::{HttpMarker, Plugin}; /// Filters the application of an inner [`Plugin`] using a predicate over the /// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations). @@ -41,11 +41,14 @@ where } } +impl HttpMarker for FilterByOperation where Inner: HttpMarker {} +impl ModelMarker for FilterByOperation where Inner: ModelMarker {} + /// Filters the application of an inner [`Plugin`] using a predicate over the /// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations). /// -/// Users should prefer [`Scoped`](crate::plugin::Scoped) and fallback to [`filter_by_operation`] in cases where -/// [`Plugin`] application must be decided at runtime. +/// Users should prefer [`Scoped`](crate::plugin::Scoped) and fallback to [`filter_by_operation`] +/// in cases where [`Plugin`] application must be decided at runtime. /// /// # Example /// diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/pipeline.rs b/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs similarity index 50% rename from rust-runtime/aws-smithy-http-server/src/plugin/pipeline.rs rename to rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs index acac792c3b8..63aece88a62 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/pipeline.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs @@ -3,25 +3,28 @@ * SPDX-License-Identifier: Apache-2.0 */ +// If you make any updates to this file (including Rust docs), make sure you make them to +// `model_plugins.rs` too! + use crate::plugin::{IdentityPlugin, Plugin, PluginStack}; -use super::LayerPlugin; +use super::{HttpMarker, LayerPlugin}; -/// A wrapper struct for composing [`Plugin`]s. -/// It is used as input for the `builder_with_plugins` method on the generate service struct +/// A wrapper struct for composing HTTP plugins. +/// It can be used as input for the `builder_with_plugins` method on the generated service struct /// (e.g. `PokemonService::builder_with_plugins`). /// /// ## Applying plugins in a sequence /// -/// You can use the [`push`](PluginPipeline::push) method to apply a new plugin after the ones that +/// You can use the [`push`](HttpPlugins::push) method to apply a new HTTP plugin after the ones that /// have already been registered. /// /// ```rust -/// use aws_smithy_http_server::plugin::PluginPipeline; +/// use aws_smithy_http_server::plugin::HttpPlugins; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// -/// let pipeline = PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin); +/// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin); /// ``` /// /// The plugins' runtime logic is executed in registration order. @@ -32,13 +35,14 @@ use super::LayerPlugin; /// From time to time, you might have a need to transform the entire pipeline that has been built /// so far - e.g. you only want to apply those plugins for a specific operation. /// -/// `PluginPipeline` is itself a [`Plugin`]: you can apply any transformation that expects a -/// [`Plugin`] to an entire pipeline. In this case, we want to use -/// [`filter_by_operation`](crate::plugin::filter_by_operation) to limit the scope of -/// the logging and metrics plugins to the `CheckHealth` operation: +/// `HttpPlugins` is itself a [`Plugin`]: you can apply any transformation that expects a +/// [`Plugin`] to an entire pipeline. In this case, we could use a [scoped +/// plugin](crate::plugin::Scoped) to limit the scope of the logging and metrics plugins to the +/// `CheckHealth` operation: /// /// ```rust -/// use aws_smithy_http_server::plugin::{filter_by_operation, PluginPipeline}; +/// use aws_smithy_http_server::scope; +/// use aws_smithy_http_server::plugin::{HttpPlugins, Scoped}; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; @@ -49,91 +53,101 @@ use super::LayerPlugin; /// # impl CheckHealth { const ID: ShapeId = ShapeId::new("namespace#MyName", "namespace", "MyName"); } /// /// // The logging and metrics plugins will only be applied to the `CheckHealth` operation. -/// let plugin = PluginPipeline::new() -/// .push(LoggingPlugin) -/// .push(MetricsPlugin); -/// let filtered_plugin = filter_by_operation(plugin, |operation: Operation| operation == Operation::CheckHealth); -/// let pipeline = PluginPipeline::new() +/// let plugin = HttpPlugins::new() +/// .push(LoggingPlugin) +/// .push(MetricsPlugin); +/// +/// scope! { +/// struct OnlyCheckHealth { +/// includes: [CheckHealth], +/// excludes: [/* The rest of the operations go here */] +/// } +/// } +/// +/// let filtered_plugin = Scoped::new::(&plugin); +/// let http_plugins = HttpPlugins::new() /// .push(filtered_plugin) -/// // The auth plugin will be applied to all operations +/// // The auth plugin will be applied to all operations. /// .push(AuthPlugin); /// ``` /// -/// ## Concatenating two plugin pipelines +/// ## Concatenating two collections of HTTP plugins /// -/// `PluginPipeline` is a good way to bundle together multiple plugins, ensuring they are all +/// `HttpPlugins` is a good way to bundle together multiple plugins, ensuring they are all /// registered in the correct order. /// -/// Since `PluginPipeline` is itself a [`Plugin`], you can use the [`push`](PluginPipeline::push) to -/// append, at once, all the plugins in another pipeline to the current pipeline: +/// Since `HttpPlugins` is itself a HTTP plugin (it implements the `HttpMarker` trait), you can use +/// the [`push`](HttpPlugins::push) to append, at once, all the HTTP plugins in another +/// `HttpPlugins` to the current `HttpPlugins`: /// /// ```rust -/// use aws_smithy_http_server::plugin::{IdentityPlugin, PluginPipeline, PluginStack}; +/// use aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins, PluginStack}; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; /// -/// pub fn get_bundled_pipeline() -> PluginPipeline>> { -/// PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin) +/// pub fn get_bundled_http_plugins() -> HttpPlugins>> { +/// HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin) /// } /// -/// let pipeline = PluginPipeline::new() +/// let http_plugins = HttpPlugins::new() /// .push(AuthPlugin) -/// .push(get_bundled_pipeline()); +/// .push(get_bundled_http_plugins()); /// ``` /// -/// ## Providing custom methods on `PluginPipeline` +/// ## Providing custom methods on `HttpPlugins` /// -/// You use an **extension trait** to add custom methods on `PluginPipeline`. +/// You use an **extension trait** to add custom methods on `HttpPlugins`. /// /// This is a simple example using `AuthPlugin`: /// /// ```rust -/// use aws_smithy_http_server::plugin::{PluginPipeline, PluginStack}; +/// use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack}; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; /// /// pub trait AuthPluginExt { -/// fn with_auth(self) -> PluginPipeline>; +/// fn with_auth(self) -> HttpPlugins>; /// } /// -/// impl AuthPluginExt for PluginPipeline { -/// fn with_auth(self) -> PluginPipeline> { +/// impl AuthPluginExt for HttpPlugins { +/// fn with_auth(self) -> HttpPlugins> { /// self.push(AuthPlugin) /// } /// } /// -/// let pipeline = PluginPipeline::new() +/// let http_plugins = HttpPlugins::new() /// .push(LoggingPlugin) /// // Our custom method! /// .with_auth(); /// ``` -pub struct PluginPipeline

(pub(crate) P); +#[derive(Debug)] +pub struct HttpPlugins

(pub(crate) P); -impl Default for PluginPipeline { +impl Default for HttpPlugins { fn default() -> Self { Self(IdentityPlugin) } } -impl PluginPipeline { - /// Create an empty [`PluginPipeline`]. +impl HttpPlugins { + /// Create an empty [`HttpPlugins`]. /// - /// You can use [`PluginPipeline::push`] to add plugins to it. + /// You can use [`HttpPlugins::push`] to add plugins to it. pub fn new() -> Self { Self::default() } } -impl

PluginPipeline

{ - /// Apply a new plugin after the ones that have already been registered. +impl

HttpPlugins

{ + /// Apply a new HTTP plugin after the ones that have already been registered. /// /// ```rust - /// use aws_smithy_http_server::plugin::PluginPipeline; + /// use aws_smithy_http_server::plugin::HttpPlugins; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// - /// let pipeline = PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin); + /// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin); /// ``` /// /// The plugins' runtime logic is executed in registration order. @@ -163,18 +177,19 @@ impl

PluginPipeline

{ /// } /// } /// ``` - /// - pub fn push(self, new_plugin: NewPlugin) -> PluginPipeline> { - PluginPipeline(PluginStack::new(new_plugin, self.0)) + // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn push(self, new_plugin: NewPlugin) -> HttpPlugins> { + HttpPlugins(PluginStack::new(new_plugin, self.0)) } /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized. - pub fn layer(self, layer: L) -> PluginPipeline, P>> { - PluginPipeline(PluginStack::new(LayerPlugin(layer), self.0)) + pub fn layer(self, layer: L) -> HttpPlugins, P>> { + HttpPlugins(PluginStack::new(LayerPlugin(layer), self.0)) } } -impl Plugin for PluginPipeline +impl Plugin for HttpPlugins where InnerPlugin: Plugin, { @@ -184,3 +199,5 @@ where self.0.apply(input) } } + +impl HttpMarker for HttpPlugins where InnerPlugin: HttpMarker {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs b/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs index affbd9f6b90..6ec684a5326 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs @@ -3,9 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// A [`Plugin`] that maps a service to itself. +#[derive(Debug)] pub struct IdentityPlugin; impl Plugin for IdentityPlugin { @@ -15,3 +16,6 @@ impl Plugin for IdentityPlugin { svc } } + +impl ModelMarker for IdentityPlugin {} +impl HttpMarker for IdentityPlugin {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs b/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs index b1a025b4cb8..0a2f31bc485 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs @@ -7,7 +7,7 @@ use std::marker::PhantomData; use tower::Layer; -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// A [`Plugin`] which acts as a [`Layer`] `L`. pub struct LayerPlugin(pub L); @@ -23,6 +23,12 @@ where } } +// Without more information about what the layer `L` does, we can't know whether it's appropriate +// to run this plugin as a HTTP plugin or a model plugin, so we implement both marker traits. + +impl HttpMarker for LayerPlugin {} +impl ModelMarker for LayerPlugin {} + /// A [`Layer`] which acts as a [`Plugin`] `Pl` for specific protocol `P` and operation `Op`. pub struct PluginLayer { plugin: Pl, diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs index 106dc9200c7..5bbeda3eba7 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs @@ -5,13 +5,42 @@ //! The plugin system allows you to build middleware with an awareness of the operation it is applied to. //! -//! The system centers around the [`Plugin`] trait. In addition, this module provides helpers for composing and -//! combining [`Plugin`]s. +//! The system centers around the [`Plugin`], [`HttpMarker`], and [`ModelMarker`] traits. In +//! addition, this module provides helpers for composing and combining [`Plugin`]s. +//! +//! # HTTP plugins vs model plugins +//! +//! Plugins come in two flavors: _HTTP_ plugins and _model_ plugins. The key difference between +//! them is _when_ they run: +//! +//! - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response +//! after it is serialized. +//! - A model plugin acts on the modeled operation input after it is deserialized, and acts on the +//! modeled operation output or the modeled operation error before it is serialized. +//! +//! See the relevant section in [the book], which contains an illustrative diagram. +//! +//! Both kinds of plugins implement the [`Plugin`] trait, but only HTTP plugins implement the +//! [`HttpMarker`] trait and only model plugins implement the [`ModelMarker`] trait. There is no +//! difference in how an HTTP plugin or a model plugin is applied, so both the [`HttpMarker`] trait +//! and the [`ModelMarker`] trait are _marker traits_, they carry no behavior. Their only purpose +//! is to mark a plugin, at the type system leve, as allowed to run at a certain time. A plugin can be +//! _both_ a HTTP plugin and a model plugin by implementing both traits; in this case, when the +//! plugin runs is decided by you when you register it in your application. [`IdentityPlugin`], +//! [`Scoped`], and [`LayerPlugin`] are examples of plugins that implement both traits. +//! +//! In practice, most plugins are HTTP plugins. Since HTTP plugins run before a request has been +//! correctly deserialized, HTTP plugins should be fast and lightweight. Only use model plugins if +//! you absolutely require your middleware to run after deserialization, or to act on particular +//! fields of your deserialized operation's input/output/errors. +//! +//! [the book]: https://awslabs.github.io/smithy-rs/design/server/anatomy.html //! //! # Filtered application of a HTTP [`Layer`](tower::Layer) //! //! ``` //! # use aws_smithy_http_server::plugin::*; +//! # use aws_smithy_http_server::scope; //! # use aws_smithy_http_server::shape_id::ShapeId; //! # let layer = (); //! # #[derive(PartialEq)] @@ -21,8 +50,18 @@ //! // Create a `Plugin` from a HTTP `Layer` //! let plugin = LayerPlugin(layer); //! -//! // Only apply the layer to operations with name "GetPokemonSpecies" -//! let plugin = filter_by_operation(plugin, |operation: Operation| operation == Operation::GetPokemonSpecies); +//! scope! { +//! struct OnlyGetPokemonSpecies { +//! includes: [GetPokemonSpecies], +//! excludes: [/* The rest of the operations go here */] +//! } +//! } +//! +//! // Only apply the layer to operations with name "GetPokemonSpecies". +//! let filtered_plugin = Scoped::new::(&plugin); +//! +//! // The same effect can be achieved at runtime. +//! let filtered_plugin = filter_by_operation(&plugin, |operation: Operation| operation == Operation::GetPokemonSpecies); //! ``` //! //! # Construct a [`Plugin`] from a closure that takes as input the operation name @@ -68,25 +107,35 @@ //! //! # Combine [`Plugin`]s //! -//! ``` +//! ```no_run //! # use aws_smithy_http_server::plugin::*; -//! # let a = (); let b = (); -//! // Combine `Plugin`s `a` and `b` -//! let plugin = PluginPipeline::new() +//! # struct Foo; +//! # impl HttpMarker for Foo { } +//! # let a = Foo; let b = Foo; +//! // Combine `Plugin`s `a` and `b`. Both need to implement `HttpMarker`. +//! let plugin = HttpPlugins::new() //! .push(a) //! .push(b); //! ``` //! -//! As noted in the [`PluginPipeline`] documentation, the plugins' runtime logic is executed in registration order, +//! As noted in the [`HttpPlugins`] documentation, the plugins' runtime logic is executed in registration order, //! meaning that `a` is run _before_ `b` in the example above. //! -//! # Example Implementation +//! Similarly, you can use [`ModelPlugins`] to combine model plugins. //! -//! ```rust +//! # Example implementation of a [`Plugin`] +//! +//! The following is an example implementation of a [`Plugin`] that prints out the service's name +//! and the name of the operation that was hit every time it runs. Since it doesn't act on the HTTP +//! request nor the modeled operation input/output/errors, this plugin can be both an HTTP plugin +//! and a model plugin. In practice, however, you'd only want to register it once, as either an +//! HTTP plugin or a model plugin. +//! +//! ```no_run //! use aws_smithy_http_server::{ //! operation::OperationShape, //! service::ServiceShape, -//! plugin::{Plugin, PluginPipeline, PluginStack}, +//! plugin::{Plugin, HttpMarker, HttpPlugins, ModelMarker}, //! shape_id::ShapeId, //! }; //! # use tower::{layer::util::Stack, Layer, Service}; @@ -137,16 +186,22 @@ //! } //! } //! } -//! ``` //! +//! // This plugin could be registered as an HTTP plugin and a model plugin, so we implement both +//! // marker traits. +//! +//! impl HttpMarker for PrintPlugin { } +//! impl ModelMarker for PrintPlugin { } +//! ``` pub mod alb_health_check; mod closure; mod either; mod filter; +mod http_plugins; mod identity; mod layer; -mod pipeline; +mod model_plugins; #[doc(hidden)] pub mod scoped; mod stack; @@ -154,9 +209,10 @@ mod stack; pub use closure::{plugin_from_operation_fn, OperationFn}; pub use either::Either; pub use filter::{filter_by_operation, FilterByOperation}; +pub use http_plugins::HttpPlugins; pub use identity::IdentityPlugin; pub use layer::{LayerPlugin, PluginLayer}; -pub use pipeline::PluginPipeline; +pub use model_plugins::ModelPlugins; pub use scoped::Scoped; pub use stack::PluginStack; @@ -188,3 +244,222 @@ where >::apply(self, inner) } } + +/// A HTTP plugin is a plugin that acts on the HTTP request before it is deserialized, and acts on +/// the HTTP response after it is serialized. +/// +/// This trait is a _marker_ trait to indicate that a plugin can be registered as an HTTP plugin. +/// +/// Compare with [`ModelMarker`] in the [module](crate::plugin) documentation, which contains an +/// example implementation too. +pub trait HttpMarker {} +impl<'a, Pl> HttpMarker for &'a Pl where Pl: HttpMarker {} + +/// A model plugin is a plugin that acts on the modeled operation input after it is deserialized, +/// and acts on the modeled operation output or the modeled operation error before it is +/// serialized. +/// +/// This trait is a _marker_ trait to indicate that a plugin can be registered as a model plugin. +/// +/// Compare with [`HttpMarker`] in the [module](crate::plugin) documentation. +/// +/// # Example implementation of a model plugin +/// +/// Model plugins are most useful when you really need to rely on the actual shape of your +/// modeled operation input, operation output, and/or operation errors. For this reason, most +/// model plugins' implementation are _operation-specific_: somewhere in the type signature +/// of their definition, they'll rely on a operation shape's types. It is therefore important +/// that you scope application of model plugins to the operations they are meant to work on, via +/// [`Scoped`](crate::plugin::Scoped) or [`filter_by_operation`](crate::plugin::filter_by_operation). +/// +/// Below is an example implementation of a model plugin that can only be applied to the +/// `CheckHealth` operation: note how in the `Service` trait implementation, we require access to +/// the operation's input, where we log the `health_info` field. +/// +/// ```no_run +/// use std::marker::PhantomData; +/// +/// use aws_smithy_http_server::{operation::OperationShape, plugin::{ModelMarker, Plugin}}; +/// use tower::Service; +/// # pub struct SimpleService; +/// # pub struct CheckHealth; +/// # pub struct CheckHealthInput { +/// # health_info: (), +/// # } +/// # pub struct CheckHealthOutput; +/// # impl aws_smithy_http_server::operation::OperationShape for CheckHealth { +/// # const ID: aws_smithy_http_server::shape_id::ShapeId = aws_smithy_http_server::shape_id::ShapeId::new( +/// # "com.amazonaws.simple#CheckHealth", +/// # "com.amazonaws.simple", +/// # "CheckHealth", +/// # ); +/// # type Input = CheckHealthInput; +/// # type Output = CheckHealthOutput; +/// # type Error = std::convert::Infallible; +/// # } +/// +/// /// A model plugin that can only be applied to the `CheckHealth` operation. +/// pub struct CheckHealthPlugin { +/// pub _exts: PhantomData, +/// } +/// +/// impl CheckHealthPlugin { +/// pub fn new() -> Self { +/// Self { _exts: PhantomData } +/// } +/// } +/// +/// impl Plugin for CheckHealthPlugin { +/// type Output = CheckHealthService; +/// +/// fn apply(&self, input: T) -> Self::Output { +/// CheckHealthService { +/// inner: input, +/// _exts: PhantomData, +/// } +/// } +/// } +/// +/// impl ModelMarker for CheckHealthPlugin { } +/// +/// #[derive(Clone)] +/// pub struct CheckHealthService { +/// inner: S, +/// _exts: PhantomData, +/// } +/// +/// impl Service<(::Input, Exts)> for CheckHealthService +/// where +/// S: Service<(::Input, Exts)>, +/// { +/// type Response = S::Response; +/// type Error = S::Error; +/// type Future = S::Future; +/// +/// fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll> { +/// self.inner.poll_ready(cx) +/// } +/// +/// fn call(&mut self, req: (::Input, Exts)) -> Self::Future { +/// let (input, _exts) = &req; +/// +/// // We have access to `CheckHealth`'s modeled operation input! +/// dbg!(&input.health_info); +/// +/// self.inner.call(req) +/// } +/// } +/// +/// // In `main.rs` or wherever we register plugins, we have to make sure we only apply this plugin +/// // to the the only operation it can be applied to, the `CheckHealth` operation. If we apply the +/// // plugin to other operations, we will get a compilation error. +/// +/// use aws_smithy_http_server::plugin::Scoped; +/// use aws_smithy_http_server::scope; +/// +/// pub fn main() { +/// scope! { +/// struct OnlyCheckHealth { +/// includes: [CheckHealth], +/// excludes: [/* The rest of the operations go here */] +/// } +/// } +/// +/// let model_plugin = CheckHealthPlugin::new(); +/// # _foo(&model_plugin); +/// +/// // Scope the plugin to the `CheckHealth` operation. +/// let scoped_plugin = Scoped::new::(model_plugin); +/// # fn _foo(model_plugin: &CheckHealthPlugin<()>) {} +/// } +/// ``` +/// +/// If you are a service owner and don't care about giving a name to the model plugin, you can +/// simplify this down to: +/// +/// ```no_run +/// use std::marker::PhantomData; +/// +/// use aws_smithy_http_server::operation::OperationShape; +/// use tower::Service; +/// # pub struct SimpleService; +/// # pub struct CheckHealth; +/// # pub struct CheckHealthInput { +/// # health_info: (), +/// # } +/// # pub struct CheckHealthOutput; +/// # impl aws_smithy_http_server::operation::OperationShape for CheckHealth { +/// # const ID: aws_smithy_http_server::shape_id::ShapeId = aws_smithy_http_server::shape_id::ShapeId::new( +/// # "com.amazonaws.simple#CheckHealth", +/// # "com.amazonaws.simple", +/// # "CheckHealth", +/// # ); +/// # type Input = CheckHealthInput; +/// # type Output = CheckHealthOutput; +/// # type Error = std::convert::Infallible; +/// # } +/// +/// #[derive(Clone)] +/// pub struct CheckHealthService { +/// inner: S, +/// _exts: PhantomData, +/// } +/// +/// impl Service<(::Input, Exts)> for CheckHealthService +/// where +/// S: Service<(::Input, Exts)>, +/// { +/// type Response = S::Response; +/// type Error = S::Error; +/// type Future = S::Future; +/// +/// fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll> { +/// self.inner.poll_ready(cx) +/// } +/// +/// fn call(&mut self, req: (::Input, Exts)) -> Self::Future { +/// let (input, _exts) = &req; +/// +/// // We have access to `CheckHealth`'s modeled operation input! +/// dbg!(&input.health_info); +/// +/// self.inner.call(req) +/// } +/// } +/// +/// // In `main.rs`: +/// +/// use aws_smithy_http_server::plugin::LayerPlugin; +/// use aws_smithy_http_server::plugin::Scoped; +/// use aws_smithy_http_server::scope; +/// +/// fn new_check_health_service(inner: S) -> CheckHealthService { +/// CheckHealthService { +/// inner, +/// _exts: PhantomData, +/// } +/// } +/// +/// pub fn main() { +/// scope! { +/// struct OnlyCheckHealth { +/// includes: [CheckHealth], +/// excludes: [/* The rest of the operations go here */] +/// } +/// } +/// +/// # fn new_check_health_service(inner: ()) -> CheckHealthService<(), ()> { +/// # CheckHealthService { +/// # inner, +/// # _exts: PhantomData, +/// # } +/// # } +/// let layer = tower::layer::layer_fn(new_check_health_service); +/// let model_plugin = LayerPlugin(layer); +/// +/// // Scope the plugin to the `CheckHealth` operation. +/// let scoped_plugin = Scoped::new::(model_plugin); +/// } +/// ``` +pub trait ModelMarker {} +impl<'a, Pl> ModelMarker for &'a Pl where Pl: ModelMarker {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs b/rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs new file mode 100644 index 00000000000..05dc8568d70 --- /dev/null +++ b/rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs @@ -0,0 +1,94 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +// If you make any updates to this file (including Rust docs), make sure you make them to +// `http_plugins.rs` too! + +use crate::plugin::{IdentityPlugin, Plugin, PluginStack}; + +use super::{LayerPlugin, ModelMarker}; + +/// A wrapper struct for composing model plugins. +/// It operates identically to [`HttpPlugins`](crate::plugin::HttpPlugins); see its documentation. +#[derive(Debug)] +pub struct ModelPlugins

(pub(crate) P); + +impl Default for ModelPlugins { + fn default() -> Self { + Self(IdentityPlugin) + } +} + +impl ModelPlugins { + /// Create an empty [`ModelPlugins`]. + /// + /// You can use [`ModelPlugins::push`] to add plugins to it. + pub fn new() -> Self { + Self::default() + } +} + +impl

ModelPlugins

{ + /// Apply a new model plugin after the ones that have already been registered. + /// + /// ```rust + /// use aws_smithy_http_server::plugin::ModelPlugins; + /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; + /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; + /// + /// let model_plugins = ModelPlugins::new().push(LoggingPlugin).push(MetricsPlugin); + /// ``` + /// + /// The plugins' runtime logic is executed in registration order. + /// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last. + /// + /// ## Implementation notes + /// + /// Plugins are applied to the underlying [`Service`](tower::Service) in opposite order compared + /// to their registration order. + /// + /// As an example: + /// + /// ```rust,compile_fail + /// #[derive(Debug)] + /// pub struct PrintPlugin; + /// + /// impl Plugin for PrintPlugin + /// // [...] + /// { + /// // [...] + /// fn apply(&self, inner: T) -> Self::Service { + /// PrintService { + /// inner, + /// service_id: Ser::ID, + /// operation_id: Op::ID + /// } + /// } + /// } + /// ``` + // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn push(self, new_plugin: NewPlugin) -> ModelPlugins> { + ModelPlugins(PluginStack::new(new_plugin, self.0)) + } + + /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized. + pub fn layer(self, layer: L) -> ModelPlugins, P>> { + ModelPlugins(PluginStack::new(LayerPlugin(layer), self.0)) + } +} + +impl Plugin for ModelPlugins +where + InnerPlugin: Plugin, +{ + type Output = InnerPlugin::Output; + + fn apply(&self, input: T) -> Self::Output { + self.0.apply(input) + } +} + +impl ModelMarker for ModelPlugins where InnerPlugin: ModelMarker {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs b/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs index a3761b2b1ab..d4b7e82e517 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs @@ -5,7 +5,7 @@ use std::marker::PhantomData; -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// Marker struct for `true`. /// @@ -102,12 +102,15 @@ where } } +impl HttpMarker for Scoped where Pl: HttpMarker {} +impl ModelMarker for Scoped where Pl: ModelMarker {} + /// A macro to help with scoping [plugins](crate::plugin) to a subset of all operations. /// /// The scope must partition _all_ operations, that is, each and every operation must be included or excluded, but not /// both. /// -/// The generated server SDK exports a similar `scope` macro which is aware of a services operations and can complete +/// The generated server SDK exports a similar `scope` macro which is aware of a service's operations and can complete /// underspecified scopes automatically. /// /// # Example diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs b/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs index 63f8e448656..6c96ebaca00 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs @@ -3,13 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// A wrapper struct which composes an `Inner` and an `Outer` [`Plugin`]. /// /// The `Inner::map` is run _then_ the `Outer::map`. /// -/// Note that the primary tool for composing plugins is [`PluginPipeline`](crate::plugin::PluginPipeline). +/// Note that the primary tool for composing HTTP plugins is +/// [`HttpPlugins`](crate::plugin::HttpPlugins), and the primary tool for composing HTTP plugins is +/// [`ModelPlugins`](crate::plugin::ModelPlugins); if you are an application writer, you should +/// prefer composing plugins using these. pub struct PluginStack { inner: Inner, outer: Outer, @@ -34,3 +37,17 @@ where self.outer.apply(svc) } } + +impl HttpMarker for PluginStack +where + Inner: HttpMarker, + Outer: HttpMarker, +{ +} + +impl ModelMarker for PluginStack +where + Inner: ModelMarker, + Outer: ModelMarker, +{ +} From 735b635190b4dab3546edc7c2b74713b247c3e12 Mon Sep 17 00:00:00 2001 From: Burak Date: Mon, 10 Jul 2023 10:31:01 +0100 Subject: [PATCH 002/331] Python: Allow configuring logging formatter (#2829) ## Motivation and Context Allow Python users to configure their logging formatter to either `json`, `pretty` or `compact` (default). ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- examples/python/pokemon_service.py | 9 +- .../aws-smithy-http-server-python/Cargo.toml | 2 +- .../src/logging.rs | 83 ++++++++++++++----- .../src/tls/listener.rs | 2 +- 4 files changed, 72 insertions(+), 24 deletions(-) diff --git a/examples/python/pokemon_service.py b/examples/python/pokemon_service.py index eeb6445eb3d..552d892ff32 100644 --- a/examples/python/pokemon_service.py +++ b/examples/python/pokemon_service.py @@ -50,7 +50,14 @@ # Logging can bee setup using standard Python tooling. We provide # fast logging handler, Tracingandler based on Rust tracing crate. -logging.basicConfig(handlers=[TracingHandler(level=logging.DEBUG).handler()]) +logging.basicConfig( + handlers=[ + TracingHandler( + level=logging.DEBUG, + format="pretty", # You can also use "json" or "compact" (default) + ).handler() + ] +) class SafeCounter: diff --git a/rust-runtime/aws-smithy-http-server-python/Cargo.toml b/rust-runtime/aws-smithy-http-server-python/Cargo.toml index b454eab6260..61ce57d7a76 100644 --- a/rust-runtime/aws-smithy-http-server-python/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server-python/Cargo.toml @@ -38,7 +38,7 @@ tokio = { version = "1.20.1", features = ["full"] } tokio-stream = "0.1" tower = { version = "0.4.13", features = ["util"] } tracing = "0.1.36" -tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.15", features = ["json", "env-filter"] } tracing-appender = { version = "0.2.2"} [dev-dependencies] diff --git a/rust-runtime/aws-smithy-http-server-python/src/logging.rs b/rust-runtime/aws-smithy-http-server-python/src/logging.rs index 80d4966ac0b..57fa2873aa2 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/logging.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/logging.rs @@ -4,7 +4,8 @@ */ //! Rust `tracing` and Python `logging` setup and utilities. -use std::path::PathBuf; + +use std::{path::PathBuf, str::FromStr}; use pyo3::prelude::*; #[cfg(not(test))] @@ -15,15 +16,49 @@ use tracing_subscriber::{ fmt::{self, writer::MakeWriterExt}, layer::SubscriberExt, util::SubscriberInitExt, + Layer, }; use crate::error::PyException; +#[derive(Debug, Default)] +enum Format { + Json, + Pretty, + #[default] + Compact, +} + +#[derive(Debug, PartialEq, Eq)] +struct InvalidFormatError; + +impl FromStr for Format { + type Err = InvalidFormatError; + + fn from_str(s: &str) -> Result { + match s { + "pretty" => Ok(Self::Pretty), + "json" => Ok(Self::Json), + "compact" => Ok(Self::Compact), + _ => Err(InvalidFormatError), + } + } +} + /// Setup tracing-subscriber to log on console or to a hourly rolling file. fn setup_tracing_subscriber( level: Option, logfile: Option, + format: Option, ) -> PyResult> { + let format = match format { + Some(format) => Format::from_str(&format).unwrap_or_else(|_| { + tracing::error!("unknown format '{format}', falling back to default formatter"); + Format::default() + }), + None => Format::default(), + }; + let appender = match logfile { Some(logfile) => { let parent = logfile.parent().ok_or_else(|| { @@ -54,27 +89,27 @@ fn setup_tracing_subscriber( _ => Level::TRACE, }; + let formatter = fmt::Layer::new().with_line_number(true).with_level(true); + match appender { Some((appender, guard)) => { - let layer = Some( - fmt::Layer::new() - .with_writer(appender.with_max_level(tracing_level)) - .with_ansi(true) - .with_line_number(true) - .with_level(true), - ); - tracing_subscriber::registry().with(layer).init(); + let formatter = formatter.with_writer(appender.with_max_level(tracing_level)); + let formatter = match format { + Format::Json => formatter.json().boxed(), + Format::Compact => formatter.compact().boxed(), + Format::Pretty => formatter.pretty().boxed(), + }; + tracing_subscriber::registry().with(formatter).init(); Ok(Some(guard)) } None => { - let layer = Some( - fmt::Layer::new() - .with_writer(std::io::stdout.with_max_level(tracing_level)) - .with_ansi(true) - .with_line_number(true) - .with_level(true), - ); - tracing_subscriber::registry().with(layer).init(); + let formatter = formatter.with_writer(std::io::stdout.with_max_level(tracing_level)); + let formatter = match format { + Format::Json => formatter.json().boxed(), + Format::Compact => formatter.compact().boxed(), + Format::Pretty => formatter.pretty().boxed(), + }; + tracing_subscriber::registry().with(formatter).init(); Ok(None) } } @@ -89,9 +124,10 @@ fn setup_tracing_subscriber( /// /// :param level typing.Optional\[int\]: /// :param logfile typing.Optional\[pathlib.Path\]: +/// :param format typing.Optional\[typing.Literal\['compact', 'pretty', 'json'\]\]: /// :rtype None: #[pyclass(name = "TracingHandler")] -#[pyo3(text_signature = "($self, level=None, logfile=None)")] +#[pyo3(text_signature = "($self, level=None, logfile=None, format=None)")] #[derive(Debug)] pub struct PyTracingHandler { _guard: Option, @@ -100,8 +136,13 @@ pub struct PyTracingHandler { #[pymethods] impl PyTracingHandler { #[new] - fn newpy(py: Python, level: Option, logfile: Option) -> PyResult { - let _guard = setup_tracing_subscriber(level, logfile)?; + fn newpy( + py: Python, + level: Option, + logfile: Option, + format: Option, + ) -> PyResult { + let _guard = setup_tracing_subscriber(level, logfile, format)?; let logging = py.import("logging")?; let root = logging.getattr("root")?; root.setattr("level", level)?; @@ -190,7 +231,7 @@ mod tests { fn tracing_handler_is_injected_in_python() { crate::tests::initialize(); Python::with_gil(|py| { - let handler = PyTracingHandler::newpy(py, Some(10), None).unwrap(); + let handler = PyTracingHandler::newpy(py, Some(10), None, None).unwrap(); let kwargs = PyDict::new(py); kwargs .set_item("handlers", vec![handler.handler(py).unwrap()]) diff --git a/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs b/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs index fb3aa7ac91b..9e6dbed364a 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs @@ -144,7 +144,7 @@ mod tests { assert!(response .unwrap_err() .to_string() - .contains("invalid peer certificate: UnknownIssuer")); + .contains("invalid peer certificate")); } { From 8abc946328e1913ca36e3c7f600237a2bb2c6dc3 Mon Sep 17 00:00:00 2001 From: "Nate McMaster (AWS)" <88004173+mcmasn-amzn@users.noreply.github.com> Date: Mon, 10 Jul 2023 07:56:56 -0700 Subject: [PATCH 003/331] Update OperationInputTestDecorator to find operation shape by name (#2782) ## Motivation and Context Addresses https://github.com/awslabs/smithy-rs/issues/2767 This fixes an issue for users who write endpoint tests that rely on an operation and service shape from different namespaces. ## Description Instead of assuming operation namespace matches service namespace, ## Testing `./gradlew :aws:sdk-codegen:test` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Zelda Hessler --- CHANGELOG.next.toml | 6 ++ .../endpoints/OperationInputTestGenerator.kt | 8 +-- .../OperationInputTestGeneratorTests.kt | 71 +++++++++++++++++++ 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index f3ac9bdc438..d603759359a 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -611,6 +611,12 @@ references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "hlbarber" +[[smithy-rs]] +message = "Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces." +author = "mcmasn-amzn" +references = ["smithy-rs#2767"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } + [[smithy-rs]] message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." references = ["smithy-rs#2783"] diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index 698e732623f..f1a957be611 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -122,9 +122,6 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private val model = ctx.model private val instantiator = ClientInstantiator(ctx) - private fun EndpointTestOperationInput.operationId() = - ShapeId.fromOptionalNamespace(ctx.serviceShape.id.namespace, operationName) - /** the Rust SDK doesn't support SigV4a — search endpoint.properties.authSchemes[].name */ private fun EndpointTestCase.isSigV4a() = expect.endpoint.orNull()?.properties?.get("authSchemes")?.asArrayNode()?.orNull() @@ -183,7 +180,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private fun operationInvocation(testOperationInput: EndpointTestOperationInput) = writable { rust("client.${testOperationInput.operationName.toSnakeCase()}()") val operationInput = - model.expectShape(testOperationInput.operationId(), OperationShape::class.java).inputShape(model) + model.expectShape(ctx.operationId(testOperationInput), OperationShape::class.java).inputShape(model) testOperationInput.operationParams.members.forEach { (key, value) -> val member = operationInput.expectMember(key.value) rustTemplate( @@ -217,3 +214,6 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: } } } + +fun ClientCodegenContext.operationId(testOperationInput: EndpointTestOperationInput): ShapeId = + this.serviceShape.allOperations.first { it.name == testOperationInput.operationName } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt new file mode 100644 index 00000000000..2fde9a6866c --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt @@ -0,0 +1,71 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import software.amazon.smithy.model.Model +import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput +import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rustsdk.endpoints.operationId + +class OperationInputTestGeneratorTests { + @Test + fun `finds operation shape by name`() { + val prefix = "\$version: \"2\"" + val operationModel = """ + $prefix + namespace operations + + operation Ping {} + """.trimIndent() + val serviceModel = """ + $prefix + namespace service + + use operations#Ping + + service MyService { + operations: [Ping] + } + """.trimIndent() + + val model = Model.assembler() + .discoverModels() + .addUnparsedModel("operation.smithy", operationModel) + .addUnparsedModel("main.smithy", serviceModel) + .assemble() + .unwrap() + + val context = testClientCodegenContext(model) + val testOperationInput = EndpointTestOperationInput.builder() + .operationName("Ping") + .build() + + val operationId = context.operationId(testOperationInput) + assertEquals("operations#Ping", operationId.toString()) + } + + @Test + fun `fails for operation name not found`() { + val model = """ + namespace test + operation Ping {} + service MyService { + operations: [Ping] + } + """.trimIndent().asSmithyModel() + + val context = testClientCodegenContext(model) + val testOperationInput = EndpointTestOperationInput.builder() + .operationName("Pong") + .build() + + assertThrows { context.operationId(testOperationInput) } + } +} From 7c9c283a389f73d77cbc9c445b8a980422543ae5 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Mon, 10 Jul 2023 09:57:34 -0500 Subject: [PATCH 004/331] Add `Metadata` to a config layer through operation runtime plugin (#2830) ## Motivation and Context Adds `Metadata` to a config layer through `OperationRuntimePlugin`. ## Description We have had a customer's use case where a service name and a operation name are obtained from [Metadata](https://github.com/awslabs/smithy-rs/blob/ddba46086a9754c01f3b11d7521c49d4489de84b/rust-runtime/aws-smithy-http/src/operation.rs#L17-L22). The end goal was to use their names as part of metrics collection. Previously, it was done using `map_operation` on a `CustomizableOperation`, e.g. ``` client .some_operation() .customize() .await? .map_operation(|operation| { operation.try_clone().map(|operation| { let (_, parts) = operation.into_request_response(); parts.metadata.map(|metadata| { let service_name = metadata.service().to_string().to_uppercase(); let operation_name = metadata.name().to_string(); /* * do something with `service_name` and `operation_name` */ }) }); Ok(operation) })? .send() .await; ``` The orchestrator no longer supports `map_operation` on `CustomizableOperation`. We therefore add `Metadata` to a config layer through `OperationRuntimePlugin`. See the added integration test for how `Metadata` is retrieved from within an interceptor. ## Testing Added an integration-test to verify `Metadata` is properly set. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 Co-authored-by: Zelda Hessler --- .../customizations/MetadataCustomization.kt | 48 ++++++++ .../customize/RequiredCustomizations.kt | 6 +- .../MetadataCustomizationTest.kt | 113 ++++++++++++++++++ rust-runtime/aws-smithy-http/src/operation.rs | 5 + 4 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt new file mode 100644 index 00000000000..03c62fb0493 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.dq +import software.amazon.smithy.rust.codegen.core.util.sdkId + +class MetadataCustomization( + private val codegenContext: ClientCodegenContext, + operation: OperationShape, +) : OperationCustomization() { + private val operationName = codegenContext.symbolProvider.toSymbol(operation).name + private val runtimeConfig = codegenContext.runtimeConfig + private val codegenScope by lazy { + arrayOf( + "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), + ) + } + + override fun section(section: OperationSection): Writable = writable { + when (section) { + is OperationSection.AdditionalRuntimePluginConfig -> { + rustTemplate( + """ + ${section.newLayerName}.store_put(#{Metadata}::new( + ${operationName.dq()}, + ${codegenContext.serviceShape.sdkId().dq()}, + )); + """, + *codegenScope, + ) + } + + else -> {} + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index e26e228c7e6..9c64b5e8fd4 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -15,6 +15,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpVers import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenGenerator import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdentityConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyReExportCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyServiceRuntimePluginCustomization @@ -30,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersi import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyErrorTypes import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization +import software.amazon.smithy.rust.codegen.core.util.letIf val TestUtilFeature = Feature("test-util", false, listOf()) @@ -47,7 +49,9 @@ class RequiredCustomizations : ClientCodegenDecorator { operation: OperationShape, baseCustomizations: List, ): List = - baseCustomizations + + baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { + it + MetadataCustomization(codegenContext, operation) + } + IdempotencyTokenGenerator(codegenContext, operation) + EndpointPrefixGenerator(codegenContext, operation) + HttpChecksumRequiredGenerator(codegenContext, operation) + diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt new file mode 100644 index 00000000000..b827551bdd4 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -0,0 +1,113 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.core.testutil.tokioTest + +class MetadataCustomizationTest { + private val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + @optionalAuth + operation SayHello { input: TestInput } + structure TestInput { + foo: String, + } + """.asSmithyModel() + + @Test + fun `extract metadata via customizable operation`() { + clientIntegrationTest( + model, + params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), + ) { clientCodegenContext, rustCrate -> + val runtimeConfig = clientCodegenContext.runtimeConfig + val codegenScope = arrayOf( + *preludeScope, + "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), + "BoxError" to RuntimeType.boxError(runtimeConfig), + "ConfigBag" to RuntimeType.configBag(runtimeConfig), + "Interceptor" to RuntimeType.interceptor(runtimeConfig), + "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), + "capture_request" to RuntimeType.captureRequest(runtimeConfig), + ) + rustCrate.testModule { + addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) + tokioTest("test_extract_metadata_via_customizable_operation") { + rustTemplate( + """ + // Interceptors aren’t supposed to store states, but it is done this way for a testing purpose. + ##[derive(Debug)] + struct ExtractMetadataInterceptor( + ::std::sync::Mutex<#{Option}<::std::sync::mpsc::Sender<(String, String)>>>, + ); + + impl #{Interceptor} for ExtractMetadataInterceptor { + fn modify_before_signing( + &self, + _context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, + cfg: &mut #{ConfigBag}, + ) -> #{Result}<(), #{BoxError}> { + let metadata = cfg + .load::<#{Metadata}>() + .expect("metadata should exist"); + let service_name = metadata.service().to_string(); + let operation_name = metadata.name().to_string(); + let tx = self.0.lock().unwrap().take().unwrap(); + tx.send((service_name, operation_name)).unwrap(); + #{Ok}(()) + } + } + + let (tx, rx) = ::std::sync::mpsc::channel(); + + let (conn, _captured_request) = #{capture_request}(#{None}); + let client_config = crate::config::Config::builder() + .endpoint_resolver("http://localhost:1234/") + .http_connector(conn) + .build(); + let client = crate::client::Client::from_conf(client_config); + let _ = client + .say_hello() + .customize() + .await + .expect("operation should be customizable") + .interceptor(ExtractMetadataInterceptor(::std::sync::Mutex::new(#{Some}(tx)))) + .send() + .await; + + match rx.recv() { + #{Ok}((service_name, operation_name)) => { + assert_eq!("HelloService", &service_name); + assert_eq!("SayHello", &operation_name); + } + #{Err}(_) => panic!( + "failed to receive service name and operation name from `ExtractMetadataInterceptor`" + ), + } + """, + *codegenScope, + ) + } + } + } + } +} diff --git a/rust-runtime/aws-smithy-http/src/operation.rs b/rust-runtime/aws-smithy-http/src/operation.rs index dadc22b282d..2ddbd280704 100644 --- a/rust-runtime/aws-smithy-http/src/operation.rs +++ b/rust-runtime/aws-smithy-http/src/operation.rs @@ -9,6 +9,7 @@ use crate::body::SdkBody; use crate::property_bag::{PropertyBag, SharedPropertyBag}; use crate::retry::DefaultResponseRetryClassifier; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::borrow::Cow; use std::ops::{Deref, DerefMut}; @@ -44,6 +45,10 @@ impl Metadata { } } +impl Storable for Metadata { + type Storer = StoreReplace; +} + /// Non-request parts of an [`Operation`]. /// /// Generics: From 3a133b180787c2ac83af31db46e361bbfa6c5c1d Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 10 Jul 2023 14:13:50 -0400 Subject: [PATCH 005/331] Prevent non-clone types from entering cloneable layer (#2834) ## Motivation and Context There is a bug in cloneable layer that allows non-clone types to enter ## Description Remove `DerefMut` and resolve the consequences ## Testing - new doc test - existing orchestrator CI ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- .../aws-smithy-types/src/config_bag.rs | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/rust-runtime/aws-smithy-types/src/config_bag.rs b/rust-runtime/aws-smithy-types/src/config_bag.rs index 12fefbe3b13..f293dbea180 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag.rs @@ -19,7 +19,7 @@ use std::borrow::Cow; use std::fmt::{Debug, Formatter}; use std::iter::Rev; use std::marker::PhantomData; -use std::ops::{Deref, DerefMut}; +use std::ops::Deref; use std::slice::Iter; use std::sync::Arc; @@ -64,6 +64,21 @@ impl Default for Value { /// /// While [`FrozenLayer`] is also cloneable, which is a shallow clone via `Arc`, `CloneableLayer` /// performs a deep clone that newly allocates all the items stored in it. +/// +/// Cloneable enforces that non clone items cannot be added +/// ```rust,compile_fail +/// use aws_smithy_types::config_bag::Storable; +/// use aws_smithy_types::config_bag::StoreReplace; +/// use aws_smithy_types::config_bag::CloneableLayer; +/// #[derive(Debug)] +/// struct MyNotCloneStruct; +/// +/// impl Storable for MyNotCloneStruct { +/// type Storer = StoreReplace; +/// } +/// let mut layer = CloneableLayer::new("layer"); +/// layer.store_put(MyNotCloneStruct); +/// ``` #[derive(Debug, Default)] pub struct CloneableLayer(Layer); @@ -75,12 +90,6 @@ impl Deref for CloneableLayer { } } -impl DerefMut for CloneableLayer { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - impl Clone for CloneableLayer { fn clone(&self) -> Self { Self( @@ -110,15 +119,16 @@ impl CloneableLayer { /// Removes `T` from this bag pub fn unset(&mut self) -> &mut Self { - self.put_directly::>(Value::ExplicitlyUnset(type_name::())); + self.0.unset::(); self } - fn put_directly(&mut self, value: T::StoredType) -> &mut Self + fn put_directly_cloneable(&mut self, value: T::StoredType) -> &mut Self where T::StoredType: Clone, { - self.props + self.0 + .props .insert(TypeId::of::(), TypeErasedBox::new_with_clone(value)); self } @@ -128,7 +138,7 @@ impl CloneableLayer { where T: Storable> + Clone, { - self.put_directly::>(Value::Set(item)); + self.put_directly_cloneable::>(Value::Set(item)); self } @@ -142,7 +152,7 @@ impl CloneableLayer { Some(item) => Value::Set(item), None => Value::ExplicitlyUnset(type_name::()), }; - self.put_directly::>(item); + self.put_directly_cloneable::>(item); self } @@ -164,14 +174,15 @@ impl CloneableLayer { where T: Storable> + Clone, { - self.put_directly::>(Value::ExplicitlyUnset(type_name::())); + self.put_directly_cloneable::>(Value::ExplicitlyUnset(type_name::())); } fn get_mut_or_default(&mut self) -> &mut T::StoredType where T::StoredType: Default + Clone, { - self.props + self.0 + .props .entry(TypeId::of::()) .or_insert_with(|| TypeErasedBox::new_with_clone(T::StoredType::default())) .downcast_mut() From 705f0f07005b64fcfe796c388f5dc2a20813f543 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 10 Jul 2023 11:36:15 -0700 Subject: [PATCH 006/331] Increase max line length for generated client code (#2835) This PR increases the max line length on generated client code to reduce the likelihood of rustfmt failing to format files. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt index 9ddbbd4dc8d..fee242cbe11 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt @@ -170,7 +170,8 @@ class ClientCodegenVisitor( ), ) try { - "cargo fmt".runCommand(fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong()) + // use an increased max_width to make rustfmt fail less frequently + "cargo fmt -- --config max_width=150".runCommand(fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong()) } catch (err: CommandFailed) { logger.warning("Failed to run cargo fmt: [${service.id}]\n${err.output}") } From 5ae61a7195930efc379557990604cc24792e0aae Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Mon, 10 Jul 2023 14:30:25 -0500 Subject: [PATCH 007/331] =?UTF-8?q?add=20re=C3=ABxport=20for=20SharedInter?= =?UTF-8?q?ceptor=20to=20SDK=20config=20modules=20(#2837)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We weren't already doing this but we should b/c it's needed to use the `add_interceptor` and `set_interceptors` config methods --- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy/generators/ClientRuntimeTypesReExportGenerator.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 408ff44390f..12fa3e264b3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -28,9 +28,11 @@ class ClientRuntimeTypesReExportGenerator( """ pub use #{ConfigBag}; pub use #{Interceptor}; + pub use #{SharedInterceptor}; """, "ConfigBag" to RuntimeType.configBag(rc), "Interceptor" to RuntimeType.interceptor(rc), + "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), ) } rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) { From 655684b6b7093764640772bb8d16b15619dd271b Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 12 Jul 2023 12:22:04 -0400 Subject: [PATCH 008/331] Include the old stable version in the dockerfile (#2839) ## Motivation and Context The previous rust stable version is required to compile older versions of the SDK ## Testing built the docker image locally _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 3e04f15c7d8..ef3cfbef566 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -6,6 +6,7 @@ # This is the base Docker build image used by CI ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 +ARG prev_rust_stable_version=1.67.1 ARG rust_stable_version=1.68.2 ARG rust_nightly_version=nightly-2023-05-31 @@ -25,6 +26,7 @@ RUN curl https://musl.libc.org/releases/musl-1.2.3.tar.gz -o musl-1.2.3.tar.gz \ FROM bare_base_image AS install_rust ARG rust_stable_version ARG rust_nightly_version +ARG prev_rust_stable_version ENV RUSTUP_HOME=/opt/rustup \ CARGO_HOME=/opt/cargo \ PATH=/opt/cargo/bin/:${PATH} \ @@ -60,6 +62,7 @@ RUN set -eux; \ rustup component add rustfmt; \ rustup component add clippy; \ rustup toolchain install ${rust_nightly_version} --component clippy; \ + rustup toolchain install ${prev_rust_stable_version} --component clippy; \ rustup target add x86_64-unknown-linux-musl; \ rustup target add wasm32-unknown-unknown; \ rustup target add wasm32-wasi; \ From abd01157faca31a9e327e59c822c5c62d968ce9f Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 12 Jul 2023 14:30:41 -0400 Subject: [PATCH 009/331] Update the S3 benchmark for correctness and performance (#2838) ## Motivation and Context Gain a better understanding of S3 performance with the Rust SDK ## Description Updates the S3 benchmark to: 1. Add verify step (untimed) 2. Improve performance by reading and writing from the disk concurrently 3. Add support for using multiple clients simultaeneously 4. Fix correctness issues & simplify 5. Add timeouts on the parts ## Testing Ran the benchmark locally and on a c5n.18xlarge ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/s3-benchmark/benchmark/Cargo.lock | 31 +++- aws/sdk/s3-benchmark/benchmark/Cargo.toml | 4 + .../s3-benchmark/benchmark/src/get_test.rs | 49 +++++ .../s3-benchmark/benchmark/src/latencies.rs | 2 +- aws/sdk/s3-benchmark/benchmark/src/main.rs | 155 ++++++++++++---- .../benchmark/src/multipart_get.rs | 172 ++++++++++++++---- .../benchmark/src/multipart_put.rs | 99 ++++++++-- .../s3-benchmark/benchmark/src/put_test.rs | 63 +++++++ aws/sdk/s3-benchmark/benchmark/src/verify.rs | 28 +++ 9 files changed, 501 insertions(+), 102 deletions(-) create mode 100644 aws/sdk/s3-benchmark/benchmark/src/get_test.rs create mode 100644 aws/sdk/s3-benchmark/benchmark/src/put_test.rs create mode 100644 aws/sdk/s3-benchmark/benchmark/src/verify.rs diff --git a/aws/sdk/s3-benchmark/benchmark/Cargo.lock b/aws/sdk/s3-benchmark/benchmark/Cargo.lock index d53f4b830a4..a435022a58c 100644 --- a/aws/sdk/s3-benchmark/benchmark/Cargo.lock +++ b/aws/sdk/s3-benchmark/benchmark/Cargo.lock @@ -17,6 +17,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +[[package]] +name = "async-trait" +version = "0.1.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fa67157abdfd688a259b6648808757db9347af834624f27ec646da976aee5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -404,11 +415,15 @@ dependencies = [ name = "benchmark" version = "0.1.0" dependencies = [ + "async-trait", "aws-config", "aws-sdk-s3", + "aws-smithy-client", "aws-smithy-http", "clap", + "hyper", "tokio", + "tracing", "tracing-subscriber", ] @@ -735,9 +750,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1005,18 +1020,18 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -1264,9 +1279,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.18" +version = "2.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" dependencies = [ "proc-macro2", "quote", diff --git a/aws/sdk/s3-benchmark/benchmark/Cargo.toml b/aws/sdk/s3-benchmark/benchmark/Cargo.toml index 2fe087c0c20..5ac77a1f814 100644 --- a/aws/sdk/s3-benchmark/benchmark/Cargo.toml +++ b/aws/sdk/s3-benchmark/benchmark/Cargo.toml @@ -12,6 +12,10 @@ publish = false aws-config = "0.55.3" aws-sdk-s3 = "0.28.0" aws-smithy-http = "0.55.3" +aws-smithy-client= { version = "0.55.3", features = ["client-hyper"] } clap = { version = "4.3.2", default-features = false, features = ["derive", "std", "help"] } tokio = { version = "1.28.2", features = ["full"] } tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } +tracing = "0.1" +async-trait = "0.1.68" +hyper = { version = "0.14.27", features = ["client"] } diff --git a/aws/sdk/s3-benchmark/benchmark/src/get_test.rs b/aws/sdk/s3-benchmark/benchmark/src/get_test.rs new file mode 100644 index 00000000000..a9588255a6c --- /dev/null +++ b/aws/sdk/s3-benchmark/benchmark/src/get_test.rs @@ -0,0 +1,49 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::{verify, Args, BoxError}; +use async_trait::async_trait; +use aws_config::SdkConfig; +use aws_sdk_s3::Client; +use std::path::{Path, PathBuf}; + +pub(crate) struct GetTestResult { + pub(crate) expected: PathBuf, + pub(crate) actual: PathBuf, +} + +#[async_trait] +pub(crate) trait GetBenchmark { + type Setup: Send; + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup; + async fn do_get( + &self, + state: Self::Setup, + target_path: &Path, + args: &Args, + ) -> Result; + async fn do_bench( + &self, + state: Self::Setup, + args: &Args, + expected_path: &Path, + ) -> Result { + let target_path = expected_path.with_extension("downloaded"); + let downloaded_path = self.do_get(state, &target_path, args).await?; + Ok(GetTestResult { + expected: expected_path.to_path_buf(), + actual: downloaded_path, + }) + } + + async fn verify( + &self, + _client: &Client, + _args: &Args, + result: GetTestResult, + ) -> Result<(), BoxError> { + verify::diff(&result.actual, &result.expected).await + } +} diff --git a/aws/sdk/s3-benchmark/benchmark/src/latencies.rs b/aws/sdk/s3-benchmark/benchmark/src/latencies.rs index 8ff3879b41e..50b54a273d8 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/latencies.rs +++ b/aws/sdk/s3-benchmark/benchmark/src/latencies.rs @@ -6,7 +6,7 @@ use std::fmt; use std::time; -const ONE_GIGABYTE: u64 = 1024 * 1024 * 1024; +const ONE_GIGABYTE: u64 = 1000 * 1000 * 1000; #[derive(Debug)] pub struct Latencies { diff --git a/aws/sdk/s3-benchmark/benchmark/src/main.rs b/aws/sdk/s3-benchmark/benchmark/src/main.rs index 91a6214a7ba..ad9e6aefb1e 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/main.rs +++ b/aws/sdk/s3-benchmark/benchmark/src/main.rs @@ -4,9 +4,11 @@ */ use crate::latencies::Latencies; -use crate::multipart_get::get_object_multipart; -use crate::multipart_put::put_object_multipart; +use crate::multipart_put::{put_object_multipart, PutObjectMultipart}; +use async_trait::async_trait; +use aws_config::SdkConfig; use aws_sdk_s3 as s3; +use aws_sdk_s3::Client; use clap::Parser as _; use s3::error::DisplayErrorContext; use s3::primitives::ByteStream; @@ -14,16 +16,24 @@ use std::error::Error as StdError; use std::path::Path; use std::path::PathBuf; use std::process; +use std::process::{Command, Stdio}; use std::time; +mod get_test; mod latencies; mod multipart_get; mod multipart_put; +mod put_test; +mod verify; pub type BoxError = Box; pub const BENCH_KEY: &str = "s3_bench_file"; +use crate::get_test::GetBenchmark; +use crate::put_test::PutBenchmark; +use tracing::Instrument; + #[derive(Copy, Clone, Debug, clap::ValueEnum)] pub enum Fs { #[cfg(target_os = "linux")] @@ -41,7 +51,7 @@ pub enum Bench { GetObjectMultipart, } -#[derive(Debug, clap::Parser)] +#[derive(Debug, Clone, clap::Parser)] #[command()] pub struct Args { /// Which benchmark to run. @@ -79,6 +89,9 @@ pub struct Args { /// Number of concurrent uploads/downloads to perform. #[arg(long, default_value_t = 4)] concurrency: usize, + + #[arg(long, default_value_t = 1000)] + part_upload_timeout_millis: u64, } #[tokio::main] @@ -94,13 +107,12 @@ async fn main() { } loader.load().await }; - let client = s3::Client::new(&config); let result = match args.bench { - Bench::PutObject => benchmark_put_object(&client, &args).await, - Bench::GetObject => benchmark_get_object(&client, &args).await, - Bench::PutObjectMultipart => benchmark_put_object_multipart(&client, &args).await, - Bench::GetObjectMultipart => benchmark_get_object_multipart(&client, &args).await, + Bench::PutObject => benchmark_put_object(&config, &args).await, + Bench::GetObject => benchmark_get_object(&config, &args).await, + Bench::PutObjectMultipart => benchmark_put_object_multipart(&config, &args).await, + Bench::GetObjectMultipart => benchmark_get_object_multipart(&config, &args).await, }; match result { Ok(latencies) => { @@ -117,15 +129,31 @@ async fn main() { } macro_rules! benchmark { - ($client:ident, $args:ident, setup => $setup:expr, operation => $operation:expr) => {{ + ($sdk_config:ident, $args:ident, setup => $setup:expr, operation => $operation:expr) => {{ + #[allow(unused)] + use crate::get_test::GetBenchmark; + #[allow(unused)] + use crate::put_test::PutBenchmark; + println!("setting up..."); let test_file_path = generate_test_file($args)?; - $setup($client, $args, &test_file_path).await?; + let setup_client = aws_sdk_s3::Client::new(&$sdk_config); + $setup(&setup_client, $args, &test_file_path).await?; + println!("setup complete"); let mut latencies = Latencies::new($args.size_bytes); for i in 0..$args.iterations { + let span = tracing::info_span!("run operation"); + let bench = $operation; + let client = bench.prepare($sdk_config).await; let start = time::Instant::now(); - $operation($client, $args, &test_file_path).await?; + let result = bench + .do_bench(client, $args, &test_file_path) + .instrument(span) + .await?; let latency = start.elapsed(); + if let Err(e) = bench.verify(&setup_client, $args, result).await { + println!("benchmark did not finish correctly: {}", e); + } latencies.push(latency); println!( "finished iteration {i} in {} seconds", @@ -137,38 +165,79 @@ macro_rules! benchmark { }}; } -async fn benchmark_put_object(client: &s3::Client, args: &Args) -> Result { - benchmark!(client, args, setup => no_setup, operation => put_object) +async fn benchmark_put_object(conf: &SdkConfig, args: &Args) -> Result { + struct PutObject; + #[async_trait] + impl PutBenchmark for PutObject { + type Setup = Client; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + Client::new(conf) + } + + async fn do_put( + &self, + state: Self::Setup, + target_key: &str, + local_file: &Path, + args: &Args, + ) -> Result<(), BoxError> { + state + .put_object() + .bucket(&args.bucket) + .key(target_key) + .body(ByteStream::from_path(local_file).await?) + .send() + .await?; + Ok(()) + } + } + benchmark!(conf, args, setup => no_setup, operation => PutObject) } -async fn benchmark_get_object(client: &s3::Client, args: &Args) -> Result { - async fn operation(client: &s3::Client, args: &Args, path: &Path) -> Result<(), BoxError> { - let output = client - .get_object() - .bucket(&args.bucket) - .key(BENCH_KEY) - .send() - .await?; - let mut body = output.body.into_async_read(); - let mut file = tokio::fs::File::create(path).await?; - tokio::io::copy(&mut body, &mut file).await?; - Ok(()) +async fn benchmark_get_object(client: &SdkConfig, args: &Args) -> Result { + struct GetObject; + #[async_trait] + impl GetBenchmark for GetObject { + type Setup = Client; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + Client::new(&conf) + } + + async fn do_get( + &self, + state: Self::Setup, + target_path: &Path, + args: &Args, + ) -> Result { + let output = state + .get_object() + .bucket(&args.bucket) + .key(BENCH_KEY) + .send() + .await?; + let mut body = output.body.into_async_read(); + let mut file = tokio::fs::File::create(target_path).await?; + tokio::io::copy(&mut body, &mut file).await?; + Ok(target_path.to_path_buf()) + } } - benchmark!(client, args, setup => put_object_intelligent, operation => operation) + benchmark!(client, args, setup => put_object_intelligent, operation => GetObject) } async fn benchmark_put_object_multipart( - client: &s3::Client, + conf: &SdkConfig, args: &Args, ) -> Result { - benchmark!(client, args, setup => no_setup, operation => put_object_multipart) + benchmark!(conf, args, setup => no_setup, operation => PutObjectMultipart) } async fn benchmark_get_object_multipart( - client: &s3::Client, + config: &SdkConfig, args: &Args, ) -> Result { - benchmark!(client, args, setup => put_object_intelligent, operation => get_object_multipart) + benchmark!(config, args, setup => put_object_intelligent, operation => multipart_get::GetObjectMultipart::new()) } fn generate_test_file(args: &Args) -> Result { @@ -183,11 +252,27 @@ fn generate_test_file(args: &Args) -> Result { } }; - process::Command::new("truncate") - .arg("-s") + let mut yes_process = Command::new("yes") + .arg("01234567890abcdefghijklmnopqrstuvwxyz") + .stdout(Stdio::piped()) + .spawn()?; + + let mut head_process = Command::new("head") + .arg("-c") .arg(format!("{}", args.size_bytes)) - .arg(&path) - .output()?; + .stdin(yes_process.stdout.take().unwrap()) + .stdout(Stdio::piped()) + .spawn()?; + + let mut file = std::fs::File::create(&path)?; + head_process.stdout.as_mut().unwrap(); + std::io::copy(&mut head_process.stdout.take().unwrap(), &mut file)?; + + let exit_status = head_process.wait()?; + + if !exit_status.success() { + Err("failed to generate temp file")? + } Ok(path) } @@ -202,7 +287,7 @@ async fn put_object_intelligent( path: &Path, ) -> Result<(), BoxError> { if args.size_bytes > args.part_size_bytes { - put_object_multipart(client, args, path).await + put_object_multipart(&[client.clone()], args, BENCH_KEY, path).await } else { put_object(client, args, path).await } diff --git a/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs b/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs index 08e0f3a9c25..ab8832816cd 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs +++ b/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs @@ -4,80 +4,174 @@ */ use crate::{Args, BoxError, BENCH_KEY}; +use async_trait::async_trait; +use aws_config::SdkConfig; use aws_sdk_s3 as s3; +use aws_sdk_s3::Client; +use aws_smithy_http::byte_stream::AggregatedBytes; use std::fmt; -use std::path::Path; +use std::fs::File; +use std::os::unix::fs::FileExt; +use std::path::{Path, PathBuf}; use std::sync::Arc; -use tokio::sync::watch::channel; +use std::time::{Duration, SystemTime}; + +use crate::get_test::GetBenchmark; use tokio::sync::Semaphore; +use tokio::task::spawn_blocking; +use tokio::time::timeout; +use tracing::{info_span, Instrument}; + +pub(crate) struct GetObjectMultipart {} +impl GetObjectMultipart { + pub(crate) fn new() -> Self { + Self {} + } +} + +#[async_trait] +impl GetBenchmark for GetObjectMultipart { + type Setup = Vec; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + let clients = (0..32).map(|_| Client::new(&conf)).collect::>(); + for client in &clients { + let _ = client.list_buckets().send().await; + } + clients + } + + async fn do_get( + &self, + state: Self::Setup, + target_path: &Path, + args: &Args, + ) -> Result { + get_object_multipart(&state, args, target_path, &args.bucket, BENCH_KEY).await?; + Ok(target_path.to_path_buf()) + } +} pub async fn get_object_multipart( - client: &s3::Client, + clients: &[s3::Client], args: &Args, - path: &Path, + target_path: &Path, + bucket: &str, + key: &str, ) -> Result<(), BoxError> { - let mut part_count = (args.size_bytes / args.part_size_bytes + 1) as i64; - let mut size_of_last_part = (args.size_bytes % args.part_size_bytes) as i64; + let mut part_count = (args.size_bytes / args.part_size_bytes + 1) as u64; + let mut size_of_last_part = (args.size_bytes % args.part_size_bytes) as u64; if size_of_last_part == 0 { - size_of_last_part = args.part_size_bytes as i64; + size_of_last_part = args.part_size_bytes as u64; part_count -= 1; } - let mut ranges = (0..part_count).map(|i| { + let ranges = (0..part_count).map(|i| { if i == part_count - 1 { - let start = i * args.part_size_bytes as i64; + let start = i * args.part_size_bytes as u64; ContentRange::new(start, start + size_of_last_part - 1) } else { ContentRange::new( - i * args.part_size_bytes as i64, - (i + 1) * args.part_size_bytes as i64 - 1, + i * args.part_size_bytes as u64, + (i + 1) * args.part_size_bytes as u64 - 1, ) } }); - let (tx, rx) = channel(ranges.next().unwrap()); - for range in ranges { - tx.send(range)?; - } let semaphore = Arc::new(Semaphore::new(args.concurrency)); let mut tasks = Vec::new(); - for _ in 0..part_count { + let file = Arc::new(File::create(target_path)?); + for (id, range) in ranges.enumerate() { let semaphore = semaphore.clone(); - let client = client.clone(); - let bucket = args.bucket.clone(); - let mut rx = rx.clone(); - tasks.push(tokio::spawn(async move { - let _permit = semaphore.acquire().await?; - let range = rx.borrow_and_update().to_string(); - - let part = client - .get_object() - .bucket(bucket) - .key(BENCH_KEY) - .range(range) - .send() - .await?; - - Result::<_, BoxError>::Ok(part.body) - })); + let client = clients[id % clients.len()].clone(); + let file = file.clone(); + let bucket = bucket.to_string(); + let key = key.to_string(); + tasks.push(tokio::spawn( + async move { + let _permit = semaphore.acquire_owned().await?; + + let start = SystemTime::now(); + tracing::debug!(range = ?range); + + let body = + download_part_retry_on_timeout(id, &range, &client, &bucket, &key).await?; + tracing::debug!(id =? id, load_duration = ?start.elapsed().unwrap()); + let mut offset = range.start; + let write_duration = SystemTime::now(); + spawn_blocking(move || { + for part in body.into_segments() { + file.write_all_at(&part, offset)?; + offset += part.len() as u64; + } + Ok::<_, BoxError>(()) + }) + .await??; + tracing::debug!(id =? id, write_duration = ?write_duration.elapsed().unwrap()); + Result::<_, BoxError>::Ok(()) + } + .instrument(info_span!("run-collect-part", id = id)), + )); } for task in tasks { - let mut body = task.await??.into_async_read(); - let mut file = tokio::fs::File::create(path).await?; - tokio::io::copy(&mut body, &mut file).await?; + task.await??; } Ok(()) } +async fn download_part_retry_on_timeout( + id: usize, + range: &ContentRange, + client: &Client, + bucket: &str, + key: &str, +) -> Result { + loop { + match timeout( + Duration::from_millis(1000), + download_part(id, range, client, bucket, key), + ) + .await + { + Ok(result) => return result, + Err(_) => tracing::warn!("get part timeout"), + } + } +} + +async fn download_part( + id: usize, + range: &ContentRange, + client: &Client, + bucket: &str, + key: &str, +) -> Result { + let part = client + .get_object() + .bucket(bucket) + .key(key) + .range(range.to_string()) + .send() + .instrument(info_span!("get_object", id = id)) + .await?; + + let body = part + .body + .collect() + .instrument(info_span!("collect-body", id = id)) + .await?; + Ok(body) +} + #[derive(Debug)] struct ContentRange { - start: i64, - end: i64, + start: u64, + end: u64, } impl ContentRange { - fn new(start: i64, end: i64) -> Self { + fn new(start: u64, end: u64) -> Self { Self { start, end } } } diff --git a/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs b/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs index 4c8213b0c67..942c3d80208 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs +++ b/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs @@ -3,26 +3,60 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::put_test::PutBenchmark; use crate::{Args, BoxError, BENCH_KEY}; +use async_trait::async_trait; +use aws_config::SdkConfig; use aws_sdk_s3 as s3; +use aws_sdk_s3::Client; use aws_smithy_http::byte_stream::ByteStream; -use aws_smithy_http::byte_stream::Length; use s3::types::CompletedMultipartUpload; use s3::types::CompletedPart; +use std::io::SeekFrom; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; -use tokio::sync::Semaphore; +use std::time::{Duration, SystemTime}; +use tokio::fs::File; +use tokio::io::{AsyncReadExt, AsyncSeekExt}; +use tokio::sync::{OwnedSemaphorePermit, Semaphore}; +use tokio::time::timeout; + +pub(crate) struct PutObjectMultipart; + +#[async_trait] +impl PutBenchmark for PutObjectMultipart { + type Setup = Vec; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + let clients = (0..32).map(|_| Client::new(&conf)).collect::>(); + for client in &clients { + let _ = client.list_buckets().send().await; + } + clients + } + + async fn do_put( + &self, + state: Self::Setup, + target_key: &str, + local_file: &Path, + args: &Args, + ) -> Result<(), BoxError> { + put_object_multipart(&state, args, target_key, local_file).await + } +} pub async fn put_object_multipart( - client: &s3::Client, + client: &[s3::Client], args: &Args, + target_key: &str, path: &Path, ) -> Result<(), BoxError> { - let upload_id = client + let upload_id = client[0] .create_multipart_upload() .bucket(&args.bucket) - .key(BENCH_KEY) + .key(target_key) .send() .await? .upload_id @@ -44,15 +78,17 @@ pub async fn put_object_multipart( } else { args.part_size_bytes }; - tasks.push(tokio::spawn(upload_part( - semaphore.clone(), - client.clone(), + let permit = semaphore.clone().acquire_owned().await?; + tasks.push(tokio::spawn(upload_part_retry_on_timeout( + permit, + client[part as usize % client.len()].clone(), args.bucket.clone(), upload_id.clone(), path.to_path_buf(), offset, length, part, + Duration::from_millis(args.part_upload_timeout_millis), ))); } let mut parts = Vec::new(); @@ -60,7 +96,7 @@ pub async fn put_object_multipart( parts.push(task.await??); } - client + client[0] .complete_multipart_upload() .bucket(&args.bucket) .key(BENCH_KEY) @@ -76,9 +112,8 @@ pub async fn put_object_multipart( Ok(()) } -#[allow(clippy::too_many_arguments)] -async fn upload_part( - semaphore: Arc, +async fn upload_part_retry_on_timeout( + permit: OwnedSemaphorePermit, client: s3::Client, bucket: String, upload_id: String, @@ -86,15 +121,40 @@ async fn upload_part( offset: u64, length: u64, part: u64, + timeout_dur: Duration, ) -> Result { - let _permit = semaphore.acquire().await?; + loop { + match timeout( + timeout_dur, + upload_part(&client, &bucket, &upload_id, &path, offset, length, part), + ) + .await + { + Ok(res) => { + drop(permit); + return res; + } + Err(_) => tracing::warn!(id = ?part, "timeout!"), + } + } +} - let stream = ByteStream::read_from() - .path(path) - .offset(offset) - .length(Length::Exact(length)) - .build() - .await?; +#[allow(clippy::too_many_arguments)] +async fn upload_part( + client: &s3::Client, + bucket: &str, + upload_id: &str, + path: &Path, + offset: u64, + length: u64, + part: u64, +) -> Result { + let start = SystemTime::now(); + let mut file = File::open(path).await?; + file.seek(SeekFrom::Start(offset)).await?; + let mut buf = vec![0; length as usize]; + file.read_exact(&mut buf).await?; + let stream = ByteStream::from(buf); let part_output = client .upload_part() .key(BENCH_KEY) @@ -104,6 +164,7 @@ async fn upload_part( .part_number(part as i32 + 1) // S3 takes a 1-based index .send() .await?; + tracing::debug!(part = ?part, upload_duration = ?start.elapsed().unwrap(), "upload-part"); Ok(CompletedPart::builder() .part_number(part as i32 + 1) .e_tag(part_output.e_tag.expect("must have an e-tag")) diff --git a/aws/sdk/s3-benchmark/benchmark/src/put_test.rs b/aws/sdk/s3-benchmark/benchmark/src/put_test.rs new file mode 100644 index 00000000000..606778a2160 --- /dev/null +++ b/aws/sdk/s3-benchmark/benchmark/src/put_test.rs @@ -0,0 +1,63 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::multipart_get::get_object_multipart; +use crate::{verify, Args, BoxError, BENCH_KEY}; +use async_trait::async_trait; +use aws_config::SdkConfig; +use aws_sdk_s3::Client; +use std::env::temp_dir; +use std::path::{Path, PathBuf}; + +pub(crate) struct PutTestResult { + local_file: PathBuf, + bucket: String, + key: String, +} + +#[async_trait] +pub(crate) trait PutBenchmark { + type Setup: Send; + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup; + async fn do_put( + &self, + state: Self::Setup, + target_key: &str, + local_file: &Path, + args: &Args, + ) -> Result<(), BoxError>; + async fn do_bench( + &self, + state: Self::Setup, + args: &Args, + file: &Path, + ) -> Result { + self.do_put(state, BENCH_KEY, file, args).await?; + Ok(PutTestResult { + local_file: file.to_path_buf(), + bucket: args.bucket.clone(), + key: BENCH_KEY.to_string(), + }) + } + + async fn verify( + &self, + client: &Client, + args: &Args, + result: PutTestResult, + ) -> Result<(), BoxError> { + let dir = temp_dir(); + let downloaded_path = dir.join("downloaded_file"); + get_object_multipart( + &[client.clone()][..], + args, + &downloaded_path, + &result.bucket, + &result.key, + ) + .await?; + verify::diff(&result.local_file, &downloaded_path).await + } +} diff --git a/aws/sdk/s3-benchmark/benchmark/src/verify.rs b/aws/sdk/s3-benchmark/benchmark/src/verify.rs new file mode 100644 index 00000000000..6b6c50904f3 --- /dev/null +++ b/aws/sdk/s3-benchmark/benchmark/src/verify.rs @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::BoxError; +use std::path::Path; +use std::time::SystemTime; +use tokio::process::Command; + +pub(crate) async fn diff(a: &Path, b: &Path) -> Result<(), BoxError> { + let start_diff = SystemTime::now(); + let diff_ok = Command::new("diff") + .arg(a) + .arg(b) + .arg("-q") + .spawn() + .unwrap() + .wait() + .await + .unwrap(); + tracing::info!(diff_duration = ?start_diff.elapsed().unwrap()); + if !diff_ok.success() { + Err("files differ")? + } else { + Ok(()) + } +} From 3ee63a84860f0dfadbbccfffe24c1fec83cab9ca Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 12 Jul 2023 15:23:56 -0400 Subject: [PATCH 010/331] Fix the middleware benchmark and rerun (#2840) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context Rerun the middleware benchmark. Results: ``` Finished bench [optimized + debuginfo] target(s) in 3.77s Running benches/middleware_vs_orchestrator.rs (/Users/rcoh/code/smithy-rs/target/release/deps/middleware_vs_orchestrator-eec2a5ed375836b0) compare/middleware (HEAD)/S3 ListObjectsV2 time: [27.887 µs 27.956 µs 28.030 µs] change: [+22.004% +22.457% +22.923%] (p = 0.00 < 0.05) Performance has regressed. Found 6 outliers among 100 measurements (6.00%) 5 (5.00%) high mild 1 (1.00%) high severe compare/middleware (last_release)/S3 ListObjectsV2 time: [22.076 µs 22.122 µs 22.176 µs] change: [-3.1947% -2.7875% -2.4454%] (p = 0.00 < 0.05) Performance has improved. Found 7 outliers among 100 measurements (7.00%) 5 (5.00%) high mild 2 (2.00%) high severe compare/orchestrator/S3 ListObjectsV2 time: [27.711 µs 27.764 µs 27.821 µs] change: [-11.548% -11.313% -11.097%] (p = 0.00 < 0.05) Performance has improved. Found 9 outliers among 100 measurements (9.00%) 6 (6.00%) high mild 3 (3.00%) high severe ``` ## Description - The fixup plugin is not required anymore. - Added a readme with instructions ## Testing - ran the benchmark ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-sdk-s3/benches/README.md | 6 +++++ .../benches/middleware_vs_orchestrator.rs | 26 +------------------ 2 files changed, 7 insertions(+), 25 deletions(-) create mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md b/aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md new file mode 100644 index 00000000000..cf8f97680ce --- /dev/null +++ b/aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md @@ -0,0 +1,6 @@ +### Middleware vs. Orchestrator Benchmark + +To run the benchmark: +```bash +./gradlew :aws:sra-test:assemble && (cd aws/sra-test/integration-tests/aws-sdk-s3 && cargo bench) +``` diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs b/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs index 23af022b79c..fd4e5440a68 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs +++ b/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs @@ -88,35 +88,11 @@ macro_rules! middleware_bench_fn { } async fn orchestrator(client: &s3::Client) { - #[derive(Debug)] - struct FixupPlugin { - region: String, - } - impl RuntimePlugin for FixupPlugin { - fn configure( - &self, - cfg: &mut ConfigBag, - _interceptors: &mut InterceptorRegistrar, - ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - let params_builder = s3::endpoint::Params::builder() - .set_region(Some(self.region.clone())) - .bucket("test-bucket"); - - cfg.put(params_builder); - Ok(()) - } - } let _output = client .list_objects_v2() .bucket("test-bucket") .prefix("prefix~") - .send_orchestrator_with_plugin(Some(FixupPlugin { - region: client - .conf() - .region() - .map(|c| c.as_ref().to_string()) - .unwrap(), - })) + .send_orchestrator() .await .expect("successful execution"); } From c1a1daeee00be0a246c68e0c32eac1a5498edfaa Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 12 Jul 2023 16:59:54 -0700 Subject: [PATCH 011/331] Split runtime components out of config in the orchestrator impl (#2832) This PR moves all the "runtime components", pieces that are core to the operation of the orchestrator, into a separate `RuntimeComponents` type for the orchestrator to reference directly. The reason for this is so that these core components cannot be changed by interceptors while the orchestrator is executing a request. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-inlineable/Cargo.toml | 1 + .../src/apigateway_interceptors.rs | 2 + .../src/glacier_interceptors.rs | 13 +- .../src/http_request_checksum.rs | 3 + .../src/http_response_checksum.rs | 3 + .../src/presigning_interceptors.rs | 34 +- .../src/route53_resource_id_preprocessor.rs | 2 + .../aws-runtime/src/auth/sigv4.rs | 13 +- .../aws-runtime/src/invocation_id.rs | 9 +- .../aws-runtime/src/recursion_detection.rs | 6 +- .../aws-runtime/src/request_info.rs | 6 +- .../aws-runtime/src/user_agent.rs | 15 +- aws/sdk-codegen/build.gradle.kts | 3 +- .../AwsCustomizableOperationDecorator.kt | 18 +- .../amazon/smithy/rustsdk/CredentialCaches.kt | 6 +- .../smithy/rustsdk/CredentialProviders.kt | 6 +- .../HttpConnectorConfigCustomization.kt | 4 +- .../smithy/rustsdk/InvocationIdDecorator.kt | 2 +- .../rustsdk/RecursionDetectionDecorator.kt | 2 +- .../amazon/smithy/rustsdk/RegionDecorator.kt | 4 +- .../RetryInformationHeaderDecorator.kt | 2 +- .../smithy/rustsdk/SigV4AuthDecorator.kt | 4 +- .../smithy/rustsdk/UserAgentDecorator.kt | 6 +- .../apigateway/ApiGatewayDecorator.kt | 2 +- .../customize/glacier/GlacierDecorator.kt | 2 +- .../timestream/TimestreamDecorator.kt | 5 +- .../test/kotlin/SdkCodegenIntegrationTest.kt | 62 ++ .../rustsdk/CredentialCacheConfigTest.kt | 30 +- codegen-client-test/build.gradle.kts | 2 + codegen-client/build.gradle.kts | 3 +- .../client/smithy/ClientCodegenVisitor.kt | 4 +- .../customizations/ApiKeyAuthDecorator.kt | 2 +- .../ConnectionPoisoningConfigCustomization.kt | 2 +- .../customizations/HttpAuthDecorator.kt | 19 +- .../HttpChecksumRequiredGenerator.kt | 2 +- .../HttpConnectorConfigDecorator.kt | 109 ++- .../IdentityConfigCustomization.kt | 32 - .../InterceptorConfigCustomization.kt | 33 +- .../ResiliencyConfigCustomization.kt | 55 +- .../customizations/TimeSourceCustomization.kt | 14 +- .../customize/RequiredCustomizations.kt | 4 +- .../endpoint/EndpointConfigCustomization.kt | 181 ++-- .../ConfigOverrideRuntimePluginGenerator.kt | 49 +- .../generators/OperationCustomization.kt | 7 +- .../smithy/generators/OperationGenerator.kt | 32 +- .../OperationRuntimePluginGenerator.kt | 37 +- .../smithy/generators/ServiceGenerator.kt | 1 - .../ServiceRuntimePluginGenerator.kt | 60 +- .../client/CustomizableOperationGenerator.kt | 14 +- .../client/FluentClientGenerator.kt | 21 +- .../IdempotencyTokenProviderCustomization.kt | 10 +- .../config/ServiceConfigGenerator.kt | 142 ++-- .../testutil/TestConfigCustomization.kt | 7 +- .../MetadataCustomizationTest.kt | 3 + .../ClientContextConfigCustomizationTest.kt | 12 +- .../smithy/endpoint/EndpointsDecoratorTest.kt | 4 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 63 +- .../config/ServiceConfigGeneratorTest.kt | 4 +- .../protocol/ProtocolTestGeneratorTest.kt | 14 +- .../rust/codegen/core/smithy/RuntimeType.kt | 9 +- .../smithy/rust/codegen/core/testutil/Rust.kt | 4 +- .../smithy/rust/codegen/core/util/Exec.kt | 10 +- .../RecursiveShapesIntegrationTest.kt | 4 +- .../rust/codegen/core/util/ExecKtTest.kt | 2 +- .../server/smithy/ServerCodegenVisitor.kt | 4 +- .../ConstrainedStringGeneratorTest.kt | 4 +- rust-runtime/aws-smithy-async/Cargo.toml | 1 - rust-runtime/aws-smithy-async/src/rt/sleep.rs | 5 - rust-runtime/aws-smithy-async/src/time.rs | 5 - .../aws-smithy-client/external-types.toml | 2 +- .../aws-smithy-runtime-api/src/client.rs | 2 + .../aws-smithy-runtime-api/src/client/auth.rs | 77 +- .../src/client/config_bag_accessors.rs | 292 +------ .../src/client/connectors.rs | 16 +- .../src/client/identity.rs | 32 +- .../src/client/interceptors.rs | 301 +++---- .../src/client/orchestrator.rs | 14 +- .../src/client/retries.rs | 49 +- .../src/client/runtime_components.rs | 786 ++++++++++++++++++ .../src/client/runtime_plugin.rs | 72 +- rust-runtime/aws-smithy-runtime/src/client.rs | 3 + .../src/client/auth/http.rs | 26 +- .../src/client/auth/no_auth.rs | 35 +- .../src/client/config_override.rs | 254 ++++++ .../client/connectors/connection_poisoning.rs | 8 +- .../src/client/interceptors.rs | 3 + .../src/client/orchestrator.rs | 363 +++++--- .../src/client/orchestrator/auth.rs | 106 ++- .../src/client/orchestrator/endpoints.rs | 8 +- .../interceptors/service_clock_skew.rs | 2 + .../src/client/retries/client_rate_limiter.rs | 32 +- .../client/retries/strategy/fixed_delay.rs | 14 +- .../src/client/retries/strategy/never.rs | 8 +- .../src/client/retries/strategy/standard.rs | 164 ++-- .../src/client/test_util/interceptors.rs | 33 +- .../aws-smithy-runtime/src/client/timeout.rs | 72 +- .../aws-smithy-types/src/config_bag.rs | 6 +- .../src/client_http_checksum_required.rs | 24 +- .../src/client_idempotency_token.rs | 18 +- .../check-aws-sdk-orchestrator-impl | 1 + 100 files changed, 2504 insertions(+), 1574 deletions(-) create mode 100644 aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/config_override.rs diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index e061a335e66..4a6630ea6fa 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -43,6 +43,7 @@ tracing = "0.1" aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client", features = ["test-util"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http", features = ["rt-tokio"] } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["test-util"] } tempfile = "3.6.0" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } diff --git a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs index 06398a325be..261932f3fb7 100644 --- a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs @@ -8,6 +8,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use http::header::ACCEPT; use http::HeaderValue; @@ -20,6 +21,7 @@ impl Interceptor for AcceptHeaderInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { context diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 18bf422f49d..b9a61650170 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -17,6 +17,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ }; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::orchestrator::LoadedRequestBody; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use bytes::Bytes; use http::header::{HeaderName, HeaderValue}; @@ -71,6 +72,7 @@ impl Interceptor fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let erased_input = context.input_mut(); @@ -99,6 +101,7 @@ impl Interceptor for GlacierApiVersionInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { context.request_mut().headers_mut().insert( @@ -117,6 +120,7 @@ impl Interceptor for GlacierTreeHashHeaderInterceptor { fn modify_before_serialization( &self, _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { // Request the request body to be loaded into memory immediately after serialization @@ -129,6 +133,7 @@ impl Interceptor for GlacierTreeHashHeaderInterceptor { fn modify_before_retry_loop( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let maybe_loaded_body = cfg.load::(); @@ -237,6 +242,7 @@ fn compute_hash_tree(mut hashes: Vec) -> Digest { mod account_id_autofill_tests { use super::*; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::type_erasure::TypedBox; #[test] @@ -251,13 +257,14 @@ mod account_id_autofill_tests { } } + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); let mut context = InterceptorContext::new(TypedBox::new(SomeInput { account_id: None }).erase()); let mut context = BeforeSerializationInterceptorContextMut::from(&mut context); let interceptor = GlacierAccountIdAutofillInterceptor::::new(); interceptor - .modify_before_serialization(&mut context, &mut cfg) + .modify_before_serialization(&mut context, &rc, &mut cfg) .expect("success"); assert_eq!( DEFAULT_ACCOUNT_ID, @@ -276,10 +283,12 @@ mod account_id_autofill_tests { mod api_version_tests { use super::*; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::type_erasure::TypedBox; #[test] fn api_version_interceptor() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); let mut context = InterceptorContext::new(TypedBox::new("dontcare").erase()); context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); @@ -287,7 +296,7 @@ mod api_version_tests { let interceptor = GlacierApiVersionInterceptor::new("some-version"); interceptor - .modify_before_signing(&mut context, &mut cfg) + .modify_before_signing(&mut context, &rc, &mut cfg) .expect("success"); assert_eq!( diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index e438032bdc5..b97b2d2bd0a 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -19,6 +19,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Input, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; use http_body::Body; @@ -81,6 +82,7 @@ where fn read_before_serialization( &self, context: &BeforeSerializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let checksum_algorithm = (self.algorithm_provider)(context.input())?; @@ -98,6 +100,7 @@ where fn modify_before_retry_loop( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let state = cfg diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index 4f3f9dfea5a..9a54d001919 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -14,6 +14,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ BeforeDeserializationInterceptorContextMut, BeforeSerializationInterceptorContextRef, Input, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; use std::{fmt, mem}; @@ -58,6 +59,7 @@ where fn read_before_serialization( &self, context: &BeforeSerializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let validation_enabled = (self.validation_enabled)(context.input()); @@ -72,6 +74,7 @@ where fn modify_before_deserialization( &self, context: &mut BeforeDeserializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let state = cfg diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs index ddc969ac23a..7161134ac85 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs @@ -15,16 +15,19 @@ use aws_sigv4::http_request::SignableBody; use aws_smithy_async::time::{SharedTimeSource, StaticTimeSource}; use aws_smithy_runtime::client::retries::strategy::NeverRetryStrategy; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::{ - disable_interceptor, Interceptor, InterceptorRegistrar, SharedInterceptor, + disable_interceptor, Interceptor, SharedInterceptor, +}; +use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, }; -use aws_smithy_runtime_api::client::retries::DynRetryStrategy; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; +use std::borrow::Cow; /// Interceptor that tells the SigV4 signer to add the signature to query params, /// and sets the request expiration time from the presigning config. @@ -47,6 +50,7 @@ impl Interceptor for SigV4PresigningInterceptor { fn modify_before_serialization( &self, _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { cfg.interceptor_state() @@ -55,16 +59,13 @@ impl Interceptor for SigV4PresigningInterceptor { .omit_default_content_length() .omit_default_content_type(), ); - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(StaticTimeSource::new( - self.config.start_time(), - ))); Ok(()) } fn modify_before_signing( &self, _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { if let Some(mut config) = cfg.load::().cloned() { @@ -86,16 +87,20 @@ impl Interceptor for SigV4PresigningInterceptor { /// Runtime plugin that registers the SigV4PresigningInterceptor. #[derive(Debug)] pub(crate) struct SigV4PresigningRuntimePlugin { - interceptor: SharedInterceptor, + runtime_components: RuntimeComponentsBuilder, } impl SigV4PresigningRuntimePlugin { pub(crate) fn new(config: PresigningConfig, payload_override: SignableBody<'static>) -> Self { + let time_source = SharedTimeSource::new(StaticTimeSource::new(config.start_time())); Self { - interceptor: SharedInterceptor::new(SigV4PresigningInterceptor::new( - config, - payload_override, - )), + runtime_components: RuntimeComponentsBuilder::new("SigV4PresigningRuntimePlugin") + .with_interceptor(SharedInterceptor::new(SigV4PresigningInterceptor::new( + config, + payload_override, + ))) + .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))) + .with_time_source(Some(time_source)), } } } @@ -103,14 +108,13 @@ impl SigV4PresigningRuntimePlugin { impl RuntimePlugin for SigV4PresigningRuntimePlugin { fn config(&self) -> Option { let mut layer = Layer::new("Presigning"); - layer.set_retry_strategy(DynRetryStrategy::new(NeverRetryStrategy::new())); layer.store_put(disable_interceptor::("presigning")); layer.store_put(disable_interceptor::("presigning")); layer.store_put(disable_interceptor::("presigning")); Some(layer.freeze()) } - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(self.interceptor.clone()); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) } } diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs index 0ed2a354d22..d8fa3f4c972 100644 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs +++ b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs @@ -8,6 +8,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::fmt; use std::marker::PhantomData; @@ -74,6 +75,7 @@ where fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let input: &mut T = context.input_mut().downcast_mut().expect("correct type"); diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index 366e3ce0db0..3a5a2e85ef8 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -12,11 +12,9 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, }; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolvers, SharedIdentityResolver, -}; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::Document; use aws_types::region::{Region, SigningRegion}; @@ -99,7 +97,7 @@ impl HttpAuthScheme for SigV4HttpAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } @@ -319,11 +317,12 @@ impl HttpRequestSigner for SigV4HttpRequestSigner { request: &mut HttpRequest, identity: &Identity, auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, config_bag: &ConfigBag, ) -> Result<(), BoxError> { let operation_config = Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?; - let request_time = config_bag.request_time().unwrap_or_default().now(); + let request_time = runtime_components.time_source().unwrap_or_default().now(); let credentials = if let Some(creds) = identity.data::() { creds @@ -373,7 +372,7 @@ impl HttpRequestSigner for SigV4HttpRequestSigner { use event_stream::SigV4MessageSigner; if let Some(signer_sender) = config_bag.load::() { - let time_source = config_bag.request_time().unwrap_or_default(); + let time_source = runtime_components.time_source().unwrap_or_default(); signer_sender .send(Box::new(SigV4MessageSigner::new( _signature, diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 6a5c178757f..55cf9fd9e9f 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -11,6 +11,7 @@ use http::{HeaderName, HeaderValue}; use std::fmt::Debug; use uuid::Uuid; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; #[cfg(feature = "test-util")] pub use test_util::{NoInvocationIdGenerator, PredefinedInvocationIdGenerator}; @@ -61,6 +62,7 @@ impl Interceptor for InvocationIdInterceptor { fn modify_before_retry_loop( &self, _ctx: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let id = cfg @@ -77,6 +79,7 @@ impl Interceptor for InvocationIdInterceptor { fn modify_before_transmit( &self, ctx: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let headers = ctx.request_mut().headers_mut(); @@ -184,6 +187,7 @@ mod tests { BeforeTransmitInterceptorContextMut, InterceptorContext, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::type_erasure::TypeErasedBox; use http::HeaderValue; @@ -197,6 +201,7 @@ mod tests { #[test] fn test_id_is_generated_and_set() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); @@ -207,10 +212,10 @@ mod tests { let interceptor = InvocationIdInterceptor::new(); let mut ctx = Into::into(&mut ctx); interceptor - .modify_before_retry_loop(&mut ctx, &mut cfg) + .modify_before_retry_loop(&mut ctx, &rc, &mut cfg) .unwrap(); interceptor - .modify_before_transmit(&mut ctx, &mut cfg) + .modify_before_transmit(&mut ctx, &rc, &mut cfg) .unwrap(); let expected = cfg.load::().expect("invocation ID was set"); diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index c8b28b07b49..3cbda55c4d1 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -6,6 +6,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_types::os_shim_internal::Env; use http::HeaderValue; @@ -42,6 +43,7 @@ impl Interceptor for RecursionDetectionInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let request = context.request_mut(); @@ -75,6 +77,7 @@ mod tests { use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_headers}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::type_erasure::TypeErasedBox; use aws_types::os_shim_internal::Env; use http::HeaderValue; @@ -142,6 +145,7 @@ mod tests { } fn check(test_case: TestCase) { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let env = test_case.env(); let mut request = http::Request::builder(); for (name, value) in test_case.request_headers_before() { @@ -157,7 +161,7 @@ mod tests { let mut ctx = Into::into(&mut context); RecursionDetectionInterceptor { env } - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .expect("interceptor must succeed"); let mutated_request = context.request().expect("request is set"); for name in mutated_request.headers().keys() { diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index d2ea28cc35d..0fb9a929eeb 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -8,6 +8,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::date_time::Format; use aws_smithy_types::retry::RetryConfig; @@ -89,6 +90,7 @@ impl Interceptor for RequestInfoInterceptor { fn modify_before_transmit( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let mut pairs = RequestPairs::new(); @@ -166,6 +168,7 @@ mod tests { use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; @@ -186,6 +189,7 @@ mod tests { #[test] fn test_request_pairs_for_initial_attempt() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); context.enter_serialization_phase(); context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); @@ -204,7 +208,7 @@ mod tests { let interceptor = RequestInfoInterceptor::new(); let mut ctx = (&mut context).into(); interceptor - .modify_before_transmit(&mut ctx, &mut config) + .modify_before_transmit(&mut ctx, &rc, &mut config) .unwrap(); assert_eq!( diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 3527fbe5828..5e91bd8d230 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -7,6 +7,7 @@ use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_types::app_name::AppName; use aws_types::os_shim_internal::Env; @@ -74,6 +75,7 @@ impl Interceptor for UserAgentInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let api_metadata = cfg @@ -110,6 +112,7 @@ mod tests { use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::type_erasure::TypeErasedBox; @@ -136,6 +139,7 @@ mod tests { #[test] fn test_overridden_ua() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let mut layer = Layer::new("test"); @@ -146,7 +150,7 @@ mod tests { let interceptor = UserAgentInterceptor::new(); let mut ctx = Into::into(&mut context); interceptor - .modify_before_signing(&mut ctx, &mut cfg) + .modify_before_signing(&mut ctx, &rc, &mut cfg) .unwrap(); let header = expect_header(&context, "user-agent"); @@ -161,6 +165,7 @@ mod tests { #[test] fn test_default_ua() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let api_metadata = ApiMetadata::new("some-service", "some-version"); @@ -171,7 +176,7 @@ mod tests { let interceptor = UserAgentInterceptor::new(); let mut ctx = Into::into(&mut context); interceptor - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .unwrap(); let expected_ua = AwsUserAgent::new_from_environment(Env::real(), api_metadata); @@ -191,6 +196,7 @@ mod tests { #[test] fn test_app_name() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let api_metadata = ApiMetadata::new("some-service", "some-version"); @@ -202,7 +208,7 @@ mod tests { let interceptor = UserAgentInterceptor::new(); let mut ctx = Into::into(&mut context); interceptor - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .unwrap(); let app_value = "app/my_awesome_app"; @@ -221,6 +227,7 @@ mod tests { #[test] fn test_api_metadata_missing() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let mut config = ConfigBag::base(); @@ -231,7 +238,7 @@ mod tests { "{}", DisplayErrorContext( &*interceptor - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .expect_err("it should error") ) ); diff --git a/aws/sdk-codegen/build.gradle.kts b/aws/sdk-codegen/build.gradle.kts index bb6f2925a74..b7a6471bed3 100644 --- a/aws/sdk-codegen/build.gradle.kts +++ b/aws/sdk-codegen/build.gradle.kts @@ -87,12 +87,11 @@ if (isTestingEnabled.toBoolean()) { tasks.test { useJUnitPlatform() testLogging { - events("passed", "skipped", "failed") + events("failed") exceptionFormat = TestExceptionFormat.FULL showCauses = true showExceptions = true showStackTraces = true - showStandardStreams = true } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt index 29718fa3cd0..08d58134d4a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt @@ -25,6 +25,9 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "http" to CargoDependency.Http.toType(), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), + "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::runtime_plugin::StaticRuntimePlugin"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), "SharedTimeSource" to CargoDependency.smithyAsync(runtimeConfig).withFeature("test-util").toType() .resolve("time::SharedTimeSource"), "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) @@ -41,13 +44,14 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : """ ##[doc(hidden)] // This is a temporary method for testing. NEVER use it in production - pub fn request_time_for_tests(mut self, request_time: ::std::time::SystemTime) -> Self { - use #{ConfigBagAccessors}; - let interceptor = #{TestParamsSetterInterceptor}::new(move |_: &mut #{BeforeTransmitInterceptorContextMut}<'_>, cfg: &mut #{ConfigBag}| { - cfg.interceptor_state().set_request_time(#{SharedTimeSource}::new(request_time)); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self + pub fn request_time_for_tests(self, request_time: ::std::time::SystemTime) -> Self { + self.runtime_plugin( + #{StaticRuntimePlugin}::new() + .with_runtime_components( + #{RuntimeComponentsBuilder}::new("request_time_for_tests") + .with_time_source(Some(#{SharedTimeSource}::new(request_time))) + ) + ) } ##[doc(hidden)] diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index b31c5329ea9..41fad244ef6 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -80,7 +80,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom """ /// Returns the credentials cache. pub fn credentials_cache(&self) -> #{Option}<#{SharedCredentialsCache}> { - self.inner.load::<#{SharedCredentialsCache}>().cloned() + self.config.load::<#{SharedCredentialsCache}>().cloned() } """, *codegenScope, @@ -121,7 +121,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom """ /// Sets the credentials cache for this service pub fn set_credentials_cache(&mut self, credentials_cache: #{Option}<#{CredentialsCache}>) -> &mut Self { - self.inner.store_or_unset(credentials_cache); + self.config.store_or_unset(credentials_cache); self } """, @@ -148,7 +148,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom if let Some(credentials_provider) = layer.load::<#{SharedCredentialsProvider}>().cloned() { let cache_config = layer.load::<#{CredentialsCache}>().cloned() .unwrap_or_else({ - let sleep = layer.load::<#{SharedAsyncSleep}>().cloned(); + let sleep = self.runtime_components.sleep_impl(); || match sleep { Some(sleep) => { #{CredentialsCache}::lazy_builder() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index f73d1f84831..6be60295d5a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -101,7 +101,7 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus """ /// Sets the credentials provider for this service pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.inner.store_or_unset(credentials_provider); + self.config.store_or_unset(credentials_provider); self } """, @@ -138,9 +138,9 @@ class CredentialsIdentityResolverRegistration( override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.AdditionalConfig -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { rustBlockTemplate("if let Some(credentials_cache) = ${section.serviceConfigName}.credentials_cache()") { - section.registerIdentityResolver(this, runtimeConfig) { + section.registerIdentityResolver(this) { rustTemplate( """ #{SIGV4_SCHEME_ID}, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt index 5be6feefbd3..911ec7ea27f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt @@ -55,7 +55,7 @@ class HttpConnectorConfigCustomization( """ /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.inner.load::<#{HttpConnector}>() + self.config.load::<#{HttpConnector}>() } """, *codegenScope, @@ -161,7 +161,7 @@ class HttpConnectorConfigCustomization( rustTemplate( """ pub fn set_http_connector(&mut self, http_connector: #{Option}>) -> &mut Self { - http_connector.map(|c| self.inner.store_put(c.into())); + http_connector.map(|c| self.config.store_put(c.into())); self } """, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt index 71c9d9ff62f..9b9fcccb49f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt @@ -36,7 +36,7 @@ private class InvocationIdRuntimePluginCustomization( ) override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { section.registerInterceptor(codegenContext.runtimeConfig, this) { rustTemplate("#{InvocationIdInterceptor}::new()", *codegenScope) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt index 509be8d2952..56092dab81e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt @@ -31,7 +31,7 @@ private class RecursionDetectionRuntimePluginCustomization( private val codegenContext: ClientCodegenContext, ) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { section.registerInterceptor(codegenContext.runtimeConfig, this) { rust( "#T::new()", diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index 494a08f8edc..5c9a0669f69 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -181,7 +181,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi """ /// Returns the AWS region, if it was provided. pub fn region(&self) -> #{Option}<&#{Region}> { - self.inner.load::<#{Region}>() + self.config.load::<#{Region}>() } """, *codegenScope, @@ -232,7 +232,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi """ /// Sets the AWS region to use when making requests. pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { - self.inner.store_or_unset(region); + self.config.store_or_unset(region); self } """, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt index 77185e06675..221c2ec4301 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt @@ -35,7 +35,7 @@ private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodege private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { // Track the latency between client and server. section.registerInterceptor(runtimeConfig, this) { rust( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 7d469b4d989..6163d78a2f0 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -78,13 +78,13 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.AdditionalConfig -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { val serviceHasEventStream = codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model) if (serviceHasEventStream) { // enable the aws-runtime `sign-eventstream` feature addDependency(AwsCargoDependency.awsRuntime(runtimeConfig).withFeature("event-stream").toType().toSymbol()) } - section.registerHttpAuthScheme(this, runtimeConfig) { + section.registerHttpAuthScheme(this) { rustTemplate("#{SharedHttpAuthScheme}::new(#{SigV4HttpAuthScheme}::new())", *codegenScope) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index 19395ebea66..0ca5ce335c2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -104,7 +104,7 @@ class UserAgentDecorator : ClientCodegenDecorator { override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.RegisterInterceptor -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { section.registerInterceptor(runtimeConfig, this) { rust("#T::new()", awsRuntime.resolve("user_agent::UserAgentInterceptor")) } @@ -182,7 +182,7 @@ class UserAgentDecorator : ClientCodegenDecorator { /// This _optional_ name is used to identify the application in the user agent that /// gets sent along with requests. pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { - self.inner.store_or_unset(app_name); + self.config.store_or_unset(app_name); self } """, @@ -228,7 +228,7 @@ class UserAgentDecorator : ClientCodegenDecorator { /// This _optional_ name is used to identify the application in the user agent that /// gets sent along with requests. pub fn app_name(&self) -> #{Option}<&#{AppName}> { - self.inner.load::<#{AppName}>() + self.config.load::<#{AppName}>() } """, *codegenScope, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt index 3f699f59731..05087534b7b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt @@ -66,7 +66,7 @@ private class ApiGatewayAddAcceptHeader : OperationCustomization() { private class ApiGatewayAcceptHeaderInterceptorCustomization(private val codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { section.registerInterceptor(codegenContext.runtimeConfig, this) { rustTemplate( "#{Interceptor}::default()", diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt index 525acffd0a0..ee3f18c175f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt @@ -101,7 +101,7 @@ private class GlacierAccountIdCustomization(private val codegenContext: ClientCo private class GlacierApiVersionCustomization(private val codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { val apiVersion = codegenContext.serviceShape.version section.registerInterceptor(codegenContext.runtimeConfig, this) { rustTemplate( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 57893b1c0ae..55a9e7f7bd4 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -62,7 +62,8 @@ class TimestreamDecorator : ClientCodegenDecorator { #{ResolveEndpointError}::from_source("failed to call describe_endpoints", e) })?; let endpoint = describe_endpoints.endpoints().unwrap().get(0).unwrap(); - let expiry = client.conf().time_source().now() + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); + let expiry = client.conf().time_source().expect("checked when ep discovery was enabled").now() + + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); Ok(( #{Endpoint}::builder() .url(format!("https://{}", endpoint.address().unwrap())) @@ -78,7 +79,7 @@ class TimestreamDecorator : ClientCodegenDecorator { pub async fn enable_endpoint_discovery(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{ResolveEndpointError}> { let mut new_conf = self.conf().clone(); let sleep = self.conf().sleep_impl().expect("sleep impl must be provided"); - let time = self.conf().time_source(); + let time = self.conf().time_source().expect("time source must be provided"); let (resolver, reloader) = #{endpoint_discovery}::create_cache( move || { let client = self.clone(); diff --git a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt new file mode 100644 index 00000000000..fde2f32ae7d --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rustsdk.awsSdkIntegrationTest + +class SdkCodegenIntegrationTest { + val model = """ + namespace test + + use aws.api#service + use aws.auth#sigv4 + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + + @service(sdkId: "dontcare") + @restJson1 + @sigv4(name: "dontcare") + @auth([sigv4]) + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + }) + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + @optionalAuth + operation SomeOperation { + output: SomeOutput + } + """.asSmithyModel() + + @Test + fun smokeTestSdkCodegen() { + awsSdkIntegrationTest( + model, + defaultToOrchestrator = true, + ) { _, _ -> /* it should compile */ } + } + + @Test + fun smokeTestSdkCodegenMiddleware() { + awsSdkIntegrationTest( + model, + defaultToOrchestrator = false, + ) { _, _ -> /* it should compile */ } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt index c598c1ab0d4..6d1d7f8adca 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt @@ -77,10 +77,11 @@ internal class CredentialCacheConfigTest { let client_config = crate::config::Config::builder().build(); let config_override = crate::config::Config::builder().credentials_provider(#{Credentials}::for_tests()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), + let sut = crate::config::ConfigOverrideRuntimePlugin::new( config_override, - }; + client_config.config, + &client_config.runtime_components, + ); // this should cause `panic!` let _ = sut.config().unwrap(); @@ -100,10 +101,11 @@ internal class CredentialCacheConfigTest { let client_config = crate::config::Config::builder().build(); let config_override = crate::config::Config::builder() .credentials_cache(#{CredentialsCache}::no_caching()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), + let sut = crate::config::ConfigOverrideRuntimePlugin::new( config_override, - }; + client_config.config, + &client_config.runtime_components, + ); // this should cause `panic!` let _ = sut.config().unwrap(); @@ -121,7 +123,7 @@ internal class CredentialCacheConfigTest { let client_config = crate::config::Config::builder() .credentials_provider(#{Credentials}::for_tests()) .build(); - let client_config_layer = client_config.config().unwrap(); + let client_config_layer = client_config.config; // make sure test credentials are set in the client config level assert_eq!(#{Credentials}::for_tests(), @@ -143,10 +145,11 @@ internal class CredentialCacheConfigTest { let config_override = crate::config::Config::builder() .credentials_cache(#{CredentialsCache}::lazy()) .credentials_provider(credentials.clone()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config_layer, + let sut = crate::config::ConfigOverrideRuntimePlugin::new( config_override, - }; + client_config_layer, + &client_config.runtime_components, + ); let sut_layer = sut.config().unwrap(); // make sure `.provide_cached_credentials` returns credentials set through `config_override` @@ -170,10 +173,11 @@ internal class CredentialCacheConfigTest { let client_config = crate::config::Config::builder().build(); let config_override = crate::config::Config::builder(); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), + let sut = crate::config::ConfigOverrideRuntimePlugin::new( config_override, - }; + client_config.config, + &client_config.runtime_components, + ); let sut_layer = sut.config().unwrap(); assert!(sut_layer .load::<#{SharedCredentialsCache}>() diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index bb906e99683..8ccf6f6ad46 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -114,6 +114,8 @@ project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +tasks["generateSmithyBuild"].inputs.property("smithy.runtime.mode", getSmithyRuntimeMode()) + tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") diff --git a/codegen-client/build.gradle.kts b/codegen-client/build.gradle.kts index 62d543beb4d..919c1fe9bbc 100644 --- a/codegen-client/build.gradle.kts +++ b/codegen-client/build.gradle.kts @@ -77,12 +77,11 @@ if (isTestingEnabled.toBoolean()) { tasks.test { useJUnitPlatform() testLogging { - events("passed", "skipped", "failed") + events("failed") exceptionFormat = TestExceptionFormat.FULL showCauses = true showExceptions = true showStackTraces = true - showStandardStreams = true } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt index fee242cbe11..b8cf2605def 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt @@ -45,7 +45,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGenerat import software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -172,7 +172,7 @@ class ClientCodegenVisitor( try { // use an increased max_width to make rustfmt fail less frequently "cargo fmt -- --config max_width=150".runCommand(fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong()) - } catch (err: CommandFailed) { + } catch (err: CommandError) { logger.warning("Failed to run cargo fmt: [${service.id}]\n${err.output}") } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt index 4cf45a49ef3..8c48d4ce1df 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt @@ -206,7 +206,7 @@ private class ApiKeyConfigCustomization(codegenContext: ClientCodegenContext) : """ /// Returns API key used by the client, if it was provided. pub fn api_key(&self) -> #{Option}<&#{ApiKey}> { - self.inner.load::<#{ApiKey}>() + self.config.load::<#{ApiKey}>() } """, *codegenScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt index eaed687aebe..cd797f938fa 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt @@ -20,7 +20,7 @@ class ConnectionPoisoningRuntimePluginCustomization( override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.RegisterInterceptor -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { // This interceptor assumes that a compatible Connector is set. Otherwise, connection poisoning // won't work and an error message will be logged. section.registerInterceptor(runtimeConfig, this) { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index 4a8f6057f50..ead864dc32c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -32,7 +32,7 @@ import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf -fun codegenScope(runtimeConfig: RuntimeConfig): Array> { +private fun codegenScope(runtimeConfig: RuntimeConfig): Array> { val smithyRuntime = CargoDependency.smithyRuntime(runtimeConfig).withFeature("http-auth").toType() val smithyRuntimeApi = CargoDependency.smithyRuntimeApi(runtimeConfig).withFeature("http-auth").toType() @@ -42,7 +42,6 @@ fun codegenScope(runtimeConfig: RuntimeConfig): Array> { "AuthSchemeId" to smithyRuntimeApi.resolve("client::auth::AuthSchemeId"), "ApiKeyAuthScheme" to authHttp.resolve("ApiKeyAuthScheme"), "ApiKeyLocation" to authHttp.resolve("ApiKeyLocation"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "BasicAuthScheme" to authHttp.resolve("BasicAuthScheme"), "BearerAuthScheme" to authHttp.resolve("BearerAuthScheme"), "DigestAuthScheme" to authHttp.resolve("DigestAuthScheme"), @@ -163,9 +162,9 @@ private class HttpAuthServiceRuntimePluginCustomization( override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.AdditionalConfig -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { fun registerAuthScheme(scheme: Writable) { - section.registerHttpAuthScheme(this, codegenContext.runtimeConfig) { + section.registerHttpAuthScheme(this) { rustTemplate("#{SharedHttpAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) } } @@ -236,8 +235,7 @@ private class HttpAuthConfigCustomization( /// Sets an API key resolver will be used for authentication. pub fn api_key_resolver(mut self, api_key_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + self.runtime_components.push_identity_resolver( #{HTTP_API_KEY_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(api_key_resolver) ); @@ -257,8 +255,7 @@ private class HttpAuthConfigCustomization( /// Sets a bearer token provider that will be used for HTTP bearer auth. pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + self.runtime_components.push_identity_resolver( #{HTTP_BEARER_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(bearer_token_resolver) ); @@ -278,8 +275,7 @@ private class HttpAuthConfigCustomization( /// Sets a login resolver that will be used for HTTP basic auth. pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + self.runtime_components.push_identity_resolver( #{HTTP_BASIC_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(basic_auth_resolver) ); @@ -299,8 +295,7 @@ private class HttpAuthConfigCustomization( /// Sets a login resolver that will be used for HTTP digest auth. pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + self.runtime_components.push_identity_resolver( #{HTTP_DIGEST_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(digest_auth_resolver) ); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt index fc5c1d6298d..e654b48421d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt @@ -40,7 +40,7 @@ class HttpChecksumRequiredGenerator( is OperationSection.AdditionalRuntimePlugins -> writable { section.addOperationRuntimePlugin(this) { rustTemplate( - "#{HttpChecksumRequiredRuntimePlugin}", + "#{HttpChecksumRequiredRuntimePlugin}::new()", "HttpChecksumRequiredRuntimePlugin" to InlineDependency.forRustFile( RustModule.pubCrate("client_http_checksum_required", parent = ClientRustModule.root), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 1153c277705..e2d71aeae71 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig @@ -40,13 +41,52 @@ private class HttpConnectorConfigCustomization( *preludeScope, "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), "ConnectorSettings" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::ConnectorSettings"), - "DynConnector" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::connectors::DynConnector"), + "default_connector" to RuntimeType.smithyClient(runtimeConfig).resolve("conns::default_connector"), "DynConnectorAdapter" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::connectors::adapter::DynConnectorAdapter"), "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), + "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), + "SharedConnector" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::connectors::SharedConnector"), "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), ) + private fun setConnectorFn(): RuntimeType = RuntimeType.forInlineFun("set_connector", ClientRustModule.config) { + rustTemplate( + """ + fn set_connector(resolver: &mut #{Resolver}<'_>) { + // Initial configuration needs to set a default if no connector is given, so it + // should always get into the condition below. + // + // Override configuration should set the connector if the override config + // contains a connector, sleep impl, or a timeout config since these are all + // incorporated into the final connector. + let must_set_connector = resolver.is_initial() + || resolver.is_latest_set::<#{HttpConnector}>() + || resolver.latest_sleep_impl().is_some() + || resolver.is_latest_set::<#{TimeoutConfig}>(); + if must_set_connector { + let sleep_impl = resolver.sleep_impl(); + let timeout_config = resolver.resolve_config::<#{TimeoutConfig}>() + .cloned() + .unwrap_or_else(#{TimeoutConfig}::disabled); + let connector_settings = #{ConnectorSettings}::from_timeout_config(&timeout_config); + let http_connector = resolver.resolve_config::<#{HttpConnector}>(); + + // TODO(enableNewSmithyRuntimeCleanup): Replace the tower-based DynConnector and remove DynConnectorAdapter when deleting the middleware implementation + let connector = + http_connector + .and_then(|c| c.connector(&connector_settings, sleep_impl.clone())) + .or_else(|| #{default_connector}(&connector_settings, sleep_impl)) + .map(|c| #{SharedConnector}::new(#{DynConnectorAdapter}::new(c))); + + resolver.runtime_components_mut().set_connector(connector); + } + } + """, + *codegenScope, + ) + } + override fun section(section: ServiceConfig): Writable { return when (section) { is ServiceConfig.ConfigStruct -> writable { @@ -59,9 +99,15 @@ private class HttpConnectorConfigCustomization( if (runtimeMode.defaultToOrchestrator) { rustTemplate( """ + // TODO(enableNewSmithyRuntimeCleanup): Remove this function /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.inner.load::<#{HttpConnector}>() + self.config.load::<#{HttpConnector}>() + } + + /// Return the [`SharedConnector`](#{SharedConnector}) to use when making requests, if any. + pub fn connector(&self) -> Option<#{SharedConnector}> { + self.runtime_components.connector() } """, *codegenScope, @@ -164,12 +210,11 @@ private class HttpConnectorConfigCustomization( """, *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { rustTemplate( """ pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { - http_connector.map(|c| self.inner.store_put(c.into())); + http_connector.map(|c| self.config.store_put(c.into())); self } """, @@ -191,26 +236,8 @@ private class HttpConnectorConfigCustomization( is ServiceConfig.BuilderBuild -> writable { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - """ - let sleep_impl = layer.load::<#{SharedAsyncSleep}>().cloned(); - let timeout_config = layer.load::<#{TimeoutConfig}>().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); - - let connector_settings = #{ConnectorSettings}::from_timeout_config(&timeout_config); - - if let Some(connector) = layer.load::<#{HttpConnector}>() - .and_then(|c| c.connector(&connector_settings, sleep_impl.clone())) - .or_else(|| #{default_connector}(&connector_settings, sleep_impl)) { - let connector: #{DynConnector} = #{DynConnector}::new(#{DynConnectorAdapter}::new( - // TODO(enableNewSmithyRuntimeCleanup): Replace the tower-based DynConnector and remove DynConnectorAdapter when deleting the middleware implementation - connector - )); - #{ConfigBagAccessors}::set_connector(&mut layer, connector); - } - - """, - *codegenScope, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "default_connector" to RuntimeType.smithyClient(runtimeConfig).resolve("conns::default_connector"), + "#{set_connector}(&mut resolver);", + "set_connector" to setConnectorFn(), ) } else { rust("http_connector: self.http_connector,") @@ -220,38 +247,8 @@ private class HttpConnectorConfigCustomization( is ServiceConfig.OperationConfigOverride -> writable { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - """ - if let #{Some}(http_connector) = - layer.load::<#{HttpConnector}>() - { - let sleep_impl = layer - .load::<#{SharedAsyncSleep}>() - .or_else(|| { - self.client_config - .load::<#{SharedAsyncSleep}>() - }) - .cloned(); - let timeout_config = layer - .load::<#{TimeoutConfig}>() - .or_else(|| { - self.client_config - .load::<#{TimeoutConfig}>() - }) - .expect("timeout config should be set either in `config_override` or in the client config"); - let connector_settings = - #{ConnectorSettings}::from_timeout_config( - timeout_config, - ); - if let #{Some}(conn) = http_connector.connector(&connector_settings, sleep_impl) { - let connection: #{DynConnector} = #{DynConnector}::new(#{DynConnectorAdapter}::new( - // TODO(enableNewSmithyRuntimeCleanup): Replace the tower-based DynConnector and remove DynConnectorAdapter when deleting the middleware implementation - conn - )); - layer.set_connector(connection); - } - } - """, - *codegenScope, + "#{set_connector}(&mut resolver);", + "set_connector" to setConnectorFn(), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt deleted file mode 100644 index d08afe493b0..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType - -class IdentityConfigCustomization(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { - override fun section(section: ServiceConfig): Writable = writable { - if (section is ServiceConfig.ConfigImpl) { - rustTemplate( - """ - /// Returns the identity resolvers. - pub fn identity_resolvers(&self) -> #{IdentityResolvers} { - #{ConfigBagAccessors}::identity_resolvers(&self.inner) - } - """, - "IdentityResolvers" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) - .resolve("client::identity::IdentityResolvers"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), - ) - } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index 692b874517a..2dfec5159ed 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -32,23 +32,12 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.ConfigStruct -> rustTemplate( - "pub(crate) interceptors: Vec<#{SharedInterceptor}>,", - *codegenScope, - ) - - ServiceConfig.BuilderStruct -> - rustTemplate( - "interceptors: Vec<#{SharedInterceptor}>,", - *codegenScope, - ) - ServiceConfig.ConfigImpl -> rustTemplate( """ #{maybe_hide_orchestrator_code} /// Returns interceptors currently registered by the user. - pub fn interceptors(&self) -> impl Iterator + '_ { - self.interceptors.iter() + pub fn interceptors(&self) -> impl Iterator + '_ { + self.runtime_components.interceptors() } """, *codegenScope, @@ -103,7 +92,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// ## } /// ``` pub fn interceptor(mut self, interceptor: impl #{Interceptor} + Send + Sync + 'static) -> Self { - self.add_interceptor(#{SharedInterceptor}::new(interceptor)); + self.push_interceptor(#{SharedInterceptor}::new(interceptor)); self } @@ -146,7 +135,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// Ok(()) /// } /// } - /// builder.add_interceptor(SharedInterceptor::new(UriModifierInterceptor)); + /// builder.push_interceptor(SharedInterceptor::new(UriModifierInterceptor)); /// } /// /// let mut builder = Config::builder(); @@ -155,29 +144,21 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// ## } /// ## } /// ``` - pub fn add_interceptor(&mut self, interceptor: #{SharedInterceptor}) -> &mut Self { - self.interceptors.push(interceptor); + pub fn push_interceptor(&mut self, interceptor: #{SharedInterceptor}) -> &mut Self { + self.runtime_components.push_interceptor(interceptor); self } #{maybe_hide_orchestrator_code} /// Set [`SharedInterceptor`](#{SharedInterceptor})s for the builder. pub fn set_interceptors(&mut self, interceptors: impl IntoIterator) -> &mut Self { - self.interceptors = interceptors.into_iter().collect(); + self.runtime_components.set_interceptors(interceptors.into_iter()); self } """, *codegenScope, ) - is ServiceConfig.RuntimePluginInterceptors -> rust( - """ - ${section.interceptors}.extend(${section.interceptorsField}.interceptors.iter().cloned()); - """, - ) - - is ServiceConfig.BuilderBuildExtras -> rust("interceptors: self.interceptors,") - else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index dc20049c46f..fc74d456c3c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -30,21 +30,21 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "DynRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries::DynRetryStrategy"), + "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), + "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), + "debug" to RuntimeType.Tracing.resolve("debug"), "RetryConfig" to retryConfig.resolve("RetryConfig"), + "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), + "RetryPartition" to retries.resolve("RetryPartition"), "SharedAsyncSleep" to sleepModule.resolve("SharedAsyncSleep"), + "SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries::SharedRetryStrategy"), + "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"), "Sleep" to sleepModule.resolve("Sleep"), "StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"), "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), - "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), "TokenBucket" to retries.resolve("TokenBucket"), - "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), - "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"), - "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), "TokenBucketPartition" to retries.resolve("TokenBucketPartition"), - "RetryPartition" to retries.resolve("RetryPartition"), - "debug" to RuntimeType.Tracing.resolve("debug"), ) override fun section(section: ServiceConfig) = @@ -69,17 +69,17 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon """ /// Return a reference to the retry configuration contained in this config, if any. pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { - self.inner.load::<#{RetryConfig}>() + self.config.load::<#{RetryConfig}>() } /// Return a cloned shared async sleep implementation from this config, if any. pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { - self.inner.load::<#{SharedAsyncSleep}>().cloned() + self.runtime_components.sleep_impl() } /// Return a reference to the timeout configuration contained in this config, if any. pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { - self.inner.load::<#{TimeoutConfig}>() + self.config.load::<#{TimeoutConfig}>() } ##[doc(hidden)] @@ -88,7 +88,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon /// WARNING: This method is unstable and may be removed at any time. Do not rely on this /// method for anything! pub fn retry_partition(&self) -> #{Option}<&#{RetryPartition}> { - self.inner.load::<#{RetryPartition}>() + self.config.load::<#{RetryPartition}>() } """, *codegenScope, @@ -171,7 +171,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon rustTemplate( """ pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { - retry_config.map(|r| self.inner.store_put(r)); + retry_config.map(|r| self.config.store_put(r)); self } """, @@ -249,7 +249,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon rustTemplate( """ pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { - sleep_impl.map(|s| self.inner.store_put(s)); + self.runtime_components.set_sleep_impl(sleep_impl); self } """, @@ -317,7 +317,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon rustTemplate( """ pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { - timeout_config.map(|t| self.inner.store_put(t)); + timeout_config.map(|t| self.config.store_put(t)); self } """, @@ -357,7 +357,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon /// also share things like token buckets and client rate limiters. By default, all clients /// for the same service will share a partition. pub fn set_retry_partition(&mut self, retry_partition: #{Option}<#{RetryPartition}>) -> &mut Self { - retry_partition.map(|r| self.inner.store_put(r)); + retry_partition.map(|r| self.config.store_put(r)); self } """, @@ -377,7 +377,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon } if retry_config.mode() == #{RetryMode}::Adaptive { - if let #{Some}(time_source) = layer.load::<#{SharedTimeSource}>().cloned() { + if let #{Some}(time_source) = self.runtime_components.time_source() { let seconds_since_unix_epoch = time_source .now() .duration_since(#{SystemTime}::UNIX_EPOCH) @@ -395,13 +395,16 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon let token_bucket_partition = #{TokenBucketPartition}::new(retry_partition); let token_bucket = TOKEN_BUCKET.get_or_init(token_bucket_partition, #{TokenBucket}::default); layer.store_put(token_bucket); - layer.set_retry_strategy(#{DynRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config))); // TODO(enableNewSmithyRuntimeCleanup): Should not need to provide a default once smithy-rs##2770 // is resolved if layer.load::<#{TimeoutConfig}>().is_none() { layer.store_put(#{TimeoutConfig}::disabled()); } + + self.runtime_components.set_retry_strategy(#{Some}( + #{SharedRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config))) + ); """, *codegenScope, ) @@ -420,24 +423,6 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon } } - is ServiceConfig.OperationConfigOverride -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - if let #{Some}(retry_config) = layer - .load::<#{RetryConfig}>() - .cloned() - { - layer.set_retry_strategy( - #{DynRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config)) - ); - } - """, - *codegenScope, - ) - } - } - else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index 0dacbd72909..44579aec51a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -42,16 +42,16 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust is ServiceConfig.ConfigImpl -> { rust("/// Return time source used for this service.") rustBlockTemplate( - "pub fn time_source(&self) -> #{SharedTimeSource}", + "pub fn time_source(&self) -> #{Option}<#{SharedTimeSource}>", *codegenScope, ) { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - """self.inner.load::<#{SharedTimeSource}>().expect("time source should be set").clone()""", + """self.runtime_components.time_source()""", *codegenScope, ) } else { - rust("self.time_source.clone()") + rustTemplate("#{Some}(self.time_source.clone())", *codegenScope) } } } @@ -88,7 +88,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust &mut self, time_source: #{Option}<#{SharedTimeSource}>, ) -> &mut Self { - self.inner.store_or_unset(time_source); + self.runtime_components.set_time_source(time_source); self } """, @@ -114,7 +114,11 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust ServiceConfig.BuilderBuild -> { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - "layer.store_put(layer.load::<#{SharedTimeSource}>().cloned().unwrap_or_default());", + """ + if self.runtime_components.time_source().is_none() { + self.runtime_components.set_time_source(#{Default}::default()); + } + """, *codegenScope, ) } else { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 9c64b5e8fd4..46de4940a07 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -13,7 +13,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.Endpoint import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpChecksumRequiredGenerator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpVersionListCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenGenerator -import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdentityConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization @@ -66,8 +65,7 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations + ResiliencyConfigCustomization(codegenContext) + InterceptorConfigCustomization(codegenContext) + - TimeSourceCustomization(codegenContext) + - IdentityConfigCustomization(codegenContext) + TimeSourceCustomization(codegenContext) } else { baseCustomizations + ResiliencyConfigCustomization(codegenContext) + diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index a55c5b3e7d0..81b89d989d8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -28,18 +28,20 @@ internal class EndpointConfigCustomization( private val runtimeMode = codegenContext.smithyRuntimeMode private val types = Types(runtimeConfig) + private val codegenScope = arrayOf( + *preludeScope, + "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), + "OldSharedEndpointResolver" to types.sharedEndpointResolver, + "Params" to typesGenerator.paramsStruct(), + "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), + "SharedEndpointResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::SharedEndpointResolver"), + "SmithyResolver" to types.resolveEndpoint, + ) + override fun section(section: ServiceConfig): Writable { return writable { - val sharedEndpointResolver = "#{SharedEndpointResolver}<#{Params}>" + val sharedEndpointResolver = "#{OldSharedEndpointResolver}<#{Params}>" val resolverTrait = "#{SmithyResolver}<#{Params}>" - val codegenScope = arrayOf( - *preludeScope, - "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), - "DynEndpointResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::DynEndpointResolver"), - "SharedEndpointResolver" to types.sharedEndpointResolver, - "SmithyResolver" to types.resolveEndpoint, - "Params" to typesGenerator.paramsStruct(), - ) when (section) { is ServiceConfig.ConfigStruct -> { if (runtimeMode.defaultToMiddleware) { @@ -55,8 +57,8 @@ internal class EndpointConfigCustomization( rustTemplate( """ /// Returns the endpoint resolver. - pub fn endpoint_resolver(&self) -> $sharedEndpointResolver { - self.inner.load::<$sharedEndpointResolver>().expect("endpoint resolver should be set").clone() + pub fn endpoint_resolver(&self) -> #{SharedEndpointResolver} { + self.runtime_components.endpoint_resolver().expect("resolver defaulted if not set") } """, *codegenScope, @@ -128,7 +130,7 @@ internal class EndpointConfigCustomization( /// Sets the endpoint resolver to use when making requests. $defaultResolverDocs pub fn endpoint_resolver(mut self, endpoint_resolver: impl $resolverTrait + 'static) -> Self { - self.set_endpoint_resolver(#{Some}(#{SharedEndpointResolver}::new(endpoint_resolver))); + self.set_endpoint_resolver(#{Some}(#{OldSharedEndpointResolver}::new(endpoint_resolver))); self } @@ -144,7 +146,7 @@ internal class EndpointConfigCustomization( rustTemplate( """ pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.inner.store_or_unset(endpoint_resolver); + self.config.store_or_unset(endpoint_resolver); self } """, @@ -164,96 +166,29 @@ internal class EndpointConfigCustomization( } ServiceConfig.BuilderBuild -> { - val defaultResolver = typesGenerator.defaultResolver() - if (defaultResolver != null) { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - // TODO(enableNewSmithyRuntimeCleanup): Simplify the endpoint resolvers - """ - let endpoint_resolver = #{DynEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new( - layer.load::<$sharedEndpointResolver>().cloned().unwrap_or_else(|| - #{SharedEndpointResolver}::new(#{DefaultResolver}::new()) - ) - ) - ); - layer.set_endpoint_resolver(endpoint_resolver); - """, - *codegenScope, - "DefaultResolver" to defaultResolver, - ) - } else { - rustTemplate( - """ - endpoint_resolver: self.endpoint_resolver.unwrap_or_else(|| - #{SharedEndpointResolver}::new(#{DefaultResolver}::new()) - ), - """, - *codegenScope, - "DefaultResolver" to defaultResolver, - ) - } + if (runtimeMode.defaultToOrchestrator) { + rustTemplate( + "#{set_endpoint_resolver}(&mut resolver);", + "set_endpoint_resolver" to setEndpointResolverFn(), + ) } else { - val alwaysFailsResolver = - RuntimeType.forInlineFun("MissingResolver", ClientRustModule.endpoint(codegenContext)) { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct MissingResolver; - impl #{ResolveEndpoint} for MissingResolver { - fn resolve_endpoint(&self, _params: &T) -> #{Result} { - Err(#{ResolveEndpointError}::message("an endpoint resolver must be provided.")) - } - } - """, - "ResolveEndpoint" to types.resolveEndpoint, - "ResolveEndpointError" to types.resolveEndpointError, - "Result" to types.smithyHttpEndpointModule.resolve("Result"), - ) - } - // To keep this diff under control, rather than `.expect` here, insert a resolver that will - // always fail. In the future, this will be changed to an `expect()` - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - let endpoint_resolver = #{DynEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new( - layer.load::<$sharedEndpointResolver>().cloned().unwrap_or_else(|| - #{SharedEndpointResolver}::new(#{FailingResolver}) - ).clone() - ) - ); - layer.set_endpoint_resolver(endpoint_resolver); - """, - *codegenScope, - "FailingResolver" to alwaysFailsResolver, - ) - } else { - rustTemplate( - """ - endpoint_resolver: self.endpoint_resolver.unwrap_or_else(||#{SharedEndpointResolver}::new(#{FailingResolver})), - """, - *codegenScope, - "FailingResolver" to alwaysFailsResolver, - ) - } + rustTemplate( + """ + endpoint_resolver: self.endpoint_resolver.unwrap_or_else(|| + #{OldSharedEndpointResolver}::new(#{DefaultResolver}::new()) + ), + """, + *codegenScope, + "DefaultResolver" to defaultResolver(), + ) } } is ServiceConfig.OperationConfigOverride -> { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - """ - if let #{Some}(resolver) = layer - .load::<$sharedEndpointResolver>() - .cloned() - { - let endpoint_resolver = #{DynEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new(resolver)); - layer.set_endpoint_resolver(endpoint_resolver); - } - """, - *codegenScope, + "#{set_endpoint_resolver}(&mut resolver);", + "set_endpoint_resolver" to setEndpointResolverFn(), ) } } @@ -262,4 +197,58 @@ internal class EndpointConfigCustomization( } } } + + private fun defaultResolver(): RuntimeType { + // For now, fallback to a default endpoint resolver that always fails. In the future, + // the endpoint resolver will be required (so that it can be unwrapped). + return typesGenerator.defaultResolver() ?: RuntimeType.forInlineFun( + "MissingResolver", + ClientRustModule.endpoint(codegenContext), + ) { + rustTemplate( + """ + ##[derive(Debug)] + pub(crate) struct MissingResolver; + impl MissingResolver { + pub(crate) fn new() -> Self { Self } + } + impl #{ResolveEndpoint} for MissingResolver { + fn resolve_endpoint(&self, _params: &T) -> #{Result} { + Err(#{ResolveEndpointError}::message("an endpoint resolver must be provided.")) + } + } + """, + "ResolveEndpoint" to types.resolveEndpoint, + "ResolveEndpointError" to types.resolveEndpointError, + "Result" to types.smithyHttpEndpointModule.resolve("Result"), + ) + } + } + + private fun setEndpointResolverFn(): RuntimeType = RuntimeType.forInlineFun("set_endpoint_resolver", ClientRustModule.config) { + // TODO(enableNewSmithyRuntimeCleanup): Simplify the endpoint resolvers + rustTemplate( + """ + fn set_endpoint_resolver(resolver: &mut #{Resolver}<'_>) { + let endpoint_resolver = if resolver.is_initial() { + Some(resolver.resolve_config::<#{OldSharedEndpointResolver}<#{Params}>>().cloned().unwrap_or_else(|| + #{OldSharedEndpointResolver}::new(#{DefaultResolver}::new()) + )) + } else if resolver.is_latest_set::<#{OldSharedEndpointResolver}<#{Params}>>() { + resolver.resolve_config::<#{OldSharedEndpointResolver}<#{Params}>>().cloned() + } else { + None + }; + if let Some(endpoint_resolver) = endpoint_resolver { + let shared = #{SharedEndpointResolver}::new( + #{DefaultEndpointResolver}::<#{Params}>::new(endpoint_resolver) + ); + resolver.runtime_components_mut().set_endpoint_resolver(#{Some}(shared)); + } + } + """, + *codegenScope, + "DefaultResolver" to defaultResolver(), + ) + } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index edfe94af95b..5a37375e568 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -23,12 +23,15 @@ class ConfigOverrideRuntimePluginGenerator( val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *RuntimeType.preludeScope, + "Cow" to RuntimeType.Cow, "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), "ConfigBagAccessors" to runtimeApi.resolve("client::config_bag_accessors::ConfigBagAccessors"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), "Layer" to smithyTypes.resolve("config_bag::Layer"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), + "Resolver" to RuntimeType.smithyRuntime(rc).resolve("client::config_override::Resolver"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), + "RuntimePlugin" to RuntimeType.runtimePlugin(rc), ) } @@ -41,31 +44,40 @@ class ConfigOverrideRuntimePluginGenerator( /// In the case of default values requested, they will be obtained from `client_config`. ##[derive(Debug)] pub(crate) struct ConfigOverrideRuntimePlugin { - pub(crate) config_override: Builder, - pub(crate) client_config: #{FrozenLayer}, + pub(crate) config: #{FrozenLayer}, + pub(crate) components: #{RuntimeComponentsBuilder}, } - impl #{RuntimePlugin} for ConfigOverrideRuntimePlugin { - fn config(&self) -> #{Option}<#{FrozenLayer}> { - use #{ConfigBagAccessors}; + impl ConfigOverrideRuntimePlugin { + pub(crate) fn new( + config_override: Builder, + initial_config: #{FrozenLayer}, + initial_components: &#{RuntimeComponentsBuilder} + ) -> Self { + let mut layer = #{Layer}::from(config_override.config) + .with_name("$moduleUseName::config::ConfigOverrideRuntimePlugin"); + let mut components = config_override.runtime_components; + let mut resolver = #{Resolver}::overrid(initial_config, initial_components, &mut layer, &mut components); - ##[allow(unused_mut)] - let layer: #{Layer} = self - .config_override - .inner - .clone() - .into(); - let mut layer = layer.with_name("$moduleUseName::config::ConfigOverrideRuntimePlugin"); #{config} - #{Some}(layer.freeze()) + let _ = resolver; + Self { + config: layer.freeze(), + components, + } } + } - fn interceptors(&self, _interceptors: &mut #{InterceptorRegistrar}) { - #{interceptors} + impl #{RuntimePlugin} for ConfigOverrideRuntimePlugin { + fn config(&self) -> #{Option}<#{FrozenLayer}> { + Some(self.config.clone()) } - } + fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + #{Cow}::Borrowed(&self.components) + } + } """, *codegenScope, "config" to writable { @@ -74,9 +86,6 @@ class ConfigOverrideRuntimePluginGenerator( ServiceConfig.OperationConfigOverride("layer"), ) }, - "interceptors" to writable { - writeCustomizations(customizations, ServiceConfig.RuntimePluginInterceptors("_interceptors", "self.config_override")) - }, ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index 87fead7142f..90552c3659b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -107,14 +107,17 @@ sealed class OperationSection(name: String) : Section(name) { data class AdditionalInterceptors( override val customizations: List, - val interceptorRegistrarName: String, val operationShape: OperationShape, ) : OperationSection("AdditionalInterceptors") { fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) writer.rustTemplate( """ - $interceptorRegistrarName.register(#{SharedInterceptor}::new(#{interceptor}) as _); + .with_interceptor( + #{SharedInterceptor}::new( + #{interceptor} + ) as _ + ) """, "interceptor" to interceptor, "SharedInterceptor" to smithyRuntimeApi.resolve("client::interceptors::SharedInterceptor"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index a0087b3d2a3..39795ed5033 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -18,6 +18,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.implBlock +import software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -118,6 +119,12 @@ open class OperationGenerator( "SdkError" to RuntimeType.sdkError(runtimeConfig), ) if (codegenContext.smithyRuntimeMode.generateOrchestrator) { + val additionalPlugins = writable { + writeCustomizations( + operationCustomizations, + OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), + ) + } rustTemplate( """ pub(crate) async fn orchestrate( @@ -159,14 +166,16 @@ open class OperationGenerator( config_override: #{Option}, ) -> #{RuntimePlugins} { let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); + #{additional_runtime_plugins} if let Some(config_override) = config_override { - runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin { - config_override, - client_config: #{RuntimePlugin}::config(client_config).expect("frozen layer should exist in client config"), - }) + for plugin in config_override.runtime_plugins.iter().cloned() { + runtime_plugins = runtime_plugins.with_operation_plugin(plugin); + } + runtime_plugins = runtime_plugins.with_operation_plugin( + crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components) + ); } runtime_plugins - #{additional_runtime_plugins} } """, *codegenScope, @@ -179,10 +188,15 @@ open class OperationGenerator( "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::invoke_with_stop_point"), "additional_runtime_plugins" to writable { - writeCustomizations( - operationCustomizations, - OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), - ) + if (additionalPlugins.isNotEmpty()) { + rustTemplate( + """ + runtime_plugins = runtime_plugins + #{additional_runtime_plugins}; + """, + "additional_runtime_plugins" to additionalPlugins, + ) + } }, ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index febdb958256..a798a9753b6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -34,17 +34,19 @@ class OperationRuntimePluginGenerator( val runtimeApi = RuntimeType.smithyRuntimeApi(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( + *preludeScope, "AuthOptionResolverParams" to runtimeApi.resolve("client::auth::AuthOptionResolverParams"), "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), - "DynAuthOptionResolver" to runtimeApi.resolve("client::auth::DynAuthOptionResolver"), + "Cow" to RuntimeType.Cow, + "SharedAuthOptionResolver" to runtimeApi.resolve("client::auth::SharedAuthOptionResolver"), "DynResponseDeserializer" to runtimeApi.resolve("client::orchestrator::DynResponseDeserializer"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RetryClassifiers" to runtimeApi.resolve("client::retries::RetryClassifiers"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), + "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig), "SharedRequestSerializer" to runtimeApi.resolve("client::orchestrator::SharedRequestSerializer"), "StaticAuthOptionResolver" to runtimeApi.resolve("client::auth::option_resolver::StaticAuthOptionResolver"), "StaticAuthOptionResolverParams" to runtimeApi.resolve("client::auth::option_resolver::StaticAuthOptionResolverParams"), @@ -68,22 +70,25 @@ class OperationRuntimePluginGenerator( cfg.set_request_serializer(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); cfg.set_response_deserializer(#{DynResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); - // Retry classifiers are operation-specific because they need to downcast operation-specific error types. - let retry_classifiers = #{RetryClassifiers}::new() - #{retry_classifier_customizations}; - cfg.set_retry_classifiers(retry_classifiers); - ${"" /* TODO(IdentityAndAuth): Resolve auth parameters from input for services that need this */} cfg.set_auth_option_resolver_params(#{AuthOptionResolverParams}::new(#{StaticAuthOptionResolverParams}::new())); - #{auth_options} #{additional_config} Some(cfg.freeze()) } - fn interceptors(&self, _interceptors: &mut #{InterceptorRegistrar}) { - #{interceptors} + fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + // Retry classifiers are operation-specific because they need to downcast operation-specific error types. + let retry_classifiers = #{RetryClassifiers}::new() + #{retry_classifier_customizations}; + + #{Cow}::Owned( + #{RuntimeComponentsBuilder}::new(${operationShape.id.name.dq()}) + .with_retry_classifiers(Some(retry_classifiers)) + #{auth_options} + #{interceptors} + ) } } @@ -117,7 +122,7 @@ class OperationRuntimePluginGenerator( "interceptors" to writable { writeCustomizations( customizations, - OperationSection.AdditionalInterceptors(customizations, "_interceptors", operationShape), + OperationSection.AdditionalInterceptors(customizations, operationShape), ) }, ) @@ -135,8 +140,12 @@ class OperationRuntimePluginGenerator( option.schemeShapeId to option } withBlockTemplate( - "cfg.set_auth_option_resolver(#{DynAuthOptionResolver}::new(#{StaticAuthOptionResolver}::new(vec![", - "])));", + """ + .with_auth_option_resolver(#{Some}( + #{SharedAuthOptionResolver}::new( + #{StaticAuthOptionResolver}::new(vec![ + """, + "]))))", *codegenScope, ) { var noSupportedAuthSchemes = true diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt index 1c85d9047b0..01cecc49f39 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt @@ -54,7 +54,6 @@ class ServiceGenerator( ServiceRuntimePluginGenerator(codegenContext) .render(this, decorator.serviceRuntimePluginCustomizations(codegenContext, emptyList())) - serviceConfigGenerator.renderRuntimePluginImplForSelf(this) ConfigOverrideRuntimePluginGenerator(codegenContext) .render(this, decorator.configCustomizations(codegenContext, listOf())) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index c77e95940a8..b5da3eaba9c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -36,43 +36,35 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { fun putConfigValue(writer: RustWriter, value: Writable) { writer.rust("$newLayerName.store_put(#T);", value) } + } - fun registerHttpAuthScheme(writer: RustWriter, runtimeConfig: RuntimeConfig, authScheme: Writable) { + data class RegisterRuntimeComponents(val serviceConfigName: String) : ServiceRuntimePluginSection("RegisterRuntimeComponents") { + /** Generates the code to register an interceptor */ + fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { writer.rustTemplate( """ - #{ConfigBagAccessors}::push_http_auth_scheme( - &mut $newLayerName, - #{auth_scheme} - ); + runtime_components.push_interceptor(#{SharedInterceptor}::new(#{interceptor}) as _); """, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "auth_scheme" to authScheme, + "interceptor" to interceptor, + "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), ) } - fun registerIdentityResolver(writer: RustWriter, runtimeConfig: RuntimeConfig, identityResolver: Writable) { + fun registerHttpAuthScheme(writer: RustWriter, authScheme: Writable) { writer.rustTemplate( """ - #{ConfigBagAccessors}::push_identity_resolver( - &mut $newLayerName, - #{identity_resolver} - ); + runtime_components.push_http_auth_scheme(#{auth_scheme}); """, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "identity_resolver" to identityResolver, + "auth_scheme" to authScheme, ) } - } - data class RegisterInterceptor(val interceptorRegistrarName: String) : ServiceRuntimePluginSection("RegisterInterceptor") { - /** Generates the code to register an interceptor */ - fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { + fun registerIdentityResolver(writer: RustWriter, identityResolver: Writable) { writer.rustTemplate( """ - $interceptorRegistrarName.register(#{SharedInterceptor}::new(#{interceptor}) as _); + runtime_components.push_identity_resolver(#{identity_resolver}); """, - "interceptor" to interceptor, - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), + "identity_resolver" to identityResolver, ) } } @@ -92,12 +84,11 @@ class ServiceRuntimePluginGenerator( *preludeScope, "Arc" to RuntimeType.Arc, "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), - "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), + "Cow" to RuntimeType.Cow, "Layer" to smithyTypes.resolve("config_bag::Layer"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(rc), - "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), + "RuntimePlugin" to RuntimeType.runtimePlugin(rc), ) } @@ -113,15 +104,15 @@ class ServiceRuntimePluginGenerator( ##[derive(Debug)] pub(crate) struct ServiceRuntimePlugin { config: #{Option}<#{FrozenLayer}>, + runtime_components: #{RuntimeComponentsBuilder}, } impl ServiceRuntimePlugin { pub fn new(_service_config: crate::config::Config) -> Self { - Self { - config: { - #{config} - }, - } + let config = { #{config} }; + let mut runtime_components = #{RuntimeComponentsBuilder}::new("ServiceRuntimePlugin"); + #{runtime_components} + Self { config, runtime_components } } } @@ -130,9 +121,8 @@ class ServiceRuntimePluginGenerator( self.config.clone() } - fn interceptors(&self, interceptors: &mut #{InterceptorRegistrar}) { - let _interceptors = interceptors; - #{additional_interceptors} + fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + #{Cow}::Borrowed(&self.runtime_components) } } @@ -155,8 +145,8 @@ class ServiceRuntimePluginGenerator( rust("None") } }, - "additional_interceptors" to writable { - writeCustomizations(customizations, ServiceRuntimePluginSection.RegisterInterceptor("_interceptors")) + "runtime_components" to writable { + writeCustomizations(customizations, ServiceRuntimePluginSection.RegisterRuntimeComponents("_service_config")) }, "declare_singletons" to writable { writeCustomizations(customizations, ServiceRuntimePluginSection.DeclareSingletons()) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index c8afcb7a960..633a50985a2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -156,6 +156,7 @@ class CustomizableOperationGenerator( "MutateRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) .resolve("client::interceptors::MutateRequestInterceptor"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(runtimeConfig), "SendResult" to ClientRustModule.Client.customize.toType() .resolve("internal::SendResult"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), @@ -188,6 +189,7 @@ class CustomizableOperationGenerator( pub(crate) customizable_send: #{Box}>, pub(crate) config_override: #{Option}, pub(crate) interceptors: Vec<#{SharedInterceptor}>, + pub(crate) runtime_plugins: Vec<#{SharedRuntimePlugin}>, } impl CustomizableOperation { @@ -202,6 +204,13 @@ class CustomizableOperationGenerator( self } + /// Adds a runtime plugin. + ##[allow(unused)] + pub(crate) fn runtime_plugin(mut self, runtime_plugin: impl #{RuntimePlugin} + 'static) -> Self { + self.runtime_plugins.push(#{SharedRuntimePlugin}::new(runtime_plugin)); + self + } + /// Allows for customizing the operation's request. pub fn map_request(mut self, f: F) -> Self where @@ -264,7 +273,10 @@ class CustomizableOperationGenerator( }; self.interceptors.into_iter().for_each(|interceptor| { - config_override.add_interceptor(interceptor); + config_override.push_interceptor(interceptor); + }); + self.runtime_plugins.into_iter().for_each(|plugin| { + config_override.push_runtime_plugin(plugin); }); (self.customizable_send)(config_override).await diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 6fe9978f78d..368d70ae433 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -543,6 +543,7 @@ class FluentClientGenerator( }), config_override: None, interceptors: vec![], + runtime_plugins: vec![], } } """, @@ -652,18 +653,30 @@ private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeTyp rustTemplate( """ pub(crate) fn base_client_runtime_plugins( - config: crate::Config, + mut config: crate::Config, ) -> #{RuntimePlugins} { - #{RuntimePlugins}::new() - .with_client_plugin(config.clone()) + let mut configured_plugins = #{Vec}::new(); + ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); + let mut plugins = #{RuntimePlugins}::new() + .with_client_plugin( + #{StaticRuntimePlugin}::new() + .with_config(config.config.clone()) + .with_runtime_components(config.runtime_components.clone()) + ) .with_client_plugin(crate::config::ServiceRuntimePlugin::new(config)) - .with_client_plugin(#{NoAuthRuntimePlugin}::new()) + .with_client_plugin(#{NoAuthRuntimePlugin}::new()); + for plugin in configured_plugins { + plugins = plugins.with_client_plugin(plugin); + } + plugins } """, *preludeScope, "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), "NoAuthRuntimePlugin" to RuntimeType.smithyRuntime(runtimeConfig) .resolve("client::auth::no_auth::NoAuthRuntimePlugin"), + "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::runtime_plugin::StaticRuntimePlugin"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt index 7e03e1ece5b..58a3a674381 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt @@ -42,7 +42,7 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext /// If a random token provider was configured, /// a newly-randomized token provider will be returned. pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { - self.inner.load::<#{IdempotencyTokenProvider}>().expect("the idempotency provider should be set").clone() + self.config.load::<#{IdempotencyTokenProvider}>().expect("the idempotency provider should be set").clone() } """, *codegenScope, @@ -85,7 +85,7 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext """ /// Sets the idempotency token provider to use for service calls that require tokens. pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { - self.inner.store_or_unset(idempotency_token_provider); + self.config.store_or_unset(idempotency_token_provider); self } """, @@ -108,7 +108,11 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext ServiceConfig.BuilderBuild -> writable { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - "layer.store_put(layer.load::<#{IdempotencyTokenProvider}>().cloned().unwrap_or_else(#{default_provider}));", + """ + if !resolver.is_set::<#{IdempotencyTokenProvider}>() { + resolver.config_mut().store_put(#{default_provider}()); + } + """, *codegenScope, ) } else { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index 148353269f4..f3cbe633af3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -29,7 +29,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section -import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.letIf @@ -101,11 +100,6 @@ sealed class ServiceConfig(name: String) : Section(name) { */ data class OperationConfigOverride(val cfg: String) : ServiceConfig("ToRuntimePlugin") - /** - * A section for appending additional runtime plugins, stored in [interceptorsField], to [interceptors] - */ - data class RuntimePluginInterceptors(val interceptors: String, val interceptorsField: String) : ServiceConfig("ToRuntimePluginInterceptors") - /** * A section for extra functionality that needs to be defined with the config module */ @@ -234,7 +228,7 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext rustTemplate( """ pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { - self.inner.store_or_unset(${param.name}.map(#{newtype})); + self.config.store_or_unset(${param.name}.map(#{newtype})); self } """, @@ -261,8 +255,6 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext } } - is ServiceConfig.OperationConfigOverride -> emptySection - else -> emptySection } } @@ -312,18 +304,20 @@ class ServiceConfigGenerator( } } - private val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) private val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) val codegenScope = arrayOf( + *preludeScope, "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), + "Cow" to RuntimeType.Cow, "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), "Layer" to smithyTypes.resolve("config_bag::Layer"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), - *preludeScope, + "Resolver" to RuntimeType.smithyRuntime(codegenContext.runtimeConfig).resolve("client::config_override::Resolver"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig), + "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), + "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(codegenContext.runtimeConfig), ) private val moduleUseName = codegenContext.moduleUseName() private val runtimeMode = codegenContext.smithyRuntimeMode @@ -334,10 +328,17 @@ class ServiceConfigGenerator( it.section(ServiceConfig.ConfigStructAdditionalDocs)(writer) } Attribute(Attribute.derive(RuntimeType.Clone)).render(writer) + if (runtimeMode.generateOrchestrator) { + Attribute(Attribute.derive(RuntimeType.Debug)).render(writer) + } writer.rustBlock("pub struct Config") { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - "inner: #{FrozenLayer},", + """ + pub(crate) config: #{FrozenLayer}, + pub(crate) runtime_components: #{RuntimeComponentsBuilder}, + pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + """, *codegenScope, ) } @@ -346,16 +347,18 @@ class ServiceConfigGenerator( } } - // Custom implementation for Debug so we don't need to enforce Debug down the chain - writer.rustBlock("impl std::fmt::Debug for Config") { - writer.rustTemplate( - """ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut config = f.debug_struct("Config"); - config.finish() - } - """, - ) + if (runtimeMode.defaultToMiddleware) { + // Custom implementation for Debug so we don't need to enforce Debug down the chain + writer.rustBlock("impl std::fmt::Debug for Config") { + writer.rustTemplate( + """ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut config = f.debug_struct("Config"); + config.finish() + } + """, + ) + } } writer.rustBlock("impl Config") { @@ -372,10 +375,17 @@ class ServiceConfigGenerator( writer.docs("Builder for creating a `Config`.") writer.raw("#[derive(Clone, Default)]") + if (runtimeMode.defaultToOrchestrator) { + Attribute(Attribute.derive(RuntimeType.Debug)).render(writer) + } writer.rustBlock("pub struct Builder") { if (runtimeMode.defaultToOrchestrator) { rustTemplate( - "inner: #{CloneableLayer},", + """ + pub(crate) config: #{CloneableLayer}, + pub(crate) runtime_components: #{RuntimeComponentsBuilder}, + pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + """, *codegenScope, ) } @@ -384,16 +394,18 @@ class ServiceConfigGenerator( } } - // Custom implementation for Debug so we don't need to enforce Debug down the chain - writer.rustBlock("impl std::fmt::Debug for Builder") { - writer.rustTemplate( - """ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut config = f.debug_struct("Builder"); - config.finish() - } - """, - ) + if (runtimeMode.defaultToMiddleware) { + // Custom implementation for Debug so we don't need to enforce Debug down the chain + writer.rustBlock("impl std::fmt::Debug for Builder") { + writer.rustTemplate( + """ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut config = f.debug_struct("Builder"); + config.finish() + } + """, + ) + } } writer.rustBlock("impl Builder") { @@ -403,6 +415,27 @@ class ServiceConfigGenerator( it.section(ServiceConfig.BuilderImpl)(this) } + if (runtimeMode.defaultToOrchestrator) { + rustTemplate( + """ + /// Adds a runtime plugin to the config. + ##[allow(unused)] + pub(crate) fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { + self.push_runtime_plugin(#{SharedRuntimePlugin}::new(plugin)); + self + } + + /// Adds a runtime plugin to the config. + ##[allow(unused)] + pub(crate) fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { + self.runtime_plugins.push(plugin); + self + } + """, + *codegenScope, + ) + } + val testUtilOnly = Attribute(Attribute.cfg(Attribute.any(Attribute.feature(TestUtilFeature.name), writable("test")))) @@ -427,16 +460,13 @@ class ServiceConfigGenerator( rustBlock("pub fn build(mut self) -> Config") { rustTemplate( """ - ##[allow(unused_imports)] - use #{ConfigBagAccessors}; // The builder is being turned into a service config. While doing so, we'd like to avoid // requiring that items created and stored _during_ the build method be `Clone`, since they // will soon be part of a `FrozenLayer` owned by the service config. So we will convert the // current `CloneableLayer` into a `Layer` that does not impose the `Clone` requirement. - let layer: #{Layer} = self - .inner - .into(); - let mut layer = layer.with_name("$moduleUseName::config::config"); + let mut layer = #{Layer}::from(self.config).with_name("$moduleUseName::config::Config"); + ##[allow(unused)] + let mut resolver = #{Resolver}::initial(&mut layer, &mut self.runtime_components); """, *codegenScope, ) @@ -447,7 +477,13 @@ class ServiceConfigGenerator( customizations.forEach { it.section(ServiceConfig.BuilderBuildExtras)(this) } - rust("inner: layer.freeze(),") + rust( + """ + config: layer.freeze(), + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, + """, + ) } } } else { @@ -464,26 +500,4 @@ class ServiceConfigGenerator( } } } - - fun renderRuntimePluginImplForSelf(writer: RustWriter) { - writer.rustTemplate( - """ - impl #{RuntimePlugin} for Config { - fn config(&self) -> #{Option}<#{FrozenLayer}> { - #{Some}(self.inner.clone()) - } - - fn interceptors(&self, _interceptors: &mut #{InterceptorRegistrar}) { - #{interceptors} - } - } - - """, - *codegenScope, - "config" to writable { writeCustomizations(customizations, ServiceConfig.OperationConfigOverride("cfg")) }, - "interceptors" to writable { - writeCustomizations(customizations, ServiceConfig.RuntimePluginInterceptors("_interceptors", "self")) - }, - ) - } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt index e449fe448cb..0f96cf3e0fe 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt @@ -41,7 +41,7 @@ fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): """ ##[allow(missing_docs)] pub fn $name(&self) -> u64 { - self.inner.load::<#{T}>().map(|u| u.0).unwrap() + self.config.load::<#{T}>().map(|u| u.0).unwrap() } """, "T" to configParamNewtype( @@ -71,7 +71,7 @@ fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): """ /// docs! pub fn $name(mut self, $name: u64) -> Self { - self.inner.store_put(#{T}($name)); + self.config.store_put(#{T}($name)); self } """, @@ -129,9 +129,6 @@ fun stubConfigProject(codegenContext: ClientCodegenContext, customization: Confi val generator = ServiceConfigGenerator(codegenContext, customizations = customizations.toList()) project.withModule(ClientRustModule.config) { generator.render(this) - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - generator.renderRuntimePluginImplForSelf(this) - } unitTest( "config_send_sync", """ diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index b827551bdd4..97d88c16805 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -48,6 +48,8 @@ class MetadataCustomizationTest { "Interceptor" to RuntimeType.interceptor(runtimeConfig), "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), "capture_request" to RuntimeType.captureRequest(runtimeConfig), + "RuntimeComponents" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::runtime_components::RuntimeComponents"), ) rustCrate.testModule { addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) @@ -64,6 +66,7 @@ class MetadataCustomizationTest { fn modify_before_signing( &self, _context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, + _runtime_components: &#{RuntimeComponents}, cfg: &mut #{ConfigBag}, ) -> #{Result}<(), #{BoxError}> { let metadata = cfg diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt index c467189c24a..94bd6524a1d 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt @@ -47,16 +47,14 @@ class ClientContextConfigCustomizationTest { use #{RuntimePlugin}; let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0.clone()) .unwrap(), "hello!" ); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0), Some(true) @@ -82,16 +80,14 @@ class ClientContextConfigCustomizationTest { use #{RuntimePlugin}; let conf = crate::Config::builder().a_string_param("hello!").build(); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0.clone()) .unwrap(), "hello!" ); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0), None, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 56cd00f0ee3..62fff162aac 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -15,7 +15,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError /** * End-to-end test of endpoint resolvers, attaching a real resolver to a fully generated service @@ -162,7 +162,7 @@ class EndpointsDecoratorTest { } } // the model has an intentionally failing test—ensure it fails - val failure = shouldThrow { "cargo test".runWithWarnings(testDir) } + val failure = shouldThrow { "cargo test".runWithWarnings(testDir) } failure.output shouldContain "endpoint::test::test_1" failure.output shouldContain "https://failingtest.com" "cargo clippy".runWithWarnings(testDir) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index b1ee6311a69..086a2119159 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -56,19 +56,20 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { tokioTest("test_operation_overrides_endpoint_resolver") { rustTemplate( """ - use #{ConfigBagAccessors}; use #{RuntimePlugin}; + use ::aws_smithy_runtime_api::client::orchestrator::EndpointResolver; let expected_url = "http://localhost:1234/"; let client_config = crate::config::Config::builder().build(); let config_override = crate::config::Config::builder().endpoint_resolver(expected_url); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), + let sut = crate::config::ConfigOverrideRuntimePlugin::new( config_override, - }; - let sut_layer = sut.config().unwrap(); - let endpoint_resolver = sut_layer.endpoint_resolver(); + client_config.config, + &client_config.runtime_components, + ); + let sut_components = sut.runtime_components(); + let endpoint_resolver = sut_components.endpoint_resolver().unwrap(); let endpoint = endpoint_resolver .resolve_endpoint(&#{EndpointResolverParams}::new(crate::config::endpoint::Params {})) .await @@ -186,6 +187,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { .resolve("client::request_attempts::RequestAttempts"), "RetryClassifiers" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::RetryClassifiers"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), "ShouldAttempt" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::ShouldAttempt"), @@ -195,46 +197,65 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { unitTest("test_operation_overrides_retry_strategy") { rustTemplate( """ - use #{ConfigBagAccessors}; use #{RuntimePlugin}; + use ::aws_smithy_runtime_api::client::retries::RetryStrategy; let client_config = crate::config::Config::builder() .retry_config(#{RetryConfig}::standard().with_max_attempts(3)) .build(); - let client_config_layer = client_config.config().unwrap(); - let mut ctx = #{InterceptorContext}::new(#{TypeErasedBox}::new(())); ctx.set_output_or_error(#{Err}(#{OrchestratorError}::other("doesn't matter"))); + let mut layer = #{Layer}::new("test"); layer.store_put(#{RequestAttempts}::new(1)); - layer.set_retry_classifiers( - #{RetryClassifiers}::new().with_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError)), - ); let mut cfg = #{ConfigBag}::of_layers(vec![layer]); + let client_config_layer = client_config.config; cfg.push_shared_layer(client_config_layer.clone()); - let retry = cfg.retry_strategy().unwrap(); + let retry_classifiers_component = #{RuntimeComponentsBuilder}::new("retry_classifier") + .with_retry_classifiers(#{Some}( + #{RetryClassifiers}::new().with_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError)), + )); + + // Emulate the merging of runtime components from runtime plugins that the orchestrator does + let runtime_components = #{RuntimeComponentsBuilder}::for_tests() + .merge_from(&client_config.runtime_components) + .merge_from(&retry_classifiers_component) + .build() + .unwrap(); + + let retry = runtime_components.retry_strategy(); assert!(matches!( - retry.should_attempt_retry(&ctx, &cfg).unwrap(), + retry.should_attempt_retry(&ctx, &runtime_components, &cfg).unwrap(), #{ShouldAttempt}::YesAfterDelay(_) )); // sets `max_attempts` to 1 implicitly by using `disabled()`, forcing it to run out of // attempts with respect to `RequestAttempts` set to 1 above - let config_override = crate::config::Config::builder() + let config_override_builder = crate::config::Config::builder() .retry_config(#{RetryConfig}::disabled()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config_layer, - config_override, - }; + let config_override = config_override_builder.clone().build(); + let sut = crate::config::ConfigOverrideRuntimePlugin::new( + config_override_builder, + client_config_layer, + &client_config.runtime_components, + ); let sut_layer = sut.config().unwrap(); cfg.push_shared_layer(sut_layer); - let retry = cfg.retry_strategy().unwrap(); + // Emulate the merging of runtime components from runtime plugins that the orchestrator does + let runtime_components = #{RuntimeComponentsBuilder}::for_tests() + .merge_from(&client_config.runtime_components) + .merge_from(&retry_classifiers_component) + .merge_from(&config_override.runtime_components) + .build() + .unwrap(); + + let retry = runtime_components.retry_strategy(); assert!(matches!( - retry.should_attempt_retry(&ctx, &cfg).unwrap(), + retry.should_attempt_retry(&ctx, &runtime_components, &cfg).unwrap(), #{ShouldAttempt}::No )); """, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index 646d6863e9b..b41cff293cd 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -106,7 +106,7 @@ internal class ServiceConfigGeneratorTest { """ ##[allow(missing_docs)] pub fn config_field(&self) -> u64 { - self.inner.load::<#{T}>().map(|u| u.0).unwrap() + self.config.load::<#{T}>().map(|u| u.0).unwrap() } """, "T" to configParamNewtype( @@ -137,7 +137,7 @@ internal class ServiceConfigGeneratorTest { """ ##[allow(missing_docs)] pub fn config_field(mut self, config_field: u64) -> Self { - self.inner.store_put(#{T}(config_field)); + self.config.store_put(#{T}(config_field)); self } """, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index c80ed9ba047..28ffe745616 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -31,7 +31,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGenerat import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.outputShape import java.nio.file.Path @@ -257,7 +257,7 @@ class ProtocolTestGeneratorTest { @Test fun `test incorrect response parsing`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there&required") @@ -273,7 +273,7 @@ class ProtocolTestGeneratorTest { @Test fun `test invalid body`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there&required") @@ -290,7 +290,7 @@ class ProtocolTestGeneratorTest { @Test fun `test invalid url parameter`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=INCORRECT&required") @@ -306,7 +306,7 @@ class ProtocolTestGeneratorTest { @Test fun `test forbidden url parameter`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?goodbye&Hi=Hello%20there&required") @@ -323,7 +323,7 @@ class ProtocolTestGeneratorTest { @Test fun `test required url parameter`() { // Hard coded implementation for this 1 test - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there") @@ -340,7 +340,7 @@ class ProtocolTestGeneratorTest { @Test fun `invalid header`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there&required") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index cbf2514157a..fbd4ed69dd0 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -338,8 +338,14 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag") fun configBagAccessors(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::config_bag_accessors::ConfigBagAccessors") + fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) = + smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponentsBuilder") fun runtimePlugins(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugins") + fun runtimePlugin(runtimeConfig: RuntimeConfig) = + smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") + fun sharedRuntimePlugin(runtimeConfig: RuntimeConfig) = + smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::SharedRuntimePlugin") fun boxError(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("box_error::BoxError") fun interceptor(runtimeConfig: RuntimeConfig): RuntimeType = @@ -468,8 +474,5 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun idempotencyToken(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.idempotencyToken(runtimeConfig)) - - fun runtimePlugin(runtimeConfig: RuntimeConfig) = - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index b40d5b8a062..2bf386a5196 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -32,7 +32,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.orNullIfEmpty @@ -389,7 +389,7 @@ fun RustWriter.compileAndTest( println("Test sources for debugging: file://${testModule.absolutePath}") } return testOutput - } catch (e: CommandFailed) { + } catch (e: CommandError) { if (!expectFailure) { println("Test sources for debugging: file://${testModule.absolutePath}") } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt index 7609e950a2c..f7a08f62f3f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt @@ -9,7 +9,7 @@ import java.io.IOException import java.nio.file.Path import java.util.concurrent.TimeUnit -data class CommandFailed(val output: String) : Exception("Command Failed\n$output") +data class CommandError(val output: String) : Exception("Command Error\n$output") fun String.runCommand(workdir: Path? = null, environment: Map = mapOf(), timeout: Long = 3600): String { val parts = this.split("\\s".toRegex()) @@ -30,13 +30,13 @@ fun String.runCommand(workdir: Path? = null, environment: Map = val output = "$stdErr\n$stdOut" return when (proc.exitValue()) { 0 -> output - else -> throw CommandFailed("Command Failed\n$output") + else -> throw CommandError("Command Error\n$output") } } catch (_: IllegalThreadStateException) { - throw CommandFailed("Timeout") + throw CommandError("Timeout") } catch (err: IOException) { - throw CommandFailed("$this was not a valid command.\n Hint: is everything installed?\n$err") + throw CommandError("$this was not a valid command.\n Hint: is everything installed?\n$err") } catch (other: Exception) { - throw CommandFailed("Unexpected exception thrown when executing subprocess:\n$other") + throw CommandError("Unexpected exception thrown when executing subprocess:\n$other") } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt index 1dfc41795df..d204a605c43 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt @@ -17,7 +17,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.lookup class RecursiveShapesIntegrationTest { @@ -61,7 +61,7 @@ class RecursiveShapesIntegrationTest { project } val unmodifiedProject = check(model) - val output = assertThrows { + val output = assertThrows { unmodifiedProject.compileAndTest(expectFailure = true) } // THIS IS A LOAD-BEARING shouldContain! If the compiler error changes then this will break! diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt index aab2b706130..5041166fb70 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test internal class ExecKtTest { @Test fun `missing command throws CommandFailed`() { - shouldThrow { + shouldThrow { "notaprogram run".runCommand() } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index 0c6d27f564b..156cc455eb2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -45,7 +45,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGenerat import software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember import software.amazon.smithy.rust.codegen.core.util.hasTrait @@ -266,7 +266,7 @@ open class ServerCodegenVisitor( fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong(), ) - } catch (err: CommandFailed) { + } catch (err: CommandError) { logger.info( "[rust-server-codegen] Failed to run cargo fmt: [${service.id}]\n${err.output}", ) diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt index eb0ba5ed342..5e2f828e1b4 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt @@ -20,7 +20,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.lookup import software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule import software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator @@ -237,7 +237,7 @@ class ConstrainedStringGeneratorTest { ).render() } - assertThrows { + assertThrows { project.compileAndTest() } } diff --git a/rust-runtime/aws-smithy-async/Cargo.toml b/rust-runtime/aws-smithy-async/Cargo.toml index ca703aaf654..c95862d9ffc 100644 --- a/rust-runtime/aws-smithy-async/Cargo.toml +++ b/rust-runtime/aws-smithy-async/Cargo.toml @@ -12,7 +12,6 @@ rt-tokio = ["tokio/time"] test-util = [] [dependencies] -aws-smithy-types = { path = "../aws-smithy-types" } pin-project-lite = "0.2" tokio = { version = "1.23.1", features = ["sync"] } tokio-stream = { version = "0.1.5", default-features = false } diff --git a/rust-runtime/aws-smithy-async/src/rt/sleep.rs b/rust-runtime/aws-smithy-async/src/rt/sleep.rs index 6776790ee0a..076db95c971 100644 --- a/rust-runtime/aws-smithy-async/src/rt/sleep.rs +++ b/rust-runtime/aws-smithy-async/src/rt/sleep.rs @@ -6,7 +6,6 @@ //! Provides an [`AsyncSleep`] trait that returns a future that sleeps for a given duration, //! and implementations of `AsyncSleep` for different async runtimes. -use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::fmt::{Debug, Formatter}; use std::future::Future; use std::pin::Pin; @@ -69,10 +68,6 @@ impl AsyncSleep for SharedAsyncSleep { } } -impl Storable for SharedAsyncSleep { - type Storer = StoreReplace; -} - #[cfg(feature = "rt-tokio")] /// Returns a default sleep implementation based on the features enabled pub fn default_async_sleep() -> Option { diff --git a/rust-runtime/aws-smithy-async/src/time.rs b/rust-runtime/aws-smithy-async/src/time.rs index 0b43a0af741..2abe332c881 100644 --- a/rust-runtime/aws-smithy-async/src/time.rs +++ b/rust-runtime/aws-smithy-async/src/time.rs @@ -4,7 +4,6 @@ */ //! Time source abstraction to support WASM and testing -use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::fmt::Debug; use std::sync::Arc; use std::time::SystemTime; @@ -87,7 +86,3 @@ impl TimeSource for SharedTimeSource { self.0.now() } } - -impl Storable for SharedTimeSource { - type Storer = StoreReplace; -} diff --git a/rust-runtime/aws-smithy-client/external-types.toml b/rust-runtime/aws-smithy-client/external-types.toml index 0ca50284169..74daaad215d 100644 --- a/rust-runtime/aws-smithy-client/external-types.toml +++ b/rust-runtime/aws-smithy-client/external-types.toml @@ -23,7 +23,7 @@ allowed_external_types = [ "tokio::io::async_write::AsyncWrite", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-utils` feature + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature "bytes::bytes::Bytes", "serde::ser::Serialize", "serde::de::Deserialize", diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index cdcfb847a5e..106cc5087c3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +pub mod runtime_components; + /// Client orchestrator configuration accessors for the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). pub mod config_bag_accessors; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index 517e5a47e0a..5241f5187cc 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -4,9 +4,10 @@ */ use crate::box_error::BoxError; -use crate::client::identity::{Identity, IdentityResolvers, SharedIdentityResolver}; +use crate::client::identity::{Identity, SharedIdentityResolver}; use crate::client::orchestrator::HttpRequest; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreAppend, StoreReplace}; +use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; use aws_smithy_types::Document; use std::borrow::Cow; @@ -66,20 +67,16 @@ pub trait AuthOptionResolver: Send + Sync + fmt::Debug { ) -> Result, BoxError>; } -#[derive(Debug)] -pub struct DynAuthOptionResolver(Box); +#[derive(Clone, Debug)] +pub struct SharedAuthOptionResolver(Arc); -impl DynAuthOptionResolver { +impl SharedAuthOptionResolver { pub fn new(auth_option_resolver: impl AuthOptionResolver + 'static) -> Self { - Self(Box::new(auth_option_resolver)) + Self(Arc::new(auth_option_resolver)) } } -impl Storable for DynAuthOptionResolver { - type Storer = StoreReplace; -} - -impl AuthOptionResolver for DynAuthOptionResolver { +impl AuthOptionResolver for SharedAuthOptionResolver { fn resolve_auth_options( &self, params: &AuthOptionResolverParams, @@ -93,7 +90,7 @@ pub trait HttpAuthScheme: Send + Sync + fmt::Debug { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option; fn request_signer(&self) -> &dyn HttpRequestSigner; @@ -117,7 +114,7 @@ impl HttpAuthScheme for SharedHttpAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { self.0.identity_resolver(identity_resolvers) } @@ -127,10 +124,6 @@ impl HttpAuthScheme for SharedHttpAuthScheme { } } -impl Storable for SharedHttpAuthScheme { - type Storer = StoreAppend; -} - pub trait HttpRequestSigner: Send + Sync + fmt::Debug { /// Return a signed version of the given request using the given identity. /// @@ -140,6 +133,7 @@ pub trait HttpRequestSigner: Send + Sync + fmt::Debug { request: &mut HttpRequest, identity: &Identity, auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, config_bag: &ConfigBag, ) -> Result<(), BoxError>; } @@ -166,52 +160,3 @@ impl<'a> AuthSchemeEndpointConfig<'a> { self.0 } } - -#[cfg(test)] -mod tests { - use super::*; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; - - #[test] - fn test_shared_http_auth_scheme_configuration() { - #[derive(Debug)] - struct TestHttpAuthScheme(&'static str); - impl HttpAuthScheme for TestHttpAuthScheme { - fn scheme_id(&self) -> AuthSchemeId { - AuthSchemeId::new(self.0) - } - - fn identity_resolver(&self, _: &IdentityResolvers) -> Option { - unreachable!("this shouldn't get called in this test") - } - - fn request_signer(&self) -> &dyn HttpRequestSigner { - unreachable!("this shouldn't get called in this test") - } - } - - let mut config_bag = ConfigBag::base(); - - let mut layer = Layer::new("first"); - layer.store_append(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_1"))); - config_bag.push_layer(layer); - - let mut layer = Layer::new("second"); - layer.store_append(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_2"))); - layer.store_append(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_3"))); - config_bag.push_layer(layer); - - let auth_schemes = config_bag.load::(); - let encountered_scheme_ids: Vec = - auth_schemes.map(|s| s.scheme_id()).collect(); - - assert_eq!( - vec![ - AuthSchemeId::new("scheme_3"), - AuthSchemeId::new("scheme_2"), - AuthSchemeId::new("scheme_1") - ], - encountered_scheme_ids - ); - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs index 54832acf808..5f338cd93f9 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs @@ -3,23 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::client::auth::{ - AuthOptionResolver, AuthOptionResolverParams, AuthSchemeId, DynAuthOptionResolver, - SharedHttpAuthScheme, -}; -use crate::client::connectors::{Connector, DynConnector}; -use crate::client::identity::{ - ConfiguredIdentityResolver, IdentityResolvers, SharedIdentityResolver, -}; +use crate::client::auth::AuthOptionResolverParams; use crate::client::orchestrator::{ - DynEndpointResolver, DynResponseDeserializer, EndpointResolver, EndpointResolverParams, - LoadedRequestBody, ResponseDeserializer, SharedRequestSerializer, NOT_NEEDED, + DynResponseDeserializer, EndpointResolverParams, LoadedRequestBody, ResponseDeserializer, + SharedRequestSerializer, NOT_NEEDED, }; -use crate::client::retries::{DynRetryStrategy, RetryClassifiers, RetryStrategy}; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_types::config_bag::{AppendItemIter, CloneableLayer, ConfigBag, FrozenLayer, Layer}; -use std::fmt::Debug; +use aws_smithy_types::config_bag::{CloneableLayer, ConfigBag, FrozenLayer, Layer}; // Place traits in a private module so that they can be used in the public API without being a part of the public API. mod internal { @@ -60,51 +49,6 @@ mod internal { } } - pub trait CloneableSettable { - fn store_put(&mut self, value: T) - where - T: Storable> + Clone; - - fn store_append(&mut self, item: T) - where - T: Storable> + Clone; - } - - impl CloneableSettable for S - where - S: Settable, - { - fn store_put(&mut self, value: T) - where - T: Storable> + Clone, - { - Settable::store_put(self, value); - } - - fn store_append(&mut self, item: T) - where - T: Storable> + Clone, - { - Settable::store_append(self, item); - } - } - - impl CloneableSettable for CloneableLayer { - fn store_put(&mut self, value: T) - where - T: Storable> + Clone, - { - CloneableLayer::store_put(self, value); - } - - fn store_append(&mut self, item: T) - where - T: Storable> + Clone, - { - CloneableLayer::store_append(self, item); - } - } - pub trait Gettable { fn load(&self) -> ::ReturnedType<'_>; } @@ -134,7 +78,7 @@ mod internal { } } -use internal::{CloneableSettable, Gettable, Settable}; +use internal::{Gettable, Settable}; pub trait ConfigBagAccessors { fn auth_option_resolver_params(&self) -> &AuthOptionResolverParams @@ -153,21 +97,6 @@ pub trait ConfigBagAccessors { self.store_put::(auth_option_resolver_params); } - fn auth_option_resolver(&self) -> &dyn AuthOptionResolver - where - Self: Gettable, - { - self.load::() - .expect("an auth option resolver must be set") - } - - fn set_auth_option_resolver(&mut self, auth_option_resolver: DynAuthOptionResolver) - where - Self: Settable, - { - self.store_put::(auth_option_resolver); - } - fn endpoint_resolver_params(&self) -> &EndpointResolverParams where Self: Gettable, @@ -183,73 +112,6 @@ pub trait ConfigBagAccessors { self.store_put::(endpoint_resolver_params); } - fn endpoint_resolver(&self) -> &dyn EndpointResolver - where - Self: Gettable, - { - self.load::() - .expect("an endpoint resolver must be set") - } - - fn set_endpoint_resolver(&mut self, endpoint_resolver: DynEndpointResolver) - where - Self: Settable, - { - self.store_put::(endpoint_resolver); - } - - /// Returns the configured identity resolvers. - fn identity_resolvers(&self) -> IdentityResolvers - where - Self: Gettable, - { - IdentityResolvers::new(self.load::()) - } - - /// Adds an identity resolver to the config. - fn push_identity_resolver( - &mut self, - auth_scheme_id: AuthSchemeId, - identity_resolver: SharedIdentityResolver, - ) where - Self: CloneableSettable, - { - self.store_append::(ConfiguredIdentityResolver::new( - auth_scheme_id, - identity_resolver, - )); - } - - fn connector(&self) -> &dyn Connector - where - Self: Gettable, - { - self.load::().expect("missing connector") - } - - fn set_connector(&mut self, connection: DynConnector) - where - Self: Settable, - { - self.store_put::(connection); - } - - /// Returns the configured HTTP auth schemes. - fn http_auth_schemes(&self) -> HttpAuthSchemes<'_> - where - Self: Gettable, - { - HttpAuthSchemes::new(self.load::()) - } - - /// Adds a HTTP auth scheme to the config. - fn push_http_auth_scheme(&mut self, auth_scheme: SharedHttpAuthScheme) - where - Self: Settable, - { - self.store_append::(auth_scheme); - } - fn request_serializer(&self) -> SharedRequestSerializer where Self: Gettable, @@ -279,63 +141,6 @@ pub trait ConfigBagAccessors { self.store_put::(response_deserializer); } - fn retry_classifiers(&self) -> &RetryClassifiers - where - Self: Gettable, - { - self.load::() - .expect("retry classifiers must be set") - } - fn set_retry_classifiers(&mut self, retry_classifiers: RetryClassifiers) - where - Self: Settable, - { - self.store_put::(retry_classifiers); - } - - fn retry_strategy(&self) -> Option<&dyn RetryStrategy> - where - Self: Gettable, - { - self.load::().map(|rs| rs as _) - } - fn set_retry_strategy(&mut self, retry_strategy: DynRetryStrategy) - where - Self: Settable, - { - self.store_put::(retry_strategy); - } - - fn request_time(&self) -> Option - where - Self: Gettable, - { - self.load::().cloned() - } - fn set_request_time(&mut self, time_source: impl TimeSource + 'static) - where - Self: Settable, - { - self.store_put::(SharedTimeSource::new(time_source)); - } - - fn sleep_impl(&self) -> Option - where - Self: Gettable, - { - self.load::().cloned() - } - fn set_sleep_impl(&mut self, async_sleep: Option) - where - Self: Settable, - { - if let Some(sleep_impl) = async_sleep { - self.store_put::(sleep_impl); - } else { - self.unset::(); - } - } - fn loaded_request_body(&self) -> &LoadedRequestBody where Self: Gettable, @@ -354,90 +159,3 @@ impl ConfigBagAccessors for ConfigBag {} impl ConfigBagAccessors for FrozenLayer {} impl ConfigBagAccessors for CloneableLayer {} impl ConfigBagAccessors for Layer {} - -/// Accessor for HTTP auth schemes. -#[derive(Debug)] -pub struct HttpAuthSchemes<'a> { - inner: AppendItemIter<'a, SharedHttpAuthScheme>, -} - -impl<'a> HttpAuthSchemes<'a> { - pub(crate) fn new(inner: AppendItemIter<'a, SharedHttpAuthScheme>) -> Self { - Self { inner } - } - - /// Returns the HTTP auth scheme with the given ID, if there is one. - pub fn scheme(mut self, scheme_id: AuthSchemeId) -> Option { - use crate::client::auth::HttpAuthScheme; - self.inner - .find(|&scheme| scheme.scheme_id() == scheme_id) - .cloned() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::client::auth::{HttpAuthScheme, HttpRequestSigner}; - use crate::client::config_bag_accessors::ConfigBagAccessors; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; - - #[test] - fn test_shared_http_auth_scheme_configuration() { - #[derive(Debug)] - struct TestHttpAuthScheme(&'static str); - impl HttpAuthScheme for TestHttpAuthScheme { - fn scheme_id(&self) -> AuthSchemeId { - AuthSchemeId::new(self.0) - } - - fn identity_resolver(&self, _: &IdentityResolvers) -> Option { - unreachable!("this shouldn't get called in this test") - } - - fn request_signer(&self) -> &dyn HttpRequestSigner { - unreachable!("this shouldn't get called in this test") - } - } - - let mut config_bag = ConfigBag::base(); - - let mut layer = Layer::new("first"); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_1"))); - config_bag.push_layer(layer); - - let mut layer = Layer::new("second"); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_2"))); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_3"))); - config_bag.push_layer(layer); - - assert!(config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("does-not-exist")) - .is_none()); - assert_eq!( - AuthSchemeId::new("scheme_1"), - config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("scheme_1")) - .unwrap() - .scheme_id() - ); - assert_eq!( - AuthSchemeId::new("scheme_2"), - config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("scheme_2")) - .unwrap() - .scheme_id() - ); - assert_eq!( - AuthSchemeId::new("scheme_3"), - config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("scheme_3")) - .unwrap() - .scheme_id() - ); - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs index fd63eea38c9..a7d10a2daeb 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs @@ -4,28 +4,24 @@ */ use crate::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::fmt; +use std::sync::Arc; pub trait Connector: Send + Sync + fmt::Debug { fn call(&self, request: HttpRequest) -> BoxFuture; } -#[derive(Debug)] -pub struct DynConnector(Box); +#[derive(Clone, Debug)] +pub struct SharedConnector(Arc); -impl DynConnector { +impl SharedConnector { pub fn new(connection: impl Connector + 'static) -> Self { - Self(Box::new(connection)) + Self(Arc::new(connection)) } } -impl Connector for DynConnector { +impl Connector for SharedConnector { fn call(&self, request: HttpRequest) -> BoxFuture { (*self.0).call(request) } } - -impl Storable for DynConnector { - type Storer = StoreReplace; -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index a8ab993960e..60a110fbb97 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -5,7 +5,7 @@ use crate::client::auth::AuthSchemeId; use crate::client::orchestrator::Future; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreAppend, StoreReplace}; +use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; use std::fmt; use std::fmt::Debug; @@ -67,36 +67,6 @@ impl ConfiguredIdentityResolver { } } -impl Storable for ConfiguredIdentityResolver { - type Storer = StoreAppend; -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityResolvers { - identity_resolvers: Vec, -} - -impl Storable for IdentityResolvers { - type Storer = StoreReplace; -} - -impl IdentityResolvers { - pub(crate) fn new<'a>(resolvers: impl Iterator) -> Self { - let identity_resolvers: Vec<_> = resolvers.cloned().collect(); - if identity_resolvers.is_empty() { - tracing::warn!("no identity resolvers available for this request"); - } - Self { identity_resolvers } - } - - pub fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option { - self.identity_resolvers - .iter() - .find(|pair| pair.scheme_id() == scheme_id) - .map(|pair| pair.identity_resolver()) - } -} - #[derive(Clone)] pub struct Identity { data: Arc, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 5d93c645660..5bf1ade4b10 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -11,7 +11,8 @@ use crate::client::interceptors::context::{ BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, InterceptorContext, }; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreAppend, StoreReplace}; +use crate::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::error::display::DisplayErrorContext; use context::{Error, Input, Output}; use std::fmt; @@ -27,16 +28,28 @@ pub use error::InterceptorError; macro_rules! interceptor_trait_fn { ($name:ident, $phase:ident, $docs:tt) => { #[doc = $docs] - fn $name(&self, context: &$phase<'_>, cfg: &mut ConfigBag) -> Result<(), BoxError> { + fn $name( + &self, + context: &$phase<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { let _ctx = context; + let _rc = runtime_components; let _cfg = cfg; Ok(()) } }; (mut $name:ident, $phase:ident, $docs:tt) => { #[doc = $docs] - fn $name(&self, context: &mut $phase<'_>, cfg: &mut ConfigBag) -> Result<(), BoxError> { + fn $name( + &self, + context: &mut $phase<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { let _ctx = context; + let _rc = runtime_components; let _cfg = cfg; Ok(()) } @@ -54,29 +67,32 @@ macro_rules! interceptor_trait_fn { /// to read in-flight request or response messages, or "read/write" hooks, which make it possible /// to modify in-flight request or output messages. pub trait Interceptor: fmt::Debug { - interceptor_trait_fn!( - read_before_execution, - BeforeSerializationInterceptorContextRef, - " - A hook called at the start of an execution, before the SDK - does anything else. - - **When:** This will **ALWAYS** be called once per execution. The duration - between invocation of this hook and `after_execution` is very close - to full duration of the execution. - - **Available Information:** The [InterceptorContext::input()] is - **ALWAYS** available. Other information **WILL NOT** be available. - - **Error Behavior:** Errors raised by this hook will be stored - until all interceptors have had their `before_execution` invoked. - Other hooks will then be skipped and execution will jump to - `modify_before_completion` with the raised error as the - [InterceptorContext::output_or_error()]. If multiple - `before_execution` methods raise errors, the latest - will be used and earlier ones will be logged and dropped. - " - ); + /// A hook called at the start of an execution, before the SDK + /// does anything else. + /// + /// **When:** This will **ALWAYS** be called once per execution. The duration + /// between invocation of this hook and `after_execution` is very close + /// to full duration of the execution. + /// + /// **Available Information:** The [InterceptorContext::input()] is + /// **ALWAYS** available. Other information **WILL NOT** be available. + /// + /// **Error Behavior:** Errors raised by this hook will be stored + /// until all interceptors have had their `before_execution` invoked. + /// Other hooks will then be skipped and execution will jump to + /// `modify_before_completion` with the raised error as the + /// [InterceptorContext::output_or_error()]. If multiple + /// `before_execution` methods raise errors, the latest + /// will be used and earlier ones will be logged and dropped. + fn read_before_execution( + &self, + context: &BeforeSerializationInterceptorContextRef<'_>, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let _ctx = context; + let _cfg = cfg; + Ok(()) + } interceptor_trait_fn!( mut modify_before_serialization, @@ -96,7 +112,6 @@ pub trait Interceptor: fmt::Debug { later hooks. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, - execution will jump to `modify_before_completion` with the raised error as the [InterceptorContext::output_or_error()]. @@ -478,9 +493,11 @@ pub trait Interceptor: fmt::Debug { fn modify_before_attempt_completion( &self, context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let _ctx = context; + let _rc = runtime_components; let _cfg = cfg; Ok(()) } @@ -510,9 +527,11 @@ pub trait Interceptor: fmt::Debug { fn read_after_attempt( &self, context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let _ctx = context; + let _rc = runtime_components; let _cfg = cfg; Ok(()) } @@ -540,9 +559,11 @@ pub trait Interceptor: fmt::Debug { fn modify_before_completion( &self, context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let _ctx = context; + let _rc = runtime_components; let _cfg = cfg; Ok(()) } @@ -568,9 +589,11 @@ pub trait Interceptor: fmt::Debug { fn read_after_execution( &self, context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let _ctx = context; + let _rc = runtime_components; let _cfg = cfg; Ok(()) } @@ -607,18 +630,6 @@ impl SharedInterceptor { } } -/// A interceptor wrapper to conditionally enable the interceptor based on [`DisableInterceptor`] -struct ConditionallyEnabledInterceptor<'a>(&'a SharedInterceptor); -impl ConditionallyEnabledInterceptor<'_> { - fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { - if self.0.enabled(cfg) { - Some(self.0.as_ref()) - } else { - None - } - } -} - impl AsRef for SharedInterceptor { fn as_ref(&self) -> &(dyn Interceptor + 'static) { self.interceptor.as_ref() @@ -632,45 +643,29 @@ impl Deref for SharedInterceptor { } } -impl Storable for SharedInterceptor { - type Storer = StoreAppend; -} - -/// Collection of [`SharedInterceptor`] that allows for only registration -#[derive(Debug, Clone, Default)] -pub struct InterceptorRegistrar { - interceptors: Vec, -} - -impl InterceptorRegistrar { - /// Register an interceptor with this `InterceptorRegistrar`. - /// - /// When this `InterceptorRegistrar` is passed to an orchestrator, the orchestrator will run the - /// registered interceptor for all the "hooks" that it implements. - pub fn register(&mut self, interceptor: SharedInterceptor) { - self.interceptors.push(interceptor); - } -} - -impl Extend for InterceptorRegistrar { - fn extend>(&mut self, iter: T) { - for interceptor in iter { - self.register(interceptor); +/// A interceptor wrapper to conditionally enable the interceptor based on [`DisableInterceptor`] +struct ConditionallyEnabledInterceptor(SharedInterceptor); +impl ConditionallyEnabledInterceptor { + fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { + if self.0.enabled(cfg) { + Some(self.0.as_ref()) + } else { + None } } } -#[derive(Debug, Clone, Default)] -pub struct Interceptors { - client_interceptors: InterceptorRegistrar, - operation_interceptors: InterceptorRegistrar, +#[derive(Debug)] +pub struct Interceptors { + interceptors: I, } macro_rules! interceptor_impl_fn { (mut $interceptor:ident) => { pub fn $interceptor( - &self, + self, ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!(concat!( @@ -680,9 +675,11 @@ macro_rules! interceptor_impl_fn { )); let mut result: Result<(), BoxError> = Ok(()); let mut ctx = ctx.into(); - for interceptor in self.interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.$interceptor(&mut ctx, cfg) { + if let Err(new_error) = + interceptor.$interceptor(&mut ctx, runtime_components, cfg) + { if let Err(last_error) = result { tracing::debug!("{}", DisplayErrorContext(&*last_error)); } @@ -695,15 +692,17 @@ macro_rules! interceptor_impl_fn { }; (ref $interceptor:ident) => { pub fn $interceptor( - &self, + self, ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { let mut result: Result<(), BoxError> = Ok(()); let ctx = ctx.into(); - for interceptor in self.interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.$interceptor(&ctx, cfg) { + if let Err(new_error) = interceptor.$interceptor(&ctx, runtime_components, cfg) + { if let Err(last_error) = result { tracing::debug!("{}", DisplayErrorContext(&*last_error)); } @@ -742,68 +741,31 @@ pub fn disable_interceptor(cause: &'static str) -> DisableInterc } } -impl Interceptors { - pub fn new() -> Self { - Self::default() - } - - fn interceptors(&self) -> impl Iterator> { - self.client_interceptors() - .chain(self.operation_interceptors()) - } - - fn client_interceptors(&self) -> impl Iterator> { - self.client_interceptors - .interceptors - .iter() - .map(ConditionallyEnabledInterceptor) - } - - fn operation_interceptors(&self) -> impl Iterator> { - self.operation_interceptors - .interceptors - .iter() - .map(ConditionallyEnabledInterceptor) - } - - pub fn client_interceptors_mut(&mut self) -> &mut InterceptorRegistrar { - &mut self.client_interceptors +impl Interceptors +where + I: Iterator, +{ + pub fn new(interceptors: I) -> Self { + Self { interceptors } } - pub fn operation_interceptors_mut(&mut self) -> &mut InterceptorRegistrar { - &mut self.operation_interceptors + fn into_iter(self) -> impl Iterator { + self.interceptors.map(ConditionallyEnabledInterceptor) } - pub fn client_read_before_execution( - &self, + pub fn read_before_execution( + self, + operation: bool, ctx: &InterceptorContext, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { - tracing::trace!("running `client_read_before_execution` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.client_interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_before_execution) - } - - pub fn operation_read_before_execution( - &self, - ctx: &InterceptorContext, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `operation_read_before_execution` interceptors"); + tracing::trace!( + "running {} `read_before_execution` interceptors", + if operation { "operation" } else { "client" } + ); let mut result: Result<(), BoxError> = Ok(()); let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.operation_interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { if let Err(last_error) = result { @@ -832,16 +794,18 @@ impl Interceptors { interceptor_impl_fn!(ref read_after_deserialization); pub fn modify_before_attempt_completion( - &self, + self, ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `modify_before_attempt_completion` interceptors"); let mut result: Result<(), BoxError> = Ok(()); let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); - for interceptor in self.interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.modify_before_attempt_completion(&mut ctx, cfg) + if let Err(new_error) = + interceptor.modify_before_attempt_completion(&mut ctx, runtime_components, cfg) { if let Err(last_error) = result { tracing::debug!("{}", DisplayErrorContext(&*last_error)); @@ -854,16 +818,19 @@ impl Interceptors { } pub fn read_after_attempt( - &self, + self, ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `read_after_attempt` interceptors"); let mut result: Result<(), BoxError> = Ok(()); let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_after_attempt(&ctx, cfg) { + if let Err(new_error) = + interceptor.read_after_attempt(&ctx, runtime_components, cfg) + { if let Err(last_error) = result { tracing::debug!("{}", DisplayErrorContext(&*last_error)); } @@ -875,16 +842,19 @@ impl Interceptors { } pub fn modify_before_completion( - &self, + self, ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `modify_before_completion` interceptors"); let mut result: Result<(), BoxError> = Ok(()); let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); - for interceptor in self.interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.modify_before_completion(&mut ctx, cfg) { + if let Err(new_error) = + interceptor.modify_before_completion(&mut ctx, runtime_components, cfg) + { if let Err(last_error) = result { tracing::debug!("{}", DisplayErrorContext(&*last_error)); } @@ -896,16 +866,19 @@ impl Interceptors { } pub fn read_after_execution( - &self, + self, ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `read_after_execution` interceptors"); let mut result: Result<(), BoxError> = Ok(()); let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.interceptors() { + for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_after_execution(&ctx, cfg) { + if let Err(new_error) = + interceptor.read_after_execution(&ctx, runtime_components, cfg) + { if let Err(last_error) = result { tracing::debug!("{}", DisplayErrorContext(&*last_error)); } @@ -917,35 +890,20 @@ impl Interceptors { } } -#[cfg(test)] +#[cfg(all(test, feature = "test-util"))] mod tests { use crate::client::interceptors::context::Input; use crate::client::interceptors::{ disable_interceptor, BeforeTransmitInterceptorContextRef, BoxError, Interceptor, - InterceptorContext, InterceptorRegistrar, Interceptors, SharedInterceptor, + InterceptorContext, Interceptors, SharedInterceptor, }; + use crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder}; use aws_smithy_types::config_bag::ConfigBag; #[derive(Debug)] struct TestInterceptor; impl Interceptor for TestInterceptor {} - #[test] - fn register_interceptor() { - let mut registrar = InterceptorRegistrar::default(); - registrar.register(SharedInterceptor::new(TestInterceptor)); - assert_eq!(1, registrar.interceptors.len()); - } - - #[test] - fn bulk_register_interceptors() { - let mut registrar = InterceptorRegistrar::default(); - let number_of_interceptors = 3; - let interceptors = vec![SharedInterceptor::new(TestInterceptor); number_of_interceptors]; - registrar.extend(interceptors); - assert_eq!(number_of_interceptors, registrar.interceptors.len()); - } - #[test] fn test_disable_interceptors() { #[derive(Debug)] @@ -954,42 +912,43 @@ mod tests { fn read_before_transmit( &self, _context: &BeforeTransmitInterceptorContextRef<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { Err("boom".into()) } } - let mut interceptors = Interceptors::new(); - let interceptors_vec = vec![ - SharedInterceptor::new(PanicInterceptor), - SharedInterceptor::new(TestInterceptor), - ]; - interceptors - .client_interceptors_mut() - .extend(interceptors_vec); + let rc = RuntimeComponentsBuilder::for_tests() + .with_interceptor(SharedInterceptor::new(PanicInterceptor)) + .with_interceptor(SharedInterceptor::new(TestInterceptor)) + .build() + .unwrap(); + let mut cfg = ConfigBag::base(); + let interceptors = Interceptors::new(rc.interceptors()); assert_eq!( interceptors - .interceptors() + .into_iter() .filter(|i| i.if_enabled(&cfg).is_some()) .count(), 2 ); - interceptors - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &mut cfg) + + Interceptors::new(rc.interceptors()) + .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) .expect_err("interceptor returns error"); cfg.interceptor_state() .store_put(disable_interceptor::("test")); assert_eq!( - interceptors - .interceptors() + Interceptors::new(rc.interceptors()) + .into_iter() .filter(|i| i.if_enabled(&cfg).is_some()) .count(), 1 ); // shouldn't error because interceptors won't run - interceptors - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &mut cfg) + Interceptors::new(rc.interceptors()) + .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) .expect("interceptor is now disabled"); } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 9384509900f..ed68be978d6 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -114,25 +114,21 @@ pub trait EndpointResolver: Send + Sync + fmt::Debug { fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future; } -#[derive(Debug)] -pub struct DynEndpointResolver(Box); +#[derive(Clone, Debug)] +pub struct SharedEndpointResolver(Arc); -impl DynEndpointResolver { +impl SharedEndpointResolver { pub fn new(endpoint_resolver: impl EndpointResolver + 'static) -> Self { - Self(Box::new(endpoint_resolver)) + Self(Arc::new(endpoint_resolver)) } } -impl EndpointResolver for DynEndpointResolver { +impl EndpointResolver for SharedEndpointResolver { fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { self.0.resolve_endpoint(params) } } -impl Storable for DynEndpointResolver { - type Storer = StoreReplace; -} - /// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. /// /// This enum gets placed into the `ConfigBag` to change the orchestrator behavior. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs index 1e1ea497e3d..37aa72d9ce3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs @@ -4,7 +4,7 @@ */ use crate::client::interceptors::context::InterceptorContext; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use aws_smithy_types::config_bag::ConfigBag; use std::fmt::Debug; use std::time::Duration; use tracing::trace; @@ -30,42 +30,50 @@ impl ShouldAttempt { } pub trait RetryStrategy: Send + Sync + Debug { - fn should_attempt_initial_request(&self, cfg: &ConfigBag) -> Result; + fn should_attempt_initial_request( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result; fn should_attempt_retry( &self, context: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result; } -#[derive(Debug)] -pub struct DynRetryStrategy(Box); +#[derive(Clone, Debug)] +pub struct SharedRetryStrategy(Arc); -impl DynRetryStrategy { +impl SharedRetryStrategy { pub fn new(retry_strategy: impl RetryStrategy + 'static) -> Self { - Self(Box::new(retry_strategy)) + Self(Arc::new(retry_strategy)) } } -impl RetryStrategy for DynRetryStrategy { - fn should_attempt_initial_request(&self, cfg: &ConfigBag) -> Result { - self.0.should_attempt_initial_request(cfg) +impl RetryStrategy for SharedRetryStrategy { + fn should_attempt_initial_request( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result { + self.0 + .should_attempt_initial_request(runtime_components, cfg) } fn should_attempt_retry( &self, context: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { - self.0.should_attempt_retry(context, cfg) + self.0 + .should_attempt_retry(context, runtime_components, cfg) } } -impl Storable for DynRetryStrategy { - type Storer = StoreReplace; -} - #[non_exhaustive] #[derive(Clone, Eq, PartialEq, Debug)] pub enum RetryReason { @@ -83,9 +91,9 @@ pub trait ClassifyRetry: Send + Sync + Debug { fn name(&self) -> &'static str; } -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct RetryClassifiers { - inner: Vec>, + inner: Vec>, } impl RetryClassifiers { @@ -98,8 +106,7 @@ impl RetryClassifiers { } pub fn with_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { - self.inner.push(Box::new(retry_classifier)); - + self.inner.push(Arc::new(retry_classifier)); self } @@ -107,10 +114,6 @@ impl RetryClassifiers { // pub fn map_classifiers(mut self, fun: Fn() -> RetryClassifiers) } -impl Storable for RetryClassifiers { - type Storer = StoreReplace; -} - impl ClassifyRetry for RetryClassifiers { fn classify_retry(&self, ctx: &InterceptorContext) -> Option { // return the first non-None result @@ -160,5 +163,7 @@ mod test_util { } use crate::box_error::BoxError; +use crate::client::runtime_components::RuntimeComponents; +use std::sync::Arc; #[cfg(feature = "test-util")] pub use test_util::AlwaysRetry; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs new file mode 100644 index 00000000000..9b24628997a --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -0,0 +1,786 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::auth::{ + AuthSchemeId, HttpAuthScheme, SharedAuthOptionResolver, SharedHttpAuthScheme, +}; +use crate::client::connectors::SharedConnector; +use crate::client::identity::{ConfiguredIdentityResolver, SharedIdentityResolver}; +use crate::client::interceptors::SharedInterceptor; +use crate::client::orchestrator::SharedEndpointResolver; +use crate::client::retries::{RetryClassifiers, SharedRetryStrategy}; +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_async::time::SharedTimeSource; +use std::fmt; + +pub(crate) static EMPTY_RUNTIME_COMPONENTS_BUILDER: RuntimeComponentsBuilder = + RuntimeComponentsBuilder::new("empty"); + +/// Internal to `declare_runtime_components!`. +/// +/// Merges a field from one builder into another. +macro_rules! merge { + (Option $other:ident . $name:ident => $self:ident) => { + $self.$name = $other.$name.clone().or($self.$name.take()); + }; + (Vec $other:ident . $name:ident => $self:ident) => { + if !$other.$name.is_empty() { + $self.$name.extend($other.$name.iter().cloned()); + } + }; +} +/// Internal to `declare_runtime_components!`. +/// +/// This is used when creating the builder's `build` method +/// to populate each individual field value. The `required`/`atLeastOneRequired` +/// validations are performed here. +macro_rules! builder_field_value { + (Option $self:ident . $name:ident) => { + $self.$name + }; + (Option $self:ident . $name:ident required) => { + $self.$name.ok_or(BuildError(concat!( + "the `", + stringify!($name), + "` runtime component is required" + )))? + }; + (Vec $self:ident . $name:ident) => { + $self.$name + }; + (Vec $self:ident . $name:ident atLeastOneRequired) => {{ + if $self.$name.is_empty() { + return Err(BuildError(concat!( + "at least one `", + stringify!($name), + "` runtime component is required" + ))); + } + $self.$name + }}; +} +/// Internal to `declare_runtime_components!`. +/// +/// Converts the field type from `Option` or `Vec` into `Option>` or `Vec>` respectively. +/// Also removes the `Option` wrapper for required fields in the non-builder struct. +macro_rules! runtime_component_field_type { + (Option $inner_type:ident) => { + Option> + }; + (Option $inner_type:ident required) => { + Tracked<$inner_type> + }; + (Vec $inner_type:ident) => { + Vec> + }; + (Vec $inner_type:ident atLeastOneRequired) => { + Vec> + }; +} +/// Internal to `declare_runtime_components!`. +/// +/// Converts an `$outer_type` into an empty instantiation for that type. +/// This is needed since `Default::default()` can't be used in a `const` function, +/// and `RuntimeComponentsBuilder::new()` is `const`. +macro_rules! empty_builder_value { + (Option) => { + None + }; + (Vec) => { + Vec::new() + }; +} + +/// Macro to define the structs for both `RuntimeComponents` and `RuntimeComponentsBuilder`. +/// +/// This is a macro in order to keep the fields consistent between the two, and to automatically +/// update the `merge_from` and `build` methods when new components are added. +/// +/// It also facilitates unit testing since the overall mechanism can be unit tested with different +/// fields that are easy to check in tests (testing with real components makes it hard +/// to tell that the correct component was selected when merging builders). +/// +/// # Example usage +/// +/// The two identifiers after "fields for" become the names of the struct and builder respectively. +/// Following that, all the fields are specified. Fields MUST be wrapped in `Option` or `Vec`. +/// To make a field required in the non-builder struct, add `#[required]` for `Option` fields, or +/// `#[atLeastOneRequired]` for `Vec` fields. +/// +/// ```no_compile +/// declare_runtime_components! { +/// fields for TestRc and TestRcBuilder { +/// some_optional_string: Option, +/// +/// some_optional_vec: Vec, +/// +/// #[required] +/// some_required_string: Option, +/// +/// #[atLeastOneRequired] +/// some_required_vec: Vec, +/// } +/// } +/// ``` +macro_rules! declare_runtime_components { + (fields for $rc_name:ident and $builder_name:ident { + $($(#[$option:ident])? $field_name:ident : $outer_type:ident<$inner_type:ident> ,)+ + }) => { + /// Components that can only be set in runtime plugins that the orchestrator uses directly to call an operation. + #[derive(Clone, Debug)] + pub struct $rc_name { + $($field_name: runtime_component_field_type!($outer_type $inner_type $($option)?),)+ + } + + #[derive(Clone, Debug, Default)] + pub struct $builder_name { + builder_name: &'static str, + $($field_name: $outer_type>,)+ + } + impl $builder_name { + /// Creates a new builder. + /// + /// Since multiple builders are merged together to make the final [`RuntimeComponents`], + /// all components added by this builder are associated with the given `name` so that + /// the origin of a component can be easily found when debugging. + pub const fn new(name: &'static str) -> Self { + Self { + builder_name: name, + $($field_name: empty_builder_value!($outer_type),)+ + } + } + + /// Merge in components from another builder. + pub fn merge_from(mut self, other: &Self) -> Self { + $(merge!($outer_type other.$field_name => self);)+ + self + } + + /// Builds [`RuntimeComponents`] from this builder. + pub fn build(self) -> Result<$rc_name, BuildError> { + Ok($rc_name { + $($field_name: builder_field_value!($outer_type self.$field_name $($option)?),)+ + }) + } + } + }; +} + +declare_runtime_components! { + fields for RuntimeComponents and RuntimeComponentsBuilder { + #[required] + auth_option_resolver: Option, + + // A connector is not required since a client could technically only be used for presigning + connector: Option, + + #[required] + endpoint_resolver: Option, + + #[atLeastOneRequired] + http_auth_schemes: Vec, + + #[atLeastOneRequired] + identity_resolvers: Vec, + + interceptors: Vec, + + retry_classifiers: Option, + + #[required] + retry_strategy: Option, + + time_source: Option, + + sleep_impl: Option, + } +} + +impl RuntimeComponents { + /// Returns a builder for runtime components. + pub fn builder() -> RuntimeComponentsBuilder { + Default::default() + } + + /// Returns the auth option resolver. + pub fn auth_option_resolver(&self) -> SharedAuthOptionResolver { + self.auth_option_resolver.value.clone() + } + + /// Returns the connector. + pub fn connector(&self) -> Option { + self.connector.as_ref().map(|s| s.value.clone()) + } + + /// Returns the endpoint resolver. + pub fn endpoint_resolver(&self) -> SharedEndpointResolver { + self.endpoint_resolver.value.clone() + } + + /// Returns the requested auth scheme if it is set. + pub fn http_auth_scheme(&self, scheme_id: AuthSchemeId) -> Option { + self.http_auth_schemes + .iter() + .find(|s| s.value.scheme_id() == scheme_id) + .map(|s| s.value.clone()) + } + + /// Returns an iterator over the interceptors. + pub fn interceptors(&self) -> impl Iterator + '_ { + self.interceptors.iter().map(|s| s.value.clone()) + } + + /// Returns the retry classifiers. + pub fn retry_classifiers(&self) -> Option<&RetryClassifiers> { + self.retry_classifiers.as_ref().map(|s| &s.value) + } + + /// Returns the retry strategy. + pub fn retry_strategy(&self) -> SharedRetryStrategy { + self.retry_strategy.value.clone() + } + + /// Returns the async sleep implementation. + pub fn sleep_impl(&self) -> Option { + self.sleep_impl.as_ref().map(|s| s.value.clone()) + } + + /// Returns the time source. + pub fn time_source(&self) -> Option { + self.time_source.as_ref().map(|s| s.value.clone()) + } +} + +impl RuntimeComponentsBuilder { + /// Returns the auth option resolver. + pub fn auth_option_resolver(&self) -> Option { + self.auth_option_resolver.as_ref().map(|s| s.value.clone()) + } + + /// Sets the auth option resolver. + pub fn set_auth_option_resolver( + &mut self, + auth_option_resolver: Option, + ) -> &mut Self { + self.auth_option_resolver = + auth_option_resolver.map(|r| Tracked::new(self.builder_name, r)); + self + } + + /// Sets the auth option resolver. + pub fn with_auth_option_resolver( + mut self, + auth_option_resolver: Option, + ) -> Self { + self.set_auth_option_resolver(auth_option_resolver); + self + } + + /// Returns the connector. + pub fn connector(&self) -> Option { + self.connector.as_ref().map(|s| s.value.clone()) + } + + /// Sets the connector. + pub fn set_connector(&mut self, connector: Option) -> &mut Self { + self.connector = connector.map(|c| Tracked::new(self.builder_name, c)); + self + } + + /// Sets the connector. + pub fn with_connector(mut self, connector: Option) -> Self { + self.set_connector(connector); + self + } + + /// Returns the endpoint resolver. + pub fn endpoint_resolver(&self) -> Option { + self.endpoint_resolver.as_ref().map(|s| s.value.clone()) + } + + /// Sets the endpoint resolver. + pub fn set_endpoint_resolver( + &mut self, + endpoint_resolver: Option, + ) -> &mut Self { + self.endpoint_resolver = endpoint_resolver.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Sets the endpoint resolver. + pub fn with_endpoint_resolver( + mut self, + endpoint_resolver: Option, + ) -> Self { + self.set_endpoint_resolver(endpoint_resolver); + self + } + + /// Returns the HTTP auth schemes. + pub fn http_auth_schemes(&self) -> impl Iterator + '_ { + self.http_auth_schemes.iter().map(|s| s.value.clone()) + } + + /// Adds a HTTP auth scheme. + pub fn push_http_auth_scheme(&mut self, auth_scheme: SharedHttpAuthScheme) -> &mut Self { + self.http_auth_schemes + .push(Tracked::new(self.builder_name, auth_scheme)); + self + } + + /// Adds a HTTP auth scheme. + pub fn with_http_auth_scheme(mut self, auth_scheme: SharedHttpAuthScheme) -> Self { + self.push_http_auth_scheme(auth_scheme); + self + } + + /// Adds an identity resolver. + pub fn push_identity_resolver( + &mut self, + scheme_id: AuthSchemeId, + identity_resolver: SharedIdentityResolver, + ) -> &mut Self { + self.identity_resolvers.push(Tracked::new( + self.builder_name, + ConfiguredIdentityResolver::new(scheme_id, identity_resolver), + )); + self + } + + /// Adds an identity resolver. + pub fn with_identity_resolver( + mut self, + scheme_id: AuthSchemeId, + identity_resolver: SharedIdentityResolver, + ) -> Self { + self.push_identity_resolver(scheme_id, identity_resolver); + self + } + + /// Returns the interceptors. + pub fn interceptors(&self) -> impl Iterator + '_ { + self.interceptors.iter().map(|s| s.value.clone()) + } + + /// Adds all the given interceptors. + pub fn extend_interceptors( + &mut self, + interceptors: impl Iterator, + ) -> &mut Self { + self.interceptors + .extend(interceptors.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Adds an interceptor. + pub fn push_interceptor(&mut self, interceptor: SharedInterceptor) -> &mut Self { + self.interceptors + .push(Tracked::new(self.builder_name, interceptor)); + self + } + + /// Adds an interceptor. + pub fn with_interceptor(mut self, interceptor: SharedInterceptor) -> Self { + self.push_interceptor(interceptor); + self + } + + /// Directly sets the interceptors and clears out any that were previously pushed. + pub fn set_interceptors( + &mut self, + interceptors: impl Iterator, + ) -> &mut Self { + self.interceptors.clear(); + self.interceptors + .extend(interceptors.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Directly sets the interceptors and clears out any that were previously pushed. + pub fn with_interceptors( + mut self, + interceptors: impl Iterator, + ) -> Self { + self.set_interceptors(interceptors); + self + } + + /// Returns the retry classifiers. + pub fn retry_classifiers(&self) -> Option<&RetryClassifiers> { + self.retry_classifiers.as_ref().map(|s| &s.value) + } + + /// Sets the retry classifiers. + pub fn set_retry_classifiers( + &mut self, + retry_classifiers: Option, + ) -> &mut Self { + self.retry_classifiers = retry_classifiers.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Sets the retry classifiers. + pub fn with_retry_classifiers(mut self, retry_classifiers: Option) -> Self { + self.retry_classifiers = retry_classifiers.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Returns the retry strategy. + pub fn retry_strategy(&self) -> Option { + self.retry_strategy.as_ref().map(|s| s.value.clone()) + } + + /// Sets the retry strategy. + pub fn set_retry_strategy(&mut self, retry_strategy: Option) -> &mut Self { + self.retry_strategy = retry_strategy.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Sets the retry strategy. + pub fn with_retry_strategy(mut self, retry_strategy: Option) -> Self { + self.retry_strategy = retry_strategy.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Returns the async sleep implementation. + pub fn sleep_impl(&self) -> Option { + self.sleep_impl.as_ref().map(|s| s.value.clone()) + } + + /// Sets the async sleep implementation. + pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { + self.sleep_impl = sleep_impl.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Sets the async sleep implementation. + pub fn with_sleep_impl(mut self, sleep_impl: Option) -> Self { + self.sleep_impl = sleep_impl.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Returns the time source. + pub fn time_source(&self) -> Option { + self.time_source.as_ref().map(|s| s.value.clone()) + } + + /// Sets the time source. + pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { + self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s)); + self + } + + /// Sets the time source. + pub fn with_time_source(mut self, time_source: Option) -> Self { + self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s)); + self + } +} + +#[derive(Clone, Debug)] +#[cfg_attr(test, derive(Eq, PartialEq))] +struct Tracked { + _origin: &'static str, + value: T, +} + +impl Tracked { + fn new(origin: &'static str, value: T) -> Self { + Self { + _origin: origin, + value, + } + } +} + +impl RuntimeComponentsBuilder { + /// Creates a runtime components builder with all the required components filled in with fake (panicking) implementations. + #[cfg(feature = "test-util")] + pub fn for_tests() -> Self { + use crate::client::auth::AuthOptionResolver; + use crate::client::connectors::Connector; + use crate::client::identity::Identity; + use crate::client::identity::IdentityResolver; + use crate::client::orchestrator::{EndpointResolver, EndpointResolverParams, Future}; + use crate::client::retries::RetryStrategy; + use aws_smithy_async::rt::sleep::AsyncSleep; + use aws_smithy_async::time::TimeSource; + use aws_smithy_types::config_bag::ConfigBag; + use aws_smithy_types::endpoint::Endpoint; + + #[derive(Debug)] + struct FakeAuthOptionResolver; + impl AuthOptionResolver for FakeAuthOptionResolver { + fn resolve_auth_options( + &self, + _: &crate::client::auth::AuthOptionResolverParams, + ) -> Result, crate::box_error::BoxError> + { + unreachable!("fake auth option resolver must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeConnector; + impl Connector for FakeConnector { + fn call( + &self, + _: crate::client::orchestrator::HttpRequest, + ) -> crate::client::orchestrator::BoxFuture + { + unreachable!("fake connector must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeEndpointResolver; + impl EndpointResolver for FakeEndpointResolver { + fn resolve_endpoint(&self, _: &EndpointResolverParams) -> Future { + unreachable!("fake endpoint resolver must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeHttpAuthScheme; + impl HttpAuthScheme for FakeHttpAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + AuthSchemeId::new("fake") + } + + fn identity_resolver( + &self, + _: &dyn GetIdentityResolver, + ) -> Option { + None + } + + fn request_signer(&self) -> &dyn crate::client::auth::HttpRequestSigner { + unreachable!("fake http auth scheme must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeIdentityResolver; + impl IdentityResolver for FakeIdentityResolver { + fn resolve_identity(&self, _: &ConfigBag) -> Future { + unreachable!("fake identity resolver must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeRetryStrategy; + impl RetryStrategy for FakeRetryStrategy { + fn should_attempt_initial_request( + &self, + _: &RuntimeComponents, + _: &ConfigBag, + ) -> Result + { + unreachable!("fake retry strategy must be overridden for this test") + } + + fn should_attempt_retry( + &self, + _: &crate::client::interceptors::context::InterceptorContext, + _: &RuntimeComponents, + _: &ConfigBag, + ) -> Result + { + unreachable!("fake retry strategy must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeTimeSource; + impl TimeSource for FakeTimeSource { + fn now(&self) -> std::time::SystemTime { + unreachable!("fake time source must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeSleep; + impl AsyncSleep for FakeSleep { + fn sleep(&self, _: std::time::Duration) -> aws_smithy_async::rt::sleep::Sleep { + unreachable!("fake sleep must be overridden for this test") + } + } + + Self::new("aws_smithy_runtime_api::client::runtime_components::RuntimeComponentBuilder::for_tests") + .with_auth_option_resolver(Some(SharedAuthOptionResolver::new(FakeAuthOptionResolver))) + .with_connector(Some(SharedConnector::new(FakeConnector))) + .with_endpoint_resolver(Some(SharedEndpointResolver::new(FakeEndpointResolver))) + .with_http_auth_scheme(SharedHttpAuthScheme::new(FakeHttpAuthScheme)) + .with_identity_resolver(AuthSchemeId::new("fake"), SharedIdentityResolver::new(FakeIdentityResolver)) + .with_retry_classifiers(Some(RetryClassifiers::new())) + .with_retry_strategy(Some(SharedRetryStrategy::new(FakeRetryStrategy))) + .with_time_source(Some(SharedTimeSource::new(FakeTimeSource))) + .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep))) + } +} + +#[derive(Debug)] +pub struct BuildError(&'static str); + +impl std::error::Error for BuildError {} + +impl fmt::Display for BuildError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +/// A trait for retrieving a shared identity resolver. +/// +/// This trait exists so that [`HttpAuthScheme::identity_resolver`](crate::client::auth::HttpAuthScheme::identity_resolver) +/// can have access to configured identity resolvers without having access to all the runtime components. +pub trait GetIdentityResolver: Send + Sync { + /// Returns the requested identity resolver if it is set. + fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option; +} + +impl GetIdentityResolver for RuntimeComponents { + fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option { + self.identity_resolvers + .iter() + .find(|s| s.value.scheme_id() == scheme_id) + .map(|s| s.value.identity_resolver()) + } +} + +#[cfg(all(test, feature = "test-util"))] +mod tests { + use super::*; + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + fn the_builders_should_merge() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + #[required] + some_required_string: Option, + + some_optional_string: Option, + + #[atLeastOneRequired] + some_required_vec: Vec, + + some_optional_vec: Vec, + } + } + + let builder1 = TestRcBuilder { + builder_name: "builder1", + some_required_string: Some(Tracked::new("builder1", "override_me".into())), + some_optional_string: Some(Tracked::new("builder1", "override_me optional".into())), + some_required_vec: vec![Tracked::new("builder1", "first".into())], + some_optional_vec: vec![Tracked::new("builder1", "first optional".into())], + }; + let builder2 = TestRcBuilder { + builder_name: "builder2", + some_required_string: Some(Tracked::new("builder2", "override_me_too".into())), + some_optional_string: Some(Tracked::new("builder2", "override_me_too optional".into())), + some_required_vec: vec![Tracked::new("builder2", "second".into())], + some_optional_vec: vec![Tracked::new("builder2", "second optional".into())], + }; + let builder3 = TestRcBuilder { + builder_name: "builder3", + some_required_string: Some(Tracked::new("builder3", "correct".into())), + some_optional_string: Some(Tracked::new("builder3", "correct optional".into())), + some_required_vec: vec![Tracked::new("builder3", "third".into())], + some_optional_vec: vec![Tracked::new("builder3", "third optional".into())], + }; + let rc = TestRcBuilder::new("root") + .merge_from(&builder1) + .merge_from(&builder2) + .merge_from(&builder3) + .build() + .expect("success"); + assert_eq!( + Tracked::new("builder3", "correct".to_string()), + rc.some_required_string + ); + assert_eq!( + Some(Tracked::new("builder3", "correct optional".to_string())), + rc.some_optional_string + ); + assert_eq!( + vec![ + Tracked::new("builder1", "first".to_string()), + Tracked::new("builder2", "second".into()), + Tracked::new("builder3", "third".into()) + ], + rc.some_required_vec + ); + assert_eq!( + vec![ + Tracked::new("builder1", "first optional".to_string()), + Tracked::new("builder2", "second optional".into()), + Tracked::new("builder3", "third optional".into()) + ], + rc.some_optional_vec + ); + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + #[should_panic(expected = "the `_some_string` runtime component is required")] + fn require_field_singular() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + #[required] + _some_string: Option, + } + } + + let rc = TestRcBuilder::new("test").build().unwrap(); + + // Ensure the correct types were used + let _: Tracked = rc._some_string; + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + #[should_panic(expected = "at least one `_some_vec` runtime component is required")] + fn require_field_plural() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + #[atLeastOneRequired] + _some_vec: Vec, + } + } + + let rc = TestRcBuilder::new("test").build().unwrap(); + + // Ensure the correct types were used + let _: Vec> = rc._some_vec; + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + fn optional_fields_dont_panic() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + _some_optional_string: Option, + _some_optional_vec: Vec, + } + } + + let rc = TestRcBuilder::new("test").build().unwrap(); + + // Ensure the correct types were used + let _: Option> = rc._some_optional_string; + let _: Vec> = rc._some_optional_vec; + } + + #[test] + fn building_test_builder_should_not_panic() { + let _ = RuntimeComponentsBuilder::for_tests().build(); // should not panic + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index d0a8e18b59c..609375b2107 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -4,31 +4,34 @@ */ use crate::box_error::BoxError; -use crate::client::interceptors::InterceptorRegistrar; +use crate::client::runtime_components::{ + RuntimeComponentsBuilder, EMPTY_RUNTIME_COMPONENTS_BUILDER, +}; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer}; +use std::borrow::Cow; use std::fmt::Debug; use std::sync::Arc; /// RuntimePlugin Trait /// -/// A RuntimePlugin is the unit of configuration for augmenting the SDK with new behavior +/// A RuntimePlugin is the unit of configuration for augmenting the SDK with new behavior. /// -/// Runtime plugins can set configuration and register interceptors. +/// Runtime plugins can register interceptors, set runtime components, and modify configuration. pub trait RuntimePlugin: Debug + Send + Sync { fn config(&self) -> Option { None } - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - let _ = interceptors; + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER) } } #[derive(Debug, Clone)] -struct SharedRuntimePlugin(Arc); +pub struct SharedRuntimePlugin(Arc); impl SharedRuntimePlugin { - fn new(plugin: impl RuntimePlugin + 'static) -> Self { + pub fn new(plugin: impl RuntimePlugin + 'static) -> Self { Self(Arc::new(plugin)) } } @@ -38,8 +41,8 @@ impl RuntimePlugin for SharedRuntimePlugin { self.0.config() } - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - self.0.interceptors(interceptors) + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + self.0.runtime_components() } } @@ -68,33 +71,66 @@ impl RuntimePlugins { pub fn apply_client_configuration( &self, cfg: &mut ConfigBag, - interceptors: &mut InterceptorRegistrar, - ) -> Result<(), BoxError> { + ) -> Result { tracing::trace!("applying client runtime plugins"); + let mut builder = RuntimeComponentsBuilder::new("apply_client_configuration"); for plugin in self.client_plugins.iter() { if let Some(layer) = plugin.config() { cfg.push_shared_layer(layer); } - plugin.interceptors(interceptors); + builder = builder.merge_from(&plugin.runtime_components()); } - - Ok(()) + Ok(builder) } pub fn apply_operation_configuration( &self, cfg: &mut ConfigBag, - interceptors: &mut InterceptorRegistrar, - ) -> Result<(), BoxError> { + ) -> Result { tracing::trace!("applying operation runtime plugins"); + let mut builder = RuntimeComponentsBuilder::new("apply_operation_configuration"); for plugin in self.operation_plugins.iter() { if let Some(layer) = plugin.config() { cfg.push_shared_layer(layer); } - plugin.interceptors(interceptors); + builder = builder.merge_from(&plugin.runtime_components()); } + Ok(builder) + } +} + +#[derive(Default, Debug)] +pub struct StaticRuntimePlugin { + config: Option, + runtime_components: Option, +} + +impl StaticRuntimePlugin { + pub fn new() -> Self { + Default::default() + } + + pub fn with_config(mut self, config: FrozenLayer) -> Self { + self.config = Some(config); + self + } + + pub fn with_runtime_components(mut self, runtime_components: RuntimeComponentsBuilder) -> Self { + self.runtime_components = Some(runtime_components); + self + } +} + +impl RuntimePlugin for StaticRuntimePlugin { + fn config(&self) -> Option { + self.config.clone() + } - Ok(()) + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + self.runtime_components + .as_ref() + .map(Cow::Borrowed) + .unwrap_or_else(|| RuntimePlugin::runtime_components(self)) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index cb0d8f1ae86..31722c94d45 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -14,6 +14,9 @@ pub mod auth; /// By default, the orchestrator uses a connector provided by `hyper`. pub mod connectors; +/// Utility to simplify config building for config and config overrides. +pub mod config_override; + /// The client orchestrator implementation pub mod orchestrator; diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 5b62491bc92..1dda4dbe588 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -13,10 +13,9 @@ use aws_smithy_runtime_api::client::auth::{ AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, }; use aws_smithy_runtime_api::client::identity::http::{Login, Token}; -use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolvers, SharedIdentityResolver, -}; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; use aws_smithy_types::base64::encode; use aws_smithy_types::config_bag::ConfigBag; use http::header::HeaderName; @@ -59,7 +58,7 @@ impl HttpAuthScheme for ApiKeyAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } @@ -82,6 +81,7 @@ impl HttpRequestSigner for ApiKeySigner { request: &mut HttpRequest, identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { let api_key = identity @@ -129,7 +129,7 @@ impl HttpAuthScheme for BasicAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } @@ -148,6 +148,7 @@ impl HttpRequestSigner for BasicAuthSigner { request: &mut HttpRequest, identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { let login = identity @@ -187,7 +188,7 @@ impl HttpAuthScheme for BearerAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } @@ -206,6 +207,7 @@ impl HttpRequestSigner for BearerAuthSigner { request: &mut HttpRequest, identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { let token = identity @@ -243,7 +245,7 @@ impl HttpAuthScheme for DigestAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } @@ -262,6 +264,7 @@ impl HttpRequestSigner for DigestAuthSigner { _request: &mut HttpRequest, _identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { unimplemented!( @@ -275,6 +278,7 @@ mod tests { use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::identity::http::Login; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; #[test] fn test_api_key_signing_headers() { @@ -283,6 +287,7 @@ mod tests { location: ApiKeyLocation::Header, name: "some-header-name".into(), }; + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Token::new("some-token", None), None); let mut request = http::Request::builder() @@ -294,6 +299,7 @@ mod tests { &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); @@ -311,6 +317,7 @@ mod tests { location: ApiKeyLocation::Query, name: "some-query-name".into(), }; + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Token::new("some-token", None), None); let mut request = http::Request::builder() @@ -322,6 +329,7 @@ mod tests { &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); @@ -335,6 +343,7 @@ mod tests { #[test] fn test_basic_auth() { let signer = BasicAuthSigner; + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Login::new("Aladdin", "open sesame", None), None); let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); @@ -344,6 +353,7 @@ mod tests { &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); @@ -358,6 +368,7 @@ mod tests { let signer = BearerAuthSigner; let config_bag = ConfigBag::base(); + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let identity = Identity::new(Token::new("some-token", None), None); let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); signer @@ -365,6 +376,7 @@ mod tests { &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs index 6fa815046df..56f96336586 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs @@ -10,13 +10,14 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, SharedHttpAuthScheme, }; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolvers, SharedIdentityResolver, -}; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, +}; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; +use aws_smithy_types::config_bag::ConfigBag; +use std::borrow::Cow; pub const NO_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("no_auth"); @@ -26,7 +27,7 @@ pub const NO_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("no_auth"); /// a Smithy `@optionalAuth` trait. #[non_exhaustive] #[derive(Debug)] -pub struct NoAuthRuntimePlugin(FrozenLayer); +pub struct NoAuthRuntimePlugin(RuntimeComponentsBuilder); impl Default for NoAuthRuntimePlugin { fn default() -> Self { @@ -36,19 +37,20 @@ impl Default for NoAuthRuntimePlugin { impl NoAuthRuntimePlugin { pub fn new() -> Self { - let mut cfg = Layer::new("NoAuth"); - cfg.push_identity_resolver( - NO_AUTH_SCHEME_ID, - SharedIdentityResolver::new(NoAuthIdentityResolver::new()), - ); - cfg.push_http_auth_scheme(SharedHttpAuthScheme::new(NoAuthScheme::new())); - Self(cfg.freeze()) + Self( + RuntimeComponentsBuilder::new("NoAuthRuntimePlugin") + .with_identity_resolver( + NO_AUTH_SCHEME_ID, + SharedIdentityResolver::new(NoAuthIdentityResolver::new()), + ) + .with_http_auth_scheme(SharedHttpAuthScheme::new(NoAuthScheme::new())), + ) } } impl RuntimePlugin for NoAuthRuntimePlugin { - fn config(&self) -> Option { - Some(self.0.clone()) + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } @@ -72,6 +74,7 @@ impl HttpRequestSigner for NoAuthSigner { _request: &mut HttpRequest, _identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { Ok(()) @@ -85,7 +88,7 @@ impl HttpAuthScheme for NoAuthScheme { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(NO_AUTH_SCHEME_ID) } diff --git a/rust-runtime/aws-smithy-runtime/src/client/config_override.rs b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs new file mode 100644 index 00000000000..c89352e1394 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs @@ -0,0 +1,254 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, Store, StoreReplace}; + +macro_rules! component { + ($typ:ty, $accessor:ident, $latest_accessor:ident) => { + pub fn $accessor(&self) -> Option<$typ> { + fallback_component!(self, $typ, $accessor) + } + + pub fn $latest_accessor(&self) -> Option<$typ> { + latest_component!(self, $typ, $accessor) + } + }; +} +macro_rules! fallback_component { + ($self:ident, $typ:ty, $accessor:ident) => { + match &$self.inner { + Inner::Initial(initial) => initial.components.$accessor(), + Inner::Override(overrid) => overrid + .components + .$accessor() + .or_else(|| overrid.initial_components.$accessor()), + } + }; +} +macro_rules! latest_component { + ($self:ident, $typ:ty, $accessor:ident) => { + match &$self.inner { + Inner::Initial(initial) => initial.components.$accessor(), + Inner::Override(overrid) => overrid.components.$accessor(), + } + }; +} + +struct Initial<'a> { + config: &'a mut Layer, + components: &'a mut RuntimeComponentsBuilder, +} + +struct Override<'a> { + initial_config: FrozenLayer, + initial_components: &'a RuntimeComponentsBuilder, + config: &'a mut Layer, + components: &'a mut RuntimeComponentsBuilder, +} + +enum Inner<'a> { + Initial(Initial<'a>), + Override(Override<'a>), +} + +/// Utility to simplify config building and config overrides. +/// +/// The resolver allows the same initialization logic to be reused +/// for both initial config and override config. +/// +/// This resolver can be initialized to one of two modes: +/// 1. _Initial mode_: The resolver is being used in a service `Config` builder's `build()` method, and thus, +/// there is no config override at this point. +/// 2. _Override mode_: The resolver is being used by the `ConfigOverrideRuntimePlugin`'s constructor and needs +/// to incorporate both the original config and the given config override for this operation. +/// +/// In all the methods on [`Resolver`], the term "latest" refers to the initial config when in _Initial mode_, +/// and to config override when in _Override mode_. +pub struct Resolver<'a> { + inner: Inner<'a>, +} + +impl<'a> Resolver<'a> { + /// Construct a new [`Resolver`] in _initial mode_. + pub fn initial(config: &'a mut Layer, components: &'a mut RuntimeComponentsBuilder) -> Self { + Self { + inner: Inner::Initial(Initial { config, components }), + } + } + + /// Construct a new [`Resolver`] in _override mode_. + pub fn overrid( + initial_config: FrozenLayer, + initial_components: &'a RuntimeComponentsBuilder, + config: &'a mut Layer, + components: &'a mut RuntimeComponentsBuilder, + ) -> Self { + Self { + inner: Inner::Override(Override { + initial_config, + initial_components, + config, + components, + }), + } + } + + /// Returns true if in _initial mode_. + pub fn is_initial(&self) -> bool { + matches!(self.inner, Inner::Initial(_)) + } + + /// Returns a mutable reference to the latest config. + pub fn config_mut(&mut self) -> &mut Layer { + match &mut self.inner { + Inner::Initial(initial) => initial.config, + Inner::Override(overrid) => overrid.config, + } + } + + /// Returns a mutable reference to the latest runtime components. + pub fn runtime_components_mut(&mut self) -> &mut RuntimeComponentsBuilder { + match &mut self.inner { + Inner::Initial(initial) => initial.components, + Inner::Override(overrid) => overrid.components, + } + } + + /// Returns true if the latest config has `T` set. + /// + /// The "latest" is initial for `Resolver::Initial`, and override for `Resolver::Override`. + pub fn is_latest_set(&self) -> bool + where + T: Storable>, + { + self.config().load::().is_some() + } + + /// Returns true if `T` is set anywhere. + pub fn is_set(&self) -> bool + where + T: Storable>, + { + match &self.inner { + Inner::Initial(initial) => initial.config.load::().is_some(), + Inner::Override(overrid) => { + overrid.initial_config.load::().is_some() || overrid.config.load::().is_some() + } + } + } + + /// Resolves the value `T` with fallback + pub fn resolve_config(&self) -> ::ReturnedType<'_> + where + T: Storable>, + { + let mut maybe_value = self.config().load::(); + if maybe_value.is_none() { + // Try to fallback + if let Inner::Override(overrid) = &self.inner { + maybe_value = overrid.initial_config.load::() + } + } + maybe_value + } + + // Add additional component methods as needed + component!(SharedAsyncSleep, sleep_impl, latest_sleep_impl); + + fn config(&self) -> &Layer { + match &self.inner { + Inner::Initial(initial) => initial.config, + Inner::Override(overrid) => overrid.config, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use aws_smithy_types::config_bag::CloneableLayer; + + #[derive(Clone, Debug)] + struct TestStorable(String); + impl Storable for TestStorable { + type Storer = StoreReplace; + } + + #[test] + fn initial_mode_config() { + let mut config = Layer::new("test"); + let mut components = RuntimeComponentsBuilder::new("test"); + + let mut resolver = Resolver::initial(&mut config, &mut components); + assert!(resolver.is_initial()); + assert!(!resolver.is_latest_set::()); + assert!(!resolver.is_set::()); + assert!(resolver.resolve_config::().is_none()); + + resolver.config_mut().store_put(TestStorable("test".into())); + assert!(resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!("test", resolver.resolve_config::().unwrap().0); + } + + #[test] + fn override_mode_config() { + let mut initial_config = CloneableLayer::new("initial"); + let initial_components = RuntimeComponentsBuilder::new("initial"); + let mut config = Layer::new("override"); + let mut components = RuntimeComponentsBuilder::new("override"); + + let resolver = Resolver::overrid( + initial_config.clone().freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(!resolver.is_initial()); + assert!(!resolver.is_latest_set::()); + assert!(!resolver.is_set::()); + assert!(resolver.resolve_config::().is_none()); + + initial_config.store_put(TestStorable("test".into())); + let resolver = Resolver::overrid( + initial_config.clone().freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(!resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!("test", resolver.resolve_config::().unwrap().0); + + initial_config.unset::(); + config.store_put(TestStorable("test".into())); + let resolver = Resolver::overrid( + initial_config.clone().freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!("test", resolver.resolve_config::().unwrap().0); + + initial_config.store_put(TestStorable("override me".into())); + config.store_put(TestStorable("override".into())); + let resolver = Resolver::overrid( + initial_config.freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!( + "override", + resolver.resolve_config::().unwrap().0 + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs index e2d08a60d53..6e3d2aadfbb 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs @@ -5,12 +5,12 @@ use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryConfig}; use std::fmt; @@ -43,6 +43,7 @@ impl Interceptor for ConnectionPoisoningInterceptor { fn modify_before_transmit( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let capture_smithy_connection = CaptureSmithyConnectionWrapper::new(); @@ -58,6 +59,7 @@ impl Interceptor for ConnectionPoisoningInterceptor { fn modify_before_deserialization( &self, context: &mut BeforeDeserializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let reconnect_mode = cfg @@ -65,7 +67,9 @@ impl Interceptor for ConnectionPoisoningInterceptor { .map(RetryConfig::reconnect_mode) .unwrap_or(ReconnectMode::ReconnectOnTransientError); let captured_connection = cfg.load::().cloned(); - let retry_classifiers = cfg.retry_classifiers(); + let retry_classifiers = runtime_components + .retry_classifiers() + .ok_or("retry classifiers are required for connection poisoning to work")?; let error_is_transient = retry_classifiers .classify_retry(context.into_inner()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index c289821e9bd..396aeb60786 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -8,6 +8,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::error::Error as StdError; use std::fmt; @@ -41,6 +42,7 @@ where fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let mut request = HttpRequest::new(SdkBody::taken()); @@ -75,6 +77,7 @@ where fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let request = context.request_mut(); diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 552c78b04b9..803310221f4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -9,22 +9,24 @@ use self::auth::orchestrate_auth; use crate::client::orchestrator::endpoints::orchestrate_endpoint; use crate::client::orchestrator::http::read_body; -use crate::client::timeout::{MaybeTimeout, ProvideMaybeTimeoutConfig, TimeoutKind}; +use crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind}; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream::ByteStream; use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; +use aws_smithy_runtime_api::client::connectors::Connector; use aws_smithy_runtime_api::client::interceptors::context::{ Error, Input, InterceptorContext, Output, RewindResult, }; use aws_smithy_runtime_api::client::interceptors::Interceptors; use aws_smithy_runtime_api::client::orchestrator::{ - HttpResponse, LoadedRequestBody, OrchestratorError, RequestSerializer, + DynResponseDeserializer, HttpResponse, LoadedRequestBody, OrchestratorError, RequestSerializer, + ResponseDeserializer, SharedRequestSerializer, }; use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; -use aws_smithy_runtime_api::client::retries::ShouldAttempt; +use aws_smithy_runtime_api::client::retries::{RetryStrategy, ShouldAttempt}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins; use aws_smithy_types::config_bag::ConfigBag; use std::mem; @@ -62,6 +64,24 @@ macro_rules! continue_on_err { }; } +macro_rules! run_interceptors { + (continue_on_err: { $($interceptor:ident($ctx:ident, $rc:ident, $cfg:ident);)+ }) => { + $(run_interceptors!(continue_on_err: $interceptor($ctx, $rc, $cfg));)+ + }; + (continue_on_err: $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => { + continue_on_err!([$ctx] => run_interceptors!(__private $interceptor($ctx, $rc, $cfg))) + }; + (halt_on_err: { $($interceptor:ident($ctx:ident, $rc:ident, $cfg:ident);)+ }) => { + $(run_interceptors!(halt_on_err: $interceptor($ctx, $rc, $cfg));)+ + }; + (halt_on_err: $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => { + halt_on_err!([$ctx] => run_interceptors!(__private $interceptor($ctx, $rc, $cfg))) + }; + (__private $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => { + Interceptors::new($rc.interceptors()).$interceptor($ctx, $rc, $cfg) + }; +} + pub async fn invoke( service_name: &str, operation_name: &str, @@ -101,24 +121,25 @@ pub async fn invoke_with_stop_point( let mut cfg = ConfigBag::base(); let cfg = &mut cfg; - let mut interceptors = Interceptors::new(); let mut ctx = InterceptorContext::new(input); - if let Err(err) = apply_configuration(&mut ctx, cfg, &mut interceptors, runtime_plugins) { - return Err(SdkError::construction_failure(err)); - } - let operation_timeout_config = cfg.maybe_timeout_config(TimeoutKind::Operation); + let runtime_components = apply_configuration(&mut ctx, cfg, runtime_plugins) + .map_err(SdkError::construction_failure)?; + trace!(runtime_components = ?runtime_components); + + let operation_timeout_config = + MaybeTimeoutConfig::new(&runtime_components, cfg, TimeoutKind::Operation); trace!(operation_timeout_config = ?operation_timeout_config); async { // If running the pre-execution interceptors failed, then we skip running the op and run the // final interceptors instead. if !ctx.is_failed() { - try_op(&mut ctx, cfg, &interceptors, stop_point).await; + try_op(&mut ctx, cfg, &runtime_components, stop_point).await; } - finally_op(&mut ctx, cfg, &interceptors).await; + finally_op(&mut ctx, cfg, &runtime_components).await; Ok(ctx) } - .maybe_timeout_with_config(operation_timeout_config) + .maybe_timeout(operation_timeout_config) .await } .instrument(debug_span!("invoke", service = %service_name, operation = %operation_name)) @@ -132,42 +153,49 @@ pub async fn invoke_with_stop_point( fn apply_configuration( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &mut Interceptors, runtime_plugins: &RuntimePlugins, -) -> Result<(), BoxError> { - runtime_plugins.apply_client_configuration(cfg, interceptors.client_interceptors_mut())?; - continue_on_err!([ctx] => interceptors.client_read_before_execution(ctx, cfg)); - - runtime_plugins - .apply_operation_configuration(cfg, interceptors.operation_interceptors_mut())?; - continue_on_err!([ctx] => interceptors.operation_read_before_execution(ctx, cfg)); - - Ok(()) +) -> Result { + let client_rc_builder = runtime_plugins.apply_client_configuration(cfg)?; + continue_on_err!([ctx] => Interceptors::new(client_rc_builder.interceptors()).read_before_execution(false, ctx, cfg)); + + let operation_rc_builder = runtime_plugins.apply_operation_configuration(cfg)?; + continue_on_err!([ctx] => Interceptors::new(operation_rc_builder.interceptors()).read_before_execution(true, ctx, cfg)); + + // The order below is important. Client interceptors must run before operation interceptors. + Ok(RuntimeComponents::builder() + .merge_from(&client_rc_builder) + .merge_from(&operation_rc_builder) + .build()?) } #[instrument(skip_all)] async fn try_op( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, stop_point: StopPoint, ) { // Before serialization - halt_on_err!([ctx] => interceptors.read_before_serialization(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_serialization(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_before_serialization(ctx, runtime_components, cfg); + modify_before_serialization(ctx, runtime_components, cfg); + }); // Serialization ctx.enter_serialization_phase(); { let _span = debug_span!("serialization").entered(); - let request_serializer = cfg.request_serializer(); + let request_serializer = cfg + .load::() + .expect("request serializer must be in the config bag") + .clone(); let input = ctx.take_input().expect("input set at this point"); let request = halt_on_err!([ctx] => request_serializer.serialize_input(input, cfg).map_err(OrchestratorError::other)); ctx.set_request(request); } // Load the request body into memory if configured to do so - if let LoadedRequestBody::Requested = cfg.loaded_request_body() { + if let Some(&LoadedRequestBody::Requested) = cfg.load::() { debug!("loading request body into memory"); let mut body = SdkBody::taken(); mem::swap(&mut body, ctx.request_mut().expect("set above").body_mut()); @@ -175,20 +203,21 @@ async fn try_op( *ctx.request_mut().as_mut().expect("set above").body_mut() = SdkBody::from(loaded_body.clone()); cfg.interceptor_state() - .set_loaded_request_body(LoadedRequestBody::Loaded(loaded_body)); + .store_put(LoadedRequestBody::Loaded(loaded_body)); } // Before transmit ctx.enter_before_transmit_phase(); - halt_on_err!([ctx] => interceptors.read_after_serialization(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_retry_loop(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_after_serialization(ctx, runtime_components, cfg); + modify_before_retry_loop(ctx, runtime_components, cfg); + }); - let retry_strategy = cfg.retry_strategy(); // If we got a retry strategy from the bag, ask it what to do. // Otherwise, assume we should attempt the initial request. - let should_attempt = retry_strategy - .map(|rs| rs.should_attempt_initial_request(cfg)) - .unwrap_or(Ok(ShouldAttempt::Yes)); + let should_attempt = runtime_components + .retry_strategy() + .should_attempt_initial_request(runtime_components, cfg); match should_attempt { // Yes, let's make a request Ok(ShouldAttempt::Yes) => debug!("retry strategy has OKed initial request"), @@ -200,7 +229,7 @@ async fn try_op( // No, we shouldn't make a request because... Err(err) => halt!([ctx] => OrchestratorError::other(err)), Ok(ShouldAttempt::YesAfterDelay(delay)) => { - let sleep_impl = halt_on_err!([ctx] => cfg.sleep_impl().ok_or(OrchestratorError::other( + let sleep_impl = halt_on_err!([ctx] => runtime_components.sleep_impl().ok_or_else(|| OrchestratorError::other( "the retry strategy requested a delay before sending the initial request, but no 'async sleep' implementation was set" ))); debug!("retry strategy has OKed initial request after a {delay:?} delay"); @@ -228,31 +257,28 @@ async fn try_op( debug!("delaying for {delay:?}"); sleep.await; } - let attempt_timeout_config = cfg.maybe_timeout_config(TimeoutKind::OperationAttempt); + let attempt_timeout_config = + MaybeTimeoutConfig::new(runtime_components, cfg, TimeoutKind::OperationAttempt); trace!(attempt_timeout_config = ?attempt_timeout_config); let maybe_timeout = async { debug!("beginning attempt #{i}"); - try_attempt(ctx, cfg, interceptors, stop_point).await; - finally_attempt(ctx, cfg, interceptors).await; + try_attempt(ctx, cfg, runtime_components, stop_point).await; + finally_attempt(ctx, cfg, runtime_components).await; Result::<_, SdkError>::Ok(()) } - .maybe_timeout_with_config(attempt_timeout_config) + .maybe_timeout(attempt_timeout_config) .await .map_err(|err| OrchestratorError::timeout(err.into_source().unwrap())); // We continue when encountering a timeout error. The retry classifier will decide what to do with it. continue_on_err!([ctx] => maybe_timeout); - let retry_strategy = cfg.retry_strategy(); - // If we got a retry strategy from the bag, ask it what to do. // If no strategy was set, we won't retry. - let should_attempt = match retry_strategy { - Some(retry_strategy) => halt_on_err!( - [ctx] => retry_strategy.should_attempt_retry(ctx, cfg).map_err(OrchestratorError::other) - ), - None => ShouldAttempt::No, - }; + let should_attempt = halt_on_err!([ctx] => runtime_components + .retry_strategy() + .should_attempt_retry(ctx, runtime_components, cfg) + .map_err(OrchestratorError::other)); match should_attempt { // Yes, let's retry the request ShouldAttempt::Yes => continue, @@ -262,7 +288,7 @@ async fn try_op( break; } ShouldAttempt::YesAfterDelay(delay) => { - let sleep_impl = halt_on_err!([ctx] => cfg.sleep_impl().ok_or(OrchestratorError::other( + let sleep_impl = halt_on_err!([ctx] => runtime_components.sleep_impl().ok_or_else(|| OrchestratorError::other( "the retry strategy requested a delay before sending the retry request, but no 'async sleep' implementation was set" ))); retry_delay = Some((delay, sleep_impl.sleep(delay))); @@ -276,21 +302,25 @@ async fn try_op( async fn try_attempt( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, stop_point: StopPoint, ) { - halt_on_err!([ctx] => interceptors.read_before_attempt(ctx, cfg)); + run_interceptors!(halt_on_err: read_before_attempt(ctx, runtime_components, cfg)); - halt_on_err!([ctx] => orchestrate_endpoint(ctx, cfg).await.map_err(OrchestratorError::other)); + halt_on_err!([ctx] => orchestrate_endpoint(ctx, runtime_components, cfg).await.map_err(OrchestratorError::other)); - halt_on_err!([ctx] => interceptors.modify_before_signing(ctx, cfg)); - halt_on_err!([ctx] => interceptors.read_before_signing(ctx, cfg)); + run_interceptors!(halt_on_err: { + modify_before_signing(ctx, runtime_components, cfg); + read_before_signing(ctx, runtime_components, cfg); + }); - halt_on_err!([ctx] => orchestrate_auth(ctx, cfg).await.map_err(OrchestratorError::other)); + halt_on_err!([ctx] => orchestrate_auth(ctx, runtime_components, cfg).await.map_err(OrchestratorError::other)); - halt_on_err!([ctx] => interceptors.read_after_signing(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_transmit(ctx, cfg)); - halt_on_err!([ctx] => interceptors.read_before_transmit(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_after_signing(ctx, runtime_components, cfg); + modify_before_transmit(ctx, runtime_components, cfg); + read_before_transmit(ctx, runtime_components, cfg); + }); // Return early if a stop point is set for before transmit if let StopPoint::BeforeTransmit = stop_point { @@ -304,7 +334,10 @@ async fn try_attempt( let response = halt_on_err!([ctx] => { let request = ctx.take_request().expect("set during serialization"); trace!(request = ?request, "transmitting request"); - cfg.connector().call(request).await.map_err(|err| { + let connector = halt_on_err!([ctx] => runtime_components.connector().ok_or_else(|| + OrchestratorError::other("a connector is required to send requests") + )); + connector.call(request).await.map_err(|err| { match err.downcast() { Ok(connector_error) => OrchestratorError::connector(*connector_error), Err(box_err) => OrchestratorError::other(box_err) @@ -315,14 +348,18 @@ async fn try_attempt( ctx.set_response(response); ctx.enter_before_deserialization_phase(); - halt_on_err!([ctx] => interceptors.read_after_transmit(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_deserialization(ctx, cfg)); - halt_on_err!([ctx] => interceptors.read_before_deserialization(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_after_transmit(ctx, runtime_components, cfg); + modify_before_deserialization(ctx, runtime_components, cfg); + read_before_deserialization(ctx, runtime_components, cfg); + }); ctx.enter_deserialization_phase(); let output_or_error = async { let response = ctx.response_mut().expect("set during transmit"); - let response_deserializer = cfg.response_deserializer(); + let response_deserializer = cfg + .load::() + .expect("a request deserializer must be in the config bag"); let maybe_deserialized = { let _span = debug_span!("deserialize_streaming").entered(); response_deserializer.deserialize_streaming(response) @@ -345,44 +382,48 @@ async fn try_attempt( ctx.set_output_or_error(output_or_error); ctx.enter_after_deserialization_phase(); - halt_on_err!([ctx] => interceptors.read_after_deserialization(ctx, cfg)); + run_interceptors!(halt_on_err: read_after_deserialization(ctx, runtime_components, cfg)); } #[instrument(skip_all)] async fn finally_attempt( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, ) { - continue_on_err!([ctx] => interceptors.modify_before_attempt_completion(ctx, cfg)); - continue_on_err!([ctx] => interceptors.read_after_attempt(ctx, cfg)); + run_interceptors!(continue_on_err: { + modify_before_attempt_completion(ctx, runtime_components, cfg); + read_after_attempt(ctx, runtime_components, cfg); + }); } #[instrument(skip_all)] async fn finally_op( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, ) { - continue_on_err!([ctx] => interceptors.modify_before_completion(ctx, cfg)); - continue_on_err!([ctx] => interceptors.read_after_execution(ctx, cfg)); + run_interceptors!(continue_on_err: { + modify_before_completion(ctx, runtime_components, cfg); + read_after_execution(ctx, runtime_components, cfg); + }); } #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; use crate::client::auth::no_auth::{NoAuthRuntimePlugin, NO_AUTH_SCHEME_ID}; - use crate::client::orchestrator::endpoints::{ - StaticUriEndpointResolver, StaticUriEndpointResolverParams, - }; + use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::NeverRetryStrategy; use crate::client::test_util::{ deserializer::CannedResponseDeserializer, serializer::CannedRequestSerializer, }; use ::http::{Request, Response, StatusCode}; use aws_smithy_runtime_api::client::auth::option_resolver::StaticAuthOptionResolver; - use aws_smithy_runtime_api::client::auth::{AuthOptionResolverParams, DynAuthOptionResolver}; - use aws_smithy_runtime_api::client::connectors::{Connector, DynConnector}; + use aws_smithy_runtime_api::client::auth::{ + AuthOptionResolverParams, SharedAuthOptionResolver, + }; + use aws_smithy_runtime_api::client::connectors::{Connector, SharedConnector}; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut, BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut, @@ -390,17 +431,17 @@ mod tests { BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, }; - use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorRegistrar, SharedInterceptor, - }; + use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; use aws_smithy_runtime_api::client::orchestrator::{ - BoxFuture, DynEndpointResolver, DynResponseDeserializer, Future, HttpRequest, - SharedRequestSerializer, + BoxFuture, DynResponseDeserializer, EndpointResolverParams, Future, HttpRequest, + SharedEndpointResolver, SharedRequestSerializer, }; - use aws_smithy_runtime_api::client::retries::DynRetryStrategy; + use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins}; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; + use std::borrow::Cow; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use tracing_test::traced_test; @@ -442,36 +483,58 @@ mod tests { } #[derive(Debug)] - struct TestOperationRuntimePlugin; + struct TestOperationRuntimePlugin { + builder: RuntimeComponentsBuilder, + } + + impl TestOperationRuntimePlugin { + fn new() -> Self { + Self { + builder: RuntimeComponentsBuilder::new("TestOperationRuntimePlugin") + .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))) + .with_endpoint_resolver(Some(SharedEndpointResolver::new( + StaticUriEndpointResolver::http_localhost(8080), + ))) + .with_connector(Some(SharedConnector::new(OkConnector::new()))) + .with_auth_option_resolver(Some(SharedAuthOptionResolver::new( + StaticAuthOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), + ))), + } + } + } impl RuntimePlugin for TestOperationRuntimePlugin { fn config(&self) -> Option { - let mut cfg = Layer::new("test operation"); - cfg.set_request_serializer(SharedRequestSerializer::new(new_request_serializer())); - cfg.set_response_deserializer( - DynResponseDeserializer::new(new_response_deserializer()), - ); - cfg.set_retry_strategy(DynRetryStrategy::new(NeverRetryStrategy::new())); - cfg.set_endpoint_resolver(DynEndpointResolver::new( - StaticUriEndpointResolver::http_localhost(8080), - )); - cfg.set_endpoint_resolver_params(StaticUriEndpointResolverParams::new().into()); - cfg.set_connector(DynConnector::new(OkConnector::new())); - cfg.set_auth_option_resolver_params(AuthOptionResolverParams::new("idontcare")); - cfg.set_auth_option_resolver(DynAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), - )); - - Some(cfg.freeze()) + let mut layer = Layer::new("TestOperationRuntimePlugin"); + layer.store_put(AuthOptionResolverParams::new("idontcare")); + layer.store_put(EndpointResolverParams::new("dontcare")); + layer.store_put(SharedRequestSerializer::new(new_request_serializer())); + layer.store_put(DynResponseDeserializer::new(new_response_deserializer())); + Some(layer.freeze()) + } + + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.builder) } } macro_rules! interceptor_error_handling_test { + (read_before_execution, $ctx:ty, $expected:expr,) => { + interceptor_error_handling_test!(__private read_before_execution, $ctx, $expected,); + }; ($interceptor:ident, $ctx:ty, $expected:expr) => { + interceptor_error_handling_test!(__private $interceptor, $ctx, $expected, _rc: &RuntimeComponents,); + }; + (__private $interceptor:ident, $ctx:ty, $expected:expr, $($rc_arg:tt)*) => { #[derive(Debug)] struct FailingInterceptorA; impl Interceptor for FailingInterceptorA { - fn $interceptor(&self, _ctx: $ctx, _cfg: &mut ConfigBag) -> Result<(), BoxError> { + fn $interceptor( + &self, + _ctx: $ctx, + $($rc_arg)* + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { tracing::debug!("FailingInterceptorA called!"); Err("FailingInterceptorA".into()) } @@ -480,7 +543,12 @@ mod tests { #[derive(Debug)] struct FailingInterceptorB; impl Interceptor for FailingInterceptorB { - fn $interceptor(&self, _ctx: $ctx, _cfg: &mut ConfigBag) -> Result<(), BoxError> { + fn $interceptor( + &self, + _ctx: $ctx, + $($rc_arg)* + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { tracing::debug!("FailingInterceptorB called!"); Err("FailingInterceptorB".into()) } @@ -489,37 +557,53 @@ mod tests { #[derive(Debug)] struct FailingInterceptorC; impl Interceptor for FailingInterceptorC { - fn $interceptor(&self, _ctx: $ctx, _cfg: &mut ConfigBag) -> Result<(), BoxError> { + fn $interceptor( + &self, + _ctx: $ctx, + $($rc_arg)* + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { tracing::debug!("FailingInterceptorC called!"); Err("FailingInterceptorC".into()) } } #[derive(Debug)] - struct FailingInterceptorsClientRuntimePlugin; - + struct FailingInterceptorsClientRuntimePlugin(RuntimeComponentsBuilder); + impl FailingInterceptorsClientRuntimePlugin { + fn new() -> Self { + Self(RuntimeComponentsBuilder::new("test").with_interceptor(SharedInterceptor::new(FailingInterceptorA))) + } + } impl RuntimePlugin for FailingInterceptorsClientRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(FailingInterceptorA)); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } #[derive(Debug)] - struct FailingInterceptorsOperationRuntimePlugin; - + struct FailingInterceptorsOperationRuntimePlugin(RuntimeComponentsBuilder); + impl FailingInterceptorsOperationRuntimePlugin { + fn new() -> Self { + Self( + RuntimeComponentsBuilder::new("test") + .with_interceptor(SharedInterceptor::new(FailingInterceptorB)) + .with_interceptor(SharedInterceptor::new(FailingInterceptorC)) + ) + } + } impl RuntimePlugin for FailingInterceptorsOperationRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(FailingInterceptorB)); - interceptors.register(SharedInterceptor::new(FailingInterceptorC)); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } let input = TypeErasedBox::new(Box::new(())); let runtime_plugins = RuntimePlugins::new() - .with_client_plugin(FailingInterceptorsClientRuntimePlugin) - .with_operation_plugin(TestOperationRuntimePlugin) + .with_client_plugin(FailingInterceptorsClientRuntimePlugin::new()) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) - .with_operation_plugin(FailingInterceptorsOperationRuntimePlugin); + .with_operation_plugin(FailingInterceptorsOperationRuntimePlugin::new()); let actual = invoke("test", "test", input, &runtime_plugins) .await .expect_err("should error"); @@ -539,7 +623,7 @@ mod tests { interceptor_error_handling_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, - expected + expected, ); } @@ -742,13 +826,20 @@ mod tests { } macro_rules! interceptor_error_redirection_test { + (read_before_execution, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr) => { + interceptor_error_redirection_test!(__private read_before_execution, $origin_ctx, $destination_interceptor, $destination_ctx, $expected,); + }; ($origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr) => { + interceptor_error_redirection_test!(__private $origin_interceptor, $origin_ctx, $destination_interceptor, $destination_ctx, $expected, _rc: &RuntimeComponents,); + }; + (__private $origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr, $($rc_arg:tt)*) => { #[derive(Debug)] struct OriginInterceptor; impl Interceptor for OriginInterceptor { fn $origin_interceptor( &self, _ctx: $origin_ctx, + $($rc_arg)* _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { tracing::debug!("OriginInterceptor called!"); @@ -762,6 +853,7 @@ mod tests { fn $destination_interceptor( &self, _ctx: $destination_ctx, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { tracing::debug!("DestinationInterceptor called!"); @@ -770,20 +862,27 @@ mod tests { } #[derive(Debug)] - struct InterceptorsTestOperationRuntimePlugin; - + struct InterceptorsTestOperationRuntimePlugin(RuntimeComponentsBuilder); + impl InterceptorsTestOperationRuntimePlugin { + fn new() -> Self { + Self( + RuntimeComponentsBuilder::new("test") + .with_interceptor(SharedInterceptor::new(OriginInterceptor)) + .with_interceptor(SharedInterceptor::new(DestinationInterceptor)) + ) + } + } impl RuntimePlugin for InterceptorsTestOperationRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(OriginInterceptor)); - interceptors.register(SharedInterceptor::new(DestinationInterceptor)); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } let input = TypeErasedBox::new(Box::new(())); let runtime_plugins = RuntimePlugins::new() - .with_operation_plugin(TestOperationRuntimePlugin) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) - .with_operation_plugin(InterceptorsTestOperationRuntimePlugin); + .with_operation_plugin(InterceptorsTestOperationRuntimePlugin::new()); let actual = invoke("test", "test", input, &runtime_plugins) .await .expect_err("should error"); @@ -1006,12 +1105,6 @@ mod tests { ); } - // #[tokio::test] - // #[traced_test] - // async fn test_read_after_attempt_error_causes_jump_to_modify_before_attempt_completion() { - // todo!("I'm confused by the behavior described in the spec") - // } - #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_causes_jump_to_read_after_execution() { @@ -1029,7 +1122,7 @@ mod tests { async fn test_stop_points() { let runtime_plugins = || { RuntimePlugins::new() - .with_operation_plugin(TestOperationRuntimePlugin) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) }; @@ -1076,6 +1169,7 @@ mod tests { fn modify_before_retry_loop( &self, _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { self.inner @@ -1087,6 +1181,7 @@ mod tests { fn modify_before_completion( &self, _context: &mut FinalizerInterceptorContextMut<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { self.inner @@ -1098,6 +1193,7 @@ mod tests { fn read_after_execution( &self, _context: &FinalizerInterceptorContextRef<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { self.inner @@ -1109,21 +1205,22 @@ mod tests { #[derive(Debug)] struct TestInterceptorRuntimePlugin { - interceptor: TestInterceptor, + builder: RuntimeComponentsBuilder, } impl RuntimePlugin for TestInterceptorRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(self.interceptor.clone())); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.builder) } } let interceptor = TestInterceptor::default(); let runtime_plugins = || { RuntimePlugins::new() - .with_operation_plugin(TestOperationRuntimePlugin) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) .with_operation_plugin(TestInterceptorRuntimePlugin { - interceptor: interceptor.clone(), + builder: RuntimeComponentsBuilder::new("test") + .with_interceptor(SharedInterceptor::new(interceptor.clone())), }) }; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index ce645708709..48fd6043927 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -5,11 +5,12 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, + AuthOptionResolver, AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, }; use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::identity::IdentityResolver; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::endpoint::Endpoint; use aws_smithy_types::Document; @@ -66,22 +67,22 @@ impl StdError for AuthOrchestrationError {} pub(super) async fn orchestrate_auth( ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result<(), BoxError> { let params = cfg.auth_option_resolver_params(); - let auth_options = cfg.auth_option_resolver().resolve_auth_options(params)?; - let identity_resolvers = cfg.identity_resolvers(); + let auth_option_resolver = runtime_components.auth_option_resolver(); + let auth_options = auth_option_resolver.resolve_auth_options(params)?; trace!( auth_option_resolver_params = ?params, auth_options = ?auth_options, - identity_resolvers = ?identity_resolvers, "orchestrating auth", ); for &scheme_id in auth_options.as_ref() { - if let Some(auth_scheme) = cfg.http_auth_schemes().scheme(scheme_id) { - if let Some(identity_resolver) = auth_scheme.identity_resolver(&identity_resolvers) { + if let Some(auth_scheme) = runtime_components.http_auth_scheme(scheme_id) { + if let Some(identity_resolver) = auth_scheme.identity_resolver(runtime_components) { let request_signer = auth_scheme.request_signer(); trace!( auth_scheme = ?auth_scheme, @@ -106,6 +107,7 @@ pub(super) async fn orchestrate_auth( request, &identity, auth_scheme_endpoint_config, + runtime_components, cfg, )?; return Ok(()); @@ -145,21 +147,23 @@ fn extract_endpoint_auth_scheme_config( Ok(AuthSchemeEndpointConfig::new(Some(auth_scheme_config))) } -#[cfg(test)] +#[cfg(all(test, feature = "test-util"))] mod tests { use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::auth::option_resolver::StaticAuthOptionResolver; use aws_smithy_runtime_api::client::auth::{ - AuthOptionResolverParams, AuthSchemeId, DynAuthOptionResolver, HttpAuthScheme, - HttpRequestSigner, SharedHttpAuthScheme, + AuthOptionResolverParams, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, + SharedAuthOptionResolver, SharedHttpAuthScheme, }; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolver, IdentityResolvers, SharedIdentityResolver, + Identity, IdentityResolver, SharedIdentityResolver, }; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::{Future, HttpRequest}; + use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponentsBuilder, + }; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::type_erasure::TypedBox; use std::collections::HashMap; @@ -183,6 +187,7 @@ mod tests { request: &mut HttpRequest, _identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { request @@ -205,7 +210,7 @@ mod tests { fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } @@ -221,23 +226,28 @@ mod tests { let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); - let mut layer = Layer::new("test"); - layer.set_auth_option_resolver_params(AuthOptionResolverParams::new("doesntmatter")); - layer.set_auth_option_resolver(DynAuthOptionResolver::new(StaticAuthOptionResolver::new( - vec![TEST_SCHEME_ID], - ))); - layer.push_identity_resolver( - TEST_SCHEME_ID, - SharedIdentityResolver::new(TestIdentityResolver), - ); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestAuthScheme { - signer: TestSigner, - })); + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_auth_option_resolver(Some(SharedAuthOptionResolver::new( + StaticAuthOptionResolver::new(vec![TEST_SCHEME_ID]), + ))) + .with_identity_resolver( + TEST_SCHEME_ID, + SharedIdentityResolver::new(TestIdentityResolver), + ) + .with_http_auth_scheme(SharedHttpAuthScheme::new(TestAuthScheme { + signer: TestSigner, + })) + .build() + .unwrap(); + + let mut layer: Layer = Layer::new("test"); + layer.store_put(AuthOptionResolverParams::new("doesntmatter")); layer.store_put(Endpoint::builder().url("dontcare").build()); + let cfg = ConfigBag::of_layers(vec![layer]); - let mut cfg = ConfigBag::base(); - cfg.push_layer(layer); - orchestrate_auth(&mut ctx, &cfg).await.expect("success"); + orchestrate_auth(&mut ctx, &runtime_components, &cfg) + .await + .expect("success"); assert_eq!( "success!", @@ -267,26 +277,33 @@ mod tests { fn config_with_identity( scheme_id: AuthSchemeId, identity: impl IdentityResolver + 'static, - ) -> ConfigBag { + ) -> (RuntimeComponents, ConfigBag) { + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_http_auth_scheme(SharedHttpAuthScheme::new(BasicAuthScheme::new())) + .with_http_auth_scheme(SharedHttpAuthScheme::new(BearerAuthScheme::new())) + .with_auth_option_resolver(Some(SharedAuthOptionResolver::new( + StaticAuthOptionResolver::new(vec![ + HTTP_BASIC_AUTH_SCHEME_ID, + HTTP_BEARER_AUTH_SCHEME_ID, + ]), + ))) + .with_identity_resolver(scheme_id, SharedIdentityResolver::new(identity)) + .build() + .unwrap(); + let mut layer = Layer::new("test"); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(BasicAuthScheme::new())); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(BearerAuthScheme::new())); layer.store_put(Endpoint::builder().url("dontcare").build()); + layer.store_put(AuthOptionResolverParams::new("doesntmatter")); - layer.set_auth_option_resolver_params(AuthOptionResolverParams::new("doesntmatter")); - layer.set_auth_option_resolver(DynAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![ - HTTP_BASIC_AUTH_SCHEME_ID, - HTTP_BEARER_AUTH_SCHEME_ID, - ]), - )); - layer.push_identity_resolver(scheme_id, SharedIdentityResolver::new(identity)); - ConfigBag::of_layers(vec![layer]) + (runtime_components, ConfigBag::of_layers(vec![layer])) } // First, test the presence of a basic auth login and absence of a bearer token - let cfg = config_with_identity(HTTP_BASIC_AUTH_SCHEME_ID, Login::new("a", "b", None)); - orchestrate_auth(&mut ctx, &cfg).await.expect("success"); + let (runtime_components, cfg) = + config_with_identity(HTTP_BASIC_AUTH_SCHEME_ID, Login::new("a", "b", None)); + orchestrate_auth(&mut ctx, &runtime_components, &cfg) + .await + .expect("success"); assert_eq!( // "YTpi" == "a:b" in base64 "Basic YTpi", @@ -298,13 +315,16 @@ mod tests { ); // Next, test the presence of a bearer token and absence of basic auth - let cfg = config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new("t", None)); + let (runtime_components, cfg) = + config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new("t", None)); let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); - orchestrate_auth(&mut ctx, &cfg).await.expect("success"); + orchestrate_auth(&mut ctx, &runtime_components, &cfg) + .await + .expect("success"); assert_eq!( "Bearer t", ctx.request() diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 394cde080b1..1b22b3c5d95 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -14,6 +14,7 @@ use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::{ EndpointResolver, EndpointResolverParams, Future, HttpRequest, }; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; use http::header::HeaderName; @@ -103,6 +104,7 @@ where pub(super) async fn orchestrate_endpoint( ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { trace!("orchestrating endpoint resolution"); @@ -111,8 +113,10 @@ pub(super) async fn orchestrate_endpoint( let endpoint_prefix = cfg.load::(); let request = ctx.request_mut().expect("set during serialization"); - let endpoint_resolver = cfg.endpoint_resolver(); - let endpoint = endpoint_resolver.resolve_endpoint(params).await?; + let endpoint = runtime_components + .endpoint_resolver() + .resolve_endpoint(params) + .await?; apply_endpoint(request, &endpoint, endpoint_prefix)?; // Make the endpoint config available to interceptors diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs index 7a41de659ac..110f720a81d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs @@ -6,6 +6,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeDeserializationInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::date_time::Format; use aws_smithy_types::DateTime; @@ -68,6 +69,7 @@ impl Interceptor for ServiceClockSkewInterceptor { fn modify_before_deserialization( &self, ctx: &mut BeforeDeserializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let time_received = DateTime::from(SystemTime::now()); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs index 69f36272ab0..5453cad2718 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs @@ -298,11 +298,8 @@ mod tests { use super::{cubic_throttle, ClientRateLimiter}; use crate::client::retries::client_rate_limiter::RequestReason; use approx::assert_relative_eq; - use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; - use aws_smithy_types::config_bag::ConfigBag; use std::time::{Duration, SystemTime}; const ONE_SECOND: Duration = Duration::from_secs(1); @@ -325,12 +322,6 @@ mod tests { #[tokio::test] async fn throttling_is_enabled_once_throttling_error_is_received() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl))); let rate_limiter = ClientRateLimiter::builder() .previous_time_bucket(0.0) .time_of_last_throttle(0.0) @@ -349,13 +340,6 @@ mod tests { #[tokio::test] async fn test_calculated_rate_with_successes() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - sleep_impl.sleep(Duration::from_secs(5)).await; - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl.clone()))); let rate_limiter = ClientRateLimiter::builder() .time_of_last_throttle(5.0) .tokens_retrieved_per_second_at_time_of_last_throttle(10.0) @@ -414,13 +398,6 @@ mod tests { #[tokio::test] async fn test_calculated_rate_with_throttles() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - sleep_impl.sleep(Duration::from_secs(5)).await; - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl.clone()))); let rate_limiter = ClientRateLimiter::builder() .tokens_retrieved_per_second_at_time_of_last_throttle(10.0) .time_of_last_throttle(5.0) @@ -496,12 +473,7 @@ mod tests { #[tokio::test] async fn test_client_sending_rates() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl.clone()))); + let (_, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); let rate_limiter = ClientRateLimiter::builder().build(); struct Attempt { diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs index 088e7bfd8c5..1cdb94cae99 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs @@ -7,8 +7,9 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RetryClassifiers, RetryReason, RetryStrategy, ShouldAttempt, + ClassifyRetry, RetryReason, RetryStrategy, ShouldAttempt, }; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::time::Duration; @@ -34,13 +35,18 @@ impl FixedDelayRetryStrategy { } impl RetryStrategy for FixedDelayRetryStrategy { - fn should_attempt_initial_request(&self, _cfg: &ConfigBag) -> Result { + fn should_attempt_initial_request( + &self, + _runtime_components: &RuntimeComponents, + _cfg: &ConfigBag, + ) -> Result { Ok(ShouldAttempt::Yes) } fn should_attempt_retry( &self, ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { // Look a the result. If it's OK then we're done; No retry required. Otherwise, we need to inspect it @@ -65,8 +71,8 @@ impl RetryStrategy for FixedDelayRetryStrategy { return Ok(ShouldAttempt::No); } - let retry_classifiers = cfg - .load::() + let retry_classifiers = runtime_components + .retry_classifiers() .expect("a retry classifier is set"); let retry_reason = retry_classifiers.classify_retry(ctx); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs index c06a745a277..b59b8fb7f16 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs @@ -6,6 +6,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::retries::{RetryStrategy, ShouldAttempt}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; #[non_exhaustive] @@ -19,13 +20,18 @@ impl NeverRetryStrategy { } impl RetryStrategy for NeverRetryStrategy { - fn should_attempt_initial_request(&self, _cfg: &ConfigBag) -> Result { + fn should_attempt_initial_request( + &self, + _runtime_components: &RuntimeComponents, + _cfg: &ConfigBag, + ) -> Result { Ok(ShouldAttempt::Yes) } fn should_attempt_retry( &self, _context: &InterceptorContext, + _runtime_components: &RuntimeComponents, _cfg: &ConfigBag, ) -> Result { Ok(ShouldAttempt::No) diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index ecb29234f4d..ba8d08aa663 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -9,12 +9,12 @@ use crate::client::retries::strategy::standard::ReleaseResult::{ }; use crate::client::retries::token_bucket::TokenBucket; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; use aws_smithy_runtime_api::client::retries::{ ClassifyRetry, RetryReason, RetryStrategy, ShouldAttempt, }; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::retry::{ErrorKind, RetryConfig}; use std::sync::Mutex; @@ -96,6 +96,7 @@ impl StandardRetryStrategy { fn calculate_backoff( &self, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, retry_reason: Option<&RetryReason>, ) -> Result { @@ -108,8 +109,12 @@ impl StandardRetryStrategy { match retry_reason { Some(RetryReason::Explicit(backoff)) => Ok(*backoff), Some(RetryReason::Error(kind)) => { - update_rate_limiter_if_exists(cfg, *kind == ErrorKind::ThrottlingError); - if let Some(delay) = check_rate_limiter_for_delay(cfg, *kind) { + update_rate_limiter_if_exists( + runtime_components, + cfg, + *kind == ErrorKind::ThrottlingError, + ); + if let Some(delay) = check_rate_limiter_for_delay(runtime_components, cfg, *kind) { let delay = delay.min(self.max_backoff); debug!("rate limiter has requested a {delay:?} delay before retrying"); Ok(delay) @@ -138,7 +143,7 @@ impl StandardRetryStrategy { } Some(_) => unreachable!("RetryReason is non-exhaustive"), None => { - update_rate_limiter_if_exists(cfg, false); + update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, max_attempts = self.max_attempts, @@ -169,9 +174,13 @@ impl Default for StandardRetryStrategy { } impl RetryStrategy for StandardRetryStrategy { - fn should_attempt_initial_request(&self, cfg: &ConfigBag) -> Result { + fn should_attempt_initial_request( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result { if let Some(crl) = cfg.load::() { - let seconds_since_unix_epoch = get_seconds_since_unix_epoch(cfg); + let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components); if let Err(delay) = crl.acquire_permission_to_send_a_request( seconds_since_unix_epoch, RequestReason::InitialRequest, @@ -188,6 +197,7 @@ impl RetryStrategy for StandardRetryStrategy { fn should_attempt_retry( &self, ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { // Look a the result. If it's OK then we're done; No retry required. Otherwise, we need to inspect it @@ -207,7 +217,7 @@ impl RetryStrategy for StandardRetryStrategy { tb.regenerate_a_token(); } } - update_rate_limiter_if_exists(cfg, false); + update_rate_limiter_if_exists(runtime_components, cfg, false); return Ok(ShouldAttempt::No); } @@ -218,7 +228,7 @@ impl RetryStrategy for StandardRetryStrategy { .expect("at least one request attempt is made before any retry is attempted") .attempts(); if request_attempts >= self.max_attempts { - update_rate_limiter_if_exists(cfg, false); + update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, @@ -229,11 +239,13 @@ impl RetryStrategy for StandardRetryStrategy { } // Run the classifiers against the context to determine if we should retry - let retry_classifiers = cfg.retry_classifiers(); + let retry_classifiers = runtime_components + .retry_classifiers() + .ok_or("retry classifiers are required by the retry configuration")?; let retry_reason = retry_classifiers.classify_retry(ctx); // Calculate the appropriate backoff time. - let backoff = match self.calculate_backoff(cfg, retry_reason.as_ref()) { + let backoff = match self.calculate_backoff(runtime_components, cfg, retry_reason.as_ref()) { Ok(value) => value, // In some cases, backoff calculation will decide that we shouldn't retry at all. Err(value) => return Ok(value), @@ -248,23 +260,32 @@ impl RetryStrategy for StandardRetryStrategy { } } -fn update_rate_limiter_if_exists(cfg: &ConfigBag, is_throttling_error: bool) { +fn update_rate_limiter_if_exists( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + is_throttling_error: bool, +) { if let Some(crl) = cfg.load::() { - let seconds_since_unix_epoch = get_seconds_since_unix_epoch(cfg); + let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components); crl.update_rate_limiter(seconds_since_unix_epoch, is_throttling_error); } } -fn check_rate_limiter_for_delay(cfg: &ConfigBag, kind: ErrorKind) -> Option { +fn check_rate_limiter_for_delay( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + kind: ErrorKind, +) -> Option { if let Some(crl) = cfg.load::() { let retry_reason = if kind == ErrorKind::ThrottlingError { RequestReason::RetryTimeout } else { RequestReason::Retry }; - if let Err(delay) = crl - .acquire_permission_to_send_a_request(get_seconds_since_unix_epoch(cfg), retry_reason) - { + if let Err(delay) = crl.acquire_permission_to_send_a_request( + get_seconds_since_unix_epoch(runtime_components), + retry_reason, + ) { return Some(delay); } } @@ -276,8 +297,10 @@ fn calculate_exponential_backoff(base: f64, initial_backoff: f64, retry_attempts base * initial_backoff * 2_u32.pow(retry_attempts) as f64 } -fn get_seconds_since_unix_epoch(cfg: &ConfigBag) -> f64 { - let request_time = cfg.request_time().unwrap(); +fn get_seconds_since_unix_epoch(runtime_components: &RuntimeComponents) -> f64 { + let request_time = runtime_components + .time_source() + .expect("time source required for retries"); request_time .now() .duration_since(SystemTime::UNIX_EPOCH) @@ -292,6 +315,7 @@ mod tests { use aws_smithy_runtime_api::client::retries::{ AlwaysRetry, ClassifyRetry, RetryClassifiers, RetryReason, RetryStrategy, }; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; use aws_smithy_types::type_erasure::TypeErasedBox; @@ -305,11 +329,12 @@ mod tests { #[test] fn no_retry_necessary_for_ok_result() { let cfg = ConfigBag::base(); + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); let strategy = StandardRetryStrategy::default(); ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); let actual = strategy - .should_attempt_retry(&ctx, &cfg) + .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); assert_eq!(ShouldAttempt::No, actual); } @@ -317,26 +342,29 @@ mod tests { fn set_up_cfg_and_context( error_kind: ErrorKind, current_request_attempts: u32, - ) -> (InterceptorContext, ConfigBag) { + ) -> (InterceptorContext, RuntimeComponents, ConfigBag) { let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); + let rc = RuntimeComponentsBuilder::for_tests() + .with_retry_classifiers(Some( + RetryClassifiers::new().with_classifier(AlwaysRetry(error_kind)), + )) + .build() + .unwrap(); let mut layer = Layer::new("test"); - layer.set_retry_classifiers( - RetryClassifiers::new().with_classifier(AlwaysRetry(error_kind)), - ); layer.store_put(RequestAttempts::new(current_request_attempts)); let cfg = ConfigBag::of_layers(vec![layer]); - (ctx, cfg) + (ctx, rc, cfg) } // Test that error kinds produce the correct "retry after X seconds" output. // All error kinds are handled in the same way for the standard strategy. fn test_should_retry_error_kind(error_kind: ErrorKind) { - let (ctx, cfg) = set_up_cfg_and_context(error_kind, 3); + let (ctx, rc, cfg) = set_up_cfg_and_context(error_kind, 3); let strategy = StandardRetryStrategy::default().with_base(|| 1.0); let actual = strategy - .should_attempt_retry(&ctx, &cfg) + .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); assert_eq!(ShouldAttempt::YesAfterDelay(Duration::from_secs(4)), actual); } @@ -365,12 +393,12 @@ mod tests { fn dont_retry_when_out_of_attempts() { let current_attempts = 4; let max_attempts = current_attempts; - let (ctx, cfg) = set_up_cfg_and_context(ErrorKind::TransientError, current_attempts); + let (ctx, rc, cfg) = set_up_cfg_and_context(ErrorKind::TransientError, current_attempts); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(max_attempts); let actual = strategy - .should_attempt_retry(&ctx, &cfg) + .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); assert_eq!(ShouldAttempt::No, actual); } @@ -431,23 +459,28 @@ mod tests { } #[cfg(feature = "test-util")] - fn setup_test(retry_reasons: Vec) -> (ConfigBag, InterceptorContext) { - let mut cfg = ConfigBag::base(); - cfg.interceptor_state().set_retry_classifiers( - RetryClassifiers::new() - .with_classifier(PresetReasonRetryClassifier::new(retry_reasons)), - ); + fn setup_test( + retry_reasons: Vec, + ) -> (ConfigBag, RuntimeComponents, InterceptorContext) { + let rc = RuntimeComponentsBuilder::for_tests() + .with_retry_classifiers(Some( + RetryClassifiers::new() + .with_classifier(PresetReasonRetryClassifier::new(retry_reasons)), + )) + .build() + .unwrap(); + let cfg = ConfigBag::base(); let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); // This type doesn't matter b/c the classifier will just return whatever we tell it to. ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); - (cfg, ctx) + (cfg, rc, ctx) } #[cfg(feature = "test-util")] #[test] fn eventual_success() { - let (mut cfg, mut ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, mut ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5); @@ -455,13 +488,13 @@ mod tests { let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); @@ -469,7 +502,7 @@ mod tests { ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 495); } @@ -477,7 +510,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_more_attempts() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(3); @@ -485,19 +518,19 @@ mod tests { let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 490); } @@ -505,7 +538,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_quota() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5); @@ -513,13 +546,13 @@ mod tests { let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 0); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 0); } @@ -527,7 +560,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn quota_replenishes_on_success() { - let (mut cfg, mut ctx) = setup_test(vec![ + let (mut cfg, rc, mut ctx) = setup_test(vec![ RetryReason::Error(ErrorKind::TransientError), RetryReason::Explicit(Duration::from_secs(1)), ]); @@ -538,13 +571,13 @@ mod tests { let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 90); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 90); @@ -552,7 +585,7 @@ mod tests { ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 100); @@ -562,7 +595,8 @@ mod tests { #[test] fn quota_replenishes_on_first_try_success() { const PERMIT_COUNT: usize = 20; - let (mut cfg, mut ctx) = setup_test(vec![RetryReason::Error(ErrorKind::TransientError)]); + let (mut cfg, rc, mut ctx) = + setup_test(vec![RetryReason::Error(ErrorKind::TransientError)]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(u32::MAX); @@ -581,7 +615,7 @@ mod tests { cfg.interceptor_state() .store_put(RequestAttempts::new(attempt)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert!(matches!(should_retry, ShouldAttempt::YesAfterDelay(_))); attempt += 1; } @@ -600,7 +634,7 @@ mod tests { cfg.interceptor_state() .store_put(RequestAttempts::new(attempt)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); attempt += 1; } @@ -612,7 +646,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn backoff_timing() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5); @@ -620,31 +654,31 @@ mod tests { let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(4)); assert_eq!(token_bucket.available_permits(), 485); cfg.interceptor_state().store_put(RequestAttempts::new(4)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(8)); assert_eq!(token_bucket.available_permits(), 480); cfg.interceptor_state().store_put(RequestAttempts::new(5)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 480); } @@ -652,7 +686,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn max_backoff_time() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5) @@ -662,31 +696,31 @@ mod tests { let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(3)); assert_eq!(token_bucket.available_permits(), 485); cfg.interceptor_state().store_put(RequestAttempts::new(4)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(3)); assert_eq!(token_bucket.available_permits(), 480); cfg.interceptor_state().store_put(RequestAttempts::new(5)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 480); } diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs index 4c2a34af117..957f04bab39 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs @@ -8,6 +8,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::fmt; @@ -34,6 +35,7 @@ where fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { (self.f)(context, cfg); @@ -41,34 +43,3 @@ where Ok(()) } } - -#[cfg(test)] -mod tests { - use super::*; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_types::type_erasure::TypedBox; - use std::time::{Duration, UNIX_EPOCH}; - - #[test] - fn set_test_request_time() { - let mut cfg = ConfigBag::base(); - let mut ctx = InterceptorContext::new(TypedBox::new("anything").erase()); - ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); - let _ = ctx.take_input(); - ctx.enter_before_transmit_phase(); - let mut ctx = Into::into(&mut ctx); - let request_time = UNIX_EPOCH + Duration::from_secs(1624036048); - let interceptor = TestParamsSetterInterceptor::new( - move |_: &mut BeforeTransmitInterceptorContextMut<'_>, cfg: &mut ConfigBag| { - cfg.interceptor_state().set_request_time(request_time); - }, - ); - interceptor - .modify_before_signing(&mut ctx, &mut cfg) - .unwrap(); - assert_eq!(cfg.request_time().unwrap().now(), request_time); - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs index e1ba3aec636..c149878dda8 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs @@ -6,8 +6,8 @@ use aws_smithy_async::future::timeout::Timeout; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; use aws_smithy_client::SdkError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::timeout::TimeoutConfig; use pin_project_lite::pin_project; @@ -109,14 +109,14 @@ pub(super) struct MaybeTimeoutConfig { timeout_kind: TimeoutKind, } -pub(super) trait ProvideMaybeTimeoutConfig { - fn maybe_timeout_config(&self, timeout_kind: TimeoutKind) -> MaybeTimeoutConfig; -} - -impl ProvideMaybeTimeoutConfig for ConfigBag { - fn maybe_timeout_config(&self, timeout_kind: TimeoutKind) -> MaybeTimeoutConfig { - if let Some(timeout_config) = self.load::() { - let sleep_impl = self.sleep_impl(); +impl MaybeTimeoutConfig { + pub(super) fn new( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + timeout_kind: TimeoutKind, + ) -> MaybeTimeoutConfig { + if let Some(timeout_config) = cfg.load::() { + let sleep_impl = runtime_components.sleep_impl(); let timeout = match (sleep_impl.as_ref(), timeout_kind) { (None, _) => None, (Some(_), TimeoutKind::Operation) => timeout_config.operation_timeout(), @@ -142,23 +142,14 @@ impl ProvideMaybeTimeoutConfig for ConfigBag { /// Trait to conveniently wrap a future with an optional timeout. pub(super) trait MaybeTimeout: Sized { /// Wraps a future in a timeout if one is set. - fn maybe_timeout_with_config( - self, - timeout_config: MaybeTimeoutConfig, - ) -> MaybeTimeoutFuture; - - /// Wraps a future in a timeout if one is set. - fn maybe_timeout(self, cfg: &ConfigBag, kind: TimeoutKind) -> MaybeTimeoutFuture; + fn maybe_timeout(self, timeout_config: MaybeTimeoutConfig) -> MaybeTimeoutFuture; } impl MaybeTimeout for T where T: Future, { - fn maybe_timeout_with_config( - self, - timeout_config: MaybeTimeoutConfig, - ) -> MaybeTimeoutFuture { + fn maybe_timeout(self, timeout_config: MaybeTimeoutConfig) -> MaybeTimeoutFuture { match timeout_config { MaybeTimeoutConfig { sleep_impl: Some(sleep_impl), @@ -172,22 +163,18 @@ where _ => MaybeTimeoutFuture::NoTimeout { future: self }, } } - - fn maybe_timeout(self, cfg: &ConfigBag, kind: TimeoutKind) -> MaybeTimeoutFuture { - self.maybe_timeout_with_config(cfg.maybe_timeout_config(kind)) - } } #[cfg(test)] mod tests { - use crate::client::timeout::{MaybeTimeout, TimeoutKind}; + use super::*; use aws_smithy_async::assert_elapsed; use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, TokioSleep}; use aws_smithy_http::result::SdkError; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::config_bag::{CloneableLayer, ConfigBag}; use aws_smithy_types::timeout::TimeoutConfig; use std::time::Duration; @@ -203,14 +190,19 @@ mod tests { let now = tokio::time::Instant::now(); tokio::time::pause(); - let mut cfg = ConfigBag::base(); - let mut timeout_config = Layer::new("timeout"); + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_sleep_impl(Some(sleep_impl)) + .build() + .unwrap(); + + let mut timeout_config = CloneableLayer::new("timeout"); timeout_config.store_put(TimeoutConfig::builder().build()); - timeout_config.set_sleep_impl(Some(sleep_impl)); - cfg.push_layer(timeout_config); + let cfg = ConfigBag::of_layers(vec![timeout_config.into()]); + let maybe_timeout = + MaybeTimeoutConfig::new(&runtime_components, &cfg, TimeoutKind::Operation); underlying_future - .maybe_timeout(&cfg, TimeoutKind::Operation) + .maybe_timeout(maybe_timeout) .await .expect("success"); @@ -229,19 +221,21 @@ mod tests { let now = tokio::time::Instant::now(); tokio::time::pause(); - let mut cfg = ConfigBag::base(); - let mut timeout_config = Layer::new("timeout"); + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_sleep_impl(Some(sleep_impl)) + .build() + .unwrap(); + let mut timeout_config = CloneableLayer::new("timeout"); timeout_config.store_put( TimeoutConfig::builder() .operation_timeout(Duration::from_millis(250)) .build(), ); - timeout_config.set_sleep_impl(Some(sleep_impl)); - cfg.push_layer(timeout_config); + let cfg = ConfigBag::of_layers(vec![timeout_config.into()]); - let result = underlying_future - .maybe_timeout(&cfg, TimeoutKind::Operation) - .await; + let maybe_timeout = + MaybeTimeoutConfig::new(&runtime_components, &cfg, TimeoutKind::Operation); + let result = underlying_future.maybe_timeout(maybe_timeout).await; let err = result.expect_err("should have timed out"); assert_eq!(format!("{:?}", err), "TimeoutError(TimeoutError { source: MaybeTimeoutError { kind: Operation, duration: 250ms } })"); diff --git a/rust-runtime/aws-smithy-types/src/config_bag.rs b/rust-runtime/aws-smithy-types/src/config_bag.rs index f293dbea180..42adec399eb 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag.rs @@ -119,7 +119,7 @@ impl CloneableLayer { /// Removes `T` from this bag pub fn unset(&mut self) -> &mut Self { - self.0.unset::(); + self.put_directly_cloneable::>(Value::ExplicitlyUnset(type_name::())); self } @@ -851,6 +851,10 @@ mod test { let layer_1_cloned = layer_1.clone(); assert_eq!(expected_str, &layer_1_cloned.load::().unwrap().0); + // Should still be cloneable after unsetting a field + layer_1.unset::(); + assert!(layer_1.try_clone().unwrap().load::().is_none()); + #[derive(Clone, Debug)] struct Rope(String); impl Storable for Rope { diff --git a/rust-runtime/inlineable/src/client_http_checksum_required.rs b/rust-runtime/inlineable/src/client_http_checksum_required.rs index 636016a3fc1..50fe4d18e13 100644 --- a/rust-runtime/inlineable/src/client_http_checksum_required.rs +++ b/rust-runtime/inlineable/src/client_http_checksum_required.rs @@ -5,20 +5,33 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorRegistrar, SharedInterceptor, +use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, }; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::base64; use aws_smithy_types::config_bag::ConfigBag; use http::header::HeaderName; +use std::borrow::Cow; #[derive(Debug)] -pub(crate) struct HttpChecksumRequiredRuntimePlugin; +pub(crate) struct HttpChecksumRequiredRuntimePlugin { + runtime_components: RuntimeComponentsBuilder, +} + +impl HttpChecksumRequiredRuntimePlugin { + pub(crate) fn new() -> Self { + Self { + runtime_components: RuntimeComponentsBuilder::new("HttpChecksumRequiredRuntimePlugin") + .with_interceptor(SharedInterceptor::new(HttpChecksumRequiredInterceptor)), + } + } +} impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(HttpChecksumRequiredInterceptor)); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) } } @@ -29,6 +42,7 @@ impl Interceptor for HttpChecksumRequiredInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let request = context.request_mut(); diff --git a/rust-runtime/inlineable/src/client_idempotency_token.rs b/rust-runtime/inlineable/src/client_idempotency_token.rs index cf4d2d7e53c..5e46f6a01ee 100644 --- a/rust-runtime/inlineable/src/client_idempotency_token.rs +++ b/rust-runtime/inlineable/src/client_idempotency_token.rs @@ -8,16 +8,18 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, Input, }; -use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorRegistrar, SharedInterceptor, +use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, }; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::config_bag::ConfigBag; +use std::borrow::Cow; use std::fmt; #[derive(Debug)] pub(crate) struct IdempotencyTokenRuntimePlugin { - interceptor: SharedInterceptor, + runtime_components: RuntimeComponentsBuilder, } impl IdempotencyTokenRuntimePlugin { @@ -26,14 +28,17 @@ impl IdempotencyTokenRuntimePlugin { S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync + 'static, { Self { - interceptor: SharedInterceptor::new(IdempotencyTokenInterceptor { set_token }), + runtime_components: RuntimeComponentsBuilder::new("IdempotencyTokenRuntimePlugin") + .with_interceptor(SharedInterceptor::new(IdempotencyTokenInterceptor { + set_token, + })), } } } impl RuntimePlugin for IdempotencyTokenRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(self.interceptor.clone()); + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) } } @@ -54,6 +59,7 @@ where fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let token_provider = cfg diff --git a/tools/ci-scripts/check-aws-sdk-orchestrator-impl b/tools/ci-scripts/check-aws-sdk-orchestrator-impl index a434b07761b..0104e7f03d3 100755 --- a/tools/ci-scripts/check-aws-sdk-orchestrator-impl +++ b/tools/ci-scripts/check-aws-sdk-orchestrator-impl @@ -31,6 +31,7 @@ services_that_pass_tests=(\ "polly"\ "qldbsession"\ "route53"\ + "s3"\ "s3control"\ "sso"\ "sts"\ From 3d1c34d3aa8a35b3d6943d489ef34954c8a680b3 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 12 Jul 2023 18:31:28 -0700 Subject: [PATCH 012/331] Fix panic from repeat clones of `TypeErasedBox` (#2842) This PR fixes a panic that would result from cloning a cloneable `TypeErasedBox` twice. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-types/src/config_bag.rs | 7 +++++++ .../aws-smithy-types/src/type_erasure.rs | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/rust-runtime/aws-smithy-types/src/config_bag.rs b/rust-runtime/aws-smithy-types/src/config_bag.rs index 42adec399eb..cf17108f2c7 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag.rs @@ -855,6 +855,13 @@ mod test { layer_1.unset::(); assert!(layer_1.try_clone().unwrap().load::().is_none()); + // It is cloneable multiple times in succession + let _ = layer_1 + .try_clone() + .expect("clone 1") + .try_clone() + .expect("clone 2"); + #[derive(Clone, Debug)] struct Rope(String); impl Storable for Rope { diff --git a/rust-runtime/aws-smithy-types/src/type_erasure.rs b/rust-runtime/aws-smithy-types/src/type_erasure.rs index 26655856407..5f4cc080543 100644 --- a/rust-runtime/aws-smithy-types/src/type_erasure.rs +++ b/rust-runtime/aws-smithy-types/src/type_erasure.rs @@ -122,7 +122,13 @@ impl TypeErasedBox { impl fmt::Debug for TypeErasedBox { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("TypeErasedBox:")?; + f.write_str("TypeErasedBox[")?; + if self.clone.is_some() { + f.write_str("Clone")?; + } else { + f.write_str("!Clone")?; + } + f.write_str("]:")?; (self.debug)(&self.field, f) } } @@ -145,7 +151,7 @@ impl TypeErasedBox { fmt::Debug::fmt(value.downcast_ref::().expect("type-checked"), f) }; let clone = |value: &Box| { - TypeErasedBox::new(value.downcast_ref::().expect("typechecked").clone()) + TypeErasedBox::new_with_clone(value.downcast_ref::().expect("typechecked").clone()) }; Self { field: Box::new(value), @@ -292,8 +298,11 @@ mod tests { .0 = "3"; let bar_erased = bar.erase(); - assert_eq!("TypeErasedBox:Foo(\"3\")", format!("{foo_erased:?}")); - assert_eq!("TypeErasedBox:Bar(2)", format!("{bar_erased:?}")); + assert_eq!( + "TypeErasedBox[!Clone]:Foo(\"3\")", + format!("{foo_erased:?}") + ); + assert_eq!("TypeErasedBox[!Clone]:Bar(2)", format!("{bar_erased:?}")); let bar_erased = TypedBox::::assume_from(bar_erased).expect_err("it's not a Foo"); let mut bar = TypedBox::::assume_from(bar_erased).expect("it's a Bar"); From 26827f1acab8c061ec27dbfcc342648f93141668 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 13 Jul 2023 13:35:55 -0700 Subject: [PATCH 013/331] Don't allow `test-util` feature in compile time dependencies (#2843) During the orchestrator implementation, a bug was introduced that always enabled the `test-util` feature on `aws-smithy-runtime` in the generated crates. This led to several pieces of non-test code relying on test-only code, specifically around `SystemTime` implementing `TimeSource`. This PR fixes that issue, and also fixes another issue where the `RuntimeComponentsBuilder` was being initialized without a name for the service config. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-config/src/provider_config.rs | 3 +- aws/rust-runtime/aws-config/src/sts/util.rs | 3 +- .../AwsCustomizableOperationDecorator.kt | 69 +++++++++++++++---- .../smithy/rustsdk/AwsPresigningDecorator.kt | 4 +- .../rustsdk/IntegrationTestDependencies.kt | 6 +- aws/sdk/integration-tests/s3/Cargo.toml | 2 +- .../config/ServiceConfigGenerator.kt | 24 ++++++- .../customizations/HttpAuthDecoratorTest.kt | 2 +- .../MetadataCustomizationTest.kt | 2 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 4 +- .../client/FluentClientGeneratorTest.kt | 2 + codegen-core/build.gradle.kts | 3 +- .../codegen/core/rustlang/CargoDependency.kt | 21 ++++-- .../rust/codegen/core/rustlang/RustWriter.kt | 9 +++ .../codegen/core/smithy/CodegenDelegator.kt | 7 +- .../smithy/generators/CargoTomlGenerator.kt | 44 +++++++++--- .../smithy/rust/codegen/core/testutil/Rust.kt | 37 ++++++---- .../core/rustlang/CargoDependencyTest.kt | 48 +++++++++++++ .../core/smithy/CodegenDelegatorTest.kt | 23 ++++++- .../src/client/runtime_components.rs | 6 +- .../src/client/orchestrator.rs | 2 +- .../src/client/test_util.rs | 1 - .../src/client/test_util/interceptors.rs | 45 ------------ 23 files changed, 255 insertions(+), 112 deletions(-) create mode 100644 codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index afa29898111..27bc23108dd 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -91,6 +91,7 @@ impl ProviderConfig { /// Unlike [`ProviderConfig::empty`] where `env` and `fs` will use their non-mocked implementations, /// this method will use an empty mock environment and an empty mock file system. pub fn no_configuration() -> Self { + use aws_smithy_async::time::StaticTimeSource; use std::collections::HashMap; use std::time::UNIX_EPOCH; let fs = Fs::from_raw_map(HashMap::new()); @@ -100,7 +101,7 @@ impl ProviderConfig { profile_files: ProfileFiles::default(), env, fs, - time_source: SharedTimeSource::new(UNIX_EPOCH), + time_source: SharedTimeSource::new(StaticTimeSource::new(UNIX_EPOCH)), connector: HttpConnector::Prebuilt(None), sleep: None, region: None, diff --git a/aws/rust-runtime/aws-config/src/sts/util.rs b/aws/rust-runtime/aws-config/src/sts/util.rs index c4fd630aef7..bc6151985d1 100644 --- a/aws/rust-runtime/aws-config/src/sts/util.rs +++ b/aws/rust-runtime/aws-config/src/sts/util.rs @@ -7,7 +7,6 @@ use aws_credential_types::provider::{self, error::CredentialsError}; use aws_credential_types::Credentials as AwsCredentials; use aws_sdk_sts::types::Credentials as StsCredentials; -use aws_smithy_async::time::TimeSource; use std::convert::TryFrom; use std::time::{SystemTime, UNIX_EPOCH}; @@ -47,6 +46,6 @@ pub(crate) fn into_credentials( /// provide a name for the session, the provider will choose a name composed of a base + a timestamp, /// e.g. `profile-file-provider-123456789` pub(crate) fn default_session_name(base: &str, ts: SystemTime) -> String { - let now = ts.now().duration_since(UNIX_EPOCH).expect("post epoch"); + let now = ts.duration_since(UNIX_EPOCH).expect("post epoch"); format!("{}-{}", base, now.as_millis()) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt index 08d58134d4a..6af6bfde0d9 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt @@ -5,6 +5,7 @@ package software.amazon.smithy.rustsdk +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationSection import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -18,28 +19,70 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : CustomizableOperationCustomization() { private val codegenScope = arrayOf( *RuntimeType.preludeScope, - "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig) - .resolve("user_agent::AwsUserAgent"), + "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent::AwsUserAgent"), "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), "ConfigBag" to RuntimeType.configBag(runtimeConfig), "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "http" to CargoDependency.Http.toType(), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::runtime_plugin::StaticRuntimePlugin"), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), - "SharedTimeSource" to CargoDependency.smithyAsync(runtimeConfig).withFeature("test-util").toType() - .resolve("time::SharedTimeSource"), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::interceptors::SharedInterceptor"), - "TestParamsSetterInterceptor" to CargoDependency.smithyRuntime(runtimeConfig).withFeature("test-util") - .toType().resolve("client::test_util::interceptors::TestParamsSetterInterceptor"), + "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), + "SharedTimeSource" to CargoDependency.smithyAsync(runtimeConfig).toType().resolve("time::SharedTimeSource"), + "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::StaticRuntimePlugin"), + "StaticTimeSource" to CargoDependency.smithyAsync(runtimeConfig).toType().resolve("time::StaticTimeSource"), + "TestParamsSetterInterceptor" to testParamsSetterInterceptor(), ) + // TODO(enableNewSmithyRuntimeCleanup): Delete this once test helpers on `CustomizableOperation` have been removed + private fun testParamsSetterInterceptor(): RuntimeType = RuntimeType.forInlineFun("TestParamsSetterInterceptor", ClientRustModule.Client.customize) { + rustTemplate( + """ + mod test_params_setter_interceptor { + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; + use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::config_bag::ConfigBag; + use std::fmt; + + pub(super) struct TestParamsSetterInterceptor { f: F } + + impl fmt::Debug for TestParamsSetterInterceptor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "TestParamsSetterInterceptor") + } + } + + impl TestParamsSetterInterceptor { + pub fn new(f: F) -> Self { Self { f } } + } + + impl Interceptor for TestParamsSetterInterceptor + where + F: Fn(&mut BeforeTransmitInterceptorContextMut<'_>, &mut ConfigBag) + Send + Sync + 'static, + { + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + (self.f)(context, cfg); + Ok(()) + } + } + } + use test_params_setter_interceptor::TestParamsSetterInterceptor; + """, + *codegenScope, + ) + } + override fun section(section: CustomizableOperationSection): Writable = writable { if (section is CustomizableOperationSection.CustomizableOperationImpl) { if (section.isRuntimeModeOrchestrator) { + // TODO(enableNewSmithyRuntimeCleanup): Delete these utilities rustTemplate( """ ##[doc(hidden)] @@ -49,7 +92,7 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : #{StaticRuntimePlugin}::new() .with_runtime_components( #{RuntimeComponentsBuilder}::new("request_time_for_tests") - .with_time_source(Some(#{SharedTimeSource}::new(request_time))) + .with_time_source(Some(#{SharedTimeSource}::new(#{StaticTimeSource}::new(request_time)))) ) ) } @@ -92,7 +135,9 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : ##[doc(hidden)] // This is a temporary method for testing. NEVER use it in production pub fn request_time_for_tests(mut self, request_time: ::std::time::SystemTime) -> Self { - self.operation.properties_mut().insert(#{SharedTimeSource}::new(request_time)); + self.operation.properties_mut().insert( + #{SharedTimeSource}::new(#{StaticTimeSource}::new(request_time)) + ); self } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index ef59287b35d..f236a08f49e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -216,10 +216,12 @@ class AwsInputPresignedMethod( """ // Change signature type to query params and wire up presigning config let mut props = request.properties_mut(); - props.insert(#{SharedTimeSource}::new(presigning_config.start_time())); + props.insert(#{SharedTimeSource}::new(#{StaticTimeSource}::new(presigning_config.start_time()))); """, "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig) .resolve("time::SharedTimeSource"), + "StaticTimeSource" to RuntimeType.smithyAsync(runtimeConfig) + .resolve("time::StaticTimeSource"), ) withBlock("props.insert(", ");") { rustTemplate( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index 8bdfe0cdc13..a091664c1a4 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -80,14 +80,14 @@ class IntegrationTestDependencies( override fun section(section: LibRsSection) = when (section) { is LibRsSection.Body -> testDependenciesOnly { if (hasTests) { - val smithyClient = CargoDependency.smithyClient(codegenContext.runtimeConfig) - .copy(features = setOf("test-util"), scope = DependencyScope.Dev) val smithyAsync = CargoDependency.smithyAsync(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) + val smithyClient = CargoDependency.smithyClient(codegenContext.runtimeConfig) + .copy(features = setOf("test-util"), scope = DependencyScope.Dev) val smithyTypes = CargoDependency.smithyTypes(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) - addDependency(smithyClient) addDependency(smithyAsync) + addDependency(smithyClient) addDependency(smithyTypes) addDependency(CargoDependency.smithyProtocolTestHelpers(codegenContext.runtimeConfig)) addDependency(SerdeJson) diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 8a27b1cd2c7..c504dba38d9 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -17,7 +17,7 @@ aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } -aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["rt-tokio"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index f3cbe633af3..8d93ae88fc6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -22,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.docsOrFallback import software.amazon.smithy.rust.codegen.core.rustlang.raw import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig @@ -374,9 +375,10 @@ class ServiceConfigGenerator( } writer.docs("Builder for creating a `Config`.") - writer.raw("#[derive(Clone, Default)]") - if (runtimeMode.defaultToOrchestrator) { - Attribute(Attribute.derive(RuntimeType.Debug)).render(writer) + if (runtimeMode.defaultToMiddleware) { + writer.raw("#[derive(Clone, Default)]") + } else { + writer.raw("#[derive(Clone, Debug)]") } writer.rustBlock("pub struct Builder") { if (runtimeMode.defaultToOrchestrator) { @@ -406,6 +408,22 @@ class ServiceConfigGenerator( """, ) } + } else { + // Custom implementation of Default to give the runtime components builder a name + writer.rustBlockTemplate("impl #{Default} for Builder", *codegenScope) { + writer.rustTemplate( + """ + fn default() -> Self { + Self { + config: #{Default}::default(), + runtime_components: #{RuntimeComponentsBuilder}::new("service config"), + runtime_plugins: #{Default}::default(), + } + } + """, + *codegenScope, + ) + } } writer.rustBlock("impl Builder") { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index 92f653bf1b7..474ed7b43e6 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -19,7 +19,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.integrationTest class HttpAuthDecoratorTest { private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( "TestConnection" to CargoDependency.smithyClient(runtimeConfig) - .withFeature("test-util").toType() + .toDevDependency().withFeature("test-util").toType() .resolve("test_connection::TestConnection"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), ) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 97d88c16805..0f087d50ad9 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -52,7 +52,7 @@ class MetadataCustomizationTest { .resolve("client::runtime_components::RuntimeComponents"), ) rustCrate.testModule { - addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) + addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) tokioTest("test_extract_metadata_via_customizable_operation") { rustTemplate( """ diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 086a2119159..40f82d29657 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -52,7 +52,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), ) rustCrate.testModule { - addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) + addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) tokioTest("test_operation_overrides_endpoint_resolver") { rustTemplate( """ @@ -97,7 +97,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), ) rustCrate.testModule { - addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) + addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) tokioTest("test_operation_overrides_http_connection") { rustTemplate( """ diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index de6b6f175e3..1e02493212e 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -62,6 +62,7 @@ class FluentClientGeneratorTest { } """, "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + .toDevDependency() .withFeature("test-util").toType() .resolve("test_connection::TestConnection"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), @@ -108,6 +109,7 @@ class FluentClientGeneratorTest { } """, "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + .toDevDependency() .withFeature("test-util").toType() .resolve("test_connection::TestConnection"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), diff --git a/codegen-core/build.gradle.kts b/codegen-core/build.gradle.kts index 393eb4dfa73..556088f8a09 100644 --- a/codegen-core/build.gradle.kts +++ b/codegen-core/build.gradle.kts @@ -112,12 +112,11 @@ if (isTestingEnabled.toBoolean()) { tasks.test { useJUnitPlatform() testLogging { - events("passed", "skipped", "failed") + events("failed") exceptionFormat = TestExceptionFormat.FULL showCauses = true showExceptions = true showStackTraces = true - showStandardStreams = true } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index b91020fe3fd..8dad31b91c0 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -13,11 +13,11 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.util.dq import java.nio.file.Path -sealed class DependencyScope { - object Dev : DependencyScope() - object Compile : DependencyScope() - object CfgUnstable : DependencyScope() - object Build : DependencyScope() +enum class DependencyScope { + Build, + CfgUnstable, + Compile, + Dev, } sealed class DependencyLocation @@ -136,6 +136,8 @@ fun InlineDependency.toType() = RuntimeType(module.fullyQualifiedPath(), this) data class Feature(val name: String, val default: Boolean, val deps: List) +val DEV_ONLY_FEATURES = setOf("test-util") + /** * A dependency on an internal or external Cargo Crate */ @@ -150,6 +152,12 @@ data class CargoDependency( ) : RustDependency(name) { val key: Triple get() = Triple(name, location, scope) + init { + if (scope != DependencyScope.Dev && DEV_ONLY_FEATURES.any { features.contains(it) }) { + throw IllegalArgumentException("The `test-util` feature cannot be used outside of DependencyScope.Dev") + } + } + fun withFeature(feature: String): CargoDependency { return copy(features = features.toMutableSet().apply { add(feature) }) } @@ -205,7 +213,8 @@ data class CargoDependency( attribs.add("features = [${joinToString(",") { it.dq() }}]") } } - return "$name = { ${attribs.joinToString(",")} }" + attribs.add("scope = $scope") + return "$name = { ${attribs.joinToString(", ")} }" } fun toType(): RuntimeType { diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt index 9dece19f8b6..dd17595c5f1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt @@ -498,6 +498,15 @@ class RustWriter private constructor( } } + fun toml(fileName: String, debugMode: Boolean = false): RustWriter = + RustWriter( + fileName, + namespace = "ignore", + commentCharacter = "#", + printWarning = false, + debugMode = debugMode, + ) + private fun rawWriter(fileName: String, debugMode: Boolean): RustWriter = RustWriter( fileName, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt index 157a6f2539e..5ae40c3574d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.codegen.core.WriterDelegator import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.DEV_ONLY_FEATURES import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency @@ -298,7 +299,9 @@ internal fun List.mergeIdenticalTestDependencies(): List + dep.scope == DependencyScope.Dev && + DEV_ONLY_FEATURES.none { devOnly -> dep.features.contains(devOnly) } && + compileDeps.contains(dep.copy(scope = DependencyScope.Compile)) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt index 86c76c521a0..b5eca73acd8 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt @@ -43,12 +43,36 @@ typealias ManifestCustomizations = Map * Generates the crate manifest Cargo.toml file. */ class CargoTomlGenerator( - private val settings: CoreRustSettings, + private val moduleName: String, + private val moduleVersion: String, + private val moduleAuthors: List, + private val moduleDescription: String?, + private val moduleLicense: String?, + private val moduleRepository: String?, private val writer: RustWriter, - private val manifestCustomizations: ManifestCustomizations, - private val dependencies: List, - private val features: List, + private val manifestCustomizations: ManifestCustomizations = emptyMap(), + private val dependencies: List = emptyList(), + private val features: List = emptyList(), ) { + constructor( + settings: CoreRustSettings, + writer: RustWriter, + manifestCustomizations: ManifestCustomizations, + dependencies: List, + features: List, + ) : this( + settings.moduleName, + settings.moduleVersion, + settings.moduleAuthors, + settings.moduleDescription, + settings.license, + settings.moduleRepository, + writer, + manifestCustomizations, + dependencies, + features, + ) + fun render() { val cargoFeatures = features.map { it.name to it.deps }.toMutableList() if (features.isNotEmpty()) { @@ -57,13 +81,13 @@ class CargoTomlGenerator( val cargoToml = mapOf( "package" to listOfNotNull( - "name" to settings.moduleName, - "version" to settings.moduleVersion, - "authors" to settings.moduleAuthors, - settings.moduleDescription?.let { "description" to it }, + "name" to moduleName, + "version" to moduleVersion, + "authors" to moduleAuthors, + moduleDescription?.let { "description" to it }, "edition" to "2021", - "license" to settings.license, - "repository" to settings.moduleRepository, + "license" to moduleLicense, + "repository" to moduleRepository, "metadata" to listOfNotNull( "smithy" to listOfNotNull( "codegen-version" to Version.fullVersion(), diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index 2bf386a5196..8f8e6ff8b5a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -32,8 +32,10 @@ import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.CargoTomlGenerator +import software.amazon.smithy.rust.codegen.core.smithy.mergeDependencyFeatures +import software.amazon.smithy.rust.codegen.core.smithy.mergeIdenticalTestDependencies import software.amazon.smithy.rust.codegen.core.util.CommandError -import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.orNullIfEmpty import software.amazon.smithy.rust.codegen.core.util.runCommand @@ -369,14 +371,19 @@ fun RustWriter.compileAndTest( clippy: Boolean = false, expectFailure: Boolean = false, ): String { - val deps = this.dependencies.map { RustDependency.fromSymbolDependency(it) }.filterIsInstance() + val deps = this.dependencies + .map { RustDependency.fromSymbolDependency(it) } + .filterIsInstance() + .distinct() + .mergeDependencyFeatures() + .mergeIdenticalTestDependencies() val module = if (this.namespace.contains("::")) { this.namespace.split("::")[1] } else { "lib" } val tempDir = this.toString() - .intoCrate(deps.toSet(), module = module, main = main, strict = clippy) + .intoCrate(deps, module = module, main = main, strict = clippy) val mainRs = tempDir.resolve("src/main.rs") val testModule = tempDir.resolve("src/$module.rs") try { @@ -398,23 +405,25 @@ fun RustWriter.compileAndTest( } private fun String.intoCrate( - deps: Set, + deps: List, module: String? = null, main: String = "", strict: Boolean = false, ): File { this.shouldParseAsRust() val tempDir = TestWorkspace.subproject() - val cargoToml = """ - [package] - name = ${tempDir.nameWithoutExtension.dq()} - version = "0.0.1" - authors = ["rcoh@amazon.com"] - edition = "2021" - - [dependencies] - ${deps.joinToString("\n") { it.toString() }} - """.trimIndent() + val cargoToml = RustWriter.toml("Cargo.toml").apply { + CargoTomlGenerator( + moduleName = tempDir.nameWithoutExtension, + moduleVersion = "0.0.1", + moduleAuthors = listOf("Testy McTesterson"), + moduleDescription = null, + moduleLicense = null, + moduleRepository = null, + writer = this, + dependencies = deps, + ).render() + }.toString() tempDir.resolve("Cargo.toml").writeText(cargoToml) tempDir.resolve("src").mkdirs() val mainRs = tempDir.resolve("src/main.rs") diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt new file mode 100644 index 00000000000..9d18c4725e3 --- /dev/null +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.rustlang + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class CargoDependencyTest { + @Test + fun `it should not allow a dependency with test-util in non-dev scopes`() { + // OK + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "test-util", "bar"), + scope = DependencyScope.Dev, + ) + + // OK + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "bar"), + scope = DependencyScope.Dev, + ).toDevDependency().withFeature("test-util") + + assertThrows { + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "test-util", "bar"), + scope = DependencyScope.Compile, + ) + } + + assertThrows { + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "bar"), + scope = DependencyScope.Compile, + ).withFeature("test-util") + } + } +} diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt index c9407372d76..6ed2fc5ed32 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.smithy import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.RepeatedTest import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.CratesIo @@ -13,7 +14,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope.Compile import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope.Dev class CodegenDelegatorTest { - @Test + @RepeatedTest(10) // Test it several times since the shuffle adds in some randomness fun testMergeDependencyFeatures() { val merged = listOf( @@ -36,6 +37,22 @@ class CodegenDelegatorTest { ) } + @RepeatedTest(10) // Test it several times since the shuffle adds in some randomness + fun testMergeDependencyFeaturesDontMergeDevOnlyFeatures() { + val merged = listOf( + CargoDependency("A", CratesIo("1"), Compile, features = setOf("a")), + CargoDependency("A", CratesIo("1"), Compile, features = setOf("b")), + CargoDependency("A", CratesIo("1"), Dev, features = setOf("c")), + CargoDependency("A", CratesIo("1"), Dev, features = setOf("test-util")), + ).shuffled().mergeDependencyFeatures() + .sortedBy { it.scope } + + merged shouldBe setOf( + CargoDependency("A", CratesIo("1"), Compile, features = setOf("a", "b")), + CargoDependency("A", CratesIo("1"), Dev, features = setOf("c", "test-util")), + ) + } + @Test fun testMergeIdenticalFeatures() { val merged = listOf( @@ -43,11 +60,15 @@ class CodegenDelegatorTest { CargoDependency("A", CratesIo("1"), Dev), CargoDependency("B", CratesIo("1"), Compile), CargoDependency("B", CratesIo("1"), Dev, features = setOf("a", "b")), + CargoDependency("C", CratesIo("1"), Compile), + CargoDependency("C", CratesIo("1"), Dev, features = setOf("test-util")), ).mergeIdenticalTestDependencies() merged shouldBe setOf( CargoDependency("A", CratesIo("1"), Compile), CargoDependency("B", CratesIo("1"), Compile), CargoDependency("B", CratesIo("1"), Dev, features = setOf("a", "b")), + CargoDependency("C", CratesIo("1"), Compile), + CargoDependency("C", CratesIo("1"), Dev, features = setOf("test-util")), ) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 9b24628997a..a00fe57671e 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -134,7 +134,7 @@ macro_rules! declare_runtime_components { $($field_name: runtime_component_field_type!($outer_type $inner_type $($option)?),)+ } - #[derive(Clone, Debug, Default)] + #[derive(Clone, Debug)] pub struct $builder_name { builder_name: &'static str, $($field_name: $outer_type>,)+ @@ -200,8 +200,8 @@ declare_runtime_components! { impl RuntimeComponents { /// Returns a builder for runtime components. - pub fn builder() -> RuntimeComponentsBuilder { - Default::default() + pub fn builder(name: &'static str) -> RuntimeComponentsBuilder { + RuntimeComponentsBuilder::new(name) } /// Returns the auth option resolver. diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 803310221f4..38b8852acbf 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -162,7 +162,7 @@ fn apply_configuration( continue_on_err!([ctx] => Interceptors::new(operation_rc_builder.interceptors()).read_before_execution(true, ctx, cfg)); // The order below is important. Client interceptors must run before operation interceptors. - Ok(RuntimeComponents::builder() + Ok(RuntimeComponents::builder("merged orchestrator components") .merge_from(&client_rc_builder) .merge_from(&operation_rc_builder) .build()?) diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util.rs index de7aef4ac5e..30adb4f6cb6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util.rs @@ -4,5 +4,4 @@ */ pub mod deserializer; -pub mod interceptors; pub mod serializer; diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs deleted file mode 100644 index 957f04bab39..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file once test helpers on `CustomizableOperation` have been removed - -use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; -use aws_smithy_types::config_bag::ConfigBag; -use std::fmt; - -pub struct TestParamsSetterInterceptor { - f: F, -} - -impl fmt::Debug for TestParamsSetterInterceptor { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "TestParamsSetterInterceptor") - } -} - -impl TestParamsSetterInterceptor { - pub fn new(f: F) -> Self { - Self { f } - } -} - -impl Interceptor for TestParamsSetterInterceptor -where - F: Fn(&mut BeforeTransmitInterceptorContextMut<'_>, &mut ConfigBag) + Send + Sync + 'static, -{ - fn modify_before_signing( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - _runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - (self.f)(context, cfg); - - Ok(()) - } -} From 299976659580932832318c562c228e366a3c8e24 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 14 Jul 2023 12:36:17 -0500 Subject: [PATCH 014/331] Remove third party types from public APIs (#2845) ## Motivation and Context Addresses item 1, 3, and 9 in #2413 ## Description This PR removes the third party types as follows: - removes `InvalidHeaderValue` from public API in `aws-http` - removes `SendError` from public API in `aws-smithy-async` - removes `xmlparser` from public API in `aws-smithy-xml` Those types were exposed to public APIs primarily due to the implementation of traits, e.g. `From` and `Iterator`. Those implementations are used internally (such as XML deserialization and converting an error type) so we should be able to hide them within crates. ## Testing - [x] Passed tests in CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- CHANGELOG.next.toml | 12 ++++ aws/rust-runtime/aws-http/external-types.toml | 3 - aws/rust-runtime/aws-http/src/user_agent.rs | 33 ++++++----- .../aws-smithy-async/external-types.toml | 3 - .../aws-smithy-async/src/future/rendezvous.rs | 35 +++++++++++- .../aws-smithy-xml/external-types.toml | 3 - rust-runtime/aws-smithy-xml/src/decode.rs | 55 ++++++++++--------- 7 files changed, 93 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index d603759359a..7b44b6203d2 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -628,3 +628,15 @@ message = "The naming `make_token` for fields and the API of `IdempotencyTokenPr references = ["smithy-rs#2783"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "ysaito1001" + +[[smithy-rs]] +message = "`aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`." +references = ["smithy-rs#2845"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" + +[[aws-sdk-rust]] +message = "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed." +references = ["smithy-rs#2845"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-http/external-types.toml b/aws/rust-runtime/aws-http/external-types.toml index 33a2ed14aa6..d2e362f5156 100644 --- a/aws/rust-runtime/aws-http/external-types.toml +++ b/aws/rust-runtime/aws-http/external-types.toml @@ -5,7 +5,4 @@ allowed_external_types = [ "aws_types::*", "bytes::bytes::Bytes", "http_body::Body", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if the following should be exposed - "http::header::value::InvalidHeaderValue", ] diff --git a/aws/rust-runtime/aws-http/src/user_agent.rs b/aws/rust-runtime/aws-http/src/user_agent.rs index 59edb2a5c34..27abba7bba9 100644 --- a/aws/rust-runtime/aws-http/src/user_agent.rs +++ b/aws/rust-runtime/aws-http/src/user_agent.rs @@ -550,6 +550,16 @@ pub struct UserAgentStageError { kind: UserAgentStageErrorKind, } +impl UserAgentStageError { + // `pub(crate)` method instead of implementing `From` so that we + // don't have to expose `InvalidHeaderValue` in public API. + pub(crate) fn from_invalid_header(value: InvalidHeaderValue) -> Self { + Self { + kind: UserAgentStageErrorKind::InvalidHeader(value), + } + } +} + impl Error for UserAgentStageError { fn source(&self) -> Option<&(dyn Error + 'static)> { use UserAgentStageErrorKind::*; @@ -578,14 +588,6 @@ impl From for UserAgentStageError { } } -impl From for UserAgentStageError { - fn from(value: InvalidHeaderValue) -> Self { - Self { - kind: UserAgentStageErrorKind::InvalidHeader(value), - } - } -} - #[allow(clippy::declare_interior_mutable_const)] // we will never mutate this const X_AMZ_USER_AGENT: HeaderName = HeaderName::from_static("x-amz-user-agent"); @@ -601,11 +603,16 @@ impl MapRequest for UserAgentStage { let ua = conf .get::() .ok_or(UserAgentStageErrorKind::UserAgentMissing)?; - req.headers_mut() - .append(USER_AGENT, HeaderValue::try_from(ua.ua_header())?); - req.headers_mut() - .append(X_AMZ_USER_AGENT, HeaderValue::try_from(ua.aws_ua_header())?); - + req.headers_mut().append( + USER_AGENT, + HeaderValue::try_from(ua.ua_header()) + .map_err(UserAgentStageError::from_invalid_header)?, + ); + req.headers_mut().append( + X_AMZ_USER_AGENT, + HeaderValue::try_from(ua.aws_ua_header()) + .map_err(UserAgentStageError::from_invalid_header)?, + ); Ok(req) }) } diff --git a/rust-runtime/aws-smithy-async/external-types.toml b/rust-runtime/aws-smithy-async/external-types.toml index dee6e8bb309..424f7dc1db2 100644 --- a/rust-runtime/aws-smithy-async/external-types.toml +++ b/rust-runtime/aws-smithy-async/external-types.toml @@ -5,7 +5,4 @@ allowed_external_types = [ # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized "futures_core::stream::Stream", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose `SendError` - "tokio::sync::mpsc::error::SendError", ] diff --git a/rust-runtime/aws-smithy-async/src/future/rendezvous.rs b/rust-runtime/aws-smithy-async/src/future/rendezvous.rs index b501efc85b6..16456f123e6 100644 --- a/rust-runtime/aws-smithy-async/src/future/rendezvous.rs +++ b/rust-runtime/aws-smithy-async/src/future/rendezvous.rs @@ -14,7 +14,6 @@ use std::sync::Arc; use std::task::{Context, Poll}; -use tokio::sync::mpsc::error::SendError; use tokio::sync::Semaphore; /// Create a new rendezvous channel @@ -38,6 +37,36 @@ pub fn channel() -> (Sender, Receiver) { ) } +/// Errors for rendezvous channel +pub mod error { + use std::fmt; + use tokio::sync::mpsc::error::SendError as TokioSendError; + + /// Error when [crate::future::rendezvous::Sender] fails to send a value to the associated `Receiver` + #[derive(Debug)] + pub struct SendError { + source: TokioSendError, + } + + impl SendError { + pub(crate) fn tokio_send_error(source: TokioSendError) -> Self { + Self { source } + } + } + + impl fmt::Display for SendError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "failed to send value to the receiver") + } + } + + impl std::error::Error for SendError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + Some(&self.source) + } + } +} + #[derive(Debug)] /// Sender-half of a channel pub struct Sender { @@ -50,7 +79,7 @@ impl Sender { /// /// Unlike something like `tokio::sync::mpsc::Channel` where sending a value will be buffered until /// demand exists, a rendezvous sender will wait until matching demand exists before this function will return. - pub async fn send(&self, item: T) -> Result<(), SendError> { + pub async fn send(&self, item: T) -> Result<(), error::SendError> { let result = self.chan.send(item).await; // If this is an error, the rx half has been dropped. We will never get demand. if result.is_ok() { @@ -61,7 +90,7 @@ impl Sender { .expect("semaphore is never closed") .forget(); } - result + result.map_err(error::SendError::tokio_send_error) } } diff --git a/rust-runtime/aws-smithy-xml/external-types.toml b/rust-runtime/aws-smithy-xml/external-types.toml index b4b49878e52..ff30ccf5ad0 100644 --- a/rust-runtime/aws-smithy-xml/external-types.toml +++ b/rust-runtime/aws-smithy-xml/external-types.toml @@ -1,5 +1,2 @@ allowed_external_types = [ - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose `xmlparser` at all - "xmlparser::Token", - "xmlparser::error::Error", ] diff --git a/rust-runtime/aws-smithy-xml/src/decode.rs b/rust-runtime/aws-smithy-xml/src/decode.rs index 522c5b12e35..a81c9dbe5f2 100644 --- a/rust-runtime/aws-smithy-xml/src/decode.rs +++ b/rust-runtime/aws-smithy-xml/src/decode.rs @@ -28,14 +28,6 @@ pub struct XmlDecodeError { kind: XmlDecodeErrorKind, } -impl From for XmlDecodeError { - fn from(error: xmlparser::Error) -> Self { - Self { - kind: XmlDecodeErrorKind::InvalidXml(error), - } - } -} - impl Display for XmlDecodeError { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match &self.kind { @@ -58,6 +50,12 @@ impl Error for XmlDecodeError { } impl XmlDecodeError { + pub(crate) fn invalid_xml(error: xmlparser::Error) -> Self { + Self { + kind: XmlDecodeErrorKind::InvalidXml(error), + } + } + pub(crate) fn invalid_escape(esc: impl Into) -> Self { Self { kind: XmlDecodeErrorKind::InvalidEscape { esc: esc.into() }, @@ -256,6 +254,11 @@ impl<'inp> Document<'inp> { } } +/// A new-type wrapper around `Token` to prevent the wrapped third party type from showing up in +/// public API +#[derive(Debug)] +pub struct XmlToken<'inp>(Token<'inp>); + /// Depth tracking iterator /// /// ```xml @@ -267,11 +270,11 @@ impl<'inp> Document<'inp> { /// <- endel depth 0 /// ``` impl<'inp> Iterator for Document<'inp> { - type Item = Result<(Token<'inp>, Depth), XmlDecodeError>; - fn next<'a>(&'a mut self) -> Option, Depth), XmlDecodeError>> { + type Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>; + fn next<'a>(&'a mut self) -> Option, Depth), XmlDecodeError>> { let tok = self.tokenizer.next()?; let tok = match tok { - Err(e) => return Some(Err(e.into())), + Err(e) => return Some(Err(XmlDecodeError::invalid_xml(e))), Ok(tok) => tok, }; // depth bookkeeping @@ -290,11 +293,11 @@ impl<'inp> Iterator for Document<'inp> { self.depth += 1; // We want the startel and endel to have the same depth, but after the opener, // the parser will be at depth 1. Return the previous depth: - return Some(Ok((t, self.depth - 1))); + return Some(Ok((XmlToken(t), self.depth - 1))); } _ => {} } - Some(Ok((tok, self.depth))) + Some(Ok((XmlToken(tok), self.depth))) } } @@ -351,7 +354,7 @@ impl<'inp> ScopedDecoder<'inp, '_> { } impl<'inp, 'a> Iterator for ScopedDecoder<'inp, 'a> { - type Item = Result<(Token<'inp>, Depth), XmlDecodeError>; + type Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>; fn next(&mut self) -> Option { if self.start_el.closed { @@ -365,7 +368,7 @@ impl<'inp, 'a> Iterator for ScopedDecoder<'inp, 'a> { other => return other, }; - match tok { + match tok.0 { Token::ElementEnd { end, .. } if self.start_el.end_el(end, depth) => { self.terminated = true; return None; @@ -378,23 +381,23 @@ impl<'inp, 'a> Iterator for ScopedDecoder<'inp, 'a> { /// Load the next start element out of a depth-tagged token iterator fn next_start_element<'a, 'inp>( - tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, + tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, ) -> Option> { let mut out = StartEl::new("", "", 0); loop { match tokens.next()? { - Ok((Token::ElementStart { local, prefix, .. }, depth)) => { + Ok((XmlToken(Token::ElementStart { local, prefix, .. }), depth)) => { out.name.local = local.as_str(); out.name.prefix = prefix.as_str(); out.depth = depth; } Ok(( - Token::Attribute { + XmlToken(Token::Attribute { prefix, local, value, .. - }, + }), _, )) => out.attributes.push(Attr { name: Name { @@ -404,17 +407,17 @@ fn next_start_element<'a, 'inp>( value: unescape(value.as_str()).ok()?, }), Ok(( - Token::ElementEnd { + XmlToken(Token::ElementEnd { end: ElementEnd::Open, .. - }, + }), _, )) => break, Ok(( - Token::ElementEnd { + XmlToken(Token::ElementEnd { end: ElementEnd::Empty, .. - }, + }), _, )) => { out.closed = true; @@ -431,13 +434,13 @@ fn next_start_element<'a, 'inp>( /// If the current position is not a data element (and is instead a ``) an error /// will be returned pub fn try_data<'a, 'inp>( - tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, + tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, ) -> Result, XmlDecodeError> { loop { match tokens.next().map(|opt| opt.map(|opt| opt.0)) { None => return Ok(Cow::Borrowed("")), - Some(Ok(Token::Text { text })) => return unescape(text.as_str()), - Some(Ok(e @ Token::ElementStart { .. })) => { + Some(Ok(XmlToken(Token::Text { text }))) => return unescape(text.as_str()), + Some(Ok(e @ XmlToken(Token::ElementStart { .. }))) => { return Err(XmlDecodeError::custom(format!( "looking for a data element, found: {:?}", e From 7d1d35c9f692770b7a5987dafacfa76b50d35773 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 14 Jul 2023 13:57:54 -0700 Subject: [PATCH 015/331] Fix Timestream in the orchestrator (#2846) This PR fixes Timestream in the orchestrator implementation. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 +-- .../aws-inlineable/src/endpoint_discovery.rs | 3 + .../timestream/TimestreamDecorator.kt | 83 +++++++++++-------- .../s3/tests/config_to_builder.rs | 18 ++++ .../timestreamquery/Cargo.toml | 5 +- .../timestreamquery/tests/endpoint_disco.rs | 28 ++++--- .../ConfigOverrideRuntimePluginGenerator.kt | 6 +- .../config/ServiceConfigGenerator.kt | 31 +++++-- .../aws-smithy-client/src/dvr/replay.rs | 2 +- .../src/client/config_override.rs | 21 +++-- .../src/client/orchestrator/endpoints.rs | 1 + .../check-aws-sdk-orchestrator-impl | 8 +- 12 files changed, 138 insertions(+), 80 deletions(-) create mode 100644 aws/sdk/integration-tests/s3/tests/config_to_builder.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 7b44b6203d2..8043bf07b5e 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -127,7 +127,7 @@ author = "rcoh" message = "Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration" author = "david-perez" references = ["smithy-rs#2676", "smithy-rs#2685"] -meta = { "breaking" = true, "tada" = false, "bug" = false } +meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } [[smithy-rs]] message = """Remove `PollError` from an operations `Service::Error`. @@ -141,9 +141,9 @@ meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } author = "hlbarber" [[aws-sdk-rust]] -message = "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.enable_endpoint_discovery()` on the `Client` after construction." +message = "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction." meta = { "breaking" = false, "tada" = true, "bug" = false } -references = ["smithy-rs#2707", "aws-sdk-rust#114"] +references = ["smithy-rs#2707", "aws-sdk-rust#114", "smithy-rs#2846"] author = "rcoh" [[smithy-rs]] @@ -197,7 +197,7 @@ filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); """ author = "82marbag" references = ["smithy-rs#2678"] -meta = { "breaking" = true, "tada" = false, "bug" = false } +meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } [[smithy-rs]] message = "The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs." @@ -532,7 +532,7 @@ let scoped_plugin = Scoped::new::(plugin); """ references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779", "smithy-rs#2827"] -meta = { "breaking" = true, "tada" = true, "bug" = false } +meta = { "breaking" = true, "tada" = true, "bug" = false, target = "server" } author = "hlbarber" [[smithy-rs]] @@ -608,7 +608,7 @@ let plugin = plugin_from_operation_fn(map); ``` """ references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] -meta = { "breaking" = true, "tada" = false, "bug" = false } +meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } author = "hlbarber" [[smithy-rs]] diff --git a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs index d4ffc7d1164..de870fecc98 100644 --- a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs +++ b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs @@ -39,6 +39,7 @@ impl ReloadEndpoint { pub async fn reload_once(&self) { match (self.loader)().await { Ok((endpoint, expiry)) => { + tracing::debug!("caching resolved endpoint: {:?}", (&endpoint, &expiry)); *self.endpoint.lock().unwrap() = Some(ExpiringEndpoint { endpoint, expiry }) } Err(err) => *self.error.lock().unwrap() = Some(err), @@ -128,6 +129,7 @@ where sleep, time, }; + tracing::debug!("populating initial endpoint discovery cache"); reloader.reload_once().await; // if we didn't successfully get an endpoint, bail out so the client knows // configuration failed to work @@ -137,6 +139,7 @@ where impl EndpointCache { fn resolve_endpoint(&self) -> aws_smithy_http::endpoint::Result { + tracing::trace!("resolving endpoint from endpoint discovery cache"); self.endpoint .lock() .unwrap() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 55a9e7f7bd4..44c7767bd32 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rustsdk.customize.timestream import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -14,10 +15,10 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Visibility import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization +import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.AwsCargoDependency import software.amazon.smithy.rustsdk.DocSection import software.amazon.smithy.rustsdk.InlineAwsDependency @@ -25,34 +26,43 @@ import software.amazon.smithy.rustsdk.InlineAwsDependency /** * This decorator does two things: * 1. Adds the `endpoint_discovery` inlineable - * 2. Adds a `enable_endpoint_discovery` method on client that returns a wrapped client with endpoint discovery enabled + * 2. Adds a `with_endpoint_discovery_enabled` method on client that returns a wrapped client with endpoint discovery enabled */ class TimestreamDecorator : ClientCodegenDecorator { override val name: String = "Timestream" override val order: Byte = -1 - override fun extraSections(codegenContext: ClientCodegenContext): List { - return listOf( - adhocCustomization { - addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency()) - rustTemplate( - """ - let config = aws_config::load_from_env().await; - // You MUST call `enable_endpoint_discovery` to produce a working client for this service. - let ${it.clientName} = ${it.crateName}::Client::new(&config).enable_endpoint_discovery().await; - """.replaceIndent(it.indent), - ) - }, - ) - } + private fun applies(codegenContext: ClientCodegenContext): Boolean = + codegenContext.smithyRuntimeMode.defaultToOrchestrator + + override fun extraSections(codegenContext: ClientCodegenContext): List = + emptyList().letIf(applies(codegenContext)) { + listOf( + adhocCustomization { + addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency()) + rustTemplate( + """ + let config = aws_config::load_from_env().await; + // You MUST call `with_endpoint_discovery_enabled` to produce a working client for this service. + let ${it.clientName} = ${it.crateName}::Client::new(&config).with_endpoint_discovery_enabled().await; + """.replaceIndent(it.indent), + ) + }, + ) + } override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { + if (!applies(codegenContext)) { + return + } + val endpointDiscovery = InlineAwsDependency.forRustFile( "endpoint_discovery", Visibility.PUBLIC, CargoDependency.Tokio.copy(scope = DependencyScope.Compile, features = setOf("sync")), + CargoDependency.smithyAsync(codegenContext.runtimeConfig).toDevDependency().withFeature("test-util"), ) - rustCrate.lib { + rustCrate.withModule(ClientRustModule.client) { // helper function to resolve an endpoint given a base client rustTemplate( """ @@ -76,33 +86,40 @@ class TimestreamDecorator : ClientCodegenDecorator { /// Enable endpoint discovery for this client /// /// This method MUST be called to construct a working client. - pub async fn enable_endpoint_discovery(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{ResolveEndpointError}> { - let mut new_conf = self.conf().clone(); - let sleep = self.conf().sleep_impl().expect("sleep impl must be provided"); - let time = self.conf().time_source().expect("time source must be provided"); + pub async fn with_endpoint_discovery_enabled(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{ResolveEndpointError}> { + let handle = self.handle.clone(); + + // The original client without endpoint discover gets moved into the endpoint discovery + // resolver since calls to DescribeEndpoint without discovery need to be made. + let client_without_discovery = self; let (resolver, reloader) = #{endpoint_discovery}::create_cache( move || { - let client = self.clone(); + let client = client_without_discovery.clone(); async move { resolve_endpoint(&client).await } }, - sleep, - time - ) - .await?; - new_conf.endpoint_resolver = #{SharedEndpointResolver}::new(resolver); - Ok((Self::from_conf(new_conf), reloader)) + handle.conf.sleep_impl() + .expect("endpoint discovery requires the client config to have a sleep impl"), + handle.conf.time_source() + .expect("endpoint discovery requires the client config to have a time source"), + ).await?; + + let client_with_discovery = crate::Client::from_conf( + handle.conf.to_builder() + .endpoint_resolver(#{SharedEndpointResolver}::new(resolver)) + .build() + ); + Ok((client_with_discovery, reloader)) } } """, - "endpoint_discovery" to endpointDiscovery.toType(), - "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), + *RuntimeType.preludeScope, + "Arc" to RuntimeType.Arc, "Duration" to RuntimeType.std.resolve("time::Duration"), "SharedEndpointResolver" to RuntimeType.smithyHttp(codegenContext.runtimeConfig) .resolve("endpoint::SharedEndpointResolver"), - "SystemTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig) - .resolve("time::SystemTimeSource"), + "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), + "endpoint_discovery" to endpointDiscovery.toType(), *Types(codegenContext.runtimeConfig).toArray(), - *preludeScope, ) } } diff --git a/aws/sdk/integration-tests/s3/tests/config_to_builder.rs b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs new file mode 100644 index 00000000000..122b0418b67 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs @@ -0,0 +1,18 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[cfg(aws_sdk_orchestrator_mode)] +#[tokio::test] +async fn test_config_to_builder() { + use aws_sdk_s3::config::AppName; + + let config = aws_config::load_from_env().await; + let config = aws_sdk_s3::Config::new(&config); + // should not panic + let _ = config + .to_builder() + .app_name(AppName::new("SomeAppName").unwrap()) + .build(); +} diff --git a/aws/sdk/integration-tests/timestreamquery/Cargo.toml b/aws/sdk/integration-tests/timestreamquery/Cargo.toml index b81b618c883..99955e47647 100644 --- a/aws/sdk/integration-tests/timestreamquery/Cargo.toml +++ b/aws/sdk/integration-tests/timestreamquery/Cargo.toml @@ -13,8 +13,9 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-sdk-timestreamquery = { path = "../../build/aws-sdk/sdk/timestreamquery" } -tokio = { version = "1.23.1", features = ["full", "test-util"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } +aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"] } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } +tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = "0.3.17" diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index d15244825ff..447bdead218 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -3,20 +3,22 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_sdk_timestreamquery as query; -use aws_sdk_timestreamquery::config::Credentials; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::test_util::controlled_time_and_sleep; -use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_client::dvr::{MediaType, ReplayingConnection}; -use aws_types::region::Region; -use aws_types::SdkConfig; -use std::time::{Duration, UNIX_EPOCH}; - +#[cfg(aws_sdk_orchestrator_mode)] #[tokio::test] async fn do_endpoint_discovery() { - tracing_subscriber::fmt::init(); + use aws_credential_types::provider::SharedCredentialsProvider; + use aws_sdk_timestreamquery as query; + use aws_sdk_timestreamquery::config::Credentials; + use aws_smithy_async::rt::sleep::SharedAsyncSleep; + use aws_smithy_async::test_util::controlled_time_and_sleep; + use aws_smithy_async::time::{SharedTimeSource, TimeSource}; + use aws_smithy_client::dvr::{MediaType, ReplayingConnection}; + use aws_types::region::Region; + use aws_types::SdkConfig; + use std::time::{Duration, UNIX_EPOCH}; + + let _logs = aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs(); + let conn = ReplayingConnection::from_file("tests/traffic.json").unwrap(); //let conn = aws_smithy_client::dvr::RecordingConnection::new(conn); let start = UNIX_EPOCH + Duration::from_secs(1234567890); @@ -32,7 +34,7 @@ async fn do_endpoint_discovery() { .idempotency_token_provider("0000-0000-0000") .build(); let (client, reloader) = query::Client::from_conf(conf) - .enable_endpoint_discovery() + .with_endpoint_discovery_enabled() .await .expect("initial setup of endpoint discovery failed"); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index 5a37375e568..b199eaf5a53 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -54,8 +54,7 @@ class ConfigOverrideRuntimePluginGenerator( initial_config: #{FrozenLayer}, initial_components: &#{RuntimeComponentsBuilder} ) -> Self { - let mut layer = #{Layer}::from(config_override.config) - .with_name("$moduleUseName::config::ConfigOverrideRuntimePlugin"); + let mut layer = config_override.config; let mut components = config_override.runtime_components; let mut resolver = #{Resolver}::overrid(initial_config, initial_components, &mut layer, &mut components); @@ -63,7 +62,8 @@ class ConfigOverrideRuntimePluginGenerator( let _ = resolver; Self { - config: layer.freeze(), + config: #{Layer}::from(layer) + .with_name("$moduleUseName::config::ConfigOverrideRuntimePlugin").freeze(), components, } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index 8d93ae88fc6..83f7c740b41 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -336,7 +336,11 @@ class ServiceConfigGenerator( if (runtimeMode.defaultToOrchestrator) { rustTemplate( """ + // Both `config` and `cloneable` are the same config, but the cloneable one + // is kept around so that it is possible to convert back into a builder. This can be + // optimized in the future. pub(crate) config: #{FrozenLayer}, + cloneable: #{CloneableLayer}, pub(crate) runtime_components: #{RuntimeComponentsBuilder}, pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, """, @@ -369,6 +373,20 @@ class ServiceConfigGenerator( pub fn builder() -> Builder { Builder::default() } """, ) + if (runtimeMode.defaultToOrchestrator) { + writer.rustTemplate( + """ + /// Converts this config back into a builder so that it can be tweaked. + pub fn to_builder(&self) -> Builder { + Builder { + config: self.cloneable.clone(), + runtime_components: self.runtime_components.clone(), + runtime_plugins: self.runtime_plugins.clone(), + } + } + """, + ) + } customizations.forEach { it.section(ServiceConfig.ConfigImpl)(this) } @@ -478,12 +496,7 @@ class ServiceConfigGenerator( rustBlock("pub fn build(mut self) -> Config") { rustTemplate( """ - // The builder is being turned into a service config. While doing so, we'd like to avoid - // requiring that items created and stored _during_ the build method be `Clone`, since they - // will soon be part of a `FrozenLayer` owned by the service config. So we will convert the - // current `CloneableLayer` into a `Layer` that does not impose the `Clone` requirement. - let mut layer = #{Layer}::from(self.config).with_name("$moduleUseName::config::Config"); - ##[allow(unused)] + let mut layer = self.config; let mut resolver = #{Resolver}::initial(&mut layer, &mut self.runtime_components); """, *codegenScope, @@ -495,12 +508,14 @@ class ServiceConfigGenerator( customizations.forEach { it.section(ServiceConfig.BuilderBuildExtras)(this) } - rust( + rustTemplate( """ - config: layer.freeze(), + config: #{Layer}::from(layer.clone()).with_name("$moduleUseName::config::Config").freeze(), + cloneable: layer, runtime_components: self.runtime_components, runtime_plugins: self.runtime_plugins, """, + *codegenScope, ) } } diff --git a/rust-runtime/aws-smithy-client/src/dvr/replay.rs b/rust-runtime/aws-smithy-client/src/dvr/replay.rs index 54065e5fc7d..94d9123e0e5 100644 --- a/rust-runtime/aws-smithy-client/src/dvr/replay.rs +++ b/rust-runtime/aws-smithy-client/src/dvr/replay.rs @@ -113,7 +113,7 @@ impl ReplayingConnection { ))? .take() .await; - aws_smithy_protocol_test::assert_uris_match(actual.uri(), expected.uri()); + aws_smithy_protocol_test::assert_uris_match(expected.uri(), actual.uri()); body_comparer(expected.body().as_ref(), actual.body().as_ref())?; let expected_headers = expected .headers() diff --git a/rust-runtime/aws-smithy-runtime/src/client/config_override.rs b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs index c89352e1394..c69770a9748 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/config_override.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs @@ -5,7 +5,9 @@ use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; -use aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, Store, StoreReplace}; +use aws_smithy_types::config_bag::{ + CloneableLayer, FrozenLayer, Layer, Storable, Store, StoreReplace, +}; macro_rules! component { ($typ:ty, $accessor:ident, $latest_accessor:ident) => { @@ -39,14 +41,14 @@ macro_rules! latest_component { } struct Initial<'a> { - config: &'a mut Layer, + config: &'a mut CloneableLayer, components: &'a mut RuntimeComponentsBuilder, } struct Override<'a> { initial_config: FrozenLayer, initial_components: &'a RuntimeComponentsBuilder, - config: &'a mut Layer, + config: &'a mut CloneableLayer, components: &'a mut RuntimeComponentsBuilder, } @@ -74,7 +76,10 @@ pub struct Resolver<'a> { impl<'a> Resolver<'a> { /// Construct a new [`Resolver`] in _initial mode_. - pub fn initial(config: &'a mut Layer, components: &'a mut RuntimeComponentsBuilder) -> Self { + pub fn initial( + config: &'a mut CloneableLayer, + components: &'a mut RuntimeComponentsBuilder, + ) -> Self { Self { inner: Inner::Initial(Initial { config, components }), } @@ -84,7 +89,7 @@ impl<'a> Resolver<'a> { pub fn overrid( initial_config: FrozenLayer, initial_components: &'a RuntimeComponentsBuilder, - config: &'a mut Layer, + config: &'a mut CloneableLayer, components: &'a mut RuntimeComponentsBuilder, ) -> Self { Self { @@ -103,7 +108,7 @@ impl<'a> Resolver<'a> { } /// Returns a mutable reference to the latest config. - pub fn config_mut(&mut self) -> &mut Layer { + pub fn config_mut(&mut self) -> &mut CloneableLayer { match &mut self.inner { Inner::Initial(initial) => initial.config, Inner::Override(overrid) => overrid.config, @@ -180,7 +185,7 @@ mod tests { #[test] fn initial_mode_config() { - let mut config = Layer::new("test"); + let mut config = CloneableLayer::new("test"); let mut components = RuntimeComponentsBuilder::new("test"); let mut resolver = Resolver::initial(&mut config, &mut components); @@ -199,7 +204,7 @@ mod tests { fn override_mode_config() { let mut initial_config = CloneableLayer::new("initial"); let initial_components = RuntimeComponentsBuilder::new("initial"); - let mut config = Layer::new("override"); + let mut config = CloneableLayer::new("override"); let mut components = RuntimeComponentsBuilder::new("override"); let resolver = Resolver::overrid( diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 1b22b3c5d95..be6fc51bf02 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -117,6 +117,7 @@ pub(super) async fn orchestrate_endpoint( .endpoint_resolver() .resolve_endpoint(params) .await?; + tracing::debug!("will use endpoint {:?}", endpoint); apply_endpoint(request, &endpoint, endpoint_prefix)?; // Make the endpoint config available to interceptors diff --git a/tools/ci-scripts/check-aws-sdk-orchestrator-impl b/tools/ci-scripts/check-aws-sdk-orchestrator-impl index 0104e7f03d3..b86ebf3f0f6 100755 --- a/tools/ci-scripts/check-aws-sdk-orchestrator-impl +++ b/tools/ci-scripts/check-aws-sdk-orchestrator-impl @@ -12,12 +12,6 @@ C_RESET='\033[0m' set -eu cd smithy-rs -# TODO(enableNewSmithyRuntimeLaunch): Move these into `services_that_compile` as more progress is made -services_that_dont_compile=(\ - "timestreamquery", - "timestreamwrite", -) - services_that_pass_tests=(\ "aws-config"\ "config"\ @@ -35,6 +29,8 @@ services_that_pass_tests=(\ "s3control"\ "sso"\ "sts"\ + "timestreamquery"\ + "timestreamwrite"\ "transcribestreaming"\ ) From 1ac59421a9f7fa84fec9fa8ff5a2fc83b9b6fb75 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Mon, 17 Jul 2023 09:58:48 -0500 Subject: [PATCH 016/331] Remove third party types from public APIs Part 2 (#2848) ## Motivation and Context Addresses item 8 in #2413 ## Description This PR removes the third party types as follows: - removes `SegmentedBuf` from public API in `aws-smithy-http` (used when the feature `event-stream` was enabled) ## Testing - [x] Passed tests in CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- CHANGELOG.next.toml | 6 ++++++ rust-runtime/aws-smithy-http/external-types.toml | 3 --- rust-runtime/aws-smithy-http/src/event_stream/receiver.rs | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8043bf07b5e..eb59a24af55 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -640,3 +640,9 @@ message = "The implementation `From` fo references = ["smithy-rs#2845"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "ysaito1001" + +[[smithy-rs]] +message = "The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed." +references = ["smithy-rs#2848"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/rust-runtime/aws-smithy-http/external-types.toml b/rust-runtime/aws-smithy-http/external-types.toml index b06231e92f5..a228978c9a7 100644 --- a/rust-runtime/aws-smithy-http/external-types.toml +++ b/rust-runtime/aws-smithy-http/external-types.toml @@ -31,7 +31,4 @@ allowed_external_types = [ # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide whether to expose this type or not - "bytes_utils::segmented::SegmentedBuf", ] diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index aa7f9142234..3b38161f3bb 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -97,8 +97,8 @@ pub enum RawMessage { Invalid(Option), } -impl From<&mut SegmentedBuf> for RawMessage { - fn from(buf: &mut SegmentedBuf) -> Self { +impl RawMessage { + pub(crate) fn invalid(buf: &mut SegmentedBuf) -> Self { Self::Invalid(Some(buf.copy_to_bytes(buf.remaining()))) } } @@ -213,7 +213,7 @@ impl Receiver { ReceiverError { kind: ReceiverErrorKind::UnexpectedEndOfStream, }, - self.buffer.buffered().into(), + RawMessage::invalid(self.buffer.buffered()), )); } Ok(None) From d4c5064849145737bd1aeaebcd2b56e19e1fdfd5 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 17 Jul 2023 13:46:36 -0400 Subject: [PATCH 017/331] Rollback multi-rust version changes to the dockerfile (#2852) ## Motivation and Context solved by deploying a newer version of smithy-rs instead ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index ef3cfbef566..3e04f15c7d8 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -6,7 +6,6 @@ # This is the base Docker build image used by CI ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 -ARG prev_rust_stable_version=1.67.1 ARG rust_stable_version=1.68.2 ARG rust_nightly_version=nightly-2023-05-31 @@ -26,7 +25,6 @@ RUN curl https://musl.libc.org/releases/musl-1.2.3.tar.gz -o musl-1.2.3.tar.gz \ FROM bare_base_image AS install_rust ARG rust_stable_version ARG rust_nightly_version -ARG prev_rust_stable_version ENV RUSTUP_HOME=/opt/rustup \ CARGO_HOME=/opt/cargo \ PATH=/opt/cargo/bin/:${PATH} \ @@ -62,7 +60,6 @@ RUN set -eux; \ rustup component add rustfmt; \ rustup component add clippy; \ rustup toolchain install ${rust_nightly_version} --component clippy; \ - rustup toolchain install ${prev_rust_stable_version} --component clippy; \ rustup target add x86_64-unknown-linux-musl; \ rustup target add wasm32-unknown-unknown; \ rustup target add wasm32-wasi; \ From fabef2bbc9201af697bc93750ff919a1989eb47f Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 18 Jul 2023 15:40:49 -0400 Subject: [PATCH 018/331] Set RUSTUP_TOOLCHAIN in Dockerfile (#2853) ## Motivation and Context During releases, if the toolchain version has changed, we'll try to invoke a Rust version that doesn't exist. This pins it to the stable version. ## Description Set the `RUSTUP_TOOLCHAIN` environment variable in the release/CI dockerfile ## Testing - ran a release with this image ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 3e04f15c7d8..d6ce780e658 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -207,4 +207,7 @@ ENV SMITHY_RS_DOCKER_BUILD_IMAGE=1 RUN pip3 install --no-cache-dir mypy==0.991 WORKDIR /home/build COPY sanity-test /home/build/sanity-test +# RUSTUP_TOOLCHAIN takes precedence over everything except `+` args. This will allow us to ignore the toolchain +# file during CI, avoiding issues during Rust version upgrades. +ENV RUSTUP_TOOLCHAIN=${rust_stable_version} RUN /home/build/sanity-test From 27df48fcc0fcf7a0c33700d9f99eff68565d9a48 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 19 Jul 2023 10:02:49 -0500 Subject: [PATCH 019/331] Remove doc hidden from struct fields (#2854) ## Motivation and Context Removes `#[doc(hidden)]` from struct fields. ## Testing - [ ] Passed tests in CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- CHANGELOG.next.toml | 6 ++++++ .../codegen/core/smithy/SymbolMetadataProvider.kt | 15 +-------------- .../smithy/generators/StructureGeneratorTest.kt | 9 ++++----- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index eb59a24af55..7a753f4790f 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -646,3 +646,9 @@ message = "The implementation `From` for ` references = ["smithy-rs#2848"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "ysaito1001" + +[[smithy-rs]] +message = "Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible." +references = ["smithy-rs#2854"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt index d78818601cd..964f2046dd7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt @@ -20,7 +20,6 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.model.traits.EnumTrait import software.amazon.smithy.model.traits.SensitiveTrait -import software.amazon.smithy.model.traits.StreamingTrait import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata import software.amazon.smithy.rust.codegen.core.rustlang.Visibility @@ -99,19 +98,7 @@ class BaseSymbolMetadataProvider( override fun memberMeta(memberShape: MemberShape): RustMetadata = when (val container = model.expectShape(memberShape.container)) { - is StructureShape -> { - // TODO(https://github.com/awslabs/smithy-rs/issues/943): Once streaming accessors are usable, - // then also make streaming members `#[doc(hidden)]` - if (memberShape.getMemberTrait(model, StreamingTrait::class.java).isPresent) { - RustMetadata(visibility = Visibility.PUBLIC) - } else { - RustMetadata( - // At some point, visibility _may_ be made `PRIVATE`, so make these `#[doc(hidden)]` for now. - visibility = Visibility.PUBLIC, - additionalAttributes = listOf(Attribute.DocHidden), - ) - } - } + is StructureShape -> RustMetadata(visibility = Visibility.PUBLIC) is UnionShape, is CollectionShape, is MapShape -> RustMetadata(visibility = Visibility.PUBLIC) diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt index f7655873001..77932ddfac6 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import io.kotest.matchers.string.shouldContainInOrder import io.kotest.matchers.string.shouldNotContain -import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -401,7 +400,7 @@ class StructureGeneratorTest { } @Test - fun `non-streaming fields are doc-hidden`() { + fun `fields are NOT doc-hidden`() { val model = """ namespace com.test structure MyStruct { @@ -415,9 +414,9 @@ class StructureGeneratorTest { val struct = model.lookup("com.test#MyStruct") val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) - RustWriter.forModule("test").let { - StructureGenerator(model, provider, it, struct, emptyList()).render() - assertEquals(6, it.toString().split("#[doc(hidden)]").size, "there should be 5 doc-hiddens") + RustWriter.forModule("test").let { writer -> + StructureGenerator(model, provider, writer, struct, emptyList()).render() + writer.toString().shouldNotContain("#[doc(hidden)]") } } From 5beee617f3f9363423d66b71c76c2be16ac7e574 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 19 Jul 2023 12:17:24 -0700 Subject: [PATCH 020/331] Improve local dev experience with `aws:sdk:assemble` build target (#2859) In local dev, if you have a terminal/shell open to `aws/sdk/build/aws-sdk/...` and run the `aws:sdk:assemble` target, that shell's current working directory will break and you'll have to change directory to somewhere safe and change back in order to do anything again (at least on MacOS). This PR makes the `deleteSdk` target that `aws:sdk:assemble` depends on only delete files instead of directories so that the current working directory doesn't get invalidated. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/build.gradle.kts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index d5225d66a9d..23f7aed78c2 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -453,7 +453,12 @@ tasks["test"].dependsOn("assemble") tasks["test"].finalizedBy(Cargo.CLIPPY.toString, Cargo.TEST.toString, Cargo.DOCS.toString) tasks.register("deleteSdk") { - delete = setOf(outputDir) + delete( + fileTree(outputDir) { + // Delete files but keep directories so that terminals don't get messed up in local development + include("**/*.*") + }, + ) } tasks["clean"].dependsOn("deleteSdk") tasks["clean"].doFirst { From f310668417b0904d59dadbec0360440d90c1ede5 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 20 Jul 2023 06:15:34 -0700 Subject: [PATCH 021/331] Stop rebuilding `sdk-lints` all the time (#2861) I noticed `sdk-lints` was getting recompiled just about every time I ran `git commit` as part of the pre-commit hooks. It looks like a compiler flag was added to the `ExecRustBuildTool` task type that isn't actually used by any tools. Removing it should eliminate compiler flag conflicts between the gradle targets and pre-commit. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- buildSrc/src/main/kotlin/RustBuildTool.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/RustBuildTool.kt b/buildSrc/src/main/kotlin/RustBuildTool.kt index b8a1a15fb15..1e679956487 100644 --- a/buildSrc/src/main/kotlin/RustBuildTool.kt +++ b/buildSrc/src/main/kotlin/RustBuildTool.kt @@ -28,7 +28,6 @@ private fun runCli( } } .copyTo(action) - action.environment("RUSTFLAGS", "--cfg aws_sdk_unstable") action.execute() } } From 25abe5a84203ab3cef0fa9e991b8ddbaf1f67b53 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 20 Jul 2023 08:49:53 -0700 Subject: [PATCH 022/331] Change the default runtime mode to orchestrator (#2847) This PR changes the default runtime mode to orchestrator for generated clients and the AWS SDK. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 4 +- aws/rust-runtime/aws-config/Cargo.toml | 2 +- aws/rust-runtime/aws-config/src/connector.rs | 9 +- .../src/http_credential_provider.rs | 5 +- .../aws-config/src/imds/client.rs | 5 +- .../aws-config/src/imds/credentials.rs | 2 +- aws/rust-runtime/aws-config/src/lib.rs | 2 +- aws/rust-runtime/aws-config/src/sso.rs | 1 + aws/rust-runtime/aws-config/src/sts.rs | 5 +- .../aws-config/src/sts/assume_role.rs | 5 +- .../aws-credential-types/Cargo.toml | 2 +- aws/rust-runtime/aws-runtime/Cargo.toml | 3 +- .../aws-runtime/src/invocation_id.rs | 119 ++++-- aws/rust-runtime/aws-types/src/sdk_config.rs | 4 +- aws/sdk-adhoc-test/build.gradle.kts | 2 +- .../smithy/rustsdk/AwsPresigningDecorator.kt | 8 +- .../amazon/smithy/rustsdk/CredentialCaches.kt | 10 +- .../rustsdk/EndpointBuiltInsDecorator.kt | 2 +- .../rustsdk/IntegrationTestDependencies.kt | 4 +- .../smithy/rustsdk/SigV4SigningDecorator.kt | 2 +- .../amazon/smithy/rustsdk/TestUtil.kt | 2 +- aws/sdk/build.gradle.kts | 3 +- .../dynamodb/benches/deserialization_bench.rs | 2 +- .../dynamodb/benches/serialization_bench.rs | 2 +- .../retries-with-client-rate-limiting.rs | 2 +- .../kms/tests/retryable_errors.rs | 4 +- .../no-default-features/Cargo.toml | 1 + .../tests/client-construction.rs | 54 ++- aws/sdk/integration-tests/s3/Cargo.toml | 2 +- .../s3/tests/alternative-async-runtime.rs | 10 +- .../s3/tests/config-override.rs | 10 +- .../s3/tests/config_to_builder.rs | 2 +- .../integration-tests/s3/tests/endpoints.rs | 4 +- .../integration-tests/sts/tests/signing-it.rs | 4 +- .../timestreamquery/tests/endpoint_disco.rs | 2 +- aws/sdk/sdk-external-types.toml | 4 +- codegen-client-test/build.gradle.kts | 2 +- .../client/smithy/ClientRustSettings.kt | 13 +- .../HttpConnectorConfigDecorator.kt | 27 +- .../endpoint/EndpointConfigCustomization.kt | 39 ++ .../EndpointParamsInterceptorGenerator.kt | 3 +- .../smithy/generators/OperationGenerator.kt | 2 +- .../OperationRuntimePluginGenerator.kt | 8 +- .../ServiceRuntimePluginGenerator.kt | 4 +- .../protocol/ProtocolTestGenerator.kt | 56 +-- .../customizations/ApiKeyAuthDecoratorTest.kt | 9 +- .../HttpVersionListGeneratorTest.kt | 9 +- .../ResiliencyConfigCustomizationTest.kt | 8 + .../smithy/endpoint/EndpointsDecoratorTest.kt | 103 ++++- .../generators/EndpointTraitBindingsTest.kt | 140 ++++++- .../ProtocolTestGeneratorMiddlewareTest.kt | 363 ++++++++++++++++++ .../protocol/ProtocolTestGeneratorTest.kt | 244 ++++++------ .../protocols/AwsQueryCompatibleTest.kt | 173 ++++++++- .../codegen/core/rustlang/CargoDependency.kt | 2 +- .../rust/codegen/core/smithy/RuntimeType.kt | 2 + examples/pokemon-service-common/Cargo.toml | 4 + examples/pokemon-service-common/src/lib.rs | 22 +- .../tests/plugins_execution_order.rs | 21 +- .../pokemon-service-tls/tests/common/mod.rs | 27 +- examples/pokemon-service/tests/common/mod.rs | 22 +- .../pokemon-service-test/tests/helpers.rs | 38 +- rust-runtime/aws-smithy-client/Cargo.toml | 2 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 2 +- .../src/client/orchestrator.rs | 3 +- rust-runtime/inlineable/Cargo.toml | 2 +- .../ci-scripts/check-aws-sdk-middleware-impl | 27 ++ .../check-aws-sdk-orchestrator-impl | 49 --- 67 files changed, 1315 insertions(+), 415 deletions(-) create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt create mode 100755 tools/ci-scripts/check-aws-sdk-middleware-impl delete mode 100755 tools/ci-scripts/check-aws-sdk-orchestrator-impl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0cd2c8877b7..9a1e8f274da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,8 +84,8 @@ jobs: test: - action: check-aws-sdk-adhoc-tests runner: ubuntu-latest - # TODO(enableNewSmithyRuntimeCleanup): Remove `check-aws-sdk-orchestrator-impl` when cleaning up middleware - - action: check-aws-sdk-orchestrator-impl + # TODO(enableNewSmithyRuntimeCleanup): Remove `check-aws-sdk-middleware-impl` when cleaning up middleware + - action: check-aws-sdk-middleware-impl runner: smithy_ubuntu-latest_8-core - action: check-client-codegen-integration-tests runner: smithy_ubuntu-latest_8-core diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 54add78bb8d..c19658d9c37 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -35,7 +35,7 @@ tokio = { version = "1.13.1", features = ["sync"] } tracing = { version = "0.1" } # implementation detail of IMDS credentials provider -fastrand = "1" +fastrand = "2.0.0" bytes = "1.1.0" http = "0.2.4" diff --git a/aws/rust-runtime/aws-config/src/connector.rs b/aws/rust-runtime/aws-config/src/connector.rs index c924a072bf7..33c820261fa 100644 --- a/aws/rust-runtime/aws-config/src/connector.rs +++ b/aws/rust-runtime/aws-config/src/connector.rs @@ -7,10 +7,13 @@ use aws_smithy_client::erase::DynConnector; -// unused when all crate features are disabled /// Unwrap an [`Option`](aws_smithy_client::erase::DynConnector), and panic with a helpful error message if it's `None` -pub(crate) fn expect_connector(connector: Option) -> DynConnector { - connector.expect("No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this.") +pub(crate) fn expect_connector(for_what: &str, connector: Option) -> DynConnector { + if let Some(conn) = connector { + conn + } else { + panic!("{for_what} require(s) a HTTP connector, but none was available. Enable the `rustls` crate feature or set a connector to fix this.") + } } #[cfg(feature = "client-hyper")] diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index e868ffdac46..2568cc435d2 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -100,7 +100,10 @@ impl Builder { .read_timeout(DEFAULT_READ_TIMEOUT) .build() }); - let connector = expect_connector(provider_config.connector(&connector_settings)); + let connector = expect_connector( + "The HTTP credentials provider", + provider_config.connector(&connector_settings), + ); let mut client_builder = aws_smithy_client::Client::builder() .connector(connector) .middleware(Identity::new()); diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index e73c6454ac9..cb77b0759d5 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -430,7 +430,10 @@ impl Builder { .read_timeout(self.read_timeout.unwrap_or(DEFAULT_READ_TIMEOUT)) .build(); let connector_settings = ConnectorSettings::from_timeout_config(&timeout_config); - let connector = expect_connector(config.connector(&connector_settings)); + let connector = expect_connector( + "The IMDS credentials provider", + config.connector(&connector_settings), + ); let endpoint_source = self .endpoint .unwrap_or_else(|| EndpointSource::Env(config.clone())); diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index 9cdc47b7c97..c0c5707f24b 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -201,7 +201,7 @@ impl ImdsCredentialsProvider { return expiration; } - let rng = fastrand::Rng::with_seed( + let mut rng = fastrand::Rng::with_seed( now.duration_since(SystemTime::UNIX_EPOCH) .expect("now should be after UNIX EPOCH") .as_secs(), diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index f0e4e3bdca4..154659377fb 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -764,7 +764,7 @@ mod loader { assert_eq!(Some(&app_name), conf.app_name()); } - #[cfg(aws_sdk_orchestrator_mode)] + #[cfg(all(not(aws_sdk_middleware_mode), feature = "rustls"))] #[tokio::test] async fn disable_default_credentials() { let config = from_env().no_credentials().load().await; diff --git a/aws/rust-runtime/aws-config/src/sso.rs b/aws/rust-runtime/aws-config/src/sso.rs index a4b0314b1d1..592ed5b6bc6 100644 --- a/aws/rust-runtime/aws-config/src/sso.rs +++ b/aws/rust-runtime/aws-config/src/sso.rs @@ -65,6 +65,7 @@ impl SsoCredentialsProvider { let mut sso_config = SsoConfig::builder() .http_connector(expect_connector( + "The SSO credentials provider", provider_config.connector(&Default::default()), )) .retry_config(RetryConfig::standard()); diff --git a/aws/rust-runtime/aws-config/src/sts.rs b/aws/rust-runtime/aws-config/src/sts.rs index aba7a24bfc8..028409bfbef 100644 --- a/aws/rust-runtime/aws-config/src/sts.rs +++ b/aws/rust-runtime/aws-config/src/sts.rs @@ -18,7 +18,10 @@ use aws_smithy_types::retry::RetryConfig; impl crate::provider_config::ProviderConfig { pub(crate) fn sts_client_config(&self) -> StsConfigBuilder { let mut builder = aws_sdk_sts::Config::builder() - .http_connector(expect_connector(self.connector(&Default::default()))) + .http_connector(expect_connector( + "The STS features of aws-config", + self.connector(&Default::default()), + )) .retry_config(RetryConfig::standard()) .region(self.region()) .time_source(self.time_source()); diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 6ae8f0a6ad7..50a83b4b6d3 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -213,7 +213,10 @@ impl AssumeRoleProviderBuilder { .credentials_provider(provider) .time_source(conf.time_source()) .region(self.region.clone()) - .http_connector(expect_connector(conf.connector(&Default::default()))); + .http_connector(expect_connector( + "The AssumeRole credentials provider", + conf.connector(&Default::default()), + )); config.set_sleep_impl(conf.sleep()); let session_name = self.session_name.unwrap_or_else(|| { diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index 9970072b9e9..cbd1426fe2a 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -14,7 +14,7 @@ test-util = [] [dependencies] aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -fastrand = "1.4.0" +fastrand = "2.0.0" tokio = { version = "1.23.1", features = ["sync"] } tracing = "0.1" zeroize = "1" diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index aa6fdc1ddee..8ffcade9fcb 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -22,10 +22,11 @@ aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-types = { path = "../aws-types" } +fastrand = "2.0.0" http = "0.2.3" percent-encoding = "2.1.0" tracing = "0.1" -uuid = { version = "1", features = ["v4", "fast-rng"] } +uuid = { version = "1" } [dev-dependencies] aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 55cf9fd9e9f..3d2a2854ba2 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -9,9 +9,10 @@ use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use http::{HeaderName, HeaderValue}; use std::fmt::Debug; -use uuid::Uuid; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use fastrand::Rng; +use std::sync::Mutex; #[cfg(feature = "test-util")] pub use test_util::{NoInvocationIdGenerator, PredefinedInvocationIdGenerator}; @@ -46,10 +47,43 @@ impl Storable for DynInvocationIdGenerator { type Storer = StoreReplace; } +/// An invocation ID generator that uses random UUIDs for the invocation ID. +#[derive(Debug, Default)] +pub struct DefaultInvocationIdGenerator { + rng: Mutex, +} + +impl DefaultInvocationIdGenerator { + /// Creates a new [`DefaultInvocationIdGenerator`]. + pub fn new() -> Self { + Default::default() + } + + /// Creates a [`DefaultInvocationIdGenerator`] with the given seed. + pub fn with_seed(seed: u64) -> Self { + Self { + rng: Mutex::new(Rng::with_seed(seed)), + } + } +} + +impl InvocationIdGenerator for DefaultInvocationIdGenerator { + fn generate(&self) -> Result, BoxError> { + let mut rng = self.rng.lock().unwrap(); + let mut random_bytes = [0u8; 16]; + rng.fill(&mut random_bytes); + + let id = uuid::Builder::from_random_bytes(random_bytes).into_uuid(); + Ok(Some(InvocationId::new(id.to_string()))) + } +} + /// This interceptor generates a UUID and attaches it to all request attempts made as part of this operation. #[non_exhaustive] #[derive(Debug, Default)] -pub struct InvocationIdInterceptor {} +pub struct InvocationIdInterceptor { + default: DefaultInvocationIdGenerator, +} impl InvocationIdInterceptor { /// Creates a new `InvocationIdInterceptor` @@ -65,13 +99,13 @@ impl Interceptor for InvocationIdInterceptor { _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let id = cfg + let gen = cfg .load::() - .map(|gen| gen.generate()) - .transpose()? - .flatten(); - cfg.interceptor_state() - .store_put::(id.unwrap_or_default()); + .map(|gen| gen as &dyn InvocationIdGenerator) + .unwrap_or(&self.default); + if let Some(id) = gen.generate()? { + cfg.interceptor_state().store_put::(id); + } Ok(()) } @@ -83,10 +117,9 @@ impl Interceptor for InvocationIdInterceptor { cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let headers = ctx.request_mut().headers_mut(); - let id = cfg - .load::() - .ok_or("Expected an InvocationId in the ConfigBag but none was present")?; - headers.append(AMZ_SDK_INVOCATION_ID, id.0.clone()); + if let Some(id) = cfg.load::() { + headers.append(AMZ_SDK_INVOCATION_ID, id.0.clone()); + } Ok(()) } } @@ -96,21 +129,15 @@ impl Interceptor for InvocationIdInterceptor { pub struct InvocationId(HeaderValue); impl InvocationId { - /// Create a new, random, invocation ID. - pub fn new() -> Self { - Self::default() - } -} - -/// Defaults to a random UUID. -impl Default for InvocationId { - fn default() -> Self { - let id = Uuid::new_v4(); - let id = id - .to_string() - .parse() - .expect("UUIDs always produce a valid header value"); - Self(id) + /// Create an invocation ID with the given value. + /// + /// # Panics + /// This constructor will panic if the given invocation ID is not a valid HTTP header value. + pub fn new(invocation_id: String) -> Self { + Self( + HeaderValue::try_from(invocation_id) + .expect("invocation ID must be a valid HTTP header value"), + ) } } @@ -181,14 +208,14 @@ mod test_util { #[cfg(test)] mod tests { - use crate::invocation_id::{InvocationId, InvocationIdInterceptor}; + use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeTransmitInterceptorContextMut, InterceptorContext, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; - use aws_smithy_types::config_bag::ConfigBag; + use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::type_erasure::TypeErasedBox; use http::HeaderValue; @@ -200,7 +227,7 @@ mod tests { } #[test] - fn test_id_is_generated_and_set() { + fn default_id_generator() { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); ctx.enter_serialization_phase(); @@ -224,4 +251,36 @@ mod tests { // UUID should include 32 chars and 4 dashes assert_eq!(header.len(), 36); } + + #[cfg(feature = "test-util")] + #[test] + fn custom_id_generator() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + ctx.enter_serialization_phase(); + ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + let _ = ctx.take_input(); + ctx.enter_before_transmit_phase(); + + let mut cfg = ConfigBag::base(); + let mut layer = Layer::new("test"); + layer.store_put(DynInvocationIdGenerator::new( + PredefinedInvocationIdGenerator::new(vec![InvocationId::new( + "the-best-invocation-id".into(), + )]), + )); + cfg.push_layer(layer); + + let interceptor = InvocationIdInterceptor::new(); + let mut ctx = Into::into(&mut ctx); + interceptor + .modify_before_retry_loop(&mut ctx, &rc, &mut cfg) + .unwrap(); + interceptor + .modify_before_transmit(&mut ctx, &rc, &mut cfg) + .unwrap(); + + let header = expect_header(&ctx, "amz-sdk-invocation-id"); + assert_eq!("the-best-invocation-id", header); + } } diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 4d0728a9858..08e49469ba2 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -117,7 +117,7 @@ impl Builder { self } - /// Set the endpoint url to use when making requests. + /// Set the endpoint URL to use when making requests. /// # Examples /// ``` /// use aws_types::SdkConfig; @@ -128,7 +128,7 @@ impl Builder { self } - /// Set the endpoint url to use when making requests. + /// Set the endpoint URL to use when making requests. pub fn set_endpoint_url(&mut self, endpoint_url: Option) -> &mut Self { self.endpoint_url = endpoint_url; self diff --git a/aws/sdk-adhoc-test/build.gradle.kts b/aws/sdk-adhoc-test/build.gradle.kts index 3a631a5bb27..2e09902e5dc 100644 --- a/aws/sdk-adhoc-test/build.gradle.kts +++ b/aws/sdk-adhoc-test/build.gradle.kts @@ -37,7 +37,7 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") } -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "middleware" +fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" val allCodegenTests = listOf( CodegenTest( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index f236a08f49e..de6da933e32 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -37,6 +37,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.contextName import software.amazon.smithy.rust.codegen.core.util.cloneOperation import software.amazon.smithy.rust.codegen.core.util.expectTrait @@ -359,17 +360,18 @@ class AwsPresignedFluentBuilderMethod( val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) rustTemplate( """ - ##[derive(Debug)] + ##[derive(::std::fmt::Debug)] struct AlternatePresigningSerializerRuntimePlugin; impl #{RuntimePlugin} for AlternatePresigningSerializerRuntimePlugin { - fn config(&self) -> Option<#{FrozenLayer}> { + fn config(&self) -> #{Option}<#{FrozenLayer}> { use #{ConfigBagAccessors}; let mut cfg = #{Layer}::new("presigning_serializer"); cfg.set_request_serializer(#{SharedRequestSerializer}::new(#{AlternateSerializer})); - Some(cfg.freeze()) + #{Some}(cfg.freeze()) } } """, + *preludeScope, "AlternateSerializer" to alternateSerializer(operationShape), "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index 41fad244ef6..4f826ef35db 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -195,12 +195,8 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom rustTemplate( """ match ( - layer - .load::<#{CredentialsCache}>() - .cloned(), - layer - .load::<#{SharedCredentialsProvider}>() - .cloned(), + resolver.config_mut().load::<#{CredentialsCache}>().cloned(), + resolver.config_mut().load::<#{SharedCredentialsProvider}>().cloned(), ) { (#{None}, #{None}) => {} (#{None}, _) => { @@ -213,7 +209,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom #{Some}(credentials_cache), #{Some}(credentials_provider), ) => { - layer.store_put(credentials_cache.create_cache(credentials_provider)); + resolver.config_mut().store_put(credentials_cache.create_cache(credentials_provider)); } } """, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index 3cc4783a176..1d79f10a6a5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -178,7 +178,7 @@ fun decoratorForBuiltIn( private val endpointUrlDocs = writable { rust( """ - /// Sets the endpoint url used to communicate with this service + /// Sets the endpoint URL used to communicate with this service /// Note: this is used in combination with other endpoint rules, e.g. an API that applies a host-label prefix /// will be prefixed onto this URL. To fully override the endpoint resolver, use diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index a091664c1a4..38c7d76a839 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -152,8 +152,8 @@ class S3TestDependencies(private val codegenContext: ClientCodegenContext) : Lib // TODO(enableNewSmithyRuntimeCleanup): These additional dependencies may not be needed anymore when removing this flag // depending on if the sra-test is kept around or not. if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - addDependency(CargoDependency.smithyRuntime(codegenContext.runtimeConfig).toDevDependency()) - addDependency(CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig).toDevDependency()) + addDependency(smithyRuntime(codegenContext.runtimeConfig).toDevDependency()) + addDependency(smithyRuntimeApi(codegenContext.runtimeConfig).toDevDependency()) } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt index 0549ecf5255..a34c89f6e59 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt @@ -93,7 +93,7 @@ class SigV4SigningConfig( override fun section(section: ServiceConfig): Writable = writable { when (section) { ServiceConfig.ConfigImpl -> { - if (serviceHasEventStream) { + if (runtimeMode.generateMiddleware && serviceHasEventStream) { // enable the aws-sig-auth `sign-eventstream` feature addDependency(AwsRuntimeType.awsSigAuthEventStream(runtimeConfig).toSymbol()) } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 0dabd0033e6..ca5deedba85 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -40,7 +40,7 @@ fun awsTestCodegenContext(model: Model? = null, settings: ClientRustSettings? = // TODO(enableNewSmithyRuntimeCleanup): Remove defaultToOrchestrator once the runtime switches to the orchestrator fun awsSdkIntegrationTest( model: Model, - defaultToOrchestrator: Boolean = false, + defaultToOrchestrator: Boolean = true, test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> }, ) = clientIntegrationTest( diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 23f7aed78c2..1c975f58e48 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -61,7 +61,7 @@ val crateVersioner by lazy { aws.sdk.CrateVersioner.defaultFor(rootProject, prop fun getRustMSRV(): String = properties.get("rust.msrv") ?: throw Exception("Rust MSRV missing") fun getPreviousReleaseVersionManifestPath(): String? = properties.get("aws.sdk.previous.release.versions.manifest") -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "middleware" +fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" fun loadServiceMembership(): Membership { val membershipOverride = properties.get("aws.services")?.let { parseMembership(it) } @@ -101,6 +101,7 @@ fun generateSmithyBuild(services: AwsServices): String { }, "codegen": { "includeFluentClient": false, + "includeEndpointUrlConfig": false, "renameErrors": false, "debugMode": $debugMode, "eventStreamAllowList": [$eventStreamAllowListMembers], diff --git a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs index a29f74d72ff..6b83b189d52 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs @@ -6,7 +6,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; fn do_bench() { - #[cfg(not(aws_sdk_orchestrator_mode))] + #[cfg(aws_sdk_middleware_mode)] { use aws_sdk_dynamodb::operation::query::Query; use aws_smithy_http::response::ParseHttpResponse; diff --git a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs index 909ed85a515..f103c07c009 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs @@ -34,7 +34,7 @@ macro_rules! attr_obj { } fn do_bench(_config: &Config, _input: &PutItemInput) { - #[cfg(not(aws_sdk_orchestrator_mode))] + #[cfg(aws_sdk_middleware_mode)] { use futures_util::FutureExt; diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index 21ad0470bc8..162c1fc50b5 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] mod test { use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index e052dc28f2c..3a275b460d2 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_orchestrator_mode))] +#[cfg(aws_sdk_middleware_mode)] mod middleware_mode_tests { use aws_http::retry::AwsResponseRetryClassifier; use aws_sdk_kms as kms; @@ -66,7 +66,7 @@ mod middleware_mode_tests { } } -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] mod orchestrator_mode_tests { use aws_credential_types::Credentials; use aws_runtime::retries::classifier::AwsErrorCodeClassifier; diff --git a/aws/sdk/integration-tests/no-default-features/Cargo.toml b/aws/sdk/integration-tests/no-default-features/Cargo.toml index 545837f66ce..8408ac66940 100644 --- a/aws/sdk/integration-tests/no-default-features/Cargo.toml +++ b/aws/sdk/integration-tests/no-default-features/Cargo.toml @@ -17,6 +17,7 @@ publish = false aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", default-features = false } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } futures = "0.3.25" tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index 0ee5c7a5c30..ada59bc6f4e 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -3,6 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sdk_s3::config::{Config, Credentials, SharedAsyncSleep, Sleep}; +use aws_sdk_s3::error::DisplayErrorContext; +use aws_smithy_async::rt::sleep::AsyncSleep; +use std::time::Duration; + // This will fail due to lack of a connector when constructing the SDK Config #[tokio::test] #[should_panic( @@ -13,23 +18,58 @@ async fn test_clients_from_sdk_config() { } // This will fail due to lack of a connector when constructing the service client +#[cfg(not(aws_sdk_middleware_mode))] +#[tokio::test] +async fn test_clients_from_service_config() { + use aws_sdk_s3::config::Region; + + #[derive(Clone, Debug)] + struct StubSleep; + impl AsyncSleep for StubSleep { + fn sleep(&self, _duration: Duration) -> Sleep { + Sleep::new(Box::pin(async { /* no-op */ })) + } + } + + let config = Config::builder() + .region(Region::new("us-east-1")) + .credentials_provider(Credentials::for_tests()) + .sleep_impl(SharedAsyncSleep::new(StubSleep)) + .build(); + // Creating the client shouldn't panic or error since presigning doesn't require a connector + let client = aws_sdk_s3::Client::from_conf(config); + + let err = client + .list_buckets() + .send() + .await + .expect_err("it should fail to send a request because there is no connector"); + let msg = format!("{}", DisplayErrorContext(err)); + assert!( + msg.contains("No HTTP connector was available to send this request. Enable the `rustls` crate feature or set a connector to fix this."), + "expected '{msg}' to contain 'No HTTP connector was available to send this request. Enable the `rustls` crate feature or set a connector to fix this.'" + ); +} + +// TODO(enableNewSmithyRuntimeMode): Remove this test (covered above for orchestrator) +// +// This will fail due to lack of a connector when constructing the service client +#[cfg(aws_sdk_middleware_mode)] #[tokio::test] #[should_panic( expected = "No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this." )] -async fn test_clients_from_service_config() { +async fn test_clients_from_service_config_middleware() { #[derive(Clone, Debug)] struct StubSleep; - impl aws_smithy_async::rt::sleep::AsyncSleep for StubSleep { - fn sleep(&self, _duration: std::time::Duration) -> aws_sdk_s3::config::Sleep { + impl AsyncSleep for StubSleep { + fn sleep(&self, _duration: Duration) -> Sleep { todo!() } } - let config = aws_sdk_s3::Config::builder() - .sleep_impl(aws_smithy_async::rt::sleep::SharedAsyncSleep::new( - StubSleep {}, - )) + let config = Config::builder() + .sleep_impl(SharedAsyncSleep::new(StubSleep {})) .build(); // This will panic due to the lack of an HTTP connector aws_sdk_s3::Client::from_conf(config); diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index c504dba38d9..010d73f6598 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -26,7 +26,7 @@ aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1" bytes-utils = "0.1.2" -fastrand = "1.8.0" +fastrand = "2.0.0" futures-util = { version = "0.3.16", default-features = false } hdrhistogram = "7.5.2" http = "0.2.3" diff --git a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs index 8d1a604d95d..5c1d8969cd1 100644 --- a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs +++ b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs @@ -20,7 +20,7 @@ use aws_smithy_types::timeout::TimeoutConfig; use std::fmt::Debug; use std::time::{Duration, Instant}; -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; #[derive(Debug)] @@ -36,7 +36,7 @@ impl AsyncSleep for SmolSleep { #[test] fn test_smol_runtime_timeouts() { - #[cfg(aws_sdk_orchestrator_mode)] + #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = smol::block_on(async { timeout_test(SharedAsyncSleep::new(SmolSleep)).await }) @@ -48,7 +48,7 @@ fn test_smol_runtime_timeouts() { #[test] fn test_smol_runtime_retry() { - #[cfg(aws_sdk_orchestrator_mode)] + #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = smol::block_on(async { retry_test(SharedAsyncSleep::new(SmolSleep)).await }) { @@ -68,7 +68,7 @@ impl AsyncSleep for AsyncStdSleep { #[test] fn test_async_std_runtime_timeouts() { - #[cfg(aws_sdk_orchestrator_mode)] + #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = async_std::task::block_on(async { @@ -81,7 +81,7 @@ fn test_async_std_runtime_timeouts() { #[test] fn test_async_std_runtime_retry() { - #[cfg(aws_sdk_orchestrator_mode)] + #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index b3d93be8676..620b6405fa4 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -9,7 +9,7 @@ use aws_sdk_s3::Client; use aws_smithy_client::test_connection::{capture_request, CaptureRequestReceiver}; use aws_types::SdkConfig; -// TODO(enableNewSmithyRuntimeCleanup): Remove this attribute once #[cfg(aws_sdk_orchestrator_mode)] +// TODO(enableNewSmithyRuntimeCleanup): Remove this attribute once #[cfg(aws_sdk_middleware_mode)] // has been removed #[allow(dead_code)] fn test_client() -> (CaptureRequestReceiver, Client) { @@ -23,7 +23,7 @@ fn test_client() -> (CaptureRequestReceiver, Client) { (captured_request, client) } -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_force_path_style() { let (captured_request, client) = test_client(); @@ -42,7 +42,7 @@ async fn operation_overrides_force_path_style() { ); } -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_fips() { let (captured_request, client) = test_client(); @@ -61,7 +61,7 @@ async fn operation_overrides_fips() { ); } -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_dual_stack() { let (captured_request, client) = test_client(); @@ -84,7 +84,7 @@ async fn operation_overrides_dual_stack() { // accessed in ServiceRuntimePlugin::config. Currently, a credentials cache created for a single // operation invocation is not picked up by an identity resolver. /* -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_credentials_provider() { let (captured_request, client) = test_client(); diff --git a/aws/sdk/integration-tests/s3/tests/config_to_builder.rs b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs index 122b0418b67..af899ee2f60 100644 --- a/aws/sdk/integration-tests/s3/tests/config_to_builder.rs +++ b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn test_config_to_builder() { use aws_sdk_s3::config::AppName; diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index ec87eac2a39..0479f94bc51 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -62,7 +62,7 @@ async fn dual_stack() { ); } -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn multi_region_access_points() { let (_captured_request, client) = test_client(|b| b); @@ -84,7 +84,7 @@ async fn multi_region_access_points() { ); } -#[cfg(not(aws_sdk_orchestrator_mode))] +#[cfg(aws_sdk_middleware_mode)] #[tokio::test] async fn multi_region_access_points() { let (_captured_request, client) = test_client(|b| b); diff --git a/aws/sdk/integration-tests/sts/tests/signing-it.rs b/aws/sdk/integration-tests/sts/tests/signing-it.rs index 01727a53c91..74e82e00264 100644 --- a/aws/sdk/integration-tests/sts/tests/signing-it.rs +++ b/aws/sdk/integration-tests/sts/tests/signing-it.rs @@ -25,7 +25,7 @@ async fn assume_role_signed() { } // TODO(enableNewSmithyRuntimeCleanup): Delete the middleware version of this test -#[cfg(not(aws_sdk_orchestrator_mode))] +#[cfg(aws_sdk_middleware_mode)] #[tokio::test] async fn web_identity_unsigned() { let creds = Credentials::for_tests(); @@ -44,7 +44,7 @@ async fn web_identity_unsigned() { ); } -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn web_identity_unsigned() { let (server, request) = capture_request(None); diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index 447bdead218..16d4222515e 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(aws_sdk_orchestrator_mode)] +#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn do_endpoint_discovery() { use aws_credential_types::provider::SharedCredentialsProvider; diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index d2ab675425e..b484544c276 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -3,11 +3,13 @@ allowed_external_types = [ "aws_credential_types::*", "aws_endpoint::*", "aws_http::*", - "aws_sig_auth::*", + "aws_runtime::*", "aws_smithy_async::*", "aws_smithy_client::*", "aws_smithy_http::*", "aws_smithy_http_tower::*", + "aws_smithy_runtime::*", + "aws_smithy_runtime_api::*", "aws_smithy_types::*", "aws_types::*", "http::header::map::HeaderMap", diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index 8ccf6f6ad46..ae84542a3eb 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -15,7 +15,7 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "middleware" +fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" val pluginName = "rust-client-codegen" val workingDirUnderBuildDir = "smithyprojections/codegen-client-test/" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index f4d2fdeedec..0fec857bec7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -125,6 +125,8 @@ data class ClientCodegenConfig( val eventStreamAllowList: Set = defaultEventStreamAllowList, // TODO(SmithyRuntime): Remove this once we commit to switch to aws-smithy-runtime and aws-smithy-runtime-api val enableNewSmithyRuntime: SmithyRuntimeMode = defaultEnableNewSmithyRuntime, + /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */ + val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig, ) : CoreCodegenConfig( formatTimeoutSeconds, debugMode, ) { @@ -133,7 +135,8 @@ data class ClientCodegenConfig( private const val defaultIncludeFluentClient = true private const val defaultAddMessageToErrors = true private val defaultEventStreamAllowList: Set = emptySet() - private val defaultEnableNewSmithyRuntime = SmithyRuntimeMode.Middleware + private val defaultEnableNewSmithyRuntime = SmithyRuntimeMode.Orchestrator + private const val defaultIncludeEndpointUrlConfig = true fun fromCodegenConfigAndNode(coreCodegenConfig: CoreCodegenConfig, node: Optional) = if (node.isPresent) { @@ -144,11 +147,15 @@ data class ClientCodegenConfig( .map { array -> array.toList().mapNotNull { node -> node.asStringNode().orNull()?.value } } .orNull()?.toSet() ?: defaultEventStreamAllowList, renameExceptions = node.get().getBooleanMemberOrDefault("renameErrors", defaultRenameExceptions), - includeFluentClient = node.get().getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), - addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), + includeFluentClient = node.get() + .getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), + addMessageToErrors = node.get() + .getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), enableNewSmithyRuntime = SmithyRuntimeMode.fromString( node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware"), ), + includeEndpointUrlConfig = node.get() + .getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), ) } else { ClientCodegenConfig( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index e2d71aeae71..b0ba6b1f24b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -41,7 +41,6 @@ private class HttpConnectorConfigCustomization( *preludeScope, "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), "ConnectorSettings" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::ConnectorSettings"), - "default_connector" to RuntimeType.smithyClient(runtimeConfig).resolve("conns::default_connector"), "DynConnectorAdapter" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::connectors::adapter::DynConnectorAdapter"), "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), @@ -50,6 +49,31 @@ private class HttpConnectorConfigCustomization( "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), ) + private fun defaultConnectorFn(): RuntimeType = RuntimeType.forInlineFun("default_connector", ClientRustModule.config) { + rustTemplate( + """ + ##[cfg(feature = "rustls")] + fn default_connector( + connector_settings: &#{ConnectorSettings}, + sleep_impl: #{Option}<#{SharedAsyncSleep}>, + ) -> #{Option}<#{DynConnector}> { + #{default_connector}(connector_settings, sleep_impl) + } + + ##[cfg(not(feature = "rustls"))] + fn default_connector( + _connector_settings: &#{ConnectorSettings}, + _sleep_impl: #{Option}<#{SharedAsyncSleep}>, + ) -> #{Option}<#{DynConnector}> { + #{None} + } + """, + *codegenScope, + "default_connector" to RuntimeType.smithyClient(runtimeConfig).resolve("conns::default_connector"), + "DynConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("erase::DynConnector"), + ) + } + private fun setConnectorFn(): RuntimeType = RuntimeType.forInlineFun("set_connector", ClientRustModule.config) { rustTemplate( """ @@ -84,6 +108,7 @@ private class HttpConnectorConfigCustomization( } """, *codegenScope, + "default_connector" to defaultConnectorFn(), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index 81b89d989d8..2f81ef33f5f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -31,6 +31,7 @@ internal class EndpointConfigCustomization( private val codegenScope = arrayOf( *preludeScope, "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), + "Endpoint" to RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint::Endpoint"), "OldSharedEndpointResolver" to types.sharedEndpointResolver, "Params" to typesGenerator.paramsStruct(), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), @@ -125,9 +126,47 @@ internal class EndpointConfigCustomization( } else { "" } + if (codegenContext.settings.codegenConfig.includeEndpointUrlConfig) { + rustTemplate( + """ + /// Set the endpoint URL to use when making requests. + /// + /// Note: setting an endpoint URL will replace any endpoint resolver that has been set. + /// + /// ## Panics + /// Panics if an invalid URL is given. + pub fn endpoint_url(mut self, endpoint_url: impl #{Into}<#{String}>) -> Self { + self.set_endpoint_url(#{Some}(endpoint_url.into())); + self + } + + /// Set the endpoint URL to use when making requests. + /// + /// Note: setting an endpoint URL will replace any endpoint resolver that has been set. + /// + /// ## Panics + /// Panics if an invalid URL is given. + pub fn set_endpoint_url(&mut self, endpoint_url: #{Option}<#{String}>) -> &mut Self { + ##[allow(deprecated)] + self.set_endpoint_resolver( + endpoint_url.map(|url| { + #{OldSharedEndpointResolver}::new( + #{Endpoint}::immutable(url).expect("invalid endpoint URL") + ) + }) + ); + self + } + """, + *codegenScope, + ) + } rustTemplate( """ /// Sets the endpoint resolver to use when making requests. + /// + /// Note: setting an endpoint resolver will replace any endpoint URL that has been set. + /// $defaultResolverDocs pub fn endpoint_resolver(mut self, endpoint_resolver: impl $resolverTrait + 'static) -> Self { self.set_endpoint_resolver(#{Some}(#{OldSharedEndpointResolver}::new(endpoint_resolver))); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index b9dca27732b..1894dcd02a6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -32,6 +32,7 @@ import software.amazon.smithy.rust.codegen.core.util.PANIC import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.orNull +import software.amazon.smithy.rust.codegen.core.util.toPascalCase class EndpointParamsInterceptorGenerator( private val codegenContext: ClientCodegenContext, @@ -122,7 +123,7 @@ class EndpointParamsInterceptorGenerator( idx.getClientContextParams(codegenContext.serviceShape).orNull()?.parameters?.forEach { (name, param) -> val setterName = EndpointParamsGenerator.setterName(name) val inner = ClientContextConfigCustomization.toSymbol(param.type, symbolProvider) - val newtype = configParamNewtype(name, inner, codegenContext.runtimeConfig) + val newtype = configParamNewtype(name.toPascalCase(), inner, codegenContext.runtimeConfig) rustTemplate( ".$setterName(cfg.#{load_from_service_config_layer})", "load_from_service_config_layer" to loadFromConfigBag(inner.name, newtype), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 39795ed5033..0d93284e204 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -167,7 +167,7 @@ open class OperationGenerator( ) -> #{RuntimePlugins} { let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); #{additional_runtime_plugins} - if let Some(config_override) = config_override { + if let #{Some}(config_override) = config_override { for plugin in config_override.runtime_plugins.iter().cloned() { runtime_plugins = runtime_plugins.with_operation_plugin(plugin); } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index a798a9753b6..73bfe50780d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -67,15 +67,15 @@ class OperationRuntimePluginGenerator( let mut cfg = #{Layer}::new(${operationShape.id.name.dq()}); use #{ConfigBagAccessors} as _; - cfg.set_request_serializer(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); - cfg.set_response_deserializer(#{DynResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); + cfg.store_put(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); + cfg.store_put(#{DynResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); ${"" /* TODO(IdentityAndAuth): Resolve auth parameters from input for services that need this */} cfg.set_auth_option_resolver_params(#{AuthOptionResolverParams}::new(#{StaticAuthOptionResolverParams}::new())); #{additional_config} - Some(cfg.freeze()) + #{Some}(cfg.freeze()) } fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { @@ -85,7 +85,7 @@ class OperationRuntimePluginGenerator( #{Cow}::Owned( #{RuntimeComponentsBuilder}::new(${operationShape.id.name.dq()}) - .with_retry_classifiers(Some(retry_classifiers)) + .with_retry_classifiers(#{Some}(retry_classifiers)) #{auth_options} #{interceptors} ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index b5da3eaba9c..ed68a0b3068 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -101,7 +101,7 @@ class ServiceRuntimePluginGenerator( } writer.rustTemplate( """ - ##[derive(Debug)] + ##[derive(::std::fmt::Debug)] pub(crate) struct ServiceRuntimePlugin { config: #{Option}<#{FrozenLayer}>, runtime_components: #{RuntimeComponentsBuilder}, @@ -136,7 +136,7 @@ class ServiceRuntimePluginGenerator( """ let mut cfg = #{Layer}::new(${codegenContext.serviceShape.id.name.dq()}); #{additional_config} - Some(cfg.freeze()) + #{Some}(cfg.freeze()) """, *codegenScope, "additional_config" to additionalConfig, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 22c64d36e04..f4d9a4c705f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -34,7 +34,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait @@ -45,6 +44,7 @@ import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.outputShape import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import java.util.logging.Logger +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT data class ClientCreationParams( val codegenContext: ClientCodegenContext, @@ -81,9 +81,9 @@ class DefaultProtocolTestGenerator( """, "Client" to ClientRustModule.root.toType().resolve("Client"), "Builder" to ClientRustModule.client.toType().resolve("Builder"), - "SmithyEndpointStage" to RuntimeType.smithyHttp(codegenContext.runtimeConfig) + "SmithyEndpointStage" to RT.smithyHttp(codegenContext.runtimeConfig) .resolve("endpoint::middleware::SmithyEndpointStage"), - "MapRequestLayer" to RuntimeType.smithyHttpTower(codegenContext.runtimeConfig) + "MapRequestLayer" to RT.smithyHttpTower(codegenContext.runtimeConfig) .resolve("map_request::MapRequestLayer"), ) } else { @@ -100,6 +100,7 @@ class DefaultProtocolTestGenerator( } }, ) : ProtocolTestGenerator { + private val rc = codegenContext.runtimeConfig private val logger = Logger.getLogger(javaClass.name) private val inputShape = operationShape.inputShape(codegenContext.model) @@ -110,8 +111,8 @@ class DefaultProtocolTestGenerator( private val instantiator = ClientInstantiator(codegenContext) private val codegenScope = arrayOf( - "SmithyHttp" to RuntimeType.smithyHttp(codegenContext.runtimeConfig), - "AssertEq" to RuntimeType.PrettyAssertions.resolve("assert_eq!"), + "SmithyHttp" to RT.smithyHttp(rc), + "AssertEq" to RT.PrettyAssertions.resolve("assert_eq!"), ) sealed class TestCase { @@ -227,7 +228,7 @@ class DefaultProtocolTestGenerator( #{customParams} """, - "capture_request" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + "capture_request" to CargoDependency.smithyClient(rc) .toDevDependency() .withFeature("test-util") .toType() @@ -334,7 +335,7 @@ class DefaultProtocolTestGenerator( writeInline("let expected_output =") instantiator.render(this, expectedShape, testCase.params) write(";") - write("let mut http_response = #T::new()", RuntimeType.HttpResponseBuilder) + write("let mut http_response = #T::new()", RT.HttpResponseBuilder) testCase.headers.forEach { (key, value) -> writeWithNoFormatting(".header(${key.dq()}, ${value.dq()})") } @@ -344,12 +345,12 @@ class DefaultProtocolTestGenerator( .body(#T::from(${testCase.body.orNull()?.dq()?.replace("#", "##") ?: "vec![]"})) .unwrap(); """, - RuntimeType.sdkBody(runtimeConfig = codegenContext.runtimeConfig), + RT.sdkBody(runtimeConfig = rc), ) if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { rust( "let mut op_response = #T::new(http_response);", - RuntimeType.operationModule(codegenContext.runtimeConfig).resolve("Response"), + RT.operationModule(rc).resolve("Response"), ) rustTemplate( """ @@ -363,14 +364,19 @@ class DefaultProtocolTestGenerator( }); """, "op" to operationSymbol, - "copy_from_slice" to RuntimeType.Bytes.resolve("copy_from_slice"), - "parse_http_response" to RuntimeType.parseHttpResponse(codegenContext.runtimeConfig), + "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), + "parse_http_response" to RT.parseHttpResponse(rc), ) } else { rustTemplate( """ use #{ResponseDeserializer}; - let de = #{OperationDeserializer}; + use #{RuntimePlugin}; + + let op = #{Operation}::new(); + let config = op.config().expect("the operation has config"); + let de = config.load::<#{DynResponseDeserializer}>().expect("the config must have a deserializer"); + let parsed = de.deserialize_streaming(&mut http_response); let parsed = parsed.unwrap_or_else(|| { let http_response = http_response.map(|body| { @@ -379,12 +385,12 @@ class DefaultProtocolTestGenerator( de.deserialize_nonstreaming(&http_response) }); """, - "OperationDeserializer" to codegenContext.symbolProvider.moduleForShape(operationShape).toType() - .resolve("${operationSymbol.name}ResponseDeserializer"), - "copy_from_slice" to RuntimeType.Bytes.resolve("copy_from_slice"), - "ResponseDeserializer" to CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig).toType() - .resolve("client::orchestrator::ResponseDeserializer"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), + "DynResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::DynResponseDeserializer"), + "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), + "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::ResponseDeserializer"), + "RuntimePlugin" to RT.runtimePlugin(rc), + "SdkBody" to RT.sdkBody(rc), ) } if (expectedShape.hasTrait()) { @@ -432,9 +438,7 @@ class DefaultProtocolTestGenerator( } else { when (codegenContext.model.expectShape(member.target)) { is DoubleShape, is FloatShape -> { - addUseImports( - RuntimeType.protocolTest(codegenContext.runtimeConfig, "FloatEquals").toSymbol(), - ) + addUseImports(RT.protocolTest(rc, "FloatEquals").toSymbol()) rust( """ assert!(parsed.$memberName.float_equals(&expected_output.$memberName), @@ -470,8 +474,8 @@ class DefaultProtocolTestGenerator( "#T(&body, ${ rustWriter.escape(body).dq() }, #T::from(${(mediaType ?: "unknown").dq()}))", - RuntimeType.protocolTest(codegenContext.runtimeConfig, "validate_body"), - RuntimeType.protocolTest(codegenContext.runtimeConfig, "MediaType"), + RT.protocolTest(rc, "validate_body"), + RT.protocolTest(rc, "MediaType"), ) } } @@ -512,7 +516,7 @@ class DefaultProtocolTestGenerator( assertOk(rustWriter) { write( "#T($actualExpression, $variableName)", - RuntimeType.protocolTest(codegenContext.runtimeConfig, "validate_headers"), + RT.protocolTest(rc, "validate_headers"), ) } } @@ -566,7 +570,7 @@ class DefaultProtocolTestGenerator( assertOk(rustWriter) { write( "#T($actualExpression, $expectedVariableName)", - RuntimeType.protocolTest(codegenContext.runtimeConfig, checkFunction), + RT.protocolTest(rc, checkFunction), ) } } @@ -576,7 +580,7 @@ class DefaultProtocolTestGenerator( * for pretty printing protocol test helper results */ private fun assertOk(rustWriter: RustWriter, inner: Writable) { - rustWriter.write("#T(", RuntimeType.protocolTest(codegenContext.runtimeConfig, "assert_ok")) + rustWriter.write("#T(", RT.protocolTest(rc, "assert_ok")) inner(rustWriter) rustWriter.write(");") } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt index 1673ac299f0..a6da0a29a33 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt @@ -6,14 +6,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings +// TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by HttpAuthDecoratorTest) internal class ApiKeyAuthDecoratorTest { private val modelQuery = """ namespace test @@ -46,7 +47,8 @@ internal class ApiKeyAuthDecoratorTest { val testDir = clientIntegrationTest( modelQuery, // just run integration tests - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), + TestCodegenSettings.middlewareModeTestParams + .copy(command = { "cargo test --test *".runWithWarnings(it) }), ) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("api_key_present_in_property_bag") { val moduleName = clientCodegenContext.moduleUseName() @@ -136,7 +138,8 @@ internal class ApiKeyAuthDecoratorTest { val testDir = clientIntegrationTest( modelHeader, // just run integration tests - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), + TestCodegenSettings.middlewareModeTestParams + .copy(command = { "cargo test --test *".runWithWarnings(it) }), ) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("api_key_auth_is_set_in_http_header") { val moduleName = clientCodegenContext.moduleUseName() diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt index 73633a603ea..602e8482610 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt @@ -6,10 +6,10 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest @@ -18,6 +18,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.integrationTest // ./gradlew codegen-client:test --tests software.amazon.smithy.rust.codegen.client.HttpVersionListGeneratorTest --info // ``` +// TODO(enableNewSmithyRuntimeCleanup): Delete this test (incomplete http version support wasn't ported to orchestrator) internal class HttpVersionListGeneratorTest { @Test fun `http version list integration test (no preferred version)`() { @@ -44,7 +45,7 @@ internal class HttpVersionListGeneratorTest { greeting: String } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("http_version_list") { Attribute.TokioTest.render(this) @@ -95,7 +96,7 @@ internal class HttpVersionListGeneratorTest { greeting: String } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("validate_http") { Attribute.TokioTest.render(this) @@ -161,7 +162,7 @@ internal class HttpVersionListGeneratorTest { clientIntegrationTest( model, - IntegrationTestParams(addModuleToEventStreamAllowList = true), + TestCodegenSettings.middlewareModeTestParams.copy(addModuleToEventStreamAllowList = true), ) { clientCodegenContext, rustCrate -> val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("validate_eventstream_http") { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt index b84f204c240..b25e28c75ef 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt @@ -7,6 +7,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenConfig +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginGenerator import software.amazon.smithy.rust.codegen.client.testutil.clientRustSettings import software.amazon.smithy.rust.codegen.client.testutil.stubConfigProject import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext @@ -40,6 +42,12 @@ internal class ResiliencyConfigCustomizationTest { val codegenContext = testClientCodegenContext(model, settings = project.clientRustSettings()) stubConfigProject(codegenContext, ResiliencyConfigCustomization(codegenContext), project) + project.withModule(ClientRustModule.config) { + ServiceRuntimePluginGenerator(codegenContext).render( + this, + listOf(ResiliencyServiceRuntimePluginCustomization(codegenContext)), + ) + } ResiliencyReExportCustomization(codegenContext).extras(project) project.compileAndTest() } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 62fff162aac..6d5bcaa05ff 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -8,6 +8,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.string.shouldContain import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -120,12 +121,14 @@ class EndpointsDecoratorTest { } """.asSmithyModel() + // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by the second @Test below) @Test fun `set an endpoint in the property bag`() { val testDir = clientIntegrationTest( model, // Just run integration tests. - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), + TestCodegenSettings.middlewareModeTestParams + .copy(command = { "cargo test --test *".runWithWarnings(it) }), ) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("endpoint_params_test") { val moduleName = clientCodegenContext.moduleUseName() @@ -167,4 +170,102 @@ class EndpointsDecoratorTest { failure.output shouldContain "https://failingtest.com" "cargo clippy".runWithWarnings(testDir) } + + @Test + fun `resolve endpoint`() { + val testDir = clientIntegrationTest( + model, + // Just run integration tests. + IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), + ) { clientCodegenContext, rustCrate -> + rustCrate.integrationTest("endpoint_params_test") { + val moduleName = clientCodegenContext.moduleUseName() + Attribute.TokioTest.render(this) + rust( + """ + async fn endpoint_params_are_set() { + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_client::never::NeverConnector; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::orchestrator::EndpointResolverParams; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::config_bag::ConfigBag; + use aws_smithy_types::endpoint::Endpoint; + use aws_smithy_types::timeout::TimeoutConfig; + use std::sync::atomic::AtomicBool; + use std::sync::atomic::Ordering; + use std::sync::Arc; + use std::time::Duration; + use $moduleName::{ + config::endpoint::Params, config::interceptors::BeforeTransmitInterceptorContextRef, + config::Interceptor, config::SharedAsyncSleep, Client, Config, + }; + + ##[derive(Clone, Debug, Default)] + struct TestInterceptor { + called: Arc, + } + impl Interceptor for TestInterceptor { + fn read_before_transmit( + &self, + _context: &BeforeTransmitInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let params = cfg + .load::() + .expect("params set in config"); + let params: &Params = params.get().expect("correct type"); + assert_eq!( + params, + &Params::builder() + .bucket("bucket-name".to_string()) + .built_in_with_default("some-default") + .bool_built_in_with_default(true) + .a_bool_param(false) + .a_string_param("hello".to_string()) + .region("us-east-2".to_string()) + .build() + .unwrap() + ); + + let endpoint = cfg.load::().expect("endpoint set in config"); + assert_eq!(endpoint.url(), "https://www.us-east-2.example.com"); + + self.called.store(true, Ordering::Relaxed); + Ok(()) + } + } + + let interceptor = TestInterceptor::default(); + let config = Config::builder() + .http_connector(NeverConnector::new()) + .interceptor(interceptor.clone()) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_millis(30)) + .build(), + ) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .a_string_param("hello") + .a_bool_param(false) + .build(); + let client = Client::from_conf(config); + + let _ = dbg!(client.test_operation().bucket("bucket-name").send().await); + assert!( + interceptor.called.load(Ordering::Relaxed), + "the interceptor should have been called" + ); + } + """, + ) + } + } + // the model has an intentionally failing test—ensure it fails + val failure = shouldThrow { "cargo test".runWithWarnings(testDir) } + failure.output shouldContain "endpoint::test::test_1" + failure.output shouldContain "https://failingtest.com" + "cargo clippy".runWithWarnings(testDir) + } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index 34225e8dfd6..a94148d21cb 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -12,13 +12,16 @@ import org.junit.jupiter.params.provider.ValueSource import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.EndpointTrait import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.Attribute +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig @@ -120,9 +123,10 @@ internal class EndpointTraitBindingsTest { project.compileAndTest() } + // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by the @Test below it) @ExperimentalPathApi @Test - fun `endpoint integration test`() { + fun `endpoint integration test middleware`() { val model = """ namespace com.example use aws.protocols#awsJson1_0 @@ -142,7 +146,7 @@ internal class EndpointTraitBindingsTest { greeting: String } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("test_endpoint_prefix") { Attribute.TokioTest.render(this) @@ -168,4 +172,136 @@ internal class EndpointTraitBindingsTest { } } } + + @ExperimentalPathApi + @Test + fun `endpoint integration test`() { + val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @awsJson1_0 + @aws.api#service(sdkId: "Test", endpointPrefix: "differentprefix") + @endpointRuleSet({ + "version": "1.0", + "rules": [{ + "conditions": [], + "type": "endpoint", + "endpoint": { + "url": "https://example.com", + "properties": {} + } + }], + "parameters": {} + }) + service TestService { + operations: [SayHello], + version: "1" + } + @endpoint(hostPrefix: "test123.{greeting}.") + operation SayHello { + input: SayHelloInput + } + structure SayHelloInput { + @required + @hostLabel + greeting: String + } + """.asSmithyModel() + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + val moduleName = clientCodegenContext.moduleUseName() + rustCrate.integrationTest("test_endpoint_prefix") { + Attribute.TokioTest.render(this) + rustTemplate( + """ + async fn test_endpoint_prefix() { + use #{aws_smithy_client}::test_connection::capture_request; + use aws_smithy_http::body::SdkBody; + use aws_smithy_http::endpoint::EndpointPrefix; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::config_bag::ConfigBag; + use std::sync::atomic::{AtomicU32, Ordering}; + use std::sync::{Arc, Mutex}; + use $moduleName::{ + config::interceptors::BeforeTransmitInterceptorContextRef, + config::Interceptor, + error::DisplayErrorContext, + {Client, Config}, + }; + + ##[derive(Clone, Debug, Default)] + struct TestInterceptor { + called: Arc, + last_endpoint_prefix: Arc>>, + } + impl Interceptor for TestInterceptor { + fn read_before_transmit( + &self, + _context: &BeforeTransmitInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.called.fetch_add(1, Ordering::Relaxed); + if let Some(prefix) = cfg.load::() { + self.last_endpoint_prefix + .lock() + .unwrap() + .replace(prefix.clone()); + } + Ok(()) + } + } + + let (conn, _r) = capture_request(Some( + http::Response::builder() + .status(200) + .body(SdkBody::from("")) + .unwrap(), + )); + let interceptor = TestInterceptor::default(); + let config = Config::builder() + .http_connector(conn) + .interceptor(interceptor.clone()) + .build(); + let client = Client::from_conf(config); + let err = dbg!(client.say_hello().greeting("hey there!").send().await) + .expect_err("the endpoint should be invalid since it has an exclamation mark in it"); + let err_fmt = format!("{}", DisplayErrorContext(err)); + assert!( + err_fmt.contains("endpoint prefix could not be built"), + "expected '{}' to contain 'endpoint prefix could not be built'", + err_fmt + ); + + assert!( + interceptor.called.load(Ordering::Relaxed) == 0, + "the interceptor should not have been called since endpoint resolution failed" + ); + + dbg!(client.say_hello().greeting("hello").send().await) + .expect("hello is a valid endpoint prefix"); + assert!( + interceptor.called.load(Ordering::Relaxed) == 1, + "the interceptor should have been called" + ); + assert_eq!( + "test123.hello.", + interceptor + .last_endpoint_prefix + .lock() + .unwrap() + .clone() + .unwrap() + .as_str() + ); + } + """, + "aws_smithy_client" to CargoDependency.smithyClient(clientCodegenContext.runtimeConfig) + .toDevDependency().withFeature("test-util").toType(), + ) + } + } + } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt new file mode 100644 index 00000000000..daea27a0b89 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt @@ -0,0 +1,363 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol + +import io.kotest.matchers.string.shouldContain +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import software.amazon.smithy.aws.traits.protocols.RestJson1Trait +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator +import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.escape +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext +import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport +import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol +import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory +import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap +import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.util.CommandError +import software.amazon.smithy.rust.codegen.core.util.dq +import software.amazon.smithy.rust.codegen.core.util.outputShape +import java.nio.file.Path + +private class TestProtocolPayloadGenerator(private val body: String) : ProtocolPayloadGenerator { + override fun payloadMetadata(operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext) = + ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = false) + + override fun generatePayload( + writer: RustWriter, + shapeName: String, + operationShape: OperationShape, + additionalPayloadContext: AdditionalPayloadContext, + ) { + writer.writeWithNoFormatting(body) + } +} + +private class TestProtocolTraitImplGenerator( + private val codegenContext: ClientCodegenContext, + private val correctResponse: String, +) : HttpBoundProtocolTraitImplGenerator(codegenContext, RestJson(codegenContext)) { + private val symbolProvider = codegenContext.symbolProvider + + override fun generateTraitImpls( + operationWriter: RustWriter, + operationShape: OperationShape, + customizations: List, + ) { + operationWriter.rustTemplate( + """ + impl #{parse_strict} for ${operationShape.id.name}{ + type Output = Result<#{Output}, #{Error}>; + fn parse(&self, _response: &#{Response}<#{Bytes}>) -> Self::Output { + ${operationWriter.escape(correctResponse)} + } + } + """, + "parse_strict" to RuntimeType.parseStrictResponse(codegenContext.runtimeConfig), + "Output" to symbolProvider.toSymbol(operationShape.outputShape(codegenContext.model)), + "Error" to symbolProvider.symbolForOperationError(operationShape), + "Response" to RuntimeType.HttpResponse, + "Bytes" to RuntimeType.Bytes, + ) + } +} + +private class TestProtocolMakeOperationGenerator( + codegenContext: CodegenContext, + protocol: Protocol, + body: String, + private val httpRequestBuilder: String, +) : MakeOperationGenerator( + codegenContext, + protocol, + TestProtocolPayloadGenerator(body), + public = true, + includeDefaultPayloadHeaders = true, +) { + override fun createHttpRequest(writer: RustWriter, operationShape: OperationShape) { + writer.rust("#T::new()", RuntimeType.HttpRequestBuilder) + writer.writeWithNoFormatting(httpRequestBuilder) + } +} + +// A stubbed test protocol to do enable testing intentionally broken protocols +private class TestProtocolGenerator( + codegenContext: ClientCodegenContext, + protocol: Protocol, + httpRequestBuilder: String, + body: String, + correctResponse: String, +) : OperationGenerator( + codegenContext, + protocol, + TestProtocolMakeOperationGenerator(codegenContext, protocol, body, httpRequestBuilder), + TestProtocolPayloadGenerator(body), + TestProtocolTraitImplGenerator(codegenContext, correctResponse), +) + +private class TestProtocolFactory( + private val httpRequestBuilder: String, + private val body: String, + private val correctResponse: String, +) : ProtocolGeneratorFactory { + override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext) + + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator { + return TestProtocolGenerator( + codegenContext, + protocol(codegenContext), + httpRequestBuilder, + body, + correctResponse, + ) + } + + override fun support(): ProtocolSupport { + return ProtocolSupport( + requestSerialization = true, + requestBodySerialization = true, + responseDeserialization = true, + errorDeserialization = true, + requestDeserialization = false, + requestBodyDeserialization = false, + responseSerialization = false, + errorSerialization = false, + ) + } +} + +// TODO(enableNewSmithyRuntime): Delete this file/test (replaced by ProtocolTestGeneratorTest for the orchestrator) +class ProtocolTestGeneratorMiddlewareTest { + private val model = """ + namespace com.example + + use aws.protocols#restJson1 + use smithy.test#httpRequestTests + use smithy.test#httpResponseTests + + @restJson1 + service HelloService { + operations: [SayHello], + version: "1" + } + + @http(method: "POST", uri: "/") + @httpRequestTests([ + { + id: "say_hello", + protocol: restJson1, + params: { + "greeting": "Hi", + "name": "Teddy", + "query": "Hello there" + }, + method: "POST", + uri: "/", + queryParams: [ + "Hi=Hello%20there" + ], + forbidQueryParams: [ + "goodbye" + ], + requireQueryParams: ["required"], + headers: { + "X-Greeting": "Hi", + }, + body: "{\"name\": \"Teddy\"}", + bodyMediaType: "application/json" + } + ]) + @httpResponseTests([{ + id: "basic_response_test", + protocol: restJson1, + documentation: "Parses operations with empty JSON bodies", + body: "{\"value\": \"hey there!\"}", + params: {"value": "hey there!"}, + bodyMediaType: "application/json", + headers: {"Content-Type": "application/x-amz-json-1.1"}, + code: 200, + }]) + operation SayHello { + input: SayHelloInput, + output: SayHelloOutput, + errors: [BadRequest] + } + + structure SayHelloOutput { + value: String + } + + @error("client") + structure BadRequest { + message: String + } + + structure SayHelloInput { + @httpHeader("X-Greeting") + greeting: String, + + @httpQuery("Hi") + query: String, + + name: String + } + """.asSmithyModel() + private val correctBody = """{"name": "Teddy"}""" + + /** + * Creates a fake HTTP implementation for SayHello & generates the protocol test + * + * Returns the [Path] the service was generated at, suitable for running `cargo test` + */ + private fun testService( + httpRequestBuilder: String, + body: String = "${correctBody.dq()}.to_string()", + correctResponse: String = """Ok(crate::operation::say_hello::SayHelloOutput::builder().value("hey there!").build())""", + ): Path { + val codegenDecorator = object : ClientCodegenDecorator { + override val name: String = "mock" + override val order: Byte = 0 + override fun classpathDiscoverable(): Boolean = false + override fun protocols( + serviceId: ShapeId, + currentProtocols: ProtocolMap, + ): ProtocolMap = + // Intentionally replace the builtin implementation of RestJson1 with our fake protocol + mapOf(RestJson1Trait.ID to TestProtocolFactory(httpRequestBuilder, body, correctResponse)) + } + return clientIntegrationTest( + model, + TestCodegenSettings.middlewareModeTestParams, + additionalDecorators = listOf(codegenDecorator), + ) + } + + @Test + fun `passing e2e protocol request test`() { + testService( + """ + .uri("/?Hi=Hello%20there&required") + .header("X-Greeting", "Hi") + .method("POST") + """, + ) + } + + @Test + fun `test incorrect response parsing`() { + val err = assertThrows { + testService( + """ + .uri("/?Hi=Hello%20there&required") + .header("X-Greeting", "Hi") + .method("POST") + """, + correctResponse = "Ok(crate::operation::say_hello::SayHelloOutput::builder().build())", + ) + } + + err.message shouldContain "basic_response_test_response ... FAILED" + } + + @Test + fun `test invalid body`() { + val err = assertThrows { + testService( + """ + .uri("/?Hi=Hello%20there&required") + .header("X-Greeting", "Hi") + .method("POST") + """, + """"{}".to_string()""", + ) + } + + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "body did not match" + } + + @Test + fun `test invalid url parameter`() { + val err = assertThrows { + testService( + """ + .uri("/?Hi=INCORRECT&required") + .header("X-Greeting", "Hi") + .method("POST") + """, + ) + } + // Verify the test actually ran + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "missing query param" + } + + @Test + fun `test forbidden url parameter`() { + val err = assertThrows { + testService( + """ + .uri("/?goodbye&Hi=Hello%20there&required") + .header("X-Greeting", "Hi") + .method("POST") + """, + ) + } + // Verify the test actually ran + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "forbidden query param" + } + + @Test + fun `test required url parameter`() { + // Hard coded implementation for this 1 test + val err = assertThrows { + testService( + """ + .uri("/?Hi=Hello%20there") + .header("X-Greeting", "Hi") + .method("POST") + """, + ) + } + + // Verify the test actually ran + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "required query param missing" + } + + @Test + fun `invalid header`() { + val err = assertThrows { + testService( + """ + .uri("/?Hi=Hello%20there&required") + // should be "Hi" + .header("X-Greeting", "Hey") + .method("POST") + """, + ) + } + + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "invalid header value" + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index 28ffe745616..1d1cddeca46 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -8,138 +8,112 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol import io.kotest.matchers.string.shouldContain import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import software.amazon.smithy.aws.traits.protocols.RestJson1Trait import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.escape -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap -import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.outputShape import java.nio.file.Path - -private class TestProtocolPayloadGenerator(private val body: String) : ProtocolPayloadGenerator { - override fun payloadMetadata(operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext) = - ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = false) - - override fun generatePayload( - writer: RustWriter, - shapeName: String, - operationShape: OperationShape, - additionalPayloadContext: AdditionalPayloadContext, - ) { - writer.writeWithNoFormatting(body) - } -} - -private class TestProtocolTraitImplGenerator( - private val codegenContext: ClientCodegenContext, - private val correctResponse: String, -) : HttpBoundProtocolTraitImplGenerator(codegenContext, RestJson(codegenContext)) { - private val symbolProvider = codegenContext.symbolProvider - - override fun generateTraitImpls( - operationWriter: RustWriter, - operationShape: OperationShape, - customizations: List, - ) { - operationWriter.rustTemplate( - """ - impl #{parse_strict} for ${operationShape.id.name}{ - type Output = Result<#{Output}, #{Error}>; - fn parse(&self, _response: &#{Response}<#{Bytes}>) -> Self::Output { - ${operationWriter.escape(correctResponse)} - } +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT + +private class TestServiceRuntimePluginCustomization( + private val context: ClientCodegenContext, + private val fakeRequestBuilder: String, + private val fakeRequestBody: String, +) : ServiceRuntimePluginCustomization() { + override fun section(section: ServiceRuntimePluginSection): Writable = writable { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { + val rc = context.runtimeConfig + section.registerInterceptor(rc, this) { + rustTemplate( + """ + { + ##[derive(::std::fmt::Debug)] + struct TestInterceptor; + impl #{Interceptor} for TestInterceptor { + fn modify_before_retry_loop( + &self, + context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, + _rc: &#{RuntimeComponents}, + _cfg: &mut #{ConfigBag}, + ) -> #{Result}<(), #{BoxError}> { + // Replace the serialized request + let mut fake_req = ::http::Request::builder() + $fakeRequestBuilder + .body(#{SdkBody}::from($fakeRequestBody)) + .expect("valid request"); + ::std::mem::swap( + context.request_mut(), + &mut fake_req, + ); + Ok(()) + } + } + + TestInterceptor + } + """, + *preludeScope, + "BeforeTransmitInterceptorContextMut" to RT.beforeTransmitInterceptorContextMut(rc), + "BoxError" to RT.boxError(rc), + "ConfigBag" to RT.configBag(rc), + "Interceptor" to RT.interceptor(rc), + "RuntimeComponents" to RT.runtimeComponents(rc), + "SdkBody" to RT.sdkBody(rc), + ) } - """, - "parse_strict" to RuntimeType.parseStrictResponse(codegenContext.runtimeConfig), - "Output" to symbolProvider.toSymbol(operationShape.outputShape(codegenContext.model)), - "Error" to symbolProvider.symbolForOperationError(operationShape), - "Response" to RuntimeType.HttpResponse, - "Bytes" to RuntimeType.Bytes, - ) - } -} - -private class TestProtocolMakeOperationGenerator( - codegenContext: CodegenContext, - protocol: Protocol, - body: String, - private val httpRequestBuilder: String, -) : MakeOperationGenerator( - codegenContext, - protocol, - TestProtocolPayloadGenerator(body), - public = true, - includeDefaultPayloadHeaders = true, -) { - override fun createHttpRequest(writer: RustWriter, operationShape: OperationShape) { - writer.rust("#T::new()", RuntimeType.HttpRequestBuilder) - writer.writeWithNoFormatting(httpRequestBuilder) + } } } -// A stubbed test protocol to do enable testing intentionally broken protocols -private class TestProtocolGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, - httpRequestBuilder: String, - body: String, - correctResponse: String, -) : OperationGenerator( - codegenContext, - protocol, - TestProtocolMakeOperationGenerator(codegenContext, protocol, body, httpRequestBuilder), - TestProtocolPayloadGenerator(body), - TestProtocolTraitImplGenerator(codegenContext, correctResponse), -) - -private class TestProtocolFactory( - private val httpRequestBuilder: String, - private val body: String, - private val correctResponse: String, -) : ProtocolGeneratorFactory { - override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext) - - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator { - return TestProtocolGenerator( - codegenContext, - protocol(codegenContext), - httpRequestBuilder, - body, - correctResponse, - ) - } - - override fun support(): ProtocolSupport { - return ProtocolSupport( - requestSerialization = true, - requestBodySerialization = true, - responseDeserialization = true, - errorDeserialization = true, - requestDeserialization = false, - requestBodyDeserialization = false, - responseSerialization = false, - errorSerialization = false, - ) +private class TestOperationCustomization( + private val context: ClientCodegenContext, + private val fakeOutput: String, +) : OperationCustomization() { + override fun section(section: OperationSection): Writable = writable { + val rc = context.runtimeConfig + if (section is OperationSection.AdditionalRuntimePluginConfig) { + rustTemplate( + """ + // Override the default response deserializer with our fake output + ##[derive(::std::fmt::Debug)] + struct TestDeser; + impl #{ResponseDeserializer} for TestDeser { + fn deserialize_nonstreaming( + &self, + _response: &#{HttpResponse}, + ) -> #{Result}<#{Output}, #{OrchestratorError}<#{Error}>> { + let fake_out: #{Result}< + crate::operation::say_hello::SayHelloOutput, + crate::operation::say_hello::SayHelloError, + > = $fakeOutput; + fake_out + .map(|o| #{TypedBox}::new(o).erase()) + .map_err(|e| #{OrchestratorError}::operation(#{TypedBox}::new(e).erase_error())) + } + } + cfg.store_put(#{DynResponseDeserializer}::new(TestDeser)); + """, + *preludeScope, + "DynResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::DynResponseDeserializer"), + "Error" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Error"), + "HttpResponse" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), + "OrchestratorError" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::OrchestratorError"), + "Output" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Output"), + "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::ResponseDeserializer"), + "TypedBox" to RT.smithyTypes(rc).resolve("type_erasure::TypedBox"), + ) + } } } @@ -226,22 +200,34 @@ class ProtocolTestGeneratorTest { * Returns the [Path] the service was generated at, suitable for running `cargo test` */ private fun testService( - httpRequestBuilder: String, - body: String = "${correctBody.dq()}.to_string()", - correctResponse: String = """Ok(crate::operation::say_hello::SayHelloOutput::builder().value("hey there!").build())""", + fakeRequestBuilder: String, + fakeRequestBody: String = "${correctBody.dq()}.to_string()", + fakeOutput: String = """Ok(crate::operation::say_hello::SayHelloOutput::builder().value("hey there!").build())""", ): Path { val codegenDecorator = object : ClientCodegenDecorator { override val name: String = "mock" override val order: Byte = 0 override fun classpathDiscoverable(): Boolean = false - override fun protocols( - serviceId: ShapeId, - currentProtocols: ProtocolMap, - ): ProtocolMap = - // Intentionally replace the builtin implementation of RestJson1 with our fake protocol - mapOf(RestJson1Trait.ID to TestProtocolFactory(httpRequestBuilder, body, correctResponse)) + + override fun serviceRuntimePluginCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = baseCustomizations + TestServiceRuntimePluginCustomization( + codegenContext, + fakeRequestBuilder, + fakeRequestBody, + ) + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List = baseCustomizations + TestOperationCustomization(codegenContext, fakeOutput) } - return clientIntegrationTest(model, additionalDecorators = listOf(codegenDecorator)) + return clientIntegrationTest( + model, + additionalDecorators = listOf(codegenDecorator), + ) } @Test @@ -264,7 +250,7 @@ class ProtocolTestGeneratorTest { .header("X-Greeting", "Hi") .method("POST") """, - correctResponse = "Ok(crate::operation::say_hello::SayHelloOutput::builder().build())", + fakeOutput = "Ok(crate::operation::say_hello::SayHelloOutput::builder().build())", ) } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt index c5b2470dd9b..e655777be78 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt @@ -6,10 +6,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.protocols import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.util.lookup class AwsQueryCompatibleTest { @Test @@ -48,7 +53,168 @@ class AwsQueryCompatibleTest { } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { context, rustCrate -> + val operation: OperationShape = context.model.lookup("test#SomeOperation") + rustCrate.withModule(context.symbolProvider.moduleForShape(operation)) { + rustTemplate( + """ + ##[cfg(test)] + ##[#{tokio}::test] + async fn should_parse_code_and_type_fields() { + use #{smithy_client}::test_connection::infallible_connection_fn; + use aws_smithy_http::body::SdkBody; + + let response = |_: http::Request| { + http::Response::builder() + .header( + "x-amzn-query-error", + http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), + ) + .status(400) + .body( + SdkBody::from( + r##"{ + "__type": "com.amazonaws.sqs##QueueDoesNotExist", + "message": "Some user-visible message" + }"## + ) + ) + .unwrap() + }; + let client = crate::Client::from_conf( + crate::Config::builder() + .http_connector(infallible_connection_fn(response)) + .endpoint_url("http://localhost:1234") + .build() + ); + let error = dbg!(client.some_operation().send().await).err().unwrap().into_service_error(); + assert_eq!( + Some("AWS.SimpleQueueService.NonExistentQueue"), + error.meta().code(), + ); + assert_eq!(Some("Sender"), error.meta().extra("type")); + } + """, + "smithy_client" to CargoDependency.smithyClient(context.runtimeConfig) + .toDevDependency().withFeature("test-util").toType(), + "tokio" to CargoDependency.Tokio.toType(), + ) + } + } + } + + @Test + fun `aws-query-compatible json without aws query error should allow for retrieving error code from payload`() { + val model = """ + namespace test + use aws.protocols#awsJson1_0 + use aws.protocols#awsQueryCompatible + + @awsQueryCompatible + @awsJson1_0 + service TestService { + version: "2023-02-20", + operations: [SomeOperation] + } + + operation SomeOperation { + input: SomeOperationInputOutput, + output: SomeOperationInputOutput, + errors: [InvalidThingException], + } + + structure SomeOperationInputOutput { + a: String, + b: Integer + } + + @error("client") + structure InvalidThingException { + message: String + } + """.asSmithyModel() + + clientIntegrationTest(model) { context, rustCrate -> + val operation: OperationShape = context.model.lookup("test#SomeOperation") + rustCrate.withModule(context.symbolProvider.moduleForShape(operation)) { + rustTemplate( + """ + ##[cfg(test)] + ##[#{tokio}::test] + async fn should_parse_code_from_payload() { + use #{smithy_client}::test_connection::infallible_connection_fn; + use aws_smithy_http::body::SdkBody; + + let response = |_: http::Request| { + http::Response::builder() + .status(400) + .body( + SdkBody::from( + r##"{ + "__type": "com.amazonaws.sqs##QueueDoesNotExist", + "message": "Some user-visible message" + }"##, + ) + ) + .unwrap() + }; + let client = crate::Client::from_conf( + crate::Config::builder() + .http_connector(infallible_connection_fn(response)) + .endpoint_url("http://localhost:1234") + .build() + ); + let error = dbg!(client.some_operation().send().await).err().unwrap().into_service_error(); + assert_eq!(Some("QueueDoesNotExist"), error.meta().code()); + assert_eq!(None, error.meta().extra("type")); + } + """, + "smithy_client" to CargoDependency.smithyClient(context.runtimeConfig) + .toDevDependency().withFeature("test-util").toType(), + "tokio" to CargoDependency.Tokio.toType(), + ) + } + } + } + + // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced above for orchestrator) + @Test + fun `middleware - aws-query-compatible json with aws query error should allow for retrieving error code and type from custom header`() { + val model = """ + namespace test + use aws.protocols#awsJson1_0 + use aws.protocols#awsQueryCompatible + use aws.protocols#awsQueryError + + @awsQueryCompatible + @awsJson1_0 + service TestService { + version: "2023-02-20", + operations: [SomeOperation] + } + + operation SomeOperation { + input: SomeOperationInputOutput, + output: SomeOperationInputOutput, + errors: [InvalidThingException], + } + + structure SomeOperationInputOutput { + a: String, + b: Integer + } + + @awsQueryError( + code: "InvalidThing", + httpResponseCode: 400, + ) + @error("client") + structure InvalidThingException { + message: String + } + """.asSmithyModel() + + clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("should_parse_code_and_type_fields") { rust( @@ -87,8 +253,9 @@ class AwsQueryCompatibleTest { } } + // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced above for orchestrator) @Test - fun `aws-query-compatible json without aws query error should allow for retrieving error code from payload`() { + fun `middleware - aws-query-compatible json without aws query error should allow for retrieving error code from payload`() { val model = """ namespace test use aws.protocols#awsJson1_0 @@ -118,7 +285,7 @@ class AwsQueryCompatibleTest { } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("should_parse_code_from_payload") { rust( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 8dad31b91c0..8b03d9656cf 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -226,7 +226,7 @@ data class CargoDependency( val Url: CargoDependency = CargoDependency("url", CratesIo("2.3.1")) val Bytes: CargoDependency = CargoDependency("bytes", CratesIo("1.0.0")) val BytesUtils: CargoDependency = CargoDependency("bytes-utils", CratesIo("0.1.0")) - val FastRand: CargoDependency = CargoDependency("fastrand", CratesIo("1.8.0")) + val FastRand: CargoDependency = CargoDependency("fastrand", CratesIo("2.0.0")) val Hex: CargoDependency = CargoDependency("hex", CratesIo("0.4.3")) val Http: CargoDependency = CargoDependency("http", CratesIo("0.2.9")) val HttpBody: CargoDependency = CargoDependency("http-body", CratesIo("0.4.4")) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index fbd4ed69dd0..d3b7bd74204 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -338,6 +338,8 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag") fun configBagAccessors(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::config_bag_accessors::ConfigBagAccessors") + fun runtimeComponents(runtimeConfig: RuntimeConfig) = + smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponents") fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponentsBuilder") fun runtimePlugins(runtimeConfig: RuntimeConfig): RuntimeType = diff --git a/examples/pokemon-service-common/Cargo.toml b/examples/pokemon-service-common/Cargo.toml index d0012e178b2..f2c86eee0e5 100644 --- a/examples/pokemon-service-common/Cargo.toml +++ b/examples/pokemon-service-common/Cargo.toml @@ -21,3 +21,7 @@ aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http" } aws-smithy-http-server = { path = "../../rust-runtime/aws-smithy-http-server" } pokemon-service-client = { path = "../pokemon-service-client" } pokemon-service-server-sdk = { path = "../pokemon-service-server-sdk" } + +[dev-dependencies] +aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client", features = ["test-util"] } +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["test-util"] } diff --git a/examples/pokemon-service-common/src/lib.rs b/examples/pokemon-service-common/src/lib.rs index d8618e0cce3..cb5c4bd604a 100644 --- a/examples/pokemon-service-common/src/lib.rs +++ b/examples/pokemon-service-common/src/lib.rs @@ -16,12 +16,9 @@ use std::{ use async_stream::stream; use aws_smithy_client::{conns, hyper_ext::Adapter}; -use aws_smithy_http::{body::SdkBody, byte_stream::ByteStream, operation::Request}; +use aws_smithy_http::{body::SdkBody, byte_stream::ByteStream}; use aws_smithy_http_server::Extension; -use http::{ - uri::{Authority, Scheme}, - Uri, -}; +use http::Uri; use pokemon_service_server_sdk::{ error, input, model, model::CapturingPayload, output, types::Blob, }; @@ -38,21 +35,6 @@ const PIKACHU_ITALIAN_FLAVOR_TEXT: &str = const PIKACHU_JAPANESE_FLAVOR_TEXT: &str = "ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。ピンチのときに ほうでんする。"; -/// Rewrites the base URL of a request -pub fn rewrite_base_url( - scheme: Scheme, - authority: Authority, -) -> impl Fn(Request) -> Request + Clone { - move |mut req| { - let http_req = req.http_mut(); - let mut uri_parts = http_req.uri().clone().into_parts(); - uri_parts.authority = Some(authority.clone()); - uri_parts.scheme = Some(scheme.clone()); - *http_req.uri_mut() = Uri::from_parts(uri_parts).expect("failed to create uri from parts"); - req - } -} - /// Kills [`Child`] process when dropped. #[derive(Debug)] #[must_use] diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index 7a768cb0051..fb5f0fb4d76 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -14,7 +14,8 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, IdentityPlugin, Plugin}; use tower::{Layer, Service}; -use pokemon_service_client::{operation::do_nothing::DoNothingInput, Config}; +use aws_smithy_client::test_connection::capture_request; +use pokemon_service_client::{Client, Config}; use pokemon_service_common::do_nothing; trait OperationExt { @@ -43,13 +44,17 @@ async fn plugin_layers_are_executed_in_registration_order() { ) .do_nothing(do_nothing) .build_unchecked(); - let request = DoNothingInput::builder() - .build() - .unwrap() - .make_operation(&Config::builder().build()) - .await - .unwrap() - .into_http(); + + let request = { + let (conn, rcvr) = capture_request(None); + let config = Config::builder() + .http_connector(conn) + .endpoint_url("http://localhost:1234") + .build(); + Client::from_conf(config).do_nothing().send().await.unwrap(); + rcvr.expect_request() + }; + app.call(request).await.unwrap(); let output_guard = output.lock().unwrap(); diff --git a/examples/pokemon-service-tls/tests/common/mod.rs b/examples/pokemon-service-tls/tests/common/mod.rs index 5eb9d804bae..c56c5fe59f9 100644 --- a/examples/pokemon-service-tls/tests/common/mod.rs +++ b/examples/pokemon-service-tls/tests/common/mod.rs @@ -3,18 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::{fs::File, io::BufReader, process::Command, str::FromStr, time::Duration}; +use std::{fs::File, io::BufReader, process::Command, time::Duration}; use assert_cmd::prelude::*; -use aws_smithy_client::{ - erase::{DynConnector, DynMiddleware}, - hyper_ext::Adapter, -}; -use hyper::http::uri::{Authority, Scheme}; +use aws_smithy_client::hyper_ext::Adapter; use tokio::time::sleep; -use pokemon_service_client::{Builder, Client, Config}; -use pokemon_service_common::{rewrite_base_url, ChildDrop}; +use pokemon_service_client::{Client, Config}; +use pokemon_service_common::ChildDrop; use pokemon_service_tls::{DEFAULT_DOMAIN, DEFAULT_PORT, DEFAULT_TEST_CERT}; pub async fn run_server() -> ChildDrop { @@ -28,7 +24,7 @@ pub async fn run_server() -> ChildDrop { // Returns a client that only talks through https and http2 connections. // It is useful in testing whether our server can talk to http2. -pub fn client_http2_only() -> Client> { +pub fn client_http2_only() -> Client { // Create custom cert store and add our test certificate to prevent unknown cert issues. let mut reader = BufReader::new(File::open(DEFAULT_TEST_CERT).expect("could not open certificate")); @@ -47,12 +43,9 @@ pub fn client_http2_only() -> Client> .enable_http2() .build(); - let authority = Authority::from_str(&format!("{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) - .expect("could not parse authority"); - let raw_client = Builder::new() - .connector(DynConnector::new(Adapter::builder().build(connector))) - .middleware_fn(rewrite_base_url(Scheme::HTTPS, authority)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) + let config = Config::builder() + .http_connector(Adapter::builder().build(connector)) + .endpoint_url(format!("https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) + .build(); + Client::from_conf(config) } diff --git a/examples/pokemon-service/tests/common/mod.rs b/examples/pokemon-service/tests/common/mod.rs index d10430bfbd7..2d58f4a975a 100644 --- a/examples/pokemon-service/tests/common/mod.rs +++ b/examples/pokemon-service/tests/common/mod.rs @@ -3,16 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::{process::Command, str::FromStr, time::Duration}; +use std::{process::Command, time::Duration}; use assert_cmd::prelude::*; -use aws_smithy_client::erase::{DynConnector, DynMiddleware}; -use hyper::http::uri::{Authority, Scheme}; use tokio::time::sleep; use pokemon_service::{DEFAULT_ADDRESS, DEFAULT_PORT}; -use pokemon_service_client::{Builder, Client, Config}; -use pokemon_service_common::{rewrite_base_url, ChildDrop}; +use pokemon_service_client::{Client, Config}; +use pokemon_service_common::ChildDrop; pub async fn run_server() -> ChildDrop { let crate_name = std::env::var("CARGO_PKG_NAME").unwrap(); @@ -27,13 +25,9 @@ pub fn base_url() -> String { format!("http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}") } -pub fn client() -> Client> { - let authority = Authority::from_str(&format!("{DEFAULT_ADDRESS}:{DEFAULT_PORT}")) - .expect("could not parse authority"); - let raw_client = Builder::new() - .rustls_connector(Default::default()) - .middleware_fn(rewrite_base_url(Scheme::HTTP, authority)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) +pub fn client() -> Client { + let config = Config::builder() + .endpoint_url(format!("http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}")) + .build(); + Client::from_conf(config) } diff --git a/examples/python/pokemon-service-test/tests/helpers.rs b/examples/python/pokemon-service-test/tests/helpers.rs index 23050a3da3a..708e17fe883 100644 --- a/examples/python/pokemon-service-test/tests/helpers.rs +++ b/examples/python/pokemon-service-test/tests/helpers.rs @@ -8,19 +8,15 @@ use std::io::BufReader; use std::process::Command; use std::time::Duration; -use aws_smithy_client::{erase::DynConnector, hyper_ext::Adapter}; -use aws_smithy_http::operation::Request; +use aws_smithy_client::hyper_ext::Adapter; use command_group::{CommandGroup, GroupChild}; -use pokemon_service_client::{Builder, Client, Config}; +use pokemon_service_client::{Client, Config}; use tokio::time; const TEST_KEY: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/testdata/localhost.key"); const TEST_CERT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/testdata/localhost.crt"); -pub type PokemonClient = Client< - aws_smithy_client::erase::DynConnector, - aws_smithy_client::erase::DynMiddleware, ->; +pub type PokemonClient = Client; enum PokemonServiceVariant { Http, @@ -94,12 +90,8 @@ impl Drop for PokemonService { #[allow(dead_code)] pub fn client() -> PokemonClient { let base_url = PokemonServiceVariant::Http.base_url(); - let raw_client = Builder::new() - .rustls_connector(Default::default()) - .middleware_fn(rewrite_base_url(base_url)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) + let config = Config::builder().endpoint_url(base_url).build(); + Client::from_conf(config) } #[allow(dead_code)] @@ -122,19 +114,9 @@ pub fn http2_client() -> PokemonClient { .build(); let base_url = PokemonServiceVariant::Http2.base_url(); - let raw_client = Builder::new() - .connector(DynConnector::new(Adapter::builder().build(connector))) - .middleware_fn(rewrite_base_url(base_url)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) -} - -fn rewrite_base_url(base_url: &'static str) -> impl Fn(Request) -> Request + Clone { - move |mut req| { - let http_req = req.http_mut(); - let uri = format!("{base_url}{}", http_req.uri().path()); - *http_req.uri_mut() = uri.parse().unwrap(); - req - } + let config = Config::builder() + .http_connector(Adapter::builder().build(connector)) + .endpoint_url(base_url) + .build(); + Client::from_conf(config) } diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index 8d6ac25eaf0..826ce5eb3d3 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -23,7 +23,7 @@ aws-smithy-http-tower = { path = "../aws-smithy-http-tower" } aws-smithy-protocol-test = { path = "../aws-smithy-protocol-test", optional = true } aws-smithy-types = { path = "../aws-smithy-types" } bytes = "1" -fastrand = "1.4.0" +fastrand = "2.0.0" http = "0.2.3" http-body = "0.4.4" hyper = { version = "0.14.26", features = ["client", "http2", "http1", "tcp"], optional = true } diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index b481d7ff99b..8f5dc864ee2 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -21,7 +21,7 @@ aws-smithy-protocol-test = { path = "../aws-smithy-protocol-test", optional = tr aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } aws-smithy-types = { path = "../aws-smithy-types" } bytes = "1" -fastrand = "1.4" +fastrand = "2.0.0" http = "0.2.8" http-body = "0.4.5" once_cell = "1.18.0" diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 38b8852acbf..30aa1666cba 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -335,7 +335,8 @@ async fn try_attempt( let request = ctx.take_request().expect("set during serialization"); trace!(request = ?request, "transmitting request"); let connector = halt_on_err!([ctx] => runtime_components.connector().ok_or_else(|| - OrchestratorError::other("a connector is required to send requests") + OrchestratorError::other("No HTTP connector was available to send this request. \ + Enable the `rustls` crate feature or set a connector to fix this.") )); connector.call(request).await.map_err(|err| { match err.downcast() { diff --git a/rust-runtime/inlineable/Cargo.toml b/rust-runtime/inlineable/Cargo.toml index 5e7351291fc..74bbcdebc0c 100644 --- a/rust-runtime/inlineable/Cargo.toml +++ b/rust-runtime/inlineable/Cargo.toml @@ -26,7 +26,7 @@ aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } aws-smithy-types = { path = "../aws-smithy-types" } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1" -fastrand = "1" +fastrand = "2.0.0" futures-util = "0.3" http = "0.2.1" md-5 = "0.10.0" diff --git a/tools/ci-scripts/check-aws-sdk-middleware-impl b/tools/ci-scripts/check-aws-sdk-middleware-impl new file mode 100755 index 00000000000..ea6cfe85df9 --- /dev/null +++ b/tools/ci-scripts/check-aws-sdk-middleware-impl @@ -0,0 +1,27 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +# This script tests the SDK smoke test services against the middleware implementation + +C_YELLOW='\033[1;33m' +C_RESET='\033[0m' + +set -eu +cd smithy-rs + +./gradlew aws:sdk:assemble -Psmithy.runtime.mode=middleware + +cd aws/sdk/build/aws-sdk/sdk +for service in */; do + pushd "${service}" + echo -e "${C_YELLOW}# Running 'cargo test --all-features' on '${service}'${C_RESET}" + RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_middleware_mode" cargo test --all-features --all-targets --no-fail-fast + echo -e "${C_YELLOW}# Running 'cargo clippy --all-features' on '${service}'${C_RESET}" + RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_middleware_mode" cargo clippy --all-features + popd +done + +echo "SUCCESS" diff --git a/tools/ci-scripts/check-aws-sdk-orchestrator-impl b/tools/ci-scripts/check-aws-sdk-orchestrator-impl deleted file mode 100755 index b86ebf3f0f6..00000000000 --- a/tools/ci-scripts/check-aws-sdk-orchestrator-impl +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# - -# This script tests the SDK smoke test services against the orchestrator implementation - -C_YELLOW='\033[1;33m' -C_RESET='\033[0m' - -set -eu -cd smithy-rs - -services_that_pass_tests=(\ - "aws-config"\ - "config"\ - "dynamodb"\ - "ec2"\ - "ecs"\ - "glacier"\ - "iam"\ - "kms"\ - "lambda"\ - "polly"\ - "qldbsession"\ - "route53"\ - "s3"\ - "s3control"\ - "sso"\ - "sts"\ - "timestreamquery"\ - "timestreamwrite"\ - "transcribestreaming"\ -) - -./gradlew aws:sdk:assemble -Psmithy.runtime.mode=orchestrator - -cd aws/sdk/build/aws-sdk/sdk -for service in "${services_that_pass_tests[@]}"; do - pushd "${service}" - echo -e "${C_YELLOW}# Running 'cargo test --all-features' on '${service}'${C_RESET}" - RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_orchestrator_mode" cargo test --all-features --all-targets --no-fail-fast - echo -e "${C_YELLOW}# Running 'cargo clippy --all-features' on '${service}'${C_RESET}" - RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_orchestrator_mode" cargo clippy --all-features - popd -done - -echo "SUCCESS" From 255127a1149ecb471cc75e246287f17778561b2f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 20 Jul 2023 11:13:34 -0700 Subject: [PATCH 023/331] Make the SDK invocation ID generator configurable (#2860) This PR makes it possible to configure the invocation ID generator in config. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-runtime/src/invocation_id.rs | 24 +++---- .../smithy/rustsdk/InvocationIdDecorator.kt | 71 +++++++++++++++++++ .../test/kotlin/SdkCodegenIntegrationTest.kt | 70 +++++++++--------- .../rustsdk/InvocationIdDecoratorTest.kt | 61 ++++++++++++++++ 4 files changed, 180 insertions(+), 46 deletions(-) create mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 3d2a2854ba2..16d3fc98117 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -6,13 +6,13 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use fastrand::Rng; use http::{HeaderName, HeaderValue}; use std::fmt::Debug; +use std::sync::{Arc, Mutex}; -use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; -use fastrand::Rng; -use std::sync::Mutex; #[cfg(feature = "test-util")] pub use test_util::{NoInvocationIdGenerator, PredefinedInvocationIdGenerator}; @@ -27,23 +27,23 @@ pub trait InvocationIdGenerator: Debug + Send + Sync { } /// Dynamic dispatch implementation of [`InvocationIdGenerator`] -#[derive(Debug)] -pub struct DynInvocationIdGenerator(Box); +#[derive(Clone, Debug)] +pub struct SharedInvocationIdGenerator(Arc); -impl DynInvocationIdGenerator { - /// Creates a new [`DynInvocationIdGenerator`]. +impl SharedInvocationIdGenerator { + /// Creates a new [`SharedInvocationIdGenerator`]. pub fn new(gen: impl InvocationIdGenerator + 'static) -> Self { - Self(Box::new(gen)) + Self(Arc::new(gen)) } } -impl InvocationIdGenerator for DynInvocationIdGenerator { +impl InvocationIdGenerator for SharedInvocationIdGenerator { fn generate(&self) -> Result, BoxError> { self.0.generate() } } -impl Storable for DynInvocationIdGenerator { +impl Storable for SharedInvocationIdGenerator { type Storer = StoreReplace; } @@ -100,7 +100,7 @@ impl Interceptor for InvocationIdInterceptor { cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let gen = cfg - .load::() + .load::() .map(|gen| gen as &dyn InvocationIdGenerator) .unwrap_or(&self.default); if let Some(id) = gen.generate()? { @@ -264,7 +264,7 @@ mod tests { let mut cfg = ConfigBag::base(); let mut layer = Layer::new("test"); - layer.store_put(DynInvocationIdGenerator::new( + layer.store_put(SharedInvocationIdGenerator::new( PredefinedInvocationIdGenerator::new(vec![InvocationId::new( "the-best-invocation-id".into(), )]), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt index 9b9fcccb49f..1fdbfcb06fb 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt @@ -9,14 +9,19 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.util.letIf class InvocationIdDecorator : ClientCodegenDecorator { override val name: String get() = "InvocationIdDecorator" override val order: Byte get() = 0 + override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, @@ -24,6 +29,14 @@ class InvocationIdDecorator : ClientCodegenDecorator { baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { it + listOf(InvocationIdRuntimePluginCustomization(codegenContext)) } + + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = + baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { + it + listOf(InvocationIdConfigCustomization(codegenContext)) + } } private class InvocationIdRuntimePluginCustomization( @@ -43,3 +56,61 @@ private class InvocationIdRuntimePluginCustomization( } } } + +const val GENERATOR_DOCS: String = + "The invocation ID generator generates ID values for the `amz-sdk-invocation-id` header. " + + "By default, this will be a random UUID. Overriding it may be useful in tests that " + + "examine the HTTP request and need to be deterministic." + +private class InvocationIdConfigCustomization( + codegenContext: ClientCodegenContext, +) : ConfigCustomization() { + private val awsRuntime = AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) + private val codegenScope = arrayOf( + *preludeScope, + "InvocationIdGenerator" to awsRuntime.resolve("invocation_id::InvocationIdGenerator"), + "SharedInvocationIdGenerator" to awsRuntime.resolve("invocation_id::SharedInvocationIdGenerator"), + ) + + override fun section(section: ServiceConfig): Writable = writable { + when (section) { + is ServiceConfig.BuilderImpl -> { + docs("Overrides the default invocation ID generator.\n\n$GENERATOR_DOCS") + rustTemplate( + """ + pub fn invocation_id_generator(mut self, gen: impl #{InvocationIdGenerator} + 'static) -> Self { + self.set_invocation_id_generator(#{Some}(#{SharedInvocationIdGenerator}::new(gen))); + self + } + """, + *codegenScope, + ) + + docs("Overrides the default invocation ID generator.\n\n$GENERATOR_DOCS") + rustTemplate( + """ + pub fn set_invocation_id_generator(&mut self, gen: #{Option}<#{SharedInvocationIdGenerator}>) -> &mut Self { + self.config.store_or_unset(gen); + self + } + """, + *codegenScope, + ) + } + + is ServiceConfig.ConfigImpl -> { + docs("Returns the invocation ID generator if one was given in config.\n\n$GENERATOR_DOCS") + rustTemplate( + """ + pub fn invocation_id_generator(&self) -> #{Option}<#{SharedInvocationIdGenerator}> { + self.config.load::<#{SharedInvocationIdGenerator}>().cloned() + } + """, + *codegenScope, + ) + } + + else -> {} + } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt index fde2f32ae7d..8ece4a5aa1e 100644 --- a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt @@ -8,41 +8,43 @@ import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rustsdk.awsSdkIntegrationTest class SdkCodegenIntegrationTest { - val model = """ - namespace test - - use aws.api#service - use aws.auth#sigv4 - use aws.protocols#restJson1 - use smithy.rules#endpointRuleSet - - @service(sdkId: "dontcare") - @restJson1 - @sigv4(name: "dontcare") - @auth([sigv4]) - @endpointRuleSet({ - "version": "1.0", - "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], - "parameters": { - "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + companion object { + val model = """ + namespace test + + use aws.api#service + use aws.auth#sigv4 + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + + @service(sdkId: "dontcare") + @restJson1 + @sigv4(name: "dontcare") + @auth([sigv4]) + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + }) + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String } - }) - service TestService { - version: "2023-01-01", - operations: [SomeOperation] - } - - structure SomeOutput { - someAttribute: Long, - someVal: String - } - - @http(uri: "/SomeOperation", method: "GET") - @optionalAuth - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() + + @http(uri: "/SomeOperation", method: "GET") + @optionalAuth + operation SomeOperation { + output: SomeOutput + } + """.asSmithyModel() + } @Test fun smokeTestSdkCodegen() { diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt new file mode 100644 index 00000000000..857139c9f92 --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import SdkCodegenIntegrationTest +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class InvocationIdDecoratorTest { + @Test + fun customInvocationIdGenerator() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { context, rustCrate -> + val rc = context.runtimeConfig + val moduleName = context.moduleUseName() + rustCrate.integrationTest("custom_invocation_id") { + rustTemplate( + """ + ##[#{tokio}::test] + async fn custom_invocation_id() { + ##[derive(::std::fmt::Debug)] + struct TestIdGen; + impl #{InvocationIdGenerator} for TestIdGen { + fn generate(&self) -> #{Result}<#{Option}<#{InvocationId}>, #{BoxError}> { + #{Ok}(#{Some}(#{InvocationId}::new("custom".into()))) + } + } + + let (conn, rx) = #{capture_request}(None); + let config = $moduleName::Config::builder() + .http_connector(conn) + .invocation_id_generator(TestIdGen) + .build(); + assert!(config.invocation_id_generator().is_some()); + + let client = $moduleName::Client::from_conf(config); + + let _ = client.some_operation().send().await; + let request = rx.expect_request(); + assert_eq!("custom", request.headers().get("amz-sdk-invocation-id").unwrap()); + } + """, + *preludeScope, + "tokio" to CargoDependency.Tokio.toType(), + "InvocationIdGenerator" to AwsRuntimeType.awsRuntime(rc) + .resolve("invocation_id::InvocationIdGenerator"), + "InvocationId" to AwsRuntimeType.awsRuntime(rc) + .resolve("invocation_id::InvocationId"), + "BoxError" to RuntimeType.boxError(rc), + "capture_request" to RuntimeType.captureRequest(rc), + ) + } + } + } +} From 7f714db5328dcbf3d386ae9baf9d5af9d2cb7670 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 20 Jul 2023 12:09:51 -0700 Subject: [PATCH 024/331] Improve docs on config bag and type erasure (#2862) This PR improves the docs on the aws-smithy-types `config_bag` and `type_erasure` modules. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-types/src/config_bag.rs | 241 ++++++++++++++---- .../src/config_bag/storable.rs | 6 + rust-runtime/aws-smithy-types/src/lib.rs | 4 - .../aws-smithy-types/src/type_erasure.rs | 33 ++- 4 files changed, 230 insertions(+), 54 deletions(-) diff --git a/rust-runtime/aws-smithy-types/src/config_bag.rs b/rust-runtime/aws-smithy-types/src/config_bag.rs index cf17108f2c7..f2bcc01d4c7 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag.rs @@ -3,12 +3,133 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! Layered Configuration Bag Structure +//! Layers and layered bags of configuration data. +//! +//! The [`ConfigBag`](crate::config_bag::ConfigBag) structure is used to store and pass around configuration for client operations. +//! Interacting with it may be required in order to write an `Interceptor` or `RuntimePlugin` to +//! customize a client. +//! +//! A `ConfigBag` is essentially a stack of several immutable and sharable layers, with a single _mutable_ layer at +//! the top of the stack that is called "interceptor state". The intent of this last mutable layer is to allow for +//! more performant mutation of config within the execution of an operation. +//! +//! There are three separate layer types to be aware of when using a `ConfigBag`: +//! 1. [`Layer`](crate::config_bag::Layer) - A mutable layer. This is usually only used for adding config +//! to the `ConfigBag`, but is also used for the interceptor state. +//! 2. [`CloneableLayer`](crate::config_bag::CloneableLayer) - Identical to `Layer`, except that it requires +//! `Clone` bounds on the items added to it so that it can be deep cloned. Can be converted to a `Layer` +//! while retaining the cloneability of its items such that the resulting layer could be cloned as long as +//! nothing else is added to it later. A `Layer` cannot be converted back into a `CloneableLayer`. +//! 3. [`FrozenLayer`](crate::config_bag::FrozenLayer) - Basically an [`Arc`](std::sync::Arc) wrapper around +//! a `Layer`. This wrapper is used to make the layer immutable, and to make it shareable between multiple +//! `ConfigBag` instances. The frozen layer can be converted back to a `Layer` if there is only a single reference to it. +//! +//! All of `Layer`, `CloneableLayer`, `FrozenLayer`, and `ConfigBag` are considered to be "bag" types. +//! That is, they store arbitrary types so long as they implement the [`Storable`](crate::config_bag::Storable) trait. +//! +//! A `Storable` requires a `Storer` to be configured, and the storer allows for storables to be stored +//! in two different modes: +//! 1. [`StoreReplace`](crate::config_bag::StoreReplace) - Only one value of this type is allowed in a bag, and +//! calling [`store_put()`](crate::config_bag::Layer::store_put) multiple times will replace the existing value +//! in the bag. Calling [`load::()`](crate::config_bag::Layer::load) returns exactly one value, if present. +//! 2. [`StoreAppend`](crate::config_bag::StoreAppend) - Multiple values of this type are allowed in a bag, and +//! calling [`store_append()`](crate::config_bag::Layer::store_append) will add an additional value of this type +//! to the bag. Calling [`load::()`](crate::config_bag::Layer::load) returns an iterator over multiple values. +//! +//! # Examples +//! +//! Creating a storable data type with `StoreReplace`: +//! +//! ```no_run +//! use aws_smithy_types::config_bag::{Storable, StoreReplace}; +//! +//! #[derive(Debug)] +//! struct SomeDataType { +//! some_data: String, +//! } +//! impl Storable for SomeDataType { +//! type Storer = StoreReplace; +//! } +//! ``` +//! +//! Creating a storable data type with `StoreAppend`: +//! +//! ```no_run +//! use aws_smithy_types::config_bag::{Storable, StoreAppend}; +//! +//! #[derive(Debug)] +//! struct SomeDataType { +//! some_data: String, +//! } +//! impl Storable for SomeDataType { +//! type Storer = StoreAppend; +//! } +//! ``` +//! +//! Storing a storable in a bag when it is configured for `StoreReplace`: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreReplace}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreReplace; } +//! use aws_smithy_types::config_bag::{CloneableLayer, Layer}; +//! +//! let mut layer = Layer::new("example"); +//! layer.store_put(SomeDataType { some_data: "some data".to_string() }); +//! +//! // `store_put` can be called again to replace the original value: +//! layer.store_put(SomeDataType { some_data: "replacement".to_string() }); +//! +//! // Note: `SomeDataType` below must implement `Clone` to work with `CloneableLayer` +//! let mut cloneable = CloneableLayer::new("example"); +//! cloneable.store_put(SomeDataType { some_data: "some data".to_string() }); +//! ``` +//! +//! Storing a storable in a bag when it is configured for `StoreAppend`: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreAppend}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreAppend; } +//! use aws_smithy_types::config_bag::{CloneableLayer, Layer}; +//! +//! let mut layer = Layer::new("example"); +//! layer.store_append(SomeDataType { some_data: "1".to_string() }); +//! layer.store_append(SomeDataType { some_data: "2".to_string() }); +//! ``` +//! +//! Loading a `StoreReplace` value from a bag: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreReplace}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreReplace; } +//! # use aws_smithy_types::config_bag::Layer; +//! # let layer = Layer::new("example"); +//! let maybe_value: Option<&SomeDataType> = layer.load::(); +//! ``` +//! +//! Loading a `StoreAppend` value from a bag: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreAppend}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreAppend; } +//! # use aws_smithy_types::config_bag::Layer; +//! # let layer = Layer::new("example"); +//! let values: Vec = layer.load::().cloned().collect(); +//! +//! // or iterate over them directly: +//! for value in layer.load::() { +//! # let _ = value; +//! // ... +//! } +//! ``` //! -//! [`config_bag::ConfigBag`] represents the layered configuration structure -//! with the following properties: -//! 1. A new layer of configuration may be applied onto an existing configuration structure without modifying it or taking ownership. -//! 2. No lifetime shenanigans to deal with mod storable; mod typeid_map; @@ -25,13 +146,20 @@ use std::sync::Arc; pub use storable::{AppendItemIter, Storable, Store, StoreAppend, StoreReplace}; -/// [`FrozenLayer`] is the "locked" form of [`Layer`]. +/// [`FrozenLayer`] is the immutable and shareable form of [`Layer`]. /// -/// [`ConfigBag`] contains a ordered collection of [`FrozenLayer`] +/// See the [module docs](crate::config_bag) for more documentation. #[derive(Clone, Debug)] #[must_use] pub struct FrozenLayer(Arc); +impl FrozenLayer { + /// Attempts to convert this bag directly into a [`Layer`] if no other references exist. + pub fn try_modify(self) -> Option { + Arc::try_unwrap(self.0).ok() + } +} + impl Deref for FrozenLayer { type Target = Layer; @@ -40,6 +168,12 @@ impl Deref for FrozenLayer { } } +impl From for FrozenLayer { + fn from(layer: Layer) -> Self { + FrozenLayer(Arc::new(layer)) + } +} + /// Private module to keep Value type while avoiding "private type in public latest" pub(crate) mod value { #[derive(Clone, Debug)] @@ -47,14 +181,14 @@ pub(crate) mod value { Set(T), ExplicitlyUnset(&'static str), } -} -use value::Value; -impl Default for Value { - fn default() -> Self { - Self::Set(Default::default()) + impl Default for Value { + fn default() -> Self { + Self::Set(Default::default()) + } } } +use value::Value; /// [`CloneableLayer`] allows itself to be cloned. This is useful when a type that implements /// `Clone` wishes to store a config layer. @@ -79,6 +213,8 @@ impl Default for Value { /// let mut layer = CloneableLayer::new("layer"); /// layer.store_put(MyNotCloneStruct); /// ``` +/// +/// See the [module docs](crate::config_bag) for more documentation. #[derive(Debug, Default)] pub struct CloneableLayer(Layer); @@ -113,6 +249,7 @@ impl CloneableLayer { Self(Layer::new(name)) } + /// Converts this layer into a frozen layer that can no longer be mutated. pub fn freeze(self) -> FrozenLayer { self.0.into() } @@ -191,6 +328,8 @@ impl CloneableLayer { } /// A named layer comprising a config bag +/// +/// See the [module docs](crate::config_bag) for more documentation. #[derive(Default)] pub struct Layer { name: Cow<'static, str>, @@ -236,10 +375,12 @@ impl Layer { self } - pub fn empty(&self) -> bool { + /// Returns true if this layer is empty. + pub fn is_empty(&self) -> bool { self.props.is_empty() } + /// Converts this layer into a frozen layer that can no longer be mutated. pub fn freeze(self) -> FrozenLayer { self.into() } @@ -253,6 +394,7 @@ impl Layer { } } + /// Changes the name of this layer. pub fn with_name(self, name: impl Into>) -> Self { Self { name: name.into(), @@ -373,19 +515,9 @@ impl Layer { } } -impl FrozenLayer { - /// Attempts to convert this bag directly into a [`ConfigBag`] if no other references exist - /// - /// This allows modifying the top layer of the bag. [`Self::add_layer`] may be - /// used to add a new layer to the bag. - pub fn try_modify(self) -> Option { - Arc::try_unwrap(self.0).ok() - } -} - -/// Layered Configuration Structure +/// Layered configuration structure /// -/// [`ConfigBag`] is the "unlocked" form of the bag. Only the top layer of the bag may be unlocked. +/// See the [module docs](crate::config_bag) for more documentation. #[must_use] pub struct ConfigBag { interceptor_state: Layer, @@ -408,10 +540,6 @@ impl Debug for ConfigBag { impl ConfigBag { /// Create a new config bag "base". - /// - /// Configuration may then be "layered" onto the base by calling - /// [`ConfigBag::store_put`], [`ConfigBag::store_or_unset`], [`ConfigBag::store_append`]. Layers - /// of configuration may then be "frozen" (made immutable) by calling [`ConfigBag::freeze`]. pub fn base() -> Self { ConfigBag { interceptor_state: Layer { @@ -422,7 +550,8 @@ impl ConfigBag { } } - pub fn of_layers(layers: Vec) -> Self { + /// Create a [`ConfigBag`] consisting of the given layers. + pub fn of_layers(layers: impl IntoIterator) -> Self { let mut bag = ConfigBag::base(); for layer in layers { bag.push_layer(layer); @@ -430,16 +559,19 @@ impl ConfigBag { bag } + /// Add the given layer to the config bag. pub fn push_layer(&mut self, layer: Layer) -> &mut Self { self.tail.push(layer.freeze()); self } + /// Add a frozen/shared layer to the config bag. pub fn push_shared_layer(&mut self, layer: FrozenLayer) -> &mut Self { self.tail.push(layer); self } + /// Return a reference to the mutable interceptor state. pub fn interceptor_state(&mut self) -> &mut Layer { &mut self.interceptor_state } @@ -516,20 +648,37 @@ impl ConfigBag { /// Add another layer to this configuration bag /// /// Hint: If you want to re-use this layer, call `freeze` first. + /// + /// # Examples /// ``` - /// /* - /// use aws_smithy_types::config_bag::{ConfigBag, Layer}; - /// let bag = ConfigBag::base(); - /// let first_layer = bag.with_fn("a", |b: &mut Layer| { b.put("a"); }); - /// let second_layer = first_layer.with_fn("other", |b: &mut Layer| { b.put(1i32); }); - /// // The number is only in the second layer - /// assert_eq!(first_layer.get::(), None); - /// assert_eq!(second_layer.get::(), Some(&1)); + /// use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; + /// + /// #[derive(Debug, Eq, PartialEq)] + /// struct ExampleStr(&'static str); + /// impl Storable for ExampleStr { + /// type Storer = StoreReplace; + /// } + /// + /// #[derive(Debug, Eq, PartialEq)] + /// struct ExampleInt(i32); + /// impl Storable for ExampleInt { + /// type Storer = StoreReplace; + /// } + /// + /// let mut bag = ConfigBag::base(); + /// bag = bag.with_fn("first", |layer: &mut Layer| { layer.store_put(ExampleStr("a")); }); + /// + /// // We can now load the example string out + /// assert_eq!(bag.load::(), Some(&ExampleStr("a"))); /// - /// // The string is in both layers - /// assert_eq!(first_layer.get::<&'static str>(), Some(&"a")); - /// assert_eq!(second_layer.get::<&'static str>(), Some(&"a")); - /// */ + /// // But there isn't a number stored in the bag yet + /// assert_eq!(bag.load::(), None); + /// + /// // Add a layer with an example int + /// bag = bag.with_fn("second", |layer: &mut Layer| { layer.store_put(ExampleInt(1)); }); + /// + /// // Now the example int can be retrieved + /// assert_eq!(bag.load::(), Some(&ExampleInt(1))); /// ``` pub fn with_fn( self, @@ -574,7 +723,7 @@ impl ConfigBag { } } -/// Iterator of items returned from config_bag +/// Iterator of items returned from [`ConfigBag`]. pub struct ItemIter<'a, T> { inner: BagIter<'a>, t: PhantomData, @@ -618,12 +767,6 @@ impl<'a> Iterator for BagIter<'a> { } } -impl From for FrozenLayer { - fn from(layer: Layer) -> Self { - FrozenLayer(Arc::new(layer)) - } -} - #[cfg(test)] mod test { use super::ConfigBag; diff --git a/rust-runtime/aws-smithy-types/src/config_bag/storable.rs b/rust-runtime/aws-smithy-types/src/config_bag/storable.rs index 33c0d2d4346..3a70e422eaa 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag/storable.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag/storable.rs @@ -22,6 +22,8 @@ pub trait Store: Sized + Send + Sync + 'static { } /// Store an item in the config bag by replacing the existing value +/// +/// See the [module docs](crate::config_bag) for more documentation. #[non_exhaustive] pub struct StoreReplace(PhantomData); @@ -32,6 +34,8 @@ impl Debug for StoreReplace { } /// Store an item in the config bag by effectively appending it to a list +/// +/// See the [module docs](crate::config_bag) for more documentation. #[non_exhaustive] pub struct StoreAppend(PhantomData); @@ -42,6 +46,8 @@ impl Debug for StoreAppend { } /// Trait that marks the implementing types as able to be stored in the config bag +/// +/// See the [module docs](crate::config_bag) for more documentation. pub trait Storable: Send + Sync + Debug + 'static { /// Specify how an item is stored in the config bag, e.g. [`StoreReplace`] and [`StoreAppend`] type Storer: Store; diff --git a/rust-runtime/aws-smithy-types/src/lib.rs b/rust-runtime/aws-smithy-types/src/lib.rs index 1d756d5802d..76fb9010c3d 100644 --- a/rust-runtime/aws-smithy-types/src/lib.rs +++ b/rust-runtime/aws-smithy-types/src/lib.rs @@ -14,8 +14,6 @@ unreachable_pub )] pub mod base64; -//TODO(enableNewSmithyRuntimeLaunch): Unhide this module when switching to the orchestrator -#[doc(hidden)] /// A typemap for storing configuration. pub mod config_bag; pub mod date_time; @@ -25,8 +23,6 @@ pub mod primitive; pub mod retry; pub mod timeout; -//TODO(enableNewSmithyRuntimeLaunch): Unhide this module when switching to the orchestrator -#[doc(hidden)] /// Utilities for type erasure. pub mod type_erasure; diff --git a/rust-runtime/aws-smithy-types/src/type_erasure.rs b/rust-runtime/aws-smithy-types/src/type_erasure.rs index 5f4cc080543..b4acdbb72d7 100644 --- a/rust-runtime/aws-smithy-types/src/type_erasure.rs +++ b/rust-runtime/aws-smithy-types/src/type_erasure.rs @@ -98,7 +98,34 @@ impl DerefMut for TypedBox { } } -/// A new-type around `Box` +/// Abstraction over `Box` that provides `Debug` and optionally `Clone`. +/// +/// # Examples +/// +/// Creating a box: +/// ```no_run +/// use aws_smithy_types::type_erasure::{TypedBox, TypeErasedBox}; +/// +/// // Creating it directly: +/// let boxed = TypeErasedBox::new("some value"); +/// +/// // Creating it from a `TypedBox`: +/// let boxed = TypedBox::new("some value").erase(); +/// ``` +/// +/// Downcasting a box: +/// ```no_run +/// # use aws_smithy_types::type_erasure::{TypedBox, TypeErasedBox}; +/// # let boxed = TypedBox::new("some value".to_string()).erase(); +/// let value: Option<&String> = boxed.downcast_ref::(); +/// ``` +/// +/// Converting a box back into its value: +/// ``` +/// # use aws_smithy_types::type_erasure::{TypedBox, TypeErasedBox}; +/// let boxed = TypedBox::new("some value".to_string()).erase(); +/// let value: String = TypedBox::::assume_from(boxed).expect("it is a string").unwrap(); +/// ``` pub struct TypeErasedBox { field: Box, #[allow(clippy::type_complexity)] @@ -146,6 +173,7 @@ impl TypeErasedBox { } } + /// Create a new cloneable `TypeErasedBox` from the given `value`. pub fn new_with_clone(value: T) -> Self { let debug = |value: &Box, f: &mut fmt::Formatter<'_>| { fmt::Debug::fmt(value.downcast_ref::().expect("type-checked"), f) @@ -160,6 +188,9 @@ impl TypeErasedBox { } } + /// Attempts to clone this box. + /// + /// Note: this will only ever succeed if the box was created with [`TypeErasedBox::new_with_clone`]. pub fn try_clone(&self) -> Option { Some((self.clone.as_ref()?)(&self.field)) } From e91b393b5814cd5ceb6be5216d8b9554bcd4dca9 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 20 Jul 2023 16:30:24 -0400 Subject: [PATCH 025/331] Cleanup and add more tests for from/to nanos (#2655) ## Motivation and Context - Simplify no-op code in `as_nanos` - Add more proptests ## Testing Ran the tests ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-types/src/date_time/mod.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/rust-runtime/aws-smithy-types/src/date_time/mod.rs b/rust-runtime/aws-smithy-types/src/date_time/mod.rs index 8dcdc53067c..b5e740cf5b2 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/mod.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/mod.rs @@ -57,6 +57,9 @@ const NANOS_PER_SECOND_U32: u32 = 1_000_000_000; #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)] pub struct DateTime { pub(crate) seconds: i64, + /// Subsecond nanos always advances the wallclock time, even for times where seconds is negative + /// + /// Bigger subsecond nanos => later time pub(crate) subsecond_nanos: u32, } @@ -93,12 +96,7 @@ impl DateTime { /// Returns the number of nanoseconds since the Unix epoch that this `DateTime` represents. pub fn as_nanos(&self) -> i128 { let seconds = self.seconds as i128 * NANOS_PER_SECOND; - if seconds < 0 { - let adjusted_nanos = self.subsecond_nanos as i128 - NANOS_PER_SECOND; - seconds + NANOS_PER_SECOND + adjusted_nanos - } else { - seconds + self.subsecond_nanos as i128 - } + seconds + self.subsecond_nanos as i128 } /// Creates a `DateTime` from a number of seconds and a fractional second since the Unix epoch. From a57a719cfeb0313d6e61fc50a485dcd88c44cf19 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 20 Jul 2023 16:33:13 -0400 Subject: [PATCH 026/331] Add `sdk_ua_app_id` in addition to sdk-ua-app-id in profile file support (#2724) ## Motivation and Context The field name is being changed, but we need to maintain support for customers already using this feature ## Description ## Testing - existing tests ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++ .../src/default_provider/app_name.rs | 85 +++++++++++++++---- .../aws-config/src/environment/app_name.rs | 29 +------ .../aws-config/src/environment/mod.rs | 1 - .../aws-config/src/profile/app_name.rs | 81 ++---------------- 5 files changed, 84 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 7a753f4790f..9098765a552 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -652,3 +652,9 @@ message = "Public fields in structs are no longer marked as `#[doc(hidden)]`, an references = ["smithy-rs#2854"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "ysaito1001" + +[[aws-sdk-rust]] +message = "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility." +references = ["smithy-rs#2724"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index f6fce3d7305..7d91c6d363a 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -3,16 +3,33 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::environment::app_name::EnvironmentVariableAppNameProvider; -use crate::profile::app_name; use crate::provider_config::ProviderConfig; -use aws_types::app_name::AppName; +use crate::standard_property::{PropertyResolutionError, StandardProperty}; +use aws_smithy_types::error::display::DisplayErrorContext; +use aws_types::app_name::{AppName, InvalidAppName}; /// Default App Name Provider chain /// /// This provider will check the following sources in order: -/// 1. [Environment variables](EnvironmentVariableAppNameProvider) -/// 2. [Profile file](crate::profile::app_name::ProfileFileAppNameProvider) +/// 1. Environment variables: `AWS_SDK_UA_APP_ID` +/// 2. Profile files from the key `sdk_ua_app_id` +/// +#[doc = include_str!("../profile/location_of_profile_files.md")] +/// +/// # Examples +/// +/// **Loads "my-app" as the app name** +/// ```ini +/// [default] +/// sdk_ua_app_id = my-app +/// ``` +/// +/// **Loads "my-app" as the app name _if and only if_ the `AWS_PROFILE` environment variable +/// is set to `other`.** +/// ```ini +/// [profile other] +/// sdk_ua_app_id = my-app +/// ``` pub fn default_provider() -> Builder { Builder::default() } @@ -20,8 +37,7 @@ pub fn default_provider() -> Builder { /// Default provider builder for [`AppName`] #[derive(Debug, Default)] pub struct Builder { - env_provider: EnvironmentVariableAppNameProvider, - profile_file: app_name::Builder, + provider_config: ProviderConfig, } impl Builder { @@ -29,23 +45,43 @@ impl Builder { /// Configure the default chain /// /// Exposed for overriding the environment when unit-testing providers - pub fn configure(mut self, configuration: &ProviderConfig) -> Self { - self.env_provider = EnvironmentVariableAppNameProvider::new_with_env(configuration.env()); - self.profile_file = self.profile_file.configure(configuration); - self + pub fn configure(self, configuration: &ProviderConfig) -> Self { + Self { + provider_config: configuration.clone(), + } } /// Override the profile name used by this provider pub fn profile_name(mut self, name: &str) -> Self { - self.profile_file = self.profile_file.profile_name(name); + self.provider_config = self.provider_config.with_profile_name(name.to_string()); self } + async fn fallback_app_name( + &self, + ) -> Result, PropertyResolutionError> { + StandardProperty::new() + .profile("sdk-ua-app-id") + .validate(&self.provider_config, |name| AppName::new(name.to_string())) + .await + } + /// Build an [`AppName`] from the default chain pub async fn app_name(self) -> Option { - self.env_provider - .app_name() - .or(self.profile_file.build().app_name().await) + let standard = StandardProperty::new() + .env("AWS_SDK_UA_APP_ID") + .profile("sdk_ua_app_id") + .validate(&self.provider_config, |name| AppName::new(name.to_string())) + .await; + let with_fallback = match standard { + Ok(None) => self.fallback_app_name().await, + other => other, + }; + + with_fallback.map_err( + |err| tracing::warn!(err = %DisplayErrorContext(&err), "invalid value for App Name setting"), + ) + .unwrap_or(None) } } @@ -80,7 +116,7 @@ mod tests { // test that overriding profile_name on the root level is deprecated #[tokio::test] async fn profile_name_override() { - let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk-ua-app-id = correct")]); + let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk_ua_app_id = correct")]); let conf = crate::from_env() .configure( ProviderConfig::empty() @@ -101,6 +137,23 @@ mod tests { #[tokio::test] async fn load_from_profile() { + let fs = Fs::from_slice(&[("test_config", "[default]\nsdk_ua_app_id = correct")]); + let env = Env::from_slice(&[("AWS_CONFIG_FILE", "test_config")]); + let app_name = Builder::default() + .configure( + &ProviderConfig::empty() + .with_fs(fs) + .with_env(env) + .with_http_connector(no_traffic_connector()), + ) + .app_name() + .await; + + assert_eq!(Some(AppName::new("correct").unwrap()), app_name); + } + + #[tokio::test] + async fn load_from_profile_old_name() { let fs = Fs::from_slice(&[("test_config", "[default]\nsdk-ua-app-id = correct")]); let env = Env::from_slice(&[("AWS_CONFIG_FILE", "test_config")]); let app_name = Builder::default() diff --git a/aws/rust-runtime/aws-config/src/environment/app_name.rs b/aws/rust-runtime/aws-config/src/environment/app_name.rs index 79c3abb6ac3..3abf0fdedb9 100644 --- a/aws/rust-runtime/aws-config/src/environment/app_name.rs +++ b/aws/rust-runtime/aws-config/src/environment/app_name.rs @@ -9,10 +9,12 @@ use aws_types::os_shim_internal::Env; /// Load an app name from the `AWS_SDK_UA_APP_ID` environment variable. #[derive(Debug, Default)] +#[deprecated(note = "This is unused and will be removed in a future release.")] pub struct EnvironmentVariableAppNameProvider { env: Env, } +#[allow(deprecated)] impl EnvironmentVariableAppNameProvider { /// Create a new `EnvironmentVariableAppNameProvider` pub fn new() -> Self { @@ -42,30 +44,3 @@ impl EnvironmentVariableAppNameProvider { } } } - -#[cfg(test)] -mod tests { - use crate::environment::EnvironmentVariableAppNameProvider; - use aws_types::app_name::AppName; - use aws_types::os_shim_internal::Env; - use std::collections::HashMap; - - #[test] - fn env_var_not_set() { - let provider = EnvironmentVariableAppNameProvider::new_with_env(Env::from(HashMap::new())); - assert_eq!(None, provider.app_name()); - } - - #[test] - fn env_var_set() { - let provider = EnvironmentVariableAppNameProvider::new_with_env(Env::from( - vec![("AWS_SDK_UA_APP_ID".to_string(), "something".to_string())] - .into_iter() - .collect::>(), - )); - assert_eq!( - Some(AppName::new("something").unwrap()), - provider.app_name() - ); - } -} diff --git a/aws/rust-runtime/aws-config/src/environment/mod.rs b/aws/rust-runtime/aws-config/src/environment/mod.rs index 11919472873..dd2c7cba3b9 100644 --- a/aws/rust-runtime/aws-config/src/environment/mod.rs +++ b/aws/rust-runtime/aws-config/src/environment/mod.rs @@ -8,7 +8,6 @@ /// Load app name from the environment pub mod app_name; -pub use app_name::EnvironmentVariableAppNameProvider; use std::error::Error; use std::fmt::{Display, Formatter}; diff --git a/aws/rust-runtime/aws-config/src/profile/app_name.rs b/aws/rust-runtime/aws-config/src/profile/app_name.rs index 80a5f192ca5..715681dadfc 100644 --- a/aws/rust-runtime/aws-config/src/profile/app_name.rs +++ b/aws/rust-runtime/aws-config/src/profile/app_name.rs @@ -33,10 +33,14 @@ use aws_types::app_name::AppName; /// /// This provider is part of the [default app name provider chain](crate::default_provider::app_name). #[derive(Debug, Default)] +#[deprecated( + note = "This is unused and is deprecated for backwards compatibility. It will be removed in a future release." +)] pub struct ProfileFileAppNameProvider { provider_config: ProviderConfig, } +#[allow(deprecated)] impl ProfileFileAppNameProvider { /// Create a new [ProfileFileAppNameProvider} /// @@ -67,12 +71,14 @@ impl ProfileFileAppNameProvider { /// Builder for [ProfileFileAppNameProvider] #[derive(Debug, Default)] +#[allow(deprecated)] pub struct Builder { config: Option, profile_override: Option, profile_files: Option, } +#[allow(deprecated)] impl Builder { /// Override the configuration for this provider pub fn configure(mut self, config: &ProviderConfig) -> Self { @@ -87,6 +93,7 @@ impl Builder { } /// Build a [ProfileFileAppNameProvider] from this builder + #[allow(deprecated)] pub fn build(self) -> ProfileFileAppNameProvider { let conf = self .config @@ -97,77 +104,3 @@ impl Builder { } } } - -#[cfg(test)] -mod tests { - use super::ProfileFileAppNameProvider; - use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; - use aws_sdk_sts::config::AppName; - use aws_types::os_shim_internal::{Env, Fs}; - use tracing_test::traced_test; - - fn provider_config(config_contents: &str) -> ProviderConfig { - let fs = Fs::from_slice(&[("test_config", config_contents)]); - let env = Env::from_slice(&[("AWS_CONFIG_FILE", "test_config")]); - ProviderConfig::empty() - .with_fs(fs) - .with_env(env) - .with_http_connector(no_traffic_connector()) - } - - fn default_provider(config_contents: &str) -> ProfileFileAppNameProvider { - ProfileFileAppNameProvider::builder() - .configure(&provider_config(config_contents)) - .build() - } - - #[tokio::test] - async fn no_app_name() { - assert_eq!(None, default_provider("[default]\n").app_name().await); - } - - #[tokio::test] - async fn app_name_default_profile() { - assert_eq!( - Some(AppName::new("test").unwrap()), - default_provider("[default]\nsdk-ua-app-id = test") - .app_name() - .await - ); - } - - #[tokio::test] - async fn app_name_other_profiles() { - let config = "\ - [default]\n\ - sdk-ua-app-id = test\n\ - \n\ - [profile other]\n\ - sdk-ua-app-id = bar\n - "; - assert_eq!( - Some(AppName::new("bar").unwrap()), - ProfileFileAppNameProvider::builder() - .profile_name("other") - .configure(&provider_config(config)) - .build() - .app_name() - .await - ); - } - - #[traced_test] - #[tokio::test] - async fn invalid_app_name() { - assert_eq!( - None, - default_provider("[default]\nsdk-ua-app-id = definitely invalid") - .app_name() - .await - ); - assert!(logs_contain( - "`sdk-ua-app-id` property `definitely invalid` was invalid" - )); - } -} From 7875278a2b1cd0be0b2fe72b3810f8d1d26abd60 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 20 Jul 2023 16:43:17 -0400 Subject: [PATCH 027/331] don't suppress unpublished examples (#2855) ## Motivation and Context The publish tool doesn't consider unpublished crates when computing the version tree for publish. This causes errors for examples that use shared crates. ## Description This adds support for considering unpublished crates when publishing. It allows unpublished crates to have unpublished dependencies but published crates can only have unpublished crates as dev dependencies. ## Testing - [x] build these exact changes into the docker image and test ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../publisher/src/subcommand/fix_manifests.rs | 211 +++++++++++++----- .../src/subcommand/fix_manifests/validate.rs | 20 +- 2 files changed, 175 insertions(+), 56 deletions(-) diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index 910f5fd51c6..2d34c1aba74 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -21,7 +21,7 @@ use std::ffi::OsStr; use std::path::{Path, PathBuf}; use toml::value::Table; use toml::Value; -use tracing::info; +use tracing::{debug, info}; mod validate; @@ -72,6 +72,63 @@ struct Manifest { metadata: toml::Value, } +impl Manifest { + /// Returns the `publish` setting for a given crate + fn publish(&self) -> Result { + let value = self.metadata.get("package").and_then(|v| v.get("publish")); + match value { + None => Ok(true), + Some(value) => value + .as_bool() + .ok_or(anyhow::Error::msg("unexpected publish setting")), + } + } +} + +struct Versions(BTreeMap); +#[derive(Copy, Clone)] +enum FilterType { + AllCrates, + PublishedOnly, +} +struct VersionView<'a>(&'a Versions, FilterType); +impl VersionView<'_> { + fn get(&self, crate_name: &str) -> Option<&Version> { + let version = match (self.1, self.0 .0.get(crate_name)) { + (FilterType::AllCrates, version) => version, + (FilterType::PublishedOnly, v @ Some(VersionWithMetadata { publish: true, .. })) => v, + _ => None, + }; + version.map(|v| &v.version) + } + + fn all_crates(&self) -> Self { + VersionView(self.0, FilterType::AllCrates) + } +} + +impl Versions { + fn published(&self) -> VersionView { + VersionView(self, FilterType::PublishedOnly) + } + + fn published_crates(&self) -> impl Iterator + '_ { + self.0 + .iter() + .filter(|(_, v)| v.publish) + .map(|(k, v)| (k.as_str(), &v.version)) + } + + fn get(&self, crate_name: &str) -> Option<&Version> { + self.0.get(crate_name).map(|v| &v.version) + } +} + +struct VersionWithMetadata { + version: Version, + publish: bool, +} + async fn read_manifests(fs: Fs, manifest_paths: Vec) -> Result> { let mut result = Vec::new(); for path in manifest_paths { @@ -84,7 +141,7 @@ async fn read_manifests(fs: Fs, manifest_paths: Vec) -> Result Result> { +fn package_versions(manifests: &[Manifest]) -> Result { let mut versions = BTreeMap::new(); for manifest in manifests { // ignore workspace manifests @@ -92,15 +149,7 @@ fn package_versions(manifests: &[Manifest]) -> Result> Some(package) => package, None => continue, }; - // ignore non-publishable crates - if let Some(Value::Boolean(false)) = manifest - .metadata - .get("package") - .expect("checked above") - .get("publish") - { - continue; - } + let publish = manifest.publish()?; let name = package .get("name") .and_then(|name| name.as_str()) @@ -114,16 +163,12 @@ fn package_versions(manifests: &[Manifest]) -> Result> anyhow::Error::msg(format!("{:?} is missing a package version", manifest.path)) })?; let version = parse_version(&manifest.path, version)?; - versions.insert(name.into(), version); + versions.insert(name.into(), VersionWithMetadata { version, publish }); } - Ok(versions) + Ok(Versions(versions)) } -fn fix_dep_set( - versions: &BTreeMap, - key: &str, - metadata: &mut toml::Value, -) -> Result { +fn fix_dep_set(versions: &VersionView, key: &str, metadata: &mut Value) -> Result { let mut changed = 0; if let Some(dependencies) = metadata.as_table_mut().unwrap().get_mut(key) { if let Some(dependencies) = dependencies.as_table_mut() { @@ -143,11 +188,7 @@ fn fix_dep_set( Ok(changed) } -fn update_dep( - table: &mut Table, - dep_name: &str, - versions: &BTreeMap, -) -> Result { +fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Result { if !table.contains_key("path") { return Ok(0); } @@ -169,9 +210,10 @@ fn update_dep( } } -fn fix_dep_sets(versions: &BTreeMap, metadata: &mut toml::Value) -> Result { +fn fix_dep_sets(versions: &VersionView, metadata: &mut toml::Value) -> Result { let mut changed = fix_dep_set(versions, "dependencies", metadata)?; - changed += fix_dep_set(versions, "dev-dependencies", metadata)?; + // allow dev dependencies to be unpublished + changed += fix_dep_set(&versions.all_crates(), "dev-dependencies", metadata)?; changed += fix_dep_set(versions, "build-dependencies", metadata)?; Ok(changed) } @@ -202,45 +244,53 @@ fn conditionally_disallow_publish( // is not being run from CI, and disallow publish in that case. Also disallow // publishing of examples. if !is_github_actions || is_example { - if let Some(package) = metadata.as_table_mut().unwrap().get_mut("package") { - info!( - "Detected {}. Disallowing publish for {:?}.", - if is_example { "example" } else { "local build" }, - manifest_path, - ); - package - .as_table_mut() - .unwrap() - .insert("publish".into(), toml::Value::Boolean(false)); - return Ok(true); + if let Some(value) = set_publish_false(manifest_path, metadata, is_example) { + return Ok(value); } } Ok(false) } +fn set_publish_false(manifest_path: &Path, metadata: &mut Value, is_example: bool) -> Option { + if let Some(package) = metadata.as_table_mut().unwrap().get_mut("package") { + info!( + "Detected {}. Disallowing publish for {:?}.", + if is_example { "example" } else { "local build" }, + manifest_path, + ); + package + .as_table_mut() + .unwrap() + .insert("publish".into(), toml::Value::Boolean(false)); + return Some(true); + } + None +} + async fn fix_manifests( fs: Fs, - versions: &BTreeMap, + versions: &Versions, manifests: &mut Vec, mode: Mode, ) -> Result<()> { for manifest in manifests { let package_changed = conditionally_disallow_publish(&manifest.path, &mut manifest.metadata)?; - let dependencies_changed = fix_dep_sets(versions, &mut manifest.metadata)?; - if package_changed || dependencies_changed > 0 { + let num_deps_changed = fix_manifest(versions, manifest)?; + if package_changed || num_deps_changed > 0 { let contents = "# Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.\n" .to_string() + &toml::to_string(&manifest.metadata).with_context(|| { format!("failed to serialize to toml for {:?}", manifest.path) })?; + match mode { Mode::Execute => { fs.write_file(&manifest.path, contents.as_bytes()).await?; info!( "Changed {} dependencies in {:?}.", - dependencies_changed, manifest.path + num_deps_changed, manifest.path ); } Mode::Check => { @@ -255,10 +305,73 @@ async fn fix_manifests( Ok(()) } +fn fix_manifest(versions: &Versions, manifest: &mut Manifest) -> Result { + let mut view = versions.published(); + if !manifest.publish()? { + debug!(package = ?&manifest.path, "package has publishing disabled, allowing unpublished crates to be used"); + view = view.all_crates(); + } + fix_dep_sets(&view, &mut manifest.metadata) +} + #[cfg(test)] mod tests { use super::*; + fn make_versions<'a>(versions: impl Iterator) -> Versions { + let map = versions + .into_iter() + .map(|(name, version, publish)| { + let publish = *publish; + ( + name.to_string(), + VersionWithMetadata { + version: Version::parse(&version).unwrap(), + publish, + }, + ) + }) + .collect::>(); + + Versions(map) + } + + #[test] + fn unpublished_deps_cant_be_deps() { + let manifest = br#" + [package] + name = "test" + version = "1.2.0" + + [build-dependencies] + build_something = "1.3" + local_build_something = { path = "../local_build_something", version = "0.4.0-different" } + + [dev-dependencies] + dev_something = "1.1" + local_dev_something = { path = "../local_dev_something" } + + [dependencies] + something = "1.0" + local_something = { path = "../local_something" } + "#; + let metadata = toml::from_slice(manifest).unwrap(); + let mut manifest = Manifest { + path: "test".into(), + metadata, + }; + let versions = &[ + ("local_build_something", "0.2.0", true), + ("local_dev_something", "0.1.0", false), + ("local_something", "1.1.3", false), + ]; + let versions = make_versions(versions.iter()); + fix_manifest(&versions, &mut manifest).expect_err("depends on unpublished local something"); + set_publish_false(&manifest.path, &mut manifest.metadata, false).unwrap(); + fix_manifest(&versions, &mut manifest) + .expect("now it will work, the crate isn't published"); + } + #[test] fn test_fix_dep_sets() { let manifest = br#" @@ -283,16 +396,14 @@ mod tests { path: "test".into(), metadata, }; - let versions = vec![ - ("local_build_something", "0.2.0"), - ("local_dev_something", "0.1.0"), - ("local_something", "1.1.3"), - ] - .into_iter() - .map(|e| (e.0.to_string(), Version::parse(e.1).unwrap())) - .collect(); - - fix_dep_sets(&versions, &mut manifest.metadata).expect("success"); + let versions = &[ + ("local_build_something", "0.2.0", true), + ("local_dev_something", "0.1.0", false), + ("local_something", "1.1.3", true), + ]; + let versions = make_versions(versions.iter()); + + fix_dep_sets(&versions.published(), &mut manifest.metadata).expect("success"); let actual_deps = &manifest.metadata["dependencies"]; assert_eq!( diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs index 53202468f32..40aa8f609ac 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs @@ -5,10 +5,10 @@ use crate::fs::Fs; use crate::package::discover_and_validate_package_batches; +use crate::subcommand::fix_manifests::Versions; use anyhow::{anyhow, bail, Result}; use semver::Version; use smithy_rs_tool_common::package::PackageCategory; -use std::collections::BTreeMap; use std::path::Path; use tracing::info; @@ -17,7 +17,7 @@ use tracing::info; /// For now, this validates: /// - `aws-smithy-` prefixed versions match `aws-` (NOT `aws-sdk-`) prefixed versions pub(super) fn validate_before_fixes( - versions: &BTreeMap, + versions: &Versions, disable_version_number_validation: bool, ) -> Result<()> { // Later when we only generate independently versioned SDK crates, this flag can become permanent. @@ -30,7 +30,7 @@ pub(super) fn validate_before_fixes( .get("aws-smithy-types") .ok_or_else(|| anyhow!("`aws-smithy-types` crate missing"))?; - for (name, version) in versions { + for (name, version) in versions.published_crates() { let category = PackageCategory::from_package_name(name); if category == PackageCategory::SmithyRuntime || category == PackageCategory::AwsRuntime { confirm_version(name, expected_runtime_version, version)?; @@ -63,14 +63,22 @@ pub(super) async fn validate_after_fixes(location: &Path) -> Result<()> { #[cfg(test)] mod test { use super::*; + use crate::subcommand::fix_manifests::VersionWithMetadata; + use std::collections::BTreeMap; use std::str::FromStr; - fn versions(versions: &[(&'static str, &'static str)]) -> BTreeMap { + fn versions(versions: &[(&'static str, &'static str)]) -> Versions { let mut map = BTreeMap::new(); for (name, version) in versions { - map.insert((*name).into(), Version::from_str(version).unwrap()); + map.insert( + (*name).into(), + VersionWithMetadata { + version: Version::from_str(version).unwrap(), + publish: true, + }, + ); } - map + Versions(map) } #[track_caller] From 6aa585fa2d0add9d3ec910fa5fa9d1874e983d9e Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 20 Jul 2023 15:45:14 -0500 Subject: [PATCH 028/331] update generic clients to support user-configurable runtime plugins (#2864) _This PR also updates `pre-commit ktlint` runner. Now it won't spit out a bazillion debug logs when run_ ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .pre-commit-config.yaml | 2 +- aws/sdk/build.gradle.kts | 3 +- .../client/smithy/ClientCodegenContext.kt | 1 + .../client/smithy/ClientRustSettings.kt | 56 +++++++++---------- .../ClientRuntimeTypesReExportGenerator.kt | 11 ++++ .../config/ServiceConfigGenerator.kt | 53 ++++++++++-------- .../codegen/client/testutil/TestHelpers.kt | 3 + .../config/ServiceConfigGeneratorTest.kt | 27 ++++++++- .../rust/codegen/core/rustlang/RustType.kt | 1 + 9 files changed, 104 insertions(+), 53 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cce6e263271..a45d403a097 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: files: ^.*$ pass_filenames: false - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - rev: v2.6.0 + rev: v2.10.0 hooks: - id: pretty-format-kotlin args: [--autofix, --ktlint-version, 0.48.2] diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 1c975f58e48..920cb7579e5 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -105,7 +105,8 @@ fun generateSmithyBuild(services: AwsServices): String { "renameErrors": false, "debugMode": $debugMode, "eventStreamAllowList": [$eventStreamAllowListMembers], - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}" + "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}", + "enableUserConfigurableRuntimePlugins": false }, "service": "${service.service}", "module": "$moduleName", diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt index 18db6198232..7491b0e8e32 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt @@ -36,4 +36,5 @@ data class ClientCodegenContext( model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.CLIENT, ) { val smithyRuntimeMode: SmithyRuntimeMode get() = settings.codegenConfig.enableNewSmithyRuntime + val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index 0fec857bec7..908c936be2b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -74,28 +74,28 @@ data class ClientRustSettings( // TODO(enableNewSmithyRuntimeCleanup): Remove this mode after switching to the orchestrator enum class SmithyRuntimeMode { - Middleware, - BothDefaultMiddleware, - BothDefaultOrchestrator, - Orchestrator, + Middleware, BothDefaultMiddleware, BothDefaultOrchestrator, Orchestrator, ; val exclusivelyGenerateMiddleware: Boolean get() = generateMiddleware && !generateOrchestrator - val generateMiddleware: Boolean get() = when (this) { - Middleware, BothDefaultMiddleware, BothDefaultOrchestrator -> true - else -> false - } + val generateMiddleware: Boolean + get() = when (this) { + Middleware, BothDefaultMiddleware, BothDefaultOrchestrator -> true + else -> false + } - val generateOrchestrator: Boolean get() = when (this) { - Orchestrator, BothDefaultMiddleware, BothDefaultOrchestrator -> true - else -> false - } + val generateOrchestrator: Boolean + get() = when (this) { + Orchestrator, BothDefaultMiddleware, BothDefaultOrchestrator -> true + else -> false + } - val defaultToMiddleware: Boolean get() = when (this) { - Middleware, BothDefaultMiddleware -> true - else -> false - } + val defaultToMiddleware: Boolean + get() = when (this) { + Middleware, BothDefaultMiddleware -> true + else -> false + } val defaultToOrchestrator: Boolean get() = !defaultToMiddleware companion object { @@ -127,6 +127,7 @@ data class ClientCodegenConfig( val enableNewSmithyRuntime: SmithyRuntimeMode = defaultEnableNewSmithyRuntime, /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */ val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig, + val enableUserConfigurableRuntimePlugins: Boolean = defaultEnableUserConfigurableRuntimePlugins, ) : CoreCodegenConfig( formatTimeoutSeconds, debugMode, ) { @@ -137,25 +138,24 @@ data class ClientCodegenConfig( private val defaultEventStreamAllowList: Set = emptySet() private val defaultEnableNewSmithyRuntime = SmithyRuntimeMode.Orchestrator private const val defaultIncludeEndpointUrlConfig = true + private const val defaultEnableUserConfigurableRuntimePlugins = true fun fromCodegenConfigAndNode(coreCodegenConfig: CoreCodegenConfig, node: Optional) = if (node.isPresent) { ClientCodegenConfig( formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds, debugMode = coreCodegenConfig.debugMode, - eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList") - .map { array -> array.toList().mapNotNull { node -> node.asStringNode().orNull()?.value } } - .orNull()?.toSet() ?: defaultEventStreamAllowList, + eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList").map { array -> + array.toList().mapNotNull { node -> + node.asStringNode().orNull()?.value + } + }.orNull()?.toSet() ?: defaultEventStreamAllowList, renameExceptions = node.get().getBooleanMemberOrDefault("renameErrors", defaultRenameExceptions), - includeFluentClient = node.get() - .getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), - addMessageToErrors = node.get() - .getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), - enableNewSmithyRuntime = SmithyRuntimeMode.fromString( - node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware"), - ), - includeEndpointUrlConfig = node.get() - .getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), + includeFluentClient = node.get().getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), + addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), + enableNewSmithyRuntime = SmithyRuntimeMode.fromString(node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware")), + includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), + enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("userConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), ) } else { ClientCodegenConfig( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 12fa3e264b3..102400e511a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -34,6 +34,17 @@ class ClientRuntimeTypesReExportGenerator( "Interceptor" to RuntimeType.interceptor(rc), "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), ) + + if (codegenContext.enableUserConfigurableRuntimePlugins) { + rustTemplate( + """ + pub use #{runtime_plugin}::{RuntimePlugin, SharedRuntimePlugin}; + pub use #{config_bag}::FrozenLayer; + """, + "runtime_plugin" to RuntimeType.smithyRuntimeApi(rc).resolve("client::runtime_plugin"), + "config_bag" to RuntimeType.smithyTypes(rc).resolve("config_bag"), + ) + } } rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) { rustTemplate( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index 83f7c740b41..d732f4e1e2d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -19,7 +19,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.docsOrFallback -import software.amazon.smithy.rust.codegen.core.rustlang.raw import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate @@ -305,26 +304,29 @@ class ServiceConfigGenerator( } } - private val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) + private val moduleUseName = codegenContext.moduleUseName() + private val runtimeMode = codegenContext.smithyRuntimeMode + private val runtimeConfig = codegenContext.runtimeConfig + private val enableUserConfigurableRuntimePlugins = codegenContext.enableUserConfigurableRuntimePlugins + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) val codegenScope = arrayOf( *preludeScope, - "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), + "BoxError" to RuntimeType.boxError(runtimeConfig), "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), - "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), + "ConfigBag" to RuntimeType.configBag(runtimeConfig), + "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "Cow" to RuntimeType.Cow, "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "Layer" to smithyTypes.resolve("config_bag::Layer"), - "Resolver" to RuntimeType.smithyRuntime(codegenContext.runtimeConfig).resolve("client::config_override::Resolver"), - "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig), - "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), - "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(codegenContext.runtimeConfig), + "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), + "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(runtimeConfig), + "runtime_plugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin"), ) - private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode fun render(writer: RustWriter) { - writer.docs("Service config.\n") + writer.docs("Configuration for a $moduleUseName service client.\n") customizations.forEach { it.section(ServiceConfig.ConfigStructAdditionalDocs)(writer) } @@ -394,9 +396,9 @@ class ServiceConfigGenerator( writer.docs("Builder for creating a `Config`.") if (runtimeMode.defaultToMiddleware) { - writer.raw("#[derive(Clone, Default)]") + Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Default)).render(writer) } else { - writer.raw("#[derive(Clone, Debug)]") + Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) } writer.rustBlock("pub struct Builder") { if (runtimeMode.defaultToOrchestrator) { @@ -451,19 +453,25 @@ class ServiceConfigGenerator( it.section(ServiceConfig.BuilderImpl)(this) } - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { + val visibility = if (enableUserConfigurableRuntimePlugins) { "pub" } else { "pub(crate)" } + + docs("Adds a runtime plugin to the config.") + if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } rustTemplate( """ - /// Adds a runtime plugin to the config. - ##[allow(unused)] - pub(crate) fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { + $visibility fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { self.push_runtime_plugin(#{SharedRuntimePlugin}::new(plugin)); self } - - /// Adds a runtime plugin to the config. - ##[allow(unused)] - pub(crate) fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { + """, + *codegenScope, + ) + docs("Adds a runtime plugin to the config.") + if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } + rustTemplate( + """ + $visibility fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { self.runtime_plugins.push(plugin); self } @@ -528,6 +536,7 @@ class ServiceConfigGenerator( } } } + customizations.forEach { it.section(ServiceConfig.Extras)(writer) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt index 97464760e9a..866cd7461fd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt @@ -94,6 +94,9 @@ fun testClientCodegenContext( fun ClientCodegenContext.withSmithyRuntimeMode(smithyRuntimeMode: SmithyRuntimeMode): ClientCodegenContext = copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableNewSmithyRuntime = smithyRuntimeMode))) +fun ClientCodegenContext.withEnableUserConfigurableRuntimePlugins(enableUserConfigurableRuntimePlugins: Boolean): ClientCodegenContext = + copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableUserConfigurableRuntimePlugins = enableUserConfigurableRuntimePlugins))) + fun TestWriterDelegator.clientRustSettings() = testClientRustSettings( service = ShapeId.from("fake#Fake"), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index b41cff293cd..9f8056931bb 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -14,6 +14,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext +import software.amazon.smithy.rust.codegen.client.testutil.withEnableUserConfigurableRuntimePlugins import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -161,7 +162,9 @@ internal class ServiceConfigGeneratorTest { val model = "namespace empty".asSmithyModel() val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) + val codegenContext = testClientCodegenContext(model) + .withSmithyRuntimeMode(smithyRuntimeMode) + .withEnableUserConfigurableRuntimePlugins(true) val sut = ServiceConfigGenerator(codegenContext, listOf(ServiceCustomizer(codegenContext))) val symbolProvider = codegenContext.symbolProvider val project = TestWorkspace.testProject(symbolProvider) @@ -176,6 +179,28 @@ internal class ServiceConfigGeneratorTest { assert_eq!(config.config_field(), 99); """, ) + + unitTest( + "set_runtime_plugin", + """ + use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; + use aws_smithy_types::config_bag::FrozenLayer; + + #[derive(Debug)] + struct TestRuntimePlugin; + + impl RuntimePlugin for TestRuntimePlugin { + fn config(&self) -> Option { + todo!("ExampleRuntimePlugin.config") + } + } + + let config = Config::builder() + .runtime_plugin(TestRuntimePlugin) + .build(); + assert_eq!(config.runtime_plugins.len(), 1); + """, + ) } else { unitTest( "set_config_fields", diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 3cb637b64b8..798218ab960 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -509,6 +509,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { val AllowNonSnakeCase = Attribute(allow("non_snake_case")) val AllowUnreachableCode = Attribute(allow("unreachable_code")) val AllowUnreachablePatterns = Attribute(allow("unreachable_patterns")) + val AllowUnused = Attribute(allow("unused")) val AllowUnusedImports = Attribute(allow("unused_imports")) val AllowUnusedMut = Attribute(allow("unused_mut")) val AllowUnusedVariables = Attribute(allow("unused_variables")) From d5674b8ad92fbffd9ffe31305428853668a2ed45 Mon Sep 17 00:00:00 2001 From: david-perez Date: Fri, 21 Jul 2023 13:19:34 +0200 Subject: [PATCH 029/331] Adjust sSDK error message when using `@range` on floating point shapes (#2727) To point to a better issue https://github.com/awslabs/smithy-rs/issues/2007. Also let users know this is unlikely to ever get implemented. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../server/smithy/ValidateUnsupportedConstraints.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt index 192facc2ba3..4dfa97644ed 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt @@ -61,10 +61,11 @@ private sealed class UnsupportedConstraintMessageKind { shape: Shape, constraintTrait: Trait, trackingIssue: String, + willSupport: Boolean = true, ) = buildMessage( "The ${shape.type} shape `${shape.id}` has the constraint trait `${constraintTrait.toShapeId()}` attached.", - willSupport = true, + willSupport, trackingIssue, ) @@ -104,7 +105,12 @@ private sealed class UnsupportedConstraintMessageKind { is UnsupportedRangeTraitOnShape -> LogMessage( level, - buildMessageShapeHasUnsupportedConstraintTrait(shape, rangeTrait, constraintTraitsUberIssue), + buildMessageShapeHasUnsupportedConstraintTrait( + shape, + rangeTrait, + willSupport = false, + trackingIssue = "https://github.com/awslabs/smithy-rs/issues/2007", + ), ) is UnsupportedUniqueItemsTraitOnShape -> LogMessage( @@ -250,7 +256,7 @@ fun validateUnsupportedConstraints( unsupportedConstraintOnNonErrorShapeReachableViaAnEventStreamSet + unsupportedConstraintErrorShapeReachableViaAnEventStreamSet // 3. Range trait used on unsupported shapes. - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) + // TODO(https://github.com/awslabs/smithy-rs/issues/2007) val unsupportedRangeTraitOnShapeSet = walker .walkShapes(service) .asSequence() From e060135e0176677504c1d17dbbc5e6556aeee0ca Mon Sep 17 00:00:00 2001 From: david-perez Date: Fri, 21 Jul 2023 15:24:08 +0200 Subject: [PATCH 030/331] Move `alb_health_check` module out of the `plugin` module (#2865) The current module location is misleading, since you never want to run the layer as a plugin: plugins always run after routing, and the health check should be enacted before routing. Examples have been corrected, and a test has been added. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 +++ examples/pokemon-service/src/main.rs | 15 ++++---- examples/pokemon-service/tests/simple.rs | 28 ++++++++++++++ .../src/{plugin => layer}/alb_health_check.rs | 37 +++++++++++-------- .../aws-smithy-http-server/src/layer/mod.rs | 9 +++++ .../aws-smithy-http-server/src/lib.rs | 1 + .../src/plugin/either.rs | 2 + .../aws-smithy-http-server/src/plugin/mod.rs | 3 +- 8 files changed, 76 insertions(+), 25 deletions(-) rename rust-runtime/aws-smithy-http-server/src/{plugin => layer}/alb_health_check.rs (86%) create mode 100644 rust-runtime/aws-smithy-http-server/src/layer/mod.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 9098765a552..7b24ac49efc 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -658,3 +658,9 @@ message = "The AppName property can now be set with `sdk_ua_app_id` in profile f references = ["smithy-rs#2724"] meta = { "breaking" = false, "tada" = false, "bug" = false } author = "rcoh" + +[[smithy-rs]] +message = "The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer." +references = ["smithy-rs#2865"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } +author = "david-perez" diff --git a/examples/pokemon-service/src/main.rs b/examples/pokemon-service/src/main.rs index b7566baa2e6..227d778fc80 100644 --- a/examples/pokemon-service/src/main.rs +++ b/examples/pokemon-service/src/main.rs @@ -10,7 +10,8 @@ use std::{net::SocketAddr, sync::Arc}; use aws_smithy_http_server::{ extension::OperationExtensionExt, instrumentation::InstrumentExt, - plugin::{alb_health_check::AlbHealthCheckLayer, HttpPlugins, IdentityPlugin, Scoped}, + layer::alb_health_check::AlbHealthCheckLayer, + plugin::{HttpPlugins, IdentityPlugin, Scoped}, request::request_id::ServerRequestIdProviderLayer, AddExtensionLayer, }; @@ -61,11 +62,7 @@ pub async fn main() { // `Response::extensions`, or infer routing failure when it's missing. .insert_operation_extension() // Adds `tracing` spans and events to the request lifecycle. - .instrument() - // Handle `/ping` health check requests. - .layer(AlbHealthCheckLayer::from_handler("/ping", |_req| async { - StatusCode::OK - })); + .instrument(); let app = PokemonService::builder_with_plugins(plugins, IdentityPlugin) // Build a registry containing implementations to all the operations in the service. These @@ -84,7 +81,11 @@ pub async fn main() { let app = app // Setup shared state and middlewares. .layer(&AddExtensionLayer::new(Arc::new(State::default()))) - // Add request IDs + // Handle `/ping` health check requests. + .layer(&AlbHealthCheckLayer::from_handler("/ping", |_req| async { + StatusCode::OK + })) + // Add server request IDs. .layer(&ServerRequestIdProviderLayer::new()); // Using `into_make_service_with_connect_info`, rather than `into_make_service`, to adjoin the `SocketAddr` diff --git a/examples/pokemon-service/tests/simple.rs b/examples/pokemon-service/tests/simple.rs index af03bfee30d..3a055da587d 100644 --- a/examples/pokemon-service/tests/simple.rs +++ b/examples/pokemon-service/tests/simple.rs @@ -89,3 +89,31 @@ async fn simple_integration_test() { assert_eq!(result.status(), 200); } + +#[tokio::test] +#[serial] +async fn health_check() { + let _child = common::run_server().await; + + use pokemon_service::{DEFAULT_ADDRESS, DEFAULT_PORT}; + let url = format!("http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}/ping"); + let uri = url.parse::().expect("invalid URL"); + + // Since the `/ping` route is not modeled in Smithy, we use a regular + // Hyper HTTP client to make a request to it. + let request = hyper::Request::builder() + .uri(uri) + .body(hyper::Body::empty()) + .expect("failed to build request"); + + let response = hyper::Client::new() + .request(request) + .await + .expect("failed to get response"); + + assert_eq!(response.status(), hyper::StatusCode::OK); + let body = hyper::body::to_bytes(response.into_body()) + .await + .expect("failed to read response body"); + assert!(body.is_empty()); +} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs b/rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs similarity index 86% rename from rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs rename to rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs index 47b5460a3f6..8c76bf1a9f3 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs +++ b/rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs @@ -9,14 +9,17 @@ //! # Example //! //! ```no_run -//! # use aws_smithy_http_server::{body, plugin::{HttpPlugins, alb_health_check::AlbHealthCheckLayer}}; -//! # use hyper::{Body, Response, StatusCode}; -//! let plugins = HttpPlugins::new() -//! // Handle all `/ping` health check requests by returning a `200 OK`. -//! .layer(AlbHealthCheckLayer::from_handler("/ping", |_req| async { -//! StatusCode::OK -//! })); +//! use aws_smithy_http_server::layer::alb_health_check::AlbHealthCheckLayer; +//! use hyper::StatusCode; +//! use tower::Layer; //! +//! // Handle all `/ping` health check requests by returning a `200 OK`. +//! let ping_layer = AlbHealthCheckLayer::from_handler("/ping", |_req| async { +//! StatusCode::OK +//! }); +//! # async fn handle() { } +//! let app = tower::service_fn(handle); +//! let app = ping_layer.layer(app); //! ``` use std::borrow::Cow; @@ -31,8 +34,8 @@ use tower::{service_fn, util::Oneshot, Layer, Service, ServiceExt}; use crate::body::BoxBody; -use super::either::EitherProj; -use super::Either; +use crate::plugin::either::Either; +use crate::plugin::either::EitherProj; /// A [`tower::Layer`] used to apply [`AlbHealthCheckService`]. #[derive(Clone, Debug)] @@ -96,9 +99,7 @@ where H: Service, Response = StatusCode, Error = Infallible> + Clone, { type Response = S::Response; - type Error = S::Error; - type Future = AlbHealthCheckFuture; fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { @@ -133,7 +134,11 @@ pin_project! { } } -impl, Response = StatusCode>, S: Service>> AlbHealthCheckFuture { +impl AlbHealthCheckFuture +where + H: Service, Response = StatusCode>, + S: Service>, +{ fn handler_future(handler_future: Oneshot>) -> Self { Self { inner: Either::Left { value: handler_future }, @@ -147,10 +152,10 @@ impl, Response = StatusCode>, S: Service> } } -impl< - H: Service, Response = StatusCode, Error = Infallible>, - S: Service, Response = Response>, - > Future for AlbHealthCheckFuture +impl Future for AlbHealthCheckFuture +where + H: Service, Response = StatusCode, Error = Infallible>, + S: Service, Response = Response>, { type Output = Result; diff --git a/rust-runtime/aws-smithy-http-server/src/layer/mod.rs b/rust-runtime/aws-smithy-http-server/src/layer/mod.rs new file mode 100644 index 00000000000..fcbce76f44c --- /dev/null +++ b/rust-runtime/aws-smithy-http-server/src/layer/mod.rs @@ -0,0 +1,9 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! This module hosts [`Layer`](tower::Layer)s that are generally meant to be applied _around_ the +//! [`Router`](crate::routing::Router), so they are enacted before a request is routed. + +pub mod alb_health_check; diff --git a/rust-runtime/aws-smithy-http-server/src/lib.rs b/rust-runtime/aws-smithy-http-server/src/lib.rs index 7b32c507362..a7a78733b29 100644 --- a/rust-runtime/aws-smithy-http-server/src/lib.rs +++ b/rust-runtime/aws-smithy-http-server/src/lib.rs @@ -16,6 +16,7 @@ pub mod body; pub(crate) mod error; pub mod extension; pub mod instrumentation; +pub mod layer; pub mod operation; pub mod plugin; #[doc(hidden)] diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/either.rs b/rust-runtime/aws-smithy-http-server/src/plugin/either.rs index b2da9cc5f0b..d0b6192ba08 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/either.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/either.rs @@ -15,6 +15,8 @@ use tower::{Layer, Service}; use super::Plugin; +// TODO(https://github.com/awslabs/smithy-rs/pull/2441#pullrequestreview-1331345692): Seems like +// this type should land in `tower-0.5`. pin_project! { /// Combine two different [`Futures`](std::future::Future)/[`Services`](tower::Service)/ /// [`Layers`](tower::Layer)/[`Plugins`](super::Plugin) into a single type. diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs index 5bbeda3eba7..a5d5ec66ec1 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs @@ -194,9 +194,8 @@ //! impl ModelMarker for PrintPlugin { } //! ``` -pub mod alb_health_check; mod closure; -mod either; +pub(crate) mod either; mod filter; mod http_plugins; mod identity; From 666c474f4a4659ef53978ad090bf4b26cc12cebe Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 24 Jul 2023 08:28:49 -0700 Subject: [PATCH 031/331] Tidy up `aws-smithy-runtime-api` a bit (#2867) This PR makes some progress towards documenting the `aws-smithy-runtime-api` crate, as well as some additional work to make it more stable: - Places the `client` module behind a `client` feature so that it will be possible to add a `server` module/feature in the future. - Deletes `ConfigBagAccessors`. - Renames auth types to reflect changes in the internal spec. - Moves `RequestAttempts` into the `client::retries` module. - Moves several types that were in floating around in `client::orchestrator` to their own modules. - Renames `Connector` to `HttpConnector`. - Changes `DynResponseDeserializer` to `SharedResponseDeserializer` for consistency with serialization, and also so that it could be moved into runtime components or config in the future (since those need to implement `Clone`). - Updates the identity and auth design doc. - Updates READMEs and crate-level documentation. - Fixes most, but not all, the missing documentation in the crate. - Hides the builder macros. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/glacier_interceptors.rs | 3 +- aws/rust-runtime/aws-runtime/Cargo.toml | 4 +- .../aws-runtime/src/auth/sigv4.rs | 40 ++- .../aws-runtime/src/request_info.rs | 2 +- .../AwsCustomizableOperationDecorator.kt | 1 - .../smithy/rustsdk/AwsPresigningDecorator.kt | 6 +- .../smithy/rustsdk/SigV4AuthDecorator.kt | 16 +- .../customize/ServiceSpecificDecorator.kt | 8 +- .../customizations/HttpAuthDecorator.kt | 20 +- .../HttpConnectorConfigDecorator.kt | 18 +- .../smithy/customizations/NoAuthDecorator.kt | 8 +- .../customize/ClientCodegenDecorator.kt | 18 +- .../endpoint/EndpointConfigCustomization.kt | 2 +- .../EndpointParamsInterceptorGenerator.kt | 8 +- .../ConfigOverrideRuntimePluginGenerator.kt | 1 - .../smithy/generators/OperationGenerator.kt | 6 +- .../OperationRuntimePluginGenerator.kt | 42 ++- .../ServiceRuntimePluginGenerator.kt | 4 +- .../config/ServiceConfigGenerator.kt | 3 +- .../protocol/ProtocolTestGenerator.kt | 6 +- .../protocol/RequestSerializerGenerator.kt | 5 +- .../protocol/ResponseDeserializerGenerator.kt | 2 +- .../smithy/endpoint/EndpointsDecoratorTest.kt | 2 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 9 +- .../protocol/ProtocolTestGeneratorTest.kt | 6 +- .../codegen/core/rustlang/CargoDependency.kt | 2 + .../rust/codegen/core/smithy/RuntimeType.kt | 2 - design/src/client/identity_and_auth.md | 65 +++-- .../aws-smithy-runtime-api/Cargo.toml | 1 + rust-runtime/aws-smithy-runtime-api/README.md | 10 +- .../aws-smithy-runtime-api/src/client.rs | 21 +- .../aws-smithy-runtime-api/src/client/auth.rs | 134 ++++++--- .../src/client/auth/http.rs | 7 + .../src/client/auth/option_resolver.rs | 49 ---- .../src/client/auth/static_resolver.rs | 49 ++++ .../src/client/config_bag_accessors.rs | 161 ----------- .../src/client/connectors.rs | 20 +- .../src/client/endpoint.rs | 62 ++++ .../src/client/identity.rs | 27 +- .../src/client/interceptors.rs | 4 + .../src/client/interceptors/context.rs | 1 + .../client/interceptors/context/wrappers.rs | 12 + .../src/client/interceptors/error.rs | 1 + .../src/client/orchestrator.rs | 273 +++++++++++------- .../src/client/orchestrator/error.rs | 151 ---------- .../src/client/request_attempts.rs | 32 -- .../src/client/retries.rs | 69 ++++- .../src/client/runtime_components.rs | 133 +++++---- .../src/client/runtime_plugin.rs | 114 +++++--- .../src/client/ser_de.rs | 105 +++++++ .../aws-smithy-runtime-api/src/lib.rs | 19 +- .../aws-smithy-runtime-api/src/macros.rs | 3 + rust-runtime/aws-smithy-runtime/Cargo.toml | 1 + rust-runtime/aws-smithy-runtime/README.md | 2 - .../src/client/auth/http.rs | 42 +-- .../src/client/auth/no_auth.rs | 12 +- .../src/client/connectors.rs | 8 +- .../src/client/connectors/test_util.rs | 6 +- .../src/client/orchestrator.rs | 41 +-- .../src/client/orchestrator/auth.rs | 70 ++--- .../src/client/orchestrator/endpoints.rs | 10 +- .../client/retries/strategy/fixed_delay.rs | 3 +- .../src/client/retries/strategy/standard.rs | 3 +- .../src/client/test_util/deserializer.rs | 8 +- .../src/client/test_util/serializer.rs | 7 +- rust-runtime/aws-smithy-runtime/src/lib.rs | 1 + rust-runtime/inlineable/Cargo.toml | 2 +- 67 files changed, 1048 insertions(+), 935 deletions(-) delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index b9a61650170..efd71582afa 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -11,7 +11,6 @@ use aws_sigv4::http_request::SignableBody; use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; @@ -126,7 +125,7 @@ impl Interceptor for GlacierTreeHashHeaderInterceptor { // Request the request body to be loaded into memory immediately after serialization // so that it can be checksummed before signing and transmit cfg.interceptor_state() - .set_loaded_request_body(LoadedRequestBody::Requested); + .store_put(LoadedRequestBody::Requested); Ok(()) } diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index 8ffcade9fcb..9600d1f0a97 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -18,8 +18,8 @@ aws-sigv4 = { path = "../aws-sigv4" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime" } -aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } +aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-types = { path = "../aws-types" } fastrand = "2.0.0" diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index 3a5a2e85ef8..ac1eab1ea7e 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -10,7 +10,7 @@ use aws_sigv4::http_request::{ }; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, }; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -79,18 +79,18 @@ impl StdError for SigV4SigningError { /// SigV4 auth scheme. #[derive(Debug, Default)] -pub struct SigV4HttpAuthScheme { - signer: SigV4HttpRequestSigner, +pub struct SigV4AuthScheme { + signer: SigV4Signer, } -impl SigV4HttpAuthScheme { - /// Creates a new `SigV4HttpAuthScheme`. +impl SigV4AuthScheme { + /// Creates a new `SigV4AuthScheme`. pub fn new() -> Self { Default::default() } } -impl HttpAuthScheme for SigV4HttpAuthScheme { +impl AuthScheme for SigV4AuthScheme { fn scheme_id(&self) -> AuthSchemeId { SCHEME_ID } @@ -102,7 +102,7 @@ impl HttpAuthScheme for SigV4HttpAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } @@ -174,11 +174,11 @@ impl Storable for SigV4OperationSigningConfig { type Storer = StoreReplace; } -/// SigV4 HTTP request signer. +/// SigV4 signer. #[derive(Debug, Default)] -pub struct SigV4HttpRequestSigner; +pub struct SigV4Signer; -impl SigV4HttpRequestSigner { +impl SigV4Signer { /// Creates a new signer instance. pub fn new() -> Self { Self @@ -291,7 +291,7 @@ impl SigV4HttpRequestSigner { endpoint_config: AuthSchemeEndpointConfig<'_>, ) -> Result { let (mut signing_region_override, mut signing_service_override) = (None, None); - if let Some(config) = endpoint_config.config().and_then(Document::as_object) { + if let Some(config) = endpoint_config.as_document().and_then(Document::as_object) { use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; signing_region_override = match config.get("signingRegion") { Some(Document::String(s)) => Some(SigningRegion::from(Region::new(s.clone()))), @@ -311,8 +311,8 @@ impl SigV4HttpRequestSigner { } } -impl HttpRequestSigner for SigV4HttpRequestSigner { - fn sign_request( +impl Signer for SigV4Signer { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, @@ -550,15 +550,13 @@ mod tests { payload_override: None, }, }; - SigV4HttpRequestSigner::signing_params(settings, &credentials, &operation_config, now) - .unwrap(); + SigV4Signer::signing_params(settings, &credentials, &operation_config, now).unwrap(); assert!(!logs_contain(EXPIRATION_WARNING)); let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); - SigV4HttpRequestSigner::signing_params(settings, &credentials, &operation_config, now) - .unwrap(); + SigV4Signer::signing_params(settings, &credentials, &operation_config, now).unwrap(); assert!(logs_contain(EXPIRATION_WARNING)); } @@ -583,11 +581,10 @@ mod tests { ); out }); - let config = AuthSchemeEndpointConfig::new(Some(&config)); + let config = AuthSchemeEndpointConfig::from(Some(&config)); let cfg = ConfigBag::of_layers(vec![layer]); - let result = - SigV4HttpRequestSigner::extract_operation_config(config, &cfg).expect("success"); + let result = SigV4Signer::extract_operation_config(config, &cfg).expect("success"); assert_eq!( result.region, @@ -611,8 +608,7 @@ mod tests { let cfg = ConfigBag::of_layers(vec![layer]); let config = AuthSchemeEndpointConfig::empty(); - let result = - SigV4HttpRequestSigner::extract_operation_config(config, &cfg).expect("success"); + let result = SigV4Signer::extract_operation_config(config, &cfg).expect("success"); assert_eq!( result.region, diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index 0fb9a929eeb..f0abff30418 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -7,7 +7,7 @@ use aws_smithy_runtime::client::orchestrator::interceptors::ServiceClockSkew; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; +use aws_smithy_runtime_api::client::retries::RequestAttempts; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::date_time::Format; diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt index 6af6bfde0d9..17e8dd248b3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt @@ -22,7 +22,6 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent::AwsUserAgent"), "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), "ConfigBag" to RuntimeType.configBag(runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "http" to CargoDependency.Http.toType(), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index de6da933e32..fc1833688c8 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -364,21 +364,19 @@ class AwsPresignedFluentBuilderMethod( struct AlternatePresigningSerializerRuntimePlugin; impl #{RuntimePlugin} for AlternatePresigningSerializerRuntimePlugin { fn config(&self) -> #{Option}<#{FrozenLayer}> { - use #{ConfigBagAccessors}; let mut cfg = #{Layer}::new("presigning_serializer"); - cfg.set_request_serializer(#{SharedRequestSerializer}::new(#{AlternateSerializer})); + cfg.store_put(#{SharedRequestSerializer}::new(#{AlternateSerializer})); #{Some}(cfg.freeze()) } } """, *preludeScope, "AlternateSerializer" to alternateSerializer(operationShape), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), "SharedRequestSerializer" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) - .resolve("client::orchestrator::SharedRequestSerializer"), + .resolve("client::ser_de::SharedRequestSerializer"), ) } }, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 6163d78a2f0..279626e508d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -10,7 +10,7 @@ import software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection @@ -33,9 +33,9 @@ class SigV4AuthDecorator : ClientCodegenDecorator { override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List = baseAuthOptions.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + AuthOption.StaticAuthOption(SigV4Trait.ID) { + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { + it + AuthSchemeOption.StaticAuthSchemeOption(SigV4Trait.ID) { rustTemplate( "#{scheme_id},", "scheme_id" to AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) @@ -69,10 +69,10 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( "SIGV4_SCHEME_ID" to awsRuntime.resolve("auth::sigv4::SCHEME_ID"), - "SigV4HttpAuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4HttpAuthScheme"), + "SigV4AuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4AuthScheme"), "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), - "SharedHttpAuthScheme" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::auth::SharedHttpAuthScheme"), + "SharedAuthScheme" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::auth::SharedAuthScheme"), ) } @@ -84,8 +84,8 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: // enable the aws-runtime `sign-eventstream` feature addDependency(AwsCargoDependency.awsRuntime(runtimeConfig).withFeature("event-stream").toType().toSymbol()) } - section.registerHttpAuthScheme(this) { - rustTemplate("#{SharedHttpAuthScheme}::new(#{SigV4HttpAuthScheme}::new())", *codegenScope) + section.registerAuthScheme(this) { + rustTemplate("#{SharedAuthScheme}::new(#{SigV4AuthScheme}::new())", *codegenScope) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt index 3f8a8f6d614..4850d299efb 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt @@ -12,7 +12,7 @@ import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.ToShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientProtocolMap import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization @@ -63,9 +63,9 @@ class ServiceSpecificDecorator( override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List = baseAuthOptions.maybeApply(codegenContext.serviceShape) { - delegateTo.authOptions(codegenContext, operationShape, baseAuthOptions) + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions.maybeApply(codegenContext.serviceShape) { + delegateTo.authOptions(codegenContext, operationShape, baseAuthSchemeOptions) } override fun builderCustomizations( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index ead864dc32c..9477f1082ad 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -14,8 +14,8 @@ import software.amazon.smithy.model.traits.HttpBearerAuthTrait import software.amazon.smithy.model.traits.HttpDigestAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption.StaticAuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption.StaticAuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection @@ -52,7 +52,7 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> "IdentityResolver" to smithyRuntimeApi.resolve("client::identity::IdentityResolver"), "Login" to smithyRuntimeApi.resolve("client::identity::http::Login"), "PropertyBag" to RuntimeType.smithyHttp(runtimeConfig).resolve("property_bag::PropertyBag"), - "SharedHttpAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedHttpAuthScheme"), + "SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"), "SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"), "Token" to smithyRuntimeApi.resolve("client::identity::http::Token"), ) @@ -89,16 +89,16 @@ class HttpAuthDecorator : ClientCodegenDecorator { override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List { + baseAuthSchemeOptions: List, + ): List { val serviceIndex = ServiceIndex.of(codegenContext.model) val authSchemes = serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) val codegenScope = codegenScope(codegenContext.runtimeConfig) - val options = ArrayList() + val options = ArrayList() for (authScheme in authSchemes.keys) { fun addOption(schemeShapeId: ShapeId, name: String) { options.add( - StaticAuthOption( + StaticAuthSchemeOption( schemeShapeId, writable { rustTemplate("$name,", *codegenScope) @@ -114,7 +114,7 @@ class HttpAuthDecorator : ClientCodegenDecorator { else -> {} } } - return baseAuthOptions + options + return baseAuthSchemeOptions + options } override fun configCustomizations( @@ -164,8 +164,8 @@ private class HttpAuthServiceRuntimePluginCustomization( when (section) { is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { fun registerAuthScheme(scheme: Writable) { - section.registerHttpAuthScheme(this) { - rustTemplate("#{SharedHttpAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) + section.registerAuthScheme(this) { + rustTemplate("#{SharedAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) } } fun registerNamedAuthScheme(name: String) { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index b0ba6b1f24b..94e0f47daf9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -45,7 +45,7 @@ private class HttpConnectorConfigCustomization( "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedConnector" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::connectors::SharedConnector"), + "SharedHttpConnector" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::connectors::SharedHttpConnector"), "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), ) @@ -101,9 +101,9 @@ private class HttpConnectorConfigCustomization( http_connector .and_then(|c| c.connector(&connector_settings, sleep_impl.clone())) .or_else(|| #{default_connector}(&connector_settings, sleep_impl)) - .map(|c| #{SharedConnector}::new(#{DynConnectorAdapter}::new(c))); + .map(|c| #{SharedHttpConnector}::new(#{DynConnectorAdapter}::new(c))); - resolver.runtime_components_mut().set_connector(connector); + resolver.runtime_components_mut().set_http_connector(connector); } } """, @@ -124,15 +124,9 @@ private class HttpConnectorConfigCustomization( if (runtimeMode.defaultToOrchestrator) { rustTemplate( """ - // TODO(enableNewSmithyRuntimeCleanup): Remove this function - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.config.load::<#{HttpConnector}>() - } - - /// Return the [`SharedConnector`](#{SharedConnector}) to use when making requests, if any. - pub fn connector(&self) -> Option<#{SharedConnector}> { - self.runtime_components.connector() + /// Return the [`SharedHttpConnector`](#{SharedHttpConnector}) to use when making requests, if any. + pub fn http_connector(&self) -> Option<#{SharedHttpConnector}> { + self.runtime_components.http_connector() } """, *codegenScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt index 9cdcae78c54..38582fabcde 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt @@ -8,7 +8,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -28,9 +28,9 @@ class NoAuthDecorator : ClientCodegenDecorator { override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List = baseAuthOptions + - AuthOption.StaticAuthOption(noAuthSchemeShapeId) { + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions + + AuthSchemeOption.StaticAuthSchemeOption(noAuthSchemeShapeId) { rustTemplate( "#{NO_AUTH_SCHEME_ID},", "NO_AUTH_SCHEME_ID" to noAuthModule(codegenContext).resolve("NO_AUTH_SCHEME_ID"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt index 3dfd77976fa..36a517bb188 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt @@ -26,14 +26,14 @@ import java.util.logging.Logger typealias ClientProtocolMap = ProtocolMap -sealed interface AuthOption { - /** Auth scheme for the `StaticAuthOptionResolver` */ - data class StaticAuthOption( +sealed interface AuthSchemeOption { + /** Auth scheme for the `StaticAuthSchemeOptionResolver` */ + data class StaticAuthSchemeOption( val schemeShapeId: ShapeId, val constructor: Writable, - ) : AuthOption + ) : AuthSchemeOption - class CustomResolver(/* unimplemented */) : AuthOption + class CustomResolver(/* unimplemented */) : AuthSchemeOption } /** @@ -47,8 +47,8 @@ interface ClientCodegenDecorator : CoreCodegenDecorator, - ): List = baseAuthOptions + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions fun configCustomizations( codegenContext: ClientCodegenContext, @@ -110,8 +110,8 @@ open class CombinedClientCodegenDecorator(decorators: List, - ): List = combineCustomizations(baseAuthOptions) { decorator, authOptions -> + baseAuthSchemeOptions: List, + ): List = combineCustomizations(baseAuthSchemeOptions) { decorator, authOptions -> decorator.authOptions(codegenContext, operationShape, authOptions) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index 2f81ef33f5f..1cd523ad0f6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -35,7 +35,7 @@ internal class EndpointConfigCustomization( "OldSharedEndpointResolver" to types.sharedEndpointResolver, "Params" to typesGenerator.paramsStruct(), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), - "SharedEndpointResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::SharedEndpointResolver"), + "SharedEndpointResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint::SharedEndpointResolver"), "SmithyResolver" to types.resolveEndpoint, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index 1894dcd02a6..6b994105129 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -45,15 +45,12 @@ class EndpointParamsInterceptorGenerator( val runtimeApi = CargoDependency.smithyRuntimeApi(rc).toType() val interceptors = runtimeApi.resolve("client::interceptors") val orchestrator = runtimeApi.resolve("client::orchestrator") - val smithyTypes = CargoDependency.smithyTypes(rc).toType() arrayOf( *preludeScope, "BoxError" to RuntimeType.boxError(rc), "ConfigBag" to RuntimeType.configBag(rc), - "ConfigBagAccessors" to RuntimeType.smithyRuntimeApi(rc) - .resolve("client::config_bag_accessors::ConfigBagAccessors"), "ContextAttachedError" to interceptors.resolve("error::ContextAttachedError"), - "EndpointResolverParams" to orchestrator.resolve("EndpointResolverParams"), + "EndpointResolverParams" to runtimeApi.resolve("client::endpoint::EndpointResolverParams"), "HttpRequest" to orchestrator.resolve("HttpRequest"), "HttpResponse" to orchestrator.resolve("HttpResponse"), "Interceptor" to RuntimeType.interceptor(rc), @@ -82,7 +79,6 @@ class EndpointParamsInterceptorGenerator( context: &#{BeforeSerializationInterceptorContextRef}<'_, #{Input}, #{Output}, #{Error}>, cfg: &mut #{ConfigBag}, ) -> #{Result}<(), #{BoxError}> { - use #{ConfigBagAccessors}; let _input = context.input() .downcast_ref::<${operationInput.name}>() .ok_or("failed to downcast to ${operationInput.name}")?; @@ -93,7 +89,7 @@ class EndpointParamsInterceptorGenerator( #{param_setters} .build() .map_err(|err| #{ContextAttachedError}::new("endpoint params could not be built", err))?; - cfg.interceptor_state().set_endpoint_resolver_params(#{EndpointResolverParams}::new(params)); + cfg.interceptor_state().store_put(#{EndpointResolverParams}::new(params)); #{Ok}(()) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index b199eaf5a53..0e595065f9f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -25,7 +25,6 @@ class ConfigOverrideRuntimePluginGenerator( *RuntimeType.preludeScope, "Cow" to RuntimeType.Cow, "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), - "ConfigBagAccessors" to runtimeApi.resolve("client::config_bag_accessors::ConfigBagAccessors"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), "Layer" to smithyTypes.resolve("config_bag::Layer"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 0d93284e204..90b970d1d1e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -7,7 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsInterceptorGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator @@ -85,7 +85,7 @@ open class OperationGenerator( private fun renderOperationStruct( operationWriter: RustWriter, operationShape: OperationShape, - authOptions: List, + authSchemeOptions: List, operationCustomizations: List, ) { val operationName = symbolProvider.toSymbol(operationShape).name @@ -213,7 +213,7 @@ open class OperationGenerator( operationWriter, operationShape, operationName, - authOptions, + authSchemeOptions, operationCustomizations, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index 73bfe50780d..73d6756072d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -10,7 +10,7 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customizations.noAuthSchemeShapeId -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -35,21 +35,20 @@ class OperationRuntimePluginGenerator( val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *preludeScope, - "AuthOptionResolverParams" to runtimeApi.resolve("client::auth::AuthOptionResolverParams"), + "AuthSchemeOptionResolverParams" to runtimeApi.resolve("client::auth::AuthSchemeOptionResolverParams"), "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), "Cow" to RuntimeType.Cow, - "SharedAuthOptionResolver" to runtimeApi.resolve("client::auth::SharedAuthOptionResolver"), - "DynResponseDeserializer" to runtimeApi.resolve("client::orchestrator::DynResponseDeserializer"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RetryClassifiers" to runtimeApi.resolve("client::retries::RetryClassifiers"), - "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig), - "SharedRequestSerializer" to runtimeApi.resolve("client::orchestrator::SharedRequestSerializer"), - "StaticAuthOptionResolver" to runtimeApi.resolve("client::auth::option_resolver::StaticAuthOptionResolver"), - "StaticAuthOptionResolverParams" to runtimeApi.resolve("client::auth::option_resolver::StaticAuthOptionResolverParams"), + "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), + "SharedAuthSchemeOptionResolver" to runtimeApi.resolve("client::auth::SharedAuthSchemeOptionResolver"), + "SharedRequestSerializer" to runtimeApi.resolve("client::ser_de::SharedRequestSerializer"), + "SharedResponseDeserializer" to runtimeApi.resolve("client::ser_de::SharedResponseDeserializer"), + "StaticAuthSchemeOptionResolver" to runtimeApi.resolve("client::auth::static_resolver::StaticAuthSchemeOptionResolver"), + "StaticAuthSchemeOptionResolverParams" to runtimeApi.resolve("client::auth::static_resolver::StaticAuthSchemeOptionResolverParams"), ) } @@ -57,7 +56,7 @@ class OperationRuntimePluginGenerator( writer: RustWriter, operationShape: OperationShape, operationStructName: String, - authOptions: List, + authSchemeOptions: List, customizations: List, ) { writer.rustTemplate( @@ -65,13 +64,12 @@ class OperationRuntimePluginGenerator( impl #{RuntimePlugin} for $operationStructName { fn config(&self) -> #{Option}<#{FrozenLayer}> { let mut cfg = #{Layer}::new(${operationShape.id.name.dq()}); - use #{ConfigBagAccessors} as _; cfg.store_put(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); - cfg.store_put(#{DynResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); + cfg.store_put(#{SharedResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); ${"" /* TODO(IdentityAndAuth): Resolve auth parameters from input for services that need this */} - cfg.set_auth_option_resolver_params(#{AuthOptionResolverParams}::new(#{StaticAuthOptionResolverParams}::new())); + cfg.store_put(#{AuthSchemeOptionResolverParams}::new(#{StaticAuthSchemeOptionResolverParams}::new())); #{additional_config} @@ -96,7 +94,7 @@ class OperationRuntimePluginGenerator( """, *codegenScope, *preludeScope, - "auth_options" to generateAuthOptions(operationShape, authOptions), + "auth_options" to generateAuthOptions(operationShape, authSchemeOptions), "additional_config" to writable { writeCustomizations( customizations, @@ -130,20 +128,20 @@ class OperationRuntimePluginGenerator( private fun generateAuthOptions( operationShape: OperationShape, - authOptions: List, + authSchemeOptions: List, ): Writable = writable { - if (authOptions.any { it is AuthOption.CustomResolver }) { - throw IllegalStateException("AuthOption.CustomResolver is unimplemented") + if (authSchemeOptions.any { it is AuthSchemeOption.CustomResolver }) { + throw IllegalStateException("AuthSchemeOption.CustomResolver is unimplemented") } else { - val authOptionsMap = authOptions.associate { - val option = it as AuthOption.StaticAuthOption + val authOptionsMap = authSchemeOptions.associate { + val option = it as AuthSchemeOption.StaticAuthSchemeOption option.schemeShapeId to option } withBlockTemplate( """ - .with_auth_option_resolver(#{Some}( - #{SharedAuthOptionResolver}::new( - #{StaticAuthOptionResolver}::new(vec![ + .with_auth_scheme_option_resolver(#{Some}( + #{SharedAuthSchemeOptionResolver}::new( + #{StaticAuthSchemeOptionResolver}::new(vec![ """, "]))))", *codegenScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index ed68a0b3068..86a2d4d63d2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -50,10 +50,10 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { ) } - fun registerHttpAuthScheme(writer: RustWriter, authScheme: Writable) { + fun registerAuthScheme(writer: RustWriter, authScheme: Writable) { writer.rustTemplate( """ - runtime_components.push_http_auth_scheme(#{auth_scheme}); + runtime_components.push_auth_scheme(#{auth_scheme}); """, "auth_scheme" to authScheme, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index d732f4e1e2d..ba400c85bf6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -313,8 +313,7 @@ class ServiceConfigGenerator( *preludeScope, "BoxError" to RuntimeType.boxError(runtimeConfig), "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), - "ConfigBag" to RuntimeType.configBag(runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), + "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "Cow" to RuntimeType.Cow, "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "Layer" to smithyTypes.resolve("config_bag::Layer"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index f4d9a4c705f..e3f61df3b03 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -375,7 +375,7 @@ class DefaultProtocolTestGenerator( let op = #{Operation}::new(); let config = op.config().expect("the operation has config"); - let de = config.load::<#{DynResponseDeserializer}>().expect("the config must have a deserializer"); + let de = config.load::<#{SharedResponseDeserializer}>().expect("the config must have a deserializer"); let parsed = de.deserialize_streaming(&mut http_response); let parsed = parsed.unwrap_or_else(|| { @@ -386,9 +386,9 @@ class DefaultProtocolTestGenerator( }); """, "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), - "DynResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::DynResponseDeserializer"), + "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), - "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::ResponseDeserializer"), + "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), "RuntimePlugin" to RT.runtimePlugin(rc), "SdkBody" to RT.sdkBody(rc), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index fb21d70cd22..0a1385dcd3d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -37,7 +37,6 @@ class RequestSerializerGenerator( private val codegenScope by lazy { val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) val interceptorContext = runtimeApi.resolve("client::interceptors::context") - val orchestrator = runtimeApi.resolve("client::orchestrator") val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) arrayOf( *preludeScope, @@ -46,11 +45,11 @@ class RequestSerializerGenerator( "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "header_util" to RuntimeType.smithyHttp(codegenContext.runtimeConfig).resolve("header"), "http" to RuntimeType.Http, - "HttpRequest" to orchestrator.resolve("HttpRequest"), + "HttpRequest" to runtimeApi.resolve("client::orchestrator::HttpRequest"), "HttpRequestBuilder" to RuntimeType.HttpRequestBuilder, "Input" to interceptorContext.resolve("Input"), "operation" to RuntimeType.operationModule(codegenContext.runtimeConfig), - "RequestSerializer" to orchestrator.resolve("RequestSerializer"), + "RequestSerializer" to runtimeApi.resolve("client::ser_de::RequestSerializer"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), "HeaderSerializationSettings" to RuntimeType.forInlineDependency( InlineDependency.serializationSettings( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index e08ea15f13a..59d3956a9fb 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -44,7 +44,7 @@ class ResponseDeserializerGenerator( "Output" to interceptorContext.resolve("Output"), "OutputOrError" to interceptorContext.resolve("OutputOrError"), "OrchestratorError" to orchestrator.resolve("OrchestratorError"), - "ResponseDeserializer" to orchestrator.resolve("ResponseDeserializer"), + "ResponseDeserializer" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::ser_de::ResponseDeserializer"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 6d5bcaa05ff..0b64de45cf5 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -187,7 +187,7 @@ class EndpointsDecoratorTest { use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_client::never::NeverConnector; use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::orchestrator::EndpointResolverParams; + use aws_smithy_runtime_api::client::endpoint::EndpointResolverParams; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::endpoint::Endpoint; diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 40f82d29657..bdbee67f3ab 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -46,9 +46,8 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "EndpointResolverParams" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::orchestrator::EndpointResolverParams"), + .resolve("client::endpoint::EndpointResolverParams"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), ) rustCrate.testModule { @@ -57,7 +56,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { rustTemplate( """ use #{RuntimePlugin}; - use ::aws_smithy_runtime_api::client::orchestrator::EndpointResolver; + use ::aws_smithy_runtime_api::client::endpoint::EndpointResolver; let expected_url = "http://localhost:1234/"; let client_config = crate::config::Config::builder().build(); @@ -93,7 +92,6 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), ) rustCrate.testModule { @@ -175,7 +173,6 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "AlwaysRetry" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::AlwaysRetry"), "ConfigBag" to RuntimeType.smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "ErrorKind" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::ErrorKind"), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), "Layer" to RuntimeType.smithyTypes(runtimeConfig).resolve("config_bag::Layer"), @@ -184,7 +181,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "RetryConfig" to RuntimeType.smithyTypes(clientCodegenContext.runtimeConfig) .resolve("retry::RetryConfig"), "RequestAttempts" to smithyRuntimeApiTestUtil(runtimeConfig).toType() - .resolve("client::request_attempts::RequestAttempts"), + .resolve("client::retries::RequestAttempts"), "RetryClassifiers" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::RetryClassifiers"), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index 1d1cddeca46..99beb8d86bd 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -102,15 +102,15 @@ private class TestOperationCustomization( .map_err(|e| #{OrchestratorError}::operation(#{TypedBox}::new(e).erase_error())) } } - cfg.store_put(#{DynResponseDeserializer}::new(TestDeser)); + cfg.store_put(#{SharedResponseDeserializer}::new(TestDeser)); """, *preludeScope, - "DynResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::DynResponseDeserializer"), + "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), "Error" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Error"), "HttpResponse" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), "OrchestratorError" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::OrchestratorError"), "Output" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Output"), - "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::ResponseDeserializer"), + "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), "TypedBox" to RT.smithyTypes(rc).resolve("type_erasure::TypedBox"), ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 8b03d9656cf..73a5e9ebbe6 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -297,7 +297,9 @@ data class CargoDependency( fun smithyQuery(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-query") fun smithyRuntime(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime") + .withFeature("client") fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime-api") + .withFeature("client") fun smithyRuntimeApiTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-types") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index d3b7bd74204..e24edc7f862 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -336,8 +336,6 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun configBag(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag") - fun configBagAccessors(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::config_bag_accessors::ConfigBagAccessors") fun runtimeComponents(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponents") fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) = diff --git a/design/src/client/identity_and_auth.md b/design/src/client/identity_and_auth.md index 87aa8b9c668..d58efa19322 100644 --- a/design/src/client/identity_and_auth.md +++ b/design/src/client/identity_and_auth.md @@ -34,17 +34,17 @@ There are two stages to identity and auth: First, let's establish the aspects of auth that can be configured from the model at codegen time. - **Data** - - **AuthOptionResolverParams:** parameters required to resolve auth options. These parameters are allowed + - **AuthSchemeOptionResolverParams:** parameters required to resolve auth scheme options. These parameters are allowed to come from both the client config and the operation input structs. - - **HttpAuthSchemes:** a list of auth schemes that can be used to sign HTTP requests. This information + - **AuthSchemes:** a list of auth schemes that can be used to sign HTTP requests. This information comes directly from the service model. - **AuthSchemeProperties:** configuration from the auth scheme for the signer. - **IdentityResolvers:** list of available identity resolvers. - **Implementations** - **IdentityResolver:** resolves an identity for use in authentication. There can be multiple identity resolvers that need to be selected from. - - **HttpRequestSigner:** a signing implementation that signs a HTTP request. - - **AuthOptionResolver:** resolves a list of auth options for a given operation and its inputs. + - **Signer:** a signing implementation that signs a HTTP request. + - **AuthSchemeOptionResolver:** resolves a list of auth scheme options for a given operation and its inputs. As it is undocumented (at time of writing), this document assumes that the code generator creates one service-level runtime plugin, and an operation-level runtime plugin per operation, hence @@ -52,34 +52,34 @@ referred to as the service runtime plugin and operation runtime plugin. The code generator emits code to add identity resolvers and HTTP auth schemes to the config bag in the service runtime plugin. It then emits code to register an interceptor in the operation runtime -plugin that reads the operation input to generate the auth option resolver params (which also get added +plugin that reads the operation input to generate the auth scheme option resolver params (which also get added to the config bag). ### The execution stage At a high-level, the process of resolving an identity and signing a request looks as follows: -1. Retrieve the `AuthOptionResolverParams` from the config bag. The `AuthOptionResolverParams` allow client -config and operation inputs to play a role in which auth option is selected. -2. Retrieve the `AuthOptionResolver` from the config bag, and use it to resolve the auth options available -with the `AuthOptionResolverParams`. The returned auth options are in priority order. +1. Retrieve the `AuthSchemeOptionResolverParams` from the config bag. The `AuthSchemeOptionResolverParams` allow client +config and operation inputs to play a role in which auth scheme option is selected. +2. Retrieve the `AuthSchemeOptionResolver` from the config bag, and use it to resolve the auth scheme options available +with the `AuthSchemeOptionResolverParams`. The returned auth scheme options are in priority order. 3. Retrieve the `IdentityResolvers` list from the config bag. -4. For each auth option: - 1. Attempt to find an HTTP auth scheme for that auth option in the config bag (from the `HttpAuthSchemes` list). +4. For each auth scheme option: + 1. Attempt to find an HTTP auth scheme for that auth scheme option in the config bag (from the `AuthSchemes` list). 2. If an auth scheme is found: 1. Use the auth scheme to extract the correct identity resolver from the `IdentityResolvers` list. - 2. Retrieve the `HttpRequestSigner` implementation from the auth scheme. + 2. Retrieve the `Signer` implementation from the auth scheme. 3. Use the `IdentityResolver` to resolve the identity needed for signing. 4. Sign the request with the identity, and break out of the loop from step #4. -In general, it is assumed that if an HTTP auth scheme exists for an auth option, then an identity resolver -also exists for that auth option. Otherwise, the auth option was configured incorrectly during codegen. +In general, it is assumed that if an HTTP auth scheme exists for an auth scheme option, then an identity resolver +also exists for that auth scheme option. Otherwise, the auth option was configured incorrectly during codegen. How this looks in Rust ---------------------- The client will use trait objects and dynamic dispatch for the `IdentityResolver`, -`HttpRequestSigner`, and `AuthOptionResolver` implementations. Generics could potentially be used, +`Signer`, and `AuthSchemeOptionResolver` implementations. Generics could potentially be used, but the number of generic arguments and trait bounds in the orchestrator would balloon to unmaintainable levels if each configurable implementation in it was made generic. @@ -87,38 +87,37 @@ These traits look like this: ```rust,ignore #[derive(Clone, Debug)] -pub struct HttpAuthOption { +pub struct AuthSchemeId { scheme_id: &'static str, - properties: Arc, } -pub trait AuthOptionResolver: Send + Sync + Debug { - fn resolve_auth_options<'a>( +pub trait AuthSchemeOptionResolver: Send + Sync + Debug { + fn resolve_auth_scheme_options<'a>( &'a self, - params: &AuthOptionResolverParams, - ) -> Result, BoxError>; + params: &AuthSchemeOptionResolverParams, + ) -> Result, BoxError>; } pub trait IdentityResolver: Send + Sync + Debug { - // `identity_properties` come from `HttpAuthOption::properties` - fn resolve_identity(&self, identity_properties: &PropertyBag) -> BoxFallibleFut; + fn resolve_identity(&self, config: &ConfigBag) -> BoxFallibleFut; } -pub trait HttpRequestSigner: Send + Sync + Debug { +pub trait Signer: Send + Sync + Debug { /// Return a signed version of the given request using the given identity. /// /// If the provided identity is incompatible with this signer, an error must be returned. - fn sign_request( + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, - // `signing_properties` come from `HttpAuthOption::properties` - signing_properties: &PropertyBag, + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, + config_bag: &ConfigBag, ) -> Result<(), BoxError>; } ``` -`IdentityResolver` and `HttpRequestSigner` implementations are both given an `Identity`, but +`IdentityResolver` and `Signer` implementations are both given an `Identity`, but will need to understand what the concrete data type underlying that identity is. The `Identity` struct uses a `Arc` to represent the actual identity data so that generics are not needed in the traits: @@ -137,11 +136,13 @@ will use downcasting to access the identity data types they understand. For exam it might look like the following: ```rust,ignore -fn sign_request( +fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, - signing_properties: &PropertyBag + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, + config_bag: &ConfigBag, ) -> Result<(), BoxError> { let aws_credentials = identity.data::() .ok_or_else(|| "The SigV4 signer requires AWS credentials")?; @@ -181,8 +182,8 @@ The `expiration` field is a special case that is allowed onto the `Identity` str cache implementations will always need to be aware of this piece of information, and having it as an `Option` still allows for non-expiring identities. -Ultimately, this design constrains `HttpRequestSigner` implementations to concrete types. There is no world -where an `HttpRequestSigner` can operate across multiple unknown identity data types via trait, and that +Ultimately, this design constrains `Signer` implementations to concrete types. There is no world +where an `Signer` can operate across multiple unknown identity data types via trait, and that should be OK since the signer implementation can always be wrapped with an implementation that is aware of the concrete type provided by the identity resolver, and can do any necessary conversions. diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index ec17790c1c9..64b3c524c44 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -11,6 +11,7 @@ repository = "https://github.com/awslabs/smithy-rs" [features] default = [] +client = [] http-auth = ["dep:zeroize"] test-util = [] diff --git a/rust-runtime/aws-smithy-runtime-api/README.md b/rust-runtime/aws-smithy-runtime-api/README.md index 7eb00c40dc7..de1aa0dd0a2 100644 --- a/rust-runtime/aws-smithy-runtime-api/README.md +++ b/rust-runtime/aws-smithy-runtime-api/README.md @@ -1,8 +1,14 @@ # aws-smithy-runtime-api -**This crate is UNSTABLE! All internal and external interfaces are subject to change without notice.** +APIs needed to configure and customize the Smithy generated code. -Lightweight crate with traits and types necessary to configure runtime logic in the `aws-smithy-runtime` crate. +Most users will not need to use this crate directly as the most frequently used +APIs are re-exported in the generated clients. However, this crate will be useful +for anyone writing a library for others to use with their generated clients. + +If you're needing to depend on this and you're not writing a library for Smithy +generated clients, then please file an issue on [smithy-rs](https://github.com/awslabs/smithy-rs) +as we likely missed re-exporting one of the APIs. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index 106cc5087c3..d67921332fe 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -3,35 +3,24 @@ * SPDX-License-Identifier: Apache-2.0 */ -pub mod runtime_components; - -/// Client orchestrator configuration accessors for the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). -pub mod config_bag_accessors; +pub mod endpoint; /// Smithy identity used by auth and signing. pub mod identity; -/// Smithy interceptors for smithy clients. -/// -/// Interceptors are lifecycle hooks that can read/modify requests and responses. pub mod interceptors; pub mod orchestrator; -/// Smithy code related to retry handling and token bucket. -/// -/// This code defines when and how failed requests should be retried. It also defines the behavior -/// used to limit the rate that requests are sent. pub mod retries; -/// Runtime plugin type definitions. +pub mod runtime_components; + pub mod runtime_plugin; -/// Smithy auth runtime plugins pub mod auth; -/// A type to track the number of requests sent by the orchestrator for a given operation. -pub mod request_attempts; - /// Smithy connectors and related code. pub mod connectors; + +pub mod ser_de; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index 5241f5187cc..acd96739f65 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! APIs for request authentication. + use crate::box_error::BoxError; use crate::client::identity::{Identity, SharedIdentityResolver}; use crate::client::orchestrator::HttpRequest; @@ -14,12 +16,18 @@ use std::borrow::Cow; use std::fmt; use std::sync::Arc; +/// Auth schemes for the HTTP `Authorization` header. #[cfg(feature = "http-auth")] pub mod http; -pub mod option_resolver; +/// Static auth scheme option resolver. +pub mod static_resolver; /// New type around an auth scheme ID. +/// +/// Each auth scheme must have a unique string identifier associated with it, +/// which is used to refer to auth schemes by the auth scheme option resolver, and +/// also used to select an identity resolver to use. #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] pub struct AuthSchemeId { scheme_id: &'static str, @@ -43,71 +51,116 @@ impl From<&'static str> for AuthSchemeId { } } +/// Parameters needed to resolve auth scheme options. +/// +/// Most generated clients will use the [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver), +/// which doesn't require any parameters for resolution (and has its own empty params struct). +/// +/// However, more complex auth scheme resolvers may need modeled parameters in order to resolve +/// the auth scheme options. For those, this params struct holds a type erased box so that any +/// kind of parameters can be contained within, and type casted by the auth scheme option resolver +/// implementation. #[derive(Debug)] -pub struct AuthOptionResolverParams(TypeErasedBox); +pub struct AuthSchemeOptionResolverParams(TypeErasedBox); -impl AuthOptionResolverParams { +impl AuthSchemeOptionResolverParams { + /// Creates a new [`AuthSchemeOptionResolverParams`]. pub fn new(params: T) -> Self { Self(TypedBox::new(params).erase()) } + /// Returns the underlying parameters as the type `T` if they are that type. pub fn get(&self) -> Option<&T> { self.0.downcast_ref() } } -impl Storable for AuthOptionResolverParams { +impl Storable for AuthSchemeOptionResolverParams { type Storer = StoreReplace; } -pub trait AuthOptionResolver: Send + Sync + fmt::Debug { - fn resolve_auth_options( +/// Resolver for auth scheme options. +/// +/// The orchestrator needs to select an auth scheme to sign requests with, and potentially +/// from several different available auth schemes. Smithy models have a number of ways +/// to specify which operations can use which auth schemes under which conditions, as +/// documented in the [Smithy spec](https://smithy.io/2.0/spec/authentication-traits.html). +/// +/// The orchestrator uses the auth scheme option resolver runtime component to resolve +/// an ordered list of options that are available to choose from for a given request. +/// This resolver can be a simple static list, such as with the +/// [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver), +/// or it can be a complex code generated resolver that incorporates parameters from both +/// the model and the resolved endpoint. +pub trait AuthSchemeOptionResolver: Send + Sync + fmt::Debug { + /// Returns a list of available auth scheme options to choose from. + fn resolve_auth_scheme_options( &self, - params: &AuthOptionResolverParams, + params: &AuthSchemeOptionResolverParams, ) -> Result, BoxError>; } +/// A shared auth scheme option resolver. #[derive(Clone, Debug)] -pub struct SharedAuthOptionResolver(Arc); +pub struct SharedAuthSchemeOptionResolver(Arc); -impl SharedAuthOptionResolver { - pub fn new(auth_option_resolver: impl AuthOptionResolver + 'static) -> Self { - Self(Arc::new(auth_option_resolver)) +impl SharedAuthSchemeOptionResolver { + /// Creates a new [`SharedAuthSchemeOptionResolver`]. + pub fn new(auth_scheme_option_resolver: impl AuthSchemeOptionResolver + 'static) -> Self { + Self(Arc::new(auth_scheme_option_resolver)) } } -impl AuthOptionResolver for SharedAuthOptionResolver { - fn resolve_auth_options( +impl AuthSchemeOptionResolver for SharedAuthSchemeOptionResolver { + fn resolve_auth_scheme_options( &self, - params: &AuthOptionResolverParams, + params: &AuthSchemeOptionResolverParams, ) -> Result, BoxError> { - (*self.0).resolve_auth_options(params) + (*self.0).resolve_auth_scheme_options(params) } } -pub trait HttpAuthScheme: Send + Sync + fmt::Debug { +/// An auth scheme. +/// +/// Auth schemes have unique identifiers (the `scheme_id`), +/// and provide an identity resolver and a signer. +pub trait AuthScheme: Send + Sync + fmt::Debug { + /// Returns the unique identifier associated with this auth scheme. + /// + /// This identifier is used to refer to this auth scheme from the + /// [`AuthSchemeOptionResolver`], and is also associated with + /// identity resolvers in the config. fn scheme_id(&self) -> AuthSchemeId; + /// Returns the identity resolver that can resolve an identity for this scheme, if one is available. + /// + /// The [`AuthScheme`] doesn't actually own an identity resolver. Rather, identity resolvers + /// are configured as runtime components. The auth scheme merely chooses a compatible identity + /// resolver from the runtime components via the [`GetIdentityResolver`] trait. The trait is + /// given rather than the full set of runtime components to prevent complex resolution logic + /// involving multiple components from taking place in this function, since that's not the + /// intended use of this design. fn identity_resolver( &self, identity_resolvers: &dyn GetIdentityResolver, ) -> Option; - fn request_signer(&self) -> &dyn HttpRequestSigner; + /// Returns the signing implementation for this auth scheme. + fn signer(&self) -> &dyn Signer; } -/// Container for a shared HTTP auth scheme implementation. +/// Container for a shared auth scheme implementation. #[derive(Clone, Debug)] -pub struct SharedHttpAuthScheme(Arc); +pub struct SharedAuthScheme(Arc); -impl SharedHttpAuthScheme { - /// Creates a new [`SharedHttpAuthScheme`] from the given auth scheme. - pub fn new(auth_scheme: impl HttpAuthScheme + 'static) -> Self { +impl SharedAuthScheme { + /// Creates a new [`SharedAuthScheme`] from the given auth scheme. + pub fn new(auth_scheme: impl AuthScheme + 'static) -> Self { Self(Arc::new(auth_scheme)) } } -impl HttpAuthScheme for SharedHttpAuthScheme { +impl AuthScheme for SharedAuthScheme { fn scheme_id(&self) -> AuthSchemeId { self.0.scheme_id() } @@ -119,16 +172,17 @@ impl HttpAuthScheme for SharedHttpAuthScheme { self.0.identity_resolver(identity_resolvers) } - fn request_signer(&self) -> &dyn HttpRequestSigner { - self.0.request_signer() + fn signer(&self) -> &dyn Signer { + self.0.signer() } } -pub trait HttpRequestSigner: Send + Sync + fmt::Debug { - /// Return a signed version of the given request using the given identity. +/// Signing implementation for an auth scheme. +pub trait Signer: Send + Sync + fmt::Debug { + /// Sign the given request with the given identity, components, and config. /// /// If the provided identity is incompatible with this signer, an error must be returned. - fn sign_request( + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, @@ -140,23 +194,33 @@ pub trait HttpRequestSigner: Send + Sync + fmt::Debug { /// Endpoint configuration for the selected auth scheme. /// +/// The configuration held by this struct originates from the endpoint rule set in the service model. +/// /// This struct gets added to the request state by the auth orchestrator. #[non_exhaustive] #[derive(Clone, Debug)] pub struct AuthSchemeEndpointConfig<'a>(Option<&'a Document>); impl<'a> AuthSchemeEndpointConfig<'a> { - /// Creates a new [`AuthSchemeEndpointConfig`]. - pub fn new(config: Option<&'a Document>) -> Self { - Self(config) - } - - /// Creates an empty AuthSchemeEndpointConfig. + /// Creates an empty [`AuthSchemeEndpointConfig`]. pub fn empty() -> Self { Self(None) } - pub fn config(&self) -> Option<&'a Document> { + /// Returns the endpoint configuration as a [`Document`]. + pub fn as_document(&self) -> Option<&'a Document> { self.0 } } + +impl<'a> From> for AuthSchemeEndpointConfig<'a> { + fn from(value: Option<&'a Document>) -> Self { + Self(value) + } +} + +impl<'a> From<&'a Document> for AuthSchemeEndpointConfig<'a> { + fn from(value: &'a Document) -> Self { + Self(Some(value)) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs index a4583c6e0af..bb6ee4cc494 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs @@ -5,7 +5,14 @@ use crate::client::auth::AuthSchemeId; +/// Auth scheme ID for HTTP API key based authentication. pub const HTTP_API_KEY_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-api-key-auth"); + +/// Auth scheme ID for HTTP Basic Auth. pub const HTTP_BASIC_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-basic-auth"); + +/// Auth scheme ID for HTTP Bearer Auth. pub const HTTP_BEARER_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-bearer-auth"); + +/// Auth scheme ID for HTTP Digest Auth. pub const HTTP_DIGEST_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-digest-auth"); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs deleted file mode 100644 index bf973bf6a44..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::box_error::BoxError; -use crate::client::auth::{AuthOptionResolver, AuthOptionResolverParams, AuthSchemeId}; -use std::borrow::Cow; - -/// New-type around a `Vec` that implements `AuthOptionResolver`. -/// -/// This is useful for clients that don't require `AuthOptionResolverParams` to resolve auth options. -#[derive(Debug)] -pub struct StaticAuthOptionResolver { - auth_options: Vec, -} - -impl StaticAuthOptionResolver { - /// Creates a new instance of `StaticAuthOptionResolver`. - pub fn new(auth_options: Vec) -> Self { - Self { auth_options } - } -} - -impl AuthOptionResolver for StaticAuthOptionResolver { - fn resolve_auth_options( - &self, - _params: &AuthOptionResolverParams, - ) -> Result, BoxError> { - Ok(Cow::Borrowed(&self.auth_options)) - } -} - -/// Empty params to be used with [`StaticAuthOptionResolver`]. -#[derive(Debug)] -pub struct StaticAuthOptionResolverParams; - -impl StaticAuthOptionResolverParams { - /// Creates a new `StaticAuthOptionResolverParams`. - pub fn new() -> Self { - Self - } -} - -impl From for AuthOptionResolverParams { - fn from(params: StaticAuthOptionResolverParams) -> Self { - AuthOptionResolverParams::new(params) - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs new file mode 100644 index 00000000000..23781e25457 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs @@ -0,0 +1,49 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::box_error::BoxError; +use crate::client::auth::{AuthSchemeId, AuthSchemeOptionResolver, AuthSchemeOptionResolverParams}; +use std::borrow::Cow; + +/// New-type around a `Vec` that implements `AuthSchemeOptionResolver`. +#[derive(Debug)] +pub struct StaticAuthSchemeOptionResolver { + auth_scheme_options: Vec, +} + +impl StaticAuthSchemeOptionResolver { + /// Creates a new instance of `StaticAuthSchemeOptionResolver`. + pub fn new(auth_scheme_options: Vec) -> Self { + Self { + auth_scheme_options, + } + } +} + +impl AuthSchemeOptionResolver for StaticAuthSchemeOptionResolver { + fn resolve_auth_scheme_options( + &self, + _params: &AuthSchemeOptionResolverParams, + ) -> Result, BoxError> { + Ok(Cow::Borrowed(&self.auth_scheme_options)) + } +} + +/// Empty params to be used with [`StaticAuthSchemeOptionResolver`]. +#[derive(Debug)] +pub struct StaticAuthSchemeOptionResolverParams; + +impl StaticAuthSchemeOptionResolverParams { + /// Creates a new `StaticAuthSchemeOptionResolverParams`. + pub fn new() -> Self { + Self + } +} + +impl From for AuthSchemeOptionResolverParams { + fn from(params: StaticAuthSchemeOptionResolverParams) -> Self { + AuthSchemeOptionResolverParams::new(params) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs deleted file mode 100644 index 5f338cd93f9..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::client::auth::AuthOptionResolverParams; -use crate::client::orchestrator::{ - DynResponseDeserializer, EndpointResolverParams, LoadedRequestBody, ResponseDeserializer, - SharedRequestSerializer, NOT_NEEDED, -}; -use aws_smithy_types::config_bag::{CloneableLayer, ConfigBag, FrozenLayer, Layer}; - -// Place traits in a private module so that they can be used in the public API without being a part of the public API. -mod internal { - use aws_smithy_types::config_bag::{ - CloneableLayer, ConfigBag, FrozenLayer, Layer, Storable, Store, StoreAppend, StoreReplace, - }; - use std::fmt::Debug; - - pub trait Settable { - fn unset(&mut self); - - fn store_put(&mut self, value: T) - where - T: Storable>; - - fn store_append(&mut self, item: T) - where - T: Storable>; - } - - impl Settable for Layer { - fn unset(&mut self) { - Layer::unset::(self); - } - - fn store_put(&mut self, value: T) - where - T: Storable>, - { - Layer::store_put(self, value); - } - - fn store_append(&mut self, item: T) - where - T: Storable>, - { - Layer::store_append(self, item); - } - } - - pub trait Gettable { - fn load(&self) -> ::ReturnedType<'_>; - } - - impl Gettable for ConfigBag { - fn load(&self) -> ::ReturnedType<'_> { - ConfigBag::load::(self) - } - } - - impl Gettable for CloneableLayer { - fn load(&self) -> ::ReturnedType<'_> { - Layer::load::(self) - } - } - - impl Gettable for Layer { - fn load(&self) -> ::ReturnedType<'_> { - Layer::load::(self) - } - } - - impl Gettable for FrozenLayer { - fn load(&self) -> ::ReturnedType<'_> { - Layer::load::(self) - } - } -} - -use internal::{Gettable, Settable}; - -pub trait ConfigBagAccessors { - fn auth_option_resolver_params(&self) -> &AuthOptionResolverParams - where - Self: Gettable, - { - self.load::() - .expect("auth option resolver params must be set") - } - fn set_auth_option_resolver_params( - &mut self, - auth_option_resolver_params: AuthOptionResolverParams, - ) where - Self: Settable, - { - self.store_put::(auth_option_resolver_params); - } - - fn endpoint_resolver_params(&self) -> &EndpointResolverParams - where - Self: Gettable, - { - self.load::() - .expect("endpoint resolver params must be set") - } - - fn set_endpoint_resolver_params(&mut self, endpoint_resolver_params: EndpointResolverParams) - where - Self: Settable, - { - self.store_put::(endpoint_resolver_params); - } - - fn request_serializer(&self) -> SharedRequestSerializer - where - Self: Gettable, - { - self.load::() - .expect("missing request serializer") - .clone() - } - fn set_request_serializer(&mut self, request_serializer: SharedRequestSerializer) - where - Self: Settable, - { - self.store_put::(request_serializer); - } - - fn response_deserializer(&self) -> &dyn ResponseDeserializer - where - Self: Gettable, - { - self.load::() - .expect("missing response deserializer") - } - fn set_response_deserializer(&mut self, response_deserializer: DynResponseDeserializer) - where - Self: Settable, - { - self.store_put::(response_deserializer); - } - - fn loaded_request_body(&self) -> &LoadedRequestBody - where - Self: Gettable, - { - self.load::().unwrap_or(&NOT_NEEDED) - } - fn set_loaded_request_body(&mut self, loaded_request_body: LoadedRequestBody) - where - Self: Settable, - { - self.store_put::(loaded_request_body); - } -} - -impl ConfigBagAccessors for ConfigBag {} -impl ConfigBagAccessors for FrozenLayer {} -impl ConfigBagAccessors for CloneableLayer {} -impl ConfigBagAccessors for Layer {} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs index a7d10a2daeb..79629b9af10 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs @@ -7,20 +7,30 @@ use crate::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; use std::fmt; use std::sync::Arc; -pub trait Connector: Send + Sync + fmt::Debug { +/// Trait with a `call` function that asynchronously converts a request into a response. +/// +/// Ordinarily, a connector would use an underlying HTTP library such as [hyper](https://crates.io/crates/hyper), +/// and any associated HTTPS implementation alongside it to service requests. +/// +/// However, it can also be useful to create fake connectors implementing this trait +/// for testing. +pub trait HttpConnector: Send + Sync + fmt::Debug { + /// Asynchronously converts a request into a response. fn call(&self, request: HttpRequest) -> BoxFuture; } +/// A shared [`HttpConnector`] implementation. #[derive(Clone, Debug)] -pub struct SharedConnector(Arc); +pub struct SharedHttpConnector(Arc); -impl SharedConnector { - pub fn new(connection: impl Connector + 'static) -> Self { +impl SharedHttpConnector { + /// Returns a new [`SharedHttpConnector`]. + pub fn new(connection: impl HttpConnector + 'static) -> Self { Self(Arc::new(connection)) } } -impl Connector for SharedConnector { +impl HttpConnector for SharedHttpConnector { fn call(&self, request: HttpRequest) -> BoxFuture { (*self.0).call(request) } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs new file mode 100644 index 00000000000..654d7affb56 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! APIs needed to configure endpoint resolution for clients. + +use crate::client::orchestrator::Future; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::endpoint::Endpoint; +use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; +use std::fmt; +use std::sync::Arc; + +/// Parameters originating from the Smithy endpoint ruleset required for endpoint resolution. +/// +/// The actual endpoint parameters are code generated from the Smithy model, and thus, +/// are not known to the runtime crates. Hence, this struct is really a new-type around +/// a [`TypeErasedBox`] that holds the actual concrete parameters in it. +#[derive(Debug)] +pub struct EndpointResolverParams(TypeErasedBox); + +impl EndpointResolverParams { + /// Creates a new [`EndpointResolverParams`] from a concrete parameters instance. + pub fn new(params: T) -> Self { + Self(TypedBox::new(params).erase()) + } + + /// Attempts to downcast the underlying concrete parameters to `T` and return it as a reference. + pub fn get(&self) -> Option<&T> { + self.0.downcast_ref() + } +} + +impl Storable for EndpointResolverParams { + type Storer = StoreReplace; +} + +/// Configurable endpoint resolver implementation. +pub trait EndpointResolver: Send + Sync + fmt::Debug { + /// Asynchronously resolves an endpoint to use from the given endpoint parameters. + fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future; +} + +/// Shared endpoint resolver. +/// +/// This is a simple shared ownership wrapper type for the [`EndpointResolver`] trait. +#[derive(Clone, Debug)] +pub struct SharedEndpointResolver(Arc); + +impl SharedEndpointResolver { + /// Creates a new [`SharedEndpointResolver`]. + pub fn new(endpoint_resolver: impl EndpointResolver + 'static) -> Self { + Self(Arc::new(endpoint_resolver)) + } +} + +impl EndpointResolver for SharedEndpointResolver { + fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { + self.0.resolve_endpoint(params) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index 60a110fbb97..eec7c4e32ce 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -15,8 +15,19 @@ use std::time::SystemTime; #[cfg(feature = "http-auth")] pub mod http; -/// Resolves an identity for a request. +/// Resolver for identities. +/// +/// Every [`AuthScheme`](crate::client::auth::AuthScheme) has one or more compatible +/// identity resolvers, which are selected from runtime components by the auth scheme +/// implementation itself. +/// +/// The identity resolver must return a [`Future`] with the resolved identity, or an error +/// if resolution failed. There is no optionality for identity resolvers. The identity either +/// resolves successfully, or it fails. The orchestrator will choose exactly one auth scheme +/// to use, and thus, its chosen identity resolver is the only identity resolver that runs. +/// There is no fallback to other auth schemes in the absense of an identity. pub trait IdentityResolver: Send + Sync + Debug { + /// Asynchronously resolves an identity for a request using the given config. fn resolve_identity(&self, config_bag: &ConfigBag) -> Future; } @@ -67,6 +78,17 @@ impl ConfiguredIdentityResolver { } } +/// An identity that can be used for authentication. +/// +/// The [`Identity`] is a container for any arbitrary identity data that may be used +/// by a [`Signer`](crate::client::auth::Signer) implementation. Under the hood, it +/// has an `Arc`, and it is the responsibility of the signer to downcast +/// to the appropriate data type using the `data()` function. +/// +/// The `Identity` also holds an optional expiration time, which may duplicate +/// an expiration time on the identity data. This is because an `Arc` +/// can't be downcast to any arbitrary trait, and expiring identities are +/// common enough to be built-in. #[derive(Clone)] pub struct Identity { data: Arc, @@ -76,6 +98,7 @@ pub struct Identity { } impl Identity { + /// Creates a new identity with the given data and expiration time. pub fn new(data: T, expiration: Option) -> Self where T: Any + Debug + Send + Sync, @@ -87,10 +110,12 @@ impl Identity { } } + /// Returns the raw identity data. pub fn data(&self) -> Option<&T> { self.data.downcast_ref() } + /// Returns the expiration time for this identity, if any. pub fn expiration(&self) -> Option<&SystemTime> { self.expiration.as_ref() } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 5bf1ade4b10..a755a34e448 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -3,6 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Interceptors for clients. +//! +//! Interceptors are operation lifecycle hooks that can read/modify requests and responses. + use crate::box_error::BoxError; use crate::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index a33b62db633..b97915dcbb9 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -36,6 +36,7 @@ use std::fmt::Debug; use std::{fmt, mem}; use tracing::{debug, error, trace}; +// TODO(enableNewSmithyRuntimeLaunch): New-type `Input`/`Output`/`Error` pub type Input = TypeErasedBox; pub type Output = TypeErasedBox; pub type Error = TypeErasedError; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs index 7a79c134279..64ebdbe08a6 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs @@ -193,18 +193,22 @@ impl<'a, I, O, E: Debug> From<&'a InterceptorContext> } impl<'a, I, O, E: Debug> FinalizerInterceptorContextRef<'a, I, O, E> { + /// Returns the operation input. pub fn input(&self) -> Option<&I> { self.inner.input.as_ref() } + /// Returns the serialized request. pub fn request(&self) -> Option<&Request> { self.inner.request.as_ref() } + /// Returns the raw response. pub fn response(&self) -> Option<&Response> { self.inner.response.as_ref() } + /// Returns the deserialized operation output or error. pub fn output_or_error(&self) -> Option>> { self.inner.output_or_error.as_ref().map(|o| o.as_ref()) } @@ -223,34 +227,42 @@ impl<'a, I, O, E: Debug> From<&'a mut InterceptorContext> } impl<'a, I, O, E: Debug> FinalizerInterceptorContextMut<'a, I, O, E> { + /// Returns the operation input. pub fn input(&self) -> Option<&I> { self.inner.input.as_ref() } + /// Returns the serialized request. pub fn request(&self) -> Option<&Request> { self.inner.request.as_ref() } + /// Returns the raw response. pub fn response(&self) -> Option<&Response> { self.inner.response.as_ref() } + /// Returns the deserialized operation output or error. pub fn output_or_error(&self) -> Option>> { self.inner.output_or_error.as_ref().map(|o| o.as_ref()) } + /// Mutably returns the operation input. pub fn input_mut(&mut self) -> Option<&mut I> { self.inner.input.as_mut() } + /// Mutably returns the serialized request. pub fn request_mut(&mut self) -> Option<&mut Request> { self.inner.request.as_mut() } + /// Mutably returns the raw response. pub fn response_mut(&mut self) -> Option<&mut Response> { self.inner.response.as_mut() } + /// Mutably returns the deserialized operation output or error. pub fn output_or_error_mut(&mut self) -> Option<&mut Result>> { self.inner.output_or_error.as_mut() } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs index f01dace42d9..11ffbd60c9e 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs @@ -181,6 +181,7 @@ pub struct ContextAttachedError { } impl ContextAttachedError { + /// Creates a new `ContextAttachedError` with the given `context` and `source`. pub fn new(context: impl Into, source: impl Into) -> Self { Self { context: context.into(), diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index ed68be978d6..cadeccf0d0c 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -3,154 +3,211 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Client request orchestration. +//! +//! The orchestrator handles the full request/response lifecycle including: +//! - Request serialization +//! - Endpoint resolution +//! - Identity resolution +//! - Signing +//! - Request transmission with retry and timeouts +//! - Response deserialization +//! +//! There are several hook points in the orchestration where [interceptors](crate::client::interceptors) +//! can read and modify the input, request, response, or output/error. + use crate::box_error::BoxError; -use crate::client::interceptors::context::{Error, Input, Output}; +use crate::client::interceptors::context::phase::Phase; +use crate::client::interceptors::InterceptorError; use aws_smithy_async::future::now_or_later::NowOrLater; use aws_smithy_http::body::SdkBody; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::endpoint::Endpoint; -use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; +use aws_smithy_http::result::{ConnectorError, SdkError}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::type_erasure::TypeErasedError; use bytes::Bytes; -use std::fmt; +use std::fmt::Debug; use std::future::Future as StdFuture; use std::pin::Pin; -use std::sync::Arc; - -/// Errors that can occur while running the orchestrator. -mod error; - -pub use error::OrchestratorError; +/// Type alias for the HTTP request type that the orchestrator uses. pub type HttpRequest = http::Request; + +/// Type alias for the HTTP response type that the orchestrator uses. pub type HttpResponse = http::Response; + +/// Type alias for boxed futures that are returned from several traits since async trait functions are not stable yet (as of 2023-07-21). +/// +/// See [the Rust blog](https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html) for +/// more information on async functions in traits. pub type BoxFuture = Pin> + Send>>; -pub type Future = NowOrLater, BoxFuture>; -pub trait RequestSerializer: Send + Sync + fmt::Debug { - fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result; -} +/// Type alias for futures that are returned from several traits since async trait functions are not stable yet (as of 2023-07-21). +/// +/// See [the Rust blog](https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html) for +/// more information on async functions in traits. +pub type Future = NowOrLater, BoxFuture>; +/// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. +/// +/// This enum gets placed into the `ConfigBag` to change the orchestrator behavior. +/// Immediately after serialization (before the `read_after_serialization` interceptor hook), +/// if it was set to `Requested` in the config bag, it will be replaced back into the config bag as +/// `Loaded` with the request body contents for use in later interceptors. +/// +/// This all happens before the attempt loop, so the loaded request body will remain available +/// for interceptors that run in any subsequent retry attempts. +#[non_exhaustive] #[derive(Clone, Debug)] -pub struct SharedRequestSerializer(Arc); - -impl SharedRequestSerializer { - pub fn new(serializer: impl RequestSerializer + 'static) -> Self { - Self(Arc::new(serializer)) - } -} - -impl RequestSerializer for SharedRequestSerializer { - fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result { - self.0.serialize_input(input, cfg) - } +pub enum LoadedRequestBody { + /// Don't attempt to load the request body into memory. + NotNeeded, + /// Attempt to load the request body into memory. + Requested, + /// The request body is already loaded. + Loaded(Bytes), } -impl Storable for SharedRequestSerializer { +impl Storable for LoadedRequestBody { type Storer = StoreReplace; } -pub trait ResponseDeserializer: Send + Sync + fmt::Debug { - fn deserialize_streaming( - &self, - response: &mut HttpResponse, - ) -> Option>> { - let _ = response; - None - } - - fn deserialize_nonstreaming( - &self, - response: &HttpResponse, - ) -> Result>; -} - +// TODO(enableNewSmithyRuntimeLaunch): Make OrchestratorError adhere to the errors RFC +/// Errors that can occur while running the orchestrator. #[derive(Debug)] -pub struct DynResponseDeserializer(Box); - -impl DynResponseDeserializer { - pub fn new(serializer: impl ResponseDeserializer + 'static) -> Self { - Self(Box::new(serializer)) - } +#[non_exhaustive] +pub enum OrchestratorError { + /// An error occurred within an interceptor. + Interceptor { err: InterceptorError }, + /// An error returned by a service. + Operation { err: E }, + /// An error that occurs when a request times out. + Timeout { err: BoxError }, + /// An error that occurs when request dispatch fails. + Connector { err: ConnectorError }, + /// An error that occurs when a response can't be deserialized. + Response { err: BoxError }, + /// A general orchestrator error. + Other { err: BoxError }, } -impl ResponseDeserializer for DynResponseDeserializer { - fn deserialize_nonstreaming( - &self, - response: &HttpResponse, - ) -> Result> { - self.0.deserialize_nonstreaming(response) +impl OrchestratorError { + /// Create a new `OrchestratorError` from a [`BoxError`]. + pub fn other(err: impl Into>) -> Self { + let err = err.into(); + Self::Other { err } } - fn deserialize_streaming( - &self, - response: &mut HttpResponse, - ) -> Option>> { - self.0.deserialize_streaming(response) + /// Create a new `OrchestratorError` from an error received from a service. + pub fn operation(err: E) -> Self { + Self::Operation { err } } -} -impl Storable for DynResponseDeserializer { - type Storer = StoreReplace; -} + /// Create a new `OrchestratorError::Interceptor` from an [`InterceptorError`]. + pub fn interceptor(err: InterceptorError) -> Self { + Self::Interceptor { err } + } -#[derive(Debug)] -pub struct EndpointResolverParams(TypeErasedBox); + /// Create a new `OrchestratorError::Timeout` from a [`BoxError`]. + pub fn timeout(err: BoxError) -> Self { + Self::Timeout { err } + } -impl EndpointResolverParams { - pub fn new(params: T) -> Self { - Self(TypedBox::new(params).erase()) + /// Create a new `OrchestratorError::Response` from a [`BoxError`]. + pub fn response(err: BoxError) -> Self { + Self::Response { err } } - pub fn get(&self) -> Option<&T> { - self.0.downcast_ref() + /// Create a new `OrchestratorError::Connector` from a [`ConnectorError`]. + pub fn connector(err: ConnectorError) -> Self { + Self::Connector { err } } -} -impl Storable for EndpointResolverParams { - type Storer = StoreReplace; -} + /// Convert the `OrchestratorError` into `Some` operation specific error if it is one. Otherwise, + /// return `None`. + pub fn as_operation_error(&self) -> Option<&E> { + match self { + Self::Operation { err } => Some(err), + _ => None, + } + } -pub trait EndpointResolver: Send + Sync + fmt::Debug { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future; + /// Convert the `OrchestratorError` into an [`SdkError`]. + pub(crate) fn into_sdk_error( + self, + phase: &Phase, + response: Option, + ) -> SdkError { + match self { + Self::Interceptor { err } => { + use Phase::*; + match phase { + BeforeSerialization | Serialization => SdkError::construction_failure(err), + BeforeTransmit | Transmit => match response { + Some(response) => SdkError::response_error(err, response), + None => SdkError::dispatch_failure(ConnectorError::other(err.into(), None)), + }, + BeforeDeserialization | Deserialization | AfterDeserialization => { + SdkError::response_error(err, response.expect("phase has a response")) + } + } + } + Self::Operation { err } => { + debug_assert!(phase.is_after_deserialization(), "operation errors are a result of successfully receiving and parsing a response from the server. Therefore, we must be in the 'After Deserialization' phase."); + SdkError::service_error(err, response.expect("phase has a response")) + } + Self::Connector { err } => SdkError::dispatch_failure(err), + Self::Timeout { err } => SdkError::timeout_error(err), + Self::Response { err } => SdkError::response_error(err, response.unwrap()), + Self::Other { err } => { + use Phase::*; + match phase { + BeforeSerialization | Serialization => SdkError::construction_failure(err), + BeforeTransmit | Transmit => convert_dispatch_error(err, response), + BeforeDeserialization | Deserialization | AfterDeserialization => { + SdkError::response_error(err, response.expect("phase has a response")) + } + } + } + } + } } -#[derive(Clone, Debug)] -pub struct SharedEndpointResolver(Arc); - -impl SharedEndpointResolver { - pub fn new(endpoint_resolver: impl EndpointResolver + 'static) -> Self { - Self(Arc::new(endpoint_resolver)) +fn convert_dispatch_error( + err: BoxError, + response: Option, +) -> SdkError { + let err = match err.downcast::() { + Ok(connector_error) => { + return SdkError::dispatch_failure(*connector_error); + } + Err(e) => e, + }; + match response { + Some(response) => SdkError::response_error(err, response), + None => SdkError::dispatch_failure(ConnectorError::other(err, None)), } } -impl EndpointResolver for SharedEndpointResolver { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { - self.0.resolve_endpoint(params) +impl From for OrchestratorError +where + E: Debug + std::error::Error + 'static, +{ + fn from(err: InterceptorError) -> Self { + Self::interceptor(err) } } -/// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. -/// -/// This enum gets placed into the `ConfigBag` to change the orchestrator behavior. -/// Immediately after serialization (before the `read_after_serialization` interceptor hook), -/// if it was set to `Requested` in the config bag, it will be replaced back into the config bag as -/// `Loaded` with the request body contents for use in later interceptors. -/// -/// This all happens before the attempt loop, so the loaded request body will remain available -/// for interceptors that run in any subsequent retry attempts. -#[non_exhaustive] -#[derive(Clone, Debug)] -pub enum LoadedRequestBody { - /// Don't attempt to load the request body into memory. - NotNeeded, - /// Attempt to load the request body into memory. - Requested, - /// The request body is already loaded. - Loaded(Bytes), +impl From for OrchestratorError { + fn from(err: TypeErasedError) -> Self { + Self::operation(err) + } } -impl Storable for LoadedRequestBody { - type Storer = StoreReplace; +impl From for OrchestratorError +where + E: Debug + std::error::Error + 'static, +{ + fn from(err: aws_smithy_http::byte_stream::error::Error) -> Self { + Self::other(err) + } } - -pub(crate) const NOT_NEEDED: LoadedRequestBody = LoadedRequestBody::NotNeeded; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs deleted file mode 100644 index fa2aa7361ac..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use super::BoxError; -use crate::client::interceptors::context::phase::Phase; -use crate::client::interceptors::InterceptorError; -use crate::client::orchestrator::HttpResponse; -use aws_smithy_http::result::{ConnectorError, SdkError}; -use aws_smithy_types::type_erasure::TypeErasedError; -use std::fmt::Debug; - -#[derive(Debug)] -#[non_exhaustive] -pub enum OrchestratorError { - /// An error occurred within an interceptor. - Interceptor { err: InterceptorError }, - /// An error returned by a service. - Operation { err: E }, - /// An error that occurs when a request times out. - Timeout { err: BoxError }, - /// An error that occurs when request dispatch fails. - Connector { err: ConnectorError }, - /// An error that occurs when a response can't be deserialized. - Response { err: BoxError }, - /// A general orchestrator error. - Other { err: BoxError }, -} - -impl OrchestratorError { - /// Create a new `OrchestratorError` from a [`BoxError`]. - pub fn other(err: impl Into>) -> Self { - let err = err.into(); - Self::Other { err } - } - - /// Create a new `OrchestratorError` from an error received from a service. - pub fn operation(err: E) -> Self { - Self::Operation { err } - } - - /// Create a new `OrchestratorError::Interceptor` from an [`InterceptorError`]. - pub fn interceptor(err: InterceptorError) -> Self { - Self::Interceptor { err } - } - - /// Create a new `OrchestratorError::Timeout` from a [`BoxError`]. - pub fn timeout(err: BoxError) -> Self { - Self::Timeout { err } - } - - /// Create a new `OrchestratorError::Response` from a [`BoxError`]. - pub fn response(err: BoxError) -> Self { - Self::Response { err } - } - - /// Create a new `OrchestratorError::Connector` from a [`ConnectorError`]. - pub fn connector(err: ConnectorError) -> Self { - Self::Connector { err } - } - - /// Convert the `OrchestratorError` into `Some` operation specific error if it is one. Otherwise, - /// return `None`. - pub fn as_operation_error(&self) -> Option<&E> { - match self { - Self::Operation { err } => Some(err), - _ => None, - } - } - - /// Convert the `OrchestratorError` into an [`SdkError`]. - pub(crate) fn into_sdk_error( - self, - phase: &Phase, - response: Option, - ) -> SdkError { - match self { - Self::Interceptor { err } => { - use Phase::*; - match phase { - BeforeSerialization | Serialization => SdkError::construction_failure(err), - BeforeTransmit | Transmit => match response { - Some(response) => SdkError::response_error(err, response), - None => SdkError::dispatch_failure(ConnectorError::other(err.into(), None)), - }, - BeforeDeserialization | Deserialization | AfterDeserialization => { - SdkError::response_error(err, response.expect("phase has a response")) - } - } - } - Self::Operation { err } => { - debug_assert!(phase.is_after_deserialization(), "operation errors are a result of successfully receiving and parsing a response from the server. Therefore, we must be in the 'After Deserialization' phase."); - SdkError::service_error(err, response.expect("phase has a response")) - } - Self::Connector { err } => SdkError::dispatch_failure(err), - Self::Timeout { err } => SdkError::timeout_error(err), - Self::Response { err } => SdkError::response_error(err, response.unwrap()), - Self::Other { err } => { - use Phase::*; - match phase { - BeforeSerialization | Serialization => SdkError::construction_failure(err), - BeforeTransmit | Transmit => convert_dispatch_error(err, response), - BeforeDeserialization | Deserialization | AfterDeserialization => { - SdkError::response_error(err, response.expect("phase has a response")) - } - } - } - } - } -} - -fn convert_dispatch_error( - err: BoxError, - response: Option, -) -> SdkError { - let err = match err.downcast::() { - Ok(connector_error) => { - return SdkError::dispatch_failure(*connector_error); - } - Err(e) => e, - }; - match response { - Some(response) => SdkError::response_error(err, response), - None => SdkError::dispatch_failure(ConnectorError::other(err, None)), - } -} - -impl From for OrchestratorError -where - E: Debug + std::error::Error + 'static, -{ - fn from(err: InterceptorError) -> Self { - Self::interceptor(err) - } -} - -impl From for OrchestratorError { - fn from(err: TypeErasedError) -> Self { - Self::operation(err) - } -} - -impl From for OrchestratorError -where - E: Debug + std::error::Error + 'static, -{ - fn from(err: aws_smithy_http::byte_stream::error::Error) -> Self { - Self::other(err) - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs b/rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs deleted file mode 100644 index 440019c6603..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_types::config_bag::{Storable, StoreReplace}; - -#[derive(Debug, Clone, Copy)] -pub struct RequestAttempts { - attempts: u32, -} - -impl RequestAttempts { - #[cfg(any(feature = "test-util", test))] - pub fn new(attempts: u32) -> Self { - Self { attempts } - } - - pub fn attempts(&self) -> u32 { - self.attempts - } -} - -impl From for RequestAttempts { - fn from(attempts: u32) -> Self { - Self { attempts } - } -} - -impl Storable for RequestAttempts { - type Storer = StoreReplace; -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs index 37aa72d9ce3..0703e87d873 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs @@ -3,8 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Retry handling and token bucket. +//! +//! This code defines when and how failed requests should be retried. It also defines the behavior +//! used to limit the rate that requests are sent. + use crate::client::interceptors::context::InterceptorContext; -use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt::Debug; use std::time::Duration; use tracing::trace; @@ -14,13 +19,17 @@ pub use aws_smithy_types::retry::ErrorKind; #[derive(Debug, Clone, PartialEq, Eq)] /// An answer to the question "should I make a request attempt?" pub enum ShouldAttempt { + /// Yes, an attempt should be made Yes, + /// No, no attempt should be made No, + /// Yes, an attempt should be made, but only after the given amount of time has passed YesAfterDelay(Duration), } #[cfg(feature = "test-util")] impl ShouldAttempt { + /// Returns the delay duration if this is a `YesAfterDelay` variant. pub fn expect_delay(self) -> Duration { match self { ShouldAttempt::YesAfterDelay(delay) => delay, @@ -29,13 +38,26 @@ impl ShouldAttempt { } } +/// Decider for whether or not to attempt a request, and when. +/// +/// The orchestrator consults the retry strategy every time before making a request. +/// This includes the initial request, and any retry attempts thereafter. The +/// orchestrator will retry indefinitely (until success) if the retry strategy +/// always returns `ShouldAttempt::Yes` from `should_attempt_retry`. pub trait RetryStrategy: Send + Sync + Debug { + /// Decides if the initial attempt should be made. fn should_attempt_initial_request( &self, runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result; + /// Decides if a retry should be done. + /// + /// The previous attempt's output or error are provided in the + /// [`InterceptorContext`] when this is called. + /// + /// `ShouldAttempt::YesAfterDelay` can be used to add a backoff time. fn should_attempt_retry( &self, context: &InterceptorContext, @@ -44,10 +66,12 @@ pub trait RetryStrategy: Send + Sync + Debug { ) -> Result; } +/// A shared retry strategy. #[derive(Clone, Debug)] pub struct SharedRetryStrategy(Arc); impl SharedRetryStrategy { + /// Creates a new [`SharedRetryStrategy`] from a retry strategy. pub fn new(retry_strategy: impl RetryStrategy + 'static) -> Self { Self(Arc::new(retry_strategy)) } @@ -74,10 +98,13 @@ impl RetryStrategy for SharedRetryStrategy { } } +/// Classification result from [`ClassifyRetry`]. #[non_exhaustive] #[derive(Clone, Eq, PartialEq, Debug)] pub enum RetryReason { + /// There was an unexpected error, and this is the kind of error so that it can be properly retried. Error(ErrorKind), + /// The server explicitly told us to back off by this amount of time. Explicit(Duration), } @@ -91,12 +118,14 @@ pub trait ClassifyRetry: Send + Sync + Debug { fn name(&self) -> &'static str; } +/// Classifies an error into a [`RetryReason`]. #[derive(Clone, Debug)] pub struct RetryClassifiers { inner: Vec>, } impl RetryClassifiers { + /// Creates a new [`RetryClassifiers`]. pub fn new() -> Self { Self { // It's always expected that at least one classifier will be defined, @@ -105,6 +134,7 @@ impl RetryClassifiers { } } + /// Adds a classifier to this collection. pub fn with_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { self.inner.push(Arc::new(retry_classifier)); self @@ -138,6 +168,43 @@ impl ClassifyRetry for RetryClassifiers { } } +/// A type to track the number of requests sent by the orchestrator for a given operation. +/// +/// `RequestAttempts` is added to the `ConfigBag` by the orchestrator, +/// and holds the current attempt number. +#[derive(Debug, Clone, Copy)] +pub struct RequestAttempts { + attempts: u32, +} + +impl RequestAttempts { + /// Creates a new [`RequestAttempts`] with the given number of attempts. + pub fn new(attempts: u32) -> Self { + Self { attempts } + } + + /// Returns the number of attempts. + pub fn attempts(&self) -> u32 { + self.attempts + } +} + +impl From for RequestAttempts { + fn from(attempts: u32) -> Self { + Self::new(attempts) + } +} + +impl From for u32 { + fn from(value: RequestAttempts) -> Self { + value.attempts() + } +} + +impl Storable for RequestAttempts { + type Storer = StoreReplace; +} + #[cfg(feature = "test-util")] mod test_util { use super::{ClassifyRetry, ErrorKind, RetryReason}; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index a00fe57671e..520c164e749 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -3,13 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Runtime components used to make a request and handle a response. +//! +//! Runtime components are trait implementations that are _always_ used by the orchestrator. +//! There are other trait implementations that can be configured for a client, but if they +//! aren't directly and always used by the orchestrator, then they are placed in the +//! [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) instead of in +//! [`RuntimeComponents`](RuntimeComponents). + use crate::client::auth::{ - AuthSchemeId, HttpAuthScheme, SharedAuthOptionResolver, SharedHttpAuthScheme, + AuthScheme, AuthSchemeId, SharedAuthScheme, SharedAuthSchemeOptionResolver, }; -use crate::client::connectors::SharedConnector; +use crate::client::connectors::SharedHttpConnector; +use crate::client::endpoint::SharedEndpointResolver; use crate::client::identity::{ConfiguredIdentityResolver, SharedIdentityResolver}; use crate::client::interceptors::SharedInterceptor; -use crate::client::orchestrator::SharedEndpointResolver; use crate::client::retries::{RetryClassifiers, SharedRetryStrategy}; use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_async::time::SharedTimeSource; @@ -134,6 +142,7 @@ macro_rules! declare_runtime_components { $($field_name: runtime_component_field_type!($outer_type $inner_type $($option)?),)+ } + /// Builder for [`RuntimeComponents`]. #[derive(Clone, Debug)] pub struct $builder_name { builder_name: &'static str, @@ -171,16 +180,16 @@ macro_rules! declare_runtime_components { declare_runtime_components! { fields for RuntimeComponents and RuntimeComponentsBuilder { #[required] - auth_option_resolver: Option, + auth_scheme_option_resolver: Option, // A connector is not required since a client could technically only be used for presigning - connector: Option, + http_connector: Option, #[required] endpoint_resolver: Option, #[atLeastOneRequired] - http_auth_schemes: Vec, + auth_schemes: Vec, #[atLeastOneRequired] identity_resolvers: Vec, @@ -204,14 +213,14 @@ impl RuntimeComponents { RuntimeComponentsBuilder::new(name) } - /// Returns the auth option resolver. - pub fn auth_option_resolver(&self) -> SharedAuthOptionResolver { - self.auth_option_resolver.value.clone() + /// Returns the auth scheme option resolver. + pub fn auth_scheme_option_resolver(&self) -> SharedAuthSchemeOptionResolver { + self.auth_scheme_option_resolver.value.clone() } /// Returns the connector. - pub fn connector(&self) -> Option { - self.connector.as_ref().map(|s| s.value.clone()) + pub fn http_connector(&self) -> Option { + self.http_connector.as_ref().map(|s| s.value.clone()) } /// Returns the endpoint resolver. @@ -220,8 +229,8 @@ impl RuntimeComponents { } /// Returns the requested auth scheme if it is set. - pub fn http_auth_scheme(&self, scheme_id: AuthSchemeId) -> Option { - self.http_auth_schemes + pub fn auth_scheme(&self, scheme_id: AuthSchemeId) -> Option { + self.auth_schemes .iter() .find(|s| s.value.scheme_id() == scheme_id) .map(|s| s.value.clone()) @@ -254,44 +263,46 @@ impl RuntimeComponents { } impl RuntimeComponentsBuilder { - /// Returns the auth option resolver. - pub fn auth_option_resolver(&self) -> Option { - self.auth_option_resolver.as_ref().map(|s| s.value.clone()) + /// Returns the auth scheme option resolver. + pub fn auth_scheme_option_resolver(&self) -> Option { + self.auth_scheme_option_resolver + .as_ref() + .map(|s| s.value.clone()) } - /// Sets the auth option resolver. - pub fn set_auth_option_resolver( + /// Sets the auth scheme option resolver. + pub fn set_auth_scheme_option_resolver( &mut self, - auth_option_resolver: Option, + auth_scheme_option_resolver: Option, ) -> &mut Self { - self.auth_option_resolver = - auth_option_resolver.map(|r| Tracked::new(self.builder_name, r)); + self.auth_scheme_option_resolver = + auth_scheme_option_resolver.map(|r| Tracked::new(self.builder_name, r)); self } - /// Sets the auth option resolver. - pub fn with_auth_option_resolver( + /// Sets the auth scheme option resolver. + pub fn with_auth_scheme_option_resolver( mut self, - auth_option_resolver: Option, + auth_scheme_option_resolver: Option, ) -> Self { - self.set_auth_option_resolver(auth_option_resolver); + self.set_auth_scheme_option_resolver(auth_scheme_option_resolver); self } - /// Returns the connector. - pub fn connector(&self) -> Option { - self.connector.as_ref().map(|s| s.value.clone()) + /// Returns the HTTP connector. + pub fn http_connector(&self) -> Option { + self.http_connector.as_ref().map(|s| s.value.clone()) } - /// Sets the connector. - pub fn set_connector(&mut self, connector: Option) -> &mut Self { - self.connector = connector.map(|c| Tracked::new(self.builder_name, c)); + /// Sets the HTTP connector. + pub fn set_http_connector(&mut self, connector: Option) -> &mut Self { + self.http_connector = connector.map(|c| Tracked::new(self.builder_name, c)); self } - /// Sets the connector. - pub fn with_connector(mut self, connector: Option) -> Self { - self.set_connector(connector); + /// Sets the HTTP connector. + pub fn with_http_connector(mut self, connector: Option) -> Self { + self.set_http_connector(connector); self } @@ -318,21 +329,21 @@ impl RuntimeComponentsBuilder { self } - /// Returns the HTTP auth schemes. - pub fn http_auth_schemes(&self) -> impl Iterator + '_ { - self.http_auth_schemes.iter().map(|s| s.value.clone()) + /// Returns the auth schemes. + pub fn auth_schemes(&self) -> impl Iterator + '_ { + self.auth_schemes.iter().map(|s| s.value.clone()) } - /// Adds a HTTP auth scheme. - pub fn push_http_auth_scheme(&mut self, auth_scheme: SharedHttpAuthScheme) -> &mut Self { - self.http_auth_schemes + /// Adds an auth scheme. + pub fn push_auth_scheme(&mut self, auth_scheme: SharedAuthScheme) -> &mut Self { + self.auth_schemes .push(Tracked::new(self.builder_name, auth_scheme)); self } - /// Adds a HTTP auth scheme. - pub fn with_http_auth_scheme(mut self, auth_scheme: SharedHttpAuthScheme) -> Self { - self.push_http_auth_scheme(auth_scheme); + /// Adds an auth scheme. + pub fn with_auth_scheme(mut self, auth_scheme: SharedAuthScheme) -> Self { + self.push_auth_scheme(auth_scheme); self } @@ -499,11 +510,12 @@ impl RuntimeComponentsBuilder { /// Creates a runtime components builder with all the required components filled in with fake (panicking) implementations. #[cfg(feature = "test-util")] pub fn for_tests() -> Self { - use crate::client::auth::AuthOptionResolver; - use crate::client::connectors::Connector; + use crate::client::auth::AuthSchemeOptionResolver; + use crate::client::connectors::HttpConnector; + use crate::client::endpoint::{EndpointResolver, EndpointResolverParams}; use crate::client::identity::Identity; use crate::client::identity::IdentityResolver; - use crate::client::orchestrator::{EndpointResolver, EndpointResolverParams, Future}; + use crate::client::orchestrator::Future; use crate::client::retries::RetryStrategy; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::time::TimeSource; @@ -511,20 +523,20 @@ impl RuntimeComponentsBuilder { use aws_smithy_types::endpoint::Endpoint; #[derive(Debug)] - struct FakeAuthOptionResolver; - impl AuthOptionResolver for FakeAuthOptionResolver { - fn resolve_auth_options( + struct FakeAuthSchemeOptionResolver; + impl AuthSchemeOptionResolver for FakeAuthSchemeOptionResolver { + fn resolve_auth_scheme_options( &self, - _: &crate::client::auth::AuthOptionResolverParams, + _: &crate::client::auth::AuthSchemeOptionResolverParams, ) -> Result, crate::box_error::BoxError> { - unreachable!("fake auth option resolver must be overridden for this test") + unreachable!("fake auth scheme option resolver must be overridden for this test") } } #[derive(Debug)] struct FakeConnector; - impl Connector for FakeConnector { + impl HttpConnector for FakeConnector { fn call( &self, _: crate::client::orchestrator::HttpRequest, @@ -543,8 +555,8 @@ impl RuntimeComponentsBuilder { } #[derive(Debug)] - struct FakeHttpAuthScheme; - impl HttpAuthScheme for FakeHttpAuthScheme { + struct FakeAuthScheme; + impl AuthScheme for FakeAuthScheme { fn scheme_id(&self) -> AuthSchemeId { AuthSchemeId::new("fake") } @@ -556,7 +568,7 @@ impl RuntimeComponentsBuilder { None } - fn request_signer(&self) -> &dyn crate::client::auth::HttpRequestSigner { + fn signer(&self) -> &dyn crate::client::auth::Signer { unreachable!("fake http auth scheme must be overridden for this test") } } @@ -609,18 +621,19 @@ impl RuntimeComponentsBuilder { } Self::new("aws_smithy_runtime_api::client::runtime_components::RuntimeComponentBuilder::for_tests") - .with_auth_option_resolver(Some(SharedAuthOptionResolver::new(FakeAuthOptionResolver))) - .with_connector(Some(SharedConnector::new(FakeConnector))) + .with_auth_scheme(SharedAuthScheme::new(FakeAuthScheme)) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(FakeAuthSchemeOptionResolver))) .with_endpoint_resolver(Some(SharedEndpointResolver::new(FakeEndpointResolver))) - .with_http_auth_scheme(SharedHttpAuthScheme::new(FakeHttpAuthScheme)) + .with_http_connector(Some(SharedHttpConnector::new(FakeConnector))) .with_identity_resolver(AuthSchemeId::new("fake"), SharedIdentityResolver::new(FakeIdentityResolver)) .with_retry_classifiers(Some(RetryClassifiers::new())) .with_retry_strategy(Some(SharedRetryStrategy::new(FakeRetryStrategy))) - .with_time_source(Some(SharedTimeSource::new(FakeTimeSource))) .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep))) + .with_time_source(Some(SharedTimeSource::new(FakeTimeSource))) } } +/// An error that occurs when building runtime components. #[derive(Debug)] pub struct BuildError(&'static str); @@ -634,7 +647,7 @@ impl fmt::Display for BuildError { /// A trait for retrieving a shared identity resolver. /// -/// This trait exists so that [`HttpAuthScheme::identity_resolver`](crate::client::auth::HttpAuthScheme::identity_resolver) +/// This trait exists so that [`AuthScheme::identity_resolver`](crate::client::auth::AuthScheme::identity_resolver) /// can have access to configured identity resolvers without having access to all the runtime components. pub trait GetIdentityResolver: Send + Sync { /// Returns the requested identity resolver if it is set. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 609375b2107..abc687ca660 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -3,6 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Runtime plugin type definitions. +//! +//! Runtime plugins are used to extend the runtime with custom behavior. +//! This can include: +//! - Registering interceptors +//! - Registering auth schemes +//! - Adding entries to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) for orchestration +//! - Setting runtime components +//! +//! Runtime plugins are divided into service/operation "levels", with service runtime plugins +//! executing before operation runtime plugins. Runtime plugins configured in a service +//! config will always be at the service level, while runtime plugins added during +//! operation customization will be at the operation level. Custom runtime plugins will +//! always run after the default runtime plugins within their level. + use crate::box_error::BoxError; use crate::client::runtime_components::{ RuntimeComponentsBuilder, EMPTY_RUNTIME_COMPONENTS_BUILDER, @@ -12,25 +27,44 @@ use std::borrow::Cow; use std::fmt::Debug; use std::sync::Arc; -/// RuntimePlugin Trait +/// Runtime plugin trait /// -/// A RuntimePlugin is the unit of configuration for augmenting the SDK with new behavior. +/// A `RuntimePlugin` is the unit of configuration for augmenting the SDK with new behavior. /// /// Runtime plugins can register interceptors, set runtime components, and modify configuration. pub trait RuntimePlugin: Debug + Send + Sync { + /// Optionally returns additional config that should be added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). + /// + /// As a best practice, a frozen layer should be stored on the runtime plugin instance as + /// a member, and then cloned upon return since that clone is cheap. Constructing a new + /// [`Layer`](aws_smithy_types::config_bag::Layer) and freezing it will require a lot of allocations. fn config(&self) -> Option { None } + /// Returns a [`RuntimeComponentsBuilder`](RuntimeComponentsBuilder) to incorporate into the final runtime components. + /// + /// The order of runtime plugins determines which runtime components "win". Components set by later runtime plugins will + /// override those set by earlier runtime plugins. + /// + /// If no runtime component changes are desired, just return an empty builder. + /// + /// This method returns a [`Cow`] for flexibility. Some implementers may want to store the components builder + /// as a member and return a reference to it, while others may need to create the builder every call. If possible, + /// returning a reference is preferred for performance. fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER) } } +/// Shared runtime plugin +/// +/// Allows for multiple places to share ownership of one runtime plugin. #[derive(Debug, Clone)] pub struct SharedRuntimePlugin(Arc); impl SharedRuntimePlugin { + /// Returns a new [`SharedRuntimePlugin`]. pub fn new(plugin: impl RuntimePlugin + 'static) -> Self { Self(Arc::new(plugin)) } @@ -46,6 +80,47 @@ impl RuntimePlugin for SharedRuntimePlugin { } } +/// Runtime plugin that simply returns the config and components given at construction time. +#[derive(Default, Debug)] +pub struct StaticRuntimePlugin { + config: Option, + runtime_components: Option, +} + +impl StaticRuntimePlugin { + /// Returns a new [`StaticRuntimePlugin`]. + pub fn new() -> Self { + Default::default() + } + + /// Changes the config. + pub fn with_config(mut self, config: FrozenLayer) -> Self { + self.config = Some(config); + self + } + + /// Changes the runtime components. + pub fn with_runtime_components(mut self, runtime_components: RuntimeComponentsBuilder) -> Self { + self.runtime_components = Some(runtime_components); + self + } +} + +impl RuntimePlugin for StaticRuntimePlugin { + fn config(&self) -> Option { + self.config.clone() + } + + fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + self.runtime_components + .as_ref() + .map(Cow::Borrowed) + .unwrap_or_else(|| RuntimePlugin::runtime_components(self)) + } +} + +/// Used internally in the orchestrator implementation and in the generated code. Not intended to be used elsewhere. +#[doc(hidden)] #[derive(Default, Clone, Debug)] pub struct RuntimePlugins { client_plugins: Vec, @@ -99,41 +174,6 @@ impl RuntimePlugins { } } -#[derive(Default, Debug)] -pub struct StaticRuntimePlugin { - config: Option, - runtime_components: Option, -} - -impl StaticRuntimePlugin { - pub fn new() -> Self { - Default::default() - } - - pub fn with_config(mut self, config: FrozenLayer) -> Self { - self.config = Some(config); - self - } - - pub fn with_runtime_components(mut self, runtime_components: RuntimeComponentsBuilder) -> Self { - self.runtime_components = Some(runtime_components); - self - } -} - -impl RuntimePlugin for StaticRuntimePlugin { - fn config(&self) -> Option { - self.config.clone() - } - - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { - self.runtime_components - .as_ref() - .map(Cow::Borrowed) - .unwrap_or_else(|| RuntimePlugin::runtime_components(self)) - } -} - #[cfg(test)] mod tests { use super::{RuntimePlugin, RuntimePlugins}; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs new file mode 100644 index 00000000000..5a3a77988e2 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs @@ -0,0 +1,105 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Serialization/deserialization for the orchestrator. + +use crate::box_error::BoxError; +use crate::client::interceptors::context::{Error, Input, Output}; +use crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use std::fmt; +use std::sync::Arc; + +/// Serialization implementation that converts an [`Input`] into an [`HttpRequest`]. +pub trait RequestSerializer: Send + Sync + fmt::Debug { + /// Serializes the input into an HTTP request. + /// + /// The type of the [`Input`] must be known ahead of time by the request serializer + /// implementation, and must be downcasted to get access to the information necessary + /// for serialization. + /// + /// The request serializer is generally added to the [`ConfigBag`] by the operation's + /// code generated runtime plugin, which is aware of the correct input/output/error types. + fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result; +} + +/// A shared request serializer. +/// +/// This is a simple shared ownership wrapper type for the [`RequestSerializer`] trait. +#[derive(Clone, Debug)] +pub struct SharedRequestSerializer(Arc); + +impl SharedRequestSerializer { + /// Creates a new shared request serializer. + pub fn new(serializer: impl RequestSerializer + 'static) -> Self { + Self(Arc::new(serializer)) + } +} + +impl RequestSerializer for SharedRequestSerializer { + fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result { + self.0.serialize_input(input, cfg) + } +} + +impl Storable for SharedRequestSerializer { + type Storer = StoreReplace; +} + +/// Deserialization implementation that converts an [`HttpResponse`] into an [`Output`] or [`Error`]. +pub trait ResponseDeserializer: Send + Sync + fmt::Debug { + /// For streaming requests, deserializes the response headers. + /// + /// The orchestrator will call `deserialize_streaming` first, and if it returns `None`, + /// then it will continue onto `deserialize_nonstreaming`. This method should only be + /// implemented for streaming requests where the streaming response body needs to be a part + /// of the deserialized output. + fn deserialize_streaming( + &self, + response: &mut HttpResponse, + ) -> Option>> { + let _ = response; + None + } + + /// Deserialize the entire response including its body into an output or error. + fn deserialize_nonstreaming( + &self, + response: &HttpResponse, + ) -> Result>; +} + +/// Shared response deserializer. +/// +/// This is a simple shared ownership wrapper type for the [`ResponseDeserializer`] trait. +#[derive(Debug)] +pub struct SharedResponseDeserializer(Arc); + +impl SharedResponseDeserializer { + /// Creates a new [`SharedResponseDeserializer`]. + pub fn new(serializer: impl ResponseDeserializer + 'static) -> Self { + Self(Arc::new(serializer)) + } +} + +impl ResponseDeserializer for SharedResponseDeserializer { + fn deserialize_nonstreaming( + &self, + response: &HttpResponse, + ) -> Result> { + self.0.deserialize_nonstreaming(response) + } + + fn deserialize_streaming( + &self, + response: &mut HttpResponse, + ) -> Option>> { + self.0.deserialize_streaming(response) + } +} + +impl Storable for SharedResponseDeserializer { + type Storer = StoreReplace; +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index 8cc3db6309e..3f95c9304a5 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -4,6 +4,7 @@ */ #![warn( + // TODO(enableNewSmithyRuntimeLaunch): Add in remaining missing docs // missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, @@ -11,12 +12,26 @@ )] #![allow(clippy::new_without_default)] -//! Basic types for the new smithy client orchestrator. +//! APIs needed to configure and customize the Smithy generated code. +//! +//! Most users will not need to use this crate directly as the most frequently used +//! APIs are re-exported in the generated clients. However, this crate will be useful +//! for anyone writing a library for others to use with their generated clients. +//! +//! If you're needing to depend on this and you're not writing a library for Smithy +//! generated clients, then please file an issue on [smithy-rs](https://github.com/awslabs/smithy-rs) +//! as we likely missed re-exporting one of the APIs. +//! +//! All client-specific code is in the [`client`](crate::client) root level module +//! to leave room for smithy-rs server APIs in the future. /// A boxed error that is `Send` and `Sync`. pub mod box_error; -/// Smithy runtime for client orchestration. +/// APIs for client orchestration. +#[cfg(feature = "client")] pub mod client; +/// Internal builder macros. Not intended to be used outside of the aws-smithy-runtime crates. +#[doc(hidden)] pub mod macros; diff --git a/rust-runtime/aws-smithy-runtime-api/src/macros.rs b/rust-runtime/aws-smithy-runtime-api/src/macros.rs index 09efd0a74c9..759d1b8452a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/macros.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/macros.rs @@ -111,6 +111,7 @@ /// } /// } /// ``` +#[doc(hidden)] #[macro_export] macro_rules! builder { ($($tt:tt)+) => { @@ -128,6 +129,7 @@ macro_rules! builder { /// Define a new builder struct, its fields, and their docs. This macro is intended to be called /// by the `builder!` macro and should not be called directly. +#[doc(hidden)] #[macro_export] macro_rules! builder_struct { ($($_setter_name:ident, $field_name:ident, $ty:ty, $doc:literal $(,)?)+) => { @@ -143,6 +145,7 @@ macro_rules! builder_struct { /// Define setter methods for a builder struct. Must be called from within an `impl` block. This /// macro is intended to be called by the `builder!` macro and should not be called directly. +#[doc(hidden)] #[macro_export] macro_rules! builder_methods { ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal, $($tail:tt)+) => { diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index 8f5dc864ee2..a59e20abddb 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -10,6 +10,7 @@ repository = "https://github.com/awslabs/smithy-rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] +client = ["aws-smithy-runtime-api/client"] http-auth = ["aws-smithy-runtime-api/http-auth"] test-util = ["dep:aws-smithy-protocol-test", "dep:tracing-subscriber"] diff --git a/rust-runtime/aws-smithy-runtime/README.md b/rust-runtime/aws-smithy-runtime/README.md index f283643f8c7..667b2267ffe 100644 --- a/rust-runtime/aws-smithy-runtime/README.md +++ b/rust-runtime/aws-smithy-runtime/README.md @@ -1,7 +1,5 @@ # aws-smithy-runtime -**This crate is UNSTABLE! All internal and external interfaces are subject to change without notice.** - Runtime support logic and types for smithy-rs generated code. diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 1dda4dbe588..8593f0d9a5c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -10,7 +10,7 @@ use aws_smithy_runtime_api::client::auth::http::{ HTTP_DIGEST_AUTH_SCHEME_ID, }; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, }; use aws_smithy_runtime_api::client::identity::http::{Login, Token}; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; @@ -51,7 +51,7 @@ impl ApiKeyAuthScheme { } } -impl HttpAuthScheme for ApiKeyAuthScheme { +impl AuthScheme for ApiKeyAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_API_KEY_AUTH_SCHEME_ID } @@ -63,7 +63,7 @@ impl HttpAuthScheme for ApiKeyAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } @@ -75,8 +75,8 @@ struct ApiKeySigner { name: String, } -impl HttpRequestSigner for ApiKeySigner { - fn sign_request( +impl Signer for ApiKeySigner { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, @@ -122,7 +122,7 @@ impl BasicAuthScheme { } } -impl HttpAuthScheme for BasicAuthScheme { +impl AuthScheme for BasicAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_BASIC_AUTH_SCHEME_ID } @@ -134,7 +134,7 @@ impl HttpAuthScheme for BasicAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } @@ -142,8 +142,8 @@ impl HttpAuthScheme for BasicAuthScheme { #[derive(Debug, Default)] struct BasicAuthSigner; -impl HttpRequestSigner for BasicAuthSigner { - fn sign_request( +impl Signer for BasicAuthSigner { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, @@ -181,7 +181,7 @@ impl BearerAuthScheme { } } -impl HttpAuthScheme for BearerAuthScheme { +impl AuthScheme for BearerAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_BEARER_AUTH_SCHEME_ID } @@ -193,7 +193,7 @@ impl HttpAuthScheme for BearerAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } @@ -201,8 +201,8 @@ impl HttpAuthScheme for BearerAuthScheme { #[derive(Debug, Default)] struct BearerAuthSigner; -impl HttpRequestSigner for BearerAuthSigner { - fn sign_request( +impl Signer for BearerAuthSigner { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, @@ -238,7 +238,7 @@ impl DigestAuthScheme { } } -impl HttpAuthScheme for DigestAuthScheme { +impl AuthScheme for DigestAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_DIGEST_AUTH_SCHEME_ID } @@ -250,7 +250,7 @@ impl HttpAuthScheme for DigestAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } @@ -258,8 +258,8 @@ impl HttpAuthScheme for DigestAuthScheme { #[derive(Debug, Default)] struct DigestAuthSigner; -impl HttpRequestSigner for DigestAuthSigner { - fn sign_request( +impl Signer for DigestAuthSigner { + fn sign_http_request( &self, _request: &mut HttpRequest, _identity: &Identity, @@ -295,7 +295,7 @@ mod tests { .body(SdkBody::empty()) .unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), @@ -325,7 +325,7 @@ mod tests { .body(SdkBody::empty()) .unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), @@ -349,7 +349,7 @@ mod tests { let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), @@ -372,7 +372,7 @@ mod tests { let identity = Identity::new(Token::new("some-token", None), None); let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs index 56f96336586..115f78b8e8c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs @@ -8,7 +8,7 @@ use crate::client::identity::no_auth::NoAuthIdentityResolver; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, SharedHttpAuthScheme, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, SharedAuthScheme, Signer, }; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -43,7 +43,7 @@ impl NoAuthRuntimePlugin { NO_AUTH_SCHEME_ID, SharedIdentityResolver::new(NoAuthIdentityResolver::new()), ) - .with_http_auth_scheme(SharedHttpAuthScheme::new(NoAuthScheme::new())), + .with_auth_scheme(SharedAuthScheme::new(NoAuthScheme::new())), ) } } @@ -68,8 +68,8 @@ impl NoAuthScheme { #[derive(Debug, Default)] struct NoAuthSigner; -impl HttpRequestSigner for NoAuthSigner { - fn sign_request( +impl Signer for NoAuthSigner { + fn sign_http_request( &self, _request: &mut HttpRequest, _identity: &Identity, @@ -81,7 +81,7 @@ impl HttpRequestSigner for NoAuthSigner { } } -impl HttpAuthScheme for NoAuthScheme { +impl AuthScheme for NoAuthScheme { fn scheme_id(&self) -> AuthSchemeId { NO_AUTH_SCHEME_ID } @@ -93,7 +93,7 @@ impl HttpAuthScheme for NoAuthScheme { identity_resolvers.identity_resolver(NO_AUTH_SCHEME_ID) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs index 60e9a770969..445425680b4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs @@ -7,9 +7,13 @@ pub mod connection_poisoning; #[cfg(feature = "test-util")] pub mod test_util; +// TODO(enableNewSmithyRuntimeCleanup): Delete this module +/// Unstable API for interfacing the old middleware connectors with the newer orchestrator connectors. +/// +/// Important: This module and its contents will be removed in the next release. pub mod adapter { use aws_smithy_client::erase::DynConnector; - use aws_smithy_runtime_api::client::connectors::Connector; + use aws_smithy_runtime_api::client::connectors::HttpConnector; use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; use std::sync::{Arc, Mutex}; @@ -27,7 +31,7 @@ pub mod adapter { } } - impl Connector for DynConnectorAdapter { + impl HttpConnector for DynConnectorAdapter { fn call(&self, request: HttpRequest) -> BoxFuture { let future = self.dyn_connector.lock().unwrap().call_lite(request); future diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs index 5a9b3bfdfd8..457b09888d2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs @@ -9,7 +9,7 @@ use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; -use aws_smithy_runtime_api::client::connectors::Connector; +use aws_smithy_runtime_api::client::connectors::HttpConnector; use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; use http::header::{HeaderName, CONTENT_TYPE}; use std::fmt::Debug; @@ -181,7 +181,7 @@ impl ValidateRequest { } } -/// TestConnection for use as a [`Connector`]. +/// TestConnection for use as a [`HttpConnector`]. /// /// A basic test connection. It will: /// - Respond to requests with a preloaded series of responses @@ -222,7 +222,7 @@ impl TestConnection { } } -impl Connector for TestConnection { +impl HttpConnector for TestConnection { fn call(&self, request: HttpRequest) -> BoxFuture { let (res, simulated_latency) = if let Some(event) = self.data.lock().unwrap().pop() { self.requests.lock().unwrap().push(ValidateRequest { diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 30aa1666cba..15c3b0791c2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -15,19 +15,20 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream::ByteStream; use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::connectors::Connector; +use aws_smithy_runtime_api::client::connectors::HttpConnector; use aws_smithy_runtime_api::client::interceptors::context::{ Error, Input, InterceptorContext, Output, RewindResult, }; use aws_smithy_runtime_api::client::interceptors::Interceptors; use aws_smithy_runtime_api::client::orchestrator::{ - DynResponseDeserializer, HttpResponse, LoadedRequestBody, OrchestratorError, RequestSerializer, - ResponseDeserializer, SharedRequestSerializer, + HttpResponse, LoadedRequestBody, OrchestratorError, }; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; -use aws_smithy_runtime_api::client::retries::{RetryStrategy, ShouldAttempt}; +use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins; +use aws_smithy_runtime_api::client::ser_de::{ + RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, +}; use aws_smithy_types::config_bag::ConfigBag; use std::mem; use tracing::{debug, debug_span, instrument, trace, Instrument}; @@ -334,7 +335,7 @@ async fn try_attempt( let response = halt_on_err!([ctx] => { let request = ctx.take_request().expect("set during serialization"); trace!(request = ?request, "transmitting request"); - let connector = halt_on_err!([ctx] => runtime_components.connector().ok_or_else(|| + let connector = halt_on_err!([ctx] => runtime_components.http_connector().ok_or_else(|| OrchestratorError::other("No HTTP connector was available to send this request. \ Enable the `rustls` crate feature or set a connector to fix this.") )); @@ -359,7 +360,7 @@ async fn try_attempt( let output_or_error = async { let response = ctx.response_mut().expect("set during transmit"); let response_deserializer = cfg - .load::() + .load::() .expect("a request deserializer must be in the config bag"); let maybe_deserialized = { let _span = debug_span!("deserialize_streaming").entered(); @@ -420,11 +421,14 @@ mod tests { deserializer::CannedResponseDeserializer, serializer::CannedRequestSerializer, }; use ::http::{Request, Response, StatusCode}; - use aws_smithy_runtime_api::client::auth::option_resolver::StaticAuthOptionResolver; + use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ - AuthOptionResolverParams, SharedAuthOptionResolver, + AuthSchemeOptionResolverParams, SharedAuthSchemeOptionResolver, + }; + use aws_smithy_runtime_api::client::connectors::{HttpConnector, SharedHttpConnector}; + use aws_smithy_runtime_api::client::endpoint::{ + EndpointResolverParams, SharedEndpointResolver, }; - use aws_smithy_runtime_api::client::connectors::{Connector, SharedConnector}; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut, BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut, @@ -433,10 +437,7 @@ mod tests { FinalizerInterceptorContextRef, }; use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; - use aws_smithy_runtime_api::client::orchestrator::{ - BoxFuture, DynResponseDeserializer, EndpointResolverParams, Future, HttpRequest, - SharedEndpointResolver, SharedRequestSerializer, - }; + use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, Future, HttpRequest}; use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins}; @@ -474,7 +475,7 @@ mod tests { } } - impl Connector for OkConnector { + impl HttpConnector for OkConnector { fn call(&self, _request: HttpRequest) -> BoxFuture { Box::pin(Future::ready(Ok(::http::Response::builder() .status(200) @@ -496,9 +497,9 @@ mod tests { .with_endpoint_resolver(Some(SharedEndpointResolver::new( StaticUriEndpointResolver::http_localhost(8080), ))) - .with_connector(Some(SharedConnector::new(OkConnector::new()))) - .with_auth_option_resolver(Some(SharedAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), + .with_http_connector(Some(SharedHttpConnector::new(OkConnector::new()))) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), ))), } } @@ -507,10 +508,10 @@ mod tests { impl RuntimePlugin for TestOperationRuntimePlugin { fn config(&self) -> Option { let mut layer = Layer::new("TestOperationRuntimePlugin"); - layer.store_put(AuthOptionResolverParams::new("idontcare")); + layer.store_put(AuthSchemeOptionResolverParams::new("idontcare")); layer.store_put(EndpointResolverParams::new("dontcare")); layer.store_put(SharedRequestSerializer::new(new_request_serializer())); - layer.store_put(DynResponseDeserializer::new(new_response_deserializer())); + layer.store_put(SharedResponseDeserializer::new(new_response_deserializer())); Some(layer.freeze()) } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 48fd6043927..f300750b2df 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -5,9 +5,9 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthOptionResolver, AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOptionResolver, + AuthSchemeOptionResolverParams, }; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::identity::IdentityResolver; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -49,7 +49,7 @@ impl fmt::Display for AuthOrchestrationError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::NoMatchingAuthScheme => f.write_str( - "no auth scheme matched auth options. This is a bug. Please file an issue.", + "no auth scheme matched auth scheme options. This is a bug. Please file an issue.", ), Self::BadAuthSchemeEndpointConfig(message) => f.write_str(message), Self::AuthSchemeEndpointConfigMismatch(supported_schemes) => { @@ -70,24 +70,26 @@ pub(super) async fn orchestrate_auth( runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result<(), BoxError> { - let params = cfg.auth_option_resolver_params(); - let auth_option_resolver = runtime_components.auth_option_resolver(); - let auth_options = auth_option_resolver.resolve_auth_options(params)?; + let params = cfg + .load::() + .expect("auth scheme option resolver params must be set"); + let option_resolver = runtime_components.auth_scheme_option_resolver(); + let options = option_resolver.resolve_auth_scheme_options(params)?; trace!( - auth_option_resolver_params = ?params, - auth_options = ?auth_options, + auth_scheme_option_resolver_params = ?params, + auth_scheme_options = ?options, "orchestrating auth", ); - for &scheme_id in auth_options.as_ref() { - if let Some(auth_scheme) = runtime_components.http_auth_scheme(scheme_id) { + for &scheme_id in options.as_ref() { + if let Some(auth_scheme) = runtime_components.auth_scheme(scheme_id) { if let Some(identity_resolver) = auth_scheme.identity_resolver(runtime_components) { - let request_signer = auth_scheme.request_signer(); + let signer = auth_scheme.signer(); trace!( auth_scheme = ?auth_scheme, identity_resolver = ?identity_resolver, - request_signer = ?request_signer, + signer = ?signer, "resolved auth scheme, identity resolver, and signing implementation" ); @@ -103,7 +105,7 @@ pub(super) async fn orchestrate_auth( trace!("signing request"); let request = ctx.request_mut().expect("set during serialization"); - request_signer.sign_request( + signer.sign_http_request( request, &identity, auth_scheme_endpoint_config, @@ -125,7 +127,7 @@ fn extract_endpoint_auth_scheme_config( let auth_schemes = match endpoint.properties().get("authSchemes") { Some(Document::Array(schemes)) => schemes, // no auth schemes: - None => return Ok(AuthSchemeEndpointConfig::new(None)), + None => return Ok(AuthSchemeEndpointConfig::from(None)), _other => { return Err(AuthOrchestrationError::BadAuthSchemeEndpointConfig( "expected an array for `authSchemes` in endpoint config".into(), @@ -144,17 +146,17 @@ fn extract_endpoint_auth_scheme_config( .ok_or_else(|| { AuthOrchestrationError::auth_scheme_endpoint_config_mismatch(auth_schemes.iter()) })?; - Ok(AuthSchemeEndpointConfig::new(Some(auth_scheme_config))) + Ok(AuthSchemeEndpointConfig::from(Some(auth_scheme_config))) } #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::auth::option_resolver::StaticAuthOptionResolver; + use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ - AuthOptionResolverParams, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, - SharedAuthOptionResolver, SharedHttpAuthScheme, + AuthScheme, AuthSchemeId, AuthSchemeOptionResolverParams, SharedAuthScheme, + SharedAuthSchemeOptionResolver, Signer, }; use aws_smithy_runtime_api::client::identity::{ Identity, IdentityResolver, SharedIdentityResolver, @@ -181,8 +183,8 @@ mod tests { #[derive(Debug)] struct TestSigner; - impl HttpRequestSigner for TestSigner { - fn sign_request( + impl Signer for TestSigner { + fn sign_http_request( &self, request: &mut HttpRequest, _identity: &Identity, @@ -203,7 +205,7 @@ mod tests { struct TestAuthScheme { signer: TestSigner, } - impl HttpAuthScheme for TestAuthScheme { + impl AuthScheme for TestAuthScheme { fn scheme_id(&self) -> AuthSchemeId { TEST_SCHEME_ID } @@ -215,7 +217,7 @@ mod tests { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Signer { &self.signer } } @@ -227,21 +229,19 @@ mod tests { ctx.enter_before_transmit_phase(); let runtime_components = RuntimeComponentsBuilder::for_tests() - .with_auth_option_resolver(Some(SharedAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![TEST_SCHEME_ID]), + .with_auth_scheme(SharedAuthScheme::new(TestAuthScheme { signer: TestSigner })) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![TEST_SCHEME_ID]), ))) .with_identity_resolver( TEST_SCHEME_ID, SharedIdentityResolver::new(TestIdentityResolver), ) - .with_http_auth_scheme(SharedHttpAuthScheme::new(TestAuthScheme { - signer: TestSigner, - })) .build() .unwrap(); let mut layer: Layer = Layer::new("test"); - layer.store_put(AuthOptionResolverParams::new("doesntmatter")); + layer.store_put(AuthSchemeOptionResolverParams::new("doesntmatter")); layer.store_put(Endpoint::builder().url("dontcare").build()); let cfg = ConfigBag::of_layers(vec![layer]); @@ -279,10 +279,10 @@ mod tests { identity: impl IdentityResolver + 'static, ) -> (RuntimeComponents, ConfigBag) { let runtime_components = RuntimeComponentsBuilder::for_tests() - .with_http_auth_scheme(SharedHttpAuthScheme::new(BasicAuthScheme::new())) - .with_http_auth_scheme(SharedHttpAuthScheme::new(BearerAuthScheme::new())) - .with_auth_option_resolver(Some(SharedAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![ + .with_auth_scheme(SharedAuthScheme::new(BasicAuthScheme::new())) + .with_auth_scheme(SharedAuthScheme::new(BearerAuthScheme::new())) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![ HTTP_BASIC_AUTH_SCHEME_ID, HTTP_BEARER_AUTH_SCHEME_ID, ]), @@ -293,7 +293,7 @@ mod tests { let mut layer = Layer::new("test"); layer.store_put(Endpoint::builder().url("dontcare").build()); - layer.store_put(AuthOptionResolverParams::new("doesntmatter")); + layer.store_put(AuthSchemeOptionResolverParams::new("doesntmatter")); (runtime_components, ConfigBag::of_layers(vec![layer])) } @@ -343,7 +343,7 @@ mod tests { .build(); let config = extract_endpoint_auth_scheme_config(&endpoint, "test-scheme-id".into()) .expect("success"); - assert!(config.config().is_none()); + assert!(config.as_document().is_none()); } #[test] @@ -412,7 +412,7 @@ mod tests { assert_eq!( "magic string value", config - .config() + .as_document() .expect("config is set") .as_object() .expect("it's an object") diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index be6fc51bf02..4f170ec6417 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -9,11 +9,9 @@ use aws_smithy_http::endpoint::{ SharedEndpointResolver, }; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; +use aws_smithy_runtime_api::client::endpoint::{EndpointResolver, EndpointResolverParams}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::{ - EndpointResolver, EndpointResolverParams, Future, HttpRequest, -}; +use aws_smithy_runtime_api::client::orchestrator::{Future, HttpRequest}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; @@ -109,7 +107,9 @@ pub(super) async fn orchestrate_endpoint( ) -> Result<(), BoxError> { trace!("orchestrating endpoint resolution"); - let params = cfg.endpoint_resolver_params(); + let params = cfg + .load::() + .expect("endpoint resolver params must be set"); let endpoint_prefix = cfg.load::(); let request = ctx.request_mut().expect("set during serialization"); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs index 1cdb94cae99..c6315512a3c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs @@ -5,9 +5,8 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RetryReason, RetryStrategy, ShouldAttempt, + ClassifyRetry, RequestAttempts, RetryReason, RetryStrategy, ShouldAttempt, }; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index ba8d08aa663..160fe71ca6b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -10,9 +10,8 @@ use crate::client::retries::strategy::standard::ReleaseResult::{ use crate::client::retries::token_bucket::TokenBucket; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RetryReason, RetryStrategy, ShouldAttempt, + ClassifyRetry, RequestAttempts, RetryReason, RetryStrategy, ShouldAttempt, }; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs index 0a4b0ee8604..4b1d43ae793 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs @@ -3,12 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{Error, Output}; -use aws_smithy_runtime_api::client::orchestrator::{ - DynResponseDeserializer, HttpResponse, OrchestratorError, ResponseDeserializer, -}; +use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedResponseDeserializer}; use aws_smithy_types::config_bag::{FrozenLayer, Layer}; use std::sync::Mutex; @@ -46,7 +44,7 @@ impl ResponseDeserializer for CannedResponseDeserializer { impl RuntimePlugin for CannedResponseDeserializer { fn config(&self) -> Option { let mut cfg = Layer::new("CannedResponse"); - cfg.set_response_deserializer(DynResponseDeserializer::new(Self { + cfg.store_put(SharedResponseDeserializer::new(Self { inner: Mutex::new(self.take()), })); Some(cfg.freeze()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs index 4f5bff24bdf..ec3eb2dafd5 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs @@ -4,11 +4,10 @@ */ use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::Input; -use aws_smithy_runtime_api::client::orchestrator::SharedRequestSerializer; -use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, RequestSerializer}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{RequestSerializer, SharedRequestSerializer}; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use std::sync::Mutex; @@ -52,7 +51,7 @@ impl RequestSerializer for CannedRequestSerializer { impl RuntimePlugin for CannedRequestSerializer { fn config(&self) -> Option { let mut cfg = Layer::new("CannedRequest"); - cfg.set_request_serializer(SharedRequestSerializer::new(Self { + cfg.store_put(SharedRequestSerializer::new(Self { inner: Mutex::new(self.take()), })); Some(cfg.freeze()) diff --git a/rust-runtime/aws-smithy-runtime/src/lib.rs b/rust-runtime/aws-smithy-runtime/src/lib.rs index cd4364a9b35..3afb476bf9d 100644 --- a/rust-runtime/aws-smithy-runtime/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime/src/lib.rs @@ -19,6 +19,7 @@ )] /// Runtime support logic for generated clients. +#[cfg(feature = "client")] pub mod client; pub mod static_partition_map; diff --git a/rust-runtime/inlineable/Cargo.toml b/rust-runtime/inlineable/Cargo.toml index 74bbcdebc0c..6d0c099429e 100644 --- a/rust-runtime/inlineable/Cargo.toml +++ b/rust-runtime/inlineable/Cargo.toml @@ -22,7 +22,7 @@ async-trait = "0.1" aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-http-server = { path = "../aws-smithy-http-server" } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../aws-smithy-types" } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1" From a5465b79a5e864673f0f9d6606b29d9e6ab50e44 Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 25 Jul 2023 14:03:21 +0200 Subject: [PATCH 032/331] Render only shape name in server error responses (#2866) This essentially reverts the behavior introduced in #1982. The rationale for that change: > [...] since some existing clients rely on it to deserialize the error shape > and fail if only the shape name is present no longer holds. Since serializing only the shape name is a SHOULD in the spec, it's best that we honor it. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 22 +++++++++++++++++++ .../rest-json-extras.smithy | 8 ++----- .../codegen/core/smithy/protocols/RestJson.kt | 17 +++++++++----- .../protocol/ServerProtocolTestGenerator.kt | 16 +------------- .../server/smithy/protocols/ServerAwsJson.kt | 8 +++++++ 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 7b24ac49efc..741a4540940 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -664,3 +664,25 @@ message = "The `alb_health_check` module has been moved out of the `plugin` modu references = ["smithy-rs#2865"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } author = "david-perez" + +[[smithy-rs]] +message = """ +[RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. +Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: +``` +HTTP/1.1 400 Bad Request +content-type: application/json +x-amzn-errortype: com.example.service#InvalidRequestException +... +``` +Example server error response now: +``` +HTTP/1.1 400 Bad Request +content-type: application/json +x-amzn-errortype: InvalidRequestException +... +``` +""" +references = ["smithy-rs#2866"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "server" } +author = "david-perez" diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index b9946baa811..ff92f36c6bd 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -81,16 +81,12 @@ service RestJsonExtras { appliesTo: "client", }, { - documentation: """ - Upper case error modeled lower case. - Servers render the full shape ID (including namespace), since some - existing clients rely on it to deserialize the error shape and fail - if only the shape name is present.""", + documentation: "Upper case error modeled lower case.", id: "ServiceLevelErrorServer", protocol: "aws.protocols#restJson1", code: 500, body: "{}", - headers: { "X-Amzn-Errortype": "aws.protocoltests.restjson#ExtraError" }, + headers: { "X-Amzn-Errortype": "ExtraError" }, params: {}, appliesTo: "server", } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt index 9a3d12a9932..ba526d0c873 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt @@ -80,14 +80,19 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { * RestJson1 implementations can denote errors in responses in several ways. * New server-side protocol implementations MUST use a header field named `X-Amzn-Errortype`. * - * Note that the spec says that implementations SHOULD strip the error shape ID's namespace. - * However, our server implementation renders the full shape ID (including namespace), since some - * existing clients rely on it to deserialize the error shape and fail if only the shape name is present. - * This is compliant with the spec, see https://github.com/awslabs/smithy/pull/1493. - * See https://github.com/awslabs/smithy/issues/1494 too. + * Note that the spec says that implementations SHOULD strip the error shape ID's namespace + * (see https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization): + * + * > The value of this component SHOULD contain only the shape name of the error's Shape ID. + * + * But it's a SHOULD; we could strip the namespace if we wanted to. In fact, we did so in smithy-rs versions + * 0.52.0 to 0.55.4; see: + * - https://github.com/awslabs/smithy-rs/pull/1982 + * - https://github.com/awslabs/smithy/pull/1493 + * - https://github.com/awslabs/smithy/issues/1494 */ override fun additionalErrorResponseHeaders(errorShape: StructureShape): List> = - listOf("x-amzn-errortype" to errorShape.id.toString()) + listOf("x-amzn-errortype" to errorShape.id.name) override fun structuredDataParser(): StructuredDataParserGenerator = JsonParserGenerator(codegenContext, httpBindingResolver, ::restJsonFieldName) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index 7288de89421..74978699ca5 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -921,15 +921,6 @@ class ServerProtocolTestGenerator( ).asObjectNode().get(), ).build() - private fun fixRestJsonInvalidGreetingError(testCase: HttpResponseTestCase): HttpResponseTestCase = - testCase.toBuilder().putHeader("X-Amzn-Errortype", "aws.protocoltests.restjson#InvalidGreeting").build() - - private fun fixRestJsonEmptyComplexErrorWithNoMessage(testCase: HttpResponseTestCase): HttpResponseTestCase = - testCase.toBuilder().putHeader("X-Amzn-Errortype", "aws.protocoltests.restjson#ComplexError").build() - - private fun fixRestJsonComplexErrorWithNoMessage(testCase: HttpResponseTestCase): HttpResponseTestCase = - testCase.toBuilder().putHeader("X-Amzn-Errortype", "aws.protocoltests.restjson#ComplexError").build() - // TODO(https://github.com/awslabs/smithy/issues/1506) private fun fixRestJsonMalformedPatternReDOSString(testCase: HttpMalformedRequestTestCase): HttpMalformedRequestTestCase { val brokenResponse = testCase.response @@ -962,12 +953,7 @@ class ServerProtocolTestGenerator( ) private val BrokenResponseTests: Map, KFunction1> = - // TODO(https://github.com/awslabs/smithy/issues/1494) - mapOf( - Pair(RestJson, "RestJsonInvalidGreetingError") to ::fixRestJsonInvalidGreetingError, - Pair(RestJson, "RestJsonEmptyComplexErrorWithNoMessage") to ::fixRestJsonEmptyComplexErrorWithNoMessage, - Pair(RestJson, "RestJsonComplexErrorWithNoMessage") to ::fixRestJsonComplexErrorWithNoMessage, - ) + mapOf() private val BrokenMalformedRequestTests: Map, KFunction1> = // TODO(https://github.com/awslabs/smithy/issues/1506) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt index 920813e34d7..549ca88b1ee 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt @@ -68,6 +68,14 @@ class ServerAwsJsonFactory( /** * AwsJson requires errors to be serialized in server responses with an additional `__type` field. This * customization writes the right field depending on the version of the AwsJson protocol. + * + * From the specs: + * - https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html#operation-error-serialization + * - https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html#operation-error-serialization + * + * > Error responses in the protocol are serialized identically to standard responses with one additional + * > component to distinguish which error is contained. New server-side protocol implementations SHOULD use a body + * > field named __type */ class ServerAwsJsonError(private val awsJsonVersion: AwsJsonVersion) : JsonSerializerCustomization() { override fun section(section: JsonSerializerSection): Writable = when (section) { From 2922f561b0d67c5b908e2dabfb2a8a563f41a3ef Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 25 Jul 2023 12:59:17 -0700 Subject: [PATCH 033/331] More tidying up of `aws-smithy-runtime-api` (#2869) This PR finishes documenting `aws-smithy-runtime-api` and also: - Adds `Send + Sync` bounds to `Interceptor`. - Moves `Interceptors` into `aws-smithy-runtime`. - Expands the more complicated macros in the interceptor context wrappers. - Makes the `OrchestratorError` an informative error according to [RFC-22](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0022_error_context_and_compatibility.md). - Renames `ConnectorError::is_other` to `as_other` and adds an equivalent `is_other` that returns a boolean. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/http_request_checksum.rs | 2 +- .../src/http_response_checksum.rs | 2 +- .../src/route53_resource_id_preprocessor.rs | 2 +- .../InterceptorConfigCustomization.kt | 2 +- .../client/CustomizableOperationGenerator.kt | 2 +- rust-runtime/aws-smithy-http/src/result.rs | 16 +- rust-runtime/aws-smithy-http/src/retry.rs | 2 +- .../src/client/interceptors.rs | 545 ++++-------------- .../src/client/interceptors/context.rs | 91 +-- .../client/interceptors/context/wrappers.rs | 344 ++++++----- .../src/client/orchestrator.rs | 153 +++-- .../aws-smithy-runtime-api/src/lib.rs | 3 +- .../client/connectors/connection_poisoning.rs | 2 +- .../src/client/interceptors.rs | 303 +++++++++- .../src/client/orchestrator.rs | 7 +- .../src/client/retries/classifier.rs | 18 +- 16 files changed, 793 insertions(+), 701 deletions(-) diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index b97b2d2bd0a..702fbe56c2d 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -77,7 +77,7 @@ impl RequestChecksumInterceptor { impl Interceptor for RequestChecksumInterceptor where - AP: Fn(&Input) -> Result, BoxError>, + AP: Fn(&Input) -> Result, BoxError> + Send + Sync, { fn read_before_serialization( &self, diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index 9a54d001919..2a98830d8e9 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -54,7 +54,7 @@ impl ResponseChecksumInterceptor { impl Interceptor for ResponseChecksumInterceptor where - VE: Fn(&Input) -> bool, + VE: Fn(&Input) -> bool + Send + Sync, { fn read_before_serialization( &self, diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs index d8fa3f4c972..00f158317f9 100644 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs +++ b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs @@ -69,7 +69,7 @@ where impl Interceptor for Route53ResourceIdInterceptor where - G: for<'a> Fn(&'a mut T) -> &'a mut Option, + G: for<'a> Fn(&'a mut T) -> &'a mut Option + Send + Sync, T: fmt::Debug + Send + Sync + 'static, { fn modify_before_serialization( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index 2dfec5159ed..9bb9e16ef3f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -91,7 +91,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// ## } /// ## } /// ``` - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + Send + Sync + 'static) -> Self { + pub fn interceptor(mut self, interceptor: impl #{Interceptor} + 'static) -> Self { self.push_interceptor(#{SharedInterceptor}::new(interceptor)); self } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 633a50985a2..4046d29e7fb 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -199,7 +199,7 @@ class CustomizableOperationGenerator( /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood). /// The order in which those user-specified operation interceptors are invoked should not be relied upon /// as it is an implementation detail. - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + #{Send} + #{Sync} + 'static) -> Self { + pub fn interceptor(mut self, interceptor: impl #{Interceptor} + 'static) -> Self { self.interceptors.push(#{SharedInterceptor}::new(interceptor)); self } diff --git a/rust-runtime/aws-smithy-http/src/result.rs b/rust-runtime/aws-smithy-http/src/result.rs index bd6d2f1f3b8..8d60c8d2ed7 100644 --- a/rust-runtime/aws-smithy-http/src/result.rs +++ b/rust-runtime/aws-smithy-http/src/result.rs @@ -232,11 +232,16 @@ impl DispatchFailure { self.source.is_user() } - /// Returns the optional error kind associated with an unclassified error - pub fn is_other(&self) -> Option { + /// Returns true if the error is an unclassified error. + pub fn is_other(&self) -> bool { self.source.is_other() } + /// Returns the optional error kind associated with an unclassified error + pub fn as_other(&self) -> Option { + self.source.as_other() + } + /// Returns the inner error if it is a connector error pub fn as_connector_error(&self) -> Option<&ConnectorError> { Some(&self.source) @@ -633,8 +638,13 @@ impl ConnectorError { matches!(self.kind, ConnectorErrorKind::User) } + /// Returns true if the error is an unclassified error. + pub fn is_other(&self) -> bool { + matches!(self.kind, ConnectorErrorKind::Other(..)) + } + /// Returns the optional error kind associated with an unclassified error - pub fn is_other(&self) -> Option { + pub fn as_other(&self) -> Option { match &self.kind { ConnectorErrorKind::Other(ek) => *ek, _ => None, diff --git a/rust-runtime/aws-smithy-http/src/retry.rs b/rust-runtime/aws-smithy-http/src/retry.rs index 30c86549267..eaf7d0e0933 100644 --- a/rust-runtime/aws-smithy-http/src/retry.rs +++ b/rust-runtime/aws-smithy-http/src/retry.rs @@ -45,7 +45,7 @@ impl DefaultResponseRetryClassifier { Err(SdkError::DispatchFailure(err)) => { if err.is_timeout() || err.is_io() { Err(RetryKind::Error(ErrorKind::TransientError)) - } else if let Some(ek) = err.is_other() { + } else if let Some(ek) = err.as_other() { Err(RetryKind::Error(ek)) } else { Err(RetryKind::UnretryableFailure) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index a755a34e448..91d72252629 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -13,12 +13,10 @@ use crate::client::interceptors::context::{ BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut, BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, - FinalizerInterceptorContextRef, InterceptorContext, + FinalizerInterceptorContextRef, }; use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::error::display::DisplayErrorContext; -use context::{Error, Input, Output}; use std::fmt; use std::marker::PhantomData; use std::ops::Deref; @@ -38,9 +36,7 @@ macro_rules! interceptor_trait_fn { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _rc = runtime_components; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } }; @@ -52,9 +48,7 @@ macro_rules! interceptor_trait_fn { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _rc = runtime_components; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } }; @@ -70,7 +64,7 @@ macro_rules! interceptor_trait_fn { /// of the SDK ’s request execution pipeline. Hooks are either "read" hooks, which make it possible /// to read in-flight request or response messages, or "read/write" hooks, which make it possible /// to modify in-flight request or output messages. -pub trait Interceptor: fmt::Debug { +pub trait Interceptor: fmt::Debug + Send + Sync { /// A hook called at the start of an execution, before the SDK /// does anything else. /// @@ -78,14 +72,14 @@ pub trait Interceptor: fmt::Debug { /// between invocation of this hook and `after_execution` is very close /// to full duration of the execution. /// - /// **Available Information:** The [InterceptorContext::input()] is - /// **ALWAYS** available. Other information **WILL NOT** be available. + /// **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) + /// is **ALWAYS** available. Other information **WILL NOT** be available. /// /// **Error Behavior:** Errors raised by this hook will be stored /// until all interceptors have had their `before_execution` invoked. /// Other hooks will then be skipped and execution will jump to /// `modify_before_completion` with the raised error as the - /// [InterceptorContext::output_or_error()]. If multiple + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). If multiple /// `before_execution` methods raise errors, the latest /// will be used and earlier ones will be logged and dropped. fn read_before_execution( @@ -93,8 +87,7 @@ pub trait Interceptor: fmt::Debug { context: &BeforeSerializationInterceptorContextRef<'_>, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + let (_ctx, _cfg) = (context, cfg); Ok(()) } @@ -110,14 +103,14 @@ pub trait Interceptor: fmt::Debug { **When:** This will **ALWAYS** be called once per execution, except when a failure occurs earlier in the request pipeline. - **Available Information:** The [InterceptorContext::input()] is + **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) is **ALWAYS** available. This request may have been modified by earlier `modify_before_serialization` hooks, and may be modified further by later hooks. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_completion` with the raised - error as the [InterceptorContext::output_or_error()]. + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The input message returned by this hook MUST be the same type of input message passed into this hook. @@ -138,12 +131,12 @@ pub trait Interceptor: fmt::Debug { duration between invocation of this hook and `after_serialization` is very close to the amount of time spent marshalling the request. - **Available Information:** The [InterceptorContext::input()] is + **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) is **ALWAYS** available. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_completion` with the raised - error as the [InterceptorContext::output_or_error()]. + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -151,21 +144,20 @@ pub trait Interceptor: fmt::Debug { read_after_serialization, BeforeTransmitInterceptorContextRef, " - /// A hook called after the input message is marshalled into - /// a transport message. - /// - /// **When:** This will **ALWAYS** be called once per execution, except when a - /// failure occurs earlier in the request pipeline. The duration - /// between invocation of this hook and `before_serialization` is very - /// close to the amount of time spent marshalling the request. - /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::request()] are **ALWAYS** available. - /// Other information **WILL NOT** be available. - /// - /// **Error Behavior:** If errors are raised by this hook, - /// execution will jump to `modify_before_completion` with the raised - /// error as the [InterceptorContext::output_or_error()]. + A hook called after the input message is marshalled into + a transport message. + + **When:** This will **ALWAYS** be called once per execution, except when a + failure occurs earlier in the request pipeline. The duration + between invocation of this hook and `before_serialization` is very + close to the amount of time spent marshalling the request. + + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. + + **Error Behavior:** If errors are raised by this hook, + execution will jump to `modify_before_completion` with the raised + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -177,13 +169,12 @@ pub trait Interceptor: fmt::Debug { has the ability to modify and return a new transport request message of the same type, except when a failure occurs earlier in the request pipeline. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - Other information **WILL NOT** be available. + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_completion` with the raised - error as the [InterceptorContext::output_or_error()]. + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport request message returned by this hook MUST be the same type of request message passed into this hook @@ -202,9 +193,8 @@ pub trait Interceptor: fmt::Debug { failure occurs earlier in the request pipeline. This method will be called multiple times in the event of retries. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). @@ -212,7 +202,7 @@ pub trait Interceptor: fmt::Debug { until all interceptors have had their `before_attempt` invoked. Other hooks will then be skipped and execution will jump to `modify_before_attempt_completion` with the raised error as the - [InterceptorContext::output_or_error()]. If multiple + [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). If multiple `before_attempt` methods raise errors, the latest will be used and earlier ones will be logged and dropped. " @@ -230,18 +220,16 @@ pub trait Interceptor: fmt::Debug { failure occurs earlier in the request pipeline. This method may be called multiple times in the event of retries. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - The `http::Request` may have been modified by earlier + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. The `http::Request` may have been modified by earlier `modify_before_signing` hooks, and may be modified further by later hooks. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made - in previous attempts - (e.g. by request signers or other interceptors). + in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport request message returned by this hook MUST be the same type of request message passed into this hook @@ -262,15 +250,14 @@ pub trait Interceptor: fmt::Debug { invocation of this hook and `after_signing` is very close to the amount of time spent signing the request. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -286,15 +273,14 @@ pub trait Interceptor: fmt::Debug { invocation of this hook and `before_signing` is very close to the amount of time spent signing the request. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -302,26 +288,25 @@ pub trait Interceptor: fmt::Debug { mut modify_before_transmit, BeforeTransmitInterceptorContextMut, " - /// A hook called before the transport request message is sent to the - /// service. This method has the ability to modify and return - /// a new transport request message of the same type. - /// - /// **When:** This will **ALWAYS** be called once per attempt, except when a - /// failure occurs earlier in the request pipeline. This method may be - /// called multiple times in the event of retries. - /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::request()] are **ALWAYS** available. - /// The `http::Request` may have been modified by earlier - /// `modify_before_transmit` hooks, and may be modified further by later - /// hooks. Other information **WILL NOT** be available. - /// In the event of retries, the `InterceptorContext` will not include - /// changes made in previous attempts (e.g. by request signers or + A hook called before the transport request message is sent to the + service. This method has the ability to modify and return + a new transport request message of the same type. + + **When:** This will **ALWAYS** be called once per attempt, except when a + failure occurs earlier in the request pipeline. This method may be + called multiple times in the event of retries. + + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. The `http::Request` may have been modified by earlier + `modify_before_transmit` hooks, and may be modified further by later + hooks. Other information **WILL NOT** be available. + In the event of retries, the `InterceptorContext` will not include + changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport request message returned by this hook MUST be the same type of request message passed into this hook @@ -345,16 +330,15 @@ pub trait Interceptor: fmt::Debug { Depending on the protocol, the duration may not include the time spent reading the response data. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -373,16 +357,14 @@ pub trait Interceptor: fmt::Debug { Depending on the protocol, the duration may not include the time spent reading the response data. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()] and - [InterceptorContext::response()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -398,10 +380,8 @@ pub trait Interceptor: fmt::Debug { failure occurs earlier in the request pipeline. This method may be called multiple times in the event of retries. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()] and - [InterceptorContext::response()] are **ALWAYS** available. - The transmit_response may have been modified by earlier + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + is **ALWAYS** available. The transmit_response may have been modified by earlier `modify_before_deserialization` hooks, and may be modified further by later hooks. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in @@ -410,7 +390,7 @@ pub trait Interceptor: fmt::Debug { **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with the raised error as the - [InterceptorContext::output_or_error()]. + [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport response message returned by this hook MUST be the same type of response message passed into @@ -432,16 +412,14 @@ pub trait Interceptor: fmt::Debug { Depending on the protocol and operation, the duration may include the time spent downloading the response data. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()] and - [InterceptorContext::response()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` - with the raised error as the [InterceptorContext::output_or_error()]. + with the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -459,16 +437,14 @@ pub trait Interceptor: fmt::Debug { the duration may include the time spent downloading the response data. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()], - [InterceptorContext::response()] and - [InterceptorContext::output_or_error()] are **ALWAYS** available. In the event - of retries, the `InterceptorContext` will not include changes made + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + and [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) + are **ALWAYS** available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -480,16 +456,19 @@ pub trait Interceptor: fmt::Debug { /// failure occurs before `before_attempt`. This method may /// be called multiple times in the event of retries. /// - /// **Available Information:** The [InterceptorContext::input()], - /// [InterceptorContext::request()], - /// [InterceptorContext::response()] and - /// [InterceptorContext::output_or_error()] are **ALWAYS** available. In the event - /// of retries, the `InterceptorContext` will not include changes made + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** If errors are raised by this /// hook, execution will jump to `after_attempt` with - /// the raised error as the [InterceptorContext::output_or_error()]. + /// the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). /// /// **Return Constraints:** Any output message returned by this /// hook MUST match the operation being invoked. Any error type can be @@ -500,9 +479,7 @@ pub trait Interceptor: fmt::Debug { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _rc = runtime_components; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } @@ -511,14 +488,15 @@ pub trait Interceptor: fmt::Debug { /// **When:** This will **ALWAYS** be called once per attempt, as long as /// `before_attempt` has been executed. /// - /// **Available Information:** The [InterceptorContext::input()], - /// [InterceptorContext::request()] and - /// [InterceptorContext::output_or_error()] are **ALWAYS** available. - /// The [InterceptorContext::response()] is available if a - /// response was received by the service for this attempt. - /// In the event of retries, the `InterceptorContext` will not include - /// changes made in previous attempts (e.g. by request signers or other - /// interceptors). + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made + /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** Errors raised by this hook will be stored /// until all interceptors have had their `after_attempt` invoked. @@ -527,16 +505,14 @@ pub trait Interceptor: fmt::Debug { /// retry strategy determines that the execution is retryable, /// execution will then jump to `before_attempt`. Otherwise, /// execution will jump to `modify_before_attempt_completion` with the - /// raised error as the [InterceptorContext::output_or_error()]. + /// raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). fn read_after_attempt( &self, context: &FinalizerInterceptorContextRef<'_>, runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _rc = runtime_components; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } @@ -547,15 +523,19 @@ pub trait Interceptor: fmt::Debug { /// /// **When:** This will **ALWAYS** be called once per execution. /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::output_or_error()] are **ALWAYS** available. The - /// [InterceptorContext::request()] - /// and [InterceptorContext::response()] are available if the - /// execution proceeded far enough for them to be generated. + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made + /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** If errors are raised by this /// hook , execution will jump to `after_attempt` with - /// the raised error as the [InterceptorContext::output_or_error()]. + /// the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). /// /// **Return Constraints:** Any output message returned by this /// hook MUST match the operation being invoked. Any error type can be @@ -566,9 +546,7 @@ pub trait Interceptor: fmt::Debug { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _rc = runtime_components; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } @@ -578,17 +556,21 @@ pub trait Interceptor: fmt::Debug { /// between invocation of this hook and `before_execution` is very /// close to the full duration of the execution. /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::output_or_error()] are **ALWAYS** available. The - /// [InterceptorContext::request()] and - /// [InterceptorContext::response()] are available if the - /// execution proceeded far enough for them to be generated. + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made + /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** Errors raised by this hook will be stored /// until all interceptors have had their `after_execution` invoked. /// The error will then be treated as the - /// [InterceptorContext::output_or_error()] to the customer. If multiple - /// `after_execution` methods raise errors , the latest will be + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) + /// to the customer. If multiple `after_execution` methods raise errors , the latest will be /// used and earlier ones will be logged and dropped. fn read_after_execution( &self, @@ -596,9 +578,7 @@ pub trait Interceptor: fmt::Debug { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _rc = runtime_components; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } } @@ -606,7 +586,7 @@ pub trait Interceptor: fmt::Debug { /// Interceptor wrapper that may be shared #[derive(Clone)] pub struct SharedInterceptor { - interceptor: Arc, + interceptor: Arc, check_enabled: Arc bool + Send + Sync>, } @@ -619,8 +599,8 @@ impl fmt::Debug for SharedInterceptor { } impl SharedInterceptor { - /// Create a new `SharedInterceptor` from `Interceptor` - pub fn new(interceptor: T) -> Self { + /// Create a new `SharedInterceptor` from `Interceptor`. + pub fn new(interceptor: T) -> Self { Self { interceptor: Arc::new(interceptor), check_enabled: Arc::new(|conf: &ConfigBag| { @@ -629,7 +609,8 @@ impl SharedInterceptor { } } - fn enabled(&self, conf: &ConfigBag) -> bool { + /// Checks if this interceptor is enabled in the given config. + pub fn enabled(&self, conf: &ConfigBag) -> bool { (self.check_enabled)(conf) } } @@ -641,84 +622,12 @@ impl AsRef for SharedInterceptor { } impl Deref for SharedInterceptor { - type Target = Arc; + type Target = Arc; fn deref(&self) -> &Self::Target { &self.interceptor } } -/// A interceptor wrapper to conditionally enable the interceptor based on [`DisableInterceptor`] -struct ConditionallyEnabledInterceptor(SharedInterceptor); -impl ConditionallyEnabledInterceptor { - fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { - if self.0.enabled(cfg) { - Some(self.0.as_ref()) - } else { - None - } - } -} - -#[derive(Debug)] -pub struct Interceptors { - interceptors: I, -} - -macro_rules! interceptor_impl_fn { - (mut $interceptor:ident) => { - pub fn $interceptor( - self, - ctx: &mut InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!(concat!( - "running `", - stringify!($interceptor), - "` interceptors" - )); - let mut result: Result<(), BoxError> = Ok(()); - let mut ctx = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = - interceptor.$interceptor(&mut ctx, runtime_components, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::$interceptor) - } - }; - (ref $interceptor:ident) => { - pub fn $interceptor( - self, - ctx: &InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - let mut result: Result<(), BoxError> = Ok(()); - let ctx = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.$interceptor(&ctx, runtime_components, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::$interceptor) - } - }; -} - /// Generalized interceptor disabling interface /// /// RuntimePlugins can disable interceptors by inserting [`DisableInterceptor`](DisableInterceptor) into the config bag @@ -744,215 +653,3 @@ pub fn disable_interceptor(cause: &'static str) -> DisableInterc cause, } } - -impl Interceptors -where - I: Iterator, -{ - pub fn new(interceptors: I) -> Self { - Self { interceptors } - } - - fn into_iter(self) -> impl Iterator { - self.interceptors.map(ConditionallyEnabledInterceptor) - } - - pub fn read_before_execution( - self, - operation: bool, - ctx: &InterceptorContext, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!( - "running {} `read_before_execution` interceptors", - if operation { "operation" } else { "client" } - ); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_before_execution) - } - - interceptor_impl_fn!(mut modify_before_serialization); - interceptor_impl_fn!(ref read_before_serialization); - interceptor_impl_fn!(ref read_after_serialization); - interceptor_impl_fn!(mut modify_before_retry_loop); - interceptor_impl_fn!(ref read_before_attempt); - interceptor_impl_fn!(mut modify_before_signing); - interceptor_impl_fn!(ref read_before_signing); - interceptor_impl_fn!(ref read_after_signing); - interceptor_impl_fn!(mut modify_before_transmit); - interceptor_impl_fn!(ref read_before_transmit); - interceptor_impl_fn!(ref read_after_transmit); - interceptor_impl_fn!(mut modify_before_deserialization); - interceptor_impl_fn!(ref read_before_deserialization); - interceptor_impl_fn!(ref read_after_deserialization); - - pub fn modify_before_attempt_completion( - self, - ctx: &mut InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `modify_before_attempt_completion` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = - interceptor.modify_before_attempt_completion(&mut ctx, runtime_components, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::modify_before_attempt_completion) - } - - pub fn read_after_attempt( - self, - ctx: &InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `read_after_attempt` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = - interceptor.read_after_attempt(&ctx, runtime_components, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_after_attempt) - } - - pub fn modify_before_completion( - self, - ctx: &mut InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `modify_before_completion` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = - interceptor.modify_before_completion(&mut ctx, runtime_components, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::modify_before_completion) - } - - pub fn read_after_execution( - self, - ctx: &InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `read_after_execution` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.into_iter() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = - interceptor.read_after_execution(&ctx, runtime_components, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_after_execution) - } -} - -#[cfg(all(test, feature = "test-util"))] -mod tests { - use crate::client::interceptors::context::Input; - use crate::client::interceptors::{ - disable_interceptor, BeforeTransmitInterceptorContextRef, BoxError, Interceptor, - InterceptorContext, Interceptors, SharedInterceptor, - }; - use crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder}; - use aws_smithy_types::config_bag::ConfigBag; - - #[derive(Debug)] - struct TestInterceptor; - impl Interceptor for TestInterceptor {} - - #[test] - fn test_disable_interceptors() { - #[derive(Debug)] - struct PanicInterceptor; - impl Interceptor for PanicInterceptor { - fn read_before_transmit( - &self, - _context: &BeforeTransmitInterceptorContextRef<'_>, - _rc: &RuntimeComponents, - _cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - Err("boom".into()) - } - } - let rc = RuntimeComponentsBuilder::for_tests() - .with_interceptor(SharedInterceptor::new(PanicInterceptor)) - .with_interceptor(SharedInterceptor::new(TestInterceptor)) - .build() - .unwrap(); - - let mut cfg = ConfigBag::base(); - let interceptors = Interceptors::new(rc.interceptors()); - assert_eq!( - interceptors - .into_iter() - .filter(|i| i.if_enabled(&cfg).is_some()) - .count(), - 2 - ); - - Interceptors::new(rc.interceptors()) - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) - .expect_err("interceptor returns error"); - cfg.interceptor_state() - .store_put(disable_interceptor::("test")); - assert_eq!( - Interceptors::new(rc.interceptors()) - .into_iter() - .filter(|i| i.if_enabled(&cfg).is_some()) - .count(), - 1 - ); - // shouldn't error because interceptors won't run - Interceptors::new(rc.interceptors()) - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) - .expect("interceptor is now disabled"); - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index b97915dcbb9..7aeb1904c31 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -37,9 +37,13 @@ use std::{fmt, mem}; use tracing::{debug, error, trace}; // TODO(enableNewSmithyRuntimeLaunch): New-type `Input`/`Output`/`Error` +/// Type-erased operation input. pub type Input = TypeErasedBox; +/// Type-erased operation output. pub type Output = TypeErasedBox; +/// Type-erased operation error. pub type Error = TypeErasedError; +/// Type-erased result for an operation. pub type OutputOrError = Result>; type Request = HttpRequest; @@ -89,38 +93,7 @@ impl InterceptorContext { } } -impl InterceptorContext { - /// Decomposes the context into its constituent parts. - #[doc(hidden)] - #[allow(clippy::type_complexity)] - pub fn into_parts( - self, - ) -> ( - Option, - Option>>, - Option, - Option, - ) { - ( - self.input, - self.output_or_error, - self.request, - self.response, - ) - } - - pub fn finalize(self) -> Result> { - let Self { - output_or_error, - response, - phase, - .. - } = self; - output_or_error - .expect("output_or_error must always be set before finalize is called.") - .map_err(|error| OrchestratorError::into_sdk_error(error, &phase, response)) - } - +impl InterceptorContext { /// Retrieve the input for the operation being invoked. pub fn input(&self) -> Option<&I> { self.input.as_ref() @@ -188,6 +161,14 @@ impl InterceptorContext { self.output_or_error.as_mut() } + /// Return `true` if this context's `output_or_error` is an error. Otherwise, return `false`. + pub fn is_failed(&self) -> bool { + self.output_or_error + .as_ref() + .map(Result::is_err) + .unwrap_or_default() + } + /// Advance to the Serialization phase. #[doc(hidden)] pub fn enter_serialization_phase(&mut self) { @@ -314,6 +295,44 @@ impl InterceptorContext { self.output_or_error = None; RewindResult::Occurred } +} + +impl InterceptorContext +where + E: Debug, +{ + /// Decomposes the context into its constituent parts. + #[doc(hidden)] + #[allow(clippy::type_complexity)] + pub fn into_parts( + self, + ) -> ( + Option, + Option>>, + Option, + Option, + ) { + ( + self.input, + self.output_or_error, + self.request, + self.response, + ) + } + + /// Convert this context into the final operation result that is returned in client's the public API. + #[doc(hidden)] + pub fn finalize(self) -> Result> { + let Self { + output_or_error, + response, + phase, + .. + } = self; + output_or_error + .expect("output_or_error must always be set before finalize is called.") + .map_err(|error| OrchestratorError::into_sdk_error(error, &phase, response)) + } /// Mark this context as failed due to errors during the operation. Any errors already contained /// by the context will be replaced by the given error. @@ -328,14 +347,6 @@ impl InterceptorContext { error!("orchestrator context received an error but one was already present; Throwing away previous error: {:?}", existing_err); } } - - /// Return `true` if this context's `output_or_error` is an error. Otherwise, return `false`. - pub fn is_failed(&self) -> bool { - self.output_or_error - .as_ref() - .map(Result::is_err) - .unwrap_or_default() - } } /// The result of attempting to rewind a request. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs index 64ebdbe08a6..77f751e1369 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs @@ -8,191 +8,222 @@ use crate::client::interceptors::context::{Request, Response}; use crate::client::orchestrator::OrchestratorError; use std::fmt::Debug; -macro_rules! output { - (&Option>) => { - Option> - }; - (&Option<$ty:ty>) => { - Option<&$ty> - }; - (&mut Option<$ty:ty>) => { - Option<&mut $ty> - }; - (&Result<$o_ty:ty, $e_ty:ty>) => { - Result<&$o_ty, &$e_ty> - }; - (&$($tt:tt)+) => { - &$($tt)+ - }; - (&mut $($tt:tt)+) => { - &mut $($tt)+ - }; -} - -macro_rules! declare_method { - (&mut $name:ident, $inner_name:ident, $doc:literal, Option<$ty:ty>) => { - #[doc=$doc] - pub fn $name(&mut self) -> Option<&mut $ty> { - self.inner.$inner_name.as_ref() - } - }; - (&$name:ident, $inner_name:ident, $doc:literal, Option<$ty:ty>) => { - #[doc=$doc] - pub fn $name(&self) -> Option<$ty> { - self.inner.$inner_name.as_mut() - } - }; - (&mut $name:ident, $doc:literal, $($tt:tt)+) => { - #[doc=$doc] - pub fn $name(&mut self) -> output!(&mut $($tt)+) { - self.inner.$name().expect(concat!("`", stringify!($name), "` wasn't set in the underlying interceptor context. This is a bug.")) +macro_rules! impl_from_interceptor_context { + (ref $wrapper:ident) => { + impl<'a, I, O, E> From<&'a InterceptorContext> for $wrapper<'a, I, O, E> { + fn from(inner: &'a InterceptorContext) -> Self { + Self { inner } + } } }; - (&$name:ident, $doc:literal, $($tt:tt)+) => { - #[doc=$doc] - pub fn $name(&self) -> output!(&$($tt)+) { - self.inner.$name().expect(concat!("`", stringify!($name), "` wasn't set in the underlying interceptor context. This is a bug.")) + (mut $wrapper:ident) => { + impl<'a, I, O, E> From<&'a mut InterceptorContext> for $wrapper<'a, I, O, E> { + fn from(inner: &'a mut InterceptorContext) -> Self { + Self { inner } + } } }; } -macro_rules! declare_known_method { - (output_or_error: &mut $($tt:tt)+) => { - declare_method!(&mut output_or_error_mut, "Returns a mutable reference to the deserialized output or error.", $($tt)+); - }; - (output_or_error: &$($tt:tt)+) => { - declare_method!(&output_or_error, "Returns a reference to the deserialized output or error.", $($tt)+); - }; - (input: &mut $($tt:tt)+) => { - declare_method!(&mut input_mut, "Returns a mutable reference to the input.", $($tt)+); - }; - (input: &$($tt:tt)+) => { - declare_method!(&input, "Returns a reference to the input.", $($tt)+); - }; - (request: &mut $($tt:tt)+) => { - declare_method!(&mut request_mut, "Returns a mutable reference to the transmittable request for the operation being invoked.", $($tt)+); - }; - (request: &$($tt:tt)+) => { - declare_method!(&request, "Returns a reference to the transmittable request for the operation being invoked.", $($tt)+); - }; - (response: &mut $($tt:tt)+) => { - declare_method!(&mut response_mut, "Returns a mutable reference to the response.", $($tt)+); - }; - (response: &$($tt:tt)+) => { - declare_method!(&response, "Returns a reference to the response.", $($tt)+); +macro_rules! expect { + ($self:ident, $what:ident) => { + $self.inner.$what().expect(concat!( + "`", + stringify!($what), + "` wasn't set in the underlying interceptor context. This is a bug." + )) }; } -macro_rules! declare_wrapper { - (($ref_struct_name:ident readonly)$($tt:tt)+) => { - pub struct $ref_struct_name<'a, I = Input, O = Output, E = Error> { - inner: &'a InterceptorContext, - } +// +// BeforeSerializationInterceptorContextRef +// - impl<'a, I, O, E: Debug> From<&'a InterceptorContext> for $ref_struct_name<'a, I, O, E> - { - fn from(inner: &'a InterceptorContext) -> Self { - Self { inner } - } - } +/// Interceptor context for the `read_before_execution` and `read_before_serialization` hooks. +/// +/// Only the input is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeSerializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, +} - impl<'a, I, O, E: Debug> $ref_struct_name<'a, I, O, E> { - declare_ref_wrapper_methods!($($tt)+); - } - }; - (($ref_struct_name:ident $mut_struct_name:ident)$($tt:tt)+) => { - declare_wrapper!(($ref_struct_name readonly) $($tt)+); +impl_from_interceptor_context!(ref BeforeSerializationInterceptorContextRef); - pub struct $mut_struct_name<'a, I = Input, O = Output, E = Error> { - inner: &'a mut InterceptorContext, - } +impl<'a, I, O, E> BeforeSerializationInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the input. + pub fn input(&self) -> &I { + expect!(self, input) + } +} - impl<'a, I, O, E: Debug> From<&'a mut InterceptorContext> for $mut_struct_name<'a, I, O, E> - { - fn from(inner: &'a mut InterceptorContext) -> Self { - Self { inner } - } - } +// +// BeforeSerializationInterceptorContextMut +// - impl<'a, I, O, E: Debug> $mut_struct_name<'a, I, O, E> { - declare_ref_wrapper_methods!($($tt)+); - declare_mut_wrapper_methods!($($tt)+); - } - }; +/// Interceptor context for the `modify_before_serialization` hook. +/// +/// Only the input is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeSerializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> { + inner: &'a mut InterceptorContext, } -macro_rules! declare_ref_wrapper_methods { - (($field:ident: $($head:tt)+)$($tail:tt)+) => { - declare_known_method!($field: &$($head)+); - declare_ref_wrapper_methods!($($tail)+); - }; - (($field:ident: $($tt:tt)+)) => { - declare_known_method!($field: &$($tt)+); - }; +impl_from_interceptor_context!(mut BeforeSerializationInterceptorContextMut); + +impl<'a, I, O, E> BeforeSerializationInterceptorContextMut<'a, I, O, E> { + /// Returns a reference to the input. + pub fn input(&self) -> &I { + expect!(self, input) + } + + /// Returns a mutable reference to the input. + pub fn input_mut(&mut self) -> &mut I { + expect!(self, input_mut) + } } -macro_rules! declare_mut_wrapper_methods { - (($field:ident: $($head:tt)+)$($tail:tt)+) => { - declare_known_method!($field: &mut $($head)+); - declare_mut_wrapper_methods!($($tail)+); - }; - (($field:ident: $($tt:tt)+)) => { - declare_known_method!($field: &mut $($tt)+); - }; +// +// BeforeSerializationInterceptorContextRef +// + +/// Interceptor context for several hooks in between serialization and transmission. +/// +/// Only the request is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeTransmitInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, +} + +impl_from_interceptor_context!(ref BeforeTransmitInterceptorContextRef); + +impl<'a, I, O, E> BeforeTransmitInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the transmittable request for the operation being invoked. + pub fn request(&self) -> &Request { + expect!(self, request) + } +} + +// +// BeforeSerializationInterceptorContextMut +// + +/// Interceptor context for several hooks in between serialization and transmission. +/// +/// Only the request is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeTransmitInterceptorContextMut<'a, I = Input, O = Output, E = Error> { + inner: &'a mut InterceptorContext, +} + +impl_from_interceptor_context!(mut BeforeTransmitInterceptorContextMut); + +impl<'a, I, O, E> BeforeTransmitInterceptorContextMut<'a, I, O, E> { + /// Returns a reference to the transmittable request for the operation being invoked. + pub fn request(&self) -> &Request { + expect!(self, request) + } + + /// Returns a mutable reference to the transmittable request for the operation being invoked. + pub fn request_mut(&mut self) -> &mut Request { + expect!(self, request_mut) + } +} + +// +// BeforeDeserializationInterceptorContextRef +// + +/// Interceptor context for hooks before deserializing the response. +/// +/// Only the response is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, } -declare_wrapper!( - (BeforeSerializationInterceptorContextRef BeforeSerializationInterceptorContextMut) - (input: I) -); +impl_from_interceptor_context!(ref BeforeDeserializationInterceptorContextRef); -declare_wrapper!( - (BeforeTransmitInterceptorContextRef BeforeTransmitInterceptorContextMut) - (request: Request) -); +impl<'a, I, O, E> BeforeDeserializationInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the response. + pub fn response(&self) -> &Response { + expect!(self, response) + } +} + +// +// BeforeDeserializationInterceptorContextMut +// + +/// Interceptor context for hooks before deserializing the response. +/// +/// Only the response is available at this point in the operation. +pub struct BeforeDeserializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> { + inner: &'a mut InterceptorContext, +} -declare_wrapper!( - (BeforeDeserializationInterceptorContextRef BeforeDeserializationInterceptorContextMut) - (input: I) - (request: Request) - (response: Response) -); +impl_from_interceptor_context!(mut BeforeDeserializationInterceptorContextMut); + +impl<'a, I, O, E> BeforeDeserializationInterceptorContextMut<'a, I, O, E> { + /// Returns a reference to the response. + pub fn response(&self) -> &Response { + expect!(self, response) + } + + /// Returns a mutable reference to the response. + pub fn response_mut(&mut self) -> &mut Response { + expect!(self, response_mut) + } -impl<'a, I, O, E: Debug> BeforeDeserializationInterceptorContextMut<'a, I, O, E> { #[doc(hidden)] /// Downgrade this helper struct, returning the underlying InterceptorContext. There's no good /// reason to use this unless you're writing tests or you have to interact with an API that /// doesn't support the helper structs. - pub fn into_inner(&mut self) -> &'_ mut InterceptorContext { + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { self.inner } } -declare_wrapper!( - (AfterDeserializationInterceptorContextRef readonly) - (input: I) - (request: Request) - (response: Response) - (output_or_error: Result> -)); - -// Why are all the rest of these defined with a macro but these last two aren't? I simply ran out of -// time. Consider updating the macros to support these last two if you're looking for a challenge. -// - Zelda +// +// AfterDeserializationInterceptorContextRef +// -pub struct FinalizerInterceptorContextRef<'a, I = Input, O = Output, E = Error> { +/// Interceptor context for hooks after deserializing the response. +/// +/// The response and the deserialized output or error are available at this point in the operation. +pub struct AfterDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> { inner: &'a InterceptorContext, } -impl<'a, I, O, E: Debug> From<&'a InterceptorContext> - for FinalizerInterceptorContextRef<'a, I, O, E> -{ - fn from(inner: &'a InterceptorContext) -> Self { - Self { inner } +impl_from_interceptor_context!(ref AfterDeserializationInterceptorContextRef); + +impl<'a, I, O, E> AfterDeserializationInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the response. + pub fn response(&self) -> &Response { + expect!(self, response) + } + + /// Returns a reference to the deserialized output or error. + pub fn output_or_error(&self) -> Result<&O, &OrchestratorError> { + expect!(self, output_or_error) } } -impl<'a, I, O, E: Debug> FinalizerInterceptorContextRef<'a, I, O, E> { +// +// FinalizerInterceptorContextRef +// + +/// Interceptor context for finalization hooks. +/// +/// This context is used by the `read_after_attempt` and `read_after_execution` hooks +/// that are all called upon both success and failure, and may have varying levels +/// of context available depending on where a failure occurred if the operation failed. +pub struct FinalizerInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, +} + +impl_from_interceptor_context!(ref FinalizerInterceptorContextRef); + +impl<'a, I, O, E> FinalizerInterceptorContextRef<'a, I, O, E> { /// Returns the operation input. pub fn input(&self) -> Option<&I> { self.inner.input.as_ref() @@ -214,19 +245,22 @@ impl<'a, I, O, E: Debug> FinalizerInterceptorContextRef<'a, I, O, E> { } } +// +// FinalizerInterceptorContextMut +// + +/// Interceptor context for finalization hooks. +/// +/// This context is used by the `modify_before_attempt_completion` and `modify_before_completion` hooks +/// that are all called upon both success and failure, and may have varying levels +/// of context available depending on where a failure occurred if the operation failed. pub struct FinalizerInterceptorContextMut<'a, I = Input, O = Output, E = Error> { inner: &'a mut InterceptorContext, } -impl<'a, I, O, E: Debug> From<&'a mut InterceptorContext> - for FinalizerInterceptorContextMut<'a, I, O, E> -{ - fn from(inner: &'a mut InterceptorContext) -> Self { - Self { inner } - } -} +impl_from_interceptor_context!(mut FinalizerInterceptorContextMut); -impl<'a, I, O, E: Debug> FinalizerInterceptorContextMut<'a, I, O, E> { +impl<'a, I, O, E> FinalizerInterceptorContextMut<'a, I, O, E> { /// Returns the operation input. pub fn input(&self) -> Option<&I> { self.inner.input.as_ref() diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index cadeccf0d0c..f47169cb7bc 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -71,62 +71,110 @@ impl Storable for LoadedRequestBody { type Storer = StoreReplace; } -// TODO(enableNewSmithyRuntimeLaunch): Make OrchestratorError adhere to the errors RFC -/// Errors that can occur while running the orchestrator. #[derive(Debug)] -#[non_exhaustive] -pub enum OrchestratorError { +enum ErrorKind { /// An error occurred within an interceptor. - Interceptor { err: InterceptorError }, + Interceptor { source: InterceptorError }, /// An error returned by a service. Operation { err: E }, /// An error that occurs when a request times out. - Timeout { err: BoxError }, + Timeout { source: BoxError }, /// An error that occurs when request dispatch fails. - Connector { err: ConnectorError }, + Connector { source: ConnectorError }, /// An error that occurs when a response can't be deserialized. - Response { err: BoxError }, + Response { source: BoxError }, /// A general orchestrator error. - Other { err: BoxError }, + Other { source: BoxError }, } -impl OrchestratorError { - /// Create a new `OrchestratorError` from a [`BoxError`]. - pub fn other(err: impl Into>) -> Self { - let err = err.into(); - Self::Other { err } +/// Errors that can occur while running the orchestrator. +#[derive(Debug)] +pub struct OrchestratorError { + kind: ErrorKind, +} + +impl OrchestratorError { + /// Create a new `OrchestratorError` from the given source. + pub fn other(source: impl Into>) -> Self { + Self { + kind: ErrorKind::Other { + source: source.into(), + }, + } } - /// Create a new `OrchestratorError` from an error received from a service. + /// Create an operation error. pub fn operation(err: E) -> Self { - Self::Operation { err } + Self { + kind: ErrorKind::Operation { err }, + } } - /// Create a new `OrchestratorError::Interceptor` from an [`InterceptorError`]. - pub fn interceptor(err: InterceptorError) -> Self { - Self::Interceptor { err } + /// True if the underlying error is an operation error. + pub fn is_operation_error(&self) -> bool { + matches!(self.kind, ErrorKind::Operation { .. }) } - /// Create a new `OrchestratorError::Timeout` from a [`BoxError`]. - pub fn timeout(err: BoxError) -> Self { - Self::Timeout { err } + /// Return this orchestrator error as an operation error if possible. + pub fn as_operation_error(&self) -> Option<&E> { + match &self.kind { + ErrorKind::Operation { err } => Some(err), + _ => None, + } } - /// Create a new `OrchestratorError::Response` from a [`BoxError`]. - pub fn response(err: BoxError) -> Self { - Self::Response { err } + /// Create an interceptor error with the given source. + pub fn interceptor(source: InterceptorError) -> Self { + Self { + kind: ErrorKind::Interceptor { source }, + } } - /// Create a new `OrchestratorError::Connector` from a [`ConnectorError`]. - pub fn connector(err: ConnectorError) -> Self { - Self::Connector { err } + /// True if the underlying error is an interceptor error. + pub fn is_interceptor_error(&self) -> bool { + matches!(self.kind, ErrorKind::Interceptor { .. }) } - /// Convert the `OrchestratorError` into `Some` operation specific error if it is one. Otherwise, - /// return `None`. - pub fn as_operation_error(&self) -> Option<&E> { - match self { - Self::Operation { err } => Some(err), + /// Create a timeout error with the given source. + pub fn timeout(source: BoxError) -> Self { + Self { + kind: ErrorKind::Timeout { source }, + } + } + + /// True if the underlying error is a timeout error. + pub fn is_timeout_error(&self) -> bool { + matches!(self.kind, ErrorKind::Timeout { .. }) + } + + /// Create a response error with the given source. + pub fn response(source: BoxError) -> Self { + Self { + kind: ErrorKind::Response { source }, + } + } + + /// True if the underlying error is a response error. + pub fn is_response_error(&self) -> bool { + matches!(self.kind, ErrorKind::Response { .. }) + } + + /// Create a connector error with the given source. + pub fn connector(source: ConnectorError) -> Self { + Self { + kind: ErrorKind::Connector { source }, + } + } + + /// True if the underlying error is a [`ConnectorError`]. + pub fn is_connector_error(&self) -> bool { + matches!(self.kind, ErrorKind::Connector { .. }) + } + + /// Return this orchestrator error as a connector error if possible. + pub fn as_connector_error(&self) -> Option<&ConnectorError> { + match &self.kind { + ErrorKind::Connector { source } => Some(source), _ => None, } } @@ -137,34 +185,36 @@ impl OrchestratorError { phase: &Phase, response: Option, ) -> SdkError { - match self { - Self::Interceptor { err } => { + match self.kind { + ErrorKind::Interceptor { source } => { use Phase::*; match phase { - BeforeSerialization | Serialization => SdkError::construction_failure(err), + BeforeSerialization | Serialization => SdkError::construction_failure(source), BeforeTransmit | Transmit => match response { - Some(response) => SdkError::response_error(err, response), - None => SdkError::dispatch_failure(ConnectorError::other(err.into(), None)), + Some(response) => SdkError::response_error(source, response), + None => { + SdkError::dispatch_failure(ConnectorError::other(source.into(), None)) + } }, BeforeDeserialization | Deserialization | AfterDeserialization => { - SdkError::response_error(err, response.expect("phase has a response")) + SdkError::response_error(source, response.expect("phase has a response")) } } } - Self::Operation { err } => { + ErrorKind::Operation { err } => { debug_assert!(phase.is_after_deserialization(), "operation errors are a result of successfully receiving and parsing a response from the server. Therefore, we must be in the 'After Deserialization' phase."); SdkError::service_error(err, response.expect("phase has a response")) } - Self::Connector { err } => SdkError::dispatch_failure(err), - Self::Timeout { err } => SdkError::timeout_error(err), - Self::Response { err } => SdkError::response_error(err, response.unwrap()), - Self::Other { err } => { + ErrorKind::Connector { source } => SdkError::dispatch_failure(source), + ErrorKind::Timeout { source } => SdkError::timeout_error(source), + ErrorKind::Response { source } => SdkError::response_error(source, response.unwrap()), + ErrorKind::Other { source } => { use Phase::*; match phase { - BeforeSerialization | Serialization => SdkError::construction_failure(err), - BeforeTransmit | Transmit => convert_dispatch_error(err, response), + BeforeSerialization | Serialization => SdkError::construction_failure(source), + BeforeTransmit | Transmit => convert_dispatch_error(source, response), BeforeDeserialization | Deserialization | AfterDeserialization => { - SdkError::response_error(err, response.expect("phase has a response")) + SdkError::response_error(source, response.expect("phase has a response")) } } } @@ -202,12 +252,3 @@ impl From for OrchestratorError { Self::operation(err) } } - -impl From for OrchestratorError -where - E: Debug + std::error::Error + 'static, -{ - fn from(err: aws_smithy_http::byte_stream::error::Error) -> Self { - Self::other(err) - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index 3f95c9304a5..ebc9225a8a3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -4,8 +4,7 @@ */ #![warn( - // TODO(enableNewSmithyRuntimeLaunch): Add in remaining missing docs - // missing_docs, + missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs index 6e3d2aadfbb..1903198a954 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs @@ -72,7 +72,7 @@ impl Interceptor for ConnectionPoisoningInterceptor { .ok_or("retry classifiers are required for connection poisoning to work")?; let error_is_transient = retry_classifiers - .classify_retry(context.into_inner()) + .classify_retry(context.inner_mut()) .map(|reason| reason == RetryReason::Error(ErrorKind::TransientError)) .unwrap_or_default(); let connection_poisoning_is_enabled = diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index 396aeb60786..931866c6219 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -5,15 +5,246 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::context::{ + BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, + FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, +}; +use aws_smithy_runtime_api::client::interceptors::context::{ + Error, Input, InterceptorContext, Output, +}; +use aws_smithy_runtime_api::client::interceptors::{ + Interceptor, InterceptorError, SharedInterceptor, +}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_types::error::display::DisplayErrorContext; use std::error::Error as StdError; use std::fmt; use std::marker::PhantomData; +macro_rules! interceptor_impl_fn { + (mut $interceptor:ident) => { + pub(crate) fn $interceptor( + self, + ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!(concat!( + "running `", + stringify!($interceptor), + "` interceptors" + )); + let mut result: Result<(), BoxError> = Ok(()); + let mut ctx = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.$interceptor(&mut ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::$interceptor) + } + }; + (ref $interceptor:ident) => { + pub(crate) fn $interceptor( + self, + ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + let mut result: Result<(), BoxError> = Ok(()); + let ctx = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = interceptor.$interceptor(&ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::$interceptor) + } + }; +} + +#[derive(Debug)] +pub(crate) struct Interceptors { + interceptors: I, +} + +impl Interceptors +where + I: Iterator, +{ + pub(crate) fn new(interceptors: I) -> Self { + Self { interceptors } + } + + fn into_iter(self) -> impl Iterator { + self.interceptors.map(ConditionallyEnabledInterceptor) + } + + pub(crate) fn read_before_execution( + self, + operation: bool, + ctx: &InterceptorContext, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!( + "running {} `read_before_execution` interceptors", + if operation { "operation" } else { "client" } + ); + let mut result: Result<(), BoxError> = Ok(()); + let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::read_before_execution) + } + + interceptor_impl_fn!(mut modify_before_serialization); + interceptor_impl_fn!(ref read_before_serialization); + interceptor_impl_fn!(ref read_after_serialization); + interceptor_impl_fn!(mut modify_before_retry_loop); + interceptor_impl_fn!(ref read_before_attempt); + interceptor_impl_fn!(mut modify_before_signing); + interceptor_impl_fn!(ref read_before_signing); + interceptor_impl_fn!(ref read_after_signing); + interceptor_impl_fn!(mut modify_before_transmit); + interceptor_impl_fn!(ref read_before_transmit); + interceptor_impl_fn!(ref read_after_transmit); + interceptor_impl_fn!(mut modify_before_deserialization); + interceptor_impl_fn!(ref read_before_deserialization); + interceptor_impl_fn!(ref read_after_deserialization); + + pub(crate) fn modify_before_attempt_completion( + self, + ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `modify_before_attempt_completion` interceptors"); + let mut result: Result<(), BoxError> = Ok(()); + let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.modify_before_attempt_completion(&mut ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::modify_before_attempt_completion) + } + + pub(crate) fn read_after_attempt( + self, + ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `read_after_attempt` interceptors"); + let mut result: Result<(), BoxError> = Ok(()); + let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.read_after_attempt(&ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::read_after_attempt) + } + + pub(crate) fn modify_before_completion( + self, + ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `modify_before_completion` interceptors"); + let mut result: Result<(), BoxError> = Ok(()); + let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.modify_before_completion(&mut ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::modify_before_completion) + } + + pub(crate) fn read_after_execution( + self, + ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `read_after_execution` interceptors"); + let mut result: Result<(), BoxError> = Ok(()); + let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.read_after_execution(&ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!("{}", DisplayErrorContext(&*last_error)); + } + result = Err(new_error); + } + } + } + result.map_err(InterceptorError::read_after_execution) + } +} + +/// A interceptor wrapper to conditionally enable the interceptor based on +/// [`DisableInterceptor`](aws_smithy_runtime_api::client::interceptors::DisableInterceptor) +struct ConditionallyEnabledInterceptor(SharedInterceptor); +impl ConditionallyEnabledInterceptor { + fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { + if self.0.enabled(cfg) { + Some(self.0.as_ref()) + } else { + None + } + } +} + pub struct MapRequestInterceptor { f: F, _phantom: PhantomData, @@ -86,3 +317,71 @@ where Ok(()) } } + +#[cfg(all(test, feature = "test-util"))] +mod tests { + use super::*; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::interceptors::context::{ + BeforeTransmitInterceptorContextRef, Input, InterceptorContext, + }; + use aws_smithy_runtime_api::client::interceptors::{ + disable_interceptor, Interceptor, SharedInterceptor, + }; + use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, + }; + use aws_smithy_types::config_bag::ConfigBag; + + #[derive(Debug)] + struct TestInterceptor; + impl Interceptor for TestInterceptor {} + + #[test] + fn test_disable_interceptors() { + #[derive(Debug)] + struct PanicInterceptor; + impl Interceptor for PanicInterceptor { + fn read_before_transmit( + &self, + _context: &BeforeTransmitInterceptorContextRef<'_>, + _rc: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + Err("boom".into()) + } + } + let rc = RuntimeComponentsBuilder::for_tests() + .with_interceptor(SharedInterceptor::new(PanicInterceptor)) + .with_interceptor(SharedInterceptor::new(TestInterceptor)) + .build() + .unwrap(); + + let mut cfg = ConfigBag::base(); + let interceptors = Interceptors::new(rc.interceptors()); + assert_eq!( + interceptors + .into_iter() + .filter(|i| i.if_enabled(&cfg).is_some()) + .count(), + 2 + ); + + Interceptors::new(rc.interceptors()) + .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) + .expect_err("interceptor returns error"); + cfg.interceptor_state() + .store_put(disable_interceptor::("test")); + assert_eq!( + Interceptors::new(rc.interceptors()) + .into_iter() + .filter(|i| i.if_enabled(&cfg).is_some()) + .count(), + 1 + ); + // shouldn't error because interceptors won't run + Interceptors::new(rc.interceptors()) + .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) + .expect("interceptor is now disabled"); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 15c3b0791c2..2adaab14e25 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -7,6 +7,7 @@ #![allow(unknown_lints)] use self::auth::orchestrate_auth; +use crate::client::interceptors::Interceptors; use crate::client::orchestrator::endpoints::orchestrate_endpoint; use crate::client::orchestrator::http::read_body; use crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind}; @@ -19,7 +20,6 @@ use aws_smithy_runtime_api::client::connectors::HttpConnector; use aws_smithy_runtime_api::client::interceptors::context::{ Error, Input, InterceptorContext, Output, RewindResult, }; -use aws_smithy_runtime_api::client::interceptors::Interceptors; use aws_smithy_runtime_api::client::orchestrator::{ HttpResponse, LoadedRequestBody, OrchestratorError, }; @@ -200,7 +200,10 @@ async fn try_op( debug!("loading request body into memory"); let mut body = SdkBody::taken(); mem::swap(&mut body, ctx.request_mut().expect("set above").body_mut()); - let loaded_body = halt_on_err!([ctx] => ByteStream::new(body).collect().await).into_bytes(); + let loaded_body = halt_on_err!([ctx] => + ByteStream::new(body).collect().await.map_err(OrchestratorError::other) + ) + .into_bytes(); *ctx.request_mut().as_mut().expect("set above").body_mut() = SdkBody::from(loaded_body.clone()); cfg.interceptor_state() diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs index 86bbdde0f61..5ff4911f0fe 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs @@ -4,7 +4,6 @@ */ use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; use std::borrow::Cow; @@ -77,17 +76,16 @@ where Err(err) => err, }; - match error { - OrchestratorError::Response { .. } | OrchestratorError::Timeout { .. } => { - Some(RetryReason::Error(ErrorKind::TransientError)) - } - OrchestratorError::Connector { err } if err.is_timeout() || err.is_io() => { + if error.is_response_error() || error.is_timeout_error() { + Some(RetryReason::Error(ErrorKind::TransientError)) + } else if let Some(error) = error.as_connector_error() { + if error.is_timeout() || error.is_io() { Some(RetryReason::Error(ErrorKind::TransientError)) + } else { + error.as_other().map(RetryReason::Error) } - OrchestratorError::Connector { err } if err.is_other().is_some() => { - err.is_other().map(RetryReason::Error) - } - _ => None, + } else { + None } } From 5d0887034eccf2dec9d41615fba54b9c26b037b2 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 25 Jul 2023 12:59:20 -0700 Subject: [PATCH 034/331] Remove hybrid runtime modes (#2870) This PR removes the `both_default_middleware` and `both_default_orchestrator` runtime modes since they no longer compile, and there's no easy way to fix them with the divergences between the two in service config. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../rustsdk/AwsFluentClientDecorator.kt | 2 +- .../smithy/rustsdk/AwsPresigningDecorator.kt | 4 +- .../amazon/smithy/rustsdk/CredentialCaches.kt | 10 +- .../smithy/rustsdk/CredentialProviders.kt | 4 +- .../rustsdk/EndpointBuiltInsDecorator.kt | 4 +- .../HttpConnectorConfigCustomization.kt | 12 +- .../amazon/smithy/rustsdk/RegionDecorator.kt | 12 +- .../smithy/rustsdk/SigV4SigningDecorator.kt | 2 +- .../smithy/rustsdk/UserAgentDecorator.kt | 10 +- .../customize/DisabledAuthDecorator.kt | 2 +- .../timestream/TimestreamDecorator.kt | 2 +- .../test/kotlin/SdkCodegenIntegrationTest.kt | 4 +- .../rustsdk/CredentialCacheConfigTest.kt | 2 +- .../amazon/smithy/rustsdk/TestUtil.kt | 6 +- aws/sra-test/build.gradle.kts | 4 +- .../integration-tests/aws-sdk-s3/Cargo.toml | 4 +- .../benches/middleware_vs_orchestrator.rs | 5 +- .../aws-sdk-s3/tests/sra_test.rs | 45 -------- .../codegen/client/smithy/ClientRustModule.kt | 2 +- .../client/smithy/ClientRustSettings.kt | 28 +---- .../customizations/ApiKeyAuthDecorator.kt | 6 +- .../HttpConnectorConfigDecorator.kt | 12 +- .../ResiliencyConfigCustomization.kt | 16 +-- .../customizations/TimeSourceCustomization.kt | 10 +- .../endpoint/EndpointConfigCustomization.kt | 12 +- .../EndpointParamsInterceptorGenerator.kt | 2 +- .../smithy/generators/PaginatorGenerator.kt | 8 +- .../client/CustomizableOperationGenerator.kt | 2 +- .../client/FluentClientGenerator.kt | 107 ++++++------------ .../IdempotencyTokenProviderCustomization.kt | 10 +- .../config/ServiceConfigGenerator.kt | 22 ++-- .../protocol/ProtocolTestGenerator.kt | 8 +- .../testutil/TestConfigCustomization.kt | 10 +- .../customizations/HttpAuthDecoratorTest.kt | 14 +-- .../ClientContextConfigCustomizationTest.kt | 4 +- .../config/ServiceConfigGeneratorTest.kt | 12 +- 36 files changed, 155 insertions(+), 264 deletions(-) delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 2a558daf031..cf8b107a01d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -104,7 +104,7 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { baseGenerator.operationShape, renderClientCreation = { params -> rust("let mut ${params.configBuilderName} = ${params.configBuilderName};") - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { // TODO(enableNewSmithyRuntimeLaunch): A builder field could not be accessed directly in the orchestrator // mode when this code change was made. smithy-rs#2792 will enable us to use getters in builders. // Make this `set_region` conditional by checking if `config_builder.region().is_none()` once the PR diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index fc1833688c8..522b791fab6 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -286,13 +286,13 @@ class AwsPresignedFluentBuilderMethod( """, *codegenScope, "OpError" to section.operationErrorType, - "RawResponseType" to if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + "RawResponseType" to if (codegenContext.smithyRuntimeMode.generateMiddleware) { RuntimeType.smithyHttp(runtimeConfig).resolve("operation::Response") } else { RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse") }, ) { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { renderPresignedMethodBodyMiddleware() } else { renderPresignedMethodBody(section) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index 4f826ef35db..c25001cb303 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -66,7 +66,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom override fun section(section: ServiceConfig) = writable { when (section) { ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( """pub(crate) credentials_cache: #{SharedCredentialsCache},""", *codegenScope, @@ -75,7 +75,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom } ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Returns the credentials cache. @@ -99,7 +99,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom } ServiceConfig.BuilderStruct -> - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("credentials_cache: #{Option}<#{CredentialsCache}>,", *codegenScope) } @@ -116,7 +116,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Sets the credentials cache for this service @@ -142,7 +142,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom } ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ if let Some(credentials_provider) = layer.load::<#{SharedCredentialsProvider}>().cloned() { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 6be60295d5a..0437075d3ee 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -80,7 +80,7 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus override fun section(section: ServiceConfig) = writable { when (section) { ServiceConfig.BuilderStruct -> { - if (smithyRuntimeMode.defaultToMiddleware) { + if (smithyRuntimeMode.generateMiddleware) { rustTemplate("credentials_provider: #{Option}<#{SharedCredentialsProvider}>,", *codegenScope) } } @@ -96,7 +96,7 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus *codegenScope, ) - if (smithyRuntimeMode.defaultToOrchestrator) { + if (smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ /// Sets the credentials provider for this service diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index 1d79f10a6a5..e59eaa7bc8a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -141,7 +141,7 @@ fun decoratorForBuiltIn( override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? = when (parameter.builtIn) { builtIn.builtIn -> writable { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { val newtype = configParamNewtype(parameter, name, codegenContext.runtimeConfig) val symbol = parameter.symbol().mapRustType { t -> t.stripOuter() } rustTemplate( @@ -151,7 +151,7 @@ fun decoratorForBuiltIn( } else { rust("$configRef.$name") } - if (codegenContext.smithyRuntimeMode.defaultToMiddleware && parameter.type == ParameterType.STRING) { + if (codegenContext.smithyRuntimeMode.generateMiddleware && parameter.type == ParameterType.STRING) { rust(".clone()") } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt index 911ec7ea27f..d2d653e1b52 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt @@ -26,7 +26,7 @@ class HttpConnectorDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.exclusivelyGenerateMiddleware) { + baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateMiddleware) { it + HttpConnectorConfigCustomization(codegenContext) } } @@ -45,12 +45,12 @@ class HttpConnectorConfigCustomization( override fun section(section: ServiceConfig): Writable { return when (section) { is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) } } is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. @@ -73,7 +73,7 @@ class HttpConnectorConfigCustomization( } } is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) } } @@ -157,7 +157,7 @@ class HttpConnectorConfigCustomization( """, *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_http_connector(&mut self, http_connector: #{Option}>) -> &mut Self { @@ -180,7 +180,7 @@ class HttpConnectorConfigCustomization( } } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rust("http_connector: self.http_connector,") } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index 5c9a0669f69..5dacc952bdd 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -131,7 +131,7 @@ class RegionDecorator : ClientCodegenDecorator { override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { return when (parameter.builtIn) { Builtins.REGION.builtIn -> writable { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", "Region" to region(codegenContext.runtimeConfig).resolve("Region"), @@ -171,12 +171,12 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi override fun section(section: ServiceConfig) = writable { when (section) { ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) } } ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Returns the AWS region, if it was provided. @@ -200,7 +200,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi } ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) } } @@ -227,7 +227,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Sets the AWS region to use when making requests. @@ -253,7 +253,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi } ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rust("region: self.region,") } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt index a34c89f6e59..c7ba6f9c60e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt @@ -110,7 +110,7 @@ class SigV4SigningConfig( ) } ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ layer.store_put(#{SigningService}::from_static(${sigV4Trait.name.dq()})); diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index 0ca5ce335c2..bd38c4f7ed2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -154,7 +154,7 @@ class UserAgentDecorator : ClientCodegenDecorator { override fun section(section: ServiceConfig): Writable = when (section) { is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("app_name: #{Option}<#{AppName}>,", *codegenScope) } } @@ -174,7 +174,7 @@ class UserAgentDecorator : ClientCodegenDecorator { *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Sets the name of the app that is using the client. @@ -206,7 +206,7 @@ class UserAgentDecorator : ClientCodegenDecorator { } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rust("layer.store_put(#T.clone());", ClientRustModule.Meta.toType().resolve("API_METADATA")) } else { rust("app_name: self.app_name,") @@ -214,13 +214,13 @@ class UserAgentDecorator : ClientCodegenDecorator { } is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("app_name: #{Option}<#{AppName}>,", *codegenScope) } } is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Returns the name of the app that is using the client, if it was provided. diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt index 6cc7345dfac..98a37d778c6 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt @@ -39,7 +39,7 @@ class DisabledAuthDecorator() : ClientCodegenDecorator { val optionalOperations = optionalAuth[service.id]!! return ModelTransformer.create().mapShapes(model) { if (optionalOperations.contains(it.id) && it is OperationShape) { - if (settings.codegenConfig.enableNewSmithyRuntime.defaultToOrchestrator) { + if (settings.codegenConfig.enableNewSmithyRuntime.generateOrchestrator) { it.toBuilder().addTrait(OptionalAuthTrait()).build() } else { // In middleware, having an empty @auth trait completely disabled diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 44c7767bd32..57c033421cd 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -33,7 +33,7 @@ class TimestreamDecorator : ClientCodegenDecorator { override val order: Byte = -1 private fun applies(codegenContext: ClientCodegenContext): Boolean = - codegenContext.smithyRuntimeMode.defaultToOrchestrator + codegenContext.smithyRuntimeMode.generateOrchestrator override fun extraSections(codegenContext: ClientCodegenContext): List = emptyList().letIf(applies(codegenContext)) { diff --git a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt index 8ece4a5aa1e..02ae9071d33 100644 --- a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt @@ -50,7 +50,7 @@ class SdkCodegenIntegrationTest { fun smokeTestSdkCodegen() { awsSdkIntegrationTest( model, - defaultToOrchestrator = true, + generateOrchestrator = true, ) { _, _ -> /* it should compile */ } } @@ -58,7 +58,7 @@ class SdkCodegenIntegrationTest { fun smokeTestSdkCodegenMiddleware() { awsSdkIntegrationTest( model, - defaultToOrchestrator = false, + generateOrchestrator = false, ) { _, _ -> /* it should compile */ } } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt index 6d1d7f8adca..960d3adbaf3 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt @@ -48,7 +48,7 @@ internal class CredentialCacheConfigTest { @Test fun `config override for credentials`() { - awsSdkIntegrationTest(model, defaultToOrchestrator = true) { clientCodegenContext, rustCrate -> + awsSdkIntegrationTest(model, generateOrchestrator = true) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *RuntimeType.preludeScope, diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index ca5deedba85..5638aca8343 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -37,10 +37,10 @@ fun awsTestCodegenContext(model: Model? = null, settings: ClientRustSettings? = settings = settings ?: testClientRustSettings(runtimeConfig = AwsTestRuntimeConfig), ) -// TODO(enableNewSmithyRuntimeCleanup): Remove defaultToOrchestrator once the runtime switches to the orchestrator +// TODO(enableNewSmithyRuntimeCleanup): Remove generateOrchestrator once the runtime switches to the orchestrator fun awsSdkIntegrationTest( model: Model, - defaultToOrchestrator: Boolean = true, + generateOrchestrator: Boolean = true, test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> }, ) = clientIntegrationTest( @@ -62,7 +62,7 @@ fun awsSdkIntegrationTest( "codegen", ObjectNode.builder() .withMember("includeFluentClient", false) - .letIf(defaultToOrchestrator) { + .letIf(generateOrchestrator) { it.withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")) } .build(), diff --git a/aws/sra-test/build.gradle.kts b/aws/sra-test/build.gradle.kts index 669f231741c..a9bb7c328fa 100644 --- a/aws/sra-test/build.gradle.kts +++ b/aws/sra-test/build.gradle.kts @@ -65,8 +65,8 @@ val allCodegenTests = servicesToGenerate.map { , "codegen": { "includeFluentClient": false, - ${ ""/* "enableNewSmithyRuntime": "both_default_middleware" */ } - "enableNewSmithyRuntime": "orchestrator" + "enableNewSmithyRuntime": "orchestrator", + "includeEndpointUrlConfig": false }, "customizationConfig": { "awsSdk": { diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml b/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml index d8057c6de7d..82abf8c0945 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml +++ b/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml @@ -18,8 +18,8 @@ aws-types = { path = "../../../rust-runtime/aws-types" } criterion = { version = "0.4", features = ["async_tokio"] } http = "0.2.3" http-body = "0.4.5" -last-release-smithy-client = { version = "0.55", package = "aws-smithy-client", features = ["test-util", "rustls"] } -last-release-s3 = { version = "0.26", package = "aws-sdk-s3", features = ["test-util"] } +last-release-smithy-client = { version = "0.55.3", package = "aws-smithy-client", features = ["test-util", "rustls"] } +last-release-s3 = { version = "0.28", package = "aws-sdk-s3", features = ["test-util"] } tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.15", features = ["env-filter", "json"] } diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs b/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs index fd4e5440a68..b728a6fa141 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs +++ b/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs @@ -6,9 +6,6 @@ #[macro_use] extern crate criterion; use aws_sdk_s3 as s3; -use aws_smithy_runtime_api::client::interceptors::InterceptorRegistrar; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::ConfigBag; use criterion::{BenchmarkId, Criterion}; macro_rules! test_connection { @@ -92,7 +89,7 @@ async fn orchestrator(client: &s3::Client) { .list_objects_v2() .bucket("test-bucket") .prefix("prefix~") - .send_orchestrator() + .send() .await .expect("successful execution"); } diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs deleted file mode 100644 index 3e6c64be5d0..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod util; - -use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; -use std::time::{Duration, UNIX_EPOCH}; - -const LIST_BUCKETS_PATH: &str = "test-data/list-objects-v2.json"; - -#[tokio::test] -async fn sra_test() { - tracing_subscriber::fmt::init(); - - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .interceptor(util::TestUserAgentInterceptor) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - // To regenerate the test: - // conn.dump_to_file("test-data/list-objects-v2.json").unwrap(); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt index 93a0c2de162..afe7b705748 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt @@ -78,7 +78,7 @@ object ClientRustModule { val Endpoint = RustModule.public("endpoint") // TODO(enableNewSmithyRuntimeCleanup): Just use Config.endpoint directly and delete this function - fun endpoint(codegenContext: ClientCodegenContext): RustModule.LeafModule = if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + fun endpoint(codegenContext: ClientCodegenContext): RustModule.LeafModule = if (codegenContext.smithyRuntimeMode.generateMiddleware) { Endpoint } else { Config.endpoint diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index 908c936be2b..ca532b19b49 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -74,36 +74,16 @@ data class ClientRustSettings( // TODO(enableNewSmithyRuntimeCleanup): Remove this mode after switching to the orchestrator enum class SmithyRuntimeMode { - Middleware, BothDefaultMiddleware, BothDefaultOrchestrator, Orchestrator, + Middleware, Orchestrator, ; - val exclusivelyGenerateMiddleware: Boolean get() = generateMiddleware && !generateOrchestrator - - val generateMiddleware: Boolean - get() = when (this) { - Middleware, BothDefaultMiddleware, BothDefaultOrchestrator -> true - else -> false - } - - val generateOrchestrator: Boolean - get() = when (this) { - Orchestrator, BothDefaultMiddleware, BothDefaultOrchestrator -> true - else -> false - } - - val defaultToMiddleware: Boolean - get() = when (this) { - Middleware, BothDefaultMiddleware -> true - else -> false - } - val defaultToOrchestrator: Boolean get() = !defaultToMiddleware + val generateMiddleware: Boolean get() = this == Middleware + val generateOrchestrator: Boolean get() = this == Orchestrator companion object { fun fromString(value: String): SmithyRuntimeMode = when (value) { "middleware" -> Middleware "orchestrator" -> Orchestrator - "both_default_middleware" -> BothDefaultMiddleware - "both_default_orchestrator" -> BothDefaultOrchestrator else -> throw IllegalArgumentException("unknown runtime mode: $value") } } @@ -123,7 +103,7 @@ data class ClientCodegenConfig( val addMessageToErrors: Boolean = defaultAddMessageToErrors, // TODO(EventStream): [CLEANUP] Remove this property when turning on Event Stream for all services val eventStreamAllowList: Set = defaultEventStreamAllowList, - // TODO(SmithyRuntime): Remove this once we commit to switch to aws-smithy-runtime and aws-smithy-runtime-api + // TODO(enableNewSmithyRuntimeCleanup): Remove this once we commit to switch to aws-smithy-runtime and aws-smithy-runtime-api val enableNewSmithyRuntime: SmithyRuntimeMode = defaultEnableNewSmithyRuntime, /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */ val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt index 8c48d4ce1df..fb02e282719 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt @@ -189,19 +189,19 @@ private class ApiKeyConfigCustomization(codegenContext: ClientCodegenContext) : ) } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rust("layer.store_or_unset(self.api_key);") } else { rust("api_key: self.api_key,") } } is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("api_key: #{Option}<#{ApiKey}>,", *codegenScope) } } is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Returns API key used by the client, if it was provided. diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 94e0f47daf9..49dbce324bf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -115,13 +115,13 @@ private class HttpConnectorConfigCustomization( override fun section(section: ServiceConfig): Writable { return when (section) { is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) } } is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Return the [`SharedHttpConnector`](#{SharedHttpConnector}) to use when making requests, if any. @@ -145,7 +145,7 @@ private class HttpConnectorConfigCustomization( } is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) } } @@ -229,7 +229,7 @@ private class HttpConnectorConfigCustomization( """, *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { @@ -253,7 +253,7 @@ private class HttpConnectorConfigCustomization( } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( "#{set_connector}(&mut resolver);", "set_connector" to setConnectorFn(), @@ -264,7 +264,7 @@ private class HttpConnectorConfigCustomization( } is ServiceConfig.OperationConfigOverride -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( "#{set_connector}(&mut resolver);", "set_connector" to setConnectorFn(), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index fc74d456c3c..a79e2be6877 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -51,7 +51,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon writable { when (section) { is ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( """ retry_config: #{Option}<#{RetryConfig}>, @@ -64,7 +64,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon } is ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Return a reference to the retry configuration contained in this config, if any. @@ -117,7 +117,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon } is ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( """ retry_config: #{Option}<#{RetryConfig}>, @@ -167,7 +167,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { @@ -245,7 +245,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { @@ -313,7 +313,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { @@ -335,7 +335,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon ) } - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { Attribute.DocHidden.render(this) rustTemplate( """ @@ -367,7 +367,7 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon } is ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ let retry_partition = layer.load::<#{RetryPartition}>().cloned().unwrap_or_else(|| #{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index 44579aec51a..ab9a96155c6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -29,7 +29,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust writable { when (section) { is ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( """ pub(crate) time_source: #{SharedTimeSource}, @@ -45,7 +45,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust "pub fn time_source(&self) -> #{Option}<#{SharedTimeSource}>", *codegenScope, ) { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """self.runtime_components.time_source()""", *codegenScope, @@ -57,7 +57,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust } is ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( "time_source: #{Option}<#{SharedTimeSource}>,", *codegenScope, @@ -80,7 +80,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Sets the time source used for this service @@ -112,7 +112,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust } ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ if self.runtime_components.time_source().is_none() { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index 1cd523ad0f6..b1871c6ffca 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -45,7 +45,7 @@ internal class EndpointConfigCustomization( val resolverTrait = "#{SmithyResolver}<#{Params}>" when (section) { is ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( "pub (crate) endpoint_resolver: $sharedEndpointResolver,", *codegenScope, @@ -54,7 +54,7 @@ internal class EndpointConfigCustomization( } is ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Returns the endpoint resolver. @@ -78,7 +78,7 @@ internal class EndpointConfigCustomization( } is ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate( "endpoint_resolver: #{Option}<$sharedEndpointResolver>,", *codegenScope, @@ -181,7 +181,7 @@ internal class EndpointConfigCustomization( *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { @@ -205,7 +205,7 @@ internal class EndpointConfigCustomization( } ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( "#{set_endpoint_resolver}(&mut resolver);", "set_endpoint_resolver" to setEndpointResolverFn(), @@ -224,7 +224,7 @@ internal class EndpointConfigCustomization( } is ServiceConfig.OperationConfigOverride -> { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( "#{set_endpoint_resolver}(&mut resolver);", "set_endpoint_resolver" to setEndpointResolverFn(), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index 6b994105129..2cd374ad6e1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -106,7 +106,7 @@ class EndpointParamsInterceptorGenerator( val builtInParams = params.toList().filter { it.isBuiltIn } // first load builtins and their defaults builtInParams.forEach { param -> - val config = if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + val config = if (codegenContext.smithyRuntimeMode.generateOrchestrator) { "cfg" } else { "_config" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index 3f86fe720d3..f68aed2dec5 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -204,14 +204,14 @@ class PaginatorGenerator private constructor( "items_fn" to itemsFn(), "output_token" to outputTokenLens, "item_type" to writable { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}>>", *codegenScope) } else { rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) } }, "orchestrate" to writable { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rustTemplate( """ { @@ -237,7 +237,7 @@ class PaginatorGenerator private constructor( } }, "runtime_plugin_init" to writable { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ let runtime_plugins = #{operation}::operation_runtime_plugins( @@ -317,7 +317,7 @@ class PaginatorGenerator private constructor( paginationInfo.itemsMemberPath, ), "item_type" to writable { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}>>", *codegenScope) } else { rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 4046d29e7fb..5c2c4e63ebc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -374,7 +374,7 @@ fun renderCustomizableOperationSend(codegenContext: ClientCodegenContext, generi """, *codegenScope, ) - } else if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + } else if (codegenContext.smithyRuntimeMode.generateMiddleware) { writer.rustTemplate( """ impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 368d70ae433..d7fb4560b5f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -347,7 +347,7 @@ class FluentClientGenerator( } """, *preludeScope, - "RawResponseType" to if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + "RawResponseType" to if (codegenContext.smithyRuntimeMode.generateMiddleware) { RuntimeType.smithyHttp(runtimeConfig).resolve("operation::Response") } else { RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse") @@ -437,36 +437,7 @@ class FluentClientGenerator( generics.toRustGenerics(), ), ) - rustTemplate( - """ - // This function will go away in the near future. Do not rely on it. - ##[doc(hidden)] - pub async fn customize_middleware(self) -> #{Result}< - #{CustomizableOperation}#{customizable_op_type_params:W}, - #{SdkError}<#{OperationError}> - > #{send_bounds:W} { - let handle = self.handle.clone(); - let operation = self.inner.build().map_err(#{SdkError}::construction_failure)? - .make_operation(&handle.conf) - .await - .map_err(#{SdkError}::construction_failure)?; - #{Ok}(#{CustomizableOperation} { handle, operation }) - } - - // This function will go away in the near future. Do not rely on it. - ##[doc(hidden)] - pub async fn send_middleware(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}>> - #{send_bounds:W} { - let op = self.inner.build().map_err(#{SdkError}::construction_failure)? - .make_operation(&self.handle.conf) - .await - .map_err(#{SdkError}::construction_failure)?; - self.handle.client.call(op).await - } - """, - *middlewareScope, - ) - if (smithyRuntimeMode.defaultToMiddleware) { + if (smithyRuntimeMode.generateMiddleware) { rustTemplate( """ /// Sends the request and returns the response. @@ -479,7 +450,11 @@ class FluentClientGenerator( /// set when configuring the client. pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}>> #{send_bounds:W} { - self.send_middleware().await + let op = self.inner.build().map_err(#{SdkError}::construction_failure)? + .make_operation(&self.handle.conf) + .await + .map_err(#{SdkError}::construction_failure)?; + self.handle.client.call(op).await } /// Consumes this builder, creating a customizable operation that can be modified before being @@ -488,7 +463,12 @@ class FluentClientGenerator( #{CustomizableOperation}#{customizable_op_type_params:W}, #{SdkError}<#{OperationError}> > #{send_bounds:W} { - self.customize_middleware().await + let handle = self.handle.clone(); + let operation = self.inner.build().map_err(#{SdkError}::construction_failure)? + .make_operation(&handle.conf) + .await + .map_err(#{SdkError}::construction_failure)?; + #{Ok}(#{CustomizableOperation} { handle, operation }) } """, *middlewareScope, @@ -511,45 +491,7 @@ class FluentClientGenerator( .resolve("internal::SendResult"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) - rustTemplate( - """ - ##[doc(hidden)] - pub async fn send_orchestrator(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; - let runtime_plugins = #{Operation}::operation_runtime_plugins( - self.handle.runtime_plugins.clone(), - &self.handle.conf, - self.config_override, - ); - #{Operation}::orchestrate(&runtime_plugins, input).await - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Remove `async` once we switch to orchestrator - pub async fn customize_orchestrator( - self, - ) -> #{CustomizableOperation}< - #{OperationOutput}, - #{OperationError}, - > - { - #{CustomizableOperation} { - customizable_send: #{Box}::new(move |config_override| { - #{Box}::pin(async { - self.config_override(config_override) - .send_orchestrator() - .await - }) - }), - config_override: None, - interceptors: vec![], - runtime_plugins: vec![], - } - } - """, - *orchestratorScope, - ) - if (smithyRuntimeMode.defaultToOrchestrator) { + if (smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ /// Sends the request and returns the response. @@ -561,7 +503,13 @@ class FluentClientGenerator( /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be /// set when configuring the client. pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - self.send_orchestrator().await + let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; + let runtime_plugins = #{Operation}::operation_runtime_plugins( + self.handle.runtime_plugins.clone(), + &self.handle.conf, + self.config_override, + ); + #{Operation}::orchestrate(&runtime_plugins, input).await } /// Consumes this builder, creating a customizable operation that can be modified before being @@ -577,7 +525,18 @@ class FluentClientGenerator( #{SdkError}<#{OperationError}>, > { - #{Ok}(self.customize_orchestrator().await) + #{Ok}(#{CustomizableOperation} { + customizable_send: #{Box}::new(move |config_override| { + #{Box}::pin(async { + self.config_override(config_override) + .send() + .await + }) + }), + config_override: None, + interceptors: vec![], + runtime_plugins: vec![], + }) } """, *orchestratorScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt index 58a3a674381..2606ff5f439 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt @@ -29,13 +29,13 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext override fun section(section: ServiceConfig): Writable { return when (section) { is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("pub (crate) idempotency_token_provider: #{IdempotencyTokenProvider},", *codegenScope) } } ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Returns a copy of the idempotency token provider. @@ -63,7 +63,7 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext } ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rustTemplate("idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>,", *codegenScope) } } @@ -80,7 +80,7 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ /// Sets the idempotency token provider to use for service calls that require tokens. @@ -106,7 +106,7 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext } ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ if !resolver.is_set::<#{IdempotencyTokenProvider}>() { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index ba400c85bf6..bfa244e8d40 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -196,7 +196,7 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext override fun section(section: ServiceConfig): Writable { return when (section) { ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { docsOrFallback(param.getterDocs) val t = when (param.optional) { true -> param.type.makeOptional() @@ -207,7 +207,7 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext } ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rust("${param.name}: #T,", param.type.makeOptional()) } } @@ -224,7 +224,7 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext ) docsOrFallback(param.setterDocs) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { @@ -249,7 +249,7 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext } ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { val default = "".letIf(!param.optional) { ".unwrap_or_default() " } rust("${param.name}: self.${param.name}$default,") } @@ -334,7 +334,7 @@ class ServiceConfigGenerator( Attribute(Attribute.derive(RuntimeType.Debug)).render(writer) } writer.rustBlock("pub struct Config") { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ // Both `config` and `cloneable` are the same config, but the cloneable one @@ -353,7 +353,7 @@ class ServiceConfigGenerator( } } - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { // Custom implementation for Debug so we don't need to enforce Debug down the chain writer.rustBlock("impl std::fmt::Debug for Config") { writer.rustTemplate( @@ -374,7 +374,7 @@ class ServiceConfigGenerator( pub fn builder() -> Builder { Builder::default() } """, ) - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { writer.rustTemplate( """ /// Converts this config back into a builder so that it can be tweaked. @@ -394,13 +394,13 @@ class ServiceConfigGenerator( } writer.docs("Builder for creating a `Config`.") - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Default)).render(writer) } else { Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) } writer.rustBlock("pub struct Builder") { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ pub(crate) config: #{CloneableLayer}, @@ -415,7 +415,7 @@ class ServiceConfigGenerator( } } - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { // Custom implementation for Debug so we don't need to enforce Debug down the chain writer.rustBlock("impl std::fmt::Debug for Builder") { writer.rustTemplate( @@ -498,7 +498,7 @@ class ServiceConfigGenerator( } docs("Builds a [`Config`].") - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rust("##[allow(unused_mut)]") rustBlock("pub fn build(mut self) -> Config") { rustTemplate( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index e3f61df3b03..583324b0b67 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -70,7 +70,7 @@ class DefaultProtocolTestGenerator( override val operationShape: OperationShape, private val renderClientCreation: RustWriter.(ClientCreationParams) -> Unit = { params -> - if (params.codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (params.codegenContext.smithyRuntimeMode.generateMiddleware) { rustTemplate( """ let smithy_client = #{Builder}::new() @@ -347,7 +347,7 @@ class DefaultProtocolTestGenerator( """, RT.sdkBody(runtimeConfig = rc), ) - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rust( "let mut op_response = #T::new(http_response);", RT.operationModule(rc).resolve("Response"), @@ -397,7 +397,7 @@ class DefaultProtocolTestGenerator( val errorSymbol = codegenContext.symbolProvider.symbolForOperationError(operationShape) val errorVariant = codegenContext.symbolProvider.toSymbol(expectedShape).name rust("""let parsed = parsed.expect_err("should be error response");""") - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( """let parsed: &#{Error} = parsed.as_operation_error().expect("operation error").downcast_ref().unwrap();""", "Error" to codegenContext.symbolProvider.symbolForOperationError(operationShape), @@ -410,7 +410,7 @@ class DefaultProtocolTestGenerator( rust("panic!(\"wrong variant: Got: {:?}. Expected: {:?}\", parsed, expected_output);") } } else { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rust("let parsed = parsed.unwrap();") } else { rustTemplate( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt index 0f96cf3e0fe..dbfa3b3c6cf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt @@ -31,12 +31,12 @@ fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): override fun section(section: ServiceConfig): Writable = writable { when (section) { ServiceConfig.ConfigStruct -> { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rust("_$name: u64,") } } ServiceConfig.ConfigImpl -> { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ ##[allow(missing_docs)] @@ -61,12 +61,12 @@ fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): } } ServiceConfig.BuilderStruct -> { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rust("_$name: Option,") } } ServiceConfig.BuilderImpl -> { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ /// docs! @@ -93,7 +93,7 @@ fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): } } ServiceConfig.BuilderBuild -> { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { + if (codegenContext.smithyRuntimeMode.generateMiddleware) { rust( """ _$name: self._$name.unwrap_or(123), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index 474ed7b43e6..29f25e98aff 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -57,7 +57,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); @@ -91,7 +91,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); @@ -136,7 +136,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); @@ -182,7 +182,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); @@ -228,7 +228,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); @@ -274,7 +274,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); @@ -316,7 +316,7 @@ class HttpAuthDecoratorTest { .build_dyn(); let client = $moduleName::Client::with_config(smithy_client, config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); connector.assert_requests_match(&[]); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt index 94bd6524a1d..b855c313669 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt @@ -41,7 +41,7 @@ class ClientContextConfigCustomizationTest { val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) val context = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) project.unitTest { - if (smithyRuntimeMode.defaultToOrchestrator) { + if (smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ use #{RuntimePlugin}; @@ -74,7 +74,7 @@ class ClientContextConfigCustomizationTest { } // unset fields project.unitTest { - if (smithyRuntimeMode.defaultToOrchestrator) { + if (smithyRuntimeMode.generateOrchestrator) { rustTemplate( """ use #{RuntimePlugin}; diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index 9f8056931bb..fc439f764c3 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -96,13 +96,13 @@ internal class ServiceConfigGeneratorTest { return when (section) { ServiceConfig.ConfigStructAdditionalDocs -> emptySection ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rust("config_field: u64,") } } ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ ##[allow(missing_docs)] @@ -128,12 +128,12 @@ internal class ServiceConfigGeneratorTest { } ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rust("config_field: Option") } } ServiceConfig.BuilderImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { + if (runtimeMode.generateOrchestrator) { rustTemplate( """ ##[allow(missing_docs)] @@ -150,7 +150,7 @@ internal class ServiceConfigGeneratorTest { } } ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToMiddleware) { + if (runtimeMode.generateMiddleware) { rust("config_field: self.config_field.unwrap_or_default(),") } } @@ -170,7 +170,7 @@ internal class ServiceConfigGeneratorTest { val project = TestWorkspace.testProject(symbolProvider) project.withModule(ClientRustModule.config) { sut.render(this) - if (smithyRuntimeMode.defaultToOrchestrator) { + if (smithyRuntimeMode.generateOrchestrator) { unitTest( "set_config_fields", """ From 9a4156de0424e06ea8882c5bf4a24dd64c6c5fd6 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 26 Jul 2023 19:51:36 -0400 Subject: [PATCH 035/331] Remove vestiges of the old TimeSource implementation & refactor (#2877) ## Motivation and Context When `TimeSource` was created, we didn't carefully track down all the places and left a bit of existing implementation to limit the scope of the change. ## Description This removes the public (doc hidden) Testing code from aws-credential-types and our other test time sources instead. ## Testing - IT/UT ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 12 ++ aws/rust-runtime/aws-config/Cargo.toml | 1 + .../src/default_provider/credentials.rs | 17 +-- .../aws-config/src/imds/client.rs | 16 +- .../aws-config/src/imds/credentials.rs | 23 +-- aws/rust-runtime/aws-config/src/lib.rs | 5 +- .../aws-config/src/provider_config.rs | 10 +- .../aws-config/src/sts/assume_role.rs | 15 +- .../aws-credential-types/Cargo.toml | 2 +- .../src/cache/lazy_caching.rs | 90 ++++++----- .../aws-credential-types/src/lib.rs | 2 - .../aws-credential-types/src/time_source.rs | 142 ------------------ .../aws-smithy-async/src/test_util.rs | 34 ++++- 13 files changed, 131 insertions(+), 238 deletions(-) delete mode 100644 aws/rust-runtime/aws-credential-types/src/time_source.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 741a4540940..0018f2deda7 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -686,3 +686,15 @@ x-amzn-errortype: InvalidRequestException references = ["smithy-rs#2866"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "server" } author = "david-perez" + +[[aws-sdk-rust]] +message = """The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.""" +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" +references = ["smithy-rs#2877"] + +[[aws-sdk-rust]] +message = """The `doc(hidden)` `with_env` in `ProviderConfig` was removed.""" +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" +references = ["smithy-rs#2877"] diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index c19658d9c37..997f7b86eef 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -66,6 +66,7 @@ aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", fe # used for a usage example hyper-rustls = { version = "0.24", features = ["webpki-tokio", "http2", "http1"] } +aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs index 115cafcab16..a5e1fb0dc5d 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs @@ -199,6 +199,8 @@ impl Builder { #[cfg(test)] mod test { use aws_credential_types::provider::ProvideCredentials; + use aws_smithy_async::time::StaticTimeSource; + use std::time::UNIX_EPOCH; use crate::default_provider::credentials::DefaultCredentialsChain; @@ -279,21 +281,15 @@ mod test { make_test!(imds_no_iam_role); make_test!(imds_default_chain_error); make_test!(imds_default_chain_success, builder: |config| { - config.with_time_source(aws_credential_types::time_source::TimeSource::testing( - &aws_credential_types::time_source::TestingTimeSource::new(std::time::UNIX_EPOCH), - )) + config.with_time_source(StaticTimeSource::new(UNIX_EPOCH)) }); make_test!(imds_assume_role); make_test!(imds_config_with_no_creds, builder: |config| { - config.with_time_source(aws_credential_types::time_source::TimeSource::testing( - &aws_credential_types::time_source::TestingTimeSource::new(std::time::UNIX_EPOCH), - )) + config.with_time_source(StaticTimeSource::new(UNIX_EPOCH)) }); make_test!(imds_disabled); make_test!(imds_default_chain_retries, builder: |config| { - config.with_time_source(aws_credential_types::time_source::TimeSource::testing( - &aws_credential_types::time_source::TestingTimeSource::new(std::time::UNIX_EPOCH), - )) + config.with_time_source(StaticTimeSource::new(UNIX_EPOCH)) }); make_test!(ecs_assume_role); make_test!(ecs_credentials); @@ -335,7 +331,6 @@ mod test { async fn no_providers_configured_err() { use crate::provider_config::ProviderConfig; use aws_credential_types::provider::error::CredentialsError; - use aws_credential_types::time_source::TimeSource; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_client::erase::boxclone::BoxCloneService; use aws_smithy_client::never::NeverConnected; @@ -343,7 +338,7 @@ mod test { tokio::time::pause(); let conf = ProviderConfig::no_configuration() .with_tcp_connector(BoxCloneService::new(NeverConnected::new())) - .with_time_source(TimeSource::default()) + .with_time_source(StaticTimeSource::new(UNIX_EPOCH)) .with_sleep(TokioSleep::new()); let provider = DefaultCredentialsChain::builder() .configure(conf) diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index cb77b0759d5..f084bc9a832 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -571,8 +571,8 @@ impl ClassifyRetry, SdkError> for ImdsResponseRetryClassi pub(crate) mod test { use crate::imds::client::{Client, EndpointMode, ImdsResponseRetryClassifier}; use crate::provider_config::ProviderConfig; - use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::test_connection::{capture_request, TestConnection}; use aws_smithy_client::{SdkError, SdkSuccess}; @@ -700,14 +700,13 @@ pub(crate) mod test { imds_response(r#"test-imds-output2"#), ), ]); - let mut time_source = TestingTimeSource::new(UNIX_EPOCH); - tokio::time::pause(); + let (time_source, sleep) = instant_time_and_sleep(UNIX_EPOCH); let client = super::Client::builder() .configure( &ProviderConfig::no_configuration() .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(TimeSource::testing(&time_source)) - .with_sleep(TokioSleep::new()), + .with_time_source(time_source.clone()) + .with_sleep(sleep), ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) @@ -752,14 +751,13 @@ pub(crate) mod test { imds_response(r#"test-imds-output3"#), ), ]); - tokio::time::pause(); - let mut time_source = TestingTimeSource::new(UNIX_EPOCH); + let (time_source, sleep) = instant_time_and_sleep(UNIX_EPOCH); let client = super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_sleep(TokioSleep::new()) + .with_sleep(sleep) .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(TimeSource::testing(&time_source)), + .with_time_source(time_source.clone()), ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index c0c5707f24b..ccc65eaf992 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -306,8 +306,7 @@ mod test { }; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::ProvideCredentials; - use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; - use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::test_connection::TestConnection; use tracing_test::traced_test; @@ -369,16 +368,12 @@ mod test { // set to 2021-09-21T04:16:50Z that makes returned credentials' expiry (2021-09-21T04:16:53Z) // not stale let time_of_request_to_fetch_credentials = UNIX_EPOCH + Duration::from_secs(1632197810); - let time_source = TimeSource::testing(&TestingTimeSource::new( - time_of_request_to_fetch_credentials, - )); - - tokio::time::pause(); + let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials); let provider_config = ProviderConfig::no_configuration() .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(time_source) - .with_sleep(TokioSleep::new()); + .with_sleep(sleep) + .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) .build() @@ -419,16 +414,12 @@ mod test { // set to 2021-09-21T17:41:25Z that renders fetched credentials already expired (2021-09-21T04:16:53Z) let time_of_request_to_fetch_credentials = UNIX_EPOCH + Duration::from_secs(1632246085); - let time_source = TimeSource::testing(&TestingTimeSource::new( - time_of_request_to_fetch_credentials, - )); - - tokio::time::pause(); + let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials); let provider_config = ProviderConfig::no_configuration() .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(time_source) - .with_sleep(TokioSleep::new()); + .with_sleep(sleep) + .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) .build() diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 154659377fb..e7c035ea803 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -620,9 +620,8 @@ mod loader { let credentials_cache = if credentials_provider.is_some() { Some(self.credentials_cache.unwrap_or_else(|| { - let mut builder = CredentialsCache::lazy_builder().time_source( - aws_credential_types::time_source::TimeSource::shared(conf.time_source()), - ); + let mut builder = + CredentialsCache::lazy_builder().time_source(conf.time_source()); builder.set_sleep(conf.sleep()); builder.into_credentials_cache() })) diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index 27bc23108dd..3712376b425 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -5,7 +5,6 @@ //! Configuration Options for Credential Providers -use aws_credential_types::time_source::TimeSource; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::SharedTimeSource; use aws_smithy_client::erase::DynConnector; @@ -282,7 +281,7 @@ impl ProviderConfig { } } - #[doc(hidden)] + #[cfg(test)] pub fn with_env(self, env: Env) -> Self { ProviderConfig { parsed_profile: Default::default(), @@ -291,8 +290,11 @@ impl ProviderConfig { } } - #[doc(hidden)] - pub fn with_time_source(self, time_source: TimeSource) -> Self { + /// Override the time source for this configuration + pub fn with_time_source( + self, + time_source: impl aws_smithy_async::time::TimeSource + 'static, + ) -> Self { ProviderConfig { time_source: SharedTimeSource::new(time_source), ..self diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 50a83b4b6d3..90cd91195f8 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -291,9 +291,10 @@ mod test { use crate::sts::AssumeRoleProvider; use aws_credential_types::credential_fn::provide_credentials_fn; use aws_credential_types::provider::ProvideCredentials; - use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; use aws_credential_types::Credentials; use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::instant_time_and_sleep; + use aws_smithy_async::time::StaticTimeSource; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::test_connection::{capture_request, TestConnection}; use aws_smithy_http::body::SdkBody; @@ -305,9 +306,9 @@ mod test { let (server, request) = capture_request(None); let provider_conf = ProviderConfig::empty() .with_sleep(TokioSleep::new()) - .with_time_source(TimeSource::testing(&TestingTimeSource::new( + .with_time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), - ))) + )) .with_http_connector(DynConnector::new(server)); let provider = AssumeRoleProvider::builder("myrole") .configure(&provider_conf) @@ -335,13 +336,13 @@ mod test { )).unwrap()), ]); - let mut testing_time_source = TestingTimeSource::new( + let (testing_time_source, sleep) = instant_time_and_sleep( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), // 1234567890 since UNIX_EPOCH is 2009-02-13T23:31:30Z ); let provider_conf = ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_time_source(TimeSource::testing(&testing_time_source)) + .with_sleep(sleep) + .with_time_source(testing_time_source.clone()) .with_http_connector(DynConnector::new(conn)); let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![ Credentials::new( @@ -371,8 +372,6 @@ mod test { } })); - tokio::time::pause(); - let creds_first = provider .provide_credentials() .await diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index cbd1426fe2a..e109667525a 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -20,7 +20,7 @@ tracing = "0.1" zeroize = "1" [dev-dependencies] -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } +aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio", "test-util"] } # used to test compatibility async-trait = "0.1.51" diff --git a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs b/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs index ae1a6e2d36e..6169c2b930b 100644 --- a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs +++ b/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs @@ -5,16 +5,16 @@ //! Lazy, credentials cache implementation -use std::time::{Duration, Instant}; +use std::time::Duration; use aws_smithy_async::future::timeout::Timeout; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::SharedTimeSource; use tracing::{debug, info, info_span, Instrument}; use crate::cache::{ExpiringCache, ProvideCachedCredentials}; use crate::provider::SharedCredentialsProvider; use crate::provider::{error::CredentialsError, future, ProvideCredentials}; -use crate::time_source::TimeSource; const DEFAULT_LOAD_TIMEOUT: Duration = Duration::from_secs(5); const DEFAULT_CREDENTIAL_EXPIRATION: Duration = Duration::from_secs(15 * 60); @@ -23,7 +23,7 @@ const DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = fastrand::f64; #[derive(Debug)] pub(crate) struct LazyCredentialsCache { - time: TimeSource, + time: SharedTimeSource, sleeper: SharedAsyncSleep, cache: ExpiringCache, provider: SharedCredentialsProvider, @@ -35,7 +35,7 @@ pub(crate) struct LazyCredentialsCache { impl LazyCredentialsCache { fn new( - time: TimeSource, + time: SharedTimeSource, sleeper: SharedAsyncSleep, provider: SharedCredentialsProvider, load_timeout: Duration, @@ -79,7 +79,7 @@ impl ProvideCachedCredentials for LazyCredentialsCache { // since the futures are not eagerly executed, and the cache will only run one // of them. let future = Timeout::new(provider.provide_credentials(), timeout_future); - let start_time = Instant::now(); + let start_time = self.time.now(); let result = cache .get_or_load(|| { let span = info_span!("lazy_load_credentials"); @@ -111,14 +111,14 @@ impl ProvideCachedCredentials for LazyCredentialsCache { // only once for the first thread that succeeds in populating a cache value. info!( "credentials cache miss occurred; added new AWS credentials (took {:?})", - start_time.elapsed() + self.time.now().duration_since(start_time) ); Ok((credentials, expiry + jitter)) } - // Only instrument the the actual load future so that no span - // is opened if the cache decides not to execute it. - .instrument(span) + // Only instrument the the actual load future so that no span + // is opened if the cache decides not to execute it. + .instrument(span) }) .await; debug!("loaded credentials"); @@ -137,8 +137,8 @@ mod builder { use crate::cache::{CredentialsCache, Inner}; use crate::provider::SharedCredentialsProvider; use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; + use aws_smithy_async::time::SharedTimeSource; - use super::TimeSource; use super::{ LazyCredentialsCache, DEFAULT_BUFFER_TIME, DEFAULT_BUFFER_TIME_JITTER_FRACTION, DEFAULT_CREDENTIAL_EXPIRATION, DEFAULT_LOAD_TIMEOUT, @@ -159,7 +159,7 @@ mod builder { #[derive(Clone, Debug, Default)] pub struct Builder { sleep: Option, - time_source: Option, + time_source: Option, load_timeout: Option, buffer_time: Option, buffer_time_jitter_fraction: Option f64>, @@ -193,13 +193,13 @@ mod builder { } #[doc(hidden)] // because they only exist for tests - pub fn time_source(mut self, time_source: TimeSource) -> Self { + pub fn time_source(mut self, time_source: SharedTimeSource) -> Self { self.set_time_source(Some(time_source)); self } #[doc(hidden)] // because they only exist for tests - pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { + pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { self.time_source = time_source; self } @@ -346,37 +346,45 @@ mod tests { use std::time::{Duration, SystemTime, UNIX_EPOCH}; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; + use aws_smithy_async::test_util::{instant_time_and_sleep, ManualTimeSource}; + use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use tracing::info; use tracing_test::traced_test; use crate::provider::SharedCredentialsProvider; use crate::{ cache::ProvideCachedCredentials, credential_fn::provide_credentials_fn, - provider::error::CredentialsError, time_source::TestingTimeSource, Credentials, + provider::error::CredentialsError, Credentials, }; use super::{ - LazyCredentialsCache, TimeSource, DEFAULT_BUFFER_TIME, DEFAULT_CREDENTIAL_EXPIRATION, + LazyCredentialsCache, DEFAULT_BUFFER_TIME, DEFAULT_CREDENTIAL_EXPIRATION, DEFAULT_LOAD_TIMEOUT, }; const BUFFER_TIME_NO_JITTER: fn() -> f64 = || 0_f64; fn test_provider( - time: TimeSource, + time: impl TimeSource + 'static, buffer_time_jitter_fraction: fn() -> f64, load_list: Vec, ) -> LazyCredentialsCache { let load_list = Arc::new(Mutex::new(load_list)); LazyCredentialsCache::new( - time, + SharedTimeSource::new(time), SharedAsyncSleep::new(TokioSleep::new()), SharedCredentialsProvider::new(provide_credentials_fn(move || { let list = load_list.clone(); async move { - let next = list.lock().unwrap().remove(0); - info!("refreshing the credentials to {:?}", next); - next + let mut list = list.lock().unwrap(); + if list.len() > 0 { + let next = list.remove(0); + info!("refreshing the credentials to {:?}", next); + next + } else { + drop(list); + panic!("no more credentials") + } } })), DEFAULT_LOAD_TIMEOUT, @@ -405,13 +413,13 @@ mod tests { #[traced_test] #[tokio::test] async fn initial_populate_credentials() { - let time = TestingTimeSource::new(UNIX_EPOCH); + let time = ManualTimeSource::new(UNIX_EPOCH); let provider = SharedCredentialsProvider::new(provide_credentials_fn(|| async { info!("refreshing the credentials"); Ok(credentials(1000)) })); let credentials_cache = LazyCredentialsCache::new( - TimeSource::testing(&time), + SharedTimeSource::new(time), SharedAsyncSleep::new(TokioSleep::new()), provider, DEFAULT_LOAD_TIMEOUT, @@ -433,9 +441,9 @@ mod tests { #[traced_test] #[tokio::test] async fn reload_expired_credentials() { - let mut time = TestingTimeSource::new(epoch_secs(100)); + let time = ManualTimeSource::new(epoch_secs(100)); let credentials_cache = test_provider( - TimeSource::testing(&time), + time.clone(), BUFFER_TIME_NO_JITTER, vec![ Ok(credentials(1000)), @@ -457,9 +465,9 @@ mod tests { #[traced_test] #[tokio::test] async fn load_failed_error() { - let mut time = TestingTimeSource::new(epoch_secs(100)); + let time = ManualTimeSource::new(epoch_secs(100)); let credentials_cache = test_provider( - TimeSource::testing(&time), + time.clone(), BUFFER_TIME_NO_JITTER, vec![ Ok(credentials(1000)), @@ -484,9 +492,9 @@ mod tests { .build() .unwrap(); - let time = TestingTimeSource::new(epoch_secs(0)); + let time = ManualTimeSource::new(epoch_secs(0)); let credentials_cache = Arc::new(test_provider( - TimeSource::testing(&time), + time.clone(), BUFFER_TIME_NO_JITTER, vec![ Ok(credentials(500)), @@ -497,16 +505,15 @@ mod tests { ], )); - let locked_time = Arc::new(Mutex::new(time)); - - for i in 0..4 { + // credentials are available up until 4500 seconds after the unix epoch + // 4*50 = 200 tasks are launched => we can advance time 4500/20 => 225 seconds per advance + for _ in 0..4 { let mut tasks = Vec::new(); - for j in 0..50 { + for _ in 0..50 { let credentials_cache = credentials_cache.clone(); - let time = locked_time.clone(); + let time = time.clone(); tasks.push(rt.spawn(async move { - let now = epoch_secs(i * 1000 + (4 * j)); - time.lock().unwrap().set_time(now); + let now = time.advance(Duration::from_secs(22)); let creds = credentials_cache .provide_cached_credentials() @@ -529,15 +536,15 @@ mod tests { #[tokio::test] #[traced_test] async fn load_timeout() { - let time = TestingTimeSource::new(epoch_secs(100)); + let (time, sleep) = instant_time_and_sleep(epoch_secs(100)); let credentials_cache = LazyCredentialsCache::new( - TimeSource::testing(&time), - SharedAsyncSleep::new(TokioSleep::new()), + SharedTimeSource::new(time.clone()), + SharedAsyncSleep::new(sleep), SharedCredentialsProvider::new(provide_credentials_fn(|| async { aws_smithy_async::future::never::Never::new().await; Ok(credentials(1000)) })), - Duration::from_millis(5), + Duration::from_secs(5), DEFAULT_BUFFER_TIME, BUFFER_TIME_NO_JITTER, DEFAULT_CREDENTIAL_EXPIRATION, @@ -547,14 +554,15 @@ mod tests { credentials_cache.provide_cached_credentials().await, Err(CredentialsError::ProviderTimedOut { .. }) )); + assert_eq!(time.now(), epoch_secs(105)); } #[tokio::test] async fn buffer_time_jitter() { - let mut time = TestingTimeSource::new(epoch_secs(100)); + let time = ManualTimeSource::new(epoch_secs(100)); let buffer_time_jitter_fraction = || 0.5_f64; let credentials_cache = test_provider( - TimeSource::testing(&time), + time.clone(), buffer_time_jitter_fraction, vec![Ok(credentials(1000)), Ok(credentials(2000))], ); diff --git a/aws/rust-runtime/aws-credential-types/src/lib.rs b/aws/rust-runtime/aws-credential-types/src/lib.rs index b2f8330b589..de662f6a50d 100644 --- a/aws/rust-runtime/aws-credential-types/src/lib.rs +++ b/aws/rust-runtime/aws-credential-types/src/lib.rs @@ -21,7 +21,5 @@ pub mod cache; pub mod credential_fn; mod credentials_impl; pub mod provider; -#[doc(hidden)] -pub mod time_source; pub use credentials_impl::Credentials; diff --git a/aws/rust-runtime/aws-credential-types/src/time_source.rs b/aws/rust-runtime/aws-credential-types/src/time_source.rs deleted file mode 100644 index 212c7aa904a..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/time_source.rs +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_async::time::{SharedTimeSource, TimeSource as TimeSourceTrait}; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::time::{Duration, SystemTime}; - -impl TimeSourceTrait for TimeSource { - fn now(&self) -> SystemTime { - self.now() - } -} - -/// Time source abstraction -/// -/// Simple abstraction representing time either real-time or manually-specified for testing -#[derive(Debug, Clone)] -// TODO(breakingChangeWindow): Delete this struct -pub struct TimeSource(Inner); - -impl TimeSource { - /// Creates `TimeSource` from the manually specified `time_source`. - pub fn testing(time_source: &TestingTimeSource) -> Self { - TimeSource(Inner::Testing(time_source.clone())) - } - - /// Creates `TimeSource` from a shared time source - pub fn shared(time_source: SharedTimeSource) -> Self { - TimeSource(Inner::Shared(time_source)) - } - - /// Returns the current system time based on the mode. - pub fn now(&self) -> SystemTime { - match &self.0 { - Inner::Default => SystemTime::now(), - Inner::Testing(testing) => testing.now(), - Inner::Shared(ts) => ts.now(), - } - } -} - -impl Default for TimeSource { - /// Creates `TimeSource` from the current system time. - fn default() -> Self { - TimeSource(Inner::Default) - } -} - -/// Time Source that can be manually moved for tests -/// > This has been superseded by [`aws_smithy_async::time::TimeSource`] and will be removed in a -/// > future release. -/// -/// # Examples -/// -/// ```rust -/// # struct Client { -/// # // stub -/// # } -/// # -/// # impl Client { -/// # fn with_timesource(ts: TimeSource) -> Self { -/// # Client { } -/// # } -/// # } -/// use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; -/// use std::time::{UNIX_EPOCH, Duration}; -/// let mut time = TestingTimeSource::new(UNIX_EPOCH); -/// let client = Client::with_timesource(TimeSource::testing(&time)); -/// time.advance(Duration::from_secs(100)); -/// ``` -#[derive(Clone, Debug)] -pub struct TestingTimeSource { - queries: Arc>>, - now: Arc>, -} - -impl TestingTimeSource { - /// Creates `TestingTimeSource` with `start_time`. - pub fn new(start_time: SystemTime) -> Self { - Self { - queries: Default::default(), - now: Arc::new(Mutex::new(start_time)), - } - } - - /// Sets time to the specified `time`. - pub fn set_time(&mut self, time: SystemTime) { - let mut now = self.now.lock().unwrap(); - *now = time; - } - - /// Advances time by `delta`. - pub fn advance(&mut self, delta: Duration) { - let mut now = self.now.lock().unwrap(); - *now += delta; - } - - /// Returns a `Vec` of queried times so far. - pub fn queries(&self) -> impl Deref> + '_ { - self.queries.lock().unwrap() - } - - /// Returns the current time understood by `TestingTimeSource`. - pub fn now(&self) -> SystemTime { - let ts = *self.now.lock().unwrap(); - self.queries.lock().unwrap().push(ts); - ts - } -} - -#[derive(Debug, Clone)] -enum Inner { - Default, - Testing(TestingTimeSource), - Shared(SharedTimeSource), -} - -#[cfg(test)] -mod test { - use super::{TestingTimeSource, TimeSource}; - - use std::time::{Duration, UNIX_EPOCH}; - - #[test] - fn default_time_source_should_not_panic_on_calling_now() { - let time_source = TimeSource::default(); - // no panics - let _ = time_source.now(); - } - - #[test] - fn testing_time_source_should_behave_as_expected() { - let mut testing = TestingTimeSource::new(UNIX_EPOCH); - let time_source = TimeSource::testing(&testing); - assert_eq!(time_source.now(), UNIX_EPOCH); - testing.advance(Duration::from_secs(10)); - assert_eq!(time_source.now(), UNIX_EPOCH + Duration::from_secs(10)); - } -} diff --git a/rust-runtime/aws-smithy-async/src/test_util.rs b/rust-runtime/aws-smithy-async/src/test_util.rs index fa1dfe300b5..e323478d846 100644 --- a/rust-runtime/aws-smithy-async/src/test_util.rs +++ b/rust-runtime/aws-smithy-async/src/test_util.rs @@ -35,11 +35,43 @@ impl ManualTimeSource { .unwrap() .as_secs_f64() } + + /// Creates a new [`ManualTimeSource`] + pub fn new(start_time: SystemTime) -> ManualTimeSource { + Self { + start_time, + log: Default::default(), + } + } + + /// Advances the time of this time source by `duration`. + pub fn advance(&self, duration: Duration) -> SystemTime { + let mut log = self.log.lock().unwrap(); + log.push(duration); + self._now(&log) + } + + fn _now(&self, log: &[Duration]) -> SystemTime { + self.start_time + log.iter().sum::() + } + + /// Sets the `time` of this manual time source. + /// + /// # Panics + /// This function panics if `time` < `now()` + pub fn set_time(&self, time: SystemTime) { + let mut log = self.log.lock().unwrap(); + let now = self._now(&log); + if time < now { + panic!("Cannot move time backwards!"); + } + log.push(time.duration_since(now).unwrap()); + } } impl TimeSource for ManualTimeSource { fn now(&self) -> SystemTime { - self.start_time + self.log.lock().unwrap().iter().sum::() + self._now(&self.log.lock().unwrap()) } } From 8eeb21c4901030ddbfa5c6056195200143b01248 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 27 Jul 2023 11:52:12 -0400 Subject: [PATCH 036/331] Split test-util feature to allow test-util to be utilized in WASM (#2873) ## Motivation and Context - #2087 test-util pulled in Hyper but that's not strictly necessary ## Description Split out wiremock as it's own features and do some other cleanup. ## Testing CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 7 +++++++ aws/rust-runtime/aws-config/Cargo.toml | 2 +- .../rustsdk/IntegrationTestDependencies.kt | 2 +- aws/sdk/integration-tests/s3/Cargo.toml | 2 +- rust-runtime/aws-smithy-async/additional-ci | 3 +++ rust-runtime/aws-smithy-client/Cargo.toml | 7 ++++--- rust-runtime/aws-smithy-client/additional-ci | 4 ++++ rust-runtime/aws-smithy-client/src/conns.rs | 19 +++++++++++++------ .../aws-smithy-client/src/dvr/record.rs | 6 ++---- rust-runtime/aws-smithy-client/src/lib.rs | 2 +- .../aws-smithy-client/src/test_connection.rs | 3 ++- .../tests/reconnect_on_transient_error.rs | 2 +- 12 files changed, 40 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 0018f2deda7..eec4009c22c 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -687,6 +687,13 @@ references = ["smithy-rs#2866"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "server" } author = "david-perez" + +[[smithy-rs]] +message = "The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets." +meta = { "breaking" = true, "tada" = false , "bug" = false, "target" = "client" } +author = "rcoh" +references = ["smithy-rs#2873"] + [[aws-sdk-rust]] message = """The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.""" meta = { "breaking" = true, "tada" = false, "bug" = false } diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 997f7b86eef..60fb0f52618 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -62,7 +62,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"] } +aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rt-tokio", "client-hyper"] } # used for a usage example hyper-rustls = { version = "0.24", features = ["webpki-tokio", "http2", "http1"] } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index 38c7d76a839..5a39041ef22 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -83,7 +83,7 @@ class IntegrationTestDependencies( val smithyAsync = CargoDependency.smithyAsync(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) val smithyClient = CargoDependency.smithyClient(codegenContext.runtimeConfig) - .copy(features = setOf("test-util"), scope = DependencyScope.Dev) + .copy(features = setOf("test-util", "wiremock"), scope = DependencyScope.Dev) val smithyTypes = CargoDependency.smithyTypes(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) addDependency(smithyAsync) diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 010d73f6598..650d1a5db0d 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -18,7 +18,7 @@ aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "wiremock"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } diff --git a/rust-runtime/aws-smithy-async/additional-ci b/rust-runtime/aws-smithy-async/additional-ci index fde542e9fc1..2e342db6fac 100755 --- a/rust-runtime/aws-smithy-async/additional-ci +++ b/rust-runtime/aws-smithy-async/additional-ci @@ -8,6 +8,9 @@ set -e +echo '### Checking compilation under WASM' +cargo check --target wasm32-unknown-unknown + echo "### Checking for duplicate dependency versions in the normal dependency graph with all features enabled" cargo tree -d --edges normal --all-features diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index 826ce5eb3d3..5426587c9d8 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -9,11 +9,12 @@ repository = "https://github.com/awslabs/smithy-rs" [features] rt-tokio = ["aws-smithy-async/rt-tokio"] -test-util = ["dep:aws-smithy-protocol-test", "dep:hyper", "hyper?/server", "hyper?/h2", "dep:serde", "dep:serde_json", "serde?/derive", "rustls", "tokio/full"] +test-util = ["dep:aws-smithy-protocol-test", "dep:serde", "dep:serde_json", "serde?/derive"] +wiremock = ["test-util", "dep:hyper", "hyper?/server", "hyper?/h2", "rustls", "tokio/full"] native-tls = [] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI rustls = ["dep:hyper-rustls", "dep:lazy_static", "dep:rustls", "client-hyper", "rt-tokio"] -client-hyper = ["dep:hyper"] +client-hyper = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp"] hyper-webpki-doctest-only = ["dep:hyper-rustls", "hyper-rustls?/webpki-roots"] [dependencies] @@ -26,7 +27,7 @@ bytes = "1" fastrand = "2.0.0" http = "0.2.3" http-body = "0.4.4" -hyper = { version = "0.14.26", features = ["client", "http2", "http1", "tcp"], optional = true } +hyper = { version = "0.14.26", default-features = false, optional = true } # cargo does not support optional test dependencies, so to completely disable rustls # we need to add the webpki-roots feature here. # https://github.com/rust-lang/cargo/issues/1596 diff --git a/rust-runtime/aws-smithy-client/additional-ci b/rust-runtime/aws-smithy-client/additional-ci index bb21b8b01f4..e2ada6a73e7 100755 --- a/rust-runtime/aws-smithy-client/additional-ci +++ b/rust-runtime/aws-smithy-client/additional-ci @@ -8,6 +8,10 @@ set -e +# TODO(msrvUpgrade): This can be enabled when upgrading to Rust 1.71 +# echo '### Checking compilation under WASM' +# cargo hack check --no-dev-deps --target wasm32-unknown-unknown + echo "### Checking for duplicate dependency versions in the normal dependency graph with all features enabled" cargo tree -d --edges normal --all-features diff --git a/rust-runtime/aws-smithy-client/src/conns.rs b/rust-runtime/aws-smithy-client/src/conns.rs index d4e25c45aa8..8ee1d8a929a 100644 --- a/rust-runtime/aws-smithy-client/src/conns.rs +++ b/rust-runtime/aws-smithy-client/src/conns.rs @@ -202,12 +202,19 @@ mod custom_tls_tests { async fn send_request_and_assert_success(conn: DynConnector, uri: &Uri) { let mut svc = ServiceBuilder::new().service(conn); - let req = Request::builder() - .uri(uri) - .method(Method::GET) - .body(SdkBody::empty()) - .unwrap(); - let res = svc.call(req).await.unwrap(); + let mut att = 0; + let res = loop { + let req = Request::builder() + .uri(uri) + .method(Method::GET) + .body(SdkBody::empty()) + .unwrap(); + if let Ok(res) = svc.call(req).await { + break res; + } + assert!(att < 5); + att += 1; + }; assert!(res.status().is_success()); } } diff --git a/rust-runtime/aws-smithy-client/src/dvr/record.rs b/rust-runtime/aws-smithy-client/src/dvr/record.rs index 234bc23d649..9415528f738 100644 --- a/rust-runtime/aws-smithy-client/src/dvr/record.rs +++ b/rust-runtime/aws-smithy-client/src/dvr/record.rs @@ -18,8 +18,6 @@ use aws_smithy_http::body::SdkBody; use crate::dvr::{self, Action, BodyData, ConnectionId, Direction, Error, NetworkTraffic, Version}; use super::Event; -use crate::conns::Https; -use crate::hyper_ext::Adapter; use std::fmt::Display; use std::io; use std::path::Path; @@ -34,9 +32,9 @@ pub struct RecordingConnection { pub(crate) inner: S, } -impl RecordingConnection> { +#[cfg(all(feature = "rustls", feature = "client-hyper"))] +impl RecordingConnection> { /// Construct a recording connection wrapping a default HTTPS implementation - #[cfg(feature = "rustls")] pub fn https() -> Self { Self { data: Default::default(), diff --git a/rust-runtime/aws-smithy-client/src/lib.rs b/rust-runtime/aws-smithy-client/src/lib.rs index 935dddd2f0c..82ddc4cacb7 100644 --- a/rust-runtime/aws-smithy-client/src/lib.rs +++ b/rust-runtime/aws-smithy-client/src/lib.rs @@ -34,7 +34,7 @@ pub mod timeout; mod builder; pub use builder::Builder; -#[cfg(feature = "test-util")] +#[cfg(all(feature = "test-util", feature = "client-hyper"))] pub mod dvr; #[cfg(feature = "test-util")] pub mod test_connection; diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs index 86466944df0..a339eac6bb8 100644 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ b/rust-runtime/aws-smithy-client/src/test_connection.rs @@ -358,6 +358,7 @@ impl tower::Service> for ConnectionFn { /// match_events!(ev!(dns), ev!(connect), ev!(http(200)))(&mock.events()); /// # } /// ``` +#[cfg(feature = "wiremock")] pub mod wire_mock { use bytes::Bytes; use http::{Request, Response}; @@ -673,7 +674,7 @@ pub mod wire_mock { #[cfg(test)] mod tests { - use hyper::service::Service; + use tower::Service; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; diff --git a/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs index 3fc0fe133ab..695e069cf15 100644 --- a/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs +++ b/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#![cfg(feature = "test-util")] +#![cfg(feature = "wiremock")] mod test_operation; From 2e82790a34aa209008c72f7431b8428f248a8aa8 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 27 Jul 2023 08:56:18 -0700 Subject: [PATCH 037/331] Update tool dependencies (#2879) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/changelogger/Cargo.lock | 517 ++++---- tools/ci-build/crate-hasher/Cargo.lock | 385 +++--- tools/ci-build/difftags/Cargo.lock | 68 +- tools/ci-build/publisher/Cargo.lock | 620 ++++----- tools/ci-build/sdk-lints/Cargo.lock | 472 ++++--- tools/ci-build/sdk-versioner/Cargo.lock | 531 ++++---- tools/ci-cdk/canary-runner/Cargo.lock | 1138 ++++++++--------- tools/ci-cdk/canary-runner/Cargo.toml | 10 +- .../canary-runner/src/generate_matrix.rs | 1 + tools/ci-cdk/canary-runner/src/run.rs | 12 +- tools/echo-server/Cargo.lock | 308 +++-- 11 files changed, 1943 insertions(+), 2119 deletions(-) diff --git a/tools/ci-build/changelogger/Cargo.lock b/tools/ci-build/changelogger/Cargo.lock index 91da13c1616..682f4e12177 100644 --- a/tools/ci-build/changelogger/Cargo.lock +++ b/tools/ci-build/changelogger/Cargo.lock @@ -2,30 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -34,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -45,11 +60,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -57,11 +87,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -100,12 +136,12 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef2b3ded6a26dfaec672a742c93c8cf6b689220324da509ec5caa20de55dc83" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -117,9 +153,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d756c5824fc5c0c1ee8e36000f576968dbcb2081def956c83fad6f40acd46f96" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", @@ -153,16 +189,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "diff" version = "0.1.13" @@ -186,7 +212,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -201,12 +227,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -231,9 +254,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -277,11 +300,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -317,12 +346,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "http" version = "0.2.9" @@ -359,9 +382,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -396,9 +419,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -414,43 +437,23 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -463,24 +466,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -494,16 +494,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -536,9 +544,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] @@ -552,19 +560,28 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -581,7 +598,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -592,9 +609,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -613,30 +630,21 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "output_vt100" -version = "0.1.3" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -646,19 +654,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -688,18 +694,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -710,14 +716,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -726,15 +744,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -767,42 +785,47 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -811,9 +834,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -821,35 +844,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -922,9 +945,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -933,15 +956,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -961,9 +984,9 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "time" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ "libc", "num_threads", @@ -973,9 +996,9 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "tinyvec" @@ -994,17 +1017,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -1019,9 +1043,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -1049,10 +1073,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1060,20 +1085,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1092,9 +1117,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1107,9 +1132,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1130,11 +1155,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1146,9 +1170,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1156,24 +1180,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1183,9 +1207,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1193,28 +1217,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1251,147 +1275,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/crate-hasher/Cargo.lock b/tools/ci-build/crate-hasher/Cargo.lock index 6c034cc675d..bc931d59845 100644 --- a/tools/ci-build/crate-hasher/Cargo.lock +++ b/tools/ci-build/crate-hasher/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,27 +19,29 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] -name = "aho-corasick" -version = "1.0.1" +name = "anyhow" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" -dependencies = [ - "memchr", -] +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] -name = "anyhow" -version = "1.0.70" +name = "async-trait" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] [[package]] name = "atty" @@ -38,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -49,12 +60,33 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "block-buffer" version = "0.10.4" @@ -66,14 +98,20 @@ dependencies = [ [[package]] name = "bstr" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "serde", ] +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.79" @@ -93,7 +131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -113,7 +151,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -127,9 +165,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -159,9 +197,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -176,16 +214,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "diff" version = "0.1.13" @@ -194,9 +222,9 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -210,7 +238,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -225,12 +253,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "filetime" @@ -241,14 +266,14 @@ dependencies = [ "cfg-if", "libc", "redox_syscall 0.2.16", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "miniz_oxide", @@ -270,13 +295,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "globset" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" dependencies = [ - "aho-corasick 0.7.20", + "aho-corasick", "bstr", "fnv", "log", @@ -304,12 +335,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "hex" version = "0.4.3" @@ -344,26 +369,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -372,24 +377,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -399,43 +401,47 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] -name = "output_vt100" -version = "0.1.3" +name = "pin-project-lite" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -448,7 +454,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -465,18 +471,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -487,7 +493,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -496,38 +502,55 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ - "aho-corasick 1.0.1", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -541,15 +564,15 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -558,12 +581,15 @@ dependencies = [ [[package]] name = "sha256" -version = "1.1.3" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f8b5de2bac3a4ae28e9b611072a8e326d9b26c8189c0972d4c321fa684f1f" +checksum = "386f700b0c798d92ac20a53342c240ff9d58030c3b845fbaeb92eead3a774792" dependencies = [ + "async-trait", + "bytes", "hex", "sha2", + "tokio", ] [[package]] @@ -583,11 +609,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tar" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" dependencies = [ "filetime", "libc", @@ -596,15 +633,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -632,6 +669,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "pin-project-lite", +] + [[package]] name = "typenum" version = "1.16.0" @@ -640,9 +689,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "version_check" @@ -691,132 +740,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/difftags/Cargo.lock b/tools/ci-build/difftags/Cargo.lock index 849338e2598..1bbe447c25b 100644 --- a/tools/ci-build/difftags/Cargo.lock +++ b/tools/ci-build/difftags/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -36,9 +36,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "clap" -version = "3.2.23" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", "bitflags", @@ -53,9 +53,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.18" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", @@ -90,9 +90,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -114,9 +114,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -130,9 +130,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "memchr" @@ -142,15 +142,15 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "once_cell" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "os_str_bytes" -version = "6.4.1" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "proc-macro-error" @@ -178,27 +178,39 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.7.1" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -207,9 +219,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "strsim" @@ -219,9 +231,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -245,9 +257,9 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unidiff" diff --git a/tools/ci-build/publisher/Cargo.lock b/tools/ci-build/publisher/Cargo.lock index 9f4f267aed0..4ac8cf16e6d 100644 --- a/tools/ci-build/publisher/Cargo.lock +++ b/tools/ci-build/publisher/Cargo.lock @@ -2,20 +2,41 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-recursion" @@ -30,13 +51,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -56,11 +77,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -68,6 +104,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "block-buffer" version = "0.10.4" @@ -79,9 +121,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -114,11 +156,11 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ - "num-integer", + "android-tzdata", "num-traits", "serde", ] @@ -130,7 +172,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -195,9 +237,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -229,16 +271,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "dialoguer" version = "0.8.0" @@ -259,9 +291,9 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -290,7 +322,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -305,12 +337,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -335,9 +364,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -404,7 +433,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -447,11 +476,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -468,9 +503,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.3.6" +version = "4.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "035ef95d03713f2c347a72547b7cd38cbc9af7cd51e6099fb62d586d4a6dee3a" +checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" dependencies = [ "log", "pest", @@ -503,18 +538,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -558,9 +584,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -595,9 +621,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -613,43 +639,23 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -662,21 +668,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -684,12 +690,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "matchers" @@ -697,7 +700,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -712,16 +715,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -753,47 +764,46 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-traits" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", - "num-traits", ] [[package]] -name = "num-traits" -version = "0.2.15" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "autocfg", + "hermit-abi 0.3.2", + "libc", ] [[package]] -name = "num_cpus" -version = "1.15.0" +name = "object" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ - "hermit-abi 0.2.6", - "libc", + "memchr", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -810,7 +820,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -821,9 +831,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -833,18 +843,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "output_vt100" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "overload" @@ -864,28 +865,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1403e8401ad5dedea73c626b99758535b342502f8d1e361f4a2dd952749122" +checksum = "0d2d1d55045829d65aad9d389139882ad623b33b904e7c9f1b10c5b8927298e5" dependencies = [ "thiserror", "ucd-trie", @@ -893,9 +894,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be99c4c1d2fc2769b1d00239431d711d08f6efedcecb8b6e30707160aee99c15" +checksum = "5f94bca7e7a599d89dea5dfa309e217e7906c3c007fb9c3299c40b10d6a315d3" dependencies = [ "pest", "pest_generator", @@ -903,22 +904,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56094789873daa36164de2e822b3888c6ae4b4f9da555a1103587658c805b1e" +checksum = "99d490fe7e8556575ff6911e45567ab95e71617f43781e5c05490dc8d75c965c" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "pest_meta" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6733073c7cff3d8459fda0e42f13a047870242aed8b509fe98000928975f359e" +checksum = "2674c66ebb4b4d9036012091b537aae5878970d6999f81a265034d85b136b341" dependencies = [ "once_cell", "pest", @@ -927,9 +928,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -939,19 +940,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -981,9 +980,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1019,40 +1018,32 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_syscall" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", ] [[package]] @@ -1064,6 +1055,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1072,15 +1074,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -1113,48 +1115,53 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1163,9 +1170,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -1173,35 +1180,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -1222,9 +1229,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -1233,12 +1240,15 @@ dependencies = [ [[package]] name = "sha256" -version = "1.1.3" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f8b5de2bac3a4ae28e9b611072a8e326d9b26c8189c0972d4c321fa684f1f" +checksum = "386f700b0c798d92ac20a53342c240ff9d58030c3b845fbaeb92eead3a774792" dependencies = [ + "async-trait", + "bytes", "hex", "sha2", + "tokio", ] [[package]] @@ -1270,9 +1280,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "smithy-rs-tool-common" @@ -1320,9 +1330,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -1331,15 +1341,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -1369,22 +1379,22 @@ checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -1414,11 +1424,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -1428,7 +1439,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1439,7 +1450,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -1484,10 +1495,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1495,20 +1507,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -1557,9 +1569,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicode-bidi" @@ -1569,9 +1581,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1590,9 +1602,9 @@ checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1619,11 +1631,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1635,9 +1646,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1645,24 +1656,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1672,9 +1683,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1682,28 +1693,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1740,147 +1751,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/sdk-lints/Cargo.lock b/tools/ci-build/sdk-lints/Cargo.lock index a3b2511898a..a9981777901 100644 --- a/tools/ci-build/sdk-lints/Cargo.lock +++ b/tools/ci-build/sdk-lints/Cargo.lock @@ -2,30 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -34,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -45,11 +60,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -57,11 +87,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -99,7 +135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -164,7 +200,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -179,12 +215,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -209,9 +242,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -255,11 +288,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -295,12 +334,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "http" version = "0.2.9" @@ -337,9 +370,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -374,9 +407,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -392,43 +425,23 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -441,24 +454,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -472,16 +482,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -502,19 +520,28 @@ dependencies = [ "tempfile", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -531,7 +558,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -542,9 +569,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -554,21 +581,21 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -578,9 +605,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "proc-macro-error" @@ -608,18 +635,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -630,14 +657,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -646,15 +685,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -687,33 +726,38 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -731,11 +775,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -744,9 +788,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -754,35 +798,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -855,9 +899,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -866,15 +910,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -909,17 +953,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -934,9 +979,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -964,10 +1009,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -975,20 +1021,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1007,9 +1053,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1022,9 +1068,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1045,11 +1091,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1061,9 +1106,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1071,24 +1116,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1098,9 +1143,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1108,28 +1153,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1166,147 +1211,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/sdk-versioner/Cargo.lock b/tools/ci-build/sdk-versioner/Cargo.lock index eafd9037eed..0ff7ddce42e 100644 --- a/tools/ci-build/sdk-versioner/Cargo.lock +++ b/tools/ci-build/sdk-versioner/Cargo.lock @@ -2,30 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -34,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -45,11 +60,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -57,11 +87,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -88,10 +124,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "lazy_static", "strsim", "termcolor", @@ -136,16 +172,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "diff" version = "0.1.13" @@ -161,6 +187,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.1" @@ -169,7 +201,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -184,12 +216,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -214,9 +243,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -260,11 +289,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -272,7 +307,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -285,6 +320,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "heck" version = "0.4.1" @@ -300,12 +341,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "http" version = "0.2.9" @@ -342,9 +377,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -379,9 +414,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -394,46 +429,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", + "hashbrown 0.12.3", ] [[package]] -name = "io-lifetimes" -version = "1.0.10" +name = "indexmap" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", + "equivalent", + "hashbrown 0.14.0", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -446,24 +471,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -477,16 +499,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -507,19 +537,28 @@ dependencies = [ "tempfile", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -536,7 +575,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -547,9 +586,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -559,18 +598,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "output_vt100" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "pathdiff" @@ -580,15 +610,15 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -598,19 +628,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -640,18 +668,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -662,14 +690,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -678,15 +718,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -719,33 +759,38 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -763,11 +808,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -776,9 +821,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -786,35 +831,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -887,9 +932,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -898,15 +943,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -941,17 +986,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -966,9 +1012,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -984,23 +1030,23 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap", + "indexmap 1.9.3", "serde", ] [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ - "indexmap", + "indexmap 2.0.0", "toml_datetime", "winnow", ] @@ -1013,10 +1059,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1024,20 +1071,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1056,9 +1103,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1071,9 +1118,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1094,11 +1141,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1110,9 +1156,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1120,24 +1166,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1147,9 +1193,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1157,28 +1203,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1215,147 +1261,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" @@ -1364,9 +1329,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" dependencies = [ "memchr", ] diff --git a/tools/ci-cdk/canary-runner/Cargo.lock b/tools/ci-cdk/canary-runner/Cargo.lock index c4a5f3fe868..6edc67f2c43 100644 --- a/tools/ci-cdk/canary-runner/Cargo.lock +++ b/tools/ci-cdk/canary-runner/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,13 +19,19 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -28,9 +43,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-recursion" @@ -40,18 +55,18 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -73,10 +88,11 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a3ad9e793335d75b2d2faad583487efcc0df9154aff06f299a5c1fc8795698" +checksum = "bcdcf0d683fe9c23d32cf5b53c9918ea0a500375a9fb20109802552658e576c9" dependencies = [ + "aws-credential-types", "aws-http", "aws-sdk-sso", "aws-sdk-sts", @@ -88,6 +104,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", + "fastrand 1.9.0", "hex", "http", "hyper", @@ -99,13 +116,28 @@ dependencies = [ "zeroize", ] +[[package]] +name = "aws-credential-types" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae" +dependencies = [ + "aws-smithy-async", + "aws-smithy-types", + "fastrand 1.9.0", + "tokio", + "tracing", + "zeroize", +] + [[package]] name = "aws-endpoint" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd4e9dad553017821ee529f186e033700e8d61dd5c4b60066b4d8fe805b8cfc" +checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04" dependencies = [ "aws-smithy-http", + "aws-smithy-types", "aws-types", "http", "regex", @@ -114,10 +146,11 @@ dependencies = [ [[package]] name = "aws-http" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef5a579a51d352b628b76f4855ba716be686305e5e59970c476d1ae2214e90d" +checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" dependencies = [ + "aws-credential-types", "aws-smithy-http", "aws-smithy-types", "aws-types", @@ -132,10 +165,11 @@ dependencies = [ [[package]] name = "aws-sdk-cloudwatch" -version = "0.17.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5b3d07682c55fa19d9006ef6c4739ea59d8410955b67449bf208c61ffdf834" +checksum = "7263a92103fcd82ad1cb882274ece03a84a1041d08a487bb3d783c60acdf8f49" dependencies = [ + "aws-credential-types", "aws-endpoint", "aws-http", "aws-sig-auth", @@ -143,22 +177,26 @@ dependencies = [ "aws-smithy-client", "aws-smithy-http", "aws-smithy-http-tower", + "aws-smithy-json", "aws-smithy-query", "aws-smithy-types", "aws-smithy-xml", "aws-types", "bytes", "http", + "regex", "tokio-stream", "tower", + "tracing", ] [[package]] name = "aws-sdk-lambda" -version = "0.17.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f4cd6001d23ff50c00caf6079e1666060215914f8801a49f614252bc04883d" +checksum = "b3ad176ffaa3aafa532246eb6a9f18a7d68da19950704ecc95d33d9dc3c62a9b" dependencies = [ + "aws-credential-types", "aws-endpoint", "aws-http", "aws-sig-auth", @@ -171,16 +209,19 @@ dependencies = [ "aws-types", "bytes", "http", + "regex", "tokio-stream", "tower", + "tracing", ] [[package]] name = "aws-sdk-s3" -version = "0.17.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2c19b69297f16b3f18936e363f954e7504c23a4a0dc3f2833712313c09c2aa" +checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f" dependencies = [ + "aws-credential-types", "aws-endpoint", "aws-http", "aws-sig-auth", @@ -191,24 +232,29 @@ dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-http-tower", + "aws-smithy-json", "aws-smithy-types", "aws-smithy-xml", "aws-types", "bytes", - "bytes-utils", "http", "http-body", + "once_cell", + "percent-encoding", + "regex", "tokio-stream", "tower", "tracing", + "url", ] [[package]] name = "aws-sdk-sso" -version = "0.17.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f014b8ad3178b414bf732b36741325ef659fc40752f8c292400fb7c4ecb7fdd0" +checksum = "c8b812340d86d4a766b2ca73f740dfd47a97c2dff0c06c8517a16d88241957e4" dependencies = [ + "aws-credential-types", "aws-endpoint", "aws-http", "aws-sig-auth", @@ -221,16 +267,19 @@ dependencies = [ "aws-types", "bytes", "http", + "regex", "tokio-stream", "tower", + "tracing", ] [[package]] name = "aws-sdk-sts" -version = "0.17.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e45fdce84327c69fb924b9188fd889056c6afafbd494e8dd0daa400f9c082" +checksum = "265fac131fbfc188e5c3d96652ea90ecc676a934e3174eaaee523c6cec040b3b" dependencies = [ + "aws-credential-types", "aws-endpoint", "aws-http", "aws-sig-auth", @@ -238,21 +287,25 @@ dependencies = [ "aws-smithy-client", "aws-smithy-http", "aws-smithy-http-tower", + "aws-smithy-json", "aws-smithy-query", "aws-smithy-types", "aws-smithy-xml", "aws-types", "bytes", "http", + "regex", "tower", + "tracing", ] [[package]] name = "aws-sig-auth" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6530e72945c11439e9b3c423c95a656a233d73c3a7d4acaf9789048e1bdf7da7" +checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61" dependencies = [ + "aws-credential-types", "aws-sigv4", "aws-smithy-eventstream", "aws-smithy-http", @@ -263,29 +316,30 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.47.1" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0973cb4a7b44ca2b54b3c7c2d01217fae5dbf9ebb96c2098c5c332829e5d352c" +checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", "bytes", "form_urlencoded", "hex", + "hmac", "http", "once_cell", "percent-encoding", "regex", - "ring", + "sha2", "time", "tracing", ] [[package]] name = "aws-smithy-async" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fc23ad8d050c241bdbfa74ae360be94a844ace8e218f64a2b2de77bfa9a707" +checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" dependencies = [ "futures-util", "pin-project-lite", @@ -295,9 +349,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd674df030b337a84eb67539db048676c691d9c88f0c54cf7748da11836cfd8" +checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -316,22 +370,23 @@ dependencies = [ [[package]] name = "aws-smithy-client" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e147b157f49ce77f2a86ec693a14c84b2441fa28be58ffb2febb77d5726c934" +checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" dependencies = [ "aws-smithy-async", "aws-smithy-http", "aws-smithy-http-tower", "aws-smithy-types", "bytes", - "fastrand", + "fastrand 1.9.0", "http", "http-body", "hyper", - "hyper-rustls 0.22.1", + "hyper-rustls 0.23.2", "lazy_static", "pin-project-lite", + "rustls 0.20.8", "tokio", "tower", "tracing", @@ -339,9 +394,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da29e67a0b90a2bc5f2bd0a06fd43e728de62e02048879c15f646a3edf8db012" +checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" dependencies = [ "aws-smithy-types", "bytes", @@ -350,9 +405,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc1af50eac644ab6f58e5bae29328ba3092851fc2ce648ad139134699b2b66f" +checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" dependencies = [ "aws-smithy-eventstream", "aws-smithy-types", @@ -365,6 +420,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "pin-utils", "tokio", "tokio-util", "tracing", @@ -372,11 +428,12 @@ dependencies = [ [[package]] name = "aws-smithy-http-tower" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1bf4c4664dff2febf91f8796505c5bc8f38a0bff0d1397d1d3fdda17bd5c5d1" +checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" dependencies = [ "aws-smithy-http", + "aws-smithy-types", "bytes", "http", "http-body", @@ -387,18 +444,18 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e6ebc76c3c108dd2a96506bf47dc31f75420811a19f1a09907524d1451789d2" +checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-query" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2956f1385c4daa883907a2c81d32256af8f95834c9de1bc0613fa68db63b88c4" +checksum = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d" dependencies = [ "aws-smithy-types", "urlencoding", @@ -406,10 +463,11 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "352fb335ec1d57160a17a13e87aaa0a172ab780ddf58bfc85caedd3b7e47caed" +checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8" dependencies = [ + "base64-simd", "itoa", "num-integer", "ryu", @@ -418,19 +476,20 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cf2807fa715a5a3296feffb06ce45252bd0dfd48f52838128c48fb339ddbf5c" +checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.47.0" +version = "0.55.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8140b89d76f67be2c136d7393e7e6d8edd65424eb58214839efbf4a2e4f7e8a3" +checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829" dependencies = [ + "aws-credential-types", "aws-smithy-async", "aws-smithy-client", "aws-smithy-http", @@ -438,7 +497,21 @@ dependencies = [ "http", "rustc_version", "tracing", - "zeroize", +] + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", ] [[package]] @@ -449,9 +522,19 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] [[package]] name = "bitflags" @@ -459,6 +542,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "block-buffer" version = "0.10.4" @@ -470,9 +559,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" @@ -485,6 +574,9 @@ name = "bytes" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +dependencies = [ + "serde", +] [[package]] name = "bytes-utils" @@ -538,12 +630,12 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", "serde", "winapi", @@ -551,12 +643,12 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef2b3ded6a26dfaec672a742c93c8cf6b689220324da509ec5caa20de55dc83" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -568,9 +660,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d756c5824fc5c0c1ee8e36000f576968dbcb2081def956c83fad6f40acd46f96" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", @@ -588,16 +680,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "core-foundation" version = "0.9.3" @@ -616,18 +698,18 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crc32c" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" dependencies = [ "rustc_version", ] @@ -641,21 +723,11 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -670,69 +742,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", -] - -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "cxx" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.15", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.15", -] - [[package]] name = "diff" version = "0.1.13" @@ -741,25 +750,26 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] name = "dyn-clone" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" +checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" @@ -778,7 +788,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -800,11 +810,17 @@ dependencies = [ "instant", ] +[[package]] +name = "fastrand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" + [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "miniz_oxide", @@ -833,9 +849,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -896,7 +912,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -941,20 +957,28 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -992,18 +1016,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -1011,6 +1026,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "0.2.9" @@ -1047,9 +1071,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1071,32 +1095,31 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.22.1" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" dependencies = [ - "ct-logs", - "futures-util", + "http", "hyper", "log", - "rustls 0.19.1", + "rustls 0.20.8", "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", + "tokio-rustls 0.23.4", ] [[package]] name = "hyper-rustls" -version = "0.23.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ + "futures-util", "http", "hyper", - "rustls 0.20.8", + "rustls 0.21.5", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls 0.24.1", ] [[package]] @@ -1114,9 +1137,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1128,19 +1151,18 @@ dependencies = [ [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1163,36 +1185,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -1203,7 +1217,7 @@ version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "pem", "ring", "serde", @@ -1219,30 +1233,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" - -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1250,11 +1255,10 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" dependencies = [ - "cfg-if", "serde", ] @@ -1264,9 +1268,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + [[package]] name = "md-5" version = "0.10.5" @@ -1300,23 +1310,22 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -1370,31 +1379,41 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.2", "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "octorust" -version = "0.3.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fac860084f1858d4207a3242df22e2a60dbae86d3df6878ce8eac2a51eb5c9" +checksum = "35a776c05d0cdd02480c12cf1484e0f3bf610eab717ba6fb2c51449b60c7a88f" dependencies = [ - "anyhow", "async-recursion", + "async-trait", + "bytes", "chrono", "http", "jsonwebtoken", @@ -1413,23 +1432,25 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "thiserror", "tokio", "url", + "uuid", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -1446,7 +1467,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -1457,9 +1478,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -1467,39 +1488,17 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures-channel", - "futures-executor", - "futures-util", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand", - "thiserror", -] - [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] -name = "output_vt100" -version = "0.1.3" +name = "outref" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" [[package]] name = "overload" @@ -1507,6 +1506,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1514,20 +1524,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.8", ] [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", + "instant", "libc", "redox_syscall 0.2.16", "smallvec", - "windows-sys 0.45.0", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", ] [[package]] @@ -1552,35 +1576,35 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -1590,9 +1614,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "ppv-lite86" @@ -1602,13 +1626,11 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -1638,18 +1660,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -1690,7 +1712,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1699,18 +1721,19 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", ] [[package]] @@ -1722,6 +1745,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1730,17 +1764,17 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "bytes", "encoding_rs", "futures-core", @@ -1749,7 +1783,7 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls 0.23.2", + "hyper-rustls 0.24.1", "hyper-tls", "ipnet", "js-sys", @@ -1760,14 +1794,14 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.20.8", + "rustls 0.21.5", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-rustls 0.23.4", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", @@ -1779,9 +1813,9 @@ dependencies = [ [[package]] name = "reqwest-conditional-middleware" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bce134f515eb4c2748bbd928086e7b0aae0d1568daf6c63b51e829aa6f2cf464" +checksum = "59e50a2e70970896c99d1b8f20ddc30a70b30d3ac6e619a03a8353b64a49b277" dependencies = [ "async-trait", "reqwest", @@ -1791,13 +1825,12 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.1.6" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69539cea4148dce683bec9dc95be3f0397a9bb2c248a49c8296a9d21659a8cdd" +checksum = "4531c89d50effe1fac90d095c8b133c20c5c714204feee0bfc3fd158e784209d" dependencies = [ "anyhow", "async-trait", - "futures", "http", "reqwest", "serde", @@ -1807,38 +1840,41 @@ dependencies = [ [[package]] name = "reqwest-retry" -version = "0.1.5" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce246a729eaa6aff5e215aee42845bf5fed9893cc6cd51aeeb712f34e04dd9f3" +checksum = "48d0fd6ef4c6d23790399fe15efc8d12cd9f3d4133958f9bd7801ee5cbaec6c4" dependencies = [ "anyhow", "async-trait", "chrono", "futures", + "getrandom", "http", "hyper", + "parking_lot 0.11.2", "reqwest", "reqwest-middleware", "retry-policies", "task-local-extensions", "tokio", "tracing", + "wasm-timer", ] [[package]] name = "reqwest-tracing" -version = "0.3.1" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64977f9a47fa7768cc88751e29026e569730ac1667c2eaeaac04b32624849fbe" +checksum = "1b97ad83c2fc18113346b7158d79732242002427c30f620fa817c1f32901e0a8" dependencies = [ + "anyhow", "async-trait", - "opentelemetry", + "getrandom", + "matchit", "reqwest", "reqwest-middleware", "task-local-extensions", - "tokio", "tracing", - "tracing-opentelemetry", ] [[package]] @@ -1867,6 +1903,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1878,77 +1920,85 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "rustls" -version = "0.19.1" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" dependencies = [ - "base64 0.13.1", "log", "ring", - "sct 0.6.1", - "webpki 0.21.4", + "sct", + "webpki", ] [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" dependencies = [ "log", "ring", - "sct 0.7.0", - "webpki 0.22.0", + "rustls-webpki", + "sct", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls 0.19.1", + "rustls-pemfile", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" +dependencies = [ + "ring", + "untrusted", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -1981,25 +2031,9 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" - -[[package]] -name = "sct" -version = "0.6.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -2013,11 +2047,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2026,9 +2060,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -2036,28 +2070,28 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -2073,9 +2107,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -2107,9 +2141,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -2157,9 +2191,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "smithy-rs-tool-common" @@ -2200,6 +2234,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "1.0.109" @@ -2213,9 +2253,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -2233,15 +2273,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", - "fastrand", + "fastrand 2.0.0", "redox_syscall 0.3.5", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -2261,22 +2301,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -2291,9 +2331,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ "itoa", "serde", @@ -2303,15 +2343,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" dependencies = [ "time-core", ] @@ -2333,32 +2373,33 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "num_cpus", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] name = "tokio-macros" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -2373,31 +2414,30 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.19.1", + "rustls 0.20.8", "tokio", - "webpki 0.21.4", + "webpki", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.20.8", + "rustls 0.21.5", "tokio", - "webpki 0.22.0", ] [[package]] name = "tokio-stream" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", @@ -2406,9 +2446,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -2458,10 +2498,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2470,20 +2511,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -2500,20 +2541,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-opentelemetry" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" -dependencies = [ - "once_cell", - "opentelemetry", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", -] - [[package]] name = "tracing-subscriber" version = "0.3.17" @@ -2561,9 +2588,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -2574,12 +2601,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - [[package]] name = "untrusted" version = "0.7.1" @@ -2588,9 +2609,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -2600,15 +2621,19 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uuid" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b55a3fef2a1e3b3a00ce878640918820d3c51081576ac657d23af9fc7928fdb" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +dependencies = [ + "getrandom", + "serde", +] [[package]] name = "valuable" @@ -2628,13 +2653,18 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -2646,9 +2676,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2656,24 +2686,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -2683,9 +2713,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2693,41 +2723,46 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] -name = "web-sys" -version = "0.3.61" +name = "wasm-timer" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" dependencies = [ + "futures", "js-sys", + "parking_lot 0.11.2", + "pin-utils", "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] -name = "webpki" -version = "0.21.4" +name = "web-sys" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ - "ring", - "untrusted", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -2746,7 +2781,7 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" dependencies = [ - "webpki 0.22.0", + "webpki", ] [[package]] @@ -2786,31 +2821,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", + "windows-targets", ] [[package]] @@ -2819,117 +2830,60 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" @@ -2947,9 +2901,9 @@ dependencies = [ [[package]] name = "xmlparser" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" +checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" [[package]] name = "yansi" @@ -2965,9 +2919,9 @@ checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" [[package]] name = "zip" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ "byteorder", "crc32fast", diff --git a/tools/ci-cdk/canary-runner/Cargo.toml b/tools/ci-cdk/canary-runner/Cargo.toml index b1de3e0aff8..85e8a03be15 100644 --- a/tools/ci-cdk/canary-runner/Cargo.toml +++ b/tools/ci-cdk/canary-runner/Cargo.toml @@ -12,15 +12,15 @@ publish = false [dependencies] anyhow = "1" async-trait = "0.1.56" -aws-config = "0.47.0" -aws-sdk-cloudwatch = "0.17.0" -aws-sdk-lambda = "0.17.0" -aws-sdk-s3 = "0.17.0" +aws-config = "0.55.3" +aws-sdk-cloudwatch = "0.28.0" +aws-sdk-lambda = "0.28.0" +aws-sdk-s3 = "0.28.0" base64 = "0.13" clap = { version = "3.2.17", features = ["derive"] } hex = "0.4.3" lazy_static = "1" -octorust = "0.3.0" +octorust = "0.7.0" regex = "1.6.0" semver = "1" serde = { version = "1", features = ["derive"] } diff --git a/tools/ci-cdk/canary-runner/src/generate_matrix.rs b/tools/ci-cdk/canary-runner/src/generate_matrix.rs index 401e18a99a2..bb2cb48da40 100644 --- a/tools/ci-cdk/canary-runner/src/generate_matrix.rs +++ b/tools/ci-cdk/canary-runner/src/generate_matrix.rs @@ -65,6 +65,7 @@ impl RetrieveReleases for GitHubRetrieveReleases { .repos() .list_tags(owner, repo, 100, page_num) .await? + .body .into_iter() .filter_map(|tag| ReleaseTag::from_str(&tag.name).ok()) .collect(); diff --git a/tools/ci-cdk/canary-runner/src/run.rs b/tools/ci-cdk/canary-runner/src/run.rs index b5e0058d74e..1952323dab4 100644 --- a/tools/ci-cdk/canary-runner/src/run.rs +++ b/tools/ci-cdk/canary-runner/src/run.rs @@ -21,8 +21,8 @@ use std::{env, path::Path}; use anyhow::{bail, Context, Result}; use clap::Parser; -use cloudwatch::model::StandardUnit; -use s3::types::ByteStream; +use cloudwatch::types::StandardUnit; +use s3::primitives::ByteStream; use serde::Deserialize; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::macros::here; @@ -202,7 +202,7 @@ pub async fn run(opt: RunArgs) -> Result<()> { .namespace("aws-sdk-rust-canary"); for metric in metrics { request_builder = request_builder.metric_data( - cloudwatch::model::MetricDatum::builder() + cloudwatch::types::MetricDatum::builder() .metric_name(metric.0) .value(metric.1) .timestamp(SystemTime::now().into()) @@ -337,7 +337,7 @@ async fn create_lambda_fn( code_s3_bucket: &str, test_s3_bucket: &str, ) -> Result<()> { - use lambda::model::*; + use lambda::types::*; let env_builder = match expected_speech_text_by_transcribe { Some(expected_speech_text_by_transcribe) => Environment::builder() @@ -394,8 +394,8 @@ async fn create_lambda_fn( } async fn invoke_lambda(lambda_client: lambda::Client, bundle_name: &str) -> Result<()> { - use lambda::model::*; - use lambda::types::Blob; + use lambda::primitives::Blob; + use lambda::types::*; let response = lambda_client .invoke() diff --git a/tools/echo-server/Cargo.lock b/tools/echo-server/Cargo.lock index bebe33f6fd6..fd152095120 100644 --- a/tools/echo-server/Cargo.lock +++ b/tools/echo-server/Cargo.lock @@ -2,15 +2,39 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn", ] [[package]] @@ -66,6 +90,21 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -78,6 +117,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-if" version = "1.0.0" @@ -104,9 +149,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -150,11 +195,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -177,12 +228,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "http" @@ -208,9 +256,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" @@ -226,9 +274,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -260,9 +308,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "lazy_static" @@ -272,15 +320,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -288,12 +336,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "matchers" @@ -301,7 +346,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -322,14 +367,22 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", "windows-sys", ] @@ -346,19 +399,28 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "overload" @@ -378,48 +440,48 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -429,38 +491,41 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ - "regex-syntax 0.7.1", + "aho-corasick", + "memchr", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", ] [[package]] @@ -472,6 +537,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -480,33 +556,39 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -554,9 +636,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -570,20 +652,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.109" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -608,11 +679,12 @@ dependencies = [ [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -627,20 +699,20 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn", ] [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -699,10 +771,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -711,20 +784,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -767,9 +840,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "valuable" @@ -779,11 +852,10 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -817,18 +889,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -841,42 +913,42 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" From 1fbafc83669ff3137bbc1763d1b7669e161f72b4 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 27 Jul 2023 12:00:18 -0400 Subject: [PATCH 038/331] Fix default features test (#2881) ## Motivation and Context ## Description The default features test is actually broken and failed during the release dry run ## Testing - ~Added the default features test to CI~ got a linker error ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/integration-tests/dynamodb/Cargo.toml | 2 +- .../no-default-features/tests/client-construction.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws/sdk/integration-tests/dynamodb/Cargo.toml b/aws/sdk/integration-tests/dynamodb/Cargo.toml index 3cd3a98b492..61663dbbed4 100644 --- a/aws/sdk/integration-tests/dynamodb/Cargo.toml +++ b/aws/sdk/integration-tests/dynamodb/Cargo.toml @@ -16,7 +16,7 @@ aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-dynamodb = { path = "../../build/aws-sdk/sdk/dynamodb" } -aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index ada59bc6f4e..26d84c96f64 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -9,10 +9,10 @@ use aws_smithy_async::rt::sleep::AsyncSleep; use std::time::Duration; // This will fail due to lack of a connector when constructing the SDK Config +// If this test doesn't panic, you may have accidentally unified features, resulting in +// the connector being enabled transitively #[tokio::test] -#[should_panic( - expected = "No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this." -)] +#[should_panic(expected = "Enable the `rustls` crate feature or set a connector to fix this.")] async fn test_clients_from_sdk_config() { aws_config::load_from_env().await; } From 79be3105466f10762ad2073ae93746712d83359e Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 27 Jul 2023 12:15:43 -0400 Subject: [PATCH 039/331] Share HTTP connectors between providers and clients (#2876) ## Motivation and Context Clients using separate connectors is mostly confusing and troublesome for customers. ## Description Change the behavior of `ConfigLoader::http_connector` to set both the client & credential provider HTTP connector. **Note**: It is still possible to separate control clients for the credential provider. Because `HttpConnector` is used, the timeout settings can still be late-bound. ## Testing Unit tests. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../src/default_provider/app_name.rs | 9 +- aws/rust-runtime/aws-config/src/lib.rs | 190 +++++++++++++----- .../aws-config/src/provider_config.rs | 34 ++-- 4 files changed, 165 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index eec4009c22c..394665e33e6 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -665,6 +665,12 @@ references = ["smithy-rs#2865"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } author = "david-perez" +[[aws-sdk-rust]] +message = "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client." +references = ["aws-sdk-rust#579", "aws-sdk-rust#338"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" + [[smithy-rs]] message = """ [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index 7d91c6d363a..041d0f82612 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -118,12 +118,9 @@ mod tests { async fn profile_name_override() { let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk_ua_app_id = correct")]); let conf = crate::from_env() - .configure( - ProviderConfig::empty() - .with_fs(fs) - .with_sleep(InstantSleep) - .with_http_connector(no_traffic_connector()), - ) + .sleep_impl(InstantSleep) + .fs(fs) + .http_connector(no_traffic_connector()) .profile_name("custom") .profile_files( ProfileFiles::builder() diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index e7c035ea803..91856725773 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -161,6 +161,7 @@ mod loader { use aws_smithy_types::timeout::TimeoutConfig; use aws_types::app_name::AppName; use aws_types::docs_for; + use aws_types::os_shim_internal::{Env, Fs}; use aws_types::SdkConfig; use crate::connector::default_connector; @@ -205,6 +206,8 @@ mod loader { use_fips: Option, use_dual_stack: Option, time_source: Option, + env: Option, + fs: Option, } impl ConfigLoader { @@ -281,35 +284,43 @@ mod loader { self } - /// Override the [`HttpConnector`] for this [`ConfigLoader`]. The connector will be used when - /// sending operations. This **does not set** the HTTP connector used by config providers. - /// To change that connector, use [ConfigLoader::configure]. + /// Override the [`HttpConnector`] for this [`ConfigLoader`]. The connector will be used for + /// both AWS services and credential providers. When [`HttpConnector::ConnectorFn`] is used, + /// the connector will be lazily instantiated as needed based on the provided settings. /// + /// **Note**: In order to take advantage of late-configured timeout settings, you MUST use + /// [`HttpConnector::ConnectorFn`] + /// when configuring this connector. + /// + /// If you wish to use a separate connector when creating clients, use the client-specific config. /// ## Examples /// ```no_run - /// # #[cfg(feature = "client-hyper")] + /// # use aws_smithy_async::rt::sleep::SharedAsyncSleep; + /// use aws_smithy_client::http_connector::HttpConnector; + /// #[cfg(feature = "client-hyper")] /// # async fn create_config() { /// use std::time::Duration; /// use aws_smithy_client::{Client, hyper_ext}; /// use aws_smithy_client::erase::DynConnector; /// use aws_smithy_client::http_connector::ConnectorSettings; /// - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .enable_http2() - /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); + /// let connector_fn = |settings: &ConnectorSettings, sleep: Option| { + /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// .with_webpki_roots() + /// // NOTE: setting `https_only()` will not allow this connector to work with IMDS. + /// .https_only() + /// .enable_http1() + /// .enable_http2() + /// .build(); + /// let mut smithy_connector = hyper_ext::Adapter::builder() + /// // Optionally set things like timeouts as well + /// .connector_settings(settings.clone()); + /// smithy_connector.set_sleep_impl(sleep); + /// Some(DynConnector::new(smithy_connector.build(https_connector))) + /// }; + /// let connector = HttpConnector::ConnectorFn(std::sync::Arc::new(connector_fn)); /// let sdk_config = aws_config::from_env() - /// .http_connector(smithy_connector) + /// .http_connector(connector) /// .load() /// .await; /// # } @@ -532,6 +543,9 @@ mod loader { /// let shared_config = aws_config::from_env().configure(provider_config).load().await; /// # } /// ``` + #[deprecated( + note = "Use setters on this builder instead. configure is very hard to use correctly." + )] pub fn configure(mut self, provider_config: ProviderConfig) -> Self { self.provider_config = Some(provider_config); self @@ -547,9 +561,35 @@ mod loader { /// This means that if you provide a region provider that does not return a region, no region will /// be set in the resulting [`SdkConfig`](aws_types::SdkConfig) pub async fn load(self) -> SdkConfig { + let http_connector = self + .http_connector + .unwrap_or_else(|| HttpConnector::ConnectorFn(Arc::new(default_connector))); + + let time_source = self.time_source.unwrap_or_default(); + + let sleep_impl = if self.sleep.is_some() { + self.sleep + } else { + if default_async_sleep().is_none() { + tracing::warn!( + "An implementation of AsyncSleep was requested by calling default_async_sleep \ + but no default was set. + This happened when ConfigLoader::load was called during Config construction. \ + You can fix this by setting a sleep_impl on the ConfigLoader before calling \ + load or by enabling the rt-tokio feature" + ); + } + default_async_sleep() + }; + let conf = self .provider_config - .unwrap_or_default() + .unwrap_or_else(|| { + ProviderConfig::init(time_source.clone(), sleep_impl.clone()) + .with_fs(self.fs.unwrap_or_default()) + .with_env(self.env.unwrap_or_default()) + .with_http_connector(http_connector.clone()) + }) .with_profile_config(self.profile_files_override, self.profile_name_override); let region = if let Some(provider) = self.region { provider.region().await @@ -579,21 +619,6 @@ mod loader { .await }; - let sleep_impl = if self.sleep.is_some() { - self.sleep - } else { - if default_async_sleep().is_none() { - tracing::warn!( - "An implementation of AsyncSleep was requested by calling default_async_sleep \ - but no default was set. - This happened when ConfigLoader::load was called during Config construction. \ - You can fix this by setting a sleep_impl on the ConfigLoader before calling \ - load or by enabling the rt-tokio feature" - ); - } - default_async_sleep() - }; - let timeout_config = if let Some(timeout_config) = self.timeout_config { timeout_config } else { @@ -603,10 +628,6 @@ mod loader { .await }; - let http_connector = self - .http_connector - .unwrap_or_else(|| HttpConnector::ConnectorFn(Arc::new(default_connector))); - let credentials_provider = match self.credentials_provider { CredentialsProviderOption::Set(provider) => Some(provider), CredentialsProviderOption::NotSet => { @@ -641,13 +662,11 @@ mod loader { use_dual_stack_provider(&conf).await }; - let ts = self.time_source.unwrap_or_default(); - let mut builder = SdkConfig::builder() .region(region) .retry_config(retry_config) .timeout_config(timeout_config) - .time_source(ts) + .time_source(time_source) .http_connector(http_connector); builder.set_app_name(app_name); @@ -661,18 +680,35 @@ mod loader { } } + #[cfg(test)] + impl ConfigLoader { + pub(crate) fn env(mut self, env: Env) -> Self { + self.env = Some(env); + self + } + + pub(crate) fn fs(mut self, fs: Fs) -> Self { + self.fs = Some(fs); + self + } + } + #[cfg(test)] mod test { use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::time::{StaticTimeSource, TimeSource}; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::never::NeverConnector; + use aws_smithy_client::test_connection::infallible_connection_fn; use aws_types::app_name::AppName; use aws_types::os_shim_internal::{Env, Fs}; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; + use std::time::{SystemTime, UNIX_EPOCH}; use tracing_test::traced_test; use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; - use crate::provider_config::ProviderConfig; use crate::test_case::{no_traffic_connector, InstantSleep}; use crate::{from_env, ConfigLoader}; @@ -688,13 +724,10 @@ mod loader { let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk-ua-app-id = correct")]); let loader = from_env() - .configure( - ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_env(env) - .with_fs(fs) - .with_http_connector(DynConnector::new(NeverConnector::new())), - ) + .sleep_impl(TokioSleep::new()) + .env(env) + .fs(fs) + .http_connector(DynConnector::new(NeverConnector::new())) .profile_name("custom") .profile_files( ProfileFiles::builder() @@ -734,11 +767,9 @@ mod loader { } fn base_conf() -> ConfigLoader { - from_env().configure( - ProviderConfig::empty() - .with_sleep(InstantSleep) - .with_http_connector(no_traffic_connector()), - ) + from_env() + .sleep_impl(InstantSleep) + .http_connector(no_traffic_connector()) } #[tokio::test] @@ -770,5 +801,54 @@ mod loader { assert!(config.credentials_cache().is_none()); assert!(config.credentials_provider().is_none()); } + + #[tokio::test] + async fn connector_is_shared() { + let num_requests = Arc::new(AtomicUsize::new(0)); + let movable = num_requests.clone(); + let conn = infallible_connection_fn(move |_req| { + movable.fetch_add(1, Ordering::Relaxed); + http::Response::new("ok!") + }); + let config = from_env().http_connector(conn.clone()).load().await; + config + .credentials_provider() + .unwrap() + .provide_credentials() + .await + .expect_err("no traffic is allowed"); + let num_requests = num_requests.load(Ordering::Relaxed); + assert!(num_requests > 0, "{}", num_requests); + } + + #[tokio::test] + async fn time_source_is_passed() { + #[derive(Debug)] + struct PanicTs; + impl TimeSource for PanicTs { + fn now(&self) -> SystemTime { + panic!("timesource-was-used") + } + } + let config = from_env() + .sleep_impl(InstantSleep) + .time_source(StaticTimeSource::new(UNIX_EPOCH)) + .http_connector(no_traffic_connector()) + .load() + .await; + // assert that the innards contain the customized fields + for inner in ["InstantSleep", "StaticTimeSource"] { + assert!( + format!("{:#?}", config.credentials_cache()).contains(inner), + "{:#?}", + config.credentials_cache() + ); + assert!( + format!("{:#?}", config.credentials_provider()).contains(inner), + "{:#?}", + config.credentials_cache() + ); + } + } } } diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index 3712376b425..f1caa75e511 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -150,6 +150,21 @@ impl ProviderConfig { } } + /// Initializer for ConfigBag to avoid possibly setting incorrect defaults. + pub(crate) fn init(time_source: SharedTimeSource, sleep: Option) -> Self { + Self { + parsed_profile: Default::default(), + profile_files: ProfileFiles::default(), + env: Env::default(), + fs: Fs::default(), + time_source, + connector: HttpConnector::Prebuilt(None), + sleep, + region: None, + profile_name_override: None, + } + } + /// Create a default provider config with the region region automatically loaded from the default chain. /// /// # Examples @@ -270,10 +285,7 @@ impl ProviderConfig { self.with_region(provider_chain.region().await) } - // these setters are doc(hidden) because they only exist for tests - - #[doc(hidden)] - pub fn with_fs(self, fs: Fs) -> Self { + pub(crate) fn with_fs(self, fs: Fs) -> Self { ProviderConfig { parsed_profile: Default::default(), fs, @@ -281,8 +293,7 @@ impl ProviderConfig { } } - #[cfg(test)] - pub fn with_env(self, env: Env) -> Self { + pub(crate) fn with_env(self, env: Env) -> Self { ProviderConfig { parsed_profile: Default::default(), env, @@ -303,14 +314,11 @@ impl ProviderConfig { /// Override the HTTPS connector for this configuration /// - /// **Warning**: Use of this method will prevent you from taking advantage of the HTTP connect timeouts. - /// Consider [`ProviderConfig::with_tcp_connector`]. - /// - /// # Stability - /// This method is expected to change to support HTTP configuration. - pub fn with_http_connector(self, connector: DynConnector) -> Self { + /// **Note**: In order to take advantage of late-configured timeout settings, use [`HttpConnector::ConnectorFn`] + /// when configuring this connector. + pub fn with_http_connector(self, connector: impl Into) -> Self { ProviderConfig { - connector: HttpConnector::Prebuilt(Some(connector)), + connector: connector.into(), ..self } } From 911aa716852d1d478a2740d2de43f43a8f30a028 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 27 Jul 2023 10:06:39 -0700 Subject: [PATCH 040/331] Add names to interceptors (#2878) This PR adds a `name` function to the `Interceptor` trait so that interceptor errors are easier to narrow down. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/apigateway_interceptors.rs | 4 + .../src/glacier_interceptors.rs | 12 ++ .../src/http_request_checksum.rs | 4 + .../src/http_response_checksum.rs | 4 + .../src/presigning_interceptors.rs | 4 + .../src/route53_resource_id_preprocessor.rs | 4 + .../aws-runtime/src/invocation_id.rs | 4 + .../aws-runtime/src/recursion_detection.rs | 4 + .../aws-runtime/src/request_info.rs | 9 +- .../aws-runtime/src/user_agent.rs | 4 + .../AwsCustomizableOperationDecorator.kt | 4 + .../EndpointParamsInterceptorGenerator.kt | 4 + .../MetadataCustomizationTest.kt | 4 + .../smithy/endpoint/EndpointsDecoratorTest.kt | 4 + .../generators/EndpointTraitBindingsTest.kt | 4 + .../protocol/ProtocolTestGeneratorTest.kt | 4 + .../src/client/interceptors.rs | 3 + .../src/client/interceptors/error.rs | 15 ++- .../client/connectors/connection_poisoning.rs | 4 + .../src/client/interceptors.rs | 109 +++++++++++++----- .../src/client/orchestrator.rs | 86 ++++++++------ .../interceptors/service_clock_skew.rs | 4 + .../src/client_http_checksum_required.rs | 4 + .../src/client_idempotency_token.rs | 4 + 24 files changed, 233 insertions(+), 73 deletions(-) diff --git a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs index 261932f3fb7..7dc1a687df4 100644 --- a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs @@ -18,6 +18,10 @@ use http::HeaderValue; pub(crate) struct AcceptHeaderInterceptor; impl Interceptor for AcceptHeaderInterceptor { + fn name(&self) -> &'static str { + "AcceptHeaderInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index efd71582afa..3b20b5fff76 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -68,6 +68,10 @@ impl GlacierAccountIdAutofillInterceptor { impl Interceptor for GlacierAccountIdAutofillInterceptor { + fn name(&self) -> &'static str { + "GlacierAccountIdAutofillInterceptor" + } + fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, @@ -97,6 +101,10 @@ impl GlacierApiVersionInterceptor { } impl Interceptor for GlacierApiVersionInterceptor { + fn name(&self) -> &'static str { + "GlacierApiVersionInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, @@ -116,6 +124,10 @@ impl Interceptor for GlacierApiVersionInterceptor { pub(crate) struct GlacierTreeHashHeaderInterceptor; impl Interceptor for GlacierTreeHashHeaderInterceptor { + fn name(&self) -> &'static str { + "GlacierTreeHashHeaderInterceptor" + } + fn modify_before_serialization( &self, _context: &mut BeforeSerializationInterceptorContextMut<'_>, diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index 702fbe56c2d..aff4e925e42 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -79,6 +79,10 @@ impl Interceptor for RequestChecksumInterceptor where AP: Fn(&Input) -> Result, BoxError> + Send + Sync, { + fn name(&self) -> &'static str { + "RequestChecksumInterceptor" + } + fn read_before_serialization( &self, context: &BeforeSerializationInterceptorContextRef<'_>, diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index 2a98830d8e9..729eb97c4c2 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -56,6 +56,10 @@ impl Interceptor for ResponseChecksumInterceptor where VE: Fn(&Input) -> bool + Send + Sync, { + fn name(&self) -> &'static str { + "ResponseChecksumInterceptor" + } + fn read_before_serialization( &self, context: &BeforeSerializationInterceptorContextRef<'_>, diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs index 7161134ac85..3ded9fcd686 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs @@ -47,6 +47,10 @@ impl SigV4PresigningInterceptor { } impl Interceptor for SigV4PresigningInterceptor { + fn name(&self) -> &'static str { + "SigV4PresigningInterceptor" + } + fn modify_before_serialization( &self, _context: &mut BeforeSerializationInterceptorContextMut<'_>, diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs index 00f158317f9..32fad6b160a 100644 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs +++ b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs @@ -72,6 +72,10 @@ where G: for<'a> Fn(&'a mut T) -> &'a mut Option + Send + Sync, T: fmt::Debug + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "Route53ResourceIdInterceptor" + } + fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 16d3fc98117..3ee5923f07d 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -93,6 +93,10 @@ impl InvocationIdInterceptor { } impl Interceptor for InvocationIdInterceptor { + fn name(&self) -> &'static str { + "InvocationIdInterceptor" + } + fn modify_before_retry_loop( &self, _ctx: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index 3cbda55c4d1..2e87f24edbf 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -40,6 +40,10 @@ impl RecursionDetectionInterceptor { } impl Interceptor for RecursionDetectionInterceptor { + fn name(&self) -> &'static str { + "RecursionDetectionInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index f0abff30418..fcea15ef51d 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -87,6 +87,10 @@ impl RequestInfoInterceptor { } impl Interceptor for RequestInfoInterceptor { + fn name(&self) -> &'static str { + "RequestInfoInterceptor" + } + fn modify_before_transmit( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, @@ -166,13 +170,12 @@ mod tests { use super::RequestInfoInterceptor; use crate::request_info::RequestPairs; use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; - use aws_smithy_types::type_erasure::TypeErasedBox; use http::HeaderValue; use std::time::Duration; @@ -190,7 +193,7 @@ mod tests { #[test] fn test_request_pairs_for_initial_attempt() { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); - let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 5e91bd8d230..75e48766b59 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -72,6 +72,10 @@ fn header_values( } impl Interceptor for UserAgentInterceptor { + fn name(&self) -> &'static str { + "UserAgentInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt index 17e8dd248b3..8e15437aa30 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt @@ -60,6 +60,10 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : where F: Fn(&mut BeforeTransmitInterceptorContextMut<'_>, &mut ConfigBag) + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "TestParamsSetterInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index 2cd374ad6e1..2c46cf4bba8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -74,6 +74,10 @@ class EndpointParamsInterceptorGenerator( struct $interceptorName; impl #{Interceptor} for $interceptorName { + fn name(&self) -> &'static str { + ${interceptorName.dq()} + } + fn read_before_execution( &self, context: &#{BeforeSerializationInterceptorContextRef}<'_, #{Input}, #{Output}, #{Error}>, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 0f087d50ad9..3463ab1e737 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -63,6 +63,10 @@ class MetadataCustomizationTest { ); impl #{Interceptor} for ExtractMetadataInterceptor { + fn name(&self) -> &'static str { + "ExtractMetadataInterceptor" + } + fn modify_before_signing( &self, _context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 0b64de45cf5..9d2e74c1b74 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -206,6 +206,10 @@ class EndpointsDecoratorTest { called: Arc, } impl Interceptor for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + fn read_before_transmit( &self, _context: &BeforeTransmitInterceptorContextRef<'_>, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index a94148d21cb..845501945b4 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -237,6 +237,10 @@ internal class EndpointTraitBindingsTest { last_endpoint_prefix: Arc>>, } impl Interceptor for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + fn read_before_transmit( &self, _context: &BeforeTransmitInterceptorContextRef<'_>, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index 99beb8d86bd..f214b9d53df 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -41,6 +41,10 @@ private class TestServiceRuntimePluginCustomization( ##[derive(::std::fmt::Debug)] struct TestInterceptor; impl #{Interceptor} for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + fn modify_before_retry_loop( &self, context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 91d72252629..443af2962a7 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -65,6 +65,9 @@ macro_rules! interceptor_trait_fn { /// to read in-flight request or response messages, or "read/write" hooks, which make it possible /// to modify in-flight request or output messages. pub trait Interceptor: fmt::Debug + Send + Sync { + /// The name of this interceptor, used in error messages for debugging. + fn name(&self) -> &'static str; + /// A hook called at the start of an execution, before the SDK /// does anything else. /// diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs index 11ffbd60c9e..cba0829791a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs @@ -12,10 +12,12 @@ macro_rules! interceptor_error_fn { ($fn_name:ident => $error_kind:ident (with source)) => { #[doc = concat!("Create a new error indicating a failure with a ", stringify!($fn_name), " interceptor.")] pub fn $fn_name( + interceptor_name: impl Into, source: impl Into>, ) -> Self { Self { kind: ErrorKind::$error_kind, + interceptor_name: Some(interceptor_name.into()), source: Some(source.into()), } } @@ -25,6 +27,7 @@ macro_rules! interceptor_error_fn { pub fn $fn_name() -> Self { Self { kind: ErrorKind::$error_kind, + interceptor_name: None, source: None, } } @@ -35,6 +38,7 @@ macro_rules! interceptor_error_fn { #[derive(Debug)] pub struct InterceptorError { kind: ErrorKind, + interceptor_name: Option, source: Option, } @@ -125,14 +129,15 @@ macro_rules! display_interceptor_err { { use ErrorKind::*; match &$self.kind { - $($error_kind => display_interceptor_err!($f, $fn_name, ($($option)+)),)+ + $($error_kind => display_interceptor_err!($self, $f, $fn_name, ($($option)+)),)+ } } }; - ($f:ident, $fn_name:ident, (interceptor error)) => { - $f.write_str(concat!(stringify!($fn_name), " interceptor encountered an error")) - }; - ($f:ident, $fn_name:ident, (invalid access $name:ident $message:literal)) => { + ($self:ident, $f:ident, $fn_name:ident, (interceptor error)) => {{ + $f.write_str($self.interceptor_name.as_deref().unwrap_or_default())?; + $f.write_str(concat!(" ", stringify!($fn_name), " interceptor encountered an error")) + }}; + ($self:ident, $f:ident, $fn_name:ident, (invalid access $name:ident $message:literal)) => { $f.write_str(concat!("tried to access the ", stringify!($name), " ", $message)) }; } diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs index 1903198a954..7c1517550de 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs @@ -40,6 +40,10 @@ impl ConnectionPoisoningInterceptor { } impl Interceptor for ConnectionPoisoningInterceptor { + fn name(&self) -> &'static str { + "ConnectionPoisoningInterceptor" + } + fn modify_before_transmit( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index 931866c6219..f676f1baf2b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -36,7 +36,7 @@ macro_rules! interceptor_impl_fn { stringify!($interceptor), "` interceptors" )); - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let mut ctx = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { @@ -44,13 +44,18 @@ macro_rules! interceptor_impl_fn { interceptor.$interceptor(&mut ctx, runtime_components, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + stringify!($interceptor), + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::$interceptor) + result.map_err(|(name, err)| InterceptorError::$interceptor(name, err)) } }; (ref $interceptor:ident) => { @@ -60,20 +65,25 @@ macro_rules! interceptor_impl_fn { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let ctx = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { if let Err(new_error) = interceptor.$interceptor(&ctx, runtime_components, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + stringify!($interceptor), + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::$interceptor) + result.map_err(|(name, err)| InterceptorError::$interceptor(name, err)) } }; } @@ -105,19 +115,24 @@ where "running {} `read_before_execution` interceptors", if operation { "operation" } else { "client" } ); - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + "read_before_execution", + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::read_before_execution) + result.map_err(|(name, err)| InterceptorError::read_before_execution(name, err)) } interceptor_impl_fn!(mut modify_before_serialization); @@ -142,7 +157,7 @@ where cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `modify_before_attempt_completion` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { @@ -150,13 +165,18 @@ where interceptor.modify_before_attempt_completion(&mut ctx, runtime_components, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + "modify_before_attempt_completion", + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::modify_before_attempt_completion) + result.map_err(|(name, err)| InterceptorError::modify_before_attempt_completion(name, err)) } pub(crate) fn read_after_attempt( @@ -166,7 +186,7 @@ where cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `read_after_attempt` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { @@ -174,13 +194,18 @@ where interceptor.read_after_attempt(&ctx, runtime_components, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + "read_after_attempt", + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::read_after_attempt) + result.map_err(|(name, err)| InterceptorError::read_after_attempt(name, err)) } pub(crate) fn modify_before_completion( @@ -190,7 +215,7 @@ where cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `modify_before_completion` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { @@ -198,13 +223,18 @@ where interceptor.modify_before_completion(&mut ctx, runtime_components, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + "modify_before_completion", + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::modify_before_completion) + result.map_err(|(name, err)| InterceptorError::modify_before_completion(name, err)) } pub(crate) fn read_after_execution( @@ -214,7 +244,7 @@ where cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { tracing::trace!("running `read_after_execution` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); + let mut result: Result<(), (&str, BoxError)> = Ok(()); let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); for interceptor in self.into_iter() { if let Some(interceptor) = interceptor.if_enabled(cfg) { @@ -222,13 +252,18 @@ where interceptor.read_after_execution(&ctx, runtime_components, cfg) { if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); + tracing::debug!( + "{}::{}: {}", + last_error.0, + "read_after_execution", + DisplayErrorContext(&*last_error.1) + ); } - result = Err(new_error); + result = Err((interceptor.name(), new_error)); } } } - result.map_err(InterceptorError::read_after_execution) + result.map_err(|(name, err)| InterceptorError::read_after_execution(name, err)) } } @@ -270,6 +305,10 @@ where F: Fn(HttpRequest) -> Result + Send + Sync + 'static, E: StdError + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "MapRequestInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, @@ -305,6 +344,10 @@ impl Interceptor for MutateRequestInterceptor where F: Fn(&mut HttpRequest) + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "MutateRequestInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, @@ -335,13 +378,21 @@ mod tests { #[derive(Debug)] struct TestInterceptor; - impl Interceptor for TestInterceptor {} + impl Interceptor for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + } #[test] fn test_disable_interceptors() { #[derive(Debug)] struct PanicInterceptor; impl Interceptor for PanicInterceptor { + fn name(&self) -> &'static str { + "PanicInterceptor" + } + fn read_before_transmit( &self, _context: &BeforeTransmitInterceptorContextRef<'_>, diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 2adaab14e25..10154a12c4d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -534,6 +534,8 @@ mod tests { #[derive(Debug)] struct FailingInterceptorA; impl Interceptor for FailingInterceptorA { + fn name(&self) -> &'static str { "FailingInterceptorA" } + fn $interceptor( &self, _ctx: $ctx, @@ -548,6 +550,8 @@ mod tests { #[derive(Debug)] struct FailingInterceptorB; impl Interceptor for FailingInterceptorB { + fn name(&self) -> &'static str { "FailingInterceptorB" } + fn $interceptor( &self, _ctx: $ctx, @@ -562,6 +566,8 @@ mod tests { #[derive(Debug)] struct FailingInterceptorC; impl Interceptor for FailingInterceptorC { + fn name(&self) -> &'static str { "FailingInterceptorC" } + fn $interceptor( &self, _ctx: $ctx, @@ -624,7 +630,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_execution_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })""#.to_string(); interceptor_error_handling_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, @@ -635,7 +641,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_serialization_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })""#.to_string(); interceptor_error_handling_test!( modify_before_serialization, &mut BeforeSerializationInterceptorContextMut<'_>, @@ -646,7 +652,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_serialization_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })""#.to_string(); interceptor_error_handling_test!( read_before_serialization, &BeforeSerializationInterceptorContextRef<'_>, @@ -657,7 +663,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_serialization_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( read_after_serialization, &BeforeTransmitInterceptorContextRef<'_>, @@ -668,7 +674,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_retry_loop_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( modify_before_retry_loop, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -679,7 +685,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_attempt_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( read_before_attempt, &BeforeTransmitInterceptorContextRef<'_>, @@ -690,7 +696,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( modify_before_signing, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -701,7 +707,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( read_before_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -712,7 +718,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( read_after_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -723,7 +729,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_transmit_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( modify_before_transmit, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -734,7 +740,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_transmit_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); interceptor_error_handling_test!( read_before_transmit, &BeforeTransmitInterceptorContextRef<'_>, @@ -745,7 +751,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_transmit_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( read_after_transmit, &BeforeDeserializationInterceptorContextRef<'_>, @@ -756,7 +762,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( modify_before_deserialization, &mut BeforeDeserializationInterceptorContextMut<'_>, @@ -767,7 +773,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( read_before_deserialization, &BeforeDeserializationInterceptorContextRef<'_>, @@ -778,7 +784,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( read_after_deserialization, &AfterDeserializationInterceptorContextRef<'_>, @@ -789,7 +795,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_attempt_completion_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( modify_before_attempt_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -800,7 +806,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_attempt_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( read_after_attempt, &FinalizerInterceptorContextRef<'_>, @@ -811,7 +817,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( modify_before_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -822,7 +828,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_execution_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_handling_test!( read_after_execution, &FinalizerInterceptorContextRef<'_>, @@ -841,6 +847,8 @@ mod tests { #[derive(Debug)] struct OriginInterceptor; impl Interceptor for OriginInterceptor { + fn name(&self) -> &'static str { "OriginInterceptor" } + fn $origin_interceptor( &self, _ctx: $origin_ctx, @@ -855,6 +863,8 @@ mod tests { #[derive(Debug)] struct DestinationInterceptor; impl Interceptor for DestinationInterceptor { + fn name(&self) -> &'static str { "DestinationInterceptor" } + fn $destination_interceptor( &self, _ctx: $destination_ctx, @@ -902,7 +912,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_execution_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") } })""#.to_string(); interceptor_error_redirection_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, @@ -915,7 +925,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") } })""#.to_string(); interceptor_error_redirection_test!( modify_before_serialization, &mut BeforeSerializationInterceptorContextMut<'_>, @@ -928,7 +938,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") } })""#.to_string(); interceptor_error_redirection_test!( read_before_serialization, &BeforeSerializationInterceptorContextRef<'_>, @@ -941,7 +951,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( read_after_serialization, &BeforeTransmitInterceptorContextRef<'_>, @@ -954,7 +964,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_retry_loop_error_causes_jump_to_modify_before_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( modify_before_retry_loop, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -967,7 +977,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_attempt_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( read_before_attempt, &BeforeTransmitInterceptorContextRef<'_>, @@ -980,7 +990,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( modify_before_signing, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -993,7 +1003,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( read_before_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -1006,7 +1016,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( read_after_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -1019,7 +1029,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( modify_before_transmit, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -1032,7 +1042,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); interceptor_error_redirection_test!( read_before_transmit, &BeforeTransmitInterceptorContextRef<'_>, @@ -1045,7 +1055,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); interceptor_error_redirection_test!( read_after_transmit, &BeforeDeserializationInterceptorContextRef<'_>, @@ -1059,7 +1069,7 @@ mod tests { #[traced_test] async fn test_modify_before_deserialization_error_causes_jump_to_modify_before_attempt_completion( ) { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); interceptor_error_redirection_test!( modify_before_deserialization, &mut BeforeDeserializationInterceptorContextMut<'_>, @@ -1073,7 +1083,7 @@ mod tests { #[traced_test] async fn test_read_before_deserialization_error_causes_jump_to_modify_before_attempt_completion( ) { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); interceptor_error_redirection_test!( read_before_deserialization, &BeforeDeserializationInterceptorContextRef<'_>, @@ -1087,7 +1097,7 @@ mod tests { #[traced_test] async fn test_read_after_deserialization_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_redirection_test!( read_after_deserialization, &AfterDeserializationInterceptorContextRef<'_>, @@ -1100,7 +1110,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_attempt_completion_error_causes_jump_to_read_after_attempt() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_redirection_test!( modify_before_attempt_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -1113,7 +1123,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_causes_jump_to_read_after_execution() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); interceptor_error_redirection_test!( modify_before_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -1171,6 +1181,10 @@ mod tests { } impl Interceptor for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + fn modify_before_retry_loop( &self, _context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs index 110f720a81d..16cb5d18b60 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs @@ -66,6 +66,10 @@ fn extract_time_sent_from_response( } impl Interceptor for ServiceClockSkewInterceptor { + fn name(&self) -> &'static str { + "ServiceClockSkewInterceptor" + } + fn modify_before_deserialization( &self, ctx: &mut BeforeDeserializationInterceptorContextMut<'_>, diff --git a/rust-runtime/inlineable/src/client_http_checksum_required.rs b/rust-runtime/inlineable/src/client_http_checksum_required.rs index 50fe4d18e13..10c129b3bfb 100644 --- a/rust-runtime/inlineable/src/client_http_checksum_required.rs +++ b/rust-runtime/inlineable/src/client_http_checksum_required.rs @@ -39,6 +39,10 @@ impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { struct HttpChecksumRequiredInterceptor; impl Interceptor for HttpChecksumRequiredInterceptor { + fn name(&self) -> &'static str { + "HttpChecksumRequiredInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/rust-runtime/inlineable/src/client_idempotency_token.rs b/rust-runtime/inlineable/src/client_idempotency_token.rs index 5e46f6a01ee..778fc1133b4 100644 --- a/rust-runtime/inlineable/src/client_idempotency_token.rs +++ b/rust-runtime/inlineable/src/client_idempotency_token.rs @@ -56,6 +56,10 @@ impl Interceptor for IdempotencyTokenInterceptor where S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync, { + fn name(&self) -> &'static str { + "IdempotencyTokenInterceptor" + } + fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, From 748d05cd0b0b1430fac7ca1f112761219c20b283 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 27 Jul 2023 10:51:12 -0700 Subject: [PATCH 041/331] New-type the interceptor context `Input`, `Output`, and `Error` (#2872) This PR creates new-types for `Input`, `Output`, and `Error` so that the type system can enforce that an output isn't given to an input and vice versa. It also removes `TypedBox` since that isn't really needed anymore. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-config/src/lib.rs | 2 - .../src/glacier_interceptors.rs | 11 +- .../aws-runtime/src/invocation_id.rs | 7 +- .../aws-runtime/src/recursion_detection.rs | 5 +- .../aws-runtime/src/retries/classifier.rs | 18 +- .../aws-runtime/src/user_agent.rs | 5 +- .../aws-sig-auth/src/middleware.rs | 1 - .../rustsdk/AwsFluentClientDecorator.kt | 4 - .../smithy/rustsdk/AwsPresigningDecorator.kt | 5 +- aws/sdk/integration-tests/kms/Cargo.toml | 2 +- .../kms/tests/retryable_errors.rs | 11 +- .../smithy/generators/OperationGenerator.kt | 16 +- .../protocol/ProtocolTestGenerator.kt | 2 +- .../protocol/RequestSerializerGenerator.kt | 3 +- .../protocol/ResponseDeserializerGenerator.kt | 5 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 4 +- .../protocol/ProtocolTestGeneratorTest.kt | 5 +- .../aws-smithy-runtime-api/Cargo.toml | 2 +- .../aws-smithy-runtime-api/src/client/auth.rs | 4 +- .../src/client/endpoint.rs | 4 +- .../src/client/interceptors/context.rs | 105 +++++++---- .../src/client/orchestrator.rs | 6 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 2 +- rust-runtime/aws-smithy-runtime/additional-ci | 12 ++ .../src/client/interceptors.rs | 12 +- .../src/client/orchestrator.rs | 13 +- .../src/client/orchestrator/auth.rs | 9 +- .../src/client/retries/classifier.rs | 15 +- .../src/client/retries/strategy/standard.rs | 16 +- .../aws-smithy-types/src/type_erasure.rs | 170 +++--------------- .../ci-scripts/codegen-diff/semver-checks.py | 6 +- 31 files changed, 193 insertions(+), 289 deletions(-) create mode 100755 rust-runtime/aws-smithy-runtime/additional-ci diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 91856725773..1deffdbe164 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -376,8 +376,6 @@ mod loader { self } - // TODO(enableNewSmithyRuntimeLaunch): Remove the doc hidden from this function - #[doc(hidden)] /// Don't use credentials to sign requests. /// /// Turning off signing with credentials is necessary in some cases, such as using diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 3b20b5fff76..53500eae50a 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -252,9 +252,8 @@ fn compute_hash_tree(mut hashes: Vec) -> Digest { #[cfg(test)] mod account_id_autofill_tests { use super::*; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; - use aws_smithy_types::type_erasure::TypedBox; #[test] fn autofill_account_id() { @@ -270,8 +269,7 @@ mod account_id_autofill_tests { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); - let mut context = - InterceptorContext::new(TypedBox::new(SomeInput { account_id: None }).erase()); + let mut context = InterceptorContext::new(Input::erase(SomeInput { account_id: None })); let mut context = BeforeSerializationInterceptorContextMut::from(&mut context); let interceptor = GlacierAccountIdAutofillInterceptor::::new(); interceptor @@ -293,15 +291,14 @@ mod account_id_autofill_tests { #[cfg(test)] mod api_version_tests { use super::*; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; - use aws_smithy_types::type_erasure::TypedBox; #[test] fn api_version_interceptor() { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); - let mut context = InterceptorContext::new(TypedBox::new("dontcare").erase()); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let mut context = BeforeTransmitInterceptorContextMut::from(&mut context); diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 3ee5923f07d..18fcac7c4a6 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -215,12 +215,11 @@ mod tests { use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{ - BeforeTransmitInterceptorContextMut, InterceptorContext, + BeforeTransmitInterceptorContextMut, Input, InterceptorContext, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; - use aws_smithy_types::type_erasure::TypeErasedBox; use http::HeaderValue; fn expect_header<'a>( @@ -233,7 +232,7 @@ mod tests { #[test] fn default_id_generator() { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = ctx.take_input(); @@ -260,7 +259,7 @@ mod tests { #[test] fn custom_id_generator() { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = ctx.take_input(); diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index 2e87f24edbf..368843a865d 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -80,9 +80,8 @@ mod tests { use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_headers}; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; - use aws_smithy_types::type_erasure::TypeErasedBox; use aws_types::os_shim_internal::Env; use http::HeaderValue; use proptest::{prelude::*, proptest}; @@ -156,7 +155,7 @@ mod tests { request = request.header(name, value); } let request = request.body(SdkBody::empty()).expect("must be valid"); - let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); context.set_request(request); let _ = context.take_input(); diff --git a/aws/rust-runtime/aws-runtime/src/retries/classifier.rs b/aws/rust-runtime/aws-runtime/src/retries/classifier.rs index 5a7675dba24..d73cdf4212a 100644 --- a/aws/rust-runtime/aws-runtime/src/retries/classifier.rs +++ b/aws/rust-runtime/aws-runtime/src/retries/classifier.rs @@ -107,9 +107,9 @@ impl ClassifyRetry for AmzRetryAfterHeaderClassifier { mod test { use super::*; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime_api::client::interceptors::context::{Error, Input}; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; use std::fmt; use std::time::Duration; @@ -164,8 +164,8 @@ mod test { #[test] fn classify_by_error_code() { let policy = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( CodedError::new("Throttling"), )))); @@ -174,8 +174,8 @@ mod test { Some(RetryReason::Error(ErrorKind::ThrottlingError)) ); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( CodedError::new("RequestTimeout"), )))); assert_eq!( @@ -190,9 +190,9 @@ mod test { let err = aws_smithy_types::Error::builder().code("SlowDown").build(); let test_response = http::Response::new("OK").map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(test_response); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new(err)))); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); assert_eq!( policy.classify_retry(&ctx), @@ -208,9 +208,9 @@ mod test { .body("retry later") .unwrap() .map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(res); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( UnmodeledError, )))); diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 75e48766b59..7310820f86c 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -114,12 +114,11 @@ impl Interceptor for UserAgentInterceptor { mod tests { use super::*; use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::error::display::DisplayErrorContext; - use aws_smithy_types::type_erasure::TypeErasedBox; fn expect_header<'a>(context: &'a InterceptorContext, header_name: &str) -> &'a str { context @@ -133,7 +132,7 @@ mod tests { } fn context() -> InterceptorContext { - let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = context.take_input(); diff --git a/aws/rust-runtime/aws-sig-auth/src/middleware.rs b/aws/rust-runtime/aws-sig-auth/src/middleware.rs index fd0b1474a05..b901f3a8561 100644 --- a/aws/rust-runtime/aws-sig-auth/src/middleware.rs +++ b/aws/rust-runtime/aws-sig-auth/src/middleware.rs @@ -151,7 +151,6 @@ fn signing_config( request_ts: config .get::() .map(|t| t.now()) - // TODO(enableNewSmithyRuntimeLaunch): Remove this fallback .unwrap_or_else(|| SharedTimeSource::default().now()), region, payload_override, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index cf8b107a01d..30340e61cca 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -105,10 +105,6 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { renderClientCreation = { params -> rust("let mut ${params.configBuilderName} = ${params.configBuilderName};") if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - // TODO(enableNewSmithyRuntimeLaunch): A builder field could not be accessed directly in the orchestrator - // mode when this code change was made. smithy-rs#2792 will enable us to use getters in builders. - // Make this `set_region` conditional by checking if `config_builder.region().is_none()` once the PR - // has been merged to main. rust("""${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1")));""") } else { rust( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index 522b791fab6..3957f773919 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -336,9 +336,7 @@ class AwsPresignedFluentBuilderMethod( .await .map_err(|err| { err.map_service_error(|err| { - #{TypedBox}::<#{OperationError}>::assume_from(err.into()) - .expect("correct error type") - .unwrap() + err.downcast::<#{OperationError}>().expect("correct error type") }) })?; let request = context.take_request().expect("request set before transmit"); @@ -353,7 +351,6 @@ class AwsPresignedFluentBuilderMethod( "SigV4PresigningRuntimePlugin" to AwsRuntimeType.presigningInterceptor(runtimeConfig) .resolve("SigV4PresigningRuntimePlugin"), "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), - "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), "USER_AGENT" to CargoDependency.Http.toType().resolve("header::USER_AGENT"), "alternate_presigning_serializer" to writable { if (presignableOp.hasModelTransforms()) { diff --git a/aws/sdk/integration-tests/kms/Cargo.toml b/aws/sdk/integration-tests/kms/Cargo.toml index 188a2d42dd2..2c76644e94a 100644 --- a/aws/sdk/integration-tests/kms/Cargo.toml +++ b/aws/sdk/integration-tests/kms/Cargo.toml @@ -19,7 +19,7 @@ aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", featur aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } -aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api" } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } bytes = "1.0.0" http = "0.2.0" tokio = { version = "1.23.1", features = ["full", "test-util"] } diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index 3a275b460d2..ba9090837c8 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -73,11 +73,10 @@ mod orchestrator_mode_tests { use aws_sdk_kms as kms; use aws_smithy_client::test_connection::infallible_connection_fn; use aws_smithy_http::result::SdkError; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; use aws_smithy_types::retry::ErrorKind; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; use bytes::Bytes; use kms::operation::create_alias::CreateAliasError; @@ -113,9 +112,9 @@ mod orchestrator_mode_tests { dbg!(&err); let classifier = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let err = err.into_service_error(); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new(err)))); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); let retry_kind = classifier.classify_retry(&ctx); assert_eq!( Some(RetryReason::Error(ErrorKind::ThrottlingError)), @@ -135,9 +134,9 @@ mod orchestrator_mode_tests { dbg!(&err); let classifier = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let err = err.into_service_error(); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new(err)))); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); let retry_kind = classifier.classify_retry(&ctx); assert_eq!( Some(RetryReason::Error(ErrorKind::ThrottlingError)), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 90b970d1d1e..10f52767f4c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -111,7 +111,8 @@ open class OperationGenerator( val codegenScope = arrayOf( *preludeScope, "Arc" to RuntimeType.Arc, - "Input" to symbolProvider.toSymbol(operationShape.inputShape(model)), + "ConcreteInput" to symbolProvider.toSymbol(operationShape.inputShape(model)), + "Input" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Input"), "Operation" to symbolProvider.toSymbol(operationShape), "OperationError" to errorType, "OperationOutput" to outputType, @@ -129,28 +130,26 @@ open class OperationGenerator( """ pub(crate) async fn orchestrate( runtime_plugins: &#{RuntimePlugins}, - input: #{Input}, + input: #{ConcreteInput}, ) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { let map_err = |err: #{SdkError}<#{Error}, #{HttpResponse}>| { err.map_service_error(|err| { - #{TypedBox}::<#{OperationError}>::assume_from(err.into()) - .expect("correct error type") - .unwrap() + err.downcast::<#{OperationError}>().expect("correct error type") }) }; let context = Self::orchestrate_with_stop_point(runtime_plugins, input, #{StopPoint}::None) .await .map_err(map_err)?; let output = context.finalize().map_err(map_err)?; - #{Ok}(#{TypedBox}::<#{OperationOutput}>::assume_from(output).expect("correct output type").unwrap()) + #{Ok}(output.downcast::<#{OperationOutput}>().expect("correct output type")) } pub(crate) async fn orchestrate_with_stop_point( runtime_plugins: &#{RuntimePlugins}, - input: #{Input}, + input: #{ConcreteInput}, stop_point: #{StopPoint}, ) -> #{Result}<#{InterceptorContext}, #{SdkError}<#{Error}, #{HttpResponse}>> { - let input = #{TypedBox}::new(input).erase(); + let input = #{Input}::erase(input); #{invoke_with_stop_point}( ${codegenContext.serviceShape.sdkId().dq()}, ${operationName.dq()}, @@ -180,7 +179,6 @@ open class OperationGenerator( """, *codegenScope, "Error" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Error"), - "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::error::OrchestratorError"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 583324b0b67..6c08785bfac 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -414,7 +414,7 @@ class DefaultProtocolTestGenerator( rust("let parsed = parsed.unwrap();") } else { rustTemplate( - """let parsed: #{Output} = *parsed.expect("should be successful response").downcast().unwrap();""", + """let parsed = parsed.expect("should be successful response").downcast::<#{Output}>().unwrap();""", "Output" to codegenContext.symbolProvider.toSymbol(expectedShape), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index 0a1385dcd3d..66b9d7e7226 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -56,7 +56,6 @@ class RequestSerializerGenerator( codegenContext.runtimeConfig, ), ).resolve("HeaderSerializationSettings"), - "TypedBox" to smithyTypes.resolve("type_erasure::TypedBox"), ) } @@ -72,7 +71,7 @@ class RequestSerializerGenerator( impl #{RequestSerializer} for $serializerName { ##[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)] fn serialize_input(&self, input: #{Input}, _cfg: &mut #{ConfigBag}) -> #{Result}<#{HttpRequest}, #{BoxError}> { - let input = #{TypedBox}::<#{ConcreteInput}>::assume_from(input).expect("correct type").unwrap(); + let input = input.downcast::<#{ConcreteInput}>().expect("correct type"); let _header_serialization_settings = _cfg.load::<#{HeaderSerializationSettings}>().cloned().unwrap_or_default(); let mut request_builder = { #{create_http_request} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index 59d3956a9fb..accd436e42e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -47,7 +47,6 @@ class ResponseDeserializerGenerator( "ResponseDeserializer" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::ser_de::ResponseDeserializer"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), - "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), "debug_span" to RuntimeType.Tracing.resolve("debug_span"), "type_erase_result" to typeEraseResult(), ) @@ -162,8 +161,8 @@ class ResponseDeserializerGenerator( O: ::std::fmt::Debug + #{Send} + #{Sync} + 'static, E: ::std::error::Error + std::fmt::Debug + #{Send} + #{Sync} + 'static, { - result.map(|output| #{TypedBox}::new(output).erase()) - .map_err(|error| #{TypedBox}::new(error).erase_error()) + result.map(|output| #{Output}::erase(output)) + .map_err(|error| #{Error}::erase(error)) .map_err(#{Into}::into) } """, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index bdbee67f3ab..48821e380dc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -174,6 +174,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { .resolve("client::retries::AlwaysRetry"), "ConfigBag" to RuntimeType.smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag"), "ErrorKind" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::ErrorKind"), + "Input" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Input"), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), "Layer" to RuntimeType.smithyTypes(runtimeConfig).resolve("config_bag::Layer"), "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig) @@ -188,7 +189,6 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), "ShouldAttempt" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::ShouldAttempt"), - "TypeErasedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypeErasedBox"), ) rustCrate.testModule { unitTest("test_operation_overrides_retry_strategy") { @@ -201,7 +201,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { .retry_config(#{RetryConfig}::standard().with_max_attempts(3)) .build(); - let mut ctx = #{InterceptorContext}::new(#{TypeErasedBox}::new(())); + let mut ctx = #{InterceptorContext}::new(#{Input}::doesnt_matter()); ctx.set_output_or_error(#{Err}(#{OrchestratorError}::other("doesn't matter"))); let mut layer = #{Layer}::new("test"); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index f214b9d53df..066c25b8fdc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -102,8 +102,8 @@ private class TestOperationCustomization( crate::operation::say_hello::SayHelloError, > = $fakeOutput; fake_out - .map(|o| #{TypedBox}::new(o).erase()) - .map_err(|e| #{OrchestratorError}::operation(#{TypedBox}::new(e).erase_error())) + .map(|o| #{Output}::erase(o)) + .map_err(|e| #{OrchestratorError}::operation(#{Error}::erase(e))) } } cfg.store_put(#{SharedResponseDeserializer}::new(TestDeser)); @@ -115,7 +115,6 @@ private class TestOperationCustomization( "OrchestratorError" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::OrchestratorError"), "Output" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Output"), "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), - "TypedBox" to RT.smithyTypes(rc).resolve("type_erasure::TypedBox"), ) } } diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 64b3c524c44..426c449ccce 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -13,7 +13,7 @@ repository = "https://github.com/awslabs/smithy-rs" default = [] client = [] http-auth = ["dep:zeroize"] -test-util = [] +test-util = ["aws-smithy-types/test-util"] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index acd96739f65..79a28bef35c 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -10,7 +10,7 @@ use crate::client::identity::{Identity, SharedIdentityResolver}; use crate::client::orchestrator::HttpRequest; use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; +use aws_smithy_types::type_erasure::TypeErasedBox; use aws_smithy_types::Document; use std::borrow::Cow; use std::fmt; @@ -66,7 +66,7 @@ pub struct AuthSchemeOptionResolverParams(TypeErasedBox); impl AuthSchemeOptionResolverParams { /// Creates a new [`AuthSchemeOptionResolverParams`]. pub fn new(params: T) -> Self { - Self(TypedBox::new(params).erase()) + Self(TypeErasedBox::new(params)) } /// Returns the underlying parameters as the type `T` if they are that type. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index 654d7affb56..a32ed602fe5 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -8,7 +8,7 @@ use crate::client::orchestrator::Future; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; -use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; +use aws_smithy_types::type_erasure::TypeErasedBox; use std::fmt; use std::sync::Arc; @@ -23,7 +23,7 @@ pub struct EndpointResolverParams(TypeErasedBox); impl EndpointResolverParams { /// Creates a new [`EndpointResolverParams`] from a concrete parameters instance. pub fn new(params: T) -> Self { - Self(TypedBox::new(params).erase()) + Self(TypeErasedBox::new(params)) } /// Attempts to downcast the underlying concrete parameters to `T` and return it as a reference. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index 7aeb1904c31..63a54767d4a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -36,13 +36,65 @@ use std::fmt::Debug; use std::{fmt, mem}; use tracing::{debug, error, trace}; -// TODO(enableNewSmithyRuntimeLaunch): New-type `Input`/`Output`/`Error` -/// Type-erased operation input. -pub type Input = TypeErasedBox; -/// Type-erased operation output. -pub type Output = TypeErasedBox; -/// Type-erased operation error. -pub type Error = TypeErasedError; +macro_rules! new_type_box { + ($name:ident, $doc:literal) => { + new_type_box!($name, TypeErasedBox, $doc, Send, Sync, fmt::Debug,); + }; + ($name:ident, $underlying:ident, $doc:literal, $($additional_bound:path,)*) => { + #[doc = $doc] + #[derive(Debug)] + pub struct $name($underlying); + + impl $name { + #[doc = concat!("Creates a new `", stringify!($name), "` with the provided concrete input value.")] + pub fn erase(input: T) -> Self { + Self($underlying::new(input)) + } + + #[doc = concat!("Downcasts to the concrete input value.")] + pub fn downcast_ref(&self) -> Option<&T> { + self.0.downcast_ref() + } + + #[doc = concat!("Downcasts to the concrete input value.")] + pub fn downcast_mut(&mut self) -> Option<&mut T> { + self.0.downcast_mut() + } + + #[doc = concat!("Downcasts to the concrete input value.")] + pub fn downcast(self) -> Result { + self.0.downcast::().map(|v| *v).map_err(Self) + } + + #[doc = concat!("Returns a `", stringify!($name), "` with a fake/test value with the expectation that it won't be downcast in the test.")] + #[cfg(feature = "test-util")] + pub fn doesnt_matter() -> Self { + Self($underlying::doesnt_matter()) + } + } + }; +} + +new_type_box!(Input, "Type-erased operation input."); +new_type_box!(Output, "Type-erased operation output."); +new_type_box!( + Error, + TypeErasedError, + "Type-erased operation error.", + std::error::Error, +); + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(&self.0, f) + } +} +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.0.source() + } +} + /// Type-erased result for an operation. pub type OutputOrError = Result>; @@ -391,27 +443,20 @@ fn try_clone(request: &HttpRequest) -> Option { ) } -#[cfg(test)] +#[cfg(all(test, feature = "test-util"))] mod tests { use super::*; use aws_smithy_http::body::SdkBody; - use aws_smithy_types::type_erasure::TypedBox; use http::header::{AUTHORIZATION, CONTENT_LENGTH}; use http::{HeaderValue, Uri}; #[test] fn test_success_transitions() { - let input = TypedBox::new("input".to_string()).erase(); - let output = TypedBox::new("output".to_string()).erase(); + let input = Input::doesnt_matter(); + let output = Output::erase("output".to_string()); let mut context = InterceptorContext::new(input); - assert_eq!( - "input", - context - .input() - .and_then(|i| i.downcast_ref::()) - .unwrap() - ); + assert!(context.input().is_some()); context.input_mut(); context.enter_serialization_phase(); @@ -447,29 +492,13 @@ mod tests { #[test] fn test_rewind_for_retry() { - use std::fmt; - #[derive(Debug)] - struct Error; - impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("don't care") - } - } - impl std::error::Error for Error {} - let mut cfg = ConfigBag::base(); - let input = TypedBox::new("input".to_string()).erase(); - let output = TypedBox::new("output".to_string()).erase(); - let error = TypedBox::new(Error).erase_error(); + let input = Input::doesnt_matter(); + let output = Output::erase("output".to_string()); + let error = Error::doesnt_matter(); let mut context = InterceptorContext::new(input); - assert_eq!( - "input", - context - .input() - .and_then(|i| i.downcast_ref::()) - .unwrap() - ); + assert!(context.input().is_some()); context.enter_serialization_phase(); let _ = context.take_input(); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index f47169cb7bc..76f1bfadce2 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -18,12 +18,12 @@ use crate::box_error::BoxError; use crate::client::interceptors::context::phase::Phase; +use crate::client::interceptors::context::Error; use crate::client::interceptors::InterceptorError; use aws_smithy_async::future::now_or_later::NowOrLater; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::{ConnectorError, SdkError}; use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use aws_smithy_types::type_erasure::TypeErasedError; use bytes::Bytes; use std::fmt::Debug; use std::future::Future as StdFuture; @@ -247,8 +247,8 @@ where } } -impl From for OrchestratorError { - fn from(err: TypeErasedError) -> Self { +impl From for OrchestratorError { + fn from(err: Error) -> Self { Self::operation(err) } } diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index a59e20abddb..e761544d3d9 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -12,7 +12,7 @@ repository = "https://github.com/awslabs/smithy-rs" [features] client = ["aws-smithy-runtime-api/client"] http-auth = ["aws-smithy-runtime-api/http-auth"] -test-util = ["dep:aws-smithy-protocol-test", "dep:tracing-subscriber"] +test-util = ["aws-smithy-runtime-api/test-util", "dep:aws-smithy-protocol-test", "dep:tracing-subscriber"] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } diff --git a/rust-runtime/aws-smithy-runtime/additional-ci b/rust-runtime/aws-smithy-runtime/additional-ci new file mode 100755 index 00000000000..b44c6c05be7 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/additional-ci @@ -0,0 +1,12 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +# This script contains additional CI checks to run for this specific package + +set -e + +echo "### Testing every combination of features (excluding --all-features)" +cargo hack test --feature-powerset --exclude-all-features diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index f676f1baf2b..a6a73c2875d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -419,7 +419,11 @@ mod tests { ); Interceptors::new(rc.interceptors()) - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) + .read_before_transmit( + &InterceptorContext::new(Input::doesnt_matter()), + &rc, + &mut cfg, + ) .expect_err("interceptor returns error"); cfg.interceptor_state() .store_put(disable_interceptor::("test")); @@ -432,7 +436,11 @@ mod tests { ); // shouldn't error because interceptors won't run Interceptors::new(rc.interceptors()) - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &rc, &mut cfg) + .read_before_transmit( + &InterceptorContext::new(Input::doesnt_matter()), + &rc, + &mut cfg, + ) .expect("interceptor is now disabled"); } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 10154a12c4d..404ffdae5af 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -445,7 +445,6 @@ mod tests { use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins}; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; use std::borrow::Cow; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -465,7 +464,7 @@ mod tests { .status(StatusCode::OK) .body(SdkBody::empty()) .map_err(|err| OrchestratorError::other(Box::new(err))) - .map(|res| Output::new(Box::new(res))), + .map(|res| Output::erase(res)), ) } @@ -609,7 +608,7 @@ mod tests { } } - let input = TypeErasedBox::new(Box::new(())); + let input = Input::doesnt_matter(); let runtime_plugins = RuntimePlugins::new() .with_client_plugin(FailingInterceptorsClientRuntimePlugin::new()) .with_operation_plugin(TestOperationRuntimePlugin::new()) @@ -893,7 +892,7 @@ mod tests { } } - let input = TypeErasedBox::new(Box::new(())); + let input = Input::doesnt_matter(); let runtime_plugins = RuntimePlugins::new() .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) @@ -1145,7 +1144,7 @@ mod tests { let context = invoke_with_stop_point( "test", "test", - TypedBox::new(()).erase(), + Input::doesnt_matter(), &runtime_plugins(), StopPoint::None, ) @@ -1157,7 +1156,7 @@ mod tests { let context = invoke_with_stop_point( "test", "test", - TypedBox::new(()).erase(), + Input::doesnt_matter(), &runtime_plugins(), StopPoint::BeforeTransmit, ) @@ -1247,7 +1246,7 @@ mod tests { let context = invoke_with_stop_point( "test", "test", - TypedBox::new(()).erase(), + Input::doesnt_matter(), &runtime_plugins(), StopPoint::BeforeTransmit, ) diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index f300750b2df..71a9b048732 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -161,13 +161,12 @@ mod tests { use aws_smithy_runtime_api::client::identity::{ Identity, IdentityResolver, SharedIdentityResolver, }; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{Future, HttpRequest}; use aws_smithy_runtime_api::client::runtime_components::{ GetIdentityResolver, RuntimeComponentsBuilder, }; use aws_smithy_types::config_bag::Layer; - use aws_smithy_types::type_erasure::TypedBox; use std::collections::HashMap; #[tokio::test] @@ -222,7 +221,7 @@ mod tests { } } - let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = ctx.take_input(); @@ -268,7 +267,7 @@ mod tests { }; use aws_smithy_runtime_api::client::identity::http::{Login, Token}; - let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = ctx.take_input(); @@ -317,7 +316,7 @@ mod tests { // Next, test the presence of a bearer token and absence of basic auth let (runtime_components, cfg) = config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new("t", None)); - let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); + let mut ctx = InterceptorContext::new(Input::erase("doesnt-matter")); ctx.enter_serialization_phase(); ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); let _ = ctx.take_input(); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs index 5ff4911f0fe..f22c7651366 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs @@ -150,11 +150,10 @@ mod test { HttpStatusCodeClassifier, ModeledAsRetryableClassifier, }; use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; use std::fmt; use super::SmithyErrorClassifier; @@ -178,7 +177,7 @@ mod test { .body("error!") .unwrap() .map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(res); assert_eq!( policy.classify_retry(&ctx), @@ -194,7 +193,7 @@ mod test { .body("error!") .unwrap() .map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(res); assert_eq!(policy.classify_retry(&ctx), None); } @@ -224,8 +223,8 @@ mod test { impl std::error::Error for RetryableError {} let policy = ModeledAsRetryableClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( RetryableError, )))); @@ -238,7 +237,7 @@ mod test { #[test] fn classify_response_error() { let policy = SmithyErrorClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::response( "I am a response error".into(), ))); @@ -251,7 +250,7 @@ mod test { #[test] fn test_timeout_error() { let policy = SmithyErrorClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::timeout( "I am a timeout error".into(), ))); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index 160fe71ca6b..915f8fad0f9 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -317,21 +317,21 @@ mod tests { use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; - use aws_smithy_types::type_erasure::TypeErasedBox; use std::fmt; use std::sync::Mutex; use std::time::Duration; #[cfg(feature = "test-util")] use crate::client::retries::token_bucket::TokenBucket; + use aws_smithy_runtime_api::client::interceptors::context::{Input, Output}; #[test] fn no_retry_necessary_for_ok_result() { let cfg = ConfigBag::base(); let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let strategy = StandardRetryStrategy::default(); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); let actual = strategy .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); @@ -342,7 +342,7 @@ mod tests { error_kind: ErrorKind, current_request_attempts: u32, ) -> (InterceptorContext, RuntimeComponents, ConfigBag) { - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); let rc = RuntimeComponentsBuilder::for_tests() .with_retry_classifiers(Some( @@ -469,7 +469,7 @@ mod tests { .build() .unwrap(); let cfg = ConfigBag::base(); - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); // This type doesn't matter b/c the classifier will just return whatever we tell it to. ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); @@ -498,7 +498,7 @@ mod tests { assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); cfg.interceptor_state().store_put(RequestAttempts::new(3)); let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); @@ -581,7 +581,7 @@ mod tests { assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 90); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); cfg.interceptor_state().store_put(RequestAttempts::new(3)); let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); @@ -623,7 +623,7 @@ mod tests { let permit = strategy.retry_permit.lock().unwrap().take().unwrap(); permit.forget(); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); // Replenish permits until we get back to `PERMIT_COUNT` while token_bucket.available_permits() < PERMIT_COUNT { diff --git a/rust-runtime/aws-smithy-types/src/type_erasure.rs b/rust-runtime/aws-smithy-types/src/type_erasure.rs index b4acdbb72d7..86533cb9f3f 100644 --- a/rust-runtime/aws-smithy-types/src/type_erasure.rs +++ b/rust-runtime/aws-smithy-types/src/type_erasure.rs @@ -6,125 +6,34 @@ use std::any::Any; use std::error::Error as StdError; use std::fmt; -use std::marker::PhantomData; -use std::ops::{Deref, DerefMut}; use std::sync::Arc; -/// A [`TypeErasedBox`] with type information tracked via generics at compile-time -/// -/// `TypedBox` is used to transition to/from a `TypeErasedBox`. A `TypedBox` can only -/// be created from a `T` or from a `TypeErasedBox` value that _is a_ `T`. Therefore, it can -/// be assumed to be a `T` even though the underlying storage is still a `TypeErasedBox`. -/// Since the `T` is only used in `PhantomData`, it gets compiled down to just a `TypeErasedBox`. +/// Abstraction over `Box` that provides `Debug` and optionally `Clone`. /// /// The orchestrator uses `TypeErasedBox` to avoid the complication of six or more generic parameters -/// and to avoid the monomorphization that brings with it. This `TypedBox` will primarily be useful -/// for operation-specific or service-specific interceptors that need to operate on the actual -/// input/output/error types. -pub struct TypedBox { - inner: TypeErasedBox, - _phantom: PhantomData, -} - -impl TypedBox -where - T: fmt::Debug + Send + Sync + 'static, -{ - /// Creates a new `TypedBox` from `inner` of type `T` - pub fn new(inner: T) -> Self { - Self { - inner: TypeErasedBox::new(inner), - _phantom: Default::default(), - } - } - - /// Tries to create a `TypedBox` from a `TypeErasedBox`. - /// - /// If the `TypedBox` can't be created due to the `TypeErasedBox`'s value consisting - /// of another type, then the original `TypeErasedBox` will be returned in the `Err` variant. - pub fn assume_from(type_erased: TypeErasedBox) -> Result, TypeErasedBox> { - if type_erased.downcast_ref::().is_some() { - Ok(TypedBox { - inner: type_erased, - _phantom: Default::default(), - }) - } else { - Err(type_erased) - } - } - - /// Converts the `TypedBox` back into `T`. - pub fn unwrap(self) -> T { - *self.inner.downcast::().expect("type checked") - } - - /// Converts the `TypedBox` into a `TypeErasedBox`. - pub fn erase(self) -> TypeErasedBox { - self.inner - } -} - -impl TypedBox -where - T: StdError + fmt::Debug + Send + Sync + 'static, -{ - /// Converts `TypedBox` to a `TypeErasedError` where `T` implements `Error`. - pub fn erase_error(self) -> TypeErasedError { - TypeErasedError::new(self.unwrap()) - } -} - -impl fmt::Debug for TypedBox -where - T: Send + Sync + 'static, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("TypedBox:")?; - (self.inner.debug)(&self.inner.field, f) - } -} - -impl Deref for TypedBox { - type Target = T; - - fn deref(&self) -> &Self::Target { - self.inner.downcast_ref().expect("type checked") - } -} - -impl DerefMut for TypedBox { - fn deref_mut(&mut self) -> &mut Self::Target { - self.inner.downcast_mut().expect("type checked") - } -} - -/// Abstraction over `Box` that provides `Debug` and optionally `Clone`. +/// and to avoid the monomorphization that brings with it. /// /// # Examples /// /// Creating a box: /// ```no_run -/// use aws_smithy_types::type_erasure::{TypedBox, TypeErasedBox}; +/// use aws_smithy_types::type_erasure::TypeErasedBox; /// -/// // Creating it directly: /// let boxed = TypeErasedBox::new("some value"); -/// -/// // Creating it from a `TypedBox`: -/// let boxed = TypedBox::new("some value").erase(); /// ``` /// /// Downcasting a box: /// ```no_run -/// # use aws_smithy_types::type_erasure::{TypedBox, TypeErasedBox}; -/// # let boxed = TypedBox::new("some value".to_string()).erase(); +/// # use aws_smithy_types::type_erasure::TypeErasedBox; +/// # let boxed = TypeErasedBox::new("some value".to_string()); /// let value: Option<&String> = boxed.downcast_ref::(); /// ``` /// /// Converting a box back into its value: /// ``` -/// # use aws_smithy_types::type_erasure::{TypedBox, TypeErasedBox}; -/// let boxed = TypedBox::new("some value".to_string()).erase(); -/// let value: String = TypedBox::::assume_from(boxed).expect("it is a string").unwrap(); +/// # use aws_smithy_types::type_erasure::TypeErasedBox; +/// let boxed = TypeErasedBox::new("some value".to_string()); +/// let value: String = *boxed.downcast::().expect("it is a string"); /// ``` pub struct TypeErasedBox { field: Box, @@ -302,11 +211,25 @@ impl TypeErasedError { ) -> Option<&mut T> { self.field.downcast_mut() } + + /// Returns a `TypeErasedError` with a fake/test value with the expectation that it won't be downcast in the test. + #[cfg(feature = "test-util")] + pub fn doesnt_matter() -> Self { + #[derive(Debug)] + struct FakeError; + impl fmt::Display for FakeError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "FakeError") + } + } + impl StdError for FakeError {} + Self::new(FakeError) + } } #[cfg(test)] mod tests { - use super::{TypeErasedBox, TypeErasedError, TypedBox}; + use super::{TypeErasedBox, TypeErasedError}; use std::fmt; #[derive(Debug)] @@ -314,45 +237,6 @@ mod tests { #[derive(Debug)] struct Bar(isize); - #[test] - fn test_typed_boxes() { - let foo = TypedBox::new(Foo("1")); - let bar = TypedBox::new(Bar(2)); - - assert_eq!("TypedBox:Foo(\"1\")", format!("{foo:?}")); - assert_eq!("TypedBox:Bar(2)", format!("{bar:?}")); - - let mut foo_erased = foo.erase(); - foo_erased - .downcast_mut::() - .expect("I know its a Foo") - .0 = "3"; - - let bar_erased = bar.erase(); - assert_eq!( - "TypeErasedBox[!Clone]:Foo(\"3\")", - format!("{foo_erased:?}") - ); - assert_eq!("TypeErasedBox[!Clone]:Bar(2)", format!("{bar_erased:?}")); - - let bar_erased = TypedBox::::assume_from(bar_erased).expect_err("it's not a Foo"); - let mut bar = TypedBox::::assume_from(bar_erased).expect("it's a Bar"); - assert_eq!(2, bar.0); - bar.0 += 1; - - let bar = bar.unwrap(); - assert_eq!(3, bar.0); - - assert!(foo_erased.downcast_ref::().is_none()); - assert!(foo_erased.downcast_mut::().is_none()); - let mut foo_erased = foo_erased.downcast::().expect_err("it's not a Bar"); - - assert_eq!("3", foo_erased.downcast_ref::().expect("it's a Foo").0); - foo_erased.downcast_mut::().expect("it's a Foo").0 = "4"; - let foo = *foo_erased.downcast::().expect("it's a Foo"); - assert_eq!("4", foo.0); - } - #[derive(Debug, Clone, PartialEq, Eq)] struct TestErr { inner: &'static str, @@ -385,10 +269,10 @@ mod tests { #[test] fn test_typed_erased_errors_can_be_unwrapped() { let test_err = TestErr::new("something failed!"); - let type_erased_test_err = TypedBox::new(test_err.clone()).erase_error(); - let actual = TypedBox::::assume_from(type_erased_test_err.into()) - .expect("type erased error can be downcast into original type") - .unwrap(); + let type_erased_test_err = TypeErasedError::new(test_err.clone()); + let actual = *type_erased_test_err + .downcast::() + .expect("type erased error can be downcast into original type"); assert_eq!(test_err, actual); } diff --git a/tools/ci-scripts/codegen-diff/semver-checks.py b/tools/ci-scripts/codegen-diff/semver-checks.py index 3210e564e97..24f6785c81d 100755 --- a/tools/ci-scripts/codegen-diff/semver-checks.py +++ b/tools/ci-scripts/codegen-diff/semver-checks.py @@ -34,12 +34,8 @@ def main(skip_generation=False): os.chdir(sdk_directory) failed = False - # TODO(enableNewSmithyRuntimeLaunch): Remove the deny list below deny_list = [ - "aws-runtime", - "aws-runtime-api", - "aws-smithy-runtime", - "aws-smithy-runtime-api", + # add crate names here to exclude them from the semver checks ] for path in os.listdir(): eprint(f'checking {path}...', end='') From e4099600e5c44189dad64409b3b782ed2ff726f7 Mon Sep 17 00:00:00 2001 From: david-perez Date: Thu, 27 Jul 2023 22:35:45 +0200 Subject: [PATCH 042/331] Update `smithy-rs-maintainers.txt` (#2874) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- tools/ci-build/changelogger/smithy-rs-maintainers.txt | 8 -------- tools/ci-build/changelogger/tests/e2e_test.rs | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/tools/ci-build/changelogger/smithy-rs-maintainers.txt b/tools/ci-build/changelogger/smithy-rs-maintainers.txt index 4d980016b97..f5732607b16 100644 --- a/tools/ci-build/changelogger/smithy-rs-maintainers.txt +++ b/tools/ci-build/changelogger/smithy-rs-maintainers.txt @@ -1,15 +1,7 @@ 82marbag aws-sdk-rust-ci -crisidev david-perez -drganjoo -hlbarber jdisanti -jjant -LukeMathWalker -pose rcoh -unexge velfi -weihanglo ysaito1001 diff --git a/tools/ci-build/changelogger/tests/e2e_test.rs b/tools/ci-build/changelogger/tests/e2e_test.rs index 745e73ef471..7f1a292df88 100644 --- a/tools/ci-build/changelogger/tests/e2e_test.rs +++ b/tools/ci-build/changelogger/tests/e2e_test.rs @@ -467,7 +467,7 @@ author = "rcoh" message = "Fourth change - client" references = ["smithy-rs#4"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "LukeMathWalker" +author = "rcoh" "#; let tmp_dir = TempDir::new().unwrap(); let source_path = tmp_dir.path().join("source.toml"); From b62756ca155dc73cb67d50be561b80ad50d1d48e Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 27 Jul 2023 15:06:54 -0700 Subject: [PATCH 043/331] Add missing docs to `aws-smithy-runtime` and move the clock skew interceptor (#2871) This PR adds missing documentation to the `aws-smith-runtime` crate, and moves the `ServiceClockSkewInterceptor` into the `aws-runtime` crate. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-inlineable/Cargo.toml | 4 +- aws/rust-runtime/aws-runtime/Cargo.toml | 1 - aws/rust-runtime/aws-runtime/src/lib.rs | 3 ++ .../aws-runtime/src/request_info.rs | 2 +- .../aws-runtime/src}/service_clock_skew.rs | 11 +++-- .../RetryInformationHeaderDecorator.kt | 4 +- rust-runtime/aws-smithy-runtime/src/client.rs | 1 + .../src/client/auth/http.rs | 4 ++ .../src/client/auth/no_auth.rs | 9 ++++ .../src/client/config_override.rs | 11 ++++- .../src/client/connectors.rs | 8 ++++ .../client/connectors/connection_poisoning.rs | 9 +++- .../src/client/connectors/test_util.rs | 41 +++++++++++++------ .../aws-smithy-runtime/src/client/identity.rs | 1 + .../src/client/identity/no_auth.rs | 4 ++ .../src/client/interceptors.rs | 4 ++ .../src/client/orchestrator.rs | 16 +++++++- .../src/client/orchestrator/endpoints.rs | 14 ++++++- .../src/client/orchestrator/interceptors.rs | 8 ---- .../aws-smithy-runtime/src/client/retries.rs | 6 ++- .../src/client/retries/classifier.rs | 1 + .../src/client/retries/client_rate_limiter.rs | 5 ++- .../src/client/retries/strategy.rs | 9 ++-- .../client/retries/strategy/fixed_delay.rs | 6 ++- .../src/client/retries/strategy/never.rs | 4 +- .../src/client/retries/strategy/standard.rs | 7 +++- .../src/client/retries/token_bucket.rs | 5 ++- .../src/client/test_util.rs | 3 ++ .../src/client/test_util/deserializer.rs | 4 +- .../src/client/test_util/serializer.rs | 5 ++- rust-runtime/aws-smithy-runtime/src/lib.rs | 3 +- .../src/static_partition_map.rs | 8 +++- .../src/test_util/capture_test_logs.rs | 17 +++++--- 33 files changed, 176 insertions(+), 62 deletions(-) rename {rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors => aws/rust-runtime/aws-runtime/src}/service_clock_skew.rs (91%) delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 4a6630ea6fa..0b8141b092a 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -22,8 +22,8 @@ aws-smithy-checksums = { path = "../../../rust-runtime/aws-smithy-checksums" } aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client" } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-http-tower = { path = "../../../rust-runtime/aws-smithy-http-tower" } -aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } -aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime" } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } +aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-types = { path = "../aws-types" } diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index 9600d1f0a97..fddff0c9fe4 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -18,7 +18,6 @@ aws-sigv4 = { path = "../aws-sigv4" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-types = { path = "../aws-types" } diff --git a/aws/rust-runtime/aws-runtime/src/lib.rs b/aws/rust-runtime/aws-runtime/src/lib.rs index a86f74d0563..6ad3cec3567 100644 --- a/aws/rust-runtime/aws-runtime/src/lib.rs +++ b/aws/rust-runtime/aws-runtime/src/lib.rs @@ -33,3 +33,6 @@ pub mod invocation_id; /// Supporting code for request metadata headers in the AWS SDK. pub mod request_info; + +/// Interceptor that determines the clock skew between the client and service. +pub mod service_clock_skew; diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index fcea15ef51d..ab3311f338d 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime::client::orchestrator::interceptors::ServiceClockSkew; +use crate::service_clock_skew::ServiceClockSkew; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs similarity index 91% rename from rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs rename to aws/rust-runtime/aws-runtime/src/service_clock_skew.rs index 16cb5d18b60..7ada75c2bfe 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs +++ b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs @@ -12,9 +12,10 @@ use aws_smithy_types::date_time::Format; use aws_smithy_types::DateTime; use std::time::{Duration, SystemTime}; +/// Amount of clock skew between the client and the service. #[derive(Debug, Clone)] #[non_exhaustive] -pub struct ServiceClockSkew { +pub(crate) struct ServiceClockSkew { inner: Duration, } @@ -22,10 +23,6 @@ impl ServiceClockSkew { fn new(inner: Duration) -> Self { Self { inner } } - - pub fn skew(&self) -> Duration { - self.inner - } } impl Storable for ServiceClockSkew { @@ -38,11 +35,13 @@ impl From for Duration { } } +/// Interceptor that determines the clock skew between the client and service. #[derive(Debug, Default)] #[non_exhaustive] -pub struct ServiceClockSkewInterceptor {} +pub struct ServiceClockSkewInterceptor; impl ServiceClockSkewInterceptor { + /// Creates a new `ServiceClockSkewInterceptor`. pub fn new() -> Self { Self::default() } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt index 221c2ec4301..e3d9fb2176a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRunti import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.util.letIf class RetryInformationHeaderDecorator : ClientCodegenDecorator { @@ -31,7 +30,6 @@ class RetryInformationHeaderDecorator : ClientCodegenDecorator { private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) override fun section(section: ServiceRuntimePluginSection): Writable = writable { @@ -40,7 +38,7 @@ private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodege section.registerInterceptor(runtimeConfig, this) { rust( "#T::new()", - smithyRuntime.resolve("client::orchestrator::interceptors::ServiceClockSkewInterceptor"), + awsRuntime.resolve("service_clock_skew::ServiceClockSkewInterceptor"), ) } diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index 31722c94d45..629b558c321 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Smithy auth scheme implementations. pub mod auth; /// Smithy code related to connectors and connections. diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 8593f0d9a5c..1e0efcd1c43 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Auth scheme implementations for HTTP API Key, Basic Auth, Bearer Token, and Digest auth. + use aws_smithy_http::query_writer::QueryWriter; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::http::{ @@ -24,7 +26,9 @@ use http::HeaderValue; /// Destination for the API key #[derive(Copy, Clone, Debug)] pub enum ApiKeyLocation { + /// Place the API key in the URL query parameters Query, + /// Place the API key in the request headers Header, } diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs index 115f78b8e8c..ebda0f69432 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs @@ -19,6 +19,7 @@ use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::config_bag::ConfigBag; use std::borrow::Cow; +/// Auth scheme ID for "no auth". pub const NO_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("no_auth"); /// A [`RuntimePlugin`] that registers a "no auth" identity resolver and auth scheme. @@ -36,6 +37,7 @@ impl Default for NoAuthRuntimePlugin { } impl NoAuthRuntimePlugin { + /// Creates a new `NoAuthRuntimePlugin`. pub fn new() -> Self { Self( RuntimeComponentsBuilder::new("NoAuthRuntimePlugin") @@ -54,12 +56,19 @@ impl RuntimePlugin for NoAuthRuntimePlugin { } } +/// The "no auth" auth scheme. +/// +/// The orchestrator requires an auth scheme, so Smithy's `@optionalAuth` trait is implemented +/// by placing a "no auth" auth scheme at the end of the auth scheme options list so that it is +/// used if there's no identity resolver available for the other auth schemes. It's also used +/// for models that don't have auth at all. #[derive(Debug, Default)] pub struct NoAuthScheme { signer: NoAuthSigner, } impl NoAuthScheme { + /// Creates a new `NoAuthScheme`. pub fn new() -> Self { Self::default() } diff --git a/rust-runtime/aws-smithy-runtime/src/client/config_override.rs b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs index c69770a9748..07886a9526d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/config_override.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs @@ -10,11 +10,13 @@ use aws_smithy_types::config_bag::{ }; macro_rules! component { - ($typ:ty, $accessor:ident, $latest_accessor:ident) => { + ($typ:ty, $accessor:ident, $latest_accessor:ident, $doc:tt) => { + #[doc = $doc] pub fn $accessor(&self) -> Option<$typ> { fallback_component!(self, $typ, $accessor) } + #[doc = $doc] pub fn $latest_accessor(&self) -> Option<$typ> { latest_component!(self, $typ, $accessor) } @@ -162,7 +164,12 @@ impl<'a> Resolver<'a> { } // Add additional component methods as needed - component!(SharedAsyncSleep, sleep_impl, latest_sleep_impl); + component!( + SharedAsyncSleep, + sleep_impl, + latest_sleep_impl, + "The async sleep implementation." + ); fn config(&self) -> &Layer { match &self.inner { diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs index 445425680b4..75da05271e8 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs @@ -3,7 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Interceptor for connection poisoning. pub mod connection_poisoning; + #[cfg(feature = "test-util")] pub mod test_util; @@ -17,6 +19,11 @@ pub mod adapter { use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; use std::sync::{Arc, Mutex}; + /// Adapts a [`DynConnector`] to the [`HttpConnector`] trait. + /// + /// This is a temporary adapter that allows the old-style tower-based connectors to + /// work with the new non-tower based architecture of the generated clients. + /// It will be removed in a future release. #[derive(Debug)] pub struct DynConnectorAdapter { // `DynConnector` requires `&mut self`, so we need interior mutability to adapt to it @@ -24,6 +31,7 @@ pub mod adapter { } impl DynConnectorAdapter { + /// Creates a new `DynConnectorAdapter`. pub fn new(dyn_connector: DynConnector) -> Self { Self { dyn_connector: Arc::new(Mutex::new(dyn_connector)), diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs index 7c1517550de..5f6f4e78623 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs @@ -34,6 +34,7 @@ use tracing::{debug, error}; pub struct ConnectionPoisoningInterceptor {} impl ConnectionPoisoningInterceptor { + /// Create a new `ConnectionPoisoningInterceptor`. pub fn new() -> Self { Self::default() } @@ -99,28 +100,32 @@ impl Interceptor for ConnectionPoisoningInterceptor { } } -// TODO(enableNewSmithyRuntimeLaunch) We won't need this once we absorb aws_smithy_http into the -// new runtime crate. +// TODO(enableNewSmithyRuntimeCleanup): A storable wrapper won't be needed anymore once we absorb aws_smithy_http into the new runtime crate. +/// A wrapper around CaptureSmithyConnection that implements `Storable` so that it can be added to the `ConfigBag`. #[derive(Clone, Default)] pub struct CaptureSmithyConnectionWrapper { inner: CaptureSmithyConnection, } impl CaptureSmithyConnectionWrapper { + /// Creates a new `CaptureSmithyConnectionWrapper`. pub fn new() -> Self { Self { inner: CaptureSmithyConnection::new(), } } + /// Returns a reference to the inner `CaptureSmithyConnection`. pub fn clone_inner(&self) -> CaptureSmithyConnection { self.inner.clone() } + /// Returns the captured connection metadata, if any. pub fn get(&self) -> Option { self.inner.get() } + /// Sets the connection retriever function. pub fn set_connection_retriever(&self, f: F) where F: Fn() -> Option + Send + Sync + 'static, diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs index 457b09888d2..c7afd868d4d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs @@ -94,6 +94,11 @@ pub fn capture_request( type ConnectionEvents = Vec; +/// Test data for the [`TestConnector`]. +/// +/// Each `ConnectionEvent` represents one HTTP request and response +/// through the connector. Optionally, a latency value can be set to simulate +/// network latency (done via async sleep in the `TestConnector`). #[derive(Debug)] pub struct ConnectionEvent { latency: Duration, @@ -102,6 +107,7 @@ pub struct ConnectionEvent { } impl ConnectionEvent { + /// Creates a new `ConnectionEvent`. pub fn new(req: HttpRequest, res: HttpResponse) -> Self { Self { res, @@ -116,11 +122,13 @@ impl ConnectionEvent { self } - pub fn req(&self) -> &HttpRequest { + /// Returns the test request. + pub fn request(&self) -> &HttpRequest { &self.req } - pub fn res(&self) -> &HttpResponse { + /// Returns the test response. + pub fn response(&self) -> &HttpResponse { &self.res } } @@ -132,13 +140,13 @@ impl From<(HttpRequest, HttpResponse)> for ConnectionEvent { } #[derive(Debug)] -pub struct ValidateRequest { - pub expected: HttpRequest, - pub actual: HttpRequest, +struct ValidateRequest { + expected: HttpRequest, + actual: HttpRequest, } impl ValidateRequest { - pub fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { + fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { let (actual, expected) = (&self.actual, &self.expected); assert_eq!( actual.uri(), @@ -181,32 +189,41 @@ impl ValidateRequest { } } -/// TestConnection for use as a [`HttpConnector`]. +/// Test connector for use as a [`HttpConnector`]. /// /// A basic test connection. It will: /// - Respond to requests with a preloaded series of responses /// - Record requests for future examination #[derive(Debug, Clone)] -pub struct TestConnection { +pub struct TestConnector { data: Arc>, requests: Arc>>, sleep_impl: SharedAsyncSleep, } -impl TestConnection { +impl TestConnector { + /// Creates a new test connector. pub fn new(mut data: ConnectionEvents, sleep_impl: impl Into) -> Self { data.reverse(); - TestConnection { + TestConnector { data: Arc::new(Mutex::new(data)), requests: Default::default(), sleep_impl: sleep_impl.into(), } } - pub fn requests(&self) -> impl Deref> + '_ { + fn requests(&self) -> impl Deref> + '_ { self.requests.lock().unwrap() } + /// Asserts the expected requests match the actual requests. + /// + /// The expected requests are given as the connection events when the `TestConnector` + /// is created. The `TestConnector` will record the actual requests and assert that + /// they match the expected requests. + /// + /// A list of headers that should be ignored when comparing requests can be passed + /// for cases where headers are non-deterministic or are irrelevant to the test. #[track_caller] pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { for (i, req) in self.requests().iter().enumerate() { @@ -222,7 +239,7 @@ impl TestConnection { } } -impl HttpConnector for TestConnection { +impl HttpConnector for TestConnector { fn call(&self, request: HttpRequest) -> BoxFuture { let (res, simulated_latency) = if let Some(event) = self.data.lock().unwrap().pop() { self.requests.lock().unwrap().push(ValidateRequest { diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity.rs b/rust-runtime/aws-smithy-runtime/src/client/identity.rs index a8b8769057f..7aaef9c3caa 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity.rs @@ -3,4 +3,5 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Identity resolver implementation for "no auth". pub mod no_auth; diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs index 8814336b3a6..01121eab909 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs @@ -7,19 +7,23 @@ use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::Future; use aws_smithy_types::config_bag::ConfigBag; +/// Identity for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. #[derive(Debug, Default)] pub struct NoAuthIdentity; impl NoAuthIdentity { + /// Creates a new `NoAuthIdentity`. pub fn new() -> Self { Self } } +/// Identity resolver for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. #[derive(Debug, Default)] pub struct NoAuthIdentityResolver; impl NoAuthIdentityResolver { + /// Creates a new `NoAuthIdentityResolver`. pub fn new() -> Self { Self } diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index a6a73c2875d..c9dd0746059 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -280,6 +280,7 @@ impl ConditionallyEnabledInterceptor { } } +/// Interceptor that maps the request with a given function. pub struct MapRequestInterceptor { f: F, _phantom: PhantomData, @@ -292,6 +293,7 @@ impl fmt::Debug for MapRequestInterceptor { } impl MapRequestInterceptor { + /// Creates a new `MapRequestInterceptor`. pub fn new(f: F) -> Self { Self { f, @@ -324,6 +326,7 @@ where } } +/// Interceptor that mutates the request with a given function. pub struct MutateRequestInterceptor { f: F, } @@ -335,6 +338,7 @@ impl fmt::Debug for MutateRequestInterceptor { } impl MutateRequestInterceptor { + /// Creates a new `MutateRequestInterceptor`. pub fn new(f: F) -> Self { Self { f } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 404ffdae5af..b86953dded2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -37,7 +37,6 @@ mod auth; /// Defines types that implement a trait for endpoint resolution pub mod endpoints; mod http; -pub mod interceptors; macro_rules! halt { ([$ctx:ident] => $err:expr) => {{ @@ -83,6 +82,15 @@ macro_rules! run_interceptors { }; } +/// Orchestrates the execution of a request and handling of a response. +/// +/// The given `runtime_plugins` will be used to generate a `ConfigBag` for this request, +/// and then the given `input` will be serialized and transmitted. When a response is +/// received, it will be deserialized and returned. +/// +/// This orchestration handles retries, endpoint resolution, identity resolution, and signing. +/// Each of these are configurable via the config and runtime components given by the runtime +/// plugins. pub async fn invoke( service_name: &str, operation_name: &str, @@ -111,6 +119,12 @@ pub enum StopPoint { BeforeTransmit, } +/// Same as [`invoke`], but allows for returning early at different points during orchestration. +/// +/// Orchestration will cease at the point specified by `stop_point`. This is useful for orchestrations +/// that don't need to actually transmit requests, such as for generating presigned requests. +/// +/// See the docs on [`invoke`] for more details. pub async fn invoke_with_stop_point( service_name: &str, operation_name: &str, diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 4f170ec6417..76ce7f40374 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -21,12 +21,14 @@ use std::fmt::Debug; use std::str::FromStr; use tracing::trace; -#[derive(Debug, Clone)] +/// An endpoint resolver that uses a static URI. +#[derive(Clone, Debug)] pub struct StaticUriEndpointResolver { endpoint: Uri, } impl StaticUriEndpointResolver { + /// Create a resolver that resolves to `http://localhost:{port}`. pub fn http_localhost(port: u16) -> Self { Self { endpoint: Uri::from_str(&format!("http://localhost:{port}")) @@ -34,6 +36,7 @@ impl StaticUriEndpointResolver { } } + /// Create a resolver that resolves to the given URI. pub fn uri(endpoint: Uri) -> Self { Self { endpoint } } @@ -64,7 +67,13 @@ impl From for EndpointResolverParams { } } -#[derive(Debug, Clone)] +/// Default implementation of [`EndpointResolver`]. +/// +/// This default endpoint resolver implements the `EndpointResolver` trait by +/// converting the type-erased [`EndpointResolverParams`] into the concrete +/// endpoint params for the service. It then delegates endpoint resolution +/// to an underlying resolver that is aware of the concrete type. +#[derive(Clone, Debug)] pub struct DefaultEndpointResolver { inner: SharedEndpointResolver, } @@ -77,6 +86,7 @@ where } impl DefaultEndpointResolver { + /// Creates a new `DefaultEndpointResolver`. pub fn new(resolve_endpoint: SharedEndpointResolver) -> Self { Self { inner: resolve_endpoint, diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs deleted file mode 100644 index b9de2daa37b..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod service_clock_skew; - -pub use service_clock_skew::{ServiceClockSkew, ServiceClockSkewInterceptor}; diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries.rs b/rust-runtime/aws-smithy-runtime/src/client/retries.rs index 893c5f0163e..8ea71ebb5ed 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries.rs @@ -3,15 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Smithy retry classifiers. pub mod classifier; + +/// Smithy retry strategies. pub mod strategy; mod client_rate_limiter; mod token_bucket; use aws_smithy_types::config_bag::{Storable, StoreReplace}; -pub use client_rate_limiter::{ClientRateLimiter, ClientRateLimiterRuntimePlugin}; use std::fmt; + +pub use client_rate_limiter::{ClientRateLimiter, ClientRateLimiterRuntimePlugin}; pub use token_bucket::{TokenBucket, TokenBucketRuntimePlugin}; #[doc(hidden)] diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs index f22c7651366..254cb636d5a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs @@ -50,6 +50,7 @@ where } } +/// Classifies response, timeout, and connector errors as retryable or not. #[derive(Debug, Default)] pub struct SmithyErrorClassifier { _inner: PhantomData, diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs index 5453cad2718..661f0f854c2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs @@ -16,7 +16,7 @@ use std::sync::{Arc, Mutex}; use std::time::Duration; use tracing::debug; -/// A [RuntimePlugin] to provide a client rate limiter, usable by a retry strategy. +/// A [`RuntimePlugin`] to provide a client rate limiter, usable by a retry strategy. #[non_exhaustive] #[derive(Debug)] pub struct ClientRateLimiterRuntimePlugin { @@ -24,6 +24,7 @@ pub struct ClientRateLimiterRuntimePlugin { } impl ClientRateLimiterRuntimePlugin { + /// Create a new [`ClientRateLimiterRuntimePlugin`]. pub fn new(seconds_since_unix_epoch: f64) -> Self { Self { rate_limiter: ClientRateLimiter::new(seconds_since_unix_epoch), @@ -65,6 +66,7 @@ const BETA: f64 = 0.7; /// Controls how aggressively we scale up after being throttled const SCALE_CONSTANT: f64 = 0.4; +/// Rate limiter for adaptive retry. #[derive(Clone, Debug)] pub struct ClientRateLimiter { inner: Arc>, @@ -107,6 +109,7 @@ impl Storable for ClientRateLimiter { } impl ClientRateLimiter { + /// Creates a new [`ClientRateLimiter`]. pub fn new(seconds_since_unix_epoch: f64) -> Self { Self::builder() .tokens_retrieved_per_second(MIN_FILL_RATE) diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs index c046a4d9f71..c441aa4816e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs @@ -3,12 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(feature = "test-util")] -mod fixed_delay; mod never; pub(crate) mod standard; -#[cfg(feature = "test-util")] -pub use fixed_delay::FixedDelayRetryStrategy; pub use never::NeverRetryStrategy; pub use standard::StandardRetryStrategy; + +#[cfg(feature = "test-util")] +mod fixed_delay; +#[cfg(feature = "test-util")] +pub use fixed_delay::FixedDelayRetryStrategy; diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs index c6315512a3c..886b7a61b22 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs @@ -12,8 +12,8 @@ use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::time::Duration; -// A retry policy used in tests. This relies on an error classifier already present in the config bag. -// If a server response is retryable, it will be retried after a fixed delay. +/// A retry policy used in tests. This relies on an error classifier already present in the config bag. +/// If a server response is retryable, it will be retried after a fixed delay. #[derive(Debug, Clone)] pub struct FixedDelayRetryStrategy { fixed_delay: Duration, @@ -21,6 +21,7 @@ pub struct FixedDelayRetryStrategy { } impl FixedDelayRetryStrategy { + /// Create a new retry policy with a fixed delay. pub fn new(fixed_delay: Duration) -> Self { Self { fixed_delay, @@ -28,6 +29,7 @@ impl FixedDelayRetryStrategy { } } + /// Create a new retry policy with a one second delay. pub fn one_second_delay() -> Self { Self::new(Duration::from_secs(1)) } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs index b59b8fb7f16..7baf4a14265 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs @@ -9,11 +9,13 @@ use aws_smithy_runtime_api::client::retries::{RetryStrategy, ShouldAttempt}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; +/// A retry strategy that never retries. #[non_exhaustive] #[derive(Debug, Clone, Default)] -pub struct NeverRetryStrategy {} +pub struct NeverRetryStrategy; impl NeverRetryStrategy { + /// Creates a new `NeverRetryStrategy`. pub fn new() -> Self { Self::default() } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index 915f8fad0f9..ee32a6a63da 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -24,6 +24,7 @@ use tracing::debug; // The initial attempt, plus three retries. const DEFAULT_MAX_ATTEMPTS: u32 = 4; +/// Retry strategy with exponential backoff, max attempts, and a token bucket. #[derive(Debug)] pub struct StandardRetryStrategy { // Retry settings @@ -39,13 +40,13 @@ impl Storable for StandardRetryStrategy { } impl StandardRetryStrategy { + /// Create a new standard retry strategy with the given config. pub fn new(retry_config: &RetryConfig) -> Self { let base = if retry_config.use_static_exponential_base() { || 1.0 } else { fastrand::f64 }; - // TODO(enableNewSmithyRuntimeLaunch) add support for `retry_config.reconnect_mode()` here or in the orchestrator flow. Self::default() .with_base(base) .with_max_backoff(retry_config.max_backoff()) @@ -53,21 +54,25 @@ impl StandardRetryStrategy { .with_initial_backoff(retry_config.initial_backoff()) } + /// Changes the exponential backoff base. pub fn with_base(mut self, base: fn() -> f64) -> Self { self.base = base; self } + /// Changes the max number of attempts. pub fn with_max_attempts(mut self, max_attempts: u32) -> Self { self.max_attempts = max_attempts; self } + /// Changes the initial backoff time. pub fn with_initial_backoff(mut self, initial_backoff: Duration) -> Self { self.initial_backoff = initial_backoff; self } + /// Changes the maximum backoff time. pub fn with_max_backoff(mut self, max_backoff: Duration) -> Self { self.max_backoff = max_backoff; self diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs index a7c95d2a511..686185b1d1a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs @@ -11,7 +11,7 @@ use std::sync::Arc; use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tracing::trace; -/// A [RuntimePlugin] to provide a token bucket, usable by a retry strategy. +/// A [`RuntimePlugin`] to provide a token bucket, usable by a retry strategy. #[non_exhaustive] #[derive(Debug, Default)] pub struct TokenBucketRuntimePlugin { @@ -19,6 +19,7 @@ pub struct TokenBucketRuntimePlugin { } impl TokenBucketRuntimePlugin { + /// Creates a new `TokenBucketRuntimePlugin` with the given initial quota. pub fn new(initial_tokens: usize) -> Self { Self { token_bucket: TokenBucket::new(initial_tokens), @@ -53,6 +54,7 @@ const RETRY_COST: u32 = 5; const RETRY_TIMEOUT_COST: u32 = RETRY_COST * 2; const PERMIT_REGENERATION_AMOUNT: usize = 1; +/// Token bucket used for standard and adaptive retry. #[derive(Clone, Debug)] pub struct TokenBucket { semaphore: Arc, @@ -77,6 +79,7 @@ impl Default for TokenBucket { } impl TokenBucket { + /// Creates a new `TokenBucket` with the given initial quota. pub fn new(initial_quota: usize) -> Self { Self { semaphore: Arc::new(Semaphore::new(initial_quota)), diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util.rs index 30adb4f6cb6..1173adc3db6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util.rs @@ -3,5 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Test response deserializer implementations. pub mod deserializer; + +/// Test request serializer implementations. pub mod serializer; diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs index 4b1d43ae793..4e83052d43c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs @@ -10,19 +10,21 @@ use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedRespons use aws_smithy_types::config_bag::{FrozenLayer, Layer}; use std::sync::Mutex; +/// Test response deserializer that always returns the same canned response. #[derive(Default, Debug)] pub struct CannedResponseDeserializer { inner: Mutex>>>, } impl CannedResponseDeserializer { + /// Creates a new `CannedResponseDeserializer` with the given canned response. pub fn new(output: Result>) -> Self { Self { inner: Mutex::new(Some(output)), } } - pub fn take(&self) -> Option>> { + fn take(&self) -> Option>> { match self.inner.lock() { Ok(mut guard) => guard.take(), Err(_) => None, diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs index ec3eb2dafd5..573eea52935 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs @@ -11,25 +11,28 @@ use aws_smithy_runtime_api::client::ser_de::{RequestSerializer, SharedRequestSer use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use std::sync::Mutex; +/// Test [`RequestSerializer`] that returns a canned request. #[derive(Default, Debug)] pub struct CannedRequestSerializer { inner: Mutex>>, } impl CannedRequestSerializer { + /// Create a new [`CannedRequestSerializer`] with a successful canned request. pub fn success(request: HttpRequest) -> Self { Self { inner: Mutex::new(Some(Ok(request))), } } + /// Create a new [`CannedRequestSerializer`] with a canned error. pub fn failure(error: BoxError) -> Self { Self { inner: Mutex::new(Some(Err(error))), } } - pub fn take(&self) -> Option> { + fn take(&self) -> Option> { match self.inner.lock() { Ok(mut guard) => guard.take(), Err(_) => None, diff --git a/rust-runtime/aws-smithy-runtime/src/lib.rs b/rust-runtime/aws-smithy-runtime/src/lib.rs index 3afb476bf9d..b40610a77cc 100644 --- a/rust-runtime/aws-smithy-runtime/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime/src/lib.rs @@ -12,7 +12,7 @@ //! - `test-util`: Enables utilities for unit tests. DO NOT ENABLE IN PRODUCTION. #![warn( - // missing_docs, + missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms @@ -22,6 +22,7 @@ #[cfg(feature = "client")] pub mod client; +/// A data structure for persisting and sharing state between multiple clients. pub mod static_partition_map; /// General testing utilities. diff --git a/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs b/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs index 10b0070ccfa..2f70869f355 100644 --- a/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs +++ b/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs @@ -77,6 +77,7 @@ pub struct StaticPartitionMap { } impl StaticPartitionMap { + /// Creates a new `StaticPartitionMap`. pub const fn new() -> Self { Self { inner: OnceCell::new(), @@ -102,18 +103,20 @@ where K: Eq + Hash, V: Clone, { + /// Gets the value for the given partition key. #[must_use] pub fn get(&self, partition_key: K) -> Option { self.get_or_init_inner().get(&partition_key).cloned() } + /// Gets the value for the given partition key, initializing it with `init` if it doesn't exist. #[must_use] - pub fn get_or_init(&self, partition_key: K, f: F) -> V + pub fn get_or_init(&self, partition_key: K, init: F) -> V where F: FnOnce() -> V, { let mut inner = self.get_or_init_inner(); - let v = inner.entry(partition_key).or_insert_with(f); + let v = inner.entry(partition_key).or_insert_with(init); v.clone() } } @@ -123,6 +126,7 @@ where K: Eq + Hash, V: Clone + Default, { + /// Gets the value for the given partition key, initializing it if it doesn't exist. #[must_use] pub fn get_or_init_default(&self, partition_key: K) -> V { self.get_or_init(partition_key, V::default) diff --git a/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs b/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs index a25c97c42f8..85730d00bc5 100644 --- a/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs +++ b/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs @@ -10,12 +10,6 @@ use tracing::subscriber::DefaultGuard; use tracing::Level; use tracing_subscriber::fmt::TestWriter; -struct Tee { - buf: Arc>>, - quiet: bool, - inner: W, -} - /// A guard that resets log capturing upon being dropped. #[derive(Debug)] pub struct LogCaptureGuard(DefaultGuard); @@ -44,13 +38,24 @@ pub fn capture_test_logs() -> (LogCaptureGuard, Rx) { (LogCaptureGuard(guard), rx) } +/// Receiver for the captured logs. pub struct Rx(Arc>>); impl Rx { + /// Returns the captured logs as a string. + /// + /// # Panics + /// This will panic if the logs are not valid UTF-8. pub fn contents(&self) -> String { String::from_utf8(self.0.lock().unwrap().clone()).unwrap() } } +struct Tee { + buf: Arc>>, + quiet: bool, + inner: W, +} + impl Tee { fn stdout() -> (Self, Rx) { let buf: Arc>> = Default::default(); From 5129fb3a7065f79c621c2cbebea83978c94bf97a Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 27 Jul 2023 18:19:31 -0500 Subject: [PATCH 044/331] Fix flag name to retrieve if runtime plugins are configurable (#2885) ## Motivation and Context Follow-up on #2864. It got it 99% right, it's just that the name of a flag for retrieving its value was incorrect. ## Testing Generated an AWS SDK and confirmed that setters on `Config` for runtime plugins are marked as `pub(crate)` correctly. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: ysaito1001 --- .../smithy/rust/codegen/client/smithy/ClientRustSettings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index ca532b19b49..c7268a67a30 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -135,7 +135,7 @@ data class ClientCodegenConfig( addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), enableNewSmithyRuntime = SmithyRuntimeMode.fromString(node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware")), includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), - enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("userConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), + enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("enableUserConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), ) } else { ClientCodegenConfig( From 55a1536eced663890ec9a9c76ca3db7a6b66588f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 28 Jul 2023 07:46:55 -0700 Subject: [PATCH 045/331] Run non-service SDK integration tests in CI (#2884) This fixes #2880. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-scripts/check-aws-sdk-smoketest-unit-tests | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests b/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests index 293af9b43f1..bbf13d54b35 100755 --- a/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests +++ b/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests @@ -7,3 +7,10 @@ set -eux cd aws-sdk-smoketest cargo test --all-features + +for test_dir in tests/*; do + if [ -f "${test_dir}/Cargo.toml" ]; then + echo "#### Testing ${test_dir}..." + cargo test --all-features --manifest-path "${test_dir}/Cargo.toml" + fi +done From cf8df40f18a554b642aa257973fdf1331d723d2b Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 28 Jul 2023 10:09:18 -0700 Subject: [PATCH 046/331] Merge `sra-test` into the SDK integration tests and fix its tests (#2883) This PR merges the benchmark and integration tests from `aws/sra-test` into the SDK integration tests, and updates the tests so that they compile and pass. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-runtime/src/request_info.rs | 20 +- .../rustsdk/IntegrationTestDependencies.kt | 9 +- .../orchestrator-vs-middleware/Cargo.lock | 2451 +++++++++++++++++ .../orchestrator-vs-middleware/Cargo.toml | 24 + .../benches/README.md | 6 + .../benches/middleware_vs_orchestrator.rs | 89 +- .../s3-throughput}/README.md | 0 .../s3-throughput}/benchmark/Cargo.lock | 0 .../s3-throughput}/benchmark/Cargo.toml | 0 .../s3-throughput}/benchmark/src/get_test.rs | 0 .../s3-throughput}/benchmark/src/latencies.rs | 0 .../s3-throughput}/benchmark/src/main.rs | 0 .../benchmark/src/multipart_get.rs | 0 .../benchmark/src/multipart_put.rs | 0 .../s3-throughput}/benchmark/src/put_test.rs | 0 .../s3-throughput}/benchmark/src/verify.rs | 0 .../infrastructure/.eslintrc.json | 0 .../s3-throughput}/infrastructure/.gitignore | 0 .../s3-throughput}/infrastructure/.npmignore | 0 .../s3-throughput}/infrastructure/.prettierrc | 0 .../infrastructure/assets/init_instance.sh | 0 .../infrastructure/assets/run_benchmark.sh | 0 .../infrastructure/bin/infrastructure.ts | 0 .../infrastructure/cdk.context.json | 0 .../s3-throughput}/infrastructure/cdk.json | 0 .../lib/infrastructure-stack.ts | 0 .../infrastructure/package-lock.json | 0 .../infrastructure/package.json | 0 .../infrastructure/tsconfig.json | 0 aws/sdk/integration-tests/s3/Cargo.toml | 2 + .../slow-network-and-late-client-clock.json | 0 .../three-retries_and-then-success.json | 32 +- .../three-successful-attempts.json | 0 .../s3/tests/interceptors.rs | 125 + .../s3/tests/request_information_headers.rs | 285 ++ aws/sra-test/.gitignore | 1 - aws/sra-test/build.gradle.kts | 126 - .../integration-tests/aws-sdk-s3/.gitignore | 1 - .../integration-tests/aws-sdk-s3/Cargo.toml | 32 - .../aws-sdk-s3/benches/README.md | 6 - .../aws-sdk-s3/test-data/list-objects-v2.json | 105 - .../aws-sdk-s3/tests/interceptors.rs | 170 -- .../tests/request_information_headers.rs | 257 -- .../aws-sdk-s3/tests/util.rs | 53 - .../ResiliencyConfigCustomization.kt | 12 +- .../customizations/TimeSourceCustomization.kt | 2 +- .../aws-smithy-client/src/dvr/replay.rs | 11 +- .../aws-smithy-http/src/connection.rs | 2 +- settings.gradle.kts | 1 - 49 files changed, 2975 insertions(+), 847 deletions(-) create mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock create mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml create mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md rename aws/{sra-test/integration-tests/aws-sdk-s3 => sdk/benchmarks/orchestrator-vs-middleware}/benches/middleware_vs_orchestrator.rs (52%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/README.md (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/Cargo.lock (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/Cargo.toml (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/get_test.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/latencies.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/main.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/multipart_get.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/multipart_put.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/put_test.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/benchmark/src/verify.rs (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/.eslintrc.json (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/.gitignore (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/.npmignore (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/.prettierrc (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/assets/init_instance.sh (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/assets/run_benchmark.sh (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/bin/infrastructure.ts (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/cdk.context.json (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/cdk.json (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/lib/infrastructure-stack.ts (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/package-lock.json (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/package.json (100%) rename aws/sdk/{s3-benchmark => benchmarks/s3-throughput}/infrastructure/tsconfig.json (100%) rename aws/{sra-test/integration-tests/aws-sdk-s3/test-data => sdk/integration-tests/s3/tests/data}/request-information-headers/slow-network-and-late-client-clock.json (100%) rename aws/{sra-test/integration-tests/aws-sdk-s3/test-data => sdk/integration-tests/s3/tests/data}/request-information-headers/three-retries_and-then-success.json (86%) rename aws/{sra-test/integration-tests/aws-sdk-s3/test-data => sdk/integration-tests/s3/tests/data}/request-information-headers/three-successful-attempts.json (100%) create mode 100644 aws/sdk/integration-tests/s3/tests/interceptors.rs create mode 100644 aws/sdk/integration-tests/s3/tests/request_information_headers.rs delete mode 100644 aws/sra-test/.gitignore delete mode 100644 aws/sra-test/build.gradle.kts delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/.gitignore delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs delete mode 100644 aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index ab3311f338d..5b7dccee559 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -4,6 +4,7 @@ */ use crate::service_clock_skew::ServiceClockSkew; +use aws_smithy_async::time::TimeSource; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Interceptor; @@ -16,7 +17,7 @@ use aws_smithy_types::timeout::TimeoutConfig; use aws_smithy_types::DateTime; use http::{HeaderName, HeaderValue}; use std::borrow::Cow; -use std::time::{Duration, SystemTime}; +use std::time::Duration; #[allow(clippy::declare_interior_mutable_const)] // we will never mutate this const AMZ_SDK_REQUEST: HeaderName = HeaderName::from_static("amz-sdk-request"); @@ -63,11 +64,15 @@ impl RequestInfoInterceptor { } } - fn build_ttl_pair(&self, cfg: &ConfigBag) -> Option<(Cow<'static, str>, Cow<'static, str>)> { + fn build_ttl_pair( + &self, + cfg: &ConfigBag, + timesource: impl TimeSource, + ) -> Option<(Cow<'static, str>, Cow<'static, str>)> { let timeout_config = cfg.load::()?; let socket_read = timeout_config.read_timeout()?; let estimated_skew: Duration = cfg.load::().cloned()?.into(); - let current_time = SystemTime::now(); + let current_time = timesource.now(); let ttl = current_time.checked_add(socket_read + estimated_skew)?; let mut timestamp = DateTime::from(ttl); // Set subsec_nanos to 0 so that the formatted `DateTime` won't have fractional seconds. @@ -94,11 +99,16 @@ impl Interceptor for RequestInfoInterceptor { fn modify_before_transmit( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, - _runtime_components: &RuntimeComponents, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let mut pairs = RequestPairs::new(); - if let Some(pair) = self.build_ttl_pair(cfg) { + if let Some(pair) = self.build_ttl_pair( + cfg, + runtime_components + .time_source() + .ok_or("A timesource must be provided")?, + ) { pairs = pairs.with_pair(pair); } if let Some(pair) = self.build_attempts_pair(cfg) { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index 5a39041ef22..3cee565e64d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -35,6 +35,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.testutil.testDependenciesOnly +import software.amazon.smithy.rustsdk.AwsCargoDependency.awsRuntime import java.nio.file.Files import java.nio.file.Paths import kotlin.io.path.absolute @@ -99,6 +100,7 @@ class IntegrationTestDependencies( if (codegenContext.smithyRuntimeMode.generateOrchestrator) { addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) addDependency(smithyRuntimeApi(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) + addDependency(awsRuntime(runtimeConfig).toDevDependency().withFeature("test-util")) } } if (hasBenches) { @@ -148,12 +150,5 @@ class S3TestDependencies(private val codegenContext: ClientCodegenContext) : Lib addDependency(TempFile) addDependency(TracingAppender) addDependency(TracingTest) - - // TODO(enableNewSmithyRuntimeCleanup): These additional dependencies may not be needed anymore when removing this flag - // depending on if the sra-test is kept around or not. - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - addDependency(smithyRuntime(codegenContext.runtimeConfig).toDevDependency()) - addDependency(smithyRuntimeApi(codegenContext.runtimeConfig).toDevDependency()) - } } } diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock new file mode 100644 index 00000000000..7cf3c5ef2e9 --- /dev/null +++ b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock @@ -0,0 +1,2451 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "assert-json-diff" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4259cbe96513d2f1073027a259fc2ca917feb3026a5a8d984e3628e490255cc0" +dependencies = [ + "extend", + "serde", + "serde_json", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "aws-config" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-http 0.0.0-smithy-rs-head", + "aws-sdk-sso", + "aws-sdk-sts", + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-client 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-http-tower 0.0.0-smithy-rs-head", + "aws-smithy-json 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "bytes", + "fastrand 2.0.0", + "hex", + "http", + "hyper", + "ring", + "time", + "tokio", + "tower", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "fastrand 2.0.0", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae" +dependencies = [ + "aws-smithy-async 0.55.3", + "aws-smithy-types 0.55.3", + "fastrand 1.9.0", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-endpoint" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-endpoint" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04" +dependencies = [ + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", + "aws-types 0.55.3", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-http" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "bytes", + "http", + "http-body", + "lazy_static", + "percent-encoding", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-http" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" +dependencies = [ + "aws-credential-types 0.55.3", + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", + "aws-types 0.55.3", + "bytes", + "http", + "http-body", + "lazy_static", + "percent-encoding", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-s3" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-endpoint 0.0.0-smithy-rs-head", + "aws-http 0.0.0-smithy-rs-head", + "aws-sig-auth 0.0.0-smithy-rs-head", + "aws-sigv4 0.0.0-smithy-rs-head", + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-checksums 0.0.0-smithy-rs-head", + "aws-smithy-client 0.0.0-smithy-rs-head", + "aws-smithy-eventstream 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-http-tower 0.0.0-smithy-rs-head", + "aws-smithy-json 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-xml 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "bytes", + "http", + "http-body", + "once_cell", + "percent-encoding", + "regex", + "tokio-stream", + "tower", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-s3" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f" +dependencies = [ + "aws-credential-types 0.55.3", + "aws-endpoint 0.55.3", + "aws-http 0.55.3", + "aws-sig-auth 0.55.3", + "aws-sigv4 0.55.3", + "aws-smithy-async 0.55.3", + "aws-smithy-checksums 0.55.3", + "aws-smithy-client 0.55.3", + "aws-smithy-eventstream 0.55.3", + "aws-smithy-http 0.55.3", + "aws-smithy-http-tower 0.55.3", + "aws-smithy-json 0.55.3", + "aws-smithy-types 0.55.3", + "aws-smithy-xml 0.55.3", + "aws-types 0.55.3", + "bytes", + "http", + "http-body", + "once_cell", + "percent-encoding", + "regex", + "tokio-stream", + "tower", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-sso" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-endpoint 0.0.0-smithy-rs-head", + "aws-http 0.0.0-smithy-rs-head", + "aws-sig-auth 0.0.0-smithy-rs-head", + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-client 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-http-tower 0.0.0-smithy-rs-head", + "aws-smithy-json 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "bytes", + "http", + "regex", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "aws-sdk-sts" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-endpoint 0.0.0-smithy-rs-head", + "aws-http 0.0.0-smithy-rs-head", + "aws-sig-auth 0.0.0-smithy-rs-head", + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-client 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-http-tower 0.0.0-smithy-rs-head", + "aws-smithy-json 0.0.0-smithy-rs-head", + "aws-smithy-query", + "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-xml 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "bytes", + "http", + "regex", + "tower", + "tracing", +] + +[[package]] +name = "aws-sig-auth" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-sigv4 0.0.0-smithy-rs-head", + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-eventstream 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-types 0.0.0-smithy-rs-head", + "http", + "tracing", +] + +[[package]] +name = "aws-sig-auth" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61" +dependencies = [ + "aws-credential-types 0.55.3", + "aws-sigv4 0.55.3", + "aws-smithy-eventstream 0.55.3", + "aws-smithy-http 0.55.3", + "aws-types 0.55.3", + "http", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-eventstream 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "bytes", + "form_urlencoded", + "hex", + "hmac", + "http", + "once_cell", + "percent-encoding", + "regex", + "sha2", + "time", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" +dependencies = [ + "aws-smithy-eventstream 0.55.3", + "aws-smithy-http 0.55.3", + "bytes", + "form_urlencoded", + "hex", + "hmac", + "http", + "once_cell", + "percent-encoding", + "regex", + "sha2", + "time", + "tracing", +] + +[[package]] +name = "aws-smithy-async" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", + "tokio-stream", +] + +[[package]] +name = "aws-smithy-async" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", + "tokio-stream", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" +dependencies = [ + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-client" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-http-tower 0.0.0-smithy-rs-head", + "aws-smithy-protocol-test 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "bytes", + "fastrand 2.0.0", + "http", + "http-body", + "hyper", + "hyper-rustls 0.24.1", + "lazy_static", + "pin-project-lite", + "rustls 0.21.5", + "serde", + "serde_json", + "tokio", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-client" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" +dependencies = [ + "aws-smithy-async 0.55.3", + "aws-smithy-http 0.55.3", + "aws-smithy-http-tower 0.55.3", + "aws-smithy-protocol-test 0.55.3", + "aws-smithy-types 0.55.3", + "bytes", + "fastrand 1.9.0", + "http", + "http-body", + "hyper", + "hyper-rustls 0.23.2", + "lazy_static", + "pin-project-lite", + "rustls 0.20.8", + "serde", + "serde_json", + "tokio", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-types 0.0.0-smithy-rs-head", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" +dependencies = [ + "aws-smithy-types 0.55.3", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-eventstream 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "hyper", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "aws-smithy-http" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" +dependencies = [ + "aws-smithy-eventstream 0.55.3", + "aws-smithy-types 0.55.3", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "hyper", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "aws-smithy-http-tower" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-http-tower" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" +dependencies = [ + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-types 0.0.0-smithy-rs-head", +] + +[[package]] +name = "aws-smithy-json" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" +dependencies = [ + "aws-smithy-types 0.55.3", +] + +[[package]] +name = "aws-smithy-protocol-test" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "assert-json-diff", + "http", + "pretty_assertions", + "regex", + "roxmltree", + "serde_json", + "thiserror", +] + +[[package]] +name = "aws-smithy-protocol-test" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabbf8d2bfefa4870ba497c1ae3b40e5e26be18af1cb8c871856b0a393a15ffa" +dependencies = [ + "assert-json-diff", + "http", + "pretty_assertions", + "regex", + "roxmltree", + "serde_json", + "thiserror", +] + +[[package]] +name = "aws-smithy-query" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-smithy-types 0.0.0-smithy-rs-head", + "urlencoding", +] + +[[package]] +name = "aws-smithy-types" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "base64-simd", + "itoa", + "num-integer", + "ryu", + "serde", + "time", +] + +[[package]] +name = "aws-smithy-types" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8" +dependencies = [ + "base64-simd", + "itoa", + "num-integer", + "ryu", + "time", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "0.0.0-smithy-rs-head" +dependencies = [ + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-smithy-async 0.0.0-smithy-rs-head", + "aws-smithy-client 0.0.0-smithy-rs-head", + "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-types 0.0.0-smithy-rs-head", + "http", + "rustc_version", + "tracing", +] + +[[package]] +name = "aws-types" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829" +dependencies = [ + "aws-credential-types 0.55.3", + "aws-smithy-async 0.55.3", + "aws-smithy-client 0.55.3", + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", + "http", + "rustc_version", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bytes-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32c" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "futures", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "tokio", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "extend" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47da3a72ec598d9c8937a7ebca8962a5c7a1f28444e38c2b33c771ba3f55f05" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "h2" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +dependencies = [ + "http", + "hyper", + "log", + "rustls 0.20.8", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.23.4", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls 0.21.5", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "md-5" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +dependencies = [ + "digest", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.2", + "libc", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "orchestrator-vs-middleware" +version = "0.1.0" +dependencies = [ + "aws-config", + "aws-credential-types 0.0.0-smithy-rs-head", + "aws-sdk-s3 0.0.0-local", + "aws-sdk-s3 0.28.0", + "aws-smithy-client 0.0.0-smithy-rs-head", + "aws-smithy-client 0.55.3", + "criterion", + "http", + "tokio", +] + +[[package]] +name = "os_str_bytes" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" + +[[package]] +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pin-project" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "serde" +version = "1.0.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + +[[package]] +name = "serde_json" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + +[[package]] +name = "thiserror" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + +[[package]] +name = "time" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +dependencies = [ + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.8", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.5", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.27", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "xmlparser" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml new file mode 100644 index 00000000000..e4b6af798a4 --- /dev/null +++ b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "orchestrator-vs-middleware" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } +aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } +aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } +aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "wiremock"] } +criterion = { version = "0.4", features = ["async_tokio"] } +http = "0.2.3" +middleware-s3 = { version = "0.28", package = "aws-sdk-s3", features = ["test-util"] } +middleware-smithy-client = { version = "0.55.3", package = "aws-smithy-client", features = ["test-util", "rustls"] } +tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } + +[profile.release] +debug = 1 + +[[bench]] +name = "middleware_vs_orchestrator" +harness = false diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md b/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md new file mode 100644 index 00000000000..0f2e81f4328 --- /dev/null +++ b/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md @@ -0,0 +1,6 @@ +### Middleware vs. Orchestrator Benchmark + +To run the benchmark: +```bash +./gradlew :aws:sdk:assemble && (cd aws/sdk/integration-tests/s3 && cargo bench) +``` diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs b/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs similarity index 52% rename from aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs rename to aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs index b728a6fa141..6920f80fe0b 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs +++ b/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs @@ -9,12 +9,6 @@ use aws_sdk_s3 as s3; use criterion::{BenchmarkId, Criterion}; macro_rules! test_connection { - (head) => { - test_connection!(aws_smithy_client) - }; - (last_release) => { - test_connection!(last_release_smithy_client) - }; ($package:ident) => { $package::test_connection::infallible_connection_fn(|req| { assert_eq!( @@ -46,44 +40,6 @@ macro_rules! test_connection { }; } -macro_rules! create_client { - (head) => { - create_client!(head, aws_sdk_s3) - }; - (last_release) => { - create_client!(last_release, last_release_s3) - }; - ($original:ident, $package:ident) => {{ - let conn = test_connection!($original); - let config = $package::Config::builder() - .credentials_provider($package::config::Credentials::for_tests()) - .region($package::config::Region::new("us-east-1")) - .http_connector(conn.clone()) - .build(); - $package::Client::from_conf(config) - }}; -} - -macro_rules! middleware_bench_fn { - ($fn_name:ident, head) => { - middleware_bench_fn!($fn_name, aws_sdk_s3) - }; - ($fn_name:ident, last_release) => { - middleware_bench_fn!($fn_name, last_release_s3) - }; - ($fn_name:ident, $package:ident) => { - async fn $fn_name(client: &$package::Client) { - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send() - .await - .expect("successful execution"); - } - }; -} - async fn orchestrator(client: &s3::Client) { let _output = client .list_objects_v2() @@ -94,34 +50,49 @@ async fn orchestrator(client: &s3::Client) { .expect("successful execution"); } -fn bench(c: &mut Criterion) { - let head_client = create_client!(head); - middleware_bench_fn!(middleware_head, head); +async fn middleware(client: &middleware_s3::Client) { + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .send() + .await + .expect("successful execution"); +} - let last_release_client = create_client!(last_release); - middleware_bench_fn!(middleware_last_release, last_release); +fn bench(c: &mut Criterion) { + let orchestrator_client = { + let conn = test_connection!(aws_smithy_client); + let config = aws_sdk_s3::Config::builder() + .credentials_provider(aws_sdk_s3::config::Credentials::for_tests()) + .region(aws_sdk_s3::config::Region::new("us-east-1")) + .http_connector(conn.clone()) + .build(); + aws_sdk_s3::Client::from_conf(config) + }; + let middleware_client = { + let conn = test_connection!(middleware_smithy_client); + let config = middleware_s3::Config::builder() + .credentials_provider(middleware_s3::config::Credentials::for_tests()) + .region(middleware_s3::config::Region::new("us-east-1")) + .http_connector(conn.clone()) + .build(); + middleware_s3::Client::from_conf(config) + }; let mut group = c.benchmark_group("compare"); let param = "S3 ListObjectsV2"; - group.bench_with_input( - BenchmarkId::new("middleware (HEAD)", param), - param, - |b, _| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { middleware_head(&head_client).await }) - }, - ); group.bench_with_input( BenchmarkId::new("middleware (last_release)", param), param, |b, _| { b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { middleware_last_release(&last_release_client).await }) + .iter(|| async { middleware(&middleware_client).await }) }, ); group.bench_with_input(BenchmarkId::new("orchestrator", param), param, |b, _| { b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { orchestrator(&head_client).await }) + .iter(|| async { orchestrator(&orchestrator_client).await }) }); group.finish(); } diff --git a/aws/sdk/s3-benchmark/README.md b/aws/sdk/benchmarks/s3-throughput/README.md similarity index 100% rename from aws/sdk/s3-benchmark/README.md rename to aws/sdk/benchmarks/s3-throughput/README.md diff --git a/aws/sdk/s3-benchmark/benchmark/Cargo.lock b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/Cargo.lock rename to aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock diff --git a/aws/sdk/s3-benchmark/benchmark/Cargo.toml b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/Cargo.toml rename to aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml diff --git a/aws/sdk/s3-benchmark/benchmark/src/get_test.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/get_test.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/get_test.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/get_test.rs diff --git a/aws/sdk/s3-benchmark/benchmark/src/latencies.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/latencies.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/latencies.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/latencies.rs diff --git a/aws/sdk/s3-benchmark/benchmark/src/main.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/main.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/main.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/main.rs diff --git a/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs diff --git a/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs diff --git a/aws/sdk/s3-benchmark/benchmark/src/put_test.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/put_test.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/put_test.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/put_test.rs diff --git a/aws/sdk/s3-benchmark/benchmark/src/verify.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/verify.rs similarity index 100% rename from aws/sdk/s3-benchmark/benchmark/src/verify.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/verify.rs diff --git a/aws/sdk/s3-benchmark/infrastructure/.eslintrc.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/.eslintrc.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.eslintrc.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.eslintrc.json diff --git a/aws/sdk/s3-benchmark/infrastructure/.gitignore b/aws/sdk/benchmarks/s3-throughput/infrastructure/.gitignore similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.gitignore rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.gitignore diff --git a/aws/sdk/s3-benchmark/infrastructure/.npmignore b/aws/sdk/benchmarks/s3-throughput/infrastructure/.npmignore similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.npmignore rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.npmignore diff --git a/aws/sdk/s3-benchmark/infrastructure/.prettierrc b/aws/sdk/benchmarks/s3-throughput/infrastructure/.prettierrc similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.prettierrc rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.prettierrc diff --git a/aws/sdk/s3-benchmark/infrastructure/assets/init_instance.sh b/aws/sdk/benchmarks/s3-throughput/infrastructure/assets/init_instance.sh similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/assets/init_instance.sh rename to aws/sdk/benchmarks/s3-throughput/infrastructure/assets/init_instance.sh diff --git a/aws/sdk/s3-benchmark/infrastructure/assets/run_benchmark.sh b/aws/sdk/benchmarks/s3-throughput/infrastructure/assets/run_benchmark.sh similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/assets/run_benchmark.sh rename to aws/sdk/benchmarks/s3-throughput/infrastructure/assets/run_benchmark.sh diff --git a/aws/sdk/s3-benchmark/infrastructure/bin/infrastructure.ts b/aws/sdk/benchmarks/s3-throughput/infrastructure/bin/infrastructure.ts similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/bin/infrastructure.ts rename to aws/sdk/benchmarks/s3-throughput/infrastructure/bin/infrastructure.ts diff --git a/aws/sdk/s3-benchmark/infrastructure/cdk.context.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.context.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/cdk.context.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.context.json diff --git a/aws/sdk/s3-benchmark/infrastructure/cdk.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/cdk.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.json diff --git a/aws/sdk/s3-benchmark/infrastructure/lib/infrastructure-stack.ts b/aws/sdk/benchmarks/s3-throughput/infrastructure/lib/infrastructure-stack.ts similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/lib/infrastructure-stack.ts rename to aws/sdk/benchmarks/s3-throughput/infrastructure/lib/infrastructure-stack.ts diff --git a/aws/sdk/s3-benchmark/infrastructure/package-lock.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/package-lock.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/package-lock.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/package-lock.json diff --git a/aws/sdk/s3-benchmark/infrastructure/package.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/package.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/package.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/package.json diff --git a/aws/sdk/s3-benchmark/infrastructure/tsconfig.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/tsconfig.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/tsconfig.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/tsconfig.json diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 650d1a5db0d..74453e21e6b 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -15,6 +15,7 @@ async-std = "1.12.0" aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } +aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime", features = ["test-util"] } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } @@ -22,6 +23,7 @@ aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", featur aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1" diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/slow-network-and-late-client-clock.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/slow-network-and-late-client-clock.json similarity index 100% rename from aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/slow-network-and-late-client-clock.json rename to aws/sdk/integration-tests/s3/tests/data/request-information-headers/slow-network-and-late-client-clock.json diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-retries_and-then-success.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json similarity index 86% rename from aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-retries_and-then-success.json rename to aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json index b0aee248616..2903739925a 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-retries_and-then-success.json +++ b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json @@ -11,7 +11,7 @@ "notarealsessiontoken" ], "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=43970cfd0324cb28a86459789b7a1c7684cf54b0b3c9842a84f3b24343fa038a" ], "x-amz-user-agent": [ "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" @@ -55,9 +55,6 @@ "status": 500, "version": "HTTP/1.1", "headers": { - "server": [ - "AmazonS3" - ], "x-amz-request-id": [ "foo-id" ], @@ -103,7 +100,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Request": { "request": { @@ -113,7 +110,7 @@ "notarealsessiontoken" ], "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d0f0da831a7d3ad1bde4e98580177bc0ef0acc21064dd26394006006392cb14" ], "x-amz-user-agent": [ "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" @@ -140,7 +137,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Eof": { "ok": true, @@ -149,7 +146,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Response": { "response": { @@ -157,9 +154,6 @@ "status": 500, "version": "HTTP/1.1", "headers": { - "server": [ - "AmazonS3" - ], "x-amz-request-id": [ "foo-id" ], @@ -185,7 +179,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Data": { "data": { @@ -196,7 +190,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Eof": { "ok": true, @@ -205,7 +199,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Request": { "request": { @@ -215,7 +209,7 @@ "notarealsessiontoken" ], "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=8160b1d1200c10cde681ac6f4490c98023af9c4b3b8fd8a82e7560f87c126a53" ], "x-amz-user-agent": [ "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" @@ -242,7 +236,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Eof": { "ok": true, @@ -251,7 +245,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Response": { "response": { @@ -287,7 +281,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Data": { "data": { @@ -298,7 +292,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Eof": { "ok": true, diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-successful-attempts.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-successful-attempts.json similarity index 100% rename from aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-successful-attempts.json rename to aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-successful-attempts.json diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs new file mode 100644 index 00000000000..be3caa493a2 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -0,0 +1,125 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[cfg(not(aws_sdk_middleware_mode))] +mod tests { + use aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextMut; + use aws_sdk_s3::config::{Credentials, Region}; + use aws_sdk_s3::Client; + use aws_smithy_client::erase::DynConnector; + use aws_smithy_client::test_connection::capture_request; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; + use http::header::USER_AGENT; + use http::HeaderValue; + + #[tokio::test] + async fn interceptor_priority() { + #[derive(Debug, Eq, PartialEq)] + struct TestValue(&'static str); + impl Storable for TestValue { + type Storer = StoreReplace; + } + + #[derive(Debug)] + struct TestInterceptor(&'static str); + impl Interceptor for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + + fn modify_before_signing( + &self, + _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let mut layer = Layer::new("test"); + layer.store_put(TestValue(self.0)); + cfg.push_layer(layer); + Ok(()) + } + + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let value = cfg.load::().unwrap(); + context + .request_mut() + .headers_mut() + .insert("test-header", HeaderValue::from_static(value.0)); + Ok(()) + } + } + + let (conn, rx) = capture_request(None); + + // The first `TestInterceptor` will put `value1` into config + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_connector(DynConnector::new(conn)) + .interceptor(TestInterceptor("value1")) + .build(); + let client = Client::from_conf(config); + + // The second `TestInterceptor` will replace `value1` with `value2` in config + dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .customize() + .await + .unwrap() + .interceptor(TestInterceptor("value2")) + .send() + .await + ) + .expect_err("no fake response set"); + + let request = rx.expect_request(); + assert_eq!("value2", request.headers()["test-header"]); + } + + #[tokio::test] + async fn set_test_user_agent_through_request_mutation() { + let (conn, rx) = capture_request(None); + + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_connector(DynConnector::new(conn.clone())) + .build(); + let client = Client::from_conf(config); + + dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .customize() + .await + .unwrap() + .mutate_request(|request| { + let headers = request.headers_mut(); + headers.insert(USER_AGENT, HeaderValue::try_from("test").unwrap()); + headers.insert("x-amz-user-agent", HeaderValue::try_from("test").unwrap()); + }) + .send() + .await + ) + .expect_err("no fake response set"); + + let request = rx.expect_request(); + assert_eq!("test", request.headers()[USER_AGENT]); + assert_eq!("test", request.headers()["x-amz-user-agent"]); + } +} diff --git a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs new file mode 100644 index 00000000000..33ee18fb9df --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -0,0 +1,285 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[cfg(not(aws_sdk_middleware_mode))] +mod tests { + use aws_http::user_agent::AwsUserAgent; + use aws_runtime::invocation_id::{InvocationId, PredefinedInvocationIdGenerator}; + use aws_sdk_s3::config::interceptors::BeforeSerializationInterceptorContextMut; + use aws_sdk_s3::config::interceptors::FinalizerInterceptorContextRef; + use aws_sdk_s3::config::retry::RetryConfig; + use aws_sdk_s3::config::timeout::TimeoutConfig; + use aws_sdk_s3::config::{Credentials, Region}; + use aws_sdk_s3::config::{Interceptor, SharedAsyncSleep}; + use aws_sdk_s3::Client; + use aws_smithy_async::test_util::InstantSleep; + use aws_smithy_async::test_util::ManualTimeSource; + use aws_smithy_async::time::SharedTimeSource; + use aws_smithy_client::dvr; + use aws_smithy_client::dvr::MediaType; + use aws_smithy_client::erase::DynConnector; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::config_bag::{ConfigBag, Layer}; + use std::time::{Duration, UNIX_EPOCH}; + + // # One SDK operation invocation. + // # Client retries 3 times, successful response on 3rd attempt. + // # Fast network, latency + server time is less than one second. + // # No clock skew + // # Client waits 1 second between retry attempts. + #[tokio::test] + async fn three_retries_and_then_success() { + let _logs = capture_test_logs(); + + #[derive(Debug)] + struct TimeInterceptor { + time_source: ManualTimeSource, + } + impl Interceptor for TimeInterceptor { + fn name(&self) -> &'static str { + "TimeInterceptor" + } + + fn modify_before_serialization( + &self, + _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let mut layer = Layer::new("test"); + layer.store_put(AwsUserAgent::for_tests()); + cfg.push_layer(layer); + Ok(()) + } + + fn read_after_attempt( + &self, + _context: &FinalizerInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.time_source.advance(Duration::from_secs(1)); + tracing::info!( + "################ ADVANCED TIME BY 1 SECOND, {:?}", + &self.time_source + ); + Ok(()) + } + } + + let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1559347200)); + + let path = "tests/data/request-information-headers/three-retries_and-then-success.json"; + let conn = dvr::ReplayingConnection::from_file(path).unwrap(); + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_connector(DynConnector::new(conn.clone())) + .time_source(SharedTimeSource::new(time_source.clone())) + .sleep_impl(SharedAsyncSleep::new(InstantSleep::new(Default::default()))) + .retry_config(RetryConfig::standard()) + .timeout_config( + TimeoutConfig::builder() + .connect_timeout(Duration::from_secs(10)) + .read_timeout(Duration::from_secs(10)) + .build(), + ) + .invocation_id_generator(PredefinedInvocationIdGenerator::new(vec![ + InvocationId::new_from_str("00000000-0000-4000-8000-000000000000"), + ])) + .interceptor(TimeInterceptor { time_source }) + .build(); + let client = Client::from_conf(config); + + let resp = dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .send() + .await + ); + + let resp = resp.expect("valid e2e test"); + assert_eq!(resp.name(), Some("test-bucket")); + conn.full_validate(MediaType::Xml).await.expect("failed") + } + // + // // # Client makes 3 separate SDK operation invocations + // // # All succeed on first attempt. + // // # Fast network, latency + server time is less than one second. + // // - request: + // // time: 2019-06-01T00:00:00Z + // // headers: + // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 + // // amz-sdk-request: attempt=1; max=3 + // // response: + // // status: 200 + // // time_received: 2019-06-01T00:00:00Z + // // headers: + // // Date: Sat, 01 Jun 2019 00:00:00 GMT + // // - request: + // // time: 2019-06-01T00:01:01Z + // // headers: + // // # Note the different invocation id because it's a new SDK + // // # invocation operation. + // // amz-sdk-invocation-id: 70370531-7b83-4b90-8b93-46975687ecf6 + // // amz-sdk-request: ttl=20190601T000011Z; attempt=1; max=3 + // // response: + // // status: 200 + // // time_received: 2019-06-01T00:00:01Z + // // headers: + // // Date: Sat, 01 Jun 2019 00:00:01 GMT + // // - request: + // // time: 2019-06-01T00:00:02Z + // // headers: + // // amz-sdk-invocation-id: 910bf450-6c90-43de-a508-3fa126a06b71 + // // amz-sdk-request: ttl=20190601T000012Z; attempt=1; max=3 + // // response: + // // status: 200 + // // time_received: 2019-06-01T00:00:02Z + // // headers: + // // Date: Sat, 01 Jun 2019 00:00:02 GMT + // const THREE_SUCCESSFUL_ATTEMPTS_PATH: &str = "test-data/request-information-headers/three-successful-attempts.json"; + // #[tokio::test] + // async fn three_successful_attempts() { + // tracing_subscriber::fmt::init(); + // + // impl RuntimePlugin for FixupPlugin { + // fn configure( + // &self, + // cfg: &mut ConfigBag, + // ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { + // let params_builder = Params::builder() + // .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) + // .bucket("test-bucket"); + // + // cfg.put(params_builder); + // cfg.set_request_time(RequestTime::new(self.timestamp.clone())); + // cfg.put(AwsUserAgent::for_tests()); + // cfg.put(InvocationId::for_tests()); + // Ok(()) + // } + // } + // + // let conn = dvr::ReplayingConnection::from_file(THREE_SUCCESSFUL_ATTEMPTS_PATH).unwrap(); + // let config = aws_sdk_s3::Config::builder() + // .credentials_provider(Credentials::for_tests()) + // .region(Region::new("us-east-1")) + // .http_connector(DynConnector::new(conn.clone())) + // .build(); + // let client = Client::from_conf(config); + // let fixup = FixupPlugin { + // client: client.clone(), + // timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), + // }; + // + // let resp = dbg!( + // client + // .list_objects_v2() + // .bucket("test-bucket") + // .prefix("prefix~") + // .send_v2_with_plugin(Some(fixup)) + // .await + // ); + // + // let resp = resp.expect("valid e2e test"); + // assert_eq!(resp.name(), Some("test-bucket")); + // conn.full_validate(MediaType::Xml).await.expect("failed") + // } + // + // // # One SDK operation invocation. + // // # Client retries 3 times, successful response on 3rd attempt. + // // # Slow network, one way latency is 2 seconds. + // // # Server takes 1 second to generate response. + // // # Client clock is 10 minutes behind server clock. + // // # One second delay between retries. + // // - request: + // // time: 2019-06-01T00:00:00Z + // // headers: + // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 + // // amz-sdk-request: attempt=1; max=3 + // // response: + // // status: 500 + // // time_received: 2019-06-01T00:00:05Z + // // headers: + // // Date: Sat, 01 Jun 2019 00:10:03 GMT + // // - request: + // // time: 2019-06-01T00:00:06Z + // // # The ttl is 00:00:16 with the client clock, + // // # but accounting for skew we have + // // # 00:10:03 - 00:00:05 = 00:09:58 + // // # ttl = 00:00:16 + 00:09:58 = 00:10:14 + // // headers: + // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 + // // amz-sdk-request: ttl=20190601T001014Z; attempt=2; max=3 + // // response: + // // status: 500 + // // time_received: 2019-06-01T00:00:11Z + // // headers: + // // Date: Sat, 01 Jun 2019 00:10:09 GMT + // // - request: + // // time: 2019-06-01T00:00:12Z + // // headers: + // // # ttl = 00:00:12 + 20 = 00:00:22 + // // # skew is: + // // # 00:10:09 - 00:00:11 + // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 + // // amz-sdk-request: ttl=20190601T001020Z; attempt=3; max=3 + // // response: + // // status: 200 + // // time_received: 2019-06-01T00:00:17Z + // // headers: + // // Date: Sat, 01 Jun 2019 00:10:15 GMT + // const SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH: &str = "test-data/request-information-headers/slow-network-and-late-client-clock.json"; + // #[tokio::test] + // async fn slow_network_and_late_client_clock() { + // tracing_subscriber::fmt::init(); + // + // impl RuntimePlugin for FixupPlugin { + // fn configure( + // &self, + // cfg: &mut ConfigBag, + // ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { + // let params_builder = Params::builder() + // .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) + // .bucket("test-bucket"); + // + // cfg.put(params_builder); + // cfg.set_request_time(RequestTime::new(self.timestamp.clone())); + // cfg.put(AwsUserAgent::for_tests()); + // cfg.put(InvocationId::for_tests()); + // Ok(()) + // } + // } + // + // let conn = dvr::ReplayingConnection::from_file(SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH).unwrap(); + // let config = aws_sdk_s3::Config::builder() + // .credentials_provider(Credentials::for_tests()) + // .region(Region::new("us-east-1")) + // .http_connector(DynConnector::new(conn.clone())) + // .build(); + // let client = Client::from_conf(config); + // let fixup = FixupPlugin { + // client: client.clone(), + // timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), + // }; + // + // let resp = dbg!( + // client + // .list_objects_v2() + // .bucket("test-bucket") + // .prefix("prefix~") + // .send_v2_with_plugin(Some(fixup)) + // .await + // ); + // + // let resp = resp.expect("valid e2e test"); + // assert_eq!(resp.name(), Some("test-bucket")); + // conn.full_validate(MediaType::Xml).await.expect("failed") + // } +} diff --git a/aws/sra-test/.gitignore b/aws/sra-test/.gitignore deleted file mode 100644 index 388d181b4d3..00000000000 --- a/aws/sra-test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/smithy-build.json diff --git a/aws/sra-test/build.gradle.kts b/aws/sra-test/build.gradle.kts deleted file mode 100644 index a9bb7c328fa..00000000000 --- a/aws/sra-test/build.gradle.kts +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -extra["displayName"] = "Smithy :: Rust :: AWS-SDK :: SRA Test" -extra["moduleName"] = "software.amazon.smithy.rust.awssdk.sra.test" - -tasks["jar"].enabled = false - -plugins { - id("software.amazon.smithy") -} - -val smithyVersion: String by project -val defaultRustDocFlags: String by project -val properties = PropertyRetriever(rootProject, project) - -val pluginName = "rust-client-codegen" -val workingDirUnderBuildDir = "smithyprojections/sdk-sra-test/" - -val publisherToolPath = rootProject.projectDir.resolve("tools/ci-build/publisher") -val outputDir = buildDir.resolve("sdk") - -configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") -} - -buildscript { - val smithyVersion: String by project - dependencies { - classpath("software.amazon.smithy:smithy-cli:$smithyVersion") - } -} - -dependencies { - implementation(project(":aws:sdk-codegen")) - implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") - implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") -} - -data class Service( - val serviceId: String, - val moduleName: String, - val imports: List, -) -val servicesToGenerate = listOf( - Service( - "com.amazonaws.dynamodb#DynamoDB_20120810", - "aws-sdk-dynamodb", - listOf("../sdk/aws-models/dynamodb.json"), - ), - Service( - "com.amazonaws.s3#AmazonS3", - "aws-sdk-s3", - listOf("../sdk/aws-models/s3.json", "../sdk/aws-models/s3-tests.smithy"), - ), -) -val allCodegenTests = servicesToGenerate.map { - CodegenTest( - it.serviceId, - it.moduleName, - imports = it.imports, - extraConfig = """ - , - "codegen": { - "includeFluentClient": false, - "enableNewSmithyRuntime": "orchestrator", - "includeEndpointUrlConfig": false - }, - "customizationConfig": { - "awsSdk": { - "generateReadme": false - } - } - """, - ) -} - -project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) -project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) - -tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") -tasks["assemble"].finalizedBy("generateCargoWorkspace") - -project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) - -tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) - -tasks["clean"].doFirst { delete("smithy-build.json") } - -/** - * The aws/rust-runtime crates depend on local versions of the Smithy core runtime enabling local compilation. However, - * those paths need to be replaced in the final build. We should probably fix this with some symlinking. - */ -fun rewritePathDependency(line: String): String { - // some runtime crates are actually dependent on the generated bindings: - return line.replace("../sdk/build/aws-sdk/sdk/", "") - // others use relative dependencies:: - .replace("../../rust-runtime/", "") -} - -tasks.register("relocateServices") { - description = "relocate AWS services to their final destination" - doLast { - servicesToGenerate.forEach { service -> - logger.info("Relocating ${service.moduleName}...") - copy { - from("$buildDir/smithyprojections/sdk-sra-test/${service.moduleName}/rust-client-codegen") - into(outputDir.resolve(service.moduleName)) - } - copy { - from(projectDir.resolve("integration-tests/${service.moduleName}/tests")) - into(outputDir.resolve(service.moduleName).resolve("tests")) - } - } - } - dependsOn("smithyBuildJar") - inputs.dir("$buildDir/smithyprojections/sdk-sra-test/") - outputs.dir(outputDir) -} -tasks["assemble"].apply { - dependsOn("relocateServices") -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/.gitignore b/aws/sra-test/integration-tests/aws-sdk-s3/.gitignore deleted file mode 100644 index 5a44eef09a5..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/Cargo.lock diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml b/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml deleted file mode 100644 index 82abf8c0945..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "aws-smithy-runtime-test" -version = "0.1.0" -edition = "2021" -publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -aws-http = { path = "../../../rust-runtime/aws-http" } -aws-runtime = { path = "../../../rust-runtime/aws-runtime" } -aws-sdk-s3 = { path = "../../build/sdk/aws-sdk-s3", features = ["test-util"] } -aws-smithy-async = { path = "../../../../rust-runtime/aws-smithy-async", features = ["test-util"]} -aws-smithy-client = { path = "../../../../rust-runtime/aws-smithy-client", features = ["test-util", "rustls"] } -aws-smithy-runtime = { path = "../../../../rust-runtime/aws-smithy-runtime" } -aws-smithy-runtime-api = { path = "../../../../rust-runtime/aws-smithy-runtime-api" } -aws-smithy-types = { path = "../../../../rust-runtime/aws-smithy-types" } -aws-types = { path = "../../../rust-runtime/aws-types" } -criterion = { version = "0.4", features = ["async_tokio"] } -http = "0.2.3" -http-body = "0.4.5" -last-release-smithy-client = { version = "0.55.3", package = "aws-smithy-client", features = ["test-util", "rustls"] } -last-release-s3 = { version = "0.28", package = "aws-sdk-s3", features = ["test-util"] } -tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.15", features = ["env-filter", "json"] } - -[profile.release] -debug = 1 - -[[bench]] -name = "middleware_vs_orchestrator" -harness = false diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md b/aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md deleted file mode 100644 index cf8f97680ce..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/benches/README.md +++ /dev/null @@ -1,6 +0,0 @@ -### Middleware vs. Orchestrator Benchmark - -To run the benchmark: -```bash -./gradlew :aws:sra-test:assemble && (cd aws/sra-test/integration-tests/aws-sdk-s3 && cargo bench) -``` diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json b/aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json deleted file mode 100644 index 366e1fab1b9..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "events": [ - { - "connection_id": 0, - "action": { - "Request": { - "request": { - "uri": "https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~", - "headers": { - "x-amz-security-token": [ - "notarealsessiontoken" - ], - "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" - ], - "x-amz-user-agent": [ - "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" - ], - "x-amz-date": [ - "20210618T170728Z" - ], - "x-amz-content-sha256": [ - "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - ], - "amz-sdk-invocation-id": [ - "00000000-0000-4000-8000-000000000000" - ], - "user-agent": [ - "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" - ] - }, - "method": "GET" - } - } - } - }, - { - "connection_id": 0, - "action": { - "Eof": { - "ok": true, - "direction": "Request" - } - } - }, - { - "connection_id": 0, - "action": { - "Response": { - "response": { - "Ok": { - "status": 200, - "version": "HTTP/1.1", - "headers": { - "x-amz-request-id": [ - "9X5E7C9EAB6AQEP2" - ], - "x-amz-id-2": [ - "gZsrBxajPyo1Q0DE2plGf7T6kAnxd4Xx7/S+8lq18GegL6kFbnVXLLh1LnBzpEpFiHN9XoNHkeA=" - ], - "content-type": [ - "application/xml" - ], - "transfer-encoding": [ - "chunked" - ], - "server": [ - "AmazonS3" - ], - "date": [ - "Wed, 26 Apr 2023 14:00:24 GMT" - ], - "x-amz-bucket-region": [ - "us-east-1" - ] - } - } - } - } - } - }, - { - "connection_id": 0, - "action": { - "Data": { - "data": { - "Utf8": "\n\n test-bucket\n prefix~\n 1\n 1000\n false\n \n some-file.file\n 2009-10-12T17:50:30.000Z\n 434234\n STANDARD\n \n" - }, - "direction": "Response" - } - } - }, - { - "connection_id": 0, - "action": { - "Eof": { - "ok": true, - "direction": "Response" - } - } - } - ], - "docs": "Test sending an S3 ListObjectsV2 operation with a successful response.", - "version": "V0" -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs deleted file mode 100644 index c65605c8eb3..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod util; - -use aws_http::user_agent::AwsUserAgent; -use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_async::test_util::StaticTimeSource; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_runtime_api::client::interceptors::{ - BeforeTransmitInterceptorContextMut, Interceptor, -}; -use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors; -use aws_smithy_types::config_bag::ConfigBag; -use http::header::USER_AGENT; -use http::HeaderValue; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; - -const LIST_BUCKETS_PATH: &str = "test-data/list-objects-v2.json"; - -#[tokio::test] -async fn operation_interceptor_test() { - tracing_subscriber::fmt::init(); - - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - // Not setting `TestUserAgentInterceptor` here, expecting it to be set later by the - // operation-level config. - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin { - timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), - }; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .interceptor(util::TestUserAgentInterceptor) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} - -#[derive(Debug)] -struct RequestTimeResetInterceptor; -impl Interceptor for RequestTimeResetInterceptor { - fn modify_before_signing( - &self, - _context: &mut BeforeTransmitInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), aws_smithy_runtime_api::client::interceptors::BoxError> { - cfg.set_request_time(StaticTimeSource::new(UNIX_EPOCH)); - - Ok(()) - } -} - -#[derive(Debug)] -struct RequestTimeAdvanceInterceptor(Duration); -impl Interceptor for RequestTimeAdvanceInterceptor { - fn modify_before_signing( - &self, - _context: &mut BeforeTransmitInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), aws_smithy_runtime_api::client::interceptors::BoxError> { - let request_time = cfg.request_time().unwrap(); - let request_time = StaticTimeSource::new(request_time.now() + self.0); - cfg.set_request_time(request_time); - - Ok(()) - } -} - -#[tokio::test] -async fn interceptor_priority() { - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - // `RequestTimeResetInterceptor` will reset a `RequestTime` to `UNIX_EPOCH`, whose previous - // value should be `SystemTime::now()` set by `FixupPlugin`. - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .interceptor(util::TestUserAgentInterceptor) - .interceptor(RequestTimeResetInterceptor) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin { - timestamp: SystemTime::now(), - }; - - // `RequestTimeAdvanceInterceptor` configured at the operation level should run after, - // expecting the `RequestTime` to move forward by the specified amount since `UNIX_EPOCH`. - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .interceptor(RequestTimeAdvanceInterceptor(Duration::from_secs( - 1624036048 - ))) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} - -#[tokio::test] -async fn set_test_user_agent_through_request_mutation() { - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin { - timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), - }; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .mutate_request(|request| { - let headers = request.headers_mut(); - let user_agent = AwsUserAgent::for_tests(); - headers.insert( - USER_AGENT, - HeaderValue::try_from(user_agent.ua_header()).unwrap(), - ); - headers.insert( - util::X_AMZ_USER_AGENT, - HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(), - ); - }) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs deleted file mode 100644 index 28a8df6c04e..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_http::user_agent::AwsUserAgent; -use aws_runtime::invocation_id::InvocationId; -use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::endpoint::Params; -use aws_sdk_s3::Client; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_runtime::client::retries::strategy::FixedDelayRetryStrategy; -use aws_smithy_runtime_api::client::interceptors::InterceptorRegistrar; -use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::client::orchestrator::ConfigBagAccessors; -use aws_smithy_types::config_bag::ConfigBag; -use std::time::{Duration, UNIX_EPOCH}; - -#[derive(Debug)] -struct FixupPlugin { - client: Client, -} - -// # One SDK operation invocation. -// # Client retries 3 times, successful response on 3rd attempt. -// # Fast network, latency + server time is less than one second. -// # No clock skew -// # Client waits 1 second between retry attempts. -#[tokio::test] -async fn three_retries_and_then_success() { - tracing_subscriber::fmt::init(); - - impl RuntimePlugin for FixupPlugin { - fn configure( - &self, - cfg: &mut ConfigBag, - _interceptors: &mut InterceptorRegistrar, - ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - let params_builder = Params::builder() - .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) - .bucket("test-bucket"); - - cfg.put(params_builder); - cfg.put(AwsUserAgent::for_tests()); - cfg.put(InvocationId::for_tests()); - cfg.set_retry_strategy(FixedDelayRetryStrategy::one_second_delay()); - Ok(()) - } - } - - let path = "test-data/request-information-headers/three-retries_and-then-success.json"; - let conn = dvr::ReplayingConnection::from_file(path).unwrap(); - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .time_source(UNIX_EPOCH + Duration::from_secs(1624036048)) - .build(); - let client = Client::from_conf(config); - let fixup = FixupPlugin { - client: client.clone(), - }; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .config_override(aws_sdk_s3::Config::builder().force_path_style(false)) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("failed") -} -// -// // # Client makes 3 separate SDK operation invocations -// // # All succeed on first attempt. -// // # Fast network, latency + server time is less than one second. -// // - request: -// // time: 2019-06-01T00:00:00Z -// // headers: -// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 -// // amz-sdk-request: attempt=1; max=3 -// // response: -// // status: 200 -// // time_received: 2019-06-01T00:00:00Z -// // headers: -// // Date: Sat, 01 Jun 2019 00:00:00 GMT -// // - request: -// // time: 2019-06-01T00:01:01Z -// // headers: -// // # Note the different invocation id because it's a new SDK -// // # invocation operation. -// // amz-sdk-invocation-id: 70370531-7b83-4b90-8b93-46975687ecf6 -// // amz-sdk-request: ttl=20190601T000011Z; attempt=1; max=3 -// // response: -// // status: 200 -// // time_received: 2019-06-01T00:00:01Z -// // headers: -// // Date: Sat, 01 Jun 2019 00:00:01 GMT -// // - request: -// // time: 2019-06-01T00:00:02Z -// // headers: -// // amz-sdk-invocation-id: 910bf450-6c90-43de-a508-3fa126a06b71 -// // amz-sdk-request: ttl=20190601T000012Z; attempt=1; max=3 -// // response: -// // status: 200 -// // time_received: 2019-06-01T00:00:02Z -// // headers: -// // Date: Sat, 01 Jun 2019 00:00:02 GMT -// const THREE_SUCCESSFUL_ATTEMPTS_PATH: &str = "test-data/request-information-headers/three-successful-attempts.json"; -// #[tokio::test] -// async fn three_successful_attempts() { -// tracing_subscriber::fmt::init(); -// -// impl RuntimePlugin for FixupPlugin { -// fn configure( -// &self, -// cfg: &mut ConfigBag, -// ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { -// let params_builder = Params::builder() -// .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) -// .bucket("test-bucket"); -// -// cfg.put(params_builder); -// cfg.set_request_time(RequestTime::new(self.timestamp.clone())); -// cfg.put(AwsUserAgent::for_tests()); -// cfg.put(InvocationId::for_tests()); -// Ok(()) -// } -// } -// -// let conn = dvr::ReplayingConnection::from_file(THREE_SUCCESSFUL_ATTEMPTS_PATH).unwrap(); -// let config = aws_sdk_s3::Config::builder() -// .credentials_provider(Credentials::for_tests()) -// .region(Region::new("us-east-1")) -// .http_connector(DynConnector::new(conn.clone())) -// .build(); -// let client = Client::from_conf(config); -// let fixup = FixupPlugin { -// client: client.clone(), -// timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), -// }; -// -// let resp = dbg!( -// client -// .list_objects_v2() -// .bucket("test-bucket") -// .prefix("prefix~") -// .send_v2_with_plugin(Some(fixup)) -// .await -// ); -// -// let resp = resp.expect("valid e2e test"); -// assert_eq!(resp.name(), Some("test-bucket")); -// conn.full_validate(MediaType::Xml).await.expect("failed") -// } -// -// // # One SDK operation invocation. -// // # Client retries 3 times, successful response on 3rd attempt. -// // # Slow network, one way latency is 2 seconds. -// // # Server takes 1 second to generate response. -// // # Client clock is 10 minutes behind server clock. -// // # One second delay between retries. -// // - request: -// // time: 2019-06-01T00:00:00Z -// // headers: -// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 -// // amz-sdk-request: attempt=1; max=3 -// // response: -// // status: 500 -// // time_received: 2019-06-01T00:00:05Z -// // headers: -// // Date: Sat, 01 Jun 2019 00:10:03 GMT -// // - request: -// // time: 2019-06-01T00:00:06Z -// // # The ttl is 00:00:16 with the client clock, -// // # but accounting for skew we have -// // # 00:10:03 - 00:00:05 = 00:09:58 -// // # ttl = 00:00:16 + 00:09:58 = 00:10:14 -// // headers: -// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 -// // amz-sdk-request: ttl=20190601T001014Z; attempt=2; max=3 -// // response: -// // status: 500 -// // time_received: 2019-06-01T00:00:11Z -// // headers: -// // Date: Sat, 01 Jun 2019 00:10:09 GMT -// // - request: -// // time: 2019-06-01T00:00:12Z -// // headers: -// // # ttl = 00:00:12 + 20 = 00:00:22 -// // # skew is: -// // # 00:10:09 - 00:00:11 -// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 -// // amz-sdk-request: ttl=20190601T001020Z; attempt=3; max=3 -// // response: -// // status: 200 -// // time_received: 2019-06-01T00:00:17Z -// // headers: -// // Date: Sat, 01 Jun 2019 00:10:15 GMT -// const SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH: &str = "test-data/request-information-headers/slow-network-and-late-client-clock.json"; -// #[tokio::test] -// async fn slow_network_and_late_client_clock() { -// tracing_subscriber::fmt::init(); -// -// impl RuntimePlugin for FixupPlugin { -// fn configure( -// &self, -// cfg: &mut ConfigBag, -// ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { -// let params_builder = Params::builder() -// .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) -// .bucket("test-bucket"); -// -// cfg.put(params_builder); -// cfg.set_request_time(RequestTime::new(self.timestamp.clone())); -// cfg.put(AwsUserAgent::for_tests()); -// cfg.put(InvocationId::for_tests()); -// Ok(()) -// } -// } -// -// let conn = dvr::ReplayingConnection::from_file(SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH).unwrap(); -// let config = aws_sdk_s3::Config::builder() -// .credentials_provider(Credentials::for_tests()) -// .region(Region::new("us-east-1")) -// .http_connector(DynConnector::new(conn.clone())) -// .build(); -// let client = Client::from_conf(config); -// let fixup = FixupPlugin { -// client: client.clone(), -// timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), -// }; -// -// let resp = dbg!( -// client -// .list_objects_v2() -// .bucket("test-bucket") -// .prefix("prefix~") -// .send_v2_with_plugin(Some(fixup)) -// .await -// ); -// -// let resp = resp.expect("valid e2e test"); -// assert_eq!(resp.name(), Some("test-bucket")); -// conn.full_validate(MediaType::Xml).await.expect("failed") -// } diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs deleted file mode 100644 index 992f9a748e8..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_http::user_agent::AwsUserAgent; -use aws_runtime::invocation_id::InvocationId; -use aws_smithy_async::test_util::StaticTimeSource; -use aws_smithy_runtime_api::client::interceptors::{ - BeforeTransmitInterceptorContextMut, Interceptor, InterceptorRegistrar, -}; -use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::ConfigBag; -use http::header::USER_AGENT; -use http::{HeaderName, HeaderValue}; -use std::time::SystemTime; - -pub const X_AMZ_USER_AGENT: HeaderName = HeaderName::from_static("x-amz-user-agent"); - -#[derive(Debug)] -pub struct FixupPlugin; -impl RuntimePlugin for FixupPlugin { - fn configure( - &self, - cfg: &mut ConfigBag, - _interceptors: &mut InterceptorRegistrar, - ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - cfg.put(InvocationId::for_tests()); - Ok(()) - } -} - -#[derive(Debug)] -pub struct TestUserAgentInterceptor; -impl Interceptor for TestUserAgentInterceptor { - fn modify_before_signing( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - _cfg: &mut ConfigBag, - ) -> Result<(), aws_smithy_runtime_api::client::interceptors::BoxError> { - let headers = context.request_mut().headers_mut(); - let user_agent = AwsUserAgent::for_tests(); - // Overwrite user agent header values provided by `UserAgentInterceptor` - headers.insert(USER_AGENT, HeaderValue::try_from(user_agent.ua_header())?); - headers.insert( - X_AMZ_USER_AGENT, - HeaderValue::try_from(user_agent.aws_ua_header())?, - ); - - Ok(()) - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index a79e2be6877..8dde7f43a83 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -370,8 +370,16 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon if (runtimeMode.generateOrchestrator) { rustTemplate( """ - let retry_partition = layer.load::<#{RetryPartition}>().cloned().unwrap_or_else(|| #{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); - let retry_config = layer.load::<#{RetryConfig}>().cloned().unwrap_or_else(#{RetryConfig}::disabled); + if layer.load::<#{RetryConfig}>().is_none() { + layer.store_put(#{RetryConfig}::disabled()); + } + let retry_config = layer.load::<#{RetryConfig}>().expect("set to default above").clone(); + + if layer.load::<#{RetryPartition}>().is_none() { + layer.store_put(#{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); + } + let retry_partition = layer.load::<#{RetryPartition}>().expect("set to default above").clone(); + if retry_config.has_retry() { #{debug}!("using retry strategy with partition '{}'", retry_partition); } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index ab9a96155c6..83e11190134 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -116,7 +116,7 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust rustTemplate( """ if self.runtime_components.time_source().is_none() { - self.runtime_components.set_time_source(#{Default}::default()); + self.runtime_components.set_time_source(#{Some}(#{Default}::default())); } """, *codegenScope, diff --git a/rust-runtime/aws-smithy-client/src/dvr/replay.rs b/rust-runtime/aws-smithy-client/src/dvr/replay.rs index 94d9123e0e5..27e606f0824 100644 --- a/rust-runtime/aws-smithy-client/src/dvr/replay.rs +++ b/rust-runtime/aws-smithy-client/src/dvr/replay.rs @@ -19,6 +19,7 @@ use tokio::task::JoinHandle; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_protocol_test::MediaType; +use aws_smithy_types::error::display::DisplayErrorContext; use crate::dvr::{Action, ConnectionId, Direction, Event, NetworkTraffic}; @@ -137,7 +138,14 @@ impl ReplayingConnection { )) }) .collect::>(); - aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers)?; + aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers) + .map_err(|err| { + format!( + "event {} validation failed with: {}", + conn_id.0, + DisplayErrorContext(&err) + ) + })?; } Ok(()) } @@ -272,6 +280,7 @@ impl tower::Service> for ReplayingConnection { fn call(&mut self, mut req: Request) -> Self::Future { let event_id = self.next_id(); + tracing::debug!("received event {}: {req:?}", event_id.0); let mut events = match self.live_events.lock().unwrap().remove(&event_id) { Some(traffic) => traffic, None => { diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs index eb81f636876..f98bb780bd1 100644 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ b/rust-runtime/aws-smithy-http/src/connection.rs @@ -82,7 +82,7 @@ impl CaptureSmithyConnection { match self.loader.lock().unwrap().as_ref() { Some(loader) => loader(), None => { - println!("no loader was set :-/"); + tracing::debug!("no loader was set on the CaptureSmithyConnection"); None } } diff --git a/settings.gradle.kts b/settings.gradle.kts index e33a925bb79..6c920d72174 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,7 +19,6 @@ include(":aws:rust-runtime") include(":aws:sdk") include(":aws:sdk-adhoc-test") include(":aws:sdk-codegen") -include(":aws:sra-test") pluginManagement { val smithyGradlePluginVersion: String by settings From a0b60ed5e01bfe1c733c9778dd9475e482704c93 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 28 Jul 2023 13:16:44 -0400 Subject: [PATCH 047/331] Add clippy.toml with forbidden methods & fix SystemTime usages (#2882) ## Motivation and Context - #2087 ## Description - remove lingering usages of SystemTime::now() - ensure they don't return by adding a clippy.toml ## Testing - CI - Ran the webassembly example ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- aws/rust-runtime/aws-config/clippy.toml | 1 + aws/rust-runtime/aws-inlineable/src/presigning.rs | 6 +++++- aws/rust-runtime/aws-runtime/src/request_info.rs | 4 +++- .../aws-runtime/src/service_clock_skew.rs | 11 ++++++++--- aws/rust-runtime/aws-sig-auth/src/event_stream.rs | 3 ++- aws/rust-runtime/aws-sig-auth/src/lib.rs | 2 ++ aws/rust-runtime/clippy.toml | 1 + .../smithy/rustsdk/EndpointsCredentialsTest.kt | 2 +- .../smithy/rustsdk/InvocationIdDecoratorTest.kt | 2 +- .../software/amazon/smithy/rustsdk/TestUtil.kt | 1 + aws/sdk/build.gradle.kts | 2 ++ clippy-root.toml | 9 +++++++++ .../customizations/TimeSourceCustomization.kt | 15 +++++++++++++++ .../core/testutil/CodegenIntegrationTest.kt | 3 ++- rust-runtime/aws-smithy-async/src/time.rs | 2 ++ rust-runtime/clippy.toml | 1 + 16 files changed, 56 insertions(+), 9 deletions(-) create mode 120000 aws/rust-runtime/aws-config/clippy.toml create mode 120000 aws/rust-runtime/clippy.toml create mode 100644 clippy-root.toml create mode 120000 rust-runtime/clippy.toml diff --git a/aws/rust-runtime/aws-config/clippy.toml b/aws/rust-runtime/aws-config/clippy.toml new file mode 120000 index 00000000000..85f6167cb1c --- /dev/null +++ b/aws/rust-runtime/aws-config/clippy.toml @@ -0,0 +1 @@ +../clippy.toml \ No newline at end of file diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index 1bc9f42e6f6..c9de75dfb0b 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -147,7 +147,11 @@ impl PresigningConfigBuilder { return Err(ErrorKind::ExpiresInDurationTooLong.into()); } Ok(PresigningConfig { - start_time: self.start_time.unwrap_or_else(SystemTime::now), + start_time: self.start_time.unwrap_or_else( + // This usage is OK—customers can easily override this. + #[allow(clippy::disallowed_methods)] + SystemTime::now, + ), expires_in, }) } diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index 5b7dccee559..04825141b3c 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -180,12 +180,14 @@ mod tests { use super::RequestInfoInterceptor; use crate::request_info::RequestPairs; use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; + use aws_smithy_runtime_api::client::interceptors::context::Input; + use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; + use http::HeaderValue; use std::time::Duration; diff --git a/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs index 7ada75c2bfe..a919f37cad1 100644 --- a/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs +++ b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs @@ -10,7 +10,7 @@ use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::date_time::Format; use aws_smithy_types::DateTime; -use std::time::{Duration, SystemTime}; +use std::time::Duration; /// Amount of clock skew between the client and the service. #[derive(Debug, Clone)] @@ -72,10 +72,15 @@ impl Interceptor for ServiceClockSkewInterceptor { fn modify_before_deserialization( &self, ctx: &mut BeforeDeserializationInterceptorContextMut<'_>, - _runtime_components: &RuntimeComponents, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let time_received = DateTime::from(SystemTime::now()); + let time_received = DateTime::from( + runtime_components + .time_source() + .ok_or("a time source is required (service clock skew)")? + .now(), + ); let time_sent = match extract_time_sent_from_response(ctx) { Ok(time_sent) => time_sent, Err(e) => { diff --git a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs index 01a1dd55fac..bf51ac2723d 100644 --- a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs +++ b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs @@ -3,8 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -// TODO(enableNewSmithyRuntimeCleanup): Remove this blanket allow once the old implementations are deleted +// this code is dead #![allow(deprecated)] +#![allow(clippy::disallowed_methods)] use crate::middleware::Signature; use aws_credential_types::Credentials; diff --git a/aws/rust-runtime/aws-sig-auth/src/lib.rs b/aws/rust-runtime/aws-sig-auth/src/lib.rs index 643b3ff216b..90cc88a7e37 100644 --- a/aws/rust-runtime/aws-sig-auth/src/lib.rs +++ b/aws/rust-runtime/aws-sig-auth/src/lib.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +// TODO(enableNewSmithyRuntimeCleanup): Deprecate this crate and replace it with empty contents. Remove references to it in the code generator. + #![allow(clippy::derive_partial_eq_without_eq)] //! AWS Signature Authentication Package diff --git a/aws/rust-runtime/clippy.toml b/aws/rust-runtime/clippy.toml new file mode 120000 index 00000000000..0cbd6319b24 --- /dev/null +++ b/aws/rust-runtime/clippy.toml @@ -0,0 +1 @@ +../../clippy-root.toml \ No newline at end of file diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt index 89e11618a6c..07080355410 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt @@ -114,7 +114,7 @@ class EndpointsCredentialsTest { .credentials_provider(#{Credentials}::for_tests()) .build(); let client = $moduleName::Client::from_conf(conf); - let _ = client.custom_auth().send().await; + let _ = dbg!(client.custom_auth().send().await); let req = rcvr.expect_request(); let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap(); assert!(auth_header.contains("/region-custom-auth/name-custom-auth/aws4_request"), "{}", auth_header); diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt index 857139c9f92..3a792e2a0a1 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt @@ -41,7 +41,7 @@ class InvocationIdDecoratorTest { let client = $moduleName::Client::from_conf(config); - let _ = client.some_operation().send().await; + let _ = dbg!(client.some_operation().send().await); let request = rx.expect_request(); assert_eq!("custom", request.headers().get("amz-sdk-invocation-id").unwrap()); } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 5638aca8343..44ed5461a9b 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -46,6 +46,7 @@ fun awsSdkIntegrationTest( clientIntegrationTest( model, IntegrationTestParams( + cargoCommand = "cargo test --features test-util", runtimeConfig = AwsTestRuntimeConfig, additionalSettings = ObjectNode.builder().withMember( "customizationConfig", diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 920cb7579e5..ebf1b3a705b 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -338,6 +338,7 @@ tasks.register("generateCargoWorkspace") { doFirst { outputDir.mkdirs() outputDir.resolve("Cargo.toml").writeText(generateCargoWorkspace(awsServices)) + rootProject.rootDir.resolve("clippy-root.toml").copyTo(outputDir.resolve("clippy.toml")) } inputs.property("servicelist", awsServices.moduleNames.toString()) if (awsServices.examples.isNotEmpty()) { @@ -347,6 +348,7 @@ tasks.register("generateCargoWorkspace") { inputs.dir(test.path) } outputs.file(outputDir.resolve("Cargo.toml")) + outputs.file(outputDir.resolve("clippy.toml")) outputs.upToDateWhen { false } } diff --git a/clippy-root.toml b/clippy-root.toml new file mode 100644 index 00000000000..87318f3163e --- /dev/null +++ b/clippy-root.toml @@ -0,0 +1,9 @@ +# this file is named `clippy-root.toml` so it isn't picked up automagically. Clippy +# will search up the filesystem for a clippy.toml and this causes problems with tools. +disallowed-methods = [ + # fully qualified function/method name: + "std::time::SystemTime::now", + "std::time::SystemTime::elapsed", + "std::time::Instant::now", + "std::time::Instant::elapsed" +] diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index 83e11190134..7dea61de99e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -23,6 +23,9 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust private val codegenScope = arrayOf( *preludeScope, "SharedTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::SharedTimeSource"), + "StaticTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::StaticTimeSource"), + "UNIX_EPOCH" to RuntimeType.std.resolve("time::UNIX_EPOCH"), + "Duration" to RuntimeType.std.resolve("time::Duration"), ) override fun section(section: ServiceConfig) = @@ -129,6 +132,18 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust } } + is ServiceConfig.DefaultForTests -> { + rustTemplate( + """ + ${section.configBuilderRef} + .set_time_source(#{Some}(#{SharedTimeSource}::new( + #{StaticTimeSource}::new(#{UNIX_EPOCH} + #{Duration}::from_secs(1234567890))) + )); + """, + *codegenScope, + ) + } + else -> emptySection } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt index d1f208c3931..4c1d4352048 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt @@ -24,6 +24,7 @@ data class IntegrationTestParams( val additionalSettings: ObjectNode = ObjectNode.builder().build(), val overrideTestDir: File? = null, val command: ((Path) -> Unit)? = null, + val cargoCommand: String? = null, ) /** @@ -40,6 +41,6 @@ fun codegenIntegrationTest(model: Model, params: IntegrationTestParams, invokePl ) invokePlugin(ctx) ctx.fileManifest.printGeneratedFiles() - params.command?.invoke(testDir) ?: "cargo test".runCommand(testDir, environment = mapOf("RUSTFLAGS" to "-D warnings")) + params.command?.invoke(testDir) ?: (params.cargoCommand ?: "cargo test").runCommand(testDir, environment = mapOf("RUSTFLAGS" to "-D warnings")) return testDir } diff --git a/rust-runtime/aws-smithy-async/src/time.rs b/rust-runtime/aws-smithy-async/src/time.rs index 2abe332c881..b1b3f5ac1ff 100644 --- a/rust-runtime/aws-smithy-async/src/time.rs +++ b/rust-runtime/aws-smithy-async/src/time.rs @@ -28,6 +28,8 @@ impl SystemTimeSource { impl TimeSource for SystemTimeSource { fn now(&self) -> SystemTime { + // this is the one OK usage + #[allow(clippy::disallowed_methods)] SystemTime::now() } } diff --git a/rust-runtime/clippy.toml b/rust-runtime/clippy.toml new file mode 120000 index 00000000000..939baf71835 --- /dev/null +++ b/rust-runtime/clippy.toml @@ -0,0 +1 @@ +../clippy-root.toml \ No newline at end of file From d2690e7ab19c1ca98124ec1d5870ebfe25613879 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 28 Jul 2023 11:02:24 -0700 Subject: [PATCH 048/331] Add orchestrator upgrade guides to changelog (#2888) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 ++++++++++++ .../ci-build/smithy-rs-tool-common/src/changelog.rs | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 394665e33e6..fd6119d9650 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -711,3 +711,15 @@ message = """The `doc(hidden)` `with_env` in `ProviderConfig` was removed.""" meta = { "breaking" = true, "tada" = false, "bug" = false } author = "rcoh" references = ["smithy-rs#2877"] + +[[aws-sdk-rust]] +message = "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes." +references = [] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/awslabs/smithy-rs/discussions/2887) to get your code working again." +references = [] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} +author = "jdisanti" diff --git a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs index acdee013ae4..579bae2b5ab 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs @@ -146,9 +146,10 @@ impl HandAuthoredEntry { if !self.author.chars().all(|c| c.is_alphanumeric() || c == '-') { bail!("Author must be valid GitHub username: [a-zA-Z0-9\\-]") } - if self.references.is_empty() { - bail!("Changelog entry must refer to at least one pull request or issue"); - } + // TODO(enableNewSmithyRuntimeCleanup): Re-add this validation + // if self.references.is_empty() { + // bail!("Changelog entry must refer to at least one pull request or issue"); + // } Ok(()) } From 682dc7fb40805b6fff5062eb4ebd8e6ea943c8d2 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 1 Aug 2023 10:06:29 -0700 Subject: [PATCH 049/331] Upgrade Smithy to 1.35 (#2892) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: david-perez --- .../protocol/ProtocolTestGenerator.kt | 16 +++- .../rulesgen/ExpressionGeneratorTest.kt | 19 +---- .../protocol/ServerProtocolTestGenerator.kt | 77 ++++++------------- gradle.properties | 4 +- 4 files changed, 45 insertions(+), 71 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 6c08785bfac..2f994788fe0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -614,6 +614,20 @@ class DefaultProtocolTestGenerator( // These tests are not even attempted to be generated, either because they will not compile // or because they are flaky - private val DisableTests = setOf() + private val DisableTests = setOf( + // TODO(https://github.com/awslabs/smithy-rs/issues/2891): Implement support for `@requestCompression` + "SDKAppendedGzipAfterProvidedEncoding_restJson1", + "SDKAppendedGzipAfterProvidedEncoding_restXml", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_1", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsQuery", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_ec2Query", + "SDKAppliedContentEncoding_awsJson1_0", + "SDKAppliedContentEncoding_awsJson1_1", + "SDKAppliedContentEncoding_awsQuery", + "SDKAppliedContentEncoding_ec2Query", + "SDKAppliedContentEncoding_restJson1", + "SDKAppliedContentEncoding_restXml", + ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt index 34781b1eac9..823d6ace785 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt @@ -14,7 +14,6 @@ import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.expr.Expression import software.amazon.smithy.rulesengine.language.syntax.expr.Literal import software.amazon.smithy.rulesengine.language.syntax.expr.Template -import software.amazon.smithy.rulesengine.language.syntax.fn.LibraryFunction import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -26,25 +25,13 @@ import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class ExprGeneratorTest { - /** - * This works around a bug in smithy-endpoint-rules where the constructors on functions like `BooleanEquals` - * hit the wrong branch in the visitor (but when they get parsed, they hit the right branch). - */ - fun Expression.shoop() = Expression.fromNode(this.toNode()) private val testContext = Context(FunctionRegistry(listOf()), TestRuntimeConfig) - @Test - fun `fail when smithy is fixed`() { - check(BooleanEquals.ofExpressions(Expression.of(true), Expression.of(true)) is LibraryFunction) { - "smithy has been fixed, shoop can be removed" - } - } - @Test fun generateExprs() { - val boolEq = Expression.of(true).equal(true).shoop() - val strEq = Expression.of("helloworld").equal("goodbyeworld").not().shoop() - val combined = BooleanEquals.ofExpressions(boolEq, strEq).shoop() + val boolEq = Expression.of(true).equal(true) + val strEq = Expression.of("helloworld").equal("goodbyeworld").not() + val combined = BooleanEquals.ofExpressions(boolEq, strEq) TestWorkspace.testProject().unitTest { val generator = ExpressionGenerator(Ownership.Borrowed, testContext) rust("assert_eq!(true, #W);", generator.generate(boolEq)) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index 74978699ca5..ee0038e53c6 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -230,26 +230,6 @@ class ServerProtocolTestGenerator( // not been written with a server-side perspective in mind. private fun List.fixBroken(): List = this.map { when (it) { - is TestCase.RequestTest -> { - val howToFixIt = BrokenRequestTests[Pair(codegenContext.serviceShape.id.toString(), it.id)] - if (howToFixIt == null) { - it - } else { - val fixed = howToFixIt(it.testCase, it.operationShape) - TestCase.RequestTest(fixed, it.operationShape) - } - } - - is TestCase.ResponseTest -> { - val howToFixIt = BrokenResponseTests[Pair(codegenContext.serviceShape.id.toString(), it.id)] - if (howToFixIt == null) { - it - } else { - val fixed = howToFixIt(it.testCase) - TestCase.ResponseTest(fixed, it.targetShape) - } - } - is TestCase.MalformedRequestTest -> { val howToFixIt = BrokenMalformedRequestTests[Pair(codegenContext.serviceShape.id.toString(), it.id)] if (howToFixIt == null) { @@ -259,6 +239,7 @@ class ServerProtocolTestGenerator( TestCase.MalformedRequestTest(fixed) } } + else -> it } } @@ -847,7 +828,25 @@ class ServerProtocolTestGenerator( // These tests are not even attempted to be generated, either because they will not compile // or because they are flaky - private val DisableTests = setOf() + private val DisableTests = setOf( + // TODO(https://github.com/awslabs/smithy-rs/issues/2891): Implement support for `@requestCompression` + "SDKAppendedGzipAfterProvidedEncoding_restJson1", + "SDKAppendedGzipAfterProvidedEncoding_restXml", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_1", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsQuery", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_ec2Query", + "SDKAppliedContentEncoding_awsJson1_0", + "SDKAppliedContentEncoding_awsJson1_1", + "SDKAppliedContentEncoding_awsQuery", + "SDKAppliedContentEncoding_ec2Query", + "SDKAppliedContentEncoding_restJson1", + "SDKAppliedContentEncoding_restXml", + + // RestXml S3 tests that fail to compile + "S3EscapeObjectKeyInUriLabel", + "S3EscapePathObjectKeyInUriLabel", + ) private fun fixRestJsonAllQueryStringTypes( testCase: HttpRequestTestCase, @@ -903,24 +902,6 @@ class ServerProtocolTestGenerator( ).asObjectNode().get(), ).build() - private fun fixRestJsonQueryStringEscaping( - testCase: HttpRequestTestCase, - @Suppress("UNUSED_PARAMETER") - operationShape: OperationShape, - ): HttpRequestTestCase = - testCase.toBuilder().params( - Node.parse( - """ - { - "queryString": "%:/?#[]@!${'$'}&'()*+,;=😹", - "queryParamsMapOfStringList": { - "String": ["%:/?#[]@!${'$'}&'()*+,;=😹"] - } - } - """.trimMargin(), - ).asObjectNode().get(), - ).build() - // TODO(https://github.com/awslabs/smithy/issues/1506) private fun fixRestJsonMalformedPatternReDOSString(testCase: HttpMalformedRequestTestCase): HttpMalformedRequestTestCase { val brokenResponse = testCase.response @@ -942,19 +923,11 @@ class ServerProtocolTestGenerator( .build() } - // These are tests whose definitions in the `awslabs/smithy` repository are wrong. - // This is because they have not been written from a server perspective, and as such the expected `params` field is incomplete. - // TODO(https://github.com/awslabs/smithy-rs/issues/1288): Contribute a PR to fix them upstream. - private val BrokenRequestTests = mapOf( - // TODO(https://github.com/awslabs/smithy/pull/1564) - // Pair(RestJson, "RestJsonAllQueryStringTypes") to ::fixRestJsonAllQueryStringTypes, - // TODO(https://github.com/awslabs/smithy/pull/1562) - Pair(RestJson, "RestJsonQueryStringEscaping") to ::fixRestJsonQueryStringEscaping, - ) - - private val BrokenResponseTests: Map, KFunction1> = - mapOf() - + // TODO(https://github.com/awslabs/smithy-rs/issues/1288): Move the fixed versions into + // `rest-json-extras.smithy` and put the unfixed ones in `ExpectFail`: this has the + // advantage that once our upstream PRs get merged and we upgrade to the next Smithy release, our build will + // fail and we will take notice to remove the fixes from `rest-json-extras.smithy`. This is exactly what the + // client does. private val BrokenMalformedRequestTests: Map, KFunction1> = // TODO(https://github.com/awslabs/smithy/issues/1506) mapOf( diff --git a/gradle.properties b/gradle.properties index aa791db007e..ccadd9016f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ smithy.rs.runtime.crate.version=0.0.0-smithy-rs-head kotlin.code.style=official # codegen -smithyGradlePluginVersion=0.6.0 -smithyVersion=1.29.0 +smithyGradlePluginVersion=0.7.0 +smithyVersion=1.35.0 # kotlin kotlinVersion=1.7.21 From d4a2308e94d911024a37ed26e05902f8afec4a59 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Tue, 1 Aug 2023 14:37:59 -0500 Subject: [PATCH 050/331] update MSRV to 1.69.0 (#2893) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 2 +- .github/workflows/claim-crate-names.yml | 2 +- .github/workflows/github-pages.yml | 2 +- .github/workflows/pull-request-bot.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-sdk-next.yml | 2 +- CHANGELOG.next.toml | 12 ++++++------ .../aws-inlineable/src/endpoint_discovery.rs | 6 +++--- .../aws-inlineable/src/http_request_checksum.rs | 14 ++++---------- .../aws-sigv4/src/http_request/sign.rs | 4 ++-- .../smithy/rust/codegen/core/testutil/Rust.kt | 2 +- gradle.properties | 2 +- rust-runtime/aws-smithy-http/src/middleware.rs | 2 +- .../aws-smithy-runtime-api/src/client/identity.rs | 6 ++++-- .../aws-smithy-runtime/src/client/orchestrator.rs | 2 +- rust-toolchain.toml | 2 +- tools/ci-build/Dockerfile | 2 +- 17 files changed, 31 insertions(+), 35 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a1e8f274da..f4208b271ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ on: required: false env: - rust_version: 1.68.2 + rust_version: 1.69.0 rust_toolchain_components: clippy,rustfmt ENCRYPTED_DOCKER_PASSWORD: ${{ secrets.ENCRYPTED_DOCKER_PASSWORD }} DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }} diff --git a/.github/workflows/claim-crate-names.yml b/.github/workflows/claim-crate-names.yml index d6e105d45fa..6f714a76713 100644 --- a/.github/workflows/claim-crate-names.yml +++ b/.github/workflows/claim-crate-names.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.68.2 + rust_version: 1.69.0 name: Claim unpublished crate names on crates.io run-name: ${{ github.workflow }} diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index c597e186c6b..c15767baa16 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -8,7 +8,7 @@ on: name: Update GitHub Pages env: - rust_version: 1.68.2 + rust_version: 1.69.0 # Allow only one doc pages build to run at a time for the entire smithy-rs repo concurrency: diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 28a5c8aea67..82fc80d9752 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -28,7 +28,7 @@ concurrency: env: java_version: 11 - rust_version: 1.68.2 + rust_version: 1.69.0 rust_toolchain_components: clippy,rustfmt apt_dependencies: libssl-dev gnuplot jq diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41a85393f8e..7d33ceba4ce 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.68.2 + rust_version: 1.69.0 name: Release smithy-rs run-name: ${{ github.workflow }} ${{ inputs.semantic_version }} (${{ inputs.commit_sha }}) - ${{ inputs.dry_run && 'Dry run' || 'Production run' }} diff --git a/.github/workflows/update-sdk-next.yml b/.github/workflows/update-sdk-next.yml index 47a3af62217..155924020a3 100644 --- a/.github/workflows/update-sdk-next.yml +++ b/.github/workflows/update-sdk-next.yml @@ -32,7 +32,7 @@ jobs: - name: Set up Rust uses: dtolnay/rust-toolchain@master with: - toolchain: 1.68.2 + toolchain: 1.69.0 - name: Delete old SDK run: | - name: Generate a fresh SDK diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fd6119d9650..a99d1f3afb9 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -159,16 +159,16 @@ meta = { "breaking" = true, "tada" = false, "bug" = false } author = "ysaito1001" [[aws-sdk-rust]] -message = "Update MSRV to Rust 1.68.2" -references = ["smithy-rs#2745"] +message = "Update MSRV to Rust 1.69.0" +references = ["smithy-rs#2893"] meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" +author = "Velfi" [[smithy-rs]] -message = "Update MSRV to Rust 1.68.2" -references = ["smithy-rs#2745"] +message = "Update MSRV to Rust 1.69.0" +references = ["smithy-rs#2893"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "jdisanti" +author = "Velfi" [[smithy-rs]] message = """`ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. diff --git a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs index de870fecc98..498844f1b3e 100644 --- a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs +++ b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs @@ -160,11 +160,11 @@ mod test { use crate::endpoint_discovery::create_cache; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_async::test_util::controlled_time_and_sleep; - use aws_smithy_async::time::{SharedTimeSource, SystemTimeSource}; + use aws_smithy_async::time::{SharedTimeSource, SystemTimeSource, TimeSource}; use aws_smithy_types::endpoint::Endpoint; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; - use std::time::{Duration, SystemTime, UNIX_EPOCH}; + use std::time::{Duration, UNIX_EPOCH}; use tokio::time::timeout; fn check_send_v(t: T) -> T { @@ -178,7 +178,7 @@ mod test { || async { Ok(( Endpoint::builder().url("http://foo.com").build(), - SystemTime::now(), + SystemTimeSource::new().now(), )) }, SharedAsyncSleep::new(TokioSleep::new()), diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index aff4e925e42..701a2e36a0b 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -239,11 +239,8 @@ mod tests { let mut body = request.body().try_clone().expect("body is retryable"); let mut body_data = BytesMut::new(); - loop { - match body.data().await { - Some(data) => body_data.extend_from_slice(&data.unwrap()), - None => break, - } + while let Some(data) = body.data().await { + body_data.extend_from_slice(&data.unwrap()) } let body = std::str::from_utf8(&body_data).unwrap(); assert_eq!( @@ -290,11 +287,8 @@ mod tests { let mut body = request.body().try_clone().expect("body is retryable"); let mut body_data = BytesMut::new(); - loop { - match body.data().await { - Some(data) => body_data.extend_from_slice(&data.unwrap()), - None => break, - } + while let Some(data) = body.data().await { + body_data.extend_from_slice(&data.unwrap()) } let body = std::str::from_utf8(&body_data).unwrap(); let expected_checksum = base64::encode(&crc32c_checksum); diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index 69d646daa24..aaeda06bb7f 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -611,7 +611,7 @@ mod tests { security_token: None, region: "us-east-1", service_name: "foo", - time: std::time::SystemTime::now(), + time: std::time::SystemTime::UNIX_EPOCH, settings, }; @@ -640,7 +640,7 @@ mod tests { security_token: None, region: "us-east-1", service_name: "foo", - time: std::time::SystemTime::now(), + time: std::time::SystemTime::UNIX_EPOCH, settings, }; diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index 8f8e6ff8b5a..0a4a52f839b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -111,7 +111,7 @@ object TestWorkspace { // help rust select the right version when we run cargo test // TODO(https://github.com/awslabs/smithy-rs/issues/2048): load this from the msrv property using a // method as we do for runtime crate versions - "[toolchain]\nchannel = \"1.68.2\"\n", + "[toolchain]\nchannel = \"1.69.0\"\n", ) // ensure there at least an empty lib.rs file to avoid broken crates newProject.resolve("src").mkdirs() diff --git a/gradle.properties b/gradle.properties index ccadd9016f4..58b9ec31ea3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # # Rust MSRV (entered into the generated README) -rust.msrv=1.68.2 +rust.msrv=1.69.0 # To enable debug, swap out the two lines below. # When changing this value, be sure to run `./gradlew --stop` to kill the Gradle daemon. diff --git a/rust-runtime/aws-smithy-http/src/middleware.rs b/rust-runtime/aws-smithy-http/src/middleware.rs index d3da9dac2d5..3285dec8721 100644 --- a/rust-runtime/aws-smithy-http/src/middleware.rs +++ b/rust-runtime/aws-smithy-http/src/middleware.rs @@ -112,7 +112,7 @@ where O: ParseHttpResponse>, { if let Some(parsed_response) = - debug_span!("parse_unloaded").in_scope(&mut || handler.parse_unloaded(&mut response)) + debug_span!("parse_unloaded").in_scope(|| handler.parse_unloaded(&mut response)) { trace!(response = ?response, "read HTTP headers for streaming response"); return sdk_result(parsed_response, response); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index eec7c4e32ce..27c4accf4ef 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -121,7 +121,7 @@ impl Identity { } } -impl fmt::Debug for Identity { +impl Debug for Identity { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("Identity") .field("data", (self.data_debug)(&self.data)) @@ -133,6 +133,7 @@ impl fmt::Debug for Identity { #[cfg(test)] mod tests { use super::*; + use aws_smithy_async::time::{SystemTimeSource, TimeSource}; #[test] fn check_send_sync() { @@ -148,7 +149,8 @@ mod tests { last: String, } - let expiration = SystemTime::now(); + let ts = SystemTimeSource::new(); + let expiration = ts.now(); let identity = Identity::new( MyIdentityData { first: "foo".into(), diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index b86953dded2..22bee36367c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -478,7 +478,7 @@ mod tests { .status(StatusCode::OK) .body(SdkBody::empty()) .map_err(|err| OrchestratorError::other(Box::new(err))) - .map(|res| Output::erase(res)), + .map(Output::erase), ) } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 864d3c411a9..f2415f8315c 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.68.2" +channel = "1.69.0" diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index d6ce780e658..f1e74fc79f4 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -6,7 +6,7 @@ # This is the base Docker build image used by CI ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 -ARG rust_stable_version=1.68.2 +ARG rust_stable_version=1.69.0 ARG rust_nightly_version=nightly-2023-05-31 FROM ${base_image} AS bare_base_image From 6eaacaa96684f662b7d355eea94a526c0b465e7f Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 1 Aug 2023 22:08:16 +0000 Subject: [PATCH 051/331] Upgrade the smithy-rs runtime crates version to 0.56.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 58b9ec31ea3..4b2eb378570 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.69.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.0.0-smithy-rs-head +smithy.rs.runtime.crate.version=0.56.0 kotlin.code.style=official From e78c60dbf169403eedceb1b718b862b0c5e5ee09 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 1 Aug 2023 22:10:49 +0000 Subject: [PATCH 052/331] Update changelog --- CHANGELOG.md | 450 +++++++++++++++++++++++ CHANGELOG.next.toml | 715 +----------------------------------- aws/SDK_CHANGELOG.next.json | 487 +++++++++++++++--------- 3 files changed, 766 insertions(+), 886 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 495ef2143fd..9cb6e477463 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,454 @@ +August 1st, 2023 +================ +**Breaking Changes:** +- ⚠🎉 (server, [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/awslabs/smithy-rs/issues/2827), @hlbarber) The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: + + - A `ServiceShape` trait has been added. + - The `Plugin` trait has been simplified. + - The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to. + - The `Operation` structure has been removed. + - A `Scoped` `Plugin` has been added. + + The `Plugin` trait has now been simplified and the `Operation` struct has been removed. + + ## Addition of `ServiceShape` + + Since the [0.52 release](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. + + ```rust + /// Models the [Smithy Operation shape]. + /// + /// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation + pub trait OperationShape { + /// The ID of the operation. + const ID: ShapeId; + + /// The operation input. + type Input; + /// The operation output. + type Output; + /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error + /// exists. + type Error; + } + ``` + + This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. + + We continue with this approach and introduce the following trait: + + ```rust + /// Models the [Smithy Service shape]. + /// + /// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html + pub trait ServiceShape { + /// The [`ShapeId`] of the service. + const ID: ShapeId; + + /// The version of the service. + const VERSION: Option<&'static str>; + + /// The [Protocol] applied to this service. + /// + /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html + type Protocol; + + /// An enumeration of all operations contained in this service. + type Operations; + } + ``` + + With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time. + + ## Simplication of the `Plugin` trait + + Previously, + + ```rust + trait Plugin { + type Service; + type Layer; + + fn map(&self, input: Operation) -> Operation; + } + ``` + + modified an `Operation`. + + Now, + + ```rust + trait Plugin { + type Output; + + fn apply(&self, input: T) -> Self::Output; + } + ``` + + maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. + + Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/awslabs/smithy-rs/issues/2777) for more context. + + The following middleware setup + + ```rust + pub struct PrintService { + inner: S, + name: &'static str, + } + + impl Service for PrintService + where + S: Service, + { + async fn call(&mut self, req: R) -> Self::Future { + println!("Hi {}", self.name); + self.inner.call(req) + } + } + + pub struct PrintLayer { + name: &'static str, + } + + impl Layer for PrintLayer { + type Service = PrintService; + + fn layer(&self, service: S) -> Self::Service { + PrintService { + inner: service, + name: self.name, + } + } + } + + pub struct PrintPlugin; + + impl Plugin for PrintPlugin + where + Op: OperationShape, + { + type Service = S; + type Layer = Stack; + + fn map(&self, input: Operation) -> Operation { + input.layer(PrintLayer { name: Op::NAME }) + } + } + ``` + + now becomes + + ```rust + pub struct PrintService { + inner: S, + name: &'static str, + } + + impl Service for PrintService + where + S: Service, + { + async fn call(&mut self, req: R) -> Self::Future { + println!("Hi {}", self.name); + self.inner.call(req) + } + } + + pub struct PrintPlugin; + + impl Plugin for PrintPlugin + where + Op: OperationShape, + { + type Output = PrintService; + + fn apply(&self, inner: T) -> Self::Output { + PrintService { inner, name: Op::ID.name() } + } + } + + impl HttpMarker for PrintPlugin { } + ``` + + Alternatively, using the new `ServiceShape`, implemented on `Ser`: + + ```rust + impl Plugin for PrintPlugin + where + Ser: ServiceShape, + { + type Service = PrintService; + + fn apply(&self, inner: T) -> Self::Service { + PrintService { inner, name: Ser::ID.name() } + } + } + ``` + + A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://awslabs.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://awslabs.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: + + ```rust + let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) + /* setters */ + .build() + .unwrap(); + ``` + + To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both: + + - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. + - A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. + + The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. + + Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: + + ```rust + use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin}; + + // Convert from `Layer` to `Plugin` which applies uniformly across all operations + let layer = /* some layer */; + let plugin = PluginLayer(layer); + + // Convert from `Plugin` to `Layer` for some fixed protocol and operation + let plugin = /* some plugin */; + let layer = LayerPlugin::new::(plugin); + ``` + + ## Removal of `PluginPipeline` + + Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type. + + This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful: + + ```rust + use aws_smithy_http_server::plugin::PluginPipeline; + + let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); + ``` + + Now collections of plugins must contain plugins of the same flavor: + + ```rust + use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins}; + + let http_plugins = HttpPlugins::new() + .push(http_plugin) + // .push(model_plugin) // This fails to compile with a helpful error message. + .push(&http_and_model_plugin); + let model_plugins = ModelPlugins::new() + .push(model_plugin) + .push(&http_and_model_plugin); + ``` + + In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections. + + ## Removal of `Operation` + + The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to + + ```rust + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */); + + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_operation(operation) + /* other setters */ + .build() + .unwrap(); + ``` + + to set an operation with a `tower::Service`, and + + ```rust + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */); + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */); + + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_operation(operation) + /* other setters */ + .build() + .unwrap(); + ``` + + to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation. + + We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder: + + ```rust + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_service(/* tower::Service */) + /* other setters */ + .build() + .unwrap(); + ``` + + Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id` + + ```rust + use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin}; + + let plugin = PluginLayer(/* layer */); + let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID); + + let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin) + .get_pokemon_species(/* handler */) + /* other setters */ + .build() + .unwrap(); + ``` + + or the new `Scoped` `Plugin` introduced below. + + # Addition of `Scoped` + + Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + // Only apply `plugin` to `CheckHealth` and `GetStorage` operation + let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID); + ``` + + In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable. + + ```rust + use aws_smithy_http_server::plugin::Scoped; + use pokemon_service_server_sdk::scoped; + + scope! { + /// Includes only the `CheckHealth` and `GetStorage` operation. + struct SomeScope { + includes: [CheckHealth, GetStorage] + } + } + let scoped_plugin = Scoped::new::(plugin); + ``` + +- ⚠ (all, [smithy-rs#2675](https://github.com/awslabs/smithy-rs/issues/2675)) Remove native-tls and add a migration guide. +- ⚠ (client, [smithy-rs#2671](https://github.com/awslabs/smithy-rs/issues/2671))

+ Breaking change in how event stream signing works (click to expand more details) + + This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. + + Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. + + See the changes in https://github.com/awslabs/smithy-rs/pull/2671 for an example of how this was done for SigV4. +
+- ⚠ (all, [smithy-rs#2673](https://github.com/awslabs/smithy-rs/issues/2673)) For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`. +- ⚠ (server, [smithy-rs#2539](https://github.com/awslabs/smithy-rs/issues/2539)) Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case. +- ⚠ (client, [smithy-rs#2728](https://github.com/awslabs/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/awslabs/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`. +- ⚠ (server, [smithy-rs#2676](https://github.com/awslabs/smithy-rs/issues/2676), [smithy-rs#2685](https://github.com/awslabs/smithy-rs/issues/2685)) Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration +- ⚠ (server, [smithy-rs#2457](https://github.com/awslabs/smithy-rs/issues/2457), @hlbarber) Remove `PollError` from an operations `Service::Error`. + + Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to + [`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) + no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. +- ⚠ (client, [smithy-rs#2742](https://github.com/awslabs/smithy-rs/issues/2742)) A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it. +- ⚠ (all, [smithy-rs#2893](https://github.com/awslabs/smithy-rs/issues/2893)) Update MSRV to Rust 1.69.0 +- ⚠ (server, [smithy-rs#2678](https://github.com/awslabs/smithy-rs/issues/2678)) `ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. + `OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. + + Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: + + ``` + filter_by_operation_name(plugin, |name| name != Op::ID); + ``` + + Your new filter selects on an operation's absolute name, namespace or name. + + ``` + filter_by_operation_id(plugin, |id| id.name() != Op::ID.name()); + ``` + + The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model. + + You can filter all operations in a namespace or absolute name: + + ``` + filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); + filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); + ``` +- ⚠ (client, [smithy-rs#2758](https://github.com/awslabs/smithy-rs/issues/2758)) The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs. +- ⚠ (server, [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), @hlbarber) Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. + + Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + use pokemon_service_server_sdk::operation_shape::CheckHealth; + + let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME); + ``` + + This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service. + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + use pokemon_service_server_sdk::service::Operation; + + let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth); + ``` + + Similarly, `plugin_from_operation_fn` now allows for + + ```rust + use aws_smithy_http_server::plugin::plugin_from_operation_fn; + use pokemon_service_server_sdk::service::Operation; + + fn map(op: Operation, inner: S) -> PrintService { + match op { + Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner }, + Operation::GetPokemonSpecies => PrintService { name: "hello world", inner }, + _ => todo!() + } + } + + let plugin = plugin_from_operation_fn(map); + ``` +- ⚠ (client, [smithy-rs#2783](https://github.com/awslabs/smithy-rs/issues/2783)) The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`. +- ⚠ (client, [smithy-rs#2845](https://github.com/awslabs/smithy-rs/issues/2845)) `aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`. +- ⚠ (client, [smithy-rs#2848](https://github.com/awslabs/smithy-rs/issues/2848)) The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed. +- ⚠ (server, [smithy-rs#2865](https://github.com/awslabs/smithy-rs/issues/2865)) The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer. +- ⚠ (client, [smithy-rs#2873](https://github.com/awslabs/smithy-rs/issues/2873)) The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets. +- ⚠ (client) The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/awslabs/smithy-rs/discussions/2887) to get your code working again. + +**New this release:** +- 🎉 (all, [smithy-rs#2647](https://github.com/awslabs/smithy-rs/issues/2647), [smithy-rs#2645](https://github.com/awslabs/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/awslabs/smithy-rs/issues/2646), [smithy-rs#2616](https://github.com/awslabs/smithy-rs/issues/2616), @thomas-k-cameron) Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives +- 🎉 (client, [smithy-rs#2652](https://github.com/awslabs/smithy-rs/issues/2652), @thomas-k-cameron) Add a `send_with` function on `-Input` types for sending requests without fluent builders +- (client, [smithy-rs#2791](https://github.com/awslabs/smithy-rs/issues/2791), @davidsouther) Add accessors to Builders +- (all, [smithy-rs#2786](https://github.com/awslabs/smithy-rs/issues/2786), @yotamofek) Avoid intermediate vec allocations in AggregatedBytes::to_vec. +- 🐛 (server, [smithy-rs#2733](https://github.com/awslabs/smithy-rs/issues/2733), @thor-bjorgvinsson) Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation. +- (client, [smithy-rs#2728](https://github.com/awslabs/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/awslabs/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported. +- 🐛 (client, [smithy-rs#2767](https://github.com/awslabs/smithy-rs/issues/2767), @mcmasn-amzn) Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces. +- (client, [smithy-rs#2854](https://github.com/awslabs/smithy-rs/issues/2854)) Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible. +- (server, [smithy-rs#2866](https://github.com/awslabs/smithy-rs/issues/2866)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. + Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: + ``` + HTTP/1.1 400 Bad Request + content-type: application/json + x-amzn-errortype: com.example.service#InvalidRequestException + ... + ``` + Example server error response now: + ``` + HTTP/1.1 400 Bad Request + content-type: application/json + x-amzn-errortype: InvalidRequestException + ... + ``` + +**Contributors** +Thank you for your contributions! ❤ +- @davidsouther ([smithy-rs#2791](https://github.com/awslabs/smithy-rs/issues/2791)) +- @hlbarber ([smithy-rs#2457](https://github.com/awslabs/smithy-rs/issues/2457), [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/awslabs/smithy-rs/issues/2827)) +- @mcmasn-amzn ([smithy-rs#2767](https://github.com/awslabs/smithy-rs/issues/2767)) +- @thomas-k-cameron ([smithy-rs#2616](https://github.com/awslabs/smithy-rs/issues/2616), [smithy-rs#2645](https://github.com/awslabs/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/awslabs/smithy-rs/issues/2646), [smithy-rs#2647](https://github.com/awslabs/smithy-rs/issues/2647), [smithy-rs#2652](https://github.com/awslabs/smithy-rs/issues/2652)) +- @thor-bjorgvinsson ([smithy-rs#2733](https://github.com/awslabs/smithy-rs/issues/2733)) +- @yotamofek ([smithy-rs#2786](https://github.com/awslabs/smithy-rs/issues/2786)) + + May 23rd, 2023 ============== **New this release:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index a99d1f3afb9..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,717 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - - [[aws-sdk-rust]] - message = "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations." - references = ["smithy-rs#2815"] - meta = { "breaking" = false, "tada" = false, "bug" = true } - author = "relevantsam" - - [[aws-sdk-rust]] - message = "Add accessors to Builders" - references = ["smithy-rs#2791"] - meta = { "breaking" = false, "tada" = false, "bug" = false } - author = "davidsouther" - - [[smithy-rs]] - message = "Add accessors to Builders" - references = ["smithy-rs#2791"] - meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} - author = "davidsouther" - -[[smithy-rs]] -message = "Avoid intermediate vec allocations in AggregatedBytes::to_vec." -author = "yotamofek" -references = ["smithy-rs#2786"] -meta = { "breaking" = false, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation." -author = "thor-bjorgvinsson" -references = ["smithy-rs#2733"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "server" } - -[[aws-sdk-rust]] -message = "Remove native-tls and add a migration guide." -author = "82marbag" -references = ["smithy-rs#2675"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Remove native-tls and add a migration guide." -author = "82marbag" -references = ["smithy-rs#2675"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[aws-sdk-rust]] -message = "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*" -references = ["smithy-rs#2722", "aws-sdk-rust#703"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[aws-sdk-rust]] -message = "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created." -references = ["smithy-rs#2720"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[smithy-rs]] -message = """ -
-Breaking change in how event stream signing works (click to expand more details) - -This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. - -Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. - -See the changes in https://github.com/awslabs/smithy-rs/pull/2671 for an example of how this was done for SigV4. -
-""" -references = ["smithy-rs#2671"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`." -references = ["smithy-rs#2673"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`." -references = ["smithy-rs#2673"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature." -references = ["smithy-rs#2730"] -author = "cholcombe973" -meta = { "breaking" = false, "tada" = false, "bug" = true } - -[[smithy-rs]] -message = "Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case." -references = ["smithy-rs#2539"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - -[[smithy-rs]] -message = "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = "Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration" -author = "david-perez" -references = ["smithy-rs#2676", "smithy-rs#2685"] -meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } - -[[smithy-rs]] -message = """Remove `PollError` from an operations `Service::Error`. - -Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to -[`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) -no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. -""" -references = ["smithy-rs#2457"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "hlbarber" - -[[aws-sdk-rust]] -message = "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction." -meta = { "breaking" = false, "tada" = true, "bug" = false } -references = ["smithy-rs#2707", "aws-sdk-rust#114", "smithy-rs#2846"] -author = "rcoh" - -[[smithy-rs]] -message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it." -references = ["smithy-rs#2742"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it." -references = ["smithy-rs#2742"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Update MSRV to Rust 1.69.0" -references = ["smithy-rs#2893"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "Velfi" - -[[smithy-rs]] -message = "Update MSRV to Rust 1.69.0" -references = ["smithy-rs#2893"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "Velfi" - -[[smithy-rs]] -message = """`ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. -`OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. - -Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: - -``` -filter_by_operation_name(plugin, |name| name != Op::ID); -``` - -Your new filter selects on an operation's absolute name, namespace or name. - -``` -filter_by_operation_id(plugin, |id| id.name() != Op::ID.name()); -``` - -The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model. - -You can filter all operations in a namespace or absolute name: - -``` -filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); -filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); -``` -""" -author = "82marbag" -references = ["smithy-rs#2678"] -meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } - -[[smithy-rs]] -message = "The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs." -references = ["smithy-rs#2758"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = """The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: - -- A `ServiceShape` trait has been added. -- The `Plugin` trait has been simplified. -- The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to. -- The `Operation` structure has been removed. -- A `Scoped` `Plugin` has been added. - -The `Plugin` trait has now been simplified and the `Operation` struct has been removed. - -## Addition of `ServiceShape` - -Since the [0.52 release](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. - -```rust -/// Models the [Smithy Operation shape]. -/// -/// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation -pub trait OperationShape { - /// The ID of the operation. - const ID: ShapeId; - - /// The operation input. - type Input; - /// The operation output. - type Output; - /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error - /// exists. - type Error; -} -``` - -This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. - -We continue with this approach and introduce the following trait: - -```rust -/// Models the [Smithy Service shape]. -/// -/// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html -pub trait ServiceShape { - /// The [`ShapeId`] of the service. - const ID: ShapeId; - - /// The version of the service. - const VERSION: Option<&'static str>; - - /// The [Protocol] applied to this service. - /// - /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html - type Protocol; - - /// An enumeration of all operations contained in this service. - type Operations; -} -``` - -With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time. - -## Simplication of the `Plugin` trait - -Previously, - -```rust -trait Plugin { - type Service; - type Layer; - - fn map(&self, input: Operation) -> Operation; -} -``` - -modified an `Operation`. - -Now, - -```rust -trait Plugin { - type Output; - - fn apply(&self, input: T) -> Self::Output; -} -``` - -maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. - -Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/awslabs/smithy-rs/issues/2777) for more context. - -The following middleware setup - -```rust -pub struct PrintService { - inner: S, - name: &'static str, -} - -impl Service for PrintService -where - S: Service, -{ - async fn call(&mut self, req: R) -> Self::Future { - println!("Hi {}", self.name); - self.inner.call(req) - } -} - -pub struct PrintLayer { - name: &'static str, -} - -impl Layer for PrintLayer { - type Service = PrintService; - - fn layer(&self, service: S) -> Self::Service { - PrintService { - inner: service, - name: self.name, - } - } -} - -pub struct PrintPlugin; - -impl Plugin for PrintPlugin -where - Op: OperationShape, -{ - type Service = S; - type Layer = Stack; - - fn map(&self, input: Operation) -> Operation { - input.layer(PrintLayer { name: Op::NAME }) - } -} -``` - -now becomes - -```rust -pub struct PrintService { - inner: S, - name: &'static str, -} - -impl Service for PrintService -where - S: Service, -{ - async fn call(&mut self, req: R) -> Self::Future { - println!("Hi {}", self.name); - self.inner.call(req) - } -} - -pub struct PrintPlugin; - -impl Plugin for PrintPlugin -where - Op: OperationShape, -{ - type Output = PrintService; - - fn apply(&self, inner: T) -> Self::Output { - PrintService { inner, name: Op::ID.name() } - } -} - -impl HttpMarker for PrintPlugin { } -``` - -Alternatively, using the new `ServiceShape`, implemented on `Ser`: - -```rust -impl Plugin for PrintPlugin -where - Ser: ServiceShape, -{ - type Service = PrintService; - - fn apply(&self, inner: T) -> Self::Service { - PrintService { inner, name: Ser::ID.name() } - } -} -``` - -A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://awslabs.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://awslabs.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: - -```rust -let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) - /* setters */ - .build() - .unwrap(); -``` - -To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both: - -- A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. -- A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. - -The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. - -Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: - -```rust -use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin}; - -// Convert from `Layer` to `Plugin` which applies uniformly across all operations -let layer = /* some layer */; -let plugin = PluginLayer(layer); - -// Convert from `Plugin` to `Layer` for some fixed protocol and operation -let plugin = /* some plugin */; -let layer = LayerPlugin::new::(plugin); -``` - -## Removal of `PluginPipeline` - -Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type. - -This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful: - -```rust -use aws_smithy_http_server::plugin::PluginPipeline; - -let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); -``` - -Now collections of plugins must contain plugins of the same flavor: - -```rust -use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins}; - -let http_plugins = HttpPlugins::new() - .push(http_plugin) - // .push(model_plugin) // This fails to compile with a helpful error message. - .push(&http_and_model_plugin); -let model_plugins = ModelPlugins::new() - .push(model_plugin) - .push(&http_and_model_plugin); -``` - -In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections. - -## Removal of `Operation` - -The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to - -```rust -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */); - -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_operation(operation) - /* other setters */ - .build() - .unwrap(); -``` - -to set an operation with a `tower::Service`, and - -```rust -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */); -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */); - -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_operation(operation) - /* other setters */ - .build() - .unwrap(); -``` - -to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation. - -We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder: - -```rust -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_service(/* tower::Service */) - /* other setters */ - .build() - .unwrap(); -``` - -Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id` - -```rust -use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin}; - -let plugin = PluginLayer(/* layer */); -let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID); - -let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin) - .get_pokemon_species(/* handler */) - /* other setters */ - .build() - .unwrap(); -``` - -or the new `Scoped` `Plugin` introduced below. - -# Addition of `Scoped` - -Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -// Only apply `plugin` to `CheckHealth` and `GetStorage` operation -let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID); -``` - -In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable. - -```rust -use aws_smithy_http_server::plugin::Scoped; -use pokemon_service_server_sdk::scoped; - -scope! { - /// Includes only the `CheckHealth` and `GetStorage` operation. - struct SomeScope { - includes: [CheckHealth, GetStorage] - } -} -let scoped_plugin = Scoped::new::(plugin); -``` - -""" -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779", "smithy-rs#2827"] -meta = { "breaking" = true, "tada" = true, "bug" = false, target = "server" } -author = "hlbarber" - -[[smithy-rs]] -message = "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives" -author = "thomas-k-cameron" -meta = { "breaking" = false, "tada" = true, "bug" = false, target = "all" } -references = [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616", -] - -[[aws-sdk-rust]] -message = "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives" -author = "thomas-k-cameron" -meta = { "breaking" = false, "tada" = true, "bug" = false } -references = [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616", -] - -[[smithy-rs]] -message = "Add a `send_with` function on `-Input` types for sending requests without fluent builders" -author = "thomas-k-cameron" -references = ["smithy-rs#2652"] -meta = { "breaking" = false, "tada" = true, "bug" = false, target = "client" } - -[[aws-sdk-rust]] -message = "Add a `send_with` function on `-Input` types for sending requests without fluent builders" -author = "thomas-k-cameron" -references = ["smithy-rs#2652"] -meta = { "breaking" = false, "tada" = true, "bug" = false } - -[[smithy-rs]] -message = """Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. - -Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -use pokemon_service_server_sdk::operation_shape::CheckHealth; - -let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME); -``` - -This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service. - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -use pokemon_service_server_sdk::service::Operation; - -let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth); -``` - -Similarly, `plugin_from_operation_fn` now allows for - -```rust -use aws_smithy_http_server::plugin::plugin_from_operation_fn; -use pokemon_service_server_sdk::service::Operation; - -fn map(op: Operation, inner: S) -> PrintService { - match op { - Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner }, - Operation::GetPokemonSpecies => PrintService { name: "hello world", inner }, - _ => todo!() - } -} - -let plugin = plugin_from_operation_fn(map); -``` -""" -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] -meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } -author = "hlbarber" - -[[smithy-rs]] -message = "Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces." -author = "mcmasn-amzn" -references = ["smithy-rs#2767"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } - -[[smithy-rs]] -message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." -references = ["smithy-rs#2783"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." -references = ["smithy-rs#2783"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "`aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`." -references = ["smithy-rs#2845"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed." -references = ["smithy-rs#2845"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed." -references = ["smithy-rs#2848"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible." -references = ["smithy-rs#2854"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility." -references = ["smithy-rs#2724"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = "The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer." -references = ["smithy-rs#2865"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - -[[aws-sdk-rust]] -message = "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client." -references = ["aws-sdk-rust#579", "aws-sdk-rust#338"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = """ -[RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. -Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: -``` -HTTP/1.1 400 Bad Request -content-type: application/json -x-amzn-errortype: com.example.service#InvalidRequestException -... -``` -Example server error response now: -``` -HTTP/1.1 400 Bad Request -content-type: application/json -x-amzn-errortype: InvalidRequestException -... -``` -""" -references = ["smithy-rs#2866"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - - -[[smithy-rs]] -message = "The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets." -meta = { "breaking" = true, "tada" = false , "bug" = false, "target" = "client" } -author = "rcoh" -references = ["smithy-rs#2873"] - -[[aws-sdk-rust]] -message = """The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.""" -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" -references = ["smithy-rs#2877"] - -[[aws-sdk-rust]] -message = """The `doc(hidden)` `with_env` in `ProviderConfig` was removed.""" -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" -references = ["smithy-rs#2877"] - -[[aws-sdk-rust]] -message = "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes." -references = [] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/awslabs/smithy-rs/discussions/2887) to get your code working again." -references = [] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} -author = "jdisanti" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 1beee31b1eb..cb5a407d326 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,150 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Integrate Endpoints 2.0 into the Rust SDK. Endpoints 2.0 enables features like S3 virtual addressing & S3\nobject lambda. As part of this change, there are several breaking changes although efforts have been made to deprecate\nwhere possible to smooth the upgrade path.\n1. `aws_smithy_http::endpoint::Endpoint` and the `endpoint_resolver` methods have been deprecated. In general, these usages\n should be replaced with usages of `endpoint_url` instead. `endpoint_url` accepts a string so an `aws_smithy_http::Endpoint`\n does not need to be constructed. This structure and methods will be removed in a future release.\n2. The `endpoint_resolver` method on `::config::Builder` now accepts a service specific endpoint resolver instead\n of an implementation of `ResolveAwsEndpoint`. Most users will be able to replace these usages with a usage of `endpoint_url`.\n3. `ResolveAwsEndpoint` has been deprecated and will be removed in a future version of the SDK.\n4. The SDK does not support \"pseudo regions\" anymore. Specifically, regions like `iam-fips` will no longer resolve to a FIPS endpoint.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#1784", - "smithy-rs#2074" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add additional configuration parameters to `aws_sdk_s3::Config`.\n\nThe launch of endpoints 2.0 includes more configuration options for S3. The default behavior for endpoint resolution has\nbeen changed. Before, all requests hit the path-style endpoint. Going forward, all requests that can be routed to the\nvirtually hosted bucket will be routed there automatically.\n- `force_path_style`: Requests will now default to the virtually-hosted endpoint `.s3..amazonaws.com`\n- `use_arn_region`: Enables this client to use an ARN’s region when constructing an endpoint instead of the client’s configured region.\n- `accelerate`: Enables this client to use S3 Transfer Acceleration endpoints.\n\nNote: the AWS SDK for Rust does not currently support Multi Region Access Points (MRAP).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#1784", - "smithy-rs#2074" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Move types for AWS SDK credentials to a separate crate.\nA new AWS runtime crate called `aws-credential-types` has been introduced. Types for AWS SDK credentials have been moved to that crate from `aws-config` and `aws-types`. The new crate is placed at the top of the dependency graph among AWS runtime crates with the aim of the downstream crates having access to the types defined in it.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2108" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add support for overriding profile name and profile file location across all providers. Prior to this change, each provider needed to be updated individually.\n\n### Before\n```rust\nuse aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\nuse aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n\nlet profile_files = ProfileFiles::builder()\n .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n .build();\nlet credentials_provider = ProfileFileCredentialsProvider::builder()\n .profile_files(profile_files.clone())\n .build();\nlet region_provider = ProfileFileRegionProvider::builder()\n .profile_files(profile_files)\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .region(region_provider)\n .load()\n .await;\n```\n\n### After\n```rust\nuse aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\nuse aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n\nlet profile_files = ProfileFiles::builder()\n .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n .build();\nlet sdk_config = aws_config::from_env()\n .profile_files(profile_files)\n .load()\n .await;\n/// ```\n", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2152" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "`aws_config::profile::retry_config` && `aws_config::environment::retry_config` have been removed. Use `aws_config::default_provider::retry_config` instead.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2162" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add support for resolving FIPS and dual-stack endpoints.\n\nFIPS and dual-stack endpoints can each be configured in multiple ways:\n1. Automatically from the environment and AWS profile\n2. Across all clients loaded from the same `SdkConfig` via `from_env().use_dual_stack(true).load().await`\n3. At a client level when constructing the configuration for an individual client.\n\nNote: Not all services support FIPS and dual-stack.\n", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#2168" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Improve SDK credentials caching through type safety. `LazyCachingCredentialsProvider` has been renamed to `LazyCredentialsCache` and is no longer treated as a credentials provider. Furthermore, you do not create a `LazyCredentialsCache` directly, and instead you interact with `CredentialsCache`. This introduces the following breaking changes.\n\nIf you previously used `LazyCachingCredentialsProvider`, you can replace it with `CredentialsCache`.\n
\nExample\n\nBefore:\n```rust\nuse aws_config::meta::credentials::lazy_caching::LazyCachingCredentialsProvider;\nuse aws_types::provider::ProvideCredentials;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet credentials_provider =\n LazyCachingCredentialsProvider::builder()\n .load(make_provider())\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_credential_types::cache::CredentialsCache;\nuse aws_types::provider::ProvideCredentials;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\n// Wrapping a result of `make_provider` in `LazyCredentialsCache` is done automatically.\nlet sdk_config = aws_config::from_env()\n .credentials_cache(CredentialsCache::lazy()) // This line can be omitted because it is on by default.\n .credentials_provider(make_provider())\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nIf you previously configured a `LazyCachingCredentialsProvider`, you can use the builder for `LazyCredentialsCache` instead.\n\nBefore:\n```rust\nuse aws_config::meta::credentials::lazy_caching::LazyCachingCredentialsProvider;\nuse aws_types::provider::ProvideCredentials;\nuse std::time::Duration;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet credentials_provider =\n LazyCachingCredentialsProvider::builder()\n .load(make_provider())\n .load_timeout(Duration::from_secs(60)) // Configures timeout.\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_credential_types::cache::CredentialsCache;\nuse aws_types::provider::ProvideCredentials;\nuse std::time::Duration;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet sdk_config = aws_config::from_env()\n .credentials_cache(\n CredentialsCache::lazy_builder()\n .load_timeout(Duration::from_secs(60)) // Configures timeout.\n .into_credentials_cache(),\n )\n .credentials_provider(make_provider())\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nThe examples above only demonstrate how to use `credentials_cache` and `credentials_provider` methods on `aws_config::ConfigLoader` but the same code update can be applied when you interact with `aws_types::sdk_config::Builder` or the builder for a service-specific config, e.g. `aws_sdk_s3::config::Builder`.\n\n
\n\n\nIf you previously configured a `DefaultCredentialsChain` by calling `load_timeout`, `buffer_time`, or `default_credential_expiration` on its builder, you need to call the same set of methods on the builder for `LazyCredentialsCache` instead.\n
\nExample\n\nBefore:\n```rust\nuse aws_config::default_provider::credentials::DefaultCredentialsChain;\nuse std::time::Duration;\n\nlet credentials_provider = DefaultCredentialsChain::builder()\n .buffer_time(Duration::from_secs(30))\n .default_credential_expiration(Duration::from_secs(20 * 60))\n .build()\n .await;\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_config::default_provider::credentials::default_provider;\nuse aws_credential_types::cache::CredentialsCache;\nuse std::time::Duration;\n\n// Previously used methods no longer exist on the builder for `DefaultCredentialsChain`.\nlet credentials_provider = default_provider().await;\n\nlet sdk_config = aws_config::from_env()\n .credentials_cache(\n CredentialsCache::lazy_builder()\n .buffer_time(Duration::from_secs(30))\n .default_credential_expiration(Duration::from_secs(20 * 60))\n .into_credentials_cache(),\n )\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\n
\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2122", - "smithy-rs#2227" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "The introduction of `CredentialsCache` comes with an accompanying type `SharedCredentialsCache`, which we will store in the property bag instead of a `SharedCredentialsProvider`. As a result, `aws_http::auth:set_provider` has been updated to `aws_http::auth::set_credentials_cache`.\n\nBefore:\n```rust\nuse aws_credential_types::Credentials;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_http::auth::set_provider;\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::operation;\n\nlet mut req = operation::Request::new(http::Request::new(SdkBody::from(\"some body\")));\nlet credentials = Credentials::new(\"example\", \"example\", None, None, \"my_provider_name\");\nset_provider(\n &mut req.properties_mut(),\n SharedCredentialsProvider::new(credentials),\n);\n```\n\nAfter:\n```rust\nuse aws_credential_types::Credentials;\nuse aws_credential_types::cache::{CredentialsCache, SharedCredentialsCache};\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_http::auth::set_credentials_cache;\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::operation;\n\nlet mut req = operation::Request::new(http::Request::new(SdkBody::from(\"some body\")));\nlet credentials = Credentials::new(\"example\", \"example\", None, None, \"my_provider_name\");\nlet credentials_cache = CredentialsCache::lazy_builder()\n .into_credentials_cache()\n .create_cache(SharedCredentialsProvider::new(credentials));\nset_credentials_cache(\n &mut req.properties_mut(),\n SharedCredentialsCache::new(credentials_cache),\n);\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2122", - "smithy-rs#2227" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Fix endpoint for s3.write_get_object_response(). This bug was introduced in 0.53.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2204" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Add `with_test_defaults()` and `set_test_defaults()` to `::Config`. These methods fill in defaults for configuration that is mandatory to successfully send a request.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2204" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, { "message": "Request IDs can now be easily retrieved on successful responses. For example, with S3:\n```rust\n// Import the trait to get the `request_id` method on outputs\nuse aws_sdk_s3::types::RequestId;\nlet output = client.list_buckets().send().await?;\nprintln!(\"Request ID: {:?}\", output.request_id());\n```\n", "meta": { @@ -162,7 +18,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Retrieving a request ID from errors now requires importing the `RequestId` trait. For example, with S3:\n```rust\nuse aws_sdk_s3::types::RequestId;\nprintln!(\"Request ID: {:?}\", error.request_id());\n```\n", @@ -177,7 +33,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these.", @@ -192,7 +48,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.\n
\nExample with S3\n**Before:**\n```rust\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError { kind, .. } => match kind {\n GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n }\n err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n**After:**\n```rust\n// Needed to access the `.code()` function on the error type:\nuse aws_sdk_s3::types::ProvideErrorMetadata;\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError::InvalidObjectState(value) => {\n println!(\"invalid object state: {:?}\", value);\n }\n GetObjectError::NoSuchKey(_) => {\n println!(\"object didn't exist\");\n }\n err if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n
\n", @@ -208,7 +64,7 @@ "smithy-rs#2075" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`.", @@ -223,7 +79,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated.", @@ -237,7 +93,7 @@ "aws-sdk-rust#740" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "`SdkError` variants can now be constructed for easier unit testing.", @@ -252,7 +108,7 @@ "smithy-rs#2208" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`.", @@ -267,7 +123,7 @@ "aws-sdk-rust#600" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Enable presigning for S3's `HeadObject` operation.", @@ -282,7 +138,7 @@ "smithy-rs#2451" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "The modules in the SDK crates have been reorganized. See the [SDK Crate Reorganization Upgrade Guidance](https://github.com/awslabs/aws-sdk-rust/discussions/752) to see how to fix your code after this change.", @@ -296,7 +152,7 @@ "smithy-rs#2433" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Reconnect on transient errors.\n\nIf a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not\nbe reused. This is enabled by default for all AWS services. It can be disabled by setting `RetryConfig::with_reconnect_mode`\n\nAlthough there is no API breakage from this change, it alters the client behavior in a way that may cause breakage for customers.\n", @@ -311,7 +167,7 @@ "smithy-rs#2445" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Update MSRV to 1.66.1", @@ -325,7 +181,7 @@ "smithy-rs#2467" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Default connector provided by `aws-config` now respects `ConnectorSettings`.\n\nPreviously, it used the timeout settings provided by aws-config. A test from @Oliboy50 has been incorporated to verify this behavior.\n\n**Behavior Change**: Prior to this change, the Hyper client would be shared between all service clients. After this change, each service client will use its own Hyper Client.\nTo revert to the previous behavior, set `HttpConnector::Prebuilt` on `SdkConfig::http_connector`.\n", @@ -341,7 +197,7 @@ "smithy-rs#2151" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Remove deprecated `ResolveAwsEndpoint` interfaces.\n[For details see the longform changelog entry](https://github.com/awslabs/aws-sdk-rust/discussions/755).\n", @@ -356,7 +212,7 @@ "smithy-rs#1784" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001)", @@ -370,7 +226,7 @@ "smithy-rs#2474" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Implement std::error::Error#source() properly for the service meta Error enum.", @@ -384,7 +240,7 @@ "aws-sdk-rust#784" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "The outputs for event stream operations (for example, S3's SelectObjectContent) now implement the `Sync` auto-trait.", @@ -398,7 +254,7 @@ "smithy-rs#2496" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "The AWS SDK now compiles for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!", @@ -412,7 +268,7 @@ "smithy-rs#2254" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "S3's `GetObject` will no longer panic when checksum validation is enabled and the target object was uploaded as a multi-part upload.\nHowever, these objects cannot be checksum validated by the SDK due to the way checksums are calculated for multipart uploads.\nFor more information, see [this page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums).\n", @@ -426,7 +282,7 @@ "aws-sdk-rust#764" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "`AppName` is now configurable from within `ConfigLoader`.", @@ -440,7 +296,7 @@ "smithy-rs#2513" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Add support for omitting session token in canonical requests for SigV4 signing.", @@ -454,7 +310,7 @@ "smithy-rs#2473" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions.", @@ -468,7 +324,7 @@ "smithy-rs#2525" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Fix bug where an incorrect endpoint was produced for `WriteGetObjectResponse`", @@ -483,7 +339,7 @@ "aws-sdk-rust#781" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Update the `std::fmt::Debug` implementation for `aws-sigv4::SigningParams` so that it will no longer print sensitive information.", @@ -497,7 +353,7 @@ "smithy-rs#2562" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "`aws_smithy_types::date_time::Format` has been re-exported in SDK crates.", @@ -511,7 +367,7 @@ "smithy-rs#2534" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Reduce several instances of credential exposure in the SDK logs:\n- IMDS now suppresses the body of the response from logs\n- `aws-sigv4` marks the `x-amz-session-token` header as sensitive\n- STS & SSO credentials have been manually marked as sensitive which suppresses logging of response bodies for relevant operations\n", @@ -525,7 +381,7 @@ "smithy-rs#2603" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Update MSRV to Rust 1.67.1", @@ -539,7 +395,7 @@ "smithy-rs#2611" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", @@ -554,8 +410,295 @@ "smithy-rs#2694" ], "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", + "age": 2 + }, + { + "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "relevantsam", + "references": [ + "smithy-rs#2815" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Add accessors to Builders", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "davidsouther", + "references": [ + "smithy-rs#2791" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Remove native-tls and add a migration guide.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "82marbag", + "references": [ + "smithy-rs#2675" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2722", + "aws-sdk-rust#703" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2720" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2673" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "cholcombe973", + "references": [ + "smithy-rs#2730" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2728", + "smithy-rs#2262", + "aws-sdk-rust#2087" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "rcoh", + "references": [ + "smithy-rs#2707", + "aws-sdk-rust#114", + "smithy-rs#2846" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2742" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Update MSRV to Rust 1.69.0", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "Velfi", + "references": [ + "smithy-rs#2893" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "thomas-k-cameron", + "references": [ + "smithy-rs#2647", + "smithy-rs#2645", + "smithy-rs#2646", + "smithy-rs#2616" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "thomas-k-cameron", + "references": [ + "smithy-rs#2652" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2783" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2845" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2724" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "aws-sdk-rust#579", + "aws-sdk-rust#338" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2877" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2877" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", "age": 1 } ], "aws-sdk-model": [] -} +} \ No newline at end of file From 234b8e6c01442576d61c5d2890fd93ad1f8e708f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 3 Aug 2023 08:25:14 -0700 Subject: [PATCH 053/331] Add max length check for changelog entries (#2896) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy-rs-tool-common/src/changelog.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs index 579bae2b5ab..5f358be99da 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs @@ -146,10 +146,16 @@ impl HandAuthoredEntry { if !self.author.chars().all(|c| c.is_alphanumeric() || c == '-') { bail!("Author must be valid GitHub username: [a-zA-Z0-9\\-]") } - // TODO(enableNewSmithyRuntimeCleanup): Re-add this validation - // if self.references.is_empty() { - // bail!("Changelog entry must refer to at least one pull request or issue"); - // } + if self.references.is_empty() { + bail!("Changelog entry must refer to at least one pull request or issue"); + } + if self.message.len() > 800 { + bail!( + "Your changelog entry is too long. Post long-form change log entries in \ + the GitHub Discussions under the Changelog category, and link to them from \ + the changelog." + ); + } Ok(()) } From 71c5788398e3b245d24232a6212d8a9c368f8ccb Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 3 Aug 2023 13:39:33 -0400 Subject: [PATCH 054/331] Default collections RFC (#2900) [Rendered](https://github.com/awslabs/smithy-rs/blob/flatten-collections-rfc/design/src/rfcs/rfc0035_collection_defaults.md) Could use a bit more color but I think it gets the point across. _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- .../src/rfcs/rfc0035_collection_defaults.md | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 design/src/rfcs/rfc0035_collection_defaults.md diff --git a/design/src/rfcs/rfc0035_collection_defaults.md b/design/src/rfcs/rfc0035_collection_defaults.md new file mode 100644 index 00000000000..a1aa389b4e5 --- /dev/null +++ b/design/src/rfcs/rfc0035_collection_defaults.md @@ -0,0 +1,82 @@ + +RFC: Collection Defaults +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC proposes a **breaking change** to how generated clients automatically provide default values for collections. Currently the SDK generated fields for `List` generate optional values: +```rust + ///

Container for elements related to a particular part. + pub fn parts(&self) -> Option<&[crate::types::Part]> { + self.parts.as_deref() + } +``` +This is _almost never_ what users want and leads to code noise when using collections: +```rust +async fn get_builds() { + let project = codebuild + .list_builds_for_project() + .project_name(build_project) + .send() + .await?; + let build_ids = project + .ids() + .unwrap_or_default(); + // ^^^^^^^^^^^^^^^^^^ this is pure noise +} +``` + +This RFC proposes unwrapping into default values in our accessor methods. + + +Terminology +----------- + +- **Accessor**: The Rust SDK defines accessor methods on modeled structures for fields to make them more convenient for users +- **Struct field**: The accessors point to concrete fields on the struct itself. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, users must call `.unwrap_or_default()` frequently. +Once this RFC is implemented, users will be able to use these accessors directly. In the rare case where users need to +distinguish be `None` and `[]`, we will direct users towards `model..is_some()`. + +```rust +async fn get_builds() { + let project = codebuild + .list_builds_for_project() + .project_name(build_project) + .send() + .await?; + let build_ids = project.ids(); + // Goodbye to this line: + // .unwrap_or_default(); +} +``` + + +How to actually implement this RFC +---------------------------------- + +In order to implement this feature, we need update the code generate accessors for lists and maps to add `.unwrap_or_default()`. Because we are returning slices `unwrap_or_default()` does not produce any additional allocations for empty collection. + +### Could this be implemented for `HashMap`? +This works for lists because we are returning a slice (allowing a statically owned `&[]` to be returned.) If we want to support HashMaps in the future this _is_ possible by using `OnceCell` to create empty HashMaps for requisite types. This would allow us to return references to those empty maps. + +### Isn't this handled by the default trait? +No, many existing APIs don't have the default trait. + +Changes checklist +----------------- +Estimated total work: 2 days +- [ ] Update accessor method generation to auto flatten lists +- [ ] Update docs for accessors to guide users to `.field.is_some()` if they MUST determine if the field was set. From c7fe610ffdc69e02853155ae68850388fcee93b9 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 3 Aug 2023 16:26:27 -0400 Subject: [PATCH 055/331] Add an RFC for limiting the HTTP public dependency (#2899) ## Motivation and Context [Rendered](https://github.com/awslabs/smithy-rs/blob/d3eaf5eea561af90146b7aa80da0307d49f63506/design/src/rfcs/rfc0036_http_dep_elimination.md) ## Description An RFC describing the need and proposed path for limiting the scope of our HTTP dependency. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- .../src/rfcs/rfc0036_http_dep_elimination.md | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 design/src/rfcs/rfc0036_http_dep_elimination.md diff --git a/design/src/rfcs/rfc0036_http_dep_elimination.md b/design/src/rfcs/rfc0036_http_dep_elimination.md new file mode 100644 index 00000000000..355d0f92ddb --- /dev/null +++ b/design/src/rfcs/rfc0036_http_dep_elimination.md @@ -0,0 +1,108 @@ + +RFC: Eliminating Public `http` dependencies +============= + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC defines how we plan to refactor the SDK to allow the SDK to consume a `1.0` version of `hyper`, `http-body`, +and `http` at a later date. Currently, `hyper` is `0.14.x` and a `1.0` release candidate series is in progress. However, +there are [open questions](https://github.com/orgs/hyperium/projects/1/views/4) that may significantly delay the launch +of +these three crates. We do not want to tie the `1.0` of the Rust SDK to these crates. + + +Terminology +----------- + +- **http-body**: A crate (and trait) defining how HTTP bodies work. Notably, the change from `0.*` to `1.0` changes `http-body` + to operate on frames instead of having separate methods. +- `http` (crate): a low level crate of `http` primitives (no logic, just requests and responses) +- ossified dependency: An ossified dependency describes a dependency that, when a new version is released, cannot be utilized without breaking changes. For example, if the `mutate_request` function on every operation operates on `&mut http::Request` where `http = 0.2`, that dependency is "ossified." Compare this to a function that offers the ability to convert something into an `http = 0.2` request—since http=1 and http=0.2 are largely equivalent, the + existence of this function does not prevent us from using http = 1 in the future. In general terms, **functions that operate on references are much more likely to ossify—There is no practical way for someone to mutate an `http = 0.2` request if you have an `http = 1` request other than a time-consuming clone, and reconversion process. + + + +## Why is this important? + +**Performance**: +At some point in the Future, `hyper = 1`, `http = 1` and `http-body = 1` will be released. It takes ~1-2 microseconds to rebuild an HTTP request. If we assume that `hyper = 1` will only operate on `http = 1` requests, then if we can't use `http = 1` requests internally, our only way of supporting `hyper = 1` will be to convert the HTTP request at dispatch time. Besides pinning us to a potentially unsupported version of the HTTP crate, this will prevent us from directly dispatching requests in an efficient manner. With a total overhead of 20µs for the SDK, 1µs is not insignificant. Furthermore, it grows as the number of request headers grow. A benchmark should be run for a realistic HTTP request e.g. one that we send to S3. + +**Hyper Upgrade**: +Hyper 1 is significantly more flexible than Hyper 0.14.x, especially WRT to connection management & pooling. If we don't make these changes, the upgrade to Hyper 1.x could be significantly more challenging. + +**Security Fixes**: +If we're still on `http = 0.*` and a vulnerability is identified, we may end up needing to manually contribute the patch. The `http` crate is not trivial and contains parsing logic and optimized code (including a non-trivial amount of `unsafe`). [See this GitHub issue](https://github.com/hyperium/http/issues/412). Notable is that one issue may be unsound and result in changing the public API. + +**API Friendliness** +If we ship with an API that public exposes customers to `http = 0.*`, we have the API forever. We have to consider that we aren't shipping the Rust SDK for this month or even this year but probably the Rust SDK for the next 5-10 years. + +The user experience if this RFC is implemented +---------------------------------------------- +Customers are impacted in 3 main locations: +1. HTTP types in Interceptors +2. HTTP types in `customize(...)` +3. HTTP types in Connectors + +In all three of these cases, users would interact with our `http` wrapper types instead. + + +In the current version of the SDK, we expose public dependencies on the `http` crate in several key places: + +1. The `sigv4` crate. The `sigv4` crate currently operates directly on many types from the `http` crate. This is unnecessary and actually makes the crate more difficult to use. Although `http` may be used internally, `http` will be removed from the public API of this crate. +2. Interceptor Context: `interceptor`s can mutate the HTTP request through an unshielded interface. This requires creating a [wrapper layer around `http::Request`](#http-request-wrapper) and updating already written interceptors. +3. `aws-config`: `http::Response` and `uri` +4. A long tail of exposed requests and responses in the runtime crates. Many of these crates will be removed post-orchestrator so this can be temporarily delayed. + + +How to actually implement this RFC +---------------------------------- + +### Enabling API evolution +One key mechanism that we SHOULD use for allowing our APIs to evolve in the future is usage of `~` version bounds for the runtime crates after releasing 1.0. + +### Http Request Wrapper + +In order to enable HTTP evolution, we will create a set of wrapper structures around `http::Request` and `http::Response`. These will use `http = 0` internally. Since the HTTP crate itself is quite small, including private dependencies on both versions of the crate is a workable solution. In general, we will aim for an API that is close to drop-in compatible to the HTTP crate while ensuring that a different crate could be used as the backing storage. + +```rust +// since it's our type, we can default `SdkBody` +pub struct Request { + // this uses the http = 0.2 request. In the future, we can make an internal enum to allow storing an http = 1 + http_0: http::Request +} +``` + +**Conversion to/from `http::Request`** +One key property here is that although converting to/from an `http::Request` **can** be expensive, this is *not* ossification of the API. This is because the API can support converting from/to both `http = 0` and `http = 1` in the future—because it offers mutation of the request via a unified interface, the request would only need to be converted once for dispatch if there was a mismatch (instead of repeatedly). At some point in the future, the `http = 0` representation could be deprecated and removed or feature gated. + +**Challenges** +1. Creating an HTTP API which is forwards compatible, idiomatic and "truthful" without relying on existing types from Hyper—e.g. when adding a header, we need to account for the possibility that a header is invalid. +2. Allow for future forwards-compatible evolution in the API—A lot of thought went into the `http` crate API w.r.t method parameters, types, and generics. Although we can aim for a simpler solution in some cases (e.g. accepting `&str` instead of `HeaderName`), we need to be careful that we do so while allowing API evolution. + +### Removing the SigV4 HTTP dependency +The SigV4 crate signs a number of `HTTP` types directly. We should change it to accept strings, and when appropriate, iterators of strings for headers. + +### Removing the HTTP dependency from generated clients +Generated clients currently include a public HTTP dependency in `customize`. This should be changed to accept our `HTTP` wrapper type instead or be restricted to a subset of operations (e.g. `add_header`) while forcing users to add an interceptor if they need full control. + + +In order to implement this feature, we need to add X and update Y... + + +Changes checklist +----------------- + +- [ ] Create the `http::Request` wrapper. Carefully audit for compatibility without breaking changes. 5 Days. +- [ ] Refactor currently written interceptors to use the wrapper: 2 days. +- [ ] Refactor the SigV4 crate to remove the HTTP dependency from the public interface: 2 days. +- [ ] Add / validate support for SdkBody `http-body = 1.0rc.2` either in a PR or behind a feature gate. Test this to + ensure it works with Hyper. +- [ ] Remove `http::Response` and `Uri` from the public exposed types in `aws-config`: 1-4 days. +- [ ] Long tail of other usages: 1 week +- [ ] Implement `~` versions for SDK Crate => runtime crate dependencies: 1 week From 4615785c7fdcd873afa3b2a214ac77bbdee18359 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Thu, 3 Aug 2023 21:27:21 +0100 Subject: [PATCH 056/331] Add TLS docs page (#2898) ## Motivation and Context The TLS connector page is missing ## Description Render the TLS connector documentation page ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed Co-authored-by: david-perez --- design/src/SUMMARY.md | 1 + design/src/transport/connector.md | 44 +++---------------- examples/pokemon-service-tls/Cargo.toml | 3 +- .../pokemon-service-tls/tests/common/mod.rs | 30 +++++++++++++ .../tests/custom_connectors.rs | 29 ++++++++++++ examples/pokemon-service-tls/tests/http2.rs | 14 ------ 6 files changed, 68 insertions(+), 53 deletions(-) create mode 100644 examples/pokemon-service-tls/tests/custom_connectors.rs delete mode 100644 examples/pokemon-service-tls/tests/http2.rs diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index ea3bcb65c96..34933fca197 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -6,6 +6,7 @@ - [Transport](transport/overview.md) - [HTTP Operations](transport/operation.md) - [HTTP Middleware](transport/middleware.md) + - [TLS Connector](transport/connector.md) - [Smithy](./smithy/overview.md) - [Simple Shapes](./smithy/simple_shapes.md) diff --git a/design/src/transport/connector.md b/design/src/transport/connector.md index cadbcb6dd5f..edb50d4412d 100644 --- a/design/src/transport/connector.md +++ b/design/src/transport/connector.md @@ -1,39 +1,7 @@ -The Smithy client provides a default TLS connector, but a custom one can be plugged in. -`rustls` is enabled with the feature flag `rustls`. +The Smithy client provides a default TLS connector, but a custom one can be +plugged in. `rustls` is enabled with the feature flag `rustls`. -The client had previously supported `native-tls`. You can use your custom connector like this. - -Create your connector: - -```rust -/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a smithy client, -/// wrap it in a [hyper_ext::Adapter](crate::hyper_ext::Adapter). -pub type NativeTls = hyper_tls::HttpsConnector; - -pub fn native_tls() -> NativeTls { - let mut tls = hyper_tls::native_tls::TlsConnector::builder(); - let tls = tls - .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12)) - .build() - .unwrap_or_else(|e| panic!("Error while creating TLS connector: {}", e)); - let mut http = hyper::client::HttpConnector::new(); - http.enforce_http(false); - hyper_tls::HttpsConnector::from((http, tls.into())) -} -``` - -Plug the connector in the client: -```rust -let mut builder = hyper::client::Builder::default(); -builder.pool_max_idle_per_host(70); -let connector = aws_smithy_client::erase::DynConnector::new( - aws_smithy_client::hyper_ext::Adapter::builder() - .hyper_builder(builder) - .connector_settings(std::default::Default::default()) - .build(native_tls()), -); -let raw_client = aws_smithy_client::builder::Builder::new() - .connector(connector) - .middleware_fn(...) - .build_dyn(); -``` +The client had previously (prior to version 0.56.0) supported `native-tls`. You +can continue to use a client whose TLS implementation is backed by `native-tls` +by passing in a custom connector. Check out the `custom_connectors.rs` tests in +the `pokemon-service-tls` example crate. diff --git a/examples/pokemon-service-tls/Cargo.toml b/examples/pokemon-service-tls/Cargo.toml index e1c3b3a0824..9f11a904fc8 100644 --- a/examples/pokemon-service-tls/Cargo.toml +++ b/examples/pokemon-service-tls/Cargo.toml @@ -26,8 +26,9 @@ pokemon-service-common = { path = "../pokemon-service-common/" } assert_cmd = "2.0" serial_test = "1.0.0" -# This dependency is only required for testing the `pokemon-service-tls` program. +# These dependencies are only required for testing the `pokemon-service-tls` program. hyper-rustls = { version = "0.24", features = ["http2"] } +hyper-tls = { version = "0.5" } # Local paths aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client/", features = ["rustls"] } diff --git a/examples/pokemon-service-tls/tests/common/mod.rs b/examples/pokemon-service-tls/tests/common/mod.rs index c56c5fe59f9..0d69407cf73 100644 --- a/examples/pokemon-service-tls/tests/common/mod.rs +++ b/examples/pokemon-service-tls/tests/common/mod.rs @@ -49,3 +49,33 @@ pub fn client_http2_only() -> Client { .build(); Client::from_conf(config) } + +/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a smithy client, +/// wrap it in a [aws_smithy_client::hyper_ext::Adapter]. +pub type NativeTlsConnector = hyper_tls::HttpsConnector; + +fn native_tls_connector() -> NativeTlsConnector { + let cert = hyper_tls::native_tls::Certificate::from_pem( + std::fs::read_to_string(DEFAULT_TEST_CERT) + .expect("could not open certificate") + .as_bytes(), + ) + .expect("could not parse certificate"); + + let tls_connector = hyper_tls::native_tls::TlsConnector::builder() + .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12)) + .add_root_certificate(cert) + .build() + .unwrap_or_else(|e| panic!("error while creating TLS connector: {}", e)); + let mut http_connector = hyper::client::HttpConnector::new(); + http_connector.enforce_http(false); + hyper_tls::HttpsConnector::from((http_connector, tls_connector.into())) +} + +pub fn native_tls_client() -> Client { + let config = Config::builder() + .http_connector(Adapter::builder().build(native_tls_connector())) + .endpoint_url(format!("https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) + .build(); + Client::from_conf(config) +} diff --git a/examples/pokemon-service-tls/tests/custom_connectors.rs b/examples/pokemon-service-tls/tests/custom_connectors.rs new file mode 100644 index 00000000000..12c82d55cbc --- /dev/null +++ b/examples/pokemon-service-tls/tests/custom_connectors.rs @@ -0,0 +1,29 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +pub mod common; + +use serial_test::serial; + +#[tokio::test] +#[serial] +// This test invokes an operation with a client that can only send HTTP2 requests and whose TLS +// implementation is backed by `rustls`. +async fn test_check_health_http2_rustls_connector() { + let _child = common::run_server().await; + let client = common::client_http2_only(); + + let _check_health = client.check_health().send().await.unwrap(); +} + +#[tokio::test] +#[serial] +// This test invokes an operation with a client whose TLS implementation is backed by `native_tls`. +async fn test_check_health_native_tls_connector() { + let _child = common::run_server().await; + let client = common::native_tls_client(); + + let _check_health = client.check_health().send().await.unwrap(); +} diff --git a/examples/pokemon-service-tls/tests/http2.rs b/examples/pokemon-service-tls/tests/http2.rs deleted file mode 100644 index 32c0fba08c7..00000000000 --- a/examples/pokemon-service-tls/tests/http2.rs +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -pub mod common; - -#[tokio::test] -async fn test_check_health_http2() { - let _child = common::run_server().await; - let client = common::client_http2_only(); - - let _check_health = client.check_health().send().await.unwrap(); -} From 54c3ede81803afaa3b9f37b243fdcdf71a2a47a6 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Fri, 4 Aug 2023 10:30:06 -0500 Subject: [PATCH 057/331] Update changelog icons to use github emoji shortcodes (#2901) I noticed these were switched for emojis but they should be shortcodes. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/changelogger/src/render.rs | 16 ++++++++-------- tools/ci-build/changelogger/tests/e2e_test.rs | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tools/ci-build/changelogger/src/render.rs b/tools/ci-build/changelogger/src/render.rs index 4dd8e22c1e4..445d2e8d709 100644 --- a/tools/ci-build/changelogger/src/render.rs +++ b/tools/ci-build/changelogger/src/render.rs @@ -175,13 +175,13 @@ fn to_md_link(reference: &Reference) -> String { fn render_entry(entry: &HandAuthoredEntry, mut out: &mut String) { let mut meta = String::new(); if entry.meta.bug { - meta.push('🐛'); + meta.push_str(":bug:"); } if entry.meta.breaking { - meta.push('⚠'); + meta.push_str(":warning:"); } if entry.meta.tada { - meta.push('🎉'); + meta.push_str(":tada:"); } if !meta.is_empty() { meta.push(' '); @@ -562,11 +562,11 @@ message = "Some API change" v0.3.0 (January 4th, 2022) ========================== **Breaking Changes:** -- ⚠ (all, [smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the code generator +- :warning: (all, [smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the code generator **New this release:** -- 🎉 (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator -- 🎉 (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator **Update guide:** blah blah @@ -586,10 +586,10 @@ Thank you for your contributions! ❤ v0.1.0 (January 4th, 2022) ========================== **Breaking Changes:** -- ⚠ ([smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the AWS SDK +- :warning: ([smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the AWS SDK **New this release:** -- 🎉 ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator **Service Features:** - `aws-sdk-ec2` (0.12.0): Some API change diff --git a/tools/ci-build/changelogger/tests/e2e_test.rs b/tools/ci-build/changelogger/tests/e2e_test.rs index 7f1a292df88..302607704a7 100644 --- a/tools/ci-build/changelogger/tests/e2e_test.rs +++ b/tools/ci-build/changelogger/tests/e2e_test.rs @@ -393,7 +393,7 @@ fn render_aws_sdk() { January 1st, 1970 ================= **New this release:** -- 🐛 ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change +- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change **Service Features:** - `aws-sdk-ec2` (0.12.0): Some API change @@ -414,7 +414,7 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- 🐛 ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567))\n\n", + "body": "**New this release:**\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567))\n\n", "prerelease": true }"#, release_manifest @@ -511,7 +511,7 @@ author = "rcoh" January 1st, 1970 ================= **Breaking Changes:** -- ⚠ (all, [smithy-rs#3](https://github.com/awslabs/smithy-rs/issues/3)) Third change - empty +- :warning: (all, [smithy-rs#3](https://github.com/awslabs/smithy-rs/issues/3)) Third change - empty **New this release:** - (server, [smithy-rs#1](https://github.com/awslabs/smithy-rs/issues/1), @server-dev) First change - server From 791e8d41072a2e086f16276ad50c68c7b4c6e056 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 7 Aug 2023 08:04:59 -0700 Subject: [PATCH 058/331] Re-export `RuntimeComponents` in generated clients (#2904) Re-export `RuntimeComponents`, and for generic clients, `RuntimeComponentsBuilder`, so that a direct dependency on `aws-smithy-runtime-api` isn't required to implement custom interceptors or runtime plugins. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 14 +++++++++++++- .../ClientRuntimeTypesReExportGenerator.kt | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..fac4ec6ebd9 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,16 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`." +references = ["smithy-rs#2904", "aws-sdk-rust#862"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "`RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`." +references = ["smithy-rs#2904"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} +author = "jdisanti" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 102400e511a..df32d161fd1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -28,10 +28,12 @@ class ClientRuntimeTypesReExportGenerator( """ pub use #{ConfigBag}; pub use #{Interceptor}; + pub use #{RuntimeComponents}; pub use #{SharedInterceptor}; """, "ConfigBag" to RuntimeType.configBag(rc), "Interceptor" to RuntimeType.interceptor(rc), + "RuntimeComponents" to RuntimeType.runtimeComponents(rc), "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), ) @@ -40,9 +42,11 @@ class ClientRuntimeTypesReExportGenerator( """ pub use #{runtime_plugin}::{RuntimePlugin, SharedRuntimePlugin}; pub use #{config_bag}::FrozenLayer; + pub use #{RuntimeComponentsBuilder}; """, "runtime_plugin" to RuntimeType.smithyRuntimeApi(rc).resolve("client::runtime_plugin"), "config_bag" to RuntimeType.smithyTypes(rc).resolve("config_bag"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), ) } } From fa54d8b6b5ab58b71625a4c2ec12a0dd3cf6d89f Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 8 Aug 2023 15:52:13 +0200 Subject: [PATCH 059/331] Check `Content-Type` header in all server protocols (#2531) ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../ServerHttpBoundProtocolGenerator.kt | 45 ++++++++++--------- .../src/protocol/rest_json_1/rejection.rs | 2 + .../src/protocol/rest_json_1/runtime_error.rs | 3 ++ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt index 6e22828a1c5..c579d644159 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt @@ -57,7 +57,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBoundProtoc import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions -import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors @@ -234,6 +233,11 @@ class ServerHttpBoundProtocolTraitImplGenerator( rustTemplate(init, *codegenScope) } } + // This checks for the expected `Content-Type` header if the `@httpPayload` trait is present, as dictated by + // the core Smithy library, which _does not_ require deserializing the payload. + // If no members have `@httpPayload`, the expected `Content-Type` header as dictated _by the protocol_ is + // checked later on for non-streaming operations, in `serverRenderShapeParser`: that check _does_ require at + // least buffering the entire payload, since the check must only be performed if the payload is empty. val verifyRequestContentTypeHeader = writable { operationShape .inputShape(model) @@ -242,11 +246,15 @@ class ServerHttpBoundProtocolTraitImplGenerator( ?.let { payload -> val target = model.expectShape(payload.target) if (!target.isBlobShape || target.hasTrait()) { - val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape) - ?.let { "Some(${it.dq()})" } ?: "None" + // `null` is only returned by Smithy when there are no members, but we know there's at least + // the one with `@httpPayload`, so `!!` is safe here. + val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape)!! rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_classifier(request.headers(), $expectedRequestContentType)?; + #{SmithyHttpServer}::protocol::content_type_header_classifier( + request.headers(), + Some("$expectedRequestContentType"), + )?; """, *codegenScope, ) @@ -689,30 +697,25 @@ class ServerHttpBoundProtocolTraitImplGenerator( rust("let (parts, body) = request.into_parts();") val parser = structuredDataParser.serverInputParser(operationShape) val noInputs = model.expectShape(operationShape.inputShape).expectTrait().originalId == null + if (parser != null) { - rustTemplate( - """ - let bytes = #{Hyper}::body::to_bytes(body).await?; - if !bytes.is_empty() { - """, - *codegenScope, - ) - if (protocol is RestJson) { + // `null` is only returned by Smithy when there are no members, but we know there's at least one, since + // there's something to parse (i.e. `parser != null`), so `!!` is safe here. + val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape)!! + rustTemplate("let bytes = #{Hyper}::body::to_bytes(body).await?;", *codegenScope) + rustBlock("if !bytes.is_empty()") { rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_classifier(&parts.headers, Some("application/json"))?; + #{SmithyHttpServer}::protocol::content_type_header_classifier( + &parts.headers, + Some("$expectedRequestContentType"), + )?; + input = #{parser}(bytes.as_ref(), input)?; """, *codegenScope, + "parser" to parser, ) } - rustTemplate( - """ - input = #{parser}(bytes.as_ref(), input)?; - } - """, - *codegenScope, - "parser" to parser, - ) } for (binding in bindings) { val member = binding.member diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs index e931f31052e..8577d4a5571 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs @@ -115,6 +115,8 @@ pub enum RequestRejection { NotAcceptable, /// Used when checking the `Content-Type` header. + /// This is bubbled up in the generated SDK when calling + /// [`crate::protocol::content_type_header_classifier`] in `from_request`. #[error("expected `Content-Type` header not found: {0}")] MissingContentType(#[from] MissingContentTypeReason), diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs index 5faf3ea8cf1..9b2a7b21e77 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs @@ -47,6 +47,9 @@ pub enum RuntimeError { InternalFailure(crate::Error), /// Request contained an `Accept` header with a MIME type, and the server cannot return a response /// body adhering to that MIME type. + /// This is returned directly (i.e. without going through a [`RequestRejection`] first) in the + /// generated SDK when calling [`crate::protocol::accept_header_classifier`] in + /// `from_request`. NotAcceptable, /// The request does not contain the expected `Content-Type` header value. UnsupportedMediaType, From 5675a69d725220a0a315ecd082e906246cac7aea Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 8 Aug 2023 12:19:56 -0400 Subject: [PATCH 060/331] Update HTTP RFC with note (#2906) ## Motivation and Context Add a quick note about the CRT CI fails because of rust compilation I'll see if I can fix easily otherwise will mark as ignored ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- design/src/SUMMARY.md | 2 ++ .../src/rfcs/rfc0035_collection_defaults.md | 8 +++---- .../src/rfcs/rfc0036_http_dep_elimination.md | 24 ++++++++++++++----- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index 34933fca197..a8277d72f38 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -61,6 +61,8 @@ - [RFC-0032: Better Constraint Violations](./rfcs/rfc0032_better_constraint_violations.md) - [RFC-0033: Improving access to request IDs in SDK clients](./rfcs/rfc0033_improve_sdk_request_id_access.md) - [RFC-0034: Smithy Orchestrator](./rfcs/rfc0034_smithy_orchestrator.md) + - [RFC-0035: Collection Defaults](./rfcs/rfc0035_collection_defaults.md) + - [RFC-0036: HTTP Dependency Exposure](./rfcs/rfc0036_http_dep_elimination.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/rfcs/rfc0035_collection_defaults.md b/design/src/rfcs/rfc0035_collection_defaults.md index a1aa389b4e5..218782f7894 100644 --- a/design/src/rfcs/rfc0035_collection_defaults.md +++ b/design/src/rfcs/rfc0035_collection_defaults.md @@ -3,7 +3,7 @@ RFC: Collection Defaults ============= -> Status: RFC +> Status: Accepted > > Applies to: client @@ -12,14 +12,14 @@ For a summarized list of proposed changes, see the [Changes Checklist](#changes- This RFC proposes a **breaking change** to how generated clients automatically provide default values for collections. Currently the SDK generated fields for `List` generate optional values: -```rust +```rust,ignore ///

Container for elements related to a particular part. pub fn parts(&self) -> Option<&[crate::types::Part]> { self.parts.as_deref() } ``` This is _almost never_ what users want and leads to code noise when using collections: -```rust +```rust,ignore async fn get_builds() { let project = codebuild .list_builds_for_project() @@ -50,7 +50,7 @@ In the current version of the SDK, users must call `.unwrap_or_default()` freque Once this RFC is implemented, users will be able to use these accessors directly. In the rare case where users need to distinguish be `None` and `[]`, we will direct users towards `model..is_some()`. -```rust +```rust,ignore async fn get_builds() { let project = codebuild .list_builds_for_project() diff --git a/design/src/rfcs/rfc0036_http_dep_elimination.md b/design/src/rfcs/rfc0036_http_dep_elimination.md index 355d0f92ddb..5c47d680fa5 100644 --- a/design/src/rfcs/rfc0036_http_dep_elimination.md +++ b/design/src/rfcs/rfc0036_http_dep_elimination.md @@ -2,7 +2,7 @@ RFC: Eliminating Public `http` dependencies ============= -> Status: RFC +> Status: Accepted > > Applies to: client @@ -24,7 +24,7 @@ Terminology to operate on frames instead of having separate methods. - `http` (crate): a low level crate of `http` primitives (no logic, just requests and responses) - ossified dependency: An ossified dependency describes a dependency that, when a new version is released, cannot be utilized without breaking changes. For example, if the `mutate_request` function on every operation operates on `&mut http::Request` where `http = 0.2`, that dependency is "ossified." Compare this to a function that offers the ability to convert something into an `http = 0.2` request—since http=1 and http=0.2 are largely equivalent, the - existence of this function does not prevent us from using http = 1 in the future. In general terms, **functions that operate on references are much more likely to ossify—There is no practical way for someone to mutate an `http = 0.2` request if you have an `http = 1` request other than a time-consuming clone, and reconversion process. + existence of this function does not prevent us from using http = 1 in the future. In general terms, **functions that operate on references are much more likely to ossify**—There is no practical way for someone to mutate an `http = 0.2` request if you have an `http = 1` request other than a time-consuming clone, and reconversion process. @@ -42,6 +42,20 @@ If we're still on `http = 0.*` and a vulnerability is identified, we may end up **API Friendliness** If we ship with an API that public exposes customers to `http = 0.*`, we have the API forever. We have to consider that we aren't shipping the Rust SDK for this month or even this year but probably the Rust SDK for the next 5-10 years. +**Future CRT Usage** +If we make this change, we enable a future where we can use the CRT HTTP request type natively without needing a last minute conversion to the CRT HTTP Request type. +```rust,ignore +struct HttpRequest { + inner: Inner +} + +enum Inner { + Httpv0(http_0::Request), + Httpv1(http_1::Request), + Crt(aws_crt_http::Request) +} +``` + The user experience if this RFC is implemented ---------------------------------------------- Customers are impacted in 3 main locations: @@ -70,7 +84,7 @@ One key mechanism that we SHOULD use for allowing our APIs to evolve in the futu In order to enable HTTP evolution, we will create a set of wrapper structures around `http::Request` and `http::Response`. These will use `http = 0` internally. Since the HTTP crate itself is quite small, including private dependencies on both versions of the crate is a workable solution. In general, we will aim for an API that is close to drop-in compatible to the HTTP crate while ensuring that a different crate could be used as the backing storage. -```rust +```rust,ignore // since it's our type, we can default `SdkBody` pub struct Request { // this uses the http = 0.2 request. In the future, we can make an internal enum to allow storing an http = 1 @@ -92,8 +106,6 @@ The SigV4 crate signs a number of `HTTP` types directly. We should change it to Generated clients currently include a public HTTP dependency in `customize`. This should be changed to accept our `HTTP` wrapper type instead or be restricted to a subset of operations (e.g. `add_header`) while forcing users to add an interceptor if they need full control. -In order to implement this feature, we need to add X and update Y... - Changes checklist ----------------- @@ -102,7 +114,7 @@ Changes checklist - [ ] Refactor currently written interceptors to use the wrapper: 2 days. - [ ] Refactor the SigV4 crate to remove the HTTP dependency from the public interface: 2 days. - [ ] Add / validate support for SdkBody `http-body = 1.0rc.2` either in a PR or behind a feature gate. Test this to - ensure it works with Hyper. + ensure it works with Hyper. Some previous work here exists: 1 week - [ ] Remove `http::Response` and `Uri` from the public exposed types in `aws-config`: 1-4 days. - [ ] Long tail of other usages: 1 week - [ ] Implement `~` versions for SDK Crate => runtime crate dependencies: 1 week From 61b675c00b3c421cbbd702fe756ca8bba17e6abb Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Wed, 9 Aug 2023 15:21:55 +0100 Subject: [PATCH 061/331] TLS tests in CI (#2886) ## Motivation and Context This PR adds a CI workflow to verify the TLS configuration of the smithy-rs client. ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed Co-authored-by: Daniele Ahmed --- .github/workflows/ci-tls.yml | 81 +++++++++ ci.mk | 4 + tools/ci-resources/tls-stub/Cargo.toml | 23 +++ tools/ci-resources/tls-stub/README.md | 8 + tools/ci-resources/tls-stub/src/main.rs | 160 ++++++++++++++++++ .../ci-scripts/configure-tls/configure-badssl | 25 +++ .../ci-scripts/configure-tls/configure-badtls | 17 ++ .../ci-scripts/configure-tls/configure-trytls | 14 ++ tools/ci-scripts/configure-tls/update-certs | 10 ++ 9 files changed, 342 insertions(+) create mode 100644 .github/workflows/ci-tls.yml create mode 100644 tools/ci-resources/tls-stub/Cargo.toml create mode 100644 tools/ci-resources/tls-stub/README.md create mode 100644 tools/ci-resources/tls-stub/src/main.rs create mode 100755 tools/ci-scripts/configure-tls/configure-badssl create mode 100755 tools/ci-scripts/configure-tls/configure-badtls create mode 100755 tools/ci-scripts/configure-tls/configure-trytls create mode 100755 tools/ci-scripts/configure-tls/update-certs diff --git a/.github/workflows/ci-tls.yml b/.github/workflows/ci-tls.yml new file mode 100644 index 00000000000..324b23383c3 --- /dev/null +++ b/.github/workflows/ci-tls.yml @@ -0,0 +1,81 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# This workflow tests the TLS configuration of the smithy-rs client +# To run on an Ubuntu machine, run each step in this order. +# Each script can be run on your Ubuntu host. +# You will have to install Docker and rustc/cargo manually. + +env: + rust_version: 1.68.2 + +name: Verify client TLS configuration +on: + pull_request: + push: + branches: [main] + +jobs: + verify-tls-config: + name: Verify TLS configuration + runs-on: ubuntu-latest + steps: + - name: Install packages + shell: bash + run: | + sudo apt-get update + sudo apt-get -y install gcc make python3-pip nginx git ruby openjdk-17-jre pkg-config libssl-dev faketime + pip3 install certbuilder crlbuilder + - name: Stop nginx + run: sudo systemctl stop nginx + - name: Checkout smithy-rs + uses: actions/checkout@v3 + with: + path: ./smithy-rs + - name: Checkout trytls + uses: actions/checkout@v3 + with: + repository: ouspg/trytls + path: ./trytls + - name: Checkout badtls + uses: actions/checkout@v3 + with: + repository: wbond/badtls.io + path: ./badtls.io + - name: Checkout badssl + uses: actions/checkout@v3 + with: + repository: chromium/badssl.com + path: ./badssl.com + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.rust_version }} + - name: Build badssl.com + shell: bash + working-directory: badssl.com + env: + DOCKER_BUILDKIT: 1 + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badssl + - name: Build SDK + working-directory: smithy-rs + run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso + - name: Build trytls + shell: bash + working-directory: trytls + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-trytls + - name: Build badtls.io + working-directory: badtls.io + shell: bash + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badtls + - name: Update TLS configuration + shell: bash + run: smithy-rs/tools/ci-scripts/configure-tls/update-certs + - name: Build TLS stub + working-directory: smithy-rs/tools/ci-resources/tls-stub + shell: bash + run: cargo build + - name: Test TLS configuration + working-directory: smithy-rs/tools + shell: bash + run: trytls https target/debug/stub diff --git a/ci.mk b/ci.mk index a7022355e6d..ddbe1013f7c 100644 --- a/ci.mk +++ b/ci.mk @@ -131,3 +131,7 @@ check-semver: .PHONY: generate-smithy-rs-release generate-smithy-rs-release: $(CI_ACTION) $@ $(ARGS) + +.PHONY: verify-tls-config +verify-tls-config: + $(CI_ACTION) $@ $(ARGS) diff --git a/tools/ci-resources/tls-stub/Cargo.toml b/tools/ci-resources/tls-stub/Cargo.toml new file mode 100644 index 00000000000..aea6e0a76d0 --- /dev/null +++ b/tools/ci-resources/tls-stub/Cargo.toml @@ -0,0 +1,23 @@ +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +[package] +name = "stub" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +aws-config = {path = "../../../aws/sdk/build/aws-sdk/sdk/aws-config", features = ["client-hyper"] } +aws-credential-types = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-credential-types", features = ["hardcoded-credentials"] } +aws-sdk-sts = { path = "../../../aws/sdk/build/aws-sdk/sdk/sts" } +aws-smithy-client = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-smithy-client", features = ["client-hyper", "rustls"] } +exitcode = "1" +hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"] } +rustls = "0.21" +rustls-native-certs = "0.6" +rustls-pemfile = "1" +tokio = { version = "1", features = ["full"] } +x509-parser = "0.15" diff --git a/tools/ci-resources/tls-stub/README.md b/tools/ci-resources/tls-stub/README.md new file mode 100644 index 00000000000..7d3f291e71c --- /dev/null +++ b/tools/ci-resources/tls-stub/README.md @@ -0,0 +1,8 @@ +# TLS Stub + +This package is used to verify the client's TLS configuration. + +It is used in a CI test. See `ci-tls.yml`, "Verify client TLS configuration". + +The stub loads a root certificate authority and uses it to connect to a supplied port on localhost. +`trytls` reads the output on the console and uses the exit code of the stub to pass or fail a test case. diff --git a/tools/ci-resources/tls-stub/src/main.rs b/tools/ci-resources/tls-stub/src/main.rs new file mode 100644 index 00000000000..8daebc5a7d2 --- /dev/null +++ b/tools/ci-resources/tls-stub/src/main.rs @@ -0,0 +1,160 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::env; +use std::fs::File; +use std::io::BufReader; +use std::time::Duration; + +use aws_config::timeout::TimeoutConfig; +use aws_credential_types::Credentials; +use aws_sdk_sts::error::SdkError; + +#[cfg(debug_assertions)] +use x509_parser::prelude::*; + +const OPERATION_TIMEOUT: u64 = 5; + +fn unsupported() { + println!("UNSUPPORTED"); + std::process::exit(exitcode::OK); +} + +fn get_credentials() -> Credentials { + Credentials::from_keys( + "AKIAIOSFODNN7EXAMPLE", + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + None, + ) +} + +#[cfg(debug_assertions)] +fn debug_cert(cert: &[u8]) { + let x509 = X509Certificate::from_der(cert).unwrap(); + let subject = x509.1.subject(); + let serial = x509.1.raw_serial_as_string(); + println!("Adding root CA: {subject} ({serial})"); +} + +fn add_cert_to_store(cert: &[u8], store: &mut rustls::RootCertStore) { + let cert = rustls::Certificate(cert.to_vec()); + #[cfg(debug_assertions)] + debug_cert(&cert.0); + if let Err(e) = store.add(&cert) { + println!("Error adding root certificate: {e}"); + unsupported(); + } +} + +fn load_ca_bundle(filename: &String, roots: &mut rustls::RootCertStore) { + match File::open(filename) { + Ok(f) => { + let mut f = BufReader::new(f); + match rustls_pemfile::certs(&mut f) { + Ok(certs) => { + for cert in certs { + add_cert_to_store(&cert, roots); + } + } + Err(e) => { + println!("Error reading PEM file: {e}"); + unsupported(); + } + } + } + Err(e) => { + println!("Error opening file '{filename}': {e}"); + unsupported(); + } + } +} + +fn load_native_certs(roots: &mut rustls::RootCertStore) { + let certs = rustls_native_certs::load_native_certs(); + if let Err(ref e) = certs { + println!("Error reading native certificates: {e}"); + unsupported(); + } + for cert in certs.unwrap() { + add_cert_to_store(&cert.0, roots); + } + let mut pem_ca_cert = b"\ +-----BEGIN CERTIFICATE----- +-----END CERTIFICATE-----\ +" as &[u8]; + let certs = rustls_pemfile::certs(&mut pem_ca_cert).unwrap(); + for cert in certs { + add_cert_to_store(&cert, roots); + } +} + +async fn create_client( + roots: rustls::RootCertStore, + host: &String, + port: &String, +) -> aws_sdk_sts::Client { + let credentials = get_credentials(); + let tls_config = rustls::client::ClientConfig::builder() + .with_safe_default_cipher_suites() + .with_safe_default_kx_groups() + .with_safe_default_protocol_versions() + .unwrap() + .with_root_certificates(roots) + .with_no_client_auth(); + let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_tls_config(tls_config) + .https_only() + .enable_http1() + .enable_http2() + .build(); + let smithy_connector = aws_smithy_client::hyper_ext::Adapter::builder().build(https_connector); + let sdk_config = aws_config::from_env() + .http_connector(smithy_connector) + .credentials_provider(credentials) + .region("us-nether-1") + .endpoint_url(format!("https://{host}:{port}")) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(OPERATION_TIMEOUT)) + .build(), + ) + .load() + .await; + aws_sdk_sts::Client::new(&sdk_config) +} + +#[tokio::main] +async fn main() -> Result<(), aws_sdk_sts::Error> { + let argv: Vec = env::args().collect(); + if argv.len() < 3 || argv.len() > 4 { + eprintln!("Syntax: {} [ca-file]", argv[0]); + std::process::exit(exitcode::USAGE); + } + let mut roots = rustls::RootCertStore::empty(); + if argv.len() == 4 { + print!( + "Connecting to https://{}:{} with root CA bundle from {}: ", + &argv[1], &argv[2], &argv[3] + ); + load_ca_bundle(&argv[3], &mut roots); + } else { + print!( + "Connecting to https://{}:{} with native roots: ", + &argv[1], &argv[2] + ); + load_native_certs(&mut roots); + } + let sts_client = create_client(roots, &argv[1], &argv[2]).await; + match sts_client.get_caller_identity().send().await { + Ok(_) => println!("\nACCEPT"), + Err(SdkError::DispatchFailure(e)) => println!("{e:?}\nREJECT"), + Err(SdkError::ServiceError(e)) => println!("{e:?}\nACCEPT"), + Err(e) => { + println!("Unexpected error: {e:#?}"); + std::process::exit(exitcode::SOFTWARE); + } + } + Ok(()) +} diff --git a/tools/ci-scripts/configure-tls/configure-badssl b/tools/ci-scripts/configure-tls/configure-badssl new file mode 100755 index 00000000000..f0b04951cbc --- /dev/null +++ b/tools/ci-scripts/configure-tls/configure-badssl @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +perl -p -i -e 's/ruby2\.4/ruby2.6/' Dockerfile +grep -q 'start of badssl\.test hosts' /etc/hosts || make list-hosts | sudo tee -a /etc/hosts +# badssl fails to create dh480.pem on our Ubuntu host. +# Create it manually inside the docker container. +sed -i '/CMD /i \ +RUN echo "-----BEGIN DH PARAMETERS-----" >/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +RUN echo "MEICPQDZ/YFp3iEs3/k9iRGoC/5/To2+5pUF/C6GkO6VjXHHyRVy68I0rI0q7IAq" >>/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +RUN echo "VyyGQ7/5Q/Iu0QQnHT4X9uMCAQI=" >>/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +RUN echo "-----END DH PARAMETERS-----" >>/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +' Dockerfile +sed -i '/ 480/c \\ttrue' certs/Makefile +# badssl does not create an expired certificate; +# it creates a certificate that expires after 1 day and waits for 1 day to run the "expired certificate" test. +# This command patches this behavior to run the test immediately. +# See: https://github.com/chromium/badssl.com/blob/df8d5a9d062f4b99fc19d8aacdea5333b399d624/certs/Makefile#L177 +sed -i 's%./tool sign $@ $(D) 1 sha256 req_v3_usr $^%faketime -f "-2d" ./tool sign $@ $(D) 1 sha256 req_v3_usr $^%' certs/Makefile +screen -dmS badssl sudo make serve diff --git a/tools/ci-scripts/configure-tls/configure-badtls b/tools/ci-scripts/configure-tls/configure-badtls new file mode 100755 index 00000000000..6828fce1a3a --- /dev/null +++ b/tools/ci-scripts/configure-tls/configure-badtls @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +python3 scripts/generate.py badtls.test +sudo mkdir /etc/nginx/tls || true +sudo mkdir /var/www || true +sudo python3 scripts/install.py /etc/nginx/conf.d /etc/nginx/tls /var/www +sudo rm /etc/nginx/sites-enabled/default +echo '#### start of badtls.test hosts ####' | sudo tee -a /etc/hosts +echo '127.0.0.1 domain-match.badtls.test wildcard-match.badtls.test san-match.badtls.test dh1024.badtls.test expired-1963.badtls.test future.badtls.test domain-mismatch.badtls.test san-mismatch.badtls.test bad-key-usage.badtls.test expired.badtls.test wildcard.mismatch.badtls.test rc4.badtls.test weak-sig.badtls.test rc4-md5.badtls.test' | sudo tee -a /etc/hosts +echo '#### end of badtls.test hosts ####' | sudo tee -a /etc/hosts +screen -dmS badtls sudo bash ./scripts/local.sh diff --git a/tools/ci-scripts/configure-tls/configure-trytls b/tools/ci-scripts/configure-tls/configure-trytls new file mode 100755 index 00000000000..0006092e0cf --- /dev/null +++ b/tools/ci-scripts/configure-tls/configure-trytls @@ -0,0 +1,14 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +perl -p -i -e 's!\./runners!runners!' setup.py +sed -i '/import platform/a import distro' runners/trytls/utils.py +sed -i 's/platform.linux_distribution()/distro.name(), distro.version(), distro.id()/' runners/trytls/utils.py +sed -i 's/break//' runners/trytls/bundles/https.py +perl -p -i -e 's/badssl\.com/badssl.test/g; s/badtls\.io/badtls.test/g;' runners/trytls/bundles/https.py +pip3 install -e . diff --git a/tools/ci-scripts/configure-tls/update-certs b/tools/ci-scripts/configure-tls/update-certs new file mode 100755 index 00000000000..3ccab98e60c --- /dev/null +++ b/tools/ci-scripts/configure-tls/update-certs @@ -0,0 +1,10 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +sed -i -e '/BEGIN CERTIFICATE/,/CERTIFICATE/!b' -e '/END CERTIFICATE/!d;r badtls.io/certs/ca.crt' -e 'd' trytls/runners/trytls/bundles/https.py +sed -i -e '/BEGIN CERTIFICATE/,/CERTIFICATE/!b' -e '/END CERTIFICATE/!d;r badssl.com/certs/sets/test/gen/crt/ca-root.crt' -e 'd' smithy-rs/tools/ci-resources/tls-stub/src/main.rs From ccb7b08058158d80aaf23b6573cb363b98b7c5fe Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 9 Aug 2023 15:31:16 -0700 Subject: [PATCH 062/331] Improve presigning module docs (#2903) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-inlineable/src/presigning.rs | 7 +++++++ .../amazon/smithy/rustsdk/AwsPresigningDecorator.kt | 3 +++ 2 files changed, 10 insertions(+) diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index c9de75dfb0b..a6333527693 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -3,7 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ +// TODO(https://github.com/awslabs/smithy-rs/issues/2902): Code generate this documentation so that service-specific examples can be added. //! Presigned request types and configuration. +//! +//! The [`Client`](crate::Client) is used to create presigned requests. They are made +//! by calling `.presigned()` instead of `.send()` on an operation, and require a +//! [`PresigningConfig`](crate::presigning::PresigningConfig) to provide an expiration time. +//! +//! Only operations that support presigning have the `presigned()` method on them. use std::fmt; use std::time::{Duration, SystemTime}; diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index 3957f773919..e0a2df817ff 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -500,6 +500,9 @@ private fun RustWriter.documentPresignedMethod(hasConfigArg: Boolean) { Presigned requests can be given to other users or applications to access a resource or perform an operation without having access to the AWS security credentials. + + _Important:_ If you're using credentials that can expire, such as those from STS AssumeRole or SSO, then + the presigned request can only be valid for as long as the credentials used to create it are. """, ) } From d7ffa89338225108e2d11a57f1aa6b6c289bd7af Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 10 Aug 2023 10:43:57 -0700 Subject: [PATCH 063/331] Clean up the pre-commit config (#2915) Update the name of the `sdk-lints` check since it checks more than just license headers now, and make it run at the end so that KTLint runs and fixes files even if there's an invalid changelog entry. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .pre-commit-config.yaml | 26 +++++++++---------- .../{license-header.sh => sdk-lints.sh} | 3 +-- 2 files changed, 14 insertions(+), 15 deletions(-) rename .pre-commit-hooks/{license-header.sh => sdk-lints.sh} (99%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a45d403a097..c6e004a8a70 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,19 +6,6 @@ repos: - id: end-of-file-fixer exclude: ^aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/ - id: trailing-whitespace -- repo: local - hooks: - - id: kotlin-block-quotes - name: Kotlin Block Quotes - entry: ./.pre-commit-hooks/kotlin-block-quotes.py - language: python - files: ^.*\.kt$ - - id: license-header-check - name: License Header Check - entry: ./.pre-commit-hooks/license-header.sh - language: system - files: ^.*$ - pass_filenames: false - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks rev: v2.10.0 hooks: @@ -29,3 +16,16 @@ repos: - id: pretty-format-rust entry: rustfmt --edition 2021 files: ^.*\.rs$ +- repo: local + hooks: + - id: kotlin-block-quotes + name: Kotlin Block Quotes + entry: ./.pre-commit-hooks/kotlin-block-quotes.py + language: python + files: ^.*\.kt$ + - id: sdk-lints-check + name: sdk-lints + entry: ./.pre-commit-hooks/sdk-lints.sh + language: system + files: ^.*$ + pass_filenames: false diff --git a/.pre-commit-hooks/license-header.sh b/.pre-commit-hooks/sdk-lints.sh similarity index 99% rename from .pre-commit-hooks/license-header.sh rename to .pre-commit-hooks/sdk-lints.sh index 653320a98e2..be7bf421f33 100755 --- a/.pre-commit-hooks/license-header.sh +++ b/.pre-commit-hooks/sdk-lints.sh @@ -1,9 +1,8 @@ #!/bin/bash -set -e - # # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 # +set -e cd "$(git rev-parse --show-toplevel)/tools/ci-build/sdk-lints" && cargo run -- check --license --changelog From 0286b9fbea4235071a5ce8837c25f11c933d4d4a Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 10 Aug 2023 15:18:03 -0700 Subject: [PATCH 064/331] Fix S3 optional auth (#2907) ## Motivation and Context This PR implements a short-term solution for aws-sdk-rust#864 while a long-term solution is worked out. ## Testing - Tested manually against S3. - Added DVR tests. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../rustsdk/customize/s3/S3Decorator.kt | 24 ++++ aws/sdk/build.gradle.kts | 2 +- .../s3/tests/data/no_auth/get-object.json | 85 +++++++++++ .../s3/tests/data/no_auth/head-object.json | 94 ++++++++++++ .../tests/data/no_auth/list-objects-v2.json | 93 ++++++++++++ .../s3/tests/data/no_auth/list-objects.json | 93 ++++++++++++ aws/sdk/integration-tests/s3/tests/no_auth.rs | 136 ++++++++++++++++++ .../src/client/orchestrator/auth.rs | 8 +- 9 files changed, 539 insertions(+), 2 deletions(-) create mode 100644 aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json create mode 100644 aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json create mode 100644 aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json create mode 100644 aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json create mode 100644 aws/sdk/integration-tests/s3/tests/no_auth.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fac4ec6ebd9..8cf6a7fb2ab 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -22,3 +22,9 @@ message = "`RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exporte references = ["smithy-rs#2904"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} author = "jdisanti" + +[[aws-sdk-rust]] +message = "Fix requests to S3 with `no_credentials` set." +references = ["smithy-rs#2907", "aws-sdk-rust#864"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "jdisanti" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt index 72f128fb701..e83ebb1e9af 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput @@ -34,6 +35,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctio import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestXml import software.amazon.smithy.rust.codegen.core.smithy.traits.AllowInvalidXmlRoot +import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.getBuiltIn import software.amazon.smithy.rustsdk.toWritable @@ -82,6 +84,8 @@ class S3Decorator : ClientCodegenDecorator { }, )::transform, ) + // enable optional auth for operations commonly used with public buckets + .let(AddOptionalAuth()::transform) override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { return listOf( @@ -129,6 +133,26 @@ class FilterEndpointTests( } } +// TODO(P96049742): This model transform may need to change depending on if and how the S3 model is updated. +private class AddOptionalAuth { + private val s3OptionalAuthOperations = listOf( + ShapeId.from("com.amazonaws.s3#ListObjects"), + ShapeId.from("com.amazonaws.s3#ListObjectsV2"), + ShapeId.from("com.amazonaws.s3#HeadObject"), + ShapeId.from("com.amazonaws.s3#GetObject"), + ) + + fun transform(model: Model) = ModelTransformer.create().mapShapes(model) { shape -> + if (shape is OperationShape && s3OptionalAuthOperations.contains(shape.id) && !shape.hasTrait()) { + shape.toBuilder() + .addTrait(OptionalAuthTrait()) + .build() + } else { + shape + } + } +} + class S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContext) { private val runtimeConfig = codegenContext.runtimeConfig private val errorScope = arrayOf( diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index ebf1b3a705b..03e9bcfde5c 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -338,7 +338,7 @@ tasks.register("generateCargoWorkspace") { doFirst { outputDir.mkdirs() outputDir.resolve("Cargo.toml").writeText(generateCargoWorkspace(awsServices)) - rootProject.rootDir.resolve("clippy-root.toml").copyTo(outputDir.resolve("clippy.toml")) + rootProject.rootDir.resolve("clippy-root.toml").copyTo(outputDir.resolve("clippy.toml"), overwrite = true) } inputs.property("servicelist", awsServices.moduleNames.toString()) if (awsServices.examples.isNotEmpty()) { diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json new file mode 100644 index 00000000000..4cc94177a3e --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json @@ -0,0 +1,85 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz?x-id=GetObject", + "headers": { + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "content-type": [ + "binary/octet-stream" + ], + "x-amz-id-2": [ + "mO5q2ZSztYdEU923Zi5sHNctHwRRzOyngQEWsZWHwOJEgxrj9dw0KH0IVovTxu2Y8V0ps5z4KMQ=" + ], + "content-length": [ + "386910" + ], + "accept-ranges": [ + "bytes" + ], + "x-amz-server-side-encryption": [ + "AES256" + ], + "x-amz-request-id": [ + "EGGB3A7GXR9YWDYM" + ], + "last-modified": [ + "Mon, 27 Jan 2020 20:56:51 GMT" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:42 GMT" + ], + "x-amz-meta-description": [ + "{\"url\": \"s3://cleversafe.service.consul/stage-submission-5/ORGANOID-PANCREATIC/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\", \"node_id\": \"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\"}" + ], + "server": [ + "AmazonS3" + ], + "etag": [ + "\"446fc665f99183cd0540d7656a79d3ed\"" + ] + } + } + } + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json new file mode 100644 index 00000000000..c0ab633b57b --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json @@ -0,0 +1,94 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz", + "headers": { + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ], + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "HEAD" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "last-modified": [ + "Mon, 27 Jan 2020 20:56:51 GMT" + ], + "content-type": [ + "binary/octet-stream" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:42 GMT" + ], + "server": [ + "AmazonS3" + ], + "content-length": [ + "386910" + ], + "accept-ranges": [ + "bytes" + ], + "x-amz-server-side-encryption": [ + "AES256" + ], + "x-amz-id-2": [ + "+d6tSM3krTTrvY+y6PFHnkw9OhAtJhQy8RzFrPO6vnUOIuvqViB9gFZvfJCcVMj7gX+dpIvZ3HI=" + ], + "x-amz-request-id": [ + "EGGF3G9KFMFHZ3E0" + ], + "etag": [ + "\"446fc665f99183cd0540d7656a79d3ed\"" + ], + "x-amz-meta-description": [ + "{\"url\": \"s3://cleversafe.service.consul/stage-submission-5/ORGANOID-PANCREATIC/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\", \"node_id\": \"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\"}" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json new file mode 100644 index 00000000000..952e22dc516 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json @@ -0,0 +1,93 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/?list-type=2&max-keys=3", + "headers": { + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ], + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "x-amz-id-2": [ + "InRlbSiDTNSjIiYuGbkpnrz0TIgFVsDu8bnzVwF2UvZiOuiwhvdA3oltBT1ILZqNyFzSIkShTKk=" + ], + "x-amz-request-id": [ + "H8T96AN5TTDT3SSQ" + ], + "server": [ + "AmazonS3" + ], + "x-amz-bucket-region": [ + "us-east-1" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:41 GMT" + ], + "content-type": [ + "application/xml" + ], + "transfer-encoding": [ + "chunked" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "\ngdc-organoid-pancreatic-phs001611-2-open1SL9nYFaimMAwnR9dJnF4M5NMfm3Em6/ClPUVLEH3GOSw5yjeI+wCBLj3THB8DuJSUFhKNy5cGK5QBb/SvE+MKMZurarr0ZhOhQae2SQ8B4QQPkqQHKp9MeJXsYe4UH8/okpqJUZNS2AQt7gXrz7mFdIJXPuSckj02e06tvxZAOkHu7ER4xTJ+odI774K2xB+pcD3H0pqTUt+TebzB83BzA==33true0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz2020-01-27T20:56:51.000Z"446fc665f99183cd0540d7656a79d3ed"386910STANDARD04a0a508-459a-4758-ac40-c3e8cb966683/30520ecd-c6bd-4039-9b1a-d3f999235598.FPKM-UQ.txt.gz2020-01-27T20:56:50.000Z"a2c6997aa0c6a9fd697af3e0517d96be"388349STANDARD0541851c-ac0c-496e-93d2-3c03921fa6bd/c92f3dc4-24ea-457b-b90a-d6d599b14a73.rna_seq.star_gene_counts.tsv.gz2020-01-27T20:56:51.000Z"f2c4e159c9b2f4233c4c0c27f4c25472"396626STANDARD" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json new file mode 100644 index 00000000000..9b9b01c5a54 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json @@ -0,0 +1,93 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/?max-keys=3", + "headers": { + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ], + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "transfer-encoding": [ + "chunked" + ], + "server": [ + "AmazonS3" + ], + "x-amz-id-2": [ + "9/ufVv0fY5POrsdgAV2QMGmmpa78fx0YlL5KkQHzg46B0/NAWr/l0YsmR/F2HPn8ByFIwO5NdFs=" + ], + "x-amz-bucket-region": [ + "us-east-1" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:40 GMT" + ], + "x-amz-request-id": [ + "QJE4M4NA5KFKN6YA" + ], + "content-type": [ + "application/xml" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "\ngdc-organoid-pancreatic-phs001611-2-open3true0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz2020-01-27T20:56:51.000Z"446fc665f99183cd0540d7656a79d3ed"386910118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08dcfopen-bucketsSTANDARD04a0a508-459a-4758-ac40-c3e8cb966683/30520ecd-c6bd-4039-9b1a-d3f999235598.FPKM-UQ.txt.gz2020-01-27T20:56:50.000Z"a2c6997aa0c6a9fd697af3e0517d96be"388349118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08dcfopen-bucketsSTANDARD0541851c-ac0c-496e-93d2-3c03921fa6bd/c92f3dc4-24ea-457b-b90a-d6d599b14a73.rna_seq.star_gene_counts.tsv.gz2020-01-27T20:56:51.000Z"f2c4e159c9b2f4233c4c0c27f4c25472"396626118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08dcfopen-bucketsSTANDARD" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs new file mode 100644 index 00000000000..1d6947582a5 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -0,0 +1,136 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[cfg(not(aws_sdk_middleware_mode))] +mod access_public_datasets_without_credentials { + use aws_smithy_client::dvr::ReplayingConnection; + use aws_smithy_protocol_test::MediaType; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + + #[tokio::test] + async fn list_objects() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/list-objects.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .list_objects() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .max_keys(3) + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); + } + + #[tokio::test] + async fn list_objects_v2() { + let _logs = capture_test_logs(); + + let conn = + ReplayingConnection::from_file("tests/data/no_auth/list-objects-v2.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .list_objects_v2() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .max_keys(3) + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); + } + + #[tokio::test] + async fn head_object() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/head-object.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .head_object() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); + } + + #[tokio::test] + async fn get_object() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/get-object.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .get_object() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 71a9b048732..ae177809791 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::client::auth::no_auth::NO_AUTH_SCHEME_ID; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOptionResolver, @@ -124,10 +125,15 @@ fn extract_endpoint_auth_scheme_config( endpoint: &Endpoint, scheme_id: AuthSchemeId, ) -> Result, AuthOrchestrationError> { + // TODO(P96049742): Endpoint config doesn't currently have a concept of optional auth or "no auth", so + // we are short-circuiting lookup of endpoint auth scheme config if that is the selected scheme. + if scheme_id == NO_AUTH_SCHEME_ID { + return Ok(AuthSchemeEndpointConfig::empty()); + } let auth_schemes = match endpoint.properties().get("authSchemes") { Some(Document::Array(schemes)) => schemes, // no auth schemes: - None => return Ok(AuthSchemeEndpointConfig::from(None)), + None => return Ok(AuthSchemeEndpointConfig::empty()), _other => { return Err(AuthOrchestrationError::BadAuthSchemeEndpointConfig( "expected an array for `authSchemes` in endpoint config".into(), From 17e78b68c70e6e18266d7715955931343c7e39d4 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 14 Aug 2023 12:17:39 -0400 Subject: [PATCH 065/331] Fix generated summary docs for convenience HashMap / Vec members (#2914) Previously the docs said `Vec` when the method actually accepted `String`, similarly for HashMap. ## Motivation and Context - https://github.com/awslabs/aws-sdk-rust/issues/825 ## Description Fix the generator to be aware of Vec/Hashmap methods ## Testing - UT - [x] audit codegen diff ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++++ .../client/FluentClientGenerator.kt | 13 +++++-- .../client/FluentClientGeneratorTest.kt | 34 +++++++++++++++++++ .../rust/codegen/core/rustlang/RustType.kt | 2 +- .../rust/codegen/core/smithy/RuntimeType.kt | 31 ++++++++++++++--- 5 files changed, 78 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8cf6a7fb2ab..e0ea56e68bb 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -23,6 +23,12 @@ references = ["smithy-rs#2904"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} author = "jdisanti" +[[smithy-rs]] +message = "Fix incorrect summary docs for builders" +references = ["smithy-rs#2914", "aws-sdk-rust#825"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "rcoh" + [[aws-sdk-rust]] message = "Fix requests to S3 with `no_credentials` set." references = ["smithy-rs#2907", "aws-sdk-rust#864"] diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index d7fb4560b5f..e581774fbfa 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -715,11 +715,18 @@ private fun OperationShape.fullyQualifiedFluentBuilder( * * _NOTE: This function generates the type names that appear under **"The fluent builder is configurable:"**_ */ -private fun MemberShape.asFluentBuilderInputDoc(symbolProvider: SymbolProvider): String { +internal fun MemberShape.asFluentBuilderInputDoc(symbolProvider: SymbolProvider): String { val memberName = symbolProvider.toMemberName(this) - val outerType = symbolProvider.toSymbol(this).rustType() + val outerType = symbolProvider.toSymbol(this).rustType().stripOuter() + // We generate Vec/HashMap helpers + val renderedType = when (outerType) { + is RustType.Vec -> listOf(outerType.member) + is RustType.HashMap -> listOf(outerType.key, outerType.member) + else -> listOf(outerType) + } + val args = renderedType.joinToString { it.asArgumentType(fullyQualified = false) } - return "$memberName(${outerType.stripOuter().asArgumentType(fullyQualified = false)})" + return "$memberName($args)" } /** diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index 1e02493212e..abda9bf6330 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -5,10 +5,13 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client +import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -17,6 +20,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.util.lookup class FluentClientGeneratorTest { val model = """ @@ -34,9 +38,39 @@ class FluentClientGeneratorTest { structure TestInput { foo: String, byteValue: Byte, + listValue: StringList, + mapValue: ListMap, + doubleListValue: DoubleList + } + + list StringList { + member: String + } + + list DoubleList { + member: StringList + } + + map ListMap { + key: String, + value: StringList } """.asSmithyModel() + @Test + fun `generate correct input docs`() { + val expectations = mapOf( + "listValue" to "list_value(impl Into)", + "doubleListValue" to "double_list_value(Vec)", + "mapValue" to "map_value(impl Into, Vec)", + "byteValue" to "byte_value(i8)", + ) + expectations.forEach { (name, expect) -> + val member = model.lookup("com.example#TestInput\$$name") + member.asFluentBuilderInputDoc(testSymbolProvider(model)) shouldBe expect + } + } + @Test fun `send() future implements Send`() { val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 798218ab960..9b7f9cbc1d4 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -200,7 +200,7 @@ fun RustType.qualifiedName(): String { /** Format this Rust type as an `impl Into` */ fun RustType.implInto(fullyQualified: Boolean = true): String { - return "impl ${RuntimeType.Into.fullyQualifiedName()}<${this.render(fullyQualified)}>" + return "impl ${RuntimeType.Into.render(fullyQualified)}<${this.render(fullyQualified)}>" } /** Format this Rust type so that it may be used as an argument type in a function definition */ diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index e24edc7f862..2341c36e5cb 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -115,7 +115,7 @@ data class RuntimeConfig( /** * `RuntimeType` captures all necessary information to render a type into a Rust file: - * - [name]: What type is this? + * - [fullyQualifiedName]: What type is this? * - [namespace]: Where can we find this type. * - [dependency]: What other crates, if any, are required to use this type? * @@ -126,7 +126,7 @@ data class RuntimeConfig( * `http::header::HeaderName` * ------------ ---------- * | | - * `[namespace]` `[name]` + * `[namespace]` `[fullyQualifiedName]` * * This type would have a [CargoDependency] pointing to the `http` crate. Writing it multiple times would still only * add the dependency once. @@ -185,8 +185,14 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) /** * Returns the fully qualified name for this type */ - fun fullyQualifiedName(): String { - return path + fun fullyQualifiedName(): String = path + + fun render(fullyQualified: Boolean = true): String { + return if (fullyQualified) { + fullyQualifiedName() + } else { + name + } } /** @@ -336,41 +342,58 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun configBag(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag") + fun runtimeComponents(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponents") + fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponentsBuilder") + fun runtimePlugins(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugins") + fun runtimePlugin(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") + fun sharedRuntimePlugin(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::SharedRuntimePlugin") + fun boxError(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("box_error::BoxError") + fun interceptor(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::Interceptor") + fun interceptorContext(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::InterceptorContext") + fun sharedInterceptor(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor") fun afterDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::AfterDeserializationInterceptorContextRef") + fun beforeSerializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextRef") + fun beforeSerializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextMut") + fun beforeDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextRef") + fun beforeDeserializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextMut") + fun beforeTransmitInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextRef") + fun beforeTransmitInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextMut") + fun finalizerInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextRef") + fun finalizerInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextMut") From 5c4e17aabef4bb98fee084319be0614d735b11d9 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 15 Aug 2023 11:42:40 -0700 Subject: [PATCH 066/331] Fix doc comment on `from_conf` (#2923) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy/generators/client/FluentClientGenerator.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index e581774fbfa..dfb7ccf0670 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -198,10 +198,9 @@ class FluentClientGenerator( /// /// ## Panics /// - /// - This method will panic if the `conf` is missing an async sleep implementation. If you experience this panic, set - /// the `sleep_impl` on the Config passed into this function to fix it. - /// - This method will panic if the `conf` is missing an HTTP connector. If you experience this panic, set the - /// `http_connector` on the Config passed into this function to fix it. + /// This method will panic if the `conf` has retry or timeouts enabled without a `sleep_impl`. + /// If you experience this panic, it can be fixed by setting the `sleep_impl`, or by disabling + /// retries and timeouts. pub fn from_conf(conf: crate::Config) -> Self { let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); From 88d385108fa495232f8095194348fa28d5339b2b Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 15 Aug 2023 15:19:56 -0500 Subject: [PATCH 067/331] Update `enableNewSmithyRuntime`'s default to orchestrator (#2924) ## Description Updates the default value of `enableNewSmithyRuntime` in `ClientCodegenConfig` to `orchestrator`. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: ysaito1001 --- .../smithy/rust/codegen/client/smithy/ClientRustSettings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index c7268a67a30..be82879a7a7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -133,7 +133,7 @@ data class ClientCodegenConfig( renameExceptions = node.get().getBooleanMemberOrDefault("renameErrors", defaultRenameExceptions), includeFluentClient = node.get().getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), - enableNewSmithyRuntime = SmithyRuntimeMode.fromString(node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware")), + enableNewSmithyRuntime = SmithyRuntimeMode.fromString(node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "orchestrator")), includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("enableUserConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), ) From 89802592b0c135cfac78683ef71cf44dc60a669b Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 16 Aug 2023 12:57:16 -0700 Subject: [PATCH 068/331] Remove middleware - part 1 (#2920) This PR removes the runtime mode flag, test compile flags, and CI checks for client middleware. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 3 - aws/rust-runtime/aws-config/src/lib.rs | 2 +- aws/sdk-adhoc-test/build.gradle.kts | 8 +- .../smithy/rustsdk/AwsCodegenDecorator.kt | 1 - .../rustsdk/AwsFluentClientDecorator.kt | 84 +-- .../smithy/rustsdk/AwsPresigningDecorator.kt | 35 +- .../amazon/smithy/rustsdk/CredentialCaches.kt | 128 +---- .../smithy/rustsdk/CredentialProviders.kt | 44 +- .../rustsdk/EndpointBuiltInsDecorator.kt | 19 +- .../HttpConnectorConfigCustomization.kt | 190 ------- .../rustsdk/IntegrationTestDependencies.kt | 16 +- .../smithy/rustsdk/InvocationIdDecorator.kt | 9 +- .../rustsdk/RecursionDetectionDecorator.kt | 5 +- .../amazon/smithy/rustsdk/RegionDecorator.kt | 93 +-- .../rustsdk/RetryClassifierDecorator.kt | 11 +- .../RetryInformationHeaderDecorator.kt | 5 +- .../smithy/rustsdk/SigV4AuthDecorator.kt | 24 +- .../smithy/rustsdk/SigV4SigningDecorator.kt | 23 +- .../smithy/rustsdk/UserAgentDecorator.kt | 105 +--- .../customize/DisabledAuthDecorator.kt | 12 +- .../apigateway/ApiGatewayDecorator.kt | 38 +- .../customize/glacier/GlacierDecorator.kt | 22 +- .../timestream/TimestreamDecorator.kt | 33 +- .../rustsdk/CredentialProviderConfigTest.kt | 13 +- .../HttpConnectorConfigCustomizationTest.kt | 24 - .../rustsdk/RegionProviderConfigTest.kt | 13 +- .../rustsdk/SigV4SigningDecoratorTest.kt | 14 +- aws/sdk/build.gradle.kts | 2 - .../dynamodb/benches/deserialization_bench.rs | 30 +- .../dynamodb/benches/serialization_bench.rs | 36 +- .../retries-with-client-rate-limiting.rs | 301 +++++----- .../kms/tests/retryable_errors.rs | 194 +++---- .../tests/client-construction.rs | 25 - .../s3/tests/alternative-async-runtime.rs | 8 +- .../s3/tests/config-override.rs | 7 - .../s3/tests/config_to_builder.rs | 1 - .../integration-tests/s3/tests/endpoints.rs | 19 - .../s3/tests/interceptors.rs | 209 ++++--- aws/sdk/integration-tests/s3/tests/no_auth.rs | 256 +++++---- .../s3/tests/request_information_headers.rs | 535 +++++++++--------- .../integration-tests/sts/tests/signing-it.rs | 21 - .../timestreamquery/tests/endpoint_disco.rs | 1 - codegen-client-test/build.gradle.kts | 6 +- .../client/smithy/ClientCodegenContext.kt | 1 - .../codegen/client/smithy/ClientRustModule.kt | 12 - .../client/smithy/ClientRustSettings.kt | 21 - .../client/smithy/RustClientCodegenPlugin.kt | 2 - .../customizations/ApiKeyAuthDecorator.kt | 230 -------- .../customizations/EndpointPrefixGenerator.kt | 2 +- .../customizations/HttpAuthDecorator.kt | 9 +- .../HttpConnectorConfigDecorator.kt | 102 +--- .../InterceptorConfigCustomization.kt | 12 - .../ResiliencyConfigCustomization.kt | 383 +++++-------- .../customizations/TimeSourceCustomization.kt | 92 +-- .../customize/RequiredCustomizations.kt | 31 +- .../endpoint/EndpointConfigCustomization.kt | 113 +--- .../endpoint/EndpointParamsDecorator.kt | 5 +- .../smithy/endpoint/EndpointsDecorator.kt | 2 +- .../generators/EndpointParamsGenerator.kt | 10 +- .../EndpointParamsInterceptorGenerator.kt | 8 +- .../generators/EndpointResolverGenerator.kt | 2 +- .../ClientRuntimeTypesReExportGenerator.kt | 6 +- .../EndpointTraitBindingGenerator.kt | 11 +- .../smithy/generators/OperationGenerator.kt | 181 +++--- .../smithy/generators/PaginatorGenerator.kt | 64 +-- .../smithy/generators/ServiceGenerator.kt | 14 +- .../client/CustomizableOperationGenerator.kt | 93 +-- .../client/FluentClientDecorator.kt | 16 +- .../client/FluentClientGenerator.kt | 391 +++++-------- .../IdempotencyTokenProviderCustomization.kt | 105 +--- .../config/ServiceConfigGenerator.kt | 292 ++++------ .../protocol/ProtocolTestGenerator.kt | 130 ++--- .../testutil/TestConfigCustomization.kt | 92 +-- .../codegen/client/testutil/TestHelpers.kt | 4 - .../customizations/ApiKeyAuthDecoratorTest.kt | 178 ------ .../HttpVersionListGeneratorTest.kt | 188 ------ .../ClientContextConfigCustomizationTest.kt | 114 ++-- .../smithy/endpoint/EndpointsDecoratorTest.kt | 51 -- .../generators/EndpointTraitBindingsTest.kt | 62 +- .../client/FluentClientGeneratorTest.kt | 16 +- ...empotencyTokenProviderCustomizationTest.kt | 13 +- .../config/ServiceConfigGeneratorTest.kt | 152 ++--- .../ProtocolTestGeneratorMiddlewareTest.kt | 231 -------- .../protocols/AwsQueryCompatibleTest.kt | 143 ----- tools/ci-scripts/check-aws-sdk-adhoc-tests | 9 +- .../ci-scripts/check-aws-sdk-middleware-impl | 27 - .../check-client-codegen-integration-tests | 4 +- 87 files changed, 1702 insertions(+), 4547 deletions(-) delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt delete mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt delete mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt delete mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt delete mode 100755 tools/ci-scripts/check-aws-sdk-middleware-impl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4208b271ac..cf77376937f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,9 +84,6 @@ jobs: test: - action: check-aws-sdk-adhoc-tests runner: ubuntu-latest - # TODO(enableNewSmithyRuntimeCleanup): Remove `check-aws-sdk-middleware-impl` when cleaning up middleware - - action: check-aws-sdk-middleware-impl - runner: smithy_ubuntu-latest_8-core - action: check-client-codegen-integration-tests runner: smithy_ubuntu-latest_8-core - action: check-client-codegen-unit-tests diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 1deffdbe164..18fc00e46aa 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -792,7 +792,7 @@ mod loader { assert_eq!(Some(&app_name), conf.app_name()); } - #[cfg(all(not(aws_sdk_middleware_mode), feature = "rustls"))] + #[cfg(feature = "rustls")] #[tokio::test] async fn disable_default_credentials() { let config = from_env().no_credentials().load().await; diff --git a/aws/sdk-adhoc-test/build.gradle.kts b/aws/sdk-adhoc-test/build.gradle.kts index 2e09902e5dc..907c8f9b873 100644 --- a/aws/sdk-adhoc-test/build.gradle.kts +++ b/aws/sdk-adhoc-test/build.gradle.kts @@ -37,8 +37,6 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") } -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" - val allCodegenTests = listOf( CodegenTest( "com.amazonaws.apigateway#BackplaneControlService", @@ -47,8 +45,7 @@ val allCodegenTests = listOf( extraConfig = """ , "codegen": { - "includeFluentClient": false, - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}" + "includeFluentClient": false }, "customizationConfig": { "awsSdk": { @@ -64,8 +61,7 @@ val allCodegenTests = listOf( extraConfig = """ , "codegen": { - "includeFluentClient": false, - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}" + "includeFluentClient": false }, "customizationConfig": { "awsSdk": { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt index 952cb35e607..88524efefa1 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt @@ -46,7 +46,6 @@ val DECORATORS: List = listOf( ServiceConfigDecorator(), AwsPresigningDecorator(), AwsCrateDocsDecorator(), - HttpConnectorDecorator(), AwsEndpointsStdLib(), *PromotedBuiltInsDecorators, GenericSmithySdkConfigSettings(), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 30340e61cca..21024e3a798 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -13,7 +13,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.client.Fluen import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection import software.amazon.smithy.rust.codegen.client.smithy.generators.client.NoClientGenerics -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.renderCustomizableOperationSend import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.DefaultProtocolTestGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ProtocolTestGenerator import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -30,7 +29,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault -import software.amazon.smithy.rustsdk.AwsRuntimeType.defaultMiddleware private class Types(runtimeConfig: RuntimeConfig) { private val smithyClient = RuntimeType.smithyClient(runtimeConfig) @@ -69,9 +67,6 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { ), retryClassifier = AwsRuntimeType.awsHttp(runtimeConfig).resolve("retry::AwsResponseRetryClassifier"), ).render(rustCrate, listOf(CustomizableOperationTestHelpers(runtimeConfig))) - rustCrate.withModule(ClientRustModule.Client.customize) { - renderCustomizableOperationSend(codegenContext, generics, this) - } rustCrate.withModule(ClientRustModule.client) { AwsFluentClientExtensions(codegenContext, types).render(this) } @@ -103,21 +98,11 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { baseGenerator.protocolSupport, baseGenerator.operationShape, renderClientCreation = { params -> - rust("let mut ${params.configBuilderName} = ${params.configBuilderName};") - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rust("""${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1")));""") - } else { - rust( - """ - // If the test case was missing endpoint parameters, default a region so it doesn't fail - if ${params.configBuilderName}.region.is_none() { - ${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1"))); - } - """, - ) - } rustTemplate( """ + let mut ${params.configBuilderName} = ${params.configBuilderName}; + ${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1"))); + let config = ${params.configBuilderName}.http_connector(${params.connectorName}).build(); let ${params.clientName} = #{Client}::from_conf(config); """, @@ -160,69 +145,6 @@ private class AwsFluentClientExtensions(private val codegenContext: ClientCodege """, *codegenScope, ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - /// Creates a new client from the service [`Config`](crate::Config). - /// - /// ## Panics - /// - /// - This method will panic if the `conf` is missing an async sleep implementation. If you experience this panic, set - /// the `sleep_impl` on the Config passed into this function to fix it. - /// - This method will panic if the `conf` is missing an HTTP connector. If you experience this panic, set the - /// `http_connector` on the Config passed into this function to fix it. - pub fn from_conf(conf: crate::Config) -> Self { - let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); - let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); - let sleep_impl = conf.sleep_impl(); - if (retry_config.has_retry() || timeout_config.has_timeouts()) && sleep_impl.is_none() { - panic!("An async sleep implementation is required for retries or timeouts to work. \ - Set the `sleep_impl` on the Config passed into this function to fix this panic."); - } - - let connector = conf.http_connector().and_then(|c| { - let timeout_config = conf - .timeout_config() - .cloned() - .unwrap_or_else(#{TimeoutConfig}::disabled); - let connector_settings = #{ConnectorSettings}::from_timeout_config( - &timeout_config, - ); - c.connector(&connector_settings, conf.sleep_impl()) - }); - - let builder = #{SmithyClientBuilder}::new(); - - let builder = match connector { - // Use provided connector - Some(c) => builder.connector(c), - None =>{ - ##[cfg(feature = "rustls")] - { - // Use default connector based on enabled features - builder.dyn_https_connector(#{ConnectorSettings}::from_timeout_config(&timeout_config)) - } - ##[cfg(not(feature = "rustls"))] - { - panic!("No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this."); - } - } - }; - let mut builder = builder - .middleware(#{DynMiddleware}::new(#{Middleware}::new())) - .reconnect_mode(retry_config.reconnect_mode()) - .retry_config(retry_config.into()) - .operation_timeout_config(timeout_config.into()); - builder.set_sleep_impl(sleep_impl); - let client = builder.build(); - - Self { handle: #{Arc}::new(Handle { client, conf }) } - } - """, - *codegenScope, - "Middleware" to codegenContext.runtimeConfig.defaultMiddleware(), - ) - } } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index e0a2df817ff..5c6f0ff91fe 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -100,18 +100,6 @@ class AwsPresigningDecorator internal constructor( override val name: String = "AwsPresigning" override val order: Byte = ORDER - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return if (codegenContext.smithyRuntimeMode.generateMiddleware) { - baseCustomizations + AwsInputPresignedMethod(codegenContext, operation) - } else { - baseCustomizations - } - } - /** * Adds presignable trait to known presignable operations and creates synthetic presignable shapes for codegen */ @@ -286,31 +274,14 @@ class AwsPresignedFluentBuilderMethod( """, *codegenScope, "OpError" to section.operationErrorType, - "RawResponseType" to if (codegenContext.smithyRuntimeMode.generateMiddleware) { - RuntimeType.smithyHttp(runtimeConfig).resolve("operation::Response") - } else { - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse") - }, + "RawResponseType" to + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), ) { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - renderPresignedMethodBodyMiddleware() - } else { - renderPresignedMethodBody(section) - } + renderPresignedMethodBody(section) } } } - private fun RustWriter.renderPresignedMethodBodyMiddleware() { - rustTemplate( - """ - let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; - input.presigned(&self.handle.conf, presigning_config).await - """, - *codegenScope, - ) - } - private fun RustWriter.renderPresignedMethodBody(section: FluentClientSection.FluentBuilderImpl) { val presignableOp = PRESIGNABLE_OPERATIONS.getValue(section.operationShape.id) val operationShape = if (presignableOp.hasModelTransforms()) { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index c25001cb303..5188228b75f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -53,7 +53,6 @@ class CredentialsCacheDecorator : ClientCodegenDecorator { */ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("cache::CredentialsCache"), @@ -65,44 +64,18 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.ConfigStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate( - """pub(crate) credentials_cache: #{SharedCredentialsCache},""", - *codegenScope, - ) - } - } - ServiceConfig.ConfigImpl -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Returns the credentials cache. - pub fn credentials_cache(&self) -> #{Option}<#{SharedCredentialsCache}> { - self.config.load::<#{SharedCredentialsCache}>().cloned() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the credentials cache. - pub fn credentials_cache(&self) -> #{SharedCredentialsCache} { - self.credentials_cache.clone() - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Returns the credentials cache. + pub fn credentials_cache(&self) -> #{Option}<#{SharedCredentialsCache}> { + self.config.load::<#{SharedCredentialsCache}>().cloned() + } + """, + *codegenScope, + ) } - ServiceConfig.BuilderStruct -> - if (runtimeMode.generateMiddleware) { - rustTemplate("credentials_cache: #{Option}<#{CredentialsCache}>,", *codegenScope) - } - ServiceConfig.BuilderImpl -> { rustTemplate( """ @@ -116,61 +89,25 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn set_credentials_cache(&mut self, credentials_cache: #{Option}<#{CredentialsCache}>) -> &mut Self { - self.config.store_or_unset(credentials_cache); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn set_credentials_cache(&mut self, credentials_cache: Option<#{CredentialsCache}>) -> &mut Self { - self.credentials_cache = credentials_cache; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the credentials cache for this service + pub fn set_credentials_cache(&mut self, credentials_cache: #{Option}<#{CredentialsCache}>) -> &mut Self { + self.config.store_or_unset(credentials_cache); + self + } + """, + *codegenScope, + ) } ServiceConfig.BuilderBuild -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - if let Some(credentials_provider) = layer.load::<#{SharedCredentialsProvider}>().cloned() { - let cache_config = layer.load::<#{CredentialsCache}>().cloned() - .unwrap_or_else({ - let sleep = self.runtime_components.sleep_impl(); - || match sleep { - Some(sleep) => { - #{CredentialsCache}::lazy_builder() - .sleep(sleep) - .into_credentials_cache() - } - None => #{CredentialsCache}::lazy(), - } - }); - let shared_credentials_cache = cache_config.create_cache(credentials_provider); - layer.store_put(shared_credentials_cache); - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - credentials_cache: self - .credentials_cache + rustTemplate( + """ + if let Some(credentials_provider) = layer.load::<#{SharedCredentialsProvider}>().cloned() { + let cache_config = layer.load::<#{CredentialsCache}>().cloned() .unwrap_or_else({ - let sleep = self.sleep_impl.clone(); + let sleep = self.runtime_components.sleep_impl(); || match sleep { Some(sleep) => { #{CredentialsCache}::lazy_builder() @@ -179,16 +116,13 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom } None => #{CredentialsCache}::lazy(), } - }) - .create_cache( - self.credentials_provider.unwrap_or_else(|| { - #{SharedCredentialsProvider}::new(#{DefaultProvider}) - }) - ), - """, - *codegenScope, - ) - } + }); + let shared_credentials_cache = cache_config.create_cache(credentials_provider); + layer.store_put(shared_credentials_cache); + } + """, + *codegenScope, + ) } is ServiceConfig.OperationConfigOverride -> { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 0437075d3ee..760d93ee116 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -23,7 +23,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.pre import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization -import software.amazon.smithy.rust.codegen.core.util.letIf class CredentialsProviderDecorator : ClientCodegenDecorator { override val name: String = "CredentialsProvider" @@ -33,9 +32,7 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(CredentialsIdentityResolverRegistration(codegenContext)) - } + baseCustomizations + listOf(CredentialsIdentityResolverRegistration(codegenContext)) override fun configCustomizations( codegenContext: ClientCodegenContext, @@ -67,7 +64,6 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { * Add a `.credentials_provider` field and builder to the `Config` for a given service */ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { - private val smithyRuntimeMode = codegenContext.smithyRuntimeMode private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, @@ -79,11 +75,6 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.BuilderStruct -> { - if (smithyRuntimeMode.generateMiddleware) { - rustTemplate("credentials_provider: #{Option}<#{SharedCredentialsProvider}>,", *codegenScope) - } - } ServiceConfig.BuilderImpl -> { rustTemplate( """ @@ -96,29 +87,16 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus *codegenScope, ) - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sets the credentials provider for this service - pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.config.store_or_unset(credentials_provider); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the credentials provider for this service - pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.credentials_provider = credentials_provider; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the credentials provider for this service + pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { + self.config.store_or_unset(credentials_provider); + self + } + """, + *codegenScope, + ) } is ServiceConfig.DefaultForTests -> rustTemplate( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index e59eaa7bc8a..3427d63a779 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -141,19 +141,12 @@ fun decoratorForBuiltIn( override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? = when (parameter.builtIn) { builtIn.builtIn -> writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - val newtype = configParamNewtype(parameter, name, codegenContext.runtimeConfig) - val symbol = parameter.symbol().mapRustType { t -> t.stripOuter() } - rustTemplate( - """$configRef.#{load_from_service_config_layer}""", - "load_from_service_config_layer" to loadFromConfigBag(symbol.name, newtype), - ) - } else { - rust("$configRef.$name") - } - if (codegenContext.smithyRuntimeMode.generateMiddleware && parameter.type == ParameterType.STRING) { - rust(".clone()") - } + val newtype = configParamNewtype(parameter, name, codegenContext.runtimeConfig) + val symbol = parameter.symbol().mapRustType { t -> t.stripOuter() } + rustTemplate( + """$configRef.#{load_from_service_config_layer}""", + "load_from_service_config_layer" to loadFromConfigBag(symbol.name, newtype), + ) } else -> null diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt deleted file mode 100644 index d2d653e1b52..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.util.letIf - -// TODO(enableNewSmithyRuntimeCleanup): Delete this decorator since it's now in `codegen-client` -class HttpConnectorDecorator : ClientCodegenDecorator { - override val name: String = "HttpConnectorDecorator" - override val order: Byte = 0 - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateMiddleware) { - it + HttpConnectorConfigCustomization(codegenContext) - } -} - -class HttpConnectorConfigCustomization( - codegenContext: ClientCodegenContext, -) : ConfigCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode - private val moduleUseName = codegenContext.moduleUseName() - private val codegenScope = arrayOf( - *preludeScope, - "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), - ) - - override fun section(section: ServiceConfig): Writable { - return when (section) { - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } - } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.config.load::<#{HttpConnector}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.http_connector.as_ref() - } - """, - *codegenScope, - ) - } - } - is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } - } - ServiceConfig.BuilderImpl -> writable { - rustTemplate( - """ - /// Sets the HTTP connector to use when making requests. - /// - /// ## Examples - /// ```no_run - /// ## ##[cfg(test)] - /// ## mod tests { - /// ## ##[test] - /// ## fn example() { - /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use $moduleUseName::config::Config; - /// - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .enable_http2() - /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// ## } - /// ## } - /// ``` - pub fn http_connector(mut self, http_connector: impl Into<#{HttpConnector}>) -> Self { - self.set_http_connector(#{Some}(http_connector)); - self - } - - /// Sets the HTTP connector to use when making requests. - /// - /// ## Examples - /// ```no_run - /// ## ##[cfg(test)] - /// ## mod tests { - /// ## ##[test] - /// ## fn example() { - /// use std::time::Duration; - /// use aws_smithy_client::hyper_ext; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use crate::sdk_config::{SdkConfig, Builder}; - /// use $moduleUseName::config::{Builder, Config}; - /// - /// fn override_http_connector(builder: &mut Builder) { - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .enable_http2() - /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// builder.set_http_connector(Some(smithy_connector)); - /// } - /// - /// let mut builder = $moduleUseName::Config::builder(); - /// override_http_connector(&mut builder); - /// let config = builder.build(); - /// ## } - /// ## } - /// ``` - """, - *codegenScope, - ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: #{Option}>) -> &mut Self { - http_connector.map(|c| self.config.store_put(c.into())); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: #{Option}>) -> &mut Self { - self.http_connector = http_connector.map(|inner| inner.into()); - self - } - """, - *codegenScope, - ) - } - } - is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateMiddleware) { - rust("http_connector: self.http_connector,") - } - } - else -> emptySection - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index 3cee565e64d..95553d80064 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -27,6 +27,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Compani import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingAppender import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingSubscriber import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyProtocolTestHelpers import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntime import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApi import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope @@ -87,21 +88,18 @@ class IntegrationTestDependencies( .copy(features = setOf("test-util", "wiremock"), scope = DependencyScope.Dev) val smithyTypes = CargoDependency.smithyTypes(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) + addDependency(awsRuntime(runtimeConfig).toDevDependency().withFeature("test-util")) + addDependency(FuturesUtil) + addDependency(SerdeJson) addDependency(smithyAsync) addDependency(smithyClient) + addDependency(smithyProtocolTestHelpers(codegenContext.runtimeConfig)) + addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) + addDependency(smithyRuntimeApi(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) addDependency(smithyTypes) - addDependency(CargoDependency.smithyProtocolTestHelpers(codegenContext.runtimeConfig)) - addDependency(SerdeJson) addDependency(Tokio) - addDependency(FuturesUtil) addDependency(Tracing.toDevDependency()) addDependency(TracingSubscriber) - - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) - addDependency(smithyRuntimeApi(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) - addDependency(awsRuntime(runtimeConfig).toDevDependency().withFeature("test-util")) - } } if (hasBenches) { addDependency(Criterion) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt index 1fdbfcb06fb..797203039f9 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt @@ -16,7 +16,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.util.letIf class InvocationIdDecorator : ClientCodegenDecorator { override val name: String get() = "InvocationIdDecorator" @@ -26,17 +25,13 @@ class InvocationIdDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(InvocationIdRuntimePluginCustomization(codegenContext)) - } + baseCustomizations + InvocationIdRuntimePluginCustomization(codegenContext) override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(InvocationIdConfigCustomization(codegenContext)) - } + baseCustomizations + InvocationIdConfigCustomization(codegenContext) } private class InvocationIdRuntimePluginCustomization( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt index 56092dab81e..bb7d13625cb 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRunti import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.letIf class RecursionDetectionDecorator : ClientCodegenDecorator { override val name: String get() = "RecursionDetectionDecorator" @@ -22,9 +21,7 @@ class RecursionDetectionDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(RecursionDetectionRuntimePluginCustomization(codegenContext)) - } + baseCustomizations + RecursionDetectionRuntimePluginCustomization(codegenContext) } private class RecursionDetectionRuntimePluginCustomization( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index 5dacc952bdd..d8a5fc70525 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -131,14 +131,10 @@ class RegionDecorator : ClientCodegenDecorator { override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { return when (parameter.builtIn) { Builtins.REGION.builtIn -> writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", - "Region" to region(codegenContext.runtimeConfig).resolve("Region"), - ) - } else { - rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") - } + rustTemplate( + "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", + "Region" to region(codegenContext.runtimeConfig).resolve("Region"), + ) } else -> null } @@ -163,46 +159,22 @@ class RegionDecorator : ClientCodegenDecorator { class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val region = region(codegenContext.runtimeConfig) private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, "Region" to region.resolve("Region"), ) override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.ConfigStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) - } - } ServiceConfig.ConfigImpl -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Returns the AWS region, if it was provided. - pub fn region(&self) -> #{Option}<&#{Region}> { - self.config.load::<#{Region}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the AWS region, if it was provided. - pub fn region(&self) -> #{Option}<&#{Region}> { - self.region.as_ref() - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) - } + rustTemplate( + """ + /// Returns the AWS region, if it was provided. + pub fn region(&self) -> #{Option}<&#{Region}> { + self.config.load::<#{Region}>() + } + """, + *codegenScope, + ) } ServiceConfig.BuilderImpl -> { @@ -227,35 +199,16 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sets the AWS region to use when making requests. - pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { - self.config.store_or_unset(region); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the AWS region to use when making requests. - pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { - self.region = region; - self - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderBuild -> { - if (runtimeMode.generateMiddleware) { - rust("region: self.region,") - } + rustTemplate( + """ + /// Sets the AWS region to use when making requests. + pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { + self.config.store_or_unset(region); + self + } + """, + *codegenScope, + ) } else -> emptySection diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt index 16f0644496d..e60fe986152 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt @@ -15,7 +15,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.letIf class RetryClassifierDecorator : ClientCodegenDecorator { override val name: String = "RetryPolicy" @@ -25,13 +24,9 @@ class RetryClassifierDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, operation: OperationShape, baseCustomizations: List, - ): List = - (baseCustomizations + RetryClassifierFeature(codegenContext.runtimeConfig)).letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + OperationRetryClassifiersFeature( - codegenContext, - operation, - ) - } + ): List = baseCustomizations + + RetryClassifierFeature(codegenContext.runtimeConfig) + + OperationRetryClassifiersFeature(codegenContext, operation) } class RetryClassifierFeature(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt index e3d9fb2176a..1d9f949e450 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRunti import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.letIf class RetryInformationHeaderDecorator : ClientCodegenDecorator { override val name: String = "RetryInformationHeader" @@ -22,9 +21,7 @@ class RetryInformationHeaderDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AddRetryInformationHeaderInterceptors(codegenContext)) - } + baseCustomizations + listOf(AddRetryInformationHeaderInterceptors(codegenContext)) } private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodegenContext) : diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 279626e508d..9757fae2dfe 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -24,7 +24,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.isInputEventStream -import software.amazon.smithy.rust.codegen.core.util.letIf class SigV4AuthDecorator : ClientCodegenDecorator { override val name: String get() = "SigV4AuthDecorator" @@ -34,32 +33,25 @@ class SigV4AuthDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, operationShape: OperationShape, baseAuthSchemeOptions: List, - ): List = baseAuthSchemeOptions.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + AuthSchemeOption.StaticAuthSchemeOption(SigV4Trait.ID) { - rustTemplate( - "#{scheme_id},", - "scheme_id" to AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - ) - } + ): List = baseAuthSchemeOptions + AuthSchemeOption.StaticAuthSchemeOption(SigV4Trait.ID) { + rustTemplate( + "#{scheme_id},", + "scheme_id" to AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) + .resolve("auth::sigv4::SCHEME_ID"), + ) } override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AuthServiceRuntimePluginCustomization(codegenContext)) - } + baseCustomizations + AuthServiceRuntimePluginCustomization(codegenContext) override fun operationCustomizations( codegenContext: ClientCodegenContext, operation: OperationShape, baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AuthOperationCustomization(codegenContext)) - } + ): List = baseCustomizations + AuthOperationCustomization(codegenContext) } private class AuthServiceRuntimePluginCustomization(private val codegenContext: ClientCodegenContext) : diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt index c7ba6f9c60e..8b7ee5dbcf5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt @@ -14,7 +14,6 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection @@ -55,7 +54,6 @@ class SigV4SigningDecorator : ClientCodegenDecorator { return baseCustomizations.extendIf(applies(codegenContext)) { SigV4SigningConfig( codegenContext.runtimeConfig, - codegenContext.smithyRuntimeMode, codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model), codegenContext.serviceShape.expectTrait(), ) @@ -80,7 +78,6 @@ class SigV4SigningDecorator : ClientCodegenDecorator { class SigV4SigningConfig( private val runtimeConfig: RuntimeConfig, - private val runtimeMode: SmithyRuntimeMode, private val serviceHasEventStream: Boolean, private val sigV4Trait: SigV4Trait, ) : ConfigCustomization() { @@ -93,10 +90,6 @@ class SigV4SigningConfig( override fun section(section: ServiceConfig): Writable = writable { when (section) { ServiceConfig.ConfigImpl -> { - if (runtimeMode.generateMiddleware && serviceHasEventStream) { - // enable the aws-sig-auth `sign-eventstream` feature - addDependency(AwsRuntimeType.awsSigAuthEventStream(runtimeConfig).toSymbol()) - } rust( """ /// The signature version 4 service signing name to use in the credential scope when signing requests. @@ -110,15 +103,13 @@ class SigV4SigningConfig( ) } ServiceConfig.BuilderBuild -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - layer.store_put(#{SigningService}::from_static(${sigV4Trait.name.dq()})); - layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); - """, - *codegenScope, - ) - } + rustTemplate( + """ + layer.store_put(#{SigningService}::from_static(${sigV4Trait.name.dq()})); + layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); + """, + *codegenScope, + ) } else -> emptySection diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index bd38c4f7ed2..a5f2c7003fb 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -27,7 +27,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomizat import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.expectTrait -import software.amazon.smithy.rust.codegen.core.util.letIf /** * Inserts a UserAgent configuration into the operation @@ -55,9 +54,7 @@ class UserAgentDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AddApiMetadataIntoConfigBag(codegenContext)) - } + baseCustomizations + AddApiMetadataIntoConfigBag(codegenContext) override fun extraSections(codegenContext: ClientCodegenContext): List { return listOf( @@ -145,7 +142,6 @@ class UserAgentDecorator : ClientCodegenDecorator { private class AppNameCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, "AppName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("app_name::AppName"), @@ -153,12 +149,6 @@ class UserAgentDecorator : ClientCodegenDecorator { override fun section(section: ServiceConfig): Writable = when (section) { - is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("app_name: #{Option}<#{AppName}>,", *codegenScope) - } - } - is ServiceConfig.BuilderImpl -> writable { rustTemplate( """ @@ -174,79 +164,38 @@ class UserAgentDecorator : ClientCodegenDecorator { *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sets the name of the app that is using the client. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { - self.config.store_or_unset(app_name); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the name of the app that is using the client. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { - self.app_name = app_name; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the name of the app that is using the client. + /// + /// This _optional_ name is used to identify the application in the user agent that + /// gets sent along with requests. + pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { + self.config.store_or_unset(app_name); + self + } + """, + *codegenScope, + ) } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateOrchestrator) { - rust("layer.store_put(#T.clone());", ClientRustModule.Meta.toType().resolve("API_METADATA")) - } else { - rust("app_name: self.app_name,") - } - } - - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("app_name: #{Option}<#{AppName}>,", *codegenScope) - } + rust("layer.store_put(#T.clone());", ClientRustModule.Meta.toType().resolve("API_METADATA")) } is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Returns the name of the app that is using the client, if it was provided. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn app_name(&self) -> #{Option}<&#{AppName}> { - self.config.load::<#{AppName}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the name of the app that is using the client, if it was provided. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn app_name(&self) -> #{Option}<&#{AppName}> { - self.app_name.as_ref() - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Returns the name of the app that is using the client, if it was provided. + /// + /// This _optional_ name is used to identify the application in the user agent that + /// gets sent along with requests. + pub fn app_name(&self) -> #{Option}<&#{AppName}> { + self.config.load::<#{AppName}>() + } + """, + *codegenScope, + ) } else -> emptySection diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt index 98a37d778c6..4dfc75c30be 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rustsdk.customize import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ServiceShape -import software.amazon.smithy.model.traits.AuthTrait import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings @@ -16,7 +15,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegen import software.amazon.smithy.rust.codegen.core.util.shapeId // / STS (and possibly other services) need to have auth manually set to [] -class DisabledAuthDecorator() : ClientCodegenDecorator { +class DisabledAuthDecorator : ClientCodegenDecorator { override val name: String = "OptionalAuth" override val order: Byte = 0 @@ -39,14 +38,7 @@ class DisabledAuthDecorator() : ClientCodegenDecorator { val optionalOperations = optionalAuth[service.id]!! return ModelTransformer.create().mapShapes(model) { if (optionalOperations.contains(it.id) && it is OperationShape) { - if (settings.codegenConfig.enableNewSmithyRuntime.generateOrchestrator) { - it.toBuilder().addTrait(OptionalAuthTrait()).build() - } else { - // In middleware, having an empty @auth trait completely disabled - // auth for an operation since not having credentials isn't an option - // in that implementation. - it.toBuilder().addTrait(AuthTrait(setOf())).build() - } + it.toBuilder().addTrait(OptionalAuthTrait()).build() } else { it } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt index 05087534b7b..c58fb0c20af 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt @@ -5,62 +5,26 @@ package software.amazon.smithy.rustsdk.customize.apigateway -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.InlineAwsDependency class ApiGatewayDecorator : ClientCodegenDecorator { override val name: String = "ApiGateway" override val order: Byte = 0 - // TODO(enableNewSmithyRuntimeCleanup): Delete when cleaning up middleware - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateMiddleware) { - it + ApiGatewayAddAcceptHeader() - } - override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + ApiGatewayAcceptHeaderInterceptorCustomization(codegenContext) - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete when cleaning up middleware -private class ApiGatewayAddAcceptHeader : OperationCustomization() { - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.FinalizeOperation -> emptySection - is OperationSection.OperationImplBlock -> emptySection - is OperationSection.MutateRequest -> writable { - rust( - """${section.request} - .http_mut() - .headers_mut() - .insert("Accept", #T::HeaderValue::from_static("application/json"));""", - RuntimeType.Http, - ) - } - - else -> emptySection - } + baseCustomizations + ApiGatewayAcceptHeaderInterceptorCustomization(codegenContext) } private class ApiGatewayAcceptHeaderInterceptorCustomization(private val codegenContext: ClientCodegenContext) : diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt index ee3f18c175f..847eef9eac7 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt @@ -25,7 +25,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSecti import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.AwsCargoDependency import software.amazon.smithy.rustsdk.InlineAwsDependency @@ -49,32 +48,17 @@ class GlacierDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, operation: OperationShape, baseCustomizations: List, - ): List { - return if (codegenContext.smithyRuntimeMode.generateMiddleware) { - baseCustomizations + listOfNotNull( - ApiVersionHeader(codegenContext.serviceShape.version), - TreeHashHeader.forOperation(operation, codegenContext.runtimeConfig), - AccountIdAutofill.forOperation(operation, codegenContext.model), - ) - } else { - baseCustomizations + GlacierOperationInterceptorsCustomization(codegenContext) - } - } + ): List = baseCustomizations + GlacierOperationInterceptorsCustomization(codegenContext) override fun structureCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(GlacierAccountIdCustomization(codegenContext)) - } + ): List = baseCustomizations + GlacierAccountIdCustomization(codegenContext) override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(GlacierApiVersionCustomization(codegenContext)) - } + ): List = baseCustomizations + GlacierApiVersionCustomization(codegenContext) } /** Implements the `GlacierAccountId` trait for inputs that have an `account_id` field */ diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 57c033421cd..d274c5b1838 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -18,7 +18,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization -import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.AwsCargoDependency import software.amazon.smithy.rustsdk.DocSection import software.amazon.smithy.rustsdk.InlineAwsDependency @@ -32,30 +31,20 @@ class TimestreamDecorator : ClientCodegenDecorator { override val name: String = "Timestream" override val order: Byte = -1 - private fun applies(codegenContext: ClientCodegenContext): Boolean = - codegenContext.smithyRuntimeMode.generateOrchestrator - - override fun extraSections(codegenContext: ClientCodegenContext): List = - emptyList().letIf(applies(codegenContext)) { - listOf( - adhocCustomization { - addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency()) - rustTemplate( - """ - let config = aws_config::load_from_env().await; - // You MUST call `with_endpoint_discovery_enabled` to produce a working client for this service. - let ${it.clientName} = ${it.crateName}::Client::new(&config).with_endpoint_discovery_enabled().await; - """.replaceIndent(it.indent), - ) - }, + override fun extraSections(codegenContext: ClientCodegenContext): List = listOf( + adhocCustomization { + addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency()) + rustTemplate( + """ + let config = aws_config::load_from_env().await; + // You MUST call `with_endpoint_discovery_enabled` to produce a working client for this service. + let ${it.clientName} = ${it.crateName}::Client::new(&config).with_endpoint_discovery_enabled().await; + """.replaceIndent(it.indent), ) - } + }, + ) override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - if (!applies(codegenContext)) { - return - } - val endpointDiscovery = InlineAwsDependency.forRustFile( "endpoint_discovery", Visibility.PUBLIC, diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt index b4056788532..87f832cc7ef 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt @@ -5,18 +5,13 @@ package software.amazon.smithy.rustsdk -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode +import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode internal class CredentialProviderConfigTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = awsTestCodegenContext().withSmithyRuntimeMode(smithyRuntimeMode) + @Test + fun `generates a valid config`() { + val codegenContext = awsTestCodegenContext() validateConfigCustomizations(codegenContext, CredentialProviderConfig(codegenContext)) } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt deleted file mode 100644 index ca5e087b967..00000000000 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace - -class HttpConnectorConfigCustomizationTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val project = TestWorkspace.testProject() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = awsTestCodegenContext().withSmithyRuntimeMode(smithyRuntimeMode) - validateConfigCustomizations(codegenContext, HttpConnectorConfigCustomization(codegenContext), project) - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt index 1160f322efc..b071b89945e 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt @@ -5,27 +5,22 @@ package software.amazon.smithy.rustsdk -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode +import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.rustSettings internal class RegionProviderConfigTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { + @Test + fun `generates a valid config`() { val project = TestWorkspace.testProject() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) val codegenContext = awsTestCodegenContext( settings = testClientRustSettings( moduleName = project.rustSettings().moduleName, runtimeConfig = AwsTestRuntimeConfig, ), - ).withSmithyRuntimeMode(smithyRuntimeMode) + ) validateConfigCustomizations(codegenContext, RegionProviderConfig(codegenContext), project) } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt index fae4da0386a..b205885f7dd 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt @@ -5,32 +5,26 @@ package software.amazon.smithy.rustsdk -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource +import org.junit.jupiter.api.Test import software.amazon.smithy.aws.traits.auth.SigV4Trait -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.testutil.stubConfigProject import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class SigV4SigningDecoratorTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) + @Test + fun `generates a valid config`() { val codegenContext = awsTestCodegenContext( settings = testClientRustSettings( runtimeConfig = AwsTestRuntimeConfig, ), - ).withSmithyRuntimeMode(smithyRuntimeMode) + ) val project = stubConfigProject( codegenContext, SigV4SigningConfig( codegenContext.runtimeConfig, - codegenContext.smithyRuntimeMode, true, SigV4Trait.builder().name("test-service").build(), ), diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 03e9bcfde5c..13c8a7e2212 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -61,7 +61,6 @@ val crateVersioner by lazy { aws.sdk.CrateVersioner.defaultFor(rootProject, prop fun getRustMSRV(): String = properties.get("rust.msrv") ?: throw Exception("Rust MSRV missing") fun getPreviousReleaseVersionManifestPath(): String? = properties.get("aws.sdk.previous.release.versions.manifest") -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" fun loadServiceMembership(): Membership { val membershipOverride = properties.get("aws.services")?.let { parseMembership(it) } @@ -105,7 +104,6 @@ fun generateSmithyBuild(services: AwsServices): String { "renameErrors": false, "debugMode": $debugMode, "eventStreamAllowList": [$eventStreamAllowListMembers], - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}", "enableUserConfigurableRuntimePlugins": false }, "service": "${service.service}", diff --git a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs index 6b83b189d52..58d3db07020 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs @@ -3,16 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sdk_dynamodb::operation::query::QueryOutput; +use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedResponseDeserializer}; use criterion::{criterion_group, criterion_main, Criterion}; fn do_bench() { - #[cfg(aws_sdk_middleware_mode)] - { - use aws_sdk_dynamodb::operation::query::Query; - use aws_smithy_http::response::ParseHttpResponse; - use bytes::Bytes; + use aws_sdk_dynamodb::operation::query::Query; + use bytes::Bytes; - let response = http::Response::builder() + let response = http::Response::builder() .header("server", "Server") .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") .header("content-type", "application/x-amz-json-1.0") @@ -21,13 +22,20 @@ fn do_bench() { .header("x-amzn-requestid", "A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG") .header("x-amz-crc32", "624725176") .status(http::StatusCode::from_u16(200).unwrap()) - .body(Bytes::copy_from_slice(br#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#)) + .body(SdkBody::from(Bytes::copy_from_slice(br#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#))) .unwrap(); - let parser = Query::new(); - let output = ::parse_loaded(&parser, &response).unwrap(); - assert_eq!(2, output.count); - } + let operation = Query::new(); + let config = operation.config().expect("operation should have config"); + let deserializer = config + .load::() + .expect("operation should set a deserializer"); + + let output = deserializer + .deserialize_nonstreaming(&response) + .expect("success"); + let output = output.downcast::().expect("correct type"); + assert_eq!(2, output.count); } fn bench_group(c: &mut Criterion) { diff --git a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs index f103c07c009..6bc0b8a273b 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs @@ -3,9 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_dynamodb::operation::put_item::PutItemInput; +use aws_sdk_dynamodb::operation::put_item::{PutItem, PutItemInput}; use aws_sdk_dynamodb::types::AttributeValue; -use aws_sdk_dynamodb::Config; +use aws_smithy_runtime_api::client::interceptors::context::Input; +use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{RequestSerializer, SharedRequestSerializer}; +use aws_smithy_types::config_bag::ConfigBag; use criterion::{criterion_group, criterion_main, Criterion}; macro_rules! attr_s { @@ -33,25 +36,24 @@ macro_rules! attr_obj { }; } -fn do_bench(_config: &Config, _input: &PutItemInput) { - #[cfg(aws_sdk_middleware_mode)] - { - use futures_util::FutureExt; +fn do_bench(input: &PutItemInput) { + let operation = PutItem::new(); + let config = operation.config().expect("operation should have config"); + let serializer = config + .load::() + .expect("operation should set a serializer"); + let mut config_bag = ConfigBag::base(); + let input = Input::erase(input.clone()); - let operation = _input - .make_operation(&_config) - .now_or_never() - .unwrap() - .expect("operation failed to build"); - let (http_request, _parts) = operation.into_request_response().0.into_parts(); - let body = http_request.body().bytes().unwrap(); - assert_eq!(body[0], b'{'); - } + let request = serializer + .serialize_input(input, &mut config_bag) + .expect("success"); + let body = request.body().bytes().unwrap(); + assert_eq!(body[0], b'{'); } fn bench_group(c: &mut Criterion) { c.bench_function("serialization_bench", |b| { - let config = Config::builder().build(); let input = PutItemInput::builder() .table_name("Movies-5") .set_item(Some( @@ -73,7 +75,7 @@ fn bench_group(c: &mut Criterion) { )) .build() .expect("valid input"); - b.iter(|| do_bench(&config, &input)) + b.iter(|| do_bench(&input)) }); } diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index 162c1fc50b5..f811d8cf243 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -3,156 +3,153 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_middleware_mode))] -mod test { - use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; - use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; - use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_client::test_connection::TestConnection; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime::client::retries::RetryPartition; - use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; - use std::time::{Duration, SystemTime}; - - fn req() -> HttpRequest { - http::Request::builder() - .body(SdkBody::from("request body")) - .unwrap() - } - - fn ok() -> HttpResponse { - http::Response::builder() - .status(200) - .header("server", "Server") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "23") - .header("connection", "keep-alive") - .header("x-amz-crc32", "2335643545") - .body(SdkBody::from("{ \"TableNames\": [ \"Test\" ] }")) - .unwrap() - } - - fn err() -> HttpResponse { - http::Response::builder() - .status(500) - .body(SdkBody::from("{ \"message\": \"The request has failed because of an unknown error, exception or failure.\", \"code\": \"InternalServerError\" }")) - .unwrap() - } - - fn throttling_err() -> HttpResponse { - http::Response::builder() - .status(400) - .body(SdkBody::from("{ \"message\": \"The request was denied due to request throttling.\", \"code\": \"ThrottlingException\" }")) - .unwrap() - } - - #[tokio::test] - async fn test_adaptive_retries_with_no_throttling_errors() { - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - - let events = vec![ - // First operation - (req(), err()), - (req(), err()), - (req(), ok()), - // Second operation - (req(), err()), - (req(), ok()), - // Third operation will fail, only errors - (req(), err()), - (req(), err()), - (req(), err()), - (req(), err()), - ]; - - let conn = TestConnection::new(events); - let config = aws_sdk_dynamodb::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .retry_config( - RetryConfig::adaptive() - .with_max_attempts(4) - .with_use_static_exponential_base(true), - ) - .time_source(SharedTimeSource::new(time_source)) - .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) - .retry_partition(RetryPartition::new( - "test_adaptive_retries_with_no_throttling_errors", - )) - .http_connector(conn.clone()) - .build(); - let expected_table_names = vec!["Test".to_owned()]; - - // We create a new client each time to ensure that the cross-client retry state is working. - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Three requests should have been made, two failing & one success - assert_eq!(conn.requests().len(), 3); - - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Two requests should have been made, one failing & one success (plus previous requests) - assert_eq!(conn.requests().len(), 5); - - let client = aws_sdk_dynamodb::Client::from_conf(config); - let err = client.list_tables().send().await.unwrap_err(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1 + 7),); - assert_eq!(err.code(), Some("InternalServerError")); - // four requests should have been made, all failing (plus previous requests) - assert_eq!(conn.requests().len(), 9); - } - - #[tokio::test] - async fn test_adaptive_retries_with_throttling_errors() { - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - - let events = vec![ - // First operation - (req(), throttling_err()), - (req(), throttling_err()), - (req(), ok()), - // Second operation - (req(), err()), - (req(), ok()), - ]; - - let conn = TestConnection::new(events); - let config = aws_sdk_dynamodb::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .retry_config( - RetryConfig::adaptive() - .with_max_attempts(4) - .with_use_static_exponential_base(true), - ) - .time_source(SharedTimeSource::new(time_source)) - .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) - .retry_partition(RetryPartition::new( - "test_adaptive_retries_with_throttling_errors", - )) - .http_connector(conn.clone()) - .build(); - let expected_table_names = vec!["Test".to_owned()]; - - // We create a new client each time to ensure that the cross-client retry state is working. - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Three requests should have been made, two failing & one success - assert_eq!(conn.requests().len(), 3); - - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert!(Duration::from_secs(48) < sleep_impl.total_duration()); - assert!(Duration::from_secs(49) > sleep_impl.total_duration()); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Two requests should have been made, one failing & one success (plus previous requests) - assert_eq!(conn.requests().len(), 5); - } +use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; +use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; +use aws_smithy_async::test_util::instant_time_and_sleep; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_client::test_connection::TestConnection; +use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::retries::RetryPartition; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use std::time::{Duration, SystemTime}; + +fn req() -> HttpRequest { + http::Request::builder() + .body(SdkBody::from("request body")) + .unwrap() +} + +fn ok() -> HttpResponse { + http::Response::builder() + .status(200) + .header("server", "Server") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "23") + .header("connection", "keep-alive") + .header("x-amz-crc32", "2335643545") + .body(SdkBody::from("{ \"TableNames\": [ \"Test\" ] }")) + .unwrap() +} + +fn err() -> HttpResponse { + http::Response::builder() + .status(500) + .body(SdkBody::from("{ \"message\": \"The request has failed because of an unknown error, exception or failure.\", \"code\": \"InternalServerError\" }")) + .unwrap() +} + +fn throttling_err() -> HttpResponse { + http::Response::builder() + .status(400) + .body(SdkBody::from("{ \"message\": \"The request was denied due to request throttling.\", \"code\": \"ThrottlingException\" }")) + .unwrap() +} + +#[tokio::test] +async fn test_adaptive_retries_with_no_throttling_errors() { + let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); + + let events = vec![ + // First operation + (req(), err()), + (req(), err()), + (req(), ok()), + // Second operation + (req(), err()), + (req(), ok()), + // Third operation will fail, only errors + (req(), err()), + (req(), err()), + (req(), err()), + (req(), err()), + ]; + + let conn = TestConnection::new(events); + let config = aws_sdk_dynamodb::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .retry_config( + RetryConfig::adaptive() + .with_max_attempts(4) + .with_use_static_exponential_base(true), + ) + .time_source(SharedTimeSource::new(time_source)) + .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) + .retry_partition(RetryPartition::new( + "test_adaptive_retries_with_no_throttling_errors", + )) + .http_connector(conn.clone()) + .build(); + let expected_table_names = vec!["Test".to_owned()]; + + // We create a new client each time to ensure that the cross-client retry state is working. + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3)); + assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + // Three requests should have been made, two failing & one success + assert_eq!(conn.requests().len(), 3); + + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1)); + assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + // Two requests should have been made, one failing & one success (plus previous requests) + assert_eq!(conn.requests().len(), 5); + + let client = aws_sdk_dynamodb::Client::from_conf(config); + let err = client.list_tables().send().await.unwrap_err(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1 + 7),); + assert_eq!(err.code(), Some("InternalServerError")); + // four requests should have been made, all failing (plus previous requests) + assert_eq!(conn.requests().len(), 9); +} + +#[tokio::test] +async fn test_adaptive_retries_with_throttling_errors() { + let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); + + let events = vec![ + // First operation + (req(), throttling_err()), + (req(), throttling_err()), + (req(), ok()), + // Second operation + (req(), err()), + (req(), ok()), + ]; + + let conn = TestConnection::new(events); + let config = aws_sdk_dynamodb::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .retry_config( + RetryConfig::adaptive() + .with_max_attempts(4) + .with_use_static_exponential_base(true), + ) + .time_source(SharedTimeSource::new(time_source)) + .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) + .retry_partition(RetryPartition::new( + "test_adaptive_retries_with_throttling_errors", + )) + .http_connector(conn.clone()) + .build(); + let expected_table_names = vec!["Test".to_owned()]; + + // We create a new client each time to ensure that the cross-client retry state is working. + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40)); + assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + // Three requests should have been made, two failing & one success + assert_eq!(conn.requests().len(), 3); + + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert!(Duration::from_secs(48) < sleep_impl.total_duration()); + assert!(Duration::from_secs(49) > sleep_impl.total_duration()); + assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + // Two requests should have been made, one failing & one success (plus previous requests) + assert_eq!(conn.requests().len(), 5); } diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index ba9090837c8..5eee47d9d2e 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -3,144 +3,78 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(aws_sdk_middleware_mode)] -mod middleware_mode_tests { - use aws_http::retry::AwsResponseRetryClassifier; - use aws_sdk_kms as kms; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation::{self, Parts}; - use aws_smithy_http::response::ParseStrictResponse; - use aws_smithy_http::result::SdkError; - use aws_smithy_http::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, RetryKind}; - use bytes::Bytes; - use kms::operation::create_alias::{CreateAlias, CreateAliasInput}; +use aws_credential_types::Credentials; +use aws_runtime::retries::classifier::AwsErrorCodeClassifier; +use aws_sdk_kms as kms; +use aws_smithy_client::test_connection::infallible_connection_fn; +use aws_smithy_http::result::SdkError; +use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; +use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; +use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_types::retry::ErrorKind; +use bytes::Bytes; +use kms::operation::create_alias::CreateAliasError; - async fn create_alias_op() -> Parts { - let conf = kms::Config::builder().build(); - let (_, parts) = CreateAliasInput::builder() - .build() - .unwrap() - .make_operation(&conf) - .await - .expect("valid request") - .into_request_response(); - parts - } +async fn make_err( + response: impl Fn() -> http::Response + Send + Sync + 'static, +) -> SdkError { + let conn = infallible_connection_fn(move |_| response()); + let conf = kms::Config::builder() + .http_connector(conn) + .credentials_provider(Credentials::for_tests()) + .region(kms::config::Region::from_static("us-east-1")) + .build(); + let client = kms::Client::from_conf(conf); + client + .create_alias() + .send() + .await + .expect_err("response was a failure") +} - /// Parse a semi-real response body and assert that the correct retry status is returned - #[tokio::test] - async fn errors_are_retryable() { - let op = create_alias_op().await; - let http_response = http::Response::builder() +/// Parse a semi-real response body and assert that the correct retry status is returned +#[tokio::test] +async fn errors_are_retryable() { + let err = make_err(|| { + http::Response::builder() .status(400) .body(Bytes::from_static( br#"{ "code": "LimitExceededException" }"#, )) - .unwrap(); - let err = op.response_handler.parse(&http_response).map_err(|e| { - SdkError::service_error( - e, - operation::Response::new(http_response.map(SdkBody::from)), - ) - }); - let retry_kind = op.retry_classifier.classify_retry(err.as_ref()); - assert_eq!(retry_kind, RetryKind::Error(ErrorKind::ThrottlingError)); - } + .unwrap() + }) + .await; - #[tokio::test] - async fn unmodeled_errors_are_retryable() { - let op = create_alias_op().await; - let http_response = http::Response::builder() - .status(400) - .body(Bytes::from_static(br#"{ "code": "ThrottlingException" }"#)) - .unwrap(); - let err = op.response_handler.parse(&http_response).map_err(|e| { - SdkError::service_error( - e, - operation::Response::new(http_response.map(SdkBody::from)), - ) - }); - let retry_kind = op.retry_classifier.classify_retry(err.as_ref()); - assert_eq!(retry_kind, RetryKind::Error(ErrorKind::ThrottlingError)); - } + dbg!(&err); + let classifier = AwsErrorCodeClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + let err = err.into_service_error(); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); + let retry_kind = classifier.classify_retry(&ctx); + assert_eq!( + Some(RetryReason::Error(ErrorKind::ThrottlingError)), + retry_kind + ); } -#[cfg(not(aws_sdk_middleware_mode))] -mod orchestrator_mode_tests { - use aws_credential_types::Credentials; - use aws_runtime::retries::classifier::AwsErrorCodeClassifier; - use aws_sdk_kms as kms; - use aws_smithy_client::test_connection::infallible_connection_fn; - use aws_smithy_http::result::SdkError; - use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; - use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; - use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; - use aws_smithy_types::retry::ErrorKind; - use bytes::Bytes; - use kms::operation::create_alias::CreateAliasError; - - async fn make_err( - response: impl Fn() -> http::Response + Send + Sync + 'static, - ) -> SdkError { - let conn = infallible_connection_fn(move |_| response()); - let conf = kms::Config::builder() - .http_connector(conn) - .credentials_provider(Credentials::for_tests()) - .region(kms::config::Region::from_static("us-east-1")) - .build(); - let client = kms::Client::from_conf(conf); - client - .create_alias() - .send() - .await - .expect_err("response was a failure") - } - - /// Parse a semi-real response body and assert that the correct retry status is returned - #[tokio::test] - async fn errors_are_retryable() { - let err = make_err(|| { - http::Response::builder() - .status(400) - .body(Bytes::from_static( - br#"{ "code": "LimitExceededException" }"#, - )) - .unwrap() - }) - .await; - - dbg!(&err); - let classifier = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(Input::doesnt_matter()); - let err = err.into_service_error(); - ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); - let retry_kind = classifier.classify_retry(&ctx); - assert_eq!( - Some(RetryReason::Error(ErrorKind::ThrottlingError)), - retry_kind - ); - } - - #[tokio::test] - async fn unmodeled_errors_are_retryable() { - let err = make_err(|| { - http::Response::builder() - .status(400) - .body(Bytes::from_static(br#"{ "code": "ThrottlingException" }"#)) - .unwrap() - }) - .await; +#[tokio::test] +async fn unmodeled_errors_are_retryable() { + let err = make_err(|| { + http::Response::builder() + .status(400) + .body(Bytes::from_static(br#"{ "code": "ThrottlingException" }"#)) + .unwrap() + }) + .await; - dbg!(&err); - let classifier = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(Input::doesnt_matter()); - let err = err.into_service_error(); - ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); - let retry_kind = classifier.classify_retry(&ctx); - assert_eq!( - Some(RetryReason::Error(ErrorKind::ThrottlingError)), - retry_kind - ); - } + dbg!(&err); + let classifier = AwsErrorCodeClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + let err = err.into_service_error(); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); + let retry_kind = classifier.classify_retry(&ctx); + assert_eq!( + Some(RetryReason::Error(ErrorKind::ThrottlingError)), + retry_kind + ); } diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index 26d84c96f64..f90ca59fb16 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -18,7 +18,6 @@ async fn test_clients_from_sdk_config() { } // This will fail due to lack of a connector when constructing the service client -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn test_clients_from_service_config() { use aws_sdk_s3::config::Region; @@ -50,27 +49,3 @@ async fn test_clients_from_service_config() { "expected '{msg}' to contain 'No HTTP connector was available to send this request. Enable the `rustls` crate feature or set a connector to fix this.'" ); } - -// TODO(enableNewSmithyRuntimeMode): Remove this test (covered above for orchestrator) -// -// This will fail due to lack of a connector when constructing the service client -#[cfg(aws_sdk_middleware_mode)] -#[tokio::test] -#[should_panic( - expected = "No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this." -)] -async fn test_clients_from_service_config_middleware() { - #[derive(Clone, Debug)] - struct StubSleep; - impl AsyncSleep for StubSleep { - fn sleep(&self, _duration: Duration) -> Sleep { - todo!() - } - } - - let config = Config::builder() - .sleep_impl(SharedAsyncSleep::new(StubSleep {})) - .build(); - // This will panic due to the lack of an HTTP connector - aws_sdk_s3::Client::from_conf(config); -} diff --git a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs index 5c1d8969cd1..a83e9f38d9b 100644 --- a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs +++ b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs @@ -15,14 +15,12 @@ use aws_smithy_async::assert_elapsed; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; use aws_smithy_client::never::NeverConnector; use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::timeout::TimeoutConfig; use std::fmt::Debug; use std::time::{Duration, Instant}; -#[cfg(not(aws_sdk_middleware_mode))] -use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; - #[derive(Debug)] struct SmolSleep; @@ -36,7 +34,6 @@ impl AsyncSleep for SmolSleep { #[test] fn test_smol_runtime_timeouts() { - #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = smol::block_on(async { timeout_test(SharedAsyncSleep::new(SmolSleep)).await }) @@ -48,7 +45,6 @@ fn test_smol_runtime_timeouts() { #[test] fn test_smol_runtime_retry() { - #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = smol::block_on(async { retry_test(SharedAsyncSleep::new(SmolSleep)).await }) { @@ -68,7 +64,6 @@ impl AsyncSleep for AsyncStdSleep { #[test] fn test_async_std_runtime_timeouts() { - #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = async_std::task::block_on(async { @@ -81,7 +76,6 @@ fn test_async_std_runtime_timeouts() { #[test] fn test_async_std_runtime_retry() { - #[cfg(not(aws_sdk_middleware_mode))] let _guard = capture_test_logs(); if let Err(err) = diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index 620b6405fa4..28092f37ce4 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -9,9 +9,6 @@ use aws_sdk_s3::Client; use aws_smithy_client::test_connection::{capture_request, CaptureRequestReceiver}; use aws_types::SdkConfig; -// TODO(enableNewSmithyRuntimeCleanup): Remove this attribute once #[cfg(aws_sdk_middleware_mode)] -// has been removed -#[allow(dead_code)] fn test_client() -> (CaptureRequestReceiver, Client) { let (conn, captured_request) = capture_request(None); let sdk_config = SdkConfig::builder() @@ -23,7 +20,6 @@ fn test_client() -> (CaptureRequestReceiver, Client) { (captured_request, client) } -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_force_path_style() { let (captured_request, client) = test_client(); @@ -42,7 +38,6 @@ async fn operation_overrides_force_path_style() { ); } -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_fips() { let (captured_request, client) = test_client(); @@ -61,7 +56,6 @@ async fn operation_overrides_fips() { ); } -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_dual_stack() { let (captured_request, client) = test_client(); @@ -84,7 +78,6 @@ async fn operation_overrides_dual_stack() { // accessed in ServiceRuntimePlugin::config. Currently, a credentials cache created for a single // operation invocation is not picked up by an identity resolver. /* -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn operation_overrides_credentials_provider() { let (captured_request, client) = test_client(); diff --git a/aws/sdk/integration-tests/s3/tests/config_to_builder.rs b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs index af899ee2f60..fb33ffe130c 100644 --- a/aws/sdk/integration-tests/s3/tests/config_to_builder.rs +++ b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn test_config_to_builder() { use aws_sdk_s3::config::AppName; diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index 0479f94bc51..75e810e0bd3 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -62,7 +62,6 @@ async fn dual_stack() { ); } -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn multi_region_access_points() { let (_captured_request, client) = test_client(|b| b); @@ -84,24 +83,6 @@ async fn multi_region_access_points() { ); } -#[cfg(aws_sdk_middleware_mode)] -#[tokio::test] -async fn multi_region_access_points() { - let (_captured_request, client) = test_client(|b| b); - let response = client - .get_object() - .bucket("arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap") - .key("blah") - .send() - .await; - let error = response.expect_err("should fail—sigv4a is not supported"); - assert!( - dbg!(format!("{:?}", error)).contains("No auth schemes were supported"), - "message should contain the correct error, found: {:?}", - error - ); -} - #[tokio::test] async fn s3_object_lambda() { let (captured_request, client) = test_client(|b| b); diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs index be3caa493a2..825f895fac0 100644 --- a/aws/sdk/integration-tests/s3/tests/interceptors.rs +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -3,123 +3,120 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_middleware_mode))] -mod tests { - use aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextMut; - use aws_sdk_s3::config::{Credentials, Region}; - use aws_sdk_s3::Client; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::capture_request; - use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::interceptors::Interceptor; - use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; - use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; - use http::header::USER_AGENT; - use http::HeaderValue; +use aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextMut; +use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::Client; +use aws_smithy_client::erase::DynConnector; +use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; +use http::header::USER_AGENT; +use http::HeaderValue; - #[tokio::test] - async fn interceptor_priority() { - #[derive(Debug, Eq, PartialEq)] - struct TestValue(&'static str); - impl Storable for TestValue { - type Storer = StoreReplace; - } +#[tokio::test] +async fn interceptor_priority() { + #[derive(Debug, Eq, PartialEq)] + struct TestValue(&'static str); + impl Storable for TestValue { + type Storer = StoreReplace; + } - #[derive(Debug)] - struct TestInterceptor(&'static str); - impl Interceptor for TestInterceptor { - fn name(&self) -> &'static str { - "TestInterceptor" - } + #[derive(Debug)] + struct TestInterceptor(&'static str); + impl Interceptor for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } - fn modify_before_signing( - &self, - _context: &mut BeforeTransmitInterceptorContextMut<'_>, - _components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - let mut layer = Layer::new("test"); - layer.store_put(TestValue(self.0)); - cfg.push_layer(layer); - Ok(()) - } + fn modify_before_signing( + &self, + _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let mut layer = Layer::new("test"); + layer.store_put(TestValue(self.0)); + cfg.push_layer(layer); + Ok(()) + } - fn modify_before_transmit( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - _runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - let value = cfg.load::().unwrap(); - context - .request_mut() - .headers_mut() - .insert("test-header", HeaderValue::from_static(value.0)); - Ok(()) - } + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let value = cfg.load::().unwrap(); + context + .request_mut() + .headers_mut() + .insert("test-header", HeaderValue::from_static(value.0)); + Ok(()) } + } - let (conn, rx) = capture_request(None); + let (conn, rx) = capture_request(None); - // The first `TestInterceptor` will put `value1` into config - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn)) - .interceptor(TestInterceptor("value1")) - .build(); - let client = Client::from_conf(config); + // The first `TestInterceptor` will put `value1` into config + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_connector(DynConnector::new(conn)) + .interceptor(TestInterceptor("value1")) + .build(); + let client = Client::from_conf(config); - // The second `TestInterceptor` will replace `value1` with `value2` in config - dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .interceptor(TestInterceptor("value2")) - .send() - .await - ) - .expect_err("no fake response set"); + // The second `TestInterceptor` will replace `value1` with `value2` in config + dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .customize() + .await + .unwrap() + .interceptor(TestInterceptor("value2")) + .send() + .await + ) + .expect_err("no fake response set"); - let request = rx.expect_request(); - assert_eq!("value2", request.headers()["test-header"]); - } + let request = rx.expect_request(); + assert_eq!("value2", request.headers()["test-header"]); +} - #[tokio::test] - async fn set_test_user_agent_through_request_mutation() { - let (conn, rx) = capture_request(None); +#[tokio::test] +async fn set_test_user_agent_through_request_mutation() { + let (conn, rx) = capture_request(None); - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .build(); - let client = Client::from_conf(config); + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_connector(DynConnector::new(conn.clone())) + .build(); + let client = Client::from_conf(config); - dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .mutate_request(|request| { - let headers = request.headers_mut(); - headers.insert(USER_AGENT, HeaderValue::try_from("test").unwrap()); - headers.insert("x-amz-user-agent", HeaderValue::try_from("test").unwrap()); - }) - .send() - .await - ) - .expect_err("no fake response set"); + dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .customize() + .await + .unwrap() + .mutate_request(|request| { + let headers = request.headers_mut(); + headers.insert(USER_AGENT, HeaderValue::try_from("test").unwrap()); + headers.insert("x-amz-user-agent", HeaderValue::try_from("test").unwrap()); + }) + .send() + .await + ) + .expect_err("no fake response set"); - let request = rx.expect_request(); - assert_eq!("test", request.headers()[USER_AGENT]); - assert_eq!("test", request.headers()["x-amz-user-agent"]); - } + let request = rx.expect_request(); + assert_eq!("test", request.headers()[USER_AGENT]); + assert_eq!("test", request.headers()["x-amz-user-agent"]); } diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs index 1d6947582a5..b558a904941 100644 --- a/aws/sdk/integration-tests/s3/tests/no_auth.rs +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -3,134 +3,130 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_middleware_mode))] -mod access_public_datasets_without_credentials { - use aws_smithy_client::dvr::ReplayingConnection; - use aws_smithy_protocol_test::MediaType; - use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; - - #[tokio::test] - async fn list_objects() { - let _logs = capture_test_logs(); - - let conn = ReplayingConnection::from_file("tests/data/no_auth/list-objects.json").unwrap(); - let config = aws_config::from_env() - .http_connector(conn.clone()) - .no_credentials() - .region("us-east-1") - .load() - .await; - let client = aws_sdk_s3::Client::new(&config); - - let result = client - .list_objects() - .bucket("gdc-organoid-pancreatic-phs001611-2-open") - .max_keys(3) - .customize() - .await - .unwrap() - .remove_invocation_id_for_tests() - .user_agent_for_tests() - .send() - .await; - dbg!(result).expect("success"); - - conn.validate_body_and_headers(None, MediaType::Xml) - .await - .unwrap(); - } - - #[tokio::test] - async fn list_objects_v2() { - let _logs = capture_test_logs(); - - let conn = - ReplayingConnection::from_file("tests/data/no_auth/list-objects-v2.json").unwrap(); - let config = aws_config::from_env() - .http_connector(conn.clone()) - .no_credentials() - .region("us-east-1") - .load() - .await; - let client = aws_sdk_s3::Client::new(&config); - - let result = client - .list_objects_v2() - .bucket("gdc-organoid-pancreatic-phs001611-2-open") - .max_keys(3) - .customize() - .await - .unwrap() - .remove_invocation_id_for_tests() - .user_agent_for_tests() - .send() - .await; - dbg!(result).expect("success"); - - conn.validate_body_and_headers(None, MediaType::Xml) - .await - .unwrap(); - } - - #[tokio::test] - async fn head_object() { - let _logs = capture_test_logs(); - - let conn = ReplayingConnection::from_file("tests/data/no_auth/head-object.json").unwrap(); - let config = aws_config::from_env() - .http_connector(conn.clone()) - .no_credentials() - .region("us-east-1") - .load() - .await; - let client = aws_sdk_s3::Client::new(&config); - - let result = client - .head_object() - .bucket("gdc-organoid-pancreatic-phs001611-2-open") - .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") - .customize() - .await - .unwrap() - .remove_invocation_id_for_tests() - .user_agent_for_tests() - .send() - .await; - dbg!(result).expect("success"); - - conn.validate_body_and_headers(None, MediaType::Xml) - .await - .unwrap(); - } - - #[tokio::test] - async fn get_object() { - let _logs = capture_test_logs(); - - let conn = ReplayingConnection::from_file("tests/data/no_auth/get-object.json").unwrap(); - let config = aws_config::from_env() - .http_connector(conn.clone()) - .no_credentials() - .region("us-east-1") - .load() - .await; - let client = aws_sdk_s3::Client::new(&config); - - let result = client - .get_object() - .bucket("gdc-organoid-pancreatic-phs001611-2-open") - .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") - .customize() - .await - .unwrap() - .remove_invocation_id_for_tests() - .user_agent_for_tests() - .send() - .await; - dbg!(result).expect("success"); - - conn.validate_body_and_headers(None, MediaType::Xml) - .await - .unwrap(); - } +use aws_smithy_client::dvr::ReplayingConnection; +use aws_smithy_protocol_test::MediaType; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + +#[tokio::test] +async fn list_objects() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/list-objects.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .list_objects() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .max_keys(3) + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); +} + +#[tokio::test] +async fn list_objects_v2() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/list-objects-v2.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .list_objects_v2() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .max_keys(3) + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); +} + +#[tokio::test] +async fn head_object() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/head-object.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .head_object() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); +} + +#[tokio::test] +async fn get_object() { + let _logs = capture_test_logs(); + + let conn = ReplayingConnection::from_file("tests/data/no_auth/get-object.json").unwrap(); + let config = aws_config::from_env() + .http_connector(conn.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let client = aws_sdk_s3::Client::new(&config); + + let result = client + .get_object() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") + .customize() + .await + .unwrap() + .remove_invocation_id_for_tests() + .user_agent_for_tests() + .send() + .await; + dbg!(result).expect("success"); + + conn.validate_body_and_headers(None, MediaType::Xml) + .await + .unwrap(); } diff --git a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs index 33ee18fb9df..d4e00d39d26 100644 --- a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -3,283 +3,280 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_middleware_mode))] -mod tests { - use aws_http::user_agent::AwsUserAgent; - use aws_runtime::invocation_id::{InvocationId, PredefinedInvocationIdGenerator}; - use aws_sdk_s3::config::interceptors::BeforeSerializationInterceptorContextMut; - use aws_sdk_s3::config::interceptors::FinalizerInterceptorContextRef; - use aws_sdk_s3::config::retry::RetryConfig; - use aws_sdk_s3::config::timeout::TimeoutConfig; - use aws_sdk_s3::config::{Credentials, Region}; - use aws_sdk_s3::config::{Interceptor, SharedAsyncSleep}; - use aws_sdk_s3::Client; - use aws_smithy_async::test_util::InstantSleep; - use aws_smithy_async::test_util::ManualTimeSource; - use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_client::dvr; - use aws_smithy_client::dvr::MediaType; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; - use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; - use std::time::{Duration, UNIX_EPOCH}; +use aws_http::user_agent::AwsUserAgent; +use aws_runtime::invocation_id::{InvocationId, PredefinedInvocationIdGenerator}; +use aws_sdk_s3::config::interceptors::BeforeSerializationInterceptorContextMut; +use aws_sdk_s3::config::interceptors::FinalizerInterceptorContextRef; +use aws_sdk_s3::config::retry::RetryConfig; +use aws_sdk_s3::config::timeout::TimeoutConfig; +use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::config::{Interceptor, SharedAsyncSleep}; +use aws_sdk_s3::Client; +use aws_smithy_async::test_util::InstantSleep; +use aws_smithy_async::test_util::ManualTimeSource; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_client::dvr; +use aws_smithy_client::dvr::MediaType; +use aws_smithy_client::erase::DynConnector; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Layer}; +use std::time::{Duration, UNIX_EPOCH}; - // # One SDK operation invocation. - // # Client retries 3 times, successful response on 3rd attempt. - // # Fast network, latency + server time is less than one second. - // # No clock skew - // # Client waits 1 second between retry attempts. - #[tokio::test] - async fn three_retries_and_then_success() { - let _logs = capture_test_logs(); +// # One SDK operation invocation. +// # Client retries 3 times, successful response on 3rd attempt. +// # Fast network, latency + server time is less than one second. +// # No clock skew +// # Client waits 1 second between retry attempts. +#[tokio::test] +async fn three_retries_and_then_success() { + let _logs = capture_test_logs(); - #[derive(Debug)] - struct TimeInterceptor { - time_source: ManualTimeSource, + #[derive(Debug)] + struct TimeInterceptor { + time_source: ManualTimeSource, + } + impl Interceptor for TimeInterceptor { + fn name(&self) -> &'static str { + "TimeInterceptor" } - impl Interceptor for TimeInterceptor { - fn name(&self) -> &'static str { - "TimeInterceptor" - } - fn modify_before_serialization( - &self, - _context: &mut BeforeSerializationInterceptorContextMut<'_>, - _runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - let mut layer = Layer::new("test"); - layer.store_put(AwsUserAgent::for_tests()); - cfg.push_layer(layer); - Ok(()) - } + fn modify_before_serialization( + &self, + _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let mut layer = Layer::new("test"); + layer.store_put(AwsUserAgent::for_tests()); + cfg.push_layer(layer); + Ok(()) + } - fn read_after_attempt( - &self, - _context: &FinalizerInterceptorContextRef<'_>, - _runtime_components: &RuntimeComponents, - _cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - self.time_source.advance(Duration::from_secs(1)); - tracing::info!( - "################ ADVANCED TIME BY 1 SECOND, {:?}", - &self.time_source - ); - Ok(()) - } + fn read_after_attempt( + &self, + _context: &FinalizerInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.time_source.advance(Duration::from_secs(1)); + tracing::info!( + "################ ADVANCED TIME BY 1 SECOND, {:?}", + &self.time_source + ); + Ok(()) } + } - let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1559347200)); + let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1559347200)); - let path = "tests/data/request-information-headers/three-retries_and-then-success.json"; - let conn = dvr::ReplayingConnection::from_file(path).unwrap(); - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .time_source(SharedTimeSource::new(time_source.clone())) - .sleep_impl(SharedAsyncSleep::new(InstantSleep::new(Default::default()))) - .retry_config(RetryConfig::standard()) - .timeout_config( - TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(10)) - .read_timeout(Duration::from_secs(10)) - .build(), - ) - .invocation_id_generator(PredefinedInvocationIdGenerator::new(vec![ - InvocationId::new_from_str("00000000-0000-4000-8000-000000000000"), - ])) - .interceptor(TimeInterceptor { time_source }) - .build(); - let client = Client::from_conf(config); + let path = "tests/data/request-information-headers/three-retries_and-then-success.json"; + let conn = dvr::ReplayingConnection::from_file(path).unwrap(); + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_connector(DynConnector::new(conn.clone())) + .time_source(SharedTimeSource::new(time_source.clone())) + .sleep_impl(SharedAsyncSleep::new(InstantSleep::new(Default::default()))) + .retry_config(RetryConfig::standard()) + .timeout_config( + TimeoutConfig::builder() + .connect_timeout(Duration::from_secs(10)) + .read_timeout(Duration::from_secs(10)) + .build(), + ) + .invocation_id_generator(PredefinedInvocationIdGenerator::new(vec![ + InvocationId::new_from_str("00000000-0000-4000-8000-000000000000"), + ])) + .interceptor(TimeInterceptor { time_source }) + .build(); + let client = Client::from_conf(config); - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send() - .await - ); + let resp = dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .send() + .await + ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("failed") - } - // - // // # Client makes 3 separate SDK operation invocations - // // # All succeed on first attempt. - // // # Fast network, latency + server time is less than one second. - // // - request: - // // time: 2019-06-01T00:00:00Z - // // headers: - // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 - // // amz-sdk-request: attempt=1; max=3 - // // response: - // // status: 200 - // // time_received: 2019-06-01T00:00:00Z - // // headers: - // // Date: Sat, 01 Jun 2019 00:00:00 GMT - // // - request: - // // time: 2019-06-01T00:01:01Z - // // headers: - // // # Note the different invocation id because it's a new SDK - // // # invocation operation. - // // amz-sdk-invocation-id: 70370531-7b83-4b90-8b93-46975687ecf6 - // // amz-sdk-request: ttl=20190601T000011Z; attempt=1; max=3 - // // response: - // // status: 200 - // // time_received: 2019-06-01T00:00:01Z - // // headers: - // // Date: Sat, 01 Jun 2019 00:00:01 GMT - // // - request: - // // time: 2019-06-01T00:00:02Z - // // headers: - // // amz-sdk-invocation-id: 910bf450-6c90-43de-a508-3fa126a06b71 - // // amz-sdk-request: ttl=20190601T000012Z; attempt=1; max=3 - // // response: - // // status: 200 - // // time_received: 2019-06-01T00:00:02Z - // // headers: - // // Date: Sat, 01 Jun 2019 00:00:02 GMT - // const THREE_SUCCESSFUL_ATTEMPTS_PATH: &str = "test-data/request-information-headers/three-successful-attempts.json"; - // #[tokio::test] - // async fn three_successful_attempts() { - // tracing_subscriber::fmt::init(); - // - // impl RuntimePlugin for FixupPlugin { - // fn configure( - // &self, - // cfg: &mut ConfigBag, - // ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - // let params_builder = Params::builder() - // .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) - // .bucket("test-bucket"); - // - // cfg.put(params_builder); - // cfg.set_request_time(RequestTime::new(self.timestamp.clone())); - // cfg.put(AwsUserAgent::for_tests()); - // cfg.put(InvocationId::for_tests()); - // Ok(()) - // } - // } - // - // let conn = dvr::ReplayingConnection::from_file(THREE_SUCCESSFUL_ATTEMPTS_PATH).unwrap(); - // let config = aws_sdk_s3::Config::builder() - // .credentials_provider(Credentials::for_tests()) - // .region(Region::new("us-east-1")) - // .http_connector(DynConnector::new(conn.clone())) - // .build(); - // let client = Client::from_conf(config); - // let fixup = FixupPlugin { - // client: client.clone(), - // timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), - // }; - // - // let resp = dbg!( - // client - // .list_objects_v2() - // .bucket("test-bucket") - // .prefix("prefix~") - // .send_v2_with_plugin(Some(fixup)) - // .await - // ); - // - // let resp = resp.expect("valid e2e test"); - // assert_eq!(resp.name(), Some("test-bucket")); - // conn.full_validate(MediaType::Xml).await.expect("failed") - // } - // - // // # One SDK operation invocation. - // // # Client retries 3 times, successful response on 3rd attempt. - // // # Slow network, one way latency is 2 seconds. - // // # Server takes 1 second to generate response. - // // # Client clock is 10 minutes behind server clock. - // // # One second delay between retries. - // // - request: - // // time: 2019-06-01T00:00:00Z - // // headers: - // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 - // // amz-sdk-request: attempt=1; max=3 - // // response: - // // status: 500 - // // time_received: 2019-06-01T00:00:05Z - // // headers: - // // Date: Sat, 01 Jun 2019 00:10:03 GMT - // // - request: - // // time: 2019-06-01T00:00:06Z - // // # The ttl is 00:00:16 with the client clock, - // // # but accounting for skew we have - // // # 00:10:03 - 00:00:05 = 00:09:58 - // // # ttl = 00:00:16 + 00:09:58 = 00:10:14 - // // headers: - // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 - // // amz-sdk-request: ttl=20190601T001014Z; attempt=2; max=3 - // // response: - // // status: 500 - // // time_received: 2019-06-01T00:00:11Z - // // headers: - // // Date: Sat, 01 Jun 2019 00:10:09 GMT - // // - request: - // // time: 2019-06-01T00:00:12Z - // // headers: - // // # ttl = 00:00:12 + 20 = 00:00:22 - // // # skew is: - // // # 00:10:09 - 00:00:11 - // // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 - // // amz-sdk-request: ttl=20190601T001020Z; attempt=3; max=3 - // // response: - // // status: 200 - // // time_received: 2019-06-01T00:00:17Z - // // headers: - // // Date: Sat, 01 Jun 2019 00:10:15 GMT - // const SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH: &str = "test-data/request-information-headers/slow-network-and-late-client-clock.json"; - // #[tokio::test] - // async fn slow_network_and_late_client_clock() { - // tracing_subscriber::fmt::init(); - // - // impl RuntimePlugin for FixupPlugin { - // fn configure( - // &self, - // cfg: &mut ConfigBag, - // ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - // let params_builder = Params::builder() - // .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) - // .bucket("test-bucket"); - // - // cfg.put(params_builder); - // cfg.set_request_time(RequestTime::new(self.timestamp.clone())); - // cfg.put(AwsUserAgent::for_tests()); - // cfg.put(InvocationId::for_tests()); - // Ok(()) - // } - // } - // - // let conn = dvr::ReplayingConnection::from_file(SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH).unwrap(); - // let config = aws_sdk_s3::Config::builder() - // .credentials_provider(Credentials::for_tests()) - // .region(Region::new("us-east-1")) - // .http_connector(DynConnector::new(conn.clone())) - // .build(); - // let client = Client::from_conf(config); - // let fixup = FixupPlugin { - // client: client.clone(), - // timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), - // }; - // - // let resp = dbg!( - // client - // .list_objects_v2() - // .bucket("test-bucket") - // .prefix("prefix~") - // .send_v2_with_plugin(Some(fixup)) - // .await - // ); - // - // let resp = resp.expect("valid e2e test"); - // assert_eq!(resp.name(), Some("test-bucket")); - // conn.full_validate(MediaType::Xml).await.expect("failed") - // } + let resp = resp.expect("valid e2e test"); + assert_eq!(resp.name(), Some("test-bucket")); + conn.full_validate(MediaType::Xml).await.expect("failed") } +// +// // # Client makes 3 separate SDK operation invocations +// // # All succeed on first attempt. +// // # Fast network, latency + server time is less than one second. +// // - request: +// // time: 2019-06-01T00:00:00Z +// // headers: +// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 +// // amz-sdk-request: attempt=1; max=3 +// // response: +// // status: 200 +// // time_received: 2019-06-01T00:00:00Z +// // headers: +// // Date: Sat, 01 Jun 2019 00:00:00 GMT +// // - request: +// // time: 2019-06-01T00:01:01Z +// // headers: +// // # Note the different invocation id because it's a new SDK +// // # invocation operation. +// // amz-sdk-invocation-id: 70370531-7b83-4b90-8b93-46975687ecf6 +// // amz-sdk-request: ttl=20190601T000011Z; attempt=1; max=3 +// // response: +// // status: 200 +// // time_received: 2019-06-01T00:00:01Z +// // headers: +// // Date: Sat, 01 Jun 2019 00:00:01 GMT +// // - request: +// // time: 2019-06-01T00:00:02Z +// // headers: +// // amz-sdk-invocation-id: 910bf450-6c90-43de-a508-3fa126a06b71 +// // amz-sdk-request: ttl=20190601T000012Z; attempt=1; max=3 +// // response: +// // status: 200 +// // time_received: 2019-06-01T00:00:02Z +// // headers: +// // Date: Sat, 01 Jun 2019 00:00:02 GMT +// const THREE_SUCCESSFUL_ATTEMPTS_PATH: &str = "test-data/request-information-headers/three-successful-attempts.json"; +// #[tokio::test] +// async fn three_successful_attempts() { +// tracing_subscriber::fmt::init(); +// +// impl RuntimePlugin for FixupPlugin { +// fn configure( +// &self, +// cfg: &mut ConfigBag, +// ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { +// let params_builder = Params::builder() +// .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) +// .bucket("test-bucket"); +// +// cfg.put(params_builder); +// cfg.set_request_time(RequestTime::new(self.timestamp.clone())); +// cfg.put(AwsUserAgent::for_tests()); +// cfg.put(InvocationId::for_tests()); +// Ok(()) +// } +// } +// +// let conn = dvr::ReplayingConnection::from_file(THREE_SUCCESSFUL_ATTEMPTS_PATH).unwrap(); +// let config = aws_sdk_s3::Config::builder() +// .credentials_provider(Credentials::for_tests()) +// .region(Region::new("us-east-1")) +// .http_connector(DynConnector::new(conn.clone())) +// .build(); +// let client = Client::from_conf(config); +// let fixup = FixupPlugin { +// client: client.clone(), +// timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), +// }; +// +// let resp = dbg!( +// client +// .list_objects_v2() +// .bucket("test-bucket") +// .prefix("prefix~") +// .send_v2_with_plugin(Some(fixup)) +// .await +// ); +// +// let resp = resp.expect("valid e2e test"); +// assert_eq!(resp.name(), Some("test-bucket")); +// conn.full_validate(MediaType::Xml).await.expect("failed") +// } +// +// // # One SDK operation invocation. +// // # Client retries 3 times, successful response on 3rd attempt. +// // # Slow network, one way latency is 2 seconds. +// // # Server takes 1 second to generate response. +// // # Client clock is 10 minutes behind server clock. +// // # One second delay between retries. +// // - request: +// // time: 2019-06-01T00:00:00Z +// // headers: +// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 +// // amz-sdk-request: attempt=1; max=3 +// // response: +// // status: 500 +// // time_received: 2019-06-01T00:00:05Z +// // headers: +// // Date: Sat, 01 Jun 2019 00:10:03 GMT +// // - request: +// // time: 2019-06-01T00:00:06Z +// // # The ttl is 00:00:16 with the client clock, +// // # but accounting for skew we have +// // # 00:10:03 - 00:00:05 = 00:09:58 +// // # ttl = 00:00:16 + 00:09:58 = 00:10:14 +// // headers: +// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 +// // amz-sdk-request: ttl=20190601T001014Z; attempt=2; max=3 +// // response: +// // status: 500 +// // time_received: 2019-06-01T00:00:11Z +// // headers: +// // Date: Sat, 01 Jun 2019 00:10:09 GMT +// // - request: +// // time: 2019-06-01T00:00:12Z +// // headers: +// // # ttl = 00:00:12 + 20 = 00:00:22 +// // # skew is: +// // # 00:10:09 - 00:00:11 +// // amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07 +// // amz-sdk-request: ttl=20190601T001020Z; attempt=3; max=3 +// // response: +// // status: 200 +// // time_received: 2019-06-01T00:00:17Z +// // headers: +// // Date: Sat, 01 Jun 2019 00:10:15 GMT +// const SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH: &str = "test-data/request-information-headers/slow-network-and-late-client-clock.json"; +// #[tokio::test] +// async fn slow_network_and_late_client_clock() { +// tracing_subscriber::fmt::init(); +// +// impl RuntimePlugin for FixupPlugin { +// fn configure( +// &self, +// cfg: &mut ConfigBag, +// ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { +// let params_builder = Params::builder() +// .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) +// .bucket("test-bucket"); +// +// cfg.put(params_builder); +// cfg.set_request_time(RequestTime::new(self.timestamp.clone())); +// cfg.put(AwsUserAgent::for_tests()); +// cfg.put(InvocationId::for_tests()); +// Ok(()) +// } +// } +// +// let conn = dvr::ReplayingConnection::from_file(SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH).unwrap(); +// let config = aws_sdk_s3::Config::builder() +// .credentials_provider(Credentials::for_tests()) +// .region(Region::new("us-east-1")) +// .http_connector(DynConnector::new(conn.clone())) +// .build(); +// let client = Client::from_conf(config); +// let fixup = FixupPlugin { +// client: client.clone(), +// timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), +// }; +// +// let resp = dbg!( +// client +// .list_objects_v2() +// .bucket("test-bucket") +// .prefix("prefix~") +// .send_v2_with_plugin(Some(fixup)) +// .await +// ); +// +// let resp = resp.expect("valid e2e test"); +// assert_eq!(resp.name(), Some("test-bucket")); +// conn.full_validate(MediaType::Xml).await.expect("failed") +// } diff --git a/aws/sdk/integration-tests/sts/tests/signing-it.rs b/aws/sdk/integration-tests/sts/tests/signing-it.rs index 74e82e00264..5bf851a5ca5 100644 --- a/aws/sdk/integration-tests/sts/tests/signing-it.rs +++ b/aws/sdk/integration-tests/sts/tests/signing-it.rs @@ -24,27 +24,6 @@ async fn assume_role_signed() { ); } -// TODO(enableNewSmithyRuntimeCleanup): Delete the middleware version of this test -#[cfg(aws_sdk_middleware_mode)] -#[tokio::test] -async fn web_identity_unsigned() { - let creds = Credentials::for_tests(); - let (server, request) = capture_request(None); - let conf = aws_sdk_sts::Config::builder() - .credentials_provider(creds) - .region(Region::new("us-east-1")) - .http_connector(server) - .build(); - let client = aws_sdk_sts::Client::from_conf(conf); - let _ = client.assume_role_with_web_identity().send().await; - // web identity should be unsigned - assert_eq!( - request.expect_request().headers().get("AUTHORIZATION"), - None - ); -} - -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn web_identity_unsigned() { let (server, request) = capture_request(None); diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index 16d4222515e..56303a4ef1f 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_middleware_mode))] #[tokio::test] async fn do_endpoint_discovery() { use aws_credential_types::provider::SharedCredentialsProvider; diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index ae84542a3eb..d7173e31d70 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -15,7 +15,6 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" val pluginName = "rust-client-codegen" val workingDirUnderBuildDir = "smithyprojections/codegen-client-test/" @@ -50,8 +49,7 @@ data class ClientTest( private fun extraCodegenConfig(): String = StringBuilder().apply { append("\"addMessageToErrors\": $addMessageToErrors,\n") - append("\"renameErrors\": $renameErrors\n,") - append("\"enableNewSmithyRuntime\": \"${getSmithyRuntimeMode()}\"") + append("\"renameErrors\": $renameErrors\n") }.toString() private fun imports(): List = dependsOn.map { "../codegen-core/common-test-models/$it" } @@ -114,8 +112,6 @@ project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) -tasks["generateSmithyBuild"].inputs.property("smithy.runtime.mode", getSmithyRuntimeMode()) - tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt index 7491b0e8e32..0e12986ff3f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt @@ -35,6 +35,5 @@ data class ClientCodegenContext( ) : CodegenContext( model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.CLIENT, ) { - val smithyRuntimeMode: SmithyRuntimeMode get() = settings.codegenConfig.enableNewSmithyRuntime val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt index afe7b705748..284ed53563b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt @@ -73,17 +73,6 @@ object ClientRustModule { val interceptors = RustModule.public("interceptors", parent = self) } - // TODO(enableNewSmithyRuntimeCleanup): Delete this root endpoint module - @Deprecated(message = "use the endpoint() method to get the endpoint module for now") - val Endpoint = RustModule.public("endpoint") - - // TODO(enableNewSmithyRuntimeCleanup): Just use Config.endpoint directly and delete this function - fun endpoint(codegenContext: ClientCodegenContext): RustModule.LeafModule = if (codegenContext.smithyRuntimeMode.generateMiddleware) { - Endpoint - } else { - Config.endpoint - } - val Error = RustModule.public("error") val Operation = RustModule.public("operation") val Meta = RustModule.public("meta") @@ -117,7 +106,6 @@ class ClientModuleDocProvider( ClientRustModule.Config.timeout -> strDoc("Timeout configuration.") ClientRustModule.Config.interceptors -> strDoc("Types needed to implement [`Interceptor`](crate::config::Interceptor).") ClientRustModule.Error -> strDoc("Common errors and error handling utilities.") - ClientRustModule.Endpoint -> strDoc("Endpoint resolution functionality.") ClientRustModule.Operation -> strDoc("All operations that this crate can perform.") ClientRustModule.Meta -> strDoc("Information about this crate.") ClientRustModule.Input -> PANIC("this module shouldn't exist in the new scheme") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index be82879a7a7..dc6fd4f0280 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -72,23 +72,6 @@ data class ClientRustSettings( } } -// TODO(enableNewSmithyRuntimeCleanup): Remove this mode after switching to the orchestrator -enum class SmithyRuntimeMode { - Middleware, Orchestrator, - ; - - val generateMiddleware: Boolean get() = this == Middleware - val generateOrchestrator: Boolean get() = this == Orchestrator - - companion object { - fun fromString(value: String): SmithyRuntimeMode = when (value) { - "middleware" -> Middleware - "orchestrator" -> Orchestrator - else -> throw IllegalArgumentException("unknown runtime mode: $value") - } - } -} - /** * [renameExceptions]: Rename `Exception` to `Error` in the generated SDK * [includeFluentClient]: Generate a `client` module in the generated SDK (currently the AWS SDK sets this to `false` @@ -103,8 +86,6 @@ data class ClientCodegenConfig( val addMessageToErrors: Boolean = defaultAddMessageToErrors, // TODO(EventStream): [CLEANUP] Remove this property when turning on Event Stream for all services val eventStreamAllowList: Set = defaultEventStreamAllowList, - // TODO(enableNewSmithyRuntimeCleanup): Remove this once we commit to switch to aws-smithy-runtime and aws-smithy-runtime-api - val enableNewSmithyRuntime: SmithyRuntimeMode = defaultEnableNewSmithyRuntime, /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */ val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig, val enableUserConfigurableRuntimePlugins: Boolean = defaultEnableUserConfigurableRuntimePlugins, @@ -116,7 +97,6 @@ data class ClientCodegenConfig( private const val defaultIncludeFluentClient = true private const val defaultAddMessageToErrors = true private val defaultEventStreamAllowList: Set = emptySet() - private val defaultEnableNewSmithyRuntime = SmithyRuntimeMode.Orchestrator private const val defaultIncludeEndpointUrlConfig = true private const val defaultEnableUserConfigurableRuntimePlugins = true @@ -133,7 +113,6 @@ data class ClientCodegenConfig( renameExceptions = node.get().getBooleanMemberOrDefault("renameErrors", defaultRenameExceptions), includeFluentClient = node.get().getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), - enableNewSmithyRuntime = SmithyRuntimeMode.fromString(node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "orchestrator")), includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("enableUserConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt index 7b05e664e80..959948dedbf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt @@ -9,7 +9,6 @@ import software.amazon.smithy.build.PluginContext import software.amazon.smithy.codegen.core.ReservedWordSymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape -import software.amazon.smithy.rust.codegen.client.smithy.customizations.ApiKeyAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.ClientCustomizations import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpConnectorConfigDecorator @@ -63,7 +62,6 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() { EndpointsDecorator(), EndpointParamsDecorator(), NoAuthDecorator(), - ApiKeyAuthDecorator(), HttpAuthDecorator(), HttpConnectorConfigDecorator(), *decorator, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt deleted file mode 100644 index fb02e282719..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.model.knowledge.ServiceIndex -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.model.traits.HttpApiKeyAuthTrait -import software.amazon.smithy.model.traits.OptionalAuthTrait -import software.amazon.smithy.model.traits.Trait -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate -import software.amazon.smithy.rust.codegen.core.util.letIf - -// TODO(enableNewSmithyRuntimeCleanup): Delete this decorator when switching to the orchestrator - -/** - * Inserts a ApiKeyAuth configuration into the operation - */ -class ApiKeyAuthDecorator : ClientCodegenDecorator { - override val name: String = "ApiKeyAuth" - override val order: Byte = 10 - - private fun applies(codegenContext: ClientCodegenContext) = - codegenContext.smithyRuntimeMode.generateMiddleware && - isSupportedApiKeyAuth(codegenContext) - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List { - return baseCustomizations.letIf(applies(codegenContext)) { customizations -> - customizations + ApiKeyConfigCustomization(codegenContext) - } - } - - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - if (applies(codegenContext) && hasApiKeyAuthScheme(codegenContext, operation)) { - val service = codegenContext.serviceShape - val authDefinition: HttpApiKeyAuthTrait = service.expectTrait(HttpApiKeyAuthTrait::class.java) - return baseCustomizations + ApiKeyOperationCustomization(codegenContext.runtimeConfig, authDefinition) - } - return baseCustomizations - } - - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - if (applies(codegenContext)) { - rustCrate.withModule(ClientRustModule.config) { - rust("pub use #T;", apiKey(codegenContext.runtimeConfig)) - } - } - } -} - -/** - * Returns if the service supports the httpApiKeyAuth trait. - * - * @param codegenContext Codegen context that includes the model and service shape - * @return if the httpApiKeyAuth trait is used by the service - */ -private fun isSupportedApiKeyAuth(codegenContext: ClientCodegenContext): Boolean { - return ServiceIndex.of(codegenContext.model).getAuthSchemes(codegenContext.serviceShape).containsKey(HttpApiKeyAuthTrait.ID) -} - -/** - * Returns if the service and operation have the httpApiKeyAuthTrait. - * - * @param codegenContext codegen context that includes the model and service shape - * @param operation operation shape - * @return if the service and operation have the httpApiKeyAuthTrait - */ -private fun hasApiKeyAuthScheme(codegenContext: ClientCodegenContext, operation: OperationShape): Boolean { - val auth: Map = ServiceIndex.of(codegenContext.model).getEffectiveAuthSchemes(codegenContext.serviceShape.getId(), operation.getId()) - return auth.containsKey(HttpApiKeyAuthTrait.ID) && !operation.hasTrait(OptionalAuthTrait.ID) -} - -private class ApiKeyOperationCustomization(private val runtimeConfig: RuntimeConfig, private val authDefinition: HttpApiKeyAuthTrait) : OperationCustomization() { - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.MutateRequest -> writable { - rustBlock("if let Some(api_key_config) = ${section.config}.api_key()") { - rust( - """ - ${section.request}.properties_mut().insert(api_key_config.clone()); - let api_key = api_key_config.api_key(); - """, - ) - val definitionName = authDefinition.getName() - if (authDefinition.getIn() == HttpApiKeyAuthTrait.Location.QUERY) { - rustTemplate( - """ - let auth_definition = #{http_auth_definition}::query( - "$definitionName".to_owned(), - ); - let name = auth_definition.name(); - let mut query = #{query_writer}::new(${section.request}.http().uri()); - query.insert(name, api_key); - *${section.request}.http_mut().uri_mut() = query.build_uri(); - """, - "http_auth_definition" to - RuntimeType.smithyHttpAuth(runtimeConfig).resolve("definition::HttpAuthDefinition"), - "query_writer" to RuntimeType.smithyHttp(runtimeConfig).resolve("query_writer::QueryWriter"), - ) - } else { - val definitionScheme: String = authDefinition.getScheme() - .map { scheme -> - "Some(\"" + scheme + "\".to_owned())" - } - .orElse("None") - rustTemplate( - """ - let auth_definition = #{http_auth_definition}::header( - "$definitionName".to_owned(), - $definitionScheme, - ); - let name = auth_definition.name(); - let value = match auth_definition.scheme() { - Some(value) => format!("{value} {api_key}"), - None => api_key.to_owned(), - }; - ${section.request} - .http_mut() - .headers_mut() - .insert( - #{http_header}::HeaderName::from_bytes(name.as_bytes()).expect("valid header name for api key auth"), - #{http_header}::HeaderValue::from_bytes(value.as_bytes()).expect("valid header value for api key auth") - ); - """, - "http_auth_definition" to - RuntimeType.smithyHttpAuth(runtimeConfig).resolve("definition::HttpAuthDefinition"), - "http_header" to RuntimeType.Http.resolve("header"), - ) - } - } - } - else -> emptySection - } -} - -private class ApiKeyConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { - val runtimeMode = codegenContext.smithyRuntimeMode - val runtimeConfig = codegenContext.runtimeConfig - private val codegenScope = arrayOf( - *preludeScope, - "ApiKey" to apiKey(runtimeConfig), - ) - - override fun section(section: ServiceConfig): Writable = - when (section) { - is ServiceConfig.BuilderStruct -> writable { - rustTemplate("api_key: #{Option}<#{ApiKey}>,", *codegenScope) - } - is ServiceConfig.BuilderImpl -> writable { - rustTemplate( - """ - /// Sets the API key that will be used by the client. - pub fn api_key(mut self, api_key: #{ApiKey}) -> Self { - self.set_api_key(Some(api_key)); - self - } - - /// Sets the API key that will be used by the client. - pub fn set_api_key(&mut self, api_key: #{Option}<#{ApiKey}>) -> &mut Self { - self.api_key = api_key; - self - } - """, - *codegenScope, - ) - } - is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateOrchestrator) { - rust("layer.store_or_unset(self.api_key);") - } else { - rust("api_key: self.api_key,") - } - } - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("api_key: #{Option}<#{ApiKey}>,", *codegenScope) - } - } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Returns API key used by the client, if it was provided. - pub fn api_key(&self) -> #{Option}<&#{ApiKey}> { - self.config.load::<#{ApiKey}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns API key used by the client, if it was provided. - pub fn api_key(&self) -> #{Option}<&#{ApiKey}> { - self.api_key.as_ref() - } - """, - *codegenScope, - ) - } - } - else -> emptySection - } -} - -private fun apiKey(runtimeConfig: RuntimeConfig) = RuntimeType.smithyHttpAuth(runtimeConfig).resolve("api_key::AuthApiKey") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt index 60ac6c631a4..e4af09c1d9c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt @@ -38,7 +38,7 @@ class EndpointPrefixGenerator(private val codegenContext: ClientCodegenContext, is OperationSection.MutateRequest -> writable { endpointTraitBindings(codegenContext, shape)?.also { endpointTraitBindings -> withBlock("let endpoint_prefix = ", "?;") { - endpointTraitBindings.render(this, "self", codegenContext.smithyRuntimeMode) + endpointTraitBindings.render(this, "self") } rust("request.properties_mut().insert(endpoint_prefix);") } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index 9477f1082ad..684def389a0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -67,12 +67,11 @@ private data class HttpAuthSchemes( companion object { fun from(codegenContext: ClientCodegenContext): HttpAuthSchemes { val authSchemes = ServiceIndex.of(codegenContext.model).getAuthSchemes(codegenContext.serviceShape).keys - val generateOrchestrator = codegenContext.smithyRuntimeMode.generateOrchestrator return HttpAuthSchemes( - apiKey = generateOrchestrator && authSchemes.contains(HttpApiKeyAuthTrait.ID), - basic = generateOrchestrator && authSchemes.contains(HttpBasicAuthTrait.ID), - bearer = generateOrchestrator && authSchemes.contains(HttpBearerAuthTrait.ID), - digest = generateOrchestrator && authSchemes.contains(HttpDigestAuthTrait.ID), + apiKey = authSchemes.contains(HttpApiKeyAuthTrait.ID), + basic = authSchemes.contains(HttpBasicAuthTrait.ID), + bearer = authSchemes.contains(HttpBearerAuthTrait.ID), + digest = authSchemes.contains(HttpDigestAuthTrait.ID), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 49dbce324bf..643d0af31a3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -11,12 +11,10 @@ import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegen import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.util.letIf class HttpConnectorConfigDecorator : ClientCodegenDecorator { override val name: String = "HttpConnectorConfigDecorator" @@ -25,17 +23,13 @@ class HttpConnectorConfigDecorator : ClientCodegenDecorator { override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + HttpConnectorConfigCustomization(codegenContext) - } + ): List = baseCustomizations + HttpConnectorConfigCustomization(codegenContext) } private class HttpConnectorConfigCustomization( codegenContext: ClientCodegenContext, ) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, @@ -114,40 +108,16 @@ private class HttpConnectorConfigCustomization( override fun section(section: ServiceConfig): Writable { return when (section) { - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } - } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Return the [`SharedHttpConnector`](#{SharedHttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<#{SharedHttpConnector}> { - self.runtime_components.http_connector() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.http_connector.as_ref() - } - """, - *codegenScope, - ) - } - } - - is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } + rustTemplate( + """ + /// Return the [`SharedHttpConnector`](#{SharedHttpConnector}) to use when making requests, if any. + pub fn http_connector(&self) -> Option<#{SharedHttpConnector}> { + self.runtime_components.http_connector() + } + """, + *codegenScope, + ) } ServiceConfig.BuilderImpl -> writable { @@ -229,47 +199,29 @@ private class HttpConnectorConfigCustomization( """, *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { - http_connector.map(|c| self.config.store_put(c.into())); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { - self.http_connector = http_connector.map(|inner| inner.into()); - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { + http_connector.map(|c| self.config.store_put(c.into())); + self + } + """, + *codegenScope, + ) } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - "#{set_connector}(&mut resolver);", - "set_connector" to setConnectorFn(), - ) - } else { - rust("http_connector: self.http_connector,") - } + rustTemplate( + "#{set_connector}(&mut resolver);", + "set_connector" to setConnectorFn(), + ) } is ServiceConfig.OperationConfigOverride -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - "#{set_connector}(&mut resolver);", - "set_connector" to setConnectorFn(), - ) - } + rustTemplate( + "#{set_connector}(&mut resolver);", + "set_connector" to setConnectorFn(), + ) } else -> emptySection diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index 9bb9e16ef3f..fd9c947a8c1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -17,16 +16,9 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con private val moduleUseName = codegenContext.moduleUseName() private val runtimeConfig = codegenContext.runtimeConfig - // TODO(enableNewSmithyRuntimeCleanup): Remove the writable below - private val maybeHideOrchestratorCode = writable { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust("##[doc(hidden)]") - } - } private val codegenScope = arrayOf( "Interceptor" to RuntimeType.interceptor(runtimeConfig), "SharedInterceptor" to RuntimeType.sharedInterceptor(runtimeConfig), - "maybe_hide_orchestrator_code" to maybeHideOrchestratorCode, ) override fun section(section: ServiceConfig) = @@ -34,7 +26,6 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con when (section) { ServiceConfig.ConfigImpl -> rustTemplate( """ - #{maybe_hide_orchestrator_code} /// Returns interceptors currently registered by the user. pub fn interceptors(&self) -> impl Iterator + '_ { self.runtime_components.interceptors() @@ -46,7 +37,6 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con ServiceConfig.BuilderImpl -> rustTemplate( """ - #{maybe_hide_orchestrator_code} /// Add an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. /// /// Interceptors targeted at a certain stage are executed according to the pre-defined priority. @@ -96,7 +86,6 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con self } - #{maybe_hide_orchestrator_code} /// Add a [`SharedInterceptor`](#{SharedInterceptor}) that runs at specific stages of the request execution pipeline. /// /// Interceptors targeted at a certain stage are executed according to the pre-defined priority. @@ -149,7 +138,6 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con self } - #{maybe_hide_orchestrator_code} /// Set [`SharedInterceptor`](#{SharedInterceptor})s for the builder. pub fn set_interceptors(&mut self, interceptors: impl IntoIterator) -> &mut Self { self.runtime_components.set_interceptors(interceptors.into_iter()); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index 8dde7f43a83..87586fbcb73 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -22,7 +22,6 @@ import software.amazon.smithy.rust.codegen.core.util.sdkId class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val retryConfig = RuntimeType.smithyTypes(runtimeConfig).resolve("retry") private val sleepModule = RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep") private val timeoutModule = RuntimeType.smithyTypes(runtimeConfig).resolve("timeout") @@ -50,83 +49,35 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon override fun section(section: ServiceConfig) = writable { when (section) { - is ServiceConfig.ConfigStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate( - """ - retry_config: #{Option}<#{RetryConfig}>, - sleep_impl: #{Option}<#{SharedAsyncSleep}>, - timeout_config: #{Option}<#{TimeoutConfig}>, - """, - *codegenScope, - ) - } - } - is ServiceConfig.ConfigImpl -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Return a reference to the retry configuration contained in this config, if any. - pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { - self.config.load::<#{RetryConfig}>() - } - - /// Return a cloned shared async sleep implementation from this config, if any. - pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { - self.runtime_components.sleep_impl() - } - - /// Return a reference to the timeout configuration contained in this config, if any. - pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { - self.config.load::<#{TimeoutConfig}>() - } - - ##[doc(hidden)] - /// Returns a reference to the retry partition contained in this config, if any. - /// - /// WARNING: This method is unstable and may be removed at any time. Do not rely on this - /// method for anything! - pub fn retry_partition(&self) -> #{Option}<&#{RetryPartition}> { - self.config.load::<#{RetryPartition}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Return a reference to the retry configuration contained in this config, if any. - pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { - self.retry_config.as_ref() - } + rustTemplate( + """ + /// Return a reference to the retry configuration contained in this config, if any. + pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { + self.config.load::<#{RetryConfig}>() + } - /// Return a cloned shared async sleep implementation from this config, if any. - pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { - self.sleep_impl.clone() - } + /// Return a cloned shared async sleep implementation from this config, if any. + pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { + self.runtime_components.sleep_impl() + } - /// Return a reference to the timeout configuration contained in this config, if any. - pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { - self.timeout_config.as_ref() - } - """, - *codegenScope, - ) - } - } + /// Return a reference to the timeout configuration contained in this config, if any. + pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { + self.config.load::<#{TimeoutConfig}>() + } - is ServiceConfig.BuilderStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate( - """ - retry_config: #{Option}<#{RetryConfig}>, - sleep_impl: #{Option}<#{SharedAsyncSleep}>, - timeout_config: #{Option}<#{TimeoutConfig}>, - """, - *codegenScope, - ) - } + ##[doc(hidden)] + /// Returns a reference to the retry partition contained in this config, if any. + /// + /// WARNING: This method is unstable and may be removed at any time. Do not rely on this + /// method for anything! + pub fn retry_partition(&self) -> #{Option}<&#{RetryPartition}> { + self.config.load::<#{RetryPartition}>() + } + """, + *codegenScope, + ) } is ServiceConfig.BuilderImpl -> { @@ -167,27 +118,15 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { - retry_config.map(|r| self.config.store_put(r)); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { - self.retry_config = retry_config; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { + retry_config.map(|r| self.config.store_put(r)); + self + } + """, + *codegenScope, + ) rustTemplate( """ @@ -245,27 +184,15 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { - self.runtime_components.set_sleep_impl(sleep_impl); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { - self.sleep_impl = sleep_impl; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { + self.runtime_components.set_sleep_impl(sleep_impl); + self + } + """, + *codegenScope, + ) rustTemplate( """ @@ -313,122 +240,94 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { - timeout_config.map(|t| self.config.store_put(t)); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { - self.timeout_config = timeout_config; - self - } - """, - *codegenScope, - ) - } - - if (runtimeMode.generateOrchestrator) { - Attribute.DocHidden.render(this) - rustTemplate( - """ - /// Set the partition for retry-related state. When clients share a retry partition, they will - /// also share things like token buckets and client rate limiters. By default, all clients - /// for the same service will share a partition. - pub fn retry_partition(mut self, retry_partition: #{RetryPartition}) -> Self { - self.set_retry_partition(Some(retry_partition)); - self - } - """, - *codegenScope, - ) - - Attribute.DocHidden.render(this) - rustTemplate( - """ - /// Set the partition for retry-related state. When clients share a retry partition, they will - /// also share things like token buckets and client rate limiters. By default, all clients - /// for the same service will share a partition. - pub fn set_retry_partition(&mut self, retry_partition: #{Option}<#{RetryPartition}>) -> &mut Self { - retry_partition.map(|r| self.config.store_put(r)); - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { + timeout_config.map(|t| self.config.store_put(t)); + self + } + """, + *codegenScope, + ) + + Attribute.DocHidden.render(this) + rustTemplate( + """ + /// Set the partition for retry-related state. When clients share a retry partition, they will + /// also share things like token buckets and client rate limiters. By default, all clients + /// for the same service will share a partition. + pub fn retry_partition(mut self, retry_partition: #{RetryPartition}) -> Self { + self.set_retry_partition(Some(retry_partition)); + self + } + """, + *codegenScope, + ) + + Attribute.DocHidden.render(this) + rustTemplate( + """ + /// Set the partition for retry-related state. When clients share a retry partition, they will + /// also share things like token buckets and client rate limiters. By default, all clients + /// for the same service will share a partition. + pub fn set_retry_partition(&mut self, retry_partition: #{Option}<#{RetryPartition}>) -> &mut Self { + retry_partition.map(|r| self.config.store_put(r)); + self + } + """, + *codegenScope, + ) } is ServiceConfig.BuilderBuild -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - if layer.load::<#{RetryConfig}>().is_none() { - layer.store_put(#{RetryConfig}::disabled()); - } - let retry_config = layer.load::<#{RetryConfig}>().expect("set to default above").clone(); + rustTemplate( + """ + if layer.load::<#{RetryConfig}>().is_none() { + layer.store_put(#{RetryConfig}::disabled()); + } + let retry_config = layer.load::<#{RetryConfig}>().expect("set to default above").clone(); - if layer.load::<#{RetryPartition}>().is_none() { - layer.store_put(#{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); - } - let retry_partition = layer.load::<#{RetryPartition}>().expect("set to default above").clone(); + if layer.load::<#{RetryPartition}>().is_none() { + layer.store_put(#{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); + } + let retry_partition = layer.load::<#{RetryPartition}>().expect("set to default above").clone(); - if retry_config.has_retry() { - #{debug}!("using retry strategy with partition '{}'", retry_partition); - } + if retry_config.has_retry() { + #{debug}!("using retry strategy with partition '{}'", retry_partition); + } - if retry_config.mode() == #{RetryMode}::Adaptive { - if let #{Some}(time_source) = self.runtime_components.time_source() { - let seconds_since_unix_epoch = time_source - .now() - .duration_since(#{SystemTime}::UNIX_EPOCH) - .expect("the present takes place after the UNIX_EPOCH") - .as_secs_f64(); - let client_rate_limiter_partition = #{ClientRateLimiterPartition}::new(retry_partition.clone()); - let client_rate_limiter = CLIENT_RATE_LIMITER.get_or_init(client_rate_limiter_partition, || { - #{ClientRateLimiter}::new(seconds_since_unix_epoch) - }); - layer.store_put(client_rate_limiter); - } + if retry_config.mode() == #{RetryMode}::Adaptive { + if let #{Some}(time_source) = self.runtime_components.time_source() { + let seconds_since_unix_epoch = time_source + .now() + .duration_since(#{SystemTime}::UNIX_EPOCH) + .expect("the present takes place after the UNIX_EPOCH") + .as_secs_f64(); + let client_rate_limiter_partition = #{ClientRateLimiterPartition}::new(retry_partition.clone()); + let client_rate_limiter = CLIENT_RATE_LIMITER.get_or_init(client_rate_limiter_partition, || { + #{ClientRateLimiter}::new(seconds_since_unix_epoch) + }); + layer.store_put(client_rate_limiter); } + } - // The token bucket is used for both standard AND adaptive retries. - let token_bucket_partition = #{TokenBucketPartition}::new(retry_partition); - let token_bucket = TOKEN_BUCKET.get_or_init(token_bucket_partition, #{TokenBucket}::default); - layer.store_put(token_bucket); + // The token bucket is used for both standard AND adaptive retries. + let token_bucket_partition = #{TokenBucketPartition}::new(retry_partition); + let token_bucket = TOKEN_BUCKET.get_or_init(token_bucket_partition, #{TokenBucket}::default); + layer.store_put(token_bucket); - // TODO(enableNewSmithyRuntimeCleanup): Should not need to provide a default once smithy-rs##2770 - // is resolved - if layer.load::<#{TimeoutConfig}>().is_none() { - layer.store_put(#{TimeoutConfig}::disabled()); - } + // TODO(enableNewSmithyRuntimeCleanup): Should not need to provide a default once smithy-rs##2770 + // is resolved + if layer.load::<#{TimeoutConfig}>().is_none() { + layer.store_put(#{TimeoutConfig}::disabled()); + } - self.runtime_components.set_retry_strategy(#{Some}( - #{SharedRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config))) - ); - """, - *codegenScope, - ) - } else { - rustTemplate( - // We call clone on sleep_impl because the field is used by - // initializing the credentials_cache field later in the build - // method of a Config builder. - """ - retry_config: self.retry_config, - sleep_impl: self.sleep_impl.clone(), - timeout_config: self.timeout_config, - """, - *codegenScope, - ) - } + self.runtime_components.set_retry_strategy(#{Some}( + #{SharedRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config))) + ); + """, + *codegenScope, + ) } else -> emptySection @@ -438,7 +337,6 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode fun extras(rustCrate: RustCrate) { rustCrate.withModule(ClientRustModule.config) { @@ -453,12 +351,10 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { "types_retry" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry"), ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - "pub use #{types_retry}::RetryPartition;", - "types_retry" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries"), - ) - } + rustTemplate( + "pub use #{types_retry}::RetryPartition;", + "types_retry" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries"), + ) } rustCrate.withModule(ClientRustModule.Config.timeout) { rustTemplate( @@ -471,7 +367,6 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { class ResiliencyServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) private val retries = smithyRuntime.resolve("client::retries") private val codegenScope = arrayOf( @@ -483,22 +378,20 @@ class ResiliencyServiceRuntimePluginCustomization(codegenContext: ClientCodegenC ) override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (runtimeMode.generateOrchestrator) { - when (section) { - is ServiceRuntimePluginSection.DeclareSingletons -> { - // TODO(enableNewSmithyRuntimeCleanup) We can use the standard library's `OnceCell` once we upgrade the - // MSRV to 1.70 - rustTemplate( - """ - static TOKEN_BUCKET: #{StaticPartitionMap}<#{TokenBucketPartition}, #{TokenBucket}> = #{StaticPartitionMap}::new(); - static CLIENT_RATE_LIMITER: #{StaticPartitionMap}<#{ClientRateLimiterPartition}, #{ClientRateLimiter}> = #{StaticPartitionMap}::new(); - """, - *codegenScope, - ) - } - - else -> emptySection + when (section) { + is ServiceRuntimePluginSection.DeclareSingletons -> { + // TODO(enableNewSmithyRuntimeCleanup) We can use the standard library's `OnceCell` once we upgrade the + // MSRV to 1.70 + rustTemplate( + """ + static TOKEN_BUCKET: #{StaticPartitionMap}<#{TokenBucketPartition}, #{TokenBucket}> = #{StaticPartitionMap}::new(); + static CLIENT_RATE_LIMITER: #{StaticPartitionMap}<#{ClientRateLimiterPartition}, #{ClientRateLimiter}> = #{StaticPartitionMap}::new(); + """, + *codegenScope, + ) } + + else -> emptySection } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index 7dea61de99e..216779ca268 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -19,7 +19,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, "SharedTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::SharedTimeSource"), @@ -31,38 +30,14 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust override fun section(section: ServiceConfig) = writable { when (section) { - is ServiceConfig.ConfigStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate( - """ - pub(crate) time_source: #{SharedTimeSource}, - """, - *codegenScope, - ) - } - } - is ServiceConfig.ConfigImpl -> { rust("/// Return time source used for this service.") rustBlockTemplate( "pub fn time_source(&self) -> #{Option}<#{SharedTimeSource}>", *codegenScope, ) { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """self.runtime_components.time_source()""", - *codegenScope, - ) - } else { - rustTemplate("#{Some}(self.time_source.clone())", *codegenScope) - } - } - } - - is ServiceConfig.BuilderStruct -> { - if (runtimeMode.generateMiddleware) { rustTemplate( - "time_source: #{Option}<#{SharedTimeSource}>,", + """self.runtime_components.time_source()""", *codegenScope, ) } @@ -83,53 +58,30 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sets the time source used for this service - pub fn set_time_source( - &mut self, - time_source: #{Option}<#{SharedTimeSource}>, - ) -> &mut Self { - self.runtime_components.set_time_source(time_source); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the time source used for this service - pub fn set_time_source( - &mut self, - time_source: #{Option}<#{SharedTimeSource}>, - ) -> &mut Self { - self.time_source = time_source; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the time source used for this service + pub fn set_time_source( + &mut self, + time_source: #{Option}<#{SharedTimeSource}>, + ) -> &mut Self { + self.runtime_components.set_time_source(time_source); + self + } + """, + *codegenScope, + ) } ServiceConfig.BuilderBuild -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - if self.runtime_components.time_source().is_none() { - self.runtime_components.set_time_source(#{Some}(#{Default}::default())); - } - """, - *codegenScope, - ) - } else { - rustTemplate( - "time_source: self.time_source.unwrap_or_default(),", - *codegenScope, - ) - } + rustTemplate( + """ + if self.runtime_components.time_source().is_none() { + self.runtime_components.set_time_source(#{Some}(#{Default}::default())); + } + """, + *codegenScope, + ) } is ServiceConfig.DefaultForTests -> { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 46de4940a07..88858a652e9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -30,7 +30,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersi import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyErrorTypes import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization -import software.amazon.smithy.rust.codegen.core.util.letIf val TestUtilFeature = Feature("test-util", false, listOf()) @@ -48,9 +47,8 @@ class RequiredCustomizations : ClientCodegenDecorator { operation: OperationShape, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + MetadataCustomization(codegenContext, operation) - } + + baseCustomizations + + MetadataCustomization(codegenContext, operation) + IdempotencyTokenGenerator(codegenContext, operation) + EndpointPrefixGenerator(codegenContext, operation) + HttpChecksumRequiredGenerator(codegenContext, operation) + @@ -60,17 +58,10 @@ class RequiredCustomizations : ClientCodegenDecorator { override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - baseCustomizations + - ResiliencyConfigCustomization(codegenContext) + - InterceptorConfigCustomization(codegenContext) + - TimeSourceCustomization(codegenContext) - } else { - baseCustomizations + - ResiliencyConfigCustomization(codegenContext) + - TimeSourceCustomization(codegenContext) - } + ): List = baseCustomizations + + ResiliencyConfigCustomization(codegenContext) + + InterceptorConfigCustomization(codegenContext) + + TimeSourceCustomization(codegenContext) override fun libRsCustomizations( codegenContext: ClientCodegenContext, @@ -104,11 +95,7 @@ class RequiredCustomizations : ClientCodegenDecorator { override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - baseCustomizations + - ResiliencyServiceRuntimePluginCustomization(codegenContext) + - ConnectionPoisoningRuntimePluginCustomization(codegenContext) - } else { - baseCustomizations - } + ): List = baseCustomizations + + ResiliencyServiceRuntimePluginCustomization(codegenContext) + + ConnectionPoisoningRuntimePluginCustomization(codegenContext) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index b1871c6ffca..cd363219ea5 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -25,7 +25,6 @@ internal class EndpointConfigCustomization( ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode private val types = Types(runtimeConfig) private val codegenScope = arrayOf( @@ -44,52 +43,22 @@ internal class EndpointConfigCustomization( val sharedEndpointResolver = "#{OldSharedEndpointResolver}<#{Params}>" val resolverTrait = "#{SmithyResolver}<#{Params}>" when (section) { - is ServiceConfig.ConfigStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate( - "pub (crate) endpoint_resolver: $sharedEndpointResolver,", - *codegenScope, - ) - } - } - is ServiceConfig.ConfigImpl -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Returns the endpoint resolver. - pub fn endpoint_resolver(&self) -> #{SharedEndpointResolver} { - self.runtime_components.endpoint_resolver().expect("resolver defaulted if not set") - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the endpoint resolver. - pub fn endpoint_resolver(&self) -> $sharedEndpointResolver { - self.endpoint_resolver.clone() - } - """, - *codegenScope, - ) - } - } - - is ServiceConfig.BuilderStruct -> { - if (runtimeMode.generateMiddleware) { - rustTemplate( - "endpoint_resolver: #{Option}<$sharedEndpointResolver>,", - *codegenScope, - ) - } + rustTemplate( + """ + /// Returns the endpoint resolver. + pub fn endpoint_resolver(&self) -> #{SharedEndpointResolver} { + self.runtime_components.endpoint_resolver().expect("resolver defaulted if not set") + } + """, + *codegenScope, + ) } ServiceConfig.BuilderImpl -> { // if there are no rules, we don't generate a default resolver—we need to also suppress those docs. val defaultResolverDocs = if (typesGenerator.defaultResolver() != null) { - val endpointModule = ClientRustModule.endpoint(codegenContext).fullyQualifiedPath() + val endpointModule = ClientRustModule.Config.endpoint.fullyQualifiedPath() .replace("crate::", "$moduleUseName::") """ /// @@ -181,55 +150,29 @@ internal class EndpointConfigCustomization( *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.config.store_or_unset(endpoint_resolver); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.endpoint_resolver = endpoint_resolver; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { + self.config.store_or_unset(endpoint_resolver); + self + } + """, + *codegenScope, + ) } ServiceConfig.BuilderBuild -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - "#{set_endpoint_resolver}(&mut resolver);", - "set_endpoint_resolver" to setEndpointResolverFn(), - ) - } else { - rustTemplate( - """ - endpoint_resolver: self.endpoint_resolver.unwrap_or_else(|| - #{OldSharedEndpointResolver}::new(#{DefaultResolver}::new()) - ), - """, - *codegenScope, - "DefaultResolver" to defaultResolver(), - ) - } + rustTemplate( + "#{set_endpoint_resolver}(&mut resolver);", + "set_endpoint_resolver" to setEndpointResolverFn(), + ) } is ServiceConfig.OperationConfigOverride -> { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - "#{set_endpoint_resolver}(&mut resolver);", - "set_endpoint_resolver" to setEndpointResolverFn(), - ) - } + rustTemplate( + "#{set_endpoint_resolver}(&mut resolver);", + "set_endpoint_resolver" to setEndpointResolverFn(), + ) } else -> emptySection @@ -242,7 +185,7 @@ internal class EndpointConfigCustomization( // the endpoint resolver will be required (so that it can be unwrapped). return typesGenerator.defaultResolver() ?: RuntimeType.forInlineFun( "MissingResolver", - ClientRustModule.endpoint(codegenContext), + ClientRustModule.Config.endpoint, ) { rustTemplate( """ diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt index c3d136659d3..d752efef95c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt @@ -13,7 +13,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSec import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.letIf /** * Decorator that injects operation-level interceptors that configure an endpoint parameters builder @@ -31,9 +30,7 @@ class EndpointParamsDecorator : ClientCodegenDecorator { operation: OperationShape, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(EndpointParametersCustomization(codegenContext, operation)) - } + baseCustomizations + listOf(EndpointParametersCustomization(codegenContext, operation)) } private class EndpointParametersCustomization( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index 351d205813c..ba197e35f1c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -134,7 +134,7 @@ class EndpointsDecorator : ClientCodegenDecorator { override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val generator = EndpointTypesGenerator.fromContext(codegenContext) - rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) { + rustCrate.withModule(ClientRustModule.Config.endpoint) { withInlineModule(endpointTestsModule(codegenContext), rustCrate.moduleDocProvider) { generator.testGenerator()(this) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt index 779a4eb8d27..561f4885502 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt @@ -38,12 +38,12 @@ import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.orNull // internals contains the actual resolver function -fun endpointImplModule(codegenContext: ClientCodegenContext) = RustModule.private("internals", parent = ClientRustModule.endpoint(codegenContext)) +fun endpointImplModule(codegenContext: ClientCodegenContext) = RustModule.private("internals", parent = ClientRustModule.Config.endpoint) fun endpointTestsModule(codegenContext: ClientCodegenContext) = RustModule.new( "test", visibility = Visibility.PRIVATE, - parent = ClientRustModule.endpoint(codegenContext), + parent = ClientRustModule.Config.endpoint, inline = true, documentationOverride = "", ).cfgTest() @@ -118,15 +118,15 @@ internal class EndpointParamsGenerator( fun setterName(parameterName: String) = "set_${memberName(parameterName)}" } - fun paramsStruct(): RuntimeType = RuntimeType.forInlineFun("Params", ClientRustModule.endpoint(codegenContext)) { + fun paramsStruct(): RuntimeType = RuntimeType.forInlineFun("Params", ClientRustModule.Config.endpoint) { generateEndpointsStruct(this) } - internal fun paramsBuilder(): RuntimeType = RuntimeType.forInlineFun("ParamsBuilder", ClientRustModule.endpoint(codegenContext)) { + internal fun paramsBuilder(): RuntimeType = RuntimeType.forInlineFun("ParamsBuilder", ClientRustModule.Config.endpoint) { generateEndpointParamsBuilder(this) } - private fun paramsError(): RuntimeType = RuntimeType.forInlineFun("InvalidParams", ClientRustModule.endpoint(codegenContext)) { + private fun paramsError(): RuntimeType = RuntimeType.forInlineFun("InvalidParams", ClientRustModule.Config.endpoint) { rust( """ /// An error that occurred during endpoint resolution diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index 2c46cf4bba8..a2c8a581b71 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -110,12 +110,7 @@ class EndpointParamsInterceptorGenerator( val builtInParams = params.toList().filter { it.isBuiltIn } // first load builtins and their defaults builtInParams.forEach { param -> - val config = if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - "cfg" - } else { - "_config" - } - endpointTypesGenerator.builtInFor(param, config)?.also { defaultValue -> + endpointTypesGenerator.builtInFor(param, "cfg")?.also { defaultValue -> rust(".set_${param.name.rustName()}(#W)", defaultValue) } } @@ -173,7 +168,6 @@ class EndpointParamsInterceptorGenerator( endpointTraitBindings.render( this, "_input", - codegenContext.smithyRuntimeMode, ) } rust("cfg.interceptor_state().store_put(endpoint_prefix);") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index a8237205711..502cd47bb3b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -168,7 +168,7 @@ internal class EndpointResolverGenerator( // Now that we rendered the rules once (and then threw it away) we can see what functions we actually used! val fnsUsed = registry.fnsUsed() - return RuntimeType.forInlineFun("DefaultResolver", ClientRustModule.endpoint(codegenContext)) { + return RuntimeType.forInlineFun("DefaultResolver", ClientRustModule.Config.endpoint) { rustTemplate( """ /// The default endpoint resolver diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index df32d161fd1..b7151f67279 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -16,10 +16,6 @@ class ClientRuntimeTypesReExportGenerator( private val rustCrate: RustCrate, ) { fun render() { - if (!codegenContext.smithyRuntimeMode.generateOrchestrator) { - return - } - val rc = codegenContext.runtimeConfig val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(rc) @@ -50,7 +46,7 @@ class ClientRuntimeTypesReExportGenerator( ) } } - rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) { + rustCrate.withModule(ClientRustModule.Config.endpoint) { rustTemplate( """ pub use #{ResolveEndpoint}; diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt index 1741a080354..99c0228c1b1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.EndpointTrait -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.smithy.generators.http.rustFormatString import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -48,7 +47,6 @@ class EndpointTraitBindings( fun render( writer: RustWriter, input: String, - smithyRuntimeMode: SmithyRuntimeMode, generateValidation: Boolean = true, ) { // the Rust format pattern to make the endpoint prefix e.g. "{}.foo" @@ -74,7 +72,7 @@ class EndpointTraitBindings( rust("let $field = &$input.$field;") } if (generateValidation) { - val contents = if (smithyRuntimeMode.generateOrchestrator) { + val contents = // TODO(enableNewSmithyRuntimeCleanup): Remove the allow attribute once all places need .into method """ if $field.is_empty() { @@ -82,13 +80,6 @@ class EndpointTraitBindings( return Err(#{invalidFieldError:W}.into()) } """ - } else { - """ - if $field.is_empty() { - return Err(#{invalidFieldError:W}) - } - """ - } rustTemplate( contents, "invalidFieldError" to OperationBuildError(runtimeConfig).invalidField( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 10f52767f4c..9e17d3ccb3a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -69,9 +69,6 @@ open class OperationGenerator( operationCustomizations, OperationSection.InputImpl(operationCustomizations, operationShape, inputShape, protocol), ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - makeOperationGenerator.generateMakeOperation(this, operationShape, operationCustomizations) - } } renderOperationStruct( @@ -119,109 +116,101 @@ open class OperationGenerator( "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - val additionalPlugins = writable { - writeCustomizations( - operationCustomizations, - OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), - ) + val additionalPlugins = writable { + writeCustomizations( + operationCustomizations, + OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), + ) + } + rustTemplate( + """ + pub(crate) async fn orchestrate( + runtime_plugins: &#{RuntimePlugins}, + input: #{ConcreteInput}, + ) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { + let map_err = |err: #{SdkError}<#{Error}, #{HttpResponse}>| { + err.map_service_error(|err| { + err.downcast::<#{OperationError}>().expect("correct error type") + }) + }; + let context = Self::orchestrate_with_stop_point(runtime_plugins, input, #{StopPoint}::None) + .await + .map_err(map_err)?; + let output = context.finalize().map_err(map_err)?; + #{Ok}(output.downcast::<#{OperationOutput}>().expect("correct output type")) } - rustTemplate( - """ - pub(crate) async fn orchestrate( - runtime_plugins: &#{RuntimePlugins}, - input: #{ConcreteInput}, - ) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - let map_err = |err: #{SdkError}<#{Error}, #{HttpResponse}>| { - err.map_service_error(|err| { - err.downcast::<#{OperationError}>().expect("correct error type") - }) - }; - let context = Self::orchestrate_with_stop_point(runtime_plugins, input, #{StopPoint}::None) - .await - .map_err(map_err)?; - let output = context.finalize().map_err(map_err)?; - #{Ok}(output.downcast::<#{OperationOutput}>().expect("correct output type")) - } - pub(crate) async fn orchestrate_with_stop_point( - runtime_plugins: &#{RuntimePlugins}, - input: #{ConcreteInput}, - stop_point: #{StopPoint}, - ) -> #{Result}<#{InterceptorContext}, #{SdkError}<#{Error}, #{HttpResponse}>> { - let input = #{Input}::erase(input); - #{invoke_with_stop_point}( - ${codegenContext.serviceShape.sdkId().dq()}, - ${operationName.dq()}, - input, - runtime_plugins, - stop_point - ).await - } + pub(crate) async fn orchestrate_with_stop_point( + runtime_plugins: &#{RuntimePlugins}, + input: #{ConcreteInput}, + stop_point: #{StopPoint}, + ) -> #{Result}<#{InterceptorContext}, #{SdkError}<#{Error}, #{HttpResponse}>> { + let input = #{Input}::erase(input); + #{invoke_with_stop_point}( + ${codegenContext.serviceShape.sdkId().dq()}, + ${operationName.dq()}, + input, + runtime_plugins, + stop_point + ).await + } - pub(crate) fn operation_runtime_plugins( - client_runtime_plugins: #{RuntimePlugins}, - client_config: &crate::config::Config, - config_override: #{Option}, - ) -> #{RuntimePlugins} { - let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); - #{additional_runtime_plugins} - if let #{Some}(config_override) = config_override { - for plugin in config_override.runtime_plugins.iter().cloned() { - runtime_plugins = runtime_plugins.with_operation_plugin(plugin); - } - runtime_plugins = runtime_plugins.with_operation_plugin( - crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components) - ); + pub(crate) fn operation_runtime_plugins( + client_runtime_plugins: #{RuntimePlugins}, + client_config: &crate::config::Config, + config_override: #{Option}, + ) -> #{RuntimePlugins} { + let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); + #{additional_runtime_plugins} + if let #{Some}(config_override) = config_override { + for plugin in config_override.runtime_plugins.iter().cloned() { + runtime_plugins = runtime_plugins.with_operation_plugin(plugin); } - runtime_plugins + runtime_plugins = runtime_plugins.with_operation_plugin( + crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components) + ); } - """, - *codegenScope, - "Error" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Error"), - "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::error::OrchestratorError"), - "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), - "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::invoke_with_stop_point"), - "additional_runtime_plugins" to writable { - if (additionalPlugins.isNotEmpty()) { - rustTemplate( - """ - runtime_plugins = runtime_plugins - #{additional_runtime_plugins}; - """, - "additional_runtime_plugins" to additionalPlugins, - ) - } - }, - ) - } + runtime_plugins + } + """, + *codegenScope, + "Error" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Error"), + "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), + "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::error::OrchestratorError"), + "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), + "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::invoke_with_stop_point"), + "additional_runtime_plugins" to writable { + if (additionalPlugins.isNotEmpty()) { + rustTemplate( + """ + runtime_plugins = runtime_plugins + #{additional_runtime_plugins}; + """, + "additional_runtime_plugins" to additionalPlugins, + ) + } + }, + ) writeCustomizations(operationCustomizations, OperationSection.OperationImplBlock(operationCustomizations)) } - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - traitGenerator.generateTraitImpls(operationWriter, operationShape, operationCustomizations) - } - - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - OperationRuntimePluginGenerator(codegenContext).render( - operationWriter, - operationShape, - operationName, - authSchemeOptions, - operationCustomizations, - ) + OperationRuntimePluginGenerator(codegenContext).render( + operationWriter, + operationShape, + operationName, + authSchemeOptions, + operationCustomizations, + ) - ResponseDeserializerGenerator(codegenContext, protocol) - .render(operationWriter, operationShape, operationCustomizations) - RequestSerializerGenerator(codegenContext, protocol, bodyGenerator) - .render(operationWriter, operationShape) + ResponseDeserializerGenerator(codegenContext, protocol) + .render(operationWriter, operationShape, operationCustomizations) + RequestSerializerGenerator(codegenContext, protocol, bodyGenerator) + .render(operationWriter, operationShape) - EndpointParamsInterceptorGenerator(codegenContext) - .render(operationWriter, operationShape) - } + EndpointParamsInterceptorGenerator(codegenContext) + .render(operationWriter, operationShape) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index f68aed2dec5..f935da5e94d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -204,52 +204,26 @@ class PaginatorGenerator private constructor( "items_fn" to itemsFn(), "output_token" to outputTokenLens, "item_type" to writable { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}>>", *codegenScope) - } else { - rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) - } + rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) }, "orchestrate" to writable { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - { - let op = match input.make_operation(&handle.conf) - .await - .map_err(#{SdkError}::construction_failure) { - #{Ok}(op) => op, - #{Err}(e) => { - let _ = tx.send(#{Err}(e)).await; - return; - } - }; - handle.client.call(op).await - } - """, - *codegenScope, - ) - } else { - rustTemplate( - "#{operation}::orchestrate(&runtime_plugins, input.clone()).await", - *codegenScope, - ) - } + rustTemplate( + "#{operation}::orchestrate(&runtime_plugins, input.clone()).await", + *codegenScope, + ) }, "runtime_plugin_init" to writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - let runtime_plugins = #{operation}::operation_runtime_plugins( - handle.runtime_plugins.clone(), - &handle.conf, - #{None}, - ); - """, - *codegenScope, - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - ) - } + rustTemplate( + """ + let runtime_plugins = #{operation}::operation_runtime_plugins( + handle.runtime_plugins.clone(), + &handle.conf, + #{None}, + ); + """, + *codegenScope, + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + ) }, ) } @@ -317,11 +291,7 @@ class PaginatorGenerator private constructor( paginationInfo.itemsMemberPath, ), "item_type" to writable { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}>>", *codegenScope) - } else { - rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) - } + rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) }, *codegenScope, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt index 01cecc49f39..dfdd302a31e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt @@ -47,16 +47,14 @@ class ServiceGenerator( ) serviceConfigGenerator.render(this) - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - // Enable users to opt in to the test-utils in the runtime crate - rustCrate.mergeFeature(TestUtilFeature.copy(deps = listOf("aws-smithy-runtime/test-util"))) + // Enable users to opt in to the test-utils in the runtime crate + rustCrate.mergeFeature(TestUtilFeature.copy(deps = listOf("aws-smithy-runtime/test-util"))) - ServiceRuntimePluginGenerator(codegenContext) - .render(this, decorator.serviceRuntimePluginCustomizations(codegenContext, emptyList())) + ServiceRuntimePluginGenerator(codegenContext) + .render(this, decorator.serviceRuntimePluginCustomizations(codegenContext, emptyList())) - ConfigOverrideRuntimePluginGenerator(codegenContext) - .render(this, decorator.configCustomizations(codegenContext, listOf())) - } + ConfigOverrideRuntimePluginGenerator(codegenContext) + .render(this, decorator.configCustomizations(codegenContext, listOf())) } rustCrate.lib { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 5c2c4e63ebc..8e858b16579 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -33,28 +33,6 @@ class CustomizableOperationGenerator( private val smithyHttp = CargoDependency.smithyHttp(runtimeConfig).toType() private val smithyTypes = CargoDependency.smithyTypes(runtimeConfig).toType() - fun render(crate: RustCrate) { - crate.withModule(ClientRustModule.Client.customize) { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - pub use #{Operation}; - pub use #{Request}; - pub use #{Response}; - pub use #{ClassifyRetry}; - pub use #{RetryKind}; - """, - "Operation" to smithyHttp.resolve("operation::Operation"), - "Request" to smithyHttp.resolve("operation::Request"), - "Response" to smithyHttp.resolve("operation::Response"), - "ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig), - "RetryKind" to smithyTypes.resolve("retry::RetryKind"), - ) - renderCustomizableOperationModule(this) - } - } - } - private fun renderCustomizableOperationModule(writer: RustWriter) { val operationGenerics = RustGenerics(GenericTypeArg("O"), GenericTypeArg("Retry")) val handleGenerics = generics.toRustGenerics() @@ -138,7 +116,7 @@ class CustomizableOperationGenerator( ) } - fun renderForOrchestrator(crate: RustCrate) { + fun render(crate: RustCrate) { val codegenScope = arrayOf( *preludeScope, "CustomizableOperation" to ClientRustModule.Client.customize.toType() @@ -328,72 +306,3 @@ class CustomizableOperationGenerator( } } } - -fun renderCustomizableOperationSend(codegenContext: ClientCodegenContext, generics: FluentClientGenerics, writer: RustWriter) { - val runtimeConfig = codegenContext.runtimeConfig - val smithyHttp = CargoDependency.smithyHttp(runtimeConfig).toType() - val smithyClient = CargoDependency.smithyClient(runtimeConfig).toType() - - val operationGenerics = RustGenerics(GenericTypeArg("O"), GenericTypeArg("Retry")) - val handleGenerics = generics.toRustGenerics() - val combinedGenerics = operationGenerics + handleGenerics - - val codegenScope = arrayOf( - *preludeScope, - "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), - "SdkError" to RuntimeType.sdkError(runtimeConfig), - // TODO(enableNewSmithyRuntimeCleanup): Delete the trait bounds when cleaning up middleware - "ParseHttpResponse" to smithyHttp.resolve("response::ParseHttpResponse"), - "NewRequestPolicy" to smithyClient.resolve("retry::NewRequestPolicy"), - "SmithyRetryPolicy" to smithyClient.resolve("bounds::SmithyRetryPolicy"), - "ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig), - // TODO(enableNewSmithyRuntimeCleanup): Delete the generics when cleaning up middleware - "combined_generics_decl" to combinedGenerics.declaration(), - "handle_generics_bounds" to handleGenerics.bounds(), - ) - - if (generics is FlexibleClientGenerics) { - writer.rustTemplate( - """ - impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} - where - #{handle_generics_bounds:W} - { - /// Sends this operation's request - pub async fn send(self) -> #{Result}> - where - E: std::error::Error + #{Send} + #{Sync} + 'static, - O: #{ParseHttpResponse}> + #{Send} + #{Sync} + #{Clone} + 'static, - Retry: #{Send} + #{Sync} + #{Clone}, - Retry: #{ClassifyRetry}<#{SdkSuccess}, #{SdkError}> + #{Send} + #{Sync} + #{Clone}, - ::Policy: #{SmithyRetryPolicy} + #{Clone}, - { - self.handle.client.call(self.operation).await - } - } - """, - *codegenScope, - ) - } else if (codegenContext.smithyRuntimeMode.generateMiddleware) { - writer.rustTemplate( - """ - impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} - where - #{handle_generics_bounds:W} - { - /// Sends this operation's request - pub async fn send(self) -> #{Result}> - where - E: std::error::Error + #{Send} + #{Sync} + 'static, - O: #{ParseHttpResponse}> + #{Send} + #{Sync} + #{Clone} + 'static, - Retry: #{Send} + #{Sync} + #{Clone}, - Retry: #{ClassifyRetry}<#{SdkSuccess}, #{SdkError}> + #{Send} + #{Sync} + #{Clone}, - { - self.handle.client.call(self.operation).await - } - } - """, - *codegenScope, - ) - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt index 9775a342fb2..9af0bae68f0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt @@ -9,14 +9,12 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section @@ -36,25 +34,13 @@ class FluentClientDecorator : ClientCodegenDecorator { return } - val generics = if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - NoClientGenerics(codegenContext.runtimeConfig) - } else { - FlexibleClientGenerics( - connectorDefault = null, - middlewareDefault = null, - retryDefault = RuntimeType.smithyClient(codegenContext.runtimeConfig).resolve("retry::Standard"), - client = RuntimeType.smithyClient(codegenContext.runtimeConfig), - ) - } + val generics = NoClientGenerics(codegenContext.runtimeConfig) FluentClientGenerator( codegenContext, generics = generics, customizations = listOf(GenericFluentClient(codegenContext)), ).render(rustCrate) - rustCrate.withModule(ClientRustModule.Client.customize) { - renderCustomizableOperationSend(codegenContext, generics, this) - } rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-client/rustls"))) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index dfb7ccf0670..fe6e44793c6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -37,7 +37,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.rustTypeParameters import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable @@ -82,7 +81,6 @@ class FluentClientGenerator( private val model = codegenContext.model private val runtimeConfig = codegenContext.runtimeConfig private val core = FluentClientCore(model) - private val smithyRuntimeMode = codegenContext.smithyRuntimeMode fun render(crate: RustCrate, customizableOperationCustomizations: List = emptyList()) { renderFluentClient(crate) @@ -95,9 +93,6 @@ class FluentClientGenerator( } customizableOperationGenerator.render(crate) - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - customizableOperationGenerator.renderForOrchestrator(crate) - } } private fun renderFluentClient(crate: RustCrate) { @@ -132,120 +127,72 @@ class FluentClientGenerator( "generics_decl" to generics.decl, "smithy_inst" to generics.smithyInst, ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct Handle#{generics_decl:W} { - pub(crate) client: #{client}::Client#{smithy_inst:W}, - pub(crate) conf: crate::Config, - } + rustTemplate( + """ + ##[derive(Debug)] + pub(crate) struct Handle { + pub(crate) conf: crate::Config, + pub(crate) runtime_plugins: #{RuntimePlugins}, + } - #{client_docs:W} - ##[derive(::std::fmt::Debug)] - pub struct Client#{generics_decl:W} { - handle: #{Arc} - } + #{client_docs:W} + ##[derive(#{Clone}, ::std::fmt::Debug)] + pub struct Client { + handle: #{Arc}, + } - impl${generics.inst} #{Clone} for Client${generics.inst} { - fn clone(&self) -> Self { - Self { handle: self.handle.clone() } + impl Client { + /// Creates a new client from the service [`Config`](crate::Config). + /// + /// ## Panics + /// + /// This method will panic if the `conf` has retry or timeouts enabled without a `sleep_impl`. + /// If you experience this panic, it can be fixed by setting the `sleep_impl`, or by disabling + /// retries and timeouts. + pub fn from_conf(conf: crate::Config) -> Self { + let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); + let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); + let sleep_impl = conf.sleep_impl(); + if (retry_config.has_retry() || timeout_config.has_timeouts()) && sleep_impl.is_none() { + panic!("An async sleep implementation is required for retries or timeouts to work. \ + Set the `sleep_impl` on the Config passed into this function to fix this panic."); } - } - impl${generics.inst} From<#{client}::Client#{smithy_inst:W}> for Client${generics.inst} { - fn from(client: #{client}::Client#{smithy_inst:W}) -> Self { - Self::with_config(client, crate::Config::builder().build()) + Self { + handle: #{Arc}::new( + Handle { + conf: conf.clone(), + runtime_plugins: #{base_client_runtime_plugins}(conf), + } + ) } } - impl${generics.inst} Client${generics.inst} { - /// Creates a client with the given service configuration. - pub fn with_config(client: #{client}::Client#{smithy_inst:W}, conf: crate::Config) -> Self { - Self { - handle: #{Arc}::new(Handle { - client, - conf, - }) - } - } - - /// Returns the client's configuration. - pub fn conf(&self) -> &crate::Config { - &self.handle.conf - } - } - """, - *clientScope, - ) - } else { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct Handle { - pub(crate) conf: crate::Config, - pub(crate) runtime_plugins: #{RuntimePlugins}, + /// Returns the client's configuration. + pub fn config(&self) -> &crate::Config { + &self.handle.conf } - #{client_docs:W} - ##[derive(#{Clone}, ::std::fmt::Debug)] - pub struct Client { - handle: #{Arc}, + ##[doc(hidden)] + // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware + // This is currently kept around so the tests still compile in both modes + /// Creates a client with the given service configuration. + pub fn with_config(_client: #{client}::Client, conf: crate::Config) -> Self { + Self::from_conf(conf) } - impl Client { - /// Creates a new client from the service [`Config`](crate::Config). - /// - /// ## Panics - /// - /// This method will panic if the `conf` has retry or timeouts enabled without a `sleep_impl`. - /// If you experience this panic, it can be fixed by setting the `sleep_impl`, or by disabling - /// retries and timeouts. - pub fn from_conf(conf: crate::Config) -> Self { - let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); - let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); - let sleep_impl = conf.sleep_impl(); - if (retry_config.has_retry() || timeout_config.has_timeouts()) && sleep_impl.is_none() { - panic!("An async sleep implementation is required for retries or timeouts to work. \ - Set the `sleep_impl` on the Config passed into this function to fix this panic."); - } - - Self { - handle: #{Arc}::new( - Handle { - conf: conf.clone(), - runtime_plugins: #{base_client_runtime_plugins}(conf), - } - ) - } - } - - /// Returns the client's configuration. - pub fn config(&self) -> &crate::Config { - &self.handle.conf - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware - // This is currently kept around so the tests still compile in both modes - /// Creates a client with the given service configuration. - pub fn with_config(_client: #{client}::Client, conf: crate::Config) -> Self { - Self::from_conf(conf) - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware - // This is currently kept around so the tests still compile in both modes - /// Returns the client's configuration. - pub fn conf(&self) -> &crate::Config { - &self.handle.conf - } + ##[doc(hidden)] + // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware + // This is currently kept around so the tests still compile in both modes + /// Returns the client's configuration. + pub fn conf(&self) -> &crate::Config { + &self.handle.conf } - """, - *clientScope, - "base_client_runtime_plugins" to baseClientRuntimePluginsFn(runtimeConfig), - ) - } + } + """, + *clientScope, + "base_client_runtime_plugins" to baseClientRuntimePluginsFn(runtimeConfig), + ) } operations.forEach { operation -> @@ -346,11 +293,8 @@ class FluentClientGenerator( } """, *preludeScope, - "RawResponseType" to if (codegenContext.smithyRuntimeMode.generateMiddleware) { - RuntimeType.smithyHttp(runtimeConfig).resolve("operation::Response") - } else { - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse") - }, + "RawResponseType" to + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "Operation" to operationSymbol, "OperationError" to errorType, "OperationOutput" to outputType, @@ -382,9 +326,7 @@ class FluentClientGenerator( "Arc" to RuntimeType.Arc, "generics" to generics.decl, ) - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate("config_override: #{Option},", *preludeScope) - } + rustTemplate("config_override: #{Option},", *preludeScope) } rustBlockTemplate( @@ -404,9 +346,7 @@ class FluentClientGenerator( "}", ) { rustTemplate("handle, inner: #{Default}::default(),", *preludeScope) - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate("config_override: #{None},", *preludeScope) - } + rustTemplate("config_override: #{None},", *preludeScope) } } @@ -418,150 +358,89 @@ class FluentClientGenerator( write("&self.inner") } - if (smithyRuntimeMode.generateMiddleware) { - val middlewareScope = arrayOf( - *preludeScope, - "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("CustomizableOperation"), - "ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig), - "Operation" to operationSymbol, - "OperationError" to errorType, - "OperationOutput" to outputType, - "SdkError" to RuntimeType.sdkError(runtimeConfig), - "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), - "send_bounds" to generics.sendBounds(operationSymbol, outputType, errorType, retryClassifier), - "customizable_op_type_params" to rustTypeParameters( - symbolProvider.toSymbol(operation), - retryClassifier, - generics.toRustGenerics(), - ), - ) - if (smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - /// Sends the request and returns the response. - /// - /// If an error occurs, an `SdkError` will be returned with additional details that - /// can be matched against. - /// - /// By default, any retryable failures will be retried twice. Retry behavior - /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be - /// set when configuring the client. - pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}>> - #{send_bounds:W} { - let op = self.inner.build().map_err(#{SdkError}::construction_failure)? - .make_operation(&self.handle.conf) - .await - .map_err(#{SdkError}::construction_failure)?; - self.handle.client.call(op).await - } - - /// Consumes this builder, creating a customizable operation that can be modified before being - /// sent. The operation's inner [http::Request] can be modified as well. - pub async fn customize(self) -> #{Result}< - #{CustomizableOperation}#{customizable_op_type_params:W}, - #{SdkError}<#{OperationError}> - > #{send_bounds:W} { - let handle = self.handle.clone(); - let operation = self.inner.build().map_err(#{SdkError}::construction_failure)? - .make_operation(&handle.conf) - .await - .map_err(#{SdkError}::construction_failure)?; - #{Ok}(#{CustomizableOperation} { handle, operation }) - } - """, - *middlewareScope, - ) + val orchestratorScope = arrayOf( + *preludeScope, + "CustomizableOperation" to ClientRustModule.Client.customize.toType() + .resolve("orchestrator::CustomizableOperation"), + "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::orchestrator::HttpResponse"), + "Operation" to operationSymbol, + "OperationError" to errorType, + "OperationOutput" to outputType, + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + "SendResult" to ClientRustModule.Client.customize.toType() + .resolve("internal::SendResult"), + "SdkError" to RuntimeType.sdkError(runtimeConfig), + ) + rustTemplate( + """ + /// Sends the request and returns the response. + /// + /// If an error occurs, an `SdkError` will be returned with additional details that + /// can be matched against. + /// + /// By default, any retryable failures will be retried twice. Retry behavior + /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be + /// set when configuring the client. + pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { + let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; + let runtime_plugins = #{Operation}::operation_runtime_plugins( + self.handle.runtime_plugins.clone(), + &self.handle.conf, + self.config_override, + ); + #{Operation}::orchestrate(&runtime_plugins, input).await } - } - - if (smithyRuntimeMode.generateOrchestrator) { - val orchestratorScope = arrayOf( - *preludeScope, - "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("orchestrator::CustomizableOperation"), - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::orchestrator::HttpResponse"), - "Operation" to operationSymbol, - "OperationError" to errorType, - "OperationOutput" to outputType, - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "SendResult" to ClientRustModule.Client.customize.toType() - .resolve("internal::SendResult"), - "SdkError" to RuntimeType.sdkError(runtimeConfig), - ) - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sends the request and returns the response. - /// - /// If an error occurs, an `SdkError` will be returned with additional details that - /// can be matched against. - /// - /// By default, any retryable failures will be retried twice. Retry behavior - /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be - /// set when configuring the client. - pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; - let runtime_plugins = #{Operation}::operation_runtime_plugins( - self.handle.runtime_plugins.clone(), - &self.handle.conf, - self.config_override, - ); - #{Operation}::orchestrate(&runtime_plugins, input).await - } - /// Consumes this builder, creating a customizable operation that can be modified before being - /// sent. - // TODO(enableNewSmithyRuntimeCleanup): Remove `async` and `Result` once we switch to orchestrator - pub async fn customize( - self, - ) -> #{Result}< - #{CustomizableOperation}< - #{OperationOutput}, - #{OperationError}, - >, - #{SdkError}<#{OperationError}>, - > - { - #{Ok}(#{CustomizableOperation} { - customizable_send: #{Box}::new(move |config_override| { - #{Box}::pin(async { - self.config_override(config_override) - .send() - .await - }) - }), - config_override: None, - interceptors: vec![], - runtime_plugins: vec![], + /// Consumes this builder, creating a customizable operation that can be modified before being + /// sent. + // TODO(enableNewSmithyRuntimeCleanup): Remove `async` and `Result` once we switch to orchestrator + pub async fn customize( + self, + ) -> #{Result}< + #{CustomizableOperation}< + #{OperationOutput}, + #{OperationError}, + >, + #{SdkError}<#{OperationError}>, + > + { + #{Ok}(#{CustomizableOperation} { + customizable_send: #{Box}::new(move |config_override| { + #{Box}::pin(async { + self.config_override(config_override) + .send() + .await }) - } - """, - *orchestratorScope, - ) + }), + config_override: None, + interceptors: vec![], + runtime_plugins: vec![], + }) } + """, + *orchestratorScope, + ) - rustTemplate( - """ - pub(crate) fn config_override( - mut self, - config_override: impl Into, - ) -> Self { - self.set_config_override(Some(config_override.into())); - self - } + rustTemplate( + """ + pub(crate) fn config_override( + mut self, + config_override: impl Into, + ) -> Self { + self.set_config_override(Some(config_override.into())); + self + } - pub(crate) fn set_config_override( - &mut self, - config_override: Option, - ) -> &mut Self { - self.config_override = config_override; - self - } - """, - ) - } + pub(crate) fn set_config_override( + &mut self, + config_override: Option, + ) -> &mut Self { + self.config_override = config_override; + self + } + """, + ) PaginatorGenerator.paginatorType(codegenContext, generics, operation, retryClassifier) ?.also { paginatorType -> diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt index 2606ff5f439..0408c72d8e6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt @@ -19,7 +19,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomizat */ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext) : NamedCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, "default_provider" to RuntimeType.idempotencyToken(runtimeConfig).resolve("default_provider"), @@ -28,44 +27,18 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext override fun section(section: ServiceConfig): Writable { return when (section) { - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("pub (crate) idempotency_token_provider: #{IdempotencyTokenProvider},", *codegenScope) - } - } - ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Returns a copy of the idempotency token provider. - /// If a random token provider was configured, - /// a newly-randomized token provider will be returned. - pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { - self.config.load::<#{IdempotencyTokenProvider}>().expect("the idempotency provider should be set").clone() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns a copy of the idempotency token provider. - /// If a random token provider was configured, - /// a newly-randomized token provider will be returned. - pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { - self.idempotency_token_provider.clone() - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.generateMiddleware) { - rustTemplate("idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>,", *codegenScope) - } + rustTemplate( + """ + /// Returns a copy of the idempotency token provider. + /// If a random token provider was configured, + /// a newly-randomized token provider will be returned. + pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { + self.config.load::<#{IdempotencyTokenProvider}>().expect("the idempotency provider should be set").clone() + } + """, + *codegenScope, + ) } ServiceConfig.BuilderImpl -> writable { @@ -80,47 +53,27 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext *codegenScope, ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - /// Sets the idempotency token provider to use for service calls that require tokens. - pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { - self.config.store_or_unset(idempotency_token_provider); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the idempotency token provider to use for service calls that require tokens. - pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { - self.idempotency_token_provider = idempotency_token_provider; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the idempotency token provider to use for service calls that require tokens. + pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { + self.config.store_or_unset(idempotency_token_provider); + self + } + """, + *codegenScope, + ) } ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - if !resolver.is_set::<#{IdempotencyTokenProvider}>() { - resolver.config_mut().store_put(#{default_provider}()); - } - """, - *codegenScope, - ) - } else { - rustTemplate( - "idempotency_token_provider: self.idempotency_token_provider.unwrap_or_else(#{default_provider}),", - *codegenScope, - ) - } + rustTemplate( + """ + if !resolver.is_set::<#{IdempotencyTokenProvider}>() { + resolver.config_mut().store_put(#{default_provider}()); + } + """, + *codegenScope, + ) } is ServiceConfig.DefaultForTests -> writable { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index bfa244e8d40..455942df495 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -29,9 +29,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section -import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.letIf /** * [ServiceConfig] is the parent type of sections that can be overridden when generating a config for a service. @@ -191,27 +189,8 @@ fun loadFromConfigBag(innerTypeName: String, newtype: RuntimeType): Writable = w * 3. standard setter (&mut self) */ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext): ConfigCustomization = object : ConfigCustomization() { - private val runtimeMode = codegenContext.smithyRuntimeMode - override fun section(section: ServiceConfig): Writable { return when (section) { - ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - docsOrFallback(param.getterDocs) - val t = when (param.optional) { - true -> param.type.makeOptional() - false -> param.type - } - rust("pub (crate) ${param.name}: #T,", t) - } - } - - ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.generateMiddleware) { - rust("${param.name}: #T,", param.type.makeOptional()) - } - } - ServiceConfig.BuilderImpl -> writable { docsOrFallback(param.setterDocs) rust( @@ -224,35 +203,16 @@ fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext ) docsOrFallback(param.setterDocs) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { - self.config.store_or_unset(${param.name}.map(#{newtype})); - self - } - """, - "T" to param.type, - "newtype" to param.newtype!!, - ) - } else { - rust( - """ - pub fn set_${param.name}(&mut self, ${param.name}: Option<#T>) -> &mut Self { - self.${param.name} = ${param.name}; - self - } - """, - param.type, - ) - } - } - - ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateMiddleware) { - val default = "".letIf(!param.optional) { ".unwrap_or_default() " } - rust("${param.name}: self.${param.name}$default,") - } + rustTemplate( + """ + pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { + self.config.store_or_unset(${param.name}.map(#{newtype})); + self + } + """, + "T" to param.type, + "newtype" to param.newtype!!, + ) } else -> emptySection @@ -305,7 +265,6 @@ class ServiceConfigGenerator( } private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode private val runtimeConfig = codegenContext.runtimeConfig private val enableUserConfigurableRuntimePlugins = codegenContext.enableUserConfigurableRuntimePlugins private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) @@ -329,44 +288,25 @@ class ServiceConfigGenerator( customizations.forEach { it.section(ServiceConfig.ConfigStructAdditionalDocs)(writer) } - Attribute(Attribute.derive(RuntimeType.Clone)).render(writer) - if (runtimeMode.generateOrchestrator) { - Attribute(Attribute.derive(RuntimeType.Debug)).render(writer) - } + Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) writer.rustBlock("pub struct Config") { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - // Both `config` and `cloneable` are the same config, but the cloneable one - // is kept around so that it is possible to convert back into a builder. This can be - // optimized in the future. - pub(crate) config: #{FrozenLayer}, - cloneable: #{CloneableLayer}, - pub(crate) runtime_components: #{RuntimeComponentsBuilder}, - pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, - """, - *codegenScope, - ) - } + rustTemplate( + """ + // Both `config` and `cloneable` are the same config, but the cloneable one + // is kept around so that it is possible to convert back into a builder. This can be + // optimized in the future. + pub(crate) config: #{FrozenLayer}, + cloneable: #{CloneableLayer}, + pub(crate) runtime_components: #{RuntimeComponentsBuilder}, + pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + """, + *codegenScope, + ) customizations.forEach { it.section(ServiceConfig.ConfigStruct)(this) } } - if (runtimeMode.generateMiddleware) { - // Custom implementation for Debug so we don't need to enforce Debug down the chain - writer.rustBlock("impl std::fmt::Debug for Config") { - writer.rustTemplate( - """ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut config = f.debug_struct("Config"); - config.finish() - } - """, - ) - } - } - writer.rustBlock("impl Config") { writer.rustTemplate( """ @@ -374,75 +314,53 @@ class ServiceConfigGenerator( pub fn builder() -> Builder { Builder::default() } """, ) - if (runtimeMode.generateOrchestrator) { - writer.rustTemplate( - """ - /// Converts this config back into a builder so that it can be tweaked. - pub fn to_builder(&self) -> Builder { - Builder { - config: self.cloneable.clone(), - runtime_components: self.runtime_components.clone(), - runtime_plugins: self.runtime_plugins.clone(), - } + writer.rustTemplate( + """ + /// Converts this config back into a builder so that it can be tweaked. + pub fn to_builder(&self) -> Builder { + Builder { + config: self.cloneable.clone(), + runtime_components: self.runtime_components.clone(), + runtime_plugins: self.runtime_plugins.clone(), } - """, - ) - } + } + """, + ) customizations.forEach { it.section(ServiceConfig.ConfigImpl)(this) } } writer.docs("Builder for creating a `Config`.") - if (runtimeMode.generateMiddleware) { - Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Default)).render(writer) - } else { - Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) - } + Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) writer.rustBlock("pub struct Builder") { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - pub(crate) config: #{CloneableLayer}, - pub(crate) runtime_components: #{RuntimeComponentsBuilder}, - pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub(crate) config: #{CloneableLayer}, + pub(crate) runtime_components: #{RuntimeComponentsBuilder}, + pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + """, + *codegenScope, + ) customizations.forEach { it.section(ServiceConfig.BuilderStruct)(this) } } - if (runtimeMode.generateMiddleware) { - // Custom implementation for Debug so we don't need to enforce Debug down the chain - writer.rustBlock("impl std::fmt::Debug for Builder") { - writer.rustTemplate( - """ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut config = f.debug_struct("Builder"); - config.finish() - } - """, - ) - } - } else { - // Custom implementation of Default to give the runtime components builder a name - writer.rustBlockTemplate("impl #{Default} for Builder", *codegenScope) { - writer.rustTemplate( - """ - fn default() -> Self { - Self { - config: #{Default}::default(), - runtime_components: #{RuntimeComponentsBuilder}::new("service config"), - runtime_plugins: #{Default}::default(), - } + // Custom implementation of Default to give the runtime components builder a name + writer.rustBlockTemplate("impl #{Default} for Builder", *codegenScope) { + writer.rustTemplate( + """ + fn default() -> Self { + Self { + config: #{Default}::default(), + runtime_components: #{RuntimeComponentsBuilder}::new("service config"), + runtime_plugins: #{Default}::default(), } - """, - *codegenScope, - ) - } + } + """, + *codegenScope, + ) } writer.rustBlock("impl Builder") { @@ -452,32 +370,30 @@ class ServiceConfigGenerator( it.section(ServiceConfig.BuilderImpl)(this) } - if (runtimeMode.generateOrchestrator) { - val visibility = if (enableUserConfigurableRuntimePlugins) { "pub" } else { "pub(crate)" } + val visibility = if (enableUserConfigurableRuntimePlugins) { "pub" } else { "pub(crate)" } - docs("Adds a runtime plugin to the config.") - if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } - rustTemplate( - """ - $visibility fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { - self.push_runtime_plugin(#{SharedRuntimePlugin}::new(plugin)); - self - } - """, - *codegenScope, - ) - docs("Adds a runtime plugin to the config.") - if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } - rustTemplate( - """ - $visibility fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { - self.runtime_plugins.push(plugin); - self - } - """, - *codegenScope, - ) - } + docs("Adds a runtime plugin to the config.") + if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } + rustTemplate( + """ + $visibility fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { + self.push_runtime_plugin(#{SharedRuntimePlugin}::new(plugin)); + self + } + """, + *codegenScope, + ) + docs("Adds a runtime plugin to the config.") + if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } + rustTemplate( + """ + $visibility fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { + self.runtime_plugins.push(plugin); + self + } + """, + *codegenScope, + ) val testUtilOnly = Attribute(Attribute.cfg(Attribute.any(Attribute.feature(TestUtilFeature.name), writable("test")))) @@ -498,41 +414,31 @@ class ServiceConfigGenerator( } docs("Builds a [`Config`].") - if (runtimeMode.generateOrchestrator) { - rust("##[allow(unused_mut)]") - rustBlock("pub fn build(mut self) -> Config") { + rust("##[allow(unused_mut)]") + rustBlock("pub fn build(mut self) -> Config") { + rustTemplate( + """ + let mut layer = self.config; + let mut resolver = #{Resolver}::initial(&mut layer, &mut self.runtime_components); + """, + *codegenScope, + ) + customizations.forEach { + it.section(ServiceConfig.BuilderBuild)(this) + } + rustBlock("Config") { + customizations.forEach { + it.section(ServiceConfig.BuilderBuildExtras)(this) + } rustTemplate( """ - let mut layer = self.config; - let mut resolver = #{Resolver}::initial(&mut layer, &mut self.runtime_components); + config: #{Layer}::from(layer.clone()).with_name("$moduleUseName::config::Config").freeze(), + cloneable: layer, + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, """, *codegenScope, ) - customizations.forEach { - it.section(ServiceConfig.BuilderBuild)(this) - } - rustBlock("Config") { - customizations.forEach { - it.section(ServiceConfig.BuilderBuildExtras)(this) - } - rustTemplate( - """ - config: #{Layer}::from(layer.clone()).with_name("$moduleUseName::config::Config").freeze(), - cloneable: layer, - runtime_components: self.runtime_components, - runtime_plugins: self.runtime_plugins, - """, - *codegenScope, - ) - } - } - } else { - rustBlock("pub fn build(self) -> Config") { - rustBlock("Config") { - customizations.forEach { - it.section(ServiceConfig.BuilderBuild)(this) - } - } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 2f994788fe0..34a6c7b1f00 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -70,34 +70,16 @@ class DefaultProtocolTestGenerator( override val operationShape: OperationShape, private val renderClientCreation: RustWriter.(ClientCreationParams) -> Unit = { params -> - if (params.codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - let smithy_client = #{Builder}::new() - .connector(${params.connectorName}) - .middleware(#{MapRequestLayer}::for_mapper(#{SmithyEndpointStage}::new())) - .build(); - let ${params.clientName} = #{Client}::with_config(smithy_client, ${params.configBuilderName}.build()); - """, - "Client" to ClientRustModule.root.toType().resolve("Client"), - "Builder" to ClientRustModule.client.toType().resolve("Builder"), - "SmithyEndpointStage" to RT.smithyHttp(codegenContext.runtimeConfig) - .resolve("endpoint::middleware::SmithyEndpointStage"), - "MapRequestLayer" to RT.smithyHttpTower(codegenContext.runtimeConfig) - .resolve("map_request::MapRequestLayer"), - ) - } else { - rustTemplate( - """ - let ${params.clientName} = #{Client}::from_conf( - ${params.configBuilderName} - .http_connector(${params.connectorName}) - .build() - ); - """, - "Client" to ClientRustModule.root.toType().resolve("Client"), - ) - } + rustTemplate( + """ + let ${params.clientName} = #{Client}::from_conf( + ${params.configBuilderName} + .http_connector(${params.connectorName}) + .build() + ); + """, + "Client" to ClientRustModule.root.toType().resolve("Client"), + ) }, ) : ProtocolTestGenerator { private val rc = codegenContext.runtimeConfig @@ -258,7 +240,7 @@ class DefaultProtocolTestGenerator( instantiator.render(this@renderHttpRequestTestCase, inputShape, httpRequestTestCase.params) } withBlock("let endpoint_prefix = Some({", "}.unwrap());") { - bindings.render(this, "input", codegenContext.smithyRuntimeMode, generateValidation = false) + bindings.render(this, "input", generateValidation = false) } } } @@ -347,62 +329,38 @@ class DefaultProtocolTestGenerator( """, RT.sdkBody(runtimeConfig = rc), ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust( - "let mut op_response = #T::new(http_response);", - RT.operationModule(rc).resolve("Response"), - ) - rustTemplate( - """ - use #{parse_http_response}; - let parser = #{op}::new(); - let parsed = parser.parse_unloaded(&mut op_response); - let parsed = parsed.unwrap_or_else(|| { - let (http_response, _) = op_response.into_parts(); - let http_response = http_response.map(|body|#{copy_from_slice}(body.bytes().unwrap())); - <#{op} as #{parse_http_response}>::parse_loaded(&parser, &http_response) - }); - """, - "op" to operationSymbol, - "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), - "parse_http_response" to RT.parseHttpResponse(rc), - ) - } else { - rustTemplate( - """ - use #{ResponseDeserializer}; - use #{RuntimePlugin}; - - let op = #{Operation}::new(); - let config = op.config().expect("the operation has config"); - let de = config.load::<#{SharedResponseDeserializer}>().expect("the config must have a deserializer"); - - let parsed = de.deserialize_streaming(&mut http_response); - let parsed = parsed.unwrap_or_else(|| { - let http_response = http_response.map(|body| { - #{SdkBody}::from(#{copy_from_slice}(body.bytes().unwrap())) - }); - de.deserialize_nonstreaming(&http_response) + rustTemplate( + """ + use #{ResponseDeserializer}; + use #{RuntimePlugin}; + + let op = #{Operation}::new(); + let config = op.config().expect("the operation has config"); + let de = config.load::<#{SharedResponseDeserializer}>().expect("the config must have a deserializer"); + + let parsed = de.deserialize_streaming(&mut http_response); + let parsed = parsed.unwrap_or_else(|| { + let http_response = http_response.map(|body| { + #{SdkBody}::from(#{copy_from_slice}(body.bytes().unwrap())) }); - """, - "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), - "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), - "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), - "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), - "RuntimePlugin" to RT.runtimePlugin(rc), - "SdkBody" to RT.sdkBody(rc), - ) - } + de.deserialize_nonstreaming(&http_response) + }); + """, + "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), + "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), + "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), + "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), + "RuntimePlugin" to RT.runtimePlugin(rc), + "SdkBody" to RT.sdkBody(rc), + ) if (expectedShape.hasTrait()) { val errorSymbol = codegenContext.symbolProvider.symbolForOperationError(operationShape) val errorVariant = codegenContext.symbolProvider.toSymbol(expectedShape).name rust("""let parsed = parsed.expect_err("should be error response");""") - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """let parsed: &#{Error} = parsed.as_operation_error().expect("operation error").downcast_ref().unwrap();""", - "Error" to codegenContext.symbolProvider.symbolForOperationError(operationShape), - ) - } + rustTemplate( + """let parsed: &#{Error} = parsed.as_operation_error().expect("operation error").downcast_ref().unwrap();""", + "Error" to codegenContext.symbolProvider.symbolForOperationError(operationShape), + ) rustBlock("if let #T::$errorVariant(parsed) = parsed", errorSymbol) { compareMembers(expectedShape) } @@ -410,14 +368,10 @@ class DefaultProtocolTestGenerator( rust("panic!(\"wrong variant: Got: {:?}. Expected: {:?}\", parsed, expected_output);") } } else { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust("let parsed = parsed.unwrap();") - } else { - rustTemplate( - """let parsed = parsed.expect("should be successful response").downcast::<#{Output}>().unwrap();""", - "Output" to codegenContext.symbolProvider.toSymbol(expectedShape), - ) - } + rustTemplate( + """let parsed = parsed.expect("should be successful response").downcast::<#{Output}>().unwrap();""", + "Output" to codegenContext.symbolProvider.toSymbol(expectedShape), + ) compareMembers(outputShape) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt index dbfa3b3c6cf..0c889318f99 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt @@ -30,76 +30,34 @@ fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): return object : ConfigCustomization() { override fun section(section: ServiceConfig): Writable = writable { when (section) { - ServiceConfig.ConfigStruct -> { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust("_$name: u64,") - } - } ServiceConfig.ConfigImpl -> { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn $name(&self) -> u64 { - self.config.load::<#{T}>().map(|u| u.0).unwrap() - } - """, - "T" to configParamNewtype( - "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } else { - rust( - """ - ##[allow(missing_docs)] - pub fn $name(&self) -> u64 { - self._$name - } - """, - ) - } - } - ServiceConfig.BuilderStruct -> { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust("_$name: Option,") - } + rustTemplate( + """ + ##[allow(missing_docs)] + pub fn $name(&self) -> u64 { + self.config.load::<#{T}>().map(|u| u.0).unwrap() + } + """, + "T" to configParamNewtype( + "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), + codegenContext.runtimeConfig, + ), + ) } ServiceConfig.BuilderImpl -> { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - /// docs! - pub fn $name(mut self, $name: u64) -> Self { - self.config.store_put(#{T}($name)); - self - } - """, - "T" to configParamNewtype( - "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } else { - rust( - """ - /// docs! - pub fn $name(mut self, $name: u64) -> Self { - self._$name = Some($name); - self - } - """, - ) - } - } - ServiceConfig.BuilderBuild -> { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust( - """ - _$name: self._$name.unwrap_or(123), - """, - ) - } + rustTemplate( + """ + /// docs! + pub fn $name(mut self, $name: u64) -> Self { + self.config.store_put(#{T}($name)); + self + } + """, + "T" to configParamNewtype( + "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), + codegenContext.runtimeConfig, + ), + ) } else -> emptySection } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt index 866cd7461fd..72cffe2d131 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt @@ -15,7 +15,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientModuleProvider import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig @@ -91,9 +90,6 @@ fun testClientCodegenContext( rootDecorator ?: CombinedClientCodegenDecorator(emptyList()), ) -fun ClientCodegenContext.withSmithyRuntimeMode(smithyRuntimeMode: SmithyRuntimeMode): ClientCodegenContext = - copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableNewSmithyRuntime = smithyRuntimeMode))) - fun ClientCodegenContext.withEnableUserConfigurableRuntimePlugins(enableUserConfigurableRuntimePlugins: Boolean): ClientCodegenContext = copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableUserConfigurableRuntimePlugins = enableUserConfigurableRuntimePlugins))) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt deleted file mode 100644 index a6da0a29a33..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings -import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.integrationTest -import software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings - -// TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by HttpAuthDecoratorTest) -internal class ApiKeyAuthDecoratorTest { - private val modelQuery = """ - namespace test - - use aws.api#service - use aws.protocols#restJson1 - - @service(sdkId: "Test Api Key Auth") - @restJson1 - @httpApiKeyAuth(name: "api_key", in: "query") - @auth([httpApiKeyAuth]) - service TestService { - version: "2023-01-01", - operations: [SomeOperation] - } - - structure SomeOutput { - someAttribute: Long, - someVal: String - } - - @http(uri: "/SomeOperation", method: "GET") - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() - - @Test - fun `set an api key in query parameter`() { - val testDir = clientIntegrationTest( - modelQuery, - // just run integration tests - TestCodegenSettings.middlewareModeTestParams - .copy(command = { "cargo test --test *".runWithWarnings(it) }), - ) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("api_key_present_in_property_bag") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn api_key_present_in_property_bag() { - use aws_smithy_http_auth::api_key::AuthApiKey; - let api_key_value = "some-api-key"; - let conf = $moduleName::Config::builder() - .api_key(AuthApiKey::new(api_key_value)) - .build(); - let operation = $moduleName::operation::some_operation::SomeOperationInput::builder() - .build() - .expect("input is valid") - .make_operation(&conf) - .await - .expect("valid operation"); - let props = operation.properties(); - let api_key_config = props.get::().expect("api key in the bag"); - assert_eq!( - api_key_config, - &AuthApiKey::new(api_key_value), - ); - } - """, - ) - } - - rustCrate.integrationTest("api_key_auth_is_set_in_query") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn api_key_auth_is_set_in_query() { - use aws_smithy_http_auth::api_key::AuthApiKey; - let api_key_value = "some-api-key"; - let conf = $moduleName::Config::builder() - .api_key(AuthApiKey::new(api_key_value)) - .build(); - let operation = $moduleName::operation::some_operation::SomeOperationInput::builder() - .build() - .expect("input is valid") - .make_operation(&conf) - .await - .expect("valid operation"); - assert_eq!( - operation.request().uri().query(), - Some("api_key=some-api-key"), - ); - } - """, - ) - } - } - "cargo clippy".runWithWarnings(testDir) - } - - private val modelHeader = """ - namespace test - - use aws.api#service - use aws.protocols#restJson1 - - @service(sdkId: "Test Api Key Auth") - @restJson1 - @httpApiKeyAuth(name: "authorization", in: "header", scheme: "ApiKey") - @auth([httpApiKeyAuth]) - service TestService { - version: "2023-01-01", - operations: [SomeOperation] - } - - structure SomeOutput { - someAttribute: Long, - someVal: String - } - - @http(uri: "/SomeOperation", method: "GET") - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() - - @Test - fun `set an api key in http header`() { - val testDir = clientIntegrationTest( - modelHeader, - // just run integration tests - TestCodegenSettings.middlewareModeTestParams - .copy(command = { "cargo test --test *".runWithWarnings(it) }), - ) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("api_key_auth_is_set_in_http_header") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn api_key_auth_is_set_in_http_header() { - use aws_smithy_http_auth::api_key::AuthApiKey; - let api_key_value = "some-api-key"; - let conf = $moduleName::Config::builder() - .api_key(AuthApiKey::new(api_key_value)) - .build(); - let operation = $moduleName::operation::some_operation::SomeOperationInput::builder() - .build() - .expect("input is valid") - .make_operation(&conf) - .await - .expect("valid operation"); - let props = operation.properties(); - let api_key_config = props.get::().expect("api key in the bag"); - assert_eq!( - api_key_config, - &AuthApiKey::new(api_key_value), - ); - assert_eq!( - operation.request().headers().contains_key("authorization"), - true, - ); - } - """, - ) - } - } - "cargo clippy".runWithWarnings(testDir) - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt deleted file mode 100644 index 602e8482610..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings -import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.integrationTest - -// If any of these tests fail, and you want to understand why, run them with logging: -// ``` -// ./gradlew codegen-client:test --tests software.amazon.smithy.rust.codegen.client.HttpVersionListGeneratorTest --info -// ``` - -// TODO(enableNewSmithyRuntimeCleanup): Delete this test (incomplete http version support wasn't ported to orchestrator) -internal class HttpVersionListGeneratorTest { - @Test - fun `http version list integration test (no preferred version)`() { - val model = """ - namespace com.example - - use aws.protocols#awsJson1_0 - - @awsJson1_0 - @aws.api#service(sdkId: "Test", endpointPrefix: "differentPrefix") - service TestService { - operations: [SayHello], - version: "1" - } - - @endpoint(hostPrefix: "test123.{greeting}.") - operation SayHello { - input: SayHelloInput - } - - structure SayHelloInput { - @required - @hostLabel - greeting: String - } - """.asSmithyModel() - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("http_version_list") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_http_version_list_defaults() { - let conf = $moduleName::Config::builder().build(); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hello") - .build().expect("valid operation") - .make_operation(&conf).await.expect("hello is a valid prefix"); - let properties = op.properties(); - let actual_http_versions = properties.get::>() - .expect("http versions list should be in property bag"); - let expected_http_versions = &vec![http::Version::HTTP_11]; - assert_eq!(actual_http_versions, expected_http_versions); - } - """, - ) - } - } - } - - @Test - fun `http version list integration test (http)`() { - val model = """ - namespace com.example - - use aws.protocols#restJson1 - - @restJson1(http: ["http/1.1", "h2"]) - @aws.api#service(sdkId: "Test", endpointPrefix: "differentPrefix") - service TestService { - operations: [SayHello], - version: "1" - } - - @http(method: "PUT", uri: "/input", code: 200) - @idempotent - @endpoint(hostPrefix: "test123.{greeting}.") - operation SayHello { - input: SayHelloInput - } - - structure SayHelloInput { - @required - @hostLabel - greeting: String - } - """.asSmithyModel() - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("validate_http") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_http_version_list_defaults() { - let conf = $moduleName::Config::builder().build(); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hello") - .build().expect("valid operation") - .make_operation(&conf).await.expect("hello is a valid prefix"); - let properties = op.properties(); - let actual_http_versions = properties.get::>() - .expect("http versions list should be in property bag"); - let expected_http_versions = &vec![http::Version::HTTP_11, http::Version::HTTP_2]; - assert_eq!(actual_http_versions, expected_http_versions); - } - """, - ) - } - } - } - - @Test - fun `http version list integration test (eventStreamHttp)`() { - val model = """ - namespace com.example - - use aws.protocols#restJson1 - - @restJson1(http: ["h2", "http/1.1"], eventStreamHttp: ["h2"]) - @aws.api#service(sdkId: "Test") - service TestService { - operations: [SayHello], - version: "1" - } - - @idempotent - @http(uri: "/test", method: "PUT") - operation SayHello { - input: SayHelloInput, - output: SayHelloOutput - } - - structure SayHelloInput {} - - structure SayHelloOutput { - @httpPayload - greeting: SomeStream - } - - structure Something { stuff: SomethingElse } - - structure SomethingElse { - version: String - } - - @streaming - union SomeStream { - Something: Something, - } - """.asSmithyModel() - - clientIntegrationTest( - model, - TestCodegenSettings.middlewareModeTestParams.copy(addModuleToEventStreamAllowList = true), - ) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("validate_eventstream_http") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_http_version_list_defaults() { - let conf = $moduleName::Config::builder().build(); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .build().expect("valid operation") - .make_operation(&conf).await.unwrap(); - let properties = op.properties(); - let actual_http_versions = properties.get::>() - .expect("http versions list should be in property bag"); - let expected_http_versions = &vec![http::Version::HTTP_2]; - assert_eq!(actual_http_versions, expected_http_versions); - } - """, - ) - } - } - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt index b855c313669..92c4179607f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt @@ -5,13 +5,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode +import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace @@ -34,76 +30,54 @@ class ClientContextConfigCustomizationTest { service TestService { operations: [] } """.asSmithyModel() - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `client params generate a valid customization`(smithyRuntimeModeStr: String) { + @Test + fun `client params generate a valid customization`() { val project = TestWorkspace.testProject() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val context = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) + val context = testClientCodegenContext(model) project.unitTest { - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - use #{RuntimePlugin}; - let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); - assert_eq!( - conf.config - .load::() - .map(|u| u.0.clone()) - .unwrap(), - "hello!" - ); - assert_eq!( - conf.config - .load::() - .map(|u| u.0), - Some(true) - ); - """, - "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), - ) - } else { - rust( - """ - let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); - assert_eq!(conf.a_string_param.unwrap(), "hello!"); - assert_eq!(conf.a_bool_param, Some(true)); - """, - ) - } + rustTemplate( + """ + use #{RuntimePlugin}; + let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); + assert_eq!( + conf.config + .load::() + .map(|u| u.0.clone()) + .unwrap(), + "hello!" + ); + assert_eq!( + conf.config + .load::() + .map(|u| u.0), + Some(true) + ); + """, + "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), + ) } // unset fields project.unitTest { - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate( - """ - use #{RuntimePlugin}; - let conf = crate::Config::builder().a_string_param("hello!").build(); - assert_eq!( - conf.config - .load::() - .map(|u| u.0.clone()) - .unwrap(), - "hello!" - ); - assert_eq!( - conf.config - .load::() - .map(|u| u.0), - None, - ); - """, - "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), - ) - } else { - rust( - """ - let conf = crate::Config::builder().a_string_param("hello!").build(); - assert_eq!(conf.a_string_param.unwrap(), "hello!"); - assert_eq!(conf.a_bool_param, None); - """, - ) - } + rustTemplate( + """ + use #{RuntimePlugin}; + let conf = crate::Config::builder().a_string_param("hello!").build(); + assert_eq!( + conf.config + .load::() + .map(|u| u.0.clone()) + .unwrap(), + "hello!" + ); + assert_eq!( + conf.config + .load::() + .map(|u| u.0), + None, + ); + """, + "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), + ) } validateConfigCustomizations(context, ClientContextConfigCustomization(context), project) } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 9d2e74c1b74..1836a090bb6 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.string.shouldContain import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -121,56 +120,6 @@ class EndpointsDecoratorTest { } """.asSmithyModel() - // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by the second @Test below) - @Test - fun `set an endpoint in the property bag`() { - val testDir = clientIntegrationTest( - model, - // Just run integration tests. - TestCodegenSettings.middlewareModeTestParams - .copy(command = { "cargo test --test *".runWithWarnings(it) }), - ) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("endpoint_params_test") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn endpoint_params_are_set() { - let conf = $moduleName::Config::builder().a_string_param("hello").a_bool_param(false).build(); - let operation = $moduleName::operation::test_operation::TestOperationInput::builder() - .bucket("bucket-name").build().expect("input is valid") - .make_operation(&conf).await.expect("valid operation"); - use $moduleName::endpoint::{Params}; - use aws_smithy_http::endpoint::Result; - let props = operation.properties(); - let endpoint_result = dbg!(props.get::().expect("endpoint result in the bag")); - let endpoint_params = props.get::().expect("endpoint params in the bag"); - let endpoint = endpoint_result.as_ref().expect("endpoint resolved properly"); - assert_eq!( - endpoint_params, - &Params::builder() - .bucket("bucket-name".to_string()) - .built_in_with_default("some-default") - .bool_built_in_with_default(true) - .a_bool_param(false) - .a_string_param("hello".to_string()) - .region("us-east-2".to_string()) - .build().unwrap() - ); - - assert_eq!(endpoint.url(), "https://www.us-east-2.example.com"); - } - """, - ) - } - } - // the model has an intentionally failing test—ensure it fails - val failure = shouldThrow { "cargo test".runWithWarnings(testDir) } - failure.output shouldContain "endpoint::test::test_1" - failure.output shouldContain "https://failingtest.com" - "cargo clippy".runWithWarnings(testDir) - } - @Test fun `resolve endpoint`() { val testDir = clientIntegrationTest( diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index 845501945b4..430ff4737ed 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -7,12 +7,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.EndpointTrait -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -40,10 +36,8 @@ internal class EndpointTraitBindingsTest { epTrait.prefixFormatString() shouldBe ("\"{foo}.data\"") } - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generate endpoint prefixes`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) + @Test + fun `generate endpoint prefixes`() { val model = """ namespace test @readonly @@ -81,7 +75,7 @@ internal class EndpointTraitBindingsTest { RuntimeType.smithyHttp(TestRuntimeConfig), TestRuntimeConfig.operationBuildError(), ) { - endpointBindingGenerator.render(this, "self", smithyRuntimeMode) + endpointBindingGenerator.render(this, "self") } } unitTest( @@ -123,56 +117,6 @@ internal class EndpointTraitBindingsTest { project.compileAndTest() } - // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by the @Test below it) - @ExperimentalPathApi - @Test - fun `endpoint integration test middleware`() { - val model = """ - namespace com.example - use aws.protocols#awsJson1_0 - @awsJson1_0 - @aws.api#service(sdkId: "Test", endpointPrefix: "differentprefix") - service TestService { - operations: [SayHello], - version: "1" - } - @endpoint(hostPrefix: "test123.{greeting}.") - operation SayHello { - input: SayHelloInput - } - structure SayHelloInput { - @required - @hostLabel - greeting: String - } - """.asSmithyModel() - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("test_endpoint_prefix") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_endpoint_prefix() { - let conf = $moduleName::Config::builder().build(); - $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hey there!").build().expect("input is valid") - .make_operation(&conf).await.expect_err("no spaces or exclamation points in ep prefixes"); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hello") - .build().expect("valid operation") - .make_operation(&conf).await.expect("hello is a valid prefix"); - let properties = op.properties(); - let prefix = properties.get::() - .expect("prefix should be in config") - .as_str(); - assert_eq!(prefix, "test123.hello."); - } - """, - ) - } - } - } - @ExperimentalPathApi @Test fun `endpoint integration test`() { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index abda9bf6330..3da4f1656ea 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -13,9 +13,7 @@ import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel @@ -85,7 +83,7 @@ class FluentClientGeneratorTest { let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() .endpoint_resolver("http://localhost:1234") - #{set_http_connector} + .http_connector(connector.clone()) .build(); let smithy_client = aws_smithy_client::Builder::new() .connector(connector.clone()) @@ -100,11 +98,6 @@ class FluentClientGeneratorTest { .withFeature("test-util").toType() .resolve("test_connection::TestConnection"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - "set_http_connector" to writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rust(".http_connector(connector.clone())") - } - }, ) } } @@ -128,7 +121,7 @@ class FluentClientGeneratorTest { let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() .endpoint_resolver("http://localhost:1234") - #{set_http_connector} + .http_connector(connector.clone()) .build(); let smithy_client = aws_smithy_client::Builder::new() .connector(connector.clone()) @@ -147,11 +140,6 @@ class FluentClientGeneratorTest { .withFeature("test-util").toType() .resolve("test_connection::TestConnection"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - "set_http_connector" to writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rust(".http_connector(connector.clone())") - } - }, ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt index 2ae469608e2..920c0c21e96 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt @@ -5,21 +5,16 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.config -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode +import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel class IdempotencyTokenProviderCustomizationTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) + @Test + fun `generates a valid config`() { val model = "namespace test".asSmithyModel() - val codegenContext = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) + val codegenContext = testClientCodegenContext(model) validateConfigCustomizations( codegenContext, IdempotencyTokenProviderCustomization(codegenContext), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index fc439f764c3..ae8adb702b1 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -12,12 +12,9 @@ import org.junit.jupiter.params.provider.ValueSource import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext import software.amazon.smithy.rust.codegen.client.testutil.withEnableUserConfigurableRuntimePlugins -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -90,69 +87,40 @@ internal class ServiceConfigGeneratorTest { fun `generate customizations as specified`(smithyRuntimeModeStr: String) { class ServiceCustomizer(private val codegenContext: ClientCodegenContext) : NamedCustomization() { - private val runtimeMode = codegenContext.smithyRuntimeMode override fun section(section: ServiceConfig): Writable { return when (section) { ServiceConfig.ConfigStructAdditionalDocs -> emptySection - ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.generateMiddleware) { - rust("config_field: u64,") - } - } ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn config_field(&self) -> u64 { - self.config.load::<#{T}>().map(|u| u.0).unwrap() - } - """, - "T" to configParamNewtype( - "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } else { - rust( - """ - ##[allow(missing_docs)] - pub fn config_field(&self) -> u64 { - self.config_field - } - """, - ) - } + rustTemplate( + """ + ##[allow(missing_docs)] + pub fn config_field(&self) -> u64 { + self.config.load::<#{T}>().map(|u| u.0).unwrap() + } + """, + "T" to configParamNewtype( + "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), + codegenContext.runtimeConfig, + ), + ) } - ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.generateMiddleware) { - rust("config_field: Option") - } - } ServiceConfig.BuilderImpl -> writable { - if (runtimeMode.generateOrchestrator) { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn config_field(mut self, config_field: u64) -> Self { - self.config.store_put(#{T}(config_field)); - self - } - """, - "T" to configParamNewtype( - "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } - } - ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.generateMiddleware) { - rust("config_field: self.config_field.unwrap_or_default(),") - } + rustTemplate( + """ + ##[allow(missing_docs)] + pub fn config_field(mut self, config_field: u64) -> Self { + self.config.store_put(#{T}(config_field)); + self + } + """, + "T" to configParamNewtype( + "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), + codegenContext.runtimeConfig, + ), + ) } else -> emptySection @@ -161,57 +129,43 @@ internal class ServiceConfigGeneratorTest { } val model = "namespace empty".asSmithyModel() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) val codegenContext = testClientCodegenContext(model) - .withSmithyRuntimeMode(smithyRuntimeMode) .withEnableUserConfigurableRuntimePlugins(true) val sut = ServiceConfigGenerator(codegenContext, listOf(ServiceCustomizer(codegenContext))) val symbolProvider = codegenContext.symbolProvider val project = TestWorkspace.testProject(symbolProvider) project.withModule(ClientRustModule.config) { sut.render(this) - if (smithyRuntimeMode.generateOrchestrator) { - unitTest( - "set_config_fields", - """ - let builder = Config::builder().config_field(99); - let config = builder.build(); - assert_eq!(config.config_field(), 99); - """, - ) - - unitTest( - "set_runtime_plugin", - """ - use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; - use aws_smithy_types::config_bag::FrozenLayer; - - #[derive(Debug)] - struct TestRuntimePlugin; - - impl RuntimePlugin for TestRuntimePlugin { - fn config(&self) -> Option { - todo!("ExampleRuntimePlugin.config") - } + unitTest( + "set_config_fields", + """ + let builder = Config::builder().config_field(99); + let config = builder.build(); + assert_eq!(config.config_field(), 99); + """, + ) + + unitTest( + "set_runtime_plugin", + """ + use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; + use aws_smithy_types::config_bag::FrozenLayer; + + #[derive(Debug)] + struct TestRuntimePlugin; + + impl RuntimePlugin for TestRuntimePlugin { + fn config(&self) -> Option { + todo!("ExampleRuntimePlugin.config") } + } - let config = Config::builder() - .runtime_plugin(TestRuntimePlugin) - .build(); - assert_eq!(config.runtime_plugins.len(), 1); - """, - ) - } else { - unitTest( - "set_config_fields", - """ - let mut builder = Config::builder(); - builder.config_field = Some(99); - let config = builder.build(); - assert_eq!(config.config_field, 99); - """, - ) - } + let config = Config::builder() + .runtime_plugin(TestRuntimePlugin) + .build(); + assert_eq!(config.runtime_plugins.len(), 1); + """, + ) } project.compileAndTest() } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt index daea27a0b89..33462450883 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt @@ -5,19 +5,11 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol -import io.kotest.matchers.string.shouldContain -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import software.amazon.smithy.aws.traits.protocols.RestJson1Trait import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings -import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.escape import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -29,13 +21,8 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.Proto import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.util.CommandError -import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.outputShape -import java.nio.file.Path private class TestProtocolPayloadGenerator(private val body: String) : ProtocolPayloadGenerator { override fun payloadMetadata(operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext) = @@ -143,221 +130,3 @@ private class TestProtocolFactory( ) } } - -// TODO(enableNewSmithyRuntime): Delete this file/test (replaced by ProtocolTestGeneratorTest for the orchestrator) -class ProtocolTestGeneratorMiddlewareTest { - private val model = """ - namespace com.example - - use aws.protocols#restJson1 - use smithy.test#httpRequestTests - use smithy.test#httpResponseTests - - @restJson1 - service HelloService { - operations: [SayHello], - version: "1" - } - - @http(method: "POST", uri: "/") - @httpRequestTests([ - { - id: "say_hello", - protocol: restJson1, - params: { - "greeting": "Hi", - "name": "Teddy", - "query": "Hello there" - }, - method: "POST", - uri: "/", - queryParams: [ - "Hi=Hello%20there" - ], - forbidQueryParams: [ - "goodbye" - ], - requireQueryParams: ["required"], - headers: { - "X-Greeting": "Hi", - }, - body: "{\"name\": \"Teddy\"}", - bodyMediaType: "application/json" - } - ]) - @httpResponseTests([{ - id: "basic_response_test", - protocol: restJson1, - documentation: "Parses operations with empty JSON bodies", - body: "{\"value\": \"hey there!\"}", - params: {"value": "hey there!"}, - bodyMediaType: "application/json", - headers: {"Content-Type": "application/x-amz-json-1.1"}, - code: 200, - }]) - operation SayHello { - input: SayHelloInput, - output: SayHelloOutput, - errors: [BadRequest] - } - - structure SayHelloOutput { - value: String - } - - @error("client") - structure BadRequest { - message: String - } - - structure SayHelloInput { - @httpHeader("X-Greeting") - greeting: String, - - @httpQuery("Hi") - query: String, - - name: String - } - """.asSmithyModel() - private val correctBody = """{"name": "Teddy"}""" - - /** - * Creates a fake HTTP implementation for SayHello & generates the protocol test - * - * Returns the [Path] the service was generated at, suitable for running `cargo test` - */ - private fun testService( - httpRequestBuilder: String, - body: String = "${correctBody.dq()}.to_string()", - correctResponse: String = """Ok(crate::operation::say_hello::SayHelloOutput::builder().value("hey there!").build())""", - ): Path { - val codegenDecorator = object : ClientCodegenDecorator { - override val name: String = "mock" - override val order: Byte = 0 - override fun classpathDiscoverable(): Boolean = false - override fun protocols( - serviceId: ShapeId, - currentProtocols: ProtocolMap, - ): ProtocolMap = - // Intentionally replace the builtin implementation of RestJson1 with our fake protocol - mapOf(RestJson1Trait.ID to TestProtocolFactory(httpRequestBuilder, body, correctResponse)) - } - return clientIntegrationTest( - model, - TestCodegenSettings.middlewareModeTestParams, - additionalDecorators = listOf(codegenDecorator), - ) - } - - @Test - fun `passing e2e protocol request test`() { - testService( - """ - .uri("/?Hi=Hello%20there&required") - .header("X-Greeting", "Hi") - .method("POST") - """, - ) - } - - @Test - fun `test incorrect response parsing`() { - val err = assertThrows { - testService( - """ - .uri("/?Hi=Hello%20there&required") - .header("X-Greeting", "Hi") - .method("POST") - """, - correctResponse = "Ok(crate::operation::say_hello::SayHelloOutput::builder().build())", - ) - } - - err.message shouldContain "basic_response_test_response ... FAILED" - } - - @Test - fun `test invalid body`() { - val err = assertThrows { - testService( - """ - .uri("/?Hi=Hello%20there&required") - .header("X-Greeting", "Hi") - .method("POST") - """, - """"{}".to_string()""", - ) - } - - err.message shouldContain "say_hello_request ... FAILED" - err.message shouldContain "body did not match" - } - - @Test - fun `test invalid url parameter`() { - val err = assertThrows { - testService( - """ - .uri("/?Hi=INCORRECT&required") - .header("X-Greeting", "Hi") - .method("POST") - """, - ) - } - // Verify the test actually ran - err.message shouldContain "say_hello_request ... FAILED" - err.message shouldContain "missing query param" - } - - @Test - fun `test forbidden url parameter`() { - val err = assertThrows { - testService( - """ - .uri("/?goodbye&Hi=Hello%20there&required") - .header("X-Greeting", "Hi") - .method("POST") - """, - ) - } - // Verify the test actually ran - err.message shouldContain "say_hello_request ... FAILED" - err.message shouldContain "forbidden query param" - } - - @Test - fun `test required url parameter`() { - // Hard coded implementation for this 1 test - val err = assertThrows { - testService( - """ - .uri("/?Hi=Hello%20there") - .header("X-Greeting", "Hi") - .method("POST") - """, - ) - } - - // Verify the test actually ran - err.message shouldContain "say_hello_request ... FAILED" - err.message shouldContain "required query param missing" - } - - @Test - fun `invalid header`() { - val err = assertThrows { - testService( - """ - .uri("/?Hi=Hello%20there&required") - // should be "Hi" - .header("X-Greeting", "Hey") - .method("POST") - """, - ) - } - - err.message shouldContain "say_hello_request ... FAILED" - err.message shouldContain "invalid header value" - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt index e655777be78..332e331cb2d 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt @@ -7,13 +7,10 @@ package software.amazon.smithy.rust.codegen.client.smithy.protocols import org.junit.jupiter.api.Test import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.util.lookup class AwsQueryCompatibleTest { @@ -176,144 +173,4 @@ class AwsQueryCompatibleTest { } } } - - // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced above for orchestrator) - @Test - fun `middleware - aws-query-compatible json with aws query error should allow for retrieving error code and type from custom header`() { - val model = """ - namespace test - use aws.protocols#awsJson1_0 - use aws.protocols#awsQueryCompatible - use aws.protocols#awsQueryError - - @awsQueryCompatible - @awsJson1_0 - service TestService { - version: "2023-02-20", - operations: [SomeOperation] - } - - operation SomeOperation { - input: SomeOperationInputOutput, - output: SomeOperationInputOutput, - errors: [InvalidThingException], - } - - structure SomeOperationInputOutput { - a: String, - b: Integer - } - - @awsQueryError( - code: "InvalidThing", - httpResponseCode: 400, - ) - @error("client") - structure InvalidThingException { - message: String - } - """.asSmithyModel() - - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("should_parse_code_and_type_fields") { - rust( - """ - ##[test] - fn should_parse_code_and_type_fields() { - use aws_smithy_http::response::ParseStrictResponse; - - let response = http::Response::builder() - .header( - "x-amzn-query-error", - http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), - ) - .status(400) - .body( - r##"{ - "__type": "com.amazonaws.sqs##QueueDoesNotExist", - "message": "Some user-visible message" - }"##, - ) - .unwrap(); - let some_operation = $moduleName::operation::some_operation::SomeOperation::new(); - let error = some_operation - .parse(&response.map(bytes::Bytes::from)) - .err() - .unwrap(); - assert_eq!( - Some("AWS.SimpleQueueService.NonExistentQueue"), - error.meta().code(), - ); - assert_eq!(Some("Sender"), error.meta().extra("type")); - } - """, - ) - } - } - } - - // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced above for orchestrator) - @Test - fun `middleware - aws-query-compatible json without aws query error should allow for retrieving error code from payload`() { - val model = """ - namespace test - use aws.protocols#awsJson1_0 - use aws.protocols#awsQueryCompatible - - @awsQueryCompatible - @awsJson1_0 - service TestService { - version: "2023-02-20", - operations: [SomeOperation] - } - - operation SomeOperation { - input: SomeOperationInputOutput, - output: SomeOperationInputOutput, - errors: [InvalidThingException], - } - - structure SomeOperationInputOutput { - a: String, - b: Integer - } - - @error("client") - structure InvalidThingException { - message: String - } - """.asSmithyModel() - - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("should_parse_code_from_payload") { - rust( - """ - ##[test] - fn should_parse_code_from_payload() { - use aws_smithy_http::response::ParseStrictResponse; - - let response = http::Response::builder() - .status(400) - .body( - r##"{ - "__type": "com.amazonaws.sqs##QueueDoesNotExist", - "message": "Some user-visible message" - }"##, - ) - .unwrap(); - let some_operation = $moduleName::operation::some_operation::SomeOperation::new(); - let error = some_operation - .parse(&response.map(bytes::Bytes::from)) - .err() - .unwrap(); - assert_eq!(Some("QueueDoesNotExist"), error.meta().code()); - assert_eq!(None, error.meta().extra("type")); - } - """, - ) - } - } - } } diff --git a/tools/ci-scripts/check-aws-sdk-adhoc-tests b/tools/ci-scripts/check-aws-sdk-adhoc-tests index 911d11f998d..8da33d14de7 100755 --- a/tools/ci-scripts/check-aws-sdk-adhoc-tests +++ b/tools/ci-scripts/check-aws-sdk-adhoc-tests @@ -10,11 +10,6 @@ C_RESET='\033[0m' set -eu cd smithy-rs -# TODO(enableNewSmithyRuntimeCleanup): Remove the middleware test run when cleaning up middleware -echo -e "## ${C_YELLOW}Running SDK adhoc tests against the middleware implementation...${C_RESET}" +echo -e "## ${C_YELLOW}Running SDK adhoc tests...${C_RESET}" ./gradlew aws:sdk-adhoc-test:clean -./gradlew aws:sdk-adhoc-test:check -Psmithy.runtime.mode=middleware - -echo -e "## ${C_YELLOW}Running SDK adhoc tests against the orchestrator implementation...${C_RESET}" -./gradlew aws:sdk-adhoc-test:clean -./gradlew aws:sdk-adhoc-test:check -Psmithy.runtime.mode=orchestrator +./gradlew aws:sdk-adhoc-test:check diff --git a/tools/ci-scripts/check-aws-sdk-middleware-impl b/tools/ci-scripts/check-aws-sdk-middleware-impl deleted file mode 100755 index ea6cfe85df9..00000000000 --- a/tools/ci-scripts/check-aws-sdk-middleware-impl +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# - -# This script tests the SDK smoke test services against the middleware implementation - -C_YELLOW='\033[1;33m' -C_RESET='\033[0m' - -set -eu -cd smithy-rs - -./gradlew aws:sdk:assemble -Psmithy.runtime.mode=middleware - -cd aws/sdk/build/aws-sdk/sdk -for service in */; do - pushd "${service}" - echo -e "${C_YELLOW}# Running 'cargo test --all-features' on '${service}'${C_RESET}" - RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_middleware_mode" cargo test --all-features --all-targets --no-fail-fast - echo -e "${C_YELLOW}# Running 'cargo clippy --all-features' on '${service}'${C_RESET}" - RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_middleware_mode" cargo clippy --all-features - popd -done - -echo "SUCCESS" diff --git a/tools/ci-scripts/check-client-codegen-integration-tests b/tools/ci-scripts/check-client-codegen-integration-tests index 86013436c51..f844b0cd0b6 100755 --- a/tools/ci-scripts/check-client-codegen-integration-tests +++ b/tools/ci-scripts/check-client-codegen-integration-tests @@ -7,6 +7,4 @@ set -eux cd smithy-rs -# TODO(enableNewSmithyRuntimeCleanup): Only run the orchestrator version of this -./gradlew codegen-client-test:test -Psmithy.runtime.mode=middleware -./gradlew codegen-client-test:test -Psmithy.runtime.mode=orchestrator +./gradlew codegen-client-test:test From 2d61502221d446695f6a0ff9799352ab38ad31cd Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 16 Aug 2023 16:28:32 -0400 Subject: [PATCH 069/331] Remove the public HTTP dependency from aws-sigv4 (#2921) ## Motivation and Context Removes the public http dependency from the aws-sigv4 crate to avoid compatibility issues with http = 1.0 and to support the http refactor ## Description - Changes `SignableRequest::new` to remove the direct exposure of HTTP types - Assorted test refactorings as a result - Update calling code ## Testing IT/UT ## Checklist TODO: changelog - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 11 + aws/rust-runtime/aws-runtime/Cargo.toml | 3 +- .../aws-runtime/src/auth/sigv4.rs | 15 +- aws/rust-runtime/aws-sig-auth/Cargo.toml | 3 +- aws/rust-runtime/aws-sig-auth/src/signer.rs | 15 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 1 + .../aws-sigv4/external-types.toml | 7 +- .../src/http_request/canonical_request.rs | 81 ++-- .../aws-sigv4/src/http_request/error.rs | 12 + .../aws-sigv4/src/http_request/mod.rs | 22 +- .../aws-sigv4/src/http_request/settings.rs | 11 +- .../aws-sigv4/src/http_request/sign.rs | 346 ++++++++---------- .../aws-sigv4/src/http_request/test.rs | 126 +++++-- 13 files changed, 358 insertions(+), 295 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e0ea56e68bb..e7158b599b6 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -34,3 +34,14 @@ message = "Fix requests to S3 with `no_credentials` set." references = ["smithy-rs#2907", "aws-sdk-rust#864"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "jdisanti" + +[[aws-sdk-rust]] +message = """Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency: +- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead +- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate +- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release. +- Several public accessors were removed from `SigningInstructions`. +""" +references = ["smithy-rs#2921"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index fddff0c9fe4..b6c47352d9c 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -14,7 +14,8 @@ test-util = [] [dependencies] aws-credential-types = { path = "../aws-credential-types" } aws-http = { path = "../aws-http" } -aws-sigv4 = { path = "../aws-sigv4" } +# TODO(httpRefactor): Remove the http0-compat feature +aws-sigv4 = { path = "../aws-sigv4", features = ["http0-compat"] } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index ac1eab1ea7e..0ef19307e9e 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -356,11 +356,17 @@ impl Signer for SigV4Signer { }); let signable_request = SignableRequest::new( - request.method(), - request.uri(), - request.headers(), + request.method().as_str(), + request.uri().to_string(), + request.headers().iter().map(|(k, v)| { + ( + k.as_str(), + // use from_utf8 instead of to_str because we _do_ allow non-ascii header values + std::str::from_utf8(v.as_bytes()).expect("only utf-8 headers are signable"), + ) + }), signable_body, - ); + )?; sign(signable_request, &signing_params)? } .into_parts(); @@ -384,7 +390,6 @@ impl Signer for SigV4Signer { .expect("failed to send deferred signer"); } } - signing_instructions.apply_to_request(request); Ok(()) } diff --git a/aws/rust-runtime/aws-sig-auth/Cargo.toml b/aws/rust-runtime/aws-sig-auth/Cargo.toml index deece1ac304..c5192d8aa8b 100644 --- a/aws/rust-runtime/aws-sig-auth/Cargo.toml +++ b/aws/rust-runtime/aws-sig-auth/Cargo.toml @@ -12,7 +12,8 @@ sign-eventstream = ["aws-smithy-eventstream", "aws-sigv4/sign-eventstream"] [dependencies] aws-credential-types = { path = "../aws-credential-types" } -aws-sigv4 = { path = "../aws-sigv4" } +# TODO(httpRefactor): Remove feature was http refactor is complete +aws-sigv4 = { path = "../aws-sigv4", features = ["http0-compat"] } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } diff --git a/aws/rust-runtime/aws-sig-auth/src/signer.rs b/aws/rust-runtime/aws-sig-auth/src/signer.rs index d71c6ecf429..7542dc12de8 100644 --- a/aws/rust-runtime/aws-sig-auth/src/signer.rs +++ b/aws/rust-runtime/aws-sig-auth/src/signer.rs @@ -16,6 +16,7 @@ use std::time::{Duration, SystemTime}; use crate::middleware::Signature; pub use aws_sigv4::http_request::SignableBody; + pub type SigningError = aws_sigv4::http_request::SigningError; const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ @@ -212,11 +213,17 @@ impl SigV4Signer { }); let signable_request = SignableRequest::new( - request.method(), - request.uri(), - request.headers(), + request.method().as_str(), + request.uri().to_string(), + request.headers().iter().map(|(k, v)| { + ( + k.as_str(), + std::str::from_utf8(v.as_bytes()) + .expect("only string headers are signable"), + ) + }), signable_body, - ); + )?; sign(signable_request, &signing_params)? } .into_parts(); diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index ea540255527..3a8b59022be 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -11,6 +11,7 @@ repository = "https://github.com/awslabs/smithy-rs" [features] sign-http = ["http", "percent-encoding", "form_urlencoded"] sign-eventstream = ["aws-smithy-eventstream", "bytes"] +http0-compat = ["http"] default = ["sign-http"] [dependencies] diff --git a/aws/rust-runtime/aws-sigv4/external-types.toml b/aws/rust-runtime/aws-sigv4/external-types.toml index 9139940c26a..0e56bc56933 100644 --- a/aws/rust-runtime/aws-sigv4/external-types.toml +++ b/aws/rust-runtime/aws-sigv4/external-types.toml @@ -1,11 +1,6 @@ allowed_external_types = [ - "http::header::map::HeaderMap", - "http::header::name::HeaderName", - "http::header::value::HeaderValue", - "http::method::Method", + # TODO(refactorHttp): Remove this and remove the signing helpers "http::request::Request", - "http::uri::Uri", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::frame::Message", ] diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index 221463ada23..a16a7d4128a 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -15,7 +15,7 @@ use crate::http_request::{PayloadChecksumKind, SignableBody, SignatureLocation, use crate::sign::sha256_hex_string; use aws_smithy_http::query_writer::QueryWriter; use http::header::{AsHeaderName, HeaderName, HOST}; -use http::{HeaderMap, HeaderValue, Method, Uri}; +use http::{HeaderMap, HeaderValue, Uri}; use std::borrow::Cow; use std::cmp::Ordering; use std::convert::TryFrom; @@ -103,7 +103,7 @@ impl<'a> SignatureValues<'a> { #[derive(Debug, PartialEq)] pub(super) struct CanonicalRequest<'a> { - pub(super) method: &'a Method, + pub(super) method: &'a str, pub(super) path: Cow<'a, str>, pub(super) params: Option, pub(super) headers: HeaderMap, @@ -212,7 +212,7 @@ impl<'a> CanonicalRequest<'a> { // Header names and values need to be normalized according to Step 4 of https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html // Using append instead of insert means this will not clobber headers that have the same lowercased name canonical_headers.append( - HeaderName::from_str(&name.as_str().to_lowercase())?, + HeaderName::from_str(&name.to_lowercase())?, normalize_header_value(value)?, ); } @@ -237,7 +237,7 @@ impl<'a> CanonicalRequest<'a> { let mut signed_headers = Vec::with_capacity(canonical_headers.len()); for name in canonical_headers.keys() { if let Some(excluded_headers) = params.settings.excluded_headers.as_ref() { - if excluded_headers.contains(name) { + if excluded_headers.iter().any(|it| name.as_str() == it) { continue; } } @@ -406,9 +406,7 @@ fn trim_spaces_from_byte_string(bytes: &[u8]) -> &[u8] { /// Works just like [trim_all] but acts on HeaderValues instead of bytes. /// Will ensure that the underlying bytes are valid UTF-8. -fn normalize_header_value( - header_value: &HeaderValue, -) -> Result { +fn normalize_header_value(header_value: &str) -> Result { let trimmed_value = trim_all(header_value.as_bytes()); HeaderValue::from_str( std::str::from_utf8(&trimmed_value) @@ -544,8 +542,8 @@ mod tests { use crate::http_request::{SignatureLocation, SigningParams}; use crate::sign::sha256_hex_string; use aws_smithy_http::query_writer::QueryWriter; - use http::Uri; - use http::{header::HeaderName, HeaderValue}; + use http::{HeaderValue, Uri}; + use pretty_assertions::assert_eq; use proptest::{prelude::*, proptest}; use std::time::Duration; @@ -565,14 +563,14 @@ mod tests { #[test] fn test_repeated_header() { let mut req = test_request("get-vanilla-query-order-key-case"); - req.headers_mut().append( - "x-amz-object-attributes", - HeaderValue::from_static("Checksum"), - ); - req.headers_mut().append( - "x-amz-object-attributes", - HeaderValue::from_static("ObjectSize"), - ); + req.headers.push(( + "x-amz-object-attributes".to_string(), + "Checksum".to_string(), + )); + req.headers.push(( + "x-amz-object-attributes".to_string(), + "ObjectSize".to_string(), + )); let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, @@ -618,13 +616,10 @@ mod tests { #[test] fn test_unsigned_payload() { - let req = test_request("get-vanilla-query-order-key-case"); - let req = SignableRequest::new( - req.method(), - req.uri(), - req.headers(), - SignableBody::UnsignedPayload, - ); + let mut req = test_request("get-vanilla-query-order-key-case"); + req.set_body(SignableBody::UnsignedPayload); + let req: SignableRequest<'_> = SignableRequest::from(&req); + let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() @@ -638,13 +633,9 @@ mod tests { #[test] fn test_precomputed_payload() { let payload_hash = "44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072"; - let req = test_request("get-vanilla-query-order-key-case"); - let req = SignableRequest::new( - req.method(), - req.uri(), - req.headers(), - SignableBody::Precomputed(String::from(payload_hash)), - ); + let mut req = test_request("get-vanilla-query-order-key-case"); + req.set_body(SignableBody::Precomputed(String::from(payload_hash))); + let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() @@ -712,7 +703,7 @@ mod tests { #[test] fn test_tilde_in_uri() { let req = http::Request::builder() - .uri("https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~").body("").unwrap(); + .uri("https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~").body("").unwrap().into(); let req = SignableRequest::from(&req); let signing_params = signing_params(SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); @@ -734,7 +725,8 @@ mod tests { let req = http::Request::builder() .uri(query_writer.build_uri()) .body("") - .unwrap(); + .unwrap() + .into(); let req = SignableRequest::from(&req); let signing_params = signing_params(SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); @@ -786,7 +778,8 @@ mod tests { .header("x-amzn-trace-id", "test-trace-id") .header("x-amz-user-agent", "test-user-agent") .body("") - .unwrap(); + .unwrap() + .into(); let request = SignableRequest::from(&request); let settings = SigningSettings { @@ -816,7 +809,8 @@ mod tests { .header("x-amzn-trace-id", "test-trace-id") .header("x-amz-user-agent", "test-user-agent") .body("") - .unwrap(); + .unwrap() + .into(); let request = SignableRequest::from(&request); let settings = SigningSettings { @@ -847,7 +841,7 @@ mod tests { for key in &excluded_headers { request_builder = request_builder.header(key, "value"); } - let request = request_builder.body("").unwrap(); + let request = request_builder.body("").unwrap().into(); let request = SignableRequest::from(&request); @@ -857,9 +851,7 @@ mod tests { excluded_headers: Some( excluded_headers .into_iter() - .map(|header_string| { - HeaderName::from_static(Box::leak(header_string.into_boxed_str())) - }) + .map(std::borrow::Cow::Owned) .collect(), ), ..Default::default() @@ -908,9 +900,8 @@ mod tests { #[test] fn test_normalize_header_value_works_on_valid_header_value(v in (".*")) { - if let Ok(header_value) = HeaderValue::from_maybe_shared(v) { - assert!(normalize_header_value(&header_value).is_ok()); - } + prop_assume!(HeaderValue::from_str(&v).is_ok()); + assert!(normalize_header_value(&v).is_ok()); } #[test] @@ -918,10 +909,4 @@ mod tests { assert_eq!(trim_all(s.as_bytes()).as_ref(), s.as_bytes()); } } - - #[test] - fn test_normalize_header_value_returns_expected_error_on_invalid_utf8() { - let header_value = HeaderValue::from_bytes(&[0xC0, 0xC1]).unwrap(); - assert!(normalize_header_value(&header_value).is_err()); - } } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs index d67acbc3275..0d5f1b5b78c 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs @@ -4,6 +4,7 @@ */ use http::header::{InvalidHeaderName, InvalidHeaderValue}; +use http::uri::InvalidUri; use std::error::Error; use std::fmt; use std::str::Utf8Error; @@ -50,6 +51,7 @@ enum CanonicalRequestErrorKind { InvalidHeaderName { source: InvalidHeaderName }, InvalidHeaderValue { source: InvalidHeaderValue }, InvalidUtf8InHeaderValue { source: Utf8Error }, + InvalidUri { source: InvalidUri }, } #[derive(Debug)] @@ -64,6 +66,7 @@ impl fmt::Display for CanonicalRequestError { InvalidHeaderName { .. } => write!(f, "invalid header name"), InvalidHeaderValue { .. } => write!(f, "invalid header value"), InvalidUtf8InHeaderValue { .. } => write!(f, "invalid UTF-8 in header value"), + InvalidUri { .. } => write!(f, "the uri was invalid"), } } } @@ -75,6 +78,7 @@ impl Error for CanonicalRequestError { InvalidHeaderName { source } => Some(source), InvalidHeaderValue { source } => Some(source), InvalidUtf8InHeaderValue { source } => Some(source), + InvalidUri { source } => Some(source), } } } @@ -102,3 +106,11 @@ impl From for CanonicalRequestError { } } } + +impl From for CanonicalRequestError { + fn from(source: InvalidUri) -> Self { + Self { + kind: CanonicalRequestErrorKind::InvalidUri { source }, + } + } +} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs b/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs index db021bbee5b..d9fe5b4c850 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs @@ -7,18 +7,16 @@ //! //! # Example: Signing an HTTP request //! +//! **Note**: This requires `http0-compat` to be enabled. +//! //! ```rust -//! # fn test() -> Result<(), aws_sigv4::http_request::SigningError> { +//! # use aws_sigv4::http_request::SignableBody; +//! #[cfg(feature = "http0-compat")] +//! fn test() -> Result<(), aws_sigv4::http_request::SigningError> { //! use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest}; //! use http; //! use std::time::SystemTime; //! -//! // Create the request to sign -//! let mut request = http::Request::builder() -//! .uri("https://some-endpoint.some-region.amazonaws.com") -//! .body("") -//! .unwrap(); -//! //! // Set up information and settings for the signing //! let signing_settings = SigningSettings::default(); //! let signing_params = SigningParams::builder() @@ -31,11 +29,17 @@ //! .build() //! .unwrap(); //! // Convert the HTTP request into a signable request -//! let signable_request = SignableRequest::from(&request); +//! let signable_request = SignableRequest::new( +//! "GET", +//! "https://some-endpoint.some-region.amazonaws.com", +//! std::iter::empty(), +//! SignableBody::Bytes(&[]) +//! ).expect("signable request"); //! +//! let mut my_req = http::Request::new("..."); //! // Sign and then apply the signature to the request //! let (signing_instructions, _signature) = sign(signable_request, &signing_params)?.into_parts(); -//! signing_instructions.apply_to_request(&mut request); +//! signing_instructions.apply_to_request(&mut my_req); //! # Ok(()) //! # } //! ``` diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs b/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs index 501cd5c775f..8349c428595 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs @@ -3,7 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -use http::header::{HeaderName, AUTHORIZATION, USER_AGENT}; +use http::header::{AUTHORIZATION, USER_AGENT}; +use std::borrow::Cow; use std::time::Duration; /// HTTP signing parameters @@ -30,7 +31,7 @@ pub struct SigningSettings { pub expires_in: Option, /// Headers that should be excluded from the signing process - pub excluded_headers: Option>, + pub excluded_headers: Option>>, /// Specifies whether the absolute path component of the URI should be normalized during signing. pub uri_path_normalization_mode: UriPathNormalizationMode, @@ -109,11 +110,11 @@ impl Default for SigningSettings { let excluded_headers = Some( [ // This header is calculated as part of the signing process, so if it's present, discard it - AUTHORIZATION, + Cow::Borrowed(AUTHORIZATION.as_str()), // Changes when sent by proxy - USER_AGENT, + Cow::Borrowed(USER_AGENT.as_str()), // Changes based on the request from the client - HeaderName::from_static(HEADER_NAME_X_RAY_TRACE_ID), + Cow::Borrowed(HEADER_NAME_X_RAY_TRACE_ID), ] .to_vec(), ); diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index aaeda06bb7f..2c6da9d1293 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -8,56 +8,61 @@ use super::{PayloadChecksumKind, SignatureLocation}; use crate::http_request::canonical_request::header; use crate::http_request::canonical_request::param; use crate::http_request::canonical_request::{CanonicalRequest, StringToSign, HMAC_256}; +use crate::http_request::error::CanonicalRequestError; use crate::http_request::SigningParams; use crate::sign::{calculate_signature, generate_signing_key, sha256_hex_string}; use crate::SigningOutput; -use aws_smithy_http::query_writer::QueryWriter; -use http::header::HeaderValue; -use http::{HeaderMap, Method, Uri}; + +use http::Uri; use std::borrow::Cow; -use std::convert::TryFrom; + +use std::fmt::{Debug, Formatter}; use std::str; /// Represents all of the information necessary to sign an HTTP request. #[derive(Debug)] #[non_exhaustive] pub struct SignableRequest<'a> { - method: &'a Method, - uri: &'a Uri, - headers: &'a HeaderMap, + method: &'a str, + uri: Uri, + headers: Vec<(&'a str, &'a str)>, body: SignableBody<'a>, } impl<'a> SignableRequest<'a> { - /// Creates a new `SignableRequest`. If you have an [`http::Request`], then - /// consider using [`SignableRequest::from`] instead of `new`. + /// Creates a new `SignableRequest`. pub fn new( - method: &'a Method, - uri: &'a Uri, - headers: &'a HeaderMap, + method: &'a str, + uri: impl Into>, + headers: impl Iterator, body: SignableBody<'a>, - ) -> Self { - Self { + ) -> Result { + let uri = uri + .into() + .parse() + .map_err(|e| SigningError::from(CanonicalRequestError::from(e)))?; + let headers = headers.collect(); + Ok(Self { method, uri, headers, body, - } + }) } /// Returns the signable URI - pub fn uri(&self) -> &Uri { - self.uri + pub(crate) fn uri(&self) -> &Uri { + &self.uri } /// Returns the signable HTTP method - pub fn method(&self) -> &Method { + pub(crate) fn method(&self) -> &str { self.method } /// Returns the request headers - pub fn headers(&self) -> &HeaderMap { - self.headers + pub(crate) fn headers(&self) -> &[(&str, &str)] { + self.headers.as_slice() } /// Returns the signable body @@ -66,21 +71,6 @@ impl<'a> SignableRequest<'a> { } } -impl<'a, B> From<&'a http::Request> for SignableRequest<'a> -where - B: 'a, - B: AsRef<[u8]>, -{ - fn from(request: &'a http::Request) -> SignableRequest<'a> { - SignableRequest::new( - request.method(), - request.uri(), - request.headers(), - SignableBody::Bytes(request.body().as_ref()), - ) - } -} - /// A signable HTTP request body #[derive(Debug, Clone, Eq, PartialEq)] #[non_exhaustive] @@ -106,48 +96,83 @@ pub enum SignableBody<'a> { /// Instructions for applying a signature to an HTTP request. #[derive(Debug)] pub struct SigningInstructions { - headers: Option>, - params: Option)>>, + headers: Vec

, + params: Vec<(&'static str, Cow<'static, str>)>, +} + +/// Header representation for use in [`SigningInstructions`] +pub struct Header { + key: &'static str, + value: String, + sensitive: bool, +} + +impl Debug for Header { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let mut fmt = f.debug_struct("Header"); + fmt.field("key", &self.key); + let value = if self.sensitive { + "** REDACTED **" + } else { + &self.value + }; + fmt.field("value", &value); + fmt.finish() + } +} + +impl Header { + /// The name of this header + pub fn name(&self) -> &'static str { + self.key + } + + /// The value of this header + pub fn value(&self) -> &str { + &self.value + } + + /// Whether this header has a sensitive value + pub fn sensitive(&self) -> bool { + self.sensitive + } } impl SigningInstructions { - fn new( - headers: Option>, - params: Option)>>, - ) -> Self { + fn new(headers: Vec
, params: Vec<(&'static str, Cow<'static, str>)>) -> Self { Self { headers, params } } - /// Returns a reference to the headers that should be added to the request. - pub fn headers(&self) -> Option<&HeaderMap> { - self.headers.as_ref() + /// Returns the headers and query params that should be applied to this request + pub fn into_parts(self) -> (Vec
, Vec<(&'static str, Cow<'static, str>)>) { + (self.headers, self.params) } - /// Returns the headers and sets the internal value to `None`. - pub fn take_headers(&mut self) -> Option> { - self.headers.take() + /// Returns a reference to the headers that should be added to the request. + pub fn headers(&self) -> impl Iterator { + self.headers + .iter() + .map(|header| (header.key, header.value.as_str())) } /// Returns a reference to the query parameters that should be added to the request. - pub fn params(&self) -> Option<&Vec<(&'static str, Cow<'static, str>)>> { - self.params.as_ref() - } - - /// Returns the query parameters and sets the internal value to `None`. - pub fn take_params(&mut self) -> Option)>> { - self.params.take() + pub fn params(&self) -> &[(&str, Cow<'static, str>)] { + self.params.as_slice() } + #[cfg(any(feature = "http0-compat", test))] /// Applies the instructions to the given `request`. - pub fn apply_to_request(mut self, request: &mut http::Request) { - if let Some(new_headers) = self.take_headers() { - for (name, value) in new_headers.into_iter() { - request.headers_mut().insert(name.unwrap(), value); - } + pub fn apply_to_request(self, request: &mut http::Request) { + let (new_headers, new_query) = self.into_parts(); + for header in new_headers.into_iter() { + let mut value = http::HeaderValue::from_str(&header.value).unwrap(); + value.set_sensitive(header.sensitive); + request.headers_mut().insert(header.key, value); } - if let Some(params) = self.take_params() { - let mut query = QueryWriter::new(request.uri()); - for (name, value) in params { + + if !new_query.is_empty() { + let mut query = aws_smithy_http::query_writer::QueryWriter::new(request.uri()); + for (name, value) in new_query { query.insert(name, &value); } *request.uri_mut() = query.build_uri(); @@ -167,14 +192,14 @@ pub fn sign<'a>( let (signing_headers, signature) = calculate_signing_headers(&request, params)?.into_parts(); Ok(SigningOutput::new( - SigningInstructions::new(Some(signing_headers), None), + SigningInstructions::new(signing_headers, vec![]), signature, )) } SignatureLocation::QueryParams => { let (params, signature) = calculate_signing_params(&request, params)?; Ok(SigningOutput::new( - SigningInstructions::new(None, Some(params)), + SigningInstructions::new(vec![], params), signature, )) } @@ -238,7 +263,7 @@ fn calculate_signing_params<'a>( fn calculate_signing_headers<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, -) -> Result>, SigningError> { +) -> Result>, SigningError> { // Step 1: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-canonical-request.html. let creq = CanonicalRequest::from(request, params)?; tracing::trace!(canonical_request = %creq); @@ -263,12 +288,14 @@ fn calculate_signing_headers<'a>( // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html let values = creq.values.as_headers().expect("signing with headers"); - let mut headers = HeaderMap::new(); + let mut headers = vec![]; add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); - headers.insert( - "authorization", - build_authorization_header(params.access_key, &creq, sts, &signature), - ); + headers.push(Header { + key: "authorization", + value: build_authorization_header(params.access_key, &creq, sts, &signature), + + sensitive: false, + }); if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { add_header( &mut headers, @@ -290,10 +317,12 @@ fn calculate_signing_headers<'a>( Ok(SigningOutput::new(headers, signature)) } -fn add_header(map: &mut HeaderMap, key: &'static str, value: &str, sensitive: bool) { - let mut value = HeaderValue::try_from(value).expect(key); - value.set_sensitive(sensitive); - map.insert(key, value); +fn add_header(map: &mut Vec
, key: &'static str, value: &str, sensitive: bool) { + map.push(Header { + key, + value: value.to_string(), + sensitive, + }); } // add signature to authorization header @@ -303,46 +332,54 @@ fn build_authorization_header( creq: &CanonicalRequest<'_>, sts: StringToSign<'_>, signature: &str, -) -> HeaderValue { - let mut value = HeaderValue::try_from(format!( +) -> String { + format!( "{} Credential={}/{}, SignedHeaders={}, Signature={}", HMAC_256, access_key, sts.scope, creq.values.signed_headers().as_str(), signature - )) - .unwrap(); - value.set_sensitive(true); - value + ) } #[cfg(test)] mod tests { - use super::{sign, SigningInstructions}; + use super::sign; use crate::date_time::test_parsers::parse_date_time; use crate::http_request::sign::SignableRequest; use crate::http_request::test::{ - make_headers_comparable, test_request, test_signed_request, - test_signed_request_query_params, + test_request, test_signed_request, test_signed_request_query_params, }; use crate::http_request::{ - SessionTokenMode, SignatureLocation, SigningParams, SigningSettings, + SessionTokenMode, SignableBody, SignatureLocation, SigningParams, SigningSettings, }; - use http::{HeaderMap, HeaderValue}; + use http::{HeaderValue, Request}; use pretty_assertions::assert_eq; use proptest::proptest; - use std::borrow::Cow; + use std::iter; + use std::time::Duration; macro_rules! assert_req_eq { - ($a:tt, $b:tt) => { - make_headers_comparable(&mut $a); - make_headers_comparable(&mut $b); - assert_eq!(format!("{:?}", $a), format!("{:?}", $b)) + (http: $expected:expr, $actual:expr) => { + let mut expected = ($expected).map(|_b|"body"); + let mut actual = ($actual).map(|_b|"body"); + make_headers_comparable(&mut expected); + make_headers_comparable(&mut actual); + assert_eq!(format!("{:?}", expected), format!("{:?}", actual)); + }; + ($expected:tt, $actual:tt) => { + assert_req_eq!(http: ($expected).as_http_request(), $actual); }; } + pub(crate) fn make_headers_comparable(request: &mut Request) { + for (_name, value) in request.headers_mut() { + value.set_sensitive(false); + } + } + #[test] fn test_sign_vanilla_with_headers() { let settings = SigningSettings::default(); @@ -364,10 +401,10 @@ mod tests { out.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let mut expected = test_signed_request("get-vanilla-query-order-key-case"); + let expected = test_signed_request("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); } @@ -393,10 +430,10 @@ mod tests { out.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let mut expected = test_signed_request(test); + let expected = test_signed_request(test); assert_req_eq!(expected, signed); } @@ -425,10 +462,10 @@ mod tests { out.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let mut expected = test_signed_request_query_params("get-vanilla-query-order-key-case"); + let expected = test_signed_request_query_params("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); } @@ -449,7 +486,8 @@ mod tests { .uri("https://some-endpoint.some-region.amazonaws.com") .header("some-header", HeaderValue::from_str("テスト").unwrap()) .body("") - .unwrap(); + .unwrap() + .into(); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( @@ -457,10 +495,10 @@ mod tests { out.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let mut expected = http::Request::builder() + let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header("some-header", HeaderValue::from_str("テスト").unwrap()) .header( @@ -479,7 +517,7 @@ mod tests { ) .body("") .unwrap(); - assert_req_eq!(expected, signed); + assert_req_eq!(http: expected, signed); } #[test] @@ -501,7 +539,8 @@ mod tests { let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .body("") - .unwrap(); + .unwrap() + .into(); let out_without_session_token = sign(SignableRequest::from(&original), ¶ms).unwrap(); params.security_token = Some("notarealsessiontoken"); @@ -516,12 +555,12 @@ mod tests { out_without_session_token.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out_with_session_token_but_excluded .output .apply_to_request(&mut signed); - let mut expected = http::Request::builder() + let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header( "x-amz-date", @@ -541,9 +580,9 @@ mod tests { "x-amz-security-token", HeaderValue::from_str("notarealsessiontoken").unwrap(), ) - .body("") + .body(b"") .unwrap(); - assert_req_eq!(expected, signed); + assert_req_eq!(http: expected, signed); } #[test] @@ -566,7 +605,8 @@ mod tests { HeaderValue::from_str("  test test ").unwrap(), ) .body("") - .unwrap(); + .unwrap() + .into(); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( @@ -574,10 +614,10 @@ mod tests { out.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let mut expected = http::Request::builder() + let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header( "some-header", @@ -599,30 +639,7 @@ mod tests { ) .body("") .unwrap(); - assert_req_eq!(expected, signed); - } - - #[test] - fn test_sign_headers_returning_expected_error_on_invalid_utf8() { - let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "123", - secret_key: "asdf", - security_token: None, - region: "us-east-1", - service_name: "foo", - time: std::time::SystemTime::UNIX_EPOCH, - settings, - }; - - let req = http::Request::builder() - .uri("https://foo.com/") - .header("x-sign-me", HeaderValue::from_bytes(&[0xC0, 0xC1]).unwrap()) - .body(&[]) - .unwrap(); - - let creq = crate::http_request::sign(SignableRequest::from(&req), ¶ms); - assert!(creq.is_err()); + assert_req_eq!(http: expected, signed); } proptest! { @@ -630,8 +647,7 @@ mod tests { // Only byte values between 32 and 255 (inclusive) are permitted, excluding byte 127, for // [HeaderValue](https://docs.rs/http/latest/http/header/struct.HeaderValue.html#method.from_bytes). fn test_sign_headers_no_panic( - left in proptest::collection::vec(32_u8..=126, 0..100), - right in proptest::collection::vec(128_u8..=255, 0..100), + header in ".*" ) { let settings = SigningSettings::default(); let params = SigningParams { @@ -644,57 +660,17 @@ mod tests { settings, }; - let bytes = left.iter().chain(right.iter()).cloned().collect::>(); - let req = http::Request::builder() - .uri("https://foo.com/") - .header("x-sign-me", HeaderValue::from_bytes(&bytes).unwrap()) - .body(&[]) - .unwrap(); - - // The test considered a pass if the creation of `creq` does not panic. - let _creq = crate::http_request::sign( - SignableRequest::from(&req), - ¶ms); - } - } + let req = SignableRequest::new( + "GET", + "https://foo.com", + iter::once(("x-sign-me", header.as_str())), + SignableBody::Bytes(&[]) + ); - #[test] - fn apply_signing_instructions_headers() { - let mut headers = HeaderMap::new(); - headers.insert("some-header", HeaderValue::from_static("foo")); - headers.insert("some-other-header", HeaderValue::from_static("bar")); - let instructions = SigningInstructions::new(Some(headers), None); - - let mut request = http::Request::builder() - .uri("https://some-endpoint.some-region.amazonaws.com") - .body("") - .unwrap(); - - instructions.apply_to_request(&mut request); - - let get_header = |n: &str| request.headers().get(n).unwrap().to_str().unwrap(); - assert_eq!("foo", get_header("some-header")); - assert_eq!("bar", get_header("some-other-header")); - } - - #[test] - fn apply_signing_instructions_query_params() { - let params = vec![ - ("some-param", Cow::Borrowed("f&o?o")), - ("some-other-param?", Cow::Borrowed("bar")), - ]; - let instructions = SigningInstructions::new(None, Some(params)); - - let mut request = http::Request::builder() - .uri("https://some-endpoint.some-region.amazonaws.com/some/path") - .body("") - .unwrap(); - - instructions.apply_to_request(&mut request); - - assert_eq!( - "/some/path?some-param=f%26o%3Fo&some-other-param%3F=bar", - request.uri().path_and_query().unwrap().to_string() - ); + if let Ok(req) = req { + // The test considered a pass if the creation of `creq` does not panic. + let _creq = crate::http_request::sign(req, ¶ms); + } + } } } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/test.rs b/aws/rust-runtime/aws-sigv4/src/http_request/test.rs index 93bef370f4f..8b349538ac4 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/test.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/test.rs @@ -5,8 +5,8 @@ //! Functions shared between the tests of several modules. -use bytes::Bytes; -use http::{Method, Request, Uri, Version}; +use crate::http_request::{SignableBody, SignableRequest}; +use http::{Method, Request, Uri}; use std::error::Error as StdError; fn path(name: &str, ext: &str) -> String { @@ -34,19 +34,19 @@ pub(crate) fn test_sts(name: &str) -> String { read(&path(name, "sts")) } -pub(crate) fn test_request(name: &str) -> Request { +pub(crate) fn test_request(name: &str) -> TestRequest { test_parsed_request(name, "req") } -pub(crate) fn test_signed_request(name: &str) -> Request { +pub(crate) fn test_signed_request(name: &str) -> TestRequest { test_parsed_request(name, "sreq") } -pub(crate) fn test_signed_request_query_params(name: &str) -> Request { +pub(crate) fn test_signed_request_query_params(name: &str) -> TestRequest { test_parsed_request(name, "qpsreq") } -fn test_parsed_request(name: &str, ext: &str) -> Request { +fn test_parsed_request(name: &str, ext: &str) -> TestRequest { let path = path(name, ext); match parse_request(read(&path).as_bytes()) { Ok(parsed) => parsed, @@ -54,15 +54,86 @@ fn test_parsed_request(name: &str, ext: &str) -> Request { } } -pub(crate) fn make_headers_comparable(request: &mut Request) { - for (_name, value) in request.headers_mut() { - value.set_sensitive(false); +pub(crate) struct TestRequest { + pub(crate) uri: String, + pub(crate) method: String, + pub(crate) headers: Vec<(String, String)>, + pub(crate) body: TestSignedBody, +} + +pub(crate) enum TestSignedBody { + Signable(SignableBody<'static>), + Bytes(Vec), +} + +impl TestSignedBody { + fn as_signable_body(&self) -> SignableBody<'_> { + match self { + TestSignedBody::Signable(data) => data.clone(), + TestSignedBody::Bytes(data) => SignableBody::Bytes(data.as_slice()), + } + } +} + +impl TestRequest { + pub(crate) fn set_body(&mut self, body: SignableBody<'static>) { + self.body = TestSignedBody::Signable(body); + } + + pub(crate) fn as_http_request(&self) -> http::Request<&'static str> { + let mut builder = http::Request::builder() + .uri(&self.uri) + .method(Method::from_bytes(self.method.as_bytes()).unwrap()); + for (k, v) in &self.headers { + builder = builder.header(k, v); + } + builder.body("body").unwrap() } } -fn parse_request( - s: &[u8], -) -> Result, Box> { +impl> From> for TestRequest { + fn from(value: Request) -> Self { + let invalid = value + .headers() + .values() + .find(|h| std::str::from_utf8(h.as_bytes()).is_err()); + if let Some(invalid) = invalid { + panic!("invalid header: {:?}", invalid); + } + Self { + uri: value.uri().to_string(), + method: value.method().to_string(), + headers: value + .headers() + .iter() + .map(|(k, v)| { + ( + k.to_string(), + String::from_utf8(v.as_bytes().to_vec()).unwrap(), + ) + }) + .collect::>(), + body: TestSignedBody::Bytes(value.body().as_ref().to_vec()), + } + } +} + +impl<'a> From<&'a TestRequest> for SignableRequest<'a> { + fn from(request: &'a TestRequest) -> SignableRequest<'a> { + SignableRequest::new( + &request.method, + &request.uri, + request + .headers + .iter() + .map(|(k, v)| (k.as_str(), v.as_str())), + request.body.as_signable_body(), + ) + .expect("URI MUST be valid") + } +} + +fn parse_request(s: &[u8]) -> Result> { let mut headers = [httparse::EMPTY_HEADER; 64]; // httparse 1.5 requires two trailing newlines to head the header section. let mut with_newline = Vec::from(s); @@ -70,37 +141,30 @@ fn parse_request( let mut req = httparse::Request::new(&mut headers); let _ = req.parse(&with_newline).unwrap(); - let version = match req.version.unwrap() { - 1 => Version::HTTP_11, - _ => unimplemented!(), - }; - - let method = match req.method.unwrap() { - "GET" => Method::GET, - "POST" => Method::POST, - _ => unimplemented!(), - }; - - let mut builder = Request::builder(); - builder = builder.version(version); - builder = builder.method(method); - let mut uri_builder = Uri::builder().scheme("https"); if let Some(path) = req.path { uri_builder = uri_builder.path_and_query(path); } + + let mut headers = vec![]; for header in req.headers { let name = header.name.to_lowercase(); if name == "host" { uri_builder = uri_builder.authority(header.value); } else if !name.is_empty() { - builder = builder.header(&name, header.value); + headers.push(( + header.name.to_string(), + std::str::from_utf8(header.value)?.to_string(), + )); } } - builder = builder.uri(uri_builder.build()?); - let req = builder.body(bytes::Bytes::new())?; - Ok(req) + Ok(TestRequest { + uri: uri_builder.build()?.to_string(), + method: req.method.unwrap().to_string(), + headers, + body: TestSignedBody::Bytes(vec![]), + }) } #[test] From 200fb6196d7a74264e9816e7b91fd858b5e42349 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 17 Aug 2023 11:55:12 -0500 Subject: [PATCH 070/331] Rename `signing_service` to `signing_name` (#2911) Part of the SigV4a update. I split this out to making review simpler. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 ++- aws/rust-runtime/aws-endpoint/src/lib.rs | 36 +++++------ .../tests/middleware_e2e_test.rs | 4 +- .../aws-runtime/src/auth/sigv4.rs | 60 +++++++++---------- .../aws-sig-auth/src/event_stream.rs | 22 +++---- aws/rust-runtime/aws-sig-auth/src/lib.rs | 8 +-- .../aws-sig-auth/src/middleware.rs | 30 +++++----- aws/rust-runtime/aws-sig-auth/src/signer.rs | 10 ++-- .../aws-sigv4/src/event_stream.rs | 11 ++-- .../src/http_request/canonical_request.rs | 4 +- .../aws-sigv4/src/http_request/mod.rs | 2 +- .../aws-sigv4/src/http_request/sign.rs | 46 +++++--------- aws/rust-runtime/aws-sigv4/src/lib.rs | 36 +++++------ aws/rust-runtime/aws-types/src/lib.rs | 28 ++++----- .../smithy/rustsdk/SigV4AuthDecorator.kt | 12 +--- .../smithy/rustsdk/SigV4SigningDecorator.kt | 16 ++--- .../rustsdk/SigV4SigningDecoratorTest.kt | 4 +- .../qldbsession/tests/integration.rs | 2 +- 18 files changed, 161 insertions(+), 178 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e7158b599b6..1258e603828 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -20,7 +20,7 @@ author = "jdisanti" [[smithy-rs]] message = "`RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`." references = ["smithy-rs#2904"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" [[smithy-rs]] @@ -45,3 +45,9 @@ message = """Several breaking changes were made to the aws-sigv4 API to remove t references = ["smithy-rs#2921"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "rcoh" + +[[aws-sdk-rust]] +message = "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver." +references = ["smithy-rs#2911"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "Velfi" diff --git a/aws/rust-runtime/aws-endpoint/src/lib.rs b/aws/rust-runtime/aws-endpoint/src/lib.rs index 8003d7c4aaf..b1d0861b365 100644 --- a/aws/rust-runtime/aws-endpoint/src/lib.rs +++ b/aws/rust-runtime/aws-endpoint/src/lib.rs @@ -14,13 +14,13 @@ use aws_smithy_types::endpoint::Endpoint as SmithyEndpoint; use aws_smithy_types::Document; use aws_types::region::{Region, SigningRegion}; -use aws_types::SigningService; +use aws_types::SigningName; /// Middleware Stage to add authentication information from a Smithy endpoint into the property bag /// /// AwsAuthStage implements [`MapRequest`](MapRequest). It will: /// 1. Load an endpoint from the property bag -/// 2. Set the `SigningRegion` and `SigningService` in the property bag to drive downstream +/// 2. Set the `SigningRegion` and `SigningName` in the property bag to drive downstream /// signing middleware. #[derive(Clone, Debug)] pub struct AwsAuthStage; @@ -74,21 +74,21 @@ impl MapRequest for AwsAuthStage { let endpoint = props .get::() .ok_or(AwsAuthStageErrorKind::NoEndpointResolver)?; - let (signing_scope_override, signing_service_override) = smithy_to_aws(endpoint) + let (signing_region_override, signing_name_override) = smithy_to_aws(endpoint) .map_err(|err| AwsAuthStageErrorKind::EndpointResolutionError(err))?; - if let Some(signing_scope) = signing_scope_override { - props.insert(signing_scope); + if let Some(signing_region) = signing_region_override { + props.insert(signing_region); } - if let Some(signing_service) = signing_service_override { - props.insert(signing_service); + if let Some(signing_name) = signing_name_override { + props.insert(signing_name); } Ok(http_req) }) } } -type EndpointMetadata = (Option, Option); +type EndpointMetadata = (Option, Option); fn smithy_to_aws(value: &SmithyEndpoint) -> Result> { // look for v4 as an auth scheme @@ -127,12 +127,12 @@ fn smithy_to_aws(value: &SmithyEndpoint) -> Result None, _ => return Err("unexpected type".into()), }; - let signing_service = match v4.get("signingName") { - Some(Document::String(s)) => Some(SigningService::from(s.to_string())), + let signing_name = match v4.get("signingName") { + Some(Document::String(s)) => Some(SigningName::from(s.to_string())), None => None, _ => return Err("unexpected type".into()), }; - Ok((signing_scope, signing_service)) + Ok((signing_scope, signing_name)) } #[cfg(test)] @@ -147,7 +147,7 @@ mod test { use http::header::HOST; use aws_types::region::{Region, SigningRegion}; - use aws_types::SigningService; + use aws_types::SigningName; use crate::AwsAuthStage; @@ -162,14 +162,14 @@ mod test { { let mut props = req.properties_mut(); props.insert(SigningRegion::from(region.clone())); - props.insert(SigningService::from_static("kinesis")); + props.insert(SigningName::from_static("kinesis")); props.insert(endpoint); }; let req = AwsAuthStage.apply(req).expect("should succeed"); assert_eq!(req.properties().get(), Some(&SigningRegion::from(region))); assert_eq!( req.properties().get(), - Some(&SigningService::from_static("kinesis")) + Some(&SigningName::from_static("kinesis")) ); assert!(req.http().headers().get(HOST).is_none()); @@ -206,7 +206,7 @@ mod test { { let mut props = req.properties_mut(); props.insert(region); - props.insert(SigningService::from_static("qldb")); + props.insert(SigningName::from_static("qldb")); props.insert(endpoint); }; let req = AwsAuthStage.apply(req).expect("should succeed"); @@ -216,7 +216,7 @@ mod test { ); assert_eq!( req.properties().get(), - Some(&SigningService::from_static("qldb-override")) + Some(&SigningName::from_static("qldb-override")) ); } @@ -229,14 +229,14 @@ mod test { { let mut props = req.properties_mut(); props.insert(region.clone()); - props.insert(SigningService::from_static("qldb")); + props.insert(SigningName::from_static("qldb")); props.insert(endpoint); }; let req = AwsAuthStage.apply(req).expect("should succeed"); assert_eq!(req.properties().get(), Some(®ion)); assert_eq!( req.properties().get(), - Some(&SigningService::from_static("qldb")) + Some(&SigningName::from_static("qldb")) ); } } diff --git a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs b/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs index 3a5c3258d14..6ce11b14dbb 100644 --- a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs +++ b/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs @@ -30,7 +30,7 @@ use aws_inlineable::middleware::DefaultMiddleware; use aws_sig_auth::signer::OperationSigningConfig; use aws_smithy_async::time::SharedTimeSource; use aws_types::region::SigningRegion; -use aws_types::SigningService; +use aws_types::SigningName; type Client = aws_smithy_client::Client; @@ -94,7 +94,7 @@ fn test_operation() -> Operation, - signing_service_override: Option, + signing_name_override: Option, } #[derive(Debug)] enum SigV4SigningError { MissingOperationSigningConfig, MissingSigningRegion, - MissingSigningService, + MissingSigningName, WrongIdentityType(Identity), BadTypeInEndpointAuthSchemeConfig(&'static str), } @@ -51,7 +51,7 @@ impl fmt::Display for SigV4SigningError { match self { MissingOperationSigningConfig => w("missing operation signing config for SigV4"), MissingSigningRegion => w("missing signing region for SigV4 signing"), - MissingSigningService => w("missing signing service for SigV4 signing"), + MissingSigningName => w("missing signing service for SigV4 signing"), WrongIdentityType(identity) => { write!(f, "wrong identity type for SigV4: {identity:?}") } @@ -70,7 +70,7 @@ impl StdError for SigV4SigningError { match self { Self::MissingOperationSigningConfig => None, Self::MissingSigningRegion => None, - Self::MissingSigningService => None, + Self::MissingSigningName => None, Self::WrongIdentityType(_) => None, Self::BadTypeInEndpointAuthSchemeConfig(_) => None, } @@ -160,12 +160,12 @@ impl Default for SigningOptions { /// /// Although these fields MAY be customized on a per request basis, they are generally static /// for a given operation -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct SigV4OperationSigningConfig { /// AWS Region to sign for. pub region: Option, /// AWS Service to sign for. - pub service: Option, + pub service: Option, /// Signing options. pub signing_options: SigningOptions, } @@ -240,11 +240,11 @@ impl SigV4Signer { .ok_or(SigV4SigningError::MissingSigningRegion)? .as_ref(), ) - .service_name( + .name( operation_config .service .as_ref() - .ok_or(SigV4SigningError::MissingSigningService)? + .ok_or(SigV4SigningError::MissingSigningName)? .as_ref(), ) .time(request_timestamp) @@ -262,16 +262,16 @@ impl SigV4Signer { .ok_or(SigV4SigningError::MissingOperationSigningConfig)?; let signing_region = config_bag.load::(); - let signing_service = config_bag.load::(); + let signing_name = config_bag.load::(); let EndpointAuthSchemeConfig { signing_region_override, - signing_service_override, + signing_name_override, } = Self::extract_endpoint_auth_scheme_config(auth_scheme_endpoint_config)?; match ( signing_region_override.or_else(|| signing_region.cloned()), - signing_service_override.or_else(|| signing_service.cloned()), + signing_name_override.or_else(|| signing_name.cloned()), ) { (None, None) => Ok(Cow::Borrowed(operation_config)), (region, service) => { @@ -290,7 +290,7 @@ impl SigV4Signer { fn extract_endpoint_auth_scheme_config( endpoint_config: AuthSchemeEndpointConfig<'_>, ) -> Result { - let (mut signing_region_override, mut signing_service_override) = (None, None); + let (mut signing_region_override, mut signing_name_override) = (None, None); if let Some(config) = endpoint_config.as_document().and_then(Document::as_object) { use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; signing_region_override = match config.get("signingRegion") { @@ -298,15 +298,15 @@ impl SigV4Signer { None => None, _ => return Err(UnexpectedType("signingRegion")), }; - signing_service_override = match config.get("signingName") { - Some(Document::String(s)) => Some(SigningService::from(s.to_string())), + signing_name_override = match config.get("signingName") { + Some(Document::String(s)) => Some(SigningName::from(s.to_string())), None => None, _ => return Err(UnexpectedType("signingName")), }; } Ok(EndpointAuthSchemeConfig { signing_region_override, - signing_service_override, + signing_name_override, }) } } @@ -384,7 +384,7 @@ impl Signer for SigV4Signer { _signature, credentials.clone(), Region::new(signing_params.region().to_string()).into(), - signing_params.service_name().to_string().into(), + signing_params.name().to_string().into(), time_source, )) as _) .expect("failed to send deferred signer"); @@ -403,7 +403,7 @@ mod event_stream { use aws_smithy_async::time::SharedTimeSource; use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; /// Event Stream SigV4 signing implementation. #[derive(Debug)] @@ -411,7 +411,7 @@ mod event_stream { last_signature: String, credentials: Credentials, signing_region: SigningRegion, - signing_service: SigningService, + signing_name: SigningName, time: SharedTimeSource, } @@ -420,14 +420,14 @@ mod event_stream { last_signature: String, credentials: Credentials, signing_region: SigningRegion, - signing_service: SigningService, + signing_name: SigningName, time: SharedTimeSource, ) -> Self { Self { last_signature, credentials, signing_region, - signing_service, + signing_name, time, } } @@ -437,7 +437,7 @@ mod event_stream { .access_key(self.credentials.access_key_id()) .secret_key(self.credentials.secret_access_key()) .region(self.signing_region.as_ref()) - .service_name(self.signing_service.as_ref()) + .name(self.signing_name.as_ref()) .time(self.time.now()) .settings(()); builder.set_security_token(self.credentials.session_token()); @@ -472,7 +472,7 @@ mod event_stream { use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; use aws_types::region::Region; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::time::{Duration, UNIX_EPOCH}; fn check_send_sync(value: T) -> T { @@ -486,7 +486,7 @@ mod event_stream { "initial-signature".into(), Credentials::for_tests(), SigningRegion::from(region), - SigningService::from_static("transcribe"), + SigningName::from_static("transcribe"), SharedTimeSource::new(UNIX_EPOCH + Duration::new(1611160427, 0)), )); let mut signatures = Vec::new(); @@ -520,7 +520,7 @@ mod tests { use aws_sigv4::http_request::SigningSettings; use aws_smithy_types::config_bag::Layer; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::collections::HashMap; use std::time::{Duration, SystemTime}; use tracing_test::traced_test; @@ -543,7 +543,7 @@ mod tests { ); let operation_config = SigV4OperationSigningConfig { region: Some(SigningRegion::from_static("test")), - service: Some(SigningService::from_static("test")), + service: Some(SigningName::from_static("test")), signing_options: SigningOptions { double_uri_encode: true, content_sha256_header: true, @@ -570,7 +570,7 @@ mod tests { let mut layer = Layer::new("test"); layer.store_put(SigV4OperationSigningConfig { region: Some(SigningRegion::from(Region::new("override-this-region"))), - service: Some(SigningService::from_static("override-this-service")), + service: Some(SigningName::from_static("override-this-service")), signing_options: Default::default(), }); let config = Document::Object({ @@ -597,7 +597,7 @@ mod tests { ); assert_eq!( result.service, - Some(SigningService::from_static("qldb-override")) + Some(SigningName::from_static("qldb-override")) ); assert!(matches!(result, Cow::Owned(_))); } @@ -607,7 +607,7 @@ mod tests { let mut layer = Layer::new("test"); layer.store_put(SigV4OperationSigningConfig { region: Some(SigningRegion::from(Region::new("us-east-1"))), - service: Some(SigningService::from_static("qldb")), + service: Some(SigningName::from_static("qldb")), signing_options: Default::default(), }); let cfg = ConfigBag::of_layers(vec![layer]); @@ -619,7 +619,7 @@ mod tests { result.region, Some(SigningRegion::from(Region::new("us-east-1"))) ); - assert_eq!(result.service, Some(SigningService::from_static("qldb"))); + assert_eq!(result.service, Some(SigningName::from_static("qldb"))); assert!(matches!(result, Cow::Borrowed(_))); } } diff --git a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs index bf51ac2723d..9ffddafc2d6 100644 --- a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs +++ b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs @@ -14,7 +14,7 @@ use aws_sigv4::SigningParams; use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; use aws_smithy_http::property_bag::{PropertyBag, SharedPropertyBag}; use aws_types::region::SigningRegion; -use aws_types::SigningService; +use aws_types::SigningName; use std::time::SystemTime; /// Event Stream SigV4 signing implementation. @@ -23,7 +23,7 @@ pub struct SigV4MessageSigner { last_signature: String, credentials: Credentials, signing_region: SigningRegion, - signing_service: SigningService, + signing_name: SigningName, time: Option, } @@ -32,14 +32,14 @@ impl SigV4MessageSigner { last_signature: String, credentials: Credentials, signing_region: SigningRegion, - signing_service: SigningService, + signing_name: SigningName, time: Option, ) -> Self { Self { last_signature, credentials, signing_region, - signing_service, + signing_name, time, } } @@ -49,7 +49,7 @@ impl SigV4MessageSigner { .access_key(self.credentials.access_key_id()) .secret_key(self.credentials.secret_access_key()) .region(self.signing_region.as_ref()) - .service_name(self.signing_service.as_ref()) + .name(self.signing_name.as_ref()) .time(self.time.unwrap_or_else(SystemTime::now)) .settings(()); builder.set_security_token(self.credentials.session_token()); @@ -84,7 +84,7 @@ mod tests { use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; use aws_types::region::Region; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::time::{Duration, UNIX_EPOCH}; fn check_send_sync(value: T) -> T { @@ -98,7 +98,7 @@ mod tests { "initial-signature".into(), Credentials::for_tests(), SigningRegion::from(region), - SigningService::from_static("transcribe"), + SigningName::from_static("transcribe"), Some(UNIX_EPOCH + Duration::new(1611160427, 0)), )); let mut signatures = Vec::new(); @@ -146,7 +146,7 @@ impl SigV4Signer { // so we can safely assume they all exist in the property bag at this point. let credentials = properties.get::().unwrap(); let region = properties.get::().unwrap(); - let signing_service = properties.get::().unwrap(); + let name = properties.get::().unwrap(); let time = properties .get::() .copied() @@ -155,7 +155,7 @@ impl SigV4Signer { .access_key(credentials.access_key_id()) .secret_key(credentials.secret_access_key()) .region(region.as_ref()) - .service_name(signing_service.as_ref()) + .name(name.as_ref()) .time(time) .settings(()); builder.set_security_token(credentials.session_token()); @@ -210,7 +210,7 @@ mod old_tests { use aws_smithy_http::property_bag::PropertyBag; use aws_types::region::Region; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::time::{Duration, UNIX_EPOCH}; #[test] @@ -219,7 +219,7 @@ mod old_tests { let mut properties = PropertyBag::new(); properties.insert(region.clone()); properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); - properties.insert(SigningService::from_static("transcribe")); + properties.insert(SigningName::from_static("transcribe")); properties.insert(Credentials::for_tests()); properties.insert(SigningRegion::from(region)); properties.insert(Signature::new("initial-signature".into())); diff --git a/aws/rust-runtime/aws-sig-auth/src/lib.rs b/aws/rust-runtime/aws-sig-auth/src/lib.rs index 90cc88a7e37..c6380992d65 100644 --- a/aws/rust-runtime/aws-sig-auth/src/lib.rs +++ b/aws/rust-runtime/aws-sig-auth/src/lib.rs @@ -18,7 +18,7 @@ //! ```rust //! use aws_credential_types::Credentials; //! use aws_smithy_http::body::SdkBody; -//! use aws_types::SigningService; +//! use aws_types::SigningName; //! use aws_types::region::{Region, SigningRegion}; //! use std::time::{Duration, SystemTime, UNIX_EPOCH}; //! use aws_sig_auth::signer::{self, SigningError, OperationSigningConfig, HttpSignatureType, RequestConfig}; @@ -38,7 +38,7 @@ //! let request_config = RequestConfig { //! request_ts: timestamp, //! region: &SigningRegion::from(region), -//! service: &SigningService::from_static("rds-db"), +//! name: &SigningName::from_static("rds-db"), //! payload_override: None, //! }; //! let mut request = http::Request::builder() @@ -85,7 +85,7 @@ //! use aws_sig_auth::signer::{OperationSigningConfig, RequestConfig, SigV4Signer}; //! use aws_smithy_http::body::SdkBody; //! use aws_types::region::{Region, SigningRegion}; -//! use aws_types::SigningService; +//! use aws_types::SigningName; //! use std::error::Error; //! use std::time::SystemTime; //! async fn sign_request( @@ -98,7 +98,7 @@ //! let request_config = RequestConfig { //! request_ts: now, //! region: &SigningRegion::from(region), -//! service: &SigningService::from_static("execute-api"), +//! name: &SigningName::from_static("execute-api"), //! payload_override: None, //! }; //! signer.sign( diff --git a/aws/rust-runtime/aws-sig-auth/src/middleware.rs b/aws/rust-runtime/aws-sig-auth/src/middleware.rs index b901f3a8561..efa0543e3c5 100644 --- a/aws/rust-runtime/aws-sig-auth/src/middleware.rs +++ b/aws/rust-runtime/aws-sig-auth/src/middleware.rs @@ -14,7 +14,7 @@ use aws_credential_types::Credentials; use aws_sigv4::http_request::SignableBody; use aws_smithy_async::time::SharedTimeSource; use aws_types::region::SigningRegion; -use aws_types::SigningService; +use aws_types::SigningName; use crate::signer::{ OperationSigningConfig, RequestConfig, SigV4Signer, SigningError, SigningRequirements, @@ -50,7 +50,7 @@ impl AsRef for Signature { /// /// Prior to signing, the following fields MUST be present in the property bag: /// - [`SigningRegion`](SigningRegion): The region used when signing the request, e.g. `us-east-1` -/// - [`SigningService`](SigningService): The name of the service to use when signing the request, e.g. `dynamodb` +/// - [`SigningName`](SigningName): The name of the service to use when signing the request, e.g. `dynamodb` /// - [`Credentials`](Credentials): Credentials to sign with /// - [`OperationSigningConfig`](OperationSigningConfig): Operation specific signing configuration, e.g. /// changes to URL encoding behavior, or headers that must be omitted. @@ -71,7 +71,7 @@ impl SigV4SigningStage { enum SigningStageErrorKind { MissingCredentials, MissingSigningRegion, - MissingSigningService, + MissingSigningName, MissingSigningConfig, SigningFailure(SigningError), } @@ -91,7 +91,7 @@ impl Display for SigningStageError { MissingSigningRegion => { write!(f, "no signing region in the property bag") } - MissingSigningService => { + MissingSigningName => { write!(f, "no signing service in the property bag") } MissingSigningConfig => { @@ -109,7 +109,7 @@ impl Error for SigningStageError { ErrorKind::SigningFailure(err) => Some(err), ErrorKind::MissingCredentials | ErrorKind::MissingSigningRegion - | ErrorKind::MissingSigningService + | ErrorKind::MissingSigningName | ErrorKind::MissingSigningConfig => None, } } @@ -143,9 +143,9 @@ fn signing_config( let region = config .get::() .ok_or(SigningStageErrorKind::MissingSigningRegion)?; - let signing_service = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningService)?; + let name = config + .get::() + .ok_or(SigningStageErrorKind::MissingSigningName)?; let payload_override = config.get::>(); let request_config = RequestConfig { request_ts: config @@ -154,7 +154,7 @@ fn signing_config( .unwrap_or_else(|| SharedTimeSource::default().now()), region, payload_override, - service: signing_service, + name, }; Ok((operation_config, request_config, credentials)) } @@ -195,7 +195,7 @@ impl MapRequest for SigV4SigningStage { signature.as_ref().into(), creds, request_config.region.clone(), - request_config.service.clone(), + request_config.name.clone(), time_override, )) as _) .expect("failed to send deferred signer"); @@ -221,7 +221,7 @@ mod test { use aws_endpoint::AwsAuthStage; use aws_smithy_async::time::SharedTimeSource; use aws_types::region::{Region, SigningRegion}; - use aws_types::SigningService; + use aws_types::SigningName; use crate::middleware::{ SigV4SigningStage, Signature, SigningStageError, SigningStageErrorKind, @@ -239,7 +239,7 @@ mod test { .augment(|req, properties| { properties.insert(region.clone()); properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); - properties.insert(SigningService::from_static("kinesis")); + properties.insert(SigningName::from_static("kinesis")); properties.insert(OperationSigningConfig::default_config()); properties.insert(Credentials::for_tests()); properties.insert(SigningRegion::from(region)); @@ -273,7 +273,7 @@ mod test { properties.insert::(SharedTimeSource::new( UNIX_EPOCH + Duration::new(1611160427, 0), )); - properties.insert(SigningService::from_static("kinesis")); + properties.insert(SigningName::from_static("kinesis")); properties.insert(OperationSigningConfig::default_config()); properties.insert(Credentials::for_tests()); properties.insert(SigningRegion::from(region.clone())); @@ -290,7 +290,7 @@ mod test { "abac477b4afabf5651079e7b9a0aa6a1a3e356a7418a81d974cdae9d4c8e5441".into(), Credentials::for_tests(), SigningRegion::from(region), - SigningService::from_static("kinesis"), + SigningName::from_static("kinesis"), Some(UNIX_EPOCH + Duration::new(1611160427, 0)), ); @@ -317,7 +317,7 @@ mod test { conf.insert(SharedTimeSource::new( UNIX_EPOCH + Duration::new(1611160427, 0), )); - conf.insert(SigningService::from_static("kinesis")); + conf.insert(SigningName::from_static("kinesis")); conf.insert(endpoint); Result::<_, Infallible>::Ok(req) }) diff --git a/aws/rust-runtime/aws-sig-auth/src/signer.rs b/aws/rust-runtime/aws-sig-auth/src/signer.rs index 7542dc12de8..071b2e6f3f2 100644 --- a/aws/rust-runtime/aws-sig-auth/src/signer.rs +++ b/aws/rust-runtime/aws-sig-auth/src/signer.rs @@ -10,7 +10,7 @@ use aws_sigv4::http_request::{ }; use aws_smithy_http::body::SdkBody; use aws_types::region::SigningRegion; -use aws_types::SigningService; +use aws_types::SigningName; use std::fmt; use std::time::{Duration, SystemTime}; @@ -102,7 +102,7 @@ pub struct SigningOptions { pub struct RequestConfig<'a> { pub request_ts: SystemTime, pub region: &'a SigningRegion, - pub service: &'a SigningService, + pub name: &'a SigningName, pub payload_override: Option<&'a SignableBody<'static>>, } @@ -175,7 +175,7 @@ impl SigV4Signer { .access_key(credentials.access_key_id()) .secret_key(credentials.secret_access_key()) .region(request_config.region.as_ref()) - .service_name(request_config.service.as_ref()) + .name(request_config.name.as_ref()) .time(request_config.request_ts) .settings(settings); builder.set_security_token(credentials.session_token()); @@ -240,7 +240,7 @@ mod tests { use aws_credential_types::Credentials; use aws_sigv4::http_request::SigningSettings; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::time::{Duration, SystemTime}; use tracing_test::traced_test; @@ -263,7 +263,7 @@ mod tests { let request_config = RequestConfig { request_ts: now, region: &SigningRegion::from_static("test"), - service: &SigningService::from_static("test"), + name: &SigningName::from_static("test"), payload_override: None, }; SigV4Signer::signing_params(settings, &credentials, &request_config); diff --git a/aws/rust-runtime/aws-sigv4/src/event_stream.rs b/aws/rust-runtime/aws-sigv4/src/event_stream.rs index a8da19ab039..17b4e67bcfd 100644 --- a/aws/rust-runtime/aws-sigv4/src/event_stream.rs +++ b/aws/rust-runtime/aws-sigv4/src/event_stream.rs @@ -25,7 +25,7 @@ //! .access_key("example access key") //! .secret_key("example secret key") //! .region("us-east-1") -//! .service_name("exampleservice") +//! .name("exampleservice") //! .time(SystemTime::now()) //! .settings(()) //! .build() @@ -65,7 +65,7 @@ fn calculate_string_to_sign( writeln!( sts, "{}/{}/{}/aws4_request", - date_str, params.region, params.service_name + date_str, params.region, params.name ) .unwrap(); writeln!(sts, "{}", last_signature).unwrap(); @@ -117,8 +117,7 @@ fn sign_payload<'a>( // needs to exactly match the string formatted timestamp, which doesn't include sub-seconds. let time = truncate_subsecs(params.time); - let signing_key = - generate_signing_key(params.secret_key, time, params.region, params.service_name); + let signing_key = generate_signing_key(params.secret_key, time, params.region, params.name); let string_to_sign = calculate_string_to_sign( message_payload.as_ref().map(|v| &v[..]).unwrap_or(&[]), last_signature, @@ -159,7 +158,7 @@ mod tests { secret_key: "fake secret key", security_token: None, region: "us-east-1", - service_name: "testservice", + name: "testservice", time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)), settings: (), }; @@ -197,7 +196,7 @@ mod tests { secret_key: "fake secret key", security_token: None, region: "us-east-1", - service_name: "testservice", + name: "testservice", time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)), settings: (), }; diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index a16a7d4128a..7da3922941d 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -170,7 +170,7 @@ impl<'a> CanonicalRequest<'a> { params.access_key, format_date(params.time), params.region, - params.service_name, + params.name, ), date_time, expires: params @@ -554,7 +554,7 @@ mod tests { secret_key: "test-secret-key", security_token: None, region: "test-region", - service_name: "testservicename", + name: "testservicename", time: parse_date_time("20210511T154045Z").unwrap(), settings, } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs b/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs index d9fe5b4c850..971f706aa64 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs @@ -23,7 +23,7 @@ //! .access_key("example access key") //! .secret_key("example secret key") //! .region("us-east-1") -//! .service_name("exampleservice") +//! .name("exampleservice") //! .time(SystemTime::now()) //! .settings(signing_settings) //! .build() diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index 2c6da9d1293..0010aeb039f 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -215,19 +215,10 @@ fn calculate_signing_params<'a>( let creq = CanonicalRequest::from(request, params)?; let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); - let string_to_sign = StringToSign::new( - params.time, - params.region, - params.service_name, - encoded_creq, - ) - .to_string(); - let signing_key = generate_signing_key( - params.secret_key, - params.time, - params.region, - params.service_name, - ); + let string_to_sign = + StringToSign::new(params.time, params.region, params.name, encoded_creq).to_string(); + let signing_key = + generate_signing_key(params.secret_key, params.time, params.region, params.name); let signature = calculate_signature(signing_key, string_to_sign.as_bytes()); tracing::trace!(canonical_request = %creq, string_to_sign = %string_to_sign, "calculated signing parameters"); @@ -270,20 +261,11 @@ fn calculate_signing_headers<'a>( // Step 2: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-string-to-sign.html. let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); - let sts = StringToSign::new( - params.time, - params.region, - params.service_name, - encoded_creq, - ); + let sts = StringToSign::new(params.time, params.region, params.name, encoded_creq); // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html - let signing_key = generate_signing_key( - params.secret_key, - params.time, - params.region, - params.service_name, - ); + let signing_key = + generate_signing_key(params.secret_key, params.time, params.region, params.name); let signature = calculate_signature(signing_key, sts.to_string().as_bytes()); // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html @@ -388,7 +370,7 @@ mod tests { secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", security_token: None, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, }; @@ -417,7 +399,7 @@ mod tests { secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", security_token: None, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, }; @@ -449,7 +431,7 @@ mod tests { secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", security_token: None, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, }; @@ -477,7 +459,7 @@ mod tests { secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", security_token: None, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, }; @@ -531,7 +513,7 @@ mod tests { secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", security_token: None, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, }; @@ -593,7 +575,7 @@ mod tests { secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", security_token: None, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, }; @@ -655,7 +637,7 @@ mod tests { secret_key: "asdf", security_token: None, region: "us-east-1", - service_name: "foo", + name: "foo", time: std::time::SystemTime::UNIX_EPOCH, settings, }; diff --git a/aws/rust-runtime/aws-sigv4/src/lib.rs b/aws/rust-runtime/aws-sigv4/src/lib.rs index d20df239947..0f4df11fc9c 100644 --- a/aws/rust-runtime/aws-sigv4/src/lib.rs +++ b/aws/rust-runtime/aws-sigv4/src/lib.rs @@ -40,8 +40,10 @@ pub struct SigningParams<'a, S> { /// Region to sign for. pub(crate) region: &'a str, - /// AWS Service Name to sign for. - pub(crate) service_name: &'a str, + /// Service Name to sign for. + /// + /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name. + pub(crate) name: &'a str, /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). pub(crate) time: SystemTime, @@ -50,14 +52,14 @@ pub struct SigningParams<'a, S> { } impl<'a, S> SigningParams<'a, S> { - /// Returns the region that will be used to sign + /// Returns the signing region. pub fn region(&self) -> &str { self.region } - /// Returns the service name that will be used to sign - pub fn service_name(&self) -> &str { - self.service_name + /// Returns the signing name. + pub fn name(&self) -> &str { + self.name } } @@ -68,7 +70,7 @@ impl<'a, S: fmt::Debug> fmt::Debug for SigningParams<'a, S> { .field("secret_key", &"** redacted **") .field("security_token", &"** redacted **") .field("region", &self.region) - .field("service_name", &self.service_name) + .field("name", &self.name) .field("time", &self.time) .field("settings", &self.settings) .finish() @@ -115,7 +117,7 @@ pub mod signing_params { secret_key: Option<&'a str>, security_token: Option<&'a str>, region: Option<&'a str>, - service_name: Option<&'a str>, + name: Option<&'a str>, time: Option, settings: Option, } @@ -161,14 +163,14 @@ pub mod signing_params { self.region = region; } - /// Sets the service name (required) - pub fn service_name(mut self, service_name: &'a str) -> Self { - self.service_name = Some(service_name); + /// Sets the signing name (required) + pub fn name(mut self, name: &'a str) -> Self { + self.name = Some(name); self } - /// Sets the service name (required) - pub fn set_service_name(&mut self, service_name: Option<&'a str>) { - self.service_name = service_name; + /// Sets the signing name (required) + pub fn set_name(&mut self, name: Option<&'a str>) { + self.name = name; } /// Sets the time to be used in the signature (required) @@ -205,9 +207,9 @@ pub mod signing_params { region: self .region .ok_or_else(|| BuildError::new("region is required"))?, - service_name: self - .service_name - .ok_or_else(|| BuildError::new("service name is required"))?, + name: self + .name + .ok_or_else(|| BuildError::new("name is required"))?, time: self .time .ok_or_else(|| BuildError::new("time is required"))?, diff --git a/aws/rust-runtime/aws-types/src/lib.rs b/aws/rust-runtime/aws-types/src/lib.rs index ed4e635037e..bf54671e150 100644 --- a/aws/rust-runtime/aws-types/src/lib.rs +++ b/aws/rust-runtime/aws-types/src/lib.rs @@ -30,34 +30,34 @@ use std::borrow::Cow; /// The name of the service used to sign this request /// -/// Generally, user code should never interact with `SigningService` directly +/// Generally, user code should never interact with `SigningName` directly #[derive(Clone, Debug, PartialEq, Eq)] -pub struct SigningService(Cow<'static, str>); -impl AsRef for SigningService { +pub struct SigningName(Cow<'static, str>); +impl AsRef for SigningName { fn as_ref(&self) -> &str { &self.0 } } -impl SigningService { - /// Creates a `SigningService` from a static str. - pub fn from_static(service: &'static str) -> Self { - SigningService(Cow::Borrowed(service)) +impl SigningName { + /// Creates a `SigningName` from a static str. + pub fn from_static(name: &'static str) -> Self { + SigningName(Cow::Borrowed(name)) } } -impl From for SigningService { - fn from(service: String) -> Self { - SigningService(Cow::Owned(service)) +impl From for SigningName { + fn from(name: String) -> Self { + SigningName(Cow::Owned(name)) } } -impl From<&'static str> for SigningService { - fn from(service: &'static str) -> Self { - Self::from_static(service) +impl From<&'static str> for SigningName { + fn from(name: &'static str) -> Self { + Self::from_static(name) } } -impl Storable for SigningService { +impl Storable for SigningName { type Storer = StoreReplace; } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 9757fae2dfe..5f92d6ee1c2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -60,10 +60,7 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: private val codegenScope by lazy { val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( - "SIGV4_SCHEME_ID" to awsRuntime.resolve("auth::sigv4::SCHEME_ID"), "SigV4AuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4AuthScheme"), - "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), - "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), "SharedAuthScheme" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::auth::SharedAuthScheme"), ) } @@ -91,13 +88,10 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg private val codegenScope by lazy { val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( - "HttpSignatureType" to awsRuntime.resolve("auth::sigv4::HttpSignatureType"), - "SIGV4_SCHEME_ID" to awsRuntime.resolve("auth::sigv4::SCHEME_ID"), "SigV4OperationSigningConfig" to awsRuntime.resolve("auth::sigv4::SigV4OperationSigningConfig"), "SigningOptions" to awsRuntime.resolve("auth::sigv4::SigningOptions"), - "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), - "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), "SignableBody" to AwsRuntimeType.awsSigv4(runtimeConfig).resolve("http_request::SignableBody"), + "Default" to RuntimeType.Default, ) } private val serviceIndex = ServiceIndex.of(codegenContext.model) @@ -113,6 +107,7 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg val normalizeUrlPath = !disableUriPathNormalization(codegenContext.serviceShape) rustTemplate( """ + // SigningOptions is non-exhaustive, so it can't be created with a struct expression. let mut signing_options = #{SigningOptions}::default(); signing_options.double_uri_encode = $doubleUriEncode; signing_options.content_sha256_header = $contentSha256Header; @@ -120,9 +115,8 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg signing_options.payload_override = #{payload_override}; ${section.newLayerName}.store_put(#{SigV4OperationSigningConfig} { - region: None, - service: None, signing_options, + ..#{Default}::default() }); """, *codegenScope, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt index 8b7ee5dbcf5..e79044c797f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt @@ -35,9 +35,9 @@ import software.amazon.smithy.rust.codegen.core.util.isInputEventStream // TODO(enableNewSmithyRuntimeCleanup): Remove this decorator (superseded by SigV4AuthDecorator) /** * The SigV4SigningDecorator: - * - adds a `signing_service()` method to `config` to return the default signing service + * - adds a `name()` method to `config` to return the default signing service * - adds a `new_event_stream_signer()` method to `config` to create an Event Stream SigV4 signer - * - sets the `SigningService` during operation construction + * - sets the `SigningName` during operation construction * - sets a default `OperationSigningConfig` A future enhancement will customize this for specific services that need * different behavior. */ @@ -83,7 +83,7 @@ class SigV4SigningConfig( ) : ConfigCustomization() { private val codegenScope = arrayOf( "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), - "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), + "SigningName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningName"), "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), ) @@ -94,9 +94,9 @@ class SigV4SigningConfig( """ /// The signature version 4 service signing name to use in the credential scope when signing requests. /// - /// The signing service may be overridden by the `Endpoint`, or by specifying a custom - /// [`SigningService`](aws_types::SigningService) during operation construction - pub fn signing_service(&self) -> &'static str { + /// The signing name may be overridden by the `Endpoint`, or by specifying a custom + /// [`SigningName`](aws_types::SigningName) during operation construction + pub fn name(&self) -> &'static str { ${sigV4Trait.name.dq()} } """, @@ -105,7 +105,7 @@ class SigV4SigningConfig( ServiceConfig.BuilderBuild -> { rustTemplate( """ - layer.store_put(#{SigningService}::from_static(${sigV4Trait.name.dq()})); + layer.store_put(#{SigningName}::from_static(${sigV4Trait.name.dq()})); layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); """, *codegenScope, @@ -194,7 +194,7 @@ class SigV4SigningFeature( rustTemplate( """ ${section.request}.properties_mut().insert(signing_config); - ${section.request}.properties_mut().insert(#{aws_types}::SigningService::from_static(${section.config}.signing_service())); + ${section.request}.properties_mut().insert(#{aws_types}::SigningName::from_static(${section.config}.name())); if let Some(region) = &${section.config}.region { ${section.request}.properties_mut().insert(#{aws_types}::region::SigningRegion::from(region.clone())); } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt index b205885f7dd..da7df577652 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt @@ -32,10 +32,10 @@ internal class SigV4SigningDecoratorTest { ) project.lib { unitTest( - "signing_service_override", + "signing_name_override", """ let conf = crate::config::Config::builder().build(); - assert_eq!(conf.signing_service(), "test-service"); + assert_eq!(conf.name(), "test-service"); """, ) } diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index cd1f77cd86d..1dc363bc96a 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -24,7 +24,7 @@ async fn signv4_use_correct_service_name() { .header("x-amz-target", "QLDBSession.SendCommand") .header("content-length", "49") .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=350f957e9b736ac3f636d16c59c0a3cee8c2780b0ffadc99bbca841b7f15bee4") - // qldbsession uses the service name 'qldb' in signature ____________________________________^^^^ + // qldbsession uses the signing name 'qldb' in signature ____________________________________^^^^ .header("x-amz-date", "20210305T134922Z") .header("x-amz-security-token", "notarealsessiontoken") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") From 31dafaf77bc0d67d50d4df14db7f74f8166c3d66 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 17 Aug 2023 18:32:00 -0700 Subject: [PATCH 071/331] Fix re-export of `SdkError` --- .../customize/RequiredCustomizations.kt | 21 ++++- .../customizations/SmithyTypesPubUseExtra.kt | 90 ++++++------------- .../SmithyTypesPubUseExtraTest.kt | 74 +++++++-------- .../ServerRequiredCustomizations.kt | 15 +++- 4 files changed, 96 insertions(+), 104 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 46de4940a07..bf46d496d17 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -24,10 +24,11 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCus import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Feature +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization -import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyErrorTypes import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.core.util.letIf @@ -79,6 +80,8 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations + AllowLintsCustomization() override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { + val rc = codegenContext.runtimeConfig + // Add rt-tokio feature for `ByteStream::from_path` rustCrate.mergeFeature(Feature("rt-tokio", true, listOf("aws-smithy-http/rt-tokio"))) @@ -91,7 +94,21 @@ class RequiredCustomizations : ClientCodegenDecorator { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) } rustCrate.withModule(ClientRustModule.Error) { - pubUseSmithyErrorTypes(codegenContext)(this) + rustTemplate( + """ + pub type SdkError = #{SdkError}; + pub use #{DisplayErrorContext}; + pub use #{ProvideErrorMetadata}; + """, + "SdkError" to RuntimeType.smithyHttp(rc).resolve("result::SdkError"), + "SdkErrorResponse" to if (codegenContext.smithyRuntimeMode.generateOrchestrator) { + RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse") + } else { + RuntimeType.HttpResponse + }, + "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), + "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + ) } ClientRustModule.Meta.also { metaModule -> diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt index 301ee11da8c..14d081b2cb7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt @@ -9,20 +9,12 @@ import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember -import software.amazon.smithy.rust.codegen.core.util.letIf - -private data class PubUseType( - val type: RuntimeType, - val shouldExport: (Model) -> Boolean, - val alias: String? = null, -) /** Returns true if the model has normal streaming operations (excluding event streams) */ private fun hasStreamingOperations(model: Model): Boolean { @@ -48,62 +40,34 @@ private fun hasBlobs(model: Model): Boolean = structUnionMembersMatchPredicate(m /** Returns true if the model uses any timestamp shapes */ private fun hasDateTimes(model: Model): Boolean = structUnionMembersMatchPredicate(model, Shape::isTimestampShape) -/** Returns a list of types that should be re-exported for the given model */ -internal fun pubUseTypes(codegenContext: CodegenContext, model: Model): List = - pubUseTypesThatShouldBeExported(codegenContext, model).map { it.type } - -private fun pubUseTypesThatShouldBeExported(codegenContext: CodegenContext, model: Model): List { - val runtimeConfig = codegenContext.runtimeConfig - return ( - listOf( - PubUseType(RuntimeType.blob(runtimeConfig), ::hasBlobs), - PubUseType(RuntimeType.dateTime(runtimeConfig), ::hasDateTimes), - PubUseType(RuntimeType.format(runtimeConfig), ::hasDateTimes, "DateTimeFormat"), - ) + RuntimeType.smithyHttp(runtimeConfig).let { http -> - listOf( - PubUseType(http.resolve("byte_stream::ByteStream"), ::hasStreamingOperations), - PubUseType(http.resolve("byte_stream::AggregatedBytes"), ::hasStreamingOperations), - PubUseType(http.resolve("byte_stream::error::Error"), ::hasStreamingOperations, "ByteStreamError"), - PubUseType(http.resolve("body::SdkBody"), ::hasStreamingOperations), - ) - } - ).filter { pubUseType -> pubUseType.shouldExport(model) } -} - /** Adds re-export statements for Smithy primitives */ fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model): Writable = writable { - val types = pubUseTypesThatShouldBeExported(codegenContext, model) - if (types.isNotEmpty()) { - types.forEach { - val useStatement = if (it.alias == null) { - "pub use #T;" - } else { - "pub use #T as ${it.alias};" - } - rust(useStatement, it.type) - } + val rc = codegenContext.runtimeConfig + if (hasBlobs(model)) { + rustTemplate("pub use #{Blob};", "Blob" to RuntimeType.blob(rc)) } -} - -/** Adds re-export statements for error types */ -fun pubUseSmithyErrorTypes(codegenContext: CodegenContext): Writable = writable { - val runtimeConfig = codegenContext.runtimeConfig - val reexports = listOf( - listOf( - RuntimeType.smithyHttp(runtimeConfig).let { http -> - PubUseType(http.resolve("result::SdkError"), { _ -> true }) - }, - ), - RuntimeType.smithyTypes(runtimeConfig).let { types -> - listOf(PubUseType(types.resolve("error::display::DisplayErrorContext"), { _ -> true })) - // Only re-export `ProvideErrorMetadata` for clients - .letIf(codegenContext.target == CodegenTarget.CLIENT) { list -> - list + - listOf(PubUseType(types.resolve("error::metadata::ProvideErrorMetadata"), { _ -> true })) - } - }, - ).flatten() - reexports.forEach { reexport -> - rust("pub use #T;", reexport.type) + if (hasDateTimes(model)) { + rustTemplate( + """ + pub use #{DateTime}; + pub use #{Format} as DateTimeFormat; + """, + "DateTime" to RuntimeType.dateTime(rc), + "Format" to RuntimeType.format(rc), + ) + } + if (hasStreamingOperations(model)) { + rustTemplate( + """ + pub use #{ByteStream}; + pub use #{AggregatedBytes}; + pub use #{Error} as ByteStreamError; + pub use #{SdkBody}; + """, + "ByteStream" to RuntimeType.smithyHttp(rc).resolve("byte_stream::ByteStream"), + "AggregatedBytes" to RuntimeType.smithyHttp(rc).resolve("byte_stream::AggregatedBytes"), + "Error" to RuntimeType.smithyHttp(rc).resolve("byte_stream::error::Error"), + "SdkBody" to RuntimeType.smithyHttp(rc).resolve("body::SdkBody"), + ) } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt index 55b792218f3..b02574e6a53 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt @@ -7,7 +7,7 @@ package software.amazon.smithy.rust.codegen.core.smithy.customizations import org.junit.jupiter.api.Test import software.amazon.smithy.model.Model -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGeneratorTest.Companion.model import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext @@ -43,61 +43,61 @@ class SmithyTypesPubUseExtraTest { """.asSmithyModel() } - private fun typesWithEmptyModel() = typesWithMember() - private fun typesWithMember( + private fun reexportsWithEmptyModel() = reexportsWithMember() + private fun reexportsWithMember( inputMember: String = "", outputMember: String = "", unionMember: String = "", additionalShape: String = "", - ) = pubUseTypes(testCodegenContext(model), modelWithMember(inputMember, outputMember, unionMember, additionalShape)) + ) = RustWriter.root().let { writer -> + pubUseSmithyPrimitives(testCodegenContext(model), modelWithMember(inputMember, outputMember, unionMember, additionalShape))(writer) + writer.toString() + } - private fun assertDoesntHaveTypes(types: List, expectedTypes: List) = - expectedTypes.forEach { assertDoesntHaveType(types, it) } + private fun assertDoesntHaveReexports(reexports: String, expectedTypes: List) = + expectedTypes.forEach { assertDoesntHaveReexports(reexports, it) } - private fun assertDoesntHaveType(types: List, type: String) { - if (types.any { t -> t.fullyQualifiedName() == type }) { + private fun assertDoesntHaveReexports(reexports: String, type: String) { + if (reexports.contains(type)) { throw AssertionError("Expected $type to NOT be re-exported, but it was.") } } - private fun assertHasTypes(types: List, expectedTypes: List) = - expectedTypes.forEach { assertHasType(types, it) } + private fun assertHasReexports(reexports: String, expectedTypes: List) = + expectedTypes.forEach { assertHasReexport(reexports, it) } - private fun assertHasType(types: List, type: String) { - if (types.none { t -> t.fullyQualifiedName() == type }) { - throw AssertionError( - "Expected $type to be re-exported. Re-exported types: " + - types.joinToString { it.fullyQualifiedName() }, - ) + private fun assertHasReexport(reexports: String, type: String) { + if (!reexports.contains(type)) { + throw AssertionError("Expected $type to be re-exported. Re-exported types:\n$reexports") } } @Test fun `it re-exports Blob when a model uses blobs`() { - assertDoesntHaveType(typesWithEmptyModel(), "::aws_smithy_types::Blob") - assertHasType(typesWithMember(inputMember = "foo: Blob"), "::aws_smithy_types::Blob") - assertHasType(typesWithMember(outputMember = "foo: Blob"), "::aws_smithy_types::Blob") - assertHasType( - typesWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Blob"), + this.assertDoesntHaveReexports(reexportsWithEmptyModel(), "::aws_smithy_types::Blob") + assertHasReexport(reexportsWithMember(inputMember = "foo: Blob"), "::aws_smithy_types::Blob") + assertHasReexport(reexportsWithMember(outputMember = "foo: Blob"), "::aws_smithy_types::Blob") + assertHasReexport( + reexportsWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Blob"), "::aws_smithy_types::Blob", ) - assertHasType( - typesWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Blob"), + assertHasReexport( + reexportsWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Blob"), "::aws_smithy_types::Blob", ) } @Test fun `it re-exports DateTime when a model uses timestamps`() { - assertDoesntHaveType(typesWithEmptyModel(), "aws_smithy_types::DateTime") - assertHasType(typesWithMember(inputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") - assertHasType(typesWithMember(outputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") - assertHasType( - typesWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), + this.assertDoesntHaveReexports(reexportsWithEmptyModel(), "aws_smithy_types::DateTime") + assertHasReexport(reexportsWithMember(inputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") + assertHasReexport(reexportsWithMember(outputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") + assertHasReexport( + reexportsWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), "::aws_smithy_types::DateTime", ) - assertHasType( - typesWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), + assertHasReexport( + reexportsWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), "::aws_smithy_types::DateTime", ) } @@ -108,20 +108,20 @@ class SmithyTypesPubUseExtraTest { listOf("::aws_smithy_http::byte_stream::ByteStream", "::aws_smithy_http::byte_stream::AggregatedBytes") val streamingShape = "@streaming blob Streaming" - assertDoesntHaveTypes(typesWithEmptyModel(), streamingTypes) - assertHasTypes(typesWithMember(additionalShape = streamingShape, inputMember = "m: Streaming"), streamingTypes) - assertHasTypes(typesWithMember(additionalShape = streamingShape, outputMember = "m: Streaming"), streamingTypes) + this.assertDoesntHaveReexports(reexportsWithEmptyModel(), streamingTypes) + assertHasReexports(reexportsWithMember(additionalShape = streamingShape, inputMember = "m: Streaming"), streamingTypes) + assertHasReexports(reexportsWithMember(additionalShape = streamingShape, outputMember = "m: Streaming"), streamingTypes) // Event streams don't re-export the normal streaming types - assertDoesntHaveTypes( - typesWithMember( + this.assertDoesntHaveReexports( + reexportsWithMember( additionalShape = "@streaming union EventStream { foo: SomeStruct }", inputMember = "m: EventStream", ), streamingTypes, ) - assertDoesntHaveTypes( - typesWithMember( + this.assertDoesntHaveReexports( + reexportsWithMember( additionalShape = "@streaming union EventStream { foo: SomeStruct }", outputMember = "m: EventStream", ), diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index ceba38691bf..b79ff3b2875 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -6,10 +6,11 @@ package software.amazon.smithy.rust.codegen.server.smithy.customizations import software.amazon.smithy.rust.codegen.core.rustlang.Feature +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization -import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyErrorTypes import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext @@ -34,12 +35,22 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { baseCustomizations + AllowLintsCustomization() override fun extras(codegenContext: ServerCodegenContext, rustCrate: RustCrate) { + val rc = codegenContext.runtimeConfig + // Add rt-tokio feature for `ByteStream::from_path` rustCrate.mergeFeature(Feature("rt-tokio", true, listOf("aws-smithy-http/rt-tokio"))) rustCrate.withModule(ServerRustModule.Types) { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) - pubUseSmithyErrorTypes(codegenContext)(this) + rustTemplate( + """ + pub type SdkError = #{SdkError}; + pub use #{DisplayErrorContext}; + """, + "SdkError" to RuntimeType.smithyHttp(rc).resolve("result::SdkError"), + "SdkErrorResponse" to RuntimeType.HttpResponse, + "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), + ) } rustCrate.withModule(ServerRustModule.root) { From c4ba6ffd3177acf56d53628c40d6f3cb04703f2b Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 17 Aug 2023 18:36:11 -0700 Subject: [PATCH 072/331] Update changelog --- CHANGELOG.next.toml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e0ea56e68bb..a919c63d521 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -34,3 +34,15 @@ message = "Fix requests to S3 with `no_credentials` set." references = ["smithy-rs#2907", "aws-sdk-rust#864"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading." +references = ["smithy-rs#2931", "aws-sdk-rust#875"] +meta = { "breaking" = true, "tada" = false, "bug" = true } +author = "jdisanti" + +[[smithy-rs]] +message = "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading." +references = ["smithy-rs#2931", "aws-sdk-rust#875"] +meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "client" } +author = "jdisanti" From 0b18d889ab45ac5ba0921e5a5fed7e02850da8be Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 17 Aug 2023 18:42:32 -0700 Subject: [PATCH 073/331] Fix example CI (#2930) --- tools/ci-scripts/check-aws-sdk-examples | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/ci-scripts/check-aws-sdk-examples b/tools/ci-scripts/check-aws-sdk-examples index db5880b499e..2efc2752a16 100755 --- a/tools/ci-scripts/check-aws-sdk-examples +++ b/tools/ci-scripts/check-aws-sdk-examples @@ -13,6 +13,7 @@ cd aws-sdk/examples for example in *; do echo -e "${C_YELLOW}Checking examples/${example}...${C_RESET}" pushd "${example}" &>/dev/null - cargo check && cargo clean + cargo check + cargo clean popd &>/dev/null done From 87d601b456087291da3f990b62b6cf10cabdc134 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 17 Aug 2023 20:46:27 -0500 Subject: [PATCH 074/331] Update SDK models (#2928) Updates SDK models against the latest (as of 8/17). ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: ysaito1001 --- aws/sdk/aws-models/config.json | 698 +- aws/sdk/aws-models/dynamodb.json | 56 +- aws/sdk/aws-models/ec2.json | 3517 ++++- aws/sdk/aws-models/ecs.json | 1154 +- aws/sdk/aws-models/iam.json | 200 +- aws/sdk/aws-models/kms.json | 257 +- aws/sdk/aws-models/lambda.json | 49 +- aws/sdk/aws-models/polly.json | 24 + aws/sdk/aws-models/route53.json | 450 +- aws/sdk/aws-models/s3.json | 19753 +++++++++--------------- aws/sdk/aws-models/sdk-endpoints.json | 924 +- aws/sdk/aws-models/sts.json | 141 +- 12 files changed, 13238 insertions(+), 13985 deletions(-) diff --git a/aws/sdk/aws-models/config.json b/aws/sdk/aws-models/config.json index f96f7b6f754..07c3bf0502c 100644 --- a/aws/sdk/aws-models/config.json +++ b/aws/sdk/aws-models/config.json @@ -13333,6 +13333,342 @@ "traits": { "smithy.api#enumValue": "AWS::SageMaker::Image" } + }, + "ECSTaskSet": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ECS::TaskSet" + } + }, + "CassandraKeyspace": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Cassandra::Keyspace" + } + }, + "SignerSigningProfile": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Signer::SigningProfile" + } + }, + "AmplifyApp": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Amplify::App" + } + }, + "AppMeshVirtualNode": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualNode" + } + }, + "AppMeshVirtualService": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualService" + } + }, + "AppRunnerVpcConnector": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppRunner::VpcConnector" + } + }, + "AppStreamApplication": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppStream::Application" + } + }, + "CodeArtifactRepository": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CodeArtifact::Repository" + } + }, + "EC2PrefixList": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::PrefixList" + } + }, + "EC2SpotFleet": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::SpotFleet" + } + }, + "EvidentlyProject": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Evidently::Project" + } + }, + "ForecastDataset": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Forecast::Dataset" + } + }, + "IAMSAMLProvider": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IAM::SAMLProvider" + } + }, + "IAMServerCertificate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IAM::ServerCertificate" + } + }, + "PinpointCampaign": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::Campaign" + } + }, + "PinpointInAppTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::InAppTemplate" + } + }, + "SageMakerDomain": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::SageMaker::Domain" + } + }, + "TransferAgreement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Agreement" + } + }, + "TransferConnector": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Connector" + } + }, + "KinesisFirehoseDeliveryStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::KinesisFirehose::DeliveryStream" + } + }, + "AmplifyBranch": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Amplify::Branch" + } + }, + "AppIntegrationsEventIntegration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppIntegrations::EventIntegration" + } + }, + "AppMeshRoute": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::Route" + } + }, + "AthenaPreparedStatement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Athena::PreparedStatement" + } + }, + "EC2IPAMScope": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::IPAMScope" + } + }, + "EvidentlyLaunch": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Evidently::Launch" + } + }, + "ForecastDatasetGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Forecast::DatasetGroup" + } + }, + "GreengrassV2ComponentVersion": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::GreengrassV2::ComponentVersion" + } + }, + "GroundStationMissionProfile": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::GroundStation::MissionProfile" + } + }, + "MediaConnectFlowEntitlement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowEntitlement" + } + }, + "MediaConnectFlowVpcInterface": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowVpcInterface" + } + }, + "MediaTailorPlaybackConfiguration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaTailor::PlaybackConfiguration" + } + }, + "MSKConfiguration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MSK::Configuration" + } + }, + "PersonalizeDataset": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Dataset" + } + }, + "PersonalizeSchema": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Schema" + } + }, + "PersonalizeSolution": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Solution" + } + }, + "PinpointEmailTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EmailTemplate" + } + }, + "PinpointEventStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EventStream" + } + }, + "ResilienceHubApp": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ResilienceHub::App" + } + }, + "ACMPCACertificateAuthority": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ACMPCA::CertificateAuthority" + } + }, + "AppConfigHostedConfigurationVersion": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppConfig::HostedConfigurationVersion" + } + }, + "AppMeshVirtualGateway": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualGateway" + } + }, + "AppMeshVirtualRouter": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualRouter" + } + }, + "AppRunnerService": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppRunner::Service" + } + }, + "CustomerProfilesObjectType": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CustomerProfiles::ObjectType" + } + }, + "DMSEndpoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::DMS::Endpoint" + } + }, + "EC2CapacityReservation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::CapacityReservation" + } + }, + "EC2ClientVpnEndpoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::ClientVpnEndpoint" + } + }, + "KendraIndex": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Kendra::Index" + } + }, + "KinesisVideoStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::KinesisVideo::Stream" + } + }, + "LogsDestination": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Logs::Destination" + } + }, + "PinpointEmailChannel": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EmailChannel" + } + }, + "S3AccessPoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::S3::AccessPoint" + } + }, + "NetworkManagerCustomerGatewayAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::NetworkManager::CustomerGatewayAssociation" + } + }, + "NetworkManagerLinkAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::NetworkManager::LinkAssociation" + } } } }, @@ -14198,52 +14534,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -14251,13 +14591,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -14267,92 +14616,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -14361,155 +14701,115 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://config.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://config-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://config.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://config-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://config.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://config.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://config.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://config.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/aws-models/dynamodb.json b/aws/sdk/aws-models/dynamodb.json index 7c5a2d76787..a1537f04c20 100644 --- a/aws/sdk/aws-models/dynamodb.json +++ b/aws/sdk/aws-models/dynamodb.json @@ -790,7 +790,7 @@ "Responses": { "target": "com.amazonaws.dynamodb#PartiQLBatchResponse", "traits": { - "smithy.api#documentation": "

The response to each PartiQL statement in the batch.

" + "smithy.api#documentation": "

The response to each PartiQL statement in the batch. The values of the list are \n ordered according to the ordering of the request statements.

" } }, "ConsumedCapacity": { @@ -920,6 +920,12 @@ "traits": { "smithy.api#documentation": "

The error message associated with the PartiQL batch response.

" } + }, + "Item": { + "target": "com.amazonaws.dynamodb#AttributeMap", + "traits": { + "smithy.api#documentation": "

The item which caused the condition check to fail. This will be set if ReturnValuesOnConditionCheckFailure is specified as ALL_OLD.

" + } } }, "traits": { @@ -1018,6 +1024,12 @@ "traits": { "smithy.api#documentation": "

The read consistency of the PartiQL batch request.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PartiQL batch request\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -1465,6 +1477,12 @@ "traits": { "smithy.api#documentation": "

The conditional request failed.

" } + }, + "Item": { + "target": "com.amazonaws.dynamodb#AttributeMap", + "traits": { + "smithy.api#documentation": "

Item which caused the ConditionalCheckFailedException.

" + } } }, "traits": { @@ -2335,6 +2353,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a DeleteItem\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -2684,7 +2708,7 @@ "target": "com.amazonaws.dynamodb#DescribeEndpointsResponse" }, "traits": { - "smithy.api#documentation": "

Returns the regional endpoint information. This action must be included in your VPC \n endpoint policies, or access to the DescribeEndpoints API will be denied. For more information \n on policy permissions, please see Internetwork traffic privacy.

" + "smithy.api#documentation": "

Returns the regional endpoint information. For more information \n on policy permissions, please see Internetwork traffic privacy.

" } }, "com.amazonaws.dynamodb#DescribeEndpointsRequest": { @@ -4781,6 +4805,12 @@ "traits": { "smithy.api#documentation": "

The maximum number of items to evaluate (not necessarily the number of matching\n items). If DynamoDB processes the number of items up to the limit while processing the\n results, it stops the operation and returns the matching values up to that point, along\n with a key in LastEvaluatedKey to apply in a subsequent operation so you\n can pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\n DynamoDB reaches this limit, it stops the operation and returns the matching values up\n to the limit, and a key in LastEvaluatedKey to apply in a subsequent\n operation to continue the operation.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for an\n ExecuteStatement operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -7477,6 +7507,12 @@ "traits": { "smithy.api#documentation": "

The parameter values.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PartiQL\n ParameterizedStatement operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -7920,6 +7956,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PutItem\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -9444,7 +9486,7 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total number of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan stops and results are returned to the user as a LastEvaluatedKey\n value to continue the scan in a subsequent operation. The results also include the\n number of items exceeding the limit. A scan can result in no table data meeting the\n filter criteria.

\n

A single Scan operation reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then apply any\n filtering to the results using FilterExpression. If\n LastEvaluatedKey is present in the response, you need to paginate the\n result set. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

\n Scan uses eventually consistent reads when accessing the data in a table;\n therefore, the result set might not include the changes to data in the table immediately\n before the operation began. If you need a consistent copy of the data, as of the time\n that the Scan begins, you can set the ConsistentRead parameter\n to true.

", + "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total size of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan completes and results are returned to the user. The LastEvaluatedKey \n value is also returned and the requestor can use the LastEvaluatedKey to continue \n the scan in a subsequent operation. Each scan response also includes number of items that were \n scanned (ScannedCount) as part of the request. If using a FilterExpression, a scan result \n can result in no items meeting the criteria and the Count will result in zero. If \n you did not use a FilterExpression in the scan request, then Count is \n the same as ScannedCount.

\n \n

\n Count and ScannedCount only return the count of items specific to a \n single scan request and, unless the table is less than 1MB, do not represent the total number \n of items in the table.\n

\n
\n

A single Scan operation first reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then applies any\n filtering to the results if a FilterExpression is provided. If\n LastEvaluatedKey is present in the response, pagination is required to complete the\n full table scan. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

By default, a Scan uses eventually consistent reads when accessing the items in a table. \n Therefore, the results from an eventually consistent Scan may not include the latest item \n changes at the time the scan iterates through each item in the table. If you require a strongly consistent \n read of each item as the scan iterates through the items in the table, you can set the ConsistentRead \n parameter to true. Strong consistency only relates to the consistency of the read at the item level.

\n \n

\n DynamoDB does not provide snapshot isolation for a scan operation when the ConsistentRead \n parameter is set to true. Thus, a DynamoDB scan operation does not guarantee that all reads in a scan \n see a consistent snapshot of the table when the scan operation was requested.\n

\n
", "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -10777,7 +10819,7 @@ "ReturnValuesOnConditionCheckFailure": { "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", "traits": { - "smithy.api#documentation": "

Use ReturnValuesOnConditionCheckFailure to get the item attributes if the\n Update condition fails. For\n ReturnValuesOnConditionCheckFailure, the valid values are: NONE,\n ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW.

" + "smithy.api#documentation": "

Use ReturnValuesOnConditionCheckFailure to get the item attributes if the\n Update condition fails. For\n ReturnValuesOnConditionCheckFailure, the valid values are: NONE and\n ALL_OLD.

" } } }, @@ -11237,6 +11279,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for an UpdateItem operation that failed a\n condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { diff --git a/aws/sdk/aws-models/ec2.json b/aws/sdk/aws-models/ec2.json index 4d35d56d54a..43911fdd00d 100644 --- a/aws/sdk/aws-models/ec2.json +++ b/aws/sdk/aws-models/ec2.json @@ -1535,7 +1535,20 @@ "target": "com.amazonaws.ec2#AllocateAddressResult" }, "traits": { - "smithy.api#documentation": "

Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate \n it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \n pool and can be allocated to a different Amazon Web Services account.

\n

You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \n from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \n IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses (BYOIP) in the Amazon Elastic Compute Cloud User Guide.

\n

If you release an Elastic IP address, you might be able to recover it. You cannot recover\n an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\n it in this operation.

\n

For more information, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \n to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).

" + "smithy.api#documentation": "

Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate \n it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \n pool and can be allocated to a different Amazon Web Services account.

\n

You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \n from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \n IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses (BYOIP) in the Amazon Elastic Compute Cloud User Guide.

\n

If you release an Elastic IP address, you might be able to recover it. You cannot recover\n an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\n it in this operation.

\n

For more information, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \n to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).

", + "smithy.api#examples": [ + { + "title": "To allocate an Elastic IP address", + "documentation": "This example allocates an Elastic IP address.", + "output": { + "PublicIp": "203.0.113.0", + "AllocationId": "eipalloc-64d5890a", + "PublicIpv4Pool": "amazon", + "NetworkBorderGroup": "us-east-1", + "Domain": "vpc" + } + } + ] } }, "com.amazonaws.ec2#AllocateAddressRequest": { @@ -1726,8 +1739,7 @@ "aws.protocols#ec2QueryName": "Quantity", "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these\n parameters.

", - "smithy.api#required": {}, + "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these parameters. If you are \n allocating the Dedicated Hosts on an Outpost, and you specify AssetIds, \n you can omit this parameter. In this case, Amazon EC2 allocates a Dedicated Host on each \n specified hardware asset. If you specify both AssetIds and \n Quantity, then the value that you specify for \n Quantity must be equal to the number of asset IDs specified.

", "smithy.api#xmlName": "quantity" } }, @@ -1747,7 +1759,7 @@ "OutpostArn": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\n the Dedicated Host.

" + "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\n the Dedicated Host. If you specify OutpostArn, you can \n optionally specify AssetIds.

\n

If you are allocating the Dedicated Host in a Region, omit this parameter.

" } }, "HostMaintenance": { @@ -1755,6 +1767,13 @@ "traits": { "smithy.api#documentation": "

Indicates whether to enable or disable host maintenance for the Dedicated Host. For\n more information, see Host\n maintenance in the Amazon EC2 User Guide.

" } + }, + "AssetIds": { + "target": "com.amazonaws.ec2#AssetIdList", + "traits": { + "smithy.api#documentation": "

The IDs of the Outpost hardware assets on which to allocate the Dedicated Hosts. Targeting \n specific hardware assets on an Outpost can help to minimize latency between your workloads. \n This parameter is supported only if you specify OutpostArn. \n If you are allocating the Dedicated Hosts in a Region, omit this parameter.

\n
    \n
  • \n

    If you specify this parameter, you can omit Quantity. \n In this case, Amazon EC2 allocates a Dedicated Host on each specified hardware \n asset.

    \n
  • \n
  • \n

    If you specify both AssetIds and \n Quantity, then the value for \n Quantity must be equal to the number of asset IDs \n specified.

    \n
  • \n
", + "smithy.api#xmlName": "AssetId" + } } }, "traits": { @@ -1987,7 +2006,7 @@ "min": 1, "max": 30 }, - "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*]+$" + "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*\\-]+$" } }, "com.amazonaws.ec2#AllowedInstanceTypeSet": { @@ -3976,52 +3995,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -4029,13 +4052,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -4045,92 +4077,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -4139,155 +4162,115 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://ec2.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://ec2.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://ec2.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://ec2.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -5660,6 +5643,15 @@ } } }, + "com.amazonaws.ec2#AssetId": { + "type": "string" + }, + "com.amazonaws.ec2#AssetIdList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#AssetId" + } + }, "com.amazonaws.ec2#AssignIpv6Addresses": { "type": "operation", "input": { @@ -5870,7 +5862,7 @@ "target": "com.amazonaws.ec2#AssignPrivateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Assigns one or more private IPv4 addresses to a private NAT gateway. For more information, see Work with NAT gateways in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Assigns one or more private IPv4 addresses to a private NAT gateway. For more information, see \n Work with NAT gateways in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssignPrivateNatGatewayAddressRequest": { @@ -5880,7 +5872,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -5919,7 +5911,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -5970,7 +5962,20 @@ "target": "com.amazonaws.ec2#AssociateAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates an Elastic IP address, or carrier IP address (for instances that are in\n subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\n Elastic IP address, you must allocate it to your account.

\n

If the Elastic IP address is already\n associated with a different instance, it is disassociated from that instance and associated\n with the specified instance. If you associate an Elastic IP address with an instance that has\n an existing Elastic IP address, the existing address is disassociated from the instance, but\n remains allocated to your account.

\n

[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\n carrier to the instance or network interface.

\n

You cannot associate an Elastic IP address with an interface in a different network border group.

\n \n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2\n doesn't return an error, and you may be charged for each time the Elastic IP address is\n remapped to the same instance. For more information, see the Elastic IP\n Addresses section of Amazon EC2\n Pricing.

\n
" + "smithy.api#documentation": "

Associates an Elastic IP address, or carrier IP address (for instances that are in\n subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\n Elastic IP address, you must allocate it to your account.

\n

If the Elastic IP address is already\n associated with a different instance, it is disassociated from that instance and associated\n with the specified instance. If you associate an Elastic IP address with an instance that has\n an existing Elastic IP address, the existing address is disassociated from the instance, but\n remains allocated to your account.

\n

[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\n carrier to the instance or network interface.

\n

You cannot associate an Elastic IP address with an interface in a different network border group.

\n \n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2\n doesn't return an error, and you may be charged for each time the Elastic IP address is\n remapped to the same instance. For more information, see the Elastic IP\n Addresses section of Amazon EC2\n Pricing.

\n
", + "smithy.api#examples": [ + { + "title": "To associate an Elastic IP address", + "documentation": "This example associates the specified Elastic IP address with the specified instance.", + "input": { + "AllocationId": "eipalloc-64d5890a", + "InstanceId": "i-0b263919b6498b123" + }, + "output": { + "AssociationId": "eipassoc-2bebb745" + } + } + ] } }, "com.amazonaws.ec2#AssociateAddressRequest": { @@ -6135,7 +6140,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.

\n

After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.

\n

For more information, see DHCP options sets\n in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.

\n

After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.

\n

For more information, see DHCP options sets\n in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To associate a DHCP options set with a VPC", + "documentation": "This example associates the specified DHCP options set with the specified VPC.", + "input": { + "DhcpOptionsId": "dopt-d9070ebb", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#AssociateDhcpOptionsRequest": { @@ -6257,7 +6272,30 @@ "target": "com.amazonaws.ec2#AssociateIamInstanceProfileResult" }, "traits": { - "smithy.api#documentation": "

Associates an IAM instance profile with a running or stopped instance. You cannot\n associate more than one IAM instance profile with an instance.

" + "smithy.api#documentation": "

Associates an IAM instance profile with a running or stopped instance. You cannot\n associate more than one IAM instance profile with an instance.

", + "smithy.api#examples": [ + { + "title": "To associate an IAM instance profile with an instance", + "documentation": "This example associates an IAM instance profile named admin-role with the specified instance.", + "input": { + "IamInstanceProfile": { + "Name": "admin-role" + }, + "InstanceId": "i-123456789abcde123" + }, + "output": { + "IamInstanceProfileAssociation": { + "InstanceId": "i-123456789abcde123", + "State": "associating", + "AssociationId": "iip-assoc-0e7736511a163c209", + "IamInstanceProfile": { + "Id": "AIPAJBLK7RKJKWDXVHIEC", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#AssociateIamInstanceProfileRequest": { @@ -6443,7 +6481,7 @@ "target": "com.amazonaws.ec2#AssociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, see Work with NAT gateways in the Amazon Virtual Private Cloud User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, \n see Work with NAT gateways in the Amazon VPC User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssociateNatGatewayAddressRequest": { @@ -6453,7 +6491,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -6493,7 +6531,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -6519,7 +6557,7 @@ "target": "com.amazonaws.ec2#AssociateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssociateRouteTableRequest": { @@ -6940,7 +6978,7 @@ "target": "com.amazonaws.ec2#AssociateVpcCidrBlockResult" }, "traits": { - "smithy.api#documentation": "

Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\n an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\n you provisioned through bring your own IP addresses (BYOIP). The IPv6 CIDR block size is fixed\n at /56.

\n

You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\n pool, or an Amazon-provided IPv6 CIDR block.

\n

For more information about associating CIDR blocks with your VPC and applicable\n restrictions, see VPC and subnet sizing in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\n an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\n you provisioned through bring your own IP addresses (BYOIP). The IPv6 CIDR block size is fixed\n at /56.

\n

You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\n pool, or an Amazon-provided IPv6 CIDR block.

\n

For more information about associating CIDR blocks with your VPC and applicable\n restrictions, see IP addressing for your VPCs and subnets \n in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssociateVpcCidrBlockRequest": { @@ -7272,7 +7310,7 @@ "target": "com.amazonaws.ec2#AttachClassicLinkVpcResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC's\n\t\t\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\n\t\t\tcan only link an instance that's in the running state. An instance is\n\t\t\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\n\t\t\tyou restart it.

\n

After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.

\n

Linking your instance to a VPC is sometimes referred to as attaching your instance.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC\n\t\t\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\n\t\t\tcan only link an instance that's in the running state. An instance is\n\t\t\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\n\t\t\tyou restart it.

\n

After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.

\n

Linking your instance to a VPC is sometimes referred to as attaching your instance.

" } }, "com.amazonaws.ec2#AttachClassicLinkVpcRequest": { @@ -7292,7 +7330,7 @@ "target": "com.amazonaws.ec2#GroupIdStringList", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of one or more of the VPC's security groups. You cannot specify security groups from a different VPC.

", + "smithy.api#documentation": "

The IDs of the security groups. You cannot specify security groups from a different VPC.

", "smithy.api#required": {}, "smithy.api#xmlName": "SecurityGroupId" } @@ -7302,7 +7340,7 @@ "traits": { "aws.protocols#ec2QueryName": "InstanceId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of an EC2-Classic instance to link to the ClassicLink-enabled VPC.

", + "smithy.api#documentation": "

The ID of the EC2-Classic instance.

", "smithy.api#required": {}, "smithy.api#xmlName": "instanceId" } @@ -7312,7 +7350,7 @@ "traits": { "aws.protocols#ec2QueryName": "VpcId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of a ClassicLink-enabled VPC.

", + "smithy.api#documentation": "

The ID of the ClassicLink-enabled VPC.

", "smithy.api#required": {}, "smithy.api#xmlName": "vpcId" } @@ -7349,7 +7387,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity between the internet and\n\t\t\tthe VPC. For more information about your VPC and internet gateway, see the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity \n\t\t between the internet and the VPC. For more information, see Internet gateways in the \n\t\t Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AttachInternetGatewayRequest": { @@ -7577,7 +7615,25 @@ "target": "com.amazonaws.ec2#VolumeAttachment" }, "traits": { - "smithy.api#documentation": "

Attaches an EBS volume to a running or stopped instance and exposes it to the instance\n with the specified device name.

\n

Encrypted EBS volumes must be attached to instances that support Amazon EBS encryption. For\n more information, see Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

\n

After you attach an EBS volume, you must make it available. For more information, see \n Make an EBS volume available for use.

\n

If a volume has an Amazon Web Services Marketplace product code:

\n
    \n
  • \n

    The volume can be attached only to a stopped instance.

    \n
  • \n
  • \n

    Amazon Web Services Marketplace product codes are copied from the volume to the instance.

    \n
  • \n
  • \n

    You must be subscribed to the product.

    \n
  • \n
  • \n

    The instance type and operating system of the instance must support the product. For\n example, you can't detach a volume from a Windows instance and attach it to a Linux\n instance.

    \n
  • \n
\n

For more information, see Attach an Amazon EBS volume to an instance in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Attaches an EBS volume to a running or stopped instance and exposes it to the instance\n with the specified device name.

\n

Encrypted EBS volumes must be attached to instances that support Amazon EBS encryption. For\n more information, see Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

\n

After you attach an EBS volume, you must make it available. For more information, see \n Make an EBS volume available for use.

\n

If a volume has an Amazon Web Services Marketplace product code:

\n
    \n
  • \n

    The volume can be attached only to a stopped instance.

    \n
  • \n
  • \n

    Amazon Web Services Marketplace product codes are copied from the volume to the instance.

    \n
  • \n
  • \n

    You must be subscribed to the product.

    \n
  • \n
  • \n

    The instance type and operating system of the instance must support the product. For\n example, you can't detach a volume from a Windows instance and attach it to a Linux\n instance.

    \n
  • \n
\n

For more information, see Attach an Amazon EBS volume to an instance in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a volume to an instance", + "documentation": "This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.", + "input": { + "VolumeId": "vol-1234567890abcdef0", + "InstanceId": "i-01474ef662b89480", + "Device": "/dev/sdf" + }, + "output": { + "AttachTime": "2016-08-29T18:52:32.724Z", + "InstanceId": "i-01474ef662b89480", + "VolumeId": "vol-1234567890abcdef0", + "State": "attaching", + "Device": "/dev/sdf" + } + } + ] } }, "com.amazonaws.ec2#AttachVolumeRequest": { @@ -7956,7 +8012,7 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

" + "smithy.api#documentation": "

Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

" } }, "com.amazonaws.ec2#AuthorizeSecurityGroupEgressRequest": { @@ -8089,7 +8145,30 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Adds the specified inbound (ingress) rules to a security group.

\n

An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR\n address range, or from the instances that are associated with the specified destination security \n groups. When specifying an inbound rule for your security group in a VPC, the\n IpPermissions must include a source for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For TCP and UDP, you must also specify the destination port or port range. \n For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. \n You can use -1 to mean all types or all codes.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

\n

For more information about VPC security group quotas, see Amazon VPC quotas.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Adds the specified inbound (ingress) rules to a security group.

\n

An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR\n address range, or from the instances that are associated with the specified destination security \n groups. When specifying an inbound rule for your security group in a VPC, the\n IpPermissions must include a source for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For TCP and UDP, you must also specify the destination port or port range. \n For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. \n You can use -1 to mean all types or all codes.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

\n

For more information about VPC security group quotas, see Amazon VPC quotas.

", + "smithy.api#examples": [ + { + "title": "To add a rule that allows inbound SSH traffic from an IPv4 address range", + "documentation": "This example enables inbound traffic on TCP port 22 (SSH). The rule includes a description to help you identify it later.", + "input": { + "GroupId": "sg-903004f8", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/24", + "Description": "SSH access from the LA office" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#AuthorizeSecurityGroupIngressRequest": { @@ -8118,7 +8197,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -8130,19 +8209,19 @@ "IpProtocol": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp) or number\n (see Protocol Numbers). To specify icmpv6, use a set of IP permissions.

\n

[VPC only] Use -1 to specify all protocols. If you specify -1 or a \n protocol other than tcp, udp, or icmp, traffic on all ports \n is allowed, regardless of any ports you specify.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" + "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp) or number\n (see Protocol Numbers). To specify icmpv6, use a set of IP permissions.

\n

Use -1 to specify all protocols. If you specify -1 or a \n protocol other than tcp, udp, or icmp, traffic on all ports \n is allowed, regardless of any ports you specify.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, "SourceSecurityGroupName": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. Creates rules that grant full ICMP, UDP, and TCP access. \n To create a rule with a specific IP protocol and port range, use a set of IP permissions instead. For \n EC2-VPC, the source security group must be in the same VPC.

" + "smithy.api#documentation": "

[Default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. Creates rules that grant full ICMP, UDP, and TCP access. \n To create a rule with a specific IP protocol and port range, use a set of IP permissions instead. \n The source security group must be in the same VPC.

" } }, "SourceSecurityGroupOwnerId": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[nondefault VPC] The Amazon Web Services account ID for the source security group, if the source security group is \n in a different account. You can't specify this parameter in combination with the following parameters: \n the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. \n Creates rules that grant full ICMP, UDP, and TCP access. To create a rule with a specific IP protocol \n and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

[Nondefault VPC] The Amazon Web Services account ID for the source security group, if the source security group is \n in a different account. You can't specify this parameter in combination with the following parameters: \n the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. \n Creates rules that grant full ICMP, UDP, and TCP access. To create a rule with a specific IP protocol \n and port range, use a set of IP permissions instead.

" } }, "ToPort": { @@ -8351,6 +8430,9 @@ "smithy.api#documentation": "

Describes Availability Zones, Local Zones, and Wavelength Zones.

" } }, + "com.amazonaws.ec2#AvailabilityZoneId": { + "type": "string" + }, "com.amazonaws.ec2#AvailabilityZoneList": { "type": "list", "member": { @@ -8510,6 +8592,9 @@ "com.amazonaws.ec2#BareMetalFlag": { "type": "boolean" }, + "com.amazonaws.ec2#BaselineBandwidthInGbps": { + "type": "double" + }, "com.amazonaws.ec2#BaselineBandwidthInMbps": { "type": "integer" }, @@ -10938,7 +11023,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes the ClassicLink DNS support status of a VPC.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes the ClassicLink DNS support status of a VPC.

" } }, "com.amazonaws.ec2#ClassicLinkDnsSupportList": { @@ -10957,7 +11042,7 @@ "target": "com.amazonaws.ec2#GroupIdentifierList", "traits": { "aws.protocols#ec2QueryName": "GroupSet", - "smithy.api#documentation": "

A list of security groups.

", + "smithy.api#documentation": "

The security groups.

", "smithy.api#xmlName": "groupSet" } }, @@ -10987,7 +11072,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes a linked EC2-Classic instance.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes a linked EC2-Classic instance.

" } }, "com.amazonaws.ec2#ClassicLinkInstanceList": { @@ -12267,7 +12352,20 @@ "target": "com.amazonaws.ec2#ConfirmProductInstanceResult" }, "traits": { - "smithy.api#documentation": "

Determines whether a product code is associated with an instance. This action can only\n be used by the owner of the product code. It is useful when a product code owner must\n verify whether another user's instance is eligible for support.

" + "smithy.api#documentation": "

Determines whether a product code is associated with an instance. This action can only\n be used by the owner of the product code. It is useful when a product code owner must\n verify whether another user's instance is eligible for support.

", + "smithy.api#examples": [ + { + "title": "To confirm the product instance", + "documentation": "This example determines whether the specified product code is associated with the specified instance.", + "input": { + "ProductCode": "774F4FF8", + "InstanceId": "i-1234567890abcdef0" + }, + "output": { + "OwnerId": "123456789012" + } + } + ] } }, "com.amazonaws.ec2#ConfirmProductInstanceRequest": { @@ -12719,7 +12817,22 @@ "target": "com.amazonaws.ec2#CopyImageResult" }, "traits": { - "smithy.api#documentation": "

Initiates the copy of an AMI. You can copy an AMI from one Region to another, or from a\n Region to an Outpost. You can't copy an AMI from an Outpost to a Region, from one Outpost\n to another, or within the same Outpost. To copy an AMI to another partition, see CreateStoreImageTask.

\n

To copy an AMI from one Region to another, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tdestination Region using its endpoint. Copies of encrypted backing snapshots for\n \t\tthe AMI are encrypted. Copies of unencrypted backing snapshots remain unencrypted, \n \t\tunless you set Encrypted during the copy operation. You cannot \n \t\tcreate an unencrypted copy of an encrypted backing snapshot.

\n

To copy an AMI from a Region to an Outpost, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tARN of the destination Outpost using DestinationOutpostArn. \n \t\tBacking snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon EC2 User Guide.

\n

For more information about the prerequisites and limits when copying an AMI, see Copy an AMI in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Initiates the copy of an AMI. You can copy an AMI from one Region to another, or from a\n Region to an Outpost. You can't copy an AMI from an Outpost to a Region, from one Outpost\n to another, or within the same Outpost. To copy an AMI to another partition, see CreateStoreImageTask.

\n

To copy an AMI from one Region to another, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tdestination Region using its endpoint. Copies of encrypted backing snapshots for\n \t\tthe AMI are encrypted. Copies of unencrypted backing snapshots remain unencrypted, \n \t\tunless you set Encrypted during the copy operation. You cannot \n \t\tcreate an unencrypted copy of an encrypted backing snapshot.

\n

To copy an AMI from a Region to an Outpost, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tARN of the destination Outpost using DestinationOutpostArn. \n \t\tBacking snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon EC2 User Guide.

\n

For more information about the prerequisites and limits when copying an AMI, see Copy an AMI in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To copy an AMI to another region", + "documentation": "This example copies the specified AMI from the us-east-1 region to the current region.", + "input": { + "Description": "", + "Name": "My server", + "SourceImageId": "ami-5731123e", + "SourceRegion": "us-east-1" + }, + "output": { + "ImageId": "ami-438bea42" + } + } + ] } }, "com.amazonaws.ec2#CopyImageRequest": { @@ -12835,7 +12948,22 @@ "target": "com.amazonaws.ec2#CopySnapshotResult" }, "traits": { - "smithy.api#documentation": "

Copies a point-in-time snapshot of an EBS volume and stores it in Amazon S3. You can copy a\n snapshot within the same Region, from one Region to another, or from a Region to an Outpost. \n You can't copy a snapshot from an Outpost to a Region, from one Outpost to another, or within \n the same Outpost.

\n

You can use the snapshot to create EBS volumes or Amazon Machine Images (AMIs).

\n

When copying snapshots to a Region, copies of encrypted EBS snapshots remain encrypted. \n \tCopies of unencrypted snapshots remain unencrypted, unless you enable encryption for the \n \tsnapshot copy operation. By default, encrypted snapshot copies use the default Key Management Service (KMS) \n \tKMS key; however, you can specify a different KMS key. To copy an encrypted \n \tsnapshot that has been shared from another account, you must have permissions for the KMS key \n \tused to encrypt the snapshot.

\n

Snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon Elastic Compute Cloud User Guide.

\n

Snapshots created by copying another snapshot have an arbitrary volume ID that should not\n be used for any purpose.

\n

For more information, see Copy an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Copies a point-in-time snapshot of an EBS volume and stores it in Amazon S3. You can copy a\n snapshot within the same Region, from one Region to another, or from a Region to an Outpost. \n You can't copy a snapshot from an Outpost to a Region, from one Outpost to another, or within \n the same Outpost.

\n

You can use the snapshot to create EBS volumes or Amazon Machine Images (AMIs).

\n

When copying snapshots to a Region, copies of encrypted EBS snapshots remain encrypted. \n \tCopies of unencrypted snapshots remain unencrypted, unless you enable encryption for the \n \tsnapshot copy operation. By default, encrypted snapshot copies use the default Key Management Service (KMS) \n \tKMS key; however, you can specify a different KMS key. To copy an encrypted \n \tsnapshot that has been shared from another account, you must have permissions for the KMS key \n \tused to encrypt the snapshot.

\n

Snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon Elastic Compute Cloud User Guide.

\n

Snapshots created by copying another snapshot have an arbitrary volume ID that should not\n be used for any purpose.

\n

For more information, see Copy an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To copy a snapshot", + "documentation": "This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.", + "input": { + "SourceRegion": "us-west-2", + "SourceSnapshotId": "snap-066877671789bd71b", + "Description": "This is my copied snapshot.", + "DestinationRegion": "us-east-1" + }, + "output": { + "SnapshotId": "snap-066877671789bd71b" + } + } + ] } }, "com.amazonaws.ec2#CopySnapshotRequest": { @@ -13040,7 +13168,7 @@ "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { "aws.protocols#ec2QueryName": "AmdSevSnp", - "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP.

", + "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "amdSevSnp" } } @@ -13071,7 +13199,7 @@ "AmdSevSnp": { "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { - "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only.

" + "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only. For more information, see \n AMD SEV-SNP.

" } } }, @@ -13301,13 +13429,13 @@ } }, "AvailabilityZone": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#documentation": "

The Availability Zone in which to create the Capacity Reservation.

" } }, "AvailabilityZoneId": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneId", "traits": { "smithy.api#documentation": "

The ID of the Availability Zone in which to create the Capacity Reservation.

" } @@ -13863,7 +13991,27 @@ "target": "com.amazonaws.ec2#CreateCustomerGatewayResult" }, "traits": { - "smithy.api#documentation": "

Provides information to Amazon Web Services about your customer gateway device. The\n customer gateway device is the appliance at your end of the VPN connection. You\n must provide the IP address of the customer gateway device’s external\n interface. The IP address must be static and can be behind a device performing network\n address translation (NAT).

\n

For devices that use Border Gateway Protocol (BGP), you can also provide the device's\n BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\n If you don't have an ASN already, you can use a private ASN. For more information, see \n Customer gateway \n options for your Site-to-Site VPN connection in the Amazon Web Services Site-to-Site VPN User Guide.

\n

To create more than one customer gateway with the same VPN type, IP address, and\n BGP ASN, specify a unique device name for each customer gateway. An identical request\n returns information about the existing customer gateway; it doesn't create a new customer\n gateway.

" + "smithy.api#documentation": "

Provides information to Amazon Web Services about your customer gateway device. The\n customer gateway device is the appliance at your end of the VPN connection. You\n must provide the IP address of the customer gateway device’s external\n interface. The IP address must be static and can be behind a device performing network\n address translation (NAT).

\n

For devices that use Border Gateway Protocol (BGP), you can also provide the device's\n BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\n If you don't have an ASN already, you can use a private ASN. For more information, see \n Customer gateway \n options for your Site-to-Site VPN connection in the Amazon Web Services Site-to-Site VPN User Guide.

\n

To create more than one customer gateway with the same VPN type, IP address, and\n BGP ASN, specify a unique device name for each customer gateway. An identical request\n returns information about the existing customer gateway; it doesn't create a new customer\n gateway.

", + "smithy.api#examples": [ + { + "title": "To create a customer gateway", + "documentation": "This example creates a customer gateway with the specified IP address for its outside interface.", + "input": { + "Type": "ipsec.1", + "PublicIp": "12.1.2.3", + "BgpAsn": 65534 + }, + "output": { + "CustomerGateway": { + "CustomerGatewayId": "cgw-0e11f167", + "IpAddress": "12.1.2.3", + "State": "available", + "Type": "ipsec.1", + "BgpAsn": "65534" + } + } + } + ] } }, "com.amazonaws.ec2#CreateCustomerGatewayRequest": { @@ -13958,7 +14106,7 @@ "target": "com.amazonaws.ec2#CreateDefaultSubnetResult" }, "traits": { - "smithy.api#documentation": "

Creates a default subnet with a size /20 IPv4 CIDR block in the\n specified Availability Zone in your default VPC. You can have only one default subnet\n per Availability Zone. For more information, see Creating a default\n subnet in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a default subnet with a size /20 IPv4 CIDR block in the\n specified Availability Zone in your default VPC. You can have only one default subnet\n per Availability Zone. For more information, see Create a default\n subnet in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateDefaultSubnetRequest": { @@ -14018,7 +14166,7 @@ "target": "com.amazonaws.ec2#CreateDefaultVpcResult" }, "traits": { - "smithy.api#documentation": "

Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet\n\t\t\tin each Availability Zone. For more information about the components of a default VPC,\n\t\t\tsee Default VPC and\n\t\t\tdefault subnets in the Amazon Virtual Private Cloud User Guide. You cannot\n\t\t\tspecify the components of the default VPC yourself.

\n

If you deleted your previous default VPC, you can create a default VPC. You cannot have\n\t\t\tmore than one default VPC per Region.

\n

If your account supports EC2-Classic, you cannot use this action to create a default VPC\n\t\t\tin a Region that supports EC2-Classic. If you want a default VPC in a Region that\n\t\t\tsupports EC2-Classic, see \"I really want a default VPC for my existing EC2 account. Is\n\t\t\tthat possible?\" in the Default VPCs\n\t\t\tFAQ.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet\n\t\t\tin each Availability Zone. For more information about the components of a default VPC,\n\t\t\tsee Default VPCs \n\t\t in the Amazon VPC User Guide. You cannot specify the components of the \n\t\t default VPC yourself.

\n

If you deleted your previous default VPC, you can create a default VPC. You cannot have\n\t\t\tmore than one default VPC per Region.

" } }, "com.amazonaws.ec2#CreateDefaultVpcRequest": { @@ -14062,7 +14210,42 @@ "target": "com.amazonaws.ec2#CreateDhcpOptionsResult" }, "traits": { - "smithy.api#documentation": "

Creates a set of DHCP options for your VPC. After creating the set, you must\n\t\t\t\tassociate it with the VPC, causing all existing and new instances that you launch in\n\t\t\t\tthe VPC to use this set of DHCP options. The following are the individual DHCP\n\t\t\t\toptions you can specify. For more information about the options, see RFC 2132.

\n
    \n
  • \n

    \n domain-name-servers - The IP addresses of up to four domain name\n servers, or AmazonProvidedDNS. The default DHCP option set specifies\n AmazonProvidedDNS. If specifying more than one domain name server, specify the\n IP addresses in a single parameter, separated by commas. To have your instance\n receive a custom DNS hostname as specified in domain-name, you must\n set domain-name-servers to a custom DNS server.

    \n
  • \n
  • \n

    \n domain-name - If you're using AmazonProvidedDNS in\n us-east-1, specify ec2.internal. If you're using\n AmazonProvidedDNS in another Region, specify\n region.compute.internal (for example,\n ap-northeast-1.compute.internal). Otherwise, specify a domain\n name (for example, ExampleCompany.com). This value is used to complete\n unqualified DNS hostnames. Important: Some\n Linux operating systems accept multiple domain names separated by spaces.\n However, Windows and other Linux operating systems treat the value as a single\n domain, which results in unexpected behavior. If your DHCP options set is\n associated with a VPC that has instances with multiple operating systems,\n specify only one domain name.

    \n
  • \n
  • \n

    \n ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)\n servers.

    \n
  • \n
  • \n

    \n netbios-name-servers - The IP addresses of up to four NetBIOS name\n servers.

    \n
  • \n
  • \n

    \n netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend that\n you specify 2 (broadcast and multicast are not currently supported). For more information\n about these node types, see RFC 2132.

    \n
  • \n
\n

Your VPC automatically starts out with a set of DHCP options that includes only a DNS\n\t\t\tserver that we provide (AmazonProvidedDNS). If you create a set of options, and if your\n\t\t\tVPC has an internet gateway, make sure to set the domain-name-servers\n\t\t\toption either to AmazonProvidedDNS or to a domain name server of your\n\t\t\tchoice. For more information, see DHCP options sets in the\n\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a set of DHCP options for your VPC. After creating the set, you must\n\t\t\t\tassociate it with the VPC, causing all existing and new instances that you launch in\n\t\t\t\tthe VPC to use this set of DHCP options. The following are the individual DHCP\n\t\t\t\toptions you can specify. For more information about the options, see RFC 2132.

\n
    \n
  • \n

    \n domain-name-servers - The IP addresses of up to four domain name\n servers, or AmazonProvidedDNS. The default DHCP option set specifies\n AmazonProvidedDNS. If specifying more than one domain name server, specify the\n IP addresses in a single parameter, separated by commas. To have your instance\n receive a custom DNS hostname as specified in domain-name, you must\n set domain-name-servers to a custom DNS server.

    \n
  • \n
  • \n

    \n domain-name - If you're using AmazonProvidedDNS in\n us-east-1, specify ec2.internal. If you're using\n AmazonProvidedDNS in another Region, specify\n region.compute.internal (for example,\n ap-northeast-1.compute.internal). Otherwise, specify a domain\n name (for example, ExampleCompany.com). This value is used to complete\n unqualified DNS hostnames. Important: Some\n Linux operating systems accept multiple domain names separated by spaces.\n However, Windows and other Linux operating systems treat the value as a single\n domain, which results in unexpected behavior. If your DHCP options set is\n associated with a VPC that has instances with multiple operating systems,\n specify only one domain name.

    \n
  • \n
  • \n

    \n ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)\n servers.

    \n
  • \n
  • \n

    \n netbios-name-servers - The IP addresses of up to four NetBIOS name\n servers.

    \n
  • \n
  • \n

    \n netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend that\n you specify 2 (broadcast and multicast are not currently supported). For more information\n about these node types, see RFC 2132.

    \n
  • \n
\n

Your VPC automatically starts out with a set of DHCP options that includes only a DNS\n\t\t\tserver that we provide (AmazonProvidedDNS). If you create a set of options, and if your\n\t\t\tVPC has an internet gateway, make sure to set the domain-name-servers\n\t\t\toption either to AmazonProvidedDNS or to a domain name server of your\n\t\t\tchoice. For more information, see DHCP options sets in the\n\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a DHCP options set", + "documentation": "This example creates a DHCP options set.", + "input": { + "DhcpConfigurations": [ + { + "Key": "domain-name-servers", + "Values": [ + "10.2.5.1", + "10.2.5.2" + ] + } + ] + }, + "output": { + "DhcpOptions": { + "DhcpConfigurations": [ + { + "Values": [ + { + "Value": "10.2.5.2" + }, + { + "Value": "10.2.5.1" + } + ], + "Key": "domain-name-servers" + } + ], + "DhcpOptionsId": "dopt-d9070ebb" + } + } + } + ] } }, "com.amazonaws.ec2#CreateDhcpOptionsRequest": { @@ -14198,7 +14381,7 @@ "target": "com.amazonaws.ec2#CreateFleetResult" }, "traits": { - "smithy.api#documentation": "

Launches an EC2 Fleet.

\n

You can create a single EC2 Fleet that includes multiple launch specifications that vary by\n instance type, AMI, Availability Zone, or subnet.

\n

For more information, see EC2 Fleet in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Creates an EC2 Fleet that contains the configuration information for On-Demand Instances and Spot Instances.\n Instances are launched immediately if there is available capacity.

\n

A single EC2 Fleet can include multiple launch specifications that vary by instance type,\n AMI, Availability Zone, or subnet.

\n

For more information, see EC2 Fleet in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#CreateFleetError": { @@ -14527,7 +14710,7 @@ "LogFormat": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The fields to include in the flow log record. List the fields in the order in which\n they should appear. If you omit this parameter, the flow log is created using the\n default format. If you specify this parameter, you must include at least one\n field. For more information about the available fields, see Flow log\n records in the Amazon VPC User Guide or Transit Gateway Flow Log\n records in the Amazon Web Services Transit Gateway Guide.

\n

Specify the fields using the ${field-id} format, separated by spaces. For\n the CLI, surround this parameter value with single quotes on Linux or\n double quotes on Windows.

" + "smithy.api#documentation": "

The fields to include in the flow log record. List the fields in the order in which\n they should appear. If you omit this parameter, the flow log is created using the\n default format. If you specify this parameter, you must include at least one\n field. For more information about the available fields, see Flow log\n records in the Amazon VPC User Guide or Transit Gateway Flow Log\n records in the Amazon Web Services Transit Gateway Guide.

\n

Specify the fields using the ${field-id} format, separated by spaces.

" } }, "TagSpecifications": { @@ -14688,7 +14871,7 @@ "target": "com.amazonaws.ec2#CreateImageResult" }, "traits": { - "smithy.api#documentation": "

Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance \n \tthat is either running or stopped.

\n

By default, when Amazon EC2 creates the new AMI, it reboots the instance so that it can \n\t\t\t\t\ttake snapshots of the attached volumes while data is at rest, in order to ensure a consistent \n\t\t\t\t\tstate. You can set the NoReboot parameter to true in the API request, \n\t\t\t\t\tor use the --no-reboot option in the CLI to prevent Amazon EC2 from shutting down and \n\t\t\t\t\trebooting the instance.

\n \n

If you choose to bypass the shutdown and reboot process by setting the NoReboot \n\t\t\t\t\tparameter to true in the API request, or by using the --no-reboot option \n\t\t\t\t\tin the CLI, we can't guarantee the file system integrity of the created image.

\n
\n

If you customized your instance with instance store volumes or Amazon EBS volumes in addition to the root device volume, the \n \tnew AMI contains block device mapping information for those volumes. When you launch an instance from this new AMI, \n \tthe instance automatically launches with those additional volumes.

\n

For more information, see Create an Amazon EBS-backed Linux\n AMI in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance \n \tthat is either running or stopped.

\n

If you customized your instance with instance store volumes or Amazon EBS volumes in addition to the root device volume, the \n \tnew AMI contains block device mapping information for those volumes. When you launch an instance from this new AMI, \n \tthe instance automatically launches with those additional volumes.

\n

For more information, see Create an Amazon EBS-backed Linux\n AMI in the Amazon Elastic Compute Cloud User Guide.

" } }, "com.amazonaws.ec2#CreateImageRequest": { @@ -14746,7 +14929,7 @@ "aws.protocols#ec2QueryName": "NoReboot", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

By default, when Amazon EC2 creates the new AMI, it reboots the instance so that it can \n\t\t\t\t\ttake snapshots of the attached volumes while data is at rest, in order to ensure a consistent \n\t\t\t\t\tstate. You can set the NoReboot parameter to true in the API request, \n\t\t\t\t\tor use the --no-reboot option in the CLI to prevent Amazon EC2 from shutting down and \n\t\t\t\t\trebooting the instance.

\n \n

If you choose to bypass the shutdown and reboot process by setting the NoReboot \n\t\t\t\t\tparameter to true in the API request, or by using the --no-reboot option \n\t\t\t\t\tin the CLI, we can't guarantee the file system integrity of the created image.

\n
\n

Default: false (follow standard reboot process)

", + "smithy.api#documentation": "

Indicates whether or not the instance should be automatically rebooted before creating \n the image. Specify one of the following values:

\n
    \n
  • \n

    \n true - The instance is not rebooted before creating the image. This \n creates crash-consistent snapshots that include only the data that has been written \n to the volumes at the time the snapshots are created. Buffered data and data in \n memory that has not yet been written to the volumes is not included in the snapshots.

    \n
  • \n
  • \n

    \n false - The instance is rebooted before creating the image. This \n ensures that all buffered data and data in memory is written to the volumes before the \n snapshots are created.

    \n
  • \n
\n

Default: false\n

", "smithy.api#xmlName": "noReboot" } }, @@ -14787,7 +14970,7 @@ "target": "com.amazonaws.ec2#CreateInstanceConnectEndpointResult" }, "traits": { - "smithy.api#documentation": "

Creates an EC2 Instance Connect Endpoint.

\n

An EC2 Instance Connect Endpoint allows you to connect to a resource, without\n requiring the resource to have a public IPv4 address. For more information, see Connect to your resources without requiring a public IPv4 address using EC2\n Instance Connect Endpoint in the Amazon EC2 User\n Guide.

" + "smithy.api#documentation": "

Creates an EC2 Instance Connect Endpoint.

\n

An EC2 Instance Connect Endpoint allows you to connect to an instance, without\n requiring the instance to have a public IPv4 address. For more information, see Connect to your instances without requiring a public IPv4 address using EC2\n Instance Connect Endpoint in the Amazon EC2 User\n Guide.

" } }, "com.amazonaws.ec2#CreateInstanceConnectEndpointRequest": { @@ -14946,7 +15129,7 @@ "target": "com.amazonaws.ec2#CreateInstanceExportTaskResult" }, "traits": { - "smithy.api#documentation": "

Exports a running or stopped instance to an Amazon S3 bucket.

\n

For information about the supported operating systems, image formats, and known limitations\n for the types of instances you can export, see Exporting an instance as a VM Using VM Import/Export\n in the VM Import/Export User Guide.

" + "smithy.api#documentation": "

Exports a running or stopped instance to an Amazon S3 bucket.

\n

For information about the prerequisites for your Amazon S3 bucket, supported operating systems,\n image formats, and known limitations for the types of instances you can export, see Exporting an instance as a VM Using VM\n Import/Export in the VM Import/Export User Guide.

" } }, "com.amazonaws.ec2#CreateInstanceExportTaskRequest": { @@ -15027,7 +15210,20 @@ "target": "com.amazonaws.ec2#CreateInternetGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates an internet gateway for use with a VPC. After creating the internet gateway,\n\t\t\tyou attach it to a VPC using AttachInternetGateway.

\n

For more information about your VPC and internet gateway, see the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates an internet gateway for use with a VPC. After creating the internet gateway,\n\t\t\tyou attach it to a VPC using AttachInternetGateway.

\n

For more information, see Internet gateways in the \n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an Internet gateway", + "documentation": "This example creates an Internet gateway.", + "output": { + "InternetGateway": { + "Tags": [], + "InternetGatewayId": "igw-c0a643a9", + "Attachments": [] + } + } + } + ] } }, "com.amazonaws.ec2#CreateInternetGatewayRequest": { @@ -15445,7 +15641,16 @@ "target": "com.amazonaws.ec2#KeyPair" }, "traits": { - "smithy.api#documentation": "

Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\n specified PEM or PPK format. Amazon EC2 stores the public key and displays the private\n key for you to save to a file. The private key is returned as an unencrypted PEM encoded\n PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\n key with the specified name already exists, Amazon EC2 returns an error.

\n

The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\n If you prefer, you can create your own key pair using a third-party tool and upload it\n to any Region using ImportKeyPair.

\n

You can have up to 5,000 key pairs per Amazon Web Services Region.

\n

For more information, see Amazon EC2 key pairs in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\n specified PEM or PPK format. Amazon EC2 stores the public key and displays the private\n key for you to save to a file. The private key is returned as an unencrypted PEM encoded\n PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\n key with the specified name already exists, Amazon EC2 returns an error.

\n

The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\n If you prefer, you can create your own key pair using a third-party tool and upload it\n to any Region using ImportKeyPair.

\n

You can have up to 5,000 key pairs per Amazon Web Services Region.

\n

For more information, see Amazon EC2 key pairs in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a key pair", + "documentation": "This example creates a key pair named my-key-pair.", + "input": { + "KeyName": "my-key-pair" + } + } + ] } }, "com.amazonaws.ec2#CreateKeyPairRequest": { @@ -15502,7 +15707,50 @@ "target": "com.amazonaws.ec2#CreateLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Creates a launch template.

\n

A launch template contains the parameters to launch an instance. When you launch an\n instance using RunInstances, you can specify a launch template instead\n of providing the launch parameters in the request. For more information, see Launch\n an instance from a launch template in the\n Amazon Elastic Compute Cloud User Guide.

\n

If you want to clone an existing launch template as the basis for creating a new\n launch template, you can use the Amazon EC2 console. The API, SDKs, and CLI do not support\n cloning a template. For more information, see Create a launch template from an existing launch template in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a launch template.

\n

A launch template contains the parameters to launch an instance. When you launch an\n instance using RunInstances, you can specify a launch template instead\n of providing the launch parameters in the request. For more information, see Launch\n an instance from a launch template in the\n Amazon Elastic Compute Cloud User Guide.

\n

If you want to clone an existing launch template as the basis for creating a new\n launch template, you can use the Amazon EC2 console. The API, SDKs, and CLI do not support\n cloning a template. For more information, see Create a launch template from an existing launch template in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a launch template", + "documentation": "This example creates a launch template that specifies the subnet in which to launch the instance, assigns a public IP address and an IPv6 address to the instance, and creates a tag for the instance.", + "input": { + "LaunchTemplateName": "my-template", + "VersionDescription": "WebVersion1", + "LaunchTemplateData": { + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": true, + "DeviceIndex": 0, + "Ipv6AddressCount": 1, + "SubnetId": "subnet-7b16de0c" + } + ], + "ImageId": "ami-8c1be5f6", + "InstanceType": "t2.small", + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Name", + "Value": "webserver" + } + ] + } + ] + } + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 1, + "LaunchTemplateId": "lt-01238c059e3466abc", + "LaunchTemplateName": "my-template", + "DefaultVersionNumber": 1, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-11-27T09:13:24.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateLaunchTemplateRequest": { @@ -15589,7 +15837,48 @@ "target": "com.amazonaws.ec2#CreateLaunchTemplateVersionResult" }, "traits": { - "smithy.api#documentation": "

Creates a new version of a launch template. You can specify an existing version of\n launch template from which to base the new version.

\n

Launch template versions are numbered in the order in which they are created. You\n cannot specify, change, or replace the numbering of launch template versions.

\n

Launch templates are immutable; after you create a launch template, you can't modify\n it. Instead, you can create a new version of the launch template that includes any\n changes you require.

\n

For more information, see Modify a launch template (manage launch template versions) in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a new version of a launch template. You can specify an existing version of\n launch template from which to base the new version.

\n

Launch template versions are numbered in the order in which they are created. You\n cannot specify, change, or replace the numbering of launch template versions.

\n

Launch templates are immutable; after you create a launch template, you can't modify\n it. Instead, you can create a new version of the launch template that includes any\n changes you require.

\n

For more information, see Modify a launch template (manage launch template versions) in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a launch template version", + "documentation": "This example creates a new launch template version based on version 1 of the specified launch template and specifies a different AMI ID.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "SourceVersion": "1", + "VersionDescription": "WebVersion2", + "LaunchTemplateData": { + "ImageId": "ami-c998b6b2" + } + }, + "output": { + "LaunchTemplateVersion": { + "VersionDescription": "WebVersion2", + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "my-template", + "VersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "LaunchTemplateData": { + "ImageId": "ami-c998b6b2", + "InstanceType": "t2.micro", + "NetworkInterfaces": [ + { + "Ipv6Addresses": [ + { + "Ipv6Address": "2001:db8:1234:1a00::123" + } + ], + "DeviceIndex": 0, + "SubnetId": "subnet-7b16de0c", + "AssociatePublicIpAddress": true + } + ] + }, + "DefaultVersion": false, + "CreateTime": "2017-12-01T13:35:46.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateLaunchTemplateVersionRequest": { @@ -16052,7 +16341,31 @@ "target": "com.amazonaws.ec2#CreateNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a NAT gateway", + "documentation": "This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.", + "input": { + "SubnetId": "subnet-1a2b3c4d", + "AllocationId": "eipalloc-37fc1a52" + }, + "output": { + "NatGateway": { + "NatGatewayAddresses": [ + { + "AllocationId": "eipalloc-37fc1a52" + } + ], + "VpcId": "vpc-1122aabb", + "State": "pending", + "NatGatewayId": "nat-08d48af2a8e83edfd", + "SubnetId": "subnet-1a2b3c4d", + "CreateTime": "2015-12-17T12:45:26.732Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateNatGatewayRequest": { @@ -16109,14 +16422,14 @@ "SecondaryAllocationIds": { "target": "com.amazonaws.ec2#AllocationIdList", "traits": { - "smithy.api#documentation": "

Secondary EIP allocation IDs. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Secondary EIP allocation IDs. For more information, see Create a NAT gateway \n in the Amazon VPC User Guide.

", "smithy.api#xmlName": "SecondaryAllocationId" } }, "SecondaryPrivateIpAddresses": { "target": "com.amazonaws.ec2#IpList", "traits": { - "smithy.api#documentation": "

Secondary private IPv4 addresses. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Secondary private IPv4 addresses. For more information about secondary addresses, see Create a NAT gateway in the Amazon VPC User Guide.

", "smithy.api#xmlName": "SecondaryPrivateIpAddress" } }, @@ -16125,7 +16438,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. \n For more information about secondary addresses, see Create a NAT gateway \n in the Amazon VPC User Guide.

" } } }, @@ -16166,7 +16479,7 @@ "target": "com.amazonaws.ec2#CreateNetworkAclResult" }, "traits": { - "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateNetworkAclEntry": { @@ -16178,7 +16491,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs \n in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateNetworkAclEntryRequest": { @@ -16746,6 +17059,14 @@ "smithy.api#documentation": "

Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see Ensuring Idempotency.

", "smithy.api#idempotencyToken": {} } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

If you’re creating a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use this option if the instance that\n this ENI will be attached to relies on its IPv6 address not changing. Amazon Web Services\n will automatically assign an IPv6 address associated with the ENI attached to your\n instance to be the primary IPv6 address. Once you enable an IPv6 GUA address to be a\n primary IPv6, you cannot disable it. When you enable an IPv6 GUA address to be a primary\n IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is\n terminated or the network interface is detached. If you have multiple IPv6 addresses\n associated with an ENI attached to your instance and you enable a primary IPv6 address,\n the first IPv6 GUA address associated with the ENI becomes the primary IPv6\n address.

" + } } }, "traits": { @@ -16785,7 +17106,18 @@ "target": "com.amazonaws.ec2#CreatePlacementGroupResult" }, "traits": { - "smithy.api#documentation": "

Creates a placement group in which to launch instances. The strategy of the placement\n group determines how the instances are organized within the group.

\n

A cluster placement group is a logical grouping of instances within a\n single Availability Zone that benefit from low network latency, high network throughput.\n A spread placement group places instances on distinct hardware. A\n partition placement group places groups of instances in different\n partitions, where instances in one partition do not share the same hardware with\n instances in another partition.

\n

For more information, see Placement groups in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Creates a placement group in which to launch instances. The strategy of the placement\n group determines how the instances are organized within the group.

\n

A cluster placement group is a logical grouping of instances within a\n single Availability Zone that benefit from low network latency, high network throughput.\n A spread placement group places instances on distinct hardware. A\n partition placement group places groups of instances in different\n partitions, where instances in one partition do not share the same hardware with\n instances in another partition.

\n

For more information, see Placement groups in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a placement group", + "documentation": "This example creates a placement group with the specified name.", + "input": { + "GroupName": "my-cluster", + "Strategy": "cluster" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#CreatePlacementGroupRequest": { @@ -17157,7 +17489,7 @@ "target": "com.amazonaws.ec2#CreateRouteResult" }, "traits": { - "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateRouteRequest": { @@ -17315,7 +17647,7 @@ "target": "com.amazonaws.ec2#CreateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateRouteTableRequest": { @@ -17378,7 +17710,21 @@ "target": "com.amazonaws.ec2#CreateSecurityGroupResult" }, "traits": { - "smithy.api#documentation": "

Creates a security group.

\n

A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\n For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n

When you create a security group, you specify a friendly name of your choice. You can have a security group for use in EC2-Classic with the same name as a security group for use in a VPC. However, you can't have two security groups for use in EC2-Classic with the same name or two security groups for use in a VPC with the same name.

\n

You have a default security group for use in EC2-Classic and a default security group for use in your VPC. If you don't specify a security group when you launch an instance, the instance is launched into the appropriate default security group. A default security group includes a default rule that grants instances unrestricted network access to each other.

\n

You can add or remove rules from your security groups using \n\t\t\t\t\tAuthorizeSecurityGroupIngress,\n\t\t\t\t\tAuthorizeSecurityGroupEgress,\n\t\t\t\t\tRevokeSecurityGroupIngress, and\n\t\t\t\t\tRevokeSecurityGroupEgress.

\n

For more information about VPC security group limits, see Amazon VPC Limits.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Creates a security group.

\n

A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\n For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n

When you create a security group, you specify a friendly name of your choice. \n You can't have two security groups for the same VPC with the same name.

\n

You have a default security group for use in your VPC. If you don't specify a security group \n when you launch an instance, the instance is launched into the appropriate default security group. \n A default security group includes a default rule that grants instances unrestricted network access \n to each other.

\n

You can add or remove rules from your security groups using \n\t\t\t\t\tAuthorizeSecurityGroupIngress,\n\t\t\t\t\tAuthorizeSecurityGroupEgress,\n\t\t\t\t\tRevokeSecurityGroupIngress, and\n\t\t\t\t\tRevokeSecurityGroupEgress.

\n

For more information about VPC security group limits, see Amazon VPC Limits.

", + "smithy.api#examples": [ + { + "title": "To create a security group for a VPC", + "documentation": "This example creates a security group for the specified VPC.", + "input": { + "Description": "My security group", + "GroupName": "my-security-group", + "VpcId": "vpc-1a2b3c4d" + }, + "output": { + "GroupId": "sg-903004f8" + } + } + ] } }, "com.amazonaws.ec2#CreateSecurityGroupRequest": { @@ -17388,7 +17734,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

A description for the security group.

\n

Constraints: Up to 255 characters in length

\n

Constraints for EC2-Classic: ASCII characters

\n

Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", + "smithy.api#documentation": "

A description for the security group.

\n

Constraints: Up to 255 characters in length

\n

Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", "smithy.api#required": {}, "smithy.api#xmlName": "GroupDescription" } @@ -17397,14 +17743,14 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The name of the security group.

\n

Constraints: Up to 255 characters in length. Cannot start with\n sg-.

\n

Constraints for EC2-Classic: ASCII characters

\n

Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", + "smithy.api#documentation": "

The name of the security group.

\n

Constraints: Up to 255 characters in length. Cannot start with sg-.

\n

Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", "smithy.api#required": {} } }, "VpcId": { "target": "com.amazonaws.ec2#VpcId", "traits": { - "smithy.api#documentation": "

[EC2-VPC] The ID of the VPC. Required for EC2-VPC.

" + "smithy.api#documentation": "

The ID of the VPC. Required for a nondefault VPC.

" } }, "TagSpecifications": { @@ -17462,7 +17808,27 @@ "target": "com.amazonaws.ec2#Snapshot" }, "traits": { - "smithy.api#documentation": "

Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\n \tbackups, to make copies of EBS volumes, and to save data before shutting down an\n \tinstance.

\n

You can create snapshots of volumes in a Region and volumes on an Outpost. If you \n \tcreate a snapshot of a volume in a Region, the snapshot must be stored in the same \n \tRegion as the volume. If you create a snapshot of a volume on an Outpost, the snapshot \n \tcan be stored on the same Outpost as the volume, or in the Region for that Outpost.

\n

When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\n source volume are propagated to the snapshot.

\n

You can take a snapshot of an attached volume that is in use. However, snapshots only\n capture data that has been written to your Amazon EBS volume at the time the snapshot command is\n issued; this might exclude any data that has been cached by any applications or the operating\n system. If you can pause any file systems on the volume long enough to take a snapshot, your\n snapshot should be complete. However, if you cannot pause all file writes to the volume, you\n should unmount the volume from within the instance, issue the snapshot command, and then\n remount the volume to ensure a consistent and complete snapshot. You may remount and use your\n volume while the snapshot status is pending.

\n

When you create a snapshot for an EBS volume that serves as a root device, we recommend \n that you stop the instance before taking the snapshot.

\n

Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\n are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\n and any associated snapshots always remain protected.

\n

You can tag your snapshots during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Amazon Elastic Block Store and Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\n \tbackups, to make copies of EBS volumes, and to save data before shutting down an\n \tinstance.

\n

You can create snapshots of volumes in a Region and volumes on an Outpost. If you \n \tcreate a snapshot of a volume in a Region, the snapshot must be stored in the same \n \tRegion as the volume. If you create a snapshot of a volume on an Outpost, the snapshot \n \tcan be stored on the same Outpost as the volume, or in the Region for that Outpost.

\n

When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\n source volume are propagated to the snapshot.

\n

You can take a snapshot of an attached volume that is in use. However, snapshots only\n capture data that has been written to your Amazon EBS volume at the time the snapshot command is\n issued; this might exclude any data that has been cached by any applications or the operating\n system. If you can pause any file systems on the volume long enough to take a snapshot, your\n snapshot should be complete. However, if you cannot pause all file writes to the volume, you\n should unmount the volume from within the instance, issue the snapshot command, and then\n remount the volume to ensure a consistent and complete snapshot. You may remount and use your\n volume while the snapshot status is pending.

\n

When you create a snapshot for an EBS volume that serves as a root device, we recommend \n that you stop the instance before taking the snapshot.

\n

Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\n are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\n and any associated snapshots always remain protected.

\n

You can tag your snapshots during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Amazon Elastic Block Store and Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a snapshot", + "documentation": "This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.", + "input": { + "VolumeId": "vol-1234567890abcdef0", + "Description": "This is my root volume snapshot." + }, + "output": { + "Description": "This is my root volume snapshot.", + "Tags": [], + "VolumeId": "vol-1234567890abcdef0", + "State": "pending", + "VolumeSize": 8, + "StartTime": "2014-02-28T21:06:01.000Z", + "OwnerId": "012345678910", + "SnapshotId": "snap-066877671789bd71b" + } + } + ] } }, "com.amazonaws.ec2#CreateSnapshotRequest": { @@ -17729,7 +18095,27 @@ "target": "com.amazonaws.ec2#CreateSubnetResult" }, "traits": { - "smithy.api#documentation": "

Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\n If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\n For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\n an IPv4 CIDR block and an IPv6 CIDR block.

\n

A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\n After you create a subnet, you can't change its CIDR block.

\n

The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and \n a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \n the last IPv4 address in each subnet's CIDR block. They're not available for your use.

\n

If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR block \n with a subnet when you create it. The allowed block size for an IPv6 subnet is a /64 netmask.

\n

If you add more than one subnet to a VPC, they're set up in a star topology with a\n logical router in the middle.

\n

When you stop an instance in a subnet, it retains its private IPv4 address. It's\n therefore possible to have a subnet with no running instances (they're all stopped), but\n no remaining IP addresses available.

\n

For more information, see Subnets in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\n If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\n For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\n an IPv4 CIDR block and an IPv6 CIDR block.

\n

A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\n After you create a subnet, you can't change its CIDR block.

\n

The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and \n a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \n the last IPv4 address in each subnet's CIDR block. They're not available for your use.

\n

If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR block \n with a subnet when you create it. The allowed block size for an IPv6 subnet is a /64 netmask.

\n

If you add more than one subnet to a VPC, they're set up in a star topology with a\n logical router in the middle.

\n

When you stop an instance in a subnet, it retains its private IPv4 address. It's\n therefore possible to have a subnet with no running instances (they're all stopped), but\n no remaining IP addresses available.

\n

For more information, see Subnets in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a subnet", + "documentation": "This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.", + "input": { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24" + }, + "output": { + "Subnet": { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24", + "State": "pending", + "AvailabilityZone": "us-west-2c", + "SubnetId": "subnet-9d4a7b6c", + "AvailableIpAddressCount": 251 + } + } + } + ] } }, "com.amazonaws.ec2#CreateSubnetCidrReservation": { @@ -17741,7 +18127,7 @@ "target": "com.amazonaws.ec2#CreateSubnetCidrReservationResult" }, "traits": { - "smithy.api#documentation": "

Creates a subnet CIDR reservation. For information about subnet CIDR reservations, see Subnet CIDR reservations in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a subnet CIDR reservation. For more information, see Subnet CIDR reservations \n in the Amazon Virtual Private Cloud User Guide and Assign prefixes \n to network interfaces in the Amazon Elastic Compute Cloud User Guide.

" } }, "com.amazonaws.ec2#CreateSubnetCidrReservationRequest": { @@ -17767,14 +18153,14 @@ "target": "com.amazonaws.ec2#SubnetCidrReservationType", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The type of reservation.

\n

The following are valid values:

\n
    \n
  • \n

    \n prefix: The Amazon EC2\n Prefix\n Delegation feature assigns the IP addresses to network interfaces that are\n associated with an instance. For information about Prefix\n Delegation,\n see Prefix Delegation\n for Amazon EC2 network interfaces in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n explicit: You manually assign the IP addresses to resources that\n reside in your subnet.

    \n
  • \n
", + "smithy.api#documentation": "

The type of reservation. The reservation type determines how the reserved IP addresses are \n assigned to resources.

\n
    \n
  • \n

    \n prefix - Amazon Web Services assigns the reserved IP addresses to \n network interfaces.

    \n
  • \n
  • \n

    \n explicit - You assign the reserved IP addresses to network interfaces.

    \n
  • \n
", "smithy.api#required": {} } }, "Description": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The\n description\n to assign to the subnet CIDR reservation.

" + "smithy.api#documentation": "

The description to assign to the subnet CIDR reservation.

" } }, "DryRun": { @@ -17826,7 +18212,7 @@ "AvailabilityZone": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The Availability Zone or Local Zone for the subnet.

\n

Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \n do not necessarily select a different zone for each subnet.

\n

To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\n us-west-2-lax-1a. For information about the Regions that support Local Zones, \n see Available Regions in the Amazon Elastic Compute Cloud User Guide.

\n

To create a subnet in an Outpost, set this value to the Availability Zone for the\n Outpost and specify the Outpost ARN.

" + "smithy.api#documentation": "

The Availability Zone or Local Zone for the subnet.

\n

Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \n do not necessarily select a different zone for each subnet.

\n

To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\n us-west-2-lax-1a. For information about the Regions that support Local Zones, \n see Local Zones locations.

\n

To create a subnet in an Outpost, set this value to the Availability Zone for the\n Outpost and specify the Outpost ARN.

" } }, "AvailabilityZoneId": { @@ -18198,7 +18584,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

" + "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

\n

For sessions with Network Load Balancer (NLB) Traffic Mirror targets the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { @@ -19757,7 +20143,29 @@ "target": "com.amazonaws.ec2#Volume" }, "traits": { - "smithy.api#documentation": "

Creates an EBS volume that can be attached to an instance in the same Availability Zone.

\n

You can create a new empty volume or restore a volume from an EBS snapshot.\n Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.

\n

You can create encrypted volumes. Encrypted volumes must be attached to instances that \n support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \n encrypted. For more information, see Amazon EBS encryption\n in the Amazon Elastic Compute Cloud User Guide.

\n

You can tag your volumes during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Create an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an EBS volume that can be attached to an instance in the same Availability Zone.

\n

You can create a new empty volume or restore a volume from an EBS snapshot.\n Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.

\n

You can create encrypted volumes. Encrypted volumes must be attached to instances that \n support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \n encrypted. For more information, see Amazon EBS encryption\n in the Amazon Elastic Compute Cloud User Guide.

\n

You can tag your volumes during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Create an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new volume", + "documentation": "This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.", + "input": { + "AvailabilityZone": "us-east-1a", + "Size": 80, + "VolumeType": "gp2" + }, + "output": { + "AvailabilityZone": "us-east-1a", + "Encrypted": false, + "VolumeType": "gp2", + "VolumeId": "vol-6b60b7c7", + "State": "creating", + "Iops": 240, + "SnapshotId": "", + "CreateTime": "2016-08-29T18:52:32.724Z", + "Size": 80 + } + } + ] } }, "com.amazonaws.ec2#CreateVolumePermission": { @@ -19820,7 +20228,7 @@ "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The Availability Zone in which to create the volume.

", + "smithy.api#documentation": "

The ID of the Availability Zone in which to create the volume. For example, us-east-1a.

", "smithy.api#required": {} } }, @@ -19928,7 +20336,25 @@ "target": "com.amazonaws.ec2#CreateVpcResult" }, "traits": { - "smithy.api#documentation": "

Creates a VPC with the specified CIDR blocks. For more information, see\n\t VPC CIDR blocks in the Amazon Virtual Private Cloud User Guide.

\n

You can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided \n IPv6 CIDR block from Amazon's pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address \n pool that you provisioned through bring your own IP addresses (BYOIP).

\n

By default, each instance that you launch in the VPC has the default DHCP options, which\n\t\t\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\n\t\t\tinformation, see DHCP option sets in the Amazon Virtual Private Cloud User Guide.

\n

You can specify the instance tenancy value for the VPC when you create it. You can't change\n this value for the VPC after you create it. For more information, see Dedicated Instances in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a VPC with the specified CIDR blocks. For more information, see IP addressing for your VPCs and subnets in the \n Amazon VPC User Guide.

\n

You can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided \n IPv6 CIDR block from Amazon's pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address \n pool that you provisioned through bring your own IP addresses (BYOIP).

\n

By default, each instance that you launch in the VPC has the default DHCP options, which\n\t\t\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\n\t\t\tinformation, see DHCP option sets in the Amazon VPC User Guide.

\n

You can specify the instance tenancy value for the VPC when you create it. You can't change\n this value for the VPC after you create it. For more information, see Dedicated Instances in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a VPC", + "documentation": "This example creates a VPC with the specified CIDR block.", + "input": { + "CidrBlock": "10.0.0.0/16" + }, + "output": { + "Vpc": { + "InstanceTenancy": "default", + "State": "pending", + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.0.0/16", + "DhcpOptionsId": "dopt-7a8b9c2d" + } + } + } + ] } }, "com.amazonaws.ec2#CreateVpcEndpoint": { @@ -19940,7 +20366,7 @@ "target": "com.amazonaws.ec2#CreateVpcEndpointResult" }, "traits": { - "smithy.api#documentation": "

Creates a VPC endpoint for a specified service. An endpoint enables you to create a\n private connection between your VPC and the service. The service may be provided by Amazon Web Services,\n an Amazon Web Services Marketplace Partner, or another Amazon Web Services account. For more information, \n see the Amazon Web Services PrivateLink Guide.

" + "smithy.api#documentation": "

Creates a VPC endpoint. A VPC endpoint provides a private connection between the\n specified VPC and the specified endpoint service. You can use an endpoint service\n provided by Amazon Web Services, an Amazon Web Services Marketplace Partner, or another\n Amazon Web Services account. For more information, see the Amazon Web Services PrivateLink User Guide.

" } }, "com.amazonaws.ec2#CreateVpcEndpointConnectionNotification": { @@ -20050,7 +20476,7 @@ "target": "com.amazonaws.ec2#VpcId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of the VPC for the endpoint.

", + "smithy.api#documentation": "

The ID of the VPC.

", "smithy.api#required": {} } }, @@ -20058,7 +20484,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The service name.

", + "smithy.api#documentation": "

The name of the endpoint service.

", "smithy.api#required": {} } }, @@ -21311,7 +21737,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified customer gateway. You must delete the VPN connection before you\n can delete the customer gateway.

" + "smithy.api#documentation": "

Deletes the specified customer gateway. You must delete the VPN connection before you\n can delete the customer gateway.

", + "smithy.api#examples": [ + { + "title": "To delete a customer gateway", + "documentation": "This example deletes the specified customer gateway.", + "input": { + "CustomerGatewayId": "cgw-0e11f167" + } + } + ] } }, "com.amazonaws.ec2#DeleteCustomerGatewayRequest": { @@ -21350,7 +21785,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.

" + "smithy.api#documentation": "

Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.

", + "smithy.api#examples": [ + { + "title": "To delete a DHCP options set", + "documentation": "This example deletes the specified DHCP options set.", + "input": { + "DhcpOptionsId": "dopt-d9070ebb" + } + } + ] } }, "com.amazonaws.ec2#DeleteDhcpOptionsRequest": { @@ -22115,7 +22559,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

" + "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

", + "smithy.api#examples": [ + { + "title": "To delete a key pair", + "documentation": "This example deletes the specified key pair.", + "input": { + "KeyName": "my-key-pair" + } + } + ] } }, "com.amazonaws.ec2#DeleteKeyPairRequest": { @@ -22157,7 +22610,26 @@ "target": "com.amazonaws.ec2#DeleteLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Deletes a launch template. Deleting a launch template deletes all of its\n versions.

" + "smithy.api#documentation": "

Deletes a launch template. Deleting a launch template deletes all of its\n versions.

", + "smithy.api#examples": [ + { + "title": "To delete a launch template", + "documentation": "This example deletes the specified launch template.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123" + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 2, + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "my-template", + "DefaultVersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-11-23T16:46:25.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#DeleteLaunchTemplateRequest": { @@ -22213,7 +22685,29 @@ "target": "com.amazonaws.ec2#DeleteLaunchTemplateVersionsResult" }, "traits": { - "smithy.api#documentation": "

Deletes one or more versions of a launch template. You cannot delete the default\n version of a launch template; you must first assign a different version as the default.\n If the default version is the only version for the launch template, you must delete the\n entire launch template using DeleteLaunchTemplate.

" + "smithy.api#documentation": "

Deletes one or more versions of a launch template.

\n

You can't delete the default version of a launch template; you must first assign a\n different version as the default. If the default version is the only version for the\n launch template, you must delete the entire launch template using DeleteLaunchTemplate.

\n

You can delete up to 200 launch template versions in a single request. To delete more\n than 200 versions in a single request, use DeleteLaunchTemplate, which\n deletes the launch template and all of its versions.

\n

For more information, see Delete a launch template version in the EC2 User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a launch template version", + "documentation": "This example deletes the specified launch template version.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "Versions": [ + "1" + ] + }, + "output": { + "SuccessfullyDeletedLaunchTemplateVersions": [ + { + "LaunchTemplateName": "my-template", + "VersionNumber": 1, + "LaunchTemplateId": "lt-0abcd290751193123" + } + ], + "UnsuccessfullyDeletedLaunchTemplateVersions": [] + } + } + ] } }, "com.amazonaws.ec2#DeleteLaunchTemplateVersionsRequest": { @@ -22243,7 +22737,7 @@ "target": "com.amazonaws.ec2#VersionStringList", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The version numbers of one or more launch template versions to delete.

", + "smithy.api#documentation": "

The version numbers of one or more launch template versions to delete. You can specify\n up to 200 launch template version numbers.

", "smithy.api#required": {}, "smithy.api#xmlName": "LaunchTemplateVersion" } @@ -22652,7 +23146,19 @@ "target": "com.amazonaws.ec2#DeleteNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \n but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \n routes in your route tables.

" + "smithy.api#documentation": "

Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \n but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \n routes in your route tables.

", + "smithy.api#examples": [ + { + "title": "To delete a NAT gateway", + "documentation": "This example deletes the specified NAT gateway.", + "input": { + "NatGatewayId": "nat-04ae55e711cec5680" + }, + "output": { + "NatGatewayId": "nat-04ae55e711cec5680" + } + } + ] } }, "com.amazonaws.ec2#DeleteNatGatewayRequest": { @@ -23439,7 +23945,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes a security group.

\n

If you attempt to delete a security group that is associated with an instance, or is\n\t\t\t referenced by another security group, the operation fails with\n\t\t\t\tInvalidGroup.InUse in EC2-Classic or\n\t\t\t\tDependencyViolation in EC2-VPC.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Deletes a security group.

\n

If you attempt to delete a security group that is associated with an instance or network interface or is\n\t\t\t referenced by another security group, the operation fails with\n\t\t\t\tDependencyViolation.

", + "smithy.api#examples": [ + { + "title": "To delete a security group", + "documentation": "This example deletes the specified security group.", + "input": { + "GroupId": "sg-903004f8" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteSecurityGroupRequest": { @@ -23448,13 +23964,13 @@ "GroupId": { "target": "com.amazonaws.ec2#SecurityGroupId", "traits": { - "smithy.api#documentation": "

The ID of the security group. Required for a nondefault VPC.

" + "smithy.api#documentation": "

The ID of the security group.

" } }, "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You can specify either the\n security group name or the security group ID. For security groups in a nondefault VPC,\n you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You can specify either the\n security group name or the security group ID. For security groups in a nondefault VPC,\n you must specify the security group ID.

" } }, "DryRun": { @@ -23481,7 +23997,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified snapshot.

\n

When you make periodic snapshots of a volume, the snapshots are incremental, and only the\n blocks on the device that have changed since your last snapshot are saved in the new snapshot.\n When you delete a snapshot, only the data not needed for any other snapshot is removed. So\n regardless of which prior snapshots have been deleted, all active snapshots will have access\n to all the information needed to restore the volume.

\n

You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\n You must first de-register the AMI before you can delete the snapshot.

\n

For more information, see Delete an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Deletes the specified snapshot.

\n

When you make periodic snapshots of a volume, the snapshots are incremental, and only the\n blocks on the device that have changed since your last snapshot are saved in the new snapshot.\n When you delete a snapshot, only the data not needed for any other snapshot is removed. So\n regardless of which prior snapshots have been deleted, all active snapshots will have access\n to all the information needed to restore the volume.

\n

You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\n You must first de-register the AMI before you can delete the snapshot.

\n

For more information, see Delete an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a snapshot", + "documentation": "This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteSnapshotRequest": { @@ -23519,7 +24045,13 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the data feed for Spot Instances.

" + "smithy.api#documentation": "

Deletes the data feed for Spot Instances.

", + "smithy.api#examples": [ + { + "title": "To cancel a Spot Instance data feed subscription", + "documentation": "This example deletes a Spot data feed subscription for the account." + } + ] } }, "com.amazonaws.ec2#DeleteSpotDatafeedSubscriptionRequest": { @@ -23550,7 +24082,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.

" + "smithy.api#documentation": "

Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.

", + "smithy.api#examples": [ + { + "title": "To delete a subnet", + "documentation": "This example deletes the specified subnet.", + "input": { + "SubnetId": "subnet-9d4a7b6c" + } + } + ] } }, "com.amazonaws.ec2#DeleteSubnetCidrReservation": { @@ -24720,7 +25261,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified EBS volume. The volume must be in the available state\n (not attached to an instance).

\n

The volume can remain in the deleting state for several minutes.

\n

For more information, see Delete an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Deletes the specified EBS volume. The volume must be in the available state\n (not attached to an instance).

\n

The volume can remain in the deleting state for several minutes.

\n

For more information, see Delete an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a volume", + "documentation": "This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.", + "input": { + "VolumeId": "vol-049df61146c4d7901" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteVolumeRequest": { @@ -24758,7 +25309,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on.

" + "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on.

", + "smithy.api#examples": [ + { + "title": "To delete a VPC", + "documentation": "This example deletes the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#DeleteVpcEndpointConnectionNotifications": { @@ -25553,7 +26113,33 @@ "target": "com.amazonaws.ec2#DescribeAccountAttributesResult" }, "traits": { - "smithy.api#documentation": "

Describes attributes of your Amazon Web Services account. The following are the supported account attributes:

\n
    \n
  • \n

    \n supported-platforms: Indicates whether your account can launch instances\n into EC2-Classic and EC2-VPC, or only into EC2-VPC.

    \n
  • \n
  • \n

    \n default-vpc: The ID of the default VPC for your account, or\n none.

    \n
  • \n
  • \n

    \n max-instances: This attribute is no longer supported. The returned\n value does not reflect your actual vCPU limit for running On-Demand Instances.\n For more information, see On-Demand Instance Limits in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n vpc-max-security-groups-per-interface: The maximum number of security groups\n that you can assign to a network interface.

    \n
  • \n
  • \n

    \n max-elastic-ips: The maximum number of Elastic IP addresses that you can\n allocate for use with EC2-Classic.

    \n
  • \n
  • \n

    \n vpc-max-elastic-ips: The maximum number of Elastic IP addresses that you can\n allocate for use with EC2-VPC.

    \n
  • \n
\n \n

We are retiring EC2-Classic on August 15, 2022. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon EC2 User Guide.

\n
" + "smithy.api#documentation": "

Describes attributes of your Amazon Web Services account. The following are the supported account attributes:

\n
    \n
  • \n

    \n default-vpc: The ID of the default VPC for your account, or none.

    \n
  • \n
  • \n

    \n max-instances: This attribute is no longer supported. The returned\n value does not reflect your actual vCPU limit for running On-Demand Instances.\n For more information, see On-Demand Instance Limits in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n max-elastic-ips: The maximum number of Elastic IP addresses that you can allocate.

    \n
  • \n
  • \n

    \n supported-platforms: This attribute is deprecated.

    \n
  • \n
  • \n

    \n vpc-max-elastic-ips: The maximum number of Elastic IP addresses that you can allocate.

    \n
  • \n
  • \n

    \n vpc-max-security-groups-per-interface: The maximum number of security groups\n that you can assign to a network interface.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To describe a single attribute for your AWS account", + "documentation": "This example describes the supported-platforms attribute for your AWS account.", + "input": { + "AttributeNames": [ + "supported-platforms" + ] + }, + "output": { + "AccountAttributes": [ + { + "AttributeName": "supported-platforms", + "AttributeValues": [ + { + "AttributeValue": "EC2" + }, + { + "AttributeValue": "VPC" + } + ] + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAccountAttributesRequest": { @@ -25696,7 +26282,32 @@ "target": "com.amazonaws.ec2#DescribeAddressesResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified Elastic IP addresses or all of your Elastic IP addresses.

" + "smithy.api#documentation": "

Describes the specified Elastic IP addresses or all of your Elastic IP addresses.

", + "smithy.api#examples": [ + { + "title": "To describe your Elastic IP addresses", + "documentation": "This example describes your Elastic IP addresses.", + "output": { + "Addresses": [ + { + "InstanceId": "i-1234567890abcdef0", + "PublicIp": "198.51.100.0", + "Domain": "standard" + }, + { + "Domain": "vpc", + "InstanceId": "i-1234567890abcdef0", + "NetworkInterfaceId": "eni-12345678", + "AssociationId": "eipassoc-12345678", + "NetworkInterfaceOwnerId": "123456789012", + "PublicIp": "203.0.113.0", + "AllocationId": "eipalloc-12345678", + "PrivateIpAddress": "10.0.1.241" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAddressesAttribute": { @@ -25902,7 +26513,41 @@ "target": "com.amazonaws.ec2#DescribeAvailabilityZonesResult" }, "traits": { - "smithy.api#documentation": "

Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\n you. If there is an event impacting a zone, you can use this request to view the state and any\n provided messages for that zone.

\n

For more information about Availability Zones, Local Zones, and Wavelength Zones, see\n Regions and zones \n in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\n you. If there is an event impacting a zone, you can use this request to view the state and any\n provided messages for that zone.

\n

For more information about Availability Zones, Local Zones, and Wavelength Zones, see\n Regions and zones \n in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe your Availability Zones", + "documentation": "This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.", + "output": { + "AvailabilityZones": [ + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1b" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1c" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1d" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1e" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAvailabilityZonesRequest": { @@ -26504,7 +27149,7 @@ "target": "com.amazonaws.ec2#DescribeClassicLinkInstancesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your linked EC2-Classic instances. This request only returns\n\t\t\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\n\t\t\tuse this request to return information about other instances.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
", + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes one or more of your linked EC2-Classic instances. This request only returns\n\t\t\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\n\t\t\tuse this request to return information about other instances.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -26529,7 +27174,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n group-id - The ID of a VPC security group that's associated with the instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC to which the instance is\n\t\t\t\t\tlinked.

    \n

    \n vpc-id - The ID of the VPC that the instance is linked to.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n group-id - The ID of a VPC security group that's associated with the instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC to which the instance is linked.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -26546,7 +27191,7 @@ "InstanceIds": { "target": "com.amazonaws.ec2#InstanceIdStringList", "traits": { - "smithy.api#documentation": "

One or more instance IDs. Must be instances linked to a VPC through ClassicLink.

", + "smithy.api#documentation": "

The instance IDs. Must be instances linked to a VPC through ClassicLink.

", "smithy.api#xmlName": "InstanceId" } }, @@ -27313,6 +27958,28 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your VPN customer gateways.

\n

For more information, see Amazon Web Services Site-to-Site VPN in the Amazon Web Services Site-to-Site VPN\n User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a customer gateway", + "documentation": "This example describes the specified customer gateway.", + "input": { + "CustomerGatewayIds": [ + "cgw-0e11f167" + ] + }, + "output": { + "CustomerGateways": [ + { + "CustomerGatewayId": "cgw-0e11f167", + "IpAddress": "12.1.2.3", + "State": "available", + "Type": "ipsec.1", + "BgpAsn": "65534" + } + ] + } + } + ], "smithy.waiters#waitable": { "CustomerGatewayAvailable": { "acceptors": [ @@ -27411,7 +28078,38 @@ "target": "com.amazonaws.ec2#DescribeDhcpOptionsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your DHCP options sets.

\n

For more information, see DHCP options sets in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your DHCP options sets.

\n

For more information, see DHCP options sets in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a DHCP options set", + "documentation": "This example describes the specified DHCP options set.", + "input": { + "DhcpOptionsIds": [ + "dopt-d9070ebb" + ] + }, + "output": { + "DhcpOptions": [ + { + "DhcpConfigurations": [ + { + "Values": [ + { + "Value": "10.2.5.2" + }, + { + "Value": "10.2.5.1" + } + ], + "Key": "domain-name-servers" + } + ], + "DhcpOptionsId": "dopt-d9070ebb" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -27443,7 +28141,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n dhcp-options-id - The ID of a DHCP options set.

    \n
  • \n
  • \n

    \n key - The key for one of the options (for example, domain-name).

    \n
  • \n
  • \n

    \n value - The value for one of the options.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the DHCP options set.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n dhcp-options-id - The ID of a DHCP options set.

    \n
  • \n
  • \n

    \n key - The key for one of the options (for example, domain-name).

    \n
  • \n
  • \n

    \n value - The value for one of the options.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the DHCP options set.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -27542,7 +28240,7 @@ "EgressOnlyInternetGatewayIds": { "target": "com.amazonaws.ec2#EgressOnlyInternetGatewayIdList", "traits": { - "smithy.api#documentation": "

One or more egress-only internet gateway IDs.

", + "smithy.api#documentation": "

The IDs of the egress-only internet gateways.

", "smithy.api#xmlName": "EgressOnlyInternetGatewayId" } }, @@ -27563,7 +28261,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } } @@ -29163,6 +29861,30 @@ }, "traits": { "smithy.api#documentation": "

Describes your IAM instance profile associations.

", + "smithy.api#examples": [ + { + "title": "To describe an IAM instance profile association", + "documentation": "This example describes the specified IAM instance profile association.", + "input": { + "AssociationIds": [ + "iip-assoc-0db249b1f25fa24b8" + ] + }, + "output": { + "IamInstanceProfileAssociations": [ + { + "InstanceId": "i-09eb09efa73ec1dee", + "State": "associated", + "AssociationId": "iip-assoc-0db249b1f25fa24b8", + "IamInstanceProfile": { + "Id": "AIPAJVQN4F5WVLGCJDRGM", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -29346,7 +30068,25 @@ "target": "com.amazonaws.ec2#ImageAttribute" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified AMI. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified AMI. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the launch permissions for an AMI", + "documentation": "This example describes the launch permissions for the specified AMI.", + "input": { + "Attribute": "launchPermission", + "ImageId": "ami-5731123e" + }, + "output": { + "ImageId": "ami-5731123e", + "LaunchPermissions": [ + { + "UserId": "123456789012" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeImageAttributeRequest": { @@ -29394,6 +30134,48 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified images (AMIs, AKIs, and ARIs) available to you or all of the images available to you.

\n

The images available to you include public images, private images that you own, and private images owned by other \n Amazon Web Services accounts for which you have explicit launch permissions.

\n

Recently deregistered images appear in the returned results for a short interval and then\n return empty results. After all instances that reference a deregistered AMI are terminated,\n specifying the ID of the image will eventually return an error indicating that the AMI ID\n cannot be found.

", + "smithy.api#examples": [ + { + "title": "To describe an AMI", + "documentation": "This example describes the specified AMI.", + "input": { + "ImageIds": [ + "ami-5731123e" + ] + }, + "output": { + "Images": [ + { + "VirtualizationType": "paravirtual", + "Name": "My server", + "Hypervisor": "xen", + "ImageId": "ami-5731123e", + "RootDeviceType": "ebs", + "State": "available", + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sda1", + "Ebs": { + "DeleteOnTermination": true, + "SnapshotId": "snap-1234567890abcdef0", + "VolumeSize": 8, + "VolumeType": "standard" + } + } + ], + "Architecture": "x86_64", + "ImageLocation": "123456789012/My server", + "KernelId": "aki-88aa75e1", + "OwnerId": "123456789012", + "RootDeviceName": "/dev/sda1", + "Public": false, + "ImageType": "machine", + "Description": "An AMI for my server" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -29466,7 +30248,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 | x86_64 | \n arm64 | x86_64_mac | arm64_mac).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30117,6 +30899,47 @@ }, "traits": { "smithy.api#documentation": "

Describes the status of the specified instances or all of your instances. By default,\n only running instances are described, unless you specifically indicate to return the\n status of all instances.

\n

Instance status includes the following components:

\n
    \n
  • \n

    \n Status checks - Amazon EC2 performs status\n checks on running EC2 instances to identify hardware and software issues. For\n more information, see Status checks for your instances and Troubleshoot\n instances with failed status checks in the Amazon EC2 User\n Guide.

    \n
  • \n
  • \n

    \n Scheduled events - Amazon EC2 can schedule\n events (such as reboot, stop, or terminate) for your instances related to\n hardware issues, software updates, or system maintenance. For more information,\n see Scheduled events for your instances in the Amazon EC2 User\n Guide.

    \n
  • \n
  • \n

    \n Instance state - You can manage your instances\n from the moment you launch them through their termination. For more information,\n see Instance\n lifecycle in the Amazon EC2 User Guide.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To describe the status of an instance", + "documentation": "This example describes the current status of the specified instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "InstanceStatuses": [ + { + "InstanceId": "i-1234567890abcdef0", + "InstanceState": { + "Code": 16, + "Name": "running" + }, + "AvailabilityZone": "us-east-1d", + "SystemStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "reachability" + } + ] + }, + "InstanceStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "reachability" + } + ] + } + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30368,7 +31191,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters. Filter names and values are case-sensitive.

\n
    \n
  • \n

    \n auto-recovery-supported - Indicates whether Amazon CloudWatch action based recovery is supported (true | false).

    \n
  • \n
  • \n

    \n bare-metal - Indicates whether it is a bare metal instance type (true | false).

    \n
  • \n
  • \n

    \n burstable-performance-supported - Indicates whether it is a burstable\n performance instance type (true | false).

    \n
  • \n
  • \n

    \n current-generation - Indicates whether this instance type is the latest\n generation instance type of an instance family (true | false).

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps - The baseline\n bandwidth performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-iops - The baseline input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-throughput-in-mbps - The baseline\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps - The maximum bandwidth\n performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-iops - The maximum input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-throughput-in-mbps - The maximum\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-support - Indicates whether the instance type is\n EBS-optimized (supported | unsupported |\n default).

    \n
  • \n
  • \n

    \n ebs-info.encryption-support - Indicates whether EBS encryption is supported\n (supported | unsupported).

    \n
  • \n
  • \n

    \n ebs-info.nvme-support - Indicates whether non-volatile memory express (NVMe)\n is supported for EBS volumes (required | supported | unsupported).

    \n
  • \n
  • \n

    \n free-tier-eligible - Indicates whether the instance type is eligible to use\n in the free tier (true | false).

    \n
  • \n
  • \n

    \n hibernation-supported - Indicates whether On-Demand hibernation is supported (true | false).

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor (nitro | xen).

    \n
  • \n
  • \n

    \n instance-storage-info.disk.count - The number of local disks.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.size-in-gb - The storage size of each instance storage disk, in\n GB.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.type - The storage technology for the local\n instance storage disks (hdd | ssd).

    \n
  • \n
  • \n

    \n instance-storage-info.encryption-support - Indicates whether data is encrypted at rest \n (required | supported | unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.nvme-support - Indicates whether non-volatile memory\n express (NVMe) is supported for instance store (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.total-size-in-gb - The total amount of storage available from all local\n instance storage, in GB.

    \n
  • \n
  • \n

    \n instance-storage-supported - Indicates whether the instance type has local\n instance storage (true | false).

    \n
  • \n
  • \n

    \n instance-type - The instance type (for example c5.2xlarge or\n c5*).

    \n
  • \n
  • \n

    \n memory-info.size-in-mib - The memory size.

    \n
  • \n
  • \n

    \n network-info.efa-info.maximum-efa-interfaces - The maximum number of Elastic \n Fabric Adapters (EFAs) per instance.

    \n
  • \n
  • \n

    \n network-info.efa-supported - Indicates whether the instance type supports\n Elastic Fabric Adapter (EFA) (true | false).

    \n
  • \n
  • \n

    \n network-info.ena-support - Indicates whether Elastic Network Adapter (ENA) is\n supported or required (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n network-info.encryption-in-transit-supported - Indicates whether the instance type \n automatically encrypts in-transit traffic between instances (true | false).

    \n
  • \n
  • \n

    \n network-info.ipv4-addresses-per-interface - The maximum number of private IPv4 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-addresses-per-interface - The maximum number of private IPv6 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-supported - Indicates whether the instance type supports IPv6 (true | false).

    \n
  • \n
  • \n

    \n network-info.maximum-network-cards - The maximum number of network cards per\n instance.

    \n
  • \n
  • \n

    \n network-info.maximum-network-interfaces - The maximum number of network interfaces per instance.

    \n
  • \n
  • \n

    \n network-info.network-performance - The network performance (for example, \"25\n Gigabit\").

    \n
  • \n
  • \n

    \n processor-info.supported-architecture - The CPU architecture\n (arm64 | i386 | x86_64).

    \n
  • \n
  • \n

    \n processor-info.sustained-clock-speed-in-ghz - The CPU clock speed, in GHz.

    \n
  • \n
  • \n

    \n supported-boot-mode - The boot mode (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n supported-root-device-type - The root device type (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n supported-usage-class - The usage class (on-demand |\n spot).

    \n
  • \n
  • \n

    \n supported-virtualization-type - The virtualization type (hvm |\n paravirtual).

    \n
  • \n
  • \n

    \n vcpu-info.default-cores - The default number of cores for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.default-threads-per-core - The default number of threads per core for the instance\n type.

    \n
  • \n
  • \n

    \n vcpu-info.default-vcpus - The default number of vCPUs for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-cores - The number of cores that can be configured for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-threads-per-core - The number of threads per core that can be configured for the instance type.\n For example, \"1\" or \"1,2\".

    \n
  • \n
", + "smithy.api#documentation": "

One or more filters. Filter names and values are case-sensitive.

\n
    \n
  • \n

    \n auto-recovery-supported - Indicates whether Amazon CloudWatch action based recovery is supported (true | false).

    \n
  • \n
  • \n

    \n bare-metal - Indicates whether it is a bare metal instance type (true | false).

    \n
  • \n
  • \n

    \n burstable-performance-supported - Indicates whether the instance type is a \n burstable performance T instance type (true | false).

    \n
  • \n
  • \n

    \n current-generation - Indicates whether this instance type is the latest\n generation instance type of an instance family (true | false).

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps - The baseline\n bandwidth performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-iops - The baseline input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-throughput-in-mbps - The baseline\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps - The maximum bandwidth\n performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-iops - The maximum input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-throughput-in-mbps - The maximum\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-support - Indicates whether the instance type is\n EBS-optimized (supported | unsupported |\n default).

    \n
  • \n
  • \n

    \n ebs-info.encryption-support - Indicates whether EBS encryption is supported\n (supported | unsupported).

    \n
  • \n
  • \n

    \n ebs-info.nvme-support - Indicates whether non-volatile memory express (NVMe)\n is supported for EBS volumes (required | supported | unsupported).

    \n
  • \n
  • \n

    \n free-tier-eligible - Indicates whether the instance type is eligible to use\n in the free tier (true | false).

    \n
  • \n
  • \n

    \n hibernation-supported - Indicates whether On-Demand hibernation is supported (true | false).

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor (nitro | xen).

    \n
  • \n
  • \n

    \n instance-storage-info.disk.count - The number of local disks.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.size-in-gb - The storage size of each instance storage disk, in\n GB.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.type - The storage technology for the local\n instance storage disks (hdd | ssd).

    \n
  • \n
  • \n

    \n instance-storage-info.encryption-support - Indicates whether data is encrypted at rest \n (required | supported | unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.nvme-support - Indicates whether non-volatile memory\n express (NVMe) is supported for instance store (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.total-size-in-gb - The total amount of storage available from all local\n instance storage, in GB.

    \n
  • \n
  • \n

    \n instance-storage-supported - Indicates whether the instance type has local\n instance storage (true | false).

    \n
  • \n
  • \n

    \n instance-type - The instance type (for example c5.2xlarge or\n c5*).

    \n
  • \n
  • \n

    \n memory-info.size-in-mib - The memory size.

    \n
  • \n
  • \n

    \n network-info.efa-info.maximum-efa-interfaces - The maximum number of Elastic \n Fabric Adapters (EFAs) per instance.

    \n
  • \n
  • \n

    \n network-info.efa-supported - Indicates whether the instance type supports\n Elastic Fabric Adapter (EFA) (true | false).

    \n
  • \n
  • \n

    \n network-info.ena-support - Indicates whether Elastic Network Adapter (ENA) is\n supported or required (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n network-info.encryption-in-transit-supported - Indicates whether the instance type \n automatically encrypts in-transit traffic between instances (true | false).

    \n
  • \n
  • \n

    \n network-info.ipv4-addresses-per-interface - The maximum number of private IPv4 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-addresses-per-interface - The maximum number of private IPv6 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-supported - Indicates whether the instance type supports IPv6 (true | false).

    \n
  • \n
  • \n

    \n network-info.maximum-network-cards - The maximum number of network cards per\n instance.

    \n
  • \n
  • \n

    \n network-info.maximum-network-interfaces - The maximum number of network interfaces per instance.

    \n
  • \n
  • \n

    \n network-info.network-performance - The network performance (for example, \"25\n Gigabit\").

    \n
  • \n
  • \n

    \n nitro-enclaves-support - Indicates whether Nitro Enclaves is supported (supported |\n unsupported).

    \n
  • \n
  • \n

    \n nitro-tpm-support - Indicates whether NitroTPM is supported (supported |\n unsupported).

    \n
  • \n
  • \n

    \n nitro-tpm-info.supported-versions - The supported NitroTPM version (2.0).

    \n
  • \n
  • \n

    \n processor-info.supported-architecture - The CPU architecture\n (arm64 | i386 | x86_64).

    \n
  • \n
  • \n

    \n processor-info.sustained-clock-speed-in-ghz - The CPU clock speed, in GHz.

    \n
  • \n
  • \n

    \n processor-info.supported-features - The supported CPU features (amd-sev-snp).

    \n
  • \n
  • \n

    \n supported-boot-mode - The boot mode (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n supported-root-device-type - The root device type (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n supported-usage-class - The usage class (on-demand |\n spot).

    \n
  • \n
  • \n

    \n supported-virtualization-type - The virtualization type (hvm |\n paravirtual).

    \n
  • \n
  • \n

    \n vcpu-info.default-cores - The default number of cores for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.default-threads-per-core - The default number of threads per core for the instance\n type.

    \n
  • \n
  • \n

    \n vcpu-info.default-vcpus - The default number of vCPUs for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-cores - The number of cores that can be configured for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-threads-per-core - The number of threads per core that can be configured for the instance type.\n For example, \"1\" or \"1,2\".

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30423,6 +31246,18 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified instances or all instances.

\n

If you specify instance IDs, the output includes information for only the specified\n instances. If you specify filters, the output includes information for only those\n instances that meet the filter criteria. If you do not specify instance IDs or filters,\n the output includes information for all instances, which can affect performance. We\n recommend that you use pagination to ensure that the operation returns quickly and\n successfully.

\n

If you specify an instance ID that is not valid, an error is returned. If you specify\n an instance that you do not own, it is not included in the output.

\n

Recently terminated instances might appear in the returned results. This interval is\n usually less than one hour.

\n

If you describe instances in the rare case where an Availability Zone is experiencing\n a service disruption and you specify instance IDs that are in the affected zone, or do\n not specify any instance IDs at all, the call fails. If you describe instances and\n specify only instance IDs that are in an unaffected zone, the call works\n normally.

", + "smithy.api#examples": [ + { + "title": "To describe an Amazon EC2 instance", + "documentation": "This example describes the specified instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": {} + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30584,7 +31419,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2010-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the\n block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you launched\n the instance.

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay |\n marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in\n the block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n boot-mode - The boot mode that was specified by the AMI\n (legacy-bios | uefi |\n uefi-preferred).

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-preference\n - The instance's Capacity Reservation preference (open | none).

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id\n - The ID of the targeted Capacity Reservation.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn\n - The ARN of the targeted Capacity Reservation group.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you\n launched the instance.

    \n
  • \n
  • \n

    \n current-instance-boot-mode - The boot mode that is used to launch\n the instance at launch or start (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n ebs-optimized - A Boolean that indicates whether the instance is\n optimized for Amazon EBS I/O.

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether the instance is\n enabled for enhanced networking with ENA.

    \n
  • \n
  • \n

    \n enclave-options.enabled - A Boolean that indicates whether the\n instance is enabled for Amazon Web Services Nitro Enclaves.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n iam-instance-profile.id - The instance profile associated with\n the instance. Specified as an ID.

    \n
  • \n
  • \n

    \n iam-instance-profile.name - The instance profile associated with\n the instance. Specified as an name.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n ipv6-address - The IPv6 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n license-pool -

    \n
  • \n
  • \n

    \n maintenance-options.auto-recovery - The current automatic\n recovery behavior of the instance (disabled | default).

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv4 - Indicates whether the IPv4\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv6 - Indicates whether the IPv6\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.state - The state of the metadata option changes\n (pending | applied).

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n platform-details - The platform (Linux/UNIX |\n Red Hat BYOL Linux | Red Hat Enterprise Linux |\n Red Hat Enterprise Linux with HA | Red Hat Enterprise\n Linux with SQL Server Standard and HA | Red Hat Enterprise\n Linux with SQL Server Enterprise and HA | Red Hat Enterprise\n Linux with SQL Server Standard | Red Hat Enterprise Linux with\n SQL Server Web | Red Hat Enterprise Linux with SQL Server\n Enterprise | SQL Server Enterprise | SQL Server\n Standard | SQL Server Web | SUSE Linux |\n Ubuntu Pro | Windows | Windows BYOL |\n Windows with SQL Server Enterprise | Windows with SQL\n Server Standard | Windows with SQL Server Web).

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-a-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS A records.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-aaaa-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS AAAA records.

    \n
  • \n
  • \n

    \n private-dns-name-options.hostname-type - The type of hostname\n (ip-name | resource-name).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay\n | marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n tpm-support - Indicates if the instance is configured for\n NitroTPM support (v2.0).

    \n
  • \n
  • \n

    \n usage-operation - The usage operation value for the instance\n (RunInstances | RunInstances:00g0 |\n RunInstances:0010 | RunInstances:1010 |\n RunInstances:1014 | RunInstances:1110 |\n RunInstances:0014 | RunInstances:0210 |\n RunInstances:0110 | RunInstances:0100 |\n RunInstances:0004 | RunInstances:0200 |\n RunInstances:000g | RunInstances:0g00 |\n RunInstances:0002 | RunInstances:0800 |\n RunInstances:0102 | RunInstances:0006 |\n RunInstances:0202).

    \n
  • \n
  • \n

    \n usage-operation-update-time - The time that the usage operation\n was last updated, for example, 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30662,6 +31497,36 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your internet gateways.

", + "smithy.api#examples": [ + { + "title": "To describe the Internet gateway for a VPC", + "documentation": "This example describes the Internet gateway for the specified VPC.", + "input": { + "Filters": [ + { + "Name": "attachment.vpc-id", + "Values": [ + "vpc-a01106c2" + ] + } + ] + }, + "output": { + "InternetGateways": [ + { + "Tags": [], + "InternetGatewayId": "igw-c0a643a9", + "Attachments": [ + { + "State": "attached", + "VpcId": "vpc-a01106c2" + } + ] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30712,7 +31577,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n attachment.state - The current state of the attachment between the gateway\n and the VPC (available). Present only if a VPC is attached.

    \n
  • \n
  • \n

    \n attachment.vpc-id - The ID of an attached VPC.

    \n
  • \n
  • \n

    \n internet-gateway-id - The ID of the Internet gateway.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the internet gateway.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n attachment.state - The current state of the attachment between the gateway\n and the VPC (available). Present only if a VPC is attached.

    \n
  • \n
  • \n

    \n attachment.vpc-id - The ID of an attached VPC.

    \n
  • \n
  • \n

    \n internet-gateway-id - The ID of the Internet gateway.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the internet gateway.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30730,7 +31595,7 @@ "target": "com.amazonaws.ec2#InternetGatewayIdList", "traits": { "aws.protocols#ec2QueryName": "InternetGatewayId", - "smithy.api#documentation": "

One or more internet gateway IDs.

\n

Default: Describes all your internet gateways.

", + "smithy.api#documentation": "

The IDs of the internet gateways.

\n

Default: Describes all your internet gateways.

", "smithy.api#xmlName": "internetGatewayId" } }, @@ -31303,6 +32168,25 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified key pairs or all of your key pairs.

\n

For more information about key pairs, see Amazon EC2 key pairs \n\t\t\t\tin the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To display a key pair", + "documentation": "This example displays the fingerprint for the specified key.", + "input": { + "KeyNames": [ + "my-key-pair" + ] + }, + "output": { + "KeyPairs": [ + { + "KeyName": "my-key-pair", + "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f" + } + ] + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -31404,6 +32288,66 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more versions of a specified launch template. You can describe all\n versions, individual versions, or a range of versions. You can also describe all the\n latest versions or all the default versions of all the launch templates in your\n account.

", + "smithy.api#examples": [ + { + "title": "To describe the versions for a launch template", + "documentation": "This example describes the versions for the specified launch template.", + "input": { + "LaunchTemplateId": "068f72b72934aff71" + }, + "output": { + "LaunchTemplateVersions": [ + { + "LaunchTemplateId": "lt-068f72b72934aff71", + "LaunchTemplateName": "Webservers", + "VersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789102:root", + "LaunchTemplateData": { + "KeyName": "kp-us-east", + "ImageId": "ami-6057e21a", + "InstanceType": "t2.medium", + "NetworkInterfaces": [ + { + "SubnetId": "subnet-1a2b3c4d", + "DeviceIndex": 0, + "Groups": [ + "sg-7c227019" + ] + } + ] + }, + "DefaultVersion": false, + "CreateTime": "2017-11-20T13:12:32.000Z" + }, + { + "LaunchTemplateId": "lt-068f72b72934aff71", + "LaunchTemplateName": "Webservers", + "VersionNumber": 1, + "CreatedBy": "arn:aws:iam::123456789102:root", + "LaunchTemplateData": { + "UserData": "", + "KeyName": "kp-us-east", + "ImageId": "ami-aabbcc11", + "InstanceType": "t2.medium", + "NetworkInterfaces": [ + { + "SubnetId": "subnet-7b16de0c", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "Groups": [ + "sg-7c227019" + ], + "AssociatePublicIpAddress": true + } + ] + }, + "DefaultVersion": true, + "CreateTime": "2017-11-20T12:52:33.000Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -31522,6 +32466,29 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more launch templates.

", + "smithy.api#examples": [ + { + "title": "To describe a launch template", + "documentation": "This example describes the specified launch template.", + "input": { + "LaunchTemplateIds": [ + "lt-01238c059e3466abc" + ] + }, + "output": { + "LaunchTemplates": [ + { + "LatestVersionNumber": 1, + "LaunchTemplateName": "my-template", + "LaunchTemplateId": "lt-01238c059e3466abc", + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2018-01-16T04:32:57.000Z", + "DefaultVersionNumber": 1 + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32227,6 +33194,20 @@ }, "traits": { "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes your Elastic IP addresses that are being moved from or being restored to the EC2-Classic platform. \n This request does not return information about any other Elastic IP addresses in your account.

", + "smithy.api#examples": [ + { + "title": "To describe your moving addresses", + "documentation": "This example describes all of your moving Elastic IP addresses.", + "output": { + "MovingAddressStatuses": [ + { + "PublicIp": "198.51.100.0", + "MoveStatus": "movingToVpc" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32331,6 +33312,41 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your NAT gateways.

", + "smithy.api#examples": [ + { + "title": "To describe a NAT gateway", + "documentation": "This example describes the NAT gateway for the specified VPC.", + "input": { + "Filter": [ + { + "Name": "vpc-id", + "Values": [ + "vpc-1a2b3c4d" + ] + } + ] + }, + "output": { + "NatGateways": [ + { + "NatGatewayAddresses": [ + { + "PublicIp": "198.11.222.333", + "NetworkInterfaceId": "eni-9dec76cd", + "AllocationId": "eipalloc-89c620ec", + "PrivateIp": "10.0.0.149" + } + ], + "VpcId": "vpc-1a2b3c4d", + "State": "available", + "NatGatewayId": "nat-05dba92075d71c408", + "SubnetId": "subnet-847e4dc2", + "CreateTime": "2015-12-01T12:26:55.983Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32440,7 +33456,7 @@ "Filter": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n nat-gateway-id - The ID of the NAT gateway.

    \n
  • \n
  • \n

    \n state - The state of the NAT gateway (pending |\n failed | available | deleting | deleted).

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet in which the NAT gateway resides.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC in which the NAT gateway resides.

    \n
  • \n
" + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n nat-gateway-id - The ID of the NAT gateway.

    \n
  • \n
  • \n

    \n state - The state of the NAT gateway (pending |\n failed | available | deleting | deleted).

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet in which the NAT gateway resides.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC in which the NAT gateway resides.

    \n
  • \n
" } }, "MaxResults": { @@ -32454,7 +33470,7 @@ "NatGatewayIds": { "target": "com.amazonaws.ec2#NatGatewayIdStringList", "traits": { - "smithy.api#documentation": "

One or more NAT gateway IDs.

", + "smithy.api#documentation": "

The IDs of the NAT gateways.

", "smithy.api#xmlName": "NatGatewayId" } }, @@ -32502,7 +33518,51 @@ "target": "com.amazonaws.ec2#DescribeNetworkAclsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your network ACLs.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your network ACLs.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a network ACL", + "documentation": "This example describes the specified network ACL.", + "input": { + "NetworkAclIds": [ + "acl-5fb85d36" + ] + }, + "output": { + "NetworkAcls": [ + { + "Associations": [ + { + "SubnetId": "subnet-65ea5f08", + "NetworkAclId": "acl-9aeb5ef7", + "NetworkAclAssociationId": "aclassoc-66ea5f0b" + } + ], + "NetworkAclId": "acl-5fb85d36", + "VpcId": "vpc-a01106c2", + "Tags": [], + "Entries": [ + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": true, + "RuleAction": "deny" + }, + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": false, + "RuleAction": "deny" + } + ], + "IsDefault": false + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32527,7 +33587,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.association-id - The ID of an association ID for the ACL.

    \n
  • \n
  • \n

    \n association.network-acl-id - The ID of the network ACL involved in the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the association.

    \n
  • \n
  • \n

    \n default - Indicates whether the ACL is the default network ACL for the VPC.

    \n
  • \n
  • \n

    \n entry.cidr - The IPv4 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.icmp.code - The ICMP code specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.icmp.type - The ICMP type specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.from - The start of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.to - The end of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.protocol - The protocol specified in the entry (tcp | udp | icmp or a protocol number).

    \n
  • \n
  • \n

    \n entry.rule-action - Allows or denies the matching traffic (allow | deny).

    \n
  • \n
  • \n

    \n entry.egress - A Boolean that indicates the type of rule. Specify true \n\t\t for egress rules, or false for ingress rules.

    \n
  • \n
  • \n

    \n entry.rule-number - The number of an entry (in other words, rule) in\n the set of ACL entries.

    \n
  • \n
  • \n

    \n network-acl-id - The ID of the network ACL.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the network ACL.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network ACL.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n association.association-id - The ID of an association ID for the ACL.

    \n
  • \n
  • \n

    \n association.network-acl-id - The ID of the network ACL involved in the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the association.

    \n
  • \n
  • \n

    \n default - Indicates whether the ACL is the default network ACL for the VPC.

    \n
  • \n
  • \n

    \n entry.cidr - The IPv4 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.icmp.code - The ICMP code specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.icmp.type - The ICMP type specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.from - The start of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.to - The end of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.protocol - The protocol specified in the entry (tcp | udp | icmp or a protocol number).

    \n
  • \n
  • \n

    \n entry.rule-action - Allows or denies the matching traffic (allow | deny).

    \n
  • \n
  • \n

    \n entry.egress - A Boolean that indicates the type of rule. Specify true \n\t\t for egress rules, or false for ingress rules.

    \n
  • \n
  • \n

    \n entry.rule-number - The number of an entry (in other words, rule) in\n the set of ACL entries.

    \n
  • \n
  • \n

    \n network-acl-id - The ID of the network ACL.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the network ACL.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network ACL.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -32544,7 +33604,7 @@ "NetworkAclIds": { "target": "com.amazonaws.ec2#NetworkAclIdStringList", "traits": { - "smithy.api#documentation": "

One or more network ACL IDs.

\n

Default: Describes all your network ACLs.

", + "smithy.api#documentation": "

The IDs of the network ACLs.

\n

Default: Describes all your network ACLs.

", "smithy.api#xmlName": "NetworkAclId" } }, @@ -33169,6 +34229,70 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your network interfaces.

", + "smithy.api#examples": [ + { + "title": "To describe a network interface", + "documentation": "", + "input": { + "NetworkInterfaceIds": [ + "eni-e5aa89a3" + ] + }, + "output": { + "NetworkInterfaces": [ + { + "Status": "in-use", + "MacAddress": "02:2f:8f:b0:cf:75", + "SourceDestCheck": true, + "VpcId": "vpc-a01106c2", + "Description": "my network interface", + "Association": { + "PublicIp": "203.0.113.12", + "AssociationId": "eipassoc-0fbb766a", + "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com", + "IpOwnerId": "123456789012" + }, + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + { + "PrivateDnsName": "ip-10-0-1-17.ec2.internal", + "Association": { + "PublicIp": "203.0.113.12", + "AssociationId": "eipassoc-0fbb766a", + "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com", + "IpOwnerId": "123456789012" + }, + "Primary": true, + "PrivateIpAddress": "10.0.1.17" + } + ], + "RequesterManaged": false, + "PrivateDnsName": "ip-10-0-1-17.ec2.internal", + "AvailabilityZone": "us-east-1d", + "Attachment": { + "Status": "attached", + "DeviceIndex": 1, + "AttachTime": "2013-11-30T23:36:42.000Z", + "InstanceId": "i-1234567890abcdef0", + "DeleteOnTermination": false, + "AttachmentId": "eni-attach-66c4350a", + "InstanceOwnerId": "123456789012" + }, + "Groups": [ + { + "GroupName": "default", + "GroupId": "sg-8637d3e3" + } + ], + "SubnetId": "subnet-b61f49f0", + "OwnerId": "123456789012", + "TagSet": [], + "PrivateIpAddress": "10.0.1.17" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -33615,7 +34739,61 @@ "target": "com.amazonaws.ec2#DescribeRegionsResult" }, "traits": { - "smithy.api#documentation": "

Describes the Regions that are enabled for your account, or all Regions.

\n

For a list of the Regions supported by Amazon EC2, see \n Amazon Elastic Compute Cloud endpoints and quotas.

\n

For information about enabling and disabling Regions for your account, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference.

" + "smithy.api#documentation": "

Describes the Regions that are enabled for your account, or all Regions.

\n

For a list of the Regions supported by Amazon EC2, see \n Amazon Elastic Compute Cloud endpoints and quotas.

\n

For information about enabling and disabling Regions for your account, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference.

", + "smithy.api#examples": [ + { + "title": "To describe your regions", + "documentation": "This example describes all the regions that are available to you.", + "output": { + "Regions": [ + { + "Endpoint": "ec2.ap-south-1.amazonaws.com", + "RegionName": "ap-south-1" + }, + { + "Endpoint": "ec2.eu-west-1.amazonaws.com", + "RegionName": "eu-west-1" + }, + { + "Endpoint": "ec2.ap-southeast-1.amazonaws.com", + "RegionName": "ap-southeast-1" + }, + { + "Endpoint": "ec2.ap-southeast-2.amazonaws.com", + "RegionName": "ap-southeast-2" + }, + { + "Endpoint": "ec2.eu-central-1.amazonaws.com", + "RegionName": "eu-central-1" + }, + { + "Endpoint": "ec2.ap-northeast-2.amazonaws.com", + "RegionName": "ap-northeast-2" + }, + { + "Endpoint": "ec2.ap-northeast-1.amazonaws.com", + "RegionName": "ap-northeast-1" + }, + { + "Endpoint": "ec2.us-east-1.amazonaws.com", + "RegionName": "us-east-1" + }, + { + "Endpoint": "ec2.sa-east-1.amazonaws.com", + "RegionName": "sa-east-1" + }, + { + "Endpoint": "ec2.us-west-1.amazonaws.com", + "RegionName": "us-west-1" + }, + { + "Endpoint": "ec2.us-west-2.amazonaws.com", + "RegionName": "us-west-2" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeRegionsRequest": { @@ -34155,7 +35333,42 @@ "target": "com.amazonaws.ec2#DescribeRouteTablesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your route tables.

\n

Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your route tables.

\n

Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a route table", + "documentation": "This example describes the specified route table.", + "input": { + "RouteTableIds": [ + "rtb-1f382e7d" + ] + }, + "output": { + "RouteTables": [ + { + "Associations": [ + { + "RouteTableAssociationId": "rtbassoc-d8ccddba", + "Main": true, + "RouteTableId": "rtb-1f382e7d" + } + ], + "RouteTableId": "rtb-1f382e7d", + "VpcId": "vpc-a01106c2", + "PropagatingVgws": [], + "Tags": [], + "Routes": [ + { + "GatewayId": "local", + "DestinationCidrBlock": "10.0.0.0/16", + "State": "active" + } + ] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34180,7 +35393,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.route-table-association-id - The ID of an association\n ID for the route table.

    \n
  • \n
  • \n

    \n association.route-table-id - The ID of the route table involved in\n the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the\n association.

    \n
  • \n
  • \n

    \n association.main - Indicates whether the route table is the main\n route table for the VPC (true | false). Route tables\n that do not have an association ID are not returned in the response.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the route table.

    \n
  • \n
  • \n

    \n route-table-id - The ID of the route table.

    \n
  • \n
  • \n

    \n route.destination-cidr-block - The IPv4 CIDR range specified in a\n route in the table.

    \n
  • \n
  • \n

    \n route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.destination-prefix-list-id - The ID (prefix) of the Amazon Web Service\n specified in a route in the table.

    \n
  • \n
  • \n

    \n route.egress-only-internet-gateway-id - The ID of an\n egress-only Internet gateway specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.gateway-id - The ID of a gateway specified in a route in the table.

    \n
  • \n
  • \n

    \n route.instance-id - The ID of an instance specified in a route in the table.

    \n
  • \n
  • \n

    \n route.nat-gateway-id - The ID of a NAT gateway.

    \n
  • \n
  • \n

    \n route.transit-gateway-id - The ID of a transit gateway.

    \n
  • \n
  • \n

    \n route.origin - Describes how the route was created. \n CreateRouteTable indicates that the route was automatically\n created when the route table was created; CreateRoute indicates\n that the route was manually added to the route table;\n EnableVgwRoutePropagation indicates that the route was\n propagated by route propagation.

    \n
  • \n
  • \n

    \n route.state - The state of a route in the route table\n (active | blackhole). The blackhole state\n indicates that the route's target isn't available (for example, the specified\n gateway isn't attached to the VPC, the specified NAT instance has been\n terminated, and so on).

    \n
  • \n
  • \n

    \n route.vpc-peering-connection-id - The ID of a VPC peering\n\t\t connection specified in a route in the table.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the route table.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n association.route-table-association-id - The ID of an association\n ID for the route table.

    \n
  • \n
  • \n

    \n association.route-table-id - The ID of the route table involved in\n the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the\n association.

    \n
  • \n
  • \n

    \n association.main - Indicates whether the route table is the main\n route table for the VPC (true | false). Route tables\n that do not have an association ID are not returned in the response.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the route table.

    \n
  • \n
  • \n

    \n route-table-id - The ID of the route table.

    \n
  • \n
  • \n

    \n route.destination-cidr-block - The IPv4 CIDR range specified in a\n route in the table.

    \n
  • \n
  • \n

    \n route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.destination-prefix-list-id - The ID (prefix) of the Amazon Web Service\n specified in a route in the table.

    \n
  • \n
  • \n

    \n route.egress-only-internet-gateway-id - The ID of an\n egress-only Internet gateway specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.gateway-id - The ID of a gateway specified in a route in the table.

    \n
  • \n
  • \n

    \n route.instance-id - The ID of an instance specified in a route in the table.

    \n
  • \n
  • \n

    \n route.nat-gateway-id - The ID of a NAT gateway.

    \n
  • \n
  • \n

    \n route.transit-gateway-id - The ID of a transit gateway.

    \n
  • \n
  • \n

    \n route.origin - Describes how the route was created. \n CreateRouteTable indicates that the route was automatically\n created when the route table was created; CreateRoute indicates\n that the route was manually added to the route table;\n EnableVgwRoutePropagation indicates that the route was\n propagated by route propagation.

    \n
  • \n
  • \n

    \n route.state - The state of a route in the route table\n (active | blackhole). The blackhole state\n indicates that the route's target isn't available (for example, the specified\n gateway isn't attached to the VPC, the specified NAT instance has been\n terminated, and so on).

    \n
  • \n
  • \n

    \n route.vpc-peering-connection-id - The ID of a VPC peering\n\t\t connection specified in a route in the table.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the route table.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -34197,7 +35410,7 @@ "RouteTableIds": { "target": "com.amazonaws.ec2#RouteTableIdStringList", "traits": { - "smithy.api#documentation": "

One or more route table IDs.

\n

Default: Describes all your route tables.

", + "smithy.api#documentation": "

The IDs of the route tables.

\n

Default: Describes all your route tables.

", "smithy.api#xmlName": "RouteTableId" } }, @@ -34471,7 +35684,27 @@ "target": "com.amazonaws.ec2#DescribeSecurityGroupReferencesResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Describes the VPCs on the other side of a VPC peering connection that are referencing the security groups you've specified in this request.

" + "smithy.api#documentation": "

Describes the VPCs on the other side of a VPC peering connection that are referencing the security groups you've specified in this request.

", + "smithy.api#examples": [ + { + "title": "To describe security group references", + "documentation": "This example describes the security group references for the specified security group.", + "input": { + "GroupId": [ + "sg-903004f8" + ] + }, + "output": { + "SecurityGroupReferenceSet": [ + { + "ReferencingVpcId": "vpc-1a2b3c4d", + "GroupId": "sg-903004f8", + "VpcPeeringConnectionId": "pcx-b04deed9" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeSecurityGroupReferencesRequest": { @@ -34619,7 +35852,19 @@ "target": "com.amazonaws.ec2#DescribeSecurityGroupsResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified security groups or all of your security groups.

\n

A security group is for use with instances either in the EC2-Classic platform \n\t\t\t\tor in a specific VPC. For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
", + "smithy.api#documentation": "

Describes the specified security groups or all of your security groups.

", + "smithy.api#examples": [ + { + "title": "To describe a security group", + "documentation": "This example describes the specified security group.", + "input": { + "GroupIds": [ + "sg-903004f8" + ] + }, + "output": {} + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34684,7 +35929,7 @@ "GroupNames": { "target": "com.amazonaws.ec2#GroupNameStringList", "traits": { - "smithy.api#documentation": "

[EC2-Classic and default VPC only] The names of the security groups. You can specify either\n\t\t\tthe security group name or the security group ID. For security groups in a nondefault VPC, use\n\t\t\tthe group-name filter to describe security groups by name.

\n

Default: Describes all of your security groups.

", + "smithy.api#documentation": "

[Default VPC] The names of the security groups. You can specify either\n\t\t\tthe security group name or the security group ID.

\n

Default: Describes all of your security groups.

", "smithy.api#xmlName": "GroupName" } }, @@ -34750,7 +35995,21 @@ "target": "com.amazonaws.ec2#DescribeSnapshotAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified snapshot. You can specify only one\n attribute at a time.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified snapshot. You can specify only one\n attribute at a time.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe snapshot attributes", + "documentation": "This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.", + "input": { + "SnapshotId": "snap-066877671789bd71b", + "Attribute": "createVolumePermission" + }, + "output": { + "SnapshotId": "snap-066877671789bd71b", + "CreateVolumePermissions": [] + } + } + ] } }, "com.amazonaws.ec2#DescribeSnapshotAttributeRequest": { @@ -34909,6 +36168,32 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified EBS snapshots available to you or all of the EBS snapshots\n available to you.

\n

The snapshots available to you include public snapshots, private snapshots that you own,\n and private snapshots owned by other Amazon Web Services accounts for which you have explicit create volume\n permissions.

\n

The create volume permissions fall into the following categories:

\n
    \n
  • \n

    \n public: The owner of the snapshot granted create volume\n permissions for the snapshot to the all group. All Amazon Web Services accounts have create\n volume permissions for these snapshots.

    \n
  • \n
  • \n

    \n explicit: The owner of the snapshot granted create volume\n permissions to a specific Amazon Web Services account.

    \n
  • \n
  • \n

    \n implicit: An Amazon Web Services account has implicit create volume permissions\n for all snapshots it owns.

    \n
  • \n
\n

The list of snapshots returned can be filtered by specifying snapshot IDs, snapshot\n owners, or Amazon Web Services accounts with create volume permissions. If no options are specified, \n Amazon EC2 returns all snapshots for which you have create volume permissions.

\n

If you specify one or more snapshot IDs, only snapshots that have the specified IDs are\n returned. If you specify an invalid snapshot ID, an error is returned. If you specify a\n snapshot ID for which you do not have access, it is not included in the returned\n results.

\n

If you specify one or more snapshot owners using the OwnerIds option, only\n snapshots from the specified owners and for which you have access are returned. The results\n can include the Amazon Web Services account IDs of the specified owners, amazon for snapshots\n owned by Amazon, or self for snapshots that you own.

\n

If you specify a list of restorable users, only snapshots with create snapshot permissions\n for those users are returned. You can specify Amazon Web Services account IDs (if you own the snapshots),\n self for snapshots for which you own or have explicit permissions, or\n all for public snapshots.

\n

If you are describing a long list of snapshots, we recommend that you paginate the output to make the\n list more manageable. For more information, see Pagination.

\n

To get the state of fast snapshot restores for a snapshot, use DescribeFastSnapshotRestores.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a snapshot", + "documentation": "This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.", + "input": { + "SnapshotIds": [ + "snap-1234567890abcdef0" + ] + }, + "output": { + "Snapshots": [ + { + "Description": "This is my snapshot.", + "VolumeId": "vol-049df61146c4d7901", + "State": "completed", + "VolumeSize": 8, + "Progress": "100%", + "StartTime": "2014-02-28T21:28:32.000Z", + "SnapshotId": "snap-1234567890abcdef0", + "OwnerId": "012345678910" + } + ], + "NextToken": "" + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35037,7 +36322,21 @@ "target": "com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionResult" }, "traits": { - "smithy.api#documentation": "

Describes the data feed for Spot Instances. For more information, see Spot\n Instance data feed in the Amazon EC2 User Guide for Linux Instances.

" + "smithy.api#documentation": "

Describes the data feed for Spot Instances. For more information, see Spot\n Instance data feed in the Amazon EC2 User Guide for Linux Instances.

", + "smithy.api#examples": [ + { + "title": "To describe the datafeed for your AWS account", + "documentation": "This example describes the Spot Instance datafeed subscription for your AWS account.", + "output": { + "SpotDatafeedSubscription": { + "OwnerId": "123456789012", + "Prefix": "spotdata", + "Bucket": "my-s3-bucket", + "State": "Active" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionRequest": { @@ -35324,6 +36623,60 @@ }, "traits": { "smithy.api#documentation": "

Describes your Spot Fleet requests.

\n

Spot Fleet requests are deleted 48 hours after they are canceled and their instances\n are terminated.

", + "smithy.api#examples": [ + { + "title": "To describe a Spot fleet request", + "documentation": "This example describes the specified Spot fleet request.", + "input": { + "SpotFleetRequestIds": [ + "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + ] + }, + "output": { + "SpotFleetRequestConfigs": [ + { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "SpotFleetRequestConfig": { + "TargetCapacity": 20, + "LaunchSpecifications": [ + { + "EbsOptimized": false, + "NetworkInterfaces": [ + { + "SubnetId": "subnet-a61dafcf", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "AssociatePublicIpAddress": true, + "SecondaryPrivateIpAddressCount": 0 + } + ], + "InstanceType": "cc2.8xlarge", + "ImageId": "ami-1a2b3c4d" + }, + { + "EbsOptimized": false, + "NetworkInterfaces": [ + { + "SubnetId": "subnet-a61dafcf", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "AssociatePublicIpAddress": true, + "SecondaryPrivateIpAddressCount": 0 + } + ], + "InstanceType": "r3.8xlarge", + "ImageId": "ami-1a2b3c4d" + } + ], + "SpotPrice": "0.05", + "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role" + }, + "SpotFleetRequestState": "active" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35412,6 +36765,58 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified Spot Instance requests.

\n

You can use DescribeSpotInstanceRequests to find a running Spot Instance by\n examining the response. If the status of the Spot Instance is fulfilled, the\n instance ID appears in the response and contains the identifier of the instance.\n Alternatively, you can use DescribeInstances\n with a filter to look for instances where the instance lifecycle is\n spot.

\n

We recommend that you set MaxResults to a value between 5 and 1000 to\n limit the number of items returned. This paginates the output, which makes the list\n more manageable and returns the items faster. If the list of items exceeds your\n MaxResults value, then that number of items is returned along with a\n NextToken value that can be passed to a subsequent\n DescribeSpotInstanceRequests request to retrieve the remaining\n items.

\n

Spot Instance requests are deleted four hours after they are canceled and their instances are\n terminated.

", + "smithy.api#examples": [ + { + "title": "To describe a Spot Instance request", + "documentation": "This example describes the specified Spot Instance request.", + "input": { + "SpotInstanceRequestIds": [ + "sir-08b93456" + ] + }, + "output": { + "SpotInstanceRequests": [ + { + "Status": { + "UpdateTime": "2014-04-30T18:16:21.000Z", + "Code": "fulfilled", + "Message": "Your Spot request is fulfilled." + }, + "ProductDescription": "Linux/UNIX", + "InstanceId": "i-1234567890abcdef0", + "SpotInstanceRequestId": "sir-08b93456", + "State": "active", + "LaunchedAvailabilityZone": "us-west-1b", + "LaunchSpecification": { + "ImageId": "ami-7aba833f", + "KeyName": "my-key-pair", + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sda1", + "Ebs": { + "DeleteOnTermination": true, + "VolumeType": "standard", + "VolumeSize": 8 + } + } + ], + "EbsOptimized": false, + "SecurityGroups": [ + { + "GroupName": "my-security-group", + "GroupId": "sg-e38f24a7" + } + ], + "InstanceType": "m1.small" + }, + "Type": "one-time", + "CreateTime": "2014-04-30T18:14:55.000Z", + "SpotPrice": "0.010000" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35578,6 +36983,40 @@ }, "traits": { "smithy.api#documentation": "

Describes the Spot price history. For more information, see Spot Instance pricing history in the\n Amazon EC2 User Guide for Linux Instances.

\n

When you specify a start and end time, the operation returns the prices of the\n instance types within that time range. It also returns the last price change before the\n start time, which is the effective price as of the start time.

", + "smithy.api#examples": [ + { + "title": "To describe Spot price history for Linux/UNIX (Amazon VPC)", + "documentation": "This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.", + "input": { + "StartTime": "2014-01-06T07:08:09.05Z", + "EndTime": "2014-01-06T08:09:10.05Z", + "InstanceTypes": [ + "m1.xlarge" + ], + "ProductDescriptions": [ + "Linux/UNIX (Amazon VPC)" + ] + }, + "output": { + "SpotPriceHistory": [ + { + "Timestamp": "2014-01-06T04:32:53.000Z", + "ProductDescription": "Linux/UNIX (Amazon VPC)", + "InstanceType": "m1.xlarge", + "SpotPrice": "0.080000", + "AvailabilityZone": "us-west-1a" + }, + { + "Timestamp": "2014-01-05T11:28:26.000Z", + "ProductDescription": "Linux/UNIX (Amazon VPC)", + "InstanceType": "m1.xlarge", + "SpotPrice": "0.080000", + "AvailabilityZone": "us-west-1c" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35702,7 +37141,7 @@ "target": "com.amazonaws.ec2#DescribeStaleSecurityGroupsResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Describes the stale security group rules for security groups in a specified VPC. \n Rules are stale when they reference a deleted security group in the same VPC or in a peer VPC, \n or if they reference a security group in a peer VPC for which the VPC peering connection has \n been deleted.

", + "smithy.api#documentation": "

Describes the stale security group rules for security groups in a specified VPC. \n Rules are stale when they reference a deleted security group in the same VPC or in a peer VPC, \n or if they reference a security group in a peer VPC for which the VPC peering connection has \n been deleted.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35807,6 +37246,43 @@ "outputToken": "NextToken", "items": "StoreImageTaskResults", "pageSize": "MaxResults" + }, + "smithy.waiters#waitable": { + "StoreImageTaskComplete": { + "acceptors": [ + { + "state": "success", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "Completed", + "comparator": "allStringEquals" + } + } + }, + { + "state": "failure", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "Failed", + "comparator": "anyStringEquals" + } + } + }, + { + "state": "retry", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "InProgress", + "comparator": "anyStringEquals" + } + } + } + ], + "minDelay": 5 + } } } }, @@ -35897,7 +37373,37 @@ "target": "com.amazonaws.ec2#DescribeSubnetsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your subnets.

\n

For more information, see Your VPC and subnets in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your subnets.

\n

For more information, see Subnets in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe the subnets for a VPC", + "documentation": "This example describes the subnets for the specified VPC.", + "input": { + "Filters": [ + { + "Name": "vpc-id", + "Values": [ + "vpc-a01106c2" + ] + } + ] + }, + "output": { + "Subnets": [ + { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24", + "MapPublicIpOnLaunch": false, + "DefaultForAz": false, + "State": "available", + "AvailabilityZone": "us-east-1c", + "SubnetId": "subnet-9d4a7b6c", + "AvailableIpAddressCount": 251 + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35939,14 +37445,14 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for the subnet. You can also use\n availabilityZone as the filter name.

    \n
  • \n
  • \n

    \n availability-zone-id - The ID of the Availability Zone for the subnet.\n You can also use availabilityZoneId as the filter name.

    \n
  • \n
  • \n

    \n available-ip-address-count - The number of IPv4 addresses in the\n subnet that are available.

    \n
  • \n
  • \n

    \n cidr-block - The IPv4 CIDR block of the subnet. The CIDR block\n you specify must exactly match the subnet's CIDR block for information to be\n returned for the subnet. You can also use cidr or\n cidrBlock as the filter names.

    \n
  • \n
  • \n

    \n customer-owned-ipv4-pool - The customer-owned IPv4 address pool\n associated with the subnet.

    \n
  • \n
  • \n

    \n default-for-az - Indicates whether this is the default subnet for\n the Availability Zone (true | false). You can also use\n defaultForAz as the filter name.

    \n
  • \n
  • \n

    \n enable-dns64 - Indicates whether DNS queries made to the\n Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\n addresses for IPv4-only destinations.

    \n
  • \n
  • \n

    \n enable-lni-at-device-index - Indicates the device position for\n local network interfaces in this subnet. For example, 1 indicates\n local network interfaces in this subnet are the secondary network interface\n (eth1).

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - An association ID\n for an IPv6 CIDR block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-native - Indicates whether this is an IPv6 only subnet\n (true | false).

    \n
  • \n
  • \n

    \n map-customer-owned-ip-on-launch - Indicates whether a network\n interface created in this subnet (including a network interface created by RunInstances) receives a customer-owned IPv4 address.

    \n
  • \n
  • \n

    \n map-public-ip-on-launch - Indicates whether instances launched in\n this subnet receive a public IPv4 address.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the Outpost.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the\n subnet.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.hostname-type - The type of\n hostname to assign to instances in the subnet at launch. For IPv4-only and\n dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\n instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\n only subnets, an instance DNS name must be based on the instance ID\n (resource-name).

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-a-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS\n AAAA records.

    \n
  • \n
  • \n

    \n state - The state of the subnet (pending | available).

    \n
  • \n
  • \n

    \n subnet-arn - The Amazon Resource Name (ARN) of the subnet.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the subnet.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for the subnet. You can also use\n availabilityZone as the filter name.

    \n
  • \n
  • \n

    \n availability-zone-id - The ID of the Availability Zone for the subnet.\n You can also use availabilityZoneId as the filter name.

    \n
  • \n
  • \n

    \n available-ip-address-count - The number of IPv4 addresses in the\n subnet that are available.

    \n
  • \n
  • \n

    \n cidr-block - The IPv4 CIDR block of the subnet. The CIDR block\n you specify must exactly match the subnet's CIDR block for information to be\n returned for the subnet. You can also use cidr or\n cidrBlock as the filter names.

    \n
  • \n
  • \n

    \n customer-owned-ipv4-pool - The customer-owned IPv4 address pool\n associated with the subnet.

    \n
  • \n
  • \n

    \n default-for-az - Indicates whether this is the default subnet for\n the Availability Zone (true | false). You can also use\n defaultForAz as the filter name.

    \n
  • \n
  • \n

    \n enable-dns64 - Indicates whether DNS queries made to the\n Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\n addresses for IPv4-only destinations.

    \n
  • \n
  • \n

    \n enable-lni-at-device-index - Indicates the device position for\n local network interfaces in this subnet. For example, 1 indicates\n local network interfaces in this subnet are the secondary network interface\n (eth1).

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - An association ID\n for an IPv6 CIDR block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-native - Indicates whether this is an IPv6 only subnet\n (true | false).

    \n
  • \n
  • \n

    \n map-customer-owned-ip-on-launch - Indicates whether a network\n interface created in this subnet (including a network interface created by RunInstances) receives a customer-owned IPv4 address.

    \n
  • \n
  • \n

    \n map-public-ip-on-launch - Indicates whether instances launched in\n this subnet receive a public IPv4 address.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the Outpost.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the\n subnet.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.hostname-type - The type of\n hostname to assign to instances in the subnet at launch. For IPv4-only and\n dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\n instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\n only subnets, an instance DNS name must be based on the instance ID\n (resource-name).

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-a-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS\n AAAA records.

    \n
  • \n
  • \n

    \n state - The state of the subnet (pending | available).

    \n
  • \n
  • \n

    \n subnet-arn - The Amazon Resource Name (ARN) of the subnet.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the subnet.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, "SubnetIds": { "target": "com.amazonaws.ec2#SubnetIdStringList", "traits": { - "smithy.api#documentation": "

One or more subnet IDs.

\n

Default: Describes all your subnets.

", + "smithy.api#documentation": "

The IDs of the subnets.

\n

Default: Describes all your subnets.

", "smithy.api#xmlName": "SubnetId" } }, @@ -36013,6 +37519,38 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified tags for your EC2 resources.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe the tags for a single resource", + "documentation": "This example describes the tags for the specified instance.", + "input": { + "Filters": [ + { + "Name": "resource-id", + "Values": [ + "i-1234567890abcdef8" + ] + } + ] + }, + "output": { + "Tags": [ + { + "ResourceType": "instance", + "ResourceId": "i-1234567890abcdef8", + "Value": "test", + "Key": "Stack" + }, + { + "ResourceType": "instance", + "ResourceId": "i-1234567890abcdef8", + "Value": "Beta Server", + "Key": "Name" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -37799,7 +39337,23 @@ "target": "com.amazonaws.ec2#DescribeVolumeAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified volume. You can specify only one\n attribute at a time.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified volume. You can specify only one\n attribute at a time.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a volume attribute", + "documentation": "This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.", + "input": { + "VolumeId": "vol-049df61146c4d7901", + "Attribute": "autoEnableIO" + }, + "output": { + "AutoEnableIO": { + "Value": false + }, + "VolumeId": "vol-049df61146c4d7901" + } + } + ] } }, "com.amazonaws.ec2#DescribeVolumeAttributeRequest": { @@ -37878,6 +39432,40 @@ }, "traits": { "smithy.api#documentation": "

Describes the status of the specified volumes. Volume status provides the result of the\n checks performed on your volumes to determine events that can impair the performance of your\n volumes. The performance of a volume can be affected if an issue occurs on the volume's\n underlying host. If the volume's underlying host experiences a power outage or system issue,\n after the system is restored, there could be data inconsistencies on the volume. Volume events\n notify you if this occurs. Volume actions notify you if any action needs to be taken in\n response to the event.

\n

The DescribeVolumeStatus operation provides the following information about\n the specified volumes:

\n

\n Status: Reflects the current status of the volume. The possible\n values are ok, impaired , warning, or\n insufficient-data. If all checks pass, the overall status of the volume is\n ok. If the check fails, the overall status is impaired. If the\n status is insufficient-data, then the checks might still be taking place on your\n volume at the time. We recommend that you retry the request. For more information about volume\n status, see Monitor the status of your volumes in the\n Amazon Elastic Compute Cloud User Guide.

\n

\n Events: Reflect the cause of a volume status and might require you to\n take action. For example, if your volume returns an impaired status, then the\n volume event might be potential-data-inconsistency. This means that your volume\n has been affected by an issue with the underlying host, has all I/O operations disabled, and\n might have inconsistent data.

\n

\n Actions: Reflect the actions you might have to take in response to an\n event. For example, if the status of the volume is impaired and the volume event\n shows potential-data-inconsistency, then the action shows\n enable-volume-io. This means that you may want to enable the I/O operations for\n the volume by calling the EnableVolumeIO action and then check the volume\n for data consistency.

\n

Volume status is based on the volume status checks, and does not reflect the volume state.\n Therefore, volume status does not indicate volumes in the error state (for\n example, when a volume is incapable of accepting I/O.)

", + "smithy.api#examples": [ + { + "title": "To describe the status of a single volume", + "documentation": "This example describes the status for the volume ``vol-1234567890abcdef0``.", + "input": { + "VolumeIds": [ + "vol-1234567890abcdef0" + ] + }, + "output": { + "VolumeStatuses": [ + { + "VolumeStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "io-enabled" + }, + { + "Status": "not-applicable", + "Name": "io-performance" + } + ] + }, + "AvailabilityZone": "us-east-1a", + "VolumeId": "vol-1234567890abcdef0", + "Actions": [], + "Events": [] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -37966,6 +39554,36 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified EBS volumes or all of your EBS volumes.

\n

If you are describing a long list of volumes, we recommend that you paginate the output to make the list\n more manageable. For more information, see Pagination.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe all volumes", + "documentation": "This example describes all of your volumes in the default region.", + "output": { + "Volumes": [ + { + "AvailabilityZone": "us-east-1a", + "Attachments": [ + { + "AttachTime": "2013-12-18T22:35:00.000Z", + "InstanceId": "i-1234567890abcdef0", + "VolumeId": "vol-049df61146c4d7901", + "State": "attached", + "DeleteOnTermination": true, + "Device": "/dev/sda1" + } + ], + "VolumeType": "standard", + "VolumeId": "vol-049df61146c4d7901", + "State": "in-use", + "SnapshotId": "snap-1234567890abcdef0", + "CreateTime": "2013-12-18T22:35:00.084Z", + "Size": 8 + } + ], + "NextToken": "" + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -38219,7 +39837,23 @@ "target": "com.amazonaws.ec2#DescribeVpcAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the enableDnsSupport attribute", + "documentation": "This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.", + "input": { + "VpcId": "vpc-a01106c2", + "Attribute": "enableDnsSupport" + }, + "output": { + "VpcId": "vpc-a01106c2", + "EnableDnsSupport": { + "Value": true + } + } + } + ] } }, "com.amazonaws.ec2#DescribeVpcAttributeRequest": { @@ -38305,7 +39939,7 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "

Describes the ClassicLink status of one or more VPCs.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes the ClassicLink status of the specified VPCs.

" } }, "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupport": { @@ -38317,7 +39951,7 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\n hostname of a linked EC2-Classic instance resolves to its private IP address when\n addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n of an instance in a VPC resolves to its private IP address when addressed from a linked\n EC2-Classic instance. For more information, see ClassicLink in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\n hostname of a linked EC2-Classic instance resolves to its private IP address when\n addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n of an instance in a VPC resolves to its private IP address when addressed from a linked\n EC2-Classic instance.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -38369,7 +40003,7 @@ "VpcIds": { "target": "com.amazonaws.ec2#VpcClassicLinkIdList", "traits": { - "smithy.api#documentation": "

One or more VPC IDs.

", + "smithy.api#documentation": "

The IDs of the VPCs.

", "smithy.api#xmlName": "VpcIds" } } @@ -38408,7 +40042,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n is-classic-link-enabled - Whether the VPC is enabled for ClassicLink\n\t\t\t\t\t (true | false).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n is-classic-link-enabled - Whether the VPC is enabled for ClassicLink\n\t\t\t\t\t (true | false).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -38425,7 +40059,7 @@ "VpcIds": { "target": "com.amazonaws.ec2#VpcClassicLinkIdList", "traits": { - "smithy.api#documentation": "

One or more VPCs for which you want to describe the ClassicLink status.

", + "smithy.api#documentation": "

The VPCs for which you want to describe the ClassicLink status.

", "smithy.api#xmlName": "VpcId" } } @@ -38441,7 +40075,7 @@ "target": "com.amazonaws.ec2#VpcClassicLinkList", "traits": { "aws.protocols#ec2QueryName": "VpcSet", - "smithy.api#documentation": "

The ClassicLink status of one or more VPCs.

", + "smithy.api#documentation": "

The ClassicLink status of the VPCs.

", "smithy.api#xmlName": "vpcSet" } } @@ -39038,7 +40672,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter\n VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n accepter VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.vpc-id - The ID of the accepter VPC.

    \n
  • \n
  • \n

    \n expiration-time - The expiration date and time for the VPC peering\n connection.

    \n
  • \n
  • \n

    \n requester-vpc-info.cidr-block - The IPv4 CIDR block of the\n requester's VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n requester VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.vpc-id - The ID of the requester VPC.

    \n
  • \n
  • \n

    \n status-code - The status of the VPC peering connection\n (pending-acceptance | failed |\n expired | provisioning | active |\n deleting | deleted |\n rejected).

    \n
  • \n
  • \n

    \n status-message - A message that provides more information about the status\n of the VPC peering connection, if applicable.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-peering-connection-id - The ID of the VPC peering connection.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter\n VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n accepter VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.vpc-id - The ID of the accepter VPC.

    \n
  • \n
  • \n

    \n expiration-time - The expiration date and time for the VPC peering\n connection.

    \n
  • \n
  • \n

    \n requester-vpc-info.cidr-block - The IPv4 CIDR block of the\n requester's VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n requester VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.vpc-id - The ID of the requester VPC.

    \n
  • \n
  • \n

    \n status-code - The status of the VPC peering connection\n (pending-acceptance | failed |\n expired | provisioning | active |\n deleting | deleted |\n rejected).

    \n
  • \n
  • \n

    \n status-message - A message that provides more information about the status\n of the VPC peering connection, if applicable.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-peering-connection-id - The ID of the VPC peering connection.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -39055,7 +40689,7 @@ "VpcPeeringConnectionIds": { "target": "com.amazonaws.ec2#VpcPeeringConnectionIdList", "traits": { - "smithy.api#documentation": "

One or more VPC peering connection IDs.

\n

Default: Describes all your VPC peering connections.

", + "smithy.api#documentation": "

The IDs of the VPC peering connections.

\n

Default: Describes all your VPC peering connections.

", "smithy.api#xmlName": "VpcPeeringConnectionId" } }, @@ -39112,6 +40746,35 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your VPCs.

", + "smithy.api#examples": [ + { + "title": "To describe a VPC", + "documentation": "This example describes the specified VPC.", + "input": { + "VpcIds": [ + "vpc-a01106c2" + ] + }, + "output": { + "Vpcs": [ + { + "VpcId": "vpc-a01106c2", + "InstanceTenancy": "default", + "Tags": [ + { + "Value": "MyVPC", + "Key": "Name" + } + ], + "State": "available", + "DhcpOptionsId": "dopt-7a8b9c2d", + "CidrBlock": "10.0.0.0/16", + "IsDefault": false + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -39173,14 +40836,14 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you\n specify must exactly match the VPC's CIDR block for information to be returned\n for the VPC. Must contain the slash followed by one or two digits (for example,\n /28).

    \n
  • \n
  • \n

    \n cidr-block-association.cidr-block - An IPv4 CIDR block associated with the\n VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.association-id - The association ID for\n an IPv4 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.state - The state of an IPv4 CIDR block\n associated with the VPC.

    \n
  • \n
  • \n

    \n dhcp-options-id - The ID of a set of DHCP options.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-pool - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - The association\n ID for an IPv6 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n is-default - Indicates whether the VPC is the default VPC.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the VPC.

    \n
  • \n
  • \n

    \n state - The state of the VPC (pending | available).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you\n specify must exactly match the VPC's CIDR block for information to be returned\n for the VPC. Must contain the slash followed by one or two digits (for example,\n /28).

    \n
  • \n
  • \n

    \n cidr-block-association.cidr-block - An IPv4 CIDR block associated with the\n VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.association-id - The association ID for\n an IPv4 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.state - The state of an IPv4 CIDR block\n associated with the VPC.

    \n
  • \n
  • \n

    \n dhcp-options-id - The ID of a set of DHCP options.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-pool - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - The association\n ID for an IPv6 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n is-default - Indicates whether the VPC is the default VPC.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the VPC.

    \n
  • \n
  • \n

    \n state - The state of the VPC (pending | available).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, "VpcIds": { "target": "com.amazonaws.ec2#VpcIdStringList", "traits": { - "smithy.api#documentation": "

One or more VPC IDs.

\n

Default: Describes all your VPCs.

", + "smithy.api#documentation": "

The IDs of the VPCs.

\n

Default: Describes all your VPCs.

", "smithy.api#xmlName": "VpcId" } }, @@ -39515,7 +41178,7 @@ "target": "com.amazonaws.ec2#DetachClassicLinkVpcResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, the VPC security groups are no longer associated with it. An instance is automatically unlinked from a VPC when it's stopped.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, \n\t\t the VPC security groups are no longer associated with it. An instance is automatically unlinked from \n\t\t a VPC when it's stopped.

" } }, "com.amazonaws.ec2#DetachClassicLinkVpcRequest": { @@ -39759,7 +41422,23 @@ "target": "com.amazonaws.ec2#VolumeAttachment" }, "traits": { - "smithy.api#documentation": "

Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\n device within your operating system before detaching the volume. Failure to do so can result\n in the volume becoming stuck in the busy state while detaching. If this happens,\n detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\n the instance, or all three. If an EBS volume is the root device of an instance, it can't be\n detached while the instance is running. To detach the root volume, stop the instance\n first.

\n

When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\n product code is no longer associated with the instance.

\n

For more information, see Detach an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\n device within your operating system before detaching the volume. Failure to do so can result\n in the volume becoming stuck in the busy state while detaching. If this happens,\n detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\n the instance, or all three. If an EBS volume is the root device of an instance, it can't be\n detached while the instance is running. To detach the root volume, stop the instance\n first.

\n

When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\n product code is no longer associated with the instance.

\n

For more information, see Detach an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To detach a volume from an instance", + "documentation": "This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.", + "input": { + "VolumeId": "vol-1234567890abcdef0" + }, + "output": { + "AttachTime": "2014-02-27T19:23:06.000Z", + "InstanceId": "i-1234567890abcdef0", + "VolumeId": "vol-049df61146c4d7901", + "State": "detaching", + "Device": "/dev/sdb" + } + } + ] } }, "com.amazonaws.ec2#DetachVolumeRequest": { @@ -39920,7 +41599,7 @@ "target": "com.amazonaws.ec2#DhcpConfigurationValueList", "traits": { "aws.protocols#ec2QueryName": "ValueSet", - "smithy.api#documentation": "

One or more values for the DHCP option.

", + "smithy.api#documentation": "

The values for the DHCP option.

", "smithy.api#xmlName": "valueSet" } } @@ -39954,7 +41633,7 @@ "target": "com.amazonaws.ec2#DhcpConfigurationList", "traits": { "aws.protocols#ec2QueryName": "DhcpConfigurationSet", - "smithy.api#documentation": "

One or more DHCP options in the set.

", + "smithy.api#documentation": "

The DHCP options in the set.

", "smithy.api#xmlName": "dhcpConfigurationSet" } }, @@ -39984,7 +41663,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes a set of DHCP options.

" + "smithy.api#documentation": "

The set of DHCP options.

" } }, "com.amazonaws.ec2#DhcpOptionsId": { @@ -40824,7 +42503,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disables a virtual private gateway (VGW) from propagating routes to a specified route\n table of a VPC.

" + "smithy.api#documentation": "

Disables a virtual private gateway (VGW) from propagating routes to a specified route\n table of a VPC.

", + "smithy.api#examples": [ + { + "title": "To disable route propagation", + "documentation": "This example disables the specified virtual private gateway from propagating static routes to the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#DisableVgwRoutePropagationRequest": { @@ -40869,7 +42558,7 @@ "target": "com.amazonaws.ec2#DisableVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "

Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances linked to it.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances\n linked to it.

" } }, "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupport": { @@ -40881,7 +42570,7 @@ "target": "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "

Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\n\t\t\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\n\t\t\tin the VPC to which it's linked. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

\n

You must specify a VPC ID in the request.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\n\t\t\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\n\t\t\tin the VPC to which it's linked.

\n

You must specify a VPC ID in the request.

" } }, "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportRequest": { @@ -40972,7 +42661,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates an Elastic IP address from the instance or network interface it's associated with.

\n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.

" + "smithy.api#documentation": "

Disassociates an Elastic IP address from the instance or network interface it's associated with.

\n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.

", + "smithy.api#examples": [ + { + "title": "To disassociate an Elastic IP address", + "documentation": "This example disassociates an Elastic IP address from an instance.", + "input": { + "AssociationId": "eipassoc-2bebb745" + } + } + ] } }, "com.amazonaws.ec2#DisassociateAddressRequest": { @@ -41144,7 +42842,27 @@ "target": "com.amazonaws.ec2#DisassociateIamInstanceProfileResult" }, "traits": { - "smithy.api#documentation": "

Disassociates an IAM instance profile from a running or stopped instance.

\n

Use DescribeIamInstanceProfileAssociations to get the association\n ID.

" + "smithy.api#documentation": "

Disassociates an IAM instance profile from a running or stopped instance.

\n

Use DescribeIamInstanceProfileAssociations to get the association\n ID.

", + "smithy.api#examples": [ + { + "title": "To disassociate an IAM instance profile", + "documentation": "This example disassociates the specified IAM instance profile from an instance.", + "input": { + "AssociationId": "iip-assoc-05020b59952902f5f" + }, + "output": { + "IamInstanceProfileAssociation": { + "InstanceId": "i-123456789abcde123", + "State": "disassociating", + "AssociationId": "iip-assoc-05020b59952902f5f", + "IamInstanceProfile": { + "Id": "AIPAI5IVIHMFFYY2DKV5Y", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#DisassociateIamInstanceProfileRequest": { @@ -41300,7 +43018,7 @@ "target": "com.amazonaws.ec2#DisassociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. You cannot disassociate your primary EIP. For more information, see Edit secondary IP address associations in the Amazon Virtual Private Cloud User Guide.

\n

While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

An EIP will only be released at the end of MaxDrainDurationSeconds. The EIPs stay\n associated and support the existing connections but do not support any new connections\n (new connections are distributed across the remaining associated EIPs). As the existing\n connections drain out, the EIPs (and the corresponding private IPs mapped to them) get\n released.

" + "smithy.api#documentation": "

Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. \n You cannot disassociate your primary EIP. For more information, see Edit secondary IP address associations in the Amazon VPC User Guide.

\n

While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

An EIP is released only at the end of MaxDrainDurationSeconds. It stays\n associated and supports the existing connections but does not support any new connections\n (new connections are distributed across the remaining associated EIPs). As the existing\n connections drain out, the EIPs (and the corresponding private IP addresses mapped to them) \n are released.

" } }, "com.amazonaws.ec2#DisassociateNatGatewayAddressRequest": { @@ -41310,7 +43028,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -41351,7 +43069,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -41377,7 +43095,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#DisassociateRouteTableRequest": { @@ -42309,7 +44027,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "OutpostArn", - "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored.

\n

This parameter is only supported on BlockDeviceMapping objects called by\n \n CreateImage.

", + "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored.

\n

This parameter is not supported when using CreateImage.

", "smithy.api#xmlName": "outpostArn" } }, @@ -44071,7 +45789,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Enables a virtual private gateway (VGW) to propagate routes to the specified route\n table of a VPC.

" + "smithy.api#documentation": "

Enables a virtual private gateway (VGW) to propagate routes to the specified route\n table of a VPC.

", + "smithy.api#examples": [ + { + "title": "To enable route propagation", + "documentation": "This example enables the specified virtual private gateway to propagate static routes to the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#EnableVgwRoutePropagationRequest": { @@ -44156,7 +45884,7 @@ "target": "com.amazonaws.ec2#EnableVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\n\t\t\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\n\t\t\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\n\t\t\taddress ranges within the 10.0.0.0/8 IP address range, excluding local\n\t\t\troutes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16 IP address\n\t\t\tranges. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\n\t\t\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\n\t\t\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\n\t\t\taddress ranges within the 10.0.0.0/8 IP address range, excluding local\n\t\t\troutes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16 IP address\n\t\t\tranges.

" } }, "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupport": { @@ -44168,7 +45896,7 @@ "target": "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\n\t\t\thostname of a linked EC2-Classic instance resolves to its private IP address when\n\t\t\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n\t\t\tof an instance in a VPC resolves to its private IP address when addressed from a linked\n\t\t\tEC2-Classic instance. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

\n

You must specify a VPC ID in the request.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\n\t\t\thostname of a linked EC2-Classic instance resolves to its private IP address when\n\t\t\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n\t\t\tof an instance in a VPC resolves to its private IP address when addressed from a linked\n\t\t\tEC2-Classic instance.

\n

You must specify a VPC ID in the request.

" } }, "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportRequest": { @@ -44465,7 +46193,7 @@ "min": 1, "max": 30 }, - "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*]+$" + "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*\\-]+$" } }, "com.amazonaws.ec2#ExcludedInstanceTypeSet": { @@ -46719,7 +48447,7 @@ "target": "com.amazonaws.ec2#ImageId", "traits": { "aws.protocols#ec2QueryName": "ImageId", - "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. The AMI ID must be specified here or in the launch template.

", + "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. This parameter is only\n available for fleets of type instant. For fleets of type maintain\n and request, you must specify the AMI ID in the launch template.

", "smithy.api#xmlName": "imageId" } } @@ -46804,7 +48532,7 @@ "ImageId": { "target": "com.amazonaws.ec2#ImageId", "traits": { - "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. The AMI ID must be specified here or in the launch template.

" + "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. This parameter is only\n available for fleets of type instant. For fleets of type maintain\n and request, you must specify the AMI ID in the launch template.

" } } }, @@ -48163,7 +49891,21 @@ "target": "com.amazonaws.ec2#GetConsoleOutputResult" }, "traits": { - "smithy.api#documentation": "

Gets the console output for the specified instance. For Linux instances, the instance\n console output displays the exact console output that would normally be displayed on a\n physical monitor attached to a computer. For Windows instances, the instance console\n output includes the last three system event log errors.

\n

By default, the console output returns buffered information that was posted shortly\n after an instance transition state (start, stop, reboot, or terminate). This information\n is available for at least one hour after the most recent post. Only the most recent 64\n KB of console output is available.

\n

You can optionally retrieve the latest serial console output at any time during the\n instance lifecycle. This option is supported on instance types that use the Nitro\n hypervisor.

\n

For more information, see Instance\n console output in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Gets the console output for the specified instance. For Linux instances, the instance\n console output displays the exact console output that would normally be displayed on a\n physical monitor attached to a computer. For Windows instances, the instance console\n output includes the last three system event log errors.

\n

By default, the console output returns buffered information that was posted shortly\n after an instance transition state (start, stop, reboot, or terminate). This information\n is available for at least one hour after the most recent post. Only the most recent 64\n KB of console output is available.

\n

You can optionally retrieve the latest serial console output at any time during the\n instance lifecycle. This option is supported on instance types that use the Nitro\n hypervisor.

\n

For more information, see Instance\n console output in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To get the console output", + "documentation": "This example gets the console output for the specified instance.", + "input": { + "InstanceId": "i-1234567890abcdef0" + }, + "output": { + "InstanceId": "i-1234567890abcdef0", + "Output": "...", + "Timestamp": "2018-05-25T21:23:53.000Z" + } + } + ] } }, "com.amazonaws.ec2#GetConsoleOutputRequest": { @@ -48436,6 +50178,14 @@ "smithy.api#documentation": "

Indicates whether encryption by default is enabled.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -48451,7 +50201,7 @@ "target": "com.amazonaws.ec2#GetFlowLogsIntegrationTemplateResult" }, "traits": { - "smithy.api#documentation": "

Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \n with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \n Based on the information that you provide, we configure resources in the template to do the following:

\n
    \n
  • \n

    Create a table in Athena that maps fields to a custom log format

    \n
  • \n
  • \n

    Create a Lambda function that updates the table with new partitions on a daily, weekly, or\n monthly basis

    \n
  • \n
  • \n

    Create a table partitioned between two timestamps in the past

    \n
  • \n
  • \n

    Create a set of named queries in Athena that you can use to get started quickly

    \n
  • \n
" + "smithy.api#documentation": "

Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \n with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \n Based on the information that you provide, we configure resources in the template to do the following:

\n
    \n
  • \n

    Create a table in Athena that maps fields to a custom log format

    \n
  • \n
  • \n

    Create a Lambda function that updates the table with new partitions on a daily, weekly, or\n monthly basis

    \n
  • \n
  • \n

    Create a table partitioned between two timestamps in the past

    \n
  • \n
  • \n

    Create a set of named queries in Athena that you can use to get started quickly

    \n
  • \n
\n \n

\n GetFlowLogsIntegrationTemplate does not support integration between\n Amazon Web Services Transit Gateway Flow Logs and Amazon Athena.

\n
" } }, "com.amazonaws.ec2#GetFlowLogsIntegrationTemplateRequest": { @@ -49448,7 +51198,66 @@ "target": "com.amazonaws.ec2#GetLaunchTemplateDataResult" }, "traits": { - "smithy.api#documentation": "

Retrieves the configuration data of the specified instance. You can use this data to\n create a launch template.

\n

This action calls on other describe actions to get instance information. Depending on\n your instance configuration, you may need to allow the following actions in your IAM\n policy: DescribeSpotInstanceRequests,\n DescribeInstanceCreditSpecifications, DescribeVolumes,\n DescribeInstanceAttribute, and DescribeElasticGpus. Or,\n you can allow describe* depending on your instance requirements.

" + "smithy.api#documentation": "

Retrieves the configuration data of the specified instance. You can use this data to\n create a launch template.

\n

This action calls on other describe actions to get instance information. Depending on\n your instance configuration, you may need to allow the following actions in your IAM\n policy: DescribeSpotInstanceRequests,\n DescribeInstanceCreditSpecifications, DescribeVolumes,\n DescribeInstanceAttribute, and DescribeElasticGpus. Or,\n you can allow describe* depending on your instance requirements.

", + "smithy.api#examples": [ + { + "title": "To get the launch template data for an instance ", + "documentation": "This example gets the launch template data for the specified instance.", + "input": { + "InstanceId": "0123d646e8048babc" + }, + "output": { + "LaunchTemplateData": { + "NetworkInterfaces": [ + { + "DeviceIndex": 0, + "Groups": [ + "sg-d14e1bb4" + ], + "Ipv6Addresses": [], + "AssociatePublicIpAddress": false, + "NetworkInterfaceId": "eni-4338b5a9", + "DeleteOnTermination": true, + "Description": "", + "PrivateIpAddress": "10.0.3.233", + "SubnetId": "subnet-5264e837", + "PrivateIpAddresses": [ + { + "PrivateIpAddress": "10.0.3.233", + "Primary": true + } + ] + } + ], + "Placement": { + "GroupName": "", + "Tenancy": "default", + "AvailabilityZone": "us-east-2b" + }, + "InstanceType": "t2.medium", + "EbsOptimized": false, + "BlockDeviceMappings": [ + { + "Ebs": { + "VolumeType": "gp2", + "Encrypted": false, + "Iops": 100, + "VolumeSize": 8, + "SnapshotId": "snap-02594938353ef77d3", + "DeleteOnTermination": true + }, + "DeviceName": "/dev/xvda" + } + ], + "KeyName": "my-key-pair", + "ImageId": "ami-32cf7b4a", + "Monitoring": { + "Enabled": false + } + } + } + } + ] } }, "com.amazonaws.ec2#GetLaunchTemplateDataRequest": { @@ -51429,13 +53238,13 @@ "aws.protocols#ec2QueryName": "Configured", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If this parameter is set to true, your instance is enabled for\n hibernation; otherwise, it is not enabled for hibernation.

", + "smithy.api#documentation": "

If true, your instance is enabled for hibernation; otherwise, it is not\n enabled for hibernation.

", "smithy.api#xmlName": "configured" } } }, "traits": { - "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#HibernationOptionsRequest": { @@ -51446,12 +53255,12 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If you set this parameter to true, your instance is enabled for\n hibernation.

\n

Default: false\n

" + "smithy.api#documentation": "

Set to true to enable your instance for hibernation.

\n

Default: false\n

" } } }, "traits": { - "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#HistoryRecord": { @@ -51692,6 +53501,14 @@ "smithy.api#documentation": "

Indicates whether host maintenance is enabled or disabled for the Dedicated\n Host.

", "smithy.api#xmlName": "hostMaintenance" } + }, + "AssetId": { + "target": "com.amazonaws.ec2#AssetId", + "traits": { + "aws.protocols#ec2QueryName": "AssetId", + "smithy.api#documentation": "

The ID of the Outpost hardware asset on which the Dedicated Host is allocated.

", + "smithy.api#xmlName": "assetId" + } } }, "traits": { @@ -53250,7 +55067,7 @@ "KmsKeyId": { "target": "com.amazonaws.ec2#KmsKeyId", "traits": { - "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the AMI is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" + "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the AMI is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" } }, "LicenseType": { @@ -53262,7 +55079,7 @@ "Platform": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The operating system of the virtual machine.

\n

Valid values: Windows | Linux\n

" + "smithy.api#documentation": "

The operating system of the virtual machine. If you import a VM that is compatible with\n Unified Extensible Firmware Interface (UEFI) using an EBS snapshot, you must specify a value for\n the platform.

\n

Valid values: Windows | Linux\n

" } }, "RoleName": { @@ -53606,7 +55423,7 @@ "target": "com.amazonaws.ec2#ImportInstanceResult" }, "traits": { - "smithy.api#documentation": "

Creates an import instance task using metadata from the specified disk image.

\n

This API action supports only single-volume VMs. To import multi-volume VMs, use ImportImage\n instead.

\n

This API action is not supported by the Command Line Interface (CLI). For \n information about using the Amazon EC2 CLI, which is deprecated, see\n Importing a VM to Amazon EC2 in the Amazon EC2 CLI Reference PDF file.

\n

For information about the import manifest referenced by this API action, see VM Import Manifest.

" + "smithy.api#documentation": "\n

We recommend that you use the \n ImportImage\n \n API. For more information, see Importing a VM as an image using VM\n Import/Export in the VM Import/Export User Guide.

\n
\n

Creates an import instance task using metadata from the specified disk image.

\n

This API action is not supported by the Command Line Interface (CLI). For\n information about using the Amazon EC2 CLI, which is deprecated, see Importing\n a VM to Amazon EC2 in the Amazon EC2 CLI Reference PDF file.

\n

This API action supports only single-volume VMs. To import multi-volume VMs, use ImportImage\n instead.

\n

For information about the import manifest referenced by this API action, see VM Import Manifest.

" } }, "com.amazonaws.ec2#ImportInstanceLaunchSpecification": { @@ -54049,7 +55866,7 @@ "KmsKeyId": { "target": "com.amazonaws.ec2#KmsKeyId", "traits": { - "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the snapshot is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" + "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the snapshot is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" } }, "RoleName": { @@ -54327,6 +56144,14 @@ "smithy.api#documentation": "

Describes the Inference accelerators for the instance type.

", "smithy.api#xmlName": "accelerators" } + }, + "TotalInferenceMemoryInMiB": { + "target": "com.amazonaws.ec2#totalInferenceMemory", + "traits": { + "aws.protocols#ec2QueryName": "TotalInferenceMemoryInMiB", + "smithy.api#documentation": "

The total size of the memory for the inference accelerators for the instance type, in MiB.

", + "smithy.api#xmlName": "totalInferenceMemoryInMiB" + } } }, "traits": { @@ -54362,6 +56187,14 @@ "smithy.api#documentation": "

The manufacturer of the Inference accelerator.

", "smithy.api#xmlName": "manufacturer" } + }, + "MemoryInfo": { + "target": "com.amazonaws.ec2#InferenceDeviceMemoryInfo", + "traits": { + "aws.protocols#ec2QueryName": "MemoryInfo", + "smithy.api#documentation": "

Describes the memory available to the inference accelerator.

", + "smithy.api#xmlName": "memoryInfo" + } } }, "traits": { @@ -54377,6 +56210,25 @@ "com.amazonaws.ec2#InferenceDeviceManufacturerName": { "type": "string" }, + "com.amazonaws.ec2#InferenceDeviceMemoryInfo": { + "type": "structure", + "members": { + "SizeInMiB": { + "target": "com.amazonaws.ec2#InferenceDeviceMemorySize", + "traits": { + "aws.protocols#ec2QueryName": "SizeInMiB", + "smithy.api#documentation": "

The size of the memory available to the inference accelerator, in MiB.

", + "smithy.api#xmlName": "sizeInMiB" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the memory available to the inference accelerator.

" + } + }, + "com.amazonaws.ec2#InferenceDeviceMemorySize": { + "type": "integer" + }, "com.amazonaws.ec2#InferenceDeviceName": { "type": "string" }, @@ -55902,6 +57754,16 @@ "smithy.api#documentation": "

The IPv6 address.

", "smithy.api#xmlName": "ipv6Address" } + }, + "IsPrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IsPrimaryIpv6", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. \n For more information, see RunInstances.

", + "smithy.api#xmlName": "isPrimaryIpv6" + } } }, "traits": { @@ -56706,6 +58568,14 @@ "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 delegated prefixes to be automatically assigned to the network interface. \n You cannot use this option if you use the Ipv6Prefix option.

" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" + } } }, "traits": { @@ -56967,7 +58837,7 @@ } }, "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard or with the RunInstances API, you\n can't specify InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#InstanceRequirementsRequest": { @@ -57119,7 +58989,7 @@ "NetworkBandwidthGbps": { "target": "com.amazonaws.ec2#NetworkBandwidthGbpsRequest", "traits": { - "smithy.api#documentation": "

The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).

\n

Default: No minimum or maximum limits

" + "smithy.api#documentation": "

The minimum and maximum amount of baseline network bandwidth, in gigabits per second \n (Gbps). For more information, see Amazon EC2 instance network bandwidth in the Amazon EC2 User Guide.

\n

Default: No minimum or maximum limits

" } }, "AllowedInstanceTypes": { @@ -57131,7 +59001,7 @@ } }, "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard, or with the RunInstances API or\n AWS::EC2::Instance Amazon Web Services CloudFormation resource, you can't specify\n InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#InstanceRequirementsWithMetadataRequest": { @@ -61525,6 +63395,162 @@ "traits": { "smithy.api#enumValue": "i4g.16xlarge" } + }, + "hpc7g_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.4xlarge" + } + }, + "hpc7g_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.8xlarge" + } + }, + "hpc7g_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.16xlarge" + } + }, + "c7gn_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.medium" + } + }, + "c7gn_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.large" + } + }, + "c7gn_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.xlarge" + } + }, + "c7gn_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.2xlarge" + } + }, + "c7gn_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.4xlarge" + } + }, + "c7gn_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.8xlarge" + } + }, + "c7gn_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.12xlarge" + } + }, + "c7gn_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.16xlarge" + } + }, + "p5_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "p5.48xlarge" + } + }, + "m7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.large" + } + }, + "m7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.xlarge" + } + }, + "m7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.2xlarge" + } + }, + "m7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.4xlarge" + } + }, + "m7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.8xlarge" + } + }, + "m7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.12xlarge" + } + }, + "m7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.16xlarge" + } + }, + "m7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.24xlarge" + } + }, + "m7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.48xlarge" + } + }, + "m7i_flex_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.large" + } + }, + "m7i_flex_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.xlarge" + } + }, + "m7i_flex_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.2xlarge" + } + }, + "m7i_flex_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.4xlarge" + } + }, + "m7i_flex_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.8xlarge" + } } } }, @@ -61712,7 +63738,7 @@ "target": "com.amazonaws.ec2#BurstablePerformanceFlag", "traits": { "aws.protocols#ec2QueryName": "BurstablePerformanceSupported", - "smithy.api#documentation": "

Indicates whether the instance type is a burstable performance instance type.

", + "smithy.api#documentation": "

Indicates whether the instance type is a burstable performance T instance \n type. For more information, see Burstable \n performance instances.

", "smithy.api#xmlName": "burstablePerformanceSupported" } }, @@ -61739,6 +63765,30 @@ "smithy.api#documentation": "

The supported boot modes. For more information, see Boot modes in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "supportedBootModes" } + }, + "NitroEnclavesSupport": { + "target": "com.amazonaws.ec2#NitroEnclavesSupport", + "traits": { + "aws.protocols#ec2QueryName": "NitroEnclavesSupport", + "smithy.api#documentation": "

Indicates whether Nitro Enclaves is supported.

", + "smithy.api#xmlName": "nitroEnclavesSupport" + } + }, + "NitroTpmSupport": { + "target": "com.amazonaws.ec2#NitroTpmSupport", + "traits": { + "aws.protocols#ec2QueryName": "NitroTpmSupport", + "smithy.api#documentation": "

Indicates whether NitroTPM is supported.

", + "smithy.api#xmlName": "nitroTpmSupport" + } + }, + "NitroTpmInfo": { + "target": "com.amazonaws.ec2#NitroTpmInfo", + "traits": { + "aws.protocols#ec2QueryName": "NitroTpmInfo", + "smithy.api#documentation": "

Describes the supported NitroTPM versions for the instance type.

", + "smithy.api#xmlName": "nitroTpmInfo" + } } }, "traits": { @@ -62006,7 +64056,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes the attachment of a VPC to an internet gateway or an egress-only internet\n\t\t\tgateway.

" + "smithy.api#documentation": "

Describes the attachment of a VPC to an internet gateway or an egress-only internet gateway.

" } }, "com.amazonaws.ec2#InternetGatewayAttachmentList": { @@ -62107,7 +64157,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "IpProtocol", - "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp, icmpv6) \n or number (see Protocol Numbers).

\n

[VPC only] Use -1 to specify all protocols. When authorizing\n security group rules, specifying -1 or a protocol number other than\n tcp, udp, icmp, or icmpv6 allows\n traffic on all ports, regardless of any port range you specify. For tcp,\n udp, and icmp, you must specify a port range. For icmpv6,\n the port range is optional; if you omit the port range, traffic for all types and codes is allowed.

", + "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp, icmpv6) \n or number (see Protocol Numbers).

\n

Use -1 to specify all protocols. When authorizing\n security group rules, specifying -1 or a protocol number other than\n tcp, udp, icmp, or icmpv6 allows\n traffic on all ports, regardless of any port range you specify. For tcp,\n udp, and icmp, you must specify a port range. For icmpv6,\n the port range is optional; if you omit the port range, traffic for all types and codes is allowed.

", "smithy.api#xmlName": "ipProtocol" } }, @@ -62123,7 +64173,7 @@ "target": "com.amazonaws.ec2#Ipv6RangeList", "traits": { "aws.protocols#ec2QueryName": "Ipv6Ranges", - "smithy.api#documentation": "

[VPC only] The IPv6 ranges.

", + "smithy.api#documentation": "

The IPv6 ranges.

", "smithy.api#xmlName": "ipv6Ranges" } }, @@ -62131,7 +64181,7 @@ "target": "com.amazonaws.ec2#PrefixListIdList", "traits": { "aws.protocols#ec2QueryName": "PrefixListIds", - "smithy.api#documentation": "

[VPC only] The prefix list IDs.

", + "smithy.api#documentation": "

The prefix list IDs.

", "smithy.api#xmlName": "prefixListIds" } }, @@ -64598,7 +66648,7 @@ } }, "traits": { - "smithy.api#documentation": "

[EC2-VPC only] Describes an IPv6 range.

" + "smithy.api#documentation": "

Describes an IPv6 range.

" } }, "com.amazonaws.ec2#Ipv6RangeList": { @@ -65293,7 +67343,7 @@ "target": "com.amazonaws.ec2#FleetLaunchTemplateSpecification", "traits": { "aws.protocols#ec2QueryName": "LaunchTemplateSpecification", - "smithy.api#documentation": "

The launch template.

", + "smithy.api#documentation": "

The launch template to use. Make sure that the launch template does not contain the\n NetworkInterfaceId parameter because you can't specify a network interface\n ID in a Spot Fleet.

", "smithy.api#xmlName": "launchTemplateSpecification" } }, @@ -65346,7 +67396,7 @@ "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { "aws.protocols#ec2QueryName": "AmdSevSnp", - "smithy.api#documentation": "

Indicates whether the instance is enabled for \n AMD SEV-SNP.

", + "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "amdSevSnp" } } @@ -65377,7 +67427,7 @@ "AmdSevSnp": { "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { - "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only.

" + "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only. For more information, see \n AMD SEV-SNP.

" } } }, @@ -66204,6 +68254,16 @@ "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigned to the network\n interface.

", "smithy.api#xmlName": "ipv6PrefixCount" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "PrimaryIpv6", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

", + "smithy.api#xmlName": "primaryIpv6" + } } }, "traits": { @@ -66356,6 +68416,14 @@ "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes to be automatically assigned to the network interface. You\n cannot use this option if you use the Ipv6Prefix option.

" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" + } } }, "traits": { @@ -69538,7 +71606,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified AMI. You can specify only one attribute at a time.

\n

To specify the attribute, you can use the Attribute parameter, or one of the following parameters: \n Description, ImdsSupport, or LaunchPermission.

\n

Images with an Amazon Web Services Marketplace product code cannot be made public.

\n

To enable the SriovNetSupport enhanced networking attribute of an image, enable SriovNetSupport on an instance \n and create an AMI from the instance.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified AMI. You can specify only one attribute at a time.

\n

To specify the attribute, you can use the Attribute parameter, or one of the following parameters: \n Description, ImdsSupport, or LaunchPermission.

\n

Images with an Amazon Web Services Marketplace product code cannot be made public.

\n

To enable the SriovNetSupport enhanced networking attribute of an image, enable SriovNetSupport on an instance \n and create an AMI from the instance.

", + "smithy.api#examples": [ + { + "title": "To make an AMI public", + "documentation": "This example makes the specified AMI public.", + "input": { + "ImageId": "ami-5731123e", + "LaunchPermission": { + "Add": [ + { + "Group": "all" + } + ] + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyImageAttributeRequest": { @@ -70182,7 +72267,7 @@ "HttpProtocolIpv6": { "target": "com.amazonaws.ec2#InstanceMetadataProtocolState", "traits": { - "smithy.api#documentation": "

Enables or disables the IPv6 endpoint for the instance metadata service. This setting\n applies only if you have enabled the HTTP metadata endpoint.

" + "smithy.api#documentation": "

Enables or disables the IPv6 endpoint for the instance metadata service. \n Applies only if you enabled the HTTP metadata endpoint.

" } }, "InstanceMetadataTags": { @@ -70271,7 +72356,7 @@ "target": "com.amazonaws.ec2#HostTenancy", "traits": { "aws.protocols#ec2QueryName": "Tenancy", - "smithy.api#documentation": "

The tenancy for the instance.

\n \n

For T3 instances, you can't change the tenancy from dedicated to\n host, or from host to dedicated.\n Attempting to make one of these unsupported tenancy changes results in the\n InvalidTenancy error code.

\n
", + "smithy.api#documentation": "

The tenancy for the instance.

\n \n

For T3 instances, you must launch the instance on a Dedicated Host to use a\n tenancy of host. You can't change the tenancy from\n host to dedicated or default.\n Attempting to make one of these unsupported tenancy changes results in an\n InvalidRequest error code.

\n
", "smithy.api#xmlName": "tenancy" } }, @@ -70286,7 +72371,7 @@ "HostResourceGroupArn": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The ARN of the host resource group in which to place the instance.

" + "smithy.api#documentation": "

The ARN of the host resource group in which to place the instance. The instance must\n have a tenancy of host to specify this parameter.

" } }, "GroupId": { @@ -70732,7 +72817,27 @@ "target": "com.amazonaws.ec2#ModifyLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Modifies a launch template. You can specify which version of the launch template to\n set as the default version. When launching an instance, the default version applies when\n a launch template version is not specified.

" + "smithy.api#documentation": "

Modifies a launch template. You can specify which version of the launch template to\n set as the default version. When launching an instance, the default version applies when\n a launch template version is not specified.

", + "smithy.api#examples": [ + { + "title": "To change the default version of a launch template", + "documentation": "This example specifies version 2 as the default version of the specified launch template.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "DefaultVersion": "2" + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 2, + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "WebServers", + "DefaultVersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-12-01T13:35:46.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#ModifyLaunchTemplateRequest": { @@ -71027,6 +73132,14 @@ "traits": { "smithy.api#documentation": "

Updates the ENA Express configuration for the network interface that’s attached to the\n\t\t\tinstance.

" } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

If you’re modifying a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use\n this option if the instance that this ENI will be attached to relies on its IPv6 address\n not changing. Amazon Web Services will automatically assign an IPv6 address associated\n with the ENI attached to your instance to be the primary IPv6 address. Once you enable\n an IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" + } } }, "traits": { @@ -71246,7 +73359,22 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Adds or removes permission settings for the specified snapshot. You may add or remove\n specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\n do both in a single operation. If you need to both add and remove account IDs for a snapshot,\n you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.

\n

Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\n public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Adds or removes permission settings for the specified snapshot. You may add or remove\n specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\n do both in a single operation. If you need to both add and remove account IDs for a snapshot,\n you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.

\n

Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\n public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To modify a snapshot attribute", + "documentation": "This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0", + "Attribute": "createVolumePermission", + "OperationType": "remove", + "UserIds": [ + "123456789012" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifySnapshotAttributeRequest": { @@ -71471,7 +73599,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies a subnet attribute. You can only modify one attribute at a time.

\n

Use this action to modify subnets on Amazon Web Services Outposts.

\n
    \n
  • \n

    To modify a subnet on an Outpost rack, set both\n MapCustomerOwnedIpOnLaunch and\n CustomerOwnedIpv4Pool. These two parameters act as a single\n attribute.

    \n
  • \n
  • \n

    To modify a subnet on an Outpost server, set either\n EnableLniAtDeviceIndex or\n DisableLniAtDeviceIndex.

    \n
  • \n
\n

For more information about Amazon Web Services Outposts, see the following:

\n " + "smithy.api#documentation": "

Modifies a subnet attribute. You can only modify one attribute at a time.

\n

Use this action to modify subnets on Amazon Web Services Outposts.

\n
    \n
  • \n

    To modify a subnet on an Outpost rack, set both\n MapCustomerOwnedIpOnLaunch and\n CustomerOwnedIpv4Pool. These two parameters act as a single\n attribute.

    \n
  • \n
  • \n

    To modify a subnet on an Outpost server, set either\n EnableLniAtDeviceIndex or\n DisableLniAtDeviceIndex.

    \n
  • \n
\n

For more information about Amazon Web Services Outposts, see the following:

\n ", + "smithy.api#examples": [ + { + "title": "To change a subnet's public IP addressing behavior", + "documentation": "This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.", + "input": { + "SubnetId": "subnet-1a2b3c4d", + "MapPublicIpOnLaunch": { + "Value": true + } + } + } + ] } }, "com.amazonaws.ec2#ModifySubnetAttributeRequest": { @@ -71777,7 +73917,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

" + "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

\n

For sessions with Network Load Balancer (NLB) traffic mirror targets, the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { @@ -72798,7 +74938,21 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies a volume attribute.

\n

By default, all I/O operations for the volume are suspended when the data on the volume is\n determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\n The I/O access to the volume can be resumed by first enabling I/O access and then checking the\n data consistency on your volume.

\n

You can change the default behavior to resume I/O operations. We recommend that you change\n this only for boot volumes or for volumes that are stateless or disposable.

" + "smithy.api#documentation": "

Modifies a volume attribute.

\n

By default, all I/O operations for the volume are suspended when the data on the volume is\n determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\n The I/O access to the volume can be resumed by first enabling I/O access and then checking the\n data consistency on your volume.

\n

You can change the default behavior to resume I/O operations. We recommend that you change\n this only for boot volumes or for volumes that are stateless or disposable.

", + "smithy.api#examples": [ + { + "title": "To modify a volume attribute", + "documentation": "This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.", + "input": { + "DryRun": true, + "VolumeId": "vol-1234567890abcdef0", + "AutoEnableIO": { + "Value": true + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyVolumeAttributeRequest": { @@ -72920,7 +75074,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified VPC.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified VPC.

", + "smithy.api#examples": [ + { + "title": "To modify the enableDnsSupport attribute", + "documentation": "This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.", + "input": { + "VpcId": "vpc-a01106c2", + "EnableDnsSupport": { + "Value": false + } + } + } + ] } }, "com.amazonaws.ec2#ModifyVpcAttributeRequest": { @@ -73418,7 +75584,7 @@ "target": "com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Modifies the VPC peering connection options on one side of a VPC peering connection. You can do the following:

\n
    \n
  • \n

    Enable/disable communication over the peering connection between an EC2-Classic instance that's linked to your VPC (using ClassicLink) and instances in the peer VPC.

    \n
  • \n
  • \n

    Enable/disable communication over the peering connection between instances in your VPC and an EC2-Classic instance that's linked to the peer VPC.

    \n
  • \n
  • \n

    Enable/disable the ability to resolve public DNS hostnames to private IP\n addresses when queried from instances in the peer VPC.

    \n
  • \n
\n

If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\n resolution for queries from the local VPC. This ensures that queries from the local VPC\n resolve to private IP addresses in the peer VPC. This option is not available if the\n peered VPCs are in different Amazon Web Services accounts or different Regions. For\n peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\n owner must initiate a separate request to modify the peering connection options. For\n inter-region peering connections, you must use the Region for the requester VPC to\n modify the requester VPC peering options and the Region for the accepter VPC to modify\n the accepter VPC peering options. To verify which VPCs are the accepter and the\n requester for a VPC peering connection, use the DescribeVpcPeeringConnections command.

" + "smithy.api#documentation": "

Modifies the VPC peering connection options on one side of a VPC peering connection.

\n

If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\n resolution for queries from the local VPC. This ensures that queries from the local VPC\n resolve to private IP addresses in the peer VPC. This option is not available if the\n peered VPCs are in different Amazon Web Services accounts or different Regions. For\n peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\n owner must initiate a separate request to modify the peering connection options. For\n inter-region peering connections, you must use the Region for the requester VPC to\n modify the requester VPC peering options and the Region for the accepter VPC to modify\n the accepter VPC peering options. To verify which VPCs are the accepter and the\n requester for a VPC peering connection, use the DescribeVpcPeeringConnections command.

" } }, "com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsRequest": { @@ -73490,7 +75656,7 @@ "target": "com.amazonaws.ec2#ModifyVpcTenancyResult" }, "traits": { - "smithy.api#documentation": "

Modifies the instance tenancy attribute of the specified VPC. You can change the\n instance tenancy attribute of a VPC to default only. You cannot change the\n instance tenancy attribute to dedicated.

\n

After you modify the tenancy of the VPC, any new instances that you launch into the\n VPC have a tenancy of default, unless you specify otherwise during launch.\n The tenancy of any existing instances in the VPC is not affected.

\n

For more information, see Dedicated Instances in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Modifies the instance tenancy attribute of the specified VPC. You can change the\n instance tenancy attribute of a VPC to default only. You cannot change the\n instance tenancy attribute to dedicated.

\n

After you modify the tenancy of the VPC, any new instances that you launch into the\n VPC have a tenancy of default, unless you specify otherwise during launch.\n The tenancy of any existing instances in the VPC is not affected.

\n

For more information, see Dedicated Instances in the\n\t\t\t\tAmazon EC2 User Guide.

" } }, "com.amazonaws.ec2#ModifyVpcTenancyRequest": { @@ -73841,7 +76007,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and the customer gateway.

\n

Constraints: Allowed characters are alphanumeric characters, periods (.), and\n underscores (_). Must be between 8 and 64 characters in length and cannot start with\n zero (0).

" } @@ -73971,7 +76137,8 @@ } }, "traits": { - "smithy.api#documentation": "

The Amazon Web Services Site-to-Site VPN tunnel options to modify.

" + "smithy.api#documentation": "

The Amazon Web Services Site-to-Site VPN tunnel options to modify.

", + "smithy.api#sensitive": {} } }, "com.amazonaws.ec2#MonitorInstances": { @@ -74575,7 +76742,7 @@ "target": "com.amazonaws.ec2#NetworkAclEntryList", "traits": { "aws.protocols#ec2QueryName": "EntrySet", - "smithy.api#documentation": "

One or more entries (rules) in the network ACL.

", + "smithy.api#documentation": "

The entries (rules) in the network ACL.

", "smithy.api#xmlName": "entrySet" } }, @@ -74857,6 +77024,22 @@ "smithy.api#documentation": "

The maximum number of network interfaces for the network card.

", "smithy.api#xmlName": "maximumNetworkInterfaces" } + }, + "BaselineBandwidthInGbps": { + "target": "com.amazonaws.ec2#BaselineBandwidthInGbps", + "traits": { + "aws.protocols#ec2QueryName": "BaselineBandwidthInGbps", + "smithy.api#documentation": "

The baseline network performance of the network card, in Gbps.

", + "smithy.api#xmlName": "baselineBandwidthInGbps" + } + }, + "PeakBandwidthInGbps": { + "target": "com.amazonaws.ec2#PeakBandwidthInGbps", + "traits": { + "aws.protocols#ec2QueryName": "PeakBandwidthInGbps", + "smithy.api#documentation": "

The peak (burst) network performance of the network card, in Gbps.

", + "smithy.api#xmlName": "peakBandwidthInGbps" + } } }, "traits": { @@ -76057,6 +78240,16 @@ "smithy.api#documentation": "

The IPv6 address.

", "smithy.api#xmlName": "ipv6Address" } + }, + "IsPrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IsPrimaryIpv6", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information, see ModifyNetworkInterfaceAttribute.

", + "smithy.api#xmlName": "isPrimaryIpv6" + } } }, "traits": { @@ -76418,7 +78611,7 @@ "Values": { "target": "com.amazonaws.ec2#ValueStringList", "traits": { - "smithy.api#documentation": "

One or more values for the DHCP option.

", + "smithy.api#documentation": "

The values for the DHCP option.

", "smithy.api#xmlName": "Value" } } @@ -76439,6 +78632,68 @@ "com.amazonaws.ec2#NextToken": { "type": "string" }, + "com.amazonaws.ec2#NitroEnclavesSupport": { + "type": "enum", + "members": { + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "SUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "supported" + } + } + } + }, + "com.amazonaws.ec2#NitroTpmInfo": { + "type": "structure", + "members": { + "SupportedVersions": { + "target": "com.amazonaws.ec2#NitroTpmSupportedVersionsList", + "traits": { + "aws.protocols#ec2QueryName": "SupportedVersions", + "smithy.api#documentation": "

Indicates the supported NitroTPM versions.

", + "smithy.api#xmlName": "supportedVersions" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the supported NitroTPM versions for the instance type.

" + } + }, + "com.amazonaws.ec2#NitroTpmSupport": { + "type": "enum", + "members": { + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "SUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "supported" + } + } + } + }, + "com.amazonaws.ec2#NitroTpmSupportedVersionType": { + "type": "string" + }, + "com.amazonaws.ec2#NitroTpmSupportedVersionsList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#NitroTpmSupportedVersionType", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#OccurrenceDayRequestSet": { "type": "list", "member": { @@ -77272,6 +79527,9 @@ "smithy.api#documentation": "

Describes the data that identifies an Amazon FPGA image (AFI) on the PCI bus.

" } }, + "com.amazonaws.ec2#PeakBandwidthInGbps": { + "type": "double" + }, "com.amazonaws.ec2#PeeringAttachmentStatus": { "type": "structure", "members": { @@ -77315,7 +79573,7 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from an EC2-Classic instance that's linked to\n a local VPC using ClassicLink to instances in a peer VPC.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } }, @@ -77325,13 +79583,13 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from instances in a local VPC to an\n EC2-Classic instance that's linked to a peer VPC using ClassicLink.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the VPC peering connection options.

" + "smithy.api#documentation": "

Describes the VPC peering connection options.

" } }, "com.amazonaws.ec2#PeeringConnectionOptionsRequest": { @@ -77342,7 +79600,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses when queried from instances in the peer VPC.

" + "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses \n when queried from instances in the peer VPC.

" } }, "AllowEgressFromLocalClassicLinkToRemoteVpc": { @@ -77350,7 +79608,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from an EC2-Classic instance that's linked to\n a local VPC using ClassicLink to instances in a peer VPC.

" + "smithy.api#documentation": "

Deprecated.

" } }, "AllowEgressFromLocalVpcToRemoteClassicLink": { @@ -77358,12 +79616,12 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from instances in a local VPC to an\n EC2-Classic instance that's linked to a peer VPC using ClassicLink.

" + "smithy.api#documentation": "

Deprecated.

" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

The VPC peering connection options.

" + "smithy.api#documentation": "

The VPC peering connection options.

" } }, "com.amazonaws.ec2#PeeringTgwInfo": { @@ -77913,7 +80171,7 @@ "com.amazonaws.ec2#PlacementGroupArn": { "type": "string", "traits": { - "smithy.api#pattern": "^arn:aws([a-z-]+)?:ec2:[a-z\\d-]+:\\d{12}:placement-group/([^\\s].+[^\\s]){1,255}$" + "smithy.api#pattern": "^arn:aws([a-z-]+)?:ec2:[a-z\\d-]+:\\d{12}:placement-group/^.{1,255}$" } }, "com.amazonaws.ec2#PlacementGroupId": { @@ -78877,7 +81135,7 @@ "target": "com.amazonaws.ec2#SupportedAdditionalProcessorFeatureList", "traits": { "aws.protocols#ec2QueryName": "SupportedFeatures", - "smithy.api#documentation": "

Indicates whether the instance type supports AMD SEV-SNP. If the request returns \n amd-sev-snp, AMD SEV-SNP is supported. Otherwise, it is not supported.

", + "smithy.api#documentation": "

Indicates whether the instance type supports AMD SEV-SNP. If the request returns \n amd-sev-snp, AMD SEV-SNP is supported. Otherwise, it is not supported. \n For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "supportedFeatures" } } @@ -79940,7 +82198,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Requests a reboot of the specified instances. This operation is asynchronous; it only\n queues a request to reboot the specified instances. The operation succeeds if the\n instances are valid and belong to you. Requests to reboot terminated instances are\n ignored.

\n

If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\n hard reboot.

\n

For more information about troubleshooting, see Troubleshoot an unreachable\n instance in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Requests a reboot of the specified instances. This operation is asynchronous; it only\n queues a request to reboot the specified instances. The operation succeeds if the\n instances are valid and belong to you. Requests to reboot terminated instances are\n ignored.

\n

If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\n hard reboot.

\n

For more information about troubleshooting, see Troubleshoot an unreachable\n instance in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To reboot an EC2 instance", + "documentation": "This example reboots the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef5" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#RebootInstancesRequest": { @@ -80795,7 +83065,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Releases the specified Elastic IP address.

\n

[Default VPC] Releasing an Elastic IP address automatically disassociates it\n\t\t\t\tfrom any instance that it's associated with. To disassociate an Elastic IP address without\n\t\t\t\treleasing it, use DisassociateAddress.

\n

[Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic IP address\n\t\t\t before you can release it. Otherwise, Amazon EC2 returns an error (InvalidIPAddress.InUse).

\n

After releasing an Elastic IP address, it is released to the IP address pool. \n Be sure to update your DNS records and any servers or devices that communicate with the address. \n If you attempt to release an Elastic IP address that you already released, you'll get an\n AuthFailure error if the address is already allocated to another Amazon Web Services account.

\n

After you release an Elastic IP address, you might be able to recover it.\n For more information, see AllocateAddress.

" + "smithy.api#documentation": "

Releases the specified Elastic IP address.

\n

[Default VPC] Releasing an Elastic IP address automatically disassociates it\n\t\t\t\tfrom any instance that it's associated with. To disassociate an Elastic IP address without\n\t\t\t\treleasing it, use DisassociateAddress.

\n

[Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic IP address\n\t\t\t before you can release it. Otherwise, Amazon EC2 returns an error (InvalidIPAddress.InUse).

\n

After releasing an Elastic IP address, it is released to the IP address pool. \n Be sure to update your DNS records and any servers or devices that communicate with the address. \n If you attempt to release an Elastic IP address that you already released, you'll get an\n AuthFailure error if the address is already allocated to another Amazon Web Services account.

\n

After you release an Elastic IP address, you might be able to recover it.\n For more information, see AllocateAddress.

", + "smithy.api#examples": [ + { + "title": "To release an Elastic IP address", + "documentation": "This example releases the specified Elastic IP address.", + "input": { + "AllocationId": "eipalloc-64d5890a" + } + } + ] } }, "com.amazonaws.ec2#ReleaseAddressRequest": { @@ -80897,7 +83176,7 @@ "target": "com.amazonaws.ec2#ReleaseIpamPoolAllocationResult" }, "traits": { - "smithy.api#documentation": "

Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using ModifyIpamResourceCidr. For more information, see Release an allocation in the Amazon VPC IPAM User Guide.\n

\n \n

All EC2 API actions follow an eventual consistency model.

\n
" + "smithy.api#documentation": "

Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using ModifyIpamResourceCidr. For more information, see Release an allocation in the Amazon VPC IPAM User Guide.\n

\n \n

All EC2 API actions follow an eventual consistency model.

\n
" } }, "com.amazonaws.ec2#ReleaseIpamPoolAllocationRequest": { @@ -81073,7 +83352,7 @@ "target": "com.amazonaws.ec2#ReplaceNetworkAclAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network\n\t\t\tACLs in the Amazon Virtual Private Cloud User Guide.

\n

This is an idempotent operation.

" + "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network ACLs in the Amazon VPC User Guide.

\n

This is an idempotent operation.

" } }, "com.amazonaws.ec2#ReplaceNetworkAclAssociationRequest": { @@ -81139,7 +83418,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

" } }, "com.amazonaws.ec2#ReplaceNetworkAclEntryRequest": { @@ -81396,7 +83675,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#ReplaceRouteRequest": { @@ -81544,7 +83823,7 @@ "target": "com.amazonaws.ec2#ReplaceRouteTableAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon Virtual Private Cloud User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

" + "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon VPC User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

" } }, "com.amazonaws.ec2#ReplaceRouteTableAssociationRequest": { @@ -82193,7 +84472,7 @@ "InstanceRequirements": { "target": "com.amazonaws.ec2#InstanceRequirementsRequest", "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

If you specify InstanceRequirements, you can't specify\n InstanceType.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard, or with the RunInstances API or\n AWS::EC2::Instance Amazon Web Services CloudFormation resource, you can't specify InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "PrivateDnsNameOptions": { @@ -82288,7 +84567,32 @@ "target": "com.amazonaws.ec2#RequestSpotInstancesResult" }, "traits": { - "smithy.api#documentation": "

Creates a Spot Instance request.

\n

For more information, see Spot Instance requests in\n the Amazon EC2 User Guide for Linux Instances.

\n \n

We strongly discourage using the RequestSpotInstances API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide for Linux Instances.

\n
" + "smithy.api#documentation": "

Creates a Spot Instance request.

\n

For more information, see Spot Instance requests in\n the Amazon EC2 User Guide for Linux Instances.

\n \n

We strongly discourage using the RequestSpotInstances API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide for Linux Instances.

\n
", + "smithy.api#examples": [ + { + "title": "To create a one-time Spot Instance request", + "documentation": "This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone.", + "input": { + "SpotPrice": "0.03", + "InstanceCount": 5, + "Type": "one-time", + "LaunchSpecification": { + "ImageId": "ami-1a2b3c4d", + "KeyName": "my-key-pair", + "SecurityGroupIds": [ + "sg-1a2b3c4d" + ], + "InstanceType": "m3.medium", + "Placement": { + "AvailabilityZone": "us-west-2a" + }, + "IamInstanceProfile": { + "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#RequestSpotInstancesRequest": { @@ -83697,7 +86001,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets an attribute of an AMI to its default value.

" + "smithy.api#documentation": "

Resets an attribute of an AMI to its default value.

", + "smithy.api#examples": [ + { + "title": "To reset the launchPermission attribute", + "documentation": "This example resets the launchPermission attribute for the specified AMI. By default, AMIs are private.", + "input": { + "Attribute": "launchPermission", + "ImageId": "ami-5731123e" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetImageAttributeName": { @@ -83854,7 +86169,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets permission settings for the specified snapshot.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Resets permission settings for the specified snapshot.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To reset a snapshot attribute", + "documentation": "This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0", + "Attribute": "createVolumePermission" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetSnapshotAttributeRequest": { @@ -85102,6 +87428,14 @@ "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -85298,7 +87632,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Removes the specified outbound (egress) rules from a security group for EC2-VPC.\n This action does not apply to security groups for use in EC2-Classic.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

[Default VPC] If the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, \n a small delay might occur.

" + "smithy.api#documentation": "

Removes the specified outbound (egress) rules from the specified security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, \n a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupEgressRequest": { @@ -85431,7 +87765,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

[EC2-Classic, default VPC] If the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, a small delay might occur.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupIngressRequest": { @@ -85454,13 +87788,13 @@ "GroupId": { "target": "com.amazonaws.ec2#SecurityGroupId", "traits": { - "smithy.api#documentation": "

The ID of the security group. You must specify either the security group ID or the\n security group name in the request. For security groups in a nondefault VPC, you must\n specify the security group ID.

" + "smithy.api#documentation": "

The ID of the security group.

" } }, "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -85478,13 +87812,13 @@ "SourceSecurityGroupName": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the source security group. You can't specify this parameter in combination with the following parameters: the CIDR IP address range, the start of the port range, the IP protocol, and the end of the port range. For EC2-VPC, the source security group must be in the same VPC. To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

[Default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. The source security group must be in the same VPC. \n To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" } }, "SourceSecurityGroupOwnerId": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic] The Amazon Web Services account ID of the source security group, if the source security group is in a different account. You can't specify this parameter in combination with the following parameters: the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

Not supported.

" } }, "ToPort": { @@ -86099,7 +88433,44 @@ "target": "com.amazonaws.ec2#Reservation" }, "traits": { - "smithy.api#documentation": "

Launches the specified number of instances using an AMI for which you have\n permissions.

\n

You can specify a number of options, or leave the default options. The following rules\n apply:

\n
    \n
  • \n

    If you don't specify a subnet ID, we choose a default subnet from\n your default VPC for you. If you don't have a default VPC, you must specify a\n subnet ID in the request.

    \n
  • \n
  • \n

    All instances have a network interface with a primary private IPv4\n address. If you don't specify this address, we choose one from the IPv4 range of\n your subnet.

    \n
  • \n
  • \n

    Not all instance types support IPv6 addresses. For more information, see\n Instance\n types.

    \n
  • \n
  • \n

    If you don't specify a security group ID, we use the default security group.\n For more information, see Security\n groups.

    \n
  • \n
  • \n

    If any of the AMIs have a product code attached for which the user has not\n subscribed, the request fails.

    \n
  • \n
\n

You can create a launch template,\n which is a resource that contains the parameters to launch an instance. When you launch\n an instance using RunInstances, you can specify the launch template\n instead of specifying the launch parameters.

\n

To ensure faster instance launches, break up large requests into smaller batches. For\n example, create five separate launch requests for 100 instances each instead of one\n launch request for 500 instances.

\n

An instance is ready for you to use when it's in the running state. You\n can check the state of your instance using DescribeInstances. You can\n tag instances and EBS volumes during launch, after launch, or both. For more\n information, see CreateTags and Tagging your Amazon EC2\n resources.

\n

Linux instances have access to the public key of the key pair at boot. You can use\n this key to provide secure access to the instance. Amazon EC2 public images use this\n feature to provide secure access without passwords. For more information, see Key\n pairs.

\n

For troubleshooting, see What to do if\n an instance immediately terminates, and Troubleshooting connecting to your instance.

" + "smithy.api#documentation": "

Launches the specified number of instances using an AMI for which you have\n permissions.

\n

You can specify a number of options, or leave the default options. The following rules\n apply:

\n
    \n
  • \n

    If you don't specify a subnet ID, we choose a default subnet from\n your default VPC for you. If you don't have a default VPC, you must specify a\n subnet ID in the request.

    \n
  • \n
  • \n

    All instances have a network interface with a primary private IPv4\n address. If you don't specify this address, we choose one from the IPv4 range of\n your subnet.

    \n
  • \n
  • \n

    Not all instance types support IPv6 addresses. For more information, see\n Instance\n types.

    \n
  • \n
  • \n

    If you don't specify a security group ID, we use the default security group.\n For more information, see Security\n groups.

    \n
  • \n
  • \n

    If any of the AMIs have a product code attached for which the user has not\n subscribed, the request fails.

    \n
  • \n
\n

You can create a launch template,\n which is a resource that contains the parameters to launch an instance. When you launch\n an instance using RunInstances, you can specify the launch template\n instead of specifying the launch parameters.

\n

To ensure faster instance launches, break up large requests into smaller batches. For\n example, create five separate launch requests for 100 instances each instead of one\n launch request for 500 instances.

\n

An instance is ready for you to use when it's in the running state. You\n can check the state of your instance using DescribeInstances. You can\n tag instances and EBS volumes during launch, after launch, or both. For more\n information, see CreateTags and Tagging your Amazon EC2\n resources.

\n

Linux instances have access to the public key of the key pair at boot. You can use\n this key to provide secure access to the instance. Amazon EC2 public images use this\n feature to provide secure access without passwords. For more information, see Key\n pairs.

\n

For troubleshooting, see What to do if\n an instance immediately terminates, and Troubleshooting connecting to your instance.

", + "smithy.api#examples": [ + { + "title": "To launch an instance", + "documentation": "This example launches an instance using the specified AMI, instance type, security group, subnet, block device mapping, and tags.", + "input": { + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sdh", + "Ebs": { + "VolumeSize": 100 + } + } + ], + "ImageId": "ami-abc12345", + "InstanceType": "t2.micro", + "KeyName": "my-key-pair", + "MaxCount": 1, + "MinCount": 1, + "SecurityGroupIds": [ + "sg-1a2b3c4d" + ], + "SubnetId": "subnet-6e7f829e", + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Purpose", + "Value": "test" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#RunInstancesMonitoringEnabled": { @@ -86140,7 +88511,7 @@ "InstanceType": { "target": "com.amazonaws.ec2#InstanceType", "traits": { - "smithy.api#documentation": "

The instance type. For more information, see Instance types in the\n Amazon EC2 User Guide.

\n

Default: m1.small\n

" + "smithy.api#documentation": "

The instance type. For more information, see Instance types in the\n Amazon EC2 User Guide.

" } }, "Ipv6AddressCount": { @@ -86364,7 +88735,7 @@ "HibernationOptions": { "target": "com.amazonaws.ec2#HibernationOptionsRequest", "traits": { - "smithy.api#documentation": "

Indicates whether an instance is enabled for hibernation. For more information, see\n Hibernate\n your instance in the Amazon EC2 User Guide.

\n

You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\n instance.

" + "smithy.api#documentation": "

Indicates whether an instance is enabled for hibernation. This parameter is valid only\n if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\n instance.

" } }, "LicenseSpecifications": { @@ -86383,13 +88754,13 @@ "EnclaveOptions": { "target": "com.amazonaws.ec2#EnclaveOptionsRequest", "traits": { - "smithy.api#documentation": "

Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\n more information, see What is Amazon Web Services Nitro\n Enclaves? in the Amazon Web Services Nitro Enclaves User\n Guide.

\n

You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\n instance.

" + "smithy.api#documentation": "

Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\n more information, see What is Amazon Web Services Nitro\n Enclaves? in the Amazon Web Services Nitro Enclaves User\n Guide.

\n

You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\n instance.

" } }, "PrivateDnsNameOptions": { "target": "com.amazonaws.ec2#PrivateDnsNameOptionsRequest", "traits": { - "smithy.api#documentation": "

The options for the instance hostname. The default values are inherited from the\n subnet.

" + "smithy.api#documentation": "

The options for the instance hostname. \n The default values are inherited from the subnet.\n Applies only if creating a network interface, not attaching an existing one.

" } }, "MaintenanceOptions": { @@ -86405,6 +88776,14 @@ "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether an instance is enabled for stop protection. For more information,\n see Stop\n protection.

" } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

If you’re launching an instance into a dual-stack or IPv6-only subnet, you can enable\n assigning a primary IPv6 address. A primary IPv6 address is an IPv6 GUA address\n associated with an ENI that you have enabled to use a primary IPv6 address. Use this\n option if an instance relies on its IPv6 address not changing. When you launch the\n instance, Amazon Web Services will automatically assign an IPv6 address associated with\n the ENI attached to your instance to be the primary IPv6 address. Once you enable an\n IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" + } } }, "traits": { @@ -86569,6 +88948,29 @@ "smithy.api#documentation": "

Describes the storage parameters for Amazon S3 and Amazon S3 buckets for an instance store-backed AMI.

" } }, + "com.amazonaws.ec2#SSEType": { + "type": "enum", + "members": { + "sse_ebs": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sse-ebs" + } + }, + "sse_kms": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sse-kms" + } + }, + "none": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "none" + } + } + } + }, "com.amazonaws.ec2#ScheduledInstance": { "type": "structure", "members": { @@ -87653,7 +90055,7 @@ "target": "com.amazonaws.ec2#IpPermissionList", "traits": { "aws.protocols#ec2QueryName": "IpPermissionsEgress", - "smithy.api#documentation": "

[VPC only] The outbound rules associated with the security group.

", + "smithy.api#documentation": "

The outbound rules associated with the security group.

", "smithy.api#xmlName": "ipPermissionsEgress" } }, @@ -87669,7 +90071,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "VpcId", - "smithy.api#documentation": "

[VPC only] The ID of the VPC for the security group.

", + "smithy.api#documentation": "

The ID of the VPC for the security group.

", "smithy.api#xmlName": "vpcId" } } @@ -88720,6 +91122,14 @@ "smithy.api#documentation": "

Only for archived snapshots that are temporarily restored. Indicates the date and \n time when a temporarily restored snapshot will be automatically re-archived.

", "smithy.api#xmlName": "restoreExpiryTime" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -88980,6 +91390,14 @@ "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored. For more information, see Amazon EBS local snapshots on Outposts in the \n \t\tAmazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "outpostArn" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -90173,6 +92591,12 @@ "traits": { "smithy.api#enumValue": "failed" } + }, + "disabled": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "disabled" + } } } }, @@ -90761,7 +93185,33 @@ "target": "com.amazonaws.ec2#StartInstancesResult" }, "traits": { - "smithy.api#documentation": "

Starts an Amazon EBS-backed instance that you've previously stopped.

\n

Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\n started. When an instance is stopped, the compute resources are released and you are not\n billed for instance usage. However, your root partition Amazon EBS volume remains and\n continues to persist your data, and you are charged for Amazon EBS volume usage. You can\n restart your instance at any time. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

Before stopping an instance, make sure it is in a state from which it can be\n restarted. Stopping an instance does not preserve data stored in RAM.

\n

Performing this operation on an instance that uses an instance store as its root\n device returns an error.

\n

If you attempt to start a T3 instance with host tenancy and the\n unlimted CPU credit option, the request fails. The\n unlimited CPU credit option is not supported on Dedicated Hosts. Before\n you start the instance, either change its CPU credit option to standard, or\n change its tenancy to default or dedicated.

\n

For more information, see Stop and start your instance\n in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Starts an Amazon EBS-backed instance that you've previously stopped.

\n

Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\n started. When an instance is stopped, the compute resources are released and you are not\n billed for instance usage. However, your root partition Amazon EBS volume remains and\n continues to persist your data, and you are charged for Amazon EBS volume usage. You can\n restart your instance at any time. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

Before stopping an instance, make sure it is in a state from which it can be\n restarted. Stopping an instance does not preserve data stored in RAM.

\n

Performing this operation on an instance that uses an instance store as its root\n device returns an error.

\n

If you attempt to start a T3 instance with host tenancy and the\n unlimted CPU credit option, the request fails. The\n unlimited CPU credit option is not supported on Dedicated Hosts. Before\n you start the instance, either change its CPU credit option to standard, or\n change its tenancy to default or dedicated.

\n

For more information, see Stop and start your instance\n in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To start a stopped EC2 instance", + "documentation": "This example starts the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "StartingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 0, + "Name": "pending" + }, + "PreviousState": { + "Code": 80, + "Name": "stopped" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#StartInstancesRequest": { @@ -91196,7 +93646,33 @@ "target": "com.amazonaws.ec2#StopInstancesResult" }, "traits": { - "smithy.api#documentation": "

Stops an Amazon EBS-backed instance. For more information, see Stop and start\n your instance in the Amazon EC2 User Guide.

\n

You can use the Stop action to hibernate an instance if the instance is enabled for\n hibernation and it meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

We don't charge usage for a stopped instance, or data transfer fees; however, your\n root partition Amazon EBS volume remains and continues to persist your data, and you are\n charged for Amazon EBS volume usage. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

You can't stop or hibernate instance store-backed instances. You can't use the Stop\n action to hibernate Spot Instances, but you can specify that Amazon EC2 should hibernate\n Spot Instances when they are interrupted. For more information, see Hibernating interrupted Spot Instances in the\n Amazon EC2 User Guide.

\n

When you stop or hibernate an instance, we shut it down. You can restart your instance\n at any time. Before stopping or hibernating an instance, make sure it is in a state from\n which it can be restarted. Stopping an instance does not preserve data stored in RAM,\n but hibernating an instance does preserve data stored in RAM. If an instance cannot\n hibernate successfully, a normal shutdown occurs.

\n

Stopping and hibernating an instance is different to rebooting or terminating it. For\n example, when you stop or hibernate an instance, the root device and any other devices\n attached to the instance persist. When you terminate an instance, the root device and\n any other devices attached during the instance launch are automatically deleted. For\n more information about the differences between rebooting, stopping, hibernating, and\n terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

When you stop an instance, we attempt to shut it down forcibly after a short while. If\n your instance appears stuck in the stopping state after a period of time, there may be\n an issue with the underlying host computer. For more information, see Troubleshoot\n stopping your instance in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Stops an Amazon EBS-backed instance. For more information, see Stop and start\n your instance in the Amazon EC2 User Guide.

\n

You can use the Stop action to hibernate an instance if the instance is enabled for\n hibernation and it meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

We don't charge usage for a stopped instance, or data transfer fees; however, your\n root partition Amazon EBS volume remains and continues to persist your data, and you are\n charged for Amazon EBS volume usage. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

You can't stop or hibernate instance store-backed instances. You can't use the Stop\n action to hibernate Spot Instances, but you can specify that Amazon EC2 should hibernate\n Spot Instances when they are interrupted. For more information, see Hibernating interrupted Spot Instances in the\n Amazon EC2 User Guide.

\n

When you stop or hibernate an instance, we shut it down. You can restart your instance\n at any time. Before stopping or hibernating an instance, make sure it is in a state from\n which it can be restarted. Stopping an instance does not preserve data stored in RAM,\n but hibernating an instance does preserve data stored in RAM. If an instance cannot\n hibernate successfully, a normal shutdown occurs.

\n

Stopping and hibernating an instance is different to rebooting or terminating it. For\n example, when you stop or hibernate an instance, the root device and any other devices\n attached to the instance persist. When you terminate an instance, the root device and\n any other devices attached during the instance launch are automatically deleted. For\n more information about the differences between rebooting, stopping, hibernating, and\n terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

When you stop an instance, we attempt to shut it down forcibly after a short while. If\n your instance appears stuck in the stopping state after a period of time, there may be\n an issue with the underlying host computer. For more information, see Troubleshoot\n stopping your instance in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To stop a running EC2 instance", + "documentation": "This example stops the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "StoppingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 64, + "Name": "stopping" + }, + "PreviousState": { + "Code": 16, + "Name": "running" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#StopInstancesRequest": { @@ -91748,7 +94224,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "Description", - "smithy.api#documentation": "

The\n description\n assigned to the subnet CIDR\n reservation.

", + "smithy.api#documentation": "

The description assigned to the subnet CIDR reservation.

", "smithy.api#xmlName": "description" } }, @@ -92568,7 +95044,7 @@ } }, "ConnectionId": { - "target": "com.amazonaws.ec2#VpnConnectionId", + "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#documentation": "

The ID of the client connection to be terminated.

" } @@ -92674,7 +95150,33 @@ "target": "com.amazonaws.ec2#TerminateInstancesResult" }, "traits": { - "smithy.api#documentation": "

Shuts down the specified instances. This operation is idempotent; if you terminate an\n instance more than once, each call succeeds.

\n

If you specify multiple instances and the request fails (for example, because of a\n single incorrect instance ID), none of the instances are terminated.

\n

If you terminate multiple instances across multiple Availability Zones, and one or\n more of the specified instances are enabled for termination protection, the request\n fails with the following results:

\n
    \n
  • \n

    The specified instances that are in the same Availability Zone as the\n protected instance are not terminated.

    \n
  • \n
  • \n

    The specified instances that are in different Availability Zones, where no\n other specified instances are protected, are successfully terminated.

    \n
  • \n
\n

For example, say you have the following instances:

\n
    \n
  • \n

    Instance A: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance B: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance C: us-east-1b; Protected

    \n
  • \n
  • \n

    Instance D: us-east-1b; not protected

    \n
  • \n
\n

If you attempt to terminate all of these instances in the same request, the request\n reports failure with the following results:

\n
    \n
  • \n

    Instance A and Instance B are successfully terminated because none of the\n specified instances in us-east-1a are enabled for termination\n protection.

    \n
  • \n
  • \n

    Instance C and Instance D fail to terminate because at least one of the\n specified instances in us-east-1b (Instance C) is enabled for\n termination protection.

    \n
  • \n
\n

Terminated instances remain visible after termination (for approximately one\n hour).

\n

By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\n launched. Volumes attached after instance launch continue running.

\n

You can stop, start, and terminate EBS-backed instances. You can only terminate\n instance store-backed instances. What happens to an instance differs if you stop it or\n terminate it. For example, when you stop an instance, the root device and any other\n devices attached to the instance persist. When you terminate an instance, any attached\n EBS volumes with the DeleteOnTermination block device mapping parameter set\n to true are automatically deleted. For more information about the\n differences between stopping and terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

For more information about troubleshooting, see Troubleshooting terminating your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Shuts down the specified instances. This operation is idempotent; if you terminate an\n instance more than once, each call succeeds.

\n

If you specify multiple instances and the request fails (for example, because of a\n single incorrect instance ID), none of the instances are terminated.

\n

If you terminate multiple instances across multiple Availability Zones, and one or\n more of the specified instances are enabled for termination protection, the request\n fails with the following results:

\n
    \n
  • \n

    The specified instances that are in the same Availability Zone as the\n protected instance are not terminated.

    \n
  • \n
  • \n

    The specified instances that are in different Availability Zones, where no\n other specified instances are protected, are successfully terminated.

    \n
  • \n
\n

For example, say you have the following instances:

\n
    \n
  • \n

    Instance A: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance B: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance C: us-east-1b; Protected

    \n
  • \n
  • \n

    Instance D: us-east-1b; not protected

    \n
  • \n
\n

If you attempt to terminate all of these instances in the same request, the request\n reports failure with the following results:

\n
    \n
  • \n

    Instance A and Instance B are successfully terminated because none of the\n specified instances in us-east-1a are enabled for termination\n protection.

    \n
  • \n
  • \n

    Instance C and Instance D fail to terminate because at least one of the\n specified instances in us-east-1b (Instance C) is enabled for\n termination protection.

    \n
  • \n
\n

Terminated instances remain visible after termination (for approximately one\n hour).

\n

By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\n launched. Volumes attached after instance launch continue running.

\n

You can stop, start, and terminate EBS-backed instances. You can only terminate\n instance store-backed instances. What happens to an instance differs if you stop it or\n terminate it. For example, when you stop an instance, the root device and any other\n devices attached to the instance persist. When you terminate an instance, any attached\n EBS volumes with the DeleteOnTermination block device mapping parameter set\n to true are automatically deleted. For more information about the\n differences between stopping and terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

For more information about troubleshooting, see Troubleshooting terminating your instance in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To terminate an EC2 instance", + "documentation": "This example terminates the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "TerminatingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 32, + "Name": "shutting-down" + }, + "PreviousState": { + "Code": 16, + "Name": "running" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#TerminateInstancesRequest": { @@ -96580,7 +99082,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "aws.protocols#ec2QueryName": "PreSharedKey", "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and the customer gateway.

", @@ -96883,7 +99385,7 @@ "target": "com.amazonaws.ec2#UnassignPrivateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, see Edit secondary IP address associations in the Amazon Virtual Private Cloud User Guide.

\n

While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

A private IP address will only be released at the end of MaxDrainDurationSeconds. The\n private IP addresses stay associated and support the existing connections but do not\n support any new connections (new connections are distributed across the remaining\n assigned private IP address). After the existing connections drain out, the private IP\n addresses get released.

\n

\n

" + "smithy.api#documentation": "

Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, see Edit secondary IP address associations in the Amazon VPC User Guide.

\n

While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

A private IP address will only be released at the end of MaxDrainDurationSeconds. The\n private IP addresses stay associated and support the existing connections, but do not\n support any new connections (new connections are distributed across the remaining\n assigned private IP address). After the existing connections drain out, the private IP\n addresses are released.

\n

\n

" } }, "com.amazonaws.ec2#UnassignPrivateNatGatewayAddressRequest": { @@ -96893,7 +99395,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -96934,7 +99436,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -97196,7 +99698,30 @@ "target": "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Updates the description of an egress (outbound) security group rule. You\n\t\t\tcan replace an existing description, or add a description to a rule that did not have one\n\t\t\tpreviously. You can remove a description for a security group rule by omitting the \n\t\t\tdescription parameter in the request.

" + "smithy.api#documentation": "

Updates the description of an egress (outbound) security group rule. You\n\t\t\tcan replace an existing description, or add a description to a rule that did not have one\n\t\t\tpreviously. You can remove a description for a security group rule by omitting the \n\t\t\tdescription parameter in the request.

", + "smithy.api#examples": [ + { + "title": "To update an outbound security group rule description", + "documentation": "This example updates the description for the specified security group rule.", + "input": { + "GroupId": "sg-123abc12", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/24", + "Description": "Outbound HTTP access to server 2" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressRequest": { @@ -97219,7 +99744,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the security group\n\t\t\tID or the security group name in the request.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the security group\n\t\t\tID or the security group name.

" } }, "IpPermissions": { @@ -97267,7 +99792,30 @@ "target": "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressResult" }, "traits": { - "smithy.api#documentation": "

Updates the description of an ingress (inbound) security group rule. You can replace an\n\t\t\texisting description, or add a description to a rule that did not have one previously.\n\t\t You can remove a description for a security group rule by omitting the description \n\t\t parameter in the request.

" + "smithy.api#documentation": "

Updates the description of an ingress (inbound) security group rule. You can replace an\n\t\t\texisting description, or add a description to a rule that did not have one previously.\n\t\t You can remove a description for a security group rule by omitting the description \n\t\t parameter in the request.

", + "smithy.api#examples": [ + { + "title": "To update an inbound security group rule description", + "documentation": "This example updates the description for the specified security group rule.", + "input": { + "GroupId": "sg-123abc12", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/16", + "Description": "SSH access from the LA office" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressRequest": { @@ -97290,7 +99838,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -97302,7 +99850,7 @@ "SecurityGroupRuleDescriptions": { "target": "com.amazonaws.ec2#SecurityGroupRuleDescriptionList", "traits": { - "smithy.api#documentation": "

[VPC only] The description for the ingress security group rules. You must specify either\n a description or IP permissions.

", + "smithy.api#documentation": "

The description for the ingress security group rules. You must specify either\n a description or IP permissions.

", "smithy.api#xmlName": "SecurityGroupRuleDescription" } } @@ -97448,7 +99996,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "GroupName", - "smithy.api#documentation": "

The name of the security group. In a request, use this parameter for a security group\n in EC2-Classic or a default VPC only. For a security group in a nondefault VPC, use the\n security group ID.

\n

For a referenced security group in another VPC, this value is not returned if the\n referenced security group is deleted.

", + "smithy.api#documentation": "

[Default VPC] The name of the security group. For a security group in a nondefault VPC, \n use the security group ID.

\n

For a referenced security group in another VPC, this value is not returned if the\n referenced security group is deleted.

", "smithy.api#xmlName": "groupName" } }, @@ -97464,7 +100012,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "UserId", - "smithy.api#documentation": "

The ID of an Amazon Web Services account.

\n

For a referenced security group in another VPC, the account ID of the referenced\n security group is returned in the response. If the referenced security group is deleted,\n this value is not returned.

\n

[EC2-Classic] Required when adding or removing rules that reference a security group\n in another Amazon Web Services account.

", + "smithy.api#documentation": "

The ID of an Amazon Web Services account.

\n

For a referenced security group in another VPC, the account ID of the referenced\n security group is returned in the response. If the referenced security group is deleted,\n this value is not returned.

", "smithy.api#xmlName": "userId" } }, @@ -97486,7 +100034,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes a security group and Amazon Web Services account ID pair.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Describes a security group and Amazon Web Services account ID pair.

" } }, "com.amazonaws.ec2#UserIdGroupPairList": { @@ -98444,10 +100992,24 @@ "traits": { "smithy.api#documentation": "

Sends Verified Access logs to Kinesis.

" } + }, + "LogVersion": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

\n\t\t The logging version to use.\n\t

\n

Valid values: ocsf-0.1 | ocsf-1.0.0-rc.2\n

" + } + }, + "IncludeTrustContext": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

\n\t\t Include trust data sent by trust providers into the logs. \n\t

" + } } }, "traits": { - "smithy.api#documentation": "

Describes the destinations for Verified Access logs.

" + "smithy.api#documentation": "

Options for Verified Access logs.

" } }, "com.amazonaws.ec2#VerifiedAccessLogS3Destination": { @@ -98561,10 +101123,28 @@ "smithy.api#documentation": "

Kinesis logging destination.

", "smithy.api#xmlName": "kinesisDataFirehose" } + }, + "LogVersion": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "LogVersion", + "smithy.api#documentation": "

\n Describes current setting for the logging version.\n

", + "smithy.api#xmlName": "logVersion" + } + }, + "IncludeTrustContext": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IncludeTrustContext", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

\n\t\t Describes current setting for including trust data into the logs.\n\t

", + "smithy.api#xmlName": "includeTrustContext" + } } }, "traits": { - "smithy.api#documentation": "

Describes the destinations for Verified Access logs.

" + "smithy.api#documentation": "

Describes the options for Verified Access logs.

" } }, "com.amazonaws.ec2#VerifiedAccessTrustProvider": { @@ -99009,6 +101589,14 @@ "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

", "smithy.api#xmlName": "throughput" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -100060,7 +102648,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes whether a VPC is enabled for ClassicLink.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes whether a VPC is enabled for ClassicLink.

" } }, "com.amazonaws.ec2#VpcClassicLinkIdList": { @@ -100603,7 +103191,7 @@ "aws.protocols#ec2QueryName": "AllowDnsResolutionFromRemoteVpc", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses when queried from instances in a peer VPC.

", + "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses \n when queried from instances in a peer VPC.

", "smithy.api#xmlName": "allowDnsResolutionFromRemoteVpc" } }, @@ -100613,7 +103201,7 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local ClassicLink connection can communicate with the peer VPC over the VPC peering connection.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } }, @@ -100623,13 +103211,13 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local VPC can communicate with a ClassicLink connection in the peer VPC over the VPC peering connection.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the VPC peering connection options.

" + "smithy.api#documentation": "

Describes the VPC peering connection options.

" } }, "com.amazonaws.ec2#VpcPeeringConnectionStateReason": { @@ -100811,7 +103399,7 @@ "type": "structure", "members": { "CustomerGatewayConfiguration": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#customerGatewayConfiguration", "traits": { "aws.protocols#ec2QueryName": "CustomerGatewayConfiguration", "smithy.api#documentation": "

The configuration information for the VPN connection's customer gateway (in the native\n XML format). This element is always present in the CreateVpnConnection\n response; however, it's present in the DescribeVpnConnections response\n only if the VPN connection is in the pending or available\n state.

", @@ -101422,7 +104010,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and customer gateway.

\n

Constraints: Allowed characters are alphanumeric characters, periods (.), and\n underscores (_). Must be between 8 and 64 characters in length and cannot start with\n zero (0).

" } @@ -101678,6 +104266,18 @@ } } }, + "com.amazonaws.ec2#customerGatewayConfiguration": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.ec2#preSharedKey": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#scope": { "type": "enum", "members": { @@ -101709,6 +104309,9 @@ }, "com.amazonaws.ec2#totalGpuMemory": { "type": "integer" + }, + "com.amazonaws.ec2#totalInferenceMemory": { + "type": "integer" } } } diff --git a/aws/sdk/aws-models/ecs.json b/aws/sdk/aws-models/ecs.json index 51c17eda2f4..37ba5292c62 100644 --- a/aws/sdk/aws-models/ecs.json +++ b/aws/sdk/aws-models/ecs.json @@ -332,52 +332,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -385,13 +389,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -401,224 +414,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://ecs.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://ecs.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1471,14 +1435,14 @@ "autoScalingGroupArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The Amazon Resource Name (ARN) that identifies the Auto Scaling group.

", + "smithy.api#documentation": "

The Amazon Resource Name (ARN) that identifies the Auto Scaling group, or the Auto Scaling group name.

", "smithy.api#required": {} } }, "managedScaling": { "target": "com.amazonaws.ecs#ManagedScaling", "traits": { - "smithy.api#documentation": "

The managed scaling settings for the Auto Scaling group capacity provider.

" + "smithy.api#documentation": "

he managed scaling settings for the Auto Scaling group capacity provider.

" } }, "managedTerminationProtection": { @@ -2361,13 +2325,13 @@ "startTimeout": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

Time duration (in seconds) to wait before giving up on resolving dependencies for a\n\t\t\tcontainer. For example, you specify two containers in a task definition with containerA\n\t\t\thaving a dependency on containerB reaching a COMPLETE,\n\t\t\tSUCCESS, or HEALTHY status. If a startTimeout\n\t\t\tvalue is specified for containerB and it doesn't reach the desired status within that\n\t\t\ttime then containerA gives up and not start. This results in the task transitioning to a\n\t\t\t\tSTOPPED state.

\n \n

When the ECS_CONTAINER_START_TIMEOUT container agent configuration\n\t\t\t\tvariable is used, it's enforced independently from this start timeout value.

\n
\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

For tasks using the EC2 launch type, your container instances require at\n\t\t\tleast version 1.26.0 of the container agent to use a container start\n\t\t\ttimeout value. However, we recommend using the latest container agent version. For\n\t\t\tinformation about checking your agent version and updating to the latest version, see\n\t\t\t\tUpdating the Amazon ECS\n\t\t\t\tContainer Agent in the Amazon Elastic Container Service Developer Guide. If you're using an Amazon ECS-optimized Linux AMI,\n\t\t\tyour instance needs at least version 1.26.0-1 of the ecs-init\n\t\t\tpackage. If your container instances are launched from version 20190301 or\n\t\t\tlater, then they contain the required versions of the container agent and\n\t\t\t\tecs-init. For more information, see Amazon ECS-optimized Linux AMI\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Time duration (in seconds) to wait before giving up on resolving dependencies for a\n\t\t\tcontainer. For example, you specify two containers in a task definition with containerA\n\t\t\thaving a dependency on containerB reaching a COMPLETE,\n\t\t\tSUCCESS, or HEALTHY status. If a startTimeout\n\t\t\tvalue is specified for containerB and it doesn't reach the desired status within that\n\t\t\ttime then containerA gives up and not start. This results in the task transitioning to a\n\t\t\t\tSTOPPED state.

\n \n

When the ECS_CONTAINER_START_TIMEOUT container agent configuration\n\t\t\t\tvariable is used, it's enforced independently from this start timeout value.

\n
\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

For tasks using the EC2 launch type, your container instances require at\n\t\t\tleast version 1.26.0 of the container agent to use a container start\n\t\t\ttimeout value. However, we recommend using the latest container agent version. For\n\t\t\tinformation about checking your agent version and updating to the latest version, see\n\t\t\t\tUpdating the Amazon ECS\n\t\t\t\tContainer Agent in the Amazon Elastic Container Service Developer Guide. If you're using an Amazon ECS-optimized Linux AMI,\n\t\t\tyour instance needs at least version 1.26.0-1 of the ecs-init\n\t\t\tpackage. If your container instances are launched from version 20190301 or\n\t\t\tlater, then they contain the required versions of the container agent and\n\t\t\t\tecs-init. For more information, see Amazon ECS-optimized Linux AMI\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

\n

The valid values are 2-120 seconds.

" } }, "stopTimeout": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

Time duration (in seconds) to wait before the container is forcefully killed if it\n\t\t\tdoesn't exit normally on its own.

\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

The max stop timeout value is 120 seconds and if the parameter is not specified, the\n\t\t\tdefault value of 30 seconds is used.

\n

For tasks that use the EC2 launch type, if the stopTimeout\n\t\t\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\n\t\t\tvariable ECS_CONTAINER_STOP_TIMEOUT is used. If neither the\n\t\t\t\tstopTimeout parameter or the ECS_CONTAINER_STOP_TIMEOUT\n\t\t\tagent configuration variable are set, then the default values of 30 seconds for Linux\n\t\t\tcontainers and 30 seconds on Windows containers are used. Your container instances\n\t\t\trequire at least version 1.26.0 of the container agent to use a container stop timeout\n\t\t\tvalue. However, we recommend using the latest container agent version. For information\n\t\t\tabout checking your agent version and updating to the latest version, see Updating the Amazon ECS Container Agent in the Amazon Elastic Container Service Developer Guide. If you're using\n\t\t\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\n\t\t\t\tecs-init package. If your container instances are launched from version\n\t\t\t\t20190301 or later, then they contain the required versions of the\n\t\t\tcontainer agent and ecs-init. For more information, see Amazon ECS-optimized Linux AMI in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Time duration (in seconds) to wait before the container is forcefully killed if it\n\t\t\tdoesn't exit normally on its own.

\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

The max stop timeout value is 120 seconds and if the parameter is not specified, the\n\t\t\tdefault value of 30 seconds is used.

\n

For tasks that use the EC2 launch type, if the stopTimeout\n\t\t\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\n\t\t\tvariable ECS_CONTAINER_STOP_TIMEOUT is used. If neither the\n\t\t\t\tstopTimeout parameter or the ECS_CONTAINER_STOP_TIMEOUT\n\t\t\tagent configuration variable are set, then the default values of 30 seconds for Linux\n\t\t\tcontainers and 30 seconds on Windows containers are used. Your container instances\n\t\t\trequire at least version 1.26.0 of the container agent to use a container stop timeout\n\t\t\tvalue. However, we recommend using the latest container agent version. For information\n\t\t\tabout checking your agent version and updating to the latest version, see Updating the Amazon ECS Container Agent in the Amazon Elastic Container Service Developer Guide. If you're using\n\t\t\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\n\t\t\t\tecs-init package. If your container instances are launched from version\n\t\t\t\t20190301 or later, then they contain the required versions of the\n\t\t\tcontainer agent and ecs-init. For more information, see Amazon ECS-optimized Linux AMI in the Amazon Elastic Container Service Developer Guide.

\n

The valid values are 2-120 seconds.

" } }, "hostname": { @@ -2483,6 +2447,12 @@ "traits": { "smithy.api#documentation": "

The FireLens configuration for the container. This is used to specify and configure a\n\t\t\tlog router for container logs. For more information, see Custom Log Routing\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" } + }, + "credentialSpecs": { + "target": "com.amazonaws.ecs#StringList", + "traits": { + "smithy.api#documentation": "

A list of ARNs in SSM or Amazon S3 to a credential spec\n\t\t\t\t(CredSpec) file that configures the container for Active Directory\n\t\t\tauthentication. We recommend that you use this parameter instead of the\n\t\t\t\tdockerSecurityOptions. The maximum number of ARNs is\n\t\t\t1.

\n

There are two formats for each ARN.

\n
\n
credentialspecdomainless:MyARN
\n
\n

You use credentialspecdomainless:MyARN to provide a\n\t\t\t\t\t\t\tCredSpec with an additional section for a secret in Secrets Manager.\n\t\t\t\t\t\tYou provide the login credentials to the domain in the secret.

\n

Each task that runs on any container instance can join different\n\t\t\t\t\t\tdomains.

\n

You can use this format without joining the container instance to a\n\t\t\t\t\t\tdomain.

\n
\n
credentialspec:MyARN
\n
\n

You use credentialspec:MyARN to provide a\n\t\t\t\t\t\t\tCredSpec for a single domain.

\n

You must join the container instance to the domain before you start any\n\t\t\t\t\t\ttasks that use this task definition.

\n
\n
\n

In both formats, replace MyARN with the ARN in\n\t\t\tSSM or Amazon S3.

\n

If you provide a credentialspecdomainless:MyARN, the\n\t\t\t\tcredspec must provide a ARN in Secrets Manager for a secret containing the\n\t\t\tusername, password, and the domain to connect to. For better security, the instance\n\t\t\tisn't joined to the domain for domainless authentication. Other applications on the\n\t\t\tinstance can't use the domainless credentials. You can use this parameter to run tasks\n\t\t\ton the same instance, even it the tasks need to join different domains. For more\n\t\t\tinformation, see Using gMSAs for Windows\n\t\t\t\tContainers and Using gMSAs for Linux\n\t\t\t\tContainers.

" + } } }, "traits": { @@ -2780,7 +2750,7 @@ } }, "traits": { - "smithy.api#documentation": "

The overrides that are sent to a container. An empty container override can be passed\n\t\t\tin. An example of an empty container override is {\"containerOverrides\": [ ]\n\t\t\t\t}. If a non-empty container override is specified, the name\n\t\t\tparameter must be included.

" + "smithy.api#documentation": "

The overrides that are sent to a container. An empty container override can be passed\n\t\t\tin. An example of an empty container override is {\"containerOverrides\": [ ]\n\t\t\t\t}. If a non-empty container override is specified, the name\n\t\t\tparameter must be included.

\n

You can use Secrets Manager or Amazon Web Services Systems Manager Parameter Store to store the sensitive\n\t\t\tdata. For more information, see Retrieve secrets through environment variables in the Amazon ECS Developer Guide.

" } }, "com.amazonaws.ecs#ContainerOverrides": { @@ -2945,7 +2915,27 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new Amazon ECS cluster. By default, your account receives a default\n\t\t\tcluster when you launch your first container instance. However, you can create your own\n\t\t\tcluster with a unique name with the CreateCluster action.

\n \n

When you call the CreateCluster API operation, Amazon ECS attempts to\n\t\t\t\tcreate the Amazon ECS service-linked role for your account. This is so that it can manage\n\t\t\t\trequired resources in other Amazon Web Services services on your behalf. However, if the user\n\t\t\t\tthat makes the call doesn't have permissions to create the service-linked role, it\n\t\t\t\tisn't created. For more information, see Using\n\t\t\t\t\tservice-linked roles for Amazon ECS in the Amazon Elastic Container Service Developer Guide.

\n
" + "smithy.api#documentation": "

Creates a new Amazon ECS cluster. By default, your account receives a default\n\t\t\tcluster when you launch your first container instance. However, you can create your own\n\t\t\tcluster with a unique name with the CreateCluster action.

\n \n

When you call the CreateCluster API operation, Amazon ECS attempts to\n\t\t\t\tcreate the Amazon ECS service-linked role for your account. This is so that it can manage\n\t\t\t\trequired resources in other Amazon Web Services services on your behalf. However, if the user\n\t\t\t\tthat makes the call doesn't have permissions to create the service-linked role, it\n\t\t\t\tisn't created. For more information, see Using\n\t\t\t\t\tservice-linked roles for Amazon ECS in the Amazon Elastic Container Service Developer Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To create a new cluster", + "documentation": "This example creates a cluster in your default region.", + "input": { + "clusterName": "my_cluster" + }, + "output": { + "cluster": { + "status": "ACTIVE", + "clusterName": "my_cluster", + "registeredContainerInstancesCount": 0, + "pendingTasksCount": 0, + "runningTasksCount": 0, + "activeServicesCount": 0, + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster" + } + } + } + ] } }, "com.amazonaws.ecs#CreateClusterRequest": { @@ -3050,7 +3040,59 @@ } ], "traits": { - "smithy.api#documentation": "

Runs and maintains your desired number of tasks from a specified task definition. If\n\t\t\tthe number of tasks running in a service drops below the desiredCount,\n\t\t\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\n\t\t\tservice, see the UpdateService action.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

In addition to maintaining the desired count of tasks in your service, you can\n\t\t\toptionally run your service behind one or more load balancers. The load balancers\n\t\t\tdistribute traffic across the tasks that are associated with the service. For more\n\t\t\tinformation, see Service load balancing in the Amazon Elastic Container Service Developer Guide.

\n

Tasks for services that don't use a load balancer are considered healthy if they're in\n\t\t\tthe RUNNING state. Tasks for services that use a load balancer are\n\t\t\tconsidered healthy if they're in the RUNNING state and are reported as\n\t\t\thealthy by the load balancer.

\n

There are two service scheduler strategies available:

\n
    \n
  • \n

    \n REPLICA - The replica scheduling strategy places and\n\t\t\t\t\tmaintains your desired number of tasks across your cluster. By default, the\n\t\t\t\t\tservice scheduler spreads tasks across Availability Zones. You can use task\n\t\t\t\t\tplacement strategies and constraints to customize task placement decisions. For\n\t\t\t\t\tmore information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    \n DAEMON - The daemon scheduling strategy deploys exactly one\n\t\t\t\t\ttask on each active container instance that meets all of the task placement\n\t\t\t\t\tconstraints that you specify in your cluster. The service scheduler also\n\t\t\t\t\tevaluates the task placement constraints for running tasks. It also stops tasks\n\t\t\t\t\tthat don't meet the placement constraints. When using this strategy, you don't\n\t\t\t\t\tneed to specify a desired number of tasks, a task placement strategy, or use\n\t\t\t\t\tService Auto Scaling policies. For more information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
\n

You can optionally specify a deployment configuration for your service. The deployment\n\t\t\tis initiated by changing properties. For example, the deployment might be initiated by\n\t\t\tthe task definition or by your desired count of a service. This is done with an UpdateService operation. The default value for a replica service for\n\t\t\t\tminimumHealthyPercent is 100%. The default value for a daemon service\n\t\t\tfor minimumHealthyPercent is 0%.

\n

If a service uses the ECS deployment controller, the minimum healthy\n\t\t\tpercent represents a lower limit on the number of tasks in a service that must remain in\n\t\t\tthe RUNNING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of your desired number of tasks (rounded up to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can deploy without using additional cluster capacity. For example, if you\n\t\t\tset your service to have desired number of four tasks and a minimum healthy percent of\n\t\t\t50%, the scheduler might stop two existing tasks to free up cluster capacity before\n\t\t\tstarting two new tasks. If they're in the RUNNING state, tasks for services\n\t\t\tthat don't use a load balancer are considered healthy . If they're in the\n\t\t\t\tRUNNING state and reported as healthy by the load balancer, tasks for\n\t\t\tservices that do use a load balancer are considered healthy . The\n\t\t\tdefault value for minimum healthy percent is 100%.

\n

If a service uses the ECS deployment controller, the maximum percent parameter represents an upper limit on the\n\t\t\tnumber of tasks in a service that are allowed in the RUNNING or\n\t\t\t\tPENDING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of the desired number of tasks (rounded down to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can define the deployment batch size. For example, if your service has a\n\t\t\tdesired number of four tasks and a maximum percent value of 200%, the scheduler may\n\t\t\tstart four new tasks before stopping the four older tasks (provided that the cluster\n\t\t\tresources required to do this are available). The default value for maximum percent is\n\t\t\t200%.

\n

If a service uses either the CODE_DEPLOY or EXTERNAL\n\t\t\tdeployment controller types and tasks that use the EC2 launch type, the\n\t\t\t\tminimum healthy percent and maximum percent values are used only to define the lower and upper limit\n\t\t\ton the number of the tasks in the service that remain in the RUNNING state.\n\t\t\tThis is while the container instances are in the DRAINING state. If the\n\t\t\ttasks in the service use the Fargate launch type, the minimum healthy\n\t\t\tpercent and maximum percent values aren't used. This is the case even if they're\n\t\t\tcurrently visible when describing your service.

\n

When creating a service that uses the EXTERNAL deployment controller, you\n\t\t\tcan specify only parameters that aren't controlled at the task set level. The only\n\t\t\trequired parameter is the service name. You control your services using the CreateTaskSet operation. For more information, see Amazon ECS deployment types in the Amazon Elastic Container Service Developer Guide.

\n

When the service scheduler launches new tasks, it determines task placement. For\n\t\t\tinformation about task placement and task placement strategies, see Amazon ECS\n\t\t\t\ttask placement in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Runs and maintains your desired number of tasks from a specified task definition. If\n\t\t\tthe number of tasks running in a service drops below the desiredCount,\n\t\t\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\n\t\t\tservice, see the UpdateService action.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

In addition to maintaining the desired count of tasks in your service, you can\n\t\t\toptionally run your service behind one or more load balancers. The load balancers\n\t\t\tdistribute traffic across the tasks that are associated with the service. For more\n\t\t\tinformation, see Service load balancing in the Amazon Elastic Container Service Developer Guide.

\n

Tasks for services that don't use a load balancer are considered healthy if they're in\n\t\t\tthe RUNNING state. Tasks for services that use a load balancer are\n\t\t\tconsidered healthy if they're in the RUNNING state and are reported as\n\t\t\thealthy by the load balancer.

\n

There are two service scheduler strategies available:

\n
    \n
  • \n

    \n REPLICA - The replica scheduling strategy places and\n\t\t\t\t\tmaintains your desired number of tasks across your cluster. By default, the\n\t\t\t\t\tservice scheduler spreads tasks across Availability Zones. You can use task\n\t\t\t\t\tplacement strategies and constraints to customize task placement decisions. For\n\t\t\t\t\tmore information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    \n DAEMON - The daemon scheduling strategy deploys exactly one\n\t\t\t\t\ttask on each active container instance that meets all of the task placement\n\t\t\t\t\tconstraints that you specify in your cluster. The service scheduler also\n\t\t\t\t\tevaluates the task placement constraints for running tasks. It also stops tasks\n\t\t\t\t\tthat don't meet the placement constraints. When using this strategy, you don't\n\t\t\t\t\tneed to specify a desired number of tasks, a task placement strategy, or use\n\t\t\t\t\tService Auto Scaling policies. For more information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
\n

You can optionally specify a deployment configuration for your service. The deployment\n\t\t\tis initiated by changing properties. For example, the deployment might be initiated by\n\t\t\tthe task definition or by your desired count of a service. This is done with an UpdateService operation. The default value for a replica service for\n\t\t\t\tminimumHealthyPercent is 100%. The default value for a daemon service\n\t\t\tfor minimumHealthyPercent is 0%.

\n

If a service uses the ECS deployment controller, the minimum healthy\n\t\t\tpercent represents a lower limit on the number of tasks in a service that must remain in\n\t\t\tthe RUNNING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of your desired number of tasks (rounded up to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can deploy without using additional cluster capacity. For example, if you\n\t\t\tset your service to have desired number of four tasks and a minimum healthy percent of\n\t\t\t50%, the scheduler might stop two existing tasks to free up cluster capacity before\n\t\t\tstarting two new tasks. If they're in the RUNNING state, tasks for services\n\t\t\tthat don't use a load balancer are considered healthy . If they're in the\n\t\t\t\tRUNNING state and reported as healthy by the load balancer, tasks for\n\t\t\tservices that do use a load balancer are considered healthy . The\n\t\t\tdefault value for minimum healthy percent is 100%.

\n

If a service uses the ECS deployment controller, the maximum percent parameter represents an upper limit on the\n\t\t\tnumber of tasks in a service that are allowed in the RUNNING or\n\t\t\t\tPENDING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of the desired number of tasks (rounded down to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can define the deployment batch size. For example, if your service has a\n\t\t\tdesired number of four tasks and a maximum percent value of 200%, the scheduler may\n\t\t\tstart four new tasks before stopping the four older tasks (provided that the cluster\n\t\t\tresources required to do this are available). The default value for maximum percent is\n\t\t\t200%.

\n

If a service uses either the CODE_DEPLOY or EXTERNAL\n\t\t\tdeployment controller types and tasks that use the EC2 launch type, the\n\t\t\t\tminimum healthy percent and maximum percent values are used only to define the lower and upper limit\n\t\t\ton the number of the tasks in the service that remain in the RUNNING state.\n\t\t\tThis is while the container instances are in the DRAINING state. If the\n\t\t\ttasks in the service use the Fargate launch type, the minimum healthy\n\t\t\tpercent and maximum percent values aren't used. This is the case even if they're\n\t\t\tcurrently visible when describing your service.

\n

When creating a service that uses the EXTERNAL deployment controller, you\n\t\t\tcan specify only parameters that aren't controlled at the task set level. The only\n\t\t\trequired parameter is the service name. You control your services using the CreateTaskSet operation. For more information, see Amazon ECS deployment types in the Amazon Elastic Container Service Developer Guide.

\n

When the service scheduler launches new tasks, it determines task placement. For\n\t\t\tinformation about task placement and task placement strategies, see Amazon ECS\n\t\t\t\ttask placement in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new service", + "documentation": "This example creates a service in your default region called ``ecs-simple-service``. The service uses the ``hello_world`` task definition and it maintains 10 copies of that task.", + "input": { + "serviceName": "ecs-simple-service", + "taskDefinition": "hello_world", + "desiredCount": 10 + }, + "output": { + "service": { + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default", + "createdAt": "2016-08-29T16:13:47.298Z", + "deploymentConfiguration": { + "maximumPercent": 200, + "minimumHealthyPercent": 100 + }, + "deployments": [ + { + "createdAt": "2016-08-29T16:13:47.298Z", + "desiredCount": 10, + "id": "ecs-svc/9223370564342348388", + "pendingCount": 0, + "runningCount": 0, + "status": "PRIMARY", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:13:47.298Z" + }, + { + "createdAt": "2016-08-29T15:52:44.481Z", + "desiredCount": 0, + "id": "ecs-svc/9223370564343611322", + "pendingCount": 0, + "runningCount": 0, + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:11:38.941Z" + } + ], + "desiredCount": 10, + "events": [], + "loadBalancers": [], + "pendingCount": 0, + "runningCount": 0, + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service", + "serviceName": "ecs-simple-service", + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6" + } + } + } + ] } }, "com.amazonaws.ecs#CreateServiceRequest": { @@ -3175,13 +3217,13 @@ "target": "com.amazonaws.ecs#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\n\t\t\tmore information, see Tagging your Amazon ECS\n\t\t\t\tresources in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\n\t\t\tmore information, see Tagging your Amazon ECS\n\t\t\t\tresources in the Amazon Elastic Container Service Developer Guide.

\n

When you use Amazon ECS managed tags, you need to set the propagateTags\n\t\t\trequest parameter.

" } }, "propagateTags": { "target": "com.amazonaws.ecs#PropagateTags", "traits": { - "smithy.api#documentation": "

Specifies whether to propagate the tags from the task definition to the task. If no\n\t\t\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\n\t\t\tduring task creation. To add tags to a task after task creation, use the TagResource API action.

" + "smithy.api#documentation": "

Specifies whether to propagate the tags from the task definition to the task. If no\n\t\t\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\n\t\t\tduring task creation. To add tags to a task after task creation, use the TagResource API action.

\n

The default is NONE.

" } }, "enableExecuteCommand": { @@ -3289,7 +3331,7 @@ "taskDefinition": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The task definition for the tasks in the task set to use.

", + "smithy.api#documentation": "

The task definition for the tasks in the task set to use. If a revision isn't specified, the\n\t\t\tlatest ACTIVE revision is used.

", "smithy.api#required": {} } }, @@ -3386,7 +3428,23 @@ } ], "traits": { - "smithy.api#documentation": "

Disables an account setting for a specified user, role, or the root user for\n\t\t\tan account.

" + "smithy.api#documentation": "

Disables an account setting for a specified user, role, or the root user for\n\t\t\tan account.

", + "smithy.api#examples": [ + { + "title": "To delete your account setting", + "documentation": "This example deletes the account setting for your user for the specified resource type.", + "input": { + "name": "serviceLongArnFormat" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + } + } + ] } }, "com.amazonaws.ecs#DeleteAccountSettingRequest": { @@ -3569,7 +3627,27 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified cluster. The cluster transitions to the INACTIVE\n\t\t\tstate. Clusters with an INACTIVE status might remain discoverable in your\n\t\t\taccount for a period of time. However, this behavior is subject to change in the future.\n\t\t\tWe don't recommend that you rely on INACTIVE clusters persisting.

\n

You must deregister all container instances from this cluster before you may delete\n\t\t\tit. You can list the container instances in a cluster with ListContainerInstances and deregister them with DeregisterContainerInstance.

" + "smithy.api#documentation": "

Deletes the specified cluster. The cluster transitions to the INACTIVE\n\t\t\tstate. Clusters with an INACTIVE status might remain discoverable in your\n\t\t\taccount for a period of time. However, this behavior is subject to change in the future.\n\t\t\tWe don't recommend that you rely on INACTIVE clusters persisting.

\n

You must deregister all container instances from this cluster before you may delete\n\t\t\tit. You can list the container instances in a cluster with ListContainerInstances and deregister them with DeregisterContainerInstance.

", + "smithy.api#examples": [ + { + "title": "To delete an empty cluster", + "documentation": "This example deletes an empty cluster in your default region.", + "input": { + "cluster": "my_cluster" + }, + "output": { + "cluster": { + "activeServicesCount": 0, + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster", + "clusterName": "my_cluster", + "pendingTasksCount": 0, + "registeredContainerInstancesCount": 0, + "runningTasksCount": 0, + "status": "INACTIVE" + } + } + } + ] } }, "com.amazonaws.ecs#DeleteClusterRequest": { @@ -3627,7 +3705,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a specified service within a cluster. You can delete a service if you have no\n\t\t\trunning tasks in it and the desired task count is zero. If the service is actively\n\t\t\tmaintaining tasks, you can't delete it, and you must update the service to a desired\n\t\t\ttask count of zero. For more information, see UpdateService.

\n \n

When you delete a service, if there are still running tasks that require cleanup,\n\t\t\t\tthe service status moves from ACTIVE to DRAINING, and the\n\t\t\t\tservice is no longer visible in the console or in the ListServices\n\t\t\t\tAPI operation. After all tasks have transitioned to either STOPPING or\n\t\t\t\t\tSTOPPED status, the service status moves from DRAINING\n\t\t\t\tto INACTIVE. Services in the DRAINING or\n\t\t\t\t\tINACTIVE status can still be viewed with the DescribeServices API operation. However, in the future,\n\t\t\t\t\tINACTIVE services may be cleaned up and purged from Amazon ECS record\n\t\t\t\tkeeping, and DescribeServices calls on those services return a\n\t\t\t\t\tServiceNotFoundException error.

\n
\n \n

If you attempt to create a new service with the same name as an existing service\n\t\t\t\tin either ACTIVE or DRAINING status, you receive an\n\t\t\t\terror.

\n
" + "smithy.api#documentation": "

Deletes a specified service within a cluster. You can delete a service if you have no\n\t\t\trunning tasks in it and the desired task count is zero. If the service is actively\n\t\t\tmaintaining tasks, you can't delete it, and you must update the service to a desired\n\t\t\ttask count of zero. For more information, see UpdateService.

\n \n

When you delete a service, if there are still running tasks that require cleanup,\n\t\t\t\tthe service status moves from ACTIVE to DRAINING, and the\n\t\t\t\tservice is no longer visible in the console or in the ListServices\n\t\t\t\tAPI operation. After all tasks have transitioned to either STOPPING or\n\t\t\t\t\tSTOPPED status, the service status moves from DRAINING\n\t\t\t\tto INACTIVE. Services in the DRAINING or\n\t\t\t\t\tINACTIVE status can still be viewed with the DescribeServices API operation. However, in the future,\n\t\t\t\t\tINACTIVE services may be cleaned up and purged from Amazon ECS record\n\t\t\t\tkeeping, and DescribeServices calls on those services return a\n\t\t\t\t\tServiceNotFoundException error.

\n
\n \n

If you attempt to create a new service with the same name as an existing service\n\t\t\t\tin either ACTIVE or DRAINING status, you receive an\n\t\t\t\terror.

\n
", + "smithy.api#examples": [ + { + "title": "To delete a service", + "documentation": "This example deletes the my-http-service service. The service must have a desired count and running count of 0 before you can delete it.", + "input": { + "service": "my-http-service" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#DeleteServiceRequest": { @@ -3694,7 +3782,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes one or more task definitions.

\n

You must deregister a task definition revision before you delete it. For more information,\n\t\t\tsee DeregisterTaskDefinition.

\n

When you delete a task definition revision, it is immediately transitions from the\n\t\tINACTIVE to DELETE_IN_PROGRESS. Existing tasks and services\n\t\tthat reference a DELETE_IN_PROGRESS task definition revision continue to run\n\t\twithout disruption. Existing services that reference a DELETE_IN_PROGRESS task\n\t\tdefinition revision can still scale up or down by modifying the service's desired\n\t\tcount.

\n

You can't use a DELETE_IN_PROGRESS task definition revision to run new tasks\n\t\t\tor create new services. You also can't update an existing service to reference a\n\t\t\tDELETE_IN_PROGRESS task definition revision.

\n

A task definition revision will stay in DELETE_IN_PROGRESS status until\n\t\t\tall the associated tasks and services have been terminated.

" + "smithy.api#documentation": "

Deletes one or more task definitions.

\n

You must deregister a task definition revision before you delete it. For more information,\n\t\t\tsee DeregisterTaskDefinition.

\n

When you delete a task definition revision, it is immediately transitions from the\n\t\tINACTIVE to DELETE_IN_PROGRESS. Existing tasks and services\n\t\tthat reference a DELETE_IN_PROGRESS task definition revision continue to run\n\t\twithout disruption. Existing services that reference a DELETE_IN_PROGRESS task\n\t\tdefinition revision can still scale up or down by modifying the service's desired\n\t\tcount.

\n

You can't use a DELETE_IN_PROGRESS task definition revision to run new tasks\n\t\t\tor create new services. You also can't update an existing service to reference a\n\t\t\tDELETE_IN_PROGRESS task definition revision.

\n

A task definition revision will stay in DELETE_IN_PROGRESS status until\n\t\t\tall the associated tasks and services have been terminated.

\n

When you delete all INACTIVE task definition revisions, the task definition name is not displayed in the console and not returned in the API. If a task definition revisions are in the DELETE_IN_PROGRESS state, the task definition name is displayed in the console and returned in the API. The task definition name is retained by Amazon ECS and the revision is incremented the next time you create a task definition with that name.

" } }, "com.amazonaws.ecs#DeleteTaskDefinitionsRequest": { @@ -3994,7 +4082,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

The deployment circuit breaker can only be used for services using the rolling\n\t\t\t\tupdate (ECS) deployment type.

\n
\n

The deployment circuit breaker determines whether a\n\t\t\tservice deployment will fail if the service can't reach a steady state. If it is turned on, a\n\t\t\tservice deployment will transition to a failed state and stop launching new tasks. You\n\t\t\tcan also configure Amazon ECS to roll back your service to the last completed deployment\n\t\t\tafter a failure. For more information, see Rolling\n\t\t\t\tupdate in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "\n

The deployment circuit breaker can only be used for services using the rolling\n\t\t\t\tupdate (ECS) deployment type.

\n
\n

The deployment circuit breaker determines whether a\n\t\t\tservice deployment will fail if the service can't reach a steady state. If it is turned on, a\n\t\t\tservice deployment will transition to a failed state and stop launching new tasks. You\n\t\t\tcan also configure Amazon ECS to roll back your service to the last completed deployment\n\t\t\tafter a failure. For more information, see Rolling\n\t\t\t\tupdate in the Amazon Elastic Container Service Developer Guide.

\n

For more information about API failure reasons, see API failure reasons in the Amazon Elastic Container Service Developer Guide.

" } }, "com.amazonaws.ecs#DeploymentConfiguration": { @@ -4119,7 +4207,19 @@ } ], "traits": { - "smithy.api#documentation": "

Deregisters an Amazon ECS container instance from the specified cluster. This instance is\n\t\t\tno longer available to run tasks.

\n

If you intend to use the container instance for some other purpose after\n\t\t\tderegistration, we recommend that you stop all of the tasks running on the container\n\t\t\tinstance before deregistration. That prevents any orphaned tasks from consuming\n\t\t\tresources.

\n

Deregistering a container instance removes the instance from a cluster, but it doesn't\n\t\t\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\n\t\t\tit in the Amazon EC2 console to stop billing.

\n \n

If you terminate a running container instance, Amazon ECS automatically deregisters the\n\t\t\t\tinstance from your cluster (stopped container instances or instances with\n\t\t\t\tdisconnected agents aren't automatically deregistered when terminated).

\n
" + "smithy.api#documentation": "

Deregisters an Amazon ECS container instance from the specified cluster. This instance is\n\t\t\tno longer available to run tasks.

\n

If you intend to use the container instance for some other purpose after\n\t\t\tderegistration, we recommend that you stop all of the tasks running on the container\n\t\t\tinstance before deregistration. That prevents any orphaned tasks from consuming\n\t\t\tresources.

\n

Deregistering a container instance removes the instance from a cluster, but it doesn't\n\t\t\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\n\t\t\tit in the Amazon EC2 console to stop billing.

\n \n

If you terminate a running container instance, Amazon ECS automatically deregisters the\n\t\t\t\tinstance from your cluster (stopped container instances or instances with\n\t\t\t\tdisconnected agents aren't automatically deregistered when terminated).

\n
", + "smithy.api#examples": [ + { + "title": "To deregister a container instance from a cluster", + "documentation": "This example deregisters a container instance from the specified cluster in your default region. If there are still tasks running on the container instance, you must either stop those tasks before deregistering, or use the force option.", + "input": { + "cluster": "default", + "force": true, + "containerInstance": "container_instance_UUID" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#DeregisterContainerInstanceRequest": { @@ -4316,7 +4416,28 @@ } ], "traits": { - "smithy.api#documentation": "

Describes one or more of your clusters.

" + "smithy.api#documentation": "

Describes one or more of your clusters.

", + "smithy.api#examples": [ + { + "title": "To describe a cluster", + "documentation": "This example provides a description of the specified cluster in your default region.", + "input": { + "clusters": [ + "default" + ] + }, + "output": { + "clusters": [ + { + "clusterName": "default", + "status": "ACTIVE", + "clusterArn": "arn:aws:ecs:us-east-1:aws_account_id:cluster/default" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#DescribeClustersRequest": { @@ -4382,7 +4503,91 @@ } ], "traits": { - "smithy.api#documentation": "

Describes one or more container instances. Returns metadata about each container\n\t\t\tinstance requested.

" + "smithy.api#documentation": "

Describes one or more container instances. Returns metadata about each container\n\t\t\tinstance requested.

", + "smithy.api#examples": [ + { + "title": "To describe container instance", + "documentation": "This example provides a description of the specified container instance in your default region, using the container instance UUID as an identifier.", + "input": { + "cluster": "default", + "containerInstances": [ + "f2756532-8f13-4d53-87c9-aed50dc94cd7" + ] + }, + "output": { + "failures": [], + "containerInstances": [ + { + "status": "ACTIVE", + "registeredResources": [ + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 2048, + "name": "CPU" + }, + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 3768, + "name": "MEMORY" + }, + { + "name": "PORTS", + "longValue": 0, + "doubleValue": 0.0, + "stringSetValue": [ + "2376", + "22", + "51678", + "2375" + ], + "type": "STRINGSET", + "integerValue": 0 + } + ], + "ec2InstanceId": "i-807f3249", + "agentConnected": true, + "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/f2756532-8f13-4d53-87c9-aed50dc94cd7", + "pendingTasksCount": 0, + "remainingResources": [ + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 1948, + "name": "CPU" + }, + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 3668, + "name": "MEMORY" + }, + { + "name": "PORTS", + "longValue": 0, + "doubleValue": 0.0, + "stringSetValue": [ + "2376", + "22", + "80", + "51678", + "2375" + ], + "type": "STRINGSET", + "integerValue": 0 + } + ], + "runningTasksCount": 1 + } + ] + } + } + ] } }, "com.amazonaws.ecs#DescribeContainerInstancesRequest": { @@ -4456,6 +4661,57 @@ ], "traits": { "smithy.api#documentation": "

Describes the specified services running in your cluster.

", + "smithy.api#examples": [ + { + "title": "To describe a service", + "documentation": "This example provides descriptive information about the service named ``ecs-simple-service``.", + "input": { + "services": [ + "ecs-simple-service" + ] + }, + "output": { + "failures": [], + "services": [ + { + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default", + "createdAt": "2016-08-29T16:25:52.130Z", + "deploymentConfiguration": { + "maximumPercent": 200, + "minimumHealthyPercent": 100 + }, + "deployments": [ + { + "createdAt": "2016-08-29T16:25:52.130Z", + "desiredCount": 1, + "id": "ecs-svc/9223370564341623665", + "pendingCount": 0, + "runningCount": 0, + "status": "PRIMARY", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:25:52.130Z" + } + ], + "desiredCount": 1, + "events": [ + { + "createdAt": "2016-08-29T16:25:58.520Z", + "id": "38c285e5-d335-4b68-8b15-e46dedc8e88d", + "message": "(service ecs-simple-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 3f4de1c5-ffdd-4954-af7e-75b4be0c8841) is already using a port required by your task. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide." + } + ], + "loadBalancers": [], + "pendingCount": 0, + "runningCount": 0, + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service", + "serviceName": "ecs-simple-service", + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6" + } + ] + } + } + ], "smithy.waiters#waitable": { "ServicesInactive": { "acceptors": [ @@ -4597,7 +4853,61 @@ } ], "traits": { - "smithy.api#documentation": "

Describes a task definition. You can specify a family and\n\t\t\t\trevision to find information about a specific task definition, or you\n\t\t\tcan simply specify the family to find the latest ACTIVE revision in that\n\t\t\tfamily.

\n \n

You can only describe INACTIVE task definitions while an active task\n\t\t\t\tor service references them.

\n
" + "smithy.api#documentation": "

Describes a task definition. You can specify a family and\n\t\t\t\trevision to find information about a specific task definition, or you\n\t\t\tcan simply specify the family to find the latest ACTIVE revision in that\n\t\t\tfamily.

\n \n

You can only describe INACTIVE task definitions while an active task\n\t\t\t\tor service references them.

\n
", + "smithy.api#examples": [ + { + "title": "To describe a task definition", + "documentation": "This example provides a description of the specified task definition.", + "input": { + "taskDefinition": "hello_world:8" + }, + "output": { + "taskDefinition": { + "family": "hello_world", + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/hello_world:8", + "containerDefinitions": [ + { + "mountPoints": [], + "name": "wordpress", + "links": [ + "mysql" + ], + "image": "wordpress", + "cpu": 10, + "environment": [], + "memory": 500, + "portMappings": [ + { + "containerPort": 80, + "hostPort": 80 + } + ], + "essential": true, + "volumesFrom": [] + }, + { + "mountPoints": [], + "name": "mysql", + "image": "mysql", + "cpu": 10, + "environment": [ + { + "name": "MYSQL_ROOT_PASSWORD", + "value": "password" + } + ], + "memory": 500, + "portMappings": [], + "volumesFrom": [], + "essential": true + } + ], + "volumes": [], + "revision": 8 + } + } + } + ] } }, "com.amazonaws.ecs#DescribeTaskDefinitionRequest": { @@ -4756,7 +5066,54 @@ } ], "traits": { - "smithy.api#documentation": "

Describes a specified task or tasks.

\n

Currently, stopped tasks appear in the returned results for at least one hour.

", + "smithy.api#documentation": "

Describes a specified task or tasks.

\n

Currently, stopped tasks appear in the returned results for at least one hour.

\n

If you have tasks with tags, and then delete the cluster, the tagged tasks are\n\t\t\treturned in the response. If you create a new cluster with the same name as the deleted\n\t\t\tcluster, the tagged tasks are not included in the response.

", + "smithy.api#examples": [ + { + "title": "To describe a task", + "documentation": "This example provides a description of the specified task, using the task UUID as an identifier.", + "input": { + "tasks": [ + "c5cba4eb-5dad-405e-96db-71ef8eefe6a8" + ] + }, + "output": { + "failures": [], + "tasks": [ + { + "taskArn": "arn:aws:ecs:::task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "overrides": { + "containerOverrides": [ + { + "name": "ecs-demo" + } + ] + }, + "lastStatus": "RUNNING", + "containerInstanceArn": "arn:aws:ecs:::container-instance/18f9eda5-27d7-4c19-b133-45adc516e8fb", + "clusterArn": "arn:aws:ecs:::cluster/default", + "desiredStatus": "RUNNING", + "taskDefinitionArn": "arn:aws:ecs:::task-definition/amazon-ecs-sample:1", + "startedBy": "ecs-svc/9223370608528463088", + "containers": [ + { + "containerArn": "arn:aws:ecs:::container/7c01765b-c588-45b3-8290-4ba38bd6c5a6", + "taskArn": "arn:aws:ecs:::task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "lastStatus": "RUNNING", + "name": "ecs-demo", + "networkBindings": [ + { + "bindIP": "0.0.0.0", + "containerPort": 80, + "hostPort": 80 + } + ] + } + ] + } + ] + } + } + ], "smithy.waiters#waitable": { "TasksRunning": { "acceptors": [ @@ -5174,7 +5531,7 @@ } }, "traits": { - "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can\n\t\t\tspecify up to ten environment files. The file must have a .env file\n\t\t\textension. Each line in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored. For more information about the environment variable file\n\t\t\tsyntax, see Declare default\n\t\t\t\tenvironment variables in file.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

This parameter is only supported for tasks hosted on Fargate using the\n\t\t\tfollowing platform versions:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
" + "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can\n\t\t\tspecify up to ten environment files. The file must have a .env file\n\t\t\textension. Each line in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored. For more information about the environment variable file\n\t\t\tsyntax, see Declare default\n\t\t\t\tenvironment variables in file.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

You must use the following platforms for the Fargate launch type:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
" } }, "com.amazonaws.ecs#EnvironmentFileType": { @@ -5586,7 +5943,29 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the protection status of tasks in an Amazon ECS service.

" + "smithy.api#documentation": "

Retrieves the protection status of tasks in an Amazon ECS service.

", + "smithy.api#examples": [ + { + "title": "To get the protection status of a task", + "documentation": "In this example, we get the protection status for a single task.", + "input": { + "cluster": "test-task-protection", + "tasks": [ + "b8b1cf532d0e46ba8d44a40d1de16772" + ] + }, + "output": { + "protectedTasks": [ + { + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/b8b1cf532d0e46ba8d44a40d1de16772", + "protectionEnabled": true, + "expirationDate": "2022-11-02T06:56:32.553Z" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#GetTaskProtectionRequest": { @@ -5672,7 +6051,7 @@ } }, "traits": { - "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated or\n\t\t\t\t\tthere's no container health check defined.

    \n
  • \n
\n

The following describes the possible healthStatus values for a task. The\n\t\t\tcontainer health check status of\n\t\t\tnon-essential containers don't have an effect on the health status of a task.

\n
    \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-The essential containers within the task are still\n\t\t\t\t\thaving their health checks evaluated, there are only nonessential containers\n\t\t\t\t\twith health checks defined, or there are no container health checks\n\t\t\t\t\tdefined.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" + "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The health check is designed to make sure that your containers survive\n\t\t\tagent restarts, upgrades, or temporary unavailability.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated or\n\t\t\t\t\tthere's no container health check defined.

    \n
  • \n
\n

The following describes the possible healthStatus values for a task. The\n\t\t\tcontainer health check status of\n\t\t\tnon-essential containers don't have an effect on the health status of a task.

\n
    \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-The essential containers within the task are still\n\t\t\t\t\thaving their health checks evaluated, there are only nonessential containers\n\t\t\t\t\twith health checks defined, or there are no container health checks\n\t\t\t\t\tdefined.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    When the Amazon ECS agent cannot connect to the Amazon ECS service, the\n\t\t\t\t\tservice reports the container as UNHEALTHY.

    \n
  • \n
  • \n

    The health check statuses are the \"last heard from\" response from the Amazon ECS agent. There\n\t\t\t\t\tare no assumptions made about the status of the container health checks.

    \n
  • \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" } }, "com.amazonaws.ecs#HealthStatus": { @@ -6059,6 +6438,34 @@ ], "traits": { "smithy.api#documentation": "

Lists the account settings for a specified principal.

", + "smithy.api#examples": [ + { + "title": "To view your effective account settings", + "documentation": "This example displays the effective account settings for your account.", + "input": { + "effectiveSettings": true + }, + "output": { + "settings": [ + { + "name": "containerInstanceLongArnFormat", + "value": "disabled", + "principalArn": "arn:aws:iam:::user/principalName" + }, + { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + }, + { + "name": "taskLongArnFormat", + "value": "disabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6245,6 +6652,18 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of existing clusters.

", + "smithy.api#examples": [ + { + "title": "To list your available clusters", + "documentation": "This example lists all of your available clusters in your default region.", + "output": { + "clusterArns": [ + "arn:aws:ecs:us-east-1::cluster/test", + "arn:aws:ecs:us-east-1::cluster/default" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6317,6 +6736,21 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of container instances in a specified cluster. You can filter the\n\t\t\tresults of a ListContainerInstances operation with cluster query language\n\t\t\tstatements inside the filter parameter. For more information, see Cluster Query Language in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list your available container instances in a cluster", + "documentation": "This example lists all of your available container instances in the specified cluster in your default region.", + "input": { + "cluster": "default" + }, + "output": { + "containerInstanceArns": [ + "arn:aws:ecs:us-east-1::container-instance/f6bbb147-5370-4ace-8c73-c7181ded911f", + "arn:aws:ecs:us-east-1::container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6407,6 +6841,17 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of services. You can filter the results by cluster, launch type, and\n\t\t\tscheduling strategy.

", + "smithy.api#examples": [ + { + "title": "To list the services in a cluster", + "documentation": "This example lists the services running in the default cluster for an account.", + "output": { + "serviceArns": [ + "arn:aws:ecs:us-east-1:012345678910:service/my-http-service" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6575,7 +7020,24 @@ } ], "traits": { - "smithy.api#documentation": "

List the tags for an Amazon ECS resource.

" + "smithy.api#documentation": "

List the tags for an Amazon ECS resource.

", + "smithy.api#examples": [ + { + "title": "To list the tags for a cluster.", + "documentation": "This example lists the tags for the 'dev' cluster.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev" + }, + "output": { + "tags": [ + { + "key": "team", + "value": "dev" + } + ] + } + } + ] } }, "com.amazonaws.ecs#ListTagsForResourceRequest": { @@ -6628,6 +7090,20 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of task definition families that are registered to your account. This\n\t\t\tlist includes task definition families that no longer have any ACTIVE task\n\t\t\tdefinition revisions.

\n

You can filter out task definition families that don't contain any ACTIVE\n\t\t\ttask definition revisions by setting the status parameter to\n\t\t\t\tACTIVE. You can also filter the results with the\n\t\t\t\tfamilyPrefix parameter.

", + "smithy.api#examples": [ + { + "title": "To list your registered task definition families", + "documentation": "This example lists all of your registered task definition families.", + "output": { + "families": [ + "node-js-app", + "web-timer", + "hpcc", + "hpcc-c4-8xlarge" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6709,6 +7185,22 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of task definitions that are registered to your account. You can filter\n\t\t\tthe results by family name with the familyPrefix parameter or by status\n\t\t\twith the status parameter.

", + "smithy.api#examples": [ + { + "title": "To list your registered task definitions", + "documentation": "This example lists all of your registered task definitions.", + "output": { + "taskDefinitionArns": [ + "arn:aws:ecs:us-east-1::task-definition/sleep300:2", + "arn:aws:ecs:us-east-1::task-definition/sleep360:1", + "arn:aws:ecs:us-east-1::task-definition/wordpress:3", + "arn:aws:ecs:us-east-1::task-definition/wordpress:4", + "arn:aws:ecs:us-east-1::task-definition/wordpress:5", + "arn:aws:ecs:us-east-1::task-definition/wordpress:6" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6801,7 +7293,22 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a list of tasks. You can filter the results by cluster, task definition\n\t\t\tfamily, container instance, launch type, what IAM principal started the task, or by the\n\t\t\tdesired status of the task.

\n

Recently stopped tasks might appear in the returned results. Currently, stopped tasks\n\t\t\tappear in the returned results for at least one hour.

", + "smithy.api#documentation": "

Returns a list of tasks. You can filter the results by cluster, task definition\n\t\t\tfamily, container instance, launch type, what IAM principal started the task, or by the\n\t\t\tdesired status of the task.

\n

Recently stopped tasks might appear in the returned results.

", + "smithy.api#examples": [ + { + "title": "To list the tasks in a cluster", + "documentation": "This example lists all of the tasks in a cluster.", + "input": { + "cluster": "default" + }, + "output": { + "taskArns": [ + "arn:aws:ecs:us-east-1:012345678910:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84", + "arn:aws:ecs:us-east-1:012345678910:task/6b809ef6-c67e-4467-921f-ee261c15a0a1" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6898,13 +7405,13 @@ "targetGroupArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\n\t\t\ttask set.

\n

A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer. If you're using a\n\t\t\tClassic Load Balancer, omit the target group ARN.

\n

For services using the ECS deployment controller, you can specify one or\n\t\t\tmultiple target groups. For more information, see Registering multiple target groups with a service in\n\t\t\tthe Amazon Elastic Container Service Developer Guide.

\n

For services using the CODE_DEPLOY deployment controller, you're required\n\t\t\tto define two target groups for the load balancer. For more information, see Blue/green deployment with CodeDeploy in the\n\t\t\tAmazon Elastic Container Service Developer Guide.

\n \n

If your service's task definition uses the awsvpc network mode, you\n\t\t\t\tmust choose ip as the target type, not instance. Do this\n\t\t\t\twhen creating your target groups because tasks that use the awsvpc\n\t\t\t\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\n\t\t\t\tinstance. This network mode is required for the Fargate launch\n\t\t\t\ttype.

\n
" + "smithy.api#documentation": "

The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\n\t\t\ttask set.

\n

A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer.

\n

For services using the ECS deployment controller, you can specify one or\n\t\t\tmultiple target groups. For more information, see Registering multiple target groups with a service in\n\t\t\tthe Amazon Elastic Container Service Developer Guide.

\n

For services using the CODE_DEPLOY deployment controller, you're required\n\t\t\tto define two target groups for the load balancer. For more information, see Blue/green deployment with CodeDeploy in the\n\t\t\tAmazon Elastic Container Service Developer Guide.

\n \n

If your service's task definition uses the awsvpc network mode, you\n\t\t\t\tmust choose ip as the target type, not instance. Do this\n\t\t\t\twhen creating your target groups because tasks that use the awsvpc\n\t\t\t\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\n\t\t\t\tinstance. This network mode is required for the Fargate launch\n\t\t\t\ttype.

\n
" } }, "loadBalancerName": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The name of the load balancer to associate with the Amazon ECS service or task set.

\n

A load balancer name is only specified when using a Classic Load Balancer. If you are using an Application Load Balancer\n\t\t\tor a Network Load Balancer the load balancer name parameter should be omitted.

" + "smithy.api#documentation": "

The name of the load balancer to associate with the Amazon ECS service or task set.

\n

If you are using an Application Load Balancer or a Network Load Balancer the load balancer name parameter should be\n\t\t\tomitted.

" } }, "containerName": { @@ -6954,7 +7461,7 @@ } }, "traits": { - "smithy.api#documentation": "

The log configuration for the container. This parameter maps to LogConfig\n\t\t\tin the Create a container section of the Docker Remote API and the\n\t\t\t\t--log-driver option to \n docker\n\t\t\t\t\trun\n .

\n

By default, containers use the same logging driver that the Docker daemon uses.\n\t\t\tHowever, the container might use a different logging driver than the Docker daemon by\n\t\t\tspecifying a log driver configuration in the container definition. For more information\n\t\t\tabout the options for different supported log drivers, see Configure logging\n\t\t\t\tdrivers in the Docker documentation.

\n

Understand the following when specifying a log configuration for your\n\t\t\tcontainers.

\n
    \n
  • \n

    Amazon ECS currently supports a subset of the logging drivers available to the\n\t\t\t\t\tDocker daemon (shown in the valid values below). Additional log drivers may be\n\t\t\t\t\tavailable in future releases of the Amazon ECS container agent.

    \n
  • \n
  • \n

    This parameter requires version 1.18 of the Docker Remote API or greater on\n\t\t\t\t\tyour container instance.

    \n
  • \n
  • \n

    For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\n\t\t\t\t\tregister the available logging drivers with the\n\t\t\t\t\t\tECS_AVAILABLE_LOGGING_DRIVERS environment variable before\n\t\t\t\t\tcontainers placed on that instance can use these log configuration options. For\n\t\t\t\t\tmore information, see Amazon ECS container agent configuration in the\n\t\t\t\t\tAmazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    For tasks that are on Fargate, because you don't have access to the\n\t\t\t\t\tunderlying infrastructure your tasks are hosted on, any additional software\n\t\t\t\t\tneeded must be installed outside of the task. For example, the Fluentd output\n\t\t\t\t\taggregators or a remote host running Logstash to send Gelf logs to.

    \n
  • \n
" + "smithy.api#documentation": "

The log configuration for the container. This parameter maps to LogConfig\n\t\t\tin the Create a container section of the Docker Remote API and the\n\t\t\t\t--log-driver option to \n docker\n\t\t\t\t\trun\n .

\n

By default, containers use the same logging driver that the Docker daemon uses.\n\t\t\tHowever, the container might use a different logging driver than the Docker daemon by\n\t\t\tspecifying a log driver configuration in the container definition. For more information\n\t\t\tabout the options for different supported log drivers, see Configure logging\n\t\t\t\tdrivers in the Docker documentation.

\n

Understand the following when specifying a log configuration for your\n\t\t\tcontainers.

\n
    \n
  • \n

    Amazon ECS currently supports a subset of the logging drivers available to the Docker daemon.\n\t\t\t\t\tAdditional log drivers may be available in future releases of the Amazon ECS\n\t\t\t\t\tcontainer agent.

    \n

    For tasks on Fargate, the supported log drivers are awslogs,\n\t\t\t\t\t\tsplunk, and awsfirelens.

    \n

    For tasks hosted on Amazon EC2 instances, the supported log drivers are\n\t\t\t\t\t\tawslogs, fluentd, gelf,\n\t\t\t\t\t\tjson-file, journald,\n\t\t\t\t\t\tlogentries,syslog, splunk, and\n\t\t\t\t\t\tawsfirelens.

    \n
  • \n
  • \n

    This parameter requires version 1.18 of the Docker Remote API or greater on\n\t\t\t\t\tyour container instance.

    \n
  • \n
  • \n

    For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\n\t\t\t\t\tregister the available logging drivers with the\n\t\t\t\t\t\tECS_AVAILABLE_LOGGING_DRIVERS environment variable before\n\t\t\t\t\tcontainers placed on that instance can use these log configuration options. For\n\t\t\t\t\tmore information, see Amazon ECS container agent configuration in the\n\t\t\t\t\tAmazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    For tasks that are on Fargate, because you don't have access to the\n\t\t\t\t\tunderlying infrastructure your tasks are hosted on, any additional software\n\t\t\t\t\tneeded must be installed outside of the task. For example, the Fluentd output\n\t\t\t\t\taggregators or a remote host running Logstash to send Gelf logs to.

    \n
  • \n
" } }, "com.amazonaws.ecs#LogConfigurationOptionsMap": { @@ -7139,7 +7646,7 @@ "maximumScalingStepSize": { "target": "com.amazonaws.ecs#ManagedScalingStepSize", "traits": { - "smithy.api#documentation": "

The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale\n\t\t\tin process is not affected by this parameter. If this parameter is omitted, the default\n\t\t\tvalue of 1 is used.

" + "smithy.api#documentation": "

The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale in\n\t\t\tprocess is not affected by this parameter. If this parameter is omitted, the default\n\t\t\tvalue of 10000 is used.

" } }, "instanceWarmupPeriod": { @@ -7644,7 +8151,7 @@ "hostPort": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

The port number on the container instance to reserve for your container.

\n

If you specify a containerPortRange, leave this field empty and the value of\n\t\t\tthe hostPort is set as follows:

\n
    \n
  • \n

    For containers in a task with the awsvpc network mode, the\n\t\t\t\t\t\thostPort is set to the same value as the\n\t\t\t\t\t\tcontainerPort. This is a static mapping strategy.

    \n
  • \n
  • \n

    For containers in a task with the bridge network mode, the Amazon ECS agent finds\n\t\t\t\t\topen ports on the host and automatically binds them to the container ports. This\n\t\t\t\t\tis a dynamic mapping strategy.

    \n
  • \n
\n

If you use containers in a task with the awsvpc or host\n\t\t\tnetwork mode, the hostPort can either be left blank or set to the same\n\t\t\tvalue as the containerPort.

\n

If you use containers in a task with the bridge network mode, you can\n\t\t\tspecify a non-reserved host port for your container port mapping, or you can omit the\n\t\t\t\thostPort (or set it to 0) while specifying a\n\t\t\t\tcontainerPort and your container automatically receives a port in the\n\t\t\tephemeral port range for your container instance operating system and Docker\n\t\t\tversion.

\n

The default ephemeral port range for Docker version 1.6.0 and later is listed on the\n\t\t\tinstance under /proc/sys/net/ipv4/ip_local_port_range. If this kernel\n\t\t\tparameter is unavailable, the default ephemeral port range from 49153 through 65535 is\n\t\t\tused. Do not attempt to specify a host port in the ephemeral port range as these are\n\t\t\treserved for automatic assignment. In general, ports below 32768 are outside of the\n\t\t\tephemeral port range.

\n

The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\n\t\t\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\n\t\t\ta running task is also reserved while the task is running. That is, after a task stops,\n\t\t\tthe host port is released. The current reserved ports are displayed in the\n\t\t\tremainingResources of DescribeContainerInstances\n\t\t\toutput. A container instance can have up to 100 reserved ports at a time. This number\n\t\t\tincludes the default reserved ports. Automatically assigned ports aren't included in the\n\t\t\t100 reserved ports quota.

" + "smithy.api#documentation": "

The port number on the container instance to reserve for your container.

\n

If you specify a containerPortRange, leave this field empty and the value of\n\t\t\tthe hostPort is set as follows:

\n
    \n
  • \n

    For containers in a task with the awsvpc network mode, the\n\t\t\t\t\t\thostPort is set to the same value as the\n\t\t\t\t\t\tcontainerPort. This is a static mapping strategy.

    \n
  • \n
  • \n

    For containers in a task with the bridge network mode, the Amazon ECS agent finds\n\t\t\t\t\topen ports on the host and automatically binds them to the container ports. This\n\t\t\t\t\tis a dynamic mapping strategy.

    \n
  • \n
\n

If you use containers in a task with the awsvpc or host\n\t\t\tnetwork mode, the hostPort can either be left blank or set to the same\n\t\t\tvalue as the containerPort.

\n

If you use containers in a task with the bridge network mode, you can\n\t\t\tspecify a non-reserved host port for your container port mapping, or you can omit the\n\t\t\t\thostPort (or set it to 0) while specifying a\n\t\t\t\tcontainerPort and your container automatically receives a port in the\n\t\t\tephemeral port range for your container instance operating system and Docker\n\t\t\tversion.

\n

The default ephemeral port range for Docker version 1.6.0 and later is listed on the\n\t\t\tinstance under /proc/sys/net/ipv4/ip_local_port_range. If this kernel\n\t\t\tparameter is unavailable, the default ephemeral port range from 49153 through 65535\n\t\t\t(Linux) or 49152 through 65535 (Windows) is used. Do not attempt to specify a host port\n\t\t\tin the ephemeral port range as these are reserved for automatic assignment. In general,\n\t\t\tports below 32768 are outside of the ephemeral port range.

\n

The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\n\t\t\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\n\t\t\ta running task is also reserved while the task is running. That is, after a task stops,\n\t\t\tthe host port is released. The current reserved ports are displayed in the\n\t\t\tremainingResources of DescribeContainerInstances\n\t\t\toutput. A container instance can have up to 100 reserved ports at a time. This number\n\t\t\tincludes the default reserved ports. Automatically assigned ports aren't included in the\n\t\t\t100 reserved ports quota.

" } }, "protocol": { @@ -7811,7 +8318,24 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat are specified, the Amazon Resource Name\n\t\t\t(ARN) and resource ID format of the resource type for a specified user, role, or\n\t\t\tthe root user for an account is affected. The opt-in and opt-out account setting must be\n\t\t\tset for each Amazon ECS resource separately. The ARN and resource ID format of a resource\n\t\t\tis defined by the opt-in status of the user or role that created the resource. You\n\t\t\tmust turn on this setting to use Amazon ECS features such as resource tagging.

\n

When awsvpcTrunking is specified, the elastic network interface (ENI)\n\t\t\tlimit for any new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support the\n\t\t\tfeature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When containerInsights is specified, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

" + "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat are specified, the Amazon Resource Name\n\t\t\t(ARN) and resource ID format of the resource type for a specified user, role, or\n\t\t\tthe root user for an account is affected. The opt-in and opt-out account setting must be\n\t\t\tset for each Amazon ECS resource separately. The ARN and resource ID format of a resource\n\t\t\tis defined by the opt-in status of the user or role that created the resource. You\n\t\t\tmust turn on this setting to use Amazon ECS features such as resource tagging.

\n

When awsvpcTrunking is specified, the elastic network interface (ENI)\n\t\t\tlimit for any new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support the\n\t\t\tfeature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When containerInsights is specified, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#examples": [ + { + "title": "To modify your account settings", + "documentation": "This example modifies your account settings to opt in to the new ARN and resource ID format for Amazon ECS services. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.", + "input": { + "name": "serviceLongArnFormat", + "value": "enabled" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + } + } + ] } }, "com.amazonaws.ecs#PutAccountSettingDefault": { @@ -7834,7 +8358,24 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting for all users on an account for whom no individual\n\t\t\taccount setting has been specified. Account settings are set on a per-Region\n\t\t\tbasis.

" + "smithy.api#documentation": "

Modifies an account setting for all users on an account for whom no individual\n\t\t\taccount setting has been specified. Account settings are set on a per-Region\n\t\t\tbasis.

", + "smithy.api#examples": [ + { + "title": "To modify the default account settings for all IAM users or roles on an account", + "documentation": "This example modifies the default account setting for the specified resource for all IAM users or roles on an account. These changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.", + "input": { + "name": "serviceLongArnFormat", + "value": "enabled" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::root" + } + } + } + ] } }, "com.amazonaws.ecs#PutAccountSettingDefaultRequest": { @@ -8170,7 +8711,56 @@ } ], "traits": { - "smithy.api#documentation": "

Registers a new task definition from the supplied family and\n\t\t\t\tcontainerDefinitions. Optionally, you can add data volumes to your\n\t\t\tcontainers with the volumes parameter. For more information about task\n\t\t\tdefinition parameters and defaults, see Amazon ECS Task\n\t\t\t\tDefinitions in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a role for your task with the taskRoleArn parameter.\n\t\t\tWhen you specify a role for a task, its containers can then use the latest versions\n\t\t\tof the CLI or SDKs to make API requests to the Amazon Web Services services that are specified in\n\t\t\tthe policy that's associated with the role. For more information, see IAM\n\t\t\t\tRoles for Tasks in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a Docker networking mode for the containers in your task definition\n\t\t\twith the networkMode parameter. The available network modes correspond to\n\t\t\tthose described in Network\n\t\t\t\tsettings in the Docker run reference. If you specify the awsvpc\n\t\t\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\n\t\t\t\tNetworkConfiguration when you create a service or run a task with\n\t\t\tthe task definition. For more information, see Task Networking\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Registers a new task definition from the supplied family and\n\t\t\t\tcontainerDefinitions. Optionally, you can add data volumes to your\n\t\t\tcontainers with the volumes parameter. For more information about task\n\t\t\tdefinition parameters and defaults, see Amazon ECS Task\n\t\t\t\tDefinitions in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a role for your task with the taskRoleArn parameter.\n\t\t\tWhen you specify a role for a task, its containers can then use the latest versions\n\t\t\tof the CLI or SDKs to make API requests to the Amazon Web Services services that are specified in\n\t\t\tthe policy that's associated with the role. For more information, see IAM\n\t\t\t\tRoles for Tasks in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a Docker networking mode for the containers in your task definition\n\t\t\twith the networkMode parameter. The available network modes correspond to\n\t\t\tthose described in Network\n\t\t\t\tsettings in the Docker run reference. If you specify the awsvpc\n\t\t\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\n\t\t\t\tNetworkConfiguration when you create a service or run a task with\n\t\t\tthe task definition. For more information, see Task Networking\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To register a task definition", + "documentation": "This example registers a task definition to the specified family.", + "input": { + "family": "sleep360", + "taskRoleArn": "", + "containerDefinitions": [ + { + "name": "sleep", + "image": "busybox", + "cpu": 10, + "command": [ + "sleep", + "360" + ], + "memory": 10, + "essential": true + } + ], + "volumes": [] + }, + "output": { + "taskDefinition": { + "volumes": [], + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:19", + "containerDefinitions": [ + { + "environment": [], + "name": "sleep", + "mountPoints": [], + "image": "busybox", + "cpu": 10, + "portMappings": [], + "command": [ + "sleep", + "360" + ], + "memory": 10, + "essential": true, + "volumesFrom": [] + } + ], + "family": "sleep360", + "revision": 1 + } + } + } + ] } }, "com.amazonaws.ecs#RegisterTaskDefinitionRequest": { @@ -8486,7 +9076,43 @@ } ], "traits": { - "smithy.api#documentation": "

Starts a new task using the specified task definition.

\n

You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\n\t\t\ttasks using placement constraints and placement strategies. For more information, see\n\t\t\t\tScheduling Tasks in the Amazon Elastic Container Service Developer Guide.

\n

Alternatively, you can use StartTask to use your own scheduler or\n\t\t\tplace tasks manually on specific container instances.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

The Amazon ECS API follows an eventual consistency model. This is because of the\n\t\t\tdistributed nature of the system supporting the API. This means that the result of an\n\t\t\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\n\t\t\tto all subsequent commands you run. Keep this in mind when you carry out an API command\n\t\t\tthat immediately follows a previous API command.

\n

To manage eventual consistency, you can do the following:

\n
    \n
  • \n

    Confirm the state of the resource before you run a command to modify it. Run\n\t\t\t\t\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\n\t\t\t\t\tyou allow enough time for the previous command to propagate through the system.\n\t\t\t\t\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\n\t\t\t\t\tseconds of wait time and increasing gradually up to five minutes of wait\n\t\t\t\t\ttime.

    \n
  • \n
  • \n

    Add wait time between subsequent commands, even if the DescribeTasks command\n\t\t\t\t\treturns an accurate response. Apply an exponential backoff algorithm starting\n\t\t\t\t\twith a couple of seconds of wait time, and increase gradually up to about five\n\t\t\t\t\tminutes of wait time.

    \n
  • \n
" + "smithy.api#documentation": "

Starts a new task using the specified task definition.

\n

You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\n\t\t\ttasks using placement constraints and placement strategies. For more information, see\n\t\t\t\tScheduling Tasks in the Amazon Elastic Container Service Developer Guide.

\n

Alternatively, you can use StartTask to use your own scheduler or\n\t\t\tplace tasks manually on specific container instances.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

The Amazon ECS API follows an eventual consistency model. This is because of the\n\t\t\tdistributed nature of the system supporting the API. This means that the result of an\n\t\t\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\n\t\t\tto all subsequent commands you run. Keep this in mind when you carry out an API command\n\t\t\tthat immediately follows a previous API command.

\n

To manage eventual consistency, you can do the following:

\n
    \n
  • \n

    Confirm the state of the resource before you run a command to modify it. Run\n\t\t\t\t\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\n\t\t\t\t\tyou allow enough time for the previous command to propagate through the system.\n\t\t\t\t\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\n\t\t\t\t\tseconds of wait time and increasing gradually up to five minutes of wait\n\t\t\t\t\ttime.

    \n
  • \n
  • \n

    Add wait time between subsequent commands, even if the DescribeTasks command\n\t\t\t\t\treturns an accurate response. Apply an exponential backoff algorithm starting\n\t\t\t\t\twith a couple of seconds of wait time, and increase gradually up to about five\n\t\t\t\t\tminutes of wait time.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To run a task on your default cluster", + "documentation": "This example runs the specified task definition on your default cluster.", + "input": { + "cluster": "default", + "taskDefinition": "sleep360:1" + }, + "output": { + "tasks": [ + { + "taskArn": "arn:aws:ecs:us-east-1::task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "overrides": { + "containerOverrides": [ + { + "name": "sleep" + } + ] + }, + "lastStatus": "PENDING", + "containerInstanceArn": "arn:aws:ecs:us-east-1::container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb", + "desiredStatus": "RUNNING", + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:1", + "containers": [ + { + "containerArn": "arn:aws:ecs:us-east-1::container/58591c8e-be29-4ddf-95aa-ee459d4c59fd", + "taskArn": "arn:aws:ecs:us-east-1::task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "lastStatus": "PENDING", + "name": "sleep" + } + ] + } + ] + } + } + ] } }, "com.amazonaws.ecs#RunTaskRequest": { @@ -9903,7 +10529,23 @@ } ], "traits": { - "smithy.api#documentation": "

Associates the specified tags to a resource with the specified\n\t\t\t\tresourceArn. If existing tags on a resource aren't specified in the\n\t\t\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\n\t\t\tassociated with that resource are deleted as well.

" + "smithy.api#documentation": "

Associates the specified tags to a resource with the specified\n\t\t\t\tresourceArn. If existing tags on a resource aren't specified in the\n\t\t\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\n\t\t\tassociated with that resource are deleted as well.

", + "smithy.api#examples": [ + { + "title": "To tag a cluster.", + "documentation": "This example tags the 'dev' cluster with key 'team' and value 'dev'.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev", + "tags": [ + { + "key": "team", + "value": "dev" + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#TagResourceRequest": { @@ -10161,7 +10803,7 @@ "stopCode": { "target": "com.amazonaws.ecs#TaskStopCode", "traits": { - "smithy.api#documentation": "

The stop code indicating why a task was stopped. The stoppedReason might\n\t\t\tcontain additional details.

\n

The following are valid values:

\n
    \n
  • \n

    \n TaskFailedToStart\n

    \n
  • \n
  • \n

    \n EssentialContainerExited\n

    \n
  • \n
  • \n

    \n UserInitiated\n

    \n
  • \n
  • \n

    \n TerminationNotice\n

    \n
  • \n
  • \n

    \n ServiceSchedulerInitiated\n

    \n
  • \n
  • \n

    \n SpotInterruption\n

    \n
  • \n
" + "smithy.api#documentation": "

The stop code indicating why a task was stopped. The stoppedReason might\n\t\t\tcontain additional details.

\n

For more information about stop code, see Stopped tasks error codes in the Amazon ECS User Guide.

\n

The following are valid values:

\n
    \n
  • \n

    \n TaskFailedToStart\n

    \n
  • \n
  • \n

    \n EssentialContainerExited\n

    \n
  • \n
  • \n

    \n UserInitiated\n

    \n
  • \n
  • \n

    \n TerminationNotice\n

    \n
  • \n
  • \n

    \n ServiceSchedulerInitiated\n

    \n
  • \n
  • \n

    \n SpotInterruption\n

    \n
  • \n
" } }, "stoppedAt": { @@ -10179,7 +10821,7 @@ "stoppingAt": { "target": "com.amazonaws.ecs#Timestamp", "traits": { - "smithy.api#documentation": "

The Unix timestamp for the time when the task stops. More specifically, it's for the\n\t\t\ttime when the task transitions from the RUNNING state to\n\t\t\t\tSTOPPED.

" + "smithy.api#documentation": "

The Unix timestamp for the time when the task stops. More specifically, it's for the\n\t\t\ttime when the task transitions from the RUNNING state to\n\t\t\t\tSTOPPING.

" } }, "tags": { @@ -10303,7 +10945,7 @@ "requiresCompatibilities": { "target": "com.amazonaws.ecs#CompatibilityList", "traits": { - "smithy.api#documentation": "

The task launch types the task definition was validated against. For more information, see Amazon ECS launch types\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

The task launch types the task definition was validated against. The valid values are\n\t\t\t\tEC2, FARGATE, and EXTERNAL. For more\n\t\t\tinformation, see Amazon ECS launch types\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" } }, "cpu": { @@ -11006,7 +11648,20 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes specified tags from a resource.

" + "smithy.api#documentation": "

Deletes specified tags from a resource.

", + "smithy.api#examples": [ + { + "title": "To untag a cluster.", + "documentation": "This example deletes the 'team' tag from the 'dev' cluster.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev", + "tagKeys": [ + "team" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#UntagResourceRequest": { @@ -11432,7 +12087,18 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies the parameters of a service.

\n

For services using the rolling update (ECS) you can update the desired\n\t\t\tcount, deployment configuration, network configuration, load balancers, service\n\t\t\tregistries, enable ECS managed tags option, propagate tags option, task placement\n\t\t\tconstraints and strategies, and task definition. When you update any of these\n\t\t\tparameters, Amazon ECS starts new tasks with the new configuration.

\n

For services using the blue/green (CODE_DEPLOY) deployment controller,\n\t\t\tonly the desired count, deployment configuration, health check grace period, task\n\t\t\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\n\t\t\tcan be updated using this API. If the network configuration, platform version, task\n\t\t\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\n\t\t\tinformation, see CreateDeployment in the CodeDeploy API Reference.

\n

For services using an external deployment controller, you can update only the desired\n\t\t\tcount, task placement constraints and strategies, health check grace period, enable ECS\n\t\t\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\n\t\t\tbalancer, network configuration, platform version, or task definition need to be\n\t\t\tupdated, create a new task set For more information, see CreateTaskSet.

\n

You can add to or subtract from the number of instantiations of a task definition in a\n\t\t\tservice by specifying the cluster that the service is running in and a new\n\t\t\t\tdesiredCount parameter.

\n

If you have updated the Docker image of your application, you can create a new task\n\t\t\tdefinition with that image and deploy it to your service. The service scheduler uses the\n\t\t\tminimum healthy percent and maximum percent parameters (in the service's deployment\n\t\t\tconfiguration) to determine the deployment strategy.

\n \n

If your updated Docker image uses the same tag as what is in the existing task\n\t\t\t\tdefinition for your service (for example, my_image:latest), you don't\n\t\t\t\tneed to create a new revision of your task definition. You can update the service\n\t\t\t\tusing the forceNewDeployment option. The new tasks launched by the\n\t\t\t\tdeployment pull the current image/tag combination from your repository when they\n\t\t\t\tstart.

\n
\n

You can also update the deployment configuration of a service. When a deployment is\n\t\t\ttriggered by updating the task definition of a service, the service scheduler uses the\n\t\t\tdeployment configuration parameters, minimumHealthyPercent and\n\t\t\t\tmaximumPercent, to determine the deployment strategy.

\n
    \n
  • \n

    If minimumHealthyPercent is below 100%, the scheduler can ignore\n\t\t\t\t\t\tdesiredCount temporarily during a deployment. For example, if\n\t\t\t\t\t\tdesiredCount is four tasks, a minimum of 50% allows the\n\t\t\t\t\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\n\t\t\t\t\tservices that don't use a load balancer are considered healthy if they're in the\n\t\t\t\t\t\tRUNNING state. Tasks for services that use a load balancer are\n\t\t\t\t\tconsidered healthy if they're in the RUNNING state and are reported\n\t\t\t\t\tas healthy by the load balancer.

    \n
  • \n
  • \n

    The maximumPercent parameter represents an upper limit on the\n\t\t\t\t\tnumber of running tasks during a deployment. You can use it to define the\n\t\t\t\t\tdeployment batch size. For example, if desiredCount is four tasks,\n\t\t\t\t\ta maximum of 200% starts four new tasks before stopping the four older tasks\n\t\t\t\t\t(provided that the cluster resources required to do this are available).

    \n
  • \n
\n

When UpdateService stops a task during a deployment, the equivalent\n\t\t\tof docker stop is issued to the containers running in the task. This\n\t\t\tresults in a SIGTERM and a 30-second timeout. After this,\n\t\t\t\tSIGKILL is sent and the containers are forcibly stopped. If the\n\t\t\tcontainer handles the SIGTERM gracefully and exits within 30 seconds from\n\t\t\treceiving it, no SIGKILL is sent.

\n

When the service scheduler launches new tasks, it determines task placement in your\n\t\t\tcluster with the following logic.

\n
    \n
  • \n

    Determine which of the container instances in your cluster can support your\n\t\t\t\t\tservice's task definition. For example, they have the required CPU, memory,\n\t\t\t\t\tports, and container instance attributes.

    \n
  • \n
  • \n

    By default, the service scheduler attempts to balance tasks across\n\t\t\t\t\tAvailability Zones in this manner even though you can choose a different\n\t\t\t\t\tplacement strategy.

    \n
      \n
    • \n

      Sort the valid container instances by the fewest number of running\n\t\t\t\t\t\t\ttasks for this service in the same Availability Zone as the instance.\n\t\t\t\t\t\t\tFor example, if zone A has one running service task and zones B and C\n\t\t\t\t\t\t\teach have zero, valid container instances in either zone B or C are\n\t\t\t\t\t\t\tconsidered optimal for placement.

      \n
    • \n
    • \n

      Place the new service task on a valid container instance in an optimal\n\t\t\t\t\t\t\tAvailability Zone (based on the previous steps), favoring container\n\t\t\t\t\t\t\tinstances with the fewest number of running tasks for this\n\t\t\t\t\t\t\tservice.

      \n
    • \n
    \n
  • \n
\n

When the service scheduler stops running tasks, it attempts to maintain balance across\n\t\t\tthe Availability Zones in your cluster using the following logic:

\n
    \n
  • \n

    Sort the container instances by the largest number of running tasks for this\n\t\t\t\t\tservice in the same Availability Zone as the instance. For example, if zone A\n\t\t\t\t\thas one running service task and zones B and C each have two, container\n\t\t\t\t\tinstances in either zone B or C are considered optimal for termination.

    \n
  • \n
  • \n

    Stop the task on a container instance in an optimal Availability Zone (based\n\t\t\t\t\ton the previous steps), favoring container instances with the largest number of\n\t\t\t\t\trunning tasks for this service.

    \n
  • \n
\n \n

You must have a service-linked role when you update any of the following service\n\t\t\t\tproperties. If you specified a custom role when you created the service, Amazon ECS\n\t\t\t\tautomatically replaces the roleARN associated with the service with the ARN of your\n\t\t\t\tservice-linked role. For more information, see Service-linked roles in the Amazon Elastic Container Service Developer Guide.

\n
    \n
  • \n

    \n loadBalancers,\n

    \n
  • \n
  • \n

    \n serviceRegistries\n

    \n
  • \n
\n
" + "smithy.api#documentation": "

Modifies the parameters of a service.

\n

For services using the rolling update (ECS) you can update the desired\n\t\t\tcount, deployment configuration, network configuration, load balancers, service\n\t\t\tregistries, enable ECS managed tags option, propagate tags option, task placement\n\t\t\tconstraints and strategies, and task definition. When you update any of these\n\t\t\tparameters, Amazon ECS starts new tasks with the new configuration.

\n

For services using the blue/green (CODE_DEPLOY) deployment controller,\n\t\t\tonly the desired count, deployment configuration, health check grace period, task\n\t\t\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\n\t\t\tcan be updated using this API. If the network configuration, platform version, task\n\t\t\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\n\t\t\tinformation, see CreateDeployment in the CodeDeploy API Reference.

\n

For services using an external deployment controller, you can update only the desired\n\t\t\tcount, task placement constraints and strategies, health check grace period, enable ECS\n\t\t\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\n\t\t\tbalancer, network configuration, platform version, or task definition need to be\n\t\t\tupdated, create a new task set For more information, see CreateTaskSet.

\n

You can add to or subtract from the number of instantiations of a task definition in a\n\t\t\tservice by specifying the cluster that the service is running in and a new\n\t\t\t\tdesiredCount parameter.

\n

If you have updated the Docker image of your application, you can create a new task\n\t\t\tdefinition with that image and deploy it to your service. The service scheduler uses the\n\t\t\tminimum healthy percent and maximum percent parameters (in the service's deployment\n\t\t\tconfiguration) to determine the deployment strategy.

\n \n

If your updated Docker image uses the same tag as what is in the existing task\n\t\t\t\tdefinition for your service (for example, my_image:latest), you don't\n\t\t\t\tneed to create a new revision of your task definition. You can update the service\n\t\t\t\tusing the forceNewDeployment option. The new tasks launched by the\n\t\t\t\tdeployment pull the current image/tag combination from your repository when they\n\t\t\t\tstart.

\n
\n

You can also update the deployment configuration of a service. When a deployment is\n\t\t\ttriggered by updating the task definition of a service, the service scheduler uses the\n\t\t\tdeployment configuration parameters, minimumHealthyPercent and\n\t\t\t\tmaximumPercent, to determine the deployment strategy.

\n
    \n
  • \n

    If minimumHealthyPercent is below 100%, the scheduler can ignore\n\t\t\t\t\t\tdesiredCount temporarily during a deployment. For example, if\n\t\t\t\t\t\tdesiredCount is four tasks, a minimum of 50% allows the\n\t\t\t\t\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\n\t\t\t\t\tservices that don't use a load balancer are considered healthy if they're in the\n\t\t\t\t\t\tRUNNING state. Tasks for services that use a load balancer are\n\t\t\t\t\tconsidered healthy if they're in the RUNNING state and are reported\n\t\t\t\t\tas healthy by the load balancer.

    \n
  • \n
  • \n

    The maximumPercent parameter represents an upper limit on the\n\t\t\t\t\tnumber of running tasks during a deployment. You can use it to define the\n\t\t\t\t\tdeployment batch size. For example, if desiredCount is four tasks,\n\t\t\t\t\ta maximum of 200% starts four new tasks before stopping the four older tasks\n\t\t\t\t\t(provided that the cluster resources required to do this are available).

    \n
  • \n
\n

When UpdateService stops a task during a deployment, the equivalent\n\t\t\tof docker stop is issued to the containers running in the task. This\n\t\t\tresults in a SIGTERM and a 30-second timeout. After this,\n\t\t\t\tSIGKILL is sent and the containers are forcibly stopped. If the\n\t\t\tcontainer handles the SIGTERM gracefully and exits within 30 seconds from\n\t\t\treceiving it, no SIGKILL is sent.

\n

When the service scheduler launches new tasks, it determines task placement in your\n\t\t\tcluster with the following logic.

\n
    \n
  • \n

    Determine which of the container instances in your cluster can support your\n\t\t\t\t\tservice's task definition. For example, they have the required CPU, memory,\n\t\t\t\t\tports, and container instance attributes.

    \n
  • \n
  • \n

    By default, the service scheduler attempts to balance tasks across\n\t\t\t\t\tAvailability Zones in this manner even though you can choose a different\n\t\t\t\t\tplacement strategy.

    \n
      \n
    • \n

      Sort the valid container instances by the fewest number of running\n\t\t\t\t\t\t\ttasks for this service in the same Availability Zone as the instance.\n\t\t\t\t\t\t\tFor example, if zone A has one running service task and zones B and C\n\t\t\t\t\t\t\teach have zero, valid container instances in either zone B or C are\n\t\t\t\t\t\t\tconsidered optimal for placement.

      \n
    • \n
    • \n

      Place the new service task on a valid container instance in an optimal\n\t\t\t\t\t\t\tAvailability Zone (based on the previous steps), favoring container\n\t\t\t\t\t\t\tinstances with the fewest number of running tasks for this\n\t\t\t\t\t\t\tservice.

      \n
    • \n
    \n
  • \n
\n

When the service scheduler stops running tasks, it attempts to maintain balance across\n\t\t\tthe Availability Zones in your cluster using the following logic:

\n
    \n
  • \n

    Sort the container instances by the largest number of running tasks for this\n\t\t\t\t\tservice in the same Availability Zone as the instance. For example, if zone A\n\t\t\t\t\thas one running service task and zones B and C each have two, container\n\t\t\t\t\tinstances in either zone B or C are considered optimal for termination.

    \n
  • \n
  • \n

    Stop the task on a container instance in an optimal Availability Zone (based\n\t\t\t\t\ton the previous steps), favoring container instances with the largest number of\n\t\t\t\t\trunning tasks for this service.

    \n
  • \n
\n \n

You must have a service-linked role when you update any of the following service\n\t\t\t\tproperties:

\n
    \n
  • \n

    \n loadBalancers,

    \n
  • \n
  • \n

    \n serviceRegistries\n

    \n
  • \n
\n

For more information about the role see the CreateService request parameter\n\t\t\t\t\n role\n .

\n
", + "smithy.api#examples": [ + { + "title": "To change the task definition used in a service", + "documentation": "This example updates the my-http-service service to use the amazon-ecs-sample task definition.", + "input": { + "service": "my-http-service", + "taskDefinition": "amazon-ecs-sample" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#UpdateServicePrimaryTaskSet": { @@ -11683,7 +12349,31 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the protection status of a task. You can set protectionEnabled to\n\t\t\t\ttrue to protect your task from termination during scale-in events from\n\t\t\t\tService\n\t\t\t\tAutoscaling or deployments.

\n

Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\n\t\t\t\tprotectionEnabled property making the task eligible for termination by\n\t\t\ta subsequent scale-in event.

\n

You can specify a custom expiration period for task protection from 1 minute to up to\n\t\t\t2,880 minutes (48 hours). To specify the custom expiration period, set the\n\t\t\t\texpiresInMinutes property. The expiresInMinutes property\n\t\t\tis always reset when you invoke this operation for a task that already has\n\t\t\t\tprotectionEnabled set to true. You can keep extending the\n\t\t\tprotection expiration period of a task by invoking this operation repeatedly.

\n

To learn more about Amazon ECS task protection, see Task scale-in\n\t\t\t\tprotection in the \n Amazon Elastic Container Service Developer Guide\n .

\n \n

This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\n\t\t\t\tthis operation for a standalone task will result in an TASK_NOT_VALID\n\t\t\t\tfailure. For more information, see API failure\n\t\t\t\t\treasons.

\n
\n \n

If you prefer to set task protection from within the container, we recommend using\n\t\t\t\tthe Task scale-in protection endpoint.

\n
" + "smithy.api#documentation": "

Updates the protection status of a task. You can set protectionEnabled to\n\t\t\t\ttrue to protect your task from termination during scale-in events from\n\t\t\t\tService\n\t\t\t\tAutoscaling or deployments.

\n

Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\n\t\t\t\tprotectionEnabled property making the task eligible for termination by\n\t\t\ta subsequent scale-in event.

\n

You can specify a custom expiration period for task protection from 1 minute to up to\n\t\t\t2,880 minutes (48 hours). To specify the custom expiration period, set the\n\t\t\t\texpiresInMinutes property. The expiresInMinutes property\n\t\t\tis always reset when you invoke this operation for a task that already has\n\t\t\t\tprotectionEnabled set to true. You can keep extending the\n\t\t\tprotection expiration period of a task by invoking this operation repeatedly.

\n

To learn more about Amazon ECS task protection, see Task scale-in\n\t\t\t\tprotection in the \n Amazon Elastic Container Service Developer Guide\n .

\n \n

This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\n\t\t\t\tthis operation for a standalone task will result in an TASK_NOT_VALID\n\t\t\t\tfailure. For more information, see API failure\n\t\t\t\t\treasons.

\n
\n \n

If you prefer to set task protection from within the container, we recommend using\n\t\t\t\tthe Task scale-in protection endpoint.

\n
", + "smithy.api#examples": [ + { + "title": "To set task scale-in protection for a task for 60 minutes", + "documentation": "This example enables scale-in protection for a task for 60 minutes.", + "input": { + "cluster": "test-task-protection", + "tasks": [ + "b8b1cf532d0e46ba8d44a40d1de16772" + ], + "protectionEnabled": true, + "expiresInMinutes": 60 + }, + "output": { + "protectedTasks": [ + { + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/b8b1cf532d0e46ba8d44a40d1de16772", + "protectionEnabled": true, + "expirationDate": "2022-11-02T06:56:32.553Z" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#UpdateTaskProtectionRequest": { @@ -11865,7 +12555,7 @@ "name": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the\n\t\t\t\tsourceVolume parameter of container definition\n\t\t\tmountPoints.

" + "smithy.api#documentation": "

The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the\n\t\t\t\tsourceVolume parameter of container definition\n\t\t\tmountPoints.

\n

This is required wwhen you use an Amazon EFS volume.

" } }, "host": { diff --git a/aws/sdk/aws-models/iam.json b/aws/sdk/aws-models/iam.json index 3f222206c62..d1b5c5e6220 100644 --- a/aws/sdk/aws-models/iam.json +++ b/aws/sdk/aws-models/iam.json @@ -222,6 +222,9 @@ { "target": "com.amazonaws.iam#GetLoginProfile" }, + { + "target": "com.amazonaws.iam#GetMFADevice" + }, { "target": "com.amazonaws.iam#GetOpenIDConnectProvider" }, @@ -2026,7 +2029,7 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see Working with roles. For more\n information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

" } }, "com.amazonaws.iam#AddRoleToInstanceProfileRequest": { @@ -2128,7 +2131,7 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use PutGroupPolicy.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use \n PutGroupPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" } }, "com.amazonaws.iam#AttachGroupPolicyRequest": { @@ -2182,7 +2185,7 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using CreateRole.\n You can update a role's trust policy using UpdateAssumeRolePolicy.

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use PutRolePolicy. For more information\n about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using \n CreateRole\n . You can update a role's trust policy using\n \n UpdateAssumerolePolicy\n .

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use \n PutRolePolicy\n . For more information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

" } }, "com.amazonaws.iam#AttachRolePolicyRequest": { @@ -2233,7 +2236,7 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use PutUserPolicy.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use \n PutUserPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" } }, "com.amazonaws.iam#AttachUserPolicyRequest": { @@ -2301,6 +2304,35 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.iam#CertificationKeyType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 128 + }, + "smithy.api#pattern": "^[\\u0020-\\u00FF]+$" + } + }, + "com.amazonaws.iam#CertificationMapType": { + "type": "map", + "key": { + "target": "com.amazonaws.iam#CertificationKeyType" + }, + "value": { + "target": "com.amazonaws.iam#CertificationValueType" + } + }, + "com.amazonaws.iam#CertificationValueType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 32 + }, + "smithy.api#pattern": "^[\\u0020-\\u00FF]+$" + } + }, "com.amazonaws.iam#ChangePassword": { "type": "operation", "input": { @@ -2843,7 +2875,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Google, Auth0,\n and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In these\n cases, your legacy thumbprint remains in your configuration, but is no longer used for\n validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
" + "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
" } }, "com.amazonaws.iam#CreateOpenIDConnectProviderRequest": { @@ -3090,7 +3122,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account. For more information about roles, see\n IAM\n roles. For information about quotas for role names and the number of roles\n you can create, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account.

\n

For more information about roles, see IAM roles in the\n IAM User Guide. For information about quotas for role names\n and the number of roles you can create, see IAM and STS quotas in the\n IAM User Guide.

" } }, "com.amazonaws.iam#CreateRoleRequest": { @@ -3853,7 +3885,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see Using\n instance profiles in the IAM User Guide.

" } }, "com.amazonaws.iam#DeleteInstanceProfileRequest": { @@ -5837,7 +5869,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n About\n instance profiles in the IAM User Guide.

", + "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

", "smithy.waiters#waitable": { "InstanceProfileExists": { "acceptors": [ @@ -5941,6 +5973,80 @@ "smithy.api#output": {} } }, + "com.amazonaws.iam#GetMFADevice": { + "type": "operation", + "input": { + "target": "com.amazonaws.iam#GetMFADeviceRequest" + }, + "output": { + "target": "com.amazonaws.iam#GetMFADeviceResponse" + }, + "errors": [ + { + "target": "com.amazonaws.iam#NoSuchEntityException" + }, + { + "target": "com.amazonaws.iam#ServiceFailureException" + } + ], + "traits": { + "smithy.api#documentation": "

Retrieves information about an MFA device for a specified user.

" + } + }, + "com.amazonaws.iam#GetMFADeviceRequest": { + "type": "structure", + "members": { + "SerialNumber": { + "target": "com.amazonaws.iam#serialNumberType", + "traits": { + "smithy.api#documentation": "

Serial number that uniquely identifies the MFA device. For this API, we only accept\n FIDO security key ARNs.

", + "smithy.api#required": {} + } + }, + "UserName": { + "target": "com.amazonaws.iam#userNameType", + "traits": { + "smithy.api#documentation": "

The friendly name identifying the user.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.iam#GetMFADeviceResponse": { + "type": "structure", + "members": { + "UserName": { + "target": "com.amazonaws.iam#userNameType", + "traits": { + "smithy.api#documentation": "

The friendly name identifying the user.

" + } + }, + "SerialNumber": { + "target": "com.amazonaws.iam#serialNumberType", + "traits": { + "smithy.api#documentation": "

Serial number that uniquely identifies the MFA device. For this API, we only accept\n FIDO security key ARNs.

", + "smithy.api#required": {} + } + }, + "EnableDate": { + "target": "com.amazonaws.iam#dateType", + "traits": { + "smithy.api#documentation": "

The date that a specified user's MFA device was first enabled.

" + } + }, + "Certifications": { + "target": "com.amazonaws.iam#CertificationMapType", + "traits": { + "smithy.api#documentation": "

The certifications of a specified user's MFA device. We currently provide FIPS-140-2,\n FIPS-140-3, and FIDO certification levels obtained from FIDO Alliance Metadata Service\n (MDS).

" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.iam#GetOpenIDConnectProvider": { "type": "operation", "input": { @@ -6282,7 +6388,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see Working with roles.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", + "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see IAM roles in the\n IAM User Guide.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -6324,7 +6430,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the specified inline policy document that is embedded with the specified\n IAM role.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
\n

An IAM role can also have managed policies attached to it. To retrieve a managed\n policy document that is attached to a role, use GetPolicy to determine\n the policy's default version, then use GetPolicyVersion to retrieve\n the policy document.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

For more information about roles, see Using roles to delegate permissions and\n federate identities.

" + "smithy.api#documentation": "

Retrieves the specified inline policy document that is embedded with the specified\n IAM role.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
\n

An IAM role can also have managed policies attached to it. To retrieve a managed\n policy document that is attached to a role, use GetPolicy to determine\n the policy's default version, then use GetPolicyVersion to retrieve\n the policy document.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

For more information about roles, see IAM roles in the\n IAM User Guide.

" } }, "com.amazonaws.iam#GetRolePolicyRequest": { @@ -8082,7 +8188,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\n For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\n For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListInstanceProfileTagsRequest": { @@ -8154,7 +8266,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the instance profiles that have the specified path prefix. If there are none,\n the operation returns an empty list. For more information about instance profiles, see\n About\n instance profiles.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see GetInstanceProfile.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the instance profiles that have the specified path prefix. If there are none,\n the operation returns an empty list. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see GetInstanceProfile.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8180,7 +8292,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the instance profiles that have the specified associated IAM role. If there\n are none, the operation returns an empty list. For more information about instance\n profiles, go to About instance\n profiles.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the instance profiles that have the specified associated IAM role. If there\n are none, the operation returns an empty list. For more information about instance\n profiles, go to Using\n instance profiles in the IAM User Guide.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8320,7 +8432,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListMFADeviceTagsRequest": { @@ -8479,7 +8597,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\n identity provider. The returned list of tags is sorted by tag key. For more information, see About web identity\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\n identity provider. The returned list of tags is sorted by tag key. For more information, see About web identity\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListOpenIDConnectProviderTagsRequest": { @@ -8788,7 +8912,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM customer managed policy.\n The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM customer managed policy.\n The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListPolicyTagsRequest": { @@ -9029,7 +9159,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListRoleTagsRequest": { @@ -9101,7 +9237,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the IAM roles that have the specified path prefix. If there are none, the\n operation returns an empty list. For more information about roles, see Working with\n roles.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    RoleLastUsed

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a role, see GetRole.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the IAM roles that have the specified path prefix. If there are none, the\n operation returns an empty list. For more information about roles, see IAM roles in the\n IAM User Guide.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    RoleLastUsed

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a role, see GetRole.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9185,7 +9321,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified Security Assertion Markup Language\n (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see About SAML 2.0-based\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified Security Assertion Markup Language\n (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see About SAML 2.0-based\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListSAMLProviderTagsRequest": { @@ -9376,7 +9518,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM server certificate. The\n returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

\n \n

For certificates in a Region supported by Certificate Manager (ACM), we\n recommend that you don't use IAM server certificates. Instead, use ACM to provision,\n manage, and deploy your server certificates. For more information about IAM server\n certificates, Working with server\n certificates in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM server certificate. The\n returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

\n \n

For certificates in a Region supported by Certificate Manager (ACM), we\n recommend that you don't use IAM server certificates. Instead, use ACM to provision,\n manage, and deploy your server certificates. For more information about IAM server\n certificates, Working with server\n certificates in the IAM User Guide.

\n
", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListServerCertificateTagsRequest": { @@ -10734,7 +10882,7 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use AttachGroupPolicy. To create a new managed policy, use\n CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use \n AttachGroupPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" } }, "com.amazonaws.iam#PutGroupPolicyRequest": { @@ -10757,7 +10905,7 @@ "PolicyDocument": { "target": "com.amazonaws.iam#policyDocumentType", "traits": { - "smithy.api#documentation": "

The policy document.

\n

You must provide policies in JSON format in IAM. However, for CloudFormation templates\n formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\n converts a YAML policy to JSON format before submitting it to = IAM.

\n

The regex pattern \n used to validate this parameter is a string of characters consisting of the following:

\n
    \n
  • \n

    Any printable ASCII \n character ranging from the space character (\\u0020) through the end of the ASCII character range

    \n
  • \n
  • \n

    The printable characters in the Basic Latin and Latin-1 Supplement character set \n (through \\u00FF)

    \n
  • \n
  • \n

    The special characters tab (\\u0009), line feed (\\u000A), and \n carriage return (\\u000D)

    \n
  • \n
", + "smithy.api#documentation": "

The policy document.

\n

You must provide policies in JSON format in IAM. However, for CloudFormation templates\n formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\n converts a YAML policy to JSON format before submitting it to IAM.

\n

The regex pattern \n used to validate this parameter is a string of characters consisting of the following:

\n
    \n
  • \n

    Any printable ASCII \n character ranging from the space character (\\u0020) through the end of the ASCII character range

    \n
  • \n
  • \n

    The printable characters in the Basic Latin and Latin-1 Supplement character set \n (through \\u00FF)

    \n
  • \n
  • \n

    The special characters tab (\\u0009), line feed (\\u000A), and \n carriage return (\\u000D)

    \n
  • \n
", "smithy.api#required": {} } } @@ -10843,7 +10991,7 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using CreateRole. You can update a role's trust policy\n using UpdateAssumeRolePolicy. For more information about IAM roles,\n see Using roles to\n delegate permissions and federate identities.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use AttachRolePolicy. To create a new managed policy, use CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using \n CreateRole\n .\n You can update a role's trust policy using \n UpdateAssumeRolePolicy\n . For more information about roles,\n see IAM\n roles in the IAM User Guide.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use \n AttachRolePolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" } }, "com.amazonaws.iam#PutRolePolicyRequest": { @@ -10946,7 +11094,7 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use AttachUserPolicy. To create a new managed\n policy, use CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use \n AttachUserPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" } }, "com.amazonaws.iam#PutUserPolicyRequest": { @@ -11064,7 +11212,7 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about IAM roles, see Working with roles. For more\n information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

" } }, "com.amazonaws.iam#RemoveRoleFromInstanceProfileRequest": { @@ -13622,7 +13770,7 @@ } ], "traits": { - "smithy.api#documentation": "

Replaces the existing list of server certificate thumbprints associated with an OpenID\n Connect (OIDC) provider resource object with a new list of thumbprints.

\n

The list that you pass with this operation completely replaces the existing list of\n thumbprints. (The lists are not merged.)

\n

Typically, you need to update a thumbprint only when the identity provider certificate\n changes, which occurs rarely. However, if the provider's certificate\n does change, any attempt to assume an IAM role that specifies\n the OIDC provider as a principal fails until the certificate thumbprint is\n updated.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Google, Auth0,\n and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In these\n cases, your legacy thumbprint remains in your configuration, but is no longer used for\n validation.

\n
\n \n

Trust for the OIDC provider is derived from the provider certificate and is\n validated by the thumbprint. Therefore, it is best to limit access to the\n UpdateOpenIDConnectProviderThumbprint operation to highly\n privileged users.

\n
" + "smithy.api#documentation": "

Replaces the existing list of server certificate thumbprints associated with an OpenID\n Connect (OIDC) provider resource object with a new list of thumbprints.

\n

The list that you pass with this operation completely replaces the existing list of\n thumbprints. (The lists are not merged.)

\n

Typically, you need to update a thumbprint only when the identity provider certificate\n changes, which occurs rarely. However, if the provider's certificate\n does change, any attempt to assume an IAM role that specifies\n the OIDC provider as a principal fails until the certificate thumbprint is\n updated.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

Trust for the OIDC provider is derived from the provider certificate and is\n validated by the thumbprint. Therefore, it is best to limit access to the\n UpdateOpenIDConnectProviderThumbprint operation to highly\n privileged users.

\n
" } }, "com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprintRequest": { diff --git a/aws/sdk/aws-models/kms.json b/aws/sdk/aws-models/kms.json index e161d678534..c5426034d9b 100644 --- a/aws/sdk/aws-models/kms.json +++ b/aws/sdk/aws-models/kms.json @@ -642,7 +642,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key stores backed by an external key store proxy and\n external key manager outside of Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration\n with the CreateCustomKeyStore operation. However, you can use the values in\n the file to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key\n stores backed by an external key store proxy and external key manager outside of\n Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration with\n the CreateCustomKeyStore operation. However, you can use the values in the file\n to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#CreateCustomKeyStoreRequest": { @@ -694,7 +694,7 @@ "XksProxyVpcEndpointServiceName": { "target": "com.amazonaws.kms#XksProxyVpcEndpointServiceNameType", "traits": { - "smithy.api#documentation": "

Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\n communicate with your external key store proxy (XKS proxy). This parameter is required when\n the value of CustomKeyStoreType is EXTERNAL_KEY_STORE and the value\n of XksProxyConnectivity is VPC_ENDPOINT_SERVICE.

\n

The Amazon VPC endpoint service must fulfill all requirements for use with an external key\n store.

\n

\n Uniqueness requirements:\n

\n
    \n
  • \n

    External key stores with VPC_ENDPOINT_SERVICE connectivity can share an\n Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\n name.

    \n
  • \n
" + "smithy.api#documentation": "

Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\n communicate with your external key store proxy (XKS proxy). This parameter is required when\n the value of CustomKeyStoreType is EXTERNAL_KEY_STORE and the value\n of XksProxyConnectivity is VPC_ENDPOINT_SERVICE.

\n

The Amazon VPC endpoint service must fulfill all\n requirements for use with an external key store.

\n

\n Uniqueness requirements:\n

\n
    \n
  • \n

    External key stores with VPC_ENDPOINT_SERVICE connectivity can share an\n Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\n name.

    \n
  • \n
" } }, "XksProxyAuthenticationCredential": { @@ -706,7 +706,7 @@ "XksProxyConnectivity": { "target": "com.amazonaws.kms#XksProxyConnectivityType", "traits": { - "smithy.api#documentation": "

Indicates how KMS communicates with the external key store proxy. This parameter is\n required for custom key stores with a CustomKeyStoreType of\n EXTERNAL_KEY_STORE.

\n

If the external key store proxy uses a public endpoint, specify\n PUBLIC_ENDPOINT. If the external key store proxy uses a Amazon VPC\n endpoint service for communication with KMS, specify VPC_ENDPOINT_SERVICE. For\n help making this choice, see Choosing a connectivity option in the Key Management Service Developer Guide.

\n

An Amazon VPC endpoint service keeps your communication with KMS in a private address space\n entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\n verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\n might not fulfill your security requirements. You might consider testing with a public\n endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\n choice does not determine the location of the external key store proxy. Even if you choose a\n VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\n your corporate data center.

" + "smithy.api#documentation": "

Indicates how KMS communicates with the external key store proxy. This parameter is\n required for custom key stores with a CustomKeyStoreType of\n EXTERNAL_KEY_STORE.

\n

If the external key store proxy uses a public endpoint, specify\n PUBLIC_ENDPOINT. If the external key store proxy uses a Amazon VPC\n endpoint service for communication with KMS, specify VPC_ENDPOINT_SERVICE. For\n help making this choice, see Choosing a connectivity\n option in the Key Management Service Developer Guide.

\n

An Amazon VPC endpoint service keeps your communication with KMS in a private address space\n entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\n verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\n might not fulfill your security requirements. You might consider testing with a public\n endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\n choice does not determine the location of the external key store proxy. Even if you choose a\n VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\n your corporate data center.

" } } }, @@ -743,6 +743,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -779,7 +782,7 @@ "GranteePrincipal": { "target": "com.amazonaws.kms#PrincipalIdType", "traits": { - "smithy.api#documentation": "

The identity that gets the permissions specified in the grant.

\n

To specify the grantee principal, use the Amazon Resource Name (ARN) of an\n Amazon Web Services principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\n federated users, and assumed role users. For help with the ARN syntax for a principal, see\n IAM ARNs in the \n Identity and Access Management User Guide\n .

", + "smithy.api#documentation": "

The identity that gets the permissions specified in the grant.

\n

To specify the grantee principal, use the Amazon Resource Name (ARN) of an Amazon Web Services\n principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\n federated users, and assumed role users. For help with the ARN syntax for a principal, see\n IAM ARNs in the \n Identity and Access Management User Guide\n .

", "smithy.api#required": {} } }, @@ -813,6 +816,12 @@ "traits": { "smithy.api#documentation": "

A friendly name for the grant. Use this value to prevent the unintended creation of\n duplicate grants when retrying this request.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

When this value is absent, all CreateGrant requests result in a new grant\n with a unique GrantId even if all the supplied parameters are identical. This can\n result in unintended duplicates when you retry the CreateGrant request.

\n

When this value is present, you can retry a CreateGrant request with\n identical parameters; if the grant already exists, the original GrantId is\n returned without creating a new grant. Note that the returned grant token is unique with every\n CreateGrant request, even when a duplicate GrantId is returned.\n All grant tokens for the same grant ID can be used interchangeably.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -889,7 +898,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a unique customer managed KMS key in your Amazon Web Services account and Region.\n You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\n services let you use KMS keys that you create and manage to protect your service\n resources.

\n

A KMS key is a logical representation of a cryptographic key. In addition to the key\n material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\n key policy, creation date, description, and key state. For details, see Managing keys in the\n Key Management Service Developer Guide\n

\n

Use the parameters of CreateKey to specify the type of KMS key, the source of\n its key material, its key policy, description, tags, and other properties.

\n \n

KMS has replaced the term customer master key (CMK) with KMS key and KMS key. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.

\n
\n

To create different types of KMS keys, use the following guidance:

\n
\n
Symmetric encryption KMS key
\n
\n

By default, CreateKey creates a symmetric encryption KMS key with key\n material that KMS generates. This is the basic and most widely used type of KMS key, and\n provides the best performance.

\n

To create a symmetric encryption KMS key, you don't need to specify any parameters.\n The default value for KeySpec, SYMMETRIC_DEFAULT, the default\n value for KeyUsage, ENCRYPT_DECRYPT, and the default value for\n Origin, AWS_KMS, create a symmetric encryption KMS key with\n KMS key material.

\n

If you need a key for basic encryption and decryption or you are creating a KMS key\n to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\n The key material in a symmetric encryption key never leaves KMS unencrypted. You can\n use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\n they are typically used to generate data keys and data keys pairs. For details, see\n GenerateDataKey and GenerateDataKeyPair.

\n

\n
\n
Asymmetric KMS keys
\n
\n

To create an asymmetric KMS key, use the KeySpec parameter to specify\n the type of key material in the KMS key. Then, use the KeyUsage parameter\n to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\n You can't change these properties after the KMS key is created.

\n

Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, or an SM2 key pair (China Regions only). The private key in an asymmetric \n KMS key never leaves KMS unencrypted. However, you can use the GetPublicKey operation to download the public key\n so it can be used outside of KMS. KMS keys with RSA or SM2 key pairs can be used to encrypt or decrypt data or sign and verify messages (but not both). \n KMS keys with ECC key pairs can be used only to sign and verify messages. \n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

\n
\n
HMAC KMS key
\n
\n

To create an HMAC KMS key, set the KeySpec parameter to a key spec\n value for HMAC KMS keys. Then set the KeyUsage parameter to\n GENERATE_VERIFY_MAC. You must set the key usage even though\n GENERATE_VERIFY_MAC is the only valid key usage value for HMAC KMS keys.\n You can't change these properties after the KMS key is created.

\n

HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\n HMAC keys to generate (GenerateMac) and verify (VerifyMac) HMAC codes for messages up to 4096 bytes.

\n

\n
\n
Multi-Region primary keys
\n
Imported key material
\n
\n

To create a multi-Region primary key in the local Amazon Web Services Region,\n use the MultiRegion parameter with a value of True. To create\n a multi-Region replica key, that is, a KMS key with the same key ID\n and key material as a primary key, but in a different Amazon Web Services Region, use the ReplicateKey operation. To change a replica key to a primary key, and its\n primary key to a replica key, use the UpdatePrimaryRegion\n operation.

\n

You can create multi-Region KMS keys for all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't create multi-Region keys in a custom key store.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
\n

To import your own key material into a KMS key, begin by creating a KMS key with no\n key material. To do this, use the Origin parameter of\n CreateKey with a value of EXTERNAL. Next, use GetParametersForImport operation to get a public key and import token. Use\n the wrapping public key to encrypt your key material. Then, use ImportKeyMaterial with your import token to import the key material. For step-by-step instructions, see\n Importing Key Material in the \n Key Management Service Developer Guide\n .

\n

You can import key material into KMS keys of all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't import key material into a KMS key in a custom key store.

\n

To create a multi-Region primary key with imported key material, use the\n Origin parameter of CreateKey with a value of\n EXTERNAL and the MultiRegion parameter with a value of\n True. To create replicas of the multi-Region primary key, use the ReplicateKey operation. For instructions, see Importing key material into\n multi-Region keys. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
Custom key store
\n
\n

A custom key store lets you protect your Amazon Web Services resources using keys in a backing key\n store that you own and manage. When you request a cryptographic operation with a KMS key\n in a custom key store, the operation is performed in the backing key store using its\n cryptographic keys.

\n

KMS supports CloudHSM key stores backed by an CloudHSM cluster and external key stores backed by an\n external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\n KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\n key. When you create a KMS key in an external key store, you specify an existing\n encryption key in the external key manager.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n

Before you create a KMS key in a custom key store, the ConnectionState\n of the key store must be CONNECTED. To connect the custom key store, use\n the ConnectCustomKeyStore operation. To find the\n ConnectionState, use the DescribeCustomKeyStores\n operation.

\n

To create a KMS key in a custom key store, use the CustomKeyStoreId.\n Use the default KeySpec value, SYMMETRIC_DEFAULT, and the\n default KeyUsage value, ENCRYPT_DECRYPT to create a symmetric\n encryption key. No other key type is supported in a custom key store.

\n

To create a KMS key in an CloudHSM key store, use the\n Origin parameter with a value of AWS_CLOUDHSM. The CloudHSM\n cluster that is associated with the custom key store must have at least two active HSMs\n in different Availability Zones in the Amazon Web Services Region.

\n

To create a KMS key in an external key store, use the Origin parameter\n with a value of EXTERNAL_KEY_STORE and an XksKeyId parameter\n that identifies an existing external key.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n
\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateKey (IAM policy). To use the\n Tags parameter, kms:TagResource (IAM policy). For examples and information about related\n permissions, see Allow a user to create\n KMS keys in the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a unique customer managed KMS key in your Amazon Web Services account and Region.\n You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\n services let you use KMS keys that you create and manage to protect your service\n resources.

\n

A KMS key is a logical representation of a cryptographic key. In addition to the key\n material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\n key policy, creation date, description, and key state. For details, see Managing keys in the\n Key Management Service Developer Guide\n

\n

Use the parameters of CreateKey to specify the type of KMS key, the source of\n its key material, its key policy, description, tags, and other properties.

\n \n

KMS has replaced the term customer master key (CMK) with KMS key and KMS key. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.

\n
\n

To create different types of KMS keys, use the following guidance:

\n
\n
Symmetric encryption KMS key
\n
\n

By default, CreateKey creates a symmetric encryption KMS key with key\n material that KMS generates. This is the basic and most widely used type of KMS key, and\n provides the best performance.

\n

To create a symmetric encryption KMS key, you don't need to specify any parameters.\n The default value for KeySpec, SYMMETRIC_DEFAULT, the default\n value for KeyUsage, ENCRYPT_DECRYPT, and the default value for\n Origin, AWS_KMS, create a symmetric encryption KMS key with\n KMS key material.

\n

If you need a key for basic encryption and decryption or you are creating a KMS key\n to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\n The key material in a symmetric encryption key never leaves KMS unencrypted. You can\n use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\n they are typically used to generate data keys and data keys pairs. For details, see\n GenerateDataKey and GenerateDataKeyPair.

\n

\n
\n
Asymmetric KMS keys
\n
\n

To create an asymmetric KMS key, use the KeySpec parameter to specify\n the type of key material in the KMS key. Then, use the KeyUsage parameter\n to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\n You can't change these properties after the KMS key is created.

\n

Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, or an\n SM2 key pair (China Regions only). The private key in an asymmetric KMS key never leaves\n KMS unencrypted. However, you can use the GetPublicKey operation to\n download the public key so it can be used outside of KMS. KMS keys with RSA or SM2 key\n pairs can be used to encrypt or decrypt data or sign and verify messages (but not both).\n KMS keys with ECC key pairs can be used only to sign and verify messages. For\n information about asymmetric KMS keys, see Asymmetric KMS keys in the\n Key Management Service Developer Guide.

\n

\n
\n
HMAC KMS key
\n
\n

To create an HMAC KMS key, set the KeySpec parameter to a key spec\n value for HMAC KMS keys. Then set the KeyUsage parameter to\n GENERATE_VERIFY_MAC. You must set the key usage even though\n GENERATE_VERIFY_MAC is the only valid key usage value for HMAC KMS keys.\n You can't change these properties after the KMS key is created.

\n

HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\n HMAC keys to generate (GenerateMac) and verify (VerifyMac) HMAC codes for messages up to 4096 bytes.

\n

\n
\n
Multi-Region primary keys
\n
Imported key material
\n
\n

To create a multi-Region primary key in the local Amazon Web Services Region,\n use the MultiRegion parameter with a value of True. To create\n a multi-Region replica key, that is, a KMS key with the same key ID\n and key material as a primary key, but in a different Amazon Web Services Region, use the ReplicateKey operation. To change a replica key to a primary key, and its\n primary key to a replica key, use the UpdatePrimaryRegion\n operation.

\n

You can create multi-Region KMS keys for all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't create multi-Region keys in a custom key store.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
\n

To import your own key material into a KMS key, begin by creating a KMS key with no\n key material. To do this, use the Origin parameter of\n CreateKey with a value of EXTERNAL. Next, use GetParametersForImport operation to get a public key and import token. Use\n the wrapping public key to encrypt your key material. Then, use ImportKeyMaterial with your import token to import the key material. For\n step-by-step instructions, see Importing Key Material in the \n Key Management Service Developer Guide\n .

\n

You can import key material into KMS keys of all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't import key material into a KMS key in a custom key store.

\n

To create a multi-Region primary key with imported key material, use the\n Origin parameter of CreateKey with a value of\n EXTERNAL and the MultiRegion parameter with a value of\n True. To create replicas of the multi-Region primary key, use the ReplicateKey operation. For instructions, see Importing key material into\n multi-Region keys. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
Custom key store
\n
\n

A custom key store lets you protect your Amazon Web Services resources using keys in a backing key\n store that you own and manage. When you request a cryptographic operation with a KMS key\n in a custom key store, the operation is performed in the backing key store using its\n cryptographic keys.

\n

KMS supports CloudHSM key stores backed by an CloudHSM cluster and external key stores backed by an\n external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\n KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\n key. When you create a KMS key in an external key store, you specify an existing\n encryption key in the external key manager.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n

Before you create a KMS key in a custom key store, the ConnectionState\n of the key store must be CONNECTED. To connect the custom key store, use\n the ConnectCustomKeyStore operation. To find the\n ConnectionState, use the DescribeCustomKeyStores\n operation.

\n

To create a KMS key in a custom key store, use the CustomKeyStoreId.\n Use the default KeySpec value, SYMMETRIC_DEFAULT, and the\n default KeyUsage value, ENCRYPT_DECRYPT to create a symmetric\n encryption key. No other key type is supported in a custom key store.

\n

To create a KMS key in an CloudHSM key store, use the\n Origin parameter with a value of AWS_CLOUDHSM. The CloudHSM\n cluster that is associated with the custom key store must have at least two active HSMs\n in different Availability Zones in the Amazon Web Services Region.

\n

To create a KMS key in an external key store, use the\n Origin parameter with a value of EXTERNAL_KEY_STORE and an\n XksKeyId parameter that identifies an existing external key.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n
\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateKey (IAM policy). To use the\n Tags parameter, kms:TagResource (IAM policy). For examples and information about related\n permissions, see Allow a user to create\n KMS keys in the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#CreateKeyRequest": { @@ -904,13 +913,13 @@ "Description": { "target": "com.amazonaws.kms#DescriptionType", "traits": { - "smithy.api#documentation": "

A description of the KMS key. Use a description that helps you decide whether the KMS key is appropriate for a task. The\n default value is an empty string (no description).

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

To set or change the description after the key is created, use UpdateKeyDescription.

" + "smithy.api#documentation": "

A description of the KMS key. Use a description that helps you decide whether the KMS key\n is appropriate for a task. The default value is an empty string (no description).

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

To set or change the description after the key is created, use UpdateKeyDescription.

" } }, "KeyUsage": { "target": "com.amazonaws.kms#KeyUsageType", "traits": { - "smithy.api#documentation": "

Determines the cryptographic operations for which you can use the KMS key. The default value is\n ENCRYPT_DECRYPT. This parameter is optional when you are creating a symmetric\n encryption KMS key; otherwise, it is required. You can't change the KeyUsage\n value after the KMS key is created.

\n

Select only one valid value.

\n
    \n
  • \n

    For symmetric encryption KMS keys, omit the parameter or specify\n ENCRYPT_DECRYPT.

    \n
  • \n
  • \n

    For HMAC KMS keys (symmetric), specify GENERATE_VERIFY_MAC.

    \n
  • \n
  • \n

    For asymmetric KMS keys with RSA key material, specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with ECC key material, specify\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with SM2 key material (China Regions only), specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
" + "smithy.api#documentation": "

Determines the cryptographic operations for which you can use the KMS key. The default value is\n ENCRYPT_DECRYPT. This parameter is optional when you are creating a symmetric\n encryption KMS key; otherwise, it is required. You can't change the KeyUsage\n value after the KMS key is created.

\n

Select only one valid value.

\n
    \n
  • \n

    For symmetric encryption KMS keys, omit the parameter or specify\n ENCRYPT_DECRYPT.

    \n
  • \n
  • \n

    For HMAC KMS keys (symmetric), specify GENERATE_VERIFY_MAC.

    \n
  • \n
  • \n

    For asymmetric KMS keys with RSA key material, specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with ECC key material, specify\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with SM2 key material (China Regions only), specify\n ENCRYPT_DECRYPT or SIGN_VERIFY.

    \n
  • \n
" } }, "CustomerMasterKeySpec": { @@ -925,19 +934,19 @@ "KeySpec": { "target": "com.amazonaws.kms#KeySpec", "traits": { - "smithy.api#documentation": "

Specifies the type of KMS key to create. The default value,\n SYMMETRIC_DEFAULT, creates a KMS key with a 256-bit AES-GCM key that is used for encryption and decryption, except in China Regions, \n where it creates a 128-bit symmetric key that uses SM4 encryption. For help choosing a key spec for your KMS key, see Choosing a KMS key type in the \n Key Management Service Developer Guide\n .

\n

The KeySpec determines whether the KMS key contains a symmetric key or an\n asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\n change the KeySpec after the KMS key is created. To further restrict the\n algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\n policy. For more information, see kms:EncryptionAlgorithm, kms:MacAlgorithm or kms:Signing Algorithm in the \n Key Management Service Developer Guide\n .

\n \n

\n Amazon Web Services services that\n are integrated with KMS use symmetric encryption KMS keys to protect your data.\n These services do not support asymmetric KMS keys or HMAC KMS keys.

\n
\n

KMS supports the following key specs for KMS keys:

\n
    \n
  • \n

    Symmetric encryption key (default)

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT\n

      \n
    • \n
    \n
  • \n
  • \n

    HMAC keys (symmetric)

    \n
      \n
    • \n

      \n HMAC_224\n

      \n
    • \n
    • \n

      \n HMAC_256\n

      \n
    • \n
    • \n

      \n HMAC_384\n

      \n
    • \n
    • \n

      \n HMAC_512\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric RSA key pairs

    \n
      \n
    • \n

      \n RSA_2048\n

      \n
    • \n
    • \n

      \n RSA_3072\n

      \n
    • \n
    • \n

      \n RSA_4096\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric NIST-recommended elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_NIST_P256 (secp256r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P384 (secp384r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P521 (secp521r1)

      \n
    • \n
    \n
  • \n
  • \n

    Other asymmetric elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_SECG_P256K1 (secp256k1), commonly used for\n cryptocurrencies.

      \n
    • \n
    \n
  • \n
  • \n

    SM2 key pairs (China Regions only)

    \n
      \n
    • \n

      \n SM2\n

      \n
    • \n
    \n
  • \n
" + "smithy.api#documentation": "

Specifies the type of KMS key to create. The default value,\n SYMMETRIC_DEFAULT, creates a KMS key with a 256-bit AES-GCM key that is used for\n encryption and decryption, except in China Regions, where it creates a 128-bit symmetric key\n that uses SM4 encryption. For help choosing a key spec for your KMS key, see Choosing a KMS key type in the \n Key Management Service Developer Guide\n .

\n

The KeySpec determines whether the KMS key contains a symmetric key or an\n asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\n change the KeySpec after the KMS key is created. To further restrict the\n algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\n policy. For more information, see kms:EncryptionAlgorithm, kms:MacAlgorithm or kms:Signing Algorithm in the \n Key Management Service Developer Guide\n .

\n \n

\n Amazon Web Services services that\n are integrated with KMS use symmetric encryption KMS keys to protect your data.\n These services do not support asymmetric KMS keys or HMAC KMS keys.

\n
\n

KMS supports the following key specs for KMS keys:

\n
    \n
  • \n

    Symmetric encryption key (default)

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT\n

      \n
    • \n
    \n
  • \n
  • \n

    HMAC keys (symmetric)

    \n
      \n
    • \n

      \n HMAC_224\n

      \n
    • \n
    • \n

      \n HMAC_256\n

      \n
    • \n
    • \n

      \n HMAC_384\n

      \n
    • \n
    • \n

      \n HMAC_512\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric RSA key pairs

    \n
      \n
    • \n

      \n RSA_2048\n

      \n
    • \n
    • \n

      \n RSA_3072\n

      \n
    • \n
    • \n

      \n RSA_4096\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric NIST-recommended elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_NIST_P256 (secp256r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P384 (secp384r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P521 (secp521r1)

      \n
    • \n
    \n
  • \n
  • \n

    Other asymmetric elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_SECG_P256K1 (secp256k1), commonly used for\n cryptocurrencies.

      \n
    • \n
    \n
  • \n
  • \n

    SM2 key pairs (China Regions only)

    \n
      \n
    • \n

      \n SM2\n

      \n
    • \n
    \n
  • \n
" } }, "Origin": { "target": "com.amazonaws.kms#OriginType", "traits": { - "smithy.api#documentation": "

The source of the key material for the KMS key. You cannot change the origin after you\n create the KMS key. The default is AWS_KMS, which means that KMS creates the\n key material.

\n

To create a\n KMS key with no key material (for imported key material), set this value to\n EXTERNAL. For more information about importing key material into KMS, see\n Importing Key\n Material in the Key Management Service Developer Guide. The EXTERNAL origin value is valid\n only for symmetric KMS keys.

\n

To create a KMS key in an CloudHSM key store and create its key\n material in the associated CloudHSM cluster, set this value to AWS_CLOUDHSM. You\n must also use the CustomKeyStoreId parameter to identify the CloudHSM key store. The\n KeySpec value must be SYMMETRIC_DEFAULT.

\n

To create a KMS key in\n an external key store, set this value to EXTERNAL_KEY_STORE. You must\n also use the CustomKeyStoreId parameter to identify the external key store and\n the XksKeyId parameter to identify the associated external key. The\n KeySpec value must be SYMMETRIC_DEFAULT.

" + "smithy.api#documentation": "

The source of the key material for the KMS key. You cannot change the origin after you\n create the KMS key. The default is AWS_KMS, which means that KMS creates the\n key material.

\n

To create a\n KMS key with no key material (for imported key material), set this value to\n EXTERNAL. For more information about importing key material into KMS, see\n Importing Key\n Material in the Key Management Service Developer Guide. The EXTERNAL origin value is valid\n only for symmetric KMS keys.

\n

To create a KMS\n key in an CloudHSM key store and create its key material in the associated CloudHSM\n cluster, set this value to AWS_CLOUDHSM. You must also use the\n CustomKeyStoreId parameter to identify the CloudHSM key store. The\n KeySpec value must be SYMMETRIC_DEFAULT.

\n

To create a KMS key in\n an external key store, set this value to EXTERNAL_KEY_STORE. You must\n also use the CustomKeyStoreId parameter to identify the external key store and\n the XksKeyId parameter to identify the associated external key. The\n KeySpec value must be SYMMETRIC_DEFAULT.

" } }, "CustomKeyStoreId": { "target": "com.amazonaws.kms#CustomKeyStoreIdType", "traits": { - "smithy.api#documentation": "

Creates the KMS key in the specified custom key store. The ConnectionState of\n the custom key store must be CONNECTED. To find the CustomKeyStoreID and\n ConnectionState use the DescribeCustomKeyStores operation.

\n

This parameter is valid only for symmetric encryption KMS keys in a single Region. You\n cannot create any other type of KMS key in a custom key store.

\n

When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\n symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\n create a KMS key in an external key store, you must use the XksKeyId parameter to specify an\n external key that serves as key material for the KMS key.

" + "smithy.api#documentation": "

Creates the KMS key in the specified custom key store. The ConnectionState of\n the custom key store must be CONNECTED. To find the CustomKeyStoreID and\n ConnectionState use the DescribeCustomKeyStores operation.

\n

This parameter is valid only for symmetric encryption KMS keys in a single Region. You\n cannot create any other type of KMS key in a custom key store.

\n

When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\n symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\n create a KMS key in an external key store, you must use the XksKeyId parameter to\n specify an external key that serves as key material for the KMS key.

" } }, "BypassPolicyLockoutSafetyCheck": { @@ -1129,7 +1138,7 @@ "ConnectionErrorCode": { "target": "com.amazonaws.kms#ConnectionErrorCodeType", "traits": { - "smithy.api#documentation": "

Describes the connection error. This field appears in the response only when the\n ConnectionState is FAILED.

\n

Many failures can be resolved by updating the properties of the custom key store. To\n update a custom key store, disconnect it (DisconnectCustomKeyStore), correct\n the errors (UpdateCustomKeyStore), and try to connect again (ConnectCustomKeyStore). For additional help resolving these errors, see How to Fix a\n Connection Failure in Key Management Service Developer Guide.

\n

\n All custom key stores:\n

\n
    \n
  • \n

    \n INTERNAL_ERROR — KMS could not complete the request due to an\n internal error. Retry the request. For ConnectCustomKeyStore requests,\n disconnect the custom key store before trying to connect again.

    \n
  • \n
  • \n

    \n NETWORK_ERRORS — Network errors are preventing KMS from\n connecting the custom key store to its backing key store.

    \n
  • \n
\n

\n CloudHSM key stores:\n

\n
    \n
  • \n

    \n CLUSTER_NOT_FOUND — KMS cannot find the CloudHSM cluster with the\n specified cluster ID.

    \n
  • \n
  • \n

    \n INSUFFICIENT_CLOUDHSM_HSMS — The associated CloudHSM cluster does not\n contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\n must contain at least one active HSM.

    \n
  • \n
  • \n

    \n INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET — At least one private subnet\n associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM key\n store connection requires one free IP address in each of the associated private subnets,\n although two are preferable. For details, see How to Fix a Connection\n Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n INVALID_CREDENTIALS — The KeyStorePassword for the\n custom key store doesn't match the current password of the kmsuser crypto\n user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\n cluster, you must change the kmsuser account password and update the\n KeyStorePassword value for the custom key store.

    \n
  • \n
  • \n

    \n SUBNET_NOT_FOUND — A subnet in the CloudHSM cluster configuration was\n deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\n connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\n cluster from a recent backup and associate it with your custom key store. (This process\n creates a new cluster configuration with a VPC and private subnets.) For details, see\n How\n to Fix a Connection Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_LOCKED_OUT — The kmsuser CU account is locked\n out of the associated CloudHSM cluster due to too many failed password attempts. Before you\n can connect your custom key store to its CloudHSM cluster, you must change the\n kmsuser account password and update the key store password value for the\n custom key store.

    \n
  • \n
  • \n

    \n USER_LOGGED_IN — The kmsuser CU account is logged\n into the associated CloudHSM cluster. This prevents KMS from rotating the\n kmsuser account password and logging into the cluster. Before you can\n connect your custom key store to its CloudHSM cluster, you must log the kmsuser\n CU out of the cluster. If you changed the kmsuser password to log into the\n cluster, you must also and update the key store password value for the custom key store.\n For help, see How to Log Out and\n Reconnect in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_NOT_FOUND — KMS cannot find a kmsuser CU\n account in the associated CloudHSM cluster. Before you can connect your custom key store to\n its CloudHSM cluster, you must create a kmsuser CU account in the cluster, and\n then update the key store password value for the custom key store.

    \n
  • \n
\n

\n External key stores:\n

\n
    \n
  • \n

    \n INVALID_CREDENTIALS — One or both of the\n XksProxyAuthenticationCredential values is not valid on the specified\n external key store proxy.

    \n
  • \n
  • \n

    \n XKS_PROXY_ACCESS_DENIED — KMS requests are denied access to the\n external key store proxy. If the external key store proxy has authorization rules, verify\n that they permit KMS to communicate with the proxy on your behalf.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_CONFIGURATION — A configuration error is\n preventing the external key store from connecting to its proxy. Verify the value of the\n XksProxyUriPath.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_RESPONSE — KMS cannot interpret the response\n from the external key store proxy. If you see this connection error code repeatedly,\n notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_TLS_CONFIGURATION — KMS cannot connect to the\n external key store proxy because the TLS configuration is invalid. Verify that the XKS\n proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\n that it matches the hostname in the XksProxyUriEndpoint value, and that it is\n signed by a certificate authority included in the Trusted Certificate Authorities\n list.

    \n
  • \n
  • \n

    \n XKS_PROXY_NOT_REACHABLE — KMS can't communicate with your\n external key store proxy. Verify that the XksProxyUriEndpoint and\n XksProxyUriPath are correct. Use the tools for your external key store\n proxy to verify that the proxy is active and available on its network. Also, verify that\n your external key manager instances are operating properly. Connection attempts fail with\n this connection error code if the proxy reports that all external key manager instances\n are unavailable.

    \n
  • \n
  • \n

    \n XKS_PROXY_TIMED_OUT — KMS can connect to the external key store\n proxy, but the proxy does not respond to KMS in the time allotted. If you see this\n connection error code repeatedly, notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION — The Amazon VPC\n endpoint service configuration doesn't conform to the requirements for an KMS external\n key store.

    \n
      \n
    • \n

      The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.

      \n
    • \n
    • \n

      It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.

      \n
    • \n
    • \n

      The Allow principals list must include \n\t the KMS service principal for the Region, cks.kms..amazonaws.com, \n\t such as cks.kms.us-east-1.amazonaws.com.

      \n
    • \n
    • \n

      It must not require acceptance of connection requests.

      \n
    • \n
    • \n

      It must have a private DNS name. The private DNS name for an external key store with VPC_ENDPOINT_SERVICE connectivity\n\t must be unique in its Amazon Web Services Region.

      \n
    • \n
    • \n

      The domain of the private DNS name must have a verification status of\n\t verified.

      \n
    • \n
    • \n

      The TLS certificate specifies the private DNS hostname at which the endpoint is reachable.

      \n
    • \n
    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND — KMS can't find the VPC\n endpoint service that it uses to communicate with the external key store proxy. Verify\n that the XksProxyVpcEndpointServiceName is correct and the KMS service\n principal has service consumer permissions on the Amazon VPC endpoint service.

    \n
  • \n
" + "smithy.api#documentation": "

Describes the connection error. This field appears in the response only when the\n ConnectionState is FAILED.

\n

Many failures can be resolved by updating the properties of the custom key store. To\n update a custom key store, disconnect it (DisconnectCustomKeyStore), correct\n the errors (UpdateCustomKeyStore), and try to connect again (ConnectCustomKeyStore). For additional help resolving these errors, see How to Fix a\n Connection Failure in Key Management Service Developer Guide.

\n

\n All custom key stores:\n

\n
    \n
  • \n

    \n INTERNAL_ERROR — KMS could not complete the request due to an\n internal error. Retry the request. For ConnectCustomKeyStore requests,\n disconnect the custom key store before trying to connect again.

    \n
  • \n
  • \n

    \n NETWORK_ERRORS — Network errors are preventing KMS from\n connecting the custom key store to its backing key store.

    \n
  • \n
\n

\n CloudHSM key stores:\n

\n
    \n
  • \n

    \n CLUSTER_NOT_FOUND — KMS cannot find the CloudHSM cluster with the\n specified cluster ID.

    \n
  • \n
  • \n

    \n INSUFFICIENT_CLOUDHSM_HSMS — The associated CloudHSM cluster does not\n contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\n must contain at least one active HSM.

    \n
  • \n
  • \n

    \n INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET — At least one private\n subnet associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM\n key store connection requires one free IP address in each of the associated private\n subnets, although two are preferable. For details, see How to Fix a Connection\n Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n INVALID_CREDENTIALS — The KeyStorePassword for the\n custom key store doesn't match the current password of the kmsuser crypto\n user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\n cluster, you must change the kmsuser account password and update the\n KeyStorePassword value for the custom key store.

    \n
  • \n
  • \n

    \n SUBNET_NOT_FOUND — A subnet in the CloudHSM cluster configuration was\n deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\n connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\n cluster from a recent backup and associate it with your custom key store. (This process\n creates a new cluster configuration with a VPC and private subnets.) For details, see\n How\n to Fix a Connection Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_LOCKED_OUT — The kmsuser CU account is locked\n out of the associated CloudHSM cluster due to too many failed password attempts. Before you\n can connect your custom key store to its CloudHSM cluster, you must change the\n kmsuser account password and update the key store password value for the\n custom key store.

    \n
  • \n
  • \n

    \n USER_LOGGED_IN — The kmsuser CU account is logged\n into the associated CloudHSM cluster. This prevents KMS from rotating the\n kmsuser account password and logging into the cluster. Before you can\n connect your custom key store to its CloudHSM cluster, you must log the kmsuser\n CU out of the cluster. If you changed the kmsuser password to log into the\n cluster, you must also and update the key store password value for the custom key store.\n For help, see How to Log Out and\n Reconnect in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_NOT_FOUND — KMS cannot find a kmsuser CU\n account in the associated CloudHSM cluster. Before you can connect your custom key store to\n its CloudHSM cluster, you must create a kmsuser CU account in the cluster, and\n then update the key store password value for the custom key store.

    \n
  • \n
\n

\n External key stores:\n

\n
    \n
  • \n

    \n INVALID_CREDENTIALS — One or both of the\n XksProxyAuthenticationCredential values is not valid on the specified\n external key store proxy.

    \n
  • \n
  • \n

    \n XKS_PROXY_ACCESS_DENIED — KMS requests are denied access to the\n external key store proxy. If the external key store proxy has authorization rules, verify\n that they permit KMS to communicate with the proxy on your behalf.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_CONFIGURATION — A configuration error is\n preventing the external key store from connecting to its proxy. Verify the value of the\n XksProxyUriPath.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_RESPONSE — KMS cannot interpret the response\n from the external key store proxy. If you see this connection error code repeatedly,\n notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_TLS_CONFIGURATION — KMS cannot connect to the\n external key store proxy because the TLS configuration is invalid. Verify that the XKS\n proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\n that it matches the hostname in the XksProxyUriEndpoint value, and that it is\n signed by a certificate authority included in the Trusted Certificate Authorities list.

    \n
  • \n
  • \n

    \n XKS_PROXY_NOT_REACHABLE — KMS can't communicate with your\n external key store proxy. Verify that the XksProxyUriEndpoint and\n XksProxyUriPath are correct. Use the tools for your external key store\n proxy to verify that the proxy is active and available on its network. Also, verify that\n your external key manager instances are operating properly. Connection attempts fail with\n this connection error code if the proxy reports that all external key manager instances\n are unavailable.

    \n
  • \n
  • \n

    \n XKS_PROXY_TIMED_OUT — KMS can connect to the external key store\n proxy, but the proxy does not respond to KMS in the time allotted. If you see this\n connection error code repeatedly, notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION — The Amazon VPC\n endpoint service configuration doesn't conform to the requirements for an KMS external\n key store.

    \n
      \n
    • \n

      The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.

      \n
    • \n
    • \n

      It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.

      \n
    • \n
    • \n

      The Allow principals list must include \n\t the KMS service principal for the Region, cks.kms..amazonaws.com, \n\t such as cks.kms.us-east-1.amazonaws.com.

      \n
    • \n
    • \n

      It must not require acceptance of connection requests.

      \n
    • \n
    • \n

      It must have a private DNS name. The private DNS name for an external key store with VPC_ENDPOINT_SERVICE connectivity\n\t must be unique in its Amazon Web Services Region.

      \n
    • \n
    • \n

      The domain of the private DNS name must have a verification status of\n\t verified.

      \n
    • \n
    • \n

      The TLS certificate specifies the private DNS hostname at which the endpoint is reachable.

      \n
    • \n
    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND — KMS can't find the VPC\n endpoint service that it uses to communicate with the external key store proxy. Verify\n that the XksProxyVpcEndpointServiceName is correct and the KMS service\n principal has service consumer permissions on the Amazon VPC endpoint service.

    \n
  • \n
" } }, "CreationDate": { @@ -1331,6 +1340,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#IncorrectKeyException" }, @@ -1357,7 +1369,7 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#DecryptRequest": { @@ -1397,7 +1409,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data, KMS encrypts the\n plaintext data with the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data, KMS encrypts the\n plaintext data with the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -1417,7 +1435,7 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "EncryptionAlgorithm": { @@ -1610,7 +1628,7 @@ } ], "traits": { - "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores. Both\n topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores.\n Both topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -1904,6 +1922,23 @@ "smithy.api#output": {} } }, + "com.amazonaws.kms#DryRunOperationException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.kms#ErrorMessageType" + } + }, + "traits": { + "aws.protocols#awsQueryError": { + "code": "DryRunOperation", + "httpResponseCode": 412 + }, + "smithy.api#documentation": "

\n The request was rejected because the DryRun parameter was specified.\n

", + "smithy.api#error": "client", + "smithy.api#httpError": 412 + } + }, "com.amazonaws.kms#EnableKey": { "type": "operation", "input": { @@ -2016,6 +2051,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2036,7 +2074,7 @@ } ], "traits": { - "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes.\n To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#EncryptRequest": { @@ -2071,7 +2109,13 @@ "EncryptionAlgorithm": { "target": "com.amazonaws.kms#EncryptionAlgorithmSpec", "traits": { - "smithy.api#documentation": "

Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\n The algorithm must be compatible with the KMS key that you specify.

\n

This parameter is required only for asymmetric KMS keys. The default value,\n SYMMETRIC_DEFAULT, is the algorithm used for symmetric encryption KMS keys. If you are\n using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.

\n

The SM2PKE algorithm is only available in China Regions.

" + "smithy.api#documentation": "

Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\n The algorithm must be compatible with the KMS key that you specify.

\n

This parameter is required only for asymmetric KMS keys. The default value,\n SYMMETRIC_DEFAULT, is the algorithm used for symmetric encryption KMS keys. If\n you are using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.

\n

The SM2PKE algorithm is only available in China Regions.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2207,6 +2251,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2227,7 +2274,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related \n to the caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS \n and store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or \n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use \n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or a NumberOfBytes value of 16. The symmetric \n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related to the\n caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS and\n store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec\n value of AES_128 or a NumberOfBytes value of 16. The\n symmetric encryption key used in China Regions to encrypt your data key is an SM4 encryption\n key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GenerateDataKeyPair": { @@ -2245,6 +2292,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2268,7 +2318,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that you use\n ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or signing, but not both.\n However, KMS cannot enforce any restrictions on the use of data key pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKeyPair returns the public data key and a\n copy of the private data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the private data key (PrivateKeyPlaintext), the response includes a copy of the private data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services\n Nitro enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient\n parameter to provide the attestation document for the enclave.\n GenerateDataKeyPair returns the public data key and a copy of the private data\n key encrypted under the specified KMS key, as usual. But instead of a plaintext copy of the\n private data key (PrivateKeyPlaintext), the response includes a copy of the\n private data key encrypted under the public key from the attestation document\n (CiphertextForRecipient). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GenerateDataKeyPairRequest": { @@ -2303,7 +2353,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning a plaintext copy of the private data key, KMS encrypts\n the plaintext private data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the private data key encrypted\n under the KMS key specified by the KeyId parameter. The PrivateKeyPlaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning a plaintext copy of the private data\n key, KMS encrypts the plaintext private data key under the public key in the attestation\n document, and returns the resulting ciphertext in the CiphertextForRecipient\n field in the response. This ciphertext can be decrypted only with the private key in the\n enclave. The CiphertextBlob field in the response contains a copy of the private\n data key encrypted under the KMS key specified by the KeyId parameter. The\n PrivateKeyPlaintext field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2323,7 +2379,7 @@ "PrivateKeyPlaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n PrivateKeyPlaintext field is null or empty.

" + "smithy.api#documentation": "

The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n PrivateKeyPlaintext field is null or empty.

" } }, "PublicKey": { @@ -2347,7 +2403,7 @@ "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext private data key encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext private data key encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2370,6 +2426,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2393,7 +2452,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that you \n use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or signing, but not\n both. However, KMS cannot enforce any restrictions on the use of data key pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextRequest": { @@ -2424,6 +2483,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2499,7 +2564,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data key, KMS encrypts\n the plaintext data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the data key encrypted\n under the KMS key specified by the KeyId parameter. The Plaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data key, KMS encrypts\n the plaintext data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the data key encrypted\n under the KMS key specified by the KeyId parameter. The Plaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2519,7 +2590,7 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\n KMS. Then, remove it from memory as soon as possible.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\n KMS. Then, remove it from memory as soon as possible.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "KeyId": { @@ -2531,7 +2602,7 @@ "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext data key encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext data key encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2554,6 +2625,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2574,7 +2648,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to generate a data key. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or \n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use \n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to\n generate a data key. To get the type of your KMS key, use the DescribeKey\n operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GenerateDataKeyWithoutPlaintextRequest": { @@ -2610,6 +2684,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2648,6 +2728,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2668,7 +2751,7 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS key and a MAC algorithm that the key supports.\n HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

" + "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS\n key and a MAC algorithm that the key supports. HMAC KMS keys and the HMAC algorithms that\n KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

" } }, "com.amazonaws.kms#GenerateMacRequest": { @@ -2700,6 +2783,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2712,7 +2801,7 @@ "Mac": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The hash-based message authentication code (HMAC) that was generated for the\n specified message, HMAC KMS key, and MAC algorithm.

\n

This is the standard, raw HMAC defined in RFC 2104.

" + "smithy.api#documentation": "

The hash-based message authentication code (HMAC) that was generated for the specified\n message, HMAC KMS key, and MAC algorithm.

\n

This is the standard, raw HMAC defined in RFC 2104.

" } }, "MacAlgorithm": { @@ -2758,7 +2847,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

" + "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

" } }, "com.amazonaws.kms#GenerateRandomRequest": { @@ -2773,13 +2862,13 @@ "CustomKeyStoreId": { "target": "com.amazonaws.kms#CustomKeyStoreIdType", "traits": { - "smithy.api#documentation": "

Generates the random byte string in the CloudHSM cluster that is associated with the\n specified CloudHSM key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.

\n

External key store IDs are not valid for this parameter. If you specify the ID of an\n external key store, GenerateRandom throws an\n UnsupportedOperationException.

" + "smithy.api#documentation": "

Generates the random byte string in the CloudHSM cluster that is associated with the\n specified CloudHSM key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.

\n

External key store IDs are not valid for this parameter. If you specify the ID of an\n external key store, GenerateRandom throws an\n UnsupportedOperationException.

" } }, "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\n plaintext bytes under the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\n plaintext bytes under the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2793,13 +2882,13 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext random bytes encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext random bytes encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2963,7 +3052,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key and an import token you need to import or reimport key material for\n a KMS key.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

Before calling GetParametersForImport, use the CreateKey\n operation with an Origin value of EXTERNAL to create a KMS key with\n no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\n asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\n into a multi-Region key of\n any supported type. However, you can't import key material into a KMS key in a custom key store. You can also use\n GetParametersForImport to get a public key and import token to reimport the original key material into a KMS key whose key material expired or was\n deleted.

\n

\n GetParametersForImport returns the items that you need to import your key\n material.

\n
    \n
  • \n

    The public key (or \"wrapping key\") of an RSA key pair that KMS generates.

    \n

    You will use this public key to encrypt (\"wrap\") your key material while it's in\n transit to KMS.

    \n
  • \n
  • \n

    A import token that ensures that KMS can decrypt your key material and associate it with the correct KMS key.

    \n
  • \n
\n

The public key and its import token are permanently linked and must be used together. Each\n public key and import token set is valid for 24 hours. The expiration date and time appear in\n the ParametersValidTo field in the GetParametersForImport response.\n You cannot use an expired public key or import token in an ImportKeyMaterial\n request. If your key and token expire, send another GetParametersForImport\n request.

\n

\n GetParametersForImport requires the following information:

\n
    \n
  • \n

    The key ID of the KMS key for which you are importing the key material.

    \n
  • \n
  • \n

    The key spec of the public key (\"wrapping key\") that you will use to encrypt your key\n material during import.

    \n
  • \n
  • \n

    The wrapping algorithm that you will use with the public key to encrypt your key\n material.

    \n
  • \n
\n

You can use the same or a different public key spec and wrapping algorithm each time you\n import or reimport the same key material.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetParametersForImport (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns the public key and an import token you need to import or reimport key material for\n a KMS key.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

Before calling GetParametersForImport, use the CreateKey\n operation with an Origin value of EXTERNAL to create a KMS key with\n no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\n asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\n into a multi-Region key of\n any supported type. However, you can't import key material into a KMS key in a custom key store. You can also use\n GetParametersForImport to get a public key and import token to reimport the original key\n material into a KMS key whose key material expired or was deleted.

\n

\n GetParametersForImport returns the items that you need to import your key\n material.

\n
    \n
  • \n

    The public key (or \"wrapping key\") of an RSA key pair that KMS generates.

    \n

    You will use this public key to encrypt (\"wrap\") your key material while it's in\n transit to KMS.

    \n
  • \n
  • \n

    A import token that ensures that KMS can decrypt your key material and associate it\n with the correct KMS key.

    \n
  • \n
\n

The public key and its import token are permanently linked and must be used together. Each\n public key and import token set is valid for 24 hours. The expiration date and time appear in\n the ParametersValidTo field in the GetParametersForImport response.\n You cannot use an expired public key or import token in an ImportKeyMaterial\n request. If your key and token expire, send another GetParametersForImport\n request.

\n

\n GetParametersForImport requires the following information:

\n
    \n
  • \n

    The key ID of the KMS key for which you are importing the key material.

    \n
  • \n
  • \n

    The key spec of the public key (\"wrapping key\") that you will use to encrypt your key\n material during import.

    \n
  • \n
  • \n

    The wrapping algorithm that you will use with the public key to encrypt your key\n material.

    \n
  • \n
\n

You can use the same or a different public key spec and wrapping algorithm each time you\n import or reimport the same key material.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetParametersForImport (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GetParametersForImportRequest": { @@ -2979,7 +3068,7 @@ "WrappingAlgorithm": { "target": "com.amazonaws.kms#AlgorithmSpec", "traits": { - "smithy.api#documentation": "

The algorithm you will use with the RSA public key (PublicKey) in the\n response to protect your key material during import. For more information, see Select a wrapping algorithm in the Key Management Service Developer Guide.

\n

For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\n generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\n algorithms, you encrypt your key material directly with the RSA public key from KMS.

\n

The wrapping algorithms that you can use depend on the type of key material that you are\n importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.

\n
    \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_256 — Supported for wrapping RSA and ECC key\n material.

    \n
  • \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_1 — Supported for wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_256 — Supported for all types of key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping key spec to wrap \n ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_1 — Supported for all types of key material, except RSA key material (private\n key).

    \n

    You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key spec to wrap \n ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_PKCS1_V1_5 (Deprecated) — Supported only for symmetric encryption key\n material (and only in legacy mode).

    \n
  • \n
", + "smithy.api#documentation": "

The algorithm you will use with the RSA public key (PublicKey) in the\n response to protect your key material during import. For more information, see Select a wrapping algorithm in the Key Management Service Developer Guide.

\n

For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\n generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\n algorithms, you encrypt your key material directly with the RSA public key from KMS.

\n

The wrapping algorithms that you can use depend on the type of key material that you are\n importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.

\n
    \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_256 — Supported for\n wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_1 — Supported for\n wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_256 — Supported for all types\n of key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping\n key spec to wrap ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_1 — Supported for all types of\n key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key\n spec to wrap ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_PKCS1_V1_5 (Deprecated) — Supported only\n for symmetric encryption key material (and only in legacy mode).

    \n
  • \n
", "smithy.api#required": {} } }, @@ -3068,7 +3157,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you must \n specify the distinguishing ID. By default, KMS uses 1234567812345678 as the \n distinguishing ID. For more information, see Offline verification\n with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use:\n Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

" + "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

" } }, "com.amazonaws.kms#GetPublicKeyRequest": { @@ -3421,7 +3510,7 @@ } ], "traits": { - "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the\n KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#ImportKeyMaterialRequest": { @@ -3722,7 +3811,7 @@ "code": "KMSInvalidStateException", "httpResponseCode": 409 }, - "smithy.api#documentation": "

The request was rejected because the state of the specified resource is not valid for this\n request.

\n

This exceptions means one of the following:

\n
    \n
  • \n

    The key state of the KMS key is not compatible with the operation.

    \n

    To find the key state, use the DescribeKey operation. For more\n information about which key states are compatible with each KMS operation, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    For cryptographic operations on KMS keys in custom key stores, this exception represents a general failure with many possible causes. To identify the cause, see the error message that accompanies the exception.

    \n
  • \n
", + "smithy.api#documentation": "

The request was rejected because the state of the specified resource is not valid for this\n request.

\n

This exceptions means one of the following:

\n
    \n
  • \n

    The key state of the KMS key is not compatible with the operation.

    \n

    To find the key state, use the DescribeKey operation. For more\n information about which key states are compatible with each KMS operation, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    For cryptographic operations on KMS keys in custom key stores, this exception\n represents a general failure with many possible causes. To identify the cause, see the\n error message that accompanies the exception.

    \n
  • \n
", "smithy.api#error": "client", "smithy.api#httpError": 409 } @@ -3939,7 +4028,7 @@ "XksKeyConfiguration": { "target": "com.amazonaws.kms#XksKeyConfigurationType", "traits": { - "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an\n external key store.

\n

For more information, see \n External key in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an external key\n store.

\n

For more information, see External key in the\n Key Management Service Developer Guide.

" } } }, @@ -5023,6 +5112,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#IncorrectKeyException" }, @@ -5104,6 +5196,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5154,13 +5252,13 @@ "KeyEncryptionAlgorithm": { "target": "com.amazonaws.kms#KeyEncryptionMechanism", "traits": { - "smithy.api#documentation": "

The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro Enclave to encrypt plaintext \n values for the response. The only valid value is RSAES_OAEP_SHA_256.

" + "smithy.api#documentation": "

The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro\n Enclave to encrypt plaintext values for the response. The only valid value is\n RSAES_OAEP_SHA_256.

" } }, "AttestationDocument": { "target": "com.amazonaws.kms#AttestationDocumentType", "traits": { - "smithy.api#documentation": "

The attestation document for an Amazon Web Services Nitro Enclave. This document includes the enclave's public\n key.

" + "smithy.api#documentation": "

The attestation document for an Amazon Web Services Nitro Enclave. This document includes the enclave's\n public key.

" } } }, @@ -5307,6 +5405,9 @@ { "target": "com.amazonaws.kms#DependencyTimeoutException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -5350,6 +5451,12 @@ "traits": { "smithy.api#documentation": "

Identifies the grant to retire. To get the grant ID, use CreateGrant,\n ListGrants, or ListRetirableGrants.

\n
    \n
  • \n

    Grant ID Example -\n 0123456789012345678901234567890123456789012345678901234567890123

    \n
  • \n
" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5368,6 +5475,9 @@ { "target": "com.amazonaws.kms#DependencyTimeoutException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -5404,6 +5514,12 @@ "smithy.api#documentation": "

Identifies the grant to revoke. To get the grant ID, use CreateGrant,\n ListGrants, or ListRetirableGrants.

", "smithy.api#required": {} } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5436,7 +5552,7 @@ } ], "traits": { - "smithy.api#documentation": "

Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\n days, but you can specify a waiting period of 7-30 days. When this operation is successful,\n the key state of the KMS key changes to PendingDeletion and the key can't be used\n in any cryptographic operations. It remains in this state for the duration of the waiting\n period. Before the waiting period ends, you can use CancelKeyDeletion to\n cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\n its key material, and all KMS data associated with it, including all aliases that refer to\n it.

\n \n

Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\n is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\n exception is a multi-Region replica\n key, or an asymmetric or HMAC KMS key with imported key material[BUGBUG-link to\n importing-keys-managing.html#import-delete-key.) To prevent the use of a KMS key without\n deleting it, use DisableKey.

\n
\n

You can schedule the deletion of a multi-Region primary key and its replica keys at any\n time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\n you schedule the deletion of a primary key with replicas, its key state changes to\n PendingReplicaDeletion and it cannot be replicated or used in cryptographic\n operations. This status can continue indefinitely. When the last of its replicas keys is\n deleted (not just scheduled), the key state of the primary key changes to\n PendingDeletion and its waiting period (PendingWindowInDays)\n begins. For details, see Deleting multi-Region keys in the\n Key Management Service Developer Guide.

\n

When KMS deletes\n a KMS key from an CloudHSM key store, it makes a best effort to delete the associated\n key material from the associated CloudHSM cluster. However, you might need to manually delete\n the orphaned key material from the cluster and its backups. Deleting a KMS key from an\n external key store has no effect on the associated external key. However, for both\n types of custom key stores, deleting a KMS key is destructive and irreversible. You cannot\n decrypt ciphertext encrypted under the KMS key by using only its associated external key or\n CloudHSM key. Also, you cannot recreate a KMS key in an external key store by creating a new KMS\n key with the same key material.

\n

For more information about scheduling a KMS key for deletion, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ScheduleKeyDeletion (key\n policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\n days, but you can specify a waiting period of 7-30 days. When this operation is successful,\n the key state of the KMS key changes to PendingDeletion and the key can't be used\n in any cryptographic operations. It remains in this state for the duration of the waiting\n period. Before the waiting period ends, you can use CancelKeyDeletion to\n cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\n its key material, and all KMS data associated with it, including all aliases that refer to\n it.

\n \n

Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\n is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\n exception is a multi-Region replica\n key, or an asymmetric or HMAC KMS\n key with imported key material.) To prevent the use of a KMS key without deleting\n it, use DisableKey.

\n
\n

You can schedule the deletion of a multi-Region primary key and its replica keys at any\n time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\n you schedule the deletion of a primary key with replicas, its key state changes to\n PendingReplicaDeletion and it cannot be replicated or used in cryptographic\n operations. This status can continue indefinitely. When the last of its replicas keys is\n deleted (not just scheduled), the key state of the primary key changes to\n PendingDeletion and its waiting period (PendingWindowInDays)\n begins. For details, see Deleting multi-Region keys in the\n Key Management Service Developer Guide.

\n

When KMS deletes\n a KMS key from an CloudHSM key store, it makes a best effort to delete the associated\n key material from the associated CloudHSM cluster. However, you might need to manually delete\n the orphaned key material from the cluster and its backups. Deleting a KMS key from an\n external key store has no effect on the associated external key. However, for both\n types of custom key stores, deleting a KMS key is destructive and irreversible. You cannot\n decrypt ciphertext encrypted under the KMS key by using only its associated external key or\n CloudHSM key. Also, you cannot recreate a KMS key in an external key store by creating a new KMS\n key with the same key material.

\n

For more information about scheduling a KMS key for deletion, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ScheduleKeyDeletion (key\n policy)

\n

\n Related operations\n

\n " } }, "com.amazonaws.kms#ScheduleKeyDeletionRequest": { @@ -5452,7 +5568,7 @@ "PendingWindowInDays": { "target": "com.amazonaws.kms#PendingWindowInDaysType", "traits": { - "smithy.api#documentation": "

The waiting period, specified in number of days. After the waiting period ends, KMS\n deletes the KMS key.

\n

If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\n when the last of its replica keys is deleted. Otherwise, the waiting period begins\n immediately.

\n

This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\n you do not include a value, it defaults to 30. You can use the \n kms:ScheduleKeyDeletionPendingWindowInDays\n \n condition key to further constrain the values that principals can specify in the \n PendingWindowInDays parameter.

" + "smithy.api#documentation": "

The waiting period, specified in number of days. After the waiting period ends, KMS\n deletes the KMS key.

\n

If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\n when the last of its replica keys is deleted. Otherwise, the waiting period begins\n immediately.

\n

This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\n you do not include a value, it defaults to 30. You can use the \n kms:ScheduleKeyDeletionPendingWindowInDays\n condition key to further\n constrain the values that principals can specify in the PendingWindowInDays\n parameter.

" } } }, @@ -5507,6 +5623,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -5543,14 +5662,14 @@ "Message": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\n larger message, provide a message digest.

\n

If you provide a message digest, use the DIGEST value of MessageType to\n prevent the digest from being hashed again while signing.

", + "smithy.api#documentation": "

Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\n larger message, provide a message digest.

\n

If you provide a message digest, use the DIGEST value of\n MessageType to prevent the digest from being hashed again while signing.

", "smithy.api#required": {} } }, "MessageType": { "target": "com.amazonaws.kms#MessageType", "traits": { - "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed\n as part of the signing algorithm. Use RAW for unhashed messages; use DIGEST\n for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST, KMS skips\n the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed message,\n the security of the signing operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length\n of the Message value must match the length of hashed messages for the specified signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, this can cause verification failures when \n verifying with a system that assumes a single hash.

\n

The hashing algorithm in that Sign uses is based on the SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline verification with SM2 key pairs.

    \n
  • \n
" + "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed as\n part of the signing algorithm. Use RAW for unhashed messages; use\n DIGEST for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST,\n KMS skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed\n message, the security of the signing operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length of the\n Message value must match the length of hashed messages for the specified\n signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, this can cause\n verification failures when verifying with a system that assumes a single hash.

\n

The hashing algorithm in that Sign uses is based on the\n SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline\n verification with SM2 key pairs.

    \n
  • \n
" } }, "GrantTokens": { @@ -5562,9 +5681,15 @@ "SigningAlgorithm": { "target": "com.amazonaws.kms#SigningAlgorithmSpec", "traits": { - "smithy.api#documentation": "

Specifies the signing algorithm to use when signing the message.

\n

Choose an algorithm that is compatible with the type and size of the specified asymmetric\n KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\n RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.

", + "smithy.api#documentation": "

Specifies the signing algorithm to use when signing the message.

\n

Choose an algorithm that is compatible with the type and size of the specified asymmetric\n KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\n RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.

", "smithy.api#required": {} } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5773,7 +5898,7 @@ "Tags": { "target": "com.amazonaws.kms#TagList", "traits": { - "smithy.api#documentation": "

One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an empty (null)\n string.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

You cannot have more than one tag on a KMS key with the same tag key. If you specify an\n existing tag key with a different tag value, KMS replaces the current tag value with the\n specified one.

", + "smithy.api#documentation": "

One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an\n empty (null) string.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

You cannot have more than one tag on a KMS key with the same tag key. If you specify an\n existing tag key with a different tag value, KMS replaces the current tag value with the\n specified one.

", "smithy.api#required": {} } } @@ -7623,6 +7748,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -7646,7 +7774,7 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the\n same asymmetric KMS key, message, and signing algorithm that were used to produce the\n signature. The message type does not need to be the same as the one used for signing, but it must \n indicate whether the value of the Message parameter should be\n hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you must \n specify the distinguishing ID. By default, KMS uses 1234567812345678 as the \n distinguishing ID. For more information, see Offline verification\n with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

" + "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the same asymmetric KMS key, message,\n and signing algorithm that were used to produce the signature. The message type does not need\n to be the same as the one used for signing, but it must indicate whether the value of the\n Message parameter should be hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

" } }, "com.amazonaws.kms#VerifyMac": { @@ -7661,6 +7789,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -7723,6 +7854,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -7769,14 +7906,14 @@ "Message": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\n or a hash digest of the message. If you submit a digest, use the MessageType parameter\n with a value of DIGEST.

\n

If the message specified here is different from the message that was signed, the signature\n verification fails. A message and its hash digest are considered to be the same\n message.

", + "smithy.api#documentation": "

Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\n or a hash digest of the message. If you submit a digest, use the MessageType\n parameter with a value of DIGEST.

\n

If the message specified here is different from the message that was signed, the signature\n verification fails. A message and its hash digest are considered to be the same\n message.

", "smithy.api#required": {} } }, "MessageType": { "target": "com.amazonaws.kms#MessageType", "traits": { - "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed\n as part of the signing algorithm. Use RAW for unhashed messages; use DIGEST\n for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST, KMS \n skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed message,\n the security of the verification operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length\n of the Message value must match the length of hashed messages for the specified signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, if the signed message is hashed once\n while signing, but twice while verifying, verification fails, even when the message hasn't changed.

\n

The hashing algorithm in that Verify uses is based on the SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline verification with SM2 key pairs.

    \n
  • \n
" + "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed as\n part of the signing algorithm. Use RAW for unhashed messages; use\n DIGEST for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST,\n KMS skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed\n message, the security of the verification operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length of the\n Message value must match the length of hashed messages for the specified\n signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, if the signed message\n is hashed once while signing, but twice while verifying, verification fails, even when the\n message hasn't changed.

\n

The hashing algorithm in that Verify uses is based on the\n SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline\n verification with SM2 key pairs.

    \n
  • \n
" } }, "Signature": { @@ -7798,6 +7935,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -7877,12 +8020,12 @@ "Id": { "target": "com.amazonaws.kms#XksKeyIdType", "traits": { - "smithy.api#documentation": "

The ID of the external key in its external key manager. This is the ID that the external key store proxy uses to identify the external key.

" + "smithy.api#documentation": "

The ID of the external key in its external key manager. This is the ID that the external\n key store proxy uses to identify the external key.

" } } }, "traits": { - "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an\n external key store.

\n

This element appears in a CreateKey or DescribeKey\n response only for a KMS key in an external key store.

\n

The external key is a symmetric encryption key that is hosted by\n an external key manager outside of Amazon Web Services. When you use the KMS key in an external key store\n in a cryptographic operation, the cryptographic operation is performed in the\n external key manager using the specified external key. For more information, see External key in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

Information about the external key that is\n associated with a KMS key in an external key store.

\n

This element appears in a CreateKey or DescribeKey\n response only for a KMS key in an external key store.

\n

The external key is a symmetric encryption key that is hosted by an\n external key manager outside of Amazon Web Services. When you use the KMS key in an external key store in a\n cryptographic operation, the cryptographic operation is performed in the external key manager\n using the specified external key. For more information, see External key in the\n Key Management Service Developer Guide.

" } }, "com.amazonaws.kms#XksKeyIdType": { @@ -7924,7 +8067,7 @@ "code": "XksKeyNotFoundException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

The request was rejected because the external key store proxy could not find the external key. This\n exception is thrown when the value of the XksKeyId parameter doesn't identify a\n key in the external key manager associated with the external key proxy.

\n

Verify that the XksKeyId represents an existing key in the external key\n manager. Use the key identifier that the external key store proxy uses to identify the key.\n For details, see the documentation provided with your external key store proxy or key\n manager.

", + "smithy.api#documentation": "

The request was rejected because the external key store proxy could not find the external\n key. This exception is thrown when the value of the XksKeyId parameter doesn't\n identify a key in the external key manager associated with the external key proxy.

\n

Verify that the XksKeyId represents an existing key in the external key\n manager. Use the key identifier that the external key store proxy uses to identify the key.\n For details, see the documentation provided with your external key store proxy or key\n manager.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } @@ -7985,7 +8128,7 @@ "AccessKeyId": { "target": "com.amazonaws.kms#XksProxyAuthenticationAccessKeyIdType", "traits": { - "smithy.api#documentation": "

The part of the external key store proxy authentication credential\n that uniquely identifies the secret access key.

" + "smithy.api#documentation": "

The part of the external key store proxy authentication credential that uniquely identifies the secret access\n key.

" } }, "UriEndpoint": { @@ -8145,7 +8288,7 @@ "code": "XksProxyUriUnreachableException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

KMS was unable to reach the specified XksProxyUriPath. The path must be\n reachable before you create the external key store or update its settings.

\n

This exception is also thrown when the external key store proxy response to a GetHealthStatus\n request indicates that all external key manager instances are unavailable.

", + "smithy.api#documentation": "

KMS was unable to reach the specified XksProxyUriPath. The path must be\n reachable before you create the external key store or update its settings.

\n

This exception is also thrown when the external key store proxy response to a\n GetHealthStatus request indicates that all external key manager instances are\n unavailable.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } @@ -8179,7 +8322,7 @@ "code": "XksProxyVpcEndpointServiceInvalidConfigurationException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\n the requirements for an external key store proxy. For details, see the exception message and\n review the requirements for Amazon VPC endpoint service connectivity for an external key\n store.

", + "smithy.api#documentation": "

The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\n the requirements for an external key store proxy. For details, see the exception message and\n review the\n requirements for Amazon VPC endpoint service connectivity for an external key\n store.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } diff --git a/aws/sdk/aws-models/lambda.json b/aws/sdk/aws-models/lambda.json index df1e4216396..e3300f4f548 100644 --- a/aws/sdk/aws-models/lambda.json +++ b/aws/sdk/aws-models/lambda.json @@ -2567,13 +2567,13 @@ "StartingPosition": { "target": "com.amazonaws.lambda#EventSourcePosition", "traits": { - "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis, Amazon\n DynamoDB, and Amazon MSK Streams sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams and Amazon DocumentDB.

" + "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis and\n Amazon DynamoDB Stream event sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.

" } }, "StartingPositionTimestamp": { "target": "com.amazonaws.lambda#Date", "traits": { - "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading.

" + "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading. StartingPositionTimestamp cannot be in the future.

" } }, "DestinationConfig": { @@ -3133,6 +3133,9 @@ { "target": "com.amazonaws.lambda#InvalidParameterValueException" }, + { + "target": "com.amazonaws.lambda#ResourceConflictException" + }, { "target": "com.amazonaws.lambda#ResourceInUseException" }, @@ -3197,7 +3200,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a Lambda function. To delete a specific function version, use the Qualifier parameter.\n Otherwise, all versions and aliases are deleted.

\n

To delete Lambda event source mappings that invoke a function, use DeleteEventSourceMapping. For Amazon Web Services and resources that invoke your function\n directly, delete the trigger in the service where you originally configured it.

", + "smithy.api#documentation": "

Deletes a Lambda function. To delete a specific function version, use the Qualifier parameter.\n Otherwise, all versions and aliases are deleted. This doesn't require the user to have explicit\n permissions for DeleteAlias.

\n

To delete Lambda event source mappings that invoke a function, use DeleteEventSourceMapping. For Amazon Web Services and resources that invoke your function\n directly, delete the trigger in the service where you originally configured it.

", "smithy.api#http": { "method": "DELETE", "uri": "/2015-03-31/functions/{FunctionName}", @@ -3912,13 +3915,13 @@ "StartingPosition": { "target": "com.amazonaws.lambda#EventSourcePosition", "traits": { - "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis, Amazon DynamoDB, and Amazon MSK stream sources. AT_TIMESTAMP is supported only for Amazon Kinesis\n streams and Amazon DocumentDB.

" + "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis and\n Amazon DynamoDB Stream event sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.

" } }, "StartingPositionTimestamp": { "target": "com.amazonaws.lambda#Date", "traits": { - "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading.

" + "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading. StartingPositionTimestamp cannot be in the future.

" } }, "BatchSize": { @@ -6450,6 +6453,9 @@ { "target": "com.amazonaws.lambda#KMSNotFoundException" }, + { + "target": "com.amazonaws.lambda#RecursiveInvocationException" + }, { "target": "com.amazonaws.lambda#RequestTooLargeException" }, @@ -6666,6 +6672,9 @@ { "target": "com.amazonaws.lambda#KMSNotFoundException" }, + { + "target": "com.amazonaws.lambda#RecursiveInvocationException" + }, { "target": "com.amazonaws.lambda#RequestTooLargeException" }, @@ -9485,6 +9494,28 @@ } } }, + "com.amazonaws.lambda#RecursiveInvocationException": { + "type": "structure", + "members": { + "Type": { + "target": "com.amazonaws.lambda#String", + "traits": { + "smithy.api#documentation": "

The exception type.

" + } + }, + "Message": { + "target": "com.amazonaws.lambda#String", + "traits": { + "smithy.api#documentation": "

The exception message.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Lambda has detected your function being invoked in a recursive loop with other Amazon Web Services resources and stopped your function's invocation.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, "com.amazonaws.lambda#RemoveLayerVersionPermission": { "type": "operation", "input": { @@ -9948,6 +9979,12 @@ "traits": { "smithy.api#enumValue": "ruby3.2" } + }, + "python311": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "python3.11" + } } } }, @@ -10131,7 +10168,7 @@ } }, "traits": { - "smithy.api#documentation": "

The function's Lambda SnapStart setting. Set ApplyOn to PublishedVersions to create a\n snapshot of the initialized execution environment when you publish a function version.

\n

SnapStart is supported with the java11 runtime. For more information, see\n Improving startup performance with Lambda\n SnapStart.

" + "smithy.api#documentation": "

The function's Lambda SnapStart setting. Set ApplyOn to PublishedVersions to create a\n snapshot of the initialized execution environment when you publish a function version.

" } }, "com.amazonaws.lambda#SnapStartApplyOn": { diff --git a/aws/sdk/aws-models/polly.json b/aws/sdk/aws-models/polly.json index 219c1a0a927..ebc45a63dbd 100644 --- a/aws/sdk/aws-models/polly.json +++ b/aws/sdk/aws-models/polly.json @@ -683,6 +683,18 @@ "traits": { "smithy.api#enumValue": "en-IE" } + }, + "nl_BE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "nl-BE" + } + }, + "fr_BE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "fr-BE" + } } } }, @@ -3389,6 +3401,18 @@ "traits": { "smithy.api#enumValue": "Sofie" } + }, + "Lisa": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Lisa" + } + }, + "Isabelle": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Isabelle" + } } } }, diff --git a/aws/sdk/aws-models/route53.json b/aws/sdk/aws-models/route53.json index 72d97074e35..388346dd5b7 100644 --- a/aws/sdk/aws-models/route53.json +++ b/aws/sdk/aws-models/route53.json @@ -1628,6 +1628,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ActivateKeySigningKeyResponse": { @@ -1639,6 +1642,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#AlarmIdentifier": { @@ -1780,7 +1786,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to associate a VPC with a\n\t\t\tprivate hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to associate a VPC with a\n\t\t\tprivate hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#AssociateVPCWithHostedZoneResponse": { @@ -1795,7 +1802,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tAssociateVPCWithHostedZone request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tAssociateVPCWithHostedZone request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Change": { @@ -1925,6 +1933,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeCidrCollectionResponse": { @@ -1937,6 +1948,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ChangeId": { @@ -2009,7 +2023,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates\n\t\t\tyour changes to all of the Route 53 authoritative DNS servers. While your changes are\n\t\t\tpropagating, GetChange returns a status of PENDING. When\n\t\t\tpropagation is complete, GetChange returns a status of INSYNC.\n\t\t\tChanges generally propagate to all Route 53 name servers within 60 seconds. For more\n\t\t\tinformation, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates your\n\t\t\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\n\t\t\tyour changes are propagating, GetChange returns a status of\n\t\t\t\tPENDING. When propagation is complete, GetChange returns a\n\t\t\tstatus of INSYNC. Changes generally propagate to all Route 53 name servers\n\t\t\tmanaging the hosted zone within 60 seconds. For more information, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/rrset", @@ -2037,7 +2051,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains change information for the resource record set.

" + "smithy.api#documentation": "

A complex type that contains change information for the resource record set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeResourceRecordSetsResponse": { @@ -2052,7 +2067,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response for the request.

" + "smithy.api#documentation": "

A complex type containing the response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ChangeStatus": { @@ -2139,14 +2155,16 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the tags that you want to add, edit, or\n\t\t\tdelete.

" + "smithy.api#documentation": "

A complex type that contains information about the tags that you want to add, edit, or\n\t\t\tdelete.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeTagsForResourceResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty response for the request.

" + "smithy.api#documentation": "

Empty response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Changes": { @@ -2700,6 +2718,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { @@ -2886,6 +2910,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateCidrCollectionResponse": { @@ -2904,6 +2931,9 @@ "smithy.api#httpHeader": "Location" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateHealthCheck": { @@ -2953,7 +2983,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the health check request information.

" + "smithy.api#documentation": "

A complex type that contains the health check request information.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateHealthCheckResponse": { @@ -2976,7 +3007,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the new health check.

" + "smithy.api#documentation": "

A complex type containing the response information for the new health check.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateHostedZone": { @@ -3057,12 +3089,13 @@ "DelegationSetId": { "target": "com.amazonaws.route53#ResourceId", "traits": { - "smithy.api#documentation": "

If you want to associate a reusable delegation set with this hosted zone, the ID that\n\t\t\t\tAmazon Route 53 assigned to the reusable delegation set when you created it.\n\t\t\tFor more information about reusable delegation sets, see CreateReusableDelegationSet.

" + "smithy.api#documentation": "

If you want to associate a reusable delegation set with this hosted zone, the ID that\n\t\t\t\tAmazon Route 53 assigned to the reusable delegation set when you created it.\n\t\t\tFor more information about reusable delegation sets, see CreateReusableDelegationSet.

\n

If you are using a reusable delegation set to create a public hosted zone for a subdomain,\n\t\t\tmake sure that the parent hosted zone doesn't use one or more of the same name servers.\n\t\t\tIf you have overlapping nameservers, the operation will cause a\n\t\t\t\tConflictingDomainsExist error.

" } } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a public or\n\t\t\tprivate hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a public or\n\t\t\tprivate hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateHostedZoneResponse": { @@ -3105,7 +3138,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the hosted zone.

" + "smithy.api#documentation": "

A complex type containing the response information for the hosted zone.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateKeySigningKey": { @@ -3195,6 +3229,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateKeySigningKeyResponse": { @@ -3221,6 +3258,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateQueryLoggingConfig": { @@ -3277,6 +3317,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateQueryLoggingConfigResponse": { @@ -3297,6 +3340,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateReusableDelegationSet": { @@ -3355,6 +3401,9 @@ "smithy.api#documentation": "

If you want to mark the delegation set for an existing hosted zone as reusable, the ID\n\t\t\tfor that hosted zone.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateReusableDelegationSetResponse": { @@ -3375,6 +3424,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicy": { @@ -3482,7 +3534,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto create based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto create based on a specified traffic policy.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyInstanceResponse": { @@ -3505,7 +3558,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyInstance request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyInstance request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicyRequest": { @@ -3533,7 +3587,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyResponse": { @@ -3556,7 +3611,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicy request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicy request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicyVersion": { @@ -3619,7 +3675,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate a new version for.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate a new version for.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyVersionResponse": { @@ -3642,7 +3699,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyVersion request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyVersion request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateVPCAssociationAuthorization": { @@ -3699,7 +3757,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to authorize associating a\n\t\t\tVPC with your private hosted zone. Authorization is only required when a private hosted\n\t\t\tzone and a VPC were created by using different accounts.

" + "smithy.api#documentation": "

A complex type that contains information about the request to authorize associating a\n\t\t\tVPC with your private hosted zone. Authorization is only required when a private hosted\n\t\t\tzone and a VPC were created by using different accounts.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateVPCAssociationAuthorizationResponse": { @@ -3721,7 +3780,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information from a\n\t\t\t\tCreateVPCAssociationAuthorization request.

" + "smithy.api#documentation": "

A complex type that contains the response information from a\n\t\t\t\tCreateVPCAssociationAuthorization request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DNSName": { @@ -3828,6 +3888,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeactivateKeySigningKeyResponse": { @@ -3839,6 +3902,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#DelegationSet": { @@ -4008,11 +4074,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteCidrCollectionResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.route53#DeleteHealthCheck": { "type": "operation", @@ -4055,14 +4127,16 @@ } }, "traits": { - "smithy.api#documentation": "

This action deletes a health check.

" + "smithy.api#documentation": "

This action deletes a health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteHealthCheckResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteHostedZone": { @@ -4112,7 +4186,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a hosted zone.

" + "smithy.api#documentation": "

A request to delete a hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteHostedZoneResponse": { @@ -4127,7 +4202,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a DeleteHostedZone\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a DeleteHostedZone\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteKeySigningKey": { @@ -4186,6 +4262,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteKeySigningKeyResponse": { @@ -4197,6 +4276,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteQueryLoggingConfig": { @@ -4238,11 +4320,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteQueryLoggingConfigResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.route53#DeleteReusableDelegationSet": { "type": "operation", @@ -4288,14 +4376,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a reusable delegation set.

" + "smithy.api#documentation": "

A request to delete a reusable delegation set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteReusableDelegationSetResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteTrafficPolicy": { @@ -4370,14 +4460,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a specified traffic policy instance.

" + "smithy.api#documentation": "

A request to delete a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyInstanceResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyRequest": { @@ -4401,14 +4493,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a specified traffic policy version.

" + "smithy.api#documentation": "

A request to delete a specified traffic policy version.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteVPCAssociationAuthorization": { @@ -4465,14 +4559,16 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to remove authorization to\n\t\t\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\n\t\t\tthat was created with a different Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains information about the request to remove authorization to\n\t\t\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\n\t\t\tthat was created with a different Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteVPCAssociationAuthorizationResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty response for the request.

" + "smithy.api#documentation": "

Empty response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Dimension": { @@ -4575,6 +4671,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DisableHostedZoneDNSSECResponse": { @@ -4586,6 +4685,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#Disabled": { @@ -4654,7 +4756,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the VPC that you want to disassociate\n\t\t\tfrom a specified private hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the VPC that you want to disassociate\n\t\t\tfrom a specified private hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DisassociateVPCFromHostedZoneResponse": { @@ -4669,7 +4772,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the disassociate\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response information for the disassociate\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#EnableHostedZoneDNSSEC": { @@ -4729,6 +4833,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#EnableHostedZoneDNSSECResponse": { @@ -4740,6 +4847,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#EnableSNI": { @@ -4951,7 +5061,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetAccountLimitResponse": { @@ -4974,7 +5085,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetChange": { @@ -4994,7 +5106,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the current status of a change batch request. The status is one of the\n\t\t\tfollowing values:

\n
    \n
  • \n

    \n PENDING indicates that the changes in this request have not\n\t\t\t\t\tpropagated to all Amazon Route 53 DNS servers. This is the initial status of all\n\t\t\t\t\tchange batch requests.

    \n
  • \n
  • \n

    \n INSYNC indicates that the changes have propagated to all Route 53\n\t\t\t\t\tDNS servers.

    \n
  • \n
", + "smithy.api#documentation": "

Returns the current status of a change batch request. The status is one of the\n\t\t\tfollowing values:

\n
    \n
  • \n

    \n PENDING indicates that the changes in this request have not\n\t\t\t\t\tpropagated to all Amazon Route 53 DNS servers managing the hosted zone. This is the initial status of all\n\t\t\t\t\tchange batch requests.

    \n
  • \n
  • \n

    \n INSYNC indicates that the changes have propagated to all Route 53\n\t\t\t\t\tDNS servers managing the hosted zone.

    \n
  • \n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/change/{Id}", @@ -5032,7 +5144,8 @@ } }, "traits": { - "smithy.api#documentation": "

The input for a GetChange request.

" + "smithy.api#documentation": "

The input for a GetChange request.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetChangeResponse": { @@ -5047,7 +5160,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the ChangeInfo element.

" + "smithy.api#documentation": "

A complex type that contains the ChangeInfo element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetCheckerIpRanges": { @@ -5071,7 +5185,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty request.

" + "smithy.api#documentation": "

Empty request.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetCheckerIpRangesResponse": { @@ -5086,7 +5201,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the CheckerIpRanges element.

" + "smithy.api#documentation": "

A complex type that contains the CheckerIpRanges element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetDNSSEC": { @@ -5128,6 +5244,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#GetDNSSECResponse": { @@ -5147,6 +5266,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#GetGeoLocation": { @@ -5200,7 +5322,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for information about whether a specified geographic location is supported\n\t\t\tfor Amazon Route 53 geolocation resource record sets.

" + "smithy.api#documentation": "

A request for information about whether a specified geographic location is supported\n\t\t\tfor Amazon Route 53 geolocation resource record sets.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetGeoLocationResponse": { @@ -5215,7 +5338,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the specified geolocation\n\t\t\tcode.

" + "smithy.api#documentation": "

A complex type that contains the response information for the specified geolocation\n\t\t\tcode.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheck": { @@ -5267,7 +5391,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

A request for the number of health checks that are associated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request for the number of health checks that are associated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckCountResponse": { @@ -5282,7 +5407,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheckCount\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheckCount\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckLastFailureReason": { @@ -5323,7 +5449,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the reason that a health check failed most recently.

" + "smithy.api#documentation": "

A request for the reason that a health check failed most recently.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckLastFailureReasonResponse": { @@ -5338,7 +5465,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a\n\t\t\t\tGetHealthCheckLastFailureReason request.

" + "smithy.api#documentation": "

A complex type that contains the response to a\n\t\t\t\tGetHealthCheckLastFailureReason request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckRequest": { @@ -5354,7 +5482,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified health check.

" + "smithy.api#documentation": "

A request to get information about a specified health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckResponse": { @@ -5369,7 +5498,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckStatus": { @@ -5410,7 +5540,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get the status for a health check.

" + "smithy.api#documentation": "

A request to get the status for a health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckStatusResponse": { @@ -5425,7 +5556,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZone": { @@ -5479,7 +5611,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

A request to retrieve a count of all the hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a count of all the hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneCountResponse": { @@ -5494,7 +5627,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHostedZoneCount\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHostedZoneCount\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZoneLimit": { @@ -5546,7 +5680,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneLimitResponse": { @@ -5569,7 +5704,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZoneRequest": { @@ -5585,7 +5721,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified hosted zone.

" + "smithy.api#documentation": "

A request to get information about a specified hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneResponse": { @@ -5612,7 +5749,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contain the response to a GetHostedZone\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contain the response to a GetHostedZone\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetQueryLoggingConfig": { @@ -5651,6 +5789,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#GetQueryLoggingConfigResponse": { @@ -5663,6 +5804,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#GetReusableDelegationSet": { @@ -5739,7 +5883,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetReusableDelegationSetLimitResponse": { @@ -5762,7 +5907,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetReusableDelegationSetRequest": { @@ -5778,7 +5924,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified reusable delegation set.

" + "smithy.api#documentation": "

A request to get information about a specified reusable delegation set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetReusableDelegationSetResponse": { @@ -5793,7 +5940,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the GetReusableDelegationSet\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the GetReusableDelegationSet\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicy": { @@ -5867,7 +6015,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Request to get the number of traffic policy instances that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

Request to get the number of traffic policy instances that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceCountResponse": { @@ -5882,7 +6031,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceRequest": { @@ -5898,7 +6048,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

" + "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceResponse": { @@ -5913,7 +6064,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicyRequest": { @@ -5937,7 +6089,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets information about a specific traffic policy version.

" + "smithy.api#documentation": "

Gets information about a specific traffic policy version.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyResponse": { @@ -5952,7 +6105,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#HealthCheck": { @@ -7160,6 +7314,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrBlocksResponse": { @@ -7177,6 +7334,9 @@ "smithy.api#documentation": "

A complex type that contains information about the CIDR blocks.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListCidrCollections": { @@ -7224,6 +7384,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrCollectionsResponse": { @@ -7241,6 +7404,9 @@ "smithy.api#documentation": "

A complex type with information about the CIDR collection.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListCidrLocations": { @@ -7299,6 +7465,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrLocationsResponse": { @@ -7316,6 +7485,9 @@ "smithy.api#documentation": "

A complex type that contains information about the list of CIDR locations.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListGeoLocations": { @@ -7373,7 +7545,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get a list of geographic locations that Amazon Route 53 supports for\n\t\t\tgeolocation resource record sets.

" + "smithy.api#documentation": "

A request to get a list of geographic locations that Amazon Route 53 supports for\n\t\t\tgeolocation resource record sets.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListGeoLocationsResponse": { @@ -7421,7 +7594,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the request.

" + "smithy.api#documentation": "

A complex type containing the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHealthChecks": { @@ -7474,7 +7648,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to retrieve a list of the health checks that are associated with the current\n\t\t\t\tAmazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a list of the health checks that are associated with the current\n\t\t\t\tAmazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHealthChecksResponse": { @@ -7517,7 +7692,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a ListHealthChecks\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a ListHealthChecks\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZones": { @@ -7605,7 +7781,8 @@ } }, "traits": { - "smithy.api#documentation": "

Retrieves a list of the public and private hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account in ASCII order by domain name.

" + "smithy.api#documentation": "

Retrieves a list of the public and private hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account in ASCII order by domain name.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesByNameResponse": { @@ -7659,7 +7836,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZonesByVPC": { @@ -7722,7 +7900,8 @@ } }, "traits": { - "smithy.api#documentation": "

Lists all the private hosted zones that a specified VPC is associated with, regardless\n\t\t\tof which Amazon Web Services account created the hosted zones.

" + "smithy.api#documentation": "

Lists all the private hosted zones that a specified VPC is associated with, regardless\n\t\t\tof which Amazon Web Services account created the hosted zones.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesByVPCResponse": { @@ -7748,6 +7927,9 @@ "smithy.api#documentation": "

The value that you will use for NextToken in the next\n\t\t\t\tListHostedZonesByVPC request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZonesRequest": { @@ -7776,7 +7958,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to retrieve a list of the public and private hosted zones that are\n\t\t\tassociated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a list of the public and private hosted zones that are\n\t\t\tassociated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesResponse": { @@ -7817,6 +8000,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListQueryLoggingConfigs": { @@ -7877,6 +8063,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListQueryLoggingConfigsResponse": { @@ -7895,6 +8084,9 @@ "smithy.api#documentation": "

If a response includes the last of the query logging configurations that are\n\t\t\tassociated with the current Amazon Web Services account, NextToken doesn't\n\t\t\tappear in the response.

\n

If a response doesn't include the last of the configurations, you can get more\n\t\t\tconfigurations by submitting another ListQueryLoggingConfigs request. Get the value of NextToken\n\t\t\tthat Amazon Route 53 returned in the previous response and include it in\n\t\t\t\tNextToken in the next request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListResourceRecordSets": { @@ -7963,7 +8155,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the resource record sets that are associated with a specified hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A request for the resource record sets that are associated with a specified hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListResourceRecordSetsResponse": { @@ -8011,7 +8204,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains list information for the resource record set.

" + "smithy.api#documentation": "

A complex type that contains list information for the resource record set.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListReusableDelegationSets": { @@ -8055,7 +8249,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get a list of the reusable delegation sets that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

A request to get a list of the reusable delegation sets that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListReusableDelegationSetsResponse": { @@ -8098,7 +8293,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the reusable delegation sets that are\n\t\t\tassociated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains information about the reusable delegation sets that are\n\t\t\tassociated with the current Amazon Web Services account.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTagsForResource": { @@ -8156,7 +8352,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing information about a request for a list of the tags that are\n\t\t\tassociated with an individual resource.

" + "smithy.api#documentation": "

A complex type containing information about a request for a list of the tags that are\n\t\t\tassociated with an individual resource.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTagsForResourceResponse": { @@ -8171,7 +8368,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

" + "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTagsForResources": { @@ -8228,7 +8426,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

" + "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTagsForResourcesResponse": { @@ -8243,7 +8442,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing tags for the specified resources.

" + "smithy.api#documentation": "

A complex type containing tags for the specified resources.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicies": { @@ -8287,7 +8487,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list the traffic\n\t\t\tpolicies that are associated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list the traffic\n\t\t\tpolicies that are associated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPoliciesResponse": { @@ -8324,7 +8525,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstances": { @@ -8414,7 +8616,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the traffic policy instances that you created in a specified hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A request for the traffic policy instances that you created in a specified hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneResponse": { @@ -8456,7 +8659,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByPolicy": { @@ -8536,7 +8740,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicy instances.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicy instances.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyResponse": { @@ -8584,7 +8789,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesRequest": { @@ -8620,7 +8826,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about the traffic policy instances that you created by\n\t\t\tusing the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request to get information about the traffic policy instances that you created by\n\t\t\tusing the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesResponse": { @@ -8668,7 +8875,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyVersions": { @@ -8723,7 +8931,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicies.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicies.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyVersionsResponse": { @@ -8760,7 +8969,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListVPCAssociationAuthorizations": { @@ -8818,7 +9028,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about that can be associated with your hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about that can be associated with your hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListVPCAssociationAuthorizationsResponse": { @@ -8846,7 +9057,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#LocationSummaries": { @@ -9744,6 +9956,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { @@ -10147,7 +10365,7 @@ } ], "traits": { - "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

\n

This call only supports querying public hosted zones.

", + "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

\n

This call only supports querying public hosted zones.

\n \n

The TestDnsAnswer returns information similar to what you would expect from the answer\n\t\t\tsection of the dig command. Therefore, if you query for the name\n\t\t\tservers of a subdomain that point to the parent name servers, those will not be\n\t\t\treturned.

\n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/testdnsanswer", @@ -10205,7 +10423,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

" + "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#TestDNSAnswerResponse": { @@ -10255,7 +10474,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a TestDNSAnswer request.\n\t\t

" + "smithy.api#documentation": "

A complex type that contains the response to a TestDNSAnswer request.\n\t\t

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Threshold": { @@ -10834,7 +11054,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about a request to update a health\n\t\t\tcheck.

" + "smithy.api#documentation": "

A complex type that contains information about a request to update a health\n\t\t\tcheck.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateHealthCheckResponse": { @@ -10849,7 +11070,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the UpdateHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the UpdateHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateHostedZoneComment": { @@ -10899,7 +11121,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to update the comment for a hosted zone.

" + "smithy.api#documentation": "

A request to update the comment for a hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateHostedZoneCommentResponse": { @@ -10914,7 +11137,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the UpdateHostedZoneComment\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the UpdateHostedZoneComment\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyComment": { @@ -10973,7 +11197,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tupdate the comment for.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tupdate the comment for.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyCommentResponse": { @@ -10988,7 +11213,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the traffic policy.

" + "smithy.api#documentation": "

A complex type that contains the response information for the traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyInstance": { @@ -11059,7 +11285,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto update based on a specified traffic policy instance.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto update based on a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyInstanceResponse": { @@ -11074,7 +11301,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UsageCount": { @@ -11345,6 +11573,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { diff --git a/aws/sdk/aws-models/s3.json b/aws/sdk/aws-models/s3.json index f0227a4af82..92a0e925980 100644 --- a/aws/sdk/aws-models/s3.json +++ b/aws/sdk/aws-models/s3.json @@ -62,18 +62,6 @@ ], "traits": { "smithy.api#documentation": "

This action aborts a multipart upload. After a multipart upload is aborted, no\n additional parts can be uploaded using that upload ID. The storage consumed by any\n previously uploaded parts will be freed. However, if any part uploads are currently in\n progress, those part uploads might or might not succeed. As a result, it might be necessary\n to abort a given multipart upload multiple times in order to completely free all storage\n consumed by all parts.

\n

To verify that all parts have been removed, so you don't get charged for the part\n storage, you should call the ListParts action and ensure that\n the parts list is empty.

\n

For information about permissions required to use the multipart upload, see Multipart Upload\n and Permissions.

\n

The following operations are related to AbortMultipartUpload:

\n ", - "smithy.api#examples": [ - { - "title": "To abort a multipart upload", - "documentation": "The following example aborts a multipart upload.", - "input": { - "Bucket": "examplebucket", - "Key": "bigobject", - "UploadId": "xadcOB_7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--" - }, - "output": {} - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}/{Key+}?x-id=AbortMultipartUpload", @@ -101,7 +89,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name to which the upload was taking place.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name to which the upload was taking place.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -595,7 +583,8 @@ }, "ForcePathStyle": { "builtIn": "AWS::S3::ForcePathStyle", - "required": false, + "required": true, + "default": false, "documentation": "When true, force a path-style endpoint to be used where the bucket name is part of the path.", "type": "Boolean" }, @@ -639,100 +628,357 @@ }, "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Accelerate cannot be used with FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "error": "Cannot set dual-stack in combination with a custom endpoint.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "A custom endpoint cannot be combined with FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "A custom endpoint cannot be combined with S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, { "conditions": [ { "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 49, + 50, + true + ], + "assign": "hardwareType" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 8, + 12, + true + ], + "assign": "regionPrefix" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 0, + 7, + true + ], + "assign": "bucketAliasSuffix" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 32, + 49, + true + ], + "assign": "outpostId" + }, + { + "fn": "aws.partition", "argv": [ { "ref": "Region" } + ], + "assign": "regionPartition" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "bucketAliasSuffix" + }, + "--op-s3" ] } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "Bucket" - } + "ref": "hardwareType" + }, + "e" ] - }, + } + ], + "type": "tree", + "rules": [ { - "fn": "substring", - "argv": [ + "conditions": [ { - "ref": "Bucket" - }, - 49, - 50, - true + "fn": "stringEquals", + "argv": [ + { + "ref": "regionPrefix" + }, + "beta" + ] + } ], - "assign": "hardwareType" - }, - { - "fn": "substring", - "argv": [ + "type": "tree", + "rules": [ { - "ref": "Bucket" + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + } + ], + "error": "Expected a endpoint to be specified but no endpoint was found", + "type": "error" }, - 8, - 12, - true - ], - "assign": "regionPrefix" - }, - { - "fn": "substring", - "argv": [ { - "ref": "Bucket" - }, - 0, - 7, - true - ], - "assign": "abbaSuffix" + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "https://{Bucket}.ec2.{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] }, { - "fn": "substring", - "argv": [ - { - "ref": "Bucket" + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] }, - 32, - 49, - true - ], - "assign": "outpostId" - }, - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "regionPartition" - }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ { "fn": "stringEquals", "argv": [ { - "ref": "abbaSuffix" + "ref": "hardwareType" }, - "--op-s3" + "o" ] } ], @@ -741,11085 +987,3187 @@ { "conditions": [ { - "fn": "isValidHostLabel", + "fn": "stringEquals", "argv": [ { - "ref": "outpostId" + "ref": "regionPrefix" }, - false + "beta" ] } ], "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "ref": "hardwareType" - }, - "e" + "ref": "Endpoint" + } ] } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "regionPrefix" - }, - "beta" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } - ], - "error": "Expected a endpoint to be specified but no endpoint was found", - "type": "error" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{Bucket}.ec2.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + ] + } + ], + "error": "Expected a endpoint to be specified but no endpoint was found", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "Endpoint" } ] }, { - "conditions": [ + "fn": "parseURL", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "hardwareType" - }, - "o" - ] + "ref": "Endpoint" } ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "regionPrefix" - }, - "beta" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } - ], - "error": "Expected a endpoint to be specified but no endpoint was found", - "type": "error" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{Bucket}.op-{outpostId}.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + "assign": "url" + } + ], + "endpoint": { + "url": "https://{Bucket}.op-{outpostId}.{url#authority}", + "properties": { + "authSchemes": [ { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" } ] }, - { - "conditions": [], - "error": "Unrecognized hardware type: \"Expected hardware type o or e but got {hardwareType}\"", - "type": "error" - } - ] + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" + "endpoint": { + "url": "https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [ + "conditions": [], + "error": "Unrecognized hardware type: \"Expected hardware type o or e but got {hardwareType}\"", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "not", + "argv": [ { "fn": "isSet", "argv": [ { - "ref": "Bucket" + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ] } ] } + ] + } + ], + "error": "Custom endpoint `{Endpoint}` was not a valid URI", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "aws.isVirtualHostableS3Bucket", + "argv": [ + { + "ref": "Bucket" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "not", + "fn": "isValidHostLabel", "argv": [ { - "fn": "isSet", - "argv": [ - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } + "ref": "Region" + }, + false ] } ], - "error": "Custom endpoint `{Endpoint}` was not a valid URI", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "booleanEquals", "argv": [ { - "ref": "ForcePathStyle" - } + "ref": "Accelerate" + }, + true ] }, { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ { - "ref": "ForcePathStyle" + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] }, - true + "aws-cn" ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ + "error": "S3 Accelerate cannot be used in this region", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ] + "ref": "Endpoint" } - ], - "error": "Path-style addressing cannot be used with ARN buckets", - "type": "error" + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [ + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ { - "fn": "uriEncode", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "uri_encoded_bucket" + "ref": "Endpoint" } - ], - "type": "tree", - "rules": [ + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "Cannot set dual-stack in combination with a custom endpoint.", - "type": "error" + "ref": "Region" }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Path-style addressing cannot be used with S3 Accelerate", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [ - { - "fn": "aws.isVirtualHostableS3Bucket", - "argv": [ - { - "ref": "Bucket" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "Accelerate cannot be used with FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "S3 Accelerate cannot be used in this region", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "scheme" - ] - }, - "http" - ] - }, - { - "fn": "aws.isVirtualHostableS3Bucket", - "argv": [ - { - "ref": "Bucket" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "bucketArn" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[0]" - ], - "assign": "arnType" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-object-lambda" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "accessPointName" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "accessPointName" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "DisableAccessPoints" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableAccessPoints" - }, - true - ] - } - ], - "error": "Access points are not supported for this operation", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ] - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - "" - ] - } - ], - "error": "Invalid ARN: Missing account id", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: bucket ARN is missing a region", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "accessPointName" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "accessPointName" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "DisableAccessPoints" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableAccessPoints" - }, - true - ] - } - ], - "error": "Access points are not supported for this operation", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ] - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "{partitionResult#name}" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "Access Points do not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "DualStack cannot be combined with a Host override (PrivateLink)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: bucket ARN is missing a region", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 MRAP does not support dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 MRAP does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 MRAP does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableMultiRegionAccessPoints" - }, - true - ] - } - ], - "error": "Invalid configuration: Multi-Region Access Point ARNs are disabled.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "mrapPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "mrapPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "partition" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4a", - "signingName": "s3", - "signingRegionSet": [ - "*" - ] - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "{Region} was not a valid region", - "type": "error" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid Access Point Name", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-outposts" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Outposts does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 Outposts does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Outposts does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[4]" - ] - } - ] - } - ], - "error": "Invalid Arn: Outpost Access Point ARN contains sub resources", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "outpostId" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "outpostId" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[3]" - ], - "assign": "accessPointName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Expected an outpost type `accesspoint`, found {outpostType}", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected an access point name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region {bucketArn#region}", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: No ARN type specified", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "substring", - "argv": [ - { - "ref": "Bucket" - }, - 0, - 4, - false - ], - "assign": "arnPrefix" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnPrefix" - }, - "arn:" - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ] - } - ] - } - ] - } - ], - "error": "Invalid ARN: `{Bucket}` was not a valid ARN", - "type": "error" - }, - { - "conditions": [ - { - "fn": "uriEncode", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "uri_encoded_bucket" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "Cannot set dual-stack in combination with a custom endpoint.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Path-style addressing cannot be used with S3 Accelerate", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseObjectLambdaEndpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseObjectLambdaEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Bucket" - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "scheme" + ] + }, + "http" + ] + }, + { + "fn": "aws.isVirtualHostableS3Bucket", + "argv": [ + { + "ref": "Bucket" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "bucketArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[0]" + ], + "assign": "arnType" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-object-lambda" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "accessPointName" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "accessPointName" }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "UseDualStack" }, + true + ] + } + ], + "error": "S3 Object Lambda does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "Accelerate" }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, + true + ] + } + ], + "error": "S3 Object Lambda does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseGlobalEndpoint" + "ref": "bucketArn" }, - true + "region" ] - } - ], - "type": "tree", - "rules": [ + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "DisableAccessPoints" } ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, + "fn": "booleanEquals", + "argv": [ { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] + "ref": "DisableAccessPoints" }, + true + ] + } + ], + "error": "Access points are not supported for this operation", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "fn": "not", + "fn": "isSet", "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "bucketArn" }, - "aws-global" + "resourceId[2]" ] } ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, { "fn": "isSet", "argv": [ { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" + "ref": "UseArnRegion" } ] }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "ref": "UseArnRegion" }, false ] }, { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", + "fn": "not", "argv": [ { - "ref": "Endpoint" + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" ] } ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" }, { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] } - ] - }, + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ { - "fn": "parseURL", - "argv": [ + "conditions": [ { - "ref": "Endpoint" + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" } ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ + "type": "tree", + "rules": [ { - "fn": "stringEquals", - "argv": [ + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], + "type": "tree", + "rules": [ { - "ref": "Region" + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + "" + ] + } + ], + "error": "Invalid ARN: Missing account id", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "conditions": [], + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" } ] }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ { - "ref": "Endpoint" + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] - }, + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: bucket ARN is missing a region", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "accessPointName" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "accessPointName" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" + "ref": "bucketArn" }, + "region" + ] + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "fn": "not", + "fn": "stringEquals", "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "bucketArn" }, - "aws-global" + "region" ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" }, - false + "" ] } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "isSet", "argv": [ { - "ref": "UseFIPS" - }, - false + "ref": "DisableAccessPoints" + } ] }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "DisableAccessPoints" }, true ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Access points are not supported for this operation", + "type": "error" }, { "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, { "fn": "not", "argv": [ @@ -11827,677 +4175,837 @@ "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ] } ] } ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "ref": "UseArnRegion" } ] - } - ] - }, - { - "fn": "not", - "argv": [ + }, { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "UseArnRegion" }, - "aws-global" + false ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ + { + "fn": "not", + "argv": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] } ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] + } + ], + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" }, { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + } + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] + }, + "{partitionResult#name}" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "Access Points do not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] } ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] + "conditions": [], + "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", + "type": "error" + } + ] + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + true + ] + } + ], + "error": "S3 MRAP does not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 MRAP does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 MRAP does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "DisableMultiRegionAccessPoints" + }, + true + ] + } + ], + "error": "Invalid configuration: Multi-Region Access Point ARNs are disabled.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "mrapPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "mrapPartition" }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } + "name" ] }, { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseGlobalEndpoint" + "ref": "bucketArn" }, - false + "partition" ] } - ], + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", + "url": "https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}", "properties": { "authSchemes": [ { "disableDoubleEncoding": true, - "name": "sigv4", + "name": "sigv4a", "signingName": "s3", - "signingRegion": "{Region}" + "signingRegionSet": [ + "*" + ] } ] }, "headers": {} }, "type": "endpoint" - }, + } + ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid Access Point Name", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-outposts" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Outposts does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 Outposts does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 Outposts does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[4]" + ] + } + ] + } + ], + "error": "Invalid Arn: Outpost Access Point ARN contains sub resources", + "type": "error" + }, + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "UseArnRegion" }, + false + ] + }, + { + "fn": "not", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "bucketArn" }, - false + "region" ] }, + "{Region}" + ] + } + ] + } + ], + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "fn": "getAttr", + "argv": [ { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] + "ref": "bucketArn" }, + "region" + ] + } + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] + "ref": "Region" } ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", + "fn": "stringEquals", "argv": [ { - "fn": "isSet", + "fn": "getAttr", "argv": [ { - "ref": "Endpoint" - } + "ref": "bucketPartition" + }, + "name" ] - } - ] - }, - { - "fn": "not", - "argv": [ + }, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "partitionResult" }, - "aws-global" + "name" ] } ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] } ], "type": "tree", @@ -12505,123 +5013,182 @@ { "conditions": [ { - "fn": "stringEquals", + "fn": "isValidHostLabel", "argv": [ { - "ref": "Region" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ], + "assign": "outpostType" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[3]" + ], + "assign": "accessPointName" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "outpostType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Expected an outpost type `accesspoint`, found {outpostType}", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: expected an access point name", + "type": "error" + } + ] }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "conditions": [], + "error": "Invalid ARN: Expected a 4-component resource", + "type": "error" } ] }, - "headers": {} - }, - "type": "endpoint" + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] }, { "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" } ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] } @@ -12630,31 +5197,2638 @@ ] }, { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" + "conditions": [], + "error": "Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The Outpost Id was not set", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 0, + 4, + false + ], + "assign": "arnPrefix" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnPrefix" + }, + "arn:" + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ] + } + ] + } + ], + "error": "Invalid ARN: `{Bucket}` was not a valid ARN", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + true + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ], + "error": "Path-style addressing cannot be used with ARN buckets", + "type": "error" + }, + { + "conditions": [ + { + "fn": "uriEncode", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "uri_encoded_bucket" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Path-style addressing cannot be used with S3 Accelerate", + "type": "error" + } + ] + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseObjectLambdaEndpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseObjectLambdaEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Object Lambda does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 Object Lambda does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] } ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" } ] } ] - }, - { - "conditions": [], - "error": "A region must be set when sending requests to S3.", - "type": "error" } ] + }, + { + "conditions": [], + "error": "A region must be set when sending requests to S3.", + "type": "error" } ] }, @@ -12941,7 +8115,7 @@ { "documentation": "SDK::Host + access point + Dualstack is an error", "expect": { - "error": "DualStack cannot be combined with a Host override (PrivateLink)" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -15289,21 +10463,9 @@ } }, { - "documentation": "non-bucket endpoint with FIPS: TODO(descriptive)", + "documentation": "non-bucket endpoint override with FIPS = error", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-west-2", @@ -15313,21 +10475,9 @@ } }, { - "documentation": "FIPS + dualstack + custom endpoint TODO(descriptive)", + "documentation": "FIPS + dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-west-2", @@ -15337,21 +10487,9 @@ } }, { - "documentation": "dualstack + custom endpoint TODO(descriptive)", + "documentation": "dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-west-2", @@ -15616,19 +10754,7 @@ { "documentation": "endpoint override + FIPS + dualstack (BUG)", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15642,19 +10768,7 @@ { "documentation": "endpoint override + non-dns bucket + FIPS (BUG)", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15744,19 +10858,7 @@ { "documentation": "URI encoded bucket + use global endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "https://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15875,19 +10977,7 @@ { "documentation": "endpoint override + non-uri safe endpoint + force path style", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15927,21 +11017,9 @@ } }, { - "documentation": "endpoint override + FIPS + dualstack (this is wrong—it's a bug in the UseGlobalEndpoint branch)", + "documentation": "endpoint override + FIPS + dualstack", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-east-1", @@ -15954,19 +11032,7 @@ { "documentation": "non-bucket endpoint override + dualstack + global endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-east-1", @@ -15979,19 +11045,7 @@ { "documentation": "Endpoint override + UseGlobalEndpoint + us-east-1", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -16010,8 +11064,7 @@ "Region": "cn-north-1", "UseFIPS": true, "UseDualStack": false, - "UseGlobalEndpoint": true, - "Endpoint": "http://foo.com" + "UseGlobalEndpoint": true } }, { @@ -16113,21 +11166,9 @@ } }, { - "documentation": "aws-global + fips + custom endpoint (TODO: should be an error)", + "documentation": "aws-global + fips + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16165,21 +11206,9 @@ } }, { - "documentation": "aws-global + dualstack + custom endpoint (TODO: should be an error)", + "documentation": "aws-global + dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "aws-global", @@ -16215,7 +11244,7 @@ } }, { - "documentation": "FIPS + aws-global + path only bucket. TODO: this should be an error", + "documentation": "FIPS + aws-global + path only bucket. This is not supported by S3 but we allow garbage in garbage out", "expect": { "endpoint": { "properties": { @@ -16241,21 +11270,9 @@ } }, { - "documentation": "aws-global + FIPS + endpoint override. TODO: should this be an error?", + "documentation": "aws-global + FIPS + endpoint override.", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16264,21 +11281,9 @@ } }, { - "documentation": "force path style, aws-global & endpoint override", + "documentation": "force path style, FIPS, aws-global & endpoint override", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16314,19 +11319,7 @@ { "documentation": "endpoint override with aws-global region", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "aws-global", @@ -17594,19 +12587,7 @@ { "documentation": "path style + fips@cn-north-1", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingName": "s3", - "signingRegion": "cn-north-1", - "disableDoubleEncoding": true, - "name": "sigv4" - } - ] - }, - "url": "https://s3-fips.cn-north-1.amazonaws.com.cn/bucket-name" - } + "error": "Partition does not support FIPS" }, "operationInputs": [ { @@ -18151,7 +13132,7 @@ { "documentation": "SDK::Host + FIPS@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with FIPS" }, "operationInputs": [ { @@ -18181,7 +13162,7 @@ { "documentation": "SDK::Host + DualStack@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18211,7 +13192,7 @@ { "documentation": "SDK::HOST + accelerate@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "operationInputs": [ { @@ -18364,7 +13345,7 @@ } }, { - "documentation": "SDK::Host + FIPS@cn-north-1", + "documentation": "FIPS@cn-north-1", "expect": { "error": "Partition does not support FIPS" }, @@ -18372,7 +13353,6 @@ "Accelerate": false, "Bucket": "bucket-name", "ForcePathStyle": false, - "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, "UseFIPS": true @@ -18381,7 +13361,7 @@ { "documentation": "SDK::Host + DualStack@cn-north-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18411,7 +13391,7 @@ { "documentation": "SDK::HOST + accelerate@cn-north-1", "expect": { - "error": "S3 Accelerate cannot be used in this region" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "params": { "Accelerate": true, @@ -18551,7 +13531,7 @@ { "documentation": "SDK::Host + FIPS@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with FIPS" }, "operationInputs": [ { @@ -18581,7 +13561,7 @@ { "documentation": "SDK::Host + DualStack@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18611,7 +13591,7 @@ { "documentation": "SDK::HOST + accelerate@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "operationInputs": [ { @@ -20326,7 +15306,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Prod us-west-1", + "documentation": "S3 Outposts bucketAlias Real Outpost Prod us-west-1", "expect": { "endpoint": { "properties": { @@ -20351,7 +15331,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Prod ap-east-1", + "documentation": "S3 Outposts bucketAlias Real Outpost Prod ap-east-1", "expect": { "endpoint": { "properties": { @@ -20376,7 +15356,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Prod us-east-1", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Prod us-east-1", "expect": { "endpoint": { "properties": { @@ -20401,7 +15381,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Prod me-south-1", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Prod me-south-1", "expect": { "endpoint": { "properties": { @@ -20426,7 +15406,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Beta", + "documentation": "S3 Outposts bucketAlias Real Outpost Beta", "expect": { "endpoint": { "properties": { @@ -20452,7 +15432,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Beta", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Beta", "expect": { "endpoint": { "properties": { @@ -20478,7 +15458,7 @@ } }, { - "documentation": "S3 Outposts Abba - No endpoint set for beta", + "documentation": "S3 Outposts bucketAlias - No endpoint set for beta", "expect": { "error": "Expected a endpoint to be specified but no endpoint was found" }, @@ -20491,7 +15471,7 @@ } }, { - "documentation": "S3 Outposts Abba Invalid hardware type", + "documentation": "S3 Outposts bucketAlias Invalid hardware type", "expect": { "error": "Unrecognized hardware type: \"Expected hardware type o or e but got h\"" }, @@ -20504,7 +15484,7 @@ } }, { - "documentation": "S3 Outposts Abba Special character in Outpost Arn", + "documentation": "S3 Outposts bucketAlias Special character in Outpost Arn", "expect": { "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`." }, @@ -20517,7 +15497,7 @@ } }, { - "documentation": "S3 Outposts Abba - No endpoint set for beta", + "documentation": "S3 Outposts bucketAlias - No endpoint set for beta", "expect": { "error": "Expected a endpoint to be specified but no endpoint was found" }, @@ -21065,6 +16045,18 @@ "traits": { "smithy.api#enumValue": "us-west-2" } + }, + "ap_south_2": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ap-south-2" + } + }, + "eu_south_2": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "eu-south-2" + } } } }, @@ -21470,7 +16462,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket that contains the newly created object. Does not return the access point\n ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

The name of the bucket that contains the newly created object. Does not return the access point\n ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

" } }, "Key": { @@ -21563,7 +16555,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

Name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -21823,24 +16815,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. For pricing information, see Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify new metadata.\n However, the access control list (ACL) is not preserved and is set to private for the user making the request. To\n override the default ACL setting, specify a new ACL when generating a copy request. For\n more information, see Using ACLs.

\n

To specify whether you want the object metadata copied from the source object or\n replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you can use\n the s3:x-amz-metadata-directive condition key to enforce certain metadata\n behavior when objects are uploaded. For more information, see Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list of\n Amazon S3-specific condition keys, see Actions, Resources, and Condition Keys for\n Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and must be\n specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the Etag\n matches or whether the object was modified before or after a specified date, use the\n following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the request\n and evaluate as follows, Amazon S3 returns 200 OK and copies the data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the request and\n evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When\n copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a different type\n of encryption setting for the target object, you can use other appropriate\n encryption-related headers to encrypt the target object with a KMS key, an Amazon S3 managed\n key, or a customer-provided key. With server-side encryption, Amazon S3 encrypts your data as it\n writes your data to disks in its data centers and decrypts the data when you access it. If the\n encryption setting in your request is different from the default encryption configuration\n of the destination bucket, the encryption setting in your request takes precedence. If the\n source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\n encryption information in your request so that Amazon S3 can decrypt the object for copying. For\n more information about server-side encryption, see Using Server-Side\n Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request\n Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based permissions.\n By default, all objects are private. Only the owner has full access control. When adding a\n new object, you can grant permissions to individual Amazon Web Services accounts or to predefined groups\n that are defined by Amazon S3. These permissions are then added to the ACL on the object. For more\n information, see Access Control List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced setting for\n S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use\n this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to the new\n object by default. When you copy the object over, you can optionally specify a different\n checksum algorithm to use with the x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of an object\n that is already stored in Amazon S3 by using the StorageClass parameter. For more\n information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER, you must restore a copy of\n this object before you can use it as a source object for the copy operation. For\n more information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current version of an object\n to copy. If the current version is a delete marker, Amazon S3 behaves as if the object was\n deleted. To copy a different version, use the versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version ID for\n the object being copied. This version ID is different from the version ID of the source\n object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version ID that\n Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", - "smithy.api#examples": [ - { - "title": "To copy an object", - "documentation": "The following example copies an object from one bucket to another.", - "input": { - "Bucket": "destinationbucket", - "CopySource": "/sourcebucket/HappyFacejpg", - "Key": "HappyFaceCopyjpg" - }, - "output": { - "CopyObjectResult": { - "LastModified": "2016-12-15T17:38:53.000Z", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" - } - } - } - ], + "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. The request can also result in a data retrieval charge for the\n source if the source storage class bills for data retrieval. For pricing information, see\n Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify new metadata.\n However, the access control list (ACL) is not preserved and is set to private for the user making the request. To\n override the default ACL setting, specify a new ACL when generating a copy request. For\n more information, see Using ACLs.

\n

To specify whether you want the object metadata copied from the source object or\n replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you can use\n the s3:x-amz-metadata-directive condition key to enforce certain metadata\n behavior when objects are uploaded. For more information, see Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list of\n Amazon S3-specific condition keys, see Actions, Resources, and Condition Keys for\n Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and must be\n specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the Etag\n matches or whether the object was modified before or after a specified date, use the\n following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the request\n and evaluate as follows, Amazon S3 returns 200 OK and copies the data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the request and\n evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When\n copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a different type\n of encryption setting for the target object, you can use other appropriate\n encryption-related headers to encrypt the target object with a KMS key, an Amazon S3 managed\n key, or a customer-provided key. With server-side encryption, Amazon S3 encrypts your data as it\n writes your data to disks in its data centers and decrypts the data when you access it. If the\n encryption setting in your request is different from the default encryption configuration\n of the destination bucket, the encryption setting in your request takes precedence. If the\n source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\n encryption information in your request so that Amazon S3 can decrypt the object for copying. For\n more information about server-side encryption, see Using Server-Side\n Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request\n Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based permissions.\n By default, all objects are private. Only the owner has full access control. When adding a\n new object, you can grant permissions to individual Amazon Web Services accounts or to predefined groups\n that are defined by Amazon S3. These permissions are then added to the ACL on the object. For more\n information, see Access Control List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced setting for\n S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use\n this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to the new\n object by default. When you copy the object over, you can optionally specify a different\n checksum algorithm to use with the x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of an object\n that is already stored in Amazon S3 by using the StorageClass parameter. For more\n information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER, you must restore a copy of\n this object before you can use it as a source object for the copy operation. For\n more information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current version of an object\n to copy. If the current version is a delete marker, Amazon S3 behaves as if the object was\n deleted. To copy a different version, use the versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version ID for\n the object being copied. This version ID is different from the version ID of the source\n object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version ID that\n Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=CopyObject", @@ -21946,7 +16921,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the destination bucket.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the destination bucket.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22376,18 +17351,6 @@ ], "traits": { "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. You might choose a Region to optimize\n latency, minimize costs, or address regulatory requirements. For example, if you reside in\n Europe, you will probably find it advantageous to create buckets in the Europe (Ireland)\n Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature calculations in\n Signature Version 4 must use us-east-1 as the Region, even if the location constraint in\n the request specifies another Region where the bucket is to be created. If you create a\n bucket in a Region other than US East (N. Virginia), your application must be able to\n handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are required when\n your CreateBucket request includes specific headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your CreateBucket request\n specifies access control list (ACL) permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through any other\n ACL, both s3:CreateBucket and s3:PutBucketAcl permissions\n are needed. If the ACL for the CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.

    \n
  • \n
  • \n

    \n Object Lock - If ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your CreateBucket request includes the x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By default, ObjectOwnership is set to BucketOWnerEnforced and ACLs are disabled. We recommend keeping\n ACLs disabled, except in uncommon use cases where you must control access for each object individually. If you want to change the ObjectOwnership setting, you can use the \n x-amz-object-ownership header in your CreateBucket request to set the ObjectOwnership setting of your choice.\n For more information about S3 Object Ownership, see Controlling object\n ownership in the Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your specific use case requires granting public access to your S3 resources, you can disable Block Public Access. You can create a new bucket with Block Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all Block\n Public Access settings are enabled for new buckets. To avoid inadvertent exposure of\n your resources, we recommend keeping the S3 Block Public Access settings enabled. For more information about S3 Block Public Access, see Blocking public\n access to your Amazon S3 storage in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for Amazon S3 Object Ownership\n and specifies a bucket ACL that provides access to an external Amazon Web Services account, your request fails with a 400 error and returns the InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.

\n
\n

The following operations are related to CreateBucket:

\n ", - "smithy.api#examples": [ - { - "title": "To create a bucket ", - "documentation": "The following example creates a bucket.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "Location": "/examplebucket" - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}", @@ -22522,21 +17485,6 @@ }, "traits": { "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data\n by using server-side encryption with an Amazon S3 managed key (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3 encrypts\n your data as it writes it to disks in its data centers and decrypts it when you\n access it. You can request that Amazon S3 encrypts\n data at rest by using server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) – If you\n want Amazon Web Services to manage the keys used to encrypt data, specify the following\n headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object protected\n by KMS fail if you don't make them by using Secure Sockets Layer (SSL),\n Transport Layer Security (TLS), or Signature Version 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", - "smithy.api#examples": [ - { - "title": "To initiate a multipart upload", - "documentation": "The following example initiates a multipart upload.", - "input": { - "Bucket": "examplebucket", - "Key": "largeobject" - }, - "output": { - "Bucket": "examplebucket", - "UploadId": "ibZBv_75gd9r8lH_gqXatLdxMVpAlj6ZQjEs.OwyF3953YdwbcQnMA2BLGn8Lx12fQNICtMw5KyteFeHw.Sjng--", - "Key": "largeobject" - } - } - ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?uploads&x-id=CreateMultipartUpload", @@ -22564,7 +17512,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated. Does not return the\n access point ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated. Does not return the\n access point ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#xmlName": "Bucket" } }, @@ -22655,7 +17603,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which to initiate the upload

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which to initiate the upload

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22948,15 +17896,6 @@ }, "traits": { "smithy.api#documentation": "

Deletes the S3 bucket. All objects (including all object versions and delete markers) in\n the bucket must be deleted before the bucket itself can be deleted.

\n

The following operations are related to DeleteBucket:

\n ", - "smithy.api#examples": [ - { - "title": "To delete a bucket", - "documentation": "The following example deletes the specified bucket.", - "input": { - "Bucket": "forrandall2" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}", @@ -23023,17 +17962,8 @@ "output": { "target": "smithy.api#Unit" }, - "traits": { - "smithy.api#documentation": "

Deletes the cors configuration information set for the bucket.

\n

To use this operation, you must have permission to perform the\n s3:PutBucketCORS action. The bucket owner has this permission by default\n and can grant this permission to others.

\n

For information about cors, see Enabling Cross-Origin Resource Sharing in\n the Amazon S3 User Guide.

\n

\n Related Resources\n

\n ", - "smithy.api#examples": [ - { - "title": "To delete cors configuration on a bucket.", - "documentation": "The following example deletes CORS configuration on a bucket.", - "input": { - "Bucket": "examplebucket" - } - } - ], + "traits": { + "smithy.api#documentation": "

Deletes the cors configuration information set for the bucket.

\n

To use this operation, you must have permission to perform the\n s3:PutBucketCORS action. The bucket owner has this permission by default\n and can grant this permission to others.

\n

For information about cors, see Enabling Cross-Origin Resource Sharing in\n the Amazon S3 User Guide.

\n

\n Related Resources\n

\n ", "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?cors", @@ -23215,15 +18145,6 @@ }, "traits": { "smithy.api#documentation": "

Deletes the lifecycle configuration from the specified bucket. Amazon S3 removes all the\n lifecycle configuration rules in the lifecycle subresource associated with the bucket. Your\n objects never expire, and Amazon S3 no longer automatically deletes any objects on the basis of\n rules contained in the deleted lifecycle configuration.

\n

To use this operation, you must have permission to perform the\n s3:PutLifecycleConfiguration action. By default, the bucket owner has this\n permission and the bucket owner can grant this permission to others.

\n

There is usually some time lag before lifecycle configuration deletion is fully\n propagated to all the Amazon S3 systems.

\n

For more information about the object expiration, see Elements to Describe Lifecycle Actions.

\n

Related actions include:

\n ", - "smithy.api#examples": [ - { - "title": "To delete lifecycle configuration on a bucket.", - "documentation": "The following example deletes lifecycle configuration on a bucket.", - "input": { - "Bucket": "examplebucket" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?lifecycle", @@ -23361,15 +18282,6 @@ }, "traits": { "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", - "smithy.api#examples": [ - { - "title": "To delete bucket policy", - "documentation": "The following example deletes bucket policy on the specified bucket.", - "input": { - "Bucket": "examplebucket" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?policy", @@ -23413,15 +18325,6 @@ }, "traits": { "smithy.api#documentation": "

Deletes the replication configuration from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:PutReplicationConfiguration action. The bucket owner has these\n permissions by default and can grant it to others. For more information about permissions,\n see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n \n

It can take a while for the deletion of a replication configuration to fully\n propagate.

\n
\n

For information about replication configuration, see Replication in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketReplication:

\n ", - "smithy.api#examples": [ - { - "title": "To delete bucket replication configuration", - "documentation": "The following example deletes replication configuration set on bucket.", - "input": { - "Bucket": "example" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?replication", @@ -23491,15 +18394,6 @@ }, "traits": { "smithy.api#documentation": "

Deletes the tags from the bucket.

\n

To use this operation, you must have permission to perform the\n s3:PutBucketTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

The following operations are related to DeleteBucketTagging:

\n ", - "smithy.api#examples": [ - { - "title": "To delete bucket tags", - "documentation": "The following example deletes bucket tags.", - "input": { - "Bucket": "examplebucket" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?tagging", @@ -23543,15 +18437,6 @@ }, "traits": { "smithy.api#documentation": "

This action removes the website configuration for a bucket. Amazon S3 returns a 200\n OK response upon successfully deleting a website configuration on the specified\n bucket. You will get a 200 OK response if the website configuration you are\n trying to delete does not exist on the bucket. Amazon S3 returns a 404 response if\n the bucket specified in the request does not exist.

\n

This DELETE action requires the S3:DeleteBucketWebsite permission. By\n default, only the bucket owner can delete the website configuration attached to a bucket.\n However, bucket owners can grant other users permission to delete the website configuration\n by writing a bucket policy granting them the S3:DeleteBucketWebsite\n permission.

\n

For more information about hosting websites, see Hosting Websites on Amazon S3.

\n

The following operations are related to DeleteBucketWebsite:

\n ", - "smithy.api#examples": [ - { - "title": "To delete bucket website configuration", - "documentation": "The following example deletes bucket website configuration.", - "input": { - "Bucket": "examplebucket" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?website", @@ -23680,17 +18565,6 @@ }, "traits": { "smithy.api#documentation": "

Removes the null version (if there is one) of an object and inserts a delete marker,\n which becomes the latest version of the object. If there isn't a null version, Amazon S3 does\n not remove any objects but will still respond that the command was successful.

\n

To remove a specific version, you must use the version Id subresource. Using this\n subresource permanently deletes the version. If the object deleted is a delete marker, Amazon S3\n sets the response header, x-amz-delete-marker, to true.

\n

If the object you want to delete is in a bucket where the bucket versioning\n configuration is MFA Delete enabled, you must include the x-amz-mfa request\n header in the DELETE versionId request. Requests that include\n x-amz-mfa must use HTTPS.

\n

For more information about MFA Delete, see Using MFA Delete. To see sample\n requests that use versioning, see Sample\n Request.

\n

You can delete objects by explicitly calling DELETE Object or configure its lifecycle\n (PutBucketLifecycle) to enable Amazon S3 to remove them for you. If you want to block\n users or accounts from removing or deleting objects from your bucket, you must deny them\n the s3:DeleteObject, s3:DeleteObjectVersion, and\n s3:PutLifeCycleConfiguration actions.

\n

The following action is related to DeleteObject:

\n ", - "smithy.api#examples": [ - { - "title": "To delete an object", - "documentation": "The following example deletes an object from an S3 bucket.", - "input": { - "Bucket": "examplebucket", - "Key": "objectkey.jpg" - }, - "output": {} - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}/{Key+}?x-id=DeleteObject", @@ -23733,7 +18607,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -23799,20 +18673,6 @@ }, "traits": { "smithy.api#documentation": "

Removes the entire tag set from the specified object. For more information about\n managing object tags, see Object Tagging.

\n

To use this operation, you must have permission to perform the\n s3:DeleteObjectTagging action.

\n

To delete tags of a specific object version, add the versionId query\n parameter in the request. You will need permission for the\n s3:DeleteObjectVersionTagging action.

\n

The following operations are related to DeleteObjectTagging:

\n ", - "smithy.api#examples": [ - { - "title": "To remove tag set from an object version", - "documentation": "The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.", - "input": { - "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" - }, - "output": { - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" - } - } - ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}/{Key+}?tagging", @@ -23841,7 +18701,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the objects from which to remove the tags.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the objects from which to remove the tags.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -23933,7 +18793,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the objects to delete.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the objects to delete.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -24155,7 +19015,7 @@ } }, "traits": { - "smithy.api#documentation": "

Requests Amazon S3 to encode the object keys in the response and specifies the encoding\n method to use. An object key may contain any Unicode character; however, XML 1.0 parser\n cannot parse some characters, such as characters with an ASCII value from 0 to 10. For\n characters that are not supported in XML 1.0, you can add this parameter to request that\n Amazon S3 encode the keys in the response.

" + "smithy.api#documentation": "

Requests Amazon S3 to encode the object keys in the response and specifies the encoding\n method to use. An object key can contain any Unicode character; however, the XML 1.0 parser\n cannot parse some characters, such as characters with an ASCII value from 0 to 10. For\n characters that are not supported in XML 1.0, you can add this parameter to request that\n Amazon S3 encode the keys in the response.

" } }, "com.amazonaws.s3#Encryption": { @@ -24830,31 +19690,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the Cross-Origin Resource Sharing (CORS) configuration information set for the\n bucket.

\n

To use this operation, you must have permission to perform the\n s3:GetBucketCORS action. By default, the bucket owner has this permission\n and can grant it to others.

\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about CORS, see Enabling Cross-Origin Resource\n Sharing.

\n

The following operations are related to GetBucketCors:

\n ", - "smithy.api#examples": [ - { - "title": "To get cors configuration set on a bucket", - "documentation": "The following example returns cross-origin resource sharing (CORS) configuration set on a bucket.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "CORSRules": [ - { - "AllowedHeaders": [ - "Authorization" - ], - "MaxAgeSeconds": 3000, - "AllowedMethods": [ - "GET" - ], - "AllowedOrigins": [ - "*" - ] - } - ] - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?cors", @@ -25097,30 +19932,6 @@ }, "traits": { "smithy.api#documentation": "\n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The response describes the new filter element\n that you can use to specify a filter to select a subset of objects to which the rule\n applies. If you are using a previous version of the lifecycle configuration, it still\n works. For the earlier action, see GetBucketLifecycle.

\n
\n

Returns the lifecycle configuration information set on the bucket. For information about\n lifecycle configuration, see Object Lifecycle\n Management.

\n

To use this operation, you must have permission to perform the\n s3:GetLifecycleConfiguration action. The bucket owner has this permission,\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n GetBucketLifecycleConfiguration has the following special error:

\n
    \n
  • \n

    Error code: NoSuchLifecycleConfiguration\n

    \n
      \n
    • \n

      Description: The lifecycle configuration does not exist.

      \n
    • \n
    • \n

      HTTP Status Code: 404 Not Found

      \n
    • \n
    • \n

      SOAP Fault Code Prefix: Client

      \n
    • \n
    \n
  • \n
\n

The following operations are related to\n GetBucketLifecycleConfiguration:

\n ", - "smithy.api#examples": [ - { - "title": "To get lifecycle configuration on a bucket", - "documentation": "The following example retrieves lifecycle configuration on set on a bucket. ", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "Rules": [ - { - "Prefix": "TaxDocs", - "Status": "Enabled", - "Transitions": [ - { - "Days": 365, - "StorageClass": "STANDARD_IA" - } - ], - "ID": "Rule for TaxDocs/" - } - ] - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?lifecycle", @@ -25182,18 +19993,6 @@ "traits": { "aws.customizations#s3UnwrappedXmlOutput": {}, "smithy.api#documentation": "

Returns the Region the bucket resides in. You set the bucket's Region using the\n LocationConstraint request parameter in a CreateBucket\n request. For more information, see CreateBucket.

\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n \n

We recommend that you use HeadBucket to return the Region\n that a bucket resides in. For backward compatibility, Amazon S3 continues to support\n GetBucketLocation.

\n
\n

The following operations are related to GetBucketLocation:

\n ", - "smithy.api#examples": [ - { - "title": "To get bucket location", - "documentation": "The following example returns bucket location.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "LocationConstraint": "us-west-2" - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?location", @@ -25474,18 +20273,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", - "smithy.api#examples": [ - { - "title": "To get bucket policy", - "documentation": "The following example returns bucket policy associated with a bucket.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "Policy": "{\"Version\":\"2008-10-17\",\"Id\":\"LogPolicy\",\"Statement\":[{\"Sid\":\"Enables the log delivery group to publish logs to your bucket \",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"111122223333\"},\"Action\":[\"s3:GetBucketAcl\",\"s3:GetObjectAcl\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::policytest1/*\",\"arn:aws:s3:::policytest1\"]}]}" - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?policy", @@ -25602,30 +20389,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the replication configuration of a bucket.

\n \n

It can take a while to propagate the put or delete a replication configuration to\n all Amazon S3 systems. Therefore, a get request soon after put or delete can return a wrong\n result.

\n
\n

For information about replication configuration, see Replication in the\n Amazon S3 User Guide.

\n

This action requires permissions for the s3:GetReplicationConfiguration\n action. For more information about permissions, see Using Bucket Policies and User\n Policies.

\n

If you include the Filter element in a replication configuration, you must\n also include the DeleteMarkerReplication and Priority elements.\n The response also returns those elements.

\n

For information about GetBucketReplication errors, see List of\n replication-related error codes\n

\n

The following operations are related to GetBucketReplication:

\n ", - "smithy.api#examples": [ - { - "title": "To get replication configuration set on a bucket", - "documentation": "The following example returns replication configuration set on a bucket.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "ReplicationConfiguration": { - "Rules": [ - { - "Status": "Enabled", - "Prefix": "Tax", - "Destination": { - "Bucket": "arn:aws:s3:::destination-bucket" - }, - "ID": "MWIwNTkwZmItMTE3MS00ZTc3LWJkZDEtNzRmODQwYzc1OTQy" - } - ], - "Role": "arn:aws:iam::acct-id:role/example-role" - } - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?replication", @@ -25683,18 +20446,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the request payment configuration of a bucket. To use this version of the\n operation, you must be the bucket owner. For more information, see Requester Pays\n Buckets.

\n

The following operations are related to GetBucketRequestPayment:

\n ", - "smithy.api#examples": [ - { - "title": "To get bucket versioning configuration", - "documentation": "The following example retrieves bucket versioning configuration.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "Payer": "BucketOwner" - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?requestPayment", @@ -25753,27 +20504,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the tag set associated with the bucket.

\n

To use this operation, you must have permission to perform the\n s3:GetBucketTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

\n GetBucketTagging has the following special error:

\n
    \n
  • \n

    Error code: NoSuchTagSet\n

    \n
      \n
    • \n

      Description: There is no tag set associated with the bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to GetBucketTagging:

\n ", - "smithy.api#examples": [ - { - "title": "To get tag set associated with a bucket", - "documentation": "The following example returns tag set associated with a bucket", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "TagSet": [ - { - "Value": "value1", - "Key": "key1" - }, - { - "Value": "value2", - "Key": "key2" - } - ] - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?tagging", @@ -25833,19 +20563,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the versioning state of a bucket.

\n

To retrieve the versioning state of a bucket, you must be the bucket owner.

\n

This implementation also returns the MFA Delete status of the versioning state. If the\n MFA Delete status is enabled, the bucket owner must use an authentication\n device to change the versioning state of the bucket.

\n

The following operations are related to GetBucketVersioning:

\n ", - "smithy.api#examples": [ - { - "title": "To get bucket versioning configuration", - "documentation": "The following example retrieves bucket versioning configuration.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "Status": "Enabled", - "MFADelete": "Disabled" - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?versioning", @@ -25911,23 +20628,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the website configuration for a bucket. To host website on Amazon S3, you can\n configure a bucket as website by adding a website configuration. For more information about\n hosting websites, see Hosting Websites on Amazon S3.

\n

This GET action requires the S3:GetBucketWebsite permission. By default,\n only the bucket owner can read the bucket website configuration. However, bucket owners can\n allow other users to read the website configuration by writing a bucket policy granting\n them the S3:GetBucketWebsite permission.

\n

The following operations are related to GetBucketWebsite:

\n ", - "smithy.api#examples": [ - { - "title": "To get bucket website configuration", - "documentation": "The following example retrieves website configuration of a bucket.", - "input": { - "Bucket": "examplebucket" - }, - "output": { - "IndexDocument": { - "Suffix": "index.html" - }, - "ErrorDocument": { - "Key": "error.html" - } - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?website", @@ -26043,56 +20743,6 @@ ], "traits": { "smithy.api#documentation": "

Returns the access control list (ACL) of an object. To use this operation, you must have\n s3:GetObjectAcl permissions or READ_ACP access to the object.\n For more information, see Mapping of ACL permissions and access policy permissions in the Amazon S3\n User Guide\n

\n

This action is not supported by Amazon S3 on Outposts.

\n

By default, GET returns ACL information about the current version of an object. To\n return ACL information about a different version, use the versionId subresource.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership,\n requests to read ACLs are still supported and return the\n bucket-owner-full-control ACL with the owner being the account that\n created the bucket. For more information, see Controlling object\n ownership and disabling ACLs in the\n Amazon S3 User Guide.

\n
\n

The following operations are related to GetObjectAcl:

\n ", - "smithy.api#examples": [ - { - "title": "To retrieve object ACL", - "documentation": "The following example retrieves access control list (ACL) of an object.", - "input": { - "Bucket": "examplebucket", - "Key": "HappyFace.jpg" - }, - "output": { - "Owner": { - "DisplayName": "owner-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "Grants": [ - { - "Grantee": { - "Type": "CanonicalUser", - "DisplayName": "owner-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "Permission": "WRITE" - }, - { - "Grantee": { - "Type": "CanonicalUser", - "DisplayName": "owner-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "Permission": "WRITE_ACP" - }, - { - "Grantee": { - "Type": "CanonicalUser", - "DisplayName": "owner-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "Permission": "READ" - }, - { - "Grantee": { - "Type": "CanonicalUser", - "DisplayName": "owner-display-name", - "ID": "852b113eexamplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "Permission": "READ_ACP" - } - ] - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?acl", @@ -26320,7 +20970,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket that contains the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket that contains the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -26395,7 +21045,7 @@ "ObjectAttributes": { "target": "com.amazonaws.s3#ObjectAttributesList", "traits": { - "smithy.api#documentation": "

An XML header that specifies the fields at the root level that you want returned in the\n response. Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the fields at the root level that you want returned in the\n response. Fields that you do not specify are not returned.

", "smithy.api#httpHeader": "x-amz-object-attributes", "smithy.api#required": {} } @@ -26814,7 +21464,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27063,29 +21713,6 @@ }, "traits": { "smithy.api#documentation": "

Returns the tag-set of an object. You send the GET request against the tagging\n subresource associated with the object.

\n

To use this operation, you must have permission to perform the\n s3:GetObjectTagging action. By default, the GET action returns information\n about current version of an object. For a versioned bucket, you can have multiple versions\n of an object in your bucket. To retrieve tags of any other version, use the versionId query\n parameter. You also need permission for the s3:GetObjectVersionTagging\n action.

\n

By default, the bucket owner has this permission and can grant this permission to\n others.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

The following actions are related to GetObjectTagging:

\n ", - "smithy.api#examples": [ - { - "title": "To retrieve tag set of an object", - "documentation": "The following example retrieves tag set of an object.", - "input": { - "Bucket": "examplebucket", - "Key": "HappyFace.jpg" - }, - "output": { - "VersionId": "null", - "TagSet": [ - { - "Value": "Value4", - "Key": "Key4" - }, - { - "Value": "Value3", - "Key": "Key3" - } - ] - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?tagging", @@ -27122,7 +21749,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object for which to get the tagging information.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object for which to get the tagging information.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27173,17 +21800,6 @@ }, "traits": { "smithy.api#documentation": "

Returns torrent files from a bucket. BitTorrent can save you bandwidth when you're\n distributing large files.

\n \n

You can get torrent only for objects that are less than 5 GB in size, and that are\n not encrypted using server-side encryption with a customer-provided encryption\n key.

\n
\n

To use GET, you must have READ access to the object.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following action is related to GetObjectTorrent:

\n ", - "smithy.api#examples": [ - { - "title": "To retrieve torrent files for an object", - "documentation": "The following example retrieves torrent files of an object.", - "input": { - "Bucket": "examplebucket", - "Key": "HappyFace.jpg" - }, - "output": {} - } - ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?torrent", @@ -27430,15 +22046,6 @@ ], "traits": { "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in place of the\n bucket name or specify the access point ARN. When using the access point ARN, you must direct requests to\n the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", - "smithy.api#examples": [ - { - "title": "To determine if bucket exists", - "documentation": "This operation checks to see if a bucket exists.", - "input": { - "Bucket": "acl1" - } - } - ], "smithy.api#http": { "method": "HEAD", "uri": "/{Bucket}", @@ -27482,7 +22089,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \n If the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \n For more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \n If the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \n For more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27810,7 +22417,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -28416,6 +23023,18 @@ "traits": { "smithy.api#enumValue": "ChecksumAlgorithm" } + }, + "ObjectAccessControlList": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ObjectAccessControlList" + } + }, + "ObjectOwner": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ObjectOwner" + } } } }, @@ -28501,6 +23120,12 @@ "smithy.api#default": false } }, + "com.amazonaws.s3#IsRestoreInProgress": { + "type": "boolean", + "traits": { + "smithy.api#default": false + } + }, "com.amazonaws.s3#IsTruncated": { "type": "boolean", "traits": { @@ -28847,7 +23472,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The ContinuationToken that represents a placeholder from where this request should\n begin.

", + "smithy.api#documentation": "

The ContinuationToken that represents a placeholder from where this request\n should begin.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29011,7 +23636,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The marker used to continue an inventory configuration listing that has been truncated.\n Use the NextContinuationToken from a previously truncated list response to continue the\n listing. The continuation token is an opaque value that Amazon S3 understands.

", + "smithy.api#documentation": "

The marker used to continue an inventory configuration listing that has been truncated.\n Use the NextContinuationToken from a previously truncated list response to\n continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29097,7 +23722,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The marker that is used to continue a metrics configuration listing that has been\n truncated. Use the NextContinuationToken from a previously truncated list response to\n continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", + "smithy.api#documentation": "

The marker that is used to continue a metrics configuration listing that has been\n truncated. Use the NextContinuationToken from a previously truncated list\n response to continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29123,32 +23748,6 @@ }, "traits": { "smithy.api#documentation": "

Returns a list of all buckets owned by the authenticated sender of the request. To use\n this operation, you must have the s3:ListAllMyBuckets permission.

\n

For information about Amazon S3 buckets, see Creating, configuring, and\n working with Amazon S3 buckets.

", - "smithy.api#examples": [ - { - "title": "To list all buckets", - "documentation": "The following example returns all the buckets owned by the sender of this request.", - "output": { - "Owner": { - "DisplayName": "own-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31" - }, - "Buckets": [ - { - "CreationDate": "2012-02-15T21:03:02.000Z", - "Name": "examplebucket" - }, - { - "CreationDate": "2011-07-24T19:33:50.000Z", - "Name": "examplebucket2" - }, - { - "CreationDate": "2010-12-17T00:56:49.000Z", - "Name": "examplebucket3" - } - ] - } - } - ], "smithy.api#http": { "method": "GET", "uri": "/", @@ -29271,7 +23870,7 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object keys in the response.

\n

If you specify encoding-type request parameter, Amazon S3 includes this element\n in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, KeyMarker, Prefix,\n NextKeyMarker, Key.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object keys in the response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, KeyMarker, Prefix,\n NextKeyMarker, Key.

" } }, "RequestCharged": { @@ -29292,7 +23891,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29316,7 +23915,7 @@ "KeyMarker": { "target": "com.amazonaws.s3#KeyMarker", "traits": { - "smithy.api#documentation": "

Together with upload-id-marker, this parameter specifies the multipart upload after\n which listing should begin.

\n

If upload-id-marker is not specified, only the keys lexicographically\n greater than the specified key-marker will be included in the list.

\n

If upload-id-marker is specified, any multipart uploads for a key equal to\n the key-marker might also be included, provided those multipart uploads have\n upload IDs lexicographically greater than the specified\n upload-id-marker.

", + "smithy.api#documentation": "

Together with upload-id-marker, this parameter specifies the multipart\n upload after which listing should begin.

\n

If upload-id-marker is not specified, only the keys lexicographically\n greater than the specified key-marker will be included in the list.

\n

If upload-id-marker is specified, any multipart uploads for a key equal to\n the key-marker might also be included, provided those multipart uploads have\n upload IDs lexicographically greater than the specified\n upload-id-marker.

", "smithy.api#httpQuery": "key-marker" } }, @@ -29331,7 +23930,7 @@ "Prefix": { "target": "com.amazonaws.s3#Prefix", "traits": { - "smithy.api#documentation": "

Lists in-progress uploads only for those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different grouping of keys. (You can think of\n using prefix to make groups in the same way you'd use a folder in a file system.)

", + "smithy.api#documentation": "

Lists in-progress uploads only for those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different grouping of keys. (You can think of\n using prefix to make groups in the same way that you'd use a folder in a file\n system.)

", "smithy.api#httpQuery": "prefix" } }, @@ -29369,47 +23968,7 @@ "target": "com.amazonaws.s3#ListObjectVersionsOutput" }, "traits": { - "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permissions to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design your\n application to parse the contents of the response and handle it appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", - "smithy.api#examples": [ - { - "title": "To list object versions", - "documentation": "The following example return versions of an object with specific key name prefix. The request limits the number of items returned to two. If there are are more than two object version, S3 returns NextToken in the response. You can specify this token value in your next request to fetch next set of object versions.", - "input": { - "Bucket": "examplebucket", - "Prefix": "HappyFace.jpg" - }, - "output": { - "Versions": [ - { - "LastModified": "2016-12-15T01:19:41.000Z", - "VersionId": "null", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", - "StorageClass": "STANDARD", - "Key": "HappyFace.jpg", - "Owner": { - "DisplayName": "owner-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "IsLatest": true, - "Size": 3191 - }, - { - "LastModified": "2016-12-13T00:58:26.000Z", - "VersionId": "PHtexPGjH2y.zBgT8LmB7wwLI2mpbz.k", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", - "StorageClass": "STANDARD", - "Key": "HappyFace.jpg", - "Owner": { - "DisplayName": "owner-display-name", - "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" - }, - "IsLatest": false, - "Size": 3191 - } - ] - } - } - ], + "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permission to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design\n your application to parse the contents of the response and handle it\n appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?versions", @@ -29424,7 +23983,7 @@ "target": "com.amazonaws.s3#IsTruncated", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\n criteria. If your results were truncated, you can make a follow-up paginated request using\n the NextKeyMarker and NextVersionIdMarker response parameters as a starting place in\n another request to return the rest of the results.

" + "smithy.api#documentation": "

A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\n criteria. If your results were truncated, you can make a follow-up paginated request by\n using the NextKeyMarker and NextVersionIdMarker response\n parameters as a starting place in another request to return the rest of the results.

" } }, "KeyMarker": { @@ -29448,7 +24007,7 @@ "NextVersionIdMarker": { "target": "com.amazonaws.s3#NextVersionIdMarker", "traits": { - "smithy.api#documentation": "

When the number of responses exceeds the value of MaxKeys,\n NextVersionIdMarker specifies the first object version not returned that\n satisfies the search criteria. Use this value for the version-id-marker request parameter\n in a subsequent request.

" + "smithy.api#documentation": "

When the number of responses exceeds the value of MaxKeys,\n NextVersionIdMarker specifies the first object version not returned that\n satisfies the search criteria. Use this value for the version-id-marker\n request parameter in a subsequent request.

" } }, "Versions": { @@ -29482,7 +24041,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

The delimiter grouping the included keys. A delimiter is a character that you specify to\n group keys. All keys that contain the same string between the prefix and the first\n occurrence of the delimiter are grouped under a single result element in\n CommonPrefixes. These groups are counted as one result against the max-keys\n limitation. These keys are not returned elsewhere in the response.

" + "smithy.api#documentation": "

The delimiter grouping the included keys. A delimiter is a character that you specify to\n group keys. All keys that contain the same string between the prefix and the first\n occurrence of the delimiter are grouped under a single result element in\n CommonPrefixes. These groups are counted as one result against the\n max-keys limitation. These keys are not returned elsewhere in the\n response.

" } }, "MaxKeys": { @@ -29502,7 +24061,7 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify encoding-type request parameter, Amazon S3 includes this element in the\n response, and returns encoded key name values in the following response elements:

\n

\n KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.

" } }, "RequestCharged": { @@ -29534,7 +24093,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character that you specify to group keys. All keys that contain the\n same string between the prefix and the first occurrence of the delimiter are\n grouped under a single result element in CommonPrefixes. These groups are counted as one\n result against the max-keys limitation. These keys are not returned elsewhere in the\n response.

", + "smithy.api#documentation": "

A delimiter is a character that you specify to group keys. All keys that contain the\n same string between the prefix and the first occurrence of the delimiter are\n grouped under a single result element in CommonPrefixes. These groups are\n counted as one result against the max-keys limitation. These keys are not\n returned elsewhere in the response.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29555,14 +24114,14 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n If additional keys satisfy the search criteria, but were not returned because max-keys was\n exceeded, the response contains true. To return the\n additional keys, see key-marker and version-id-marker.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n If additional keys satisfy the search criteria, but were not returned because\n max-keys was exceeded, the response contains\n true. To return the additional keys,\n see key-marker and version-id-marker.

", "smithy.api#httpQuery": "max-keys" } }, "Prefix": { "target": "com.amazonaws.s3#Prefix", "traits": { - "smithy.api#documentation": "

Use this parameter to select only those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different groupings of keys. (You can think of\n using prefix to make groups in the same way you'd use a folder in a file system.) You can\n use prefix with delimiter to roll up numerous objects into a single result under\n CommonPrefixes.

", + "smithy.api#documentation": "

Use this parameter to select only those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different groupings of keys. (You can think of\n using prefix to make groups in the same way that you'd use a folder in a file\n system.) You can use prefix with delimiter to roll up numerous\n objects into a single result under CommonPrefixes.

", "smithy.api#httpQuery": "prefix" } }, @@ -29585,6 +24144,13 @@ "traits": { "smithy.api#httpHeader": "x-amz-request-payer" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response.\n Fields that you do not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29632,7 +24198,7 @@ "NextMarker": { "target": "com.amazonaws.s3#NextMarker", "traits": { - "smithy.api#documentation": "

When response is truncated (the IsTruncated element value in the response is true), you\n can use the key name in this field as marker in the subsequent request to get next set of\n objects. Amazon S3 lists objects in alphabetical order Note: This element is returned only if\n you have delimiter request parameter specified. If response does not include the NextMarker\n and it is truncated, you can use the value of the last Key in the response as the marker in\n the subsequent request to get the next set of object keys.

" + "smithy.api#documentation": "

When the response is truncated (the IsTruncated element value in the\n response is true), you can use the key name in this field as the\n marker parameter in the subsequent request to get the next set of objects.\n Amazon S3 lists objects in alphabetical order.

\n \n

This element is returned only if you have the delimiter request\n parameter specified. If the response does not include the NextMarker\n element and it is truncated, you can use the value of the last Key element\n in the response as the marker parameter in the subsequent request to get\n the next set of object keys.

\n
" } }, "Contents": { @@ -29670,7 +24236,7 @@ "CommonPrefixes": { "target": "com.amazonaws.s3#CommonPrefixList", "traits": { - "smithy.api#documentation": "

All of the keys (up to 1,000) rolled up in a common prefix count as a single return when\n calculating the number of returns.

\n

A response can contain CommonPrefixes only if you specify a delimiter.

\n

CommonPrefixes contains all (if there are any) keys between Prefix and the next\n occurrence of the string specified by the delimiter.

\n

CommonPrefixes lists keys that act like subdirectories in the directory specified by\n Prefix.

\n

For example, if the prefix is notes/ and the delimiter is a slash (/) as in\n notes/summer/july, the common prefix is notes/summer/. All of the keys that roll up into a\n common prefix count as a single return when calculating the number of returns.

", + "smithy.api#documentation": "

All of the keys (up to 1,000) rolled up in a common prefix count as a single return when\n calculating the number of returns.

\n

A response can contain CommonPrefixes only if you specify a\n delimiter.

\n

\n CommonPrefixes contains all (if there are any) keys between\n Prefix and the next occurrence of the string specified by the\n delimiter.

\n

\n CommonPrefixes lists keys that act like subdirectories in the directory\n specified by Prefix.

\n

For example, if the prefix is notes/ and the delimiter is a slash\n (/), as in notes/summer/july, the common prefix is\n notes/summer/. All of the keys that roll up into a common prefix count as a\n single return when calculating the number of returns.

", "smithy.api#xmlFlattened": {} } }, @@ -29698,7 +24264,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket containing the objects.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket containing the objects.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29709,7 +24275,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character you use to group keys.

", + "smithy.api#documentation": "

A delimiter is a character that you use to group keys.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29730,7 +24296,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.

", "smithy.api#httpQuery": "max-keys" } }, @@ -29754,6 +24320,13 @@ "smithy.api#documentation": "

The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with the HTTP status code 403 Forbidden (access denied).

", "smithy.api#httpHeader": "x-amz-expected-bucket-owner" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response.\n Fields that you do not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29774,7 +24347,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns some or all (up to 1,000) of the objects in a bucket with each request. You can\n use the request parameters as selection criteria to return a subset of the objects in a\n bucket. A 200 OK response can contain valid or invalid XML. Make sure to\n design your application to parse the contents of the response and handle it appropriately.\n Objects are returned sorted in an ascending order of the respective key names in the list.\n For more information about listing objects, see Listing object keys\n programmatically\n

\n

To use this operation, you must have READ access to the bucket.

\n

To use this action in an Identity and Access Management (IAM) policy, you must have permissions to perform\n the s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n \n

This section describes the latest revision of this action. We recommend that you use\n this revised API for application development. For backward compatibility, Amazon S3 continues\n to support the prior version of this API, ListObjects.

\n
\n

To get a list of your buckets, see ListBuckets.

\n

The following operations are related to ListObjectsV2:

\n ", + "smithy.api#documentation": "

Returns some or all (up to 1,000) of the objects in a bucket with each request. You can\n use the request parameters as selection criteria to return a subset of the objects in a\n bucket. A 200 OK response can contain valid or invalid XML. Make sure to\n design your application to parse the contents of the response and handle it appropriately.\n Objects are returned sorted in an ascending order of the respective key names in the list.\n For more information about listing objects, see Listing object keys\n programmatically in the Amazon S3 User Guide.

\n

To use this operation, you must have READ access to the bucket.

\n

To use this action in an Identity and Access Management (IAM) policy, you must have permission to perform\n the s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n \n

This section describes the latest revision of this action. We recommend that you use\n this revised API operation for application development. For backward compatibility, Amazon S3\n continues to support the prior version of this API operation, ListObjects.

\n
\n

To get a list of your buckets, see ListBuckets.

\n

The following operations are related to ListObjectsV2:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?list-type=2", @@ -29794,7 +24367,7 @@ "target": "com.amazonaws.s3#IsTruncated", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Set to false if all of the results were returned. Set to true if more keys are available\n to return. If the number of results exceeds that specified by MaxKeys, all of the results\n might not be returned.

" + "smithy.api#documentation": "

Set to false if all of the results were returned. Set to true\n if more keys are available to return. If the number of results exceeds that specified by\n MaxKeys, all of the results might not be returned.

" } }, "Contents": { @@ -29807,7 +24380,7 @@ "Name": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

" } }, "Prefix": { @@ -29819,14 +24392,14 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

Causes keys that contain the same string between the prefix and the first occurrence of\n the delimiter to be rolled up into a single result element in the CommonPrefixes\n collection. These rolled-up keys are not returned elsewhere in the response. Each rolled-up\n result counts as only one return against the MaxKeys value.

" + "smithy.api#documentation": "

Causes keys that contain the same string between the prefix and the first\n occurrence of the delimiter to be rolled up into a single result element in the\n CommonPrefixes collection. These rolled-up keys are not returned elsewhere\n in the response. Each rolled-up result counts as only one return against the\n MaxKeys value.

" } }, "MaxKeys": { "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

" + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

" } }, "CommonPrefixes": { @@ -29839,20 +24412,20 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this element in the\n response, and returns encoded key name values in the following response elements:

\n

\n Delimiter, Prefix, Key, and StartAfter.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, Prefix, Key, and StartAfter.

" } }, "KeyCount": { "target": "com.amazonaws.s3#KeyCount", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

KeyCount is the number of keys returned with this request. KeyCount will always be less\n than or equal to the MaxKeys field. Say you ask for 50 keys, your result will\n include 50 keys or fewer.

" + "smithy.api#documentation": "

\n KeyCount is the number of keys returned with this request.\n KeyCount will always be less than or equal to the MaxKeys\n field. For example, if you ask for 50 keys, your result will include 50 keys or\n fewer.

" } }, "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

If ContinuationToken was sent with the request, it is included in the response.

" + "smithy.api#documentation": "

If ContinuationToken was sent with the request, it is included in the\n response.

" } }, "NextContinuationToken": { @@ -29885,7 +24458,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

Bucket name to list.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Bucket name to list.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29896,7 +24469,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character you use to group keys.

", + "smithy.api#documentation": "

A delimiter is a character that you use to group keys.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29911,7 +24484,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

", "smithy.api#httpQuery": "max-keys" } }, @@ -29925,7 +24498,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

ContinuationToken indicates Amazon S3 that the list is being continued on this bucket with a\n token. ContinuationToken is obfuscated and is not a real key.

", + "smithy.api#documentation": "

\n ContinuationToken indicates to Amazon S3 that the list is being continued on\n this bucket with a token. ContinuationToken is obfuscated and is not a real\n key.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29933,7 +24506,7 @@ "target": "com.amazonaws.s3#FetchOwner", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

The owner field is not present in listV2 by default, if you want to return owner field\n with each key in the result then set the fetch owner field to true.

", + "smithy.api#documentation": "

The owner field is not present in ListObjectsV2 by default. If you want to\n return the owner field with each key in the result, then set the FetchOwner\n field to true.

", "smithy.api#httpQuery": "fetch-owner" } }, @@ -29957,6 +24530,13 @@ "smithy.api#documentation": "

The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with the HTTP status code 403 Forbidden (access denied).

", "smithy.api#httpHeader": "x-amz-expected-bucket-owner" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response.\n Fields that you do not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -30030,7 +24610,7 @@ "NextPartNumberMarker": { "target": "com.amazonaws.s3#NextPartNumberMarker", "traits": { - "smithy.api#documentation": "

When a list is truncated, this element specifies the last part in the list, as well as\n the value to use for the part-number-marker request parameter in a subsequent\n request.

" + "smithy.api#documentation": "

When a list is truncated, this element specifies the last part in the list, as well as\n the value to use for the part-number-marker request parameter in a subsequent\n request.

" } }, "MaxParts": { @@ -30097,7 +24677,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the parts are being uploaded.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the parts are being uploaded.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -30308,13 +24888,13 @@ "Name": { "target": "com.amazonaws.s3#MetadataKey", "traits": { - "smithy.api#documentation": "

Name of the Object.

" + "smithy.api#documentation": "

Name of the object.

" } }, "Value": { "target": "com.amazonaws.s3#MetadataValue", "traits": { - "smithy.api#documentation": "

Value of the Object.

" + "smithy.api#documentation": "

Value of the object.

" } } }, @@ -30737,6 +25317,12 @@ "traits": { "smithy.api#documentation": "

The owner of the object

" } + }, + "RestoreStatus": { + "target": "com.amazonaws.s3#RestoreStatus", + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must be restored\n before they can be retrieved. For more information about these storage classes and how to work with\n archived objects, see \n Working with archived objects in the Amazon S3 User Guide.

" + } } }, "traits": { @@ -31247,6 +25833,12 @@ "traits": { "smithy.api#documentation": "

Specifies the owner of the object.

" } + }, + "RestoreStatus": { + "target": "com.amazonaws.s3#RestoreStatus", + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must be restored\n before they can be retrieved. For more information about these storage classes and how to work with\n archived objects, see \n Working with archived objects in the Amazon S3 User Guide.

" + } } }, "traits": { @@ -31273,6 +25865,23 @@ } } }, + "com.amazonaws.s3#OptionalObjectAttributes": { + "type": "enum", + "members": { + "RESTORE_STATUS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "RestoreStatus" + } + } + } + }, + "com.amazonaws.s3#OptionalObjectAttributesList": { + "type": "list", + "member": { + "target": "com.amazonaws.s3#OptionalObjectAttributes" + } + }, "com.amazonaws.s3#OutputLocation": { "type": "structure", "members": { @@ -31724,17 +26333,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. Specify the canned ACL name as the\n value of x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n the x-amz-acl header to set a canned ACL. These parameters map to the\n set of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants create,\n overwrite, and delete objects permission to LogDelivery group predefined by Amazon S3 and\n two Amazon Web Services accounts identified by their email addresses.

    \n

    \n x-amz-grant-write: uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\",\n id=\"111122223333\", id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", - "smithy.api#examples": [ - { - "title": "Put bucket acl", - "documentation": "The following example replaces existing ACL on a bucket. The ACL grants the bucket owner (specified using the owner ID) and write permission to the LogDelivery group. Because this is a replace operation, you must specify all the grants in your request. To incrementally add or remove ACL grants, you might use the console.", - "input": { - "Bucket": "examplebucket", - "GrantFullControl": "id=examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484", - "GrantWrite": "uri=http://acs.amazonaws.com/groups/s3/LogDelivery" - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?acl", @@ -31906,49 +26504,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the cors configuration for your bucket. If the configuration exists,\n Amazon S3 replaces it.

\n

To use this operation, you must be allowed to perform the s3:PutBucketCORS\n action. By default, the bucket owner has this permission and can grant it to others.

\n

You set this configuration on a bucket so that the bucket can service cross-origin\n requests. For example, you might want to enable a request whose origin is\n http://www.example.com to access your Amazon S3 bucket at\n my.example.bucket.com by using the browser's XMLHttpRequest\n capability.

\n

To enable cross-origin resource sharing (CORS) on a bucket, you add the\n cors subresource to the bucket. The cors subresource is an XML\n document in which you configure rules that identify origins and the HTTP methods that can\n be executed on your bucket. The document is limited to 64 KB in size.

\n

When Amazon S3 receives a cross-origin request (or a pre-flight OPTIONS request) against a\n bucket, it evaluates the cors configuration on the bucket and uses the first\n CORSRule rule that matches the incoming browser request to enable a\n cross-origin request. For a rule to match, the following conditions must be met:

\n
    \n
  • \n

    The request's Origin header must match AllowedOrigin\n elements.

    \n
  • \n
  • \n

    The request method (for example, GET, PUT, HEAD, and so on) or the\n Access-Control-Request-Method header in case of a pre-flight\n OPTIONS request must be one of the AllowedMethod\n elements.

    \n
  • \n
  • \n

    Every header specified in the Access-Control-Request-Headers request\n header of a pre-flight request must match an AllowedHeader element.\n

    \n
  • \n
\n

For more information about CORS, go to Enabling Cross-Origin Resource Sharing in\n the Amazon S3 User Guide.

\n

The following operations are related to PutBucketCors:

\n ", - "smithy.api#examples": [ - { - "title": "To set cors configuration on a bucket.", - "documentation": "The following example enables PUT, POST, and DELETE requests from www.example.com, and enables GET requests from any domain.", - "input": { - "Bucket": "", - "CORSConfiguration": { - "CORSRules": [ - { - "AllowedOrigins": [ - "http://www.example.com" - ], - "AllowedHeaders": [ - "*" - ], - "AllowedMethods": [ - "PUT", - "POST", - "DELETE" - ], - "MaxAgeSeconds": 3000, - "ExposeHeaders": [ - "x-amz-server-side-encryption" - ] - }, - { - "AllowedOrigins": [ - "*" - ], - "AllowedHeaders": [ - "Authorization" - ], - "AllowedMethods": [ - "GET" - ], - "MaxAgeSeconds": 3000 - } - ] - }, - "ContentMD5": "" - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?cors", @@ -32201,35 +26756,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3 Lifecycle\n configuration can have up to 1,000 rules. This limit is not adjustable. Each rule consists\n of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The filter can\n be based on a key name prefix, object tags, or a combination of both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want Amazon S3 to\n perform on the objects identified by the filter. If the state of your bucket is\n versioning-enabled or versioning-suspended, you can have many versions of the same\n object (one current version and zero or more noncurrent versions). Amazon S3 provides\n predefined actions that you can specify for current and noncurrent object\n versions.

    \n
  • \n
\n

For more information, see Object Lifecycle Management\n and Lifecycle Configuration Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and related\n subresources (for example, lifecycle configuration and website configuration). Only the\n resource owner (that is, the Amazon Web Services account that created it) can access the resource. The\n resource owner can optionally grant access permissions to others by writing an access\n policy. For this operation, a user must get the s3:PutLifecycleConfiguration\n permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any other\n permissions. If you want to block users or accounts from removing or deleting objects from\n your bucket, you must deny them permissions for the following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access Permissions to\n Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to PutBucketLifecycleConfiguration:

\n ", - "smithy.api#examples": [ - { - "title": "Put bucket lifecycle", - "documentation": "The following example replaces existing lifecycle configuration, if any, on the specified bucket. ", - "input": { - "Bucket": "examplebucket", - "LifecycleConfiguration": { - "Rules": [ - { - "Filter": { - "Prefix": "documents/" - }, - "Status": "Enabled", - "Transitions": [ - { - "Days": 365, - "StorageClass": "GLACIER" - } - ], - "Expiration": { - "Days": 3650 - }, - "ID": "TestOnly" - } - ] - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?lifecycle", @@ -32292,30 +26818,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GETObjectAcl\n request, appears as the CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request elements. To disable\n logging, you use an empty BucketLoggingStatus request element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", - "smithy.api#examples": [ - { - "title": "Set logging configuration for a bucket", - "documentation": "The following example sets logging policy on a bucket. For the Log Delivery group to deliver logs to the destination bucket, it needs permission for the READ_ACP action which the policy grants.", - "input": { - "Bucket": "sourcebucket", - "BucketLoggingStatus": { - "LoggingEnabled": { - "TargetBucket": "targetbucket", - "TargetPrefix": "MyBucketLogs/", - "TargetGrants": [ - { - "Grantee": { - "Type": "Group", - "URI": "http://acs.amazonaws.com/groups/global/AllUsers" - }, - "Permission": "READ" - } - ] - } - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?logging", @@ -32442,25 +26944,6 @@ }, "traits": { "smithy.api#documentation": "

Enables notifications of specified events for a bucket. For more information about event\n notifications, see Configuring Event\n Notifications.

\n

Using this API, you can replace an existing notification configuration. The\n configuration is an XML file that defines the event types that you want Amazon S3 to publish and\n the destination where you want Amazon S3 to publish an event notification when it detects an\n event of the specified type.

\n

By default, your bucket has no event notifications configured. That is, the notification\n configuration will be an empty NotificationConfiguration.

\n

\n \n

\n

\n \n

\n

This action replaces the existing notification configuration with the configuration you\n include in the request body.

\n

After Amazon S3 receives this request, it first verifies that any Amazon Simple Notification\n Service (Amazon SNS) or Amazon Simple Queue Service (Amazon SQS) destination exists, and\n that the bucket owner has permission to publish to it by sending a test notification. In\n the case of Lambda destinations, Amazon S3 verifies that the Lambda function permissions\n grant Amazon S3 permission to invoke the function from the Amazon S3 bucket. For more information,\n see Configuring Notifications for Amazon S3 Events.

\n

You can disable notifications by adding the empty NotificationConfiguration\n element.

\n

For more information about the number of event notification configurations that you can\n create per bucket, see Amazon S3 service quotas in Amazon Web Services\n General Reference.

\n

By default, only the bucket owner can configure notifications on a bucket. However,\n bucket owners can use a bucket policy to grant permission to other users to set this\n configuration with the required s3:PutBucketNotification permission.

\n \n

The PUT notification is an atomic operation. For example, suppose your notification\n configuration includes SNS topic, SQS queue, and Lambda function configurations. When\n you send a PUT request with this configuration, Amazon S3 sends test messages to your SNS\n topic. If the message fails, the entire PUT action will fail, and Amazon S3 will not add the\n configuration to your bucket.

\n
\n

If the configuration in the request body includes only one\n TopicConfiguration specifying only the\n s3:ReducedRedundancyLostObject event type, the response will also include\n the x-amz-sns-test-message-id header containing the message ID of the test\n notification sent to the topic.

\n

The following action is related to\n PutBucketNotificationConfiguration:

\n ", - "smithy.api#examples": [ - { - "title": "Set notification configuration for a bucket", - "documentation": "The following example sets notification configuration on a bucket to publish the object created events to an SNS topic.", - "input": { - "Bucket": "examplebucket", - "NotificationConfiguration": { - "TopicConfigurations": [ - { - "TopicArn": "arn:aws:sns:us-west-2:123456789012:s3-notification-topic", - "Events": [ - "s3:ObjectCreated:*" - ] - } - ] - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?notification", @@ -32586,16 +27069,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", - "smithy.api#examples": [ - { - "title": "Set bucket policy", - "documentation": "The following example sets a permission policy on a bucket.", - "input": { - "Bucket": "examplebucket", - "Policy": "{\"Version\": \"2012-10-17\", \"Statement\": [{ \"Sid\": \"id-1\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"arn:aws:iam::123456789012:root\"}, \"Action\": [ \"s3:PutObject\",\"s3:PutObjectAcl\"], \"Resource\": [\"arn:aws:s3:::acl3/*\" ] } ]}" - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?policy", @@ -32673,28 +27146,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using server-side\n encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\n SourceSelectionCriteria, SseKmsEncryptedObjects,\n Status, EncryptionConfiguration, and\n ReplicaKmsKeyID. For information about replication configuration, see\n Replicating Objects\n Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the bucket,\n can perform this operation. The resource owner can also grant others permissions to perform\n the operation. For more information about permissions, see Specifying Permissions in a\n Policy and Managing Access Permissions to\n Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have the\n iam:PassRole permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", - "smithy.api#examples": [ - { - "title": "Set replication configuration on a bucket", - "documentation": "The following example sets replication configuration on a bucket.", - "input": { - "Bucket": "examplebucket", - "ReplicationConfiguration": { - "Role": "arn:aws:iam::123456789012:role/examplerole", - "Rules": [ - { - "Prefix": "", - "Status": "Enabled", - "Destination": { - "Bucket": "arn:aws:s3:::destinationbucket", - "StorageClass": "STANDARD" - } - } - ] - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?replication", @@ -32771,18 +27222,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the request payment configuration for a bucket. By default, the bucket owner pays\n for downloads from the bucket. This configuration parameter enables the bucket owner (only)\n to specify that the person requesting the download will be charged for the download. For\n more information, see Requester Pays\n Buckets.

\n

The following operations are related to PutBucketRequestPayment:

\n ", - "smithy.api#examples": [ - { - "title": "Set request payment configuration on a bucket.", - "documentation": "The following example sets request payment configuration on a bucket so that person requesting the download is charged.", - "input": { - "Bucket": "examplebucket", - "RequestPaymentConfiguration": { - "Payer": "Requester" - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?requestPayment", @@ -32853,27 +27292,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3 Bucket\n Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors:

\n
    \n
  • \n

    Error code: InvalidTagError\n

    \n \n
  • \n
  • \n

    Error code: MalformedXMLError\n

    \n
      \n
    • \n

      Description: The XML provided does not match the schema.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: OperationAbortedError \n

    \n
      \n
    • \n

      Description: A conflicting conditional action is currently in progress\n against this resource. Please try again.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InternalError\n

    \n
      \n
    • \n

      Description: The service was unable to apply the provided tag to the\n bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", - "smithy.api#examples": [ - { - "title": "Set tags on a bucket", - "documentation": "The following example sets tags on a bucket. Any existing tags are replaced.", - "input": { - "Bucket": "examplebucket", - "Tagging": { - "TagSet": [ - { - "Key": "Key1", - "Value": "Value1" - }, - { - "Key": "Key2", - "Value": "Value2" - } - ] - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?tagging", @@ -32944,19 +27362,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket and\n you want to maintain the same permanent delete behavior when you enable versioning, you\n must add a noncurrent expiration policy. The noncurrent expiration lifecycle configuration will\n manage the deletes of the noncurrent object versions in the version-enabled bucket. (A\n version-enabled bucket maintains one current and zero or more noncurrent object\n versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", - "smithy.api#examples": [ - { - "title": "Set versioning configuration on a bucket", - "documentation": "The following example sets versioning configuration on bucket. The configuration enables versioning on the bucket.", - "input": { - "Bucket": "examplebucket", - "VersioningConfiguration": { - "MFADelete": "Disabled", - "Status": "Enabled" - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?versioning", @@ -33034,24 +27439,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

", - "smithy.api#examples": [ - { - "title": "Set website configuration on a bucket", - "documentation": "The following example adds website configuration to a bucket.", - "input": { - "Bucket": "examplebucket", - "ContentMD5": "", - "WebsiteConfiguration": { - "IndexDocument": { - "Suffix": "index.html" - }, - "ErrorDocument": { - "Key": "error.html" - } - } - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?website", @@ -33121,22 +27508,6 @@ "requestAlgorithmMember": "ChecksumAlgorithm" }, "smithy.api#documentation": "

Adds an object to a bucket. You must have WRITE permissions on a bucket to add an object\n to it.

\n \n

Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the\n entire object to the bucket. You cannot use PutObject to only update a\n single piece of metadata for an existing object. You must put the entire object with\n updated metadata if you want to update some values.

\n
\n

Amazon S3 is a distributed system. If it receives multiple write requests for the same object\n simultaneously, it overwrites all but the last object written. To prevent objects from\n being deleted or overwritten, you can use Amazon S3 Object\n Lock.

\n

To ensure that data is not corrupted traversing the network, use the\n Content-MD5 header. When you use this header, Amazon S3 checks the object\n against the provided MD5 value and, if they do not match, returns an error. Additionally,\n you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to\n the calculated MD5 value.

\n \n
    \n
  • \n

    To successfully complete the PutObject request, you must have the\n s3:PutObject in your IAM permissions.

    \n
  • \n
  • \n

    To successfully change the objects acl of your PutObject request,\n you must have the s3:PutObjectAcl in your IAM permissions.

    \n
  • \n
  • \n

    To successfully set the tag-set with your PutObject request, you\n must have the s3:PutObjectTagging in your IAM permissions.

    \n
  • \n
  • \n

    The Content-MD5 header is required for any request to upload an\n object with a retention period configured using Amazon S3 Object Lock. For more\n information about Amazon S3 Object Lock, see Amazon S3 Object Lock\n Overview in the Amazon S3 User Guide.

    \n
  • \n
\n
\n

You have four mutually exclusive options to protect data using server-side encryption in\n Amazon S3, depending on how you choose to manage the encryption keys. Specifically, the\n encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with server-side\n encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to\n encrypt data at rest by using server-side encryption with other key options. For more\n information, see Using Server-Side\n Encryption.

\n

When adding a new object, you can use headers to grant ACL-based permissions to\n individual Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are\n then added to the ACL on the object. By default, all objects are private. Only the owner\n has full access control. For more information, see Access Control List (ACL) Overview\n and Managing\n ACLs Using the REST API.

\n

If the bucket that you're uploading objects to uses the bucket owner enforced setting\n for S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that\n use this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format. PUT requests that\n contain other ACLs (for example, custom grants to certain Amazon Web Services accounts) fail and return a\n 400 error with the error code AccessControlListNotSupported.\n For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID\n for the object being stored. Amazon S3 returns this ID in the response. When you enable\n versioning for a bucket, if Amazon S3 receives multiple write requests for the same object\n simultaneously, it stores all of the objects. For more information about versioning, see\n Adding Objects to\n Versioning-Enabled Buckets. For information about returning the versioning state\n of a bucket, see GetBucketVersioning.

\n

For more information about related Amazon S3 APIs, see the following:

\n ", - "smithy.api#examples": [ - { - "title": "To upload an object and specify optional tags", - "documentation": "The following example uploads an object. The request specifies optional object tags. The bucket is versioned, therefore S3 returns version ID of the newly created object.", - "input": { - "Body": "c:\\HappyFace.jpg", - "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "Tagging": "key1=value1&key2=value2" - }, - "output": { - "VersionId": "psM2sYY4.o1501dSx8wMvnkOzSBB.V4a", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=PutObject", @@ -33163,20 +27534,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined set\n of grantees and permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n x-amz-acl header to set a canned ACL. These parameters map to the set\n of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants list\n objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets the ACL of\n the current version of an object. To set the ACL of a different version, use the\n versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", - "smithy.api#examples": [ - { - "title": "To grant permissions using object ACL", - "documentation": "The following example adds grants to an object ACL. The first permission grants user1 and user2 FULL_CONTROL and the AllUsers group READ permission.", - "input": { - "AccessControlPolicy": {}, - "Bucket": "examplebucket", - "GrantFullControl": "emailaddress=user1@example.com,emailaddress=user2@example.com", - "GrantRead": "uri=http://acs.amazonaws.com/groups/global/AllUsers", - "Key": "HappyFace.jpg" - }, - "output": {} - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?acl", @@ -33279,7 +27636,7 @@ "Key": { "target": "com.amazonaws.s3#ObjectKey", "traits": { - "smithy.api#documentation": "

Key for which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Key for which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} } @@ -33636,7 +27993,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name to which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name to which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34015,31 +28372,6 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket.

\n

A tag is a key-value pair. You can associate tags with an object by sending a PUT\n request against the tagging subresource that is associated with the object. You can\n retrieve tags by sending a GET request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

\n PutObjectTagging has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n Code: InvalidTagError \n

      \n
    • \n
    • \n

      \n Cause: The tag provided was not a valid tag. This error can occur\n if the tag did not pass input validation. For more information, see Object\n Tagging.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: MalformedXMLError \n

      \n
    • \n
    • \n

      \n Cause: The XML provided does not match the schema.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: OperationAbortedError \n

      \n
    • \n
    • \n

      \n Cause: A conflicting conditional action is currently in progress\n against this resource. Please try again.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InternalError\n

      \n
    • \n
    • \n

      \n Cause: The service was unable to apply the provided tag to the\n object.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", - "smithy.api#examples": [ - { - "title": "To add tags to an existing object", - "documentation": "The following example adds tags to an existing object.", - "input": { - "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "Tagging": { - "TagSet": [ - { - "Key": "Key3", - "Value": "Value3" - }, - { - "Key": "Key4", - "Value": "Value4" - } - ] - } - }, - "output": { - "VersionId": "null" - } - } - ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?tagging", @@ -34068,7 +28400,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34718,6 +29050,9 @@ "com.amazonaws.s3#Restore": { "type": "string" }, + "com.amazonaws.s3#RestoreExpiryDate": { + "type": "timestamp" + }, "com.amazonaws.s3#RestoreObject": { "type": "operation", "input": { @@ -34736,23 +29071,6 @@ "requestAlgorithmMember": "ChecksumAlgorithm" }, "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your\n query in the request body's SelectParameters structure. You can use\n expressions like the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified\n object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object,\n you can specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field\n to IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval or\n S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive storage\n classes, you must first initiate a restore request, and then wait until a temporary copy of\n the object is available. If you want a permanent copy of the object, create a copy of it in\n the Amazon S3 Standard storage class in your S3 bucket. To access an archived object, you must\n restore the object for the duration (number of days) that you specify. For objects in the\n Archive Access or Deep Archive Access tiers of S3 Intelligent-Tiering, you must first\n initiate a restore request, and then wait until the object is moved into the Frequent\n Access tier.

\n

To restore a specific object version, you can provide a version ID. If you don't provide\n a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data access tier\n options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access your\n data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier when occasional urgent requests for restoring archives\n are required. For all but the largest archived objects (250 MB+), data accessed using\n Expedited retrievals is typically made available within 1–5 minutes. Provisioned\n capacity ensures that retrieval capacity for Expedited retrievals is available when\n you need it. Expedited retrievals and provisioned capacity are not available for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of your\n archived objects within several hours. This is the default option for retrieval\n requests that do not specify the retrieval option. Standard retrievals typically\n finish within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval Flexible\n Retrieval storage class or S3 Intelligent-Tiering Archive tier. They typically finish within\n 12 hours for objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored in\n S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the S3 Glacier\n Flexible Retrieval and S3 Intelligent-Tiering storage classes, enabling you to\n retrieve large amounts, even petabytes, of data at no cost. Bulk retrievals typically\n finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval\n Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are\n also the lowest-cost retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for objects\n stored in the S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive\n tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity for\n Expedited data access, see Restoring Archived Objects in\n the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster speed\n while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD request.\n Operations return the x-amz-restore header, which provides information about\n the restoration status, in the response. You can use Amazon S3 event notifications to notify you\n when a restore is initiated or completed. For more information, see Configuring Amazon S3\n Event Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by reissuing\n the request with a new period. Amazon S3 updates the restoration period relative to the current\n time and charges only for the request-there are no data transfer charges. You cannot\n update the restoration period when Amazon S3 is actively processing your current restore request\n for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an expiration\n action, the object expiration overrides the life span that you specify in a restore\n request. For example, if you restore an object copy for 10 days, but the object is\n scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days. For more information\n about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle Management\n in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202 Accepted\n status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in the\n response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error does not\n apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available. Try again\n later. (Returned if there is insufficient capacity to process the Expedited\n request. This error applies only to Expedited retrievals and not to\n S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", - "smithy.api#examples": [ - { - "title": "To restore an archived object", - "documentation": "The following example restores for one day an archived copy of an object back into Amazon S3 bucket.", - "input": { - "Bucket": "examplebucket", - "Key": "archivedobjectkey", - "RestoreRequest": { - "Days": 1, - "GlacierJobParameters": { - "Tier": "Expedited" - } - } - }, - "output": {} - } - ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?restore&x-id=RestoreObject", @@ -34787,7 +29105,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object to restore.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object to restore.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34907,6 +29225,27 @@ } } }, + "com.amazonaws.s3#RestoreStatus": { + "type": "structure", + "members": { + "IsRestoreInProgress": { + "target": "com.amazonaws.s3#IsRestoreInProgress", + "traits": { + "smithy.api#default": false, + "smithy.api#documentation": "

Specifies whether the object is currently being restored. If the object restoration is\n in progress, the header returns the value TRUE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"true\"\n

\n

If the object restoration has completed, the header returns the value FALSE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\", RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

\n

If the object hasn't been restored, there is no header response.

" + } + }, + "RestoreExpiryDate": { + "target": "com.amazonaws.s3#RestoreExpiryDate", + "traits": { + "smithy.api#documentation": "

Indicates when the restored copy will expire. This value is populated only if the object\n has already been restored. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\", RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must be restored\n before they can be retrieved. For more information about these storage classes and how to work with\n archived objects, see \n Working with archived objects in the Amazon S3 User Guide.

" + } + }, "com.amazonaws.s3#Role": { "type": "string" }, @@ -36031,7 +30370,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -36273,7 +30612,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { diff --git a/aws/sdk/aws-models/sdk-endpoints.json b/aws/sdk/aws-models/sdk-endpoints.json index b74e1ac35da..0ab97122237 100644 --- a/aws/sdk/aws-models/sdk-endpoints.json +++ b/aws/sdk/aws-models/sdk-endpoints.json @@ -21,7 +21,7 @@ "dnsSuffix" : "amazonaws.com", "partition" : "aws", "partitionName" : "AWS Standard", - "regionRegex" : "^(us|eu|ap|sa|ca|me|af)\\-\\w+\\-\\d+$", + "regionRegex" : "^(us|eu|ap|sa|ca|me|af|il)\\-\\w+\\-\\d+$", "regions" : { "af-south-1" : { "description" : "Africa (Cape Town)" @@ -83,6 +83,9 @@ "eu-west-3" : { "description" : "Europe (Paris)" }, + "il-central-1" : { + "description" : "Israel (Tel Aviv)" + }, "me-central-1" : { "description" : "Middle East (UAE)" }, @@ -173,6 +176,7 @@ "deprecated" : true, "hostname" : "access-analyzer-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -248,6 +252,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -370,6 +375,7 @@ "deprecated" : true, "hostname" : "acm-pca-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -796,6 +802,12 @@ "deprecated" : true, "hostname" : "ecr-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "hostname" : "api.ecr.il-central-1.amazonaws.com" + }, "me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -1055,6 +1067,7 @@ }, "endpoints" : { "ap-south-1" : { }, + "eu-central-1" : { }, "us-east-1" : { } } }, @@ -1086,6 +1099,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1294,6 +1308,7 @@ "deprecated" : true, "hostname" : "apigateway-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1359,6 +1374,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1390,6 +1406,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1444,6 +1461,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1461,16 +1479,20 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, "ca-central-1" : { }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, @@ -1855,6 +1877,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1902,6 +1925,12 @@ "tags" : [ "dualstack" ] } ] }, + "ap-south-2" : { + "variants" : [ { + "hostname" : "athena.ap-south-2.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "ap-southeast-1" : { "variants" : [ { "hostname" : "athena.ap-southeast-1.api.aws", @@ -1920,6 +1949,12 @@ "tags" : [ "dualstack" ] } ] }, + "ap-southeast-4" : { + "variants" : [ { + "hostname" : "athena.ap-southeast-4.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "ca-central-1" : { "variants" : [ { "hostname" : "athena.ca-central-1.api.aws", @@ -1932,6 +1967,12 @@ "tags" : [ "dualstack" ] } ] }, + "eu-central-2" : { + "variants" : [ { + "hostname" : "athena.eu-central-2.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "eu-north-1" : { "variants" : [ { "hostname" : "athena.eu-north-1.api.aws", @@ -1944,6 +1985,12 @@ "tags" : [ "dualstack" ] } ] }, + "eu-south-2" : { + "variants" : [ { + "hostname" : "athena.eu-south-2.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "eu-west-1" : { "variants" : [ { "hostname" : "athena.eu-west-1.api.aws", @@ -1990,6 +2037,12 @@ "deprecated" : true, "hostname" : "athena-fips.us-west-2.amazonaws.com" }, + "me-central-1" : { + "variants" : [ { + "hostname" : "athena.me-central-1.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "me-south-1" : { "variants" : [ { "hostname" : "athena.me-south-1.api.aws", @@ -2093,6 +2146,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2189,9 +2243,32 @@ }, "backupstorage" : { "endpoints" : { + "af-south-1" : { }, + "ap-east-1" : { }, + "ap-northeast-1" : { }, + "ap-northeast-2" : { }, + "ap-northeast-3" : { }, + "ap-south-1" : { }, + "ap-south-2" : { }, + "ap-southeast-1" : { }, + "ap-southeast-2" : { }, + "ap-southeast-3" : { }, + "ap-southeast-4" : { }, + "ca-central-1" : { }, + "eu-central-1" : { }, + "eu-central-2" : { }, + "eu-north-1" : { }, + "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, + "eu-west-2" : { }, + "eu-west-3" : { }, + "me-central-1" : { }, + "me-south-1" : { }, + "sa-east-1" : { }, "us-east-1" : { }, "us-east-2" : { }, + "us-west-1" : { }, "us-west-2" : { } } }, @@ -2518,6 +2595,7 @@ "deprecated" : true, "hostname" : "cloudcontrolapi-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2582,6 +2660,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2681,6 +2760,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2754,6 +2834,7 @@ "deprecated" : true, "hostname" : "cloudtrail-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2848,6 +2929,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -3031,6 +3113,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -3684,6 +3767,7 @@ "deprecated" : true, "hostname" : "config-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -3788,6 +3872,8 @@ "endpoints" : { "ap-northeast-1" : { }, "ap-northeast-2" : { }, + "ap-south-1" : { }, + "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ca-central-1" : { }, "eu-central-1" : { }, @@ -4500,6 +4586,7 @@ "deprecated" : true, "hostname" : "directconnect-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -4548,6 +4635,7 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, @@ -4609,6 +4697,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -4762,16 +4851,21 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, @@ -4842,6 +4936,7 @@ "deprecated" : true, "hostname" : "ds-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -4908,6 +5003,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "local" : { "credentialScope" : { "region" : "us-east-1" @@ -5034,6 +5130,7 @@ "deprecated" : true, "hostname" : "ebs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5138,6 +5235,7 @@ "deprecated" : true, "hostname" : "ec2-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { @@ -5231,6 +5329,7 @@ "deprecated" : true, "hostname" : "ecs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5327,6 +5426,7 @@ "deprecated" : true, "hostname" : "fips.eks.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5385,6 +5485,7 @@ "deprecated" : true, "hostname" : "elasticache-fips.us-west-1.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5488,6 +5589,7 @@ "deprecated" : true, "hostname" : "elasticbeanstalk-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { @@ -5778,6 +5880,13 @@ "deprecated" : true, "hostname" : "elasticfilesystem-fips.eu-west-3.amazonaws.com" }, + "fips-il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "deprecated" : true, + "hostname" : "elasticfilesystem-fips.il-central-1.amazonaws.com" + }, "fips-me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -5827,6 +5936,12 @@ "deprecated" : true, "hostname" : "elasticfilesystem-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "elasticfilesystem-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "me-central-1" : { "variants" : [ { "hostname" : "elasticfilesystem-fips.me-central-1.amazonaws.com", @@ -5924,6 +6039,7 @@ "deprecated" : true, "hostname" : "elasticloadbalancing-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6021,6 +6137,7 @@ "deprecated" : true, "hostname" : "elasticmapreduce-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6114,6 +6231,7 @@ }, "emr-containers" : { "endpoints" : { + "af-south-1" : { }, "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, @@ -6128,6 +6246,7 @@ }, "eu-central-1" : { }, "eu-north-1" : { }, + "eu-south-1" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, @@ -6315,6 +6434,7 @@ "deprecated" : true, "hostname" : "es-fips.us-west-1.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6422,6 +6542,7 @@ "deprecated" : true, "hostname" : "events-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6550,6 +6671,7 @@ "deprecated" : true, "hostname" : "firehose-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -7272,9 +7394,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { }, "eu-central-1" : { }, "eu-central-2" : { }, @@ -7312,6 +7436,7 @@ "deprecated" : true, "hostname" : "glue-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -7718,6 +7843,7 @@ "identitystore" : { "endpoints" : { "af-south-1" : { }, + "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, "ap-northeast-3" : { }, @@ -7732,9 +7858,11 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, "us-east-2" : { }, + "us-west-1" : { }, "us-west-2" : { } } }, @@ -7893,12 +8021,60 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "fips-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-east-1.amazonaws.com" + }, + "fips-us-east-2" : { + "credentialScope" : { + "region" : "us-east-2" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-east-2.amazonaws.com" + }, + "fips-us-west-1" : { + "credentialScope" : { + "region" : "us-west-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-west-1.amazonaws.com" + }, + "fips-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-west-2.amazonaws.com" + }, "me-south-1" : { }, "sa-east-1" : { }, - "us-east-1" : { }, - "us-east-2" : { }, - "us-west-1" : { }, - "us-west-2" : { } + "us-east-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-east-2" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-east-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-2" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + } } }, "internetmonitor" : { @@ -7923,27 +8099,49 @@ "ap-northeast-2" : { "hostname" : "internetmonitor.ap-northeast-2.api.aws" }, + "ap-northeast-3" : { + "hostname" : "internetmonitor.ap-northeast-3.api.aws" + }, "ap-south-1" : { "hostname" : "internetmonitor.ap-south-1.api.aws" }, + "ap-south-2" : { + "hostname" : "internetmonitor.ap-south-2.api.aws" + }, "ap-southeast-1" : { "hostname" : "internetmonitor.ap-southeast-1.api.aws" }, "ap-southeast-2" : { "hostname" : "internetmonitor.ap-southeast-2.api.aws" }, + "ap-southeast-3" : { + "hostname" : "internetmonitor.ap-southeast-3.api.aws" + }, + "ap-southeast-4" : { + "hostname" : "internetmonitor.ap-southeast-4.api.aws" + }, "ca-central-1" : { - "hostname" : "internetmonitor.ca-central-1.api.aws" + "hostname" : "internetmonitor.ca-central-1.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.ca-central-1.api.aws", + "tags" : [ "fips" ] + } ] }, "eu-central-1" : { "hostname" : "internetmonitor.eu-central-1.api.aws" }, + "eu-central-2" : { + "hostname" : "internetmonitor.eu-central-2.api.aws" + }, "eu-north-1" : { "hostname" : "internetmonitor.eu-north-1.api.aws" }, "eu-south-1" : { "hostname" : "internetmonitor.eu-south-1.api.aws" }, + "eu-south-2" : { + "hostname" : "internetmonitor.eu-south-2.api.aws" + }, "eu-west-1" : { "hostname" : "internetmonitor.eu-west-1.api.aws" }, @@ -7953,6 +8151,12 @@ "eu-west-3" : { "hostname" : "internetmonitor.eu-west-3.api.aws" }, + "il-central-1" : { + "hostname" : "internetmonitor.il-central-1.api.aws" + }, + "me-central-1" : { + "hostname" : "internetmonitor.me-central-1.api.aws" + }, "me-south-1" : { "hostname" : "internetmonitor.me-south-1.api.aws" }, @@ -7960,16 +8164,32 @@ "hostname" : "internetmonitor.sa-east-1.api.aws" }, "us-east-1" : { - "hostname" : "internetmonitor.us-east-1.api.aws" + "hostname" : "internetmonitor.us-east-1.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-east-1.api.aws", + "tags" : [ "fips" ] + } ] }, "us-east-2" : { - "hostname" : "internetmonitor.us-east-2.api.aws" + "hostname" : "internetmonitor.us-east-2.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-east-2.api.aws", + "tags" : [ "fips" ] + } ] }, "us-west-1" : { - "hostname" : "internetmonitor.us-west-1.api.aws" + "hostname" : "internetmonitor.us-west-1.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-west-1.api.aws", + "tags" : [ "fips" ] + } ] }, "us-west-2" : { - "hostname" : "internetmonitor.us-west-2.api.aws" + "hostname" : "internetmonitor.us-west-2.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-west-2.api.aws", + "tags" : [ "fips" ] + } ] } } }, @@ -8419,8 +8639,104 @@ "endpoints" : { "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "api-ap-southeast-1" : { + "credentialScope" : { + "region" : "ap-southeast-1" + }, + "hostname" : "api.iottwinmaker.ap-southeast-1.amazonaws.com" + }, + "api-ap-southeast-2" : { + "credentialScope" : { + "region" : "ap-southeast-2" + }, + "hostname" : "api.iottwinmaker.ap-southeast-2.amazonaws.com" + }, + "api-eu-central-1" : { + "credentialScope" : { + "region" : "eu-central-1" + }, + "hostname" : "api.iottwinmaker.eu-central-1.amazonaws.com" + }, + "api-eu-west-1" : { + "credentialScope" : { + "region" : "eu-west-1" + }, + "hostname" : "api.iottwinmaker.eu-west-1.amazonaws.com" + }, + "api-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "api.iottwinmaker.us-east-1.amazonaws.com" + }, + "api-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "api.iottwinmaker.us-west-2.amazonaws.com" + }, + "data-ap-southeast-1" : { + "credentialScope" : { + "region" : "ap-southeast-1" + }, + "hostname" : "data.iottwinmaker.ap-southeast-1.amazonaws.com" + }, + "data-ap-southeast-2" : { + "credentialScope" : { + "region" : "ap-southeast-2" + }, + "hostname" : "data.iottwinmaker.ap-southeast-2.amazonaws.com" + }, + "data-eu-central-1" : { + "credentialScope" : { + "region" : "eu-central-1" + }, + "hostname" : "data.iottwinmaker.eu-central-1.amazonaws.com" + }, + "data-eu-west-1" : { + "credentialScope" : { + "region" : "eu-west-1" + }, + "hostname" : "data.iottwinmaker.eu-west-1.amazonaws.com" + }, + "data-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "data.iottwinmaker.us-east-1.amazonaws.com" + }, + "data-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "data.iottwinmaker.us-west-2.amazonaws.com" + }, "eu-central-1" : { }, "eu-west-1" : { }, + "fips-api-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "api.iottwinmaker-fips.us-east-1.amazonaws.com" + }, + "fips-api-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "api.iottwinmaker-fips.us-west-2.amazonaws.com" + }, + "fips-data-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "data.iottwinmaker-fips.us-east-1.amazonaws.com" + }, + "fips-data-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "data.iottwinmaker-fips.us-west-2.amazonaws.com" + }, "fips-us-east-1" : { "credentialScope" : { "region" : "us-east-1" @@ -8745,6 +9061,9 @@ "eu-west-3" : { "hostname" : "kendra-ranking.eu-west-3.api.aws" }, + "il-central-1" : { + "hostname" : "kendra-ranking.il-central-1.api.aws" + }, "me-central-1" : { "hostname" : "kendra-ranking.me-central-1.api.aws" }, @@ -8830,6 +9149,7 @@ "deprecated" : true, "hostname" : "kinesis-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -8881,6 +9201,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -9179,10 +9500,17 @@ "deprecated" : true, "hostname" : "kms-fips.eu-west-3.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "kms-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "il-central-1-fips" : { "credentialScope" : { "region" : "il-central-1" }, + "deprecated" : true, "hostname" : "kms-fips.il-central-1.amazonaws.com" }, "me-central-1" : { @@ -9286,9 +9614,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { }, "eu-central-1" : { }, "eu-central-2" : { }, @@ -9326,6 +9656,7 @@ "deprecated" : true, "hostname" : "lakeformation-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -9505,6 +9836,12 @@ "deprecated" : true, "hostname" : "lambda-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "lambda.il-central-1.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "me-central-1" : { "variants" : [ { "hostname" : "lambda.me-central-1.api.aws", @@ -9685,6 +10022,7 @@ "deprecated" : true, "hostname" : "license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -9855,6 +10193,7 @@ "deprecated" : true, "hostname" : "logs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10127,12 +10466,15 @@ }, "mediaconnect" : { "endpoints" : { + "af-south-1" : { }, "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, + "ap-northeast-3" : { }, "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10287,6 +10629,7 @@ "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10306,6 +10649,7 @@ "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10325,6 +10669,7 @@ "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10455,6 +10800,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10486,6 +10832,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10725,6 +11072,7 @@ "deprecated" : true, "hostname" : "monitoring-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10962,9 +11310,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { "variants" : [ { "hostname" : "network-firewall-fips.ca-central-1.amazonaws.com", @@ -10972,8 +11322,10 @@ } ] }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, @@ -11047,7 +11399,18 @@ "credentialScope" : { "region" : "us-west-2" }, - "hostname" : "networkmanager.us-west-2.amazonaws.com" + "hostname" : "networkmanager.us-west-2.amazonaws.com", + "variants" : [ { + "hostname" : "networkmanager-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "fips-aws-global" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "networkmanager-fips.us-west-2.amazonaws.com" } }, "isRegionalized" : false, @@ -11056,10 +11419,15 @@ "nimble" : { "endpoints" : { "ap-northeast-1" : { }, + "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ca-central-1" : { }, + "eu-central-1" : { }, + "eu-north-1" : { }, + "eu-west-1" : { }, "eu-west-2" : { }, "us-east-1" : { }, + "us-east-2" : { }, "us-west-2" : { } } }, @@ -11085,6 +11453,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -11522,6 +11891,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12071,6 +12441,7 @@ "deprecated" : true, "hostname" : "ram-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12162,6 +12533,7 @@ "deprecated" : true, "hostname" : "rbin-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12225,6 +12597,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "rds-fips.ca-central-1" : { @@ -12496,6 +12869,7 @@ "deprecated" : true, "hostname" : "redshift-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12785,6 +13159,9 @@ "eu-west-3" : { "hostname" : "resource-explorer-2.eu-west-3.api.aws" }, + "il-central-1" : { + "hostname" : "resource-explorer-2.il-central-1.api.aws" + }, "sa-east-1" : { "hostname" : "resource-explorer-2.sa-east-1.api.aws" }, @@ -12852,6 +13229,7 @@ "deprecated" : true, "hostname" : "resource-groups-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12981,6 +13359,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -13092,6 +13471,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -13340,6 +13720,12 @@ "deprecated" : true, "hostname" : "s3-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "s3.dualstack.il-central-1.amazonaws.com", + "tags" : [ "dualstack" ] + } ] + }, "me-central-1" : { "variants" : [ { "hostname" : "s3.dualstack.me-central-1.amazonaws.com", @@ -13810,18 +14196,26 @@ }, "schemas" : { "endpoints" : { + "af-south-1" : { }, "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, + "ap-northeast-3" : { }, "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ap-southeast-3" : { }, "ca-central-1" : { }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, + "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-central-1" : { }, + "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, "us-east-2" : { }, @@ -13881,6 +14275,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -13988,6 +14383,7 @@ "deprecated" : true, "hostname" : "securityhub-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -14117,6 +14513,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -14182,9 +14579,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { "variants" : [ { "hostname" : "servicecatalog-appregistry-fips.ca-central-1.amazonaws.com", @@ -14192,8 +14591,10 @@ } ] }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, @@ -14265,67 +14666,67 @@ "endpoints" : { "af-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.af-south-1.amazonaws.com", + "hostname" : "servicediscovery.af-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-east-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-east-1.amazonaws.com", + "hostname" : "servicediscovery.ap-east-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-northeast-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-northeast-1.amazonaws.com", + "hostname" : "servicediscovery.ap-northeast-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-northeast-2" : { "variants" : [ { - "hostname" : "servicediscovery.ap-northeast-2.amazonaws.com", + "hostname" : "servicediscovery.ap-northeast-2.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-northeast-3" : { "variants" : [ { - "hostname" : "servicediscovery.ap-northeast-3.amazonaws.com", + "hostname" : "servicediscovery.ap-northeast-3.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-south-1.amazonaws.com", + "hostname" : "servicediscovery.ap-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-south-2" : { "variants" : [ { - "hostname" : "servicediscovery.ap-south-2.amazonaws.com", + "hostname" : "servicediscovery.ap-south-2.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-1.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-2" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-2.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-2.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-3" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-3.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-3.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-4" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-4.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-4.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14334,7 +14735,10 @@ "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.ca-central-1.amazonaws.com", + "hostname" : "servicediscovery-fips.ca-central-1.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.ca-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14347,93 +14751,85 @@ }, "eu-central-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-central-1.amazonaws.com", + "hostname" : "servicediscovery.eu-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-central-2" : { "variants" : [ { - "hostname" : "servicediscovery.eu-central-2.amazonaws.com", + "hostname" : "servicediscovery.eu-central-2.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-north-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-north-1.amazonaws.com", + "hostname" : "servicediscovery.eu-north-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-south-1.amazonaws.com", + "hostname" : "servicediscovery.eu-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-south-2" : { "variants" : [ { - "hostname" : "servicediscovery.eu-south-2.amazonaws.com", + "hostname" : "servicediscovery.eu-south-2.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-west-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-west-1.amazonaws.com", + "hostname" : "servicediscovery.eu-west-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-west-2" : { "variants" : [ { - "hostname" : "servicediscovery.eu-west-2.amazonaws.com", + "hostname" : "servicediscovery.eu-west-2.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-west-3" : { "variants" : [ { - "hostname" : "servicediscovery.eu-west-3.amazonaws.com", + "hostname" : "servicediscovery.eu-west-3.api.aws", "tags" : [ "dualstack" ] } ] }, - "me-central-1" : { + "il-central-1" : { "variants" : [ { - "hostname" : "servicediscovery.me-central-1.amazonaws.com", + "hostname" : "servicediscovery.il-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, - "me-south-1" : { + "me-central-1" : { "variants" : [ { - "hostname" : "servicediscovery.me-south-1.amazonaws.com", + "hostname" : "servicediscovery.me-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, - "sa-east-1" : { + "me-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.sa-east-1.amazonaws.com", + "hostname" : "servicediscovery.me-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, - "servicediscovery" : { - "credentialScope" : { - "region" : "ca-central-1" - }, - "deprecated" : true, + "sa-east-1" : { "variants" : [ { - "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com", - "tags" : [ "fips" ] + "hostname" : "servicediscovery.sa-east-1.api.aws", + "tags" : [ "dualstack" ] } ] }, - "servicediscovery-fips" : { - "credentialScope" : { - "region" : "ca-central-1" - }, - "deprecated" : true, - "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com" - }, "us-east-1" : { "variants" : [ { "hostname" : "servicediscovery-fips.us-east-1.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-east-1.amazonaws.com", + "hostname" : "servicediscovery-fips.us-east-1.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-east-1.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14449,7 +14845,10 @@ "hostname" : "servicediscovery-fips.us-east-2.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-east-2.amazonaws.com", + "hostname" : "servicediscovery-fips.us-east-2.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-east-2.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14465,7 +14864,10 @@ "hostname" : "servicediscovery-fips.us-west-1.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-west-1.amazonaws.com", + "hostname" : "servicediscovery-fips.us-west-1.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-west-1.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14481,7 +14883,10 @@ "hostname" : "servicediscovery-fips.us-west-2.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-west-2.amazonaws.com", + "hostname" : "servicediscovery-fips.us-west-2.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-west-2.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14692,41 +15097,6 @@ }, "sms" : { "endpoints" : { - "af-south-1" : { }, - "ap-east-1" : { }, - "ap-northeast-1" : { }, - "ap-northeast-2" : { }, - "ap-south-1" : { }, - "ap-southeast-1" : { }, - "ap-southeast-2" : { }, - "ca-central-1" : { }, - "eu-central-1" : { }, - "eu-north-1" : { }, - "eu-south-1" : { }, - "eu-west-1" : { }, - "eu-west-2" : { }, - "eu-west-3" : { }, - "fips-us-east-1" : { - "credentialScope" : { - "region" : "us-east-1" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-east-1.amazonaws.com" - }, - "fips-us-east-2" : { - "credentialScope" : { - "region" : "us-east-2" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-east-2.amazonaws.com" - }, - "fips-us-west-1" : { - "credentialScope" : { - "region" : "us-west-1" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-west-1.amazonaws.com" - }, "fips-us-west-2" : { "credentialScope" : { "region" : "us-west-2" @@ -14734,26 +15104,6 @@ "deprecated" : true, "hostname" : "sms-fips.us-west-2.amazonaws.com" }, - "me-south-1" : { }, - "sa-east-1" : { }, - "us-east-1" : { - "variants" : [ { - "hostname" : "sms-fips.us-east-1.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, - "us-east-2" : { - "variants" : [ { - "hostname" : "sms-fips.us-east-2.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, - "us-west-1" : { - "variants" : [ { - "hostname" : "sms-fips.us-west-1.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, "us-west-2" : { "variants" : [ { "hostname" : "sms-fips.us-west-2.amazonaws.com", @@ -15083,6 +15433,7 @@ "deprecated" : true, "hostname" : "sns-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15166,6 +15517,7 @@ "deprecated" : true, "hostname" : "sqs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15258,6 +15610,7 @@ "deprecated" : true, "hostname" : "ssm-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15287,7 +15640,7 @@ } } }, - "ssm-incidents" : { + "ssm-contacts" : { "endpoints" : { "ap-northeast-1" : { }, "ap-northeast-2" : { }, @@ -15300,11 +15653,139 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "fips-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-east-1.amazonaws.com" + }, + "fips-us-east-2" : { + "credentialScope" : { + "region" : "us-east-2" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-east-2.amazonaws.com" + }, + "fips-us-west-1" : { + "credentialScope" : { + "region" : "us-west-1" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-west-1.amazonaws.com" + }, + "fips-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-west-2.amazonaws.com" + }, "sa-east-1" : { }, - "us-east-1" : { }, - "us-east-2" : { }, - "us-west-1" : { }, - "us-west-2" : { } + "us-east-1" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-east-2" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-east-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-1" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-2" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + } + } + }, + "ssm-incidents" : { + "endpoints" : { + "ap-northeast-1" : { }, + "ap-northeast-2" : { }, + "ap-south-1" : { }, + "ap-southeast-1" : { }, + "ap-southeast-2" : { }, + "ca-central-1" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.ca-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "eu-central-1" : { }, + "eu-north-1" : { }, + "eu-west-1" : { }, + "eu-west-2" : { }, + "eu-west-3" : { }, + "fips-ca-central-1" : { + "credentialScope" : { + "region" : "ca-central-1" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.ca-central-1.amazonaws.com" + }, + "fips-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-east-1.amazonaws.com" + }, + "fips-us-east-2" : { + "credentialScope" : { + "region" : "us-east-2" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-east-2.amazonaws.com" + }, + "fips-us-west-1" : { + "credentialScope" : { + "region" : "us-west-1" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-west-1.amazonaws.com" + }, + "fips-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-west-2.amazonaws.com" + }, + "sa-east-1" : { }, + "us-east-1" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-east-2" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-east-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-1" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-2" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + } } }, "ssm-sap" : { @@ -15469,6 +15950,7 @@ "deprecated" : true, "hostname" : "states-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15532,13 +16014,6 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, - "fips" : { - "credentialScope" : { - "region" : "ca-central-1" - }, - "deprecated" : true, - "hostname" : "storagegateway-fips.ca-central-1.amazonaws.com" - }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15624,6 +16099,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "local" : { "credentialScope" : { "region" : "us-east-1" @@ -15668,6 +16144,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15794,6 +16271,7 @@ "deprecated" : true, "hostname" : "swf-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15873,6 +16351,7 @@ "deprecated" : true, "hostname" : "synthetics-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15924,6 +16403,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -16010,6 +16490,15 @@ } } }, + "tnb" : { + "endpoints" : { + "ap-southeast-2" : { }, + "eu-central-1" : { }, + "eu-west-3" : { }, + "us-east-1" : { }, + "us-west-2" : { } + } + }, "transcribe" : { "defaults" : { "protocols" : [ "https" ], @@ -16198,6 +16687,7 @@ "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { "variants" : [ { "hostname" : "transfer-fips.ca-central-1.amazonaws.com", @@ -16468,7 +16958,11 @@ "ap-northeast-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, + "eu-central-1" : { }, + "eu-north-1" : { }, "eu-west-1" : { }, + "eu-west-2" : { }, "us-east-1" : { }, "us-east-2" : { }, "us-west-2" : { } @@ -16860,6 +17354,7 @@ "credentialScope" : { "region" : "il-central-1" }, + "deprecated" : true, "hostname" : "waf-regional-fips.il-central-1.amazonaws.com" }, "fips-me-central-1" : { @@ -16911,6 +17406,16 @@ "deprecated" : true, "hostname" : "waf-regional-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "hostname" : "waf-regional.il-central-1.amazonaws.com", + "variants" : [ { + "hostname" : "waf-regional-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -17329,6 +17834,7 @@ "credentialScope" : { "region" : "il-central-1" }, + "deprecated" : true, "hostname" : "wafv2-fips.il-central-1.amazonaws.com" }, "fips-me-central-1" : { @@ -17380,6 +17886,16 @@ "deprecated" : true, "hostname" : "wafv2-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "hostname" : "wafv2.il-central-1.amazonaws.com", + "variants" : [ { + "hostname" : "wafv2-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -17653,6 +18169,7 @@ "deprecated" : true, "hostname" : "xray-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -17828,6 +18345,12 @@ "cn-northwest-1" : { } } }, + "arc-zonal-shift" : { + "endpoints" : { + "cn-north-1" : { }, + "cn-northwest-1" : { } + } + }, "athena" : { "endpoints" : { "cn-north-1" : { @@ -17868,6 +18391,12 @@ "cn-northwest-1" : { } } }, + "backupstorage" : { + "endpoints" : { + "cn-north-1" : { }, + "cn-northwest-1" : { } + } + }, "batch" : { "endpoints" : { "cn-north-1" : { }, @@ -18668,6 +19197,29 @@ } } }, + "savingsplans" : { + "endpoints" : { + "cn-north-1" : { + "credentialScope" : { + "region" : "cn-north-1" + }, + "hostname" : "savingsplans.cn-north-1.amazonaws.com.cn" + }, + "cn-northwest-1" : { + "credentialScope" : { + "region" : "cn-northwest-1" + }, + "hostname" : "savingsplans.cn-northwest-1.amazonaws.com.cn" + } + }, + "isRegionalized" : true + }, + "schemas" : { + "endpoints" : { + "cn-north-1" : { }, + "cn-northwest-1" : { } + } + }, "secretsmanager" : { "endpoints" : { "cn-north-1" : { }, @@ -18703,13 +19255,13 @@ "endpoints" : { "cn-north-1" : { "variants" : [ { - "hostname" : "servicediscovery.cn-north-1.amazonaws.com.cn", + "hostname" : "servicediscovery.cn-north-1.api.amazonwebservices.com.cn", "tags" : [ "dualstack" ] } ] }, "cn-northwest-1" : { "variants" : [ { - "hostname" : "servicediscovery.cn-northwest-1.amazonaws.com.cn", + "hostname" : "servicediscovery.cn-northwest-1.api.amazonwebservices.com.cn", "tags" : [ "dualstack" ] } ] } @@ -18732,8 +19284,7 @@ }, "sms" : { "endpoints" : { - "cn-north-1" : { }, - "cn-northwest-1" : { } + "cn-north-1" : { } } }, "snowball" : { @@ -19503,6 +20054,12 @@ "us-gov-west-1" : { } } }, + "backupstorage" : { + "endpoints" : { + "us-gov-east-1" : { }, + "us-gov-west-1" : { } + } + }, "batch" : { "defaults" : { "variants" : [ { @@ -19813,6 +20370,13 @@ }, "codepipeline" : { "endpoints" : { + "fips-us-gov-east-1" : { + "credentialScope" : { + "region" : "us-gov-east-1" + }, + "deprecated" : true, + "hostname" : "codepipeline-fips.us-gov-east-1.amazonaws.com" + }, "fips-us-gov-west-1" : { "credentialScope" : { "region" : "us-gov-west-1" @@ -19820,7 +20384,12 @@ "deprecated" : true, "hostname" : "codepipeline-fips.us-gov-west-1.amazonaws.com" }, - "us-gov-east-1" : { }, + "us-gov-east-1" : { + "variants" : [ { + "hostname" : "codepipeline-fips.us-gov-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "us-gov-west-1" : { "variants" : [ { "hostname" : "codepipeline-fips.us-gov-west-1.amazonaws.com", @@ -21083,8 +21652,32 @@ }, "inspector2" : { "endpoints" : { - "us-gov-east-1" : { }, - "us-gov-west-1" : { } + "fips-us-gov-east-1" : { + "credentialScope" : { + "region" : "us-gov-east-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-gov-east-1.amazonaws.com" + }, + "fips-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-gov-west-1.amazonaws.com" + }, + "us-gov-east-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-gov-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-gov-west-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-gov-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + } } }, "internetmonitor" : { @@ -21222,6 +21815,30 @@ }, "iottwinmaker" : { "endpoints" : { + "api-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "api.iottwinmaker.us-gov-west-1.amazonaws.com" + }, + "data-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "data.iottwinmaker.us-gov-west-1.amazonaws.com" + }, + "fips-api-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "api.iottwinmaker-fips.us-gov-west-1.amazonaws.com" + }, + "fips-data-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "data.iottwinmaker-fips.us-gov-west-1.amazonaws.com" + }, "fips-us-gov-west-1" : { "credentialScope" : { "region" : "us-gov-west-1" @@ -21487,6 +22104,12 @@ } } }, + "license-manager-linux-subscriptions" : { + "endpoints" : { + "us-gov-east-1" : { }, + "us-gov-west-1" : { } + } + }, "logs" : { "endpoints" : { "fips-us-gov-east-1" : { @@ -21760,6 +22383,17 @@ "credentialScope" : { "region" : "us-gov-west-1" }, + "hostname" : "networkmanager.us-gov-west-1.amazonaws.com", + "variants" : [ { + "hostname" : "networkmanager.us-gov-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "fips-aws-us-gov-global" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "deprecated" : true, "hostname" : "networkmanager.us-gov-west-1.amazonaws.com" } }, @@ -22544,6 +23178,9 @@ }, "us-gov-east-1" : { "variants" : [ { + "hostname" : "servicediscovery-fips.us-gov-east-1.amazonaws.com", + "tags" : [ "dualstack", "fips" ] + }, { "hostname" : "servicediscovery-fips.us-gov-east-1.amazonaws.com", "tags" : [ "fips" ] }, { @@ -22560,6 +23197,9 @@ }, "us-gov-west-1" : { "variants" : [ { + "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com", + "tags" : [ "dualstack", "fips" ] + }, { "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com", "tags" : [ "fips" ] }, { @@ -22621,13 +23261,6 @@ }, "sms" : { "endpoints" : { - "fips-us-gov-east-1" : { - "credentialScope" : { - "region" : "us-gov-east-1" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-gov-east-1.amazonaws.com" - }, "fips-us-gov-west-1" : { "credentialScope" : { "region" : "us-gov-west-1" @@ -22635,12 +23268,6 @@ "deprecated" : true, "hostname" : "sms-fips.us-gov-west-1.amazonaws.com" }, - "us-gov-east-1" : { - "variants" : [ { - "hostname" : "sms-fips.us-gov-east-1.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, "us-gov-west-1" : { "variants" : [ { "hostname" : "sms-fips.us-gov-west-1.amazonaws.com", @@ -23746,11 +24373,24 @@ "deprecated" : true, "hostname" : "rbin-fips.us-iso-east-1.c2s.ic.gov" }, + "fips-us-iso-west-1" : { + "credentialScope" : { + "region" : "us-iso-west-1" + }, + "deprecated" : true, + "hostname" : "rbin-fips.us-iso-west-1.c2s.ic.gov" + }, "us-iso-east-1" : { "variants" : [ { "hostname" : "rbin-fips.us-iso-east-1.c2s.ic.gov", "tags" : [ "fips" ] } ] + }, + "us-iso-west-1" : { + "variants" : [ { + "hostname" : "rbin-fips.us-iso-west-1.c2s.ic.gov", + "tags" : [ "fips" ] + } ] } } }, diff --git a/aws/sdk/aws-models/sts.json b/aws/sdk/aws-models/sts.json index ddc251e8fad..2942ae47f13 100644 --- a/aws/sdk/aws-models/sts.json +++ b/aws/sdk/aws-models/sts.json @@ -1701,9 +1701,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1733,9 +1733,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1765,9 +1765,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1797,9 +1797,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1829,9 +1829,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1861,9 +1861,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1893,9 +1893,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1925,9 +1925,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1957,9 +1957,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -1989,9 +1989,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2021,9 +2021,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2053,9 +2053,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2085,9 +2085,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2117,9 +2117,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2149,9 +2149,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2181,9 +2181,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-1" } ] }, @@ -2213,9 +2213,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-3", "signingName": "sts", - "name": "sigv4" + "name": "sigv4", + "signingRegion": "us-east-3" } ] }, @@ -2305,7 +2305,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy\n that allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy that\n allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

" } }, "com.amazonaws.sts#AssumeRoleRequest": { @@ -2378,6 +2378,12 @@ "traits": { "smithy.api#documentation": "

The source identity specified by the principal that is calling the\n AssumeRole operation.

\n

You can require users to specify a source identity when they assume a role. You do this\n by using the sts:SourceIdentity condition key in a role trust policy. You can\n use source identity information in CloudTrail logs to determine who took actions with a role.\n You can use the aws:SourceIdentity condition key to further control access to\n Amazon Web Services resources based on the value of source identity. For more information about using\n source identity, see Monitor and control\n actions taken with assumed roles in the\n IAM User Guide.

\n

The regex used to validate this parameter is a string of characters consisting of upper-\n and lower-case alphanumeric characters with no spaces. You can also include underscores or\n any of the following characters: =,.@-. You cannot use a value that begins with the text\n aws:. This prefix is reserved for Amazon Web Services internal use.

" } + }, + "ProvidedContexts": { + "target": "com.amazonaws.sts#ProvidedContextsListType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } } }, "traits": { @@ -2591,7 +2597,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity pools in\n Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity\n pools in Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n " } }, "com.amazonaws.sts#AssumeRoleWithWebIdentityRequest": { @@ -2614,7 +2620,7 @@ "WebIdentityToken": { "target": "com.amazonaws.sts#clientTokenType", "traits": { - "smithy.api#documentation": "

The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\n provider. Your application must get this token by authenticating the user who is using your\n application with a web identity provider before the application makes an\n AssumeRoleWithWebIdentity call.

", + "smithy.api#documentation": "

The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\n provider. Your application must get this token by authenticating the user who is using your\n application with a web identity provider before the application makes an\n AssumeRoleWithWebIdentity call. Only tokens with RSA algorithms (RS256) are\n supported.

", "smithy.api#required": {} } }, @@ -2854,7 +2860,7 @@ "target": "com.amazonaws.sts#GetAccessKeyInfoResponse" }, "traits": { - "smithy.api#documentation": "

Returns the account identifier for the specified access key ID.

\n

Access keys consist of two parts: an access key ID (for example,\n AKIAIOSFODNN7EXAMPLE) and a secret access key (for example,\n wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For more information about\n access keys, see Managing Access Keys for IAM\n Users in the IAM User Guide.

\n

When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\n to which the keys belong. Access key IDs beginning with AKIA are long-term\n credentials for an IAM user or the Amazon Web Services account root user. Access key IDs beginning with\n ASIA are temporary credentials that are created using STS operations. If\n the account in the response belongs to you, you can sign in as the root user and review\n your root user access keys. Then, you can pull a credentials report to\n learn which IAM user owns the keys. To learn who requested the temporary credentials for\n an ASIA access key, view the STS events in your CloudTrail logs in the\n IAM User Guide.

\n

This operation does not indicate the state of the access key. The key might be active,\n inactive, or deleted. Active keys might not have permissions to perform an operation.\n Providing a deleted access key might return an error that the key doesn't exist.

" + "smithy.api#documentation": "

Returns the account identifier for the specified access key ID.

\n

Access keys consist of two parts: an access key ID (for example,\n AKIAIOSFODNN7EXAMPLE) and a secret access key (for example,\n wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For more information about\n access keys, see Managing Access Keys for IAM\n Users in the IAM User Guide.

\n

When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\n to which the keys belong. Access key IDs beginning with AKIA are long-term\n credentials for an IAM user or the Amazon Web Services account root user. Access key IDs\n beginning with ASIA are temporary credentials that are created using STS\n operations. If the account in the response belongs to you, you can sign in as the root user and review your root user access keys. Then, you can pull a credentials\n report to learn which IAM user owns the keys. To learn who\n requested the temporary credentials for an ASIA access key, view the STS\n events in your CloudTrail logs in the IAM User Guide.

\n

This operation does not indicate the state of the access key. The key might be active,\n inactive, or deleted. Active keys might not have permissions to perform an operation.\n Providing a deleted access key might return an error that the key doesn't exist.

" } }, "com.amazonaws.sts#GetAccessKeyInfoRequest": { @@ -2895,7 +2901,7 @@ "target": "com.amazonaws.sts#GetCallerIdentityResponse" }, "traits": { - "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to call the operation.

\n \n

No permissions are required to perform this operation. If an administrator\n attaches a policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to\n call the operation.

\n \n

No permissions are required to perform this operation. If an administrator attaches a\n policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is\n denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
" } }, "com.amazonaws.sts#GetCallerIdentityRequest": { @@ -2952,7 +2958,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation\n using the long-term security credentials of an IAM user. As a result, this call is\n appropriate in contexts where those credentials can be safeguarded, usually in a\n server-based application. For a comparison of GetFederationToken with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security credentials of an\n Amazon Web Services account root user rather than an IAM user that you create for the purpose of a proxy application, we do not recommend it. For more information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the session\n policies that you pass. This gives you a way to further restrict the permissions for a\n federated user. You cannot use session policies to grant more permissions than those that\n are defined in the permissions policy of the IAM user. For more information, see Session\n Policies in the IAM User Guide. For information about\n using GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation using the long-term security\n credentials of an IAM user. As a result, this call is appropriate in\n contexts where those credentials can be safeguarded, usually in a server-based application.\n For a comparison of GetFederationToken with the other API operations that\n produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user that you\n create for the purpose of a proxy application, we do not recommend it. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user\n credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This\n limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the\n session policies that you pass. This gives you a way to further restrict the permissions\n for a federated user. You cannot use session policies to grant more permissions than those\n that are defined in the permissions policy of the IAM user. For more\n information, see Session Policies in\n the IAM User Guide. For information about using\n GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

" } }, "com.amazonaws.sts#GetFederationTokenRequest": { @@ -2968,19 +2974,19 @@ "Policy": { "target": "com.amazonaws.sts#sessionPolicyDocumentType", "traits": { - "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you a way to further\n restrict the permissions for a federated user. You cannot use session policies to grant\n more permissions than those that are defined in the permissions policy of the IAM user.\n For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" + "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you\n a way to further restrict the permissions for a federated user. You cannot use session\n policies to grant more permissions than those that are defined in the permissions policy of\n the IAM user. For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } }, "PolicyArns": { "target": "com.amazonaws.sts#policyDescriptorListType", "traits": { - "smithy.api#documentation": "

The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\n managed session policy. The policies must exist in the same account as the IAM user that\n is requesting federated access.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\n more information about ARNs, see Amazon Resource Names (ARNs) and Amazon Web Services\n Service Namespaces in the Amazon Web Services General Reference.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you a way to further\n restrict the permissions for a federated user. You cannot use session policies to grant\n more permissions than those that are defined in the permissions policy of the IAM user.\n For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" + "smithy.api#documentation": "

The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\n managed session policy. The policies must exist in the same account as the IAM user that is requesting federated access.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\n more information about ARNs, see Amazon Resource Names (ARNs) and Amazon Web Services\n Service Namespaces in the Amazon Web Services General Reference.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you\n a way to further restrict the permissions for a federated user. You cannot use session\n policies to grant more permissions than those that are defined in the permissions policy of\n the IAM user. For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } }, "DurationSeconds": { "target": "com.amazonaws.sts#durationSecondsType", "traits": { - "smithy.api#documentation": "

The duration, in seconds, that the session should last. Acceptable durations for\n federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\n 43,200 seconds (12 hours) as the default. Sessions obtained using root user\n credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\n duration is longer than one hour, the session obtained by using root user credentials\n defaults to one hour.

" + "smithy.api#documentation": "

The duration, in seconds, that the session should last. Acceptable durations for\n federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\n 43,200 seconds (12 hours) as the default. Sessions obtained using root user\n credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\n duration is longer than one hour, the session obtained by using root user\n credentials defaults to one hour.

" } }, "Tags": { @@ -3035,7 +3041,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user. The\n credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2 StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit an MFA\n code that is associated with their MFA device. Using the temporary security credentials\n that the call returns, IAM users can then make programmatic calls to API\n operations that require MFA authentication. An incorrect MFA code causes the API to return an access denied error. For a comparison of GetSessionToken\n with the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are\n created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on\n permissions associated with the IAM user whose credentials were used to call the operation. The\n temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security credentials of an\n Amazon Web Services account root user rather than an IAM user, we do not recommend it. If\n GetSessionToken is called using root user credentials, the\n temporary credentials have root user permissions. For more information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

" + "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user.\n The credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2\n StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit\n an MFA code that is associated with their MFA device. Using the temporary security\n credentials that the call returns, IAM users can then make programmatic\n calls to API operations that require MFA authentication. An incorrect MFA code causes the\n API to return an access denied error. For a comparison of GetSessionToken with\n the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on permissions\n associated with the IAM user whose credentials were used to call the\n operation. The temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user, we do\n not recommend it. If GetSessionToken is called using root user\n credentials, the temporary credentials have root user permissions. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

" } }, "com.amazonaws.sts#GetSessionTokenRequest": { @@ -3044,19 +3050,19 @@ "DurationSeconds": { "target": "com.amazonaws.sts#durationSecondsType", "traits": { - "smithy.api#documentation": "

The duration, in seconds, that the credentials should remain valid. Acceptable durations\n for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours),\n with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account owners are\n restricted to a maximum of 3,600 seconds (one hour). If the duration is longer than one\n hour, the session for Amazon Web Services account owners defaults to one hour.

" + "smithy.api#documentation": "

The duration, in seconds, that the credentials should remain valid. Acceptable durations\n for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds\n (36 hours), with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account\n owners are restricted to a maximum of 3,600 seconds (one hour). If the duration is longer\n than one hour, the session for Amazon Web Services account owners defaults to one hour.

" } }, "SerialNumber": { "target": "com.amazonaws.sts#serialNumberType", "traits": { - "smithy.api#documentation": "

The identification number of the MFA device that is associated with the IAM user who\n is making the GetSessionToken call. Specify this value if the IAM user has a\n policy that requires MFA authentication. The value is either the serial number for a\n hardware device (such as GAHT12345678) or an Amazon Resource Name (ARN) for a\n virtual device (such as arn:aws:iam::123456789012:mfa/user). You can find the\n device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security\n credentials.

\n

The regex used to validate this parameter is a string of \n characters consisting of upper- and lower-case alphanumeric characters with no spaces. \n You can also include underscores or any of the following characters: =,.@:/-

" + "smithy.api#documentation": "

The identification number of the MFA device that is associated with the IAM user who is making the GetSessionToken call. Specify this value\n if the IAM user has a policy that requires MFA authentication. The value is\n either the serial number for a hardware device (such as GAHT12345678) or an\n Amazon Resource Name (ARN) for a virtual device (such as\n arn:aws:iam::123456789012:mfa/user). You can find the device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security credentials.

\n

The regex used to validate this parameter is a string of \n characters consisting of upper- and lower-case alphanumeric characters with no spaces. \n You can also include underscores or any of the following characters: =,.@:/-

" } }, "TokenCode": { "target": "com.amazonaws.sts#tokenCodeType", "traits": { - "smithy.api#documentation": "

The value provided by the MFA device, if MFA is required. If any policy requires the\n IAM user to submit an MFA code, specify this value. If MFA authentication is required,\n the user must provide a code when requesting a set of temporary security credentials. A\n user who fails to provide the code receives an \"access denied\" response when requesting\n resources that require MFA authentication.

\n

The format for this parameter, as described by its regex pattern, is a sequence of six\n numeric digits.

" + "smithy.api#documentation": "

The value provided by the MFA device, if MFA is required. If any policy requires the\n IAM user to submit an MFA code, specify this value. If MFA authentication\n is required, the user must provide a code when requesting a set of temporary security\n credentials. A user who fails to provide the code receives an \"access denied\" response when\n requesting resources that require MFA authentication.

\n

The format for this parameter, as described by its regex pattern, is a sequence of six\n numeric digits.

" } } }, @@ -3201,6 +3207,38 @@ "smithy.api#documentation": "

A reference to the IAM managed policy that is passed as a session policy for a role\n session or a federated user session.

" } }, + "com.amazonaws.sts#ProvidedContext": { + "type": "structure", + "members": { + "ProviderArn": { + "target": "com.amazonaws.sts#arnType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + }, + "ContextAssertion": { + "target": "com.amazonaws.sts#contextAssertionType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + }, + "com.amazonaws.sts#ProvidedContextsListType": { + "type": "list", + "member": { + "target": "com.amazonaws.sts#ProvidedContext" + }, + "traits": { + "smithy.api#length": { + "min": 0, + "max": 5 + } + } + }, "com.amazonaws.sts#RegionDisabledException": { "type": "structure", "members": { @@ -3305,6 +3343,15 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.sts#contextAssertionType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 4, + "max": 2048 + } + } + }, "com.amazonaws.sts#dateType": { "type": "timestamp" }, From 39c6476f31c2c20dce220556ac449afcc8212f85 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Fri, 18 Aug 2023 09:51:03 -0500 Subject: [PATCH 075/331] Use `Identity` instead of `Credentials` in signing code (#2913) This PR replaces the access_key, secret_key, and session token fields of signing params with the Orchestrator's `Identity` type. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 9 ++ .../aws-credential-types/Cargo.toml | 4 +- .../src/credentials_impl.rs | 46 +++++--- .../tests/middleware_e2e_test.rs | 5 +- .../aws-runtime/src/auth/sigv4.rs | 61 ++++++----- aws/rust-runtime/aws-sig-auth/Cargo.toml | 1 + .../aws-sig-auth/external-types.toml | 1 + .../aws-sig-auth/src/event_stream.rs | 28 +++-- aws/rust-runtime/aws-sig-auth/src/lib.rs | 15 +-- .../aws-sig-auth/src/middleware.rs | 23 ++-- aws/rust-runtime/aws-sig-auth/src/signer.rs | 29 +++-- aws/rust-runtime/aws-sigv4/Cargo.toml | 4 + .../double-encode-path.sreq | 2 +- .../get-vanilla-query-order-key-case.qpsreq | 2 +- .../get-vanilla-query-order-key-case.sreq | 2 +- .../aws-sigv4/external-types.toml | 1 + .../aws-sigv4/src/event_stream.rs | 30 ++++-- .../{http_request/mod.rs => http_request.rs} | 12 ++- .../src/http_request/canonical_request.rs | 65 ++++++----- .../aws-sigv4/src/http_request/error.rs | 24 +++++ .../aws-sigv4/src/http_request/sign.rs | 101 +++++++++--------- aws/rust-runtime/aws-sigv4/src/lib.rs | 75 ++++--------- .../kms/tests/integration.rs | 4 +- .../polly/tests/presigning.rs | 2 +- .../qldbsession/tests/integration.rs | 2 +- .../s3/tests/customizable-operation.rs | 4 +- .../s3/tests/ignore-invalid-xml-body-root.rs | 4 +- .../s3/tests/naughty-string-metadata.rs | 4 +- .../s3/tests/normalize-uri-path.rs | 4 +- .../integration-tests/s3/tests/presigning.rs | 2 +- .../query-strings-are-correctly-encoded.rs | 4 +- .../s3/tests/request_information_headers.rs | 2 +- .../integration-tests/s3/tests/signing-it.rs | 4 +- .../s3control/tests/signing-it.rs | 4 +- .../timestreamquery/tests/endpoint_disco.rs | 4 +- 35 files changed, 332 insertions(+), 252 deletions(-) rename aws/rust-runtime/aws-sigv4/src/{http_request/mod.rs => http_request.rs} (85%) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 1258e603828..e6887075b2d 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -51,3 +51,12 @@ message = "In sigV4-related code, rename 'signing service' to 'signing name'. Th references = ["smithy-rs#2911"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "Velfi" + +[[aws-sdk-rust]] +message = """ +All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html) +as opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868). +""" +references = ["smithy-rs#2913"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "Velfi" diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index e109667525a..073aede5e72 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -14,6 +14,7 @@ test-util = [] [dependencies] aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } fastrand = "2.0.0" tokio = { version = "1.23.1", features = ["sync"] } tracing = "0.1" @@ -28,9 +29,6 @@ env_logger = "0.9.0" tokio = { version = "1.23.1", features = ["full", "test-util", "rt"] } tracing-test = "0.2.4" -# TODO(https://github.com/awslabs/smithy-rs/issues/2619): Remove this -# workaround once the fixed is upstreamed. -regex = { version = "1.0", features = ["unicode-case", "unicode-perl"] } [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs b/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs index c310c514604..5dbc14b4d3c 100644 --- a/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs +++ b/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs @@ -10,6 +10,8 @@ use std::sync::Arc; use std::time::{SystemTime, UNIX_EPOCH}; use zeroize::Zeroizing; +use aws_smithy_runtime_api::client::identity::Identity; + /// AWS SDK Credentials /// /// An opaque struct representing credentials that may be used in an AWS SDK, modeled on @@ -140,18 +142,6 @@ impl Credentials { ) } - /// Creates a test `Credentials`. - #[cfg(feature = "test-util")] - pub fn for_tests() -> Self { - Self::new( - "ANOTREAL", - "notrealrnrELgWzOk3IfjzDKtFBhDby", - Some("notarealsessiontoken".to_string()), - None, - "test", - ) - } - /// Returns the access key ID. pub fn access_key_id(&self) -> &str { &self.0.access_key_id @@ -178,6 +168,38 @@ impl Credentials { } } +#[cfg(feature = "test-util")] +impl Credentials { + /// Creates a test `Credentials` with no session token. + pub fn for_tests() -> Self { + Self::new( + "ANOTREAL", + "notrealrnrELgWzOk3IfjzDKtFBhDby", + None, + None, + "test", + ) + } + + /// Creates a test `Credentials` that include a session token. + pub fn for_tests_with_session_token() -> Self { + Self::new( + "ANOTREAL", + "notrealrnrELgWzOk3IfjzDKtFBhDby", + Some("notarealsessiontoken".to_string()), + None, + "test", + ) + } +} + +impl From for Identity { + fn from(val: Credentials) -> Self { + let expiry = val.expiry(); + Identity::new(val, expiry) + } +} + #[cfg(test)] mod test { use crate::Credentials; diff --git a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs b/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs index 6ce11b14dbb..1c8f0349f2a 100644 --- a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs +++ b/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs @@ -89,8 +89,9 @@ fn test_operation() -> Operation( settings: SigningSettings, - credentials: &'a Credentials, + identity: &'a Identity, operation_config: &'a SigV4OperationSigningConfig, request_timestamp: SystemTime, ) -> Result, SigV4SigningError> { + let creds = identity + .data::() + .ok_or_else(|| SigV4SigningError::WrongIdentityType(identity.clone()))?; + if let Some(expires_in) = settings.expires_in { - if let Some(creds_expires_time) = credentials.expiry() { + if let Some(creds_expires_time) = creds.expiry() { let presigned_expires_time = request_timestamp + expires_in; if presigned_expires_time > creds_expires_time { tracing::warn!(EXPIRATION_WARNING); @@ -230,9 +234,8 @@ impl SigV4Signer { } } - let mut builder = SigningParams::builder() - .access_key(credentials.access_key_id()) - .secret_key(credentials.secret_access_key()) + let builder = SigningParams::builder() + .identity(identity) .region( operation_config .region @@ -249,7 +252,6 @@ impl SigV4Signer { ) .time(request_timestamp) .settings(settings); - builder.set_security_token(credentials.session_token()); Ok(builder.build().expect("all required fields set")) } @@ -324,18 +326,18 @@ impl Signer for SigV4Signer { Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?; let request_time = runtime_components.time_source().unwrap_or_default().now(); - let credentials = if let Some(creds) = identity.data::() { - creds - } else if operation_config.signing_options.signing_optional { - tracing::debug!("skipped SigV4 signing since signing is optional for this operation and there are no credentials"); - return Ok(()); - } else { - return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); + if identity.data::().is_none() { + if operation_config.signing_options.signing_optional { + tracing::debug!("skipped SigV4 signing since signing is optional for this operation and there are no credentials"); + return Ok(()); + } else { + return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); + } }; let settings = Self::settings(&operation_config); let signing_params = - Self::signing_params(settings, credentials, &operation_config, request_time)?; + Self::signing_params(settings, identity, &operation_config, request_time)?; let (signing_instructions, _signature) = { // A body that is already in memory can be signed directly. A body that is not in memory @@ -382,7 +384,7 @@ impl Signer for SigV4Signer { signer_sender .send(Box::new(SigV4MessageSigner::new( _signature, - credentials.clone(), + identity.clone(), Region::new(signing_params.region().to_string()).into(), signing_params.name().to_string().into(), time_source, @@ -397,11 +399,11 @@ impl Signer for SigV4Signer { #[cfg(feature = "event-stream")] mod event_stream { - use aws_credential_types::Credentials; use aws_sigv4::event_stream::{sign_empty_message, sign_message}; use aws_sigv4::SigningParams; use aws_smithy_async::time::SharedTimeSource; use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; + use aws_smithy_runtime_api::client::identity::Identity; use aws_types::region::SigningRegion; use aws_types::SigningName; @@ -409,7 +411,7 @@ mod event_stream { #[derive(Debug)] pub(super) struct SigV4MessageSigner { last_signature: String, - credentials: Credentials, + identity: Identity, signing_region: SigningRegion, signing_name: SigningName, time: SharedTimeSource, @@ -418,14 +420,14 @@ mod event_stream { impl SigV4MessageSigner { pub(super) fn new( last_signature: String, - credentials: Credentials, + identity: Identity, signing_region: SigningRegion, signing_name: SigningName, time: SharedTimeSource, ) -> Self { Self { last_signature, - credentials, + identity, signing_region, signing_name, time, @@ -433,14 +435,12 @@ mod event_stream { } fn signing_params(&self) -> SigningParams<'_, ()> { - let mut builder = SigningParams::builder() - .access_key(self.credentials.access_key_id()) - .secret_key(self.credentials.secret_access_key()) + let builder = SigningParams::builder() + .identity(&self.identity) .region(self.signing_region.as_ref()) .name(self.signing_name.as_ref()) .time(self.time.now()) .settings(()); - builder.set_security_token(self.credentials.session_token()); builder.build().unwrap() } } @@ -467,9 +467,11 @@ mod event_stream { #[cfg(test)] mod tests { - use super::*; + use crate::auth::sigv4::event_stream::SigV4MessageSigner; use aws_credential_types::Credentials; + use aws_smithy_async::time::SharedTimeSource; use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; + use aws_types::region::Region; use aws_types::region::SigningRegion; use aws_types::SigningName; @@ -484,7 +486,7 @@ mod event_stream { let region = Region::new("us-east-1"); let mut signer = check_send_sync(SigV4MessageSigner::new( "initial-signature".into(), - Credentials::for_tests(), + Credentials::for_tests_with_session_token().into(), SigningRegion::from(region), SigningName::from_static("transcribe"), SharedTimeSource::new(UNIX_EPOCH + Duration::new(1611160427, 0)), @@ -534,13 +536,14 @@ mod tests { let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); - let credentials = Credentials::new( + let identity = Credentials::new( "test-access-key", "test-secret-key", Some("test-session-token".into()), Some(now + creds_expire_in), "test", - ); + ) + .into(); let operation_config = SigV4OperationSigningConfig { region: Some(SigningRegion::from_static("test")), service: Some(SigningName::from_static("test")), @@ -555,13 +558,13 @@ mod tests { payload_override: None, }, }; - SigV4Signer::signing_params(settings, &credentials, &operation_config, now).unwrap(); + SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap(); assert!(!logs_contain(EXPIRATION_WARNING)); let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); - SigV4Signer::signing_params(settings, &credentials, &operation_config, now).unwrap(); + SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap(); assert!(logs_contain(EXPIRATION_WARNING)); } diff --git a/aws/rust-runtime/aws-sig-auth/Cargo.toml b/aws/rust-runtime/aws-sig-auth/Cargo.toml index c5192d8aa8b..db5f4e39651 100644 --- a/aws/rust-runtime/aws-sig-auth/Cargo.toml +++ b/aws/rust-runtime/aws-sig-auth/Cargo.toml @@ -17,6 +17,7 @@ aws-sigv4 = { path = "../aws-sigv4", features = ["http0-compat"] } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } aws-types = { path = "../aws-types" } http = "0.2.2" tracing = "0.1" diff --git a/aws/rust-runtime/aws-sig-auth/external-types.toml b/aws/rust-runtime/aws-sig-auth/external-types.toml index 46ed02af47e..b348644ac6e 100644 --- a/aws/rust-runtime/aws-sig-auth/external-types.toml +++ b/aws/rust-runtime/aws-sig-auth/external-types.toml @@ -5,6 +5,7 @@ allowed_external_types = [ "aws_smithy_http::*", "aws_types::*", "http::request::Request", + "aws_smithy_runtime_api::client::identity::Identity", # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::frame::SignMessage", diff --git a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs index 9ffddafc2d6..3c3d5ed2dcf 100644 --- a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs +++ b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs @@ -8,11 +8,11 @@ #![allow(clippy::disallowed_methods)] use crate::middleware::Signature; -use aws_credential_types::Credentials; use aws_sigv4::event_stream::{sign_empty_message, sign_message}; use aws_sigv4::SigningParams; use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; use aws_smithy_http::property_bag::{PropertyBag, SharedPropertyBag}; +use aws_smithy_runtime_api::client::identity::Identity; use aws_types::region::SigningRegion; use aws_types::SigningName; use std::time::SystemTime; @@ -21,7 +21,7 @@ use std::time::SystemTime; #[derive(Debug)] pub struct SigV4MessageSigner { last_signature: String, - credentials: Credentials, + identity: Identity, signing_region: SigningRegion, signing_name: SigningName, time: Option, @@ -30,14 +30,14 @@ pub struct SigV4MessageSigner { impl SigV4MessageSigner { pub fn new( last_signature: String, - credentials: Credentials, + identity: Identity, signing_region: SigningRegion, signing_name: SigningName, time: Option, ) -> Self { Self { last_signature, - credentials, + identity, signing_region, signing_name, time, @@ -45,14 +45,12 @@ impl SigV4MessageSigner { } fn signing_params(&self) -> SigningParams<()> { - let mut builder = SigningParams::builder() - .access_key(self.credentials.access_key_id()) - .secret_key(self.credentials.secret_access_key()) + let builder = SigningParams::builder() + .identity(&self.identity) .region(self.signing_region.as_ref()) .name(self.signing_name.as_ref()) .time(self.time.unwrap_or_else(SystemTime::now)) .settings(()); - builder.set_security_token(self.credentials.session_token()); builder.build().unwrap() } } @@ -82,6 +80,7 @@ mod tests { use crate::event_stream::SigV4MessageSigner; use aws_credential_types::Credentials; use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; + use aws_types::region::Region; use aws_types::region::SigningRegion; use aws_types::SigningName; @@ -96,7 +95,7 @@ mod tests { let region = Region::new("us-east-1"); let mut signer = check_send_sync(SigV4MessageSigner::new( "initial-signature".into(), - Credentials::for_tests(), + Credentials::for_tests_with_session_token().into(), SigningRegion::from(region), SigningName::from_static("transcribe"), Some(UNIX_EPOCH + Duration::new(1611160427, 0)), @@ -144,21 +143,19 @@ impl SigV4Signer { fn signing_params(properties: &PropertyBag) -> SigningParams<()> { // Every single one of these values would have been retrieved during the initial request, // so we can safely assume they all exist in the property bag at this point. - let credentials = properties.get::().unwrap(); + let identity = properties.get::().unwrap(); let region = properties.get::().unwrap(); let name = properties.get::().unwrap(); let time = properties .get::() .copied() .unwrap_or_else(SystemTime::now); - let mut builder = SigningParams::builder() - .access_key(credentials.access_key_id()) - .secret_key(credentials.secret_access_key()) + let builder = SigningParams::builder() + .identity(identity) .region(region.as_ref()) .name(name.as_ref()) .time(time) .settings(()); - builder.set_security_token(credentials.session_token()); builder.build().unwrap() } } @@ -208,6 +205,7 @@ mod old_tests { use aws_credential_types::Credentials; use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; use aws_smithy_http::property_bag::PropertyBag; + use aws_smithy_runtime_api::client::identity::Identity; use aws_types::region::Region; use aws_types::region::SigningRegion; use aws_types::SigningName; @@ -219,8 +217,8 @@ mod old_tests { let mut properties = PropertyBag::new(); properties.insert(region.clone()); properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); + properties.insert::(Credentials::for_tests_with_session_token().into()); properties.insert(SigningName::from_static("transcribe")); - properties.insert(Credentials::for_tests()); properties.insert(SigningRegion::from(region)); properties.insert(Signature::new("initial-signature".into())); diff --git a/aws/rust-runtime/aws-sig-auth/src/lib.rs b/aws/rust-runtime/aws-sig-auth/src/lib.rs index c6380992d65..163a881a994 100644 --- a/aws/rust-runtime/aws-sig-auth/src/lib.rs +++ b/aws/rust-runtime/aws-sig-auth/src/lib.rs @@ -22,13 +22,14 @@ //! use aws_types::region::{Region, SigningRegion}; //! use std::time::{Duration, SystemTime, UNIX_EPOCH}; //! use aws_sig_auth::signer::{self, SigningError, OperationSigningConfig, HttpSignatureType, RequestConfig}; +//! use aws_smithy_runtime_api::client::identity::Identity; //! //! fn generate_rds_iam_token( //! db_hostname: &str, //! region: Region, //! port: u16, //! db_username: &str, -//! credentials: &Credentials, +//! identity: &Identity, //! timestamp: SystemTime, //! ) -> Result { //! let signer = signer::SigV4Signer::new(); @@ -53,7 +54,7 @@ //! let _signature = signer.sign( //! &operation_config, //! &request_config, -//! &credentials, +//! identity, //! &mut request, //! )?; //! let mut uri = request.uri().to_string(); @@ -62,14 +63,14 @@ //! Ok(uri) //! } //! -//! // You will need to get `credentials` from a credentials provider ahead of time -//! # let credentials = Credentials::new("AKIDEXAMPLE", "secret", None, None, "example"); +//! // You will need to get an `identity` from a credentials provider ahead of time +//! # let identity = Credentials::new("AKIDEXAMPLE", "secret", None, None, "example").into(); //! let token = generate_rds_iam_token( //! "prod-instance.us-east-1.rds.amazonaws.com", //! Region::from_static("us-east-1"), //! 3306, //! "dbuser", -//! &credentials, +//! &identity, //! // this value is hard coded to create deterministic signature for tests. Generally, //! // `SystemTime::now()` should be used //! UNIX_EPOCH + Duration::from_secs(1635257380) @@ -88,6 +89,7 @@ //! use aws_types::SigningName; //! use std::error::Error; //! use std::time::SystemTime; +//! use aws_smithy_runtime_api::client::identity::Identity; //! async fn sign_request( //! mut request: &mut http::Request, //! region: Region, @@ -101,10 +103,11 @@ //! name: &SigningName::from_static("execute-api"), //! payload_override: None, //! }; +//! let identity = credentials_provider.provide_credentials().await?.into(); //! signer.sign( //! &OperationSigningConfig::default_config(), //! &request_config, -//! &credentials_provider.provide_credentials().await?, +//! &identity, //! &mut request, //! )?; //! Ok((())) diff --git a/aws/rust-runtime/aws-sig-auth/src/middleware.rs b/aws/rust-runtime/aws-sig-auth/src/middleware.rs index efa0543e3c5..3d4e788e37c 100644 --- a/aws/rust-runtime/aws-sig-auth/src/middleware.rs +++ b/aws/rust-runtime/aws-sig-auth/src/middleware.rs @@ -49,10 +49,10 @@ impl AsRef for Signature { /// a signature. /// /// Prior to signing, the following fields MUST be present in the property bag: -/// - [`SigningRegion`](SigningRegion): The region used when signing the request, e.g. `us-east-1` -/// - [`SigningName`](SigningName): The name of the service to use when signing the request, e.g. `dynamodb` -/// - [`Credentials`](Credentials): Credentials to sign with -/// - [`OperationSigningConfig`](OperationSigningConfig): Operation specific signing configuration, e.g. +/// - [`SigningRegion`]: The region used when signing the request, e.g. `us-east-1` +/// - [`SigningName`]: The name of the service to use when signing the request, e.g. `dynamodb` +/// - [`Credentials`]: Credentials to sign with +/// - [`OperationSigningConfig`]: Operation specific signing configuration, e.g. /// changes to URL encoding behavior, or headers that must be omitted. /// - [`SharedTimeSource`]: The time source to use when signing the request. /// If any of these fields are missing, the middleware will return an error. @@ -180,10 +180,11 @@ impl MapRequest for SigV4SigningStage { }, SigningRequirements::Required => signing_config(config)?, }; + let identity = creds.into(); let signature = self .signer - .sign(operation_config, &request_config, &creds, &mut req) + .sign(operation_config, &request_config, &identity, &mut req) .map_err(SigningStageErrorKind::SigningFailure)?; // If this is an event stream operation, set up the event stream signer @@ -193,7 +194,7 @@ impl MapRequest for SigV4SigningStage { signer_sender .send(Box::new(EventStreamSigV4Signer::new( signature.as_ref().into(), - creds, + identity, request_config.region.clone(), request_config.name.clone(), time_override, @@ -220,6 +221,7 @@ mod test { use aws_credential_types::Credentials; use aws_endpoint::AwsAuthStage; use aws_smithy_async::time::SharedTimeSource; + use aws_types::region::{Region, SigningRegion}; use aws_types::SigningName; @@ -241,7 +243,7 @@ mod test { properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); properties.insert(SigningName::from_static("kinesis")); properties.insert(OperationSigningConfig::default_config()); - properties.insert(Credentials::for_tests()); + properties.insert(Credentials::for_tests_with_session_token()); properties.insert(SigningRegion::from(region)); Result::<_, Infallible>::Ok(req) }) @@ -275,7 +277,7 @@ mod test { )); properties.insert(SigningName::from_static("kinesis")); properties.insert(OperationSigningConfig::default_config()); - properties.insert(Credentials::for_tests()); + properties.insert(Credentials::for_tests_with_session_token()); properties.insert(SigningRegion::from(region.clone())); properties.insert(deferred_signer_sender); Result::<_, Infallible>::Ok(req) @@ -288,7 +290,7 @@ mod test { let mut signer_for_comparison = EventStreamSigV4Signer::new( // This is the expected SigV4 signature for the HTTP request above "abac477b4afabf5651079e7b9a0aa6a1a3e356a7418a81d974cdae9d4c8e5441".into(), - Credentials::for_tests(), + Credentials::for_tests_with_session_token().into(), SigningRegion::from(region), SigningName::from_static("kinesis"), Some(UNIX_EPOCH + Duration::new(1611160427, 0)), @@ -337,7 +339,8 @@ mod test { .apply(req.try_clone().expect("can clone")) .expect_err("no cred provider"), ); - req.properties_mut().insert(Credentials::for_tests()); + req.properties_mut() + .insert(Credentials::for_tests_with_session_token()); let req = signer.apply(req).expect("signing succeeded"); // make sure we got the correct error types in any order assert!(errs.iter().all(|el| matches!( diff --git a/aws/rust-runtime/aws-sig-auth/src/signer.rs b/aws/rust-runtime/aws-sig-auth/src/signer.rs index 071b2e6f3f2..7a1561b046d 100644 --- a/aws/rust-runtime/aws-sig-auth/src/signer.rs +++ b/aws/rust-runtime/aws-sig-auth/src/signer.rs @@ -3,20 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_credential_types::Credentials; +use crate::middleware::Signature; use aws_sigv4::http_request::{ sign, PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableRequest, SignatureLocation, SigningParams, SigningSettings, UriPathNormalizationMode, }; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime_api::client::identity::Identity; use aws_types::region::SigningRegion; use aws_types::SigningName; use std::fmt; use std::time::{Duration, SystemTime}; -use crate::middleware::Signature; pub use aws_sigv4::http_request::SignableBody; - pub type SigningError = aws_sigv4::http_request::SigningError; const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ @@ -159,11 +158,11 @@ impl SigV4Signer { fn signing_params<'a>( settings: SigningSettings, - credentials: &'a Credentials, + identity: &'a Identity, request_config: &'a RequestConfig<'a>, ) -> SigningParams<'a> { if let Some(expires_in) = settings.expires_in { - if let Some(creds_expires_time) = credentials.expiry() { + if let Some(creds_expires_time) = identity.expiration().cloned() { let presigned_expires_time = request_config.request_ts + expires_in; if presigned_expires_time > creds_expires_time { tracing::warn!(EXPIRATION_WARNING); @@ -171,14 +170,12 @@ impl SigV4Signer { } } - let mut builder = SigningParams::builder() - .access_key(credentials.access_key_id()) - .secret_key(credentials.secret_access_key()) + let builder = SigningParams::builder() + .identity(identity) .region(request_config.region.as_ref()) .name(request_config.name.as_ref()) .time(request_config.request_ts) .settings(settings); - builder.set_security_token(credentials.session_token()); builder.build().expect("all required fields set") } @@ -190,11 +187,11 @@ impl SigV4Signer { &self, operation_config: &OperationSigningConfig, request_config: &RequestConfig<'_>, - credentials: &Credentials, + identity: &Identity, request: &mut http::Request, ) -> Result { let settings = Self::settings(operation_config); - let signing_params = Self::signing_params(settings, credentials, request_config); + let signing_params = Self::signing_params(settings, identity, request_config); let (signing_instructions, signature) = { // A body that is already in memory can be signed directly. A body that is not in memory @@ -239,6 +236,7 @@ mod tests { use super::{RequestConfig, SigV4Signer, EXPIRATION_WARNING}; use aws_credential_types::Credentials; use aws_sigv4::http_request::SigningSettings; + use aws_types::region::SigningRegion; use aws_types::SigningName; use std::time::{Duration, SystemTime}; @@ -253,26 +251,27 @@ mod tests { let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); - let credentials = Credentials::new( + let identity = Credentials::new( "test-access-key", "test-secret-key", Some("test-session-token".into()), Some(now + creds_expire_in), "test", - ); + ) + .into(); let request_config = RequestConfig { request_ts: now, region: &SigningRegion::from_static("test"), name: &SigningName::from_static("test"), payload_override: None, }; - SigV4Signer::signing_params(settings, &credentials, &request_config); + SigV4Signer::signing_params(settings, &identity, &request_config); assert!(!logs_contain(EXPIRATION_WARNING)); let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); - SigV4Signer::signing_params(settings, &credentials, &request_config); + SigV4Signer::signing_params(settings, &identity, &request_config); assert!(logs_contain(EXPIRATION_WARNING)); } } diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index 3a8b59022be..005c93a8958 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -17,6 +17,8 @@ default = ["sign-http"] [dependencies] aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } +aws-credential-types = { path = "../aws-credential-types" } bytes = { version = "1", optional = true } form_urlencoded = { version = "1.0", optional = true } hex = "0.4" @@ -30,6 +32,8 @@ hmac = "0.12" sha2 = "0.10" [dev-dependencies] +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client", "test-util"] } +aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } criterion = "0.4" bytes = "1" httparse = "1.5" diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq index 860ac5966d0..2c61e69ee7f 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq @@ -1,4 +1,4 @@ POST /test/@connections/JBDvjfGEIAMCERw%3D HTTP/1.1 X-amz-date:20150830T123600Z -Authorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=6f871eb157f326fa5f7439eb88ca200048635950ce7d6037deda56f0c95d4364 +Authorization:AWS4-HMAC-SHA256 Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705 Host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq index 3549284538b..b29c1e07554 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq @@ -1,2 +1,2 @@ -GET /?Param2=value2&Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=35&X-Amz-SignedHeaders=host&X-Amz-Signature=f25aea20f8c722ece3b363fc5d60cc91add973f9b64c42ba36fa28d57afe9019 HTTP/1.1 +GET /?Param2=value2&Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=35&X-Amz-SignedHeaders=host&X-Amz-Signature=ecce208e4b4f7d7e3a4cc22ced6acc2ad1d170ee8ba87d7165f6fa4b9aff09ab HTTP/1.1 Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq index dff74145584..e55b6b8cecb 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq @@ -1,4 +1,4 @@ GET /?Param2=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z -Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500 +Authorization: AWS4-HMAC-SHA256 Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5557820e7380d585310524bd93d51a08d7757fb5efd7344ee12088f2b0860947 diff --git a/aws/rust-runtime/aws-sigv4/external-types.toml b/aws/rust-runtime/aws-sigv4/external-types.toml index 0e56bc56933..f0c4b533a31 100644 --- a/aws/rust-runtime/aws-sigv4/external-types.toml +++ b/aws/rust-runtime/aws-sigv4/external-types.toml @@ -3,4 +3,5 @@ allowed_external_types = [ "http::request::Request", # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::frame::Message", + "aws_smithy_runtime_api::client::identity::Identity" ] diff --git a/aws/rust-runtime/aws-sigv4/src/event_stream.rs b/aws/rust-runtime/aws-sigv4/src/event_stream.rs index 17b4e67bcfd..4932df47b57 100644 --- a/aws/rust-runtime/aws-sigv4/src/event_stream.rs +++ b/aws/rust-runtime/aws-sigv4/src/event_stream.rs @@ -11,6 +11,8 @@ //! use aws_sigv4::event_stream::{sign_message, SigningParams}; //! use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; //! use std::time::SystemTime; +//! use aws_credential_types::Credentials; +//! use aws_smithy_runtime_api::client::identity::Identity; //! //! // The `last_signature` argument is the previous message's signature, or //! // the signature of the initial HTTP request if a message hasn't been signed yet. @@ -21,9 +23,15 @@ //! HeaderValue::String("value".into()), //! )); //! +//! let identity = Credentials::new( +//! "AKIDEXAMPLE", +//! "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", +//! None, +//! None, +//! "hardcoded-credentials" +//! ).into(); //! let params = SigningParams::builder() -//! .access_key("example access key") -//! .secret_key("example secret key") +//! .identity(&identity) //! .region("us-east-1") //! .name("exampleservice") //! .time(SystemTime::now()) @@ -113,11 +121,13 @@ fn sign_payload<'a>( last_signature: &'a str, params: &'a SigningParams<'a>, ) -> SigningOutput { + let creds = params.credentials().expect("AWS credentials are required"); // Truncate the sub-seconds up front since the timestamp written to the signed message header // needs to exactly match the string formatted timestamp, which doesn't include sub-seconds. let time = truncate_subsecs(params.time); - let signing_key = generate_signing_key(params.secret_key, time, params.region, params.name); + let signing_key = + generate_signing_key(creds.secret_access_key(), time, params.region, params.name); let string_to_sign = calculate_string_to_sign( message_payload.as_ref().map(|v| &v[..]).unwrap_or(&[]), last_signature, @@ -141,7 +151,11 @@ fn sign_payload<'a>( #[cfg(test)] mod tests { - use super::*; + use crate::event_stream::{calculate_string_to_sign, sign_message}; + use crate::sign::sha256_hex_string; + use crate::SigningParams; + use aws_credential_types::Credentials; + use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; use std::time::{Duration, UNIX_EPOCH}; #[test] @@ -154,9 +168,7 @@ mod tests { message_to_sign.write_to(&mut message_payload).unwrap(); let params = SigningParams { - access_key: "fake access key", - secret_key: "fake secret key", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "testservice", time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)), @@ -192,9 +204,7 @@ mod tests { HeaderValue::String("value".into()), )); let params = SigningParams { - access_key: "fake access key", - secret_key: "fake secret key", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "testservice", time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)), diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs b/aws/rust-runtime/aws-sigv4/src/http_request.rs similarity index 85% rename from aws/rust-runtime/aws-sigv4/src/http_request/mod.rs rename to aws/rust-runtime/aws-sigv4/src/http_request.rs index 971f706aa64..c5df37e5e0a 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request.rs @@ -10,6 +10,8 @@ //! **Note**: This requires `http0-compat` to be enabled. //! //! ```rust +//! # use aws_credential_types::Credentials; +//! use aws_smithy_runtime_api::client::identity::Identity; //! # use aws_sigv4::http_request::SignableBody; //! #[cfg(feature = "http0-compat")] //! fn test() -> Result<(), aws_sigv4::http_request::SigningError> { @@ -18,10 +20,16 @@ //! use std::time::SystemTime; //! //! // Set up information and settings for the signing +//! let identity = Credentials::new( +//! "AKIDEXAMPLE", +//! "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", +//! None, +//! None, +//! "hardcoded-credentials" +//! ).into(); //! let signing_settings = SigningSettings::default(); //! let signing_params = SigningParams::builder() -//! .access_key("example access key") -//! .secret_key("example secret key") +//! .identity(&identity) //! .region("us-east-1") //! .name("exampleservice") //! .time(SystemTime::now()) diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index 7da3922941d..7f18602c7a4 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -20,7 +20,6 @@ use std::borrow::Cow; use std::cmp::Ordering; use std::convert::TryFrom; use std::fmt; -use std::fmt::Formatter; use std::str::FromStr; use std::time::SystemTime; @@ -131,6 +130,9 @@ impl<'a> CanonicalRequest<'a> { req: &'b SignableRequest<'b>, params: &'b SigningParams<'b>, ) -> Result, CanonicalRequestError> { + let creds = params + .credentials() + .ok_or_else(CanonicalRequestError::unsupported_credential_type)?; // Path encoding: if specified, re-encode % as %25 // Set method and path into CanonicalRequest let path = req.uri().path(); @@ -151,7 +153,7 @@ impl<'a> CanonicalRequest<'a> { let signed_headers = SignedHeaders::new(signed_headers); let security_token = match params.settings.session_token_mode { - SessionTokenMode::Include => params.security_token, + SessionTokenMode::Include => creds.session_token(), SessionTokenMode::Exclude => None, }; @@ -167,7 +169,7 @@ impl<'a> CanonicalRequest<'a> { content_sha256: payload_hash, credential: format!( "{}/{}/{}/{}/aws4_request", - params.access_key, + creds.access_key_id(), format_date(params.time), params.region, params.name, @@ -200,6 +202,9 @@ impl<'a> CanonicalRequest<'a> { payload_hash: &str, date_time: &str, ) -> Result<(Vec, HeaderMap), CanonicalRequestError> { + let creds = params + .credentials() + .ok_or_else(CanonicalRequestError::unsupported_credential_type)?; // Header computation: // The canonical request will include headers not present in the input. We need to clone and // normalize the headers from the original request and add: @@ -222,7 +227,7 @@ impl<'a> CanonicalRequest<'a> { if params.settings.signature_location == SignatureLocation::Headers { Self::insert_date_header(&mut canonical_headers, date_time); - if let Some(security_token) = params.security_token { + if let Some(security_token) = creds.session_token() { let mut sec_header = HeaderValue::from_str(security_token)?; sec_header.set_sensitive(true); canonical_headers.insert(header::X_AMZ_SECURITY_TOKEN, sec_header); @@ -517,7 +522,7 @@ impl<'a> StringToSign<'a> { } impl<'a> fmt::Display for StringToSign<'a> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "{}\n{}\n{}\n{}", @@ -537,22 +542,21 @@ mod tests { }; use crate::http_request::test::{test_canonical_request, test_request, test_sts}; use crate::http_request::{ - PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SigningSettings, + PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SignatureLocation, + SigningParams, SigningSettings, }; - use crate::http_request::{SignatureLocation, SigningParams}; use crate::sign::sha256_hex_string; + use aws_credential_types::Credentials; use aws_smithy_http::query_writer::QueryWriter; + use aws_smithy_runtime_api::client::identity::Identity; use http::{HeaderValue, Uri}; - use pretty_assertions::assert_eq; use proptest::{prelude::*, proptest}; use std::time::Duration; - fn signing_params(settings: SigningSettings) -> SigningParams<'static> { + fn signing_params(identity: &Identity, settings: SigningSettings) -> SigningParams<'_> { SigningParams { - access_key: "test-access-key", - secret_key: "test-secret-key", - security_token: None, + identity, region: "test-region", name: "testservicename", time: parse_date_time("20210511T154045Z").unwrap(), @@ -576,7 +580,8 @@ mod tests { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( @@ -597,7 +602,8 @@ mod tests { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() }; - let mut signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let mut signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( creq.values.content_sha256(), @@ -624,7 +630,8 @@ mod tests { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!(creq.values.content_sha256(), "UNSIGNED-PAYLOAD"); assert!(creq.to_string().ends_with("UNSIGNED-PAYLOAD")); @@ -640,7 +647,8 @@ mod tests { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!(creq.values.content_sha256(), payload_hash); assert!(creq.to_string().ends_with(payload_hash)); @@ -680,7 +688,8 @@ mod tests { fn test_double_url_encode_path() { let req = test_request("double-encode-path"); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); let expected = test_canonical_request("double-encode-path"); @@ -692,7 +701,8 @@ mod tests { fn test_double_url_encode() { let req = test_request("double-url-encode"); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); let expected = test_canonical_request("double-url-encode"); @@ -705,7 +715,8 @@ mod tests { let req = http::Request::builder() .uri("https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~").body("").unwrap().into(); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( Some("k=&list-type=2&prefix=~objprefix&single=&unreserved=-_.~"), @@ -728,7 +739,8 @@ mod tests { .unwrap() .into(); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); let expected = "list-type=2&prefix=%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~"; @@ -744,8 +756,8 @@ mod tests { session_token_mode: SessionTokenMode::Include, ..Default::default() }; - let mut signing_params = signing_params(settings); - signing_params.security_token = Some("notarealsessiontoken"); + let identity = Credentials::for_tests_with_session_token().into(); + let mut signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( @@ -787,7 +799,8 @@ mod tests { ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let canonical = CanonicalRequest::from(&request, &signing_params).unwrap(); let values = canonical.values.as_headers().unwrap(); @@ -819,7 +832,8 @@ mod tests { ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let canonical = CanonicalRequest::from(&request, &signing_params).unwrap(); let values = canonical.values.into_query_params().unwrap(); @@ -857,7 +871,8 @@ mod tests { ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let canonical = CanonicalRequest::from(&request, &signing_params).unwrap(); let values = canonical.values.into_query_params().unwrap(); diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs index 0d5f1b5b78c..0e0909aba1c 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs @@ -12,6 +12,7 @@ use std::str::Utf8Error; #[derive(Debug)] enum SigningErrorKind { FailedToCreateCanonicalRequest { source: CanonicalRequestError }, + UnsupportedIdentityType, } /// Error signing request @@ -20,12 +21,23 @@ pub struct SigningError { kind: SigningErrorKind, } +impl SigningError { + pub(crate) fn unsupported_identity_type() -> Self { + Self { + kind: SigningErrorKind::UnsupportedIdentityType, + } + } +} + impl fmt::Display for SigningError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.kind { SigningErrorKind::FailedToCreateCanonicalRequest { .. } => { write!(f, "failed to create canonical request") } + SigningErrorKind::UnsupportedIdentityType => { + write!(f, "only 'AWS credentials' are supported for signing") + } } } } @@ -34,6 +46,7 @@ impl Error for SigningError { fn source(&self) -> Option<&(dyn Error + 'static)> { match &self.kind { SigningErrorKind::FailedToCreateCanonicalRequest { source } => Some(source), + SigningErrorKind::UnsupportedIdentityType => None, } } } @@ -52,6 +65,7 @@ enum CanonicalRequestErrorKind { InvalidHeaderValue { source: InvalidHeaderValue }, InvalidUtf8InHeaderValue { source: Utf8Error }, InvalidUri { source: InvalidUri }, + UnsupportedIdentityType, } #[derive(Debug)] @@ -67,6 +81,9 @@ impl fmt::Display for CanonicalRequestError { InvalidHeaderValue { .. } => write!(f, "invalid header value"), InvalidUtf8InHeaderValue { .. } => write!(f, "invalid UTF-8 in header value"), InvalidUri { .. } => write!(f, "the uri was invalid"), + UnsupportedIdentityType => { + write!(f, "only AWS credentials are supported for signing") + } } } } @@ -79,6 +96,7 @@ impl Error for CanonicalRequestError { InvalidHeaderValue { source } => Some(source), InvalidUtf8InHeaderValue { source } => Some(source), InvalidUri { source } => Some(source), + UnsupportedIdentityType => None, } } } @@ -89,6 +107,12 @@ impl CanonicalRequestError { kind: CanonicalRequestErrorKind::InvalidUtf8InHeaderValue { source }, } } + + pub(crate) fn unsupported_credential_type() -> Self { + Self { + kind: CanonicalRequestErrorKind::UnsupportedIdentityType, + } + } } impl From for CanonicalRequestError { diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index 0010aeb039f..1f8edda5169 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -212,13 +212,20 @@ fn calculate_signing_params<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, ) -> Result<(CalculatedParams, String), SigningError> { + let creds = params + .credentials() + .ok_or_else(SigningError::unsupported_identity_type)?; let creq = CanonicalRequest::from(request, params)?; let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); let string_to_sign = StringToSign::new(params.time, params.region, params.name, encoded_creq).to_string(); - let signing_key = - generate_signing_key(params.secret_key, params.time, params.region, params.name); + let signing_key = generate_signing_key( + creds.secret_access_key(), + params.time, + params.region, + params.name, + ); let signature = calculate_signature(signing_key, string_to_sign.as_bytes()); tracing::trace!(canonical_request = %creq, string_to_sign = %string_to_sign, "calculated signing parameters"); @@ -235,7 +242,7 @@ fn calculate_signing_params<'a>( (param::X_AMZ_SIGNATURE, Cow::Owned(signature.clone())), ]; - if let Some(security_token) = params.security_token { + if let Some(security_token) = creds.session_token() { signing_params.push(( param::X_AMZ_SECURITY_TOKEN, Cow::Owned(security_token.to_string()), @@ -255,6 +262,9 @@ fn calculate_signing_headers<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, ) -> Result>, SigningError> { + let creds = params + .credentials() + .ok_or_else(SigningError::unsupported_identity_type)?; // Step 1: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-canonical-request.html. let creq = CanonicalRequest::from(request, params)?; tracing::trace!(canonical_request = %creq); @@ -264,8 +274,12 @@ fn calculate_signing_headers<'a>( let sts = StringToSign::new(params.time, params.region, params.name, encoded_creq); // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html - let signing_key = - generate_signing_key(params.secret_key, params.time, params.region, params.name); + let signing_key = generate_signing_key( + creds.secret_access_key(), + params.time, + params.region, + params.name, + ); let signature = calculate_signature(signing_key, sts.to_string().as_bytes()); // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html @@ -274,8 +288,7 @@ fn calculate_signing_headers<'a>( add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); headers.push(Header { key: "authorization", - value: build_authorization_header(params.access_key, &creq, sts, &signature), - + value: build_authorization_header(creds.access_key_id(), &creq, sts, &signature), sensitive: false, }); if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { @@ -287,7 +300,7 @@ fn calculate_signing_headers<'a>( ); } - if let Some(security_token) = params.security_token { + if let Some(security_token) = creds.session_token() { add_header( &mut headers, header::X_AMZ_SECURITY_TOKEN, @@ -327,7 +340,6 @@ fn build_authorization_header( #[cfg(test)] mod tests { - use super::sign; use crate::date_time::test_parsers::parse_date_time; use crate::http_request::sign::SignableRequest; use crate::http_request::test::{ @@ -336,6 +348,7 @@ mod tests { use crate::http_request::{ SessionTokenMode, SignableBody, SignatureLocation, SigningParams, SigningSettings, }; + use aws_credential_types::Credentials; use http::{HeaderValue, Request}; use pretty_assertions::assert_eq; use proptest::proptest; @@ -366,9 +379,7 @@ mod tests { fn test_sign_vanilla_with_headers() { let settings = SigningSettings::default(); let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), @@ -377,9 +388,9 @@ mod tests { let original = test_request("get-vanilla-query-order-key-case"); let signable = SignableRequest::from(&original); - let out = sign(signable, ¶ms).unwrap(); + let out = crate::http_request::sign(signable, ¶ms).unwrap(); assert_eq!( - "b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500", + "5557820e7380d585310524bd93d51a08d7757fb5efd7344ee12088f2b0860947", out.signature ); @@ -395,9 +406,7 @@ mod tests { let test = "double-encode-path"; let settings = SigningSettings::default(); let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), @@ -406,9 +415,9 @@ mod tests { let original = test_request(test); let signable = SignableRequest::from(&original); - let out = sign(signable, ¶ms).unwrap(); + let out = crate::http_request::sign(signable, ¶ms).unwrap(); assert_eq!( - "6f871eb157f326fa5f7439eb88ca200048635950ce7d6037deda56f0c95d4364", + "57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705", out.signature ); @@ -427,9 +436,7 @@ mod tests { ..Default::default() }; let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), @@ -438,9 +445,9 @@ mod tests { let original = test_request("get-vanilla-query-order-key-case"); let signable = SignableRequest::from(&original); - let out = sign(signable, ¶ms).unwrap(); + let out = crate::http_request::sign(signable, ¶ms).unwrap(); assert_eq!( - "f25aea20f8c722ece3b363fc5d60cc91add973f9b64c42ba36fa28d57afe9019", + "ecce208e4b4f7d7e3a4cc22ced6acc2ad1d170ee8ba87d7165f6fa4b9aff09ab", out.signature ); @@ -455,9 +462,7 @@ mod tests { fn test_sign_headers_utf8() { let settings = SigningSettings::default(); let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), @@ -471,9 +476,9 @@ mod tests { .unwrap() .into(); let signable = SignableRequest::from(&original); - let out = sign(signable, ¶ms).unwrap(); + let out = crate::http_request::sign(signable, ¶ms).unwrap(); assert_eq!( - "4596b207a7fc6bdf18725369bc0cd7022cf20efbd2c19730549f42d1a403648e", + "55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f", out.signature ); @@ -491,9 +496,9 @@ mod tests { "authorization", HeaderValue::from_str( "AWS4-HMAC-SHA256 \ - Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \ SignedHeaders=host;some-header;x-amz-date, \ - Signature=4596b207a7fc6bdf18725369bc0cd7022cf20efbd2c19730549f42d1a403648e", + Signature=55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f", ) .unwrap(), ) @@ -509,9 +514,7 @@ mod tests { ..Default::default() }; let mut params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), @@ -523,13 +526,15 @@ mod tests { .body("") .unwrap() .into(); - let out_without_session_token = sign(SignableRequest::from(&original), ¶ms).unwrap(); - params.security_token = Some("notarealsessiontoken"); + let out_without_session_token = + crate::http_request::sign(SignableRequest::from(&original), ¶ms).unwrap(); + let identity = Credentials::for_tests_with_session_token().into(); + params.identity = &identity; let out_with_session_token_but_excluded = - sign(SignableRequest::from(&original), ¶ms).unwrap(); + crate::http_request::sign(SignableRequest::from(&original), ¶ms).unwrap(); assert_eq!( - "d2445d2d58e01146627c1e498dc0b4749d0cecd2cab05c5349ed132c083914e8", + "ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560", out_with_session_token_but_excluded.signature ); assert_eq!( @@ -552,9 +557,9 @@ mod tests { "authorization", HeaderValue::from_str( "AWS4-HMAC-SHA256 \ - Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \ SignedHeaders=host;x-amz-date, \ - Signature=d2445d2d58e01146627c1e498dc0b4749d0cecd2cab05c5349ed132c083914e8", + Signature=ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560", ) .unwrap(), ) @@ -571,9 +576,7 @@ mod tests { fn test_sign_headers_space_trimming() { let settings = SigningSettings::default(); let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), @@ -590,9 +593,9 @@ mod tests { .unwrap() .into(); let signable = SignableRequest::from(&original); - let out = sign(signable, ¶ms).unwrap(); + let out = crate::http_request::sign(signable, ¶ms).unwrap(); assert_eq!( - "0bd74dbf6f21161f61a1a3a1c313b6a4bc67ec57bf5ea9ae956a63753ca1d7f7", + "244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08", out.signature ); @@ -613,9 +616,9 @@ mod tests { "authorization", HeaderValue::from_str( "AWS4-HMAC-SHA256 \ - Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \ SignedHeaders=host;some-header;x-amz-date, \ - Signature=0bd74dbf6f21161f61a1a3a1c313b6a4bc67ec57bf5ea9ae956a63753ca1d7f7", + Signature=244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08", ) .unwrap(), ) @@ -633,9 +636,7 @@ mod tests { ) { let settings = SigningSettings::default(); let params = SigningParams { - access_key: "123", - secret_key: "asdf", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", name: "foo", time: std::time::SystemTime::UNIX_EPOCH, diff --git a/aws/rust-runtime/aws-sigv4/src/lib.rs b/aws/rust-runtime/aws-sigv4/src/lib.rs index 0f4df11fc9c..4898311773e 100644 --- a/aws/rust-runtime/aws-sigv4/src/lib.rs +++ b/aws/rust-runtime/aws-sigv4/src/lib.rs @@ -15,7 +15,8 @@ unreachable_pub )] -use std::fmt; +use aws_credential_types::Credentials; +use aws_smithy_runtime_api::client::identity::Identity; use std::time::SystemTime; pub mod sign; @@ -29,14 +30,11 @@ pub mod event_stream; pub mod http_request; /// Parameters to use when signing. +// #[derive(Debug)] assumes that any data `Identity` holds is responsible for handling its own redaction. +#[derive(Debug)] #[non_exhaustive] pub struct SigningParams<'a, S> { - /// Access Key ID to use. - pub(crate) access_key: &'a str, - /// Secret access key to use. - pub(crate) secret_key: &'a str, - /// (Optional) Security token to use. - pub(crate) security_token: Option<&'a str>, + pub(crate) identity: &'a Identity, /// Region to sign for. pub(crate) region: &'a str, @@ -61,19 +59,10 @@ impl<'a, S> SigningParams<'a, S> { pub fn name(&self) -> &str { self.name } -} -impl<'a, S: fmt::Debug> fmt::Debug for SigningParams<'a, S> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SigningParams") - .field("access_key", &"** redacted **") - .field("secret_key", &"** redacted **") - .field("security_token", &"** redacted **") - .field("region", &self.region) - .field("name", &self.name) - .field("time", &self.time) - .field("settings", &self.settings) - .finish() + /// If the identity in params contains AWS credentials, return them. Otherwise, return `None`. + pub(crate) fn credentials(&self) -> Option<&Credentials> { + self.identity.data::() } } @@ -86,7 +75,7 @@ impl<'a, S: Default> SigningParams<'a, S> { /// Builder and error for creating [`SigningParams`] pub mod signing_params { - use super::SigningParams; + use super::{Identity, SigningParams}; use std::error::Error; use std::fmt; use std::time::SystemTime; @@ -113,9 +102,7 @@ pub mod signing_params { /// Builder that can create new [`SigningParams`] #[derive(Debug, Default)] pub struct Builder<'a, S> { - access_key: Option<&'a str>, - secret_key: Option<&'a str>, - security_token: Option<&'a str>, + identity: Option<&'a Identity>, region: Option<&'a str>, name: Option<&'a str>, time: Option, @@ -123,34 +110,14 @@ pub mod signing_params { } impl<'a, S> Builder<'a, S> { - /// Sets the access key (required). - pub fn access_key(mut self, access_key: &'a str) -> Self { - self.access_key = Some(access_key); - self - } - /// Sets the access key (required) - pub fn set_access_key(&mut self, access_key: Option<&'a str>) { - self.access_key = access_key; - } - - /// Sets the secret key (required) - pub fn secret_key(mut self, secret_key: &'a str) -> Self { - self.secret_key = Some(secret_key); - self - } - /// Sets the secret key (required) - pub fn set_secret_key(&mut self, secret_key: Option<&'a str>) { - self.secret_key = secret_key; - } - - /// Sets the security token (optional) - pub fn security_token(mut self, security_token: &'a str) -> Self { - self.security_token = Some(security_token); + /// Sets the identity (required). + pub fn identity(mut self, identity: &'a Identity) -> Self { + self.identity = Some(identity); self } - /// Sets the security token (optional) - pub fn set_security_token(&mut self, security_token: Option<&'a str>) { - self.security_token = security_token; + /// Sets the identity (required) + pub fn set_identity(&mut self, identity: Option<&'a Identity>) { + self.identity = identity; } /// Sets the region (required) @@ -197,13 +164,9 @@ pub mod signing_params { /// a required argument was not given. pub fn build(self) -> Result, BuildError> { Ok(SigningParams { - access_key: self - .access_key - .ok_or_else(|| BuildError::new("access key is required"))?, - secret_key: self - .secret_key - .ok_or_else(|| BuildError::new("secret key is required"))?, - security_token: self.security_token, + identity: self + .identity + .ok_or_else(|| BuildError::new("an identity is required"))?, region: self .region .ok_or_else(|| BuildError::new("region is required"))?, diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index ba2744f1f37..9125ec12e90 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -66,7 +66,7 @@ async fn generate_random() { let conf = Config::builder() .http_connector(conn.clone()) .region(Region::new("us-east-1")) - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .build(); let client = kms::Client::from_conf(conf); let resp = client @@ -148,7 +148,7 @@ async fn generate_random_keystore_not_found() { let conf = Config::builder() .http_connector(conn.clone()) .region(Region::new("us-east-1")) - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .build(); let client = kms::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/polly/tests/presigning.rs b/aws/sdk/integration-tests/polly/tests/presigning.rs index eaf525d7fb7..845192f1471 100644 --- a/aws/sdk/integration-tests/polly/tests/presigning.rs +++ b/aws/sdk/integration-tests/polly/tests/presigning.rs @@ -12,7 +12,7 @@ use std::time::{Duration, SystemTime}; #[tokio::test] async fn test_presigning() { let config = Config::builder() - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .region(Region::new("us-east-1")) .build(); let client = polly::Client::from_conf(config); diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 1dc363bc96a..b73dea2fc7a 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -37,7 +37,7 @@ async fn signv4_use_correct_service_name() { let conf = Config::builder() .http_connector(conn.clone()) .region(Region::new("us-east-1")) - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .build(); let client = Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs index 09dd42fb8f1..7621393eca5 100644 --- a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs +++ b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs @@ -15,7 +15,9 @@ use std::time::{Duration, UNIX_EPOCH}; async fn test_s3_ops_are_customizable() { let (conn, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) .http_connector(conn.clone()) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index 3e55ffe9c3c..07bf543b8c0 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -42,7 +42,9 @@ async fn ignore_invalid_xml_body_root() { ]); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) .http_connector(conn.clone()) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 96142f2b43d..e67da16c270 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -50,7 +50,9 @@ const NAUGHTY_STRINGS: &str = include_str!("blns/blns.txt"); async fn test_s3_signer_with_naughty_string_metadata() { let (conn, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) .http_connector(conn.clone()) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index a50867ccd0f..d2b6f4a0000 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -14,7 +14,9 @@ use std::time::{Duration, UNIX_EPOCH}; async fn test_operation_should_not_normalize_uri_path() { let (conn, rx) = capture_request(None); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) .http_connector(conn.clone()) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/presigning.rs b/aws/sdk/integration-tests/s3/tests/presigning.rs index 05625d3405b..33d51926426 100644 --- a/aws/sdk/integration-tests/s3/tests/presigning.rs +++ b/aws/sdk/integration-tests/s3/tests/presigning.rs @@ -49,7 +49,7 @@ where O: FnOnce(s3::Client) -> F, F: TestOperation, { - let creds = Credentials::for_tests(); + let creds = Credentials::for_tests_with_session_token(); let config = s3::Config::builder() .credentials_provider(creds) .region(Region::new("us-east-1")) diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 7d7880fa81a..bc679369249 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -14,7 +14,9 @@ use std::time::{Duration, UNIX_EPOCH}; async fn test_s3_signer_query_string_with_all_valid_chars() { let (conn, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) .http_connector(conn.clone()) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs index d4e00d39d26..8c47e8b3671 100644 --- a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -74,7 +74,7 @@ async fn three_retries_and_then_success() { let path = "tests/data/request-information-headers/three-retries_and-then-success.json"; let conn = dvr::ReplayingConnection::from_file(path).unwrap(); let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .region(Region::new("us-east-1")) .http_connector(DynConnector::new(conn.clone())) .time_source(SharedTimeSource::new(time_source.clone())) diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index a02b6b670be..46e1859f0a6 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -22,7 +22,9 @@ async fn test_signer() { http::Response::builder().status(200).body("").unwrap(), )]); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) .http_connector(conn.clone()) .build(); diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index c868491a429..4b207f98350 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -25,7 +25,9 @@ async fn test_signer() { http::Response::builder().status(200).body("").unwrap(), )]); let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .http_connector(conn.clone()) .region(Region::new("us-east-1")) .build(); diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index 56303a4ef1f..4c36c1e157a 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -26,7 +26,9 @@ async fn do_endpoint_discovery() { .http_connector(conn.clone()) .region(Region::from_static("us-west-2")) .sleep_impl(SharedAsyncSleep::new(sleep)) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .time_source(SharedTimeSource::new(ts.clone())) .build(); let conf = query::config::Builder::from(&config) From 4a126b797161d2b476aa0ffe4b2236f1d8c659f5 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 08:18:25 -0700 Subject: [PATCH 076/331] Fix the re-export in middleware mode --- .../customize/RequiredCustomizations.kt | 23 +++++++++++++------ .../ServerRequiredCustomizations.kt | 5 ++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index bf46d496d17..f2228bba17e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -24,6 +24,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCus import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Feature +import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate @@ -94,18 +95,26 @@ class RequiredCustomizations : ClientCodegenDecorator { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) } rustCrate.withModule(ClientRustModule.Error) { + // TODO(enableNewSmithyRuntimeCleanup): Change SdkError to a `pub use` after changing the generic's default + rust("/// Error type returned by the client.") + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { + rustTemplate( + "pub type SdkError = #{SdkError};", + "SdkError" to RuntimeType.sdkError(rc), + "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), + ) + } else { + rustTemplate( + "pub type SdkError = #{SdkError};", + "SdkError" to RuntimeType.sdkError(rc), + "R" to RuntimeType.smithyHttp(rc).resolve("operation::Response"), + ) + } rustTemplate( """ - pub type SdkError = #{SdkError}; pub use #{DisplayErrorContext}; pub use #{ProvideErrorMetadata}; """, - "SdkError" to RuntimeType.smithyHttp(rc).resolve("result::SdkError"), - "SdkErrorResponse" to if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse") - } else { - RuntimeType.HttpResponse - }, "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), ) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index b79ff3b2875..a8698ae91d4 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -42,13 +42,14 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { rustCrate.withModule(ServerRustModule.Types) { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) + // TODO(enableNewSmithyRuntimeCleanup): Remove re-export of SdkError in server and add changelog entry rustTemplate( """ - pub type SdkError = #{SdkError}; + pub type SdkError = #{SdkError}; pub use #{DisplayErrorContext}; """, "SdkError" to RuntimeType.smithyHttp(rc).resolve("result::SdkError"), - "SdkErrorResponse" to RuntimeType.HttpResponse, + "Response" to RuntimeType.smithyHttp(rc).resolve("operation::Response"), "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), ) } From ab2112977963dded93709c79dc2ec8e1206b978e Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 09:38:30 -0700 Subject: [PATCH 077/331] Attempt to fix example workspace issue --- aws/sdk/build.gradle.kts | 24 +++------- .../src/main/kotlin/aws/sdk/ServiceLoader.kt | 44 ++----------------- 2 files changed, 10 insertions(+), 58 deletions(-) diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 03e9bcfde5c..eeb46fcbe97 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import aws.sdk.AwsExamplesLayout import aws.sdk.AwsServices import aws.sdk.Membership import aws.sdk.discoverServices @@ -246,22 +245,13 @@ tasks.register("fixExampleManifests") { toolPath = sdkVersionerToolPath binaryName = "sdk-versioner" - arguments = when (AwsExamplesLayout.detect(project)) { - AwsExamplesLayout.Flat -> listOf( - "use-path-and-version-dependencies", - "--isolate-crates", - "--sdk-path", "../../sdk", - "--versions-toml", outputDir.resolve("versions.toml").absolutePath, - outputDir.resolve("examples").absolutePath, - ) - AwsExamplesLayout.Workspaces -> listOf( - "use-path-and-version-dependencies", - "--isolate-crates", - "--sdk-path", sdkOutputDir.absolutePath, - "--versions-toml", outputDir.resolve("versions.toml").absolutePath, - outputDir.resolve("examples").absolutePath, - ) - } + arguments = listOf( + "use-path-and-version-dependencies", + "--isolate-crates", + "--sdk-path", sdkOutputDir.absolutePath, + "--versions-toml", outputDir.resolve("versions.toml").absolutePath, + outputDir.resolve("examples").absolutePath, + ) outputs.dir(outputDir) dependsOn("relocateExamples", "generateVersionManifest") diff --git a/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt b/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt index 189bce6a67c..9871741ad51 100644 --- a/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt +++ b/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt @@ -19,38 +19,6 @@ data class RootTest( val manifestName: String, ) -// TODO(https://github.com/awslabs/smithy-rs/issues/2810): We can remove the `Flat` layout after the switch -// to `Workspaces` has been released. This can be checked by looking at the `examples/` directory in aws-sdk-rust's -// main branch. -// -// The `Flat` layout is retained for backwards compatibility so that the next release process can succeed. -enum class AwsExamplesLayout { - /** - * Directory layout for examples used prior to June 26, 2023, - * where each example was in the `rust_dev_preview/` root directory and - * was considered to be its own workspace. - * - * This layout had issues with CI in terms of time to compile and disk space required - * since the dependencies would get recompiled for every example. - */ - Flat, - - /** - * Current directory layout where there are a small number of workspaces - * rooted in `rust_dev_preview/`. - */ - Workspaces, - ; - - companion object { - fun detect(project: Project): AwsExamplesLayout = if (project.projectDir.resolve("examples/Cargo.toml").exists()) { - AwsExamplesLayout.Flat - } else { - AwsExamplesLayout.Workspaces - } - } -} - class AwsServices( private val project: Project, services: List, @@ -77,15 +45,9 @@ class AwsServices( val examples: List by lazy { val examplesRoot = project.projectDir.resolve("examples") - if (AwsExamplesLayout.detect(project) == AwsExamplesLayout.Flat) { - examplesRoot.listFiles { file -> !file.name.startsWith(".") }.orEmpty().toList() - .filter { file -> manifestCompatibleWithGeneratedServices(file) } - .map { "examples/${it.name}" } - } else { - examplesRoot.listFiles { file -> - !file.name.startsWith(".") && file.isDirectory() && file.resolve("Cargo.toml").exists() - }.orEmpty().toList().map { "examples/${it.name}" } - } + examplesRoot.listFiles { file -> + !file.name.startsWith(".") && file.isDirectory() && file.resolve("Cargo.toml").exists() + }.orEmpty().toList().map { "examples/${it.name}" } } /** From 83ed2ad0558d66e5c3307b474cd4cbc9f6a51cac Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 09:56:05 -0700 Subject: [PATCH 078/331] Remove `--isolate-crates` --- aws/sdk/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index eeb46fcbe97..339af759a39 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -247,7 +247,6 @@ tasks.register("fixExampleManifests") { binaryName = "sdk-versioner" arguments = listOf( "use-path-and-version-dependencies", - "--isolate-crates", "--sdk-path", sdkOutputDir.absolutePath, "--versions-toml", outputDir.resolve("versions.toml").absolutePath, outputDir.resolve("examples").absolutePath, From 0ea7f55ae3f690eea2439843390525a951241739 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 10:26:24 -0700 Subject: [PATCH 079/331] Attempt to fix example compile --- tools/ci-build/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index f1e74fc79f4..a65d954ddd9 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -148,6 +148,7 @@ RUN cargo +${rust_nightly_version} -Z sparse-registry install mdbook-mermaid --l # # Final image # +# `clang-libs` needed by SDK examples for `libxlsxwriter-sys` FROM bare_base_image AS final_image ARG rust_stable_version ARG rust_nightly_version @@ -155,6 +156,7 @@ RUN set -eux; \ yum -y install \ bc \ ca-certificates \ + clang-libs \ gcc \ git \ java-11-amazon-corretto-headless \ From c742b5f66cebf8a34ad443f6f4098c51b38e9aab Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 18 Aug 2023 13:17:58 -0500 Subject: [PATCH 080/331] Reduce amount of logging from #[instrument] (#2934) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Will be merged to `smithy-rs-release-0.56.x` branch** Addresses https://github.com/awslabs/aws-sdk-rust/issues/872 ## Motivation and Context With the introduction of the orchestrator, the core functions that live in `aws-smithy-runtime/src/client/orchestrator.rs` were annotated by `#instrument`. By default this emits logs at the `INFO` level, which caused our customer to see the excessive amount of logging after switching to the latest SDK creates `0.29`. ## Description This PR reduces the log level to `DEBUG` wherever we use `#instrument` throughout the file. ## Testing No new tests have been added as part of this PR. [An enhancement](https://github.com/awslabs/smithy-rs/issues/2932) has been filed to check logging volume. Here is a quick check that all instances in the file specify `trace`: ``` ✗ rg "instrument" src/client/orchestrator.rs 34:use tracing::{debug, debug_span, instrument, trace, Instrument}; 160: .instrument(debug_span!("invoke", service = %service_name, operation = %operation_name)) 167:#[instrument(skip_all, level = "debug")] 186:#[instrument(skip_all, level = "debug")] 319:#[instrument(skip_all, level = "debug")] 389: .instrument(debug_span!("read_body")) 398: .instrument(debug_span!("deserialization")) 407:#[instrument(skip_all, level = "debug")] 419:#[instrument(skip_all, level = "debug")] ``` ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- CHANGELOG.next.toml | 12 ++++++++++++ .../aws-smithy-runtime/src/client/orchestrator.rs | 10 +++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e0ea56e68bb..0d0121b35d7 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -34,3 +34,15 @@ message = "Fix requests to S3 with `no_credentials` set." references = ["smithy-rs#2907", "aws-sdk-rust#864"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "jdisanti" + +[[smithy-rs]] +message = "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level." +references = ["smithy-rs#2934", "aws-sdk-rust#872"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "ysaito1001" + +[[aws-sdk-rust]] +message = "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level." +references = ["smithy-rs#2934", "aws-sdk-rust#872"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 22bee36367c..c463dca869e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -164,7 +164,7 @@ pub async fn invoke_with_stop_point( /// Apply configuration is responsible for apply runtime plugins to the config bag, as well as running /// `read_before_execution` interceptors. If a failure occurs due to config construction, `invoke` /// will raise it to the user. If an interceptor fails, then `invoke` -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] fn apply_configuration( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, @@ -183,7 +183,7 @@ fn apply_configuration( .build()?) } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn try_op( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, @@ -316,7 +316,7 @@ async fn try_op( } } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn try_attempt( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, @@ -404,7 +404,7 @@ async fn try_attempt( run_interceptors!(halt_on_err: read_after_deserialization(ctx, runtime_components, cfg)); } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn finally_attempt( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, @@ -416,7 +416,7 @@ async fn finally_attempt( }); } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn finally_op( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, From 084d5d2d223dd5fa5b0702927fde9c44b79d1794 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 12:03:39 -0700 Subject: [PATCH 081/331] Make `acquire-base-image` faster --- .github/workflows/ci-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 89d8099519d..1b440018990 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -52,7 +52,7 @@ jobs: name: Acquire Base Image needs: save-docker-login-token if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} - runs-on: ubuntu-latest + runs-on: smithy_ubuntu-latest_8-core env: ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }} DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }} From 70c328fa0adb429be0bf98f3b8a9dc5609085608 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 12:04:03 -0700 Subject: [PATCH 082/331] Attempt to fix clang issue --- tools/ci-build/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index a65d954ddd9..2254dfb5b14 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -148,7 +148,7 @@ RUN cargo +${rust_nightly_version} -Z sparse-registry install mdbook-mermaid --l # # Final image # -# `clang-libs` needed by SDK examples for `libxlsxwriter-sys` +# `clang` needed by SDK examples for `libxlsxwriter-sys` FROM bare_base_image AS final_image ARG rust_stable_version ARG rust_nightly_version @@ -156,7 +156,7 @@ RUN set -eux; \ yum -y install \ bc \ ca-certificates \ - clang-libs \ + clang \ gcc \ git \ java-11-amazon-corretto-headless \ From 959baba65c1584f3232626dccd8e8d9209b8b15d Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 12:52:36 -0700 Subject: [PATCH 083/331] Fix eventstream issue --- .../codegen/client/smithy/customize/RequiredCustomizations.kt | 4 ++-- .../smithy/customizations/ServerRequiredCustomizations.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index f2228bba17e..98cb2bad7de 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -99,13 +99,13 @@ class RequiredCustomizations : ClientCodegenDecorator { rust("/// Error type returned by the client.") if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( - "pub type SdkError = #{SdkError};", + "pub type SdkError = #{SdkError};", "SdkError" to RuntimeType.sdkError(rc), "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), ) } else { rustTemplate( - "pub type SdkError = #{SdkError};", + "pub type SdkError = #{SdkError};", "SdkError" to RuntimeType.sdkError(rc), "R" to RuntimeType.smithyHttp(rc).resolve("operation::Response"), ) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index a8698ae91d4..5fc86ee04fd 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -45,7 +45,7 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { // TODO(enableNewSmithyRuntimeCleanup): Remove re-export of SdkError in server and add changelog entry rustTemplate( """ - pub type SdkError = #{SdkError}; + pub type SdkError = #{SdkError}; pub use #{DisplayErrorContext}; """, "SdkError" to RuntimeType.smithyHttp(rc).resolve("result::SdkError"), From 56fc28b95c2f1d73e8caaea3ae72967294637a12 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 18 Aug 2023 13:49:48 -0700 Subject: [PATCH 084/331] Add ability to choose branch to generate aws-sdk-rust/next from --- .github/workflows/update-sdk-next.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-sdk-next.yml b/.github/workflows/update-sdk-next.yml index 155924020a3..a06bf21ad8a 100644 --- a/.github/workflows/update-sdk-next.yml +++ b/.github/workflows/update-sdk-next.yml @@ -1,8 +1,21 @@ # This workflow updates the `next` branch with freshly generated # code from the latest smithy-rs and models that reside in aws-sdk-rust. + +# Allow only one release to run at a time +concurrency: + group: update-aws-sdk-next + cancel-in-progress: true + name: Update `aws-sdk-rust/next` on: workflow_dispatch: + inputs: + generate_ref: + description: | + Which branch/commit/tag of smithy-rs to use to generate aws-sdk-rust/next. Defaults to `main`. + required: true + type: string + default: main jobs: update-next: @@ -13,7 +26,7 @@ jobs: uses: actions/checkout@v3 with: repository: awslabs/smithy-rs - ref: main + ref: ${{ inputs.generate_ref }} path: smithy-rs - name: Check out `aws-sdk-rust` uses: actions/checkout@v3 From 99ff449baeff140899c50b2a41400b0bd2f3e4d2 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 21 Aug 2023 11:36:29 -0700 Subject: [PATCH 085/331] Add ability to yank different crate sets to the publisher tool (#2933) This PR adds different crate sets to the publisher tool so that different groups of crates can be yanked rather than yanking everything. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../publisher/src/subcommand/yank_release.rs | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/tools/ci-build/publisher/src/subcommand/yank_release.rs b/tools/ci-build/publisher/src/subcommand/yank_release.rs index 5c73b4b0d4a..12b769a10ac 100644 --- a/tools/ci-build/publisher/src/subcommand/yank_release.rs +++ b/tools/ci-build/publisher/src/subcommand/yank_release.rs @@ -5,11 +5,13 @@ use crate::cargo; use anyhow::{anyhow, bail, Context, Result}; -use clap::Parser; +use clap::{ArgEnum, Parser}; use dialoguer::Confirm; +use smithy_rs_tool_common::package::PackageCategory; use smithy_rs_tool_common::release_tag::ReleaseTag; use smithy_rs_tool_common::shell::ShellOperation; use smithy_rs_tool_common::versions_manifest::{Release, VersionsManifest}; +use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::Arc; @@ -18,6 +20,16 @@ use tracing::info; const MAX_CONCURRENCY: usize = 5; +#[derive(Copy, Clone, Debug, ArgEnum, Eq, PartialEq, Ord, PartialOrd)] +pub enum CrateSet { + /// (default) Yank all crates associated with the release. + All, + /// Yank all AWS SDK crates. + AllAwsSdk, + /// Yank generated AWS SDK crates. + GeneratedAwsSdk, +} + #[derive(Parser, Debug)] pub struct YankReleaseArgs { /// The aws-sdk-rust release tag to yank. The CLI will download the `versions.toml` file @@ -28,12 +40,15 @@ pub struct YankReleaseArgs { /// The `--github-release-tag` option is preferred to this, but this is provided as a fail safe. #[clap(long, required_unless_present = "github-release-tag")] versions_toml: Option, + #[clap(arg_enum)] + crate_set: Option, } pub async fn subcommand_yank_release( YankReleaseArgs { github_release_tag, versions_toml, + crate_set, }: &YankReleaseArgs, ) -> Result<()> { // Make sure cargo exists @@ -47,8 +62,18 @@ pub async fn subcommand_yank_release( } .context("failed to retrieve information about the release to yank")?; + let tag = release + .tag + .as_ref() + .ok_or_else(|| { + anyhow!("Versions manifest doesn't have a release tag. Can only yank tagged releases.") + })? + .clone(); + let crates = filter_crates(crate_set.unwrap_or(CrateSet::All), release); + let _ = release; + // Don't proceed unless the user confirms the plan - confirm_plan(&release)?; + confirm_plan(&tag, &crates)?; // Use a semaphore to only allow a few concurrent yanks let semaphore = Arc::new(Semaphore::new(MAX_CONCURRENCY)); @@ -58,7 +83,7 @@ pub async fn subcommand_yank_release( ); let mut tasks = Vec::new(); - for (crate_name, crate_version) in release.crates { + for (crate_name, crate_version) in crates { let permit = semaphore.clone().acquire_owned().await.unwrap(); tasks.push(tokio::spawn(async move { info!("Yanking `{}-{}`...", crate_name, crate_version); @@ -77,6 +102,25 @@ pub async fn subcommand_yank_release( Ok(()) } +fn filter_crates(crate_set: CrateSet, release: Release) -> BTreeMap { + if crate_set == CrateSet::All { + return release.crates; + } + + release + .crates + .into_iter() + .filter(|c| { + let category = PackageCategory::from_package_name(&c.0); + match crate_set { + CrateSet::All => unreachable!(), + CrateSet::AllAwsSdk => category.is_sdk(), + CrateSet::GeneratedAwsSdk => category == PackageCategory::AwsSdk, + } + }) + .collect() +} + async fn acquire_release_from_tag(tag: &str) -> Result { let tag = ReleaseTag::from_str(tag).context("invalid release tag")?; let manifest = VersionsManifest::from_github_tag(&tag) @@ -98,14 +142,10 @@ fn release_metadata(manifest: VersionsManifest) -> Result { } } -fn confirm_plan(release: &Release) -> Result<()> { - let tag = release.tag.as_ref().ok_or_else(|| { - anyhow!("Versions manifest doesn't have a release tag. Can only yank tagged releases.") - })?; - +fn confirm_plan(tag: &str, crates: &BTreeMap) -> Result<()> { info!("This will yank aws-sdk-rust's `{tag}` release from crates.io."); info!("Crates to yank:"); - for (crate_name, crate_version) in &release.crates { + for (crate_name, crate_version) in crates { info!(" {}-{}", crate_name, crate_version); } From b84c02bb14af8e6217c053cdd6118677b5049653 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 21 Aug 2023 15:01:35 -0700 Subject: [PATCH 086/331] Remove middleware - part 2 (#2925) This PR continues removing middleware by addressing the simpler `TODO(enableNewSmithyRuntimeCleanup)` comments in the code generator. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-inlineable/Cargo.toml | 3 +- aws/rust-runtime/aws-inlineable/src/lib.rs | 6 - .../aws-inlineable/src/middleware.rs | 88 ----- .../aws-inlineable/src/presigning.rs | 1 + .../aws-inlineable/src/presigning_service.rs | 61 ---- .../tests/middleware_e2e_test.rs | 182 ---------- .../smithy/rustsdk/AwsCodegenDecorator.kt | 1 - .../AwsCustomizableOperationDecorator.kt | 116 +++---- .../rustsdk/AwsFluentClientDecorator.kt | 4 - .../smithy/rustsdk/AwsPresigningDecorator.kt | 126 ------- .../amazon/smithy/rustsdk/AwsRuntimeType.kt | 18 - .../amazon/smithy/rustsdk/CredentialCaches.kt | 34 +- .../rustsdk/HttpRequestChecksumDecorator.kt | 56 ---- .../rustsdk/HttpResponseChecksumDecorator.kt | 60 ---- .../amazon/smithy/rustsdk/RegionDecorator.kt | 30 -- .../rustsdk/RetryClassifierDecorator.kt | 19 -- .../smithy/rustsdk/SigV4AuthDecorator.kt | 72 ++++ .../smithy/rustsdk/SigV4SigningDecorator.kt | 209 ------------ .../smithy/rustsdk/UserAgentDecorator.kt | 40 --- .../customize/glacier/AccountIdAutofill.kt | 47 --- .../customize/glacier/ApiVersionHeader.kt | 39 --- .../customize/glacier/TreeHashHeader.kt | 71 ---- .../customize/route53/Route53Decorator.kt | 18 +- .../timestream/TimestreamDecorator.kt | 2 +- .../test/kotlin/SdkCodegenIntegrationTest.kt | 13 +- .../rustsdk/CredentialCacheConfigTest.kt | 2 +- .../rustsdk/SigV4SigningDecoratorTest.kt | 44 --- .../amazon/smithy/rustsdk/TestUtil.kt | 7 - .../webassembly/src/default_config.rs | 2 +- .../client/smithy/ClientCodegenVisitor.kt | 32 +- .../customizations/EndpointPrefixGenerator.kt | 49 --- .../HttpChecksumRequiredGenerator.kt | 24 -- .../HttpVersionListCustomization.kt | 65 ---- .../IdempotencyTokenGenerator.kt | 13 - .../customizations/TimeSourceCustomization.kt | 19 -- .../customize/RequiredCustomizations.kt | 8 +- .../smithy/endpoint/EndpointsDecorator.kt | 133 -------- .../generators/OperationCustomization.kt | 69 +--- .../smithy/generators/OperationGenerator.kt | 27 +- .../smithy/generators/PaginatorGenerator.kt | 40 +-- .../client/CustomizableOperationDecorator.kt | 4 +- .../client/CustomizableOperationGenerator.kt | 311 ++++++------------ .../client/FluentClientDecorator.kt | 3 - .../generators/client/FluentClientDocs.kt | 158 +-------- .../client/FluentClientGenerator.kt | 56 +--- .../generators/client/FluentClientGenerics.kt | 148 --------- .../protocol/MakeOperationGenerator.kt | 212 ------------ .../protocol/ProtocolParserGenerator.kt | 27 +- .../protocol/ProtocolTestGenerator.kt | 14 +- .../protocol/RequestSerializerGenerator.kt | 8 +- .../protocol/ResponseDeserializerGenerator.kt | 4 +- .../smithy/protocols/ClientProtocolLoader.kt | 30 +- .../protocols/HttpBoundProtocolGenerator.kt | 209 +----------- .../customizations/HttpAuthDecoratorTest.kt | 73 +--- .../MetadataCustomizationTest.kt | 7 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 17 +- .../generators/PaginatorGeneratorTest.kt | 18 +- .../client/FluentClientGeneratorTest.kt | 37 +-- .../ProtocolTestGeneratorMiddlewareTest.kt | 132 -------- .../client/testutil/TestCodegenSettings.kt | 38 --- 60 files changed, 345 insertions(+), 3011 deletions(-) delete mode 100644 aws/rust-runtime/aws-inlineable/src/middleware.rs delete mode 100644 aws/rust-runtime/aws-inlineable/src/presigning_service.rs delete mode 100644 aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt delete mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt delete mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt delete mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 0b8141b092a..6c70fb8e5f6 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -25,7 +25,7 @@ aws-smithy-http-tower = { path = "../../../rust-runtime/aws-smithy-http-tower" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } +aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } aws-types = { path = "../aws-types" } bytes = "1" bytes-utils = "0.1.1" @@ -36,7 +36,6 @@ md-5 = "0.10.1" ring = "0.16" tokio = { version = "1.23.1", features = ["full"] } tokio-stream = "0.1.5" -tower = { version = "0.4", default-features = false } tracing = "0.1" [dev-dependencies] diff --git a/aws/rust-runtime/aws-inlineable/src/lib.rs b/aws/rust-runtime/aws-inlineable/src/lib.rs index 8cc771b9f6a..591d95741db 100644 --- a/aws/rust-runtime/aws-inlineable/src/lib.rs +++ b/aws/rust-runtime/aws-inlineable/src/lib.rs @@ -28,9 +28,6 @@ pub mod no_credentials; /// Support types required for adding presigning to an operation in a generated service. pub mod presigning; -/// Presigning tower service -pub mod presigning_service; - /// Presigning interceptors pub mod presigning_interceptors; @@ -43,9 +40,6 @@ pub mod glacier_checksums; /// Glacier-specific behavior pub mod glacier_interceptors; -/// Default middleware stack for AWS services -pub mod middleware; - /// Strip prefixes from IDs returned by Route53 operations when those IDs are used to construct requests pub mod route53_resource_id_preprocessor_middleware; diff --git a/aws/rust-runtime/aws-inlineable/src/middleware.rs b/aws/rust-runtime/aws-inlineable/src/middleware.rs deleted file mode 100644 index ec66bbbb447..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/middleware.rs +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Base Middleware Stack - -use aws_endpoint::AwsAuthStage; -use aws_http::auth::CredentialsStage; -use aws_http::recursion_detection::RecursionDetectionStage; -use aws_http::user_agent::UserAgentStage; -use aws_sig_auth::middleware::SigV4SigningStage; -use aws_sig_auth::signer::SigV4Signer; -use aws_smithy_http::endpoint::middleware::SmithyEndpointStage; -use aws_smithy_http_tower::map_request::{AsyncMapRequestLayer, MapRequestLayer}; -use std::fmt::Debug; -use tower::ServiceBuilder; - -/// Macro to generate the tower stack type. Arguments should be in reverse order -macro_rules! stack_type { - ($first: ty, $($rest:ty),+) => { - tower::layer::util::Stack<$first, stack_type!($($rest),+)> - }; - ($only: ty) => { - tower::layer::util::Stack<$only, tower::layer::util::Identity> - } -} - -// Note: the layers here appear in reverse order -type DefaultMiddlewareStack = stack_type!( - MapRequestLayer, - MapRequestLayer, - AsyncMapRequestLayer, - MapRequestLayer, - MapRequestLayer, - MapRequestLayer -); - -/// AWS Middleware Stack -/// -/// This implements the middleware stack for this service. It will: -/// 1. Load credentials asynchronously into the property bag -/// 2. Sign the request with SigV4 -/// 3. Resolve an Endpoint for the request -/// 4. Add a user agent to the request -#[derive(Debug, Default, Clone)] -#[non_exhaustive] -pub struct DefaultMiddleware; - -impl DefaultMiddleware { - /// Create a new `DefaultMiddleware` stack - /// - /// Note: `DefaultMiddleware` holds no state. - pub fn new() -> Self { - DefaultMiddleware::default() - } -} - -// define the middleware stack in a non-generic location to reduce code bloat. -fn base() -> ServiceBuilder { - let credential_provider = AsyncMapRequestLayer::for_mapper(CredentialsStage::new()); - let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new())); - let endpoint_stage = MapRequestLayer::for_mapper(SmithyEndpointStage::new()); - let auth_stage = MapRequestLayer::for_mapper(AwsAuthStage); - let user_agent = MapRequestLayer::for_mapper(UserAgentStage::new()); - let recursion_detection = MapRequestLayer::for_mapper(RecursionDetectionStage::new()); - // These layers can be considered as occurring in order, that is: - // 1. Resolve an endpoint - // 2. Add a user agent - // 3. Acquire credentials - // 4. Sign with credentials - // (5. Dispatch over the wire) - ServiceBuilder::new() - .layer(endpoint_stage) - .layer(auth_stage) - .layer(user_agent) - .layer(credential_provider) - .layer(signer) - .layer(recursion_detection) -} - -impl tower::Layer for DefaultMiddleware { - type Service = >::Service; - - fn layer(&self, inner: S) -> Self::Service { - base().service(inner) - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index a6333527693..f2fa01c2c5a 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -174,6 +174,7 @@ impl PresigningConfigBuilder { pub struct PresignedRequest(http::Request<()>); impl PresignedRequest { + #[allow(dead_code)] pub(crate) fn new(inner: http::Request<()>) -> Self { Self(inner) } diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_service.rs b/aws/rust-runtime/aws-inlineable/src/presigning_service.rs deleted file mode 100644 index 3dc1e61768b..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/presigning_service.rs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![allow(dead_code)] - -//! Tower middleware service for creating presigned requests - -use crate::presigning::PresignedRequest; -use aws_smithy_http::operation; -use http::header::USER_AGENT; -use std::future::{ready, Ready}; -use std::marker::PhantomData; -use std::task::{Context, Poll}; - -/// Tower [`Service`](tower::Service) for generated a [`PresignedRequest`] from the AWS middleware. -#[derive(Default, Debug)] -#[non_exhaustive] -pub(crate) struct PresignedRequestService { - _phantom: PhantomData, -} - -// Required because of the derive Clone on MapRequestService. -// Manually implemented to avoid requiring errors to implement Clone. -impl Clone for PresignedRequestService { - fn clone(&self) -> Self { - Self { - _phantom: Default::default(), - } - } -} - -impl PresignedRequestService { - /// Creates a new `PresignedRequestService` - pub(crate) fn new() -> Self { - Self { - _phantom: Default::default(), - } - } -} - -impl tower::Service for PresignedRequestService { - type Response = PresignedRequest; - type Error = E; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let (mut req, _) = req.into_parts(); - - // Remove user agent headers since the request will not be executed by the AWS Rust SDK. - req.headers_mut().remove(USER_AGENT); - req.headers_mut().remove("X-Amz-User-Agent"); - - ready(Ok(PresignedRequest::new(req.map(|_| ())))) - } -} diff --git a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs b/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs deleted file mode 100644 index 1c8f0349f2a..00000000000 --- a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::convert::Infallible; -use std::error::Error; -use std::fmt; -use std::fmt::{Display, Formatter}; -use std::time::{Duration, UNIX_EPOCH}; - -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_credential_types::Credentials; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_types::endpoint::Endpoint; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; -use bytes::Bytes; -use http::header::{AUTHORIZATION, USER_AGENT}; -use http::{self, Uri}; - -use aws_http::retry::AwsResponseRetryClassifier; -use aws_http::user_agent::AwsUserAgent; -use aws_inlineable::middleware::DefaultMiddleware; -use aws_sig_auth::signer::OperationSigningConfig; -use aws_smithy_async::time::SharedTimeSource; -use aws_types::region::SigningRegion; -use aws_types::SigningName; - -type Client = aws_smithy_client::Client; - -#[derive(Clone)] -struct TestOperationParser; - -#[derive(Debug)] -struct OperationError; - -impl Display for OperationError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl Error for OperationError {} - -impl ProvideErrorKind for OperationError { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ThrottlingError) - } - - fn code(&self) -> Option<&str> { - None - } -} - -impl ParseHttpResponse for TestOperationParser { - type Output = Result; - - fn parse_unloaded(&self, response: &mut operation::Response) -> Option { - if response.http().status().is_success() { - Some(Ok("Hello!".to_string())) - } else { - Some(Err(OperationError)) - } - } - - fn parse_loaded(&self, _response: &http::Response) -> Self::Output { - Ok("Hello!".to_string()) - } -} - -fn test_operation() -> Operation { - let req = operation::Request::new( - http::Request::builder() - .uri("/") - .body(SdkBody::from("request body")) - .unwrap(), - ) - .augment(|req, conf| { - conf.insert(aws_smithy_http::endpoint::Result::Ok( - Endpoint::builder() - .url("https://test-service.test-region.amazonaws.com") - .build(), - )); - aws_http::auth::set_credentials_cache( - conf, - CredentialsCache::lazy().create_cache(SharedCredentialsProvider::new( - Credentials::for_tests_with_session_token(), - )), - ); - conf.insert(SigningRegion::from_static("test-region")); - conf.insert(OperationSigningConfig::default_config()); - conf.insert(SigningName::from_static("test-service-signing")); - conf.insert(SharedTimeSource::new( - UNIX_EPOCH + Duration::from_secs(1613414417), - )); - conf.insert(AwsUserAgent::for_tests()); - Result::<_, Infallible>::Ok(req) - }) - .unwrap(); - Operation::new(req, TestOperationParser) - .with_retry_classifier(AwsResponseRetryClassifier::new()) - .with_metadata(operation::Metadata::new("test-op", "test-service")) -} - -#[cfg(feature = "rustls")] -#[test] -fn test_default_client() { - let client = Client::builder() - .dyn_https_connector(Default::default()) - .middleware_fn(|r| r) - .build(); - let _ = client.call(test_operation()); -} - -#[tokio::test] -async fn e2e_test() { - let expected_req = http::Request::builder() - .header(USER_AGENT, "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header(AUTHORIZATION, "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210215/test-region/test-service-signing/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d477055738c4e634c2451b9fc378b6ff2f967d37657c3dd50a1b6a735576960") - .header("x-amz-date", "20210215T184017Z") - .header("x-amz-security-token", "notarealsessiontoken") - .uri(Uri::from_static("https://test-service.test-region.amazonaws.com/")) - .body(SdkBody::from("request body")).unwrap(); - let events = vec![( - expected_req, - http::Response::builder() - .status(200) - .body("response body") - .unwrap(), - )]; - let conn = TestConnection::new(events); - let client = Client::new(conn.clone()); - let resp = client.call(test_operation()).await; - let resp = resp.expect("successful operation"); - assert_eq!(resp, "Hello!"); - - conn.assert_requests_match(&[]); -} - -#[tokio::test] -async fn test_operation_metadata_is_available_to_middlewares() { - let conn = TestConnection::new(vec![( - http::Request::builder() - .header(USER_AGENT, "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header(AUTHORIZATION, "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210215/test-region/test-service-signing/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d477055738c4e634c2451b9fc378b6ff2f967d37657c3dd50a1b6a735576960") - .header("x-amz-date", "20210215T184017Z") - .header("x-amz-security-token", "notarealsessiontoken") - .uri(Uri::from_static("https://test-service.test-region.amazonaws.com/")) - .body(SdkBody::from("request body")).unwrap(), - http::Response::builder() - .status(200) - .body("response body") - .unwrap(), - )]); - let client = aws_smithy_client::Client::builder() - .middleware_fn(|req| { - let metadata = req - .properties() - .get::() - .cloned() - .unwrap(); - - assert_eq!("test-op", metadata.name()); - assert_eq!("test-service", metadata.service()); - - req - }) - .connector(DynConnector::new(conn)) - .build(); - - let resp = client.call(test_operation()).await; - let resp = resp.expect("successful operation"); - assert_eq!(resp, "Hello!"); -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt index 88524efefa1..8a63872df17 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt @@ -35,7 +35,6 @@ val DECORATORS: List = listOf( RequireEndpointRules(), UserAgentDecorator(), SigV4AuthDecorator(), - SigV4SigningDecorator(), HttpRequestChecksumDecorator(), HttpResponseChecksumDecorator(), RetryClassifierDecorator(), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt index 8e15437aa30..cd8fe1bef1d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt @@ -84,82 +84,52 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : override fun section(section: CustomizableOperationSection): Writable = writable { if (section is CustomizableOperationSection.CustomizableOperationImpl) { - if (section.isRuntimeModeOrchestrator) { - // TODO(enableNewSmithyRuntimeCleanup): Delete these utilities - rustTemplate( - """ - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn request_time_for_tests(self, request_time: ::std::time::SystemTime) -> Self { - self.runtime_plugin( - #{StaticRuntimePlugin}::new() - .with_runtime_components( - #{RuntimeComponentsBuilder}::new("request_time_for_tests") - .with_time_source(Some(#{SharedTimeSource}::new(#{StaticTimeSource}::new(request_time)))) - ) - ) - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn user_agent_for_tests(mut self) -> Self { - let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { - let headers = context.request_mut().headers_mut(); - let user_agent = #{AwsUserAgent}::for_tests(); - headers.insert( - #{http}::header::USER_AGENT, - #{http}::HeaderValue::try_from(user_agent.ua_header()).unwrap(), - ); - headers.insert( - #{http}::HeaderName::from_static("x-amz-user-agent"), - #{http}::HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(), - ); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } + // TODO(enableNewSmithyRuntimeCleanup): Delete these utilities + rustTemplate( + """ + ##[doc(hidden)] + // This is a temporary method for testing. NEVER use it in production + pub fn request_time_for_tests(self, request_time: ::std::time::SystemTime) -> Self { + self.runtime_plugin( + #{StaticRuntimePlugin}::new() + .with_runtime_components( + #{RuntimeComponentsBuilder}::new("request_time_for_tests") + .with_time_source(Some(#{SharedTimeSource}::new(#{StaticTimeSource}::new(request_time)))) + ) + ) + } - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn remove_invocation_id_for_tests(mut self) -> Self { - let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { - context.request_mut().headers_mut().remove("amz-sdk-invocation-id"); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - """, - *codegenScope, - ) - } else { - // TODO(enableNewSmithyRuntimeCleanup): Delete this branch when middleware is no longer used - rustTemplate( - """ - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn request_time_for_tests(mut self, request_time: ::std::time::SystemTime) -> Self { - self.operation.properties_mut().insert( - #{SharedTimeSource}::new(#{StaticTimeSource}::new(request_time)) + ##[doc(hidden)] + // This is a temporary method for testing. NEVER use it in production + pub fn user_agent_for_tests(mut self) -> Self { + let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { + let headers = context.request_mut().headers_mut(); + let user_agent = #{AwsUserAgent}::for_tests(); + headers.insert( + #{http}::header::USER_AGENT, + #{http}::HeaderValue::try_from(user_agent.ua_header()).unwrap(), ); - self - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn user_agent_for_tests(mut self) -> Self { - self.operation.properties_mut().insert(#{AwsUserAgent}::for_tests()); - self - } + headers.insert( + #{http}::HeaderName::from_static("x-amz-user-agent"), + #{http}::HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(), + ); + }); + self.interceptors.push(#{SharedInterceptor}::new(interceptor)); + self + } - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn remove_invocation_id_for_tests(self) -> Self { - self - } - """, - *codegenScope, - ) - } + ##[doc(hidden)] + // This is a temporary method for testing. NEVER use it in production + pub fn remove_invocation_id_for_tests(mut self) -> Self { + let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { + context.request_mut().headers_mut().remove("amz-sdk-invocation-id"); + }); + self.interceptors.push(#{SharedInterceptor}::new(interceptor)); + self + } + """, + *codegenScope, + ) } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 21024e3a798..7b69c5c72af 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.client.Fluen import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDocs import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.NoClientGenerics import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.DefaultProtocolTestGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ProtocolTestGenerator import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -56,16 +55,13 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val runtimeConfig = codegenContext.runtimeConfig val types = Types(runtimeConfig) - val generics = NoClientGenerics(runtimeConfig) FluentClientGenerator( codegenContext, reexportSmithyClientBuilder = false, - generics = generics, customizations = listOf( AwsPresignedFluentBuilderMethod(codegenContext), AwsFluentClientDocs(codegenContext), ), - retryClassifier = AwsRuntimeType.awsHttp(runtimeConfig).resolve("retry::AwsResponseRetryClassifier"), ).render(rustCrate, listOf(CustomizableOperationTestHelpers(runtimeConfig))) rustCrate.withModule(ClientRustModule.client) { AwsFluentClientExtensions(codegenContext, types).render(this) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index 5c6f0ff91fe..b8502f0d350 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -19,30 +19,22 @@ import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.RequestSerializerGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientHttpBoundProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.contextName import software.amazon.smithy.rust.codegen.core.util.cloneOperation import software.amazon.smithy.rust.codegen.core.util.expectTrait -import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rustsdk.AwsRuntimeType.defaultMiddleware import software.amazon.smithy.rustsdk.traits.PresignableTrait import kotlin.streams.toList @@ -130,124 +122,6 @@ class AwsPresigningDecorator internal constructor( } } -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up middleware -class AwsInputPresignedMethod( - private val codegenContext: ClientCodegenContext, - private val operationShape: OperationShape, -) : OperationCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val symbolProvider = codegenContext.symbolProvider - - private val codegenScope = ( - presigningTypes + listOf( - "PresignedRequestService" to AwsRuntimeType.presigningService() - .resolve("PresignedRequestService"), - "SdkError" to RuntimeType.sdkError(runtimeConfig), - "aws_sigv4" to AwsRuntimeType.awsSigv4(runtimeConfig), - "sig_auth" to AwsRuntimeType.awsSigAuth(runtimeConfig), - "tower" to RuntimeType.Tower, - "Middleware" to runtimeConfig.defaultMiddleware(), - ) - ).toTypedArray() - - override fun section(section: OperationSection): Writable = - writable { - if (section is OperationSection.InputImpl && section.operationShape.hasTrait()) { - writeInputPresignedMethod(section) - } - } - - private fun RustWriter.writeInputPresignedMethod(section: OperationSection.InputImpl) { - val operationError = symbolProvider.symbolForOperationError(operationShape) - val presignableOp = PRESIGNABLE_OPERATIONS.getValue(operationShape.id) - - val makeOperationOp = if (presignableOp.hasModelTransforms()) { - codegenContext.model.expectShape(syntheticShapeId(operationShape.id), OperationShape::class.java) - } else { - section.operationShape - } - val makeOperationFn = "_make_presigned_operation" - - val protocol = section.protocol - MakeOperationGenerator( - codegenContext, - protocol, - ClientHttpBoundProtocolPayloadGenerator(codegenContext, protocol), - // Prefixed with underscore to avoid colliding with modeled functions - functionName = makeOperationFn, - public = false, - includeDefaultPayloadHeaders = false, - ).generateMakeOperation(this, makeOperationOp, section.customizations) - - documentPresignedMethod(hasConfigArg = true) - rustBlockTemplate( - """ - pub async fn presigned( - self, - config: &crate::config::Config, - presigning_config: #{PresigningConfig} - ) -> Result<#{PresignedRequest}, #{SdkError}<#{OpError}>> - """, - *codegenScope, - "OpError" to operationError, - ) { - rustTemplate( - """ - let (mut request, _) = self.$makeOperationFn(config) - .await - .map_err(#{SdkError}::construction_failure)? - .into_request_response(); - """, - *codegenScope, - ) - rustBlock("") { - rustTemplate( - """ - // Change signature type to query params and wire up presigning config - let mut props = request.properties_mut(); - props.insert(#{SharedTimeSource}::new(#{StaticTimeSource}::new(presigning_config.start_time()))); - """, - "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig) - .resolve("time::SharedTimeSource"), - "StaticTimeSource" to RuntimeType.smithyAsync(runtimeConfig) - .resolve("time::StaticTimeSource"), - ) - withBlock("props.insert(", ");") { - rustTemplate( - "#{aws_sigv4}::http_request::SignableBody::" + - when (presignableOp.payloadSigningType) { - PayloadSigningType.EMPTY -> "Bytes(b\"\")" - PayloadSigningType.UNSIGNED_PAYLOAD -> "UnsignedPayload" - }, - *codegenScope, - ) - } - rustTemplate( - """ - let config = props.get_mut::<#{sig_auth}::signer::OperationSigningConfig>() - .expect("signing config added by make_operation()"); - config.signature_type = #{sig_auth}::signer::HttpSignatureType::HttpRequestQueryParams; - config.expires_in = Some(presigning_config.expires()); - """, - *codegenScope, - ) - } - rustTemplate( - """ - let middleware = #{Middleware}::default(); - let mut svc = #{tower}::builder::ServiceBuilder::new() - .layer(&middleware) - .service(#{PresignedRequestService}::new()); - - use #{tower}::{Service, ServiceExt}; - Ok(svc.ready().await?.call(request).await?) - """, - *codegenScope, - ) - } - } -} - class AwsPresignedFluentBuilderMethod( private val codegenContext: ClientCodegenContext, ) : FluentClientCustomization() { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt index ec7e0ba3d0a..47570de7f42 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt @@ -5,7 +5,6 @@ package software.amazon.smithy.rustsdk -import software.amazon.smithy.codegen.core.CodegenException import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.Visibility import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig @@ -14,16 +13,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import java.io.File import java.nio.file.Path -fun defaultSdkVersion(): String { - // generated as part of the build, see codegen/build.gradle.kts - try { - return object {}.javaClass.getResource("sdk-crate-version.txt")?.readText() - ?: throw CodegenException("sdk-crate-version.txt does not exist") - } catch (ex: Exception) { - throw CodegenException("failed to load sdk-crate-version.txt which sets the default client-runtime version", ex) - } -} - fun RuntimeConfig.awsRoot(): RuntimeCrateLocation { val updatedPath = runtimeCrateLocation.path?.let { cratePath -> val asPath = Path.of(cratePath) @@ -53,10 +42,6 @@ object AwsRuntimeType { ), ) - // TODO(enableNewSmithyRuntimeCleanup): Delete the `presigning_service.rs` inlineable when cleaning up middleware - fun presigningService(): RuntimeType = - RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("presigning_service", visibility = Visibility.PUBCRATE)) - // TODO(enableNewSmithyRuntimeCleanup): Delete defaultMiddleware and middleware.rs, and remove tower dependency from inlinables, when cleaning up middleware fun RuntimeConfig.defaultMiddleware() = RuntimeType.forInlineDependency( InlineAwsDependency.forRustFile( @@ -78,9 +63,6 @@ object AwsRuntimeType { fun awsEndpoint(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsEndpoint(runtimeConfig).toType() fun awsHttp(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsHttp(runtimeConfig).toType() - fun awsSigAuth(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsSigAuth(runtimeConfig).toType() - fun awsSigAuthEventStream(runtimeConfig: RuntimeConfig) = - AwsCargoDependency.awsSigAuthEventStream(runtimeConfig).toType() fun awsSigv4(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsSigv4(runtimeConfig).toType() fun awsTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsTypes(runtimeConfig).toType() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index 5188228b75f..198d1b8bc4c 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -5,18 +5,13 @@ package software.amazon.smithy.rustsdk -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization @@ -25,6 +20,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomizat class CredentialsCacheDecorator : ClientCodegenDecorator { override val name: String = "CredentialsCache" override val order: Byte = 0 + override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, @@ -32,14 +28,6 @@ class CredentialsCacheDecorator : ClientCodegenDecorator { return baseCustomizations + CredentialCacheConfig(codegenContext) } - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations + CredentialsCacheFeature(codegenContext.runtimeConfig) - } - override fun extraSections(codegenContext: ClientCodegenContext): List = listOf( adhocCustomization { section -> @@ -155,23 +143,3 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom } } } - -class CredentialsCacheFeature(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rust( - """ - #T(&mut ${section.request}.properties_mut(), ${section.config}.credentials_cache.clone()); - """, - setCredentialsCache(runtimeConfig), - ) - } - - else -> emptySection - } - } -} - -fun setCredentialsCache(runtimeConfig: RuntimeConfig) = - AwsRuntimeType.awsHttp(runtimeConfig).resolve("auth::set_credentials_cache") diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt index 610ad1c579f..e5d105d4a73 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt @@ -40,20 +40,6 @@ private fun RuntimeConfig.awsInlineableHttpRequestChecksum() = RuntimeType.forIn ), ) -// TODO(enableNewSmithyRuntimeCleanup): Delete this method -fun RuntimeConfig.awsInlineableBodyWithChecksumMiddleware() = RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile( - "http_body_checksum_middleware", visibility = Visibility.PUBCRATE, - CargoDependency.Http, - CargoDependency.HttpBody, - CargoDependency.smithyHttp(this), - CargoDependency.smithyChecksums(this), - CargoDependency.smithyTypes(this), - CargoDependency.Bytes, - CargoDependency.Tracing, - ), -) - class HttpRequestChecksumDecorator : ClientCodegenDecorator { override val name: String = "HttpRequestChecksum" override val order: Byte = 0 @@ -80,8 +66,6 @@ private fun HttpChecksumTrait.requestAlgorithmMember( private fun HttpChecksumTrait.checksumAlgorithmToStr( codegenContext: ClientCodegenContext, operationShape: OperationShape, - // TODO(enableNewSmithyRuntimeCleanup): Remove `algorithmWasCloned` (it should always be false) - algorithmWasCloned: Boolean, ): Writable { val runtimeConfig = codegenContext.runtimeConfig val requestAlgorithmMember = this.requestAlgorithmMember(codegenContext, operationShape) @@ -89,11 +73,6 @@ private fun HttpChecksumTrait.checksumAlgorithmToStr( return { if (requestAlgorithmMember != null) { - if (algorithmWasCloned) { - // User may set checksum for requests, and we need to call as_ref before we can convert the algorithm to a &str - rust("let checksum_algorithm = $requestAlgorithmMember.as_ref();") - } - if (isRequestChecksumRequired) { // Checksums are required, fall back to MD5 rust("""let checksum_algorithm = checksum_algorithm.map(|algorithm| algorithm.as_str()).or(Some("md5"));""") @@ -162,46 +141,11 @@ class HttpRequestChecksumCustomization( "checksum_algorithm_to_str" to checksumTrait.checksumAlgorithmToStr( codegenContext, operationShape, - algorithmWasCloned = false, ), ) } } } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateInput` - is OperationSection.MutateInput -> { - // Various other things will consume the input struct before we can get at the checksum algorithm - // field within it. This ensures that we preserve a copy of it. It's an enum so cloning is cheap. - if (requestAlgorithmMember != null) { - rust("let $requestAlgorithmMember = self.$requestAlgorithmMember().cloned();") - } - } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateRequest` - is OperationSection.MutateRequest -> { - // Return early if no request checksum can be set nor is it required - if (checksumTrait.isRequestChecksumRequired || requestAlgorithmMember != null) { - // `add_checksum_calculation_to_request` handles both streaming and in-memory request bodies. - rustTemplate( - """ - ${section.request} = ${section.request}.augment(|mut req, properties| { - #{checksum_algorithm_to_str:W} - if let Some(checksum_algorithm) = checksum_algorithm { - #{add_checksum_calculation_to_request}(&mut req, properties, checksum_algorithm)?; - } - Result::<_, #{BuildError}>::Ok(req) - })?; - """, - "checksum_algorithm_to_str" to checksumTrait.checksumAlgorithmToStr( - codegenContext, - operationShape, - algorithmWasCloned = true, - ), - "add_checksum_calculation_to_request" to runtimeConfig.awsInlineableBodyWithChecksumMiddleware() - .resolve("add_checksum_calculation_to_request"), - "BuildError" to runtimeConfig.operationBuildError(), - ) - } - } else -> { } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt index 114644daafb..5b35198f8a5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt @@ -113,66 +113,6 @@ class HttpResponseChecksumCustomization( ) } } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateRequest` - is OperationSection.MutateRequest -> { - // Otherwise, we need to set a property that the `MutateOutput` section handler will read to know if it - // should checksum validate the response. - rustTemplate( - """ - if let Some($validationModeName) = self.$validationModeName.as_ref() { - let $validationModeName = $validationModeName.clone(); - // Place #{ValidationModeShape} in the property bag so we can check - // it during response deserialization to see if we need to checksum validate - // the response body. - let _ = request.properties_mut().insert($validationModeName); - } - """, - "ValidationModeShape" to codegenContext.symbolProvider.toSymbol(requestValidationModeMemberInner), - ) - } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateOutput` - is OperationSection.MutateOutput -> { - if (!section.propertyBagAvailable) { - return@writable - } - - // CRC32, CRC32C, SHA256, SHA1 -> "crc32", "crc32c", "sha256", "sha1" - val responseAlgorithms = checksumTrait.responseAlgorithms - .map { algorithm -> algorithm.lowercase() }.joinToString(", ") { algorithm -> "\"$algorithm\"" } - - rustTemplate( - """ - let response_algorithms = [$responseAlgorithms].as_slice(); - let $validationModeName = properties.get::<#{ValidationModeShape}>(); - // Per [the spec](https://smithy.io/2.0/aws/aws-core.html##http-response-checksums), - // we check to see if it's the `ENABLED` variant - if matches!($validationModeName, Some(&#{ValidationModeShape}::Enabled)) { - if let Some((checksum_algorithm, precalculated_checksum)) = - #{check_headers_for_precalculated_checksum}( - response.headers(), - response_algorithms, - ) - { - let bytestream = output.body.take().map(|bytestream| { - bytestream.map(move |sdk_body| { - #{wrap_body_with_checksum_validator}( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }) - }); - output = output.set_body(bytestream); - } - } - """, - "ValidationModeShape" to codegenContext.symbolProvider.toSymbol(requestValidationModeMemberInner), - "wrap_body_with_checksum_validator" to codegenContext.runtimeConfig.awsInlineableBodyWithChecksumMiddleware() - .resolve("wrap_body_with_checksum_validator"), - "check_headers_for_precalculated_checksum" to codegenContext.runtimeConfig.awsInlineableBodyWithChecksumMiddleware() - .resolve("check_headers_for_precalculated_checksum"), - ) - } else -> {} } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index d8a5fc70525..804e4ec3c32 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -6,15 +6,12 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.model.node.Node -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -93,14 +90,6 @@ class RegionDecorator : ClientCodegenDecorator { } } - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations.extendIf(usesRegion(codegenContext)) { RegionConfigPlugin() } - } - override fun extraSections(codegenContext: ClientCodegenContext): List { return usesRegion(codegenContext).thenSingletonListOf { adhocCustomization { section -> @@ -216,23 +205,4 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi } } -class RegionConfigPlugin : OperationCustomization() { - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - // Allow the region to be late-inserted via another method - rust( - """ - if let Some(region) = &${section.config}.region { - ${section.request}.properties_mut().insert(region.clone()); - } - """, - ) - } - - else -> emptySection - } - } -} - fun region(runtimeConfig: RuntimeConfig) = AwsRuntimeType.awsTypes(runtimeConfig).resolve("region") diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt index e60fe986152..12fec399682 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt @@ -10,10 +10,8 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType class RetryClassifierDecorator : ClientCodegenDecorator { @@ -25,26 +23,9 @@ class RetryClassifierDecorator : ClientCodegenDecorator { operation: OperationShape, baseCustomizations: List, ): List = baseCustomizations + - RetryClassifierFeature(codegenContext.runtimeConfig) + OperationRetryClassifiersFeature(codegenContext, operation) } -class RetryClassifierFeature(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { - override fun retryType(): RuntimeType = - AwsRuntimeType.awsHttp(runtimeConfig).resolve("retry::AwsResponseRetryClassifier") - - override fun section(section: OperationSection) = when (section) { - is OperationSection.FinalizeOperation -> writable { - rust( - "let ${section.operation} = ${section.operation}.with_retry_classifier(#T::new());", - retryType(), - ) - } - - else -> emptySection - } -} - class OperationRetryClassifiersFeature( codegenContext: ClientCodegenContext, operation: OperationShape, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 5f92d6ee1c2..90b6fd3ce57 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -9,6 +9,8 @@ import software.amazon.smithy.aws.traits.auth.SigV4Trait import software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator @@ -16,11 +18,16 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCus import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.dq +import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.isInputEventStream @@ -52,6 +59,55 @@ class SigV4AuthDecorator : ClientCodegenDecorator { operation: OperationShape, baseCustomizations: List, ): List = baseCustomizations + AuthOperationCustomization(codegenContext) + + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = + baseCustomizations + SigV4SigningConfig(codegenContext.runtimeConfig, codegenContext.serviceShape.getTrait()) +} + +private class SigV4SigningConfig( + runtimeConfig: RuntimeConfig, + private val sigV4Trait: SigV4Trait?, +) : ConfigCustomization() { + private val codegenScope = arrayOf( + "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), + "SigningName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningName"), + "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), + ) + + override fun section(section: ServiceConfig): Writable = writable { + if (sigV4Trait != null) { + when (section) { + ServiceConfig.ConfigImpl -> { + rust( + """ + /// The signature version 4 service signing name to use in the credential scope when signing requests. + /// + /// The signing service may be overridden by the `Endpoint`, or by specifying a custom + /// [`SigningName`](aws_types::SigningName) during operation construction + pub fn signing_name(&self) -> &'static str { + ${sigV4Trait.name.dq()} + } + """, + ) + } + + ServiceConfig.BuilderBuild -> { + rustTemplate( + """ + layer.store_put(#{SigningName}::from_static(${sigV4Trait.name.dq()})); + layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); + """, + *codegenScope, + ) + } + + else -> {} + } + } + } } private class AuthServiceRuntimePluginCustomization(private val codegenContext: ClientCodegenContext) : @@ -83,6 +139,22 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: } } +private fun needsAmzSha256(service: ServiceShape) = when (service.id) { + ShapeId.from("com.amazonaws.s3#AmazonS3") -> true + ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820") -> true + else -> false +} + +private fun disableDoubleEncode(service: ServiceShape) = when (service.id) { + ShapeId.from("com.amazonaws.s3#AmazonS3") -> true + else -> false +} + +private fun disableUriPathNormalization(service: ServiceShape) = when (service.id) { + ShapeId.from("com.amazonaws.s3#AmazonS3") -> true + else -> false +} + private class AuthOperationCustomization(private val codegenContext: ClientCodegenContext) : OperationCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope by lazy { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt deleted file mode 100644 index e79044c797f..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.aws.traits.auth.SigV4Trait -import software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait -import software.amazon.smithy.model.Model -import software.amazon.smithy.model.knowledge.ServiceIndex -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ServiceShape -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.model.traits.OptionalAuthTrait -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.expectTrait -import software.amazon.smithy.rust.codegen.core.util.extendIf -import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations -import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.isInputEventStream - -// TODO(enableNewSmithyRuntimeCleanup): Remove this decorator (superseded by SigV4AuthDecorator) -/** - * The SigV4SigningDecorator: - * - adds a `name()` method to `config` to return the default signing service - * - adds a `new_event_stream_signer()` method to `config` to create an Event Stream SigV4 signer - * - sets the `SigningName` during operation construction - * - sets a default `OperationSigningConfig` A future enhancement will customize this for specific services that need - * different behavior. - */ -class SigV4SigningDecorator : ClientCodegenDecorator { - override val name: String = "SigV4Signing" - override val order: Byte = 0 - - private fun applies(codegenContext: CodegenContext): Boolean = codegenContext.serviceShape.hasTrait() - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List { - return baseCustomizations.extendIf(applies(codegenContext)) { - SigV4SigningConfig( - codegenContext.runtimeConfig, - codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model), - codegenContext.serviceShape.expectTrait(), - ) - } - } - - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations.extendIf(applies(codegenContext)) { - SigV4SigningFeature( - codegenContext.model, - operation, - codegenContext.runtimeConfig, - codegenContext.serviceShape, - ) - } - } -} - -class SigV4SigningConfig( - private val runtimeConfig: RuntimeConfig, - private val serviceHasEventStream: Boolean, - private val sigV4Trait: SigV4Trait, -) : ConfigCustomization() { - private val codegenScope = arrayOf( - "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), - "SigningName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningName"), - "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), - ) - - override fun section(section: ServiceConfig): Writable = writable { - when (section) { - ServiceConfig.ConfigImpl -> { - rust( - """ - /// The signature version 4 service signing name to use in the credential scope when signing requests. - /// - /// The signing name may be overridden by the `Endpoint`, or by specifying a custom - /// [`SigningName`](aws_types::SigningName) during operation construction - pub fn name(&self) -> &'static str { - ${sigV4Trait.name.dq()} - } - """, - ) - } - ServiceConfig.BuilderBuild -> { - rustTemplate( - """ - layer.store_put(#{SigningName}::from_static(${sigV4Trait.name.dq()})); - layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); - """, - *codegenScope, - ) - } - - else -> emptySection - } - } -} - -fun needsAmzSha256(service: ServiceShape) = when (service.id) { - ShapeId.from("com.amazonaws.s3#AmazonS3") -> true - ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820") -> true - else -> false -} - -fun disableDoubleEncode(service: ServiceShape) = when (service.id) { - ShapeId.from("com.amazonaws.s3#AmazonS3") -> true - else -> false -} - -fun disableUriPathNormalization(service: ServiceShape) = when (service.id) { - ShapeId.from("com.amazonaws.s3#AmazonS3") -> true - else -> false -} - -class SigV4SigningFeature( - private val model: Model, - private val operation: OperationShape, - runtimeConfig: RuntimeConfig, - private val service: ServiceShape, -) : - OperationCustomization() { - private val codegenScope = arrayOf( - "sig_auth" to AwsRuntimeType.awsSigAuth(runtimeConfig), - "aws_types" to AwsRuntimeType.awsTypes(runtimeConfig), - ) - - private val serviceIndex = ServiceIndex.of(model) - - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - "let mut signing_config = #{sig_auth}::signer::OperationSigningConfig::default_config();", - *codegenScope, - ) - if (needsAmzSha256(service)) { - rust("signing_config.signing_options.content_sha256_header = true;") - } - if (disableDoubleEncode(service)) { - rust("signing_config.signing_options.double_uri_encode = false;") - } - if (disableUriPathNormalization(service)) { - rust("signing_config.signing_options.normalize_uri_path = false;") - } - if (operation.hasTrait()) { - rust("signing_config.signing_options.content_sha256_header = true;") - rustTemplate( - "${section.request}.properties_mut().insert(#{sig_auth}::signer::SignableBody::UnsignedPayload);", - *codegenScope, - ) - } else if (operation.isInputEventStream(model)) { - // TODO(EventStream): Is this actually correct for all Event Stream operations? - rustTemplate( - "${section.request}.properties_mut().insert(#{sig_auth}::signer::SignableBody::Bytes(&[]));", - *codegenScope, - ) - } - // some operations are either unsigned or optionally signed: - val authSchemes = serviceIndex.getEffectiveAuthSchemes(service, operation) - if (!authSchemes.containsKey(SigV4Trait.ID)) { - rustTemplate( - "signing_config.signing_requirements = #{sig_auth}::signer::SigningRequirements::Disabled;", - *codegenScope, - ) - } else { - if (operation.hasTrait()) { - rustTemplate( - "signing_config.signing_requirements = #{sig_auth}::signer::SigningRequirements::Optional;", - *codegenScope, - ) - } - } - rustTemplate( - """ - ${section.request}.properties_mut().insert(signing_config); - ${section.request}.properties_mut().insert(#{aws_types}::SigningName::from_static(${section.config}.name())); - if let Some(region) = &${section.config}.region { - ${section.request}.properties_mut().insert(#{aws_types}::region::SigningRegion::from(region.clone())); - } - """, - *codegenScope, - ) - } - - else -> emptySection - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index a5f2c7003fb..5d1ee8cb91e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -6,12 +6,9 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.aws.traits.ServiceTrait -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization @@ -42,14 +39,6 @@ class UserAgentDecorator : ClientCodegenDecorator { return baseCustomizations + AppNameCustomization(codegenContext) } - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations + UserAgentMutateOpRequest(codegenContext) - } - override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, @@ -111,35 +100,6 @@ class UserAgentDecorator : ClientCodegenDecorator { } } - // TODO(enableNewSmithyRuntimeCleanup): Remove this customization class - private class UserAgentMutateOpRequest( - codegenContext: ClientCodegenContext, - ) : OperationCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - let mut user_agent = #{ua_module}::AwsUserAgent::new_from_environment( - #{Env}::real(), - #{meta}::API_METADATA.clone(), - ); - if let Some(app_name) = _config.app_name() { - user_agent = user_agent.with_app_name(app_name.clone()); - } - ${section.request}.properties_mut().insert(user_agent); - """, - "meta" to ClientRustModule.Meta, - "ua_module" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent"), - "Env" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("os_shim_internal::Env"), - ) - } - - else -> emptySection - } - } - private class AppNameCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt deleted file mode 100644 index 6b18ca91166..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk.customize.glacier - -import software.amazon.smithy.model.Model -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.inputShape - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware. - -class AccountIdAutofill : OperationCustomization() { - override fun mutSelf(): Boolean = true - override fun consumesSelf(): Boolean = false - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateInput -> writable { - rust( - """ - if ${section.input}.account_id.as_deref().unwrap_or_default().is_empty() { - ${section.input}.account_id = Some("-".to_owned()); - } - """, - ) - } - else -> emptySection - } - } - - companion object { - fun forOperation(operation: OperationShape, model: Model): AccountIdAutofill? { - val input = operation.inputShape(model) - return if (input.memberNames.contains("accountId")) { - AccountIdAutofill() - } else { - null - } - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt deleted file mode 100644 index 093bd610610..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk.customize.glacier - -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.dq - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware. - -class ApiVersionHeader( - /** - * ApiVersion - * This usually comes from the `version` field of the service shape and is usually a date like "2012-06-01" - * */ - private val apiVersion: String, -) : OperationCustomization() { - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.FinalizeOperation -> emptySection - is OperationSection.OperationImplBlock -> emptySection - is OperationSection.MutateRequest -> writable { - rust( - """${section.request} - .http_mut() - .headers_mut() - .insert("x-amz-glacier-version", #T::HeaderValue::from_static(${apiVersion.dq()}));""", - RuntimeType.Http, - ) - } - else -> emptySection - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt deleted file mode 100644 index ff03c29dda4..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk.customize.glacier - -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError -import software.amazon.smithy.rustsdk.InlineAwsDependency - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware. - -val TreeHashDependencies = listOf( - CargoDependency.Ring, - CargoDependency.TokioStream, - CargoDependency.BytesUtils, - CargoDependency.Bytes, - CargoDependency.Tokio, - CargoDependency.Hex, - CargoDependency.TempFile, -) - -private val UploadArchive: ShapeId = ShapeId.from("com.amazonaws.glacier#UploadArchive") -private val UploadMultipartPart: ShapeId = ShapeId.from("com.amazonaws.glacier#UploadMultipartPart") -private val Applies = setOf(UploadArchive, UploadMultipartPart) - -class TreeHashHeader(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { - private val glacierChecksums = RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile( - "glacier_checksums", - additionalDependency = TreeHashDependencies.toTypedArray(), - ), - ) - - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - #{glacier_checksums}::add_checksum_treehash( - &mut ${section.request} - ).await.map_err(#{BuildError}::other)?; - """, - "glacier_checksums" to glacierChecksums, "BuildError" to runtimeConfig.operationBuildError(), - ) - } - - else -> emptySection - } - } - - companion object { - fun forOperation(operation: OperationShape, runtimeConfig: RuntimeConfig): TreeHashHeader? { - return if (Applies.contains(operation.id)) { - TreeHashHeader(runtimeConfig) - } else { - null - } - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt index 9e0888fa396..bf1b3862496 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt @@ -69,26 +69,10 @@ class TrimResourceIdCustomization( private val codegenContext: ClientCodegenContext, private val inputShape: StructureShape, private val fieldName: String, -) : - OperationCustomization() { - override fun mutSelf(): Boolean = true - override fun consumesSelf(): Boolean = true +) : OperationCustomization() { override fun section(section: OperationSection): Writable = writable { when (section) { - // TODO(enableNewSmithyRuntimeCleanup): Delete this `MutateInput` section - is OperationSection.MutateInput -> { - val trimResourceId = - RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile("route53_resource_id_preprocessor_middleware"), - ) - .resolve("trim_resource_id") - rustTemplate( - "#{trim_resource_id}(&mut ${section.input}.$fieldName);", - "trim_resource_id" to trimResourceId, - ) - } - is OperationSection.AdditionalInterceptors -> { section.registerInterceptor(codegenContext.runtimeConfig, this) { val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index d274c5b1838..503d8ae4f3a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -61,7 +61,7 @@ class TimestreamDecorator : ClientCodegenDecorator { #{ResolveEndpointError}::from_source("failed to call describe_endpoints", e) })?; let endpoint = describe_endpoints.endpoints().unwrap().get(0).unwrap(); - let expiry = client.conf().time_source().expect("checked when ep discovery was enabled").now() + let expiry = client.config().time_source().expect("checked when ep discovery was enabled").now() + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); Ok(( #{Endpoint}::builder() diff --git a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt index 02ae9071d33..da4f7196258 100644 --- a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt @@ -48,17 +48,6 @@ class SdkCodegenIntegrationTest { @Test fun smokeTestSdkCodegen() { - awsSdkIntegrationTest( - model, - generateOrchestrator = true, - ) { _, _ -> /* it should compile */ } - } - - @Test - fun smokeTestSdkCodegenMiddleware() { - awsSdkIntegrationTest( - model, - generateOrchestrator = false, - ) { _, _ -> /* it should compile */ } + awsSdkIntegrationTest(model) { _, _ -> /* it should compile */ } } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt index 960d3adbaf3..699e425d871 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt @@ -48,7 +48,7 @@ internal class CredentialCacheConfigTest { @Test fun `config override for credentials`() { - awsSdkIntegrationTest(model, generateOrchestrator = true) { clientCodegenContext, rustCrate -> + awsSdkIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *RuntimeType.preludeScope, diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt deleted file mode 100644 index da7df577652..00000000000 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import org.junit.jupiter.api.Test -import software.amazon.smithy.aws.traits.auth.SigV4Trait -import software.amazon.smithy.rust.codegen.client.testutil.stubConfigProject -import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest - -internal class SigV4SigningDecoratorTest { - @Test - fun `generates a valid config`() { - val codegenContext = awsTestCodegenContext( - settings = testClientRustSettings( - runtimeConfig = AwsTestRuntimeConfig, - ), - ) - val project = stubConfigProject( - codegenContext, - SigV4SigningConfig( - codegenContext.runtimeConfig, - true, - SigV4Trait.builder().name("test-service").build(), - ), - TestWorkspace.testProject(), - ) - project.lib { - unitTest( - "signing_name_override", - """ - let conf = crate::config::Config::builder().build(); - assert_eq!(conf.name(), "test-service"); - """, - ) - } - project.compileAndTest() - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 44ed5461a9b..34905620b86 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.model.Model import software.amazon.smithy.model.node.ObjectNode -import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest @@ -18,7 +17,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.util.letIf import java.io.File // In aws-sdk-codegen, the working dir when gradle runs tests is actually `./aws`. So, to find the smithy runtime, we need @@ -37,10 +35,8 @@ fun awsTestCodegenContext(model: Model? = null, settings: ClientRustSettings? = settings = settings ?: testClientRustSettings(runtimeConfig = AwsTestRuntimeConfig), ) -// TODO(enableNewSmithyRuntimeCleanup): Remove generateOrchestrator once the runtime switches to the orchestrator fun awsSdkIntegrationTest( model: Model, - generateOrchestrator: Boolean = true, test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> }, ) = clientIntegrationTest( @@ -63,9 +59,6 @@ fun awsSdkIntegrationTest( "codegen", ObjectNode.builder() .withMember("includeFluentClient", false) - .letIf(generateOrchestrator) { - it.withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")) - } .build(), ).build(), ), diff --git a/aws/sdk/integration-tests/webassembly/src/default_config.rs b/aws/sdk/integration-tests/webassembly/src/default_config.rs index fd8899cbe0f..181d1bb4707 100644 --- a/aws/sdk/integration-tests/webassembly/src/default_config.rs +++ b/aws/sdk/integration-tests/webassembly/src/default_config.rs @@ -29,5 +29,5 @@ pub(crate) fn get_default_config() -> impl Future - EndpointTraitBindings( - codegenContext.model, - codegenContext.symbolProvider, - codegenContext.runtimeConfig, - shape, - epTrait, - ) - }.orNull() - } - - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.MutateRequest -> writable { - endpointTraitBindings(codegenContext, shape)?.also { endpointTraitBindings -> - withBlock("let endpoint_prefix = ", "?;") { - endpointTraitBindings.render(this, "self") - } - rust("request.properties_mut().insert(endpoint_prefix);") - } - } - - else -> emptySection - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt index e654b48421d..94c37d0d732 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt @@ -19,8 +19,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -53,28 +51,6 @@ class HttpChecksumRequiredGenerator( ) } } - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - ${section.request} = ${section.request}.augment(|mut req, _| { - let data = req - .body() - .bytes() - .expect("checksum can only be computed for non-streaming operations"); - let checksum = <#{md5}::Md5 as #{md5}::Digest>::digest(data); - req.headers_mut().insert( - #{http}::header::HeaderName::from_static("content-md5"), - #{base64_encode}(&checksum[..]).parse().expect("checksum is valid header value") - ); - Result::<_, #{BuildError}>::Ok(req) - })?; - """, - "md5" to RuntimeType.Md5, - "http" to RuntimeType.Http, - "base64_encode" to RuntimeType.base64Encode(codegenContext.runtimeConfig), - "BuildError" to codegenContext.runtimeConfig.operationBuildError(), - ) - } else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt deleted file mode 100644 index 43dab5ba8c1..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.aws.traits.protocols.AwsProtocolTrait -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.getTrait -import software.amazon.smithy.rust.codegen.core.util.isEventStream - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file - -class HttpVersionListCustomization( - private val codegenContext: CodegenContext, - private val operationShape: OperationShape, -) : OperationCustomization() { - override fun section(section: OperationSection): Writable { - val runtimeConfig = codegenContext.runtimeConfig - val awsProtocolTrait = codegenContext.serviceShape.getTrait() - val supportedHttpProtocolVersions = if (awsProtocolTrait == null) { - // No protocol trait was defined, use default http versions - "#{defaultHttpVersions}.clone()" - } else { - // Figure out whether we're dealing with an EventStream operation and fetch the corresponding list of desired HTTP versions - val versionList = if (operationShape.isEventStream(codegenContext.model)) awsProtocolTrait.eventStreamHttp else awsProtocolTrait.http - if (versionList.isEmpty()) { - // If no desired versions are specified, go with the default - "#{defaultHttpVersions}.clone()" - } else { - // otherwise, use the specified versions - "vec![${versionList.joinToString(",") { version -> mapHttpVersion(version) }}]" - } - } - - return when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - ${section.request}.properties_mut().insert($supportedHttpProtocolVersions); - """, - "defaultHttpVersions" to RuntimeType.smithyHttp(runtimeConfig).resolve("http_versions::DEFAULT_HTTP_VERSION_LIST"), - ) - } - else -> emptySection - } - } -} - -// Map an ALPN protocol ID to a version from the `http` Rust crate -private fun mapHttpVersion(httpVersion: String): String { - return when (httpVersion) { - "http/1.1" -> "http::Version::HTTP_11" - "h2" -> "http::Version::HTTP_2" - else -> TODO("Unsupported HTTP version '$httpVersion', please check your model") - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt index 3ee06bcea54..eead91bbe0f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt @@ -61,20 +61,7 @@ class IdempotencyTokenGenerator( ) } } - is OperationSection.MutateInput -> writable { - rustTemplate( - """ - if ${section.input}.$memberName.is_none() { - ${section.input}.$memberName = #{Some}(${section.config}.idempotency_token_provider.make_idempotency_token()); - } - """, - *preludeScope, - ) - } else -> emptySection } } - - override fun consumesSelf(): Boolean = idempotencyTokenMember != null - override fun mutSelf(): Boolean = idempotencyTokenMember != null } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index 216779ca268..f3402c950df 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -6,11 +6,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -100,19 +97,3 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust } } } - -class TimeSourceOperationCustomization : OperationCustomization() { - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rust( - """ - ${section.request}.properties_mut().insert(${section.config}.time_source.clone()); - """, - ) - } - - else -> emptySection - } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 88858a652e9..80347a24259 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -9,9 +9,7 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customizations.ConnectionPoisoningRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.EndpointPrefixGenerator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpChecksumRequiredGenerator -import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpVersionListCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenGenerator import software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization @@ -19,7 +17,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.Resilien import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyReExportCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.TimeSourceCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.TimeSourceOperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization @@ -50,10 +47,7 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations + MetadataCustomization(codegenContext, operation) + IdempotencyTokenGenerator(codegenContext, operation) + - EndpointPrefixGenerator(codegenContext, operation) + - HttpChecksumRequiredGenerator(codegenContext, operation) + - HttpVersionListCustomization(codegenContext, operation) + - TimeSourceOperationCustomization() + HttpChecksumRequiredGenerator(codegenContext, operation) override fun configCustomizations( codegenContext: ClientCodegenContext, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index ba197e35f1c..56ab7656065 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -5,33 +5,17 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.Node -import software.amazon.smithy.model.node.StringNode -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeType import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter -import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters -import software.amazon.smithy.rulesengine.traits.ContextIndex import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.endpointTestsModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate -import software.amazon.smithy.rust.codegen.core.util.PANIC -import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.orNull /** * BuiltInResolver enables potentially external codegen stages to provide sources for `builtIn` parameters. @@ -102,18 +86,6 @@ class EndpointsDecorator : ClientCodegenDecorator { override val name: String = "Endpoints" override val order: Byte = 0 - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations + InjectEndpointInMakeOperation( - codegenContext, - EndpointTypesGenerator.fromContext(codegenContext), - operation, - ) - } - override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { return listOf( object : EndpointCustomization { @@ -140,109 +112,4 @@ class EndpointsDecorator : ClientCodegenDecorator { } } } - - /** - * Creates an `::endpoint_resolver::Params` structure in make operation generator. This combines state from the - * client, the operation, and the model to create parameters. - * - * Example generated code: - * ```rust - * let _endpoint_params = crate::endpoint_resolver::Params::builder() - * .set_region(Some("test-region")) - * .set_disable_everything(Some(true)) - * .set_bucket(input.bucket.as_ref()) - * .build(); - * ``` - */ - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization - class InjectEndpointInMakeOperation( - private val ctx: ClientCodegenContext, - private val typesGenerator: EndpointTypesGenerator, - private val operationShape: OperationShape, - ) : - OperationCustomization() { - - private val idx = ContextIndex.of(ctx.model) - private val types = Types(ctx.runtimeConfig) - - override fun section(section: OperationSection): Writable { - val codegenScope = arrayOf( - *RuntimeType.preludeScope, - "Params" to typesGenerator.paramsStruct(), - "ResolveEndpoint" to types.resolveEndpoint, - "ResolveEndpointError" to types.resolveEndpointError, - ) - return when (section) { - is OperationSection.MutateInput -> writable { - rustTemplate( - """ - use #{ResolveEndpoint}; - let params_result = #{Params}::builder()#{builderFields:W}.build() - .map_err(|err| #{ResolveEndpointError}::from_source("could not construct endpoint parameters", err)); - let (endpoint_result, params) = match params_result { - #{Ok}(params) => (${section.config}.endpoint_resolver.resolve_endpoint(¶ms), #{Some}(params)), - #{Err}(e) => (#{Err}(e), #{None}) - }; - """, - "builderFields" to builderFields(typesGenerator.params, section), - *codegenScope, - ) - } - - is OperationSection.MutateRequest -> writable { - // insert the endpoint the bag - rustTemplate("${section.request}.properties_mut().insert(endpoint_result);") - rustTemplate("""if let #{Some}(params) = params { ${section.request}.properties_mut().insert(params); }""", *codegenScope) - } - - else -> emptySection - } - } - - private fun Node.toWritable(): Writable { - val node = this - return writable { - when (node) { - is StringNode -> rustTemplate("#{Some}(${node.value.dq()}.to_string())", *RuntimeType.preludeScope) - is BooleanNode -> rustTemplate("#{Some}(${node.value})", *RuntimeType.preludeScope) - else -> PANIC("unsupported default value: $node") - } - } - } - - private fun builderFields(params: Parameters, section: OperationSection.MutateInput) = writable { - val memberParams = idx.getContextParams(operationShape).toList().sortedBy { it.first.memberName } - val builtInParams = params.toList().filter { it.isBuiltIn } - // first load builtins and their defaults - builtInParams.forEach { param -> - typesGenerator.builtInFor(param, section.config)?.also { defaultValue -> - rust(".set_${param.name.rustName()}(#W)", defaultValue) - } - } - - idx.getClientContextParams(ctx.serviceShape).orNull()?.parameters?.forEach { (name, param) -> - val paramName = EndpointParamsGenerator.memberName(name) - val setterName = EndpointParamsGenerator.setterName(name) - if (param.type == ShapeType.BOOLEAN) { - rust(".$setterName(${section.config}.$paramName)") - } else { - rust(".$setterName(${section.config}.$paramName.clone())") - } - } - - idx.getStaticContextParams(operationShape).orNull()?.parameters?.forEach { (name, param) -> - val setterName = EndpointParamsGenerator.setterName(name) - val value = param.value.toWritable() - rust(".$setterName(#W)", value) - } - - // lastly, allow these to be overridden by members - memberParams.forEach { (memberShape, param) -> - val memberName = ctx.symbolProvider.toMemberName(memberShape) - rust( - ".${EndpointParamsGenerator.setterName(param.name)}(${section.input}.$memberName.clone())", - ) - } - } - } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index 90552c3659b..7088dbdb02e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -6,7 +6,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -14,7 +13,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol sealed class OperationSection(name: String) : Section(name) { abstract val customizations: List @@ -23,55 +21,11 @@ sealed class OperationSection(name: String) : Section(name) { data class OperationImplBlock(override val customizations: List) : OperationSection("OperationImplBlock") - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - /** Write additional functions inside the Input's impl block */ - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class InputImpl( - override val customizations: List, - val operationShape: OperationShape, - val inputShape: StructureShape, - val protocol: Protocol, - ) : OperationSection("InputImpl") - - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class MutateInput( - override val customizations: List, - val input: String, - val config: String, - ) : OperationSection("MutateInput") - - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - /** Write custom code into the block that builds an operation - * - * [request]: Name of the variable holding the `aws_smithy_http::Request` - * [config]: Name of the variable holding the service config. - * - * */ - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class MutateRequest( - override val customizations: List, - val request: String, - val config: String, - ) : OperationSection("Feature") - - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class FinalizeOperation( - override val customizations: List, - val operation: String, - val config: String, - ) : OperationSection("Finalize") - data class MutateOutput( override val customizations: List, val operationShape: OperationShape, /** Name of the response headers map (for referring to it in Rust code) */ val responseHeadersName: String, - - // TODO(enableNewSmithyRuntimeCleanup): Remove this flag when switching to the orchestrator - /** Whether the property bag exists in this context */ - val propertyBagAvailable: Boolean, ) : OperationSection("MutateOutput") /** @@ -167,25 +121,4 @@ sealed class OperationSection(name: String) : Section(name) { } } -abstract class OperationCustomization : NamedCustomization() { - // TODO(enableNewSmithyRuntimeCleanup): Delete this when cleaning up middleware - @Deprecated("property for middleware; won't be used in the orchestrator impl") - open fun retryType(): RuntimeType? = null - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when cleaning up middleware - /** - * Does `make_operation` consume the self parameter? - * - * This is required for things like idempotency tokens where the operation can only be sent once - * and an idempotency token will mutate the request. - */ - @Deprecated("property for middleware; won't be used in the orchestrator impl") - open fun consumesSelf(): Boolean = false - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when cleaning up middleware - /** - * Does `make_operation` mutate the self parameter? - */ - @Deprecated("property for middleware; won't be used in the orchestrator impl") - open fun mutSelf(): Boolean = false -} +abstract class OperationCustomization : NamedCustomization() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 9e17d3ccb3a..9a3793b7669 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -10,10 +10,9 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsInterceptorGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.RequestSerializerGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ResponseDeserializerGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator +import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientHttpBoundProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter @@ -36,15 +35,9 @@ import software.amazon.smithy.rust.codegen.core.util.sdkId open class OperationGenerator( private val codegenContext: ClientCodegenContext, private val protocol: Protocol, - /** - * Operations generate a `make_operation(&config)` method to build a `aws_smithy_http::Operation` that can be dispatched - * This is the serializer side of request dispatch - */ - // TODO(enableNewSmithyRuntimeCleanup): Remove the `makeOperationGenerator` - private val makeOperationGenerator: MakeOperationGenerator, - private val bodyGenerator: ProtocolPayloadGenerator, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `traitGenerator` - private val traitGenerator: HttpBoundProtocolTraitImplGenerator, + private val bodyGenerator: ProtocolPayloadGenerator = ClientHttpBoundProtocolPayloadGenerator( + codegenContext, protocol, + ), ) { private val model = codegenContext.model private val runtimeConfig = codegenContext.runtimeConfig @@ -55,22 +48,10 @@ open class OperationGenerator( */ fun renderOperation( operationWriter: RustWriter, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `inputWriter` since `make_operation` generation is going away - inputWriter: RustWriter, operationShape: OperationShape, codegenDecorator: ClientCodegenDecorator, ) { val operationCustomizations = codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList()) - val inputShape = operationShape.inputShape(model) - - // impl OperationInputShape { ... } - inputWriter.implBlock(symbolProvider.toSymbol(inputShape)) { - writeCustomizations( - operationCustomizations, - OperationSection.InputImpl(operationCustomizations, operationShape, inputShape, protocol), - ) - } - renderOperationStruct( operationWriter, operationShape, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index f935da5e94d..dedc50f31f8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -11,7 +11,6 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.IdempotencyTokenTrait import software.amazon.smithy.model.traits.PaginatedTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerics import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -38,23 +37,14 @@ fun OperationShape.isPaginated(model: Model) = class PaginatorGenerator private constructor( private val codegenContext: ClientCodegenContext, operation: OperationShape, - private val generics: FluentClientGenerics, - retryClassifier: RuntimeType, ) { companion object { fun paginatorType( codegenContext: ClientCodegenContext, - generics: FluentClientGenerics, operationShape: OperationShape, - retryClassifier: RuntimeType, ): RuntimeType? { return if (operationShape.isPaginated(codegenContext.model)) { - PaginatorGenerator( - codegenContext, - operationShape, - generics, - retryClassifier, - ).paginatorType() + PaginatorGenerator(codegenContext, operationShape).paginatorType() } else { null } @@ -87,15 +77,7 @@ class PaginatorGenerator private constructor( private val codegenScope = arrayOf( *preludeScope, - "generics" to generics.decl, - "bounds" to generics.bounds, "page_size_setter" to pageSizeSetter(), - "send_bounds" to generics.sendBounds( - symbolProvider.toSymbol(operation), - outputType, - errorType, - retryClassifier, - ), // Operation Types "operation" to symbolProvider.toSymbol(operation), @@ -125,15 +107,15 @@ class PaginatorGenerator private constructor( rustTemplate( """ /// Paginator for #{operation:D} - pub struct $paginatorName#{generics:W} { - handle: std::sync::Arc, + pub struct $paginatorName { + handle: std::sync::Arc, builder: #{Builder}, stop_on_duplicate_token: bool, } - impl${generics.inst} ${paginatorName}${generics.inst} #{bounds:W} { + impl $paginatorName { /// Create a new paginator-wrapper - pub(crate) fn new(handle: std::sync::Arc, builder: #{Builder}) -> Self { + pub(crate) fn new(handle: std::sync::Arc, builder: #{Builder}) -> Self { Self { handle, builder, @@ -160,8 +142,7 @@ class PaginatorGenerator private constructor( /// Create the pagination stream /// /// _Note:_ No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next)). - pub fn send(self) -> impl #{Stream} + #{Unpin} - #{send_bounds:W} { + pub fn send(self) -> impl #{Stream} + #{Unpin} { // Move individual fields out of self for the borrow checker let builder = self.builder; let handle = self.handle; @@ -252,7 +233,7 @@ class PaginatorGenerator private constructor( /// /// This paginator automatically flattens results using `$documentedPath`. Queries to the underlying service /// are dispatched lazily. - pub fn items(self) -> #{ItemPaginator}${generics.inst} { + pub fn items(self) -> #{ItemPaginator} { #{ItemPaginator}(self) } """, @@ -271,16 +252,15 @@ class PaginatorGenerator private constructor( /// Flattened paginator for `$paginatorName` /// /// This is created with [`.items()`]($paginatorName::items) - pub struct ${paginatorName}Items#{generics:W}($paginatorName${generics.inst}); + pub struct ${paginatorName}Items($paginatorName); - impl ${generics.inst} ${paginatorName}Items${generics.inst} #{bounds:W} { + impl ${paginatorName}Items { /// Create the pagination stream /// /// _Note: No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next))._ /// /// To read the entirety of the paginator, use [`.collect::, _>()`](tokio_stream::StreamExt::collect). - pub fn send(self) -> impl #{Stream} + #{Unpin} - #{send_bounds:W} { + pub fn send(self) -> impl #{Stream} + #{Unpin} { #{fn_stream}::TryFlatMap::new(self.0.send()).flat_map(|page| #{extract_items}(page).unwrap_or_default().into_iter()) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt index 8859cc598f1..608a6afea7e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt @@ -10,9 +10,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.Section sealed class CustomizableOperationSection(name: String) : Section(name) { /** Write custom code into a customizable operation's impl block */ - data class CustomizableOperationImpl( - val isRuntimeModeOrchestrator: Boolean, - ) : CustomizableOperationSection("CustomizableOperationImpl") + object CustomizableOperationImpl : CustomizableOperationSection("CustomizableOperationImpl") } abstract class CustomizableOperationCustomization : NamedCustomization() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 8e858b16579..bfac81dd160 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -7,9 +7,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.GenericTypeArg -import software.amazon.smithy.rust.codegen.core.rustlang.RustGenerics import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Visibility @@ -25,102 +22,16 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizat * fluent client builders. */ class CustomizableOperationGenerator( - private val codegenContext: ClientCodegenContext, - private val generics: FluentClientGenerics, + codegenContext: ClientCodegenContext, private val customizations: List, ) { private val runtimeConfig = codegenContext.runtimeConfig - private val smithyHttp = CargoDependency.smithyHttp(runtimeConfig).toType() - private val smithyTypes = CargoDependency.smithyTypes(runtimeConfig).toType() - - private fun renderCustomizableOperationModule(writer: RustWriter) { - val operationGenerics = RustGenerics(GenericTypeArg("O"), GenericTypeArg("Retry")) - val handleGenerics = generics.toRustGenerics() - val combinedGenerics = operationGenerics + handleGenerics - - val codegenScope = arrayOf( - *preludeScope, - "Arc" to RuntimeType.Arc, - "Infallible" to RuntimeType.stdConvert.resolve("Infallible"), - // SDK Types - "HttpRequest" to RuntimeType.HttpRequest, - "handle_generics_decl" to handleGenerics.declaration(), - "handle_generics_bounds" to handleGenerics.bounds(), - "operation_generics_decl" to operationGenerics.declaration(), - "combined_generics_decl" to combinedGenerics.declaration(), - "customize_module" to ClientRustModule.Client.customize, - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - ) - - writer.rustTemplate( - """ - /// A wrapper type for [`Operation`](aws_smithy_http::operation::Operation)s that allows for - /// customization of the operation before it is sent. A `CustomizableOperation` may be sent - /// by calling its [`.send()`][#{customize_module}::CustomizableOperation::send] method. - ##[derive(Debug)] - pub struct CustomizableOperation#{combined_generics_decl:W} { - pub(crate) handle: #{Arc}, - pub(crate) operation: Operation#{operation_generics_decl:W}, - } - - impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} - where - #{handle_generics_bounds:W} - { - /// Allows for customizing the operation's request - pub fn map_request( - mut self, - f: impl #{FnOnce}(#{HttpRequest}<#{SdkBody}>) -> #{Result}<#{HttpRequest}<#{SdkBody}>, E>, - ) -> #{Result} { - let (request, response) = self.operation.into_request_response(); - let request = request.augment(|req, _props| f(req))?; - self.operation = Operation::from_parts(request, response); - #{Ok}(self) - } - - /// Convenience for `map_request` where infallible direct mutation of request is acceptable - pub fn mutate_request(self, f: impl #{FnOnce}(&mut #{HttpRequest}<#{SdkBody}>)) -> Self { - self.map_request(|mut req| { - f(&mut req); - #{Result}::<_, #{Infallible}>::Ok(req) - }) - .expect("infallible") - } - - /// Allows for customizing the entire operation - pub fn map_operation( - mut self, - f: impl #{FnOnce}(Operation#{operation_generics_decl:W}) -> #{Result}, - ) -> #{Result} { - self.operation = f(self.operation)?; - #{Ok}(self) - } - - /// Direct access to read the HTTP request - pub fn request(&self) -> &#{HttpRequest}<#{SdkBody}> { - self.operation.request() - } - - /// Direct access to mutate the HTTP request - pub fn request_mut(&mut self) -> &mut #{HttpRequest}<#{SdkBody}> { - self.operation.request_mut() - } - - #{additional_methods} - } - """, - *codegenScope, - "additional_methods" to writable { - writeCustomizations(customizations, CustomizableOperationSection.CustomizableOperationImpl(false)) - }, - ) - } fun render(crate: RustCrate) { val codegenScope = arrayOf( *preludeScope, "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("orchestrator::CustomizableOperation"), + .resolve("CustomizableOperation"), "CustomizableSend" to ClientRustModule.Client.customize.toType() .resolve("internal::CustomizableSend"), "HttpRequest" to RuntimeType.smithyRuntimeApi(runtimeConfig) @@ -144,134 +55,116 @@ class CustomizableOperationGenerator( ) val customizeModule = ClientRustModule.Client.customize - crate.withModule(customizeModule) { renderConvenienceAliases(customizeModule, this) - // TODO(enableNewSmithyRuntimeCleanup): Render it directly under the customize module when CustomizableOperation - // in the middleware has been removed. - withInlineModule( - RustModule.new( - "orchestrator", - Visibility.PUBLIC, - true, - customizeModule, - documentationOverride = "Module for defining types for `CustomizableOperation` in the orchestrator", - ), - null, - ) { - rustTemplate( - """ - /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. - pub struct CustomizableOperation { - pub(crate) customizable_send: #{Box}>, - pub(crate) config_override: #{Option}, - pub(crate) interceptors: Vec<#{SharedInterceptor}>, - pub(crate) runtime_plugins: Vec<#{SharedRuntimePlugin}>, - } - - impl CustomizableOperation { - /// Adds an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. - /// - /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`, - /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood). - /// The order in which those user-specified operation interceptors are invoked should not be relied upon - /// as it is an implementation detail. - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + 'static) -> Self { - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - - /// Adds a runtime plugin. - ##[allow(unused)] - pub(crate) fn runtime_plugin(mut self, runtime_plugin: impl #{RuntimePlugin} + 'static) -> Self { - self.runtime_plugins.push(#{SharedRuntimePlugin}::new(runtime_plugin)); - self - } - - /// Allows for customizing the operation's request. - pub fn map_request(mut self, f: F) -> Self - where - F: #{Fn}(#{HttpRequest}) -> #{Result}<#{HttpRequest}, MapE> - + #{Send} - + #{Sync} - + 'static, - MapE: ::std::error::Error + #{Send} + #{Sync} + 'static, - { - self.interceptors.push( - #{SharedInterceptor}::new( - #{MapRequestInterceptor}::new(f), - ), - ); - self - } + rustTemplate( + """ + /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. + pub struct CustomizableOperation { + pub(crate) customizable_send: #{Box}>, + pub(crate) config_override: #{Option}, + pub(crate) interceptors: Vec<#{SharedInterceptor}>, + pub(crate) runtime_plugins: Vec<#{SharedRuntimePlugin}>, + } - /// Convenience for `map_request` where infallible direct mutation of request is acceptable. - pub fn mutate_request(mut self, f: F) -> Self - where - F: #{Fn}(&mut http::Request<#{SdkBody}>) + #{Send} + #{Sync} + 'static, - { - self.interceptors.push( - #{SharedInterceptor}::new( - #{MutateRequestInterceptor}::new(f), - ), - ); - self - } + impl CustomizableOperation { + /// Adds an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. + /// + /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`, + /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood). + /// The order in which those user-specified operation interceptors are invoked should not be relied upon + /// as it is an implementation detail. + pub fn interceptor(mut self, interceptor: impl #{Interceptor} + 'static) -> Self { + self.interceptors.push(#{SharedInterceptor}::new(interceptor)); + self + } - /// Overrides config for a single operation invocation. - /// - /// `config_override` is applied to the operation configuration level. - /// The fields in the builder that are `Some` override those applied to the service - /// configuration level. For instance, - /// - /// Config A overridden by Config B == Config C - /// field_1: None, field_1: Some(v2), field_1: Some(v2), - /// field_2: Some(v1), field_2: Some(v2), field_2: Some(v2), - /// field_3: Some(v1), field_3: None, field_3: Some(v1), - pub fn config_override( - mut self, - config_override: impl #{Into}, - ) -> Self { - self.config_override = Some(config_override.into()); - self - } + /// Adds a runtime plugin. + ##[allow(unused)] + pub(crate) fn runtime_plugin(mut self, runtime_plugin: impl #{RuntimePlugin} + 'static) -> Self { + self.runtime_plugins.push(#{SharedRuntimePlugin}::new(runtime_plugin)); + self + } - /// Sends the request and returns the response. - pub async fn send( - self, - ) -> #{SendResult} - where - E: std::error::Error + #{Send} + #{Sync} + 'static, - { - let mut config_override = if let Some(config_override) = self.config_override { - config_override - } else { - crate::config::Builder::new() - }; + /// Allows for customizing the operation's request. + pub fn map_request(mut self, f: F) -> Self + where + F: #{Fn}(#{HttpRequest}) -> #{Result}<#{HttpRequest}, MapE> + + #{Send} + + #{Sync} + + 'static, + MapE: ::std::error::Error + #{Send} + #{Sync} + 'static, + { + self.interceptors.push( + #{SharedInterceptor}::new( + #{MapRequestInterceptor}::new(f), + ), + ); + self + } - self.interceptors.into_iter().for_each(|interceptor| { - config_override.push_interceptor(interceptor); - }); - self.runtime_plugins.into_iter().for_each(|plugin| { - config_override.push_runtime_plugin(plugin); - }); + /// Convenience for `map_request` where infallible direct mutation of request is acceptable. + pub fn mutate_request(mut self, f: F) -> Self + where + F: #{Fn}(&mut http::Request<#{SdkBody}>) + #{Send} + #{Sync} + 'static, + { + self.interceptors.push( + #{SharedInterceptor}::new( + #{MutateRequestInterceptor}::new(f), + ), + ); + self + } - (self.customizable_send)(config_override).await - } + /// Overrides config for a single operation invocation. + /// + /// `config_override` is applied to the operation configuration level. + /// The fields in the builder that are `Some` override those applied to the service + /// configuration level. For instance, + /// + /// | Config A | overridden by Config B | = Config C | + /// |--------------------|------------------------|--------------------| + /// | field_1: None, | field_1: Some(v2), | field_1: Some(v2), | + /// | field_2: Some(v1), | field_2: Some(v2), | field_2: Some(v2), | + /// | field_3: Some(v1), | field_3: None, | field_3: Some(v1), | + pub fn config_override( + mut self, + config_override: impl #{Into}, + ) -> Self { + self.config_override = Some(config_override.into()); + self + } - #{additional_methods} + /// Sends the request and returns the response. + pub async fn send( + self, + ) -> #{SendResult} + where + E: std::error::Error + #{Send} + #{Sync} + 'static, + { + let mut config_override = self.config_override.unwrap_or_default(); + self.interceptors.into_iter().for_each(|interceptor| { + config_override.push_interceptor(interceptor); + }); + self.runtime_plugins.into_iter().for_each(|plugin| { + config_override.push_runtime_plugin(plugin); + }); + + (self.customizable_send)(config_override).await } - """, - *codegenScope, - "additional_methods" to writable { - writeCustomizations( - customizations, - CustomizableOperationSection.CustomizableOperationImpl(true), - ) - }, - ) - } + + #{additional_methods} + } + """, + *codegenScope, + "additional_methods" to writable { + writeCustomizations( + customizations, + CustomizableOperationSection.CustomizableOperationImpl, + ) + }, + ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt index 9af0bae68f0..5234f6fe596 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt @@ -34,11 +34,8 @@ class FluentClientDecorator : ClientCodegenDecorator { return } - val generics = NoClientGenerics(codegenContext.runtimeConfig) - FluentClientGenerator( codegenContext, - generics = generics, customizations = listOf(GenericFluentClient(codegenContext)), ).render(rustCrate) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt index b83cb7a8601..448b576a9d3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -22,157 +21,32 @@ object FluentClientDocs { """ Client for calling $serviceName. - #### Client types and purposes - - Clients generated by smithy-rs have two separate client layers: - - 1. The Smithy [`Client`](#{aws_smithy_client}::Client): A _lower level client_ that is not tied - to the service and directly operates on operation structs. A Smithy client is composed of a - connector, middleware, and retry strategy. - 2. The "fluent" [`Client`]: A _higher level client_ that is convenient to use. - - The vast majority of use-cases don't require using the Smithy client, so it is usually only relevant - for client construction. Because of this, this documentation will refer to the fluent client as simply - the "client". The Smithy client is only relevant when customizing the connector, middleware, or - retry strategy, or for even more advanced use cases. - #### Constructing a `Client` - A fluent [`Client`] is composed of a Smithy client and service configuration. In order to - construct one, a Smithy client must be created first, and this is done using - the [`client::Builder`](crate::client::Builder) struct: - - ```rust,no_run - let smithy_client = $moduleUseName::client::Builder::new() - // Use the default HTTPS connector - .dyn_https_connector(Default::default()) - // Use a no-op middleware - .middleware_fn(|request| request) - // Build a type-erased Smithy client - .build_dyn(); - ``` + A `Client` requires a config in order to be constructed. With the default set of Cargo features, + this config will only require an endpoint to produce a functioning client. However, some Smithy + features will require additional configuration. For example, `@auth` requires some kind of identity + or identity resolver to be configured. The config is used to customize various aspects of the client, + such as: - The client builder has generics `C`, `M`, and `R` representing the connector, middleware, and - retry strategy: + - [HTTP Connector](crate::config::Builder::http_connector) + - [Retry](crate::config::Builder::retry_config) + - [Timeouts](crate::config::Builder::timeout_config) + - [... and more](crate::config::Builder) - - A connector (`C`) specifies how HTTP requests are translated into HTTP responses. This will typically be - an HTTP client (like `hyper`), but you can also provide your own, like a mock connector for testing. - - Middleware (`M`) modifies requests prior to them being sent to the service. Most commonly, middleware decide - what endpoint the requests should be sent to, as well as perform authentication and authorization (such - as HTTP basic auth or AWS SigV4). You can also have middleware that performs request/response tracing, - throttling, or other middleware-like tasks. - - A retry strategy (`R`) dictates the behavior for requests that fail. The default, - [`RetryMode::Standard`](aws_smithy_types::retry::RetryMode::Standard) is generally what you want since - it provides a well-vetted exponential backoff retry implementation. - - Once the Smithy client is created, a service config and fluent client can be created. Generally, you - want to call [`Client::with_config`], which takes a Smithy client and the service [`Config`](crate::Config). - The config is constructed using the [builder pattern], and has several builder methods to further - customize the client. - - In _most_ circumstances, you will want to use the following pattern to construct a client: + Below is a minimal example of how to create a client: ```rust,no_run - let smithy_client = $moduleUseName::client::Builder::new() - .dyn_https_connector(Default::default()) - ## /* - .middleware(/* discussed below */) - ## */ - ## .middleware_fn(|r| r) - .build_dyn(); - - let config = $moduleUseName::Config::builder().build(); - let client = $moduleUseName::Client::with_config(smithy_client, config); + let config = $moduleUseName::Config::builder() + .endpoint_url("http://localhost:1234") + .build(); + let client = $moduleUseName::Client::from_conf(config); ``` _Note:_ Client construction is expensive due to connection thread pool initialization, and should be done - once at application start-up. - - For middleware, you'll want to use whatever matches the routing, authentication, and authorization - required by the target service. For example, for the AWS SDK which uses [SigV4-signed requests], the - middleware looks like this: - - ```rust,ignore - use aws_endpoint::AwsEndpointStage; - use aws_http::auth::CredentialsStage; - use aws_http::recursion_detection::RecursionDetectionStage; - use aws_http::user_agent::UserAgentStage; - use aws_sig_auth::middleware::SigV4SigningStage; - use aws_sig_auth::signer::SigV4Signer; - use aws_smithy_client::retry::Config as RetryConfig; - use aws_smithy_http_tower::map_request::{AsyncMapRequestLayer, MapRequestLayer}; - use std::fmt::Debug; - use tower::layer::util::{Identity, Stack}; - use tower::ServiceBuilder; - - type AwsMiddlewareStack = Stack< - MapRequestLayer, - Stack< - MapRequestLayer, - Stack< - AsyncMapRequestLayer, - Stack< - MapRequestLayer, - Stack, Identity>, - >, - >, - >, - >; - - /// AWS Middleware Stack - /// - /// This implements the middleware stack for this service. It will: - /// 1. Load credentials asynchronously into the property bag - /// 2. Sign the request with SigV4 - /// 3. Resolve an Endpoint for the request - /// 4. Add a user agent to the request - ##[derive(Debug, Default, Clone)] - ##[non_exhaustive] - pub struct AwsMiddleware; - - impl AwsMiddleware { - /// Create a new `AwsMiddleware` stack - /// - /// Note: `AwsMiddleware` holds no state. - pub fn new() -> Self { - AwsMiddleware::default() - } - } - - // define the middleware stack in a non-generic location to reduce code bloat. - fn base() -> ServiceBuilder { - let credential_provider = AsyncMapRequestLayer::for_mapper(CredentialsStage::new()); - let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new())); - let endpoint_resolver = MapRequestLayer::for_mapper(AwsEndpointStage); - let user_agent = MapRequestLayer::for_mapper(UserAgentStage::new()); - let recursion_detection = MapRequestLayer::for_mapper(RecursionDetectionStage::new()); - // These layers can be considered as occurring in order, that is: - // 1. Resolve an endpoint - // 2. Add a user agent - // 3. Acquire credentials - // 4. Sign with credentials - // (5. Dispatch over the wire) - ServiceBuilder::new() - .layer(endpoint_resolver) - .layer(user_agent) - .layer(credential_provider) - .layer(signer) - .layer(recursion_detection) - } - - impl tower::Layer for AwsMiddleware { - type Service = >::Service; - - fn layer(&self, inner: S) -> Self::Service { - base().service(inner) - } - } - ``` - - [builder pattern]: https://rust-lang.github.io/api-guidelines/type-safety.html##builders-enable-construction-of-complex-values-c-builder - [SigV4-signed requests]: https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html""${'"'}, + once at application start-up. Cloning a client is cheap (it's just an [`Arc`](std::sync::Arc) under the hood), + so creating it once at start-up and cloning it around the application as needed is recommended. """.trimIndent(), - "aws_smithy_client" to CargoDependency.smithyClient(codegenContext.runtimeConfig).toDevDependency().toType(), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index fe6e44793c6..3684ae12539 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -58,10 +58,7 @@ import software.amazon.smithy.rust.codegen.core.util.toSnakeCase class FluentClientGenerator( private val codegenContext: ClientCodegenContext, private val reexportSmithyClientBuilder: Boolean = true, - private val generics: FluentClientGenerics, private val customizations: List = emptyList(), - private val retryClassifier: RuntimeType = RuntimeType.smithyHttp(codegenContext.runtimeConfig) - .resolve("retry::DefaultResponseRetryClassifier"), ) { companion object { fun clientOperationFnName(operationShape: OperationShape, symbolProvider: RustSymbolProvider): String = @@ -85,7 +82,7 @@ class FluentClientGenerator( fun render(crate: RustCrate, customizableOperationCustomizations: List = emptyList()) { renderFluentClient(crate) - val customizableOperationGenerator = CustomizableOperationGenerator(codegenContext, generics, customizableOperationCustomizations) + val customizableOperationGenerator = CustomizableOperationGenerator(codegenContext, customizableOperationCustomizations) operations.forEach { operation -> crate.withModule(symbolProvider.moduleForBuilder(operation)) { renderFluentBuilder(operation) @@ -123,9 +120,6 @@ class FluentClientGenerator( "RetryConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryConfig"), "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), - // TODO(enableNewSmithyRuntimeCleanup): Delete the generics when cleaning up middleware - "generics_decl" to generics.decl, - "smithy_inst" to generics.smithyInst, ) rustTemplate( """ @@ -172,22 +166,6 @@ class FluentClientGenerator( pub fn config(&self) -> &crate::Config { &self.handle.conf } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware - // This is currently kept around so the tests still compile in both modes - /// Creates a client with the given service configuration. - pub fn with_config(_client: #{client}::Client, conf: crate::Config) -> Self { - Self::from_conf(conf) - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware - // This is currently kept around so the tests still compile in both modes - /// Returns the client's configuration. - pub fn conf(&self) -> &crate::Config { - &self.handle.conf - } } """, *clientScope, @@ -203,9 +181,8 @@ class FluentClientGenerator( val privateModule = RustModule.private(moduleName, parent = ClientRustModule.client) crate.withModule(privateModule) { rustBlockTemplate( - "impl${generics.inst} super::Client${generics.inst} #{bounds:W}", + "impl super::Client", "client" to RuntimeType.smithyClient(runtimeConfig), - "bounds" to generics.bounds, ) { val fullPath = operation.fullyQualifiedFluentBuilder(symbolProvider) val maybePaginated = if (operation.isPaginated(model)) { @@ -252,7 +229,7 @@ class FluentClientGenerator( rustTemplate( """ - pub fn $fnName(&self) -> #{FluentBuilder}${generics.inst} { + pub fn $fnName(&self) -> #{FluentBuilder} { #{FluentBuilder}::new(self.handle.clone()) } """, @@ -277,16 +254,13 @@ class FluentClientGenerator( rustTemplate( """ /// Sends a request with this input using the given client. - pub async fn send_with${generics.inst}( - self, - client: &crate::Client${generics.inst} - ) -> #{Result}< + pub async fn send_with(self, client: &crate::Client) -> #{Result}< #{OperationOutput}, #{SdkError}< #{OperationError}, #{RawResponseType} > - > #{send_bounds:W} #{boundsWithoutWhereClause:W} { + > { let mut fluent_builder = client.$fnName(); fluent_builder.inner = self; fluent_builder.send().await @@ -300,8 +274,6 @@ class FluentClientGenerator( "OperationOutput" to outputType, "SdkError" to RuntimeType.sdkError(runtimeConfig), "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), - "boundsWithoutWhereClause" to generics.boundsWithoutWhereClause, - "send_bounds" to generics.sendBounds(operationSymbol, outputType, errorType, retryClassifier), ) } @@ -313,33 +285,29 @@ class FluentClientGenerator( deprecatedShape(operation) Attribute(derive(derives.toSet())).render(this) withBlockTemplate( - "pub struct $builderName#{generics:W} {", + "pub struct $builderName {", "}", - "generics" to generics.decl, ) { rustTemplate( """ - handle: #{Arc}, + handle: #{Arc}, inner: #{Inner}, """, "Inner" to symbolProvider.symbolForBuilder(input), "Arc" to RuntimeType.Arc, - "generics" to generics.decl, ) rustTemplate("config_override: #{Option},", *preludeScope) } rustBlockTemplate( - "impl${generics.inst} $builderName${generics.inst} #{bounds:W}", + "impl $builderName", "client" to RuntimeType.smithyClient(runtimeConfig), - "bounds" to generics.bounds, ) { rust("/// Creates a new `${operationSymbol.name}`.") withBlockTemplate( - "pub(crate) fn new(handle: #{Arc}) -> Self {", + "pub(crate) fn new(handle: #{Arc}) -> Self {", "}", "Arc" to RuntimeType.Arc, - "generics" to generics.decl, ) { withBlockTemplate( "Self {", @@ -361,7 +329,7 @@ class FluentClientGenerator( val orchestratorScope = arrayOf( *preludeScope, "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("orchestrator::CustomizableOperation"), + .resolve("CustomizableOperation"), "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), "Operation" to operationSymbol, @@ -442,14 +410,14 @@ class FluentClientGenerator( """, ) - PaginatorGenerator.paginatorType(codegenContext, generics, operation, retryClassifier) + PaginatorGenerator.paginatorType(codegenContext, operation) ?.also { paginatorType -> rustTemplate( """ /// Create a paginator for this request /// /// Paginators are used by calling [`send().await`](#{Paginator}::send) which returns a `Stream`. - pub fn into_paginator(self) -> #{Paginator}${generics.inst} { + pub fn into_paginator(self) -> #{Paginator} { #{Paginator}::new(self.handle, self.inner) } """, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt deleted file mode 100644 index 77b4a460198..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.client - -import software.amazon.smithy.codegen.core.Symbol -import software.amazon.smithy.rust.codegen.core.rustlang.GenericTypeArg -import software.amazon.smithy.rust.codegen.core.rustlang.RustGenerics -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType - -// TODO(enableNewSmithyRuntimeCleanup): Delete this client generics on/off switch headache -interface FluentClientGenerics { - /** Declaration with defaults set */ - val decl: Writable - - /** Instantiation of the Smithy client generics */ - val smithyInst: Writable - - /** Instantiation */ - val inst: String - - /** Bounds */ - val bounds: Writable - - /** Bounds for generated `send()` functions */ - fun sendBounds(operation: Symbol, operationOutput: Symbol, operationError: Symbol, retryClassifier: RuntimeType): Writable - - /** Convert this `FluentClientGenerics` into the more general `RustGenerics` */ - fun toRustGenerics(): RustGenerics - - /** bounds without where clause. If bounds does is not prefixed with `where\n`, then it gets the same value. **/ - val boundsWithoutWhereClause: Writable -} - -class NoClientGenerics(private val runtimeConfig: RuntimeConfig) : FluentClientGenerics { - /** Declaration with defaults set */ - override val decl = writable { } - - /** Instantiation of the Smithy client generics */ - override val smithyInst = writable { - rustTemplate( - "<#{DynConnector}, #{DynMiddleware}<#{DynConnector}>>", - "DynConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("erase::DynConnector"), - "DynMiddleware" to RuntimeType.smithyClient(runtimeConfig).resolve("erase::DynMiddleware"), - ) - } - - /** Instantiation */ - override val inst = "" - - /** Trait bounds */ - override val bounds = writable { } - - override val boundsWithoutWhereClause = writable {} - - /** Bounds for generated `send()` functions */ - override fun sendBounds( - operation: Symbol, - operationOutput: Symbol, - operationError: Symbol, - retryClassifier: RuntimeType, - ): Writable = - writable { } - - override fun toRustGenerics() = RustGenerics() -} - -data class FlexibleClientGenerics( - val connectorDefault: RuntimeType?, - val middlewareDefault: RuntimeType?, - val retryDefault: RuntimeType?, - val client: RuntimeType, -) : FluentClientGenerics { - /** Declaration with defaults set */ - override val decl = writable { - rustTemplate( - "", - "c" to defaultType(connectorDefault), - "m" to defaultType(middlewareDefault), - "r" to defaultType(retryDefault), - ) - } - - /** Instantiation of the Smithy client generics */ - override val smithyInst = writable { rust("") } - - /** Instantiation */ - override val inst: String = "" - - /** Trait bounds */ - override val bounds = writable { - rustTemplate( - """ - where - #{bounds} - """, - "bounds" to boundsWithoutWhereClause, - ) - } - - override val boundsWithoutWhereClause = writable { - rustTemplate( - """ - C: #{client}::bounds::SmithyConnector, - M: #{client}::bounds::SmithyMiddleware, - R: #{client}::retry::NewRequestPolicy, - """, - "client" to client, - ) - } - - /** Bounds for generated `send()` functions */ - override fun sendBounds(operation: Symbol, operationOutput: Symbol, operationError: Symbol, retryClassifier: RuntimeType): Writable = writable { - rustTemplate( - """ - where - R::Policy: #{client}::bounds::SmithyRetryPolicy< - #{Operation}, - #{OperationOutput}, - #{OperationError}, - #{RetryClassifier} - >, - """, - "client" to client, - "Operation" to operation, - "OperationOutput" to operationOutput, - "OperationError" to operationError, - "RetryClassifier" to retryClassifier, - ) - } - - override fun toRustGenerics(): RustGenerics = RustGenerics( - GenericTypeArg("C", client.resolve("bounds::SmithyConnector")), - GenericTypeArg("M", client.resolve("bounds::SmithyMiddleware")), - GenericTypeArg("R", client.resolve("retry::NewRequestPolicy")), - ) - - private fun defaultType(default: RuntimeType?) = writable { - default?.also { rust("= #T", default) } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt deleted file mode 100644 index d79817df40c..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol - -import software.amazon.smithy.model.shapes.BlobShape -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.http.RequestBindingGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientAdditionalPayloadContext -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.docs -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.withBlock -import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator -import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.findStreamingMember -import software.amazon.smithy.rust.codegen.core.util.inputShape -import software.amazon.smithy.rust.codegen.core.util.letIf -import software.amazon.smithy.rust.codegen.core.util.sdkId - -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up `enableNewSmithyRuntime` -/** Generates the `make_operation` function on input structs */ -open class MakeOperationGenerator( - protected val codegenContext: CodegenContext, - private val protocol: Protocol, - private val bodyGenerator: ProtocolPayloadGenerator, - private val public: Boolean, - /** Whether to include default values for content-length and content-type */ - private val includeDefaultPayloadHeaders: Boolean, - private val functionName: String = "make_operation", -) { - protected val model = codegenContext.model - protected val runtimeConfig = codegenContext.runtimeConfig - protected val symbolProvider = codegenContext.symbolProvider - private val httpBindingResolver = protocol.httpBindingResolver - private val defaultClassifier = RuntimeType.smithyHttp(runtimeConfig) - .resolve("retry::DefaultResponseRetryClassifier") - - private val sdkId = codegenContext.serviceShape.sdkId() - - private val codegenScope = arrayOf( - *preludeScope, - "config" to ClientRustModule.config, - "header_util" to RuntimeType.smithyHttp(runtimeConfig).resolve("header"), - "http" to RuntimeType.Http, - "operation" to RuntimeType.operationModule(runtimeConfig), - "HttpRequestBuilder" to RuntimeType.HttpRequestBuilder, - "OpBuildError" to runtimeConfig.operationBuildError(), - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - "SharedPropertyBag" to RuntimeType.smithyHttp(runtimeConfig).resolve("property_bag::SharedPropertyBag"), - "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), - ) - - fun generateMakeOperation( - implBlockWriter: RustWriter, - shape: OperationShape, - customizations: List, - ) { - val operationName = symbolProvider.toSymbol(shape).name - val baseReturnType = buildOperationType(implBlockWriter, shape, customizations) - val returnType = - "#{Result}<$baseReturnType, ${implBlockWriter.format(runtimeConfig.operationBuildError())}>" - val outputSymbol = symbolProvider.toSymbol(shape) - - val takesOwnership = bodyGenerator.payloadMetadata(shape).takesOwnership - val mut = customizations.any { it.mutSelf() } - val consumes = customizations.any { it.consumesSelf() } || takesOwnership - val self = "self".letIf(mut) { "mut $it" }.letIf(!consumes) { "&$it" } - val fnType = if (public) "pub async fn" else "async fn" - - implBlockWriter.docs("Consumes the builder and constructs an Operation<#D>", outputSymbol) - // For codegen simplicity - Attribute.AllowUnusedMut.render(implBlockWriter) - // For codegen simplicity, allow `let x = ...; x` - Attribute.AllowClippyLetAndReturn.render(implBlockWriter) - // Allows builders that don’t consume the input borrow - Attribute.AllowClippyNeedlessBorrow.render(implBlockWriter) - - implBlockWriter.rustBlockTemplate( - "$fnType $functionName($self, _config: &#{config}::Config) -> $returnType", - *codegenScope, - ) { - rustTemplate( - """ - assert_ne!(_config.retry_config().map(|rc| rc.mode()), #{Option}::Some(#{RetryMode}::Adaptive), "Adaptive retry mode is unsupported, please use Standard mode or disable retries."); - """, - *codegenScope, - ) - writeCustomizations(customizations, OperationSection.MutateInput(customizations, "self", "_config")) - - withBlock("let mut request = {", "};") { - createHttpRequest(this, shape) - } - rustTemplate("let mut properties = #{SharedPropertyBag}::new();", *codegenScope) - - // When the payload is a `ByteStream`, `into_inner()` already returns an `SdkBody`, so we mute this - // Clippy warning to make the codegen a little simpler in that case. - Attribute.AllowClippyUselessConversion.render(this) - withBlockTemplate("let body = #{SdkBody}::from(", ");", *codegenScope) { - bodyGenerator.generatePayload( - this, - "self", - shape, - ClientAdditionalPayloadContext(propertyBagAvailable = true), - ) - val streamingMember = shape.inputShape(model).findStreamingMember(model) - val isBlobStreaming = streamingMember != null && model.expectShape(streamingMember.target) is BlobShape - if (isBlobStreaming) { - // Consume the `ByteStream` into its inner `SdkBody`. - rust(".into_inner()") - } - } - if (includeDefaultPayloadHeaders && needsContentLength(shape)) { - rustTemplate( - """ - if let #{Some}(content_length) = body.content_length() { - request = #{header_util}::set_request_header_if_absent(request, #{http}::header::CONTENT_LENGTH, content_length); - } - """, - *codegenScope, - ) - } - rust("""let request = request.body(body).expect("should be valid request");""") - rustTemplate( - """ - let mut request = #{operation}::Request::from_parts(request, properties); - """, - *codegenScope, - ) - writeCustomizations(customizations, OperationSection.MutateRequest(customizations, "request", "_config")) - rustTemplate( - """ - let op = #{operation}::Operation::new(request, #{OperationType}::new()) - .with_metadata(#{operation}::Metadata::new(${operationName.dq()}, ${sdkId.dq()})); - """, - *codegenScope, - "OperationType" to symbolProvider.toSymbol(shape), - ) - writeCustomizations(customizations, OperationSection.FinalizeOperation(customizations, "op", "_config")) - rustTemplate("#{Ok}(op)", *codegenScope) - } - } - - private fun buildOperationType( - writer: RustWriter, - shape: OperationShape, - customizations: List, - ): String { - val operationT = RuntimeType.operation(runtimeConfig) - val output = buildOperationTypeOutput(writer, shape) - val retry = buildOperationTypeRetry(writer, customizations) - return with(writer) { "${format(operationT)}<$output, $retry>" } - } - - private fun buildOperationTypeOutput(writer: RustWriter, shape: OperationShape): String = - writer.format(symbolProvider.toSymbol(shape)) - - private fun buildOperationTypeRetry(writer: RustWriter, customizations: List): String = - (customizations.firstNotNullOfOrNull { it.retryType() } ?: defaultClassifier).let { writer.format(it) } - - private fun needsContentLength(operationShape: OperationShape): Boolean { - return protocol.httpBindingResolver.requestBindings(operationShape) - .any { it.location == HttpLocation.DOCUMENT || it.location == HttpLocation.PAYLOAD } - } - - open fun createHttpRequest(writer: RustWriter, operationShape: OperationShape) { - val httpBindingGenerator = RequestBindingGenerator( - codegenContext, - protocol, - operationShape, - ) - val contentType = httpBindingResolver.requestContentType(operationShape) - httpBindingGenerator.renderUpdateHttpBuilder(writer) - - writer.rust("let mut builder = update_http_builder(&self, #T::new())?;", RuntimeType.HttpRequestBuilder) - if (includeDefaultPayloadHeaders && contentType != null) { - writer.rustTemplate( - "builder = #{header_util}::set_request_header_if_absent(builder, #{http}::header::CONTENT_TYPE, ${contentType.dq()});", - *codegenScope, - ) - } - for (header in protocol.additionalRequestHeaders(operationShape)) { - writer.rustTemplate( - """ - builder = #{header_util}::set_request_header_if_absent( - builder, - #{http}::header::HeaderName::from_static(${header.first.dq()}), - ${header.second.dq()} - ); - """, - *codegenScope, - ) - } - writer.rust("builder") - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt index 61b0c420473..608cd5869a2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt @@ -55,21 +55,16 @@ class ProtocolParserGenerator( "operation" to RuntimeType.operationModule(codegenContext.runtimeConfig), "Bytes" to RuntimeType.Bytes, "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - // TODO(enableNewSmithyRuntimeCleanup): Remove the `PropertyBag` below - "PropertyBag" to RuntimeType.smithyHttp(codegenContext.runtimeConfig).resolve("property_bag::PropertyBag"), ) fun parseResponseFn( operationShape: OperationShape, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `propertyBagAvailable` flag as if it were always set to `false` when switching to the orchestrator - propertyBagAvailable: Boolean, customizations: List, ): RuntimeType { val outputShape = operationShape.outputShape(model) val outputSymbol = symbolProvider.toSymbol(outputShape) val errorSymbol = symbolProvider.symbolForOperationError(operationShape) - val fnNameSuffix = if (propertyBagAvailable) "http_response_with_props" else "http_response" - return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = fnNameSuffix) { fnName -> + return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_response") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) rustBlockTemplate( "pub fn $fnName(_response_status: u16, _response_headers: &#{http}::header::HeaderMap, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", @@ -83,7 +78,6 @@ class ProtocolParserGenerator( outputShape, httpBindingResolver.responseBindings(operationShape), errorSymbol, - propertyBagAvailable, customizations, ) } @@ -153,7 +147,6 @@ class ProtocolParserGenerator( errorShape, httpBindingResolver.errorResponseBindings(errorShape), errorSymbol, - false, listOf( object : OperationCustomization() { override fun section(section: OperationSection): Writable = { @@ -189,24 +182,15 @@ class ProtocolParserGenerator( fun parseStreamingResponseFn( operationShape: OperationShape, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `propertyBagAvailable` flag as if it were always set to `false` when switching to the orchestrator - propertyBagAvailable: Boolean, customizations: List, ): RuntimeType { val outputShape = operationShape.outputShape(model) val outputSymbol = symbolProvider.toSymbol(outputShape) val errorSymbol = symbolProvider.symbolForOperationError(operationShape) - val fnNameSuffix = if (propertyBagAvailable) "http_response_with_props" else "http_response" - return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = fnNameSuffix) { fnName -> + return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_response") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) - val propertiesArg = if (propertyBagAvailable) { - Attribute.AllowUnusedVariables.render(this) - ", properties: &#{PropertyBag}" - } else { - "" - } rustBlockTemplate( - "pub fn $fnName(response: &mut #{http}::Response<#{SdkBody}>$propertiesArg) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(response: &mut #{http}::Response<#{SdkBody}>) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, @@ -228,7 +212,6 @@ class ProtocolParserGenerator( outputShape, httpBindingResolver.responseBindings(operationShape), errorSymbol, - propertyBagAvailable, customizations, ) } @@ -241,8 +224,6 @@ class ProtocolParserGenerator( outputShape: StructureShape, bindings: List, errorSymbol: Symbol, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `propertyBagAvailable` flag as if it were always set to `false` when switching to the orchestrator - propertyBagAvailable: Boolean, customizations: List, ) { val httpBindingGenerator = ResponseBindingGenerator(protocol, codegenContext, operationShape) @@ -284,7 +265,7 @@ class ProtocolParserGenerator( writeCustomizations( customizations, - OperationSection.MutateOutput(customizations, operationShape, "_response_headers", propertyBagAvailable), + OperationSection.MutateOutput(customizations, operationShape, "_response_headers"), ) rust("output.build()$err") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 34a6c7b1f00..e7ccd105073 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -11,6 +11,7 @@ import software.amazon.smithy.model.shapes.DoubleShape import software.amazon.smithy.model.shapes.FloatShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.traits.EndpointTrait import software.amazon.smithy.model.traits.ErrorTrait import software.amazon.smithy.protocoltests.traits.AppliesTo import software.amazon.smithy.protocoltests.traits.HttpMessageTestCase @@ -20,8 +21,8 @@ import software.amazon.smithy.protocoltests.traits.HttpResponseTestCase import software.amazon.smithy.protocoltests.traits.HttpResponseTestsTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.customizations.EndpointPrefixGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator +import software.amazon.smithy.rust.codegen.client.smithy.generators.EndpointTraitBindings import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -233,7 +234,16 @@ class DefaultProtocolTestGenerator( // https://github.com/awslabs/smithy/blob/be68f3bbdfe5bf50a104b387094d40c8069f16b1/smithy-aws-protocol-tests/model/restJson1/endpoint-paths.smithy#L19 host.orNull()?.also { host -> val withScheme = "http://$host" - when (val bindings = EndpointPrefixGenerator.endpointTraitBindings(codegenContext, operationShape)) { + val bindings = operationShape.getTrait(EndpointTrait::class.java).map { epTrait -> + EndpointTraitBindings( + codegenContext.model, + codegenContext.symbolProvider, + codegenContext.runtimeConfig, + operationShape, + epTrait, + ) + }.orNull() + when (bindings) { null -> rust("let endpoint_prefix = None;") else -> { withBlock("let input = ", ";") { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index 66b9d7e7226..690ad5b40fb 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -10,7 +10,6 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.generators.http.RequestBindingGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientAdditionalPayloadContext import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -88,12 +87,7 @@ class RequestSerializerGenerator( "generate_body" to writable { if (bodyGenerator != null) { val body = writable { - bodyGenerator.generatePayload( - this, - "input", - operationShape, - ClientAdditionalPayloadContext(propertyBagAvailable = false), - ) + bodyGenerator.generatePayload(this, "input", operationShape) } val streamingMember = inputShape.findStreamingMember(codegenContext.model) val isBlobStreaming = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index accd436e42e..0f68a27603b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -104,7 +104,7 @@ class ResponseDeserializerGenerator( } """, *codegenScope, - "parse_streaming_response" to parserGenerator.parseStreamingResponseFn(operationShape, false, customizations), + "parse_streaming_response" to parserGenerator.parseStreamingResponseFn(operationShape, customizations), "BeforeParseResponse" to writable { writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) }, @@ -146,7 +146,7 @@ class ResponseDeserializerGenerator( """, *codegenScope, "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), - "parse_response" to parserGenerator.parseResponseFn(operationShape, false, customizations), + "parse_response" to parserGenerator.parseResponseFn(operationShape, customizations), "BeforeParseResponse" to writable { writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) }, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt index 7c949c92a27..cb9c7db7e5a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt @@ -60,7 +60,7 @@ private val CLIENT_PROTOCOL_SUPPORT = ProtocolSupport( ) private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : - ProtocolGeneratorFactory { + ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = if (compatibleWithAwsQuery(codegenContext.serviceShape, version)) { AwsQueryCompatible(codegenContext, AwsJson(codegenContext, version)) @@ -68,8 +68,8 @@ private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : AwsJson(codegenContext, version) } - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT @@ -77,40 +77,40 @@ private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : serviceShape.hasTrait() && version == AwsJsonVersion.Json10 } -private class ClientAwsQueryFactory : ProtocolGeneratorFactory { +private class ClientAwsQueryFactory : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = AwsQueryProtocol(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } -private class ClientRestJsonFactory : ProtocolGeneratorFactory { +private class ClientRestJsonFactory : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, RestJson(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, RestJson(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } -private class ClientEc2QueryFactory : ProtocolGeneratorFactory { +private class ClientEc2QueryFactory : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = Ec2QueryProtocol(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } class ClientRestXmlFactory( private val generator: (CodegenContext) -> Protocol = { RestXml(it) }, -) : ProtocolGeneratorFactory { +) : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = generator(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt index d8c8bf9dc27..1f60c251acb 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt @@ -5,57 +5,14 @@ package software.amazon.smithy.rust.codegen.client.smithy.protocols -import software.amazon.smithy.codegen.core.Symbol -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.SensitiveIndex -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ProtocolParserGenerator -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBoundProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions -import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember -import software.amazon.smithy.rust.codegen.core.util.outputShape - -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up `enableNewSmithyRuntime` (replace with ClientProtocolGenerator) -class HttpBoundProtocolGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, - bodyGenerator: ProtocolPayloadGenerator = ClientHttpBoundProtocolPayloadGenerator(codegenContext, protocol), -) : OperationGenerator( - codegenContext, - protocol, - MakeOperationGenerator( - codegenContext, - protocol, - bodyGenerator, - public = true, - includeDefaultPayloadHeaders = true, - ), - bodyGenerator, - HttpBoundProtocolTraitImplGenerator(codegenContext, protocol), -) - -// TODO(enableNewSmithyRuntimeCleanup): Completely delete `AdditionalPayloadContext` when switching to the orchestrator -data class ClientAdditionalPayloadContext( - val propertyBagAvailable: Boolean, -) : AdditionalPayloadContext class ClientHttpBoundProtocolPayloadGenerator( codegenContext: ClientCodegenContext, @@ -63,14 +20,13 @@ class ClientHttpBoundProtocolPayloadGenerator( ) : ProtocolPayloadGenerator by HttpBoundProtocolPayloadGenerator( codegenContext, protocol, HttpMessageType.REQUEST, renderEventStreamBody = { writer, params -> - val propertyBagAvailable = (params.additionalPayloadContext as ClientAdditionalPayloadContext).propertyBagAvailable writer.rustTemplate( """ { let error_marshaller = #{errorMarshallerConstructorFn}(); let marshaller = #{marshallerConstructorFn}(); let (signer, signer_sender) = #{DeferredSigner}::new(); - #{insert_into_config} + _cfg.interceptor_state().store_put(signer_sender); let adapter: #{aws_smithy_http}::event_stream::MessageStreamAdapter<_, _> = ${params.outerName}.${params.memberName}.into_body_stream(marshaller, error_marshaller, signer); let body: #{SdkBody} = #{hyper}::Body::wrap_stream(adapter).into(); @@ -83,169 +39,6 @@ class ClientHttpBoundProtocolPayloadGenerator( "DeferredSigner" to RuntimeType.smithyEventStream(codegenContext.runtimeConfig).resolve("frame::DeferredSigner"), "marshallerConstructorFn" to params.marshallerConstructorFn, "errorMarshallerConstructorFn" to params.errorMarshallerConstructorFn, - "insert_into_config" to writable { - if (propertyBagAvailable) { - rust("properties.acquire_mut().insert(signer_sender);") - } else { - rust("_cfg.interceptor_state().store_put(signer_sender);") - } - }, ) }, ) - -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up `enableNewSmithyRuntime` -open class HttpBoundProtocolTraitImplGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, -) { - private val symbolProvider = codegenContext.symbolProvider - private val model = codegenContext.model - private val runtimeConfig = codegenContext.runtimeConfig - private val httpBindingResolver = protocol.httpBindingResolver - private val protocolFunctions = ProtocolFunctions(codegenContext) - private val parserGenerator = ProtocolParserGenerator(codegenContext, protocol) - - private val codegenScope = arrayOf( - *preludeScope, - "ParseStrict" to RuntimeType.parseStrictResponse(runtimeConfig), - "ParseResponse" to RuntimeType.parseHttpResponse(runtimeConfig), - "http" to RuntimeType.Http, - "operation" to RuntimeType.operationModule(runtimeConfig), - "Bytes" to RuntimeType.Bytes, - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - ) - - private val sensitiveIndex = SensitiveIndex.of(model) - - open fun generateTraitImpls( - operationWriter: RustWriter, - operationShape: OperationShape, - customizations: List, - ) { - val outputSymbol = symbolProvider.toSymbol(operationShape.outputShape(model)) - val operationName = symbolProvider.toSymbol(operationShape).name - - // For streaming response bodies, we need to generate a different implementation of the parse traits. - // These will first offer the streaming input to the parser & potentially read the body into memory - // if an error occurred or if the streaming parser indicates that it needs the full data to proceed. - val streaming = operationShape.outputShape(model).hasStreamingMember(model) - if (streaming) { - operationWriter.renderStreamingTraits(operationName, outputSymbol, operationShape, customizations) - } else { - operationWriter.renderNonStreamingTraits(operationName, outputSymbol, operationShape, customizations) - } - } - - private fun RustWriter.renderNonStreamingTraits( - operationName: String?, - outputSymbol: Symbol, - operationShape: OperationShape, - customizations: List, - ) { - val successCode = httpBindingResolver.httpTrait(operationShape).code - val localScope = arrayOf( - "O" to outputSymbol, - "E" to symbolProvider.symbolForOperationError(operationShape), - "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), - "parse_response" to parserGenerator.parseResponseFn(operationShape, true, customizations), - "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) - }, - ) - val sensitive = writable { - if (sensitiveIndex.hasSensitiveOutput(operationShape)) { - rust("fn sensitive(&self) -> bool { true }") - } - } - rustTemplate( - """ - impl #{ParseStrict} for $operationName { - type Output = #{Result}<#{O}, #{E}>; - fn parse(&self, response: &#{http}::Response<#{Bytes}>) -> Self::Output { - let (success, status) = (response.status().is_success(), response.status().as_u16()); - let headers = response.headers(); - let body = response.body().as_ref(); - #{BeforeParseResponse} - if !success && status != $successCode { - #{parse_error}(status, headers, body) - } else { - #{parse_response}(status, headers, body) - } - } - #{sensitive} - }""", - *codegenScope, - *localScope, - "sensitive" to sensitive, - ) - } - - private fun RustWriter.renderStreamingTraits( - operationName: String, - outputSymbol: Symbol, - operationShape: OperationShape, - customizations: List, - ) { - val successCode = httpBindingResolver.httpTrait(operationShape).code - rustTemplate( - """ - impl #{ParseResponse} for $operationName { - type Output = #{Result}<#{O}, #{E}>; - fn parse_unloaded(&self, response: &mut #{operation}::Response) -> #{Option} { - #{BeforeParseResponse} - // This is an error, defer to the non-streaming parser - if !response.http().status().is_success() && response.http().status().as_u16() != $successCode { - return #{None}; - } - #{Some}(#{parse_streaming_response}(response)) - } - fn parse_loaded(&self, response: &#{http}::Response<#{Bytes}>) -> Self::Output { - // if streaming, we only hit this case if its an error - #{parse_error}(response.status().as_u16(), response.headers(), response.body().as_ref()) - } - } - """, - "O" to outputSymbol, - "E" to symbolProvider.symbolForOperationError(operationShape), - "parse_streaming_response" to parseStreamingResponse(operationShape, customizations), - "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), - "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) - }, - *codegenScope, - ) - } - - private fun parseStreamingResponse( - operationShape: OperationShape, - customizations: List, - ): RuntimeType { - val outputShape = operationShape.outputShape(model) - val outputSymbol = symbolProvider.toSymbol(outputShape) - val errorSymbol = symbolProvider.symbolForOperationError(operationShape) - return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "op_response") { fnName -> - Attribute.AllowClippyUnnecessaryWraps.render(this) - rustBlockTemplate( - "pub fn $fnName(op_response: &mut #{operation}::Response) -> #{Result}<#{O}, #{E}>", - *codegenScope, - "O" to outputSymbol, - "E" to errorSymbol, - ) { - // Not all implementations will use the property bag, but some will - Attribute.AllowUnusedVariables.render(this) - rust("let (response, properties) = op_response.parts_mut();") - rustTemplate( - """ - #{parse_streaming_response}(response, &properties) - """, - "parse_streaming_response" to parserGenerator.parseStreamingResponseFn( - operationShape, - true, - customizations, - ), - ) - } - } - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index 29f25e98aff..e53b66fc148 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -6,7 +6,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -26,10 +25,7 @@ class HttpAuthDecoratorTest { @Test fun multipleAuthSchemesSchemeSelection() { - clientIntegrationTest( - TestModels.allSchemes, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.allSchemes) { codegenContext, rustCrate -> rustCrate.integrationTest("tests") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -51,11 +47,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await @@ -85,11 +77,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await @@ -105,10 +93,7 @@ class HttpAuthDecoratorTest { @Test fun apiKeyInQueryString() { - clientIntegrationTest( - TestModels.apiKeyInQueryString, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.apiKeyInQueryString) { codegenContext, rustCrate -> rustCrate.integrationTest("api_key_applied_to_query_string") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -130,11 +115,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await @@ -150,10 +131,7 @@ class HttpAuthDecoratorTest { @Test fun apiKeyInHeaders() { - clientIntegrationTest( - TestModels.apiKeyInHeaders, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.apiKeyInHeaders) { codegenContext, rustCrate -> rustCrate.integrationTest("api_key_applied_to_headers") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -176,11 +154,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await @@ -196,10 +170,7 @@ class HttpAuthDecoratorTest { @Test fun basicAuth() { - clientIntegrationTest( - TestModels.basicAuth, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.basicAuth) { codegenContext, rustCrate -> rustCrate.integrationTest("basic_auth") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -222,11 +193,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await @@ -242,10 +209,7 @@ class HttpAuthDecoratorTest { @Test fun bearerAuth() { - clientIntegrationTest( - TestModels.bearerAuth, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.bearerAuth) { codegenContext, rustCrate -> rustCrate.integrationTest("bearer_auth") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -268,11 +232,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await @@ -288,10 +248,7 @@ class HttpAuthDecoratorTest { @Test fun optionalAuth() { - clientIntegrationTest( - TestModels.optionalAuth, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.optionalAuth) { codegenContext, rustCrate -> rustCrate.integrationTest("optional_auth") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -310,11 +267,7 @@ class HttpAuthDecoratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 3463ab1e737..1bcc30e0c3b 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -6,13 +6,11 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.testModule import software.amazon.smithy.rust.codegen.core.testutil.tokioTest @@ -35,10 +33,7 @@ class MetadataCustomizationTest { @Test fun `extract metadata via customizable operation`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 48821e380dc..671f622497b 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -6,14 +6,12 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApiTestUtil import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.testModule import software.amazon.smithy.rust.codegen.core.testutil.tokioTest @@ -39,10 +37,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { @Test fun `operation overrides endpoint resolver`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, @@ -85,10 +80,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { @Test fun `operation overrides http connector`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, @@ -163,10 +155,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { @Test fun `operation overrides retry strategy`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt index 0726c6870c3..4b3d7f3a5f7 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt @@ -6,11 +6,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest @@ -71,23 +69,9 @@ internal class PaginatorGeneratorTest { } """.asSmithyModel() - // TODO(enableNewSmithyRuntimeCleanup): Remove this middleware test when launching - @Test - fun `generate paginators that compile with middleware`() { - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("paginators_generated") { - Attribute.AllowUnusedImports.render(this) - rust("use ${clientCodegenContext.moduleUseName()}::operation::paginated_list::paginator::PaginatedListPaginator;") - } - } - } - @Test fun `generate paginators that compile`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("paginators_generated") { Attribute.AllowUnusedImports.render(this) rust("use ${clientCodegenContext.moduleUseName()}::operation::paginated_list::paginator::PaginatedListPaginator;") diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index 3da4f1656ea..121b1fd6a5e 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -8,14 +8,11 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import software.amazon.smithy.model.shapes.MemberShape -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.util.lookup @@ -71,7 +68,7 @@ class FluentClientGeneratorTest { @Test fun `send() future implements Send`() { - val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> + clientIntegrationTest(model) { codegenContext, rustCrate -> rustCrate.integrationTest("send_future_is_send") { val moduleName = codegenContext.moduleUseName() rustTemplate( @@ -85,33 +82,25 @@ class FluentClientGeneratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); check_send(client.say_hello().send()); } """, - "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + "TestConnection" to software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.smithyClient( + codegenContext.runtimeConfig, + ) .toDevDependency() .withFeature("test-util").toType() .resolve("test_connection::TestConnection"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "SdkBody" to software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.sdkBody(codegenContext.runtimeConfig), ) } } - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams, test = test) - clientIntegrationTest( - model, - TestCodegenSettings.orchestratorModeTestParams, - test = test, - ) } @Test fun `generate inner builders`() { - val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> + clientIntegrationTest(model) { codegenContext, rustCrate -> rustCrate.integrationTest("inner_builder") { val moduleName = codegenContext.moduleUseName() rustTemplate( @@ -123,11 +112,7 @@ class FluentClientGeneratorTest { .endpoint_resolver("http://localhost:1234") .http_connector(connector.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let say_hello_fluent_builder = client.say_hello().byte_value(4).foo("hello!"); assert_eq!(*say_hello_fluent_builder.get_foo(), Some("hello!".to_string())); @@ -143,11 +128,5 @@ class FluentClientGeneratorTest { ) } } - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams, test = test) - clientIntegrationTest( - model, - TestCodegenSettings.orchestratorModeTestParams, - test = test, - ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt deleted file mode 100644 index 33462450883..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorMiddlewareTest.kt +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol - -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.escape -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory -import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson -import software.amazon.smithy.rust.codegen.core.util.outputShape - -private class TestProtocolPayloadGenerator(private val body: String) : ProtocolPayloadGenerator { - override fun payloadMetadata(operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext) = - ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = false) - - override fun generatePayload( - writer: RustWriter, - shapeName: String, - operationShape: OperationShape, - additionalPayloadContext: AdditionalPayloadContext, - ) { - writer.writeWithNoFormatting(body) - } -} - -private class TestProtocolTraitImplGenerator( - private val codegenContext: ClientCodegenContext, - private val correctResponse: String, -) : HttpBoundProtocolTraitImplGenerator(codegenContext, RestJson(codegenContext)) { - private val symbolProvider = codegenContext.symbolProvider - - override fun generateTraitImpls( - operationWriter: RustWriter, - operationShape: OperationShape, - customizations: List, - ) { - operationWriter.rustTemplate( - """ - impl #{parse_strict} for ${operationShape.id.name}{ - type Output = Result<#{Output}, #{Error}>; - fn parse(&self, _response: &#{Response}<#{Bytes}>) -> Self::Output { - ${operationWriter.escape(correctResponse)} - } - } - """, - "parse_strict" to RuntimeType.parseStrictResponse(codegenContext.runtimeConfig), - "Output" to symbolProvider.toSymbol(operationShape.outputShape(codegenContext.model)), - "Error" to symbolProvider.symbolForOperationError(operationShape), - "Response" to RuntimeType.HttpResponse, - "Bytes" to RuntimeType.Bytes, - ) - } -} - -private class TestProtocolMakeOperationGenerator( - codegenContext: CodegenContext, - protocol: Protocol, - body: String, - private val httpRequestBuilder: String, -) : MakeOperationGenerator( - codegenContext, - protocol, - TestProtocolPayloadGenerator(body), - public = true, - includeDefaultPayloadHeaders = true, -) { - override fun createHttpRequest(writer: RustWriter, operationShape: OperationShape) { - writer.rust("#T::new()", RuntimeType.HttpRequestBuilder) - writer.writeWithNoFormatting(httpRequestBuilder) - } -} - -// A stubbed test protocol to do enable testing intentionally broken protocols -private class TestProtocolGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, - httpRequestBuilder: String, - body: String, - correctResponse: String, -) : OperationGenerator( - codegenContext, - protocol, - TestProtocolMakeOperationGenerator(codegenContext, protocol, body, httpRequestBuilder), - TestProtocolPayloadGenerator(body), - TestProtocolTraitImplGenerator(codegenContext, correctResponse), -) - -private class TestProtocolFactory( - private val httpRequestBuilder: String, - private val body: String, - private val correctResponse: String, -) : ProtocolGeneratorFactory { - override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext) - - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator { - return TestProtocolGenerator( - codegenContext, - protocol(codegenContext), - httpRequestBuilder, - body, - correctResponse, - ) - } - - override fun support(): ProtocolSupport { - return ProtocolSupport( - requestSerialization = true, - requestBodySerialization = true, - responseDeserialization = true, - errorDeserialization = true, - requestDeserialization = false, - requestBodyDeserialization = false, - responseSerialization = false, - errorSerialization = false, - ) - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt deleted file mode 100644 index a54397ff594..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.testutil - -import software.amazon.smithy.model.node.ObjectNode -import software.amazon.smithy.model.node.StringNode -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams - -object TestCodegenSettings { - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - fun middlewareMode(): ObjectNode = ObjectNode.objectNodeBuilder() - .withMember( - "codegen", - ObjectNode.objectNodeBuilder() - .withMember("enableNewSmithyRuntime", StringNode.from("middleware")).build(), - ) - .build() - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - fun orchestratorMode(): ObjectNode = ObjectNode.objectNodeBuilder() - .withMember( - "codegen", - ObjectNode.objectNodeBuilder() - .withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")).build(), - ) - .build() - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - val middlewareModeTestParams get(): IntegrationTestParams = - IntegrationTestParams(additionalSettings = middlewareMode()) - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - val orchestratorModeTestParams get(): IntegrationTestParams = - IntegrationTestParams(additionalSettings = orchestratorMode()) -} From 67830dccb577e882d804fdc75b63a08afb9b709f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 21 Aug 2023 17:17:04 -0700 Subject: [PATCH 087/331] Make it possible to nest runtime components (#2909) Runtime plugins need to be able to wrap components configured in other runtime components. For example, one runtime plugin should be able to wrap the HTTP connector configured in another runtime plugin. This PR makes this possible by: - Introducing the ability to order runtime plugins within the service/operation plugin "levels". - Adding an argument to `RuntimePlugin::runtime_components` so that implementations can reference components configured by previous plugins. The `order` function has three separate order values: `Defaults`, `Overrides`, and `NestedComponents`. The `Defaults` order is currently unused, but will be used later when we refactor how defaults in config work. Everything defaults to `Overrides` since most runtime plugins will want to be in this slot. The `NestedComponents` order is specifically for runtime plugins that want to create nested components, and runs at the very end. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../src/presigning_interceptors.rs | 5 +- .../ConfigOverrideRuntimePluginGenerator.kt | 2 +- .../OperationRuntimePluginGenerator.kt | 2 +- .../ServiceRuntimePluginGenerator.kt | 2 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 4 +- .../aws-smithy-runtime-api/Cargo.toml | 3 + .../src/client/runtime_plugin.rs | 294 ++++++++++++++++-- .../src/client/auth/no_auth.rs | 5 +- .../src/client/orchestrator.rs | 16 +- .../src/client_http_checksum_required.rs | 5 +- .../src/client_idempotency_token.rs | 5 +- 12 files changed, 310 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e6887075b2d..b8715335d93 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -23,6 +23,12 @@ references = ["smithy-rs#2904"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" +[[smithy-rs]] +message = "It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method." +references = ["smithy-rs#2909"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} +author = "jdisanti" + [[smithy-rs]] message = "Fix incorrect summary docs for builders" references = ["smithy-rs#2914", "aws-sdk-rust#825"] diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs index 3ded9fcd686..7a477925f05 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs @@ -118,7 +118,10 @@ impl RuntimePlugin for SigV4PresigningRuntimePlugin { Some(layer.freeze()) } - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.runtime_components) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index 0e595065f9f..6dfd83c5b32 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -73,7 +73,7 @@ class ConfigOverrideRuntimePluginGenerator( Some(self.config.clone()) } - fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { #{Cow}::Borrowed(&self.components) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index 73d6756072d..d76f083eef7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -76,7 +76,7 @@ class OperationRuntimePluginGenerator( #{Some}(cfg.freeze()) } - fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { // Retry classifiers are operation-specific because they need to downcast operation-specific error types. let retry_classifiers = #{RetryClassifiers}::new() #{retry_classifier_customizations}; diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index 86a2d4d63d2..555ea7e035f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -121,7 +121,7 @@ class ServiceRuntimePluginGenerator( self.config.clone() } - fn runtime_components(&self) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { #{Cow}::Borrowed(&self.runtime_components) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 671f622497b..9534f7a79ea 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -44,6 +44,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "EndpointResolverParams" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::endpoint::EndpointResolverParams"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), ) rustCrate.testModule { addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) @@ -62,7 +63,8 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { client_config.config, &client_config.runtime_components, ); - let sut_components = sut.runtime_components(); + let prev = #{RuntimeComponentsBuilder}::new("prev"); + let sut_components = sut.runtime_components(&prev); let endpoint_resolver = sut_components.endpoint_resolver().unwrap(); let endpoint = endpoint_resolver .resolve_endpoint(&#{EndpointResolverParams}::new(crate::config::endpoint::Params {})) diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 426c449ccce..e9b4c0bc61a 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -25,6 +25,9 @@ tokio = { version = "1.25", features = ["sync"] } tracing = "0.1" zeroize = { version = "1", optional = true } +[dev-dependencies] +tokio = { version = "1.25", features = ["rt", "macros"] } + [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index abc687ca660..b41a0048a3a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -27,12 +27,52 @@ use std::borrow::Cow; use std::fmt::Debug; use std::sync::Arc; +/// Runtime plugin ordering. +/// +/// There are two runtime plugin "levels" that run in the following order: +/// 1. Service runtime plugins - runtime plugins that pertain to the entire service. +/// 2. Operation runtime plugins - runtime plugins relevant only to a single operation. +/// +/// This enum is used to determine runtime plugin order within those levels. +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +pub enum Order { + /// Runtime plugins with `Defaults` order are executed first within their level. + /// + /// Runtime plugins with this order should only be used for registering default components and config. + Defaults, + + /// Runtime plugins with `Overrides` order are executed after `Defaults` within their level. + /// + /// This is the default order. + Overrides, + + /// Runtime plugins with `NestedComponents` order are executed after `Overrides` within their level. + /// + /// This level is intended to be used for wrapping components configured in previous runtime plugins. + NestedComponents, +} + /// Runtime plugin trait /// /// A `RuntimePlugin` is the unit of configuration for augmenting the SDK with new behavior. /// /// Runtime plugins can register interceptors, set runtime components, and modify configuration. pub trait RuntimePlugin: Debug + Send + Sync { + /// Runtime plugin ordering. + /// + /// There are two runtime plugin "levels" that run in the following order: + /// 1. Service runtime plugins - runtime plugins that pertain to the entire service. + /// 2. Operation runtime plugins - runtime plugins relevant only to a single operation. + /// + /// This function is used to determine runtime plugin order within those levels. So + /// regardless of this `Order` value, service runtime plugins will still always execute before + /// operation runtime plugins. However, [`Defaults`](Order::Defaults) + /// service runtime plugins will run before [`Overrides`](Order::Overrides) + /// service runtime plugins. + fn order(&self) -> Order { + Order::Overrides + } + /// Optionally returns additional config that should be added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). /// /// As a best practice, a frozen layer should be stored on the runtime plugin instance as @@ -52,7 +92,14 @@ pub trait RuntimePlugin: Debug + Send + Sync { /// This method returns a [`Cow`] for flexibility. Some implementers may want to store the components builder /// as a member and return a reference to it, while others may need to create the builder every call. If possible, /// returning a reference is preferred for performance. - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + /// + /// Components configured by previous runtime plugins are in the `current_components` argument, and can be used + /// to create nested/wrapped components, such as a connector calling into an inner (customer provided) connector. + fn runtime_components( + &self, + current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + let _ = current_components; Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER) } } @@ -71,12 +118,19 @@ impl SharedRuntimePlugin { } impl RuntimePlugin for SharedRuntimePlugin { + fn order(&self) -> Order { + self.0.order() + } + fn config(&self) -> Option { self.0.config() } - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { - self.0.runtime_components() + fn runtime_components( + &self, + current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + self.0.runtime_components(current_components) } } @@ -111,14 +165,50 @@ impl RuntimePlugin for StaticRuntimePlugin { self.config.clone() } - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { self.runtime_components .as_ref() .map(Cow::Borrowed) - .unwrap_or_else(|| RuntimePlugin::runtime_components(self)) + .unwrap_or_else(|| RuntimePlugin::runtime_components(self, _current_components)) } } +macro_rules! insert_plugin { + ($vec:expr, $plugin:ident, $create_rp:expr) => {{ + // Insert the plugin in the correct order + let mut insert_index = 0; + let order = $plugin.order(); + for (index, other_plugin) in $vec.iter().enumerate() { + let other_order = other_plugin.order(); + if other_order <= order { + insert_index = index + 1; + } else if other_order > order { + break; + } + } + $vec.insert(insert_index, $create_rp); + }}; +} + +macro_rules! apply_plugins { + ($name:ident, $plugins:expr, $cfg:ident) => {{ + tracing::trace!(concat!("applying ", stringify!($name), " runtime plugins")); + let mut merged = + RuntimeComponentsBuilder::new(concat!("apply_", stringify!($name), "_configuration")); + for plugin in &$plugins { + if let Some(layer) = plugin.config() { + $cfg.push_shared_layer(layer); + } + let next = plugin.runtime_components(&merged); + merged = merged.merge_from(&next); + } + Ok(merged) + }}; +} + /// Used internally in the orchestrator implementation and in the generated code. Not intended to be used elsewhere. #[doc(hidden)] #[derive(Default, Clone, Debug)] @@ -133,13 +223,20 @@ impl RuntimePlugins { } pub fn with_client_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { - self.client_plugins.push(SharedRuntimePlugin::new(plugin)); + insert_plugin!( + self.client_plugins, + plugin, + SharedRuntimePlugin::new(plugin) + ); self } pub fn with_operation_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { - self.operation_plugins - .push(SharedRuntimePlugin::new(plugin)); + insert_plugin!( + self.operation_plugins, + plugin, + SharedRuntimePlugin::new(plugin) + ); self } @@ -147,36 +244,28 @@ impl RuntimePlugins { &self, cfg: &mut ConfigBag, ) -> Result { - tracing::trace!("applying client runtime plugins"); - let mut builder = RuntimeComponentsBuilder::new("apply_client_configuration"); - for plugin in self.client_plugins.iter() { - if let Some(layer) = plugin.config() { - cfg.push_shared_layer(layer); - } - builder = builder.merge_from(&plugin.runtime_components()); - } - Ok(builder) + apply_plugins!(client, self.client_plugins, cfg) } pub fn apply_operation_configuration( &self, cfg: &mut ConfigBag, ) -> Result { - tracing::trace!("applying operation runtime plugins"); - let mut builder = RuntimeComponentsBuilder::new("apply_operation_configuration"); - for plugin in self.operation_plugins.iter() { - if let Some(layer) = plugin.config() { - cfg.push_shared_layer(layer); - } - builder = builder.merge_from(&plugin.runtime_components()); - } - Ok(builder) + apply_plugins!(operation, self.operation_plugins, cfg) } } #[cfg(test)] mod tests { use super::{RuntimePlugin, RuntimePlugins}; + use crate::client::connectors::{HttpConnector, SharedHttpConnector}; + use crate::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; + use crate::client::runtime_components::RuntimeComponentsBuilder; + use crate::client::runtime_plugin::Order; + use aws_smithy_http::body::SdkBody; + use aws_smithy_types::config_bag::ConfigBag; + use http::HeaderValue; + use std::borrow::Cow; #[derive(Debug)] struct SomeStruct; @@ -193,4 +282,157 @@ mod tests { fn assert_send_sync() {} assert_send_sync::(); } + + #[test] + fn insert_plugin() { + #[derive(Debug)] + struct RP(isize, Order); + impl RuntimePlugin for RP { + fn order(&self) -> Order { + self.1 + } + } + + fn insert_plugin(vec: &mut Vec, plugin: RP) { + insert_plugin!(vec, plugin, plugin); + } + + let mut vec = Vec::new(); + insert_plugin(&mut vec, RP(5, Order::NestedComponents)); + insert_plugin(&mut vec, RP(3, Order::Overrides)); + insert_plugin(&mut vec, RP(1, Order::Defaults)); + insert_plugin(&mut vec, RP(6, Order::NestedComponents)); + insert_plugin(&mut vec, RP(2, Order::Defaults)); + insert_plugin(&mut vec, RP(4, Order::Overrides)); + insert_plugin(&mut vec, RP(7, Order::NestedComponents)); + assert_eq!( + vec![1, 2, 3, 4, 5, 6, 7], + vec.iter().map(|rp| rp.0).collect::>() + ); + + let mut vec = Vec::new(); + insert_plugin(&mut vec, RP(3, Order::Overrides)); + insert_plugin(&mut vec, RP(4, Order::Overrides)); + insert_plugin(&mut vec, RP(5, Order::NestedComponents)); + insert_plugin(&mut vec, RP(6, Order::NestedComponents)); + insert_plugin(&mut vec, RP(7, Order::NestedComponents)); + insert_plugin(&mut vec, RP(1, Order::Defaults)); + insert_plugin(&mut vec, RP(2, Order::Defaults)); + assert_eq!( + vec![1, 2, 3, 4, 5, 6, 7], + vec.iter().map(|rp| rp.0).collect::>() + ); + + let mut vec = Vec::new(); + insert_plugin(&mut vec, RP(1, Order::Defaults)); + insert_plugin(&mut vec, RP(2, Order::Defaults)); + insert_plugin(&mut vec, RP(3, Order::Overrides)); + insert_plugin(&mut vec, RP(4, Order::Overrides)); + insert_plugin(&mut vec, RP(5, Order::NestedComponents)); + insert_plugin(&mut vec, RP(6, Order::NestedComponents)); + assert_eq!( + vec![1, 2, 3, 4, 5, 6], + vec.iter().map(|rp| rp.0).collect::>() + ); + } + + #[tokio::test] + async fn components_can_wrap_components() { + // CN1, the inner connector, creates a response with a `rp1` header + #[derive(Debug)] + struct CN1; + impl HttpConnector for CN1 { + fn call(&self, _: HttpRequest) -> BoxFuture { + Box::pin(async { + Ok(http::Response::builder() + .status(200) + .header("rp1", "1") + .body(SdkBody::empty()) + .unwrap()) + }) + } + } + + // CN2, the outer connector, calls the inner connector and adds the `rp2` header to the response + #[derive(Debug)] + struct CN2(SharedHttpConnector); + impl HttpConnector for CN2 { + fn call(&self, request: HttpRequest) -> BoxFuture { + let inner = self.0.clone(); + Box::pin(async move { + let mut resp = inner.call(request).await.unwrap(); + resp.headers_mut() + .append("rp2", HeaderValue::from_static("1")); + Ok(resp) + }) + } + } + + // RP1 registers CN1 + #[derive(Debug)] + struct RP1; + impl RuntimePlugin for RP1 { + fn order(&self) -> Order { + Order::Overrides + } + + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Owned( + RuntimeComponentsBuilder::new("RP1") + .with_http_connector(Some(SharedHttpConnector::new(CN1))), + ) + } + } + + // RP2 registers CN2 + #[derive(Debug)] + struct RP2; + impl RuntimePlugin for RP2 { + fn order(&self) -> Order { + Order::NestedComponents + } + + fn runtime_components( + &self, + current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Owned( + RuntimeComponentsBuilder::new("RP2").with_http_connector(Some( + SharedHttpConnector::new(CN2(current_components.http_connector().unwrap())), + )), + ) + } + } + + // Emulate assembling a full runtime plugins list and using it to apply configuration + let plugins = RuntimePlugins::new() + // intentionally configure the plugins in the reverse order + .with_client_plugin(RP2) + .with_client_plugin(RP1); + let mut cfg = ConfigBag::base(); + let components = plugins.apply_client_configuration(&mut cfg).unwrap(); + + // Use the resulting HTTP connector to make a response + let resp = components + .http_connector() + .unwrap() + .call( + http::Request::builder() + .method("GET") + .uri("/") + .body(SdkBody::empty()) + .unwrap(), + ) + .await + .unwrap(); + dbg!(&resp); + + // Verify headers from both connectors are present, + // which will only be possible if they were run in the correct order + assert_eq!("1", resp.headers().get("rp1").unwrap()); + assert_eq!("1", resp.headers().get("rp2").unwrap()); + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs index ebda0f69432..f201cff5850 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs @@ -51,7 +51,10 @@ impl NoAuthRuntimePlugin { } impl RuntimePlugin for NoAuthRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.0) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 22bee36367c..93112317f5d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -531,7 +531,10 @@ mod tests { Some(layer.freeze()) } - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.builder) } } @@ -600,7 +603,7 @@ mod tests { } } impl RuntimePlugin for FailingInterceptorsClientRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.0) } } @@ -617,7 +620,7 @@ mod tests { } } impl RuntimePlugin for FailingInterceptorsOperationRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.0) } } @@ -901,7 +904,7 @@ mod tests { } } impl RuntimePlugin for InterceptorsTestOperationRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.0) } } @@ -1240,7 +1243,10 @@ mod tests { builder: RuntimeComponentsBuilder, } impl RuntimePlugin for TestInterceptorRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.builder) } } diff --git a/rust-runtime/inlineable/src/client_http_checksum_required.rs b/rust-runtime/inlineable/src/client_http_checksum_required.rs index 10c129b3bfb..05de9601f8b 100644 --- a/rust-runtime/inlineable/src/client_http_checksum_required.rs +++ b/rust-runtime/inlineable/src/client_http_checksum_required.rs @@ -30,7 +30,10 @@ impl HttpChecksumRequiredRuntimePlugin { } impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.runtime_components) } } diff --git a/rust-runtime/inlineable/src/client_idempotency_token.rs b/rust-runtime/inlineable/src/client_idempotency_token.rs index 778fc1133b4..31768d68e86 100644 --- a/rust-runtime/inlineable/src/client_idempotency_token.rs +++ b/rust-runtime/inlineable/src/client_idempotency_token.rs @@ -37,7 +37,10 @@ impl IdempotencyTokenRuntimePlugin { } impl RuntimePlugin for IdempotencyTokenRuntimePlugin { - fn runtime_components(&self) -> Cow<'_, RuntimeComponentsBuilder> { + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Borrowed(&self.runtime_components) } } From 9570983e6156922e10a6165389ac997e771b936e Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 22 Aug 2023 09:35:10 -0700 Subject: [PATCH 088/331] Fix `SDK::Endpoint` built-in (#2935) Setting `endpoint_url` on a SDK Config currently has no effect due to a bug in deciding if a parameter is a built-in or not in EndpointBuiltinsDecorator. The generated code is placing the endpoint URL into the ConfigBag with the correct `aws_types::endpoint_config::EndpointUrl` type, but then the operation runtime plugin is trying to pull it out of the ConfigBag with the `crate::config::EndpointUrl` type, which always yields nothing. Or, to illustrate with the generated code itself: ``` pub fn set_endpoint_url(&mut self, endpoint_url: Option<::std::string::String>) -> &mut Self { self.config.store_or_unset(endpoint_url.map(::aws_types::endpoint_config::EndpointUrl)); self } ``` vs. ``` let params = crate::config::endpoint::Params::builder() .set_endpoint(cfg.load::().map(|ty| ty.0.clone())) ``` This PR adds a unit test that reproduces the issue, and then fixes it. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../rustsdk/EndpointBuiltInsDecorator.kt | 9 +- .../rustsdk/EndpointBuiltInsDecoratorTest.kt | 119 ++++++++++++++++++ .../amazon/smithy/rustsdk/TestUtil.kt | 2 + 3 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index e59eaa7bc8a..c202b5c4cd1 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -57,7 +57,9 @@ fun ClientCodegenContext.getBuiltIn(builtIn: String): Parameter? { } private fun promotedBuiltins(parameter: Parameter) = - parameter == Builtins.FIPS || parameter == Builtins.DUALSTACK || parameter == Builtins.SDK_ENDPOINT + parameter.builtIn == Builtins.FIPS.builtIn || + parameter.builtIn == Builtins.DUALSTACK.builtIn || + parameter.builtIn == Builtins.SDK_ENDPOINT.builtIn private fun configParamNewtype(parameter: Parameter, name: String, runtimeConfig: RuntimeConfig): RuntimeType { val type = parameter.symbol().mapRustType { t -> t.stripOuter() } @@ -204,6 +206,9 @@ val PromotedBuiltInsDecorators = decoratorForBuiltIn(Builtins.DUALSTACK), decoratorForBuiltIn( Builtins.SDK_ENDPOINT, - ConfigParam.Builder().name("endpoint_url").type(RuntimeType.String.toSymbol()).setterDocs(endpointUrlDocs), + ConfigParam.Builder() + .name("endpoint_url") + .type(RuntimeType.String.toSymbol()) + .setterDocs(endpointUrlDocs), ), ).toTypedArray() diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt new file mode 100644 index 00000000000..ad84fb54df5 --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt @@ -0,0 +1,119 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class EndpointBuiltInsDecoratorTest { + private val endpointUrlModel = """ + namespace test + + use aws.api#service + use aws.auth#sigv4 + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + + @service(sdkId: "dontcare") + @restJson1 + @sigv4(name: "dontcare") + @auth([sigv4]) + @endpointRuleSet({ + "version": "1.0" + "parameters": { + "endpoint": { "required": false, "type": "string", "builtIn": "SDK::Endpoint" }, + "region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + "rules": [ + { + "type": "endpoint" + "conditions": [ + {"fn": "isSet", "argv": [{"ref": "endpoint"}]}, + {"fn": "isSet", "argv": [{"ref": "region"}]} + ], + "endpoint": { + "url": "{endpoint}" + "properties": { + "authSchemes": [{"name": "sigv4","signingRegion": "{region}"}] + } + } + }, + { + "type": "endpoint" + "conditions": [ + {"fn": "isSet", "argv": [{"ref": "region"}]}, + ], + "endpoint": { + "url": "https://WRONG/" + "properties": { + "authSchemes": [{"name": "sigv4", "signingRegion": "{region}"}] + } + } + } + ] + }) + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + @optionalAuth + operation SomeOperation { + output: SomeOutput + } + """.asSmithyModel() + + @Test + fun endpointUrlBuiltInWorksEndToEnd() { + awsSdkIntegrationTest( + endpointUrlModel, + generateOrchestrator = true, + ) { codegenContext, rustCrate -> + rustCrate.integrationTest("endpoint_url_built_in_works") { + val module = codegenContext.moduleUseName() + rustTemplate( + """ + use $module::{Config, Client, config::Region}; + + ##[#{tokio}::test] + async fn endpoint_url_built_in_works() { + let connector = #{TestConnection}::new(vec![( + http::Request::builder() + .uri("https://RIGHT/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body("").unwrap(), + )]); + let config = Config::builder() + .http_connector(connector.clone()) + .region(Region::new("us-east-1")) + .endpoint_url("https://RIGHT") + .build(); + let client = Client::from_conf(config); + dbg!(client.some_operation().send().await).expect("success"); + connector.assert_requests_match(&[]); + } + """, + "tokio" to CargoDependency.Tokio.toDevDependency().withFeature("rt").withFeature("macros").toType(), + "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("test_connection::TestConnection"), + "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + ) + } + } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 44ed5461a9b..3dc959abcef 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.model.Model +import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -65,6 +66,7 @@ fun awsSdkIntegrationTest( .withMember("includeFluentClient", false) .letIf(generateOrchestrator) { it.withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")) + .withMember("includeEndpointUrlConfig", BooleanNode.from(false)) } .build(), ).build(), From 7ea0c8efd69ac7f781db99e64f9799fcf4ae489f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 22 Aug 2023 10:53:54 -0700 Subject: [PATCH 089/331] Add missing changelog entry (#2937) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 5559e01980b..3b8d5fe80e0 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -58,3 +58,15 @@ message = "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orche references = ["smithy-rs#2934", "aws-sdk-rust#872"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "ysaito1001" + +[[aws-sdk-rust]] +message = "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`." +references = ["smithy-rs#2935"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "jdisanti" + +[[smithy-rs]] +message = "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`." +references = ["smithy-rs#2935"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "jdisanti" From e5506cfde371d130e1a5bb6f14f6fb0cd0e230bb Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 22 Aug 2023 10:55:12 -0700 Subject: [PATCH 090/331] Add endpoint params to debug logs (#2936) Debugging endpoint resolution can be difficult when the params being used during resolution aren't logged. This PR adds that logging. Example output below. It doesn't ordinarily have newlines and indentation. I added those for clarity. ``` 2023-08-22T00:27:54.363727Z DEBUG invoke{service=s3 operation=ListObjectsV2}:try_op:try_attempt: aws_smithy_runtime::client::orchestrator::endpoints: resolving endpoint endpoint_params=EndpointResolverParams(TypeErasedBox[!Clone]:Params { bucket: Some("test-bucket"), region: Some("us-east-1"), use_fips: false, use_dual_stack: false, endpoint: None, force_path_style: false, accelerate: false, use_global_endpoint: false, use_object_lambda_endpoint: None, disable_access_points: None, disable_multi_region_access_points: false, use_arn_region: None }) endpoint_prefix=None ``` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-runtime/src/client/orchestrator/endpoints.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 76ce7f40374..5257fa66675 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -121,6 +121,7 @@ pub(super) async fn orchestrate_endpoint( .load::() .expect("endpoint resolver params must be set"); let endpoint_prefix = cfg.load::(); + tracing::debug!(endpoint_params = ?params, endpoint_prefix = ?endpoint_prefix, "resolving endpoint"); let request = ctx.request_mut().expect("set during serialization"); let endpoint = runtime_components From 3d7587def9a26afc8e7b306f92c755a980ac9504 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 22 Aug 2023 19:04:12 +0000 Subject: [PATCH 091/331] Upgrade the smithy-rs runtime crates version to 0.56.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4b2eb378570..38f796d5147 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.69.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.56.0 +smithy.rs.runtime.crate.version=0.56.1 kotlin.code.style=official From 9f6e69fea2cbedc2c368474d26aa513a6df6c800 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 22 Aug 2023 19:07:02 +0000 Subject: [PATCH 092/331] Update changelog --- CHANGELOG.md | 12 +++ CHANGELOG.next.toml | 62 +------------ aws/SDK_CHANGELOG.next.json | 168 ++++++++++++++++++++++++++---------- 3 files changed, 134 insertions(+), 108 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cb6e477463..4f3a70d70c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ +August 22nd, 2023 +================= +**Breaking Changes:** +- :bug::warning: (client, [smithy-rs#2931](https://github.com/awslabs/smithy-rs/issues/2931), [aws-sdk-rust#875](https://github.com/awslabs/aws-sdk-rust/issues/875)) Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading. + +**New this release:** +- (client, [smithy-rs#2904](https://github.com/awslabs/smithy-rs/issues/2904)) `RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`. +- :bug: (client, [smithy-rs#2914](https://github.com/awslabs/smithy-rs/issues/2914), [aws-sdk-rust#825](https://github.com/awslabs/aws-sdk-rust/issues/825)) Fix incorrect summary docs for builders +- :bug: (client, [smithy-rs#2934](https://github.com/awslabs/smithy-rs/issues/2934), [aws-sdk-rust#872](https://github.com/awslabs/aws-sdk-rust/issues/872)) Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level. +- :bug: (client, [smithy-rs#2935](https://github.com/awslabs/smithy-rs/issues/2935)) Fix `SDK::Endpoint` built-in for `@endpointRuleSet`. + + August 1st, 2023 ================ **Breaking Changes:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 3b8d5fe80e0..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,64 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`." -references = ["smithy-rs#2904", "aws-sdk-rust#862"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "`RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`." -references = ["smithy-rs#2904"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} -author = "jdisanti" - -[[smithy-rs]] -message = "Fix incorrect summary docs for builders" -references = ["smithy-rs#2914", "aws-sdk-rust#825"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Fix requests to S3 with `no_credentials` set." -references = ["smithy-rs#2907", "aws-sdk-rust#864"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading." -references = ["smithy-rs#2931", "aws-sdk-rust#875"] -meta = { "breaking" = true, "tada" = false, "bug" = true } -author = "jdisanti" - -[[smithy-rs]] -message = "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading." -references = ["smithy-rs#2931", "aws-sdk-rust#875"] -meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level." -references = ["smithy-rs#2934", "aws-sdk-rust#872"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level." -references = ["smithy-rs#2934", "aws-sdk-rust#872"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`." -references = ["smithy-rs#2935"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "jdisanti" - -[[smithy-rs]] -message = "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`." -references = ["smithy-rs#2935"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "jdisanti" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index cb5a407d326..38225d8bc40 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -18,7 +18,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Retrieving a request ID from errors now requires importing the `RequestId` trait. For example, with S3:\n```rust\nuse aws_sdk_s3::types::RequestId;\nprintln!(\"Request ID: {:?}\", error.request_id());\n```\n", @@ -33,7 +33,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these.", @@ -48,7 +48,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.\n
\nExample with S3\n**Before:**\n```rust\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError { kind, .. } => match kind {\n GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n }\n err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n**After:**\n```rust\n// Needed to access the `.code()` function on the error type:\nuse aws_sdk_s3::types::ProvideErrorMetadata;\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError::InvalidObjectState(value) => {\n println!(\"invalid object state: {:?}\", value);\n }\n GetObjectError::NoSuchKey(_) => {\n println!(\"object didn't exist\");\n }\n err if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n
\n", @@ -64,7 +64,7 @@ "smithy-rs#2075" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`.", @@ -79,7 +79,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated.", @@ -93,7 +93,7 @@ "aws-sdk-rust#740" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "`SdkError` variants can now be constructed for easier unit testing.", @@ -108,7 +108,7 @@ "smithy-rs#2208" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`.", @@ -123,7 +123,7 @@ "aws-sdk-rust#600" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Enable presigning for S3's `HeadObject` operation.", @@ -138,7 +138,7 @@ "smithy-rs#2451" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "The modules in the SDK crates have been reorganized. See the [SDK Crate Reorganization Upgrade Guidance](https://github.com/awslabs/aws-sdk-rust/discussions/752) to see how to fix your code after this change.", @@ -152,7 +152,7 @@ "smithy-rs#2433" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Reconnect on transient errors.\n\nIf a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not\nbe reused. This is enabled by default for all AWS services. It can be disabled by setting `RetryConfig::with_reconnect_mode`\n\nAlthough there is no API breakage from this change, it alters the client behavior in a way that may cause breakage for customers.\n", @@ -167,7 +167,7 @@ "smithy-rs#2445" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Update MSRV to 1.66.1", @@ -181,7 +181,7 @@ "smithy-rs#2467" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Default connector provided by `aws-config` now respects `ConnectorSettings`.\n\nPreviously, it used the timeout settings provided by aws-config. A test from @Oliboy50 has been incorporated to verify this behavior.\n\n**Behavior Change**: Prior to this change, the Hyper client would be shared between all service clients. After this change, each service client will use its own Hyper Client.\nTo revert to the previous behavior, set `HttpConnector::Prebuilt` on `SdkConfig::http_connector`.\n", @@ -197,7 +197,7 @@ "smithy-rs#2151" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Remove deprecated `ResolveAwsEndpoint` interfaces.\n[For details see the longform changelog entry](https://github.com/awslabs/aws-sdk-rust/discussions/755).\n", @@ -212,7 +212,7 @@ "smithy-rs#1784" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001)", @@ -226,7 +226,7 @@ "smithy-rs#2474" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 4 + "age": 5 }, { "message": "Implement std::error::Error#source() properly for the service meta Error enum.", @@ -240,7 +240,7 @@ "aws-sdk-rust#784" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "The outputs for event stream operations (for example, S3's SelectObjectContent) now implement the `Sync` auto-trait.", @@ -254,7 +254,7 @@ "smithy-rs#2496" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "The AWS SDK now compiles for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!", @@ -268,7 +268,7 @@ "smithy-rs#2254" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "S3's `GetObject` will no longer panic when checksum validation is enabled and the target object was uploaded as a multi-part upload.\nHowever, these objects cannot be checksum validated by the SDK due to the way checksums are calculated for multipart uploads.\nFor more information, see [this page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums).\n", @@ -282,7 +282,7 @@ "aws-sdk-rust#764" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "`AppName` is now configurable from within `ConfigLoader`.", @@ -296,7 +296,7 @@ "smithy-rs#2513" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Add support for omitting session token in canonical requests for SigV4 signing.", @@ -310,7 +310,7 @@ "smithy-rs#2473" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions.", @@ -324,7 +324,7 @@ "smithy-rs#2525" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Fix bug where an incorrect endpoint was produced for `WriteGetObjectResponse`", @@ -339,7 +339,7 @@ "aws-sdk-rust#781" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Update the `std::fmt::Debug` implementation for `aws-sigv4::SigningParams` so that it will no longer print sensitive information.", @@ -353,7 +353,7 @@ "smithy-rs#2562" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "`aws_smithy_types::date_time::Format` has been re-exported in SDK crates.", @@ -367,7 +367,7 @@ "smithy-rs#2534" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Reduce several instances of credential exposure in the SDK logs:\n- IMDS now suppresses the body of the response from logs\n- `aws-sigv4` marks the `x-amz-session-token` header as sensitive\n- STS & SSO credentials have been manually marked as sensitive which suppresses logging of response bodies for relevant operations\n", @@ -381,7 +381,7 @@ "smithy-rs#2603" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Update MSRV to Rust 1.67.1", @@ -395,7 +395,7 @@ "smithy-rs#2611" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 3 + "age": 4 }, { "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", @@ -410,7 +410,7 @@ "smithy-rs#2694" ], "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", - "age": 2 + "age": 3 }, { "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", @@ -424,7 +424,7 @@ "smithy-rs#2815" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Add accessors to Builders", @@ -438,7 +438,7 @@ "smithy-rs#2791" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Remove native-tls and add a migration guide.", @@ -452,7 +452,7 @@ "smithy-rs#2675" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", @@ -467,7 +467,7 @@ "aws-sdk-rust#703" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", @@ -481,7 +481,7 @@ "smithy-rs#2720" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", @@ -495,7 +495,7 @@ "smithy-rs#2673" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", @@ -509,7 +509,7 @@ "smithy-rs#2730" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", @@ -525,7 +525,7 @@ "aws-sdk-rust#2087" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", @@ -541,7 +541,7 @@ "smithy-rs#2846" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", @@ -555,7 +555,7 @@ "smithy-rs#2742" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Update MSRV to Rust 1.69.0", @@ -569,7 +569,7 @@ "smithy-rs#2893" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", @@ -586,7 +586,7 @@ "smithy-rs#2616" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", @@ -600,7 +600,7 @@ "smithy-rs#2652" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", @@ -614,7 +614,7 @@ "smithy-rs#2783" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", @@ -628,7 +628,7 @@ "smithy-rs#2845" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", @@ -642,7 +642,7 @@ "smithy-rs#2724" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", @@ -657,7 +657,7 @@ "aws-sdk-rust#338" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", @@ -671,7 +671,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", @@ -685,7 +685,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 1 + "age": 2 }, { "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", @@ -697,6 +697,80 @@ "author": "jdisanti", "references": [], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 2 + }, + { + "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2904", + "aws-sdk-rust#862" + ], + "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", + "age": 1 + }, + { + "message": "Fix requests to S3 with `no_credentials` set.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2907", + "aws-sdk-rust#864" + ], + "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", + "age": 1 + }, + { + "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", + "meta": { + "bug": true, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2931", + "aws-sdk-rust#875" + ], + "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", + "age": 1 + }, + { + "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2934", + "aws-sdk-rust#872" + ], + "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", + "age": 1 + }, + { + "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2935" + ], + "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", "age": 1 } ], From a08c9bf70678576df28c40ee407e4d56b8b1508e Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 22 Aug 2023 16:42:01 -0700 Subject: [PATCH 093/331] Don't run message length validation on `SDK_CHANGELOG.next.json` (#2940) The new changelog message length validation is running when attempting to release the SDK, which reads historical entries from `SDK_CHANGELOG.next.json`, and these older entries didn't have a length validation. Thus, this validation can't run during render time. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/changelogger/src/render.rs | 4 +-- tools/ci-build/sdk-lints/src/changelog.rs | 14 +++++---- .../smithy-rs-tool-common/src/changelog.rs | 31 +++++++++++++------ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/tools/ci-build/changelogger/src/render.rs b/tools/ci-build/changelogger/src/render.rs index 445d2e8d709..b8d9c3efeea 100644 --- a/tools/ci-build/changelogger/src/render.rs +++ b/tools/ci-build/changelogger/src/render.rs @@ -10,7 +10,7 @@ use once_cell::sync::Lazy; use ordinal::Ordinal; use serde::Serialize; use smithy_rs_tool_common::changelog::{ - Changelog, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry, + Changelog, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry, ValidationSet, }; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::versions_manifest::{CrateVersionMetadataMap, VersionsManifest}; @@ -237,7 +237,7 @@ fn load_changelogs(args: &RenderArgs) -> Result { for source in &args.source { let changelog = Changelog::load_from_file(source) .map_err(|errs| anyhow::Error::msg(format!("failed to load {source:?}: {errs:#?}")))?; - changelog.validate().map_err(|errs| { + changelog.validate(ValidationSet::Render).map_err(|errs| { anyhow::Error::msg(format!( "failed to load {source:?}: {errors}", errors = errs.join("\n") diff --git a/tools/ci-build/sdk-lints/src/changelog.rs b/tools/ci-build/sdk-lints/src/changelog.rs index f88e8bcb47f..03a04a2d4e6 100644 --- a/tools/ci-build/sdk-lints/src/changelog.rs +++ b/tools/ci-build/sdk-lints/src/changelog.rs @@ -6,7 +6,7 @@ use crate::lint::LintError; use crate::{repo_root, Check, Lint}; use anyhow::Result; -use smithy_rs_tool_common::changelog::Changelog; +use smithy_rs_tool_common::changelog::{Changelog, ValidationSet}; use std::path::{Path, PathBuf}; pub(crate) struct ChangelogNext; @@ -33,10 +33,12 @@ impl Check for ChangelogNext { /// Validate that `CHANGELOG.next.toml` follows best practices fn check_changelog_next(path: impl AsRef) -> std::result::Result<(), Vec> { let parsed = Changelog::load_from_file(path).map_err(|e| vec![LintError::via_display(e)])?; - parsed.validate().map_err(|errs| { - errs.into_iter() - .map(LintError::via_display) - .collect::>() - })?; + parsed + .validate(ValidationSet::Development) + .map_err(|errs| { + errs.into_iter() + .map(LintError::via_display) + .collect::>() + })?; Ok(()) } diff --git a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs index 5f358be99da..69a88d6891f 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs @@ -139,7 +139,7 @@ pub struct HandAuthoredEntry { impl HandAuthoredEntry { /// Validate a changelog entry to ensure it follows standards - pub fn validate(&self) -> Result<()> { + pub fn validate(&self, validation_set: ValidationSet) -> Result<()> { if self.author.is_empty() { bail!("Author must be set (was empty)"); } @@ -149,7 +149,7 @@ impl HandAuthoredEntry { if self.references.is_empty() { bail!("Changelog entry must refer to at least one pull request or issue"); } - if self.message.len() > 800 { + if validation_set == ValidationSet::Development && self.message.len() > 800 { bail!( "Your changelog entry is too long. Post long-form change log entries in \ the GitHub Discussions under the Changelog category, and link to them from \ @@ -179,6 +179,19 @@ pub struct SdkModelEntry { pub message: String, } +#[derive(Copy, Clone, Eq, PartialEq)] +pub enum ValidationSet { + /// Validate for local development and CI + Development, + /// Validate for rendering. + /// + /// This does less validation to avoid blocking a release for things that + /// were added to changelog validation later that could cause issues with + /// SDK_CHANGELOG.next.json where there are historical entries that didn't + /// have this validation applied. + Render, +} + #[derive(Clone, Default, Debug, Deserialize, Serialize)] pub struct Changelog { #[serde(rename = "smithy-rs")] @@ -243,9 +256,9 @@ impl Changelog { serde_json::to_string_pretty(self).context("failed to serialize changelog JSON") } - pub fn validate(&self) -> Result<(), Vec> { + pub fn validate(&self, validation_set: ValidationSet) -> Result<(), Vec> { let validate_aws_handauthored = |entry: &HandAuthoredEntry| -> Result<()> { - entry.validate()?; + entry.validate(validation_set)?; if entry.meta.target.is_some() { bail!("aws-sdk-rust changelog entry cannot have an affected target"); } @@ -253,7 +266,7 @@ impl Changelog { }; let validate_smithyrs_handauthored = |entry: &HandAuthoredEntry| -> Result<()> { - entry.validate()?; + entry.validate(validation_set)?; if entry.meta.target.is_none() { bail!("smithy-rs entry must have an affected target"); } @@ -278,7 +291,7 @@ impl Changelog { #[cfg(test)] mod tests { - use super::{Changelog, HandAuthoredEntry, SdkAffected}; + use super::{Changelog, HandAuthoredEntry, SdkAffected, ValidationSet}; use anyhow::Context; #[test] @@ -348,7 +361,7 @@ mod tests { "#; // three errors should be produced, missing authors x 2 and a SdkAffected is not set to default let changelog: Changelog = toml::from_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_err()); if let Err(e) = res { assert_eq!(e.len(), 3); @@ -378,7 +391,7 @@ mod tests { { // loading directly from toml::from_str won't set the default target field let changelog: Changelog = toml::from_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_err()); if let Err(e) = res { assert!(e.contains(&"smithy-rs entry must have an affected target".to_string())) @@ -387,7 +400,7 @@ mod tests { { // loading through Chanelog will result in no error let changelog: Changelog = Changelog::parse_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_ok()); if let Err(e) = res { panic!("some error has been produced {e:?}"); From 133a27f07affbfbc7a5cebf9d85e4cec28effa06 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 23 Aug 2023 07:33:16 -0700 Subject: [PATCH 094/331] Merge `smithy-rs-release-0.56.x` into `main` (#2941) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/changelogger/src/render.rs | 4 +-- tools/ci-build/sdk-lints/src/changelog.rs | 14 +++++---- .../smithy-rs-tool-common/src/changelog.rs | 31 +++++++++++++------ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/tools/ci-build/changelogger/src/render.rs b/tools/ci-build/changelogger/src/render.rs index 445d2e8d709..b8d9c3efeea 100644 --- a/tools/ci-build/changelogger/src/render.rs +++ b/tools/ci-build/changelogger/src/render.rs @@ -10,7 +10,7 @@ use once_cell::sync::Lazy; use ordinal::Ordinal; use serde::Serialize; use smithy_rs_tool_common::changelog::{ - Changelog, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry, + Changelog, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry, ValidationSet, }; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::versions_manifest::{CrateVersionMetadataMap, VersionsManifest}; @@ -237,7 +237,7 @@ fn load_changelogs(args: &RenderArgs) -> Result { for source in &args.source { let changelog = Changelog::load_from_file(source) .map_err(|errs| anyhow::Error::msg(format!("failed to load {source:?}: {errs:#?}")))?; - changelog.validate().map_err(|errs| { + changelog.validate(ValidationSet::Render).map_err(|errs| { anyhow::Error::msg(format!( "failed to load {source:?}: {errors}", errors = errs.join("\n") diff --git a/tools/ci-build/sdk-lints/src/changelog.rs b/tools/ci-build/sdk-lints/src/changelog.rs index f88e8bcb47f..03a04a2d4e6 100644 --- a/tools/ci-build/sdk-lints/src/changelog.rs +++ b/tools/ci-build/sdk-lints/src/changelog.rs @@ -6,7 +6,7 @@ use crate::lint::LintError; use crate::{repo_root, Check, Lint}; use anyhow::Result; -use smithy_rs_tool_common::changelog::Changelog; +use smithy_rs_tool_common::changelog::{Changelog, ValidationSet}; use std::path::{Path, PathBuf}; pub(crate) struct ChangelogNext; @@ -33,10 +33,12 @@ impl Check for ChangelogNext { /// Validate that `CHANGELOG.next.toml` follows best practices fn check_changelog_next(path: impl AsRef) -> std::result::Result<(), Vec> { let parsed = Changelog::load_from_file(path).map_err(|e| vec![LintError::via_display(e)])?; - parsed.validate().map_err(|errs| { - errs.into_iter() - .map(LintError::via_display) - .collect::>() - })?; + parsed + .validate(ValidationSet::Development) + .map_err(|errs| { + errs.into_iter() + .map(LintError::via_display) + .collect::>() + })?; Ok(()) } diff --git a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs index 5f358be99da..69a88d6891f 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs @@ -139,7 +139,7 @@ pub struct HandAuthoredEntry { impl HandAuthoredEntry { /// Validate a changelog entry to ensure it follows standards - pub fn validate(&self) -> Result<()> { + pub fn validate(&self, validation_set: ValidationSet) -> Result<()> { if self.author.is_empty() { bail!("Author must be set (was empty)"); } @@ -149,7 +149,7 @@ impl HandAuthoredEntry { if self.references.is_empty() { bail!("Changelog entry must refer to at least one pull request or issue"); } - if self.message.len() > 800 { + if validation_set == ValidationSet::Development && self.message.len() > 800 { bail!( "Your changelog entry is too long. Post long-form change log entries in \ the GitHub Discussions under the Changelog category, and link to them from \ @@ -179,6 +179,19 @@ pub struct SdkModelEntry { pub message: String, } +#[derive(Copy, Clone, Eq, PartialEq)] +pub enum ValidationSet { + /// Validate for local development and CI + Development, + /// Validate for rendering. + /// + /// This does less validation to avoid blocking a release for things that + /// were added to changelog validation later that could cause issues with + /// SDK_CHANGELOG.next.json where there are historical entries that didn't + /// have this validation applied. + Render, +} + #[derive(Clone, Default, Debug, Deserialize, Serialize)] pub struct Changelog { #[serde(rename = "smithy-rs")] @@ -243,9 +256,9 @@ impl Changelog { serde_json::to_string_pretty(self).context("failed to serialize changelog JSON") } - pub fn validate(&self) -> Result<(), Vec> { + pub fn validate(&self, validation_set: ValidationSet) -> Result<(), Vec> { let validate_aws_handauthored = |entry: &HandAuthoredEntry| -> Result<()> { - entry.validate()?; + entry.validate(validation_set)?; if entry.meta.target.is_some() { bail!("aws-sdk-rust changelog entry cannot have an affected target"); } @@ -253,7 +266,7 @@ impl Changelog { }; let validate_smithyrs_handauthored = |entry: &HandAuthoredEntry| -> Result<()> { - entry.validate()?; + entry.validate(validation_set)?; if entry.meta.target.is_none() { bail!("smithy-rs entry must have an affected target"); } @@ -278,7 +291,7 @@ impl Changelog { #[cfg(test)] mod tests { - use super::{Changelog, HandAuthoredEntry, SdkAffected}; + use super::{Changelog, HandAuthoredEntry, SdkAffected, ValidationSet}; use anyhow::Context; #[test] @@ -348,7 +361,7 @@ mod tests { "#; // three errors should be produced, missing authors x 2 and a SdkAffected is not set to default let changelog: Changelog = toml::from_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_err()); if let Err(e) = res { assert_eq!(e.len(), 3); @@ -378,7 +391,7 @@ mod tests { { // loading directly from toml::from_str won't set the default target field let changelog: Changelog = toml::from_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_err()); if let Err(e) = res { assert!(e.contains(&"smithy-rs entry must have an affected target".to_string())) @@ -387,7 +400,7 @@ mod tests { { // loading through Chanelog will result in no error let changelog: Changelog = Changelog::parse_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_ok()); if let Err(e) = res { panic!("some error has been produced {e:?}"); From daa1af18ac92bdeca4dc4b51c5c836eab32067aa Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 23 Aug 2023 09:46:10 -0700 Subject: [PATCH 095/331] Relax reference validation during changelog rendering (#2942) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/smithy-rs-tool-common/src/changelog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs index 69a88d6891f..fa67649c11d 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs @@ -146,7 +146,7 @@ impl HandAuthoredEntry { if !self.author.chars().all(|c| c.is_alphanumeric() || c == '-') { bail!("Author must be valid GitHub username: [a-zA-Z0-9\\-]") } - if self.references.is_empty() { + if validation_set == ValidationSet::Development && self.references.is_empty() { bail!("Changelog entry must refer to at least one pull request or issue"); } if validation_set == ValidationSet::Development && self.message.len() > 800 { From df7f4d02e4cf3f1ce58f2b81cc1f6e0d88f22d2f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 24 Aug 2023 08:58:56 -0700 Subject: [PATCH 096/331] Fix the SDK canary (#2946) The SDK canary was: - Failing, but marking that failure as a pass. - Failing on string compare on the Transcribe Streaming test. - Failing on permissions with the EC2 test. This PR fixes these issues. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-cdk/canary-lambda/src/canary.rs | 2 +- tools/ci-cdk/canary-runner/Cargo.lock | 556 +- tools/ci-cdk/canary-runner/Cargo.toml | 8 +- tools/ci-cdk/canary-runner/src/run.rs | 36 +- tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts | 9 + tools/ci-cdk/package-lock.json | 5022 ++--------------- 6 files changed, 640 insertions(+), 4993 deletions(-) diff --git a/tools/ci-cdk/canary-lambda/src/canary.rs b/tools/ci-cdk/canary-lambda/src/canary.rs index a7d497b52e3..abb37ee6e2f 100644 --- a/tools/ci-cdk/canary-lambda/src/canary.rs +++ b/tools/ci-cdk/canary-lambda/src/canary.rs @@ -78,7 +78,7 @@ impl CanaryEnv { // Amazon Transcribe starts returning different output for the same audio. let expected_transcribe_result = env::var("CANARY_EXPECTED_TRANSCRIBE_RESULT") .unwrap_or_else(|_| { - "Good day to you transcribe. This is Polly talking to you from the Rust ST K." + "Good day to you transcribe. This is Polly talking to you from the Rust S. D. K." .to_string() }); diff --git a/tools/ci-cdk/canary-runner/Cargo.lock b/tools/ci-cdk/canary-runner/Cargo.lock index 6edc67f2c43..9ec158de434 100644 --- a/tools/ci-cdk/canary-runner/Cargo.lock +++ b/tools/ci-cdk/canary-runner/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "async-recursion" @@ -55,18 +55,18 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -88,9 +88,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.55.3" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcdcf0d683fe9c23d32cf5b53c9918ea0a500375a9fb20109802552658e576c9" +checksum = "de3d533e0263bf453cc80af4c8bcc4d64e2aca293bd16f81633a36f1bf4a97cb" dependencies = [ "aws-credential-types", "aws-http", @@ -104,7 +104,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand 1.9.0", + "fastrand", "hex", "http", "hyper", @@ -118,121 +118,126 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "0.55.3" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae" +checksum = "e4834ba01c5ad1ed9740aa222de62190e3c565d11ab7e72cc68314a258994567" dependencies = [ "aws-smithy-async", "aws-smithy-types", - "fastrand 1.9.0", + "fastrand", "tokio", "tracing", "zeroize", ] [[package]] -name = "aws-endpoint" -version = "0.55.3" +name = "aws-http" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04" +checksum = "72badf9de83cc7d66b21b004f09241836823b8302afb25a24708769e576a8d8f" dependencies = [ + "aws-credential-types", "aws-smithy-http", "aws-smithy-types", "aws-types", + "bytes", "http", - "regex", + "http-body", + "lazy_static", + "percent-encoding", + "pin-project-lite", "tracing", ] [[package]] -name = "aws-http" -version = "0.55.3" +name = "aws-runtime" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" +checksum = "cf832f522111225c02547e1e1c28137e840e4b082399d93a236e4b29193a4667" dependencies = [ "aws-credential-types", + "aws-http", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-eventstream", "aws-smithy-http", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", - "bytes", + "fastrand", "http", - "http-body", - "lazy_static", "percent-encoding", - "pin-project-lite", "tracing", + "uuid", ] [[package]] name = "aws-sdk-cloudwatch" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7263a92103fcd82ad1cb882274ece03a84a1041d08a487bb3d783c60acdf8f49" +checksum = "babb00ade826c2e4f25ab1872ed04b8d1f3ffd83e4d1220103f4d1281f9b7991" dependencies = [ "aws-credential-types", - "aws-endpoint", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes", "http", "regex", "tokio-stream", - "tower", "tracing", ] [[package]] name = "aws-sdk-lambda" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ad176ffaa3aafa532246eb6a9f18a7d68da19950704ecc95d33d9dc3c62a9b" +checksum = "a2261df7dfd05837950109a0aa35be7d5f905afad20015a89d1fb14c7e662c9b" dependencies = [ "aws-credential-types", - "aws-endpoint", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "http", "regex", "tokio-stream", - "tower", "tracing", ] [[package]] name = "aws-sdk-s3" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f" +checksum = "1e30370b61599168d38190ad272bb91842cd81870a6ca035c05dd5726d22832c" dependencies = [ "aws-credential-types", - "aws-endpoint", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-sigv4", "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-client", "aws-smithy-eventstream", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", @@ -243,82 +248,63 @@ dependencies = [ "percent-encoding", "regex", "tokio-stream", - "tower", "tracing", "url", ] [[package]] name = "aws-sdk-sso" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8b812340d86d4a766b2ca73f740dfd47a97c2dff0c06c8517a16d88241957e4" +checksum = "f41bf2c28d32dbb9894a8fcfcb148265d034d3f4a170552a47553a09de890895" dependencies = [ "aws-credential-types", - "aws-endpoint", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "http", "regex", "tokio-stream", - "tower", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265fac131fbfc188e5c3d96652ea90ecc676a934e3174eaaee523c6cec040b3b" +checksum = "79e21aa1a5b0853969a1ef96ccfaa8ff5d57c761549786a4d5f86c1902b2586a" dependencies = [ "aws-credential-types", - "aws-endpoint", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes", "http", "regex", - "tower", - "tracing", -] - -[[package]] -name = "aws-sig-auth" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61" -dependencies = [ - "aws-credential-types", - "aws-sigv4", - "aws-smithy-eventstream", - "aws-smithy-http", - "aws-types", - "http", "tracing", ] [[package]] name = "aws-sigv4" -version = "0.55.3" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" +checksum = "2cb40a93429794065f41f0581734fc56a345f6a38d8e2e3c25c7448d930cd132" dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", @@ -337,9 +323,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" +checksum = "2cdb73f85528b9d19c23a496034ac53703955a59323d581c06aa27b4e4e247af" dependencies = [ "futures-util", "pin-project-lite", @@ -349,9 +335,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" +checksum = "afb15946af1b8d3beeff53ad991d9bff68ac22426b6d40372b958a75fa61eaed" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -370,23 +356,23 @@ dependencies = [ [[package]] name = "aws-smithy-client" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" +checksum = "c27b2756264c82f830a91cb4d2d485b2d19ad5bea476d9a966e03d27f27ba59a" dependencies = [ "aws-smithy-async", "aws-smithy-http", "aws-smithy-http-tower", "aws-smithy-types", "bytes", - "fastrand 1.9.0", + "fastrand", "http", "http-body", "hyper", - "hyper-rustls 0.23.2", + "hyper-rustls", "lazy_static", "pin-project-lite", - "rustls 0.20.8", + "rustls", "tokio", "tower", "tracing", @@ -394,9 +380,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" +checksum = "850233feab37b591b7377fd52063aa37af615687f5896807abe7f49bd4e1d25b" dependencies = [ "aws-smithy-types", "bytes", @@ -405,9 +391,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" +checksum = "54cdcf365d8eee60686885f750a34c190e513677db58bbc466c44c588abf4199" dependencies = [ "aws-smithy-eventstream", "aws-smithy-types", @@ -428,9 +414,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-tower" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" +checksum = "822de399d0ce62829a69dfa8c5cd08efdbe61a7426b953e2268f8b8b52a607bd" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -444,50 +430,88 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" +checksum = "4fb1e7ab8fa7ad10c193af7ae56d2420989e9f4758bf03601a342573333ea34f" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-query" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d" +checksum = "28556a3902091c1f768a34f6c998028921bdab8d47d92586f363f14a4a32d047" dependencies = [ "aws-smithy-types", "urlencoding", ] +[[package]] +name = "aws-smithy-runtime" +version = "0.56.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "745e096b3553e7e0f40622aa04971ce52765af82bebdeeac53aa6fc82fe801e6" +dependencies = [ + "aws-smithy-async", + "aws-smithy-client", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "fastrand", + "http", + "http-body", + "once_cell", + "pin-project-lite", + "pin-utils", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "0.56.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d0ae0c9cfd57944e9711ea610b48a963fb174a53aabacc08c5794a594b1d02" +dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-types", + "bytes", + "http", + "tokio", + "tracing", +] + [[package]] name = "aws-smithy-types" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8" +checksum = "d90dbc8da2f6be461fa3c1906b20af8f79d14968fe47f2b7d29d086f62a51728" dependencies = [ "base64-simd", "itoa", "num-integer", "ryu", + "serde", "time", ] [[package]] name = "aws-smithy-xml" -version = "0.55.3" +version = "0.56.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b" +checksum = "e01d2dedcdd8023043716cfeeb3c6c59f2d447fce365d8e194838891794b23b6" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.55.3" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829" +checksum = "6bceb8cf724ad057ad7f327d0d256d7147b3eac777b39849a26189e003dc9782" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -501,9 +525,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -544,9 +568,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "block-buffer" @@ -618,9 +642,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -742,6 +769,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" + [[package]] name = "diff" version = "0.1.13" @@ -761,9 +794,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" [[package]] name = "either" @@ -773,18 +806,18 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] [[package]] name = "errno" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -801,15 +834,6 @@ dependencies = [ "libc", ] -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.0.0" @@ -818,9 +842,9 @@ checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -912,7 +936,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -970,15 +994,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -1065,9 +1089,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" @@ -1086,28 +1110,13 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", "want", ] -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http", - "hyper", - "log", - "rustls 0.20.8", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.23.4", -] - [[package]] name = "hyper-rustls" version = "0.24.1" @@ -1117,9 +1126,11 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.5", + "log", + "rustls", + "rustls-native-certs", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", ] [[package]] @@ -1239,9 +1250,9 @@ checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "lock_api" @@ -1255,9 +1266,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ "serde", ] @@ -1273,9 +1284,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" [[package]] name = "md-5" @@ -1358,9 +1369,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -1398,9 +1409,9 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" dependencies = [ "memchr", ] @@ -1446,9 +1457,9 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -1467,7 +1478,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -1478,9 +1489,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" dependencies = [ "cc", "libc", @@ -1582,29 +1593,29 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -1669,9 +1680,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1726,13 +1737,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.3", + "regex-automata 0.3.6", "regex-syntax 0.7.4", ] @@ -1747,9 +1758,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", @@ -1770,9 +1781,9 @@ checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "20b9b67e2ca7dd9e9f9285b759de30ff538aab981abaaf7bc9bd90b84a0126c3" dependencies = [ "base64 0.21.2", "bytes", @@ -1783,7 +1794,7 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls 0.24.1", + "hyper-rustls", "hyper-tls", "ipnet", "js-sys", @@ -1794,14 +1805,14 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.5", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-rustls 0.24.1", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", @@ -1825,9 +1836,9 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4531c89d50effe1fac90d095c8b133c20c5c714204feee0bfc3fd158e784209d" +checksum = "ff44108c7925d082f2861e683a88618b68235ad9cdc60d64d9d1188efc951cdb" dependencies = [ "anyhow", "async-trait", @@ -1863,9 +1874,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b97ad83c2fc18113346b7158d79732242002427c30f620fa817c1f32901e0a8" +checksum = "14b1e66540e0cac90acadaf7109bf99c90d95abcc94b4c096bfa16a2d7aa7a71" dependencies = [ "anyhow", "async-trait", @@ -1920,11 +1931,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.4" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", @@ -1933,21 +1944,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.5" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", @@ -1978,9 +1977,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.2" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring", "untrusted", @@ -2076,22 +2075,22 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.176" +version = "1.0.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" +checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.176" +version = "1.0.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" +checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -2107,9 +2106,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -2182,9 +2181,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -2222,6 +2221,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "spin" version = "0.5.2" @@ -2253,9 +2262,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -2273,12 +2282,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.7.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", - "fastrand 2.0.0", + "fastrand", "redox_syscall 0.3.5", "rustix", "windows-sys", @@ -2301,22 +2310,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -2331,10 +2340,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" dependencies = [ + "deranged", "itoa", "serde", "time-core", @@ -2349,9 +2359,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" dependencies = [ "time-core", ] @@ -2373,11 +2383,10 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", @@ -2386,7 +2395,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.3", "tokio-macros", "windows-sys", ] @@ -2399,7 +2408,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -2412,24 +2421,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.5", + "rustls", "tokio", ] @@ -2517,7 +2515,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", ] [[package]] @@ -2573,9 +2571,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -2695,7 +2693,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -2729,7 +2727,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2765,24 +2763,11 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "winapi" @@ -2835,9 +2820,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -2850,53 +2835,54 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys", ] [[package]] diff --git a/tools/ci-cdk/canary-runner/Cargo.toml b/tools/ci-cdk/canary-runner/Cargo.toml index 85e8a03be15..27d4983685b 100644 --- a/tools/ci-cdk/canary-runner/Cargo.toml +++ b/tools/ci-cdk/canary-runner/Cargo.toml @@ -12,10 +12,10 @@ publish = false [dependencies] anyhow = "1" async-trait = "0.1.56" -aws-config = "0.55.3" -aws-sdk-cloudwatch = "0.28.0" -aws-sdk-lambda = "0.28.0" -aws-sdk-s3 = "0.28.0" +aws-config = "0.56.0" +aws-sdk-cloudwatch = "0.29.0" +aws-sdk-lambda = "0.29.0" +aws-sdk-s3 = "0.29.0" base64 = "0.13" clap = { version = "3.2.17", features = ["derive"] } hex = "0.4.3" diff --git a/tools/ci-cdk/canary-runner/src/run.rs b/tools/ci-cdk/canary-runner/src/run.rs index 1952323dab4..4c05938eb20 100644 --- a/tools/ci-cdk/canary-runner/src/run.rs +++ b/tools/ci-cdk/canary-runner/src/run.rs @@ -27,13 +27,14 @@ use serde::Deserialize; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::macros::here; use smithy_rs_tool_common::release_tag::ReleaseTag; -use tracing::info; +use tracing::{error, info}; use crate::build_bundle::BuildBundleArgs; use aws_sdk_cloudwatch as cloudwatch; use aws_sdk_lambda as lambda; use aws_sdk_s3 as s3; +use std::collections::HashMap; lazy_static::lazy_static! { // Occasionally, a breaking change introduced in smithy-rs will cause the canary to fail @@ -170,6 +171,9 @@ pub async fn run(opt: RunArgs) -> Result<()> { let start_time = SystemTime::now(); let config = aws_config::load_from_env().await; let result = run_canary(&options, &config).await; + if let Err(err) = &result { + error!("Canary invocation failed: {err:?}",); + } let mut metrics = vec![ ( @@ -422,6 +426,36 @@ async fn invoke_lambda(lambda_client: lambda::Client, bundle_name: &str) -> Resu .unwrap_or("") ); } + if let Some(payload) = response.payload { + // Example payload: + // { + // "failures": { + // "ec2_paginator": "service error\n\nCaused by:\n 0: unhandled error\n 1: unhandled error\n 2: Error { code: \"UnauthorizedOperation\", message: \"You are not authorized to perform this operation.\", aws_request_id: \"0adcd3f5-73f3-45a2-bd2e-09e4172b65f1\" }", + // "transcribe_canary": "Transcription from Transcribe doesn't look right:\nExpected: `Good day to you transcribe. This is Polly talking to you from the Rust ST K.`\nActual: `Good day to you transcribe. This is Polly talking to you from the Rust S. D. K.`\n" + // }, + // "result": "failure" + //} + #[derive(serde::Deserialize)] + struct Payload { + failures: Option>, + result: String, + } + let payload: Payload = serde_json::from_slice(payload.as_ref())?; + if payload.result == "failure" + || !payload + .failures + .as_ref() + .map(|m| m.is_empty()) + .unwrap_or(true) + { + if let Some(failures) = &payload.failures { + for (service, message) in failures { + error!("{service} failed:\n{message}\n"); + } + } + bail!("The canary failed."); + } + } Ok(()) } diff --git a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts index 36887ebb873..1edf4395e8c 100644 --- a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts +++ b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts @@ -152,6 +152,15 @@ export class CanaryStack extends Stack { }), ); + // Allow canaries to call EC2 + this.lambdaExecutionRole.addToPolicy( + new PolicyStatement({ + actions: ["ec2:DescribeSpotPriceHistory", "ec2:DescribeVpcs"], + effect: Effect.ALLOW, + resources: ["*"], + }), + ); + // Allow the OIDC role to pass the Lambda execution role to Lambda if (this.awsSdkRustOidcRole) { this.awsSdkRustOidcRole.oidcRole.addToPolicy( diff --git a/tools/ci-cdk/package-lock.json b/tools/ci-cdk/package-lock.json index b16f3ff4dfc..a4be8025096 100644 --- a/tools/ci-cdk/package-lock.json +++ b/tools/ci-cdk/package-lock.json @@ -1,7 +1,7 @@ { "name": "ci-cdk", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -28,6 +28,15 @@ "typescript": "~4.5.5" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -42,9 +51,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.199", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.199.tgz", - "integrity": "sha512-zNdD2OxALdsdQaRZBpTfMTuudxV+4jLMznJIvVj6O+OqCru4m5UtgVQmyApW1z2H9s4/06ovVt20aXe2G8Ta+w==", + "version": "2.2.200", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", + "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==", "dev": true }, "node_modules/@aws-cdk/asset-kubectl-v20": { @@ -53,54 +62,126 @@ "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==", "dev": true }, - "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.165", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.165.tgz", - "integrity": "sha512-bsyLQD/vqXQcc9RDmlM1XqiFNO/yewgVFXmkMcQkndJbmE/jgYkzewwYGrBlfL725hGLQipXq19+jwWwdsXQqg==", + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.0.1.tgz", + "integrity": "sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==", "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -111,21 +192,21 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -135,28 +216,25 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", + "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -209,22 +287,22 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { @@ -249,9 +327,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -288,27 +366,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -387,9 +465,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -575,19 +653,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -605,9 +683,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -662,23 +740,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -694,9 +772,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1098,9 +1176,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1122,21 +1200,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1353,17 +1425,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -1387,14 +1459,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -1414,13 +1486,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1431,13 +1503,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1458,9 +1530,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1471,13 +1543,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1498,17 +1570,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1524,12 +1596,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1547,9 +1619,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1718,9 +1790,9 @@ "dev": true }, "node_modules/aws-cdk": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.85.0.tgz", - "integrity": "sha512-duRE5rvP9Qu5iUNgA6+knHKsQ7xI6yKMUxyARTveYEzW/qDHD0RWKRu+pDbbwXLlzcr25oKGPjC3dM0ui2beKg==", + "version": "2.93.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.93.0.tgz", + "integrity": "sha512-C0o7rzlXbQ3othvQ9uZamRwr741MSX/9eZ74zNJvpkX5Eitx/XoQYwUHeD+cbb4lKHMi7m2SwJfx3yOEkpu9OQ==", "dev": true, "bin": { "cdk": "bin/cdk" @@ -1733,9 +1805,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.85.0.tgz", - "integrity": "sha512-u+ypK8XEMRH3tGRMSmcbPYxLet7xBdGIztUkMcPtlNJGhS/vxqh12yYkem3g3zzmHwdX8OPLSnlZ2sIuiIqp/g==", + "version": "2.93.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.93.0.tgz", + "integrity": "sha512-kKbcKkts272Ju5xjGKI3pXTOpiJxW4OQbDF8Vmw/NIkkuJLo8GlRCFfeOfoN/hilvlYQgENA67GCgSWccbvu7w==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -1750,9 +1822,9 @@ ], "dev": true, "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.177", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", + "@aws-cdk/asset-awscli-v1": "^2.2.200", + "@aws-cdk/asset-kubectl-v20": "^2.1.2", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.0.1", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^11.1.1", @@ -1760,7 +1832,7 @@ "jsonschema": "^1.4.1", "minimatch": "^3.1.2", "punycode": "^2.3.0", - "semver": "^7.5.1", + "semver": "^7.5.4", "table": "^6.8.1", "yaml": "1.10.2" }, @@ -2001,7 +2073,7 @@ } }, "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.5.2", + "version": "7.5.4", "dev": true, "inBundle": true, "license": "ISC", @@ -2234,9 +2306,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -2253,9 +2325,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -2311,9 +2383,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", "dev": true, "funding": [ { @@ -2398,9 +2470,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -2440,9 +2512,9 @@ "dev": true }, "node_modules/constructs": { - "version": "10.2.61", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.61.tgz", - "integrity": "sha512-8l099E1XPLN6VgUitXP6wPHLl25vc8RgxePhbCY/iRF9RGErSy6JHnI3AJU8XJ3KMaUZqhq+q9q3o+KoKM1eVw==", + "version": "10.2.69", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.69.tgz", + "integrity": "sha512-0AiM/uQe5Uk6JVe/62oolmSN2MjbFQkOlYrM3fFGZLKuT+g7xlAI10EebFhyCcZwI2JAcWuWCmmCAyCothxjuw==", "dev": true, "engines": { "node": ">= 16.14.0" @@ -2638,9 +2710,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.442", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.442.tgz", - "integrity": "sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==", + "version": "1.4.500", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", + "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", "dev": true }, "node_modules/emittery": { @@ -2692,15 +2764,14 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -2722,79 +2793,28 @@ "node": ">=4.0" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2804,7 +2824,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -2814,9 +2833,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2830,9 +2848,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -2855,9 +2873,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2867,9 +2885,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2892,12 +2910,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -3035,9 +3053,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3263,9 +3281,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3303,12 +3321,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3478,9 +3490,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3602,26 +3614,26 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -3639,9 +3651,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4450,29 +4462,20 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -4583,9 +4586,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -4610,9 +4613,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/once": { @@ -4640,17 +4643,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -4990,12 +4993,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5112,9 +5115,9 @@ } }, "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5782,15 +5785,6 @@ "node": ">= 8" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5922,4381 +5916,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-cdk/asset-awscli-v1": { - "version": "2.2.199", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.199.tgz", - "integrity": "sha512-zNdD2OxALdsdQaRZBpTfMTuudxV+4jLMznJIvVj6O+OqCru4m5UtgVQmyApW1z2H9s4/06ovVt20aXe2G8Ta+w==", - "dev": true - }, - "@aws-cdk/asset-kubectl-v20": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", - "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==", - "dev": true - }, - "@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.165", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.165.tgz", - "integrity": "sha512-bsyLQD/vqXQcc9RDmlM1XqiFNO/yewgVFXmkMcQkndJbmE/jgYkzewwYGrBlfL725hGLQipXq19+jwWwdsXQqg==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.5" - } - }, - "@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "dev": true - }, - "@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", - "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", - "dev": true, - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "aws-cdk": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.85.0.tgz", - "integrity": "sha512-duRE5rvP9Qu5iUNgA6+knHKsQ7xI6yKMUxyARTveYEzW/qDHD0RWKRu+pDbbwXLlzcr25oKGPjC3dM0ui2beKg==", - "dev": true, - "requires": { - "fsevents": "2.3.2" - } - }, - "aws-cdk-lib": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.85.0.tgz", - "integrity": "sha512-u+ypK8XEMRH3tGRMSmcbPYxLet7xBdGIztUkMcPtlNJGhS/vxqh12yYkem3g3zzmHwdX8OPLSnlZ2sIuiIqp/g==", - "dev": true, - "requires": { - "@aws-cdk/asset-awscli-v1": "^2.2.177", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.1.1", - "ignore": "^5.2.4", - "jsonschema": "^1.4.1", - "minimatch": "^3.1.2", - "punycode": "^2.3.0", - "semver": "^7.5.1", - "table": "^6.8.1", - "yaml": "1.10.2" - }, - "dependencies": { - "@balena/dockerignore": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "8.12.0", - "bundled": true, - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "case": { - "version": "1.6.3", - "bundled": true, - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "bundled": true, - "dev": true - }, - "fs-extra": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true, - "dev": true - }, - "ignore": { - "version": "5.2.4", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonschema": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "punycode": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "7.5.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "slice-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "table": { - "version": "6.8.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "universalify": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yaml": { - "version": "1.10.2", - "bundled": true, - "dev": true - } - } - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "constructs": { - "version": "10.2.61", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.61.tgz", - "integrity": "sha512-8l099E1XPLN6VgUitXP6wPHLl25vc8RgxePhbCY/iRF9RGErSy6JHnI3AJU8XJ3KMaUZqhq+q9q3o+KoKM1eVw==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.442", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.442.tgz", - "integrity": "sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - } - }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true - }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - } - }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "27.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", - "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - } - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From 778244f801b720bb2b2325a648378f0a51d7ecc6 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 24 Aug 2023 14:51:06 -0500 Subject: [PATCH 097/331] update MSRV to 1.70.0 (#2948) ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 2 +- .github/workflows/claim-crate-names.yml | 2 +- .github/workflows/github-pages.yml | 2 +- .github/workflows/pull-request-bot.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-sdk-next.yml | 2 +- CHANGELOG.next.toml | 12 ++++++++++++ aws/sdk/integration-tests/lambda/tests/request_id.rs | 2 +- .../amazon/smithy/rust/codegen/core/testutil/Rust.kt | 2 +- gradle.properties | 2 +- .../aws-smithy-client/src/test_connection.rs | 2 +- rust-runtime/aws-smithy-http/src/connection.rs | 1 + rust-toolchain.toml | 2 +- tools/ci-build/Dockerfile | 2 +- 14 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf77376937f..9108652368a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ on: required: false env: - rust_version: 1.69.0 + rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt ENCRYPTED_DOCKER_PASSWORD: ${{ secrets.ENCRYPTED_DOCKER_PASSWORD }} DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }} diff --git a/.github/workflows/claim-crate-names.yml b/.github/workflows/claim-crate-names.yml index 6f714a76713..12b7df9fff4 100644 --- a/.github/workflows/claim-crate-names.yml +++ b/.github/workflows/claim-crate-names.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.69.0 + rust_version: 1.70.0 name: Claim unpublished crate names on crates.io run-name: ${{ github.workflow }} diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index c15767baa16..e0910ceca4c 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -8,7 +8,7 @@ on: name: Update GitHub Pages env: - rust_version: 1.69.0 + rust_version: 1.70.0 # Allow only one doc pages build to run at a time for the entire smithy-rs repo concurrency: diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 82fc80d9752..4828ad3934a 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -28,7 +28,7 @@ concurrency: env: java_version: 11 - rust_version: 1.69.0 + rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt apt_dependencies: libssl-dev gnuplot jq diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d33ceba4ce..670b68a2e63 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.69.0 + rust_version: 1.70.0 name: Release smithy-rs run-name: ${{ github.workflow }} ${{ inputs.semantic_version }} (${{ inputs.commit_sha }}) - ${{ inputs.dry_run && 'Dry run' || 'Production run' }} diff --git a/.github/workflows/update-sdk-next.yml b/.github/workflows/update-sdk-next.yml index a06bf21ad8a..01432266695 100644 --- a/.github/workflows/update-sdk-next.yml +++ b/.github/workflows/update-sdk-next.yml @@ -45,7 +45,7 @@ jobs: - name: Set up Rust uses: dtolnay/rust-toolchain@master with: - toolchain: 1.69.0 + toolchain: 1.70.0 - name: Delete old SDK run: | - name: Generate a fresh SDK diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e692f9c18e7..8f11accc1e8 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -42,3 +42,15 @@ as opposed to AWS credentials in `&str` form. [Read more](https://github.com/aws references = ["smithy-rs#2913"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "Velfi" + +[[aws-sdk-rust]] +message = "Update MSRV to Rust 1.70.0" +references = ["smithy-rs#2948"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "Velfi" + +[[smithy-rs]] +message = "Update MSRV to Rust 1.70.0" +references = ["smithy-rs#2948"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "Velfi" diff --git a/aws/sdk/integration-tests/lambda/tests/request_id.rs b/aws/sdk/integration-tests/lambda/tests/request_id.rs index 0e071945aa4..b4204b08888 100644 --- a/aws/sdk/integration-tests/lambda/tests/request_id.rs +++ b/aws/sdk/integration-tests/lambda/tests/request_id.rs @@ -22,7 +22,7 @@ async fn run_test( let client = Client::from_conf(conf); let resp = client.list_functions().send().await; if expect_error { - let err = resp.err().expect("should be an error").into_service_error(); + let err = resp.expect_err("should be an error").into_service_error(); assert!(matches!(err, ListFunctionsError::Unhandled(_))); assert_eq!(Some("correct-request-id"), err.request_id()); assert_eq!(Some("correct-request-id"), err.meta().request_id()); diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index 0a4a52f839b..c0b152fe2e7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -111,7 +111,7 @@ object TestWorkspace { // help rust select the right version when we run cargo test // TODO(https://github.com/awslabs/smithy-rs/issues/2048): load this from the msrv property using a // method as we do for runtime crate versions - "[toolchain]\nchannel = \"1.69.0\"\n", + "[toolchain]\nchannel = \"1.70.0\"\n", ) // ensure there at least an empty lib.rs file to avoid broken crates newProject.resolve("src").mkdirs() diff --git a/gradle.properties b/gradle.properties index 38f796d5147..de21435a169 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # # Rust MSRV (entered into the generated README) -rust.msrv=1.69.0 +rust.msrv=1.70.0 # To enable debug, swap out the two lines below. # When changing this value, be sure to run `./gradlew --stop` to kill the Gradle daemon. diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs index a339eac6bb8..1c90e7606f1 100644 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ b/rust-runtime/aws-smithy-client/src/test_connection.rs @@ -577,7 +577,7 @@ pub mod wire_mock { rx.await.ok(); tracing::info!("server shutdown!"); }); - spawn(async move { server.await }); + spawn(server); Self { event_log: wire_events, bind_addr: listener_addr, diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs index f98bb780bd1..38c5fdf38f9 100644 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ b/rust-runtime/aws-smithy-http/src/connection.rs @@ -94,6 +94,7 @@ mod test { use crate::connection::{CaptureSmithyConnection, ConnectionMetadata}; #[test] + #[allow(clippy::redundant_clone)] fn retrieve_connection_metadata() { let retriever = CaptureSmithyConnection::new(); let retriever_clone = retriever.clone(); diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f2415f8315c..22048ac5bba 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.69.0" +channel = "1.70.0" diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 2254dfb5b14..5a7b9a230aa 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -6,7 +6,7 @@ # This is the base Docker build image used by CI ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 -ARG rust_stable_version=1.69.0 +ARG rust_stable_version=1.70.0 ARG rust_nightly_version=nightly-2023-05-31 FROM ${base_image} AS bare_base_image From 83df047f49be1a242abd0422c75f2b47007bb73c Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Mon, 28 Aug 2023 10:54:39 -0500 Subject: [PATCH 098/331] update Smithy version to 1.37 (#2949) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../endpoint/generators/EndpointTestGenerator.kt | 12 +++++------- gradle.properties | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt index c5b415b2a6b..8a9fc9914e2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt @@ -144,14 +144,12 @@ internal class EndpointTestGenerator( "let mut out = #{HashMap}::::new();", *codegenScope, ) - // TODO(https://github.com/awslabs/smithy/pull/1555): remove sort by name when upgrading to - // Smithy version with this PR merged - val keys = mutableListOf() - value.forEach { id, _ -> keys.add(id) } - keys.sortedBy { it.name.value }.forEach { identifier -> - val v = value.get(identifier) + val ids = mutableListOf() + value.forEach { id, _ -> ids.add(id) } + ids.forEach { id -> + val v = value.get(id) rust( - "out.insert(${identifier.toString().dq()}.to_string(), #W.into());", + "out.insert(${id.toString().dq()}.to_string(), #W.into());", // When writing into the hashmap, it always needs to be an owned type generateValue(v), ) diff --git a/gradle.properties b/gradle.properties index de21435a169..a899e93f333 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ kotlin.code.style=official # codegen smithyGradlePluginVersion=0.7.0 -smithyVersion=1.35.0 +smithyVersion=1.37.0 # kotlin kotlinVersion=1.7.21 From 0d44c68bbb802a8d26e2415af3ecb8f19ac61317 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 29 Aug 2023 10:48:29 -0400 Subject: [PATCH 099/331] Fix chrono deprecation (#2956) ## Motivation and Context Chrono deprecated an API ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-types-convert/Cargo.toml | 2 +- rust-runtime/aws-smithy-types-convert/src/date_time.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rust-runtime/aws-smithy-types-convert/Cargo.toml b/rust-runtime/aws-smithy-types-convert/Cargo.toml index f657571a481..4fa2b9d1073 100644 --- a/rust-runtime/aws-smithy-types-convert/Cargo.toml +++ b/rust-runtime/aws-smithy-types-convert/Cargo.toml @@ -13,7 +13,7 @@ convert-time = ["aws-smithy-types", "time"] [dependencies] aws-smithy-types = { path = "../aws-smithy-types", optional = true } -chrono = { version = "0.4.23", optional = true, default-features = false, features = ["std"] } +chrono = { version = "0.4.26", optional = true, default-features = false, features = ["std"] } time = { version = "0.3.4", optional = true } [package.metadata.docs.rs] diff --git a/rust-runtime/aws-smithy-types-convert/src/date_time.rs b/rust-runtime/aws-smithy-types-convert/src/date_time.rs index 905dcbfc133..c0859534fff 100644 --- a/rust-runtime/aws-smithy-types-convert/src/date_time.rs +++ b/rust-runtime/aws-smithy-types-convert/src/date_time.rs @@ -136,7 +136,7 @@ impl DateTimeExt for DateTime { self.secs(), self.subsec_nanos() ))), - Some(dt) => Ok(chrono::DateTime::::from_utc(dt, chrono::Utc)), + Some(dt) => Ok(chrono::TimeZone::from_utc_datetime(&chrono::Utc, &dt)), } } From 997c9c85be0951a64cf2b8d1cc55c62f6116d464 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 29 Aug 2023 15:35:24 -0500 Subject: [PATCH 100/331] Cherry-picks updating MSRV to 1.70.0 from main to smithy-rs-release-0.56.x (#2959) ## Motivation and Context Cherry picks MSRV 1.70.0 upgrade ([original PR](https://github.com/awslabs/smithy-rs/pull/2948) merged to `main`) ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: Zelda Hessler --- .github/workflows/ci.yml | 2 +- .github/workflows/claim-crate-names.yml | 2 +- .github/workflows/github-pages.yml | 2 +- .github/workflows/pull-request-bot.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-sdk-next.yml | 2 +- CHANGELOG.next.toml | 14 +++++++++++++- .../integration-tests/lambda/tests/request_id.rs | 2 +- .../smithy/rust/codegen/core/testutil/Rust.kt | 2 +- gradle.properties | 2 +- .../aws-smithy-client/src/test_connection.rs | 2 +- rust-runtime/aws-smithy-http/src/connection.rs | 1 + rust-runtime/aws-smithy-types-convert/Cargo.toml | 2 +- .../aws-smithy-types-convert/src/date_time.rs | 2 +- rust-toolchain.toml | 2 +- tools/ci-build/Dockerfile | 2 +- 16 files changed, 28 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4208b271ac..5e64a99489d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ on: required: false env: - rust_version: 1.69.0 + rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt ENCRYPTED_DOCKER_PASSWORD: ${{ secrets.ENCRYPTED_DOCKER_PASSWORD }} DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }} diff --git a/.github/workflows/claim-crate-names.yml b/.github/workflows/claim-crate-names.yml index 6f714a76713..12b7df9fff4 100644 --- a/.github/workflows/claim-crate-names.yml +++ b/.github/workflows/claim-crate-names.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.69.0 + rust_version: 1.70.0 name: Claim unpublished crate names on crates.io run-name: ${{ github.workflow }} diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index c15767baa16..e0910ceca4c 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -8,7 +8,7 @@ on: name: Update GitHub Pages env: - rust_version: 1.69.0 + rust_version: 1.70.0 # Allow only one doc pages build to run at a time for the entire smithy-rs repo concurrency: diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 82fc80d9752..4828ad3934a 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -28,7 +28,7 @@ concurrency: env: java_version: 11 - rust_version: 1.69.0 + rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt apt_dependencies: libssl-dev gnuplot jq diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d33ceba4ce..670b68a2e63 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.69.0 + rust_version: 1.70.0 name: Release smithy-rs run-name: ${{ github.workflow }} ${{ inputs.semantic_version }} (${{ inputs.commit_sha }}) - ${{ inputs.dry_run && 'Dry run' || 'Production run' }} diff --git a/.github/workflows/update-sdk-next.yml b/.github/workflows/update-sdk-next.yml index a06bf21ad8a..01432266695 100644 --- a/.github/workflows/update-sdk-next.yml +++ b/.github/workflows/update-sdk-next.yml @@ -45,7 +45,7 @@ jobs: - name: Set up Rust uses: dtolnay/rust-toolchain@master with: - toolchain: 1.69.0 + toolchain: 1.70.0 - name: Delete old SDK run: | - name: Generate a fresh SDK diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..1f8def037a2 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,16 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Update MSRV to Rust 1.70.0" +references = ["smithy-rs#2948"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "Velfi" + +[[smithy-rs]] +message = "Update MSRV to Rust 1.70.0" +references = ["smithy-rs#2948"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "Velfi" diff --git a/aws/sdk/integration-tests/lambda/tests/request_id.rs b/aws/sdk/integration-tests/lambda/tests/request_id.rs index 0e071945aa4..b4204b08888 100644 --- a/aws/sdk/integration-tests/lambda/tests/request_id.rs +++ b/aws/sdk/integration-tests/lambda/tests/request_id.rs @@ -22,7 +22,7 @@ async fn run_test( let client = Client::from_conf(conf); let resp = client.list_functions().send().await; if expect_error { - let err = resp.err().expect("should be an error").into_service_error(); + let err = resp.expect_err("should be an error").into_service_error(); assert!(matches!(err, ListFunctionsError::Unhandled(_))); assert_eq!(Some("correct-request-id"), err.request_id()); assert_eq!(Some("correct-request-id"), err.meta().request_id()); diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index 0a4a52f839b..c0b152fe2e7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -111,7 +111,7 @@ object TestWorkspace { // help rust select the right version when we run cargo test // TODO(https://github.com/awslabs/smithy-rs/issues/2048): load this from the msrv property using a // method as we do for runtime crate versions - "[toolchain]\nchannel = \"1.69.0\"\n", + "[toolchain]\nchannel = \"1.70.0\"\n", ) // ensure there at least an empty lib.rs file to avoid broken crates newProject.resolve("src").mkdirs() diff --git a/gradle.properties b/gradle.properties index 38f796d5147..de21435a169 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # # Rust MSRV (entered into the generated README) -rust.msrv=1.69.0 +rust.msrv=1.70.0 # To enable debug, swap out the two lines below. # When changing this value, be sure to run `./gradlew --stop` to kill the Gradle daemon. diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs index a339eac6bb8..1c90e7606f1 100644 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ b/rust-runtime/aws-smithy-client/src/test_connection.rs @@ -577,7 +577,7 @@ pub mod wire_mock { rx.await.ok(); tracing::info!("server shutdown!"); }); - spawn(async move { server.await }); + spawn(server); Self { event_log: wire_events, bind_addr: listener_addr, diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs index f98bb780bd1..38c5fdf38f9 100644 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ b/rust-runtime/aws-smithy-http/src/connection.rs @@ -94,6 +94,7 @@ mod test { use crate::connection::{CaptureSmithyConnection, ConnectionMetadata}; #[test] + #[allow(clippy::redundant_clone)] fn retrieve_connection_metadata() { let retriever = CaptureSmithyConnection::new(); let retriever_clone = retriever.clone(); diff --git a/rust-runtime/aws-smithy-types-convert/Cargo.toml b/rust-runtime/aws-smithy-types-convert/Cargo.toml index f657571a481..4fa2b9d1073 100644 --- a/rust-runtime/aws-smithy-types-convert/Cargo.toml +++ b/rust-runtime/aws-smithy-types-convert/Cargo.toml @@ -13,7 +13,7 @@ convert-time = ["aws-smithy-types", "time"] [dependencies] aws-smithy-types = { path = "../aws-smithy-types", optional = true } -chrono = { version = "0.4.23", optional = true, default-features = false, features = ["std"] } +chrono = { version = "0.4.26", optional = true, default-features = false, features = ["std"] } time = { version = "0.3.4", optional = true } [package.metadata.docs.rs] diff --git a/rust-runtime/aws-smithy-types-convert/src/date_time.rs b/rust-runtime/aws-smithy-types-convert/src/date_time.rs index 905dcbfc133..c0859534fff 100644 --- a/rust-runtime/aws-smithy-types-convert/src/date_time.rs +++ b/rust-runtime/aws-smithy-types-convert/src/date_time.rs @@ -136,7 +136,7 @@ impl DateTimeExt for DateTime { self.secs(), self.subsec_nanos() ))), - Some(dt) => Ok(chrono::DateTime::::from_utc(dt, chrono::Utc)), + Some(dt) => Ok(chrono::TimeZone::from_utc_datetime(&chrono::Utc, &dt)), } } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f2415f8315c..22048ac5bba 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.69.0" +channel = "1.70.0" diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 2254dfb5b14..5a7b9a230aa 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -6,7 +6,7 @@ # This is the base Docker build image used by CI ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 -ARG rust_stable_version=1.69.0 +ARG rust_stable_version=1.70.0 ARG rust_nightly_version=nightly-2023-05-31 FROM ${base_image} AS bare_base_image From cf95f4803aaad77197b3ce3a39570f85408bfd2a Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 29 Aug 2023 16:22:21 -0500 Subject: [PATCH 101/331] Make `CustomizableOperation` `Send` and `Sync` (#2951) ## Motivation and Context Fixes https://github.com/awslabs/smithy-rs/issues/2944 ## Description `CustomizableOperation` in the last two releases ([release-2023-08-01](https://github.com/awslabs/smithy-rs/releases/tag/release-2023-08-01) and [release-2023-08-22](https://github.com/awslabs/smithy-rs/releases/tag/release-2023-08-22)) broke backward-compatibility with respect to its auto traits. Specifically, it ceased to be `Send` and `Sync` because the struct contained a boxed trait object. This PR fix that issue, making `CustomizableOperation` `Send` and `Sync` again. ## Testing - Added a Kotlin unit test to verify `CustomizableOperation` is `Send` and `Sync`. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- CHANGELOG.next.toml | 12 +++ .../client/CustomizableOperationGenerator.kt | 44 ++++++---- .../client/FluentClientGenerator.kt | 43 +++++++--- .../CustomizableOperationGeneratorTest.kt | 83 +++++++++++++++++++ 4 files changed, 155 insertions(+), 27 deletions(-) create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 1f8def037a2..0cc492e7ea2 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -22,3 +22,15 @@ message = "Update MSRV to Rust 1.70.0" references = ["smithy-rs#2948"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "Velfi" + +[[aws-sdk-rust]] +message = "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again." +references = ["smithy-rs#2944", "smithy-rs#2951"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" + +[[smithy-rs]] +message = "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again." +references = ["smithy-rs#2944", "smithy-rs#2951"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "ysaito1001" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 5c2c4e63ebc..2e919d8c56b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -155,6 +155,7 @@ class CustomizableOperationGenerator( .resolve("client::interceptors::MapRequestInterceptor"), "MutateRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) .resolve("client::interceptors::MutateRequestInterceptor"), + "PhantomData" to RuntimeType.Phantom, "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(runtimeConfig), "SendResult" to ClientRustModule.Client.customize.toType() @@ -185,14 +186,28 @@ class CustomizableOperationGenerator( rustTemplate( """ /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. - pub struct CustomizableOperation { - pub(crate) customizable_send: #{Box}>, - pub(crate) config_override: #{Option}, - pub(crate) interceptors: Vec<#{SharedInterceptor}>, - pub(crate) runtime_plugins: Vec<#{SharedRuntimePlugin}>, + pub struct CustomizableOperation { + customizable_send: B, + config_override: #{Option}, + interceptors: Vec<#{SharedInterceptor}>, + runtime_plugins: Vec<#{SharedRuntimePlugin}>, + _output: #{PhantomData}, + _error: #{PhantomData}, } - impl CustomizableOperation { + impl CustomizableOperation { + /// Creates a new `CustomizableOperation` from `customizable_send`. + pub(crate) fn new(customizable_send: B) -> Self { + Self { + customizable_send, + config_override: #{None}, + interceptors: vec![], + runtime_plugins: vec![], + _output: #{PhantomData}, + _error: #{PhantomData} + } + } + /// Adds an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. /// /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`, @@ -265,6 +280,7 @@ class CustomizableOperationGenerator( ) -> #{SendResult} where E: std::error::Error + #{Send} + #{Sync} + 'static, + B: #{CustomizableSend}, { let mut config_override = if let Some(config_override) = self.config_override { config_override @@ -279,7 +295,7 @@ class CustomizableOperationGenerator( config_override.push_runtime_plugin(plugin); }); - (self.customizable_send)(config_override).await + self.customizable_send.send(config_override).await } #{additional_methods} @@ -311,14 +327,12 @@ class CustomizableOperationGenerator( >, >; - pub trait CustomizableSend: - #{FnOnce}(crate::config::Builder) -> BoxFuture> - {} - - impl CustomizableSend for F - where - F: #{FnOnce}(crate::config::Builder) -> BoxFuture> - {} + pub trait CustomizableSend: #{Send} + #{Sync} { + // Takes an owned `self` as the implementation will internally call methods that take `self`. + // If it took `&self`, that would make this trait object safe, but some implementing types do not + // derive `Clone`, unable to yield `self` from `&self`. + fn send(self, config_override: crate::config::Builder) -> BoxFuture>; + } """, *preludeScope, "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index dfb7ccf0670..eec95f349b5 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -387,6 +387,35 @@ class FluentClientGenerator( } } + if (smithyRuntimeMode.generateOrchestrator) { + rustTemplate( + """ + impl + crate::client::customize::internal::CustomizableSend< + #{OperationOutput}, + #{OperationError}, + > for $builderName + { + fn send( + self, + config_override: crate::config::Builder, + ) -> crate::client::customize::internal::BoxFuture< + crate::client::customize::internal::SendResult< + #{OperationOutput}, + #{OperationError}, + >, + > { + #{Box}::pin(async move { self.config_override(config_override).send().await }) + } + } + """, + *preludeScope, + "OperationError" to errorType, + "OperationOutput" to outputType, + "SdkError" to RuntimeType.sdkError(runtimeConfig), + ) + } + rustBlockTemplate( "impl${generics.inst} $builderName${generics.inst} #{bounds:W}", "client" to RuntimeType.smithyClient(runtimeConfig), @@ -520,22 +549,12 @@ class FluentClientGenerator( #{CustomizableOperation}< #{OperationOutput}, #{OperationError}, + Self, >, #{SdkError}<#{OperationError}>, > { - #{Ok}(#{CustomizableOperation} { - customizable_send: #{Box}::new(move |config_override| { - #{Box}::pin(async { - self.config_override(config_override) - .send() - .await - }) - }), - config_override: None, - interceptors: vec![], - runtime_plugins: vec![], - }) + #{Ok}(#{CustomizableOperation}::new(self)) } """, *orchestratorScope, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt new file mode 100644 index 00000000000..64b47e89652 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.client + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class CustomizableOperationGeneratorTest { + val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + + @optionalAuth + operation SayHello { input: TestInput } + structure TestInput { + foo: String, + } + """.asSmithyModel() + + @Test + fun `CustomizableOperation is send and sync`() { + val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> + rustCrate.integrationTest("customizable_operation_is_send_and_sync") { + val moduleName = codegenContext.moduleUseName() + rustTemplate( + """ + fn check_send_and_sync(_: T) {} + + ##[test] + fn test() { + let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); + let config = $moduleName::Config::builder() + .endpoint_resolver("http://localhost:1234") + #{set_http_connector} + .build(); + let smithy_client = aws_smithy_client::Builder::new() + .connector(connector.clone()) + .middleware_fn(|r| r) + .build_dyn(); + let client = $moduleName::Client::with_config(smithy_client, config); + check_send_and_sync(client.say_hello().customize()); + } + """, + "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + .toDevDependency() + .withFeature("test-util").toType() + .resolve("test_connection::TestConnection"), + "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "set_http_connector" to writable { + if (codegenContext.smithyRuntimeMode.generateOrchestrator) { + rust(".http_connector(connector.clone())") + } + }, + ) + } + } + clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams, test = test) + clientIntegrationTest( + model, + TestCodegenSettings.orchestratorModeTestParams, + test = test, + ) + } +} From 2653bf87d142b5a2b21a8d09aa62db9d5444d28f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 29 Aug 2023 14:54:59 -0700 Subject: [PATCH 102/331] Set a region on the canary CDK stack to simplify deployment (#2954) Previously, if you forgot to set the region, the deployment would fail with a confusing error about the OIDC provider already existing, which can easily lead down a rabbit hole. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-cdk/bin/canary-only.ts | 3 ++- tools/ci-cdk/bin/ci-cdk.ts | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/ci-cdk/bin/canary-only.ts b/tools/ci-cdk/bin/canary-only.ts index d9a8e9b82b2..d20fa053f9d 100644 --- a/tools/ci-cdk/bin/canary-only.ts +++ b/tools/ci-cdk/bin/canary-only.ts @@ -12,5 +12,6 @@ import { App } from "aws-cdk-lib"; import { CanaryStack } from "../lib/aws-sdk-rust/canary-stack"; const app = new App(); +const env = { region: "us-west-2" }; -new CanaryStack(app, "aws-sdk-rust-canary-stack", {}); +new CanaryStack(app, "aws-sdk-rust-canary-stack", { env }); diff --git a/tools/ci-cdk/bin/ci-cdk.ts b/tools/ci-cdk/bin/ci-cdk.ts index 82297be2768..3db652f100f 100644 --- a/tools/ci-cdk/bin/ci-cdk.ts +++ b/tools/ci-cdk/bin/ci-cdk.ts @@ -10,14 +10,19 @@ import { PullRequestCdnStack } from "../lib/smithy-rs/pull-request-cdn-stack"; import { CanaryStack } from "../lib/aws-sdk-rust/canary-stack"; import { OidcProviderStack } from "../lib/oidc-provider-stack"; -const app = new App(); +const app = new App({}); +const env = { region: "us-west-2" }; -const oidcProviderStack = new OidcProviderStack(app, "oidc-provider-stack", {}); +const oidcProviderStack = new OidcProviderStack(app, "oidc-provider-stack", { + env, +}); new PullRequestCdnStack(app, "smithy-rs-pull-request-cdn-stack", { githubActionsOidcProvider: oidcProviderStack.githubActionsOidcProvider, + env, }); new CanaryStack(app, "aws-sdk-rust-canary-stack", { githubActionsOidcProvider: oidcProviderStack.githubActionsOidcProvider, + env, }); From 9f3960799fef0fc1fa392b32388d1413162a2b14 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 29 Aug 2023 14:55:21 -0700 Subject: [PATCH 103/331] Add `@optionalAuth` to all S3 operations (#2955) In #2907, I created an allow list of S3 operations to add `@optionalAuth` to, but this turns out to be too restrictive, as seen in https://github.com/awslabs/aws-sdk-rust/issues/878. This PR restores the original middleware behavior of allowing optional auth for all S3 operations. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++++++ .../amazon/smithy/rustsdk/customize/s3/S3Decorator.kt | 10 ++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8f11accc1e8..4a10a0913e0 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -54,3 +54,9 @@ message = "Update MSRV to Rust 1.70.0" references = ["smithy-rs#2948"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "Velfi" + +[[aws-sdk-rust]] +message = "Allow `no_credentials` to be used with all S3 operations." +references = ["smithy-rs#2955", "aws-sdk-rust#878"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "jdisanti" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt index e83ebb1e9af..31f134d0bb1 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt @@ -135,15 +135,9 @@ class FilterEndpointTests( // TODO(P96049742): This model transform may need to change depending on if and how the S3 model is updated. private class AddOptionalAuth { - private val s3OptionalAuthOperations = listOf( - ShapeId.from("com.amazonaws.s3#ListObjects"), - ShapeId.from("com.amazonaws.s3#ListObjectsV2"), - ShapeId.from("com.amazonaws.s3#HeadObject"), - ShapeId.from("com.amazonaws.s3#GetObject"), - ) - fun transform(model: Model) = ModelTransformer.create().mapShapes(model) { shape -> - if (shape is OperationShape && s3OptionalAuthOperations.contains(shape.id) && !shape.hasTrait()) { + // Add @optionalAuth to all S3 operations + if (shape is OperationShape && !shape.hasTrait()) { shape.toBuilder() .addTrait(OptionalAuthTrait()) .build() From 2db1c34d5eef02426ffaf3c7918c143415a74ec2 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 30 Aug 2023 10:27:06 -0400 Subject: [PATCH 104/331] Allow to trigger error handling for S3 (#2958) ## Motivation and Context - https://github.com/awslabs/aws-sdk-rust/issues/873 ## Description Add a customization for S3 so that if `` is the root element, we trigger the error parsing flow ## Testing - Added an integration test ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 +++ .../rustsdk/customize/s3/S3Decorator.kt | 36 +++++++++++++++-- .../s3/tests/status-200-errors.rs | 40 +++++++++++++++++++ .../generators/OperationCustomization.kt | 8 ++++ .../protocol/ResponseDeserializerGenerator.kt | 12 ++++-- 5 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 aws/sdk/integration-tests/s3/tests/status-200-errors.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 4a10a0913e0..6c92ef896b2 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -55,6 +55,12 @@ references = ["smithy-rs#2948"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "Velfi" +[[aws-sdk-rust]] +message = "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases." +references = ["smithy-rs#2958", "aws-sdk-rust#873"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "rcoh" + [[aws-sdk-rust]] message = "Allow `no_credentials` to be used with all S3 operations." references = ["smithy-rs#2955", "aws-sdk-rust#878"] diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt index 31f134d0bb1..a5610f0ef01 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt @@ -23,7 +23,9 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientRestXmlFactory import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate @@ -106,6 +108,34 @@ class S3Decorator : ClientCodegenDecorator { ) } + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List { + return baseCustomizations + object : OperationCustomization() { + override fun section(section: OperationSection): Writable { + return writable { + when (section) { + is OperationSection.BeforeParseResponse -> { + section.body?.also { body -> + rustTemplate( + """ + if matches!(#{errors}::body_is_error($body), Ok(true)) { + ${section.forceError} = true; + } + """, + "errors" to RuntimeType.unwrappedXmlErrors(codegenContext.runtimeConfig), + ) + } + } + else -> {} + } + } + } + } + } + private fun isInInvalidXmlRootAllowList(shape: Shape): Boolean { return shape.isStructureShape && invalidXmlRootAllowList.contains(shape.id) } @@ -115,7 +145,7 @@ class FilterEndpointTests( private val testFilter: (EndpointTestCase) -> EndpointTestCase? = { a -> a }, private val operationInputFilter: (EndpointTestOperationInput) -> EndpointTestOperationInput? = { a -> a }, ) { - fun updateEndpointTests(endpointTests: List): List { + private fun updateEndpointTests(endpointTests: List): List { val filteredTests = endpointTests.mapNotNull { test -> testFilter(test) } return filteredTests.map { test -> val operationInputs = test.operationInputs @@ -123,7 +153,7 @@ class FilterEndpointTests( } } - fun transform(model: Model) = ModelTransformer.create().mapTraits(model) { _, trait -> + fun transform(model: Model): Model = ModelTransformer.create().mapTraits(model) { _, trait -> when (trait) { is EndpointTestsTrait -> EndpointTestsTrait.builder().testCases(updateEndpointTests(trait.testCases)) .version(trait.version).build() @@ -135,7 +165,7 @@ class FilterEndpointTests( // TODO(P96049742): This model transform may need to change depending on if and how the S3 model is updated. private class AddOptionalAuth { - fun transform(model: Model) = ModelTransformer.create().mapShapes(model) { shape -> + fun transform(model: Model): Model = ModelTransformer.create().mapShapes(model) { shape -> // Add @optionalAuth to all S3 operations if (shape is OperationShape && !shape.hasTrait()) { shape.toBuilder() diff --git a/aws/sdk/integration-tests/s3/tests/status-200-errors.rs b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs new file mode 100644 index 00000000000..5fee498ec65 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs @@ -0,0 +1,40 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_credential_types::provider::SharedCredentialsProvider; +use aws_credential_types::Credentials; +use aws_sdk_s3::Client; +use aws_smithy_client::test_connection::infallible_connection_fn; +use aws_smithy_http::body::SdkBody; +use aws_smithy_types::error::metadata::ProvideErrorMetadata; +use aws_types::region::Region; +use aws_types::SdkConfig; + +const ERROR_RESPONSE: &str = r#" + + SlowDown + Please reduce your request rate. + K2H6N7ZGQT6WHCEG + WWoZlnK4pTjKCYn6eNV7GgOurabfqLkjbSyqTvDMGBaI9uwzyNhSaDhOCPs8paFGye7S6b/AB3A= + +"#; + +#[tokio::test] +async fn status_200_errors() { + let conn = infallible_connection_fn(|_req| http::Response::new(SdkBody::from(ERROR_RESPONSE))); + let sdk_config = SdkConfig::builder() + .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .region(Region::new("us-west-4")) + .http_connector(conn) + .build(); + let client = Client::new(&sdk_config); + let error = client + .delete_objects() + .bucket("bucket") + .send() + .await + .expect_err("should fail"); + assert_eq!(error.into_service_error().code(), Some("SlowDown")); +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index 7088dbdb02e..d872311cd6a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -48,6 +48,14 @@ sealed class OperationSection(name: String) : Section(name) { data class BeforeParseResponse( override val customizations: List, val responseName: String, + /** + * Name of the `force_error` variable. Set this to true to trigger error parsing. + */ + val forceError: String, + /** + * When set, the name of the response body data field + */ + val body: String?, ) : OperationSection("BeforeParseResponse") /** diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index 0f68a27603b..6a04bb0c4a9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -94,10 +94,12 @@ class ResponseDeserializerGenerator( rustTemplate( """ fn deserialize_streaming(&self, response: &mut #{HttpResponse}) -> #{Option}<#{OutputOrError}> { + ##[allow(unused_mut)] + let mut force_error = false; #{BeforeParseResponse} // If this is an error, defer to the non-streaming parser - if !response.status().is_success() && response.status().as_u16() != $successCode { + if (!response.status().is_success() && response.status().as_u16() != $successCode) || force_error { return #{None}; } #{Some}(#{type_erase_result}(#{parse_streaming_response}(response))) @@ -106,7 +108,7 @@ class ResponseDeserializerGenerator( *codegenScope, "parse_streaming_response" to parserGenerator.parseStreamingResponseFn(operationShape, customizations), "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) + writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response", "force_error", body = null)) }, ) } @@ -136,8 +138,10 @@ class ResponseDeserializerGenerator( let (success, status) = (response.status().is_success(), response.status().as_u16()); let headers = response.headers(); let body = response.body().bytes().expect("body loaded"); + ##[allow(unused_mut)] + let mut force_error = false; #{BeforeParseResponse} - let parse_result = if !success && status != $successCode { + let parse_result = if !success && status != $successCode || force_error { #{parse_error}(status, headers, body) } else { #{parse_response}(status, headers, body) @@ -148,7 +152,7 @@ class ResponseDeserializerGenerator( "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), "parse_response" to parserGenerator.parseResponseFn(operationShape, customizations), "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) + writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response", "force_error", "body")) }, ) } From af444fbb5b5acea0d445431f4972125c7a9409ef Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Wed, 30 Aug 2023 10:22:17 -0500 Subject: [PATCH 105/331] update models (#2962) needed for my nullability PR. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/aws-models/dynamodb.json | 796 +++- aws/sdk/aws-models/ec2.json | 199 +- aws/sdk/aws-models/iam.json | 2100 ++++++--- aws/sdk/aws-models/kms.json | 1088 ++++- aws/sdk/aws-models/lambda.json | 344 +- aws/sdk/aws-models/polly.json | 447 +- aws/sdk/aws-models/qldb-session.json | 352 +- aws/sdk/aws-models/route53.json | 1013 ++--- aws/sdk/aws-models/s3.json | 991 ++++- aws/sdk/aws-models/s3control.json | 3979 +++++++++--------- aws/sdk/aws-models/sso.json | 369 +- aws/sdk/aws-models/sts.json | 753 ++-- aws/sdk/aws-models/timestream-query.json | 767 ++-- aws/sdk/aws-models/timestream-write.json | 365 +- aws/sdk/aws-models/transcribe-streaming.json | 426 +- 15 files changed, 8451 insertions(+), 5538 deletions(-) diff --git a/aws/sdk/aws-models/dynamodb.json b/aws/sdk/aws-models/dynamodb.json index a1537f04c20..c4e51dc02fb 100644 --- a/aws/sdk/aws-models/dynamodb.json +++ b/aws/sdk/aws-models/dynamodb.json @@ -833,7 +833,67 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The BatchGetItem operation returns the attributes of one or more items\n from one or more tables. You identify requested items by primary key.

\n

A single operation can retrieve up to 16 MB of data, which can contain as many as 100\n items. BatchGetItem returns a partial result if the response size limit is\n exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is requested,\n or an internal processing failure occurs. If a partial result is returned, the operation returns a value for\n UnprocessedKeys. You can use this value to retry the operation starting\n with the next item to get.

\n \n

If you request more than 100 items, BatchGetItem returns a\n ValidationException with the message \"Too many items requested for\n the BatchGetItem call.\"

\n
\n

For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\n size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\n an appropriate UnprocessedKeys value so you can get the next page of\n results. If desired, your application can include its own logic to assemble the pages of\n results into one dataset.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchGetItem returns a\n ProvisionedThroughputExceededException. If at least\n one of the items is successfully processed, then\n BatchGetItem completes successfully, while returning the keys of the\n unread items in UnprocessedKeys.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

By default, BatchGetItem performs eventually consistent reads on every\n table in the request. If you want strongly consistent reads instead, you can set\n ConsistentRead to true for any or all tables.

\n

In order to minimize response latency, BatchGetItem may retrieve items in\n parallel.

\n

When designing your application, keep in mind that DynamoDB does not return items in\n any particular order. To help parse the response by item, include the primary key values\n for the items in your request in the ProjectionExpression parameter.

\n

If a requested item does not exist, it is not returned in the result. Requests for\n nonexistent items consume the minimum read capacity units according to the type of read.\n For more information, see Working with Tables in the Amazon DynamoDB Developer\n Guide.

" + "smithy.api#documentation": "

The BatchGetItem operation returns the attributes of one or more items\n from one or more tables. You identify requested items by primary key.

\n

A single operation can retrieve up to 16 MB of data, which can contain as many as 100\n items. BatchGetItem returns a partial result if the response size limit is\n exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is requested,\n or an internal processing failure occurs. If a partial result is returned, the operation returns a value for\n UnprocessedKeys. You can use this value to retry the operation starting\n with the next item to get.

\n \n

If you request more than 100 items, BatchGetItem returns a\n ValidationException with the message \"Too many items requested for\n the BatchGetItem call.\"

\n
\n

For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\n size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\n an appropriate UnprocessedKeys value so you can get the next page of\n results. If desired, your application can include its own logic to assemble the pages of\n results into one dataset.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchGetItem returns a\n ProvisionedThroughputExceededException. If at least\n one of the items is successfully processed, then\n BatchGetItem completes successfully, while returning the keys of the\n unread items in UnprocessedKeys.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

By default, BatchGetItem performs eventually consistent reads on every\n table in the request. If you want strongly consistent reads instead, you can set\n ConsistentRead to true for any or all tables.

\n

In order to minimize response latency, BatchGetItem may retrieve items in\n parallel.

\n

When designing your application, keep in mind that DynamoDB does not return items in\n any particular order. To help parse the response by item, include the primary key values\n for the items in your request in the ProjectionExpression parameter.

\n

If a requested item does not exist, it is not returned in the result. Requests for\n nonexistent items consume the minimum read capacity units according to the type of read.\n For more information, see Working with Tables in the Amazon DynamoDB Developer\n Guide.

", + "smithy.api#examples": [ + { + "title": "To retrieve multiple items from a table", + "documentation": "This example reads multiple items from the Music table using a batch of three GetItem requests. Only the AlbumTitle attribute is returned.", + "input": { + "RequestItems": { + "Music": { + "Keys": [ + { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Call Me Today" + } + }, + { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + }, + { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Scared of My Shadow" + } + } + ], + "ProjectionExpression": "AlbumTitle" + } + } + }, + "output": { + "Responses": { + "Music": [ + { + "AlbumTitle": { + "S": "Somewhat Famous" + } + }, + { + "AlbumTitle": { + "S": "Blue Sky Blues" + } + }, + { + "AlbumTitle": { + "S": "Louder Than Ever" + } + } + ] + } + } + } + ] } }, "com.amazonaws.dynamodb#BatchGetItemInput": { @@ -1094,7 +1154,65 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The BatchWriteItem operation puts or deletes multiple items in one or\n more tables. A single call to BatchWriteItem can transmit up to 16MB of\n data over the network, consisting of up to 25 item put or delete operations. While\n individual items can be up to 400 KB once stored, it's important to note that an item's\n representation might be greater than 400KB while being sent in DynamoDB's JSON format\n for the API call. For more details on this distinction, see Naming Rules and Data Types.

\n \n

\n BatchWriteItem cannot update items. If you perform a BatchWriteItem\n operation on an existing item, that item's values will be overwritten by the\n operation and it will appear like it was updated. To update items, we recommend you\n use the UpdateItem action.

\n
\n

The individual PutItem and DeleteItem operations specified\n in BatchWriteItem are atomic; however BatchWriteItem as a\n whole is not. If any requested operations fail because the table's provisioned\n throughput is exceeded or an internal processing failure occurs, the failed operations\n are returned in the UnprocessedItems response parameter. You can\n investigate and optionally resend the requests. Typically, you would call\n BatchWriteItem in a loop. Each iteration would check for unprocessed\n items and submit a new BatchWriteItem request with those unprocessed items\n until all items have been processed.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchWriteItem returns a\n ProvisionedThroughputExceededException.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

With BatchWriteItem, you can efficiently write or delete large amounts of\n data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\n order to improve performance with these large-scale operations,\n BatchWriteItem does not behave in the same way as individual\n PutItem and DeleteItem calls would. For example, you\n cannot specify conditions on individual put and delete requests, and\n BatchWriteItem does not return deleted items in the response.

\n

If you use a programming language that supports concurrency, you can use threads to\n write items in parallel. Your application must include the necessary logic to manage the\n threads. With languages that don't support threading, you must update or delete the\n specified items one at a time. In both situations, BatchWriteItem performs\n the specified put and delete operations in parallel, giving you the power of the thread\n pool approach without having to introduce complexity into your application.

\n

Parallel processing reduces latency, but each specified put and delete request\n consumes the same number of write capacity units whether it is processed in parallel or\n not. Delete operations on nonexistent items consume one write capacity unit.

\n

If one or more of the following is true, DynamoDB rejects the entire batch write\n operation:

\n
    \n
  • \n

    One or more tables specified in the BatchWriteItem request does\n not exist.

    \n
  • \n
  • \n

    Primary key attributes specified on an item in the request do not match those\n in the corresponding table's primary key schema.

    \n
  • \n
  • \n

    You try to perform multiple operations on the same item in the same\n BatchWriteItem request. For example, you cannot put and delete\n the same item in the same BatchWriteItem request.

    \n
  • \n
  • \n

    Your request contains at least two items with identical hash and range keys\n (which essentially is two put operations).

    \n
  • \n
  • \n

    There are more than 25 requests in the batch.

    \n
  • \n
  • \n

    Any individual item in a batch exceeds 400 KB.

    \n
  • \n
  • \n

    The total request size exceeds 16 MB.

    \n
  • \n
" + "smithy.api#documentation": "

The BatchWriteItem operation puts or deletes multiple items in one or\n more tables. A single call to BatchWriteItem can transmit up to 16MB of\n data over the network, consisting of up to 25 item put or delete operations. While\n individual items can be up to 400 KB once stored, it's important to note that an item's\n representation might be greater than 400KB while being sent in DynamoDB's JSON format\n for the API call. For more details on this distinction, see Naming Rules and Data Types.

\n \n

\n BatchWriteItem cannot update items. If you perform a BatchWriteItem\n operation on an existing item, that item's values will be overwritten by the\n operation and it will appear like it was updated. To update items, we recommend you\n use the UpdateItem action.

\n
\n

The individual PutItem and DeleteItem operations specified\n in BatchWriteItem are atomic; however BatchWriteItem as a\n whole is not. If any requested operations fail because the table's provisioned\n throughput is exceeded or an internal processing failure occurs, the failed operations\n are returned in the UnprocessedItems response parameter. You can\n investigate and optionally resend the requests. Typically, you would call\n BatchWriteItem in a loop. Each iteration would check for unprocessed\n items and submit a new BatchWriteItem request with those unprocessed items\n until all items have been processed.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchWriteItem returns a\n ProvisionedThroughputExceededException.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

With BatchWriteItem, you can efficiently write or delete large amounts of\n data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\n order to improve performance with these large-scale operations,\n BatchWriteItem does not behave in the same way as individual\n PutItem and DeleteItem calls would. For example, you\n cannot specify conditions on individual put and delete requests, and\n BatchWriteItem does not return deleted items in the response.

\n

If you use a programming language that supports concurrency, you can use threads to\n write items in parallel. Your application must include the necessary logic to manage the\n threads. With languages that don't support threading, you must update or delete the\n specified items one at a time. In both situations, BatchWriteItem performs\n the specified put and delete operations in parallel, giving you the power of the thread\n pool approach without having to introduce complexity into your application.

\n

Parallel processing reduces latency, but each specified put and delete request\n consumes the same number of write capacity units whether it is processed in parallel or\n not. Delete operations on nonexistent items consume one write capacity unit.

\n

If one or more of the following is true, DynamoDB rejects the entire batch write\n operation:

\n
    \n
  • \n

    One or more tables specified in the BatchWriteItem request does\n not exist.

    \n
  • \n
  • \n

    Primary key attributes specified on an item in the request do not match those\n in the corresponding table's primary key schema.

    \n
  • \n
  • \n

    You try to perform multiple operations on the same item in the same\n BatchWriteItem request. For example, you cannot put and delete\n the same item in the same BatchWriteItem request.

    \n
  • \n
  • \n

    Your request contains at least two items with identical hash and range keys\n (which essentially is two put operations).

    \n
  • \n
  • \n

    There are more than 25 requests in the batch.

    \n
  • \n
  • \n

    Any individual item in a batch exceeds 400 KB.

    \n
  • \n
  • \n

    The total request size exceeds 16 MB.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To add multiple items to a table", + "documentation": "This example adds three new items to the Music table using a batch of three PutItem requests.", + "input": { + "RequestItems": { + "Music": [ + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Somewhat Famous" + }, + "SongTitle": { + "S": "Call Me Today" + }, + "Artist": { + "S": "No One You Know" + } + } + } + }, + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Songs About Life" + }, + "SongTitle": { + "S": "Happy Day" + }, + "Artist": { + "S": "Acme Band" + } + } + } + }, + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Blue Sky Blues" + }, + "SongTitle": { + "S": "Scared of My Shadow" + }, + "Artist": { + "S": "No One You Know" + } + } + } + } + ] + } + }, + "output": {} + } + ] } }, "com.amazonaws.dynamodb#BatchWriteItemInput": { @@ -2289,7 +2407,30 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Deletes a single item in a table by primary key. You can perform a conditional delete\n operation that deletes the item if it exists, or if it has an expected attribute\n value.

\n

In addition to deleting an item, you can also return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

Unless you specify conditions, the DeleteItem is an idempotent operation;\n running it multiple times on the same item or attribute does not\n result in an error response.

\n

Conditional deletes are useful for deleting items only if specific conditions are met.\n If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\n deleted.

" + "smithy.api#documentation": "

Deletes a single item in a table by primary key. You can perform a conditional delete\n operation that deletes the item if it exists, or if it has an expected attribute\n value.

\n

In addition to deleting an item, you can also return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

Unless you specify conditions, the DeleteItem is an idempotent operation;\n running it multiple times on the same item or attribute does not\n result in an error response.

\n

Conditional deletes are useful for deleting items only if specific conditions are met.\n If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\n deleted.

", + "smithy.api#examples": [ + { + "title": "To delete an item", + "documentation": "This example deletes an item from the Music table.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Scared of My Shadow" + } + } + }, + "output": { + "ConsumedCapacity": { + "CapacityUnits": 1, + "TableName": "Music" + } + } + } + ] } }, "com.amazonaws.dynamodb#DeleteItemInput": { @@ -2467,7 +2608,29 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The DeleteTable operation deletes a table and all of its items. After a\n DeleteTable request, the specified table is in the\n DELETING state until DynamoDB completes the deletion. If the table is\n in the ACTIVE state, you can delete it. If a table is in\n CREATING or UPDATING states, then DynamoDB returns a\n ResourceInUseException. If the specified table does not exist, DynamoDB\n returns a ResourceNotFoundException. If table is already in the\n DELETING state, no error is returned.

\n \n

This operation only applies to Version 2019.11.21 (Current) \n of global tables.\n

\n
\n \n

DynamoDB might continue to accept data read and write operations, such as\n GetItem and PutItem, on a table in the\n DELETING state until the table deletion is complete.

\n
\n

When you delete a table, any indexes on that table are also deleted.

\n

If you have DynamoDB Streams enabled on the table, then the corresponding stream on\n that table goes into the DISABLED state, and the stream is automatically\n deleted after 24 hours.

\n

Use the DescribeTable action to check the status of the table.

" + "smithy.api#documentation": "

The DeleteTable operation deletes a table and all of its items. After a\n DeleteTable request, the specified table is in the\n DELETING state until DynamoDB completes the deletion. If the table is\n in the ACTIVE state, you can delete it. If a table is in\n CREATING or UPDATING states, then DynamoDB returns a\n ResourceInUseException. If the specified table does not exist, DynamoDB\n returns a ResourceNotFoundException. If table is already in the\n DELETING state, no error is returned.

\n \n

This operation only applies to Version 2019.11.21 (Current) \n of global tables.\n

\n
\n \n

DynamoDB might continue to accept data read and write operations, such as\n GetItem and PutItem, on a table in the\n DELETING state until the table deletion is complete.

\n
\n

When you delete a table, any indexes on that table are also deleted.

\n

If you have DynamoDB Streams enabled on the table, then the corresponding stream on\n that table goes into the DISABLED state, and the stream is automatically\n deleted after 24 hours.

\n

Use the DescribeTable action to check the status of the table.

", + "smithy.api#examples": [ + { + "title": "To delete a table", + "documentation": "This example deletes the Music table.", + "input": { + "TableName": "Music" + }, + "output": { + "TableDescription": { + "TableStatus": "DELETING", + "TableSizeBytes": 0, + "ItemCount": 0, + "TableName": "Music", + "ProvisionedThroughput": { + "NumberOfDecreasesToday": 1, + "WriteCapacityUnits": 5, + "ReadCapacityUnits": 5 + } + } + } + } + ] } }, "com.amazonaws.dynamodb#DeleteTableInput": { @@ -3029,7 +3192,19 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Returns the current provisioned-capacity quotas for your Amazon Web Services account in\n a Region, both for the Region as a whole and for any one DynamoDB table that you create\n there.

\n

When you establish an Amazon Web Services account, the account has initial quotas on\n the maximum read capacity units and write capacity units that you can provision across\n all of your DynamoDB tables in a given Region. Also, there are per-table\n quotas that apply when you create a table there. For more information, see Service,\n Account, and Table Quotas page in the Amazon DynamoDB\n Developer Guide.

\n

Although you can increase these quotas by filing a case at Amazon Web Services Support Center, obtaining the\n increase is not instantaneous. The DescribeLimits action lets you write\n code to compare the capacity you are currently using to those quotas imposed by your\n account so that you have enough time to apply for an increase before you hit a\n quota.

\n

For example, you could use one of the Amazon Web Services SDKs to do the\n following:

\n
    \n
  1. \n

    Call DescribeLimits for a particular Region to obtain your\n current account quotas on provisioned capacity there.

    \n
  2. \n
  3. \n

    Create a variable to hold the aggregate read capacity units provisioned for\n all your tables in that Region, and one to hold the aggregate write capacity\n units. Zero them both.

    \n
  4. \n
  5. \n

    Call ListTables to obtain a list of all your DynamoDB\n tables.

    \n
  6. \n
  7. \n

    For each table name listed by ListTables, do the\n following:

    \n
      \n
    • \n

      Call DescribeTable with the table name.

      \n
    • \n
    • \n

      Use the data returned by DescribeTable to add the read\n capacity units and write capacity units provisioned for the table itself\n to your variables.

      \n
    • \n
    • \n

      If the table has one or more global secondary indexes (GSIs), loop\n over these GSIs and add their provisioned capacity values to your\n variables as well.

      \n
    • \n
    \n
  8. \n
  9. \n

    Report the account quotas for that Region returned by\n DescribeLimits, along with the total current provisioned\n capacity levels you have calculated.

    \n
  10. \n
\n

This will let you see whether you are getting close to your account-level\n quotas.

\n

The per-table quotas apply only when you are creating a new table. They restrict the\n sum of the provisioned capacity of the new table itself and all its global secondary\n indexes.

\n

For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\n capacity extremely rapidly, but the only quota that applies is that the aggregate\n provisioned capacity over all your tables and GSIs cannot exceed either of the\n per-account quotas.

\n \n

\n DescribeLimits should only be called periodically. You can expect\n throttling errors if you call it more than once in a minute.

\n
\n

The DescribeLimits Request element has no content.

" + "smithy.api#documentation": "

Returns the current provisioned-capacity quotas for your Amazon Web Services account in\n a Region, both for the Region as a whole and for any one DynamoDB table that you create\n there.

\n

When you establish an Amazon Web Services account, the account has initial quotas on\n the maximum read capacity units and write capacity units that you can provision across\n all of your DynamoDB tables in a given Region. Also, there are per-table\n quotas that apply when you create a table there. For more information, see Service,\n Account, and Table Quotas page in the Amazon DynamoDB\n Developer Guide.

\n

Although you can increase these quotas by filing a case at Amazon Web Services Support Center, obtaining the\n increase is not instantaneous. The DescribeLimits action lets you write\n code to compare the capacity you are currently using to those quotas imposed by your\n account so that you have enough time to apply for an increase before you hit a\n quota.

\n

For example, you could use one of the Amazon Web Services SDKs to do the\n following:

\n
    \n
  1. \n

    Call DescribeLimits for a particular Region to obtain your\n current account quotas on provisioned capacity there.

    \n
  2. \n
  3. \n

    Create a variable to hold the aggregate read capacity units provisioned for\n all your tables in that Region, and one to hold the aggregate write capacity\n units. Zero them both.

    \n
  4. \n
  5. \n

    Call ListTables to obtain a list of all your DynamoDB\n tables.

    \n
  6. \n
  7. \n

    For each table name listed by ListTables, do the\n following:

    \n
      \n
    • \n

      Call DescribeTable with the table name.

      \n
    • \n
    • \n

      Use the data returned by DescribeTable to add the read\n capacity units and write capacity units provisioned for the table itself\n to your variables.

      \n
    • \n
    • \n

      If the table has one or more global secondary indexes (GSIs), loop\n over these GSIs and add their provisioned capacity values to your\n variables as well.

      \n
    • \n
    \n
  8. \n
  9. \n

    Report the account quotas for that Region returned by\n DescribeLimits, along with the total current provisioned\n capacity levels you have calculated.

    \n
  10. \n
\n

This will let you see whether you are getting close to your account-level\n quotas.

\n

The per-table quotas apply only when you are creating a new table. They restrict the\n sum of the provisioned capacity of the new table itself and all its global secondary\n indexes.

\n

For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\n capacity extremely rapidly, but the only quota that applies is that the aggregate\n provisioned capacity over all your tables and GSIs cannot exceed either of the\n per-account quotas.

\n \n

\n DescribeLimits should only be called periodically. You can expect\n throttling errors if you call it more than once in a minute.

\n
\n

The DescribeLimits Request element has no content.

", + "smithy.api#examples": [ + { + "title": "To determine capacity limits per table and account, in the current AWS region", + "documentation": "The following example returns the maximum read and write capacity units per table, and for the AWS account, in the current AWS region.", + "output": { + "TableMaxWriteCapacityUnits": 10000, + "TableMaxReadCapacityUnits": 10000, + "AccountMaxReadCapacityUnits": 20000, + "AccountMaxWriteCapacityUnits": 20000 + } + } + ] } }, "com.amazonaws.dynamodb#DescribeLimitsInput": { @@ -3595,52 +3770,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -3648,13 +3827,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -3664,175 +3852,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] }, - { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } - ] - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://dynamodb.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" + "ref": "PartitionResult" }, - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -3841,99 +3937,142 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsDualStack" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://dynamodb.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" + "endpoint": { + "url": "https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "type": "tree", - "rules": [ + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "PartitionResult" }, - "local" + "supportsDualStack" ] } - ], - "endpoint": { - "url": "http://localhost:8000", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "dynamodb", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [], "endpoint": { - "url": "https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "local" + ] + } + ], + "endpoint": { + "url": "http://localhost:8000", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "dynamodb", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -5439,7 +5578,37 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The GetItem operation returns a set of attributes for the item with the\n given primary key. If there is no matching item, GetItem does not return\n any data and there will be no Item element in the response.

\n

\n GetItem provides an eventually consistent read by default. If your\n application requires a strongly consistent read, set ConsistentRead to\n true. Although a strongly consistent read might take more time than an\n eventually consistent read, it always returns the last updated value.

" + "smithy.api#documentation": "

The GetItem operation returns a set of attributes for the item with the\n given primary key. If there is no matching item, GetItem does not return\n any data and there will be no Item element in the response.

\n

\n GetItem provides an eventually consistent read by default. If your\n application requires a strongly consistent read, set ConsistentRead to\n true. Although a strongly consistent read might take more time than an\n eventually consistent read, it always returns the last updated value.

", + "smithy.api#examples": [ + { + "title": "To read an item from a table", + "documentation": "This example retrieves an item from the Music table. The table has a partition key and a sort key (Artist and SongTitle), so you must specify both of these attributes.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + } + }, + "output": { + "Item": { + "AlbumTitle": { + "S": "Songs About Life" + }, + "SongTitle": { + "S": "Happy Day" + }, + "Artist": { + "S": "Acme Band" + } + } + } + } + ] } }, "com.amazonaws.dynamodb#GetItemInput": { @@ -7187,6 +7356,20 @@ "required": false }, "smithy.api#documentation": "

Returns an array of table names associated with the current account and endpoint. The\n output from ListTables is paginated, with each page returning a maximum of\n 100 table names.

", + "smithy.api#examples": [ + { + "title": "To list tables", + "documentation": "This example lists all of the tables associated with the current AWS account and endpoint.", + "output": { + "TableNames": [ + "Forum", + "ProductCatalog", + "Reply", + "Thread" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartTableName", "outputToken": "LastEvaluatedTableName", @@ -7892,7 +8075,34 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Creates a new item, or replaces an old item with a new item. If an item that has the\n same primary key as the new item already exists in the specified table, the new item\n completely replaces the existing item. You can perform a conditional put operation (add\n a new item if one with the specified primary key doesn't exist), or replace an existing\n item if it has certain attribute values. You can return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

When you add an item, the primary key attributes are the only required attributes.\n

\n

Empty String and Binary attribute values are allowed. Attribute values of type String\n and Binary must have a length greater than zero if the attribute is used as a key\n attribute for a table or index. Set type attributes cannot be empty.

\n

Invalid Requests with empty values will be rejected with a\n ValidationException exception.

\n \n

To prevent a new item from replacing an existing item, use a conditional\n expression that contains the attribute_not_exists function with the\n name of the attribute being used as the partition key for the table. Since every\n record must contain that attribute, the attribute_not_exists function\n will only succeed if no matching item exists.

\n
\n

For more information about PutItem, see Working with\n Items in the Amazon DynamoDB Developer Guide.

" + "smithy.api#documentation": "

Creates a new item, or replaces an old item with a new item. If an item that has the\n same primary key as the new item already exists in the specified table, the new item\n completely replaces the existing item. You can perform a conditional put operation (add\n a new item if one with the specified primary key doesn't exist), or replace an existing\n item if it has certain attribute values. You can return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

When you add an item, the primary key attributes are the only required attributes.\n

\n

Empty String and Binary attribute values are allowed. Attribute values of type String\n and Binary must have a length greater than zero if the attribute is used as a key\n attribute for a table or index. Set type attributes cannot be empty.

\n

Invalid Requests with empty values will be rejected with a\n ValidationException exception.

\n \n

To prevent a new item from replacing an existing item, use a conditional\n expression that contains the attribute_not_exists function with the\n name of the attribute being used as the partition key for the table. Since every\n record must contain that attribute, the attribute_not_exists function\n will only succeed if no matching item exists.

\n
\n

For more information about PutItem, see Working with\n Items in the Amazon DynamoDB Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To add an item to a table", + "documentation": "This example adds a new item to the Music table.", + "input": { + "TableName": "Music", + "Item": { + "AlbumTitle": { + "S": "Somewhat Famous" + }, + "SongTitle": { + "S": "Call Me Today" + }, + "Artist": { + "S": "No One You Know" + } + }, + "ReturnConsumedCapacity": "TOTAL" + }, + "output": { + "ConsumedCapacity": { + "CapacityUnits": 1, + "TableName": "Music" + } + } + } + ] } }, "com.amazonaws.dynamodb#PutItemInput": { @@ -8050,6 +8260,34 @@ "required": false }, "smithy.api#documentation": "

You must provide the name of the partition key attribute and a single value for that\n attribute. Query returns all items with that partition key value.\n Optionally, you can provide a sort key attribute and use a comparison operator to refine\n the search results.

\n

Use the KeyConditionExpression parameter to provide a specific value for\n the partition key. The Query operation will return all of the items from\n the table or index with that partition key value. You can optionally narrow the scope of\n the Query operation by specifying a sort key value and a comparison\n operator in KeyConditionExpression. To further refine the\n Query results, you can optionally provide a\n FilterExpression. A FilterExpression determines which\n items within the results should be returned to you. All of the other results are\n discarded.

\n

A Query operation always returns a result set. If no matching items are\n found, the result set will be empty. Queries that do not return results consume the\n minimum number of read capacity units for that type of read operation.

\n \n

DynamoDB calculates the number of read capacity units consumed based on item\n size, not on the amount of data that is returned to an application. The number of\n capacity units consumed will be the same whether you request all of the attributes\n (the default behavior) or just some of them (using a projection expression). The\n number will also be the same whether or not you use a FilterExpression.\n

\n
\n

\n Query results are always sorted by the sort key value. If the data type of\n the sort key is Number, the results are returned in numeric order; otherwise, the\n results are returned in order of UTF-8 bytes. By default, the sort order is ascending.\n To reverse the order, set the ScanIndexForward parameter to false.

\n

A single Query operation will read up to the maximum number of items set\n (if using the Limit parameter) or a maximum of 1 MB of data and then apply\n any filtering to the results using FilterExpression. If\n LastEvaluatedKey is present in the response, you will need to paginate\n the result set. For more information, see Paginating\n the Results in the Amazon DynamoDB Developer Guide.

\n

\n FilterExpression is applied after a Query finishes, but before\n the results are returned. A FilterExpression cannot contain partition key\n or sort key attributes. You need to specify those attributes in the\n KeyConditionExpression.

\n \n

A Query operation can return an empty result set and a\n LastEvaluatedKey if all the items read for the page of results are\n filtered out.

\n
\n

You can query a table, a local secondary index, or a global secondary index. For a\n query on a table or on a local secondary index, you can set the\n ConsistentRead parameter to true and obtain a strongly\n consistent result. Global secondary indexes support eventually consistent reads only, so\n do not specify ConsistentRead when querying a global secondary\n index.

", + "smithy.api#examples": [ + { + "title": "To query an item", + "documentation": "This example queries items in the Music table. The table has a partition key and sort key (Artist and SongTitle), but this query only specifies the partition key value. It returns song titles by the artist named \"No One You Know\".", + "input": { + "TableName": "Music", + "ProjectionExpression": "SongTitle", + "KeyConditionExpression": "Artist = :v1", + "ExpressionAttributeValues": { + ":v1": { + "S": "No One You Know" + } + } + }, + "output": { + "Count": 2, + "Items": [ + { + "SongTitle": { + "S": "Call Me Today" + } + } + ], + "ScannedCount": 2, + "ConsumedCapacity": {} + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -9487,6 +9725,49 @@ "required": false }, "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total size of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan completes and results are returned to the user. The LastEvaluatedKey \n value is also returned and the requestor can use the LastEvaluatedKey to continue \n the scan in a subsequent operation. Each scan response also includes number of items that were \n scanned (ScannedCount) as part of the request. If using a FilterExpression, a scan result \n can result in no items meeting the criteria and the Count will result in zero. If \n you did not use a FilterExpression in the scan request, then Count is \n the same as ScannedCount.

\n \n

\n Count and ScannedCount only return the count of items specific to a \n single scan request and, unless the table is less than 1MB, do not represent the total number \n of items in the table.\n

\n
\n

A single Scan operation first reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then applies any\n filtering to the results if a FilterExpression is provided. If\n LastEvaluatedKey is present in the response, pagination is required to complete the\n full table scan. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

By default, a Scan uses eventually consistent reads when accessing the items in a table. \n Therefore, the results from an eventually consistent Scan may not include the latest item \n changes at the time the scan iterates through each item in the table. If you require a strongly consistent \n read of each item as the scan iterates through the items in the table, you can set the ConsistentRead \n parameter to true. Strong consistency only relates to the consistency of the read at the item level.

\n \n

\n DynamoDB does not provide snapshot isolation for a scan operation when the ConsistentRead \n parameter is set to true. Thus, a DynamoDB scan operation does not guarantee that all reads in a scan \n see a consistent snapshot of the table when the scan operation was requested.\n

\n
", + "smithy.api#examples": [ + { + "title": "To scan a table", + "documentation": "This example scans the entire Music table, and then narrows the results to songs by the artist \"No One You Know\". For each item, only the album title and song title are returned.", + "input": { + "TableName": "Music", + "FilterExpression": "Artist = :a", + "ProjectionExpression": "#ST, #AT", + "ExpressionAttributeNames": { + "#ST": "SongTitle", + "#AT": "AlbumTitle" + }, + "ExpressionAttributeValues": { + ":a": { + "S": "No One You Know" + } + } + }, + "output": { + "Count": 2, + "Items": [ + { + "SongTitle": { + "S": "Call Me Today" + }, + "AlbumTitle": { + "S": "Somewhat Famous" + } + }, + { + "SongTitle": { + "S": "Scared of My Shadow" + }, + "AlbumTitle": { + "S": "Blue Sky Blues" + } + } + ], + "ScannedCount": 3, + "ConsumedCapacity": {} + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -11203,7 +11484,54 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Edits an existing item's attributes, or adds a new item to the table if it does not\n already exist. You can put, delete, or add attribute values. You can also perform a\n conditional update on an existing item (insert a new attribute name-value pair if it\n doesn't exist, or replace an existing name-value pair if it has certain expected\n attribute values).

\n

You can also return the item's attribute values in the same UpdateItem\n operation using the ReturnValues parameter.

" + "smithy.api#documentation": "

Edits an existing item's attributes, or adds a new item to the table if it does not\n already exist. You can put, delete, or add attribute values. You can also perform a\n conditional update on an existing item (insert a new attribute name-value pair if it\n doesn't exist, or replace an existing name-value pair if it has certain expected\n attribute values).

\n

You can also return the item's attribute values in the same UpdateItem\n operation using the ReturnValues parameter.

", + "smithy.api#examples": [ + { + "title": "To update an item in a table", + "documentation": "This example updates an item in the Music table. It adds a new attribute (Year) and modifies the AlbumTitle attribute. All of the attributes in the item, as they appear after the update, are returned in the response.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + }, + "UpdateExpression": "SET #Y = :y, #AT = :t", + "ExpressionAttributeNames": { + "#Y": "Year", + "#AT": "AlbumTitle" + }, + "ExpressionAttributeValues": { + ":y": { + "N": "2015" + }, + ":t": { + "S": "Louder Than Ever" + } + }, + "ReturnValues": "ALL_NEW" + }, + "output": { + "Attributes": { + "AlbumTitle": { + "S": "Louder Than Ever" + }, + "Artist": { + "S": "Acme Band" + }, + "Year": { + "N": "2015" + }, + "SongTitle": { + "S": "Happy Day" + } + } + } + } + ] } }, "com.amazonaws.dynamodb#UpdateItemInput": { diff --git a/aws/sdk/aws-models/ec2.json b/aws/sdk/aws-models/ec2.json index 43911fdd00d..16cf8a51163 100644 --- a/aws/sdk/aws-models/ec2.json +++ b/aws/sdk/aws-models/ec2.json @@ -20504,14 +20504,14 @@ "SubnetIds": { "target": "com.amazonaws.ec2#VpcEndpointSubnetIdList", "traits": { - "smithy.api#documentation": "

(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create an endpoint\n network interface. For a Gateway Load Balancer endpoint, you can specify only one subnet.

", + "smithy.api#documentation": "

(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create endpoint\n network interfaces. For a Gateway Load Balancer endpoint, you can specify only one subnet.

", "smithy.api#xmlName": "SubnetId" } }, "SecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the\n endpoint network interface. If this parameter is not specified, we use the default \n security group for the VPC.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the\n endpoint network interfaces. If this parameter is not specified, we use the default \n security group for the VPC.

", "smithy.api#xmlName": "SecurityGroupId" } }, @@ -20547,6 +20547,13 @@ "smithy.api#documentation": "

The tags to associate with the endpoint.

", "smithy.api#xmlName": "TagSpecification" } + }, + "SubnetConfigurations": { + "target": "com.amazonaws.ec2#SubnetConfigurationsList", + "traits": { + "smithy.api#documentation": "

The subnet configurations for the endpoint.

", + "smithy.api#xmlName": "SubnetConfiguration" + } } }, "traits": { @@ -22556,7 +22563,7 @@ "target": "com.amazonaws.ec2#DeleteKeyPairRequest" }, "output": { - "target": "smithy.api#Unit" + "target": "com.amazonaws.ec2#DeleteKeyPairResult" }, "traits": { "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

", @@ -22601,6 +22608,32 @@ "smithy.api#input": {} } }, + "com.amazonaws.ec2#DeleteKeyPairResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", + "smithy.api#xmlName": "return" + } + }, + "KeyPairId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "KeyPairId", + "smithy.api#documentation": "

The ID of the key pair.

", + "smithy.api#xmlName": "keyPairId" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#DeleteLaunchTemplate": { "type": "operation", "input": { @@ -51693,7 +51726,7 @@ } }, "PasswordData": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#PasswordData", "traits": { "aws.protocols#ec2QueryName": "PasswordData", "smithy.api#documentation": "

The password of the instance. Returns an empty string if the password is not\n available.

", @@ -63551,6 +63584,102 @@ "traits": { "smithy.api#enumValue": "m7i-flex.8xlarge" } + }, + "m7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.medium" + } + }, + "m7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.large" + } + }, + "m7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.xlarge" + } + }, + "m7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.2xlarge" + } + }, + "m7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.4xlarge" + } + }, + "m7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.8xlarge" + } + }, + "m7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.12xlarge" + } + }, + "m7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.16xlarge" + } + }, + "m7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.24xlarge" + } + }, + "m7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.32xlarge" + } + }, + "m7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.48xlarge" + } + }, + "m7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.metal-48xl" + } + }, + "hpc7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.12xlarge" + } + }, + "hpc7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.24xlarge" + } + }, + "hpc7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.48xlarge" + } + }, + "hpc7a_96xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.96xlarge" + } } } }, @@ -75267,14 +75396,14 @@ "AddSecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the network interface.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the endpoint network interfaces.

", "smithy.api#xmlName": "AddSecurityGroupId" } }, "RemoveSecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to disassociate from the network interface.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to disassociate from the endpoint network interfaces.

", "smithy.api#xmlName": "RemoveSecurityGroupId" } }, @@ -75295,7 +75424,14 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the\n VPC.

" + "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the VPC.

" + } + }, + "SubnetConfigurations": { + "target": "com.amazonaws.ec2#SubnetConfigurationsList", + "traits": { + "smithy.api#documentation": "

The subnet configurations for the endpoint.

", + "smithy.api#xmlName": "SubnetConfiguration" } } }, @@ -79166,6 +79302,12 @@ } } }, + "com.amazonaws.ec2#PasswordData": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#PathComponent": { "type": "structure", "members": { @@ -88936,7 +89078,7 @@ } }, "UploadPolicySignature": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#S3StorageUploadPolicySignature", "traits": { "aws.protocols#ec2QueryName": "UploadPolicySignature", "smithy.api#documentation": "

The signature of the JSON document.

", @@ -88948,6 +89090,12 @@ "smithy.api#documentation": "

Describes the storage parameters for Amazon S3 and Amazon S3 buckets for an instance store-backed AMI.

" } }, + "com.amazonaws.ec2#S3StorageUploadPolicySignature": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#SSEType": { "type": "enum", "members": { @@ -94270,6 +94418,41 @@ } } }, + "com.amazonaws.ec2#SubnetConfiguration": { + "type": "structure", + "members": { + "SubnetId": { + "target": "com.amazonaws.ec2#SubnetId", + "traits": { + "smithy.api#documentation": "

The ID of the subnet.

" + } + }, + "Ipv4": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The IPv4 address to assign to the endpoint network interface in the subnet. You must provide \n an IPv4 address if the VPC endpoint supports IPv4.

\n

If you specify an IPv4 address when modifying a VPC endpoint, we replace the existing \n endpoint network interface with a new endpoint network interface with this IP address. \n This process temporarily disconnects the subnet and the VPC endpoint.

" + } + }, + "Ipv6": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The IPv6 address to assign to the endpoint network interface in the subnet. You must provide \n an IPv6 address if the VPC endpoint supports IPv6.

\n

If you specify an IPv6 address when modifying a VPC endpoint, we replace the existing \n endpoint network interface with a new endpoint network interface with this IP address. \n This process temporarily disconnects the subnet and the VPC endpoint.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the configuration of a subnet for a VPC endpoint.

" + } + }, + "com.amazonaws.ec2#SubnetConfigurationsList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#SubnetConfiguration", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#SubnetId": { "type": "string" }, diff --git a/aws/sdk/aws-models/iam.json b/aws/sdk/aws-models/iam.json index d1b5c5e6220..8ad03eb5281 100644 --- a/aws/sdk/aws-models/iam.json +++ b/aws/sdk/aws-models/iam.json @@ -588,52 +588,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -641,597 +645,557 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam-fips.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam-fips.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-cn" + "name" ] }, + "aws-cn" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.cn-north-1.amazonaws.com.cn", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "cn-north-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.cn-north-1.amazonaws.com.cn", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "cn-north-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-gov-west-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", "argv": [ { - "ref": "UseFIPS" + "ref": "PartitionResult" }, - true + "name" ] }, + "aws-iso" + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-iso-east-1.c2s.ic.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-iso-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "PartitionResult" }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-gov-west-1" - } + "name" ] }, - "headers": {} - }, - "type": "endpoint" + "aws-iso-b" + ] }, { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - }, - "aws-iso" - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-isob-east-1.sc2s.sgov.gov", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-isob-east-1" } - ], - "endpoint": { - "url": "https://iam.us-iso-east-1.c2s.ic.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-iso-east-1" - } - ] + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "headers": {} - }, - "type": "endpoint" + true + ] }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ + true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "name" + "supportsFIPS" ] - }, - "aws-iso-b" - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-isob-east-1.sc2s.sgov.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-isob-east-1" } ] }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://iam-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://iam-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://iam-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://iam-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://iam.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://iam.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://iam.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://iam.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1978,7 +1942,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds a new client ID (also known as audience) to the list of client IDs already\n registered for the specified IAM OpenID Connect (OIDC) provider resource.

\n

This operation is idempotent; it does not fail or return an error if you add an\n existing client ID to the provider.

" + "smithy.api#documentation": "

Adds a new client ID (also known as audience) to the list of client IDs already\n registered for the specified IAM OpenID Connect (OIDC) provider resource.

\n

This operation is idempotent; it does not fail or return an error if you add an\n existing client ID to the provider.

", + "smithy.api#examples": [ + { + "title": "To add a client ID (audience) to an Open-ID Connect (OIDC) provider", + "documentation": "The following add-client-id-to-open-id-connect-provider command adds the client ID my-application-ID to the OIDC provider named server.example.com:", + "input": { + "ClientID": "my-application-ID", + "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com" + } + } + ] } }, "com.amazonaws.iam#AddClientIDToOpenIDConnectProviderRequest": { @@ -2029,7 +2003,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

" + "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a role to an instance profile", + "documentation": "The following command adds the role named S3Access to the instance profile named Webserver:", + "input": { + "RoleName": "S3Access", + "InstanceProfileName": "Webserver" + } + } + ] } }, "com.amazonaws.iam#AddRoleToInstanceProfileRequest": { @@ -2074,7 +2058,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified user to the specified group.

" + "smithy.api#documentation": "

Adds the specified user to the specified group.

", + "smithy.api#examples": [ + { + "title": "To add a user to an IAM group", + "documentation": "The following command adds an IAM user named Bob to the IAM group named Admins:", + "input": { + "UserName": "Bob", + "GroupName": "Admins" + } + } + ] } }, "com.amazonaws.iam#AddUserToGroupRequest": { @@ -2131,7 +2125,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use \n PutGroupPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use \n PutGroupPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM group", + "documentation": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM group named Finance.", + "input": { + "GroupName": "Finance", + "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess" + } + } + ] } }, "com.amazonaws.iam#AttachGroupPolicyRequest": { @@ -2185,7 +2189,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using \n CreateRole\n . You can update a role's trust policy using\n \n UpdateAssumerolePolicy\n .

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use \n PutRolePolicy\n . For more information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using \n CreateRole\n . You can update a role's trust policy using\n \n UpdateAssumerolePolicy\n .

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use \n PutRolePolicy\n . For more information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM role", + "documentation": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM role named ReadOnlyRole.", + "input": { + "RoleName": "ReadOnlyRole", + "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess" + } + } + ] } }, "com.amazonaws.iam#AttachRolePolicyRequest": { @@ -2236,7 +2250,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use \n PutUserPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use \n PutUserPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM user", + "documentation": "The following command attaches the AWS managed policy named AdministratorAccess to the IAM user named Alice.", + "input": { + "UserName": "Alice", + "PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess" + } + } + ] } }, "com.amazonaws.iam#AttachUserPolicyRequest": { @@ -2362,7 +2386,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the password of the IAM user who is calling this operation. This operation\n can be performed using the CLI, the Amazon Web Services API, or the My\n Security Credentials page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\n not affected by this operation.

\n

Use UpdateLoginProfile to use the CLI, the Amazon Web Services API, or the\n Users page in the IAM console to change the\n password for any IAM user. For more information about modifying passwords, see Managing\n passwords in the IAM User Guide.

" + "smithy.api#documentation": "

Changes the password of the IAM user who is calling this operation. This operation\n can be performed using the CLI, the Amazon Web Services API, or the My\n Security Credentials page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\n not affected by this operation.

\n

Use UpdateLoginProfile to use the CLI, the Amazon Web Services API, or the\n Users page in the IAM console to change the\n password for any IAM user. For more information about modifying passwords, see Managing\n passwords in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To change the password for your IAM user", + "documentation": "The following command changes the password for the current IAM user.", + "input": { + "NewPassword": "]35d/{pB9Fo9wJ", + "OldPassword": "3s0K_;xh4~8XXI" + } + } + ] } }, "com.amazonaws.iam#ChangePasswordRequest": { @@ -2566,7 +2600,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\n specified user. The default status for new keys is Active.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials. This is true even if the Amazon Web Services account has no associated users.

\n

For information about quotas on the number of keys you can create, see IAM and STS\n quotas in the IAM User Guide.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation. You must save the key (for example, in a text\n file) if you want to be able to access it again. If a secret key is lost, you can\n delete the access keys for the associated user and then create new keys.

\n
" + "smithy.api#documentation": "

Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\n specified user. The default status for new keys is Active.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials. This is true even if the Amazon Web Services account has no associated users.

\n

For information about quotas on the number of keys you can create, see IAM and STS\n quotas in the IAM User Guide.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation. You must save the key (for example, in a text\n file) if you want to be able to access it again. If a secret key is lost, you can\n delete the access keys for the associated user and then create new keys.

\n
", + "smithy.api#examples": [ + { + "title": "To create an access key for an IAM user", + "documentation": "The following command creates an access key (access key ID and secret access key) for the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "AccessKey": { + "UserName": "Bob", + "Status": "Active", + "CreateDate": "2015-03-09T18:39:23.411Z", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + } + ] } }, "com.amazonaws.iam#CreateAccessKeyRequest": { @@ -2622,7 +2674,16 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\n alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

" + "smithy.api#documentation": "

Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\n alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To create an account alias", + "documentation": "The following command associates the alias examplecorp to your AWS account.", + "input": { + "AccountAlias": "examplecorp" + } + } + ] } }, "com.amazonaws.iam#CreateAccountAliasRequest": { @@ -2663,7 +2724,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new group.

\n

For information about the number of groups you can create, see IAM and STS\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new group.

\n

For information about the number of groups you can create, see IAM and STS\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM group", + "documentation": "The following command creates an IAM group named Admins.", + "input": { + "GroupName": "Admins" + }, + "output": { + "Group": { + "Path": "/", + "CreateDate": "2015-03-09T20:30:24.940Z", + "GroupId": "AIDGPMS9RO4H3FEXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/Admins", + "GroupName": "Admins" + } + } + } + ] } }, "com.amazonaws.iam#CreateGroupRequest": { @@ -2729,7 +2808,26 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new instance profile. For information about instance profiles, see Using\n roles for applications on Amazon EC2 in the\n IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.

\n

For information about the number of instance profiles you can create, see IAM object\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new instance profile. For information about instance profiles, see Using\n roles for applications on Amazon EC2 in the\n IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.

\n

For information about the number of instance profiles you can create, see IAM object\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following command creates an instance profile named Webserver that is ready to have a role attached and then be associated with an EC2 instance.", + "input": { + "InstanceProfileName": "Webserver" + }, + "output": { + "InstanceProfile": { + "InstanceProfileId": "AIPAJMBYC7DLSPEXAMPLE", + "Roles": [], + "CreateDate": "2015-03-09T20:33:19.626Z", + "InstanceProfileName": "Webserver", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:instance-profile/Webserver" + } + } + } + ] } }, "com.amazonaws.iam#CreateInstanceProfileRequest": { @@ -2801,7 +2899,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a password for the specified IAM user. A password allows an IAM user to\n access Amazon Web Services services through the Amazon Web Services Management Console.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to create a password for any IAM user. Use ChangePassword to update your own existing password in the My Security Credentials page in the Amazon Web Services Management Console.

\n

For more information about managing passwords, see Managing passwords in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a password for the specified IAM user. A password allows an IAM user to\n access Amazon Web Services services through the Amazon Web Services Management Console.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to create a password for any IAM user. Use ChangePassword to update your own existing password in the My Security Credentials page in the Amazon Web Services Management Console.

\n

For more information about managing passwords, see Managing passwords in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following command changes IAM user Bob's password and sets the flag that required Bob to change the password the next time he signs in.", + "input": { + "UserName": "Bob", + "Password": "h]6EszR}vJ*m", + "PasswordResetRequired": true + }, + "output": { + "LoginProfile": { + "UserName": "Bob", + "CreateDate": "2015-03-10T20:55:40.274Z", + "PasswordResetRequired": true + } + } + } + ] } }, "com.amazonaws.iam#CreateLoginProfileRequest": { @@ -2875,7 +2991,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
" + "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following example defines a new OIDC provider in IAM with a client ID of my-application-id and pointing at the server with a URL of https://server.example.com.", + "input": { + "ClientIDList": [ + "my-application-id" + ], + "ThumbprintList": [ + "3768084dfb3d2b68b7897bf5f565da8efEXAMPLE" + ], + "Url": "https://server.example.com" + }, + "output": { + "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com" + } + } + ] } }, "com.amazonaws.iam#CreateOpenIDConnectProviderRequest": { @@ -3122,7 +3256,28 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account.

\n

For more information about roles, see IAM roles in the\n IAM User Guide. For information about quotas for role names\n and the number of roles you can create, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account.

\n

For more information about roles, see IAM roles in the\n IAM User Guide. For information about quotas for role names\n and the number of roles you can create, see IAM and STS quotas in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM role", + "documentation": "The following command creates a role named Test-Role and attaches a trust policy that you must convert from JSON to a string. Upon success, the response includes the same policy as a URL-encoded JSON string.", + "input": { + "AssumeRolePolicyDocument": "", + "Path": "/", + "RoleName": "Test-Role" + }, + "output": { + "Role": { + "Arn": "arn:aws:iam::123456789012:role/Test-Role", + "AssumeRolePolicyDocument": "", + "CreateDate": "2013-06-07T20:43:32.821Z", + "Path": "/", + "RoleId": "AKIAIOSFODNN7EXAMPLE", + "RoleName": "Test-Role" + } + } + } + ] } }, "com.amazonaws.iam#CreateRoleRequest": { @@ -3426,7 +3581,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new IAM user for your Amazon Web Services account.

\n

For information about quotas for the number of IAM users you can create, see IAM and STS\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new IAM user for your Amazon Web Services account.

\n

For information about quotas for the number of IAM users you can create, see IAM and STS\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM user", + "documentation": "The following create-user command creates an IAM user named Bob in the current account.", + "input": { + "UserName": "Bob" + }, + "output": { + "User": { + "UserName": "Bob", + "Path": "/", + "CreateDate": "2013-06-08T03:20:41.270Z", + "UserId": "AKIAIOSFODNN7EXAMPLE", + "Arn": "arn:aws:iam::123456789012:user/Bob" + } + } + } + ] } }, "com.amazonaws.iam#CreateUserRequest": { @@ -3671,7 +3844,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the access key pair associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated users.

" + "smithy.api#documentation": "

Deletes the access key pair associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated users.

", + "smithy.api#examples": [ + { + "title": "To delete an access key for an IAM user", + "documentation": "The following command deletes one access key (access key ID and secret access key) assigned to the IAM user named Bob.", + "input": { + "UserName": "Bob", + "AccessKeyId": "AKIDPMS9RO4H3FEXAMPLE" + } + } + ] } }, "com.amazonaws.iam#DeleteAccessKeyRequest": { @@ -3718,7 +3901,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\n account alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

" + "smithy.api#documentation": "

Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\n account alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an account alias", + "documentation": "The following command removes the alias mycompany from the current AWS account:", + "input": { + "AccountAlias": "mycompany" + } + } + ] } }, "com.amazonaws.iam#DeleteAccountAliasRequest": { @@ -3756,7 +3948,13 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the password policy for the Amazon Web Services account. There are no parameters.

" + "smithy.api#documentation": "

Deletes the password policy for the Amazon Web Services account. There are no parameters.

", + "smithy.api#examples": [ + { + "title": "To delete the current account password policy", + "documentation": "The following command removes the password policy from the current AWS account:" + } + ] } }, "com.amazonaws.iam#DeleteConflictException": { @@ -3822,7 +4020,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n group.

\n

A group can also have managed policies attached to it. To detach a managed policy from\n a group, use DetachGroupPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n group.

\n

A group can also have managed policies attached to it. To detach a managed policy from\n a group, use DetachGroupPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a policy from an IAM group", + "documentation": "The following command deletes the policy named ExamplePolicy from the group named Admins:", + "input": { + "GroupName": "Admins", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteGroupPolicyRequest": { @@ -3885,7 +4093,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see Using\n instance profiles in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an instance profile", + "documentation": "The following command deletes the instance profile named ExampleInstanceProfile", + "input": { + "InstanceProfileName": "ExampleInstanceProfile" + } + } + ] } }, "com.amazonaws.iam#DeleteInstanceProfileRequest": { @@ -3926,7 +4143,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the password for the specified IAM user, For more information, see Managing\n passwords for IAM users.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to delete a password for any IAM user. You can use ChangePassword to update, but not delete, your own password in the\n My Security Credentials page in the\n Amazon Web Services Management Console.

\n \n

Deleting a user's password does not prevent a user from accessing Amazon Web Services through\n the command line interface or the API. To prevent all user access, you must also\n either make any access keys inactive or delete them. For more information about\n making keys inactive or deleting them, see UpdateAccessKey and\n DeleteAccessKey.

\n
" + "smithy.api#documentation": "

Deletes the password for the specified IAM user, For more information, see Managing\n passwords for IAM users.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to delete a password for any IAM user. You can use ChangePassword to update, but not delete, your own password in the\n My Security Credentials page in the\n Amazon Web Services Management Console.

\n \n

Deleting a user's password does not prevent a user from accessing Amazon Web Services through\n the command line interface or the API. To prevent all user access, you must also\n either make any access keys inactive or delete them. For more information about\n making keys inactive or deleting them, see UpdateAccessKey and\n DeleteAccessKey.

\n
", + "smithy.api#examples": [ + { + "title": "To delete a password for an IAM user", + "documentation": "The following command deletes the password for the IAM user named Bob.", + "input": { + "UserName": "Bob" + } + } + ] } }, "com.amazonaws.iam#DeleteLoginProfileRequest": { @@ -4106,7 +4332,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\n programmatically, you must delete the items attached to the role manually, or the\n deletion fails. For more information, see Deleting an IAM role. Before attempting to delete a role, remove the\n following attached items:

\n \n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to delete. Deleting a role or instance profile that is associated with a\n running instance will break any applications running on the instance.

\n
" + "smithy.api#documentation": "

Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\n programmatically, you must delete the items attached to the role manually, or the\n deletion fails. For more information, see Deleting an IAM role. Before attempting to delete a role, remove the\n following attached items:

\n \n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to delete. Deleting a role or instance profile that is associated with a\n running instance will break any applications running on the instance.

\n
", + "smithy.api#examples": [ + { + "title": "To delete an IAM role", + "documentation": "The following command removes the role named Test-Role.", + "input": { + "RoleName": "Test-Role" + } + } + ] } }, "com.amazonaws.iam#DeleteRolePermissionsBoundary": { @@ -4170,7 +4405,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n role.

\n

A role can also have managed policies attached to it. To detach a managed policy from\n a role, use DetachRolePolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n role.

\n

A role can also have managed policies attached to it. To detach a managed policy from\n a role, use DetachRolePolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a policy from an IAM role", + "documentation": "The following command removes the policy named ExamplePolicy from the role named Test-Role.", + "input": { + "RoleName": "Test-Role", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteRolePolicyRequest": { @@ -4445,7 +4690,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a signing certificate associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated IAM users.

" + "smithy.api#documentation": "

Deletes a signing certificate associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated IAM users.

", + "smithy.api#examples": [ + { + "title": "To delete a signing certificate for an IAM user", + "documentation": "The following command deletes the specified signing certificate for the IAM user named Anika.", + "input": { + "UserName": "Anika", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE" + } + } + ] } }, "com.amazonaws.iam#DeleteSigningCertificateRequest": { @@ -4495,7 +4750,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\n programmatically, you must delete the items attached to the user manually, or the\n deletion fails. For more information, see Deleting an IAM\n user. Before attempting to delete a user, remove the following items:

\n " + "smithy.api#documentation": "

Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\n programmatically, you must delete the items attached to the user manually, or the\n deletion fails. For more information, see Deleting an IAM\n user. Before attempting to delete a user, remove the following items:

\n ", + "smithy.api#examples": [ + { + "title": "To delete an IAM user", + "documentation": "The following command removes the IAM user named Bob from the current account.", + "input": { + "UserName": "Bob" + } + } + ] } }, "com.amazonaws.iam#DeleteUserPermissionsBoundary": { @@ -4553,7 +4817,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n user.

\n

A user can also have managed policies attached to it. To detach a managed policy from\n a user, use DetachUserPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n user.

\n

A user can also have managed policies attached to it. To detach a managed policy from\n a user, use DetachUserPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a policy from an IAM user", + "documentation": "The following delete-user-policy command removes the specified policy from the IAM user named Juan:", + "input": { + "UserName": "Juan", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteUserPolicyRequest": { @@ -4619,7 +4893,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a virtual MFA device.

\n \n

You must deactivate a user's virtual MFA device before you can delete it. For\n information about deactivating MFA devices, see DeactivateMFADevice.

\n
" + "smithy.api#documentation": "

Deletes a virtual MFA device.

\n \n

You must deactivate a user's virtual MFA device before you can delete it. For\n information about deactivating MFA devices, see DeactivateMFADevice.

\n
", + "smithy.api#examples": [ + { + "title": "To remove a virtual MFA device", + "documentation": "The following delete-virtual-mfa-device command removes the specified MFA device from the current AWS account.", + "input": { + "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleName" + } + } + ] } }, "com.amazonaws.iam#DeleteVirtualMFADeviceRequest": { @@ -5243,7 +5526,19 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report for service last accessed data for Organizations. You can generate a\n report for any entities (organization root, organizational unit, or account) or policies\n in your organization.

\n

To call this operation, you must be signed in using your Organizations management account\n credentials. You can use your long-term IAM user or root user credentials, or temporary\n credentials from assuming an IAM role. SCPs must be enabled for your organization\n root. You must have the required IAM and Organizations permissions. For more information, see\n Refining permissions using service last accessed data in the\n IAM User Guide.

\n

You can generate a service last accessed data report for entities by specifying only\n the entity's path. This data includes a list of services that are allowed by any service\n control policies (SCPs) that apply to the entity.

\n

You can generate a service last accessed data report for a policy by specifying an\n entity's path and an optional Organizations policy ID. This data includes a list of services that\n are allowed by the specified SCP.

\n

For each service in both report types, the data includes the most recent account\n activity that the policy allows to account principals in the entity or the entity's\n children. For important information about the data, reporting period, permissions\n required, troubleshooting, and supported Regions see Reducing permissions using\n service last accessed data in the\n IAM User Guide.

\n \n

The data includes all attempts to access Amazon Web Services, not just the successful ones. This\n includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\n of the SDKs, or any of the command line tools. An unexpected entry in the service\n last accessed data does not mean that an account has been compromised, because the\n request might have been denied. Refer to your CloudTrail logs as the authoritative\n source for information about all API calls and whether they were successful or\n denied access. For more information, see Logging IAM events with\n CloudTrail in the IAM User Guide.

\n
\n

This operation returns a JobId. Use this parameter in the \n GetOrganizationsAccessReport\n operation to check the status of\n the report generation. To check the status of this request, use the JobId\n parameter in the \n GetOrganizationsAccessReport\n operation\n and test the JobStatus response parameter. When the job is complete, you\n can retrieve the report.

\n

To generate a service last accessed data report for entities, specify an entity path\n without specifying the optional Organizations policy ID. The type of entity that you specify\n determines the data returned in the report.

\n
    \n
  • \n

    \n Root – When you specify the\n organizations root as the entity, the resulting report lists all of the services\n allowed by SCPs that are attached to your root. For each service, the report\n includes data for all accounts in your organization except the\n management account, because the management account is not limited by SCPs.

    \n
  • \n
  • \n

    \n OU – When you specify an\n organizational unit (OU) as the entity, the resulting report lists all of the\n services allowed by SCPs that are attached to the OU and its parents. For each\n service, the report includes data for all accounts in the OU or its children.\n This data excludes the management account, because the management account is not\n limited by SCPs.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. For each service, the report includes\n data for only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account as the entity, the resulting report lists all of the services allowed by\n SCPs that are attached to the account and its parents. For each service, the\n report includes data for only the specified account.

    \n
  • \n
\n

To generate a service last accessed data report for policies, specify an entity path\n and the optional Organizations policy ID. The type of entity that you specify determines the data\n returned for each service.

\n
    \n
  • \n

    \n Root – When you specify the root\n entity and a policy ID, the resulting report lists all of the services that are\n allowed by the specified SCP. For each service, the report includes data for all\n accounts in your organization to which the SCP applies. This data excludes the\n management account, because the management account is not limited by SCPs. If the\n SCP is not attached to any entities in the organization, then the report will\n return a list of services with no data.

    \n
  • \n
  • \n

    \n OU – When you specify an OU entity and\n a policy ID, the resulting report lists all of the services that are allowed by\n the specified SCP. For each service, the report includes data for all accounts\n in the OU or its children to which the SCP applies. This means that other\n accounts outside the OU that are affected by the SCP might not be included in\n the data. This data excludes the management account, because the\n management account is not limited by SCPs. If the SCP is not attached to the OU\n or one of its children, the report will return a list of services with no\n data.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. If you specify a policy ID in the CLI\n or API, the policy is ignored. For each service, the report includes data for\n only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account entity and a policy ID, the resulting report lists all of the services\n that are allowed by the specified SCP. For each service, the report includes\n data for only the specified account. This means that other accounts in the\n organization that are affected by the SCP might not be included in the data. If\n the SCP is not attached to the account, the report will return a list of\n services with no data.

    \n
  • \n
\n \n

Service last accessed data does not use other policy types when determining\n whether a principal could access a service. These other policy types include\n identity-based policies, resource-based policies, access control lists, IAM\n permissions boundaries, and STS assume role policies. It only applies SCP logic.\n For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service last accessed data, see Reducing policy scope by\n viewing user activity in the IAM User Guide.

" + "smithy.api#documentation": "

Generates a report for service last accessed data for Organizations. You can generate a\n report for any entities (organization root, organizational unit, or account) or policies\n in your organization.

\n

To call this operation, you must be signed in using your Organizations management account\n credentials. You can use your long-term IAM user or root user credentials, or temporary\n credentials from assuming an IAM role. SCPs must be enabled for your organization\n root. You must have the required IAM and Organizations permissions. For more information, see\n Refining permissions using service last accessed data in the\n IAM User Guide.

\n

You can generate a service last accessed data report for entities by specifying only\n the entity's path. This data includes a list of services that are allowed by any service\n control policies (SCPs) that apply to the entity.

\n

You can generate a service last accessed data report for a policy by specifying an\n entity's path and an optional Organizations policy ID. This data includes a list of services that\n are allowed by the specified SCP.

\n

For each service in both report types, the data includes the most recent account\n activity that the policy allows to account principals in the entity or the entity's\n children. For important information about the data, reporting period, permissions\n required, troubleshooting, and supported Regions see Reducing permissions using\n service last accessed data in the\n IAM User Guide.

\n \n

The data includes all attempts to access Amazon Web Services, not just the successful ones. This\n includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\n of the SDKs, or any of the command line tools. An unexpected entry in the service\n last accessed data does not mean that an account has been compromised, because the\n request might have been denied. Refer to your CloudTrail logs as the authoritative\n source for information about all API calls and whether they were successful or\n denied access. For more information, see Logging IAM events with\n CloudTrail in the IAM User Guide.

\n
\n

This operation returns a JobId. Use this parameter in the \n GetOrganizationsAccessReport\n operation to check the status of\n the report generation. To check the status of this request, use the JobId\n parameter in the \n GetOrganizationsAccessReport\n operation\n and test the JobStatus response parameter. When the job is complete, you\n can retrieve the report.

\n

To generate a service last accessed data report for entities, specify an entity path\n without specifying the optional Organizations policy ID. The type of entity that you specify\n determines the data returned in the report.

\n
    \n
  • \n

    \n Root – When you specify the\n organizations root as the entity, the resulting report lists all of the services\n allowed by SCPs that are attached to your root. For each service, the report\n includes data for all accounts in your organization except the\n management account, because the management account is not limited by SCPs.

    \n
  • \n
  • \n

    \n OU – When you specify an\n organizational unit (OU) as the entity, the resulting report lists all of the\n services allowed by SCPs that are attached to the OU and its parents. For each\n service, the report includes data for all accounts in the OU or its children.\n This data excludes the management account, because the management account is not\n limited by SCPs.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. For each service, the report includes\n data for only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account as the entity, the resulting report lists all of the services allowed by\n SCPs that are attached to the account and its parents. For each service, the\n report includes data for only the specified account.

    \n
  • \n
\n

To generate a service last accessed data report for policies, specify an entity path\n and the optional Organizations policy ID. The type of entity that you specify determines the data\n returned for each service.

\n
    \n
  • \n

    \n Root – When you specify the root\n entity and a policy ID, the resulting report lists all of the services that are\n allowed by the specified SCP. For each service, the report includes data for all\n accounts in your organization to which the SCP applies. This data excludes the\n management account, because the management account is not limited by SCPs. If the\n SCP is not attached to any entities in the organization, then the report will\n return a list of services with no data.

    \n
  • \n
  • \n

    \n OU – When you specify an OU entity and\n a policy ID, the resulting report lists all of the services that are allowed by\n the specified SCP. For each service, the report includes data for all accounts\n in the OU or its children to which the SCP applies. This means that other\n accounts outside the OU that are affected by the SCP might not be included in\n the data. This data excludes the management account, because the\n management account is not limited by SCPs. If the SCP is not attached to the OU\n or one of its children, the report will return a list of services with no\n data.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. If you specify a policy ID in the CLI\n or API, the policy is ignored. For each service, the report includes data for\n only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account entity and a policy ID, the resulting report lists all of the services\n that are allowed by the specified SCP. For each service, the report includes\n data for only the specified account. This means that other accounts in the\n organization that are affected by the SCP might not be included in the data. If\n the SCP is not attached to the account, the report will return a list of\n services with no data.

    \n
  • \n
\n \n

Service last accessed data does not use other policy types when determining\n whether a principal could access a service. These other policy types include\n identity-based policies, resource-based policies, access control lists, IAM\n permissions boundaries, and STS assume role policies. It only applies SCP logic.\n For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service last accessed data, see Reducing policy scope by\n viewing user activity in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To generate a service last accessed data report for an organizational unit", + "documentation": "The following operation generates a report for the organizational unit ou-rge0-awexample", + "input": { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example" + }, + "output": { + "JobId": "examplea-1234-b567-cde8-90fg123abcd4" + } + } + ] } }, "com.amazonaws.iam#GenerateOrganizationsAccessReportRequest": { @@ -5298,7 +5593,19 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

" + "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To generate a service last accessed data report for a policy", + "documentation": "The following operation generates a report for the policy: ExamplePolicy1", + "input": { + "Arn": "arn:aws:iam::123456789012:policy/ExamplePolicy1" + }, + "output": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7" + } + } + ] } }, "com.amazonaws.iam#GenerateServiceLastAccessedDetailsRequest": { @@ -5500,7 +5807,27 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\n requirements and mandatory rotation periods for the IAM user passwords in your account.\n For more information about using a password policy, see Managing an IAM password\n policy.

" + "smithy.api#documentation": "

Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\n requirements and mandatory rotation periods for the IAM user passwords in your account.\n For more information about using a password policy, see Managing an IAM password\n policy.

", + "smithy.api#examples": [ + { + "title": "To see the current account password policy", + "documentation": "The following command displays details about the password policy for the current AWS account.", + "output": { + "PasswordPolicy": { + "AllowUsersToChangePassword": false, + "RequireNumbers": true, + "RequireLowercaseCharacters": false, + "RequireUppercaseCharacters": false, + "MinimumPasswordLength": 8, + "RequireSymbols": true, + "ExpirePasswords": false, + "PasswordReusePrevention": 12, + "MaxPasswordAge": 90, + "HardExpiry": false + } + } + } + ] } }, "com.amazonaws.iam#GetAccountPasswordPolicyResponse": { @@ -5533,7 +5860,43 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\n account.

\n

For information about IAM quotas, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\n account.

\n

For information about IAM quotas, see IAM and STS quotas in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about IAM entity quotas and usage in the current account", + "documentation": "The following command returns information about the IAM entity quotas and usage in the current AWS account.", + "output": { + "SummaryMap": { + "Users": 27, + "UsersQuota": 5000, + "Groups": 15, + "GroupsQuota": 100, + "Policies": 8, + "PoliciesQuota": 1000, + "PolicySizeQuota": 5120, + "PolicyVersionsInUse": 22, + "PolicyVersionsInUseQuota": 10000, + "VersionsPerPolicyQuota": 5, + "ServerCertificates": 1, + "ServerCertificatesQuota": 20, + "UserPolicySizeQuota": 2048, + "GroupPolicySizeQuota": 5120, + "GroupsPerUserQuota": 10, + "GlobalEndpointTokenVersion": 2, + "SigningCertificatesPerUserQuota": 2, + "AccessKeysPerUserQuota": 2, + "MFADevices": 6, + "MFADevicesInUse": 3, + "AccountMFAEnabled": 0, + "AccountAccessKeysPresent": 1, + "AccountSigningCertificatesPresent": 0, + "AttachedPoliciesPerGroupQuota": 10, + "AttachedPoliciesPerRoleQuota": 10, + "AttachedPoliciesPerUserQuota": 10 + } + } + } + ] } }, "com.amazonaws.iam#GetAccountSummaryResponse": { @@ -5870,6 +6233,34 @@ ], "traits": { "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about an instance profile", + "documentation": "The following command gets information about the instance profile named ExampleInstanceProfile.", + "input": { + "InstanceProfileName": "ExampleInstanceProfile" + }, + "output": { + "InstanceProfile": { + "InstanceProfileId": "AID2MAB8DPLSRHEXAMPLE", + "Roles": [ + { + "AssumeRolePolicyDocument": "", + "RoleId": "AIDGPMS9RO4H3FEXAMPLE", + "CreateDate": "2013-01-09T06:33:26Z", + "Path": "/", + "RoleName": "Test-Role", + "Arn": "arn:aws:iam::336924118301:role/Test-Role" + } + ], + "CreateDate": "2013-06-12T23:52:02Z", + "InstanceProfileName": "ExampleInstanceProfile", + "Path": "/", + "Arn": "arn:aws:iam::336924118301:instance-profile/ExampleInstanceProfile" + } + } + } + ], "smithy.waiters#waitable": { "InstanceProfileExists": { "acceptors": [ @@ -5939,7 +6330,22 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the user name for the specified IAM user. A login profile is created when\n you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\n or does not have a password, the operation returns a 404 (NoSuchEntity)\n error.

\n

If you create an IAM user with access to the console, the CreateDate\n reflects the date you created the initial password for the user.

\n

If you create an IAM user with programmatic access, and then later add a password\n for the user to access the Amazon Web Services Management Console, the CreateDate reflects the initial\n password creation date. A user with programmatic access does not have a login profile\n unless you create a password for the user to access the Amazon Web Services Management Console.

" + "smithy.api#documentation": "

Retrieves the user name for the specified IAM user. A login profile is created when\n you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\n or does not have a password, the operation returns a 404 (NoSuchEntity)\n error.

\n

If you create an IAM user with access to the console, the CreateDate\n reflects the date you created the initial password for the user.

\n

If you create an IAM user with programmatic access, and then later add a password\n for the user to access the Amazon Web Services Management Console, the CreateDate reflects the initial\n password creation date. A user with programmatic access does not have a login profile\n unless you create a password for the user to access the Amazon Web Services Management Console.

", + "smithy.api#examples": [ + { + "title": "To get password information for an IAM user", + "documentation": "The following command gets information about the password for the IAM user named Anika.", + "input": { + "UserName": "Anika" + }, + "output": { + "LoginProfile": { + "UserName": "Anika", + "CreateDate": "2012-09-21T23:03:39Z" + } + } + } + ] } }, "com.amazonaws.iam#GetLoginProfileRequest": { @@ -6138,7 +6544,47 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the service last accessed data report for Organizations that was previously\n generated using the \n GenerateOrganizationsAccessReport\n \n operation. This operation retrieves the status of your report job and the report\n contents.

\n

Depending on the parameters that you passed when you generated the report, the data\n returned could include different information. For details, see GenerateOrganizationsAccessReport.

\n

To call this operation, you must be signed in to the management account in your\n organization. SCPs must be enabled for your organization root. You must have permissions\n to perform this operation. For more information, see Refining permissions using\n service last accessed data in the\n IAM User Guide.

\n

For each service that principals in an account (root user, IAM users, or IAM roles)\n could access using SCPs, the operation returns details about the most recent access\n attempt. If there was no attempt, the service is listed without details about the most\n recent attempt to access the service. If the operation fails, it returns the reason that\n it failed.

\n

By default, the list is sorted by service namespace.

" + "smithy.api#documentation": "

Retrieves the service last accessed data report for Organizations that was previously\n generated using the \n GenerateOrganizationsAccessReport\n \n operation. This operation retrieves the status of your report job and the report\n contents.

\n

Depending on the parameters that you passed when you generated the report, the data\n returned could include different information. For details, see GenerateOrganizationsAccessReport.

\n

To call this operation, you must be signed in to the management account in your\n organization. SCPs must be enabled for your organization root. You must have permissions\n to perform this operation. For more information, see Refining permissions using\n service last accessed data in the\n IAM User Guide.

\n

For each service that principals in an account (root user, IAM users, or IAM roles)\n could access using SCPs, the operation returns details about the most recent access\n attempt. If there was no attempt, the service is listed without details about the most\n recent attempt to access the service. If the operation fails, it returns the reason that\n it failed.

\n

By default, the list is sorted by service namespace.

", + "smithy.api#examples": [ + { + "title": "To get details from a previously generated organizational unit report", + "documentation": "The following operation gets details about the report with the job ID: examplea-1234-b567-cde8-90fg123abcd4", + "input": { + "JobId": "examplea-1234-b567-cde8-90fg123abcd4" + }, + "output": { + "IsTruncated": false, + "JobCompletionDate": "2019-06-18T19:47:35.241Z", + "JobCreationDate": "2019-06-18T19:47:31.466Z", + "JobStatus": "COMPLETED", + "NumberOfServicesAccessible": 3, + "NumberOfServicesNotAccessed": 1, + "AccessDetails": [ + { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/111122223333", + "LastAuthenticatedTime": "2019-05-25T16:29:52Z", + "Region": "us-east-1", + "ServiceName": "Amazon DynamoDB", + "ServiceNamespace": "dynamodb", + "TotalAuthenticatedEntities": 2 + }, + { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/123456789012", + "LastAuthenticatedTime": "2019-06-15T13:12:06Z", + "Region": "us-east-1", + "ServiceName": "AWS Identity and Access Management", + "ServiceNamespace": "iam", + "TotalAuthenticatedEntities": 4 + }, + { + "ServiceName": "Amazon Simple Storage Service", + "ServiceNamespace": "s3", + "TotalAuthenticatedEntities": 0 + } + ] + } + } + ] } }, "com.amazonaws.iam#GetOrganizationsAccessReportRequest": { @@ -6389,6 +6835,30 @@ ], "traits": { "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see IAM roles in the\n IAM User Guide.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", + "smithy.api#examples": [ + { + "title": "To get information about an IAM role", + "documentation": "The following command gets information about the role named Test-Role.", + "input": { + "RoleName": "Test-Role" + }, + "output": { + "Role": { + "Arn": "arn:aws:iam::123456789012:role/Test-Role", + "AssumeRolePolicyDocument": "", + "CreateDate": "2013-04-18T05:01:58Z", + "MaxSessionDuration": 3600, + "Path": "/", + "RoleId": "AROADBQP57FF2AEXAMPLE", + "RoleLastUsed": { + "LastUsedDate": "2019-11-18T05:01:58Z", + "Region": "us-east-1" + }, + "RoleName": "Test-Role" + } + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -6719,7 +7189,36 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves a service last accessed report that was created using the\n GenerateServiceLastAccessedDetails operation. You can use the\n JobId parameter in GetServiceLastAccessedDetails to\n retrieve the status of your report job. When the report is complete, you can retrieve\n the generated report. The report includes a list of Amazon Web Services services that the resource\n (user, group, role, or managed policy) can access.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For each service that the resource could access using permissions policies, the\n operation returns details about the most recent access attempt. If there was no attempt,\n the service is listed without details about the most recent attempt to access the\n service. If the operation fails, the GetServiceLastAccessedDetails\n operation returns the reason that it failed.

\n

The GetServiceLastAccessedDetails operation returns a list of services.\n This list includes the number of entities that have attempted to access the service and\n the date and time of the last attempt. It also returns the ARN of the following entity,\n depending on the resource ARN that you used to generate the report:

\n
    \n
  • \n

    \n User – Returns the user ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Group – Returns the ARN of the group\n member (user) that last attempted to access the service

    \n
  • \n
  • \n

    \n Role – Returns the role ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Policy – Returns the ARN of the user\n or role that last used the policy to attempt to access the service

    \n
  • \n
\n

By default, the list is sorted by service namespace.

\n

If you specified ACTION_LEVEL granularity when you generated the report,\n this operation returns service and action last accessed data. This includes the most\n recent access attempt for each tracked action within a service. Otherwise, this\n operation returns only service data.

\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

" + "smithy.api#documentation": "

Retrieves a service last accessed report that was created using the\n GenerateServiceLastAccessedDetails operation. You can use the\n JobId parameter in GetServiceLastAccessedDetails to\n retrieve the status of your report job. When the report is complete, you can retrieve\n the generated report. The report includes a list of Amazon Web Services services that the resource\n (user, group, role, or managed policy) can access.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For each service that the resource could access using permissions policies, the\n operation returns details about the most recent access attempt. If there was no attempt,\n the service is listed without details about the most recent attempt to access the\n service. If the operation fails, the GetServiceLastAccessedDetails\n operation returns the reason that it failed.

\n

The GetServiceLastAccessedDetails operation returns a list of services.\n This list includes the number of entities that have attempted to access the service and\n the date and time of the last attempt. It also returns the ARN of the following entity,\n depending on the resource ARN that you used to generate the report:

\n
    \n
  • \n

    \n User – Returns the user ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Group – Returns the ARN of the group\n member (user) that last attempted to access the service

    \n
  • \n
  • \n

    \n Role – Returns the role ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Policy – Returns the ARN of the user\n or role that last used the policy to attempt to access the service

    \n
  • \n
\n

By default, the list is sorted by service namespace.

\n

If you specified ACTION_LEVEL granularity when you generated the report,\n this operation returns service and action last accessed data. This includes the most\n recent access attempt for each tracked action within a service. Otherwise, this\n operation returns only service data.

\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get details from a previously-generated report", + "documentation": "The following operation gets details about the report with the job ID: examplef-1305-c245-eba4-71fe298bcda7", + "input": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7" + }, + "output": { + "JobStatus": "COMPLETED", + "JobCreationDate": "2018-10-24T19:47:31.466Z", + "ServicesLastAccessed": [ + { + "TotalAuthenticatedEntities": 2, + "LastAuthenticated": "2018-10-24T19:11:00Z", + "ServiceNamespace": "iam", + "LastAuthenticatedEntity": "arn:aws:iam::123456789012:user/AWSExampleUser01", + "ServiceName": "AWS Identity and Access Management" + }, + { + "TotalAuthenticatedEntities": 0, + "ServiceNamespace": "s3", + "ServiceName": "Amazon Simple Storage Service" + } + ], + "JobCompletionDate": "2018-10-24T19:47:35.241Z", + "IsTruncated": false + } + } + ] } }, "com.amazonaws.iam#GetServiceLastAccessedDetailsRequest": { @@ -6827,7 +7326,44 @@ } ], "traits": { - "smithy.api#documentation": "

After you generate a group or policy report using the\n GenerateServiceLastAccessedDetails operation, you can use the\n JobId parameter in\n GetServiceLastAccessedDetailsWithEntities. This operation retrieves the\n status of your report job and a list of entities that could have used group or policy\n permissions to access the specified service.

\n
    \n
  • \n

    \n Group – For a group report, this\n operation returns a list of users in the group that could have used the group’s\n policies in an attempt to access the service.

    \n
  • \n
  • \n

    \n Policy – For a policy report, this\n operation returns a list of entities (users or roles) that could have used the\n policy in an attempt to access the service.

    \n
  • \n
\n

You can also use this operation for user or role reports to retrieve details about\n those entities.

\n

If the operation fails, the GetServiceLastAccessedDetailsWithEntities\n operation returns the reason that it failed.

\n

By default, the list of associated entities is sorted by date, with the most recent\n access listed first.

" + "smithy.api#documentation": "

After you generate a group or policy report using the\n GenerateServiceLastAccessedDetails operation, you can use the\n JobId parameter in\n GetServiceLastAccessedDetailsWithEntities. This operation retrieves the\n status of your report job and a list of entities that could have used group or policy\n permissions to access the specified service.

\n
    \n
  • \n

    \n Group – For a group report, this\n operation returns a list of users in the group that could have used the group’s\n policies in an attempt to access the service.

    \n
  • \n
  • \n

    \n Policy – For a policy report, this\n operation returns a list of entities (users or roles) that could have used the\n policy in an attempt to access the service.

    \n
  • \n
\n

You can also use this operation for user or role reports to retrieve details about\n those entities.

\n

If the operation fails, the GetServiceLastAccessedDetailsWithEntities\n operation returns the reason that it failed.

\n

By default, the list of associated entities is sorted by date, with the most recent\n access listed first.

", + "smithy.api#examples": [ + { + "title": "To get sntity details from a previously-generated report", + "documentation": "The following operation returns details about the entities that attempted to access the IAM service.", + "input": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7", + "ServiceNamespace": "iam" + }, + "output": { + "JobStatus": "COMPLETED", + "JobCreationDate": "2018-10-24T19:47:31.466Z", + "JobCompletionDate": "2018-10-24T19:47:35.241Z", + "EntityDetailsList": [ + { + "EntityInfo": { + "Id": "AIDAEX2EXAMPLEB6IGCDC", + "Name": "AWSExampleUser01", + "Type": "USER", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:user/AWSExampleUser01" + }, + "LastAuthenticated": "2018-10-24T19:10:00Z" + }, + { + "EntityInfo": { + "Id": "AROAEAEXAMPLEIANXSIU4", + "Name": "AWSExampleRole01", + "Type": "ROLE", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:role/AWSExampleRole01" + } + } + ], + "IsTruncated": false + } + } + ] } }, "com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesRequest": { @@ -6996,6 +7532,24 @@ ], "traits": { "smithy.api#documentation": "

Retrieves information about the specified IAM user, including the user's creation\n date, path, unique ID, and ARN.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID used to sign the request to this operation.

", + "smithy.api#examples": [ + { + "title": "To get information about an IAM user", + "documentation": "The following command gets information about the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "User": { + "UserName": "Bob", + "Path": "/", + "CreateDate": "2012-09-21T23:03:13Z", + "UserId": "AKIAIOSFODNN7EXAMPLE", + "Arn": "arn:aws:iam::123456789012:user/Bob" + } + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -7411,6 +7965,31 @@ ], "traits": { "smithy.api#documentation": "

Returns information about the access key IDs associated with the specified IAM user.\n If there is none, the operation returns an empty list.

\n

Although each user is limited to a small number of keys, you can still paginate the\n results using the MaxItems and Marker parameters.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation.

\n
", + "smithy.api#examples": [ + { + "title": "To list the access key IDs for an IAM user", + "documentation": "The following command lists the access keys IDs for the IAM user named Alice.", + "input": { + "UserName": "Alice" + }, + "output": { + "AccessKeyMetadata": [ + { + "UserName": "Alice", + "Status": "Active", + "CreateDate": "2016-12-01T22:19:58Z", + "AccessKeyId": "AKIA111111111EXAMPLE" + }, + { + "UserName": "Alice", + "Status": "Active", + "CreateDate": "2016-12-01T22:20:01Z", + "AccessKeyId": "AKIA222222222EXAMPLE" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7489,6 +8068,17 @@ ], "traits": { "smithy.api#documentation": "

Lists the account alias associated with the Amazon Web Services account (Note: you can have only\n one). For information about using an Amazon Web Services account alias, see Creating,\n deleting, and listing an Amazon Web Services account alias in the Amazon Web Services Sign-In\n User Guide.

", + "smithy.api#examples": [ + { + "title": "To list account aliases", + "documentation": "The following command lists the aliases for the current account.", + "output": { + "AccountAliases": [ + "exmaple-corporation" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7947,6 +8537,21 @@ ], "traits": { "smithy.api#documentation": "

Lists the names of the inline policies that are embedded in the specified IAM\n group.

\n

An IAM group can also have managed policies attached to it. To list the managed\n policies that are attached to a group, use ListAttachedGroupPolicies.\n For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

You can paginate the results using the MaxItems and Marker\n parameters. If there are no inline policies embedded with the specified group, the\n operation returns an empty list.

", + "smithy.api#examples": [ + { + "title": "To list the in-line policies for an IAM group", + "documentation": "The following command lists the names of in-line policies that are embedded in the IAM group named Admins.", + "input": { + "GroupName": "Admins" + }, + "output": { + "PolicyNames": [ + "AdminRoot", + "KeyPolicy" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8026,6 +8631,37 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM groups that have the specified path prefix.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list the IAM groups for the current account", + "documentation": "The following command lists the IAM groups in the current account:", + "output": { + "Groups": [ + { + "Path": "/division_abc/subdivision_xyz/", + "GroupName": "Admins", + "CreateDate": "2016-12-15T21:40:08.121Z", + "GroupId": "AGPA1111111111EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/Admins" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/engineering/", + "GroupName": "Test", + "CreateDate": "2016-11-30T14:10:01.156Z", + "GroupId": "AGP22222222222EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/", + "GroupName": "Managers", + "CreateDate": "2016-06-12T20:14:52.032Z", + "GroupId": "AGPI3333333333EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8052,6 +8688,33 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM groups that the specified IAM user belongs to.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list the groups that an IAM user belongs to", + "documentation": "The following command displays the groups that the IAM user named Bob belongs to.", + "input": { + "UserName": "Bob" + }, + "output": { + "Groups": [ + { + "Path": "/division_abc/subdivision_xyz/product_1234/engineering/", + "GroupName": "Test", + "CreateDate": "2016-11-30T14:10:01.156Z", + "GroupId": "AGP2111111111EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/", + "GroupName": "Managers", + "CreateDate": "2016-06-12T20:14:52.032Z", + "GroupId": "AGPI222222222SEXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8740,7 +9403,51 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves a list of policies that the IAM identity (user, group, or role) can use to\n access each specified service.

\n \n

This operation does not use other policy types when determining whether a resource\n could access a service. These other policy types include resource-based policies,\n access control lists, Organizations policies, IAM permissions boundaries, and STS\n assume role policies. It only applies permissions policy logic. For more about the\n evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

The list of policies returned by the operation depends on the ARN of the identity that\n you provide.

\n
    \n
  • \n

    \n User – The list of policies includes\n the managed and inline policies that are attached to the user directly. The list\n also includes any additional managed and inline policies that are attached to\n the group to which the user belongs.

    \n
  • \n
  • \n

    \n Group – The list of policies includes\n only the managed and inline policies that are attached to the group directly.\n Policies that are attached to the group’s user are not included.

    \n
  • \n
  • \n

    \n Role – The list of policies includes\n only the managed and inline policies that are attached to the role.

    \n
  • \n
\n

For each managed policy, this operation returns the ARN and policy name. For each\n inline policy, it returns the policy name and the entity to which it is attached. Inline\n policies do not have an ARN. For more information about these policy types, see Managed policies and inline policies in the\n IAM User Guide.

\n

Policies that are attached to users and roles as permissions boundaries are not\n returned. To view which managed policy is currently used to set the permissions boundary\n for a user or role, use the GetUser or GetRole\n operations.

" + "smithy.api#documentation": "

Retrieves a list of policies that the IAM identity (user, group, or role) can use to\n access each specified service.

\n \n

This operation does not use other policy types when determining whether a resource\n could access a service. These other policy types include resource-based policies,\n access control lists, Organizations policies, IAM permissions boundaries, and STS\n assume role policies. It only applies permissions policy logic. For more about the\n evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

The list of policies returned by the operation depends on the ARN of the identity that\n you provide.

\n
    \n
  • \n

    \n User – The list of policies includes\n the managed and inline policies that are attached to the user directly. The list\n also includes any additional managed and inline policies that are attached to\n the group to which the user belongs.

    \n
  • \n
  • \n

    \n Group – The list of policies includes\n only the managed and inline policies that are attached to the group directly.\n Policies that are attached to the group’s user are not included.

    \n
  • \n
  • \n

    \n Role – The list of policies includes\n only the managed and inline policies that are attached to the role.

    \n
  • \n
\n

For each managed policy, this operation returns the ARN and policy name. For each\n inline policy, it returns the policy name and the entity to which it is attached. Inline\n policies do not have an ARN. For more information about these policy types, see Managed policies and inline policies in the\n IAM User Guide.

\n

Policies that are attached to users and roles as permissions boundaries are not\n returned. To view which managed policy is currently used to set the permissions boundary\n for a user or role, use the GetUser or GetRole\n operations.

", + "smithy.api#examples": [ + { + "title": "To list policies that allow access to a service", + "documentation": "The following operation lists policies that allow ExampleUser01 to access IAM or EC2.", + "input": { + "Arn": "arn:aws:iam::123456789012:user/ExampleUser01", + "ServiceNamespaces": [ + "iam", + "ec2" + ] + }, + "output": { + "IsTruncated": false, + "PoliciesGrantingServiceAccess": [ + { + "Policies": [ + { + "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleIamPolicy", + "PolicyType": "MANAGED", + "PolicyName": "ExampleIamPolicy" + }, + { + "EntityName": "AWSExampleGroup1", + "EntityType": "GROUP", + "PolicyType": "INLINE", + "PolicyName": "ExampleGroup1Policy" + } + ], + "ServiceNamespace": "iam" + }, + { + "Policies": [ + { + "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleEc2Policy", + "PolicyType": "MANAGED", + "PolicyName": "ExampleEc2Policy" + } + ], + "ServiceNamespace": "ec2" + } + ] + } + } + ] } }, "com.amazonaws.iam#ListPoliciesGrantingServiceAccessEntry": { @@ -9160,6 +9867,28 @@ ], "traits": { "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To list the tags attached to an IAM role", + "documentation": "The following example shows how to list the tags attached to a role.", + "input": { + "RoleName": "taggedrole1" + }, + "output": { + "Tags": [ + { + "Key": "Dept", + "Value": "12345" + }, + { + "Key": "Team", + "Value": "Accounting" + } + ], + "IsTruncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9732,6 +10461,26 @@ ], "traits": { "smithy.api#documentation": "

Returns information about the signing certificates associated with the specified IAM\n user. If none exists, the operation returns an empty list.

\n

Although each user is limited to a small number of signing certificates, you can still\n paginate the results using the MaxItems and Marker\n parameters.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request for this operation.\n This operation works for access keys under the Amazon Web Services account. Consequently, you can use\n this operation to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no\n associated users.

", + "smithy.api#examples": [ + { + "title": "To list the signing certificates for an IAM user", + "documentation": "The following command lists the signing certificates for the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "Certificates": [ + { + "UserName": "Bob", + "Status": "Active", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE", + "UploadDate": "2013-06-06T21:40:08Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9895,6 +10644,28 @@ ], "traits": { "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM user. The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To list the tags attached to an IAM user", + "documentation": "The following example shows how to list the tags attached to a user.", + "input": { + "UserName": "anika" + }, + "output": { + "Tags": [ + { + "Key": "Dept", + "Value": "12345" + }, + { + "Key": "Team", + "Value": "Accounting" + } + ], + "IsTruncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9973,6 +10744,32 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM users that have the specified path prefix. If no path prefix is\n specified, the operation returns all users in the Amazon Web Services account. If there are none, the\n operation returns an empty list.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a user, see GetUser.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list IAM users", + "documentation": "The following command lists the IAM users in the current account.", + "output": { + "Users": [ + { + "UserId": "AID2MAB8DPLSRHEXAMPLE", + "Path": "/division_abc/subdivision_xyz/engineering/", + "UserName": "Juan", + "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Juan", + "CreateDate": "2012-09-05T19:38:48Z", + "PasswordLastUsed": "2016-09-08T21:47:36Z" + }, + { + "UserId": "AIDIODR4TAW7CSEXAMPLE", + "Path": "/division_abc/subdivision_xyz/engineering/", + "UserName": "Anika", + "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Anika", + "CreateDate": "2014-04-09T15:43:45Z", + "PasswordLastUsed": "2016-09-24T16:18:07Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -10046,6 +10843,22 @@ }, "traits": { "smithy.api#documentation": "

Lists the virtual MFA devices defined in the Amazon Web Services account by assignment status. If\n you do not specify an assignment status, the operation returns a list of all virtual MFA\n devices. Assignment status can be Assigned, Unassigned, or\n Any.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view tag information for a virtual MFA device, see ListMFADeviceTags.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list virtual MFA devices", + "documentation": "The following command lists the virtual MFA devices that have been configured for the current account.", + "output": { + "VirtualMFADevices": [ + { + "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleMFADevice" + }, + { + "SerialNumber": "arn:aws:iam::123456789012:mfa/Juan" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -10882,7 +11695,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use \n AttachGroupPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use \n AttachGroupPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To add a policy to a group", + "documentation": "The following command adds a policy named AllPerms to the IAM group named Admins.", + "input": { + "GroupName": "Admins", + "PolicyName": "AllPerms", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutGroupPolicyRequest": { @@ -10991,7 +11815,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using \n CreateRole\n .\n You can update a role's trust policy using \n UpdateAssumeRolePolicy\n . For more information about roles,\n see IAM\n roles in the IAM User Guide.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use \n AttachRolePolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using \n CreateRole\n .\n You can update a role's trust policy using \n UpdateAssumeRolePolicy\n . For more information about roles,\n see IAM\n roles in the IAM User Guide.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use \n AttachRolePolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To attach a permissions policy to an IAM role", + "documentation": "The following command adds a permissions policy to the role named Test-Role.", + "input": { + "RoleName": "S3Access", + "PolicyName": "S3AccessPolicy", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"s3:*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutRolePolicyRequest": { @@ -11094,7 +11929,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use \n AttachUserPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use \n AttachUserPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To attach a policy to an IAM user", + "documentation": "The following command attaches a policy to the IAM user named Bob.", + "input": { + "UserName": "Bob", + "PolicyName": "AllAccessPolicy", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutUserPolicyRequest": { @@ -11212,7 +12058,17 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a role from an instance profile", + "documentation": "The following command removes the role named Test-Role from the instance profile named ExampleInstanceProfile.", + "input": { + "RoleName": "Test-Role", + "InstanceProfileName": "ExampleInstanceProfile" + } + } + ] } }, "com.amazonaws.iam#RemoveRoleFromInstanceProfileRequest": { @@ -11257,7 +12113,17 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified user from the specified group.

" + "smithy.api#documentation": "

Removes the specified user from the specified group.

", + "smithy.api#examples": [ + { + "title": "To remove a user from an IAM group", + "documentation": "The following command removes the user named Bob from the IAM group named Admins.", + "input": { + "UserName": "Bob", + "GroupName": "Admins" + } + } + ] } }, "com.amazonaws.iam#RemoveUserFromGroupRequest": { @@ -12225,7 +13091,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the specified version of the global endpoint token as the token version used for\n the Amazon Web Services account.

\n

By default, Security Token Service (STS) is available as a global service, and all STS requests\n go to a single endpoint at https://sts.amazonaws.com. Amazon Web Services recommends\n using Regional STS endpoints to reduce latency, build in redundancy, and increase\n session token availability. For information about Regional endpoints for STS, see\n Security Token Service\n endpoints and quotas in the Amazon Web Services General Reference.

\n

If you make an STS call to the global endpoint, the resulting session tokens might\n be valid in some Regions but not others. It depends on the version that is set in this\n operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\n available by default. These tokens do not work in manually enabled Regions, such as Asia\n Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\n tokens are longer and might affect systems where you temporarily store tokens. For\n information, see Activating and\n deactivating STS in an Amazon Web Services Region in the\n IAM User Guide.

\n

To view the current session token version, see the\n GlobalEndpointTokenVersion entry in the response of the GetAccountSummary operation.

" + "smithy.api#documentation": "

Sets the specified version of the global endpoint token as the token version used for\n the Amazon Web Services account.

\n

By default, Security Token Service (STS) is available as a global service, and all STS requests\n go to a single endpoint at https://sts.amazonaws.com. Amazon Web Services recommends\n using Regional STS endpoints to reduce latency, build in redundancy, and increase\n session token availability. For information about Regional endpoints for STS, see\n Security Token Service\n endpoints and quotas in the Amazon Web Services General Reference.

\n

If you make an STS call to the global endpoint, the resulting session tokens might\n be valid in some Regions but not others. It depends on the version that is set in this\n operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\n available by default. These tokens do not work in manually enabled Regions, such as Asia\n Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\n tokens are longer and might affect systems where you temporarily store tokens. For\n information, see Activating and\n deactivating STS in an Amazon Web Services Region in the\n IAM User Guide.

\n

To view the current session token version, see the\n GlobalEndpointTokenVersion entry in the response of the GetAccountSummary operation.

", + "smithy.api#examples": [ + { + "title": "To delete an access key for an IAM user", + "documentation": "The following command sets the STS global endpoint token to version 2. Version 2 tokens are valid in all Regions.", + "input": { + "GlobalEndpointTokenVersion": "v2Token" + } + } + ] } }, "com.amazonaws.iam#SetSecurityTokenServicePreferencesRequest": { @@ -12821,7 +13696,26 @@ } ], "traits": { - "smithy.api#documentation": "

Adds one or more tags to an IAM role. The role can be a regular role or a\n service-linked role. If a tag with the same key name already exists, then that tag is\n overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM user-based\n and resource-based policies. You can use tags to restrict access to only an IAM role\n that has a specified tag attached. You can also restrict access to only those resources\n that have a certain tag attached. For examples of policies that show how to use tags to\n control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

" + "smithy.api#documentation": "

Adds one or more tags to an IAM role. The role can be a regular role or a\n service-linked role. If a tag with the same key name already exists, then that tag is\n overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM user-based\n and resource-based policies. You can use tags to restrict access to only an IAM role\n that has a specified tag attached. You can also restrict access to only those resources\n that have a certain tag attached. For examples of policies that show how to use tags to\n control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag key and value to an IAM role", + "documentation": "The following example shows how to add tags to an existing role.", + "input": { + "RoleName": "taggedrole", + "Tags": [ + { + "Key": "Dept", + "Value": "Accounting" + }, + { + "Key": "CostCenter", + "Value": "12345" + } + ] + } + } + ] } }, "com.amazonaws.iam#TagRoleRequest": { @@ -12974,7 +13868,26 @@ } ], "traits": { - "smithy.api#documentation": "

Adds one or more tags to an IAM user. If a tag with the same key name already exists,\n then that tag is overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM identity-based\n and resource-based policies. You can use tags to restrict access to only an IAM\n requesting user that has a specified tag attached. You can also restrict access to only\n those resources that have a certain tag attached. For examples of policies that show how\n to use tags to control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

" + "smithy.api#documentation": "

Adds one or more tags to an IAM user. If a tag with the same key name already exists,\n then that tag is overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM identity-based\n and resource-based policies. You can use tags to restrict access to only an IAM\n requesting user that has a specified tag attached. You can also restrict access to only\n those resources that have a certain tag attached. For examples of policies that show how\n to use tags to control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag key and value to an IAM user", + "documentation": "The following example shows how to add tags to an existing user.", + "input": { + "UserName": "anika", + "Tags": [ + { + "Key": "Dept", + "Value": "Accounting" + }, + { + "Key": "CostCenter", + "Value": "12345" + } + ] + } + } + ] } }, "com.amazonaws.iam#TagUserRequest": { @@ -13280,7 +14193,19 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified tags from the role. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified tags from the role. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a tag from an IAM role", + "documentation": "The following example shows how to remove a tag with the key 'Dept' from a role named 'taggedrole'.", + "input": { + "RoleName": "taggedrole", + "TagKeys": [ + "Dept" + ] + } + } + ] } }, "com.amazonaws.iam#UntagRoleRequest": { @@ -13421,7 +14346,19 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified tags from the user. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified tags from the user. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a tag from an IAM user", + "documentation": "The following example shows how to remove tags that are attached to a user named 'anika'.", + "input": { + "UserName": "anika", + "TagKeys": [ + "Dept" + ] + } + } + ] } }, "com.amazonaws.iam#UntagUserRequest": { @@ -13466,7 +14403,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the status of the specified access key from Active to Inactive, or vice versa.\n This operation can be used to disable a user's key as part of a key rotation\n workflow.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n

For information about rotating keys, see Managing keys and certificates\n in the IAM User Guide.

" + "smithy.api#documentation": "

Changes the status of the specified access key from Active to Inactive, or vice versa.\n This operation can be used to disable a user's key as part of a key rotation\n workflow.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n

For information about rotating keys, see Managing keys and certificates\n in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To activate or deactivate an access key for an IAM user", + "documentation": "The following command deactivates the specified access key (access key ID and secret access key) for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "Status": "Inactive", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + ] } }, "com.amazonaws.iam#UpdateAccessKeyRequest": { @@ -13520,7 +14468,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the password policy settings for the Amazon Web Services account.

\n \n

This operation does not support partial updates. No parameters are required, but\n if you do not specify a parameter, that parameter's value reverts to its default\n value. See the Request Parameters section for each\n parameter's default value. Also note that some parameters do not allow the default\n parameter to be explicitly set. Instead, to invoke the default value, do not include\n that parameter when you invoke the operation.

\n
\n

For more information about using a password policy, see Managing an IAM password\n policy in the IAM User Guide.

" + "smithy.api#documentation": "

Updates the password policy settings for the Amazon Web Services account.

\n \n

This operation does not support partial updates. No parameters are required, but\n if you do not specify a parameter, that parameter's value reverts to its default\n value. See the Request Parameters section for each\n parameter's default value. Also note that some parameters do not allow the default\n parameter to be explicitly set. Instead, to invoke the default value, do not include\n that parameter when you invoke the operation.

\n
\n

For more information about using a password policy, see Managing an IAM password\n policy in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To set or change the current account password policy", + "documentation": "The following command sets the password policy to require a minimum length of eight characters and to require one or more numbers in the password:", + "input": { + "MinimumPasswordLength": 8, + "RequireNumbers": true + } + } + ] } }, "com.amazonaws.iam#UpdateAccountPasswordPolicyRequest": { @@ -13616,7 +14574,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the policy that grants an IAM entity permission to assume a role. This is\n typically referred to as the \"role trust policy\". For more information about roles, see\n Using roles to\n delegate permissions and federate identities.

" + "smithy.api#documentation": "

Updates the policy that grants an IAM entity permission to assume a role. This is\n typically referred to as the \"role trust policy\". For more information about roles, see\n Using roles to\n delegate permissions and federate identities.

", + "smithy.api#examples": [ + { + "title": "To update the trust policy for an IAM role", + "documentation": "The following command updates the role trust policy for the role named Test-Role:", + "input": { + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]},\"Action\":[\"sts:AssumeRole\"]}]}", + "RoleName": "S3AccessForEC2Instances" + } + } + ] } }, "com.amazonaws.iam#UpdateAssumeRolePolicyRequest": { @@ -13664,7 +14632,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM group.

\n \n

You should understand the implications of changing a group's path or name. For\n more information, see Renaming users and\n groups in the IAM User Guide.

\n
\n \n

The person making the request (the principal), must have permission to change the\n role group with the old name and the new name. For example, to change the group\n named Managers to MGRs, the principal must have a policy\n that allows them to update both groups. If the principal has permission to update\n the Managers group, but not the MGRs group, then the\n update fails. For more information about permissions, see Access management.\n

\n
" + "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM group.

\n \n

You should understand the implications of changing a group's path or name. For\n more information, see Renaming users and\n groups in the IAM User Guide.

\n
\n \n

The person making the request (the principal), must have permission to change the\n role group with the old name and the new name. For example, to change the group\n named Managers to MGRs, the principal must have a policy\n that allows them to update both groups. If the principal has permission to update\n the Managers group, but not the MGRs group, then the\n update fails. For more information about permissions, see Access management.\n

\n
", + "smithy.api#examples": [ + { + "title": "To rename an IAM group", + "documentation": "The following command changes the name of the IAM group Test to Test-1.", + "input": { + "GroupName": "Test", + "NewGroupName": "Test-1" + } + } + ] } }, "com.amazonaws.iam#UpdateGroupRequest": { @@ -13720,7 +14698,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\n API, or the Users page in the IAM console to change\n the password for any IAM user. Use ChangePassword to change your own\n password in the My Security Credentials page in the\n Amazon Web Services Management Console.

\n

For more information about modifying passwords, see Managing passwords in the\n IAM User Guide.

" + "smithy.api#documentation": "

Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\n API, or the Users page in the IAM console to change\n the password for any IAM user. Use ChangePassword to change your own\n password in the My Security Credentials page in the\n Amazon Web Services Management Console.

\n

For more information about modifying passwords, see Managing passwords in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To change the password for an IAM user", + "documentation": "The following command creates or changes the password for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "Password": "SomeKindOfPassword123!@#" + } + } + ] } }, "com.amazonaws.iam#UpdateLoginProfileRequest": { @@ -14138,7 +15126,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the status of the specified user signing certificate from active to disabled,\n or vice versa. This operation can be used to disable an IAM user's signing\n certificate as part of a certificate rotation work flow.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

" + "smithy.api#documentation": "

Changes the status of the specified user signing certificate from active to disabled,\n or vice versa. This operation can be used to disable an IAM user's signing\n certificate as part of a certificate rotation work flow.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

", + "smithy.api#examples": [ + { + "title": "To change the active status of a signing certificate for an IAM user", + "documentation": "The following command changes the status of a signing certificate for a user named Bob to Inactive.", + "input": { + "UserName": "Bob", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE", + "Status": "Inactive" + } + } + ] } }, "com.amazonaws.iam#UpdateSigningCertificateRequest": { @@ -14198,7 +15197,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM user.

\n \n

You should understand the implications of changing an IAM user's path or\n name. For more information, see Renaming an IAM\n user and Renaming an IAM\n group in the IAM User Guide.

\n
\n \n

To change a user name, the requester must have appropriate permissions on both\n the source object and the target object. For example, to change Bob to Robert, the\n entity making the request must have permission on Bob and Robert, or must have\n permission on all (*). For more information about permissions, see Permissions and policies.

\n
" + "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM user.

\n \n

You should understand the implications of changing an IAM user's path or\n name. For more information, see Renaming an IAM\n user and Renaming an IAM\n group in the IAM User Guide.

\n
\n \n

To change a user name, the requester must have appropriate permissions on both\n the source object and the target object. For example, to change Bob to Robert, the\n entity making the request must have permission on Bob and Robert, or must have\n permission on all (*). For more information about permissions, see Permissions and policies.

\n
", + "smithy.api#examples": [ + { + "title": "To change an IAM user's name", + "documentation": "The following command changes the name of the IAM user Bob to Robert. It does not change the user's path.", + "input": { + "UserName": "Bob", + "NewUserName": "Robert" + } + } + ] } }, "com.amazonaws.iam#UpdateUserRequest": { @@ -14326,7 +15335,29 @@ } ], "traits": { - "smithy.api#documentation": "

Uploads a server certificate entity for the Amazon Web Services account. The server certificate\n entity includes a public key certificate, a private key, and an optional certificate\n chain, which should all be PEM-encoded.

\n

We recommend that you use Certificate Manager to\n provision, manage, and deploy your server certificates. With ACM you can request a\n certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\n you. Certificates provided by ACM are free. For more information about using ACM,\n see the Certificate Manager User\n Guide.

\n

For more information about working with server certificates, see Working\n with server certificates in the IAM User Guide. This\n topic includes a list of Amazon Web Services services that can use the server certificates that you\n manage with IAM.

\n

For information about the number of server certificates you can upload, see IAM and STS\n quotas in the IAM User Guide.

\n \n

Because the body of the public key certificate, private key, and the certificate\n chain can be large, you should use POST rather than GET when calling\n UploadServerCertificate. For information about setting up\n signatures and authorization through the API, see Signing Amazon Web Services API\n requests in the Amazon Web Services General Reference. For general\n information about using the Query API with IAM, see Calling the API by making HTTP query\n requests in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Uploads a server certificate entity for the Amazon Web Services account. The server certificate\n entity includes a public key certificate, a private key, and an optional certificate\n chain, which should all be PEM-encoded.

\n

We recommend that you use Certificate Manager to\n provision, manage, and deploy your server certificates. With ACM you can request a\n certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\n you. Certificates provided by ACM are free. For more information about using ACM,\n see the Certificate Manager User\n Guide.

\n

For more information about working with server certificates, see Working\n with server certificates in the IAM User Guide. This\n topic includes a list of Amazon Web Services services that can use the server certificates that you\n manage with IAM.

\n

For information about the number of server certificates you can upload, see IAM and STS\n quotas in the IAM User Guide.

\n \n

Because the body of the public key certificate, private key, and the certificate\n chain can be large, you should use POST rather than GET when calling\n UploadServerCertificate. For information about setting up\n signatures and authorization through the API, see Signing Amazon Web Services API\n requests in the Amazon Web Services General Reference. For general\n information about using the Query API with IAM, see Calling the API by making HTTP query\n requests in the IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To upload a server certificate to your AWS account", + "documentation": "The following upload-server-certificate command uploads a server certificate to your AWS account:", + "input": { + "ServerCertificateName": "ProdServerCert", + "Path": "/company/servercerts/", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "PrivateKey": "-----BEGIN DSA PRIVATE KEY----------END DSA PRIVATE KEY-----" + }, + "output": { + "ServerCertificateMetadata": { + "ServerCertificateName": "ProdServerCert", + "Path": "/company/servercerts/", + "Arn": "arn:aws:iam::123456789012:server-certificate/company/servercerts/ProdServerCert", + "UploadDate": "2010-05-08T01:02:03.004Z", + "ServerCertificateId": "ASCA1111111111EXAMPLE", + "Expiration": "2012-05-08T01:02:03.004Z" + } + } + } + ] } }, "com.amazonaws.iam#UploadServerCertificateRequest": { @@ -14432,7 +15463,26 @@ } ], "traits": { - "smithy.api#documentation": "

Uploads an X.509 signing certificate and associates it with the specified IAM user.\n Some Amazon Web Services services require you to use certificates to validate requests that are signed\n with a corresponding private key. When you upload the certificate, its default status is\n Active.

\n

For information about when you would use an X.509 signing certificate, see Managing\n server certificates in IAM in the\n IAM User Guide.

\n

If the UserName is not specified, the IAM user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

\n \n

Because the body of an X.509 certificate can be large, you should use POST rather\n than GET when calling UploadSigningCertificate. For information about\n setting up signatures and authorization through the API, see Signing\n Amazon Web Services API requests in the Amazon Web Services General Reference. For\n general information about using the Query API with IAM, see Making query\n requests in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Uploads an X.509 signing certificate and associates it with the specified IAM user.\n Some Amazon Web Services services require you to use certificates to validate requests that are signed\n with a corresponding private key. When you upload the certificate, its default status is\n Active.

\n

For information about when you would use an X.509 signing certificate, see Managing\n server certificates in IAM in the\n IAM User Guide.

\n

If the UserName is not specified, the IAM user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

\n \n

Because the body of an X.509 certificate can be large, you should use POST rather\n than GET when calling UploadSigningCertificate. For information about\n setting up signatures and authorization through the API, see Signing\n Amazon Web Services API requests in the Amazon Web Services General Reference. For\n general information about using the Query API with IAM, see Making query\n requests in the IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To upload a signing certificate for an IAM user", + "documentation": "The following command uploads a signing certificate for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----" + }, + "output": { + "Certificate": { + "CertificateId": "ID123456789012345EXAMPLE", + "UserName": "Bob", + "Status": "Active", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "UploadDate": "2015-06-06T21:40:08.121Z" + } + } + } + ] } }, "com.amazonaws.iam#UploadSigningCertificateRequest": { diff --git a/aws/sdk/aws-models/kms.json b/aws/sdk/aws-models/kms.json index c5426034d9b..3a8eb8f9747 100644 --- a/aws/sdk/aws-models/kms.json +++ b/aws/sdk/aws-models/kms.json @@ -188,7 +188,19 @@ } ], "traits": { - "smithy.api#documentation": "

Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\n key is Disabled. To enable the KMS key, use EnableKey.

\n

For more information about scheduling and canceling deletion of a KMS key, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CancelKeyDeletion (key policy)

\n

\n Related operations: ScheduleKeyDeletion\n

" + "smithy.api#documentation": "

Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\n key is Disabled. To enable the KMS key, use EnableKey.

\n

For more information about scheduling and canceling deletion of a KMS key, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CancelKeyDeletion (key policy)

\n

\n Related operations: ScheduleKeyDeletion\n

", + "smithy.api#examples": [ + { + "title": "To cancel deletion of a KMS key", + "documentation": "The following example cancels deletion of the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#CancelKeyDeletionRequest": { @@ -350,7 +362,17 @@ } ], "traits": { - "smithy.api#documentation": "

Connects or reconnects a custom key store to its backing key store. For an CloudHSM key\n store, ConnectCustomKeyStore connects the key store to its associated CloudHSM\n cluster. For an external key store, ConnectCustomKeyStore connects the key store\n to the external key store proxy that communicates with your external key manager.

\n

The custom key store must be connected before you can create KMS keys in the key store or\n use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\n time.

\n

The connection process for a custom key store can take an extended amount of time to\n complete. This operation starts the connection process, but it does not wait for it to\n complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\n object with no properties. However, this response does not indicate that the custom key store\n is connected. To get the connection state of the custom key store, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The ConnectCustomKeyStore operation might fail for various reasons. To find\n the reason, use the DescribeCustomKeyStores operation and see the\n ConnectionErrorCode in the response. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

To fix the failure, use the DisconnectCustomKeyStore operation to\n disconnect the custom key store, correct the error, use the UpdateCustomKeyStore operation if necessary, and then use\n ConnectCustomKeyStore again.

\n

\n CloudHSM key store\n

\n

During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\n is associated with the custom key store, creates the connection infrastructure, connects to\n the cluster, logs into the CloudHSM client as the kmsuser CU, and rotates its\n password.

\n

To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\n HSM. To get the number of active HSMs in a cluster, use the DescribeClusters operation. To add HSMs\n to the cluster, use the CreateHsm operation. Also, the \n kmsuser crypto\n user (CU) must not be logged into the cluster. This prevents KMS from using this\n account to log in.

\n

If you are having trouble connecting or disconnecting a CloudHSM key store, see Troubleshooting an CloudHSM key\n store in the Key Management Service Developer Guide.

\n

\n External key store\n

\n

When you connect an external key store that uses public endpoint connectivity, KMS tests\n its ability to communicate with your external key manager by sending a request via the\n external key store proxy.

\n

When you connect to an external key store that uses VPC endpoint service connectivity,\n KMS establishes the networking elements that it needs to communicate with your external key\n manager via the external key store proxy. This includes creating an interface endpoint to the\n VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\n service.

\n

To connect an external key store, KMS must be able to connect to the external key store\n proxy, the external key store proxy must be able to communicate with your external key\n manager, and the external key manager must be available for cryptographic operations.

\n

If you are having trouble connecting or disconnecting an external key store, see Troubleshooting an external\n key store in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:ConnectCustomKeyStore (IAM policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Connects or reconnects a custom key store to its backing key store. For an CloudHSM key\n store, ConnectCustomKeyStore connects the key store to its associated CloudHSM\n cluster. For an external key store, ConnectCustomKeyStore connects the key store\n to the external key store proxy that communicates with your external key manager.

\n

The custom key store must be connected before you can create KMS keys in the key store or\n use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\n time.

\n

The connection process for a custom key store can take an extended amount of time to\n complete. This operation starts the connection process, but it does not wait for it to\n complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\n object with no properties. However, this response does not indicate that the custom key store\n is connected. To get the connection state of the custom key store, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The ConnectCustomKeyStore operation might fail for various reasons. To find\n the reason, use the DescribeCustomKeyStores operation and see the\n ConnectionErrorCode in the response. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

To fix the failure, use the DisconnectCustomKeyStore operation to\n disconnect the custom key store, correct the error, use the UpdateCustomKeyStore operation if necessary, and then use\n ConnectCustomKeyStore again.

\n

\n CloudHSM key store\n

\n

During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\n is associated with the custom key store, creates the connection infrastructure, connects to\n the cluster, logs into the CloudHSM client as the kmsuser CU, and rotates its\n password.

\n

To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\n HSM. To get the number of active HSMs in a cluster, use the DescribeClusters operation. To add HSMs\n to the cluster, use the CreateHsm operation. Also, the \n kmsuser crypto\n user (CU) must not be logged into the cluster. This prevents KMS from using this\n account to log in.

\n

If you are having trouble connecting or disconnecting a CloudHSM key store, see Troubleshooting an CloudHSM key\n store in the Key Management Service Developer Guide.

\n

\n External key store\n

\n

When you connect an external key store that uses public endpoint connectivity, KMS tests\n its ability to communicate with your external key manager by sending a request via the\n external key store proxy.

\n

When you connect to an external key store that uses VPC endpoint service connectivity,\n KMS establishes the networking elements that it needs to communicate with your external key\n manager via the external key store proxy. This includes creating an interface endpoint to the\n VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\n service.

\n

To connect an external key store, KMS must be able to connect to the external key store\n proxy, the external key store proxy must be able to communicate with your external key\n manager, and the external key manager must be available for cryptographic operations.

\n

If you are having trouble connecting or disconnecting an external key store, see Troubleshooting an external\n key store in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:ConnectCustomKeyStore (IAM policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To connect a custom key store", + "documentation": "This example connects an AWS KMS custom key store to its backing key store. For an AWS CloudHSM key store, it connects the key store to its AWS CloudHSM cluster. For an external key store, it connects the key store to the external key store proxy that communicates with your external key manager. This operation does not return any data. To verify that the custom key store is connected, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#ConnectCustomKeyStoreRequest": { @@ -555,7 +577,17 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a friendly name for a KMS key.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

You can use an alias to identify a KMS key in the KMS console, in the DescribeKey operation and in cryptographic operations, such as Encrypt and\n GenerateDataKey. You can also change the KMS key that's associated with\n the alias (UpdateAlias) or delete the alias (DeleteAlias)\n at any time. These operations don't affect the underlying KMS key.

\n

You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\n alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\n A valid KMS key is required. You can't create an alias without a KMS key.

\n

The alias must be unique in the account and Region, but you can have aliases with the same\n name in different Regions. For detailed information about aliases, see Using aliases in the\n Key Management Service Developer Guide.

\n

This operation does not return a response. To get the alias that you created, use the\n ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a friendly name for a KMS key.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

You can use an alias to identify a KMS key in the KMS console, in the DescribeKey operation and in cryptographic operations, such as Encrypt and\n GenerateDataKey. You can also change the KMS key that's associated with\n the alias (UpdateAlias) or delete the alias (DeleteAlias)\n at any time. These operations don't affect the underlying KMS key.

\n

You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\n alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\n A valid KMS key is required. You can't create an alias without a KMS key.

\n

The alias must be unique in the account and Region, but you can have aliases with the same\n name in different Regions. For detailed information about aliases, see Using aliases in the\n Key Management Service Developer Guide.

\n

This operation does not return a response. To get the alias that you created, use the\n ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create an alias", + "documentation": "The following example creates an alias for the specified KMS key.", + "input": { + "AliasName": "alias/ExampleAlias", + "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#CreateAliasRequest": { @@ -642,7 +674,22 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key\n stores backed by an external key store proxy and external key manager outside of\n Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration with\n the CreateCustomKeyStore operation. However, you can use the values in the file\n to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key\n stores backed by an external key store proxy and external key manager outside of\n Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration with\n the CreateCustomKeyStore operation. However, you can use the values in the file\n to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create an AWS CloudHSM key store", + "documentation": "This example creates a custom key store that is associated with an AWS CloudHSM cluster.", + "input": { + "CustomKeyStoreName": "ExampleKeyStore", + "CloudHsmClusterId": "cluster-234abcdefABC", + "TrustAnchorCertificate": "", + "KeyStorePassword": "kmsPswd" + }, + "output": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + } + } + ] } }, "com.amazonaws.kms#CreateCustomKeyStoreRequest": { @@ -766,7 +813,25 @@ } ], "traits": { - "smithy.api#documentation": "

Adds a grant to a KMS key.

\n

A grant is a policy instrument that allows Amazon Web Services principals to use\n KMS keys in cryptographic operations. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key,\n grants are considered along with key policies and IAM policies. Grants are often used for\n temporary permissions because you can create one, use its permissions, and delete it without\n changing your key policies or IAM policies.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

The CreateGrant operation returns a GrantToken and a\n GrantId.

\n
    \n
  • \n

    When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. Once the grant has achieved eventual consistency, the grantee\n principal can use the permissions in the grant without identifying the grant.

    \n

    However, to use the permissions in the grant immediately, use the\n GrantToken that CreateGrant returns. For details, see Using a\n grant token in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    The CreateGrant operation also returns a GrantId. You can\n use the GrantId and a key identifier to identify the grant in the RetireGrant and RevokeGrant operations. To find the grant\n ID, use the ListGrants or ListRetirableGrants\n operations.

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:CreateGrant (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Adds a grant to a KMS key.

\n

A grant is a policy instrument that allows Amazon Web Services principals to use\n KMS keys in cryptographic operations. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key,\n grants are considered along with key policies and IAM policies. Grants are often used for\n temporary permissions because you can create one, use its permissions, and delete it without\n changing your key policies or IAM policies.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

The CreateGrant operation returns a GrantToken and a\n GrantId.

\n
    \n
  • \n

    When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. Once the grant has achieved eventual consistency, the grantee\n principal can use the permissions in the grant without identifying the grant.

    \n

    However, to use the permissions in the grant immediately, use the\n GrantToken that CreateGrant returns. For details, see Using a\n grant token in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    The CreateGrant operation also returns a GrantId. You can\n use the GrantId and a key identifier to identify the grant in the RetireGrant and RevokeGrant operations. To find the grant\n ID, use the ListGrants or ListRetirableGrants\n operations.

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:CreateGrant (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create a grant", + "documentation": "The following example creates a grant that allows the specified IAM role to encrypt data with the specified KMS key.", + "input": { + "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "GranteePrincipal": "arn:aws:iam::111122223333:role/ExampleRole", + "Operations": [ + "Encrypt", + "Decrypt" + ] + }, + "output": { + "GrantToken": "AQpAM2RhZTk1MGMyNTk2ZmZmMzEyYWVhOWViN2I1MWM4Mzc0MWFiYjc0ZDE1ODkyNGFlNTIzODZhMzgyZjBlNGY3NiKIAgEBAgB4Pa6VDCWW__MSrqnre1HIN0Grt00ViSSuUjhqOC8OT3YAAADfMIHcBgkqhkiG9w0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqLyBTAegIn9XlK5AgEQgIGXZQjkBcl1dykDdqZBUQ6L1OfUivQy7JVYO2-ZJP7m6f1g8GzV47HX5phdtONAP7K_HQIflcgpkoCqd_fUnE114mSmiagWkbQ5sqAVV3ov-VeqgrvMe5ZFEWLMSluvBAqdjHEdMIkHMlhlj4ENZbzBfo9Wxk8b8SnwP4kc4gGivedzFXo-dwN8fxjjq_ZZ9JFOj2ijIbj5FyogDCN0drOfi8RORSEuCEmPvjFRMFAwcmwFkN2NPp89amA", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#CreateGrantRequest": { @@ -1369,7 +1434,22 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To decrypt data with a symmetric encryption KMS key", + "documentation": "The following example decrypts data that was encrypted with a symmetric encryption KMS key. The KeyId is not required when decrypting with a symmetric encryption key, but it is a best practice.", + "input": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "Plaintext": "", + "EncryptionAlgorithm": "SYMMETRIC_DEFAULT" + } + } + ] } }, "com.amazonaws.kms#DecryptRequest": { @@ -1478,7 +1558,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified alias.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Because an alias is not a property of a KMS key, you can delete and change the aliases of\n a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\n DescribeKey operation. To get the aliases of all KMS keys, use the ListAliases operation.

\n

Each KMS key can have multiple aliases. To change the alias of a KMS key, use DeleteAlias to delete the current alias and CreateAlias to\n create a new alias. To associate an existing alias with a different KMS key, call UpdateAlias.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes the specified alias.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Because an alias is not a property of a KMS key, you can delete and change the aliases of\n a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\n DescribeKey operation. To get the aliases of all KMS keys, use the ListAliases operation.

\n

Each KMS key can have multiple aliases. To change the alias of a KMS key, use DeleteAlias to delete the current alias and CreateAlias to\n create a new alias. To associate an existing alias with a different KMS key, call UpdateAlias.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete an alias", + "documentation": "The following example deletes the specified alias.", + "input": { + "AliasName": "alias/ExampleAlias" + } + } + ] } }, "com.amazonaws.kms#DeleteAliasRequest": { @@ -1519,7 +1608,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a custom key store. This operation does not affect any backing elements of the\n custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\n store, or affect any users or keys in the cluster. For an external key store, it does not\n affect the external key store proxy, external key manager, or any external keys.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The custom key store that you delete cannot contain any KMS keys. Before deleting the key store,\n verify that you will never need to use any of the KMS keys in the key store for any\n cryptographic operations. Then, use ScheduleKeyDeletion to delete the KMS keys from the\n key store. After the required waiting period expires and all KMS keys are deleted from the\n custom key store, use DisconnectCustomKeyStore to disconnect the key store\n from KMS. Then, you can delete the custom key store.

\n

For keys in an CloudHSM key store, the ScheduleKeyDeletion operation makes a\n best effort to delete the key material from the associated cluster. However, you might need to\n manually delete the orphaned key\n material from the cluster and its backups. KMS never creates, manages, or deletes\n cryptographic keys in the external key manager associated with an external key store. You must\n manage them using your external key manager tools.

\n

Instead of deleting the custom key store, consider using the DisconnectCustomKeyStore operation to disconnect the custom key store from its\n backing key store. While the key store is disconnected, you cannot create or use the KMS keys\n in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\n custom key store at any time.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes a custom key store. This operation does not affect any backing elements of the\n custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\n store, or affect any users or keys in the cluster. For an external key store, it does not\n affect the external key store proxy, external key manager, or any external keys.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The custom key store that you delete cannot contain any KMS keys. Before deleting the key store,\n verify that you will never need to use any of the KMS keys in the key store for any\n cryptographic operations. Then, use ScheduleKeyDeletion to delete the KMS keys from the\n key store. After the required waiting period expires and all KMS keys are deleted from the\n custom key store, use DisconnectCustomKeyStore to disconnect the key store\n from KMS. Then, you can delete the custom key store.

\n

For keys in an CloudHSM key store, the ScheduleKeyDeletion operation makes a\n best effort to delete the key material from the associated cluster. However, you might need to\n manually delete the orphaned key\n material from the cluster and its backups. KMS never creates, manages, or deletes\n cryptographic keys in the external key manager associated with an external key store. You must\n manage them using your external key manager tools.

\n

Instead of deleting the custom key store, consider using the DisconnectCustomKeyStore operation to disconnect the custom key store from its\n backing key store. While the key store is disconnected, you cannot create or use the KMS keys\n in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\n custom key store at any time.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete a custom key store from AWS KMS", + "documentation": "This example deletes a custom key store from AWS KMS. This operation does not affect the backing key store, such as a CloudHSM cluster, external key store proxy, or your external key manager. This operation doesn't return any data. To verify that the operation was successful, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#DeleteCustomKeyStoreRequest": { @@ -1573,7 +1672,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes key material that was previously imported. This operation makes the specified KMS\n key temporarily unusable. To restore the usability of the KMS key, reimport the same key\n material. For more information about importing key material into KMS, see Importing Key Material\n in the Key Management Service Developer Guide.

\n

When the specified KMS key is in the PendingDeletion state, this operation\n does not change the KMS key's state. Otherwise, it changes the KMS key's state to\n PendingImport.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteImportedKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes key material that was previously imported. This operation makes the specified KMS\n key temporarily unusable. To restore the usability of the KMS key, reimport the same key\n material. For more information about importing key material into KMS, see Importing Key Material\n in the Key Management Service Developer Guide.

\n

When the specified KMS key is in the PendingDeletion state, this operation\n does not change the KMS key's state. Otherwise, it changes the KMS key's state to\n PendingImport.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteImportedKeyMaterial (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete imported key material", + "documentation": "The following example deletes the imported key material from the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DeleteImportedKeyMaterialRequest": { @@ -1629,6 +1737,15 @@ ], "traits": { "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores.\n Both topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To get detailed information about custom key stores in the account and Region", + "documentation": "This example gets detailed information about all AWS KMS custom key stores in an AWS account and Region. To get all key stores, do not enter a custom key store name or ID.", + "output": { + "CustomKeyStores": [] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -1792,7 +1909,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\n key for cryptographic operations.

\n

For more information about how key state affects the use of a KMS key, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKey (key policy)

\n

\n Related operations: EnableKey\n

" + "smithy.api#documentation": "

Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\n key for cryptographic operations.

\n

For more information about how key state affects the use of a KMS key, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKey (key policy)

\n

\n Related operations: EnableKey\n

", + "smithy.api#examples": [ + { + "title": "To disable a KMS key", + "documentation": "The following example disables the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DisableKeyRequest": { @@ -1842,7 +1968,16 @@ } ], "traits": { - "smithy.api#documentation": "

Disables automatic\n rotation of the key material of the specified symmetric encryption KMS key.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You can enable (EnableKeyRotation) and disable automatic rotation of the\n key material in customer managed KMS keys. Key material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material for every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKeyRotation (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Disables automatic\n rotation of the key material of the specified symmetric encryption KMS key.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You can enable (EnableKeyRotation) and disable automatic rotation of the\n key material in customer managed KMS keys. Key material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material for every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKeyRotation (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To disable automatic rotation of key material", + "documentation": "The following example disables automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DisableKeyRotationRequest": { @@ -1897,7 +2032,17 @@ } ], "traits": { - "smithy.api#documentation": "

Disconnects the custom key store from its backing key store. This operation disconnects an\n CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\n the external key store proxy that communicates with your external key manager.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

While a custom key store is disconnected, you can manage the custom key store and its KMS\n keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\n time.

\n \n

While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in cryptographic operations will\n fail. This action can prevent users from storing and accessing sensitive data.

\n
\n

When you disconnect a custom key store, its ConnectionState changes to\n Disconnected. To find the connection state of a custom key store, use the DescribeCustomKeyStores operation. To reconnect a custom key store, use the\n ConnectCustomKeyStore operation.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisconnectCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Disconnects the custom key store from its backing key store. This operation disconnects an\n CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\n the external key store proxy that communicates with your external key manager.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

While a custom key store is disconnected, you can manage the custom key store and its KMS\n keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\n time.

\n \n

While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in cryptographic operations will\n fail. This action can prevent users from storing and accessing sensitive data.

\n
\n

When you disconnect a custom key store, its ConnectionState changes to\n Disconnected. To find the connection state of a custom key store, use the DescribeCustomKeyStores operation. To reconnect a custom key store, use the\n ConnectCustomKeyStore operation.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisconnectCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To disconnect a custom key store from its CloudHSM cluster", + "documentation": "This example disconnects an AWS KMS custom key store from its backing key store. For an AWS CloudHSM key store, it disconnects the key store from its AWS CloudHSM cluster. For an external key store, it disconnects the key store from the external key store proxy that communicates with your external key manager. This operation doesn't return any data. To verify that the custom key store is disconnected, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#DisconnectCustomKeyStoreRequest": { @@ -1968,7 +2113,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\n cryptographic operations.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKey (key policy)

\n

\n Related operations: DisableKey\n

" + "smithy.api#documentation": "

Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\n cryptographic operations.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKey (key policy)

\n

\n Related operations: DisableKey\n

", + "smithy.api#examples": [ + { + "title": "To enable a KMS key", + "documentation": "The following example enables the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#EnableKeyRequest": { @@ -2018,7 +2172,16 @@ } ], "traits": { - "smithy.api#documentation": "

Enables automatic rotation\n of the key material of the specified symmetric encryption KMS key.

\n

When you enable automatic rotation of acustomer managed KMS key, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer\n managed KMS key, use the DisableKeyRotation operation.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You cannot enable or disable automatic rotation Amazon Web Services managed KMS keys. KMS\n always rotates the key material of Amazon Web Services managed keys every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years (approximately 1,095 days) to every year (approximately 365 days).

\n

New Amazon Web Services managed keys are automatically rotated one year after they are created, and\n approximately every year thereafter.

\n

Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\n rotation, and every year thereafter.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKeyRotation (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Enables automatic rotation\n of the key material of the specified symmetric encryption KMS key.

\n

When you enable automatic rotation of acustomer managed KMS key, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer\n managed KMS key, use the DisableKeyRotation operation.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You cannot enable or disable automatic rotation Amazon Web Services managed KMS keys. KMS\n always rotates the key material of Amazon Web Services managed keys every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years (approximately 1,095 days) to every year (approximately 365 days).

\n

New Amazon Web Services managed keys are automatically rotated one year after they are created, and\n approximately every year thereafter.

\n

Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\n rotation, and every year thereafter.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKeyRotation (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To enable automatic rotation of key material", + "documentation": "The following example enables automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#EnableKeyRotationRequest": { @@ -2074,7 +2237,22 @@ } ], "traits": { - "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To encrypt data with a symmetric encryption KMS key", + "documentation": "The following example encrypts data with the specified symmetric encryption KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Plaintext": "" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "EncryptionAlgorithm": "SYMMETRIC_DEFAULT" + } + } + ] } }, "com.amazonaws.kms#EncryptRequest": { @@ -2274,7 +2452,22 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related to the\n caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS and\n store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec\n value of AES_128 or a NumberOfBytes value of 16. The\n symmetric encryption key used in China Regions to encrypt your data key is an SM4 encryption\n key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related to the\n caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS and\n store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec\n value of AES_128 or a NumberOfBytes value of 16. The\n symmetric encryption key used in China Regions to encrypt your data key is an SM4 encryption\n key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate a data key", + "documentation": "The following example generates a 256-bit symmetric data encryption key (data key) in two formats. One is the unencrypted (plainext) data key, and the other is the data key encrypted with the specified KMS key.", + "input": { + "KeyId": "alias/ExampleAlias", + "KeySpec": "AES_256" + }, + "output": { + "CiphertextBlob": "", + "Plaintext": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPair": { @@ -2318,7 +2511,24 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services\n Nitro enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient\n parameter to provide the attestation document for the enclave.\n GenerateDataKeyPair returns the public data key and a copy of the private data\n key encrypted under the specified KMS key, as usual. But instead of a plaintext copy of the\n private data key (PrivateKeyPlaintext), the response includes a copy of the\n private data key encrypted under the public key from the attestation document\n (CiphertextForRecipient). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services\n Nitro enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient\n parameter to provide the attestation document for the enclave.\n GenerateDataKeyPair returns the public data key and a copy of the private data\n key encrypted under the specified KMS key, as usual. But instead of a plaintext copy of the\n private data key (PrivateKeyPlaintext), the response includes a copy of the\n private data key encrypted under the public key from the attestation document\n (CiphertextForRecipient). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an RSA key pair for encryption and decryption", + "documentation": "This example generates an RSA data key pair for encryption and decryption. The operation returns a plaintext public key and private key, and a copy of the private key that is encrypted under a symmetric encryption KMS key that you specify.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "RSA_3072" + }, + "output": { + "PrivateKeyCiphertextBlob": "", + "PrivateKeyPlaintext": "", + "PublicKey": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "RSA_3072" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPairRequest": { @@ -2452,7 +2662,23 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an asymmetric data key pair without a plaintext key", + "documentation": "This example returns an asymmetric elliptic curve (ECC) data key pair. The private key is encrypted under the symmetric encryption KMS key that you specify. This operation doesn't return a plaintext (unencrypted) private key.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "ECC_NIST_P521" + }, + "output": { + "PrivateKeyCiphertextBlob": "", + "PublicKey": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "ECC_NIST_P521" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextRequest": { @@ -2648,7 +2874,21 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to\n generate a data key. To get the type of your KMS key, use the DescribeKey\n operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to\n generate a data key. To get the type of your KMS key, use the DescribeKey\n operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an encrypted data key", + "documentation": "The following example generates an encrypted copy of a 256-bit symmetric data encryption key (data key). The data key is encrypted with the specified KMS key.", + "input": { + "KeyId": "alias/ExampleAlias", + "KeySpec": "AES_256" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyWithoutPlaintextRequest": { @@ -2751,7 +2991,23 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS\n key and a MAC algorithm that the key supports. HMAC KMS keys and the HMAC algorithms that\n KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

" + "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS\n key and a MAC algorithm that the key supports. HMAC KMS keys and the HMAC algorithms that\n KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

", + "smithy.api#examples": [ + { + "title": "To generate an HMAC for a message", + "documentation": "This example generates an HMAC for a message, an HMAC KMS key, and a MAC algorithm. The algorithm must be supported by the specified HMAC KMS key.", + "input": { + "Message": "Hello World", + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "MacAlgorithm": "HMAC_SHA_384" + }, + "output": { + "Mac": "", + "MacAlgorithm": "HMAC_SHA_384", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateMacRequest": { @@ -2847,7 +3103,19 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

" + "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

", + "smithy.api#examples": [ + { + "title": "To generate random data", + "documentation": "The following example generates 32 bytes of random data.", + "input": { + "NumberOfBytes": 32 + }, + "output": { + "Plaintext": "" + } + } + ] } }, "com.amazonaws.kms#GenerateRandomRequest": { @@ -2922,7 +3190,20 @@ } ], "traits": { - "smithy.api#documentation": "

Gets a key policy attached to the specified KMS key.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetKeyPolicy (key policy)

\n

\n Related operations: PutKeyPolicy\n

" + "smithy.api#documentation": "

Gets a key policy attached to the specified KMS key.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetKeyPolicy (key policy)

\n

\n Related operations: PutKeyPolicy\n

", + "smithy.api#examples": [ + { + "title": "To retrieve a key policy", + "documentation": "The following example retrieves the key policy for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "PolicyName": "default" + }, + "output": { + "Policy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",\n \"Statement\" : [ {\n \"Sid\" : \"Enable IAM User Permissions\",\n \"Effect\" : \"Allow\",\n \"Principal\" : {\n \"AWS\" : \"arn:aws:iam::111122223333:root\"\n },\n \"Action\" : \"kms:*\",\n \"Resource\" : \"*\"\n } ]\n}" + } + } + ] } }, "com.amazonaws.kms#GetKeyPolicyRequest": { @@ -2990,7 +3271,19 @@ } ], "traits": { - "smithy.api#documentation": "

Gets a Boolean value that indicates whether automatic rotation of the key material is\n enabled for the specified KMS key.

\n

When you enable automatic rotation for customer managed KMS keys, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key..

\n

You can enable (EnableKeyRotation) and disable automatic rotation (DisableKeyRotation) of the key material in customer managed KMS keys. Key\n material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\n key rotation status for Amazon Web Services managed KMS keys is always true.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n
    \n
  • \n

    Disabled: The key rotation status does not change when you disable a KMS key. However,\n while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\n the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\n rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\n less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\n resumes its prior rotation schedule.

    \n
  • \n
  • \n

    Pending deletion: While a KMS key is pending deletion, its key rotation status is\n false and KMS does not rotate the key material. If you cancel the\n deletion, the original key rotation status returns to true.

    \n
  • \n
\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetKeyRotationStatus (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Gets a Boolean value that indicates whether automatic rotation of the key material is\n enabled for the specified KMS key.

\n

When you enable automatic rotation for customer managed KMS keys, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key..

\n

You can enable (EnableKeyRotation) and disable automatic rotation (DisableKeyRotation) of the key material in customer managed KMS keys. Key\n material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\n key rotation status for Amazon Web Services managed KMS keys is always true.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n
    \n
  • \n

    Disabled: The key rotation status does not change when you disable a KMS key. However,\n while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\n the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\n rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\n less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\n resumes its prior rotation schedule.

    \n
  • \n
  • \n

    Pending deletion: While a KMS key is pending deletion, its key rotation status is\n false and KMS does not rotate the key material. If you cancel the\n deletion, the original key rotation status returns to true.

    \n
  • \n
\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetKeyRotationStatus (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To retrieve the rotation status for a KMS key", + "documentation": "The following example retrieves the status of automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyRotationEnabled": true + } + } + ] } }, "com.amazonaws.kms#GetKeyRotationStatusRequest": { @@ -3157,7 +3450,26 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

" + "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

", + "smithy.api#examples": [ + { + "title": "To download the public key of an asymmetric KMS key", + "documentation": "This example gets the public key of an asymmetric RSA KMS key used for encryption and decryption. The operation returns the key spec, key usage, and encryption or signing algorithms to help you use the public key correctly outside of AWS KMS.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", + "PublicKey": "", + "CustomerMasterKeySpec": "RSA_4096", + "KeyUsage": "ENCRYPT_DECRYPT", + "EncryptionAlgorithms": [ + "RSAES_OAEP_SHA_1", + "RSAES_OAEP_SHA_256" + ] + } + } + ] } }, "com.amazonaws.kms#GetPublicKeyRequest": { @@ -3510,7 +3822,19 @@ } ], "traits": { - "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To import key material into a KMS key", + "documentation": "The following example imports key material into the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "ImportToken": "", + "EncryptedKeyMaterial": "", + "ExpirationModel": "KEY_MATERIAL_DOES_NOT_EXPIRE" + } + } + ] } }, "com.amazonaws.kms#ImportKeyMaterialRequest": { @@ -4275,6 +4599,57 @@ ], "traits": { "smithy.api#documentation": "

Gets a list of aliases in the caller's Amazon Web Services account and region. For more information\n about aliases, see CreateAlias.

\n

By default, the ListAliases operation returns all aliases in the account and\n region. To get only the aliases associated with a particular KMS key, use the\n KeyId parameter.

\n

The ListAliases response can include aliases that you created and associated\n with your customer managed keys, and aliases that Amazon Web Services created and associated with Amazon Web Services\n managed keys in your account. You can recognize Amazon Web Services aliases because their names have the\n format aws/, such as aws/dynamodb.

\n

The response might also include aliases that have no TargetKeyId field. These\n are predefined aliases that Amazon Web Services has created but has not yet associated with a KMS key.\n Aliases that Amazon Web Services creates in your account, including predefined aliases, do not count against\n your KMS aliases\n quota.

\n

\n Cross-account use: No. ListAliases does not\n return aliases in other Amazon Web Services accounts.

\n

\n Required permissions: kms:ListAliases (IAM policy)

\n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list aliases", + "documentation": "The following example lists aliases.", + "output": { + "Aliases": [ + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/acm", + "AliasName": "alias/aws/acm", + "TargetKeyId": "da03f6f7-d279-427a-9cae-de48d07e5b66" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/ebs", + "AliasName": "alias/aws/ebs", + "TargetKeyId": "25a217e7-7170-4b8c-8bf6-045ea5f70e5b" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/rds", + "AliasName": "alias/aws/rds", + "TargetKeyId": "7ec3104e-c3f2-4b5c-bf42-bfc4772c6685" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/redshift", + "AliasName": "alias/aws/redshift", + "TargetKeyId": "08f7a25a-69e2-4fb5-8f10-393db27326fa" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/s3", + "AliasName": "alias/aws/s3", + "TargetKeyId": "d2b0f1a3-580d-4f79-b836-bc983be8cfa5" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example1", + "AliasName": "alias/example1", + "TargetKeyId": "4da1e216-62d0-46c5-a7c0-5f3a3d2f8046" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example2", + "AliasName": "alias/example2", + "TargetKeyId": "f32fef59-2cc2-445b-8573-2d73328acbee" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example3", + "AliasName": "alias/example3", + "TargetKeyId": "1374ef38-d34e-4d5f-b2c9-4e0daee38855" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4467,6 +4842,21 @@ ], "traits": { "smithy.api#documentation": "

Gets the names of the key policies that are attached to a KMS key. This operation is\n designed to get policy names that you can use in a GetKeyPolicy operation.\n However, the only valid policy name is default.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListKeyPolicies (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list key policies for a KMS key", + "documentation": "The following example lists key policies for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "PolicyNames": [ + "default" + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4550,6 +4940,45 @@ ], "traits": { "smithy.api#documentation": "

Gets a list of all KMS keys in the caller's Amazon Web Services account and Region.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListKeys (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list KMS keys", + "documentation": "The following example lists KMS keys.", + "output": { + "Keys": [ + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/0d990263-018e-4e65-a703-eff731de951e", + "KeyId": "0d990263-018e-4e65-a703-eff731de951e" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/144be297-0ae1-44ac-9c8f-93cd8c82f841", + "KeyId": "144be297-0ae1-44ac-9c8f-93cd8c82f841" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/21184251-b765-428e-b852-2c7353e72571", + "KeyId": "21184251-b765-428e-b852-2c7353e72571" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/214fe92f-5b03-4ae1-b350-db2a45dbe10c", + "KeyId": "214fe92f-5b03-4ae1-b350-db2a45dbe10c" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/339963f2-e523-49d3-af24-a0fe752aa458", + "KeyId": "339963f2-e523-49d3-af24-a0fe752aa458" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/b776a44b-df37-4438-9be4-a27494e4271a", + "KeyId": "b776a44b-df37-4438-9be4-a27494e4271a" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb", + "KeyId": "deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4629,6 +5058,32 @@ ], "traits": { "smithy.api#documentation": "

Returns all tags on the specified KMS key.

\n

For general information about tags, including the format and syntax, see Tagging Amazon Web Services resources in\n the Amazon Web Services General Reference. For information about using\n tags in KMS, see Tagging\n keys.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListResourceTags (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list tags for a KMS key", + "documentation": "The following example lists tags for a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "Tags": [ + { + "TagKey": "CostCenter", + "TagValue": "87654" + }, + { + "TagKey": "CreatedBy", + "TagValue": "ExampleUser" + }, + { + "TagKey": "Purpose", + "TagValue": "Test" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -5058,7 +5513,18 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches a key policy to the specified KMS key.

\n

For more information about key policies, see Key Policies in the Key Management Service Developer Guide.\n For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the \n Identity and Access Management User Guide\n . For examples of adding a key policy in multiple programming languages,\n see Setting a key policy in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:PutKeyPolicy (key policy)

\n

\n Related operations: GetKeyPolicy\n

" + "smithy.api#documentation": "

Attaches a key policy to the specified KMS key.

\n

For more information about key policies, see Key Policies in the Key Management Service Developer Guide.\n For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the \n Identity and Access Management User Guide\n . For examples of adding a key policy in multiple programming languages,\n see Setting a key policy in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:PutKeyPolicy (key policy)

\n

\n Related operations: GetKeyPolicy\n

", + "smithy.api#examples": [ + { + "title": "To attach a key policy to a KMS key", + "documentation": "The following example attaches a key policy to the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "PolicyName": "default", + "Policy": "{\n \"Version\": \"2012-10-17\",\n \"Id\": \"custom-policy-2016-12-07\",\n \"Statement\": [\n {\n \"Sid\": \"Enable IAM User Permissions\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n },\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow access for Key Administrators\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": [\n \"arn:aws:iam::111122223333:user/ExampleAdminUser\",\n \"arn:aws:iam::111122223333:role/ExampleAdminRole\"\n ]\n },\n \"Action\": [\n \"kms:Create*\",\n \"kms:Describe*\",\n \"kms:Enable*\",\n \"kms:List*\",\n \"kms:Put*\",\n \"kms:Update*\",\n \"kms:Revoke*\",\n \"kms:Disable*\",\n \"kms:Get*\",\n \"kms:Delete*\",\n \"kms:ScheduleKeyDeletion\",\n \"kms:CancelKeyDeletion\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow use of the key\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:Encrypt\",\n \"kms:Decrypt\",\n \"kms:ReEncrypt*\",\n \"kms:GenerateDataKey*\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow attachment of persistent resources\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:CreateGrant\",\n \"kms:ListGrants\",\n \"kms:RevokeGrant\"\n ],\n \"Resource\": \"*\",\n \"Condition\": {\n \"Bool\": {\n \"kms:GrantIsForAWSResource\": \"true\"\n }\n }\n }\n ]\n}\n" + } + } + ] } }, "com.amazonaws.kms#PutKeyPolicyRequest": { @@ -5141,7 +5607,22 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\n operation to change the KMS key under which data is encrypted, such as when you manually\n rotate a KMS key or change the KMS key that protects a ciphertext. You can also use\n it to reencrypt ciphertext under the same KMS key, such as to change the encryption\n context of a ciphertext.

\n

The ReEncrypt operation can decrypt ciphertext that was encrypted by using a\n KMS key in an KMS operation, such as Encrypt or GenerateDataKey. It can also decrypt ciphertext that was encrypted by using the\n public key of an asymmetric KMS key\n outside of KMS. However, it cannot decrypt ciphertext produced by other libraries, such as\n the Amazon Web Services Encryption SDK or\n Amazon S3\n client-side encryption. These libraries return a ciphertext format that is\n incompatible with KMS.

\n

When you use the ReEncrypt operation, you need to provide information for the\n decrypt operation and the subsequent encrypt operation.

\n
    \n
  • \n

    If your ciphertext was encrypted under an asymmetric KMS key, you must use the\n SourceKeyId parameter to identify the KMS key that encrypted the\n ciphertext. You must also supply the encryption algorithm that was used. This information\n is required to decrypt the data.

    \n
  • \n
  • \n

    If your ciphertext was encrypted under a symmetric encryption KMS key, the\n SourceKeyId parameter is optional. KMS can get this information from\n metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\n your implementation by ensuring that authorized users can decrypt ciphertext decades after\n it was encrypted, even if they've lost track of the key ID. However, specifying the source\n KMS key is always recommended as a best practice. When you use the\n SourceKeyId parameter to specify a KMS key, KMS uses only the KMS key you\n specify. If the ciphertext was encrypted under a different KMS key, the\n ReEncrypt operation fails. This practice ensures that you use the KMS key\n that you intend.

    \n
  • \n
  • \n

    To reencrypt the data, you must use the DestinationKeyId parameter to\n specify the KMS key that re-encrypts the data after it is decrypted. If the destination\n KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\n algorithm that you choose must be compatible with the KMS key.

    \n \n

    When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

    \n

    You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

    \n
    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. The source KMS key and\n destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\n different account than the caller. To specify a KMS key in a different account, you must use\n its key ARN or alias ARN.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReEncryptFrom\n permission on the source KMS key (key policy)

    \n
  • \n
  • \n

    \n kms:ReEncryptTo\n permission on the destination KMS key (key policy)

    \n
  • \n
\n

To permit reencryption from or to a KMS key, include the \"kms:ReEncrypt*\"\n permission in your key policy. This permission is\n automatically included in the key policy when you use the console to create a KMS key. But you\n must include it manually when you create a KMS key programmatically or when you use the PutKeyPolicy operation to set a key policy.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\n operation to change the KMS key under which data is encrypted, such as when you manually\n rotate a KMS key or change the KMS key that protects a ciphertext. You can also use\n it to reencrypt ciphertext under the same KMS key, such as to change the encryption\n context of a ciphertext.

\n

The ReEncrypt operation can decrypt ciphertext that was encrypted by using a\n KMS key in an KMS operation, such as Encrypt or GenerateDataKey. It can also decrypt ciphertext that was encrypted by using the\n public key of an asymmetric KMS key\n outside of KMS. However, it cannot decrypt ciphertext produced by other libraries, such as\n the Amazon Web Services Encryption SDK or\n Amazon S3\n client-side encryption. These libraries return a ciphertext format that is\n incompatible with KMS.

\n

When you use the ReEncrypt operation, you need to provide information for the\n decrypt operation and the subsequent encrypt operation.

\n
    \n
  • \n

    If your ciphertext was encrypted under an asymmetric KMS key, you must use the\n SourceKeyId parameter to identify the KMS key that encrypted the\n ciphertext. You must also supply the encryption algorithm that was used. This information\n is required to decrypt the data.

    \n
  • \n
  • \n

    If your ciphertext was encrypted under a symmetric encryption KMS key, the\n SourceKeyId parameter is optional. KMS can get this information from\n metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\n your implementation by ensuring that authorized users can decrypt ciphertext decades after\n it was encrypted, even if they've lost track of the key ID. However, specifying the source\n KMS key is always recommended as a best practice. When you use the\n SourceKeyId parameter to specify a KMS key, KMS uses only the KMS key you\n specify. If the ciphertext was encrypted under a different KMS key, the\n ReEncrypt operation fails. This practice ensures that you use the KMS key\n that you intend.

    \n
  • \n
  • \n

    To reencrypt the data, you must use the DestinationKeyId parameter to\n specify the KMS key that re-encrypts the data after it is decrypted. If the destination\n KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\n algorithm that you choose must be compatible with the KMS key.

    \n \n

    When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

    \n

    You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

    \n
    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. The source KMS key and\n destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\n different account than the caller. To specify a KMS key in a different account, you must use\n its key ARN or alias ARN.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReEncryptFrom\n permission on the source KMS key (key policy)

    \n
  • \n
  • \n

    \n kms:ReEncryptTo\n permission on the destination KMS key (key policy)

    \n
  • \n
\n

To permit reencryption from or to a KMS key, include the \"kms:ReEncrypt*\"\n permission in your key policy. This permission is\n automatically included in the key policy when you use the console to create a KMS key. But you\n must include it manually when you create a KMS key programmatically or when you use the PutKeyPolicy operation to set a key policy.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To reencrypt data", + "documentation": "The following example reencrypts data with the specified KMS key.", + "input": { + "CiphertextBlob": "", + "DestinationKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", + "SourceKeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#ReEncryptRequest": { @@ -5317,7 +5798,51 @@ } ], "traits": { - "smithy.api#documentation": "

Replicates a multi-Region key into the specified Region. This operation creates a\n multi-Region replica key based on a multi-Region primary key in a different Region of the same\n Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\n different Region. To create a multi-Region primary key, use the CreateKey\n operation.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

A replica key is a fully-functional KMS key that can be used\n independently of its primary and peer replica keys. A primary key and its replica keys share\n properties that make them interoperable. They have the same key ID and key material. They also\n have the same key\n spec, key\n usage, key\n material origin, and automatic key rotation status. KMS automatically synchronizes these shared\n properties among related multi-Region keys. All other properties of a replica key can differ,\n including its key\n policy, tags, aliases, and Key states of KMS keys. KMS pricing and quotas for KMS keys apply to each\n primary key and replica key.

\n

When this operation completes, the new replica key has a transient key state of\n Creating. This key state changes to Enabled (or\n PendingImport) after a few seconds when the process of creating the new replica\n key is complete. While the key state is Creating, you can manage key, but you\n cannot yet use it in cryptographic operations. If you are creating and using the replica key\n programmatically, retry on KMSInvalidStateException or call\n DescribeKey to check its KeyState value before using it. For\n details about the Creating key state, see Key states of KMS keys in the\n Key Management Service Developer Guide.

\n

You cannot create more than one replica of a primary key in any Region. If the Region\n already includes a replica of the key you're trying to replicate, ReplicateKey\n returns an AlreadyExistsException error. If the key state of the existing replica\n is PendingDeletion, you can cancel the scheduled key deletion (CancelKeyDeletion) or wait for the key to be deleted. The new replica key you\n create will have the same shared\n properties as the original replica key.

\n

The CloudTrail log of a ReplicateKey operation records a\n ReplicateKey operation in the primary key's Region and a CreateKey operation in the replica key's Region.

\n

If you replicate a multi-Region primary key with imported key material, the replica key is\n created with no key material. You must import the same key material that you imported into the\n primary key. For details, see Importing key material into multi-Region keys in the Key Management Service Developer Guide.

\n

To convert a replica key to a primary key, use the UpdatePrimaryRegion\n operation.

\n \n

\n ReplicateKey uses different default values for the KeyPolicy\n and Tags parameters than those used in the KMS console. For details, see the\n parameter descriptions.

\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a replica key in a different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReplicateKey on the primary key (in the primary key's Region).\n Include this permission in the primary key's key policy.

    \n
  • \n
  • \n

    \n kms:CreateKey in an IAM policy in the replica Region.

    \n
  • \n
  • \n

    To use the Tags parameter, kms:TagResource in an IAM policy\n in the replica Region.

    \n
  • \n
\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Replicates a multi-Region key into the specified Region. This operation creates a\n multi-Region replica key based on a multi-Region primary key in a different Region of the same\n Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\n different Region. To create a multi-Region primary key, use the CreateKey\n operation.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

A replica key is a fully-functional KMS key that can be used\n independently of its primary and peer replica keys. A primary key and its replica keys share\n properties that make them interoperable. They have the same key ID and key material. They also\n have the same key\n spec, key\n usage, key\n material origin, and automatic key rotation status. KMS automatically synchronizes these shared\n properties among related multi-Region keys. All other properties of a replica key can differ,\n including its key\n policy, tags, aliases, and Key states of KMS keys. KMS pricing and quotas for KMS keys apply to each\n primary key and replica key.

\n

When this operation completes, the new replica key has a transient key state of\n Creating. This key state changes to Enabled (or\n PendingImport) after a few seconds when the process of creating the new replica\n key is complete. While the key state is Creating, you can manage key, but you\n cannot yet use it in cryptographic operations. If you are creating and using the replica key\n programmatically, retry on KMSInvalidStateException or call\n DescribeKey to check its KeyState value before using it. For\n details about the Creating key state, see Key states of KMS keys in the\n Key Management Service Developer Guide.

\n

You cannot create more than one replica of a primary key in any Region. If the Region\n already includes a replica of the key you're trying to replicate, ReplicateKey\n returns an AlreadyExistsException error. If the key state of the existing replica\n is PendingDeletion, you can cancel the scheduled key deletion (CancelKeyDeletion) or wait for the key to be deleted. The new replica key you\n create will have the same shared\n properties as the original replica key.

\n

The CloudTrail log of a ReplicateKey operation records a\n ReplicateKey operation in the primary key's Region and a CreateKey operation in the replica key's Region.

\n

If you replicate a multi-Region primary key with imported key material, the replica key is\n created with no key material. You must import the same key material that you imported into the\n primary key. For details, see Importing key material into multi-Region keys in the Key Management Service Developer Guide.

\n

To convert a replica key to a primary key, use the UpdatePrimaryRegion\n operation.

\n \n

\n ReplicateKey uses different default values for the KeyPolicy\n and Tags parameters than those used in the KMS console. For details, see the\n parameter descriptions.

\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a replica key in a different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReplicateKey on the primary key (in the primary key's Region).\n Include this permission in the primary key's key policy.

    \n
  • \n
  • \n

    \n kms:CreateKey in an IAM policy in the replica Region.

    \n
  • \n
  • \n

    To use the Tags parameter, kms:TagResource in an IAM policy\n in the replica Region.

    \n
  • \n
\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To replicate a multi-Region key in a different AWS Region", + "documentation": "This example creates a multi-Region replica key in us-west-2 of a multi-Region primary key in us-east-1.", + "input": { + "KeyId": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "ReplicaRegion": "us-west-2" + }, + "output": { + "ReplicaKeyMetadata": { + "MultiRegion": true, + "MultiRegionConfiguration": { + "MultiRegionKeyType": "REPLICA", + "PrimaryKey": { + "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "Region": "us-east-1" + }, + "ReplicaKeys": [ + { + "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "Region": "us-west-2" + } + ] + }, + "AWSAccountId": "111122223333", + "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "CreationDate": 1.607472987918E9, + "Description": "", + "Enabled": true, + "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab", + "KeyManager": "CUSTOMER", + "KeyState": "Enabled", + "KeyUsage": "ENCRYPT_DECRYPT", + "Origin": "AWS_KMS", + "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", + "EncryptionAlgorithms": [ + "SYMMETRIC_DEFAULT" + ] + }, + "ReplicaPolicy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",...}", + "ReplicaTags": [] + } + } + ] } }, "com.amazonaws.kms#ReplicateKeyRequest": { @@ -5428,7 +5953,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\n identify the grant to retire, use a grant token, or both the grant ID and a\n key identifier (key ID or key ARN) of the KMS key. The CreateGrant operation\n returns both values.

\n

This operation can be called by the retiring principal for a grant,\n by the grantee principal if the grant allows the RetireGrant\n operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\n principals to whom permission for retiring a grant is delegated. For details, see Retiring and revoking\n grants in the Key Management Service Developer Guide.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. You can retire a grant on a KMS\n key in a different Amazon Web Services account.

\n

\n Required permissions::Permission to retire a grant is\n determined primarily by the grant. For details, see Retiring and revoking grants in\n the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\n identify the grant to retire, use a grant token, or both the grant ID and a\n key identifier (key ID or key ARN) of the KMS key. The CreateGrant operation\n returns both values.

\n

This operation can be called by the retiring principal for a grant,\n by the grantee principal if the grant allows the RetireGrant\n operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\n principals to whom permission for retiring a grant is delegated. For details, see Retiring and revoking\n grants in the Key Management Service Developer Guide.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. You can retire a grant on a KMS\n key in a different Amazon Web Services account.

\n

\n Required permissions::Permission to retire a grant is\n determined primarily by the grant. For details, see Retiring and revoking grants in\n the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To retire a grant", + "documentation": "The following example retires a grant.", + "input": { + "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#RetireGrantRequest": { @@ -5495,7 +6030,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified grant. You revoke a grant to terminate the permissions that the\n grant allows. For more information, see Retiring and revoking grants in\n the \n Key Management Service Developer Guide\n .

\n

When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. For details, see Eventual consistency in\n the \n Key Management Service Developer Guide\n .

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:RevokeGrant (key policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes the specified grant. You revoke a grant to terminate the permissions that the\n grant allows. For more information, see Retiring and revoking grants in\n the \n Key Management Service Developer Guide\n .

\n

When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. For details, see Eventual consistency in\n the \n Key Management Service Developer Guide\n .

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:RevokeGrant (key policy).

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To revoke a grant", + "documentation": "The following example revokes a grant.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#RevokeGrantRequest": { @@ -5646,7 +6191,24 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a digital\n signature for a message or message digest by using the private key in an asymmetric\n signing KMS key. To verify the signature, use the Verify operation, or use\n the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

Digital signatures are generated and verified by using asymmetric key pair, such as an RSA\n or ECC pair that is represented by an asymmetric KMS key. The key owner (or an authorized\n user) uses their private key to sign a message. Anyone with the public key can verify that the\n message was signed with that particular private key and that the message hasn't changed since\n it was signed.

\n

To use the Sign operation, provide the following information:

\n
    \n
  • \n

    Use the KeyId parameter to identify an asymmetric KMS key with a\n KeyUsage value of SIGN_VERIFY. To get the\n KeyUsage value of a KMS key, use the DescribeKey\n operation. The caller must have kms:Sign permission on the KMS key.

    \n
  • \n
  • \n

    Use the Message parameter to specify the message or message digest to\n sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\n hash digest of the message, and then provide the hash digest in the Message\n parameter. To indicate whether the message is a full message or a digest, use the\n MessageType parameter.

    \n
  • \n
  • \n

    Choose a signing algorithm that is compatible with the KMS key.

    \n
  • \n
\n \n

When signing a message, be sure to record the KMS key and the signing algorithm. This\n information is required to verify the signature.

\n
\n \n

Best practices recommend that you limit the time during which any signature is\n effective. This deters an attack where the actor uses a signed message to establish validity\n repeatedly or long after the message is superseded. Signatures do not include a timestamp,\n but you can include a timestamp in the signed message to help you detect when its time to\n refresh the signature.

\n
\n

To verify the signature that this operation generates, use the Verify\n operation. Or use the GetPublicKey operation to download the public key and\n then use the public key to verify the signature outside of KMS.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Sign (key policy)

\n

\n Related operations: Verify\n

" + "smithy.api#documentation": "

Creates a digital\n signature for a message or message digest by using the private key in an asymmetric\n signing KMS key. To verify the signature, use the Verify operation, or use\n the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

Digital signatures are generated and verified by using asymmetric key pair, such as an RSA\n or ECC pair that is represented by an asymmetric KMS key. The key owner (or an authorized\n user) uses their private key to sign a message. Anyone with the public key can verify that the\n message was signed with that particular private key and that the message hasn't changed since\n it was signed.

\n

To use the Sign operation, provide the following information:

\n
    \n
  • \n

    Use the KeyId parameter to identify an asymmetric KMS key with a\n KeyUsage value of SIGN_VERIFY. To get the\n KeyUsage value of a KMS key, use the DescribeKey\n operation. The caller must have kms:Sign permission on the KMS key.

    \n
  • \n
  • \n

    Use the Message parameter to specify the message or message digest to\n sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\n hash digest of the message, and then provide the hash digest in the Message\n parameter. To indicate whether the message is a full message or a digest, use the\n MessageType parameter.

    \n
  • \n
  • \n

    Choose a signing algorithm that is compatible with the KMS key.

    \n
  • \n
\n \n

When signing a message, be sure to record the KMS key and the signing algorithm. This\n information is required to verify the signature.

\n
\n \n

Best practices recommend that you limit the time during which any signature is\n effective. This deters an attack where the actor uses a signed message to establish validity\n repeatedly or long after the message is superseded. Signatures do not include a timestamp,\n but you can include a timestamp in the signed message to help you detect when its time to\n refresh the signature.

\n
\n

To verify the signature that this operation generates, use the Verify\n operation. Or use the GetPublicKey operation to download the public key and\n then use the public key to verify the signature outside of KMS.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Sign (key policy)

\n

\n Related operations: Verify\n

", + "smithy.api#examples": [ + { + "title": "To digitally sign a message with an asymmetric KMS key.", + "documentation": "This operation uses the private key in an asymmetric elliptic curve (ECC) KMS key to generate a digital signature for a given message.", + "input": { + "KeyId": "alias/ECC_signing_key", + "Message": "", + "MessageType": "RAW", + "SigningAlgorithm": "ECDSA_SHA_384" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "Signature": "", + "SigningAlgorithm": "ECDSA_SHA_384" + } + } + ] } }, "com.amazonaws.kms#SignRequest": { @@ -5882,7 +6444,22 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or edits tags on a customer managed key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\n The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\n value. To edit a tag, specify an existing tag key and a new tag value.

\n

You can use this operation to tag a customer managed key, but you cannot\n tag an Amazon Web Services\n managed key, an Amazon Web Services owned key, a custom key\n store, or an alias.

\n

You can also add tags to a KMS key while creating it (CreateKey) or\n replicating it (ReplicateKey).

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:TagResource (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Adds or edits tags on a customer managed key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\n The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\n value. To edit a tag, specify an existing tag key and a new tag value.

\n

You can use this operation to tag a customer managed key, but you cannot\n tag an Amazon Web Services\n managed key, an Amazon Web Services owned key, a custom key\n store, or an alias.

\n

You can also add tags to a KMS key while creating it (CreateKey) or\n replicating it (ReplicateKey).

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:TagResource (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To tag a KMS key", + "documentation": "The following example tags a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Tags": [ + { + "TagKey": "Purpose", + "TagValue": "Test" + } + ] + } + } + ] } }, "com.amazonaws.kms#TagResourceRequest": { @@ -6148,52 +6725,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -6201,13 +6782,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -6217,224 +6807,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://kms-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://kms-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://kms.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://kms.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -7417,7 +7958,20 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes tags from a customer managed key. To delete a tag,\n specify the tag key and the KMS key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

When it succeeds, the UntagResource operation doesn't return any output.\n Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\n return a response. To confirm that the operation worked, use the ListResourceTags operation.

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UntagResource (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Deletes tags from a customer managed key. To delete a tag,\n specify the tag key and the KMS key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

When it succeeds, the UntagResource operation doesn't return any output.\n Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\n return a response. To confirm that the operation worked, use the ListResourceTags operation.

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UntagResource (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To remove tags from a KMS key", + "documentation": "The following example removes tags from a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "TagKeys": [ + "Purpose", + "CostCenter" + ] + } + } + ] } }, "com.amazonaws.kms#UntagResourceRequest": { @@ -7468,7 +8022,17 @@ } ], "traits": { - "smithy.api#documentation": "

Associates an existing KMS alias with a different KMS key. Each alias is associated with\n only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\n KMS key must be in the same Amazon Web Services account and Region.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

The current and new KMS key must be the same type (both symmetric or both asymmetric or\n both HMAC), and they must have the same key usage. This restriction prevents errors in code\n that uses aliases. If you must assign an alias to a different type of KMS key, use DeleteAlias to delete the old alias and CreateAlias to create\n a new alias.

\n

You cannot use UpdateAlias to change an alias name. To change an alias name,\n use DeleteAlias to delete the old alias and CreateAlias to\n create a new alias.

\n

Because an alias is not a property of a KMS key, you can create, update, and delete the\n aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\n response from the DescribeKey operation. To get the aliases of all KMS keys\n in the account, use the ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Associates an existing KMS alias with a different KMS key. Each alias is associated with\n only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\n KMS key must be in the same Amazon Web Services account and Region.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

The current and new KMS key must be the same type (both symmetric or both asymmetric or\n both HMAC), and they must have the same key usage. This restriction prevents errors in code\n that uses aliases. If you must assign an alias to a different type of KMS key, use DeleteAlias to delete the old alias and CreateAlias to create\n a new alias.

\n

You cannot use UpdateAlias to change an alias name. To change an alias name,\n use DeleteAlias to delete the old alias and CreateAlias to\n create a new alias.

\n

Because an alias is not a property of a KMS key, you can create, update, and delete the\n aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\n response from the DescribeKey operation. To get the aliases of all KMS keys\n in the account, use the ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To update an alias", + "documentation": "The following example updates the specified alias to refer to the specified KMS key.", + "input": { + "AliasName": "alias/ExampleAlias", + "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#UpdateAliasRequest": { @@ -7555,7 +8119,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the properties of a custom key store. You can use this operation to change the\n properties of an CloudHSM key store or an external key store.

\n

Use the required CustomKeyStoreId parameter to identify the custom key store.\n Use the remaining optional parameters to change its properties. This operation does not return\n any property values. To verify the updated property values, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n \n

When updating the properties of an external key store, verify that the updated settings\n connect your key store, via the external key store proxy, to the same external key manager\n as the previous settings, or to a backup or snapshot of the external key manager with the\n same cryptographic keys. If the updated connection settings fail, you can fix them and\n retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\n permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\n unrecoverable.

\n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for updating an external key store.\n For details, see your external key manager documentation.

\n

When updating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot upload the proxy configuration\n file to the UpdateCustomKeyStore operation. However, you can use the file to\n help you determine the correct values for the UpdateCustomKeyStore\n parameters.

\n
\n

For an CloudHSM key store, you can use this operation to change the custom key store friendly\n name (NewCustomKeyStoreName), to tell KMS about a change to the\n kmsuser crypto user password (KeyStorePassword), or to associate\n the custom key store with a different, but related, CloudHSM cluster\n (CloudHsmClusterId). To update any property of an CloudHSM key store, the\n ConnectionState of the CloudHSM key store must be DISCONNECTED.

\n

For an external key store, you can use this operation to change the custom key store\n friendly name (NewCustomKeyStoreName), or to tell KMS about a change to the\n external key store proxy authentication credentials\n (XksProxyAuthenticationCredential), connection method\n (XksProxyConnectivity), external proxy endpoint\n (XksProxyUriEndpoint) and path (XksProxyUriPath). For external key\n stores with an XksProxyConnectivity of VPC_ENDPOINT_SERVICE, you can\n also update the Amazon VPC endpoint service name (XksProxyVpcEndpointServiceName). To\n update most properties of an external key store, the ConnectionState of the\n external key store must be DISCONNECTED. However, you can update the\n CustomKeyStoreName, XksProxyAuthenticationCredential, and\n XksProxyUriPath of an external key store when it is in the CONNECTED or\n DISCONNECTED state.

\n

If your update requires a DISCONNECTED state, before using\n UpdateCustomKeyStore, use the DisconnectCustomKeyStore\n operation to disconnect the custom key store. After the UpdateCustomKeyStore\n operation completes, use the ConnectCustomKeyStore to reconnect the custom\n key store. To find the ConnectionState of the custom key store, use the DescribeCustomKeyStores operation.

\n

\n

\n

Before updating the custom key store, verify that the new values allow KMS to connect\n the custom key store to its backing key store. For example, before you change the\n XksProxyUriPath value, verify that the external key store proxy is reachable at\n the new path.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Changes the properties of a custom key store. You can use this operation to change the\n properties of an CloudHSM key store or an external key store.

\n

Use the required CustomKeyStoreId parameter to identify the custom key store.\n Use the remaining optional parameters to change its properties. This operation does not return\n any property values. To verify the updated property values, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n \n

When updating the properties of an external key store, verify that the updated settings\n connect your key store, via the external key store proxy, to the same external key manager\n as the previous settings, or to a backup or snapshot of the external key manager with the\n same cryptographic keys. If the updated connection settings fail, you can fix them and\n retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\n permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\n unrecoverable.

\n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for updating an external key store.\n For details, see your external key manager documentation.

\n

When updating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot upload the proxy configuration\n file to the UpdateCustomKeyStore operation. However, you can use the file to\n help you determine the correct values for the UpdateCustomKeyStore\n parameters.

\n
\n

For an CloudHSM key store, you can use this operation to change the custom key store friendly\n name (NewCustomKeyStoreName), to tell KMS about a change to the\n kmsuser crypto user password (KeyStorePassword), or to associate\n the custom key store with a different, but related, CloudHSM cluster\n (CloudHsmClusterId). To update any property of an CloudHSM key store, the\n ConnectionState of the CloudHSM key store must be DISCONNECTED.

\n

For an external key store, you can use this operation to change the custom key store\n friendly name (NewCustomKeyStoreName), or to tell KMS about a change to the\n external key store proxy authentication credentials\n (XksProxyAuthenticationCredential), connection method\n (XksProxyConnectivity), external proxy endpoint\n (XksProxyUriEndpoint) and path (XksProxyUriPath). For external key\n stores with an XksProxyConnectivity of VPC_ENDPOINT_SERVICE, you can\n also update the Amazon VPC endpoint service name (XksProxyVpcEndpointServiceName). To\n update most properties of an external key store, the ConnectionState of the\n external key store must be DISCONNECTED. However, you can update the\n CustomKeyStoreName, XksProxyAuthenticationCredential, and\n XksProxyUriPath of an external key store when it is in the CONNECTED or\n DISCONNECTED state.

\n

If your update requires a DISCONNECTED state, before using\n UpdateCustomKeyStore, use the DisconnectCustomKeyStore\n operation to disconnect the custom key store. After the UpdateCustomKeyStore\n operation completes, use the ConnectCustomKeyStore to reconnect the custom\n key store. To find the ConnectionState of the custom key store, use the DescribeCustomKeyStores operation.

\n

\n

\n

Before updating the custom key store, verify that the new values allow KMS to connect\n the custom key store to its backing key store. For example, before you change the\n XksProxyUriPath value, verify that the external key store proxy is reachable at\n the new path.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To edit the friendly name of a custom key store", + "documentation": "This example changes the friendly name of the AWS KMS custom key store to the name that you specify. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0", + "NewCustomKeyStoreName": "DevelopmentKeys" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#UpdateCustomKeyStoreRequest": { @@ -7654,7 +8229,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the description of a KMS key. To see the description of a KMS key, use DescribeKey.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateKeyDescription (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Updates the description of a KMS key. To see the description of a KMS key, use DescribeKey.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateKeyDescription (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To update the description of a KMS key", + "documentation": "The following example updates the description of the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Description": "Example description that indicates the intended use of this KMS key." + } + } + ] } }, "com.amazonaws.kms#UpdateKeyDescriptionRequest": { @@ -7708,7 +8293,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the primary key of a multi-Region key.

\n

This operation changes the replica key in the specified Region to a primary key and\n changes the former primary key to a replica key. For example, suppose you have a primary key\n in us-east-1 and a replica key in eu-west-2. If you run\n UpdatePrimaryRegion with a PrimaryRegion value of\n eu-west-2, the primary key is now the key in eu-west-2, and the\n key in us-east-1 becomes a replica key. For details, see Updating the primary Region in the Key Management Service Developer Guide.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

The primary key of a multi-Region key is the source for properties\n that are always shared by primary and replica keys, including the key material, key ID, key spec, key usage, key material\n origin, and automatic\n key rotation. It's the only key that can be replicated. You cannot delete the primary\n key until all replica keys are deleted.

\n

The key ID and primary Region that you specify uniquely identify the replica key that will\n become the primary key. The primary Region must already have a replica key. This operation\n does not create a KMS key in the specified Region. To find the replica keys, use the DescribeKey operation on the primary key or any replica key. To create a replica\n key, use the ReplicateKey operation.

\n

You can run this operation while using the affected multi-Region keys in cryptographic\n operations. This operation should not delay, interrupt, or cause failures in cryptographic\n operations.

\n

Even after this operation completes, the process of updating the primary Region might\n still be in progress for a few more seconds. Operations such as DescribeKey might\n display both the old and new primary keys as replicas. The old and new primary keys have a\n transient key state of Updating. The original key state is restored when the\n update is complete. While the key state is Updating, you can use the keys in\n cryptographic operations, but you cannot replicate the new primary key or perform certain\n management operations, such as enabling or disabling these keys. For details about the\n Updating key state, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

This operation does not return any output. To verify that primary key is changed, use the\n DescribeKey operation.

\n

\n Cross-account use: No. You cannot use this operation in a\n different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:UpdatePrimaryRegion on the current primary key (in the primary key's\n Region). Include this permission primary key's key policy.

    \n
  • \n
  • \n

    \n kms:UpdatePrimaryRegion on the current replica key (in the replica key's\n Region). Include this permission in the replica key's key policy.

    \n
  • \n
\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Changes the primary key of a multi-Region key.

\n

This operation changes the replica key in the specified Region to a primary key and\n changes the former primary key to a replica key. For example, suppose you have a primary key\n in us-east-1 and a replica key in eu-west-2. If you run\n UpdatePrimaryRegion with a PrimaryRegion value of\n eu-west-2, the primary key is now the key in eu-west-2, and the\n key in us-east-1 becomes a replica key. For details, see Updating the primary Region in the Key Management Service Developer Guide.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

The primary key of a multi-Region key is the source for properties\n that are always shared by primary and replica keys, including the key material, key ID, key spec, key usage, key material\n origin, and automatic\n key rotation. It's the only key that can be replicated. You cannot delete the primary\n key until all replica keys are deleted.

\n

The key ID and primary Region that you specify uniquely identify the replica key that will\n become the primary key. The primary Region must already have a replica key. This operation\n does not create a KMS key in the specified Region. To find the replica keys, use the DescribeKey operation on the primary key or any replica key. To create a replica\n key, use the ReplicateKey operation.

\n

You can run this operation while using the affected multi-Region keys in cryptographic\n operations. This operation should not delay, interrupt, or cause failures in cryptographic\n operations.

\n

Even after this operation completes, the process of updating the primary Region might\n still be in progress for a few more seconds. Operations such as DescribeKey might\n display both the old and new primary keys as replicas. The old and new primary keys have a\n transient key state of Updating. The original key state is restored when the\n update is complete. While the key state is Updating, you can use the keys in\n cryptographic operations, but you cannot replicate the new primary key or perform certain\n management operations, such as enabling or disabling these keys. For details about the\n Updating key state, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

This operation does not return any output. To verify that primary key is changed, use the\n DescribeKey operation.

\n

\n Cross-account use: No. You cannot use this operation in a\n different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:UpdatePrimaryRegion on the current primary key (in the primary key's\n Region). Include this permission primary key's key policy.

    \n
  • \n
  • \n

    \n kms:UpdatePrimaryRegion on the current replica key (in the replica key's\n Region). Include this permission in the replica key's key policy.

    \n
  • \n
\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To update the primary Region of a multi-Region KMS key", + "documentation": "The following UpdatePrimaryRegion example changes the multi-Region replica key in the eu-central-1 Region to the primary key. The current primary key in the us-west-1 Region becomes a replica key. \n\nThe KeyId parameter identifies the current primary key in the us-west-1 Region. The PrimaryRegion parameter indicates the Region of the replica key that will become the new primary key.\n\nThis operation does not return any output. To verify that primary key is changed, use the DescribeKey operation.", + "input": { + "KeyId": "arn:aws:kms:us-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "PrimaryRegion": "eu-central-1" + } + } + ] } }, "com.amazonaws.kms#UpdatePrimaryRegionRequest": { @@ -7774,7 +8369,25 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the same asymmetric KMS key, message,\n and signing algorithm that were used to produce the signature. The message type does not need\n to be the same as the one used for signing, but it must indicate whether the value of the\n Message parameter should be hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

" + "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the same asymmetric KMS key, message,\n and signing algorithm that were used to produce the signature. The message type does not need\n to be the same as the one used for signing, but it must indicate whether the value of the\n Message parameter should be hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

", + "smithy.api#examples": [ + { + "title": "To use an asymmetric KMS key to verify a digital signature", + "documentation": "This operation uses the public key in an elliptic curve (ECC) asymmetric key to verify a digital signature within AWS KMS.", + "input": { + "KeyId": "alias/ECC_signing_key", + "Message": "", + "MessageType": "RAW", + "Signature": "", + "SigningAlgorithm": "ECDSA_SHA_384" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "SignatureValid": true, + "SigningAlgorithm": "ECDSA_SHA_384" + } + } + ] } }, "com.amazonaws.kms#VerifyMac": { @@ -7815,7 +8428,24 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\n KMS key, and MAC algorithm. To verify the HMAC, VerifyMac computes an HMAC using\n the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\n to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\n otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\n calculated, and the specified key was used to generate and verify the HMAC.

\n

HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\n defined in RFC 2104.

\n

This operation is part of KMS support for HMAC KMS keys. For details, see\n HMAC keys in KMS in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:VerifyMac (key policy)

\n

\n Related operations: GenerateMac\n

" + "smithy.api#documentation": "

Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\n KMS key, and MAC algorithm. To verify the HMAC, VerifyMac computes an HMAC using\n the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\n to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\n otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\n calculated, and the specified key was used to generate and verify the HMAC.

\n

HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\n defined in RFC 2104.

\n

This operation is part of KMS support for HMAC KMS keys. For details, see\n HMAC keys in KMS in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:VerifyMac (key policy)

\n

\n Related operations: GenerateMac\n

", + "smithy.api#examples": [ + { + "title": "To verify an HMAC", + "documentation": "This example verifies an HMAC for a particular message, HMAC KMS keys, and MAC algorithm. A value of 'true' in the MacValid value in the response indicates that the HMAC is valid.", + "input": { + "Message": "Hello World", + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "MacAlgorithm": "HMAC_SHA_384", + "Mac": "" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "MacValid": true, + "MacAlgorithm": "HMAC_SHA_384" + } + } + ] } }, "com.amazonaws.kms#VerifyMacRequest": { diff --git a/aws/sdk/aws-models/lambda.json b/aws/sdk/aws-models/lambda.json index e3300f4f548..9f2a524dd9c 100644 --- a/aws/sdk/aws-models/lambda.json +++ b/aws/sdk/aws-models/lambda.json @@ -306,52 +306,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -359,13 +363,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -375,224 +388,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://lambda.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://lambda.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/aws-models/polly.json b/aws/sdk/aws-models/polly.json index ebc45a63dbd..55c468f5aea 100644 --- a/aws/sdk/aws-models/polly.json +++ b/aws/sdk/aws-models/polly.json @@ -62,6 +62,16 @@ ], "traits": { "smithy.api#documentation": "

Deletes the specified pronunciation lexicon stored in an Amazon Web Services Region. A lexicon which has been deleted is not available for\n speech synthesis, nor is it possible to retrieve it using either the\n GetLexicon or ListLexicon APIs.

\n

For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To delete a lexicon", + "documentation": "Deletes a specified pronunciation lexicon stored in an AWS Region.", + "input": { + "Name": "example" + }, + "output": {} + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/v1/lexicons/{Name}", @@ -110,6 +120,40 @@ ], "traits": { "smithy.api#documentation": "

Returns the list of voices that are available for use when\n requesting speech synthesis. Each voice speaks a specified language, is\n either male or female, and is identified by an ID, which is the ASCII\n version of the voice name.

\n

When synthesizing speech ( SynthesizeSpeech ), you\n provide the voice ID for the voice you want from the list of voices\n returned by DescribeVoices.

\n

For example, you want your news reader application to read news in\n a specific language, but giving a user the option to choose the voice.\n Using the DescribeVoices operation you can provide the user\n with a list of available voices to select from.

\n

You can optionally specify a language code to filter the available\n voices. For example, if you specify en-US, the operation\n returns a list of all available US English voices.

\n

This operation requires permissions to perform the\n polly:DescribeVoices action.

", + "smithy.api#examples": [ + { + "title": "To describe available voices", + "documentation": "Returns the list of voices that are available for use when requesting speech synthesis. Displayed languages are those within the specified language code. If no language code is specified, voices for all available languages are displayed.", + "input": { + "LanguageCode": "en-GB" + }, + "output": { + "Voices": [ + { + "Gender": "Female", + "Name": "Emma", + "LanguageName": "British English", + "Id": "Emma", + "LanguageCode": "en-GB" + }, + { + "Gender": "Male", + "Name": "Brian", + "LanguageName": "British English", + "Id": "Brian", + "LanguageCode": "en-GB" + }, + { + "Gender": "Female", + "Name": "Amy", + "LanguageName": "British English", + "Id": "Amy", + "LanguageCode": "en-GB" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/v1/voices", @@ -892,6 +936,27 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of pronunciation lexicons stored in an Amazon Web Services Region. For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To list all lexicons in a region", + "documentation": "Returns a list of pronunciation lexicons stored in an AWS Region.", + "output": { + "Lexicons": [ + { + "Attributes": { + "LanguageCode": "en-US", + "LastModified": 1.478542980117E9, + "Alphabet": "ipa", + "LexemesCount": 1, + "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example", + "Size": 503 + }, + "Name": "example" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/v1/lexicons", @@ -1223,52 +1288,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -1276,13 +1345,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -1292,224 +1370,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://polly-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://polly.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://polly.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -2174,6 +2203,17 @@ ], "traits": { "smithy.api#documentation": "

Stores a pronunciation lexicon in an Amazon Web Services Region. If\n a lexicon with the same name already exists in the region, it is\n overwritten by the new lexicon. Lexicon operations have eventual\n consistency, therefore, it might take some time before the lexicon is\n available to the SynthesizeSpeech operation.

\n

For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To save a lexicon", + "documentation": "Stores a pronunciation lexicon in an AWS Region.", + "input": { + "Name": "W3C", + "Content": "file://example.pls" + }, + "output": {} + } + ], "smithy.api#http": { "method": "PUT", "uri": "/v1/lexicons/{Name}", @@ -2609,6 +2649,27 @@ ], "traits": { "smithy.api#documentation": "

Synthesizes UTF-8 input, plain text or SSML, to a stream of bytes.\n SSML input must be valid, well-formed SSML. Some alphabets might not be\n available with all the voices (for example, Cyrillic might not be read at\n all by English voices) unless phoneme mapping is used. For more\n information, see How it Works.

", + "smithy.api#examples": [ + { + "title": "To synthesize speech", + "documentation": "Synthesizes plain text or SSML into a file of human-like speech.", + "input": { + "LexiconNames": [ + "example" + ], + "OutputFormat": "mp3", + "SampleRate": "8000", + "Text": "All Gaul is divided into three parts", + "TextType": "text", + "VoiceId": "Joanna" + }, + "output": { + "AudioStream": "TEXT", + "ContentType": "audio/mpeg", + "RequestCharacters": 37 + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/v1/speech", @@ -3413,6 +3474,12 @@ "traits": { "smithy.api#enumValue": "Isabelle" } + }, + "Zayd": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Zayd" + } } } }, diff --git a/aws/sdk/aws-models/qldb-session.json b/aws/sdk/aws-models/qldb-session.json index b12ca953200..df4974f8c5d 100644 --- a/aws/sdk/aws-models/qldb-session.json +++ b/aws/sdk/aws-models/qldb-session.json @@ -326,7 +326,7 @@ "min": 1, "max": 32 }, - "smithy.api#pattern": "(?!^.*--)(?!^[0-9]+$)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$" + "smithy.api#pattern": "^(?!^.*--)(?!^[0-9]+$)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$" } }, "com.amazonaws.qldbsession#LimitExceededException": { @@ -471,52 +471,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -524,13 +528,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -540,224 +553,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://session.qldb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://session.qldb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://session.qldb-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://session.qldb-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://session.qldb.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://session.qldb.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://session.qldb.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://session.qldb.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1334,6 +1298,9 @@ "smithy.api#documentation": "

Command to fetch a page.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.qldbsession#SendCommandResult": { @@ -1381,6 +1348,9 @@ "smithy.api#documentation": "

Contains the details of the fetched page.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.qldbsession#SessionToken": { diff --git a/aws/sdk/aws-models/route53.json b/aws/sdk/aws-models/route53.json index 388346dd5b7..a987bda7ef8 100644 --- a/aws/sdk/aws-models/route53.json +++ b/aws/sdk/aws-models/route53.json @@ -334,52 +334,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -387,597 +391,557 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://route53-fips.amazonaws.com", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-east-1" } - ], - "endpoint": { - "url": "https://route53-fips.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-cn" + "name" ] }, + "aws-cn" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.amazonaws.com.cn", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "cn-northwest-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.amazonaws.com.cn", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "cn-northwest-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://route53.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-gov-west-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "PartitionResult" }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-gov-west-1" - } + "name" ] }, - "headers": {} - }, - "type": "endpoint" + "aws-iso" + ] }, { - "conditions": [ + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://route53.c2s.ic.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-iso-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso" + "name" ] }, + "aws-iso-b" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://route53.sc2s.sgov.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-isob-east-1" } - ], - "endpoint": { - "url": "https://route53.c2s.ic.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-iso-east-1" - } - ] + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "headers": {} - }, - "type": "endpoint" + true + ] }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ + true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "name" + "supportsFIPS" ] - }, - "aws-iso-b" - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.sc2s.sgov.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-isob-east-1" } ] }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://route53-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://route53.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://route53.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1753,6 +1717,28 @@ ], "traits": { "smithy.api#documentation": "

Associates an Amazon VPC with a private hosted zone.

\n \n

To perform the association, the VPC and the private hosted zone must already\n\t\t\t\texist. You can't convert a public hosted zone into a private hosted zone.

\n
\n \n

If you want to associate a VPC that was created by using one Amazon Web Services account with a private hosted zone that was created by using a\n\t\t\t\tdifferent account, the Amazon Web Services account that created the private hosted\n\t\t\t\tzone must first submit a CreateVPCAssociationAuthorization request.\n\t\t\t\tThen the account that created the VPC must submit an\n\t\t\t\t\tAssociateVPCWithHostedZone request.

\n
\n \n

When granting access, the hosted zone and the Amazon VPC must belong to\n\t\t\t\tthe same partition. A partition is a group of Amazon Web Services Regions. Each\n\t\t\t\t\tAmazon Web Services account is scoped to one partition.

\n

The following are the supported partitions:

\n
    \n
  • \n

    \n aws - Amazon Web Services Regions

    \n
  • \n
  • \n

    \n aws-cn - China Regions

    \n
  • \n
  • \n

    \n aws-us-gov - Amazon Web Services GovCloud (US) Region

    \n
  • \n
\n

For more information, see Access Management\n\t\t\t\tin the Amazon Web Services General Reference.

\n
", + "smithy.api#examples": [ + { + "title": "To associate a VPC with a hosted zone", + "documentation": "The following example associates the VPC with ID vpc-1a2b3c4d with the hosted zone with ID Z3M3LMPEXAMPLE.", + "input": { + "HostedZoneId": "Z3M3LMPEXAMPLE", + "VPC": { + "VPCId": "vpc-1a2b3c4d", + "VPCRegion": "us-east-2" + }, + "Comment": "" + }, + "output": { + "ChangeInfo": { + "Status": "INSYNC", + "Comment": "", + "SubmittedAt": "2017-01-31T01:36:41.958Z", + "Id": "/change/C3HC6WDB2UANE2" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/associatevpc", @@ -2024,6 +2010,41 @@ ], "traits": { "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates your\n\t\t\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\n\t\t\tyour changes are propagating, GetChange returns a status of\n\t\t\t\tPENDING. When propagation is complete, GetChange returns a\n\t\t\tstatus of INSYNC. Changes generally propagate to all Route 53 name servers\n\t\t\tmanaging the hosted zone within 60 seconds. For more information, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a basic resource record set", + "documentation": "The following example creates a resource record set that routes Internet traffic to a resource with an IP address of 192.0.2.44.", + "input": { + "HostedZoneId": "Z3M3LMPEXAMPLE", + "ChangeBatch": { + "Comment": "Web server for example.com", + "Changes": [ + { + "Action": "CREATE", + "ResourceRecordSet": { + "Name": "example.com", + "Type": "A", + "TTL": 60, + "ResourceRecords": [ + { + "Value": "192.0.2.44" + } + ] + } + } + ] + } + }, + "output": { + "ChangeInfo": { + "Comment": "Web server for example.com", + "Id": "/change/C2682N5HXP0BZ4", + "Status": "PENDING", + "SubmittedAt": "2017-02-10T01:36:41.958Z" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/rrset", @@ -2115,6 +2136,30 @@ ], "traits": { "smithy.api#documentation": "

Adds, edits, or deletes tags for a health check or a hosted zone.

\n

For information about using tags for cost allocation, see Using Cost Allocation\n\t\t\t\tTags in the Billing and Cost Management User Guide.

", + "smithy.api#examples": [ + { + "title": "To add or remove tags from a hosted zone or health check", + "documentation": "The following example adds two tags and removes one tag from the hosted zone with ID Z3M3LMPEXAMPLE.", + "input": { + "ResourceType": "hostedzone", + "ResourceId": "Z3M3LMPEXAMPLE", + "AddTags": [ + { + "Key": "apex", + "Value": "3874" + }, + { + "Key": "acme", + "Value": "4938" + } + ], + "RemoveTagKeys": [ + "Nadir" + ] + }, + "output": {} + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/tags/{ResourceType}/{ResourceId}", @@ -5578,6 +5623,34 @@ ], "traits": { "smithy.api#documentation": "

Gets information about a specified hosted zone including the four name servers\n\t\t\tassigned to the hosted zone.

", + "smithy.api#examples": [ + { + "title": "To get information about a hosted zone", + "documentation": "The following example gets information about the Z3M3LMPEXAMPLE hosted zone.", + "input": { + "Id": "Z3M3LMPEXAMPLE" + }, + "output": { + "HostedZone": { + "ResourceRecordSetCount": 8, + "CallerReference": "C741617D-04E4-F8DE-B9D7-0D150FC61C2E", + "Config": { + "PrivateZone": false + }, + "Id": "/hostedzone/Z3M3LMPEXAMPLE", + "Name": "myawsbucket.com." + }, + "DelegationSet": { + "NameServers": [ + "ns-2048.awsdns-64.com", + "ns-2049.awsdns-65.net", + "ns-2050.awsdns-66.org", + "ns-2051.awsdns-67.co.uk" + ] + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/hostedzone/{Id}", diff --git a/aws/sdk/aws-models/s3.json b/aws/sdk/aws-models/s3.json index 92a0e925980..174eb169d20 100644 --- a/aws/sdk/aws-models/s3.json +++ b/aws/sdk/aws-models/s3.json @@ -62,6 +62,18 @@ ], "traits": { "smithy.api#documentation": "

This action aborts a multipart upload. After a multipart upload is aborted, no\n additional parts can be uploaded using that upload ID. The storage consumed by any\n previously uploaded parts will be freed. However, if any part uploads are currently in\n progress, those part uploads might or might not succeed. As a result, it might be necessary\n to abort a given multipart upload multiple times in order to completely free all storage\n consumed by all parts.

\n

To verify that all parts have been removed, so you don't get charged for the part\n storage, you should call the ListParts action and ensure that\n the parts list is empty.

\n

For information about permissions required to use the multipart upload, see Multipart Upload\n and Permissions.

\n

The following operations are related to AbortMultipartUpload:

\n ", + "smithy.api#examples": [ + { + "title": "To abort a multipart upload", + "documentation": "The following example aborts a multipart upload.", + "input": { + "Bucket": "examplebucket", + "Key": "bigobject", + "UploadId": "xadcOB_7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--" + }, + "output": {} + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}/{Key+}?x-id=AbortMultipartUpload", @@ -8137,7 +8149,6 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": true, "UseFIPS": false } @@ -8774,10 +8785,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -8814,10 +8823,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-east-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -8856,10 +8863,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-east-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -11676,8 +11681,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -11716,8 +11720,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -11757,8 +11760,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -11797,8 +11799,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -11837,8 +11838,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -11878,8 +11878,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -11907,8 +11906,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -11946,8 +11944,7 @@ "ForcePathStyle": false, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -11986,8 +11983,7 @@ "ForcePathStyle": false, "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12053,8 +12049,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12093,8 +12088,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12134,8 +12128,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12174,8 +12167,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12214,8 +12206,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -12255,8 +12246,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -12284,8 +12274,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -12324,8 +12313,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12392,8 +12380,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12433,8 +12420,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12460,10 +12446,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12502,8 +12486,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12540,8 +12523,7 @@ "Bucket": "99a_b", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12580,8 +12562,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12637,8 +12618,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12678,8 +12658,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12705,10 +12684,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12747,8 +12724,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12785,8 +12761,7 @@ "Bucket": "99a_b", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12825,8 +12800,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12894,8 +12868,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12935,8 +12908,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -12962,10 +12934,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13004,8 +12974,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13042,8 +13011,7 @@ "Bucket": "99a_b", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13083,8 +13051,7 @@ "Endpoint": "http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13125,8 +13092,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13155,8 +13121,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -13185,8 +13150,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13215,8 +13179,7 @@ "Endpoint": "http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13255,10 +13218,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13298,8 +13259,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13340,8 +13300,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13384,8 +13343,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13439,10 +13397,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13482,8 +13438,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13524,8 +13479,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13554,8 +13508,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -13584,8 +13537,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13614,8 +13566,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13654,10 +13605,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13694,10 +13643,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13735,10 +13682,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -13764,10 +13709,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13806,10 +13749,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -13846,10 +13787,8 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13862,7 +13801,6 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, "UseFIPS": true } @@ -13890,10 +13828,8 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13906,7 +13842,6 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": true, "UseFIPS": true } @@ -13945,10 +13880,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13986,10 +13919,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -14015,10 +13946,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -14057,10 +13986,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -14163,10 +14090,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -14195,10 +14120,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -14237,10 +14160,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -14277,10 +14198,8 @@ "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -14307,10 +14226,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -15058,10 +14975,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16816,6 +16731,23 @@ ], "traits": { "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. The request can also result in a data retrieval charge for the\n source if the source storage class bills for data retrieval. For pricing information, see\n Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify new metadata.\n However, the access control list (ACL) is not preserved and is set to private for the user making the request. To\n override the default ACL setting, specify a new ACL when generating a copy request. For\n more information, see Using ACLs.

\n

To specify whether you want the object metadata copied from the source object or\n replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you can use\n the s3:x-amz-metadata-directive condition key to enforce certain metadata\n behavior when objects are uploaded. For more information, see Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list of\n Amazon S3-specific condition keys, see Actions, Resources, and Condition Keys for\n Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and must be\n specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the Etag\n matches or whether the object was modified before or after a specified date, use the\n following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the request\n and evaluate as follows, Amazon S3 returns 200 OK and copies the data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the request and\n evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When\n copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a different type\n of encryption setting for the target object, you can use other appropriate\n encryption-related headers to encrypt the target object with a KMS key, an Amazon S3 managed\n key, or a customer-provided key. With server-side encryption, Amazon S3 encrypts your data as it\n writes your data to disks in its data centers and decrypts the data when you access it. If the\n encryption setting in your request is different from the default encryption configuration\n of the destination bucket, the encryption setting in your request takes precedence. If the\n source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\n encryption information in your request so that Amazon S3 can decrypt the object for copying. For\n more information about server-side encryption, see Using Server-Side\n Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request\n Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based permissions.\n By default, all objects are private. Only the owner has full access control. When adding a\n new object, you can grant permissions to individual Amazon Web Services accounts or to predefined groups\n that are defined by Amazon S3. These permissions are then added to the ACL on the object. For more\n information, see Access Control List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced setting for\n S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use\n this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to the new\n object by default. When you copy the object over, you can optionally specify a different\n checksum algorithm to use with the x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of an object\n that is already stored in Amazon S3 by using the StorageClass parameter. For more\n information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER, you must restore a copy of\n this object before you can use it as a source object for the copy operation. For\n more information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current version of an object\n to copy. If the current version is a delete marker, Amazon S3 behaves as if the object was\n deleted. To copy a different version, use the versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version ID for\n the object being copied. This version ID is different from the version ID of the source\n object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version ID that\n Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", + "smithy.api#examples": [ + { + "title": "To copy an object", + "documentation": "The following example copies an object from one bucket to another.", + "input": { + "Bucket": "destinationbucket", + "CopySource": "/sourcebucket/HappyFacejpg", + "Key": "HappyFaceCopyjpg" + }, + "output": { + "CopyObjectResult": { + "LastModified": "2016-12-15T17:38:53.000Z", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=CopyObject", @@ -17351,6 +17283,18 @@ ], "traits": { "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. You might choose a Region to optimize\n latency, minimize costs, or address regulatory requirements. For example, if you reside in\n Europe, you will probably find it advantageous to create buckets in the Europe (Ireland)\n Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature calculations in\n Signature Version 4 must use us-east-1 as the Region, even if the location constraint in\n the request specifies another Region where the bucket is to be created. If you create a\n bucket in a Region other than US East (N. Virginia), your application must be able to\n handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are required when\n your CreateBucket request includes specific headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your CreateBucket request\n specifies access control list (ACL) permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through any other\n ACL, both s3:CreateBucket and s3:PutBucketAcl permissions\n are needed. If the ACL for the CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.

    \n
  • \n
  • \n

    \n Object Lock - If ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your CreateBucket request includes the x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By default, ObjectOwnership is set to BucketOWnerEnforced and ACLs are disabled. We recommend keeping\n ACLs disabled, except in uncommon use cases where you must control access for each object individually. If you want to change the ObjectOwnership setting, you can use the \n x-amz-object-ownership header in your CreateBucket request to set the ObjectOwnership setting of your choice.\n For more information about S3 Object Ownership, see Controlling object\n ownership in the Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your specific use case requires granting public access to your S3 resources, you can disable Block Public Access. You can create a new bucket with Block Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all Block\n Public Access settings are enabled for new buckets. To avoid inadvertent exposure of\n your resources, we recommend keeping the S3 Block Public Access settings enabled. For more information about S3 Block Public Access, see Blocking public\n access to your Amazon S3 storage in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for Amazon S3 Object Ownership\n and specifies a bucket ACL that provides access to an external Amazon Web Services account, your request fails with a 400 error and returns the InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.

\n
\n

The following operations are related to CreateBucket:

\n ", + "smithy.api#examples": [ + { + "title": "To create a bucket ", + "documentation": "The following example creates a bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Location": "/examplebucket" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}", @@ -17485,6 +17429,21 @@ }, "traits": { "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data\n by using server-side encryption with an Amazon S3 managed key (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3 encrypts\n your data as it writes it to disks in its data centers and decrypts it when you\n access it. You can request that Amazon S3 encrypts\n data at rest by using server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) – If you\n want Amazon Web Services to manage the keys used to encrypt data, specify the following\n headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object protected\n by KMS fail if you don't make them by using Secure Sockets Layer (SSL),\n Transport Layer Security (TLS), or Signature Version 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", + "smithy.api#examples": [ + { + "title": "To initiate a multipart upload", + "documentation": "The following example initiates a multipart upload.", + "input": { + "Bucket": "examplebucket", + "Key": "largeobject" + }, + "output": { + "Bucket": "examplebucket", + "UploadId": "ibZBv_75gd9r8lH_gqXatLdxMVpAlj6ZQjEs.OwyF3953YdwbcQnMA2BLGn8Lx12fQNICtMw5KyteFeHw.Sjng--", + "Key": "largeobject" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?uploads&x-id=CreateMultipartUpload", @@ -17896,6 +17855,15 @@ }, "traits": { "smithy.api#documentation": "

Deletes the S3 bucket. All objects (including all object versions and delete markers) in\n the bucket must be deleted before the bucket itself can be deleted.

\n

The following operations are related to DeleteBucket:

\n ", + "smithy.api#examples": [ + { + "title": "To delete a bucket", + "documentation": "The following example deletes the specified bucket.", + "input": { + "Bucket": "forrandall2" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}", @@ -17964,6 +17932,15 @@ }, "traits": { "smithy.api#documentation": "

Deletes the cors configuration information set for the bucket.

\n

To use this operation, you must have permission to perform the\n s3:PutBucketCORS action. The bucket owner has this permission by default\n and can grant this permission to others.

\n

For information about cors, see Enabling Cross-Origin Resource Sharing in\n the Amazon S3 User Guide.

\n

\n Related Resources\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete cors configuration on a bucket.", + "documentation": "The following example deletes CORS configuration on a bucket.", + "input": { + "Bucket": "examplebucket" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?cors", @@ -18145,6 +18122,15 @@ }, "traits": { "smithy.api#documentation": "

Deletes the lifecycle configuration from the specified bucket. Amazon S3 removes all the\n lifecycle configuration rules in the lifecycle subresource associated with the bucket. Your\n objects never expire, and Amazon S3 no longer automatically deletes any objects on the basis of\n rules contained in the deleted lifecycle configuration.

\n

To use this operation, you must have permission to perform the\n s3:PutLifecycleConfiguration action. By default, the bucket owner has this\n permission and the bucket owner can grant this permission to others.

\n

There is usually some time lag before lifecycle configuration deletion is fully\n propagated to all the Amazon S3 systems.

\n

For more information about the object expiration, see Elements to Describe Lifecycle Actions.

\n

Related actions include:

\n ", + "smithy.api#examples": [ + { + "title": "To delete lifecycle configuration on a bucket.", + "documentation": "The following example deletes lifecycle configuration on a bucket.", + "input": { + "Bucket": "examplebucket" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?lifecycle", @@ -18282,6 +18268,15 @@ }, "traits": { "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete bucket policy", + "documentation": "The following example deletes bucket policy on the specified bucket.", + "input": { + "Bucket": "examplebucket" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?policy", @@ -18325,6 +18320,15 @@ }, "traits": { "smithy.api#documentation": "

Deletes the replication configuration from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:PutReplicationConfiguration action. The bucket owner has these\n permissions by default and can grant it to others. For more information about permissions,\n see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n \n

It can take a while for the deletion of a replication configuration to fully\n propagate.

\n
\n

For information about replication configuration, see Replication in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketReplication:

\n ", + "smithy.api#examples": [ + { + "title": "To delete bucket replication configuration", + "documentation": "The following example deletes replication configuration set on bucket.", + "input": { + "Bucket": "example" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?replication", @@ -18394,6 +18398,15 @@ }, "traits": { "smithy.api#documentation": "

Deletes the tags from the bucket.

\n

To use this operation, you must have permission to perform the\n s3:PutBucketTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

The following operations are related to DeleteBucketTagging:

\n ", + "smithy.api#examples": [ + { + "title": "To delete bucket tags", + "documentation": "The following example deletes bucket tags.", + "input": { + "Bucket": "examplebucket" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?tagging", @@ -18437,6 +18450,15 @@ }, "traits": { "smithy.api#documentation": "

This action removes the website configuration for a bucket. Amazon S3 returns a 200\n OK response upon successfully deleting a website configuration on the specified\n bucket. You will get a 200 OK response if the website configuration you are\n trying to delete does not exist on the bucket. Amazon S3 returns a 404 response if\n the bucket specified in the request does not exist.

\n

This DELETE action requires the S3:DeleteBucketWebsite permission. By\n default, only the bucket owner can delete the website configuration attached to a bucket.\n However, bucket owners can grant other users permission to delete the website configuration\n by writing a bucket policy granting them the S3:DeleteBucketWebsite\n permission.

\n

For more information about hosting websites, see Hosting Websites on Amazon S3.

\n

The following operations are related to DeleteBucketWebsite:

\n ", + "smithy.api#examples": [ + { + "title": "To delete bucket website configuration", + "documentation": "The following example deletes bucket website configuration.", + "input": { + "Bucket": "examplebucket" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?website", @@ -18565,6 +18587,17 @@ }, "traits": { "smithy.api#documentation": "

Removes the null version (if there is one) of an object and inserts a delete marker,\n which becomes the latest version of the object. If there isn't a null version, Amazon S3 does\n not remove any objects but will still respond that the command was successful.

\n

To remove a specific version, you must use the version Id subresource. Using this\n subresource permanently deletes the version. If the object deleted is a delete marker, Amazon S3\n sets the response header, x-amz-delete-marker, to true.

\n

If the object you want to delete is in a bucket where the bucket versioning\n configuration is MFA Delete enabled, you must include the x-amz-mfa request\n header in the DELETE versionId request. Requests that include\n x-amz-mfa must use HTTPS.

\n

For more information about MFA Delete, see Using MFA Delete. To see sample\n requests that use versioning, see Sample\n Request.

\n

You can delete objects by explicitly calling DELETE Object or configure its lifecycle\n (PutBucketLifecycle) to enable Amazon S3 to remove them for you. If you want to block\n users or accounts from removing or deleting objects from your bucket, you must deny them\n the s3:DeleteObject, s3:DeleteObjectVersion, and\n s3:PutLifeCycleConfiguration actions.

\n

The following action is related to DeleteObject:

\n ", + "smithy.api#examples": [ + { + "title": "To delete an object", + "documentation": "The following example deletes an object from an S3 bucket.", + "input": { + "Bucket": "examplebucket", + "Key": "objectkey.jpg" + }, + "output": {} + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}/{Key+}?x-id=DeleteObject", @@ -18673,6 +18706,20 @@ }, "traits": { "smithy.api#documentation": "

Removes the entire tag set from the specified object. For more information about\n managing object tags, see Object Tagging.

\n

To use this operation, you must have permission to perform the\n s3:DeleteObjectTagging action.

\n

To delete tags of a specific object version, add the versionId query\n parameter in the request. You will need permission for the\n s3:DeleteObjectVersionTagging action.

\n

The following operations are related to DeleteObjectTagging:

\n ", + "smithy.api#examples": [ + { + "title": "To remove tag set from an object version", + "documentation": "The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.", + "input": { + "Bucket": "examplebucket", + "Key": "HappyFace.jpg", + "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + }, + "output": { + "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}/{Key+}?tagging", @@ -19690,6 +19737,31 @@ }, "traits": { "smithy.api#documentation": "

Returns the Cross-Origin Resource Sharing (CORS) configuration information set for the\n bucket.

\n

To use this operation, you must have permission to perform the\n s3:GetBucketCORS action. By default, the bucket owner has this permission\n and can grant it to others.

\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about CORS, see Enabling Cross-Origin Resource\n Sharing.

\n

The following operations are related to GetBucketCors:

\n ", + "smithy.api#examples": [ + { + "title": "To get cors configuration set on a bucket", + "documentation": "The following example returns cross-origin resource sharing (CORS) configuration set on a bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "CORSRules": [ + { + "AllowedHeaders": [ + "Authorization" + ], + "MaxAgeSeconds": 3000, + "AllowedMethods": [ + "GET" + ], + "AllowedOrigins": [ + "*" + ] + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?cors", @@ -19932,6 +20004,30 @@ }, "traits": { "smithy.api#documentation": "\n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The response describes the new filter element\n that you can use to specify a filter to select a subset of objects to which the rule\n applies. If you are using a previous version of the lifecycle configuration, it still\n works. For the earlier action, see GetBucketLifecycle.

\n
\n

Returns the lifecycle configuration information set on the bucket. For information about\n lifecycle configuration, see Object Lifecycle\n Management.

\n

To use this operation, you must have permission to perform the\n s3:GetLifecycleConfiguration action. The bucket owner has this permission,\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n GetBucketLifecycleConfiguration has the following special error:

\n
    \n
  • \n

    Error code: NoSuchLifecycleConfiguration\n

    \n
      \n
    • \n

      Description: The lifecycle configuration does not exist.

      \n
    • \n
    • \n

      HTTP Status Code: 404 Not Found

      \n
    • \n
    • \n

      SOAP Fault Code Prefix: Client

      \n
    • \n
    \n
  • \n
\n

The following operations are related to\n GetBucketLifecycleConfiguration:

\n ", + "smithy.api#examples": [ + { + "title": "To get lifecycle configuration on a bucket", + "documentation": "The following example retrieves lifecycle configuration on set on a bucket. ", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Rules": [ + { + "Prefix": "TaxDocs", + "Status": "Enabled", + "Transitions": [ + { + "Days": 365, + "StorageClass": "STANDARD_IA" + } + ], + "ID": "Rule for TaxDocs/" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?lifecycle", @@ -19993,6 +20089,18 @@ "traits": { "aws.customizations#s3UnwrappedXmlOutput": {}, "smithy.api#documentation": "

Returns the Region the bucket resides in. You set the bucket's Region using the\n LocationConstraint request parameter in a CreateBucket\n request. For more information, see CreateBucket.

\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n \n

We recommend that you use HeadBucket to return the Region\n that a bucket resides in. For backward compatibility, Amazon S3 continues to support\n GetBucketLocation.

\n
\n

The following operations are related to GetBucketLocation:

\n ", + "smithy.api#examples": [ + { + "title": "To get bucket location", + "documentation": "The following example returns bucket location.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "LocationConstraint": "us-west-2" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?location", @@ -20273,6 +20381,18 @@ }, "traits": { "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", + "smithy.api#examples": [ + { + "title": "To get bucket policy", + "documentation": "The following example returns bucket policy associated with a bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Policy": "{\"Version\":\"2008-10-17\",\"Id\":\"LogPolicy\",\"Statement\":[{\"Sid\":\"Enables the log delivery group to publish logs to your bucket \",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"111122223333\"},\"Action\":[\"s3:GetBucketAcl\",\"s3:GetObjectAcl\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::policytest1/*\",\"arn:aws:s3:::policytest1\"]}]}" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?policy", @@ -20389,6 +20509,30 @@ }, "traits": { "smithy.api#documentation": "

Returns the replication configuration of a bucket.

\n \n

It can take a while to propagate the put or delete a replication configuration to\n all Amazon S3 systems. Therefore, a get request soon after put or delete can return a wrong\n result.

\n
\n

For information about replication configuration, see Replication in the\n Amazon S3 User Guide.

\n

This action requires permissions for the s3:GetReplicationConfiguration\n action. For more information about permissions, see Using Bucket Policies and User\n Policies.

\n

If you include the Filter element in a replication configuration, you must\n also include the DeleteMarkerReplication and Priority elements.\n The response also returns those elements.

\n

For information about GetBucketReplication errors, see List of\n replication-related error codes\n

\n

The following operations are related to GetBucketReplication:

\n ", + "smithy.api#examples": [ + { + "title": "To get replication configuration set on a bucket", + "documentation": "The following example returns replication configuration set on a bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "ReplicationConfiguration": { + "Rules": [ + { + "Status": "Enabled", + "Prefix": "Tax", + "Destination": { + "Bucket": "arn:aws:s3:::destination-bucket" + }, + "ID": "MWIwNTkwZmItMTE3MS00ZTc3LWJkZDEtNzRmODQwYzc1OTQy" + } + ], + "Role": "arn:aws:iam::acct-id:role/example-role" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?replication", @@ -20446,6 +20590,18 @@ }, "traits": { "smithy.api#documentation": "

Returns the request payment configuration of a bucket. To use this version of the\n operation, you must be the bucket owner. For more information, see Requester Pays\n Buckets.

\n

The following operations are related to GetBucketRequestPayment:

\n ", + "smithy.api#examples": [ + { + "title": "To get bucket versioning configuration", + "documentation": "The following example retrieves bucket versioning configuration.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Payer": "BucketOwner" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?requestPayment", @@ -20504,6 +20660,27 @@ }, "traits": { "smithy.api#documentation": "

Returns the tag set associated with the bucket.

\n

To use this operation, you must have permission to perform the\n s3:GetBucketTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

\n GetBucketTagging has the following special error:

\n
    \n
  • \n

    Error code: NoSuchTagSet\n

    \n
      \n
    • \n

      Description: There is no tag set associated with the bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to GetBucketTagging:

\n ", + "smithy.api#examples": [ + { + "title": "To get tag set associated with a bucket", + "documentation": "The following example returns tag set associated with a bucket", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "TagSet": [ + { + "Value": "value1", + "Key": "key1" + }, + { + "Value": "value2", + "Key": "key2" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?tagging", @@ -20563,6 +20740,19 @@ }, "traits": { "smithy.api#documentation": "

Returns the versioning state of a bucket.

\n

To retrieve the versioning state of a bucket, you must be the bucket owner.

\n

This implementation also returns the MFA Delete status of the versioning state. If the\n MFA Delete status is enabled, the bucket owner must use an authentication\n device to change the versioning state of the bucket.

\n

The following operations are related to GetBucketVersioning:

\n ", + "smithy.api#examples": [ + { + "title": "To get bucket versioning configuration", + "documentation": "The following example retrieves bucket versioning configuration.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Status": "Enabled", + "MFADelete": "Disabled" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?versioning", @@ -20628,6 +20818,23 @@ }, "traits": { "smithy.api#documentation": "

Returns the website configuration for a bucket. To host website on Amazon S3, you can\n configure a bucket as website by adding a website configuration. For more information about\n hosting websites, see Hosting Websites on Amazon S3.

\n

This GET action requires the S3:GetBucketWebsite permission. By default,\n only the bucket owner can read the bucket website configuration. However, bucket owners can\n allow other users to read the website configuration by writing a bucket policy granting\n them the S3:GetBucketWebsite permission.

\n

The following operations are related to GetBucketWebsite:

\n ", + "smithy.api#examples": [ + { + "title": "To get bucket website configuration", + "documentation": "The following example retrieves website configuration of a bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "IndexDocument": { + "Suffix": "index.html" + }, + "ErrorDocument": { + "Key": "error.html" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?website", @@ -20743,6 +20950,56 @@ ], "traits": { "smithy.api#documentation": "

Returns the access control list (ACL) of an object. To use this operation, you must have\n s3:GetObjectAcl permissions or READ_ACP access to the object.\n For more information, see Mapping of ACL permissions and access policy permissions in the Amazon S3\n User Guide\n

\n

This action is not supported by Amazon S3 on Outposts.

\n

By default, GET returns ACL information about the current version of an object. To\n return ACL information about a different version, use the versionId subresource.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership,\n requests to read ACLs are still supported and return the\n bucket-owner-full-control ACL with the owner being the account that\n created the bucket. For more information, see Controlling object\n ownership and disabling ACLs in the\n Amazon S3 User Guide.

\n
\n

The following operations are related to GetObjectAcl:

\n ", + "smithy.api#examples": [ + { + "title": "To retrieve object ACL", + "documentation": "The following example retrieves access control list (ACL) of an object.", + "input": { + "Bucket": "examplebucket", + "Key": "HappyFace.jpg" + }, + "output": { + "Owner": { + "DisplayName": "owner-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Grants": [ + { + "Grantee": { + "Type": "CanonicalUser", + "DisplayName": "owner-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Permission": "WRITE" + }, + { + "Grantee": { + "Type": "CanonicalUser", + "DisplayName": "owner-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Permission": "WRITE_ACP" + }, + { + "Grantee": { + "Type": "CanonicalUser", + "DisplayName": "owner-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Permission": "READ" + }, + { + "Grantee": { + "Type": "CanonicalUser", + "DisplayName": "owner-display-name", + "ID": "852b113eexamplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Permission": "READ_ACP" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?acl", @@ -21713,6 +21970,26 @@ }, "traits": { "smithy.api#documentation": "

Returns the tag-set of an object. You send the GET request against the tagging\n subresource associated with the object.

\n

To use this operation, you must have permission to perform the\n s3:GetObjectTagging action. By default, the GET action returns information\n about current version of an object. For a versioned bucket, you can have multiple versions\n of an object in your bucket. To retrieve tags of any other version, use the versionId query\n parameter. You also need permission for the s3:GetObjectVersionTagging\n action.

\n

By default, the bucket owner has this permission and can grant this permission to\n others.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

The following actions are related to GetObjectTagging:

\n ", + "smithy.api#examples": [ + { + "title": "To retrieve tag set of a specific object version", + "documentation": "The following example retrieves tag set of an object. The request specifies object version.", + "input": { + "Bucket": "examplebucket", + "Key": "exampleobject", + "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + }, + "output": { + "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI", + "TagSet": [ + { + "Value": "Value1", + "Key": "Key1" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?tagging", @@ -21800,6 +22077,17 @@ }, "traits": { "smithy.api#documentation": "

Returns torrent files from a bucket. BitTorrent can save you bandwidth when you're\n distributing large files.

\n \n

You can get torrent only for objects that are less than 5 GB in size, and that are\n not encrypted using server-side encryption with a customer-provided encryption\n key.

\n
\n

To use GET, you must have READ access to the object.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following action is related to GetObjectTorrent:

\n ", + "smithy.api#examples": [ + { + "title": "To retrieve torrent files for an object", + "documentation": "The following example retrieves torrent files of an object.", + "input": { + "Bucket": "examplebucket", + "Key": "HappyFace.jpg" + }, + "output": {} + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?torrent", @@ -22046,6 +22334,15 @@ ], "traits": { "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in place of the\n bucket name or specify the access point ARN. When using the access point ARN, you must direct requests to\n the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", + "smithy.api#examples": [ + { + "title": "To determine if bucket exists", + "documentation": "This operation checks to see if a bucket exists.", + "input": { + "Bucket": "acl1" + } + } + ], "smithy.api#http": { "method": "HEAD", "uri": "/{Bucket}", @@ -23748,6 +24045,32 @@ }, "traits": { "smithy.api#documentation": "

Returns a list of all buckets owned by the authenticated sender of the request. To use\n this operation, you must have the s3:ListAllMyBuckets permission.

\n

For information about Amazon S3 buckets, see Creating, configuring, and\n working with Amazon S3 buckets.

", + "smithy.api#examples": [ + { + "title": "To list all buckets", + "documentation": "The following example returns all the buckets owned by the sender of this request.", + "output": { + "Owner": { + "DisplayName": "own-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31" + }, + "Buckets": [ + { + "CreationDate": "2012-02-15T21:03:02.000Z", + "Name": "examplebucket" + }, + { + "CreationDate": "2011-07-24T19:33:50.000Z", + "Name": "examplebucket2" + }, + { + "CreationDate": "2010-12-17T00:56:49.000Z", + "Name": "examplebucket3" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/", @@ -23969,6 +24292,46 @@ }, "traits": { "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permission to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design\n your application to parse the contents of the response and handle it\n appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", + "smithy.api#examples": [ + { + "title": "To list object versions", + "documentation": "The following example return versions of an object with specific key name prefix. The request limits the number of items returned to two. If there are are more than two object version, S3 returns NextToken in the response. You can specify this token value in your next request to fetch next set of object versions.", + "input": { + "Bucket": "examplebucket", + "Prefix": "HappyFace.jpg" + }, + "output": { + "Versions": [ + { + "LastModified": "2016-12-15T01:19:41.000Z", + "VersionId": "null", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", + "StorageClass": "STANDARD", + "Key": "HappyFace.jpg", + "Owner": { + "DisplayName": "owner-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "IsLatest": true, + "Size": 3191 + }, + { + "LastModified": "2016-12-13T00:58:26.000Z", + "VersionId": "PHtexPGjH2y.zBgT8LmB7wwLI2mpbz.k", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", + "StorageClass": "STANDARD", + "Key": "HappyFace.jpg", + "Owner": { + "DisplayName": "owner-display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "IsLatest": false, + "Size": 3191 + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?versions", @@ -26333,6 +26696,17 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. Specify the canned ACL name as the\n value of x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n the x-amz-acl header to set a canned ACL. These parameters map to the\n set of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants create,\n overwrite, and delete objects permission to LogDelivery group predefined by Amazon S3 and\n two Amazon Web Services accounts identified by their email addresses.

    \n

    \n x-amz-grant-write: uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\",\n id=\"111122223333\", id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", + "smithy.api#examples": [ + { + "title": "Put bucket acl", + "documentation": "The following example replaces existing ACL on a bucket. The ACL grants the bucket owner (specified using the owner ID) and write permission to the LogDelivery group. Because this is a replace operation, you must specify all the grants in your request. To incrementally add or remove ACL grants, you might use the console.", + "input": { + "Bucket": "examplebucket", + "GrantFullControl": "id=examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484", + "GrantWrite": "uri=http://acs.amazonaws.com/groups/s3/LogDelivery" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?acl", @@ -26504,6 +26878,49 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the cors configuration for your bucket. If the configuration exists,\n Amazon S3 replaces it.

\n

To use this operation, you must be allowed to perform the s3:PutBucketCORS\n action. By default, the bucket owner has this permission and can grant it to others.

\n

You set this configuration on a bucket so that the bucket can service cross-origin\n requests. For example, you might want to enable a request whose origin is\n http://www.example.com to access your Amazon S3 bucket at\n my.example.bucket.com by using the browser's XMLHttpRequest\n capability.

\n

To enable cross-origin resource sharing (CORS) on a bucket, you add the\n cors subresource to the bucket. The cors subresource is an XML\n document in which you configure rules that identify origins and the HTTP methods that can\n be executed on your bucket. The document is limited to 64 KB in size.

\n

When Amazon S3 receives a cross-origin request (or a pre-flight OPTIONS request) against a\n bucket, it evaluates the cors configuration on the bucket and uses the first\n CORSRule rule that matches the incoming browser request to enable a\n cross-origin request. For a rule to match, the following conditions must be met:

\n
    \n
  • \n

    The request's Origin header must match AllowedOrigin\n elements.

    \n
  • \n
  • \n

    The request method (for example, GET, PUT, HEAD, and so on) or the\n Access-Control-Request-Method header in case of a pre-flight\n OPTIONS request must be one of the AllowedMethod\n elements.

    \n
  • \n
  • \n

    Every header specified in the Access-Control-Request-Headers request\n header of a pre-flight request must match an AllowedHeader element.\n

    \n
  • \n
\n

For more information about CORS, go to Enabling Cross-Origin Resource Sharing in\n the Amazon S3 User Guide.

\n

The following operations are related to PutBucketCors:

\n ", + "smithy.api#examples": [ + { + "title": "To set cors configuration on a bucket.", + "documentation": "The following example enables PUT, POST, and DELETE requests from www.example.com, and enables GET requests from any domain.", + "input": { + "Bucket": "", + "CORSConfiguration": { + "CORSRules": [ + { + "AllowedOrigins": [ + "http://www.example.com" + ], + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "PUT", + "POST", + "DELETE" + ], + "MaxAgeSeconds": 3000, + "ExposeHeaders": [ + "x-amz-server-side-encryption" + ] + }, + { + "AllowedOrigins": [ + "*" + ], + "AllowedHeaders": [ + "Authorization" + ], + "AllowedMethods": [ + "GET" + ], + "MaxAgeSeconds": 3000 + } + ] + }, + "ContentMD5": "" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?cors", @@ -26756,6 +27173,35 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3 Lifecycle\n configuration can have up to 1,000 rules. This limit is not adjustable. Each rule consists\n of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The filter can\n be based on a key name prefix, object tags, or a combination of both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want Amazon S3 to\n perform on the objects identified by the filter. If the state of your bucket is\n versioning-enabled or versioning-suspended, you can have many versions of the same\n object (one current version and zero or more noncurrent versions). Amazon S3 provides\n predefined actions that you can specify for current and noncurrent object\n versions.

    \n
  • \n
\n

For more information, see Object Lifecycle Management\n and Lifecycle Configuration Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and related\n subresources (for example, lifecycle configuration and website configuration). Only the\n resource owner (that is, the Amazon Web Services account that created it) can access the resource. The\n resource owner can optionally grant access permissions to others by writing an access\n policy. For this operation, a user must get the s3:PutLifecycleConfiguration\n permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any other\n permissions. If you want to block users or accounts from removing or deleting objects from\n your bucket, you must deny them permissions for the following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access Permissions to\n Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to PutBucketLifecycleConfiguration:

\n ", + "smithy.api#examples": [ + { + "title": "Put bucket lifecycle", + "documentation": "The following example replaces existing lifecycle configuration, if any, on the specified bucket. ", + "input": { + "Bucket": "examplebucket", + "LifecycleConfiguration": { + "Rules": [ + { + "Filter": { + "Prefix": "documents/" + }, + "Status": "Enabled", + "Transitions": [ + { + "Days": 365, + "StorageClass": "GLACIER" + } + ], + "Expiration": { + "Days": 3650 + }, + "ID": "TestOnly" + } + ] + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?lifecycle", @@ -26818,6 +27264,30 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GETObjectAcl\n request, appears as the CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request elements. To disable\n logging, you use an empty BucketLoggingStatus request element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", + "smithy.api#examples": [ + { + "title": "Set logging configuration for a bucket", + "documentation": "The following example sets logging policy on a bucket. For the Log Delivery group to deliver logs to the destination bucket, it needs permission for the READ_ACP action which the policy grants.", + "input": { + "Bucket": "sourcebucket", + "BucketLoggingStatus": { + "LoggingEnabled": { + "TargetBucket": "targetbucket", + "TargetPrefix": "MyBucketLogs/", + "TargetGrants": [ + { + "Grantee": { + "Type": "Group", + "URI": "http://acs.amazonaws.com/groups/global/AllUsers" + }, + "Permission": "READ" + } + ] + } + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?logging", @@ -26944,6 +27414,25 @@ }, "traits": { "smithy.api#documentation": "

Enables notifications of specified events for a bucket. For more information about event\n notifications, see Configuring Event\n Notifications.

\n

Using this API, you can replace an existing notification configuration. The\n configuration is an XML file that defines the event types that you want Amazon S3 to publish and\n the destination where you want Amazon S3 to publish an event notification when it detects an\n event of the specified type.

\n

By default, your bucket has no event notifications configured. That is, the notification\n configuration will be an empty NotificationConfiguration.

\n

\n \n

\n

\n \n

\n

This action replaces the existing notification configuration with the configuration you\n include in the request body.

\n

After Amazon S3 receives this request, it first verifies that any Amazon Simple Notification\n Service (Amazon SNS) or Amazon Simple Queue Service (Amazon SQS) destination exists, and\n that the bucket owner has permission to publish to it by sending a test notification. In\n the case of Lambda destinations, Amazon S3 verifies that the Lambda function permissions\n grant Amazon S3 permission to invoke the function from the Amazon S3 bucket. For more information,\n see Configuring Notifications for Amazon S3 Events.

\n

You can disable notifications by adding the empty NotificationConfiguration\n element.

\n

For more information about the number of event notification configurations that you can\n create per bucket, see Amazon S3 service quotas in Amazon Web Services\n General Reference.

\n

By default, only the bucket owner can configure notifications on a bucket. However,\n bucket owners can use a bucket policy to grant permission to other users to set this\n configuration with the required s3:PutBucketNotification permission.

\n \n

The PUT notification is an atomic operation. For example, suppose your notification\n configuration includes SNS topic, SQS queue, and Lambda function configurations. When\n you send a PUT request with this configuration, Amazon S3 sends test messages to your SNS\n topic. If the message fails, the entire PUT action will fail, and Amazon S3 will not add the\n configuration to your bucket.

\n
\n

If the configuration in the request body includes only one\n TopicConfiguration specifying only the\n s3:ReducedRedundancyLostObject event type, the response will also include\n the x-amz-sns-test-message-id header containing the message ID of the test\n notification sent to the topic.

\n

The following action is related to\n PutBucketNotificationConfiguration:

\n ", + "smithy.api#examples": [ + { + "title": "Set notification configuration for a bucket", + "documentation": "The following example sets notification configuration on a bucket to publish the object created events to an SNS topic.", + "input": { + "Bucket": "examplebucket", + "NotificationConfiguration": { + "TopicConfigurations": [ + { + "TopicArn": "arn:aws:sns:us-west-2:123456789012:s3-notification-topic", + "Events": [ + "s3:ObjectCreated:*" + ] + } + ] + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?notification", @@ -27069,6 +27558,16 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", + "smithy.api#examples": [ + { + "title": "Set bucket policy", + "documentation": "The following example sets a permission policy on a bucket.", + "input": { + "Bucket": "examplebucket", + "Policy": "{\"Version\": \"2012-10-17\", \"Statement\": [{ \"Sid\": \"id-1\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"arn:aws:iam::123456789012:root\"}, \"Action\": [ \"s3:PutObject\",\"s3:PutObjectAcl\"], \"Resource\": [\"arn:aws:s3:::acl3/*\" ] } ]}" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?policy", @@ -27146,6 +27645,28 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using server-side\n encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\n SourceSelectionCriteria, SseKmsEncryptedObjects,\n Status, EncryptionConfiguration, and\n ReplicaKmsKeyID. For information about replication configuration, see\n Replicating Objects\n Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the bucket,\n can perform this operation. The resource owner can also grant others permissions to perform\n the operation. For more information about permissions, see Specifying Permissions in a\n Policy and Managing Access Permissions to\n Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have the\n iam:PassRole permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", + "smithy.api#examples": [ + { + "title": "Set replication configuration on a bucket", + "documentation": "The following example sets replication configuration on a bucket.", + "input": { + "Bucket": "examplebucket", + "ReplicationConfiguration": { + "Role": "arn:aws:iam::123456789012:role/examplerole", + "Rules": [ + { + "Prefix": "", + "Status": "Enabled", + "Destination": { + "Bucket": "arn:aws:s3:::destinationbucket", + "StorageClass": "STANDARD" + } + } + ] + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?replication", @@ -27222,6 +27743,18 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the request payment configuration for a bucket. By default, the bucket owner pays\n for downloads from the bucket. This configuration parameter enables the bucket owner (only)\n to specify that the person requesting the download will be charged for the download. For\n more information, see Requester Pays\n Buckets.

\n

The following operations are related to PutBucketRequestPayment:

\n ", + "smithy.api#examples": [ + { + "title": "Set request payment configuration on a bucket.", + "documentation": "The following example sets request payment configuration on a bucket so that person requesting the download is charged.", + "input": { + "Bucket": "examplebucket", + "RequestPaymentConfiguration": { + "Payer": "Requester" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?requestPayment", @@ -27292,6 +27825,27 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3 Bucket\n Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors:

\n
    \n
  • \n

    Error code: InvalidTagError\n

    \n \n
  • \n
  • \n

    Error code: MalformedXMLError\n

    \n
      \n
    • \n

      Description: The XML provided does not match the schema.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: OperationAbortedError \n

    \n
      \n
    • \n

      Description: A conflicting conditional action is currently in progress\n against this resource. Please try again.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InternalError\n

    \n
      \n
    • \n

      Description: The service was unable to apply the provided tag to the\n bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", + "smithy.api#examples": [ + { + "title": "Set tags on a bucket", + "documentation": "The following example sets tags on a bucket. Any existing tags are replaced.", + "input": { + "Bucket": "examplebucket", + "Tagging": { + "TagSet": [ + { + "Key": "Key1", + "Value": "Value1" + }, + { + "Key": "Key2", + "Value": "Value2" + } + ] + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?tagging", @@ -27362,6 +27916,19 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket and\n you want to maintain the same permanent delete behavior when you enable versioning, you\n must add a noncurrent expiration policy. The noncurrent expiration lifecycle configuration will\n manage the deletes of the noncurrent object versions in the version-enabled bucket. (A\n version-enabled bucket maintains one current and zero or more noncurrent object\n versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", + "smithy.api#examples": [ + { + "title": "Set versioning configuration on a bucket", + "documentation": "The following example sets versioning configuration on bucket. The configuration enables versioning on the bucket.", + "input": { + "Bucket": "examplebucket", + "VersioningConfiguration": { + "MFADelete": "Disabled", + "Status": "Enabled" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?versioning", @@ -27439,6 +28006,24 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

", + "smithy.api#examples": [ + { + "title": "Set website configuration on a bucket", + "documentation": "The following example adds website configuration to a bucket.", + "input": { + "Bucket": "examplebucket", + "ContentMD5": "", + "WebsiteConfiguration": { + "IndexDocument": { + "Suffix": "index.html" + }, + "ErrorDocument": { + "Key": "error.html" + } + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?website", @@ -27508,6 +28093,24 @@ "requestAlgorithmMember": "ChecksumAlgorithm" }, "smithy.api#documentation": "

Adds an object to a bucket. You must have WRITE permissions on a bucket to add an object\n to it.

\n \n

Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the\n entire object to the bucket. You cannot use PutObject to only update a\n single piece of metadata for an existing object. You must put the entire object with\n updated metadata if you want to update some values.

\n
\n

Amazon S3 is a distributed system. If it receives multiple write requests for the same object\n simultaneously, it overwrites all but the last object written. To prevent objects from\n being deleted or overwritten, you can use Amazon S3 Object\n Lock.

\n

To ensure that data is not corrupted traversing the network, use the\n Content-MD5 header. When you use this header, Amazon S3 checks the object\n against the provided MD5 value and, if they do not match, returns an error. Additionally,\n you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to\n the calculated MD5 value.

\n \n
    \n
  • \n

    To successfully complete the PutObject request, you must have the\n s3:PutObject in your IAM permissions.

    \n
  • \n
  • \n

    To successfully change the objects acl of your PutObject request,\n you must have the s3:PutObjectAcl in your IAM permissions.

    \n
  • \n
  • \n

    To successfully set the tag-set with your PutObject request, you\n must have the s3:PutObjectTagging in your IAM permissions.

    \n
  • \n
  • \n

    The Content-MD5 header is required for any request to upload an\n object with a retention period configured using Amazon S3 Object Lock. For more\n information about Amazon S3 Object Lock, see Amazon S3 Object Lock\n Overview in the Amazon S3 User Guide.

    \n
  • \n
\n
\n

You have four mutually exclusive options to protect data using server-side encryption in\n Amazon S3, depending on how you choose to manage the encryption keys. Specifically, the\n encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with server-side\n encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to\n encrypt data at rest by using server-side encryption with other key options. For more\n information, see Using Server-Side\n Encryption.

\n

When adding a new object, you can use headers to grant ACL-based permissions to\n individual Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are\n then added to the ACL on the object. By default, all objects are private. Only the owner\n has full access control. For more information, see Access Control List (ACL) Overview\n and Managing\n ACLs Using the REST API.

\n

If the bucket that you're uploading objects to uses the bucket owner enforced setting\n for S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that\n use this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format. PUT requests that\n contain other ACLs (for example, custom grants to certain Amazon Web Services accounts) fail and return a\n 400 error with the error code AccessControlListNotSupported.\n For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID\n for the object being stored. Amazon S3 returns this ID in the response. When you enable\n versioning for a bucket, if Amazon S3 receives multiple write requests for the same object\n simultaneously, it stores all of the objects. For more information about versioning, see\n Adding Objects to\n Versioning-Enabled Buckets. For information about returning the versioning state\n of a bucket, see GetBucketVersioning.

\n

For more information about related Amazon S3 APIs, see the following:

\n ", + "smithy.api#examples": [ + { + "title": "To upload an object (specify optional headers)", + "documentation": "The following example uploads an object. The request specifies optional request headers to directs S3 to use specific storage class and use server-side encryption.", + "input": { + "Body": "HappyFace.jpg", + "Bucket": "examplebucket", + "Key": "HappyFace.jpg", + "ServerSideEncryption": "AES256", + "StorageClass": "STANDARD_IA" + }, + "output": { + "VersionId": "CG612hodqujkf8FaaNfp8U..FIhLROcp", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", + "ServerSideEncryption": "AES256" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=PutObject", @@ -27534,6 +28137,20 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined set\n of grantees and permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n x-amz-acl header to set a canned ACL. These parameters map to the set\n of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants list\n objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets the ACL of\n the current version of an object. To set the ACL of a different version, use the\n versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", + "smithy.api#examples": [ + { + "title": "To grant permissions using object ACL", + "documentation": "The following example adds grants to an object ACL. The first permission grants user1 and user2 FULL_CONTROL and the AllUsers group READ permission.", + "input": { + "AccessControlPolicy": {}, + "Bucket": "examplebucket", + "GrantFullControl": "emailaddress=user1@example.com,emailaddress=user2@example.com", + "GrantRead": "uri=http://acs.amazonaws.com/groups/global/AllUsers", + "Key": "HappyFace.jpg" + }, + "output": {} + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?acl", @@ -28372,6 +28989,31 @@ "requestChecksumRequired": true }, "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket.

\n

A tag is a key-value pair. You can associate tags with an object by sending a PUT\n request against the tagging subresource that is associated with the object. You can\n retrieve tags by sending a GET request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

\n PutObjectTagging has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n Code: InvalidTagError \n

      \n
    • \n
    • \n

      \n Cause: The tag provided was not a valid tag. This error can occur\n if the tag did not pass input validation. For more information, see Object\n Tagging.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: MalformedXMLError \n

      \n
    • \n
    • \n

      \n Cause: The XML provided does not match the schema.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: OperationAbortedError \n

      \n
    • \n
    • \n

      \n Cause: A conflicting conditional action is currently in progress\n against this resource. Please try again.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InternalError\n

      \n
    • \n
    • \n

      \n Cause: The service was unable to apply the provided tag to the\n object.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", + "smithy.api#examples": [ + { + "title": "To add tags to an existing object", + "documentation": "The following example adds tags to an existing object.", + "input": { + "Bucket": "examplebucket", + "Key": "HappyFace.jpg", + "Tagging": { + "TagSet": [ + { + "Key": "Key3", + "Value": "Value3" + }, + { + "Key": "Key4", + "Value": "Value4" + } + ] + } + }, + "output": { + "VersionId": "null" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?tagging", @@ -29071,6 +29713,23 @@ "requestAlgorithmMember": "ChecksumAlgorithm" }, "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your\n query in the request body's SelectParameters structure. You can use\n expressions like the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified\n object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object,\n you can specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field\n to IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval or\n S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive storage\n classes, you must first initiate a restore request, and then wait until a temporary copy of\n the object is available. If you want a permanent copy of the object, create a copy of it in\n the Amazon S3 Standard storage class in your S3 bucket. To access an archived object, you must\n restore the object for the duration (number of days) that you specify. For objects in the\n Archive Access or Deep Archive Access tiers of S3 Intelligent-Tiering, you must first\n initiate a restore request, and then wait until the object is moved into the Frequent\n Access tier.

\n

To restore a specific object version, you can provide a version ID. If you don't provide\n a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data access tier\n options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access your\n data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier when occasional urgent requests for restoring archives\n are required. For all but the largest archived objects (250 MB+), data accessed using\n Expedited retrievals is typically made available within 1–5 minutes. Provisioned\n capacity ensures that retrieval capacity for Expedited retrievals is available when\n you need it. Expedited retrievals and provisioned capacity are not available for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of your\n archived objects within several hours. This is the default option for retrieval\n requests that do not specify the retrieval option. Standard retrievals typically\n finish within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval Flexible\n Retrieval storage class or S3 Intelligent-Tiering Archive tier. They typically finish within\n 12 hours for objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored in\n S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the S3 Glacier\n Flexible Retrieval and S3 Intelligent-Tiering storage classes, enabling you to\n retrieve large amounts, even petabytes, of data at no cost. Bulk retrievals typically\n finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval\n Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are\n also the lowest-cost retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for objects\n stored in the S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive\n tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity for\n Expedited data access, see Restoring Archived Objects in\n the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster speed\n while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD request.\n Operations return the x-amz-restore header, which provides information about\n the restoration status, in the response. You can use Amazon S3 event notifications to notify you\n when a restore is initiated or completed. For more information, see Configuring Amazon S3\n Event Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by reissuing\n the request with a new period. Amazon S3 updates the restoration period relative to the current\n time and charges only for the request-there are no data transfer charges. You cannot\n update the restoration period when Amazon S3 is actively processing your current restore request\n for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an expiration\n action, the object expiration overrides the life span that you specify in a restore\n request. For example, if you restore an object copy for 10 days, but the object is\n scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days. For more information\n about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle Management\n in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202 Accepted\n status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in the\n response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error does not\n apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available. Try again\n later. (Returned if there is insufficient capacity to process the Expedited\n request. This error applies only to Expedited retrievals and not to\n S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", + "smithy.api#examples": [ + { + "title": "To restore an archived object", + "documentation": "The following example restores for one day an archived copy of an object back into Amazon S3 bucket.", + "input": { + "Bucket": "examplebucket", + "Key": "archivedobjectkey", + "RestoreRequest": { + "Days": 1, + "GlacierJobParameters": { + "Tier": "Expedited" + } + } + }, + "output": {} + } + ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?restore&x-id=RestoreObject", diff --git a/aws/sdk/aws-models/s3control.json b/aws/sdk/aws-models/s3control.json index 2944356a967..34dd5ad3475 100644 --- a/aws/sdk/aws-models/s3control.json +++ b/aws/sdk/aws-models/s3control.json @@ -312,148 +312,265 @@ }, "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { "ref": "Region" + }, + "snow" + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" } ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Snow does not support DualStack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 Snow does not support FIPS", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "OutpostId" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "snow" + true ] }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, + { + "conditions": [ { "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "ref": "RequiresAccountId" } ] }, { - "fn": "parseURL", + "fn": "booleanEquals", "argv": [ { - "ref": "Endpoint" + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ], - "assign": "url" + ] } ], - "type": "tree", - "rules": [ + "error": "AccountId is required but not set", + "type": "error" + }, + { + "conditions": [ { - "conditions": [ + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ { - "fn": "aws.partition", + "fn": "isValidHostLabel", "argv": [ { - "ref": "Region" - } - ], - "assign": "partitionResult" + "ref": "AccountId" + }, + false + ] } - ], - "type": "tree", - "rules": [ + ] + } + ], + "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "isValidHostLabel", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Snow does not support Dual-stack", - "type": "error" + "ref": "OutpostId" }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 Snow does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } + false ] } ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" } - ] + ], + "error": "OutpostId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" }, { "conditions": [ { - "fn": "isSet", + "fn": "isValidHostLabel", "argv": [ { - "ref": "OutpostId" - } + "ref": "Region" + }, + true ] } ], @@ -462,318 +579,716 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid configuration: Outposts do not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", "argv": [ { - "ref": "Region" + "ref": "Endpoint" } ], - "assign": "partitionResult" + "assign": "url" } ], - "type": "tree", - "rules": [ + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" + "ref": "UseFIPS" }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccessPointName" + } + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "AccessPointName" + } + ], + "assign": "accessPointArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[0]" + ], + "assign": "arnType" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "service" + ] + }, + "s3-outposts" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid configuration: Outpost Access Points do not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseArnRegion" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", "argv": [ { - "ref": "AccountId" - } + "ref": "accessPointArn" + }, + "region" ] - } + }, + "{Region}" ] } + ] + } + ], + "error": "Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } ], - "error": "AccountId is required but not set", - "type": "error" - }, + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "aws.partition", + "argv": [ { - "fn": "isSet", + "fn": "getAttr", "argv": [ { - "ref": "AccountId" - } + "ref": "accessPointArn" + }, + "region" ] - }, + } + ], + "assign": "arnPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "fn": "not", + "fn": "stringEquals", "argv": [ { - "fn": "isValidHostLabel", + "fn": "getAttr", + "argv": [ + { + "ref": "arnPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", "argv": [ { - "ref": "AccountId" + "ref": "partitionResult" }, - false + "name" ] } ] } ], - "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "not", + "fn": "isValidHostLabel", "argv": [ { - "fn": "isValidHostLabel", + "fn": "getAttr", "argv": [ { - "ref": "OutpostId" + "ref": "accessPointArn" }, - false + "region" ] - } + }, + true ] } ], - "error": "OutpostId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isValidHostLabel", + "fn": "not", "argv": [ { - "ref": "Region" - }, - true + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "accountId" + ] + }, + "" + ] + } ] } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "accountId" + ] + }, + false + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", "argv": [ { - "ref": "UseDualStack" - }, - true + "fn": "stringEquals", + "argv": [ + { + "ref": "AccountId" + }, + "{accessPointArn#accountId}" + ] + } ] } ], - "error": "Invalid configuration: Outposts do not support dual-stack", + "error": "Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)", "type": "error" }, { - "conditions": [], + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[2]" + ], + "assign": "outpostType" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", + "fn": "getAttr", "argv": [ { - "ref": "Endpoint" - } + "ref": "accessPointArn" + }, + "resourceId[3]" ], - "assign": "url" + "assign": "accessPointName" } ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ + "type": "tree", + "rules": [ + { + "conditions": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ + "fn": "stringEquals", + "argv": [ + { + "ref": "outpostType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ { - "ref": "UseFIPS" + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" } ] }, - "headers": {} - }, - "type": "endpoint" + { + "conditions": [], + "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", + "type": "error" + } + ] }, { "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid ARN: expected an access point name", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a 4-component resource", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", + "type": "error" } ] }, { "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", + "error": "Invalid ARN: missing account ID", "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", + "type": "error" } ] } ] } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "type": "error" } ] }, { "conditions": [], - "error": "A valid partition could not be determined", + "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "bucketArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[0]" + ], + "assign": "arnType" }, { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "AccessPointName" - } + "ref": "arnType" + }, + "" ] - }, + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "fn": "aws.parseArn", + "fn": "stringEquals", "argv": [ { - "ref": "AccessPointName" - } - ], - "assign": "accessPointArn" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-outposts" + ] } ], "type": "tree", @@ -781,28 +1296,29 @@ { "conditions": [ { - "fn": "getAttr", + "fn": "booleanEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "UseDualStack" }, - "resourceId[0]" - ], - "assign": "arnType" - }, + true + ] + } + ], + "error": "Invalid configuration: Outpost buckets do not support dual-stack", + "type": "error" + }, + { + "conditions": [ { - "fn": "not", + "fn": "getAttr", "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" } ], "type": "tree", @@ -810,18 +1326,12 @@ { "conditions": [ { - "fn": "stringEquals", + "fn": "isValidHostLabel", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "service" - ] + "ref": "outpostId" }, - "s3-outposts" + false ] } ], @@ -829,40 +1339,107 @@ "rules": [ { "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "UseArnRegion" }, - true + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] + } ] } ], - "error": "Invalid configuration: Outpost Access Points do not support dual-stack", + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", "type": "error" }, { - "conditions": [], + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + } + ], + "assign": "arnPartition" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "getAttr", + "fn": "aws.partition", "argv": [ { - "ref": "accessPointArn" - }, - "resourceId[1]" + "ref": "Region" + } ], - "assign": "outpostId" + "assign": "partitionResult" } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "arnPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], "type": "tree", "rules": [ { @@ -871,522 +1448,439 @@ "fn": "isValidHostLabel", "argv": [ { - "ref": "outpostId" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] }, - false + true ] } ], "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "UseArnRegion" - } + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + "" ] - }, + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "fn": "booleanEquals", + "fn": "isValidHostLabel", "argv": [ { - "ref": "UseArnRegion" - }, + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, false ] - }, + } + ], + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "fn": "getAttr", + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "AccountId" }, - "region" + "{bucketArn#accountId}" ] - }, - "{Region}" + } ] } - ] - } - ], - "error": "Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ + ], + "error": "Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)", + "type": "error" + }, { "conditions": [ { - "fn": "aws.partition", + "fn": "getAttr", "argv": [ { - "ref": "Region" - } + "ref": "bucketArn" + }, + "resourceId[2]" ], - "assign": "partitionResult" + "assign": "outpostType" } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[3]" + ], + "assign": "bucketName" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "fn": "getAttr", + "ref": "outpostType" + }, + "bucket" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "UseFIPS" }, - "region" + true ] } ], - "assign": "arnPartition" - } - ], - "type": "tree", - "rules": [ + "endpoint": { + "url": "https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, { - "conditions": [ + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "arnPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" ], - "type": "tree", - "rules": [ + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "accountId" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "AccountId" - }, - "{accessPointArn#accountId}" - ] - } - ] - } - ], - "error": "Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "resourceId[3]" - ], - "assign": "accessPointName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected an access point name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: missing account ID", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", - "type": "error" - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" } ] }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", - "type": "error" + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] } - ] + }, + "type": "endpoint" } ] }, { "conditions": [], - "error": "Could not load partition for ARN region `{accessPointArn#region}`", + "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: expected a bucket name", + "type": "error" } ] }, { "conditions": [], - "error": "A valid partition could not be determined", + "error": "Invalid ARN: Expected a 4-component resource", "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: missing account ID", + "type": "error" } ] }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", "type": "error" } ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", + "type": "error" } ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" } ] } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "type": "error" } ] }, { "conditions": [], - "error": "Invalid ARN: No ARN type specified", + "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ] + } + ], + "error": "AccountId is required but not set", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "AccountId" + }, + false + ] + } + ] + } + ], + "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" }, { "conditions": [ @@ -1394,18 +1888,18 @@ "fn": "isSet", "argv": [ { - "ref": "Bucket" + "ref": "Endpoint" } ] }, { - "fn": "aws.parseArn", + "fn": "parseURL", "argv": [ { - "ref": "Bucket" + "ref": "Endpoint" } ], - "assign": "bucketArn" + "assign": "url" } ], "type": "tree", @@ -1413,1304 +1907,493 @@ { "conditions": [ { - "fn": "getAttr", + "fn": "booleanEquals", "argv": [ { - "ref": "bucketArn" + "ref": "UseDualStack" }, - "resourceId[0]" - ], - "assign": "arnType" + true + ] + } + ], + "error": "Invalid Configuration: DualStack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] }, { - "fn": "not", + "fn": "booleanEquals", "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [ + "endpoint": { + "url": "{url#scheme}://{AccountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-outposts" - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid configuration: Outpost buckets do not support dual-stack", - "type": "error" - }, + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "outpostId" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "outpostId" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "arnPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "arnPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "AccountId" - }, - "{bucketArn#accountId}" - ] - } - ] - } - ], - "error": "Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[3]" - ], - "assign": "bucketName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "bucket" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected a bucket name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: missing account ID", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" } ] }, { - "conditions": [], - "error": "Invalid ARN: No ARN type specified", - "type": "error" + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ] + ], + "endpoint": { + "url": "https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } - ], - "type": "tree", - "rules": [ + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ] - } - ], - "error": "AccountId is required but not set", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "AccountId" - }, - false - ] - } - ] - } - ], - "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{AccountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-control.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" } ] }, { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ] + ], + "endpoint": { + "url": "https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-control.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" } ] - }, - { - "conditions": [], - "error": "Region must be set", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Region must be set", + "type": "error" } ] }, @@ -3487,7 +3170,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -3527,7 +3209,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -3565,7 +3246,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "Region": "us-east-2", "RequiresAccountId": false, "UseDualStack": false, @@ -3596,14 +3276,13 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", - "Operation": "ListRegionalBuckets", + "AccountId": "123456789012", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -3625,7 +3304,7 @@ } ] }, - "url": "https://123.s3-control.us-east-2.amazonaws.com" + "url": "https://123456789012.s3-control.us-east-2.amazonaws.com" } }, "operationInputs": [ @@ -3635,13 +3314,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "123", - "Operation": "ListRegionalBuckets", + "AccountId": "123456789012", "Region": "us-east-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3673,14 +3351,13 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", - "Operation": "CreateBucket", + "AccountId": "123456789012", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -3847,7 +3524,7 @@ { "documentation": "Account ID set inline and in ARN and they do not match@us-west-2", "expect": { - "error": "Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`9999999`)" + "error": "Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`999999999999`)" }, "operationInputs": [ { @@ -3857,14 +3534,14 @@ }, "operationName": "GetAccessPoint", "operationParams": { - "AccountId": "9999999", + "AccountId": "999999999999", "Name": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint" } } ], "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", - "AccountId": "9999999", + "AccountId": "999999999999", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": false, @@ -3906,7 +3583,6 @@ "AccessPointName": "apname", "AccountId": "123456789012", "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3955,7 +3631,6 @@ "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3970,7 +3645,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3985,7 +3659,6 @@ "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -4012,7 +3685,6 @@ "params": { "Bucket": "bucketname", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-west-2", "RequiresAccountId": false, @@ -4053,14 +3725,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -4092,15 +3764,14 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", + "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -4134,15 +3805,14 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", + "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -4184,7 +3854,6 @@ "params": { "Bucket": "blah", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -4200,7 +3869,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -4215,7 +3883,6 @@ "params": { "Bucket": "bucketname", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-west-2", "RequiresAccountId": false, @@ -4256,7 +3923,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4300,7 +3968,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4344,7 +4013,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4389,7 +4059,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4434,7 +4105,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4492,7 +4164,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4536,7 +4209,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4580,7 +4254,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4625,7 +4300,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4670,7 +4346,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4728,7 +4405,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4772,7 +4450,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4816,7 +4495,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4861,7 +4541,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4906,7 +4587,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -5072,11 +4754,11 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.us-east-1.amazonaws.com" } }, "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5217,7 +4899,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5227,12 +4909,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5277,7 +4959,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5288,12 +4970,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5314,7 +4996,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.dualstack.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.dualstack.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5326,12 +5008,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": true, @@ -5352,7 +5034,7 @@ } ] }, - "url": "https://1234567890-aBC.example.com" + "url": "https://123456789012.example.com" } }, "operationInputs": [ @@ -5363,12 +5045,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "Endpoint": "https://example.com" @@ -5420,7 +5102,7 @@ } }, { - "documentation": "account id with custom endpoint, fips and dualstack", + "documentation": "account id with custom endpoint, fips", "expect": { "endpoint": { "properties": { @@ -5433,7 +5115,7 @@ } ] }, - "url": "https://1234567890-aBC.example.com" + "url": "https://123456789012.example.com" } }, "operationInputs": [ @@ -5445,21 +5127,20 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": true + "UseFIPS": true } }, { - "documentation": "custom endpoint, fips and dualstack", + "documentation": "custom endpoint, fips", "expect": { "endpoint": { "properties": { @@ -5478,8 +5159,7 @@ "params": { "Region": "us-east-1", "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": true + "UseFIPS": true } }, { @@ -5502,32 +5182,19 @@ "params": { "Region": "us-east-1", "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": false + "UseFIPS": true } }, { - "documentation": "custom endpoint, dualstack", + "documentation": "custom endpoint, DualStack", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1", - "disableDoubleEncoding": true - } - ] - }, - "url": "https://example.com" - } + "error": "Invalid Configuration: DualStack and custom endpoint are not supported" }, "params": { "Region": "us-east-1", "Endpoint": "https://example.com", "UseFIPS": false, - "UseDualstack": true + "UseDualStack": true } }, { @@ -5551,7 +5218,6 @@ "error": "AccountId is required but not set" }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -5578,7 +5244,6 @@ ], "params": { "AccountId": "/?invalid¬-host*label", - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -5659,7 +5324,6 @@ "AccessPointName": "apname", "Endpoint": "https://beta.example.com", "AccountId": "123456789012", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -5694,7 +5358,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -5702,9 +5365,9 @@ } }, { - "documentation": "Dualstack + Custom endpoint is not supported(non-arn)", + "documentation": "DualStack + Custom endpoint is not supported(non-arn)", "expect": { - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + "error": "Invalid Configuration: DualStack and custom endpoint are not supported" }, "operationInputs": [ { @@ -5724,7 +5387,6 @@ "AccessPointName": "apname", "Endpoint": "https://beta.example.com", "AccountId": "123456789012", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -5745,14 +5407,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -5779,7 +5441,6 @@ ], "params": { "AccountId": "0123456789012", - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "cn-north-1", "RequiresAccountId": true, @@ -5806,7 +5467,6 @@ ], "params": { "AccountId": "0123456789012", - "Operation": "ListRegionalBuckets", "OutpostId": "?outpost/invalid+", "Region": "us-west-1", "RequiresAccountId": true, @@ -5834,7 +5494,6 @@ "error": "Invalid region: region was not a valid DNS name." }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "invalid-region 42", "AccountId": "0123456", @@ -5861,7 +5520,6 @@ } }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-west-2", "UseDualStack": false, @@ -5921,14 +5579,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": false, @@ -6024,7 +5682,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -6049,13 +5708,13 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": true, @@ -6284,22 +5943,20 @@ "Bucket": "bucketName", "Endpoint": "https://10.0.1.12:433", "UseFIPS": true, - "UseDualStack": false, - "Accelerate": false + "UseDualStack": false } }, { - "documentation": "S3 Snow Control with Dual-stack enabled", + "documentation": "S3 Snow Control with Dualstack enabled", "expect": { - "error": "S3 Snow does not support Dual-stack" + "error": "S3 Snow does not support DualStack" }, "params": { "Region": "snow", "Bucket": "bucketName", "Endpoint": "https://10.0.1.12:433", "UseFIPS": false, - "UseDualStack": true, - "Accelerate": false + "UseDualStack": true } } ], @@ -7058,6 +6715,9 @@ "smithy.api#documentation": "

The alias of the Object Lambda Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateAccessPointRequest": { @@ -7131,6 +6791,9 @@ "smithy.api#documentation": "

The name or alias of the access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateBucket": { @@ -7276,6 +6939,9 @@ "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the bucket.

\n

For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.

\n

For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must specify the ARN of the bucket accessed in the format arn:aws:s3-outposts:::outpost//bucket/. For example, to access the bucket reports through Outpost my-outpost owned by account 123456789012 in Region us-west-2, use the URL encoding of arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports. The value must be URL encoded.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateJob": { @@ -7414,6 +7080,9 @@ "smithy.api#documentation": "

The ID for this job. Amazon S3 generates this ID automatically and returns it after a\n successful Create Job request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateMultiRegionAccessPoint": { @@ -7511,6 +7180,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreationDate": { @@ -8098,7 +7770,10 @@ }, "com.amazonaws.s3control#DeleteJobTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#DeleteMarkerReplication": { "type": "structure", @@ -8217,6 +7892,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#DeletePublicAccessBlock": { @@ -8372,7 +8050,10 @@ }, "com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#DescribeJob": { "type": "operation", @@ -8450,6 +8131,9 @@ "smithy.api#documentation": "

Contains the configuration parameters and status for the job specified in the\n Describe Job request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#DescribeMultiRegionAccessPointOperation": { @@ -8515,6 +8199,9 @@ "smithy.api#documentation": "

A container element containing the details of the asynchronous operation.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#Destination": { @@ -8851,6 +8538,9 @@ "smithy.api#documentation": "

Object Lambda Access Point configuration document.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointForObjectLambda": { @@ -8933,6 +8623,9 @@ "smithy.api#documentation": "

The alias of the Object Lambda Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicy": { @@ -9022,6 +8715,9 @@ "smithy.api#documentation": "

Object Lambda Access Point resource policy document.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyRequest": { @@ -9064,6 +8760,9 @@ "smithy.api#documentation": "

The access point policy associated with the specified access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyStatus": { @@ -9150,6 +8849,9 @@ "PolicyStatus": { "target": "com.amazonaws.s3control#PolicyStatus" } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyStatusRequest": { @@ -9192,6 +8894,9 @@ "smithy.api#documentation": "

Indicates the current policy status of the specified access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointRequest": { @@ -9285,6 +8990,9 @@ "smithy.api#documentation": "

The Amazon Web Services account ID associated with the S3 bucket associated with this access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucket": { @@ -9377,6 +9085,9 @@ "smithy.api#documentation": "

Container for the lifecycle rule of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketPolicy": { @@ -9444,6 +9155,9 @@ "smithy.api#documentation": "

The policy of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketReplication": { @@ -9511,6 +9225,9 @@ "smithy.api#documentation": "

A container for one or more replication rules. A replication configuration must have at least one rule and you can add up to 100 rules. The maximum size of a\n replication configuration is 128 KB.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketRequest": { @@ -9566,6 +9283,9 @@ "smithy.api#documentation": "

The creation date of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketTagging": { @@ -9634,6 +9354,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketVersioning": { @@ -9708,6 +9431,9 @@ "smithy.api#xmlName": "MfaDelete" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetJobTagging": { @@ -9783,6 +9509,9 @@ "smithy.api#documentation": "

The set of tags associated with the S3 Batch Operations job.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPoint": { @@ -9874,6 +9603,9 @@ "smithy.api#documentation": "

The policy associated with the specified Multi-Region Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatus": { @@ -9936,6 +9668,9 @@ "Established": { "target": "com.amazonaws.s3control#PolicyStatus" } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointRequest": { @@ -9975,6 +9710,9 @@ "smithy.api#documentation": "

A container element containing the details of the requested Multi-Region Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointRoutes": { @@ -10046,6 +9784,9 @@ "smithy.api#documentation": "

The different routes that make up the route configuration. Active routes return a value\n of 100, and passive routes return a value of 0.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetPublicAccessBlock": { @@ -10176,6 +9917,9 @@ "smithy.api#httpPayload": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetStorageLensConfigurationTagging": { @@ -10240,6 +9984,9 @@ "smithy.api#documentation": "

The tags of S3 Storage Lens configuration requested.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GrantFullControl": { @@ -11420,6 +11167,9 @@ "smithy.api#documentation": "

If the list has more access points than can be returned in one call to this API, this field\n contains a continuation token that you can provide in subsequent calls to this API to\n retrieve additional access points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListAccessPointsRequest": { @@ -11482,6 +11232,9 @@ "smithy.api#documentation": "

If the specified bucket has more access points than can be returned in one call to this API,\n this field contains a continuation token that you can provide in subsequent calls to this\n API to retrieve additional access points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListJobs": { @@ -11582,6 +11335,9 @@ "smithy.api#documentation": "

The list of current jobs and jobs that have ended within the last 30 days.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListMultiRegionAccessPoints": { @@ -11665,6 +11421,9 @@ "smithy.api#documentation": "

If the specified bucket has more Multi-Region Access Points than can be returned in one call to this\n action, this field contains a continuation token. You can use this token tin subsequent\n calls to this action to retrieve additional Multi-Region Access Points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListRegionalBuckets": { @@ -11757,6 +11516,9 @@ "smithy.api#documentation": "

\n NextToken is sent when isTruncated is true, which means there\n are more buckets that can be listed. The next list requests to Amazon S3 can be continued with\n this NextToken. NextToken is obfuscated and is not a real\n key.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListStorageLensConfigurationEntry": { @@ -11867,6 +11629,9 @@ "smithy.api#xmlFlattened": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#Location": { @@ -13453,7 +13218,10 @@ }, "com.amazonaws.s3control#PutJobTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#PutMultiRegionAccessPointPolicy": { "type": "operation", @@ -13547,6 +13315,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#PutPublicAccessBlock": { @@ -13731,7 +13502,10 @@ }, "com.amazonaws.s3control#PutStorageLensConfigurationTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#Region": { "type": "structure", @@ -15639,7 +15413,10 @@ }, "com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#SuspendedCause": { "type": "string", @@ -15889,6 +15666,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#UpdateJobStatus": { @@ -15997,6 +15777,9 @@ "smithy.api#documentation": "

The reason that the specified job's status was updated.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#VersioningConfiguration": { diff --git a/aws/sdk/aws-models/sso.json b/aws/sdk/aws-models/sso.json index 4f48553e765..9804c216731 100644 --- a/aws/sdk/aws-models/sso.json +++ b/aws/sdk/aws-models/sso.json @@ -154,6 +154,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#GetRoleCredentialsResponse": { @@ -165,6 +168,9 @@ "smithy.api#documentation": "

The credentials for the role that is assigned to the user.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#InvalidRequestException": { @@ -252,6 +258,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#ListAccountRolesResponse": { @@ -269,6 +278,9 @@ "smithy.api#documentation": "

A paginated response with the list of roles and the next token if more results are\n available.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#ListAccounts": { @@ -335,6 +347,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#ListAccountsResponse": { @@ -352,6 +367,9 @@ "smithy.api#documentation": "

A paginated response with the list of account information and the next token if more\n results are available.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#Logout": { @@ -375,7 +393,7 @@ ], "traits": { "smithy.api#auth": [], - "smithy.api#documentation": "

Removes the locally stored SSO tokens from the client-side cache and sends an API call to\n the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\n session.

\n\n \n

If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\n used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\n More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\n and the corresponding temporary AWS credentials are returned to the client.

\n\n

After user logout, any existing IAM role sessions that were created by using IAM Identity Center\n permission sets continue based on the duration configured in the permission set.\n For more information, see User\n authentications in the IAM Identity Center User\n Guide.

\n
", + "smithy.api#documentation": "

Removes the locally stored SSO tokens from the client-side cache and sends an API call to\n the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\n session.

\n \n

If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\n used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\n More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\n and the corresponding temporary AWS credentials are returned to the client.

\n

After user logout, any existing IAM role sessions that were created by using IAM Identity Center\n permission sets continue based on the duration configured in the permission set.\n For more information, see User\n authentications in the IAM Identity Center User\n Guide.

\n
", "smithy.api#http": { "method": "POST", "uri": "/logout", @@ -395,6 +413,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#MaxResultType": { @@ -513,7 +534,7 @@ "name": "awsssoportal" }, "aws.protocols#restJson1": {}, - "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\n IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\n assigned to them and get federated into the application.

\n\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n\n

This reference guide describes the IAM Identity Center Portal operations that you can call\n programatically and includes detailed information on data types and errors.

\n\n \n

AWS provides SDKs that consist of libraries and sample code for various programming\n languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\n convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\n information about the AWS SDKs, including how to download and install them, see Tools for Amazon Web Services.

\n
", + "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\n IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\n assigned to them and get federated into the application.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

This reference guide describes the IAM Identity Center Portal operations that you can call\n programatically and includes detailed information on data types and errors.

\n \n

AWS provides SDKs that consist of libraries and sample code for various programming\n languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\n convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\n information about the AWS SDKs, including how to download and install them, see Tools for Amazon Web Services.

\n
", "smithy.api#title": "AWS Single Sign-On", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -575,52 +596,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -628,13 +653,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -644,224 +678,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://portal.sso.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://portal.sso.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/aws-models/sts.json b/aws/sdk/aws-models/sts.json index 2942ae47f13..d49956a1f71 100644 --- a/aws/sdk/aws-models/sts.json +++ b/aws/sdk/aws-models/sts.json @@ -655,52 +655,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -708,13 +712,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -724,175 +737,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] }, - { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } - ] - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://sts.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" + "ref": "PartitionResult" }, - { - "conditions": [], - "endpoint": { - "url": "https://sts-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -901,99 +822,142 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsDualStack" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://sts.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" + "endpoint": { + "url": "https://sts-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "type": "tree", - "rules": [ + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "PartitionResult" }, - "aws-global" + "supportsDualStack" ] } - ], - "endpoint": { - "url": "https://sts.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "sts", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [], "endpoint": { - "url": "https://sts.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://sts.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "sts", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://sts.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1701,9 +1665,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1720,10 +1684,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-northeast-1" + "Region": "ap-northeast-1", + "UseGlobalEndpoint": true } }, { @@ -1733,9 +1697,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1752,10 +1716,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-south-1" + "Region": "ap-south-1", + "UseGlobalEndpoint": true } }, { @@ -1765,9 +1729,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1784,10 +1748,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-southeast-1" + "Region": "ap-southeast-1", + "UseGlobalEndpoint": true } }, { @@ -1797,9 +1761,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1816,10 +1780,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-southeast-2" + "Region": "ap-southeast-2", + "UseGlobalEndpoint": true } }, { @@ -1829,9 +1793,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1848,10 +1812,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "aws-global" + "Region": "aws-global", + "UseGlobalEndpoint": true } }, { @@ -1861,9 +1825,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1880,10 +1844,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ca-central-1" + "Region": "ca-central-1", + "UseGlobalEndpoint": true } }, { @@ -1893,9 +1857,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1912,10 +1876,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-central-1" + "Region": "eu-central-1", + "UseGlobalEndpoint": true } }, { @@ -1925,9 +1889,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1944,10 +1908,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-north-1" + "Region": "eu-north-1", + "UseGlobalEndpoint": true } }, { @@ -1957,9 +1921,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -1976,10 +1940,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-west-1" + "Region": "eu-west-1", + "UseGlobalEndpoint": true } }, { @@ -1989,9 +1953,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2008,10 +1972,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-west-2" + "Region": "eu-west-2", + "UseGlobalEndpoint": true } }, { @@ -2021,9 +1985,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2040,10 +2004,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-west-3" + "Region": "eu-west-3", + "UseGlobalEndpoint": true } }, { @@ -2053,9 +2017,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2072,10 +2036,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "sa-east-1" + "Region": "sa-east-1", + "UseGlobalEndpoint": true } }, { @@ -2085,9 +2049,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2104,10 +2068,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-east-1" + "Region": "us-east-1", + "UseGlobalEndpoint": true } }, { @@ -2117,9 +2081,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2136,10 +2100,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-east-2" + "Region": "us-east-2", + "UseGlobalEndpoint": true } }, { @@ -2149,9 +2113,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2168,10 +2132,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-west-1" + "Region": "us-west-1", + "UseGlobalEndpoint": true } }, { @@ -2181,9 +2145,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-1" + "signingRegion": "us-east-1", + "signingName": "sts" } ] }, @@ -2200,10 +2164,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-west-2" + "Region": "us-west-2", + "UseGlobalEndpoint": true } }, { @@ -2213,9 +2177,9 @@ "properties": { "authSchemes": [ { - "signingName": "sts", "name": "sigv4", - "signingRegion": "us-east-3" + "signingRegion": "us-east-3", + "signingName": "sts" } ] }, @@ -2232,10 +2196,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-east-3" + "Region": "us-east-3", + "UseGlobalEndpoint": true } }, { @@ -2256,10 +2220,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, "Region": "us-west-1", + "UseGlobalEndpoint": true, "Endpoint": "https://example.com" } }, @@ -2271,10 +2235,10 @@ } }, "params": { - "Endpoint": "https://example.com", - "UseGlobalEndpoint": false, "UseDualStack": false, - "UseFIPS": false + "UseFIPS": false, + "Endpoint": "https://example.com", + "UseGlobalEndpoint": false } } ], @@ -2305,7 +2269,50 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy that\n allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy that\n allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

", + "smithy.api#examples": [ + { + "title": "To assume a role", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/demo", + "RoleSessionName": "testAssumeRoleSession", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "Tags": [ + { + "Key": "Project", + "Value": "Unicorn" + }, + { + "Key": "Team", + "Value": "Automation" + }, + { + "Key": "Cost-Center", + "Value": "12345" + } + ], + "TransitiveTagKeys": [ + "Project", + "Cost-Center" + ], + "ExternalId": "123ABC" + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-15T23:28:33.359Z" + }, + "AssumedRoleUser": { + "Arn": "arn:aws:sts::123456789012:assumed-role/demo/Bob", + "AssumedRoleId": "ARO123EXAMPLE123:Bob" + }, + "PackedPolicySize": 8 + } + } + ] } }, "com.amazonaws.sts#AssumeRoleRequest": { @@ -2452,7 +2459,37 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated\n via a SAML authentication response. This operation provides a mechanism for tying an\n enterprise identity store or directory to role-based Amazon Web Services access without user-specific\n credentials or configuration. For a comparison of AssumeRoleWithSAML with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this operation consist of an access key\n ID, a secret access key, and a security token. Applications can use these temporary\n security credentials to sign calls to Amazon Web Services services.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithSAML last for one hour. However, you can use the optional\n DurationSeconds parameter to specify the duration of your session. Your\n role session lasts for the duration that you specify, or until the time specified in the\n SAML authentication response's SessionNotOnOrAfter value, whichever is\n shorter. You can provide a DurationSeconds value from 900 seconds (15 minutes)\n up to the maximum session duration setting for the role. This setting can have a value from\n 1 hour to 12 hours. To learn how to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n \n

\n Role chaining limits your CLI or Amazon Web Services API role\n session to a maximum of one hour. When you use the AssumeRole API operation\n to assume a role, you can specify the duration of your role session with the\n DurationSeconds parameter. You can specify a parameter value of up to\n 43200 seconds (12 hours), depending on the maximum session duration setting for your\n role. However, if you assume a role using role chaining and provide a\n DurationSeconds parameter value greater than one hour, the operation\n fails.

\n
\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithSAML can be\n used to make API calls to any Amazon Web Services service with the following exception: you cannot call\n the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

Calling AssumeRoleWithSAML does not require the use of Amazon Web Services security\n credentials. The identity of the caller is validated by using keys in the metadata document\n that is uploaded for the SAML provider entity for your identity provider.

\n \n

Calling AssumeRoleWithSAML can result in an entry in your CloudTrail logs.\n The entry includes the value in the NameID element of the SAML assertion.\n We recommend that you use a NameIDType that is not associated with any\n personally identifiable information (PII). For example, you could instead use the\n persistent identifier\n (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent).

\n
\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your SAML assertion as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, session tags override the role's tags with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n SAML Configuration\n

\n

Before your application can call AssumeRoleWithSAML, you must configure\n your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\n must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\n represents your identity provider. You must also create an IAM role that specifies this\n SAML provider in its trust policy.

\n

For more information, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated\n via a SAML authentication response. This operation provides a mechanism for tying an\n enterprise identity store or directory to role-based Amazon Web Services access without user-specific\n credentials or configuration. For a comparison of AssumeRoleWithSAML with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this operation consist of an access key\n ID, a secret access key, and a security token. Applications can use these temporary\n security credentials to sign calls to Amazon Web Services services.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithSAML last for one hour. However, you can use the optional\n DurationSeconds parameter to specify the duration of your session. Your\n role session lasts for the duration that you specify, or until the time specified in the\n SAML authentication response's SessionNotOnOrAfter value, whichever is\n shorter. You can provide a DurationSeconds value from 900 seconds (15 minutes)\n up to the maximum session duration setting for the role. This setting can have a value from\n 1 hour to 12 hours. To learn how to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n \n

\n Role chaining limits your CLI or Amazon Web Services API role\n session to a maximum of one hour. When you use the AssumeRole API operation\n to assume a role, you can specify the duration of your role session with the\n DurationSeconds parameter. You can specify a parameter value of up to\n 43200 seconds (12 hours), depending on the maximum session duration setting for your\n role. However, if you assume a role using role chaining and provide a\n DurationSeconds parameter value greater than one hour, the operation\n fails.

\n
\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithSAML can be\n used to make API calls to any Amazon Web Services service with the following exception: you cannot call\n the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

Calling AssumeRoleWithSAML does not require the use of Amazon Web Services security\n credentials. The identity of the caller is validated by using keys in the metadata document\n that is uploaded for the SAML provider entity for your identity provider.

\n \n

Calling AssumeRoleWithSAML can result in an entry in your CloudTrail logs.\n The entry includes the value in the NameID element of the SAML assertion.\n We recommend that you use a NameIDType that is not associated with any\n personally identifiable information (PII). For example, you could instead use the\n persistent identifier\n (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent).

\n
\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your SAML assertion as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, session tags override the role's tags with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n SAML Configuration\n

\n

Before your application can call AssumeRoleWithSAML, you must configure\n your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\n must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\n represents your identity provider. You must also create an IAM role that specifies this\n SAML provider in its trust policy.

\n

For more information, see the following resources:

\n ", + "smithy.api#examples": [ + { + "title": "To assume a role using a SAML assertion", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/TestSaml", + "PrincipalArn": "arn:aws:iam::123456789012:saml-provider/SAML-test", + "SAMLAssertion": "VERYLONGENCODEDASSERTIONEXAMPLExzYW1sOkF1ZGllbmNlPmJsYW5rPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50Ij5TYW1sRXhhbXBsZTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxOS0xMS0wMVQyMDoyNTowNS4xNDVaIiBSZWNpcGllbnQ9Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRoPD94bWwgdmpSZXNwb25zZT4=", + "DurationSeconds": 3600 + }, + "output": { + "Issuer": "https://integ.example.com/idp/shibboleth", + "AssumedRoleUser": { + "AssumedRoleId": "ARO456EXAMPLE789:TestSaml", + "Arn": "arn:aws:sts::123456789012:assumed-role/TestSaml" + }, + "Credentials": { + "SecretAccessKey": "8P+SQvWIuLnKhh8d++jpw0nNmQRBZvNEXAMPLEKEY", + "AccessKeyId": "ASIAV3ZUEFP6EXAMPLE", + "SessionToken": "IQoJb3JpZ2luX2VjEOz////////////////////wEXAMPLEtMSJHMEUCIDoKK3JH9uGQE1z0sINr5M4jk+Na8KHDcCYRVjJCZEvOAiEA3OvJGtw1EcViOleS2vhs8VdCKFJQWPQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "Expiration": "2019-11-01T20:26:47Z" + }, + "Audience": "https://signin.aws.amazon.com/saml", + "SubjectType": "transient", + "PackedPolicySize": 6, + "NameQualifier": "SbdGOnUkh1i4+EXAMPLExL/jEvs=", + "Subject": "SamlExample" + } + } + ] } }, "com.amazonaws.sts#AssumeRoleWithSAMLRequest": { @@ -2597,7 +2634,37 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity\n pools in Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity\n pools in Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n ", + "smithy.api#examples": [ + { + "title": "To assume a role as an OpenID Connect-federated user", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/FederatedWebIdentityRole", + "RoleSessionName": "app1", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "WebIdentityToken": "Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ", + "ProviderId": "www.amazon.com", + "DurationSeconds": 3600 + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEE0a8ANXXXXXXXXNO1ewxE5TijQyp+IEXAMPLE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2014-10-24T23:00:23Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + }, + "SubjectFromWebIdentityToken": "amzn1.account.AF6RHO7KZU5XRVQJGXK6HEXAMPLE", + "AssumedRoleUser": { + "Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/app1", + "AssumedRoleId": "AROACLKWSDQRAOEXAMPLE:app1" + }, + "PackedPolicySize": 123, + "Provider": "www.amazon.com", + "Audience": "client.5498841531868486423.1548@apps.example.com" + } + } + ] } }, "com.amazonaws.sts#AssumeRoleWithWebIdentityRequest": { @@ -2779,7 +2846,19 @@ } ], "traits": { - "smithy.api#documentation": "

Decodes additional information about the authorization status of a request from an\n encoded message returned in response to an Amazon Web Services request.

\n

For example, if a user is not authorized to perform an operation that he or she has\n requested, the request returns a Client.UnauthorizedOperation response (an\n HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\n provide details about this authorization failure.

\n \n

Only certain Amazon Web Services operations return an encoded authorization message. The\n documentation for an individual operation indicates whether that operation returns an\n encoded message in addition to returning an HTTP code.

\n
\n

The message is encoded because the details of the authorization status can contain\n privileged information that the user who requested the operation should not see. To decode\n an authorization status message, a user must be granted permissions through an IAM policy to\n request the DecodeAuthorizationMessage\n (sts:DecodeAuthorizationMessage) action.

\n

The decoded message includes the following type of information:

\n
    \n
  • \n

    Whether the request was denied due to an explicit deny or due to the absence of an\n explicit allow. For more information, see Determining Whether a Request is Allowed or Denied in the\n IAM User Guide.

    \n
  • \n
  • \n

    The principal who made the request.

    \n
  • \n
  • \n

    The requested action.

    \n
  • \n
  • \n

    The requested resource.

    \n
  • \n
  • \n

    The values of condition keys in the context of the user's request.

    \n
  • \n
" + "smithy.api#documentation": "

Decodes additional information about the authorization status of a request from an\n encoded message returned in response to an Amazon Web Services request.

\n

For example, if a user is not authorized to perform an operation that he or she has\n requested, the request returns a Client.UnauthorizedOperation response (an\n HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\n provide details about this authorization failure.

\n \n

Only certain Amazon Web Services operations return an encoded authorization message. The\n documentation for an individual operation indicates whether that operation returns an\n encoded message in addition to returning an HTTP code.

\n
\n

The message is encoded because the details of the authorization status can contain\n privileged information that the user who requested the operation should not see. To decode\n an authorization status message, a user must be granted permissions through an IAM policy to\n request the DecodeAuthorizationMessage\n (sts:DecodeAuthorizationMessage) action.

\n

The decoded message includes the following type of information:

\n
    \n
  • \n

    Whether the request was denied due to an explicit deny or due to the absence of an\n explicit allow. For more information, see Determining Whether a Request is Allowed or Denied in the\n IAM User Guide.

    \n
  • \n
  • \n

    The principal who made the request.

    \n
  • \n
  • \n

    The requested action.

    \n
  • \n
  • \n

    The requested resource.

    \n
  • \n
  • \n

    The values of condition keys in the context of the user's request.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To decode information about an authorization status of a request", + "documentation": "", + "input": { + "EncodedMessage": "" + }, + "output": { + "DecodedMessage": "{\"allowed\": \"false\",\"explicitDeny\": \"false\",\"matchedStatements\": \"\",\"failures\": \"\",\"context\": {\"principal\": {\"id\": \"AIDACKCEVSQ6C2EXAMPLE\",\"name\": \"Bob\",\"arn\": \"arn:aws:iam::123456789012:user/Bob\"},\"action\": \"ec2:StopInstances\",\"resource\": \"arn:aws:ec2:us-east-1:123456789012:instance/i-dd01c9bd\",\"conditions\": [{\"item\": {\"key\": \"ec2:Tenancy\",\"values\": [\"default\"]},{\"item\": {\"key\": \"ec2:ResourceTag/elasticbeanstalk:environment-name\",\"values\": [\"Default-Environment\"]}},(Additional items ...)]}}" + } + } + ] } }, "com.amazonaws.sts#DecodeAuthorizationMessageRequest": { @@ -2901,7 +2980,18 @@ "target": "com.amazonaws.sts#GetCallerIdentityResponse" }, "traits": { - "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to\n call the operation.

\n \n

No permissions are required to perform this operation. If an administrator attaches a\n policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is\n denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to\n call the operation.

\n \n

No permissions are required to perform this operation. If an administrator attaches a\n policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is\n denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To get details about a calling IAM user", + "documentation": "This example shows a request and response made with the credentials for a user named Alice in the AWS account 123456789012.", + "output": { + "UserId": "AKIAI44QH8DHBEXAMPLE", + "Account": "123456789012", + "Arn": "arn:aws:iam::123456789012:user/Alice" + } + } + ] } }, "com.amazonaws.sts#GetCallerIdentityRequest": { @@ -2958,7 +3048,41 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation using the long-term security\n credentials of an IAM user. As a result, this call is appropriate in\n contexts where those credentials can be safeguarded, usually in a server-based application.\n For a comparison of GetFederationToken with the other API operations that\n produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user that you\n create for the purpose of a proxy application, we do not recommend it. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user\n credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This\n limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the\n session policies that you pass. This gives you a way to further restrict the permissions\n for a federated user. You cannot use session policies to grant more permissions than those\n that are defined in the permissions policy of the IAM user. For more\n information, see Session Policies in\n the IAM User Guide. For information about using\n GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation using the long-term security\n credentials of an IAM user. As a result, this call is appropriate in\n contexts where those credentials can be safeguarded, usually in a server-based application.\n For a comparison of GetFederationToken with the other API operations that\n produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user that you\n create for the purpose of a proxy application, we do not recommend it. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user\n credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This\n limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the\n session policies that you pass. This gives you a way to further restrict the permissions\n for a federated user. You cannot use session policies to grant more permissions than those\n that are defined in the permissions policy of the IAM user. For more\n information, see Session Policies in\n the IAM User Guide. For information about using\n GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

", + "smithy.api#examples": [ + { + "title": "To get temporary credentials for a role by using GetFederationToken", + "documentation": "", + "input": { + "Name": "testFedUserSession", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "DurationSeconds": 3600, + "Tags": [ + { + "Key": "Project", + "Value": "Pegasus" + }, + { + "Key": "Cost-Center", + "Value": "98765" + } + ] + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-15T23:28:33.359Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + }, + "FederatedUser": { + "Arn": "arn:aws:sts::123456789012:federated-user/Bob", + "FederatedUserId": "123456789012:Bob" + }, + "PackedPolicySize": 8 + } + } + ] } }, "com.amazonaws.sts#GetFederationTokenRequest": { @@ -3041,7 +3165,26 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user.\n The credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2\n StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit\n an MFA code that is associated with their MFA device. Using the temporary security\n credentials that the call returns, IAM users can then make programmatic\n calls to API operations that require MFA authentication. An incorrect MFA code causes the\n API to return an access denied error. For a comparison of GetSessionToken with\n the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on permissions\n associated with the IAM user whose credentials were used to call the\n operation. The temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user, we do\n not recommend it. If GetSessionToken is called using root user\n credentials, the temporary credentials have root user permissions. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

" + "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user.\n The credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2\n StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit\n an MFA code that is associated with their MFA device. Using the temporary security\n credentials that the call returns, IAM users can then make programmatic\n calls to API operations that require MFA authentication. An incorrect MFA code causes the\n API to return an access denied error. For a comparison of GetSessionToken with\n the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on permissions\n associated with the IAM user whose credentials were used to call the\n operation. The temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user, we do\n not recommend it. If GetSessionToken is called using root user\n credentials, the temporary credentials have root user permissions. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get temporary credentials for an IAM user or an AWS account", + "documentation": "", + "input": { + "DurationSeconds": 3600, + "SerialNumber": "YourMFASerialNumber", + "TokenCode": "123456" + }, + "output": { + "Credentials": { + "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-11T19:55:29.611Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + } + ] } }, "com.amazonaws.sts#GetSessionTokenRequest": { diff --git a/aws/sdk/aws-models/timestream-query.json b/aws/sdk/aws-models/timestream-query.json index 29edeadd2a3..13e1aea96af 100644 --- a/aws/sdk/aws-models/timestream-query.json +++ b/aws/sdk/aws-models/timestream-query.json @@ -98,6 +98,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#CancelQueryResponse": { @@ -109,6 +112,9 @@ "smithy.api#documentation": "

A CancellationMessage is returned when a CancelQuery\n request for the query specified by QueryId has already been issued.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#ClientRequestToken": { @@ -223,7 +229,7 @@ "QueryString": { "target": "com.amazonaws.timestreamquery#QueryString", "traits": { - "smithy.api#documentation": "

The query string to run. Parameter\n names can be specified in the query string @ character followed by an\n identifier. The named Parameter @scheduled_runtime is reserved and can be used in the query to get the time at which the query is scheduled to run.

\n

The timestamp calculated according to the ScheduleConfiguration parameter, will be the value of @scheduled_runtime paramater for each query run. \n For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the @scheduled_runtime parameter is \n initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.

", + "smithy.api#documentation": "

The query string to run. Parameter\n names can be specified in the query string @ character followed by an\n identifier. The named Parameter @scheduled_runtime is reserved and can be used in the query to get the time at which the query is scheduled to run.

\n

The timestamp calculated according to the ScheduleConfiguration parameter, will be the value of @scheduled_runtime paramater for each query run. \n For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the @scheduled_runtime parameter is \n initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.

", "smithy.api#required": {} } }, @@ -250,7 +256,7 @@ "ClientToken": { "target": "com.amazonaws.timestreamquery#ClientToken", "traits": { - "smithy.api#documentation": "

Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making \n multiple identical CreateScheduledQuery requests has the same effect as making a single request.\n\n

\n
    \n
  • \n

    If CreateScheduledQuery is called without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    After 8 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", + "smithy.api#documentation": "

Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making \n multiple identical CreateScheduledQuery requests has the same effect as making a single request.\n\n

\n
    \n
  • \n

    If CreateScheduledQuery is called without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    After 8 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", "smithy.api#idempotencyToken": {} } }, @@ -270,7 +276,7 @@ "KmsKeyId": { "target": "com.amazonaws.timestreamquery#StringValue2048", "traits": { - "smithy.api#documentation": "

The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS\n key is not specified, the scheduled query resource will be encrypted with a Timestream\n owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias\n ARN. When using an alias name, prefix the name with alias/\n

\n

If ErrorReportConfiguration uses SSE_KMS as encryption type, the same KmsKeyId is used to encrypt the error report at rest.

" + "smithy.api#documentation": "

The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS\n key is not specified, the scheduled query resource will be encrypted with a Timestream\n owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias\n ARN. When using an alias name, prefix the name with alias/\n

\n

If ErrorReportConfiguration uses SSE_KMS as encryption type, the same KmsKeyId is used to encrypt the error report at rest.

" } }, "ErrorReportConfiguration": { @@ -280,6 +286,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#CreateScheduledQueryResponse": { @@ -292,6 +301,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Datum": { @@ -384,6 +396,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#DescribeEndpoints": { @@ -406,12 +421,15 @@ } ], "traits": { - "smithy.api#documentation": "

DescribeEndpoints returns a list of available endpoints to make Timestream\n API calls against. This API is available through both Write and Query.

\n

Because the Timestream SDKs are designed to transparently work with the\n service’s architecture, including the management and mapping of the service endpoints,\n it is not recommended that you use this API unless:

\n \n

For detailed information on how and when to use and implement DescribeEndpoints, see\n The Endpoint Discovery Pattern.

" + "smithy.api#documentation": "

DescribeEndpoints returns a list of available endpoints to make Timestream\n API calls against. This API is available through both Write and Query.

\n

Because the Timestream SDKs are designed to transparently work with the\n service’s architecture, including the management and mapping of the service endpoints,\n it is not recommended that you use this API unless:

\n \n

For detailed information on how and when to use and implement DescribeEndpoints, see\n The Endpoint Discovery Pattern.

" } }, "com.amazonaws.timestreamquery#DescribeEndpointsRequest": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#input": {} + } }, "com.amazonaws.timestreamquery#DescribeEndpointsResponse": { "type": "structure", @@ -423,6 +441,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#DescribeScheduledQuery": { @@ -470,6 +491,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#DescribeScheduledQueryResponse": { @@ -482,6 +506,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#DimensionMapping": { @@ -513,14 +540,14 @@ } }, "com.amazonaws.timestreamquery#DimensionValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "VARCHAR", - "name": "VARCHAR" + "type": "enum", + "members": { + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" } - ] + } } }, "com.amazonaws.timestreamquery#Double": { @@ -650,6 +677,9 @@ "smithy.api#idempotencyToken": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ExecutionStats": { @@ -754,6 +784,7 @@ "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", + "items": "ScheduledQueries", "pageSize": "MaxResults" } } @@ -773,6 +804,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ListScheduledQueriesResponse": { @@ -791,6 +825,9 @@ "smithy.api#documentation": "

A token to specify where to start paginating. This is the NextToken from a previously\n truncated response.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#ListTagsForResource": { @@ -823,6 +860,7 @@ "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", + "items": "Tags", "pageSize": "MaxResults" } } @@ -849,6 +887,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ListTagsForResourceResponse": { @@ -867,6 +908,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination with a subsequent call to\n ListTagsForResourceResponse.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Long": { @@ -903,30 +947,38 @@ } }, "com.amazonaws.timestreamquery#MeasureValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "MULTI", - "name": "MULTI" + "type": "enum", + "members": { + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "MULTI": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MULTI" } - ] + } } }, "com.amazonaws.timestreamquery#MixedMeasureMapping": { @@ -1148,6 +1200,9 @@ "smithy.api#documentation": "

By setting this value to true, Timestream will only validate that the\n query string is a valid Timestream query, and not store the prepared query for later\n use.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#PrepareQueryResponse": { @@ -1174,6 +1229,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Query": { @@ -1211,7 +1269,7 @@ "aws.api#clientDiscoveredEndpoint": { "required": true }, - "smithy.api#documentation": "

\n Query is a synchronous operation that enables you to run a query against\n your Amazon Timestream data. Query will time out after 60 seconds.\n You must update the default timeout in the SDK to support a timeout of 60 seconds. See\n the code\n sample for details.

\n

Your query request will fail in the following cases:

\n
    \n
  • \n

    If you submit a Query request with the same client token outside\n of the 5-minute idempotency window.

    \n
  • \n
  • \n

    If you submit a Query request with the same client token, but\n change other parameters, within the 5-minute idempotency window.

    \n
  • \n
  • \n

    If the size of the row (including the query metadata) exceeds 1 MB, then the\n query will fail with the following error message:

    \n

    \n Query aborted as max page response size has been exceeded by the output\n result row\n

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
", + "smithy.api#documentation": "

\n Query is a synchronous operation that enables you to run a query against\n your Amazon Timestream data. Query will time out after 60 seconds.\n You must update the default timeout in the SDK to support a timeout of 60 seconds. See\n the code\n sample for details.

\n

Your query request will fail in the following cases:

\n
    \n
  • \n

    If you submit a Query request with the same client token outside\n of the 5-minute idempotency window.

    \n
  • \n
  • \n

    If you submit a Query request with the same client token, but\n change other parameters, within the 5-minute idempotency window.

    \n
  • \n
  • \n

    If the size of the row (including the query metadata) exceeds 1 MB, then the\n query will fail with the following error message:

    \n

    \n Query aborted as max page response size has been exceeded by the output\n result row\n

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
", "smithy.api#idempotent": {}, "smithy.api#paginated": { "inputToken": "NextToken", @@ -1257,22 +1315,25 @@ "ClientToken": { "target": "com.amazonaws.timestreamquery#ClientRequestToken", "traits": { - "smithy.api#documentation": "

Unique, case-sensitive string of up to 64 ASCII characters specified when a\n Query request is made. Providing a ClientToken makes the\n call to Query\n idempotent. This means that running the same query repeatedly will\n produce the same result. In other words, making multiple identical Query\n requests has the same effect as making a single request. When using\n ClientToken in a query, note the following:

\n
    \n
  • \n

    If the Query API is instantiated without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    If the Query invocation only contains the\n ClientToken but does not include a NextToken, that\n invocation of Query is assumed to be a new query run.

    \n
  • \n
  • \n

    If the invocation contains NextToken, that particular invocation\n is assumed to be a subsequent invocation of a prior call to the Query API, and a\n result set is returned.

    \n
  • \n
  • \n

    After 4 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", + "smithy.api#documentation": "

Unique, case-sensitive string of up to 64 ASCII characters specified when a\n Query request is made. Providing a ClientToken makes the\n call to Query\n idempotent. This means that running the same query repeatedly will\n produce the same result. In other words, making multiple identical Query\n requests has the same effect as making a single request. When using\n ClientToken in a query, note the following:

\n
    \n
  • \n

    If the Query API is instantiated without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    If the Query invocation only contains the\n ClientToken but does not include a NextToken, that\n invocation of Query is assumed to be a new query run.

    \n
  • \n
  • \n

    If the invocation contains NextToken, that particular invocation\n is assumed to be a subsequent invocation of a prior call to the Query API, and a\n result set is returned.

    \n
  • \n
  • \n

    After 4 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", "smithy.api#idempotencyToken": {} } }, "NextToken": { "target": "com.amazonaws.timestreamquery#PaginationToken", "traits": { - "smithy.api#documentation": "

A pagination token used to return a set of results. When the Query API\n is invoked using NextToken, that particular invocation is assumed to be a\n subsequent invocation of a prior call to Query, and a result set is\n returned. However, if the Query invocation only contains the\n ClientToken, that invocation of Query is assumed to be a\n new query run.

\n

Note the following when using NextToken in a query:

\n
    \n
  • \n

    A pagination token can be used for up to five Query invocations,\n OR for a duration of up to 1 hour – whichever comes first.

    \n
  • \n
  • \n

    Using the same NextToken will return the same set of records. To\n keep paginating through the result set, you must to use the most recent\n nextToken.

    \n
  • \n
  • \n

    Suppose a Query invocation returns two NextToken\n values, TokenA and TokenB. If TokenB is\n used in a subsequent Query invocation, then TokenA is\n invalidated and cannot be reused.

    \n
  • \n
  • \n

    To request a previous result set from a query after pagination has begun, you\n must re-invoke the Query API.

    \n
  • \n
  • \n

    The latest NextToken should be used to paginate until\n null is returned, at which point a new NextToken\n should be used.

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
" + "smithy.api#documentation": "

A pagination token used to return a set of results. When the Query API\n is invoked using NextToken, that particular invocation is assumed to be a\n subsequent invocation of a prior call to Query, and a result set is\n returned. However, if the Query invocation only contains the\n ClientToken, that invocation of Query is assumed to be a\n new query run.

\n

Note the following when using NextToken in a query:

\n
    \n
  • \n

    A pagination token can be used for up to five Query invocations,\n OR for a duration of up to 1 hour – whichever comes first.

    \n
  • \n
  • \n

    Using the same NextToken will return the same set of records. To\n keep paginating through the result set, you must to use the most recent\n nextToken.

    \n
  • \n
  • \n

    Suppose a Query invocation returns two NextToken\n values, TokenA and TokenB. If TokenB is\n used in a subsequent Query invocation, then TokenA is\n invalidated and cannot be reused.

    \n
  • \n
  • \n

    To request a previous result set from a query after pagination has begun, you\n must re-invoke the Query API.

    \n
  • \n
  • \n

    The latest NextToken should be used to paginate until\n null is returned, at which point a new NextToken\n should be used.

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
" } }, "MaxRows": { "target": "com.amazonaws.timestreamquery#MaxQueryResults", "traits": { - "smithy.api#documentation": "

The total number of rows to be returned in the Query output. The initial\n run of Query with a MaxRows value specified will return the\n result set of the query in two cases:

\n
    \n
  • \n

    The size of the result is less than 1MB.

    \n
  • \n
  • \n

    The number of rows in the result set is less than the value of\n maxRows.

    \n
  • \n
\n

Otherwise, the initial invocation of Query only returns a\n NextToken, which can then be used in subsequent calls to fetch the\n result set. To resume pagination, provide the NextToken value in the\n subsequent command.

\n

If the row size is large (e.g. a row has many columns), Timestream may return\n fewer rows to keep the response size from exceeding the 1 MB limit. If\n MaxRows is not provided, Timestream will send the necessary\n number of rows to meet the 1 MB limit.

" + "smithy.api#documentation": "

The total number of rows to be returned in the Query output. The initial\n run of Query with a MaxRows value specified will return the\n result set of the query in two cases:

\n
    \n
  • \n

    The size of the result is less than 1MB.

    \n
  • \n
  • \n

    The number of rows in the result set is less than the value of\n maxRows.

    \n
  • \n
\n

Otherwise, the initial invocation of Query only returns a\n NextToken, which can then be used in subsequent calls to fetch the\n result set. To resume pagination, provide the NextToken value in the\n subsequent command.

\n

If the row size is large (e.g. a row has many columns), Timestream may return\n fewer rows to keep the response size from exceeding the 1 MB limit. If\n MaxRows is not provided, Timestream will send the necessary\n number of rows to meet the 1 MB limit.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#QueryResponse": { @@ -1311,6 +1372,9 @@ "smithy.api#documentation": "

Information about the status of the query, including progress and bytes\n scanned.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#QueryStatus": { @@ -1433,18 +1497,20 @@ } }, "com.amazonaws.timestreamquery#S3EncryptionOption": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "SSE_S3", - "name": "SSE_S3" - }, - { - "value": "SSE_KMS", - "name": "SSE_KMS" + "type": "enum", + "members": { + "SSE_S3": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "SSE_S3" } - ] + }, + "SSE_KMS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "SSE_KMS" + } + } } }, "com.amazonaws.timestreamquery#S3ObjectKey": { @@ -1481,81 +1547,109 @@ } }, "com.amazonaws.timestreamquery#ScalarMeasureValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "TIMESTAMP", - "name": "TIMESTAMP" + "type": "enum", + "members": { + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" } - ] + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "TIMESTAMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIMESTAMP" + } + } } }, "com.amazonaws.timestreamquery#ScalarType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "TIMESTAMP", - "name": "TIMESTAMP" - }, - { - "value": "DATE", - "name": "DATE" - }, - { - "value": "TIME", - "name": "TIME" - }, - { - "value": "INTERVAL_DAY_TO_SECOND", - "name": "INTERVAL_DAY_TO_SECOND" - }, - { - "value": "INTERVAL_YEAR_TO_MONTH", - "name": "INTERVAL_YEAR_TO_MONTH" - }, - { - "value": "UNKNOWN", - "name": "UNKNOWN" - }, - { - "value": "INTEGER", - "name": "INTEGER" + "type": "enum", + "members": { + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" } - ] + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "TIMESTAMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIMESTAMP" + } + }, + "DATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DATE" + } + }, + "TIME": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIME" + } + }, + "INTERVAL_DAY_TO_SECOND": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTERVAL_DAY_TO_SECOND" + } + }, + "INTERVAL_YEAR_TO_MONTH": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTERVAL_YEAR_TO_MONTH" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "UNKNOWN" + } + }, + "INTEGER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTEGER" + } + } } }, "com.amazonaws.timestreamquery#ScalarValue": { @@ -1771,26 +1865,32 @@ } }, "com.amazonaws.timestreamquery#ScheduledQueryRunStatus": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "AUTO_TRIGGER_SUCCESS", - "name": "AUTO_TRIGGER_SUCCESS" - }, - { - "value": "AUTO_TRIGGER_FAILURE", - "name": "AUTO_TRIGGER_FAILURE" - }, - { - "value": "MANUAL_TRIGGER_SUCCESS", - "name": "MANUAL_TRIGGER_SUCCESS" - }, - { - "value": "MANUAL_TRIGGER_FAILURE", - "name": "MANUAL_TRIGGER_FAILURE" + "type": "enum", + "members": { + "AUTO_TRIGGER_SUCCESS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AUTO_TRIGGER_SUCCESS" + } + }, + "AUTO_TRIGGER_FAILURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AUTO_TRIGGER_FAILURE" + } + }, + "MANUAL_TRIGGER_SUCCESS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MANUAL_TRIGGER_SUCCESS" } - ] + }, + "MANUAL_TRIGGER_FAILURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MANUAL_TRIGGER_FAILURE" + } + } } }, "com.amazonaws.timestreamquery#ScheduledQueryRunSummary": { @@ -1844,18 +1944,20 @@ } }, "com.amazonaws.timestreamquery#ScheduledQueryState": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "ENABLED", - "name": "ENABLED" - }, - { - "value": "DISABLED", - "name": "DISABLED" + "type": "enum", + "members": { + "ENABLED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ENABLED" + } + }, + "DISABLED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DISABLED" } - ] + } } }, "com.amazonaws.timestreamquery#SchemaName": { @@ -2049,11 +2151,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#TagResourceResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.timestreamquery#TagValue": { "type": "string", @@ -2274,7 +2382,7 @@ "name": "timestream" }, "aws.protocols#awsJson1_0": {}, - "smithy.api#documentation": "Amazon Timestream Query\n \n

", + "smithy.api#documentation": "Amazon Timestream Query\n \n

", "smithy.api#title": "Amazon Timestream Query", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -2336,52 +2444,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -2389,13 +2501,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -2405,224 +2526,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://query.timestream.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://query.timestream.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3020,11 +3092,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#UntagResourceResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.timestreamquery#UpdateScheduledQuery": { "type": "operation", @@ -3078,6 +3156,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ValidationException": { diff --git a/aws/sdk/aws-models/timestream-write.json b/aws/sdk/aws-models/timestream-write.json index a3378d042b1..7c2da01499a 100644 --- a/aws/sdk/aws-models/timestream-write.json +++ b/aws/sdk/aws-models/timestream-write.json @@ -2883,52 +2883,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -2936,13 +2940,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -2952,92 +2965,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -3046,130 +3050,115 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://ingest.timestream.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3279,6 +3268,32 @@ "UseDualStack": false } }, + { + "documentation": "For region us-gov-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://ingest.timestream.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-west-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://ingest.timestream.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": true, + "UseDualStack": false + } + }, { "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", "expect": { @@ -3296,7 +3311,7 @@ "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", "expect": { "endpoint": { - "url": "https://ingest.timestream-fips.us-gov-east-1.amazonaws.com" + "url": "https://ingest.timestream.us-gov-east-1.amazonaws.com" } }, "params": { diff --git a/aws/sdk/aws-models/transcribe-streaming.json b/aws/sdk/aws-models/transcribe-streaming.json index a1464b0462e..49bde387a53 100644 --- a/aws/sdk/aws-models/transcribe-streaming.json +++ b/aws/sdk/aws-models/transcribe-streaming.json @@ -96,7 +96,7 @@ } }, "traits": { - "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", + "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", "smithy.api#streaming": {} } }, @@ -915,7 +915,7 @@ "Confidence": { "target": "com.amazonaws.transcribestreaming#Confidence", "traits": { - "smithy.api#documentation": "

The confidence score associated with the identified PHI entity in your audio.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified entity correctly matches the entity spoken in your\n media.

" + "smithy.api#documentation": "

The confidence score associated with the identified PHI entity in your audio.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified entity correctly matches the entity spoken in your\n media.

" } } }, @@ -961,7 +961,7 @@ "Confidence": { "target": "com.amazonaws.transcribestreaming#Confidence", "traits": { - "smithy.api#documentation": "

The confidence score associated with a word or phrase in your transcript.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified item correctly matches the item spoken in your\n media.

" + "smithy.api#documentation": "

The confidence score associated with a word or phrase in your transcript.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified item correctly matches the item spoken in your\n media.

" } }, "Speaker": { @@ -1008,7 +1008,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Indicates if the segment is complete.

\n

If IsPartial is true, the segment is not complete. If\n IsPartial is false, the segment is complete.

" + "smithy.api#documentation": "

Indicates if the segment is complete.

\n

If IsPartial is true, the segment is not complete. If\n IsPartial is false, the segment is complete.

" } }, "Alternatives": { @@ -1025,7 +1025,7 @@ } }, "traits": { - "smithy.api#documentation": "

The Result associated with a \n .

\n

Contains a set of transcription results from one or more audio segments, along with\n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" + "smithy.api#documentation": "

The Result associated with a \n .

\n

Contains a set of transcription results from one or more audio segments, along with\n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" } }, "com.amazonaws.transcribestreaming#MedicalResultList": { @@ -1045,7 +1045,7 @@ } }, "traits": { - "smithy.api#documentation": "

The MedicalTranscript associated with a \n .

\n

\n MedicalTranscript contains Results, which contains a set of \n transcription results from one or more audio segments, along with additional information per your \n request parameters.

" + "smithy.api#documentation": "

The MedicalTranscript associated with a \n .

\n

\n MedicalTranscript contains Results, which contains a set of \n transcription results from one or more audio segments, along with additional information per your \n request parameters.

" } }, "com.amazonaws.transcribestreaming#MedicalTranscriptEvent": { @@ -1059,7 +1059,7 @@ } }, "traits": { - "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with additional \n information per your request parameters.

" + "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with additional \n information per your request parameters.

" } }, "com.amazonaws.transcribestreaming#MedicalTranscriptResultStream": { @@ -1068,7 +1068,7 @@ "TranscriptEvent": { "target": "com.amazonaws.transcribestreaming#MedicalTranscriptEvent", "traits": { - "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with \n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" + "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with \n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" } }, "BadRequestException": { @@ -1457,7 +1457,7 @@ "VocabularyFilterName": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-name" } }, @@ -1471,7 +1471,7 @@ "LanguageModelName": { "target": "com.amazonaws.transcribestreaming#ModelName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", + "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", "smithy.api#httpHeader": "x-amzn-transcribe-language-model-name" } }, @@ -1486,21 +1486,21 @@ "PartialResultsStability": { "target": "com.amazonaws.transcribestreaming#PartialResultsStability", "traits": { - "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", + "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", "smithy.api#httpHeader": "x-amzn-transcribe-partial-results-stability" } }, "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#ContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } }, "ContentRedactionType": { "target": "com.amazonaws.transcribestreaming#ContentRedactionType", "traits": { - "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-redaction-type" } }, @@ -1511,6 +1511,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-pii-entity-types" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionResponse": { @@ -1622,6 +1625,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-pii-entity-types" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#StartMedicalStreamTranscription": { @@ -1650,7 +1656,7 @@ } ], "traits": { - "smithy.api#documentation": "

Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \n Amazon Transcribe Medical and the transcription results are streamed to your\n application.

\n

The following parameters are required:

\n
    \n
  • \n

    \n language-code\n

    \n
  • \n
  • \n

    \n media-encoding\n

    \n
  • \n
  • \n

    \n sample-rate\n

    \n
  • \n
\n

For more information on streaming with Amazon Transcribe Medical, see \n Transcribing\n streaming audio.

", + "smithy.api#documentation": "

Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \n Amazon Transcribe Medical and the transcription results are streamed to your\n application.

\n

The following parameters are required:

\n
    \n
  • \n

    \n language-code\n

    \n
  • \n
  • \n

    \n media-encoding\n

    \n
  • \n
  • \n

    \n sample-rate\n

    \n
  • \n
\n

For more information on streaming with Amazon Transcribe Medical, see \n Transcribing\n streaming audio.

", "smithy.api#http": { "method": "POST", "uri": "/medical-stream-transcription", @@ -1664,7 +1670,7 @@ "LanguageCode": { "target": "com.amazonaws.transcribestreaming#LanguageCode", "traits": { - "smithy.api#documentation": "

Specify the language code that represents the language spoken in your audio.

\n \n

Amazon Transcribe Medical only supports US English (en-US).

\n
", + "smithy.api#documentation": "

Specify the language code that represents the language spoken in your audio.

\n \n

Amazon Transcribe Medical only supports US English (en-US).

\n
", "smithy.api#httpHeader": "x-amzn-transcribe-language-code", "smithy.api#required": {} } @@ -1680,7 +1686,7 @@ "MediaEncoding": { "target": "com.amazonaws.transcribestreaming#MediaEncoding", "traits": { - "smithy.api#documentation": "

Specify the encoding used for the input audio. Supported formats are:

\n
    \n
  • \n

    FLAC

    \n
  • \n
  • \n

    OPUS-encoded audio in an Ogg container

    \n
  • \n
  • \n

    PCM (only signed 16-bit little-endian audio formats, which does not include\n WAV)

    \n
  • \n
\n

For more information, see Media formats.

", + "smithy.api#documentation": "

Specify the encoding used for the input audio. Supported formats are:

\n
    \n
  • \n

    FLAC

    \n
  • \n
  • \n

    OPUS-encoded audio in an Ogg container

    \n
  • \n
  • \n

    PCM (only signed 16-bit little-endian audio formats, which does not include\n WAV)

    \n
  • \n
\n

For more information, see Media formats.

", "smithy.api#httpHeader": "x-amzn-transcribe-media-encoding", "smithy.api#required": {} } @@ -1712,14 +1718,14 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker\n partitioning labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", + "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker\n partitioning labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", "smithy.api#httpHeader": "x-amzn-transcribe-show-speaker-label" } }, "SessionId": { "target": "com.amazonaws.transcribestreaming#SessionId", "traits": { - "smithy.api#documentation": "

Specify a name for your transcription session. If you don't include this parameter in \n your request, Amazon Transcribe Medical generates an ID and returns it in the\n response.

\n

You can use a session ID to retry a streaming session.

", + "smithy.api#documentation": "

Specify a name for your transcription session. If you don't include this parameter in \n your request, Amazon Transcribe Medical generates an ID and returns it in the\n response.

\n

You can use a session ID to retry a streaming session.

", "smithy.api#httpHeader": "x-amzn-transcribe-session-id" } }, @@ -1734,7 +1740,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends\n the output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", + "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends\n the output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", "smithy.api#httpHeader": "x-amzn-transcribe-enable-channel-identification" } }, @@ -1748,10 +1754,13 @@ "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#MedicalContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personal health information (PHI) identified in your transcript.

\n

Content identification is performed at the segment level; PHI is flagged upon complete\n transcription of an audio segment.

\n

For more information, see Identifying personal health information (PHI) in a\n transcription.

", + "smithy.api#documentation": "

Labels all personal health information (PHI) identified in your transcript.

\n

Content identification is performed at the segment level; PHI is flagged upon complete\n transcription of an audio segment.

\n

For more information, see Identifying personal health information (PHI) in a\n transcription.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionResponse": { @@ -1850,6 +1859,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#StartStreamTranscription": { @@ -1929,7 +1941,7 @@ "AudioStream": { "target": "com.amazonaws.transcribestreaming#AudioStream", "traits": { - "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", + "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", "smithy.api#httpPayload": {}, "smithy.api#required": {} } @@ -1937,7 +1949,7 @@ "VocabularyFilterName": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n \n

This parameter is not intended for use with the\n IdentifyLanguage parameter. If you're including IdentifyLanguage\n in your request and want to use one or more vocabulary filters with your transcription, use\n the VocabularyFilterNames parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n \n

This parameter is not intended for use with the\n IdentifyLanguage parameter. If you're including IdentifyLanguage\n in your request and want to use one or more vocabulary filters with your transcription, use\n the VocabularyFilterNames parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-name" } }, @@ -1952,7 +1964,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \n labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", + "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \n labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", "smithy.api#httpHeader": "x-amzn-transcribe-show-speaker-label" } }, @@ -1960,7 +1972,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends the \n output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", + "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends the \n output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", "smithy.api#httpHeader": "x-amzn-transcribe-enable-channel-identification" } }, @@ -1982,21 +1994,21 @@ "PartialResultsStability": { "target": "com.amazonaws.transcribestreaming#PartialResultsStability", "traits": { - "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", + "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", "smithy.api#httpHeader": "x-amzn-transcribe-partial-results-stability" } }, "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#ContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } }, "ContentRedactionType": { "target": "com.amazonaws.transcribestreaming#ContentRedactionType", "traits": { - "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-redaction-type" } }, @@ -2010,7 +2022,7 @@ "LanguageModelName": { "target": "com.amazonaws.transcribestreaming#ModelName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", + "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", "smithy.api#httpHeader": "x-amzn-transcribe-language-model-name" } }, @@ -2018,7 +2030,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables automatic language identification for your transcription.

\n

If you include IdentifyLanguage, you can optionally include a list of \n language codes, using LanguageOptions, that you think may be present in \n your audio stream. Including language options can improve transcription accuracy.

\n

You can also include a preferred language using PreferredLanguage. Adding a \n preferred language can help Amazon Transcribe identify the language faster than if you omit this \n parameter.

\n

If you have multi-channel audio that contains different languages on each channel, and you've \n enabled channel identification, automatic language identification identifies the dominant language on \n each audio channel.

\n

Note that you must include either LanguageCode or \n IdentifyLanguage in your request. If you include both parameters, your request\n fails.

\n

Streaming language identification can't be combined with custom language models or \n redaction.

", + "smithy.api#documentation": "

Enables automatic language identification for your transcription.

\n

If you include IdentifyLanguage, you can optionally include a list of \n language codes, using LanguageOptions, that you think may be present in \n your audio stream. Including language options can improve transcription accuracy.

\n

You can also include a preferred language using PreferredLanguage. Adding a \n preferred language can help Amazon Transcribe identify the language faster than if you omit this \n parameter.

\n

If you have multi-channel audio that contains different languages on each channel, and you've \n enabled channel identification, automatic language identification identifies the dominant language on \n each audio channel.

\n

Note that you must include either LanguageCode or \n IdentifyLanguage in your request. If you include both parameters, your request\n fails.

\n

Streaming language identification can't be combined with custom language models or \n redaction.

", "smithy.api#httpHeader": "x-amzn-transcribe-identify-language" } }, @@ -2039,17 +2051,20 @@ "VocabularyNames": { "target": "com.amazonaws.transcribestreaming#VocabularyNames", "traits": { - "smithy.api#documentation": "

Specify the names of the custom vocabularies that you want to use when processing your\n transcription. Note that vocabulary names are case sensitive.

\n

If none of the languages of the specified custom vocabularies match the language identified in \n your media, your job fails.

\n \n

This parameter is only intended for use with the\n IdentifyLanguage parameter. If you're not\n including IdentifyLanguage in your request and want to use a custom vocabulary\n with your transcription, use the VocabularyName parameter instead.

\n
\n

For more information, see Custom vocabularies.

", + "smithy.api#documentation": "

Specify the names of the custom vocabularies that you want to use when processing your\n transcription. Note that vocabulary names are case sensitive.

\n

If none of the languages of the specified custom vocabularies match the language identified in \n your media, your job fails.

\n \n

This parameter is only intended for use with the\n IdentifyLanguage parameter. If you're not\n including IdentifyLanguage in your request and want to use a custom vocabulary\n with your transcription, use the VocabularyName parameter instead.

\n
\n

For more information, see Custom vocabularies.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-names" } }, "VocabularyFilterNames": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterNames", "traits": { - "smithy.api#documentation": "

Specify the names of the custom vocabulary filters that you want to use when processing\n your transcription. Note that vocabulary filter names are case sensitive.

\n

If none of the languages of the specified custom vocabulary filters match the language identified\n in your media, your job fails.

\n \n

This parameter is only intended for use with \n the IdentifyLanguage parameter. If you're not \n including IdentifyLanguage in your request and want to use a custom vocabulary filter \n with your transcription, use the VocabularyFilterName parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the names of the custom vocabulary filters that you want to use when processing\n your transcription. Note that vocabulary filter names are case sensitive.

\n

If none of the languages of the specified custom vocabulary filters match the language identified\n in your media, your job fails.

\n \n

This parameter is only intended for use with \n the IdentifyLanguage parameter. If you're not \n including IdentifyLanguage in your request and want to use a custom vocabulary filter \n with your transcription, use the VocabularyFilterName parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-names" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartStreamTranscriptionResponse": { @@ -2220,6 +2235,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-names" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#String": { @@ -2291,7 +2309,7 @@ "h2" ] }, - "smithy.api#documentation": "

Amazon Transcribe streaming offers three main types of real-time transcription: \n Standard, Medical, and \n Call Analytics.

\n
    \n
  • \n

    \n Standard transcriptions are the most common option. Refer\n to for details.

    \n
  • \n
  • \n

    \n Medical transcriptions are tailored to medical professionals \n and incorporate medical terms. A common use case for this service is transcribing doctor-patient \n dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\n for details.

    \n
  • \n
  • \n

    \n Call Analytics transcriptions are designed for use with call\n center audio on two different channels; if you're looking for insight into customer service calls, use this \n option. Refer to for details.

    \n
  • \n
", + "smithy.api#documentation": "

Amazon Transcribe streaming offers three main types of real-time transcription: \n Standard, Medical, and \n Call Analytics.

\n
    \n
  • \n

    \n Standard transcriptions are the most common option. Refer\n to for details.

    \n
  • \n
  • \n

    \n Medical transcriptions are tailored to medical professionals \n and incorporate medical terms. A common use case for this service is transcribing doctor-patient \n dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\n for details.

    \n
  • \n
  • \n

    \n Call Analytics transcriptions are designed for use with call\n center audio on two different channels; if you're looking for insight into customer service calls, use this \n option. Refer to for details.

    \n
  • \n
", "smithy.api#title": "Amazon Transcribe Streaming Service", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -2353,52 +2371,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -2406,13 +2428,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -2422,224 +2453,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, From 690be0f9d97e8bc9964584d4e085320a9aa07e95 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Wed, 30 Aug 2023 10:22:21 -0500 Subject: [PATCH 106/331] run clippy with --all-features for codegen tests (#2963) broken out from https://github.com/awslabs/smithy-rs/pull/2916 ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../software/amazon/smithy/rust/codegen/core/testutil/Rust.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index c0b152fe2e7..c443110805b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -343,7 +343,7 @@ fun TestWriterDelegator.compileAndTest( val env = mapOf("RUSTFLAGS" to "-A dead_code") val testOutput = "cargo test".runCommand(baseDir, env) if (runClippy) { - "cargo clippy".runCommand(baseDir, env) + "cargo clippy --all-features".runCommand(baseDir, env) } return testOutput } From 784fbdbc567e177b9bed2b8a7090c9ec8b6aa355 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 30 Aug 2023 09:04:16 -0700 Subject: [PATCH 107/331] Clean up the old isolated crate SDK example layout (#2961) Fixes #2810 ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/sdk-versioner/src/main.rs | 87 +----------------------- tools/ci-scripts/generate-aws-sdk | 2 - 2 files changed, 2 insertions(+), 87 deletions(-) diff --git a/tools/ci-build/sdk-versioner/src/main.rs b/tools/ci-build/sdk-versioner/src/main.rs index 63ffd6bd2f3..df148894d1b 100644 --- a/tools/ci-build/sdk-versioner/src/main.rs +++ b/tools/ci-build/sdk-versioner/src/main.rs @@ -29,10 +29,6 @@ enum Args { /// Path(s) to recursively update Cargo.toml files in #[clap()] crate_paths: Vec, - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): `isolate_crates` can be removed once the `Flat` example directory structure is cleaned up - /// Makes each individual crate its own workspace - #[clap(long)] - isolate_crates: bool, }, /// Revise crates to use version numbers in dependencies UseVersionDependencies { @@ -42,10 +38,6 @@ enum Args { /// Path(s) to recursively update Cargo.toml files in #[clap()] crate_paths: Vec, - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): `isolate_crates` can be removed once the `Flat` example directory structure is cleaned up - /// Makes each individual crate its own workspace - #[clap(long)] - isolate_crates: bool, }, /// Revise crates to use version numbers AND paths in dependencies UsePathAndVersionDependencies { @@ -58,10 +50,6 @@ enum Args { /// Path(s) to recursively update Cargo.toml files in #[clap()] crate_paths: Vec, - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): `isolate_crates` can be removed once the `Flat` example directory structure is cleaned up - /// Makes each individual crate its own workspace - #[clap(long)] - isolate_crates: bool, }, } @@ -74,14 +62,6 @@ impl Args { } } - fn isolate_crates(&self) -> bool { - *match self { - Self::UsePathDependencies { isolate_crates, .. } => isolate_crates, - Self::UseVersionDependencies { isolate_crates, .. } => isolate_crates, - Self::UsePathAndVersionDependencies { isolate_crates, .. } => isolate_crates, - } - } - fn validate(self) -> Result { if self.crate_paths().is_empty() { bail!("Must provide at least one crate path to recursively update"); @@ -141,7 +121,7 @@ fn main() -> Result<()> { } for manifest_path in manifest_paths { - update_manifest(&manifest_path, &dependency_context, args.isolate_crates())?; + update_manifest(&manifest_path, &dependency_context)?; } println!("Finished in {:?}", start_time.elapsed()); @@ -151,7 +131,6 @@ fn main() -> Result<()> { fn update_manifest( manifest_path: &Path, dependency_context: &DependencyContext, - isolate_crates: bool, ) -> anyhow::Result<()> { println!("Updating {:?}...", manifest_path); let crate_path = manifest_path.parent().expect("manifest has a parent"); @@ -179,17 +158,6 @@ fn update_manifest( )? || changed; } } - if isolate_crates && !metadata.contains_key("workspace") { - let package_position = metadata["package"] - .as_table() - .expect("has a package") - .position() - .unwrap_or_default(); - let mut workspace = Table::new(); - workspace.set_position(package_position); - metadata.insert("workspace", Item::Table(workspace)); - changed = true; - } if changed { fs::write(manifest_path, metadata.to_string())?; @@ -373,7 +341,6 @@ features = ["foo", "baz"] #[track_caller] fn test_with_context( - isolate_crates: bool, crate_path_rel: &str, sdk_crates: &[&'static str], context: DependencyContext, @@ -412,7 +379,7 @@ features = ["foo", "baz"] } else { context }; - update_manifest(&manifest_path, &fixed_context, isolate_crates).expect("success"); + update_manifest(&manifest_path, &fixed_context).expect("success"); let actual = String::from_utf8(std::fs::read(&manifest_path).expect("read tmp file")).unwrap(); @@ -423,7 +390,6 @@ features = ["foo", "baz"] #[test] fn update_dependencies_with_versions() { test_with_context( - false, "examples/foo", &[], DependencyContext { @@ -461,7 +427,6 @@ features = ["foo", "baz"] #[test] fn update_dependencies_with_paths() { test_with_context( - false, "path/to/test", &[ "aws-config", @@ -496,11 +461,9 @@ features = ["foo", "baz"] ); } - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): Remove this test #[test] fn update_dependencies_with_paths_dumb_logic() { test_with_context( - false, "path/to/test", &[ "aws-config", @@ -538,7 +501,6 @@ features = ["foo", "baz"] #[test] fn update_dependencies_with_versions_and_paths() { test_with_context( - false, "deep/path/to/test", &[ "aws-config", @@ -569,51 +531,6 @@ aws-smithy-http = { version = "0.9.0", path = "../../../../sdk/aws-smithy-http", something-else = { version = "0.1", no-default-features = true } tokio = { version = "1.18", features = ["net"] } -[dev-dependencies.another-thing] -# some comment -version = "5.0" -# another comment -features = ["foo", "baz"] -"# - ); - } - - #[test] - fn update_dependencies_isolate_crates() { - test_with_context( - true, - "deep/path/to/test", - &[ - "aws-config", - "aws-sdk-s3", - "aws-smithy-types", - "aws-smithy-http", - ], - DependencyContext { - sdk_path: Some(SdkPath::UseNewLogic(PathBuf::from("sdk"))), - versions_manifest: Some(versions_toml_for(&[ - ("aws-config", "0.5.0"), - ("aws-sdk-s3", "0.13.0"), - ("aws-smithy-types", "0.10.0"), - ("aws-smithy-http", "0.9.0"), - ])), - }, - br#" -[package] -name = "test" -version = "0.1.0" - -[workspace] - -# Some comment that should be preserved -[dependencies] -aws-config = { version = "0.5.0", path = "../../../../sdk/aws-config" } -aws-sdk-s3 = { version = "0.13.0", path = "../../../../sdk/s3" } -aws-smithy-types = { version = "0.10.0", path = "../../../../sdk/aws-smithy-types" } -aws-smithy-http = { version = "0.9.0", path = "../../../../sdk/aws-smithy-http", features = ["test-util"] } -something-else = { version = "0.1", no-default-features = true } -tokio = { version = "1.18", features = ["net"] } - [dev-dependencies.another-thing] # some comment version = "5.0" diff --git a/tools/ci-scripts/generate-aws-sdk b/tools/ci-scripts/generate-aws-sdk index 18b29529ad9..d2bf30ec85c 100755 --- a/tools/ci-scripts/generate-aws-sdk +++ b/tools/ci-scripts/generate-aws-sdk @@ -25,8 +25,6 @@ echo -e "${C_YELLOW}Taking examples from 'awsdocs/aws-doc-sdk-examples'...${C_RE examples_revision=$(cd aws-doc-sdk-examples; git rev-parse HEAD) mv aws-doc-sdk-examples/rust_dev_preview smithy-rs/aws/sdk/examples rm -rf smithy-rs/aws/sdk/examples/.cargo -# TODO(https://github.com/awslabs/smithy-rs/issues/2810): This Cargo.toml `rm` can be removed when the flat example structure is cleaned up -rm -f smithy-rs/aws/sdk/examples/Cargo.toml echo -e "${C_YELLOW}Creating empty model metadata file since we don't have model update information...${C_RESET}" MODEL_METADATA_PATH="$(pwd)/model-metadata.toml" From cc690ca4ff47976b66ea67617be094fdf5750b83 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 30 Aug 2023 09:05:02 -0700 Subject: [PATCH 108/331] Generate a region setter in config when the model uses SigV4 (#2960) SDK ad-hoc clients sometimes have endpoint rulesets without a region, but use SigV4. In these cases, the region setter on config is still necessary for signing to succeed, so they should retain the setters for region. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../amazon/smithy/rustsdk/RegionDecorator.kt | 8 +- .../smithy/rustsdk/RegionDecoratorTest.kt | 105 ++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index 5dacc952bdd..25c72ee3efe 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -5,6 +5,8 @@ package software.amazon.smithy.rustsdk +import software.amazon.smithy.aws.traits.auth.SigV4Trait +import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins @@ -82,7 +84,11 @@ class RegionDecorator : ClientCodegenDecorator { override val name: String = "Region" override val order: Byte = 0 - private fun usesRegion(codegenContext: ClientCodegenContext) = codegenContext.getBuiltIn(Builtins.REGION) != null + // Services that have an endpoint ruleset that references the SDK::Region built in, or + // that use SigV4, both need a configurable region. + private fun usesRegion(codegenContext: ClientCodegenContext) = + codegenContext.getBuiltIn(Builtins.REGION) != null || ServiceIndex.of(codegenContext.model) + .getEffectiveAuthSchemes(codegenContext.serviceShape).containsKey(SigV4Trait.ID) override fun configCustomizations( codegenContext: ClientCodegenContext, diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt new file mode 100644 index 00000000000..09001422580 --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt @@ -0,0 +1,105 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import kotlin.io.path.readText + +class RegionDecoratorTest { + private val modelWithoutRegionParamOrSigV4AuthScheme = """ + namespace test + + use aws.api#service + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @awsJson1_0 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": {} + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + operation SomeOperation { output: SomeOutput } + """.asSmithyModel() + + private val modelWithRegionParam = """ + namespace test + + use aws.api#service + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @awsJson1_0 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + operation SomeOperation { output: SomeOutput } + """.asSmithyModel() + + private val modelWithSigV4AuthScheme = """ + namespace test + + use aws.auth#sigv4 + use aws.api#service + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @auth([sigv4]) + @sigv4(name: "dontcare") + @awsJson1_0 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": {} + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + operation SomeOperation { output: SomeOutput } + """.asSmithyModel() + + @Test + fun `models without region built-in params or SigV4 should not have configurable regions`() { + val path = awsSdkIntegrationTest( + modelWithoutRegionParamOrSigV4AuthScheme, + generateOrchestrator = true, + ) { _, _ -> /* it should generate and compile successfully */ } + val configContents = path.resolve("src/config.rs").readText() + assertFalse(configContents.contains("fn set_region(")) + } + + @Test + fun `models with region built-in params should have configurable regions`() { + val path = awsSdkIntegrationTest( + modelWithRegionParam, + generateOrchestrator = true, + ) { _, _ -> /* it should generate and compile successfully */ } + val configContents = path.resolve("src/config.rs").readText() + assertTrue(configContents.contains("fn set_region(")) + } + + @Test + fun `models with SigV4 should have configurable regions`() { + val path = awsSdkIntegrationTest( + modelWithSigV4AuthScheme, + generateOrchestrator = true, + ) { _, _ -> /* it should generate and compile successfully */ } + val configContents = path.resolve("src/config.rs").readText() + assertTrue(configContents.contains("fn set_region(")) + } +} From 1b6f0b8ad0c76cd6a9f9bfaea8f1bd751af4b6d1 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 30 Aug 2023 10:02:21 -0700 Subject: [PATCH 109/331] Add missing changelog entry (#2966) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 0cc492e7ea2..ecab2364c50 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -34,3 +34,9 @@ message = "`CustomizableOperation`, created as a result of calling the `.customi references = ["smithy-rs#2944", "smithy-rs#2951"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "ysaito1001" + +[[smithy-rs]] +message = "Generate a region setter when a model uses SigV4." +references = ["smithy-rs#2960"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "jdisanti" From c98d5febacd0cff91ea0aa77161e85d5cbdb967b Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 31 Aug 2023 09:43:02 -0700 Subject: [PATCH 110/331] Fix codegen for unions with the `@httpPayload` trait (#2969) This PR incorporates the new test cases in Smithy from https://github.com/smithy-lang/smithy/pull/1908, and adds support to `@restXml` and `@restJson1` for unions with the `@httpPayload` trait. This resolves https://github.com/awslabs/smithy-rs/issues/1896. This also fixes code generation for the latest `medicalimaging` SDK model. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++ .../model/rest-xml-extras.smithy | 96 +++++++++++++++++++ .../rest-json-extras.smithy | 96 +++++++++++++++++++ .../HttpBoundProtocolPayloadGenerator.kt | 2 +- .../serialize/JsonSerializerGenerator.kt | 13 ++- .../serialize/QuerySerializerGenerator.kt | 4 + .../StructuredDataSerializerGenerator.kt | 13 ++- .../XmlBindingTraitSerializerGenerator.kt | 15 ++- 8 files changed, 238 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e538133e782..5f3224f6955 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -84,3 +84,9 @@ message = "Generate a region setter when a model uses SigV4." references = ["smithy-rs#2960"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = "Fix code generation for union members with the `@httpPayload` trait." +references = ["smithy-rs#2969", "smithy-rs#1896"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } +author = "jdisanti" diff --git a/codegen-client-test/model/rest-xml-extras.smithy b/codegen-client-test/model/rest-xml-extras.smithy index 76a6bbd9fa8..0c20c273cd1 100644 --- a/codegen-client-test/model/rest-xml-extras.smithy +++ b/codegen-client-test/model/rest-xml-extras.smithy @@ -21,6 +21,9 @@ service RestXmlExtras { StringHeader, CreateFoo, RequiredMember, + // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy + // They're being added in https://github.com/smithy-lang/smithy/pull/1908 + HttpPayloadWithUnion, ] } @@ -257,3 +260,96 @@ structure RequiredMemberInputOutput { @required requiredString: String } + +// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them +// They're being added in https://github.com/smithy-lang/smithy/pull/1908 + +/// This example serializes a union in the payload. +@idempotent +@http(uri: "/HttpPayloadWithUnion", method: "PUT") +operation HttpPayloadWithUnion { + input: HttpPayloadWithUnionInputOutput, + output: HttpPayloadWithUnionInputOutput +} + +apply HttpPayloadWithUnion @httpRequestTests([ + { + id: "RestXmlHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restXml, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: """ + + hello + """, + bodyMediaType: "application/xml", + headers: { + "Content-Type": "application/xml", + }, + requireHeaders: [ + "Content-Length" + ], + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestXmlHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restXml, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: "", + headers: { + "Content-Type": "application/xml", + "Content-Length": "0" + }, + params: {} + } +]) + +apply HttpPayloadWithUnion @httpResponseTests([ + { + id: "RestXmlHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restXml, + code: 200, + body: """ + + hello + """, + bodyMediaType: "application/xml", + headers: { + "Content-Type": "application/xml", + }, + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestXmlHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restXml, + code: 200, + body: "", + headers: { + "Content-Type": "application/xml", + "Content-Length": "0" + }, + params: {} + } +]) + +structure HttpPayloadWithUnionInputOutput { + @httpPayload + nested: UnionPayload, +} + +union UnionPayload { + greeting: String +} diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index ff92f36c6bd..d946ab0b5db 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -65,6 +65,9 @@ service RestJsonExtras { NullInNonSparse, CaseInsensitiveErrorOperation, EmptyStructWithContentOnWireOp, + // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy + // They're being added in https://github.com/smithy-lang/smithy/pull/1908 + HttpPayloadWithUnion, ], errors: [ExtraError] } @@ -348,3 +351,96 @@ structure EmptyStructWithContentOnWireOpOutput { operation EmptyStructWithContentOnWireOp { output: EmptyStructWithContentOnWireOpOutput, } + +// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them +// They're being added in https://github.com/smithy-lang/smithy/pull/1908 + +/// This examples serializes a union in the payload. +@idempotent +@http(uri: "/HttpPayloadWithUnion", method: "PUT") +operation HttpPayloadWithUnion { + input: HttpPayloadWithUnionInputOutput, + output: HttpPayloadWithUnionInputOutput +} + +structure HttpPayloadWithUnionInputOutput { + @httpPayload + nested: UnionPayload, +} + +union UnionPayload { + greeting: String +} + +apply HttpPayloadWithUnion @httpRequestTests([ + { + id: "RestJsonHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restJson1, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: """ + { + "greeting": "hello" + }""", + bodyMediaType: "application/json", + headers: { + "Content-Type": "application/json" + }, + requireHeaders: [ + "Content-Length" + ], + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestJsonHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restJson1, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: "", + headers: { + "Content-Type": "application/json", + "Content-Length": "0" + }, + params: {} + } +]) + +apply HttpPayloadWithUnion @httpResponseTests([ + { + id: "RestJsonHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restJson1, + code: 200, + body: """ + { + "greeting": "hello" + }""", + bodyMediaType: "application/json", + headers: { + "Content-Type": "application/json" + }, + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestJsonHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restJson1, + code: 200, + body: "", + headers: { + "Content-Type": "application/json", + "Content-Length": "0" + }, + params: {} + } +]) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt index 2c6ffc662ce..0ed594fc285 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt @@ -269,7 +269,7 @@ class HttpBoundProtocolPayloadGenerator( """, ) is StructureShape -> rust("#T()", serializerGenerator.unsetStructure(targetShape)) - is UnionShape -> throw CodegenException("Currently unsupported. Tracking issue: https://github.com/awslabs/smithy-rs/issues/1896") + is UnionShape -> rust("#T()", serializerGenerator.unsetUnion(targetShape)) else -> throw CodegenException("`httpPayload` on member shapes targeting shapes of type ${targetShape.type} is unsupported") } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt index 87562dc2ab6..981706b5665 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt @@ -36,6 +36,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section @@ -170,7 +171,7 @@ class JsonSerializerGenerator( private val runtimeConfig = codegenContext.runtimeConfig private val protocolFunctions = ProtocolFunctions(codegenContext) private val codegenScope = arrayOf( - "String" to RuntimeType.String, + *preludeScope, "Error" to runtimeConfig.serializationError(), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "JsonObjectWriter" to RuntimeType.smithyJson(runtimeConfig).resolve("serialize::JsonObjectWriter"), @@ -232,7 +233,7 @@ class JsonSerializerGenerator( } override fun unsetStructure(structure: StructureShape): RuntimeType = - ProtocolFunctions.crossOperationFn("rest_json_unsetpayload") { fnName -> + ProtocolFunctions.crossOperationFn("rest_json_unset_struct_payload") { fnName -> rustTemplate( """ pub fn $fnName() -> #{ByteSlab} { @@ -243,6 +244,14 @@ class JsonSerializerGenerator( ) } + override fun unsetUnion(union: UnionShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_json_unset_union_payload") { fnName -> + rustTemplate( + "pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }", + *codegenScope, + ) + } + override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? { // Don't generate an operation JSON serializer if there is no JSON body. val httpDocumentMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt index 974e112cde7..1a5b37bc749 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt @@ -121,6 +121,10 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct TODO("AwsQuery doesn't support payload serialization") } + override fun unsetUnion(union: UnionShape): RuntimeType { + TODO("AwsQuery doesn't support payload serialization") + } + override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? { val inputShape = operationShape.inputShape(model) return protocolFunctions.serializeFn(inputShape, fnNameSuffix = "input") { fnName -> diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt index 962b9c87201..92b28d89fcf 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType interface StructuredDataSerializerGenerator { @@ -27,12 +28,22 @@ interface StructuredDataSerializerGenerator { * Generate the correct data when attempting to serialize a structure that is unset * * ```rust - * fn rest_json_unsetpayload() -> Vec { + * fn rest_json_unset_struct_payload() -> Vec { * ... * } */ fun unsetStructure(structure: StructureShape): RuntimeType + /** + * Generate the correct data when attempting to serialize a union that is unset + * + * ```rust + * fn rest_json_unset_union_payload() -> Vec { + * ... + * } + */ + fun unsetUnion(union: UnionShape): RuntimeType + /** * Generate a serializer for an operation input structure. * This serializer is only used by clients. diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt index 678768cfa70..fc4f0198387 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt @@ -35,6 +35,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant import software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError @@ -176,8 +177,8 @@ class XmlBindingTraitSerializerGenerator( } } - override fun unsetStructure(structure: StructureShape): RuntimeType { - return ProtocolFunctions.crossOperationFn("rest_xml_unset_payload") { fnName -> + override fun unsetStructure(structure: StructureShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_xml_unset_struct_payload") { fnName -> rustTemplate( """ pub fn $fnName() -> #{ByteSlab} { @@ -187,7 +188,15 @@ class XmlBindingTraitSerializerGenerator( "ByteSlab" to RuntimeType.ByteSlab, ) } - } + + override fun unsetUnion(union: UnionShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_xml_unset_union_payload") { fnName -> + rustTemplate( + "pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }", + *preludeScope, + "ByteSlab" to RuntimeType.ByteSlab, + ) + } override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? { val outputShape = operationShape.outputShape(model) From 2c27834f90b0585dba60606f9da6246b341227d6 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 31 Aug 2023 15:26:07 -0400 Subject: [PATCH 111/331] Make required context parameters required (#2964) ## Motivation and Context When a `@contextParam` is marked as required, we will enforce it on inputs. Since these fields may influence endpoint, omitting them can result in a different target being hit. - #1668 - aws-sdk-rust#873 ## Description ## Testing - [x] S3 Integration test ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 +++++++ .../s3/tests/bucket-required.rs | 28 +++++++++++++++ .../integration-tests/s3/tests/request_id.rs | 4 +++ build.gradle.kts | 2 +- .../EndpointParamsInterceptorGenerator.kt | 7 ++-- .../smithy/endpoint/EndpointsDecoratorTest.kt | 5 +++ .../rust/codegen/core/rustlang/Writable.kt | 9 ++++- .../smithy/generators/BuilderGenerator.kt | 34 ++++++++++++++++++- .../codegen/core/rustlang/WritableTest.kt | 10 ++++++ settings.gradle.kts | 2 +- 10 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 aws/sdk/integration-tests/s3/tests/bucket-required.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 5f3224f6955..63c22df5e86 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -90,3 +90,15 @@ message = "Fix code generation for union members with the `@httpPayload` trait." references = ["smithy-rs#2969", "smithy-rs#1896"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered." +references = ["smithy-rs#1668", "aws-sdk-rust#873", "smithy-rs#2964"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "rcoh" + +[[smithy-rs]] +message = "Required members with @contextParam are now treated as client-side required." +references = ["smithy-rs#2964"] +meta = { "breaking" = false, "tada" = false, "bug" = false, target = "client" } +author = "rcoh" diff --git a/aws/sdk/integration-tests/s3/tests/bucket-required.rs b/aws/sdk/integration-tests/s3/tests/bucket-required.rs new file mode 100644 index 00000000000..7ef77310663 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/bucket-required.rs @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_config::SdkConfig; +use aws_credential_types::provider::SharedCredentialsProvider; +use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::Client; +use aws_smithy_client::test_connection::capture_request; + +#[tokio::test] +async fn dont_dispatch_when_bucket_is_unset() { + let (conn, rcvr) = capture_request(None); + let sdk_config = SdkConfig::builder() + .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .region(Region::new("us-east-1")) + .http_connector(conn.clone()) + .build(); + let client = Client::new(&sdk_config); + let err = client + .list_objects_v2() + .send() + .await + .expect_err("bucket not set"); + assert_eq!(format!("{}", err), "failed to construct request"); + rcvr.expect_no_request(); +} diff --git a/aws/sdk/integration-tests/s3/tests/request_id.rs b/aws/sdk/integration-tests/s3/tests/request_id.rs index d81da66b42b..1df48038f23 100644 --- a/aws/sdk/integration-tests/s3/tests/request_id.rs +++ b/aws/sdk/integration-tests/s3/tests/request_id.rs @@ -36,6 +36,7 @@ async fn get_request_id_from_modeled_error() { let err = client .get_object() .key("dontcare") + .bucket("dontcare") .send() .await .expect_err("status was 404, this is an error") @@ -83,6 +84,7 @@ async fn get_request_id_from_unmodeled_error() { let client = Client::from_conf(config); let err = client .get_object() + .bucket("dontcare") .key("dontcare") .send() .await @@ -156,6 +158,7 @@ async fn get_request_id_from_successful_streaming_response() { let output = client .get_object() .key("dontcare") + .bucket("dontcare") .send() .await .expect("valid successful response"); @@ -194,6 +197,7 @@ async fn conversion_to_service_error_maintains_request_id() { let client = Client::from_conf(config); let err = client .get_object() + .bucket("dontcare") .key("dontcare") .send() .await diff --git a/build.gradle.kts b/build.gradle.kts index a2d6385db4e..2a4758345fe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ plugins { } allprojects { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index a2c8a581b71..e7114433b4a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -28,6 +28,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.generators.enforceRequired import software.amazon.smithy.rust.codegen.core.util.PANIC import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -134,8 +135,10 @@ class EndpointParamsInterceptorGenerator( // lastly, allow these to be overridden by members memberParams.forEach { (memberShape, param) -> val memberName = codegenContext.symbolProvider.toMemberName(memberShape) - rust( - ".${EndpointParamsGenerator.setterName(param.name)}(_input.$memberName.clone())", + val member = memberShape.enforceRequired(writable("_input.$memberName.clone()"), codegenContext) + + rustTemplate( + ".${EndpointParamsGenerator.setterName(param.name)}(#{member})", "member" to member, ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 1836a090bb6..d6878f1b96b 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -111,6 +111,7 @@ class EndpointsDecoratorTest { structure TestOperationInput { @contextParam(name: "Bucket") + @required bucket: String, nested: NestedStructure } @@ -210,6 +211,10 @@ class EndpointsDecoratorTest { interceptor.called.load(Ordering::Relaxed), "the interceptor should have been called" ); + + // bucket_name is unset and marked as required on the model, so we'll refuse to construct this request + let err = client.test_operation().send().await.expect_err("param missing"); + assert_eq!(format!("{}", err), "failed to construct request"); } """, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt index b17eb3b030a..e1b5ee64c28 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt @@ -25,6 +25,11 @@ fun Writable.isEmpty(): Boolean { return writer.toString() == RustWriter.root().toString() } +fun Writable.map(f: RustWriter.(Writable) -> Unit): Writable { + val self = this + return writable { f(self) } +} + fun Writable.isNotEmpty(): Boolean = !this.isEmpty() operator fun Writable.plus(other: Writable): Writable { @@ -108,10 +113,12 @@ fun rustTypeParameters( "#{gg:W}", "gg" to typeParameter.declaration(withAngleBrackets = false), ) + else -> { // Check if it's a writer. If it is, invoke it; Else, throw a codegen error. @Suppress("UNCHECKED_CAST") - val func = typeParameter as? Writable ?: throw CodegenException("Unhandled type '$typeParameter' encountered by rustTypeParameters writer") + val func = typeParameter as? Writable + ?: throw CodegenException("Unhandled type '$typeParameter' encountered by rustTypeParameters writer") func.invoke(this) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index e86061c4c3c..9697cc624f7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.codegen.core.SymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive @@ -21,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlockTemplat import software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape +import software.amazon.smithy.rust.codegen.core.rustlang.map import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock @@ -29,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.Default import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -46,6 +49,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.redactIfNecessary import software.amazon.smithy.rust.codegen.core.util.toSnakeCase @@ -76,10 +80,37 @@ abstract class BuilderCustomization : NamedCustomization() fun RuntimeConfig.operationBuildError() = RuntimeType.operationModule(this).resolve("error::BuildError") fun RuntimeConfig.serializationError() = RuntimeType.operationModule(this).resolve("error::SerializationError") +fun MemberShape.enforceRequired( + field: Writable, + codegenContext: CodegenContext, + produceOption: Boolean = true, +): Writable { + if (!this.isRequired) { + return field + } + val shape = this + val error = OperationBuildError(codegenContext.runtimeConfig).missingField( + codegenContext.symbolProvider.toMemberName(shape), "A required field was not set", + ) + val unwrapped = when (codegenContext.model.expectShape(this.target)) { + is StringShape -> writable { + rustTemplate( + "#{field}.filter(|f|!AsRef::::as_ref(f).trim().is_empty())", + "field" to field, + ) + } + + else -> field + }.map { base -> rustTemplate("#{base}.ok_or_else(||#{error})?", "base" to base, "error" to error) } + return unwrapped.letIf(produceOption) { w -> w.map { rust("Some(#T)", it) } } +} + class OperationBuildError(private val runtimeConfig: RuntimeConfig) { + fun missingField(field: String, details: String) = writable { rust("#T::missing_field(${field.dq()}, ${details.dq()})", runtimeConfig.operationBuildError()) } + fun invalidField(field: String, details: String) = invalidField(field) { rust(details.dq()) } fun invalidField(field: String, details: Writable) = writable { rustTemplate( @@ -164,7 +195,8 @@ class BuilderGenerator( } private fun RustWriter.missingRequiredField(field: String) { - val detailedMessage = "$field was not specified but it is required when building ${symbolProvider.toSymbol(shape).name}" + val detailedMessage = + "$field was not specified but it is required when building ${symbolProvider.toSymbol(shape).name}" OperationBuildError(runtimeConfig).missingField(field, detailedMessage)(this) } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt index 04c5ff2f1a4..a9b45582ef5 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.rustlang import io.kotest.matchers.string.shouldContain +import io.kotest.matchers.string.shouldEndWith import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -106,4 +107,13 @@ internal class RustTypeParametersTest { }.join(writable("+"))(writer) writer.toString() shouldContain "A-B-CD+E+F" } + + @Test + fun `test map`() { + val writer = RustWriter.forModule("model") + val a = writable { rust("a") } + val b = a.map { rust("b(#T)", it) } + b(writer) + writer.toString().trim() shouldEndWith "b(a)" + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 6c920d72174..d168d72c0d2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -29,7 +29,7 @@ pluginManagement { buildscript { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } From be9093c90d5b7657490a6bacd33fee0a90bc2127 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 5 Sep 2023 22:07:26 -0500 Subject: [PATCH 112/331] Remove `once_cell` from public API (#2973) ## Motivation and Context Addresses 7 in #2413 ## Description This small PR removes uses of `once_cell` from public API. The `http_versions` module in the `aws_smithy_http` crate was dead-code. ## Testing Relies on existing tests in CI. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- CHANGELOG.next.toml | 12 ++++++++++++ .../aws-smithy-http/external-types.toml | 3 --- .../aws-smithy-http/src/http_versions.rs | 17 ----------------- rust-runtime/aws-smithy-http/src/lib.rs | 1 - 4 files changed, 12 insertions(+), 21 deletions(-) delete mode 100644 rust-runtime/aws-smithy-http/src/http_versions.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 63c22df5e86..468c033fae9 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -102,3 +102,15 @@ message = "Required members with @contextParam are now treated as client-side re references = ["smithy-rs#2964"] meta = { "breaking" = false, "tada" = false, "bug" = false, target = "client" } author = "rcoh" + +[[aws-sdk-rust]] +message = "Remove `once_cell` from public API" +references = ["smithy-rs#2973"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "ysaito1001" + +[[smithy-rs]] +message = "Remove `once_cell` from public API" +references = ["smithy-rs#2973"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "ysaito1001" diff --git a/rust-runtime/aws-smithy-http/external-types.toml b/rust-runtime/aws-smithy-http/external-types.toml index a228978c9a7..cf745485bb7 100644 --- a/rust-runtime/aws-smithy-http/external-types.toml +++ b/rust-runtime/aws-smithy-http/external-types.toml @@ -26,9 +26,6 @@ allowed_external_types = [ # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate references to Tokio `File` "tokio::fs::file::File", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose `once_cell` in public API - "once_cell::sync::Lazy", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", ] diff --git a/rust-runtime/aws-smithy-http/src/http_versions.rs b/rust-runtime/aws-smithy-http/src/http_versions.rs deleted file mode 100644 index 4f4373589f1..00000000000 --- a/rust-runtime/aws-smithy-http/src/http_versions.rs +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Version-related code - -use http::Version as HttpVersion; -use once_cell::sync::Lazy; - -/// A list of supported or desired HttpVersions. Typically use when requesting an HTTP Client from a -/// client cache. -pub type HttpVersionList = Vec; - -/// The default list of desired HTTP protocol versions to use when making requests -pub static DEFAULT_HTTP_VERSION_LIST: Lazy = - Lazy::new(|| vec![HttpVersion::HTTP_11]); diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index ad53e37f9c0..b24ecd3bf13 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -29,7 +29,6 @@ pub mod body; pub mod endpoint; pub mod header; pub mod http; -pub mod http_versions; pub mod label; pub mod middleware; pub mod operation; From 8a3b8f3a00f52c8b16ee6b5a080b8dcf4d89faf5 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 6 Sep 2023 20:16:46 -0500 Subject: [PATCH 113/331] Update the base image for ci-build's Dockerfile (#2674) ## Motivation and Context ~~**The PR will be a draft until https://github.com/awslabs/smithy-rs/pull/2675 is merged into `main`. Once that's merged, this PR can remove the change to `Cargo.toml` in `aws-smithy-client`.**~~ **Now that it's passed tests in CI, ysaito1001 will merge this PR once it has passed the internal tests** Fixes https://github.com/awslabs/smithy-rs/issues/2500. ## Description This PR updates the base image for ci-build's Dockerfile as the latest image for [amazonlinux](https://gallery.ecr.aws/amazonlinux/amazonlinux) has been updated to 2023. As part of it, the changes to Dockerfile include - Fixing conflicting curl's libraries by specifying `--allowerasing` Without it, we'd get an error as follows: ``` package curl-minimal-7.88.1-1.amzn2023.0.1.x86_64 conflicts with curl provided by curl-7.87.0-2.amzn2023.0.2.x86_64 ``` - Adding perl explicitly as a new version of openssl now requires it Without `perl`, we'd get an error as follows: ``` Step 24/48 : RUN cargo +${rust_nightly_version} -Z sparse-registry install cargo-deny --locked --version ${cargo_deny_version} ---> Running in 3c3431881cfa ... error: failed to run custom build command for `openssl-sys v0.9.76` ... --- stderr Can't locate FindBin.pm in @INC (you may need to install the FindBin module) (@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at ./Configure line 15. BEGIN failed--compilation aborted at ./Configure line 15. thread 'main' panicked at ' ``` Also, there is a change to `Cargo.toml` in `aws-smithy-client`: - Forcing `aws-smithy-client` with `native-tls` feature to use a more recent `openssl-sys` crate Without it, `cargo minimal-versions check` would fail in `aws-smithy-client` trying to build `openssl-sys` v0.9.39 where OpenSSL in a container is more up-to-date, leading to a build failure (See [this issue](https://github.com/sfackler/rust-openssl/issues/1724) for more details) Finally, updating CI for `Run Tests on Windows` - Manually installing `openssl` as [suggested](https://github.com/sfackler/rust-openssl/issues/1542#issuecomment-1399358351). Without it, after introducing a more recent `openssl` 0.10.52 `dev-dependencies` in `aws-smithy-client`, we'd get this on Windows: ``` --- stderr thread 'main' panicked at ' Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge. If OpenSSL is installed and this crate had trouble finding it, you can set the `OPENSSL_DIR` environment variable for the compilation process. Make sure you also have the development packages of openssl installed. For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora. If you're in a situation where you think the directory *should* be found automatically, please open a bug at https://github.com/sfackler/rust-openssl and include information about your system as well as this message. $HOST = x86_64-pc-windows-msvc $TARGET = x86_64-pc-windows-msvc openssl-sys = 0.9.90 ``` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Yuki Saito Co-authored-by: Zelda Hessler --- .github/workflows/ci.yml | 3 +++ rust-runtime/aws-smithy-client/Cargo.toml | 6 ++++++ tools/ci-build/Dockerfile | 10 ++++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9108652368a..c56ec564cfd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -186,6 +186,9 @@ jobs: with: toolchain: ${{ env.rust_version }} components: ${{ env.rust_toolchain_components }} + # To fix OpenSSL not found on Windows: https://github.com/sfackler/rust-openssl/issues/1542 + - run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append + - run: vcpkg install openssl:x64-windows-static-md - name: Run tests shell: bash run: | diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index 5426587c9d8..c691e851ef9 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -33,6 +33,10 @@ hyper = { version = "0.14.26", default-features = false, optional = true } # https://github.com/rust-lang/cargo/issues/1596 hyper-rustls = { version = "0.24", optional = true, features = ["rustls-native-certs", "http2"] } hyper-tls = { version = "0.5.0", optional = true } +# This forces a more recent version of `openssl-sys` to be brought in. +# Without this `cargo minimal-versions check` would fail in a container whose base image is `amazonlinux:2023` +# with the failure symptom: https://github.com/sfackler/rust-openssl/issues/1724 +openssl = { version = "0.10.52", optional = true } rustls = { version = "0.21.1", optional = true } lazy_static = { version = "1", optional = true } pin-project-lite = "0.2.7" @@ -45,6 +49,8 @@ tracing = "0.1" [dev-dependencies] aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio"] } hyper-tls = { version = "0.5.0" } +# Dependency on `openssl` above needs to be repeated here. +openssl = "0.10.52" serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1.23.1", features = ["full", "test-util"] } diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 5a7b9a230aa..5bba3040f1e 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -5,7 +5,7 @@ # This is the base Docker build image used by CI -ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 +ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2023 ARG rust_stable_version=1.70.0 ARG rust_nightly_version=nightly-2023-05-31 @@ -13,7 +13,7 @@ FROM ${base_image} AS bare_base_image RUN yum -y updateinfo FROM bare_base_image as musl_toolchain -RUN yum -y install tar gzip gcc make +RUN yum -y install --allowerasing tar gzip gcc make RUN curl https://musl.libc.org/releases/musl-1.2.3.tar.gz -o musl-1.2.3.tar.gz \ && ls \ && tar xvzf musl-1.2.3.tar.gz \ @@ -30,7 +30,7 @@ ENV RUSTUP_HOME=/opt/rustup \ PATH=/opt/cargo/bin/:${PATH} \ CARGO_INCREMENTAL=0 WORKDIR /root -RUN yum -y install \ +RUN yum -y install --allowerasing \ autoconf \ automake \ binutils \ @@ -41,6 +41,7 @@ RUN yum -y install \ git \ make \ openssl-devel \ + perl \ pkgconfig \ tar \ xz && \ @@ -153,12 +154,13 @@ FROM bare_base_image AS final_image ARG rust_stable_version ARG rust_nightly_version RUN set -eux; \ - yum -y install \ + yum -y install --allowerasing \ bc \ ca-certificates \ clang \ gcc \ git \ + glibc-langpack-en \ java-11-amazon-corretto-headless \ make \ openssl-devel \ From e322a2d73329963f6d3cb3794c54fef67ec1a2dd Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 7 Sep 2023 09:54:56 -0700 Subject: [PATCH 114/331] Port middleware connectors to the orchestrator (#2970) This PR ports all the connectors from the `aws-smithy-client` crate into `aws-smithy-runtime` implementing the new `HttpConnector` trait. The old connectors are left in place for now, and follow up PRs will remove them as well as revise the generated configs to take `HttpConnector` impls rather than `DynConnector`. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Zelda Hessler --- CHANGELOG.next.toml | 24 + rust-runtime/aws-smithy-client/src/erase.rs | 6 +- .../aws-smithy-runtime-api/Cargo.toml | 1 + .../aws-smithy-runtime-api/src/client.rs | 1 - .../src/client/connectors.rs | 88 +- .../src/client/runtime_components.rs | 10 +- .../src/client/runtime_plugin.rs | 50 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 10 +- .../aws-smithy-runtime/external-types.toml | 18 + rust-runtime/aws-smithy-runtime/src/client.rs | 9 +- .../src/client/connectors.rs | 12 +- .../src/client/connectors/hyper_connector.rs | 869 ++++++++++++++++++ .../src/client/connectors/test_util.rs | 293 +----- .../connectors/test_util/capture_request.rs | 84 ++ .../src/client/connectors/test_util/dvr.rs | 274 ++++++ .../client/connectors/test_util/dvr/record.rs | 202 ++++ .../client/connectors/test_util/dvr/replay.rs | 351 +++++++ .../connectors/test_util/event_connector.rs | 187 ++++ .../client/connectors/test_util/infallible.rs | 62 ++ .../src/client/connectors/test_util/never.rs | 42 + .../src/client/orchestrator.rs | 19 +- .../test-data/example.com.json | 106 +++ 22 files changed, 2399 insertions(+), 319 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs create mode 100644 rust-runtime/aws-smithy-runtime/test-data/example.com.json diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 468c033fae9..6967c64b366 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -103,6 +103,30 @@ references = ["smithy-rs#2964"] meta = { "breaking" = false, "tada" = false, "bug" = false, target = "client" } author = "rcoh" +[[smithy-rs]] +message = "`aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`." +references = ["smithy-rs#2970"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[smithy-rs]] +message = "Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature." +references = ["smithy-rs#2970"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[smithy-rs]] +message = "DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively." +references = ["smithy-rs#2970"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[smithy-rs]] +message = "TestConnection was renamed to EventConnector." +references = ["smithy-rs#2970"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + [[aws-sdk-rust]] message = "Remove `once_cell` from public API" references = ["smithy-rs#2973"] diff --git a/rust-runtime/aws-smithy-client/src/erase.rs b/rust-runtime/aws-smithy-client/src/erase.rs index d966664b3b5..406dd973932 100644 --- a/rust-runtime/aws-smithy-client/src/erase.rs +++ b/rust-runtime/aws-smithy-client/src/erase.rs @@ -169,10 +169,8 @@ impl DynConnector { pub fn call_lite( &mut self, req: http::Request, - ) -> BoxFuture, Box> - { - let future = Service::call(self, req); - Box::pin(async move { future.await.map_err(|err| Box::new(err) as _) }) + ) -> BoxFuture, ConnectorError> { + Service::call(self, req) } } diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index e9b4c0bc61a..a17caead014 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -21,6 +21,7 @@ aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-types = { path = "../aws-smithy-types" } bytes = "1" http = "0.2.3" +pin-project-lite = "0.2" tokio = { version = "1.25", features = ["sync"] } tracing = "0.1" zeroize = { version = "1", optional = true } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index d67921332fe..9f8a05686eb 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -20,7 +20,6 @@ pub mod runtime_plugin; pub mod auth; -/// Smithy connectors and related code. pub mod connectors; pub mod ser_de; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs index 79629b9af10..dd91f634ba3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs @@ -3,9 +3,91 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; +//! Smithy connectors and related code. +//! +//! # What is a connector? +//! +//! When we talk about connectors, we are referring to the [`HttpConnector`] trait, and implementations of +//! that trait. This trait simply takes a HTTP request, and returns a future with the response for that +//! request. +//! +//! This is slightly different from what a connector is in other libraries such as +//! [`hyper`](https://crates.io/crates/hyper). In hyper 0.x, the connector is a +//! [`tower`](https://crates.io/crates/tower) `Service` that takes a `Uri` and returns +//! a future with something that implements `AsyncRead + AsyncWrite`. +//! +//! The [`HttpConnector`](crate::client::connectors::HttpConnector) is designed to be a layer on top of +//! whole HTTP libraries, such as hyper, which allows Smithy clients to be agnostic to the underlying HTTP +//! transport layer. This also makes it easy to write tests with a fake HTTP connector, and several +//! such test connector implementations are availble in [`aws-smithy-runtime`](https://crates.io/crates/aws-smithy-runtime). +//! +//! # Responsibilities of a connector +//! +//! A connector primarily makes HTTP requests, but can also be used to implement connect and read +//! timeouts. The `HyperConnector` in [`aws-smithy-runtime`](https://crates.io/crates/aws-smithy-runtime) +//! is an example where timeouts are implemented as part of the connector. +//! +//! Connectors are also responsible for DNS lookup, TLS, connection reuse, pooling, and eviction. +//! The Smithy clients have no knowledge of such concepts. + +use crate::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_async::future::now_or_later::NowOrLater; +use aws_smithy_http::result::ConnectorError; +use pin_project_lite::pin_project; use std::fmt; +use std::future::Future as StdFuture; +use std::pin::Pin; use std::sync::Arc; +use std::task::Poll; + +type BoxFuture = Pin> + Send>>; + +pin_project! { + /// Future for [`HttpConnector::call`]. + pub struct HttpConnectorFuture { + #[pin] + inner: NowOrLater, BoxFuture>, + } +} + +impl HttpConnectorFuture { + /// Create a new `HttpConnectorFuture` with the given future. + pub fn new(future: F) -> Self + where + F: StdFuture> + Send + 'static, + { + Self { + inner: NowOrLater::new(Box::pin(future)), + } + } + + /// Create a new `HttpConnectorFuture` with the given boxed future. + /// + /// Use this if you already have a boxed future to avoid double boxing it. + pub fn new_boxed( + future: Pin> + Send>>, + ) -> Self { + Self { + inner: NowOrLater::new(future), + } + } + + /// Create a `HttpConnectorFuture` that is immediately ready with the given result. + pub fn ready(result: Result) -> Self { + Self { + inner: NowOrLater::ready(result), + } + } +} + +impl StdFuture for HttpConnectorFuture { + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll { + let this = self.project(); + this.inner.poll(cx) + } +} /// Trait with a `call` function that asynchronously converts a request into a response. /// @@ -16,7 +98,7 @@ use std::sync::Arc; /// for testing. pub trait HttpConnector: Send + Sync + fmt::Debug { /// Asynchronously converts a request into a response. - fn call(&self, request: HttpRequest) -> BoxFuture; + fn call(&self, request: HttpRequest) -> HttpConnectorFuture; } /// A shared [`HttpConnector`] implementation. @@ -31,7 +113,7 @@ impl SharedHttpConnector { } impl HttpConnector for SharedHttpConnector { - fn call(&self, request: HttpRequest) -> BoxFuture { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { (*self.0).call(request) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 520c164e749..ac67705ef6d 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -511,11 +511,11 @@ impl RuntimeComponentsBuilder { #[cfg(feature = "test-util")] pub fn for_tests() -> Self { use crate::client::auth::AuthSchemeOptionResolver; - use crate::client::connectors::HttpConnector; + use crate::client::connectors::{HttpConnector, HttpConnectorFuture}; use crate::client::endpoint::{EndpointResolver, EndpointResolverParams}; use crate::client::identity::Identity; use crate::client::identity::IdentityResolver; - use crate::client::orchestrator::Future; + use crate::client::orchestrator::{Future, HttpRequest}; use crate::client::retries::RetryStrategy; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::time::TimeSource; @@ -537,11 +537,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeConnector; impl HttpConnector for FakeConnector { - fn call( - &self, - _: crate::client::orchestrator::HttpRequest, - ) -> crate::client::orchestrator::BoxFuture - { + fn call(&self, _: HttpRequest) -> HttpConnectorFuture { unreachable!("fake connector must be overridden for this test") } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index b41a0048a3a..7d6704c3225 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -258,8 +258,8 @@ impl RuntimePlugins { #[cfg(test)] mod tests { use super::{RuntimePlugin, RuntimePlugins}; - use crate::client::connectors::{HttpConnector, SharedHttpConnector}; - use crate::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; + use crate::client::connectors::{HttpConnector, HttpConnectorFuture, SharedHttpConnector}; + use crate::client::orchestrator::HttpRequest; use crate::client::runtime_components::RuntimeComponentsBuilder; use crate::client::runtime_plugin::Order; use aws_smithy_http::body::SdkBody; @@ -338,12 +338,12 @@ mod tests { #[tokio::test] async fn components_can_wrap_components() { - // CN1, the inner connector, creates a response with a `rp1` header + // Connector1, the inner connector, creates a response with a `rp1` header #[derive(Debug)] - struct CN1; - impl HttpConnector for CN1 { - fn call(&self, _: HttpRequest) -> BoxFuture { - Box::pin(async { + struct Connector1; + impl HttpConnector for Connector1 { + fn call(&self, _: HttpRequest) -> HttpConnectorFuture { + HttpConnectorFuture::new(async { Ok(http::Response::builder() .status(200) .header("rp1", "1") @@ -353,13 +353,13 @@ mod tests { } } - // CN2, the outer connector, calls the inner connector and adds the `rp2` header to the response + // Connector2, the outer connector, calls the inner connector and adds the `rp2` header to the response #[derive(Debug)] - struct CN2(SharedHttpConnector); - impl HttpConnector for CN2 { - fn call(&self, request: HttpRequest) -> BoxFuture { + struct Connector2(SharedHttpConnector); + impl HttpConnector for Connector2 { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { let inner = self.0.clone(); - Box::pin(async move { + HttpConnectorFuture::new(async move { let mut resp = inner.call(request).await.unwrap(); resp.headers_mut() .append("rp2", HeaderValue::from_static("1")); @@ -368,10 +368,10 @@ mod tests { } } - // RP1 registers CN1 + // Plugin1 registers Connector1 #[derive(Debug)] - struct RP1; - impl RuntimePlugin for RP1 { + struct Plugin1; + impl RuntimePlugin for Plugin1 { fn order(&self) -> Order { Order::Overrides } @@ -381,16 +381,16 @@ mod tests { _: &RuntimeComponentsBuilder, ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Owned( - RuntimeComponentsBuilder::new("RP1") - .with_http_connector(Some(SharedHttpConnector::new(CN1))), + RuntimeComponentsBuilder::new("Plugin1") + .with_http_connector(Some(SharedHttpConnector::new(Connector1))), ) } } - // RP2 registers CN2 + // Plugin2 registers Connector2 #[derive(Debug)] - struct RP2; - impl RuntimePlugin for RP2 { + struct Plugin2; + impl RuntimePlugin for Plugin2 { fn order(&self) -> Order { Order::NestedComponents } @@ -400,8 +400,10 @@ mod tests { current_components: &RuntimeComponentsBuilder, ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Owned( - RuntimeComponentsBuilder::new("RP2").with_http_connector(Some( - SharedHttpConnector::new(CN2(current_components.http_connector().unwrap())), + RuntimeComponentsBuilder::new("Plugin2").with_http_connector(Some( + SharedHttpConnector::new(Connector2( + current_components.http_connector().unwrap(), + )), )), ) } @@ -410,8 +412,8 @@ mod tests { // Emulate assembling a full runtime plugins list and using it to apply configuration let plugins = RuntimePlugins::new() // intentionally configure the plugins in the reverse order - .with_client_plugin(RP2) - .with_client_plugin(RP1); + .with_client_plugin(Plugin2) + .with_client_plugin(Plugin1); let mut cfg = ConfigBag::base(); let components = plugins.apply_client_configuration(&mut cfg).unwrap(); diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index e761544d3d9..743d5d2dae4 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -12,7 +12,9 @@ repository = "https://github.com/awslabs/smithy-rs" [features] client = ["aws-smithy-runtime-api/client"] http-auth = ["aws-smithy-runtime-api/http-auth"] -test-util = ["aws-smithy-runtime-api/test-util", "dep:aws-smithy-protocol-test", "dep:tracing-subscriber"] +test-util = ["aws-smithy-runtime-api/test-util", "dep:aws-smithy-protocol-test", "dep:tracing-subscriber", "dep:serde", "dep:serde_json"] +connector-hyper = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp"] +tls-rustls = ["dep:hyper-rustls", "dep:rustls", "connector-hyper"] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } @@ -25,9 +27,14 @@ bytes = "1" fastrand = "2.0.0" http = "0.2.8" http-body = "0.4.5" +hyper = { version = "0.14.26", default-features = false, optional = true } +hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"], optional = true } once_cell = "1.18.0" pin-project-lite = "0.2.7" pin-utils = "0.1.0" +rustls = { version = "0.21.1", optional = true } +serde = { version = "1", features = ["derive"], optional = true } +serde_json = { version = "1", optional = true } tokio = { version = "1.25", features = [] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", optional = true, features = ["fmt", "json"] } @@ -37,6 +44,7 @@ approx = "0.5.1" aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio", "test-util"] } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["test-util"] } +hyper-tls = { version = "0.5.0" } tokio = { version = "1.25", features = ["macros", "rt", "test-util"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } tracing-test = "0.2.1" diff --git a/rust-runtime/aws-smithy-runtime/external-types.toml b/rust-runtime/aws-smithy-runtime/external-types.toml index a6398200200..f735d80eef0 100644 --- a/rust-runtime/aws-smithy-runtime/external-types.toml +++ b/rust-runtime/aws-smithy-runtime/external-types.toml @@ -4,9 +4,27 @@ allowed_external_types = [ "aws_smithy_http::*", "aws_smithy_types::*", "aws_smithy_client::erase::DynConnector", + "aws_smithy_client::http_connector::ConnectorSettings", + # TODO(audit-external-type-usage) We should newtype these or otherwise avoid exposing them "http::header::name::HeaderName", "http::request::Request", "http::response::Response", "http::uri::Uri", + + # Used for creating hyper connectors + "tower_service::Service", + + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature + "aws_smithy_protocol_test::MediaType", + "bytes::bytes::Bytes", + "serde::ser::Serialize", + "serde::de::Deserialize", + "hyper::client::connect::dns::Name", + + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper` feature + "hyper::client::client::Builder", + "hyper::client::connect::Connection", + "tokio::io::async_read::AsyncRead", + "tokio::io::async_write::AsyncWrite", ] diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index 629b558c321..71d1a0ea0fa 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -6,13 +6,10 @@ /// Smithy auth scheme implementations. pub mod auth; -/// Smithy code related to connectors and connections. +/// Built-in Smithy connectors. /// -/// A "connector" manages one or more "connections", handles connection timeouts, re-establishes -/// connections, etc. -/// -/// "Connections" refers to the actual transport layer implementation of the connector. -/// By default, the orchestrator uses a connector provided by `hyper`. +/// See the [module docs in `aws-smithy-runtime-api`](aws_smithy_runtime_api::client::connectors) +/// for more information about connectors. pub mod connectors; /// Utility to simplify config building for config and config overrides. diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs index 75da05271e8..4666c04bc2b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs @@ -9,14 +9,18 @@ pub mod connection_poisoning; #[cfg(feature = "test-util")] pub mod test_util; +/// Default HTTP and TLS connectors that use hyper and rustls. +#[cfg(feature = "connector-hyper")] +pub mod hyper_connector; + // TODO(enableNewSmithyRuntimeCleanup): Delete this module /// Unstable API for interfacing the old middleware connectors with the newer orchestrator connectors. /// /// Important: This module and its contents will be removed in the next release. pub mod adapter { use aws_smithy_client::erase::DynConnector; - use aws_smithy_runtime_api::client::connectors::HttpConnector; - use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; + use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use std::sync::{Arc, Mutex}; /// Adapts a [`DynConnector`] to the [`HttpConnector`] trait. @@ -40,9 +44,9 @@ pub mod adapter { } impl HttpConnector for DynConnectorAdapter { - fn call(&self, request: HttpRequest) -> BoxFuture { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { let future = self.dyn_connector.lock().unwrap().call_lite(request); - future + HttpConnectorFuture::new(future) } } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs new file mode 100644 index 00000000000..9285394020d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs @@ -0,0 +1,869 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_async::future::timeout::TimedOutError; +use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; +use aws_smithy_client::http_connector::ConnectorSettings; +use aws_smithy_http::body::SdkBody; +use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; +use aws_smithy_http::result::ConnectorError; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; +use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_types::error::display::DisplayErrorContext; +use aws_smithy_types::retry::ErrorKind; +use http::{Extensions, Uri}; +use hyper::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo}; +use hyper::service::Service; +use std::error::Error; +use std::fmt; +use std::fmt::Debug; +use tokio::io::{AsyncRead, AsyncWrite}; + +#[cfg(feature = "tls-rustls")] +mod default_connector { + use aws_smithy_async::rt::sleep::SharedAsyncSleep; + use aws_smithy_client::http_connector::ConnectorSettings; + + // Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we + // don't need to repeatedly incur that cost. + static HTTPS_NATIVE_ROOTS: once_cell::sync::Lazy< + hyper_rustls::HttpsConnector, + > = once_cell::sync::Lazy::new(|| { + use hyper_rustls::ConfigBuilderExt; + hyper_rustls::HttpsConnectorBuilder::new() + .with_tls_config( + rustls::ClientConfig::builder() + .with_cipher_suites(&[ + // TLS1.3 suites + rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, + // TLS1.2 suites + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + ]) + .with_safe_default_kx_groups() + .with_safe_default_protocol_versions() + .expect("Error with the TLS configuration. Please file a bug report under https://github.com/awslabs/smithy-rs/issues.") + .with_native_roots() + .with_no_client_auth() + ) + .https_or_http() + .enable_http1() + .enable_http2() + .build() + }); + + pub(super) fn base( + settings: &ConnectorSettings, + sleep: Option, + ) -> super::HyperConnectorBuilder { + let mut hyper = super::HyperConnector::builder().connector_settings(settings.clone()); + if let Some(sleep) = sleep { + hyper = hyper.sleep_impl(sleep); + } + hyper + } + + /// Return a default HTTPS connector backed by the `rustls` crate. + /// + /// It requires a minimum TLS version of 1.2. + /// It allows you to connect to both `http` and `https` URLs. + pub(super) fn https() -> hyper_rustls::HttpsConnector { + HTTPS_NATIVE_ROOTS.clone() + } +} + +/// Given `ConnectorSettings` and an `SharedAsyncSleep`, create a `SharedHttpConnector` from defaults depending on what cargo features are activated. +pub fn default_connector( + settings: &ConnectorSettings, + sleep: Option, +) -> Option { + #[cfg(feature = "tls-rustls")] + { + tracing::trace!(settings = ?settings, sleep = ?sleep, "creating a new default connector"); + let hyper = default_connector::base(settings, sleep).build_https(); + Some(SharedHttpConnector::new(hyper)) + } + #[cfg(not(feature = "tls-rustls"))] + { + tracing::trace!(settings = ?settings, sleep = ?sleep, "no default connector available"); + None + } +} + +/// [`HttpConnector`] that uses [`hyper`] to make HTTP requests. +/// +/// This connector also implements socket connect and read timeouts. +/// +/// # Examples +/// +/// Construct a `HyperConnector` with the default TLS implementation (rustls). +/// This can be useful when you want to share a Hyper connector between multiple +/// generated Smithy clients. +/// +/// ```no_run,ignore +/// use aws_smithy_runtime::client::connectors::hyper_connector::{DefaultHttpsTcpConnector, HyperConnector}; +/// +/// let hyper_connector = HyperConnector::builder().build(DefaultHttpsTcpConnector::new()); +/// +/// // This connector can then be given to a generated service Config +/// let config = my_service_client::Config::builder() +/// .endpoint_url("http://localhost:1234") +/// .http_connector(hyper_connector) +/// .build(); +/// let client = my_service_client::Client::from_conf(config); +/// ``` +/// +/// ## Use a Hyper client with WebPKI roots +/// +/// A use case for where you may want to use the [`HyperConnector`] is when setting Hyper client settings +/// that aren't otherwise exposed by the `Config` builder interface. Some examples include changing: +/// +/// - Hyper client settings +/// - Allowed TLS cipher suites +/// - Using an alternative TLS connector library (not the default, rustls) +/// - CA trust root certificates (illustrated using WebPKI below) +/// +/// ```no_run,ignore +/// use aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector; +/// +/// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() +/// .with_webpki_roots() +/// .https_only() +/// .enable_http1() +/// .enable_http2() +/// .build(); +/// let hyper_connector = HyperConnector::builder().build(https_connector); +/// +/// // This connector can then be given to a generated service Config +/// let config = my_service_client::Config::builder() +/// .endpoint_url("https://example.com") +/// .http_connector(hyper_connector) +/// .build(); +/// let client = my_service_client::Client::from_conf(config); +/// ``` +#[derive(Debug)] +pub struct HyperConnector { + adapter: Box, +} + +impl HyperConnector { + /// Builder for a Hyper connector. + pub fn builder() -> HyperConnectorBuilder { + Default::default() + } +} + +impl HttpConnector for HyperConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + self.adapter.call(request) + } +} + +/// Builder for [`HyperConnector`]. +#[derive(Default, Debug)] +pub struct HyperConnectorBuilder { + connector_settings: Option, + sleep_impl: Option, + client_builder: Option, +} + +impl HyperConnectorBuilder { + /// Create a [`HyperConnector`] from this builder and a given connector. + pub fn build(self, tcp_connector: C) -> HyperConnector + where + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, + { + let client_builder = self.client_builder.unwrap_or_default(); + let sleep_impl = self.sleep_impl.or_else(default_async_sleep); + let (connect_timeout, read_timeout) = self + .connector_settings + .map(|c| (c.connect_timeout(), c.read_timeout())) + .unwrap_or((None, None)); + + let connector = match connect_timeout { + Some(duration) => timeout_middleware::ConnectTimeout::new( + tcp_connector, + sleep_impl + .clone() + .expect("a sleep impl must be provided in order to have a connect timeout"), + duration, + ), + None => timeout_middleware::ConnectTimeout::no_timeout(tcp_connector), + }; + let base = client_builder.build(connector); + let read_timeout = match read_timeout { + Some(duration) => timeout_middleware::HttpReadTimeout::new( + base, + sleep_impl.expect("a sleep impl must be provided in order to have a read timeout"), + duration, + ), + None => timeout_middleware::HttpReadTimeout::no_timeout(base), + }; + HyperConnector { + adapter: Box::new(Adapter { + client: read_timeout, + }), + } + } + + /// Create a [`HyperConnector`] with the default rustls HTTPS implementation. + #[cfg(feature = "tls-rustls")] + pub fn build_https(self) -> HyperConnector { + self.build(default_connector::https()) + } + + /// Set the async sleep implementation used for timeouts + /// + /// Calling this is only necessary for testing or to use something other than + /// [`default_async_sleep`]. + pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self { + self.sleep_impl = Some(sleep_impl); + self + } + + /// Set the async sleep implementation used for timeouts + /// + /// Calling this is only necessary for testing or to use something other than + /// [`default_async_sleep`]. + pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { + self.sleep_impl = sleep_impl; + self + } + + /// Configure the HTTP settings for the `HyperAdapter` + pub fn connector_settings(mut self, connector_settings: ConnectorSettings) -> Self { + self.connector_settings = Some(connector_settings); + self + } + + /// Configure the HTTP settings for the `HyperAdapter` + pub fn set_connector_settings( + &mut self, + connector_settings: Option, + ) -> &mut Self { + self.connector_settings = connector_settings; + self + } + + /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn hyper_builder(mut self, hyper_builder: hyper::client::Builder) -> Self { + self.client_builder = Some(hyper_builder); + self + } + + /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn set_hyper_builder( + &mut self, + hyper_builder: Option, + ) -> &mut Self { + self.client_builder = hyper_builder; + self + } +} + +/// Adapter from a [`hyper::Client`](hyper::Client) to [`HttpConnector`]. +/// +/// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`HyperConnector::builder`]. +struct Adapter { + client: timeout_middleware::HttpReadTimeout< + hyper::Client, SdkBody>, + >, +} + +impl fmt::Debug for Adapter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Adapter") + .field("client", &"** hyper client **") + .finish() + } +} + +/// Extract a smithy connection from a hyper CaptureConnection +fn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option { + let capture_conn = capture_conn.clone(); + if let Some(conn) = capture_conn.clone().connection_metadata().as_ref() { + let mut extensions = Extensions::new(); + conn.get_extras(&mut extensions); + let http_info = extensions.get::(); + let smithy_connection = ConnectionMetadata::new( + conn.is_proxied(), + http_info.map(|info| info.remote_addr()), + move || match capture_conn.connection_metadata().as_ref() { + Some(conn) => conn.poison(), + None => tracing::trace!("no connection existed to poison"), + }, + ); + Some(smithy_connection) + } else { + None + } +} + +impl HttpConnector for Adapter +where + C: Clone + Send + Sync + 'static, + C: hyper::service::Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, +{ + fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { + let capture_connection = capture_connection(&mut request); + if let Some(capture_smithy_connection) = + request.extensions().get::() + { + capture_smithy_connection + .set_connection_retriever(move || extract_smithy_connection(&capture_connection)); + } + let mut client = self.client.clone(); + let fut = client.call(request); + HttpConnectorFuture::new(async move { + Ok(fut.await.map_err(downcast_error)?.map(SdkBody::from)) + }) + } +} + +/// Downcast errors coming out of hyper into an appropriate `ConnectorError` +fn downcast_error(err: BoxError) -> ConnectorError { + // is a `TimedOutError` (from aws_smithy_async::timeout) in the chain? if it is, this is a timeout + if find_source::(err.as_ref()).is_some() { + return ConnectorError::timeout(err); + } + // is the top of chain error actually already a `ConnectorError`? return that directly + let err = match err.downcast::() { + Ok(connector_error) => return *connector_error, + Err(box_error) => box_error, + }; + // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific + // error classifications + let err = match err.downcast::() { + Ok(hyper_error) => return to_connector_error(*hyper_error), + Err(box_error) => box_error, + }; + + // otherwise, we have no idea! + ConnectorError::other(err, None) +} + +/// Convert a [`hyper::Error`] into a [`ConnectorError`] +fn to_connector_error(err: hyper::Error) -> ConnectorError { + if err.is_timeout() || find_source::(&err).is_some() { + ConnectorError::timeout(err.into()) + } else if err.is_user() { + ConnectorError::user(err.into()) + } else if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() + { + ConnectorError::io(err.into()) + } + // We sometimes receive this from S3: hyper::Error(IncompleteMessage) + else if err.is_incomplete_message() { + ConnectorError::other(err.into(), Some(ErrorKind::TransientError)) + } else { + tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); + ConnectorError::other(err.into(), None) + } +} + +fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> { + let mut next = Some(err); + while let Some(err) = next { + if let Some(matching_err) = err.downcast_ref::() { + return Some(matching_err); + } + next = err.source(); + } + None +} + +mod timeout_middleware { + use aws_smithy_async::future::timeout::{TimedOutError, Timeout}; + use aws_smithy_async::rt::sleep::Sleep; + use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_runtime_api::box_error::BoxError; + use http::Uri; + use pin_project_lite::pin_project; + use std::error::Error; + use std::fmt::Formatter; + use std::future::Future; + use std::pin::Pin; + use std::task::{Context, Poll}; + use std::time::Duration; + + #[derive(Debug)] + pub(crate) struct HttpTimeoutError { + kind: &'static str, + duration: Duration, + } + + impl std::fmt::Display for HttpTimeoutError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{} timeout occurred after {:?}", + self.kind, self.duration + ) + } + } + + impl Error for HttpTimeoutError { + // We implement the `source` function as returning a `TimedOutError` because when `downcast_error` + // or `find_source` is called with an `HttpTimeoutError` (or another error wrapping an `HttpTimeoutError`) + // this method will be checked to determine if it's a timeout-related error. + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(&TimedOutError) + } + } + + /// Timeout wrapper that will timeout on the initial TCP connection + /// + /// # Stability + /// This interface is unstable. + #[derive(Clone, Debug)] + pub(super) struct ConnectTimeout { + inner: I, + timeout: Option<(SharedAsyncSleep, Duration)>, + } + + impl ConnectTimeout { + /// Create a new `ConnectTimeout` around `inner`. + /// + /// Typically, `I` will implement [`hyper::client::connect::Connect`]. + pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { + Self { + inner, + timeout: Some((sleep, timeout)), + } + } + + pub(crate) fn no_timeout(inner: I) -> Self { + Self { + inner, + timeout: None, + } + } + } + + #[derive(Clone, Debug)] + pub(crate) struct HttpReadTimeout { + inner: I, + timeout: Option<(SharedAsyncSleep, Duration)>, + } + + impl HttpReadTimeout { + /// Create a new `HttpReadTimeout` around `inner`. + /// + /// Typically, `I` will implement [`hyper::service::Service>`]. + pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { + Self { + inner, + timeout: Some((sleep, timeout)), + } + } + + pub(crate) fn no_timeout(inner: I) -> Self { + Self { + inner, + timeout: None, + } + } + } + + pin_project! { + /// Timeout future for Tower services + /// + /// Timeout future to handle timing out, mapping errors, and the possibility of not timing out + /// without incurring an additional allocation for each timeout layer. + #[project = MaybeTimeoutFutureProj] + pub enum MaybeTimeoutFuture { + Timeout { + #[pin] + timeout: Timeout, + error_type: &'static str, + duration: Duration, + }, + NoTimeout { + #[pin] + future: F + } + } + } + + impl Future for MaybeTimeoutFuture + where + F: Future>, + E: Into, + { + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let (timeout_future, kind, &mut duration) = match self.project() { + MaybeTimeoutFutureProj::NoTimeout { future } => { + return future.poll(cx).map_err(|err| err.into()); + } + MaybeTimeoutFutureProj::Timeout { + timeout, + error_type, + duration, + } => (timeout, error_type, duration), + }; + match timeout_future.poll(cx) { + Poll::Ready(Ok(response)) => Poll::Ready(response.map_err(|err| err.into())), + Poll::Ready(Err(_timeout)) => { + Poll::Ready(Err(HttpTimeoutError { kind, duration }.into())) + } + Poll::Pending => Poll::Pending, + } + } + } + + impl hyper::service::Service for ConnectTimeout + where + I: hyper::service::Service, + I::Error: Into, + { + type Response = I::Response; + type Error = BoxError; + type Future = MaybeTimeoutFuture; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx).map_err(|err| err.into()) + } + + fn call(&mut self, req: Uri) -> Self::Future { + match &self.timeout { + Some((sleep, duration)) => { + let sleep = sleep.sleep(*duration); + MaybeTimeoutFuture::Timeout { + timeout: Timeout::new(self.inner.call(req), sleep), + error_type: "HTTP connect", + duration: *duration, + } + } + None => MaybeTimeoutFuture::NoTimeout { + future: self.inner.call(req), + }, + } + } + } + + impl hyper::service::Service> for HttpReadTimeout + where + I: hyper::service::Service, Error = hyper::Error>, + { + type Response = I::Response; + type Error = BoxError; + type Future = MaybeTimeoutFuture; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx).map_err(|err| err.into()) + } + + fn call(&mut self, req: http::Request) -> Self::Future { + match &self.timeout { + Some((sleep, duration)) => { + let sleep = sleep.sleep(*duration); + MaybeTimeoutFuture::Timeout { + timeout: Timeout::new(self.inner.call(req), sleep), + error_type: "HTTP read", + duration: *duration, + } + } + None => MaybeTimeoutFuture::NoTimeout { + future: self.inner.call(req), + }, + } + } + } + + #[cfg(test)] + mod test { + use super::super::*; + use super::*; + use aws_smithy_async::assert_elapsed; + use aws_smithy_async::future::never::Never; + use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; + use aws_smithy_http::body::SdkBody; + use aws_smithy_types::error::display::DisplayErrorContext; + use aws_smithy_types::timeout::TimeoutConfig; + use hyper::client::connect::Connected; + use std::time::Duration; + use tokio::io::ReadBuf; + use tokio::net::TcpStream; + + #[allow(unused)] + fn connect_timeout_is_correct() { + is_send_sync::>(); + } + + #[allow(unused)] + fn is_send_sync() {} + + /// A service that will never return whatever it is you want + /// + /// Returned futures will return Pending forever + #[non_exhaustive] + #[derive(Clone, Default, Debug)] + struct NeverConnects; + impl hyper::service::Service for NeverConnects { + type Response = TcpStream; + type Error = ConnectorError; + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _uri: Uri) -> Self::Future { + Box::pin(async move { + Never::new().await; + unreachable!() + }) + } + } + + /// A service that will connect but never send any data + #[derive(Clone, Debug, Default)] + struct NeverReplies; + impl hyper::service::Service for NeverReplies { + type Response = EmptyStream; + type Error = BoxError; + type Future = std::future::Ready>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _req: Uri) -> Self::Future { + std::future::ready(Ok(EmptyStream)) + } + } + + /// A stream that will never return or accept any data + #[non_exhaustive] + #[derive(Debug, Default)] + struct EmptyStream; + impl AsyncRead for EmptyStream { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut ReadBuf<'_>, + ) -> Poll> { + Poll::Pending + } + } + impl AsyncWrite for EmptyStream { + fn poll_write( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &[u8], + ) -> Poll> { + Poll::Pending + } + + fn poll_flush( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Pending + } + + fn poll_shutdown( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Pending + } + } + impl Connection for EmptyStream { + fn connected(&self) -> Connected { + Connected::new() + } + } + + #[tokio::test] + async fn http_connect_timeout_works() { + let tcp_connector = NeverConnects::default(); + let connector_settings = ConnectorSettings::from_timeout_config( + &TimeoutConfig::builder() + .connect_timeout(Duration::from_secs(1)) + .build(), + ); + let hyper = HyperConnector::builder() + .connector_settings(connector_settings) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .build(tcp_connector) + .adapter; + let now = tokio::time::Instant::now(); + tokio::time::pause(); + let resp = hyper + .call( + http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::empty()) + .unwrap(), + ) + .await + .unwrap_err(); + assert!( + resp.is_timeout(), + "expected resp.is_timeout() to be true but it was false, resp == {:?}", + resp + ); + let message = DisplayErrorContext(&resp).to_string(); + let expected = + "timeout: error trying to connect: HTTP connect timeout occurred after 1s"; + assert!( + message.contains(expected), + "expected '{message}' to contain '{expected}'" + ); + assert_elapsed!(now, Duration::from_secs(1)); + } + + #[tokio::test] + async fn http_read_timeout_works() { + let tcp_connector = NeverReplies::default(); + let connector_settings = ConnectorSettings::from_timeout_config( + &TimeoutConfig::builder() + .connect_timeout(Duration::from_secs(1)) + .read_timeout(Duration::from_secs(2)) + .build(), + ); + let hyper = HyperConnector::builder() + .connector_settings(connector_settings) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .build(tcp_connector) + .adapter; + let now = tokio::time::Instant::now(); + tokio::time::pause(); + let err = hyper + .call( + http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::empty()) + .unwrap(), + ) + .await + .unwrap_err(); + assert!( + err.is_timeout(), + "expected err.is_timeout() to be true but it was false, err == {err:?}", + ); + let message = format!("{}", DisplayErrorContext(&err)); + let expected = "timeout: HTTP read timeout occurred after 2s"; + assert!( + message.contains(expected), + "expected '{message}' to contain '{expected}'" + ); + assert_elapsed!(now, Duration::from_secs(2)); + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use aws_smithy_http::body::SdkBody; + use http::Uri; + use hyper::client::connect::{Connected, Connection}; + use std::io::{Error, ErrorKind}; + use std::pin::Pin; + use std::task::{Context, Poll}; + use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + + #[tokio::test] + async fn hyper_io_error() { + let connector = TestConnection { + inner: HangupStream, + }; + let adapter = HyperConnector::builder().build(connector).adapter; + let err = adapter + .call( + http::Request::builder() + .uri("http://amazon.com") + .body(SdkBody::empty()) + .unwrap(), + ) + .await + .expect_err("socket hangup"); + assert!(err.is_io(), "{:?}", err); + } + + // ---- machinery to make a Hyper connector that responds with an IO Error + #[derive(Clone)] + struct HangupStream; + + impl Connection for HangupStream { + fn connected(&self) -> Connected { + Connected::new() + } + } + + impl AsyncRead for HangupStream { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut ReadBuf<'_>, + ) -> Poll> { + Poll::Ready(Err(Error::new( + ErrorKind::ConnectionReset, + "connection reset", + ))) + } + } + + impl AsyncWrite for HangupStream { + fn poll_write( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &[u8], + ) -> Poll> { + Poll::Pending + } + + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Pending + } + + fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Pending + } + } + + #[derive(Clone)] + struct TestConnection { + inner: T, + } + + impl hyper::service::Service for TestConnection + where + T: Clone + Connection, + { + type Response = T; + type Error = BoxError; + type Future = std::future::Ready>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _req: Uri) -> Self::Future { + std::future::ready(Ok(self.inner.clone())) + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs index c7afd868d4d..686b7101976 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs @@ -4,261 +4,38 @@ */ //! Module with client connectors useful for testing. - -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; -use aws_smithy_runtime_api::client::connectors::HttpConnector; -use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; -use http::header::{HeaderName, CONTENT_TYPE}; -use std::fmt::Debug; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::time::Duration; -use tokio::sync::oneshot; - -/// Test Connection to capture a single request -#[derive(Debug, Clone)] -pub struct CaptureRequestHandler(Arc>); - -#[derive(Debug)] -struct Inner { - _response: Option>, - _sender: Option>, -} - -/// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) -#[derive(Debug)] -pub struct CaptureRequestReceiver { - receiver: oneshot::Receiver, -} - -impl CaptureRequestReceiver { - /// Expect that a request was sent. Returns the captured request. - /// - /// # Panics - /// If no request was received - #[track_caller] - pub fn expect_request(mut self) -> HttpRequest { - self.receiver.try_recv().expect("no request was received") - } - - /// Expect that no request was captured. Panics if a request was received. - /// - /// # Panics - /// If a request was received - #[track_caller] - pub fn expect_no_request(mut self) { - self.receiver - .try_recv() - .expect_err("expected no request to be received!"); - } -} - -/// Test connection used to capture a single request -/// -/// If response is `None`, it will reply with a 200 response with an empty body -/// -/// Example: -/// ```compile_fail -/// let (server, request) = capture_request(None); -/// let conf = aws_sdk_sts::Config::builder() -/// .http_connector(server) -/// .build(); -/// let client = aws_sdk_sts::Client::from_conf(conf); -/// let _ = client.assume_role_with_saml().send().await; -/// // web identity should be unsigned -/// assert_eq!( -/// request.expect_request().headers().get("AUTHORIZATION"), -/// None -/// ); -/// ``` -pub fn capture_request( - response: Option>, -) -> (CaptureRequestHandler, CaptureRequestReceiver) { - let (tx, rx) = oneshot::channel(); - ( - CaptureRequestHandler(Arc::new(Mutex::new(Inner { - _response: Some(response.unwrap_or_else(|| { - http::Response::builder() - .status(200) - .body(SdkBody::empty()) - .expect("unreachable") - })), - _sender: Some(tx), - }))), - CaptureRequestReceiver { receiver: rx }, - ) -} - -type ConnectionEvents = Vec; - -/// Test data for the [`TestConnector`]. -/// -/// Each `ConnectionEvent` represents one HTTP request and response -/// through the connector. Optionally, a latency value can be set to simulate -/// network latency (done via async sleep in the `TestConnector`). -#[derive(Debug)] -pub struct ConnectionEvent { - latency: Duration, - req: HttpRequest, - res: HttpResponse, -} - -impl ConnectionEvent { - /// Creates a new `ConnectionEvent`. - pub fn new(req: HttpRequest, res: HttpResponse) -> Self { - Self { - res, - req, - latency: Duration::from_secs(0), - } - } - - /// Add simulated latency to this `ConnectionEvent` - pub fn with_latency(mut self, latency: Duration) -> Self { - self.latency = latency; - self - } - - /// Returns the test request. - pub fn request(&self) -> &HttpRequest { - &self.req - } - - /// Returns the test response. - pub fn response(&self) -> &HttpResponse { - &self.res - } -} - -impl From<(HttpRequest, HttpResponse)> for ConnectionEvent { - fn from((req, res): (HttpRequest, HttpResponse)) -> Self { - Self::new(req, res) - } -} - -#[derive(Debug)] -struct ValidateRequest { - expected: HttpRequest, - actual: HttpRequest, -} - -impl ValidateRequest { - fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { - let (actual, expected) = (&self.actual, &self.expected); - assert_eq!( - actual.uri(), - expected.uri(), - "Request #{index} - URI doesn't match expected value" - ); - for (name, value) in expected.headers() { - if !ignore_headers.contains(name) { - let actual_header = actual - .headers() - .get(name) - .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); - assert_eq!( - actual_header.to_str().unwrap(), - value.to_str().unwrap(), - "Request #{index} - Header {name:?} doesn't match expected value", - ); - } - } - let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); - let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); - let media_type = if actual - .headers() - .get(CONTENT_TYPE) - .map(|v| v.to_str().unwrap().contains("json")) - .unwrap_or(false) - { - MediaType::Json - } else { - MediaType::Other("unknown".to_string()) - }; - match (actual_str, expected_str) { - (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), - _ => assert_eq!( - actual.body().bytes(), - expected.body().bytes(), - "Request #{index} - Body contents didn't match expected value" - ), - }; - } -} - -/// Test connector for use as a [`HttpConnector`]. -/// -/// A basic test connection. It will: -/// - Respond to requests with a preloaded series of responses -/// - Record requests for future examination -#[derive(Debug, Clone)] -pub struct TestConnector { - data: Arc>, - requests: Arc>>, - sleep_impl: SharedAsyncSleep, -} - -impl TestConnector { - /// Creates a new test connector. - pub fn new(mut data: ConnectionEvents, sleep_impl: impl Into) -> Self { - data.reverse(); - TestConnector { - data: Arc::new(Mutex::new(data)), - requests: Default::default(), - sleep_impl: sleep_impl.into(), - } - } - - fn requests(&self) -> impl Deref> + '_ { - self.requests.lock().unwrap() - } - - /// Asserts the expected requests match the actual requests. - /// - /// The expected requests are given as the connection events when the `TestConnector` - /// is created. The `TestConnector` will record the actual requests and assert that - /// they match the expected requests. - /// - /// A list of headers that should be ignored when comparing requests can be passed - /// for cases where headers are non-deterministic or are irrelevant to the test. - #[track_caller] - pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { - for (i, req) in self.requests().iter().enumerate() { - req.assert_matches(i, ignore_headers) - } - let remaining_requests = self.data.lock().unwrap(); - let number_of_remaining_requests = remaining_requests.len(); - let actual_requests = self.requests().len(); - assert!( - remaining_requests.is_empty(), - "Expected {number_of_remaining_requests} additional requests (only {actual_requests} sent)", - ); - } -} - -impl HttpConnector for TestConnector { - fn call(&self, request: HttpRequest) -> BoxFuture { - let (res, simulated_latency) = if let Some(event) = self.data.lock().unwrap().pop() { - self.requests.lock().unwrap().push(ValidateRequest { - expected: event.req, - actual: request, - }); - - (Ok(event.res.map(SdkBody::from)), event.latency) - } else { - ( - Err(ConnectorError::other("No more data".into(), None).into()), - Duration::from_secs(0), - ) - }; - - let sleep = self.sleep_impl.sleep(simulated_latency); - Box::pin(async move { - sleep.await; - res - }) - } -} +//! +//! Each test connector is useful for different test use cases: +//! - [`capture_request`](capture_request::capture_request): If you don't care what the +//! response is, but just want to check that the serialized request is what you expect, +//! then use `capture_request`. Or, alternatively, if you don't care what the request +//! is, but want to always respond with a given response, then capture request can also +//! be useful since you can optionally give it a response to return. +//! - [`dvr`]: If you want to record real-world traffic and then replay it later, then DVR's +//! [`RecordingConnector`](dvr::RecordingConnector) and [`ReplayingConnector`](dvr::ReplayingConnector) +//! can accomplish this, and the recorded traffic can be saved to JSON and checked in. Note: if +//! the traffic recording has sensitive information in it, such as signatures or authorization, +//! you will need to manually scrub this out if you intend to store the recording alongside +//! your tests. +//! - [`EventConnector`]: If you want to have a set list of requests and their responses in a test, +//! then the event connector will be useful. On construction, it takes a list of tuples that represent +//! each expected request and the response for that request. At the end of the test, you can ask the +//! connector to verify that the requests matched the expectations. +//! - [`infallible_connection_fn`]: Allows you to create a connector from an infallible function +//! that takes a request and returns a response. +//! - [`NeverConnector`]: Useful for testing timeouts, where you want the connector to never respond. + +mod capture_request; +pub use capture_request::{capture_request, CaptureRequestHandler, CaptureRequestReceiver}; + +#[cfg(feature = "connector-hyper")] +pub mod dvr; + +mod event_connector; +pub use event_connector::{ConnectionEvent, EventConnector}; + +mod infallible; +pub use infallible::infallible_connection_fn; + +mod never; +pub use never::NeverConnector; diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs new file mode 100644 index 00000000000..c51062b13e2 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs @@ -0,0 +1,84 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use std::fmt::Debug; +use std::sync::{Arc, Mutex}; +use tokio::sync::oneshot; + +/// Test Connection to capture a single request +#[derive(Debug, Clone)] +pub struct CaptureRequestHandler(Arc>); + +#[derive(Debug)] +struct Inner { + _response: Option>, + _sender: Option>, +} + +/// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) +#[derive(Debug)] +pub struct CaptureRequestReceiver { + receiver: oneshot::Receiver, +} + +impl CaptureRequestReceiver { + /// Expect that a request was sent. Returns the captured request. + /// + /// # Panics + /// If no request was received + #[track_caller] + pub fn expect_request(mut self) -> HttpRequest { + self.receiver.try_recv().expect("no request was received") + } + + /// Expect that no request was captured. Panics if a request was received. + /// + /// # Panics + /// If a request was received + #[track_caller] + pub fn expect_no_request(mut self) { + self.receiver + .try_recv() + .expect_err("expected no request to be received!"); + } +} + +/// Test connection used to capture a single request +/// +/// If response is `None`, it will reply with a 200 response with an empty body +/// +/// Example: +/// ```compile_fail +/// let (server, request) = capture_request(None); +/// let conf = aws_sdk_sts::Config::builder() +/// .http_connector(server) +/// .build(); +/// let client = aws_sdk_sts::Client::from_conf(conf); +/// let _ = client.assume_role_with_saml().send().await; +/// // web identity should be unsigned +/// assert_eq!( +/// request.expect_request().headers().get("AUTHORIZATION"), +/// None +/// ); +/// ``` +pub fn capture_request( + response: Option>, +) -> (CaptureRequestHandler, CaptureRequestReceiver) { + let (tx, rx) = oneshot::channel(); + ( + CaptureRequestHandler(Arc::new(Mutex::new(Inner { + _response: Some(response.unwrap_or_else(|| { + http::Response::builder() + .status(200) + .body(SdkBody::empty()) + .expect("unreachable") + })), + _sender: Some(tx), + }))), + CaptureRequestReceiver { receiver: rx }, + ) +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs new file mode 100644 index 00000000000..90f37b95baf --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs @@ -0,0 +1,274 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Extremely Experimental Test Connection +//! +//! Warning: Extremely experimental, API likely to change. +//! +//! DVR is an extremely experimental record & replay framework that supports multi-frame HTTP request / response traffic. + +use aws_smithy_types::base64; +use bytes::Bytes; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +mod record; +mod replay; + +pub use aws_smithy_protocol_test::MediaType; +pub use record::RecordingConnector; +pub use replay::ReplayingConnector; + +/// A complete traffic recording +/// +/// A traffic recording can be replayed with [`RecordingConnector`](RecordingConnector) +#[derive(Debug, Serialize, Deserialize)] +pub struct NetworkTraffic { + events: Vec, + docs: Option, + version: Version, +} + +impl NetworkTraffic { + /// Network events + pub fn events(&self) -> &Vec { + &self.events + } +} + +/// Serialization version of DVR data +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub enum Version { + /// Initial network traffic version + V0, +} + +/// A network traffic recording may contain multiple different connections occurring simultaneously +#[derive(Copy, Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq)] +pub struct ConnectionId(usize); + +/// A network event +/// +/// Network events consist of a connection identifier and an action. An event is sufficient to +/// reproduce traffic later during replay +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct Event { + connection_id: ConnectionId, + action: Action, +} + +/// An initial HTTP request, roughly equivalent to `http::Request<()>` +/// +/// The initial request phase of an HTTP request. The body will be +/// sent later as a separate action. +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] +pub struct Request { + uri: String, + headers: HashMap>, + method: String, +} + +/// An initial HTTP response roughly equivalent to `http::Response<()>` +/// +/// The initial response phase of an HTTP request. The body will be +/// sent later as a separate action. +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] +pub struct Response { + status: u16, + version: String, + headers: HashMap>, +} + +impl From<&Request> for http::Request<()> { + fn from(request: &Request) -> Self { + let mut builder = http::Request::builder().uri(request.uri.as_str()); + for (k, values) in request.headers.iter() { + for v in values { + builder = builder.header(k, v); + } + } + builder.method(request.method.as_str()).body(()).unwrap() + } +} + +impl<'a, B> From<&'a http::Request> for Request { + fn from(req: &'a http::Request) -> Self { + let uri = req.uri().to_string(); + let headers = headers_to_map(req.headers()); + let method = req.method().to_string(); + Self { + uri, + headers, + method, + } + } +} + +fn headers_to_map(headers: &http::HeaderMap) -> HashMap> { + let mut out: HashMap<_, Vec<_>> = HashMap::new(); + for (header_name, header_value) in headers.iter() { + let entry = out.entry(header_name.to_string()).or_default(); + entry.push(header_value.to_str().unwrap().to_string()); + } + out +} + +impl<'a, B> From<&'a http::Response> for Response { + fn from(resp: &'a http::Response) -> Self { + let status = resp.status().as_u16(); + let version = format!("{:?}", resp.version()); + let headers = headers_to_map(resp.headers()); + Self { + status, + version, + headers, + } + } +} + +/// Error response wrapper +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] +pub struct Error(String); + +/// Network Action +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] +#[non_exhaustive] +pub enum Action { + /// Initial HTTP Request + Request { + /// HTTP Request headers, method, and URI + request: Request, + }, + + /// Initial HTTP response or failure + Response { + /// HTTP response or failure + response: Result, + }, + + /// Data segment + Data { + /// Body Data + data: BodyData, + /// Direction: request vs. response + direction: Direction, + }, + + /// End of data + Eof { + /// Succesful vs. failed termination + ok: bool, + /// Direction: request vs. response + direction: Direction, + }, +} + +/// Event direction +/// +/// During replay, this is used to replay data in the right direction +#[derive(Copy, Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] +pub enum Direction { + /// Request phase + Request, + /// Response phase + Response, +} + +impl Direction { + /// The opposite of a given direction + pub fn opposite(self) -> Self { + match self { + Direction::Request => Direction::Response, + Direction::Response => Direction::Request, + } + } +} + +/// HTTP Body Data Abstraction +/// +/// When the data is a UTF-8 encoded string, it will be serialized as a string for readability. +/// Otherwise, it will be base64 encoded. +#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] +#[non_exhaustive] +pub enum BodyData { + /// UTF-8 encoded data + Utf8(String), + + /// Base64 encoded binary data + Base64(String), +} + +impl BodyData { + /// Convert [`BodyData`](BodyData) into Bytes + pub fn into_bytes(self) -> Vec { + match self { + BodyData::Utf8(string) => string.into_bytes(), + BodyData::Base64(string) => base64::decode(string).unwrap(), + } + } + + /// Copy [`BodyData`](BodyData) into a `Vec` + pub fn copy_to_vec(&self) -> Vec { + match self { + BodyData::Utf8(string) => string.as_bytes().into(), + BodyData::Base64(string) => base64::decode(string).unwrap(), + } + } +} + +impl From for BodyData { + fn from(data: Bytes) -> Self { + match std::str::from_utf8(data.as_ref()) { + Ok(string) => BodyData::Utf8(string.to_string()), + Err(_) => BodyData::Base64(base64::encode(data)), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use aws_smithy_http::body::SdkBody; + use aws_smithy_http::byte_stream::ByteStream; + use aws_smithy_runtime_api::client::connectors::{HttpConnector, SharedHttpConnector}; + use bytes::Bytes; + use http::Uri; + use std::error::Error; + use std::fs; + + #[tokio::test] + async fn turtles_all_the_way_down() -> Result<(), Box> { + // create a replaying connection from a recording, wrap a recording connection around it, + // make a request, then verify that the same traffic was recorded. + let network_traffic = fs::read_to_string("test-data/example.com.json")?; + let network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?; + let inner = ReplayingConnector::new(network_traffic.events.clone()); + let connection = RecordingConnector::new(SharedHttpConnector::new(inner.clone())); + let req = http::Request::post("https://www.example.com") + .body(SdkBody::from("hello world")) + .unwrap(); + let mut resp = connection.call(req).await.expect("ok"); + let body = std::mem::replace(resp.body_mut(), SdkBody::taken()); + let data = ByteStream::new(body).collect().await.unwrap().into_bytes(); + assert_eq!( + String::from_utf8(data.to_vec()).unwrap(), + "hello from example.com" + ); + assert_eq!( + connection.events().as_slice(), + network_traffic.events.as_slice() + ); + let requests = inner.take_requests().await; + assert_eq!( + requests[0].uri(), + &Uri::from_static("https://www.example.com") + ); + assert_eq!( + requests[0].body(), + &Bytes::from_static("hello world".as_bytes()) + ); + Ok(()) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs new file mode 100644 index 00000000000..c175b24d3cf --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs @@ -0,0 +1,202 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use super::{ + Action, BodyData, ConnectionId, Direction, Error, Event, NetworkTraffic, Request, Response, + Version, +}; +use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime_api::client::connectors::{ + HttpConnector, HttpConnectorFuture, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use http_body::Body; +use std::path::Path; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::{Arc, Mutex, MutexGuard}; +use std::{fs, io}; +use tokio::task::JoinHandle; + +/// Recording Connection Wrapper +/// +/// RecordingConnector wraps an inner connection and records all traffic, enabling traffic replay. +#[derive(Clone, Debug)] +pub struct RecordingConnector { + pub(crate) data: Arc>>, + pub(crate) num_events: Arc, + pub(crate) inner: SharedHttpConnector, +} + +#[cfg(all(feature = "tls-rustls"))] +impl RecordingConnector { + /// Construct a recording connection wrapping a default HTTPS implementation + pub fn https() -> Self { + use crate::client::connectors::hyper_connector::HyperConnector; + Self { + data: Default::default(), + num_events: Arc::new(AtomicUsize::new(0)), + inner: SharedHttpConnector::new(HyperConnector::builder().build_https()), + } + } +} + +impl RecordingConnector { + /// Create a new recording connection from a connection + pub fn new(underlying_connector: SharedHttpConnector) -> Self { + Self { + data: Default::default(), + num_events: Arc::new(AtomicUsize::new(0)), + inner: underlying_connector, + } + } + + /// Return the traffic recorded by this connection + pub fn events(&self) -> MutexGuard<'_, Vec> { + self.data.lock().unwrap() + } + + /// NetworkTraffic struct suitable for serialization + pub fn network_traffic(&self) -> NetworkTraffic { + NetworkTraffic { + events: self.events().clone(), + docs: Some("todo docs".into()), + version: Version::V0, + } + } + + /// Dump the network traffic to a file + pub fn dump_to_file(&self, path: impl AsRef) -> Result<(), io::Error> { + fs::write( + path, + serde_json::to_string(&self.network_traffic()).unwrap(), + ) + } + + fn next_id(&self) -> ConnectionId { + ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed)) + } +} + +fn record_body( + body: &mut SdkBody, + event_id: ConnectionId, + direction: Direction, + event_bus: Arc>>, +) -> JoinHandle<()> { + let (sender, output_body) = hyper::Body::channel(); + let real_body = std::mem::replace(body, SdkBody::from(output_body)); + tokio::spawn(async move { + let mut real_body = real_body; + let mut sender = sender; + loop { + let data = real_body.data().await; + match data { + Some(Ok(data)) => { + event_bus.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Data { + data: BodyData::from(data.clone()), + direction, + }, + }); + // This happens if the real connection is closed during recording. + // Need to think more carefully if this is the correct thing to log in this + // case. + if sender.send_data(data).await.is_err() { + event_bus.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Eof { + direction: direction.opposite(), + ok: false, + }, + }) + }; + } + None => { + event_bus.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Eof { + ok: true, + direction, + }, + }); + drop(sender); + break; + } + Some(Err(_err)) => { + event_bus.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Eof { + ok: false, + direction, + }, + }); + sender.abort(); + break; + } + } + } + }) +} + +impl HttpConnector for RecordingConnector { + fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { + let event_id = self.next_id(); + // A request has three phases: + // 1. A "Request" phase. This is initial HTTP request, headers, & URI + // 2. A body phase. This may contain multiple data segments. + // 3. A finalization phase. An EOF of some sort is sent on the body to indicate that + // the channel should be closed. + + // Phase 1: the initial http request + self.data.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Request { + request: Request::from(&request), + }, + }); + + // Phase 2: Swap out the real request body for one that will log all traffic that passes + // through it + // This will also handle phase three when the request body runs out of data. + record_body( + request.body_mut(), + event_id, + Direction::Request, + self.data.clone(), + ); + let events = self.data.clone(); + // create a channel we'll use to stream the data while reading it + let resp_fut = self.inner.call(request); + let fut = async move { + let resp = resp_fut.await; + match resp { + Ok(mut resp) => { + // push the initial response event + events.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Response { + response: Ok(Response::from(&resp)), + }, + }); + + // instrument the body and record traffic + record_body(resp.body_mut(), event_id, Direction::Response, events); + Ok(resp) + } + Err(e) => { + events.lock().unwrap().push(Event { + connection_id: event_id, + action: Action::Response { + response: Err(Error(format!("{}", &e))), + }, + }); + Err(e) + } + } + }; + HttpConnectorFuture::new(fut) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs new file mode 100644 index 00000000000..4388e939bed --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs @@ -0,0 +1,351 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use super::{Action, ConnectionId, Direction, Event, NetworkTraffic}; +use aws_smithy_http::body::SdkBody; +use aws_smithy_http::result::ConnectorError; +use aws_smithy_protocol_test::MediaType; +use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_types::error::display::DisplayErrorContext; +use bytes::{Bytes, BytesMut}; +use http::{Request, Version}; +use http_body::Body; +use std::collections::{HashMap, VecDeque}; +use std::error::Error; +use std::ops::DerefMut; +use std::path::Path; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::{Arc, Mutex}; +use tokio::task::JoinHandle; + +/// Wrapper type to enable optionally waiting for a future to complete +#[derive(Debug)] +enum Waitable { + Loading(JoinHandle), + Value(T), +} + +impl Waitable { + /// Consumes the future and returns the value + async fn take(self) -> T { + match self { + Waitable::Loading(f) => f.await.expect("join failed"), + Waitable::Value(value) => value, + } + } + + /// Waits for the future to be ready + async fn wait(&mut self) { + match self { + Waitable::Loading(f) => *self = Waitable::Value(f.await.expect("join failed")), + Waitable::Value(_) => {} + } + } +} + +/// Replay traffic recorded by a [`RecordingConnector`](super::RecordingConnector) +#[derive(Clone, Debug)] +pub struct ReplayingConnector { + live_events: Arc>>>, + verifiable_events: Arc>>, + num_events: Arc, + recorded_requests: Arc>>>>, +} + +impl ReplayingConnector { + fn next_id(&self) -> ConnectionId { + ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed)) + } + + /// Validate all headers and bodies + pub async fn full_validate(self, media_type: MediaType) -> Result<(), Box> { + self.validate_body_and_headers(None, media_type).await + } + + /// Validate actual requests against expected requests + pub async fn validate( + self, + checked_headers: &[&str], + body_comparer: impl Fn(&[u8], &[u8]) -> Result<(), Box>, + ) -> Result<(), Box> { + self.validate_base(Some(checked_headers), body_comparer) + .await + } + + /// Validate that the bodies match, using a given [`MediaType`] for comparison + /// + /// The specified headers are also validated + pub async fn validate_body_and_headers( + self, + checked_headers: Option<&[&str]>, + media_type: MediaType, + ) -> Result<(), Box> { + self.validate_base(checked_headers, |b1, b2| { + aws_smithy_protocol_test::validate_body( + b1, + std::str::from_utf8(b2).unwrap(), + media_type.clone(), + ) + .map_err(|e| Box::new(e) as _) + }) + .await + } + + async fn validate_base( + self, + checked_headers: Option<&[&str]>, + body_comparer: impl Fn(&[u8], &[u8]) -> Result<(), Box>, + ) -> Result<(), Box> { + let mut actual_requests = + std::mem::take(self.recorded_requests.lock().unwrap().deref_mut()); + for conn_id in 0..self.verifiable_events.len() { + let conn_id = ConnectionId(conn_id); + let expected = self.verifiable_events.get(&conn_id).unwrap(); + let actual = actual_requests + .remove(&conn_id) + .ok_or(format!( + "expected connection {:?} but request was never sent", + conn_id + ))? + .take() + .await; + aws_smithy_protocol_test::assert_uris_match(expected.uri(), actual.uri()); + body_comparer(expected.body().as_ref(), actual.body().as_ref())?; + let expected_headers = expected + .headers() + .keys() + .map(|k| k.as_str()) + .filter(|k| match checked_headers { + Some(list) => list.contains(k), + None => true, + }) + .flat_map(|key| { + let _ = expected.headers().get(key)?; + Some(( + key, + expected + .headers() + .get_all(key) + .iter() + .map(|h| h.to_str().unwrap()) + .collect::>() + .join(", "), + )) + }) + .collect::>(); + aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers) + .map_err(|err| { + format!( + "event {} validation failed with: {}", + conn_id.0, + DisplayErrorContext(&err) + ) + })?; + } + Ok(()) + } + + /// Return all the recorded requests for further analysis + pub async fn take_requests(self) -> Vec> { + let mut recorded_requests = + std::mem::take(self.recorded_requests.lock().unwrap().deref_mut()); + let mut out = Vec::with_capacity(recorded_requests.len()); + for conn_id in 0..recorded_requests.len() { + out.push( + recorded_requests + .remove(&ConnectionId(conn_id)) + .expect("should exist") + .take() + .await, + ) + } + out + } + + /// Build a replay connection from a JSON file + pub fn from_file(path: impl AsRef) -> Result> { + let events: NetworkTraffic = + serde_json::from_str(&std::fs::read_to_string(path.as_ref())?)?; + Ok(Self::new(events.events)) + } + + /// Build a replay connection from a sequence of events + pub fn new(events: Vec) -> Self { + let mut event_map: HashMap<_, VecDeque<_>> = HashMap::new(); + for event in events { + let event_buffer = event_map.entry(event.connection_id).or_default(); + event_buffer.push_back(event); + } + let verifiable_events = event_map + .iter() + .map(|(id, events)| { + let mut body = BytesMut::new(); + for event in events { + if let Action::Data { + direction: Direction::Request, + data, + } = &event.action + { + body.extend_from_slice(&data.copy_to_vec()); + } + } + let initial_request = events.iter().next().expect("must have one event"); + let request = match &initial_request.action { + Action::Request { request } => { + http::Request::from(request).map(|_| Bytes::from(body)) + } + _ => panic!("invalid first event"), + }; + (*id, request) + }) + .collect(); + let verifiable_events = Arc::new(verifiable_events); + + ReplayingConnector { + live_events: Arc::new(Mutex::new(event_map)), + num_events: Arc::new(AtomicUsize::new(0)), + recorded_requests: Default::default(), + verifiable_events, + } + } +} + +async fn replay_body(events: VecDeque, mut sender: hyper::body::Sender) { + for event in events { + match event.action { + Action::Request { .. } => panic!(), + Action::Response { .. } => panic!(), + Action::Data { + data, + direction: Direction::Response, + } => { + sender + .send_data(Bytes::from(data.into_bytes())) + .await + .expect("this is in memory traffic that should not fail to send"); + } + Action::Data { + data: _data, + direction: Direction::Request, + } => {} + Action::Eof { + direction: Direction::Request, + .. + } => {} + Action::Eof { + direction: Direction::Response, + ok: true, + .. + } => { + drop(sender); + break; + } + Action::Eof { + direction: Direction::Response, + ok: false, + .. + } => { + sender.abort(); + break; + } + } + } +} + +fn convert_version(version: &str) -> Version { + match version { + "HTTP/1.1" => Version::HTTP_11, + "HTTP/2.0" => Version::HTTP_2, + _ => panic!("unsupported: {}", version), + } +} + +impl HttpConnector for ReplayingConnector { + fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { + let event_id = self.next_id(); + tracing::debug!("received event {}: {request:?}", event_id.0); + let mut events = match self.live_events.lock().unwrap().remove(&event_id) { + Some(traffic) => traffic, + None => { + return HttpConnectorFuture::ready(Err(ConnectorError::other( + format!("no data for event {}. request: {:?}", event_id.0, request).into(), + None, + ))); + } + }; + + let _initial_request = events.pop_front().unwrap(); + let (sender, response_body) = hyper::Body::channel(); + let body = SdkBody::from(response_body); + let recording = self.recorded_requests.clone(); + let recorded_request = tokio::spawn(async move { + let mut data_read = vec![]; + while let Some(data) = request.body_mut().data().await { + data_read + .extend_from_slice(data.expect("in memory request should not fail").as_ref()) + } + request.map(|_| Bytes::from(data_read)) + }); + let mut recorded_request = Waitable::Loading(recorded_request); + let fut = async move { + let resp: Result<_, ConnectorError> = loop { + let event = events + .pop_front() + .expect("no events, needed a response event"); + match event.action { + // to ensure deterministic behavior if the request EOF happens first in the log, + // wait for the request body to be done before returning a response. + Action::Eof { + direction: Direction::Request, + .. + } => { + recorded_request.wait().await; + } + Action::Request { .. } => panic!("invalid"), + Action::Response { + response: Err(error), + } => break Err(ConnectorError::other(error.0.into(), None)), + Action::Response { + response: Ok(response), + } => { + let mut builder = http::Response::builder() + .status(response.status) + .version(convert_version(&response.version)); + for (name, values) in response.headers { + for value in values { + builder = builder.header(&name, &value); + } + } + tokio::spawn(async move { + replay_body(events, sender).await; + // insert the finalized body into + }); + break Ok(builder.body(body).expect("valid builder")); + } + + Action::Data { + direction: Direction::Request, + data: _data, + } => { + tracing::info!("get request data"); + } + Action::Eof { + direction: Direction::Response, + .. + } => panic!("got eof before response"), + + Action::Data { + data: _, + direction: Direction::Response, + } => panic!("got response data before response"), + } + }; + recording.lock().unwrap().insert(event_id, recorded_request); + resp + }; + HttpConnectorFuture::new(fut) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs new file mode 100644 index 00000000000..2150235c034 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs @@ -0,0 +1,187 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_http::body::SdkBody; +use aws_smithy_http::result::ConnectorError; +use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use http::header::{HeaderName, CONTENT_TYPE}; +use std::fmt::Debug; +use std::ops::Deref; +use std::sync::{Arc, Mutex}; +use std::time::Duration; + +type ConnectionEvents = Vec; + +/// Test data for the [`EventConnector`]. +/// +/// Each `ConnectionEvent` represents one HTTP request and response +/// through the connector. Optionally, a latency value can be set to simulate +/// network latency (done via async sleep in the `EventConnector`). +#[derive(Debug)] +pub struct ConnectionEvent { + latency: Duration, + req: HttpRequest, + res: HttpResponse, +} + +impl ConnectionEvent { + /// Creates a new `ConnectionEvent`. + pub fn new(req: HttpRequest, res: HttpResponse) -> Self { + Self { + res, + req, + latency: Duration::from_secs(0), + } + } + + /// Add simulated latency to this `ConnectionEvent` + pub fn with_latency(mut self, latency: Duration) -> Self { + self.latency = latency; + self + } + + /// Returns the test request. + pub fn request(&self) -> &HttpRequest { + &self.req + } + + /// Returns the test response. + pub fn response(&self) -> &HttpResponse { + &self.res + } +} + +impl From<(HttpRequest, HttpResponse)> for ConnectionEvent { + fn from((req, res): (HttpRequest, HttpResponse)) -> Self { + Self::new(req, res) + } +} + +#[derive(Debug)] +struct ValidateRequest { + expected: HttpRequest, + actual: HttpRequest, +} + +impl ValidateRequest { + fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { + let (actual, expected) = (&self.actual, &self.expected); + assert_eq!( + actual.uri(), + expected.uri(), + "Request #{index} - URI doesn't match expected value" + ); + for (name, value) in expected.headers() { + if !ignore_headers.contains(name) { + let actual_header = actual + .headers() + .get(name) + .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); + assert_eq!( + actual_header.to_str().unwrap(), + value.to_str().unwrap(), + "Request #{index} - Header {name:?} doesn't match expected value", + ); + } + } + let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); + let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); + let media_type = if actual + .headers() + .get(CONTENT_TYPE) + .map(|v| v.to_str().unwrap().contains("json")) + .unwrap_or(false) + { + MediaType::Json + } else { + MediaType::Other("unknown".to_string()) + }; + match (actual_str, expected_str) { + (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), + _ => assert_eq!( + actual.body().bytes(), + expected.body().bytes(), + "Request #{index} - Body contents didn't match expected value" + ), + }; + } +} + +/// Request/response event-driven connector for use in tests. +/// +/// A basic test connection. It will: +/// - Respond to requests with a preloaded series of responses +/// - Record requests for future examination +#[derive(Debug, Clone)] +pub struct EventConnector { + data: Arc>, + requests: Arc>>, + sleep_impl: SharedAsyncSleep, +} + +impl EventConnector { + /// Creates a new event connector. + pub fn new(mut data: ConnectionEvents, sleep_impl: impl Into) -> Self { + data.reverse(); + EventConnector { + data: Arc::new(Mutex::new(data)), + requests: Default::default(), + sleep_impl: sleep_impl.into(), + } + } + + fn requests(&self) -> impl Deref> + '_ { + self.requests.lock().unwrap() + } + + /// Asserts the expected requests match the actual requests. + /// + /// The expected requests are given as the connection events when the `EventConnector` + /// is created. The `EventConnector` will record the actual requests and assert that + /// they match the expected requests. + /// + /// A list of headers that should be ignored when comparing requests can be passed + /// for cases where headers are non-deterministic or are irrelevant to the test. + #[track_caller] + pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { + for (i, req) in self.requests().iter().enumerate() { + req.assert_matches(i, ignore_headers) + } + let remaining_requests = self.data.lock().unwrap(); + let number_of_remaining_requests = remaining_requests.len(); + let actual_requests = self.requests().len(); + assert!( + remaining_requests.is_empty(), + "Expected {number_of_remaining_requests} additional requests (only {actual_requests} sent)", + ); + } +} + +impl HttpConnector for EventConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let (res, simulated_latency) = if let Some(event) = self.data.lock().unwrap().pop() { + self.requests.lock().unwrap().push(ValidateRequest { + expected: event.req, + actual: request, + }); + + (Ok(event.res.map(SdkBody::from)), event.latency) + } else { + ( + Err(ConnectorError::other("No more data".into(), None)), + Duration::from_secs(0), + ) + }; + + let sleep = self.sleep_impl.sleep(simulated_latency); + HttpConnectorFuture::new(async move { + sleep.await; + res + }) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs new file mode 100644 index 00000000000..b311464774f --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_http::body::SdkBody; +use aws_smithy_http::result::ConnectorError; +use aws_smithy_runtime_api::client::connectors::{ + HttpConnector, HttpConnectorFuture, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use std::fmt; +use std::sync::Arc; + +/// Create a [`SharedHttpConnector`] from `Fn(http:Request) -> http::Response` +/// +/// # Examples +/// +/// ```rust +/// use aws_smithy_runtime::client::connectors::test_util::infallible_connection_fn; +/// let connector = infallible_connection_fn(|_req| http::Response::builder().status(200).body("OK!").unwrap()); +/// ``` +pub fn infallible_connection_fn( + f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, +) -> SharedHttpConnector +where + B: Into, +{ + SharedHttpConnector::new(InfallibleConnectorFn::new(f)) +} + +#[derive(Clone)] +struct InfallibleConnectorFn { + #[allow(clippy::type_complexity)] + response: Arc< + dyn Fn(http::Request) -> Result, ConnectorError> + + Send + + Sync, + >, +} + +impl fmt::Debug for InfallibleConnectorFn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InfallibleConnectorFn").finish() + } +} + +impl InfallibleConnectorFn { + fn new>( + f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, + ) -> Self { + Self { + response: Arc::new(move |request| Ok(f(request).map(|b| b.into()))), + } + } +} + +impl HttpConnector for InfallibleConnectorFn { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + HttpConnectorFuture::ready((self.response)(request)) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs new file mode 100644 index 00000000000..dbd1d7c4cf3 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs @@ -0,0 +1,42 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Test connectors that never return data + +use aws_smithy_async::future::never::Never; +use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; + +/// A connector that will never respond. +/// +/// Returned futures will return Pending forever +#[derive(Clone, Debug, Default)] +pub struct NeverConnector { + invocations: Arc, +} + +impl NeverConnector { + /// Create a new never connector. + pub fn new() -> Self { + Default::default() + } + + /// Returns the number of invocations made to this connector. + pub fn num_calls(&self) -> usize { + self.invocations.load(Ordering::SeqCst) + } +} + +impl HttpConnector for NeverConnector { + fn call(&self, _request: HttpRequest) -> HttpConnectorFuture { + self.invocations.fetch_add(1, Ordering::SeqCst); + HttpConnectorFuture::new(async move { + Never::new().await; + unreachable!() + }) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 874d282c954..f0b89328e1f 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -356,12 +356,7 @@ async fn try_attempt( OrchestratorError::other("No HTTP connector was available to send this request. \ Enable the `rustls` crate feature or set a connector to fix this.") )); - connector.call(request).await.map_err(|err| { - match err.downcast() { - Ok(connector_error) => OrchestratorError::connector(*connector_error), - Err(box_err) => OrchestratorError::other(box_err) - } - }) + connector.call(request).await.map_err(OrchestratorError::connector) }); trace!(response = ?response, "received response from service"); ctx.set_response(response); @@ -442,7 +437,9 @@ mod tests { use aws_smithy_runtime_api::client::auth::{ AuthSchemeOptionResolverParams, SharedAuthSchemeOptionResolver, }; - use aws_smithy_runtime_api::client::connectors::{HttpConnector, SharedHttpConnector}; + use aws_smithy_runtime_api::client::connectors::{ + HttpConnector, HttpConnectorFuture, SharedHttpConnector, + }; use aws_smithy_runtime_api::client::endpoint::{ EndpointResolverParams, SharedEndpointResolver, }; @@ -454,7 +451,7 @@ mod tests { FinalizerInterceptorContextRef, }; use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; - use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, Future, HttpRequest}; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins}; @@ -492,11 +489,11 @@ mod tests { } impl HttpConnector for OkConnector { - fn call(&self, _request: HttpRequest) -> BoxFuture { - Box::pin(Future::ready(Ok(::http::Response::builder() + fn call(&self, _request: HttpRequest) -> HttpConnectorFuture { + HttpConnectorFuture::ready(Ok(::http::Response::builder() .status(200) .body(SdkBody::empty()) - .expect("OK response is valid")))) + .expect("OK response is valid"))) } } diff --git a/rust-runtime/aws-smithy-runtime/test-data/example.com.json b/rust-runtime/aws-smithy-runtime/test-data/example.com.json new file mode 100644 index 00000000000..821548cc217 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/test-data/example.com.json @@ -0,0 +1,106 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://www.example.com/", + "headers": {}, + "method": "POST" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "hello world" + }, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/2.0", + "headers": { + "etag": [ + "\"3147526947+ident\"" + ], + "vary": [ + "Accept-Encoding" + ], + "server": [ + "ECS (bsa/EB20)" + ], + "x-cache": [ + "HIT" + ], + "age": [ + "355292" + ], + "content-length": [ + "1256" + ], + "cache-control": [ + "max-age=604800" + ], + "expires": [ + "Mon, 16 Aug 2021 18:51:30 GMT" + ], + "content-type": [ + "text/html; charset=UTF-8" + ], + "date": [ + "Mon, 09 Aug 2021 18:51:30 GMT" + ], + "last-modified": [ + "Thu, 17 Oct 2019 07:18:26 GMT" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "hello from example.com" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "test of example.com. response body has been manually changed", + "version": "V0" +} From 95e8c30b68dccbc26fe1aee961f4cd7d9827dcd8 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 7 Sep 2023 13:38:35 -0400 Subject: [PATCH 115/331] Update dependencies of benchmark (#2974) ## Motivation and Context Remove vulnerable webpki version ## Testing I ran the benchmark ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../orchestrator-vs-middleware/Cargo.lock | 639 ++++++++++-------- .../s3-throughput/benchmark/Cargo.lock | 463 +++++++------ 2 files changed, 597 insertions(+), 505 deletions(-) diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock index 7cf3c5ef2e9..c9e64af1af6 100644 --- a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock +++ b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] @@ -62,19 +62,19 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.0.0-smithy-rs-head" +version = "0.56.1" dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-http 0.0.0-smithy-rs-head", + "aws-credential-types 0.56.1", + "aws-http 0.56.1", "aws-sdk-sso", "aws-sdk-sts", - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-client 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-http-tower 0.0.0-smithy-rs-head", - "aws-smithy-json 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", + "aws-smithy-async 0.56.1", + "aws-smithy-client 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-http-tower 0.56.1", + "aws-smithy-json 0.56.1", + "aws-smithy-types 0.56.1", + "aws-types 0.56.1", "bytes", "fastrand 2.0.0", "hex", @@ -88,18 +88,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "aws-credential-types" -version = "0.0.0-smithy-rs-head" -dependencies = [ - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "fastrand 2.0.0", - "tokio", - "tracing", - "zeroize", -] - [[package]] name = "aws-credential-types" version = "0.55.3" @@ -115,15 +103,15 @@ dependencies = [ ] [[package]] -name = "aws-endpoint" -version = "0.0.0-smithy-rs-head" +name = "aws-credential-types" +version = "0.56.1" dependencies = [ - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", - "http", - "regex", + "aws-smithy-async 0.56.1", + "aws-smithy-types 0.56.1", + "fastrand 2.0.0", + "tokio", "tracing", + "zeroize", ] [[package]] @@ -142,12 +130,14 @@ dependencies = [ [[package]] name = "aws-http" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", + "aws-credential-types 0.55.3", + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", + "aws-types 0.55.3", "bytes", "http", "http-body", @@ -159,14 +149,12 @@ dependencies = [ [[package]] name = "aws-http" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" +version = "0.56.1" dependencies = [ - "aws-credential-types 0.55.3", - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", - "aws-types 0.55.3", + "aws-credential-types 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-types 0.56.1", + "aws-types 0.56.1", "bytes", "http", "http-body", @@ -176,25 +164,45 @@ dependencies = [ "tracing", ] +[[package]] +name = "aws-runtime" +version = "0.56.1" +dependencies = [ + "aws-credential-types 0.56.1", + "aws-http 0.56.1", + "aws-sigv4 0.56.1", + "aws-smithy-async 0.56.1", + "aws-smithy-eventstream 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-runtime-api", + "aws-smithy-types 0.56.1", + "aws-types 0.56.1", + "fastrand 2.0.0", + "http", + "percent-encoding", + "tracing", + "uuid", +] + [[package]] name = "aws-sdk-s3" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-endpoint 0.0.0-smithy-rs-head", - "aws-http 0.0.0-smithy-rs-head", - "aws-sig-auth 0.0.0-smithy-rs-head", - "aws-sigv4 0.0.0-smithy-rs-head", - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-checksums 0.0.0-smithy-rs-head", - "aws-smithy-client 0.0.0-smithy-rs-head", - "aws-smithy-eventstream 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-http-tower 0.0.0-smithy-rs-head", - "aws-smithy-json 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "aws-smithy-xml 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", + "aws-credential-types 0.56.1", + "aws-http 0.56.1", + "aws-runtime", + "aws-sigv4 0.56.1", + "aws-smithy-async 0.56.1", + "aws-smithy-checksums 0.56.1", + "aws-smithy-client 0.56.1", + "aws-smithy-eventstream 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-json 0.56.1", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types 0.56.1", + "aws-smithy-xml 0.56.1", + "aws-types 0.56.1", "bytes", "http", "http-body", @@ -202,7 +210,6 @@ dependencies = [ "percent-encoding", "regex", "tokio-stream", - "tower", "tracing", "url", ] @@ -214,9 +221,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f" dependencies = [ "aws-credential-types 0.55.3", - "aws-endpoint 0.55.3", + "aws-endpoint", "aws-http 0.55.3", - "aws-sig-auth 0.55.3", + "aws-sig-auth", "aws-sigv4 0.55.3", "aws-smithy-async 0.55.3", "aws-smithy-checksums 0.55.3", @@ -244,22 +251,21 @@ dependencies = [ name = "aws-sdk-sso" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-endpoint 0.0.0-smithy-rs-head", - "aws-http 0.0.0-smithy-rs-head", - "aws-sig-auth 0.0.0-smithy-rs-head", - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-client 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-http-tower 0.0.0-smithy-rs-head", - "aws-smithy-json 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", + "aws-credential-types 0.56.1", + "aws-http 0.56.1", + "aws-runtime", + "aws-smithy-async 0.56.1", + "aws-smithy-client 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-json 0.56.1", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types 0.56.1", + "aws-types 0.56.1", "bytes", "http", "regex", "tokio-stream", - "tower", "tracing", ] @@ -267,37 +273,21 @@ dependencies = [ name = "aws-sdk-sts" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-endpoint 0.0.0-smithy-rs-head", - "aws-http 0.0.0-smithy-rs-head", - "aws-sig-auth 0.0.0-smithy-rs-head", - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-client 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-http-tower 0.0.0-smithy-rs-head", - "aws-smithy-json 0.0.0-smithy-rs-head", + "aws-credential-types 0.56.1", + "aws-http 0.56.1", + "aws-runtime", + "aws-smithy-async 0.56.1", + "aws-smithy-client 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-json 0.56.1", "aws-smithy-query", - "aws-smithy-types 0.0.0-smithy-rs-head", - "aws-smithy-xml 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", - "bytes", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types 0.56.1", + "aws-smithy-xml 0.56.1", + "aws-types 0.56.1", "http", "regex", - "tower", - "tracing", -] - -[[package]] -name = "aws-sig-auth" -version = "0.0.0-smithy-rs-head" -dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-sigv4 0.0.0-smithy-rs-head", - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-eventstream 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-types 0.0.0-smithy-rs-head", - "http", "tracing", ] @@ -318,10 +308,12 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" dependencies = [ - "aws-smithy-eventstream 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", + "aws-smithy-eventstream 0.55.3", + "aws-smithy-http 0.55.3", "bytes", "form_urlencoded", "hex", @@ -337,12 +329,10 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" +version = "0.56.1" dependencies = [ - "aws-smithy-eventstream 0.55.3", - "aws-smithy-http 0.55.3", + "aws-smithy-eventstream 0.56.1", + "aws-smithy-http 0.56.1", "bytes", "form_urlencoded", "hex", @@ -358,7 +348,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" dependencies = [ "futures-util", "pin-project-lite", @@ -368,9 +360,7 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" +version = "0.56.1" dependencies = [ "futures-util", "pin-project-lite", @@ -380,10 +370,12 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" dependencies = [ - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", "bytes", "crc32c", "crc32fast", @@ -399,12 +391,10 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" +version = "0.56.1" dependencies = [ - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", + "aws-smithy-http 0.56.1", + "aws-smithy-types 0.56.1", "bytes", "crc32c", "crc32fast", @@ -420,22 +410,24 @@ dependencies = [ [[package]] name = "aws-smithy-client" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" dependencies = [ - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-http-tower 0.0.0-smithy-rs-head", - "aws-smithy-protocol-test 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-async 0.55.3", + "aws-smithy-http 0.55.3", + "aws-smithy-http-tower 0.55.3", + "aws-smithy-protocol-test 0.55.3", + "aws-smithy-types 0.55.3", "bytes", - "fastrand 2.0.0", + "fastrand 1.9.0", "http", "http-body", "hyper", - "hyper-rustls 0.24.1", + "hyper-rustls 0.23.2", "lazy_static", "pin-project-lite", - "rustls 0.21.5", + "rustls 0.20.9", "serde", "serde_json", "tokio", @@ -445,24 +437,23 @@ dependencies = [ [[package]] name = "aws-smithy-client" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" +version = "0.56.1" dependencies = [ - "aws-smithy-async 0.55.3", - "aws-smithy-http 0.55.3", - "aws-smithy-http-tower 0.55.3", - "aws-smithy-protocol-test 0.55.3", - "aws-smithy-types 0.55.3", + "aws-smithy-async 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-http-tower 0.56.1", + "aws-smithy-protocol-test 0.56.1", + "aws-smithy-types 0.56.1", "bytes", - "fastrand 1.9.0", + "fastrand 2.0.0", + "h2", "http", "http-body", "hyper", - "hyper-rustls 0.23.2", + "hyper-rustls 0.24.1", "lazy_static", "pin-project-lite", - "rustls 0.20.8", + "rustls 0.21.7", "serde", "serde_json", "tokio", @@ -472,30 +463,32 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" dependencies = [ - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-types 0.55.3", "bytes", "crc32fast", ] [[package]] name = "aws-smithy-eventstream" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" +version = "0.56.1" dependencies = [ - "aws-smithy-types 0.55.3", + "aws-smithy-types 0.56.1", "bytes", "crc32fast", ] [[package]] name = "aws-smithy-http" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" dependencies = [ - "aws-smithy-eventstream 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-eventstream 0.55.3", + "aws-smithy-types 0.55.3", "bytes", "bytes-utils", "futures-core", @@ -513,12 +506,10 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" +version = "0.56.1" dependencies = [ - "aws-smithy-eventstream 0.55.3", - "aws-smithy-types 0.55.3", + "aws-smithy-eventstream 0.56.1", + "aws-smithy-types 0.56.1", "bytes", "bytes-utils", "futures-core", @@ -536,10 +527,12 @@ dependencies = [ [[package]] name = "aws-smithy-http-tower" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" dependencies = [ - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-http 0.55.3", + "aws-smithy-types 0.55.3", "bytes", "http", "http-body", @@ -550,12 +543,10 @@ dependencies = [ [[package]] name = "aws-smithy-http-tower" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" +version = "0.56.1" dependencies = [ - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", + "aws-smithy-http 0.56.1", + "aws-smithy-types 0.56.1", "bytes", "http", "http-body", @@ -566,23 +557,25 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" dependencies = [ - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-types 0.55.3", ] [[package]] name = "aws-smithy-json" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" +version = "0.56.1" dependencies = [ - "aws-smithy-types 0.55.3", + "aws-smithy-types 0.56.1", ] [[package]] name = "aws-smithy-protocol-test" -version = "0.0.0-smithy-rs-head" +version = "0.55.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabbf8d2bfefa4870ba497c1ae3b40e5e26be18af1cb8c871856b0a393a15ffa" dependencies = [ "assert-json-diff", "http", @@ -595,9 +588,7 @@ dependencies = [ [[package]] name = "aws-smithy-protocol-test" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabbf8d2bfefa4870ba497c1ae3b40e5e26be18af1cb8c871856b0a393a15ffa" +version = "0.56.1" dependencies = [ "assert-json-diff", "http", @@ -610,22 +601,43 @@ dependencies = [ [[package]] name = "aws-smithy-query" -version = "0.0.0-smithy-rs-head" +version = "0.56.1" dependencies = [ - "aws-smithy-types 0.0.0-smithy-rs-head", + "aws-smithy-types 0.56.1", "urlencoding", ] [[package]] -name = "aws-smithy-types" -version = "0.0.0-smithy-rs-head" +name = "aws-smithy-runtime" +version = "0.56.1" dependencies = [ - "base64-simd", - "itoa", - "num-integer", - "ryu", - "serde", - "time", + "aws-smithy-async 0.56.1", + "aws-smithy-client 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-runtime-api", + "aws-smithy-types 0.56.1", + "bytes", + "fastrand 2.0.0", + "http", + "http-body", + "once_cell", + "pin-project-lite", + "pin-utils", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "0.56.1" +dependencies = [ + "aws-smithy-async 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-types 0.56.1", + "bytes", + "http", + "tokio", + "tracing", ] [[package]] @@ -642,10 +654,15 @@ dependencies = [ ] [[package]] -name = "aws-smithy-xml" -version = "0.0.0-smithy-rs-head" +name = "aws-smithy-types" +version = "0.56.1" dependencies = [ - "xmlparser", + "base64-simd", + "itoa", + "num-integer", + "ryu", + "serde", + "time", ] [[package]] @@ -658,17 +675,10 @@ dependencies = [ ] [[package]] -name = "aws-types" -version = "0.0.0-smithy-rs-head" +name = "aws-smithy-xml" +version = "0.56.1" dependencies = [ - "aws-credential-types 0.0.0-smithy-rs-head", - "aws-smithy-async 0.0.0-smithy-rs-head", - "aws-smithy-client 0.0.0-smithy-rs-head", - "aws-smithy-http 0.0.0-smithy-rs-head", - "aws-smithy-types 0.0.0-smithy-rs-head", - "http", - "rustc_version", - "tracing", + "xmlparser", ] [[package]] @@ -687,11 +697,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "aws-types" +version = "0.56.1" +dependencies = [ + "aws-credential-types 0.56.1", + "aws-smithy-async 0.56.1", + "aws-smithy-client 0.56.1", + "aws-smithy-http 0.56.1", + "aws-smithy-types 0.56.1", + "http", + "rustc_version", + "tracing", +] + [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -704,9 +728,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64-simd" @@ -763,9 +787,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -955,6 +982,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" + [[package]] name = "diff" version = "0.1.13" @@ -1064,7 +1097,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", ] [[package]] @@ -1106,15 +1139,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -1201,9 +1234,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" @@ -1222,7 +1255,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -1238,7 +1271,7 @@ dependencies = [ "http", "hyper", "log", - "rustls 0.20.8", + "rustls 0.20.9", "rustls-native-certs", "tokio", "tokio-rustls 0.23.4", @@ -1254,7 +1287,7 @@ dependencies = [ "http", "hyper", "log", - "rustls 0.21.5", + "rustls 0.21.7", "rustls-native-certs", "tokio", "tokio-rustls 0.24.1", @@ -1337,9 +1370,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "md-5" @@ -1352,9 +1385,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "memoffset" @@ -1416,9 +1449,9 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -1446,11 +1479,11 @@ name = "orchestrator-vs-middleware" version = "0.1.0" dependencies = [ "aws-config", - "aws-credential-types 0.0.0-smithy-rs-head", + "aws-credential-types 0.56.1", "aws-sdk-s3 0.0.0-local", "aws-sdk-s3 0.28.0", - "aws-smithy-client 0.0.0-smithy-rs-head", "aws-smithy-client 0.55.3", + "aws-smithy-client 0.56.1", "criterion", "http", "tokio", @@ -1499,29 +1532,29 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", ] [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1602,9 +1635,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1642,9 +1675,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.1" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", @@ -1654,9 +1687,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", @@ -1665,9 +1698,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "ring" @@ -1710,9 +1743,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", "ring", @@ -1722,9 +1755,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", @@ -1755,9 +1788,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.2" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring", "untrusted", @@ -1834,29 +1867,29 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.177" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.177" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", ] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -1896,9 +1929,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -1919,6 +1952,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "spin" version = "0.5.2" @@ -1944,9 +1987,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -1961,30 +2004,31 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", ] [[package]] name = "time" -version = "0.3.23" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ + "deranged", "serde", "time-core", "time-macros", @@ -1998,9 +2042,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" dependencies = [ "time-core", ] @@ -2032,11 +2076,10 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", @@ -2045,7 +2088,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.3", "tokio-macros", "windows-sys", ] @@ -2058,7 +2101,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", ] [[package]] @@ -2067,7 +2110,7 @@ version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.20.8", + "rustls 0.20.9", "tokio", "webpki", ] @@ -2078,7 +2121,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.5", + "rustls 0.21.7", "tokio", ] @@ -2156,7 +2199,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", ] [[package]] @@ -2209,9 +2252,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -2224,6 +2267,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "uuid" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" + [[package]] name = "version_check" version = "0.9.4" @@ -2238,9 +2287,9 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -2282,7 +2331,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", "wasm-bindgen-shared", ] @@ -2304,7 +2353,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.31", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2327,9 +2376,9 @@ dependencies = [ [[package]] name = "webpki" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" dependencies = [ "ring", "untrusted", @@ -2377,9 +2426,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -2392,45 +2441,45 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "xmlparser" diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock index a435022a58c..4479f622048 100644 --- a/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock @@ -3,25 +3,40 @@ version = 3 [[package]] -name = "aho-corasick" +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" [[package]] name = "async-trait" -version = "0.1.70" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79fa67157abdfd688a259b6648808757db9347af834624f27ec646da976aee5d" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", @@ -395,11 +410,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64-simd" @@ -466,9 +496,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -478,31 +511,29 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" dependencies = [ "anstyle", - "bitflags", "clap_lex", ] [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ "heck", "proc-macro2", @@ -512,9 +543,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "core-foundation" @@ -534,18 +565,18 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crc32c" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" dependencies = [ "rustc_version", ] @@ -569,6 +600,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" + [[package]] name = "digest" version = "0.10.7" @@ -582,9 +619,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "fastrand" @@ -659,11 +696,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + [[package]] name = "h2" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -692,12 +735,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -744,9 +784,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" @@ -765,7 +805,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -818,15 +858,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -839,9 +879,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.145" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "lock_api" @@ -855,9 +895,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "matchers" @@ -865,7 +905,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -879,9 +919,18 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] [[package]] name = "mio" @@ -891,7 +940,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -916,23 +965,32 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -988,18 +1046,18 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", @@ -1008,9 +1066,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1020,18 +1078,18 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.29" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1047,13 +1105,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.3.8", + "regex-syntax 0.7.5", ] [[package]] @@ -1065,6 +1124,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1073,9 +1143,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "ring" @@ -1092,6 +1162,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1103,9 +1179,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", "ring", @@ -1115,9 +1191,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", "rustls-pemfile", @@ -1127,33 +1203,33 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ "base64", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -1167,9 +1243,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags", "core-foundation", @@ -1180,9 +1256,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -1190,15 +1266,29 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "sha1" @@ -1213,9 +1303,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -1242,18 +1332,18 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -1265,6 +1355,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "spin" version = "0.5.2" @@ -1279,9 +1379,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.23" +version = "2.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -1300,10 +1400,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ + "deranged", "serde", "time-core", "time-macros", @@ -1317,9 +1418,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" dependencies = [ "time-core", ] @@ -1341,11 +1442,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -1353,9 +1454,9 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.3", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1448,9 +1549,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", @@ -1516,9 +1617,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1537,9 +1638,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -1548,9 +1649,9 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "valuable" @@ -1572,11 +1673,10 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1588,9 +1688,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1598,9 +1698,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", @@ -1613,9 +1713,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1623,9 +1723,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", @@ -1636,15 +1736,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1652,9 +1752,9 @@ dependencies = [ [[package]] name = "webpki" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" dependencies = [ "ring", "untrusted", @@ -1682,21 +1782,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -1708,102 +1793,60 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "xmlparser" From 5401e0d364ee2c68e0026b3d47e5f7649dd91ebe Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 8 Sep 2023 09:09:45 -0700 Subject: [PATCH 116/331] Make order of expected/actual consistent in protocol tests (#2976) Debugging tests is easier when the order of arguments in assertions is consistent across the board. With consistent order, you don't need to look at the line of code to know which value is the correct value. Most of the rest of the project uses expected/actual order, so this PR makes the protocol tests also use that order. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-client/src/test_connection.rs | 2 +- .../aws-smithy-protocol-test/src/lib.rs | 20 +++++++------- .../src/urlencoded.rs | 20 +++++++------- .../aws-smithy-protocol-test/src/xml.rs | 26 ++++++++++--------- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs index 1c90e7606f1..b0600b369af 100644 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ b/rust-runtime/aws-smithy-client/src/test_connection.rs @@ -163,7 +163,7 @@ impl ValidateRequest { }; match (actual_str, expected_str) { (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), - _ => assert_eq!(actual.body().bytes(), expected.body().bytes()), + _ => assert_eq!(expected.body().bytes(), actual.body().bytes()), }; } } diff --git a/rust-runtime/aws-smithy-protocol-test/src/lib.rs b/rust-runtime/aws-smithy-protocol-test/src/lib.rs index d110272ceab..111a8afa2f8 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/lib.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/lib.rs @@ -307,8 +307,8 @@ pub fn validate_body>( ) -> Result<(), ProtocolTestFailure> { let body_str = std::str::from_utf8(actual_body.as_ref()); match (media_type, body_str) { - (MediaType::Json, Ok(actual_body)) => try_json_eq(actual_body, expected_body), - (MediaType::Xml, Ok(actual_body)) => try_xml_equivalent(actual_body, expected_body), + (MediaType::Json, Ok(actual_body)) => try_json_eq(expected_body, actual_body), + (MediaType::Xml, Ok(actual_body)) => try_xml_equivalent(expected_body, actual_body), (MediaType::Json, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat { expected: "json".to_owned(), found: "input was not valid UTF-8".to_owned(), @@ -318,7 +318,7 @@ pub fn validate_body>( found: "input was not valid UTF-8".to_owned(), }), (MediaType::UrlEncodedForm, Ok(actual_body)) => { - try_url_encoded_form_equivalent(actual_body, expected_body) + try_url_encoded_form_equivalent(expected_body, actual_body) } (MediaType::UrlEncodedForm, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat { expected: "x-www-form-urlencoded".to_owned(), @@ -327,7 +327,7 @@ pub fn validate_body>( (MediaType::Other(media_type), Ok(actual_body)) => { if actual_body != expected_body { Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(actual_body, expected_body), + comparison: pretty_comparison(expected_body, actual_body), hint: format!("media type: {}", media_type), }) } else { @@ -358,25 +358,25 @@ impl Debug for PrettyString { } } -fn pretty_comparison(left: &str, right: &str) -> PrettyString { +fn pretty_comparison(expected: &str, actual: &str) -> PrettyString { PrettyString(format!( "{}", - Comparison::new(&PrettyStr(left), &PrettyStr(right)) + Comparison::new(&PrettyStr(expected), &PrettyStr(actual)) )) } -fn try_json_eq(actual: &str, expected: &str) -> Result<(), ProtocolTestFailure> { +fn try_json_eq(expected: &str, actual: &str) -> Result<(), ProtocolTestFailure> { + let expected_json: serde_json::Value = + serde_json::from_str(expected).expect("expected value must be valid JSON"); let actual_json: serde_json::Value = serde_json::from_str(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { expected: "json".to_owned(), found: e.to_string() + actual, })?; - let expected_json: serde_json::Value = - serde_json::from_str(expected).expect("expected value must be valid JSON"); match assert_json_eq_no_panic(&actual_json, &expected_json) { Ok(()) => Ok(()), Err(message) => Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(actual, expected), + comparison: pretty_comparison(expected, actual), hint: message, }), } diff --git a/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs b/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs index 83c64e777b2..e3c66bef434 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs @@ -41,16 +41,16 @@ fn rewrite_url_encoded_body(input: &str) -> String { } pub(crate) fn try_url_encoded_form_equivalent( - actual: &str, expected: &str, + actual: &str, ) -> Result<(), ProtocolTestFailure> { - let actual = rewrite_url_encoded_body(actual); let expected = rewrite_url_encoded_body(expected); + let actual = rewrite_url_encoded_body(actual); if actual == expected { Ok(()) } else { Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(&actual, &expected), + comparison: pretty_comparison(&expected, &actual), hint: "".into(), }) } @@ -71,30 +71,30 @@ mod tests { ); assert!(try_url_encoded_form_equivalent( - "Action=Something&Version=test&Property=foo", "Action=Something&Version=test&Property=bar", + "Action=Something&Version=test&Property=foo", ) .is_err()); assert!(try_url_encoded_form_equivalent( - "Action=Something&Version=test&WrongProperty=foo", "Action=Something&Version=test&Property=foo", + "Action=Something&Version=test&WrongProperty=foo", ) .is_err()); assert_eq!( Ok(()), try_url_encoded_form_equivalent( - "Action=Something&Version=test\ - &SomeMap.1.key=foo\ - &SomeMap.1.value=Foo\ - &SomeMap.2.key=bar\ - &SomeMap.2.value=Bar", "Action=Something&Version=test\ &SomeMap.1.key=bar\ &SomeMap.1.value=Bar\ &SomeMap.2.key=foo\ &SomeMap.2.value=Foo", + "Action=Something&Version=test\ + &SomeMap.1.key=foo\ + &SomeMap.1.value=Foo\ + &SomeMap.2.key=bar\ + &SomeMap.2.value=Bar", ) ); } diff --git a/rust-runtime/aws-smithy-protocol-test/src/xml.rs b/rust-runtime/aws-smithy-protocol-test/src/xml.rs index a27420e36bb..054bf4b7c15 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/xml.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/xml.rs @@ -11,23 +11,25 @@ use std::fmt::Write; /// /// This will normalize documents and attempts to determine if it is OK to sort members or not by /// using a heuristic to determine if the tag represents a list (which should not be reordered) -pub(crate) fn try_xml_equivalent(actual: &str, expected: &str) -> Result<(), ProtocolTestFailure> { - if actual == expected { +pub(crate) fn try_xml_equivalent(expected: &str, actual: &str) -> Result<(), ProtocolTestFailure> { + if expected == actual { return Ok(()); } - let norm_1 = normalize_xml(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { - expected: "actual document to be valid XML".to_string(), - found: format!("{}\n{}", e, actual), - })?; - let norm_2 = normalize_xml(expected).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { - expected: "expected document to be valid XML".to_string(), - found: format!("{}", e), - })?; - if norm_1 == norm_2 { + let norm_expected = + normalize_xml(expected).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { + expected: "expected document to be valid XML".to_string(), + found: format!("{}", e), + })?; + let norm_actual = + normalize_xml(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { + expected: "actual document to be valid XML".to_string(), + found: format!("{}\n{}", e, actual), + })?; + if norm_expected == norm_actual { Ok(()) } else { Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(&norm_1, &norm_2), + comparison: pretty_comparison(&norm_expected, &norm_actual), hint: "".to_string(), }) } From 0bd57fe31245bf64042f3d1061ddc92f74ba16be Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 8 Sep 2023 12:45:30 -0500 Subject: [PATCH 117/331] Port redacting sensitive body to orchestrator (#2972) ## Motivation and Context Fixes https://github.com/awslabs/smithy-rs/issues/2926 ## Description This PR ports logic implemented in https://github.com/awslabs/smithy-rs/pull/2603. Thankfully, even though we did not port this at the time of the orchestrator launch, the orchestrator has not logged sensitive bodies because we have never logged response bodies in the orchestrator code. The code changes in this PR - now logs response bodies in `try_attempt` - ports the logic from the previous PR in question to the orchestrator, via an interceptor Now, when credentials providers in `aws_config` need to say "I want to redact a response body" ([example](https://github.com/awslabs/smithy-rs/blob/2c27834f90b0585dba60606f9da6246b341227d6/aws/rust-runtime/aws-config/src/http_credential_provider.rs#L48)) when middleware is gone, they can pass an interceptor `SensitiveOutputInterceptor` to `Config` of whatever clients they are using. ## Testing Depends on the existing tests. Without the logic ported over the orchestrator and by logging response bodies unconditionally in `try_attempt`, we got the following failures. After we've ported the logic, they now pass. ``` default_provider::credentials::test::ecs_assume_role default_provider::credentials::test::imds_assume_role default_provider::credentials::test::sso_assume_role default_provider::credentials::test::web_identity_token_env default_provider::credentials::test::web_identity_token_profile default_provider::credentials::test::web_identity_token_source_profile profile::credentials::test::e2e_assume_role profile::credentials::test::region_override profile::credentials::test::retry_on_error ``` ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 16 +++- .../client/smithy/RustClientCodegenPlugin.kt | 2 + .../SensitiveOutputDecorator.kt | 48 +++++++++++ .../SensitiveOutputDecoratorTest.kt | 84 +++++++++++++++++++ .../rust/codegen/core/rustlang/RustType.kt | 1 + .../rust/codegen/core/smithy/RuntimeType.kt | 1 + .../src/client/orchestrator.rs | 8 ++ .../src/client/orchestrator.rs | 4 +- .../src/client/orchestrator/http.rs | 21 ++++- 9 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 6967c64b366..73c59508aec 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -128,13 +128,25 @@ meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" [[aws-sdk-rust]] -message = "Remove `once_cell` from public API" +message = "Remove `once_cell` from public API." references = ["smithy-rs#2973"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "ysaito1001" [[smithy-rs]] -message = "Remove `once_cell` from public API" +message = "Remove `once_cell` from public API." references = ["smithy-rs#2973"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "ysaito1001" + +[[aws-sdk-rust]] +message = "Fix regression with redacting sensitive HTTP response bodies." +references = ["smithy-rs#2926", "smithy-rs#2972"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" + +[[smithy-rs]] +message = "Fix regression with redacting sensitive HTTP response bodies." +references = ["smithy-rs#2926", "smithy-rs#2972"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "ysaito1001" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt index 959948dedbf..39bc4633f2c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.ClientCu import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpConnectorConfigDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator +import software.amazon.smithy.rust.codegen.client.smithy.customizations.SensitiveOutputDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.RequiredCustomizations @@ -64,6 +65,7 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() { NoAuthDecorator(), HttpAuthDecorator(), HttpConnectorConfigDecorator(), + SensitiveOutputDecorator(), *decorator, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt new file mode 100644 index 00000000000..a902c1432db --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.SensitiveIndex +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +class SensitiveOutputDecorator : ClientCodegenDecorator { + override val name: String get() = "SensitiveOutputDecorator" + override val order: Byte get() = 0 + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List = + baseCustomizations + listOf(SensitiveOutputCustomization(codegenContext, operation)) +} + +private class SensitiveOutputCustomization( + private val codegenContext: ClientCodegenContext, + private val operation: OperationShape, +) : OperationCustomization() { + private val sensitiveIndex = SensitiveIndex.of(codegenContext.model) + override fun section(section: OperationSection): Writable = writable { + if (section is OperationSection.AdditionalRuntimePluginConfig && sensitiveIndex.hasSensitiveOutput(operation)) { + rustTemplate( + """ + ${section.newLayerName}.store_put(#{SensitiveOutput}); + """, + "SensitiveOutput" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + .resolve("client::orchestrator::SensitiveOutput"), + ) + } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt new file mode 100644 index 00000000000..ec4d1521519 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt @@ -0,0 +1,84 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.Attribute +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class SensitiveOutputDecoratorTest { + private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( + "capture_request" to RuntimeType.captureRequest(runtimeConfig), + "TestConnection" to CargoDependency.smithyClient(runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("test_connection::TestConnection"), + "SdkBody" to RuntimeType.sdkBody(runtimeConfig), + ) + + private val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + @optionalAuth + operation SayHello { output: TestOutput } + + @sensitive + structure Credentials { + username: String, + password: String + } + + structure TestOutput { + credentials: Credentials, + } + """.asSmithyModel() + + @Test + fun `sensitive output in model should redact response body`() { + clientIntegrationTest(model) { codegenContext, rustCrate -> + rustCrate.integrationTest("redacting_sensitive_response_body") { + val moduleName = codegenContext.moduleUseName() + Attribute.TokioTest.render(this) + Attribute.TracedTest.render(this) + rustTemplate( + """ + async fn redacting_sensitive_response_body() { + let (conn, _r) = #{capture_request}(Some( + http::Response::builder() + .status(200) + .body(#{SdkBody}::from("")) + .unwrap(), + )); + + let config = $moduleName::Config::builder() + .endpoint_resolver("http://localhost:1234") + .http_connector(conn.clone()) + .build(); + let client = $moduleName::Client::from_conf(config); + let _ = client.say_hello() + .send() + .await + .expect("success"); + + assert!(logs_contain("** REDACTED **")); + } + """, + *codegenScope(codegenContext.runtimeConfig), + ) + } + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 9b7f9cbc1d4..36e0dbdb6ae 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -523,6 +523,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { val Test = Attribute("test") val TokioTest = Attribute(RuntimeType.Tokio.resolve("test").writable) + val TracedTest = Attribute(RuntimeType.TracingTest.resolve("traced_test").writable) val AwsSdkUnstableAttribute = Attribute(cfg("aws_sdk_unstable")) /** diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 2341c36e5cb..c58596ad945 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -303,6 +303,7 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) val TokioStream = CargoDependency.TokioStream.toType() val Tower = CargoDependency.Tower.toType() val Tracing = CargoDependency.Tracing.toType() + val TracingTest = CargoDependency.TracingTest.toType() // codegen types val ConstrainedTrait = RuntimeType("crate::constrained::Constrained", InlineDependency.constrained()) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 76f1bfadce2..c4fee9bd458 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -71,6 +71,14 @@ impl Storable for LoadedRequestBody { type Storer = StoreReplace; } +/// Marker type stored in the config bag to indicate that a response body should be redacted. +#[derive(Debug)] +pub struct SensitiveOutput; + +impl Storable for SensitiveOutput { + type Storer = StoreReplace; +} + #[derive(Debug)] enum ErrorKind { /// An error occurred within an interceptor. diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index f0b89328e1f..9e7ceeb1995 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -9,7 +9,7 @@ use self::auth::orchestrate_auth; use crate::client::interceptors::Interceptors; use crate::client::orchestrator::endpoints::orchestrate_endpoint; -use crate::client::orchestrator::http::read_body; +use crate::client::orchestrator::http::{log_response_body, read_body}; use crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind}; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_http::body::SdkBody; @@ -36,6 +36,7 @@ use tracing::{debug, debug_span, instrument, trace, Instrument}; mod auth; /// Defines types that implement a trait for endpoint resolution pub mod endpoints; +/// Defines types that work with HTTP types mod http; macro_rules! halt { @@ -386,6 +387,7 @@ async fn try_attempt( .map_err(OrchestratorError::response) .and_then(|_| { let _span = debug_span!("deserialize_nonstreaming").entered(); + log_response_body(response, cfg); response_deserializer.deserialize_nonstreaming(response) }), } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs index 247464a7bdb..24baa8f414a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs @@ -4,10 +4,14 @@ */ use aws_smithy_http::body::SdkBody; -use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, SensitiveOutput}; +use aws_smithy_types::config_bag::ConfigBag; use bytes::{Buf, Bytes}; use http_body::Body; use pin_utils::pin_mut; +use tracing::trace; + +const LOG_SENSITIVE_BODIES: &str = "LOG_SENSITIVE_BODIES"; async fn body_to_bytes(body: SdkBody) -> Result::Error> { let mut output = Vec::new(); @@ -33,3 +37,18 @@ pub(crate) async fn read_body(response: &mut HttpResponse) -> Result<(), ().is_none() + || std::env::var(LOG_SENSITIVE_BODIES) + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or_default() + { + trace!(response = ?response, "read HTTP response body"); + } else { + trace!( + response = "** REDACTED **. To print, set LOG_SENSITIVE_BODIES=true", + "read HTTP response body" + ) + } +} From 7bf88376aeb498aa8f9bcc4d88ea4a6e1b3f2667 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 12 Sep 2023 14:04:23 -0400 Subject: [PATCH 118/331] Retry additional classes of H2 errors (#2971) Draft pull request pending merge of #2970 ## Motivation and Context - https://github.com/awslabs/aws-sdk-rust/issues/738 - https://github.com/awslabs/aws-sdk-rust/issues/858 ## Description This PR adds two additional classes of retries tested: 1. GO_AWAY: https://github.com/awslabs/aws-sdk-rust/issues/738 2. REFUSED_STREAM: https://github.com/awslabs/aws-sdk-rust/issues/858 I tested 1 by using the example helpfully provided. The fix for 2 is untested and difficult to reproduce but since my fix for 1 worked, I'm confident that we're detecting the correct error class here. ## Testing I used the example provided by the customer and validated the H2 GO_AWAY fix. ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-client/Cargo.toml | 3 +- .../aws-smithy-client/src/hyper_ext.rs | 31 ++++++++++++------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index c691e851ef9..8e8c5a39c75 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -14,7 +14,7 @@ wiremock = ["test-util", "dep:hyper", "hyper?/server", "hyper?/h2", "rustls", "t native-tls = [] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI rustls = ["dep:hyper-rustls", "dep:lazy_static", "dep:rustls", "client-hyper", "rt-tokio"] -client-hyper = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp"] +client-hyper = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp", "dep:h2"] hyper-webpki-doctest-only = ["dep:hyper-rustls", "hyper-rustls?/webpki-roots"] [dependencies] @@ -28,6 +28,7 @@ fastrand = "2.0.0" http = "0.2.3" http-body = "0.4.4" hyper = { version = "0.14.26", default-features = false, optional = true } +h2 = { version = "0.3", default-features = false, optional = true } # cargo does not support optional test dependencies, so to completely disable rustls # we need to add the webpki-roots feature here. # https://github.com/rust-lang/cargo/issues/1596 diff --git a/rust-runtime/aws-smithy-client/src/hyper_ext.rs b/rust-runtime/aws-smithy-client/src/hyper_ext.rs index be1e5679d2a..c5906fdb341 100644 --- a/rust-runtime/aws-smithy-client/src/hyper_ext.rs +++ b/rust-runtime/aws-smithy-client/src/hyper_ext.rs @@ -92,6 +92,7 @@ use hyper::client::connect::{ capture_connection, CaptureConnection, Connected, Connection, HttpInfo, }; +use h2::Reason; use std::error::Error; use std::fmt::Debug; @@ -196,20 +197,28 @@ fn downcast_error(err: BoxError) -> ConnectorError { /// Convert a [`hyper::Error`] into a [`ConnectorError`] fn to_connector_error(err: hyper::Error) -> ConnectorError { if err.is_timeout() || find_source::(&err).is_some() { - ConnectorError::timeout(err.into()) - } else if err.is_user() { - ConnectorError::user(err.into()) - } else if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() - { - ConnectorError::io(err.into()) + return ConnectorError::timeout(err.into()); + } + if err.is_user() { + return ConnectorError::user(err.into()); + } + if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() { + return ConnectorError::io(err.into()); } // We sometimes receive this from S3: hyper::Error(IncompleteMessage) - else if err.is_incomplete_message() { - ConnectorError::other(err.into(), Some(ErrorKind::TransientError)) - } else { - tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); - ConnectorError::other(err.into(), None) + if err.is_incomplete_message() { + return ConnectorError::other(err.into(), Some(ErrorKind::TransientError)); + } + if let Some(h2_err) = find_source::(&err) { + if h2_err.is_go_away() + || (h2_err.is_reset() && h2_err.reason() == Some(Reason::REFUSED_STREAM)) + { + return ConnectorError::io(err.into()); + } } + + tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); + ConnectorError::other(err.into(), None) } fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> { From cb79a68e3c38d1e62d3980d5e7baedc1144bacc7 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 12 Sep 2023 12:11:54 -0700 Subject: [PATCH 119/331] Add utility for making unmodeled requests with the orchestrator (#2975) This PR adds a utility for making unmodeled requests with the orchestrator, which is a prerequisite for getting aws-config completely off of the old generic middleware client. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/client/orchestrator.rs | 14 + .../src/client/runtime_plugin.rs | 15 +- .../connectors/test_util/capture_request.rs | 29 +- .../src/client/orchestrator.rs | 3 + .../src/client/orchestrator/operation.rs | 449 ++++++++++++++++++ 5 files changed, 503 insertions(+), 7 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index c4fee9bd458..8de224cc80b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -228,6 +228,20 @@ impl OrchestratorError { } } } + + /// Maps the error type in `ErrorKind::Operation` + #[doc(hidden)] + pub fn map_operation_error(self, map: impl FnOnce(E) -> E2) -> OrchestratorError { + let kind = match self.kind { + ErrorKind::Connector { source } => ErrorKind::Connector { source }, + ErrorKind::Operation { err } => ErrorKind::Operation { err: map(err) }, + ErrorKind::Interceptor { source } => ErrorKind::Interceptor { source }, + ErrorKind::Response { source } => ErrorKind::Response { source }, + ErrorKind::Timeout { source } => ErrorKind::Timeout { source }, + ErrorKind::Other { source } => ErrorKind::Other { source }, + }; + OrchestratorError { kind } + } } fn convert_dispatch_error( diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 7d6704c3225..9fec5519a73 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -27,6 +27,8 @@ use std::borrow::Cow; use std::fmt::Debug; use std::sync::Arc; +const DEFAULT_ORDER: Order = Order::Overrides; + /// Runtime plugin ordering. /// /// There are two runtime plugin "levels" that run in the following order: @@ -70,7 +72,7 @@ pub trait RuntimePlugin: Debug + Send + Sync { /// service runtime plugins will run before [`Overrides`](Order::Overrides) /// service runtime plugins. fn order(&self) -> Order { - Order::Overrides + DEFAULT_ORDER } /// Optionally returns additional config that should be added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). @@ -139,6 +141,7 @@ impl RuntimePlugin for SharedRuntimePlugin { pub struct StaticRuntimePlugin { config: Option, runtime_components: Option, + order: Option, } impl StaticRuntimePlugin { @@ -158,9 +161,19 @@ impl StaticRuntimePlugin { self.runtime_components = Some(runtime_components); self } + + /// Changes the order of this runtime plugin. + pub fn with_order(mut self, order: Order) -> Self { + self.order = Some(order); + self + } } impl RuntimePlugin for StaticRuntimePlugin { + fn order(&self) -> Order { + self.order.unwrap_or(DEFAULT_ORDER) + } + fn config(&self) -> Option { self.config.clone() } diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs index c51062b13e2..7721af15dee 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs @@ -4,19 +4,36 @@ */ use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use std::fmt::Debug; use std::sync::{Arc, Mutex}; use tokio::sync::oneshot; +#[derive(Debug)] +struct Inner { + response: Option>, + sender: Option>, +} + /// Test Connection to capture a single request #[derive(Debug, Clone)] pub struct CaptureRequestHandler(Arc>); -#[derive(Debug)] -struct Inner { - _response: Option>, - _sender: Option>, +impl HttpConnector for CaptureRequestHandler { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let mut inner = self.0.lock().unwrap(); + inner + .sender + .take() + .expect("already sent") + .send(request) + .expect("channel not ready"); + HttpConnectorFuture::ready(Ok(inner + .response + .take() + .expect("could not handle second request"))) + } } /// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) @@ -71,13 +88,13 @@ pub fn capture_request( let (tx, rx) = oneshot::channel(); ( CaptureRequestHandler(Arc::new(Mutex::new(Inner { - _response: Some(response.unwrap_or_else(|| { + response: Some(response.unwrap_or_else(|| { http::Response::builder() .status(200) .body(SdkBody::empty()) .expect("unreachable") })), - _sender: Some(tx), + sender: Some(tx), }))), CaptureRequestReceiver { receiver: rx }, ) diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 9e7ceeb1995..85fdd345647 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -38,6 +38,9 @@ mod auth; pub mod endpoints; /// Defines types that work with HTTP types mod http; +/// Utility for making one-off unmodeled requests with the orchestrator. +#[doc(hidden)] +pub mod operation; macro_rules! halt { ([$ctx:ident] => $err:expr) => {{ diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs new file mode 100644 index 00000000000..eb619328704 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -0,0 +1,449 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID}; +use crate::client::identity::no_auth::NoAuthIdentityResolver; +use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; +use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_http::result::SdkError; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; +use aws_smithy_runtime_api::client::auth::{ + AuthSchemeOptionResolverParams, SharedAuthScheme, SharedAuthSchemeOptionResolver, +}; +use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; +use aws_smithy_runtime_api::client::endpoint::{EndpointResolverParams, SharedEndpointResolver}; +use aws_smithy_runtime_api::client::identity::SharedIdentityResolver; +use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output}; +use aws_smithy_runtime_api::client::interceptors::SharedInterceptor; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError}; +use aws_smithy_runtime_api::client::retries::{RetryClassifiers, SharedRetryStrategy}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{ + RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin, +}; +use aws_smithy_runtime_api::client::ser_de::{ + RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, +}; +use aws_smithy_types::config_bag::{ConfigBag, Layer}; +use aws_smithy_types::retry::RetryConfig; +use http::Uri; +use std::borrow::Cow; +use std::fmt; +use std::marker::PhantomData; + +struct FnSerializer { + f: F, + _phantom: PhantomData, +} +impl FnSerializer { + fn new(f: F) -> Self { + Self { + f, + _phantom: Default::default(), + } + } +} +impl RequestSerializer for FnSerializer +where + F: Fn(I) -> Result + Send + Sync, + I: fmt::Debug + Send + Sync + 'static, +{ + fn serialize_input(&self, input: Input, _cfg: &mut ConfigBag) -> Result { + let input: I = input.downcast().expect("correct type"); + (self.f)(input) + } +} +impl fmt::Debug for FnSerializer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "FnSerializer") + } +} + +struct FnDeserializer { + f: F, + _phantom: PhantomData<(O, E)>, +} +impl FnDeserializer { + fn new(deserializer: F) -> Self { + Self { + f: deserializer, + _phantom: Default::default(), + } + } +} +impl ResponseDeserializer for FnDeserializer +where + F: Fn(&HttpResponse) -> Result> + Send + Sync, + O: fmt::Debug + Send + Sync + 'static, + E: std::error::Error + fmt::Debug + Send + Sync + 'static, +{ + fn deserialize_nonstreaming( + &self, + response: &HttpResponse, + ) -> Result> { + (self.f)(response) + .map(|output| Output::erase(output)) + .map_err(|err| err.map_operation_error(Error::erase)) + } +} +impl fmt::Debug for FnDeserializer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "FnDeserializer") + } +} + +/// Orchestrates execution of a HTTP request without any modeled input or output. +#[doc(hidden)] +#[derive(Clone, Debug)] +pub struct Operation { + service_name: Cow<'static, str>, + operation_name: Cow<'static, str>, + runtime_plugins: RuntimePlugins, + _phantom: PhantomData<(I, O, E)>, +} + +impl Operation<(), (), ()> { + pub fn builder() -> OperationBuilder { + OperationBuilder::new() + } +} + +impl Operation +where + I: fmt::Debug + Send + Sync + 'static, + O: fmt::Debug + Send + Sync + 'static, + E: std::error::Error + fmt::Debug + Send + Sync + 'static, +{ + pub async fn invoke(&self, input: I) -> Result> { + let input = Input::erase(input); + + let output = super::invoke( + &self.service_name, + &self.operation_name, + input, + &self.runtime_plugins, + ) + .await + .map_err(|err| err.map_service_error(|e| e.downcast().expect("correct type")))?; + + Ok(output.downcast().expect("correct type")) + } +} + +#[doc(hidden)] +#[derive(Debug)] +pub struct OperationBuilder { + service_name: Option>, + operation_name: Option>, + config: Layer, + runtime_components: RuntimeComponentsBuilder, + runtime_plugins: Vec, + _phantom: PhantomData<(I, O, E)>, +} + +impl Default for OperationBuilder<(), (), ()> { + fn default() -> Self { + Self::new() + } +} + +impl OperationBuilder<(), (), ()> { + pub fn new() -> Self { + Self { + service_name: None, + operation_name: None, + config: Layer::new("operation"), + runtime_components: RuntimeComponentsBuilder::new("operation"), + runtime_plugins: Vec::new(), + _phantom: Default::default(), + } + } +} + +impl OperationBuilder { + pub fn service_name(mut self, service_name: impl Into>) -> Self { + self.service_name = Some(service_name.into()); + self + } + + pub fn operation_name(mut self, operation_name: impl Into>) -> Self { + self.operation_name = Some(operation_name.into()); + self + } + + pub fn http_connector(mut self, connector: SharedHttpConnector) -> Self { + self.runtime_components.set_http_connector(Some(connector)); + self + } + + pub fn endpoint_url(mut self, url: &str) -> Self { + self.config.store_put(EndpointResolverParams::new(())); + self.runtime_components + .set_endpoint_resolver(Some(SharedEndpointResolver::new( + StaticUriEndpointResolver::uri(Uri::try_from(url).expect("valid URI")), + ))); + self + } + + pub fn no_retry(mut self) -> Self { + self.runtime_components + .set_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))); + self + } + + pub fn retry_classifiers(mut self, retry_classifiers: RetryClassifiers) -> Self { + self.runtime_components + .set_retry_classifiers(Some(retry_classifiers)); + self + } + + pub fn standard_retry(mut self, retry_config: &RetryConfig) -> Self { + self.runtime_components + .set_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new( + retry_config, + )))); + self + } + + pub fn no_auth(mut self) -> Self { + self.config + .store_put(AuthSchemeOptionResolverParams::new(())); + self.runtime_components + .set_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), + ))); + self.runtime_components + .push_auth_scheme(SharedAuthScheme::new(NoAuthScheme::default())); + self.runtime_components.push_identity_resolver( + NO_AUTH_SCHEME_ID, + SharedIdentityResolver::new(NoAuthIdentityResolver::new()), + ); + self + } + + pub fn sleep_impl(mut self, async_sleep: SharedAsyncSleep) -> Self { + self.runtime_components.set_sleep_impl(Some(async_sleep)); + self + } + + pub fn time_source(mut self, time_source: SharedTimeSource) -> Self { + self.runtime_components.set_time_source(Some(time_source)); + self + } + + pub fn interceptor(mut self, interceptor: SharedInterceptor) -> Self { + self.runtime_components.push_interceptor(interceptor); + self + } + + pub fn runtime_plugin(mut self, runtime_plugin: SharedRuntimePlugin) -> Self { + self.runtime_plugins.push(runtime_plugin); + self + } + + pub fn serializer( + mut self, + serializer: impl Fn(I2) -> Result + Send + Sync + 'static, + ) -> OperationBuilder + where + I2: fmt::Debug + Send + Sync + 'static, + { + self.config + .store_put(SharedRequestSerializer::new(FnSerializer::new(serializer))); + OperationBuilder { + service_name: self.service_name, + operation_name: self.operation_name, + config: self.config, + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, + _phantom: Default::default(), + } + } + + pub fn deserializer( + mut self, + deserializer: impl Fn(&HttpResponse) -> Result> + + Send + + Sync + + 'static, + ) -> OperationBuilder + where + O2: fmt::Debug + Send + Sync + 'static, + E2: std::error::Error + fmt::Debug + Send + Sync + 'static, + { + self.config + .store_put(SharedResponseDeserializer::new(FnDeserializer::new( + deserializer, + ))); + OperationBuilder { + service_name: self.service_name, + operation_name: self.operation_name, + config: self.config, + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, + _phantom: Default::default(), + } + } + + pub fn build(self) -> Operation { + let service_name = self.service_name.expect("service_name required"); + let operation_name = self.operation_name.expect("operation_name required"); + assert!( + self.runtime_components.http_connector().is_some(), + "a http_connector is required" + ); + assert!( + self.runtime_components.endpoint_resolver().is_some(), + "a endpoint_resolver is required" + ); + assert!( + self.runtime_components.retry_strategy().is_some(), + "a retry_strategy is required" + ); + assert!( + self.config.load::().is_some(), + "a serializer is required" + ); + assert!( + self.config.load::().is_some(), + "a deserializer is required" + ); + let mut runtime_plugins = RuntimePlugins::new().with_client_plugin( + StaticRuntimePlugin::new() + .with_config(self.config.freeze()) + .with_runtime_components(self.runtime_components), + ); + for runtime_plugin in self.runtime_plugins { + runtime_plugins = runtime_plugins.with_client_plugin(runtime_plugin); + } + + Operation { + service_name, + operation_name, + runtime_plugins, + _phantom: Default::default(), + } + } +} + +#[cfg(all(test, feature = "test-util"))] +mod tests { + use super::*; + use crate::client::connectors::test_util::{capture_request, ConnectionEvent, EventConnector}; + use crate::client::retries::classifier::HttpStatusCodeClassifier; + use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; + use aws_smithy_http::body::SdkBody; + use aws_smithy_http::result::ConnectorError; + use std::convert::Infallible; + + #[tokio::test] + async fn operation() { + let (connector, request_rx) = capture_request(Some( + http::Response::builder() + .status(418) + .body(SdkBody::from(&b"I'm a teapot!"[..])) + .unwrap(), + )); + let operation = Operation::builder() + .service_name("test") + .operation_name("test") + .http_connector(SharedHttpConnector::new(connector)) + .endpoint_url("http://localhost:1234") + .no_auth() + .no_retry() + .serializer(|input: String| { + Ok(http::Request::builder() + .body(SdkBody::from(input.as_bytes())) + .unwrap()) + }) + .deserializer::<_, Infallible>(|response| { + assert_eq!(418, response.status()); + Ok(std::str::from_utf8(response.body().bytes().unwrap()) + .unwrap() + .to_string()) + }) + .build(); + + let output = operation + .invoke("what are you?".to_string()) + .await + .expect("success"); + assert_eq!("I'm a teapot!", output); + + let request = request_rx.expect_request(); + assert_eq!("http://localhost:1234", request.uri()); + assert_eq!(b"what are you?", request.body().bytes().unwrap()); + } + + #[tokio::test] + async fn operation_retries() { + let connector = EventConnector::new( + vec![ + ConnectionEvent::new( + http::Request::builder() + .uri("http://localhost:1234/") + .body(SdkBody::from(&b"what are you?"[..])) + .unwrap(), + http::Response::builder() + .status(503) + .body(SdkBody::from(&b""[..])) + .unwrap(), + ), + ConnectionEvent::new( + http::Request::builder() + .uri("http://localhost:1234/") + .body(SdkBody::from(&b"what are you?"[..])) + .unwrap(), + http::Response::builder() + .status(418) + .body(SdkBody::from(&b"I'm a teapot!"[..])) + .unwrap(), + ), + ], + SharedAsyncSleep::new(TokioSleep::new()), + ); + let operation = Operation::builder() + .service_name("test") + .operation_name("test") + .http_connector(SharedHttpConnector::new(connector.clone())) + .endpoint_url("http://localhost:1234") + .no_auth() + .retry_classifiers( + RetryClassifiers::new().with_classifier(HttpStatusCodeClassifier::default()), + ) + .standard_retry(&RetryConfig::standard()) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .serializer(|input: String| { + Ok(http::Request::builder() + .body(SdkBody::from(input.as_bytes())) + .unwrap()) + }) + .deserializer::<_, Infallible>(|response| { + if response.status() == 503 { + Err(OrchestratorError::connector(ConnectorError::io( + "test".into(), + ))) + } else { + assert_eq!(418, response.status()); + Ok(std::str::from_utf8(response.body().bytes().unwrap()) + .unwrap() + .to_string()) + } + }) + .build(); + + let output = operation + .invoke("what are you?".to_string()) + .await + .expect("success"); + assert_eq!("I'm a teapot!", output); + + connector.assert_requests_match(&[]); + } +} From cf8c834f953df06b51e5e0dd7a54105afd0dd9ae Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Thu, 14 Sep 2023 12:34:55 -0700 Subject: [PATCH 120/331] Upgrade to Gradle 8.3 (#2984) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++- gradlew | 31 +++++++++++++++++------ gradlew.bat | 15 ++++++----- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44391 zcmZ6yLx3hgvn<-SZQC}cZQHi({-$l)wr$(CHEo;o=A82`{=2DMR4r-|nHiN46~6#_ zeh&(+C<6+HmXMF0fP)H*mcZcjZ^3=oh$W)d?aE5H|b1^-8%?(_I@L}XSOLppo7krfU)U>F)Y_Ie$H93eGnIXF@G zDvF-uJbQ^+-qK12GskrS*mY5evp|HS9e8sQ*v_iJ2eI=tH~GcKqp{j)-5$_)e7^hl z`_*?2QPAtw4~Qe`8AiYS(0RL9cqHoh!MLMabU;Q;Rnie$A5gk~0%QMjgzn$145D9h zxZ)W@*!Fg>4PK|BM2UQP=k4_df!=n=0p3=nc^tS`ekkYJWcrEG(XGbdpyC9%%aG>r zb}uiuTXHDhtrODkgVwDv@Tpoo@TtbO4+iXE^ zA<2nfAKITD^h?_=T=RJKx-Iw8VqUQ8zX zt3h_@CLFoVShYhV&=#+Rdfi+n|;%QSAS*LTn1;A)Gc1XYEXjL|KNtANUf!f?eVvm3* zW0vM6Mtq2uSW5wW&SwHwYM1n8(|w1CX*?lXEGR!5x|GTwhhmu-P|Z)6()>g0LWj-y zOdOD+Z_1Cq;ex$8%Ni7V$pOA+hH@q%GIC=sI=CB4EgLqNGhLl>K%(jNvux%ziK&ju z01$c{(}JiaZKO_TyGjl6gfUc^*jmd{QbKNAp!Mbn$#)qfv5u%?>x8#AdfHtq~fkDH9_H?~#Hr-Sw(ZkE{yy z$6IzpTeIPcV#SF)g3Dpj!M1)A@c;D}6W{?%ajnY(FCw(8jcI3+3C9^*ug>;`B&dAX z9!hvbIm}J2=ud;sY8ycRS0cyejoQET;Pfpd(7^f)-G7EIQ-0Q-pM8+X`VHQ{YTpCL zKTgn+E8^6eD~1`~iBDmGko^l9uzH92m7+JKW*A+mSHACn^Aih@g#1x4tkAe02fQQ2 zVRpJ)-2JwXYc5e152QAgqWGIQg$fcwFz&NXt-`^%=rt{{)(JS00;U(Nu*{R`uVh)6jE5esH(fLUw0p4Pq2)TEz8U&xPOH>O`wsa6p!q8LP3Crb*U0|Y8)6)2mt z;+`}|^Q~FF$0qHt5pa$nP$*DnW%Q^lS;@6qF_1P4PP6nZyExAE7jmw>nhzO8MxRx1 z*l^`ACBE2Jp1i5c%TZFCZYG9mSVw1rpUnCh)~0_yu^qPw4quQ@gdKn{#Co(3*9EClTgh42^%qU=fA+f8$4 z&smgY7+WxRDObb(rs0NYd_D-L)J)dD;=ZI?z#%4n(092wFZ)XVTqE0P2 zn|K%)tDd9f&#!CO%StA0k~8cZ#M-?yGq#$LN~LS>cJjwX=TFqMnxYrl85r5rBj2_L zU7%Yj=SDjc7HQd+6wCg0l`dIk6$M3X8g)7puBc3wVJXv^=h;z@ZZNaU=b{X`#rY0& zU~&rlNVm)9CGI7b0eDO}Das^oYO}hayFkesiyZq!*H!J7u-U}YAN0G)_O!l9Q@JS^ zTVp*;-wK0BLm%Urb|_FH{C|As@xXdGjB&r8c~Q)im~ znV1Sxu~jXxU3WBBDv(ma_(PiHmX9V~V#oSP;KrgB7-?Z71(+){;DRmtQ&=|YIwsHf zR{coE$-OoMpQJ!Qllx5?tnqqH;~6I|`)KN&tWkTnA{SN<^S~(i8&T*=f)NbCkrPpE z+aRTFt^IatYt4~xW@~M5&Ov~@oq(h`q%W}VWacQ{qbH2+4j@c_$4o_U)H!#K0DjdVa z{vuqfo)_gG35o@tUxHWdc_i)-3{!?{cA6vs0Xw~q?Y{Zd+&lrTPFEd$ULe=6`6Bze zWPqyGT_@KZ7p^s;-`DNYQVSvS-ZB@hu|}X%HK8FGh6^iA$EmDJgR&`8>3DiiTAZlD z7rWDUEAcnjo)jL>#ofSjg)ckJ7Z4O+keEpe{C)_3*9O+g3_nrJRUJ*rB?=VP1WKA9 z5VY5DAlx^ND?!iWjijWCeS=DcBFFkKE4W%a}cMr)Guj06EjOUl~A zPBPiUOxoBZYohbf1^c%X0Z0M<7YG9k{wn|i#UTEjLpZ=r+6`Yo_&>aMID*(DsV71S zfVYl8MTLGFj(!gAEd)ka{@Xc0c!31^M`uzSbCO}henjJr+811wt(S%mW+P+c@$ogS4hY4QrT~0_0>>Cd8#x6@VlW7J`vB{>otA9~g-e|4 z#wl9*Zod}{8j*{@IhvI%y>3~UXmmaYuo$DuW-)H#MV>iRwIJo^qO!WGTv0ye)L6Dcd|(<)Lna<>S4&PMdZJsGiprGzc%0c04`Jkdf*9+GAGPIm$dSZ(e7oQOpK?Ddu3U=T9&3*q9n+E-SL)JRvPLpWy}0;Z&X!lil79 z!}sCbX{Jy-DJ+v_O6ljbB@QO3--!G8koru`MZj#EErr1~hSSC}@=QSy+Kz<+7oa`M zEQ#G?X_`WY;RB{gZ4C_=%FQOQ7BQ$^?Nm5Qm%NK{mchTtOu6uD2)k_yVY zO^P+vQmQ)ut-8Yvl75$xmJV^3>=uf#Cvs)0hdEUhw=0n^L+}1^$G1}bB@nND3>3~d zs;&!&Jt_X*)2FD{k?L-a5jWr;)Qk3^FK%o;A_sAfA%h8e%ROa1u=s4PQ1~(hxidpU z82gkNd9J2$uVAAI2muuQg54y%c@h%{fx%p9+Gea4udb23$ad+omW^kPIa%jUB z6g9eNj$pvsB-sRs9D(1$zl#PanS5kSmx|H3wj*=##rKHv*L5?rX#MviNhSBEwL_}k zMrdSjhQD95u)f}*c~=nKv{sbeeB7T-(Z$--l$WuQv-R`w{Z08> zYnv_KWce44$qre}B^8dO@nSz39sUxJITj0go&IT|wsY_dlj?)%Or?~*8^EsWkZ09| z0oUElYR)2n*lh|q7La9RO1JCRJsq$6Pzg3iJv3?Vx09;y)+v)}LS8qx!;%)eC}Og> z=ZFKh!CU96BjA0>o2z)yh}5d<>{VoxWPKfn7lBPi99Hy6ed(J6&}`H2WB4vjC;(JH zW%eDVPKnKEKbMeN!yehd0iYRdXgXTOLJ1T^k$B9pKQf(JY3M&xhqNJ`!!+;3nj2Q$ zeT;sv6{_!J5@TuMro!5fJg;QuAvaf>amp`45t~8=G@m)lMtX0{ zd$BAZGnCQI6NJ>^HJZ*s3yyGxeCfU`JW0D>3x`(V37U(Ir_bAS0VD9!tg-|Zz}OVA z&M$CH5)SYmzDEivM$Omah@Ex9*@Q!5@-aVzI24;3fMbU%E(TD%>m(z>U25-hDJv}pKG^|e> zPq52BkL8O64JfXU2KZCX6AGVNs_SbXszjxb;A)Z&&TGTP&{2Yp63qrjhcyQklD>jY zScpBsqRqrGg0%H92(?LoQ=ylK5gBNpK1T@+`V}o6n3Hy13Y2ssRn`#K zEx+K)Q}OdHn_bqC5A@FV4V;<&`yTQ?n-flF!q+z_5Re-z5D;Hdeg#>Q`yno1MEz2E zOC9MamYyq?4&?{}Wpj~d8SD-mR4Ry(8agewn2W0hRXb_dw4fcKH96sgqHbQ|OsAOj zIzIXQ#DLc?OhB4i@3;+Tm~)gGz4fLzip0V7z%sagOy#(3hSl6x z%Tee8hw8OdSxl4Ksj{S^U6ZNJe(AQdKA{2sU2DzmN-MFcQ6;{jZ>*X3q7G0SLcVQ2 zKQV8`Dpqrmu;3yE%bM}lYP+d8!I2vDQcM%OjSg2#1>b73M&Pa>{V;ScdgU4 z*|Jcz!Hcx1+gKMBBx!G=nl_gaN3xaUSH2LH@nVD$FHvn)nqd-bsV(ilr5mm5b@iUj zQ|N3hy-QqhT343hq^K^mR*I9a(P!L;?wVyWy{T1^lwUSV?9IA9MUZ(M5X`sEH^@C- zzV+WZ;;MzD#vL_ItRMq|k*)1sV?Wm4+wsIgch(X$c8RBXJ5GIgC_}xN>6k=6JI07G zXG%+yX2XN=t`{@Vw`sZJn8Ay<#+>4ay-4IoPCj8;@1V!ZV5Ha0!#(dS_JIXV#y!0| z9jyZDy;64UZr#=_ti+2kV0U)Y5lWI&Ii{aeHJ1Ul~4@g>^wB>zhS zpDz2WWr_4re$51ROwD-xtcv9Mv)oi|=}DY4Gq-5Wts?G~@94vNb45EcGJpyWAEeS6 zeaF0g9bsuEIn4vGB^Cz70y1DK2-V6RK4%EowfACt!k(P_61c-yR-lof$X&KvT_q}0 z3ONfo#_FcnDdD}1{_}H3QS->SuXpp8@dAaiArk6Yo^;u{K~WOTLHqpxwFM8(Vetmz z`kRfm;VtfNH&t*@*H(P6<;JG+4mLK8wLb!3YSw}ch2IL5UR+El15%@X?R*kJa| z=mr=hN)Bjz!zrv+RA8fg1n&1EB*JA-8KahW zp0O(*A-@Xnj~@tORAFnsBNgYV!a+B3$Fh?#%g9+xLNC5@I^&^8?At<#?)%a%gPcpV zxrFh$kMHC&O=IAXF>9RkGnZk!Wgn#WzNRu5}!)YYum@)e-$NV3Ij_M=J4B zM)7mTaIy|N4X#iGDpb%9ISXuR2VGFGxKB79I%UHG5KsIC`OiY}r}&q&Oj1>{7NChx zuUw}Bys{9=7=4ojwi`=Dc$tDiE;2LuPQWgVr~QhfN$1euUhwV^mO=n4?^|xv)51d~ zNX+I?vB7Q3=Ao>-1 zI_3g7Xa(*w(5RLk^xoQa6a6CI1K>BAylE8oDWNOnH=C&br7jLfD@PEajub(Z*uaOH zqd8$X52p~Od(Wi`XHN?iZ2iF(35MQn8D_l?k9PYxc=^6adPR-+(RqnmOHx3iLWK(_ z&&a)ib%}e8>Oab#2MNk3#zDclg0T`jq!~I8yUGfTWpJC=*vltiZm6nq1{m&sz4?vE zx{%h{bCVmcznwm9{)zBj~ z@F|*d8%(-_%2<-Bo@?1w5~X|WG&6$1hq-l!71^iKkvNZICH} zmF^fGxAuUnx}}-LWTi_iIZ2*;yEsRPwY@!LYq%*{{t2IfR-o+1L%;Dy;cT{8vwWp* zaJP65-1!uMtR%UGE`&g5L8d^BlL2~V4LM0|$X6BPqgmjCS_S~ImZE4x6C9j{3C-xm z#x9yXE>}McL8^{@gP$0XmBGcz39Li7yegrSBA`0|fC8gk5twK={Gnad+*0NKKJvG} zk;B)))ob%rdJ|F&wCG`LpTZxa#s4QC95^y5A zF(Q&328PIk*p=b-YtRrZG?s(TDqI}d6>@&UH zK%A5y^&a*sv5hdH0Y2_w)C8GtHW?KCY^2W9Q+Tk>>yxwl+Y~%^5Expa>5LV{pZ355 zB$E9KCw1d;GgK;;UnaSR8|~wY1t7O`BWoR7#0x^tJVjuMUEd<~d2lPYgxDane; zJhXhfYAex}c05^!3H6BqX5SH7&M2~teoxo%JKTaKfmD*jEVinnGx$_;)1x2_8f0d~ zZ|1;4L!#Lt>-39jrIkvqOh;c!^vkrn^Y{hV z5d-VcRHE->nk)vT%*&Uk;57qi_!pA#_fR2ren|eDt!89(1Z>fPAO+ZyXFg;9aky^nN zAS5tFv&azE7zAF!gE9v!>t*DbsFF7Dx|Hm?>W98!b%n>xdTjK%yz>0m zuC$6et6Rt8dg17JBkvxh>$Na2%~8@&B&^~>Wa#E6I-RGI`=Z`11`C?M;HK4<-5-5v z1_goE6T6P;Y*Y{C2N0MZNE$B1MN{8NwYd{|q{#68E-Zmi8|Vdoe)Y&4pc&_eA6r=z z%3Dt1N@5>}}uqLnLq9sRti z`!K~C&T|e(kBNQ(#K>e)C-**rcWY-k{;?oVcr`gnQt^^`xtyxf>zO1)&4Mgwfjuqu zECs{0O=${19uR=PWDmUNLhItu#jgVZ;atTOEfbC!a~soI>~!YVJIZ0TlL2>=7x+q+ zEquiZ$eJyKgaIq}?8;iaty^_Fr$5F*Y?2EsX7m(RFIgD(6J0em&g>0#HpXRU>Cn%i z%&rAiCW5y{5R@7(K9_sXhddw3r$pKC2opBHZLV3q1Gon*Imzd~=;wf&pCC&PuZC48 z$cnA%)7n~ff8;MRrcr%U(TJdXNNKA%6+M|>r0mLGFJ@Jw2pi(p$kY=U;Z%U4mgG=D zo=d1=&&U)Vl1LY(DQ*Ig3z(C|a7U41Ibww(Ibw)WaukLi9&=;!=G&1_h++$5@q|ja zV!aN*0M^4*nq=~Y>e+*K!%d58(Fm>}yOI3pyODnM_v%-66>Y`Kf|Bf5yChu`9Yqh<<+LQyU7y4doDdr|Wu zr!aK>w77#R)?gqW`9sPhfd&0|{701YsuN^H^;>S__76~$x#jjt0lAtdb z(87_KL5-rxn-w9Ket!6kCzkLlVZSYuk?{qkmAKGvV4XnRCbp`DAf7YDEZ_?9UH#7~ z;MZj6&~4%9o)*$0`d2)G#Zmi)&J|pabWj5mey&)^5UY@cgvSw>|1iRI(Fi>Vp^=k< z$P!m-_WKL1f!sCN2-TE_N@iVc7(U7B2kV}{)YJoAw_Pys@K`#nzyQs?f-OdxQ8?h> z_ZuRAi@=D~y+Jm{-yySmYys52W2c8M0K^We0+(c#_AnCt$f@81^+~PSWkwbwF9eUH zG9dxFU!E)Iwh8suFq7m@{xO-firphKDfx+?T1f3X#mS2Z&dmi4R{m!s!|zfByvN-0 zH!fz03gQNe0xYeNC!|Na`M#!4J|{y}pY=hu$@~5aw{r_u14!bex@-$SG?^M?bdgM3&=^?Q&>_&8|(AH z-C0G)rU@6!Ks6JLhZp^&h&n>ZEYCJz7^r}`I-Plwy6s+mKZ0rSWNaxW$rpcn2>Uz4J`^YW0_4EFD$@yE0?oyJdjx<6zvA9sV%(d82FGr5H0&PqduL&-* z=~^o`{0L&`&c(og08nBx$sXrJ5p*vKrBb`T?IxFIRC_qCT|wcs!Xcy6s;2F9;l@yj zE|VUxH%vUvBGzFCJ=HZ;AAboMZ(tE#!=*N9A&FhfagkN(JHctk!>#4i+TJr;Qu1`i z^rxqRYA3-W^-{YKgXnfbTXV(umafxVnfjdPZ@pC_MbAEg7+^we_W@tOv7K#6mDvdp5uOJI9D3h?v};qUgY>^W9KxJEZ#_nkbw)1^OUb?1wA&uDQiupks*|oTZh%JF=)_7 zEY|wpVxXr^1Au<|=&^=jroBBBW?B5QKDeea2O^PH4_+*aIHv6U1?Z_A1EQV0msYz< zrjzZ4HnCToh4QRHlkq2K@z7m;Det<4q~cPc#L)0eq#U@Um-J?+?=l!$#024c%EGQ< z@o_v;0`fTsh;;wrM3Q!|Fd zkXH61cQZNhDfLJh9Fyi-fF&yENCidnEq=R#00Sykt78zcycCZVaw4NKAJ`r=sw@rD z3D#|}zx@>RMj(X_x49#?DE*svcp;v_w?kg-_68=|x(1;ISST<9eCA*Z(!+1MBB7y| zes|u)1W`NmR!-YNhwjAM!%TyP;@ga(%m6xLwrrN@^pC(4W{~G^nj@5REpSQ7pZ|vg z4!9%7RsO^CFhr738f8*{HAE8QF-FpC0W?v&(_uSVGKcOYd2%wv4Y{2(b&n%8x)^!^ z5x5wQL)LK8YXLo=zX$7Z+;X0o#$%1$JKAcTq->zSJrWw8rd0KqeVD1JFyAmvojf%BbzC@bMXa`6DgZU{A{|_gy&-x25V4r z>=bwS(P@`u+%llIMz$?%n3}OG`&2tY0nlNdK-m=tHKNk-9Wi+H4cdD4oj^_1GnnMJ zfO1hvgZ2QgAdl@iSce3=C!N^66~oNFUts&RQrYpIZu^F@A}=Ga{F6x@qq=rZT~SUN zP#n9IzO(>{Q{k~U)*R`M)zMUJC^vzgf^!MTsP4X#Z7_#kqivz_PdBPh)2ZAsPv;{z z_3tSU@Ghg~wtV@cu&xps0jQ{n?1D2HaLLWEnsZuqM(oT+!12AnsaqlFz6WD`6rcK< zGEM2K=v=Ni=+ZB=q%#H5c>E+qu#z9) z$&#E8Cs0F$Mc9BsSxwQQkxSXFqHhDSuV{rwhZzR*zMArz&@4>mH8G%5hmhWt(TZ4` zb0If*E09TMVXgsn$s<{H#WznkgbZ-im;^{= zRs8_XjSk`6BG!l(rOl?nEOEUO#)u7ad&>f?d+OHKi2>+HW=;5=AtF10bv`LCG{Qx3 zsx!2!m(a; zZqj$@drgukG+eT_cMo&PR~wXJZgd1h+?!A}YgL>)c(;!NE}1RW#+Z8|XZ-fahC4DZ zTV(9w+H9Man`=;vJUW&DC`R_qbDTXHK?0L-&aAph`8FTK2qaSvhQUhYdG=fers)K> zcQC!8EjQYOG#Wnrgb#@`Iqnt6o~cU=5D0??&o{6bqMx=X`BvqT>CYfObvP^ z>t4n$t%J;i<9s%D*#kTHtoDieuTZ)OoW4AV_ha~juj=SIHs4qXGoGgnnQ5mTt}ZdTO8og z^;Vr?%PKvo&3UpbjSF*Dll_S8m~U-0`vPK1pAOYdVFUtOuA3mg5D9x=hx|Rp;<%Y> zHDZcw1crI>m#mo4l6+q(j6dQFP}=|A*~u!n>Pg|bWXV_9yG0!sz>XkGWEuIgrqgK7sl+=)9R$UcAM3m@%WE~d= zOt4Kb%f${>7mL~KjE?KPK0yFz`bZO-w~-}TDVwPxiaB?P6+EX=W%@#XA(^OH_y*cd z#5y-RqAH(hxKrOiyw2_)KwihWW1CTJNbfbrAM8YZ+GhT=Wbmz)A+gX2VGG@|vi4b| zI&ZhA0*4Lvnv|SBr6+wyS+V3aUhFs3E_)d6$I)Rr?)~|7lYw?vECwC5CmQ$!U>G}@ zQ@MLgxB_*&sah_!O&9E0+ci-r4jqJ={y(My?D1Bb2e7=B++UY400-q9+7RP5ai29| z{m-Y+HZpwlI4tFYwO;l6^n>S+4}m-bv03qV7SezB*9!d-d%*JctT6`{>Sf^+IbRth zFI#AFvYXkuw^^0Zp))E6HPS9VJCjhCKmZlyTUZFAV`fZqn>GnBdZW8}#NVpW>5VPZ zTy}yjf{PBUGf^D@poqLHcVjpHz1QGutI_tHbVFnJ|A9NN!5n^TAv*TQ@~t1D4;^60 zqW3SRoYSG7szKec2ga{0x4=1H_Y!3i7wm)kc16dboJnlX#$wKaKF0;(S8e1Nk6hTW zz#}o2y(YC!ei?W%y~vl10;P-KQb{nUHr2!tIVQ9zGs0Q}098b=$XXZ13-j2K(x6J> zYBKo~<;vg@y~7vv<=f+tkWaI{W8*{4_nI7^6`n4SFr18$l@<3JcODnCIgt`@o>d8F zc-AcvqN3iCkQgpfgP@KAKkXddY)XDp#-rF3SD$^kCwEJ`9f545)8Gql@FvxcyB6U) z^C6)hE&Ngy+fD#Q)+Rs=H&bbknm{mLKG!mzq&7c7(H0V#BoROMN7H`x(+v^lEl}Wi zM*L5J$JV_*r2gYnp5XsKry>C8DWD3W@w0Ya4>pEON~kse)+{I)SN;V>O&tGkj9Zz$ z9DlZ@$YJKRLEiOmjvGL^=X)N-7;kC(w6bR!?cq)vDQ4q)wjIaqa@$eH`gyYT83&YF zUs*)h#N*mwIc}4_RA8*nfXGfaZr4~EDh5v;dK`Mac|Z}A$auw4j_v^1GsddisC{mB zYqofw8_5;PILKT>nytOF!}dtD_B4cq%g8yJf7$jv+p=#u#K(s<2+o}|RMlI1ppAtB ziE_MTpL58RGq~bS-Eg!`s+SntNt?-q7Oel;eomQ$(05O-d04U!{@3x9db9u^ z1RWZgiT6vf(Cxl_?2k+LC3GX1i~4&?j+%M*>AXWb*STJ)lBdqK2i#Q?o!HcK>oy`p zY^HdY`e=0cIILE0=j!nO%Fcij2zSdo%^gnTMo3}zY!;?aIDp89$1a@BU$1~#w5Snd ztR8v#(0`6#Fg=tp=d1&vC)=}9xo4grF>enZEQqs|%6(*;#Jl!Xdmg`pEU3si*8|s)eyD!e|a4ZU0XK@bD8!I{vDJ>tLcqI%z z88eHGVXUwf+#;)!PVj{`o&(K|`^o=;-56!Qpl`?BakKG-U%`ow$Ex%ag2N?oQXiZP zWS0IW8SMl8Pvm+|F~WlVLvA}55D?3ME0c9~r~o~OMME@yd1^FRm)|TqU&iAcShy=Y z*wGXya$cn$X8+Ss@Sw>2GVUdDB)bW!HyJ=74rB5r+7%fNr!;^IblfTk3d~_%>%tqqKSz zgXzcanz+rkuV}?jLbib$a7^p{-p8kkx*0=l?@T^AQ)u;XxAk=gc6zqQb&-WZ0V9Wu z4bNu47WYM7M^Lz9{nsY+%E*wOO)4Jv923UEzAB(6MGVe71W*I_WHvBQ3v_@X0YK0( z&f5J3KEmaNu=O{0O`IHW$Ws8a)c{UP$;U!XS*IYgt7TzxYfAn=c)Wzqd`>r~42;vl%2pPKHWN}2$VBTkw2>Xnq-Ib!mohk)I%3Wp zHcP?ki`cT|j6dYu(qy))T_5FdB}QcLj{k=JPo&&x4tMYTLyFBm{Xp=)krMTXAc?q< z8@dPA0G88!`wX(lq%jZV|1$a`z3||~pa22U&?GsIp(o`RASdy)zyNesQvPY)=M!^` zS*VoArpQ|1*PhS;>BCw%;7r5v{lo)WP?6uZwCZG}6J(+F!M`@BWeVgpvoMsYn&}3l z9HE)aGL&J=@>K?#&C)YiWTs?|7J-FR-*5a9={8_Ez6(5VyI!+h=J=;P=KQ>m)*m5( zWYfOAEQiW2?lZi<>Hrbmcr14ssP=d)_kg$U<2y`3Nl%*9K3s199Yg##O74ynnI+4nU23>O>vshvmHIH0vw_Xhls+Fpq zM#UaR7So1^6+kk*jOcn&(;0Y6(~5H=v4zhGUP}uOYT9^5rAMwtDh=pLrZVM}tQNzm z&j|>PNSb61HSMu*UA1ab6j+&F)?k(C1Aw zC{Cq*;Vy2J7M~d0MggZdhwR(;IUeA%} zG7ROYZ-7*LI9-hLvv5cebfvD5UF8Noq%!q`4OLSoIlt$@5}8#>t~7)C<7yo5lKul| z@IiX?SXUH8?P0qS(1W+hU*$tDlMn;(;Y}MMIa2tc#Wm`_k` zE*}g{Y$$dWmJtw{!tP=wRGJC(GmD1n?i{>61OPJx*kIv=nU(>1ca_0yS(i@lc7nM( zPK!_l2{?K?iO3y!FLj!MoLiS4c(g8L~#S`iuE+w6@a=2G#FkJWuO&$(ExBRWCJd{w8y@ZAoI${kn}M z3jq00{USqiB^)*Q?;141b>~!dE+ef0>~DK#}{p5LCyRS#$MMr)wVWP_Z(kh z7R>~>WPIcZj*SIVZ>}Qgj+gSCYQ15nzF~7>N)`Za_+^k~eWQRyI^wzdq0DWLY&viO`BIWbu zJoLD^#g;fn`P?Lb(O*&$*gWEy&}OVfY0F(KXqNpyXeH3vXwV^7;`l%t#yqguozQoa zTj!JqjqteCqC#1@(Ivi%KJXu8=76$Fl)2E@KjtUd3w{{daBkcJ1$GLol9J`ol|t}CfFNi5^c)7^9SttQx z)p+@LyRY~%1o4opt;+Z@5IpECtYp&P7(dW`O~=F?azHW!skgA&uFM3H??*MQc@p7* zi&uNUY{sSnjR1#F^sjj}DfgF))PLgKY{NIw-0$j@Ndx3K?9d+}jejJ$me1oLjqR?) z-6+Wi6ZIbQi3RKLY5`yKi4xw_nLHSDUaH`&HqN%rT%^7D)h(uNwynn!4_F>-T989W z(QD~@by#%o4bp!SHk4N4Dbc=@s`(cq=?l$eh=x0xO;9Jl2xy4@;GVrnv5uE`A z<@lBtPn`Fvh+A?e(ouO-VL!`>WvYv6^f19g3GIUO%gO7lLjai}u*B9UP9C;y4zZ)3 znE}r#fb>SPGc4!6xJYj6F}BxgJU`7n510)E)dI7x2^k*ZyiI_jj}6iEwP;Yxb0 zxe{+U!-00EmSD-3jmi)-t4MBBu?#g!spa)ojm=hFIfBwnij8tle{Mr{%JL zQR>Kdpnt?i4`6BTLSs0h_MbDJbd3H=zsuigOL=-$c!;{<*Ndu}b3wpN1Ne-|X0-#Qiu&k-dI5Cs%hjpR zYrv+e4J6MT z``4=H!7yC!7c55+okOE6KQYhm_4);s`I%HbnB?+opdjmLswTCV5)=pW*uhpc*&aA_ zP*{AM0$8{j(pegRTv_aZUSIU{=%NkVCw2=N?ilPV#5VVgSsWYy;6 zaU~g_R@l^1=CdZBC8)hXM+!vVkCIkQxhtu!K(?(rtt#+eWXWHnH==8M3A?wG?^X^a zLyX4-Uy>XYgN9j89&@BpeLL%*HD_nizchlo0~qEkAQWWS78iPH%2%l+=e(cIghw`# zf0B5R6MBA;dcB-;BVtw|g!Dpar4vwa#&>QYPDvV^@gc`vg9IV#GCR z1d!V+&~;>q;5V!u4=hZ1@W)>MGq?guZ7pDnLl z*G-(${bk!nYc3%84M|zCnbwo!h-x3Y55RbFaij%w7d?J&eS9PQcS>55tV zhLkKYoiVGje3UM|30eTZRiP#(m~m~zU|J-WhEnW-yhl1EG~XL}`TW|6(^HKW2Dt16 z;=ZFDU5M+8a88FN@{e!)`;(-v>BC&!iW`J0Ep5gax-7R7SJ17|?pynfMX^roP^llV zPYze-oc6x0ht(jG`_uso)5YWr8R~AL8f1*G*QP_TUtb4HdEGBn{L~@k>x?<7>gAiu z5KTUyjuO2Db|UaP-=T+PaPC9}3y?a{XbzpbyPt83_`@F}YmsCXXwD(Zta@`t2C+13tQMzS-M6kbv#vJjH;9&~C-8BE)~6V$ zYXI&OAr%ls6$pztvP>1S1SBX~rZhlB65^I%5p$zv6%!a~1%=xVmn_DX>qew+N4N7u zB6tPf&K0QmhteLi+orTR#e6|;9joXvhB*fLhGZRM*-t1zR~r9?hAYx1_yQ6nDPxh>0#4&~9#k38I)f(nGD3yLjd6ver)Y#f!v6{JH!~#0xGzS1q{7?V zT>}j*Fb*%q-q*{Wji4#D+tMBdUGptb6}o4+`X|(Ke~!<&P5DV7t7=_XZ~iKF60(B1 znIS+KscL})(V(-WxF1aKj0rNFN1Q-Ep;#I)Dmmg^v&Ptw1MY8qy&cj0+A|jlp7?_@ z<3xl8vrZph`8uhCyi4m{>HSL^mZxMrfg#(EiV<@XFu4nTxsYp*;KbqrI6xV(Ju?&v zxO@AHNv&PyjG~E`_6|;CrJM~;oP&+H*JCo^RbGuToZ2Ei`MLt`xGfm}tfrLw_7eQF zfU%RVuti_)3`ntZQAPejf$&m!M!~q}GOkQX4?!y;PF8H7qBdm?p(7^4icRJ-&=;PR zUXd~Es+cbud}g9}>)z`M^JX0)_tJ&;ZTrMIJ0od@!Kci&ggxG^Sqkk%DoSRou zrJDI^ZK}{srHH*8`Oeg$b9XfFgRH@pJB+KL(tD!gLuCZW(LukB?J_!1u7hu8XTFsa;4J#|NGyrI*G?=a=( zDX}}y^+2$j^m>nrf7xcjbiz1F3-jE5Vd9yx2w&^N`Og6r{U?q&!qS7a&FF;!UnWuhu=yO4w8n!KGGul+z--3IYZ zGXvhb!OZudK~p;a22k(>b__2Mab-YxqnWVvBFyp2lXmztfMjFl^iLlP{rhOu^~GdP z^#ovFp}ZFDa1XBuyYAT0oT=ARxy2U+)~;Nff4y&P*_|ZQHhfv2EM7I+)nDZA>OMC$^o;#Ky$Q&FlqokC zCwi^9zkzTA#j8FNy}8P!Mh0I-t}mfG5$8O{P`;Ngr4pp4=^WFz#%zX6mW0$EtJ%Zf zT!?c2Jsl>8hX@pXZaaN28qjBJlvHt?PtI=fnHCH-H>*iyXu6P{0r#2LJ=|M$QsJb* zRlV=T#06|**x^bE$@j;Uh4$vW+oY2;?+R*ToqyfaYW)EN`k;Kr=Kr!z6xU(y)m6s` zNU$>d(;n6iX+&R>^1Z~N_{A~Ms9hH@taDSAobNI< zvIl~@(^}~+-Ue)qtU#ih8Fuejbmxb>UIxYycCW_FQV0?v`uaeCg-xwk-`^ODVzUwsoX$_qIJH2{%Ok$D=R6e^$YM z>W#obeR}__r%Ay+huFFK|8N2tFU))e`>y~DT%`Y#q&8!8bG5Q%1p9BVA%Ok=^V-VZ z)y&!6=)b@FZ>tmG6p3udC;1)mDLG>Ozx}9a|$gKvNSWXF>_`xu{CmW zNm13&z*R$g4+S@e0x_xp4G=Wq-hr~~*xtf21x@M7HKo)XLM38)VUC&E?kuR&*#Ue{ zdwE1aZ<;_kBDGA~^F^F<+ca5;RSY79P0sk%%h~06%hTzl!N(Uzh;7rExN+?0{m6(a zjM|L!$sLeyvM|i@z137deAl#&=8QWhJ>AI*y5FgWKrQ@X(AOUMnNjix4D5G`!-F&(YmHhwEMo{K!yBBqN*E8ccqbDSu5Q7iwtvaG}6j{&uZ#VAJL z7+^LKDa#mPRSeR$;apDPRKfOOg$#)!(Jc;j#>{(853>QzkQ4?g-I(B={XyhfRtuix zsXer}-dRPQZVb6&kz6ugv{Dz1EHdach7hI`OE$*ES#&51wQ_{x8gJK5gKI3%nj*e) zs9%MI`db$Lh=PRM9O(QI)NK7HZ4NnX3-!;Nd=`0JI`^c=Br>kDR% z=7Tdkn8pEcI4%vE;3^1RboVb8Z~3LH$b3|VZ0&3_ko~%umt0C`VOlPlP=ImxzR@w@ z-3$dEO1<}2Tkl-y+GMD>FjY|vY^iFhz}vlNLL-Cj+5wl3?zVV{j=hP=hNSIlGANO94ppO_cqfQGU*%dMW;_d zQqPVmY|#`}fi+uERkjyPXL9mNQF}`XYp>w{EWayh5A_Lumfx{Ii5h|b8zyKt8#y|f zIg47kxH?-If8vmXy_z#%3v#gkgo#hU`7eCPQL+0ZD3Sb|8Fh8yFvp`vNJ{dX1Na9S zhjCDYGSku6vKOwLeDucl8a&$Up`WX+V96367Y9GN$)C&G`nJY<J8*Pa&hk;{6Yc@GQ_qJ(WkgzoGQ0`@oc9*-MUCJH}F zmDl@OR_(K`Jh3o7oUS5?Ez-9xsOS;J^qR>NYH86e2~=1nbaQDCOMar4*Ti1dg*965 zL)t>VI7bb)81Ey~00CPSwp`^{u8YGa)y#Zv+in1Jv|jYB-M)|~TYtv5Tx(wP!N}Vv zlPtnYVVmV@>P&45BZ8GCYROGLyWBs}hN7plg7>ATCWXkPDf6 z1d(N1n{(uXM|2)(SBLC2$f908fm@5apxksKyA01T!ZS6ZA?Ta>K1~P%Dg_gEi`F2T zz0zO0Qm3pf@QZj(uz#o!QPtRu%0ISCE>~MGebP_e^uPH3FDkL8ey*ZDiRr5(Afz)^ z^rLx(EMB`F-dI?TEFLy0p8+W=f?uxGd3e_Io8V9=yd>S@7XcWjGtqA%n0gZ%BiSx) z7hSiv%MXNKa*YLhS?p`}+yi)9PfgZG_zC3#Q!LgjA9VAVtn;8e!@MfNYlqj$Ip?p1 zRy~~KndifAMa?PaPFQj&`8nr80HMb*EHgw_EwsqpBCeJJOG~rNild~Iq=?4ZC_ax6 z6GysV$GlcKjXnzAXhcb(a@oE1v;s+lX2rKhB~z*n7-n;DMcqHw;C#*>k~6Gn>;Ew( zOGo2r(0q_WgTMJ&qpFcWG*6*AD>km&CrCAR5}j(cDdj%55*mN+Aoi_>0c@wVPt2XI z6B8OYgQvc;)WmfmAzmrw`|S=xoB+w)_}LXdP*)y1DjJEk3nBh7YNpX=TPF>>1lEzW zuEUzxF~-(*bFq8{=cvYUZ&8j z_L*(%!U=VV%S@I}k4lIxOOH9n;mQ~&y>tp)s^1;Jv6Q84v9ncr5H33v(KP5YbJk0p z?ou>6hUg0=YdBru{!gG8bEfozhWPRY?lYl_J_#8GBT4=%8t`AJ5u>i7fvSP_jv$rJ z1gB2|BOIuiPlhBpyQZG68bdXcpGw6sw}voE94&7?mjNx}@Xwxc+V84Hu&*0jTm4+8 zLmg1j(0Is@B7?sEW|Nb#>XX;i^LGC8VN~$r?H#L^`jw0{pg20ImCA@CTn2?FA?V9Q~| z&X;I+fJk-MQjJcl;SZT3wjYT%mJP}c+*qfPBW*=h^Q2wqlGWr)Ha4UITl2(@LMHc= zBU1_Xt8_*ESk384rF^2|*hJ-XqqWsu2gx1pDGu-yULs4I_glwW{xHHPRh!P4)~SyT zf4v}1OpSFe)|z`G(->-HFU5$dJ+ZyWz8qSQ{U)Nx#7f+MEXmS*FR}EN8Z*xNFLi$c z#V}kWrt=gXQYzSe7WNw7d5|^obF~$h@4VBze1>&w64Ti^Q)^OdLvp23#3Y2sc_bFX z@*v*p{AZ6gsPy zJL`By|0O!Gg=)}y~`UB=~V8P|GsNKqrZE##l@bXOhnYxEcB`t7uJ&{*tJ ztLZSMjVrW>M?%0Lz_3)AVmKp$x^z>eLyG|PN7NO#pHe@I4@p9gMO{e-c9AV|Bp5pW zMyNK3VN5ZKu@%uwS)r-u&_g38>=OHUX7A4E$5&N(K-GZD_2F-zOS*>EmMtWqR4-Cd z^~M|0Q0h4U)5^e#FW{>Tqoy=_+E=AL6+PMEgPYh?Y0YjeZCO zmfKNP1Wh{`^kc$w4{D%vt6#xGRyoqVs+=Ofk=(VwbPs?*Z0~<%UxfX)u=68`@QQTc z3f4Z~ehs9hQUZ#>7auU1Y=WV2J6%0`f3LEWs>54M(%3GM$T~x>!FQa%mAOUZ#Hq3y ze5!bMp46aId7)G3_X68p4DvW=OWFb&@%76co-C^yPXB4=HtVX;+becAoVZqsdyg?B zNWeQRFVok~2_5}TrQ0ok-qgZeN`krK@JN({R8hFY-d%I`u9Gb-Fkj%vP$&6yQqS{{ zt?cb%JdIYQVMI?R`&TR3uDjeoYbpKM}V3rF)isSV+jlId+z9ur^!0!+-$miUEr;QZM9 zV5IAYJ##X!`lY`X(LG=fGVsXRs9DJsYa zX=#bjPdr0Xz>VliPJE3qlAdJ>y+0@k>qWDN?tPn(CnY;GO(f_QxeKuAlW*F&?!xJl zChFJC>>qCtZE7Wg_q~hdiQdVzV_|ziM`o4wKTVU}&fZQi^k*a}PIJVTiH~z#BL&|b z`Gs%I>fM<&&l-rEGQVT;?8UwH2t~fg^Bc!)phPzLKz*T#aEBqFKnd0TjmjXIVE*GQ z)bR_eXOwcGqrEfH3o=2r3+xB@nbp^3h{Mfi1EMjZ^sbi#s`sX9@0HALu~&uVp4IZ4U>zK2r~VhuK{(&w1PL zU#>)$a<&sbN23- z)OU+b{1NxbG5+Zq?@o1EZT39gx%-XOkrw(EeVg1}{S00KFj}N{_VI>STsRM93nWj< z-?QkUhEp|2%gu#l2VPK$=8E)bx%zX2oLezvI z8eXPLvsRUpbE`i_-R?)Yc!iWYPIIEe^S!qHfNN!E|4agn087hc^uXK1TZxFfzrN+% zgtQpAVR*Ndd3ds3SkSZBh3Xsp*co52KbEd&G?K{Ebx_-)Vm2C}n=_!CuBPvNO98E_ z@?A6MZ~I}w-}6l9LomYZ+~lWJhc<+Uqr!>QQx3OL9eWmrl#WFYzj=XTY~Di8 z){?Xho~J+beJsvc79wA8j)wTba=0w=VK*VCibi_TWs$0&;q!1cMMis}7_jd)eDjS~ zd;O{{HPKTUscI;J8FMa14?Af;^NNedB?<=|h`r2EMtI+l?~vWYVDQ^arXLcEQg_H( zd(Wi$rDxGyARksLYNdh;l{^gZa)ioprd3O_2=Vj3DUTj*7s+1kcj>#SeDpY^FOXe{ zms;{EI1cMgr@q(3Y65Cp7oLs**(j6{q_Gtn6mGxVGgO2`xfx;j#2SFG?(BE?n1cadeueLk`)Q@4aQC_{X;}n*2L5|#1See zg+%KfM5>M~s)+`@6ia|H0wrUd?Pi?mCgpB5Cu1q+&e|HCY|0s|)Cl>=z6< z@@c-EcQ;P50Vma=iMO|*B_ciZ=2p6L(us>MiFqGT{7m``epuX&m}5C2u3x|&u;{8> zLf0*{9{tQqVzYTdPzZD<@2I4Q&c-`^HARxrqd?CsQo#NokC3c68jU z!Wk&mJhFXRB{R@FCy=FAk^@Nbmn_o&TB1MdM1U;7CTnHYcqhlpvz$_faP=dBtl; zp;Betj&XZ;xlA91zJlH|)OVW1Djy@H-!y25pM`2vq22!Ni8iBhvpKt4xc6k_Jej*+ zE~g2;!R^pVL&h4hNe^g&`FUzo92R;aUeX?eff4R?1~NyVwi*%vm0y%}qjwTB89nx4 zC|q@8@{#(AW8>iNb}|FOYiS(_Pg@K2Q9~Jk%}R<}I54qg+QYG2s#TVj-3Vzh?=~rq zfd)M#9LgPtPr#6Y3$BR$eTM>S-AN?_Da<ku;vfcBuqg@D87w?UC7Nfoc_tJ7csi#cY z(j`$3gPbIXl7cOQ;e3NMW0zCS(j@f_Au3aoFS&n{q0xxrFEeW=k>IbQ)TFLQ4*ZP# zxyfmSYk36BS~oI!VzFZ(@2nqgt+C9wyuM`irF+=qQr7`mk;f}j>gr~_*O0L;ow5Gp z=-j1DMJB2H6bD=f4f!SsCeV4utwRmb)7Z~ztUcO4&l2yr)a#|g%sf;MTWjDh9eo2k z;I7?4p#!TN`od3mitq@5?C3S4PB2oTXCJ5ELrpp;o9y6RO%sWel@~@TvJU<%vulwT zg-k}0{E`C{*g4h4iAOQW&?%p2xI#fcU07REvE_Rzw@axaPKMe@=-DO2Xn*WY@_<^} zsXF8~I)WYSZujvu3!h=*%aV2`FC z5568{6~^@P71qgU$jfJr=I6O=Zx~@Quu57a&y(ETR6^;jt!XHM@VG7U9ljL~q~#e2+!e0;%x|#OUa3ww z7fmdy%WNuJoW;-tRQwJj;neX+PgF~ z&ls>J)a*p(;J<-wN0BHcByHg1Qy#I=Ir0{#h!!SQ>vtW6NjfwAv?F);r#Qx|?r)gUlFw?ydt^-6e zrL8(~rf=f2EPRfHb5;7)e6^wR58LJ**>W{RAoDH?z^Bu;f>3ydVc7*h=H}xW{#H}T z2Xryh{}j;~6Z?#=Hx@d2Dmw3_cF z*oni5=9-zvR^lbl*1jQA9iqeWQzis!BStx-JaMP5+8HsC-;D`y4qK<75#NG6PCF&` zyI6iH9MZb^=ZJ4FKHd{_N7gMp;c)N6;}}$3!0<|Jqan5(D=ViN_E zv%e)5B8S?88d@PlC>TrsUFc+m$7%0+I?hB(FllXV|7@_BU&_VTS@QwQ$?_Ijatmo& zw}s2tO&Av9!-0!qV@+um>u+eqj&)!LLCYKl%SJ8zsxw&MUTi5U>jE53OSfWppLsgg zIqx6Nk1ozmPT-na>`t^W4fm!*3SDT@rL|v{>l`jOk&iZ(Vk@kTY1TJ7j`z0y2^mW0 zeE&m*_Q2c*N=QIPe!Q!dbS-uwvqlK19_Cka@!g2zaIX*xFE-jRiPe%NxNFv&)nr03 zuf)nL_4Mm@(Vvp%Y6D1`5#N}r1DFWVPE*&#r3QlwhV5POM27-*Bv+y-3z2q$HWnA> z>ACz$AuN(ZY94bXT{R3GCnCxA6#d+o@SqZ5XaDJ4+nzLY-+P`c|FHslfZ~$1)m!VEz^K^dlZmGV!rmG}3A?3UJABMU-LrgvCCs~KnW7r&TgBX0 zjznD(z@aQB(GjhAV!GOOaDV@;ORt>K=m!h}_>Wa-2^Xfhm9`4M%luC#5;{epu<6uB zkrKS|LH!~jyqwlaf8tk_m?B@TL?o^IRbpd zU!|$gd{d^gm3+E1Ga8z6Whc5iWW;po2M1KSCNr$8GJ(H$7-%n4v+)KhVN_Gp zO;tz)a)EF#=v3~|zd?pvBh46VjCh<6 z<}zv!!7Z5$J3Fci^pmGm$74~;e8I=euk`juaEKBC(K+T5+W!7No{H#Wmfh=$ zL*eKxoMIg{kCxy9S!rUJzd}JfOO|!e-{{4%3xUNmBesXyzY8!sq6Z8sXm*@M1^J4T zqlIJ5F(kSPVn^ys!iP=O_$Q$&B^WyuyvS)(4#5%e*e%cVsa&)@dCrUKsjyYFX#%kz zC$~V3t?YfY?hJE{L;gNe7oB*jKPOtoh}k|mX6DrVhp~faxcW|Hsr+pmJX|!(-F?D4 z05I!ym^;1@&zV+wNk8v^2;tK(jv7u@7@RstN8=jVE^G(%$Pj#a-~-1aOUQYo z?=6`bhHrJg&oi+?6`LF)0q-ve2<;={_%Z^&cR;U3!GisSW|=96Cx%xek42E%BeqvY z$9~y@fijnH)>y8%oAxs=M*+efGhcP30COV!I~c@oP!kex?MW9bN5QT$`4UG;hSq3L ztwy>xovrgbFHcF594xrwvIASJPPy+hNalHSk6(l1oagclW*FgfcT6A&55FVxF&e-t zvhb`e*Rno>5B%#X{Ro;D4f2Ly18YNCdSMf^y^``D+>sdip0_()I;DDbDi$Q#4akHc z?3vJT=%Dt+M`pw99>lG&PY}jE!oTAI`k5o~MsEWY`78^66jIQ7z#DtCmk7h?WW=V! zlrN@g^d!M#PG6mPub-0sUalNjwMsZ zQ7ePg16oKxZQ`2Ue{QGl)&l+=fCNZQqDdrwWAO#^_ZWX{uEILK#gW`Cy>T9Mdw(4k_jN{#H~ zMX~}Elha}cWhD>MY}18-+S9~*=2V#VFWy6-R}OpeT>|dZcPYl*lzbw<_UiT(w)9PB z`QK-BATu{+)PG zgRPa7m<|4Yl6YK|33?>xOS)i!IhLi+7_xhU<&|_y!0*b(isFOi@hh7BP4LpjPkD(>f$4Ly4n`Hu^c%z5-p##h z+Uwx-L?$?(WQ%fDHQjoOIi+wm*a}STZ+saXr9zw%>ypWNOjX(p2U>MK&L922xfWhd z(@o2-``&!`?mP$CoWi@U8~qyU3fnw>6qir9AJYUW&Mp809x^T6D5<>u0p_GHY?hVN ztXHHFB#%mW`Q2c3t4opahN+&0%h3Y1*md|f8!@*j7tmIaS%3%^Zo+Np%pblin%;S@ zsnUxJmzyr+-uWzIx2tBxTfHS(Kusg!9O3jXEwI-5{&^`oF&Lbcgpb8R3!+tCNSY2i z)bYOTE&y=4;F(l8x_xw`dGnQI8*rYSI4L#Jv8py+itcxDr;*~Ny$yAbJI8?$H_327 zX*AgDp3t3=QCk{IW}PT#q8{(1qx_qlIz<0MZPRnU1N}pY?|#EwZ1HDjxwlVMdIyOF z`7hPTj==InoWtR6e%e)Xtka2&pXt^gF^=GO$}K?57i&wBC636Sf0MOTw(M~^%86D` z#V)@261kOqOT09@{T6^0NrZ?FA4U>ED-*vz=46qFMa(u3eC_jdxFu18VByH;uUw75rK7+#oqC?f zJbymWQ~2>^*ps@*Ahylt7-WfP)ReRFCvi1XyS7SD9Ac#0F-Z5JN{&$cw2yN3NmU$k zMq;L_Vf47@j`?0^+?gD*Di=yQ-E@-+kD0zeVdhP`fAUTWct#U&JIVi^>=0Xt3WHZkR(|#i(a`Rjjolybh)x{* z`J+cNdh#@J#5K|wI2y%GzoeDq4n<4Go$c*@5f9@qRQF6J<=Rqw&Y+qpJztjhkP|+!8;vl?j&eZ)zKAo4Y2EyO1sz`w8kYO4&JgPG8Py& zVFvqr_s*Fy1e**sI8egO0d1-xeq>8zC9C6ev^1%Y&uP=k*!-faS#11#z^f^yEO)Uu zZlROtNqY49LEskD+izb0XldVmX?VEXXY2VwRi#=4VSR^{l9wL>#?B{ffkz66*RYU_ zFiw^URF=|9`)2JbOT0ouj0HWBr@z7ZEkOs4Gf@T+)bfj4P#jlZ1f{l<<-9@BTRT7L zZVgFkE32G>h;oCK*k#+;r0O|EZ^)rxr7Dw3yUm2j{dO5Dd4=HtFv@b|S=ZW!PBQud zqq>{ixTzpAy&b(+`9yWunX#lWOSdE&^AieJTX9U!tn(a_(UYVH5Cme33S367dJjY^ zG0vCl7Nft)nPO>uMQNl(7x_Hi@QF!Ma!sfSoKV|{Mwe9Xh@|VWL=X`3SgC$_MbiUR z(Ar;Z1Z!WtxMBi;fjfw2lGan9zo>WQShHXb{@4Nxs*s_$`h`w0-TgHl=yfLDg~d`?}vV}U$!;KgZjx*Zq1w^L)K7#t{etu(AlXp+Oc17cSH`hImC@w z)?~FK<3i$xZ+)mwYsGITm!uc)n!w{_gaD^g@L%_j8;(9e(zsJISGyEy+Dj8zjSP1u z|DqP7d{1jdd1EHQT$U@g8{Gq19Tl~{(h2R&vD68kroOHtrk;B=2btA=jjDH$I=p8G zMfr=V+GzIP+d*VvrSiR&wi-{C_i!ZQmM~;0-wWcF`0YaWuR^r5gC*nI%0FCo?kZgh zjM*yL#WDzh+*WLf*47pogs)g!!Ue6gvca24QeX+``)hm)}g3z{egO-I>Xt_wRzg{1WRp`hEwZ2~;h*BfXO@7{MeS zhzo20Fe{Mzu9J%;^pix$yb(xdeL_0T|DCckwl~6WQ^JGgi^qSicVYkvxo_Y0)!o0q?=iB%Fq9Y{eCgHYcJr+70Xi}ME+-oW*Y zfDwd5P$?9>>itd9&OLSd!&k|~;`!c9g%PI@FQ(I=l|*?H`eU{wk)E$YF!es6dOSg4iWL-j)TH915!^ESbfP}H>0(=siFu^+r3;ZPNZ`~Si@7s9&7^WobG*~ay z+#`a*dF)-&dY`(WUTm(c*2^JNi66zj-yME?g)b+l`jRG-ug@4{i1x1)a@U3ao8*}r zH60TsT2ImT{trl=toMLiSXP(gxI0QuM>LM+!&1Yukzrq(@L!?&k??p=Y?a4+)k2U-;gTsP83& zhE=pytYl8-4^;P^J0adn>|bFMiUErGl|HpYa_fe=_TOTIXNIM7ZIWAsqJAdQ3k>YO zDzzlbCFn{6Zxu#KGBI@uaZwA8p?53iel8)k0YM?FfnN*qP_e#jd;_yLP%;#{Z36@I zwlmD{*9#M`Lc}X-!ILuhc4qm^-Qq@bv*s*tZ`KB(y+fGZj7EFT@)>3&)!CM zYOgg&Fw`0#qiU0HjjS9WwMFq>F|#`*-8%&qNOO$OHIi@QI;i)${Xba*uRz(tf=}Jp z*yqjs5AuC8`NDC~!0Yga; zZKztbrJ|GiP6L#N|+Hh2V~Zk&`EP#Tn|)c z1Wb94E!SpMN~5QEyg6udj!f(Sr8Oq{)^OUj+HJzPtD{6})s|&Z+~Tv+4e%E9Le~vz z5~z?@A3cM;tOyhkEjW}>nZbiX$t9dKez;DZLdzS^BOSVmc)$(A4kC>d3k}jmC1Nx`7C; zFnmE05dWB=iu8zr-oEKwNy=5A2jUTE)Z48tafjIpZQhY#euPVHUylo;yxcDd^ph6B!JcRkp zV2>8P1-#q*7;w0%>Gf!>FnnpGHQ^p-WpSpyw@q*28z#8at+6WCQa{k|t5r*?Gu#Gi zhKUI<`zzC(u>X)&CPIN<;o}@|5E`@dVY|c7%L}na`_{lb z_&*i~{l6x&DJ9$-GEs^sljcgKmgRmjbRA%;6Aa@p`1IK#W}RzJ+P0BNs3i0EHm2BU zX}O!x%Ve_o58RuE-jL&an>5oo#VVT;3{l?8Ml63{y}4%BVQ`3$L$_6=G{a`C$ZJtO zL8EcBlLj*9lE%02j2)KVU+MU{{#w|0`Mawc64YDJ&o5Ohs%i9)jNk|7raQKc{!6L* zMKyHn?d5LJDTqPq?$10ofM<1xLvnvEN=Gw?#RurJ14?!`vRwJ`;ii^ zMp3->yhx`ca9&C3XnW`k51H!pFnD!RRd=T7!B2Crq!;Zr>-}456_i2jX<-FW*y=Kr zi}PxNmf8)_r=VUPdSp%Lk`=ikp0&&#DKYV?SW5k04>%;A1Gu%$f7dr^ZhI5FoRzkD z*=oY<)=PgFmAG~e2v=GV@&dW2{6^_#fp=Dw^5#W$VKfNJeUAO@P}%enwk*Xm^A6ZI zzrxo$PCHZB%p4b`oVt~b(&=-s8MG?mQVC4ctIYkMl^cBB6d$ogs1ocKQ_k}tNc`OGx4?Q=Ira7K`avl&DR5A z69MPy5afUI#FWO^!%hIaA}h3oHAR-(Y+SCd@&R_tjehql`kKSh8l~m2Uwiz;4UU`F zB;`)l-82#VYjOrMBTgJNSta?t%X!beJ<&`q>CED8g&C1^rhiiMQik$7D z&y-~Wi9;7R1aB(_hbzahPTs$>e~nbOHuWQF2%-^IGasNRJB6@luUfy2`Fe2WB5On{R8GkfheMZS)yuUIN`O`(IGsYn` zSEm>~Z7HnNmljx&LGG3td=5Wz>K$k~^$i1D{TE~i|Herj<`8ttYpj&3|G%?iTgNb517hYKY*yF)Z)qMgw@P z@_Jf7$^#6@yoh~$dCGdyo!m|wx#j8EDZw>j^iMEITzX@9S?B4g zzV+z5Bi3?+1vJ$C6u>=)#-qgSUao~sUwA$OMlGWUQTrTQYnRXX4E)3=H1)W!;3VWGBk%U~FQfN1& z0!%4e#L(}uh#&D%4(pmeQ*-FFv(|QB5<)pB>|Kd;@nkO?o61I_nI~-{hrKI(jQeWq zwYoSl&MrAk7UiswO!@U@yAmAPR)*Lpmj{QveRMUC5GlNE`Tzq7O{(eXUx1;^0UlkZ z(Zwko;vmRp0=}SLYkk#fcz?1_Qt?_nCrV^M2{RzuM~(_by4sAV;||LiUnkMS!e`c< z!a}cU+%$6mEi#=R%n#q()&?oqIM>pGsgoZIcC=;lSoSW|a7l~XqZ#k(h7YfaIg`;+ z*dBE0A~*SpQJ2yAh2pdj9gq$sM#>&V7Y8L)B}Qo+IW^%_DmEeqgW_iNqFHVt)ZH@F zFN;clgUqVbRr3p31*V_G*l(CG2l#PO+OR1*zO9x8J6zL`(9Wbp7+J!hFm7Hx=@Ih$ z7ndhkF#WCZlRh}&K+Wk|#j|CcERCn1NN?C*;^H$D8D#6&yRZ1N3+O$v4*ia#Xhzg9 zz&fdetfD691Ds0z*S&+oXPN^ATJ1fM=mKI1SeY59mu(v(-I(G{H8v>TqNRc9yZH&Yx%TRR$aPR$Ft z69OMoYPQJCnir>D0-DR9imIGkD0Z#%%vWU7Bd3-ufuy#PAB;nTn9?IEPOcF$*b&tc zNvvm!;2gqk*6whK|0wrY1kEop&-j;?j$T=F0EFxIq6T@FV9gWDJ#sxotgPZ}ZyTm1 z6AC&z1^INpH>tzMb{OUo7b3VHznLCi8;lPcNl6hl@W(V|fwhbK8PU2n#5ZCgl@^lP z`@VZ~ov3~DLm|3ktZIA6)^A#;ApX+1s3ILjx&e%Y_dsxW=HSnWDjvwM`hBAD)QEp- zHWS8&otpfK&@h16Crq9XSl&!1z?L@5OG#;ZX z`CHK*!y<1OfGk%>GOH&&4{nj4c_#HbOr)f4a(AICAMWKC#Y8q{96~QWTIE63%k$*a zkJXZibj&kZIPihWng=cGF!2ElxFBZ0p4Y;=Musk;BFWuCVR1DWeocfw!O)lpvN38q zWQnUzd}3r$bU@%yOyrwU6!t0X&_2eI^&aYlXCW;Q5HHCcR``n;=M!Erkg~kem|uTx&U(ryPUKh^MM(4R&w!!cKL*fn8m3L@*WG~lKh7P5IyscK6M1ei%!m^LANzLhY9l|Oa!#v zB18hyL*s0Gq5 zmVoJq$Zsuwdd332J??_@(c{%8=Y!}{5a*Th{bwJrD_A7Y6DpMo)z*Xa%K6UgIf*s| z>;PASUx_6QY_EDeLxt<+>foM<|Lg&`g77#H_}(GiaU~Lr({SE_`m$4s@AEuJQa_$2 z7T|tND>Y&_TCgak>%C9#?PKcx!+j<6mm{bnt$r(L6-2qegboGi`8yVrs$#!})<1ui zwXSqXO7zh+GPZVFp74Vu3V34{&_3Jnk$Yf=iV&+9sZ*wgM-VQsfm{ND4$x3B|CTSs z*Pj-G?J``YT~#U1Z{tQkJS)vSx=or{+RJ^H);P`_nYnqC>&0vimmvMxQ{W|>c^H)% z<-A~1Zar6w&Sxyu4RvxySvV6PwF!xpZD@&VBx0Ayf&JqIBBj9Mh%NL7b_~2Ra6p#} zZ&`DKIE)gi-pgvZS^UqevKGA`>=y|ri{wY7S#x$6tyspIs-5;+Y;z(D(%4L?jQ}XC z;Il1?)|#zemWibcI}?vW7UHcHCHC64)ys|flm{~%ZzCz+f*xAy;goQ$5b~gca6v3= zS!TqE+8fT53WMScagLj;m-vqXAo!i!inuDjrpb%LBRk9|OO(bX}C65f}NBsY37-2jtZ^=k<7E!E$`Ql_b7 zqHDcm0mhAH;Z~xz;4xC@_ZgnUfrLq_X=aoHbudjA_*RYv_MYe|MRvU5&z|E`@=!F=^PzPXE88ny8M*TjAPYk>&<%mYjHq2MLE`%HbWtP+?C+CKbzdvtXO(D zqNY{VpjVLaB^7r>Sr1o+3ThXzwY!!KEpfr0#^!{6jA3l$(b>HLZ^vuuOpF1_@^Qme zBvi<5=dPgja`uxo3J@>IhNa2824cXcCTMPk!$t@0T($RdF;6|uP3esKD5%$h z9=ofGAE-Q0db!n^p4N`YbFKYIm2w@i(0`Hd2VOPl#h4G!g)D$|?7OCx*MiaRaef|x z)frMi=U5G_wQ8lw2c42mVSA}ps3@~*&F#a(WK(S+2HZ~S2dy|*3N(HjlbH@K?$uAZ zqHJvzPPH}pr1-`WlZ$G`d^lSsrF9X`^(p^`psfq2rcjijv?TVEw%#xxaWP9QRyl*_ zP7{0vDBOT&54X@Fr%sClCa-4_wYcvclXeYAOkJ)MYO9*DeiB`O(mkD|wVy89+TsR=kiIE&EHi#X>G=NK5!7EBivZiO zp~oS@BZE0gZv;suEw5%hsUXT(%J>i|gX{7gM*fQb|LN;1z}ncJw{drOcbDSsPH`w& z+}$-uaVNM-a4QtIQrwHv;x0u4v`A_D<@Q>8f8X=pJWn<`=bf1&vnQL~oq0=NO45AE z)iv~Gt6Y`=NA-OlDqat-J!=U0PNd*-2Y#ij_L$wHl{8*?xVQ*5LloRAK`o&}T$E5> zPe1XrZv8xG2lD~v%vGLzJri;RL2gk%sph<5TM{nvg_AZ{rq4BZyE}1}WBeQCp%-E< zU%>IZ{G5_XM3fO^N@^Dq%D&!nZbT5a5VJz&<)#~F`=r`Y(ax&%mnISf{k|h{DU@+5 zjLG=3)~``R1c^!NQRPdqb-tOil2m3McBpAH^Km@lj_@uO^^q*zA;gb*Dje50 zaphV@808H!ni$VFKTrS+GYgDY>`h)bo{>%~N$wunO*tXu1<%sAO%TeqNxW&STl6TO zR^+O4D6Z$uN3{eO<746^L|Ks#H#g^ZUk07(Lz%7ej+kic*|N}`^55Ep9Im1Y^4nA3 zYl~o??3Z;PyI6D~nvrb8UnbiIW$k{&y&Ye?tE|#+S)AoaSK$ME?n}PVhj6;U`VpF6 zM0g>+AG{CX>>P`|3vV{}$V^PB?VUA|e2)SAj^#fwL0Q_<92Y%ir1yYzK&dAZMDd<@ zf5a1Cuc4UP3&qbs&67!zQ4>8Fn%0^??U6=I7GyYpTbt=tUY&V$AbE*}UZzmBCF37= z9d}L5lRMd`_+ST6wW}s8jfG|`1j2B51q3x<=dPO`dOqai9}Mbn$wofcm@B~x)TYLp zGZcMZ7OR6wuo7_)FuZE$7=h==dW9 zFCjC&aDasIkaKXVaaNyw&oyO0O`yKc_-Z`(tgMc#fVb(9Y6($vxa%tg%T;F~HS7)5$yw-R z=X`LvxM3Y2L7k*T=$!UhdvNwsFc$-MI8#IZG4v#9Mgy~sd@NM(pwl|D3h}VvQ z4(Gf@nxhmzWn3H4vlu()a;=S-p~0E4@GvVwSzpG)ry;Ry5|crw!8>fnINanA+GU4n zb6L)HUUqsy^GIb<_iPQ_Aw+P0;TFyRwFSADikS?mp_2Vqn{qilc9pex9C8sI6{j6I z+m$&_HxEK4QyDWvF@cVrxISowm6N>e&Ro&US-1iK&D2BE!aX~WU;1I1LZwAPoY!M! zfOsPV*6FiTcH->M2%@|Tp`5evdSq9$A5_r}&Bk+OZzl*jm$tW#eIHuvr`$ ziAs3_QF0H6wWF$G#90cFQIj?3(R7wLD(WdJhN0Wvi^;0MboFFD-pW8HFI|gLxD7Pj zq%9i*Ff1|@>>`OE5%rh4IlSspjU6)())LBa16v^SDfai$Pv@mKFRQKXE_GceVPUS^ zS#LR`qs_v`I^uGV9qKldKd+cihtzc>;k>>y?FvIUk?)EShgw?)v2CE#&Xk=`gsaz? z%5zqK5G0knatw#|ygB@v&gGH!Z#SJS*bxxq&8 zUDx8vgT3esC>Jg*%UVy2{Iui2<8IjA_ILIYFsh=GYsWsTQj}`crG!#owr`T1k2C37 z0G|qJi%JwYwQ8E=7Wo2)&7m~V;PT7k=v!LSjs_YqnkrXScc zGI5)leu{w}CXKddm+@BH?TPo6q`I&Ou(qp4ckUd!Wp;c!DUfajIRSQp?Q^OGVZ^pv zdx0|6QroEU?bC?Vw^Et6ogGN3jBBW&n>68)yy>!!f!u26Z_c#}yEF=-=qsMW)syzAhZ z@%U)FuNXzzU5A$)^TUV=W+{mPWsI;+rI*i&i!BlZj2u>zYF-s13E*)dml%akiIGc* zk(&2Hp)f_FWKw%Kgp0(f!P9hXBE@ifs+^jXvUtB%F zR9)Ud`6E`%fFx!qOA1XxCyKUXTvkz50V7o%-_UOfnO^K(IXtp{Lys!}$Y#xNoltHE z(`v0qG%bgTt<1hX-YTXUF_3;_Lh8ozcv7fb2_BY|VU9N-b4IeAzQ}!xt*bL7T=bmdu4Y7E6itUOyb6O&W<(@2GiIY=UH- zk2{Yz{5Ty|wLww&(bz%cOiM$_!kA<2vPR}v4f`yvj=m_HZLQrbfVI^P@yan`Hzjgf z=Ii}Y?Ib;f*K}@saF`q~WyELAQ7r0-Qh8xHnz5oxlkOadgiV%~%0cxqt8a~zjBFvC z2@A7FQ1#j$!ZLAdd(U*dqtH7W+U;=IitK$Ja^^7fR5iHfSQI@(P87yOU)lJ24)ZRL zB7LU14=`dG0wvd{16W>vFgfeWI(*0Yk)nCBKv{9~Y}LJ-RPzov(GpwR zPci36SD1qtorh+r7RFp5Lm=_W5S`lL-FJqT_Ru$=YJFNCIvTHxLZE|PYoa*u3n^R7 z`@03LwPPi1BQYiItQ1ztrSuv9GC}TRAF*M7n5Fz^HTxOIeSk$%(#XR-ZyK@En>3m^ zZOPX+!(UL|q7FiRvO(bb+}cf9uGn41g(ARo7LD6a$YDoXkzM5&vkRT|o=-Lww&fj5 zKEmoj;Crrf-PQ%9^9Ucr`cL*sf&Dkn)NW292@SdTZd%aiVzG10I% zKN|cSE5i|Zylv^@PNbJykuwL?UgFQoCO;_XHx)JP1|#3>sO4|bOxCABlg^2!B2iCC|u8 zlBRSKL<|lOnwe6PJ=LsmnmuEt>$0 zLuAg(K60mQT7dFKE?Wq3d@^?1pg1iR)+rNgoULmBXjH21k=IqITNDW+bJZ@Hx$*mQ zN>w`k5f)9$_ufId?DG916zz+)`GFFs4(rw5*1v?1 ztQ&Z&1$1fW42HoPbJv~7;k14a#KU+ZI`~HT^Pv==)H?AS4a2lQo;gW^e0(yVfc_{jC2KGEFu%z!hpt70-I z!#)9Dp}U^17lA)Q?#_Lo^51>qQn#!pcTe{-z?2#O%%vpY$8@8CT>@^N0oKF-YzL3~ zNgz3ybEplTS_hGK7&y0f&1HtpxdOmBT;lQXBfMqiQZedoa3vQ*fzJ%PvOjJkp)01yqRQ1_4xBpdt~ zr7^|6>Q69DnFQ9@6FY3S>6qXGsI2+axOuEUKEv1U--*A$1@daws-SA$)Gl~-Rxd>k zKb)P(L8s=NUaJY|X0~cMgpt{myF(WcoA9!~c$0b1T#t0zB`V=-&+_KO>rX7i9!+&@ zIdRjYS$jSe;5QvFRIT+TP%08*`?zbBZ| zHE!_MR7|aA^jNS>JTwou39VRv)bPJxf2{Y;NF&RgOVpZ>%j~iqTdJ`DaZD~h!li0Z zt3|kZXW=;t=+-vr`8@A3qp?t9{}?sZwMTnNy0ahnCH#c#?3SjuJTDU({?&DJ_0+_a zdzGS#Nz>r0cg1o+>{EnIA;3$n9wj@z*Vj@)wvatex+U?t#i;=(OV%}CO`vH=;;V=cf+lbPdb7j#c%`DBqI1iaNSE2HG#pZsj8$P*{k`-HF0H`j1I1|U?>Q#~N z)Vy3<-S1JhrrKqM8Q2$4%R6)$oBa;Q_dc%ZE*p)|YmJGiM=`Rmwr=Eu^nhRp%MPxe z?0}Fc&8{x8{gdi|t|$4H&mIOT`NFP#Qzm;Oc0zoa0ZxOXtb2TJ zVA_>qVd9v0;qO$t$vEGKE$s8xh}TS@5e*l^L%$z>>ZyO>AomgMNmaIX zV4<^6e=MBgqO(-fhVLD3n-ILhwwhuu8>UElCd=_Mdbq_w*jU2i}F%vnR! z=&4oWp_U)7wE;|3VHoQTzita#Q@L#LztyIME11f#txMA4yr8vf>XWz4ga z5c|rj0894T;6|QGRev|8dZw4Rum!=5Lmj{uk3I~HhNe*6WbECDu>m>pb9o&^NiEwi z(~j9rd7yFC{M7(2cyyo@j3_@bP|nW?ea2ELG8nUZvnH7QRK#$=pHk=foB(P2zXvd7I+JI)!Ztojw{`9WI9-5`^ltCRGJ<#6_5{T; z)faH5lf^|7-e6sE=eANy-6UUTC({gUB<~{$NIu5hCg-9hCeJ%XdIjB{C#_Hq;rh-I zJl~AGL?68mw>+!_GbN7BCNXs}-7?zKf6CqAR)tC$GKW*xm2{@7Oa%}0#6!U&Tnypz z-Jc@u?~V%t!ry@BWXX4heh^5rKGpUnT@eWDeM+%gej%d|%8L@0K`v2}Sm$I+H?GizKQEyoYON@uf(8dkC$2&VfL8)G5GSJoZKh7#@}V9tcQnwW zPyO85a^g_|i;-KeNGmw6u;9hc`{TP^NUoyDnZjwgHKOjQY{>kagQESQOc_Pm$l`A| zWB^Gp6gg^IEn)0v4fn{4bHYiV^XsU)a@GcBmG|M!m&U&)9qrw|5?BA8dn+ct2Pby5 za9pwoh-SJ*j+?%xU_c2c>L=sSe!?g{*3M>J!=>YVIX7-o7Z!r1g7Ijb7J+q5Gi<-d zx+)V~z}C4RfSa1U==NzYOdng(i6ID<4~;uyq;_ZG9K<9#aq*E7aKi%vRMz;rcg1fFPT4%w|)tvQJJ80^Z9`c= z+f4++PtOs1-3#eX*HzIc1MnFV!1x@aD1FRyntEBiAss+sLU_RYt&m7F{V}YZs@8Jk=eZ` zTDge}%^ZXAnvc2qA>hNmc<1+!r_4?4%UyIJmh(c01s(_X9)X4(O$ zmxK|ZG4G{s1~TbTuSM_+4;R2;CjILBpOrImlQ+h1|-O9K1YdOoQ7vIGwM9cu=eF0Od?MX4fq_ zFv9IbGAhsPi0F7|ycf5E z0khc%X!^LcVAN+Ra=ZE>@eP_rrWfJs6yq0=^UcsKdSk^Rjw4BVaIwIo`lV1iJ%q;FDHU|v5CC{4eVcIgyC!C>f^fruWN>91H=kCB>t#LsW8|3eg* z<-!Gfjtn`sjU|ABV)}V*yS;%3RCB=sAP3>u;{SNwJnj^wL`9mGM)WBYL6M(YY687n zO*)0WbIK(g*&+W-JuPf{#>XcUYT3}Jx|QW~!(zY^Y;sL8J!w2%ZR^Y4#sI?0uYJj@ zkDF7kb2iXo-ahec-Syt}{SfK9+q^rsd@gp670M@F9it!9v5>5<%rsCd+hZt=3`kPM zawF6>rQK}}=}{j#r6(I9rAyyQ#39&@i4jmTh@rKn^A`YYP8F5)fGNKBMEY*A?$rB{ zPWEmj`(E9vA8w4k@qGZhP;3nr-95S|jNWm7{U-V~l#+5E9P&MAEE)6W9{W4l-5y*r zrS->T@ENp(`nBL-I@^02xuErAM8L;&?U11GVBzVh=zCAYA!6jbD#HhfoM}#sCy>pE~U%$Y> z7RQ!ZBWSIOS?wBg2M0sR#B=wNMI7gELc;zg+>EU&Fa4wy)Wq^lq9@gw) zJt?j;ZWPY*D(8i$w9;Vb?sEWyoo1XUuKGl2Rfn&E6lB{-!rShM5bV8I9NL=ru$?7+ zCR{wi(~{U9R1lEQX7r(+era=RG21~lgS(Aywth5yD8<6A$0z2jy)4T@!ACIk8+=lx zf+~Gmqk@vqSLJpGrRjBsm)2n!ngQ%LJ zc1Qb#S;WLwp~H!4rb33Pvl)JGPmRABre)XgWbnSK!(h}VUSM#=2Ge7kRaEUesl?x- zz8Y7tNHZ;e)4Of6(|}+M`5%Bv`9{ zp86h@DQL!A^SaS4-!=b;dQx49;!Kywx@@#>QZBA`Pnp5Jq-@ELDl%^%ebn6bP;mi? z`vkCH{gG?e{uLxfWJ&`w29@dK`>2?E7VFxQ3a`Plxp{k>y!bQ#-W;#IYO9KuyHrUF zPfw`zk8aSIuP-{P9a~C!R&BoZsWD+XI4CGlClFukrf;T*aO@s|qSEo@%vPA{{9?tT zaSpPbyA#Sx7~<%7_V&cVNyfVl^+}Km!V;`bRK1Rqr$MmgdcRc=?v{n~Rz;y#4j&_J zcvXVjm3$q~(+cPf$r;yo9Walhva8H^E_yk`$l(5Ej?CD2!0+UTzWI8WS*QP{pSvU-9BfI_zC za!-tfKdaKX3>U81yRGhJqXkb0SLh}ED5^3ULDeN6q9$(N!^+v4d8U7PP!Gri6F%vV zYzeyJWaEH+iGTD<$UUiyyaj_2erz*iKcCdGg<*e1qsf#BU!*}(+^dgi2#=e;JT<;8 z{<*k7=p>y4urR{MN3obzIAS)|w2X>9_7?Yg7pLIat^HS+eBimKoTH|>5^BflP59KQ z{30-(^ufrX+;`PbihSSq3NZ&2+1LrR7fETC2UUh4?!Ln+P+8PNrFHSh0`0 zs#V_~-IENS`H(x4TsOE`RB*n#KK4G;F-M{0v3iJug~jTY2Q^SXfrNWcE1HSus%9swbp? zs$H%68V8`vJ->J|6`yXAeX^MhO-Lq`qLD%O)|ZH*{q_~vJKbAPH|TFzrlE#j=7{x$ zYPB?VWuMhox-!2HGDk~e`ox-8m>lE(dgtl z5Cd-#B_`C597E7Z{|xqrn1Kh1^&s@PF9~W?yiDqgu@~t@=GG-aU;nv4({uIh4ie83zC>*M%8YF&R5t6K}_)|Fs6$A@#>{Kiyk;(8aGNhd_X=0u$$*3 z8$mP$l{&$aY;DdkKCgj=CQPg7R53@q?Nsq*1$(Q#zF~{)YD=+NcN|Qs6N3KQ5JFzZ zI*zgVg5GM2eEhQ2f;4}v_nS1fGp=S3;k|D2xvo3+-`+O?j z2tPR6rjghcbg#O8zWpZ@wjo2dHXLU$CFdazrvU_~if60gnog0ij_!zUJEq3bdmV*t z!pPO+N3&s!OfQ6%silRZNzwo%-Z)1kFVSAxkOAK1x?AACVAPB#twaW8<<5#^3-b zR`QnSMPyNK%~P?_-zvWBBJmR~nrJ^9Y(L~F`rzApe2SjKvO*G;*f zQ=F~ab)f-2aEe8$4SKcY1?Dn$865*oxfOdw8=6b?R-SKy|$oXqDp|1?{G=(UcVF;_qhA4a#NO{c-p4IkJ|kDo1)mK+ zV{PVg_2KeOeKwgDoqKBQE~b0QwtC44rQRJn>DhlEwCw>C5(^s?&*&Bnzy1PAG?=)b z(>v7FJM^*)zX(I11gf?5b6#*Opie>5@Kj{;nn~F(iBl}D8S8UC`e)AX1E=v6j46 z`_atXB9vs`C8J=Mz}SVOs9-C=Qlv^L6^Cz^N2$22O0Q*nXqM5n?-QX0f(kSY9xPsJ zF+NarnHq9o)MZ%;^8R|68~SJA-7@W;AGlUn8UB4PKk9hJml2Yw*_04MvkD3A`+Eb0 zkwXLB*+_xgtAxM6*G4$pIU$%oSS4ux#zOX>umn_K&?f7jCVDq9V4hHc)0=15BT@n_?KYJS9!%0D+ym=_w*d`k$@iM%aZm>(FB zFT}u)TP%ySs`RyJx#=oxe&Idagc(F$Sv(5*pWd?HYll`LXi*p`s9;8=FNKjA$zuDap z1iJ4_{GzB&FY7I^Z=V2WPV}duAN#+$7*g>}M-8M^ZIIB>-^X-D90KS2pYi;cJpI2t z9+!d$Z~~_e2!65t2V*tx>VN>IOBPZ~3v6t}2DR0RaAz+Y0&>nb^fj?~75%>lATlV_DagaSI48TP5e#m z`NUsBkeiDL|BMZ$&97r4JO2|SVnYrr+W2*{e!H;xn_8U}Ah!z{@Mwehm%07(!p~pV geSU+(twG={1R5&vkYyYSN)YnO$AzrH2Y-C~e^Sofwg3PC delta 40281 zcmY(qV|1Qh5bhm2jnmk+ZQHhOtGQ#_dScsdjK*r5#%zqnc>f3Myytw|d+qr)v)1*S znQNcjLMAOhLaWF_LLsDrBVi@uVSpnfGr5BQ&l?I97#Ntdn>8~e*#94~j`hDDQ=z~K zzaxNw!NL6(Bnp;Jxm4Z-4hDt`2?oZTs+xtJI(vtiD&vj~JV^Sci5Sb;+7EI?L2D+9 zFfpik2CpexkY-QfN*}<#W8!m>H0?q@(~LA>z{44Ou(}hw&n|a8&CVI`0AM~bKf&%h zTcUcvulD*96^T&-IH0lfZA<>R2kX`RVA>@-sY36>wJ+I@ixjk+vtTwaM>~n0o-JFp z6j1bYDntwhZqivNiL9GxFo(xoo!(S;COOm>sOhE2Ela-pULlO{YS=A#F7jD+6nM~x zP(|bM2G?l?kP1)AoGi$Ls%9xBOV6YYt=rDLH?C>em$gjJjA_zwcxyF2rP1NKU)HFq zB@i48s17SFn$9s&Eqp~+s@y^a{@t>SkUNCmG|@ByLbhitsphFjX@UY9fO7f2CPFjV z9*9eNZYGtlk_X3YG0MDwjUB~wBJ_Lawr)4wg`7&noN zO<>+#8{H1bHbV!%{@rueu@4Wi)at2ZYlv6i7yd}*U*6rHDwHTLAa5S_!cS`RXD!*9MUNz*UV#2c7?C zqW@1;ZNV98h@rv2C{js1xqwY|3~ih*LihDXhA39L=#VBcSuhOdHmydjc$#@=MsUa0 z4W$;x;Pr)6Z@Q;*hY;8-KUgbdQ!2^GftgKn@!1Q{{&c7!^?k}N_ z57wZPXIUvQ3^t=-X!!5qS!pbk=6KhWH=^k*ut6O#^Zb*fPy0;ShGx`KQ(r29JF4CsvpTm~)MY4{QHpx&L)8$F~F|3)DQUCZ; z?+nl8WDUliET#>;L16c+r@g&-=<qg)b?ByNPFhx{H=Rp4il_G(XE&PT z$og%q5Y%SBmsq+|jk477b;PM|G`EFg6wwP?=<92*w zpqSFLZbBuF(G|h=?VmOD!{~jt;yj~&yn$6+4Co|8Hrh^mDvhPk1S}Lm>40!@NQ=iE zYiU9L9auxc0B~!}F!#%kMvx~XhYx1i5{*6RF&oTdl?y;X!3bb29bn`)ZSfbp(8wDF$(-%`It_6W`6;y#4F zK@&oQIy{b84J7bGedwLN;E?Ovpz;f>NQd315aJv1;dy#GmIt8*!1k_P2l?p279^!d zA)jHmXw$4rl@D4TyZ!f9%X#5AdV5()yEZt;oN-z)c}Jqz)uv)B_nc2NRihwTBm6dF z@;5&@pmwO_Rd;ctcJC)cp-=5$FPJoGIde=knp^AK++A^E6U~En$JOuP9*@42-mo^L z@*%i*xKe^}V|itarW??aGn1_+%OG$I zl54+^CMZPl0o$L0rOF@zH7x1pC+!`%avcu5B1^+uYh=( zXwYL%q55g5JG1DY$Zrot1%W(quO23OR^0@L#cxCy^ zAFx2<4bUab&q%k=E}#^fA1YE#;`1m0y}5@6ig|@$KQ-mk$N6P@S&JnaFX3M)NAmY0 z!ji(GB)pWmvT(P{3nU&ctCshzi(gKC12CGlTzsx!9;?VTAL`75h(69w@z+N_w_x@) z39@iM@C{26Kl(-R{t^E8Mbuq}WgCTtqrwBysG?c6OA@Joe`JNA6H7?lBI$NzfU%|( za65rPNFgo#ysS{n?Ph0MN*F7f} zf2aZA18#u+`IiKQGe@h=D+L zFW7{qZFP**dD&CIsPC^oma#?+bPpb!b~usI<7mv~a`mQvm@&H3z`$J?u;O*OD=>WY z8yqShvDrC;RN!wq5N+>1=rx+Yu^4h={Tw1r&j{Tx0@A(OyaRr)5-@CNMqIJFhOXwB z^iLycZI`+J-dnCN404CP<@+RFKeb6Y>TbZfDbyk~Jam#w!_`v{&kYE-HbAqeS3GIK zz)(vaoU+UgB7JPlCDpq#ki)|a(}%}Cv!KSAt~+EiPeYXhI;dXU3|-aSJUiqD>5ET~ zc;J7l=ju3?Gd99NrwJ-#q*LvFJ zyF3sVZlA>ouuuzLFE(9?=I%x5d7hrKFL81=W{$M0lg;A$%niMDI_*IkaNm%MKLQ#c ziR)cO#w|=rKG5fhjWY}*CH?QF>m@OiWh+lyrB!^{B31tv$y-;&PRiuV&7;mruc@(L zLXr(Q&+Ym}WBPkaiVA-UCoArHAi23!RLmMIMp!w4Zf2!7Cp-4ozK&`FH9d!M)(J~> z8~OM4i=qId$E0=(^>scJ9`=WM$1Jeh@CfX6R*#RiU*$!t6mJn@EH6DSX&0=o9U|v= z@zD=_I^6(r(Zc{kxO=t z>>(;JQ^kGmQ$Q|eY*JcrdsV@c_KCjX&9WruxaWClalI{`hAqyR++Z>-`_vINRaB6N zvVasQt_MQ9=7rmNX{<>|+M;D8#gORyHf|WD1n1iw!d}E#xQVZj(7{9pQK1XBXRH9d+ z_TTnd-vQ-(z{%E)`D|owzwh!AJBRPun(Z%)%{<1z9i}q zv}fNw*}b%2lURbt4C~0-TAvbaZEcA5Mw7_RjVkN=h5oYXY>0$mi{dC zbP{dC0ycxwY2$GuX-K~|e_zfxwmcrN8I$QAPGBxgn_<+$!J58?ZPy2RoHwD!SXMHD zcKS5y=o!hK;9h6G=~q+OIiHgY!vU4JvHx+VU4~%_(Kv$ES>uJ%UxEVqVSR!Q*GSTB zr(Z5Sn`87e1(4N)q>bgpoV-e86Gudel})_2Q} zXn*gUI>*3XNO=vwG^bflG2ysMv<0>oWAnp#5X|Xa=q^_c30B1j?M}+4Dw; zbw&$1L;Fqkoi%QhlN2H#j3k-2scKM*oc9P*aMt6sS7bO9zoZKVBdbcR-=2tl z2uAi)LW5=5;As2U#PvwrMX}t1Es31Pd{I=7#(pW4xSTN) z72UkD{Al|6U#<54>8}!9l&5LY!N4l1z`#iV2ND2G<_@Or?xVW!KKje)LgRYdEe`~n za{Cgpa1hNrMzV15YbH^Iu=KYnI$j|dVm?jzj+D(5r4-Z-KQ$;@&e#vHy0_oFh0w*7PwYQ(nNL zQT!p#h;Nb!=?wChS%(egLM1|`pUpS_kpaZP+A0I8PU|XzdYAA>Y`3z=9|D`=4Yvdf z(^w9g#n~rC-|`z8jrX95^o9@xJ;0go=JkPqge)V59CyucKBve+%6s>tPY??XXftXH z4EOW7y<5Y}yfwCq>H!*JQU1A%y@Wx8JE}pUP1>kR$PybBz_vZAK3Q%$`V1E)60zU!5bgbaJ|DRo@0398DjMJ)BhR zxY0NZeGTQZILxK4^LSE0LeACkr*WXzRj`*Amskm}O2eAM63@iqF4$vtx4V_sY-IXZ zq0^Ws!}ay{?>{Yd{;MmG+bWF}_zocdhaZ0C8i~l<5z`hFTwBu`E7*x;3W8Qn%O$op z*w%OLkIrlJ+dcG{TidfEqOhu*tTP*1o9>#<{xq#Mb&$=3L+11Kbrn55KkEP#{)@ke zUTsegPnUlYyu4tsd9WTzA|XGtxQQXw3hIyHou6H{Pu)+eT82 z_>s7)hf^o=^@{5RyrG3#QNeCaWvP)hD!!RyxNlyw3hlu$_b>-dKN`hsa%3~KPe6Wd z#lE8)>Rn*NhoS+Sb=O;B36v>FLds;y0h+F7EO@=p&xi>j=7b6si7SACLSUb|pVu`j z%*^o_=3ZKJQWeV8C?BojUf9qoJra&5=uhz6#vAwC>BA0mvvtb>W&_-Sz};8nfUcfw zWfvSOK@1Z4V)-#A?oEQ-U}=QopQI26;ZdZPrhaalsrV6mZi(WEw93=H#(84d+9a$A zCWq2#nduC{8W%>AjX=O;UM5PGq5jtuZd|q$Te)--35YG_JOY^?fT-(P5*H_fPrtAk z9cy~9X&_B|$Z=Iq^ulX0b*E5HL7PqSAs6G#o!Z#9ZGtYwZVxiLzhAzRm`niwse*vV z#wF2tQ(*}pMs{d3T=9qr7T0i z{g^n#eDf^cEyv`-Qljrw-uplx{>3Vtg{|y59aA+XToHuIhr|945}L0fJd4h!K~q^0 zrh?2=QgvLJJ0&Q{nuQz2Cu}vOi4>FHu_K>trPe7CdD5c0wp*s2QHz^C0(nU9rJGoZ_HYLWSP z!5pl&tz+D`GYC7yx1@cV2Z{HNct8jW`wWv>0mml=@yfIML;hF+_RqN+YtC1KA4VnQ z9x^4HX89=n6l8RGX6Uz|}3}pD^|JoalPXS`lS+w83DR8~= zY?sco6`STR5q64hK>?X##=AY7eX!CMNQ6tLkq-%DPj}ywS6aHtG_7RF^9q8K_V3u8 zKhu)FC>ORWZa?0Gr23VC!Ug72!Dl5J1LoWETOjn^(ty-@-tZvunI2D=A*bPPmE)5S z5I>N9&P5QezEurWI2eCvukDaPznBQeb86IO4gT<>Lq$8|%~r~i>J&YF3>#9mduI%k zJE(ZsRPf0mTzbY06g#+v+bnoPgU7q&_R527Coun7B)Qy$>K?ELw_p_W(kgxAoyNx=`*P^qLO5`Xvq^d7{%-g_3h#fU zIJ-^a372&%BBop(7qpfdC?z~jsj@GB@cjjIY0vT8uP5}6HuS6dJ`3TGAGwfhZLkRL z{v-+fHX@0Gv$W=@+`$7Duh_X3Q`TUy5P-IZ<9Pie%=YhspF(l;-~Nz5bQEc>z{djv4PZX0>%?dr zlnZtNIdf}4v&KCX9cCHnA8-2^6_-Em?1P3H?B4PEzrFo?a;)r^IN*Msf#|zfTn8i( zAk{@wP&f#1;<+voMuw2jJ=M8g&7E4Dp3t@6;aC`#^;{v*x&MJ)ROroCHB5jJg6u)( zWDOE*ZpbPRGPH57Jun;CWD`jI4zIy0A$kt{i}}_&MNLxI7DFwlzMaKqN3_#sC60@h znh2}J3p*7jWNB(zIe}#pELs#lXu!g7B|cnUJzict_-|R2)e9hLq~L`@vYLo!5SeD<>ZBH6x+RWZqJ`fFgcusH~^6gY-ZmnGs% zVOP-v_g`_@*WxR#=#Gah4?uSqH{_*)4S!15N}ohFm>~9c#UTv>)IuvX!VLt!a*df3*x34?V(x>*{SoAef zG_8ktiF)2BTelGBv7~@SF*=<|`!M$evp7691z09?@|V|5WU^hp2!0J8o5aaD7zZ%F zd)uO!Uu5C(cR?{At@zES_5Wh<61$x$lw5XX-%~0yyW_kf0%EA8J>6rpB)@$XMLCt< zS0*5tbq5O^R_LFizILFi!vDy_o_BnR-g;&kE11Ry5Dt`2;)O$Rtr5qBZZ#x#sEumw z{Chq|L)8Osy&j6vF${zgfcHk za>QyaeVi`q02dEnf;3-x8cZG5>lg@Wzw%WEgWG(nLPO%$f}3=@eDe$-%@40?Cz9M! zG|KC{Q#B@0`(OxBmgEmF>+6JN@ecO%B4!!N*?q@xIV8{gFQq>PIiieVW~0s9Bf0L{OJ&NBA`WRz)Z20Kuh zoZcwMM56}yynv!mcmmzS8dM!gg;=6Kd3dh|Sx+)N16`hr4#xAB{Isr+kC@-C>=X-6 zJfaXubq#JwOwPuEhORo07r+^K;+kW4;7v$fk6XbD+2(1^@x-GU?3nM8C{FYmAVX;v z3}0UesCA<|=}Eg+V$s-^9JS`#RT<(Hj&6{jw0Gxi{-scov$&4($UTLJ<+D^S9H*Qq zS%3E)q+xnv*cqBre`t-Tg0zR4i^;K${&BCI(hpT%lU4%l=8-cwZo4OfoIe<=G|!s~ zn@!1mRVdk-TwSG3=jhlur1h$Lc9tS(q|&blj62-_OBJtYXqcMcM*{WKN#W43z?;as zpj@=#elYU#V1_*7z9t~=UoW=k_!>BkwZeWVc(IQY>8QRpIbwOcr`9||fijEkbGHsW z1_yW;aRiF(uOW1YR$_DE6wN*;P+)x5p=LC9nE!mQk>_ z;h$FegtM;ZI)NU)p5L5!sp+Kqb3Uw1a4D|+)NWX{-h6d0^_d#?qc)+tJo|4Ck9|=E z&DR`ukL(@K9F2Z@@yykN^88n%Hi9xBflAVWM@gH^Vf96i{WsNY$M$N1Q3Tg>I&1e| z4Rv2v(iqfzX5oKG3_`Kn+*9;h*4jpHcw=JmOSIQeBp=3BTnDvr{<;6 zWG2l}1@S{qb#WN>5YOHoAl*a&*!I=#&U_ky5xg?_d1EGn1Ir>XqU} ztC)UO~zE5C|CjXbTu%UkU~cT}+iZL3eVhLTPF6c}*rM7qnWZF^yu*$|Ufb znC6XN!O$~M-(F1p46P5dyacA6%mnR5LmGjE^9uZdX7Ik4~G+BRQ!vzc8gw13Q_wN02##fOwj(}q+_Fc z*Cbo|ht1Rfy~q!-FC*U01XoO^rtvc%4FsbRBA=Y!G4SmtTrL{aEF;g~I+=|jqtyY3 z`@!4s2kNBxpn*5_hrGgRY4m4z9~UUDcAJjk?RV%8O23~n96)&fz^~-Ixpl4CYY*OmLO}9!hpJrGWHAM+Q4xou@@nYdotqp;01} zV60{Ms(ZF!hvU$oNA5lazQ?zcW1A55cWzLV*nWH!Y5zAxj{sFQoTdy5dvLzhX=qvd%KG9y;TVjA{wLKfD)*W0SYOjPy#0 zc>n#dO`fvVq5lZ&#q?Z&DZLSA8B)>{{|d|R5i0}AfhNMusD>yR-(uPDt&~oVYqNu5 zARRw*zJKCzM-?;@KPyX&@fkeNTN%I&eusGb6PLhTPhW|?(7#{+yY$FV+PL9G?b z#csvXWCfD^(PRp&Izy#fSw}~i~_B|?6q+$pwzEis*DCMO# zLX0SR`&}=e{Y>5Gd9i--=x!$Y@gl_0aeq8R|K)$bjg%;KJ8ubQKS~BYr_lsGr&hGT z?&gy~kYBUwOD9Ls1qIA$yJUuZf4&tHHll!M*1ARS{hjC@*sCx&rKur1M%OFG)TcID z<6<;eqdDz5(V%*(*Q*rsQ~%r3uf2bCSEKlty$gxlFSk}$5YDPMT3DVwxiNaZhJ*YX z4CxS8qx@J~C*wUDVK+`#*MlE-=Re(i3JA8Z$6?<)3yU#Pe!T#&ngMVq)z2(ybW*J4 z`(#9FEcLtObX9C&**)%yYzHk`!x{m-WT?^h#kadmrgt0r6u;-Z^`w7f*`{lXo$UoSK6Pf z)#H(PJ&yF~#C8C7*1FvoMmtf*)A>RvDJsL-_R99sBCeD3)UPU~mW#_vhwBNI@5d^L zTcf#Ak9ydsWRdoo*Vpg2PITA~k~-$_zAAATPFPLhWLiVy3<$zcP{ zjkd^~-*jI^e%lB*o{^JBEO!oP6S-LTJjmoJy_mgYWnln(8mG-Ah8+_G#dZVvu~xx1CqrhxxXcuG6SjG zhx|se%>h7R_&1>sY}3I28#6xyfg z4{1QGMOGx-hEVTNvS0dVR^^o|TeIVGAD}cSs?UhUMl2xFnq6_As!lxLi1G(7A3|Ro zA|s;2L<*{cj|i_X*ctuneQClXM+w@5=9k`CbDf;pZnf!gV}$eGCPH7yUe7a;uMz@g zfdU|fq;K-)%k`5ZfLM6`M*Ll7Fp={eDv>poDz!yi8Hqg#FEFNn_PHyP^~Ol6H=S!16219yw?Ek}zb9*|9f z7Ur?ZZZZ+}Ut$$Bh00`BWH1J$MjDPM;D5AJaj>da(`!qFQ_)GLlR@NE!l+k0zQP({ zw76)ZwQ#aZPg_dG_{LN&j0DIUklcro+12~fl+A|M#;5W%7cMjhr$Te!aVkHJDUbN# z^ibiArl@>)bgM^aV|OpKL>fs;0NUlh6-S3LaaS-HS5(-nMlP!qrhcWzyR)#RwPxkX zBib1hu{Xbe=dbha-u8K%t#wp#H7O!uySVUTbuKo<^irq%a{=A1SVCtlYYJ^!KbMO* zeWymwOd{JOsTC(eV+_SwncI!L1WObJ`2w0}ggQsmJ8gaSs~`3iEN8*l2EMoBi>Y%y z53gz-Xc|%brJdL*v3g?CL>yoQ^Bks2fZp74n`dwiMHr zIeoOWDW^e4Ri$*~X;`tu1;ldINavmjA^oL_Q)VgE8WGyenp+Z3{naqBH$+~*dc_#c zTnJH>T9d|ot!G~wnua-Rz`(w$)R7jM>n`t~bu`TdLN6GnWiGmJ9{h{jKD~5@eO5?5 zy!uDjfv3awz(Oq%y>NZ~-O1a&URVYOJ0xp%;Lm>WCuyRfQF88O6QHfP|JcC8uH0^W z(zuXTOgel9(Z!_blQpBT5G+O)-#+tDGCiRoJ9#Yzy`0h6h^Xj6p&Sc8ZpHkXmM*Z= zlA)NGdX0#e9~kX#xaoB$FgaB2OU64irF3fY5x52SQa~Mq!U<>o9m>m{3(_*r+j53; z_Q_&~o@XbQvmvZt2k7l^zaTA3?hol7MJ~y@4H{mYY8oMhX(}i=X4?hJpWab>*dyuc z)Xl38xui!(^L%=N(DO!MSEnhU z(3Wv4qaenS#`1>AiLsA4+Ww1YERN8UBR9sn}&=N-O;&hUt5{$+lRGyRH(_kl>P4Hx>tu$k1DEswc zfG14BdqnlEln~Ife5Y@Mt7#;vSqSEYdZ03EO1K6gv$(L&nqXW>U|bDZ<(X&An$r_W z)r4+G#iD-O1H7mMGGC1N6eQ$b(WIX_L-B}8ONVKS^WTaNaJnA%DPCDcekZy)nIxgH zcDln2t5nvcdru4_9r12>5Kz-x3OL4+jYW+R3PMozzu?Hi@`>q6z8flNi2b04{8wUw zGmH>&imGLSMm0#|-F_j0^`~CE;y`5{>mUo_gnplg0_acR`&M;Fnx)l43Np4tI+T0b z3GZbH!u1{!#R4cnzu39_uy@OhQYb%aNNNs7Kh&+h> zc@slLT_M!ZWJN>78#C17C0d&NtN%uE68{uj;)f#JM0OKCwh&kZ@2b zTu$=^Takb3!~#-f6O~5Z^zBd9kq!ejzuIY%l}KWd`jAc1Pta?8giS?ygabf2z5$rtSYMyb;|!_biz;H@ZF2P-+?n_2!iL4f zSRK(xNW-8?K^Nb0Nn6;@FBpRTR2=K1f1aoN73fHotvQG-jJ=82|8!o^s*@HxCw^3y z{NZfHz5a)RmbGB+bJqJ~`>pTkO>y?)q$m=+c1ZZx6q3OyWve#{KQ|YXI{}EpE~O+$ zMjMI>D`B%J^>vGr?ufi0yE2}pXWlz5+afqQ{)P+Rt02W~G&=*jclmBKSkhzJi{4z+LgVE62MewxGsPL?n-&aSV+WV7$wKp_(0rl$O$a~V~ z`!=I_Qk~4M;8w5p(3_YK00$7m?S+yC$Vg!bP2&@r+EP;lXpHe~F)zUjQ|%p~E6F{F ziHxEx>zL}OF5}Fna-T&|H5MK;`bor}YK5KPLr-Q?l~?3({lV5r%Uypp*;rs~S>-Cv zQkaQ;@an)=vQ)rsn-=#IaI8_FR@pRNzm?h2GLOKR<65Ew8xA{ZA*J;J|_BD!gx7B-?skA&*h7v?he)~3Mw7lY*Z}@Oe3!Ub*L~$FD zBWKI;(=H>m)}~ziO%_0xtST;V=jn{ON^bjRyI=}m;9;rUU_fERyZ%y2q2Pr+K}+yr zhV)&uWK>;l)7wcHZ#iWhX9|9qXvHBhps&idNh6oj3@-zZd<=X@PfoD34a;27wbmli zOM)FP(c>9GneP%m`CBpNpk{bIf5voILwA&ydJ%s+>h(L3bUg6QyIMB$KWL!HOSu8l z<+t>c8?p_aa-a1e?{>dw#J2o%@AuGI#b=xQ+Yuz2WDRC1&EdG2b0(oT5nWp!Cg_%! z-d>V(QflCklNBe@@+S^YE2i*w6|cCK!cYa4Kol$VrfX`5;##cIJVLu!ZirSZ z?OHI>#H4na2?5Xpm4PYlp|8hnmQ!Z}VT~ye)`Gc8Wv?@6?b8QYpn1bWg%yyHJ9oeF z{YDbncqkJq0NObHh7;O&oELg$fSXdFcvs&?W3Ypjc8?#SFZLQ9Dkr7-lIB?`P(@W5ymf9n5mz8wteLac2MGHrSz^LWM=KQdr^+33dTcLwBOQ8WK)GHzG+dm$-M`Gk z2lhz9Xr5?yo^&3X8RVt{qU!y@N3i!2KK2ffvBtFa2`tm~K>kN*4z2RQQ6hnHZ zFmNitYY7>a9{-i>Bk!fJkjLMn)L6+($T@bQ7c&EJoE zfx9>{kpCuN->G5&Y?4G3Ff{zYkuV&_nf!}4zFUL%Hon_{2s?&ai3mH6T8kg~0D!4x z>{;1`j-b?zF#gtBz>^h$?FRE6$vG7rREF3f7wpqVGZD1B(+zt)Cz8;Gxt|rgB9`vr zR%gpH?h495!cJJ~$<+FRYrqxr?;oy4LUA@W6tf?GER~C|^)M86BAJBYa@CTK*asGF zSahIm0d?!0kjy8>%^TO!mT<78AuuJ)Do_JIRiR*W8~LHDY6hWgB}?Bx7BYrZPgRUm z{d2}%CtwYLnY$&ucq%pA%xv+2px4{_bAr$cH5AO=sbqqg>+A8e@Wir`Qm3>uA}uV` zLt!qbw%El5qU{IuCx3Q2!LLH5P`?#v;SGmhPHDb&_{zKO86wH2aM2G87QkLQ{m&|9 zen%#itnv03MzZjl3b>)*JVK#6X+h{Pl#>XHDtpHG8mh*K{igOgP##~b=Z8SI83DI~ zSX3w(Y03lZwKuCLcfIRZq-yAL*fnQZMcZi+%G(bPe2U(2_#N`FyMwT6e)vDs@H-Xo ze-hFAh{>k~Wh(>mF3sSbuz_>e*tLjnO@xN~Bwn#lk16F&rX|u_iGuqCexu}T)UzeV z0>R+7n2)i*eo$wSzM%qfh{9{8Dfc64h_af}zZ5UwiTZIPJZRa)z=vc`PmfOI%0Ol7BGL=Qqb!{4 zX&?;Z@s5lauh`HoG(!ezI;uZRT_h#P2O{ieJe;a1IhQazpGH&qBGXkFA(<0ih#ODn zzY004hJ7>(Wfsba4bn`banlash`lRHlj2mV^wxIpZDa1bN0CqB|JTPDYHgDq0P)}d zAs8?SFvkCbBL?GKMH-#Exx;VYdU~3JNA>j0P?A`dtycYFzS&joJgm64Z71 zW)TAe6?z0;5>?UkJjMU%! zFe<}3GYOxv*R*fg<87m>TO8IzI{q4pRIOz) z^tyYyq`s$1O1Y_6!ndLHQ%sU7MoF>PDL*azDI?SHsM^WBV?bH&;DqjySq zxE!gTZ=xOx0g1k=XfFlpMduW3h0??xO5|(7CYX!D#@|Ba8XnKNt?bp#da|@h+u5%@ z$&w$|K~qd&YalHevp$O@nZwj%Ys7JDp=qL#r<5E6;C7Xdh(t;ybatMU9&%z)_#!Uh zstQB;sS59ROC}=^%ONk%&p|~)?Oli=w@$^81O8td{iOSe|1c-#nQmsVZK~cW<<71X zeja1`iwYL)&H>D{JQB4t`WKA&kdUP+9(CorPT&iHUf>bI0<)t+j$F`;n7O-5Ba)hf z5h;5xfV7ka{##)vJ7>a*{Go)JIKx+|q&IUK2!F)yeuUS1h+~rI>9y+Vr4qkk_%M%( z6E;sZ&nl?~pF{9vZ6@SDKj-~38f|LiCKK=-@%xBH`ByM9wzaEs5D#D8bD;k?|NeE9 z0hJQnt(kvI&*%l4YvUX*Rwhf8SAmc&R8jmZ0qp-OYg+Z8W|~4E;;%yxwTA@CRsRiq+s+67`=a#zOqtQ_cQpZ^OE{lne8hp zi!p`{b?NQJSm{uTl6A{^9V<>=%NswIoQ%Kg>%9s;%_vY!h!5g8Adcp5a9XwCYFNNQO^sX` z@yIrLEH)JL_)OGjNIvxUz|^5<7YBW*E^k7@Z8g}cU9VpGD%2U_I~A@0{_Z_c3b-eo zcM1(4v$ZIdI%5v~6Q$d`hwK%7rHbcfB1awwX;qhcgtFyUMsd-2&ElXBB{-1?N)_!(s}oadVx%jB z49I@?Nv2XT_96Ngt>*D&+x3AvFp}f?_p_mB%&nE}He*<(eL(owHGB$XYv!H5j+y0nx76su-O6e>m&fv7)^jtnhY{Py=24BheId!TT~M zh!s7&bFr7=j>DD>mmG0Hsx9TKY$>u!)wWuxI=H6_4`U_pC8@UU_@+zU)4dld92fa~ zQ8@OA2q(Nwi0y|$-noFm(QL`vOQy!e6a_aG3UNI}%J z%4VqZ$mjR7kE#N@Cjd6JgLJ``P4T~Z@l1wC?Vr|m+$>BK3ck40Z^JRa{H^BgpCop> zvg`Tz`yw6&zfEyCxEoSfve&sSn^Y_f7a1mBwOXzvO9Xg!9X!YY#ZnGr^{2lItm%Xu zwdN}^HuaMqTYH^5iWM*j9$lB}*ZbPwDMnu?>IBF3EvNLCSj#6=Reu<6myWHPcKSZB zEG??*`CesduIZ+NRwZlmREGJ^?d}beOM8bi2BNdmENSB#BK29;lM{w|eIe#(@h8f* z82ysqqjH1l9zC>y%z)_a3g%R9k%hY$=7}x}U_`+zz2ts27CrS>^G`)kd;p2~KVC34*zCr9;_c z|E2x|?@!S!Y*x9Em0oiFX8@v;B1KRwqLi(mmaTTLg$p0REzB(%mJ+~H%dSqSMRE4L zwu#$Rcu5f{d|bjggJu~~IP51*1~aTkh|BUZ;V>U2&1k@`cF|VD*=MRVqwq}Eq_)3h zX=#qdU$!6RzkIxQ!RRZYp^^22TyOc)=qXKmHa+Hy`CVEZ#~VZCAR4HgAd)4 z$2H}wwh4;OJOM6prmNBrblIiw9}1*-9zOc4Wl<5UDI%{Oc2(=7Z?*AVN3=)i}3tnL#ZO z)Fag&7Q1x&6U`=|-9GQgf53Xou}1g=%F=|PP88cd4OiCwMubUPrqLqXVHQ7gnx>X4 zq&5W*u!_I+n4T{4N<^R9w4Hn@zMLtaOlj(|cKd7Qtz}QAOw}-Q7>@_QJzvRCyxlM2 zFNK)8A65u@hZ6)0tq_HaC~I60aij?!GZ}OyRc-zYm?kR!D!{ETbS~nEE!7oZ7*$Ii z`be9V+v}FE@0?`Qqxx_C&s*}oPd{brjoBt%vMaZ}!uhpBXEfo)wnd zMR!v647DbhYUXg@Us!pVhV2%H*tNdbgx3Alae<)KZ)Zkj1LYT4d%hxnXjMd>p@9PB zn9m=01dEn5J=&D6%jiAv3PnNnCn)9z>~x-%3yOS(@~da9iS-N5#S>hAr(|6fVD1^CH(Kj;FM_Q2ck+OJr0CF;g9`|p}61~M2_5ge~$xjC()KEx| zqq)0FJ|N+G{)Gh4Ihnivp47Ny|2@9H@*Wf*bJFwd1nM7ol5y8L@qe)bU6*{%W)d=< zz@Kek9=exTzaIv{vtuPtU$9IXYywdu!&1G(7TB|gVTS|Idt=k!gzXr6Or>9q>ya%2 z8^lIwCFjOLixxVaGnbhrIwx;0QL~T&mG`QBxo4NuSY$2U2>KL5P25z$vnV&AcqnJ@ zmVr^W2UVQdtGF2~GiO9zy3n)Z&!!+D@s6{1IN|DhZ4$7od2`(YA9c z$en+VHa>G~6U<3FCu@QDij|3d__7=qWmAfQHeI}v+w6&fCcZ`)fgZcv9|=DmH~;!| zkVQDJ6XDY8hq|Kdobl@D?OI@=eAgTYdrCnaPfLkETFI*rnFIK(Df0M4W8l5J|( zP>T%aZB2`hGT()+6S`Q32k58!R#I7moLMe+upWk&@t-*;Z!eFTpKa8#?haus>|7(9 z$4cyE{Miaqa`<^8Ct))=E1TYk; z{=#(Q?FI3I`X}ZPOPpozFVW?2k7w_Kq`4oj=>=oVr|&;L zgJ*@)wshIJ#w`?77LsJ7`85v#0I{ChNQ`T-Y9u^SWzMF#pvV;ZnDrncV zXuM%?=38aXK;4r9;C9aQ6S`z<$q!Vlc4B^Ue36sBQ_kw_P>j%s+QB|{MQ}w9S12*WP%b@j z*7$+2UKSLj?FPs8zzkky=?b1j2Uo+vn`H$DjYOJ|kC&XY7BAEm6Z!gVZ-H4#D@^I! zPMZquc30a2V4nD7k;o!!BT1axjxTx_;xdL(rYV4HY;#@ZOM8Y-{L+P;Bii{x?{!!C zn6CONsC-Pl`pm4YfnKh}8YD1DJ5;cGrHy)vyM95E*Yt1hn1a5)=K97h?}*XPZiT?1qt&h$a1D6nkZ|g)yv3liIc#%B)303&gfPg(0;` zO}Zq8g;#wBd4?(B9{0W2Mw^c@Ys32%T1zG}hg?b%>CPgx>0hVUQc(paG4G%fM9 z#TeSX#G|zN@Qjw?I4C7hj2^MI^~kq2)cJ$-flYn%)b?#S^9?-NkZ zH#6;Sj;Ucp-)nj2g6A;m$_)AL>Clzt41ZbdNPMRdwk?~AvWVtRllS~5ev|88y97O< za&K&n!e_HH-dm%f7hgBR<@>EGIH&vkY&B-lKm-wV3tDuhj68gTZ_tREGComt!5QQ$ zO-1Zn(4b`~LSD9z{tcjY`SEW$yY1-#-9>2=URw%YKnth{U5ne;hrL@Gx z2<}u=R1p+!fn2J;JQ8RzB8itO??$u zh*LFLgq5_az%N9h&pKWoNIo12R@bg++0#r{!M{S7A3569KPypuDWlzaMC2b-1ycAb z@Ch~|B%|jmw;mRebr~_qf(=xA_nqiK~n53IBO0mwLuBZ@^Rk-T-gz z5JCcWruUD0o?AyPenkx=+E+K5$Cffk7K=XN_>-Yomg=fV(5xgt20RDw_520&O5az5 zK;9#q-UUNW2O`5S-8#rgbn}6`1*}AV>x~$)Vva#qIBTS;-70XL@%aFbiER)Z&#;g! z_2lCmb`>y1=ghwaN3VO)lhPyl?3e53LS;eGw^BQ=8!g4!p;q{=UicoaTeyDC#*O^K zAUo3e+kjv0p4HMldL$NLe+UF;n&$z+>q86x=RL71_w_qs!ONo(GuaL;>zYvWPN^9`shTcH;n;ia8%t8V(vk@i{3|6G|M!ITf zX`B!YPHJs$gVDaRY3jVetyI zP%TsP^q{7eKuG``WpR)Dd=jz30t97hb80uFr=>(@p%9)j#S$I~_H=*b^;8Ue)X5aS zI53Z_UO4&UoxJ@ccB4g_pcT|;EG!;@H3MyBVVZOm>1KFaHlaogcWj(v!1fF&Aa|Vo z9xCFVfU4;TDPDA|urD`x`o9rjeKAnGGfRN`B7t^Q5UT?&4~um-IQs*_oYr4UQ29TS5;T9$ zhNLLxxCN_u;t7U_HZvitng1SGK_0MP4l@5e(fWPh&P3b&({{)2`$Sju7589;YP%Y;c)&d(eUTFS z=5;;K*U0O@^`g(Oez5uDRlfuNp!0_B?ZjuUmv?PsEx`K@@+s*5S&s{WuVfG%fR6c= z58?%2`tw+byM{xB$m#C`szI<{D^%zi?OQef8xATsX3;td3bE@|lvH#>sKLn_(;6Vm zU>XsI-z6y{%fK9?_};z5B$z#&EOrFsg0?Bge@!%-|Fh{q<)G(xvJ>h70BZY|z%r^B zBq|J%LpdQsYb18`i_0ku2Lr!*moi-~WDEivbfP6wPod|XZy#vzR6>vLa-l)TsWhU4 z#s?lG7e1ojdBE!&3PJXOEffzDPb=JhBGY~=S${Aao}1ka&&Hbq{0py4G-Y}x#q_Dl zd_%Yxz_Kc1s1R1BKo1#`L1-L()rEQ$eG$P&5|0H~g$niVt5*Ap1brDMk|0Ct+eHBj z(IQJE!$L*i;-6$7$G^;Dvlx*)BAD$loC3&w{iH-YsXZhGdx52h(Q^n2q>&_4H^SP5 zq~H>w9VL@7PvZb_^oeO_d=mTFCueXL2n4(iD6W@@QY3^3`9KZzsq{nbc0%lt*2@?J zB=2+AphM4x3F@oIKCt#g%{J)`JpCh{#481cI;wMg{8{uBLVL%v>yk~ zda2t>l@b}X>y1+!`8{XGILe=BnWA=Hs%sgB=~K;!zlZe2R#X>n5!{Q}*b|@k0NBzvhxZ@Ej^w*=(YO%k9_D{CLtiyTPS8WMx~j|$ z+Ml&JbZY`3hz7Ow?h2iWlPA(XOY?xKB8h|Rn|hJE#dSSA@MZ&d%#sKBcaTH}Tq3iM z3?xdLc&w#;d|PuxYrk{!xb-^D>jpx@3#{(U1kriVAI?+;WDdb6KeFnlza7XB*!>{4 zWTQ0p>gIQx*Ff{}Ke&9O;YcOOk3baZ8LN?Ed;<9YryI!IZQ%j?u`r>52LdAhZ~PN~ z5*+}*Sw`bCq9d8y2OpNKt4A4zs;3=CmxM~d2e4_K<%I zUUduyZ#Xj13FhHG+lF)3r>Ifq@Cz;a69#cf&*+U$pw&`x!xdNQsgSSGim~9We`XY> z2%bS=EzDJdsr^i#D6;j6Fo4E%9a4P{j3~wKZH{g#_uvV^AuW&rR1VqDBiymRD-gCG zG=W?uo2*3}lG+<$w6~T9>|H$M-?uG6wR`+f6b`vzxl$7Qcu*L(VL_oxbOy)>^R2yX zT|v3KI#A4xOW>}Gk{g!gd6>w)GyJ`M43gtKxxlafVq+B|LX*wVIHsKQ6K z#ivML4!H?oUTZzKl~szSYD?Dz&f=vaQN^jMb8-cHg(ccXM28E@K)pa-(|B8WMG&^F z__vLuIYuh08W= zBju=T?`gP=2Hv;-I#qZm#1;J{2QQl8a!K2*$|C>T`6!7BA!Gp>B&2uF>{cD<+yO(aR;2ll@$BD}mC3O%_mKBqNOS(g5NK{Ez0UcJQ58!{a<0OJ$ah|pJmFs)( z6cKeVJ%y5Q)LGhVB?9B1X780Dz&@lyXRZd_AhruqA88@St$s5XP#@LVz>#9%$$M)$ z-CfVzYk9KT2E(n{GEe3=hLO~qjt0LT#B;b~`L}&qwSytWB4#prhX(x6L5n_}XRjTN zm)qF@BTEdo0N^#x)DitUAK2*t0&o)0)iDc_+EZ(*{uT=B=$=P5UpBp#m?);;%CGZ^-mpkN!S(J z2!E;+5|PoKB&TdZPlOOheg!cr27$s7QT~ksQFBkN8o(CBG1sCTDBAc$%}t!m`tV{= zR!|wTAqT_r^ZgdqAQ1%aU`=r6}UW(-jm{I)2buRh-{}n4nhCy{mt?6r`?$E%gR_7?#cJZ`m$V8j z8({8PVI&V1G$~gU%T+-RX(Hc2v)cut+Z{C)={Jy9{RL{GC;^7kEtj??(FX<+QfeB! z4i7K)tP&>rl`^q#P=Xy1>NgPGdH9&U&ym)#()|P#v#`m*lCtH!Q`>nWUJwKF8VT4J zCEmP|vwkY>z`J%9_pZ{|Dnb~ibJOB`0IE_JbkANA#U}*S^uGD${}j>0$>;ytxj<=j zS=a~r|5eZmzH)@RAFf;Ar;7d$)!p;*D=}&n6_9B2!*nB#n&m(I-ItQi1@i_$vq0D_ zf`%rBl2DOB69GrwiKELplxR=rtR(lPmL(+n^vH*(qBY!`4dm+6$gix1L!&UQHBRS$xI%PLOpNyI zGN#q8*ZJg1Tm^$yx|AsoauqX*20!?y>aE8oYW8?{x%aQ8POZvw%lUG3_iCnHB>=)$ zKdnDaxMTMX*sd9~XomSA`4z(0V9k#=9VDGd0w=DJO6mJmg>ZD3#F{V zTMhTkocOm-5c*ry4cG4d0ETcb$nRruo`6c7DV7J0>D<04>u;)|DeDi^CPuj+hdVDy z0x_*1;3khSgQESoADERfL_jdl9)PGFigSYXyLE^h-LnENO+fJ5m7kU#3}esV>DC4l zV-M}(s?gTy4fO#Am2XNe??{d_AJZiq3U$7FZUkk`0gaSAP=;FQYJd+-LI#4WaO475 z7(oO_o?3_%%lJ2xqaIwrIH6Nn`2)~6bQ~4gSRO2MEf`g~5QIsb*b?m{ko-7QTmv#G zQ6R5cK$>M-5Ntz4Ml(L42QYIrnB)YZ3fUMan}j07y5MvsJ|Q?TGm53@H}HS5 z2xvd+L%2T-Ipu$MhdnQ7fMm620Ln4ecMjd_!M-{(gf%SEh+mvFEEptB(OTNxib%6{ z7*REswAs7h3RNk}Kh%u*1?M6fn~b-FMd*dJuKs-wC&2QQ{)*GD2wE)cZEj0i30R0~@ag00*pV$lYw_?c#s1 z+tqpK@|01!Y zVsAba$N^Dm1PHq*ynuvI`QRJe+1#UD7G{2&fn#-ln5i!haJPM!syz&kM>1U>uAthw zw^^1!80HcW-<)xIz*t+EK2OiYK`oWUK60S0Dr2AqxZ2GlqHfY$T`vz8=iC+(>)O^1 z2Q%v&O9JMJyfYjuyfox9?y8*SB^Djec1{x=2~UsKz=s@5W@~emkHjRZGgPz*5Z-%& z4t|iMq2bOyAp{2xEG7^8ov{>~4eV4NbUP zRst7O*#V{c7A*#*r;1x?7V%m8o)g=4>Z}Gw3du z8a(w39F?bM#gYn zwLy<)ns1%9gG5lsI+f3)VymY~IZk|tbri6U-jmtsZLDUeT+<8BI37|}^B{q+8X-Yq z^KdbKRkp1NaL!JGcc%SP$-*iHlw#m_%tvFQ(yI#~fCbzJW@jQJ%hMnVI^o|b$QrBU zk*;y`TkG2Wt}$+tFCkH>#$7U31gkc+o<%s>N#MG|yl>ye;Z-mQaX;chaXWf?fg)S_ z7MYRM6@v`+)6zpvwif9|>n&slX!8|L4XtC6z$8Xo2`JfC6iS2fGK4R>i2=1A1Ypp0 zE{il1a2)@>ssG2ODssDO6GFg8rPZ+XjrI5XuG6(#{K8wB>e%LqHqSNWX&8g@*a89V zpZwBt$`}dA9AgPAHL6<5dfCYF-Y0F=)GbsW8Il(^_~~)B{o|wPZd5|?clizZl9G3u4pTCvq@qGH)F>%tHlhYu*H0!x?XyaN)U0I_FdF7?Y&SWdV)6^wt6g$4j zqrSMKCjZ!3vGLO@xV4iz{BpbELikGCkeg9ZFqp|Ahq4;KndR_?Z95Y(Yj+;6pUdBMV_89_X?gi zdkyKsV{B6jiY|a9wPXJ%_EeOZN!1}}0Q(Iwll3CTxfEiUTGq?CqVixsFTy~yND=?!-ri@mBDh0YVTywN``5o4vfEz$9?*H~foDwiFl8GXJjgpG4UyrUV!<>IZP#2_(q zc2FC^2h_aG9ZHPoh~p#l9zCxgM}lsZEaXC^dCK?|$2`4YDanveRoOV`9xO4~?oA1n zbq_ol`ZjAMUFfkr;JHrSHhZ{bV(N?x?d^{^bP}^wb7erLh6{c=G~lF-IhUMRtHBX| zBXk_}`C&xMtS-=(he7akzg-rrDaCjhew6uwOJHPCb-cQ{7& z?r!QRAHFU1*}}mY@h)A!_wF~yf3{LfCXp}%Kj!*)KOYHD;=d!Z#Az55qyuW|X`1mV z+2%u#|7*)H@dMTU*!L&u!D9XVBs^NWX&3I+__*o=}4{PReo>HR#3 z_@`Kj96AVz@LVv7dZ)0BXXp_BwGe)bdj|jiO#MmGOuZ6M@e}}jb##CJAYO-|<cox7(A?-bQo2~-Zxk4RjZMd7!uZ3lOYE_#EW}dx>0rH^q>}}sJOuLPF1(CidbPwldzP;vZ zO%;LC&J1(%@vcrywT0^#us%UFn9$dSSA3T`=B4!-Cu_84>$qLk_;{q}gm~-w$TdJK z5pMwaam<=T4xC54Zo*Agc`$*#N2seCv!%`(xSZmzYjYkTJ%soYqOqs>Ha8%PPoV9` zKWQyJUm{|QIby1F<|z8sNY&O*m$bn^TJ>dMHWcE@pN>sq9l#MOPfst*^Op0R$0EMyurFYz=n{2*p4)aJtsszi1LB0NRLyRD|JrP9kw`&ndF1O5)27fOHK&B;IAO4q+xEM>c zFfp1)2=G5c|F;)iwk(T2~?1O*C6WJ=sJ(dB@)e-0F^6l1Z%f&vq;2}$R;+$VPA@TL@ z&$rAXj^mZcyrr--8;`PD{QH^o8gfZp&~B63KjsqAl7LAIM&s-52bj#CuV%dUd*K4h#$OZq^-4Ck zw*~Re+D7X919+oGW&!+jt|iNYIvn0fbg&~8t#mX`BI1w3f|;{P6^xOv4VG;=VjQq| zKisd;snuTd&2~7v8i)H@LIhLkz9|5`m2sBQqYA<}jdNz5WeUHS?c_dMKqX|p1&8mV z2in0GmVle>4Pc&TPVi;bVdHRmf4F=Wh^KeQ?ACfIqU*;D{h(cP3Rf&H_=qa0Gxu{c zpg6QiyvTypOs3`6G_9|YVX87*H|rCz5KnGlWc8pv&RD!n-f0Z49Eg8WT@=8#bdEsy z*j!atbI&L;nHXm+5>mv9iM1gM9y5>=gBgDjJ|bq*jdV5g$c$7uL?;&>hz7WB&e;ao ziRh2yvE+h8kDoM=CsWn>pQSyuqA8z>eAPAdg{kl&%cim4iCJpFdhj04BD?= zTcB7qV$3qloK&#jqa{T&nDCs;*if#z#hD;79TeFk{CC_U_v=M(&nyn{M*$!Qix0od z4M9f!*I|&TNLiGRM1N8#fa8WT;#W-dL0iKDcZnnp;XjB{N$+qctIRbE=>*+y9E?qf zEXPE&<+A$X7}~`ikk~%0q#vO%^W0b9E}lCo=97f2;i}vLWA^TB`^9?W`(-I#<>!5_ zo-Zh4XehIs(JdI9G;>JZSbQRpfyQt2)WNoZN?d}7Y3R|4Kb_1>s%O4FBJ24`+6oi!U= z3%cwwgY5(MP78XUE^umHTLr0^e~sf-s%)}%lMt<0Elsw1N>eIH!;k1>t8FVAHDO+WgT30J9yK55v7BGyttBIgmsPp`}6qYlig#}H~ za8}-+;&p|cJa`E*nA7s=IhiBU(n@?4KWnutsmMr{nXiXyOgK-Hc@?>?lf?|E&_P;q zSu3XuW|q*D~KQ^>pd7bFT}o5MCTrSU)(09Dr~v@Ma?oR$(4t?sab(#YL(Pu27nZ3d6gd$iQ5oWetY~7-a3XjmGh#m+sy9fM>oW z?X!TBSu+iNyeQuQ<+9MedUn`drLCYeN}J~JT}bqEML{X+F_9v;)fuW`vu!!o2rNIC z;%8Z9M6o%M0(8i_(^CEF!*Ab)SVay9HDC_KJC5wVs|Ce0+?O!vUqhOFB?Jez5Q225 z(J{WY98SRFjvWufEzd9g;Ca$`zN|{ck8*3o$zw`~>b8}{&K?!UD@sluJ%9Qv{8ev+ zYmbThW&0@0kO+TDSR0TZB4o>ea|e2HGD*!%OY9dUAO$SoRu|FQ0Wo)%-L?08WCDkh zuNu5lO^&3NB;Qf4Ttg{5rI?@= zIZTYC&}D%pD!Amx*d^Pk)r7E6MVcT$6em&QiuB?C1l;wbq<0uOnjb|+G{v}~9}hW= zdSH?QwCvWDr6fe{f@axie!}4TuvU7-NsXg!i0%B|69>yF6nJED2Vy{)kRn;QPJ0}p z=n;2DaHNvlun%}hHuJ)y6qA?g-BYGYqvsbl#t3A1LZmAeFH+OA<8uN<{h~C~<~}p+QQUiaFT-X(n5)(H zlfP|2&lb93VLkdO12BYg_idza2eb)G@UxIg@ra_iT@dr&W)8m!a%c98sQehrzZ4U` zasQX2brW@^rtA;4ef@Lj;&-9}8eXEG6htB@6+OW1z5Y+D;$&z9ahQs^5V|{4Nl=-r zOvX}dQP6Wf-q}Cb)G6C=!0>lpBtzPZzV{OW*6sex6-1zz)t<=l%qG|Krk9+V0O0!u zsgIl;rcQxMe~OlClWmd@N1D9by3o{Uc!Zj$x7Zua28DTYSx2}9$(hWcpxFD>du}Ju zQyg&Nkww)S5Od=ita_A1-Z)Q#hJ1uWoFprdRXHSfDnwXkOw8V_*`u3 zP7F(i!D|8Das1SD;<<3?K4D_5_oB1-SUi`%l#G<*60j96&pWc`YiOwXyF-EagY9p`pLF?>!z;}ncXY4u#ATQ9XO*+tY{vGJ z6x%LE->+o42p{Ur1>Lrsy%J+%-f96dOcAMOKM&Vd>i*f3P&WnoUyYScNMvGJwwgxZ zqS}x5V{899w}&d;DaVyDoPcjB5zCZZ8&jA+eF#b~<^mXf z`ZJjrj6Yyy)iK3pZPz}69nb(y8tNky{9N9ST*#x^mwZ)jUG;ws*z6J>z*9Z0Nr7bY zrsAW5E$U63Q;a-J9>LNt+grz`@iKj$(i+p#%B>L}&^)-s{CoQI37D+t%4IaBZLwJ# zN||f!X7;dfwFg~}(q+lH5BC;~t_%Pqm*0NZ%(#)w$?{{>ch_LA`@Lb5AwO@-r6g(94E;)IOee_;Ksn6}4OXuq-G;^e5PVPD$PuiZgQ% zKT-sw#9bkZ#I|!>z_j|Q8;T0*cQ^ZV(IT*PJhhmE=t+XJe*llFl~`4iST#BgJ?wZK zd=ZO_=|TX`RcBa)go3?@0|u{R)j!Wogzu2!7Y=vMvu>8eA{!8k*MrpO?M=7mM>4?2 z{bMVT=5274=O$Spu$y$7_-`uqBoxto6A}goUF5Els18YC0CNB^R7jNA8f_tn)=N@^ zejNxo?QiS^g-Ea0#gu;&Wh3@rB+Q0u)J8a0`XFJVXZy zy+1Ma1a$o=>U0JYW!{p4O38Rh^3+9Y4AQ%6Y|N>5&9%Y|pkNu1=iI=#DtIf37A*}8R*mdc%|$vS%L^u)^jpc#*pf<4 zi|kCgyoa8}-`NXO#?tz3IE`8sX(1cr_IbV`x-?hifW4UX^jkO|kbHO=p_S}mO1{(n z=nkLC7ACQ{3VNEF;y2cff7d{mj=x|XRUWYyv6+0T$vwXB_MlP8$!5n>)@>;k13ONk zwY74uw?ooH*b7WvRSp|b(!|1U>9+p<(ciL;2{!HIds9tSMpD-lFiLMs?C=UaI-sSh zwrd+?0mM*-Dsp?3Pf2r4XiwtJT{a7qQ;O(vvgCT4CSqI?(vWr$8iWR6fcw6GA8R{Y znCR-JSnEtoGV5x3Xv|DP*9=oV375*?KDheM+UTOjzv6sneLEl>em=R~;tQOmtJjD?*aI4)Lh9IZ9zI!UTFB;y1rtwH572oQjO`vup?AI zw&^lDNYt&4g0u7C`eZ8;}IWqD`%el*BMsr^JkH6&w-&ljq~Zg%RJ z0#Z-d;!klT?tljK3&?@_5t6t9S#iYh84CSZgIIB#Y8WD5LxzbVeC3E$CiyOZ?0N)@ zuupa3?V;tM#)0D~D|@KNRZT3W*BVu`BDtt~gU_9%fR}*b3PjQ9E!C_9lLAgO~INbk&N=xLhhBS&Z z<&woFIx$9QjQ-i0)#X2)GX{{EHoopTDMyO@8OF%bA2vgU)V=Owx}4o~vtquz}bwS7#@#z#*iv6Mu~EOd1ITIMn#9Xw~7}0RE7J zJ?OD*AaWu&0)A{3&`@XpXJq{R#1@yLQ}TkBTbuHR5B+f{W5j;G9{~8iTc^b@&6?QF z&g`$eGzf-lzWUb-Sg7YcUQ%tq-QzrputP-IQBnr<@$HF6h2_>se?%$V!gMG24m#ZO z_#y-TsW}YXt0j3iMBcSz?rBHtAGG67D9_BI_#;nFZ%22HniW^1C-iwG6!OKIf(d2;G@T;;P8gHVbMo0DJnHyKZ zMEoAP)SbU6Cvc04Laus#*$yY4g)w^seruy=UQjtCo}gCrm*-2b@bZ}XKMuwi#jY;Msyvt0WO}X z3~DA6lOjW(v0n{iWh&ze-HxZ=HrnoC@kJOpcnHH6NFeEUvt{Z_qhHt zx3||9G;KH`2F#H=VT?kOn$ks69GYW!Jt`r>A!$F&WG;(t)=?C<6*ENdiUeQJ6|L_aRFWteWODoKnvo4tsW14Oix-?*4+Jr#t5Twr0}RnA4;S-8^L6WCN0F z^BhlPO^&iu$GCuPT9G6}o47(lvzs>{6T^lcdssz2VMEb2n`pvBqb>mS8b z=D`C8ZOjLiQZkO|(UiXl^Cavn6<81=WWRhA(l4h-J`}(2>I3<^YfvLbha9e&c)} zu9;*20~KxI4p&t0+%RIrAxtMA%*X1UwF9ALtAGA4F5Iz0|M6T(P?i~LE_0v$*RO(3 zOiGz+;dfui=kZY!kU@4^#vv+63M%0{lc>;tUIqb@;3c^Gq4~KyjxsIzBSlTP($XNWSC5k;4}tcXYVQlXbTjmgxN3u3ldWXljcvnVpAk6a@cDlO=8!c zASrrj_eOTkrOSOTwQn+lk(gO+c%pZ(rbX3kbw;yzLdcL$q<8^}Set-kOC z$VN)17kL|RG2?ogfXC?3T;InZZg$yVAGQqatdVRB?xS_;PCwC6lKpD2Od#v>fgSwQ z^AOQ{6b#XN9^61d+u6hVl|?iqrbE7oR+Pf|6kUYY?w3&67azyCJ zg2MJb!>(P%@45x6z4<-)F=?#QQQomszPrgNvpPLJJx7PnH`1Mi()p-&b?smUXxuJ# zb*!;wq)*77E&ffgfCzEu4O*U*<$f20luv{WG>Fw86$H7Mu|VP4@BD;D_uVYwbtDx2^`3YLMFcy_s7joTofrL}MQqF?(#Dg8VAT5Rl>GgY_Ni2-BnuXM{ zP$zQje?eVoWdEi*e^PA4Pm1OEKPlGC(ZJX`(FP6azo%OQE=+*(eD0LYJeUyN2#!iguEf>@Q)TV+TI z$%=Rd%adIOu<^iwl>lxMD@4ij3u3Uk;%BwJ`lx5OXa1S)4pue0!}jvDX8dxD>g8G{ zmZ;O~ATvhCHAB3k@;zpfP|bS7elq3C1A-`}B4*f9e%!Y*do*e@}RPJADMSNVCFBY$CCczAAuDW=~f)eX*b!< z{9r4vag4v{ZqEqO9kni=NfD5AK%*-~MYlPm+YF2{J7CjuS}Zs%SFP^z72khlCpqXI z<%>D?VCp586sIlPUG|H|c?AB(`{pQ3ju{G$K;(qyrE7K@tPTpd%+8uWgU{rm+-i@Y zw^-cN0Gk+|6I0g`}|`qc4Dse z=9@2FK2@N0t~WX9D3p$%7X*glcQl4eC{8dY1t_tYNqCcz`4f3Q+f%%U7%Utj`XOx+ zjk`w{{6i2;A#P{(ia6j3YQ2Chmp^IuYg4+guZB66aO!lkmEjC_c1*7(kR<+!A$kJ! zcw!mrz-1QKXm`bU4#=+h$8W*Q9QrFQZ;cnvI)Rm_Q?}C!^U^k1H4Gy?eI4cj?Gyn0 zs(Fw>Vme@~@pV9)z?KkR#$V;-^IN3vP);drghW$*&%tlD5K#iWRZ>o2nwe5@iSzVf zvSeIohdzi>&f$Q!XZf$OjH3WvPpbWVJMdn+e#)1lAIFaTdOA3(Y@R13cfIQ z59Nh{6eOIS-|xD}!Bq>htaXlfsXS_f$+kCVQwUhBZQ%u9&fK zADb4gk((7Ym=cC5b--qqr*^j{#0wS*e+9E)as%)|(#m_aTGh+OB$)}U;T+i5}=H$xangkiM>M+DIWg?U*S{a~3Gl3{7} z;|&e~o25K8YA(W{v317(xJNKCx%B$eLI9(%#ZI@TV;_ThTbr&IFG;6kRs~)Nr!~i7 z?~jy62Dsf$`*b1s@QHL?r8KiRaHF-zTXOI=C92a)3%9nSjB>LKvhr&Au8Is6sc3X1 zY*aRZd680oAuOOYe@%&yPM!LcnK}?y%ZI>^GotA~c%}vDrU+(~W0JqSv%r$H!2-sz zB?b@VNEOZH7tM>qi{NQ9cJfRUf1SJr)Dz6H!^b0AGOT0K{hI4Fd^pLwUh1bGrXVfF z_a9~*A2i=gnO`r9P^c&F0SslIdsXVrVu#A}ltI$2s zv>5wL(_b1_GpH5LBas!!r0?{7hfl=e07P7OUkT2qJ8{8vWj@qsHTfY2-pk|>9*truOd zfz5_vlZ;xYhsT(of092Lt(E&!-Fl*t7?|oZ94$wk$otS)4-yI=V#9uszk)F)V4?Tk zRQ+=n#<^HsoHiu>e918F>{EV@%z?HQ3tx0L#P+XoEsJ`dTWO$ypKduceQ>dP9C0Eo zNoHC%5I`J$6tP+|{Q!F500$4qRzHX~@op$oKqQ~HPK7tLpvS+YC%D3T>Jz)VY+dQ3 z@C*yNE1NIziVE5C9drrf0wkOmke_HnT_74gdfEt_(?=*zJjo_=&wtP!gG|teEH4(6 z!Xs-WywDlEfizCHNfe9HP8PLGzdS`8>UB_l;4eoJE&GH9abD%=899O#JE}p}CCtvI z^#NuR<9mE!^(~gD94f3ilIRf6*1(INq{Cod0@`+v+vg)Q-xKf)i9a-yDn5Hew!tXr zS{!)rKvu%NBesMpFRcFhKf_gD)>kEQN>mWAW4G`J^-GQl6~@VLV~Gn5i31a7xf?5r z99dRo%rszqaGQRvj{b0E)Ajc^g`W5P(64WxZ_534y38#?p^T#U8hulsup zKhP!{V}-_e5xUq>_A_@wgHhqYIImqv22aT`){IfGMw}?^0n6FMtKC=Qe-#LZ|C~wy z3os%7Us+cj7gg4VVFU#vq#06Dx`s{x3F(k-k&=*Z7;(F^xjYjE=0;LhH*HA*{0Gr{Id0lh zq~_~~{T^KE7S=@_J)Rlad&2W(y!b9Tq73fGPrSp`QzN);CD9X8`NuRqB$%XVf*d>+ zYL2(aqhV2t6CEU!UbxG3ADrD~fW(d~Bj_PY3uDSoKht%~8nETf+gWn9g4XKG(8h-c zHQxK_vmmCl#}d!dLm`YPQ<}DAU-h0Gk$3P5P|W`WFV*Zc#FgLetIzqkpcS`+xC%bW zA=<|SR{Px=LlOho?QDDVtg@N`d$BJqJCry>bLNkP^a6H5zbq}5@F~RwTPH`@conuR zY|`DX=xfozJx7?W69+nl&_lyH$_IBZ0}o=UZV5=biacf{n&x6css0$)tEe6q$!bsd z3Rf4LTCd&f7yjdze9%C-BHU2XG|2@KzWmRQA(zNska}7_XqAZ$A*=7}4-iIP` zSoYNJW>xU#S_~2;Y5E|Nd=OrN;m-Q}U6O4o)oDHZX%0on0=o9g0<&ZsI9$ko8xA=Q z>fyle%ZFmVrZBxL=s35|RZ%RT1tR+An|<%S_#F};?yo%yoX40LFapAda$Y4K&Cs_s zGwMvZR7_0~^a0{f&LG6i>=$osz2T`YLuyH&fRzN^lqcW~==r>oqaKb(!LJsQu5H7Q zyBB9h2nsR_M+>fdb~k87rM8WrXP01l5Me$OA|8lCYmd_19q?-*ZDe2_9C@McsphHe zuI)ZCHKA5Y<$H23P#=2ugj(dF{Q0FWf6G)kNtVr72riez$N|e`zUw&z=a0NawI63V z5>wgBcd5M3G~3Oo=nvNXC|gJTw!3*ID5pY+bfeE0<-5sxCpz9+G8Hi8*$mFY9D(eyR2ZPlWp!gehDeo#BoX2S^WbvQ zDKrab$Ydf0ld{UBYqzUfS+x}R7t3>yl!gp5_1fggbK|0UgLfS64ww+D;Vyn#l9(#1 zA*{}&$lP6raXWeLQAJdx!D^d^O$ds1RYTh*cq-=Sw40cc-|8g%2-eUrocSRB82o-T zpCZ^er`HavNj+o(vRI@r^bh*Xb z7qW@MB4oJoo&upBDaCOOXnp5AlYU*^&Xxmw#8f=ct*JwGv04uM(a2`>Yz5|Wg?K~F zKG!4m=;~BO=Z-L+-Xl5D4I2LjhO6mN&6bsI|?q3>g0+06_QmFe-K1N|1BnnAV+pl@w9#zXJ`52Ar@Bn|YEyC*I+O$p4L=2;ASEhEKd*^__ z7RDw{%BI8%52orEjqHX-$?D>yI5pn) z(1QwPuq+j=0ACR+W))wc%KjWyN=Rro0kWXvu!h_HFb00ervz`L>PQ6YEWW~^> ziB^zVevVm}%mwZ@8=r=JF5}p`1Dj*50UuH^vi_XA-HD*B>G#yvtNWA_6-&xHWT@2_S5v67sCy$sC{S^J z0HGRsLJseprZ`fKyd;x7SbExN*3-_~*;Qwe!Q@N)OF{?DmhoPBkvN$Z=1fzF=hMPQ zOIwRH6EO=PKRIV+6H4sv0W+wbnlszpmxvjI50z)-F5l^47mq$j?;y+=2vmsf7#c>u zw{4UE2L&gH`eI07Gq2fB`_ziF%n6iDmg$YXiQkXa zlK#!MMBmQb@qCx9HwaCc%=iZzz+Wy5|)Nm8(l7y;pt4v#kTS zir2p<$XnqAm=2)W@VG+#TWgyH#NR7AN0p4Wc2*9vzV8*z&N+JIuJ;X1`)%P?cY|bF z9m1c?vhOoqMK(=Zo?!zq?qsl~Dl_uCGkBG8SXw+uB=|tiRk!WDq}8XNusk4!gT4k+>QI1ko=5eOPtX1&FDPX?t+^|^RcTPT5;S1!v0 ztDDx?WtSB=^^pny)(MfgY|0yf7dAOO)YK*1&Z5_+kNT%x=Q@~<7 zwdAyJ9%OM5RpABJ$ zQ!bDNg1d~80qzA4E{#ax;TvdQJu14TR}yYT<47T~OQQs#_46yqi0#>Jq=G9-zI78$ z79+SFg;1* zX#2OK9V3?a@N*U^Qg=Lm*x|bfFS*R1di9+zI!K^=h4gs0Ej5M|4^b!I!dqQZjl)i( z_FQy4(LJd1$74w>3fm@jFwy@ZWz)33r-pf;ugt~{MP0V1lMf`{>7p+A+Fu_2>-0yr zpcwJ{&vSw{PbE6N&J(8Q@S5tjZC8$HO`TA>P-AS?yL(mKGSiraR`-+>;8B%>B-+>Knw)P;CE}>!qd#@ziDtox6NaCV~EhmqX^Z=;e|GdoJgzl9GyMys_|6CH#%aghBf` zPkSp%F4fZM7qSsic@H#NPsEhX2$W?BH_LF@oF!(DF`nM4UIrb#1?xVgA2TDgaDY&E zkwC>_?;cD|N0~0uH7fO;mf>W*NADhCr8n#Is_bR4NqXw0z#@WFwohUTwIuXVc<^pC zjI$0z+OHDPYtn(#xD2>0iWENT>92jV&>^@YW5fde#D54bflDs?2*W5`U6S9hp3rpK zY$Dt7oFr!(xWRz=GNpKo#$>wOAhz%8dg!zpxo2ANor8OBkrq4wkK)9hR}C5*yM7h3 zeiEh2vO(+Ox4wUFJCirvFHEz!qQAY|^AW+4;!nBL^)khoaD`qhIEz~_ukYs>3;$rJ zMXy^;en8jAa=LzCum$r}eBR=7oS!ev;$S?T71lA5!31$}?=p*F#`5_i=IkN^HWyHW zyj4or%l1n4nxIY0xU3E>T*|@47-_8Hf$!KZ{U_GhpNpSdR`U^!QbI!6O6Z=&M~E^n zsgmOB@(5&>%SI#t!AfU~_E%A?_!9+ns0$BPCcUB?Wi#)j^vN#hS2agHQ_V~Wkr)_i zh1oU5{QRnYWFGgneDpSLOsN}pz8o!7OO|VB&hsJ!5u}&drUm-7_+V9KsbKJ#X?v~E z%eBU!wdMrt+@lPY!3Wu&g$KW%O(|g?F^g;I)r0SFupdJR&-d9mR5P>1$A-b~Fs()5 zA@w8M_3{05*xC%%`~i9{l}5!+JPW!M+(q(K%1xqENMeONg>#|bVd!-07fC+}CCEW&8T(y4b(F<Q9M*UvbjUok+rV+E;>*?^^r2Pj6p@S<`d~&xNs$ zvz2qve|^<-$6!%W)eGc}+Jv_TU1bH5u3@;h7ikKx?f9{hv+pn!B)reiS<(Ka<9`o_ z-=r)2sV(Ke=J<<|kB#&3~Nuub}UG}jZmy)e1Ql)#J?Wi)olSyHRkq0o&gIM_wd zbtRx{p0;b|1=#eDn6-V>%?v{@j9p=5`so9XVOd7L*$Bo0~!vE4YBRGk@ zou}ggjPI@5dm7#wxKJS3-aP8@vxoAN> z5%2ti?_O~IwJL-hGOf6`R4es@gJ*DIaZkv)e_gHj%-2WDatepco3cvPqv?Zr$!oI~ zbAuqSM$q{;bR7Q4Gl%GP3=#qvyya(fs~XCc`)8KP6rMI_6_I`+$LB^C`RNoA~cs!F zgh7KYpp5DhrA_m%yniVAeT{~??u&O+Xk`jLSx|Sj(Qu5->v8Q1nby}>NzvY_dN{w8 zs1_7p@4(sE^H}`Fm=qeG8AUWNIu}Rp@#OaL19R3FRmboAU&@R@6I5J_!#z7=f92ci zOdO(ylC!c;E47F)Y3Dxdu-HHrC_EkZ)!|RH^KOC3itp2QEzvJ9(Nw7aAufK3Y4=ub z1SYxUQeqq{$`-BzHC(f%k9JL`?zMHnA%}Ok zP4~AN&N%vft3Xu=XiS0WCto629X<#{9?99k-WlGSRf$z8u4Qsb5A^)Z8Yi@ktOB87iTajjkOo=Ph}Ef?KQ}+S?;(cn zx^GwzD1TVX$l0w&mwxe??gxg(T|0SvHS+?!ZfhgbEGN>6m$Kzq!xBRht<7mmoaQa? zUz{i6)ESK#wJ|N-6)ow%h__p$dg*6OdoRkEG7rYUw_)A zR8SjZV*qYsje9_fQA?~_fWMiV&Dd{$vw(eYh1l~NRCH7j(XBt7)wGbbs8|V{V0avo z89@B@UmHMD{&jbWr2p$qaFy*^?2OlpW4U#}(G(asn&N_cuQI@g4vF{}c>dhJQdhcC zkAi{$B(_44La{|<|44(5g2Di7eF5S6|NqMgqQ3<<8zlzF_kn8m4(UO$7*~RqKKI!F zt;M_2@Dm?k&pZvp>yY}t4iuD}AScYfNSJV6U&j9sGlPp~vw?;N07SkU#9O%kC*BDp z`w#J@liC0aus@g2gn~kQgLs1f7ZC&JMwj7cNAw^QhQABpFOo?B+loI2y9FpxWxOi- zal{1l_x>?GNSpmiVDgsyKegXT0eho%FxM4H6_xb=%6$P{*uwC)$E-~M>@VKPEp|i0 zi7-N}h?+AY;<&HTsG90f)E2J~^#mHyf-x@+)%o96w^ z$O&@Gyn>TMDBu#?x35utn?Dr-rY0SLsmaY6T(jY*yDV_{Hsv+=zb#Y#slhAf3Vyjw zat(gtRR3=*aLoyd$h(4*h~vZG?p|-u)!9DKplV /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +198,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f9382..6689b85beec 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From f982b40edb378ea54a697b1163490ad0096f2d88 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 14 Sep 2023 17:59:22 -0500 Subject: [PATCH 121/331] Filter test inputs for presigning header exclusion proptest (#2986) ## Motivation and Context During our internal build, the `aws-sigv4` crate failed on a proptest as follows: ``` Diff < left / right > : content-length;content-type . minimal failing input: excluded_headers = [ "host", ] successes: 74 local rejects: 0 global rejects: 0 ', aws-sigv4/src/http_request/canonical_request.rs:838:5 failures: http_request::canonical_request::tests::presigning_header_exclusion_with_explicit_exclusion_list_specified ``` This says that `excluded_headers` should not contain `host`. To address it, this PR will filter out test inputs from proptest that contain `content-length`, `content-type`, or `host` (all of which appear in the expected value for the test at line 886 in the new revision). ## Testing No new tests have been added, relied on the existing tests in CI ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/http_request/canonical_request.rs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index 221463ada23..b6f4ec1052a 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -835,11 +835,24 @@ mod tests { ); } + fn valid_input(input: &Vec) -> bool { + [ + "content-length".to_owned(), + "content-type".to_owned(), + "host".to_owned(), + ] + .iter() + .all(|element| !input.contains(&element)) + } + proptest! { - #[test] - fn presigning_header_exclusion_with_explicit_exclusion_list_specified( - excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10), - ) { + #[test] + fn presigning_header_exclusion_with_explicit_exclusion_list_specified( + excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10).prop_filter( + "`excluded_headers` should pass the `valid_input` check", + valid_input, + ) + ) { let mut request_builder = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header("content-type", "application/xml") From f6ded058bca17584643a291c502699d4b7a11f37 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 15 Sep 2023 18:20:41 -0500 Subject: [PATCH 122/331] Cherry-pick codegen fix for unions with the `@httpPayload` trait (#2987) ## Motivation and Context Cherry-picks https://github.com/awslabs/smithy-rs/pull/2969, since our internal build based on the `smithy-rs-release-0.56.x` branch failed to code gen for the latest `medicalimaging` SDK model. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 6 ++ .../model/rest-xml-extras.smithy | 96 +++++++++++++++++++ .../rest-json-extras.smithy | 96 +++++++++++++++++++ .../HttpBoundProtocolPayloadGenerator.kt | 2 +- .../serialize/JsonSerializerGenerator.kt | 13 ++- .../serialize/QuerySerializerGenerator.kt | 4 + .../StructuredDataSerializerGenerator.kt | 13 ++- .../XmlBindingTraitSerializerGenerator.kt | 15 ++- 8 files changed, 238 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index ecab2364c50..75711a0c91b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -40,3 +40,9 @@ message = "Generate a region setter when a model uses SigV4." references = ["smithy-rs#2960"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = "Fix code generation for union members with the `@httpPayload` trait." +references = ["smithy-rs#2969", "smithy-rs#1896"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } +author = "jdisanti" diff --git a/codegen-client-test/model/rest-xml-extras.smithy b/codegen-client-test/model/rest-xml-extras.smithy index 76a6bbd9fa8..0c20c273cd1 100644 --- a/codegen-client-test/model/rest-xml-extras.smithy +++ b/codegen-client-test/model/rest-xml-extras.smithy @@ -21,6 +21,9 @@ service RestXmlExtras { StringHeader, CreateFoo, RequiredMember, + // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy + // They're being added in https://github.com/smithy-lang/smithy/pull/1908 + HttpPayloadWithUnion, ] } @@ -257,3 +260,96 @@ structure RequiredMemberInputOutput { @required requiredString: String } + +// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them +// They're being added in https://github.com/smithy-lang/smithy/pull/1908 + +/// This example serializes a union in the payload. +@idempotent +@http(uri: "/HttpPayloadWithUnion", method: "PUT") +operation HttpPayloadWithUnion { + input: HttpPayloadWithUnionInputOutput, + output: HttpPayloadWithUnionInputOutput +} + +apply HttpPayloadWithUnion @httpRequestTests([ + { + id: "RestXmlHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restXml, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: """ + + hello + """, + bodyMediaType: "application/xml", + headers: { + "Content-Type": "application/xml", + }, + requireHeaders: [ + "Content-Length" + ], + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestXmlHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restXml, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: "", + headers: { + "Content-Type": "application/xml", + "Content-Length": "0" + }, + params: {} + } +]) + +apply HttpPayloadWithUnion @httpResponseTests([ + { + id: "RestXmlHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restXml, + code: 200, + body: """ + + hello + """, + bodyMediaType: "application/xml", + headers: { + "Content-Type": "application/xml", + }, + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestXmlHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restXml, + code: 200, + body: "", + headers: { + "Content-Type": "application/xml", + "Content-Length": "0" + }, + params: {} + } +]) + +structure HttpPayloadWithUnionInputOutput { + @httpPayload + nested: UnionPayload, +} + +union UnionPayload { + greeting: String +} diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index ff92f36c6bd..d946ab0b5db 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -65,6 +65,9 @@ service RestJsonExtras { NullInNonSparse, CaseInsensitiveErrorOperation, EmptyStructWithContentOnWireOp, + // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy + // They're being added in https://github.com/smithy-lang/smithy/pull/1908 + HttpPayloadWithUnion, ], errors: [ExtraError] } @@ -348,3 +351,96 @@ structure EmptyStructWithContentOnWireOpOutput { operation EmptyStructWithContentOnWireOp { output: EmptyStructWithContentOnWireOpOutput, } + +// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them +// They're being added in https://github.com/smithy-lang/smithy/pull/1908 + +/// This examples serializes a union in the payload. +@idempotent +@http(uri: "/HttpPayloadWithUnion", method: "PUT") +operation HttpPayloadWithUnion { + input: HttpPayloadWithUnionInputOutput, + output: HttpPayloadWithUnionInputOutput +} + +structure HttpPayloadWithUnionInputOutput { + @httpPayload + nested: UnionPayload, +} + +union UnionPayload { + greeting: String +} + +apply HttpPayloadWithUnion @httpRequestTests([ + { + id: "RestJsonHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restJson1, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: """ + { + "greeting": "hello" + }""", + bodyMediaType: "application/json", + headers: { + "Content-Type": "application/json" + }, + requireHeaders: [ + "Content-Length" + ], + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestJsonHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restJson1, + method: "PUT", + uri: "/HttpPayloadWithUnion", + body: "", + headers: { + "Content-Type": "application/json", + "Content-Length": "0" + }, + params: {} + } +]) + +apply HttpPayloadWithUnion @httpResponseTests([ + { + id: "RestJsonHttpPayloadWithUnion", + documentation: "Serializes a union in the payload.", + protocol: restJson1, + code: 200, + body: """ + { + "greeting": "hello" + }""", + bodyMediaType: "application/json", + headers: { + "Content-Type": "application/json" + }, + params: { + nested: { + greeting: "hello" + } + } + }, + { + id: "RestJsonHttpPayloadWithUnsetUnion", + documentation: "No payload is sent if the union has no value.", + protocol: restJson1, + code: 200, + body: "", + headers: { + "Content-Type": "application/json", + "Content-Length": "0" + }, + params: {} + } +]) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt index 2c6ffc662ce..0ed594fc285 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt @@ -269,7 +269,7 @@ class HttpBoundProtocolPayloadGenerator( """, ) is StructureShape -> rust("#T()", serializerGenerator.unsetStructure(targetShape)) - is UnionShape -> throw CodegenException("Currently unsupported. Tracking issue: https://github.com/awslabs/smithy-rs/issues/1896") + is UnionShape -> rust("#T()", serializerGenerator.unsetUnion(targetShape)) else -> throw CodegenException("`httpPayload` on member shapes targeting shapes of type ${targetShape.type} is unsupported") } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt index 87562dc2ab6..981706b5665 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt @@ -36,6 +36,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section @@ -170,7 +171,7 @@ class JsonSerializerGenerator( private val runtimeConfig = codegenContext.runtimeConfig private val protocolFunctions = ProtocolFunctions(codegenContext) private val codegenScope = arrayOf( - "String" to RuntimeType.String, + *preludeScope, "Error" to runtimeConfig.serializationError(), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "JsonObjectWriter" to RuntimeType.smithyJson(runtimeConfig).resolve("serialize::JsonObjectWriter"), @@ -232,7 +233,7 @@ class JsonSerializerGenerator( } override fun unsetStructure(structure: StructureShape): RuntimeType = - ProtocolFunctions.crossOperationFn("rest_json_unsetpayload") { fnName -> + ProtocolFunctions.crossOperationFn("rest_json_unset_struct_payload") { fnName -> rustTemplate( """ pub fn $fnName() -> #{ByteSlab} { @@ -243,6 +244,14 @@ class JsonSerializerGenerator( ) } + override fun unsetUnion(union: UnionShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_json_unset_union_payload") { fnName -> + rustTemplate( + "pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }", + *codegenScope, + ) + } + override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? { // Don't generate an operation JSON serializer if there is no JSON body. val httpDocumentMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt index 974e112cde7..1a5b37bc749 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt @@ -121,6 +121,10 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct TODO("AwsQuery doesn't support payload serialization") } + override fun unsetUnion(union: UnionShape): RuntimeType { + TODO("AwsQuery doesn't support payload serialization") + } + override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? { val inputShape = operationShape.inputShape(model) return protocolFunctions.serializeFn(inputShape, fnNameSuffix = "input") { fnName -> diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt index 962b9c87201..92b28d89fcf 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType interface StructuredDataSerializerGenerator { @@ -27,12 +28,22 @@ interface StructuredDataSerializerGenerator { * Generate the correct data when attempting to serialize a structure that is unset * * ```rust - * fn rest_json_unsetpayload() -> Vec { + * fn rest_json_unset_struct_payload() -> Vec { * ... * } */ fun unsetStructure(structure: StructureShape): RuntimeType + /** + * Generate the correct data when attempting to serialize a union that is unset + * + * ```rust + * fn rest_json_unset_union_payload() -> Vec { + * ... + * } + */ + fun unsetUnion(union: UnionShape): RuntimeType + /** * Generate a serializer for an operation input structure. * This serializer is only used by clients. diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt index 678768cfa70..fc4f0198387 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt @@ -35,6 +35,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant import software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError @@ -176,8 +177,8 @@ class XmlBindingTraitSerializerGenerator( } } - override fun unsetStructure(structure: StructureShape): RuntimeType { - return ProtocolFunctions.crossOperationFn("rest_xml_unset_payload") { fnName -> + override fun unsetStructure(structure: StructureShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_xml_unset_struct_payload") { fnName -> rustTemplate( """ pub fn $fnName() -> #{ByteSlab} { @@ -187,7 +188,15 @@ class XmlBindingTraitSerializerGenerator( "ByteSlab" to RuntimeType.ByteSlab, ) } - } + + override fun unsetUnion(union: UnionShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_xml_unset_union_payload") { fnName -> + rustTemplate( + "pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }", + *preludeScope, + "ByteSlab" to RuntimeType.ByteSlab, + ) + } override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? { val outputShape = operationShape.outputShape(model) From 96aa1fcc388a5a9d75ce996e1562955602b46b57 Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Tue, 19 Sep 2023 06:50:11 -0700 Subject: [PATCH 123/331] Remove sparse registry config (#2990) Closes #2766. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .cargo/config.toml | 4 ---- aws/sdk/integration-tests/webassembly/.cargo/config.toml | 4 ---- tools/.cargo/config.toml | 4 ---- 3 files changed, 12 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 5afa0e94715..0015055659c 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,7 +1,3 @@ [build] # Share one `target` directory at the project root for all Cargo projects and workspaces in smithy-rs target-dir = "target" - -# TODO(https://github.com/awslabs/smithy-rs/issues/2766): The sparse registry config can be removed when upgrading to Rust 1.70 -[registries.crates-io] -protocol = "sparse" diff --git a/aws/sdk/integration-tests/webassembly/.cargo/config.toml b/aws/sdk/integration-tests/webassembly/.cargo/config.toml index e6e321b297c..031dad7377b 100644 --- a/aws/sdk/integration-tests/webassembly/.cargo/config.toml +++ b/aws/sdk/integration-tests/webassembly/.cargo/config.toml @@ -3,7 +3,3 @@ target = "wasm32-wasi" [target.wasm32-wasi] rustflags = ["-C", "opt-level=1"] - -# TODO(Rust 1.70): The sparse registry config can be removed when upgrading to Rust 1.70 -[registries.crates-io] -protocol = "sparse" diff --git a/tools/.cargo/config.toml b/tools/.cargo/config.toml index 6636645498a..2bf2a2e3e44 100644 --- a/tools/.cargo/config.toml +++ b/tools/.cargo/config.toml @@ -2,7 +2,3 @@ # Tools shouldn't share `target` with the rest of the project to # avoid thrash from differing compiler flags target-dir = "target" - -# TODO(Rust 1.70): The sparse registry config can be removed when upgrading to Rust 1.70 -[registries.crates-io] -protocol = "sparse" From 9b0e3cfd256ff737f6d23a64a323f2e526307e67 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 19 Sep 2023 09:56:48 -0400 Subject: [PATCH 124/331] Source defaults from the model instead of implicitly (#2985) ## Motivation and Context We weren't correctly computing defaults which lead to incorrect behavior when coupled with nullability. ## Description Minimal changeset to source defaults from the model. Other changes: - Unify enum parsing across client and server to always use `from_str` in protocol tests - Extract `PrimitiveInstantiator` from `Instantiator` so it can be used to instantiate defaults ## Testing - regular codegen tests ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../smithy/generators/ClientInstantiator.kt | 8 - .../rust/codegen/core/rustlang/Writable.kt | 5 + .../rust/codegen/core/smithy/SymbolExt.kt | 6 + .../rust/codegen/core/smithy/SymbolVisitor.kt | 37 ++-- .../smithy/generators/BuilderGenerator.kt | 25 +-- .../generators/DefaultValueGenerator.kt | 40 +++++ .../core/smithy/generators/EnumGenerator.kt | 15 ++ .../core/smithy/generators/Instantiator.kt | 169 ++++++++++-------- .../rust/codegen/core/testutil/TestHelpers.kt | 3 +- .../smithy/generators/BuilderGeneratorTest.kt | 71 ++++++++ .../smithy/generators/InstantiatorTest.kt | 17 +- .../smithy/generators/ServerInstantiator.kt | 14 -- 13 files changed, 283 insertions(+), 133 deletions(-) create mode 100644 codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 73c59508aec..eb146026fcc 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -150,3 +150,9 @@ message = "Fix regression with redacting sensitive HTTP response bodies." references = ["smithy-rs#2926", "smithy-rs#2972"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "ysaito1001" + +[[smithy-rs]] +message = "Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code." +references = ["smithy-rs#2985"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "rcoh" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt index a065fe3b96d..ca39264a1c0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt @@ -5,7 +5,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators -import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.model.shapes.MemberShape @@ -14,18 +13,12 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName -private fun enumFromStringFn(enumSymbol: Symbol, data: String): Writable = writable { - rust("#T::from($data)", enumSymbol) -} - class ClientBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiator.BuilderKindBehavior { override fun hasFallibleBuilder(shape: StructureShape): Boolean = BuilderGenerator.hasFallibleBuilder(shape, codegenContext.symbolProvider) @@ -40,7 +33,6 @@ class ClientInstantiator(private val codegenContext: ClientCodegenContext) : Ins codegenContext.model, codegenContext.runtimeConfig, ClientBuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) { fun renderFluentCall( writer: RustWriter, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt index e1b5ee64c28..a0c2c2f2452 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt @@ -30,6 +30,11 @@ fun Writable.map(f: RustWriter.(Writable) -> Unit): Writable { return writable { f(self) } } +/** Returns Some(..arg) */ +fun Writable.some(): Writable { + return this.map { rust("Some(#T)", it) } +} + fun Writable.isNotEmpty(): Boolean = !this.isEmpty() operator fun Writable.plus(other: Writable): Writable { diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt index 3b9307ab7ee..35a278a3182 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.smithy import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType @@ -102,6 +103,11 @@ sealed class Default { * This symbol should use the Rust `std::default::Default` when unset */ object RustDefault : Default() + + /** + * This symbol has a custom default value different from `Default::default` + */ + data class NonZeroDefault(val value: Node) : Default() } /** diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt index b2426c602c0..31659a3744a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.codegen.core.SymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.knowledge.NullableIndex.CheckMode +import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.BigDecimalShape import software.amazon.smithy.model.shapes.BigIntegerShape import software.amazon.smithy.model.shapes.BlobShape @@ -37,6 +38,7 @@ import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.TimestampShape import software.amazon.smithy.model.shapes.UnionShape +import software.amazon.smithy.model.traits.DefaultTrait import software.amazon.smithy.model.traits.EnumTrait import software.amazon.smithy.model.traits.ErrorTrait import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -48,6 +50,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait import software.amazon.smithy.rust.codegen.core.util.PANIC import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.toPascalCase import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import kotlin.reflect.KClass @@ -79,16 +82,18 @@ data class MaybeRenamed(val name: String, val renamedFrom: String?) /** * Make the return [value] optional if the [member] symbol is as well optional. */ -fun SymbolProvider.wrapOptional(member: MemberShape, value: String): String = value.letIf(toSymbol(member).isOptional()) { - "Some($value)" -} +fun SymbolProvider.wrapOptional(member: MemberShape, value: String): String = + value.letIf(toSymbol(member).isOptional()) { + "Some($value)" + } /** * Make the return [value] optional if the [member] symbol is not optional. */ -fun SymbolProvider.toOptional(member: MemberShape, value: String): String = value.letIf(!toSymbol(member).isOptional()) { - "Some($value)" -} +fun SymbolProvider.toOptional(member: MemberShape, value: String): String = + value.letIf(!toSymbol(member).isOptional()) { + "Some($value)" + } /** * Services can rename their contained shapes. See https://awslabs.github.io/smithy/1.0/spec/core/model.html#service @@ -111,7 +116,7 @@ fun Shape.contextName(serviceShape: ServiceShape?): String { */ open class SymbolVisitor( settings: CoreRustSettings, - override val model: Model, + final override val model: Model, private val serviceShape: ServiceShape?, override val config: RustSymbolProviderConfig, ) : RustSymbolProvider, ShapeVisitor { @@ -170,7 +175,7 @@ open class SymbolVisitor( } private fun simpleShape(shape: SimpleShape): Symbol { - return symbolBuilder(shape, SimpleShapes.getValue(shape::class)).setDefault(Default.RustDefault).build() + return symbolBuilder(shape, SimpleShapes.getValue(shape::class)).build() } override fun booleanShape(shape: BooleanShape): Symbol = simpleShape(shape) @@ -263,13 +268,20 @@ open class SymbolVisitor( override fun memberShape(shape: MemberShape): Symbol { val target = model.expectShape(shape.target) + val defaultValue = shape.getMemberTrait(model, DefaultTrait::class.java).orNull()?.let { trait -> + when (val value = trait.toNode()) { + Node.from(""), Node.from(0), Node.from(false), Node.arrayNode(), Node.objectNode() -> Default.RustDefault + Node.nullNode() -> Default.NoDefault + else -> Default.NonZeroDefault(value) + } + } ?: Default.NoDefault // Handle boxing first, so we end up with Option>, not Box>. return handleOptionality( handleRustBoxing(toSymbol(target), shape), shape, nullableIndex, config.nullabilityCheckMode, - ) + ).toBuilder().setDefault(defaultValue).build() } override fun timestampShape(shape: TimestampShape?): Symbol { @@ -297,7 +309,12 @@ fun symbolBuilder(shape: Shape?, rustType: RustType): Symbol.Builder = // If we ever generate a `thisisabug.rs`, there is a bug in our symbol generation .definitionFile("thisisabug.rs") -fun handleOptionality(symbol: Symbol, member: MemberShape, nullableIndex: NullableIndex, nullabilityCheckMode: CheckMode): Symbol = +fun handleOptionality( + symbol: Symbol, + member: MemberShape, + nullableIndex: NullableIndex, + nullabilityCheckMode: CheckMode, +): Symbol = symbol.letIf(nullableIndex.isMemberNullable(member, nullabilityCheckMode)) { symbol.makeOptional() } /** diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index 9697cc624f7..9a952ebe405 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -32,7 +32,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.Default import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope @@ -41,7 +40,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.canUseDefault import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.defaultValue import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.makeOptional @@ -385,15 +383,22 @@ class BuilderGenerator( members.forEach { member -> val memberName = symbolProvider.toMemberName(member) val memberSymbol = symbolProvider.toSymbol(member) - val default = memberSymbol.defaultValue() withBlock("$memberName: self.$memberName", ",") { - // Write the modifier - when { - !memberSymbol.isOptional() && default == Default.RustDefault -> rust(".unwrap_or_default()") - !memberSymbol.isOptional() -> withBlock( - ".ok_or_else(||", - ")?", - ) { missingRequiredField(memberName) } + val generator = DefaultValueGenerator(runtimeConfig, symbolProvider, model) + val default = generator.defaultValue(member) + if (!memberSymbol.isOptional()) { + if (default != null) { + if (default.isRustDefault) { + rust(".unwrap_or_default()") + } else { + rust(".unwrap_or_else(#T)", default.expr) + } + } else { + withBlock( + ".ok_or_else(||", + ")?", + ) { missingRequiredField(memberName) } + } } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt new file mode 100644 index 00000000000..38001bf102e --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt @@ -0,0 +1,40 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.smithy.generators + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.SimpleShape +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.Default +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.defaultValue + +class DefaultValueGenerator( + runtimeConfig: RuntimeConfig, + private val symbolProvider: RustSymbolProvider, + private val model: Model, +) { + private val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider) + + data class DefaultValue(val isRustDefault: Boolean, val expr: Writable) + + /** Returns the default value as set by the defaultValue trait */ + fun defaultValue(member: MemberShape): DefaultValue? { + val target = model.expectShape(member.target) + return when (val default = symbolProvider.toSymbol(member).defaultValue()) { + is Default.NoDefault -> null + is Default.RustDefault -> DefaultValue(isRustDefault = true, writable("Default::default")) + is Default.NonZeroDefault -> { + val instantiation = instantiator.instantiate(target as SimpleShape, default.value) + DefaultValue(isRustDefault = false, writable { rust("||#T", instantiation) }) + } + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt index a84820ad263..b2732c9d5c8 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt @@ -232,6 +232,20 @@ open class EnumGenerator( }, ) + // Add an infallible FromStr implementation for uniformity + rustTemplate( + """ + impl ::std::str::FromStr for ${context.enumName} { + type Err = ::std::convert::Infallible; + + fn from_str(s: &str) -> #{Result}::Err> { + #{Ok}(${context.enumName}::from(s)) + } + } + """, + *preludeScope, + ) + rustTemplate( """ impl #{From} for ${context.enumName} where T: #{AsRef} { @@ -239,6 +253,7 @@ open class EnumGenerator( ${context.enumName}(s.as_ref().to_owned()) } } + """, *preludeScope, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt index eed196e4891..799aa1a000a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt @@ -6,7 +6,7 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import software.amazon.smithy.codegen.core.CodegenException -import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.codegen.core.SymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.node.ArrayNode import software.amazon.smithy.model.node.Node @@ -18,12 +18,14 @@ import software.amazon.smithy.model.shapes.BlobShape import software.amazon.smithy.model.shapes.BooleanShape import software.amazon.smithy.model.shapes.CollectionShape import software.amazon.smithy.model.shapes.DocumentShape +import software.amazon.smithy.model.shapes.EnumShape import software.amazon.smithy.model.shapes.ListShape import software.amazon.smithy.model.shapes.MapShape import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.NumberShape import software.amazon.smithy.model.shapes.SetShape import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.SimpleShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.TimestampShape @@ -84,11 +86,6 @@ open class Instantiator( private val runtimeConfig: RuntimeConfig, /** Behavior of the builder type used for structure shapes. */ private val builderKindBehavior: BuilderKindBehavior, - /** - * A function that given a symbol for an enum shape and a string, returns a writable to instantiate the enum with - * the string value. - **/ - private val enumFromStringFn: (Symbol, String) -> Writable, /** Fill out required fields with a default value. **/ private val defaultsForRequiredFields: Boolean = false, private val customizations: List = listOf(), @@ -131,64 +128,7 @@ open class Instantiator( // Members, supporting potentially optional members is MemberShape -> renderMember(writer, shape, data, ctx) - // Wrapped Shapes - is TimestampShape -> { - val node = (data as NumberNode) - val num = BigDecimal(node.toString()) - val wholePart = num.toInt() - val fractionalPart = num.remainder(BigDecimal.ONE) - writer.rust( - "#T::from_fractional_secs($wholePart, ${fractionalPart}_f64)", - RuntimeType.dateTime(runtimeConfig), - ) - } - - /** - * ```rust - * Blob::new("arg") - * ``` - */ - is BlobShape -> if (shape.hasTrait()) { - writer.rust( - "#T::from_static(b${(data as StringNode).value.dq()})", - RuntimeType.byteStream(runtimeConfig), - ) - } else { - writer.rust( - "#T::new(${(data as StringNode).value.dq()})", - RuntimeType.blob(runtimeConfig), - ) - } - - // Simple Shapes - is StringShape -> renderString(writer, shape, data as StringNode) - is NumberShape -> when (data) { - is StringNode -> { - val numberSymbol = symbolProvider.toSymbol(shape) - // support Smithy custom values, such as Infinity - writer.rust( - """<#T as #T>::parse_smithy_primitive(${data.value.dq()}).expect("invalid string for number")""", - numberSymbol, - RuntimeType.smithyTypes(runtimeConfig).resolve("primitive::Parse"), - ) - } - - is NumberNode -> writer.write(data.value) - } - - is BooleanShape -> writer.rust(data.asBooleanNode().get().toString()) - is DocumentShape -> writer.rustBlock("") { - val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() - rustTemplate( - """ - let json_bytes = br##"${Node.prettyPrintJson(data)}"##; - let mut tokens = #{json_token_iter}(json_bytes).peekable(); - #{expect_document}(&mut tokens).expect("well formed json") - """, - "expect_document" to smithyJson.resolve("deserialize::token::expect_document"), - "json_token_iter" to smithyJson.resolve("deserialize::json_token_iter"), - ) - } + is SimpleShape -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate(shape, data)(writer) else -> writer.writeWithNoFormatting("todo!() /* $shape $data */") } @@ -214,7 +154,11 @@ open class Instantiator( ")", // The conditions are not commutative: note client builders always take in `Option`. conditional = symbol.isOptional() || - (model.expectShape(memberShape.container) is StructureShape && builderKindBehavior.doesSetterTakeInOption(memberShape)), + ( + model.expectShape(memberShape.container) is StructureShape && builderKindBehavior.doesSetterTakeInOption( + memberShape, + ) + ), *preludeScope, ) { writer.conditionalBlockTemplate( @@ -238,7 +182,8 @@ open class Instantiator( } } - private fun renderSet(writer: RustWriter, shape: SetShape, data: ArrayNode, ctx: Ctx) = renderList(writer, shape, data, ctx) + private fun renderSet(writer: RustWriter, shape: SetShape, data: ArrayNode, ctx: Ctx) = + renderList(writer, shape, data, ctx) /** * ```rust @@ -317,22 +262,18 @@ open class Instantiator( } } - private fun renderString(writer: RustWriter, shape: StringShape, arg: StringNode) { - val data = writer.escape(arg.value).dq() - if (!shape.hasTrait()) { - writer.rust("$data.to_owned()") - } else { - val enumSymbol = symbolProvider.toSymbol(shape) - writer.rustTemplate("#{EnumFromStringFn:W}", "EnumFromStringFn" to enumFromStringFn(enumSymbol, data)) - } - } - /** * ```rust * MyStruct::builder().field_1("hello").field_2(5).build() * ``` */ - private fun renderStructure(writer: RustWriter, shape: StructureShape, data: ObjectNode, headers: Map, ctx: Ctx) { + private fun renderStructure( + writer: RustWriter, + shape: StructureShape, + data: ObjectNode, + headers: Map, + ctx: Ctx, + ) { writer.rust("#T::builder()", symbolProvider.toSymbol(shape)) renderStructureMembers(writer, shape, data, headers, ctx) @@ -416,3 +357,77 @@ open class Instantiator( else -> throw CodegenException("Unrecognized shape `$shape`") } } + +class PrimitiveInstantiator(private val runtimeConfig: RuntimeConfig, private val symbolProvider: SymbolProvider) { + fun instantiate(shape: SimpleShape, data: Node): Writable = writable { + when (shape) { + // Simple Shapes + is TimestampShape -> { + val node = (data as NumberNode) + val num = BigDecimal(node.toString()) + val wholePart = num.toInt() + val fractionalPart = num.remainder(BigDecimal.ONE) + rust( + "#T::from_fractional_secs($wholePart, ${fractionalPart}_f64)", + RuntimeType.dateTime(runtimeConfig), + ) + } + + /** + * ```rust + * Blob::new("arg") + * ``` + */ + is BlobShape -> if (shape.hasTrait()) { + rust( + "#T::from_static(b${(data as StringNode).value.dq()})", + RuntimeType.byteStream(runtimeConfig), + ) + } else { + rust( + "#T::new(${(data as StringNode).value.dq()})", + RuntimeType.blob(runtimeConfig), + ) + } + + is StringShape -> renderString(shape, data as StringNode)(this) + is NumberShape -> when (data) { + is StringNode -> { + val numberSymbol = symbolProvider.toSymbol(shape) + // support Smithy custom values, such as Infinity + rust( + """<#T as #T>::parse_smithy_primitive(${data.value.dq()}).expect("invalid string for number")""", + numberSymbol, + RuntimeType.smithyTypes(runtimeConfig).resolve("primitive::Parse"), + ) + } + + is NumberNode -> write(data.value) + } + + is BooleanShape -> rust(data.asBooleanNode().get().toString()) + is DocumentShape -> rustBlock("") { + val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() + rustTemplate( + """ + let json_bytes = br##"${Node.prettyPrintJson(data)}"##; + let mut tokens = #{json_token_iter}(json_bytes).peekable(); + #{expect_document}(&mut tokens).expect("well formed json") + """, + "expect_document" to smithyJson.resolve("deserialize::token::expect_document"), + "json_token_iter" to smithyJson.resolve("deserialize::json_token_iter"), + ) + } + } + } + + private fun renderString(shape: StringShape, arg: StringNode): Writable = { + val data = escape(arg.value).dq() + if (shape.hasTrait() || shape is EnumShape) { + val enumSymbol = symbolProvider.toSymbol(shape) + rust("""$data.parse::<#T>().expect("static value validated to member")""", enumSymbol) + } else { + rust("$data.to_owned()") + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index b80f211c766..3ab9f9fd22e 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -142,11 +142,12 @@ fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = internal fun testSymbolProvider( model: Model, rustReservedWordConfig: RustReservedWordConfig? = null, + config: RustSymbolProviderConfig = TestRustSymbolProviderConfig, ): RustSymbolProvider = SymbolVisitor( testRustSettings(), model, ServiceShape.builder().version("test").id("test#Service").build(), - TestRustSymbolProviderConfig, + config, ).let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf(Attribute.NonExhaustive)) } .let { RustReservedWordSymbolProvider( diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index fcec11601ec..2cce4515845 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -7,17 +7,23 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import org.junit.jupiter.api.Test import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.AllowDeprecated import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.Default import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.setDefault +import software.amazon.smithy.rust.codegen.core.testutil.TestRustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.testutil.unitTest +import software.amazon.smithy.rust.codegen.core.util.lookup internal class BuilderGeneratorTest { private val model = StructureGeneratorTest.model @@ -140,4 +146,69 @@ internal class BuilderGeneratorTest { } project.compileAndTest() } + + @Test + fun `it supports nonzero defaults`() { + val model = """ + ${"$"}version: "2.0" + namespace com.test + structure MyStruct { + @default(0) + @required + zeroDefault: Integer + @required + @default(1) + oneDefault: OneDefault + @required + @default("") + defaultEmpty: String + @required + @default("some-value") + defaultValue: String + @required + anActuallyRequiredField: Integer + @required + @default([]) + emptyList: StringList + noDefault: String + @default(true) + @required + defaultDocument: Document + } + list StringList { + member: String + } + @default(1) + integer OneDefault + """.asSmithyModel() + + val provider = testSymbolProvider( + model, + rustReservedWordConfig = StructureGeneratorTest.rustReservedWordConfig, + config = TestRustSymbolProviderConfig.copy(nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_CAREFUL), + ) + val project = TestWorkspace.testProject(provider) + val shape: StructureShape = model.lookup("com.test#MyStruct") + project.useShapeWriter(shape) { + StructureGenerator(model, provider, this, shape, listOf()).render() + BuilderGenerator(model, provider, shape, listOf()).render(this) + unitTest("test_defaults") { + rustTemplate( + """ + let s = Builder::default().an_actually_required_field(5).build().unwrap(); + assert_eq!(s.zero_default(), 0); + assert_eq!(s.default_empty(), ""); + assert_eq!(s.default_value(), "some-value"); + assert_eq!(s.one_default(), 1); + assert!(s.empty_list().is_empty()); + assert_eq!(s.an_actually_required_field(), 5); + assert_eq!(s.no_default(), None); + assert_eq!(s.default_document().as_bool().unwrap(), true); + """, + "Struct" to provider.toSymbol(shape), + ) + } + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt index 5232fb1df21..aa89acbb2bf 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt @@ -6,7 +6,6 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import org.junit.jupiter.api.Test -import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.NumberNode import software.amazon.smithy.model.node.StringNode @@ -19,7 +18,6 @@ import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.withBlock -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer @@ -102,14 +100,11 @@ class InstantiatorTest { override fun doesSetterTakeInOption(memberShape: MemberShape) = true } - // This can be empty since the actual behavior is tested in `ClientInstantiatorTest` and `ServerInstantiatorTest`. - private fun enumFromStringFn(symbol: Symbol, data: String) = writable { } - @Test fun `generate unions`() { val union = model.lookup("com.test#MyUnion") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val data = Node.parse("""{ "stringVariant": "ok!" }""") val project = TestWorkspace.testProject(model) @@ -129,7 +124,7 @@ class InstantiatorTest { fun `generate struct builders`() { val structure = model.lookup("com.test#MyStruct") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val data = Node.parse("""{ "bar": 10, "foo": "hello" }""") val project = TestWorkspace.testProject(model) @@ -154,7 +149,7 @@ class InstantiatorTest { fun `generate builders for boxed structs`() { val structure = model.lookup("com.test#WithBox") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val data = Node.parse( """ { @@ -193,7 +188,7 @@ class InstantiatorTest { fun `generate lists`() { val data = Node.parse("""["bar", "foo"]""") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val project = TestWorkspace.testProject() project.lib { @@ -214,7 +209,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val project = TestWorkspace.testProject(model) @@ -245,7 +239,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val inner = model.lookup("com.test#Inner") @@ -278,7 +271,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val project = TestWorkspace.testProject(model) @@ -306,7 +298,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val project = TestWorkspace.testProject(model) project.testModule { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt index 3d3105f9c70..09cc9cdc713 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt @@ -5,7 +5,6 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators -import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -20,18 +19,6 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained import software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput -/** - * Server enums do not have an `Unknown` variant like client enums do, so constructing an enum from - * a string is a fallible operation (hence `try_from`). It's ok to panic here if construction fails, - * since this is only used in protocol tests. - */ -private fun enumFromStringFn(enumSymbol: Symbol, data: String): Writable = writable { - rust( - """#T::try_from($data).expect("this is only used in tests")""", - enumSymbol, - ) -} - class ServerAfterInstantiatingValueConstrainItIfNecessary(val codegenContext: CodegenContext) : InstantiatorCustomization() { @@ -82,7 +69,6 @@ fun serverInstantiator(codegenContext: CodegenContext) = codegenContext.model, codegenContext.runtimeConfig, ServerBuilderKindBehavior(codegenContext), - ::enumFromStringFn, defaultsForRequiredFields = true, customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), ) From 5239e9c5b70c1af3999906fc93b5cf78350c95d8 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 19 Sep 2023 10:02:25 -0400 Subject: [PATCH 125/331] Extract builderInstantiator interface to prepare for nullability changes (#2988) ## Motivation and Context #1725 exposed the need for easily configuring builder behavior between client & server ## Description - extract builderGenerator interface and attach it to `codegenContext` to avoid loads of threading it up and down ## Testing - codegen unit tests - [x] codegen diff audit ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../client/smithy/ClientCodegenContext.kt | 5 ++ .../generators/ClientBuilderInstantiator.kt | 41 +++++++++++++ .../smithy/protocols/ClientProtocolLoader.kt | 4 +- .../codegen/core/smithy/CodegenContext.kt | 5 +- .../smithy/generators/BuilderInstantiator.kt | 32 ++++++++++ .../codegen/core/smithy/protocols/AwsJson.kt | 2 + .../parse/EventStreamUnmarshallerGenerator.kt | 14 ++++- .../protocols/parse/JsonParserGenerator.kt | 23 +++++--- .../parse/XmlBindingTraitParserGenerator.kt | 58 +++++++++++++------ .../testutil/DefaultBuilderInstantiator.kt | 27 +++++++++ .../core/testutil/EventStreamTestModels.kt | 2 +- .../rust/codegen/core/testutil/TestHelpers.kt | 16 ++++- .../server/smithy/ServerCodegenContext.kt | 9 ++- .../smithy/generators/ServerInstantiator.kt | 39 +++++++++++++ .../generators/protocol/ServerProtocol.kt | 19 +++++- 15 files changed, 258 insertions(+), 38 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt create mode 100644 codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt create mode 100644 codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt index 0e12986ff3f..101d9632551 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt @@ -9,10 +9,12 @@ import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientBuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol /** @@ -36,4 +38,7 @@ data class ClientCodegenContext( model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.CLIENT, ) { val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins + override fun builderInstantiator(): BuilderInstantiator { + return ClientBuilderInstantiator(symbolProvider) + } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt new file mode 100644 index 00000000000..c4120cb32a2 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.map +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator + +fun ClientCodegenContext.builderInstantiator(): BuilderInstantiator = ClientBuilderInstantiator(symbolProvider) + +class ClientBuilderInstantiator(private val symbolProvider: RustSymbolProvider) : BuilderInstantiator { + override fun setField(builder: String, value: Writable, field: MemberShape): Writable { + return setFieldWithSetter(builder, value, field) + } + + override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable = writable { + if (BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) { + rustTemplate( + "$builder.build()#{mapErr}?", + "mapErr" to ( + mapErr?.map { + rust(".map_err(#T)", it) + } ?: writable { } + ), + ) + } else { + rust("$builder.build()") + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt index cb9c7db7e5a..d7cdd7594c7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt @@ -63,9 +63,9 @@ private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = if (compatibleWithAwsQuery(codegenContext.serviceShape, version)) { - AwsQueryCompatible(codegenContext, AwsJson(codegenContext, version)) + AwsQueryCompatible(codegenContext, AwsJson(codegenContext, version, codegenContext.builderInstantiator())) } else { - AwsJson(codegenContext, version) + AwsJson(codegenContext, version, codegenContext.builderInstantiator()) } override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt index 3fa6f688e32..ea427fc65f8 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt @@ -8,6 +8,7 @@ package software.amazon.smithy.rust.codegen.core.smithy import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator /** * [CodegenContext] contains code-generation context that is _common to all_ smithy-rs plugins. @@ -17,7 +18,7 @@ import software.amazon.smithy.model.shapes.ShapeId * If your data is specific to the `rust-client-codegen` client plugin, put it in [ClientCodegenContext] instead. * If your data is specific to the `rust-server-codegen` server plugin, put it in [ServerCodegenContext] instead. */ -open class CodegenContext( +abstract class CodegenContext( /** * The smithy model. * @@ -89,4 +90,6 @@ open class CodegenContext( fun expectModuleDocProvider(): ModuleDocProvider = checkNotNull(moduleDocProvider) { "A ModuleDocProvider must be set on the CodegenContext" } + + abstract fun builderInstantiator(): BuilderInstantiator } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt new file mode 100644 index 00000000000..fd62ced0668 --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.smithy.generators + +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable + +/** Abstraction for instantiating builders. + * + * Builder abstractions vary—clients MAY use `build_with_error_correction`, e.g., and builders can vary in fallibility. + * */ +interface BuilderInstantiator { + /** Set a field on a builder. */ + fun setField(builder: String, value: Writable, field: MemberShape): Writable + + /** Finalize a builder, turning it into a built object + * - In the case of builders-of-builders, the value should be returned directly + * - If an error is returned, you MUST use `mapErr` to convert the error type + */ + fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable? = null): Writable + + /** Set a field on a builder using the `$setterName` method. $value will be passed directly. */ + fun setFieldWithSetter(builder: String, value: Writable, field: MemberShape) = writable { + rustTemplate("$builder = $builder.${field.setterName()}(#{value})", "value" to value) + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt index 0a534225522..0b3178095c1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt @@ -18,6 +18,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserGenerator import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator @@ -122,6 +123,7 @@ class AwsJsonSerializerGenerator( open class AwsJson( val codegenContext: CodegenContext, val awsJsonVersion: AwsJsonVersion, + val builderInstantiator: BuilderInstantiator, ) : Protocol { private val runtimeConfig = codegenContext.runtimeConfig private val errorScope = arrayOf( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt index 6b706a1e098..457bf5a53b9 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt @@ -53,6 +53,7 @@ class EventStreamUnmarshallerGenerator( private val unionShape: UnionShape, ) { private val model = codegenContext.model + private val builderInstantiator = codegenContext.builderInstantiator() private val symbolProvider = codegenContext.symbolProvider private val codegenTarget = codegenContext.target private val runtimeConfig = codegenContext.runtimeConfig @@ -339,6 +340,7 @@ class EventStreamUnmarshallerGenerator( // TODO(EventStream): Errors on the operation can be disjoint with errors in the union, // so we need to generate a new top-level Error type for each event stream union. when (codegenTarget) { + // TODO(https://github.com/awslabs/smithy-rs/issues/1970) It should be possible to unify these branches now CodegenTarget.CLIENT -> { val target = model.expectShape(member.target, StructureShape::class.java) val parser = protocol.structuredDataParser().errorParser(target) @@ -352,9 +354,19 @@ class EventStreamUnmarshallerGenerator( })?; builder.set_meta(Some(generic)); return Ok(#{UnmarshalledMessage}::Error( - #{OpError}::${member.target.name}(builder.build()) + #{OpError}::${member.target.name}( + #{build} + ) )) """, + "build" to builderInstantiator.finalizeBuilder( + "builder", target, + mapErr = { + rustTemplate( + """|err|#{Error}::unmarshalling(format!("{}", err))""", *codegenScope, + ) + }, + ), "parser" to parser, *codegenScope, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt index 01c2b64e6a2..3b05b076942 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt @@ -59,13 +59,16 @@ import software.amazon.smithy.utils.StringUtils * Class describing a JSON parser section that can be used in a customization. */ sealed class JsonParserSection(name: String) : Section(name) { - data class BeforeBoxingDeserializedMember(val shape: MemberShape) : JsonParserSection("BeforeBoxingDeserializedMember") + data class BeforeBoxingDeserializedMember(val shape: MemberShape) : + JsonParserSection("BeforeBoxingDeserializedMember") - data class AfterTimestampDeserializedMember(val shape: MemberShape) : JsonParserSection("AfterTimestampDeserializedMember") + data class AfterTimestampDeserializedMember(val shape: MemberShape) : + JsonParserSection("AfterTimestampDeserializedMember") data class AfterBlobDeserializedMember(val shape: MemberShape) : JsonParserSection("AfterBlobDeserializedMember") - data class AfterDocumentDeserializedMember(val shape: MemberShape) : JsonParserSection("AfterDocumentDeserializedMember") + data class AfterDocumentDeserializedMember(val shape: MemberShape) : + JsonParserSection("AfterDocumentDeserializedMember") } /** @@ -100,6 +103,7 @@ class JsonParserGenerator( private val codegenTarget = codegenContext.target private val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() private val protocolFunctions = ProtocolFunctions(codegenContext) + private val builderInstantiator = codegenContext.builderInstantiator() private val codegenScope = arrayOf( "Error" to smithyJson.resolve("deserialize::error::DeserializeError"), "expect_blob_or_null" to smithyJson.resolve("deserialize::token::expect_blob_or_null"), @@ -251,6 +255,7 @@ class JsonParserGenerator( deserializeMember(member) } } + CodegenTarget.SERVER -> { if (symbolProvider.toSymbol(member).isOptional()) { withBlock("builder = builder.${member.setterName()}(", ");") { @@ -508,12 +513,14 @@ class JsonParserGenerator( "Builder" to symbolProvider.symbolForBuilder(shape), ) deserializeStructInner(shape.members()) - // Only call `build()` if the builder is not fallible. Otherwise, return the builder. - if (returnSymbolToParse.isUnconstrained) { - rust("Ok(Some(builder))") - } else { - rust("Ok(Some(builder.build()))") + val builder = builderInstantiator.finalizeBuilder( + "builder", shape, + ) { + rustTemplate( + """|err|#{Error}::custom_source("Response was invalid", err)""", *codegenScope, + ) } + rust("Ok(Some(#T))", builder) } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt index d083d0e901b..b7205562d19 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt @@ -39,7 +39,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName @@ -101,6 +100,7 @@ class XmlBindingTraitParserGenerator( private val runtimeConfig = codegenContext.runtimeConfig private val protocolFunctions = ProtocolFunctions(codegenContext) private val codegenTarget = codegenContext.target + private val builderInstantiator = codegenContext.builderInstantiator() // The symbols we want all the time private val codegenScope = arrayOf( @@ -159,6 +159,7 @@ class XmlBindingTraitParserGenerator( is StructureShape -> { parseStructure(shape, ctx) } + is UnionShape -> parseUnion(shape, ctx) } } @@ -294,7 +295,10 @@ class XmlBindingTraitParserGenerator( } rust("$builder = $builder.${member.setterName()}($temp);") } - rustTemplate("_ => return Err(#{XmlDecodeError}::custom(\"expected ${member.xmlName()} tag\"))", *codegenScope) + rustTemplate( + "_ => return Err(#{XmlDecodeError}::custom(\"expected ${member.xmlName()} tag\"))", + *codegenScope, + ) } } @@ -359,19 +363,23 @@ class XmlBindingTraitParserGenerator( parsePrimitiveInner(memberShape) { rustTemplate("#{try_data}(&mut ${ctx.tag})?.as_ref()", *codegenScope) } + is MapShape -> if (memberShape.isFlattened()) { parseFlatMap(target, ctx) } else { parseMap(target, ctx) } + is CollectionShape -> if (memberShape.isFlattened()) { parseFlatList(target, ctx) } else { parseList(target, ctx) } + is StructureShape -> { parseStructure(target, ctx) } + is UnionShape -> parseUnion(target, ctx) else -> PANIC("Unhandled: $target") } @@ -436,10 +444,16 @@ class XmlBindingTraitParserGenerator( } when (target.renderUnknownVariant()) { true -> rust("_unknown => base = Some(#T::${UnionGenerator.UnknownVariantName}),", symbol) - false -> rustTemplate("""variant => return Err(#{XmlDecodeError}::custom(format!("unexpected union variant: {:?}", variant)))""", *codegenScope) + false -> rustTemplate( + """variant => return Err(#{XmlDecodeError}::custom(format!("unexpected union variant: {:?}", variant)))""", + *codegenScope, + ) } } - rustTemplate("""base.ok_or_else(||#{XmlDecodeError}::custom("expected union, got nothing"))""", *codegenScope) + rustTemplate( + """base.ok_or_else(||#{XmlDecodeError}::custom("expected union, got nothing"))""", + *codegenScope, + ) } } rust("#T(&mut ${ctx.tag})", nestedParser) @@ -474,17 +488,17 @@ class XmlBindingTraitParserGenerator( } else { rust("let _ = decoder;") } - withBlock("Ok(builder.build()", ")") { - if (BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) { - // NOTE:(rcoh) This branch is unreachable given the current nullability rules. - // Only synthetic inputs can have fallible builders, but synthetic inputs can never be parsed - // (because they're inputs, only outputs will be parsed!) - - // I'm leaving this branch here so that the binding trait parser generator would work for a server - // side implementation in the future. - rustTemplate(""".map_err(|_|#{XmlDecodeError}::custom("missing field"))?""", *codegenScope) - } - } + val builder = builderInstantiator.finalizeBuilder( + "builder", + shape, + mapErr = { + rustTemplate( + """.map_err(|_|#{XmlDecodeError}::custom("missing field"))?""", + *codegenScope, + ) + }, + ) + rust("Ok(#T)", builder) } } rust("#T(&mut ${ctx.tag})", nestedParser) @@ -622,6 +636,7 @@ class XmlBindingTraitParserGenerator( ) } } + is TimestampShape -> { val timestampFormat = index.determineTimestampFormat( @@ -629,7 +644,8 @@ class XmlBindingTraitParserGenerator( HttpBinding.Location.DOCUMENT, TimestampFormatTrait.Format.DATE_TIME, ) - val timestampFormatType = RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat) + val timestampFormatType = + RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat) withBlock("#T::from_str(", ")", RuntimeType.dateTime(runtimeConfig)) { provider() rust(", #T", timestampFormatType) @@ -639,6 +655,7 @@ class XmlBindingTraitParserGenerator( *codegenScope, ) } + is BlobShape -> { withBlock("#T(", ")", RuntimeType.base64Decode(runtimeConfig)) { provider() @@ -648,6 +665,7 @@ class XmlBindingTraitParserGenerator( *codegenScope, ) } + else -> PANIC("unexpected shape: $shape") } } @@ -660,7 +678,10 @@ class XmlBindingTraitParserGenerator( withBlock("#T::try_from(", ")", enumSymbol) { provider() } - rustTemplate(""".map_err(|e| #{XmlDecodeError}::custom(format!("unknown variant {}", e)))?""", *codegenScope) + rustTemplate( + """.map_err(|e| #{XmlDecodeError}::custom(format!("unknown variant {}", e)))?""", + *codegenScope, + ) } else { withBlock("#T::from(", ")", enumSymbol) { provider() @@ -674,7 +695,8 @@ class XmlBindingTraitParserGenerator( } } - private fun convertsToEnumInServer(shape: StringShape) = target == CodegenTarget.SERVER && shape.hasTrait() + private fun convertsToEnumInServer(shape: StringShape) = + target == CodegenTarget.SERVER && shape.hasTrait() private fun MemberShape.xmlName(): XmlName { return XmlName(xmlIndex.memberName(this)) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt new file mode 100644 index 00000000000..6147f84e2f8 --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt @@ -0,0 +1,27 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.testutil + +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator + +/** + * A Default instantiator that uses `builder.build()` in all cases. This exists to support tests in codegen-core + * and to serve as the base behavior for client and server instantiators. + */ +class DefaultBuilderInstantiator : BuilderInstantiator { + override fun setField(builder: String, value: Writable, field: MemberShape): Writable { + return setFieldWithSetter(builder, value, field) + } + + override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable { + return writable { rust("builder.build()") } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt index e944a552a08..d6b43b97cbb 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt @@ -145,7 +145,7 @@ object EventStreamTestModels { validTestUnion = """{"Foo":"hello"}""", validSomeError = """{"Message":"some error"}""", validUnmodeledError = """{"Message":"unmodeled error"}""", - ) { AwsJson(it, AwsJsonVersion.Json11) }, + ) { AwsJson(it, AwsJsonVersion.Json11, builderInstantiator = DefaultBuilderInstantiator()) }, // // restXml diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index 3ab9f9fd22e..ae0398ae92b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -36,6 +36,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.module import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait @@ -88,7 +89,11 @@ private object CodegenCoreTestModules { eventStream: UnionShape, ): RustModule.LeafModule = ErrorsTestModule - override fun moduleForBuilder(context: ModuleProviderContext, shape: Shape, symbol: Symbol): RustModule.LeafModule { + override fun moduleForBuilder( + context: ModuleProviderContext, + shape: Shape, + symbol: Symbol, + ): RustModule.LeafModule { val builderNamespace = RustReservedWords.escapeIfNeeded("test_" + symbol.name.toSnakeCase()) return RustModule.new( builderNamespace, @@ -162,7 +167,7 @@ internal fun testCodegenContext( serviceShape: ServiceShape? = null, settings: CoreRustSettings = testRustSettings(), codegenTarget: CodegenTarget = CodegenTarget.CLIENT, -): CodegenContext = CodegenContext( +): CodegenContext = object : CodegenContext( model, testSymbolProvider(model), TestModuleDocProvider, @@ -172,11 +177,16 @@ internal fun testCodegenContext( ShapeId.from("test#Protocol"), settings, codegenTarget, -) +) { + override fun builderInstantiator(): BuilderInstantiator { + return DefaultBuilderInstantiator() + } +} /** * In tests, we frequently need to generate a struct, a builder, and an impl block to access said builder. */ + fun StructureShape.renderWithModelBuilder( model: Model, symbolProvider: RustSymbolProvider, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt index d5c2a7084ad..d952a7771b0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt @@ -12,6 +12,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator +import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderInstantiator +import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.returnSymbolToParseFn /** * [ServerCodegenContext] contains code-generation context that is _specific_ to the [RustServerCodegenPlugin] plugin @@ -35,4 +38,8 @@ data class ServerCodegenContext( val pubCrateConstrainedShapeSymbolProvider: PubCrateConstrainedShapeSymbolProvider, ) : CodegenContext( model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.SERVER, -) +) { + override fun builderInstantiator(): BuilderInstantiator { + return ServerBuilderInstantiator(symbolProvider, returnSymbolToParseFn(this)) + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt index 09cc9cdc713..7020f388962 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt @@ -6,15 +6,20 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.InstantiatorCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.InstantiatorSection import software.amazon.smithy.rust.codegen.core.smithy.isOptional +import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.ReturnSymbolToParse import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained import software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput @@ -72,3 +77,37 @@ fun serverInstantiator(codegenContext: CodegenContext) = defaultsForRequiredFields = true, customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), ) + +class ServerBuilderInstantiator( + private val symbolProvider: RustSymbolProvider, + private val symbolParseFn: (Shape) -> ReturnSymbolToParse, +) : BuilderInstantiator { + override fun setField(builder: String, value: Writable, field: MemberShape): Writable { + // Server builders have the ability to have non-optional fields. When one of these fields is used, + // we need to use `if let(...)` to only set the field when it is present. + return if (!symbolProvider.toSymbol(field).isOptional()) { + writable { + val n = safeName() + rustTemplate( + """ + if let Some($n) = #{value} { + #{setter} + } + """, + "value" to value, "setter" to setFieldWithSetter(builder, writable(n), field), + ) + } + } else { + setFieldWithSetter(builder, value, field) + } + } + + override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable = writable { + val returnSymbolToParse = symbolParseFn(shape) + if (returnSymbolToParse.isUnconstrained) { + rust(builder) + } else { + rust("$builder.build()") + } + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt index 77ba711fd25..622123cd4a0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt @@ -122,7 +122,7 @@ class ServerAwsJsonProtocol( private val serverCodegenContext: ServerCodegenContext, awsJsonVersion: AwsJsonVersion, private val additionalParserCustomizations: List = listOf(), -) : AwsJson(serverCodegenContext, awsJsonVersion), ServerProtocol { +) : AwsJson(serverCodegenContext, awsJsonVersion, serverCodegenContext.builderInstantiator()), ServerProtocol { private val runtimeConfig = codegenContext.runtimeConfig override val protocolModulePath: String @@ -132,7 +132,12 @@ class ServerAwsJsonProtocol( } override fun structuredDataParser(): StructuredDataParserGenerator = - jsonParserGenerator(serverCodegenContext, httpBindingResolver, ::awsJsonFieldName, additionalParserCustomizations) + jsonParserGenerator( + serverCodegenContext, + httpBindingResolver, + ::awsJsonFieldName, + additionalParserCustomizations, + ) override fun structuredDataSerializer(): StructuredDataSerializerGenerator = ServerAwsJsonSerializerGenerator(serverCodegenContext, httpBindingResolver, awsJsonVersion) @@ -171,9 +176,11 @@ class ServerAwsJsonProtocol( override fun requestRejection(runtimeConfig: RuntimeConfig): RuntimeType = ServerCargoDependency.smithyHttpServer(runtimeConfig) .toType().resolve("protocol::aws_json::rejection::RequestRejection") + override fun responseRejection(runtimeConfig: RuntimeConfig): RuntimeType = ServerCargoDependency.smithyHttpServer(runtimeConfig) .toType().resolve("protocol::aws_json::rejection::ResponseRejection") + override fun runtimeError(runtimeConfig: RuntimeConfig): RuntimeType = ServerCargoDependency.smithyHttpServer(runtimeConfig) .toType().resolve("protocol::aws_json::runtime_error::RuntimeError") @@ -192,7 +199,12 @@ class ServerRestJsonProtocol( override val protocolModulePath: String = "rest_json_1" override fun structuredDataParser(): StructuredDataParserGenerator = - jsonParserGenerator(serverCodegenContext, httpBindingResolver, ::restJsonFieldName, additionalParserCustomizations) + jsonParserGenerator( + serverCodegenContext, + httpBindingResolver, + ::restJsonFieldName, + additionalParserCustomizations, + ) override fun structuredDataSerializer(): StructuredDataSerializerGenerator = ServerRestJsonSerializerGenerator(serverCodegenContext, httpBindingResolver) @@ -257,6 +269,7 @@ class ServerRequestBeforeBoxingDeserializedMemberConvertToMaybeConstrainedJsonPa rust(".map(|x| x.into())") } } + else -> emptySection } } From a5c1ced056410ed2ed3a14deefc469bf5f9d27ad Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 19 Sep 2023 10:38:05 -0400 Subject: [PATCH 126/331] add map_immutable to allow signing to work with a wrapped SdkBody (#2567) ## Motivation and Context aws-sdk-rust#749 ## Description When wrapping an `SdkBody`, the resulting body is no longer signable. Some services support this and others don't. This change adds a new method for mapping an `SdkBody` called `map_readonly_body`. If called on a body that is signable, it will produce a signable body. However, this function should never when modifying the inner body is necessary, as that will result in a signing error. ## Testing Zelda wrote a test ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-http/src/body.rs | 44 +++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-http/src/body.rs index 32ad205ed23..5f8ac23a349 100644 --- a/rust-runtime/aws-smithy-http/src/body.rs +++ b/rust-runtime/aws-smithy-http/src/body.rs @@ -35,6 +35,7 @@ pin_project! { // In the event of retry, this function will be called to generate a new body. See // [`try_clone()`](SdkBody::try_clone) rebuild: Option Inner) + Send + Sync>>, + bytes_contents: Option } } @@ -94,6 +95,7 @@ impl SdkBody { Self { inner: Inner::Dyn { inner: body }, rebuild: None, + bytes_contents: None, } } @@ -110,6 +112,7 @@ impl SdkBody { SdkBody { inner: initial.inner, rebuild: Some(Arc::new(move || f().inner)), + bytes_contents: initial.bytes_contents, } } @@ -119,6 +122,7 @@ impl SdkBody { Self { inner: Inner::Taken, rebuild: None, + bytes_contents: None, } } @@ -127,6 +131,7 @@ impl SdkBody { Self { inner: Inner::Once { inner: None }, rebuild: Some(Arc::new(|| Inner::Once { inner: None })), + bytes_contents: Some(Bytes::new()), } } @@ -157,10 +162,9 @@ impl SdkBody { /// If this SdkBody is NOT streaming, this will return the byte slab /// If this SdkBody is streaming, this will return `None` pub fn bytes(&self) -> Option<&[u8]> { - match &self.inner { - Inner::Once { inner: Some(b) } => Some(b), - Inner::Once { inner: None } => Some(&[]), - _ => None, + match &self.bytes_contents { + Some(b) => Some(b), + None => None, } } @@ -172,6 +176,7 @@ impl SdkBody { Self { inner: next, rebuild: self.rebuild.clone(), + bytes_contents: self.bytes_contents.clone(), } }) } @@ -191,6 +196,25 @@ impl SdkBody { f(self) } } + + /// Update this `SdkBody` with `map`. **This function MUST NOT alert the data of the body.** + /// + /// This function is useful for adding metadata like progress tracking to an [`SdkBody`] that + /// does not alter the actual byte data. If your mapper alters the contents of the body, use [`SdkBody::map`] + /// instead. + pub fn map_preserve_contents( + self, + f: impl Fn(SdkBody) -> SdkBody + Sync + Send + 'static, + ) -> SdkBody { + let contents = self.bytes_contents.clone(); + let mut out = if self.rebuild.is_some() { + SdkBody::retryable(move || f(self.try_clone().unwrap())) + } else { + f(self) + }; + out.bytes_contents = contents; + out + } } impl From<&str> for SdkBody { @@ -201,6 +225,7 @@ impl From<&str> for SdkBody { impl From for SdkBody { fn from(bytes: Bytes) -> Self { + let b = bytes.clone(); SdkBody { inner: Inner::Once { inner: Some(bytes.clone()), @@ -208,6 +233,7 @@ impl From for SdkBody { rebuild: Some(Arc::new(move || Inner::Once { inner: Some(bytes.clone()), })), + bytes_contents: Some(b), } } } @@ -217,6 +243,7 @@ impl From for SdkBody { SdkBody { inner: Inner::Streaming { inner: body }, rebuild: None, + bytes_contents: None, } } } @@ -290,6 +317,15 @@ mod test { assert_eq!(SdkBody::from("").size_hint().exact(), Some(0)); } + #[test] + fn map_preserve_preserves_bytes_hint() { + let initial = SdkBody::from("hello!"); + assert_eq!(initial.bytes(), Some(b"hello!".as_slice())); + + let new_body = initial.map_preserve_contents(|body| SdkBody::from_dyn(BoxBody::new(body))); + assert_eq!(new_body.bytes(), Some(b"hello!".as_slice())); + } + #[allow(clippy::bool_assert_comparison)] #[test] fn valid_eos() { From 1771dbdcb2408b915a4e144efcb81aee7ed10113 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 20 Sep 2023 13:15:34 -0400 Subject: [PATCH 127/331] Add support for error-correcting builders (#2991) ## Motivation and Context To implement #1767 we need to support error-correction to default values when instantiating builders. - https://smithy.io/2.0/spec/aggregate-types.html?highlight=error%20correction#client-error-correction ## Description Adds `pub(crate) correct_errors_` method that will be used in deserialization to set default values for required fields when not set in the serialized response. This only applies to client via `ClientBuilderInstantiator` ## Testing - added a new test that's fairly exhaustive ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../client/smithy/ClientCodegenContext.kt | 2 +- .../generators/ClientBuilderInstantiator.kt | 25 +++- .../smithy/generators/ErrorCorrection.kt | 114 ++++++++++++++++ .../smithy/generators/ErrorCorrectionTest.kt | 125 ++++++++++++++++++ .../smithy/protocols/ProtocolFunctions.kt | 2 +- .../smithy/generators/BuilderGeneratorTest.kt | 3 +- 6 files changed, 260 insertions(+), 11 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt index 101d9632551..64b3a2b2b36 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt @@ -39,6 +39,6 @@ data class ClientCodegenContext( ) { val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins override fun builderInstantiator(): BuilderInstantiator { - return ClientBuilderInstantiator(symbolProvider) + return ClientBuilderInstantiator(this) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt index c4120cb32a2..34d315a3f31 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt @@ -13,21 +13,29 @@ import software.amazon.smithy.rust.codegen.core.rustlang.map import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator -fun ClientCodegenContext.builderInstantiator(): BuilderInstantiator = ClientBuilderInstantiator(symbolProvider) - -class ClientBuilderInstantiator(private val symbolProvider: RustSymbolProvider) : BuilderInstantiator { +class ClientBuilderInstantiator(private val clientCodegenContext: ClientCodegenContext) : BuilderInstantiator { override fun setField(builder: String, value: Writable, field: MemberShape): Writable { return setFieldWithSetter(builder, value, field) } + /** + * For the client, we finalize builders with error correction enabled + */ override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable = writable { - if (BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) { + val correctErrors = clientCodegenContext.correctErrors(shape) + val builderW = writable { + when { + correctErrors != null -> rustTemplate("#{correctErrors}($builder)", "correctErrors" to correctErrors) + else -> rustTemplate(builder) + } + } + if (BuilderGenerator.hasFallibleBuilder(shape, clientCodegenContext.symbolProvider)) { rustTemplate( - "$builder.build()#{mapErr}?", + "#{builder}.build()#{mapErr}?", + "builder" to builderW, "mapErr" to ( mapErr?.map { rust(".map_err(#T)", it) @@ -35,7 +43,10 @@ class ClientBuilderInstantiator(private val symbolProvider: RustSymbolProvider) ), ) } else { - rust("$builder.build()") + rustTemplate( + "#{builder}.build()", + "builder" to builderW, + ) } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt new file mode 100644 index 00000000000..6f212014de7 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt @@ -0,0 +1,114 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.shapes.BlobShape +import software.amazon.smithy.model.shapes.BooleanShape +import software.amazon.smithy.model.shapes.DocumentShape +import software.amazon.smithy.model.shapes.EnumShape +import software.amazon.smithy.model.shapes.ListShape +import software.amazon.smithy.model.shapes.MapShape +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.NumberShape +import software.amazon.smithy.model.shapes.StringShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.shapes.TimestampShape +import software.amazon.smithy.model.shapes.UnionShape +import software.amazon.smithy.model.traits.EnumTrait +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.core.rustlang.RustModule +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.isEmpty +import software.amazon.smithy.rust.codegen.core.rustlang.map +import software.amazon.smithy.rust.codegen.core.rustlang.plus +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.some +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.PrimitiveInstantiator +import software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed +import software.amazon.smithy.rust.codegen.core.smithy.protocols.shapeFunctionName +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.isEventStream +import software.amazon.smithy.rust.codegen.core.util.isStreaming +import software.amazon.smithy.rust.codegen.core.util.letIf + +/** + * For AWS-services, the spec defines error correction semantics to recover from missing default values for required members: + * https://smithy.io/2.0/spec/aggregate-types.html?highlight=error%20correction#client-error-correction + */ + +private fun ClientCodegenContext.errorCorrectedDefault(member: MemberShape): Writable? { + if (!member.isRequired) { + return null + } + val target = model.expectShape(member.target) + val memberSymbol = symbolProvider.toSymbol(member) + val targetSymbol = symbolProvider.toSymbol(target) + if (member.isEventStream(model) || member.isStreaming(model)) { + return null + } + val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider) + return writable { + when { + target is EnumShape || target.hasTrait() -> rustTemplate(""""no value was set".parse::<#{Shape}>().ok()""", "Shape" to targetSymbol) + target is BooleanShape || target is NumberShape || target is StringShape || target is DocumentShape || target is ListShape || target is MapShape -> rust("Some(Default::default())") + target is StructureShape -> rustTemplate( + "{ let builder = #{Builder}::default(); #{instantiate} }", + "Builder" to symbolProvider.symbolForBuilder(target), + "instantiate" to builderInstantiator().finalizeBuilder("builder", target).map { + if (BuilderGenerator.hasFallibleBuilder(target, symbolProvider)) { + rust("#T.ok()", it) + } else { + it.some()(this) + } + }.letIf(memberSymbol.isRustBoxed()) { + it.plus { rustTemplate(".map(#{Box}::new)", *preludeScope) } + }, + ) + target is TimestampShape -> instantiator.instantiate(target, Node.from(0)).some()(this) + target is BlobShape -> instantiator.instantiate(target, Node.from("")).some()(this) + target is UnionShape -> rust("Some(#T::Unknown)", targetSymbol) + } + } +} + +fun ClientCodegenContext.correctErrors(shape: StructureShape): RuntimeType? { + val name = symbolProvider.shapeFunctionName(serviceShape, shape) + "_correct_errors" + val corrections = writable { + shape.members().forEach { member -> + val memberName = symbolProvider.toMemberName(member) + errorCorrectedDefault(member)?.also { default -> + rustTemplate( + """if builder.$memberName.is_none() { builder.$memberName = #{default} }""", + "default" to default, + ) + } + } + } + + if (corrections.isEmpty()) { + return null + } + + return RuntimeType.forInlineFun(name, RustModule.private("serde_util")) { + rustTemplate( + """ + pub(crate) fn $name(mut builder: #{Builder}) -> #{Builder} { + #{corrections} + builder + } + + """, + "Builder" to symbolProvider.symbolForBuilder(shape), + "corrections" to corrections, + ) + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt new file mode 100644 index 00000000000..58490103122 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt @@ -0,0 +1,125 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.unitTest +import software.amazon.smithy.rust.codegen.core.util.lookup + +class ErrorCorrectionTest { + private val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + + operation SayHello { input: TestInput } + structure TestInput { nested: TestStruct } + structure TestStruct { + @required + foo: String, + @required + byteValue: Byte, + @required + listValue: StringList, + @required + mapValue: ListMap, + @required + doubleListValue: DoubleList + @required + document: Document + @required + nested: Nested + @required + blob: Blob + @required + enum: Enum + @required + union: U + notRequired: String + } + + enum Enum { + A, + B, + C + } + + union U { + A: Integer, + B: String, + C: Unit + } + + structure Nested { + @required + a: String + } + + list StringList { + member: String + } + + list DoubleList { + member: StringList + } + + map ListMap { + key: String, + value: StringList + } + """.asSmithyModel(smithyVersion = "2.0") + + @Test + fun correctMissingFields() { + val shape = model.lookup("com.example#TestStruct") + clientIntegrationTest(model) { ctx, crate -> + crate.lib { + val codegenCtx = + arrayOf("correct_errors" to ctx.correctErrors(shape)!!, "Shape" to ctx.symbolProvider.toSymbol(shape)) + rustTemplate( + """ + /// avoid unused warnings + pub fn use_fn_publicly() { #{correct_errors}(#{Shape}::builder()); } """, + *codegenCtx, + ) + unitTest("test_default_builder") { + rustTemplate( + """ + let builder = #{correct_errors}(#{Shape}::builder().foo("abcd")); + let shape = builder.build(); + // don't override a field already set + assert_eq!(shape.foo(), Some("abcd")); + // set nested fields + assert_eq!(shape.nested().unwrap().a(), Some("")); + // don't default non-required fields + assert_eq!(shape.not_required(), None); + + // set defaults for everything else + assert_eq!(shape.blob().unwrap().as_ref(), &[]); + + assert_eq!(shape.list_value(), Some(&[][..])); + assert!(shape.map_value().unwrap().is_empty()); + assert_eq!(shape.double_list_value(), Some(&[][..])); + + // enums and unions become unknown variants + assert!(matches!(shape.r##enum(), Some(crate::types::Enum::Unknown(_)))); + assert!(shape.union().unwrap().is_unknown()); + """, + *codegenCtx, + ) + } + } + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt index 682b36a8ad8..53bdfc009f1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt @@ -138,7 +138,7 @@ internal fun RustSymbolProvider.shapeModuleName(serviceShape: ServiceShape?, sha ) /** Creates a unique name for a ser/de function. */ -internal fun RustSymbolProvider.shapeFunctionName(serviceShape: ServiceShape?, shape: Shape): String { +fun RustSymbolProvider.shapeFunctionName(serviceShape: ServiceShape?, shape: Shape): String { val containerName = when (shape) { is MemberShape -> model.expectShape(shape.container).contextName(serviceShape).toSnakeCase() else -> shape.contextName(serviceShape).toSnakeCase() diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index 2cce4515845..3e1886a1959 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -150,7 +150,6 @@ internal class BuilderGeneratorTest { @Test fun `it supports nonzero defaults`() { val model = """ - ${"$"}version: "2.0" namespace com.test structure MyStruct { @default(0) @@ -180,7 +179,7 @@ internal class BuilderGeneratorTest { } @default(1) integer OneDefault - """.asSmithyModel() + """.asSmithyModel(smithyVersion = "2.0") val provider = testSymbolProvider( model, From 1331dc5443e6c3f5494eed2a44606062d3888446 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 21 Sep 2023 12:20:51 -0500 Subject: [PATCH 128/331] add support for nullable struct members when generating AWS SDKs (#2916) ## Motivation and Context smithy-rs#1767 aws-sdk-rust#536 ## Description This PR adds support for nullability i.e. much less unwraps will be required when using the AWS SDK. For generic clients, this new behavior can be enabled in codegen by setting `nullabilityCheckMode: "Client"` in their codegen config: ``` "plugins": { "rust-client-codegen": { "codegen": { "includeFluentClient": false, "nullabilityCheckMode": "CLIENT_CAREFUL" }, } ``` ## Testing Ran existing tests ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 15 ++ aws/rust-runtime/aws-config/src/sts/util.rs | 17 +- aws/sdk-adhoc-test/build.gradle.kts | 52 ++--- .../models/required-value-test.smithy | 28 +++ .../smithy/rustsdk/BaseRequestIdDecorator.kt | 22 +- .../s3/S3ExtendedRequestIdDecorator.kt | 6 + .../timestream/TimestreamDecorator.kt | 4 +- .../ec2/EC2MakePrimitivesOptionalTest.kt | 15 +- aws/sdk/build.gradle.kts | 4 +- aws/sdk/integration-tests/Cargo.toml | 2 +- .../dynamodb/tests/movies.rs | 15 +- .../qldbsession/tests/integration.rs | 14 +- codegen-client-test/build.gradle.kts | 2 + .../error-correction-nullability-test.smithy | 128 ++++++++++++ .../client/smithy/ClientCodegenVisitor.kt | 4 +- .../client/smithy/ClientRustSettings.kt | 5 + .../IdempotencyTokenGenerator.kt | 62 ++++-- .../generators/ClientBuilderInstantiator.kt | 4 +- .../smithy/generators/ErrorCorrection.kt | 12 +- .../protocol/ProtocolParserGenerator.kt | 34 ++-- .../protocol/ProtocolTestGenerator.kt | 2 +- .../smithy/protocols/ClientProtocolLoader.kt | 4 +- .../smithy/endpoint/EndpointsDecoratorTest.kt | 1 + .../smithy/generators/ErrorCorrectionTest.kt | 18 +- .../rust/codegen/core/rustlang/RustType.kt | 1 + .../codegen/core/smithy/CoreRustSettings.kt | 4 +- .../rust/codegen/core/smithy/SymbolVisitor.kt | 2 +- .../smithy/generators/BuilderGenerator.kt | 2 + .../core/smithy/generators/Instantiator.kt | 2 +- .../codegen/core/smithy/protocols/AwsJson.kt | 2 - .../parse/XmlBindingTraitParserGenerator.kt | 3 +- .../serialize/QuerySerializerGenerator.kt | 22 +- .../testutil/DefaultBuilderInstantiator.kt | 14 +- .../core/testutil/EventStreamTestModels.kt | 2 +- .../rust/codegen/core/testutil/TestHelpers.kt | 14 +- .../core/rustlang/RustReservedWordsTest.kt | 15 +- .../smithy/generators/BuilderGeneratorTest.kt | 3 +- .../generators/StructureGeneratorTest.kt | 1 - .../parse/JsonParserGeneratorTest.kt | 4 +- .../XmlBindingTraitParserGeneratorTest.kt | 2 +- .../AwsQuerySerializerGeneratorTest.kt | 162 ++++++++++++++- .../Ec2QuerySerializerGeneratorTest.kt | 169 +++++++++++++++- .../serialize/JsonSerializerGeneratorTest.kt | 190 +++++++++++++++++- .../XmlBindingTraitSerializerGeneratorTest.kt | 180 ++++++++++++++++- .../generators/protocol/ServerProtocol.kt | 2 +- examples/Cargo.toml | 3 +- examples/pokemon-service/tests/simple.rs | 12 +- .../tests/simple_integration_test.rs | 8 +- rust-runtime/aws-smithy-types/src/blob.rs | 2 +- 49 files changed, 1110 insertions(+), 181 deletions(-) create mode 100644 aws/sdk-adhoc-test/models/required-value-test.smithy create mode 100644 codegen-client-test/model/error-correction-nullability-test.smithy diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index eb146026fcc..5468952f15c 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -34,6 +34,21 @@ references = ["smithy-rs#2911"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "Velfi" +[[aws-sdk-rust]] +message = "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929)." +references = ["smithy-rs#2916", "aws-sdk-rust#536"] +meta = { "breaking" = true, "tada" = true, "bug" = false } +author = "Velfi" + +[[smithy-rs]] +message = """ +Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: "CLIENT_ZERO_VALUE_V1" in your codegen config. +For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929). +""" +references = ["smithy-rs#2916", "smithy-rs#1767"] +meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client"} +author = "Velfi" + [[aws-sdk-rust]] message = """ All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html) diff --git a/aws/rust-runtime/aws-config/src/sts/util.rs b/aws/rust-runtime/aws-config/src/sts/util.rs index bc6151985d1..e215204f846 100644 --- a/aws/rust-runtime/aws-config/src/sts/util.rs +++ b/aws/rust-runtime/aws-config/src/sts/util.rs @@ -17,24 +17,15 @@ pub(crate) fn into_credentials( ) -> provider::Result { let sts_credentials = sts_credentials .ok_or_else(|| CredentialsError::unhandled("STS credentials must be defined"))?; - let expiration = SystemTime::try_from( - sts_credentials - .expiration - .ok_or_else(|| CredentialsError::unhandled("missing expiration"))?, - ) - .map_err(|_| { + let expiration = SystemTime::try_from(sts_credentials.expiration).map_err(|_| { CredentialsError::unhandled( "credential expiration time cannot be represented by a SystemTime", ) })?; Ok(AwsCredentials::new( - sts_credentials - .access_key_id - .ok_or_else(|| CredentialsError::unhandled("access key id missing from result"))?, - sts_credentials - .secret_access_key - .ok_or_else(|| CredentialsError::unhandled("secret access token missing"))?, - sts_credentials.session_token, + sts_credentials.access_key_id, + sts_credentials.secret_access_key, + Some(sts_credentials.session_token), Some(expiration), provider_name, )) diff --git a/aws/sdk-adhoc-test/build.gradle.kts b/aws/sdk-adhoc-test/build.gradle.kts index 907c8f9b873..eb6c8cb76a3 100644 --- a/aws/sdk-adhoc-test/build.gradle.kts +++ b/aws/sdk-adhoc-test/build.gradle.kts @@ -35,40 +35,46 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-protocol-tests:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") + implementation("software.amazon.smithy:smithy-model:$smithyVersion") } -val allCodegenTests = listOf( - CodegenTest( - "com.amazonaws.apigateway#BackplaneControlService", - "apigateway", - imports = listOf("models/apigateway-rules.smithy"), +fun getNullabilityCheckMode(): String = properties.get("nullability.check.mode") ?: "CLIENT_CAREFUL" + +fun baseTest(service: String, module: String, imports: List = listOf()): CodegenTest { + return CodegenTest( + service = service, + module = module, + imports = imports, + extraCodegenConfig = """ + "includeFluentClient": false, + "nullabilityCheckMode": "${getNullabilityCheckMode()}" + """, extraConfig = """ - , - "codegen": { - "includeFluentClient": false - }, - "customizationConfig": { + , "customizationConfig": { "awsSdk": { - "generateReadme": false + "generateReadme": false, + "requireEndpointResolver": false } } """, + ) +} + +val allCodegenTests = listOf( + baseTest( + "com.amazonaws.apigateway#BackplaneControlService", + "apigateway", + imports = listOf("models/apigateway-rules.smithy"), ), - CodegenTest( + baseTest( "com.amazonaws.testservice#TestService", "endpoint-test-service", imports = listOf("models/single-static-endpoint.smithy"), - extraConfig = """ - , - "codegen": { - "includeFluentClient": false - }, - "customizationConfig": { - "awsSdk": { - "generateReadme": false - } - } - """, + ), + baseTest( + "com.amazonaws.testservice#RequiredValues", + "required-values", + imports = listOf("models/required-value-test.smithy"), ), ) diff --git a/aws/sdk-adhoc-test/models/required-value-test.smithy b/aws/sdk-adhoc-test/models/required-value-test.smithy new file mode 100644 index 00000000000..efb90d9250f --- /dev/null +++ b/aws/sdk-adhoc-test/models/required-value-test.smithy @@ -0,0 +1,28 @@ +$version: "1.0" + +namespace com.amazonaws.testservice + +use aws.api#service +use aws.protocols#restJson1 + +@restJson1 +@title("Test Service") +@service(sdkId: "Test") +@aws.auth#sigv4(name: "test-service") +service RequiredValues { + operations: [TestOperation] +} + +@http(method: "GET", uri: "/") +operation TestOperation { + errors: [Error] +} + +@error("client") +structure Error { + @required + requestId: String + + @required + message: String +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt index 9b8adeddabe..5025ffedab1 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt @@ -5,7 +5,9 @@ package software.amazon.smithy.rustsdk +import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator @@ -19,6 +21,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderSection @@ -26,6 +29,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCusto import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection import software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplSection +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait import software.amazon.smithy.rust.codegen.core.util.hasTrait @@ -72,6 +76,10 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { } } + open fun asMemberShape(container: StructureShape): MemberShape? { + return container.members().firstOrNull { member -> member.memberName.lowercase() == "requestid" } + } + private inner class RequestIdOperationCustomization(private val codegenContext: ClientCodegenContext) : OperationCustomization() { override fun section(section: OperationSection): Writable = writable { @@ -82,12 +90,14 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { "apply_to_error" to applyToError(codegenContext), ) } + is OperationSection.MutateOutput -> { rust( "output._set_$fieldName(#T::$accessorFunctionName(${section.responseHeadersName}).map(str::to_string));", accessorTrait(codegenContext), ) } + is OperationSection.BeforeParseResponse -> { rustTemplate( "#{tracing}::debug!($fieldName = ?#{trait}::$accessorFunctionName(${section.responseName}));", @@ -95,6 +105,7 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { "trait" to accessorTrait(codegenContext), ) } + else -> {} } } @@ -123,8 +134,17 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { rustBlock("fn $accessorFunctionName(&self) -> Option<&str>") { rustBlock("match self") { section.allErrors.forEach { error -> + val optional = asMemberShape(error)?.let { member -> + codegenContext.symbolProvider.toSymbol(member).isOptional() + } ?: true + val wrapped = writable { + when (optional) { + false -> rustTemplate("#{Some}(e.$accessorFunctionName())", *preludeScope) + true -> rustTemplate("e.$accessorFunctionName()") + } + } val sym = codegenContext.symbolProvider.toSymbol(error) - rust("Self::${sym.name}(e) => e.$accessorFunctionName(),") + rust("Self::${sym.name}(e) => #T,", wrapped) } rust("Self::Unhandled(e) => e.$accessorFunctionName(),") } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt index 6b117b60da2..3cd223ae44b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt @@ -5,6 +5,8 @@ package software.amazon.smithy.rustsdk.customize.s3 +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rustsdk.BaseRequestIdDecorator @@ -17,6 +19,10 @@ class S3ExtendedRequestIdDecorator : BaseRequestIdDecorator() { override val fieldName: String = "extended_request_id" override val accessorFunctionName: String = "extended_request_id" + override fun asMemberShape(container: StructureShape): MemberShape? { + return null + } + private val requestIdModule: RuntimeType = RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("s3_request_id")) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 503d8ae4f3a..74c19ea048d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -60,12 +60,12 @@ class TimestreamDecorator : ClientCodegenDecorator { client.describe_endpoints().send().await.map_err(|e| { #{ResolveEndpointError}::from_source("failed to call describe_endpoints", e) })?; - let endpoint = describe_endpoints.endpoints().unwrap().get(0).unwrap(); + let endpoint = describe_endpoints.endpoints().get(0).unwrap(); let expiry = client.config().time_source().expect("checked when ep discovery was enabled").now() + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); Ok(( #{Endpoint}::builder() - .url(format!("https://{}", endpoint.address().unwrap())) + .url(format!("https://{}", endpoint.address())) .build(), expiry, )) diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt index 51eba7fa861..ae919497f0f 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt @@ -6,15 +6,22 @@ package software.amazon.smithy.rustsdk.customize.ec2 import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.util.lookup internal class EC2MakePrimitivesOptionalTest { - @Test - fun `primitive shapes are boxed`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + ) + fun `primitive shapes are boxed`(nullabilityCheckMode: NullableIndex.CheckMode) { val baseModel = """ namespace test structure Primitives { @@ -36,7 +43,7 @@ internal class EC2MakePrimitivesOptionalTest { val nullableIndex = NullableIndex(model) val struct = model.lookup("test#Primitives") struct.members().forEach { - nullableIndex.isMemberNullable(it, NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1) shouldBe true + nullableIndex.isMemberNullable(it, nullabilityCheckMode) shouldBe true } } } diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 5ac1ef092c0..9a2037642d8 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -60,6 +60,7 @@ val crateVersioner by lazy { aws.sdk.CrateVersioner.defaultFor(rootProject, prop fun getRustMSRV(): String = properties.get("rust.msrv") ?: throw Exception("Rust MSRV missing") fun getPreviousReleaseVersionManifestPath(): String? = properties.get("aws.sdk.previous.release.versions.manifest") +fun getNullabilityCheckMode(): String = properties.get("nullability.check.mode") ?: "CLIENT_CAREFUL" fun loadServiceMembership(): Membership { val membershipOverride = properties.get("aws.services")?.let { parseMembership(it) } @@ -103,7 +104,8 @@ fun generateSmithyBuild(services: AwsServices): String { "renameErrors": false, "debugMode": $debugMode, "eventStreamAllowList": [$eventStreamAllowListMembers], - "enableUserConfigurableRuntimePlugins": false + "enableUserConfigurableRuntimePlugins": false, + "nullabilityCheckMode": "${getNullabilityCheckMode()}" }, "service": "${service.service}", "module": "$moduleName", diff --git a/aws/sdk/integration-tests/Cargo.toml b/aws/sdk/integration-tests/Cargo.toml index 284bc1bcb1c..f18a4438398 100644 --- a/aws/sdk/integration-tests/Cargo.toml +++ b/aws/sdk/integration-tests/Cargo.toml @@ -14,7 +14,7 @@ members = [ "s3", "s3control", "sts", - "transcribestreaming", "timestreamquery", + "transcribestreaming", "webassembly", ] diff --git a/aws/sdk/integration-tests/dynamodb/tests/movies.rs b/aws/sdk/integration-tests/dynamodb/tests/movies.rs index a3eaa244ad8..7b045c6f5b5 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/movies.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/movies.rs @@ -28,31 +28,36 @@ async fn create_table(client: &Client, table_name: &str) { KeySchemaElement::builder() .attribute_name("year") .key_type(KeyType::Hash) - .build(), + .build() + .unwrap(), ) .key_schema( KeySchemaElement::builder() .attribute_name("title") .key_type(KeyType::Range) - .build(), + .build() + .unwrap(), ) .attribute_definitions( AttributeDefinition::builder() .attribute_name("year") .attribute_type(ScalarAttributeType::N) - .build(), + .build() + .unwrap(), ) .attribute_definitions( AttributeDefinition::builder() .attribute_name("title") .attribute_type(ScalarAttributeType::S) - .build(), + .build() + .unwrap(), ) .provisioned_throughput( ProvisionedThroughput::builder() .read_capacity_units(10) .write_capacity_units(10) - .build(), + .build() + .unwrap(), ) .send() .await diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index b73dea2fc7a..816f3cd8fb5 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -3,19 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_qldbsession as qldbsession; +use aws_sdk_qldbsession::config::{Config, Credentials, Region}; +use aws_sdk_qldbsession::types::StartSessionRequest; +use aws_sdk_qldbsession::Client; use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; use http::Uri; -use qldbsession::config::{Config, Credentials, Region}; -use qldbsession::types::StartSessionRequest; -use qldbsession::Client; use std::time::{Duration, UNIX_EPOCH}; -// TODO(DVR): having the full HTTP requests right in the code is a bit gross, consider something -// like https://github.com/davidbarsky/sigv4/blob/master/aws-sigv4/src/lib.rs#L283-L315 to store -// the requests/responses externally - #[tokio::test] async fn signv4_use_correct_service_name() { let conn = TestConnection::new(vec![( @@ -46,7 +41,8 @@ async fn signv4_use_correct_service_name() { .start_session( StartSessionRequest::builder() .ledger_name("not-real-ledger") - .build(), + .build() + .unwrap(), ) .customize() .await diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index d7173e31d70..0d39e4b7549 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -106,6 +106,8 @@ val allCodegenTests = listOf( "pokemon-service-awsjson-client", dependsOn = listOf("pokemon-awsjson.smithy", "pokemon-common.smithy"), ), + ClientTest("aws.protocoltests.json#RequiredValueJson", "required-values-json"), + ClientTest("aws.protocoltests.json#RequiredValueXml", "required-values-xml"), ).map(ClientTest::toCodegenTest) project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) diff --git a/codegen-client-test/model/error-correction-nullability-test.smithy b/codegen-client-test/model/error-correction-nullability-test.smithy new file mode 100644 index 00000000000..8a125d30047 --- /dev/null +++ b/codegen-client-test/model/error-correction-nullability-test.smithy @@ -0,0 +1,128 @@ +$version: "2.0" + + +namespace aws.protocoltests.json + +use aws.protocols#awsJson1_0 +use aws.protocols#restXml +use smithy.test#httpResponseTests + +@awsJson1_0 +service RequiredValueJson { + operations: [SayHello], + version: "1" +} + + +@restXml +service RequiredValueXml { + operations: [SayHelloXml], + version: "1" +} + +@error("client") +structure Error { + @required + requestId: String + + @required + message: String +} + +@http(method: "POST", uri: "/") +operation SayHello { output: TestOutputDocument, errors: [Error] } + +@http(method: "POST", uri: "/") +operation SayHelloXml { output: TestOutput, errors: [Error] } + +structure TestOutputDocument with [TestStruct] { innerField: Nested, @required document: Document } +structure TestOutput with [TestStruct] { innerField: Nested } + +@mixin +structure TestStruct { + @required + foo: String, + @required + byteValue: Byte, + @required + listValue: StringList, + @required + mapValue: ListMap, + @required + doubleListValue: DoubleList + @required + nested: Nested + @required + blob: Blob + @required + enum: Enum + @required + union: U + notRequired: String +} + +enum Enum { + A, + B, + C +} +union U { + A: Integer, + B: String, + C: Unit +} + +structure Nested { + @required + a: String +} + +list StringList { + member: String +} + +list DoubleList { + member: StringList +} + +map ListMap { + key: String, + value: StringList +} + +apply SayHello @httpResponseTests([{ + id: "error_recovery_json", + protocol: awsJson1_0, + params: { + union: { A: 5 }, + enum: "A", + foo: "", + byteValue: 0, + blob: "", + listValue: [], + mapValue: {}, + doubleListValue: [] + document: null + nested: { a: "" } + }, + code: 200, + body: "{\"union\": { \"A\": 5 }, \"enum\": \"A\" }" + }]) + +apply SayHelloXml @httpResponseTests([{ + id: "error_recovery_xml", + protocol: restXml, + params: { + union: { A: 5 }, + enum: "A", + foo: "", + byteValue: 0, + blob: "", + listValue: [], + mapValue: {}, + doubleListValue: [] + nested: { a: "" } + }, + code: 200, + body: "5A" + }]) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt index 987a1df85c5..efeef74e4be 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.rust.codegen.client.smithy import software.amazon.smithy.build.PluginContext import software.amazon.smithy.model.Model -import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.Shape @@ -77,10 +76,11 @@ class ClientCodegenVisitor( val rustSymbolProviderConfig = RustSymbolProviderConfig( runtimeConfig = settings.runtimeConfig, renameExceptions = settings.codegenConfig.renameExceptions, - nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1, + nullabilityCheckMode = settings.codegenConfig.nullabilityCheckMode, moduleProvider = ClientModuleProvider, nameBuilderFor = { symbol -> "${symbol.name}Builder" }, ) + val baseModel = baselineTransform(context.model) val untransformedService = settings.getService(baseModel) val (protocol, generator) = ClientProtocolLoader( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index dc6fd4f0280..acc0a591844 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.core.smithy.CODEGEN_SETTINGS @@ -81,6 +82,7 @@ data class ClientRustSettings( data class ClientCodegenConfig( override val formatTimeoutSeconds: Int = defaultFormatTimeoutSeconds, override val debugMode: Boolean = defaultDebugMode, + val nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, val renameExceptions: Boolean = defaultRenameExceptions, val includeFluentClient: Boolean = defaultIncludeFluentClient, val addMessageToErrors: Boolean = defaultAddMessageToErrors, @@ -99,6 +101,7 @@ data class ClientCodegenConfig( private val defaultEventStreamAllowList: Set = emptySet() private const val defaultIncludeEndpointUrlConfig = true private const val defaultEnableUserConfigurableRuntimePlugins = true + private const val defaultNullabilityCheckMode = "CLIENT" fun fromCodegenConfigAndNode(coreCodegenConfig: CoreCodegenConfig, node: Optional) = if (node.isPresent) { @@ -115,11 +118,13 @@ data class ClientCodegenConfig( addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("enableUserConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), + nullabilityCheckMode = NullableIndex.CheckMode.valueOf(node.get().getStringMemberOrDefault("nullabilityCheckMode", defaultNullabilityCheckMode)), ) } else { ClientCodegenConfig( formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds, debugMode = coreCodegenConfig.debugMode, + nullabilityCheckMode = NullableIndex.CheckMode.valueOf(defaultNullabilityCheckMode), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt index eead91bbe0f..dd1bcfef08f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt @@ -19,6 +19,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.util.findMemberWithTrait import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -37,28 +38,51 @@ class IdempotencyTokenGenerator( return emptySection } val memberName = symbolProvider.toMemberName(idempotencyTokenMember) + val codegenScope = arrayOf( + *preludeScope, + "Input" to symbolProvider.toSymbol(inputShape), + "IdempotencyTokenRuntimePlugin" to + InlineDependency.forRustFile( + RustModule.pubCrate("client_idempotency_token", parent = ClientRustModule.root), + "/inlineable/src/client_idempotency_token.rs", + CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyTypes(runtimeConfig), + ).toType().resolve("IdempotencyTokenRuntimePlugin"), + ) + return when (section) { is OperationSection.AdditionalRuntimePlugins -> writable { section.addOperationRuntimePlugin(this) { - rustTemplate( - """ - #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { - let input: &mut #{Input} = input.downcast_mut().expect("correct type"); - if input.$memberName.is_none() { - input.$memberName = #{Some}(token_provider.make_idempotency_token()); - } - }) - """, - *preludeScope, - "Input" to symbolProvider.toSymbol(inputShape), - "IdempotencyTokenRuntimePlugin" to - InlineDependency.forRustFile( - RustModule.pubCrate("client_idempotency_token", parent = ClientRustModule.root), - "/inlineable/src/client_idempotency_token.rs", - CargoDependency.smithyRuntimeApi(runtimeConfig), - CargoDependency.smithyTypes(runtimeConfig), - ).toType().resolve("IdempotencyTokenRuntimePlugin"), - ) + if (symbolProvider.toSymbol(idempotencyTokenMember).isOptional()) { + // An idempotency token is optional. If the user didn't specify a token + // then we'll generate one and set it. + rustTemplate( + """ + #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { + let input: &mut #{Input} = input.downcast_mut().expect("correct type"); + if input.$memberName.is_none() { + input.$memberName = #{Some}(token_provider.make_idempotency_token()); + } + }) + """, + *codegenScope, + ) + } else { + // An idempotency token is required, but it'll be set to an empty string if + // the user didn't specify one. If that's the case, then we'll generate one + // and set it. + rustTemplate( + """ + #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { + let input: &mut #{Input} = input.downcast_mut().expect("correct type"); + if input.$memberName.is_empty() { + input.$memberName = token_provider.make_idempotency_token(); + } + }) + """, + *codegenScope, + ) + } } } else -> emptySection diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt index 34d315a3f31..453568c8c57 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt @@ -34,11 +34,11 @@ class ClientBuilderInstantiator(private val clientCodegenContext: ClientCodegenC } if (BuilderGenerator.hasFallibleBuilder(shape, clientCodegenContext.symbolProvider)) { rustTemplate( - "#{builder}.build()#{mapErr}?", + "#{builder}.build()#{mapErr}", "builder" to builderW, "mapErr" to ( mapErr?.map { - rust(".map_err(#T)", it) + rust(".map_err(#T)?", it) } ?: writable { } ), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt index 6f212014de7..b05c0143836 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt @@ -58,8 +58,15 @@ private fun ClientCodegenContext.errorCorrectedDefault(member: MemberShape): Wri val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider) return writable { when { - target is EnumShape || target.hasTrait() -> rustTemplate(""""no value was set".parse::<#{Shape}>().ok()""", "Shape" to targetSymbol) - target is BooleanShape || target is NumberShape || target is StringShape || target is DocumentShape || target is ListShape || target is MapShape -> rust("Some(Default::default())") + target is EnumShape || target.hasTrait() -> rustTemplate( + """"no value was set".parse::<#{Shape}>().ok()""", + "Shape" to targetSymbol, + ) + + target is BooleanShape || target is NumberShape || target is StringShape || target is DocumentShape || target is ListShape || target is MapShape -> rust( + "Some(Default::default())", + ) + target is StructureShape -> rustTemplate( "{ let builder = #{Builder}::default(); #{instantiate} }", "Builder" to symbolProvider.symbolForBuilder(target), @@ -73,6 +80,7 @@ private fun ClientCodegenContext.errorCorrectedDefault(member: MemberShape): Wri it.plus { rustTemplate(".map(#{Box}::new)", *preludeScope) } }, ) + target is TimestampShape -> instantiator.instantiate(target, Node.from(0)).some()(this) target is BlobShape -> instantiator.instantiate(target, Node.from("")).some()(this) target is UnionShape -> rust("Some(#T::Unknown)", targetSymbol) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt index 608cd5869a2..17632df46f5 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt @@ -26,7 +26,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation @@ -131,7 +130,7 @@ class ProtocolParserGenerator( withBlock("Err(match error_code {", "})") { val errors = operationShape.operationErrors(model) errors.forEach { error -> - val errorShape = model.expectShape(error.id, software.amazon.smithy.model.shapes.StructureShape::class.java) + val errorShape = model.expectShape(error.id, StructureShape::class.java) val variantName = symbolProvider.toSymbol(model.expectShape(error.id)).name val errorCode = httpBindingResolver.errorCode(errorShape).dq() withBlock( @@ -139,7 +138,7 @@ class ProtocolParserGenerator( "}),", errorSymbol, ) { - software.amazon.smithy.rust.codegen.core.rustlang.Attribute.AllowUnusedMut.render(this) + Attribute.AllowUnusedMut.render(this) assignment("mut tmp") { rustBlock("") { renderShapeParser( @@ -159,14 +158,18 @@ class ProtocolParserGenerator( ) } } - if (errorShape.errorMessageMember() != null) { - rust( - """ - if tmp.message.is_none() { - tmp.message = _error_message; - } - """, - ) + val errorMessageMember = errorShape.errorMessageMember() + // If the message member is optional and wasn't set, we set a generic error message. + if (errorMessageMember != null) { + if (errorMessageMember.isOptional) { + rust( + """ + if tmp.message.is_none() { + tmp.message = _error_message; + } + """, + ) + } } rust("tmp") } @@ -257,18 +260,15 @@ class ProtocolParserGenerator( } } - val err = if (BuilderGenerator.hasFallibleBuilder(outputShape, symbolProvider)) { - ".map_err(${format(errorSymbol)}::unhandled)?" - } else { - "" + val mapErr = writable { + rust("#T::unhandled", errorSymbol) } writeCustomizations( customizations, OperationSection.MutateOutput(customizations, operationShape, "_response_headers"), ) - - rust("output.build()$err") + codegenContext.builderInstantiator().finalizeBuilder("output", outputShape, mapErr)(this) } /** diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index e7ccd105073..f2a79906dea 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -435,7 +435,7 @@ class DefaultProtocolTestGenerator( // When we generate a body instead of a stub, drop the trailing `;` and enable the assertion assertOk(rustWriter) { rustWriter.write( - "#T(&body, ${ + "#T(body, ${ rustWriter.escape(body).dq() }, #T::from(${(mediaType ?: "unknown").dq()}))", RT.protocolTest(rc, "validate_body"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt index d7cdd7594c7..cb9c7db7e5a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt @@ -63,9 +63,9 @@ private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = if (compatibleWithAwsQuery(codegenContext.serviceShape, version)) { - AwsQueryCompatible(codegenContext, AwsJson(codegenContext, version, codegenContext.builderInstantiator())) + AwsQueryCompatible(codegenContext, AwsJson(codegenContext, version)) } else { - AwsJson(codegenContext, version, codegenContext.builderInstantiator()) + AwsJson(codegenContext, version) } override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index d6878f1b96b..390e9d28806 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -109,6 +109,7 @@ class EndpointsDecoratorTest { input: TestOperationInput } + @input structure TestOperationInput { @contextParam(name: "Bucket") @required diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt index 58490103122..3cdc523d9cc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt @@ -97,24 +97,24 @@ class ErrorCorrectionTest { rustTemplate( """ let builder = #{correct_errors}(#{Shape}::builder().foo("abcd")); - let shape = builder.build(); + let shape = builder.build().unwrap(); // don't override a field already set - assert_eq!(shape.foo(), Some("abcd")); + assert_eq!(shape.foo(), "abcd"); // set nested fields - assert_eq!(shape.nested().unwrap().a(), Some("")); + assert_eq!(shape.nested().a(), ""); // don't default non-required fields assert_eq!(shape.not_required(), None); // set defaults for everything else - assert_eq!(shape.blob().unwrap().as_ref(), &[]); + assert_eq!(shape.blob().as_ref(), &[]); - assert_eq!(shape.list_value(), Some(&[][..])); - assert!(shape.map_value().unwrap().is_empty()); - assert_eq!(shape.double_list_value(), Some(&[][..])); + assert!(shape.list_value().is_empty()); + assert!(shape.map_value().is_empty()); + assert!(shape.double_list_value().is_empty()); // enums and unions become unknown variants - assert!(matches!(shape.r##enum(), Some(crate::types::Enum::Unknown(_)))); - assert!(shape.union().unwrap().is_unknown()); + assert!(matches!(shape.r##enum(), crate::types::Enum::Unknown(_))); + assert!(shape.union().is_unknown()); """, *codegenCtx, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 36e0dbdb6ae..1ada2d199c3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -494,6 +494,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { } companion object { + val AllowNeedlessQuestionMark = Attribute(allow("clippy::needless_question_mark")) val AllowClippyBoxedLocal = Attribute(allow("clippy::boxed_local")) val AllowClippyLetAndReturn = Attribute(allow("clippy::let_and_return")) val AllowClippyNeedlessBorrow = Attribute(allow("clippy::needless_borrow")) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt index 72db4046d79..b477ab5607f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt @@ -49,8 +49,8 @@ open class CoreCodegenConfig( fun fromNode(node: Optional): CoreCodegenConfig = if (node.isPresent) { CoreCodegenConfig( - node.get().getNumberMemberOrDefault("formatTimeoutSeconds", defaultFormatTimeoutSeconds).toInt(), - node.get().getBooleanMemberOrDefault("debugMode", defaultDebugMode), + formatTimeoutSeconds = node.get().getNumberMemberOrDefault("formatTimeoutSeconds", defaultFormatTimeoutSeconds).toInt(), + debugMode = node.get().getBooleanMemberOrDefault("debugMode", defaultDebugMode), ) } else { CoreCodegenConfig( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt index 31659a3744a..ec83941c8f5 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt @@ -192,7 +192,7 @@ open class SymbolVisitor( val rustType = RustType.Opaque(shape.contextName(serviceShape).toPascalCase()) symbolBuilder(shape, rustType).locatedIn(moduleForShape(shape)).build() } else { - simpleShape(shape) + symbolBuilder(shape, RustType.String).build() } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index 9a952ebe405..26a607f497f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -87,6 +87,8 @@ fun MemberShape.enforceRequired( return field } val shape = this + val isOptional = codegenContext.symbolProvider.toSymbol(shape).isOptional() + val field = field.letIf(!isOptional) { field.map { rust("Some(#T)", it) } } val error = OperationBuildError(codegenContext.runtimeConfig).missingField( codegenContext.symbolProvider.toMemberName(shape), "A required field was not set", ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt index 799aa1a000a..a01ad09545c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt @@ -141,7 +141,7 @@ open class Instantiator( private fun renderMember(writer: RustWriter, memberShape: MemberShape, data: Node, ctx: Ctx) { val targetShape = model.expectShape(memberShape.target) val symbol = symbolProvider.toSymbol(memberShape) - if (data is NullNode) { + if (data is NullNode && !targetShape.isDocumentShape) { check(symbol.isOptional()) { "A null node was provided for $memberShape but the symbol was not optional. This is invalid input data." } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt index 0b3178095c1..0a534225522 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt @@ -18,7 +18,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserGenerator import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator @@ -123,7 +122,6 @@ class AwsJsonSerializerGenerator( open class AwsJson( val codegenContext: CodegenContext, val awsJsonVersion: AwsJsonVersion, - val builderInstantiator: BuilderInstantiator, ) : Protocol { private val runtimeConfig = codegenContext.runtimeConfig private val errorScope = arrayOf( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt index b7205562d19..03caf527a89 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt @@ -476,6 +476,7 @@ class XmlBindingTraitParserGenerator( private fun RustWriter.parseStructure(shape: StructureShape, ctx: Ctx) { val symbol = symbolProvider.toSymbol(shape) val nestedParser = protocolFunctions.deserializeFn(shape) { fnName -> + Attribute.AllowNeedlessQuestionMark.render(this) rustBlockTemplate( "pub fn $fnName(decoder: &mut #{ScopedDecoder}) -> Result<#{Shape}, #{XmlDecodeError}>", *codegenScope, "Shape" to symbol, @@ -493,7 +494,7 @@ class XmlBindingTraitParserGenerator( shape, mapErr = { rustTemplate( - """.map_err(|_|#{XmlDecodeError}::custom("missing field"))?""", + """|_|#{XmlDecodeError}::custom("missing field")""", *codegenScope, ) }, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt index 1a5b37bc749..c6adbd3bec6 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt @@ -5,6 +5,7 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.BlobShape import software.amazon.smithy.model.shapes.BooleanShape import software.amazon.smithy.model.shapes.CollectionShape @@ -44,13 +45,14 @@ import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.isTargetUnit import software.amazon.smithy.rust.codegen.core.util.orNull -abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : StructuredDataSerializerGenerator { +abstract class QuerySerializerGenerator(private val codegenContext: CodegenContext) : StructuredDataSerializerGenerator { protected data class Context( /** Expression that yields a QueryValueWriter */ val writerExpression: String, /** Expression representing the value to write to the QueryValueWriter */ val valueExpression: ValueExpression, val shape: T, + val isOptional: Boolean = false, ) protected data class MemberContext( @@ -88,6 +90,7 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct protected val model = codegenContext.model protected val symbolProvider = codegenContext.symbolProvider protected val runtimeConfig = codegenContext.runtimeConfig + private val nullableIndex = NullableIndex(model) private val target = codegenContext.target private val serviceShape = codegenContext.serviceShape private val serializerError = runtimeConfig.serializationError() @@ -118,7 +121,7 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct } override fun unsetStructure(structure: StructureShape): RuntimeType { - TODO("AwsQuery doesn't support payload serialization") + TODO("$protocolName doesn't support payload serialization") } override fun unsetUnion(union: UnionShape): RuntimeType { @@ -179,7 +182,8 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct rust("Ok(())") } } - rust("#T(${context.writerExpression}, ${context.valueExpression.name})?;", structureSerializer) + + rust("#T(${context.writerExpression}, ${context.valueExpression.asRef()})?;", structureSerializer) } private fun RustWriter.serializeStructureInner(context: Context) { @@ -216,9 +220,11 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct val writer = context.writerExpression val value = context.valueExpression when (target) { - is StringShape -> when (target.hasTrait()) { - true -> rust("$writer.string(${value.name}.as_str());") - false -> rust("$writer.string(${value.name});") + is StringShape -> { + when (target.hasTrait()) { + true -> rust("$writer.string(${value.name}.as_str());") + false -> rust("$writer.string(${value.asRef()});") + } } is BooleanShape -> rust("$writer.boolean(${value.asValue()});") is NumberShape -> { @@ -234,13 +240,13 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct ) } is BlobShape -> rust( - "$writer.string(&#T(${value.name}));", + "$writer.string(&#T(${value.asRef()}));", RuntimeType.base64Encode(runtimeConfig), ) is TimestampShape -> { val timestampFormat = determineTimestampFormat(context.shape) val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat) - rust("$writer.date_time(${value.name}, #T)?;", timestampFormatType) + rust("$writer.date_time(${value.asRef()}, #T)?;", timestampFormatType) } is CollectionShape -> serializeCollection(context, Context(writer, context.valueExpression, target)) is MapShape -> serializeMap(context, Context(writer, context.valueExpression, target)) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt index 6147f84e2f8..96af195c764 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt @@ -10,18 +10,28 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator /** * A Default instantiator that uses `builder.build()` in all cases. This exists to support tests in codegen-core * and to serve as the base behavior for client and server instantiators. */ -class DefaultBuilderInstantiator : BuilderInstantiator { +class DefaultBuilderInstantiator(private val checkFallibleBuilder: Boolean, private val symbolProvider: RustSymbolProvider) : BuilderInstantiator { override fun setField(builder: String, value: Writable, field: MemberShape): Writable { return setFieldWithSetter(builder, value, field) } override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable { - return writable { rust("builder.build()") } + return writable { + rust("builder.build()") + if (checkFallibleBuilder && BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) { + if (mapErr != null) { + rust(".map_err(#T)", mapErr) + } + rust("?") + } + } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt index d6b43b97cbb..e944a552a08 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt @@ -145,7 +145,7 @@ object EventStreamTestModels { validTestUnion = """{"Foo":"hello"}""", validSomeError = """{"Message":"some error"}""", validUnmodeledError = """{"Message":"unmodeled error"}""", - ) { AwsJson(it, AwsJsonVersion.Json11, builderInstantiator = DefaultBuilderInstantiator()) }, + ) { AwsJson(it, AwsJsonVersion.Json11) }, // // restXml diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index ae0398ae92b..87ebb679cc1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -105,10 +105,10 @@ private object CodegenCoreTestModules { } } -val TestRustSymbolProviderConfig = RustSymbolProviderConfig( +fun testRustSymbolProviderConfig(nullabilityCheckMode: NullableIndex.CheckMode) = RustSymbolProviderConfig( runtimeConfig = TestRuntimeConfig, renameExceptions = true, - nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1, + nullabilityCheckMode = nullabilityCheckMode, moduleProvider = CodegenCoreTestModules.TestModuleProvider, ) @@ -147,12 +147,12 @@ fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = internal fun testSymbolProvider( model: Model, rustReservedWordConfig: RustReservedWordConfig? = null, - config: RustSymbolProviderConfig = TestRustSymbolProviderConfig, + nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, ): RustSymbolProvider = SymbolVisitor( testRustSettings(), model, ServiceShape.builder().version("test").id("test#Service").build(), - config, + testRustSymbolProviderConfig(nullabilityCheckMode), ).let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf(Attribute.NonExhaustive)) } .let { RustReservedWordSymbolProvider( @@ -167,9 +167,10 @@ internal fun testCodegenContext( serviceShape: ServiceShape? = null, settings: CoreRustSettings = testRustSettings(), codegenTarget: CodegenTarget = CodegenTarget.CLIENT, + nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, ): CodegenContext = object : CodegenContext( model, - testSymbolProvider(model), + testSymbolProvider(model, nullabilityCheckMode = nullabilityCheckMode), TestModuleDocProvider, serviceShape ?: model.serviceShapes.firstOrNull() @@ -179,14 +180,13 @@ internal fun testCodegenContext( codegenTarget, ) { override fun builderInstantiator(): BuilderInstantiator { - return DefaultBuilderInstantiator() + return DefaultBuilderInstantiator(codegenTarget == CodegenTarget.CLIENT, symbolProvider) } } /** * In tests, we frequently need to generate a struct, a builder, and an impl block to access said builder. */ - fun StructureShape.renderWithModelBuilder( model: Model, symbolProvider: RustSymbolProvider, diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt index 25e47e09635..ec97799af42 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt @@ -8,20 +8,21 @@ package software.amazon.smithy.rust.codegen.core.rustlang import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.core.smithy.MaybeRenamed import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.renamedFrom -import software.amazon.smithy.rust.codegen.core.testutil.TestRustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.testRustSettings +import software.amazon.smithy.rust.codegen.core.testutil.testRustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.util.lookup internal class RustReservedWordSymbolProviderTest { - private class TestSymbolProvider(model: Model) : - WrappingSymbolProvider(SymbolVisitor(testRustSettings(), model, null, TestRustSymbolProviderConfig)) + private class TestSymbolProvider(model: Model, nullabilityCheckMode: NullableIndex.CheckMode) : + WrappingSymbolProvider(SymbolVisitor(testRustSettings(), model, null, testRustSymbolProviderConfig(nullabilityCheckMode))) private val emptyConfig = RustReservedWordConfig(emptyMap(), emptyMap(), emptyMap()) @Test @@ -30,13 +31,13 @@ internal class RustReservedWordSymbolProviderTest { namespace test structure Self {} """.asSmithyModel() - val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model), emptyConfig) + val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), emptyConfig) val symbol = provider.toSymbol(model.lookup("test#Self")) symbol.name shouldBe "SelfValue" } private fun mappingTest(config: RustReservedWordConfig, model: Model, id: String, test: (String) -> Unit) { - val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model), config) + val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), config) val symbol = provider.toMemberName(model.lookup("test#Container\$$id")) test(symbol) } @@ -132,7 +133,7 @@ internal class RustReservedWordSymbolProviderTest { async: String } """.asSmithyModel() - val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model), emptyConfig) + val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), emptyConfig) provider.toMemberName( MemberShape.builder().id("namespace#container\$async").target("namespace#Integer").build(), ) shouldBe "r##async" @@ -149,7 +150,7 @@ internal class RustReservedWordSymbolProviderTest { @enum([{ name: "dontcare", value: "dontcare" }]) string Container """.asSmithyModel() val provider = RustReservedWordSymbolProvider( - TestSymbolProvider(model), + TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), reservedWordConfig = emptyConfig.copy( enumMemberMap = mapOf( "Unknown" to "UnknownValue", diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index 3e1886a1959..06888429e65 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -17,7 +17,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.Default import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.setDefault -import software.amazon.smithy.rust.codegen.core.testutil.TestRustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest @@ -184,7 +183,7 @@ internal class BuilderGeneratorTest { val provider = testSymbolProvider( model, rustReservedWordConfig = StructureGeneratorTest.rustReservedWordConfig, - config = TestRustSymbolProviderConfig.copy(nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_CAREFUL), + nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_CAREFUL, ) val project = TestWorkspace.testProject(provider) val shape: StructureShape = model.lookup("com.test#MyStruct") diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt index 77932ddfac6..af7ff639b5b 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt @@ -84,7 +84,6 @@ class StructureGeneratorTest { val credentials = model.lookup("com.test#Credentials") val secretStructure = model.lookup("com.test#SecretStructure") val structWithInnerSecretStructure = model.lookup("com.test#StructWithInnerSecretStructure") - val error = model.lookup("com.test#MyError") val rustReservedWordConfig: RustReservedWordConfig = RustReservedWordConfig( structureMemberMap = StructureGenerator.structureMemberNameMap, diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt index 79435b5e9b8..108207473ff 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt @@ -149,7 +149,7 @@ class JsonParserGeneratorTest { let top = output.top.expect("top"); assert_eq!(Some(45), top.extra); assert_eq!(Some("something".to_string()), top.field); - assert_eq!(Some(Choice::Int(5)), top.choice); + assert_eq!(Choice::Int(5), top.choice); """, ) unitTest( @@ -166,7 +166,7 @@ class JsonParserGeneratorTest { // unknown variant let input = br#"{ "top": { "choice": { "somenewvariant": "data" } } }"#; let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build(); - assert!(output.top.unwrap().choice.unwrap().is_unknown()); + assert!(output.top.unwrap().choice.is_unknown()); """, ) diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt index 47f310e83df..0d78af182ea 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt @@ -81,7 +81,7 @@ internal class XmlBindingTraitParserGeneratorTest { extra: Long, @xmlName("prefix:local") - renamedWithPrefix: String + renamedWithPrefix: String, } @http(uri: "/top", method: "POST") diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt index ad44554e36d..2203b05dc1f 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt @@ -7,10 +7,12 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator.Companion.hasFallibleBuilder import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -95,7 +97,7 @@ class AwsQuerySerializerGeneratorTest { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) val codegenContext = testCodegenContext(model, codegenTarget = codegenTarget) val symbolProvider = codegenContext.symbolProvider - val parserGenerator = AwsQuerySerializerGenerator(testCodegenContext(model, codegenTarget = codegenTarget)) + val parserGenerator = AwsQuerySerializerGenerator(codegenContext) val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) val project = TestWorkspace.testProject(symbolProvider) @@ -152,4 +154,162 @@ class AwsQuerySerializerGeneratorTest { } project.compileAndTest() } + + private val baseModelWithRequiredTypes = """ + namespace test + use aws.protocols#restJson1 + + union Choice { + blob: Blob, + boolean: Boolean, + date: Timestamp, + enum: FooEnum, + int: Integer, + @xmlFlattened + list: SomeList, + long: Long, + map: MyMap, + number: Double, + s: String, + top: Top, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + key: String, + value: Choice, + } + + list SomeList { + member: Choice + } + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + extra: Long, + @xmlName("rec") + recursive: TopList + } + + list TopList { + @xmlName("item") + member: Top + } + + structure OpInput { + @required + @xmlName("some_bool") + boolean: Boolean, + list: SomeList, + map: MyMap, + @required + top: Top, + @required + blob: Blob + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "true, CLIENT", + "true, CLIENT_CAREFUL", + "true, CLIENT_ZERO_VALUE_V1", + "true, CLIENT_ZERO_VALUE_V1_NO_INPUT", + "false, SERVER", + ) + fun `generates valid serializers for required types`(generateUnknownVariant: Boolean, nullabilityCheckMode: NullableIndex.CheckMode) { + val codegenTarget = when (generateUnknownVariant) { + true -> CodegenTarget.CLIENT + false -> CodegenTarget.SERVER + } + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val codegenContext = testCodegenContext(model, codegenTarget = codegenTarget, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserGenerator = AwsQuerySerializerGenerator(codegenContext) + val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) + + val project = TestWorkspace.testProject(symbolProvider) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "query_serializer", + """ + use test_model::{Choice, Top}; + + let input = crate::test_input::OpInput::builder() + .top( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .boolean(true) + .blob(aws_smithy_types::Blob::new(&b"test"[..])) + .build() + .unwrap(); + let serialized = ${format(operationGenerator!!)}(&input).unwrap(); + let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap(); + assert_eq!( + output, + "\ + Action=Op\ + &Version=test\ + &some_bool=true\ + &top.choice.choice=true\ + &top.field=Hello\ + &top.extra=45\ + &top.rec.item.1.choice.choice=true\ + &top.rec.item.1.field=World%21\ + &top.rec.item.1.extra=55\ + &blob=dGVzdA%3D%3D" + ); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator( + model, + symbolProvider, + this, + model.lookup("test#Choice"), + renderUnknownVariant = generateUnknownVariant, + ).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt index 2436aff7061..4b5f490e13a 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt @@ -5,10 +5,13 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -19,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder import software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext +import software.amazon.smithy.rust.codegen.core.testutil.testRustSettings import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -83,10 +87,18 @@ class Ec2QuerySerializerGeneratorTest { } """.asSmithyModel() - @Test - fun `generates valid serializers`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val codegenContext = testCodegenContext(model) + val settings = testRustSettings() + val codegenContext = testCodegenContext(model, settings = settings, nullabilityCheckMode = nullabilityCheckMode) val symbolProvider = codegenContext.symbolProvider val parserGenerator = Ec2QuerySerializerGenerator(codegenContext) val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) @@ -139,4 +151,153 @@ class Ec2QuerySerializerGeneratorTest { } project.compileAndTest() } + + private val baseModelWithRequiredTypes = """ + namespace test + + union Choice { + blob: Blob, + boolean: Boolean, + date: Timestamp, + enum: FooEnum, + int: Integer, + @xmlFlattened + list: SomeList, + long: Long, + map: MyMap, + number: Double, + s: String, + top: Top, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + key: String, + value: Choice, + } + + list SomeList { + member: Choice + } + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + extra: Long, + @xmlName("rec") + recursive: TopList + } + + list TopList { + @xmlName("item") + member: Top + } + + structure OpInput { + @required + @xmlName("some_bool") + boolean: Boolean, + list: SomeList, + map: MyMap, + @required + top: Top, + @required + blob: Blob + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) { + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val settings = testRustSettings() + val codegenContext = testCodegenContext(model, settings = settings, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserGenerator = Ec2QuerySerializerGenerator(codegenContext) + val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) + + val project = TestWorkspace.testProject(testSymbolProvider(model)) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = + BuilderGenerator.hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "ec2query_serializer", + """ + use test_model::{Choice, Top}; + + let input = crate::test_input::OpInput::builder() + .top( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .boolean(true) + .blob(aws_smithy_types::Blob::new(&b"test"[..])) + .build() + .unwrap(); + let serialized = ${format(operationGenerator!!)}(&input).unwrap(); + let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap(); + assert_eq!( + output, + "\ + Action=Op\ + &Version=test\ + &Some_bool=true\ + &Top.Choice.Choice=true\ + &Top.Field=Hello\ + &Top.Extra=45\ + &Top.Rec.1.Choice.Choice=true\ + &Top.Rec.1.Field=World%21\ + &Top.Rec.1.Extra=55\ + &Blob=dGVzdA%3D%3D" + ); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt index 23c27f331b1..61140ecd420 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt @@ -5,10 +5,13 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -85,6 +88,7 @@ class JsonSerializerGeneratorTest { member: Top } + @input structure OpInput { @httpHeader("x-test") someHeader: String, @@ -98,10 +102,17 @@ class JsonSerializerGeneratorTest { } """.asSmithyModel() - @Test - fun `generates valid serializers`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val codegenContext = testCodegenContext(model) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) val symbolProvider = codegenContext.symbolProvider val parserSerializer = JsonSerializerGenerator( codegenContext, @@ -111,7 +122,7 @@ class JsonSerializerGeneratorTest { val operationGenerator = parserSerializer.operationInputSerializer(model.lookup("test#Op")) val documentGenerator = parserSerializer.documentSerializer() - val project = TestWorkspace.testProject(testSymbolProvider(model)) + val project = TestWorkspace.testProject(symbolProvider) project.lib { unitTest( "json_serializers", @@ -137,7 +148,174 @@ class JsonSerializerGeneratorTest { .choice(Choice::Unknown) .build() ).build().unwrap(); - let serialized = ${format(operationGenerator)}(&input).expect_err("cannot serialize unknown variant"); + ${format(operationGenerator)}(&input).expect_err("cannot serialize unknown variant"); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } + + private val baseModelWithRequiredTypes = """ + namespace test + use aws.protocols#restJson1 + + union Choice { + blob: Blob, + boolean: Boolean, + date: Timestamp, + document: Document, + enum: FooEnum, + int: Integer, + list: SomeList, + listSparse: SomeSparseList, + long: Long, + map: MyMap, + mapSparse: MySparseMap, + number: Double, + s: String, + top: Top, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + key: String, + value: Choice, + } + + @sparse + map MySparseMap { + key: String, + value: Choice, + } + + list SomeList { + member: Choice + } + + @sparse + list SomeSparseList { + member: Choice + } + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + extra: Long, + @jsonName("rec") + recursive: TopList + } + + list TopList { + member: Top + } + + @input + structure OpInput { + @httpHeader("x-test") + someHeader: String, + + @required + boolean: Boolean, + list: SomeList, + map: MyMap, + + @required + top: Top + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) { + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserSerializer = JsonSerializerGenerator( + codegenContext, + HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent("application/json")), + ::restJsonFieldName, + ) + val operationGenerator = parserSerializer.operationInputSerializer(model.lookup("test#Op")) + val documentGenerator = parserSerializer.documentSerializer() + + val project = TestWorkspace.testProject(testSymbolProvider(model)) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = + BuilderGenerator.hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "json_serializers", + """ + use test_model::{Choice, Top}; + + // Generate the document serializer even though it's not tested directly + // ${format(documentGenerator)} + + let input = crate::test_input::OpInput::builder() + .top( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .boolean(true) + .build() + .unwrap(); + let serialized = ${format(operationGenerator!!)}(&input).unwrap(); + let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap(); + assert_eq!(output, r#"{"boolean":true,"top":{"choice":{"boolean":true},"field":"Hello","extra":45,"rec":[{"choice":{"boolean":true},"field":"World!","extra":55}]}}"#); + + let input = crate::test_input::OpInput::builder().top( + Top::builder() + .field("Hello") + .choice(Choice::Unknown) + .extra(45) + .build() + $maybeUnwrap + ).boolean(false).build().unwrap(); + ${format(operationGenerator)}(&input).expect_err("cannot serialize unknown variant"); """, ) } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt index a695d2a4018..4410c33910b 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt @@ -5,13 +5,18 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex +import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer @@ -103,10 +108,17 @@ internal class XmlBindingTraitSerializerGeneratorTest { } """.asSmithyModel() - @Test - fun `generates valid serializers`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val codegenContext = testCodegenContext(model) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) val symbolProvider = codegenContext.symbolProvider val parserGenerator = XmlBindingTraitSerializerGenerator( codegenContext, @@ -120,14 +132,14 @@ internal class XmlBindingTraitSerializerGeneratorTest { "serialize_xml", """ use test_model::Top; - let inp = crate::test_input::OpInput::builder().payload( + let input = crate::test_input::OpInput::builder().payload( Top::builder() .field("hello!") .extra(45) .recursive(Top::builder().extra(55).build()) .build() ).build().unwrap(); - let serialized = ${format(operationSerializer)}(&inp.payload.unwrap()).unwrap(); + let serialized = ${format(operationSerializer)}(&input.payload.unwrap()).unwrap(); let output = std::str::from_utf8(&serialized).unwrap(); assert_eq!(output, "hello!"); """, @@ -158,4 +170,160 @@ internal class XmlBindingTraitSerializerGeneratorTest { } project.compileAndTest() } + + private val baseModelWithRequiredTypes = """ + namespace test + use aws.protocols#restXml + union Choice { + boolean: Boolean, + @xmlFlattened + @xmlName("Hi") + flatMap: MyMap, + deepMap: MyMap, + @xmlFlattened + flatList: SomeList, + deepList: SomeList, + s: String, + enum: FooEnum, + date: Timestamp, + number: Double, + top: Top, + blob: Blob, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + @xmlName("Name") + key: String, + @xmlName("Setting") + value: Choice, + } + + list SomeList { + member: Choice + } + + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + @xmlAttribute + extra: Long, + @xmlName("prefix:local") + renamedWithPrefix: String, + @xmlName("rec") + @xmlFlattened + recursive: TopList + } + + list TopList { + member: Top + } + + structure OpInput { + @required + @httpPayload + payload: Top + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) { + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserGenerator = XmlBindingTraitSerializerGenerator( + codegenContext, + HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent("application/xml")), + ) + val operationSerializer = parserGenerator.payloadSerializer(model.lookup("test#OpInput\$payload")) + + val project = TestWorkspace.testProject(symbolProvider) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = + BuilderGenerator.hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + val payloadIsOptional = model.lookup("test#OpInput\$payload").let { + symbolProvider.toSymbol(it).isOptional() + } + val maybeUnwrapPayload = if (payloadIsOptional) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "serialize_xml", + """ + use test_model::{Choice, Top}; + + let input = crate::test_input::OpInput::builder() + .payload( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .build() + .unwrap(); + let serialized = ${format(operationSerializer)}(&input.payload$maybeUnwrapPayload).unwrap(); + let output = std::str::from_utf8(&serialized).unwrap(); + assert_eq!(output, "trueHellotrueWorld!"); + """, + ) + unitTest( + "unknown_variants", + """ + use test_model::{Choice, Top}; + let input = crate::test_input::OpInput::builder().payload( + Top::builder() + .field("Hello") + .choice(Choice::Unknown) + .extra(45) + .build() + $maybeUnwrap + ).build().unwrap(); + ${format(operationSerializer)}(&input.payload$maybeUnwrapPayload).expect_err("cannot serialize unknown variant"); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt index 622123cd4a0..f86c547da19 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt @@ -122,7 +122,7 @@ class ServerAwsJsonProtocol( private val serverCodegenContext: ServerCodegenContext, awsJsonVersion: AwsJsonVersion, private val additionalParserCustomizations: List = listOf(), -) : AwsJson(serverCodegenContext, awsJsonVersion, serverCodegenContext.builderInstantiator()), ServerProtocol { +) : AwsJson(serverCodegenContext, awsJsonVersion), ServerProtocol { private val runtimeConfig = codegenContext.runtimeConfig override val protocolModulePath: String diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 33c374bbcb9..453eee98e42 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -6,7 +6,8 @@ members = [ "pokemon-service-tls", "pokemon-service-lambda", "pokemon-service-server-sdk", - "pokemon-service-client" + "pokemon-service-client", + ] [profile.release] diff --git a/examples/pokemon-service/tests/simple.rs b/examples/pokemon-service/tests/simple.rs index 3a055da587d..dc9f88d0b53 100644 --- a/examples/pokemon-service/tests/simple.rs +++ b/examples/pokemon-service/tests/simple.rs @@ -19,7 +19,7 @@ async fn simple_integration_test() { let client = common::client(); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(0, service_statistics_out.calls_count.unwrap()); + assert_eq!(0, service_statistics_out.calls_count); let pokemon_species_output = client .get_pokemon_species() @@ -27,10 +27,10 @@ async fn simple_integration_test() { .send() .await .unwrap(); - assert_eq!("pikachu", pokemon_species_output.name().unwrap()); + assert_eq!("pikachu", pokemon_species_output.name()); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(1, service_statistics_out.calls_count.unwrap()); + assert_eq!(1, service_statistics_out.calls_count); let storage_err = client .get_storage() @@ -56,12 +56,12 @@ async fn simple_integration_test() { .await .unwrap(); assert_eq!( - Some(vec![ + vec![ "bulbasaur".to_string(), "charmander".to_string(), "squirtle".to_string(), "pikachu".to_string() - ]), + ], storage_out.collection ); @@ -80,7 +80,7 @@ async fn simple_integration_test() { ); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(2, service_statistics_out.calls_count.unwrap()); + assert_eq!(2, service_statistics_out.calls_count); let hyper_client = hyper::Client::new(); let health_check_url = format!("{}/ping", common::base_url()); diff --git a/examples/python/pokemon-service-test/tests/simple_integration_test.rs b/examples/python/pokemon-service-test/tests/simple_integration_test.rs index 39f979e9a34..0c928fa0d7e 100644 --- a/examples/python/pokemon-service-test/tests/simple_integration_test.rs +++ b/examples/python/pokemon-service-test/tests/simple_integration_test.rs @@ -36,7 +36,7 @@ async fn simple_integration_test_http2() { async fn simple_integration_test_with_client(client: PokemonClient) { let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(0, service_statistics_out.calls_count.unwrap()); + assert_eq!(0, service_statistics_out.calls_count); let pokemon_species_output = client .get_pokemon_species() @@ -44,10 +44,10 @@ async fn simple_integration_test_with_client(client: PokemonClient) { .send() .await .unwrap(); - assert_eq!("pikachu", pokemon_species_output.name().unwrap()); + assert_eq!("pikachu", pokemon_species_output.name()); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(1, service_statistics_out.calls_count.unwrap()); + assert_eq!(1, service_statistics_out.calls_count); let pokemon_species_error = client .get_pokemon_species() @@ -64,7 +64,7 @@ async fn simple_integration_test_with_client(client: PokemonClient) { ); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(2, service_statistics_out.calls_count.unwrap()); + assert_eq!(2, service_statistics_out.calls_count); let _health_check = client.check_health().send().await.unwrap(); } diff --git a/rust-runtime/aws-smithy-types/src/blob.rs b/rust-runtime/aws-smithy-types/src/blob.rs index 5365b91249f..ab7ae30d3c5 100644 --- a/rust-runtime/aws-smithy-types/src/blob.rs +++ b/rust-runtime/aws-smithy-types/src/blob.rs @@ -43,7 +43,7 @@ mod serde_serialize { S: serde::Serializer, { if serializer.is_human_readable() { - serializer.serialize_str(&crate::base64::encode(&self.inner)) + serializer.serialize_str(&base64::encode(&self.inner)) } else { serializer.serialize_bytes(&self.inner) } From 32655552c1c1cb825981a8193331c8a2d73ffc9f Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Thu, 21 Sep 2023 11:54:03 -0700 Subject: [PATCH 129/331] Omit fractional seconds from `http-date` format (#2989) ## Motivation and Context Closes #2831. ## Description Fractional seconds will still be accepted during parsing, but not emitted during serialization. ## Testing ``` ./gradlew codegen-core:check codegen-client:check codegen-server:check codegen-client-test:check codegen-server-test:check ``` ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 6 ++ aws/sdk/aws-models/s3-tests.smithy | 24 +++++++ .../aws-smithy-types/src/date_time/format.rs | 22 ++----- .../aws-smithy-types/src/date_time/mod.rs | 2 +- .../date_time_format_test_suite.json | 62 +++++++++---------- 5 files changed, 66 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 5468952f15c..b08ebefd4e6 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -166,6 +166,12 @@ references = ["smithy-rs#2926", "smithy-rs#2972"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "ysaito1001" +[[smithy-rs]] +message = "Omit fractional seconds from `http-date` format." +references = ["smithy-rs#2831", "aws-sdk-rust#818"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } +author = "rschmitt" + [[smithy-rs]] message = "Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code." references = ["smithy-rs#2985"] diff --git a/aws/sdk/aws-models/s3-tests.smithy b/aws/sdk/aws-models/s3-tests.smithy index 6e934ecfda4..437e37491a7 100644 --- a/aws/sdk/aws-models/s3-tests.smithy +++ b/aws/sdk/aws-models/s3-tests.smithy @@ -235,3 +235,27 @@ apply HeadObject @httpRequestTests([ } } ]) + +apply GetObject @httpRequestTests([ + { + id: "GetObjectIfModifiedSince", + documentation: "https://github.com/awslabs/aws-sdk-rust/issues/818", + + method: "GET", + protocol: "aws.protocols#restXml", + uri: "/object.txt", + headers: { "if-modified-since": "Fri, 16 Jul 2021 16:20:53 GMT" } + params: { + Bucket: "test-bucket", + Key: "object.txt" + IfModifiedSince: 1626452453.123, + }, + vendorParams: { + "endpointParams": { + "builtInParams": { + "AWS::Region": "us-east-1" + } + } + } + } +]) diff --git a/rust-runtime/aws-smithy-types/src/date_time/format.rs b/rust-runtime/aws-smithy-types/src/date_time/format.rs index 7253dec1acf..86ffd42ac71 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/format.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/format.rs @@ -129,7 +129,6 @@ pub(crate) mod epoch_seconds { } pub(crate) mod http_date { - use super::remove_trailing_zeros; use crate::date_time::format::{ DateTimeFormatError, DateTimeFormatErrorKind, DateTimeParseError, DateTimeParseErrorKind, NANOS_PER_SECOND, @@ -141,18 +140,15 @@ pub(crate) mod http_date { // This code is taken from https://github.com/pyfisch/httpdate and modified under an // Apache 2.0 License. Modifications: // - Removed use of unsafe - // - Add serialization and deserialization of subsecond nanos + // - Add deserialization of subsecond nanos // - /// Format a `DateTime` in the HTTP date format (imf-fixdate) with added support for subsecond precision + /// Format a `DateTime` in the HTTP date format (imf-fixdate) /// /// Example: "Mon, 16 Dec 2019 23:48:18 GMT" /// /// Some notes: /// - HTTP date does not support years before `0001`—this will cause a panic. - /// - If you _don't_ want subsecond precision (e.g. if you want strict adherence to the spec), - /// you need to zero-out the date-time before formatting - /// - If subsecond nanos are 0, no fractional seconds are added - /// - If subsecond nanos are nonzero, 3 digits of fractional seconds are added + /// - Subsecond nanos are not emitted pub(crate) fn format(date_time: &DateTime) -> Result { fn out_of_range(cause: E) -> DateTimeFormatError { DateTimeFormatErrorKind::OutOfRange( @@ -242,16 +238,6 @@ pub(crate) mod http_date { push_digit(&mut out, second / 10); push_digit(&mut out, second % 10); - // If non-zero nanos, push a 3-digit fractional second - let millis = structured.millisecond(); - if millis != 0 { - out.push('.'); - push_digit(&mut out, (millis / 100 % 10) as u8); - push_digit(&mut out, (millis / 10 % 10) as u8); - push_digit(&mut out, (millis % 10) as u8); - remove_trailing_zeros(&mut out); - } - out.push_str(" GMT"); Ok(out) } @@ -707,7 +693,7 @@ mod tests { http_date::format(&DateTime::from_secs(-62_135_596_800)).unwrap() ); assert_eq!( - "Fri, 31 Dec 9999 23:59:59.999 GMT", + "Fri, 31 Dec 9999 23:59:59 GMT", http_date::format(&DateTime::from_secs_and_nanos(253402300799, 999_999_999)).unwrap() ); diff --git a/rust-runtime/aws-smithy-types/src/date_time/mod.rs b/rust-runtime/aws-smithy-types/src/date_time/mod.rs index b5e740cf5b2..c412be065e6 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/mod.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/mod.rs @@ -396,7 +396,7 @@ mod test { ); assert_eq!( date_time.fmt(Format::HttpDate).unwrap(), - "Mon, 16 Dec 2019 23:48:18.52 GMT" + "Mon, 16 Dec 2019 23:48:18 GMT" ); } diff --git a/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json b/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json index a79e23e4aab..fea94cb6378 100644 --- a/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json +++ b/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json @@ -1123,7 +1123,7 @@ "canonical_seconds": "-62133482201", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Thu, 25 Jan 0001 11:23:19.123 GMT" + "smithy_format_value": "Thu, 25 Jan 0001 11:23:19 GMT" }, { "iso8601": "0001-02-01T12:24:12Z", @@ -1179,28 +1179,28 @@ "canonical_seconds": "-62114444917", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Sun, 02 Sep 0001 19:31:23.001 GMT" + "smithy_format_value": "Sun, 02 Sep 0001 19:31:23 GMT" }, { "iso8601": "0001-10-03T20:32:16.01Z", "canonical_seconds": "-62111762864", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Wed, 03 Oct 0001 20:32:16.01 GMT" + "smithy_format_value": "Wed, 03 Oct 0001 20:32:16 GMT" }, { "iso8601": "0001-11-04T21:33:09.1Z", "canonical_seconds": "-62108994411", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Sun, 04 Nov 0001 21:33:09.1 GMT" + "smithy_format_value": "Sun, 04 Nov 0001 21:33:09 GMT" }, { "iso8601": "0001-12-05T22:34:02.123456789Z", "canonical_seconds": "-62106312358", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Wed, 05 Dec 0001 22:34:02.123 GMT" + "smithy_format_value": "Wed, 05 Dec 0001 22:34:02 GMT" }, { "iso8601": "0100-01-06T23:35:55Z", @@ -1256,28 +1256,28 @@ "canonical_seconds": "-58992081474", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Fri, 13 Aug 0100 06:42:06.001 GMT" + "smithy_format_value": "Fri, 13 Aug 0100 06:42:06 GMT" }, { "iso8601": "0100-09-14T07:43:59.01Z", "canonical_seconds": "-58989312961", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Tue, 14 Sep 0100 07:43:59.01 GMT" + "smithy_format_value": "Tue, 14 Sep 0100 07:43:59 GMT" }, { "iso8601": "0100-10-15T08:44:52.1Z", "canonical_seconds": "-58986630908", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Fri, 15 Oct 0100 08:44:52.1 GMT" + "smithy_format_value": "Fri, 15 Oct 0100 08:44:52 GMT" }, { "iso8601": "0100-11-16T09:45:45.123456789Z", "canonical_seconds": "-58983862455", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Tue, 16 Nov 0100 09:45:45.123 GMT" + "smithy_format_value": "Tue, 16 Nov 0100 09:45:45 GMT" }, { "iso8601": "0100-12-17T10:46:38Z", @@ -1291,7 +1291,7 @@ "canonical_seconds": "-12175833601", "canonical_nanos": 999000000, "error": false, - "smithy_format_value": "Wed, 29 Feb 1584 23:59:59.999 GMT" + "smithy_format_value": "Wed, 29 Feb 1584 23:59:59 GMT" }, { "iso8601": "1969-01-18T11:47:31.000000001Z", @@ -1340,28 +1340,28 @@ "canonical_seconds": "-13845971", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Thu, 24 Jul 1969 17:53:49.001 GMT" + "smithy_format_value": "Thu, 24 Jul 1969 17:53:49 GMT" }, { "iso8601": "1969-08-25T18:54:42.01Z", "canonical_seconds": "-11077518", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Mon, 25 Aug 1969 18:54:42.01 GMT" + "smithy_format_value": "Mon, 25 Aug 1969 18:54:42 GMT" }, { "iso8601": "1969-09-26T19:55:35.1Z", "canonical_seconds": "-8309065", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Fri, 26 Sep 1969 19:55:35.1 GMT" + "smithy_format_value": "Fri, 26 Sep 1969 19:55:35 GMT" }, { "iso8601": "1969-10-27T20:56:28.123456789Z", "canonical_seconds": "-5627012", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Mon, 27 Oct 1969 20:56:28.123 GMT" + "smithy_format_value": "Mon, 27 Oct 1969 20:56:28 GMT" }, { "iso8601": "1969-11-28T21:57:21Z", @@ -1417,28 +1417,28 @@ "canonical_seconds": "13406672", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Fri, 05 Jun 1970 04:04:32.001 GMT" + "smithy_format_value": "Fri, 05 Jun 1970 04:04:32 GMT" }, { "iso8601": "1970-07-05T05:05:25.01Z", "canonical_seconds": "16002325", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Sun, 05 Jul 1970 05:05:25.01 GMT" + "smithy_format_value": "Sun, 05 Jul 1970 05:05:25 GMT" }, { "iso8601": "1970-08-06T06:06:18.1Z", "canonical_seconds": "18770778", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Thu, 06 Aug 1970 06:06:18.1 GMT" + "smithy_format_value": "Thu, 06 Aug 1970 06:06:18 GMT" }, { "iso8601": "1970-09-08T07:07:11.123456789Z", "canonical_seconds": "21625631", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Tue, 08 Sep 1970 07:07:11.123 GMT" + "smithy_format_value": "Tue, 08 Sep 1970 07:07:11 GMT" }, { "iso8601": "1970-10-08T08:08:04Z", @@ -1466,7 +1466,7 @@ "canonical_seconds": "1078099199", "canonical_nanos": 999000000, "error": false, - "smithy_format_value": "Sun, 29 Feb 2004 23:59:59.999 GMT" + "smithy_format_value": "Sun, 29 Feb 2004 23:59:59 GMT" }, { "iso8601": "2037-01-11T11:11:43.0000001Z", @@ -1501,28 +1501,28 @@ "canonical_seconds": "2126013315", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Fri, 15 May 2037 15:15:15.001 GMT" + "smithy_format_value": "Fri, 15 May 2037 15:15:15 GMT" }, { "iso8601": "2037-06-17T16:16:08.01Z", "canonical_seconds": "2128868168", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Wed, 17 Jun 2037 16:16:08.01 GMT" + "smithy_format_value": "Wed, 17 Jun 2037 16:16:08 GMT" }, { "iso8601": "2037-07-17T17:17:01.1Z", "canonical_seconds": "2131463821", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Fri, 17 Jul 2037 17:17:01.1 GMT" + "smithy_format_value": "Fri, 17 Jul 2037 17:17:01 GMT" }, { "iso8601": "2037-08-18T18:18:54.123456789Z", "canonical_seconds": "2134232334", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Tue, 18 Aug 2037 18:18:54.123 GMT" + "smithy_format_value": "Tue, 18 Aug 2037 18:18:54 GMT" }, { "iso8601": "2037-09-20T19:19:47Z", @@ -1578,28 +1578,28 @@ "canonical_seconds": "2155948018", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Tue, 27 Apr 2038 02:26:58.001 GMT" + "smithy_format_value": "Tue, 27 Apr 2038 02:26:58 GMT" }, { "iso8601": "2038-05-27T03:27:51.01Z", "canonical_seconds": "2158543671", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Thu, 27 May 2038 03:27:51.01 GMT" + "smithy_format_value": "Thu, 27 May 2038 03:27:51 GMT" }, { "iso8601": "2038-06-29T04:28:44.1Z", "canonical_seconds": "2161398524", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Tue, 29 Jun 2038 04:28:44.1 GMT" + "smithy_format_value": "Tue, 29 Jun 2038 04:28:44 GMT" }, { "iso8601": "2038-07-29T05:29:37.123456789Z", "canonical_seconds": "2163994177", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Thu, 29 Jul 2038 05:29:37.123 GMT" + "smithy_format_value": "Thu, 29 Jul 2038 05:29:37 GMT" }, { "iso8601": "2038-08-30T06:30:30Z", @@ -1655,28 +1655,28 @@ "canonical_seconds": "253376343461", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Sat, 06 Mar 9999 13:37:41.001 GMT" + "smithy_format_value": "Sat, 06 Mar 9999 13:37:41 GMT" }, { "iso8601": "9999-04-09T14:38:34.01Z", "canonical_seconds": "253379284714", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Fri, 09 Apr 9999 14:38:34.01 GMT" + "smithy_format_value": "Fri, 09 Apr 9999 14:38:34 GMT" }, { "iso8601": "9999-05-08T15:39:27.1Z", "canonical_seconds": "253381793967", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Sat, 08 May 9999 15:39:27.1 GMT" + "smithy_format_value": "Sat, 08 May 9999 15:39:27 GMT" }, { "iso8601": "9999-06-11T16:40:20.123456789Z", "canonical_seconds": "253384735220", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Fri, 11 Jun 9999 16:40:20.123 GMT" + "smithy_format_value": "Fri, 11 Jun 9999 16:40:20 GMT" }, { "iso8601": "9999-07-10T17:41:13Z", From e9aa14e129a851a70982f189b111dab48d1620b0 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 25 Sep 2023 11:15:04 -0400 Subject: [PATCH 130/331] Generate better docs when fields are required (#2996) ## Motivation and Context With required builders, builders return errors in more cases now. This clearly indicates which fields that the service considers required. ## Description Add more docs for required status. Screenshot 2023-09-22 at 3 38 42 PM Screenshot 2023-09-22 at 3 39 01 PM ## Testing ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 +++++++- .../generators/client/FluentClientGenerator.kt | 2 +- .../core/smithy/generators/BuilderGenerator.kt | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b08ebefd4e6..afb23e80293 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -14,7 +14,7 @@ [[smithy-rs]] message = "It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method." references = ["smithy-rs#2909"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" [[aws-sdk-rust]] @@ -177,3 +177,9 @@ message = "Source defaults from the default trait instead of implicitly based on references = ["smithy-rs#2985"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "rcoh" + +[[smithy-rs]] +message = "Produce better docs when items are marked @required" +references = ["smithy-rs#2996"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index b2927dca8e5..cd50393a92e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -528,7 +528,7 @@ private fun generateOperationShapeDocs( else -> "(undocumented)" } - "[`$builderInputDoc`]($builderInputLink) / [`$builderSetterDoc`]($builderSetterLink): $docs" + "[`$builderInputDoc`]($builderInputLink) / [`$builderSetterDoc`]($builderSetterLink):
required: **${memberShape.isRequired}**
$docs
" } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index 26a607f497f..80b9329d636 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -186,6 +186,14 @@ class BuilderGenerator( false -> implBlockWriter.format(outputSymbol) } implBlockWriter.docs("Consumes the builder and constructs a #D.", outputSymbol) + val trulyRequiredMembers = members.filter { trulyRequired(it) } + if (trulyRequiredMembers.isNotEmpty()) { + implBlockWriter.docs("This method will fail if any of the following fields are not set:") + trulyRequiredMembers.forEach { + val memberName = symbolProvider.toMemberName(it) + implBlockWriter.docs("- [`$memberName`](#T::$memberName)", symbolProvider.symbolForBuilder(shape)) + } + } implBlockWriter.rustBlockTemplate("pub fn build(self) -> $returnType", *preludeScope) { conditionalBlockTemplate("#{Ok}(", ")", conditional = fallibleBuilder, *preludeScope) { // If a wrapper is specified, use the `::new` associated function to construct the wrapper @@ -216,6 +224,9 @@ class BuilderGenerator( val input = coreType.asArgument("input") writer.documentShape(member, model) + if (member.isRequired) { + writer.docs("This field is required.") + } writer.deprecatedShape(member) writer.rustBlock("pub fn $memberName(mut self, ${input.argument}) -> Self") { rustTemplate("self.$memberName = #{Some}(${input.value});", *preludeScope) @@ -369,6 +380,10 @@ class BuilderGenerator( } } + private fun trulyRequired(member: MemberShape) = symbolProvider.toSymbol(member).let { + !it.isOptional() && !it.canUseDefault() + } + /** * The core builder of the inner type. If the structure requires a fallible builder, this may use `?` to return * errors. From 2b757b24f9e13280822901042bf404740e92ab8d Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 25 Sep 2023 13:47:02 -0400 Subject: [PATCH 131/331] Update models (#2999) ## Motivation and Context For #2998, I want a clean codegen diff if possible, so splitting out the models update ahead of time. ## Testing ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/aws-models/config.json | 699 +- aws/sdk/aws-models/dynamodb.json | 852 +- aws/sdk/aws-models/ec2.json | 4839 +++- aws/sdk/aws-models/ecs.json | 1178 +- aws/sdk/aws-models/iam.json | 2292 +- aws/sdk/aws-models/kms.json | 1321 +- aws/sdk/aws-models/lambda.json | 393 +- aws/sdk/aws-models/polly.json | 471 +- aws/sdk/aws-models/qldb-session.json | 352 +- aws/sdk/aws-models/route53.json | 1466 +- aws/sdk/aws-models/s3.json | 19453 ++++++----------- aws/sdk/aws-models/s3control.json | 3980 ++-- aws/sdk/aws-models/sso.json | 369 +- aws/sdk/aws-models/sts.json | 816 +- aws/sdk/aws-models/timestream-query.json | 767 +- aws/sdk/aws-models/timestream-write.json | 365 +- aws/sdk/aws-models/transcribe-streaming.json | 426 +- 17 files changed, 21338 insertions(+), 18701 deletions(-) diff --git a/aws/sdk/aws-models/config.json b/aws/sdk/aws-models/config.json index f96f7b6f754..d98e34a8d6b 100644 --- a/aws/sdk/aws-models/config.json +++ b/aws/sdk/aws-models/config.json @@ -13333,6 +13333,342 @@ "traits": { "smithy.api#enumValue": "AWS::SageMaker::Image" } + }, + "ECSTaskSet": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ECS::TaskSet" + } + }, + "CassandraKeyspace": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Cassandra::Keyspace" + } + }, + "SignerSigningProfile": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Signer::SigningProfile" + } + }, + "AmplifyApp": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Amplify::App" + } + }, + "AppMeshVirtualNode": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualNode" + } + }, + "AppMeshVirtualService": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualService" + } + }, + "AppRunnerVpcConnector": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppRunner::VpcConnector" + } + }, + "AppStreamApplication": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppStream::Application" + } + }, + "CodeArtifactRepository": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CodeArtifact::Repository" + } + }, + "EC2PrefixList": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::PrefixList" + } + }, + "EC2SpotFleet": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::SpotFleet" + } + }, + "EvidentlyProject": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Evidently::Project" + } + }, + "ForecastDataset": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Forecast::Dataset" + } + }, + "IAMSAMLProvider": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IAM::SAMLProvider" + } + }, + "IAMServerCertificate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IAM::ServerCertificate" + } + }, + "PinpointCampaign": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::Campaign" + } + }, + "PinpointInAppTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::InAppTemplate" + } + }, + "SageMakerDomain": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::SageMaker::Domain" + } + }, + "TransferAgreement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Agreement" + } + }, + "TransferConnector": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Connector" + } + }, + "KinesisFirehoseDeliveryStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::KinesisFirehose::DeliveryStream" + } + }, + "AmplifyBranch": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Amplify::Branch" + } + }, + "AppIntegrationsEventIntegration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppIntegrations::EventIntegration" + } + }, + "AppMeshRoute": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::Route" + } + }, + "AthenaPreparedStatement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Athena::PreparedStatement" + } + }, + "EC2IPAMScope": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::IPAMScope" + } + }, + "EvidentlyLaunch": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Evidently::Launch" + } + }, + "ForecastDatasetGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Forecast::DatasetGroup" + } + }, + "GreengrassV2ComponentVersion": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::GreengrassV2::ComponentVersion" + } + }, + "GroundStationMissionProfile": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::GroundStation::MissionProfile" + } + }, + "MediaConnectFlowEntitlement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowEntitlement" + } + }, + "MediaConnectFlowVpcInterface": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowVpcInterface" + } + }, + "MediaTailorPlaybackConfiguration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaTailor::PlaybackConfiguration" + } + }, + "MSKConfiguration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MSK::Configuration" + } + }, + "PersonalizeDataset": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Dataset" + } + }, + "PersonalizeSchema": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Schema" + } + }, + "PersonalizeSolution": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Solution" + } + }, + "PinpointEmailTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EmailTemplate" + } + }, + "PinpointEventStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EventStream" + } + }, + "ResilienceHubApp": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ResilienceHub::App" + } + }, + "ACMPCACertificateAuthority": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ACMPCA::CertificateAuthority" + } + }, + "AppConfigHostedConfigurationVersion": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppConfig::HostedConfigurationVersion" + } + }, + "AppMeshVirtualGateway": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualGateway" + } + }, + "AppMeshVirtualRouter": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualRouter" + } + }, + "AppRunnerService": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppRunner::Service" + } + }, + "CustomerProfilesObjectType": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CustomerProfiles::ObjectType" + } + }, + "DMSEndpoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::DMS::Endpoint" + } + }, + "EC2CapacityReservation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::CapacityReservation" + } + }, + "EC2ClientVpnEndpoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::ClientVpnEndpoint" + } + }, + "KendraIndex": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Kendra::Index" + } + }, + "KinesisVideoStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::KinesisVideo::Stream" + } + }, + "LogsDestination": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Logs::Destination" + } + }, + "PinpointEmailChannel": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EmailChannel" + } + }, + "S3AccessPoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::S3::AccessPoint" + } + }, + "NetworkManagerCustomerGatewayAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::NetworkManager::CustomerGatewayAssociation" + } + }, + "NetworkManagerLinkAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::NetworkManager::LinkAssociation" + } } } }, @@ -14127,6 +14463,7 @@ "arnNamespace": "config", "cloudFormationName": "Config", "cloudTrailEventSource": "configservice.amazonaws.com", + "docId": "config-2014-11-12", "endpointPrefix": "config" }, "aws.auth#sigv4": { @@ -14198,52 +14535,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -14251,13 +14592,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -14267,92 +14617,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -14361,155 +14702,115 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://config.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://config-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://config.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://config-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://config.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://config.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://config.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://config.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/aws-models/dynamodb.json b/aws/sdk/aws-models/dynamodb.json index 7c5a2d76787..c4e51dc02fb 100644 --- a/aws/sdk/aws-models/dynamodb.json +++ b/aws/sdk/aws-models/dynamodb.json @@ -790,7 +790,7 @@ "Responses": { "target": "com.amazonaws.dynamodb#PartiQLBatchResponse", "traits": { - "smithy.api#documentation": "

The response to each PartiQL statement in the batch.

" + "smithy.api#documentation": "

The response to each PartiQL statement in the batch. The values of the list are \n ordered according to the ordering of the request statements.

" } }, "ConsumedCapacity": { @@ -833,7 +833,67 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The BatchGetItem operation returns the attributes of one or more items\n from one or more tables. You identify requested items by primary key.

\n

A single operation can retrieve up to 16 MB of data, which can contain as many as 100\n items. BatchGetItem returns a partial result if the response size limit is\n exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is requested,\n or an internal processing failure occurs. If a partial result is returned, the operation returns a value for\n UnprocessedKeys. You can use this value to retry the operation starting\n with the next item to get.

\n \n

If you request more than 100 items, BatchGetItem returns a\n ValidationException with the message \"Too many items requested for\n the BatchGetItem call.\"

\n
\n

For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\n size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\n an appropriate UnprocessedKeys value so you can get the next page of\n results. If desired, your application can include its own logic to assemble the pages of\n results into one dataset.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchGetItem returns a\n ProvisionedThroughputExceededException. If at least\n one of the items is successfully processed, then\n BatchGetItem completes successfully, while returning the keys of the\n unread items in UnprocessedKeys.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

By default, BatchGetItem performs eventually consistent reads on every\n table in the request. If you want strongly consistent reads instead, you can set\n ConsistentRead to true for any or all tables.

\n

In order to minimize response latency, BatchGetItem may retrieve items in\n parallel.

\n

When designing your application, keep in mind that DynamoDB does not return items in\n any particular order. To help parse the response by item, include the primary key values\n for the items in your request in the ProjectionExpression parameter.

\n

If a requested item does not exist, it is not returned in the result. Requests for\n nonexistent items consume the minimum read capacity units according to the type of read.\n For more information, see Working with Tables in the Amazon DynamoDB Developer\n Guide.

" + "smithy.api#documentation": "

The BatchGetItem operation returns the attributes of one or more items\n from one or more tables. You identify requested items by primary key.

\n

A single operation can retrieve up to 16 MB of data, which can contain as many as 100\n items. BatchGetItem returns a partial result if the response size limit is\n exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is requested,\n or an internal processing failure occurs. If a partial result is returned, the operation returns a value for\n UnprocessedKeys. You can use this value to retry the operation starting\n with the next item to get.

\n \n

If you request more than 100 items, BatchGetItem returns a\n ValidationException with the message \"Too many items requested for\n the BatchGetItem call.\"

\n
\n

For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\n size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\n an appropriate UnprocessedKeys value so you can get the next page of\n results. If desired, your application can include its own logic to assemble the pages of\n results into one dataset.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchGetItem returns a\n ProvisionedThroughputExceededException. If at least\n one of the items is successfully processed, then\n BatchGetItem completes successfully, while returning the keys of the\n unread items in UnprocessedKeys.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

By default, BatchGetItem performs eventually consistent reads on every\n table in the request. If you want strongly consistent reads instead, you can set\n ConsistentRead to true for any or all tables.

\n

In order to minimize response latency, BatchGetItem may retrieve items in\n parallel.

\n

When designing your application, keep in mind that DynamoDB does not return items in\n any particular order. To help parse the response by item, include the primary key values\n for the items in your request in the ProjectionExpression parameter.

\n

If a requested item does not exist, it is not returned in the result. Requests for\n nonexistent items consume the minimum read capacity units according to the type of read.\n For more information, see Working with Tables in the Amazon DynamoDB Developer\n Guide.

", + "smithy.api#examples": [ + { + "title": "To retrieve multiple items from a table", + "documentation": "This example reads multiple items from the Music table using a batch of three GetItem requests. Only the AlbumTitle attribute is returned.", + "input": { + "RequestItems": { + "Music": { + "Keys": [ + { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Call Me Today" + } + }, + { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + }, + { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Scared of My Shadow" + } + } + ], + "ProjectionExpression": "AlbumTitle" + } + } + }, + "output": { + "Responses": { + "Music": [ + { + "AlbumTitle": { + "S": "Somewhat Famous" + } + }, + { + "AlbumTitle": { + "S": "Blue Sky Blues" + } + }, + { + "AlbumTitle": { + "S": "Louder Than Ever" + } + } + ] + } + } + } + ] } }, "com.amazonaws.dynamodb#BatchGetItemInput": { @@ -920,6 +980,12 @@ "traits": { "smithy.api#documentation": "

The error message associated with the PartiQL batch response.

" } + }, + "Item": { + "target": "com.amazonaws.dynamodb#AttributeMap", + "traits": { + "smithy.api#documentation": "

The item which caused the condition check to fail. This will be set if ReturnValuesOnConditionCheckFailure is specified as ALL_OLD.

" + } } }, "traits": { @@ -1018,6 +1084,12 @@ "traits": { "smithy.api#documentation": "

The read consistency of the PartiQL batch request.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PartiQL batch request\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -1082,7 +1154,65 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The BatchWriteItem operation puts or deletes multiple items in one or\n more tables. A single call to BatchWriteItem can transmit up to 16MB of\n data over the network, consisting of up to 25 item put or delete operations. While\n individual items can be up to 400 KB once stored, it's important to note that an item's\n representation might be greater than 400KB while being sent in DynamoDB's JSON format\n for the API call. For more details on this distinction, see Naming Rules and Data Types.

\n \n

\n BatchWriteItem cannot update items. If you perform a BatchWriteItem\n operation on an existing item, that item's values will be overwritten by the\n operation and it will appear like it was updated. To update items, we recommend you\n use the UpdateItem action.

\n
\n

The individual PutItem and DeleteItem operations specified\n in BatchWriteItem are atomic; however BatchWriteItem as a\n whole is not. If any requested operations fail because the table's provisioned\n throughput is exceeded or an internal processing failure occurs, the failed operations\n are returned in the UnprocessedItems response parameter. You can\n investigate and optionally resend the requests. Typically, you would call\n BatchWriteItem in a loop. Each iteration would check for unprocessed\n items and submit a new BatchWriteItem request with those unprocessed items\n until all items have been processed.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchWriteItem returns a\n ProvisionedThroughputExceededException.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

With BatchWriteItem, you can efficiently write or delete large amounts of\n data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\n order to improve performance with these large-scale operations,\n BatchWriteItem does not behave in the same way as individual\n PutItem and DeleteItem calls would. For example, you\n cannot specify conditions on individual put and delete requests, and\n BatchWriteItem does not return deleted items in the response.

\n

If you use a programming language that supports concurrency, you can use threads to\n write items in parallel. Your application must include the necessary logic to manage the\n threads. With languages that don't support threading, you must update or delete the\n specified items one at a time. In both situations, BatchWriteItem performs\n the specified put and delete operations in parallel, giving you the power of the thread\n pool approach without having to introduce complexity into your application.

\n

Parallel processing reduces latency, but each specified put and delete request\n consumes the same number of write capacity units whether it is processed in parallel or\n not. Delete operations on nonexistent items consume one write capacity unit.

\n

If one or more of the following is true, DynamoDB rejects the entire batch write\n operation:

\n
    \n
  • \n

    One or more tables specified in the BatchWriteItem request does\n not exist.

    \n
  • \n
  • \n

    Primary key attributes specified on an item in the request do not match those\n in the corresponding table's primary key schema.

    \n
  • \n
  • \n

    You try to perform multiple operations on the same item in the same\n BatchWriteItem request. For example, you cannot put and delete\n the same item in the same BatchWriteItem request.

    \n
  • \n
  • \n

    Your request contains at least two items with identical hash and range keys\n (which essentially is two put operations).

    \n
  • \n
  • \n

    There are more than 25 requests in the batch.

    \n
  • \n
  • \n

    Any individual item in a batch exceeds 400 KB.

    \n
  • \n
  • \n

    The total request size exceeds 16 MB.

    \n
  • \n
" + "smithy.api#documentation": "

The BatchWriteItem operation puts or deletes multiple items in one or\n more tables. A single call to BatchWriteItem can transmit up to 16MB of\n data over the network, consisting of up to 25 item put or delete operations. While\n individual items can be up to 400 KB once stored, it's important to note that an item's\n representation might be greater than 400KB while being sent in DynamoDB's JSON format\n for the API call. For more details on this distinction, see Naming Rules and Data Types.

\n \n

\n BatchWriteItem cannot update items. If you perform a BatchWriteItem\n operation on an existing item, that item's values will be overwritten by the\n operation and it will appear like it was updated. To update items, we recommend you\n use the UpdateItem action.

\n
\n

The individual PutItem and DeleteItem operations specified\n in BatchWriteItem are atomic; however BatchWriteItem as a\n whole is not. If any requested operations fail because the table's provisioned\n throughput is exceeded or an internal processing failure occurs, the failed operations\n are returned in the UnprocessedItems response parameter. You can\n investigate and optionally resend the requests. Typically, you would call\n BatchWriteItem in a loop. Each iteration would check for unprocessed\n items and submit a new BatchWriteItem request with those unprocessed items\n until all items have been processed.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchWriteItem returns a\n ProvisionedThroughputExceededException.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

With BatchWriteItem, you can efficiently write or delete large amounts of\n data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\n order to improve performance with these large-scale operations,\n BatchWriteItem does not behave in the same way as individual\n PutItem and DeleteItem calls would. For example, you\n cannot specify conditions on individual put and delete requests, and\n BatchWriteItem does not return deleted items in the response.

\n

If you use a programming language that supports concurrency, you can use threads to\n write items in parallel. Your application must include the necessary logic to manage the\n threads. With languages that don't support threading, you must update or delete the\n specified items one at a time. In both situations, BatchWriteItem performs\n the specified put and delete operations in parallel, giving you the power of the thread\n pool approach without having to introduce complexity into your application.

\n

Parallel processing reduces latency, but each specified put and delete request\n consumes the same number of write capacity units whether it is processed in parallel or\n not. Delete operations on nonexistent items consume one write capacity unit.

\n

If one or more of the following is true, DynamoDB rejects the entire batch write\n operation:

\n
    \n
  • \n

    One or more tables specified in the BatchWriteItem request does\n not exist.

    \n
  • \n
  • \n

    Primary key attributes specified on an item in the request do not match those\n in the corresponding table's primary key schema.

    \n
  • \n
  • \n

    You try to perform multiple operations on the same item in the same\n BatchWriteItem request. For example, you cannot put and delete\n the same item in the same BatchWriteItem request.

    \n
  • \n
  • \n

    Your request contains at least two items with identical hash and range keys\n (which essentially is two put operations).

    \n
  • \n
  • \n

    There are more than 25 requests in the batch.

    \n
  • \n
  • \n

    Any individual item in a batch exceeds 400 KB.

    \n
  • \n
  • \n

    The total request size exceeds 16 MB.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To add multiple items to a table", + "documentation": "This example adds three new items to the Music table using a batch of three PutItem requests.", + "input": { + "RequestItems": { + "Music": [ + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Somewhat Famous" + }, + "SongTitle": { + "S": "Call Me Today" + }, + "Artist": { + "S": "No One You Know" + } + } + } + }, + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Songs About Life" + }, + "SongTitle": { + "S": "Happy Day" + }, + "Artist": { + "S": "Acme Band" + } + } + } + }, + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Blue Sky Blues" + }, + "SongTitle": { + "S": "Scared of My Shadow" + }, + "Artist": { + "S": "No One You Know" + } + } + } + } + ] + } + }, + "output": {} + } + ] } }, "com.amazonaws.dynamodb#BatchWriteItemInput": { @@ -1465,6 +1595,12 @@ "traits": { "smithy.api#documentation": "

The conditional request failed.

" } + }, + "Item": { + "target": "com.amazonaws.dynamodb#AttributeMap", + "traits": { + "smithy.api#documentation": "

Item which caused the ConditionalCheckFailedException.

" + } } }, "traits": { @@ -2271,7 +2407,30 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Deletes a single item in a table by primary key. You can perform a conditional delete\n operation that deletes the item if it exists, or if it has an expected attribute\n value.

\n

In addition to deleting an item, you can also return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

Unless you specify conditions, the DeleteItem is an idempotent operation;\n running it multiple times on the same item or attribute does not\n result in an error response.

\n

Conditional deletes are useful for deleting items only if specific conditions are met.\n If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\n deleted.

" + "smithy.api#documentation": "

Deletes a single item in a table by primary key. You can perform a conditional delete\n operation that deletes the item if it exists, or if it has an expected attribute\n value.

\n

In addition to deleting an item, you can also return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

Unless you specify conditions, the DeleteItem is an idempotent operation;\n running it multiple times on the same item or attribute does not\n result in an error response.

\n

Conditional deletes are useful for deleting items only if specific conditions are met.\n If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\n deleted.

", + "smithy.api#examples": [ + { + "title": "To delete an item", + "documentation": "This example deletes an item from the Music table.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Scared of My Shadow" + } + } + }, + "output": { + "ConsumedCapacity": { + "CapacityUnits": 1, + "TableName": "Music" + } + } + } + ] } }, "com.amazonaws.dynamodb#DeleteItemInput": { @@ -2335,6 +2494,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a DeleteItem\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -2443,7 +2608,29 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The DeleteTable operation deletes a table and all of its items. After a\n DeleteTable request, the specified table is in the\n DELETING state until DynamoDB completes the deletion. If the table is\n in the ACTIVE state, you can delete it. If a table is in\n CREATING or UPDATING states, then DynamoDB returns a\n ResourceInUseException. If the specified table does not exist, DynamoDB\n returns a ResourceNotFoundException. If table is already in the\n DELETING state, no error is returned.

\n \n

This operation only applies to Version 2019.11.21 (Current) \n of global tables.\n

\n
\n \n

DynamoDB might continue to accept data read and write operations, such as\n GetItem and PutItem, on a table in the\n DELETING state until the table deletion is complete.

\n
\n

When you delete a table, any indexes on that table are also deleted.

\n

If you have DynamoDB Streams enabled on the table, then the corresponding stream on\n that table goes into the DISABLED state, and the stream is automatically\n deleted after 24 hours.

\n

Use the DescribeTable action to check the status of the table.

" + "smithy.api#documentation": "

The DeleteTable operation deletes a table and all of its items. After a\n DeleteTable request, the specified table is in the\n DELETING state until DynamoDB completes the deletion. If the table is\n in the ACTIVE state, you can delete it. If a table is in\n CREATING or UPDATING states, then DynamoDB returns a\n ResourceInUseException. If the specified table does not exist, DynamoDB\n returns a ResourceNotFoundException. If table is already in the\n DELETING state, no error is returned.

\n \n

This operation only applies to Version 2019.11.21 (Current) \n of global tables.\n

\n
\n \n

DynamoDB might continue to accept data read and write operations, such as\n GetItem and PutItem, on a table in the\n DELETING state until the table deletion is complete.

\n
\n

When you delete a table, any indexes on that table are also deleted.

\n

If you have DynamoDB Streams enabled on the table, then the corresponding stream on\n that table goes into the DISABLED state, and the stream is automatically\n deleted after 24 hours.

\n

Use the DescribeTable action to check the status of the table.

", + "smithy.api#examples": [ + { + "title": "To delete a table", + "documentation": "This example deletes the Music table.", + "input": { + "TableName": "Music" + }, + "output": { + "TableDescription": { + "TableStatus": "DELETING", + "TableSizeBytes": 0, + "ItemCount": 0, + "TableName": "Music", + "ProvisionedThroughput": { + "NumberOfDecreasesToday": 1, + "WriteCapacityUnits": 5, + "ReadCapacityUnits": 5 + } + } + } + } + ] } }, "com.amazonaws.dynamodb#DeleteTableInput": { @@ -2684,7 +2871,7 @@ "target": "com.amazonaws.dynamodb#DescribeEndpointsResponse" }, "traits": { - "smithy.api#documentation": "

Returns the regional endpoint information. This action must be included in your VPC \n endpoint policies, or access to the DescribeEndpoints API will be denied. For more information \n on policy permissions, please see Internetwork traffic privacy.

" + "smithy.api#documentation": "

Returns the regional endpoint information. For more information \n on policy permissions, please see Internetwork traffic privacy.

" } }, "com.amazonaws.dynamodb#DescribeEndpointsRequest": { @@ -3005,7 +3192,19 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Returns the current provisioned-capacity quotas for your Amazon Web Services account in\n a Region, both for the Region as a whole and for any one DynamoDB table that you create\n there.

\n

When you establish an Amazon Web Services account, the account has initial quotas on\n the maximum read capacity units and write capacity units that you can provision across\n all of your DynamoDB tables in a given Region. Also, there are per-table\n quotas that apply when you create a table there. For more information, see Service,\n Account, and Table Quotas page in the Amazon DynamoDB\n Developer Guide.

\n

Although you can increase these quotas by filing a case at Amazon Web Services Support Center, obtaining the\n increase is not instantaneous. The DescribeLimits action lets you write\n code to compare the capacity you are currently using to those quotas imposed by your\n account so that you have enough time to apply for an increase before you hit a\n quota.

\n

For example, you could use one of the Amazon Web Services SDKs to do the\n following:

\n
    \n
  1. \n

    Call DescribeLimits for a particular Region to obtain your\n current account quotas on provisioned capacity there.

    \n
  2. \n
  3. \n

    Create a variable to hold the aggregate read capacity units provisioned for\n all your tables in that Region, and one to hold the aggregate write capacity\n units. Zero them both.

    \n
  4. \n
  5. \n

    Call ListTables to obtain a list of all your DynamoDB\n tables.

    \n
  6. \n
  7. \n

    For each table name listed by ListTables, do the\n following:

    \n
      \n
    • \n

      Call DescribeTable with the table name.

      \n
    • \n
    • \n

      Use the data returned by DescribeTable to add the read\n capacity units and write capacity units provisioned for the table itself\n to your variables.

      \n
    • \n
    • \n

      If the table has one or more global secondary indexes (GSIs), loop\n over these GSIs and add their provisioned capacity values to your\n variables as well.

      \n
    • \n
    \n
  8. \n
  9. \n

    Report the account quotas for that Region returned by\n DescribeLimits, along with the total current provisioned\n capacity levels you have calculated.

    \n
  10. \n
\n

This will let you see whether you are getting close to your account-level\n quotas.

\n

The per-table quotas apply only when you are creating a new table. They restrict the\n sum of the provisioned capacity of the new table itself and all its global secondary\n indexes.

\n

For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\n capacity extremely rapidly, but the only quota that applies is that the aggregate\n provisioned capacity over all your tables and GSIs cannot exceed either of the\n per-account quotas.

\n \n

\n DescribeLimits should only be called periodically. You can expect\n throttling errors if you call it more than once in a minute.

\n
\n

The DescribeLimits Request element has no content.

" + "smithy.api#documentation": "

Returns the current provisioned-capacity quotas for your Amazon Web Services account in\n a Region, both for the Region as a whole and for any one DynamoDB table that you create\n there.

\n

When you establish an Amazon Web Services account, the account has initial quotas on\n the maximum read capacity units and write capacity units that you can provision across\n all of your DynamoDB tables in a given Region. Also, there are per-table\n quotas that apply when you create a table there. For more information, see Service,\n Account, and Table Quotas page in the Amazon DynamoDB\n Developer Guide.

\n

Although you can increase these quotas by filing a case at Amazon Web Services Support Center, obtaining the\n increase is not instantaneous. The DescribeLimits action lets you write\n code to compare the capacity you are currently using to those quotas imposed by your\n account so that you have enough time to apply for an increase before you hit a\n quota.

\n

For example, you could use one of the Amazon Web Services SDKs to do the\n following:

\n
    \n
  1. \n

    Call DescribeLimits for a particular Region to obtain your\n current account quotas on provisioned capacity there.

    \n
  2. \n
  3. \n

    Create a variable to hold the aggregate read capacity units provisioned for\n all your tables in that Region, and one to hold the aggregate write capacity\n units. Zero them both.

    \n
  4. \n
  5. \n

    Call ListTables to obtain a list of all your DynamoDB\n tables.

    \n
  6. \n
  7. \n

    For each table name listed by ListTables, do the\n following:

    \n
      \n
    • \n

      Call DescribeTable with the table name.

      \n
    • \n
    • \n

      Use the data returned by DescribeTable to add the read\n capacity units and write capacity units provisioned for the table itself\n to your variables.

      \n
    • \n
    • \n

      If the table has one or more global secondary indexes (GSIs), loop\n over these GSIs and add their provisioned capacity values to your\n variables as well.

      \n
    • \n
    \n
  8. \n
  9. \n

    Report the account quotas for that Region returned by\n DescribeLimits, along with the total current provisioned\n capacity levels you have calculated.

    \n
  10. \n
\n

This will let you see whether you are getting close to your account-level\n quotas.

\n

The per-table quotas apply only when you are creating a new table. They restrict the\n sum of the provisioned capacity of the new table itself and all its global secondary\n indexes.

\n

For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\n capacity extremely rapidly, but the only quota that applies is that the aggregate\n provisioned capacity over all your tables and GSIs cannot exceed either of the\n per-account quotas.

\n \n

\n DescribeLimits should only be called periodically. You can expect\n throttling errors if you call it more than once in a minute.

\n
\n

The DescribeLimits Request element has no content.

", + "smithy.api#examples": [ + { + "title": "To determine capacity limits per table and account, in the current AWS region", + "documentation": "The following example returns the maximum read and write capacity units per table, and for the AWS account, in the current AWS region.", + "output": { + "TableMaxWriteCapacityUnits": 10000, + "TableMaxReadCapacityUnits": 10000, + "AccountMaxReadCapacityUnits": 20000, + "AccountMaxWriteCapacityUnits": 20000 + } + } + ] } }, "com.amazonaws.dynamodb#DescribeLimitsInput": { @@ -3571,52 +3770,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -3624,13 +3827,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -3640,175 +3852,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] }, - { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } - ] - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://dynamodb.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" + "ref": "PartitionResult" }, - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -3817,99 +3937,142 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsDualStack" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://dynamodb.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" + "endpoint": { + "url": "https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "type": "tree", - "rules": [ + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "PartitionResult" }, - "local" + "supportsDualStack" ] } - ], - "endpoint": { - "url": "http://localhost:8000", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "dynamodb", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [], "endpoint": { - "url": "https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "local" + ] + } + ], + "endpoint": { + "url": "http://localhost:8000", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "dynamodb", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -4781,6 +4944,12 @@ "traits": { "smithy.api#documentation": "

The maximum number of items to evaluate (not necessarily the number of matching\n items). If DynamoDB processes the number of items up to the limit while processing the\n results, it stops the operation and returns the matching values up to that point, along\n with a key in LastEvaluatedKey to apply in a subsequent operation so you\n can pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\n DynamoDB reaches this limit, it stops the operation and returns the matching values up\n to the limit, and a key in LastEvaluatedKey to apply in a subsequent\n operation to continue the operation.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for an\n ExecuteStatement operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -5409,7 +5578,37 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The GetItem operation returns a set of attributes for the item with the\n given primary key. If there is no matching item, GetItem does not return\n any data and there will be no Item element in the response.

\n

\n GetItem provides an eventually consistent read by default. If your\n application requires a strongly consistent read, set ConsistentRead to\n true. Although a strongly consistent read might take more time than an\n eventually consistent read, it always returns the last updated value.

" + "smithy.api#documentation": "

The GetItem operation returns a set of attributes for the item with the\n given primary key. If there is no matching item, GetItem does not return\n any data and there will be no Item element in the response.

\n

\n GetItem provides an eventually consistent read by default. If your\n application requires a strongly consistent read, set ConsistentRead to\n true. Although a strongly consistent read might take more time than an\n eventually consistent read, it always returns the last updated value.

", + "smithy.api#examples": [ + { + "title": "To read an item from a table", + "documentation": "This example retrieves an item from the Music table. The table has a partition key and a sort key (Artist and SongTitle), so you must specify both of these attributes.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + } + }, + "output": { + "Item": { + "AlbumTitle": { + "S": "Songs About Life" + }, + "SongTitle": { + "S": "Happy Day" + }, + "Artist": { + "S": "Acme Band" + } + } + } + } + ] } }, "com.amazonaws.dynamodb#GetItemInput": { @@ -7157,6 +7356,20 @@ "required": false }, "smithy.api#documentation": "

Returns an array of table names associated with the current account and endpoint. The\n output from ListTables is paginated, with each page returning a maximum of\n 100 table names.

", + "smithy.api#examples": [ + { + "title": "To list tables", + "documentation": "This example lists all of the tables associated with the current AWS account and endpoint.", + "output": { + "TableNames": [ + "Forum", + "ProductCatalog", + "Reply", + "Thread" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartTableName", "outputToken": "LastEvaluatedTableName", @@ -7477,6 +7690,12 @@ "traits": { "smithy.api#documentation": "

The parameter values.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PartiQL\n ParameterizedStatement operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -7856,7 +8075,34 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Creates a new item, or replaces an old item with a new item. If an item that has the\n same primary key as the new item already exists in the specified table, the new item\n completely replaces the existing item. You can perform a conditional put operation (add\n a new item if one with the specified primary key doesn't exist), or replace an existing\n item if it has certain attribute values. You can return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

When you add an item, the primary key attributes are the only required attributes.\n

\n

Empty String and Binary attribute values are allowed. Attribute values of type String\n and Binary must have a length greater than zero if the attribute is used as a key\n attribute for a table or index. Set type attributes cannot be empty.

\n

Invalid Requests with empty values will be rejected with a\n ValidationException exception.

\n \n

To prevent a new item from replacing an existing item, use a conditional\n expression that contains the attribute_not_exists function with the\n name of the attribute being used as the partition key for the table. Since every\n record must contain that attribute, the attribute_not_exists function\n will only succeed if no matching item exists.

\n
\n

For more information about PutItem, see Working with\n Items in the Amazon DynamoDB Developer Guide.

" + "smithy.api#documentation": "

Creates a new item, or replaces an old item with a new item. If an item that has the\n same primary key as the new item already exists in the specified table, the new item\n completely replaces the existing item. You can perform a conditional put operation (add\n a new item if one with the specified primary key doesn't exist), or replace an existing\n item if it has certain attribute values. You can return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

When you add an item, the primary key attributes are the only required attributes.\n

\n

Empty String and Binary attribute values are allowed. Attribute values of type String\n and Binary must have a length greater than zero if the attribute is used as a key\n attribute for a table or index. Set type attributes cannot be empty.

\n

Invalid Requests with empty values will be rejected with a\n ValidationException exception.

\n \n

To prevent a new item from replacing an existing item, use a conditional\n expression that contains the attribute_not_exists function with the\n name of the attribute being used as the partition key for the table. Since every\n record must contain that attribute, the attribute_not_exists function\n will only succeed if no matching item exists.

\n
\n

For more information about PutItem, see Working with\n Items in the Amazon DynamoDB Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To add an item to a table", + "documentation": "This example adds a new item to the Music table.", + "input": { + "TableName": "Music", + "Item": { + "AlbumTitle": { + "S": "Somewhat Famous" + }, + "SongTitle": { + "S": "Call Me Today" + }, + "Artist": { + "S": "No One You Know" + } + }, + "ReturnConsumedCapacity": "TOTAL" + }, + "output": { + "ConsumedCapacity": { + "CapacityUnits": 1, + "TableName": "Music" + } + } + } + ] } }, "com.amazonaws.dynamodb#PutItemInput": { @@ -7920,6 +8166,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PutItem\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -8008,6 +8260,34 @@ "required": false }, "smithy.api#documentation": "

You must provide the name of the partition key attribute and a single value for that\n attribute. Query returns all items with that partition key value.\n Optionally, you can provide a sort key attribute and use a comparison operator to refine\n the search results.

\n

Use the KeyConditionExpression parameter to provide a specific value for\n the partition key. The Query operation will return all of the items from\n the table or index with that partition key value. You can optionally narrow the scope of\n the Query operation by specifying a sort key value and a comparison\n operator in KeyConditionExpression. To further refine the\n Query results, you can optionally provide a\n FilterExpression. A FilterExpression determines which\n items within the results should be returned to you. All of the other results are\n discarded.

\n

A Query operation always returns a result set. If no matching items are\n found, the result set will be empty. Queries that do not return results consume the\n minimum number of read capacity units for that type of read operation.

\n \n

DynamoDB calculates the number of read capacity units consumed based on item\n size, not on the amount of data that is returned to an application. The number of\n capacity units consumed will be the same whether you request all of the attributes\n (the default behavior) or just some of them (using a projection expression). The\n number will also be the same whether or not you use a FilterExpression.\n

\n
\n

\n Query results are always sorted by the sort key value. If the data type of\n the sort key is Number, the results are returned in numeric order; otherwise, the\n results are returned in order of UTF-8 bytes. By default, the sort order is ascending.\n To reverse the order, set the ScanIndexForward parameter to false.

\n

A single Query operation will read up to the maximum number of items set\n (if using the Limit parameter) or a maximum of 1 MB of data and then apply\n any filtering to the results using FilterExpression. If\n LastEvaluatedKey is present in the response, you will need to paginate\n the result set. For more information, see Paginating\n the Results in the Amazon DynamoDB Developer Guide.

\n

\n FilterExpression is applied after a Query finishes, but before\n the results are returned. A FilterExpression cannot contain partition key\n or sort key attributes. You need to specify those attributes in the\n KeyConditionExpression.

\n \n

A Query operation can return an empty result set and a\n LastEvaluatedKey if all the items read for the page of results are\n filtered out.

\n
\n

You can query a table, a local secondary index, or a global secondary index. For a\n query on a table or on a local secondary index, you can set the\n ConsistentRead parameter to true and obtain a strongly\n consistent result. Global secondary indexes support eventually consistent reads only, so\n do not specify ConsistentRead when querying a global secondary\n index.

", + "smithy.api#examples": [ + { + "title": "To query an item", + "documentation": "This example queries items in the Music table. The table has a partition key and sort key (Artist and SongTitle), but this query only specifies the partition key value. It returns song titles by the artist named \"No One You Know\".", + "input": { + "TableName": "Music", + "ProjectionExpression": "SongTitle", + "KeyConditionExpression": "Artist = :v1", + "ExpressionAttributeValues": { + ":v1": { + "S": "No One You Know" + } + } + }, + "output": { + "Count": 2, + "Items": [ + { + "SongTitle": { + "S": "Call Me Today" + } + } + ], + "ScannedCount": 2, + "ConsumedCapacity": {} + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -9444,7 +9724,50 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total number of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan stops and results are returned to the user as a LastEvaluatedKey\n value to continue the scan in a subsequent operation. The results also include the\n number of items exceeding the limit. A scan can result in no table data meeting the\n filter criteria.

\n

A single Scan operation reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then apply any\n filtering to the results using FilterExpression. If\n LastEvaluatedKey is present in the response, you need to paginate the\n result set. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

\n Scan uses eventually consistent reads when accessing the data in a table;\n therefore, the result set might not include the changes to data in the table immediately\n before the operation began. If you need a consistent copy of the data, as of the time\n that the Scan begins, you can set the ConsistentRead parameter\n to true.

", + "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total size of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan completes and results are returned to the user. The LastEvaluatedKey \n value is also returned and the requestor can use the LastEvaluatedKey to continue \n the scan in a subsequent operation. Each scan response also includes number of items that were \n scanned (ScannedCount) as part of the request. If using a FilterExpression, a scan result \n can result in no items meeting the criteria and the Count will result in zero. If \n you did not use a FilterExpression in the scan request, then Count is \n the same as ScannedCount.

\n \n

\n Count and ScannedCount only return the count of items specific to a \n single scan request and, unless the table is less than 1MB, do not represent the total number \n of items in the table.\n

\n
\n

A single Scan operation first reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then applies any\n filtering to the results if a FilterExpression is provided. If\n LastEvaluatedKey is present in the response, pagination is required to complete the\n full table scan. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

By default, a Scan uses eventually consistent reads when accessing the items in a table. \n Therefore, the results from an eventually consistent Scan may not include the latest item \n changes at the time the scan iterates through each item in the table. If you require a strongly consistent \n read of each item as the scan iterates through the items in the table, you can set the ConsistentRead \n parameter to true. Strong consistency only relates to the consistency of the read at the item level.

\n \n

\n DynamoDB does not provide snapshot isolation for a scan operation when the ConsistentRead \n parameter is set to true. Thus, a DynamoDB scan operation does not guarantee that all reads in a scan \n see a consistent snapshot of the table when the scan operation was requested.\n

\n
", + "smithy.api#examples": [ + { + "title": "To scan a table", + "documentation": "This example scans the entire Music table, and then narrows the results to songs by the artist \"No One You Know\". For each item, only the album title and song title are returned.", + "input": { + "TableName": "Music", + "FilterExpression": "Artist = :a", + "ProjectionExpression": "#ST, #AT", + "ExpressionAttributeNames": { + "#ST": "SongTitle", + "#AT": "AlbumTitle" + }, + "ExpressionAttributeValues": { + ":a": { + "S": "No One You Know" + } + } + }, + "output": { + "Count": 2, + "Items": [ + { + "SongTitle": { + "S": "Call Me Today" + }, + "AlbumTitle": { + "S": "Somewhat Famous" + } + }, + { + "SongTitle": { + "S": "Scared of My Shadow" + }, + "AlbumTitle": { + "S": "Blue Sky Blues" + } + } + ], + "ScannedCount": 3, + "ConsumedCapacity": {} + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -10777,7 +11100,7 @@ "ReturnValuesOnConditionCheckFailure": { "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", "traits": { - "smithy.api#documentation": "

Use ReturnValuesOnConditionCheckFailure to get the item attributes if the\n Update condition fails. For\n ReturnValuesOnConditionCheckFailure, the valid values are: NONE,\n ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW.

" + "smithy.api#documentation": "

Use ReturnValuesOnConditionCheckFailure to get the item attributes if the\n Update condition fails. For\n ReturnValuesOnConditionCheckFailure, the valid values are: NONE and\n ALL_OLD.

" } } }, @@ -11161,7 +11484,54 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Edits an existing item's attributes, or adds a new item to the table if it does not\n already exist. You can put, delete, or add attribute values. You can also perform a\n conditional update on an existing item (insert a new attribute name-value pair if it\n doesn't exist, or replace an existing name-value pair if it has certain expected\n attribute values).

\n

You can also return the item's attribute values in the same UpdateItem\n operation using the ReturnValues parameter.

" + "smithy.api#documentation": "

Edits an existing item's attributes, or adds a new item to the table if it does not\n already exist. You can put, delete, or add attribute values. You can also perform a\n conditional update on an existing item (insert a new attribute name-value pair if it\n doesn't exist, or replace an existing name-value pair if it has certain expected\n attribute values).

\n

You can also return the item's attribute values in the same UpdateItem\n operation using the ReturnValues parameter.

", + "smithy.api#examples": [ + { + "title": "To update an item in a table", + "documentation": "This example updates an item in the Music table. It adds a new attribute (Year) and modifies the AlbumTitle attribute. All of the attributes in the item, as they appear after the update, are returned in the response.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + }, + "UpdateExpression": "SET #Y = :y, #AT = :t", + "ExpressionAttributeNames": { + "#Y": "Year", + "#AT": "AlbumTitle" + }, + "ExpressionAttributeValues": { + ":y": { + "N": "2015" + }, + ":t": { + "S": "Louder Than Ever" + } + }, + "ReturnValues": "ALL_NEW" + }, + "output": { + "Attributes": { + "AlbumTitle": { + "S": "Louder Than Ever" + }, + "Artist": { + "S": "Acme Band" + }, + "Year": { + "N": "2015" + }, + "SongTitle": { + "S": "Happy Day" + } + } + } + } + ] } }, "com.amazonaws.dynamodb#UpdateItemInput": { @@ -11237,6 +11607,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for an UpdateItem operation that failed a\n condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { diff --git a/aws/sdk/aws-models/ec2.json b/aws/sdk/aws-models/ec2.json index 4d35d56d54a..ee7045e56bf 100644 --- a/aws/sdk/aws-models/ec2.json +++ b/aws/sdk/aws-models/ec2.json @@ -1535,7 +1535,20 @@ "target": "com.amazonaws.ec2#AllocateAddressResult" }, "traits": { - "smithy.api#documentation": "

Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate \n it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \n pool and can be allocated to a different Amazon Web Services account.

\n

You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \n from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \n IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses (BYOIP) in the Amazon Elastic Compute Cloud User Guide.

\n

If you release an Elastic IP address, you might be able to recover it. You cannot recover\n an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\n it in this operation.

\n

For more information, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \n to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).

" + "smithy.api#documentation": "

Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate \n it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \n pool and can be allocated to a different Amazon Web Services account.

\n

You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \n from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \n IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses (BYOIP) in the Amazon Elastic Compute Cloud User Guide.

\n

If you release an Elastic IP address, you might be able to recover it. You cannot recover\n an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\n it in this operation.

\n

For more information, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \n to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).

", + "smithy.api#examples": [ + { + "title": "To allocate an Elastic IP address", + "documentation": "This example allocates an Elastic IP address.", + "output": { + "PublicIp": "203.0.113.0", + "AllocationId": "eipalloc-64d5890a", + "PublicIpv4Pool": "amazon", + "NetworkBorderGroup": "us-east-1", + "Domain": "vpc" + } + } + ] } }, "com.amazonaws.ec2#AllocateAddressRequest": { @@ -1726,8 +1739,7 @@ "aws.protocols#ec2QueryName": "Quantity", "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these\n parameters.

", - "smithy.api#required": {}, + "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these parameters. If you are \n allocating the Dedicated Hosts on an Outpost, and you specify AssetIds, \n you can omit this parameter. In this case, Amazon EC2 allocates a Dedicated Host on each \n specified hardware asset. If you specify both AssetIds and \n Quantity, then the value that you specify for \n Quantity must be equal to the number of asset IDs specified.

", "smithy.api#xmlName": "quantity" } }, @@ -1747,7 +1759,7 @@ "OutpostArn": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\n the Dedicated Host.

" + "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\n the Dedicated Host. If you specify OutpostArn, you can \n optionally specify AssetIds.

\n

If you are allocating the Dedicated Host in a Region, omit this parameter.

" } }, "HostMaintenance": { @@ -1755,6 +1767,13 @@ "traits": { "smithy.api#documentation": "

Indicates whether to enable or disable host maintenance for the Dedicated Host. For\n more information, see Host\n maintenance in the Amazon EC2 User Guide.

" } + }, + "AssetIds": { + "target": "com.amazonaws.ec2#AssetIdList", + "traits": { + "smithy.api#documentation": "

The IDs of the Outpost hardware assets on which to allocate the Dedicated Hosts. Targeting \n specific hardware assets on an Outpost can help to minimize latency between your workloads. \n This parameter is supported only if you specify OutpostArn. \n If you are allocating the Dedicated Hosts in a Region, omit this parameter.

\n
    \n
  • \n

    If you specify this parameter, you can omit Quantity. \n In this case, Amazon EC2 allocates a Dedicated Host on each specified hardware \n asset.

    \n
  • \n
  • \n

    If you specify both AssetIds and \n Quantity, then the value for \n Quantity must be equal to the number of asset IDs \n specified.

    \n
  • \n
", + "smithy.api#xmlName": "AssetId" + } } }, "traits": { @@ -1987,7 +2006,7 @@ "min": 1, "max": 30 }, - "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*]+$" + "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*\\-]+$" } }, "com.amazonaws.ec2#AllowedInstanceTypeSet": { @@ -3235,6 +3254,9 @@ { "target": "com.amazonaws.ec2#DisableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccess" + }, { "target": "com.amazonaws.ec2#DisableImageDeprecation" }, @@ -3313,6 +3335,9 @@ { "target": "com.amazonaws.ec2#EnableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccess" + }, { "target": "com.amazonaws.ec2#EnableImageDeprecation" }, @@ -3391,6 +3416,9 @@ { "target": "com.amazonaws.ec2#GetHostReservationPurchasePreview" }, + { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessState" + }, { "target": "com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements" }, @@ -3976,52 +4004,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -4029,13 +4061,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -4045,92 +4086,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -4139,155 +4171,115 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://ec2.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://ec2.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://ec2.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://ec2.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -5660,6 +5652,15 @@ } } }, + "com.amazonaws.ec2#AssetId": { + "type": "string" + }, + "com.amazonaws.ec2#AssetIdList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#AssetId" + } + }, "com.amazonaws.ec2#AssignIpv6Addresses": { "type": "operation", "input": { @@ -5764,7 +5765,19 @@ "target": "com.amazonaws.ec2#AssignPrivateIpAddressesResult" }, "traits": { - "smithy.api#documentation": "

Assigns one or more secondary private IP addresses to the specified network interface.

\n

You can specify one or more specific secondary IP addresses, or you can specify the number \n of secondary IP addresses to be automatically assigned within the subnet's CIDR block range. \n The number of secondary IP addresses that you can assign to an instance varies by instance type.\n For information about instance types, see Instance Types in the Amazon Elastic Compute Cloud User Guide. For more information about \n Elastic IP addresses, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

When you move a secondary private IP address to another network interface, any Elastic IP address \n that is associated with the IP address is also moved.

\n

Remapping an IP address is an asynchronous operation. When you move an IP address from one network\n interface to another, check network/interfaces/macs/mac/local-ipv4s in the instance\n metadata to confirm that the remapping is complete.

\n

You must specify either the IP addresses or the IP address count in the request.

\n

You can optionally use Prefix Delegation on the network interface. You must specify\n either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\n information, see \n Assigning prefixes to Amazon EC2 network interfaces in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Assigns one or more secondary private IP addresses to the specified network interface.

\n

You can specify one or more specific secondary IP addresses, or you can specify the number \n of secondary IP addresses to be automatically assigned within the subnet's CIDR block range. \n The number of secondary IP addresses that you can assign to an instance varies by instance type.\n For information about instance types, see Instance Types in the Amazon Elastic Compute Cloud User Guide. For more information about \n Elastic IP addresses, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

When you move a secondary private IP address to another network interface, any Elastic IP address \n that is associated with the IP address is also moved.

\n

Remapping an IP address is an asynchronous operation. When you move an IP address from one network\n interface to another, check network/interfaces/macs/mac/local-ipv4s in the instance\n metadata to confirm that the remapping is complete.

\n

You must specify either the IP addresses or the IP address count in the request.

\n

You can optionally use Prefix Delegation on the network interface. You must specify\n either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\n information, see \n Assigning prefixes to Amazon EC2 network interfaces in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To assign a specific secondary private IP address to an interface", + "documentation": "This example assigns the specified secondary private IP address to the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + "10.0.0.82" + ] + } + } + ] } }, "com.amazonaws.ec2#AssignPrivateIpAddressesRequest": { @@ -5870,7 +5883,7 @@ "target": "com.amazonaws.ec2#AssignPrivateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Assigns one or more private IPv4 addresses to a private NAT gateway. For more information, see Work with NAT gateways in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Assigns one or more private IPv4 addresses to a private NAT gateway. For more information, see \n Work with NAT gateways in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssignPrivateNatGatewayAddressRequest": { @@ -5880,7 +5893,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -5919,7 +5932,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -5970,7 +5983,20 @@ "target": "com.amazonaws.ec2#AssociateAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates an Elastic IP address, or carrier IP address (for instances that are in\n subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\n Elastic IP address, you must allocate it to your account.

\n

If the Elastic IP address is already\n associated with a different instance, it is disassociated from that instance and associated\n with the specified instance. If you associate an Elastic IP address with an instance that has\n an existing Elastic IP address, the existing address is disassociated from the instance, but\n remains allocated to your account.

\n

[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\n carrier to the instance or network interface.

\n

You cannot associate an Elastic IP address with an interface in a different network border group.

\n \n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2\n doesn't return an error, and you may be charged for each time the Elastic IP address is\n remapped to the same instance. For more information, see the Elastic IP\n Addresses section of Amazon EC2\n Pricing.

\n
" + "smithy.api#documentation": "

Associates an Elastic IP address, or carrier IP address (for instances that are in\n subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\n Elastic IP address, you must allocate it to your account.

\n

If the Elastic IP address is already\n associated with a different instance, it is disassociated from that instance and associated\n with the specified instance. If you associate an Elastic IP address with an instance that has\n an existing Elastic IP address, the existing address is disassociated from the instance, but\n remains allocated to your account.

\n

[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\n carrier to the instance or network interface.

\n

You cannot associate an Elastic IP address with an interface in a different network border group.

\n \n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2\n doesn't return an error, and you may be charged for each time the Elastic IP address is\n remapped to the same instance. For more information, see the Elastic IP\n Addresses section of Amazon EC2\n Pricing.

\n
", + "smithy.api#examples": [ + { + "title": "To associate an Elastic IP address", + "documentation": "This example associates the specified Elastic IP address with the specified instance.", + "input": { + "AllocationId": "eipalloc-64d5890a", + "InstanceId": "i-0b263919b6498b123" + }, + "output": { + "AssociationId": "eipassoc-2bebb745" + } + } + ] } }, "com.amazonaws.ec2#AssociateAddressRequest": { @@ -6135,7 +6161,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.

\n

After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.

\n

For more information, see DHCP options sets\n in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.

\n

After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.

\n

For more information, see DHCP options sets\n in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To associate a DHCP options set with a VPC", + "documentation": "This example associates the specified DHCP options set with the specified VPC.", + "input": { + "DhcpOptionsId": "dopt-d9070ebb", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#AssociateDhcpOptionsRequest": { @@ -6257,7 +6293,30 @@ "target": "com.amazonaws.ec2#AssociateIamInstanceProfileResult" }, "traits": { - "smithy.api#documentation": "

Associates an IAM instance profile with a running or stopped instance. You cannot\n associate more than one IAM instance profile with an instance.

" + "smithy.api#documentation": "

Associates an IAM instance profile with a running or stopped instance. You cannot\n associate more than one IAM instance profile with an instance.

", + "smithy.api#examples": [ + { + "title": "To associate an IAM instance profile with an instance", + "documentation": "This example associates an IAM instance profile named admin-role with the specified instance.", + "input": { + "IamInstanceProfile": { + "Name": "admin-role" + }, + "InstanceId": "i-123456789abcde123" + }, + "output": { + "IamInstanceProfileAssociation": { + "InstanceId": "i-123456789abcde123", + "State": "associating", + "AssociationId": "iip-assoc-0e7736511a163c209", + "IamInstanceProfile": { + "Id": "AIPAJBLK7RKJKWDXVHIEC", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#AssociateIamInstanceProfileRequest": { @@ -6443,7 +6502,7 @@ "target": "com.amazonaws.ec2#AssociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, see Work with NAT gateways in the Amazon Virtual Private Cloud User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, \n see Work with NAT gateways in the Amazon VPC User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssociateNatGatewayAddressRequest": { @@ -6453,7 +6512,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -6493,7 +6552,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -6519,7 +6578,20 @@ "target": "com.amazonaws.ec2#AssociateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To associate a route table with a subnet", + "documentation": "This example associates the specified route table with the specified subnet.", + "input": { + "SubnetId": "subnet-9d4a7b6", + "RouteTableId": "rtb-22574640" + }, + "output": { + "AssociationId": "rtbassoc-781d0d1a" + } + } + ] } }, "com.amazonaws.ec2#AssociateRouteTableRequest": { @@ -6940,7 +7012,7 @@ "target": "com.amazonaws.ec2#AssociateVpcCidrBlockResult" }, "traits": { - "smithy.api#documentation": "

Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\n an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\n you provisioned through bring your own IP addresses (BYOIP). The IPv6 CIDR block size is fixed\n at /56.

\n

You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\n pool, or an Amazon-provided IPv6 CIDR block.

\n

For more information about associating CIDR blocks with your VPC and applicable\n restrictions, see VPC and subnet sizing in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\n an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\n you provisioned through bring your own IP addresses (BYOIP). The IPv6 CIDR block size is fixed\n at /56.

\n

You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\n pool, or an Amazon-provided IPv6 CIDR block.

\n

For more information about associating CIDR blocks with your VPC and applicable\n restrictions, see IP addressing for your VPCs and subnets \n in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssociateVpcCidrBlockRequest": { @@ -7272,7 +7344,7 @@ "target": "com.amazonaws.ec2#AttachClassicLinkVpcResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC's\n\t\t\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\n\t\t\tcan only link an instance that's in the running state. An instance is\n\t\t\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\n\t\t\tyou restart it.

\n

After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.

\n

Linking your instance to a VPC is sometimes referred to as attaching your instance.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC\n\t\t\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\n\t\t\tcan only link an instance that's in the running state. An instance is\n\t\t\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\n\t\t\tyou restart it.

\n

After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.

\n

Linking your instance to a VPC is sometimes referred to as attaching your instance.

" } }, "com.amazonaws.ec2#AttachClassicLinkVpcRequest": { @@ -7292,7 +7364,7 @@ "target": "com.amazonaws.ec2#GroupIdStringList", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of one or more of the VPC's security groups. You cannot specify security groups from a different VPC.

", + "smithy.api#documentation": "

The IDs of the security groups. You cannot specify security groups from a different VPC.

", "smithy.api#required": {}, "smithy.api#xmlName": "SecurityGroupId" } @@ -7302,7 +7374,7 @@ "traits": { "aws.protocols#ec2QueryName": "InstanceId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of an EC2-Classic instance to link to the ClassicLink-enabled VPC.

", + "smithy.api#documentation": "

The ID of the EC2-Classic instance.

", "smithy.api#required": {}, "smithy.api#xmlName": "instanceId" } @@ -7312,7 +7384,7 @@ "traits": { "aws.protocols#ec2QueryName": "VpcId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of a ClassicLink-enabled VPC.

", + "smithy.api#documentation": "

The ID of the ClassicLink-enabled VPC.

", "smithy.api#required": {}, "smithy.api#xmlName": "vpcId" } @@ -7349,7 +7421,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity between the internet and\n\t\t\tthe VPC. For more information about your VPC and internet gateway, see the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity \n\t\t between the internet and the VPC. For more information, see Internet gateways in the \n\t\t Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach an Internet gateway to a VPC", + "documentation": "This example attaches the specified Internet gateway to the specified VPC.", + "input": { + "InternetGatewayId": "igw-c0a643a9", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#AttachInternetGatewayRequest": { @@ -7399,7 +7481,21 @@ "target": "com.amazonaws.ec2#AttachNetworkInterfaceResult" }, "traits": { - "smithy.api#documentation": "

Attaches a network interface to an instance.

" + "smithy.api#documentation": "

Attaches a network interface to an instance.

", + "smithy.api#examples": [ + { + "title": "To attach a network interface to an instance", + "documentation": "This example attaches the specified network interface to the specified instance.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "InstanceId": "i-1234567890abcdef0", + "DeviceIndex": 1 + }, + "output": { + "AttachmentId": "eni-attach-66c4350a" + } + } + ] } }, "com.amazonaws.ec2#AttachNetworkInterfaceRequest": { @@ -7577,7 +7673,25 @@ "target": "com.amazonaws.ec2#VolumeAttachment" }, "traits": { - "smithy.api#documentation": "

Attaches an EBS volume to a running or stopped instance and exposes it to the instance\n with the specified device name.

\n

Encrypted EBS volumes must be attached to instances that support Amazon EBS encryption. For\n more information, see Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

\n

After you attach an EBS volume, you must make it available. For more information, see \n Make an EBS volume available for use.

\n

If a volume has an Amazon Web Services Marketplace product code:

\n
    \n
  • \n

    The volume can be attached only to a stopped instance.

    \n
  • \n
  • \n

    Amazon Web Services Marketplace product codes are copied from the volume to the instance.

    \n
  • \n
  • \n

    You must be subscribed to the product.

    \n
  • \n
  • \n

    The instance type and operating system of the instance must support the product. For\n example, you can't detach a volume from a Windows instance and attach it to a Linux\n instance.

    \n
  • \n
\n

For more information, see Attach an Amazon EBS volume to an instance in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Attaches an EBS volume to a running or stopped instance and exposes it to the instance\n with the specified device name.

\n

Encrypted EBS volumes must be attached to instances that support Amazon EBS encryption. For\n more information, see Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

\n

After you attach an EBS volume, you must make it available. For more information, see \n Make an EBS volume available for use.

\n

If a volume has an Amazon Web Services Marketplace product code:

\n
    \n
  • \n

    The volume can be attached only to a stopped instance.

    \n
  • \n
  • \n

    Amazon Web Services Marketplace product codes are copied from the volume to the instance.

    \n
  • \n
  • \n

    You must be subscribed to the product.

    \n
  • \n
  • \n

    The instance type and operating system of the instance must support the product. For\n example, you can't detach a volume from a Windows instance and attach it to a Linux\n instance.

    \n
  • \n
\n

For more information, see Attach an Amazon EBS volume to an instance in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a volume to an instance", + "documentation": "This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.", + "input": { + "VolumeId": "vol-1234567890abcdef0", + "InstanceId": "i-01474ef662b89480", + "Device": "/dev/sdf" + }, + "output": { + "AttachTime": "2016-08-29T18:52:32.724Z", + "InstanceId": "i-01474ef662b89480", + "VolumeId": "vol-1234567890abcdef0", + "State": "attaching", + "Device": "/dev/sdf" + } + } + ] } }, "com.amazonaws.ec2#AttachVolumeRequest": { @@ -7956,7 +8070,29 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

" + "smithy.api#documentation": "

Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

", + "smithy.api#examples": [ + { + "title": "To add a rule that allows outbound traffic to a specific address range", + "documentation": "This example adds a rule that grants access to the specified address ranges on TCP port 80.", + "input": { + "GroupId": "sg-1a2b3c4d", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "IpRanges": [ + { + "CidrIp": "10.0.0.0/16" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#AuthorizeSecurityGroupEgressRequest": { @@ -8089,7 +8225,30 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Adds the specified inbound (ingress) rules to a security group.

\n

An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR\n address range, or from the instances that are associated with the specified destination security \n groups. When specifying an inbound rule for your security group in a VPC, the\n IpPermissions must include a source for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For TCP and UDP, you must also specify the destination port or port range. \n For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. \n You can use -1 to mean all types or all codes.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

\n

For more information about VPC security group quotas, see Amazon VPC quotas.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Adds the specified inbound (ingress) rules to a security group.

\n

An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR\n address range, or from the instances that are associated with the specified destination security \n groups. When specifying an inbound rule for your security group in a VPC, the\n IpPermissions must include a source for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For TCP and UDP, you must also specify the destination port or port range. \n For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. \n You can use -1 to mean all types or all codes.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

\n

For more information about VPC security group quotas, see Amazon VPC quotas.

", + "smithy.api#examples": [ + { + "title": "To add a rule that allows inbound SSH traffic from an IPv4 address range", + "documentation": "This example enables inbound traffic on TCP port 22 (SSH). The rule includes a description to help you identify it later.", + "input": { + "GroupId": "sg-903004f8", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/24", + "Description": "SSH access from the LA office" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#AuthorizeSecurityGroupIngressRequest": { @@ -8118,7 +8277,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -8130,19 +8289,19 @@ "IpProtocol": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp) or number\n (see Protocol Numbers). To specify icmpv6, use a set of IP permissions.

\n

[VPC only] Use -1 to specify all protocols. If you specify -1 or a \n protocol other than tcp, udp, or icmp, traffic on all ports \n is allowed, regardless of any ports you specify.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" + "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp) or number\n (see Protocol Numbers). To specify icmpv6, use a set of IP permissions.

\n

Use -1 to specify all protocols. If you specify -1 or a \n protocol other than tcp, udp, or icmp, traffic on all ports \n is allowed, regardless of any ports you specify.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, "SourceSecurityGroupName": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. Creates rules that grant full ICMP, UDP, and TCP access. \n To create a rule with a specific IP protocol and port range, use a set of IP permissions instead. For \n EC2-VPC, the source security group must be in the same VPC.

" + "smithy.api#documentation": "

[Default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. Creates rules that grant full ICMP, UDP, and TCP access. \n To create a rule with a specific IP protocol and port range, use a set of IP permissions instead. \n The source security group must be in the same VPC.

" } }, "SourceSecurityGroupOwnerId": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[nondefault VPC] The Amazon Web Services account ID for the source security group, if the source security group is \n in a different account. You can't specify this parameter in combination with the following parameters: \n the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. \n Creates rules that grant full ICMP, UDP, and TCP access. To create a rule with a specific IP protocol \n and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

[Nondefault VPC] The Amazon Web Services account ID for the source security group, if the source security group is \n in a different account. You can't specify this parameter in combination with the following parameters: \n the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. \n Creates rules that grant full ICMP, UDP, and TCP access. To create a rule with a specific IP protocol \n and port range, use a set of IP permissions instead.

" } }, "ToPort": { @@ -8351,6 +8510,9 @@ "smithy.api#documentation": "

Describes Availability Zones, Local Zones, and Wavelength Zones.

" } }, + "com.amazonaws.ec2#AvailabilityZoneId": { + "type": "string" + }, "com.amazonaws.ec2#AvailabilityZoneList": { "type": "list", "member": { @@ -8510,6 +8672,9 @@ "com.amazonaws.ec2#BareMetalFlag": { "type": "boolean" }, + "com.amazonaws.ec2#BaselineBandwidthInGbps": { + "type": "double" + }, "com.amazonaws.ec2#BaselineBandwidthInMbps": { "type": "integer" }, @@ -9622,7 +9787,28 @@ "target": "com.amazonaws.ec2#CancelSpotFleetRequestsResponse" }, "traits": { - "smithy.api#documentation": "

Cancels the specified Spot Fleet requests.

\n

After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.

\n

You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\n choose to terminate the instances, the Spot Fleet request enters the\n cancelled_terminating state. Otherwise, the Spot Fleet request enters\n the cancelled_running state and the instances continue to run until they\n are interrupted or you terminate them manually.

" + "smithy.api#documentation": "

Cancels the specified Spot Fleet requests.

\n

After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.

\n

You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\n choose to terminate the instances, the Spot Fleet request enters the\n cancelled_terminating state. Otherwise, the Spot Fleet request enters\n the cancelled_running state and the instances continue to run until they\n are interrupted or you terminate them manually.

", + "smithy.api#examples": [ + { + "title": "To cancel a Spot fleet request", + "documentation": "This example cancels the specified Spot fleet request and terminates its associated Spot Instances.", + "input": { + "SpotFleetRequestIds": [ + "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + ], + "TerminateInstances": true + }, + "output": { + "SuccessfulFleetRequests": [ + { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "CurrentSpotFleetRequestState": "cancelled_running", + "PreviousSpotFleetRequestState": "active" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CancelSpotFleetRequestsError": { @@ -9832,7 +10018,26 @@ "target": "com.amazonaws.ec2#CancelSpotInstanceRequestsResult" }, "traits": { - "smithy.api#documentation": "

Cancels one or more Spot Instance requests.

\n \n

Canceling a Spot Instance request does not terminate running Spot Instances\n associated with the request.

\n
" + "smithy.api#documentation": "

Cancels one or more Spot Instance requests.

\n \n

Canceling a Spot Instance request does not terminate running Spot Instances\n associated with the request.

\n
", + "smithy.api#examples": [ + { + "title": "To cancel Spot Instance requests", + "documentation": "This example cancels a Spot Instance request.", + "input": { + "SpotInstanceRequestIds": [ + "sir-08b93456" + ] + }, + "output": { + "CancelledSpotInstanceRequests": [ + { + "State": "cancelled", + "SpotInstanceRequestId": "sir-08b93456" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CancelSpotInstanceRequestsRequest": { @@ -10938,7 +11143,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes the ClassicLink DNS support status of a VPC.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes the ClassicLink DNS support status of a VPC.

" } }, "com.amazonaws.ec2#ClassicLinkDnsSupportList": { @@ -10957,7 +11162,7 @@ "target": "com.amazonaws.ec2#GroupIdentifierList", "traits": { "aws.protocols#ec2QueryName": "GroupSet", - "smithy.api#documentation": "

A list of security groups.

", + "smithy.api#documentation": "

The security groups.

", "smithy.api#xmlName": "groupSet" } }, @@ -10987,7 +11192,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes a linked EC2-Classic instance.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes a linked EC2-Classic instance.

" } }, "com.amazonaws.ec2#ClassicLinkInstanceList": { @@ -12267,7 +12472,20 @@ "target": "com.amazonaws.ec2#ConfirmProductInstanceResult" }, "traits": { - "smithy.api#documentation": "

Determines whether a product code is associated with an instance. This action can only\n be used by the owner of the product code. It is useful when a product code owner must\n verify whether another user's instance is eligible for support.

" + "smithy.api#documentation": "

Determines whether a product code is associated with an instance. This action can only\n be used by the owner of the product code. It is useful when a product code owner must\n verify whether another user's instance is eligible for support.

", + "smithy.api#examples": [ + { + "title": "To confirm the product instance", + "documentation": "This example determines whether the specified product code is associated with the specified instance.", + "input": { + "ProductCode": "774F4FF8", + "InstanceId": "i-1234567890abcdef0" + }, + "output": { + "OwnerId": "123456789012" + } + } + ] } }, "com.amazonaws.ec2#ConfirmProductInstanceRequest": { @@ -12719,7 +12937,22 @@ "target": "com.amazonaws.ec2#CopyImageResult" }, "traits": { - "smithy.api#documentation": "

Initiates the copy of an AMI. You can copy an AMI from one Region to another, or from a\n Region to an Outpost. You can't copy an AMI from an Outpost to a Region, from one Outpost\n to another, or within the same Outpost. To copy an AMI to another partition, see CreateStoreImageTask.

\n

To copy an AMI from one Region to another, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tdestination Region using its endpoint. Copies of encrypted backing snapshots for\n \t\tthe AMI are encrypted. Copies of unencrypted backing snapshots remain unencrypted, \n \t\tunless you set Encrypted during the copy operation. You cannot \n \t\tcreate an unencrypted copy of an encrypted backing snapshot.

\n

To copy an AMI from a Region to an Outpost, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tARN of the destination Outpost using DestinationOutpostArn. \n \t\tBacking snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon EC2 User Guide.

\n

For more information about the prerequisites and limits when copying an AMI, see Copy an AMI in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Initiates the copy of an AMI. You can copy an AMI from one Region to another, or from a\n Region to an Outpost. You can't copy an AMI from an Outpost to a Region, from one Outpost\n to another, or within the same Outpost. To copy an AMI to another partition, see CreateStoreImageTask.

\n

To copy an AMI from one Region to another, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tdestination Region using its endpoint. Copies of encrypted backing snapshots for\n \t\tthe AMI are encrypted. Copies of unencrypted backing snapshots remain unencrypted, \n \t\tunless you set Encrypted during the copy operation. You cannot \n \t\tcreate an unencrypted copy of an encrypted backing snapshot.

\n

To copy an AMI from a Region to an Outpost, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tARN of the destination Outpost using DestinationOutpostArn. \n \t\tBacking snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon EC2 User Guide.

\n

For more information about the prerequisites and limits when copying an AMI, see Copy an AMI in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To copy an AMI to another region", + "documentation": "This example copies the specified AMI from the us-east-1 region to the current region.", + "input": { + "Description": "", + "Name": "My server", + "SourceImageId": "ami-5731123e", + "SourceRegion": "us-east-1" + }, + "output": { + "ImageId": "ami-438bea42" + } + } + ] } }, "com.amazonaws.ec2#CopyImageRequest": { @@ -12835,7 +13068,22 @@ "target": "com.amazonaws.ec2#CopySnapshotResult" }, "traits": { - "smithy.api#documentation": "

Copies a point-in-time snapshot of an EBS volume and stores it in Amazon S3. You can copy a\n snapshot within the same Region, from one Region to another, or from a Region to an Outpost. \n You can't copy a snapshot from an Outpost to a Region, from one Outpost to another, or within \n the same Outpost.

\n

You can use the snapshot to create EBS volumes or Amazon Machine Images (AMIs).

\n

When copying snapshots to a Region, copies of encrypted EBS snapshots remain encrypted. \n \tCopies of unencrypted snapshots remain unencrypted, unless you enable encryption for the \n \tsnapshot copy operation. By default, encrypted snapshot copies use the default Key Management Service (KMS) \n \tKMS key; however, you can specify a different KMS key. To copy an encrypted \n \tsnapshot that has been shared from another account, you must have permissions for the KMS key \n \tused to encrypt the snapshot.

\n

Snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon Elastic Compute Cloud User Guide.

\n

Snapshots created by copying another snapshot have an arbitrary volume ID that should not\n be used for any purpose.

\n

For more information, see Copy an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Copies a point-in-time snapshot of an EBS volume and stores it in Amazon S3. You can copy a\n snapshot within the same Region, from one Region to another, or from a Region to an Outpost. \n You can't copy a snapshot from an Outpost to a Region, from one Outpost to another, or within \n the same Outpost.

\n

You can use the snapshot to create EBS volumes or Amazon Machine Images (AMIs).

\n

When copying snapshots to a Region, copies of encrypted EBS snapshots remain encrypted. \n \tCopies of unencrypted snapshots remain unencrypted, unless you enable encryption for the \n \tsnapshot copy operation. By default, encrypted snapshot copies use the default Key Management Service (KMS) \n \tKMS key; however, you can specify a different KMS key. To copy an encrypted \n \tsnapshot that has been shared from another account, you must have permissions for the KMS key \n \tused to encrypt the snapshot.

\n

Snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon Elastic Compute Cloud User Guide.

\n

Snapshots created by copying another snapshot have an arbitrary volume ID that should not\n be used for any purpose.

\n

For more information, see Copy an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To copy a snapshot", + "documentation": "This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.", + "input": { + "SourceRegion": "us-west-2", + "SourceSnapshotId": "snap-066877671789bd71b", + "Description": "This is my copied snapshot.", + "DestinationRegion": "us-east-1" + }, + "output": { + "SnapshotId": "snap-066877671789bd71b" + } + } + ] } }, "com.amazonaws.ec2#CopySnapshotRequest": { @@ -13040,7 +13288,7 @@ "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { "aws.protocols#ec2QueryName": "AmdSevSnp", - "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP.

", + "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "amdSevSnp" } } @@ -13071,7 +13319,7 @@ "AmdSevSnp": { "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { - "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only.

" + "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only. For more information, see \n AMD SEV-SNP.

" } } }, @@ -13301,13 +13549,13 @@ } }, "AvailabilityZone": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#documentation": "

The Availability Zone in which to create the Capacity Reservation.

" } }, "AvailabilityZoneId": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneId", "traits": { "smithy.api#documentation": "

The ID of the Availability Zone in which to create the Capacity Reservation.

" } @@ -13863,7 +14111,27 @@ "target": "com.amazonaws.ec2#CreateCustomerGatewayResult" }, "traits": { - "smithy.api#documentation": "

Provides information to Amazon Web Services about your customer gateway device. The\n customer gateway device is the appliance at your end of the VPN connection. You\n must provide the IP address of the customer gateway device’s external\n interface. The IP address must be static and can be behind a device performing network\n address translation (NAT).

\n

For devices that use Border Gateway Protocol (BGP), you can also provide the device's\n BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\n If you don't have an ASN already, you can use a private ASN. For more information, see \n Customer gateway \n options for your Site-to-Site VPN connection in the Amazon Web Services Site-to-Site VPN User Guide.

\n

To create more than one customer gateway with the same VPN type, IP address, and\n BGP ASN, specify a unique device name for each customer gateway. An identical request\n returns information about the existing customer gateway; it doesn't create a new customer\n gateway.

" + "smithy.api#documentation": "

Provides information to Amazon Web Services about your customer gateway device. The\n customer gateway device is the appliance at your end of the VPN connection. You\n must provide the IP address of the customer gateway device’s external\n interface. The IP address must be static and can be behind a device performing network\n address translation (NAT).

\n

For devices that use Border Gateway Protocol (BGP), you can also provide the device's\n BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\n If you don't have an ASN already, you can use a private ASN. For more information, see \n Customer gateway \n options for your Site-to-Site VPN connection in the Amazon Web Services Site-to-Site VPN User Guide.

\n

To create more than one customer gateway with the same VPN type, IP address, and\n BGP ASN, specify a unique device name for each customer gateway. An identical request\n returns information about the existing customer gateway; it doesn't create a new customer\n gateway.

", + "smithy.api#examples": [ + { + "title": "To create a customer gateway", + "documentation": "This example creates a customer gateway with the specified IP address for its outside interface.", + "input": { + "Type": "ipsec.1", + "PublicIp": "12.1.2.3", + "BgpAsn": 65534 + }, + "output": { + "CustomerGateway": { + "CustomerGatewayId": "cgw-0e11f167", + "IpAddress": "12.1.2.3", + "State": "available", + "Type": "ipsec.1", + "BgpAsn": "65534" + } + } + } + ] } }, "com.amazonaws.ec2#CreateCustomerGatewayRequest": { @@ -13958,7 +14226,7 @@ "target": "com.amazonaws.ec2#CreateDefaultSubnetResult" }, "traits": { - "smithy.api#documentation": "

Creates a default subnet with a size /20 IPv4 CIDR block in the\n specified Availability Zone in your default VPC. You can have only one default subnet\n per Availability Zone. For more information, see Creating a default\n subnet in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a default subnet with a size /20 IPv4 CIDR block in the\n specified Availability Zone in your default VPC. You can have only one default subnet\n per Availability Zone. For more information, see Create a default\n subnet in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateDefaultSubnetRequest": { @@ -14018,7 +14286,7 @@ "target": "com.amazonaws.ec2#CreateDefaultVpcResult" }, "traits": { - "smithy.api#documentation": "

Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet\n\t\t\tin each Availability Zone. For more information about the components of a default VPC,\n\t\t\tsee Default VPC and\n\t\t\tdefault subnets in the Amazon Virtual Private Cloud User Guide. You cannot\n\t\t\tspecify the components of the default VPC yourself.

\n

If you deleted your previous default VPC, you can create a default VPC. You cannot have\n\t\t\tmore than one default VPC per Region.

\n

If your account supports EC2-Classic, you cannot use this action to create a default VPC\n\t\t\tin a Region that supports EC2-Classic. If you want a default VPC in a Region that\n\t\t\tsupports EC2-Classic, see \"I really want a default VPC for my existing EC2 account. Is\n\t\t\tthat possible?\" in the Default VPCs\n\t\t\tFAQ.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet\n\t\t\tin each Availability Zone. For more information about the components of a default VPC,\n\t\t\tsee Default VPCs \n\t\t in the Amazon VPC User Guide. You cannot specify the components of the \n\t\t default VPC yourself.

\n

If you deleted your previous default VPC, you can create a default VPC. You cannot have\n\t\t\tmore than one default VPC per Region.

" } }, "com.amazonaws.ec2#CreateDefaultVpcRequest": { @@ -14062,7 +14330,42 @@ "target": "com.amazonaws.ec2#CreateDhcpOptionsResult" }, "traits": { - "smithy.api#documentation": "

Creates a set of DHCP options for your VPC. After creating the set, you must\n\t\t\t\tassociate it with the VPC, causing all existing and new instances that you launch in\n\t\t\t\tthe VPC to use this set of DHCP options. The following are the individual DHCP\n\t\t\t\toptions you can specify. For more information about the options, see RFC 2132.

\n
    \n
  • \n

    \n domain-name-servers - The IP addresses of up to four domain name\n servers, or AmazonProvidedDNS. The default DHCP option set specifies\n AmazonProvidedDNS. If specifying more than one domain name server, specify the\n IP addresses in a single parameter, separated by commas. To have your instance\n receive a custom DNS hostname as specified in domain-name, you must\n set domain-name-servers to a custom DNS server.

    \n
  • \n
  • \n

    \n domain-name - If you're using AmazonProvidedDNS in\n us-east-1, specify ec2.internal. If you're using\n AmazonProvidedDNS in another Region, specify\n region.compute.internal (for example,\n ap-northeast-1.compute.internal). Otherwise, specify a domain\n name (for example, ExampleCompany.com). This value is used to complete\n unqualified DNS hostnames. Important: Some\n Linux operating systems accept multiple domain names separated by spaces.\n However, Windows and other Linux operating systems treat the value as a single\n domain, which results in unexpected behavior. If your DHCP options set is\n associated with a VPC that has instances with multiple operating systems,\n specify only one domain name.

    \n
  • \n
  • \n

    \n ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)\n servers.

    \n
  • \n
  • \n

    \n netbios-name-servers - The IP addresses of up to four NetBIOS name\n servers.

    \n
  • \n
  • \n

    \n netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend that\n you specify 2 (broadcast and multicast are not currently supported). For more information\n about these node types, see RFC 2132.

    \n
  • \n
\n

Your VPC automatically starts out with a set of DHCP options that includes only a DNS\n\t\t\tserver that we provide (AmazonProvidedDNS). If you create a set of options, and if your\n\t\t\tVPC has an internet gateway, make sure to set the domain-name-servers\n\t\t\toption either to AmazonProvidedDNS or to a domain name server of your\n\t\t\tchoice. For more information, see DHCP options sets in the\n\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a set of DHCP options for your VPC. After creating the set, you must\n\t\t\t\tassociate it with the VPC, causing all existing and new instances that you launch in\n\t\t\t\tthe VPC to use this set of DHCP options. The following are the individual DHCP\n\t\t\t\toptions you can specify. For more information about the options, see RFC 2132.

\n
    \n
  • \n

    \n domain-name-servers - The IP addresses of up to four domain name\n servers, or AmazonProvidedDNS. The default DHCP option set specifies\n AmazonProvidedDNS. If specifying more than one domain name server, specify the\n IP addresses in a single parameter, separated by commas. To have your instance\n receive a custom DNS hostname as specified in domain-name, you must\n set domain-name-servers to a custom DNS server.

    \n
  • \n
  • \n

    \n domain-name - If you're using AmazonProvidedDNS in\n us-east-1, specify ec2.internal. If you're using\n AmazonProvidedDNS in another Region, specify\n region.compute.internal (for example,\n ap-northeast-1.compute.internal). Otherwise, specify a domain\n name (for example, ExampleCompany.com). This value is used to complete\n unqualified DNS hostnames. Important: Some\n Linux operating systems accept multiple domain names separated by spaces.\n However, Windows and other Linux operating systems treat the value as a single\n domain, which results in unexpected behavior. If your DHCP options set is\n associated with a VPC that has instances with multiple operating systems,\n specify only one domain name.

    \n
  • \n
  • \n

    \n ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)\n servers.

    \n
  • \n
  • \n

    \n netbios-name-servers - The IP addresses of up to four NetBIOS name\n servers.

    \n
  • \n
  • \n

    \n netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend that\n you specify 2 (broadcast and multicast are not currently supported). For more information\n about these node types, see RFC 2132.

    \n
  • \n
\n

Your VPC automatically starts out with a set of DHCP options that includes only a DNS\n\t\t\tserver that we provide (AmazonProvidedDNS). If you create a set of options, and if your\n\t\t\tVPC has an internet gateway, make sure to set the domain-name-servers\n\t\t\toption either to AmazonProvidedDNS or to a domain name server of your\n\t\t\tchoice. For more information, see DHCP options sets in the\n\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a DHCP options set", + "documentation": "This example creates a DHCP options set.", + "input": { + "DhcpConfigurations": [ + { + "Key": "domain-name-servers", + "Values": [ + "10.2.5.1", + "10.2.5.2" + ] + } + ] + }, + "output": { + "DhcpOptions": { + "DhcpConfigurations": [ + { + "Values": [ + { + "Value": "10.2.5.2" + }, + { + "Value": "10.2.5.1" + } + ], + "Key": "domain-name-servers" + } + ], + "DhcpOptionsId": "dopt-d9070ebb" + } + } + } + ] } }, "com.amazonaws.ec2#CreateDhcpOptionsRequest": { @@ -14198,7 +14501,7 @@ "target": "com.amazonaws.ec2#CreateFleetResult" }, "traits": { - "smithy.api#documentation": "

Launches an EC2 Fleet.

\n

You can create a single EC2 Fleet that includes multiple launch specifications that vary by\n instance type, AMI, Availability Zone, or subnet.

\n

For more information, see EC2 Fleet in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Creates an EC2 Fleet that contains the configuration information for On-Demand Instances and Spot Instances.\n Instances are launched immediately if there is available capacity.

\n

A single EC2 Fleet can include multiple launch specifications that vary by instance type,\n AMI, Availability Zone, or subnet.

\n

For more information, see EC2 Fleet in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#CreateFleetError": { @@ -14527,7 +14830,7 @@ "LogFormat": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The fields to include in the flow log record. List the fields in the order in which\n they should appear. If you omit this parameter, the flow log is created using the\n default format. If you specify this parameter, you must include at least one\n field. For more information about the available fields, see Flow log\n records in the Amazon VPC User Guide or Transit Gateway Flow Log\n records in the Amazon Web Services Transit Gateway Guide.

\n

Specify the fields using the ${field-id} format, separated by spaces. For\n the CLI, surround this parameter value with single quotes on Linux or\n double quotes on Windows.

" + "smithy.api#documentation": "

The fields to include in the flow log record. List the fields in the order in which\n they should appear. If you omit this parameter, the flow log is created using the\n default format. If you specify this parameter, you must include at least one\n field. For more information about the available fields, see Flow log\n records in the Amazon VPC User Guide or Transit Gateway Flow Log\n records in the Amazon Web Services Transit Gateway Guide.

\n

Specify the fields using the ${field-id} format, separated by spaces.

" } }, "TagSpecifications": { @@ -14688,7 +14991,7 @@ "target": "com.amazonaws.ec2#CreateImageResult" }, "traits": { - "smithy.api#documentation": "

Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance \n \tthat is either running or stopped.

\n

By default, when Amazon EC2 creates the new AMI, it reboots the instance so that it can \n\t\t\t\t\ttake snapshots of the attached volumes while data is at rest, in order to ensure a consistent \n\t\t\t\t\tstate. You can set the NoReboot parameter to true in the API request, \n\t\t\t\t\tor use the --no-reboot option in the CLI to prevent Amazon EC2 from shutting down and \n\t\t\t\t\trebooting the instance.

\n \n

If you choose to bypass the shutdown and reboot process by setting the NoReboot \n\t\t\t\t\tparameter to true in the API request, or by using the --no-reboot option \n\t\t\t\t\tin the CLI, we can't guarantee the file system integrity of the created image.

\n
\n

If you customized your instance with instance store volumes or Amazon EBS volumes in addition to the root device volume, the \n \tnew AMI contains block device mapping information for those volumes. When you launch an instance from this new AMI, \n \tthe instance automatically launches with those additional volumes.

\n

For more information, see Create an Amazon EBS-backed Linux\n AMI in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance \n \tthat is either running or stopped.

\n

If you customized your instance with instance store volumes or Amazon EBS volumes in addition to the root device volume, the \n \tnew AMI contains block device mapping information for those volumes. When you launch an instance from this new AMI, \n \tthe instance automatically launches with those additional volumes.

\n

For more information, see Create an Amazon EBS-backed Linux\n AMI in the Amazon Elastic Compute Cloud User Guide.

" } }, "com.amazonaws.ec2#CreateImageRequest": { @@ -14746,7 +15049,7 @@ "aws.protocols#ec2QueryName": "NoReboot", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

By default, when Amazon EC2 creates the new AMI, it reboots the instance so that it can \n\t\t\t\t\ttake snapshots of the attached volumes while data is at rest, in order to ensure a consistent \n\t\t\t\t\tstate. You can set the NoReboot parameter to true in the API request, \n\t\t\t\t\tor use the --no-reboot option in the CLI to prevent Amazon EC2 from shutting down and \n\t\t\t\t\trebooting the instance.

\n \n

If you choose to bypass the shutdown and reboot process by setting the NoReboot \n\t\t\t\t\tparameter to true in the API request, or by using the --no-reboot option \n\t\t\t\t\tin the CLI, we can't guarantee the file system integrity of the created image.

\n
\n

Default: false (follow standard reboot process)

", + "smithy.api#documentation": "

Indicates whether or not the instance should be automatically rebooted before creating \n the image. Specify one of the following values:

\n
    \n
  • \n

    \n true - The instance is not rebooted before creating the image. This \n creates crash-consistent snapshots that include only the data that has been written \n to the volumes at the time the snapshots are created. Buffered data and data in \n memory that has not yet been written to the volumes is not included in the snapshots.

    \n
  • \n
  • \n

    \n false - The instance is rebooted before creating the image. This \n ensures that all buffered data and data in memory is written to the volumes before the \n snapshots are created.

    \n
  • \n
\n

Default: false\n

", "smithy.api#xmlName": "noReboot" } }, @@ -14787,7 +15090,7 @@ "target": "com.amazonaws.ec2#CreateInstanceConnectEndpointResult" }, "traits": { - "smithy.api#documentation": "

Creates an EC2 Instance Connect Endpoint.

\n

An EC2 Instance Connect Endpoint allows you to connect to a resource, without\n requiring the resource to have a public IPv4 address. For more information, see Connect to your resources without requiring a public IPv4 address using EC2\n Instance Connect Endpoint in the Amazon EC2 User\n Guide.

" + "smithy.api#documentation": "

Creates an EC2 Instance Connect Endpoint.

\n

An EC2 Instance Connect Endpoint allows you to connect to an instance, without\n requiring the instance to have a public IPv4 address. For more information, see Connect to your instances without requiring a public IPv4 address using EC2\n Instance Connect Endpoint in the Amazon EC2 User\n Guide.

" } }, "com.amazonaws.ec2#CreateInstanceConnectEndpointRequest": { @@ -14946,7 +15249,7 @@ "target": "com.amazonaws.ec2#CreateInstanceExportTaskResult" }, "traits": { - "smithy.api#documentation": "

Exports a running or stopped instance to an Amazon S3 bucket.

\n

For information about the supported operating systems, image formats, and known limitations\n for the types of instances you can export, see Exporting an instance as a VM Using VM Import/Export\n in the VM Import/Export User Guide.

" + "smithy.api#documentation": "

Exports a running or stopped instance to an Amazon S3 bucket.

\n

For information about the prerequisites for your Amazon S3 bucket, supported operating systems,\n image formats, and known limitations for the types of instances you can export, see Exporting an instance as a VM Using VM\n Import/Export in the VM Import/Export User Guide.

" } }, "com.amazonaws.ec2#CreateInstanceExportTaskRequest": { @@ -15027,7 +15330,20 @@ "target": "com.amazonaws.ec2#CreateInternetGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates an internet gateway for use with a VPC. After creating the internet gateway,\n\t\t\tyou attach it to a VPC using AttachInternetGateway.

\n

For more information about your VPC and internet gateway, see the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates an internet gateway for use with a VPC. After creating the internet gateway,\n\t\t\tyou attach it to a VPC using AttachInternetGateway.

\n

For more information, see Internet gateways in the \n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an Internet gateway", + "documentation": "This example creates an Internet gateway.", + "output": { + "InternetGateway": { + "Tags": [], + "InternetGatewayId": "igw-c0a643a9", + "Attachments": [] + } + } + } + ] } }, "com.amazonaws.ec2#CreateInternetGatewayRequest": { @@ -15445,7 +15761,16 @@ "target": "com.amazonaws.ec2#KeyPair" }, "traits": { - "smithy.api#documentation": "

Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\n specified PEM or PPK format. Amazon EC2 stores the public key and displays the private\n key for you to save to a file. The private key is returned as an unencrypted PEM encoded\n PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\n key with the specified name already exists, Amazon EC2 returns an error.

\n

The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\n If you prefer, you can create your own key pair using a third-party tool and upload it\n to any Region using ImportKeyPair.

\n

You can have up to 5,000 key pairs per Amazon Web Services Region.

\n

For more information, see Amazon EC2 key pairs in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\n specified PEM or PPK format. Amazon EC2 stores the public key and displays the private\n key for you to save to a file. The private key is returned as an unencrypted PEM encoded\n PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\n key with the specified name already exists, Amazon EC2 returns an error.

\n

The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\n If you prefer, you can create your own key pair using a third-party tool and upload it\n to any Region using ImportKeyPair.

\n

You can have up to 5,000 key pairs per Amazon Web Services Region.

\n

For more information, see Amazon EC2 key pairs in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a key pair", + "documentation": "This example creates a key pair named my-key-pair.", + "input": { + "KeyName": "my-key-pair" + } + } + ] } }, "com.amazonaws.ec2#CreateKeyPairRequest": { @@ -15502,7 +15827,50 @@ "target": "com.amazonaws.ec2#CreateLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Creates a launch template.

\n

A launch template contains the parameters to launch an instance. When you launch an\n instance using RunInstances, you can specify a launch template instead\n of providing the launch parameters in the request. For more information, see Launch\n an instance from a launch template in the\n Amazon Elastic Compute Cloud User Guide.

\n

If you want to clone an existing launch template as the basis for creating a new\n launch template, you can use the Amazon EC2 console. The API, SDKs, and CLI do not support\n cloning a template. For more information, see Create a launch template from an existing launch template in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a launch template.

\n

A launch template contains the parameters to launch an instance. When you launch an\n instance using RunInstances, you can specify a launch template instead\n of providing the launch parameters in the request. For more information, see Launch\n an instance from a launch template in the\n Amazon Elastic Compute Cloud User Guide.

\n

If you want to clone an existing launch template as the basis for creating a new\n launch template, you can use the Amazon EC2 console. The API, SDKs, and CLI do not support\n cloning a template. For more information, see Create a launch template from an existing launch template in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a launch template", + "documentation": "This example creates a launch template that specifies the subnet in which to launch the instance, assigns a public IP address and an IPv6 address to the instance, and creates a tag for the instance.", + "input": { + "LaunchTemplateName": "my-template", + "VersionDescription": "WebVersion1", + "LaunchTemplateData": { + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": true, + "DeviceIndex": 0, + "Ipv6AddressCount": 1, + "SubnetId": "subnet-7b16de0c" + } + ], + "ImageId": "ami-8c1be5f6", + "InstanceType": "t2.small", + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Name", + "Value": "webserver" + } + ] + } + ] + } + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 1, + "LaunchTemplateId": "lt-01238c059e3466abc", + "LaunchTemplateName": "my-template", + "DefaultVersionNumber": 1, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-11-27T09:13:24.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateLaunchTemplateRequest": { @@ -15589,7 +15957,48 @@ "target": "com.amazonaws.ec2#CreateLaunchTemplateVersionResult" }, "traits": { - "smithy.api#documentation": "

Creates a new version of a launch template. You can specify an existing version of\n launch template from which to base the new version.

\n

Launch template versions are numbered in the order in which they are created. You\n cannot specify, change, or replace the numbering of launch template versions.

\n

Launch templates are immutable; after you create a launch template, you can't modify\n it. Instead, you can create a new version of the launch template that includes any\n changes you require.

\n

For more information, see Modify a launch template (manage launch template versions) in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a new version of a launch template. You can specify an existing version of\n launch template from which to base the new version.

\n

Launch template versions are numbered in the order in which they are created. You\n cannot specify, change, or replace the numbering of launch template versions.

\n

Launch templates are immutable; after you create a launch template, you can't modify\n it. Instead, you can create a new version of the launch template that includes any\n changes you require.

\n

For more information, see Modify a launch template (manage launch template versions) in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a launch template version", + "documentation": "This example creates a new launch template version based on version 1 of the specified launch template and specifies a different AMI ID.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "SourceVersion": "1", + "VersionDescription": "WebVersion2", + "LaunchTemplateData": { + "ImageId": "ami-c998b6b2" + } + }, + "output": { + "LaunchTemplateVersion": { + "VersionDescription": "WebVersion2", + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "my-template", + "VersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "LaunchTemplateData": { + "ImageId": "ami-c998b6b2", + "InstanceType": "t2.micro", + "NetworkInterfaces": [ + { + "Ipv6Addresses": [ + { + "Ipv6Address": "2001:db8:1234:1a00::123" + } + ], + "DeviceIndex": 0, + "SubnetId": "subnet-7b16de0c", + "AssociatePublicIpAddress": true + } + ] + }, + "DefaultVersion": false, + "CreateTime": "2017-12-01T13:35:46.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateLaunchTemplateVersionRequest": { @@ -16052,7 +16461,31 @@ "target": "com.amazonaws.ec2#CreateNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a NAT gateway", + "documentation": "This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.", + "input": { + "SubnetId": "subnet-1a2b3c4d", + "AllocationId": "eipalloc-37fc1a52" + }, + "output": { + "NatGateway": { + "NatGatewayAddresses": [ + { + "AllocationId": "eipalloc-37fc1a52" + } + ], + "VpcId": "vpc-1122aabb", + "State": "pending", + "NatGatewayId": "nat-08d48af2a8e83edfd", + "SubnetId": "subnet-1a2b3c4d", + "CreateTime": "2015-12-17T12:45:26.732Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateNatGatewayRequest": { @@ -16109,14 +16542,14 @@ "SecondaryAllocationIds": { "target": "com.amazonaws.ec2#AllocationIdList", "traits": { - "smithy.api#documentation": "

Secondary EIP allocation IDs. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Secondary EIP allocation IDs. For more information, see Create a NAT gateway \n in the Amazon VPC User Guide.

", "smithy.api#xmlName": "SecondaryAllocationId" } }, "SecondaryPrivateIpAddresses": { "target": "com.amazonaws.ec2#IpList", "traits": { - "smithy.api#documentation": "

Secondary private IPv4 addresses. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Secondary private IPv4 addresses. For more information about secondary addresses, see Create a NAT gateway in the Amazon VPC User Guide.

", "smithy.api#xmlName": "SecondaryPrivateIpAddress" } }, @@ -16125,7 +16558,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. \n For more information about secondary addresses, see Create a NAT gateway \n in the Amazon VPC User Guide.

" } } }, @@ -16166,7 +16599,41 @@ "target": "com.amazonaws.ec2#CreateNetworkAclResult" }, "traits": { - "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a network ACL", + "documentation": "This example creates a network ACL for the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + }, + "output": { + "NetworkAcl": { + "Associations": [], + "NetworkAclId": "acl-5fb85d36", + "VpcId": "vpc-a01106c2", + "Tags": [], + "Entries": [ + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": true, + "RuleAction": "deny" + }, + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": false, + "RuleAction": "deny" + } + ], + "IsDefault": false + } + } + } + ] } }, "com.amazonaws.ec2#CreateNetworkAclEntry": { @@ -16178,7 +16645,25 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs \n in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a network ACL entry", + "documentation": "This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Protocol": "17", + "RuleAction": "allow", + "Egress": false, + "CidrBlock": "0.0.0.0/0", + "PortRange": { + "From": 53, + "To": 53 + } + } + } + ] } }, "com.amazonaws.ec2#CreateNetworkAclEntryRequest": { @@ -16746,6 +17231,14 @@ "smithy.api#documentation": "

Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see Ensuring Idempotency.

", "smithy.api#idempotencyToken": {} } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

If you’re creating a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use this option if the instance that\n this ENI will be attached to relies on its IPv6 address not changing. Amazon Web Services\n will automatically assign an IPv6 address associated with the ENI attached to your\n instance to be the primary IPv6 address. Once you enable an IPv6 GUA address to be a\n primary IPv6, you cannot disable it. When you enable an IPv6 GUA address to be a primary\n IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is\n terminated or the network interface is detached. If you have multiple IPv6 addresses\n associated with an ENI attached to your instance and you enable a primary IPv6 address,\n the first IPv6 GUA address associated with the ENI becomes the primary IPv6\n address.

" + } } }, "traits": { @@ -16785,7 +17278,18 @@ "target": "com.amazonaws.ec2#CreatePlacementGroupResult" }, "traits": { - "smithy.api#documentation": "

Creates a placement group in which to launch instances. The strategy of the placement\n group determines how the instances are organized within the group.

\n

A cluster placement group is a logical grouping of instances within a\n single Availability Zone that benefit from low network latency, high network throughput.\n A spread placement group places instances on distinct hardware. A\n partition placement group places groups of instances in different\n partitions, where instances in one partition do not share the same hardware with\n instances in another partition.

\n

For more information, see Placement groups in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Creates a placement group in which to launch instances. The strategy of the placement\n group determines how the instances are organized within the group.

\n

A cluster placement group is a logical grouping of instances within a\n single Availability Zone that benefit from low network latency, high network throughput.\n A spread placement group places instances on distinct hardware. A\n partition placement group places groups of instances in different\n partitions, where instances in one partition do not share the same hardware with\n instances in another partition.

\n

For more information, see Placement groups in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a placement group", + "documentation": "This example creates a placement group with the specified name.", + "input": { + "GroupName": "my-cluster", + "Strategy": "cluster" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#CreatePlacementGroupRequest": { @@ -17157,7 +17661,18 @@ "target": "com.amazonaws.ec2#CreateRouteResult" }, "traits": { - "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a route", + "documentation": "This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": "igw-c0a643a9" + } + } + ] } }, "com.amazonaws.ec2#CreateRouteRequest": { @@ -17315,7 +17830,32 @@ "target": "com.amazonaws.ec2#CreateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a route table", + "documentation": "This example creates a route table for the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + }, + "output": { + "RouteTable": { + "Associations": [], + "RouteTableId": "rtb-22574640", + "VpcId": "vpc-a01106c2", + "PropagatingVgws": [], + "Tags": [], + "Routes": [ + { + "GatewayId": "local", + "DestinationCidrBlock": "10.0.0.0/16", + "State": "active" + } + ] + } + } + } + ] } }, "com.amazonaws.ec2#CreateRouteTableRequest": { @@ -17378,7 +17918,21 @@ "target": "com.amazonaws.ec2#CreateSecurityGroupResult" }, "traits": { - "smithy.api#documentation": "

Creates a security group.

\n

A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\n For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n

When you create a security group, you specify a friendly name of your choice. You can have a security group for use in EC2-Classic with the same name as a security group for use in a VPC. However, you can't have two security groups for use in EC2-Classic with the same name or two security groups for use in a VPC with the same name.

\n

You have a default security group for use in EC2-Classic and a default security group for use in your VPC. If you don't specify a security group when you launch an instance, the instance is launched into the appropriate default security group. A default security group includes a default rule that grants instances unrestricted network access to each other.

\n

You can add or remove rules from your security groups using \n\t\t\t\t\tAuthorizeSecurityGroupIngress,\n\t\t\t\t\tAuthorizeSecurityGroupEgress,\n\t\t\t\t\tRevokeSecurityGroupIngress, and\n\t\t\t\t\tRevokeSecurityGroupEgress.

\n

For more information about VPC security group limits, see Amazon VPC Limits.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Creates a security group.

\n

A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\n For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n

When you create a security group, you specify a friendly name of your choice. \n You can't have two security groups for the same VPC with the same name.

\n

You have a default security group for use in your VPC. If you don't specify a security group \n when you launch an instance, the instance is launched into the appropriate default security group. \n A default security group includes a default rule that grants instances unrestricted network access \n to each other.

\n

You can add or remove rules from your security groups using \n\t\t\t\t\tAuthorizeSecurityGroupIngress,\n\t\t\t\t\tAuthorizeSecurityGroupEgress,\n\t\t\t\t\tRevokeSecurityGroupIngress, and\n\t\t\t\t\tRevokeSecurityGroupEgress.

\n

For more information about VPC security group limits, see Amazon VPC Limits.

", + "smithy.api#examples": [ + { + "title": "To create a security group for a VPC", + "documentation": "This example creates a security group for the specified VPC.", + "input": { + "Description": "My security group", + "GroupName": "my-security-group", + "VpcId": "vpc-1a2b3c4d" + }, + "output": { + "GroupId": "sg-903004f8" + } + } + ] } }, "com.amazonaws.ec2#CreateSecurityGroupRequest": { @@ -17388,7 +17942,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

A description for the security group.

\n

Constraints: Up to 255 characters in length

\n

Constraints for EC2-Classic: ASCII characters

\n

Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", + "smithy.api#documentation": "

A description for the security group.

\n

Constraints: Up to 255 characters in length

\n

Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", "smithy.api#required": {}, "smithy.api#xmlName": "GroupDescription" } @@ -17397,14 +17951,14 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The name of the security group.

\n

Constraints: Up to 255 characters in length. Cannot start with\n sg-.

\n

Constraints for EC2-Classic: ASCII characters

\n

Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", + "smithy.api#documentation": "

The name of the security group.

\n

Constraints: Up to 255 characters in length. Cannot start with sg-.

\n

Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", "smithy.api#required": {} } }, "VpcId": { "target": "com.amazonaws.ec2#VpcId", "traits": { - "smithy.api#documentation": "

[EC2-VPC] The ID of the VPC. Required for EC2-VPC.

" + "smithy.api#documentation": "

The ID of the VPC. Required for a nondefault VPC.

" } }, "TagSpecifications": { @@ -17462,7 +18016,27 @@ "target": "com.amazonaws.ec2#Snapshot" }, "traits": { - "smithy.api#documentation": "

Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\n \tbackups, to make copies of EBS volumes, and to save data before shutting down an\n \tinstance.

\n

You can create snapshots of volumes in a Region and volumes on an Outpost. If you \n \tcreate a snapshot of a volume in a Region, the snapshot must be stored in the same \n \tRegion as the volume. If you create a snapshot of a volume on an Outpost, the snapshot \n \tcan be stored on the same Outpost as the volume, or in the Region for that Outpost.

\n

When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\n source volume are propagated to the snapshot.

\n

You can take a snapshot of an attached volume that is in use. However, snapshots only\n capture data that has been written to your Amazon EBS volume at the time the snapshot command is\n issued; this might exclude any data that has been cached by any applications or the operating\n system. If you can pause any file systems on the volume long enough to take a snapshot, your\n snapshot should be complete. However, if you cannot pause all file writes to the volume, you\n should unmount the volume from within the instance, issue the snapshot command, and then\n remount the volume to ensure a consistent and complete snapshot. You may remount and use your\n volume while the snapshot status is pending.

\n

When you create a snapshot for an EBS volume that serves as a root device, we recommend \n that you stop the instance before taking the snapshot.

\n

Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\n are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\n and any associated snapshots always remain protected.

\n

You can tag your snapshots during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Amazon Elastic Block Store and Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\n \tbackups, to make copies of EBS volumes, and to save data before shutting down an\n \tinstance.

\n

You can create snapshots of volumes in a Region and volumes on an Outpost. If you \n \tcreate a snapshot of a volume in a Region, the snapshot must be stored in the same \n \tRegion as the volume. If you create a snapshot of a volume on an Outpost, the snapshot \n \tcan be stored on the same Outpost as the volume, or in the Region for that Outpost.

\n

When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\n source volume are propagated to the snapshot.

\n

You can take a snapshot of an attached volume that is in use. However, snapshots only\n capture data that has been written to your Amazon EBS volume at the time the snapshot command is\n issued; this might exclude any data that has been cached by any applications or the operating\n system. If you can pause any file systems on the volume long enough to take a snapshot, your\n snapshot should be complete. However, if you cannot pause all file writes to the volume, you\n should unmount the volume from within the instance, issue the snapshot command, and then\n remount the volume to ensure a consistent and complete snapshot. You may remount and use your\n volume while the snapshot status is pending.

\n

When you create a snapshot for an EBS volume that serves as a root device, we recommend \n that you stop the instance before taking the snapshot.

\n

Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\n are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\n and any associated snapshots always remain protected.

\n

You can tag your snapshots during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Amazon Elastic Block Store and Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a snapshot", + "documentation": "This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.", + "input": { + "VolumeId": "vol-1234567890abcdef0", + "Description": "This is my root volume snapshot." + }, + "output": { + "Description": "This is my root volume snapshot.", + "Tags": [], + "VolumeId": "vol-1234567890abcdef0", + "State": "pending", + "VolumeSize": 8, + "StartTime": "2014-02-28T21:06:01.000Z", + "OwnerId": "012345678910", + "SnapshotId": "snap-066877671789bd71b" + } + } + ] } }, "com.amazonaws.ec2#CreateSnapshotRequest": { @@ -17596,7 +18170,25 @@ "target": "com.amazonaws.ec2#CreateSpotDatafeedSubscriptionResult" }, "traits": { - "smithy.api#documentation": "

Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\n You can create one data feed per Amazon Web Services account. For more information, see\n Spot Instance data feed \n in the Amazon EC2 User Guide for Linux Instances.

" + "smithy.api#documentation": "

Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\n You can create one data feed per Amazon Web Services account. For more information, see\n Spot Instance data feed \n in the Amazon EC2 User Guide for Linux Instances.

", + "smithy.api#examples": [ + { + "title": "To create a Spot Instance datafeed", + "documentation": "This example creates a Spot Instance data feed for your AWS account.", + "input": { + "Bucket": "my-s3-bucket", + "Prefix": "spotdata" + }, + "output": { + "SpotDatafeedSubscription": { + "OwnerId": "123456789012", + "Prefix": "spotdata", + "Bucket": "my-s3-bucket", + "State": "Active" + } + } + } + ] } }, "com.amazonaws.ec2#CreateSpotDatafeedSubscriptionRequest": { @@ -17729,7 +18321,27 @@ "target": "com.amazonaws.ec2#CreateSubnetResult" }, "traits": { - "smithy.api#documentation": "

Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\n If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\n For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\n an IPv4 CIDR block and an IPv6 CIDR block.

\n

A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\n After you create a subnet, you can't change its CIDR block.

\n

The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and \n a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \n the last IPv4 address in each subnet's CIDR block. They're not available for your use.

\n

If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR block \n with a subnet when you create it. The allowed block size for an IPv6 subnet is a /64 netmask.

\n

If you add more than one subnet to a VPC, they're set up in a star topology with a\n logical router in the middle.

\n

When you stop an instance in a subnet, it retains its private IPv4 address. It's\n therefore possible to have a subnet with no running instances (they're all stopped), but\n no remaining IP addresses available.

\n

For more information, see Subnets in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\n If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\n For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\n an IPv4 CIDR block and an IPv6 CIDR block.

\n

A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\n After you create a subnet, you can't change its CIDR block.

\n

The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and \n a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \n the last IPv4 address in each subnet's CIDR block. They're not available for your use.

\n

If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR block \n with a subnet when you create it. The allowed block size for an IPv6 subnet is a /64 netmask.

\n

If you add more than one subnet to a VPC, they're set up in a star topology with a\n logical router in the middle.

\n

When you stop an instance in a subnet, it retains its private IPv4 address. It's\n therefore possible to have a subnet with no running instances (they're all stopped), but\n no remaining IP addresses available.

\n

For more information, see Subnets in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a subnet", + "documentation": "This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.", + "input": { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24" + }, + "output": { + "Subnet": { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24", + "State": "pending", + "AvailabilityZone": "us-west-2c", + "SubnetId": "subnet-9d4a7b6c", + "AvailableIpAddressCount": 251 + } + } + } + ] } }, "com.amazonaws.ec2#CreateSubnetCidrReservation": { @@ -17741,7 +18353,7 @@ "target": "com.amazonaws.ec2#CreateSubnetCidrReservationResult" }, "traits": { - "smithy.api#documentation": "

Creates a subnet CIDR reservation. For information about subnet CIDR reservations, see Subnet CIDR reservations in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a subnet CIDR reservation. For more information, see Subnet CIDR reservations \n in the Amazon Virtual Private Cloud User Guide and Assign prefixes \n to network interfaces in the Amazon Elastic Compute Cloud User Guide.

" } }, "com.amazonaws.ec2#CreateSubnetCidrReservationRequest": { @@ -17767,14 +18379,14 @@ "target": "com.amazonaws.ec2#SubnetCidrReservationType", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The type of reservation.

\n

The following are valid values:

\n
    \n
  • \n

    \n prefix: The Amazon EC2\n Prefix\n Delegation feature assigns the IP addresses to network interfaces that are\n associated with an instance. For information about Prefix\n Delegation,\n see Prefix Delegation\n for Amazon EC2 network interfaces in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n explicit: You manually assign the IP addresses to resources that\n reside in your subnet.

    \n
  • \n
", + "smithy.api#documentation": "

The type of reservation. The reservation type determines how the reserved IP addresses are \n assigned to resources.

\n
    \n
  • \n

    \n prefix - Amazon Web Services assigns the reserved IP addresses to \n network interfaces.

    \n
  • \n
  • \n

    \n explicit - You assign the reserved IP addresses to network interfaces.

    \n
  • \n
", "smithy.api#required": {} } }, "Description": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The\n description\n to assign to the subnet CIDR reservation.

" + "smithy.api#documentation": "

The description to assign to the subnet CIDR reservation.

" } }, "DryRun": { @@ -17826,7 +18438,7 @@ "AvailabilityZone": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The Availability Zone or Local Zone for the subnet.

\n

Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \n do not necessarily select a different zone for each subnet.

\n

To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\n us-west-2-lax-1a. For information about the Regions that support Local Zones, \n see Available Regions in the Amazon Elastic Compute Cloud User Guide.

\n

To create a subnet in an Outpost, set this value to the Availability Zone for the\n Outpost and specify the Outpost ARN.

" + "smithy.api#documentation": "

The Availability Zone or Local Zone for the subnet.

\n

Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \n do not necessarily select a different zone for each subnet.

\n

To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\n us-west-2-lax-1a. For information about the Regions that support Local Zones, \n see Local Zones locations.

\n

To create a subnet in an Outpost, set this value to the Availability Zone for the\n Outpost and specify the Outpost ARN.

" } }, "AvailabilityZoneId": { @@ -17909,7 +18521,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\n resources. When you specify an existing tag key, the value is overwritten with\n the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\n optional value. Tag keys must be unique per resource.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide. For more information about\n creating IAM policies that control users' access to resources based on tags, see Supported\n resource-level permissions for Amazon EC2 API actions in the Amazon\n Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\n resources. When you specify an existing tag key, the value is overwritten with\n the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\n optional value. Tag keys must be unique per resource.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide. For more information about\n creating IAM policies that control users' access to resources based on tags, see Supported\n resource-level permissions for Amazon EC2 API actions in the Amazon\n Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag to a resource", + "documentation": "This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.", + "input": { + "Resources": [ + "ami-78a54011" + ], + "Tags": [ + { + "Key": "Stack", + "Value": "production" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CreateTagsRequest": { @@ -18198,7 +18827,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

" + "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

\n

For sessions with Network Load Balancer (NLB) Traffic Mirror targets the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { @@ -19757,7 +20386,29 @@ "target": "com.amazonaws.ec2#Volume" }, "traits": { - "smithy.api#documentation": "

Creates an EBS volume that can be attached to an instance in the same Availability Zone.

\n

You can create a new empty volume or restore a volume from an EBS snapshot.\n Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.

\n

You can create encrypted volumes. Encrypted volumes must be attached to instances that \n support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \n encrypted. For more information, see Amazon EBS encryption\n in the Amazon Elastic Compute Cloud User Guide.

\n

You can tag your volumes during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Create an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an EBS volume that can be attached to an instance in the same Availability Zone.

\n

You can create a new empty volume or restore a volume from an EBS snapshot.\n Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.

\n

You can create encrypted volumes. Encrypted volumes must be attached to instances that \n support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \n encrypted. For more information, see Amazon EBS encryption\n in the Amazon Elastic Compute Cloud User Guide.

\n

You can tag your volumes during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Create an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new volume", + "documentation": "This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.", + "input": { + "AvailabilityZone": "us-east-1a", + "Size": 80, + "VolumeType": "gp2" + }, + "output": { + "AvailabilityZone": "us-east-1a", + "Encrypted": false, + "VolumeType": "gp2", + "VolumeId": "vol-6b60b7c7", + "State": "creating", + "Iops": 240, + "SnapshotId": "", + "CreateTime": "2016-08-29T18:52:32.724Z", + "Size": 80 + } + } + ] } }, "com.amazonaws.ec2#CreateVolumePermission": { @@ -19820,7 +20471,7 @@ "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The Availability Zone in which to create the volume.

", + "smithy.api#documentation": "

The ID of the Availability Zone in which to create the volume. For example, us-east-1a.

", "smithy.api#required": {} } }, @@ -19928,7 +20579,25 @@ "target": "com.amazonaws.ec2#CreateVpcResult" }, "traits": { - "smithy.api#documentation": "

Creates a VPC with the specified CIDR blocks. For more information, see\n\t VPC CIDR blocks in the Amazon Virtual Private Cloud User Guide.

\n

You can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided \n IPv6 CIDR block from Amazon's pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address \n pool that you provisioned through bring your own IP addresses (BYOIP).

\n

By default, each instance that you launch in the VPC has the default DHCP options, which\n\t\t\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\n\t\t\tinformation, see DHCP option sets in the Amazon Virtual Private Cloud User Guide.

\n

You can specify the instance tenancy value for the VPC when you create it. You can't change\n this value for the VPC after you create it. For more information, see Dedicated Instances in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a VPC with the specified CIDR blocks. For more information, see IP addressing for your VPCs and subnets in the \n Amazon VPC User Guide.

\n

You can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided \n IPv6 CIDR block from Amazon's pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address \n pool that you provisioned through bring your own IP addresses (BYOIP).

\n

By default, each instance that you launch in the VPC has the default DHCP options, which\n\t\t\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\n\t\t\tinformation, see DHCP option sets in the Amazon VPC User Guide.

\n

You can specify the instance tenancy value for the VPC when you create it. You can't change\n this value for the VPC after you create it. For more information, see Dedicated Instances in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a VPC", + "documentation": "This example creates a VPC with the specified CIDR block.", + "input": { + "CidrBlock": "10.0.0.0/16" + }, + "output": { + "Vpc": { + "InstanceTenancy": "default", + "State": "pending", + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.0.0/16", + "DhcpOptionsId": "dopt-7a8b9c2d" + } + } + } + ] } }, "com.amazonaws.ec2#CreateVpcEndpoint": { @@ -19940,7 +20609,7 @@ "target": "com.amazonaws.ec2#CreateVpcEndpointResult" }, "traits": { - "smithy.api#documentation": "

Creates a VPC endpoint for a specified service. An endpoint enables you to create a\n private connection between your VPC and the service. The service may be provided by Amazon Web Services,\n an Amazon Web Services Marketplace Partner, or another Amazon Web Services account. For more information, \n see the Amazon Web Services PrivateLink Guide.

" + "smithy.api#documentation": "

Creates a VPC endpoint. A VPC endpoint provides a private connection between the\n specified VPC and the specified endpoint service. You can use an endpoint service\n provided by Amazon Web Services, an Amazon Web Services Marketplace Partner, or another\n Amazon Web Services account. For more information, see the Amazon Web Services PrivateLink User Guide.

" } }, "com.amazonaws.ec2#CreateVpcEndpointConnectionNotification": { @@ -20050,7 +20719,7 @@ "target": "com.amazonaws.ec2#VpcId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of the VPC for the endpoint.

", + "smithy.api#documentation": "

The ID of the VPC.

", "smithy.api#required": {} } }, @@ -20058,7 +20727,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The service name.

", + "smithy.api#documentation": "

The name of the endpoint service.

", "smithy.api#required": {} } }, @@ -20078,14 +20747,14 @@ "SubnetIds": { "target": "com.amazonaws.ec2#VpcEndpointSubnetIdList", "traits": { - "smithy.api#documentation": "

(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create an endpoint\n network interface. For a Gateway Load Balancer endpoint, you can specify only one subnet.

", + "smithy.api#documentation": "

(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create endpoint\n network interfaces. For a Gateway Load Balancer endpoint, you can specify only one subnet.

", "smithy.api#xmlName": "SubnetId" } }, "SecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the\n endpoint network interface. If this parameter is not specified, we use the default \n security group for the VPC.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the\n endpoint network interfaces. If this parameter is not specified, we use the default \n security group for the VPC.

", "smithy.api#xmlName": "SecurityGroupId" } }, @@ -20121,6 +20790,13 @@ "smithy.api#documentation": "

The tags to associate with the endpoint.

", "smithy.api#xmlName": "TagSpecification" } + }, + "SubnetConfigurations": { + "target": "com.amazonaws.ec2#SubnetConfigurationsList", + "traits": { + "smithy.api#documentation": "

The subnet configurations for the endpoint.

", + "smithy.api#xmlName": "SubnetConfiguration" + } } }, "traits": { @@ -21311,7 +21987,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified customer gateway. You must delete the VPN connection before you\n can delete the customer gateway.

" + "smithy.api#documentation": "

Deletes the specified customer gateway. You must delete the VPN connection before you\n can delete the customer gateway.

", + "smithy.api#examples": [ + { + "title": "To delete a customer gateway", + "documentation": "This example deletes the specified customer gateway.", + "input": { + "CustomerGatewayId": "cgw-0e11f167" + } + } + ] } }, "com.amazonaws.ec2#DeleteCustomerGatewayRequest": { @@ -21350,7 +22035,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.

" + "smithy.api#documentation": "

Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.

", + "smithy.api#examples": [ + { + "title": "To delete a DHCP options set", + "documentation": "This example deletes the specified DHCP options set.", + "input": { + "DhcpOptionsId": "dopt-d9070ebb" + } + } + ] } }, "com.amazonaws.ec2#DeleteDhcpOptionsRequest": { @@ -21859,7 +22553,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified internet gateway. You must detach the internet gateway from the\n\t\t\tVPC before you can delete it.

" + "smithy.api#documentation": "

Deletes the specified internet gateway. You must detach the internet gateway from the\n\t\t\tVPC before you can delete it.

", + "smithy.api#examples": [ + { + "title": "To delete an Internet gateway", + "documentation": "This example deletes the specified Internet gateway.", + "input": { + "InternetGatewayId": "igw-c0a643a9" + } + } + ] } }, "com.amazonaws.ec2#DeleteInternetGatewayRequest": { @@ -22112,10 +22815,19 @@ "target": "com.amazonaws.ec2#DeleteKeyPairRequest" }, "output": { - "target": "smithy.api#Unit" + "target": "com.amazonaws.ec2#DeleteKeyPairResult" }, "traits": { - "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

" + "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

", + "smithy.api#examples": [ + { + "title": "To delete a key pair", + "documentation": "This example deletes the specified key pair.", + "input": { + "KeyName": "my-key-pair" + } + } + ] } }, "com.amazonaws.ec2#DeleteKeyPairRequest": { @@ -22148,6 +22860,32 @@ "smithy.api#input": {} } }, + "com.amazonaws.ec2#DeleteKeyPairResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", + "smithy.api#xmlName": "return" + } + }, + "KeyPairId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "KeyPairId", + "smithy.api#documentation": "

The ID of the key pair.

", + "smithy.api#xmlName": "keyPairId" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#DeleteLaunchTemplate": { "type": "operation", "input": { @@ -22157,7 +22895,26 @@ "target": "com.amazonaws.ec2#DeleteLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Deletes a launch template. Deleting a launch template deletes all of its\n versions.

" + "smithy.api#documentation": "

Deletes a launch template. Deleting a launch template deletes all of its\n versions.

", + "smithy.api#examples": [ + { + "title": "To delete a launch template", + "documentation": "This example deletes the specified launch template.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123" + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 2, + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "my-template", + "DefaultVersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-11-23T16:46:25.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#DeleteLaunchTemplateRequest": { @@ -22213,7 +22970,29 @@ "target": "com.amazonaws.ec2#DeleteLaunchTemplateVersionsResult" }, "traits": { - "smithy.api#documentation": "

Deletes one or more versions of a launch template. You cannot delete the default\n version of a launch template; you must first assign a different version as the default.\n If the default version is the only version for the launch template, you must delete the\n entire launch template using DeleteLaunchTemplate.

" + "smithy.api#documentation": "

Deletes one or more versions of a launch template.

\n

You can't delete the default version of a launch template; you must first assign a\n different version as the default. If the default version is the only version for the\n launch template, you must delete the entire launch template using DeleteLaunchTemplate.

\n

You can delete up to 200 launch template versions in a single request. To delete more\n than 200 versions in a single request, use DeleteLaunchTemplate, which\n deletes the launch template and all of its versions.

\n

For more information, see Delete a launch template version in the EC2 User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a launch template version", + "documentation": "This example deletes the specified launch template version.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "Versions": [ + "1" + ] + }, + "output": { + "SuccessfullyDeletedLaunchTemplateVersions": [ + { + "LaunchTemplateName": "my-template", + "VersionNumber": 1, + "LaunchTemplateId": "lt-0abcd290751193123" + } + ], + "UnsuccessfullyDeletedLaunchTemplateVersions": [] + } + } + ] } }, "com.amazonaws.ec2#DeleteLaunchTemplateVersionsRequest": { @@ -22243,7 +23022,7 @@ "target": "com.amazonaws.ec2#VersionStringList", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The version numbers of one or more launch template versions to delete.

", + "smithy.api#documentation": "

The version numbers of one or more launch template versions to delete. You can specify\n up to 200 launch template version numbers.

", "smithy.api#required": {}, "smithy.api#xmlName": "LaunchTemplateVersion" } @@ -22652,7 +23431,19 @@ "target": "com.amazonaws.ec2#DeleteNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \n but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \n routes in your route tables.

" + "smithy.api#documentation": "

Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \n but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \n routes in your route tables.

", + "smithy.api#examples": [ + { + "title": "To delete a NAT gateway", + "documentation": "This example deletes the specified NAT gateway.", + "input": { + "NatGatewayId": "nat-04ae55e711cec5680" + }, + "output": { + "NatGatewayId": "nat-04ae55e711cec5680" + } + } + ] } }, "com.amazonaws.ec2#DeleteNatGatewayRequest": { @@ -22705,7 +23496,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.

" + "smithy.api#documentation": "

Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.

", + "smithy.api#examples": [ + { + "title": "To delete a network ACL", + "documentation": "This example deletes the specified network ACL.", + "input": { + "NetworkAclId": "acl-5fb85d36" + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkAclEntry": { @@ -22717,7 +23517,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified ingress or egress entry (rule) from the specified network ACL.

" + "smithy.api#documentation": "

Deletes the specified ingress or egress entry (rule) from the specified network ACL.

", + "smithy.api#examples": [ + { + "title": "To delete a network ACL entry", + "documentation": "This example deletes ingress rule number 100 from the specified network ACL.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Egress": true + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkAclEntryRequest": { @@ -23015,7 +23826,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified network interface. You must detach the network interface before you can delete it.

" + "smithy.api#documentation": "

Deletes the specified network interface. You must detach the network interface before you can delete it.

", + "smithy.api#examples": [ + { + "title": "To delete a network interface", + "documentation": "This example deletes the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3" + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkInterfacePermission": { @@ -23120,7 +23940,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified placement group. You must terminate all instances in the\n placement group before you can delete the placement group. For more information, see\n Placement groups in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Deletes the specified placement group. You must terminate all instances in the\n placement group before you can delete the placement group. For more information, see\n Placement groups in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a placement group", + "documentation": "This example deletes the specified placement group.\n", + "input": { + "GroupName": "my-cluster" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeletePlacementGroupRequest": { @@ -23337,7 +24167,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified route from the specified route table.

" + "smithy.api#documentation": "

Deletes the specified route from the specified route table.

", + "smithy.api#examples": [ + { + "title": "To delete a route", + "documentation": "This example deletes the specified route from the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "0.0.0.0/0" + } + } + ] } }, "com.amazonaws.ec2#DeleteRouteRequest": { @@ -23399,7 +24239,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.

" + "smithy.api#documentation": "

Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.

", + "smithy.api#examples": [ + { + "title": "To delete a route table", + "documentation": "This example deletes the specified route table.", + "input": { + "RouteTableId": "rtb-22574640" + } + } + ] } }, "com.amazonaws.ec2#DeleteRouteTableRequest": { @@ -23439,7 +24288,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes a security group.

\n

If you attempt to delete a security group that is associated with an instance, or is\n\t\t\t referenced by another security group, the operation fails with\n\t\t\t\tInvalidGroup.InUse in EC2-Classic or\n\t\t\t\tDependencyViolation in EC2-VPC.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Deletes a security group.

\n

If you attempt to delete a security group that is associated with an instance or network interface or is\n\t\t\t referenced by another security group, the operation fails with\n\t\t\t\tDependencyViolation.

", + "smithy.api#examples": [ + { + "title": "To delete a security group", + "documentation": "This example deletes the specified security group.", + "input": { + "GroupId": "sg-903004f8" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteSecurityGroupRequest": { @@ -23448,13 +24307,13 @@ "GroupId": { "target": "com.amazonaws.ec2#SecurityGroupId", "traits": { - "smithy.api#documentation": "

The ID of the security group. Required for a nondefault VPC.

" + "smithy.api#documentation": "

The ID of the security group.

" } }, "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You can specify either the\n security group name or the security group ID. For security groups in a nondefault VPC,\n you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You can specify either the\n security group name or the security group ID. For security groups in a nondefault VPC,\n you must specify the security group ID.

" } }, "DryRun": { @@ -23481,7 +24340,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified snapshot.

\n

When you make periodic snapshots of a volume, the snapshots are incremental, and only the\n blocks on the device that have changed since your last snapshot are saved in the new snapshot.\n When you delete a snapshot, only the data not needed for any other snapshot is removed. So\n regardless of which prior snapshots have been deleted, all active snapshots will have access\n to all the information needed to restore the volume.

\n

You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\n You must first de-register the AMI before you can delete the snapshot.

\n

For more information, see Delete an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Deletes the specified snapshot.

\n

When you make periodic snapshots of a volume, the snapshots are incremental, and only the\n blocks on the device that have changed since your last snapshot are saved in the new snapshot.\n When you delete a snapshot, only the data not needed for any other snapshot is removed. So\n regardless of which prior snapshots have been deleted, all active snapshots will have access\n to all the information needed to restore the volume.

\n

You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\n You must first de-register the AMI before you can delete the snapshot.

\n

For more information, see Delete an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a snapshot", + "documentation": "This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteSnapshotRequest": { @@ -23519,7 +24388,13 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the data feed for Spot Instances.

" + "smithy.api#documentation": "

Deletes the data feed for Spot Instances.

", + "smithy.api#examples": [ + { + "title": "To cancel a Spot Instance data feed subscription", + "documentation": "This example deletes a Spot data feed subscription for the account." + } + ] } }, "com.amazonaws.ec2#DeleteSpotDatafeedSubscriptionRequest": { @@ -23550,7 +24425,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.

" + "smithy.api#documentation": "

Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.

", + "smithy.api#examples": [ + { + "title": "To delete a subnet", + "documentation": "This example deletes the specified subnet.", + "input": { + "SubnetId": "subnet-9d4a7b6c" + } + } + ] } }, "com.amazonaws.ec2#DeleteSubnetCidrReservation": { @@ -23640,7 +24524,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified set of tags from the specified set of resources.

\n

To list the current tags, use DescribeTags. For more information about\n tags, see Tag\n your Amazon EC2 resources in the Amazon Elastic Compute Cloud User\n Guide.

" + "smithy.api#documentation": "

Deletes the specified set of tags from the specified set of resources.

\n

To list the current tags, use DescribeTags. For more information about\n tags, see Tag\n your Amazon EC2 resources in the Amazon Elastic Compute Cloud User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a tag from a resource", + "documentation": "This example deletes the tag Stack=test from the specified image.", + "input": { + "Resources": [ + "ami-78a54011" + ], + "Tags": [ + { + "Key": "Stack", + "Value": "test" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DeleteTagsRequest": { @@ -24720,7 +25621,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified EBS volume. The volume must be in the available state\n (not attached to an instance).

\n

The volume can remain in the deleting state for several minutes.

\n

For more information, see Delete an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Deletes the specified EBS volume. The volume must be in the available state\n (not attached to an instance).

\n

The volume can remain in the deleting state for several minutes.

\n

For more information, see Delete an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a volume", + "documentation": "This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.", + "input": { + "VolumeId": "vol-049df61146c4d7901" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteVolumeRequest": { @@ -24758,7 +25669,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on.

" + "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on.

", + "smithy.api#examples": [ + { + "title": "To delete a VPC", + "documentation": "This example deletes the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#DeleteVpcEndpointConnectionNotifications": { @@ -25553,7 +26473,33 @@ "target": "com.amazonaws.ec2#DescribeAccountAttributesResult" }, "traits": { - "smithy.api#documentation": "

Describes attributes of your Amazon Web Services account. The following are the supported account attributes:

\n
    \n
  • \n

    \n supported-platforms: Indicates whether your account can launch instances\n into EC2-Classic and EC2-VPC, or only into EC2-VPC.

    \n
  • \n
  • \n

    \n default-vpc: The ID of the default VPC for your account, or\n none.

    \n
  • \n
  • \n

    \n max-instances: This attribute is no longer supported. The returned\n value does not reflect your actual vCPU limit for running On-Demand Instances.\n For more information, see On-Demand Instance Limits in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n vpc-max-security-groups-per-interface: The maximum number of security groups\n that you can assign to a network interface.

    \n
  • \n
  • \n

    \n max-elastic-ips: The maximum number of Elastic IP addresses that you can\n allocate for use with EC2-Classic.

    \n
  • \n
  • \n

    \n vpc-max-elastic-ips: The maximum number of Elastic IP addresses that you can\n allocate for use with EC2-VPC.

    \n
  • \n
\n \n

We are retiring EC2-Classic on August 15, 2022. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon EC2 User Guide.

\n
" + "smithy.api#documentation": "

Describes attributes of your Amazon Web Services account. The following are the supported account attributes:

\n
    \n
  • \n

    \n default-vpc: The ID of the default VPC for your account, or none.

    \n
  • \n
  • \n

    \n max-instances: This attribute is no longer supported. The returned\n value does not reflect your actual vCPU limit for running On-Demand Instances.\n For more information, see On-Demand Instance Limits in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n max-elastic-ips: The maximum number of Elastic IP addresses that you can allocate.

    \n
  • \n
  • \n

    \n supported-platforms: This attribute is deprecated.

    \n
  • \n
  • \n

    \n vpc-max-elastic-ips: The maximum number of Elastic IP addresses that you can allocate.

    \n
  • \n
  • \n

    \n vpc-max-security-groups-per-interface: The maximum number of security groups\n that you can assign to a network interface.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To describe a single attribute for your AWS account", + "documentation": "This example describes the supported-platforms attribute for your AWS account.", + "input": { + "AttributeNames": [ + "supported-platforms" + ] + }, + "output": { + "AccountAttributes": [ + { + "AttributeName": "supported-platforms", + "AttributeValues": [ + { + "AttributeValue": "EC2" + }, + { + "AttributeValue": "VPC" + } + ] + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAccountAttributesRequest": { @@ -25696,7 +26642,32 @@ "target": "com.amazonaws.ec2#DescribeAddressesResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified Elastic IP addresses or all of your Elastic IP addresses.

" + "smithy.api#documentation": "

Describes the specified Elastic IP addresses or all of your Elastic IP addresses.

", + "smithy.api#examples": [ + { + "title": "To describe your Elastic IP addresses", + "documentation": "This example describes your Elastic IP addresses.", + "output": { + "Addresses": [ + { + "InstanceId": "i-1234567890abcdef0", + "PublicIp": "198.51.100.0", + "Domain": "standard" + }, + { + "Domain": "vpc", + "InstanceId": "i-1234567890abcdef0", + "NetworkInterfaceId": "eni-12345678", + "AssociationId": "eipassoc-12345678", + "NetworkInterfaceOwnerId": "123456789012", + "PublicIp": "203.0.113.0", + "AllocationId": "eipalloc-12345678", + "PrivateIpAddress": "10.0.1.241" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAddressesAttribute": { @@ -25902,7 +26873,41 @@ "target": "com.amazonaws.ec2#DescribeAvailabilityZonesResult" }, "traits": { - "smithy.api#documentation": "

Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\n you. If there is an event impacting a zone, you can use this request to view the state and any\n provided messages for that zone.

\n

For more information about Availability Zones, Local Zones, and Wavelength Zones, see\n Regions and zones \n in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\n you. If there is an event impacting a zone, you can use this request to view the state and any\n provided messages for that zone.

\n

For more information about Availability Zones, Local Zones, and Wavelength Zones, see\n Regions and zones \n in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe your Availability Zones", + "documentation": "This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.", + "output": { + "AvailabilityZones": [ + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1b" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1c" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1d" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1e" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAvailabilityZonesRequest": { @@ -26504,7 +27509,7 @@ "target": "com.amazonaws.ec2#DescribeClassicLinkInstancesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your linked EC2-Classic instances. This request only returns\n\t\t\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\n\t\t\tuse this request to return information about other instances.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
", + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes one or more of your linked EC2-Classic instances. This request only returns\n\t\t\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\n\t\t\tuse this request to return information about other instances.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -26529,7 +27534,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n group-id - The ID of a VPC security group that's associated with the instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC to which the instance is\n\t\t\t\t\tlinked.

    \n

    \n vpc-id - The ID of the VPC that the instance is linked to.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n group-id - The ID of a VPC security group that's associated with the instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC to which the instance is linked.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -26546,7 +27551,7 @@ "InstanceIds": { "target": "com.amazonaws.ec2#InstanceIdStringList", "traits": { - "smithy.api#documentation": "

One or more instance IDs. Must be instances linked to a VPC through ClassicLink.

", + "smithy.api#documentation": "

The instance IDs. Must be instances linked to a VPC through ClassicLink.

", "smithy.api#xmlName": "InstanceId" } }, @@ -27313,6 +28318,28 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your VPN customer gateways.

\n

For more information, see Amazon Web Services Site-to-Site VPN in the Amazon Web Services Site-to-Site VPN\n User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a customer gateway", + "documentation": "This example describes the specified customer gateway.", + "input": { + "CustomerGatewayIds": [ + "cgw-0e11f167" + ] + }, + "output": { + "CustomerGateways": [ + { + "CustomerGatewayId": "cgw-0e11f167", + "IpAddress": "12.1.2.3", + "State": "available", + "Type": "ipsec.1", + "BgpAsn": "65534" + } + ] + } + } + ], "smithy.waiters#waitable": { "CustomerGatewayAvailable": { "acceptors": [ @@ -27411,7 +28438,38 @@ "target": "com.amazonaws.ec2#DescribeDhcpOptionsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your DHCP options sets.

\n

For more information, see DHCP options sets in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your DHCP options sets.

\n

For more information, see DHCP options sets in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a DHCP options set", + "documentation": "This example describes the specified DHCP options set.", + "input": { + "DhcpOptionsIds": [ + "dopt-d9070ebb" + ] + }, + "output": { + "DhcpOptions": [ + { + "DhcpConfigurations": [ + { + "Values": [ + { + "Value": "10.2.5.2" + }, + { + "Value": "10.2.5.1" + } + ], + "Key": "domain-name-servers" + } + ], + "DhcpOptionsId": "dopt-d9070ebb" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -27443,7 +28501,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n dhcp-options-id - The ID of a DHCP options set.

    \n
  • \n
  • \n

    \n key - The key for one of the options (for example, domain-name).

    \n
  • \n
  • \n

    \n value - The value for one of the options.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the DHCP options set.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n dhcp-options-id - The ID of a DHCP options set.

    \n
  • \n
  • \n

    \n key - The key for one of the options (for example, domain-name).

    \n
  • \n
  • \n

    \n value - The value for one of the options.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the DHCP options set.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -27542,7 +28600,7 @@ "EgressOnlyInternetGatewayIds": { "target": "com.amazonaws.ec2#EgressOnlyInternetGatewayIdList", "traits": { - "smithy.api#documentation": "

One or more egress-only internet gateway IDs.

", + "smithy.api#documentation": "

The IDs of the egress-only internet gateways.

", "smithy.api#xmlName": "EgressOnlyInternetGatewayId" } }, @@ -27563,7 +28621,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } } @@ -29163,6 +30221,30 @@ }, "traits": { "smithy.api#documentation": "

Describes your IAM instance profile associations.

", + "smithy.api#examples": [ + { + "title": "To describe an IAM instance profile association", + "documentation": "This example describes the specified IAM instance profile association.", + "input": { + "AssociationIds": [ + "iip-assoc-0db249b1f25fa24b8" + ] + }, + "output": { + "IamInstanceProfileAssociations": [ + { + "InstanceId": "i-09eb09efa73ec1dee", + "State": "associated", + "AssociationId": "iip-assoc-0db249b1f25fa24b8", + "IamInstanceProfile": { + "Id": "AIPAJVQN4F5WVLGCJDRGM", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -29346,7 +30428,25 @@ "target": "com.amazonaws.ec2#ImageAttribute" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified AMI. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified AMI. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the launch permissions for an AMI", + "documentation": "This example describes the launch permissions for the specified AMI.", + "input": { + "Attribute": "launchPermission", + "ImageId": "ami-5731123e" + }, + "output": { + "ImageId": "ami-5731123e", + "LaunchPermissions": [ + { + "UserId": "123456789012" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeImageAttributeRequest": { @@ -29394,6 +30494,48 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified images (AMIs, AKIs, and ARIs) available to you or all of the images available to you.

\n

The images available to you include public images, private images that you own, and private images owned by other \n Amazon Web Services accounts for which you have explicit launch permissions.

\n

Recently deregistered images appear in the returned results for a short interval and then\n return empty results. After all instances that reference a deregistered AMI are terminated,\n specifying the ID of the image will eventually return an error indicating that the AMI ID\n cannot be found.

", + "smithy.api#examples": [ + { + "title": "To describe an AMI", + "documentation": "This example describes the specified AMI.", + "input": { + "ImageIds": [ + "ami-5731123e" + ] + }, + "output": { + "Images": [ + { + "VirtualizationType": "paravirtual", + "Name": "My server", + "Hypervisor": "xen", + "ImageId": "ami-5731123e", + "RootDeviceType": "ebs", + "State": "available", + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sda1", + "Ebs": { + "DeleteOnTermination": true, + "SnapshotId": "snap-1234567890abcdef0", + "VolumeSize": 8, + "VolumeType": "standard" + } + } + ], + "Architecture": "x86_64", + "ImageLocation": "123456789012/My server", + "KernelId": "aki-88aa75e1", + "OwnerId": "123456789012", + "RootDeviceName": "/dev/sda1", + "Public": false, + "ImageType": "machine", + "Description": "An AMI for my server" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -29466,7 +30608,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 | x86_64 | \n arm64 | x86_64_mac | arm64_mac).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -29753,7 +30895,23 @@ "target": "com.amazonaws.ec2#InstanceAttribute" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified instance. You can specify only one\n attribute at a time. Valid attribute values are: instanceType |\n kernel | ramdisk | userData |\n disableApiTermination | instanceInitiatedShutdownBehavior\n | rootDeviceName | blockDeviceMapping |\n productCodes | sourceDestCheck | groupSet |\n ebsOptimized | sriovNetSupport\n

" + "smithy.api#documentation": "

Describes the specified attribute of the specified instance. You can specify only one\n attribute at a time. Valid attribute values are: instanceType |\n kernel | ramdisk | userData |\n disableApiTermination | instanceInitiatedShutdownBehavior\n | rootDeviceName | blockDeviceMapping |\n productCodes | sourceDestCheck | groupSet |\n ebsOptimized | sriovNetSupport\n

", + "smithy.api#examples": [ + { + "title": "To describe the instance type", + "documentation": "This example describes the instance type of the specified instance.\n", + "input": { + "InstanceId": "i-1234567890abcdef0", + "Attribute": "instanceType" + }, + "output": { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": { + "Value": "t1.micro" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeInstanceAttributeRequest": { @@ -30117,6 +31275,47 @@ }, "traits": { "smithy.api#documentation": "

Describes the status of the specified instances or all of your instances. By default,\n only running instances are described, unless you specifically indicate to return the\n status of all instances.

\n

Instance status includes the following components:

\n
    \n
  • \n

    \n Status checks - Amazon EC2 performs status\n checks on running EC2 instances to identify hardware and software issues. For\n more information, see Status checks for your instances and Troubleshoot\n instances with failed status checks in the Amazon EC2 User\n Guide.

    \n
  • \n
  • \n

    \n Scheduled events - Amazon EC2 can schedule\n events (such as reboot, stop, or terminate) for your instances related to\n hardware issues, software updates, or system maintenance. For more information,\n see Scheduled events for your instances in the Amazon EC2 User\n Guide.

    \n
  • \n
  • \n

    \n Instance state - You can manage your instances\n from the moment you launch them through their termination. For more information,\n see Instance\n lifecycle in the Amazon EC2 User Guide.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To describe the status of an instance", + "documentation": "This example describes the current status of the specified instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "InstanceStatuses": [ + { + "InstanceId": "i-1234567890abcdef0", + "InstanceState": { + "Code": 16, + "Name": "running" + }, + "AvailabilityZone": "us-east-1d", + "SystemStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "reachability" + } + ] + }, + "InstanceStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "reachability" + } + ] + } + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30368,7 +31567,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters. Filter names and values are case-sensitive.

\n
    \n
  • \n

    \n auto-recovery-supported - Indicates whether Amazon CloudWatch action based recovery is supported (true | false).

    \n
  • \n
  • \n

    \n bare-metal - Indicates whether it is a bare metal instance type (true | false).

    \n
  • \n
  • \n

    \n burstable-performance-supported - Indicates whether it is a burstable\n performance instance type (true | false).

    \n
  • \n
  • \n

    \n current-generation - Indicates whether this instance type is the latest\n generation instance type of an instance family (true | false).

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps - The baseline\n bandwidth performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-iops - The baseline input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-throughput-in-mbps - The baseline\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps - The maximum bandwidth\n performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-iops - The maximum input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-throughput-in-mbps - The maximum\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-support - Indicates whether the instance type is\n EBS-optimized (supported | unsupported |\n default).

    \n
  • \n
  • \n

    \n ebs-info.encryption-support - Indicates whether EBS encryption is supported\n (supported | unsupported).

    \n
  • \n
  • \n

    \n ebs-info.nvme-support - Indicates whether non-volatile memory express (NVMe)\n is supported for EBS volumes (required | supported | unsupported).

    \n
  • \n
  • \n

    \n free-tier-eligible - Indicates whether the instance type is eligible to use\n in the free tier (true | false).

    \n
  • \n
  • \n

    \n hibernation-supported - Indicates whether On-Demand hibernation is supported (true | false).

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor (nitro | xen).

    \n
  • \n
  • \n

    \n instance-storage-info.disk.count - The number of local disks.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.size-in-gb - The storage size of each instance storage disk, in\n GB.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.type - The storage technology for the local\n instance storage disks (hdd | ssd).

    \n
  • \n
  • \n

    \n instance-storage-info.encryption-support - Indicates whether data is encrypted at rest \n (required | supported | unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.nvme-support - Indicates whether non-volatile memory\n express (NVMe) is supported for instance store (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.total-size-in-gb - The total amount of storage available from all local\n instance storage, in GB.

    \n
  • \n
  • \n

    \n instance-storage-supported - Indicates whether the instance type has local\n instance storage (true | false).

    \n
  • \n
  • \n

    \n instance-type - The instance type (for example c5.2xlarge or\n c5*).

    \n
  • \n
  • \n

    \n memory-info.size-in-mib - The memory size.

    \n
  • \n
  • \n

    \n network-info.efa-info.maximum-efa-interfaces - The maximum number of Elastic \n Fabric Adapters (EFAs) per instance.

    \n
  • \n
  • \n

    \n network-info.efa-supported - Indicates whether the instance type supports\n Elastic Fabric Adapter (EFA) (true | false).

    \n
  • \n
  • \n

    \n network-info.ena-support - Indicates whether Elastic Network Adapter (ENA) is\n supported or required (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n network-info.encryption-in-transit-supported - Indicates whether the instance type \n automatically encrypts in-transit traffic between instances (true | false).

    \n
  • \n
  • \n

    \n network-info.ipv4-addresses-per-interface - The maximum number of private IPv4 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-addresses-per-interface - The maximum number of private IPv6 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-supported - Indicates whether the instance type supports IPv6 (true | false).

    \n
  • \n
  • \n

    \n network-info.maximum-network-cards - The maximum number of network cards per\n instance.

    \n
  • \n
  • \n

    \n network-info.maximum-network-interfaces - The maximum number of network interfaces per instance.

    \n
  • \n
  • \n

    \n network-info.network-performance - The network performance (for example, \"25\n Gigabit\").

    \n
  • \n
  • \n

    \n processor-info.supported-architecture - The CPU architecture\n (arm64 | i386 | x86_64).

    \n
  • \n
  • \n

    \n processor-info.sustained-clock-speed-in-ghz - The CPU clock speed, in GHz.

    \n
  • \n
  • \n

    \n supported-boot-mode - The boot mode (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n supported-root-device-type - The root device type (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n supported-usage-class - The usage class (on-demand |\n spot).

    \n
  • \n
  • \n

    \n supported-virtualization-type - The virtualization type (hvm |\n paravirtual).

    \n
  • \n
  • \n

    \n vcpu-info.default-cores - The default number of cores for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.default-threads-per-core - The default number of threads per core for the instance\n type.

    \n
  • \n
  • \n

    \n vcpu-info.default-vcpus - The default number of vCPUs for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-cores - The number of cores that can be configured for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-threads-per-core - The number of threads per core that can be configured for the instance type.\n For example, \"1\" or \"1,2\".

    \n
  • \n
", + "smithy.api#documentation": "

One or more filters. Filter names and values are case-sensitive.

\n
    \n
  • \n

    \n auto-recovery-supported - Indicates whether Amazon CloudWatch action based recovery is supported (true | false).

    \n
  • \n
  • \n

    \n bare-metal - Indicates whether it is a bare metal instance type (true | false).

    \n
  • \n
  • \n

    \n burstable-performance-supported - Indicates whether the instance type is a \n burstable performance T instance type (true | false).

    \n
  • \n
  • \n

    \n current-generation - Indicates whether this instance type is the latest\n generation instance type of an instance family (true | false).

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps - The baseline\n bandwidth performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-iops - The baseline input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-throughput-in-mbps - The baseline\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps - The maximum bandwidth\n performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-iops - The maximum input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-throughput-in-mbps - The maximum\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-support - Indicates whether the instance type is\n EBS-optimized (supported | unsupported |\n default).

    \n
  • \n
  • \n

    \n ebs-info.encryption-support - Indicates whether EBS encryption is supported\n (supported | unsupported).

    \n
  • \n
  • \n

    \n ebs-info.nvme-support - Indicates whether non-volatile memory express (NVMe)\n is supported for EBS volumes (required | supported | unsupported).

    \n
  • \n
  • \n

    \n free-tier-eligible - Indicates whether the instance type is eligible to use\n in the free tier (true | false).

    \n
  • \n
  • \n

    \n hibernation-supported - Indicates whether On-Demand hibernation is supported (true | false).

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor (nitro | xen).

    \n
  • \n
  • \n

    \n instance-storage-info.disk.count - The number of local disks.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.size-in-gb - The storage size of each instance storage disk, in\n GB.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.type - The storage technology for the local\n instance storage disks (hdd | ssd).

    \n
  • \n
  • \n

    \n instance-storage-info.encryption-support - Indicates whether data is encrypted at rest \n (required | supported | unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.nvme-support - Indicates whether non-volatile memory\n express (NVMe) is supported for instance store (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.total-size-in-gb - The total amount of storage available from all local\n instance storage, in GB.

    \n
  • \n
  • \n

    \n instance-storage-supported - Indicates whether the instance type has local\n instance storage (true | false).

    \n
  • \n
  • \n

    \n instance-type - The instance type (for example c5.2xlarge or\n c5*).

    \n
  • \n
  • \n

    \n memory-info.size-in-mib - The memory size.

    \n
  • \n
  • \n

    \n network-info.efa-info.maximum-efa-interfaces - The maximum number of Elastic \n Fabric Adapters (EFAs) per instance.

    \n
  • \n
  • \n

    \n network-info.efa-supported - Indicates whether the instance type supports\n Elastic Fabric Adapter (EFA) (true | false).

    \n
  • \n
  • \n

    \n network-info.ena-support - Indicates whether Elastic Network Adapter (ENA) is\n supported or required (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n network-info.encryption-in-transit-supported - Indicates whether the instance type \n automatically encrypts in-transit traffic between instances (true | false).

    \n
  • \n
  • \n

    \n network-info.ipv4-addresses-per-interface - The maximum number of private IPv4 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-addresses-per-interface - The maximum number of private IPv6 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-supported - Indicates whether the instance type supports IPv6 (true | false).

    \n
  • \n
  • \n

    \n network-info.maximum-network-cards - The maximum number of network cards per\n instance.

    \n
  • \n
  • \n

    \n network-info.maximum-network-interfaces - The maximum number of network interfaces per instance.

    \n
  • \n
  • \n

    \n network-info.network-performance - The network performance (for example, \"25\n Gigabit\").

    \n
  • \n
  • \n

    \n nitro-enclaves-support - Indicates whether Nitro Enclaves is supported (supported |\n unsupported).

    \n
  • \n
  • \n

    \n nitro-tpm-support - Indicates whether NitroTPM is supported (supported |\n unsupported).

    \n
  • \n
  • \n

    \n nitro-tpm-info.supported-versions - The supported NitroTPM version (2.0).

    \n
  • \n
  • \n

    \n processor-info.supported-architecture - The CPU architecture\n (arm64 | i386 | x86_64).

    \n
  • \n
  • \n

    \n processor-info.sustained-clock-speed-in-ghz - The CPU clock speed, in GHz.

    \n
  • \n
  • \n

    \n processor-info.supported-features - The supported CPU features (amd-sev-snp).

    \n
  • \n
  • \n

    \n supported-boot-mode - The boot mode (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n supported-root-device-type - The root device type (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n supported-usage-class - The usage class (on-demand |\n spot).

    \n
  • \n
  • \n

    \n supported-virtualization-type - The virtualization type (hvm |\n paravirtual).

    \n
  • \n
  • \n

    \n vcpu-info.default-cores - The default number of cores for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.default-threads-per-core - The default number of threads per core for the instance\n type.

    \n
  • \n
  • \n

    \n vcpu-info.default-vcpus - The default number of vCPUs for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-cores - The number of cores that can be configured for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-threads-per-core - The number of threads per core that can be configured for the instance type.\n For example, \"1\" or \"1,2\".

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30423,6 +31622,18 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified instances or all instances.

\n

If you specify instance IDs, the output includes information for only the specified\n instances. If you specify filters, the output includes information for only those\n instances that meet the filter criteria. If you do not specify instance IDs or filters,\n the output includes information for all instances, which can affect performance. We\n recommend that you use pagination to ensure that the operation returns quickly and\n successfully.

\n

If you specify an instance ID that is not valid, an error is returned. If you specify\n an instance that you do not own, it is not included in the output.

\n

Recently terminated instances might appear in the returned results. This interval is\n usually less than one hour.

\n

If you describe instances in the rare case where an Availability Zone is experiencing\n a service disruption and you specify instance IDs that are in the affected zone, or do\n not specify any instance IDs at all, the call fails. If you describe instances and\n specify only instance IDs that are in an unaffected zone, the call works\n normally.

", + "smithy.api#examples": [ + { + "title": "To describe an Amazon EC2 instance", + "documentation": "This example describes the specified instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": {} + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30584,7 +31795,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2010-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the\n block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you launched\n the instance.

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay |\n marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in\n the block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n boot-mode - The boot mode that was specified by the AMI\n (legacy-bios | uefi |\n uefi-preferred).

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-preference\n - The instance's Capacity Reservation preference (open | none).

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id\n - The ID of the targeted Capacity Reservation.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn\n - The ARN of the targeted Capacity Reservation group.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you\n launched the instance.

    \n
  • \n
  • \n

    \n current-instance-boot-mode - The boot mode that is used to launch\n the instance at launch or start (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n ebs-optimized - A Boolean that indicates whether the instance is\n optimized for Amazon EBS I/O.

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether the instance is\n enabled for enhanced networking with ENA.

    \n
  • \n
  • \n

    \n enclave-options.enabled - A Boolean that indicates whether the\n instance is enabled for Amazon Web Services Nitro Enclaves.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n iam-instance-profile.id - The instance profile associated with\n the instance. Specified as an ID.

    \n
  • \n
  • \n

    \n iam-instance-profile.name - The instance profile associated with\n the instance. Specified as an name.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n ipv6-address - The IPv6 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n license-pool -

    \n
  • \n
  • \n

    \n maintenance-options.auto-recovery - The current automatic\n recovery behavior of the instance (disabled | default).

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv4 - Indicates whether the IPv4\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv6 - Indicates whether the IPv6\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.state - The state of the metadata option changes\n (pending | applied).

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n platform-details - The platform (Linux/UNIX |\n Red Hat BYOL Linux | Red Hat Enterprise Linux |\n Red Hat Enterprise Linux with HA | Red Hat Enterprise\n Linux with SQL Server Standard and HA | Red Hat Enterprise\n Linux with SQL Server Enterprise and HA | Red Hat Enterprise\n Linux with SQL Server Standard | Red Hat Enterprise Linux with\n SQL Server Web | Red Hat Enterprise Linux with SQL Server\n Enterprise | SQL Server Enterprise | SQL Server\n Standard | SQL Server Web | SUSE Linux |\n Ubuntu Pro | Windows | Windows BYOL |\n Windows with SQL Server Enterprise | Windows with SQL\n Server Standard | Windows with SQL Server Web).

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-a-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS A records.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-aaaa-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS AAAA records.

    \n
  • \n
  • \n

    \n private-dns-name-options.hostname-type - The type of hostname\n (ip-name | resource-name).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay\n | marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n tpm-support - Indicates if the instance is configured for\n NitroTPM support (v2.0).

    \n
  • \n
  • \n

    \n usage-operation - The usage operation value for the instance\n (RunInstances | RunInstances:00g0 |\n RunInstances:0010 | RunInstances:1010 |\n RunInstances:1014 | RunInstances:1110 |\n RunInstances:0014 | RunInstances:0210 |\n RunInstances:0110 | RunInstances:0100 |\n RunInstances:0004 | RunInstances:0200 |\n RunInstances:000g | RunInstances:0g00 |\n RunInstances:0002 | RunInstances:0800 |\n RunInstances:0102 | RunInstances:0006 |\n RunInstances:0202).

    \n
  • \n
  • \n

    \n usage-operation-update-time - The time that the usage operation\n was last updated, for example, 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30662,6 +31873,36 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your internet gateways.

", + "smithy.api#examples": [ + { + "title": "To describe the Internet gateway for a VPC", + "documentation": "This example describes the Internet gateway for the specified VPC.", + "input": { + "Filters": [ + { + "Name": "attachment.vpc-id", + "Values": [ + "vpc-a01106c2" + ] + } + ] + }, + "output": { + "InternetGateways": [ + { + "Tags": [], + "InternetGatewayId": "igw-c0a643a9", + "Attachments": [ + { + "State": "attached", + "VpcId": "vpc-a01106c2" + } + ] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30712,7 +31953,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n attachment.state - The current state of the attachment between the gateway\n and the VPC (available). Present only if a VPC is attached.

    \n
  • \n
  • \n

    \n attachment.vpc-id - The ID of an attached VPC.

    \n
  • \n
  • \n

    \n internet-gateway-id - The ID of the Internet gateway.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the internet gateway.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n attachment.state - The current state of the attachment between the gateway\n and the VPC (available). Present only if a VPC is attached.

    \n
  • \n
  • \n

    \n attachment.vpc-id - The ID of an attached VPC.

    \n
  • \n
  • \n

    \n internet-gateway-id - The ID of the Internet gateway.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the internet gateway.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30730,7 +31971,7 @@ "target": "com.amazonaws.ec2#InternetGatewayIdList", "traits": { "aws.protocols#ec2QueryName": "InternetGatewayId", - "smithy.api#documentation": "

One or more internet gateway IDs.

\n

Default: Describes all your internet gateways.

", + "smithy.api#documentation": "

The IDs of the internet gateways.

\n

Default: Describes all your internet gateways.

", "smithy.api#xmlName": "internetGatewayId" } }, @@ -31303,6 +32544,25 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified key pairs or all of your key pairs.

\n

For more information about key pairs, see Amazon EC2 key pairs \n\t\t\t\tin the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To display a key pair", + "documentation": "This example displays the fingerprint for the specified key.", + "input": { + "KeyNames": [ + "my-key-pair" + ] + }, + "output": { + "KeyPairs": [ + { + "KeyName": "my-key-pair", + "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f" + } + ] + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -31404,6 +32664,66 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more versions of a specified launch template. You can describe all\n versions, individual versions, or a range of versions. You can also describe all the\n latest versions or all the default versions of all the launch templates in your\n account.

", + "smithy.api#examples": [ + { + "title": "To describe the versions for a launch template", + "documentation": "This example describes the versions for the specified launch template.", + "input": { + "LaunchTemplateId": "068f72b72934aff71" + }, + "output": { + "LaunchTemplateVersions": [ + { + "LaunchTemplateId": "lt-068f72b72934aff71", + "LaunchTemplateName": "Webservers", + "VersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789102:root", + "LaunchTemplateData": { + "KeyName": "kp-us-east", + "ImageId": "ami-6057e21a", + "InstanceType": "t2.medium", + "NetworkInterfaces": [ + { + "SubnetId": "subnet-1a2b3c4d", + "DeviceIndex": 0, + "Groups": [ + "sg-7c227019" + ] + } + ] + }, + "DefaultVersion": false, + "CreateTime": "2017-11-20T13:12:32.000Z" + }, + { + "LaunchTemplateId": "lt-068f72b72934aff71", + "LaunchTemplateName": "Webservers", + "VersionNumber": 1, + "CreatedBy": "arn:aws:iam::123456789102:root", + "LaunchTemplateData": { + "UserData": "", + "KeyName": "kp-us-east", + "ImageId": "ami-aabbcc11", + "InstanceType": "t2.medium", + "NetworkInterfaces": [ + { + "SubnetId": "subnet-7b16de0c", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "Groups": [ + "sg-7c227019" + ], + "AssociatePublicIpAddress": true + } + ] + }, + "DefaultVersion": true, + "CreateTime": "2017-11-20T12:52:33.000Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -31522,6 +32842,29 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more launch templates.

", + "smithy.api#examples": [ + { + "title": "To describe a launch template", + "documentation": "This example describes the specified launch template.", + "input": { + "LaunchTemplateIds": [ + "lt-01238c059e3466abc" + ] + }, + "output": { + "LaunchTemplates": [ + { + "LatestVersionNumber": 1, + "LaunchTemplateName": "my-template", + "LaunchTemplateId": "lt-01238c059e3466abc", + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2018-01-16T04:32:57.000Z", + "DefaultVersionNumber": 1 + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32227,6 +33570,20 @@ }, "traits": { "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes your Elastic IP addresses that are being moved from or being restored to the EC2-Classic platform. \n This request does not return information about any other Elastic IP addresses in your account.

", + "smithy.api#examples": [ + { + "title": "To describe your moving addresses", + "documentation": "This example describes all of your moving Elastic IP addresses.", + "output": { + "MovingAddressStatuses": [ + { + "PublicIp": "198.51.100.0", + "MoveStatus": "movingToVpc" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32331,6 +33688,41 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your NAT gateways.

", + "smithy.api#examples": [ + { + "title": "To describe a NAT gateway", + "documentation": "This example describes the NAT gateway for the specified VPC.", + "input": { + "Filter": [ + { + "Name": "vpc-id", + "Values": [ + "vpc-1a2b3c4d" + ] + } + ] + }, + "output": { + "NatGateways": [ + { + "NatGatewayAddresses": [ + { + "PublicIp": "198.11.222.333", + "NetworkInterfaceId": "eni-9dec76cd", + "AllocationId": "eipalloc-89c620ec", + "PrivateIp": "10.0.0.149" + } + ], + "VpcId": "vpc-1a2b3c4d", + "State": "available", + "NatGatewayId": "nat-05dba92075d71c408", + "SubnetId": "subnet-847e4dc2", + "CreateTime": "2015-12-01T12:26:55.983Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32440,7 +33832,7 @@ "Filter": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n nat-gateway-id - The ID of the NAT gateway.

    \n
  • \n
  • \n

    \n state - The state of the NAT gateway (pending |\n failed | available | deleting | deleted).

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet in which the NAT gateway resides.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC in which the NAT gateway resides.

    \n
  • \n
" + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n nat-gateway-id - The ID of the NAT gateway.

    \n
  • \n
  • \n

    \n state - The state of the NAT gateway (pending |\n failed | available | deleting | deleted).

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet in which the NAT gateway resides.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC in which the NAT gateway resides.

    \n
  • \n
" } }, "MaxResults": { @@ -32454,7 +33846,7 @@ "NatGatewayIds": { "target": "com.amazonaws.ec2#NatGatewayIdStringList", "traits": { - "smithy.api#documentation": "

One or more NAT gateway IDs.

", + "smithy.api#documentation": "

The IDs of the NAT gateways.

", "smithy.api#xmlName": "NatGatewayId" } }, @@ -32502,7 +33894,51 @@ "target": "com.amazonaws.ec2#DescribeNetworkAclsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your network ACLs.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your network ACLs.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a network ACL", + "documentation": "This example describes the specified network ACL.", + "input": { + "NetworkAclIds": [ + "acl-5fb85d36" + ] + }, + "output": { + "NetworkAcls": [ + { + "Associations": [ + { + "SubnetId": "subnet-65ea5f08", + "NetworkAclId": "acl-9aeb5ef7", + "NetworkAclAssociationId": "aclassoc-66ea5f0b" + } + ], + "NetworkAclId": "acl-5fb85d36", + "VpcId": "vpc-a01106c2", + "Tags": [], + "Entries": [ + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": true, + "RuleAction": "deny" + }, + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": false, + "RuleAction": "deny" + } + ], + "IsDefault": false + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32527,7 +33963,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.association-id - The ID of an association ID for the ACL.

    \n
  • \n
  • \n

    \n association.network-acl-id - The ID of the network ACL involved in the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the association.

    \n
  • \n
  • \n

    \n default - Indicates whether the ACL is the default network ACL for the VPC.

    \n
  • \n
  • \n

    \n entry.cidr - The IPv4 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.icmp.code - The ICMP code specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.icmp.type - The ICMP type specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.from - The start of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.to - The end of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.protocol - The protocol specified in the entry (tcp | udp | icmp or a protocol number).

    \n
  • \n
  • \n

    \n entry.rule-action - Allows or denies the matching traffic (allow | deny).

    \n
  • \n
  • \n

    \n entry.egress - A Boolean that indicates the type of rule. Specify true \n\t\t for egress rules, or false for ingress rules.

    \n
  • \n
  • \n

    \n entry.rule-number - The number of an entry (in other words, rule) in\n the set of ACL entries.

    \n
  • \n
  • \n

    \n network-acl-id - The ID of the network ACL.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the network ACL.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network ACL.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n association.association-id - The ID of an association ID for the ACL.

    \n
  • \n
  • \n

    \n association.network-acl-id - The ID of the network ACL involved in the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the association.

    \n
  • \n
  • \n

    \n default - Indicates whether the ACL is the default network ACL for the VPC.

    \n
  • \n
  • \n

    \n entry.cidr - The IPv4 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.icmp.code - The ICMP code specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.icmp.type - The ICMP type specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.from - The start of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.to - The end of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.protocol - The protocol specified in the entry (tcp | udp | icmp or a protocol number).

    \n
  • \n
  • \n

    \n entry.rule-action - Allows or denies the matching traffic (allow | deny).

    \n
  • \n
  • \n

    \n entry.egress - A Boolean that indicates the type of rule. Specify true \n\t\t for egress rules, or false for ingress rules.

    \n
  • \n
  • \n

    \n entry.rule-number - The number of an entry (in other words, rule) in\n the set of ACL entries.

    \n
  • \n
  • \n

    \n network-acl-id - The ID of the network ACL.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the network ACL.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network ACL.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -32544,7 +33980,7 @@ "NetworkAclIds": { "target": "com.amazonaws.ec2#NetworkAclIdStringList", "traits": { - "smithy.api#documentation": "

One or more network ACL IDs.

\n

Default: Describes all your network ACLs.

", + "smithy.api#documentation": "

The IDs of the network ACLs.

\n

Default: Describes all your network ACLs.

", "smithy.api#xmlName": "NetworkAclId" } }, @@ -32980,7 +34416,29 @@ "target": "com.amazonaws.ec2#DescribeNetworkInterfaceAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes a network interface attribute. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes a network interface attribute. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the attachment attribute of a network interface", + "documentation": "This example describes the attachment attribute of the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-686ea200", + "Attribute": "attachment" + }, + "output": { + "NetworkInterfaceId": "eni-686ea200", + "Attachment": { + "Status": "attached", + "DeviceIndex": 0, + "AttachTime": "2015-05-21T20:02:20.000Z", + "InstanceId": "i-1234567890abcdef0", + "DeleteOnTermination": true, + "AttachmentId": "eni-attach-43348162", + "InstanceOwnerId": "123456789012" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeNetworkInterfaceAttributeRequest": { @@ -33169,6 +34627,70 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your network interfaces.

", + "smithy.api#examples": [ + { + "title": "To describe a network interface", + "documentation": "", + "input": { + "NetworkInterfaceIds": [ + "eni-e5aa89a3" + ] + }, + "output": { + "NetworkInterfaces": [ + { + "Status": "in-use", + "MacAddress": "02:2f:8f:b0:cf:75", + "SourceDestCheck": true, + "VpcId": "vpc-a01106c2", + "Description": "my network interface", + "Association": { + "PublicIp": "203.0.113.12", + "AssociationId": "eipassoc-0fbb766a", + "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com", + "IpOwnerId": "123456789012" + }, + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + { + "PrivateDnsName": "ip-10-0-1-17.ec2.internal", + "Association": { + "PublicIp": "203.0.113.12", + "AssociationId": "eipassoc-0fbb766a", + "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com", + "IpOwnerId": "123456789012" + }, + "Primary": true, + "PrivateIpAddress": "10.0.1.17" + } + ], + "RequesterManaged": false, + "PrivateDnsName": "ip-10-0-1-17.ec2.internal", + "AvailabilityZone": "us-east-1d", + "Attachment": { + "Status": "attached", + "DeviceIndex": 1, + "AttachTime": "2013-11-30T23:36:42.000Z", + "InstanceId": "i-1234567890abcdef0", + "DeleteOnTermination": false, + "AttachmentId": "eni-attach-66c4350a", + "InstanceOwnerId": "123456789012" + }, + "Groups": [ + { + "GroupName": "default", + "GroupId": "sg-8637d3e3" + } + ], + "SubnetId": "subnet-b61f49f0", + "OwnerId": "123456789012", + "TagSet": [], + "PrivateIpAddress": "10.0.1.17" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -33615,7 +35137,61 @@ "target": "com.amazonaws.ec2#DescribeRegionsResult" }, "traits": { - "smithy.api#documentation": "

Describes the Regions that are enabled for your account, or all Regions.

\n

For a list of the Regions supported by Amazon EC2, see \n Amazon Elastic Compute Cloud endpoints and quotas.

\n

For information about enabling and disabling Regions for your account, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference.

" + "smithy.api#documentation": "

Describes the Regions that are enabled for your account, or all Regions.

\n

For a list of the Regions supported by Amazon EC2, see \n Amazon Elastic Compute Cloud endpoints and quotas.

\n

For information about enabling and disabling Regions for your account, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference.

", + "smithy.api#examples": [ + { + "title": "To describe your regions", + "documentation": "This example describes all the regions that are available to you.", + "output": { + "Regions": [ + { + "Endpoint": "ec2.ap-south-1.amazonaws.com", + "RegionName": "ap-south-1" + }, + { + "Endpoint": "ec2.eu-west-1.amazonaws.com", + "RegionName": "eu-west-1" + }, + { + "Endpoint": "ec2.ap-southeast-1.amazonaws.com", + "RegionName": "ap-southeast-1" + }, + { + "Endpoint": "ec2.ap-southeast-2.amazonaws.com", + "RegionName": "ap-southeast-2" + }, + { + "Endpoint": "ec2.eu-central-1.amazonaws.com", + "RegionName": "eu-central-1" + }, + { + "Endpoint": "ec2.ap-northeast-2.amazonaws.com", + "RegionName": "ap-northeast-2" + }, + { + "Endpoint": "ec2.ap-northeast-1.amazonaws.com", + "RegionName": "ap-northeast-1" + }, + { + "Endpoint": "ec2.us-east-1.amazonaws.com", + "RegionName": "us-east-1" + }, + { + "Endpoint": "ec2.sa-east-1.amazonaws.com", + "RegionName": "sa-east-1" + }, + { + "Endpoint": "ec2.us-west-1.amazonaws.com", + "RegionName": "us-west-1" + }, + { + "Endpoint": "ec2.us-west-2.amazonaws.com", + "RegionName": "us-west-2" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeRegionsRequest": { @@ -34155,7 +35731,42 @@ "target": "com.amazonaws.ec2#DescribeRouteTablesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your route tables.

\n

Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your route tables.

\n

Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a route table", + "documentation": "This example describes the specified route table.", + "input": { + "RouteTableIds": [ + "rtb-1f382e7d" + ] + }, + "output": { + "RouteTables": [ + { + "Associations": [ + { + "RouteTableAssociationId": "rtbassoc-d8ccddba", + "Main": true, + "RouteTableId": "rtb-1f382e7d" + } + ], + "RouteTableId": "rtb-1f382e7d", + "VpcId": "vpc-a01106c2", + "PropagatingVgws": [], + "Tags": [], + "Routes": [ + { + "GatewayId": "local", + "DestinationCidrBlock": "10.0.0.0/16", + "State": "active" + } + ] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34180,7 +35791,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.route-table-association-id - The ID of an association\n ID for the route table.

    \n
  • \n
  • \n

    \n association.route-table-id - The ID of the route table involved in\n the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the\n association.

    \n
  • \n
  • \n

    \n association.main - Indicates whether the route table is the main\n route table for the VPC (true | false). Route tables\n that do not have an association ID are not returned in the response.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the route table.

    \n
  • \n
  • \n

    \n route-table-id - The ID of the route table.

    \n
  • \n
  • \n

    \n route.destination-cidr-block - The IPv4 CIDR range specified in a\n route in the table.

    \n
  • \n
  • \n

    \n route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.destination-prefix-list-id - The ID (prefix) of the Amazon Web Service\n specified in a route in the table.

    \n
  • \n
  • \n

    \n route.egress-only-internet-gateway-id - The ID of an\n egress-only Internet gateway specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.gateway-id - The ID of a gateway specified in a route in the table.

    \n
  • \n
  • \n

    \n route.instance-id - The ID of an instance specified in a route in the table.

    \n
  • \n
  • \n

    \n route.nat-gateway-id - The ID of a NAT gateway.

    \n
  • \n
  • \n

    \n route.transit-gateway-id - The ID of a transit gateway.

    \n
  • \n
  • \n

    \n route.origin - Describes how the route was created. \n CreateRouteTable indicates that the route was automatically\n created when the route table was created; CreateRoute indicates\n that the route was manually added to the route table;\n EnableVgwRoutePropagation indicates that the route was\n propagated by route propagation.

    \n
  • \n
  • \n

    \n route.state - The state of a route in the route table\n (active | blackhole). The blackhole state\n indicates that the route's target isn't available (for example, the specified\n gateway isn't attached to the VPC, the specified NAT instance has been\n terminated, and so on).

    \n
  • \n
  • \n

    \n route.vpc-peering-connection-id - The ID of a VPC peering\n\t\t connection specified in a route in the table.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the route table.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n association.route-table-association-id - The ID of an association\n ID for the route table.

    \n
  • \n
  • \n

    \n association.route-table-id - The ID of the route table involved in\n the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the\n association.

    \n
  • \n
  • \n

    \n association.main - Indicates whether the route table is the main\n route table for the VPC (true | false). Route tables\n that do not have an association ID are not returned in the response.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the route table.

    \n
  • \n
  • \n

    \n route-table-id - The ID of the route table.

    \n
  • \n
  • \n

    \n route.destination-cidr-block - The IPv4 CIDR range specified in a\n route in the table.

    \n
  • \n
  • \n

    \n route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.destination-prefix-list-id - The ID (prefix) of the Amazon Web Service\n specified in a route in the table.

    \n
  • \n
  • \n

    \n route.egress-only-internet-gateway-id - The ID of an\n egress-only Internet gateway specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.gateway-id - The ID of a gateway specified in a route in the table.

    \n
  • \n
  • \n

    \n route.instance-id - The ID of an instance specified in a route in the table.

    \n
  • \n
  • \n

    \n route.nat-gateway-id - The ID of a NAT gateway.

    \n
  • \n
  • \n

    \n route.transit-gateway-id - The ID of a transit gateway.

    \n
  • \n
  • \n

    \n route.origin - Describes how the route was created. \n CreateRouteTable indicates that the route was automatically\n created when the route table was created; CreateRoute indicates\n that the route was manually added to the route table;\n EnableVgwRoutePropagation indicates that the route was\n propagated by route propagation.

    \n
  • \n
  • \n

    \n route.state - The state of a route in the route table\n (active | blackhole). The blackhole state\n indicates that the route's target isn't available (for example, the specified\n gateway isn't attached to the VPC, the specified NAT instance has been\n terminated, and so on).

    \n
  • \n
  • \n

    \n route.vpc-peering-connection-id - The ID of a VPC peering\n\t\t connection specified in a route in the table.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the route table.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -34197,7 +35808,7 @@ "RouteTableIds": { "target": "com.amazonaws.ec2#RouteTableIdStringList", "traits": { - "smithy.api#documentation": "

One or more route table IDs.

\n

Default: Describes all your route tables.

", + "smithy.api#documentation": "

The IDs of the route tables.

\n

Default: Describes all your route tables.

", "smithy.api#xmlName": "RouteTableId" } }, @@ -34471,7 +36082,27 @@ "target": "com.amazonaws.ec2#DescribeSecurityGroupReferencesResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Describes the VPCs on the other side of a VPC peering connection that are referencing the security groups you've specified in this request.

" + "smithy.api#documentation": "

Describes the VPCs on the other side of a VPC peering connection that are referencing the security groups you've specified in this request.

", + "smithy.api#examples": [ + { + "title": "To describe security group references", + "documentation": "This example describes the security group references for the specified security group.", + "input": { + "GroupId": [ + "sg-903004f8" + ] + }, + "output": { + "SecurityGroupReferenceSet": [ + { + "ReferencingVpcId": "vpc-1a2b3c4d", + "GroupId": "sg-903004f8", + "VpcPeeringConnectionId": "pcx-b04deed9" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeSecurityGroupReferencesRequest": { @@ -34619,7 +36250,19 @@ "target": "com.amazonaws.ec2#DescribeSecurityGroupsResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified security groups or all of your security groups.

\n

A security group is for use with instances either in the EC2-Classic platform \n\t\t\t\tor in a specific VPC. For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
", + "smithy.api#documentation": "

Describes the specified security groups or all of your security groups.

", + "smithy.api#examples": [ + { + "title": "To describe a security group", + "documentation": "This example describes the specified security group.", + "input": { + "GroupIds": [ + "sg-903004f8" + ] + }, + "output": {} + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34684,7 +36327,7 @@ "GroupNames": { "target": "com.amazonaws.ec2#GroupNameStringList", "traits": { - "smithy.api#documentation": "

[EC2-Classic and default VPC only] The names of the security groups. You can specify either\n\t\t\tthe security group name or the security group ID. For security groups in a nondefault VPC, use\n\t\t\tthe group-name filter to describe security groups by name.

\n

Default: Describes all of your security groups.

", + "smithy.api#documentation": "

[Default VPC] The names of the security groups. You can specify either\n\t\t\tthe security group name or the security group ID.

\n

Default: Describes all of your security groups.

", "smithy.api#xmlName": "GroupName" } }, @@ -34750,7 +36393,21 @@ "target": "com.amazonaws.ec2#DescribeSnapshotAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified snapshot. You can specify only one\n attribute at a time.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified snapshot. You can specify only one\n attribute at a time.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe snapshot attributes", + "documentation": "This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.", + "input": { + "SnapshotId": "snap-066877671789bd71b", + "Attribute": "createVolumePermission" + }, + "output": { + "SnapshotId": "snap-066877671789bd71b", + "CreateVolumePermissions": [] + } + } + ] } }, "com.amazonaws.ec2#DescribeSnapshotAttributeRequest": { @@ -34909,6 +36566,32 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified EBS snapshots available to you or all of the EBS snapshots\n available to you.

\n

The snapshots available to you include public snapshots, private snapshots that you own,\n and private snapshots owned by other Amazon Web Services accounts for which you have explicit create volume\n permissions.

\n

The create volume permissions fall into the following categories:

\n
    \n
  • \n

    \n public: The owner of the snapshot granted create volume\n permissions for the snapshot to the all group. All Amazon Web Services accounts have create\n volume permissions for these snapshots.

    \n
  • \n
  • \n

    \n explicit: The owner of the snapshot granted create volume\n permissions to a specific Amazon Web Services account.

    \n
  • \n
  • \n

    \n implicit: An Amazon Web Services account has implicit create volume permissions\n for all snapshots it owns.

    \n
  • \n
\n

The list of snapshots returned can be filtered by specifying snapshot IDs, snapshot\n owners, or Amazon Web Services accounts with create volume permissions. If no options are specified, \n Amazon EC2 returns all snapshots for which you have create volume permissions.

\n

If you specify one or more snapshot IDs, only snapshots that have the specified IDs are\n returned. If you specify an invalid snapshot ID, an error is returned. If you specify a\n snapshot ID for which you do not have access, it is not included in the returned\n results.

\n

If you specify one or more snapshot owners using the OwnerIds option, only\n snapshots from the specified owners and for which you have access are returned. The results\n can include the Amazon Web Services account IDs of the specified owners, amazon for snapshots\n owned by Amazon, or self for snapshots that you own.

\n

If you specify a list of restorable users, only snapshots with create snapshot permissions\n for those users are returned. You can specify Amazon Web Services account IDs (if you own the snapshots),\n self for snapshots for which you own or have explicit permissions, or\n all for public snapshots.

\n

If you are describing a long list of snapshots, we recommend that you paginate the output to make the\n list more manageable. For more information, see Pagination.

\n

To get the state of fast snapshot restores for a snapshot, use DescribeFastSnapshotRestores.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a snapshot", + "documentation": "This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.", + "input": { + "SnapshotIds": [ + "snap-1234567890abcdef0" + ] + }, + "output": { + "Snapshots": [ + { + "Description": "This is my snapshot.", + "VolumeId": "vol-049df61146c4d7901", + "State": "completed", + "VolumeSize": 8, + "Progress": "100%", + "StartTime": "2014-02-28T21:28:32.000Z", + "SnapshotId": "snap-1234567890abcdef0", + "OwnerId": "012345678910" + } + ], + "NextToken": "" + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35037,7 +36720,21 @@ "target": "com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionResult" }, "traits": { - "smithy.api#documentation": "

Describes the data feed for Spot Instances. For more information, see Spot\n Instance data feed in the Amazon EC2 User Guide for Linux Instances.

" + "smithy.api#documentation": "

Describes the data feed for Spot Instances. For more information, see Spot\n Instance data feed in the Amazon EC2 User Guide for Linux Instances.

", + "smithy.api#examples": [ + { + "title": "To describe the datafeed for your AWS account", + "documentation": "This example describes the Spot Instance datafeed subscription for your AWS account.", + "output": { + "SpotDatafeedSubscription": { + "OwnerId": "123456789012", + "Prefix": "spotdata", + "Bucket": "my-s3-bucket", + "State": "Active" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionRequest": { @@ -35085,7 +36782,26 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetInstancesResponse" }, "traits": { - "smithy.api#documentation": "

Describes the running instances for the specified Spot Fleet.

" + "smithy.api#documentation": "

Describes the running instances for the specified Spot Fleet.

", + "smithy.api#examples": [ + { + "title": "To describe the Spot Instances associated with a Spot fleet", + "documentation": "This example lists the Spot Instances associated with the specified Spot fleet.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + }, + "output": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "ActiveInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": "m3.medium", + "SpotInstanceRequestId": "sir-08b93456" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults": { @@ -35187,7 +36903,54 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryResponse" }, "traits": { - "smithy.api#documentation": "

Describes the events for the specified Spot Fleet request during the specified\n time.

\n

Spot Fleet events are delayed by up to 30 seconds before they can be described. This\n ensures that you can query by the last evaluated time and not miss a recorded event.\n Spot Fleet events are available for 48 hours.

\n

For more information, see Monitor fleet events using Amazon\n EventBridge in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Describes the events for the specified Spot Fleet request during the specified\n time.

\n

Spot Fleet events are delayed by up to 30 seconds before they can be described. This\n ensures that you can query by the last evaluated time and not miss a recorded event.\n Spot Fleet events are available for 48 hours.

\n

For more information, see Monitor fleet events using Amazon\n EventBridge in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe Spot fleet history", + "documentation": "This example returns the history for the specified Spot fleet starting at the specified time.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "StartTime": "2015-05-26T00:00:00Z" + }, + "output": { + "HistoryRecords": [ + { + "Timestamp": "2015-05-26T23:17:20.697Z", + "EventInformation": { + "EventSubType": "submitted" + }, + "EventType": "fleetRequestChange" + }, + { + "Timestamp": "2015-05-26T23:17:20.873Z", + "EventInformation": { + "EventSubType": "active" + }, + "EventType": "fleetRequestChange" + }, + { + "Timestamp": "2015-05-26T23:21:21.712Z", + "EventInformation": { + "InstanceId": "i-1234567890abcdef0", + "EventSubType": "launched" + }, + "EventType": "instanceChange" + }, + { + "Timestamp": "2015-05-26T23:21:21.816Z", + "EventInformation": { + "InstanceId": "i-1234567890abcdef1", + "EventSubType": "launched" + }, + "EventType": "instanceChange" + } + ], + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "StartTime": "2015-05-26T00:00:00Z", + "NextToken": "CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=" + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults": { @@ -35324,6 +37087,60 @@ }, "traits": { "smithy.api#documentation": "

Describes your Spot Fleet requests.

\n

Spot Fleet requests are deleted 48 hours after they are canceled and their instances\n are terminated.

", + "smithy.api#examples": [ + { + "title": "To describe a Spot fleet request", + "documentation": "This example describes the specified Spot fleet request.", + "input": { + "SpotFleetRequestIds": [ + "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + ] + }, + "output": { + "SpotFleetRequestConfigs": [ + { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "SpotFleetRequestConfig": { + "TargetCapacity": 20, + "LaunchSpecifications": [ + { + "EbsOptimized": false, + "NetworkInterfaces": [ + { + "SubnetId": "subnet-a61dafcf", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "AssociatePublicIpAddress": true, + "SecondaryPrivateIpAddressCount": 0 + } + ], + "InstanceType": "cc2.8xlarge", + "ImageId": "ami-1a2b3c4d" + }, + { + "EbsOptimized": false, + "NetworkInterfaces": [ + { + "SubnetId": "subnet-a61dafcf", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "AssociatePublicIpAddress": true, + "SecondaryPrivateIpAddressCount": 0 + } + ], + "InstanceType": "r3.8xlarge", + "ImageId": "ami-1a2b3c4d" + } + ], + "SpotPrice": "0.05", + "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role" + }, + "SpotFleetRequestState": "active" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35412,6 +37229,58 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified Spot Instance requests.

\n

You can use DescribeSpotInstanceRequests to find a running Spot Instance by\n examining the response. If the status of the Spot Instance is fulfilled, the\n instance ID appears in the response and contains the identifier of the instance.\n Alternatively, you can use DescribeInstances\n with a filter to look for instances where the instance lifecycle is\n spot.

\n

We recommend that you set MaxResults to a value between 5 and 1000 to\n limit the number of items returned. This paginates the output, which makes the list\n more manageable and returns the items faster. If the list of items exceeds your\n MaxResults value, then that number of items is returned along with a\n NextToken value that can be passed to a subsequent\n DescribeSpotInstanceRequests request to retrieve the remaining\n items.

\n

Spot Instance requests are deleted four hours after they are canceled and their instances are\n terminated.

", + "smithy.api#examples": [ + { + "title": "To describe a Spot Instance request", + "documentation": "This example describes the specified Spot Instance request.", + "input": { + "SpotInstanceRequestIds": [ + "sir-08b93456" + ] + }, + "output": { + "SpotInstanceRequests": [ + { + "Status": { + "UpdateTime": "2014-04-30T18:16:21.000Z", + "Code": "fulfilled", + "Message": "Your Spot request is fulfilled." + }, + "ProductDescription": "Linux/UNIX", + "InstanceId": "i-1234567890abcdef0", + "SpotInstanceRequestId": "sir-08b93456", + "State": "active", + "LaunchedAvailabilityZone": "us-west-1b", + "LaunchSpecification": { + "ImageId": "ami-7aba833f", + "KeyName": "my-key-pair", + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sda1", + "Ebs": { + "DeleteOnTermination": true, + "VolumeType": "standard", + "VolumeSize": 8 + } + } + ], + "EbsOptimized": false, + "SecurityGroups": [ + { + "GroupName": "my-security-group", + "GroupId": "sg-e38f24a7" + } + ], + "InstanceType": "m1.small" + }, + "Type": "one-time", + "CreateTime": "2014-04-30T18:14:55.000Z", + "SpotPrice": "0.010000" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35578,6 +37447,40 @@ }, "traits": { "smithy.api#documentation": "

Describes the Spot price history. For more information, see Spot Instance pricing history in the\n Amazon EC2 User Guide for Linux Instances.

\n

When you specify a start and end time, the operation returns the prices of the\n instance types within that time range. It also returns the last price change before the\n start time, which is the effective price as of the start time.

", + "smithy.api#examples": [ + { + "title": "To describe Spot price history for Linux/UNIX (Amazon VPC)", + "documentation": "This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.", + "input": { + "StartTime": "2014-01-06T07:08:09.05Z", + "EndTime": "2014-01-06T08:09:10.05Z", + "InstanceTypes": [ + "m1.xlarge" + ], + "ProductDescriptions": [ + "Linux/UNIX (Amazon VPC)" + ] + }, + "output": { + "SpotPriceHistory": [ + { + "Timestamp": "2014-01-06T04:32:53.000Z", + "ProductDescription": "Linux/UNIX (Amazon VPC)", + "InstanceType": "m1.xlarge", + "SpotPrice": "0.080000", + "AvailabilityZone": "us-west-1a" + }, + { + "Timestamp": "2014-01-05T11:28:26.000Z", + "ProductDescription": "Linux/UNIX (Amazon VPC)", + "InstanceType": "m1.xlarge", + "SpotPrice": "0.080000", + "AvailabilityZone": "us-west-1c" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35702,7 +37605,7 @@ "target": "com.amazonaws.ec2#DescribeStaleSecurityGroupsResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Describes the stale security group rules for security groups in a specified VPC. \n Rules are stale when they reference a deleted security group in the same VPC or in a peer VPC, \n or if they reference a security group in a peer VPC for which the VPC peering connection has \n been deleted.

", + "smithy.api#documentation": "

Describes the stale security group rules for security groups in a specified VPC. \n Rules are stale when they reference a deleted security group in the same VPC or in a peer VPC, \n or if they reference a security group in a peer VPC for which the VPC peering connection has \n been deleted.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35807,6 +37710,43 @@ "outputToken": "NextToken", "items": "StoreImageTaskResults", "pageSize": "MaxResults" + }, + "smithy.waiters#waitable": { + "StoreImageTaskComplete": { + "acceptors": [ + { + "state": "success", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "Completed", + "comparator": "allStringEquals" + } + } + }, + { + "state": "failure", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "Failed", + "comparator": "anyStringEquals" + } + } + }, + { + "state": "retry", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "InProgress", + "comparator": "anyStringEquals" + } + } + } + ], + "minDelay": 5 + } } } }, @@ -35897,7 +37837,37 @@ "target": "com.amazonaws.ec2#DescribeSubnetsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your subnets.

\n

For more information, see Your VPC and subnets in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your subnets.

\n

For more information, see Subnets in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe the subnets for a VPC", + "documentation": "This example describes the subnets for the specified VPC.", + "input": { + "Filters": [ + { + "Name": "vpc-id", + "Values": [ + "vpc-a01106c2" + ] + } + ] + }, + "output": { + "Subnets": [ + { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24", + "MapPublicIpOnLaunch": false, + "DefaultForAz": false, + "State": "available", + "AvailabilityZone": "us-east-1c", + "SubnetId": "subnet-9d4a7b6c", + "AvailableIpAddressCount": 251 + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35939,14 +37909,14 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for the subnet. You can also use\n availabilityZone as the filter name.

    \n
  • \n
  • \n

    \n availability-zone-id - The ID of the Availability Zone for the subnet.\n You can also use availabilityZoneId as the filter name.

    \n
  • \n
  • \n

    \n available-ip-address-count - The number of IPv4 addresses in the\n subnet that are available.

    \n
  • \n
  • \n

    \n cidr-block - The IPv4 CIDR block of the subnet. The CIDR block\n you specify must exactly match the subnet's CIDR block for information to be\n returned for the subnet. You can also use cidr or\n cidrBlock as the filter names.

    \n
  • \n
  • \n

    \n customer-owned-ipv4-pool - The customer-owned IPv4 address pool\n associated with the subnet.

    \n
  • \n
  • \n

    \n default-for-az - Indicates whether this is the default subnet for\n the Availability Zone (true | false). You can also use\n defaultForAz as the filter name.

    \n
  • \n
  • \n

    \n enable-dns64 - Indicates whether DNS queries made to the\n Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\n addresses for IPv4-only destinations.

    \n
  • \n
  • \n

    \n enable-lni-at-device-index - Indicates the device position for\n local network interfaces in this subnet. For example, 1 indicates\n local network interfaces in this subnet are the secondary network interface\n (eth1).

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - An association ID\n for an IPv6 CIDR block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-native - Indicates whether this is an IPv6 only subnet\n (true | false).

    \n
  • \n
  • \n

    \n map-customer-owned-ip-on-launch - Indicates whether a network\n interface created in this subnet (including a network interface created by RunInstances) receives a customer-owned IPv4 address.

    \n
  • \n
  • \n

    \n map-public-ip-on-launch - Indicates whether instances launched in\n this subnet receive a public IPv4 address.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the Outpost.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the\n subnet.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.hostname-type - The type of\n hostname to assign to instances in the subnet at launch. For IPv4-only and\n dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\n instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\n only subnets, an instance DNS name must be based on the instance ID\n (resource-name).

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-a-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS\n AAAA records.

    \n
  • \n
  • \n

    \n state - The state of the subnet (pending | available).

    \n
  • \n
  • \n

    \n subnet-arn - The Amazon Resource Name (ARN) of the subnet.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the subnet.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for the subnet. You can also use\n availabilityZone as the filter name.

    \n
  • \n
  • \n

    \n availability-zone-id - The ID of the Availability Zone for the subnet.\n You can also use availabilityZoneId as the filter name.

    \n
  • \n
  • \n

    \n available-ip-address-count - The number of IPv4 addresses in the\n subnet that are available.

    \n
  • \n
  • \n

    \n cidr-block - The IPv4 CIDR block of the subnet. The CIDR block\n you specify must exactly match the subnet's CIDR block for information to be\n returned for the subnet. You can also use cidr or\n cidrBlock as the filter names.

    \n
  • \n
  • \n

    \n customer-owned-ipv4-pool - The customer-owned IPv4 address pool\n associated with the subnet.

    \n
  • \n
  • \n

    \n default-for-az - Indicates whether this is the default subnet for\n the Availability Zone (true | false). You can also use\n defaultForAz as the filter name.

    \n
  • \n
  • \n

    \n enable-dns64 - Indicates whether DNS queries made to the\n Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\n addresses for IPv4-only destinations.

    \n
  • \n
  • \n

    \n enable-lni-at-device-index - Indicates the device position for\n local network interfaces in this subnet. For example, 1 indicates\n local network interfaces in this subnet are the secondary network interface\n (eth1).

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - An association ID\n for an IPv6 CIDR block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-native - Indicates whether this is an IPv6 only subnet\n (true | false).

    \n
  • \n
  • \n

    \n map-customer-owned-ip-on-launch - Indicates whether a network\n interface created in this subnet (including a network interface created by RunInstances) receives a customer-owned IPv4 address.

    \n
  • \n
  • \n

    \n map-public-ip-on-launch - Indicates whether instances launched in\n this subnet receive a public IPv4 address.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the Outpost.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the\n subnet.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.hostname-type - The type of\n hostname to assign to instances in the subnet at launch. For IPv4-only and\n dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\n instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\n only subnets, an instance DNS name must be based on the instance ID\n (resource-name).

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-a-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS\n AAAA records.

    \n
  • \n
  • \n

    \n state - The state of the subnet (pending | available).

    \n
  • \n
  • \n

    \n subnet-arn - The Amazon Resource Name (ARN) of the subnet.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the subnet.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, "SubnetIds": { "target": "com.amazonaws.ec2#SubnetIdStringList", "traits": { - "smithy.api#documentation": "

One or more subnet IDs.

\n

Default: Describes all your subnets.

", + "smithy.api#documentation": "

The IDs of the subnets.

\n

Default: Describes all your subnets.

", "smithy.api#xmlName": "SubnetId" } }, @@ -36013,6 +37983,38 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified tags for your EC2 resources.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe the tags for a single resource", + "documentation": "This example describes the tags for the specified instance.", + "input": { + "Filters": [ + { + "Name": "resource-id", + "Values": [ + "i-1234567890abcdef8" + ] + } + ] + }, + "output": { + "Tags": [ + { + "ResourceType": "instance", + "ResourceId": "i-1234567890abcdef8", + "Value": "test", + "Key": "Stack" + }, + { + "ResourceType": "instance", + "ResourceId": "i-1234567890abcdef8", + "Value": "Beta Server", + "Key": "Name" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -37799,7 +39801,23 @@ "target": "com.amazonaws.ec2#DescribeVolumeAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified volume. You can specify only one\n attribute at a time.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified volume. You can specify only one\n attribute at a time.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a volume attribute", + "documentation": "This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.", + "input": { + "VolumeId": "vol-049df61146c4d7901", + "Attribute": "autoEnableIO" + }, + "output": { + "AutoEnableIO": { + "Value": false + }, + "VolumeId": "vol-049df61146c4d7901" + } + } + ] } }, "com.amazonaws.ec2#DescribeVolumeAttributeRequest": { @@ -37878,6 +39896,40 @@ }, "traits": { "smithy.api#documentation": "

Describes the status of the specified volumes. Volume status provides the result of the\n checks performed on your volumes to determine events that can impair the performance of your\n volumes. The performance of a volume can be affected if an issue occurs on the volume's\n underlying host. If the volume's underlying host experiences a power outage or system issue,\n after the system is restored, there could be data inconsistencies on the volume. Volume events\n notify you if this occurs. Volume actions notify you if any action needs to be taken in\n response to the event.

\n

The DescribeVolumeStatus operation provides the following information about\n the specified volumes:

\n

\n Status: Reflects the current status of the volume. The possible\n values are ok, impaired , warning, or\n insufficient-data. If all checks pass, the overall status of the volume is\n ok. If the check fails, the overall status is impaired. If the\n status is insufficient-data, then the checks might still be taking place on your\n volume at the time. We recommend that you retry the request. For more information about volume\n status, see Monitor the status of your volumes in the\n Amazon Elastic Compute Cloud User Guide.

\n

\n Events: Reflect the cause of a volume status and might require you to\n take action. For example, if your volume returns an impaired status, then the\n volume event might be potential-data-inconsistency. This means that your volume\n has been affected by an issue with the underlying host, has all I/O operations disabled, and\n might have inconsistent data.

\n

\n Actions: Reflect the actions you might have to take in response to an\n event. For example, if the status of the volume is impaired and the volume event\n shows potential-data-inconsistency, then the action shows\n enable-volume-io. This means that you may want to enable the I/O operations for\n the volume by calling the EnableVolumeIO action and then check the volume\n for data consistency.

\n

Volume status is based on the volume status checks, and does not reflect the volume state.\n Therefore, volume status does not indicate volumes in the error state (for\n example, when a volume is incapable of accepting I/O.)

", + "smithy.api#examples": [ + { + "title": "To describe the status of a single volume", + "documentation": "This example describes the status for the volume ``vol-1234567890abcdef0``.", + "input": { + "VolumeIds": [ + "vol-1234567890abcdef0" + ] + }, + "output": { + "VolumeStatuses": [ + { + "VolumeStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "io-enabled" + }, + { + "Status": "not-applicable", + "Name": "io-performance" + } + ] + }, + "AvailabilityZone": "us-east-1a", + "VolumeId": "vol-1234567890abcdef0", + "Actions": [], + "Events": [] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -37966,6 +40018,36 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified EBS volumes or all of your EBS volumes.

\n

If you are describing a long list of volumes, we recommend that you paginate the output to make the list\n more manageable. For more information, see Pagination.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe all volumes", + "documentation": "This example describes all of your volumes in the default region.", + "output": { + "Volumes": [ + { + "AvailabilityZone": "us-east-1a", + "Attachments": [ + { + "AttachTime": "2013-12-18T22:35:00.000Z", + "InstanceId": "i-1234567890abcdef0", + "VolumeId": "vol-049df61146c4d7901", + "State": "attached", + "DeleteOnTermination": true, + "Device": "/dev/sda1" + } + ], + "VolumeType": "standard", + "VolumeId": "vol-049df61146c4d7901", + "State": "in-use", + "SnapshotId": "snap-1234567890abcdef0", + "CreateTime": "2013-12-18T22:35:00.084Z", + "Size": 8 + } + ], + "NextToken": "" + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -38219,7 +40301,23 @@ "target": "com.amazonaws.ec2#DescribeVpcAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the enableDnsSupport attribute", + "documentation": "This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.", + "input": { + "VpcId": "vpc-a01106c2", + "Attribute": "enableDnsSupport" + }, + "output": { + "VpcId": "vpc-a01106c2", + "EnableDnsSupport": { + "Value": true + } + } + } + ] } }, "com.amazonaws.ec2#DescribeVpcAttributeRequest": { @@ -38305,7 +40403,7 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "

Describes the ClassicLink status of one or more VPCs.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes the ClassicLink status of the specified VPCs.

" } }, "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupport": { @@ -38317,7 +40415,7 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\n hostname of a linked EC2-Classic instance resolves to its private IP address when\n addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n of an instance in a VPC resolves to its private IP address when addressed from a linked\n EC2-Classic instance. For more information, see ClassicLink in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\n hostname of a linked EC2-Classic instance resolves to its private IP address when\n addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n of an instance in a VPC resolves to its private IP address when addressed from a linked\n EC2-Classic instance.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -38369,7 +40467,7 @@ "VpcIds": { "target": "com.amazonaws.ec2#VpcClassicLinkIdList", "traits": { - "smithy.api#documentation": "

One or more VPC IDs.

", + "smithy.api#documentation": "

The IDs of the VPCs.

", "smithy.api#xmlName": "VpcIds" } } @@ -38408,7 +40506,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n is-classic-link-enabled - Whether the VPC is enabled for ClassicLink\n\t\t\t\t\t (true | false).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n is-classic-link-enabled - Whether the VPC is enabled for ClassicLink\n\t\t\t\t\t (true | false).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -38425,7 +40523,7 @@ "VpcIds": { "target": "com.amazonaws.ec2#VpcClassicLinkIdList", "traits": { - "smithy.api#documentation": "

One or more VPCs for which you want to describe the ClassicLink status.

", + "smithy.api#documentation": "

The VPCs for which you want to describe the ClassicLink status.

", "smithy.api#xmlName": "VpcId" } } @@ -38441,7 +40539,7 @@ "target": "com.amazonaws.ec2#VpcClassicLinkList", "traits": { "aws.protocols#ec2QueryName": "VpcSet", - "smithy.api#documentation": "

The ClassicLink status of one or more VPCs.

", + "smithy.api#documentation": "

The ClassicLink status of the VPCs.

", "smithy.api#xmlName": "vpcSet" } } @@ -39038,7 +41136,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter\n VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n accepter VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.vpc-id - The ID of the accepter VPC.

    \n
  • \n
  • \n

    \n expiration-time - The expiration date and time for the VPC peering\n connection.

    \n
  • \n
  • \n

    \n requester-vpc-info.cidr-block - The IPv4 CIDR block of the\n requester's VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n requester VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.vpc-id - The ID of the requester VPC.

    \n
  • \n
  • \n

    \n status-code - The status of the VPC peering connection\n (pending-acceptance | failed |\n expired | provisioning | active |\n deleting | deleted |\n rejected).

    \n
  • \n
  • \n

    \n status-message - A message that provides more information about the status\n of the VPC peering connection, if applicable.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-peering-connection-id - The ID of the VPC peering connection.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter\n VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n accepter VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.vpc-id - The ID of the accepter VPC.

    \n
  • \n
  • \n

    \n expiration-time - The expiration date and time for the VPC peering\n connection.

    \n
  • \n
  • \n

    \n requester-vpc-info.cidr-block - The IPv4 CIDR block of the\n requester's VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n requester VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.vpc-id - The ID of the requester VPC.

    \n
  • \n
  • \n

    \n status-code - The status of the VPC peering connection\n (pending-acceptance | failed |\n expired | provisioning | active |\n deleting | deleted |\n rejected).

    \n
  • \n
  • \n

    \n status-message - A message that provides more information about the status\n of the VPC peering connection, if applicable.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-peering-connection-id - The ID of the VPC peering connection.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -39055,7 +41153,7 @@ "VpcPeeringConnectionIds": { "target": "com.amazonaws.ec2#VpcPeeringConnectionIdList", "traits": { - "smithy.api#documentation": "

One or more VPC peering connection IDs.

\n

Default: Describes all your VPC peering connections.

", + "smithy.api#documentation": "

The IDs of the VPC peering connections.

\n

Default: Describes all your VPC peering connections.

", "smithy.api#xmlName": "VpcPeeringConnectionId" } }, @@ -39112,6 +41210,35 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your VPCs.

", + "smithy.api#examples": [ + { + "title": "To describe a VPC", + "documentation": "This example describes the specified VPC.", + "input": { + "VpcIds": [ + "vpc-a01106c2" + ] + }, + "output": { + "Vpcs": [ + { + "VpcId": "vpc-a01106c2", + "InstanceTenancy": "default", + "Tags": [ + { + "Value": "MyVPC", + "Key": "Name" + } + ], + "State": "available", + "DhcpOptionsId": "dopt-7a8b9c2d", + "CidrBlock": "10.0.0.0/16", + "IsDefault": false + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -39173,14 +41300,14 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you\n specify must exactly match the VPC's CIDR block for information to be returned\n for the VPC. Must contain the slash followed by one or two digits (for example,\n /28).

    \n
  • \n
  • \n

    \n cidr-block-association.cidr-block - An IPv4 CIDR block associated with the\n VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.association-id - The association ID for\n an IPv4 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.state - The state of an IPv4 CIDR block\n associated with the VPC.

    \n
  • \n
  • \n

    \n dhcp-options-id - The ID of a set of DHCP options.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-pool - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - The association\n ID for an IPv6 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n is-default - Indicates whether the VPC is the default VPC.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the VPC.

    \n
  • \n
  • \n

    \n state - The state of the VPC (pending | available).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you\n specify must exactly match the VPC's CIDR block for information to be returned\n for the VPC. Must contain the slash followed by one or two digits (for example,\n /28).

    \n
  • \n
  • \n

    \n cidr-block-association.cidr-block - An IPv4 CIDR block associated with the\n VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.association-id - The association ID for\n an IPv4 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.state - The state of an IPv4 CIDR block\n associated with the VPC.

    \n
  • \n
  • \n

    \n dhcp-options-id - The ID of a set of DHCP options.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-pool - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - The association\n ID for an IPv6 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n is-default - Indicates whether the VPC is the default VPC.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the VPC.

    \n
  • \n
  • \n

    \n state - The state of the VPC (pending | available).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, "VpcIds": { "target": "com.amazonaws.ec2#VpcIdStringList", "traits": { - "smithy.api#documentation": "

One or more VPC IDs.

\n

Default: Describes all your VPCs.

", + "smithy.api#documentation": "

The IDs of the VPCs.

\n

Default: Describes all your VPCs.

", "smithy.api#xmlName": "VpcId" } }, @@ -39515,7 +41642,7 @@ "target": "com.amazonaws.ec2#DetachClassicLinkVpcResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, the VPC security groups are no longer associated with it. An instance is automatically unlinked from a VPC when it's stopped.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, \n\t\t the VPC security groups are no longer associated with it. An instance is automatically unlinked from \n\t\t a VPC when it's stopped.

" } }, "com.amazonaws.ec2#DetachClassicLinkVpcRequest": { @@ -39583,7 +41710,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Detaches an internet gateway from a VPC, disabling connectivity between the internet\n\t\t\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\n\t\t\tpublic IPv4 addresses.

" + "smithy.api#documentation": "

Detaches an internet gateway from a VPC, disabling connectivity between the internet\n\t\t\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\n\t\t\tpublic IPv4 addresses.

", + "smithy.api#examples": [ + { + "title": "To detach an Internet gateway from a VPC", + "documentation": "This example detaches the specified Internet gateway from the specified VPC.", + "input": { + "InternetGatewayId": "igw-c0a643a9", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#DetachInternetGatewayRequest": { @@ -39633,7 +41770,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Detaches a network interface from an instance.

" + "smithy.api#documentation": "

Detaches a network interface from an instance.

", + "smithy.api#examples": [ + { + "title": "To detach a network interface from an instance", + "documentation": "This example detaches the specified network interface from its attached instance.", + "input": { + "AttachmentId": "eni-attach-66c4350a" + } + } + ] } }, "com.amazonaws.ec2#DetachNetworkInterfaceRequest": { @@ -39759,7 +41905,23 @@ "target": "com.amazonaws.ec2#VolumeAttachment" }, "traits": { - "smithy.api#documentation": "

Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\n device within your operating system before detaching the volume. Failure to do so can result\n in the volume becoming stuck in the busy state while detaching. If this happens,\n detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\n the instance, or all three. If an EBS volume is the root device of an instance, it can't be\n detached while the instance is running. To detach the root volume, stop the instance\n first.

\n

When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\n product code is no longer associated with the instance.

\n

For more information, see Detach an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\n device within your operating system before detaching the volume. Failure to do so can result\n in the volume becoming stuck in the busy state while detaching. If this happens,\n detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\n the instance, or all three. If an EBS volume is the root device of an instance, it can't be\n detached while the instance is running. To detach the root volume, stop the instance\n first.

\n

When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\n product code is no longer associated with the instance.

\n

For more information, see Detach an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To detach a volume from an instance", + "documentation": "This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.", + "input": { + "VolumeId": "vol-1234567890abcdef0" + }, + "output": { + "AttachTime": "2014-02-27T19:23:06.000Z", + "InstanceId": "i-1234567890abcdef0", + "VolumeId": "vol-049df61146c4d7901", + "State": "detaching", + "Device": "/dev/sdb" + } + } + ] } }, "com.amazonaws.ec2#DetachVolumeRequest": { @@ -39920,7 +42082,7 @@ "target": "com.amazonaws.ec2#DhcpConfigurationValueList", "traits": { "aws.protocols#ec2QueryName": "ValueSet", - "smithy.api#documentation": "

One or more values for the DHCP option.

", + "smithy.api#documentation": "

The values for the DHCP option.

", "smithy.api#xmlName": "valueSet" } } @@ -39954,7 +42116,7 @@ "target": "com.amazonaws.ec2#DhcpConfigurationList", "traits": { "aws.protocols#ec2QueryName": "DhcpConfigurationSet", - "smithy.api#documentation": "

One or more DHCP options in the set.

", + "smithy.api#documentation": "

The DHCP options in the set.

", "smithy.api#xmlName": "dhcpConfigurationSet" } }, @@ -39984,7 +42146,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes a set of DHCP options.

" + "smithy.api#documentation": "

The set of DHCP options.

" } }, "com.amazonaws.ec2#DhcpOptionsId": { @@ -40597,6 +42759,50 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#DisableImageBlockPublicAccess": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccessRequest" + }, + "output": { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccessResult" + }, + "traits": { + "smithy.api#documentation": "

Disables block public access for AMIs at the account level in the\n specified Amazon Web Services Region. This removes the block public access restriction\n from your account. With the restriction removed, you can publicly share your AMIs in the\n specified Amazon Web Services Region.

\n

The API can take up to 10 minutes to configure this setting. During this time, if you run\n GetImageBlockPublicAccessState, the response will be\n block-new-sharing. When the API has completed the configuration, the response\n will be unblocked.

\n

For more information, see Block public access to your AMIs in\n the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccessRequest": { + "type": "structure", + "members": { + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccessResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessDisabledState", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

Returns unblocked if the request succeeds; otherwise, it returns an\n error.

", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#DisableImageDeprecation": { "type": "operation", "input": { @@ -40824,7 +43030,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disables a virtual private gateway (VGW) from propagating routes to a specified route\n table of a VPC.

" + "smithy.api#documentation": "

Disables a virtual private gateway (VGW) from propagating routes to a specified route\n table of a VPC.

", + "smithy.api#examples": [ + { + "title": "To disable route propagation", + "documentation": "This example disables the specified virtual private gateway from propagating static routes to the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#DisableVgwRoutePropagationRequest": { @@ -40869,7 +43085,7 @@ "target": "com.amazonaws.ec2#DisableVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "

Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances linked to it.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances\n linked to it.

" } }, "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupport": { @@ -40881,7 +43097,7 @@ "target": "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "

Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\n\t\t\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\n\t\t\tin the VPC to which it's linked. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

\n

You must specify a VPC ID in the request.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\n\t\t\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\n\t\t\tin the VPC to which it's linked.

\n

You must specify a VPC ID in the request.

" } }, "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportRequest": { @@ -40972,7 +43188,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates an Elastic IP address from the instance or network interface it's associated with.

\n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.

" + "smithy.api#documentation": "

Disassociates an Elastic IP address from the instance or network interface it's associated with.

\n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.

", + "smithy.api#examples": [ + { + "title": "To disassociate an Elastic IP address", + "documentation": "This example disassociates an Elastic IP address from an instance.", + "input": { + "AssociationId": "eipassoc-2bebb745" + } + } + ] } }, "com.amazonaws.ec2#DisassociateAddressRequest": { @@ -41144,7 +43369,27 @@ "target": "com.amazonaws.ec2#DisassociateIamInstanceProfileResult" }, "traits": { - "smithy.api#documentation": "

Disassociates an IAM instance profile from a running or stopped instance.

\n

Use DescribeIamInstanceProfileAssociations to get the association\n ID.

" + "smithy.api#documentation": "

Disassociates an IAM instance profile from a running or stopped instance.

\n

Use DescribeIamInstanceProfileAssociations to get the association\n ID.

", + "smithy.api#examples": [ + { + "title": "To disassociate an IAM instance profile", + "documentation": "This example disassociates the specified IAM instance profile from an instance.", + "input": { + "AssociationId": "iip-assoc-05020b59952902f5f" + }, + "output": { + "IamInstanceProfileAssociation": { + "InstanceId": "i-123456789abcde123", + "State": "disassociating", + "AssociationId": "iip-assoc-05020b59952902f5f", + "IamInstanceProfile": { + "Id": "AIPAI5IVIHMFFYY2DKV5Y", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#DisassociateIamInstanceProfileRequest": { @@ -41300,7 +43545,7 @@ "target": "com.amazonaws.ec2#DisassociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. You cannot disassociate your primary EIP. For more information, see Edit secondary IP address associations in the Amazon Virtual Private Cloud User Guide.

\n

While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

An EIP will only be released at the end of MaxDrainDurationSeconds. The EIPs stay\n associated and support the existing connections but do not support any new connections\n (new connections are distributed across the remaining associated EIPs). As the existing\n connections drain out, the EIPs (and the corresponding private IPs mapped to them) get\n released.

" + "smithy.api#documentation": "

Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. \n You cannot disassociate your primary EIP. For more information, see Edit secondary IP address associations in the Amazon VPC User Guide.

\n

While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

An EIP is released only at the end of MaxDrainDurationSeconds. It stays\n associated and supports the existing connections but does not support any new connections\n (new connections are distributed across the remaining associated EIPs). As the existing\n connections drain out, the EIPs (and the corresponding private IP addresses mapped to them) \n are released.

" } }, "com.amazonaws.ec2#DisassociateNatGatewayAddressRequest": { @@ -41310,7 +43555,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -41351,7 +43596,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -41377,7 +43622,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To disassociate a route table", + "documentation": "This example disassociates the specified route table from its associated subnet.", + "input": { + "AssociationId": "rtbassoc-781d0d1a" + } + } + ] } }, "com.amazonaws.ec2#DisassociateRouteTableRequest": { @@ -42309,7 +44563,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "OutpostArn", - "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored.

\n

This parameter is only supported on BlockDeviceMapping objects called by\n \n CreateImage.

", + "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored.

\n

This parameter is not supported when using CreateImage.

", "smithy.api#xmlName": "outpostArn" } }, @@ -43790,6 +46044,58 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#EnableImageBlockPublicAccess": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccessRequest" + }, + "output": { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccessResult" + }, + "traits": { + "smithy.api#documentation": "

Enables block public access for AMIs at the account level in the\n specified Amazon Web Services Region. This prevents the public sharing of your AMIs. However, if you already\n have public AMIs, they will remain publicly available.

\n

The API can take up to 10 minutes to configure this setting. During this time, if you run\n GetImageBlockPublicAccessState, the response will be unblocked. When\n the API has completed the configuration, the response will be\n block-new-sharing.

\n

For more information, see Block\n public access to your AMIs in the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccessRequest": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#documentation": "

Specify block-new-sharing to enable block public access for AMIs at the\n account level in the specified Region. This will block any attempt to publicly share your AMIs\n in the specified Region.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccessResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

Returns block-new-sharing if the request succeeds; otherwise, it returns an\n error.

", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#EnableImageDeprecation": { "type": "operation", "input": { @@ -44071,7 +46377,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Enables a virtual private gateway (VGW) to propagate routes to the specified route\n table of a VPC.

" + "smithy.api#documentation": "

Enables a virtual private gateway (VGW) to propagate routes to the specified route\n table of a VPC.

", + "smithy.api#examples": [ + { + "title": "To enable route propagation", + "documentation": "This example enables the specified virtual private gateway to propagate static routes to the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#EnableVgwRoutePropagationRequest": { @@ -44116,7 +46432,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Enables I/O operations for a volume that had I/O operations disabled because the data on\n the volume was potentially inconsistent.

" + "smithy.api#documentation": "

Enables I/O operations for a volume that had I/O operations disabled because the data on\n the volume was potentially inconsistent.

", + "smithy.api#examples": [ + { + "title": "To enable I/O for a volume", + "documentation": "This example enables I/O on volume ``vol-1234567890abcdef0``.", + "input": { + "VolumeId": "vol-1234567890abcdef0" + } + } + ] } }, "com.amazonaws.ec2#EnableVolumeIORequest": { @@ -44156,7 +46481,7 @@ "target": "com.amazonaws.ec2#EnableVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\n\t\t\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\n\t\t\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\n\t\t\taddress ranges within the 10.0.0.0/8 IP address range, excluding local\n\t\t\troutes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16 IP address\n\t\t\tranges. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\n\t\t\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\n\t\t\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\n\t\t\taddress ranges within the 10.0.0.0/8 IP address range, excluding local\n\t\t\troutes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16 IP address\n\t\t\tranges.

" } }, "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupport": { @@ -44168,7 +46493,7 @@ "target": "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\n\t\t\thostname of a linked EC2-Classic instance resolves to its private IP address when\n\t\t\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n\t\t\tof an instance in a VPC resolves to its private IP address when addressed from a linked\n\t\t\tEC2-Classic instance. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

\n

You must specify a VPC ID in the request.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\n\t\t\thostname of a linked EC2-Classic instance resolves to its private IP address when\n\t\t\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n\t\t\tof an instance in a VPC resolves to its private IP address when addressed from a linked\n\t\t\tEC2-Classic instance.

\n

You must specify a VPC ID in the request.

" } }, "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportRequest": { @@ -44465,7 +46790,7 @@ "min": 1, "max": 30 }, - "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*]+$" + "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*\\-]+$" } }, "com.amazonaws.ec2#ExcludedInstanceTypeSet": { @@ -46719,7 +49044,7 @@ "target": "com.amazonaws.ec2#ImageId", "traits": { "aws.protocols#ec2QueryName": "ImageId", - "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. The AMI ID must be specified here or in the launch template.

", + "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. This parameter is only\n available for fleets of type instant. For fleets of type maintain\n and request, you must specify the AMI ID in the launch template.

", "smithy.api#xmlName": "imageId" } } @@ -46804,7 +49129,7 @@ "ImageId": { "target": "com.amazonaws.ec2#ImageId", "traits": { - "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. The AMI ID must be specified here or in the launch template.

" + "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. This parameter is only\n available for fleets of type instant. For fleets of type maintain\n and request, you must specify the AMI ID in the launch template.

" } } }, @@ -48163,7 +50488,21 @@ "target": "com.amazonaws.ec2#GetConsoleOutputResult" }, "traits": { - "smithy.api#documentation": "

Gets the console output for the specified instance. For Linux instances, the instance\n console output displays the exact console output that would normally be displayed on a\n physical monitor attached to a computer. For Windows instances, the instance console\n output includes the last three system event log errors.

\n

By default, the console output returns buffered information that was posted shortly\n after an instance transition state (start, stop, reboot, or terminate). This information\n is available for at least one hour after the most recent post. Only the most recent 64\n KB of console output is available.

\n

You can optionally retrieve the latest serial console output at any time during the\n instance lifecycle. This option is supported on instance types that use the Nitro\n hypervisor.

\n

For more information, see Instance\n console output in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Gets the console output for the specified instance. For Linux instances, the instance\n console output displays the exact console output that would normally be displayed on a\n physical monitor attached to a computer. For Windows instances, the instance console\n output includes the last three system event log errors.

\n

By default, the console output returns buffered information that was posted shortly\n after an instance transition state (start, stop, reboot, or terminate). This information\n is available for at least one hour after the most recent post. Only the most recent 64\n KB of console output is available.

\n

You can optionally retrieve the latest serial console output at any time during the\n instance lifecycle. This option is supported on instance types that use the Nitro\n hypervisor.

\n

For more information, see Instance\n console output in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To get the console output", + "documentation": "This example gets the console output for the specified instance.", + "input": { + "InstanceId": "i-1234567890abcdef0" + }, + "output": { + "InstanceId": "i-1234567890abcdef0", + "Output": "...", + "Timestamp": "2018-05-25T21:23:53.000Z" + } + } + ] } }, "com.amazonaws.ec2#GetConsoleOutputRequest": { @@ -48436,6 +50775,14 @@ "smithy.api#documentation": "

Indicates whether encryption by default is enabled.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -48451,7 +50798,7 @@ "target": "com.amazonaws.ec2#GetFlowLogsIntegrationTemplateResult" }, "traits": { - "smithy.api#documentation": "

Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \n with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \n Based on the information that you provide, we configure resources in the template to do the following:

\n
    \n
  • \n

    Create a table in Athena that maps fields to a custom log format

    \n
  • \n
  • \n

    Create a Lambda function that updates the table with new partitions on a daily, weekly, or\n monthly basis

    \n
  • \n
  • \n

    Create a table partitioned between two timestamps in the past

    \n
  • \n
  • \n

    Create a set of named queries in Athena that you can use to get started quickly

    \n
  • \n
" + "smithy.api#documentation": "

Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \n with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \n Based on the information that you provide, we configure resources in the template to do the following:

\n
    \n
  • \n

    Create a table in Athena that maps fields to a custom log format

    \n
  • \n
  • \n

    Create a Lambda function that updates the table with new partitions on a daily, weekly, or\n monthly basis

    \n
  • \n
  • \n

    Create a table partitioned between two timestamps in the past

    \n
  • \n
  • \n

    Create a set of named queries in Athena that you can use to get started quickly

    \n
  • \n
\n \n

\n GetFlowLogsIntegrationTemplate does not support integration between\n Amazon Web Services Transit Gateway Flow Logs and Amazon Athena.

\n
" } }, "com.amazonaws.ec2#GetFlowLogsIntegrationTemplateRequest": { @@ -48677,6 +51024,50 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#GetImageBlockPublicAccessState": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest" + }, + "output": { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessStateResult" + }, + "traits": { + "smithy.api#documentation": "

Gets the current state of block public access for AMIs at the account\n level in the specified Amazon Web Services Region.

\n

For more information, see Block\n public access to your AMIs in the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest": { + "type": "structure", + "members": { + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#GetImageBlockPublicAccessStateResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

The current state of block public access for AMIs at the account level in the specified\n Amazon Web Services Region.

\n

Possible values:

\n
    \n
  • \n

    \n block-new-sharing - Any attempt to publicly share your AMIs in the\n specified Region is blocked.

    \n
  • \n
  • \n

    \n unblocked - Your AMIs in the specified Region can be publicly\n shared.

    \n
  • \n
", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements": { "type": "operation", "input": { @@ -49448,7 +51839,66 @@ "target": "com.amazonaws.ec2#GetLaunchTemplateDataResult" }, "traits": { - "smithy.api#documentation": "

Retrieves the configuration data of the specified instance. You can use this data to\n create a launch template.

\n

This action calls on other describe actions to get instance information. Depending on\n your instance configuration, you may need to allow the following actions in your IAM\n policy: DescribeSpotInstanceRequests,\n DescribeInstanceCreditSpecifications, DescribeVolumes,\n DescribeInstanceAttribute, and DescribeElasticGpus. Or,\n you can allow describe* depending on your instance requirements.

" + "smithy.api#documentation": "

Retrieves the configuration data of the specified instance. You can use this data to\n create a launch template.

\n

This action calls on other describe actions to get instance information. Depending on\n your instance configuration, you may need to allow the following actions in your IAM\n policy: DescribeSpotInstanceRequests,\n DescribeInstanceCreditSpecifications, DescribeVolumes,\n DescribeInstanceAttribute, and DescribeElasticGpus. Or,\n you can allow describe* depending on your instance requirements.

", + "smithy.api#examples": [ + { + "title": "To get the launch template data for an instance ", + "documentation": "This example gets the launch template data for the specified instance.", + "input": { + "InstanceId": "0123d646e8048babc" + }, + "output": { + "LaunchTemplateData": { + "NetworkInterfaces": [ + { + "DeviceIndex": 0, + "Groups": [ + "sg-d14e1bb4" + ], + "Ipv6Addresses": [], + "AssociatePublicIpAddress": false, + "NetworkInterfaceId": "eni-4338b5a9", + "DeleteOnTermination": true, + "Description": "", + "PrivateIpAddress": "10.0.3.233", + "SubnetId": "subnet-5264e837", + "PrivateIpAddresses": [ + { + "PrivateIpAddress": "10.0.3.233", + "Primary": true + } + ] + } + ], + "Placement": { + "GroupName": "", + "Tenancy": "default", + "AvailabilityZone": "us-east-2b" + }, + "InstanceType": "t2.medium", + "EbsOptimized": false, + "BlockDeviceMappings": [ + { + "Ebs": { + "VolumeType": "gp2", + "Encrypted": false, + "Iops": 100, + "VolumeSize": 8, + "SnapshotId": "snap-02594938353ef77d3", + "DeleteOnTermination": true + }, + "DeviceName": "/dev/xvda" + } + ], + "KeyName": "my-key-pair", + "ImageId": "ami-32cf7b4a", + "Monitoring": { + "Enabled": false + } + } + } + } + ] } }, "com.amazonaws.ec2#GetLaunchTemplateDataRequest": { @@ -49884,7 +52334,7 @@ } }, "PasswordData": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#PasswordData", "traits": { "aws.protocols#ec2QueryName": "PasswordData", "smithy.api#documentation": "

The password of the instance. Returns an empty string if the password is not\n available.

", @@ -51429,13 +53879,13 @@ "aws.protocols#ec2QueryName": "Configured", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If this parameter is set to true, your instance is enabled for\n hibernation; otherwise, it is not enabled for hibernation.

", + "smithy.api#documentation": "

If true, your instance is enabled for hibernation; otherwise, it is not\n enabled for hibernation.

", "smithy.api#xmlName": "configured" } } }, "traits": { - "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#HibernationOptionsRequest": { @@ -51446,12 +53896,12 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If you set this parameter to true, your instance is enabled for\n hibernation.

\n

Default: false\n

" + "smithy.api#documentation": "

Set to true to enable your instance for hibernation.

\n

Default: false\n

" } } }, "traits": { - "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#HistoryRecord": { @@ -51692,6 +54142,14 @@ "smithy.api#documentation": "

Indicates whether host maintenance is enabled or disabled for the Dedicated\n Host.

", "smithy.api#xmlName": "hostMaintenance" } + }, + "AssetId": { + "target": "com.amazonaws.ec2#AssetId", + "traits": { + "aws.protocols#ec2QueryName": "AssetId", + "smithy.api#documentation": "

The ID of the Outpost hardware asset on which the Dedicated Host is allocated.

", + "smithy.api#xmlName": "assetId" + } } }, "traits": { @@ -52848,6 +55306,28 @@ } } }, + "com.amazonaws.ec2#ImageBlockPublicAccessDisabledState": { + "type": "enum", + "members": { + "unblocked": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unblocked" + } + } + } + }, + "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState": { + "type": "enum", + "members": { + "block_new_sharing": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "block-new-sharing" + } + } + } + }, "com.amazonaws.ec2#ImageDiskContainer": { "type": "structure", "members": { @@ -53250,7 +55730,7 @@ "KmsKeyId": { "target": "com.amazonaws.ec2#KmsKeyId", "traits": { - "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the AMI is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" + "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the AMI is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" } }, "LicenseType": { @@ -53262,7 +55742,7 @@ "Platform": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The operating system of the virtual machine.

\n

Valid values: Windows | Linux\n

" + "smithy.api#documentation": "

The operating system of the virtual machine. If you import a VM that is compatible with\n Unified Extensible Firmware Interface (UEFI) using an EBS snapshot, you must specify a value for\n the platform.

\n

Valid values: Windows | Linux\n

" } }, "RoleName": { @@ -53606,7 +56086,7 @@ "target": "com.amazonaws.ec2#ImportInstanceResult" }, "traits": { - "smithy.api#documentation": "

Creates an import instance task using metadata from the specified disk image.

\n

This API action supports only single-volume VMs. To import multi-volume VMs, use ImportImage\n instead.

\n

This API action is not supported by the Command Line Interface (CLI). For \n information about using the Amazon EC2 CLI, which is deprecated, see\n Importing a VM to Amazon EC2 in the Amazon EC2 CLI Reference PDF file.

\n

For information about the import manifest referenced by this API action, see VM Import Manifest.

" + "smithy.api#documentation": "\n

We recommend that you use the \n ImportImage\n \n API. For more information, see Importing a VM as an image using VM\n Import/Export in the VM Import/Export User Guide.

\n
\n

Creates an import instance task using metadata from the specified disk image.

\n

This API action is not supported by the Command Line Interface (CLI). For\n information about using the Amazon EC2 CLI, which is deprecated, see Importing\n a VM to Amazon EC2 in the Amazon EC2 CLI Reference PDF file.

\n

This API action supports only single-volume VMs. To import multi-volume VMs, use ImportImage\n instead.

\n

For information about the import manifest referenced by this API action, see VM Import Manifest.

" } }, "com.amazonaws.ec2#ImportInstanceLaunchSpecification": { @@ -54049,7 +56529,7 @@ "KmsKeyId": { "target": "com.amazonaws.ec2#KmsKeyId", "traits": { - "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the snapshot is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" + "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the snapshot is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" } }, "RoleName": { @@ -54327,6 +56807,14 @@ "smithy.api#documentation": "

Describes the Inference accelerators for the instance type.

", "smithy.api#xmlName": "accelerators" } + }, + "TotalInferenceMemoryInMiB": { + "target": "com.amazonaws.ec2#totalInferenceMemory", + "traits": { + "aws.protocols#ec2QueryName": "TotalInferenceMemoryInMiB", + "smithy.api#documentation": "

The total size of the memory for the inference accelerators for the instance type, in MiB.

", + "smithy.api#xmlName": "totalInferenceMemoryInMiB" + } } }, "traits": { @@ -54362,6 +56850,14 @@ "smithy.api#documentation": "

The manufacturer of the Inference accelerator.

", "smithy.api#xmlName": "manufacturer" } + }, + "MemoryInfo": { + "target": "com.amazonaws.ec2#InferenceDeviceMemoryInfo", + "traits": { + "aws.protocols#ec2QueryName": "MemoryInfo", + "smithy.api#documentation": "

Describes the memory available to the inference accelerator.

", + "smithy.api#xmlName": "memoryInfo" + } } }, "traits": { @@ -54377,6 +56873,25 @@ "com.amazonaws.ec2#InferenceDeviceManufacturerName": { "type": "string" }, + "com.amazonaws.ec2#InferenceDeviceMemoryInfo": { + "type": "structure", + "members": { + "SizeInMiB": { + "target": "com.amazonaws.ec2#InferenceDeviceMemorySize", + "traits": { + "aws.protocols#ec2QueryName": "SizeInMiB", + "smithy.api#documentation": "

The size of the memory available to the inference accelerator, in MiB.

", + "smithy.api#xmlName": "sizeInMiB" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the memory available to the inference accelerator.

" + } + }, + "com.amazonaws.ec2#InferenceDeviceMemorySize": { + "type": "integer" + }, "com.amazonaws.ec2#InferenceDeviceName": { "type": "string" }, @@ -55902,6 +58417,16 @@ "smithy.api#documentation": "

The IPv6 address.

", "smithy.api#xmlName": "ipv6Address" } + }, + "IsPrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IsPrimaryIpv6", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. \n For more information, see RunInstances.

", + "smithy.api#xmlName": "isPrimaryIpv6" + } } }, "traits": { @@ -56706,6 +59231,14 @@ "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 delegated prefixes to be automatically assigned to the network interface. \n You cannot use this option if you use the Ipv6Prefix option.

" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" + } } }, "traits": { @@ -56967,7 +59500,7 @@ } }, "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard or with the RunInstances API, you\n can't specify InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#InstanceRequirementsRequest": { @@ -57119,7 +59652,7 @@ "NetworkBandwidthGbps": { "target": "com.amazonaws.ec2#NetworkBandwidthGbpsRequest", "traits": { - "smithy.api#documentation": "

The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).

\n

Default: No minimum or maximum limits

" + "smithy.api#documentation": "

The minimum and maximum amount of baseline network bandwidth, in gigabits per second \n (Gbps). For more information, see Amazon EC2 instance network bandwidth in the Amazon EC2 User Guide.

\n

Default: No minimum or maximum limits

" } }, "AllowedInstanceTypes": { @@ -57131,7 +59664,7 @@ } }, "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard, or with the RunInstances API or\n AWS::EC2::Instance Amazon Web Services CloudFormation resource, you can't specify\n InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#InstanceRequirementsWithMetadataRequest": { @@ -61525,6 +64058,528 @@ "traits": { "smithy.api#enumValue": "i4g.16xlarge" } + }, + "hpc7g_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.4xlarge" + } + }, + "hpc7g_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.8xlarge" + } + }, + "hpc7g_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.16xlarge" + } + }, + "c7gn_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.medium" + } + }, + "c7gn_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.large" + } + }, + "c7gn_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.xlarge" + } + }, + "c7gn_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.2xlarge" + } + }, + "c7gn_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.4xlarge" + } + }, + "c7gn_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.8xlarge" + } + }, + "c7gn_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.12xlarge" + } + }, + "c7gn_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.16xlarge" + } + }, + "p5_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "p5.48xlarge" + } + }, + "m7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.large" + } + }, + "m7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.xlarge" + } + }, + "m7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.2xlarge" + } + }, + "m7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.4xlarge" + } + }, + "m7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.8xlarge" + } + }, + "m7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.12xlarge" + } + }, + "m7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.16xlarge" + } + }, + "m7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.24xlarge" + } + }, + "m7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.48xlarge" + } + }, + "m7i_flex_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.large" + } + }, + "m7i_flex_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.xlarge" + } + }, + "m7i_flex_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.2xlarge" + } + }, + "m7i_flex_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.4xlarge" + } + }, + "m7i_flex_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.8xlarge" + } + }, + "m7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.medium" + } + }, + "m7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.large" + } + }, + "m7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.xlarge" + } + }, + "m7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.2xlarge" + } + }, + "m7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.4xlarge" + } + }, + "m7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.8xlarge" + } + }, + "m7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.12xlarge" + } + }, + "m7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.16xlarge" + } + }, + "m7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.24xlarge" + } + }, + "m7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.32xlarge" + } + }, + "m7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.48xlarge" + } + }, + "m7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.metal-48xl" + } + }, + "hpc7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.12xlarge" + } + }, + "hpc7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.24xlarge" + } + }, + "hpc7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.48xlarge" + } + }, + "hpc7a_96xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.96xlarge" + } + }, + "c7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.medium" + } + }, + "c7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.large" + } + }, + "c7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.xlarge" + } + }, + "c7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.2xlarge" + } + }, + "c7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.4xlarge" + } + }, + "c7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.8xlarge" + } + }, + "c7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.12xlarge" + } + }, + "c7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.16xlarge" + } + }, + "m7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.medium" + } + }, + "m7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.large" + } + }, + "m7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.xlarge" + } + }, + "m7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.2xlarge" + } + }, + "m7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.4xlarge" + } + }, + "m7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.8xlarge" + } + }, + "m7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.12xlarge" + } + }, + "m7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.16xlarge" + } + }, + "r7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.medium" + } + }, + "r7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.large" + } + }, + "r7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.xlarge" + } + }, + "r7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.2xlarge" + } + }, + "r7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.4xlarge" + } + }, + "r7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.8xlarge" + } + }, + "r7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.12xlarge" + } + }, + "r7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.16xlarge" + } + }, + "r7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.medium" + } + }, + "r7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.large" + } + }, + "r7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.xlarge" + } + }, + "r7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.2xlarge" + } + }, + "r7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.4xlarge" + } + }, + "r7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.8xlarge" + } + }, + "r7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.12xlarge" + } + }, + "r7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.16xlarge" + } + }, + "r7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.24xlarge" + } + }, + "r7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.32xlarge" + } + }, + "r7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.48xlarge" + } + }, + "c7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.large" + } + }, + "c7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.xlarge" + } + }, + "c7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.2xlarge" + } + }, + "c7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.4xlarge" + } + }, + "c7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.8xlarge" + } + }, + "c7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.12xlarge" + } + }, + "c7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.16xlarge" + } + }, + "c7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.24xlarge" + } + }, + "c7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.48xlarge" + } + }, + "mac2_m2pro_metal": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mac2-m2pro.metal" + } } } }, @@ -61712,7 +64767,7 @@ "target": "com.amazonaws.ec2#BurstablePerformanceFlag", "traits": { "aws.protocols#ec2QueryName": "BurstablePerformanceSupported", - "smithy.api#documentation": "

Indicates whether the instance type is a burstable performance instance type.

", + "smithy.api#documentation": "

Indicates whether the instance type is a burstable performance T instance \n type. For more information, see Burstable \n performance instances.

", "smithy.api#xmlName": "burstablePerformanceSupported" } }, @@ -61739,6 +64794,30 @@ "smithy.api#documentation": "

The supported boot modes. For more information, see Boot modes in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "supportedBootModes" } + }, + "NitroEnclavesSupport": { + "target": "com.amazonaws.ec2#NitroEnclavesSupport", + "traits": { + "aws.protocols#ec2QueryName": "NitroEnclavesSupport", + "smithy.api#documentation": "

Indicates whether Nitro Enclaves is supported.

", + "smithy.api#xmlName": "nitroEnclavesSupport" + } + }, + "NitroTpmSupport": { + "target": "com.amazonaws.ec2#NitroTpmSupport", + "traits": { + "aws.protocols#ec2QueryName": "NitroTpmSupport", + "smithy.api#documentation": "

Indicates whether NitroTPM is supported.

", + "smithy.api#xmlName": "nitroTpmSupport" + } + }, + "NitroTpmInfo": { + "target": "com.amazonaws.ec2#NitroTpmInfo", + "traits": { + "aws.protocols#ec2QueryName": "NitroTpmInfo", + "smithy.api#documentation": "

Describes the supported NitroTPM versions for the instance type.

", + "smithy.api#xmlName": "nitroTpmInfo" + } } }, "traits": { @@ -62006,7 +65085,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes the attachment of a VPC to an internet gateway or an egress-only internet\n\t\t\tgateway.

" + "smithy.api#documentation": "

Describes the attachment of a VPC to an internet gateway or an egress-only internet gateway.

" } }, "com.amazonaws.ec2#InternetGatewayAttachmentList": { @@ -62107,7 +65186,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "IpProtocol", - "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp, icmpv6) \n or number (see Protocol Numbers).

\n

[VPC only] Use -1 to specify all protocols. When authorizing\n security group rules, specifying -1 or a protocol number other than\n tcp, udp, icmp, or icmpv6 allows\n traffic on all ports, regardless of any port range you specify. For tcp,\n udp, and icmp, you must specify a port range. For icmpv6,\n the port range is optional; if you omit the port range, traffic for all types and codes is allowed.

", + "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp, icmpv6) \n or number (see Protocol Numbers).

\n

Use -1 to specify all protocols. When authorizing\n security group rules, specifying -1 or a protocol number other than\n tcp, udp, icmp, or icmpv6 allows\n traffic on all ports, regardless of any port range you specify. For tcp,\n udp, and icmp, you must specify a port range. For icmpv6,\n the port range is optional; if you omit the port range, traffic for all types and codes is allowed.

", "smithy.api#xmlName": "ipProtocol" } }, @@ -62123,7 +65202,7 @@ "target": "com.amazonaws.ec2#Ipv6RangeList", "traits": { "aws.protocols#ec2QueryName": "Ipv6Ranges", - "smithy.api#documentation": "

[VPC only] The IPv6 ranges.

", + "smithy.api#documentation": "

The IPv6 ranges.

", "smithy.api#xmlName": "ipv6Ranges" } }, @@ -62131,7 +65210,7 @@ "target": "com.amazonaws.ec2#PrefixListIdList", "traits": { "aws.protocols#ec2QueryName": "PrefixListIds", - "smithy.api#documentation": "

[VPC only] The prefix list IDs.

", + "smithy.api#documentation": "

The prefix list IDs.

", "smithy.api#xmlName": "prefixListIds" } }, @@ -64598,7 +67677,7 @@ } }, "traits": { - "smithy.api#documentation": "

[EC2-VPC only] Describes an IPv6 range.

" + "smithy.api#documentation": "

Describes an IPv6 range.

" } }, "com.amazonaws.ec2#Ipv6RangeList": { @@ -65293,7 +68372,7 @@ "target": "com.amazonaws.ec2#FleetLaunchTemplateSpecification", "traits": { "aws.protocols#ec2QueryName": "LaunchTemplateSpecification", - "smithy.api#documentation": "

The launch template.

", + "smithy.api#documentation": "

The launch template to use. Make sure that the launch template does not contain the\n NetworkInterfaceId parameter because you can't specify a network interface\n ID in a Spot Fleet.

", "smithy.api#xmlName": "launchTemplateSpecification" } }, @@ -65346,7 +68425,7 @@ "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { "aws.protocols#ec2QueryName": "AmdSevSnp", - "smithy.api#documentation": "

Indicates whether the instance is enabled for \n AMD SEV-SNP.

", + "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "amdSevSnp" } } @@ -65377,7 +68456,7 @@ "AmdSevSnp": { "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { - "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only.

" + "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only. For more information, see \n AMD SEV-SNP.

" } } }, @@ -66204,6 +69283,16 @@ "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigned to the network\n interface.

", "smithy.api#xmlName": "ipv6PrefixCount" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "PrimaryIpv6", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

", + "smithy.api#xmlName": "primaryIpv6" + } } }, "traits": { @@ -66356,6 +69445,14 @@ "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes to be automatically assigned to the network interface. You\n cannot use this option if you use the Ipv6Prefix option.

" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" + } } }, "traits": { @@ -68209,6 +71306,12 @@ "traits": { "smithy.api#enumValue": "availability-zone-id" } + }, + "outpost": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "outpost" + } } } }, @@ -69538,7 +72641,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified AMI. You can specify only one attribute at a time.

\n

To specify the attribute, you can use the Attribute parameter, or one of the following parameters: \n Description, ImdsSupport, or LaunchPermission.

\n

Images with an Amazon Web Services Marketplace product code cannot be made public.

\n

To enable the SriovNetSupport enhanced networking attribute of an image, enable SriovNetSupport on an instance \n and create an AMI from the instance.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified AMI. You can specify only one attribute at a time.

\n

To specify the attribute, you can use the Attribute parameter, or one of the following parameters: \n Description, ImdsSupport, or LaunchPermission.

\n

Images with an Amazon Web Services Marketplace product code cannot be made public.

\n

To enable the SriovNetSupport enhanced networking attribute of an image, enable SriovNetSupport on an instance \n and create an AMI from the instance.

", + "smithy.api#examples": [ + { + "title": "To make an AMI public", + "documentation": "This example makes the specified AMI public.", + "input": { + "ImageId": "ami-5731123e", + "LaunchPermission": { + "Add": [ + { + "Group": "all" + } + ] + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyImageAttributeRequest": { @@ -69648,7 +72768,20 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified instance. You can specify only one\n attribute at a time.

\n

\n Note: Using this action to change the security groups\n associated with an elastic network interface (ENI) attached to an instance can\n result in an error if the instance has more than one ENI. To change the security groups\n associated with an ENI attached to an instance that has multiple ENIs, we recommend that\n you use the ModifyNetworkInterfaceAttribute action.

\n

To modify some attributes, the instance must be stopped. For more information, see\n Modify a stopped instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified instance. You can specify only one\n attribute at a time.

\n

\n Note: Using this action to change the security groups\n associated with an elastic network interface (ENI) attached to an instance can\n result in an error if the instance has more than one ENI. To change the security groups\n associated with an ENI attached to an instance that has multiple ENIs, we recommend that\n you use the ModifyNetworkInterfaceAttribute action.

\n

To modify some attributes, the instance must be stopped. For more information, see\n Modify a stopped instance in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To modify the instance type", + "documentation": "This example modifies the instance type of the specified stopped instance.", + "input": { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": { + "Value": "m5.large" + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyInstanceAttributeRequest": { @@ -70182,7 +73315,7 @@ "HttpProtocolIpv6": { "target": "com.amazonaws.ec2#InstanceMetadataProtocolState", "traits": { - "smithy.api#documentation": "

Enables or disables the IPv6 endpoint for the instance metadata service. This setting\n applies only if you have enabled the HTTP metadata endpoint.

" + "smithy.api#documentation": "

Enables or disables the IPv6 endpoint for the instance metadata service. \n Applies only if you enabled the HTTP metadata endpoint.

" } }, "InstanceMetadataTags": { @@ -70271,7 +73404,7 @@ "target": "com.amazonaws.ec2#HostTenancy", "traits": { "aws.protocols#ec2QueryName": "Tenancy", - "smithy.api#documentation": "

The tenancy for the instance.

\n \n

For T3 instances, you can't change the tenancy from dedicated to\n host, or from host to dedicated.\n Attempting to make one of these unsupported tenancy changes results in the\n InvalidTenancy error code.

\n
", + "smithy.api#documentation": "

The tenancy for the instance.

\n \n

For T3 instances, you must launch the instance on a Dedicated Host to use a\n tenancy of host. You can't change the tenancy from\n host to dedicated or default.\n Attempting to make one of these unsupported tenancy changes results in an\n InvalidRequest error code.

\n
", "smithy.api#xmlName": "tenancy" } }, @@ -70286,7 +73419,7 @@ "HostResourceGroupArn": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The ARN of the host resource group in which to place the instance.

" + "smithy.api#documentation": "

The ARN of the host resource group in which to place the instance. The instance must\n have a tenancy of host to specify this parameter.

" } }, "GroupId": { @@ -70732,7 +73865,27 @@ "target": "com.amazonaws.ec2#ModifyLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Modifies a launch template. You can specify which version of the launch template to\n set as the default version. When launching an instance, the default version applies when\n a launch template version is not specified.

" + "smithy.api#documentation": "

Modifies a launch template. You can specify which version of the launch template to\n set as the default version. When launching an instance, the default version applies when\n a launch template version is not specified.

", + "smithy.api#examples": [ + { + "title": "To change the default version of a launch template", + "documentation": "This example specifies version 2 as the default version of the specified launch template.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "DefaultVersion": "2" + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 2, + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "WebServers", + "DefaultVersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-12-01T13:35:46.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#ModifyLaunchTemplateRequest": { @@ -70965,7 +74118,20 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified network interface attribute. You can specify only one\n attribute at a time. You can use this action to attach and detach security groups from\n an existing EC2 instance.

" + "smithy.api#documentation": "

Modifies the specified network interface attribute. You can specify only one\n attribute at a time. You can use this action to attach and detach security groups from\n an existing EC2 instance.

", + "smithy.api#examples": [ + { + "title": "To modify the attachment attribute of a network interface", + "documentation": "This example modifies the attachment attribute of the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-686ea200", + "Attachment": { + "AttachmentId": "eni-attach-43348162", + "DeleteOnTermination": false + } + } + } + ] } }, "com.amazonaws.ec2#ModifyNetworkInterfaceAttributeRequest": { @@ -71027,6 +74193,14 @@ "traits": { "smithy.api#documentation": "

Updates the ENA Express configuration for the network interface that’s attached to the\n\t\t\tinstance.

" } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

If you’re modifying a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use\n this option if the instance that this ENI will be attached to relies on its IPv6 address\n not changing. Amazon Web Services will automatically assign an IPv6 address associated\n with the ENI attached to your instance to be the primary IPv6 address. Once you enable\n an IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" + } } }, "traits": { @@ -71246,7 +74420,22 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Adds or removes permission settings for the specified snapshot. You may add or remove\n specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\n do both in a single operation. If you need to both add and remove account IDs for a snapshot,\n you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.

\n

Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\n public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Adds or removes permission settings for the specified snapshot. You may add or remove\n specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\n do both in a single operation. If you need to both add and remove account IDs for a snapshot,\n you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.

\n

Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\n public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To modify a snapshot attribute", + "documentation": "This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0", + "Attribute": "createVolumePermission", + "OperationType": "remove", + "UserIds": [ + "123456789012" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifySnapshotAttributeRequest": { @@ -71382,7 +74571,20 @@ "target": "com.amazonaws.ec2#ModifySpotFleetRequestResponse" }, "traits": { - "smithy.api#documentation": "

Modifies the specified Spot Fleet request.

\n

You can only modify a Spot Fleet request of type maintain.

\n

While the Spot Fleet request is being modified, it is in the modifying\n state.

\n

To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\n additional Spot Instances according to the allocation strategy for the Spot Fleet\n request. If the allocation strategy is lowestPrice, the Spot Fleet launches\n instances using the Spot Instance pool with the lowest price. If the allocation strategy\n is diversified, the Spot Fleet distributes the instances across the Spot\n Instance pools. If the allocation strategy is capacityOptimized, Spot Fleet\n launches instances from Spot Instance pools with optimal capacity for the number of instances\n that are launching.

\n

To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\n cancels any open requests that exceed the new target capacity. You can request that the\n Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\n new target capacity. If the allocation strategy is lowestPrice, the Spot\n Fleet terminates the instances with the highest price per unit. If the allocation\n strategy is capacityOptimized, the Spot Fleet terminates the instances in\n the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\n strategy is diversified, the Spot Fleet terminates instances across the\n Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\n at its current size, but not replace any Spot Instances that are interrupted or that you\n terminate manually.

\n

If you are finished with your Spot Fleet for now, but will use it again later, you can\n set the target capacity to 0.

" + "smithy.api#documentation": "

Modifies the specified Spot Fleet request.

\n

You can only modify a Spot Fleet request of type maintain.

\n

While the Spot Fleet request is being modified, it is in the modifying\n state.

\n

To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\n additional Spot Instances according to the allocation strategy for the Spot Fleet\n request. If the allocation strategy is lowestPrice, the Spot Fleet launches\n instances using the Spot Instance pool with the lowest price. If the allocation strategy\n is diversified, the Spot Fleet distributes the instances across the Spot\n Instance pools. If the allocation strategy is capacityOptimized, Spot Fleet\n launches instances from Spot Instance pools with optimal capacity for the number of instances\n that are launching.

\n

To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\n cancels any open requests that exceed the new target capacity. You can request that the\n Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\n new target capacity. If the allocation strategy is lowestPrice, the Spot\n Fleet terminates the instances with the highest price per unit. If the allocation\n strategy is capacityOptimized, the Spot Fleet terminates the instances in\n the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\n strategy is diversified, the Spot Fleet terminates instances across the\n Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\n at its current size, but not replace any Spot Instances that are interrupted or that you\n terminate manually.

\n

If you are finished with your Spot Fleet for now, but will use it again later, you can\n set the target capacity to 0.

", + "smithy.api#examples": [ + { + "title": "To increase the target capacity of a Spot fleet request", + "documentation": "This example increases the target capacity of the specified Spot fleet request.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "TargetCapacity": 20 + }, + "output": { + "Return": true + } + } + ] } }, "com.amazonaws.ec2#ModifySpotFleetRequestRequest": { @@ -71471,7 +74673,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies a subnet attribute. You can only modify one attribute at a time.

\n

Use this action to modify subnets on Amazon Web Services Outposts.

\n
    \n
  • \n

    To modify a subnet on an Outpost rack, set both\n MapCustomerOwnedIpOnLaunch and\n CustomerOwnedIpv4Pool. These two parameters act as a single\n attribute.

    \n
  • \n
  • \n

    To modify a subnet on an Outpost server, set either\n EnableLniAtDeviceIndex or\n DisableLniAtDeviceIndex.

    \n
  • \n
\n

For more information about Amazon Web Services Outposts, see the following:

\n " + "smithy.api#documentation": "

Modifies a subnet attribute. You can only modify one attribute at a time.

\n

Use this action to modify subnets on Amazon Web Services Outposts.

\n
    \n
  • \n

    To modify a subnet on an Outpost rack, set both\n MapCustomerOwnedIpOnLaunch and\n CustomerOwnedIpv4Pool. These two parameters act as a single\n attribute.

    \n
  • \n
  • \n

    To modify a subnet on an Outpost server, set either\n EnableLniAtDeviceIndex or\n DisableLniAtDeviceIndex.

    \n
  • \n
\n

For more information about Amazon Web Services Outposts, see the following:

\n ", + "smithy.api#examples": [ + { + "title": "To change a subnet's public IP addressing behavior", + "documentation": "This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.", + "input": { + "SubnetId": "subnet-1a2b3c4d", + "MapPublicIpOnLaunch": { + "Value": true + } + } + } + ] } }, "com.amazonaws.ec2#ModifySubnetAttributeRequest": { @@ -71777,7 +74991,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": 0, - "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

" + "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

\n

For sessions with Network Load Balancer (NLB) traffic mirror targets, the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { @@ -72798,7 +76012,21 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies a volume attribute.

\n

By default, all I/O operations for the volume are suspended when the data on the volume is\n determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\n The I/O access to the volume can be resumed by first enabling I/O access and then checking the\n data consistency on your volume.

\n

You can change the default behavior to resume I/O operations. We recommend that you change\n this only for boot volumes or for volumes that are stateless or disposable.

" + "smithy.api#documentation": "

Modifies a volume attribute.

\n

By default, all I/O operations for the volume are suspended when the data on the volume is\n determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\n The I/O access to the volume can be resumed by first enabling I/O access and then checking the\n data consistency on your volume.

\n

You can change the default behavior to resume I/O operations. We recommend that you change\n this only for boot volumes or for volumes that are stateless or disposable.

", + "smithy.api#examples": [ + { + "title": "To modify a volume attribute", + "documentation": "This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.", + "input": { + "DryRun": true, + "VolumeId": "vol-1234567890abcdef0", + "AutoEnableIO": { + "Value": true + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyVolumeAttributeRequest": { @@ -72920,7 +76148,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified VPC.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified VPC.

", + "smithy.api#examples": [ + { + "title": "To modify the enableDnsSupport attribute", + "documentation": "This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.", + "input": { + "VpcId": "vpc-a01106c2", + "EnableDnsSupport": { + "Value": false + } + } + } + ] } }, "com.amazonaws.ec2#ModifyVpcAttributeRequest": { @@ -73101,14 +76341,14 @@ "AddSecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the network interface.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the endpoint network interfaces.

", "smithy.api#xmlName": "AddSecurityGroupId" } }, "RemoveSecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to disassociate from the network interface.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to disassociate from the endpoint network interfaces.

", "smithy.api#xmlName": "RemoveSecurityGroupId" } }, @@ -73129,7 +76369,14 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the\n VPC.

" + "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the VPC.

" + } + }, + "SubnetConfigurations": { + "target": "com.amazonaws.ec2#SubnetConfigurationsList", + "traits": { + "smithy.api#documentation": "

The subnet configurations for the endpoint.

", + "smithy.api#xmlName": "SubnetConfiguration" } } }, @@ -73418,7 +76665,7 @@ "target": "com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Modifies the VPC peering connection options on one side of a VPC peering connection. You can do the following:

\n
    \n
  • \n

    Enable/disable communication over the peering connection between an EC2-Classic instance that's linked to your VPC (using ClassicLink) and instances in the peer VPC.

    \n
  • \n
  • \n

    Enable/disable communication over the peering connection between instances in your VPC and an EC2-Classic instance that's linked to the peer VPC.

    \n
  • \n
  • \n

    Enable/disable the ability to resolve public DNS hostnames to private IP\n addresses when queried from instances in the peer VPC.

    \n
  • \n
\n

If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\n resolution for queries from the local VPC. This ensures that queries from the local VPC\n resolve to private IP addresses in the peer VPC. This option is not available if the\n peered VPCs are in different Amazon Web Services accounts or different Regions. For\n peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\n owner must initiate a separate request to modify the peering connection options. For\n inter-region peering connections, you must use the Region for the requester VPC to\n modify the requester VPC peering options and the Region for the accepter VPC to modify\n the accepter VPC peering options. To verify which VPCs are the accepter and the\n requester for a VPC peering connection, use the DescribeVpcPeeringConnections command.

" + "smithy.api#documentation": "

Modifies the VPC peering connection options on one side of a VPC peering connection.

\n

If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\n resolution for queries from the local VPC. This ensures that queries from the local VPC\n resolve to private IP addresses in the peer VPC. This option is not available if the\n peered VPCs are in different Amazon Web Services accounts or different Regions. For\n peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\n owner must initiate a separate request to modify the peering connection options. For\n inter-region peering connections, you must use the Region for the requester VPC to\n modify the requester VPC peering options and the Region for the accepter VPC to modify\n the accepter VPC peering options. To verify which VPCs are the accepter and the\n requester for a VPC peering connection, use the DescribeVpcPeeringConnections command.

" } }, "com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsRequest": { @@ -73490,7 +76737,7 @@ "target": "com.amazonaws.ec2#ModifyVpcTenancyResult" }, "traits": { - "smithy.api#documentation": "

Modifies the instance tenancy attribute of the specified VPC. You can change the\n instance tenancy attribute of a VPC to default only. You cannot change the\n instance tenancy attribute to dedicated.

\n

After you modify the tenancy of the VPC, any new instances that you launch into the\n VPC have a tenancy of default, unless you specify otherwise during launch.\n The tenancy of any existing instances in the VPC is not affected.

\n

For more information, see Dedicated Instances in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Modifies the instance tenancy attribute of the specified VPC. You can change the\n instance tenancy attribute of a VPC to default only. You cannot change the\n instance tenancy attribute to dedicated.

\n

After you modify the tenancy of the VPC, any new instances that you launch into the\n VPC have a tenancy of default, unless you specify otherwise during launch.\n The tenancy of any existing instances in the VPC is not affected.

\n

For more information, see Dedicated Instances in the\n\t\t\t\tAmazon EC2 User Guide.

" } }, "com.amazonaws.ec2#ModifyVpcTenancyRequest": { @@ -73841,7 +77088,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and the customer gateway.

\n

Constraints: Allowed characters are alphanumeric characters, periods (.), and\n underscores (_). Must be between 8 and 64 characters in length and cannot start with\n zero (0).

" } @@ -73971,7 +77218,8 @@ } }, "traits": { - "smithy.api#documentation": "

The Amazon Web Services Site-to-Site VPN tunnel options to modify.

" + "smithy.api#documentation": "

The Amazon Web Services Site-to-Site VPN tunnel options to modify.

", + "smithy.api#sensitive": {} } }, "com.amazonaws.ec2#MonitorInstances": { @@ -74083,7 +77331,19 @@ "target": "com.amazonaws.ec2#MoveAddressToVpcResult" }, "traits": { - "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\n Elastic IP address must be allocated to your account for more than 24 hours, and it must not\n be associated with an instance. After the Elastic IP address is moved, it is no longer\n available for use in the EC2-Classic platform, unless you move it back using the\n RestoreAddressToClassic request. You cannot move an Elastic IP address that was\n originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\n Elastic IP address must be allocated to your account for more than 24 hours, and it must not\n be associated with an instance. After the Elastic IP address is moved, it is no longer\n available for use in the EC2-Classic platform, unless you move it back using the\n RestoreAddressToClassic request. You cannot move an Elastic IP address that was\n originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.

", + "smithy.api#examples": [ + { + "title": "To move an address to EC2-VPC", + "documentation": "This example moves the specified Elastic IP address to the EC2-VPC platform.", + "input": { + "PublicIp": "54.123.4.56" + }, + "output": { + "Status": "MoveInProgress" + } + } + ] } }, "com.amazonaws.ec2#MoveAddressToVpcRequest": { @@ -74575,7 +77835,7 @@ "target": "com.amazonaws.ec2#NetworkAclEntryList", "traits": { "aws.protocols#ec2QueryName": "EntrySet", - "smithy.api#documentation": "

One or more entries (rules) in the network ACL.

", + "smithy.api#documentation": "

The entries (rules) in the network ACL.

", "smithy.api#xmlName": "entrySet" } }, @@ -74857,6 +78117,22 @@ "smithy.api#documentation": "

The maximum number of network interfaces for the network card.

", "smithy.api#xmlName": "maximumNetworkInterfaces" } + }, + "BaselineBandwidthInGbps": { + "target": "com.amazonaws.ec2#BaselineBandwidthInGbps", + "traits": { + "aws.protocols#ec2QueryName": "BaselineBandwidthInGbps", + "smithy.api#documentation": "

The baseline network performance of the network card, in Gbps.

", + "smithy.api#xmlName": "baselineBandwidthInGbps" + } + }, + "PeakBandwidthInGbps": { + "target": "com.amazonaws.ec2#PeakBandwidthInGbps", + "traits": { + "aws.protocols#ec2QueryName": "PeakBandwidthInGbps", + "smithy.api#documentation": "

The peak (burst) network performance of the network card, in Gbps.

", + "smithy.api#xmlName": "peakBandwidthInGbps" + } } }, "traits": { @@ -76057,6 +79333,16 @@ "smithy.api#documentation": "

The IPv6 address.

", "smithy.api#xmlName": "ipv6Address" } + }, + "IsPrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IsPrimaryIpv6", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information, see ModifyNetworkInterfaceAttribute.

", + "smithy.api#xmlName": "isPrimaryIpv6" + } } }, "traits": { @@ -76418,7 +79704,7 @@ "Values": { "target": "com.amazonaws.ec2#ValueStringList", "traits": { - "smithy.api#documentation": "

One or more values for the DHCP option.

", + "smithy.api#documentation": "

The values for the DHCP option.

", "smithy.api#xmlName": "Value" } } @@ -76439,6 +79725,68 @@ "com.amazonaws.ec2#NextToken": { "type": "string" }, + "com.amazonaws.ec2#NitroEnclavesSupport": { + "type": "enum", + "members": { + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "SUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "supported" + } + } + } + }, + "com.amazonaws.ec2#NitroTpmInfo": { + "type": "structure", + "members": { + "SupportedVersions": { + "target": "com.amazonaws.ec2#NitroTpmSupportedVersionsList", + "traits": { + "aws.protocols#ec2QueryName": "SupportedVersions", + "smithy.api#documentation": "

Indicates the supported NitroTPM versions.

", + "smithy.api#xmlName": "supportedVersions" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the supported NitroTPM versions for the instance type.

" + } + }, + "com.amazonaws.ec2#NitroTpmSupport": { + "type": "enum", + "members": { + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "SUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "supported" + } + } + } + }, + "com.amazonaws.ec2#NitroTpmSupportedVersionType": { + "type": "string" + }, + "com.amazonaws.ec2#NitroTpmSupportedVersionsList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#NitroTpmSupportedVersionType", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#OccurrenceDayRequestSet": { "type": "list", "member": { @@ -76911,6 +80259,12 @@ } } }, + "com.amazonaws.ec2#PasswordData": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#PathComponent": { "type": "structure", "members": { @@ -77272,6 +80626,9 @@ "smithy.api#documentation": "

Describes the data that identifies an Amazon FPGA image (AFI) on the PCI bus.

" } }, + "com.amazonaws.ec2#PeakBandwidthInGbps": { + "type": "double" + }, "com.amazonaws.ec2#PeeringAttachmentStatus": { "type": "structure", "members": { @@ -77315,7 +80672,7 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from an EC2-Classic instance that's linked to\n a local VPC using ClassicLink to instances in a peer VPC.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } }, @@ -77325,13 +80682,13 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from instances in a local VPC to an\n EC2-Classic instance that's linked to a peer VPC using ClassicLink.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the VPC peering connection options.

" + "smithy.api#documentation": "

Describes the VPC peering connection options.

" } }, "com.amazonaws.ec2#PeeringConnectionOptionsRequest": { @@ -77342,7 +80699,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses when queried from instances in the peer VPC.

" + "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses \n when queried from instances in the peer VPC.

" } }, "AllowEgressFromLocalClassicLinkToRemoteVpc": { @@ -77350,7 +80707,7 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from an EC2-Classic instance that's linked to\n a local VPC using ClassicLink to instances in a peer VPC.

" + "smithy.api#documentation": "

Deprecated.

" } }, "AllowEgressFromLocalVpcToRemoteClassicLink": { @@ -77358,12 +80715,12 @@ "traits": { "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from instances in a local VPC to an\n EC2-Classic instance that's linked to a peer VPC using ClassicLink.

" + "smithy.api#documentation": "

Deprecated.

" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

The VPC peering connection options.

" + "smithy.api#documentation": "

The VPC peering connection options.

" } }, "com.amazonaws.ec2#PeeringTgwInfo": { @@ -77913,7 +81270,7 @@ "com.amazonaws.ec2#PlacementGroupArn": { "type": "string", "traits": { - "smithy.api#pattern": "^arn:aws([a-z-]+)?:ec2:[a-z\\d-]+:\\d{12}:placement-group/([^\\s].+[^\\s]){1,255}$" + "smithy.api#pattern": "^arn:aws([a-z-]+)?:ec2:[a-z\\d-]+:\\d{12}:placement-group/^.{1,255}$" } }, "com.amazonaws.ec2#PlacementGroupId": { @@ -78877,7 +82234,7 @@ "target": "com.amazonaws.ec2#SupportedAdditionalProcessorFeatureList", "traits": { "aws.protocols#ec2QueryName": "SupportedFeatures", - "smithy.api#documentation": "

Indicates whether the instance type supports AMD SEV-SNP. If the request returns \n amd-sev-snp, AMD SEV-SNP is supported. Otherwise, it is not supported.

", + "smithy.api#documentation": "

Indicates whether the instance type supports AMD SEV-SNP. If the request returns \n amd-sev-snp, AMD SEV-SNP is supported. Otherwise, it is not supported. \n For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "supportedFeatures" } } @@ -79940,7 +83297,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Requests a reboot of the specified instances. This operation is asynchronous; it only\n queues a request to reboot the specified instances. The operation succeeds if the\n instances are valid and belong to you. Requests to reboot terminated instances are\n ignored.

\n

If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\n hard reboot.

\n

For more information about troubleshooting, see Troubleshoot an unreachable\n instance in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Requests a reboot of the specified instances. This operation is asynchronous; it only\n queues a request to reboot the specified instances. The operation succeeds if the\n instances are valid and belong to you. Requests to reboot terminated instances are\n ignored.

\n

If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\n hard reboot.

\n

For more information about troubleshooting, see Troubleshoot an unreachable\n instance in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To reboot an EC2 instance", + "documentation": "This example reboots the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef5" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#RebootInstancesRequest": { @@ -80795,7 +84164,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Releases the specified Elastic IP address.

\n

[Default VPC] Releasing an Elastic IP address automatically disassociates it\n\t\t\t\tfrom any instance that it's associated with. To disassociate an Elastic IP address without\n\t\t\t\treleasing it, use DisassociateAddress.

\n

[Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic IP address\n\t\t\t before you can release it. Otherwise, Amazon EC2 returns an error (InvalidIPAddress.InUse).

\n

After releasing an Elastic IP address, it is released to the IP address pool. \n Be sure to update your DNS records and any servers or devices that communicate with the address. \n If you attempt to release an Elastic IP address that you already released, you'll get an\n AuthFailure error if the address is already allocated to another Amazon Web Services account.

\n

After you release an Elastic IP address, you might be able to recover it.\n For more information, see AllocateAddress.

" + "smithy.api#documentation": "

Releases the specified Elastic IP address.

\n

[Default VPC] Releasing an Elastic IP address automatically disassociates it\n\t\t\t\tfrom any instance that it's associated with. To disassociate an Elastic IP address without\n\t\t\t\treleasing it, use DisassociateAddress.

\n

[Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic IP address\n\t\t\t before you can release it. Otherwise, Amazon EC2 returns an error (InvalidIPAddress.InUse).

\n

After releasing an Elastic IP address, it is released to the IP address pool. \n Be sure to update your DNS records and any servers or devices that communicate with the address. \n If you attempt to release an Elastic IP address that you already released, you'll get an\n AuthFailure error if the address is already allocated to another Amazon Web Services account.

\n

After you release an Elastic IP address, you might be able to recover it.\n For more information, see AllocateAddress.

", + "smithy.api#examples": [ + { + "title": "To release an Elastic IP address", + "documentation": "This example releases the specified Elastic IP address.", + "input": { + "AllocationId": "eipalloc-64d5890a" + } + } + ] } }, "com.amazonaws.ec2#ReleaseAddressRequest": { @@ -80897,7 +84275,7 @@ "target": "com.amazonaws.ec2#ReleaseIpamPoolAllocationResult" }, "traits": { - "smithy.api#documentation": "

Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using ModifyIpamResourceCidr. For more information, see Release an allocation in the Amazon VPC IPAM User Guide.\n

\n \n

All EC2 API actions follow an eventual consistency model.

\n
" + "smithy.api#documentation": "

Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using ModifyIpamResourceCidr. For more information, see Release an allocation in the Amazon VPC IPAM User Guide.\n

\n \n

All EC2 API actions follow an eventual consistency model.

\n
" } }, "com.amazonaws.ec2#ReleaseIpamPoolAllocationRequest": { @@ -81073,7 +84451,20 @@ "target": "com.amazonaws.ec2#ReplaceNetworkAclAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network\n\t\t\tACLs in the Amazon Virtual Private Cloud User Guide.

\n

This is an idempotent operation.

" + "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network ACLs in the Amazon VPC User Guide.

\n

This is an idempotent operation.

", + "smithy.api#examples": [ + { + "title": "To replace the network ACL associated with a subnet", + "documentation": "This example associates the specified network ACL with the subnet for the specified network ACL association.", + "input": { + "AssociationId": "aclassoc-e5b95c8c", + "NetworkAclId": "acl-5fb85d36" + }, + "output": { + "NewAssociationId": "aclassoc-3999875b" + } + } + ] } }, "com.amazonaws.ec2#ReplaceNetworkAclAssociationRequest": { @@ -81139,7 +84530,25 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To replace a network ACL entry", + "documentation": "This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Protocol": "17", + "RuleAction": "allow", + "Egress": false, + "CidrBlock": "203.0.113.12/24", + "PortRange": { + "From": 53, + "To": 53 + } + } + } + ] } }, "com.amazonaws.ec2#ReplaceNetworkAclEntryRequest": { @@ -81396,7 +84805,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To replace a route", + "documentation": "This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "10.0.0.0/16", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#ReplaceRouteRequest": { @@ -81544,7 +84964,20 @@ "target": "com.amazonaws.ec2#ReplaceRouteTableAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon Virtual Private Cloud User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

" + "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon VPC User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

", + "smithy.api#examples": [ + { + "title": "To replace the route table associated with a subnet", + "documentation": "This example associates the specified route table with the subnet for the specified route table association.", + "input": { + "AssociationId": "rtbassoc-781d0d1a", + "RouteTableId": "rtb-22574640" + }, + "output": { + "NewAssociationId": "rtbassoc-3a1f0f58" + } + } + ] } }, "com.amazonaws.ec2#ReplaceRouteTableAssociationRequest": { @@ -82193,7 +85626,7 @@ "InstanceRequirements": { "target": "com.amazonaws.ec2#InstanceRequirementsRequest", "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

If you specify InstanceRequirements, you can't specify\n InstanceType.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard, or with the RunInstances API or\n AWS::EC2::Instance Amazon Web Services CloudFormation resource, you can't specify InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "PrivateDnsNameOptions": { @@ -82230,7 +85663,39 @@ "target": "com.amazonaws.ec2#RequestSpotFleetResponse" }, "traits": { - "smithy.api#documentation": "

Creates a Spot Fleet request.

\n

The Spot Fleet request specifies the total target capacity and the On-Demand target\n capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\n capacity, and launches the difference as Spot capacity.

\n

You can submit a single request that includes multiple launch specifications that vary\n by instance type, AMI, Availability Zone, or subnet.

\n

By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\n price per unit is the lowest. Each launch specification can include its own instance\n weighting that reflects the value of the instance type to your application\n workload.

\n

Alternatively, you can specify that the Spot Fleet distribute the target capacity\n across the Spot pools included in its launch specifications. By ensuring that the Spot\n Instances in your Spot Fleet are in different Spot pools, you can improve the\n availability of your fleet.

\n

You can specify tags for the Spot Fleet request and instances launched by the fleet.\n You cannot tag other resource types in a Spot Fleet request because only the\n spot-fleet-request and instance resource types are\n supported.

\n

For more information, see Spot Fleet requests\n in the Amazon EC2 User Guide.

\n \n

We strongly discourage using the RequestSpotFleet API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide.

\n
" + "smithy.api#documentation": "

Creates a Spot Fleet request.

\n

The Spot Fleet request specifies the total target capacity and the On-Demand target\n capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\n capacity, and launches the difference as Spot capacity.

\n

You can submit a single request that includes multiple launch specifications that vary\n by instance type, AMI, Availability Zone, or subnet.

\n

By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\n price per unit is the lowest. Each launch specification can include its own instance\n weighting that reflects the value of the instance type to your application\n workload.

\n

Alternatively, you can specify that the Spot Fleet distribute the target capacity\n across the Spot pools included in its launch specifications. By ensuring that the Spot\n Instances in your Spot Fleet are in different Spot pools, you can improve the\n availability of your fleet.

\n

You can specify tags for the Spot Fleet request and instances launched by the fleet.\n You cannot tag other resource types in a Spot Fleet request because only the\n spot-fleet-request and instance resource types are\n supported.

\n

For more information, see Spot Fleet requests\n in the Amazon EC2 User Guide.

\n \n

We strongly discourage using the RequestSpotFleet API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To request a Spot fleet in the subnet with the lowest price", + "documentation": "This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.", + "input": { + "SpotFleetRequestConfig": { + "SpotPrice": "0.04", + "TargetCapacity": 2, + "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role", + "LaunchSpecifications": [ + { + "ImageId": "ami-1a2b3c4d", + "KeyName": "my-key-pair", + "SecurityGroups": [ + { + "GroupId": "sg-1a2b3c4d" + } + ], + "InstanceType": "m3.medium", + "SubnetId": "subnet-1a2b3c4d, subnet-3c4d5e6f", + "IamInstanceProfile": { + "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role" + } + } + ] + } + }, + "output": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + } + } + ] } }, "com.amazonaws.ec2#RequestSpotFleetRequest": { @@ -82288,7 +85753,32 @@ "target": "com.amazonaws.ec2#RequestSpotInstancesResult" }, "traits": { - "smithy.api#documentation": "

Creates a Spot Instance request.

\n

For more information, see Spot Instance requests in\n the Amazon EC2 User Guide for Linux Instances.

\n \n

We strongly discourage using the RequestSpotInstances API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide for Linux Instances.

\n
" + "smithy.api#documentation": "

Creates a Spot Instance request.

\n

For more information, see Spot Instance requests in\n the Amazon EC2 User Guide for Linux Instances.

\n \n

We strongly discourage using the RequestSpotInstances API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide for Linux Instances.

\n
", + "smithy.api#examples": [ + { + "title": "To create a one-time Spot Instance request", + "documentation": "This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone.", + "input": { + "SpotPrice": "0.03", + "InstanceCount": 5, + "Type": "one-time", + "LaunchSpecification": { + "ImageId": "ami-1a2b3c4d", + "KeyName": "my-key-pair", + "SecurityGroupIds": [ + "sg-1a2b3c4d" + ], + "InstanceType": "m3.medium", + "Placement": { + "AvailabilityZone": "us-west-2a" + }, + "IamInstanceProfile": { + "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#RequestSpotInstancesRequest": { @@ -83697,7 +87187,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets an attribute of an AMI to its default value.

" + "smithy.api#documentation": "

Resets an attribute of an AMI to its default value.

", + "smithy.api#examples": [ + { + "title": "To reset the launchPermission attribute", + "documentation": "This example resets the launchPermission attribute for the specified AMI. By default, AMIs are private.", + "input": { + "Attribute": "launchPermission", + "ImageId": "ami-5731123e" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetImageAttributeName": { @@ -83755,7 +87256,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets an attribute of an instance to its default value. To reset the\n kernel or ramdisk, the instance must be in a stopped\n state. To reset the sourceDestCheck, the instance can be either running or\n stopped.

\n

The sourceDestCheck attribute controls whether source/destination\n checking is enabled. The default value is true, which means checking is\n enabled. This value must be false for a NAT instance to perform NAT. For\n more information, see NAT Instances in the\n Amazon VPC User Guide.

" + "smithy.api#documentation": "

Resets an attribute of an instance to its default value. To reset the\n kernel or ramdisk, the instance must be in a stopped\n state. To reset the sourceDestCheck, the instance can be either running or\n stopped.

\n

The sourceDestCheck attribute controls whether source/destination\n checking is enabled. The default value is true, which means checking is\n enabled. This value must be false for a NAT instance to perform NAT. For\n more information, see NAT Instances in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To reset the sourceDestCheck attribute", + "documentation": "This example resets the sourceDestCheck attribute for the specified instance.", + "input": { + "Attribute": "sourceDestCheck", + "InstanceId": "i-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetInstanceAttributeRequest": { @@ -83854,7 +87366,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets permission settings for the specified snapshot.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Resets permission settings for the specified snapshot.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To reset a snapshot attribute", + "documentation": "This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0", + "Attribute": "createVolumePermission" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetSnapshotAttributeRequest": { @@ -85102,6 +88625,14 @@ "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -85298,7 +88829,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Removes the specified outbound (egress) rules from a security group for EC2-VPC.\n This action does not apply to security groups for use in EC2-Classic.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

[Default VPC] If the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, \n a small delay might occur.

" + "smithy.api#documentation": "

Removes the specified outbound (egress) rules from the specified security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, \n a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupEgressRequest": { @@ -85431,7 +88962,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

[EC2-Classic, default VPC] If the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, a small delay might occur.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupIngressRequest": { @@ -85454,13 +88985,13 @@ "GroupId": { "target": "com.amazonaws.ec2#SecurityGroupId", "traits": { - "smithy.api#documentation": "

The ID of the security group. You must specify either the security group ID or the\n security group name in the request. For security groups in a nondefault VPC, you must\n specify the security group ID.

" + "smithy.api#documentation": "

The ID of the security group.

" } }, "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -85478,13 +89009,13 @@ "SourceSecurityGroupName": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the source security group. You can't specify this parameter in combination with the following parameters: the CIDR IP address range, the start of the port range, the IP protocol, and the end of the port range. For EC2-VPC, the source security group must be in the same VPC. To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

[Default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. The source security group must be in the same VPC. \n To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" } }, "SourceSecurityGroupOwnerId": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic] The Amazon Web Services account ID of the source security group, if the source security group is in a different account. You can't specify this parameter in combination with the following parameters: the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

Not supported.

" } }, "ToPort": { @@ -86099,7 +89630,44 @@ "target": "com.amazonaws.ec2#Reservation" }, "traits": { - "smithy.api#documentation": "

Launches the specified number of instances using an AMI for which you have\n permissions.

\n

You can specify a number of options, or leave the default options. The following rules\n apply:

\n
    \n
  • \n

    If you don't specify a subnet ID, we choose a default subnet from\n your default VPC for you. If you don't have a default VPC, you must specify a\n subnet ID in the request.

    \n
  • \n
  • \n

    All instances have a network interface with a primary private IPv4\n address. If you don't specify this address, we choose one from the IPv4 range of\n your subnet.

    \n
  • \n
  • \n

    Not all instance types support IPv6 addresses. For more information, see\n Instance\n types.

    \n
  • \n
  • \n

    If you don't specify a security group ID, we use the default security group.\n For more information, see Security\n groups.

    \n
  • \n
  • \n

    If any of the AMIs have a product code attached for which the user has not\n subscribed, the request fails.

    \n
  • \n
\n

You can create a launch template,\n which is a resource that contains the parameters to launch an instance. When you launch\n an instance using RunInstances, you can specify the launch template\n instead of specifying the launch parameters.

\n

To ensure faster instance launches, break up large requests into smaller batches. For\n example, create five separate launch requests for 100 instances each instead of one\n launch request for 500 instances.

\n

An instance is ready for you to use when it's in the running state. You\n can check the state of your instance using DescribeInstances. You can\n tag instances and EBS volumes during launch, after launch, or both. For more\n information, see CreateTags and Tagging your Amazon EC2\n resources.

\n

Linux instances have access to the public key of the key pair at boot. You can use\n this key to provide secure access to the instance. Amazon EC2 public images use this\n feature to provide secure access without passwords. For more information, see Key\n pairs.

\n

For troubleshooting, see What to do if\n an instance immediately terminates, and Troubleshooting connecting to your instance.

" + "smithy.api#documentation": "

Launches the specified number of instances using an AMI for which you have\n permissions.

\n

You can specify a number of options, or leave the default options. The following rules\n apply:

\n
    \n
  • \n

    If you don't specify a subnet ID, we choose a default subnet from\n your default VPC for you. If you don't have a default VPC, you must specify a\n subnet ID in the request.

    \n
  • \n
  • \n

    All instances have a network interface with a primary private IPv4\n address. If you don't specify this address, we choose one from the IPv4 range of\n your subnet.

    \n
  • \n
  • \n

    Not all instance types support IPv6 addresses. For more information, see\n Instance\n types.

    \n
  • \n
  • \n

    If you don't specify a security group ID, we use the default security group.\n For more information, see Security\n groups.

    \n
  • \n
  • \n

    If any of the AMIs have a product code attached for which the user has not\n subscribed, the request fails.

    \n
  • \n
\n

You can create a launch template,\n which is a resource that contains the parameters to launch an instance. When you launch\n an instance using RunInstances, you can specify the launch template\n instead of specifying the launch parameters.

\n

To ensure faster instance launches, break up large requests into smaller batches. For\n example, create five separate launch requests for 100 instances each instead of one\n launch request for 500 instances.

\n

An instance is ready for you to use when it's in the running state. You\n can check the state of your instance using DescribeInstances. You can\n tag instances and EBS volumes during launch, after launch, or both. For more\n information, see CreateTags and Tagging your Amazon EC2\n resources.

\n

Linux instances have access to the public key of the key pair at boot. You can use\n this key to provide secure access to the instance. Amazon EC2 public images use this\n feature to provide secure access without passwords. For more information, see Key\n pairs.

\n

For troubleshooting, see What to do if\n an instance immediately terminates, and Troubleshooting connecting to your instance.

", + "smithy.api#examples": [ + { + "title": "To launch an instance", + "documentation": "This example launches an instance using the specified AMI, instance type, security group, subnet, block device mapping, and tags.", + "input": { + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sdh", + "Ebs": { + "VolumeSize": 100 + } + } + ], + "ImageId": "ami-abc12345", + "InstanceType": "t2.micro", + "KeyName": "my-key-pair", + "MaxCount": 1, + "MinCount": 1, + "SecurityGroupIds": [ + "sg-1a2b3c4d" + ], + "SubnetId": "subnet-6e7f829e", + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Purpose", + "Value": "test" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#RunInstancesMonitoringEnabled": { @@ -86140,7 +89708,7 @@ "InstanceType": { "target": "com.amazonaws.ec2#InstanceType", "traits": { - "smithy.api#documentation": "

The instance type. For more information, see Instance types in the\n Amazon EC2 User Guide.

\n

Default: m1.small\n

" + "smithy.api#documentation": "

The instance type. For more information, see Instance types in the\n Amazon EC2 User Guide.

" } }, "Ipv6AddressCount": { @@ -86364,7 +89932,7 @@ "HibernationOptions": { "target": "com.amazonaws.ec2#HibernationOptionsRequest", "traits": { - "smithy.api#documentation": "

Indicates whether an instance is enabled for hibernation. For more information, see\n Hibernate\n your instance in the Amazon EC2 User Guide.

\n

You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\n instance.

" + "smithy.api#documentation": "

Indicates whether an instance is enabled for hibernation. This parameter is valid only\n if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\n instance.

" } }, "LicenseSpecifications": { @@ -86383,13 +89951,13 @@ "EnclaveOptions": { "target": "com.amazonaws.ec2#EnclaveOptionsRequest", "traits": { - "smithy.api#documentation": "

Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\n more information, see What is Amazon Web Services Nitro\n Enclaves? in the Amazon Web Services Nitro Enclaves User\n Guide.

\n

You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\n instance.

" + "smithy.api#documentation": "

Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\n more information, see What is Amazon Web Services Nitro\n Enclaves? in the Amazon Web Services Nitro Enclaves User\n Guide.

\n

You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\n instance.

" } }, "PrivateDnsNameOptions": { "target": "com.amazonaws.ec2#PrivateDnsNameOptionsRequest", "traits": { - "smithy.api#documentation": "

The options for the instance hostname. The default values are inherited from the\n subnet.

" + "smithy.api#documentation": "

The options for the instance hostname. \n The default values are inherited from the subnet.\n Applies only if creating a network interface, not attaching an existing one.

" } }, "MaintenanceOptions": { @@ -86405,6 +89973,14 @@ "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether an instance is enabled for stop protection. For more information,\n see Stop\n protection.

" } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

If you’re launching an instance into a dual-stack or IPv6-only subnet, you can enable\n assigning a primary IPv6 address. A primary IPv6 address is an IPv6 GUA address\n associated with an ENI that you have enabled to use a primary IPv6 address. Use this\n option if an instance relies on its IPv6 address not changing. When you launch the\n instance, Amazon Web Services will automatically assign an IPv6 address associated with\n the ENI attached to your instance to be the primary IPv6 address. Once you enable an\n IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" + } } }, "traits": { @@ -86557,7 +90133,7 @@ } }, "UploadPolicySignature": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#S3StorageUploadPolicySignature", "traits": { "aws.protocols#ec2QueryName": "UploadPolicySignature", "smithy.api#documentation": "

The signature of the JSON document.

", @@ -86569,6 +90145,35 @@ "smithy.api#documentation": "

Describes the storage parameters for Amazon S3 and Amazon S3 buckets for an instance store-backed AMI.

" } }, + "com.amazonaws.ec2#S3StorageUploadPolicySignature": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.ec2#SSEType": { + "type": "enum", + "members": { + "sse_ebs": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sse-ebs" + } + }, + "sse_kms": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sse-kms" + } + }, + "none": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "none" + } + } + } + }, "com.amazonaws.ec2#ScheduledInstance": { "type": "structure", "members": { @@ -87653,7 +91258,7 @@ "target": "com.amazonaws.ec2#IpPermissionList", "traits": { "aws.protocols#ec2QueryName": "IpPermissionsEgress", - "smithy.api#documentation": "

[VPC only] The outbound rules associated with the security group.

", + "smithy.api#documentation": "

The outbound rules associated with the security group.

", "smithy.api#xmlName": "ipPermissionsEgress" } }, @@ -87669,7 +91274,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "VpcId", - "smithy.api#documentation": "

[VPC only] The ID of the VPC for the security group.

", + "smithy.api#documentation": "

The ID of the VPC for the security group.

", "smithy.api#xmlName": "vpcId" } } @@ -88720,6 +92325,14 @@ "smithy.api#documentation": "

Only for archived snapshots that are temporarily restored. Indicates the date and \n time when a temporarily restored snapshot will be automatically re-archived.

", "smithy.api#xmlName": "restoreExpiryTime" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -88980,6 +92593,14 @@ "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored. For more information, see Amazon EBS local snapshots on Outposts in the \n \t\tAmazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "outpostArn" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -90173,6 +93794,12 @@ "traits": { "smithy.api#enumValue": "failed" } + }, + "disabled": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "disabled" + } } } }, @@ -90761,7 +94388,33 @@ "target": "com.amazonaws.ec2#StartInstancesResult" }, "traits": { - "smithy.api#documentation": "

Starts an Amazon EBS-backed instance that you've previously stopped.

\n

Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\n started. When an instance is stopped, the compute resources are released and you are not\n billed for instance usage. However, your root partition Amazon EBS volume remains and\n continues to persist your data, and you are charged for Amazon EBS volume usage. You can\n restart your instance at any time. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

Before stopping an instance, make sure it is in a state from which it can be\n restarted. Stopping an instance does not preserve data stored in RAM.

\n

Performing this operation on an instance that uses an instance store as its root\n device returns an error.

\n

If you attempt to start a T3 instance with host tenancy and the\n unlimted CPU credit option, the request fails. The\n unlimited CPU credit option is not supported on Dedicated Hosts. Before\n you start the instance, either change its CPU credit option to standard, or\n change its tenancy to default or dedicated.

\n

For more information, see Stop and start your instance\n in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Starts an Amazon EBS-backed instance that you've previously stopped.

\n

Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\n started. When an instance is stopped, the compute resources are released and you are not\n billed for instance usage. However, your root partition Amazon EBS volume remains and\n continues to persist your data, and you are charged for Amazon EBS volume usage. You can\n restart your instance at any time. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

Before stopping an instance, make sure it is in a state from which it can be\n restarted. Stopping an instance does not preserve data stored in RAM.

\n

Performing this operation on an instance that uses an instance store as its root\n device returns an error.

\n

If you attempt to start a T3 instance with host tenancy and the\n unlimted CPU credit option, the request fails. The\n unlimited CPU credit option is not supported on Dedicated Hosts. Before\n you start the instance, either change its CPU credit option to standard, or\n change its tenancy to default or dedicated.

\n

For more information, see Stop and start your instance\n in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To start a stopped EC2 instance", + "documentation": "This example starts the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "StartingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 0, + "Name": "pending" + }, + "PreviousState": { + "Code": 80, + "Name": "stopped" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#StartInstancesRequest": { @@ -91196,7 +94849,33 @@ "target": "com.amazonaws.ec2#StopInstancesResult" }, "traits": { - "smithy.api#documentation": "

Stops an Amazon EBS-backed instance. For more information, see Stop and start\n your instance in the Amazon EC2 User Guide.

\n

You can use the Stop action to hibernate an instance if the instance is enabled for\n hibernation and it meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

We don't charge usage for a stopped instance, or data transfer fees; however, your\n root partition Amazon EBS volume remains and continues to persist your data, and you are\n charged for Amazon EBS volume usage. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

You can't stop or hibernate instance store-backed instances. You can't use the Stop\n action to hibernate Spot Instances, but you can specify that Amazon EC2 should hibernate\n Spot Instances when they are interrupted. For more information, see Hibernating interrupted Spot Instances in the\n Amazon EC2 User Guide.

\n

When you stop or hibernate an instance, we shut it down. You can restart your instance\n at any time. Before stopping or hibernating an instance, make sure it is in a state from\n which it can be restarted. Stopping an instance does not preserve data stored in RAM,\n but hibernating an instance does preserve data stored in RAM. If an instance cannot\n hibernate successfully, a normal shutdown occurs.

\n

Stopping and hibernating an instance is different to rebooting or terminating it. For\n example, when you stop or hibernate an instance, the root device and any other devices\n attached to the instance persist. When you terminate an instance, the root device and\n any other devices attached during the instance launch are automatically deleted. For\n more information about the differences between rebooting, stopping, hibernating, and\n terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

When you stop an instance, we attempt to shut it down forcibly after a short while. If\n your instance appears stuck in the stopping state after a period of time, there may be\n an issue with the underlying host computer. For more information, see Troubleshoot\n stopping your instance in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Stops an Amazon EBS-backed instance. For more information, see Stop and start\n your instance in the Amazon EC2 User Guide.

\n

You can use the Stop action to hibernate an instance if the instance is enabled for\n hibernation and it meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

We don't charge usage for a stopped instance, or data transfer fees; however, your\n root partition Amazon EBS volume remains and continues to persist your data, and you are\n charged for Amazon EBS volume usage. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

You can't stop or hibernate instance store-backed instances. You can't use the Stop\n action to hibernate Spot Instances, but you can specify that Amazon EC2 should hibernate\n Spot Instances when they are interrupted. For more information, see Hibernating interrupted Spot Instances in the\n Amazon EC2 User Guide.

\n

When you stop or hibernate an instance, we shut it down. You can restart your instance\n at any time. Before stopping or hibernating an instance, make sure it is in a state from\n which it can be restarted. Stopping an instance does not preserve data stored in RAM,\n but hibernating an instance does preserve data stored in RAM. If an instance cannot\n hibernate successfully, a normal shutdown occurs.

\n

Stopping and hibernating an instance is different to rebooting or terminating it. For\n example, when you stop or hibernate an instance, the root device and any other devices\n attached to the instance persist. When you terminate an instance, the root device and\n any other devices attached during the instance launch are automatically deleted. For\n more information about the differences between rebooting, stopping, hibernating, and\n terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

When you stop an instance, we attempt to shut it down forcibly after a short while. If\n your instance appears stuck in the stopping state after a period of time, there may be\n an issue with the underlying host computer. For more information, see Troubleshoot\n stopping your instance in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To stop a running EC2 instance", + "documentation": "This example stops the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "StoppingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 64, + "Name": "stopping" + }, + "PreviousState": { + "Code": 16, + "Name": "running" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#StopInstancesRequest": { @@ -91748,7 +95427,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "Description", - "smithy.api#documentation": "

The\n description\n assigned to the subnet CIDR\n reservation.

", + "smithy.api#documentation": "

The description assigned to the subnet CIDR reservation.

", "smithy.api#xmlName": "description" } }, @@ -91794,6 +95473,41 @@ } } }, + "com.amazonaws.ec2#SubnetConfiguration": { + "type": "structure", + "members": { + "SubnetId": { + "target": "com.amazonaws.ec2#SubnetId", + "traits": { + "smithy.api#documentation": "

The ID of the subnet.

" + } + }, + "Ipv4": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The IPv4 address to assign to the endpoint network interface in the subnet. You must provide \n an IPv4 address if the VPC endpoint supports IPv4.

\n

If you specify an IPv4 address when modifying a VPC endpoint, we replace the existing \n endpoint network interface with a new endpoint network interface with this IP address. \n This process temporarily disconnects the subnet and the VPC endpoint.

" + } + }, + "Ipv6": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The IPv6 address to assign to the endpoint network interface in the subnet. You must provide \n an IPv6 address if the VPC endpoint supports IPv6.

\n

If you specify an IPv6 address when modifying a VPC endpoint, we replace the existing \n endpoint network interface with a new endpoint network interface with this IP address. \n This process temporarily disconnects the subnet and the VPC endpoint.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the configuration of a subnet for a VPC endpoint.

" + } + }, + "com.amazonaws.ec2#SubnetConfigurationsList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#SubnetConfiguration", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#SubnetId": { "type": "string" }, @@ -92568,7 +96282,7 @@ } }, "ConnectionId": { - "target": "com.amazonaws.ec2#VpnConnectionId", + "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#documentation": "

The ID of the client connection to be terminated.

" } @@ -92674,7 +96388,33 @@ "target": "com.amazonaws.ec2#TerminateInstancesResult" }, "traits": { - "smithy.api#documentation": "

Shuts down the specified instances. This operation is idempotent; if you terminate an\n instance more than once, each call succeeds.

\n

If you specify multiple instances and the request fails (for example, because of a\n single incorrect instance ID), none of the instances are terminated.

\n

If you terminate multiple instances across multiple Availability Zones, and one or\n more of the specified instances are enabled for termination protection, the request\n fails with the following results:

\n
    \n
  • \n

    The specified instances that are in the same Availability Zone as the\n protected instance are not terminated.

    \n
  • \n
  • \n

    The specified instances that are in different Availability Zones, where no\n other specified instances are protected, are successfully terminated.

    \n
  • \n
\n

For example, say you have the following instances:

\n
    \n
  • \n

    Instance A: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance B: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance C: us-east-1b; Protected

    \n
  • \n
  • \n

    Instance D: us-east-1b; not protected

    \n
  • \n
\n

If you attempt to terminate all of these instances in the same request, the request\n reports failure with the following results:

\n
    \n
  • \n

    Instance A and Instance B are successfully terminated because none of the\n specified instances in us-east-1a are enabled for termination\n protection.

    \n
  • \n
  • \n

    Instance C and Instance D fail to terminate because at least one of the\n specified instances in us-east-1b (Instance C) is enabled for\n termination protection.

    \n
  • \n
\n

Terminated instances remain visible after termination (for approximately one\n hour).

\n

By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\n launched. Volumes attached after instance launch continue running.

\n

You can stop, start, and terminate EBS-backed instances. You can only terminate\n instance store-backed instances. What happens to an instance differs if you stop it or\n terminate it. For example, when you stop an instance, the root device and any other\n devices attached to the instance persist. When you terminate an instance, any attached\n EBS volumes with the DeleteOnTermination block device mapping parameter set\n to true are automatically deleted. For more information about the\n differences between stopping and terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

For more information about troubleshooting, see Troubleshooting terminating your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Shuts down the specified instances. This operation is idempotent; if you terminate an\n instance more than once, each call succeeds.

\n

If you specify multiple instances and the request fails (for example, because of a\n single incorrect instance ID), none of the instances are terminated.

\n

If you terminate multiple instances across multiple Availability Zones, and one or\n more of the specified instances are enabled for termination protection, the request\n fails with the following results:

\n
    \n
  • \n

    The specified instances that are in the same Availability Zone as the\n protected instance are not terminated.

    \n
  • \n
  • \n

    The specified instances that are in different Availability Zones, where no\n other specified instances are protected, are successfully terminated.

    \n
  • \n
\n

For example, say you have the following instances:

\n
    \n
  • \n

    Instance A: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance B: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance C: us-east-1b; Protected

    \n
  • \n
  • \n

    Instance D: us-east-1b; not protected

    \n
  • \n
\n

If you attempt to terminate all of these instances in the same request, the request\n reports failure with the following results:

\n
    \n
  • \n

    Instance A and Instance B are successfully terminated because none of the\n specified instances in us-east-1a are enabled for termination\n protection.

    \n
  • \n
  • \n

    Instance C and Instance D fail to terminate because at least one of the\n specified instances in us-east-1b (Instance C) is enabled for\n termination protection.

    \n
  • \n
\n

Terminated instances remain visible after termination (for approximately one\n hour).

\n

By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\n launched. Volumes attached after instance launch continue running.

\n

You can stop, start, and terminate EBS-backed instances. You can only terminate\n instance store-backed instances. What happens to an instance differs if you stop it or\n terminate it. For example, when you stop an instance, the root device and any other\n devices attached to the instance persist. When you terminate an instance, any attached\n EBS volumes with the DeleteOnTermination block device mapping parameter set\n to true are automatically deleted. For more information about the\n differences between stopping and terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

For more information about troubleshooting, see Troubleshooting terminating your instance in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To terminate an EC2 instance", + "documentation": "This example terminates the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "TerminatingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 32, + "Name": "shutting-down" + }, + "PreviousState": { + "Code": 16, + "Name": "running" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#TerminateInstancesRequest": { @@ -96580,7 +100320,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "aws.protocols#ec2QueryName": "PreSharedKey", "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and the customer gateway.

", @@ -96837,7 +100577,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Unassigns one or more secondary private IP addresses, or IPv4 Prefix Delegation prefixes from a \n \tnetwork interface.

" + "smithy.api#documentation": "

Unassigns one or more secondary private IP addresses, or IPv4 Prefix Delegation prefixes from a \n \tnetwork interface.

", + "smithy.api#examples": [ + { + "title": "To unassign a secondary private IP address from a network interface", + "documentation": "This example unassigns the specified private IP address from the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + "10.0.0.82" + ] + } + } + ] } }, "com.amazonaws.ec2#UnassignPrivateIpAddressesRequest": { @@ -96883,7 +100635,7 @@ "target": "com.amazonaws.ec2#UnassignPrivateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, see Edit secondary IP address associations in the Amazon Virtual Private Cloud User Guide.

\n

While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

A private IP address will only be released at the end of MaxDrainDurationSeconds. The\n private IP addresses stay associated and support the existing connections but do not\n support any new connections (new connections are distributed across the remaining\n assigned private IP address). After the existing connections drain out, the private IP\n addresses get released.

\n

\n

" + "smithy.api#documentation": "

Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, see Edit secondary IP address associations in the Amazon VPC User Guide.

\n

While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

A private IP address will only be released at the end of MaxDrainDurationSeconds. The\n private IP addresses stay associated and support the existing connections, but do not\n support any new connections (new connections are distributed across the remaining\n assigned private IP address). After the existing connections drain out, the private IP\n addresses are released.

\n

\n

" } }, "com.amazonaws.ec2#UnassignPrivateNatGatewayAddressRequest": { @@ -96893,7 +100645,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -96934,7 +100686,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -97196,7 +100948,30 @@ "target": "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Updates the description of an egress (outbound) security group rule. You\n\t\t\tcan replace an existing description, or add a description to a rule that did not have one\n\t\t\tpreviously. You can remove a description for a security group rule by omitting the \n\t\t\tdescription parameter in the request.

" + "smithy.api#documentation": "

Updates the description of an egress (outbound) security group rule. You\n\t\t\tcan replace an existing description, or add a description to a rule that did not have one\n\t\t\tpreviously. You can remove a description for a security group rule by omitting the \n\t\t\tdescription parameter in the request.

", + "smithy.api#examples": [ + { + "title": "To update an outbound security group rule description", + "documentation": "This example updates the description for the specified security group rule.", + "input": { + "GroupId": "sg-123abc12", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/24", + "Description": "Outbound HTTP access to server 2" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressRequest": { @@ -97219,7 +100994,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the security group\n\t\t\tID or the security group name in the request.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the security group\n\t\t\tID or the security group name.

" } }, "IpPermissions": { @@ -97267,7 +101042,30 @@ "target": "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressResult" }, "traits": { - "smithy.api#documentation": "

Updates the description of an ingress (inbound) security group rule. You can replace an\n\t\t\texisting description, or add a description to a rule that did not have one previously.\n\t\t You can remove a description for a security group rule by omitting the description \n\t\t parameter in the request.

" + "smithy.api#documentation": "

Updates the description of an ingress (inbound) security group rule. You can replace an\n\t\t\texisting description, or add a description to a rule that did not have one previously.\n\t\t You can remove a description for a security group rule by omitting the description \n\t\t parameter in the request.

", + "smithy.api#examples": [ + { + "title": "To update an inbound security group rule description", + "documentation": "This example updates the description for the specified security group rule.", + "input": { + "GroupId": "sg-123abc12", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/16", + "Description": "SSH access from the LA office" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressRequest": { @@ -97290,7 +101088,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -97302,7 +101100,7 @@ "SecurityGroupRuleDescriptions": { "target": "com.amazonaws.ec2#SecurityGroupRuleDescriptionList", "traits": { - "smithy.api#documentation": "

[VPC only] The description for the ingress security group rules. You must specify either\n a description or IP permissions.

", + "smithy.api#documentation": "

The description for the ingress security group rules. You must specify either\n a description or IP permissions.

", "smithy.api#xmlName": "SecurityGroupRuleDescription" } } @@ -97448,7 +101246,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "GroupName", - "smithy.api#documentation": "

The name of the security group. In a request, use this parameter for a security group\n in EC2-Classic or a default VPC only. For a security group in a nondefault VPC, use the\n security group ID.

\n

For a referenced security group in another VPC, this value is not returned if the\n referenced security group is deleted.

", + "smithy.api#documentation": "

[Default VPC] The name of the security group. For a security group in a nondefault VPC, \n use the security group ID.

\n

For a referenced security group in another VPC, this value is not returned if the\n referenced security group is deleted.

", "smithy.api#xmlName": "groupName" } }, @@ -97464,7 +101262,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "UserId", - "smithy.api#documentation": "

The ID of an Amazon Web Services account.

\n

For a referenced security group in another VPC, the account ID of the referenced\n security group is returned in the response. If the referenced security group is deleted,\n this value is not returned.

\n

[EC2-Classic] Required when adding or removing rules that reference a security group\n in another Amazon Web Services account.

", + "smithy.api#documentation": "

The ID of an Amazon Web Services account.

\n

For a referenced security group in another VPC, the account ID of the referenced\n security group is returned in the response. If the referenced security group is deleted,\n this value is not returned.

", "smithy.api#xmlName": "userId" } }, @@ -97486,7 +101284,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes a security group and Amazon Web Services account ID pair.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Describes a security group and Amazon Web Services account ID pair.

" } }, "com.amazonaws.ec2#UserIdGroupPairList": { @@ -98444,10 +102242,24 @@ "traits": { "smithy.api#documentation": "

Sends Verified Access logs to Kinesis.

" } + }, + "LogVersion": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

\n\t\t The logging version to use.\n\t

\n

Valid values: ocsf-0.1 | ocsf-1.0.0-rc.2\n

" + } + }, + "IncludeTrustContext": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

\n\t\t Include trust data sent by trust providers into the logs. \n\t

" + } } }, "traits": { - "smithy.api#documentation": "

Describes the destinations for Verified Access logs.

" + "smithy.api#documentation": "

Options for Verified Access logs.

" } }, "com.amazonaws.ec2#VerifiedAccessLogS3Destination": { @@ -98561,10 +102373,28 @@ "smithy.api#documentation": "

Kinesis logging destination.

", "smithy.api#xmlName": "kinesisDataFirehose" } + }, + "LogVersion": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "LogVersion", + "smithy.api#documentation": "

\n Describes current setting for the logging version.\n

", + "smithy.api#xmlName": "logVersion" + } + }, + "IncludeTrustContext": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IncludeTrustContext", + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

\n\t\t Describes current setting for including trust data into the logs.\n\t

", + "smithy.api#xmlName": "includeTrustContext" + } } }, "traits": { - "smithy.api#documentation": "

Describes the destinations for Verified Access logs.

" + "smithy.api#documentation": "

Describes the options for Verified Access logs.

" } }, "com.amazonaws.ec2#VerifiedAccessTrustProvider": { @@ -99009,6 +102839,14 @@ "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

", "smithy.api#xmlName": "throughput" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -100060,7 +103898,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes whether a VPC is enabled for ClassicLink.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes whether a VPC is enabled for ClassicLink.

" } }, "com.amazonaws.ec2#VpcClassicLinkIdList": { @@ -100603,7 +104441,7 @@ "aws.protocols#ec2QueryName": "AllowDnsResolutionFromRemoteVpc", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses when queried from instances in a peer VPC.

", + "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses \n when queried from instances in a peer VPC.

", "smithy.api#xmlName": "allowDnsResolutionFromRemoteVpc" } }, @@ -100613,7 +104451,7 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local ClassicLink connection can communicate with the peer VPC over the VPC peering connection.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } }, @@ -100623,13 +104461,13 @@ "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", "smithy.api#clientOptional": {}, "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local VPC can communicate with a ClassicLink connection in the peer VPC over the VPC peering connection.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the VPC peering connection options.

" + "smithy.api#documentation": "

Describes the VPC peering connection options.

" } }, "com.amazonaws.ec2#VpcPeeringConnectionStateReason": { @@ -100811,7 +104649,7 @@ "type": "structure", "members": { "CustomerGatewayConfiguration": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#customerGatewayConfiguration", "traits": { "aws.protocols#ec2QueryName": "CustomerGatewayConfiguration", "smithy.api#documentation": "

The configuration information for the VPN connection's customer gateway (in the native\n XML format). This element is always present in the CreateVpnConnection\n response; however, it's present in the DescribeVpnConnections response\n only if the VPN connection is in the pending or available\n state.

", @@ -101422,7 +105260,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and customer gateway.

\n

Constraints: Allowed characters are alphanumeric characters, periods (.), and\n underscores (_). Must be between 8 and 64 characters in length and cannot start with\n zero (0).

" } @@ -101678,6 +105516,18 @@ } } }, + "com.amazonaws.ec2#customerGatewayConfiguration": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.ec2#preSharedKey": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#scope": { "type": "enum", "members": { @@ -101709,6 +105559,9 @@ }, "com.amazonaws.ec2#totalGpuMemory": { "type": "integer" + }, + "com.amazonaws.ec2#totalInferenceMemory": { + "type": "integer" } } } diff --git a/aws/sdk/aws-models/ecs.json b/aws/sdk/aws-models/ecs.json index 51c17eda2f4..e575905c962 100644 --- a/aws/sdk/aws-models/ecs.json +++ b/aws/sdk/aws-models/ecs.json @@ -332,52 +332,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -385,13 +389,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -401,224 +414,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://ecs.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://ecs.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1471,7 +1435,7 @@ "autoScalingGroupArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The Amazon Resource Name (ARN) that identifies the Auto Scaling group.

", + "smithy.api#documentation": "

The Amazon Resource Name (ARN) that identifies the Auto Scaling group, or the Auto Scaling group name.

", "smithy.api#required": {} } }, @@ -2361,13 +2325,13 @@ "startTimeout": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

Time duration (in seconds) to wait before giving up on resolving dependencies for a\n\t\t\tcontainer. For example, you specify two containers in a task definition with containerA\n\t\t\thaving a dependency on containerB reaching a COMPLETE,\n\t\t\tSUCCESS, or HEALTHY status. If a startTimeout\n\t\t\tvalue is specified for containerB and it doesn't reach the desired status within that\n\t\t\ttime then containerA gives up and not start. This results in the task transitioning to a\n\t\t\t\tSTOPPED state.

\n \n

When the ECS_CONTAINER_START_TIMEOUT container agent configuration\n\t\t\t\tvariable is used, it's enforced independently from this start timeout value.

\n
\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

For tasks using the EC2 launch type, your container instances require at\n\t\t\tleast version 1.26.0 of the container agent to use a container start\n\t\t\ttimeout value. However, we recommend using the latest container agent version. For\n\t\t\tinformation about checking your agent version and updating to the latest version, see\n\t\t\t\tUpdating the Amazon ECS\n\t\t\t\tContainer Agent in the Amazon Elastic Container Service Developer Guide. If you're using an Amazon ECS-optimized Linux AMI,\n\t\t\tyour instance needs at least version 1.26.0-1 of the ecs-init\n\t\t\tpackage. If your container instances are launched from version 20190301 or\n\t\t\tlater, then they contain the required versions of the container agent and\n\t\t\t\tecs-init. For more information, see Amazon ECS-optimized Linux AMI\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Time duration (in seconds) to wait before giving up on resolving dependencies for a\n\t\t\tcontainer. For example, you specify two containers in a task definition with containerA\n\t\t\thaving a dependency on containerB reaching a COMPLETE,\n\t\t\tSUCCESS, or HEALTHY status. If a startTimeout\n\t\t\tvalue is specified for containerB and it doesn't reach the desired status within that\n\t\t\ttime then containerA gives up and not start. This results in the task transitioning to a\n\t\t\t\tSTOPPED state.

\n \n

When the ECS_CONTAINER_START_TIMEOUT container agent configuration\n\t\t\t\tvariable is used, it's enforced independently from this start timeout value.

\n
\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

For tasks using the EC2 launch type, your container instances require at\n\t\t\tleast version 1.26.0 of the container agent to use a container start\n\t\t\ttimeout value. However, we recommend using the latest container agent version. For\n\t\t\tinformation about checking your agent version and updating to the latest version, see\n\t\t\t\tUpdating the Amazon ECS\n\t\t\t\tContainer Agent in the Amazon Elastic Container Service Developer Guide. If you're using an Amazon ECS-optimized Linux AMI,\n\t\t\tyour instance needs at least version 1.26.0-1 of the ecs-init\n\t\t\tpackage. If your container instances are launched from version 20190301 or\n\t\t\tlater, then they contain the required versions of the container agent and\n\t\t\t\tecs-init. For more information, see Amazon ECS-optimized Linux AMI\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

\n

The valid values are 2-120 seconds.

" } }, "stopTimeout": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

Time duration (in seconds) to wait before the container is forcefully killed if it\n\t\t\tdoesn't exit normally on its own.

\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

The max stop timeout value is 120 seconds and if the parameter is not specified, the\n\t\t\tdefault value of 30 seconds is used.

\n

For tasks that use the EC2 launch type, if the stopTimeout\n\t\t\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\n\t\t\tvariable ECS_CONTAINER_STOP_TIMEOUT is used. If neither the\n\t\t\t\tstopTimeout parameter or the ECS_CONTAINER_STOP_TIMEOUT\n\t\t\tagent configuration variable are set, then the default values of 30 seconds for Linux\n\t\t\tcontainers and 30 seconds on Windows containers are used. Your container instances\n\t\t\trequire at least version 1.26.0 of the container agent to use a container stop timeout\n\t\t\tvalue. However, we recommend using the latest container agent version. For information\n\t\t\tabout checking your agent version and updating to the latest version, see Updating the Amazon ECS Container Agent in the Amazon Elastic Container Service Developer Guide. If you're using\n\t\t\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\n\t\t\t\tecs-init package. If your container instances are launched from version\n\t\t\t\t20190301 or later, then they contain the required versions of the\n\t\t\tcontainer agent and ecs-init. For more information, see Amazon ECS-optimized Linux AMI in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Time duration (in seconds) to wait before the container is forcefully killed if it\n\t\t\tdoesn't exit normally on its own.

\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

The max stop timeout value is 120 seconds and if the parameter is not specified, the\n\t\t\tdefault value of 30 seconds is used.

\n

For tasks that use the EC2 launch type, if the stopTimeout\n\t\t\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\n\t\t\tvariable ECS_CONTAINER_STOP_TIMEOUT is used. If neither the\n\t\t\t\tstopTimeout parameter or the ECS_CONTAINER_STOP_TIMEOUT\n\t\t\tagent configuration variable are set, then the default values of 30 seconds for Linux\n\t\t\tcontainers and 30 seconds on Windows containers are used. Your container instances\n\t\t\trequire at least version 1.26.0 of the container agent to use a container stop timeout\n\t\t\tvalue. However, we recommend using the latest container agent version. For information\n\t\t\tabout checking your agent version and updating to the latest version, see Updating the Amazon ECS Container Agent in the Amazon Elastic Container Service Developer Guide. If you're using\n\t\t\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\n\t\t\t\tecs-init package. If your container instances are launched from version\n\t\t\t\t20190301 or later, then they contain the required versions of the\n\t\t\tcontainer agent and ecs-init. For more information, see Amazon ECS-optimized Linux AMI in the Amazon Elastic Container Service Developer Guide.

\n

The valid values are 2-120 seconds.

" } }, "hostname": { @@ -2469,7 +2433,7 @@ "systemControls": { "target": "com.amazonaws.ecs#SystemControls", "traits": { - "smithy.api#documentation": "

A list of namespaced kernel parameters to set in the container. This parameter maps to\n\t\t\t\tSysctls in the Create a container section of the\n\t\t\tDocker Remote API and the --sysctl option to docker run.

\n \n

We don't recommended that you specify network-related systemControls\n\t\t\t\tparameters for multiple containers in a single task that also uses either the\n\t\t\t\t\tawsvpc or host network modes. For tasks that use the\n\t\t\t\t\tawsvpc network mode, the container that's started last determines\n\t\t\t\twhich systemControls parameters take effect. For tasks that use the\n\t\t\t\t\thost network mode, it changes the container instance's namespaced\n\t\t\t\tkernel parameters as well as the containers.

\n
" + "smithy.api#documentation": "

A list of namespaced kernel parameters to set in the container. This parameter maps to\n\t\t\t\tSysctls in the Create a container section of the\n\t\t\tDocker Remote API and the --sysctl option to docker run. For example, you can\n\t\t\tconfigure net.ipv4.tcp_keepalive_time setting to maintain\n\t\t\tlonger lived connections.

\n \n

We don't recommended that you specify network-related systemControls\n\t\t\t\tparameters for multiple containers in a single task that also uses either the\n\t\t\t\t\tawsvpc or host network modes. For tasks that use the\n\t\t\t\t\tawsvpc network mode, the container that's started last determines\n\t\t\t\twhich systemControls parameters take effect. For tasks that use the\n\t\t\t\t\thost network mode, it changes the container instance's namespaced\n\t\t\t\tkernel parameters as well as the containers.

\n
\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "resourceRequirements": { @@ -2483,6 +2447,12 @@ "traits": { "smithy.api#documentation": "

The FireLens configuration for the container. This is used to specify and configure a\n\t\t\tlog router for container logs. For more information, see Custom Log Routing\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" } + }, + "credentialSpecs": { + "target": "com.amazonaws.ecs#StringList", + "traits": { + "smithy.api#documentation": "

A list of ARNs in SSM or Amazon S3 to a credential spec\n\t\t\t\t(CredSpec) file that configures the container for Active Directory\n\t\t\tauthentication. We recommend that you use this parameter instead of the\n\t\t\t\tdockerSecurityOptions. The maximum number of ARNs is\n\t\t\t1.

\n

There are two formats for each ARN.

\n
\n
credentialspecdomainless:MyARN
\n
\n

You use credentialspecdomainless:MyARN to provide a\n\t\t\t\t\t\t\tCredSpec with an additional section for a secret in Secrets Manager.\n\t\t\t\t\t\tYou provide the login credentials to the domain in the secret.

\n

Each task that runs on any container instance can join different\n\t\t\t\t\t\tdomains.

\n

You can use this format without joining the container instance to a\n\t\t\t\t\t\tdomain.

\n
\n
credentialspec:MyARN
\n
\n

You use credentialspec:MyARN to provide a\n\t\t\t\t\t\t\tCredSpec for a single domain.

\n

You must join the container instance to the domain before you start any\n\t\t\t\t\t\ttasks that use this task definition.

\n
\n
\n

In both formats, replace MyARN with the ARN in\n\t\t\tSSM or Amazon S3.

\n

If you provide a credentialspecdomainless:MyARN, the\n\t\t\t\tcredspec must provide a ARN in Secrets Manager for a secret containing the\n\t\t\tusername, password, and the domain to connect to. For better security, the instance\n\t\t\tisn't joined to the domain for domainless authentication. Other applications on the\n\t\t\tinstance can't use the domainless credentials. You can use this parameter to run tasks\n\t\t\ton the same instance, even it the tasks need to join different domains. For more\n\t\t\tinformation, see Using gMSAs for Windows\n\t\t\t\tContainers and Using gMSAs for Linux\n\t\t\t\tContainers.

" + } } }, "traits": { @@ -2592,7 +2562,7 @@ "target": "com.amazonaws.ecs#Integer", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

The number of tasks on the container instance that are in the RUNNING\n\t\t\tstatus.

" + "smithy.api#documentation": "

The number of tasks on the container instance that have a desired status (desiredStatus) of RUNNING.

" } }, "pendingTasksCount": { @@ -2780,7 +2750,7 @@ } }, "traits": { - "smithy.api#documentation": "

The overrides that are sent to a container. An empty container override can be passed\n\t\t\tin. An example of an empty container override is {\"containerOverrides\": [ ]\n\t\t\t\t}. If a non-empty container override is specified, the name\n\t\t\tparameter must be included.

" + "smithy.api#documentation": "

The overrides that are sent to a container. An empty container override can be passed\n\t\t\tin. An example of an empty container override is {\"containerOverrides\": [ ]\n\t\t\t\t}. If a non-empty container override is specified, the name\n\t\t\tparameter must be included.

\n

You can use Secrets Manager or Amazon Web Services Systems Manager Parameter Store to store the sensitive\n\t\t\tdata. For more information, see Retrieve secrets through environment variables in the Amazon ECS Developer Guide.

" } }, "com.amazonaws.ecs#ContainerOverrides": { @@ -2945,7 +2915,27 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new Amazon ECS cluster. By default, your account receives a default\n\t\t\tcluster when you launch your first container instance. However, you can create your own\n\t\t\tcluster with a unique name with the CreateCluster action.

\n \n

When you call the CreateCluster API operation, Amazon ECS attempts to\n\t\t\t\tcreate the Amazon ECS service-linked role for your account. This is so that it can manage\n\t\t\t\trequired resources in other Amazon Web Services services on your behalf. However, if the user\n\t\t\t\tthat makes the call doesn't have permissions to create the service-linked role, it\n\t\t\t\tisn't created. For more information, see Using\n\t\t\t\t\tservice-linked roles for Amazon ECS in the Amazon Elastic Container Service Developer Guide.

\n
" + "smithy.api#documentation": "

Creates a new Amazon ECS cluster. By default, your account receives a default\n\t\t\tcluster when you launch your first container instance. However, you can create your own\n\t\t\tcluster with a unique name with the CreateCluster action.

\n \n

When you call the CreateCluster API operation, Amazon ECS attempts to\n\t\t\t\tcreate the Amazon ECS service-linked role for your account. This is so that it can manage\n\t\t\t\trequired resources in other Amazon Web Services services on your behalf. However, if the user\n\t\t\t\tthat makes the call doesn't have permissions to create the service-linked role, it\n\t\t\t\tisn't created. For more information, see Using\n\t\t\t\t\tservice-linked roles for Amazon ECS in the Amazon Elastic Container Service Developer Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To create a new cluster", + "documentation": "This example creates a cluster in your default region.", + "input": { + "clusterName": "my_cluster" + }, + "output": { + "cluster": { + "status": "ACTIVE", + "clusterName": "my_cluster", + "registeredContainerInstancesCount": 0, + "pendingTasksCount": 0, + "runningTasksCount": 0, + "activeServicesCount": 0, + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster" + } + } + } + ] } }, "com.amazonaws.ecs#CreateClusterRequest": { @@ -3050,7 +3040,59 @@ } ], "traits": { - "smithy.api#documentation": "

Runs and maintains your desired number of tasks from a specified task definition. If\n\t\t\tthe number of tasks running in a service drops below the desiredCount,\n\t\t\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\n\t\t\tservice, see the UpdateService action.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

In addition to maintaining the desired count of tasks in your service, you can\n\t\t\toptionally run your service behind one or more load balancers. The load balancers\n\t\t\tdistribute traffic across the tasks that are associated with the service. For more\n\t\t\tinformation, see Service load balancing in the Amazon Elastic Container Service Developer Guide.

\n

Tasks for services that don't use a load balancer are considered healthy if they're in\n\t\t\tthe RUNNING state. Tasks for services that use a load balancer are\n\t\t\tconsidered healthy if they're in the RUNNING state and are reported as\n\t\t\thealthy by the load balancer.

\n

There are two service scheduler strategies available:

\n
    \n
  • \n

    \n REPLICA - The replica scheduling strategy places and\n\t\t\t\t\tmaintains your desired number of tasks across your cluster. By default, the\n\t\t\t\t\tservice scheduler spreads tasks across Availability Zones. You can use task\n\t\t\t\t\tplacement strategies and constraints to customize task placement decisions. For\n\t\t\t\t\tmore information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    \n DAEMON - The daemon scheduling strategy deploys exactly one\n\t\t\t\t\ttask on each active container instance that meets all of the task placement\n\t\t\t\t\tconstraints that you specify in your cluster. The service scheduler also\n\t\t\t\t\tevaluates the task placement constraints for running tasks. It also stops tasks\n\t\t\t\t\tthat don't meet the placement constraints. When using this strategy, you don't\n\t\t\t\t\tneed to specify a desired number of tasks, a task placement strategy, or use\n\t\t\t\t\tService Auto Scaling policies. For more information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
\n

You can optionally specify a deployment configuration for your service. The deployment\n\t\t\tis initiated by changing properties. For example, the deployment might be initiated by\n\t\t\tthe task definition or by your desired count of a service. This is done with an UpdateService operation. The default value for a replica service for\n\t\t\t\tminimumHealthyPercent is 100%. The default value for a daemon service\n\t\t\tfor minimumHealthyPercent is 0%.

\n

If a service uses the ECS deployment controller, the minimum healthy\n\t\t\tpercent represents a lower limit on the number of tasks in a service that must remain in\n\t\t\tthe RUNNING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of your desired number of tasks (rounded up to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can deploy without using additional cluster capacity. For example, if you\n\t\t\tset your service to have desired number of four tasks and a minimum healthy percent of\n\t\t\t50%, the scheduler might stop two existing tasks to free up cluster capacity before\n\t\t\tstarting two new tasks. If they're in the RUNNING state, tasks for services\n\t\t\tthat don't use a load balancer are considered healthy . If they're in the\n\t\t\t\tRUNNING state and reported as healthy by the load balancer, tasks for\n\t\t\tservices that do use a load balancer are considered healthy . The\n\t\t\tdefault value for minimum healthy percent is 100%.

\n

If a service uses the ECS deployment controller, the maximum percent parameter represents an upper limit on the\n\t\t\tnumber of tasks in a service that are allowed in the RUNNING or\n\t\t\t\tPENDING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of the desired number of tasks (rounded down to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can define the deployment batch size. For example, if your service has a\n\t\t\tdesired number of four tasks and a maximum percent value of 200%, the scheduler may\n\t\t\tstart four new tasks before stopping the four older tasks (provided that the cluster\n\t\t\tresources required to do this are available). The default value for maximum percent is\n\t\t\t200%.

\n

If a service uses either the CODE_DEPLOY or EXTERNAL\n\t\t\tdeployment controller types and tasks that use the EC2 launch type, the\n\t\t\t\tminimum healthy percent and maximum percent values are used only to define the lower and upper limit\n\t\t\ton the number of the tasks in the service that remain in the RUNNING state.\n\t\t\tThis is while the container instances are in the DRAINING state. If the\n\t\t\ttasks in the service use the Fargate launch type, the minimum healthy\n\t\t\tpercent and maximum percent values aren't used. This is the case even if they're\n\t\t\tcurrently visible when describing your service.

\n

When creating a service that uses the EXTERNAL deployment controller, you\n\t\t\tcan specify only parameters that aren't controlled at the task set level. The only\n\t\t\trequired parameter is the service name. You control your services using the CreateTaskSet operation. For more information, see Amazon ECS deployment types in the Amazon Elastic Container Service Developer Guide.

\n

When the service scheduler launches new tasks, it determines task placement. For\n\t\t\tinformation about task placement and task placement strategies, see Amazon ECS\n\t\t\t\ttask placement in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Runs and maintains your desired number of tasks from a specified task definition. If\n\t\t\tthe number of tasks running in a service drops below the desiredCount,\n\t\t\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\n\t\t\tservice, see the UpdateService action.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

In addition to maintaining the desired count of tasks in your service, you can\n\t\t\toptionally run your service behind one or more load balancers. The load balancers\n\t\t\tdistribute traffic across the tasks that are associated with the service. For more\n\t\t\tinformation, see Service load balancing in the Amazon Elastic Container Service Developer Guide.

\n

Tasks for services that don't use a load balancer are considered healthy if they're in\n\t\t\tthe RUNNING state. Tasks for services that use a load balancer are\n\t\t\tconsidered healthy if they're in the RUNNING state and are reported as\n\t\t\thealthy by the load balancer.

\n

There are two service scheduler strategies available:

\n
    \n
  • \n

    \n REPLICA - The replica scheduling strategy places and\n\t\t\t\t\tmaintains your desired number of tasks across your cluster. By default, the\n\t\t\t\t\tservice scheduler spreads tasks across Availability Zones. You can use task\n\t\t\t\t\tplacement strategies and constraints to customize task placement decisions. For\n\t\t\t\t\tmore information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    \n DAEMON - The daemon scheduling strategy deploys exactly one\n\t\t\t\t\ttask on each active container instance that meets all of the task placement\n\t\t\t\t\tconstraints that you specify in your cluster. The service scheduler also\n\t\t\t\t\tevaluates the task placement constraints for running tasks. It also stops tasks\n\t\t\t\t\tthat don't meet the placement constraints. When using this strategy, you don't\n\t\t\t\t\tneed to specify a desired number of tasks, a task placement strategy, or use\n\t\t\t\t\tService Auto Scaling policies. For more information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
\n

You can optionally specify a deployment configuration for your service. The deployment\n\t\t\tis initiated by changing properties. For example, the deployment might be initiated by\n\t\t\tthe task definition or by your desired count of a service. This is done with an UpdateService operation. The default value for a replica service for\n\t\t\t\tminimumHealthyPercent is 100%. The default value for a daemon service\n\t\t\tfor minimumHealthyPercent is 0%.

\n

If a service uses the ECS deployment controller, the minimum healthy\n\t\t\tpercent represents a lower limit on the number of tasks in a service that must remain in\n\t\t\tthe RUNNING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of your desired number of tasks (rounded up to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can deploy without using additional cluster capacity. For example, if you\n\t\t\tset your service to have desired number of four tasks and a minimum healthy percent of\n\t\t\t50%, the scheduler might stop two existing tasks to free up cluster capacity before\n\t\t\tstarting two new tasks. If they're in the RUNNING state, tasks for services\n\t\t\tthat don't use a load balancer are considered healthy . If they're in the\n\t\t\t\tRUNNING state and reported as healthy by the load balancer, tasks for\n\t\t\tservices that do use a load balancer are considered healthy . The\n\t\t\tdefault value for minimum healthy percent is 100%.

\n

If a service uses the ECS deployment controller, the maximum percent parameter represents an upper limit on the\n\t\t\tnumber of tasks in a service that are allowed in the RUNNING or\n\t\t\t\tPENDING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of the desired number of tasks (rounded down to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can define the deployment batch size. For example, if your service has a\n\t\t\tdesired number of four tasks and a maximum percent value of 200%, the scheduler may\n\t\t\tstart four new tasks before stopping the four older tasks (provided that the cluster\n\t\t\tresources required to do this are available). The default value for maximum percent is\n\t\t\t200%.

\n

If a service uses either the CODE_DEPLOY or EXTERNAL\n\t\t\tdeployment controller types and tasks that use the EC2 launch type, the\n\t\t\t\tminimum healthy percent and maximum percent values are used only to define the lower and upper limit\n\t\t\ton the number of the tasks in the service that remain in the RUNNING state.\n\t\t\tThis is while the container instances are in the DRAINING state. If the\n\t\t\ttasks in the service use the Fargate launch type, the minimum healthy\n\t\t\tpercent and maximum percent values aren't used. This is the case even if they're\n\t\t\tcurrently visible when describing your service.

\n

When creating a service that uses the EXTERNAL deployment controller, you\n\t\t\tcan specify only parameters that aren't controlled at the task set level. The only\n\t\t\trequired parameter is the service name. You control your services using the CreateTaskSet operation. For more information, see Amazon ECS deployment types in the Amazon Elastic Container Service Developer Guide.

\n

When the service scheduler launches new tasks, it determines task placement. For\n\t\t\tinformation about task placement and task placement strategies, see Amazon ECS\n\t\t\t\ttask placement in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new service", + "documentation": "This example creates a service in your default region called ``ecs-simple-service``. The service uses the ``hello_world`` task definition and it maintains 10 copies of that task.", + "input": { + "serviceName": "ecs-simple-service", + "taskDefinition": "hello_world", + "desiredCount": 10 + }, + "output": { + "service": { + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default", + "createdAt": "2016-08-29T16:13:47.298Z", + "deploymentConfiguration": { + "maximumPercent": 200, + "minimumHealthyPercent": 100 + }, + "deployments": [ + { + "createdAt": "2016-08-29T16:13:47.298Z", + "desiredCount": 10, + "id": "ecs-svc/9223370564342348388", + "pendingCount": 0, + "runningCount": 0, + "status": "PRIMARY", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:13:47.298Z" + }, + { + "createdAt": "2016-08-29T15:52:44.481Z", + "desiredCount": 0, + "id": "ecs-svc/9223370564343611322", + "pendingCount": 0, + "runningCount": 0, + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:11:38.941Z" + } + ], + "desiredCount": 10, + "events": [], + "loadBalancers": [], + "pendingCount": 0, + "runningCount": 0, + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service", + "serviceName": "ecs-simple-service", + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6" + } + } + } + ] } }, "com.amazonaws.ecs#CreateServiceRequest": { @@ -3175,13 +3217,13 @@ "target": "com.amazonaws.ecs#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\n\t\t\tmore information, see Tagging your Amazon ECS\n\t\t\t\tresources in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\n\t\t\tmore information, see Tagging your Amazon ECS\n\t\t\t\tresources in the Amazon Elastic Container Service Developer Guide.

\n

When you use Amazon ECS managed tags, you need to set the propagateTags\n\t\t\trequest parameter.

" } }, "propagateTags": { "target": "com.amazonaws.ecs#PropagateTags", "traits": { - "smithy.api#documentation": "

Specifies whether to propagate the tags from the task definition to the task. If no\n\t\t\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\n\t\t\tduring task creation. To add tags to a task after task creation, use the TagResource API action.

" + "smithy.api#documentation": "

Specifies whether to propagate the tags from the task definition to the task. If no\n\t\t\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\n\t\t\tduring task creation. To add tags to a task after task creation, use the TagResource API action.

\n

The default is NONE.

" } }, "enableExecuteCommand": { @@ -3289,7 +3331,7 @@ "taskDefinition": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The task definition for the tasks in the task set to use.

", + "smithy.api#documentation": "

The task definition for the tasks in the task set to use. If a revision isn't specified, the\n\t\t\tlatest ACTIVE revision is used.

", "smithy.api#required": {} } }, @@ -3386,7 +3428,23 @@ } ], "traits": { - "smithy.api#documentation": "

Disables an account setting for a specified user, role, or the root user for\n\t\t\tan account.

" + "smithy.api#documentation": "

Disables an account setting for a specified user, role, or the root user for\n\t\t\tan account.

", + "smithy.api#examples": [ + { + "title": "To delete your account setting", + "documentation": "This example deletes the account setting for your user for the specified resource type.", + "input": { + "name": "serviceLongArnFormat" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + } + } + ] } }, "com.amazonaws.ecs#DeleteAccountSettingRequest": { @@ -3569,7 +3627,27 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified cluster. The cluster transitions to the INACTIVE\n\t\t\tstate. Clusters with an INACTIVE status might remain discoverable in your\n\t\t\taccount for a period of time. However, this behavior is subject to change in the future.\n\t\t\tWe don't recommend that you rely on INACTIVE clusters persisting.

\n

You must deregister all container instances from this cluster before you may delete\n\t\t\tit. You can list the container instances in a cluster with ListContainerInstances and deregister them with DeregisterContainerInstance.

" + "smithy.api#documentation": "

Deletes the specified cluster. The cluster transitions to the INACTIVE\n\t\t\tstate. Clusters with an INACTIVE status might remain discoverable in your\n\t\t\taccount for a period of time. However, this behavior is subject to change in the future.\n\t\t\tWe don't recommend that you rely on INACTIVE clusters persisting.

\n

You must deregister all container instances from this cluster before you may delete\n\t\t\tit. You can list the container instances in a cluster with ListContainerInstances and deregister them with DeregisterContainerInstance.

", + "smithy.api#examples": [ + { + "title": "To delete an empty cluster", + "documentation": "This example deletes an empty cluster in your default region.", + "input": { + "cluster": "my_cluster" + }, + "output": { + "cluster": { + "activeServicesCount": 0, + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster", + "clusterName": "my_cluster", + "pendingTasksCount": 0, + "registeredContainerInstancesCount": 0, + "runningTasksCount": 0, + "status": "INACTIVE" + } + } + } + ] } }, "com.amazonaws.ecs#DeleteClusterRequest": { @@ -3627,7 +3705,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a specified service within a cluster. You can delete a service if you have no\n\t\t\trunning tasks in it and the desired task count is zero. If the service is actively\n\t\t\tmaintaining tasks, you can't delete it, and you must update the service to a desired\n\t\t\ttask count of zero. For more information, see UpdateService.

\n \n

When you delete a service, if there are still running tasks that require cleanup,\n\t\t\t\tthe service status moves from ACTIVE to DRAINING, and the\n\t\t\t\tservice is no longer visible in the console or in the ListServices\n\t\t\t\tAPI operation. After all tasks have transitioned to either STOPPING or\n\t\t\t\t\tSTOPPED status, the service status moves from DRAINING\n\t\t\t\tto INACTIVE. Services in the DRAINING or\n\t\t\t\t\tINACTIVE status can still be viewed with the DescribeServices API operation. However, in the future,\n\t\t\t\t\tINACTIVE services may be cleaned up and purged from Amazon ECS record\n\t\t\t\tkeeping, and DescribeServices calls on those services return a\n\t\t\t\t\tServiceNotFoundException error.

\n
\n \n

If you attempt to create a new service with the same name as an existing service\n\t\t\t\tin either ACTIVE or DRAINING status, you receive an\n\t\t\t\terror.

\n
" + "smithy.api#documentation": "

Deletes a specified service within a cluster. You can delete a service if you have no\n\t\t\trunning tasks in it and the desired task count is zero. If the service is actively\n\t\t\tmaintaining tasks, you can't delete it, and you must update the service to a desired\n\t\t\ttask count of zero. For more information, see UpdateService.

\n \n

When you delete a service, if there are still running tasks that require cleanup,\n\t\t\t\tthe service status moves from ACTIVE to DRAINING, and the\n\t\t\t\tservice is no longer visible in the console or in the ListServices\n\t\t\t\tAPI operation. After all tasks have transitioned to either STOPPING or\n\t\t\t\t\tSTOPPED status, the service status moves from DRAINING\n\t\t\t\tto INACTIVE. Services in the DRAINING or\n\t\t\t\t\tINACTIVE status can still be viewed with the DescribeServices API operation. However, in the future,\n\t\t\t\t\tINACTIVE services may be cleaned up and purged from Amazon ECS record\n\t\t\t\tkeeping, and DescribeServices calls on those services return a\n\t\t\t\t\tServiceNotFoundException error.

\n
\n \n

If you attempt to create a new service with the same name as an existing service\n\t\t\t\tin either ACTIVE or DRAINING status, you receive an\n\t\t\t\terror.

\n
", + "smithy.api#examples": [ + { + "title": "To delete a service", + "documentation": "This example deletes the my-http-service service. The service must have a desired count and running count of 0 before you can delete it.", + "input": { + "service": "my-http-service" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#DeleteServiceRequest": { @@ -3694,7 +3782,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes one or more task definitions.

\n

You must deregister a task definition revision before you delete it. For more information,\n\t\t\tsee DeregisterTaskDefinition.

\n

When you delete a task definition revision, it is immediately transitions from the\n\t\tINACTIVE to DELETE_IN_PROGRESS. Existing tasks and services\n\t\tthat reference a DELETE_IN_PROGRESS task definition revision continue to run\n\t\twithout disruption. Existing services that reference a DELETE_IN_PROGRESS task\n\t\tdefinition revision can still scale up or down by modifying the service's desired\n\t\tcount.

\n

You can't use a DELETE_IN_PROGRESS task definition revision to run new tasks\n\t\t\tor create new services. You also can't update an existing service to reference a\n\t\t\tDELETE_IN_PROGRESS task definition revision.

\n

A task definition revision will stay in DELETE_IN_PROGRESS status until\n\t\t\tall the associated tasks and services have been terminated.

" + "smithy.api#documentation": "

Deletes one or more task definitions.

\n

You must deregister a task definition revision before you delete it. For more information,\n\t\t\tsee DeregisterTaskDefinition.

\n

When you delete a task definition revision, it is immediately transitions from the\n\t\tINACTIVE to DELETE_IN_PROGRESS. Existing tasks and services\n\t\tthat reference a DELETE_IN_PROGRESS task definition revision continue to run\n\t\twithout disruption. Existing services that reference a DELETE_IN_PROGRESS task\n\t\tdefinition revision can still scale up or down by modifying the service's desired\n\t\tcount.

\n

You can't use a DELETE_IN_PROGRESS task definition revision to run new tasks\n\t\t\tor create new services. You also can't update an existing service to reference a\n\t\t\tDELETE_IN_PROGRESS task definition revision.

\n

A task definition revision will stay in DELETE_IN_PROGRESS status until\n\t\t\tall the associated tasks and services have been terminated.

\n

When you delete all INACTIVE task definition revisions, the task definition name is not displayed in the console and not returned in the API. If a task definition revisions are in the DELETE_IN_PROGRESS state, the task definition name is displayed in the console and returned in the API. The task definition name is retained by Amazon ECS and the revision is incremented the next time you create a task definition with that name.

" } }, "com.amazonaws.ecs#DeleteTaskDefinitionsRequest": { @@ -3994,7 +4082,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

The deployment circuit breaker can only be used for services using the rolling\n\t\t\t\tupdate (ECS) deployment type.

\n
\n

The deployment circuit breaker determines whether a\n\t\t\tservice deployment will fail if the service can't reach a steady state. If it is turned on, a\n\t\t\tservice deployment will transition to a failed state and stop launching new tasks. You\n\t\t\tcan also configure Amazon ECS to roll back your service to the last completed deployment\n\t\t\tafter a failure. For more information, see Rolling\n\t\t\t\tupdate in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "\n

The deployment circuit breaker can only be used for services using the rolling\n\t\t\t\tupdate (ECS) deployment type.

\n
\n

The deployment circuit breaker determines whether a\n\t\t\tservice deployment will fail if the service can't reach a steady state. If it is turned on, a\n\t\t\tservice deployment will transition to a failed state and stop launching new tasks. You\n\t\t\tcan also configure Amazon ECS to roll back your service to the last completed deployment\n\t\t\tafter a failure. For more information, see Rolling\n\t\t\t\tupdate in the Amazon Elastic Container Service Developer Guide.

\n

For more information about API failure reasons, see API failure reasons in the Amazon Elastic Container Service Developer Guide.

" } }, "com.amazonaws.ecs#DeploymentConfiguration": { @@ -4119,7 +4207,19 @@ } ], "traits": { - "smithy.api#documentation": "

Deregisters an Amazon ECS container instance from the specified cluster. This instance is\n\t\t\tno longer available to run tasks.

\n

If you intend to use the container instance for some other purpose after\n\t\t\tderegistration, we recommend that you stop all of the tasks running on the container\n\t\t\tinstance before deregistration. That prevents any orphaned tasks from consuming\n\t\t\tresources.

\n

Deregistering a container instance removes the instance from a cluster, but it doesn't\n\t\t\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\n\t\t\tit in the Amazon EC2 console to stop billing.

\n \n

If you terminate a running container instance, Amazon ECS automatically deregisters the\n\t\t\t\tinstance from your cluster (stopped container instances or instances with\n\t\t\t\tdisconnected agents aren't automatically deregistered when terminated).

\n
" + "smithy.api#documentation": "

Deregisters an Amazon ECS container instance from the specified cluster. This instance is\n\t\t\tno longer available to run tasks.

\n

If you intend to use the container instance for some other purpose after\n\t\t\tderegistration, we recommend that you stop all of the tasks running on the container\n\t\t\tinstance before deregistration. That prevents any orphaned tasks from consuming\n\t\t\tresources.

\n

Deregistering a container instance removes the instance from a cluster, but it doesn't\n\t\t\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\n\t\t\tit in the Amazon EC2 console to stop billing.

\n \n

If you terminate a running container instance, Amazon ECS automatically deregisters the\n\t\t\t\tinstance from your cluster (stopped container instances or instances with\n\t\t\t\tdisconnected agents aren't automatically deregistered when terminated).

\n
", + "smithy.api#examples": [ + { + "title": "To deregister a container instance from a cluster", + "documentation": "This example deregisters a container instance from the specified cluster in your default region. If there are still tasks running on the container instance, you must either stop those tasks before deregistering, or use the force option.", + "input": { + "cluster": "default", + "force": true, + "containerInstance": "container_instance_UUID" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#DeregisterContainerInstanceRequest": { @@ -4316,7 +4416,28 @@ } ], "traits": { - "smithy.api#documentation": "

Describes one or more of your clusters.

" + "smithy.api#documentation": "

Describes one or more of your clusters.

", + "smithy.api#examples": [ + { + "title": "To describe a cluster", + "documentation": "This example provides a description of the specified cluster in your default region.", + "input": { + "clusters": [ + "default" + ] + }, + "output": { + "clusters": [ + { + "clusterName": "default", + "status": "ACTIVE", + "clusterArn": "arn:aws:ecs:us-east-1:aws_account_id:cluster/default" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#DescribeClustersRequest": { @@ -4382,7 +4503,91 @@ } ], "traits": { - "smithy.api#documentation": "

Describes one or more container instances. Returns metadata about each container\n\t\t\tinstance requested.

" + "smithy.api#documentation": "

Describes one or more container instances. Returns metadata about each container\n\t\t\tinstance requested.

", + "smithy.api#examples": [ + { + "title": "To describe container instance", + "documentation": "This example provides a description of the specified container instance in your default region, using the container instance UUID as an identifier.", + "input": { + "cluster": "default", + "containerInstances": [ + "f2756532-8f13-4d53-87c9-aed50dc94cd7" + ] + }, + "output": { + "failures": [], + "containerInstances": [ + { + "status": "ACTIVE", + "registeredResources": [ + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 2048, + "name": "CPU" + }, + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 3768, + "name": "MEMORY" + }, + { + "name": "PORTS", + "longValue": 0, + "doubleValue": 0.0, + "stringSetValue": [ + "2376", + "22", + "51678", + "2375" + ], + "type": "STRINGSET", + "integerValue": 0 + } + ], + "ec2InstanceId": "i-807f3249", + "agentConnected": true, + "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/f2756532-8f13-4d53-87c9-aed50dc94cd7", + "pendingTasksCount": 0, + "remainingResources": [ + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 1948, + "name": "CPU" + }, + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 3668, + "name": "MEMORY" + }, + { + "name": "PORTS", + "longValue": 0, + "doubleValue": 0.0, + "stringSetValue": [ + "2376", + "22", + "80", + "51678", + "2375" + ], + "type": "STRINGSET", + "integerValue": 0 + } + ], + "runningTasksCount": 1 + } + ] + } + } + ] } }, "com.amazonaws.ecs#DescribeContainerInstancesRequest": { @@ -4456,6 +4661,57 @@ ], "traits": { "smithy.api#documentation": "

Describes the specified services running in your cluster.

", + "smithy.api#examples": [ + { + "title": "To describe a service", + "documentation": "This example provides descriptive information about the service named ``ecs-simple-service``.", + "input": { + "services": [ + "ecs-simple-service" + ] + }, + "output": { + "failures": [], + "services": [ + { + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default", + "createdAt": "2016-08-29T16:25:52.130Z", + "deploymentConfiguration": { + "maximumPercent": 200, + "minimumHealthyPercent": 100 + }, + "deployments": [ + { + "createdAt": "2016-08-29T16:25:52.130Z", + "desiredCount": 1, + "id": "ecs-svc/9223370564341623665", + "pendingCount": 0, + "runningCount": 0, + "status": "PRIMARY", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:25:52.130Z" + } + ], + "desiredCount": 1, + "events": [ + { + "createdAt": "2016-08-29T16:25:58.520Z", + "id": "38c285e5-d335-4b68-8b15-e46dedc8e88d", + "message": "(service ecs-simple-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 3f4de1c5-ffdd-4954-af7e-75b4be0c8841) is already using a port required by your task. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide." + } + ], + "loadBalancers": [], + "pendingCount": 0, + "runningCount": 0, + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service", + "serviceName": "ecs-simple-service", + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6" + } + ] + } + } + ], "smithy.waiters#waitable": { "ServicesInactive": { "acceptors": [ @@ -4597,7 +4853,61 @@ } ], "traits": { - "smithy.api#documentation": "

Describes a task definition. You can specify a family and\n\t\t\t\trevision to find information about a specific task definition, or you\n\t\t\tcan simply specify the family to find the latest ACTIVE revision in that\n\t\t\tfamily.

\n \n

You can only describe INACTIVE task definitions while an active task\n\t\t\t\tor service references them.

\n
" + "smithy.api#documentation": "

Describes a task definition. You can specify a family and\n\t\t\t\trevision to find information about a specific task definition, or you\n\t\t\tcan simply specify the family to find the latest ACTIVE revision in that\n\t\t\tfamily.

\n \n

You can only describe INACTIVE task definitions while an active task\n\t\t\t\tor service references them.

\n
", + "smithy.api#examples": [ + { + "title": "To describe a task definition", + "documentation": "This example provides a description of the specified task definition.", + "input": { + "taskDefinition": "hello_world:8" + }, + "output": { + "taskDefinition": { + "family": "hello_world", + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/hello_world:8", + "containerDefinitions": [ + { + "mountPoints": [], + "name": "wordpress", + "links": [ + "mysql" + ], + "image": "wordpress", + "cpu": 10, + "environment": [], + "memory": 500, + "portMappings": [ + { + "containerPort": 80, + "hostPort": 80 + } + ], + "essential": true, + "volumesFrom": [] + }, + { + "mountPoints": [], + "name": "mysql", + "image": "mysql", + "cpu": 10, + "environment": [ + { + "name": "MYSQL_ROOT_PASSWORD", + "value": "password" + } + ], + "memory": 500, + "portMappings": [], + "volumesFrom": [], + "essential": true + } + ], + "volumes": [], + "revision": 8 + } + } + } + ] } }, "com.amazonaws.ecs#DescribeTaskDefinitionRequest": { @@ -4756,7 +5066,54 @@ } ], "traits": { - "smithy.api#documentation": "

Describes a specified task or tasks.

\n

Currently, stopped tasks appear in the returned results for at least one hour.

", + "smithy.api#documentation": "

Describes a specified task or tasks.

\n

Currently, stopped tasks appear in the returned results for at least one hour.

\n

If you have tasks with tags, and then delete the cluster, the tagged tasks are\n\t\t\treturned in the response. If you create a new cluster with the same name as the deleted\n\t\t\tcluster, the tagged tasks are not included in the response.

", + "smithy.api#examples": [ + { + "title": "To describe a task", + "documentation": "This example provides a description of the specified task, using the task UUID as an identifier.", + "input": { + "tasks": [ + "c5cba4eb-5dad-405e-96db-71ef8eefe6a8" + ] + }, + "output": { + "failures": [], + "tasks": [ + { + "taskArn": "arn:aws:ecs:::task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "overrides": { + "containerOverrides": [ + { + "name": "ecs-demo" + } + ] + }, + "lastStatus": "RUNNING", + "containerInstanceArn": "arn:aws:ecs:::container-instance/18f9eda5-27d7-4c19-b133-45adc516e8fb", + "clusterArn": "arn:aws:ecs:::cluster/default", + "desiredStatus": "RUNNING", + "taskDefinitionArn": "arn:aws:ecs:::task-definition/amazon-ecs-sample:1", + "startedBy": "ecs-svc/9223370608528463088", + "containers": [ + { + "containerArn": "arn:aws:ecs:::container/7c01765b-c588-45b3-8290-4ba38bd6c5a6", + "taskArn": "arn:aws:ecs:::task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "lastStatus": "RUNNING", + "name": "ecs-demo", + "networkBindings": [ + { + "bindIP": "0.0.0.0", + "containerPort": 80, + "hostPort": 80 + } + ] + } + ] + } + ] + } + } + ], "smithy.waiters#waitable": { "TasksRunning": { "acceptors": [ @@ -5174,7 +5531,7 @@ } }, "traits": { - "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can\n\t\t\tspecify up to ten environment files. The file must have a .env file\n\t\t\textension. Each line in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored. For more information about the environment variable file\n\t\t\tsyntax, see Declare default\n\t\t\t\tenvironment variables in file.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

This parameter is only supported for tasks hosted on Fargate using the\n\t\t\tfollowing platform versions:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
" + "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can\n\t\t\tspecify up to ten environment files. The file must have a .env file\n\t\t\textension. Each line in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored. For more information about the environment variable file\n\t\t\tsyntax, see Declare default\n\t\t\t\tenvironment variables in file.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

You must use the following platforms for the Fargate launch type:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
" } }, "com.amazonaws.ecs#EnvironmentFileType": { @@ -5586,7 +5943,29 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the protection status of tasks in an Amazon ECS service.

" + "smithy.api#documentation": "

Retrieves the protection status of tasks in an Amazon ECS service.

", + "smithy.api#examples": [ + { + "title": "To get the protection status of a task", + "documentation": "In this example, we get the protection status for a single task.", + "input": { + "cluster": "test-task-protection", + "tasks": [ + "b8b1cf532d0e46ba8d44a40d1de16772" + ] + }, + "output": { + "protectedTasks": [ + { + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/b8b1cf532d0e46ba8d44a40d1de16772", + "protectionEnabled": true, + "expirationDate": "2022-11-02T06:56:32.553Z" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#GetTaskProtectionRequest": { @@ -5672,7 +6051,7 @@ } }, "traits": { - "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated or\n\t\t\t\t\tthere's no container health check defined.

    \n
  • \n
\n

The following describes the possible healthStatus values for a task. The\n\t\t\tcontainer health check status of\n\t\t\tnon-essential containers don't have an effect on the health status of a task.

\n
    \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-The essential containers within the task are still\n\t\t\t\t\thaving their health checks evaluated, there are only nonessential containers\n\t\t\t\t\twith health checks defined, or there are no container health checks\n\t\t\t\t\tdefined.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" + "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The health check is designed to make sure that your containers survive\n\t\t\tagent restarts, upgrades, or temporary unavailability.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated or\n\t\t\t\t\tthere's no container health check defined.

    \n
  • \n
\n

The following describes the possible healthStatus values for a task. The\n\t\t\tcontainer health check status of\n\t\t\tnon-essential containers don't have an effect on the health status of a task.

\n
    \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-The essential containers within the task are still\n\t\t\t\t\thaving their health checks evaluated, there are only nonessential containers\n\t\t\t\t\twith health checks defined, or there are no container health checks\n\t\t\t\t\tdefined.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    When the Amazon ECS agent cannot connect to the Amazon ECS service, the\n\t\t\t\t\tservice reports the container as UNHEALTHY.

    \n
  • \n
  • \n

    The health check statuses are the \"last heard from\" response from the Amazon ECS agent. There\n\t\t\t\t\tare no assumptions made about the status of the container health checks.

    \n
  • \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" } }, "com.amazonaws.ecs#HealthStatus": { @@ -6059,6 +6438,34 @@ ], "traits": { "smithy.api#documentation": "

Lists the account settings for a specified principal.

", + "smithy.api#examples": [ + { + "title": "To view your effective account settings", + "documentation": "This example displays the effective account settings for your account.", + "input": { + "effectiveSettings": true + }, + "output": { + "settings": [ + { + "name": "containerInstanceLongArnFormat", + "value": "disabled", + "principalArn": "arn:aws:iam:::user/principalName" + }, + { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + }, + { + "name": "taskLongArnFormat", + "value": "disabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6245,6 +6652,18 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of existing clusters.

", + "smithy.api#examples": [ + { + "title": "To list your available clusters", + "documentation": "This example lists all of your available clusters in your default region.", + "output": { + "clusterArns": [ + "arn:aws:ecs:us-east-1::cluster/test", + "arn:aws:ecs:us-east-1::cluster/default" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6317,6 +6736,21 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of container instances in a specified cluster. You can filter the\n\t\t\tresults of a ListContainerInstances operation with cluster query language\n\t\t\tstatements inside the filter parameter. For more information, see Cluster Query Language in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list your available container instances in a cluster", + "documentation": "This example lists all of your available container instances in the specified cluster in your default region.", + "input": { + "cluster": "default" + }, + "output": { + "containerInstanceArns": [ + "arn:aws:ecs:us-east-1::container-instance/f6bbb147-5370-4ace-8c73-c7181ded911f", + "arn:aws:ecs:us-east-1::container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6407,6 +6841,17 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of services. You can filter the results by cluster, launch type, and\n\t\t\tscheduling strategy.

", + "smithy.api#examples": [ + { + "title": "To list the services in a cluster", + "documentation": "This example lists the services running in the default cluster for an account.", + "output": { + "serviceArns": [ + "arn:aws:ecs:us-east-1:012345678910:service/my-http-service" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6575,7 +7020,24 @@ } ], "traits": { - "smithy.api#documentation": "

List the tags for an Amazon ECS resource.

" + "smithy.api#documentation": "

List the tags for an Amazon ECS resource.

", + "smithy.api#examples": [ + { + "title": "To list the tags for a cluster.", + "documentation": "This example lists the tags for the 'dev' cluster.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev" + }, + "output": { + "tags": [ + { + "key": "team", + "value": "dev" + } + ] + } + } + ] } }, "com.amazonaws.ecs#ListTagsForResourceRequest": { @@ -6628,6 +7090,20 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of task definition families that are registered to your account. This\n\t\t\tlist includes task definition families that no longer have any ACTIVE task\n\t\t\tdefinition revisions.

\n

You can filter out task definition families that don't contain any ACTIVE\n\t\t\ttask definition revisions by setting the status parameter to\n\t\t\t\tACTIVE. You can also filter the results with the\n\t\t\t\tfamilyPrefix parameter.

", + "smithy.api#examples": [ + { + "title": "To list your registered task definition families", + "documentation": "This example lists all of your registered task definition families.", + "output": { + "families": [ + "node-js-app", + "web-timer", + "hpcc", + "hpcc-c4-8xlarge" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6709,6 +7185,22 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of task definitions that are registered to your account. You can filter\n\t\t\tthe results by family name with the familyPrefix parameter or by status\n\t\t\twith the status parameter.

", + "smithy.api#examples": [ + { + "title": "To list your registered task definitions", + "documentation": "This example lists all of your registered task definitions.", + "output": { + "taskDefinitionArns": [ + "arn:aws:ecs:us-east-1::task-definition/sleep300:2", + "arn:aws:ecs:us-east-1::task-definition/sleep360:1", + "arn:aws:ecs:us-east-1::task-definition/wordpress:3", + "arn:aws:ecs:us-east-1::task-definition/wordpress:4", + "arn:aws:ecs:us-east-1::task-definition/wordpress:5", + "arn:aws:ecs:us-east-1::task-definition/wordpress:6" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6801,7 +7293,22 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a list of tasks. You can filter the results by cluster, task definition\n\t\t\tfamily, container instance, launch type, what IAM principal started the task, or by the\n\t\t\tdesired status of the task.

\n

Recently stopped tasks might appear in the returned results. Currently, stopped tasks\n\t\t\tappear in the returned results for at least one hour.

", + "smithy.api#documentation": "

Returns a list of tasks. You can filter the results by cluster, task definition\n\t\t\tfamily, container instance, launch type, what IAM principal started the task, or by the\n\t\t\tdesired status of the task.

\n

Recently stopped tasks might appear in the returned results.

", + "smithy.api#examples": [ + { + "title": "To list the tasks in a cluster", + "documentation": "This example lists all of the tasks in a cluster.", + "input": { + "cluster": "default" + }, + "output": { + "taskArns": [ + "arn:aws:ecs:us-east-1:012345678910:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84", + "arn:aws:ecs:us-east-1:012345678910:task/6b809ef6-c67e-4467-921f-ee261c15a0a1" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6898,13 +7405,13 @@ "targetGroupArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\n\t\t\ttask set.

\n

A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer. If you're using a\n\t\t\tClassic Load Balancer, omit the target group ARN.

\n

For services using the ECS deployment controller, you can specify one or\n\t\t\tmultiple target groups. For more information, see Registering multiple target groups with a service in\n\t\t\tthe Amazon Elastic Container Service Developer Guide.

\n

For services using the CODE_DEPLOY deployment controller, you're required\n\t\t\tto define two target groups for the load balancer. For more information, see Blue/green deployment with CodeDeploy in the\n\t\t\tAmazon Elastic Container Service Developer Guide.

\n \n

If your service's task definition uses the awsvpc network mode, you\n\t\t\t\tmust choose ip as the target type, not instance. Do this\n\t\t\t\twhen creating your target groups because tasks that use the awsvpc\n\t\t\t\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\n\t\t\t\tinstance. This network mode is required for the Fargate launch\n\t\t\t\ttype.

\n
" + "smithy.api#documentation": "

The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\n\t\t\ttask set.

\n

A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer.

\n

For services using the ECS deployment controller, you can specify one or\n\t\t\tmultiple target groups. For more information, see Registering multiple target groups with a service in\n\t\t\tthe Amazon Elastic Container Service Developer Guide.

\n

For services using the CODE_DEPLOY deployment controller, you're required\n\t\t\tto define two target groups for the load balancer. For more information, see Blue/green deployment with CodeDeploy in the\n\t\t\tAmazon Elastic Container Service Developer Guide.

\n \n

If your service's task definition uses the awsvpc network mode, you\n\t\t\t\tmust choose ip as the target type, not instance. Do this\n\t\t\t\twhen creating your target groups because tasks that use the awsvpc\n\t\t\t\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\n\t\t\t\tinstance. This network mode is required for the Fargate launch\n\t\t\t\ttype.

\n
" } }, "loadBalancerName": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The name of the load balancer to associate with the Amazon ECS service or task set.

\n

A load balancer name is only specified when using a Classic Load Balancer. If you are using an Application Load Balancer\n\t\t\tor a Network Load Balancer the load balancer name parameter should be omitted.

" + "smithy.api#documentation": "

The name of the load balancer to associate with the Amazon ECS service or task set.

\n

If you are using an Application Load Balancer or a Network Load Balancer the load balancer name parameter should be\n\t\t\tomitted.

" } }, "containerName": { @@ -6954,7 +7461,7 @@ } }, "traits": { - "smithy.api#documentation": "

The log configuration for the container. This parameter maps to LogConfig\n\t\t\tin the Create a container section of the Docker Remote API and the\n\t\t\t\t--log-driver option to \n docker\n\t\t\t\t\trun\n .

\n

By default, containers use the same logging driver that the Docker daemon uses.\n\t\t\tHowever, the container might use a different logging driver than the Docker daemon by\n\t\t\tspecifying a log driver configuration in the container definition. For more information\n\t\t\tabout the options for different supported log drivers, see Configure logging\n\t\t\t\tdrivers in the Docker documentation.

\n

Understand the following when specifying a log configuration for your\n\t\t\tcontainers.

\n
    \n
  • \n

    Amazon ECS currently supports a subset of the logging drivers available to the\n\t\t\t\t\tDocker daemon (shown in the valid values below). Additional log drivers may be\n\t\t\t\t\tavailable in future releases of the Amazon ECS container agent.

    \n
  • \n
  • \n

    This parameter requires version 1.18 of the Docker Remote API or greater on\n\t\t\t\t\tyour container instance.

    \n
  • \n
  • \n

    For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\n\t\t\t\t\tregister the available logging drivers with the\n\t\t\t\t\t\tECS_AVAILABLE_LOGGING_DRIVERS environment variable before\n\t\t\t\t\tcontainers placed on that instance can use these log configuration options. For\n\t\t\t\t\tmore information, see Amazon ECS container agent configuration in the\n\t\t\t\t\tAmazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    For tasks that are on Fargate, because you don't have access to the\n\t\t\t\t\tunderlying infrastructure your tasks are hosted on, any additional software\n\t\t\t\t\tneeded must be installed outside of the task. For example, the Fluentd output\n\t\t\t\t\taggregators or a remote host running Logstash to send Gelf logs to.

    \n
  • \n
" + "smithy.api#documentation": "

The log configuration for the container. This parameter maps to LogConfig\n\t\t\tin the Create a container section of the Docker Remote API and the\n\t\t\t\t--log-driver option to \n docker\n\t\t\t\t\trun\n .

\n

By default, containers use the same logging driver that the Docker daemon uses.\n\t\t\tHowever, the container might use a different logging driver than the Docker daemon by\n\t\t\tspecifying a log driver configuration in the container definition. For more information\n\t\t\tabout the options for different supported log drivers, see Configure logging\n\t\t\t\tdrivers in the Docker documentation.

\n

Understand the following when specifying a log configuration for your\n\t\t\tcontainers.

\n
    \n
  • \n

    Amazon ECS currently supports a subset of the logging drivers available to the Docker daemon.\n\t\t\t\t\tAdditional log drivers may be available in future releases of the Amazon ECS\n\t\t\t\t\tcontainer agent.

    \n

    For tasks on Fargate, the supported log drivers are awslogs,\n\t\t\t\t\t\tsplunk, and awsfirelens.

    \n

    For tasks hosted on Amazon EC2 instances, the supported log drivers are\n\t\t\t\t\t\tawslogs, fluentd, gelf,\n\t\t\t\t\t\tjson-file, journald,\n\t\t\t\t\t\tlogentries,syslog, splunk, and\n\t\t\t\t\t\tawsfirelens.

    \n
  • \n
  • \n

    This parameter requires version 1.18 of the Docker Remote API or greater on\n\t\t\t\t\tyour container instance.

    \n
  • \n
  • \n

    For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\n\t\t\t\t\tregister the available logging drivers with the\n\t\t\t\t\t\tECS_AVAILABLE_LOGGING_DRIVERS environment variable before\n\t\t\t\t\tcontainers placed on that instance can use these log configuration options. For\n\t\t\t\t\tmore information, see Amazon ECS container agent configuration in the\n\t\t\t\t\tAmazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    For tasks that are on Fargate, because you don't have access to the\n\t\t\t\t\tunderlying infrastructure your tasks are hosted on, any additional software\n\t\t\t\t\tneeded must be installed outside of the task. For example, the Fluentd output\n\t\t\t\t\taggregators or a remote host running Logstash to send Gelf logs to.

    \n
  • \n
" } }, "com.amazonaws.ecs#LogConfigurationOptionsMap": { @@ -7139,7 +7646,7 @@ "maximumScalingStepSize": { "target": "com.amazonaws.ecs#ManagedScalingStepSize", "traits": { - "smithy.api#documentation": "

The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale\n\t\t\tin process is not affected by this parameter. If this parameter is omitted, the default\n\t\t\tvalue of 1 is used.

" + "smithy.api#documentation": "

The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale in\n\t\t\tprocess is not affected by this parameter. If this parameter is omitted, the default\n\t\t\tvalue of 10000 is used.

" } }, "instanceWarmupPeriod": { @@ -7644,7 +8151,7 @@ "hostPort": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

The port number on the container instance to reserve for your container.

\n

If you specify a containerPortRange, leave this field empty and the value of\n\t\t\tthe hostPort is set as follows:

\n
    \n
  • \n

    For containers in a task with the awsvpc network mode, the\n\t\t\t\t\t\thostPort is set to the same value as the\n\t\t\t\t\t\tcontainerPort. This is a static mapping strategy.

    \n
  • \n
  • \n

    For containers in a task with the bridge network mode, the Amazon ECS agent finds\n\t\t\t\t\topen ports on the host and automatically binds them to the container ports. This\n\t\t\t\t\tis a dynamic mapping strategy.

    \n
  • \n
\n

If you use containers in a task with the awsvpc or host\n\t\t\tnetwork mode, the hostPort can either be left blank or set to the same\n\t\t\tvalue as the containerPort.

\n

If you use containers in a task with the bridge network mode, you can\n\t\t\tspecify a non-reserved host port for your container port mapping, or you can omit the\n\t\t\t\thostPort (or set it to 0) while specifying a\n\t\t\t\tcontainerPort and your container automatically receives a port in the\n\t\t\tephemeral port range for your container instance operating system and Docker\n\t\t\tversion.

\n

The default ephemeral port range for Docker version 1.6.0 and later is listed on the\n\t\t\tinstance under /proc/sys/net/ipv4/ip_local_port_range. If this kernel\n\t\t\tparameter is unavailable, the default ephemeral port range from 49153 through 65535 is\n\t\t\tused. Do not attempt to specify a host port in the ephemeral port range as these are\n\t\t\treserved for automatic assignment. In general, ports below 32768 are outside of the\n\t\t\tephemeral port range.

\n

The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\n\t\t\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\n\t\t\ta running task is also reserved while the task is running. That is, after a task stops,\n\t\t\tthe host port is released. The current reserved ports are displayed in the\n\t\t\tremainingResources of DescribeContainerInstances\n\t\t\toutput. A container instance can have up to 100 reserved ports at a time. This number\n\t\t\tincludes the default reserved ports. Automatically assigned ports aren't included in the\n\t\t\t100 reserved ports quota.

" + "smithy.api#documentation": "

The port number on the container instance to reserve for your container.

\n

If you specify a containerPortRange, leave this field empty and the value of\n\t\t\tthe hostPort is set as follows:

\n
    \n
  • \n

    For containers in a task with the awsvpc network mode, the\n\t\t\t\t\t\thostPort is set to the same value as the\n\t\t\t\t\t\tcontainerPort. This is a static mapping strategy.

    \n
  • \n
  • \n

    For containers in a task with the bridge network mode, the Amazon ECS agent finds\n\t\t\t\t\topen ports on the host and automatically binds them to the container ports. This\n\t\t\t\t\tis a dynamic mapping strategy.

    \n
  • \n
\n

If you use containers in a task with the awsvpc or host\n\t\t\tnetwork mode, the hostPort can either be left blank or set to the same\n\t\t\tvalue as the containerPort.

\n

If you use containers in a task with the bridge network mode, you can\n\t\t\tspecify a non-reserved host port for your container port mapping, or you can omit the\n\t\t\t\thostPort (or set it to 0) while specifying a\n\t\t\t\tcontainerPort and your container automatically receives a port in the\n\t\t\tephemeral port range for your container instance operating system and Docker\n\t\t\tversion.

\n

The default ephemeral port range for Docker version 1.6.0 and later is listed on the\n\t\t\tinstance under /proc/sys/net/ipv4/ip_local_port_range. If this kernel\n\t\t\tparameter is unavailable, the default ephemeral port range from 49153 through 65535\n\t\t\t(Linux) or 49152 through 65535 (Windows) is used. Do not attempt to specify a host port\n\t\t\tin the ephemeral port range as these are reserved for automatic assignment. In general,\n\t\t\tports below 32768 are outside of the ephemeral port range.

\n

The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\n\t\t\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\n\t\t\ta running task is also reserved while the task is running. That is, after a task stops,\n\t\t\tthe host port is released. The current reserved ports are displayed in the\n\t\t\tremainingResources of DescribeContainerInstances\n\t\t\toutput. A container instance can have up to 100 reserved ports at a time. This number\n\t\t\tincludes the default reserved ports. Automatically assigned ports aren't included in the\n\t\t\t100 reserved ports quota.

" } }, "protocol": { @@ -7811,7 +8318,24 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat are specified, the Amazon Resource Name\n\t\t\t(ARN) and resource ID format of the resource type for a specified user, role, or\n\t\t\tthe root user for an account is affected. The opt-in and opt-out account setting must be\n\t\t\tset for each Amazon ECS resource separately. The ARN and resource ID format of a resource\n\t\t\tis defined by the opt-in status of the user or role that created the resource. You\n\t\t\tmust turn on this setting to use Amazon ECS features such as resource tagging.

\n

When awsvpcTrunking is specified, the elastic network interface (ENI)\n\t\t\tlimit for any new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support the\n\t\t\tfeature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When containerInsights is specified, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

" + "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When you specify serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat, the Amazon Resource Name (ARN) and\n\t\t\tresource ID format of the resource type for a specified user, role, or the root user for an\n\t\t\taccount is affected. The opt-in and opt-out account setting must be set for each Amazon ECS\n\t\t\tresource separately. The ARN and resource ID format of a resource is defined by the\n\t\t\topt-in status of the user or role that created the resource. You must turn on this\n\t\t\tsetting to use Amazon ECS features such as resource tagging.

\n

When you specify awsvpcTrunking, the elastic network interface (ENI) limit for\n\t\t\tany new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support\n\t\t\tthe feature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When you specify containerInsights, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

\n

When Amazon Web Services determines that a security or infrastructure update is needed for an Amazon ECS\n\t\t\ttask hosted on Fargate, the tasks need to be stopped and new tasks launched to replace\n\t\t\tthem. Use fargateTaskRetirementWaitPeriod to configure the wait time to\n\t\t\tretire a Fargate task. For information about the Fargate tasks maintenance, see Amazon Web Services Fargate task maintenance in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#examples": [ + { + "title": "To modify your account settings", + "documentation": "This example modifies your account settings to opt in to the new ARN and resource ID format for Amazon ECS services. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.", + "input": { + "name": "serviceLongArnFormat", + "value": "enabled" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + } + } + ] } }, "com.amazonaws.ecs#PutAccountSettingDefault": { @@ -7834,7 +8358,24 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting for all users on an account for whom no individual\n\t\t\taccount setting has been specified. Account settings are set on a per-Region\n\t\t\tbasis.

" + "smithy.api#documentation": "

Modifies an account setting for all users on an account for whom no individual\n\t\t\taccount setting has been specified. Account settings are set on a per-Region\n\t\t\tbasis.

", + "smithy.api#examples": [ + { + "title": "To modify the default account settings for all IAM users or roles on an account", + "documentation": "This example modifies the default account setting for the specified resource for all IAM users or roles on an account. These changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.", + "input": { + "name": "serviceLongArnFormat", + "value": "enabled" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::root" + } + } + } + ] } }, "com.amazonaws.ecs#PutAccountSettingDefaultRequest": { @@ -7843,14 +8384,14 @@ "name": { "target": "com.amazonaws.ecs#SettingName", "traits": { - "smithy.api#documentation": "

The resource name for which to modify the account setting. If\n\t\t\t\tserviceLongArnFormat is specified, the ARN for your Amazon ECS services is\n\t\t\taffected. If taskLongArnFormat is specified, the ARN and resource ID for\n\t\t\tyour Amazon ECS tasks is affected. If containerInstanceLongArnFormat is\n\t\t\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\n\t\t\t\tawsvpcTrunking is specified, the ENI limit for your Amazon ECS container\n\t\t\tinstances is affected. If containerInsights is specified, the default\n\t\t\tsetting for Amazon Web Services CloudWatch Container Insights for your clusters is affected. If\n\t\t\t\ttagResourceAuthorization is specified, the opt-in option for tagging\n\t\t\tresources on creation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide.

\n

When you specify fargateFIPSMode for the name and\n\t\t\tenabled for the value, Fargate uses FIPS-140 compliant\n\t\t\tcryptographic algorithms on your tasks. For more information about FIPS-140 compliance\n\t\t\twith Fargate, see Amazon Web Services Fargate Federal Information Processing Standard (FIPS) 140-2\n\t\t\t\tcompliance in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#documentation": "

The resource name for which to modify the account setting. If you specify\n\t\t\t\tserviceLongArnFormat, the ARN for your Amazon ECS services is affected. If\n\t\t\tyou specify taskLongArnFormat, the ARN and resource ID for your Amazon ECS\n\t\t\ttasks is affected. If you specify containerInstanceLongArnFormat, the ARN\n\t\t\tand resource ID for your Amazon ECS container instances is affected. If you specify\n\t\t\t\tawsvpcTrunking, the ENI limit for your Amazon ECS container instances is\n\t\t\taffected. If you specify containerInsights, the default setting for Amazon Web Services\n\t\t\tCloudWatch Container Insights for your clusters is affected. If you specify\n\t\t\t\ttagResourceAuthorization, the opt-in option for tagging resources on\n\t\t\tcreation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide. If you specify fargateTaskRetirementWaitPeriod, the\n\t\t\tdefault wait time to retire a Fargate task due to required maintenance is\n\t\t\taffected.

\n

When you specify fargateFIPSMode for the name and\n\t\t\tenabled for the value, Fargate uses FIPS-140 compliant\n\t\t\tcryptographic algorithms on your tasks. For more information about FIPS-140 compliance\n\t\t\twith Fargate, see Amazon Web Services Fargate Federal Information Processing Standard (FIPS) 140-2\n\t\t\t\tcompliance in the Amazon Elastic Container Service Developer Guide.

\n

When Amazon Web Services determines that a security or infrastructure update is needed for an Amazon ECS task\n\t\t\thosted on Fargate, the tasks need to be stopped and new tasks launched to replace\n\t\t\tthem. Use fargateTaskRetirementWaitPeriod to set the wait time to retire a\n\t\t\tFargate task to the default. For information about the Fargate tasks maintenance,\n\t\t\tsee Amazon Web Services Fargate task\n\t\t\t\tmaintenance in the Amazon ECS Developer Guide.

", "smithy.api#required": {} } }, "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

", + "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

\n

When you specify fargateTaskRetirementWaitPeriod for the\n\t\t\t\tname, the following are the valid values:

\n
    \n
  • \n

    \n 0 - Amazon Web Services sends the notification, and immediately retires the affected tasks.

    \n
  • \n
  • \n

    \n 7 - Amazon Web Services sends the notification, and waits 7 calendar days to retire the tasks.

    \n
  • \n
  • \n

    \n 14 - Amazon Web Services sends the notification, and waits 14 calendar days to retire the tasks.

    \n
  • \n
", "smithy.api#required": {} } } @@ -7879,21 +8420,21 @@ "name": { "target": "com.amazonaws.ecs#SettingName", "traits": { - "smithy.api#documentation": "

The Amazon ECS resource name for which to modify the account setting. If\n\t\t\t\tserviceLongArnFormat is specified, the ARN for your Amazon ECS services is\n\t\t\taffected. If taskLongArnFormat is specified, the ARN and resource ID for\n\t\t\tyour Amazon ECS tasks is affected. If containerInstanceLongArnFormat is\n\t\t\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\n\t\t\t\tawsvpcTrunking is specified, the elastic network interface (ENI) limit\n\t\t\tfor your Amazon ECS container instances is affected. If containerInsights is\n\t\t\tspecified, the default setting for Amazon Web Services CloudWatch Container Insights for your clusters is\n\t\t\taffected. If fargateFIPSMode is specified, Fargate FIPS 140 compliance is\n\t\t\taffected. If tagResourceAuthorization is specified, the opt-in option for\n\t\t\ttagging resources on creation is affected. For information about the opt-in timeline,\n\t\t\tsee Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#documentation": "

The Amazon ECS resource name for which to modify the account setting. If you specify\n\t\t\t\tserviceLongArnFormat, the ARN for your Amazon ECS services is affected. If\n\t\t\tyou specify taskLongArnFormat, the ARN and resource ID for your Amazon ECS\n\t\t\ttasks is affected. If you specify containerInstanceLongArnFormat, the ARN\n\t\t\tand resource ID for your Amazon ECS container instances is affected. If you specify\n\t\t\t\tawsvpcTrunking, the elastic network interface (ENI) limit for your\n\t\t\tAmazon ECS container instances is affected. If you specify containerInsights,\n\t\t\tthe default setting for Amazon Web Services CloudWatch Container Insights for your clusters is affected. If\n\t\t\tyou specify fargateFIPSMode, Fargate FIPS 140 compliance is affected. If\n\t\t\tyou specify tagResourceAuthorization, the opt-in option for tagging\n\t\t\tresources on creation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide. If you specify fargateTaskRetirementWaitPeriod, the\n\t\t\twait time to retire a Fargate task is affected.

", "smithy.api#required": {} } }, "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

", + "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

\n

When you specify fargateTaskRetirementWaitPeriod for the name, the\n\t\t\tfollowing are the valid values:

\n
    \n
  • \n

    \n 0 - Amazon Web Services sends the notification, and immediately retires the affected tasks.

    \n
  • \n
  • \n

    \n 7 - Amazon Web Services sends the notification, and waits 7 calendar days to retire the tasks.

    \n
  • \n
  • \n

    \n 14 - Amazon Web Services sends the notification, and waits 14 calendar days to retire the tasks.

    \n
  • \n
", "smithy.api#required": {} } }, "principalArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The ARN of the principal, which can be a user, role, or the root user. If\n\t\t\tyou specify the root user, it modifies the account setting for all users, roles,\n\t\t\tand the root user of the account unless a user or role explicitly overrides these\n\t\t\tsettings. If this field is omitted, the setting is changed only for the authenticated\n\t\t\tuser.

\n \n

Federated users assume the account setting of the root user and can't have\n\t\t\t\texplicit account settings set for them.

\n
" + "smithy.api#documentation": "

The ARN of the principal, which can be a user, role, or the root user. If\n\t\t\tyou specify the root user, it modifies the account setting for all users, roles,\n\t\t\tand the root user of the account unless a user or role explicitly overrides these\n\t\t\tsettings. If this field is omitted, the setting is changed only for the authenticated\n\t\t\tuser.

\n \n

You must use the root user when you set the Fargate wait time\n\t\t\t\t\t(fargateTaskRetirementWaitPeriod).

\n

Federated users assume the account setting of the root user and can't have\n\t\t\t\texplicit account settings set for them.

\n
" } } }, @@ -8170,7 +8711,56 @@ } ], "traits": { - "smithy.api#documentation": "

Registers a new task definition from the supplied family and\n\t\t\t\tcontainerDefinitions. Optionally, you can add data volumes to your\n\t\t\tcontainers with the volumes parameter. For more information about task\n\t\t\tdefinition parameters and defaults, see Amazon ECS Task\n\t\t\t\tDefinitions in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a role for your task with the taskRoleArn parameter.\n\t\t\tWhen you specify a role for a task, its containers can then use the latest versions\n\t\t\tof the CLI or SDKs to make API requests to the Amazon Web Services services that are specified in\n\t\t\tthe policy that's associated with the role. For more information, see IAM\n\t\t\t\tRoles for Tasks in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a Docker networking mode for the containers in your task definition\n\t\t\twith the networkMode parameter. The available network modes correspond to\n\t\t\tthose described in Network\n\t\t\t\tsettings in the Docker run reference. If you specify the awsvpc\n\t\t\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\n\t\t\t\tNetworkConfiguration when you create a service or run a task with\n\t\t\tthe task definition. For more information, see Task Networking\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Registers a new task definition from the supplied family and\n\t\t\t\tcontainerDefinitions. Optionally, you can add data volumes to your\n\t\t\tcontainers with the volumes parameter. For more information about task\n\t\t\tdefinition parameters and defaults, see Amazon ECS Task\n\t\t\t\tDefinitions in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a role for your task with the taskRoleArn parameter.\n\t\t\tWhen you specify a role for a task, its containers can then use the latest versions\n\t\t\tof the CLI or SDKs to make API requests to the Amazon Web Services services that are specified in\n\t\t\tthe policy that's associated with the role. For more information, see IAM\n\t\t\t\tRoles for Tasks in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a Docker networking mode for the containers in your task definition\n\t\t\twith the networkMode parameter. The available network modes correspond to\n\t\t\tthose described in Network\n\t\t\t\tsettings in the Docker run reference. If you specify the awsvpc\n\t\t\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\n\t\t\t\tNetworkConfiguration when you create a service or run a task with\n\t\t\tthe task definition. For more information, see Task Networking\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To register a task definition", + "documentation": "This example registers a task definition to the specified family.", + "input": { + "family": "sleep360", + "taskRoleArn": "", + "containerDefinitions": [ + { + "name": "sleep", + "image": "busybox", + "cpu": 10, + "command": [ + "sleep", + "360" + ], + "memory": 10, + "essential": true + } + ], + "volumes": [] + }, + "output": { + "taskDefinition": { + "volumes": [], + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:19", + "containerDefinitions": [ + { + "environment": [], + "name": "sleep", + "mountPoints": [], + "image": "busybox", + "cpu": 10, + "portMappings": [], + "command": [ + "sleep", + "360" + ], + "memory": 10, + "essential": true, + "volumesFrom": [] + } + ], + "family": "sleep360", + "revision": 1 + } + } + } + ] } }, "com.amazonaws.ecs#RegisterTaskDefinitionRequest": { @@ -8247,7 +8837,7 @@ "pidMode": { "target": "com.amazonaws.ecs#PidMode", "traits": { - "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. If host\n is specified, then all containers within the tasks that specified the\n host PID mode on the same container instance share the\n same process namespace with the host Amazon EC2 instance. If task is\n specified, all containers within the specified task share the same\n process namespace. If no value is specified, the default is a private\n namespace. For more information, see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, be aware that there is a\n heightened risk of undesired process namespace expose. For more\n information, see Docker\n security.

\n \n

This parameter is not supported for Windows containers or tasks run on Fargate.

\n
" + "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. On Fargate for\n Linux containers, the only valid value is task. For\n example, monitoring sidecars might need pidMode to access\n information about other containers running in the same task.

\n

If host is specified, all containers within the tasks\n that specified the host PID mode on the same container\n instance share the same process namespace with the host Amazon EC2\n instance.

\n

If task is specified, all containers within the specified\n task share the same process namespace.

\n

If no value is specified, the\n default is a private namespace for each container. For more information,\n see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, there's a heightened risk\n of undesired process namespace exposure. For more information, see\n Docker security.

\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "ipcMode": { @@ -8486,7 +9076,43 @@ } ], "traits": { - "smithy.api#documentation": "

Starts a new task using the specified task definition.

\n

You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\n\t\t\ttasks using placement constraints and placement strategies. For more information, see\n\t\t\t\tScheduling Tasks in the Amazon Elastic Container Service Developer Guide.

\n

Alternatively, you can use StartTask to use your own scheduler or\n\t\t\tplace tasks manually on specific container instances.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

The Amazon ECS API follows an eventual consistency model. This is because of the\n\t\t\tdistributed nature of the system supporting the API. This means that the result of an\n\t\t\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\n\t\t\tto all subsequent commands you run. Keep this in mind when you carry out an API command\n\t\t\tthat immediately follows a previous API command.

\n

To manage eventual consistency, you can do the following:

\n
    \n
  • \n

    Confirm the state of the resource before you run a command to modify it. Run\n\t\t\t\t\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\n\t\t\t\t\tyou allow enough time for the previous command to propagate through the system.\n\t\t\t\t\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\n\t\t\t\t\tseconds of wait time and increasing gradually up to five minutes of wait\n\t\t\t\t\ttime.

    \n
  • \n
  • \n

    Add wait time between subsequent commands, even if the DescribeTasks command\n\t\t\t\t\treturns an accurate response. Apply an exponential backoff algorithm starting\n\t\t\t\t\twith a couple of seconds of wait time, and increase gradually up to about five\n\t\t\t\t\tminutes of wait time.

    \n
  • \n
" + "smithy.api#documentation": "

Starts a new task using the specified task definition.

\n

You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\n\t\t\ttasks using placement constraints and placement strategies. For more information, see\n\t\t\t\tScheduling Tasks in the Amazon Elastic Container Service Developer Guide.

\n

Alternatively, you can use StartTask to use your own scheduler or\n\t\t\tplace tasks manually on specific container instances.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

The Amazon ECS API follows an eventual consistency model. This is because of the\n\t\t\tdistributed nature of the system supporting the API. This means that the result of an\n\t\t\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\n\t\t\tto all subsequent commands you run. Keep this in mind when you carry out an API command\n\t\t\tthat immediately follows a previous API command.

\n

To manage eventual consistency, you can do the following:

\n
    \n
  • \n

    Confirm the state of the resource before you run a command to modify it. Run\n\t\t\t\t\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\n\t\t\t\t\tyou allow enough time for the previous command to propagate through the system.\n\t\t\t\t\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\n\t\t\t\t\tseconds of wait time and increasing gradually up to five minutes of wait\n\t\t\t\t\ttime.

    \n
  • \n
  • \n

    Add wait time between subsequent commands, even if the DescribeTasks command\n\t\t\t\t\treturns an accurate response. Apply an exponential backoff algorithm starting\n\t\t\t\t\twith a couple of seconds of wait time, and increase gradually up to about five\n\t\t\t\t\tminutes of wait time.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To run a task on your default cluster", + "documentation": "This example runs the specified task definition on your default cluster.", + "input": { + "cluster": "default", + "taskDefinition": "sleep360:1" + }, + "output": { + "tasks": [ + { + "taskArn": "arn:aws:ecs:us-east-1::task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "overrides": { + "containerOverrides": [ + { + "name": "sleep" + } + ] + }, + "lastStatus": "PENDING", + "containerInstanceArn": "arn:aws:ecs:us-east-1::container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb", + "desiredStatus": "RUNNING", + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:1", + "containers": [ + { + "containerArn": "arn:aws:ecs:us-east-1::container/58591c8e-be29-4ddf-95aa-ee459d4c59fd", + "taskArn": "arn:aws:ecs:us-east-1::task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "lastStatus": "PENDING", + "name": "sleep" + } + ] + } + ] + } + } + ] } }, "com.amazonaws.ecs#RunTaskRequest": { @@ -9289,6 +9915,12 @@ "traits": { "smithy.api#enumValue": "tagResourceAuthorization" } + }, + "FARGATE_TASK_RETIREMENT_WAIT_PERIOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "fargateTaskRetirementWaitPeriod" + } } } }, @@ -9827,7 +10459,7 @@ "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The value for the namespaced kernel parameter that's specified in\n\t\t\t\tnamespace.

" + "smithy.api#documentation": "

The namespaced kernel parameter to set a\n\t\t\tvalue for.

\n

Valid IPC namespace values: \"kernel.msgmax\" | \"kernel.msgmnb\" | \"kernel.msgmni\"\n\t\t\t| \"kernel.sem\" | \"kernel.shmall\" | \"kernel.shmmax\" |\n\t\t\t\"kernel.shmmni\" | \"kernel.shm_rmid_forced\", and\n\t\t\tSysctls that start with\n\t\t\t\"fs.mqueue.*\"\n

\n

Valid network namespace values: Sysctls that start with\n\t\t\t\"net.*\"\n

\n

All of these values are supported by Fargate.

" } } }, @@ -9903,7 +10535,23 @@ } ], "traits": { - "smithy.api#documentation": "

Associates the specified tags to a resource with the specified\n\t\t\t\tresourceArn. If existing tags on a resource aren't specified in the\n\t\t\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\n\t\t\tassociated with that resource are deleted as well.

" + "smithy.api#documentation": "

Associates the specified tags to a resource with the specified\n\t\t\t\tresourceArn. If existing tags on a resource aren't specified in the\n\t\t\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\n\t\t\tassociated with that resource are deleted as well.

", + "smithy.api#examples": [ + { + "title": "To tag a cluster.", + "documentation": "This example tags the 'dev' cluster with key 'team' and value 'dev'.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev", + "tags": [ + { + "key": "team", + "value": "dev" + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#TagResourceRequest": { @@ -10161,7 +10809,7 @@ "stopCode": { "target": "com.amazonaws.ecs#TaskStopCode", "traits": { - "smithy.api#documentation": "

The stop code indicating why a task was stopped. The stoppedReason might\n\t\t\tcontain additional details.

\n

The following are valid values:

\n
    \n
  • \n

    \n TaskFailedToStart\n

    \n
  • \n
  • \n

    \n EssentialContainerExited\n

    \n
  • \n
  • \n

    \n UserInitiated\n

    \n
  • \n
  • \n

    \n TerminationNotice\n

    \n
  • \n
  • \n

    \n ServiceSchedulerInitiated\n

    \n
  • \n
  • \n

    \n SpotInterruption\n

    \n
  • \n
" + "smithy.api#documentation": "

The stop code indicating why a task was stopped. The stoppedReason might\n\t\t\tcontain additional details.

\n

For more information about stop code, see Stopped tasks error codes in the Amazon ECS User Guide.

\n

The following are valid values:

\n
    \n
  • \n

    \n TaskFailedToStart\n

    \n
  • \n
  • \n

    \n EssentialContainerExited\n

    \n
  • \n
  • \n

    \n UserInitiated\n

    \n
  • \n
  • \n

    \n TerminationNotice\n

    \n
  • \n
  • \n

    \n ServiceSchedulerInitiated\n

    \n
  • \n
  • \n

    \n SpotInterruption\n

    \n
  • \n
" } }, "stoppedAt": { @@ -10179,7 +10827,7 @@ "stoppingAt": { "target": "com.amazonaws.ecs#Timestamp", "traits": { - "smithy.api#documentation": "

The Unix timestamp for the time when the task stops. More specifically, it's for the\n\t\t\ttime when the task transitions from the RUNNING state to\n\t\t\t\tSTOPPED.

" + "smithy.api#documentation": "

The Unix timestamp for the time when the task stops. More specifically, it's for the\n\t\t\ttime when the task transitions from the RUNNING state to\n\t\t\t\tSTOPPING.

" } }, "tags": { @@ -10303,7 +10951,7 @@ "requiresCompatibilities": { "target": "com.amazonaws.ecs#CompatibilityList", "traits": { - "smithy.api#documentation": "

The task launch types the task definition was validated against. For more information, see Amazon ECS launch types\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

The task launch types the task definition was validated against. The valid values are\n\t\t\t\tEC2, FARGATE, and EXTERNAL. For more\n\t\t\tinformation, see Amazon ECS launch types\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" } }, "cpu": { @@ -10327,7 +10975,7 @@ "pidMode": { "target": "com.amazonaws.ecs#PidMode", "traits": { - "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. If host\n is specified, then all containers within the tasks that specified the\n host PID mode on the same container instance share the\n same process namespace with the host Amazon EC2 instance. If task is\n specified, all containers within the specified task share the same\n process namespace. If no value is specified, the default is a private\n namespace. For more information, see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, be aware that there is a\n heightened risk of undesired process namespace expose. For more\n information, see Docker\n security.

\n \n

This parameter is not supported for Windows containers or tasks run on Fargate.

\n
" + "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. On Fargate for\n Linux containers, the only valid value is task. For\n example, monitoring sidecars might need pidMode to access\n information about other containers running in the same task.

\n

If host is specified, all containers within the tasks\n that specified the host PID mode on the same container\n instance share the same process namespace with the host Amazon EC2\n instance.

\n

If task is specified, all containers within the specified\n task share the same process namespace.

\n

If no value is specified, the\n default is a private namespace for each container. For more information,\n see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, there's a heightened risk\n of undesired process namespace exposure. For more information, see\n Docker security.

\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "ipcMode": { @@ -11006,7 +11654,20 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes specified tags from a resource.

" + "smithy.api#documentation": "

Deletes specified tags from a resource.

", + "smithy.api#examples": [ + { + "title": "To untag a cluster.", + "documentation": "This example deletes the 'team' tag from the 'dev' cluster.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev", + "tagKeys": [ + "team" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#UntagResourceRequest": { @@ -11432,7 +12093,18 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies the parameters of a service.

\n

For services using the rolling update (ECS) you can update the desired\n\t\t\tcount, deployment configuration, network configuration, load balancers, service\n\t\t\tregistries, enable ECS managed tags option, propagate tags option, task placement\n\t\t\tconstraints and strategies, and task definition. When you update any of these\n\t\t\tparameters, Amazon ECS starts new tasks with the new configuration.

\n

For services using the blue/green (CODE_DEPLOY) deployment controller,\n\t\t\tonly the desired count, deployment configuration, health check grace period, task\n\t\t\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\n\t\t\tcan be updated using this API. If the network configuration, platform version, task\n\t\t\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\n\t\t\tinformation, see CreateDeployment in the CodeDeploy API Reference.

\n

For services using an external deployment controller, you can update only the desired\n\t\t\tcount, task placement constraints and strategies, health check grace period, enable ECS\n\t\t\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\n\t\t\tbalancer, network configuration, platform version, or task definition need to be\n\t\t\tupdated, create a new task set For more information, see CreateTaskSet.

\n

You can add to or subtract from the number of instantiations of a task definition in a\n\t\t\tservice by specifying the cluster that the service is running in and a new\n\t\t\t\tdesiredCount parameter.

\n

If you have updated the Docker image of your application, you can create a new task\n\t\t\tdefinition with that image and deploy it to your service. The service scheduler uses the\n\t\t\tminimum healthy percent and maximum percent parameters (in the service's deployment\n\t\t\tconfiguration) to determine the deployment strategy.

\n \n

If your updated Docker image uses the same tag as what is in the existing task\n\t\t\t\tdefinition for your service (for example, my_image:latest), you don't\n\t\t\t\tneed to create a new revision of your task definition. You can update the service\n\t\t\t\tusing the forceNewDeployment option. The new tasks launched by the\n\t\t\t\tdeployment pull the current image/tag combination from your repository when they\n\t\t\t\tstart.

\n
\n

You can also update the deployment configuration of a service. When a deployment is\n\t\t\ttriggered by updating the task definition of a service, the service scheduler uses the\n\t\t\tdeployment configuration parameters, minimumHealthyPercent and\n\t\t\t\tmaximumPercent, to determine the deployment strategy.

\n
    \n
  • \n

    If minimumHealthyPercent is below 100%, the scheduler can ignore\n\t\t\t\t\t\tdesiredCount temporarily during a deployment. For example, if\n\t\t\t\t\t\tdesiredCount is four tasks, a minimum of 50% allows the\n\t\t\t\t\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\n\t\t\t\t\tservices that don't use a load balancer are considered healthy if they're in the\n\t\t\t\t\t\tRUNNING state. Tasks for services that use a load balancer are\n\t\t\t\t\tconsidered healthy if they're in the RUNNING state and are reported\n\t\t\t\t\tas healthy by the load balancer.

    \n
  • \n
  • \n

    The maximumPercent parameter represents an upper limit on the\n\t\t\t\t\tnumber of running tasks during a deployment. You can use it to define the\n\t\t\t\t\tdeployment batch size. For example, if desiredCount is four tasks,\n\t\t\t\t\ta maximum of 200% starts four new tasks before stopping the four older tasks\n\t\t\t\t\t(provided that the cluster resources required to do this are available).

    \n
  • \n
\n

When UpdateService stops a task during a deployment, the equivalent\n\t\t\tof docker stop is issued to the containers running in the task. This\n\t\t\tresults in a SIGTERM and a 30-second timeout. After this,\n\t\t\t\tSIGKILL is sent and the containers are forcibly stopped. If the\n\t\t\tcontainer handles the SIGTERM gracefully and exits within 30 seconds from\n\t\t\treceiving it, no SIGKILL is sent.

\n

When the service scheduler launches new tasks, it determines task placement in your\n\t\t\tcluster with the following logic.

\n
    \n
  • \n

    Determine which of the container instances in your cluster can support your\n\t\t\t\t\tservice's task definition. For example, they have the required CPU, memory,\n\t\t\t\t\tports, and container instance attributes.

    \n
  • \n
  • \n

    By default, the service scheduler attempts to balance tasks across\n\t\t\t\t\tAvailability Zones in this manner even though you can choose a different\n\t\t\t\t\tplacement strategy.

    \n
      \n
    • \n

      Sort the valid container instances by the fewest number of running\n\t\t\t\t\t\t\ttasks for this service in the same Availability Zone as the instance.\n\t\t\t\t\t\t\tFor example, if zone A has one running service task and zones B and C\n\t\t\t\t\t\t\teach have zero, valid container instances in either zone B or C are\n\t\t\t\t\t\t\tconsidered optimal for placement.

      \n
    • \n
    • \n

      Place the new service task on a valid container instance in an optimal\n\t\t\t\t\t\t\tAvailability Zone (based on the previous steps), favoring container\n\t\t\t\t\t\t\tinstances with the fewest number of running tasks for this\n\t\t\t\t\t\t\tservice.

      \n
    • \n
    \n
  • \n
\n

When the service scheduler stops running tasks, it attempts to maintain balance across\n\t\t\tthe Availability Zones in your cluster using the following logic:

\n
    \n
  • \n

    Sort the container instances by the largest number of running tasks for this\n\t\t\t\t\tservice in the same Availability Zone as the instance. For example, if zone A\n\t\t\t\t\thas one running service task and zones B and C each have two, container\n\t\t\t\t\tinstances in either zone B or C are considered optimal for termination.

    \n
  • \n
  • \n

    Stop the task on a container instance in an optimal Availability Zone (based\n\t\t\t\t\ton the previous steps), favoring container instances with the largest number of\n\t\t\t\t\trunning tasks for this service.

    \n
  • \n
\n \n

You must have a service-linked role when you update any of the following service\n\t\t\t\tproperties. If you specified a custom role when you created the service, Amazon ECS\n\t\t\t\tautomatically replaces the roleARN associated with the service with the ARN of your\n\t\t\t\tservice-linked role. For more information, see Service-linked roles in the Amazon Elastic Container Service Developer Guide.

\n
    \n
  • \n

    \n loadBalancers,\n

    \n
  • \n
  • \n

    \n serviceRegistries\n

    \n
  • \n
\n
" + "smithy.api#documentation": "

Modifies the parameters of a service.

\n

For services using the rolling update (ECS) you can update the desired\n\t\t\tcount, deployment configuration, network configuration, load balancers, service\n\t\t\tregistries, enable ECS managed tags option, propagate tags option, task placement\n\t\t\tconstraints and strategies, and task definition. When you update any of these\n\t\t\tparameters, Amazon ECS starts new tasks with the new configuration.

\n

For services using the blue/green (CODE_DEPLOY) deployment controller,\n\t\t\tonly the desired count, deployment configuration, health check grace period, task\n\t\t\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\n\t\t\tcan be updated using this API. If the network configuration, platform version, task\n\t\t\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\n\t\t\tinformation, see CreateDeployment in the CodeDeploy API Reference.

\n

For services using an external deployment controller, you can update only the desired\n\t\t\tcount, task placement constraints and strategies, health check grace period, enable ECS\n\t\t\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\n\t\t\tbalancer, network configuration, platform version, or task definition need to be\n\t\t\tupdated, create a new task set For more information, see CreateTaskSet.

\n

You can add to or subtract from the number of instantiations of a task definition in a\n\t\t\tservice by specifying the cluster that the service is running in and a new\n\t\t\t\tdesiredCount parameter.

\n

If you have updated the Docker image of your application, you can create a new task\n\t\t\tdefinition with that image and deploy it to your service. The service scheduler uses the\n\t\t\tminimum healthy percent and maximum percent parameters (in the service's deployment\n\t\t\tconfiguration) to determine the deployment strategy.

\n \n

If your updated Docker image uses the same tag as what is in the existing task\n\t\t\t\tdefinition for your service (for example, my_image:latest), you don't\n\t\t\t\tneed to create a new revision of your task definition. You can update the service\n\t\t\t\tusing the forceNewDeployment option. The new tasks launched by the\n\t\t\t\tdeployment pull the current image/tag combination from your repository when they\n\t\t\t\tstart.

\n
\n

You can also update the deployment configuration of a service. When a deployment is\n\t\t\ttriggered by updating the task definition of a service, the service scheduler uses the\n\t\t\tdeployment configuration parameters, minimumHealthyPercent and\n\t\t\t\tmaximumPercent, to determine the deployment strategy.

\n
    \n
  • \n

    If minimumHealthyPercent is below 100%, the scheduler can ignore\n\t\t\t\t\t\tdesiredCount temporarily during a deployment. For example, if\n\t\t\t\t\t\tdesiredCount is four tasks, a minimum of 50% allows the\n\t\t\t\t\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\n\t\t\t\t\tservices that don't use a load balancer are considered healthy if they're in the\n\t\t\t\t\t\tRUNNING state. Tasks for services that use a load balancer are\n\t\t\t\t\tconsidered healthy if they're in the RUNNING state and are reported\n\t\t\t\t\tas healthy by the load balancer.

    \n
  • \n
  • \n

    The maximumPercent parameter represents an upper limit on the\n\t\t\t\t\tnumber of running tasks during a deployment. You can use it to define the\n\t\t\t\t\tdeployment batch size. For example, if desiredCount is four tasks,\n\t\t\t\t\ta maximum of 200% starts four new tasks before stopping the four older tasks\n\t\t\t\t\t(provided that the cluster resources required to do this are available).

    \n
  • \n
\n

When UpdateService stops a task during a deployment, the equivalent\n\t\t\tof docker stop is issued to the containers running in the task. This\n\t\t\tresults in a SIGTERM and a 30-second timeout. After this,\n\t\t\t\tSIGKILL is sent and the containers are forcibly stopped. If the\n\t\t\tcontainer handles the SIGTERM gracefully and exits within 30 seconds from\n\t\t\treceiving it, no SIGKILL is sent.

\n

When the service scheduler launches new tasks, it determines task placement in your\n\t\t\tcluster with the following logic.

\n
    \n
  • \n

    Determine which of the container instances in your cluster can support your\n\t\t\t\t\tservice's task definition. For example, they have the required CPU, memory,\n\t\t\t\t\tports, and container instance attributes.

    \n
  • \n
  • \n

    By default, the service scheduler attempts to balance tasks across\n\t\t\t\t\tAvailability Zones in this manner even though you can choose a different\n\t\t\t\t\tplacement strategy.

    \n
      \n
    • \n

      Sort the valid container instances by the fewest number of running\n\t\t\t\t\t\t\ttasks for this service in the same Availability Zone as the instance.\n\t\t\t\t\t\t\tFor example, if zone A has one running service task and zones B and C\n\t\t\t\t\t\t\teach have zero, valid container instances in either zone B or C are\n\t\t\t\t\t\t\tconsidered optimal for placement.

      \n
    • \n
    • \n

      Place the new service task on a valid container instance in an optimal\n\t\t\t\t\t\t\tAvailability Zone (based on the previous steps), favoring container\n\t\t\t\t\t\t\tinstances with the fewest number of running tasks for this\n\t\t\t\t\t\t\tservice.

      \n
    • \n
    \n
  • \n
\n

When the service scheduler stops running tasks, it attempts to maintain balance across\n\t\t\tthe Availability Zones in your cluster using the following logic:

\n
    \n
  • \n

    Sort the container instances by the largest number of running tasks for this\n\t\t\t\t\tservice in the same Availability Zone as the instance. For example, if zone A\n\t\t\t\t\thas one running service task and zones B and C each have two, container\n\t\t\t\t\tinstances in either zone B or C are considered optimal for termination.

    \n
  • \n
  • \n

    Stop the task on a container instance in an optimal Availability Zone (based\n\t\t\t\t\ton the previous steps), favoring container instances with the largest number of\n\t\t\t\t\trunning tasks for this service.

    \n
  • \n
\n \n

You must have a service-linked role when you update any of the following service\n\t\t\t\tproperties:

\n
    \n
  • \n

    \n loadBalancers,

    \n
  • \n
  • \n

    \n serviceRegistries\n

    \n
  • \n
\n

For more information about the role see the CreateService request parameter\n\t\t\t\t\n role\n .

\n
", + "smithy.api#examples": [ + { + "title": "To change the task definition used in a service", + "documentation": "This example updates the my-http-service service to use the amazon-ecs-sample task definition.", + "input": { + "service": "my-http-service", + "taskDefinition": "amazon-ecs-sample" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#UpdateServicePrimaryTaskSet": { @@ -11683,7 +12355,31 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the protection status of a task. You can set protectionEnabled to\n\t\t\t\ttrue to protect your task from termination during scale-in events from\n\t\t\t\tService\n\t\t\t\tAutoscaling or deployments.

\n

Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\n\t\t\t\tprotectionEnabled property making the task eligible for termination by\n\t\t\ta subsequent scale-in event.

\n

You can specify a custom expiration period for task protection from 1 minute to up to\n\t\t\t2,880 minutes (48 hours). To specify the custom expiration period, set the\n\t\t\t\texpiresInMinutes property. The expiresInMinutes property\n\t\t\tis always reset when you invoke this operation for a task that already has\n\t\t\t\tprotectionEnabled set to true. You can keep extending the\n\t\t\tprotection expiration period of a task by invoking this operation repeatedly.

\n

To learn more about Amazon ECS task protection, see Task scale-in\n\t\t\t\tprotection in the \n Amazon Elastic Container Service Developer Guide\n .

\n \n

This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\n\t\t\t\tthis operation for a standalone task will result in an TASK_NOT_VALID\n\t\t\t\tfailure. For more information, see API failure\n\t\t\t\t\treasons.

\n
\n \n

If you prefer to set task protection from within the container, we recommend using\n\t\t\t\tthe Task scale-in protection endpoint.

\n
" + "smithy.api#documentation": "

Updates the protection status of a task. You can set protectionEnabled to\n\t\t\t\ttrue to protect your task from termination during scale-in events from\n\t\t\t\tService\n\t\t\t\tAutoscaling or deployments.

\n

Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\n\t\t\t\tprotectionEnabled property making the task eligible for termination by\n\t\t\ta subsequent scale-in event.

\n

You can specify a custom expiration period for task protection from 1 minute to up to\n\t\t\t2,880 minutes (48 hours). To specify the custom expiration period, set the\n\t\t\t\texpiresInMinutes property. The expiresInMinutes property\n\t\t\tis always reset when you invoke this operation for a task that already has\n\t\t\t\tprotectionEnabled set to true. You can keep extending the\n\t\t\tprotection expiration period of a task by invoking this operation repeatedly.

\n

To learn more about Amazon ECS task protection, see Task scale-in\n\t\t\t\tprotection in the \n Amazon Elastic Container Service Developer Guide\n .

\n \n

This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\n\t\t\t\tthis operation for a standalone task will result in an TASK_NOT_VALID\n\t\t\t\tfailure. For more information, see API failure\n\t\t\t\t\treasons.

\n
\n \n

If you prefer to set task protection from within the container, we recommend using\n\t\t\t\tthe Task scale-in protection endpoint.

\n
", + "smithy.api#examples": [ + { + "title": "To set task scale-in protection for a task for 60 minutes", + "documentation": "This example enables scale-in protection for a task for 60 minutes.", + "input": { + "cluster": "test-task-protection", + "tasks": [ + "b8b1cf532d0e46ba8d44a40d1de16772" + ], + "protectionEnabled": true, + "expiresInMinutes": 60 + }, + "output": { + "protectedTasks": [ + { + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/b8b1cf532d0e46ba8d44a40d1de16772", + "protectionEnabled": true, + "expirationDate": "2022-11-02T06:56:32.553Z" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#UpdateTaskProtectionRequest": { @@ -11865,7 +12561,7 @@ "name": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the\n\t\t\t\tsourceVolume parameter of container definition\n\t\t\tmountPoints.

" + "smithy.api#documentation": "

The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the\n\t\t\t\tsourceVolume parameter of container definition\n\t\t\tmountPoints.

\n

This is required wwhen you use an Amazon EFS volume.

" } }, "host": { diff --git a/aws/sdk/aws-models/iam.json b/aws/sdk/aws-models/iam.json index 3f222206c62..8ad03eb5281 100644 --- a/aws/sdk/aws-models/iam.json +++ b/aws/sdk/aws-models/iam.json @@ -222,6 +222,9 @@ { "target": "com.amazonaws.iam#GetLoginProfile" }, + { + "target": "com.amazonaws.iam#GetMFADevice" + }, { "target": "com.amazonaws.iam#GetOpenIDConnectProvider" }, @@ -585,52 +588,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -638,597 +645,557 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://iam-fips.amazonaws.com", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-east-1" } - ], - "endpoint": { - "url": "https://iam-fips.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-cn" + "name" ] }, + "aws-cn" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.cn-north-1.amazonaws.com.cn", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "iam", + "signingRegion": "cn-north-1" } - ], - "endpoint": { - "url": "https://iam.cn-north-1.amazonaws.com.cn", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "cn-north-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso" + "name" ] }, + "aws-iso" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-iso-east-1.c2s.ic.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-iso-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-iso-east-1.c2s.ic.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-iso-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso-b" + "name" ] }, + "aws-iso-b" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-isob-east-1.sc2s.sgov.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-isob-east-1" } - ], - "endpoint": { - "url": "https://iam.us-isob-east-1.sc2s.sgov.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-isob-east-1" - } - ] + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "headers": {} - }, - "type": "endpoint" + true + ] }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } ] } ], "type": "tree", "rules": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://iam-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, + "conditions": [], + "endpoint": { + "url": "https://iam-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } + "ref": "UseFIPS" + }, + true ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://iam-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://iam-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://iam.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://iam.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://iam.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://iam.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1975,7 +1942,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds a new client ID (also known as audience) to the list of client IDs already\n registered for the specified IAM OpenID Connect (OIDC) provider resource.

\n

This operation is idempotent; it does not fail or return an error if you add an\n existing client ID to the provider.

" + "smithy.api#documentation": "

Adds a new client ID (also known as audience) to the list of client IDs already\n registered for the specified IAM OpenID Connect (OIDC) provider resource.

\n

This operation is idempotent; it does not fail or return an error if you add an\n existing client ID to the provider.

", + "smithy.api#examples": [ + { + "title": "To add a client ID (audience) to an Open-ID Connect (OIDC) provider", + "documentation": "The following add-client-id-to-open-id-connect-provider command adds the client ID my-application-ID to the OIDC provider named server.example.com:", + "input": { + "ClientID": "my-application-ID", + "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com" + } + } + ] } }, "com.amazonaws.iam#AddClientIDToOpenIDConnectProviderRequest": { @@ -2026,7 +2003,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see Working with roles. For more\n information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a role to an instance profile", + "documentation": "The following command adds the role named S3Access to the instance profile named Webserver:", + "input": { + "RoleName": "S3Access", + "InstanceProfileName": "Webserver" + } + } + ] } }, "com.amazonaws.iam#AddRoleToInstanceProfileRequest": { @@ -2071,7 +2058,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified user to the specified group.

" + "smithy.api#documentation": "

Adds the specified user to the specified group.

", + "smithy.api#examples": [ + { + "title": "To add a user to an IAM group", + "documentation": "The following command adds an IAM user named Bob to the IAM group named Admins:", + "input": { + "UserName": "Bob", + "GroupName": "Admins" + } + } + ] } }, "com.amazonaws.iam#AddUserToGroupRequest": { @@ -2128,7 +2125,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use PutGroupPolicy.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use \n PutGroupPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM group", + "documentation": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM group named Finance.", + "input": { + "GroupName": "Finance", + "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess" + } + } + ] } }, "com.amazonaws.iam#AttachGroupPolicyRequest": { @@ -2182,7 +2189,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using CreateRole.\n You can update a role's trust policy using UpdateAssumeRolePolicy.

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use PutRolePolicy. For more information\n about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using \n CreateRole\n . You can update a role's trust policy using\n \n UpdateAssumerolePolicy\n .

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use \n PutRolePolicy\n . For more information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM role", + "documentation": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM role named ReadOnlyRole.", + "input": { + "RoleName": "ReadOnlyRole", + "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess" + } + } + ] } }, "com.amazonaws.iam#AttachRolePolicyRequest": { @@ -2233,7 +2250,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use PutUserPolicy.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use \n PutUserPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM user", + "documentation": "The following command attaches the AWS managed policy named AdministratorAccess to the IAM user named Alice.", + "input": { + "UserName": "Alice", + "PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess" + } + } + ] } }, "com.amazonaws.iam#AttachUserPolicyRequest": { @@ -2301,6 +2328,35 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.iam#CertificationKeyType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 128 + }, + "smithy.api#pattern": "^[\\u0020-\\u00FF]+$" + } + }, + "com.amazonaws.iam#CertificationMapType": { + "type": "map", + "key": { + "target": "com.amazonaws.iam#CertificationKeyType" + }, + "value": { + "target": "com.amazonaws.iam#CertificationValueType" + } + }, + "com.amazonaws.iam#CertificationValueType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 32 + }, + "smithy.api#pattern": "^[\\u0020-\\u00FF]+$" + } + }, "com.amazonaws.iam#ChangePassword": { "type": "operation", "input": { @@ -2330,7 +2386,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the password of the IAM user who is calling this operation. This operation\n can be performed using the CLI, the Amazon Web Services API, or the My\n Security Credentials page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\n not affected by this operation.

\n

Use UpdateLoginProfile to use the CLI, the Amazon Web Services API, or the\n Users page in the IAM console to change the\n password for any IAM user. For more information about modifying passwords, see Managing\n passwords in the IAM User Guide.

" + "smithy.api#documentation": "

Changes the password of the IAM user who is calling this operation. This operation\n can be performed using the CLI, the Amazon Web Services API, or the My\n Security Credentials page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\n not affected by this operation.

\n

Use UpdateLoginProfile to use the CLI, the Amazon Web Services API, or the\n Users page in the IAM console to change the\n password for any IAM user. For more information about modifying passwords, see Managing\n passwords in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To change the password for your IAM user", + "documentation": "The following command changes the password for the current IAM user.", + "input": { + "NewPassword": "]35d/{pB9Fo9wJ", + "OldPassword": "3s0K_;xh4~8XXI" + } + } + ] } }, "com.amazonaws.iam#ChangePasswordRequest": { @@ -2534,7 +2600,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\n specified user. The default status for new keys is Active.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials. This is true even if the Amazon Web Services account has no associated users.

\n

For information about quotas on the number of keys you can create, see IAM and STS\n quotas in the IAM User Guide.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation. You must save the key (for example, in a text\n file) if you want to be able to access it again. If a secret key is lost, you can\n delete the access keys for the associated user and then create new keys.

\n
" + "smithy.api#documentation": "

Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\n specified user. The default status for new keys is Active.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials. This is true even if the Amazon Web Services account has no associated users.

\n

For information about quotas on the number of keys you can create, see IAM and STS\n quotas in the IAM User Guide.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation. You must save the key (for example, in a text\n file) if you want to be able to access it again. If a secret key is lost, you can\n delete the access keys for the associated user and then create new keys.

\n
", + "smithy.api#examples": [ + { + "title": "To create an access key for an IAM user", + "documentation": "The following command creates an access key (access key ID and secret access key) for the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "AccessKey": { + "UserName": "Bob", + "Status": "Active", + "CreateDate": "2015-03-09T18:39:23.411Z", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + } + ] } }, "com.amazonaws.iam#CreateAccessKeyRequest": { @@ -2590,7 +2674,16 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\n alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

" + "smithy.api#documentation": "

Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\n alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To create an account alias", + "documentation": "The following command associates the alias examplecorp to your AWS account.", + "input": { + "AccountAlias": "examplecorp" + } + } + ] } }, "com.amazonaws.iam#CreateAccountAliasRequest": { @@ -2631,7 +2724,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new group.

\n

For information about the number of groups you can create, see IAM and STS\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new group.

\n

For information about the number of groups you can create, see IAM and STS\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM group", + "documentation": "The following command creates an IAM group named Admins.", + "input": { + "GroupName": "Admins" + }, + "output": { + "Group": { + "Path": "/", + "CreateDate": "2015-03-09T20:30:24.940Z", + "GroupId": "AIDGPMS9RO4H3FEXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/Admins", + "GroupName": "Admins" + } + } + } + ] } }, "com.amazonaws.iam#CreateGroupRequest": { @@ -2697,7 +2808,26 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new instance profile. For information about instance profiles, see Using\n roles for applications on Amazon EC2 in the\n IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.

\n

For information about the number of instance profiles you can create, see IAM object\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new instance profile. For information about instance profiles, see Using\n roles for applications on Amazon EC2 in the\n IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.

\n

For information about the number of instance profiles you can create, see IAM object\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following command creates an instance profile named Webserver that is ready to have a role attached and then be associated with an EC2 instance.", + "input": { + "InstanceProfileName": "Webserver" + }, + "output": { + "InstanceProfile": { + "InstanceProfileId": "AIPAJMBYC7DLSPEXAMPLE", + "Roles": [], + "CreateDate": "2015-03-09T20:33:19.626Z", + "InstanceProfileName": "Webserver", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:instance-profile/Webserver" + } + } + } + ] } }, "com.amazonaws.iam#CreateInstanceProfileRequest": { @@ -2769,7 +2899,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a password for the specified IAM user. A password allows an IAM user to\n access Amazon Web Services services through the Amazon Web Services Management Console.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to create a password for any IAM user. Use ChangePassword to update your own existing password in the My Security Credentials page in the Amazon Web Services Management Console.

\n

For more information about managing passwords, see Managing passwords in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a password for the specified IAM user. A password allows an IAM user to\n access Amazon Web Services services through the Amazon Web Services Management Console.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to create a password for any IAM user. Use ChangePassword to update your own existing password in the My Security Credentials page in the Amazon Web Services Management Console.

\n

For more information about managing passwords, see Managing passwords in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following command changes IAM user Bob's password and sets the flag that required Bob to change the password the next time he signs in.", + "input": { + "UserName": "Bob", + "Password": "h]6EszR}vJ*m", + "PasswordResetRequired": true + }, + "output": { + "LoginProfile": { + "UserName": "Bob", + "CreateDate": "2015-03-10T20:55:40.274Z", + "PasswordResetRequired": true + } + } + } + ] } }, "com.amazonaws.iam#CreateLoginProfileRequest": { @@ -2843,7 +2991,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Google, Auth0,\n and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In these\n cases, your legacy thumbprint remains in your configuration, but is no longer used for\n validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
" + "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following example defines a new OIDC provider in IAM with a client ID of my-application-id and pointing at the server with a URL of https://server.example.com.", + "input": { + "ClientIDList": [ + "my-application-id" + ], + "ThumbprintList": [ + "3768084dfb3d2b68b7897bf5f565da8efEXAMPLE" + ], + "Url": "https://server.example.com" + }, + "output": { + "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com" + } + } + ] } }, "com.amazonaws.iam#CreateOpenIDConnectProviderRequest": { @@ -3090,7 +3256,28 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account. For more information about roles, see\n IAM\n roles. For information about quotas for role names and the number of roles\n you can create, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account.

\n

For more information about roles, see IAM roles in the\n IAM User Guide. For information about quotas for role names\n and the number of roles you can create, see IAM and STS quotas in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM role", + "documentation": "The following command creates a role named Test-Role and attaches a trust policy that you must convert from JSON to a string. Upon success, the response includes the same policy as a URL-encoded JSON string.", + "input": { + "AssumeRolePolicyDocument": "", + "Path": "/", + "RoleName": "Test-Role" + }, + "output": { + "Role": { + "Arn": "arn:aws:iam::123456789012:role/Test-Role", + "AssumeRolePolicyDocument": "", + "CreateDate": "2013-06-07T20:43:32.821Z", + "Path": "/", + "RoleId": "AKIAIOSFODNN7EXAMPLE", + "RoleName": "Test-Role" + } + } + } + ] } }, "com.amazonaws.iam#CreateRoleRequest": { @@ -3394,7 +3581,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new IAM user for your Amazon Web Services account.

\n

For information about quotas for the number of IAM users you can create, see IAM and STS\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new IAM user for your Amazon Web Services account.

\n

For information about quotas for the number of IAM users you can create, see IAM and STS\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM user", + "documentation": "The following create-user command creates an IAM user named Bob in the current account.", + "input": { + "UserName": "Bob" + }, + "output": { + "User": { + "UserName": "Bob", + "Path": "/", + "CreateDate": "2013-06-08T03:20:41.270Z", + "UserId": "AKIAIOSFODNN7EXAMPLE", + "Arn": "arn:aws:iam::123456789012:user/Bob" + } + } + } + ] } }, "com.amazonaws.iam#CreateUserRequest": { @@ -3639,7 +3844,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the access key pair associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated users.

" + "smithy.api#documentation": "

Deletes the access key pair associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated users.

", + "smithy.api#examples": [ + { + "title": "To delete an access key for an IAM user", + "documentation": "The following command deletes one access key (access key ID and secret access key) assigned to the IAM user named Bob.", + "input": { + "UserName": "Bob", + "AccessKeyId": "AKIDPMS9RO4H3FEXAMPLE" + } + } + ] } }, "com.amazonaws.iam#DeleteAccessKeyRequest": { @@ -3686,7 +3901,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\n account alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

" + "smithy.api#documentation": "

Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\n account alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an account alias", + "documentation": "The following command removes the alias mycompany from the current AWS account:", + "input": { + "AccountAlias": "mycompany" + } + } + ] } }, "com.amazonaws.iam#DeleteAccountAliasRequest": { @@ -3724,7 +3948,13 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the password policy for the Amazon Web Services account. There are no parameters.

" + "smithy.api#documentation": "

Deletes the password policy for the Amazon Web Services account. There are no parameters.

", + "smithy.api#examples": [ + { + "title": "To delete the current account password policy", + "documentation": "The following command removes the password policy from the current AWS account:" + } + ] } }, "com.amazonaws.iam#DeleteConflictException": { @@ -3790,7 +4020,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n group.

\n

A group can also have managed policies attached to it. To detach a managed policy from\n a group, use DetachGroupPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n group.

\n

A group can also have managed policies attached to it. To detach a managed policy from\n a group, use DetachGroupPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a policy from an IAM group", + "documentation": "The following command deletes the policy named ExamplePolicy from the group named Admins:", + "input": { + "GroupName": "Admins", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteGroupPolicyRequest": { @@ -3853,7 +4093,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an instance profile", + "documentation": "The following command deletes the instance profile named ExampleInstanceProfile", + "input": { + "InstanceProfileName": "ExampleInstanceProfile" + } + } + ] } }, "com.amazonaws.iam#DeleteInstanceProfileRequest": { @@ -3894,7 +4143,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the password for the specified IAM user, For more information, see Managing\n passwords for IAM users.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to delete a password for any IAM user. You can use ChangePassword to update, but not delete, your own password in the\n My Security Credentials page in the\n Amazon Web Services Management Console.

\n \n

Deleting a user's password does not prevent a user from accessing Amazon Web Services through\n the command line interface or the API. To prevent all user access, you must also\n either make any access keys inactive or delete them. For more information about\n making keys inactive or deleting them, see UpdateAccessKey and\n DeleteAccessKey.

\n
" + "smithy.api#documentation": "

Deletes the password for the specified IAM user, For more information, see Managing\n passwords for IAM users.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to delete a password for any IAM user. You can use ChangePassword to update, but not delete, your own password in the\n My Security Credentials page in the\n Amazon Web Services Management Console.

\n \n

Deleting a user's password does not prevent a user from accessing Amazon Web Services through\n the command line interface or the API. To prevent all user access, you must also\n either make any access keys inactive or delete them. For more information about\n making keys inactive or deleting them, see UpdateAccessKey and\n DeleteAccessKey.

\n
", + "smithy.api#examples": [ + { + "title": "To delete a password for an IAM user", + "documentation": "The following command deletes the password for the IAM user named Bob.", + "input": { + "UserName": "Bob" + } + } + ] } }, "com.amazonaws.iam#DeleteLoginProfileRequest": { @@ -4074,7 +4332,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\n programmatically, you must delete the items attached to the role manually, or the\n deletion fails. For more information, see Deleting an IAM role. Before attempting to delete a role, remove the\n following attached items:

\n \n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to delete. Deleting a role or instance profile that is associated with a\n running instance will break any applications running on the instance.

\n
" + "smithy.api#documentation": "

Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\n programmatically, you must delete the items attached to the role manually, or the\n deletion fails. For more information, see Deleting an IAM role. Before attempting to delete a role, remove the\n following attached items:

\n \n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to delete. Deleting a role or instance profile that is associated with a\n running instance will break any applications running on the instance.

\n
", + "smithy.api#examples": [ + { + "title": "To delete an IAM role", + "documentation": "The following command removes the role named Test-Role.", + "input": { + "RoleName": "Test-Role" + } + } + ] } }, "com.amazonaws.iam#DeleteRolePermissionsBoundary": { @@ -4138,7 +4405,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n role.

\n

A role can also have managed policies attached to it. To detach a managed policy from\n a role, use DetachRolePolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n role.

\n

A role can also have managed policies attached to it. To detach a managed policy from\n a role, use DetachRolePolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a policy from an IAM role", + "documentation": "The following command removes the policy named ExamplePolicy from the role named Test-Role.", + "input": { + "RoleName": "Test-Role", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteRolePolicyRequest": { @@ -4413,7 +4690,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a signing certificate associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated IAM users.

" + "smithy.api#documentation": "

Deletes a signing certificate associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated IAM users.

", + "smithy.api#examples": [ + { + "title": "To delete a signing certificate for an IAM user", + "documentation": "The following command deletes the specified signing certificate for the IAM user named Anika.", + "input": { + "UserName": "Anika", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE" + } + } + ] } }, "com.amazonaws.iam#DeleteSigningCertificateRequest": { @@ -4463,7 +4750,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\n programmatically, you must delete the items attached to the user manually, or the\n deletion fails. For more information, see Deleting an IAM\n user. Before attempting to delete a user, remove the following items:

\n " + "smithy.api#documentation": "

Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\n programmatically, you must delete the items attached to the user manually, or the\n deletion fails. For more information, see Deleting an IAM\n user. Before attempting to delete a user, remove the following items:

\n ", + "smithy.api#examples": [ + { + "title": "To delete an IAM user", + "documentation": "The following command removes the IAM user named Bob from the current account.", + "input": { + "UserName": "Bob" + } + } + ] } }, "com.amazonaws.iam#DeleteUserPermissionsBoundary": { @@ -4521,7 +4817,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n user.

\n

A user can also have managed policies attached to it. To detach a managed policy from\n a user, use DetachUserPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n user.

\n

A user can also have managed policies attached to it. To detach a managed policy from\n a user, use DetachUserPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a policy from an IAM user", + "documentation": "The following delete-user-policy command removes the specified policy from the IAM user named Juan:", + "input": { + "UserName": "Juan", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteUserPolicyRequest": { @@ -4587,7 +4893,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a virtual MFA device.

\n \n

You must deactivate a user's virtual MFA device before you can delete it. For\n information about deactivating MFA devices, see DeactivateMFADevice.

\n
" + "smithy.api#documentation": "

Deletes a virtual MFA device.

\n \n

You must deactivate a user's virtual MFA device before you can delete it. For\n information about deactivating MFA devices, see DeactivateMFADevice.

\n
", + "smithy.api#examples": [ + { + "title": "To remove a virtual MFA device", + "documentation": "The following delete-virtual-mfa-device command removes the specified MFA device from the current AWS account.", + "input": { + "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleName" + } + } + ] } }, "com.amazonaws.iam#DeleteVirtualMFADeviceRequest": { @@ -5211,7 +5526,19 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report for service last accessed data for Organizations. You can generate a\n report for any entities (organization root, organizational unit, or account) or policies\n in your organization.

\n

To call this operation, you must be signed in using your Organizations management account\n credentials. You can use your long-term IAM user or root user credentials, or temporary\n credentials from assuming an IAM role. SCPs must be enabled for your organization\n root. You must have the required IAM and Organizations permissions. For more information, see\n Refining permissions using service last accessed data in the\n IAM User Guide.

\n

You can generate a service last accessed data report for entities by specifying only\n the entity's path. This data includes a list of services that are allowed by any service\n control policies (SCPs) that apply to the entity.

\n

You can generate a service last accessed data report for a policy by specifying an\n entity's path and an optional Organizations policy ID. This data includes a list of services that\n are allowed by the specified SCP.

\n

For each service in both report types, the data includes the most recent account\n activity that the policy allows to account principals in the entity or the entity's\n children. For important information about the data, reporting period, permissions\n required, troubleshooting, and supported Regions see Reducing permissions using\n service last accessed data in the\n IAM User Guide.

\n \n

The data includes all attempts to access Amazon Web Services, not just the successful ones. This\n includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\n of the SDKs, or any of the command line tools. An unexpected entry in the service\n last accessed data does not mean that an account has been compromised, because the\n request might have been denied. Refer to your CloudTrail logs as the authoritative\n source for information about all API calls and whether they were successful or\n denied access. For more information, see Logging IAM events with\n CloudTrail in the IAM User Guide.

\n
\n

This operation returns a JobId. Use this parameter in the \n GetOrganizationsAccessReport\n operation to check the status of\n the report generation. To check the status of this request, use the JobId\n parameter in the \n GetOrganizationsAccessReport\n operation\n and test the JobStatus response parameter. When the job is complete, you\n can retrieve the report.

\n

To generate a service last accessed data report for entities, specify an entity path\n without specifying the optional Organizations policy ID. The type of entity that you specify\n determines the data returned in the report.

\n
    \n
  • \n

    \n Root – When you specify the\n organizations root as the entity, the resulting report lists all of the services\n allowed by SCPs that are attached to your root. For each service, the report\n includes data for all accounts in your organization except the\n management account, because the management account is not limited by SCPs.

    \n
  • \n
  • \n

    \n OU – When you specify an\n organizational unit (OU) as the entity, the resulting report lists all of the\n services allowed by SCPs that are attached to the OU and its parents. For each\n service, the report includes data for all accounts in the OU or its children.\n This data excludes the management account, because the management account is not\n limited by SCPs.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. For each service, the report includes\n data for only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account as the entity, the resulting report lists all of the services allowed by\n SCPs that are attached to the account and its parents. For each service, the\n report includes data for only the specified account.

    \n
  • \n
\n

To generate a service last accessed data report for policies, specify an entity path\n and the optional Organizations policy ID. The type of entity that you specify determines the data\n returned for each service.

\n
    \n
  • \n

    \n Root – When you specify the root\n entity and a policy ID, the resulting report lists all of the services that are\n allowed by the specified SCP. For each service, the report includes data for all\n accounts in your organization to which the SCP applies. This data excludes the\n management account, because the management account is not limited by SCPs. If the\n SCP is not attached to any entities in the organization, then the report will\n return a list of services with no data.

    \n
  • \n
  • \n

    \n OU – When you specify an OU entity and\n a policy ID, the resulting report lists all of the services that are allowed by\n the specified SCP. For each service, the report includes data for all accounts\n in the OU or its children to which the SCP applies. This means that other\n accounts outside the OU that are affected by the SCP might not be included in\n the data. This data excludes the management account, because the\n management account is not limited by SCPs. If the SCP is not attached to the OU\n or one of its children, the report will return a list of services with no\n data.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. If you specify a policy ID in the CLI\n or API, the policy is ignored. For each service, the report includes data for\n only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account entity and a policy ID, the resulting report lists all of the services\n that are allowed by the specified SCP. For each service, the report includes\n data for only the specified account. This means that other accounts in the\n organization that are affected by the SCP might not be included in the data. If\n the SCP is not attached to the account, the report will return a list of\n services with no data.

    \n
  • \n
\n \n

Service last accessed data does not use other policy types when determining\n whether a principal could access a service. These other policy types include\n identity-based policies, resource-based policies, access control lists, IAM\n permissions boundaries, and STS assume role policies. It only applies SCP logic.\n For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service last accessed data, see Reducing policy scope by\n viewing user activity in the IAM User Guide.

" + "smithy.api#documentation": "

Generates a report for service last accessed data for Organizations. You can generate a\n report for any entities (organization root, organizational unit, or account) or policies\n in your organization.

\n

To call this operation, you must be signed in using your Organizations management account\n credentials. You can use your long-term IAM user or root user credentials, or temporary\n credentials from assuming an IAM role. SCPs must be enabled for your organization\n root. You must have the required IAM and Organizations permissions. For more information, see\n Refining permissions using service last accessed data in the\n IAM User Guide.

\n

You can generate a service last accessed data report for entities by specifying only\n the entity's path. This data includes a list of services that are allowed by any service\n control policies (SCPs) that apply to the entity.

\n

You can generate a service last accessed data report for a policy by specifying an\n entity's path and an optional Organizations policy ID. This data includes a list of services that\n are allowed by the specified SCP.

\n

For each service in both report types, the data includes the most recent account\n activity that the policy allows to account principals in the entity or the entity's\n children. For important information about the data, reporting period, permissions\n required, troubleshooting, and supported Regions see Reducing permissions using\n service last accessed data in the\n IAM User Guide.

\n \n

The data includes all attempts to access Amazon Web Services, not just the successful ones. This\n includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\n of the SDKs, or any of the command line tools. An unexpected entry in the service\n last accessed data does not mean that an account has been compromised, because the\n request might have been denied. Refer to your CloudTrail logs as the authoritative\n source for information about all API calls and whether they were successful or\n denied access. For more information, see Logging IAM events with\n CloudTrail in the IAM User Guide.

\n
\n

This operation returns a JobId. Use this parameter in the \n GetOrganizationsAccessReport\n operation to check the status of\n the report generation. To check the status of this request, use the JobId\n parameter in the \n GetOrganizationsAccessReport\n operation\n and test the JobStatus response parameter. When the job is complete, you\n can retrieve the report.

\n

To generate a service last accessed data report for entities, specify an entity path\n without specifying the optional Organizations policy ID. The type of entity that you specify\n determines the data returned in the report.

\n
    \n
  • \n

    \n Root – When you specify the\n organizations root as the entity, the resulting report lists all of the services\n allowed by SCPs that are attached to your root. For each service, the report\n includes data for all accounts in your organization except the\n management account, because the management account is not limited by SCPs.

    \n
  • \n
  • \n

    \n OU – When you specify an\n organizational unit (OU) as the entity, the resulting report lists all of the\n services allowed by SCPs that are attached to the OU and its parents. For each\n service, the report includes data for all accounts in the OU or its children.\n This data excludes the management account, because the management account is not\n limited by SCPs.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. For each service, the report includes\n data for only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account as the entity, the resulting report lists all of the services allowed by\n SCPs that are attached to the account and its parents. For each service, the\n report includes data for only the specified account.

    \n
  • \n
\n

To generate a service last accessed data report for policies, specify an entity path\n and the optional Organizations policy ID. The type of entity that you specify determines the data\n returned for each service.

\n
    \n
  • \n

    \n Root – When you specify the root\n entity and a policy ID, the resulting report lists all of the services that are\n allowed by the specified SCP. For each service, the report includes data for all\n accounts in your organization to which the SCP applies. This data excludes the\n management account, because the management account is not limited by SCPs. If the\n SCP is not attached to any entities in the organization, then the report will\n return a list of services with no data.

    \n
  • \n
  • \n

    \n OU – When you specify an OU entity and\n a policy ID, the resulting report lists all of the services that are allowed by\n the specified SCP. For each service, the report includes data for all accounts\n in the OU or its children to which the SCP applies. This means that other\n accounts outside the OU that are affected by the SCP might not be included in\n the data. This data excludes the management account, because the\n management account is not limited by SCPs. If the SCP is not attached to the OU\n or one of its children, the report will return a list of services with no\n data.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. If you specify a policy ID in the CLI\n or API, the policy is ignored. For each service, the report includes data for\n only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account entity and a policy ID, the resulting report lists all of the services\n that are allowed by the specified SCP. For each service, the report includes\n data for only the specified account. This means that other accounts in the\n organization that are affected by the SCP might not be included in the data. If\n the SCP is not attached to the account, the report will return a list of\n services with no data.

    \n
  • \n
\n \n

Service last accessed data does not use other policy types when determining\n whether a principal could access a service. These other policy types include\n identity-based policies, resource-based policies, access control lists, IAM\n permissions boundaries, and STS assume role policies. It only applies SCP logic.\n For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service last accessed data, see Reducing policy scope by\n viewing user activity in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To generate a service last accessed data report for an organizational unit", + "documentation": "The following operation generates a report for the organizational unit ou-rge0-awexample", + "input": { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example" + }, + "output": { + "JobId": "examplea-1234-b567-cde8-90fg123abcd4" + } + } + ] } }, "com.amazonaws.iam#GenerateOrganizationsAccessReportRequest": { @@ -5266,7 +5593,19 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

" + "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To generate a service last accessed data report for a policy", + "documentation": "The following operation generates a report for the policy: ExamplePolicy1", + "input": { + "Arn": "arn:aws:iam::123456789012:policy/ExamplePolicy1" + }, + "output": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7" + } + } + ] } }, "com.amazonaws.iam#GenerateServiceLastAccessedDetailsRequest": { @@ -5468,7 +5807,27 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\n requirements and mandatory rotation periods for the IAM user passwords in your account.\n For more information about using a password policy, see Managing an IAM password\n policy.

" + "smithy.api#documentation": "

Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\n requirements and mandatory rotation periods for the IAM user passwords in your account.\n For more information about using a password policy, see Managing an IAM password\n policy.

", + "smithy.api#examples": [ + { + "title": "To see the current account password policy", + "documentation": "The following command displays details about the password policy for the current AWS account.", + "output": { + "PasswordPolicy": { + "AllowUsersToChangePassword": false, + "RequireNumbers": true, + "RequireLowercaseCharacters": false, + "RequireUppercaseCharacters": false, + "MinimumPasswordLength": 8, + "RequireSymbols": true, + "ExpirePasswords": false, + "PasswordReusePrevention": 12, + "MaxPasswordAge": 90, + "HardExpiry": false + } + } + } + ] } }, "com.amazonaws.iam#GetAccountPasswordPolicyResponse": { @@ -5501,7 +5860,43 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\n account.

\n

For information about IAM quotas, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\n account.

\n

For information about IAM quotas, see IAM and STS quotas in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about IAM entity quotas and usage in the current account", + "documentation": "The following command returns information about the IAM entity quotas and usage in the current AWS account.", + "output": { + "SummaryMap": { + "Users": 27, + "UsersQuota": 5000, + "Groups": 15, + "GroupsQuota": 100, + "Policies": 8, + "PoliciesQuota": 1000, + "PolicySizeQuota": 5120, + "PolicyVersionsInUse": 22, + "PolicyVersionsInUseQuota": 10000, + "VersionsPerPolicyQuota": 5, + "ServerCertificates": 1, + "ServerCertificatesQuota": 20, + "UserPolicySizeQuota": 2048, + "GroupPolicySizeQuota": 5120, + "GroupsPerUserQuota": 10, + "GlobalEndpointTokenVersion": 2, + "SigningCertificatesPerUserQuota": 2, + "AccessKeysPerUserQuota": 2, + "MFADevices": 6, + "MFADevicesInUse": 3, + "AccountMFAEnabled": 0, + "AccountAccessKeysPresent": 1, + "AccountSigningCertificatesPresent": 0, + "AttachedPoliciesPerGroupQuota": 10, + "AttachedPoliciesPerRoleQuota": 10, + "AttachedPoliciesPerUserQuota": 10 + } + } + } + ] } }, "com.amazonaws.iam#GetAccountSummaryResponse": { @@ -5837,7 +6232,35 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n About\n instance profiles in the IAM User Guide.

", + "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about an instance profile", + "documentation": "The following command gets information about the instance profile named ExampleInstanceProfile.", + "input": { + "InstanceProfileName": "ExampleInstanceProfile" + }, + "output": { + "InstanceProfile": { + "InstanceProfileId": "AID2MAB8DPLSRHEXAMPLE", + "Roles": [ + { + "AssumeRolePolicyDocument": "", + "RoleId": "AIDGPMS9RO4H3FEXAMPLE", + "CreateDate": "2013-01-09T06:33:26Z", + "Path": "/", + "RoleName": "Test-Role", + "Arn": "arn:aws:iam::336924118301:role/Test-Role" + } + ], + "CreateDate": "2013-06-12T23:52:02Z", + "InstanceProfileName": "ExampleInstanceProfile", + "Path": "/", + "Arn": "arn:aws:iam::336924118301:instance-profile/ExampleInstanceProfile" + } + } + } + ], "smithy.waiters#waitable": { "InstanceProfileExists": { "acceptors": [ @@ -5907,7 +6330,22 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the user name for the specified IAM user. A login profile is created when\n you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\n or does not have a password, the operation returns a 404 (NoSuchEntity)\n error.

\n

If you create an IAM user with access to the console, the CreateDate\n reflects the date you created the initial password for the user.

\n

If you create an IAM user with programmatic access, and then later add a password\n for the user to access the Amazon Web Services Management Console, the CreateDate reflects the initial\n password creation date. A user with programmatic access does not have a login profile\n unless you create a password for the user to access the Amazon Web Services Management Console.

" + "smithy.api#documentation": "

Retrieves the user name for the specified IAM user. A login profile is created when\n you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\n or does not have a password, the operation returns a 404 (NoSuchEntity)\n error.

\n

If you create an IAM user with access to the console, the CreateDate\n reflects the date you created the initial password for the user.

\n

If you create an IAM user with programmatic access, and then later add a password\n for the user to access the Amazon Web Services Management Console, the CreateDate reflects the initial\n password creation date. A user with programmatic access does not have a login profile\n unless you create a password for the user to access the Amazon Web Services Management Console.

", + "smithy.api#examples": [ + { + "title": "To get password information for an IAM user", + "documentation": "The following command gets information about the password for the IAM user named Anika.", + "input": { + "UserName": "Anika" + }, + "output": { + "LoginProfile": { + "UserName": "Anika", + "CreateDate": "2012-09-21T23:03:39Z" + } + } + } + ] } }, "com.amazonaws.iam#GetLoginProfileRequest": { @@ -5916,8 +6354,65 @@ "UserName": { "target": "com.amazonaws.iam#userNameType", "traits": { - "smithy.api#documentation": "

The name of the user whose login profile you want to retrieve.

\n

This parameter allows (through its regex pattern) a string of characters consisting of upper and lowercase alphanumeric \n characters with no spaces. You can also include any of the following characters: _+=,.@-

", - "smithy.api#required": {} + "smithy.api#documentation": "

The name of the user whose login profile you want to retrieve.

\n

This parameter allows (through its regex pattern) a string of characters consisting of upper and lowercase alphanumeric \n characters with no spaces. You can also include any of the following characters: _+=,.@-

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.iam#GetLoginProfileResponse": { + "type": "structure", + "members": { + "LoginProfile": { + "target": "com.amazonaws.iam#LoginProfile", + "traits": { + "smithy.api#documentation": "

A structure containing the user name and the profile creation date for the\n user.

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "

Contains the response to a successful GetLoginProfile request.\n

", + "smithy.api#output": {} + } + }, + "com.amazonaws.iam#GetMFADevice": { + "type": "operation", + "input": { + "target": "com.amazonaws.iam#GetMFADeviceRequest" + }, + "output": { + "target": "com.amazonaws.iam#GetMFADeviceResponse" + }, + "errors": [ + { + "target": "com.amazonaws.iam#NoSuchEntityException" + }, + { + "target": "com.amazonaws.iam#ServiceFailureException" + } + ], + "traits": { + "smithy.api#documentation": "

Retrieves information about an MFA device for a specified user.

" + } + }, + "com.amazonaws.iam#GetMFADeviceRequest": { + "type": "structure", + "members": { + "SerialNumber": { + "target": "com.amazonaws.iam#serialNumberType", + "traits": { + "smithy.api#documentation": "

Serial number that uniquely identifies the MFA device. For this API, we only accept\n FIDO security key ARNs.

", + "smithy.api#required": {} + } + }, + "UserName": { + "target": "com.amazonaws.iam#userNameType", + "traits": { + "smithy.api#documentation": "

The friendly name identifying the user.

" } } }, @@ -5925,19 +6420,36 @@ "smithy.api#input": {} } }, - "com.amazonaws.iam#GetLoginProfileResponse": { + "com.amazonaws.iam#GetMFADeviceResponse": { "type": "structure", "members": { - "LoginProfile": { - "target": "com.amazonaws.iam#LoginProfile", + "UserName": { + "target": "com.amazonaws.iam#userNameType", "traits": { - "smithy.api#documentation": "

A structure containing the user name and the profile creation date for the\n user.

", + "smithy.api#documentation": "

The friendly name identifying the user.

" + } + }, + "SerialNumber": { + "target": "com.amazonaws.iam#serialNumberType", + "traits": { + "smithy.api#documentation": "

Serial number that uniquely identifies the MFA device. For this API, we only accept\n FIDO security key ARNs.

", "smithy.api#required": {} } + }, + "EnableDate": { + "target": "com.amazonaws.iam#dateType", + "traits": { + "smithy.api#documentation": "

The date that a specified user's MFA device was first enabled.

" + } + }, + "Certifications": { + "target": "com.amazonaws.iam#CertificationMapType", + "traits": { + "smithy.api#documentation": "

The certifications of a specified user's MFA device. We currently provide FIPS-140-2,\n FIPS-140-3, and FIDO certification levels obtained from FIDO Alliance Metadata Service\n (MDS).

" + } } }, "traits": { - "smithy.api#documentation": "

Contains the response to a successful GetLoginProfile request.\n

", "smithy.api#output": {} } }, @@ -6032,7 +6544,47 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the service last accessed data report for Organizations that was previously\n generated using the \n GenerateOrganizationsAccessReport\n \n operation. This operation retrieves the status of your report job and the report\n contents.

\n

Depending on the parameters that you passed when you generated the report, the data\n returned could include different information. For details, see GenerateOrganizationsAccessReport.

\n

To call this operation, you must be signed in to the management account in your\n organization. SCPs must be enabled for your organization root. You must have permissions\n to perform this operation. For more information, see Refining permissions using\n service last accessed data in the\n IAM User Guide.

\n

For each service that principals in an account (root user, IAM users, or IAM roles)\n could access using SCPs, the operation returns details about the most recent access\n attempt. If there was no attempt, the service is listed without details about the most\n recent attempt to access the service. If the operation fails, it returns the reason that\n it failed.

\n

By default, the list is sorted by service namespace.

" + "smithy.api#documentation": "

Retrieves the service last accessed data report for Organizations that was previously\n generated using the \n GenerateOrganizationsAccessReport\n \n operation. This operation retrieves the status of your report job and the report\n contents.

\n

Depending on the parameters that you passed when you generated the report, the data\n returned could include different information. For details, see GenerateOrganizationsAccessReport.

\n

To call this operation, you must be signed in to the management account in your\n organization. SCPs must be enabled for your organization root. You must have permissions\n to perform this operation. For more information, see Refining permissions using\n service last accessed data in the\n IAM User Guide.

\n

For each service that principals in an account (root user, IAM users, or IAM roles)\n could access using SCPs, the operation returns details about the most recent access\n attempt. If there was no attempt, the service is listed without details about the most\n recent attempt to access the service. If the operation fails, it returns the reason that\n it failed.

\n

By default, the list is sorted by service namespace.

", + "smithy.api#examples": [ + { + "title": "To get details from a previously generated organizational unit report", + "documentation": "The following operation gets details about the report with the job ID: examplea-1234-b567-cde8-90fg123abcd4", + "input": { + "JobId": "examplea-1234-b567-cde8-90fg123abcd4" + }, + "output": { + "IsTruncated": false, + "JobCompletionDate": "2019-06-18T19:47:35.241Z", + "JobCreationDate": "2019-06-18T19:47:31.466Z", + "JobStatus": "COMPLETED", + "NumberOfServicesAccessible": 3, + "NumberOfServicesNotAccessed": 1, + "AccessDetails": [ + { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/111122223333", + "LastAuthenticatedTime": "2019-05-25T16:29:52Z", + "Region": "us-east-1", + "ServiceName": "Amazon DynamoDB", + "ServiceNamespace": "dynamodb", + "TotalAuthenticatedEntities": 2 + }, + { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/123456789012", + "LastAuthenticatedTime": "2019-06-15T13:12:06Z", + "Region": "us-east-1", + "ServiceName": "AWS Identity and Access Management", + "ServiceNamespace": "iam", + "TotalAuthenticatedEntities": 4 + }, + { + "ServiceName": "Amazon Simple Storage Service", + "ServiceNamespace": "s3", + "TotalAuthenticatedEntities": 0 + } + ] + } + } + ] } }, "com.amazonaws.iam#GetOrganizationsAccessReportRequest": { @@ -6282,7 +6834,31 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see Working with roles.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", + "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see IAM roles in the\n IAM User Guide.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", + "smithy.api#examples": [ + { + "title": "To get information about an IAM role", + "documentation": "The following command gets information about the role named Test-Role.", + "input": { + "RoleName": "Test-Role" + }, + "output": { + "Role": { + "Arn": "arn:aws:iam::123456789012:role/Test-Role", + "AssumeRolePolicyDocument": "", + "CreateDate": "2013-04-18T05:01:58Z", + "MaxSessionDuration": 3600, + "Path": "/", + "RoleId": "AROADBQP57FF2AEXAMPLE", + "RoleLastUsed": { + "LastUsedDate": "2019-11-18T05:01:58Z", + "Region": "us-east-1" + }, + "RoleName": "Test-Role" + } + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -6324,7 +6900,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the specified inline policy document that is embedded with the specified\n IAM role.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
\n

An IAM role can also have managed policies attached to it. To retrieve a managed\n policy document that is attached to a role, use GetPolicy to determine\n the policy's default version, then use GetPolicyVersion to retrieve\n the policy document.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

For more information about roles, see Using roles to delegate permissions and\n federate identities.

" + "smithy.api#documentation": "

Retrieves the specified inline policy document that is embedded with the specified\n IAM role.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
\n

An IAM role can also have managed policies attached to it. To retrieve a managed\n policy document that is attached to a role, use GetPolicy to determine\n the policy's default version, then use GetPolicyVersion to retrieve\n the policy document.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

For more information about roles, see IAM roles in the\n IAM User Guide.

" } }, "com.amazonaws.iam#GetRolePolicyRequest": { @@ -6613,7 +7189,36 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves a service last accessed report that was created using the\n GenerateServiceLastAccessedDetails operation. You can use the\n JobId parameter in GetServiceLastAccessedDetails to\n retrieve the status of your report job. When the report is complete, you can retrieve\n the generated report. The report includes a list of Amazon Web Services services that the resource\n (user, group, role, or managed policy) can access.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For each service that the resource could access using permissions policies, the\n operation returns details about the most recent access attempt. If there was no attempt,\n the service is listed without details about the most recent attempt to access the\n service. If the operation fails, the GetServiceLastAccessedDetails\n operation returns the reason that it failed.

\n

The GetServiceLastAccessedDetails operation returns a list of services.\n This list includes the number of entities that have attempted to access the service and\n the date and time of the last attempt. It also returns the ARN of the following entity,\n depending on the resource ARN that you used to generate the report:

\n
    \n
  • \n

    \n User – Returns the user ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Group – Returns the ARN of the group\n member (user) that last attempted to access the service

    \n
  • \n
  • \n

    \n Role – Returns the role ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Policy – Returns the ARN of the user\n or role that last used the policy to attempt to access the service

    \n
  • \n
\n

By default, the list is sorted by service namespace.

\n

If you specified ACTION_LEVEL granularity when you generated the report,\n this operation returns service and action last accessed data. This includes the most\n recent access attempt for each tracked action within a service. Otherwise, this\n operation returns only service data.

\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

" + "smithy.api#documentation": "

Retrieves a service last accessed report that was created using the\n GenerateServiceLastAccessedDetails operation. You can use the\n JobId parameter in GetServiceLastAccessedDetails to\n retrieve the status of your report job. When the report is complete, you can retrieve\n the generated report. The report includes a list of Amazon Web Services services that the resource\n (user, group, role, or managed policy) can access.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For each service that the resource could access using permissions policies, the\n operation returns details about the most recent access attempt. If there was no attempt,\n the service is listed without details about the most recent attempt to access the\n service. If the operation fails, the GetServiceLastAccessedDetails\n operation returns the reason that it failed.

\n

The GetServiceLastAccessedDetails operation returns a list of services.\n This list includes the number of entities that have attempted to access the service and\n the date and time of the last attempt. It also returns the ARN of the following entity,\n depending on the resource ARN that you used to generate the report:

\n
    \n
  • \n

    \n User – Returns the user ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Group – Returns the ARN of the group\n member (user) that last attempted to access the service

    \n
  • \n
  • \n

    \n Role – Returns the role ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Policy – Returns the ARN of the user\n or role that last used the policy to attempt to access the service

    \n
  • \n
\n

By default, the list is sorted by service namespace.

\n

If you specified ACTION_LEVEL granularity when you generated the report,\n this operation returns service and action last accessed data. This includes the most\n recent access attempt for each tracked action within a service. Otherwise, this\n operation returns only service data.

\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get details from a previously-generated report", + "documentation": "The following operation gets details about the report with the job ID: examplef-1305-c245-eba4-71fe298bcda7", + "input": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7" + }, + "output": { + "JobStatus": "COMPLETED", + "JobCreationDate": "2018-10-24T19:47:31.466Z", + "ServicesLastAccessed": [ + { + "TotalAuthenticatedEntities": 2, + "LastAuthenticated": "2018-10-24T19:11:00Z", + "ServiceNamespace": "iam", + "LastAuthenticatedEntity": "arn:aws:iam::123456789012:user/AWSExampleUser01", + "ServiceName": "AWS Identity and Access Management" + }, + { + "TotalAuthenticatedEntities": 0, + "ServiceNamespace": "s3", + "ServiceName": "Amazon Simple Storage Service" + } + ], + "JobCompletionDate": "2018-10-24T19:47:35.241Z", + "IsTruncated": false + } + } + ] } }, "com.amazonaws.iam#GetServiceLastAccessedDetailsRequest": { @@ -6721,7 +7326,44 @@ } ], "traits": { - "smithy.api#documentation": "

After you generate a group or policy report using the\n GenerateServiceLastAccessedDetails operation, you can use the\n JobId parameter in\n GetServiceLastAccessedDetailsWithEntities. This operation retrieves the\n status of your report job and a list of entities that could have used group or policy\n permissions to access the specified service.

\n
    \n
  • \n

    \n Group – For a group report, this\n operation returns a list of users in the group that could have used the group’s\n policies in an attempt to access the service.

    \n
  • \n
  • \n

    \n Policy – For a policy report, this\n operation returns a list of entities (users or roles) that could have used the\n policy in an attempt to access the service.

    \n
  • \n
\n

You can also use this operation for user or role reports to retrieve details about\n those entities.

\n

If the operation fails, the GetServiceLastAccessedDetailsWithEntities\n operation returns the reason that it failed.

\n

By default, the list of associated entities is sorted by date, with the most recent\n access listed first.

" + "smithy.api#documentation": "

After you generate a group or policy report using the\n GenerateServiceLastAccessedDetails operation, you can use the\n JobId parameter in\n GetServiceLastAccessedDetailsWithEntities. This operation retrieves the\n status of your report job and a list of entities that could have used group or policy\n permissions to access the specified service.

\n
    \n
  • \n

    \n Group – For a group report, this\n operation returns a list of users in the group that could have used the group’s\n policies in an attempt to access the service.

    \n
  • \n
  • \n

    \n Policy – For a policy report, this\n operation returns a list of entities (users or roles) that could have used the\n policy in an attempt to access the service.

    \n
  • \n
\n

You can also use this operation for user or role reports to retrieve details about\n those entities.

\n

If the operation fails, the GetServiceLastAccessedDetailsWithEntities\n operation returns the reason that it failed.

\n

By default, the list of associated entities is sorted by date, with the most recent\n access listed first.

", + "smithy.api#examples": [ + { + "title": "To get sntity details from a previously-generated report", + "documentation": "The following operation returns details about the entities that attempted to access the IAM service.", + "input": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7", + "ServiceNamespace": "iam" + }, + "output": { + "JobStatus": "COMPLETED", + "JobCreationDate": "2018-10-24T19:47:31.466Z", + "JobCompletionDate": "2018-10-24T19:47:35.241Z", + "EntityDetailsList": [ + { + "EntityInfo": { + "Id": "AIDAEX2EXAMPLEB6IGCDC", + "Name": "AWSExampleUser01", + "Type": "USER", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:user/AWSExampleUser01" + }, + "LastAuthenticated": "2018-10-24T19:10:00Z" + }, + { + "EntityInfo": { + "Id": "AROAEAEXAMPLEIANXSIU4", + "Name": "AWSExampleRole01", + "Type": "ROLE", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:role/AWSExampleRole01" + } + } + ], + "IsTruncated": false + } + } + ] } }, "com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesRequest": { @@ -6890,6 +7532,24 @@ ], "traits": { "smithy.api#documentation": "

Retrieves information about the specified IAM user, including the user's creation\n date, path, unique ID, and ARN.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID used to sign the request to this operation.

", + "smithy.api#examples": [ + { + "title": "To get information about an IAM user", + "documentation": "The following command gets information about the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "User": { + "UserName": "Bob", + "Path": "/", + "CreateDate": "2012-09-21T23:03:13Z", + "UserId": "AKIAIOSFODNN7EXAMPLE", + "Arn": "arn:aws:iam::123456789012:user/Bob" + } + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -7305,6 +7965,31 @@ ], "traits": { "smithy.api#documentation": "

Returns information about the access key IDs associated with the specified IAM user.\n If there is none, the operation returns an empty list.

\n

Although each user is limited to a small number of keys, you can still paginate the\n results using the MaxItems and Marker parameters.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation.

\n
", + "smithy.api#examples": [ + { + "title": "To list the access key IDs for an IAM user", + "documentation": "The following command lists the access keys IDs for the IAM user named Alice.", + "input": { + "UserName": "Alice" + }, + "output": { + "AccessKeyMetadata": [ + { + "UserName": "Alice", + "Status": "Active", + "CreateDate": "2016-12-01T22:19:58Z", + "AccessKeyId": "AKIA111111111EXAMPLE" + }, + { + "UserName": "Alice", + "Status": "Active", + "CreateDate": "2016-12-01T22:20:01Z", + "AccessKeyId": "AKIA222222222EXAMPLE" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7383,6 +8068,17 @@ ], "traits": { "smithy.api#documentation": "

Lists the account alias associated with the Amazon Web Services account (Note: you can have only\n one). For information about using an Amazon Web Services account alias, see Creating,\n deleting, and listing an Amazon Web Services account alias in the Amazon Web Services Sign-In\n User Guide.

", + "smithy.api#examples": [ + { + "title": "To list account aliases", + "documentation": "The following command lists the aliases for the current account.", + "output": { + "AccountAliases": [ + "exmaple-corporation" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7841,6 +8537,21 @@ ], "traits": { "smithy.api#documentation": "

Lists the names of the inline policies that are embedded in the specified IAM\n group.

\n

An IAM group can also have managed policies attached to it. To list the managed\n policies that are attached to a group, use ListAttachedGroupPolicies.\n For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

You can paginate the results using the MaxItems and Marker\n parameters. If there are no inline policies embedded with the specified group, the\n operation returns an empty list.

", + "smithy.api#examples": [ + { + "title": "To list the in-line policies for an IAM group", + "documentation": "The following command lists the names of in-line policies that are embedded in the IAM group named Admins.", + "input": { + "GroupName": "Admins" + }, + "output": { + "PolicyNames": [ + "AdminRoot", + "KeyPolicy" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7920,6 +8631,37 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM groups that have the specified path prefix.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list the IAM groups for the current account", + "documentation": "The following command lists the IAM groups in the current account:", + "output": { + "Groups": [ + { + "Path": "/division_abc/subdivision_xyz/", + "GroupName": "Admins", + "CreateDate": "2016-12-15T21:40:08.121Z", + "GroupId": "AGPA1111111111EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/Admins" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/engineering/", + "GroupName": "Test", + "CreateDate": "2016-11-30T14:10:01.156Z", + "GroupId": "AGP22222222222EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/", + "GroupName": "Managers", + "CreateDate": "2016-06-12T20:14:52.032Z", + "GroupId": "AGPI3333333333EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7946,6 +8688,33 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM groups that the specified IAM user belongs to.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list the groups that an IAM user belongs to", + "documentation": "The following command displays the groups that the IAM user named Bob belongs to.", + "input": { + "UserName": "Bob" + }, + "output": { + "Groups": [ + { + "Path": "/division_abc/subdivision_xyz/product_1234/engineering/", + "GroupName": "Test", + "CreateDate": "2016-11-30T14:10:01.156Z", + "GroupId": "AGP2111111111EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/", + "GroupName": "Managers", + "CreateDate": "2016-06-12T20:14:52.032Z", + "GroupId": "AGPI222222222SEXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8082,7 +8851,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\n For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\n For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListInstanceProfileTagsRequest": { @@ -8154,7 +8929,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the instance profiles that have the specified path prefix. If there are none,\n the operation returns an empty list. For more information about instance profiles, see\n About\n instance profiles.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see GetInstanceProfile.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the instance profiles that have the specified path prefix. If there are none,\n the operation returns an empty list. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see GetInstanceProfile.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8180,7 +8955,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the instance profiles that have the specified associated IAM role. If there\n are none, the operation returns an empty list. For more information about instance\n profiles, go to About instance\n profiles.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the instance profiles that have the specified associated IAM role. If there\n are none, the operation returns an empty list. For more information about instance\n profiles, go to Using\n instance profiles in the IAM User Guide.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8320,7 +9095,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListMFADeviceTagsRequest": { @@ -8479,7 +9260,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\n identity provider. The returned list of tags is sorted by tag key. For more information, see About web identity\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\n identity provider. The returned list of tags is sorted by tag key. For more information, see About web identity\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListOpenIDConnectProviderTagsRequest": { @@ -8616,7 +9403,51 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves a list of policies that the IAM identity (user, group, or role) can use to\n access each specified service.

\n \n

This operation does not use other policy types when determining whether a resource\n could access a service. These other policy types include resource-based policies,\n access control lists, Organizations policies, IAM permissions boundaries, and STS\n assume role policies. It only applies permissions policy logic. For more about the\n evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

The list of policies returned by the operation depends on the ARN of the identity that\n you provide.

\n
    \n
  • \n

    \n User – The list of policies includes\n the managed and inline policies that are attached to the user directly. The list\n also includes any additional managed and inline policies that are attached to\n the group to which the user belongs.

    \n
  • \n
  • \n

    \n Group – The list of policies includes\n only the managed and inline policies that are attached to the group directly.\n Policies that are attached to the group’s user are not included.

    \n
  • \n
  • \n

    \n Role – The list of policies includes\n only the managed and inline policies that are attached to the role.

    \n
  • \n
\n

For each managed policy, this operation returns the ARN and policy name. For each\n inline policy, it returns the policy name and the entity to which it is attached. Inline\n policies do not have an ARN. For more information about these policy types, see Managed policies and inline policies in the\n IAM User Guide.

\n

Policies that are attached to users and roles as permissions boundaries are not\n returned. To view which managed policy is currently used to set the permissions boundary\n for a user or role, use the GetUser or GetRole\n operations.

" + "smithy.api#documentation": "

Retrieves a list of policies that the IAM identity (user, group, or role) can use to\n access each specified service.

\n \n

This operation does not use other policy types when determining whether a resource\n could access a service. These other policy types include resource-based policies,\n access control lists, Organizations policies, IAM permissions boundaries, and STS\n assume role policies. It only applies permissions policy logic. For more about the\n evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

The list of policies returned by the operation depends on the ARN of the identity that\n you provide.

\n
    \n
  • \n

    \n User – The list of policies includes\n the managed and inline policies that are attached to the user directly. The list\n also includes any additional managed and inline policies that are attached to\n the group to which the user belongs.

    \n
  • \n
  • \n

    \n Group – The list of policies includes\n only the managed and inline policies that are attached to the group directly.\n Policies that are attached to the group’s user are not included.

    \n
  • \n
  • \n

    \n Role – The list of policies includes\n only the managed and inline policies that are attached to the role.

    \n
  • \n
\n

For each managed policy, this operation returns the ARN and policy name. For each\n inline policy, it returns the policy name and the entity to which it is attached. Inline\n policies do not have an ARN. For more information about these policy types, see Managed policies and inline policies in the\n IAM User Guide.

\n

Policies that are attached to users and roles as permissions boundaries are not\n returned. To view which managed policy is currently used to set the permissions boundary\n for a user or role, use the GetUser or GetRole\n operations.

", + "smithy.api#examples": [ + { + "title": "To list policies that allow access to a service", + "documentation": "The following operation lists policies that allow ExampleUser01 to access IAM or EC2.", + "input": { + "Arn": "arn:aws:iam::123456789012:user/ExampleUser01", + "ServiceNamespaces": [ + "iam", + "ec2" + ] + }, + "output": { + "IsTruncated": false, + "PoliciesGrantingServiceAccess": [ + { + "Policies": [ + { + "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleIamPolicy", + "PolicyType": "MANAGED", + "PolicyName": "ExampleIamPolicy" + }, + { + "EntityName": "AWSExampleGroup1", + "EntityType": "GROUP", + "PolicyType": "INLINE", + "PolicyName": "ExampleGroup1Policy" + } + ], + "ServiceNamespace": "iam" + }, + { + "Policies": [ + { + "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleEc2Policy", + "PolicyType": "MANAGED", + "PolicyName": "ExampleEc2Policy" + } + ], + "ServiceNamespace": "ec2" + } + ] + } + } + ] } }, "com.amazonaws.iam#ListPoliciesGrantingServiceAccessEntry": { @@ -8788,7 +9619,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM customer managed policy.\n The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM customer managed policy.\n The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListPolicyTagsRequest": { @@ -9029,7 +9866,35 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To list the tags attached to an IAM role", + "documentation": "The following example shows how to list the tags attached to a role.", + "input": { + "RoleName": "taggedrole1" + }, + "output": { + "Tags": [ + { + "Key": "Dept", + "Value": "12345" + }, + { + "Key": "Team", + "Value": "Accounting" + } + ], + "IsTruncated": false + } + } + ], + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListRoleTagsRequest": { @@ -9101,7 +9966,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the IAM roles that have the specified path prefix. If there are none, the\n operation returns an empty list. For more information about roles, see Working with\n roles.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    RoleLastUsed

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a role, see GetRole.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the IAM roles that have the specified path prefix. If there are none, the\n operation returns an empty list. For more information about roles, see IAM roles in the\n IAM User Guide.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    RoleLastUsed

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a role, see GetRole.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9185,7 +10050,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified Security Assertion Markup Language\n (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see About SAML 2.0-based\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified Security Assertion Markup Language\n (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see About SAML 2.0-based\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListSAMLProviderTagsRequest": { @@ -9376,7 +10247,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM server certificate. The\n returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

\n \n

For certificates in a Region supported by Certificate Manager (ACM), we\n recommend that you don't use IAM server certificates. Instead, use ACM to provision,\n manage, and deploy your server certificates. For more information about IAM server\n certificates, Working with server\n certificates in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM server certificate. The\n returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

\n \n

For certificates in a Region supported by Certificate Manager (ACM), we\n recommend that you don't use IAM server certificates. Instead, use ACM to provision,\n manage, and deploy your server certificates. For more information about IAM server\n certificates, Working with server\n certificates in the IAM User Guide.

\n
", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListServerCertificateTagsRequest": { @@ -9584,6 +10461,26 @@ ], "traits": { "smithy.api#documentation": "

Returns information about the signing certificates associated with the specified IAM\n user. If none exists, the operation returns an empty list.

\n

Although each user is limited to a small number of signing certificates, you can still\n paginate the results using the MaxItems and Marker\n parameters.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request for this operation.\n This operation works for access keys under the Amazon Web Services account. Consequently, you can use\n this operation to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no\n associated users.

", + "smithy.api#examples": [ + { + "title": "To list the signing certificates for an IAM user", + "documentation": "The following command lists the signing certificates for the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "Certificates": [ + { + "UserName": "Bob", + "Status": "Active", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE", + "UploadDate": "2013-06-06T21:40:08Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9747,6 +10644,28 @@ ], "traits": { "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM user. The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To list the tags attached to an IAM user", + "documentation": "The following example shows how to list the tags attached to a user.", + "input": { + "UserName": "anika" + }, + "output": { + "Tags": [ + { + "Key": "Dept", + "Value": "12345" + }, + { + "Key": "Team", + "Value": "Accounting" + } + ], + "IsTruncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9825,6 +10744,32 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM users that have the specified path prefix. If no path prefix is\n specified, the operation returns all users in the Amazon Web Services account. If there are none, the\n operation returns an empty list.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a user, see GetUser.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list IAM users", + "documentation": "The following command lists the IAM users in the current account.", + "output": { + "Users": [ + { + "UserId": "AID2MAB8DPLSRHEXAMPLE", + "Path": "/division_abc/subdivision_xyz/engineering/", + "UserName": "Juan", + "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Juan", + "CreateDate": "2012-09-05T19:38:48Z", + "PasswordLastUsed": "2016-09-08T21:47:36Z" + }, + { + "UserId": "AIDIODR4TAW7CSEXAMPLE", + "Path": "/division_abc/subdivision_xyz/engineering/", + "UserName": "Anika", + "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Anika", + "CreateDate": "2014-04-09T15:43:45Z", + "PasswordLastUsed": "2016-09-24T16:18:07Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9898,6 +10843,22 @@ }, "traits": { "smithy.api#documentation": "

Lists the virtual MFA devices defined in the Amazon Web Services account by assignment status. If\n you do not specify an assignment status, the operation returns a list of all virtual MFA\n devices. Assignment status can be Assigned, Unassigned, or\n Any.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view tag information for a virtual MFA device, see ListMFADeviceTags.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list virtual MFA devices", + "documentation": "The following command lists the virtual MFA devices that have been configured for the current account.", + "output": { + "VirtualMFADevices": [ + { + "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleMFADevice" + }, + { + "SerialNumber": "arn:aws:iam::123456789012:mfa/Juan" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -10734,7 +11695,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use AttachGroupPolicy. To create a new managed policy, use\n CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use \n AttachGroupPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To add a policy to a group", + "documentation": "The following command adds a policy named AllPerms to the IAM group named Admins.", + "input": { + "GroupName": "Admins", + "PolicyName": "AllPerms", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutGroupPolicyRequest": { @@ -10757,7 +11729,7 @@ "PolicyDocument": { "target": "com.amazonaws.iam#policyDocumentType", "traits": { - "smithy.api#documentation": "

The policy document.

\n

You must provide policies in JSON format in IAM. However, for CloudFormation templates\n formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\n converts a YAML policy to JSON format before submitting it to = IAM.

\n

The regex pattern \n used to validate this parameter is a string of characters consisting of the following:

\n
    \n
  • \n

    Any printable ASCII \n character ranging from the space character (\\u0020) through the end of the ASCII character range

    \n
  • \n
  • \n

    The printable characters in the Basic Latin and Latin-1 Supplement character set \n (through \\u00FF)

    \n
  • \n
  • \n

    The special characters tab (\\u0009), line feed (\\u000A), and \n carriage return (\\u000D)

    \n
  • \n
", + "smithy.api#documentation": "

The policy document.

\n

You must provide policies in JSON format in IAM. However, for CloudFormation templates\n formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\n converts a YAML policy to JSON format before submitting it to IAM.

\n

The regex pattern \n used to validate this parameter is a string of characters consisting of the following:

\n
    \n
  • \n

    Any printable ASCII \n character ranging from the space character (\\u0020) through the end of the ASCII character range

    \n
  • \n
  • \n

    The printable characters in the Basic Latin and Latin-1 Supplement character set \n (through \\u00FF)

    \n
  • \n
  • \n

    The special characters tab (\\u0009), line feed (\\u000A), and \n carriage return (\\u000D)

    \n
  • \n
", "smithy.api#required": {} } } @@ -10843,7 +11815,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using CreateRole. You can update a role's trust policy\n using UpdateAssumeRolePolicy. For more information about IAM roles,\n see Using roles to\n delegate permissions and federate identities.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use AttachRolePolicy. To create a new managed policy, use CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using \n CreateRole\n .\n You can update a role's trust policy using \n UpdateAssumeRolePolicy\n . For more information about roles,\n see IAM\n roles in the IAM User Guide.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use \n AttachRolePolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To attach a permissions policy to an IAM role", + "documentation": "The following command adds a permissions policy to the role named Test-Role.", + "input": { + "RoleName": "S3Access", + "PolicyName": "S3AccessPolicy", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"s3:*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutRolePolicyRequest": { @@ -10946,7 +11929,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use AttachUserPolicy. To create a new managed\n policy, use CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use \n AttachUserPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To attach a policy to an IAM user", + "documentation": "The following command attaches a policy to the IAM user named Bob.", + "input": { + "UserName": "Bob", + "PolicyName": "AllAccessPolicy", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutUserPolicyRequest": { @@ -11064,7 +12058,17 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about IAM roles, see Working with roles. For more\n information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a role from an instance profile", + "documentation": "The following command removes the role named Test-Role from the instance profile named ExampleInstanceProfile.", + "input": { + "RoleName": "Test-Role", + "InstanceProfileName": "ExampleInstanceProfile" + } + } + ] } }, "com.amazonaws.iam#RemoveRoleFromInstanceProfileRequest": { @@ -11109,7 +12113,17 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified user from the specified group.

" + "smithy.api#documentation": "

Removes the specified user from the specified group.

", + "smithy.api#examples": [ + { + "title": "To remove a user from an IAM group", + "documentation": "The following command removes the user named Bob from the IAM group named Admins.", + "input": { + "UserName": "Bob", + "GroupName": "Admins" + } + } + ] } }, "com.amazonaws.iam#RemoveUserFromGroupRequest": { @@ -12077,7 +13091,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the specified version of the global endpoint token as the token version used for\n the Amazon Web Services account.

\n

By default, Security Token Service (STS) is available as a global service, and all STS requests\n go to a single endpoint at https://sts.amazonaws.com. Amazon Web Services recommends\n using Regional STS endpoints to reduce latency, build in redundancy, and increase\n session token availability. For information about Regional endpoints for STS, see\n Security Token Service\n endpoints and quotas in the Amazon Web Services General Reference.

\n

If you make an STS call to the global endpoint, the resulting session tokens might\n be valid in some Regions but not others. It depends on the version that is set in this\n operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\n available by default. These tokens do not work in manually enabled Regions, such as Asia\n Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\n tokens are longer and might affect systems where you temporarily store tokens. For\n information, see Activating and\n deactivating STS in an Amazon Web Services Region in the\n IAM User Guide.

\n

To view the current session token version, see the\n GlobalEndpointTokenVersion entry in the response of the GetAccountSummary operation.

" + "smithy.api#documentation": "

Sets the specified version of the global endpoint token as the token version used for\n the Amazon Web Services account.

\n

By default, Security Token Service (STS) is available as a global service, and all STS requests\n go to a single endpoint at https://sts.amazonaws.com. Amazon Web Services recommends\n using Regional STS endpoints to reduce latency, build in redundancy, and increase\n session token availability. For information about Regional endpoints for STS, see\n Security Token Service\n endpoints and quotas in the Amazon Web Services General Reference.

\n

If you make an STS call to the global endpoint, the resulting session tokens might\n be valid in some Regions but not others. It depends on the version that is set in this\n operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\n available by default. These tokens do not work in manually enabled Regions, such as Asia\n Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\n tokens are longer and might affect systems where you temporarily store tokens. For\n information, see Activating and\n deactivating STS in an Amazon Web Services Region in the\n IAM User Guide.

\n

To view the current session token version, see the\n GlobalEndpointTokenVersion entry in the response of the GetAccountSummary operation.

", + "smithy.api#examples": [ + { + "title": "To delete an access key for an IAM user", + "documentation": "The following command sets the STS global endpoint token to version 2. Version 2 tokens are valid in all Regions.", + "input": { + "GlobalEndpointTokenVersion": "v2Token" + } + } + ] } }, "com.amazonaws.iam#SetSecurityTokenServicePreferencesRequest": { @@ -12673,7 +13696,26 @@ } ], "traits": { - "smithy.api#documentation": "

Adds one or more tags to an IAM role. The role can be a regular role or a\n service-linked role. If a tag with the same key name already exists, then that tag is\n overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM user-based\n and resource-based policies. You can use tags to restrict access to only an IAM role\n that has a specified tag attached. You can also restrict access to only those resources\n that have a certain tag attached. For examples of policies that show how to use tags to\n control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

" + "smithy.api#documentation": "

Adds one or more tags to an IAM role. The role can be a regular role or a\n service-linked role. If a tag with the same key name already exists, then that tag is\n overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM user-based\n and resource-based policies. You can use tags to restrict access to only an IAM role\n that has a specified tag attached. You can also restrict access to only those resources\n that have a certain tag attached. For examples of policies that show how to use tags to\n control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag key and value to an IAM role", + "documentation": "The following example shows how to add tags to an existing role.", + "input": { + "RoleName": "taggedrole", + "Tags": [ + { + "Key": "Dept", + "Value": "Accounting" + }, + { + "Key": "CostCenter", + "Value": "12345" + } + ] + } + } + ] } }, "com.amazonaws.iam#TagRoleRequest": { @@ -12826,7 +13868,26 @@ } ], "traits": { - "smithy.api#documentation": "

Adds one or more tags to an IAM user. If a tag with the same key name already exists,\n then that tag is overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM identity-based\n and resource-based policies. You can use tags to restrict access to only an IAM\n requesting user that has a specified tag attached. You can also restrict access to only\n those resources that have a certain tag attached. For examples of policies that show how\n to use tags to control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

" + "smithy.api#documentation": "

Adds one or more tags to an IAM user. If a tag with the same key name already exists,\n then that tag is overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM identity-based\n and resource-based policies. You can use tags to restrict access to only an IAM\n requesting user that has a specified tag attached. You can also restrict access to only\n those resources that have a certain tag attached. For examples of policies that show how\n to use tags to control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag key and value to an IAM user", + "documentation": "The following example shows how to add tags to an existing user.", + "input": { + "UserName": "anika", + "Tags": [ + { + "Key": "Dept", + "Value": "Accounting" + }, + { + "Key": "CostCenter", + "Value": "12345" + } + ] + } + } + ] } }, "com.amazonaws.iam#TagUserRequest": { @@ -13132,7 +14193,19 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified tags from the role. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified tags from the role. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a tag from an IAM role", + "documentation": "The following example shows how to remove a tag with the key 'Dept' from a role named 'taggedrole'.", + "input": { + "RoleName": "taggedrole", + "TagKeys": [ + "Dept" + ] + } + } + ] } }, "com.amazonaws.iam#UntagRoleRequest": { @@ -13273,7 +14346,19 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified tags from the user. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified tags from the user. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a tag from an IAM user", + "documentation": "The following example shows how to remove tags that are attached to a user named 'anika'.", + "input": { + "UserName": "anika", + "TagKeys": [ + "Dept" + ] + } + } + ] } }, "com.amazonaws.iam#UntagUserRequest": { @@ -13318,7 +14403,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the status of the specified access key from Active to Inactive, or vice versa.\n This operation can be used to disable a user's key as part of a key rotation\n workflow.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n

For information about rotating keys, see Managing keys and certificates\n in the IAM User Guide.

" + "smithy.api#documentation": "

Changes the status of the specified access key from Active to Inactive, or vice versa.\n This operation can be used to disable a user's key as part of a key rotation\n workflow.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n

For information about rotating keys, see Managing keys and certificates\n in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To activate or deactivate an access key for an IAM user", + "documentation": "The following command deactivates the specified access key (access key ID and secret access key) for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "Status": "Inactive", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + ] } }, "com.amazonaws.iam#UpdateAccessKeyRequest": { @@ -13372,7 +14468,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the password policy settings for the Amazon Web Services account.

\n \n

This operation does not support partial updates. No parameters are required, but\n if you do not specify a parameter, that parameter's value reverts to its default\n value. See the Request Parameters section for each\n parameter's default value. Also note that some parameters do not allow the default\n parameter to be explicitly set. Instead, to invoke the default value, do not include\n that parameter when you invoke the operation.

\n
\n

For more information about using a password policy, see Managing an IAM password\n policy in the IAM User Guide.

" + "smithy.api#documentation": "

Updates the password policy settings for the Amazon Web Services account.

\n \n

This operation does not support partial updates. No parameters are required, but\n if you do not specify a parameter, that parameter's value reverts to its default\n value. See the Request Parameters section for each\n parameter's default value. Also note that some parameters do not allow the default\n parameter to be explicitly set. Instead, to invoke the default value, do not include\n that parameter when you invoke the operation.

\n
\n

For more information about using a password policy, see Managing an IAM password\n policy in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To set or change the current account password policy", + "documentation": "The following command sets the password policy to require a minimum length of eight characters and to require one or more numbers in the password:", + "input": { + "MinimumPasswordLength": 8, + "RequireNumbers": true + } + } + ] } }, "com.amazonaws.iam#UpdateAccountPasswordPolicyRequest": { @@ -13468,7 +14574,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the policy that grants an IAM entity permission to assume a role. This is\n typically referred to as the \"role trust policy\". For more information about roles, see\n Using roles to\n delegate permissions and federate identities.

" + "smithy.api#documentation": "

Updates the policy that grants an IAM entity permission to assume a role. This is\n typically referred to as the \"role trust policy\". For more information about roles, see\n Using roles to\n delegate permissions and federate identities.

", + "smithy.api#examples": [ + { + "title": "To update the trust policy for an IAM role", + "documentation": "The following command updates the role trust policy for the role named Test-Role:", + "input": { + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]},\"Action\":[\"sts:AssumeRole\"]}]}", + "RoleName": "S3AccessForEC2Instances" + } + } + ] } }, "com.amazonaws.iam#UpdateAssumeRolePolicyRequest": { @@ -13516,7 +14632,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM group.

\n \n

You should understand the implications of changing a group's path or name. For\n more information, see Renaming users and\n groups in the IAM User Guide.

\n
\n \n

The person making the request (the principal), must have permission to change the\n role group with the old name and the new name. For example, to change the group\n named Managers to MGRs, the principal must have a policy\n that allows them to update both groups. If the principal has permission to update\n the Managers group, but not the MGRs group, then the\n update fails. For more information about permissions, see Access management.\n

\n
" + "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM group.

\n \n

You should understand the implications of changing a group's path or name. For\n more information, see Renaming users and\n groups in the IAM User Guide.

\n
\n \n

The person making the request (the principal), must have permission to change the\n role group with the old name and the new name. For example, to change the group\n named Managers to MGRs, the principal must have a policy\n that allows them to update both groups. If the principal has permission to update\n the Managers group, but not the MGRs group, then the\n update fails. For more information about permissions, see Access management.\n

\n
", + "smithy.api#examples": [ + { + "title": "To rename an IAM group", + "documentation": "The following command changes the name of the IAM group Test to Test-1.", + "input": { + "GroupName": "Test", + "NewGroupName": "Test-1" + } + } + ] } }, "com.amazonaws.iam#UpdateGroupRequest": { @@ -13572,7 +14698,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\n API, or the Users page in the IAM console to change\n the password for any IAM user. Use ChangePassword to change your own\n password in the My Security Credentials page in the\n Amazon Web Services Management Console.

\n

For more information about modifying passwords, see Managing passwords in the\n IAM User Guide.

" + "smithy.api#documentation": "

Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\n API, or the Users page in the IAM console to change\n the password for any IAM user. Use ChangePassword to change your own\n password in the My Security Credentials page in the\n Amazon Web Services Management Console.

\n

For more information about modifying passwords, see Managing passwords in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To change the password for an IAM user", + "documentation": "The following command creates or changes the password for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "Password": "SomeKindOfPassword123!@#" + } + } + ] } }, "com.amazonaws.iam#UpdateLoginProfileRequest": { @@ -13622,7 +14758,7 @@ } ], "traits": { - "smithy.api#documentation": "

Replaces the existing list of server certificate thumbprints associated with an OpenID\n Connect (OIDC) provider resource object with a new list of thumbprints.

\n

The list that you pass with this operation completely replaces the existing list of\n thumbprints. (The lists are not merged.)

\n

Typically, you need to update a thumbprint only when the identity provider certificate\n changes, which occurs rarely. However, if the provider's certificate\n does change, any attempt to assume an IAM role that specifies\n the OIDC provider as a principal fails until the certificate thumbprint is\n updated.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Google, Auth0,\n and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In these\n cases, your legacy thumbprint remains in your configuration, but is no longer used for\n validation.

\n
\n \n

Trust for the OIDC provider is derived from the provider certificate and is\n validated by the thumbprint. Therefore, it is best to limit access to the\n UpdateOpenIDConnectProviderThumbprint operation to highly\n privileged users.

\n
" + "smithy.api#documentation": "

Replaces the existing list of server certificate thumbprints associated with an OpenID\n Connect (OIDC) provider resource object with a new list of thumbprints.

\n

The list that you pass with this operation completely replaces the existing list of\n thumbprints. (The lists are not merged.)

\n

Typically, you need to update a thumbprint only when the identity provider certificate\n changes, which occurs rarely. However, if the provider's certificate\n does change, any attempt to assume an IAM role that specifies\n the OIDC provider as a principal fails until the certificate thumbprint is\n updated.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

Trust for the OIDC provider is derived from the provider certificate and is\n validated by the thumbprint. Therefore, it is best to limit access to the\n UpdateOpenIDConnectProviderThumbprint operation to highly\n privileged users.

\n
" } }, "com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprintRequest": { @@ -13990,7 +15126,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the status of the specified user signing certificate from active to disabled,\n or vice versa. This operation can be used to disable an IAM user's signing\n certificate as part of a certificate rotation work flow.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

" + "smithy.api#documentation": "

Changes the status of the specified user signing certificate from active to disabled,\n or vice versa. This operation can be used to disable an IAM user's signing\n certificate as part of a certificate rotation work flow.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

", + "smithy.api#examples": [ + { + "title": "To change the active status of a signing certificate for an IAM user", + "documentation": "The following command changes the status of a signing certificate for a user named Bob to Inactive.", + "input": { + "UserName": "Bob", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE", + "Status": "Inactive" + } + } + ] } }, "com.amazonaws.iam#UpdateSigningCertificateRequest": { @@ -14050,7 +15197,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM user.

\n \n

You should understand the implications of changing an IAM user's path or\n name. For more information, see Renaming an IAM\n user and Renaming an IAM\n group in the IAM User Guide.

\n
\n \n

To change a user name, the requester must have appropriate permissions on both\n the source object and the target object. For example, to change Bob to Robert, the\n entity making the request must have permission on Bob and Robert, or must have\n permission on all (*). For more information about permissions, see Permissions and policies.

\n
" + "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM user.

\n \n

You should understand the implications of changing an IAM user's path or\n name. For more information, see Renaming an IAM\n user and Renaming an IAM\n group in the IAM User Guide.

\n
\n \n

To change a user name, the requester must have appropriate permissions on both\n the source object and the target object. For example, to change Bob to Robert, the\n entity making the request must have permission on Bob and Robert, or must have\n permission on all (*). For more information about permissions, see Permissions and policies.

\n
", + "smithy.api#examples": [ + { + "title": "To change an IAM user's name", + "documentation": "The following command changes the name of the IAM user Bob to Robert. It does not change the user's path.", + "input": { + "UserName": "Bob", + "NewUserName": "Robert" + } + } + ] } }, "com.amazonaws.iam#UpdateUserRequest": { @@ -14178,7 +15335,29 @@ } ], "traits": { - "smithy.api#documentation": "

Uploads a server certificate entity for the Amazon Web Services account. The server certificate\n entity includes a public key certificate, a private key, and an optional certificate\n chain, which should all be PEM-encoded.

\n

We recommend that you use Certificate Manager to\n provision, manage, and deploy your server certificates. With ACM you can request a\n certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\n you. Certificates provided by ACM are free. For more information about using ACM,\n see the Certificate Manager User\n Guide.

\n

For more information about working with server certificates, see Working\n with server certificates in the IAM User Guide. This\n topic includes a list of Amazon Web Services services that can use the server certificates that you\n manage with IAM.

\n

For information about the number of server certificates you can upload, see IAM and STS\n quotas in the IAM User Guide.

\n \n

Because the body of the public key certificate, private key, and the certificate\n chain can be large, you should use POST rather than GET when calling\n UploadServerCertificate. For information about setting up\n signatures and authorization through the API, see Signing Amazon Web Services API\n requests in the Amazon Web Services General Reference. For general\n information about using the Query API with IAM, see Calling the API by making HTTP query\n requests in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Uploads a server certificate entity for the Amazon Web Services account. The server certificate\n entity includes a public key certificate, a private key, and an optional certificate\n chain, which should all be PEM-encoded.

\n

We recommend that you use Certificate Manager to\n provision, manage, and deploy your server certificates. With ACM you can request a\n certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\n you. Certificates provided by ACM are free. For more information about using ACM,\n see the Certificate Manager User\n Guide.

\n

For more information about working with server certificates, see Working\n with server certificates in the IAM User Guide. This\n topic includes a list of Amazon Web Services services that can use the server certificates that you\n manage with IAM.

\n

For information about the number of server certificates you can upload, see IAM and STS\n quotas in the IAM User Guide.

\n \n

Because the body of the public key certificate, private key, and the certificate\n chain can be large, you should use POST rather than GET when calling\n UploadServerCertificate. For information about setting up\n signatures and authorization through the API, see Signing Amazon Web Services API\n requests in the Amazon Web Services General Reference. For general\n information about using the Query API with IAM, see Calling the API by making HTTP query\n requests in the IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To upload a server certificate to your AWS account", + "documentation": "The following upload-server-certificate command uploads a server certificate to your AWS account:", + "input": { + "ServerCertificateName": "ProdServerCert", + "Path": "/company/servercerts/", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "PrivateKey": "-----BEGIN DSA PRIVATE KEY----------END DSA PRIVATE KEY-----" + }, + "output": { + "ServerCertificateMetadata": { + "ServerCertificateName": "ProdServerCert", + "Path": "/company/servercerts/", + "Arn": "arn:aws:iam::123456789012:server-certificate/company/servercerts/ProdServerCert", + "UploadDate": "2010-05-08T01:02:03.004Z", + "ServerCertificateId": "ASCA1111111111EXAMPLE", + "Expiration": "2012-05-08T01:02:03.004Z" + } + } + } + ] } }, "com.amazonaws.iam#UploadServerCertificateRequest": { @@ -14284,7 +15463,26 @@ } ], "traits": { - "smithy.api#documentation": "

Uploads an X.509 signing certificate and associates it with the specified IAM user.\n Some Amazon Web Services services require you to use certificates to validate requests that are signed\n with a corresponding private key. When you upload the certificate, its default status is\n Active.

\n

For information about when you would use an X.509 signing certificate, see Managing\n server certificates in IAM in the\n IAM User Guide.

\n

If the UserName is not specified, the IAM user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

\n \n

Because the body of an X.509 certificate can be large, you should use POST rather\n than GET when calling UploadSigningCertificate. For information about\n setting up signatures and authorization through the API, see Signing\n Amazon Web Services API requests in the Amazon Web Services General Reference. For\n general information about using the Query API with IAM, see Making query\n requests in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Uploads an X.509 signing certificate and associates it with the specified IAM user.\n Some Amazon Web Services services require you to use certificates to validate requests that are signed\n with a corresponding private key. When you upload the certificate, its default status is\n Active.

\n

For information about when you would use an X.509 signing certificate, see Managing\n server certificates in IAM in the\n IAM User Guide.

\n

If the UserName is not specified, the IAM user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

\n \n

Because the body of an X.509 certificate can be large, you should use POST rather\n than GET when calling UploadSigningCertificate. For information about\n setting up signatures and authorization through the API, see Signing\n Amazon Web Services API requests in the Amazon Web Services General Reference. For\n general information about using the Query API with IAM, see Making query\n requests in the IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To upload a signing certificate for an IAM user", + "documentation": "The following command uploads a signing certificate for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----" + }, + "output": { + "Certificate": { + "CertificateId": "ID123456789012345EXAMPLE", + "UserName": "Bob", + "Status": "Active", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "UploadDate": "2015-06-06T21:40:08.121Z" + } + } + } + ] } }, "com.amazonaws.iam#UploadSigningCertificateRequest": { diff --git a/aws/sdk/aws-models/kms.json b/aws/sdk/aws-models/kms.json index e161d678534..3a8eb8f9747 100644 --- a/aws/sdk/aws-models/kms.json +++ b/aws/sdk/aws-models/kms.json @@ -188,7 +188,19 @@ } ], "traits": { - "smithy.api#documentation": "

Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\n key is Disabled. To enable the KMS key, use EnableKey.

\n

For more information about scheduling and canceling deletion of a KMS key, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CancelKeyDeletion (key policy)

\n

\n Related operations: ScheduleKeyDeletion\n

" + "smithy.api#documentation": "

Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\n key is Disabled. To enable the KMS key, use EnableKey.

\n

For more information about scheduling and canceling deletion of a KMS key, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CancelKeyDeletion (key policy)

\n

\n Related operations: ScheduleKeyDeletion\n

", + "smithy.api#examples": [ + { + "title": "To cancel deletion of a KMS key", + "documentation": "The following example cancels deletion of the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#CancelKeyDeletionRequest": { @@ -350,7 +362,17 @@ } ], "traits": { - "smithy.api#documentation": "

Connects or reconnects a custom key store to its backing key store. For an CloudHSM key\n store, ConnectCustomKeyStore connects the key store to its associated CloudHSM\n cluster. For an external key store, ConnectCustomKeyStore connects the key store\n to the external key store proxy that communicates with your external key manager.

\n

The custom key store must be connected before you can create KMS keys in the key store or\n use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\n time.

\n

The connection process for a custom key store can take an extended amount of time to\n complete. This operation starts the connection process, but it does not wait for it to\n complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\n object with no properties. However, this response does not indicate that the custom key store\n is connected. To get the connection state of the custom key store, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The ConnectCustomKeyStore operation might fail for various reasons. To find\n the reason, use the DescribeCustomKeyStores operation and see the\n ConnectionErrorCode in the response. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

To fix the failure, use the DisconnectCustomKeyStore operation to\n disconnect the custom key store, correct the error, use the UpdateCustomKeyStore operation if necessary, and then use\n ConnectCustomKeyStore again.

\n

\n CloudHSM key store\n

\n

During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\n is associated with the custom key store, creates the connection infrastructure, connects to\n the cluster, logs into the CloudHSM client as the kmsuser CU, and rotates its\n password.

\n

To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\n HSM. To get the number of active HSMs in a cluster, use the DescribeClusters operation. To add HSMs\n to the cluster, use the CreateHsm operation. Also, the \n kmsuser crypto\n user (CU) must not be logged into the cluster. This prevents KMS from using this\n account to log in.

\n

If you are having trouble connecting or disconnecting a CloudHSM key store, see Troubleshooting an CloudHSM key\n store in the Key Management Service Developer Guide.

\n

\n External key store\n

\n

When you connect an external key store that uses public endpoint connectivity, KMS tests\n its ability to communicate with your external key manager by sending a request via the\n external key store proxy.

\n

When you connect to an external key store that uses VPC endpoint service connectivity,\n KMS establishes the networking elements that it needs to communicate with your external key\n manager via the external key store proxy. This includes creating an interface endpoint to the\n VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\n service.

\n

To connect an external key store, KMS must be able to connect to the external key store\n proxy, the external key store proxy must be able to communicate with your external key\n manager, and the external key manager must be available for cryptographic operations.

\n

If you are having trouble connecting or disconnecting an external key store, see Troubleshooting an external\n key store in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:ConnectCustomKeyStore (IAM policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Connects or reconnects a custom key store to its backing key store. For an CloudHSM key\n store, ConnectCustomKeyStore connects the key store to its associated CloudHSM\n cluster. For an external key store, ConnectCustomKeyStore connects the key store\n to the external key store proxy that communicates with your external key manager.

\n

The custom key store must be connected before you can create KMS keys in the key store or\n use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\n time.

\n

The connection process for a custom key store can take an extended amount of time to\n complete. This operation starts the connection process, but it does not wait for it to\n complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\n object with no properties. However, this response does not indicate that the custom key store\n is connected. To get the connection state of the custom key store, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The ConnectCustomKeyStore operation might fail for various reasons. To find\n the reason, use the DescribeCustomKeyStores operation and see the\n ConnectionErrorCode in the response. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

To fix the failure, use the DisconnectCustomKeyStore operation to\n disconnect the custom key store, correct the error, use the UpdateCustomKeyStore operation if necessary, and then use\n ConnectCustomKeyStore again.

\n

\n CloudHSM key store\n

\n

During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\n is associated with the custom key store, creates the connection infrastructure, connects to\n the cluster, logs into the CloudHSM client as the kmsuser CU, and rotates its\n password.

\n

To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\n HSM. To get the number of active HSMs in a cluster, use the DescribeClusters operation. To add HSMs\n to the cluster, use the CreateHsm operation. Also, the \n kmsuser crypto\n user (CU) must not be logged into the cluster. This prevents KMS from using this\n account to log in.

\n

If you are having trouble connecting or disconnecting a CloudHSM key store, see Troubleshooting an CloudHSM key\n store in the Key Management Service Developer Guide.

\n

\n External key store\n

\n

When you connect an external key store that uses public endpoint connectivity, KMS tests\n its ability to communicate with your external key manager by sending a request via the\n external key store proxy.

\n

When you connect to an external key store that uses VPC endpoint service connectivity,\n KMS establishes the networking elements that it needs to communicate with your external key\n manager via the external key store proxy. This includes creating an interface endpoint to the\n VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\n service.

\n

To connect an external key store, KMS must be able to connect to the external key store\n proxy, the external key store proxy must be able to communicate with your external key\n manager, and the external key manager must be available for cryptographic operations.

\n

If you are having trouble connecting or disconnecting an external key store, see Troubleshooting an external\n key store in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:ConnectCustomKeyStore (IAM policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To connect a custom key store", + "documentation": "This example connects an AWS KMS custom key store to its backing key store. For an AWS CloudHSM key store, it connects the key store to its AWS CloudHSM cluster. For an external key store, it connects the key store to the external key store proxy that communicates with your external key manager. This operation does not return any data. To verify that the custom key store is connected, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#ConnectCustomKeyStoreRequest": { @@ -555,7 +577,17 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a friendly name for a KMS key.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

You can use an alias to identify a KMS key in the KMS console, in the DescribeKey operation and in cryptographic operations, such as Encrypt and\n GenerateDataKey. You can also change the KMS key that's associated with\n the alias (UpdateAlias) or delete the alias (DeleteAlias)\n at any time. These operations don't affect the underlying KMS key.

\n

You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\n alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\n A valid KMS key is required. You can't create an alias without a KMS key.

\n

The alias must be unique in the account and Region, but you can have aliases with the same\n name in different Regions. For detailed information about aliases, see Using aliases in the\n Key Management Service Developer Guide.

\n

This operation does not return a response. To get the alias that you created, use the\n ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a friendly name for a KMS key.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

You can use an alias to identify a KMS key in the KMS console, in the DescribeKey operation and in cryptographic operations, such as Encrypt and\n GenerateDataKey. You can also change the KMS key that's associated with\n the alias (UpdateAlias) or delete the alias (DeleteAlias)\n at any time. These operations don't affect the underlying KMS key.

\n

You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\n alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\n A valid KMS key is required. You can't create an alias without a KMS key.

\n

The alias must be unique in the account and Region, but you can have aliases with the same\n name in different Regions. For detailed information about aliases, see Using aliases in the\n Key Management Service Developer Guide.

\n

This operation does not return a response. To get the alias that you created, use the\n ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create an alias", + "documentation": "The following example creates an alias for the specified KMS key.", + "input": { + "AliasName": "alias/ExampleAlias", + "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#CreateAliasRequest": { @@ -642,7 +674,22 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key stores backed by an external key store proxy and\n external key manager outside of Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration\n with the CreateCustomKeyStore operation. However, you can use the values in\n the file to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key\n stores backed by an external key store proxy and external key manager outside of\n Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration with\n the CreateCustomKeyStore operation. However, you can use the values in the file\n to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create an AWS CloudHSM key store", + "documentation": "This example creates a custom key store that is associated with an AWS CloudHSM cluster.", + "input": { + "CustomKeyStoreName": "ExampleKeyStore", + "CloudHsmClusterId": "cluster-234abcdefABC", + "TrustAnchorCertificate": "", + "KeyStorePassword": "kmsPswd" + }, + "output": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + } + } + ] } }, "com.amazonaws.kms#CreateCustomKeyStoreRequest": { @@ -694,7 +741,7 @@ "XksProxyVpcEndpointServiceName": { "target": "com.amazonaws.kms#XksProxyVpcEndpointServiceNameType", "traits": { - "smithy.api#documentation": "

Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\n communicate with your external key store proxy (XKS proxy). This parameter is required when\n the value of CustomKeyStoreType is EXTERNAL_KEY_STORE and the value\n of XksProxyConnectivity is VPC_ENDPOINT_SERVICE.

\n

The Amazon VPC endpoint service must fulfill all requirements for use with an external key\n store.

\n

\n Uniqueness requirements:\n

\n
    \n
  • \n

    External key stores with VPC_ENDPOINT_SERVICE connectivity can share an\n Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\n name.

    \n
  • \n
" + "smithy.api#documentation": "

Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\n communicate with your external key store proxy (XKS proxy). This parameter is required when\n the value of CustomKeyStoreType is EXTERNAL_KEY_STORE and the value\n of XksProxyConnectivity is VPC_ENDPOINT_SERVICE.

\n

The Amazon VPC endpoint service must fulfill all\n requirements for use with an external key store.

\n

\n Uniqueness requirements:\n

\n
    \n
  • \n

    External key stores with VPC_ENDPOINT_SERVICE connectivity can share an\n Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\n name.

    \n
  • \n
" } }, "XksProxyAuthenticationCredential": { @@ -706,7 +753,7 @@ "XksProxyConnectivity": { "target": "com.amazonaws.kms#XksProxyConnectivityType", "traits": { - "smithy.api#documentation": "

Indicates how KMS communicates with the external key store proxy. This parameter is\n required for custom key stores with a CustomKeyStoreType of\n EXTERNAL_KEY_STORE.

\n

If the external key store proxy uses a public endpoint, specify\n PUBLIC_ENDPOINT. If the external key store proxy uses a Amazon VPC\n endpoint service for communication with KMS, specify VPC_ENDPOINT_SERVICE. For\n help making this choice, see Choosing a connectivity option in the Key Management Service Developer Guide.

\n

An Amazon VPC endpoint service keeps your communication with KMS in a private address space\n entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\n verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\n might not fulfill your security requirements. You might consider testing with a public\n endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\n choice does not determine the location of the external key store proxy. Even if you choose a\n VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\n your corporate data center.

" + "smithy.api#documentation": "

Indicates how KMS communicates with the external key store proxy. This parameter is\n required for custom key stores with a CustomKeyStoreType of\n EXTERNAL_KEY_STORE.

\n

If the external key store proxy uses a public endpoint, specify\n PUBLIC_ENDPOINT. If the external key store proxy uses a Amazon VPC\n endpoint service for communication with KMS, specify VPC_ENDPOINT_SERVICE. For\n help making this choice, see Choosing a connectivity\n option in the Key Management Service Developer Guide.

\n

An Amazon VPC endpoint service keeps your communication with KMS in a private address space\n entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\n verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\n might not fulfill your security requirements. You might consider testing with a public\n endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\n choice does not determine the location of the external key store proxy. Even if you choose a\n VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\n your corporate data center.

" } } }, @@ -743,6 +790,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -763,7 +813,25 @@ } ], "traits": { - "smithy.api#documentation": "

Adds a grant to a KMS key.

\n

A grant is a policy instrument that allows Amazon Web Services principals to use\n KMS keys in cryptographic operations. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key,\n grants are considered along with key policies and IAM policies. Grants are often used for\n temporary permissions because you can create one, use its permissions, and delete it without\n changing your key policies or IAM policies.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

The CreateGrant operation returns a GrantToken and a\n GrantId.

\n
    \n
  • \n

    When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. Once the grant has achieved eventual consistency, the grantee\n principal can use the permissions in the grant without identifying the grant.

    \n

    However, to use the permissions in the grant immediately, use the\n GrantToken that CreateGrant returns. For details, see Using a\n grant token in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    The CreateGrant operation also returns a GrantId. You can\n use the GrantId and a key identifier to identify the grant in the RetireGrant and RevokeGrant operations. To find the grant\n ID, use the ListGrants or ListRetirableGrants\n operations.

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:CreateGrant (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Adds a grant to a KMS key.

\n

A grant is a policy instrument that allows Amazon Web Services principals to use\n KMS keys in cryptographic operations. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key,\n grants are considered along with key policies and IAM policies. Grants are often used for\n temporary permissions because you can create one, use its permissions, and delete it without\n changing your key policies or IAM policies.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

The CreateGrant operation returns a GrantToken and a\n GrantId.

\n
    \n
  • \n

    When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. Once the grant has achieved eventual consistency, the grantee\n principal can use the permissions in the grant without identifying the grant.

    \n

    However, to use the permissions in the grant immediately, use the\n GrantToken that CreateGrant returns. For details, see Using a\n grant token in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    The CreateGrant operation also returns a GrantId. You can\n use the GrantId and a key identifier to identify the grant in the RetireGrant and RevokeGrant operations. To find the grant\n ID, use the ListGrants or ListRetirableGrants\n operations.

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:CreateGrant (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create a grant", + "documentation": "The following example creates a grant that allows the specified IAM role to encrypt data with the specified KMS key.", + "input": { + "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "GranteePrincipal": "arn:aws:iam::111122223333:role/ExampleRole", + "Operations": [ + "Encrypt", + "Decrypt" + ] + }, + "output": { + "GrantToken": "AQpAM2RhZTk1MGMyNTk2ZmZmMzEyYWVhOWViN2I1MWM4Mzc0MWFiYjc0ZDE1ODkyNGFlNTIzODZhMzgyZjBlNGY3NiKIAgEBAgB4Pa6VDCWW__MSrqnre1HIN0Grt00ViSSuUjhqOC8OT3YAAADfMIHcBgkqhkiG9w0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqLyBTAegIn9XlK5AgEQgIGXZQjkBcl1dykDdqZBUQ6L1OfUivQy7JVYO2-ZJP7m6f1g8GzV47HX5phdtONAP7K_HQIflcgpkoCqd_fUnE114mSmiagWkbQ5sqAVV3ov-VeqgrvMe5ZFEWLMSluvBAqdjHEdMIkHMlhlj4ENZbzBfo9Wxk8b8SnwP4kc4gGivedzFXo-dwN8fxjjq_ZZ9JFOj2ijIbj5FyogDCN0drOfi8RORSEuCEmPvjFRMFAwcmwFkN2NPp89amA", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#CreateGrantRequest": { @@ -779,7 +847,7 @@ "GranteePrincipal": { "target": "com.amazonaws.kms#PrincipalIdType", "traits": { - "smithy.api#documentation": "

The identity that gets the permissions specified in the grant.

\n

To specify the grantee principal, use the Amazon Resource Name (ARN) of an\n Amazon Web Services principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\n federated users, and assumed role users. For help with the ARN syntax for a principal, see\n IAM ARNs in the \n Identity and Access Management User Guide\n .

", + "smithy.api#documentation": "

The identity that gets the permissions specified in the grant.

\n

To specify the grantee principal, use the Amazon Resource Name (ARN) of an Amazon Web Services\n principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\n federated users, and assumed role users. For help with the ARN syntax for a principal, see\n IAM ARNs in the \n Identity and Access Management User Guide\n .

", "smithy.api#required": {} } }, @@ -813,6 +881,12 @@ "traits": { "smithy.api#documentation": "

A friendly name for the grant. Use this value to prevent the unintended creation of\n duplicate grants when retrying this request.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

When this value is absent, all CreateGrant requests result in a new grant\n with a unique GrantId even if all the supplied parameters are identical. This can\n result in unintended duplicates when you retry the CreateGrant request.

\n

When this value is present, you can retry a CreateGrant request with\n identical parameters; if the grant already exists, the original GrantId is\n returned without creating a new grant. Note that the returned grant token is unique with every\n CreateGrant request, even when a duplicate GrantId is returned.\n All grant tokens for the same grant ID can be used interchangeably.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -889,7 +963,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a unique customer managed KMS key in your Amazon Web Services account and Region.\n You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\n services let you use KMS keys that you create and manage to protect your service\n resources.

\n

A KMS key is a logical representation of a cryptographic key. In addition to the key\n material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\n key policy, creation date, description, and key state. For details, see Managing keys in the\n Key Management Service Developer Guide\n

\n

Use the parameters of CreateKey to specify the type of KMS key, the source of\n its key material, its key policy, description, tags, and other properties.

\n \n

KMS has replaced the term customer master key (CMK) with KMS key and KMS key. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.

\n
\n

To create different types of KMS keys, use the following guidance:

\n
\n
Symmetric encryption KMS key
\n
\n

By default, CreateKey creates a symmetric encryption KMS key with key\n material that KMS generates. This is the basic and most widely used type of KMS key, and\n provides the best performance.

\n

To create a symmetric encryption KMS key, you don't need to specify any parameters.\n The default value for KeySpec, SYMMETRIC_DEFAULT, the default\n value for KeyUsage, ENCRYPT_DECRYPT, and the default value for\n Origin, AWS_KMS, create a symmetric encryption KMS key with\n KMS key material.

\n

If you need a key for basic encryption and decryption or you are creating a KMS key\n to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\n The key material in a symmetric encryption key never leaves KMS unencrypted. You can\n use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\n they are typically used to generate data keys and data keys pairs. For details, see\n GenerateDataKey and GenerateDataKeyPair.

\n

\n
\n
Asymmetric KMS keys
\n
\n

To create an asymmetric KMS key, use the KeySpec parameter to specify\n the type of key material in the KMS key. Then, use the KeyUsage parameter\n to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\n You can't change these properties after the KMS key is created.

\n

Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, or an SM2 key pair (China Regions only). The private key in an asymmetric \n KMS key never leaves KMS unencrypted. However, you can use the GetPublicKey operation to download the public key\n so it can be used outside of KMS. KMS keys with RSA or SM2 key pairs can be used to encrypt or decrypt data or sign and verify messages (but not both). \n KMS keys with ECC key pairs can be used only to sign and verify messages. \n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

\n
\n
HMAC KMS key
\n
\n

To create an HMAC KMS key, set the KeySpec parameter to a key spec\n value for HMAC KMS keys. Then set the KeyUsage parameter to\n GENERATE_VERIFY_MAC. You must set the key usage even though\n GENERATE_VERIFY_MAC is the only valid key usage value for HMAC KMS keys.\n You can't change these properties after the KMS key is created.

\n

HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\n HMAC keys to generate (GenerateMac) and verify (VerifyMac) HMAC codes for messages up to 4096 bytes.

\n

\n
\n
Multi-Region primary keys
\n
Imported key material
\n
\n

To create a multi-Region primary key in the local Amazon Web Services Region,\n use the MultiRegion parameter with a value of True. To create\n a multi-Region replica key, that is, a KMS key with the same key ID\n and key material as a primary key, but in a different Amazon Web Services Region, use the ReplicateKey operation. To change a replica key to a primary key, and its\n primary key to a replica key, use the UpdatePrimaryRegion\n operation.

\n

You can create multi-Region KMS keys for all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't create multi-Region keys in a custom key store.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
\n

To import your own key material into a KMS key, begin by creating a KMS key with no\n key material. To do this, use the Origin parameter of\n CreateKey with a value of EXTERNAL. Next, use GetParametersForImport operation to get a public key and import token. Use\n the wrapping public key to encrypt your key material. Then, use ImportKeyMaterial with your import token to import the key material. For step-by-step instructions, see\n Importing Key Material in the \n Key Management Service Developer Guide\n .

\n

You can import key material into KMS keys of all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't import key material into a KMS key in a custom key store.

\n

To create a multi-Region primary key with imported key material, use the\n Origin parameter of CreateKey with a value of\n EXTERNAL and the MultiRegion parameter with a value of\n True. To create replicas of the multi-Region primary key, use the ReplicateKey operation. For instructions, see Importing key material into\n multi-Region keys. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
Custom key store
\n
\n

A custom key store lets you protect your Amazon Web Services resources using keys in a backing key\n store that you own and manage. When you request a cryptographic operation with a KMS key\n in a custom key store, the operation is performed in the backing key store using its\n cryptographic keys.

\n

KMS supports CloudHSM key stores backed by an CloudHSM cluster and external key stores backed by an\n external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\n KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\n key. When you create a KMS key in an external key store, you specify an existing\n encryption key in the external key manager.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n

Before you create a KMS key in a custom key store, the ConnectionState\n of the key store must be CONNECTED. To connect the custom key store, use\n the ConnectCustomKeyStore operation. To find the\n ConnectionState, use the DescribeCustomKeyStores\n operation.

\n

To create a KMS key in a custom key store, use the CustomKeyStoreId.\n Use the default KeySpec value, SYMMETRIC_DEFAULT, and the\n default KeyUsage value, ENCRYPT_DECRYPT to create a symmetric\n encryption key. No other key type is supported in a custom key store.

\n

To create a KMS key in an CloudHSM key store, use the\n Origin parameter with a value of AWS_CLOUDHSM. The CloudHSM\n cluster that is associated with the custom key store must have at least two active HSMs\n in different Availability Zones in the Amazon Web Services Region.

\n

To create a KMS key in an external key store, use the Origin parameter\n with a value of EXTERNAL_KEY_STORE and an XksKeyId parameter\n that identifies an existing external key.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n
\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateKey (IAM policy). To use the\n Tags parameter, kms:TagResource (IAM policy). For examples and information about related\n permissions, see Allow a user to create\n KMS keys in the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a unique customer managed KMS key in your Amazon Web Services account and Region.\n You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\n services let you use KMS keys that you create and manage to protect your service\n resources.

\n

A KMS key is a logical representation of a cryptographic key. In addition to the key\n material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\n key policy, creation date, description, and key state. For details, see Managing keys in the\n Key Management Service Developer Guide\n

\n

Use the parameters of CreateKey to specify the type of KMS key, the source of\n its key material, its key policy, description, tags, and other properties.

\n \n

KMS has replaced the term customer master key (CMK) with KMS key and KMS key. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.

\n
\n

To create different types of KMS keys, use the following guidance:

\n
\n
Symmetric encryption KMS key
\n
\n

By default, CreateKey creates a symmetric encryption KMS key with key\n material that KMS generates. This is the basic and most widely used type of KMS key, and\n provides the best performance.

\n

To create a symmetric encryption KMS key, you don't need to specify any parameters.\n The default value for KeySpec, SYMMETRIC_DEFAULT, the default\n value for KeyUsage, ENCRYPT_DECRYPT, and the default value for\n Origin, AWS_KMS, create a symmetric encryption KMS key with\n KMS key material.

\n

If you need a key for basic encryption and decryption or you are creating a KMS key\n to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\n The key material in a symmetric encryption key never leaves KMS unencrypted. You can\n use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\n they are typically used to generate data keys and data keys pairs. For details, see\n GenerateDataKey and GenerateDataKeyPair.

\n

\n
\n
Asymmetric KMS keys
\n
\n

To create an asymmetric KMS key, use the KeySpec parameter to specify\n the type of key material in the KMS key. Then, use the KeyUsage parameter\n to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\n You can't change these properties after the KMS key is created.

\n

Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, or an\n SM2 key pair (China Regions only). The private key in an asymmetric KMS key never leaves\n KMS unencrypted. However, you can use the GetPublicKey operation to\n download the public key so it can be used outside of KMS. KMS keys with RSA or SM2 key\n pairs can be used to encrypt or decrypt data or sign and verify messages (but not both).\n KMS keys with ECC key pairs can be used only to sign and verify messages. For\n information about asymmetric KMS keys, see Asymmetric KMS keys in the\n Key Management Service Developer Guide.

\n

\n
\n
HMAC KMS key
\n
\n

To create an HMAC KMS key, set the KeySpec parameter to a key spec\n value for HMAC KMS keys. Then set the KeyUsage parameter to\n GENERATE_VERIFY_MAC. You must set the key usage even though\n GENERATE_VERIFY_MAC is the only valid key usage value for HMAC KMS keys.\n You can't change these properties after the KMS key is created.

\n

HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\n HMAC keys to generate (GenerateMac) and verify (VerifyMac) HMAC codes for messages up to 4096 bytes.

\n

\n
\n
Multi-Region primary keys
\n
Imported key material
\n
\n

To create a multi-Region primary key in the local Amazon Web Services Region,\n use the MultiRegion parameter with a value of True. To create\n a multi-Region replica key, that is, a KMS key with the same key ID\n and key material as a primary key, but in a different Amazon Web Services Region, use the ReplicateKey operation. To change a replica key to a primary key, and its\n primary key to a replica key, use the UpdatePrimaryRegion\n operation.

\n

You can create multi-Region KMS keys for all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't create multi-Region keys in a custom key store.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
\n

To import your own key material into a KMS key, begin by creating a KMS key with no\n key material. To do this, use the Origin parameter of\n CreateKey with a value of EXTERNAL. Next, use GetParametersForImport operation to get a public key and import token. Use\n the wrapping public key to encrypt your key material. Then, use ImportKeyMaterial with your import token to import the key material. For\n step-by-step instructions, see Importing Key Material in the \n Key Management Service Developer Guide\n .

\n

You can import key material into KMS keys of all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't import key material into a KMS key in a custom key store.

\n

To create a multi-Region primary key with imported key material, use the\n Origin parameter of CreateKey with a value of\n EXTERNAL and the MultiRegion parameter with a value of\n True. To create replicas of the multi-Region primary key, use the ReplicateKey operation. For instructions, see Importing key material into\n multi-Region keys. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
Custom key store
\n
\n

A custom key store lets you protect your Amazon Web Services resources using keys in a backing key\n store that you own and manage. When you request a cryptographic operation with a KMS key\n in a custom key store, the operation is performed in the backing key store using its\n cryptographic keys.

\n

KMS supports CloudHSM key stores backed by an CloudHSM cluster and external key stores backed by an\n external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\n KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\n key. When you create a KMS key in an external key store, you specify an existing\n encryption key in the external key manager.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n

Before you create a KMS key in a custom key store, the ConnectionState\n of the key store must be CONNECTED. To connect the custom key store, use\n the ConnectCustomKeyStore operation. To find the\n ConnectionState, use the DescribeCustomKeyStores\n operation.

\n

To create a KMS key in a custom key store, use the CustomKeyStoreId.\n Use the default KeySpec value, SYMMETRIC_DEFAULT, and the\n default KeyUsage value, ENCRYPT_DECRYPT to create a symmetric\n encryption key. No other key type is supported in a custom key store.

\n

To create a KMS key in an CloudHSM key store, use the\n Origin parameter with a value of AWS_CLOUDHSM. The CloudHSM\n cluster that is associated with the custom key store must have at least two active HSMs\n in different Availability Zones in the Amazon Web Services Region.

\n

To create a KMS key in an external key store, use the\n Origin parameter with a value of EXTERNAL_KEY_STORE and an\n XksKeyId parameter that identifies an existing external key.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n
\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateKey (IAM policy). To use the\n Tags parameter, kms:TagResource (IAM policy). For examples and information about related\n permissions, see Allow a user to create\n KMS keys in the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#CreateKeyRequest": { @@ -904,13 +978,13 @@ "Description": { "target": "com.amazonaws.kms#DescriptionType", "traits": { - "smithy.api#documentation": "

A description of the KMS key. Use a description that helps you decide whether the KMS key is appropriate for a task. The\n default value is an empty string (no description).

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

To set or change the description after the key is created, use UpdateKeyDescription.

" + "smithy.api#documentation": "

A description of the KMS key. Use a description that helps you decide whether the KMS key\n is appropriate for a task. The default value is an empty string (no description).

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

To set or change the description after the key is created, use UpdateKeyDescription.

" } }, "KeyUsage": { "target": "com.amazonaws.kms#KeyUsageType", "traits": { - "smithy.api#documentation": "

Determines the cryptographic operations for which you can use the KMS key. The default value is\n ENCRYPT_DECRYPT. This parameter is optional when you are creating a symmetric\n encryption KMS key; otherwise, it is required. You can't change the KeyUsage\n value after the KMS key is created.

\n

Select only one valid value.

\n
    \n
  • \n

    For symmetric encryption KMS keys, omit the parameter or specify\n ENCRYPT_DECRYPT.

    \n
  • \n
  • \n

    For HMAC KMS keys (symmetric), specify GENERATE_VERIFY_MAC.

    \n
  • \n
  • \n

    For asymmetric KMS keys with RSA key material, specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with ECC key material, specify\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with SM2 key material (China Regions only), specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
" + "smithy.api#documentation": "

Determines the cryptographic operations for which you can use the KMS key. The default value is\n ENCRYPT_DECRYPT. This parameter is optional when you are creating a symmetric\n encryption KMS key; otherwise, it is required. You can't change the KeyUsage\n value after the KMS key is created.

\n

Select only one valid value.

\n
    \n
  • \n

    For symmetric encryption KMS keys, omit the parameter or specify\n ENCRYPT_DECRYPT.

    \n
  • \n
  • \n

    For HMAC KMS keys (symmetric), specify GENERATE_VERIFY_MAC.

    \n
  • \n
  • \n

    For asymmetric KMS keys with RSA key material, specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with ECC key material, specify\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with SM2 key material (China Regions only), specify\n ENCRYPT_DECRYPT or SIGN_VERIFY.

    \n
  • \n
" } }, "CustomerMasterKeySpec": { @@ -925,19 +999,19 @@ "KeySpec": { "target": "com.amazonaws.kms#KeySpec", "traits": { - "smithy.api#documentation": "

Specifies the type of KMS key to create. The default value,\n SYMMETRIC_DEFAULT, creates a KMS key with a 256-bit AES-GCM key that is used for encryption and decryption, except in China Regions, \n where it creates a 128-bit symmetric key that uses SM4 encryption. For help choosing a key spec for your KMS key, see Choosing a KMS key type in the \n Key Management Service Developer Guide\n .

\n

The KeySpec determines whether the KMS key contains a symmetric key or an\n asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\n change the KeySpec after the KMS key is created. To further restrict the\n algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\n policy. For more information, see kms:EncryptionAlgorithm, kms:MacAlgorithm or kms:Signing Algorithm in the \n Key Management Service Developer Guide\n .

\n \n

\n Amazon Web Services services that\n are integrated with KMS use symmetric encryption KMS keys to protect your data.\n These services do not support asymmetric KMS keys or HMAC KMS keys.

\n
\n

KMS supports the following key specs for KMS keys:

\n
    \n
  • \n

    Symmetric encryption key (default)

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT\n

      \n
    • \n
    \n
  • \n
  • \n

    HMAC keys (symmetric)

    \n
      \n
    • \n

      \n HMAC_224\n

      \n
    • \n
    • \n

      \n HMAC_256\n

      \n
    • \n
    • \n

      \n HMAC_384\n

      \n
    • \n
    • \n

      \n HMAC_512\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric RSA key pairs

    \n
      \n
    • \n

      \n RSA_2048\n

      \n
    • \n
    • \n

      \n RSA_3072\n

      \n
    • \n
    • \n

      \n RSA_4096\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric NIST-recommended elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_NIST_P256 (secp256r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P384 (secp384r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P521 (secp521r1)

      \n
    • \n
    \n
  • \n
  • \n

    Other asymmetric elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_SECG_P256K1 (secp256k1), commonly used for\n cryptocurrencies.

      \n
    • \n
    \n
  • \n
  • \n

    SM2 key pairs (China Regions only)

    \n
      \n
    • \n

      \n SM2\n

      \n
    • \n
    \n
  • \n
" + "smithy.api#documentation": "

Specifies the type of KMS key to create. The default value,\n SYMMETRIC_DEFAULT, creates a KMS key with a 256-bit AES-GCM key that is used for\n encryption and decryption, except in China Regions, where it creates a 128-bit symmetric key\n that uses SM4 encryption. For help choosing a key spec for your KMS key, see Choosing a KMS key type in the \n Key Management Service Developer Guide\n .

\n

The KeySpec determines whether the KMS key contains a symmetric key or an\n asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\n change the KeySpec after the KMS key is created. To further restrict the\n algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\n policy. For more information, see kms:EncryptionAlgorithm, kms:MacAlgorithm or kms:Signing Algorithm in the \n Key Management Service Developer Guide\n .

\n \n

\n Amazon Web Services services that\n are integrated with KMS use symmetric encryption KMS keys to protect your data.\n These services do not support asymmetric KMS keys or HMAC KMS keys.

\n
\n

KMS supports the following key specs for KMS keys:

\n
    \n
  • \n

    Symmetric encryption key (default)

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT\n

      \n
    • \n
    \n
  • \n
  • \n

    HMAC keys (symmetric)

    \n
      \n
    • \n

      \n HMAC_224\n

      \n
    • \n
    • \n

      \n HMAC_256\n

      \n
    • \n
    • \n

      \n HMAC_384\n

      \n
    • \n
    • \n

      \n HMAC_512\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric RSA key pairs

    \n
      \n
    • \n

      \n RSA_2048\n

      \n
    • \n
    • \n

      \n RSA_3072\n

      \n
    • \n
    • \n

      \n RSA_4096\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric NIST-recommended elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_NIST_P256 (secp256r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P384 (secp384r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P521 (secp521r1)

      \n
    • \n
    \n
  • \n
  • \n

    Other asymmetric elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_SECG_P256K1 (secp256k1), commonly used for\n cryptocurrencies.

      \n
    • \n
    \n
  • \n
  • \n

    SM2 key pairs (China Regions only)

    \n
      \n
    • \n

      \n SM2\n

      \n
    • \n
    \n
  • \n
" } }, "Origin": { "target": "com.amazonaws.kms#OriginType", "traits": { - "smithy.api#documentation": "

The source of the key material for the KMS key. You cannot change the origin after you\n create the KMS key. The default is AWS_KMS, which means that KMS creates the\n key material.

\n

To create a\n KMS key with no key material (for imported key material), set this value to\n EXTERNAL. For more information about importing key material into KMS, see\n Importing Key\n Material in the Key Management Service Developer Guide. The EXTERNAL origin value is valid\n only for symmetric KMS keys.

\n

To create a KMS key in an CloudHSM key store and create its key\n material in the associated CloudHSM cluster, set this value to AWS_CLOUDHSM. You\n must also use the CustomKeyStoreId parameter to identify the CloudHSM key store. The\n KeySpec value must be SYMMETRIC_DEFAULT.

\n

To create a KMS key in\n an external key store, set this value to EXTERNAL_KEY_STORE. You must\n also use the CustomKeyStoreId parameter to identify the external key store and\n the XksKeyId parameter to identify the associated external key. The\n KeySpec value must be SYMMETRIC_DEFAULT.

" + "smithy.api#documentation": "

The source of the key material for the KMS key. You cannot change the origin after you\n create the KMS key. The default is AWS_KMS, which means that KMS creates the\n key material.

\n

To create a\n KMS key with no key material (for imported key material), set this value to\n EXTERNAL. For more information about importing key material into KMS, see\n Importing Key\n Material in the Key Management Service Developer Guide. The EXTERNAL origin value is valid\n only for symmetric KMS keys.

\n

To create a KMS\n key in an CloudHSM key store and create its key material in the associated CloudHSM\n cluster, set this value to AWS_CLOUDHSM. You must also use the\n CustomKeyStoreId parameter to identify the CloudHSM key store. The\n KeySpec value must be SYMMETRIC_DEFAULT.

\n

To create a KMS key in\n an external key store, set this value to EXTERNAL_KEY_STORE. You must\n also use the CustomKeyStoreId parameter to identify the external key store and\n the XksKeyId parameter to identify the associated external key. The\n KeySpec value must be SYMMETRIC_DEFAULT.

" } }, "CustomKeyStoreId": { "target": "com.amazonaws.kms#CustomKeyStoreIdType", "traits": { - "smithy.api#documentation": "

Creates the KMS key in the specified custom key store. The ConnectionState of\n the custom key store must be CONNECTED. To find the CustomKeyStoreID and\n ConnectionState use the DescribeCustomKeyStores operation.

\n

This parameter is valid only for symmetric encryption KMS keys in a single Region. You\n cannot create any other type of KMS key in a custom key store.

\n

When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\n symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\n create a KMS key in an external key store, you must use the XksKeyId parameter to specify an\n external key that serves as key material for the KMS key.

" + "smithy.api#documentation": "

Creates the KMS key in the specified custom key store. The ConnectionState of\n the custom key store must be CONNECTED. To find the CustomKeyStoreID and\n ConnectionState use the DescribeCustomKeyStores operation.

\n

This parameter is valid only for symmetric encryption KMS keys in a single Region. You\n cannot create any other type of KMS key in a custom key store.

\n

When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\n symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\n create a KMS key in an external key store, you must use the XksKeyId parameter to\n specify an external key that serves as key material for the KMS key.

" } }, "BypassPolicyLockoutSafetyCheck": { @@ -1129,7 +1203,7 @@ "ConnectionErrorCode": { "target": "com.amazonaws.kms#ConnectionErrorCodeType", "traits": { - "smithy.api#documentation": "

Describes the connection error. This field appears in the response only when the\n ConnectionState is FAILED.

\n

Many failures can be resolved by updating the properties of the custom key store. To\n update a custom key store, disconnect it (DisconnectCustomKeyStore), correct\n the errors (UpdateCustomKeyStore), and try to connect again (ConnectCustomKeyStore). For additional help resolving these errors, see How to Fix a\n Connection Failure in Key Management Service Developer Guide.

\n

\n All custom key stores:\n

\n
    \n
  • \n

    \n INTERNAL_ERROR — KMS could not complete the request due to an\n internal error. Retry the request. For ConnectCustomKeyStore requests,\n disconnect the custom key store before trying to connect again.

    \n
  • \n
  • \n

    \n NETWORK_ERRORS — Network errors are preventing KMS from\n connecting the custom key store to its backing key store.

    \n
  • \n
\n

\n CloudHSM key stores:\n

\n
    \n
  • \n

    \n CLUSTER_NOT_FOUND — KMS cannot find the CloudHSM cluster with the\n specified cluster ID.

    \n
  • \n
  • \n

    \n INSUFFICIENT_CLOUDHSM_HSMS — The associated CloudHSM cluster does not\n contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\n must contain at least one active HSM.

    \n
  • \n
  • \n

    \n INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET — At least one private subnet\n associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM key\n store connection requires one free IP address in each of the associated private subnets,\n although two are preferable. For details, see How to Fix a Connection\n Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n INVALID_CREDENTIALS — The KeyStorePassword for the\n custom key store doesn't match the current password of the kmsuser crypto\n user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\n cluster, you must change the kmsuser account password and update the\n KeyStorePassword value for the custom key store.

    \n
  • \n
  • \n

    \n SUBNET_NOT_FOUND — A subnet in the CloudHSM cluster configuration was\n deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\n connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\n cluster from a recent backup and associate it with your custom key store. (This process\n creates a new cluster configuration with a VPC and private subnets.) For details, see\n How\n to Fix a Connection Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_LOCKED_OUT — The kmsuser CU account is locked\n out of the associated CloudHSM cluster due to too many failed password attempts. Before you\n can connect your custom key store to its CloudHSM cluster, you must change the\n kmsuser account password and update the key store password value for the\n custom key store.

    \n
  • \n
  • \n

    \n USER_LOGGED_IN — The kmsuser CU account is logged\n into the associated CloudHSM cluster. This prevents KMS from rotating the\n kmsuser account password and logging into the cluster. Before you can\n connect your custom key store to its CloudHSM cluster, you must log the kmsuser\n CU out of the cluster. If you changed the kmsuser password to log into the\n cluster, you must also and update the key store password value for the custom key store.\n For help, see How to Log Out and\n Reconnect in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_NOT_FOUND — KMS cannot find a kmsuser CU\n account in the associated CloudHSM cluster. Before you can connect your custom key store to\n its CloudHSM cluster, you must create a kmsuser CU account in the cluster, and\n then update the key store password value for the custom key store.

    \n
  • \n
\n

\n External key stores:\n

\n
    \n
  • \n

    \n INVALID_CREDENTIALS — One or both of the\n XksProxyAuthenticationCredential values is not valid on the specified\n external key store proxy.

    \n
  • \n
  • \n

    \n XKS_PROXY_ACCESS_DENIED — KMS requests are denied access to the\n external key store proxy. If the external key store proxy has authorization rules, verify\n that they permit KMS to communicate with the proxy on your behalf.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_CONFIGURATION — A configuration error is\n preventing the external key store from connecting to its proxy. Verify the value of the\n XksProxyUriPath.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_RESPONSE — KMS cannot interpret the response\n from the external key store proxy. If you see this connection error code repeatedly,\n notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_TLS_CONFIGURATION — KMS cannot connect to the\n external key store proxy because the TLS configuration is invalid. Verify that the XKS\n proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\n that it matches the hostname in the XksProxyUriEndpoint value, and that it is\n signed by a certificate authority included in the Trusted Certificate Authorities\n list.

    \n
  • \n
  • \n

    \n XKS_PROXY_NOT_REACHABLE — KMS can't communicate with your\n external key store proxy. Verify that the XksProxyUriEndpoint and\n XksProxyUriPath are correct. Use the tools for your external key store\n proxy to verify that the proxy is active and available on its network. Also, verify that\n your external key manager instances are operating properly. Connection attempts fail with\n this connection error code if the proxy reports that all external key manager instances\n are unavailable.

    \n
  • \n
  • \n

    \n XKS_PROXY_TIMED_OUT — KMS can connect to the external key store\n proxy, but the proxy does not respond to KMS in the time allotted. If you see this\n connection error code repeatedly, notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION — The Amazon VPC\n endpoint service configuration doesn't conform to the requirements for an KMS external\n key store.

    \n
      \n
    • \n

      The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.

      \n
    • \n
    • \n

      It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.

      \n
    • \n
    • \n

      The Allow principals list must include \n\t the KMS service principal for the Region, cks.kms..amazonaws.com, \n\t such as cks.kms.us-east-1.amazonaws.com.

      \n
    • \n
    • \n

      It must not require acceptance of connection requests.

      \n
    • \n
    • \n

      It must have a private DNS name. The private DNS name for an external key store with VPC_ENDPOINT_SERVICE connectivity\n\t must be unique in its Amazon Web Services Region.

      \n
    • \n
    • \n

      The domain of the private DNS name must have a verification status of\n\t verified.

      \n
    • \n
    • \n

      The TLS certificate specifies the private DNS hostname at which the endpoint is reachable.

      \n
    • \n
    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND — KMS can't find the VPC\n endpoint service that it uses to communicate with the external key store proxy. Verify\n that the XksProxyVpcEndpointServiceName is correct and the KMS service\n principal has service consumer permissions on the Amazon VPC endpoint service.

    \n
  • \n
" + "smithy.api#documentation": "

Describes the connection error. This field appears in the response only when the\n ConnectionState is FAILED.

\n

Many failures can be resolved by updating the properties of the custom key store. To\n update a custom key store, disconnect it (DisconnectCustomKeyStore), correct\n the errors (UpdateCustomKeyStore), and try to connect again (ConnectCustomKeyStore). For additional help resolving these errors, see How to Fix a\n Connection Failure in Key Management Service Developer Guide.

\n

\n All custom key stores:\n

\n
    \n
  • \n

    \n INTERNAL_ERROR — KMS could not complete the request due to an\n internal error. Retry the request. For ConnectCustomKeyStore requests,\n disconnect the custom key store before trying to connect again.

    \n
  • \n
  • \n

    \n NETWORK_ERRORS — Network errors are preventing KMS from\n connecting the custom key store to its backing key store.

    \n
  • \n
\n

\n CloudHSM key stores:\n

\n
    \n
  • \n

    \n CLUSTER_NOT_FOUND — KMS cannot find the CloudHSM cluster with the\n specified cluster ID.

    \n
  • \n
  • \n

    \n INSUFFICIENT_CLOUDHSM_HSMS — The associated CloudHSM cluster does not\n contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\n must contain at least one active HSM.

    \n
  • \n
  • \n

    \n INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET — At least one private\n subnet associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM\n key store connection requires one free IP address in each of the associated private\n subnets, although two are preferable. For details, see How to Fix a Connection\n Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n INVALID_CREDENTIALS — The KeyStorePassword for the\n custom key store doesn't match the current password of the kmsuser crypto\n user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\n cluster, you must change the kmsuser account password and update the\n KeyStorePassword value for the custom key store.

    \n
  • \n
  • \n

    \n SUBNET_NOT_FOUND — A subnet in the CloudHSM cluster configuration was\n deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\n connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\n cluster from a recent backup and associate it with your custom key store. (This process\n creates a new cluster configuration with a VPC and private subnets.) For details, see\n How\n to Fix a Connection Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_LOCKED_OUT — The kmsuser CU account is locked\n out of the associated CloudHSM cluster due to too many failed password attempts. Before you\n can connect your custom key store to its CloudHSM cluster, you must change the\n kmsuser account password and update the key store password value for the\n custom key store.

    \n
  • \n
  • \n

    \n USER_LOGGED_IN — The kmsuser CU account is logged\n into the associated CloudHSM cluster. This prevents KMS from rotating the\n kmsuser account password and logging into the cluster. Before you can\n connect your custom key store to its CloudHSM cluster, you must log the kmsuser\n CU out of the cluster. If you changed the kmsuser password to log into the\n cluster, you must also and update the key store password value for the custom key store.\n For help, see How to Log Out and\n Reconnect in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_NOT_FOUND — KMS cannot find a kmsuser CU\n account in the associated CloudHSM cluster. Before you can connect your custom key store to\n its CloudHSM cluster, you must create a kmsuser CU account in the cluster, and\n then update the key store password value for the custom key store.

    \n
  • \n
\n

\n External key stores:\n

\n
    \n
  • \n

    \n INVALID_CREDENTIALS — One or both of the\n XksProxyAuthenticationCredential values is not valid on the specified\n external key store proxy.

    \n
  • \n
  • \n

    \n XKS_PROXY_ACCESS_DENIED — KMS requests are denied access to the\n external key store proxy. If the external key store proxy has authorization rules, verify\n that they permit KMS to communicate with the proxy on your behalf.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_CONFIGURATION — A configuration error is\n preventing the external key store from connecting to its proxy. Verify the value of the\n XksProxyUriPath.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_RESPONSE — KMS cannot interpret the response\n from the external key store proxy. If you see this connection error code repeatedly,\n notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_TLS_CONFIGURATION — KMS cannot connect to the\n external key store proxy because the TLS configuration is invalid. Verify that the XKS\n proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\n that it matches the hostname in the XksProxyUriEndpoint value, and that it is\n signed by a certificate authority included in the Trusted Certificate Authorities list.

    \n
  • \n
  • \n

    \n XKS_PROXY_NOT_REACHABLE — KMS can't communicate with your\n external key store proxy. Verify that the XksProxyUriEndpoint and\n XksProxyUriPath are correct. Use the tools for your external key store\n proxy to verify that the proxy is active and available on its network. Also, verify that\n your external key manager instances are operating properly. Connection attempts fail with\n this connection error code if the proxy reports that all external key manager instances\n are unavailable.

    \n
  • \n
  • \n

    \n XKS_PROXY_TIMED_OUT — KMS can connect to the external key store\n proxy, but the proxy does not respond to KMS in the time allotted. If you see this\n connection error code repeatedly, notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION — The Amazon VPC\n endpoint service configuration doesn't conform to the requirements for an KMS external\n key store.

    \n
      \n
    • \n

      The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.

      \n
    • \n
    • \n

      It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.

      \n
    • \n
    • \n

      The Allow principals list must include \n\t the KMS service principal for the Region, cks.kms..amazonaws.com, \n\t such as cks.kms.us-east-1.amazonaws.com.

      \n
    • \n
    • \n

      It must not require acceptance of connection requests.

      \n
    • \n
    • \n

      It must have a private DNS name. The private DNS name for an external key store with VPC_ENDPOINT_SERVICE connectivity\n\t must be unique in its Amazon Web Services Region.

      \n
    • \n
    • \n

      The domain of the private DNS name must have a verification status of\n\t verified.

      \n
    • \n
    • \n

      The TLS certificate specifies the private DNS hostname at which the endpoint is reachable.

      \n
    • \n
    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND — KMS can't find the VPC\n endpoint service that it uses to communicate with the external key store proxy. Verify\n that the XksProxyVpcEndpointServiceName is correct and the KMS service\n principal has service consumer permissions on the Amazon VPC endpoint service.

    \n
  • \n
" } }, "CreationDate": { @@ -1331,6 +1405,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#IncorrectKeyException" }, @@ -1357,7 +1434,22 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To decrypt data with a symmetric encryption KMS key", + "documentation": "The following example decrypts data that was encrypted with a symmetric encryption KMS key. The KeyId is not required when decrypting with a symmetric encryption key, but it is a best practice.", + "input": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "Plaintext": "", + "EncryptionAlgorithm": "SYMMETRIC_DEFAULT" + } + } + ] } }, "com.amazonaws.kms#DecryptRequest": { @@ -1397,7 +1489,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data, KMS encrypts the\n plaintext data with the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data, KMS encrypts the\n plaintext data with the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -1417,7 +1515,7 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "EncryptionAlgorithm": { @@ -1460,7 +1558,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified alias.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Because an alias is not a property of a KMS key, you can delete and change the aliases of\n a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\n DescribeKey operation. To get the aliases of all KMS keys, use the ListAliases operation.

\n

Each KMS key can have multiple aliases. To change the alias of a KMS key, use DeleteAlias to delete the current alias and CreateAlias to\n create a new alias. To associate an existing alias with a different KMS key, call UpdateAlias.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes the specified alias.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Because an alias is not a property of a KMS key, you can delete and change the aliases of\n a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\n DescribeKey operation. To get the aliases of all KMS keys, use the ListAliases operation.

\n

Each KMS key can have multiple aliases. To change the alias of a KMS key, use DeleteAlias to delete the current alias and CreateAlias to\n create a new alias. To associate an existing alias with a different KMS key, call UpdateAlias.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete an alias", + "documentation": "The following example deletes the specified alias.", + "input": { + "AliasName": "alias/ExampleAlias" + } + } + ] } }, "com.amazonaws.kms#DeleteAliasRequest": { @@ -1501,7 +1608,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a custom key store. This operation does not affect any backing elements of the\n custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\n store, or affect any users or keys in the cluster. For an external key store, it does not\n affect the external key store proxy, external key manager, or any external keys.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The custom key store that you delete cannot contain any KMS keys. Before deleting the key store,\n verify that you will never need to use any of the KMS keys in the key store for any\n cryptographic operations. Then, use ScheduleKeyDeletion to delete the KMS keys from the\n key store. After the required waiting period expires and all KMS keys are deleted from the\n custom key store, use DisconnectCustomKeyStore to disconnect the key store\n from KMS. Then, you can delete the custom key store.

\n

For keys in an CloudHSM key store, the ScheduleKeyDeletion operation makes a\n best effort to delete the key material from the associated cluster. However, you might need to\n manually delete the orphaned key\n material from the cluster and its backups. KMS never creates, manages, or deletes\n cryptographic keys in the external key manager associated with an external key store. You must\n manage them using your external key manager tools.

\n

Instead of deleting the custom key store, consider using the DisconnectCustomKeyStore operation to disconnect the custom key store from its\n backing key store. While the key store is disconnected, you cannot create or use the KMS keys\n in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\n custom key store at any time.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes a custom key store. This operation does not affect any backing elements of the\n custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\n store, or affect any users or keys in the cluster. For an external key store, it does not\n affect the external key store proxy, external key manager, or any external keys.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The custom key store that you delete cannot contain any KMS keys. Before deleting the key store,\n verify that you will never need to use any of the KMS keys in the key store for any\n cryptographic operations. Then, use ScheduleKeyDeletion to delete the KMS keys from the\n key store. After the required waiting period expires and all KMS keys are deleted from the\n custom key store, use DisconnectCustomKeyStore to disconnect the key store\n from KMS. Then, you can delete the custom key store.

\n

For keys in an CloudHSM key store, the ScheduleKeyDeletion operation makes a\n best effort to delete the key material from the associated cluster. However, you might need to\n manually delete the orphaned key\n material from the cluster and its backups. KMS never creates, manages, or deletes\n cryptographic keys in the external key manager associated with an external key store. You must\n manage them using your external key manager tools.

\n

Instead of deleting the custom key store, consider using the DisconnectCustomKeyStore operation to disconnect the custom key store from its\n backing key store. While the key store is disconnected, you cannot create or use the KMS keys\n in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\n custom key store at any time.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete a custom key store from AWS KMS", + "documentation": "This example deletes a custom key store from AWS KMS. This operation does not affect the backing key store, such as a CloudHSM cluster, external key store proxy, or your external key manager. This operation doesn't return any data. To verify that the operation was successful, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#DeleteCustomKeyStoreRequest": { @@ -1555,7 +1672,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes key material that was previously imported. This operation makes the specified KMS\n key temporarily unusable. To restore the usability of the KMS key, reimport the same key\n material. For more information about importing key material into KMS, see Importing Key Material\n in the Key Management Service Developer Guide.

\n

When the specified KMS key is in the PendingDeletion state, this operation\n does not change the KMS key's state. Otherwise, it changes the KMS key's state to\n PendingImport.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteImportedKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes key material that was previously imported. This operation makes the specified KMS\n key temporarily unusable. To restore the usability of the KMS key, reimport the same key\n material. For more information about importing key material into KMS, see Importing Key Material\n in the Key Management Service Developer Guide.

\n

When the specified KMS key is in the PendingDeletion state, this operation\n does not change the KMS key's state. Otherwise, it changes the KMS key's state to\n PendingImport.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteImportedKeyMaterial (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete imported key material", + "documentation": "The following example deletes the imported key material from the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DeleteImportedKeyMaterialRequest": { @@ -1610,7 +1736,16 @@ } ], "traits": { - "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores. Both\n topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores.\n Both topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To get detailed information about custom key stores in the account and Region", + "documentation": "This example gets detailed information about all AWS KMS custom key stores in an AWS account and Region. To get all key stores, do not enter a custom key store name or ID.", + "output": { + "CustomKeyStores": [] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -1774,7 +1909,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\n key for cryptographic operations.

\n

For more information about how key state affects the use of a KMS key, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKey (key policy)

\n

\n Related operations: EnableKey\n

" + "smithy.api#documentation": "

Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\n key for cryptographic operations.

\n

For more information about how key state affects the use of a KMS key, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKey (key policy)

\n

\n Related operations: EnableKey\n

", + "smithy.api#examples": [ + { + "title": "To disable a KMS key", + "documentation": "The following example disables the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DisableKeyRequest": { @@ -1824,7 +1968,16 @@ } ], "traits": { - "smithy.api#documentation": "

Disables automatic\n rotation of the key material of the specified symmetric encryption KMS key.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You can enable (EnableKeyRotation) and disable automatic rotation of the\n key material in customer managed KMS keys. Key material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material for every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKeyRotation (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Disables automatic\n rotation of the key material of the specified symmetric encryption KMS key.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You can enable (EnableKeyRotation) and disable automatic rotation of the\n key material in customer managed KMS keys. Key material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material for every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKeyRotation (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To disable automatic rotation of key material", + "documentation": "The following example disables automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DisableKeyRotationRequest": { @@ -1879,7 +2032,17 @@ } ], "traits": { - "smithy.api#documentation": "

Disconnects the custom key store from its backing key store. This operation disconnects an\n CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\n the external key store proxy that communicates with your external key manager.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

While a custom key store is disconnected, you can manage the custom key store and its KMS\n keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\n time.

\n \n

While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in cryptographic operations will\n fail. This action can prevent users from storing and accessing sensitive data.

\n
\n

When you disconnect a custom key store, its ConnectionState changes to\n Disconnected. To find the connection state of a custom key store, use the DescribeCustomKeyStores operation. To reconnect a custom key store, use the\n ConnectCustomKeyStore operation.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisconnectCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Disconnects the custom key store from its backing key store. This operation disconnects an\n CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\n the external key store proxy that communicates with your external key manager.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

While a custom key store is disconnected, you can manage the custom key store and its KMS\n keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\n time.

\n \n

While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in cryptographic operations will\n fail. This action can prevent users from storing and accessing sensitive data.

\n
\n

When you disconnect a custom key store, its ConnectionState changes to\n Disconnected. To find the connection state of a custom key store, use the DescribeCustomKeyStores operation. To reconnect a custom key store, use the\n ConnectCustomKeyStore operation.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisconnectCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To disconnect a custom key store from its CloudHSM cluster", + "documentation": "This example disconnects an AWS KMS custom key store from its backing key store. For an AWS CloudHSM key store, it disconnects the key store from its AWS CloudHSM cluster. For an external key store, it disconnects the key store from the external key store proxy that communicates with your external key manager. This operation doesn't return any data. To verify that the custom key store is disconnected, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#DisconnectCustomKeyStoreRequest": { @@ -1904,6 +2067,23 @@ "smithy.api#output": {} } }, + "com.amazonaws.kms#DryRunOperationException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.kms#ErrorMessageType" + } + }, + "traits": { + "aws.protocols#awsQueryError": { + "code": "DryRunOperation", + "httpResponseCode": 412 + }, + "smithy.api#documentation": "

\n The request was rejected because the DryRun parameter was specified.\n

", + "smithy.api#error": "client", + "smithy.api#httpError": 412 + } + }, "com.amazonaws.kms#EnableKey": { "type": "operation", "input": { @@ -1933,7 +2113,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\n cryptographic operations.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKey (key policy)

\n

\n Related operations: DisableKey\n

" + "smithy.api#documentation": "

Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\n cryptographic operations.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKey (key policy)

\n

\n Related operations: DisableKey\n

", + "smithy.api#examples": [ + { + "title": "To enable a KMS key", + "documentation": "The following example enables the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#EnableKeyRequest": { @@ -1983,7 +2172,16 @@ } ], "traits": { - "smithy.api#documentation": "

Enables automatic rotation\n of the key material of the specified symmetric encryption KMS key.

\n

When you enable automatic rotation of acustomer managed KMS key, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer\n managed KMS key, use the DisableKeyRotation operation.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You cannot enable or disable automatic rotation Amazon Web Services managed KMS keys. KMS\n always rotates the key material of Amazon Web Services managed keys every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years (approximately 1,095 days) to every year (approximately 365 days).

\n

New Amazon Web Services managed keys are automatically rotated one year after they are created, and\n approximately every year thereafter.

\n

Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\n rotation, and every year thereafter.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKeyRotation (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Enables automatic rotation\n of the key material of the specified symmetric encryption KMS key.

\n

When you enable automatic rotation of acustomer managed KMS key, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer\n managed KMS key, use the DisableKeyRotation operation.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You cannot enable or disable automatic rotation Amazon Web Services managed KMS keys. KMS\n always rotates the key material of Amazon Web Services managed keys every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years (approximately 1,095 days) to every year (approximately 365 days).

\n

New Amazon Web Services managed keys are automatically rotated one year after they are created, and\n approximately every year thereafter.

\n

Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\n rotation, and every year thereafter.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKeyRotation (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To enable automatic rotation of key material", + "documentation": "The following example enables automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#EnableKeyRotationRequest": { @@ -2016,6 +2214,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2036,7 +2237,22 @@ } ], "traits": { - "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes.\n To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To encrypt data with a symmetric encryption KMS key", + "documentation": "The following example encrypts data with the specified symmetric encryption KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Plaintext": "" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "EncryptionAlgorithm": "SYMMETRIC_DEFAULT" + } + } + ] } }, "com.amazonaws.kms#EncryptRequest": { @@ -2071,7 +2287,13 @@ "EncryptionAlgorithm": { "target": "com.amazonaws.kms#EncryptionAlgorithmSpec", "traits": { - "smithy.api#documentation": "

Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\n The algorithm must be compatible with the KMS key that you specify.

\n

This parameter is required only for asymmetric KMS keys. The default value,\n SYMMETRIC_DEFAULT, is the algorithm used for symmetric encryption KMS keys. If you are\n using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.

\n

The SM2PKE algorithm is only available in China Regions.

" + "smithy.api#documentation": "

Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\n The algorithm must be compatible with the KMS key that you specify.

\n

This parameter is required only for asymmetric KMS keys. The default value,\n SYMMETRIC_DEFAULT, is the algorithm used for symmetric encryption KMS keys. If\n you are using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.

\n

The SM2PKE algorithm is only available in China Regions.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2207,6 +2429,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2227,7 +2452,22 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related \n to the caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS \n and store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or \n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use \n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or a NumberOfBytes value of 16. The symmetric \n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related to the\n caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS and\n store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec\n value of AES_128 or a NumberOfBytes value of 16. The\n symmetric encryption key used in China Regions to encrypt your data key is an SM4 encryption\n key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate a data key", + "documentation": "The following example generates a 256-bit symmetric data encryption key (data key) in two formats. One is the unencrypted (plainext) data key, and the other is the data key encrypted with the specified KMS key.", + "input": { + "KeyId": "alias/ExampleAlias", + "KeySpec": "AES_256" + }, + "output": { + "CiphertextBlob": "", + "Plaintext": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPair": { @@ -2245,6 +2485,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2268,7 +2511,24 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that you use\n ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or signing, but not both.\n However, KMS cannot enforce any restrictions on the use of data key pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKeyPair returns the public data key and a\n copy of the private data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the private data key (PrivateKeyPlaintext), the response includes a copy of the private data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services\n Nitro enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient\n parameter to provide the attestation document for the enclave.\n GenerateDataKeyPair returns the public data key and a copy of the private data\n key encrypted under the specified KMS key, as usual. But instead of a plaintext copy of the\n private data key (PrivateKeyPlaintext), the response includes a copy of the\n private data key encrypted under the public key from the attestation document\n (CiphertextForRecipient). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an RSA key pair for encryption and decryption", + "documentation": "This example generates an RSA data key pair for encryption and decryption. The operation returns a plaintext public key and private key, and a copy of the private key that is encrypted under a symmetric encryption KMS key that you specify.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "RSA_3072" + }, + "output": { + "PrivateKeyCiphertextBlob": "", + "PrivateKeyPlaintext": "", + "PublicKey": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "RSA_3072" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPairRequest": { @@ -2303,7 +2563,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning a plaintext copy of the private data key, KMS encrypts\n the plaintext private data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the private data key encrypted\n under the KMS key specified by the KeyId parameter. The PrivateKeyPlaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning a plaintext copy of the private data\n key, KMS encrypts the plaintext private data key under the public key in the attestation\n document, and returns the resulting ciphertext in the CiphertextForRecipient\n field in the response. This ciphertext can be decrypted only with the private key in the\n enclave. The CiphertextBlob field in the response contains a copy of the private\n data key encrypted under the KMS key specified by the KeyId parameter. The\n PrivateKeyPlaintext field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2323,7 +2589,7 @@ "PrivateKeyPlaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n PrivateKeyPlaintext field is null or empty.

" + "smithy.api#documentation": "

The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n PrivateKeyPlaintext field is null or empty.

" } }, "PublicKey": { @@ -2347,7 +2613,7 @@ "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext private data key encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext private data key encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2370,6 +2636,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2393,7 +2662,23 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that you \n use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or signing, but not\n both. However, KMS cannot enforce any restrictions on the use of data key pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an asymmetric data key pair without a plaintext key", + "documentation": "This example returns an asymmetric elliptic curve (ECC) data key pair. The private key is encrypted under the symmetric encryption KMS key that you specify. This operation doesn't return a plaintext (unencrypted) private key.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "ECC_NIST_P521" + }, + "output": { + "PrivateKeyCiphertextBlob": "", + "PublicKey": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "ECC_NIST_P521" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextRequest": { @@ -2424,6 +2709,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2499,7 +2790,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data key, KMS encrypts\n the plaintext data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the data key encrypted\n under the KMS key specified by the KeyId parameter. The Plaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data key, KMS encrypts\n the plaintext data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the data key encrypted\n under the KMS key specified by the KeyId parameter. The Plaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2519,7 +2816,7 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\n KMS. Then, remove it from memory as soon as possible.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\n KMS. Then, remove it from memory as soon as possible.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "KeyId": { @@ -2531,7 +2828,7 @@ "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext data key encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext data key encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2554,6 +2851,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2574,7 +2874,21 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to generate a data key. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or \n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use \n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to\n generate a data key. To get the type of your KMS key, use the DescribeKey\n operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an encrypted data key", + "documentation": "The following example generates an encrypted copy of a 256-bit symmetric data encryption key (data key). The data key is encrypted with the specified KMS key.", + "input": { + "KeyId": "alias/ExampleAlias", + "KeySpec": "AES_256" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyWithoutPlaintextRequest": { @@ -2610,6 +2924,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2648,6 +2968,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2668,7 +2991,23 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS key and a MAC algorithm that the key supports.\n HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

" + "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS\n key and a MAC algorithm that the key supports. HMAC KMS keys and the HMAC algorithms that\n KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

", + "smithy.api#examples": [ + { + "title": "To generate an HMAC for a message", + "documentation": "This example generates an HMAC for a message, an HMAC KMS key, and a MAC algorithm. The algorithm must be supported by the specified HMAC KMS key.", + "input": { + "Message": "Hello World", + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "MacAlgorithm": "HMAC_SHA_384" + }, + "output": { + "Mac": "", + "MacAlgorithm": "HMAC_SHA_384", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateMacRequest": { @@ -2700,6 +3039,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2712,7 +3057,7 @@ "Mac": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The hash-based message authentication code (HMAC) that was generated for the\n specified message, HMAC KMS key, and MAC algorithm.

\n

This is the standard, raw HMAC defined in RFC 2104.

" + "smithy.api#documentation": "

The hash-based message authentication code (HMAC) that was generated for the specified\n message, HMAC KMS key, and MAC algorithm.

\n

This is the standard, raw HMAC defined in RFC 2104.

" } }, "MacAlgorithm": { @@ -2758,7 +3103,19 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

" + "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

", + "smithy.api#examples": [ + { + "title": "To generate random data", + "documentation": "The following example generates 32 bytes of random data.", + "input": { + "NumberOfBytes": 32 + }, + "output": { + "Plaintext": "" + } + } + ] } }, "com.amazonaws.kms#GenerateRandomRequest": { @@ -2773,13 +3130,13 @@ "CustomKeyStoreId": { "target": "com.amazonaws.kms#CustomKeyStoreIdType", "traits": { - "smithy.api#documentation": "

Generates the random byte string in the CloudHSM cluster that is associated with the\n specified CloudHSM key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.

\n

External key store IDs are not valid for this parameter. If you specify the ID of an\n external key store, GenerateRandom throws an\n UnsupportedOperationException.

" + "smithy.api#documentation": "

Generates the random byte string in the CloudHSM cluster that is associated with the\n specified CloudHSM key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.

\n

External key store IDs are not valid for this parameter. If you specify the ID of an\n external key store, GenerateRandom throws an\n UnsupportedOperationException.

" } }, "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\n plaintext bytes under the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\n plaintext bytes under the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2793,13 +3150,13 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext random bytes encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext random bytes encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2833,7 +3190,20 @@ } ], "traits": { - "smithy.api#documentation": "

Gets a key policy attached to the specified KMS key.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetKeyPolicy (key policy)

\n

\n Related operations: PutKeyPolicy\n

" + "smithy.api#documentation": "

Gets a key policy attached to the specified KMS key.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetKeyPolicy (key policy)

\n

\n Related operations: PutKeyPolicy\n

", + "smithy.api#examples": [ + { + "title": "To retrieve a key policy", + "documentation": "The following example retrieves the key policy for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "PolicyName": "default" + }, + "output": { + "Policy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",\n \"Statement\" : [ {\n \"Sid\" : \"Enable IAM User Permissions\",\n \"Effect\" : \"Allow\",\n \"Principal\" : {\n \"AWS\" : \"arn:aws:iam::111122223333:root\"\n },\n \"Action\" : \"kms:*\",\n \"Resource\" : \"*\"\n } ]\n}" + } + } + ] } }, "com.amazonaws.kms#GetKeyPolicyRequest": { @@ -2901,7 +3271,19 @@ } ], "traits": { - "smithy.api#documentation": "

Gets a Boolean value that indicates whether automatic rotation of the key material is\n enabled for the specified KMS key.

\n

When you enable automatic rotation for customer managed KMS keys, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key..

\n

You can enable (EnableKeyRotation) and disable automatic rotation (DisableKeyRotation) of the key material in customer managed KMS keys. Key\n material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\n key rotation status for Amazon Web Services managed KMS keys is always true.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n
    \n
  • \n

    Disabled: The key rotation status does not change when you disable a KMS key. However,\n while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\n the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\n rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\n less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\n resumes its prior rotation schedule.

    \n
  • \n
  • \n

    Pending deletion: While a KMS key is pending deletion, its key rotation status is\n false and KMS does not rotate the key material. If you cancel the\n deletion, the original key rotation status returns to true.

    \n
  • \n
\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetKeyRotationStatus (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Gets a Boolean value that indicates whether automatic rotation of the key material is\n enabled for the specified KMS key.

\n

When you enable automatic rotation for customer managed KMS keys, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key..

\n

You can enable (EnableKeyRotation) and disable automatic rotation (DisableKeyRotation) of the key material in customer managed KMS keys. Key\n material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\n key rotation status for Amazon Web Services managed KMS keys is always true.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n
    \n
  • \n

    Disabled: The key rotation status does not change when you disable a KMS key. However,\n while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\n the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\n rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\n less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\n resumes its prior rotation schedule.

    \n
  • \n
  • \n

    Pending deletion: While a KMS key is pending deletion, its key rotation status is\n false and KMS does not rotate the key material. If you cancel the\n deletion, the original key rotation status returns to true.

    \n
  • \n
\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetKeyRotationStatus (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To retrieve the rotation status for a KMS key", + "documentation": "The following example retrieves the status of automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyRotationEnabled": true + } + } + ] } }, "com.amazonaws.kms#GetKeyRotationStatusRequest": { @@ -2963,7 +3345,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key and an import token you need to import or reimport key material for\n a KMS key.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

Before calling GetParametersForImport, use the CreateKey\n operation with an Origin value of EXTERNAL to create a KMS key with\n no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\n asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\n into a multi-Region key of\n any supported type. However, you can't import key material into a KMS key in a custom key store. You can also use\n GetParametersForImport to get a public key and import token to reimport the original key material into a KMS key whose key material expired or was\n deleted.

\n

\n GetParametersForImport returns the items that you need to import your key\n material.

\n
    \n
  • \n

    The public key (or \"wrapping key\") of an RSA key pair that KMS generates.

    \n

    You will use this public key to encrypt (\"wrap\") your key material while it's in\n transit to KMS.

    \n
  • \n
  • \n

    A import token that ensures that KMS can decrypt your key material and associate it with the correct KMS key.

    \n
  • \n
\n

The public key and its import token are permanently linked and must be used together. Each\n public key and import token set is valid for 24 hours. The expiration date and time appear in\n the ParametersValidTo field in the GetParametersForImport response.\n You cannot use an expired public key or import token in an ImportKeyMaterial\n request. If your key and token expire, send another GetParametersForImport\n request.

\n

\n GetParametersForImport requires the following information:

\n
    \n
  • \n

    The key ID of the KMS key for which you are importing the key material.

    \n
  • \n
  • \n

    The key spec of the public key (\"wrapping key\") that you will use to encrypt your key\n material during import.

    \n
  • \n
  • \n

    The wrapping algorithm that you will use with the public key to encrypt your key\n material.

    \n
  • \n
\n

You can use the same or a different public key spec and wrapping algorithm each time you\n import or reimport the same key material.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetParametersForImport (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns the public key and an import token you need to import or reimport key material for\n a KMS key.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

Before calling GetParametersForImport, use the CreateKey\n operation with an Origin value of EXTERNAL to create a KMS key with\n no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\n asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\n into a multi-Region key of\n any supported type. However, you can't import key material into a KMS key in a custom key store. You can also use\n GetParametersForImport to get a public key and import token to reimport the original key\n material into a KMS key whose key material expired or was deleted.

\n

\n GetParametersForImport returns the items that you need to import your key\n material.

\n
    \n
  • \n

    The public key (or \"wrapping key\") of an RSA key pair that KMS generates.

    \n

    You will use this public key to encrypt (\"wrap\") your key material while it's in\n transit to KMS.

    \n
  • \n
  • \n

    A import token that ensures that KMS can decrypt your key material and associate it\n with the correct KMS key.

    \n
  • \n
\n

The public key and its import token are permanently linked and must be used together. Each\n public key and import token set is valid for 24 hours. The expiration date and time appear in\n the ParametersValidTo field in the GetParametersForImport response.\n You cannot use an expired public key or import token in an ImportKeyMaterial\n request. If your key and token expire, send another GetParametersForImport\n request.

\n

\n GetParametersForImport requires the following information:

\n
    \n
  • \n

    The key ID of the KMS key for which you are importing the key material.

    \n
  • \n
  • \n

    The key spec of the public key (\"wrapping key\") that you will use to encrypt your key\n material during import.

    \n
  • \n
  • \n

    The wrapping algorithm that you will use with the public key to encrypt your key\n material.

    \n
  • \n
\n

You can use the same or a different public key spec and wrapping algorithm each time you\n import or reimport the same key material.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetParametersForImport (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GetParametersForImportRequest": { @@ -2979,7 +3361,7 @@ "WrappingAlgorithm": { "target": "com.amazonaws.kms#AlgorithmSpec", "traits": { - "smithy.api#documentation": "

The algorithm you will use with the RSA public key (PublicKey) in the\n response to protect your key material during import. For more information, see Select a wrapping algorithm in the Key Management Service Developer Guide.

\n

For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\n generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\n algorithms, you encrypt your key material directly with the RSA public key from KMS.

\n

The wrapping algorithms that you can use depend on the type of key material that you are\n importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.

\n
    \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_256 — Supported for wrapping RSA and ECC key\n material.

    \n
  • \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_1 — Supported for wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_256 — Supported for all types of key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping key spec to wrap \n ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_1 — Supported for all types of key material, except RSA key material (private\n key).

    \n

    You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key spec to wrap \n ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_PKCS1_V1_5 (Deprecated) — Supported only for symmetric encryption key\n material (and only in legacy mode).

    \n
  • \n
", + "smithy.api#documentation": "

The algorithm you will use with the RSA public key (PublicKey) in the\n response to protect your key material during import. For more information, see Select a wrapping algorithm in the Key Management Service Developer Guide.

\n

For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\n generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\n algorithms, you encrypt your key material directly with the RSA public key from KMS.

\n

The wrapping algorithms that you can use depend on the type of key material that you are\n importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.

\n
    \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_256 — Supported for\n wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_1 — Supported for\n wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_256 — Supported for all types\n of key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping\n key spec to wrap ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_1 — Supported for all types of\n key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key\n spec to wrap ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_PKCS1_V1_5 (Deprecated) — Supported only\n for symmetric encryption key material (and only in legacy mode).

    \n
  • \n
", "smithy.api#required": {} } }, @@ -3068,7 +3450,26 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you must \n specify the distinguishing ID. By default, KMS uses 1234567812345678 as the \n distinguishing ID. For more information, see Offline verification\n with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use:\n Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

" + "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

", + "smithy.api#examples": [ + { + "title": "To download the public key of an asymmetric KMS key", + "documentation": "This example gets the public key of an asymmetric RSA KMS key used for encryption and decryption. The operation returns the key spec, key usage, and encryption or signing algorithms to help you use the public key correctly outside of AWS KMS.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", + "PublicKey": "", + "CustomerMasterKeySpec": "RSA_4096", + "KeyUsage": "ENCRYPT_DECRYPT", + "EncryptionAlgorithms": [ + "RSAES_OAEP_SHA_1", + "RSAES_OAEP_SHA_256" + ] + } + } + ] } }, "com.amazonaws.kms#GetPublicKeyRequest": { @@ -3421,7 +3822,19 @@ } ], "traits": { - "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the\n KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To import key material into a KMS key", + "documentation": "The following example imports key material into the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "ImportToken": "", + "EncryptedKeyMaterial": "", + "ExpirationModel": "KEY_MATERIAL_DOES_NOT_EXPIRE" + } + } + ] } }, "com.amazonaws.kms#ImportKeyMaterialRequest": { @@ -3722,7 +4135,7 @@ "code": "KMSInvalidStateException", "httpResponseCode": 409 }, - "smithy.api#documentation": "

The request was rejected because the state of the specified resource is not valid for this\n request.

\n

This exceptions means one of the following:

\n
    \n
  • \n

    The key state of the KMS key is not compatible with the operation.

    \n

    To find the key state, use the DescribeKey operation. For more\n information about which key states are compatible with each KMS operation, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    For cryptographic operations on KMS keys in custom key stores, this exception represents a general failure with many possible causes. To identify the cause, see the error message that accompanies the exception.

    \n
  • \n
", + "smithy.api#documentation": "

The request was rejected because the state of the specified resource is not valid for this\n request.

\n

This exceptions means one of the following:

\n
    \n
  • \n

    The key state of the KMS key is not compatible with the operation.

    \n

    To find the key state, use the DescribeKey operation. For more\n information about which key states are compatible with each KMS operation, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    For cryptographic operations on KMS keys in custom key stores, this exception\n represents a general failure with many possible causes. To identify the cause, see the\n error message that accompanies the exception.

    \n
  • \n
", "smithy.api#error": "client", "smithy.api#httpError": 409 } @@ -3939,7 +4352,7 @@ "XksKeyConfiguration": { "target": "com.amazonaws.kms#XksKeyConfigurationType", "traits": { - "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an\n external key store.

\n

For more information, see \n External key in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an external key\n store.

\n

For more information, see External key in the\n Key Management Service Developer Guide.

" } } }, @@ -4186,6 +4599,57 @@ ], "traits": { "smithy.api#documentation": "

Gets a list of aliases in the caller's Amazon Web Services account and region. For more information\n about aliases, see CreateAlias.

\n

By default, the ListAliases operation returns all aliases in the account and\n region. To get only the aliases associated with a particular KMS key, use the\n KeyId parameter.

\n

The ListAliases response can include aliases that you created and associated\n with your customer managed keys, and aliases that Amazon Web Services created and associated with Amazon Web Services\n managed keys in your account. You can recognize Amazon Web Services aliases because their names have the\n format aws/, such as aws/dynamodb.

\n

The response might also include aliases that have no TargetKeyId field. These\n are predefined aliases that Amazon Web Services has created but has not yet associated with a KMS key.\n Aliases that Amazon Web Services creates in your account, including predefined aliases, do not count against\n your KMS aliases\n quota.

\n

\n Cross-account use: No. ListAliases does not\n return aliases in other Amazon Web Services accounts.

\n

\n Required permissions: kms:ListAliases (IAM policy)

\n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list aliases", + "documentation": "The following example lists aliases.", + "output": { + "Aliases": [ + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/acm", + "AliasName": "alias/aws/acm", + "TargetKeyId": "da03f6f7-d279-427a-9cae-de48d07e5b66" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/ebs", + "AliasName": "alias/aws/ebs", + "TargetKeyId": "25a217e7-7170-4b8c-8bf6-045ea5f70e5b" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/rds", + "AliasName": "alias/aws/rds", + "TargetKeyId": "7ec3104e-c3f2-4b5c-bf42-bfc4772c6685" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/redshift", + "AliasName": "alias/aws/redshift", + "TargetKeyId": "08f7a25a-69e2-4fb5-8f10-393db27326fa" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/s3", + "AliasName": "alias/aws/s3", + "TargetKeyId": "d2b0f1a3-580d-4f79-b836-bc983be8cfa5" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example1", + "AliasName": "alias/example1", + "TargetKeyId": "4da1e216-62d0-46c5-a7c0-5f3a3d2f8046" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example2", + "AliasName": "alias/example2", + "TargetKeyId": "f32fef59-2cc2-445b-8573-2d73328acbee" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example3", + "AliasName": "alias/example3", + "TargetKeyId": "1374ef38-d34e-4d5f-b2c9-4e0daee38855" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4378,6 +4842,21 @@ ], "traits": { "smithy.api#documentation": "

Gets the names of the key policies that are attached to a KMS key. This operation is\n designed to get policy names that you can use in a GetKeyPolicy operation.\n However, the only valid policy name is default.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListKeyPolicies (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list key policies for a KMS key", + "documentation": "The following example lists key policies for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "PolicyNames": [ + "default" + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4461,6 +4940,45 @@ ], "traits": { "smithy.api#documentation": "

Gets a list of all KMS keys in the caller's Amazon Web Services account and Region.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListKeys (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list KMS keys", + "documentation": "The following example lists KMS keys.", + "output": { + "Keys": [ + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/0d990263-018e-4e65-a703-eff731de951e", + "KeyId": "0d990263-018e-4e65-a703-eff731de951e" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/144be297-0ae1-44ac-9c8f-93cd8c82f841", + "KeyId": "144be297-0ae1-44ac-9c8f-93cd8c82f841" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/21184251-b765-428e-b852-2c7353e72571", + "KeyId": "21184251-b765-428e-b852-2c7353e72571" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/214fe92f-5b03-4ae1-b350-db2a45dbe10c", + "KeyId": "214fe92f-5b03-4ae1-b350-db2a45dbe10c" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/339963f2-e523-49d3-af24-a0fe752aa458", + "KeyId": "339963f2-e523-49d3-af24-a0fe752aa458" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/b776a44b-df37-4438-9be4-a27494e4271a", + "KeyId": "b776a44b-df37-4438-9be4-a27494e4271a" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb", + "KeyId": "deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4540,6 +5058,32 @@ ], "traits": { "smithy.api#documentation": "

Returns all tags on the specified KMS key.

\n

For general information about tags, including the format and syntax, see Tagging Amazon Web Services resources in\n the Amazon Web Services General Reference. For information about using\n tags in KMS, see Tagging\n keys.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListResourceTags (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list tags for a KMS key", + "documentation": "The following example lists tags for a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "Tags": [ + { + "TagKey": "CostCenter", + "TagValue": "87654" + }, + { + "TagKey": "CreatedBy", + "TagValue": "ExampleUser" + }, + { + "TagKey": "Purpose", + "TagValue": "Test" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4969,7 +5513,18 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches a key policy to the specified KMS key.

\n

For more information about key policies, see Key Policies in the Key Management Service Developer Guide.\n For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the \n Identity and Access Management User Guide\n . For examples of adding a key policy in multiple programming languages,\n see Setting a key policy in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:PutKeyPolicy (key policy)

\n

\n Related operations: GetKeyPolicy\n

" + "smithy.api#documentation": "

Attaches a key policy to the specified KMS key.

\n

For more information about key policies, see Key Policies in the Key Management Service Developer Guide.\n For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the \n Identity and Access Management User Guide\n . For examples of adding a key policy in multiple programming languages,\n see Setting a key policy in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:PutKeyPolicy (key policy)

\n

\n Related operations: GetKeyPolicy\n

", + "smithy.api#examples": [ + { + "title": "To attach a key policy to a KMS key", + "documentation": "The following example attaches a key policy to the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "PolicyName": "default", + "Policy": "{\n \"Version\": \"2012-10-17\",\n \"Id\": \"custom-policy-2016-12-07\",\n \"Statement\": [\n {\n \"Sid\": \"Enable IAM User Permissions\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n },\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow access for Key Administrators\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": [\n \"arn:aws:iam::111122223333:user/ExampleAdminUser\",\n \"arn:aws:iam::111122223333:role/ExampleAdminRole\"\n ]\n },\n \"Action\": [\n \"kms:Create*\",\n \"kms:Describe*\",\n \"kms:Enable*\",\n \"kms:List*\",\n \"kms:Put*\",\n \"kms:Update*\",\n \"kms:Revoke*\",\n \"kms:Disable*\",\n \"kms:Get*\",\n \"kms:Delete*\",\n \"kms:ScheduleKeyDeletion\",\n \"kms:CancelKeyDeletion\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow use of the key\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:Encrypt\",\n \"kms:Decrypt\",\n \"kms:ReEncrypt*\",\n \"kms:GenerateDataKey*\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow attachment of persistent resources\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:CreateGrant\",\n \"kms:ListGrants\",\n \"kms:RevokeGrant\"\n ],\n \"Resource\": \"*\",\n \"Condition\": {\n \"Bool\": {\n \"kms:GrantIsForAWSResource\": \"true\"\n }\n }\n }\n ]\n}\n" + } + } + ] } }, "com.amazonaws.kms#PutKeyPolicyRequest": { @@ -5023,6 +5578,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#IncorrectKeyException" }, @@ -5049,7 +5607,22 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\n operation to change the KMS key under which data is encrypted, such as when you manually\n rotate a KMS key or change the KMS key that protects a ciphertext. You can also use\n it to reencrypt ciphertext under the same KMS key, such as to change the encryption\n context of a ciphertext.

\n

The ReEncrypt operation can decrypt ciphertext that was encrypted by using a\n KMS key in an KMS operation, such as Encrypt or GenerateDataKey. It can also decrypt ciphertext that was encrypted by using the\n public key of an asymmetric KMS key\n outside of KMS. However, it cannot decrypt ciphertext produced by other libraries, such as\n the Amazon Web Services Encryption SDK or\n Amazon S3\n client-side encryption. These libraries return a ciphertext format that is\n incompatible with KMS.

\n

When you use the ReEncrypt operation, you need to provide information for the\n decrypt operation and the subsequent encrypt operation.

\n
    \n
  • \n

    If your ciphertext was encrypted under an asymmetric KMS key, you must use the\n SourceKeyId parameter to identify the KMS key that encrypted the\n ciphertext. You must also supply the encryption algorithm that was used. This information\n is required to decrypt the data.

    \n
  • \n
  • \n

    If your ciphertext was encrypted under a symmetric encryption KMS key, the\n SourceKeyId parameter is optional. KMS can get this information from\n metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\n your implementation by ensuring that authorized users can decrypt ciphertext decades after\n it was encrypted, even if they've lost track of the key ID. However, specifying the source\n KMS key is always recommended as a best practice. When you use the\n SourceKeyId parameter to specify a KMS key, KMS uses only the KMS key you\n specify. If the ciphertext was encrypted under a different KMS key, the\n ReEncrypt operation fails. This practice ensures that you use the KMS key\n that you intend.

    \n
  • \n
  • \n

    To reencrypt the data, you must use the DestinationKeyId parameter to\n specify the KMS key that re-encrypts the data after it is decrypted. If the destination\n KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\n algorithm that you choose must be compatible with the KMS key.

    \n \n

    When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

    \n

    You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

    \n
    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. The source KMS key and\n destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\n different account than the caller. To specify a KMS key in a different account, you must use\n its key ARN or alias ARN.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReEncryptFrom\n permission on the source KMS key (key policy)

    \n
  • \n
  • \n

    \n kms:ReEncryptTo\n permission on the destination KMS key (key policy)

    \n
  • \n
\n

To permit reencryption from or to a KMS key, include the \"kms:ReEncrypt*\"\n permission in your key policy. This permission is\n automatically included in the key policy when you use the console to create a KMS key. But you\n must include it manually when you create a KMS key programmatically or when you use the PutKeyPolicy operation to set a key policy.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\n operation to change the KMS key under which data is encrypted, such as when you manually\n rotate a KMS key or change the KMS key that protects a ciphertext. You can also use\n it to reencrypt ciphertext under the same KMS key, such as to change the encryption\n context of a ciphertext.

\n

The ReEncrypt operation can decrypt ciphertext that was encrypted by using a\n KMS key in an KMS operation, such as Encrypt or GenerateDataKey. It can also decrypt ciphertext that was encrypted by using the\n public key of an asymmetric KMS key\n outside of KMS. However, it cannot decrypt ciphertext produced by other libraries, such as\n the Amazon Web Services Encryption SDK or\n Amazon S3\n client-side encryption. These libraries return a ciphertext format that is\n incompatible with KMS.

\n

When you use the ReEncrypt operation, you need to provide information for the\n decrypt operation and the subsequent encrypt operation.

\n
    \n
  • \n

    If your ciphertext was encrypted under an asymmetric KMS key, you must use the\n SourceKeyId parameter to identify the KMS key that encrypted the\n ciphertext. You must also supply the encryption algorithm that was used. This information\n is required to decrypt the data.

    \n
  • \n
  • \n

    If your ciphertext was encrypted under a symmetric encryption KMS key, the\n SourceKeyId parameter is optional. KMS can get this information from\n metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\n your implementation by ensuring that authorized users can decrypt ciphertext decades after\n it was encrypted, even if they've lost track of the key ID. However, specifying the source\n KMS key is always recommended as a best practice. When you use the\n SourceKeyId parameter to specify a KMS key, KMS uses only the KMS key you\n specify. If the ciphertext was encrypted under a different KMS key, the\n ReEncrypt operation fails. This practice ensures that you use the KMS key\n that you intend.

    \n
  • \n
  • \n

    To reencrypt the data, you must use the DestinationKeyId parameter to\n specify the KMS key that re-encrypts the data after it is decrypted. If the destination\n KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\n algorithm that you choose must be compatible with the KMS key.

    \n \n

    When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

    \n

    You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

    \n
    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. The source KMS key and\n destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\n different account than the caller. To specify a KMS key in a different account, you must use\n its key ARN or alias ARN.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReEncryptFrom\n permission on the source KMS key (key policy)

    \n
  • \n
  • \n

    \n kms:ReEncryptTo\n permission on the destination KMS key (key policy)

    \n
  • \n
\n

To permit reencryption from or to a KMS key, include the \"kms:ReEncrypt*\"\n permission in your key policy. This permission is\n automatically included in the key policy when you use the console to create a KMS key. But you\n must include it manually when you create a KMS key programmatically or when you use the PutKeyPolicy operation to set a key policy.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To reencrypt data", + "documentation": "The following example reencrypts data with the specified KMS key.", + "input": { + "CiphertextBlob": "", + "DestinationKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", + "SourceKeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#ReEncryptRequest": { @@ -5104,6 +5677,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5154,13 +5733,13 @@ "KeyEncryptionAlgorithm": { "target": "com.amazonaws.kms#KeyEncryptionMechanism", "traits": { - "smithy.api#documentation": "

The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro Enclave to encrypt plaintext \n values for the response. The only valid value is RSAES_OAEP_SHA_256.

" + "smithy.api#documentation": "

The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro\n Enclave to encrypt plaintext values for the response. The only valid value is\n RSAES_OAEP_SHA_256.

" } }, "AttestationDocument": { "target": "com.amazonaws.kms#AttestationDocumentType", "traits": { - "smithy.api#documentation": "

The attestation document for an Amazon Web Services Nitro Enclave. This document includes the enclave's public\n key.

" + "smithy.api#documentation": "

The attestation document for an Amazon Web Services Nitro Enclave. This document includes the enclave's\n public key.

" } } }, @@ -5219,7 +5798,51 @@ } ], "traits": { - "smithy.api#documentation": "

Replicates a multi-Region key into the specified Region. This operation creates a\n multi-Region replica key based on a multi-Region primary key in a different Region of the same\n Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\n different Region. To create a multi-Region primary key, use the CreateKey\n operation.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

A replica key is a fully-functional KMS key that can be used\n independently of its primary and peer replica keys. A primary key and its replica keys share\n properties that make them interoperable. They have the same key ID and key material. They also\n have the same key\n spec, key\n usage, key\n material origin, and automatic key rotation status. KMS automatically synchronizes these shared\n properties among related multi-Region keys. All other properties of a replica key can differ,\n including its key\n policy, tags, aliases, and Key states of KMS keys. KMS pricing and quotas for KMS keys apply to each\n primary key and replica key.

\n

When this operation completes, the new replica key has a transient key state of\n Creating. This key state changes to Enabled (or\n PendingImport) after a few seconds when the process of creating the new replica\n key is complete. While the key state is Creating, you can manage key, but you\n cannot yet use it in cryptographic operations. If you are creating and using the replica key\n programmatically, retry on KMSInvalidStateException or call\n DescribeKey to check its KeyState value before using it. For\n details about the Creating key state, see Key states of KMS keys in the\n Key Management Service Developer Guide.

\n

You cannot create more than one replica of a primary key in any Region. If the Region\n already includes a replica of the key you're trying to replicate, ReplicateKey\n returns an AlreadyExistsException error. If the key state of the existing replica\n is PendingDeletion, you can cancel the scheduled key deletion (CancelKeyDeletion) or wait for the key to be deleted. The new replica key you\n create will have the same shared\n properties as the original replica key.

\n

The CloudTrail log of a ReplicateKey operation records a\n ReplicateKey operation in the primary key's Region and a CreateKey operation in the replica key's Region.

\n

If you replicate a multi-Region primary key with imported key material, the replica key is\n created with no key material. You must import the same key material that you imported into the\n primary key. For details, see Importing key material into multi-Region keys in the Key Management Service Developer Guide.

\n

To convert a replica key to a primary key, use the UpdatePrimaryRegion\n operation.

\n \n

\n ReplicateKey uses different default values for the KeyPolicy\n and Tags parameters than those used in the KMS console. For details, see the\n parameter descriptions.

\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a replica key in a different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReplicateKey on the primary key (in the primary key's Region).\n Include this permission in the primary key's key policy.

    \n
  • \n
  • \n

    \n kms:CreateKey in an IAM policy in the replica Region.

    \n
  • \n
  • \n

    To use the Tags parameter, kms:TagResource in an IAM policy\n in the replica Region.

    \n
  • \n
\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Replicates a multi-Region key into the specified Region. This operation creates a\n multi-Region replica key based on a multi-Region primary key in a different Region of the same\n Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\n different Region. To create a multi-Region primary key, use the CreateKey\n operation.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

A replica key is a fully-functional KMS key that can be used\n independently of its primary and peer replica keys. A primary key and its replica keys share\n properties that make them interoperable. They have the same key ID and key material. They also\n have the same key\n spec, key\n usage, key\n material origin, and automatic key rotation status. KMS automatically synchronizes these shared\n properties among related multi-Region keys. All other properties of a replica key can differ,\n including its key\n policy, tags, aliases, and Key states of KMS keys. KMS pricing and quotas for KMS keys apply to each\n primary key and replica key.

\n

When this operation completes, the new replica key has a transient key state of\n Creating. This key state changes to Enabled (or\n PendingImport) after a few seconds when the process of creating the new replica\n key is complete. While the key state is Creating, you can manage key, but you\n cannot yet use it in cryptographic operations. If you are creating and using the replica key\n programmatically, retry on KMSInvalidStateException or call\n DescribeKey to check its KeyState value before using it. For\n details about the Creating key state, see Key states of KMS keys in the\n Key Management Service Developer Guide.

\n

You cannot create more than one replica of a primary key in any Region. If the Region\n already includes a replica of the key you're trying to replicate, ReplicateKey\n returns an AlreadyExistsException error. If the key state of the existing replica\n is PendingDeletion, you can cancel the scheduled key deletion (CancelKeyDeletion) or wait for the key to be deleted. The new replica key you\n create will have the same shared\n properties as the original replica key.

\n

The CloudTrail log of a ReplicateKey operation records a\n ReplicateKey operation in the primary key's Region and a CreateKey operation in the replica key's Region.

\n

If you replicate a multi-Region primary key with imported key material, the replica key is\n created with no key material. You must import the same key material that you imported into the\n primary key. For details, see Importing key material into multi-Region keys in the Key Management Service Developer Guide.

\n

To convert a replica key to a primary key, use the UpdatePrimaryRegion\n operation.

\n \n

\n ReplicateKey uses different default values for the KeyPolicy\n and Tags parameters than those used in the KMS console. For details, see the\n parameter descriptions.

\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a replica key in a different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReplicateKey on the primary key (in the primary key's Region).\n Include this permission in the primary key's key policy.

    \n
  • \n
  • \n

    \n kms:CreateKey in an IAM policy in the replica Region.

    \n
  • \n
  • \n

    To use the Tags parameter, kms:TagResource in an IAM policy\n in the replica Region.

    \n
  • \n
\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To replicate a multi-Region key in a different AWS Region", + "documentation": "This example creates a multi-Region replica key in us-west-2 of a multi-Region primary key in us-east-1.", + "input": { + "KeyId": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "ReplicaRegion": "us-west-2" + }, + "output": { + "ReplicaKeyMetadata": { + "MultiRegion": true, + "MultiRegionConfiguration": { + "MultiRegionKeyType": "REPLICA", + "PrimaryKey": { + "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "Region": "us-east-1" + }, + "ReplicaKeys": [ + { + "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "Region": "us-west-2" + } + ] + }, + "AWSAccountId": "111122223333", + "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "CreationDate": 1.607472987918E9, + "Description": "", + "Enabled": true, + "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab", + "KeyManager": "CUSTOMER", + "KeyState": "Enabled", + "KeyUsage": "ENCRYPT_DECRYPT", + "Origin": "AWS_KMS", + "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", + "EncryptionAlgorithms": [ + "SYMMETRIC_DEFAULT" + ] + }, + "ReplicaPolicy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",...}", + "ReplicaTags": [] + } + } + ] } }, "com.amazonaws.kms#ReplicateKeyRequest": { @@ -5307,6 +5930,9 @@ { "target": "com.amazonaws.kms#DependencyTimeoutException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -5327,7 +5953,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\n identify the grant to retire, use a grant token, or both the grant ID and a\n key identifier (key ID or key ARN) of the KMS key. The CreateGrant operation\n returns both values.

\n

This operation can be called by the retiring principal for a grant,\n by the grantee principal if the grant allows the RetireGrant\n operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\n principals to whom permission for retiring a grant is delegated. For details, see Retiring and revoking\n grants in the Key Management Service Developer Guide.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. You can retire a grant on a KMS\n key in a different Amazon Web Services account.

\n

\n Required permissions::Permission to retire a grant is\n determined primarily by the grant. For details, see Retiring and revoking grants in\n the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\n identify the grant to retire, use a grant token, or both the grant ID and a\n key identifier (key ID or key ARN) of the KMS key. The CreateGrant operation\n returns both values.

\n

This operation can be called by the retiring principal for a grant,\n by the grantee principal if the grant allows the RetireGrant\n operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\n principals to whom permission for retiring a grant is delegated. For details, see Retiring and revoking\n grants in the Key Management Service Developer Guide.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. You can retire a grant on a KMS\n key in a different Amazon Web Services account.

\n

\n Required permissions::Permission to retire a grant is\n determined primarily by the grant. For details, see Retiring and revoking grants in\n the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To retire a grant", + "documentation": "The following example retires a grant.", + "input": { + "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#RetireGrantRequest": { @@ -5350,6 +5986,12 @@ "traits": { "smithy.api#documentation": "

Identifies the grant to retire. To get the grant ID, use CreateGrant,\n ListGrants, or ListRetirableGrants.

\n
    \n
  • \n

    Grant ID Example -\n 0123456789012345678901234567890123456789012345678901234567890123

    \n
  • \n
" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5368,6 +6010,9 @@ { "target": "com.amazonaws.kms#DependencyTimeoutException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -5385,7 +6030,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified grant. You revoke a grant to terminate the permissions that the\n grant allows. For more information, see Retiring and revoking grants in\n the \n Key Management Service Developer Guide\n .

\n

When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. For details, see Eventual consistency in\n the \n Key Management Service Developer Guide\n .

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:RevokeGrant (key policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes the specified grant. You revoke a grant to terminate the permissions that the\n grant allows. For more information, see Retiring and revoking grants in\n the \n Key Management Service Developer Guide\n .

\n

When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. For details, see Eventual consistency in\n the \n Key Management Service Developer Guide\n .

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:RevokeGrant (key policy).

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To revoke a grant", + "documentation": "The following example revokes a grant.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#RevokeGrantRequest": { @@ -5404,6 +6059,12 @@ "smithy.api#documentation": "

Identifies the grant to revoke. To get the grant ID, use CreateGrant,\n ListGrants, or ListRetirableGrants.

", "smithy.api#required": {} } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5436,7 +6097,7 @@ } ], "traits": { - "smithy.api#documentation": "

Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\n days, but you can specify a waiting period of 7-30 days. When this operation is successful,\n the key state of the KMS key changes to PendingDeletion and the key can't be used\n in any cryptographic operations. It remains in this state for the duration of the waiting\n period. Before the waiting period ends, you can use CancelKeyDeletion to\n cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\n its key material, and all KMS data associated with it, including all aliases that refer to\n it.

\n \n

Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\n is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\n exception is a multi-Region replica\n key, or an asymmetric or HMAC KMS key with imported key material[BUGBUG-link to\n importing-keys-managing.html#import-delete-key.) To prevent the use of a KMS key without\n deleting it, use DisableKey.

\n
\n

You can schedule the deletion of a multi-Region primary key and its replica keys at any\n time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\n you schedule the deletion of a primary key with replicas, its key state changes to\n PendingReplicaDeletion and it cannot be replicated or used in cryptographic\n operations. This status can continue indefinitely. When the last of its replicas keys is\n deleted (not just scheduled), the key state of the primary key changes to\n PendingDeletion and its waiting period (PendingWindowInDays)\n begins. For details, see Deleting multi-Region keys in the\n Key Management Service Developer Guide.

\n

When KMS deletes\n a KMS key from an CloudHSM key store, it makes a best effort to delete the associated\n key material from the associated CloudHSM cluster. However, you might need to manually delete\n the orphaned key material from the cluster and its backups. Deleting a KMS key from an\n external key store has no effect on the associated external key. However, for both\n types of custom key stores, deleting a KMS key is destructive and irreversible. You cannot\n decrypt ciphertext encrypted under the KMS key by using only its associated external key or\n CloudHSM key. Also, you cannot recreate a KMS key in an external key store by creating a new KMS\n key with the same key material.

\n

For more information about scheduling a KMS key for deletion, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ScheduleKeyDeletion (key\n policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\n days, but you can specify a waiting period of 7-30 days. When this operation is successful,\n the key state of the KMS key changes to PendingDeletion and the key can't be used\n in any cryptographic operations. It remains in this state for the duration of the waiting\n period. Before the waiting period ends, you can use CancelKeyDeletion to\n cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\n its key material, and all KMS data associated with it, including all aliases that refer to\n it.

\n \n

Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\n is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\n exception is a multi-Region replica\n key, or an asymmetric or HMAC KMS\n key with imported key material.) To prevent the use of a KMS key without deleting\n it, use DisableKey.

\n
\n

You can schedule the deletion of a multi-Region primary key and its replica keys at any\n time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\n you schedule the deletion of a primary key with replicas, its key state changes to\n PendingReplicaDeletion and it cannot be replicated or used in cryptographic\n operations. This status can continue indefinitely. When the last of its replicas keys is\n deleted (not just scheduled), the key state of the primary key changes to\n PendingDeletion and its waiting period (PendingWindowInDays)\n begins. For details, see Deleting multi-Region keys in the\n Key Management Service Developer Guide.

\n

When KMS deletes\n a KMS key from an CloudHSM key store, it makes a best effort to delete the associated\n key material from the associated CloudHSM cluster. However, you might need to manually delete\n the orphaned key material from the cluster and its backups. Deleting a KMS key from an\n external key store has no effect on the associated external key. However, for both\n types of custom key stores, deleting a KMS key is destructive and irreversible. You cannot\n decrypt ciphertext encrypted under the KMS key by using only its associated external key or\n CloudHSM key. Also, you cannot recreate a KMS key in an external key store by creating a new KMS\n key with the same key material.

\n

For more information about scheduling a KMS key for deletion, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ScheduleKeyDeletion (key\n policy)

\n

\n Related operations\n

\n " } }, "com.amazonaws.kms#ScheduleKeyDeletionRequest": { @@ -5452,7 +6113,7 @@ "PendingWindowInDays": { "target": "com.amazonaws.kms#PendingWindowInDaysType", "traits": { - "smithy.api#documentation": "

The waiting period, specified in number of days. After the waiting period ends, KMS\n deletes the KMS key.

\n

If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\n when the last of its replica keys is deleted. Otherwise, the waiting period begins\n immediately.

\n

This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\n you do not include a value, it defaults to 30. You can use the \n kms:ScheduleKeyDeletionPendingWindowInDays\n \n condition key to further constrain the values that principals can specify in the \n PendingWindowInDays parameter.

" + "smithy.api#documentation": "

The waiting period, specified in number of days. After the waiting period ends, KMS\n deletes the KMS key.

\n

If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\n when the last of its replica keys is deleted. Otherwise, the waiting period begins\n immediately.

\n

This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\n you do not include a value, it defaults to 30. You can use the \n kms:ScheduleKeyDeletionPendingWindowInDays\n condition key to further\n constrain the values that principals can specify in the PendingWindowInDays\n parameter.

" } } }, @@ -5507,6 +6168,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -5527,7 +6191,24 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a digital\n signature for a message or message digest by using the private key in an asymmetric\n signing KMS key. To verify the signature, use the Verify operation, or use\n the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

Digital signatures are generated and verified by using asymmetric key pair, such as an RSA\n or ECC pair that is represented by an asymmetric KMS key. The key owner (or an authorized\n user) uses their private key to sign a message. Anyone with the public key can verify that the\n message was signed with that particular private key and that the message hasn't changed since\n it was signed.

\n

To use the Sign operation, provide the following information:

\n
    \n
  • \n

    Use the KeyId parameter to identify an asymmetric KMS key with a\n KeyUsage value of SIGN_VERIFY. To get the\n KeyUsage value of a KMS key, use the DescribeKey\n operation. The caller must have kms:Sign permission on the KMS key.

    \n
  • \n
  • \n

    Use the Message parameter to specify the message or message digest to\n sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\n hash digest of the message, and then provide the hash digest in the Message\n parameter. To indicate whether the message is a full message or a digest, use the\n MessageType parameter.

    \n
  • \n
  • \n

    Choose a signing algorithm that is compatible with the KMS key.

    \n
  • \n
\n \n

When signing a message, be sure to record the KMS key and the signing algorithm. This\n information is required to verify the signature.

\n
\n \n

Best practices recommend that you limit the time during which any signature is\n effective. This deters an attack where the actor uses a signed message to establish validity\n repeatedly or long after the message is superseded. Signatures do not include a timestamp,\n but you can include a timestamp in the signed message to help you detect when its time to\n refresh the signature.

\n
\n

To verify the signature that this operation generates, use the Verify\n operation. Or use the GetPublicKey operation to download the public key and\n then use the public key to verify the signature outside of KMS.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Sign (key policy)

\n

\n Related operations: Verify\n

" + "smithy.api#documentation": "

Creates a digital\n signature for a message or message digest by using the private key in an asymmetric\n signing KMS key. To verify the signature, use the Verify operation, or use\n the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

Digital signatures are generated and verified by using asymmetric key pair, such as an RSA\n or ECC pair that is represented by an asymmetric KMS key. The key owner (or an authorized\n user) uses their private key to sign a message. Anyone with the public key can verify that the\n message was signed with that particular private key and that the message hasn't changed since\n it was signed.

\n

To use the Sign operation, provide the following information:

\n
    \n
  • \n

    Use the KeyId parameter to identify an asymmetric KMS key with a\n KeyUsage value of SIGN_VERIFY. To get the\n KeyUsage value of a KMS key, use the DescribeKey\n operation. The caller must have kms:Sign permission on the KMS key.

    \n
  • \n
  • \n

    Use the Message parameter to specify the message or message digest to\n sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\n hash digest of the message, and then provide the hash digest in the Message\n parameter. To indicate whether the message is a full message or a digest, use the\n MessageType parameter.

    \n
  • \n
  • \n

    Choose a signing algorithm that is compatible with the KMS key.

    \n
  • \n
\n \n

When signing a message, be sure to record the KMS key and the signing algorithm. This\n information is required to verify the signature.

\n
\n \n

Best practices recommend that you limit the time during which any signature is\n effective. This deters an attack where the actor uses a signed message to establish validity\n repeatedly or long after the message is superseded. Signatures do not include a timestamp,\n but you can include a timestamp in the signed message to help you detect when its time to\n refresh the signature.

\n
\n

To verify the signature that this operation generates, use the Verify\n operation. Or use the GetPublicKey operation to download the public key and\n then use the public key to verify the signature outside of KMS.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Sign (key policy)

\n

\n Related operations: Verify\n

", + "smithy.api#examples": [ + { + "title": "To digitally sign a message with an asymmetric KMS key.", + "documentation": "This operation uses the private key in an asymmetric elliptic curve (ECC) KMS key to generate a digital signature for a given message.", + "input": { + "KeyId": "alias/ECC_signing_key", + "Message": "", + "MessageType": "RAW", + "SigningAlgorithm": "ECDSA_SHA_384" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "Signature": "", + "SigningAlgorithm": "ECDSA_SHA_384" + } + } + ] } }, "com.amazonaws.kms#SignRequest": { @@ -5543,14 +6224,14 @@ "Message": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\n larger message, provide a message digest.

\n

If you provide a message digest, use the DIGEST value of MessageType to\n prevent the digest from being hashed again while signing.

", + "smithy.api#documentation": "

Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\n larger message, provide a message digest.

\n

If you provide a message digest, use the DIGEST value of\n MessageType to prevent the digest from being hashed again while signing.

", "smithy.api#required": {} } }, "MessageType": { "target": "com.amazonaws.kms#MessageType", "traits": { - "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed\n as part of the signing algorithm. Use RAW for unhashed messages; use DIGEST\n for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST, KMS skips\n the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed message,\n the security of the signing operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length\n of the Message value must match the length of hashed messages for the specified signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, this can cause verification failures when \n verifying with a system that assumes a single hash.

\n

The hashing algorithm in that Sign uses is based on the SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline verification with SM2 key pairs.

    \n
  • \n
" + "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed as\n part of the signing algorithm. Use RAW for unhashed messages; use\n DIGEST for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST,\n KMS skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed\n message, the security of the signing operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length of the\n Message value must match the length of hashed messages for the specified\n signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, this can cause\n verification failures when verifying with a system that assumes a single hash.

\n

The hashing algorithm in that Sign uses is based on the\n SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline\n verification with SM2 key pairs.

    \n
  • \n
" } }, "GrantTokens": { @@ -5562,9 +6243,15 @@ "SigningAlgorithm": { "target": "com.amazonaws.kms#SigningAlgorithmSpec", "traits": { - "smithy.api#documentation": "

Specifies the signing algorithm to use when signing the message.

\n

Choose an algorithm that is compatible with the type and size of the specified asymmetric\n KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\n RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.

", + "smithy.api#documentation": "

Specifies the signing algorithm to use when signing the message.

\n

Choose an algorithm that is compatible with the type and size of the specified asymmetric\n KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\n RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.

", "smithy.api#required": {} } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5757,7 +6444,22 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or edits tags on a customer managed key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\n The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\n value. To edit a tag, specify an existing tag key and a new tag value.

\n

You can use this operation to tag a customer managed key, but you cannot\n tag an Amazon Web Services\n managed key, an Amazon Web Services owned key, a custom key\n store, or an alias.

\n

You can also add tags to a KMS key while creating it (CreateKey) or\n replicating it (ReplicateKey).

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:TagResource (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Adds or edits tags on a customer managed key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\n The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\n value. To edit a tag, specify an existing tag key and a new tag value.

\n

You can use this operation to tag a customer managed key, but you cannot\n tag an Amazon Web Services\n managed key, an Amazon Web Services owned key, a custom key\n store, or an alias.

\n

You can also add tags to a KMS key while creating it (CreateKey) or\n replicating it (ReplicateKey).

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:TagResource (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To tag a KMS key", + "documentation": "The following example tags a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Tags": [ + { + "TagKey": "Purpose", + "TagValue": "Test" + } + ] + } + } + ] } }, "com.amazonaws.kms#TagResourceRequest": { @@ -5773,7 +6475,7 @@ "Tags": { "target": "com.amazonaws.kms#TagList", "traits": { - "smithy.api#documentation": "

One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an empty (null)\n string.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

You cannot have more than one tag on a KMS key with the same tag key. If you specify an\n existing tag key with a different tag value, KMS replaces the current tag value with the\n specified one.

", + "smithy.api#documentation": "

One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an\n empty (null) string.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

You cannot have more than one tag on a KMS key with the same tag key. If you specify an\n existing tag key with a different tag value, KMS replaces the current tag value with the\n specified one.

", "smithy.api#required": {} } } @@ -6023,52 +6725,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -6076,13 +6782,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -6092,224 +6807,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://kms-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://kms-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://kms.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://kms.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -7292,7 +7958,20 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes tags from a customer managed key. To delete a tag,\n specify the tag key and the KMS key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

When it succeeds, the UntagResource operation doesn't return any output.\n Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\n return a response. To confirm that the operation worked, use the ListResourceTags operation.

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UntagResource (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Deletes tags from a customer managed key. To delete a tag,\n specify the tag key and the KMS key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

When it succeeds, the UntagResource operation doesn't return any output.\n Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\n return a response. To confirm that the operation worked, use the ListResourceTags operation.

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UntagResource (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To remove tags from a KMS key", + "documentation": "The following example removes tags from a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "TagKeys": [ + "Purpose", + "CostCenter" + ] + } + } + ] } }, "com.amazonaws.kms#UntagResourceRequest": { @@ -7343,7 +8022,17 @@ } ], "traits": { - "smithy.api#documentation": "

Associates an existing KMS alias with a different KMS key. Each alias is associated with\n only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\n KMS key must be in the same Amazon Web Services account and Region.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

The current and new KMS key must be the same type (both symmetric or both asymmetric or\n both HMAC), and they must have the same key usage. This restriction prevents errors in code\n that uses aliases. If you must assign an alias to a different type of KMS key, use DeleteAlias to delete the old alias and CreateAlias to create\n a new alias.

\n

You cannot use UpdateAlias to change an alias name. To change an alias name,\n use DeleteAlias to delete the old alias and CreateAlias to\n create a new alias.

\n

Because an alias is not a property of a KMS key, you can create, update, and delete the\n aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\n response from the DescribeKey operation. To get the aliases of all KMS keys\n in the account, use the ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Associates an existing KMS alias with a different KMS key. Each alias is associated with\n only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\n KMS key must be in the same Amazon Web Services account and Region.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

The current and new KMS key must be the same type (both symmetric or both asymmetric or\n both HMAC), and they must have the same key usage. This restriction prevents errors in code\n that uses aliases. If you must assign an alias to a different type of KMS key, use DeleteAlias to delete the old alias and CreateAlias to create\n a new alias.

\n

You cannot use UpdateAlias to change an alias name. To change an alias name,\n use DeleteAlias to delete the old alias and CreateAlias to\n create a new alias.

\n

Because an alias is not a property of a KMS key, you can create, update, and delete the\n aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\n response from the DescribeKey operation. To get the aliases of all KMS keys\n in the account, use the ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To update an alias", + "documentation": "The following example updates the specified alias to refer to the specified KMS key.", + "input": { + "AliasName": "alias/ExampleAlias", + "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#UpdateAliasRequest": { @@ -7430,7 +8119,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the properties of a custom key store. You can use this operation to change the\n properties of an CloudHSM key store or an external key store.

\n

Use the required CustomKeyStoreId parameter to identify the custom key store.\n Use the remaining optional parameters to change its properties. This operation does not return\n any property values. To verify the updated property values, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n \n

When updating the properties of an external key store, verify that the updated settings\n connect your key store, via the external key store proxy, to the same external key manager\n as the previous settings, or to a backup or snapshot of the external key manager with the\n same cryptographic keys. If the updated connection settings fail, you can fix them and\n retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\n permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\n unrecoverable.

\n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for updating an external key store.\n For details, see your external key manager documentation.

\n

When updating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot upload the proxy configuration\n file to the UpdateCustomKeyStore operation. However, you can use the file to\n help you determine the correct values for the UpdateCustomKeyStore\n parameters.

\n
\n

For an CloudHSM key store, you can use this operation to change the custom key store friendly\n name (NewCustomKeyStoreName), to tell KMS about a change to the\n kmsuser crypto user password (KeyStorePassword), or to associate\n the custom key store with a different, but related, CloudHSM cluster\n (CloudHsmClusterId). To update any property of an CloudHSM key store, the\n ConnectionState of the CloudHSM key store must be DISCONNECTED.

\n

For an external key store, you can use this operation to change the custom key store\n friendly name (NewCustomKeyStoreName), or to tell KMS about a change to the\n external key store proxy authentication credentials\n (XksProxyAuthenticationCredential), connection method\n (XksProxyConnectivity), external proxy endpoint\n (XksProxyUriEndpoint) and path (XksProxyUriPath). For external key\n stores with an XksProxyConnectivity of VPC_ENDPOINT_SERVICE, you can\n also update the Amazon VPC endpoint service name (XksProxyVpcEndpointServiceName). To\n update most properties of an external key store, the ConnectionState of the\n external key store must be DISCONNECTED. However, you can update the\n CustomKeyStoreName, XksProxyAuthenticationCredential, and\n XksProxyUriPath of an external key store when it is in the CONNECTED or\n DISCONNECTED state.

\n

If your update requires a DISCONNECTED state, before using\n UpdateCustomKeyStore, use the DisconnectCustomKeyStore\n operation to disconnect the custom key store. After the UpdateCustomKeyStore\n operation completes, use the ConnectCustomKeyStore to reconnect the custom\n key store. To find the ConnectionState of the custom key store, use the DescribeCustomKeyStores operation.

\n

\n

\n

Before updating the custom key store, verify that the new values allow KMS to connect\n the custom key store to its backing key store. For example, before you change the\n XksProxyUriPath value, verify that the external key store proxy is reachable at\n the new path.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Changes the properties of a custom key store. You can use this operation to change the\n properties of an CloudHSM key store or an external key store.

\n

Use the required CustomKeyStoreId parameter to identify the custom key store.\n Use the remaining optional parameters to change its properties. This operation does not return\n any property values. To verify the updated property values, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n \n

When updating the properties of an external key store, verify that the updated settings\n connect your key store, via the external key store proxy, to the same external key manager\n as the previous settings, or to a backup or snapshot of the external key manager with the\n same cryptographic keys. If the updated connection settings fail, you can fix them and\n retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\n permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\n unrecoverable.

\n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for updating an external key store.\n For details, see your external key manager documentation.

\n

When updating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot upload the proxy configuration\n file to the UpdateCustomKeyStore operation. However, you can use the file to\n help you determine the correct values for the UpdateCustomKeyStore\n parameters.

\n
\n

For an CloudHSM key store, you can use this operation to change the custom key store friendly\n name (NewCustomKeyStoreName), to tell KMS about a change to the\n kmsuser crypto user password (KeyStorePassword), or to associate\n the custom key store with a different, but related, CloudHSM cluster\n (CloudHsmClusterId). To update any property of an CloudHSM key store, the\n ConnectionState of the CloudHSM key store must be DISCONNECTED.

\n

For an external key store, you can use this operation to change the custom key store\n friendly name (NewCustomKeyStoreName), or to tell KMS about a change to the\n external key store proxy authentication credentials\n (XksProxyAuthenticationCredential), connection method\n (XksProxyConnectivity), external proxy endpoint\n (XksProxyUriEndpoint) and path (XksProxyUriPath). For external key\n stores with an XksProxyConnectivity of VPC_ENDPOINT_SERVICE, you can\n also update the Amazon VPC endpoint service name (XksProxyVpcEndpointServiceName). To\n update most properties of an external key store, the ConnectionState of the\n external key store must be DISCONNECTED. However, you can update the\n CustomKeyStoreName, XksProxyAuthenticationCredential, and\n XksProxyUriPath of an external key store when it is in the CONNECTED or\n DISCONNECTED state.

\n

If your update requires a DISCONNECTED state, before using\n UpdateCustomKeyStore, use the DisconnectCustomKeyStore\n operation to disconnect the custom key store. After the UpdateCustomKeyStore\n operation completes, use the ConnectCustomKeyStore to reconnect the custom\n key store. To find the ConnectionState of the custom key store, use the DescribeCustomKeyStores operation.

\n

\n

\n

Before updating the custom key store, verify that the new values allow KMS to connect\n the custom key store to its backing key store. For example, before you change the\n XksProxyUriPath value, verify that the external key store proxy is reachable at\n the new path.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To edit the friendly name of a custom key store", + "documentation": "This example changes the friendly name of the AWS KMS custom key store to the name that you specify. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0", + "NewCustomKeyStoreName": "DevelopmentKeys" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#UpdateCustomKeyStoreRequest": { @@ -7529,7 +8229,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the description of a KMS key. To see the description of a KMS key, use DescribeKey.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateKeyDescription (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Updates the description of a KMS key. To see the description of a KMS key, use DescribeKey.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateKeyDescription (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To update the description of a KMS key", + "documentation": "The following example updates the description of the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Description": "Example description that indicates the intended use of this KMS key." + } + } + ] } }, "com.amazonaws.kms#UpdateKeyDescriptionRequest": { @@ -7583,7 +8293,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the primary key of a multi-Region key.

\n

This operation changes the replica key in the specified Region to a primary key and\n changes the former primary key to a replica key. For example, suppose you have a primary key\n in us-east-1 and a replica key in eu-west-2. If you run\n UpdatePrimaryRegion with a PrimaryRegion value of\n eu-west-2, the primary key is now the key in eu-west-2, and the\n key in us-east-1 becomes a replica key. For details, see Updating the primary Region in the Key Management Service Developer Guide.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

The primary key of a multi-Region key is the source for properties\n that are always shared by primary and replica keys, including the key material, key ID, key spec, key usage, key material\n origin, and automatic\n key rotation. It's the only key that can be replicated. You cannot delete the primary\n key until all replica keys are deleted.

\n

The key ID and primary Region that you specify uniquely identify the replica key that will\n become the primary key. The primary Region must already have a replica key. This operation\n does not create a KMS key in the specified Region. To find the replica keys, use the DescribeKey operation on the primary key or any replica key. To create a replica\n key, use the ReplicateKey operation.

\n

You can run this operation while using the affected multi-Region keys in cryptographic\n operations. This operation should not delay, interrupt, or cause failures in cryptographic\n operations.

\n

Even after this operation completes, the process of updating the primary Region might\n still be in progress for a few more seconds. Operations such as DescribeKey might\n display both the old and new primary keys as replicas. The old and new primary keys have a\n transient key state of Updating. The original key state is restored when the\n update is complete. While the key state is Updating, you can use the keys in\n cryptographic operations, but you cannot replicate the new primary key or perform certain\n management operations, such as enabling or disabling these keys. For details about the\n Updating key state, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

This operation does not return any output. To verify that primary key is changed, use the\n DescribeKey operation.

\n

\n Cross-account use: No. You cannot use this operation in a\n different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:UpdatePrimaryRegion on the current primary key (in the primary key's\n Region). Include this permission primary key's key policy.

    \n
  • \n
  • \n

    \n kms:UpdatePrimaryRegion on the current replica key (in the replica key's\n Region). Include this permission in the replica key's key policy.

    \n
  • \n
\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Changes the primary key of a multi-Region key.

\n

This operation changes the replica key in the specified Region to a primary key and\n changes the former primary key to a replica key. For example, suppose you have a primary key\n in us-east-1 and a replica key in eu-west-2. If you run\n UpdatePrimaryRegion with a PrimaryRegion value of\n eu-west-2, the primary key is now the key in eu-west-2, and the\n key in us-east-1 becomes a replica key. For details, see Updating the primary Region in the Key Management Service Developer Guide.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

The primary key of a multi-Region key is the source for properties\n that are always shared by primary and replica keys, including the key material, key ID, key spec, key usage, key material\n origin, and automatic\n key rotation. It's the only key that can be replicated. You cannot delete the primary\n key until all replica keys are deleted.

\n

The key ID and primary Region that you specify uniquely identify the replica key that will\n become the primary key. The primary Region must already have a replica key. This operation\n does not create a KMS key in the specified Region. To find the replica keys, use the DescribeKey operation on the primary key or any replica key. To create a replica\n key, use the ReplicateKey operation.

\n

You can run this operation while using the affected multi-Region keys in cryptographic\n operations. This operation should not delay, interrupt, or cause failures in cryptographic\n operations.

\n

Even after this operation completes, the process of updating the primary Region might\n still be in progress for a few more seconds. Operations such as DescribeKey might\n display both the old and new primary keys as replicas. The old and new primary keys have a\n transient key state of Updating. The original key state is restored when the\n update is complete. While the key state is Updating, you can use the keys in\n cryptographic operations, but you cannot replicate the new primary key or perform certain\n management operations, such as enabling or disabling these keys. For details about the\n Updating key state, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

This operation does not return any output. To verify that primary key is changed, use the\n DescribeKey operation.

\n

\n Cross-account use: No. You cannot use this operation in a\n different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:UpdatePrimaryRegion on the current primary key (in the primary key's\n Region). Include this permission primary key's key policy.

    \n
  • \n
  • \n

    \n kms:UpdatePrimaryRegion on the current replica key (in the replica key's\n Region). Include this permission in the replica key's key policy.

    \n
  • \n
\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To update the primary Region of a multi-Region KMS key", + "documentation": "The following UpdatePrimaryRegion example changes the multi-Region replica key in the eu-central-1 Region to the primary key. The current primary key in the us-west-1 Region becomes a replica key. \n\nThe KeyId parameter identifies the current primary key in the us-west-1 Region. The PrimaryRegion parameter indicates the Region of the replica key that will become the new primary key.\n\nThis operation does not return any output. To verify that primary key is changed, use the DescribeKey operation.", + "input": { + "KeyId": "arn:aws:kms:us-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "PrimaryRegion": "eu-central-1" + } + } + ] } }, "com.amazonaws.kms#UpdatePrimaryRegionRequest": { @@ -7623,6 +8343,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -7646,7 +8369,25 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the\n same asymmetric KMS key, message, and signing algorithm that were used to produce the\n signature. The message type does not need to be the same as the one used for signing, but it must \n indicate whether the value of the Message parameter should be\n hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you must \n specify the distinguishing ID. By default, KMS uses 1234567812345678 as the \n distinguishing ID. For more information, see Offline verification\n with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

" + "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the same asymmetric KMS key, message,\n and signing algorithm that were used to produce the signature. The message type does not need\n to be the same as the one used for signing, but it must indicate whether the value of the\n Message parameter should be hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

", + "smithy.api#examples": [ + { + "title": "To use an asymmetric KMS key to verify a digital signature", + "documentation": "This operation uses the public key in an elliptic curve (ECC) asymmetric key to verify a digital signature within AWS KMS.", + "input": { + "KeyId": "alias/ECC_signing_key", + "Message": "", + "MessageType": "RAW", + "Signature": "", + "SigningAlgorithm": "ECDSA_SHA_384" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "SignatureValid": true, + "SigningAlgorithm": "ECDSA_SHA_384" + } + } + ] } }, "com.amazonaws.kms#VerifyMac": { @@ -7661,6 +8402,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -7684,7 +8428,24 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\n KMS key, and MAC algorithm. To verify the HMAC, VerifyMac computes an HMAC using\n the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\n to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\n otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\n calculated, and the specified key was used to generate and verify the HMAC.

\n

HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\n defined in RFC 2104.

\n

This operation is part of KMS support for HMAC KMS keys. For details, see\n HMAC keys in KMS in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:VerifyMac (key policy)

\n

\n Related operations: GenerateMac\n

" + "smithy.api#documentation": "

Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\n KMS key, and MAC algorithm. To verify the HMAC, VerifyMac computes an HMAC using\n the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\n to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\n otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\n calculated, and the specified key was used to generate and verify the HMAC.

\n

HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\n defined in RFC 2104.

\n

This operation is part of KMS support for HMAC KMS keys. For details, see\n HMAC keys in KMS in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:VerifyMac (key policy)

\n

\n Related operations: GenerateMac\n

", + "smithy.api#examples": [ + { + "title": "To verify an HMAC", + "documentation": "This example verifies an HMAC for a particular message, HMAC KMS keys, and MAC algorithm. A value of 'true' in the MacValid value in the response indicates that the HMAC is valid.", + "input": { + "Message": "Hello World", + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "MacAlgorithm": "HMAC_SHA_384", + "Mac": "" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "MacValid": true, + "MacAlgorithm": "HMAC_SHA_384" + } + } + ] } }, "com.amazonaws.kms#VerifyMacRequest": { @@ -7723,6 +8484,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -7769,14 +8536,14 @@ "Message": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\n or a hash digest of the message. If you submit a digest, use the MessageType parameter\n with a value of DIGEST.

\n

If the message specified here is different from the message that was signed, the signature\n verification fails. A message and its hash digest are considered to be the same\n message.

", + "smithy.api#documentation": "

Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\n or a hash digest of the message. If you submit a digest, use the MessageType\n parameter with a value of DIGEST.

\n

If the message specified here is different from the message that was signed, the signature\n verification fails. A message and its hash digest are considered to be the same\n message.

", "smithy.api#required": {} } }, "MessageType": { "target": "com.amazonaws.kms#MessageType", "traits": { - "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed\n as part of the signing algorithm. Use RAW for unhashed messages; use DIGEST\n for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST, KMS \n skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed message,\n the security of the verification operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length\n of the Message value must match the length of hashed messages for the specified signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, if the signed message is hashed once\n while signing, but twice while verifying, verification fails, even when the message hasn't changed.

\n

The hashing algorithm in that Verify uses is based on the SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline verification with SM2 key pairs.

    \n
  • \n
" + "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed as\n part of the signing algorithm. Use RAW for unhashed messages; use\n DIGEST for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST,\n KMS skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed\n message, the security of the verification operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length of the\n Message value must match the length of hashed messages for the specified\n signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, if the signed message\n is hashed once while signing, but twice while verifying, verification fails, even when the\n message hasn't changed.

\n

The hashing algorithm in that Verify uses is based on the\n SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline\n verification with SM2 key pairs.

    \n
  • \n
" } }, "Signature": { @@ -7798,6 +8565,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -7877,12 +8650,12 @@ "Id": { "target": "com.amazonaws.kms#XksKeyIdType", "traits": { - "smithy.api#documentation": "

The ID of the external key in its external key manager. This is the ID that the external key store proxy uses to identify the external key.

" + "smithy.api#documentation": "

The ID of the external key in its external key manager. This is the ID that the external\n key store proxy uses to identify the external key.

" } } }, "traits": { - "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an\n external key store.

\n

This element appears in a CreateKey or DescribeKey\n response only for a KMS key in an external key store.

\n

The external key is a symmetric encryption key that is hosted by\n an external key manager outside of Amazon Web Services. When you use the KMS key in an external key store\n in a cryptographic operation, the cryptographic operation is performed in the\n external key manager using the specified external key. For more information, see External key in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

Information about the external key that is\n associated with a KMS key in an external key store.

\n

This element appears in a CreateKey or DescribeKey\n response only for a KMS key in an external key store.

\n

The external key is a symmetric encryption key that is hosted by an\n external key manager outside of Amazon Web Services. When you use the KMS key in an external key store in a\n cryptographic operation, the cryptographic operation is performed in the external key manager\n using the specified external key. For more information, see External key in the\n Key Management Service Developer Guide.

" } }, "com.amazonaws.kms#XksKeyIdType": { @@ -7924,7 +8697,7 @@ "code": "XksKeyNotFoundException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

The request was rejected because the external key store proxy could not find the external key. This\n exception is thrown when the value of the XksKeyId parameter doesn't identify a\n key in the external key manager associated with the external key proxy.

\n

Verify that the XksKeyId represents an existing key in the external key\n manager. Use the key identifier that the external key store proxy uses to identify the key.\n For details, see the documentation provided with your external key store proxy or key\n manager.

", + "smithy.api#documentation": "

The request was rejected because the external key store proxy could not find the external\n key. This exception is thrown when the value of the XksKeyId parameter doesn't\n identify a key in the external key manager associated with the external key proxy.

\n

Verify that the XksKeyId represents an existing key in the external key\n manager. Use the key identifier that the external key store proxy uses to identify the key.\n For details, see the documentation provided with your external key store proxy or key\n manager.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } @@ -7985,7 +8758,7 @@ "AccessKeyId": { "target": "com.amazonaws.kms#XksProxyAuthenticationAccessKeyIdType", "traits": { - "smithy.api#documentation": "

The part of the external key store proxy authentication credential\n that uniquely identifies the secret access key.

" + "smithy.api#documentation": "

The part of the external key store proxy authentication credential that uniquely identifies the secret access\n key.

" } }, "UriEndpoint": { @@ -8145,7 +8918,7 @@ "code": "XksProxyUriUnreachableException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

KMS was unable to reach the specified XksProxyUriPath. The path must be\n reachable before you create the external key store or update its settings.

\n

This exception is also thrown when the external key store proxy response to a GetHealthStatus\n request indicates that all external key manager instances are unavailable.

", + "smithy.api#documentation": "

KMS was unable to reach the specified XksProxyUriPath. The path must be\n reachable before you create the external key store or update its settings.

\n

This exception is also thrown when the external key store proxy response to a\n GetHealthStatus request indicates that all external key manager instances are\n unavailable.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } @@ -8179,7 +8952,7 @@ "code": "XksProxyVpcEndpointServiceInvalidConfigurationException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\n the requirements for an external key store proxy. For details, see the exception message and\n review the requirements for Amazon VPC endpoint service connectivity for an external key\n store.

", + "smithy.api#documentation": "

The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\n the requirements for an external key store proxy. For details, see the exception message and\n review the\n requirements for Amazon VPC endpoint service connectivity for an external key\n store.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } diff --git a/aws/sdk/aws-models/lambda.json b/aws/sdk/aws-models/lambda.json index df1e4216396..9f2a524dd9c 100644 --- a/aws/sdk/aws-models/lambda.json +++ b/aws/sdk/aws-models/lambda.json @@ -306,52 +306,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -359,13 +363,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -375,224 +388,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://lambda.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://lambda.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -2567,13 +2531,13 @@ "StartingPosition": { "target": "com.amazonaws.lambda#EventSourcePosition", "traits": { - "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis, Amazon\n DynamoDB, and Amazon MSK Streams sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams and Amazon DocumentDB.

" + "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis and\n Amazon DynamoDB Stream event sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.

" } }, "StartingPositionTimestamp": { "target": "com.amazonaws.lambda#Date", "traits": { - "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading.

" + "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading. StartingPositionTimestamp cannot be in the future.

" } }, "DestinationConfig": { @@ -3133,6 +3097,9 @@ { "target": "com.amazonaws.lambda#InvalidParameterValueException" }, + { + "target": "com.amazonaws.lambda#ResourceConflictException" + }, { "target": "com.amazonaws.lambda#ResourceInUseException" }, @@ -3197,7 +3164,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a Lambda function. To delete a specific function version, use the Qualifier parameter.\n Otherwise, all versions and aliases are deleted.

\n

To delete Lambda event source mappings that invoke a function, use DeleteEventSourceMapping. For Amazon Web Services and resources that invoke your function\n directly, delete the trigger in the service where you originally configured it.

", + "smithy.api#documentation": "

Deletes a Lambda function. To delete a specific function version, use the Qualifier parameter.\n Otherwise, all versions and aliases are deleted. This doesn't require the user to have explicit\n permissions for DeleteAlias.

\n

To delete Lambda event source mappings that invoke a function, use DeleteEventSourceMapping. For Amazon Web Services and resources that invoke your function\n directly, delete the trigger in the service where you originally configured it.

", "smithy.api#http": { "method": "DELETE", "uri": "/2015-03-31/functions/{FunctionName}", @@ -3912,13 +3879,13 @@ "StartingPosition": { "target": "com.amazonaws.lambda#EventSourcePosition", "traits": { - "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis, Amazon DynamoDB, and Amazon MSK stream sources. AT_TIMESTAMP is supported only for Amazon Kinesis\n streams and Amazon DocumentDB.

" + "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis and\n Amazon DynamoDB Stream event sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.

" } }, "StartingPositionTimestamp": { "target": "com.amazonaws.lambda#Date", "traits": { - "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading.

" + "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading. StartingPositionTimestamp cannot be in the future.

" } }, "BatchSize": { @@ -6450,6 +6417,9 @@ { "target": "com.amazonaws.lambda#KMSNotFoundException" }, + { + "target": "com.amazonaws.lambda#RecursiveInvocationException" + }, { "target": "com.amazonaws.lambda#RequestTooLargeException" }, @@ -6666,6 +6636,9 @@ { "target": "com.amazonaws.lambda#KMSNotFoundException" }, + { + "target": "com.amazonaws.lambda#RecursiveInvocationException" + }, { "target": "com.amazonaws.lambda#RequestTooLargeException" }, @@ -9485,6 +9458,28 @@ } } }, + "com.amazonaws.lambda#RecursiveInvocationException": { + "type": "structure", + "members": { + "Type": { + "target": "com.amazonaws.lambda#String", + "traits": { + "smithy.api#documentation": "

The exception type.

" + } + }, + "Message": { + "target": "com.amazonaws.lambda#String", + "traits": { + "smithy.api#documentation": "

The exception message.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Lambda has detected your function being invoked in a recursive loop with other Amazon Web Services resources and stopped your function's invocation.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, "com.amazonaws.lambda#RemoveLayerVersionPermission": { "type": "operation", "input": { @@ -9948,6 +9943,12 @@ "traits": { "smithy.api#enumValue": "ruby3.2" } + }, + "python311": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "python3.11" + } } } }, @@ -10131,7 +10132,7 @@ } }, "traits": { - "smithy.api#documentation": "

The function's Lambda SnapStart setting. Set ApplyOn to PublishedVersions to create a\n snapshot of the initialized execution environment when you publish a function version.

\n

SnapStart is supported with the java11 runtime. For more information, see\n Improving startup performance with Lambda\n SnapStart.

" + "smithy.api#documentation": "

The function's Lambda SnapStart setting. Set ApplyOn to PublishedVersions to create a\n snapshot of the initialized execution environment when you publish a function version.

" } }, "com.amazonaws.lambda#SnapStartApplyOn": { diff --git a/aws/sdk/aws-models/polly.json b/aws/sdk/aws-models/polly.json index 219c1a0a927..55c468f5aea 100644 --- a/aws/sdk/aws-models/polly.json +++ b/aws/sdk/aws-models/polly.json @@ -62,6 +62,16 @@ ], "traits": { "smithy.api#documentation": "

Deletes the specified pronunciation lexicon stored in an Amazon Web Services Region. A lexicon which has been deleted is not available for\n speech synthesis, nor is it possible to retrieve it using either the\n GetLexicon or ListLexicon APIs.

\n

For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To delete a lexicon", + "documentation": "Deletes a specified pronunciation lexicon stored in an AWS Region.", + "input": { + "Name": "example" + }, + "output": {} + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/v1/lexicons/{Name}", @@ -110,6 +120,40 @@ ], "traits": { "smithy.api#documentation": "

Returns the list of voices that are available for use when\n requesting speech synthesis. Each voice speaks a specified language, is\n either male or female, and is identified by an ID, which is the ASCII\n version of the voice name.

\n

When synthesizing speech ( SynthesizeSpeech ), you\n provide the voice ID for the voice you want from the list of voices\n returned by DescribeVoices.

\n

For example, you want your news reader application to read news in\n a specific language, but giving a user the option to choose the voice.\n Using the DescribeVoices operation you can provide the user\n with a list of available voices to select from.

\n

You can optionally specify a language code to filter the available\n voices. For example, if you specify en-US, the operation\n returns a list of all available US English voices.

\n

This operation requires permissions to perform the\n polly:DescribeVoices action.

", + "smithy.api#examples": [ + { + "title": "To describe available voices", + "documentation": "Returns the list of voices that are available for use when requesting speech synthesis. Displayed languages are those within the specified language code. If no language code is specified, voices for all available languages are displayed.", + "input": { + "LanguageCode": "en-GB" + }, + "output": { + "Voices": [ + { + "Gender": "Female", + "Name": "Emma", + "LanguageName": "British English", + "Id": "Emma", + "LanguageCode": "en-GB" + }, + { + "Gender": "Male", + "Name": "Brian", + "LanguageName": "British English", + "Id": "Brian", + "LanguageCode": "en-GB" + }, + { + "Gender": "Female", + "Name": "Amy", + "LanguageName": "British English", + "Id": "Amy", + "LanguageCode": "en-GB" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/v1/voices", @@ -683,6 +727,18 @@ "traits": { "smithy.api#enumValue": "en-IE" } + }, + "nl_BE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "nl-BE" + } + }, + "fr_BE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "fr-BE" + } } } }, @@ -880,6 +936,27 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of pronunciation lexicons stored in an Amazon Web Services Region. For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To list all lexicons in a region", + "documentation": "Returns a list of pronunciation lexicons stored in an AWS Region.", + "output": { + "Lexicons": [ + { + "Attributes": { + "LanguageCode": "en-US", + "LastModified": 1.478542980117E9, + "Alphabet": "ipa", + "LexemesCount": 1, + "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example", + "Size": 503 + }, + "Name": "example" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/v1/lexicons", @@ -1211,52 +1288,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -1264,13 +1345,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -1280,224 +1370,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://polly-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://polly.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://polly.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -2162,6 +2203,17 @@ ], "traits": { "smithy.api#documentation": "

Stores a pronunciation lexicon in an Amazon Web Services Region. If\n a lexicon with the same name already exists in the region, it is\n overwritten by the new lexicon. Lexicon operations have eventual\n consistency, therefore, it might take some time before the lexicon is\n available to the SynthesizeSpeech operation.

\n

For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To save a lexicon", + "documentation": "Stores a pronunciation lexicon in an AWS Region.", + "input": { + "Name": "W3C", + "Content": "file://example.pls" + }, + "output": {} + } + ], "smithy.api#http": { "method": "PUT", "uri": "/v1/lexicons/{Name}", @@ -2597,6 +2649,27 @@ ], "traits": { "smithy.api#documentation": "

Synthesizes UTF-8 input, plain text or SSML, to a stream of bytes.\n SSML input must be valid, well-formed SSML. Some alphabets might not be\n available with all the voices (for example, Cyrillic might not be read at\n all by English voices) unless phoneme mapping is used. For more\n information, see How it Works.

", + "smithy.api#examples": [ + { + "title": "To synthesize speech", + "documentation": "Synthesizes plain text or SSML into a file of human-like speech.", + "input": { + "LexiconNames": [ + "example" + ], + "OutputFormat": "mp3", + "SampleRate": "8000", + "Text": "All Gaul is divided into three parts", + "TextType": "text", + "VoiceId": "Joanna" + }, + "output": { + "AudioStream": "TEXT", + "ContentType": "audio/mpeg", + "RequestCharacters": 37 + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/v1/speech", @@ -3389,6 +3462,24 @@ "traits": { "smithy.api#enumValue": "Sofie" } + }, + "Lisa": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Lisa" + } + }, + "Isabelle": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Isabelle" + } + }, + "Zayd": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Zayd" + } } } }, diff --git a/aws/sdk/aws-models/qldb-session.json b/aws/sdk/aws-models/qldb-session.json index b12ca953200..df4974f8c5d 100644 --- a/aws/sdk/aws-models/qldb-session.json +++ b/aws/sdk/aws-models/qldb-session.json @@ -326,7 +326,7 @@ "min": 1, "max": 32 }, - "smithy.api#pattern": "(?!^.*--)(?!^[0-9]+$)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$" + "smithy.api#pattern": "^(?!^.*--)(?!^[0-9]+$)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$" } }, "com.amazonaws.qldbsession#LimitExceededException": { @@ -471,52 +471,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -524,13 +528,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -540,224 +553,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://session.qldb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://session.qldb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://session.qldb-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://session.qldb-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://session.qldb.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://session.qldb.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://session.qldb.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://session.qldb.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1334,6 +1298,9 @@ "smithy.api#documentation": "

Command to fetch a page.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.qldbsession#SendCommandResult": { @@ -1381,6 +1348,9 @@ "smithy.api#documentation": "

Contains the details of the fetched page.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.qldbsession#SessionToken": { diff --git a/aws/sdk/aws-models/route53.json b/aws/sdk/aws-models/route53.json index 72d97074e35..cb171eb7c42 100644 --- a/aws/sdk/aws-models/route53.json +++ b/aws/sdk/aws-models/route53.json @@ -263,6 +263,7 @@ "arnNamespace": "route53", "cloudFormationName": "Route53", "cloudTrailEventSource": "route53.amazonaws.com", + "docId": "route53-2013-04-01", "endpointPrefix": "route53" }, "aws.auth#sigv4": { @@ -334,52 +335,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -387,597 +392,557 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53-fips.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53-fips.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-cn" + "name" ] }, + "aws-cn" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.amazonaws.com.cn", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "cn-northwest-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.amazonaws.com.cn", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "cn-northwest-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso" + "name" ] }, + "aws-iso" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://route53.c2s.ic.gov", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-iso-east-1" } - ], - "endpoint": { - "url": "https://route53.c2s.ic.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-iso-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso-b" + "name" ] }, + "aws-iso-b" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.sc2s.sgov.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-isob-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.sc2s.sgov.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-isob-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } - ], - "type": "tree", - "rules": [ + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "getAttr", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://route53-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://route53.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://route53.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1628,6 +1593,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ActivateKeySigningKeyResponse": { @@ -1639,6 +1607,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#AlarmIdentifier": { @@ -1747,6 +1718,28 @@ ], "traits": { "smithy.api#documentation": "

Associates an Amazon VPC with a private hosted zone.

\n \n

To perform the association, the VPC and the private hosted zone must already\n\t\t\t\texist. You can't convert a public hosted zone into a private hosted zone.

\n
\n \n

If you want to associate a VPC that was created by using one Amazon Web Services account with a private hosted zone that was created by using a\n\t\t\t\tdifferent account, the Amazon Web Services account that created the private hosted\n\t\t\t\tzone must first submit a CreateVPCAssociationAuthorization request.\n\t\t\t\tThen the account that created the VPC must submit an\n\t\t\t\t\tAssociateVPCWithHostedZone request.

\n
\n \n

When granting access, the hosted zone and the Amazon VPC must belong to\n\t\t\t\tthe same partition. A partition is a group of Amazon Web Services Regions. Each\n\t\t\t\t\tAmazon Web Services account is scoped to one partition.

\n

The following are the supported partitions:

\n
    \n
  • \n

    \n aws - Amazon Web Services Regions

    \n
  • \n
  • \n

    \n aws-cn - China Regions

    \n
  • \n
  • \n

    \n aws-us-gov - Amazon Web Services GovCloud (US) Region

    \n
  • \n
\n

For more information, see Access Management\n\t\t\t\tin the Amazon Web Services General Reference.

\n
", + "smithy.api#examples": [ + { + "title": "To associate a VPC with a hosted zone", + "documentation": "The following example associates the VPC with ID vpc-1a2b3c4d with the hosted zone with ID Z3M3LMPEXAMPLE.", + "input": { + "HostedZoneId": "Z3M3LMPEXAMPLE", + "VPC": { + "VPCId": "vpc-1a2b3c4d", + "VPCRegion": "us-east-2" + }, + "Comment": "" + }, + "output": { + "ChangeInfo": { + "Status": "INSYNC", + "Comment": "", + "SubmittedAt": "2017-01-31T01:36:41.958Z", + "Id": "/change/C3HC6WDB2UANE2" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/associatevpc", @@ -1780,7 +1773,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to associate a VPC with a\n\t\t\tprivate hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to associate a VPC with a\n\t\t\tprivate hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#AssociateVPCWithHostedZoneResponse": { @@ -1795,7 +1789,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tAssociateVPCWithHostedZone request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tAssociateVPCWithHostedZone request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Change": { @@ -1925,6 +1920,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeCidrCollectionResponse": { @@ -1937,6 +1935,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ChangeId": { @@ -2009,7 +2010,42 @@ } ], "traits": { - "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates\n\t\t\tyour changes to all of the Route 53 authoritative DNS servers. While your changes are\n\t\t\tpropagating, GetChange returns a status of PENDING. When\n\t\t\tpropagation is complete, GetChange returns a status of INSYNC.\n\t\t\tChanges generally propagate to all Route 53 name servers within 60 seconds. For more\n\t\t\tinformation, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates your\n\t\t\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\n\t\t\tyour changes are propagating, GetChange returns a status of\n\t\t\t\tPENDING. When propagation is complete, GetChange returns a\n\t\t\tstatus of INSYNC. Changes generally propagate to all Route 53 name servers\n\t\t\tmanaging the hosted zone within 60 seconds. For more information, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a basic resource record set", + "documentation": "The following example creates a resource record set that routes Internet traffic to a resource with an IP address of 192.0.2.44.", + "input": { + "HostedZoneId": "Z3M3LMPEXAMPLE", + "ChangeBatch": { + "Comment": "Web server for example.com", + "Changes": [ + { + "Action": "CREATE", + "ResourceRecordSet": { + "Name": "example.com", + "Type": "A", + "TTL": 60, + "ResourceRecords": [ + { + "Value": "192.0.2.44" + } + ] + } + } + ] + } + }, + "output": { + "ChangeInfo": { + "Comment": "Web server for example.com", + "Id": "/change/C2682N5HXP0BZ4", + "Status": "PENDING", + "SubmittedAt": "2017-02-10T01:36:41.958Z" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/rrset", @@ -2037,7 +2073,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains change information for the resource record set.

" + "smithy.api#documentation": "

A complex type that contains change information for the resource record set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeResourceRecordSetsResponse": { @@ -2052,7 +2089,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response for the request.

" + "smithy.api#documentation": "

A complex type containing the response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ChangeStatus": { @@ -2099,6 +2137,30 @@ ], "traits": { "smithy.api#documentation": "

Adds, edits, or deletes tags for a health check or a hosted zone.

\n

For information about using tags for cost allocation, see Using Cost Allocation\n\t\t\t\tTags in the Billing and Cost Management User Guide.

", + "smithy.api#examples": [ + { + "title": "To add or remove tags from a hosted zone or health check", + "documentation": "The following example adds two tags and removes one tag from the hosted zone with ID Z3M3LMPEXAMPLE.", + "input": { + "ResourceType": "hostedzone", + "ResourceId": "Z3M3LMPEXAMPLE", + "AddTags": [ + { + "Key": "apex", + "Value": "3874" + }, + { + "Key": "acme", + "Value": "4938" + } + ], + "RemoveTagKeys": [ + "Nadir" + ] + }, + "output": {} + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/tags/{ResourceType}/{ResourceId}", @@ -2139,14 +2201,16 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the tags that you want to add, edit, or\n\t\t\tdelete.

" + "smithy.api#documentation": "

A complex type that contains information about the tags that you want to add, edit, or\n\t\t\tdelete.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeTagsForResourceResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty response for the request.

" + "smithy.api#documentation": "

Empty response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Changes": { @@ -2700,6 +2764,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { @@ -2886,6 +2956,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateCidrCollectionResponse": { @@ -2904,6 +2977,9 @@ "smithy.api#httpHeader": "Location" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateHealthCheck": { @@ -2953,7 +3029,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the health check request information.

" + "smithy.api#documentation": "

A complex type that contains the health check request information.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateHealthCheckResponse": { @@ -2976,7 +3053,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the new health check.

" + "smithy.api#documentation": "

A complex type containing the response information for the new health check.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateHostedZone": { @@ -3057,12 +3135,13 @@ "DelegationSetId": { "target": "com.amazonaws.route53#ResourceId", "traits": { - "smithy.api#documentation": "

If you want to associate a reusable delegation set with this hosted zone, the ID that\n\t\t\t\tAmazon Route 53 assigned to the reusable delegation set when you created it.\n\t\t\tFor more information about reusable delegation sets, see CreateReusableDelegationSet.

" + "smithy.api#documentation": "

If you want to associate a reusable delegation set with this hosted zone, the ID that\n\t\t\t\tAmazon Route 53 assigned to the reusable delegation set when you created it.\n\t\t\tFor more information about reusable delegation sets, see CreateReusableDelegationSet.

\n

If you are using a reusable delegation set to create a public hosted zone for a subdomain,\n\t\t\tmake sure that the parent hosted zone doesn't use one or more of the same name servers.\n\t\t\tIf you have overlapping nameservers, the operation will cause a\n\t\t\t\tConflictingDomainsExist error.

" } } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a public or\n\t\t\tprivate hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a public or\n\t\t\tprivate hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateHostedZoneResponse": { @@ -3105,7 +3184,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the hosted zone.

" + "smithy.api#documentation": "

A complex type containing the response information for the hosted zone.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateKeySigningKey": { @@ -3195,6 +3275,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateKeySigningKeyResponse": { @@ -3221,6 +3304,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateQueryLoggingConfig": { @@ -3277,6 +3363,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateQueryLoggingConfigResponse": { @@ -3297,6 +3386,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateReusableDelegationSet": { @@ -3355,6 +3447,9 @@ "smithy.api#documentation": "

If you want to mark the delegation set for an existing hosted zone as reusable, the ID\n\t\t\tfor that hosted zone.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateReusableDelegationSetResponse": { @@ -3375,6 +3470,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicy": { @@ -3482,7 +3580,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto create based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto create based on a specified traffic policy.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyInstanceResponse": { @@ -3505,7 +3604,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyInstance request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyInstance request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicyRequest": { @@ -3533,7 +3633,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyResponse": { @@ -3556,7 +3657,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicy request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicy request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicyVersion": { @@ -3619,7 +3721,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate a new version for.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate a new version for.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyVersionResponse": { @@ -3642,7 +3745,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyVersion request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyVersion request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateVPCAssociationAuthorization": { @@ -3699,7 +3803,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to authorize associating a\n\t\t\tVPC with your private hosted zone. Authorization is only required when a private hosted\n\t\t\tzone and a VPC were created by using different accounts.

" + "smithy.api#documentation": "

A complex type that contains information about the request to authorize associating a\n\t\t\tVPC with your private hosted zone. Authorization is only required when a private hosted\n\t\t\tzone and a VPC were created by using different accounts.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateVPCAssociationAuthorizationResponse": { @@ -3721,7 +3826,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information from a\n\t\t\t\tCreateVPCAssociationAuthorization request.

" + "smithy.api#documentation": "

A complex type that contains the response information from a\n\t\t\t\tCreateVPCAssociationAuthorization request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DNSName": { @@ -3828,6 +3934,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeactivateKeySigningKeyResponse": { @@ -3839,6 +3948,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#DelegationSet": { @@ -4008,11 +4120,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteCidrCollectionResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.route53#DeleteHealthCheck": { "type": "operation", @@ -4055,14 +4173,16 @@ } }, "traits": { - "smithy.api#documentation": "

This action deletes a health check.

" + "smithy.api#documentation": "

This action deletes a health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteHealthCheckResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteHostedZone": { @@ -4112,7 +4232,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a hosted zone.

" + "smithy.api#documentation": "

A request to delete a hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteHostedZoneResponse": { @@ -4127,7 +4248,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a DeleteHostedZone\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a DeleteHostedZone\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteKeySigningKey": { @@ -4186,6 +4308,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteKeySigningKeyResponse": { @@ -4197,6 +4322,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteQueryLoggingConfig": { @@ -4238,11 +4366,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteQueryLoggingConfigResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.route53#DeleteReusableDelegationSet": { "type": "operation", @@ -4288,14 +4422,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a reusable delegation set.

" + "smithy.api#documentation": "

A request to delete a reusable delegation set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteReusableDelegationSetResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteTrafficPolicy": { @@ -4370,14 +4506,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a specified traffic policy instance.

" + "smithy.api#documentation": "

A request to delete a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyInstanceResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyRequest": { @@ -4401,14 +4539,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a specified traffic policy version.

" + "smithy.api#documentation": "

A request to delete a specified traffic policy version.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteVPCAssociationAuthorization": { @@ -4465,14 +4605,16 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to remove authorization to\n\t\t\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\n\t\t\tthat was created with a different Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains information about the request to remove authorization to\n\t\t\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\n\t\t\tthat was created with a different Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteVPCAssociationAuthorizationResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty response for the request.

" + "smithy.api#documentation": "

Empty response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Dimension": { @@ -4575,6 +4717,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DisableHostedZoneDNSSECResponse": { @@ -4586,6 +4731,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#Disabled": { @@ -4654,7 +4802,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the VPC that you want to disassociate\n\t\t\tfrom a specified private hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the VPC that you want to disassociate\n\t\t\tfrom a specified private hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DisassociateVPCFromHostedZoneResponse": { @@ -4669,7 +4818,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the disassociate\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response information for the disassociate\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#EnableHostedZoneDNSSEC": { @@ -4729,6 +4879,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#EnableHostedZoneDNSSECResponse": { @@ -4740,6 +4893,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#EnableSNI": { @@ -4951,7 +5107,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetAccountLimitResponse": { @@ -4974,7 +5131,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetChange": { @@ -4994,7 +5152,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the current status of a change batch request. The status is one of the\n\t\t\tfollowing values:

\n
    \n
  • \n

    \n PENDING indicates that the changes in this request have not\n\t\t\t\t\tpropagated to all Amazon Route 53 DNS servers. This is the initial status of all\n\t\t\t\t\tchange batch requests.

    \n
  • \n
  • \n

    \n INSYNC indicates that the changes have propagated to all Route 53\n\t\t\t\t\tDNS servers.

    \n
  • \n
", + "smithy.api#documentation": "

Returns the current status of a change batch request. The status is one of the\n\t\t\tfollowing values:

\n
    \n
  • \n

    \n PENDING indicates that the changes in this request have not\n\t\t\t\t\tpropagated to all Amazon Route 53 DNS servers managing the hosted zone. This is the initial status of all\n\t\t\t\t\tchange batch requests.

    \n
  • \n
  • \n

    \n INSYNC indicates that the changes have propagated to all Route 53\n\t\t\t\t\tDNS servers managing the hosted zone.

    \n
  • \n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/change/{Id}", @@ -5032,7 +5190,8 @@ } }, "traits": { - "smithy.api#documentation": "

The input for a GetChange request.

" + "smithy.api#documentation": "

The input for a GetChange request.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetChangeResponse": { @@ -5047,7 +5206,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the ChangeInfo element.

" + "smithy.api#documentation": "

A complex type that contains the ChangeInfo element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetCheckerIpRanges": { @@ -5071,7 +5231,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty request.

" + "smithy.api#documentation": "

Empty request.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetCheckerIpRangesResponse": { @@ -5086,7 +5247,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the CheckerIpRanges element.

" + "smithy.api#documentation": "

A complex type that contains the CheckerIpRanges element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetDNSSEC": { @@ -5128,6 +5290,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#GetDNSSECResponse": { @@ -5147,6 +5312,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#GetGeoLocation": { @@ -5200,7 +5368,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for information about whether a specified geographic location is supported\n\t\t\tfor Amazon Route 53 geolocation resource record sets.

" + "smithy.api#documentation": "

A request for information about whether a specified geographic location is supported\n\t\t\tfor Amazon Route 53 geolocation resource record sets.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetGeoLocationResponse": { @@ -5215,7 +5384,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the specified geolocation\n\t\t\tcode.

" + "smithy.api#documentation": "

A complex type that contains the response information for the specified geolocation\n\t\t\tcode.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheck": { @@ -5267,7 +5437,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

A request for the number of health checks that are associated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request for the number of health checks that are associated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckCountResponse": { @@ -5282,7 +5453,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheckCount\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheckCount\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckLastFailureReason": { @@ -5323,7 +5495,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the reason that a health check failed most recently.

" + "smithy.api#documentation": "

A request for the reason that a health check failed most recently.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckLastFailureReasonResponse": { @@ -5338,7 +5511,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a\n\t\t\t\tGetHealthCheckLastFailureReason request.

" + "smithy.api#documentation": "

A complex type that contains the response to a\n\t\t\t\tGetHealthCheckLastFailureReason request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckRequest": { @@ -5354,7 +5528,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified health check.

" + "smithy.api#documentation": "

A request to get information about a specified health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckResponse": { @@ -5369,7 +5544,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckStatus": { @@ -5410,7 +5586,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get the status for a health check.

" + "smithy.api#documentation": "

A request to get the status for a health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckStatusResponse": { @@ -5425,7 +5602,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZone": { @@ -5446,6 +5624,34 @@ ], "traits": { "smithy.api#documentation": "

Gets information about a specified hosted zone including the four name servers\n\t\t\tassigned to the hosted zone.

", + "smithy.api#examples": [ + { + "title": "To get information about a hosted zone", + "documentation": "The following example gets information about the Z3M3LMPEXAMPLE hosted zone.", + "input": { + "Id": "Z3M3LMPEXAMPLE" + }, + "output": { + "HostedZone": { + "ResourceRecordSetCount": 8, + "CallerReference": "C741617D-04E4-F8DE-B9D7-0D150FC61C2E", + "Config": { + "PrivateZone": false + }, + "Id": "/hostedzone/Z3M3LMPEXAMPLE", + "Name": "myawsbucket.com." + }, + "DelegationSet": { + "NameServers": [ + "ns-2048.awsdns-64.com", + "ns-2049.awsdns-65.net", + "ns-2050.awsdns-66.org", + "ns-2051.awsdns-67.co.uk" + ] + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/hostedzone/{Id}", @@ -5479,7 +5685,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

A request to retrieve a count of all the hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a count of all the hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneCountResponse": { @@ -5494,7 +5701,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHostedZoneCount\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHostedZoneCount\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZoneLimit": { @@ -5546,7 +5754,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneLimitResponse": { @@ -5569,7 +5778,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZoneRequest": { @@ -5585,7 +5795,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified hosted zone.

" + "smithy.api#documentation": "

A request to get information about a specified hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneResponse": { @@ -5612,7 +5823,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contain the response to a GetHostedZone\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contain the response to a GetHostedZone\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetQueryLoggingConfig": { @@ -5651,6 +5863,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#GetQueryLoggingConfigResponse": { @@ -5663,6 +5878,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#GetReusableDelegationSet": { @@ -5739,7 +5957,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetReusableDelegationSetLimitResponse": { @@ -5762,7 +5981,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetReusableDelegationSetRequest": { @@ -5778,7 +5998,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified reusable delegation set.

" + "smithy.api#documentation": "

A request to get information about a specified reusable delegation set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetReusableDelegationSetResponse": { @@ -5793,7 +6014,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the GetReusableDelegationSet\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the GetReusableDelegationSet\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicy": { @@ -5867,7 +6089,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Request to get the number of traffic policy instances that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

Request to get the number of traffic policy instances that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceCountResponse": { @@ -5882,7 +6105,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceRequest": { @@ -5898,7 +6122,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

" + "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceResponse": { @@ -5913,7 +6138,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicyRequest": { @@ -5937,7 +6163,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets information about a specific traffic policy version.

" + "smithy.api#documentation": "

Gets information about a specific traffic policy version.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyResponse": { @@ -5952,7 +6179,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#HealthCheck": { @@ -7160,6 +7388,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrBlocksResponse": { @@ -7177,6 +7408,9 @@ "smithy.api#documentation": "

A complex type that contains information about the CIDR blocks.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListCidrCollections": { @@ -7224,6 +7458,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrCollectionsResponse": { @@ -7241,6 +7478,9 @@ "smithy.api#documentation": "

A complex type with information about the CIDR collection.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListCidrLocations": { @@ -7299,6 +7539,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrLocationsResponse": { @@ -7316,6 +7559,9 @@ "smithy.api#documentation": "

A complex type that contains information about the list of CIDR locations.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListGeoLocations": { @@ -7373,7 +7619,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get a list of geographic locations that Amazon Route 53 supports for\n\t\t\tgeolocation resource record sets.

" + "smithy.api#documentation": "

A request to get a list of geographic locations that Amazon Route 53 supports for\n\t\t\tgeolocation resource record sets.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListGeoLocationsResponse": { @@ -7421,7 +7668,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the request.

" + "smithy.api#documentation": "

A complex type containing the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHealthChecks": { @@ -7474,7 +7722,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to retrieve a list of the health checks that are associated with the current\n\t\t\t\tAmazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a list of the health checks that are associated with the current\n\t\t\t\tAmazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHealthChecksResponse": { @@ -7517,7 +7766,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a ListHealthChecks\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a ListHealthChecks\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZones": { @@ -7605,7 +7855,8 @@ } }, "traits": { - "smithy.api#documentation": "

Retrieves a list of the public and private hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account in ASCII order by domain name.

" + "smithy.api#documentation": "

Retrieves a list of the public and private hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account in ASCII order by domain name.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesByNameResponse": { @@ -7659,7 +7910,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZonesByVPC": { @@ -7722,7 +7974,8 @@ } }, "traits": { - "smithy.api#documentation": "

Lists all the private hosted zones that a specified VPC is associated with, regardless\n\t\t\tof which Amazon Web Services account created the hosted zones.

" + "smithy.api#documentation": "

Lists all the private hosted zones that a specified VPC is associated with, regardless\n\t\t\tof which Amazon Web Services account created the hosted zones.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesByVPCResponse": { @@ -7748,6 +8001,9 @@ "smithy.api#documentation": "

The value that you will use for NextToken in the next\n\t\t\t\tListHostedZonesByVPC request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZonesRequest": { @@ -7776,7 +8032,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to retrieve a list of the public and private hosted zones that are\n\t\t\tassociated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a list of the public and private hosted zones that are\n\t\t\tassociated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesResponse": { @@ -7817,6 +8074,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListQueryLoggingConfigs": { @@ -7877,6 +8137,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListQueryLoggingConfigsResponse": { @@ -7895,6 +8158,9 @@ "smithy.api#documentation": "

If a response includes the last of the query logging configurations that are\n\t\t\tassociated with the current Amazon Web Services account, NextToken doesn't\n\t\t\tappear in the response.

\n

If a response doesn't include the last of the configurations, you can get more\n\t\t\tconfigurations by submitting another ListQueryLoggingConfigs request. Get the value of NextToken\n\t\t\tthat Amazon Route 53 returned in the previous response and include it in\n\t\t\t\tNextToken in the next request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListResourceRecordSets": { @@ -7963,7 +8229,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the resource record sets that are associated with a specified hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A request for the resource record sets that are associated with a specified hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListResourceRecordSetsResponse": { @@ -8011,7 +8278,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains list information for the resource record set.

" + "smithy.api#documentation": "

A complex type that contains list information for the resource record set.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListReusableDelegationSets": { @@ -8055,7 +8323,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get a list of the reusable delegation sets that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

A request to get a list of the reusable delegation sets that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListReusableDelegationSetsResponse": { @@ -8098,7 +8367,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the reusable delegation sets that are\n\t\t\tassociated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains information about the reusable delegation sets that are\n\t\t\tassociated with the current Amazon Web Services account.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTagsForResource": { @@ -8156,7 +8426,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing information about a request for a list of the tags that are\n\t\t\tassociated with an individual resource.

" + "smithy.api#documentation": "

A complex type containing information about a request for a list of the tags that are\n\t\t\tassociated with an individual resource.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTagsForResourceResponse": { @@ -8171,7 +8442,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

" + "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTagsForResources": { @@ -8228,7 +8500,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

" + "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTagsForResourcesResponse": { @@ -8243,7 +8516,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing tags for the specified resources.

" + "smithy.api#documentation": "

A complex type containing tags for the specified resources.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicies": { @@ -8287,7 +8561,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list the traffic\n\t\t\tpolicies that are associated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list the traffic\n\t\t\tpolicies that are associated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPoliciesResponse": { @@ -8324,7 +8599,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstances": { @@ -8414,7 +8690,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the traffic policy instances that you created in a specified hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A request for the traffic policy instances that you created in a specified hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneResponse": { @@ -8456,7 +8733,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByPolicy": { @@ -8536,7 +8814,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicy instances.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicy instances.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyResponse": { @@ -8584,7 +8863,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesRequest": { @@ -8620,7 +8900,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about the traffic policy instances that you created by\n\t\t\tusing the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request to get information about the traffic policy instances that you created by\n\t\t\tusing the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesResponse": { @@ -8668,7 +8949,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyVersions": { @@ -8723,7 +9005,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicies.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicies.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyVersionsResponse": { @@ -8760,7 +9043,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListVPCAssociationAuthorizations": { @@ -8818,7 +9102,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about that can be associated with your hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about that can be associated with your hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListVPCAssociationAuthorizationsResponse": { @@ -8846,7 +9131,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#LocationSummaries": { @@ -9744,6 +10030,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { @@ -10147,7 +10439,7 @@ } ], "traits": { - "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

\n

This call only supports querying public hosted zones.

", + "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

\n

This call only supports querying public hosted zones.

\n \n

The TestDnsAnswer returns information similar to what you would expect from the answer\n\t\t\tsection of the dig command. Therefore, if you query for the name\n\t\t\tservers of a subdomain that point to the parent name servers, those will not be\n\t\t\treturned.

\n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/testdnsanswer", @@ -10205,7 +10497,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

" + "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#TestDNSAnswerResponse": { @@ -10255,7 +10548,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a TestDNSAnswer request.\n\t\t

" + "smithy.api#documentation": "

A complex type that contains the response to a TestDNSAnswer request.\n\t\t

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Threshold": { @@ -10834,7 +11128,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about a request to update a health\n\t\t\tcheck.

" + "smithy.api#documentation": "

A complex type that contains information about a request to update a health\n\t\t\tcheck.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateHealthCheckResponse": { @@ -10849,7 +11144,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the UpdateHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the UpdateHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateHostedZoneComment": { @@ -10899,7 +11195,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to update the comment for a hosted zone.

" + "smithy.api#documentation": "

A request to update the comment for a hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateHostedZoneCommentResponse": { @@ -10914,7 +11211,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the UpdateHostedZoneComment\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the UpdateHostedZoneComment\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyComment": { @@ -10973,7 +11271,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tupdate the comment for.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tupdate the comment for.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyCommentResponse": { @@ -10988,7 +11287,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the traffic policy.

" + "smithy.api#documentation": "

A complex type that contains the response information for the traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyInstance": { @@ -11059,7 +11359,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto update based on a specified traffic policy instance.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto update based on a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyInstanceResponse": { @@ -11074,7 +11375,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UsageCount": { @@ -11345,6 +11647,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { diff --git a/aws/sdk/aws-models/s3.json b/aws/sdk/aws-models/s3.json index f0227a4af82..d63436f320d 100644 --- a/aws/sdk/aws-models/s3.json +++ b/aws/sdk/aws-models/s3.json @@ -44,7 +44,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will\n wait before permanently removing all parts of the upload. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration in the\n Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will\n wait before permanently removing all parts of the upload. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration in\n the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#AbortMultipartUpload": { @@ -101,7 +101,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name to which the upload was taking place.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name to which the upload was taking place.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -595,7 +595,8 @@ }, "ForcePathStyle": { "builtIn": "AWS::S3::ForcePathStyle", - "required": false, + "required": true, + "default": false, "documentation": "When true, force a path-style endpoint to be used where the bucket name is part of the path.", "type": "Boolean" }, @@ -639,100 +640,357 @@ }, "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Accelerate cannot be used with FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "error": "Cannot set dual-stack in combination with a custom endpoint.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "A custom endpoint cannot be combined with FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "A custom endpoint cannot be combined with S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, { "conditions": [ { "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 49, + 50, + true + ], + "assign": "hardwareType" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 8, + 12, + true + ], + "assign": "regionPrefix" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 0, + 7, + true + ], + "assign": "bucketAliasSuffix" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 32, + 49, + true + ], + "assign": "outpostId" + }, + { + "fn": "aws.partition", "argv": [ { "ref": "Region" } + ], + "assign": "regionPartition" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "bucketAliasSuffix" + }, + "--op-s3" ] } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "Bucket" - } + "ref": "hardwareType" + }, + "e" ] - }, + } + ], + "type": "tree", + "rules": [ { - "fn": "substring", - "argv": [ + "conditions": [ { - "ref": "Bucket" - }, - 49, - 50, - true + "fn": "stringEquals", + "argv": [ + { + "ref": "regionPrefix" + }, + "beta" + ] + } ], - "assign": "hardwareType" - }, - { - "fn": "substring", - "argv": [ + "type": "tree", + "rules": [ { - "ref": "Bucket" + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + } + ], + "error": "Expected a endpoint to be specified but no endpoint was found", + "type": "error" }, - 8, - 12, - true - ], - "assign": "regionPrefix" - }, - { - "fn": "substring", - "argv": [ { - "ref": "Bucket" - }, - 0, - 7, - true - ], - "assign": "abbaSuffix" + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "https://{Bucket}.ec2.{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] }, { - "fn": "substring", - "argv": [ - { - "ref": "Bucket" + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] }, - 32, - 49, - true - ], - "assign": "outpostId" - }, - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "regionPartition" - }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ { "fn": "stringEquals", "argv": [ { - "ref": "abbaSuffix" + "ref": "hardwareType" }, - "--op-s3" + "o" ] } ], @@ -741,11920 +999,6848 @@ { "conditions": [ { - "fn": "isValidHostLabel", + "fn": "stringEquals", "argv": [ { - "ref": "outpostId" + "ref": "regionPrefix" }, - false + "beta" ] } ], "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "ref": "hardwareType" - }, - "e" + "ref": "Endpoint" + } ] } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "regionPrefix" - }, - "beta" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } - ], - "error": "Expected a endpoint to be specified but no endpoint was found", - "type": "error" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{Bucket}.ec2.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + ] + } + ], + "error": "Expected a endpoint to be specified but no endpoint was found", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "Endpoint" } ] }, { - "conditions": [ + "fn": "parseURL", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "hardwareType" - }, - "o" - ] + "ref": "Endpoint" } ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "regionPrefix" - }, - "beta" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } - ], - "error": "Expected a endpoint to be specified but no endpoint was found", - "type": "error" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{Bucket}.op-{outpostId}.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + "assign": "url" + } + ], + "endpoint": { + "url": "https://{Bucket}.op-{outpostId}.{url#authority}", + "properties": { + "authSchemes": [ { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" } ] }, - { - "conditions": [], - "error": "Unrecognized hardware type: \"Expected hardware type o or e but got {hardwareType}\"", - "type": "error" - } - ] + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" + "endpoint": { + "url": "https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [ + "conditions": [], + "error": "Unrecognized hardware type: \"Expected hardware type o or e but got {hardwareType}\"", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "not", + "argv": [ { "fn": "isSet", "argv": [ { - "ref": "Bucket" + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ] } ] } + ] + } + ], + "error": "Custom endpoint `{Endpoint}` was not a valid URI", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "aws.isVirtualHostableS3Bucket", + "argv": [ + { + "ref": "Bucket" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "not", + "fn": "isValidHostLabel", "argv": [ { - "fn": "isSet", - "argv": [ - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } + "ref": "Region" + }, + false ] } ], - "error": "Custom endpoint `{Endpoint}` was not a valid URI", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "booleanEquals", "argv": [ { - "ref": "ForcePathStyle" - } + "ref": "Accelerate" + }, + true ] }, { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ { - "ref": "ForcePathStyle" + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] }, - true + "aws-cn" ] } ], - "type": "tree", - "rules": [ + "error": "S3 Accelerate cannot be used in this region", + "type": "error" + }, + { + "conditions": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ] + "ref": "Endpoint" } - ], - "error": "Path-style addressing cannot be used with ARN buckets", - "type": "error" + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [ + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ { - "fn": "uriEncode", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "uri_encoded_bucket" + "ref": "Endpoint" } - ], - "type": "tree", - "rules": [ + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "Cannot set dual-stack in combination with a custom endpoint.", - "type": "error" + "ref": "Region" }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Path-style addressing cannot be used with S3 Accelerate", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [ - { - "fn": "aws.isVirtualHostableS3Bucket", - "argv": [ - { - "ref": "Bucket" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "Accelerate cannot be used with FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "S3 Accelerate cannot be used in this region", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "scheme" - ] - }, - "http" - ] - }, - { - "fn": "aws.isVirtualHostableS3Bucket", - "argv": [ - { - "ref": "Bucket" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "bucketArn" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[0]" - ], - "assign": "arnType" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-object-lambda" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "accessPointName" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "accessPointName" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "DisableAccessPoints" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableAccessPoints" - }, - true - ] - } - ], - "error": "Access points are not supported for this operation", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ] - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - "" - ] - } - ], - "error": "Invalid ARN: Missing account id", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: bucket ARN is missing a region", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "accessPointName" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "accessPointName" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "DisableAccessPoints" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableAccessPoints" - }, - true - ] - } - ], - "error": "Access points are not supported for this operation", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ] - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "{partitionResult#name}" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "Access Points do not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "DualStack cannot be combined with a Host override (PrivateLink)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: bucket ARN is missing a region", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 MRAP does not support dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 MRAP does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 MRAP does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableMultiRegionAccessPoints" - }, - true - ] - } - ], - "error": "Invalid configuration: Multi-Region Access Point ARNs are disabled.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "mrapPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "mrapPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "partition" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4a", - "signingName": "s3", - "signingRegionSet": [ - "*" - ] - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "{Region} was not a valid region", - "type": "error" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid Access Point Name", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-outposts" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Outposts does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 Outposts does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Outposts does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[4]" - ] - } - ] - } - ], - "error": "Invalid Arn: Outpost Access Point ARN contains sub resources", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "outpostId" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "outpostId" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[3]" - ], - "assign": "accessPointName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Expected an outpost type `accesspoint`, found {outpostType}", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected an access point name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region {bucketArn#region}", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: No ARN type specified", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "substring", - "argv": [ - { - "ref": "Bucket" - }, - 0, - 4, - false - ], - "assign": "arnPrefix" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnPrefix" - }, - "arn:" - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ] - } - ] - } - ] - } - ], - "error": "Invalid ARN: `{Bucket}` was not a valid ARN", - "type": "error" - }, - { - "conditions": [ - { - "fn": "uriEncode", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "uri_encoded_bucket" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "Cannot set dual-stack in combination with a custom endpoint.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Path-style addressing cannot be used with S3 Accelerate", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseObjectLambdaEndpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseObjectLambdaEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Bucket" - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "scheme" + ] + }, + "http" + ] + }, + { + "fn": "aws.isVirtualHostableS3Bucket", + "argv": [ + { + "ref": "Bucket" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "bucketArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[0]" + ], + "assign": "arnType" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-object-lambda" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "accessPointName" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "accessPointName" }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "UseDualStack" }, + true + ] + } + ], + "error": "S3 Object Lambda does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] + "ref": "Accelerate" }, + true + ] + } + ], + "error": "S3 Object Lambda does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "bucketArn" }, - true + "region" ] }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, + "ref": "DisableAccessPoints" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" + "ref": "DisableAccessPoints" }, + true + ] + } + ], + "error": "Access points are not supported for this operation", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "fn": "not", + "fn": "isSet", "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "bucketArn" }, - "aws-global" + "resourceId[2]" ] } ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "isSet", "argv": [ { - "ref": "UseFIPS" - }, - false + "ref": "UseArnRegion" + } ] }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "UseArnRegion" }, - true + false ] }, { "fn": "not", "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "Endpoint" - } + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" ] } ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" }, { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", + "fn": "aws.partition", "argv": [ { - "fn": "isSet", + "fn": "getAttr", "argv": [ { - "ref": "Endpoint" - } + "ref": "bucketArn" + }, + "region" ] } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] + ], + "assign": "bucketPartition" } ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { - "ref": "Endpoint" + "ref": "Region" } - ] + ], + "assign": "partitionResult" } - ] - }, - { - "fn": "not", - "argv": [ + ], + "type": "tree", + "rules": [ { - "fn": "stringEquals", - "argv": [ + "conditions": [ { - "ref": "Region" + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + "" + ] + } + ], + "error": "Invalid ARN: Missing account id", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "conditions": [], + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" } ] }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: bucket ARN is missing a region", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "accessPointName" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "accessPointName" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, + "fn": "getAttr", + "argv": [ { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" + "ref": "bucketArn" }, + "region" + ] + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "not", + "argv": [ { "fn": "stringEquals", "argv": [ { - "ref": "Region" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] }, - "aws-global" + "" ] } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, { "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "ref": "DisableAccessPoints" } ] }, { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "DisableAccessPoints" }, - "aws-global" + true ] } ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Access points are not supported for this operation", + "type": "error" }, { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", + "fn": "not", "argv": [ { - "ref": "Endpoint" + "fn": "isSet", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ] + } + ] } ] - }, + } + ], + "type": "tree", + "rules": [ { - "fn": "parseURL", - "argv": [ + "conditions": [ { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "UseArnRegion" }, - "aws-global" + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] + } ] } - ] + ], + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "aws.partition", "argv": [ { - "ref": "Region" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + } + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] + }, + "{partitionResult#name}" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "Access Points do not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" + } + ] }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] - }, - "headers": {} - }, - "type": "endpoint" + } + ] } ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "conditions": [], + "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", + "type": "error" + } + ] + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 MRAP does not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 MRAP does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 MRAP does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "DisableMultiRegionAccessPoints" + }, + true + ] + } + ], + "error": "Invalid configuration: Multi-Region Access Point ARNs are disabled.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "mrapPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "mrapPartition" }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } + "name" ] }, { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseGlobalEndpoint" + "ref": "bucketArn" }, - false + "partition" ] } - ], + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", + "url": "https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}", "properties": { "authSchemes": [ { "disableDoubleEncoding": true, - "name": "sigv4", + "name": "sigv4a", "signingName": "s3", - "signingRegion": "{Region}" + "signingRegionSet": [ + "*" + ] } ] }, "headers": {} }, "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid Access Point Name", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-outposts" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Outposts does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 Outposts does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 Outposts does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[4]" + ] + } + ] + } + ], + "error": "Invalid Arn: Outpost Access Point ARN contains sub resources", + "type": "error" + }, + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseArnRegion" }, + false + ] + }, + { + "fn": "not", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "bucketArn" }, - false + "region" ] }, + "{Region}" + ] + } + ] + } + ], + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "fn": "getAttr", + "argv": [ { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] + "ref": "bucketArn" }, + "region" + ] + } + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] + "ref": "Region" } ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ { - "ref": "UseDualStack" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] }, - false - ] - }, - { - "fn": "not", - "argv": [ { - "fn": "isSet", + "fn": "getAttr", "argv": [ { - "ref": "Endpoint" - } + "ref": "partitionResult" + }, + "name" ] } ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "isSet", + "fn": "isValidHostLabel", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ], + "assign": "outpostType" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[3]" + ], + "assign": "accessPointName" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "outpostType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Expected an outpost type `accesspoint`, found {outpostType}", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: expected an access point name", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a 4-component resource", + "type": "error" } ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, { "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" } ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] } ] } ] - }, + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The Outpost Id was not set", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 0, + 4, + false + ], + "assign": "arnPrefix" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnPrefix" + }, + "arn:" + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ] + } + ] + } + ], + "error": "Invalid ARN: `{Bucket}` was not a valid ARN", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + true + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ], + "error": "Path-style addressing cannot be used with ARN buckets", + "type": "error" + }, + { + "conditions": [ + { + "fn": "uriEncode", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "uri_encoded_bucket" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Path-style addressing cannot be used with S3 Accelerate", + "type": "error" + } + ] + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseObjectLambdaEndpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseObjectLambdaEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Object Lambda does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 Object Lambda does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] } ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + ], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" } ] } ] - }, - { - "conditions": [], - "error": "A region must be set when sending requests to S3.", - "type": "error" } ] + }, + { + "conditions": [], + "error": "A region must be set when sending requests to S3.", + "type": "error" } ] }, @@ -12941,7 +8127,7 @@ { "documentation": "SDK::Host + access point + Dualstack is an error", "expect": { - "error": "DualStack cannot be combined with a Host override (PrivateLink)" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -12963,7 +8149,6 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": true, "UseFIPS": false } @@ -13600,10 +8785,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13640,10 +8823,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-east-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13682,10 +8863,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-east-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -15289,21 +10468,9 @@ } }, { - "documentation": "non-bucket endpoint with FIPS: TODO(descriptive)", + "documentation": "non-bucket endpoint override with FIPS = error", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-west-2", @@ -15313,21 +10480,9 @@ } }, { - "documentation": "FIPS + dualstack + custom endpoint TODO(descriptive)", + "documentation": "FIPS + dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-west-2", @@ -15337,21 +10492,9 @@ } }, { - "documentation": "dualstack + custom endpoint TODO(descriptive)", + "documentation": "dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-west-2", @@ -15616,19 +10759,7 @@ { "documentation": "endpoint override + FIPS + dualstack (BUG)", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15642,19 +10773,7 @@ { "documentation": "endpoint override + non-dns bucket + FIPS (BUG)", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15744,19 +10863,7 @@ { "documentation": "URI encoded bucket + use global endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "https://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15875,19 +10982,7 @@ { "documentation": "endpoint override + non-uri safe endpoint + force path style", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15927,21 +11022,9 @@ } }, { - "documentation": "endpoint override + FIPS + dualstack (this is wrong—it's a bug in the UseGlobalEndpoint branch)", + "documentation": "endpoint override + FIPS + dualstack", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-east-1", @@ -15954,19 +11037,7 @@ { "documentation": "non-bucket endpoint override + dualstack + global endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-east-1", @@ -15979,19 +11050,7 @@ { "documentation": "Endpoint override + UseGlobalEndpoint + us-east-1", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -16010,8 +11069,7 @@ "Region": "cn-north-1", "UseFIPS": true, "UseDualStack": false, - "UseGlobalEndpoint": true, - "Endpoint": "http://foo.com" + "UseGlobalEndpoint": true } }, { @@ -16113,21 +11171,9 @@ } }, { - "documentation": "aws-global + fips + custom endpoint (TODO: should be an error)", + "documentation": "aws-global + fips + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16165,21 +11211,9 @@ } }, { - "documentation": "aws-global + dualstack + custom endpoint (TODO: should be an error)", + "documentation": "aws-global + dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "aws-global", @@ -16215,7 +11249,7 @@ } }, { - "documentation": "FIPS + aws-global + path only bucket. TODO: this should be an error", + "documentation": "FIPS + aws-global + path only bucket. This is not supported by S3 but we allow garbage in garbage out", "expect": { "endpoint": { "properties": { @@ -16241,21 +11275,9 @@ } }, { - "documentation": "aws-global + FIPS + endpoint override. TODO: should this be an error?", + "documentation": "aws-global + FIPS + endpoint override.", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16264,21 +11286,9 @@ } }, { - "documentation": "force path style, aws-global & endpoint override", + "documentation": "force path style, FIPS, aws-global & endpoint override", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16308,25 +11318,13 @@ "params": { "Region": "aws-global", "Bucket": "bucket", - "Endpoint": "http://192.168.1.1" - } - }, - { - "documentation": "endpoint override with aws-global region", - "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "Endpoint": "http://192.168.1.1" + } + }, + { + "documentation": "endpoint override with aws-global region", + "expect": { + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "aws-global", @@ -16683,8 +11681,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16723,8 +11720,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16764,8 +11760,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16804,8 +11799,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16844,8 +11838,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -16885,8 +11878,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -16914,8 +11906,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -16953,8 +11944,7 @@ "ForcePathStyle": false, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16993,8 +11983,7 @@ "ForcePathStyle": false, "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17060,8 +12049,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17100,8 +12088,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17141,8 +12128,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17181,8 +12167,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17221,8 +12206,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -17262,8 +12246,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -17291,8 +12274,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -17331,8 +12313,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17399,8 +12380,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17440,8 +12420,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17467,10 +12446,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17509,8 +12486,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17547,8 +12523,7 @@ "Bucket": "99a_b", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17587,26 +12562,13 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "path style + fips@cn-north-1", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingName": "s3", - "signingRegion": "cn-north-1", - "disableDoubleEncoding": true, - "name": "sigv4" - } - ] - }, - "url": "https://s3-fips.cn-north-1.amazonaws.com.cn/bucket-name" - } + "error": "Partition does not support FIPS" }, "operationInputs": [ { @@ -17656,8 +12618,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17697,8 +12658,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17724,10 +12684,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17766,8 +12724,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17804,8 +12761,7 @@ "Bucket": "99a_b", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17844,8 +12800,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17913,8 +12868,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17954,8 +12908,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17981,10 +12934,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18023,8 +12974,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18061,8 +13011,7 @@ "Bucket": "99a_b", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18102,8 +13051,7 @@ "Endpoint": "http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18144,14 +13092,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::Host + FIPS@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with FIPS" }, "operationInputs": [ { @@ -18174,14 +13121,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { "documentation": "SDK::Host + DualStack@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18204,14 +13150,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::HOST + accelerate@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "operationInputs": [ { @@ -18234,8 +13179,7 @@ "Endpoint": "http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18274,10 +13218,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18317,8 +13259,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18359,12 +13300,11 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { - "documentation": "SDK::Host + FIPS@cn-north-1", + "documentation": "FIPS@cn-north-1", "expect": { "error": "Partition does not support FIPS" }, @@ -18372,7 +13312,6 @@ "Accelerate": false, "Bucket": "bucket-name", "ForcePathStyle": false, - "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, "UseFIPS": true @@ -18381,7 +13320,7 @@ { "documentation": "SDK::Host + DualStack@cn-north-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18404,14 +13343,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::HOST + accelerate@cn-north-1", "expect": { - "error": "S3 Accelerate cannot be used in this region" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "params": { "Accelerate": true, @@ -18459,10 +13397,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18502,8 +13438,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18544,14 +13479,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::Host + FIPS@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with FIPS" }, "operationInputs": [ { @@ -18574,14 +13508,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { "documentation": "SDK::Host + DualStack@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18604,14 +13537,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::HOST + accelerate@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "operationInputs": [ { @@ -18634,8 +13566,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18674,10 +13605,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18714,10 +13643,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18755,10 +13682,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -18784,10 +13709,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18826,10 +13749,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -18866,10 +13787,8 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18882,7 +13801,6 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, "UseFIPS": true } @@ -18910,10 +13828,8 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18926,7 +13842,6 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": true, "UseFIPS": true } @@ -18965,10 +13880,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19006,10 +13919,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -19035,10 +13946,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19077,10 +13986,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -19183,10 +14090,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19215,10 +14120,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19257,10 +14160,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19297,10 +14198,8 @@ "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19327,10 +14226,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -20078,10 +14975,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -20326,7 +15221,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Prod us-west-1", + "documentation": "S3 Outposts bucketAlias Real Outpost Prod us-west-1", "expect": { "endpoint": { "properties": { @@ -20351,7 +15246,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Prod ap-east-1", + "documentation": "S3 Outposts bucketAlias Real Outpost Prod ap-east-1", "expect": { "endpoint": { "properties": { @@ -20376,7 +15271,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Prod us-east-1", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Prod us-east-1", "expect": { "endpoint": { "properties": { @@ -20401,7 +15296,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Prod me-south-1", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Prod me-south-1", "expect": { "endpoint": { "properties": { @@ -20426,7 +15321,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Beta", + "documentation": "S3 Outposts bucketAlias Real Outpost Beta", "expect": { "endpoint": { "properties": { @@ -20452,7 +15347,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Beta", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Beta", "expect": { "endpoint": { "properties": { @@ -20478,7 +15373,7 @@ } }, { - "documentation": "S3 Outposts Abba - No endpoint set for beta", + "documentation": "S3 Outposts bucketAlias - No endpoint set for beta", "expect": { "error": "Expected a endpoint to be specified but no endpoint was found" }, @@ -20491,7 +15386,7 @@ } }, { - "documentation": "S3 Outposts Abba Invalid hardware type", + "documentation": "S3 Outposts bucketAlias Invalid hardware type", "expect": { "error": "Unrecognized hardware type: \"Expected hardware type o or e but got h\"" }, @@ -20504,7 +15399,7 @@ } }, { - "documentation": "S3 Outposts Abba Special character in Outpost Arn", + "documentation": "S3 Outposts bucketAlias Special character in Outpost Arn", "expect": { "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`." }, @@ -20517,7 +15412,7 @@ } }, { - "documentation": "S3 Outposts Abba - No endpoint set for beta", + "documentation": "S3 Outposts bucketAlias - No endpoint set for beta", "expect": { "error": "Expected a endpoint to be specified but no endpoint was found" }, @@ -21065,6 +15960,18 @@ "traits": { "smithy.api#enumValue": "us-west-2" } + }, + "ap_south_2": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ap-south-2" + } + }, + "eu_south_2": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "eu-south-2" + } } } }, @@ -21450,7 +16357,7 @@ "target": "com.amazonaws.s3#CompleteMultipartUploadOutput" }, "traits": { - "smithy.api#documentation": "

Completes a multipart upload by assembling previously uploaded parts.

\n

You first initiate the multipart upload and then upload all parts using the UploadPart\n operation. After successfully uploading all relevant parts of an upload, you call this\n action to complete the upload. Upon receiving this request, Amazon S3 concatenates all the\n parts in ascending order by part number to create a new object. In the Complete Multipart\n Upload request, you must provide the parts list. You must ensure that the parts list is\n complete. This action concatenates the parts that you provide in the list. For each part in\n the list, you must provide the part number and the ETag value, returned after\n that part was uploaded.

\n

Processing of a Complete Multipart Upload request could take several minutes to\n complete. After Amazon S3 begins processing the request, it sends an HTTP response header that\n specifies a 200 OK response. While processing is in progress, Amazon S3 periodically sends white\n space characters to keep the connection from timing out. A request could fail after the\n initial 200 OK response has been sent. This means that a 200 OK response can\n contain either a success or an error. If you call the S3 API directly, make sure to design\n your application to parse the contents of the response and handle it appropriately. If you\n use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply\n error handling per your configuration settings (including automatically retrying the\n request as appropriate). If the condition persists, the SDKs throws an exception (or, for\n the SDKs that don't use exceptions, they return the error).

\n

Note that if CompleteMultipartUpload fails, applications should be prepared\n to retry the failed requests. For more information, see Amazon S3 Error Best\n Practices.

\n \n

You cannot use Content-Type: application/x-www-form-urlencoded with\n Complete Multipart Upload requests. Also, if you do not provide a\n Content-Type header, CompleteMultipartUpload returns a 200\n OK response.

\n
\n

For more information about multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information about permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

\n CompleteMultipartUpload has the following special errors:

\n
    \n
  • \n

    Error code: EntityTooSmall\n

    \n
      \n
    • \n

      Description: Your proposed upload is smaller than the minimum allowed object\n size. Each part must be at least 5 MB in size, except the last part.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPart\n

    \n
      \n
    • \n

      Description: One or more of the specified parts could not be found. The part\n might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPartOrder\n

    \n
      \n
    • \n

      Description: The list of parts was not in ascending order. The parts list\n must be specified in order by part number.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: NoSuchUpload\n

    \n
      \n
    • \n

      Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or\n completed.

      \n
    • \n
    • \n

      404 Not Found

      \n
    • \n
    \n
  • \n
\n

The following operations are related to CompleteMultipartUpload:

\n ", + "smithy.api#documentation": "

Completes a multipart upload by assembling previously uploaded parts.

\n

You first initiate the multipart upload and then upload all parts using the UploadPart\n operation. After successfully uploading all relevant parts of an upload, you call this\n action to complete the upload. Upon receiving this request, Amazon S3 concatenates all the parts\n in ascending order by part number to create a new object. In the Complete Multipart Upload\n request, you must provide the parts list. You must ensure that the parts list is complete.\n This action concatenates the parts that you provide in the list. For each part in the list,\n you must provide the part number and the ETag value, returned after that part\n was uploaded.

\n

Processing of a Complete Multipart Upload request could take several minutes to\n complete. After Amazon S3 begins processing the request, it sends an HTTP response header that\n specifies a 200 OK response. While processing is in progress, Amazon S3 periodically sends white\n space characters to keep the connection from timing out. A request could fail after the\n initial 200 OK response has been sent. This means that a 200 OK response can\n contain either a success or an error. If you call the S3 API directly, make sure to design\n your application to parse the contents of the response and handle it appropriately. If you\n use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply\n error handling per your configuration settings (including automatically retrying the\n request as appropriate). If the condition persists, the SDKs throws an exception (or, for\n the SDKs that don't use exceptions, they return the error).

\n

Note that if CompleteMultipartUpload fails, applications should be prepared\n to retry the failed requests. For more information, see Amazon S3 Error Best\n Practices.

\n \n

You cannot use Content-Type: application/x-www-form-urlencoded with\n Complete Multipart Upload requests. Also, if you do not provide a\n Content-Type header, CompleteMultipartUpload returns a 200\n OK response.

\n
\n

For more information about multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information about permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

\n CompleteMultipartUpload has the following special errors:

\n
    \n
  • \n

    Error code: EntityTooSmall\n

    \n
      \n
    • \n

      Description: Your proposed upload is smaller than the minimum allowed object\n size. Each part must be at least 5 MB in size, except the last part.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPart\n

    \n
      \n
    • \n

      Description: One or more of the specified parts could not be found. The part\n might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPartOrder\n

    \n
      \n
    • \n

      Description: The list of parts was not in ascending order. The parts list\n must be specified in order by part number.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: NoSuchUpload\n

    \n
      \n
    • \n

      Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or\n completed.

      \n
    • \n
    • \n

      404 Not Found

      \n
    • \n
    \n
  • \n
\n

The following operations are related to CompleteMultipartUpload:

\n ", "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?x-id=CompleteMultipartUpload", @@ -21470,7 +16377,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket that contains the newly created object. Does not return the access point\n ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

The name of the bucket that contains the newly created object. Does not return the access point\n ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

" } }, "Key": { @@ -21563,7 +16470,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

Name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -21823,7 +16730,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. For pricing information, see Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify new metadata.\n However, the access control list (ACL) is not preserved and is set to private for the user making the request. To\n override the default ACL setting, specify a new ACL when generating a copy request. For\n more information, see Using ACLs.

\n

To specify whether you want the object metadata copied from the source object or\n replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you can use\n the s3:x-amz-metadata-directive condition key to enforce certain metadata\n behavior when objects are uploaded. For more information, see Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list of\n Amazon S3-specific condition keys, see Actions, Resources, and Condition Keys for\n Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and must be\n specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the Etag\n matches or whether the object was modified before or after a specified date, use the\n following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the request\n and evaluate as follows, Amazon S3 returns 200 OK and copies the data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the request and\n evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When\n copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a different type\n of encryption setting for the target object, you can use other appropriate\n encryption-related headers to encrypt the target object with a KMS key, an Amazon S3 managed\n key, or a customer-provided key. With server-side encryption, Amazon S3 encrypts your data as it\n writes your data to disks in its data centers and decrypts the data when you access it. If the\n encryption setting in your request is different from the default encryption configuration\n of the destination bucket, the encryption setting in your request takes precedence. If the\n source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\n encryption information in your request so that Amazon S3 can decrypt the object for copying. For\n more information about server-side encryption, see Using Server-Side\n Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request\n Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based permissions.\n By default, all objects are private. Only the owner has full access control. When adding a\n new object, you can grant permissions to individual Amazon Web Services accounts or to predefined groups\n that are defined by Amazon S3. These permissions are then added to the ACL on the object. For more\n information, see Access Control List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced setting for\n S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use\n this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to the new\n object by default. When you copy the object over, you can optionally specify a different\n checksum algorithm to use with the x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of an object\n that is already stored in Amazon S3 by using the StorageClass parameter. For more\n information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER, you must restore a copy of\n this object before you can use it as a source object for the copy operation. For\n more information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current version of an object\n to copy. If the current version is a delete marker, Amazon S3 behaves as if the object was\n deleted. To copy a different version, use the versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version ID for\n the object being copied. This version ID is different from the version ID of the source\n object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version ID that\n Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", + "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. The request can also result in a data retrieval charge for the\n source if the source storage class bills for data retrieval. For pricing information, see\n Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify\n new metadata. However, the access control list (ACL) is not preserved and is set\n to private for the user making the request. To override the default ACL setting,\n specify a new ACL when generating a copy request. For more information, see Using\n ACLs.

\n

To specify whether you want the object metadata copied from the source object\n or replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you\n can use the s3:x-amz-metadata-directive condition key to enforce\n certain metadata behavior when objects are uploaded. For more information, see\n Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list\n of Amazon S3-specific condition keys, see Actions, Resources, and Condition\n Keys for Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and\n must be specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the\n Etag matches or whether the object was modified before or after a\n specified date, use the following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request and evaluate as follows, Amazon S3 returns 200 OK and copies the\n data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to\n true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request and evaluate as follows, Amazon S3 returns the 412 Precondition\n Failed response code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket.\n When copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a\n different type of encryption setting for the target object, you can use other\n appropriate encryption-related headers to encrypt the target object with a\n KMS key, an Amazon S3 managed key, or a customer-provided key. With server-side\n encryption, Amazon S3 encrypts your data as it writes your data to disks in its data\n centers and decrypts the data when you access it. If the encryption setting in\n your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If\n the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the\n necessary encryption information in your request so that Amazon S3 can decrypt the\n object for copying. For more information about server-side encryption, see Using\n Server-Side Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based\n permissions. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups that are defined by Amazon S3. These permissions\n are then added to the ACL on the object. For more information, see Access Control\n List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced\n setting for S3 Object Ownership, ACLs are disabled and no longer affect\n permissions. Buckets that use this setting only accept PUT requests\n that don't specify an ACL or PUT requests that specify bucket owner\n full control ACLs, such as the bucket-owner-full-control canned ACL\n or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling\n ownership of objects and disabling ACLs in the\n Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership,\n all objects written to the bucket by any account will be owned by the bucket\n owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to\n the new object by default. When you copy the object over, you can optionally\n specify a different checksum algorithm to use with the\n x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of\n an object that is already stored in Amazon S3 by using the StorageClass\n parameter. For more information, see Storage Classes in\n the Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER or\n DEEP_ARCHIVE, or the object's storage class is\n INTELLIGENT_TIERING and it's S3 Intelligent-Tiering access tier is\n Archive Access or Deep Archive Access, you must restore a copy of this object\n before you can use it as a source object for the copy operation. For more\n information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current\n version of an object to copy. If the current version is a delete marker, Amazon S3\n behaves as if the object was deleted. To copy a different version, use the\n versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version\n ID for the object being copied. This version ID is different from the version ID\n of the source object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version\n ID that Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", "smithy.api#examples": [ { "title": "To copy an object", @@ -21946,7 +16853,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the destination bucket.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the destination bucket.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22106,7 +17013,7 @@ "StorageClass": { "target": "com.amazonaws.s3#StorageClass", "traits": { - "smithy.api#documentation": "

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

", + "smithy.api#documentation": "

If the x-amz-storage-class header is not used, the copied object will be stored in the\n STANDARD Storage Class by default. The STANDARD storage class provides high durability and\n high availability. Depending on performance needs, you can specify a different Storage\n Class. Amazon S3 on Outposts only uses the OUTPOSTS Storage Class. For more information, see\n Storage\n Classes in the Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-storage-class" } }, @@ -22141,7 +17048,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Specifies the KMS key ID to use for object encryption. All GET and PUT requests for an\n object protected by KMS will fail if they're not made via SSL or using SigV4. For\n information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see\n Specifying the\n Signature Version in Request Authentication in the\n Amazon S3 User Guide.

", + "smithy.api#documentation": "

Specifies the KMS ID (Key ID, Key ARN, or Key Alias) to use for object encryption. All GET and PUT requests for an\n object protected by KMS will fail if they're not made via SSL or using SigV4. For\n information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see\n Specifying the\n Signature Version in Request Authentication in the\n Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, @@ -22375,16 +17282,19 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. You might choose a Region to optimize\n latency, minimize costs, or address regulatory requirements. For example, if you reside in\n Europe, you will probably find it advantageous to create buckets in the Europe (Ireland)\n Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature calculations in\n Signature Version 4 must use us-east-1 as the Region, even if the location constraint in\n the request specifies another Region where the bucket is to be created. If you create a\n bucket in a Region other than US East (N. Virginia), your application must be able to\n handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are required when\n your CreateBucket request includes specific headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your CreateBucket request\n specifies access control list (ACL) permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through any other\n ACL, both s3:CreateBucket and s3:PutBucketAcl permissions\n are needed. If the ACL for the CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.

    \n
  • \n
  • \n

    \n Object Lock - If ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your CreateBucket request includes the x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By default, ObjectOwnership is set to BucketOWnerEnforced and ACLs are disabled. We recommend keeping\n ACLs disabled, except in uncommon use cases where you must control access for each object individually. If you want to change the ObjectOwnership setting, you can use the \n x-amz-object-ownership header in your CreateBucket request to set the ObjectOwnership setting of your choice.\n For more information about S3 Object Ownership, see Controlling object\n ownership in the Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your specific use case requires granting public access to your S3 resources, you can disable Block Public Access. You can create a new bucket with Block Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all Block\n Public Access settings are enabled for new buckets. To avoid inadvertent exposure of\n your resources, we recommend keeping the S3 Block Public Access settings enabled. For more information about S3 Block Public Access, see Blocking public\n access to your Amazon S3 storage in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for Amazon S3 Object Ownership\n and specifies a bucket ACL that provides access to an external Amazon Web Services account, your request fails with a 400 error and returns the InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.

\n
\n

The following operations are related to CreateBucket:

\n ", + "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. To constrain the bucket creation to a\n specific Region, you can use \n LocationConstraint\n condition key. You might choose a Region to\n optimize latency, minimize costs, or address regulatory requirements. For example, if you\n reside in Europe, you will probably find it advantageous to create buckets in the Europe\n (Ireland) Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature\n calculations in Signature Version 4 must use us-east-1 as the Region, even\n if the location constraint in the request specifies another Region where the bucket is\n to be created. If you create a bucket in a Region other than US East (N. Virginia), your\n application must be able to handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are\n required when your CreateBucket request includes specific\n headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your\n CreateBucket request specifies access control list (ACL)\n permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through\n any other ACL, both s3:CreateBucket and\n s3:PutBucketAcl permissions are needed. If the ACL for the\n CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.\n

    \n
  • \n
  • \n

    \n Object Lock - If\n ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your\n CreateBucket request includes the\n x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By\n default, ObjectOwnership is set to\n BucketOWnerEnforced and ACLs are disabled. We recommend\n keeping ACLs disabled, except in uncommon use cases where you must control\n access for each object individually. If you want to change the\n ObjectOwnership setting, you can use the\n x-amz-object-ownership header in your\n CreateBucket request to set the ObjectOwnership\n setting of your choice. For more information about S3 Object Ownership, see\n Controlling\n object ownership in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your\n specific use case requires granting public access to your S3 resources, you\n can disable Block Public Access. You can create a new bucket with Block\n Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all\n Block Public Access settings are enabled for new buckets. To avoid\n inadvertent exposure of your resources, we recommend keeping the S3 Block\n Public Access settings enabled. For more information about S3 Block Public\n Access, see Blocking\n public access to your Amazon S3 storage in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for\n Amazon S3 Object Ownership and specifies a bucket ACL that provides access to an external\n Amazon Web Services account, your request fails with a 400 error and returns the\n InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.\n

\n
\n

The following operations are related to CreateBucket:

\n ", "smithy.api#examples": [ { - "title": "To create a bucket ", - "documentation": "The following example creates a bucket.", + "title": "To create a bucket in a specific region", + "documentation": "The following example creates a bucket. The request specifies an AWS region where to create the bucket.", "input": { - "Bucket": "examplebucket" + "Bucket": "examplebucket", + "CreateBucketConfiguration": { + "LocationConstraint": "eu-west-1" + } }, "output": { - "Location": "/examplebucket" + "Location": "http://examplebucket..s3.amazonaws.com/" } } ], @@ -22521,7 +17431,7 @@ "target": "com.amazonaws.s3#CreateMultipartUploadOutput" }, "traits": { - "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data\n by using server-side encryption with an Amazon S3 managed key (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3 encrypts\n your data as it writes it to disks in its data centers and decrypts it when you\n access it. You can request that Amazon S3 encrypts\n data at rest by using server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) – If you\n want Amazon Web Services to manage the keys used to encrypt data, specify the following\n headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object protected\n by KMS fail if you don't make them by using Secure Sockets Layer (SSL),\n Transport Layer Security (TLS), or Signature Version 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", + "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data by using server-side encryption with an Amazon S3 managed key\n (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3\n encrypts your data as it writes it to disks in its data centers and decrypts it\n when you access it. You can request that Amazon S3 encrypts data at rest by using\n server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) –\n If you want Amazon Web Services to manage the keys used to encrypt data, specify the\n following headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object\n protected by KMS fail if you don't make them by using Secure Sockets\n Layer (SSL), Transport Layer Security (TLS), or Signature Version\n 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", "smithy.api#examples": [ { "title": "To initiate a multipart upload", @@ -22550,7 +17460,7 @@ "AbortDate": { "target": "com.amazonaws.s3#AbortDate", "traits": { - "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, the response includes this header. The header indicates when the initiated\n multipart upload becomes eligible for an abort operation. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

The response also includes the x-amz-abort-rule-id header that provides the\n ID of the lifecycle configuration rule that defines this action.

", + "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, the response includes this header. The header indicates when the initiated\n multipart upload becomes eligible for an abort operation. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

The response also includes the x-amz-abort-rule-id header that provides the\n ID of the lifecycle configuration rule that defines this action.

", "smithy.api#httpHeader": "x-amz-abort-date" } }, @@ -22564,7 +17474,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated. Does not return the\n access point ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated. Does not return the\n access point ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#xmlName": "Bucket" } }, @@ -22655,7 +17565,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which to initiate the upload

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which to initiate the upload

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22793,7 +17703,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Specifies the ID of the symmetric encryption customer managed key to use for object encryption.\n All GET and PUT requests for an object protected by KMS will fail if they're not made via\n SSL or using SigV4. For information about configuring any of the officially supported Amazon Web Services\n SDKs and Amazon Web Services CLI, see Specifying the Signature Version in Request Authentication\n in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Specifies the ID (Key ID, Key ARN, or Key Alias) of the symmetric encryption customer managed key to use for object encryption.\n All GET and PUT requests for an object protected by KMS will fail if they're not made via\n SSL or using SigV4. For information about configuring any of the officially supported Amazon Web Services\n SDKs and Amazon Web Services CLI, see Specifying the Signature Version in Request Authentication\n in the Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, @@ -23076,7 +17986,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the DELETE action resets the default encryption for the\n bucket as server-side encryption with Amazon S3 managed keys (SSE-S3). For information about the\n bucket default encryption feature, see Amazon S3 Bucket Default Encryption\n in the Amazon S3 User Guide.

\n

To use this operation, you must have permissions to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketEncryption:

\n ", + "smithy.api#documentation": "

This implementation of the DELETE action resets the default encryption for the bucket as\n server-side encryption with Amazon S3 managed keys (SSE-S3). For information about the bucket\n default encryption feature, see Amazon S3 Bucket Default Encryption\n in the Amazon S3 User Guide.

\n

To use this operation, you must have permissions to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketEncryption:

\n ", "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?encryption", @@ -23360,7 +18270,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", + "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", "smithy.api#examples": [ { "title": "To delete bucket policy", @@ -23682,13 +18592,12 @@ "smithy.api#documentation": "

Removes the null version (if there is one) of an object and inserts a delete marker,\n which becomes the latest version of the object. If there isn't a null version, Amazon S3 does\n not remove any objects but will still respond that the command was successful.

\n

To remove a specific version, you must use the version Id subresource. Using this\n subresource permanently deletes the version. If the object deleted is a delete marker, Amazon S3\n sets the response header, x-amz-delete-marker, to true.

\n

If the object you want to delete is in a bucket where the bucket versioning\n configuration is MFA Delete enabled, you must include the x-amz-mfa request\n header in the DELETE versionId request. Requests that include\n x-amz-mfa must use HTTPS.

\n

For more information about MFA Delete, see Using MFA Delete. To see sample\n requests that use versioning, see Sample\n Request.

\n

You can delete objects by explicitly calling DELETE Object or configure its lifecycle\n (PutBucketLifecycle) to enable Amazon S3 to remove them for you. If you want to block\n users or accounts from removing or deleting objects from your bucket, you must deny them\n the s3:DeleteObject, s3:DeleteObjectVersion, and\n s3:PutLifeCycleConfiguration actions.

\n

The following action is related to DeleteObject:

\n ", "smithy.api#examples": [ { - "title": "To delete an object", - "documentation": "The following example deletes an object from an S3 bucket.", + "title": "To delete an object (from a non-versioned bucket)", + "documentation": "The following example deletes an object from a non-versioned bucket.", "input": { - "Bucket": "examplebucket", - "Key": "objectkey.jpg" - }, - "output": {} + "Bucket": "ExampleBucket", + "Key": "HappyFace.jpg" + } } ], "smithy.api#http": { @@ -23705,7 +18614,7 @@ "target": "com.amazonaws.s3#DeleteMarker", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the versioned object that was permanently deleted was (true) or was\n not (false) a delete marker.

", + "smithy.api#documentation": "

Indicates whether the specified object version that was permanently deleted was (true) or was\n not (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or\n not (false) the current version of the object is a delete marker.

", "smithy.api#httpHeader": "x-amz-delete-marker" } }, @@ -23733,7 +18642,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -23801,15 +18710,14 @@ "smithy.api#documentation": "

Removes the entire tag set from the specified object. For more information about\n managing object tags, see Object Tagging.

\n

To use this operation, you must have permission to perform the\n s3:DeleteObjectTagging action.

\n

To delete tags of a specific object version, add the versionId query\n parameter in the request. You will need permission for the\n s3:DeleteObjectVersionTagging action.

\n

The following operations are related to DeleteObjectTagging:

\n ", "smithy.api#examples": [ { - "title": "To remove tag set from an object version", - "documentation": "The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.", + "title": "To remove tag set from an object", + "documentation": "The following example removes tag set associated with the specified object. If the bucket is versioning enabled, the operation removes tag set from the latest object version.", "input": { "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + "Key": "HappyFace.jpg" }, "output": { - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + "VersionId": "null" } } ], @@ -23841,7 +18749,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the objects from which to remove the tags.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the objects from which to remove the tags.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -23889,7 +18797,41 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

This action enables you to delete multiple objects from a bucket using a single HTTP\n request. If you know the object keys that you want to delete, then this action provides a\n suitable alternative to sending individual delete requests, reducing per-request\n overhead.

\n

The request contains a list of up to 1000 keys that you want to delete. In the XML, you\n provide the object key names, and optionally, version IDs if you want to delete a specific\n version of the object from a versioning-enabled bucket. For each key, Amazon S3 performs a\n delete action and returns the result of that delete, success, or failure, in the response.\n Note that if the object specified in the request is not found, Amazon S3 returns the result as\n deleted.

\n

The action supports two modes for the response: verbose and quiet. By default, the\n action uses verbose mode in which the response includes the result of deletion of each key\n in your request. In quiet mode the response includes only keys where the delete action\n encountered an error. For a successful deletion, the action does not return any information\n about the delete in the response body.

\n

When performing this action on an MFA Delete enabled bucket, that attempts to delete any\n versioned objects, you must include an MFA token. If you do not provide one, the entire\n request will fail, even if there are non-versioned objects you are trying to delete. If you\n provide an invalid token, whether there are versioned keys in the request or not, the\n entire Multi-Object Delete request will fail. For information about MFA Delete, see MFA\n Delete.

\n

Finally, the Content-MD5 header is required for all Multi-Object Delete requests. Amazon S3 uses the header value to ensure that your request body has not been altered in\n transit.

\n

The following operations are related to DeleteObjects:

\n ", + "smithy.api#documentation": "

This action enables you to delete multiple objects from a bucket using a single HTTP\n request. If you know the object keys that you want to delete, then this action provides a\n suitable alternative to sending individual delete requests, reducing per-request\n overhead.

\n

The request contains a list of up to 1000 keys that you want to delete. In the XML, you\n provide the object key names, and optionally, version IDs if you want to delete a specific\n version of the object from a versioning-enabled bucket. For each key, Amazon S3 performs a\n delete action and returns the result of that delete, success, or failure, in the response.\n Note that if the object specified in the request is not found, Amazon S3 returns the result as\n deleted.

\n

The action supports two modes for the response: verbose and quiet. By default, the\n action uses verbose mode in which the response includes the result of deletion of each key\n in your request. In quiet mode the response includes only keys where the delete action\n encountered an error. For a successful deletion, the action does not return any information\n about the delete in the response body.

\n

When performing this action on an MFA Delete enabled bucket, that attempts to delete any\n versioned objects, you must include an MFA token. If you do not provide one, the entire\n request will fail, even if there are non-versioned objects you are trying to delete. If you\n provide an invalid token, whether there are versioned keys in the request or not, the\n entire Multi-Object Delete request will fail. For information about MFA Delete, see MFA\n Delete.

\n

Finally, the Content-MD5 header is required for all Multi-Object Delete requests. Amazon S3\n uses the header value to ensure that your request body has not been altered in\n transit.

\n

The following operations are related to DeleteObjects:

\n ", + "smithy.api#examples": [ + { + "title": "To delete multiple object versions from a versioned bucket", + "documentation": "The following example deletes objects from a bucket. The request specifies object versions. S3 deletes specific object versions and returns the key and versions of deleted objects in the response.", + "input": { + "Bucket": "examplebucket", + "Delete": { + "Objects": [ + { + "Key": "HappyFace.jpg", + "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b" + }, + { + "Key": "HappyFace.jpg", + "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd" + } + ], + "Quiet": false + } + }, + "output": { + "Deleted": [ + { + "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd", + "Key": "HappyFace.jpg" + }, + { + "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b", + "Key": "HappyFace.jpg" + } + ] + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}?delete&x-id=DeleteObjects", @@ -23933,7 +18875,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the objects to delete.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the objects to delete.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -24052,7 +18994,7 @@ "target": "com.amazonaws.s3#DeleteMarker", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the versioned object that was permanently deleted was (true) or was\n not (false) a delete marker. In a simple DELETE, this header indicates whether (true) or\n not (false) a delete marker was created.

" + "smithy.api#documentation": "

Indicates whether the specified object version that was permanently deleted was (true) or was\n not (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or\n not (false) the current version of the object is a delete marker.

" } }, "DeleteMarkerVersionId": { @@ -24155,7 +19097,7 @@ } }, "traits": { - "smithy.api#documentation": "

Requests Amazon S3 to encode the object keys in the response and specifies the encoding\n method to use. An object key may contain any Unicode character; however, XML 1.0 parser\n cannot parse some characters, such as characters with an ASCII value from 0 to 10. For\n characters that are not supported in XML 1.0, you can add this parameter to request that\n Amazon S3 encode the keys in the response.

" + "smithy.api#documentation": "

Requests Amazon S3 to encode the object keys in the response and specifies the encoding\n method to use. An object key can contain any Unicode character; however, the XML 1.0 parser\n cannot parse some characters, such as characters with an ASCII value from 0 to 10. For\n characters that are not supported in XML 1.0, you can add this parameter to request that\n Amazon S3 encode the keys in the response.

" } }, "com.amazonaws.s3#Encryption": { @@ -24628,7 +19570,7 @@ "target": "com.amazonaws.s3#GetBucketAccelerateConfigurationOutput" }, "traits": { - "smithy.api#documentation": "

This implementation of the GET action uses the accelerate subresource to\n return the Transfer Acceleration state of a bucket, which is either Enabled or\n Suspended. Amazon S3 Transfer Acceleration is a bucket-level feature that\n enables you to perform faster data transfers to and from Amazon S3.

\n

To use this operation, you must have permission to perform the\n s3:GetAccelerateConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

You set the Transfer Acceleration state of an existing bucket to Enabled or\n Suspended by using the PutBucketAccelerateConfiguration operation.

\n

A GET accelerate request does not return a state value for a bucket that\n has no transfer acceleration state. A bucket has no Transfer Acceleration state if a state\n has never been set on the bucket.

\n

For more information about transfer acceleration, see Transfer Acceleration in\n the Amazon S3 User Guide.

\n

The following operations are related to GetBucketAccelerateConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the GET action uses the accelerate subresource to\n return the Transfer Acceleration state of a bucket, which is either Enabled or\n Suspended. Amazon S3 Transfer Acceleration is a bucket-level feature that\n enables you to perform faster data transfers to and from Amazon S3.

\n

To use this operation, you must have permission to perform the\n s3:GetAccelerateConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

You set the Transfer Acceleration state of an existing bucket to Enabled or\n Suspended by using the PutBucketAccelerateConfiguration operation.

\n

A GET accelerate request does not return a state value for a bucket that\n has no transfer acceleration state. A bucket has no Transfer Acceleration state if a state\n has never been set on the bucket.

\n

For more information about transfer acceleration, see Transfer Acceleration in\n the Amazon S3 User Guide.

\n

The following operations are related to\n GetBucketAccelerateConfiguration:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?accelerate", @@ -24763,7 +19705,7 @@ "target": "com.amazonaws.s3#GetBucketAnalyticsConfigurationOutput" }, "traits": { - "smithy.api#documentation": "

This implementation of the GET action returns an analytics configuration (identified by\n the analytics configuration ID) from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:GetAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

For information about Amazon S3 analytics feature, see Amazon S3 Analytics – Storage Class\n Analysis in the Amazon S3 User Guide.

\n

The following operations are related to GetBucketAnalyticsConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the GET action returns an analytics configuration (identified by\n the analytics configuration ID) from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:GetAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

For information about Amazon S3 analytics feature, see Amazon S3 Analytics – Storage Class\n Analysis in the Amazon S3 User Guide.

\n

The following operations are related to\n GetBucketAnalyticsConfiguration:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?analytics&x-id=GetBucketAnalyticsConfiguration", @@ -25473,7 +20415,7 @@ "target": "com.amazonaws.s3#GetBucketPolicyOutput" }, "traits": { - "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", + "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", "smithy.api#examples": [ { "title": "To get bucket policy", @@ -26020,7 +20962,7 @@ "SHA1" ] }, - "smithy.api#documentation": "

Retrieves objects from Amazon S3. To use GET, you must have READ\n access to the object. If you grant READ access to the anonymous user, you can\n return the object without using an authorization header.

\n

An Amazon S3 bucket has no directory hierarchy such as you would find in a typical computer\n file system. You can, however, create a logical hierarchy by using object key names that\n imply a folder structure. For example, instead of naming an object sample.jpg,\n you can name it photos/2006/February/sample.jpg.

\n

To get an object from such a logical hierarchy, specify the full key name for the object\n in the GET operation. For a virtual hosted-style request example, if you have\n the object photos/2006/February/sample.jpg, specify the resource as\n /photos/2006/February/sample.jpg. For a path-style request example, if you\n have the object photos/2006/February/sample.jpg in the bucket named\n examplebucket, specify the resource as\n /examplebucket/photos/2006/February/sample.jpg. For more information about\n request types, see HTTP Host\n Header Bucket Specification.

\n

For more information about returning the ACL of an object, see GetObjectAcl.

\n

If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval or\n S3 Glacier Deep Archive storage class, or S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, before you can retrieve the object you must first restore a\n copy using RestoreObject. Otherwise, this action returns an\n InvalidObjectState error. For information about restoring archived objects,\n see Restoring\n Archived Objects.

\n

Encryption request headers, like x-amz-server-side-encryption, should not\n be sent for GET requests if your object uses server-side encryption with Key Management Service (KMS)\n keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with Amazon S3 managed encryption keys (SSE-S3). If your object does use\n these types of keys, you’ll get an HTTP 400 Bad Request error.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,\n you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n

Assuming you have the relevant permission to read object tags, the response also returns\n the x-amz-tagging-count header that provides the count of number of tags\n associated with the object. You can use GetObjectTagging to retrieve\n the tag set associated with an object.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation. For more\n information, see Specifying Permissions in a\n Policy. If the object that you request doesn’t exist, the error that Amazon S3 returns depends\n on whether you also have the s3:ListBucket permission.

\n

If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 (Not Found) error.

\n

If you don’t have the s3:ListBucket permission, Amazon S3 returns an\n HTTP status code 403 (\"access denied\") error.

\n
\n
Versioning
\n
\n

By default, the GET action returns the current version of an object. To return a\n different version, use the versionId subresource.

\n \n
    \n
  • \n

    If you supply a versionId, you need the\n s3:GetObjectVersion permission to access a specific version of an\n object. If you request a specific version, you do not need to have the\n s3:GetObject permission. If you request the current version\n without a specific version ID, only s3:GetObject permission is\n required. s3:GetObjectVersion permission won't be required.

    \n
  • \n
  • \n

    If the current version of the object is a delete marker, Amazon S3 behaves as if the\n object was deleted and includes x-amz-delete-marker: true in the\n response.

    \n
  • \n
\n
\n

For more information about versioning, see PutBucketVersioning.

\n
\n
Overriding Response Header Values
\n
\n

There are times when you want to override certain response header values in a GET\n response. For example, you might override the Content-Disposition response\n header value in your GET request.

\n

You can override values for a set of response headers using the following query\n parameters. These response header values are sent only on a successful request, that is,\n when status code 200 OK is returned. The set of headers you can override using these\n parameters is a subset of the headers that Amazon S3 accepts when you create an object. The\n response headers that you can override for the GET response are Content-Type,\n Content-Language, Expires, Cache-Control,\n Content-Disposition, and Content-Encoding. To override these\n header values in the GET response, you use the following request parameters.

\n \n

You must sign the request, either using an Authorization header or a presigned URL,\n when using these parameters. They cannot be used with an unsigned (anonymous)\n request.

\n
\n
    \n
  • \n

    \n response-content-type\n

    \n
  • \n
  • \n

    \n response-content-language\n

    \n
  • \n
  • \n

    \n response-expires\n

    \n
  • \n
  • \n

    \n response-cache-control\n

    \n
  • \n
  • \n

    \n response-content-disposition\n

    \n
  • \n
  • \n

    \n response-content-encoding\n

    \n
  • \n
\n
\n
Overriding Response Header Values
\n
\n

If both of the If-Match and If-Unmodified-Since headers are\n present in the request as follows: If-Match condition evaluates to\n true, and; If-Unmodified-Since condition evaluates to\n false; then, S3 returns 200 OK and the data requested.

\n

If both of the If-None-Match and If-Modified-Since headers are\n present in the request as follows: If-None-Match condition evaluates to\n false, and; If-Modified-Since condition evaluates to\n true; then, S3 returns 304 Not Modified response code.

\n

For more information about conditional requests, see RFC 7232.

\n
\n
\n

The following operations are related to GetObject:

\n ", + "smithy.api#documentation": "

Retrieves objects from Amazon S3. To use GET, you must have READ\n access to the object. If you grant READ access to the anonymous user, you can\n return the object without using an authorization header.

\n

An Amazon S3 bucket has no directory hierarchy such as you would find in a typical computer\n file system. You can, however, create a logical hierarchy by using object key names that\n imply a folder structure. For example, instead of naming an object sample.jpg,\n you can name it photos/2006/February/sample.jpg.

\n

To get an object from such a logical hierarchy, specify the full key name for the object\n in the GET operation. For a virtual hosted-style request example, if you have\n the object photos/2006/February/sample.jpg, specify the resource as\n /photos/2006/February/sample.jpg. For a path-style request example, if you\n have the object photos/2006/February/sample.jpg in the bucket named\n examplebucket, specify the resource as\n /examplebucket/photos/2006/February/sample.jpg. For more information about\n request types, see HTTP Host\n Header Bucket Specification.

\n

For more information about returning the ACL of an object, see GetObjectAcl.

\n

If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval or\n S3 Glacier Deep Archive storage class, or S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, before you can retrieve the object you must first restore a\n copy using RestoreObject. Otherwise, this action returns an\n InvalidObjectState error. For information about restoring archived objects,\n see Restoring\n Archived Objects.

\n

Encryption request headers, like x-amz-server-side-encryption, should not\n be sent for GET requests if your object uses server-side encryption with Key Management Service (KMS)\n keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with Amazon S3 managed encryption keys (SSE-S3). If your object does use\n these types of keys, you’ll get an HTTP 400 Bad Request error.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,\n you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n

Assuming you have the relevant permission to read object tags, the response also returns\n the x-amz-tagging-count header that provides the count of number of tags\n associated with the object. You can use GetObjectTagging to retrieve\n the tag set associated with an object.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation.\n For more information, see Specifying Permissions in\n a Policy. If the object that you request doesn’t exist, the error that\n Amazon S3 returns depends on whether you also have the s3:ListBucket\n permission.

\n

If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 (Not Found) error.

\n

If you don’t have the s3:ListBucket permission, Amazon S3 returns an\n HTTP status code 403 (\"access denied\") error.

\n
\n
Versioning
\n
\n

By default, the GET action returns the current version of an\n object. To return a different version, use the versionId\n subresource.

\n \n
    \n
  • \n

    If you supply a versionId, you need the\n s3:GetObjectVersion permission to access a specific\n version of an object. If you request a specific version, you do not need\n to have the s3:GetObject permission. If you request the\n current version without a specific version ID, only\n s3:GetObject permission is required.\n s3:GetObjectVersion permission won't be required.

    \n
  • \n
  • \n

    If the current version of the object is a delete marker, Amazon S3 behaves\n as if the object was deleted and includes x-amz-delete-marker:\n true in the response.

    \n
  • \n
\n
\n

For more information about versioning, see PutBucketVersioning.

\n
\n
Overriding Response Header Values
\n
\n

There are times when you want to override certain response header values in a\n GET response. For example, you might override the\n Content-Disposition response header value in your GET\n request.

\n

You can override values for a set of response headers using the following query\n parameters. These response header values are sent only on a successful request,\n that is, when status code 200 OK is returned. The set of headers you can override\n using these parameters is a subset of the headers that Amazon S3 accepts when you\n create an object. The response headers that you can override for the\n GET response are Content-Type,\n Content-Language, Expires,\n Cache-Control, Content-Disposition, and\n Content-Encoding. To override these header values in the\n GET response, you use the following request parameters.

\n \n

You must sign the request, either using an Authorization header or a\n presigned URL, when using these parameters. They cannot be used with an\n unsigned (anonymous) request.

\n
\n
    \n
  • \n

    \n response-content-type\n

    \n
  • \n
  • \n

    \n response-content-language\n

    \n
  • \n
  • \n

    \n response-expires\n

    \n
  • \n
  • \n

    \n response-cache-control\n

    \n
  • \n
  • \n

    \n response-content-disposition\n

    \n
  • \n
  • \n

    \n response-content-encoding\n

    \n
  • \n
\n
\n
Overriding Response Header Values
\n
\n

If both of the If-Match and If-Unmodified-Since\n headers are present in the request as follows: If-Match condition\n evaluates to true, and; If-Unmodified-Since condition\n evaluates to false; then, S3 returns 200 OK and the data requested.

\n

If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows: If-None-Match\n condition evaluates to false, and; If-Modified-Since\n condition evaluates to true; then, S3 returns 304 Not Modified\n response code.

\n

For more information about conditional requests, see RFC 7232.

\n
\n
\n

The following operations are related to GetObject:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?x-id=GetObject", @@ -26189,7 +21131,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves all the metadata from an object without returning the object itself. This\n action is useful if you're interested only in an object's metadata. To use\n GetObjectAttributes, you must have READ access to the object.

\n

\n GetObjectAttributes combines the functionality of HeadObject\n and ListParts. All of the data returned with each of those individual calls\n can be returned with a single call to GetObjectAttributes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

\n \n
    \n
  • \n

    Encryption request headers, such as x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side encryption\n with Amazon Web Services KMS keys stored in Amazon Web Services Key Management Service (SSE-KMS) or\n server-side encryption with Amazon S3 managed keys (SSE-S3). If your object does use\n these types of keys, you'll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Consider the following when using request headers:

\n
    \n
  • \n

    If both of the If-Match and If-Unmodified-Since headers\n are present in the request as follows, then Amazon S3 returns the HTTP status code\n 200 OK and the data requested:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true.

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false.

      \n
    • \n
    \n
  • \n
  • \n

    If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows, then Amazon S3 returns the HTTP status code\n 304 Not Modified:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false.

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true.

      \n
    • \n
    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

The permissions that you need to use this operation depend on whether the bucket is\n versioned. If the bucket is versioned, you need both the s3:GetObjectVersion\n and s3:GetObjectVersionAttributes permissions for this operation. If the\n bucket is not versioned, you need the s3:GetObject and\n s3:GetObjectAttributes permissions. For more information, see Specifying\n Permissions in a Policy in the Amazon S3 User Guide. If the\n object that you request does not exist, the error Amazon S3 returns depends on whether you also\n have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3 returns\n an HTTP status code 404 Not Found (\"no such key\") error.

    \n
  • \n
  • \n

    If you don't have the s3:ListBucket permission, Amazon S3 returns an HTTP\n status code 403 Forbidden (\"access denied\") error.

    \n
  • \n
\n
\n
\n

The following actions are related to GetObjectAttributes:

\n ", + "smithy.api#documentation": "

Retrieves all the metadata from an object without returning the object itself. This\n action is useful if you're interested only in an object's metadata. To use\n GetObjectAttributes, you must have READ access to the object.

\n

\n GetObjectAttributes combines the functionality of HeadObject\n and ListParts. All of the data returned with each of those individual calls\n can be returned with a single call to GetObjectAttributes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

\n \n
    \n
  • \n

    Encryption request headers, such as x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side encryption\n with Amazon Web Services KMS keys stored in Amazon Web Services Key Management Service (SSE-KMS) or\n server-side encryption with Amazon S3 managed keys (SSE-S3). If your object does use\n these types of keys, you'll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Consider the following when using request headers:

\n
    \n
  • \n

    If both of the If-Match and If-Unmodified-Since headers\n are present in the request as follows, then Amazon S3 returns the HTTP status code\n 200 OK and the data requested:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true.

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false.

      \n
    • \n
    \n
  • \n
  • \n

    If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows, then Amazon S3 returns the HTTP status code\n 304 Not Modified:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false.

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true.

      \n
    • \n
    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

The permissions that you need to use this operation depend on whether the\n bucket is versioned. If the bucket is versioned, you need both the\n s3:GetObjectVersion and s3:GetObjectVersionAttributes\n permissions for this operation. If the bucket is not versioned, you need the\n s3:GetObject and s3:GetObjectAttributes permissions.\n For more information, see Specifying Permissions in\n a Policy in the Amazon S3 User Guide. If the object\n that you request does not exist, the error Amazon S3 returns depends on whether you\n also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 Not Found (\"no such key\")\n error.

    \n
  • \n
  • \n

    If you don't have the s3:ListBucket permission, Amazon S3 returns\n an HTTP status code 403 Forbidden (\"access denied\")\n error.

    \n
  • \n
\n
\n
\n

The following actions are related to GetObjectAttributes:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?attributes", @@ -26320,7 +21262,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket that contains the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket that contains the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -26395,7 +21337,7 @@ "ObjectAttributes": { "target": "com.amazonaws.s3#ObjectAttributesList", "traits": { - "smithy.api#documentation": "

An XML header that specifies the fields at the root level that you want returned in the\n response. Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the fields at the root level that you want returned in the response. Fields\n that you do not specify are not returned.

", "smithy.api#httpHeader": "x-amz-object-attributes", "smithy.api#required": {} } @@ -26814,7 +21756,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27122,7 +22064,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object for which to get the tagging information.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object for which to get the tagging information.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27429,7 +22371,7 @@ } ], "traits": { - "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in place of the\n bucket name or specify the access point ARN. When using the access point ARN, you must direct requests to\n the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", + "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in\n place of the bucket name or specify the access point ARN. When using the access point ARN, you must direct\n requests to the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", "smithy.api#examples": [ { "title": "To determine if bucket exists", @@ -27482,7 +22424,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \n If the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \n For more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the\n bucket name. If the Object Lambda access point alias in a request is not valid, the error code\n InvalidAccessPointAliasError is returned. For more information about\n InvalidAccessPointAliasError, see List of Error\n Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27516,7 +22458,7 @@ } ], "traits": { - "smithy.api#documentation": "

The HEAD action retrieves metadata from an object without returning the object itself.\n This action is useful if you're only interested in an object's metadata. To use HEAD, you\n must have READ access to the object.

\n

A HEAD request has the same options as a GET action on an\n object. The response is identical to the GET response except that there is no\n response body. Because of this, if the HEAD request generates an error, it\n returns a generic 400 Bad Request, 403 Forbidden or 404 Not\n Found code. It is not possible to retrieve the exact exception beyond these error\n codes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n \n
    \n
  • \n

    Encryption request headers, like x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side\n encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side encryption with Amazon S3\n managed encryption keys (SSE-S3). If your object does use these types of keys,\n you’ll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Request headers are limited to 8 KB in size. For more information, see Common\n Request Headers.

\n

Consider the following when using request headers:

\n
    \n
  • \n

    Consideration 1 – If both of the If-Match and\n If-Unmodified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true, and;

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false;

      \n
    • \n
    \n

    Then Amazon S3 returns 200 OK and the data requested.

    \n
  • \n
  • \n

    Consideration 2 – If both of the If-None-Match and\n If-Modified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false,\n and;

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true;

      \n
    • \n
    \n

    Then Amazon S3 returns the 304 Not Modified response code.

    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation. For more\n information, see Actions, resources, and condition keys for Amazon S3. \n If the object you request doesn't exist, the error that Amazon S3 returns depends\n on whether you also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3 returns\n an HTTP status code 404 error.

    \n
  • \n
  • \n

    If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP\n status code 403 error.

    \n
  • \n
\n
\n
\n

The following actions are related to HeadObject:

\n ", + "smithy.api#documentation": "

The HEAD action retrieves metadata from an object without returning the\n object itself. This action is useful if you're only interested in an object's metadata. To\n use HEAD, you must have READ access to the object.

\n

A HEAD request has the same options as a GET action on an\n object. The response is identical to the GET response except that there is no\n response body. Because of this, if the HEAD request generates an error, it\n returns a generic 400 Bad Request, 403 Forbidden or 404 Not\n Found code. It is not possible to retrieve the exact exception beyond these error\n codes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n \n
    \n
  • \n

    Encryption request headers, like x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side\n encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side encryption with Amazon S3\n managed encryption keys (SSE-S3). If your object does use these types of keys,\n you’ll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Request headers are limited to 8 KB in size. For more information, see Common\n Request Headers.

\n

Consider the following when using request headers:

\n
    \n
  • \n

    Consideration 1 – If both of the If-Match and\n If-Unmodified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true, and;

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false;

      \n
    • \n
    \n

    Then Amazon S3 returns 200 OK and the data requested.

    \n
  • \n
  • \n

    Consideration 2 – If both of the If-None-Match and\n If-Modified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false,\n and;

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true;

      \n
    • \n
    \n

    Then Amazon S3 returns the 304 Not Modified response code.

    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation.\n For more information, see Actions, resources, and condition\n keys for Amazon S3. If the object you request doesn't exist, the error that\n Amazon S3 returns depends on whether you also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 error.

    \n
  • \n
  • \n

    If you don’t have the s3:ListBucket permission, Amazon S3 returns\n an HTTP status code 403 error.

    \n
  • \n
\n
\n
\n

The following actions are related to HeadObject:

\n ", "smithy.api#http": { "method": "HEAD", "uri": "/{Bucket}/{Key+}", @@ -27810,7 +22752,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -28416,6 +23358,18 @@ "traits": { "smithy.api#enumValue": "ChecksumAlgorithm" } + }, + "ObjectAccessControlList": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ObjectAccessControlList" + } + }, + "ObjectOwner": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ObjectOwner" + } } } }, @@ -28501,6 +23455,12 @@ "smithy.api#default": false } }, + "com.amazonaws.s3#IsRestoreInProgress": { + "type": "boolean", + "traits": { + "smithy.api#default": false + } + }, "com.amazonaws.s3#IsTruncated": { "type": "boolean", "traits": { @@ -28616,7 +23576,7 @@ "Date": { "target": "com.amazonaws.s3#Date", "traits": { - "smithy.api#documentation": "

Indicates at what date the object is to be moved or deleted. The date value must conform to the ISO 8601 format. \n The time is always midnight UTC.

" + "smithy.api#documentation": "

Indicates at what date the object is to be moved or deleted. The date value must conform\n to the ISO 8601 format. The time is always midnight UTC.

" } }, "Days": { @@ -28847,7 +23807,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The ContinuationToken that represents a placeholder from where this request should\n begin.

", + "smithy.api#documentation": "

The ContinuationToken that represents a placeholder from where this request\n should begin.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29011,7 +23971,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The marker used to continue an inventory configuration listing that has been truncated.\n Use the NextContinuationToken from a previously truncated list response to continue the\n listing. The continuation token is an opaque value that Amazon S3 understands.

", + "smithy.api#documentation": "

The marker used to continue an inventory configuration listing that has been truncated.\n Use the NextContinuationToken from a previously truncated list response to\n continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29097,7 +24057,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The marker that is used to continue a metrics configuration listing that has been\n truncated. Use the NextContinuationToken from a previously truncated list response to\n continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", + "smithy.api#documentation": "

The marker that is used to continue a metrics configuration listing that has been\n truncated. Use the NextContinuationToken from a previously truncated list\n response to continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29271,7 +24231,7 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object keys in the response.

\n

If you specify encoding-type request parameter, Amazon S3 includes this element\n in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, KeyMarker, Prefix,\n NextKeyMarker, Key.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object keys in the response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, KeyMarker, Prefix,\n NextKeyMarker, Key.

" } }, "RequestCharged": { @@ -29292,7 +24252,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29316,7 +24276,7 @@ "KeyMarker": { "target": "com.amazonaws.s3#KeyMarker", "traits": { - "smithy.api#documentation": "

Together with upload-id-marker, this parameter specifies the multipart upload after\n which listing should begin.

\n

If upload-id-marker is not specified, only the keys lexicographically\n greater than the specified key-marker will be included in the list.

\n

If upload-id-marker is specified, any multipart uploads for a key equal to\n the key-marker might also be included, provided those multipart uploads have\n upload IDs lexicographically greater than the specified\n upload-id-marker.

", + "smithy.api#documentation": "

Together with upload-id-marker, this parameter specifies the multipart\n upload after which listing should begin.

\n

If upload-id-marker is not specified, only the keys lexicographically\n greater than the specified key-marker will be included in the list.

\n

If upload-id-marker is specified, any multipart uploads for a key equal to\n the key-marker might also be included, provided those multipart uploads have\n upload IDs lexicographically greater than the specified\n upload-id-marker.

", "smithy.api#httpQuery": "key-marker" } }, @@ -29331,7 +24291,7 @@ "Prefix": { "target": "com.amazonaws.s3#Prefix", "traits": { - "smithy.api#documentation": "

Lists in-progress uploads only for those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different grouping of keys. (You can think of\n using prefix to make groups in the same way you'd use a folder in a file system.)

", + "smithy.api#documentation": "

Lists in-progress uploads only for those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different grouping of keys. (You can think of\n using prefix to make groups in the same way that you'd use a folder in a file\n system.)

", "smithy.api#httpQuery": "prefix" } }, @@ -29369,7 +24329,7 @@ "target": "com.amazonaws.s3#ListObjectVersionsOutput" }, "traits": { - "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permissions to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design your\n application to parse the contents of the response and handle it appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", + "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permission to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design\n your application to parse the contents of the response and handle it\n appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", "smithy.api#examples": [ { "title": "To list object versions", @@ -29424,7 +24384,7 @@ "target": "com.amazonaws.s3#IsTruncated", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\n criteria. If your results were truncated, you can make a follow-up paginated request using\n the NextKeyMarker and NextVersionIdMarker response parameters as a starting place in\n another request to return the rest of the results.

" + "smithy.api#documentation": "

A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\n criteria. If your results were truncated, you can make a follow-up paginated request by\n using the NextKeyMarker and NextVersionIdMarker response\n parameters as a starting place in another request to return the rest of the results.

" } }, "KeyMarker": { @@ -29448,7 +24408,7 @@ "NextVersionIdMarker": { "target": "com.amazonaws.s3#NextVersionIdMarker", "traits": { - "smithy.api#documentation": "

When the number of responses exceeds the value of MaxKeys,\n NextVersionIdMarker specifies the first object version not returned that\n satisfies the search criteria. Use this value for the version-id-marker request parameter\n in a subsequent request.

" + "smithy.api#documentation": "

When the number of responses exceeds the value of MaxKeys,\n NextVersionIdMarker specifies the first object version not returned that\n satisfies the search criteria. Use this value for the version-id-marker\n request parameter in a subsequent request.

" } }, "Versions": { @@ -29482,7 +24442,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

The delimiter grouping the included keys. A delimiter is a character that you specify to\n group keys. All keys that contain the same string between the prefix and the first\n occurrence of the delimiter are grouped under a single result element in\n CommonPrefixes. These groups are counted as one result against the max-keys\n limitation. These keys are not returned elsewhere in the response.

" + "smithy.api#documentation": "

The delimiter grouping the included keys. A delimiter is a character that you specify to\n group keys. All keys that contain the same string between the prefix and the first\n occurrence of the delimiter are grouped under a single result element in\n CommonPrefixes. These groups are counted as one result against the\n max-keys limitation. These keys are not returned elsewhere in the\n response.

" } }, "MaxKeys": { @@ -29502,7 +24462,7 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify encoding-type request parameter, Amazon S3 includes this element in the\n response, and returns encoded key name values in the following response elements:

\n

\n KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.

" } }, "RequestCharged": { @@ -29534,7 +24494,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character that you specify to group keys. All keys that contain the\n same string between the prefix and the first occurrence of the delimiter are\n grouped under a single result element in CommonPrefixes. These groups are counted as one\n result against the max-keys limitation. These keys are not returned elsewhere in the\n response.

", + "smithy.api#documentation": "

A delimiter is a character that you specify to group keys. All keys that contain the\n same string between the prefix and the first occurrence of the delimiter are\n grouped under a single result element in CommonPrefixes. These groups are\n counted as one result against the max-keys limitation. These keys are not\n returned elsewhere in the response.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29555,14 +24515,14 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n If additional keys satisfy the search criteria, but were not returned because max-keys was\n exceeded, the response contains true. To return the\n additional keys, see key-marker and version-id-marker.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n If additional keys satisfy the search criteria, but were not returned because\n max-keys was exceeded, the response contains\n true. To return the additional keys,\n see key-marker and version-id-marker.

", "smithy.api#httpQuery": "max-keys" } }, "Prefix": { "target": "com.amazonaws.s3#Prefix", "traits": { - "smithy.api#documentation": "

Use this parameter to select only those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different groupings of keys. (You can think of\n using prefix to make groups in the same way you'd use a folder in a file system.) You can\n use prefix with delimiter to roll up numerous objects into a single result under\n CommonPrefixes.

", + "smithy.api#documentation": "

Use this parameter to select only those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different groupings of keys. (You can think of\n using prefix to make groups in the same way that you'd use a folder in a file\n system.) You can use prefix with delimiter to roll up numerous\n objects into a single result under CommonPrefixes.

", "smithy.api#httpQuery": "prefix" } }, @@ -29585,6 +24545,13 @@ "traits": { "smithy.api#httpHeader": "x-amz-request-payer" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29632,7 +24599,7 @@ "NextMarker": { "target": "com.amazonaws.s3#NextMarker", "traits": { - "smithy.api#documentation": "

When response is truncated (the IsTruncated element value in the response is true), you\n can use the key name in this field as marker in the subsequent request to get next set of\n objects. Amazon S3 lists objects in alphabetical order Note: This element is returned only if\n you have delimiter request parameter specified. If response does not include the NextMarker\n and it is truncated, you can use the value of the last Key in the response as the marker in\n the subsequent request to get the next set of object keys.

" + "smithy.api#documentation": "

When the response is truncated (the IsTruncated element value in the\n response is true), you can use the key name in this field as the\n marker parameter in the subsequent request to get the next set of objects.\n Amazon S3 lists objects in alphabetical order.

\n \n

This element is returned only if you have the delimiter request\n parameter specified. If the response does not include the NextMarker\n element and it is truncated, you can use the value of the last Key element\n in the response as the marker parameter in the subsequent request to get\n the next set of object keys.

\n
" } }, "Contents": { @@ -29670,7 +24637,7 @@ "CommonPrefixes": { "target": "com.amazonaws.s3#CommonPrefixList", "traits": { - "smithy.api#documentation": "

All of the keys (up to 1,000) rolled up in a common prefix count as a single return when\n calculating the number of returns.

\n

A response can contain CommonPrefixes only if you specify a delimiter.

\n

CommonPrefixes contains all (if there are any) keys between Prefix and the next\n occurrence of the string specified by the delimiter.

\n

CommonPrefixes lists keys that act like subdirectories in the directory specified by\n Prefix.

\n

For example, if the prefix is notes/ and the delimiter is a slash (/) as in\n notes/summer/july, the common prefix is notes/summer/. All of the keys that roll up into a\n common prefix count as a single return when calculating the number of returns.

", + "smithy.api#documentation": "

All of the keys (up to 1,000) rolled up in a common prefix count as a single return when\n calculating the number of returns.

\n

A response can contain CommonPrefixes only if you specify a\n delimiter.

\n

\n CommonPrefixes contains all (if there are any) keys between\n Prefix and the next occurrence of the string specified by the\n delimiter.

\n

\n CommonPrefixes lists keys that act like subdirectories in the directory\n specified by Prefix.

\n

For example, if the prefix is notes/ and the delimiter is a slash\n (/), as in notes/summer/july, the common prefix is\n notes/summer/. All of the keys that roll up into a common prefix count as a\n single return when calculating the number of returns.

", "smithy.api#xmlFlattened": {} } }, @@ -29698,7 +24665,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket containing the objects.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket containing the objects.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29709,7 +24676,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character you use to group keys.

", + "smithy.api#documentation": "

A delimiter is a character that you use to group keys.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29722,7 +24689,7 @@ "Marker": { "target": "com.amazonaws.s3#Marker", "traits": { - "smithy.api#documentation": "

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after\n this specified key. Marker can be any key in the bucket.

", + "smithy.api#documentation": "

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after this\n specified key. Marker can be any key in the bucket.

", "smithy.api#httpQuery": "marker" } }, @@ -29730,7 +24697,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n

", "smithy.api#httpQuery": "max-keys" } }, @@ -29754,6 +24721,13 @@ "smithy.api#documentation": "

The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with the HTTP status code 403 Forbidden (access denied).

", "smithy.api#httpHeader": "x-amz-expected-bucket-owner" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29774,7 +24748,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns some or all (up to 1,000) of the objects in a bucket with each request. You can\n use the request parameters as selection criteria to return a subset of the objects in a\n bucket. A 200 OK response can contain valid or invalid XML. Make sure to\n design your application to parse the contents of the response and handle it appropriately.\n Objects are returned sorted in an ascending order of the respective key names in the list.\n For more information about listing objects, see Listing object keys\n programmatically\n

\n

To use this operation, you must have READ access to the bucket.

\n

To use this action in an Identity and Access Management (IAM) policy, you must have permissions to perform\n the s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n \n

This section describes the latest revision of this action. We recommend that you use\n this revised API for application development. For backward compatibility, Amazon S3 continues\n to support the prior version of this API, ListObjects.

\n
\n

To get a list of your buckets, see ListBuckets.

\n

The following operations are related to ListObjectsV2:

\n ", + "smithy.api#documentation": "

Returns some or all (up to 1,000) of the objects in a bucket with each request. You can\n use the request parameters as selection criteria to return a subset of the objects in a\n bucket. A 200 OK response can contain valid or invalid XML. Make sure to\n design your application to parse the contents of the response and handle it appropriately.\n Objects are returned sorted in an ascending order of the respective key names in the list.\n For more information about listing objects, see Listing object keys\n programmatically in the Amazon S3 User Guide.

\n

To use this operation, you must have READ access to the bucket.

\n

To use this action in an Identity and Access Management (IAM) policy, you must have permission to perform\n the s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n \n

This section describes the latest revision of this action. We recommend that you use\n this revised API operation for application development. For backward compatibility, Amazon S3\n continues to support the prior version of this API operation, ListObjects.

\n
\n

To get a list of your buckets, see ListBuckets.

\n

The following operations are related to ListObjectsV2:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?list-type=2", @@ -29794,7 +24768,7 @@ "target": "com.amazonaws.s3#IsTruncated", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Set to false if all of the results were returned. Set to true if more keys are available\n to return. If the number of results exceeds that specified by MaxKeys, all of the results\n might not be returned.

" + "smithy.api#documentation": "

Set to false if all of the results were returned. Set to true\n if more keys are available to return. If the number of results exceeds that specified by\n MaxKeys, all of the results might not be returned.

" } }, "Contents": { @@ -29807,7 +24781,7 @@ "Name": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

" } }, "Prefix": { @@ -29819,14 +24793,14 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

Causes keys that contain the same string between the prefix and the first occurrence of\n the delimiter to be rolled up into a single result element in the CommonPrefixes\n collection. These rolled-up keys are not returned elsewhere in the response. Each rolled-up\n result counts as only one return against the MaxKeys value.

" + "smithy.api#documentation": "

Causes keys that contain the same string between the prefix and the first\n occurrence of the delimiter to be rolled up into a single result element in the\n CommonPrefixes collection. These rolled-up keys are not returned elsewhere\n in the response. Each rolled-up result counts as only one return against the\n MaxKeys value.

" } }, "MaxKeys": { "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

" + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

" } }, "CommonPrefixes": { @@ -29839,20 +24813,20 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this element in the\n response, and returns encoded key name values in the following response elements:

\n

\n Delimiter, Prefix, Key, and StartAfter.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, Prefix, Key, and StartAfter.

" } }, "KeyCount": { "target": "com.amazonaws.s3#KeyCount", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

KeyCount is the number of keys returned with this request. KeyCount will always be less\n than or equal to the MaxKeys field. Say you ask for 50 keys, your result will\n include 50 keys or fewer.

" + "smithy.api#documentation": "

\n KeyCount is the number of keys returned with this request.\n KeyCount will always be less than or equal to the MaxKeys\n field. For example, if you ask for 50 keys, your result will include 50 keys or\n fewer.

" } }, "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

If ContinuationToken was sent with the request, it is included in the response.

" + "smithy.api#documentation": "

If ContinuationToken was sent with the request, it is included in the\n response.

" } }, "NextContinuationToken": { @@ -29885,7 +24859,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

Bucket name to list.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Bucket name to list.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29896,7 +24870,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character you use to group keys.

", + "smithy.api#documentation": "

A delimiter is a character that you use to group keys.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29911,7 +24885,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

", "smithy.api#httpQuery": "max-keys" } }, @@ -29925,7 +24899,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

ContinuationToken indicates Amazon S3 that the list is being continued on this bucket with a\n token. ContinuationToken is obfuscated and is not a real key.

", + "smithy.api#documentation": "

\n ContinuationToken indicates to Amazon S3 that the list is being continued on\n this bucket with a token. ContinuationToken is obfuscated and is not a real\n key.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29933,7 +24907,7 @@ "target": "com.amazonaws.s3#FetchOwner", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

The owner field is not present in listV2 by default, if you want to return owner field\n with each key in the result then set the fetch owner field to true.

", + "smithy.api#documentation": "

The owner field is not present in ListObjectsV2 by default. If you want to\n return the owner field with each key in the result, then set the FetchOwner\n field to true.

", "smithy.api#httpQuery": "fetch-owner" } }, @@ -29957,6 +24931,13 @@ "smithy.api#documentation": "

The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with the HTTP status code 403 Forbidden (access denied).

", "smithy.api#httpHeader": "x-amz-expected-bucket-owner" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29992,7 +24973,7 @@ "AbortDate": { "target": "com.amazonaws.s3#AbortDate", "traits": { - "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, then the response includes this header indicating when the initiated multipart\n upload will become eligible for abort operation. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

The response will also include the x-amz-abort-rule-id header that will\n provide the ID of the lifecycle configuration rule that defines this action.

", + "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, then the response includes this header indicating when the initiated multipart\n upload will become eligible for abort operation. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

The response will also include the x-amz-abort-rule-id header that will\n provide the ID of the lifecycle configuration rule that defines this action.

", "smithy.api#httpHeader": "x-amz-abort-date" } }, @@ -30030,7 +25011,7 @@ "NextPartNumberMarker": { "target": "com.amazonaws.s3#NextPartNumberMarker", "traits": { - "smithy.api#documentation": "

When a list is truncated, this element specifies the last part in the list, as well as\n the value to use for the part-number-marker request parameter in a subsequent\n request.

" + "smithy.api#documentation": "

When a list is truncated, this element specifies the last part in the list, as well as\n the value to use for the part-number-marker request parameter in a subsequent\n request.

" } }, "MaxParts": { @@ -30097,7 +25078,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the parts are being uploaded.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the parts are being uploaded.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -30308,13 +25289,13 @@ "Name": { "target": "com.amazonaws.s3#MetadataKey", "traits": { - "smithy.api#documentation": "

Name of the Object.

" + "smithy.api#documentation": "

Name of the object.

" } }, "Value": { "target": "com.amazonaws.s3#MetadataValue", "traits": { - "smithy.api#documentation": "

Value of the Object.

" + "smithy.api#documentation": "

Value of the object.

" } } }, @@ -30682,7 +25663,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies object key name filtering rules. For information about key name filtering, see\n Configuring event notifications using object key name filtering in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies object key name filtering rules. For information about key name filtering, see\n Configuring event\n notifications using object key name filtering in the\n Amazon S3 User Guide.

" } }, "com.amazonaws.s3#NotificationId": { @@ -30737,6 +25718,12 @@ "traits": { "smithy.api#documentation": "

The owner of the object

" } + }, + "RestoreStatus": { + "target": "com.amazonaws.s3#RestoreStatus", + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" + } } }, "traits": { @@ -31247,6 +26234,12 @@ "traits": { "smithy.api#documentation": "

Specifies the owner of the object.

" } + }, + "RestoreStatus": { + "target": "com.amazonaws.s3#RestoreStatus", + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" + } } }, "traits": { @@ -31273,6 +26266,23 @@ } } }, + "com.amazonaws.s3#OptionalObjectAttributes": { + "type": "enum", + "members": { + "RESTORE_STATUS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "RestoreStatus" + } + } + } + }, + "com.amazonaws.s3#OptionalObjectAttributesList": { + "type": "list", + "member": { + "target": "com.amazonaws.s3#OptionalObjectAttributes" + } + }, "com.amazonaws.s3#OutputLocation": { "type": "structure", "members": { @@ -31723,7 +26733,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. Specify the canned ACL name as the\n value of x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n the x-amz-acl header to set a canned ACL. These parameters map to the\n set of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants create,\n overwrite, and delete objects permission to LogDelivery group predefined by Amazon S3 and\n two Amazon Web Services accounts identified by their email addresses.

    \n

    \n x-amz-grant-write: uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\",\n id=\"111122223333\", id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", + "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3\n supports a set of predefined ACLs, known as canned\n ACLs. Each canned ACL has a predefined set of grantees and\n permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other\n access control-specific headers in your request. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers,\n you specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3\n groups) who will receive the permission. If you use these ACL-specific\n headers, you cannot use the x-amz-acl header to set a canned\n ACL. These parameters map to the set of permissions that Amazon S3 supports in an\n ACL. For more information, see Access Control List (ACL)\n Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants\n create, overwrite, and delete objects permission to LogDelivery group\n predefined by Amazon S3 and two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-write:\n uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\", id=\"111122223333\",\n id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights\n (using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET\n Object acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", "smithy.api#examples": [ { "title": "Put bucket acl", @@ -31841,7 +26851,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Sets an analytics configuration for the bucket (specified by the analytics configuration\n ID). You can have up to 1,000 analytics configurations per bucket.

\n

You can choose to have storage class analysis export analysis reports sent to a\n comma-separated values (CSV) flat file. See the DataExport request element.\n Reports are updated daily and are based on the object filters that you configure. When\n selecting data export, you specify a destination bucket and an optional destination prefix\n where the file is written. You can export the data to a destination bucket in a different\n account. However, the destination bucket must be in the same Region as the bucket that you\n are making the PUT analytics configuration to. For more information, see Amazon S3\n Analytics – Storage Class Analysis.

\n \n

You must create a bucket policy on the destination bucket where the exported file is\n written to grant permissions to Amazon S3 to write objects to the bucket. For an example\n policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketAnalyticsConfiguration has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: InvalidArgument\n

      \n
    • \n
    • \n

      \n Cause: Invalid argument.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: TooManyConfigurations\n

      \n
    • \n
    • \n

      \n Cause: You are attempting to create a new configuration but have\n already reached the 1,000-configuration limit.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 403 Forbidden\n

      \n
    • \n
    • \n

      \n Code: AccessDenied\n

      \n
    • \n
    • \n

      \n Cause: You are not the owner of the specified bucket, or you do\n not have the s3:PutAnalyticsConfiguration bucket permission to set the\n configuration on the bucket.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketAnalyticsConfiguration:

\n ", + "smithy.api#documentation": "

Sets an analytics configuration for the bucket (specified by the analytics configuration\n ID). You can have up to 1,000 analytics configurations per bucket.

\n

You can choose to have storage class analysis export analysis reports sent to a\n comma-separated values (CSV) flat file. See the DataExport request element.\n Reports are updated daily and are based on the object filters that you configure. When\n selecting data export, you specify a destination bucket and an optional destination prefix\n where the file is written. You can export the data to a destination bucket in a different\n account. However, the destination bucket must be in the same Region as the bucket that you\n are making the PUT analytics configuration to. For more information, see Amazon S3\n Analytics – Storage Class Analysis.

\n \n

You must create a bucket policy on the destination bucket where the exported file is\n written to grant permissions to Amazon S3 to write objects to the bucket. For an example\n policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketAnalyticsConfiguration has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: InvalidArgument\n

      \n
    • \n
    • \n

      \n Cause: Invalid argument.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: TooManyConfigurations\n

      \n
    • \n
    • \n

      \n Cause: You are attempting to create a new configuration but have\n already reached the 1,000-configuration limit.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 403 Forbidden\n

      \n
    • \n
    • \n

      \n Code: AccessDenied\n

      \n
    • \n
    • \n

      \n Cause: You are not the owner of the specified bucket, or you do\n not have the s3:PutAnalyticsConfiguration bucket permission to set the\n configuration on the bucket.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to\n PutBucketAnalyticsConfiguration:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?analytics", @@ -32018,7 +27028,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

This action uses the encryption subresource to configure default encryption\n and Amazon S3 Bucket Keys for an existing bucket.

\n

By default, all buckets have a default encryption configuration that uses server-side\n encryption with Amazon S3 managed keys (SSE-S3). You can optionally configure default encryption\n for a bucket by using server-side encryption with Key Management Service (KMS) keys (SSE-KMS),\n dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side\n encryption with customer-provided keys (SSE-C). If you specify default encryption by using\n SSE-KMS, you can also configure Amazon S3 Bucket Keys. For information about bucket default\n encryption, see Amazon S3 bucket default encryption\n in the Amazon S3 User Guide. For more information about S3 Bucket Keys, see\n Amazon S3 Bucket\n Keys in the Amazon S3 User Guide.

\n \n

This action requires Amazon Web Services Signature Version 4. For more information, see \n Authenticating Requests (Amazon Web Services Signature Version 4).

\n
\n

To use this operation, you must have permission to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to PutBucketEncryption:

\n ", + "smithy.api#documentation": "

This action uses the encryption subresource to configure default encryption\n and Amazon S3 Bucket Keys for an existing bucket.

\n

By default, all buckets have a default encryption configuration that uses server-side\n encryption with Amazon S3 managed keys (SSE-S3). You can optionally configure default encryption\n for a bucket by using server-side encryption with Key Management Service (KMS) keys (SSE-KMS) or\n dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). If you specify default encryption by using\n SSE-KMS, you can also configure Amazon S3 Bucket\n Keys. If you use PutBucketEncryption to set your default bucket encryption to SSE-KMS, you should verify that your KMS key ID is correct. Amazon S3 does not validate the KMS key ID provided in PutBucketEncryption requests.

\n \n

This action requires Amazon Web Services Signature Version 4. For more information, see \n Authenticating Requests (Amazon Web Services Signature Version 4).

\n
\n

To use this operation, you must have permission to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to PutBucketEncryption:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?encryption", @@ -32083,7 +27093,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to\n 1,000 S3 Intelligent-Tiering configurations per bucket.

\n

The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.

\n

The S3 Intelligent-Tiering storage class is the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.

\n

For more information, see Storage class for automatically optimizing frequently and infrequently accessed objects.

\n

Operations related to PutBucketIntelligentTieringConfiguration include:

\n \n \n

You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically\n move objects stored in the S3 Intelligent-Tiering storage class to the Archive Access\n or Deep Archive Access tier.

\n
\n

\n PutBucketIntelligentTieringConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket,\n or you do not have the s3:PutIntelligentTieringConfiguration\n bucket permission to set the configuration on the bucket.

\n
\n
", + "smithy.api#documentation": "

Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to\n 1,000 S3 Intelligent-Tiering configurations per bucket.

\n

The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.

\n

The S3 Intelligent-Tiering storage class is the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.

\n

For more information, see Storage class for automatically optimizing frequently and infrequently accessed objects.

\n

Operations related to PutBucketIntelligentTieringConfiguration include:

\n \n \n

You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically\n move objects stored in the S3 Intelligent-Tiering storage class to the Archive Access\n or Deep Archive Access tier.

\n
\n

\n PutBucketIntelligentTieringConfiguration has the following special\n errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket, or\n you do not have the s3:PutIntelligentTieringConfiguration bucket\n permission to set the configuration on the bucket.

\n
\n
", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?intelligent-tiering", @@ -32136,7 +27146,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the PUT action adds an inventory configuration\n (identified by the inventory ID) to the bucket. You can have up to 1,000 inventory\n configurations per bucket.

\n

Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly\n basis, and the results are published to a flat file. The bucket that is inventoried is\n called the source bucket, and the bucket where the inventory flat file\n is stored is called the destination bucket. The\n destination bucket must be in the same Amazon Web Services Region as the\n source bucket.

\n

When you configure an inventory for a source bucket, you specify\n the destination bucket where you want the inventory to be stored, and\n whether to generate the inventory daily or weekly. You can also configure what object\n metadata to include and whether to inventory all object versions or only current versions.\n For more information, see Amazon S3 Inventory in the\n Amazon S3 User Guide.

\n \n

You must create a bucket policy on the destination bucket to\n grant permissions to Amazon S3 to write objects to the bucket in the defined location. For an\n example policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n
\n
Permissions
\n
\n

To use this operation, you must have permission to perform the\n s3:PutInventoryConfiguration action. The bucket owner has this permission\n by default and can grant this permission to others.

\n

The s3:PutInventoryConfiguration permission allows a user to create an\n S3\n Inventory report that includes all object metadata fields available and to\n specify the destination bucket to store the inventory. A user with read access to objects\n in the destination bucket can also access all object metadata fields that are available in\n the inventory report.

\n

To restrict access to an inventory report, see Restricting access to an Amazon S3 Inventory report in the\n Amazon S3 User Guide. For more information about the metadata fields\n available in S3 Inventory, see Amazon S3\n Inventory lists in the Amazon S3 User Guide. For more\n information about permissions, see Permissions related to bucket subresource operations and Identity and\n access management in Amazon S3 in the Amazon S3 User Guide.

\n
\n
\n

\n PutBucketInventoryConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket,\n or you do not have the s3:PutInventoryConfiguration bucket\n permission to set the configuration on the bucket.

\n
\n
\n

The following operations are related to PutBucketInventoryConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the PUT action adds an inventory configuration\n (identified by the inventory ID) to the bucket. You can have up to 1,000 inventory\n configurations per bucket.

\n

Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly\n basis, and the results are published to a flat file. The bucket that is inventoried is\n called the source bucket, and the bucket where the inventory flat file\n is stored is called the destination bucket. The\n destination bucket must be in the same Amazon Web Services Region as the\n source bucket.

\n

When you configure an inventory for a source bucket, you specify\n the destination bucket where you want the inventory to be stored, and\n whether to generate the inventory daily or weekly. You can also configure what object\n metadata to include and whether to inventory all object versions or only current versions.\n For more information, see Amazon S3 Inventory in the\n Amazon S3 User Guide.

\n \n

You must create a bucket policy on the destination bucket to\n grant permissions to Amazon S3 to write objects to the bucket in the defined location. For an\n example policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n
\n
Permissions
\n
\n

To use this operation, you must have permission to perform the\n s3:PutInventoryConfiguration action. The bucket owner has this\n permission by default and can grant this permission to others.

\n

The s3:PutInventoryConfiguration permission allows a user to\n create an S3 Inventory\n report that includes all object metadata fields available and to specify the\n destination bucket to store the inventory. A user with read access to objects in\n the destination bucket can also access all object metadata fields that are\n available in the inventory report.

\n

To restrict access to an inventory report, see Restricting access to an Amazon S3 Inventory report in the\n Amazon S3 User Guide. For more information about the metadata\n fields available in S3 Inventory, see Amazon S3 Inventory lists in the Amazon S3 User Guide. For\n more information about permissions, see Permissions related to bucket subresource operations and Identity and access management in Amazon S3 in the\n Amazon S3 User Guide.

\n
\n
\n

\n PutBucketInventoryConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket, or\n you do not have the s3:PutInventoryConfiguration bucket permission to\n set the configuration on the bucket.

\n
\n
\n

The following operations are related to\n PutBucketInventoryConfiguration:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?inventory", @@ -32200,7 +27210,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3 Lifecycle\n configuration can have up to 1,000 rules. This limit is not adjustable. Each rule consists\n of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The filter can\n be based on a key name prefix, object tags, or a combination of both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want Amazon S3 to\n perform on the objects identified by the filter. If the state of your bucket is\n versioning-enabled or versioning-suspended, you can have many versions of the same\n object (one current version and zero or more noncurrent versions). Amazon S3 provides\n predefined actions that you can specify for current and noncurrent object\n versions.

    \n
  • \n
\n

For more information, see Object Lifecycle Management\n and Lifecycle Configuration Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and related\n subresources (for example, lifecycle configuration and website configuration). Only the\n resource owner (that is, the Amazon Web Services account that created it) can access the resource. The\n resource owner can optionally grant access permissions to others by writing an access\n policy. For this operation, a user must get the s3:PutLifecycleConfiguration\n permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any other\n permissions. If you want to block users or accounts from removing or deleting objects from\n your bucket, you must deny them permissions for the following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access Permissions to\n Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to PutBucketLifecycleConfiguration:

\n ", + "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3\n Lifecycle configuration can have up to 1,000 rules. This limit is not adjustable.\n Each rule consists of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The\n filter can be based on a key name prefix, object tags, or a combination of\n both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want\n Amazon S3 to perform on the objects identified by the filter. If the state of\n your bucket is versioning-enabled or versioning-suspended, you can have many\n versions of the same object (one current version and zero or more noncurrent\n versions). Amazon S3 provides predefined actions that you can specify for current\n and noncurrent object versions.

    \n
  • \n
\n

For more information, see Object Lifecycle\n Management and Lifecycle Configuration\n Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and\n related subresources (for example, lifecycle configuration and website\n configuration). Only the resource owner (that is, the Amazon Web Services account that created\n it) can access the resource. The resource owner can optionally grant access\n permissions to others by writing an access policy. For this operation, a user must\n get the s3:PutLifecycleConfiguration permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any\n other permissions. If you want to block users or accounts from removing or\n deleting objects from your bucket, you must deny them permissions for the\n following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access\n Permissions to Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to\n PutBucketLifecycleConfiguration:

\n ", "smithy.api#examples": [ { "title": "Put bucket lifecycle", @@ -32291,7 +27301,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GETObjectAcl\n request, appears as the CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request elements. To disable\n logging, you use an empty BucketLoggingStatus request element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", + "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by\n using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a\n response to a GETObjectAcl request, appears as the\n CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request\n elements. To disable logging, you use an empty BucketLoggingStatus request\n element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", "smithy.api#examples": [ { "title": "Set logging configuration for a bucket", @@ -32585,7 +27595,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", + "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", "smithy.api#examples": [ { "title": "Set bucket policy", @@ -32672,7 +27682,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using server-side\n encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\n SourceSelectionCriteria, SseKmsEncryptedObjects,\n Status, EncryptionConfiguration, and\n ReplicaKmsKeyID. For information about replication configuration, see\n Replicating Objects\n Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the bucket,\n can perform this operation. The resource owner can also grant others permissions to perform\n the operation. For more information about permissions, see Specifying Permissions in a\n Policy and Managing Access Permissions to\n Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have the\n iam:PassRole permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", + "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information. You can invoke this request for a specific\n Amazon Web Services Region by using the \n \n aws:RequestedRegion\n condition key.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using\n server-side encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects,\n add the following: SourceSelectionCriteria,\n SseKmsEncryptedObjects, Status,\n EncryptionConfiguration, and ReplicaKmsKeyID. For\n information about replication configuration, see Replicating\n Objects Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the\n bucket, can perform this operation. The resource owner can also grant others\n permissions to perform the operation. For more information about permissions, see\n Specifying Permissions in\n a Policy and Managing Access\n Permissions to Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have\n the iam:PassRole\n permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", "smithy.api#examples": [ { "title": "Set replication configuration on a bucket", @@ -32852,7 +27862,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3 Bucket\n Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors:

\n
    \n
  • \n

    Error code: InvalidTagError\n

    \n \n
  • \n
  • \n

    Error code: MalformedXMLError\n

    \n
      \n
    • \n

      Description: The XML provided does not match the schema.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: OperationAbortedError \n

    \n
      \n
    • \n

      Description: A conflicting conditional action is currently in progress\n against this resource. Please try again.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InternalError\n

    \n
      \n
    • \n

      Description: The service was unable to apply the provided tag to the\n bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", + "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3\n Bucket Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors. For more Amazon S3 errors\n see, Error\n Responses.

\n
    \n
  • \n

    \n InvalidTag - The tag provided was not a valid tag. This error\n can occur if the tag did not pass input validation. For more information, see Using\n Cost Allocation in Amazon S3 Bucket Tags.

    \n
  • \n
  • \n

    \n MalformedXML - The XML provided does not match the\n schema.

    \n
  • \n
  • \n

    \n OperationAborted - A conflicting conditional action is\n currently in progress against this resource. Please try again.

    \n
  • \n
  • \n

    \n InternalError - The service was unable to apply the provided\n tag to the bucket.

    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", "smithy.api#examples": [ { "title": "Set tags on a bucket", @@ -32943,7 +27953,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket and\n you want to maintain the same permanent delete behavior when you enable versioning, you\n must add a noncurrent expiration policy. The noncurrent expiration lifecycle configuration will\n manage the deletes of the noncurrent object versions in the version-enabled bucket. (A\n version-enabled bucket maintains one current and zero or more noncurrent object\n versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", + "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket\n and you want to maintain the same permanent delete behavior when you enable versioning,\n you must add a noncurrent expiration policy. The noncurrent expiration lifecycle\n configuration will manage the deletes of the noncurrent object versions in the\n version-enabled bucket. (A version-enabled bucket maintains one current and zero or more\n noncurrent object versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", "smithy.api#examples": [ { "title": "Set versioning configuration on a bucket", @@ -33033,7 +28043,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

\n

The maximum request length is limited to 128 KB.

", "smithy.api#examples": [ { "title": "Set website configuration on a bucket", @@ -33123,16 +28133,15 @@ "smithy.api#documentation": "

Adds an object to a bucket. You must have WRITE permissions on a bucket to add an object\n to it.

\n \n

Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the\n entire object to the bucket. You cannot use PutObject to only update a\n single piece of metadata for an existing object. You must put the entire object with\n updated metadata if you want to update some values.

\n
\n

Amazon S3 is a distributed system. If it receives multiple write requests for the same object\n simultaneously, it overwrites all but the last object written. To prevent objects from\n being deleted or overwritten, you can use Amazon S3 Object\n Lock.

\n

To ensure that data is not corrupted traversing the network, use the\n Content-MD5 header. When you use this header, Amazon S3 checks the object\n against the provided MD5 value and, if they do not match, returns an error. Additionally,\n you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to\n the calculated MD5 value.

\n \n
    \n
  • \n

    To successfully complete the PutObject request, you must have the\n s3:PutObject in your IAM permissions.

    \n
  • \n
  • \n

    To successfully change the objects acl of your PutObject request,\n you must have the s3:PutObjectAcl in your IAM permissions.

    \n
  • \n
  • \n

    To successfully set the tag-set with your PutObject request, you\n must have the s3:PutObjectTagging in your IAM permissions.

    \n
  • \n
  • \n

    The Content-MD5 header is required for any request to upload an\n object with a retention period configured using Amazon S3 Object Lock. For more\n information about Amazon S3 Object Lock, see Amazon S3 Object Lock\n Overview in the Amazon S3 User Guide.

    \n
  • \n
\n
\n

You have four mutually exclusive options to protect data using server-side encryption in\n Amazon S3, depending on how you choose to manage the encryption keys. Specifically, the\n encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with server-side\n encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to\n encrypt data at rest by using server-side encryption with other key options. For more\n information, see Using Server-Side\n Encryption.

\n

When adding a new object, you can use headers to grant ACL-based permissions to\n individual Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are\n then added to the ACL on the object. By default, all objects are private. Only the owner\n has full access control. For more information, see Access Control List (ACL) Overview\n and Managing\n ACLs Using the REST API.

\n

If the bucket that you're uploading objects to uses the bucket owner enforced setting\n for S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that\n use this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format. PUT requests that\n contain other ACLs (for example, custom grants to certain Amazon Web Services accounts) fail and return a\n 400 error with the error code AccessControlListNotSupported.\n For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID\n for the object being stored. Amazon S3 returns this ID in the response. When you enable\n versioning for a bucket, if Amazon S3 receives multiple write requests for the same object\n simultaneously, it stores all of the objects. For more information about versioning, see\n Adding Objects to\n Versioning-Enabled Buckets. For information about returning the versioning state\n of a bucket, see GetBucketVersioning.

\n

For more information about related Amazon S3 APIs, see the following:

\n ", "smithy.api#examples": [ { - "title": "To upload an object and specify optional tags", - "documentation": "The following example uploads an object. The request specifies optional object tags. The bucket is versioned, therefore S3 returns version ID of the newly created object.", + "title": "To upload an object", + "documentation": "The following example uploads an object to a versioning-enabled bucket. The source file is specified using Windows file syntax. S3 returns VersionId of the newly created object.", "input": { - "Body": "c:\\HappyFace.jpg", + "Body": "HappyFace.jpg", "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "Tagging": "key1=value1&key2=value2" + "Key": "HappyFace.jpg" }, "output": { - "VersionId": "psM2sYY4.o1501dSx8wMvnkOzSBB.V4a", + "VersionId": "tpf3zF08nBplQK1XLOefGskR7mGDwcDk", "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" } } @@ -33162,7 +28171,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined set\n of grantees and permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n x-amz-acl header to set a canned ACL. These parameters map to the set\n of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants list\n objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets the ACL of\n the current version of an object. To set the ACL of a different version, use the\n versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", + "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3\n supports a set of predefined ACLs, known as canned ACLs. Each canned ACL has\n a predefined set of grantees and permissions. Specify the canned ACL name as\n the value of x-amz-acl. If you use this header, you cannot use\n other access control-specific headers in your request. For more information,\n see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers,\n you specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3\n groups) who will receive the permission. If you use these ACL-specific\n headers, you cannot use x-amz-acl header to set a canned ACL.\n These parameters map to the set of permissions that Amazon S3 supports in an ACL.\n For more information, see Access Control List (ACL)\n Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants\n list objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights\n (using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET\n Object acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets\n the ACL of the current version of an object. To set the ACL of a different\n version, use the versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", "smithy.api#examples": [ { "title": "To grant permissions using object ACL", @@ -33279,7 +28288,7 @@ "Key": { "target": "com.amazonaws.s3#ObjectKey", "traits": { - "smithy.api#documentation": "

Key for which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Key for which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} } @@ -33592,7 +28601,7 @@ "SSEKMSEncryptionContext": { "target": "com.amazonaws.s3#SSEKMSEncryptionContext", "traits": { - "smithy.api#documentation": "

If present, specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The\n value of this header is a base64-encoded UTF-8 string holding JSON with the encryption\n context key-value pairs. This value is stored as object metadata and automatically gets passed\n on to Amazon Web Services KMS for future GetObject or CopyObject operations on\n this object.

", + "smithy.api#documentation": "

If present, specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The\n value of this header is a base64-encoded UTF-8 string holding JSON with the encryption\n context key-value pairs. This value is stored as object metadata and automatically gets\n passed on to Amazon Web Services KMS for future GetObject or CopyObject\n operations on this object.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-context" } }, @@ -33636,7 +28645,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name to which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name to which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -33824,14 +28833,14 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

If x-amz-server-side-encryption has a valid value of aws:kms\n or aws:kms:dsse, this header specifies the ID of the Key Management Service (KMS)\n symmetric encryption customer managed key that was used for the object. If you specify\n x-amz-server-side-encryption:aws:kms or\n x-amz-server-side-encryption:aws:kms:dsse, but do not provide\n x-amz-server-side-encryption-aws-kms-key-id, Amazon S3 uses the Amazon Web Services managed key\n (aws/s3) to protect the data. If the KMS key does not exist in the same\n account that's issuing the command, you must use the full ARN and not just the ID.

", + "smithy.api#documentation": "

If x-amz-server-side-encryption has a valid value of aws:kms\n or aws:kms:dsse, this header specifies the ID (Key ID, Key ARN, or Key Alias) of the Key Management Service (KMS)\n symmetric encryption customer managed key that was used for the object. If you specify\n x-amz-server-side-encryption:aws:kms or\n x-amz-server-side-encryption:aws:kms:dsse, but do not provide\n x-amz-server-side-encryption-aws-kms-key-id, Amazon S3 uses the Amazon Web Services managed key\n (aws/s3) to protect the data. If the KMS key does not exist in the same\n account that's issuing the command, you must use the full ARN and not just the ID.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, "SSEKMSEncryptionContext": { "target": "com.amazonaws.s3#SSEKMSEncryptionContext", "traits": { - "smithy.api#documentation": "

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\n this header is a base64-encoded UTF-8 string holding JSON with the encryption context\n key-value pairs. This value is stored as object metadata and automatically gets passed on to\n Amazon Web Services KMS for future GetObject or CopyObject operations on this\n object.

", + "smithy.api#documentation": "

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\n this header is a base64-encoded UTF-8 string holding JSON with the encryption context\n key-value pairs. This value is stored as object metadata and automatically gets passed on\n to Amazon Web Services KMS for future GetObject or CopyObject operations on\n this object.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-context" } }, @@ -34014,7 +29023,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket.

\n

A tag is a key-value pair. You can associate tags with an object by sending a PUT\n request against the tagging subresource that is associated with the object. You can\n retrieve tags by sending a GET request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

\n PutObjectTagging has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n Code: InvalidTagError \n

      \n
    • \n
    • \n

      \n Cause: The tag provided was not a valid tag. This error can occur\n if the tag did not pass input validation. For more information, see Object\n Tagging.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: MalformedXMLError \n

      \n
    • \n
    • \n

      \n Cause: The XML provided does not match the schema.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: OperationAbortedError \n

      \n
    • \n
    • \n

      \n Cause: A conflicting conditional action is currently in progress\n against this resource. Please try again.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InternalError\n

      \n
    • \n
    • \n

      \n Cause: The service was unable to apply the provided tag to the\n object.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", + "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket. A tag is a\n key-value pair. For more information, see Object Tagging.

\n

You can associate tags with an object by sending a PUT request against the tagging\n subresource that is associated with the object. You can retrieve tags by sending a GET\n request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

\n PutObjectTagging has the following special errors. For more Amazon S3 errors\n see, Error\n Responses.

\n
    \n
  • \n

    \n InvalidTag - The tag provided was not a valid tag. This error\n can occur if the tag did not pass input validation. For more information, see Object\n Tagging.

    \n
  • \n
  • \n

    \n MalformedXML - The XML provided does not match the\n schema.

    \n
  • \n
  • \n

    \n OperationAborted - A conflicting conditional action is\n currently in progress against this resource. Please try again.

    \n
  • \n
  • \n

    \n InternalError - The service was unable to apply the provided\n tag to the object.

    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", "smithy.api#examples": [ { "title": "To add tags to an existing object", @@ -34068,7 +29077,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34145,7 +29154,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates or modifies the PublicAccessBlock configuration for an Amazon S3 bucket.\n To use this operation, you must have the s3:PutBucketPublicAccessBlock\n permission. For more information about Amazon S3 permissions, see Specifying Permissions in a\n Policy.

\n \n

When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or\n an object, it checks the PublicAccessBlock configuration for both the\n bucket (or the bucket that contains the object) and the bucket owner's account. If the\n PublicAccessBlock configurations are different between the bucket and\n the account, Amazon S3 uses the most restrictive combination of the bucket-level and\n account-level settings.

\n
\n

For more information about when Amazon S3 considers a bucket or an object public, see The Meaning of \"Public\".

\n

The following operations are related to PutPublicAccessBlock:

\n ", + "smithy.api#documentation": "

Creates or modifies the PublicAccessBlock configuration for an Amazon S3 bucket.\n To use this operation, you must have the s3:PutBucketPublicAccessBlock\n permission. For more information about Amazon S3 permissions, see Specifying Permissions in a\n Policy.

\n \n

When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or\n an object, it checks the PublicAccessBlock configuration for both the\n bucket (or the bucket that contains the object) and the bucket owner's account. If the\n PublicAccessBlock configurations are different between the bucket and\n the account, S3 uses the most restrictive combination of the bucket-level and\n account-level settings.

\n
\n

For more information about when Amazon S3 considers a bucket or an object public, see The Meaning of \"Public\".

\n

The following operations are related to PutPublicAccessBlock:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?publicAccessBlock", @@ -34655,7 +29664,7 @@ } }, "traits": { - "smithy.api#documentation": "

Confirms that the requester knows that they will be charged for the request. Bucket\n owners need not specify this parameter in their requests. For information about downloading\n objects from Requester Pays buckets, see Downloading Objects in\n Requester Pays Buckets in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Confirms that the requester knows that they will be charged for the request. Bucket\n owners need not specify this parameter in their requests. If either the source or\n destination Amazon S3 bucket has Requester Pays enabled, the requester will pay for\n corresponding charges to copy the object. For information about downloading objects from\n Requester Pays buckets, see Downloading Objects in\n Requester Pays Buckets in the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#RequestPaymentConfiguration": { @@ -34718,6 +29727,9 @@ "com.amazonaws.s3#Restore": { "type": "string" }, + "com.amazonaws.s3#RestoreExpiryDate": { + "type": "timestamp" + }, "com.amazonaws.s3#RestoreObject": { "type": "operation", "input": { @@ -34735,7 +29747,7 @@ "aws.protocols#httpChecksum": { "requestAlgorithmMember": "ChecksumAlgorithm" }, - "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your\n query in the request body's SelectParameters structure. You can use\n expressions like the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified\n object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object,\n you can specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field\n to IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval or\n S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive storage\n classes, you must first initiate a restore request, and then wait until a temporary copy of\n the object is available. If you want a permanent copy of the object, create a copy of it in\n the Amazon S3 Standard storage class in your S3 bucket. To access an archived object, you must\n restore the object for the duration (number of days) that you specify. For objects in the\n Archive Access or Deep Archive Access tiers of S3 Intelligent-Tiering, you must first\n initiate a restore request, and then wait until the object is moved into the Frequent\n Access tier.

\n

To restore a specific object version, you can provide a version ID. If you don't provide\n a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data access tier\n options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access your\n data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier when occasional urgent requests for restoring archives\n are required. For all but the largest archived objects (250 MB+), data accessed using\n Expedited retrievals is typically made available within 1–5 minutes. Provisioned\n capacity ensures that retrieval capacity for Expedited retrievals is available when\n you need it. Expedited retrievals and provisioned capacity are not available for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of your\n archived objects within several hours. This is the default option for retrieval\n requests that do not specify the retrieval option. Standard retrievals typically\n finish within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval Flexible\n Retrieval storage class or S3 Intelligent-Tiering Archive tier. They typically finish within\n 12 hours for objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored in\n S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the S3 Glacier\n Flexible Retrieval and S3 Intelligent-Tiering storage classes, enabling you to\n retrieve large amounts, even petabytes, of data at no cost. Bulk retrievals typically\n finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval\n Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are\n also the lowest-cost retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for objects\n stored in the S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive\n tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity for\n Expedited data access, see Restoring Archived Objects in\n the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster speed\n while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD request.\n Operations return the x-amz-restore header, which provides information about\n the restoration status, in the response. You can use Amazon S3 event notifications to notify you\n when a restore is initiated or completed. For more information, see Configuring Amazon S3\n Event Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by reissuing\n the request with a new period. Amazon S3 updates the restoration period relative to the current\n time and charges only for the request-there are no data transfer charges. You cannot\n update the restoration period when Amazon S3 is actively processing your current restore request\n for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an expiration\n action, the object expiration overrides the life span that you specify in a restore\n request. For example, if you restore an object copy for 10 days, but the object is\n scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days. For more information\n about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle Management\n in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202 Accepted\n status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in the\n response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error does not\n apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available. Try again\n later. (Returned if there is insufficient capacity to process the Expedited\n request. This error applies only to Expedited retrievals and not to\n S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", + "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your query\n in the request body's SelectParameters structure. You can use expressions like\n the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object, you can\n specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field to\n IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by\n default and can grant this permission to others. For more information about\n permissions, see Permissions Related to Bucket Subresource Operations and Managing Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval\n or S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive\n storage classes, you must first initiate a restore request, and then wait until a\n temporary copy of the object is available. If you want a permanent copy of the\n object, create a copy of it in the Amazon S3 Standard storage class in your S3 bucket.\n To access an archived object, you must restore the object for the duration (number\n of days) that you specify. For objects in the Archive Access or Deep Archive\n Access tiers of S3 Intelligent-Tiering, you must first initiate a restore request,\n and then wait until the object is moved into the Frequent Access tier.

\n

To restore a specific object version, you can provide a version ID. If you\n don't provide a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data\n access tier options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access\n your data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval\n storage class or S3 Intelligent-Tiering Archive tier when occasional urgent requests\n for restoring archives are required. For all but the largest archived\n objects (250 MB+), data accessed using Expedited retrievals is typically\n made available within 1–5 minutes. Provisioned capacity ensures that\n retrieval capacity for Expedited retrievals is available when you need it.\n Expedited retrievals and provisioned capacity are not available for objects\n stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of\n your archived objects within several hours. This is the default option for\n retrieval requests that do not specify the retrieval option. Standard\n retrievals typically finish within 3–5 hours for objects stored in the\n S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier. They typically finish within 12 hours for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored\n in S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the\n S3 Glacier Flexible Retrieval and S3 Intelligent-Tiering storage classes,\n enabling you to retrieve large amounts, even petabytes, of data at no cost.\n Bulk retrievals typically finish within 5–12 hours for objects stored in the\n S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier. Bulk retrievals are also the lowest-cost\n retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity\n for Expedited data access, see Restoring Archived\n Objects in the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster\n speed while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD\n request. Operations return the x-amz-restore header, which provides\n information about the restoration status, in the response. You can use Amazon S3 event\n notifications to notify you when a restore is initiated or completed. For more\n information, see Configuring Amazon S3 Event\n Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by\n reissuing the request with a new period. Amazon S3 updates the restoration period\n relative to the current time and charges only for the request-there are no\n data transfer charges. You cannot update the restoration period when Amazon S3 is\n actively processing your current restore request for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an\n expiration action, the object expiration overrides the life span that you specify\n in a restore request. For example, if you restore an object copy for 10 days, but\n the object is scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days.\n For more information about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle\n Management in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202\n Accepted status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in\n the response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error\n does not apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available.\n Try again later. (Returned if there is insufficient capacity to\n process the Expedited request. This error applies only to Expedited\n retrievals and not to S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", "smithy.api#examples": [ { "title": "To restore an archived object", @@ -34787,7 +29799,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object to restore.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object to restore.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34907,6 +29919,27 @@ } } }, + "com.amazonaws.s3#RestoreStatus": { + "type": "structure", + "members": { + "IsRestoreInProgress": { + "target": "com.amazonaws.s3#IsRestoreInProgress", + "traits": { + "smithy.api#default": false, + "smithy.api#documentation": "

Specifies whether the object is currently being restored. If the object restoration is\n in progress, the header returns the value TRUE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"true\"\n

\n

If the object restoration has completed, the header returns the value\n FALSE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\",\n RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

\n

If the object hasn't been restored, there is no header response.

" + } + }, + "RestoreExpiryDate": { + "target": "com.amazonaws.s3#RestoreExpiryDate", + "traits": { + "smithy.api#documentation": "

Indicates when the restored copy will expire. This value is populated only if the object\n has already been restored. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\",\n RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" + } + }, "com.amazonaws.s3#Role": { "type": "string" }, @@ -35089,7 +30122,7 @@ "target": "com.amazonaws.s3#SelectObjectContentOutput" }, "traits": { - "smithy.api#documentation": "

This action filters the contents of an Amazon S3 object based on a simple structured query\n language (SQL) statement. In the request, along with the SQL expression, you must also\n specify a data serialization format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses\n this format to parse object data into records, and returns only records that match the\n specified SQL expression. You must also specify the data serialization format for the\n response.

\n

This action is not supported by Amazon S3 on Outposts.

\n

For more information about Amazon S3 Select, see Selecting Content from\n Objects and SELECT\n Command in the Amazon S3 User Guide.

\n

\n
\n
Permissions
\n
\n

You must have s3:GetObject permission for this operation. Amazon S3 Select does\n not support anonymous access. For more information about permissions, see Specifying\n Permissions in a Policy in the Amazon S3 User Guide.

\n
\n
Object Data Formats
\n
\n

You can use Amazon S3 Select to query objects that have the following format\n properties:

\n
    \n
  • \n

    \n CSV, JSON, and Parquet - Objects must be in CSV, JSON, or\n Parquet format.

    \n
  • \n
  • \n

    \n UTF-8 - UTF-8 is the only encoding type Amazon S3 Select\n supports.

    \n
  • \n
  • \n

    \n GZIP or BZIP2 - CSV and JSON files can be compressed using\n GZIP or BZIP2. GZIP and BZIP2 are the only compression formats that Amazon S3 Select\n supports for CSV and JSON files. Amazon S3 Select supports columnar compression for\n Parquet using GZIP or Snappy. Amazon S3 Select does not support whole-object compression\n for Parquet objects.

    \n
  • \n
  • \n

    \n Server-side encryption - Amazon S3 Select supports querying\n objects that are protected with server-side encryption.

    \n

    For objects that are encrypted with customer-provided encryption keys (SSE-C), you\n must use HTTPS, and you must use the headers that are documented in the GetObject. For more information about SSE-C, see Server-Side\n Encryption (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

    \n

    For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and Amazon Web Services KMS keys\n (SSE-KMS), server-side encryption is handled transparently, so you don't need to\n specify anything. For more information about server-side encryption, including SSE-S3\n and SSE-KMS, see Protecting Data Using\n Server-Side Encryption in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
Working with the Response Body
\n
\n

Given the response size is unknown, Amazon S3 Select streams the response as a series of\n messages and includes a Transfer-Encoding header with chunked as\n its value in the response. For more information, see Appendix: SelectObjectContent\n Response.

\n
\n
GetObject Support
\n
\n

The SelectObjectContent action does not support the following\n GetObject functionality. For more information, see GetObject.

\n
    \n
  • \n

    \n Range: Although you can specify a scan range for an Amazon S3 Select request\n (see SelectObjectContentRequest - ScanRange in the request parameters),\n you cannot specify the range of bytes of an object to return.

    \n
  • \n
  • \n

    The GLACIER, DEEP_ARCHIVE, and REDUCED_REDUNDANCY storage classes, or the ARCHIVE_ACCESS and \n DEEP_ARCHIVE_ACCESS access tiers of \n the INTELLIGENT_TIERING storage class: You cannot query objects in \n the GLACIER, DEEP_ARCHIVE, or REDUCED_REDUNDANCY storage classes, nor objects in the \n ARCHIVE_ACCESS or \n DEEP_ARCHIVE_ACCESS access tiers of \n the INTELLIGENT_TIERING storage class. For\n more information about storage classes, see Using Amazon S3 storage\n classes in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
Special Errors
\n
\n

For a list of special errors for this operation, see List of\n SELECT Object Content Error Codes\n

\n
\n
\n

The following operations are related to SelectObjectContent:

\n ", + "smithy.api#documentation": "

This action filters the contents of an Amazon S3 object based on a simple structured query\n language (SQL) statement. In the request, along with the SQL expression, you must also\n specify a data serialization format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses\n this format to parse object data into records, and returns only records that match the\n specified SQL expression. You must also specify the data serialization format for the\n response.

\n

This action is not supported by Amazon S3 on Outposts.

\n

For more information about Amazon S3 Select, see Selecting Content from\n Objects and SELECT\n Command in the Amazon S3 User Guide.

\n

\n
\n
Permissions
\n
\n

You must have s3:GetObject permission for this operation. Amazon S3\n Select does not support anonymous access. For more information about permissions,\n see Specifying Permissions in\n a Policy in the Amazon S3 User Guide.

\n
\n
Object Data Formats
\n
\n

You can use Amazon S3 Select to query objects that have the following format\n properties:

\n
    \n
  • \n

    \n CSV, JSON, and Parquet - Objects must be in CSV,\n JSON, or Parquet format.

    \n
  • \n
  • \n

    \n UTF-8 - UTF-8 is the only encoding type Amazon S3 Select\n supports.

    \n
  • \n
  • \n

    \n GZIP or BZIP2 - CSV and JSON files can be compressed\n using GZIP or BZIP2. GZIP and BZIP2 are the only compression formats that\n Amazon S3 Select supports for CSV and JSON files. Amazon S3 Select supports columnar\n compression for Parquet using GZIP or Snappy. Amazon S3 Select does not support\n whole-object compression for Parquet objects.

    \n
  • \n
  • \n

    \n Server-side encryption - Amazon S3 Select supports\n querying objects that are protected with server-side encryption.

    \n

    For objects that are encrypted with customer-provided encryption keys\n (SSE-C), you must use HTTPS, and you must use the headers that are\n documented in the GetObject. For more\n information about SSE-C, see Server-Side Encryption (Using Customer-Provided Encryption Keys)\n in the Amazon S3 User Guide.

    \n

    For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and\n Amazon Web Services KMS keys (SSE-KMS), server-side encryption is handled transparently,\n so you don't need to specify anything. For more information about\n server-side encryption, including SSE-S3 and SSE-KMS, see Protecting Data Using Server-Side Encryption in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
Working with the Response Body
\n
\n

Given the response size is unknown, Amazon S3 Select streams the response as a\n series of messages and includes a Transfer-Encoding header with\n chunked as its value in the response. For more information, see\n Appendix:\n SelectObjectContent\n Response.

\n
\n
GetObject Support
\n
\n

The SelectObjectContent action does not support the following\n GetObject functionality. For more information, see GetObject.

\n
    \n
  • \n

    \n Range: Although you can specify a scan range for an Amazon S3 Select\n request (see SelectObjectContentRequest - ScanRange in the request\n parameters), you cannot specify the range of bytes of an object to return.\n

    \n
  • \n
  • \n

    The GLACIER, DEEP_ARCHIVE, and\n REDUCED_REDUNDANCY storage classes, or the\n ARCHIVE_ACCESS and DEEP_ARCHIVE_ACCESS access\n tiers of the INTELLIGENT_TIERING storage class: You cannot\n query objects in the GLACIER, DEEP_ARCHIVE, or\n REDUCED_REDUNDANCY storage classes, nor objects in the\n ARCHIVE_ACCESS or DEEP_ARCHIVE_ACCESS access\n tiers of the INTELLIGENT_TIERING storage class. For more\n information about storage classes, see Using Amazon S3\n storage classes in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
Special Errors
\n
\n

For a list of special errors for this operation, see List of SELECT Object Content Error Codes\n

\n
\n
\n

The following operations are related to SelectObjectContent:

\n ", "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?select&select-type=2&x-id=SelectObjectContent", @@ -35319,7 +30352,7 @@ "KMSMasterKeyID": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Amazon Web Services Key Management Service (KMS) customer Amazon Web Services KMS key ID to use for the default\n encryption. This parameter is allowed if and only if SSEAlgorithm is set to\n aws:kms.

\n

You can specify the key ID or the Amazon Resource Name (ARN) of the KMS key. If you use\n a key ID, you can run into a LogDestination undeliverable error when creating a VPC flow\n log.

\n

If you are using encryption with cross-account or Amazon Web Services service operations you must use\n a fully qualified KMS key ARN. For more information, see Using encryption for cross-account operations.

\n
    \n
  • \n

    Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key ARN:\n arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
\n \n

Amazon S3 only supports symmetric encryption KMS keys. For more information, see Asymmetric keys in Amazon Web Services KMS in the Amazon Web Services Key Management Service\n Developer Guide.

\n
" + "smithy.api#documentation": "

Amazon Web Services Key Management Service (KMS) customer Amazon Web Services KMS key ID to use for the default\n encryption. This parameter is allowed if and only if SSEAlgorithm is set to\n aws:kms.

\n

You can specify the key ID, key alias, or the Amazon Resource Name (ARN) of the KMS\n key.

\n
    \n
  • \n

    Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key Alias: alias/alias-name\n

    \n
  • \n
\n

If you use a key ID, you can run into a LogDestination undeliverable error when creating\n a VPC flow log.

\n

If you are using encryption with cross-account or Amazon Web Services service operations you must use\n a fully qualified KMS key ARN. For more information, see Using encryption for cross-account operations.

\n \n

Amazon S3 only supports symmetric encryption KMS keys. For more information, see Asymmetric keys in Amazon Web Services KMS in the Amazon Web Services Key Management Service\n Developer Guide.

\n
" } } }, @@ -35953,7 +30986,7 @@ "target": "com.amazonaws.s3#UploadPartCopyOutput" }, "traits": { - "smithy.api#documentation": "

Uploads a part by copying data from an existing object as data source. You specify the\n data source by adding the request header x-amz-copy-source in your request and\n a byte range by adding the request header x-amz-copy-source-range in your\n request.

\n

For information about maximum and minimum part sizes and other multipart upload\n specifications, see Multipart upload limits in the Amazon S3 User Guide.

\n \n

Instead of using an existing object as part data, you might use the UploadPart\n action and provide data in your request.

\n
\n

You must initiate a multipart upload before you can upload any part. In response to your\n initiate request. Amazon S3 returns a unique identifier, the upload ID, that you must include in\n your upload part request.

\n

For more information about using the UploadPartCopy operation, see the\n following:

\n
    \n
  • \n

    For conceptual information about multipart uploads, see Uploading\n Objects Using Multipart Upload in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about permissions required to use the multipart upload API, see\n Multipart Upload and Permissions in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about copying objects using a single atomic action vs. a multipart\n upload, see Operations on Objects in\n the Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about using server-side encryption with customer-provided\n encryption keys with the UploadPartCopy operation, see CopyObject and UploadPart.

    \n
  • \n
\n

Note the following additional considerations about the request headers\n x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,\n x-amz-copy-source-if-unmodified-since, and\n x-amz-copy-source-if-modified-since:

\n

\n
    \n
  • \n

    \n Consideration 1 - If both of the\n x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-match condition evaluates to true,\n and;

    \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false;

    \n

    Amazon S3 returns 200 OK and copies the data.\n

    \n
  • \n
  • \n

    \n Consideration 2 - If both of the\n x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false, and;

    \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true;

    \n

    Amazon S3 returns 412 Precondition Failed response code.\n

    \n
  • \n
\n
\n
Versioning
\n
\n

If your bucket has versioning enabled, you could have multiple versions of the same\n object. By default, x-amz-copy-source identifies the current version of the\n object to copy. If the current version is a delete marker and you don't specify a versionId\n in the x-amz-copy-source, Amazon S3 returns a 404 error, because the object does\n not exist. If you specify versionId in the x-amz-copy-source and the versionId\n is a delete marker, Amazon S3 returns an HTTP 400 error, because you are not allowed to specify\n a delete marker as a version for the x-amz-copy-source.

\n

You can optionally specify a specific version of the source object to copy by adding the\n versionId subresource as shown in the following example:

\n

\n x-amz-copy-source: /bucket/object?versionId=version id\n

\n
\n
Special errors
\n
\n
    \n
  • \n
      \n
    • \n

      \n Code: NoSuchUpload\n

      \n
    • \n
    • \n

      \n Cause: The specified multipart upload does not exist. The upload\n ID might be invalid, or the multipart upload might have been aborted or\n completed.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 404 Not Found\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InvalidRequest\n

      \n
    • \n
    • \n

      \n Cause: The specified copy source is not supported as a byte-range\n copy source.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 400 Bad Request\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to UploadPartCopy:

\n ", + "smithy.api#documentation": "

Uploads a part by copying data from an existing object as data source. You specify the\n data source by adding the request header x-amz-copy-source in your request and\n a byte range by adding the request header x-amz-copy-source-range in your\n request.

\n

For information about maximum and minimum part sizes and other multipart upload\n specifications, see Multipart upload limits in the Amazon S3 User Guide.

\n \n

Instead of using an existing object as part data, you might use the UploadPart\n action and provide data in your request.

\n
\n

You must initiate a multipart upload before you can upload any part. In response to your\n initiate request. Amazon S3 returns a unique identifier, the upload ID, that you must include in\n your upload part request.

\n

For more information about using the UploadPartCopy operation, see the\n following:

\n
    \n
  • \n

    For conceptual information about multipart uploads, see Uploading\n Objects Using Multipart Upload in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about permissions required to use the multipart upload API, see\n Multipart Upload and Permissions in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about copying objects using a single atomic action vs. a multipart\n upload, see Operations on Objects in\n the Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about using server-side encryption with customer-provided\n encryption keys with the UploadPartCopy operation, see CopyObject and UploadPart.

    \n
  • \n
\n

Note the following additional considerations about the request headers\n x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,\n x-amz-copy-source-if-unmodified-since, and\n x-amz-copy-source-if-modified-since:

\n

\n
    \n
  • \n

    \n Consideration 1 - If both of the\n x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-match condition evaluates to true,\n and;

    \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false;

    \n

    Amazon S3 returns 200 OK and copies the data.\n

    \n
  • \n
  • \n

    \n Consideration 2 - If both of the\n x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false, and;

    \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true;

    \n

    Amazon S3 returns 412 Precondition Failed response code.\n

    \n
  • \n
\n
\n
Versioning
\n
\n

If your bucket has versioning enabled, you could have multiple versions of the\n same object. By default, x-amz-copy-source identifies the current\n version of the object to copy. If the current version is a delete marker and you\n don't specify a versionId in the x-amz-copy-source, Amazon S3 returns a\n 404 error, because the object does not exist. If you specify versionId in the\n x-amz-copy-source and the versionId is a delete marker, Amazon S3\n returns an HTTP 400 error, because you are not allowed to specify a delete marker\n as a version for the x-amz-copy-source.

\n

You can optionally specify a specific version of the source object to copy by\n adding the versionId subresource as shown in the following\n example:

\n

\n x-amz-copy-source: /bucket/object?versionId=version id\n

\n
\n
Special errors
\n
\n
    \n
  • \n
      \n
    • \n

      \n Code: NoSuchUpload\n

      \n
    • \n
    • \n

      \n Cause: The specified multipart upload does not exist. The\n upload ID might be invalid, or the multipart upload might have been\n aborted or completed.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 404 Not Found\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InvalidRequest\n

      \n
    • \n
    • \n

      \n Cause: The specified copy source is not supported as a\n byte-range copy source.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 400 Bad Request\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to UploadPartCopy:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=UploadPartCopy", @@ -36031,7 +31064,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -36273,7 +31306,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -36753,7 +31786,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

If present, specifies the ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric\n encryption customer managed key that was used for stored in Amazon S3 object.

", + "smithy.api#documentation": "

If present, specifies the ID (Key ID, Key ARN, or Key Alias) of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric\n encryption customer managed key that was used for stored in Amazon S3 object.

", "smithy.api#httpHeader": "x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id" } }, diff --git a/aws/sdk/aws-models/s3control.json b/aws/sdk/aws-models/s3control.json index 2944356a967..7b83470c3f3 100644 --- a/aws/sdk/aws-models/s3control.json +++ b/aws/sdk/aws-models/s3control.json @@ -232,6 +232,7 @@ "arnNamespace": "s3", "cloudFormationName": "S3Control", "cloudTrailEventSource": "s3control.amazonaws.com", + "docId": "s3control-2018-08-20", "endpointPrefix": "s3-control" }, "aws.auth#sigv4": { @@ -312,148 +313,265 @@ }, "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { "ref": "Region" + }, + "snow" + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" } ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Snow does not support DualStack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 Snow does not support FIPS", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "OutpostId" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "snow" + true ] }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, + { + "conditions": [ { "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "ref": "RequiresAccountId" } ] }, { - "fn": "parseURL", + "fn": "booleanEquals", "argv": [ { - "ref": "Endpoint" + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ], - "assign": "url" + ] } ], - "type": "tree", - "rules": [ + "error": "AccountId is required but not set", + "type": "error" + }, + { + "conditions": [ { - "conditions": [ + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ { - "fn": "aws.partition", + "fn": "isValidHostLabel", "argv": [ { - "ref": "Region" - } - ], - "assign": "partitionResult" + "ref": "AccountId" + }, + false + ] } - ], - "type": "tree", - "rules": [ + ] + } + ], + "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "isValidHostLabel", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Snow does not support Dual-stack", - "type": "error" + "ref": "OutpostId" }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 Snow does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } + false ] } ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" } - ] + ], + "error": "OutpostId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" }, { "conditions": [ { - "fn": "isSet", + "fn": "isValidHostLabel", "argv": [ { - "ref": "OutpostId" - } + "ref": "Region" + }, + true ] } ], @@ -462,318 +580,716 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid configuration: Outposts do not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", "argv": [ { - "ref": "Region" + "ref": "Endpoint" } ], - "assign": "partitionResult" + "assign": "url" } ], - "type": "tree", - "rules": [ + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" + "ref": "UseFIPS" }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccessPointName" + } + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "AccessPointName" + } + ], + "assign": "accessPointArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[0]" + ], + "assign": "arnType" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "service" + ] + }, + "s3-outposts" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid configuration: Outpost Access Points do not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseArnRegion" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", "argv": [ { - "ref": "AccountId" - } + "ref": "accessPointArn" + }, + "region" ] - } + }, + "{Region}" ] } + ] + } + ], + "error": "Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } ], - "error": "AccountId is required but not set", - "type": "error" - }, + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "aws.partition", + "argv": [ { - "fn": "isSet", + "fn": "getAttr", "argv": [ { - "ref": "AccountId" - } + "ref": "accessPointArn" + }, + "region" ] - }, + } + ], + "assign": "arnPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "fn": "not", + "fn": "stringEquals", "argv": [ { - "fn": "isValidHostLabel", + "fn": "getAttr", + "argv": [ + { + "ref": "arnPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", "argv": [ { - "ref": "AccountId" + "ref": "partitionResult" }, - false + "name" ] } ] } ], - "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "not", + "fn": "isValidHostLabel", "argv": [ { - "fn": "isValidHostLabel", + "fn": "getAttr", "argv": [ { - "ref": "OutpostId" + "ref": "accessPointArn" }, - false + "region" ] - } + }, + true ] } ], - "error": "OutpostId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isValidHostLabel", + "fn": "not", "argv": [ { - "ref": "Region" - }, - true + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "accountId" + ] + }, + "" + ] + } ] } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "accountId" + ] + }, + false + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", "argv": [ { - "ref": "UseDualStack" - }, - true + "fn": "stringEquals", + "argv": [ + { + "ref": "AccountId" + }, + "{accessPointArn#accountId}" + ] + } ] } ], - "error": "Invalid configuration: Outposts do not support dual-stack", + "error": "Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)", "type": "error" }, { - "conditions": [], + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[2]" + ], + "assign": "outpostType" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", + "fn": "getAttr", "argv": [ { - "ref": "Endpoint" - } + "ref": "accessPointArn" + }, + "resourceId[3]" ], - "assign": "url" + "assign": "accessPointName" } ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ + "type": "tree", + "rules": [ + { + "conditions": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ + "fn": "stringEquals", + "argv": [ + { + "ref": "outpostType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ { - "ref": "UseFIPS" + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" } ] }, - "headers": {} - }, - "type": "endpoint" + { + "conditions": [], + "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", + "type": "error" + } + ] }, { "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid ARN: expected an access point name", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a 4-component resource", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", + "type": "error" } ] }, { "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", + "error": "Invalid ARN: missing account ID", "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", + "type": "error" } ] } ] } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "type": "error" } ] }, { "conditions": [], - "error": "A valid partition could not be determined", + "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "bucketArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[0]" + ], + "assign": "arnType" }, { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "AccessPointName" - } + "ref": "arnType" + }, + "" ] - }, + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "fn": "aws.parseArn", + "fn": "stringEquals", "argv": [ { - "ref": "AccessPointName" - } - ], - "assign": "accessPointArn" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-outposts" + ] } ], "type": "tree", @@ -781,28 +1297,29 @@ { "conditions": [ { - "fn": "getAttr", + "fn": "booleanEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "UseDualStack" }, - "resourceId[0]" - ], - "assign": "arnType" - }, + true + ] + } + ], + "error": "Invalid configuration: Outpost buckets do not support dual-stack", + "type": "error" + }, + { + "conditions": [ { - "fn": "not", + "fn": "getAttr", "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" } ], "type": "tree", @@ -810,18 +1327,12 @@ { "conditions": [ { - "fn": "stringEquals", + "fn": "isValidHostLabel", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "service" - ] + "ref": "outpostId" }, - "s3-outposts" + false ] } ], @@ -829,40 +1340,107 @@ "rules": [ { "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "UseArnRegion" }, - true + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] + } ] } ], - "error": "Invalid configuration: Outpost Access Points do not support dual-stack", + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", "type": "error" }, { - "conditions": [], + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + } + ], + "assign": "arnPartition" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "getAttr", + "fn": "aws.partition", "argv": [ { - "ref": "accessPointArn" - }, - "resourceId[1]" + "ref": "Region" + } ], - "assign": "outpostId" + "assign": "partitionResult" } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "arnPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], "type": "tree", "rules": [ { @@ -871,522 +1449,439 @@ "fn": "isValidHostLabel", "argv": [ { - "ref": "outpostId" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] }, - false + true ] } ], "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "UseArnRegion" - } + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + "" ] - }, + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ { - "fn": "booleanEquals", + "fn": "isValidHostLabel", "argv": [ { - "ref": "UseArnRegion" - }, + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, false ] - }, + } + ], + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "fn": "getAttr", + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "AccountId" }, - "region" + "{bucketArn#accountId}" ] - }, - "{Region}" + } ] } - ] - } - ], - "error": "Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ + ], + "error": "Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)", + "type": "error" + }, { "conditions": [ { - "fn": "aws.partition", + "fn": "getAttr", "argv": [ { - "ref": "Region" - } + "ref": "bucketArn" + }, + "resourceId[2]" ], - "assign": "partitionResult" + "assign": "outpostType" } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[3]" + ], + "assign": "bucketName" + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "fn": "getAttr", + "ref": "outpostType" + }, + "bucket" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "UseFIPS" }, - "region" + true ] } ], - "assign": "arnPartition" - } - ], - "type": "tree", - "rules": [ + "endpoint": { + "url": "https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, { - "conditions": [ + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "arnPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" ], - "type": "tree", - "rules": [ + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "accountId" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "AccountId" - }, - "{accessPointArn#accountId}" - ] - } - ] - } - ], - "error": "Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "resourceId[3]" - ], - "assign": "accessPointName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected an access point name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: missing account ID", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", - "type": "error" - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" } ] }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", - "type": "error" + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] } - ] + }, + "type": "endpoint" } ] }, { "conditions": [], - "error": "Could not load partition for ARN region `{accessPointArn#region}`", + "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: expected a bucket name", + "type": "error" } ] }, { "conditions": [], - "error": "A valid partition could not be determined", + "error": "Invalid ARN: Expected a 4-component resource", "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid ARN: missing account ID", + "type": "error" } ] }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", "type": "error" } ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", + "type": "error" } ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" } ] } ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "type": "error" } ] }, { "conditions": [], - "error": "Invalid ARN: No ARN type specified", + "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ] + } + ], + "error": "AccountId is required but not set", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "AccountId" + }, + false + ] + } + ] + } + ], + "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" }, { "conditions": [ @@ -1394,18 +1889,18 @@ "fn": "isSet", "argv": [ { - "ref": "Bucket" + "ref": "Endpoint" } ] }, { - "fn": "aws.parseArn", + "fn": "parseURL", "argv": [ { - "ref": "Bucket" + "ref": "Endpoint" } ], - "assign": "bucketArn" + "assign": "url" } ], "type": "tree", @@ -1413,1304 +1908,493 @@ { "conditions": [ { - "fn": "getAttr", + "fn": "booleanEquals", "argv": [ { - "ref": "bucketArn" + "ref": "UseDualStack" }, - "resourceId[0]" - ], - "assign": "arnType" + true + ] + } + ], + "error": "Invalid Configuration: DualStack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] }, { - "fn": "not", + "fn": "booleanEquals", "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [ + "endpoint": { + "url": "{url#scheme}://{AccountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-outposts" - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid configuration: Outpost buckets do not support dual-stack", - "type": "error" - }, + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "outpostId" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "outpostId" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "arnPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "arnPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "AccountId" - }, - "{bucketArn#accountId}" - ] - } - ] - } - ], - "error": "Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[3]" - ], - "assign": "bucketName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "bucket" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected a bucket name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: missing account ID", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" } ] }, { - "conditions": [], - "error": "Invalid ARN: No ARN type specified", - "type": "error" + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ] + ], + "endpoint": { + "url": "https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } - ], - "type": "tree", - "rules": [ + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ] - } - ], - "error": "AccountId is required but not set", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "AccountId" - }, - false - ] - } - ] - } - ], - "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{AccountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-control.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" } ] }, { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ] + ], + "endpoint": { + "url": "https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-control.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" } ] - }, - { - "conditions": [], - "error": "Region must be set", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Region must be set", + "type": "error" } ] }, @@ -3487,7 +3171,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -3527,7 +3210,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -3565,7 +3247,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "Region": "us-east-2", "RequiresAccountId": false, "UseDualStack": false, @@ -3596,14 +3277,13 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", - "Operation": "ListRegionalBuckets", + "AccountId": "123456789012", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -3625,7 +3305,7 @@ } ] }, - "url": "https://123.s3-control.us-east-2.amazonaws.com" + "url": "https://123456789012.s3-control.us-east-2.amazonaws.com" } }, "operationInputs": [ @@ -3635,13 +3315,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "123", - "Operation": "ListRegionalBuckets", + "AccountId": "123456789012", "Region": "us-east-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3673,14 +3352,13 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", - "Operation": "CreateBucket", + "AccountId": "123456789012", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -3847,7 +3525,7 @@ { "documentation": "Account ID set inline and in ARN and they do not match@us-west-2", "expect": { - "error": "Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`9999999`)" + "error": "Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`999999999999`)" }, "operationInputs": [ { @@ -3857,14 +3535,14 @@ }, "operationName": "GetAccessPoint", "operationParams": { - "AccountId": "9999999", + "AccountId": "999999999999", "Name": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint" } } ], "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", - "AccountId": "9999999", + "AccountId": "999999999999", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": false, @@ -3906,7 +3584,6 @@ "AccessPointName": "apname", "AccountId": "123456789012", "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3955,7 +3632,6 @@ "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3970,7 +3646,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3985,7 +3660,6 @@ "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -4012,7 +3686,6 @@ "params": { "Bucket": "bucketname", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-west-2", "RequiresAccountId": false, @@ -4053,14 +3726,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -4092,15 +3765,14 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", + "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -4134,15 +3806,14 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", + "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -4184,7 +3855,6 @@ "params": { "Bucket": "blah", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -4200,7 +3870,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -4215,7 +3884,6 @@ "params": { "Bucket": "bucketname", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-west-2", "RequiresAccountId": false, @@ -4256,7 +3924,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4300,7 +3969,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4344,7 +4014,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4389,7 +4060,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4434,7 +4106,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4492,7 +4165,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4536,7 +4210,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4580,7 +4255,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4625,7 +4301,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4670,7 +4347,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4728,7 +4406,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4772,7 +4451,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4816,7 +4496,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4861,7 +4542,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4906,7 +4588,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -5072,11 +4755,11 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.us-east-1.amazonaws.com" } }, "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5217,7 +4900,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5227,12 +4910,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5277,7 +4960,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5288,12 +4971,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5314,7 +4997,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.dualstack.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.dualstack.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5326,12 +5009,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": true, @@ -5352,7 +5035,7 @@ } ] }, - "url": "https://1234567890-aBC.example.com" + "url": "https://123456789012.example.com" } }, "operationInputs": [ @@ -5363,12 +5046,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "Endpoint": "https://example.com" @@ -5420,7 +5103,7 @@ } }, { - "documentation": "account id with custom endpoint, fips and dualstack", + "documentation": "account id with custom endpoint, fips", "expect": { "endpoint": { "properties": { @@ -5433,7 +5116,7 @@ } ] }, - "url": "https://1234567890-aBC.example.com" + "url": "https://123456789012.example.com" } }, "operationInputs": [ @@ -5445,21 +5128,20 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": true + "UseFIPS": true } }, { - "documentation": "custom endpoint, fips and dualstack", + "documentation": "custom endpoint, fips", "expect": { "endpoint": { "properties": { @@ -5478,8 +5160,7 @@ "params": { "Region": "us-east-1", "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": true + "UseFIPS": true } }, { @@ -5502,32 +5183,19 @@ "params": { "Region": "us-east-1", "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": false + "UseFIPS": true } }, { - "documentation": "custom endpoint, dualstack", + "documentation": "custom endpoint, DualStack", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1", - "disableDoubleEncoding": true - } - ] - }, - "url": "https://example.com" - } + "error": "Invalid Configuration: DualStack and custom endpoint are not supported" }, "params": { "Region": "us-east-1", "Endpoint": "https://example.com", "UseFIPS": false, - "UseDualstack": true + "UseDualStack": true } }, { @@ -5551,7 +5219,6 @@ "error": "AccountId is required but not set" }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -5578,7 +5245,6 @@ ], "params": { "AccountId": "/?invalid¬-host*label", - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -5659,7 +5325,6 @@ "AccessPointName": "apname", "Endpoint": "https://beta.example.com", "AccountId": "123456789012", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -5694,7 +5359,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -5702,9 +5366,9 @@ } }, { - "documentation": "Dualstack + Custom endpoint is not supported(non-arn)", + "documentation": "DualStack + Custom endpoint is not supported(non-arn)", "expect": { - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + "error": "Invalid Configuration: DualStack and custom endpoint are not supported" }, "operationInputs": [ { @@ -5724,7 +5388,6 @@ "AccessPointName": "apname", "Endpoint": "https://beta.example.com", "AccountId": "123456789012", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -5745,14 +5408,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -5779,7 +5442,6 @@ ], "params": { "AccountId": "0123456789012", - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "cn-north-1", "RequiresAccountId": true, @@ -5806,7 +5468,6 @@ ], "params": { "AccountId": "0123456789012", - "Operation": "ListRegionalBuckets", "OutpostId": "?outpost/invalid+", "Region": "us-west-1", "RequiresAccountId": true, @@ -5834,7 +5495,6 @@ "error": "Invalid region: region was not a valid DNS name." }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "invalid-region 42", "AccountId": "0123456", @@ -5861,7 +5521,6 @@ } }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-west-2", "UseDualStack": false, @@ -5921,14 +5580,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": false, @@ -6024,7 +5683,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -6049,13 +5709,13 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": true, @@ -6284,22 +5944,20 @@ "Bucket": "bucketName", "Endpoint": "https://10.0.1.12:433", "UseFIPS": true, - "UseDualStack": false, - "Accelerate": false + "UseDualStack": false } }, { - "documentation": "S3 Snow Control with Dual-stack enabled", + "documentation": "S3 Snow Control with Dualstack enabled", "expect": { - "error": "S3 Snow does not support Dual-stack" + "error": "S3 Snow does not support DualStack" }, "params": { "Region": "snow", "Bucket": "bucketName", "Endpoint": "https://10.0.1.12:433", "UseFIPS": false, - "UseDualStack": true, - "Accelerate": false + "UseDualStack": true } } ], @@ -7058,6 +6716,9 @@ "smithy.api#documentation": "

The alias of the Object Lambda Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateAccessPointRequest": { @@ -7131,6 +6792,9 @@ "smithy.api#documentation": "

The name or alias of the access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateBucket": { @@ -7276,6 +6940,9 @@ "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the bucket.

\n

For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.

\n

For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must specify the ARN of the bucket accessed in the format arn:aws:s3-outposts:::outpost//bucket/. For example, to access the bucket reports through Outpost my-outpost owned by account 123456789012 in Region us-west-2, use the URL encoding of arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports. The value must be URL encoded.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateJob": { @@ -7414,6 +7081,9 @@ "smithy.api#documentation": "

The ID for this job. Amazon S3 generates this ID automatically and returns it after a\n successful Create Job request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateMultiRegionAccessPoint": { @@ -7511,6 +7181,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreationDate": { @@ -8098,7 +7771,10 @@ }, "com.amazonaws.s3control#DeleteJobTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#DeleteMarkerReplication": { "type": "structure", @@ -8217,6 +7893,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#DeletePublicAccessBlock": { @@ -8372,7 +8051,10 @@ }, "com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#DescribeJob": { "type": "operation", @@ -8450,6 +8132,9 @@ "smithy.api#documentation": "

Contains the configuration parameters and status for the job specified in the\n Describe Job request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#DescribeMultiRegionAccessPointOperation": { @@ -8515,6 +8200,9 @@ "smithy.api#documentation": "

A container element containing the details of the asynchronous operation.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#Destination": { @@ -8851,6 +8539,9 @@ "smithy.api#documentation": "

Object Lambda Access Point configuration document.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointForObjectLambda": { @@ -8933,6 +8624,9 @@ "smithy.api#documentation": "

The alias of the Object Lambda Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicy": { @@ -9022,6 +8716,9 @@ "smithy.api#documentation": "

Object Lambda Access Point resource policy document.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyRequest": { @@ -9064,6 +8761,9 @@ "smithy.api#documentation": "

The access point policy associated with the specified access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyStatus": { @@ -9150,6 +8850,9 @@ "PolicyStatus": { "target": "com.amazonaws.s3control#PolicyStatus" } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyStatusRequest": { @@ -9192,6 +8895,9 @@ "smithy.api#documentation": "

Indicates the current policy status of the specified access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointRequest": { @@ -9285,6 +8991,9 @@ "smithy.api#documentation": "

The Amazon Web Services account ID associated with the S3 bucket associated with this access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucket": { @@ -9377,6 +9086,9 @@ "smithy.api#documentation": "

Container for the lifecycle rule of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketPolicy": { @@ -9444,6 +9156,9 @@ "smithy.api#documentation": "

The policy of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketReplication": { @@ -9511,6 +9226,9 @@ "smithy.api#documentation": "

A container for one or more replication rules. A replication configuration must have at least one rule and you can add up to 100 rules. The maximum size of a\n replication configuration is 128 KB.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketRequest": { @@ -9566,6 +9284,9 @@ "smithy.api#documentation": "

The creation date of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketTagging": { @@ -9634,6 +9355,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketVersioning": { @@ -9708,6 +9432,9 @@ "smithy.api#xmlName": "MfaDelete" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetJobTagging": { @@ -9783,6 +9510,9 @@ "smithy.api#documentation": "

The set of tags associated with the S3 Batch Operations job.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPoint": { @@ -9874,6 +9604,9 @@ "smithy.api#documentation": "

The policy associated with the specified Multi-Region Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatus": { @@ -9936,6 +9669,9 @@ "Established": { "target": "com.amazonaws.s3control#PolicyStatus" } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointRequest": { @@ -9975,6 +9711,9 @@ "smithy.api#documentation": "

A container element containing the details of the requested Multi-Region Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointRoutes": { @@ -10046,6 +9785,9 @@ "smithy.api#documentation": "

The different routes that make up the route configuration. Active routes return a value\n of 100, and passive routes return a value of 0.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetPublicAccessBlock": { @@ -10176,6 +9918,9 @@ "smithy.api#httpPayload": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetStorageLensConfigurationTagging": { @@ -10240,6 +9985,9 @@ "smithy.api#documentation": "

The tags of S3 Storage Lens configuration requested.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GrantFullControl": { @@ -11420,6 +11168,9 @@ "smithy.api#documentation": "

If the list has more access points than can be returned in one call to this API, this field\n contains a continuation token that you can provide in subsequent calls to this API to\n retrieve additional access points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListAccessPointsRequest": { @@ -11482,6 +11233,9 @@ "smithy.api#documentation": "

If the specified bucket has more access points than can be returned in one call to this API,\n this field contains a continuation token that you can provide in subsequent calls to this\n API to retrieve additional access points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListJobs": { @@ -11582,6 +11336,9 @@ "smithy.api#documentation": "

The list of current jobs and jobs that have ended within the last 30 days.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListMultiRegionAccessPoints": { @@ -11665,6 +11422,9 @@ "smithy.api#documentation": "

If the specified bucket has more Multi-Region Access Points than can be returned in one call to this\n action, this field contains a continuation token. You can use this token tin subsequent\n calls to this action to retrieve additional Multi-Region Access Points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListRegionalBuckets": { @@ -11757,6 +11517,9 @@ "smithy.api#documentation": "

\n NextToken is sent when isTruncated is true, which means there\n are more buckets that can be listed. The next list requests to Amazon S3 can be continued with\n this NextToken. NextToken is obfuscated and is not a real\n key.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListStorageLensConfigurationEntry": { @@ -11867,6 +11630,9 @@ "smithy.api#xmlFlattened": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#Location": { @@ -13453,7 +13219,10 @@ }, "com.amazonaws.s3control#PutJobTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#PutMultiRegionAccessPointPolicy": { "type": "operation", @@ -13547,6 +13316,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#PutPublicAccessBlock": { @@ -13731,7 +13503,10 @@ }, "com.amazonaws.s3control#PutStorageLensConfigurationTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#Region": { "type": "structure", @@ -15639,7 +15414,10 @@ }, "com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#SuspendedCause": { "type": "string", @@ -15889,6 +15667,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#UpdateJobStatus": { @@ -15997,6 +15778,9 @@ "smithy.api#documentation": "

The reason that the specified job's status was updated.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#VersioningConfiguration": { diff --git a/aws/sdk/aws-models/sso.json b/aws/sdk/aws-models/sso.json index 4f48553e765..9804c216731 100644 --- a/aws/sdk/aws-models/sso.json +++ b/aws/sdk/aws-models/sso.json @@ -154,6 +154,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#GetRoleCredentialsResponse": { @@ -165,6 +168,9 @@ "smithy.api#documentation": "

The credentials for the role that is assigned to the user.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#InvalidRequestException": { @@ -252,6 +258,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#ListAccountRolesResponse": { @@ -269,6 +278,9 @@ "smithy.api#documentation": "

A paginated response with the list of roles and the next token if more results are\n available.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#ListAccounts": { @@ -335,6 +347,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#ListAccountsResponse": { @@ -352,6 +367,9 @@ "smithy.api#documentation": "

A paginated response with the list of account information and the next token if more\n results are available.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#Logout": { @@ -375,7 +393,7 @@ ], "traits": { "smithy.api#auth": [], - "smithy.api#documentation": "

Removes the locally stored SSO tokens from the client-side cache and sends an API call to\n the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\n session.

\n\n \n

If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\n used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\n More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\n and the corresponding temporary AWS credentials are returned to the client.

\n\n

After user logout, any existing IAM role sessions that were created by using IAM Identity Center\n permission sets continue based on the duration configured in the permission set.\n For more information, see User\n authentications in the IAM Identity Center User\n Guide.

\n
", + "smithy.api#documentation": "

Removes the locally stored SSO tokens from the client-side cache and sends an API call to\n the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\n session.

\n \n

If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\n used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\n More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\n and the corresponding temporary AWS credentials are returned to the client.

\n

After user logout, any existing IAM role sessions that were created by using IAM Identity Center\n permission sets continue based on the duration configured in the permission set.\n For more information, see User\n authentications in the IAM Identity Center User\n Guide.

\n
", "smithy.api#http": { "method": "POST", "uri": "/logout", @@ -395,6 +413,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#MaxResultType": { @@ -513,7 +534,7 @@ "name": "awsssoportal" }, "aws.protocols#restJson1": {}, - "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\n IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\n assigned to them and get federated into the application.

\n\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n\n

This reference guide describes the IAM Identity Center Portal operations that you can call\n programatically and includes detailed information on data types and errors.

\n\n \n

AWS provides SDKs that consist of libraries and sample code for various programming\n languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\n convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\n information about the AWS SDKs, including how to download and install them, see Tools for Amazon Web Services.

\n
", + "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\n IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\n assigned to them and get federated into the application.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

This reference guide describes the IAM Identity Center Portal operations that you can call\n programatically and includes detailed information on data types and errors.

\n \n

AWS provides SDKs that consist of libraries and sample code for various programming\n languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\n convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\n information about the AWS SDKs, including how to download and install them, see Tools for Amazon Web Services.

\n
", "smithy.api#title": "AWS Single Sign-On", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -575,52 +596,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -628,13 +653,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -644,224 +678,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://portal.sso.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://portal.sso.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/aws-models/sts.json b/aws/sdk/aws-models/sts.json index ddc251e8fad..d49956a1f71 100644 --- a/aws/sdk/aws-models/sts.json +++ b/aws/sdk/aws-models/sts.json @@ -655,52 +655,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -708,13 +712,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -724,175 +737,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] }, - { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } - ] - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://sts.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" + "ref": "PartitionResult" }, - { - "conditions": [], - "endpoint": { - "url": "https://sts-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -901,99 +822,142 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsDualStack" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://sts.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" + "endpoint": { + "url": "https://sts-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "type": "tree", - "rules": [ + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "PartitionResult" }, - "aws-global" + "supportsDualStack" ] } - ], - "endpoint": { - "url": "https://sts.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "sts", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [], "endpoint": { - "url": "https://sts.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://sts.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "sts", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://sts.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1701,9 +1665,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1720,10 +1684,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-northeast-1" + "Region": "ap-northeast-1", + "UseGlobalEndpoint": true } }, { @@ -1733,9 +1697,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1752,10 +1716,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-south-1" + "Region": "ap-south-1", + "UseGlobalEndpoint": true } }, { @@ -1765,9 +1729,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1784,10 +1748,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-southeast-1" + "Region": "ap-southeast-1", + "UseGlobalEndpoint": true } }, { @@ -1797,9 +1761,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1816,10 +1780,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ap-southeast-2" + "Region": "ap-southeast-2", + "UseGlobalEndpoint": true } }, { @@ -1829,9 +1793,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1848,10 +1812,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "aws-global" + "Region": "aws-global", + "UseGlobalEndpoint": true } }, { @@ -1861,9 +1825,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1880,10 +1844,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "ca-central-1" + "Region": "ca-central-1", + "UseGlobalEndpoint": true } }, { @@ -1893,9 +1857,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1912,10 +1876,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-central-1" + "Region": "eu-central-1", + "UseGlobalEndpoint": true } }, { @@ -1925,9 +1889,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1944,10 +1908,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-north-1" + "Region": "eu-north-1", + "UseGlobalEndpoint": true } }, { @@ -1957,9 +1921,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -1976,10 +1940,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-west-1" + "Region": "eu-west-1", + "UseGlobalEndpoint": true } }, { @@ -1989,9 +1953,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2008,10 +1972,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-west-2" + "Region": "eu-west-2", + "UseGlobalEndpoint": true } }, { @@ -2021,9 +1985,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2040,10 +2004,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "eu-west-3" + "Region": "eu-west-3", + "UseGlobalEndpoint": true } }, { @@ -2053,9 +2017,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2072,10 +2036,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "sa-east-1" + "Region": "sa-east-1", + "UseGlobalEndpoint": true } }, { @@ -2085,9 +2049,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2104,10 +2068,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-east-1" + "Region": "us-east-1", + "UseGlobalEndpoint": true } }, { @@ -2117,9 +2081,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2136,10 +2100,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-east-2" + "Region": "us-east-2", + "UseGlobalEndpoint": true } }, { @@ -2149,9 +2113,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2168,10 +2132,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-west-1" + "Region": "us-west-1", + "UseGlobalEndpoint": true } }, { @@ -2181,9 +2145,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-1", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2200,10 +2164,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-west-2" + "Region": "us-west-2", + "UseGlobalEndpoint": true } }, { @@ -2213,9 +2177,9 @@ "properties": { "authSchemes": [ { + "name": "sigv4", "signingRegion": "us-east-3", - "signingName": "sts", - "name": "sigv4" + "signingName": "sts" } ] }, @@ -2232,10 +2196,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, - "Region": "us-east-3" + "Region": "us-east-3", + "UseGlobalEndpoint": true } }, { @@ -2256,10 +2220,10 @@ } ], "params": { - "UseGlobalEndpoint": true, "UseDualStack": false, "UseFIPS": false, "Region": "us-west-1", + "UseGlobalEndpoint": true, "Endpoint": "https://example.com" } }, @@ -2271,10 +2235,10 @@ } }, "params": { - "Endpoint": "https://example.com", - "UseGlobalEndpoint": false, "UseDualStack": false, - "UseFIPS": false + "UseFIPS": false, + "Endpoint": "https://example.com", + "UseGlobalEndpoint": false } } ], @@ -2305,7 +2269,50 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy\n that allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy that\n allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

", + "smithy.api#examples": [ + { + "title": "To assume a role", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/demo", + "RoleSessionName": "testAssumeRoleSession", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "Tags": [ + { + "Key": "Project", + "Value": "Unicorn" + }, + { + "Key": "Team", + "Value": "Automation" + }, + { + "Key": "Cost-Center", + "Value": "12345" + } + ], + "TransitiveTagKeys": [ + "Project", + "Cost-Center" + ], + "ExternalId": "123ABC" + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-15T23:28:33.359Z" + }, + "AssumedRoleUser": { + "Arn": "arn:aws:sts::123456789012:assumed-role/demo/Bob", + "AssumedRoleId": "ARO123EXAMPLE123:Bob" + }, + "PackedPolicySize": 8 + } + } + ] } }, "com.amazonaws.sts#AssumeRoleRequest": { @@ -2378,6 +2385,12 @@ "traits": { "smithy.api#documentation": "

The source identity specified by the principal that is calling the\n AssumeRole operation.

\n

You can require users to specify a source identity when they assume a role. You do this\n by using the sts:SourceIdentity condition key in a role trust policy. You can\n use source identity information in CloudTrail logs to determine who took actions with a role.\n You can use the aws:SourceIdentity condition key to further control access to\n Amazon Web Services resources based on the value of source identity. For more information about using\n source identity, see Monitor and control\n actions taken with assumed roles in the\n IAM User Guide.

\n

The regex used to validate this parameter is a string of characters consisting of upper-\n and lower-case alphanumeric characters with no spaces. You can also include underscores or\n any of the following characters: =,.@-. You cannot use a value that begins with the text\n aws:. This prefix is reserved for Amazon Web Services internal use.

" } + }, + "ProvidedContexts": { + "target": "com.amazonaws.sts#ProvidedContextsListType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } } }, "traits": { @@ -2446,7 +2459,37 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated\n via a SAML authentication response. This operation provides a mechanism for tying an\n enterprise identity store or directory to role-based Amazon Web Services access without user-specific\n credentials or configuration. For a comparison of AssumeRoleWithSAML with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this operation consist of an access key\n ID, a secret access key, and a security token. Applications can use these temporary\n security credentials to sign calls to Amazon Web Services services.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithSAML last for one hour. However, you can use the optional\n DurationSeconds parameter to specify the duration of your session. Your\n role session lasts for the duration that you specify, or until the time specified in the\n SAML authentication response's SessionNotOnOrAfter value, whichever is\n shorter. You can provide a DurationSeconds value from 900 seconds (15 minutes)\n up to the maximum session duration setting for the role. This setting can have a value from\n 1 hour to 12 hours. To learn how to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n \n

\n Role chaining limits your CLI or Amazon Web Services API role\n session to a maximum of one hour. When you use the AssumeRole API operation\n to assume a role, you can specify the duration of your role session with the\n DurationSeconds parameter. You can specify a parameter value of up to\n 43200 seconds (12 hours), depending on the maximum session duration setting for your\n role. However, if you assume a role using role chaining and provide a\n DurationSeconds parameter value greater than one hour, the operation\n fails.

\n
\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithSAML can be\n used to make API calls to any Amazon Web Services service with the following exception: you cannot call\n the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

Calling AssumeRoleWithSAML does not require the use of Amazon Web Services security\n credentials. The identity of the caller is validated by using keys in the metadata document\n that is uploaded for the SAML provider entity for your identity provider.

\n \n

Calling AssumeRoleWithSAML can result in an entry in your CloudTrail logs.\n The entry includes the value in the NameID element of the SAML assertion.\n We recommend that you use a NameIDType that is not associated with any\n personally identifiable information (PII). For example, you could instead use the\n persistent identifier\n (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent).

\n
\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your SAML assertion as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, session tags override the role's tags with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n SAML Configuration\n

\n

Before your application can call AssumeRoleWithSAML, you must configure\n your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\n must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\n represents your identity provider. You must also create an IAM role that specifies this\n SAML provider in its trust policy.

\n

For more information, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated\n via a SAML authentication response. This operation provides a mechanism for tying an\n enterprise identity store or directory to role-based Amazon Web Services access without user-specific\n credentials or configuration. For a comparison of AssumeRoleWithSAML with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this operation consist of an access key\n ID, a secret access key, and a security token. Applications can use these temporary\n security credentials to sign calls to Amazon Web Services services.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithSAML last for one hour. However, you can use the optional\n DurationSeconds parameter to specify the duration of your session. Your\n role session lasts for the duration that you specify, or until the time specified in the\n SAML authentication response's SessionNotOnOrAfter value, whichever is\n shorter. You can provide a DurationSeconds value from 900 seconds (15 minutes)\n up to the maximum session duration setting for the role. This setting can have a value from\n 1 hour to 12 hours. To learn how to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n \n

\n Role chaining limits your CLI or Amazon Web Services API role\n session to a maximum of one hour. When you use the AssumeRole API operation\n to assume a role, you can specify the duration of your role session with the\n DurationSeconds parameter. You can specify a parameter value of up to\n 43200 seconds (12 hours), depending on the maximum session duration setting for your\n role. However, if you assume a role using role chaining and provide a\n DurationSeconds parameter value greater than one hour, the operation\n fails.

\n
\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithSAML can be\n used to make API calls to any Amazon Web Services service with the following exception: you cannot call\n the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

Calling AssumeRoleWithSAML does not require the use of Amazon Web Services security\n credentials. The identity of the caller is validated by using keys in the metadata document\n that is uploaded for the SAML provider entity for your identity provider.

\n \n

Calling AssumeRoleWithSAML can result in an entry in your CloudTrail logs.\n The entry includes the value in the NameID element of the SAML assertion.\n We recommend that you use a NameIDType that is not associated with any\n personally identifiable information (PII). For example, you could instead use the\n persistent identifier\n (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent).

\n
\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your SAML assertion as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, session tags override the role's tags with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n SAML Configuration\n

\n

Before your application can call AssumeRoleWithSAML, you must configure\n your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\n must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\n represents your identity provider. You must also create an IAM role that specifies this\n SAML provider in its trust policy.

\n

For more information, see the following resources:

\n ", + "smithy.api#examples": [ + { + "title": "To assume a role using a SAML assertion", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/TestSaml", + "PrincipalArn": "arn:aws:iam::123456789012:saml-provider/SAML-test", + "SAMLAssertion": "VERYLONGENCODEDASSERTIONEXAMPLExzYW1sOkF1ZGllbmNlPmJsYW5rPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50Ij5TYW1sRXhhbXBsZTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxOS0xMS0wMVQyMDoyNTowNS4xNDVaIiBSZWNpcGllbnQ9Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRoPD94bWwgdmpSZXNwb25zZT4=", + "DurationSeconds": 3600 + }, + "output": { + "Issuer": "https://integ.example.com/idp/shibboleth", + "AssumedRoleUser": { + "AssumedRoleId": "ARO456EXAMPLE789:TestSaml", + "Arn": "arn:aws:sts::123456789012:assumed-role/TestSaml" + }, + "Credentials": { + "SecretAccessKey": "8P+SQvWIuLnKhh8d++jpw0nNmQRBZvNEXAMPLEKEY", + "AccessKeyId": "ASIAV3ZUEFP6EXAMPLE", + "SessionToken": "IQoJb3JpZ2luX2VjEOz////////////////////wEXAMPLEtMSJHMEUCIDoKK3JH9uGQE1z0sINr5M4jk+Na8KHDcCYRVjJCZEvOAiEA3OvJGtw1EcViOleS2vhs8VdCKFJQWPQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "Expiration": "2019-11-01T20:26:47Z" + }, + "Audience": "https://signin.aws.amazon.com/saml", + "SubjectType": "transient", + "PackedPolicySize": 6, + "NameQualifier": "SbdGOnUkh1i4+EXAMPLExL/jEvs=", + "Subject": "SamlExample" + } + } + ] } }, "com.amazonaws.sts#AssumeRoleWithSAMLRequest": { @@ -2591,7 +2634,37 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity pools in\n Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity\n pools in Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n ", + "smithy.api#examples": [ + { + "title": "To assume a role as an OpenID Connect-federated user", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/FederatedWebIdentityRole", + "RoleSessionName": "app1", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "WebIdentityToken": "Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ", + "ProviderId": "www.amazon.com", + "DurationSeconds": 3600 + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEE0a8ANXXXXXXXXNO1ewxE5TijQyp+IEXAMPLE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2014-10-24T23:00:23Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + }, + "SubjectFromWebIdentityToken": "amzn1.account.AF6RHO7KZU5XRVQJGXK6HEXAMPLE", + "AssumedRoleUser": { + "Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/app1", + "AssumedRoleId": "AROACLKWSDQRAOEXAMPLE:app1" + }, + "PackedPolicySize": 123, + "Provider": "www.amazon.com", + "Audience": "client.5498841531868486423.1548@apps.example.com" + } + } + ] } }, "com.amazonaws.sts#AssumeRoleWithWebIdentityRequest": { @@ -2614,7 +2687,7 @@ "WebIdentityToken": { "target": "com.amazonaws.sts#clientTokenType", "traits": { - "smithy.api#documentation": "

The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\n provider. Your application must get this token by authenticating the user who is using your\n application with a web identity provider before the application makes an\n AssumeRoleWithWebIdentity call.

", + "smithy.api#documentation": "

The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\n provider. Your application must get this token by authenticating the user who is using your\n application with a web identity provider before the application makes an\n AssumeRoleWithWebIdentity call. Only tokens with RSA algorithms (RS256) are\n supported.

", "smithy.api#required": {} } }, @@ -2773,7 +2846,19 @@ } ], "traits": { - "smithy.api#documentation": "

Decodes additional information about the authorization status of a request from an\n encoded message returned in response to an Amazon Web Services request.

\n

For example, if a user is not authorized to perform an operation that he or she has\n requested, the request returns a Client.UnauthorizedOperation response (an\n HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\n provide details about this authorization failure.

\n \n

Only certain Amazon Web Services operations return an encoded authorization message. The\n documentation for an individual operation indicates whether that operation returns an\n encoded message in addition to returning an HTTP code.

\n
\n

The message is encoded because the details of the authorization status can contain\n privileged information that the user who requested the operation should not see. To decode\n an authorization status message, a user must be granted permissions through an IAM policy to\n request the DecodeAuthorizationMessage\n (sts:DecodeAuthorizationMessage) action.

\n

The decoded message includes the following type of information:

\n
    \n
  • \n

    Whether the request was denied due to an explicit deny or due to the absence of an\n explicit allow. For more information, see Determining Whether a Request is Allowed or Denied in the\n IAM User Guide.

    \n
  • \n
  • \n

    The principal who made the request.

    \n
  • \n
  • \n

    The requested action.

    \n
  • \n
  • \n

    The requested resource.

    \n
  • \n
  • \n

    The values of condition keys in the context of the user's request.

    \n
  • \n
" + "smithy.api#documentation": "

Decodes additional information about the authorization status of a request from an\n encoded message returned in response to an Amazon Web Services request.

\n

For example, if a user is not authorized to perform an operation that he or she has\n requested, the request returns a Client.UnauthorizedOperation response (an\n HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\n provide details about this authorization failure.

\n \n

Only certain Amazon Web Services operations return an encoded authorization message. The\n documentation for an individual operation indicates whether that operation returns an\n encoded message in addition to returning an HTTP code.

\n
\n

The message is encoded because the details of the authorization status can contain\n privileged information that the user who requested the operation should not see. To decode\n an authorization status message, a user must be granted permissions through an IAM policy to\n request the DecodeAuthorizationMessage\n (sts:DecodeAuthorizationMessage) action.

\n

The decoded message includes the following type of information:

\n
    \n
  • \n

    Whether the request was denied due to an explicit deny or due to the absence of an\n explicit allow. For more information, see Determining Whether a Request is Allowed or Denied in the\n IAM User Guide.

    \n
  • \n
  • \n

    The principal who made the request.

    \n
  • \n
  • \n

    The requested action.

    \n
  • \n
  • \n

    The requested resource.

    \n
  • \n
  • \n

    The values of condition keys in the context of the user's request.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To decode information about an authorization status of a request", + "documentation": "", + "input": { + "EncodedMessage": "" + }, + "output": { + "DecodedMessage": "{\"allowed\": \"false\",\"explicitDeny\": \"false\",\"matchedStatements\": \"\",\"failures\": \"\",\"context\": {\"principal\": {\"id\": \"AIDACKCEVSQ6C2EXAMPLE\",\"name\": \"Bob\",\"arn\": \"arn:aws:iam::123456789012:user/Bob\"},\"action\": \"ec2:StopInstances\",\"resource\": \"arn:aws:ec2:us-east-1:123456789012:instance/i-dd01c9bd\",\"conditions\": [{\"item\": {\"key\": \"ec2:Tenancy\",\"values\": [\"default\"]},{\"item\": {\"key\": \"ec2:ResourceTag/elasticbeanstalk:environment-name\",\"values\": [\"Default-Environment\"]}},(Additional items ...)]}}" + } + } + ] } }, "com.amazonaws.sts#DecodeAuthorizationMessageRequest": { @@ -2854,7 +2939,7 @@ "target": "com.amazonaws.sts#GetAccessKeyInfoResponse" }, "traits": { - "smithy.api#documentation": "

Returns the account identifier for the specified access key ID.

\n

Access keys consist of two parts: an access key ID (for example,\n AKIAIOSFODNN7EXAMPLE) and a secret access key (for example,\n wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For more information about\n access keys, see Managing Access Keys for IAM\n Users in the IAM User Guide.

\n

When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\n to which the keys belong. Access key IDs beginning with AKIA are long-term\n credentials for an IAM user or the Amazon Web Services account root user. Access key IDs beginning with\n ASIA are temporary credentials that are created using STS operations. If\n the account in the response belongs to you, you can sign in as the root user and review\n your root user access keys. Then, you can pull a credentials report to\n learn which IAM user owns the keys. To learn who requested the temporary credentials for\n an ASIA access key, view the STS events in your CloudTrail logs in the\n IAM User Guide.

\n

This operation does not indicate the state of the access key. The key might be active,\n inactive, or deleted. Active keys might not have permissions to perform an operation.\n Providing a deleted access key might return an error that the key doesn't exist.

" + "smithy.api#documentation": "

Returns the account identifier for the specified access key ID.

\n

Access keys consist of two parts: an access key ID (for example,\n AKIAIOSFODNN7EXAMPLE) and a secret access key (for example,\n wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For more information about\n access keys, see Managing Access Keys for IAM\n Users in the IAM User Guide.

\n

When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\n to which the keys belong. Access key IDs beginning with AKIA are long-term\n credentials for an IAM user or the Amazon Web Services account root user. Access key IDs\n beginning with ASIA are temporary credentials that are created using STS\n operations. If the account in the response belongs to you, you can sign in as the root user and review your root user access keys. Then, you can pull a credentials\n report to learn which IAM user owns the keys. To learn who\n requested the temporary credentials for an ASIA access key, view the STS\n events in your CloudTrail logs in the IAM User Guide.

\n

This operation does not indicate the state of the access key. The key might be active,\n inactive, or deleted. Active keys might not have permissions to perform an operation.\n Providing a deleted access key might return an error that the key doesn't exist.

" } }, "com.amazonaws.sts#GetAccessKeyInfoRequest": { @@ -2895,7 +2980,18 @@ "target": "com.amazonaws.sts#GetCallerIdentityResponse" }, "traits": { - "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to call the operation.

\n \n

No permissions are required to perform this operation. If an administrator\n attaches a policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to\n call the operation.

\n \n

No permissions are required to perform this operation. If an administrator attaches a\n policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is\n denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To get details about a calling IAM user", + "documentation": "This example shows a request and response made with the credentials for a user named Alice in the AWS account 123456789012.", + "output": { + "UserId": "AKIAI44QH8DHBEXAMPLE", + "Account": "123456789012", + "Arn": "arn:aws:iam::123456789012:user/Alice" + } + } + ] } }, "com.amazonaws.sts#GetCallerIdentityRequest": { @@ -2952,7 +3048,41 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation\n using the long-term security credentials of an IAM user. As a result, this call is\n appropriate in contexts where those credentials can be safeguarded, usually in a\n server-based application. For a comparison of GetFederationToken with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security credentials of an\n Amazon Web Services account root user rather than an IAM user that you create for the purpose of a proxy application, we do not recommend it. For more information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the session\n policies that you pass. This gives you a way to further restrict the permissions for a\n federated user. You cannot use session policies to grant more permissions than those that\n are defined in the permissions policy of the IAM user. For more information, see Session\n Policies in the IAM User Guide. For information about\n using GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation using the long-term security\n credentials of an IAM user. As a result, this call is appropriate in\n contexts where those credentials can be safeguarded, usually in a server-based application.\n For a comparison of GetFederationToken with the other API operations that\n produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user that you\n create for the purpose of a proxy application, we do not recommend it. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user\n credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This\n limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the\n session policies that you pass. This gives you a way to further restrict the permissions\n for a federated user. You cannot use session policies to grant more permissions than those\n that are defined in the permissions policy of the IAM user. For more\n information, see Session Policies in\n the IAM User Guide. For information about using\n GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

", + "smithy.api#examples": [ + { + "title": "To get temporary credentials for a role by using GetFederationToken", + "documentation": "", + "input": { + "Name": "testFedUserSession", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "DurationSeconds": 3600, + "Tags": [ + { + "Key": "Project", + "Value": "Pegasus" + }, + { + "Key": "Cost-Center", + "Value": "98765" + } + ] + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-15T23:28:33.359Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + }, + "FederatedUser": { + "Arn": "arn:aws:sts::123456789012:federated-user/Bob", + "FederatedUserId": "123456789012:Bob" + }, + "PackedPolicySize": 8 + } + } + ] } }, "com.amazonaws.sts#GetFederationTokenRequest": { @@ -2968,19 +3098,19 @@ "Policy": { "target": "com.amazonaws.sts#sessionPolicyDocumentType", "traits": { - "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you a way to further\n restrict the permissions for a federated user. You cannot use session policies to grant\n more permissions than those that are defined in the permissions policy of the IAM user.\n For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" + "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you\n a way to further restrict the permissions for a federated user. You cannot use session\n policies to grant more permissions than those that are defined in the permissions policy of\n the IAM user. For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } }, "PolicyArns": { "target": "com.amazonaws.sts#policyDescriptorListType", "traits": { - "smithy.api#documentation": "

The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\n managed session policy. The policies must exist in the same account as the IAM user that\n is requesting federated access.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\n more information about ARNs, see Amazon Resource Names (ARNs) and Amazon Web Services\n Service Namespaces in the Amazon Web Services General Reference.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you a way to further\n restrict the permissions for a federated user. You cannot use session policies to grant\n more permissions than those that are defined in the permissions policy of the IAM user.\n For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" + "smithy.api#documentation": "

The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\n managed session policy. The policies must exist in the same account as the IAM user that is requesting federated access.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\n more information about ARNs, see Amazon Resource Names (ARNs) and Amazon Web Services\n Service Namespaces in the Amazon Web Services General Reference.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you\n a way to further restrict the permissions for a federated user. You cannot use session\n policies to grant more permissions than those that are defined in the permissions policy of\n the IAM user. For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } }, "DurationSeconds": { "target": "com.amazonaws.sts#durationSecondsType", "traits": { - "smithy.api#documentation": "

The duration, in seconds, that the session should last. Acceptable durations for\n federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\n 43,200 seconds (12 hours) as the default. Sessions obtained using root user\n credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\n duration is longer than one hour, the session obtained by using root user credentials\n defaults to one hour.

" + "smithy.api#documentation": "

The duration, in seconds, that the session should last. Acceptable durations for\n federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\n 43,200 seconds (12 hours) as the default. Sessions obtained using root user\n credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\n duration is longer than one hour, the session obtained by using root user\n credentials defaults to one hour.

" } }, "Tags": { @@ -3035,7 +3165,26 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user. The\n credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2 StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit an MFA\n code that is associated with their MFA device. Using the temporary security credentials\n that the call returns, IAM users can then make programmatic calls to API\n operations that require MFA authentication. An incorrect MFA code causes the API to return an access denied error. For a comparison of GetSessionToken\n with the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are\n created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on\n permissions associated with the IAM user whose credentials were used to call the operation. The\n temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security credentials of an\n Amazon Web Services account root user rather than an IAM user, we do not recommend it. If\n GetSessionToken is called using root user credentials, the\n temporary credentials have root user permissions. For more information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

" + "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user.\n The credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2\n StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit\n an MFA code that is associated with their MFA device. Using the temporary security\n credentials that the call returns, IAM users can then make programmatic\n calls to API operations that require MFA authentication. An incorrect MFA code causes the\n API to return an access denied error. For a comparison of GetSessionToken with\n the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on permissions\n associated with the IAM user whose credentials were used to call the\n operation. The temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user, we do\n not recommend it. If GetSessionToken is called using root user\n credentials, the temporary credentials have root user permissions. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get temporary credentials for an IAM user or an AWS account", + "documentation": "", + "input": { + "DurationSeconds": 3600, + "SerialNumber": "YourMFASerialNumber", + "TokenCode": "123456" + }, + "output": { + "Credentials": { + "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-11T19:55:29.611Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + } + ] } }, "com.amazonaws.sts#GetSessionTokenRequest": { @@ -3044,19 +3193,19 @@ "DurationSeconds": { "target": "com.amazonaws.sts#durationSecondsType", "traits": { - "smithy.api#documentation": "

The duration, in seconds, that the credentials should remain valid. Acceptable durations\n for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours),\n with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account owners are\n restricted to a maximum of 3,600 seconds (one hour). If the duration is longer than one\n hour, the session for Amazon Web Services account owners defaults to one hour.

" + "smithy.api#documentation": "

The duration, in seconds, that the credentials should remain valid. Acceptable durations\n for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds\n (36 hours), with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account\n owners are restricted to a maximum of 3,600 seconds (one hour). If the duration is longer\n than one hour, the session for Amazon Web Services account owners defaults to one hour.

" } }, "SerialNumber": { "target": "com.amazonaws.sts#serialNumberType", "traits": { - "smithy.api#documentation": "

The identification number of the MFA device that is associated with the IAM user who\n is making the GetSessionToken call. Specify this value if the IAM user has a\n policy that requires MFA authentication. The value is either the serial number for a\n hardware device (such as GAHT12345678) or an Amazon Resource Name (ARN) for a\n virtual device (such as arn:aws:iam::123456789012:mfa/user). You can find the\n device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security\n credentials.

\n

The regex used to validate this parameter is a string of \n characters consisting of upper- and lower-case alphanumeric characters with no spaces. \n You can also include underscores or any of the following characters: =,.@:/-

" + "smithy.api#documentation": "

The identification number of the MFA device that is associated with the IAM user who is making the GetSessionToken call. Specify this value\n if the IAM user has a policy that requires MFA authentication. The value is\n either the serial number for a hardware device (such as GAHT12345678) or an\n Amazon Resource Name (ARN) for a virtual device (such as\n arn:aws:iam::123456789012:mfa/user). You can find the device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security credentials.

\n

The regex used to validate this parameter is a string of \n characters consisting of upper- and lower-case alphanumeric characters with no spaces. \n You can also include underscores or any of the following characters: =,.@:/-

" } }, "TokenCode": { "target": "com.amazonaws.sts#tokenCodeType", "traits": { - "smithy.api#documentation": "

The value provided by the MFA device, if MFA is required. If any policy requires the\n IAM user to submit an MFA code, specify this value. If MFA authentication is required,\n the user must provide a code when requesting a set of temporary security credentials. A\n user who fails to provide the code receives an \"access denied\" response when requesting\n resources that require MFA authentication.

\n

The format for this parameter, as described by its regex pattern, is a sequence of six\n numeric digits.

" + "smithy.api#documentation": "

The value provided by the MFA device, if MFA is required. If any policy requires the\n IAM user to submit an MFA code, specify this value. If MFA authentication\n is required, the user must provide a code when requesting a set of temporary security\n credentials. A user who fails to provide the code receives an \"access denied\" response when\n requesting resources that require MFA authentication.

\n

The format for this parameter, as described by its regex pattern, is a sequence of six\n numeric digits.

" } } }, @@ -3201,6 +3350,38 @@ "smithy.api#documentation": "

A reference to the IAM managed policy that is passed as a session policy for a role\n session or a federated user session.

" } }, + "com.amazonaws.sts#ProvidedContext": { + "type": "structure", + "members": { + "ProviderArn": { + "target": "com.amazonaws.sts#arnType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + }, + "ContextAssertion": { + "target": "com.amazonaws.sts#contextAssertionType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + }, + "com.amazonaws.sts#ProvidedContextsListType": { + "type": "list", + "member": { + "target": "com.amazonaws.sts#ProvidedContext" + }, + "traits": { + "smithy.api#length": { + "min": 0, + "max": 5 + } + } + }, "com.amazonaws.sts#RegionDisabledException": { "type": "structure", "members": { @@ -3305,6 +3486,15 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.sts#contextAssertionType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 4, + "max": 2048 + } + } + }, "com.amazonaws.sts#dateType": { "type": "timestamp" }, diff --git a/aws/sdk/aws-models/timestream-query.json b/aws/sdk/aws-models/timestream-query.json index 29edeadd2a3..13e1aea96af 100644 --- a/aws/sdk/aws-models/timestream-query.json +++ b/aws/sdk/aws-models/timestream-query.json @@ -98,6 +98,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#CancelQueryResponse": { @@ -109,6 +112,9 @@ "smithy.api#documentation": "

A CancellationMessage is returned when a CancelQuery\n request for the query specified by QueryId has already been issued.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#ClientRequestToken": { @@ -223,7 +229,7 @@ "QueryString": { "target": "com.amazonaws.timestreamquery#QueryString", "traits": { - "smithy.api#documentation": "

The query string to run. Parameter\n names can be specified in the query string @ character followed by an\n identifier. The named Parameter @scheduled_runtime is reserved and can be used in the query to get the time at which the query is scheduled to run.

\n

The timestamp calculated according to the ScheduleConfiguration parameter, will be the value of @scheduled_runtime paramater for each query run. \n For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the @scheduled_runtime parameter is \n initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.

", + "smithy.api#documentation": "

The query string to run. Parameter\n names can be specified in the query string @ character followed by an\n identifier. The named Parameter @scheduled_runtime is reserved and can be used in the query to get the time at which the query is scheduled to run.

\n

The timestamp calculated according to the ScheduleConfiguration parameter, will be the value of @scheduled_runtime paramater for each query run. \n For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the @scheduled_runtime parameter is \n initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.

", "smithy.api#required": {} } }, @@ -250,7 +256,7 @@ "ClientToken": { "target": "com.amazonaws.timestreamquery#ClientToken", "traits": { - "smithy.api#documentation": "

Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making \n multiple identical CreateScheduledQuery requests has the same effect as making a single request.\n\n

\n
    \n
  • \n

    If CreateScheduledQuery is called without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    After 8 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", + "smithy.api#documentation": "

Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making \n multiple identical CreateScheduledQuery requests has the same effect as making a single request.\n\n

\n
    \n
  • \n

    If CreateScheduledQuery is called without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    After 8 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", "smithy.api#idempotencyToken": {} } }, @@ -270,7 +276,7 @@ "KmsKeyId": { "target": "com.amazonaws.timestreamquery#StringValue2048", "traits": { - "smithy.api#documentation": "

The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS\n key is not specified, the scheduled query resource will be encrypted with a Timestream\n owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias\n ARN. When using an alias name, prefix the name with alias/\n

\n

If ErrorReportConfiguration uses SSE_KMS as encryption type, the same KmsKeyId is used to encrypt the error report at rest.

" + "smithy.api#documentation": "

The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS\n key is not specified, the scheduled query resource will be encrypted with a Timestream\n owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias\n ARN. When using an alias name, prefix the name with alias/\n

\n

If ErrorReportConfiguration uses SSE_KMS as encryption type, the same KmsKeyId is used to encrypt the error report at rest.

" } }, "ErrorReportConfiguration": { @@ -280,6 +286,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#CreateScheduledQueryResponse": { @@ -292,6 +301,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Datum": { @@ -384,6 +396,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#DescribeEndpoints": { @@ -406,12 +421,15 @@ } ], "traits": { - "smithy.api#documentation": "

DescribeEndpoints returns a list of available endpoints to make Timestream\n API calls against. This API is available through both Write and Query.

\n

Because the Timestream SDKs are designed to transparently work with the\n service’s architecture, including the management and mapping of the service endpoints,\n it is not recommended that you use this API unless:

\n \n

For detailed information on how and when to use and implement DescribeEndpoints, see\n The Endpoint Discovery Pattern.

" + "smithy.api#documentation": "

DescribeEndpoints returns a list of available endpoints to make Timestream\n API calls against. This API is available through both Write and Query.

\n

Because the Timestream SDKs are designed to transparently work with the\n service’s architecture, including the management and mapping of the service endpoints,\n it is not recommended that you use this API unless:

\n \n

For detailed information on how and when to use and implement DescribeEndpoints, see\n The Endpoint Discovery Pattern.

" } }, "com.amazonaws.timestreamquery#DescribeEndpointsRequest": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#input": {} + } }, "com.amazonaws.timestreamquery#DescribeEndpointsResponse": { "type": "structure", @@ -423,6 +441,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#DescribeScheduledQuery": { @@ -470,6 +491,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#DescribeScheduledQueryResponse": { @@ -482,6 +506,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#DimensionMapping": { @@ -513,14 +540,14 @@ } }, "com.amazonaws.timestreamquery#DimensionValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "VARCHAR", - "name": "VARCHAR" + "type": "enum", + "members": { + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" } - ] + } } }, "com.amazonaws.timestreamquery#Double": { @@ -650,6 +677,9 @@ "smithy.api#idempotencyToken": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ExecutionStats": { @@ -754,6 +784,7 @@ "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", + "items": "ScheduledQueries", "pageSize": "MaxResults" } } @@ -773,6 +804,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ListScheduledQueriesResponse": { @@ -791,6 +825,9 @@ "smithy.api#documentation": "

A token to specify where to start paginating. This is the NextToken from a previously\n truncated response.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#ListTagsForResource": { @@ -823,6 +860,7 @@ "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", + "items": "Tags", "pageSize": "MaxResults" } } @@ -849,6 +887,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ListTagsForResourceResponse": { @@ -867,6 +908,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination with a subsequent call to\n ListTagsForResourceResponse.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Long": { @@ -903,30 +947,38 @@ } }, "com.amazonaws.timestreamquery#MeasureValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "MULTI", - "name": "MULTI" + "type": "enum", + "members": { + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "MULTI": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MULTI" } - ] + } } }, "com.amazonaws.timestreamquery#MixedMeasureMapping": { @@ -1148,6 +1200,9 @@ "smithy.api#documentation": "

By setting this value to true, Timestream will only validate that the\n query string is a valid Timestream query, and not store the prepared query for later\n use.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#PrepareQueryResponse": { @@ -1174,6 +1229,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Query": { @@ -1211,7 +1269,7 @@ "aws.api#clientDiscoveredEndpoint": { "required": true }, - "smithy.api#documentation": "

\n Query is a synchronous operation that enables you to run a query against\n your Amazon Timestream data. Query will time out after 60 seconds.\n You must update the default timeout in the SDK to support a timeout of 60 seconds. See\n the code\n sample for details.

\n

Your query request will fail in the following cases:

\n
    \n
  • \n

    If you submit a Query request with the same client token outside\n of the 5-minute idempotency window.

    \n
  • \n
  • \n

    If you submit a Query request with the same client token, but\n change other parameters, within the 5-minute idempotency window.

    \n
  • \n
  • \n

    If the size of the row (including the query metadata) exceeds 1 MB, then the\n query will fail with the following error message:

    \n

    \n Query aborted as max page response size has been exceeded by the output\n result row\n

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
", + "smithy.api#documentation": "

\n Query is a synchronous operation that enables you to run a query against\n your Amazon Timestream data. Query will time out after 60 seconds.\n You must update the default timeout in the SDK to support a timeout of 60 seconds. See\n the code\n sample for details.

\n

Your query request will fail in the following cases:

\n
    \n
  • \n

    If you submit a Query request with the same client token outside\n of the 5-minute idempotency window.

    \n
  • \n
  • \n

    If you submit a Query request with the same client token, but\n change other parameters, within the 5-minute idempotency window.

    \n
  • \n
  • \n

    If the size of the row (including the query metadata) exceeds 1 MB, then the\n query will fail with the following error message:

    \n

    \n Query aborted as max page response size has been exceeded by the output\n result row\n

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
", "smithy.api#idempotent": {}, "smithy.api#paginated": { "inputToken": "NextToken", @@ -1257,22 +1315,25 @@ "ClientToken": { "target": "com.amazonaws.timestreamquery#ClientRequestToken", "traits": { - "smithy.api#documentation": "

Unique, case-sensitive string of up to 64 ASCII characters specified when a\n Query request is made. Providing a ClientToken makes the\n call to Query\n idempotent. This means that running the same query repeatedly will\n produce the same result. In other words, making multiple identical Query\n requests has the same effect as making a single request. When using\n ClientToken in a query, note the following:

\n
    \n
  • \n

    If the Query API is instantiated without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    If the Query invocation only contains the\n ClientToken but does not include a NextToken, that\n invocation of Query is assumed to be a new query run.

    \n
  • \n
  • \n

    If the invocation contains NextToken, that particular invocation\n is assumed to be a subsequent invocation of a prior call to the Query API, and a\n result set is returned.

    \n
  • \n
  • \n

    After 4 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", + "smithy.api#documentation": "

Unique, case-sensitive string of up to 64 ASCII characters specified when a\n Query request is made. Providing a ClientToken makes the\n call to Query\n idempotent. This means that running the same query repeatedly will\n produce the same result. In other words, making multiple identical Query\n requests has the same effect as making a single request. When using\n ClientToken in a query, note the following:

\n
    \n
  • \n

    If the Query API is instantiated without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    If the Query invocation only contains the\n ClientToken but does not include a NextToken, that\n invocation of Query is assumed to be a new query run.

    \n
  • \n
  • \n

    If the invocation contains NextToken, that particular invocation\n is assumed to be a subsequent invocation of a prior call to the Query API, and a\n result set is returned.

    \n
  • \n
  • \n

    After 4 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", "smithy.api#idempotencyToken": {} } }, "NextToken": { "target": "com.amazonaws.timestreamquery#PaginationToken", "traits": { - "smithy.api#documentation": "

A pagination token used to return a set of results. When the Query API\n is invoked using NextToken, that particular invocation is assumed to be a\n subsequent invocation of a prior call to Query, and a result set is\n returned. However, if the Query invocation only contains the\n ClientToken, that invocation of Query is assumed to be a\n new query run.

\n

Note the following when using NextToken in a query:

\n
    \n
  • \n

    A pagination token can be used for up to five Query invocations,\n OR for a duration of up to 1 hour – whichever comes first.

    \n
  • \n
  • \n

    Using the same NextToken will return the same set of records. To\n keep paginating through the result set, you must to use the most recent\n nextToken.

    \n
  • \n
  • \n

    Suppose a Query invocation returns two NextToken\n values, TokenA and TokenB. If TokenB is\n used in a subsequent Query invocation, then TokenA is\n invalidated and cannot be reused.

    \n
  • \n
  • \n

    To request a previous result set from a query after pagination has begun, you\n must re-invoke the Query API.

    \n
  • \n
  • \n

    The latest NextToken should be used to paginate until\n null is returned, at which point a new NextToken\n should be used.

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
" + "smithy.api#documentation": "

A pagination token used to return a set of results. When the Query API\n is invoked using NextToken, that particular invocation is assumed to be a\n subsequent invocation of a prior call to Query, and a result set is\n returned. However, if the Query invocation only contains the\n ClientToken, that invocation of Query is assumed to be a\n new query run.

\n

Note the following when using NextToken in a query:

\n
    \n
  • \n

    A pagination token can be used for up to five Query invocations,\n OR for a duration of up to 1 hour – whichever comes first.

    \n
  • \n
  • \n

    Using the same NextToken will return the same set of records. To\n keep paginating through the result set, you must to use the most recent\n nextToken.

    \n
  • \n
  • \n

    Suppose a Query invocation returns two NextToken\n values, TokenA and TokenB. If TokenB is\n used in a subsequent Query invocation, then TokenA is\n invalidated and cannot be reused.

    \n
  • \n
  • \n

    To request a previous result set from a query after pagination has begun, you\n must re-invoke the Query API.

    \n
  • \n
  • \n

    The latest NextToken should be used to paginate until\n null is returned, at which point a new NextToken\n should be used.

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
" } }, "MaxRows": { "target": "com.amazonaws.timestreamquery#MaxQueryResults", "traits": { - "smithy.api#documentation": "

The total number of rows to be returned in the Query output. The initial\n run of Query with a MaxRows value specified will return the\n result set of the query in two cases:

\n
    \n
  • \n

    The size of the result is less than 1MB.

    \n
  • \n
  • \n

    The number of rows in the result set is less than the value of\n maxRows.

    \n
  • \n
\n

Otherwise, the initial invocation of Query only returns a\n NextToken, which can then be used in subsequent calls to fetch the\n result set. To resume pagination, provide the NextToken value in the\n subsequent command.

\n

If the row size is large (e.g. a row has many columns), Timestream may return\n fewer rows to keep the response size from exceeding the 1 MB limit. If\n MaxRows is not provided, Timestream will send the necessary\n number of rows to meet the 1 MB limit.

" + "smithy.api#documentation": "

The total number of rows to be returned in the Query output. The initial\n run of Query with a MaxRows value specified will return the\n result set of the query in two cases:

\n
    \n
  • \n

    The size of the result is less than 1MB.

    \n
  • \n
  • \n

    The number of rows in the result set is less than the value of\n maxRows.

    \n
  • \n
\n

Otherwise, the initial invocation of Query only returns a\n NextToken, which can then be used in subsequent calls to fetch the\n result set. To resume pagination, provide the NextToken value in the\n subsequent command.

\n

If the row size is large (e.g. a row has many columns), Timestream may return\n fewer rows to keep the response size from exceeding the 1 MB limit. If\n MaxRows is not provided, Timestream will send the necessary\n number of rows to meet the 1 MB limit.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#QueryResponse": { @@ -1311,6 +1372,9 @@ "smithy.api#documentation": "

Information about the status of the query, including progress and bytes\n scanned.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#QueryStatus": { @@ -1433,18 +1497,20 @@ } }, "com.amazonaws.timestreamquery#S3EncryptionOption": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "SSE_S3", - "name": "SSE_S3" - }, - { - "value": "SSE_KMS", - "name": "SSE_KMS" + "type": "enum", + "members": { + "SSE_S3": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "SSE_S3" } - ] + }, + "SSE_KMS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "SSE_KMS" + } + } } }, "com.amazonaws.timestreamquery#S3ObjectKey": { @@ -1481,81 +1547,109 @@ } }, "com.amazonaws.timestreamquery#ScalarMeasureValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "TIMESTAMP", - "name": "TIMESTAMP" + "type": "enum", + "members": { + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" } - ] + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "TIMESTAMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIMESTAMP" + } + } } }, "com.amazonaws.timestreamquery#ScalarType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "TIMESTAMP", - "name": "TIMESTAMP" - }, - { - "value": "DATE", - "name": "DATE" - }, - { - "value": "TIME", - "name": "TIME" - }, - { - "value": "INTERVAL_DAY_TO_SECOND", - "name": "INTERVAL_DAY_TO_SECOND" - }, - { - "value": "INTERVAL_YEAR_TO_MONTH", - "name": "INTERVAL_YEAR_TO_MONTH" - }, - { - "value": "UNKNOWN", - "name": "UNKNOWN" - }, - { - "value": "INTEGER", - "name": "INTEGER" + "type": "enum", + "members": { + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" } - ] + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "TIMESTAMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIMESTAMP" + } + }, + "DATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DATE" + } + }, + "TIME": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIME" + } + }, + "INTERVAL_DAY_TO_SECOND": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTERVAL_DAY_TO_SECOND" + } + }, + "INTERVAL_YEAR_TO_MONTH": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTERVAL_YEAR_TO_MONTH" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "UNKNOWN" + } + }, + "INTEGER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTEGER" + } + } } }, "com.amazonaws.timestreamquery#ScalarValue": { @@ -1771,26 +1865,32 @@ } }, "com.amazonaws.timestreamquery#ScheduledQueryRunStatus": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "AUTO_TRIGGER_SUCCESS", - "name": "AUTO_TRIGGER_SUCCESS" - }, - { - "value": "AUTO_TRIGGER_FAILURE", - "name": "AUTO_TRIGGER_FAILURE" - }, - { - "value": "MANUAL_TRIGGER_SUCCESS", - "name": "MANUAL_TRIGGER_SUCCESS" - }, - { - "value": "MANUAL_TRIGGER_FAILURE", - "name": "MANUAL_TRIGGER_FAILURE" + "type": "enum", + "members": { + "AUTO_TRIGGER_SUCCESS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AUTO_TRIGGER_SUCCESS" + } + }, + "AUTO_TRIGGER_FAILURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AUTO_TRIGGER_FAILURE" + } + }, + "MANUAL_TRIGGER_SUCCESS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MANUAL_TRIGGER_SUCCESS" } - ] + }, + "MANUAL_TRIGGER_FAILURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MANUAL_TRIGGER_FAILURE" + } + } } }, "com.amazonaws.timestreamquery#ScheduledQueryRunSummary": { @@ -1844,18 +1944,20 @@ } }, "com.amazonaws.timestreamquery#ScheduledQueryState": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "ENABLED", - "name": "ENABLED" - }, - { - "value": "DISABLED", - "name": "DISABLED" + "type": "enum", + "members": { + "ENABLED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ENABLED" + } + }, + "DISABLED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DISABLED" } - ] + } } }, "com.amazonaws.timestreamquery#SchemaName": { @@ -2049,11 +2151,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#TagResourceResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.timestreamquery#TagValue": { "type": "string", @@ -2274,7 +2382,7 @@ "name": "timestream" }, "aws.protocols#awsJson1_0": {}, - "smithy.api#documentation": "Amazon Timestream Query\n \n

", + "smithy.api#documentation": "Amazon Timestream Query\n \n

", "smithy.api#title": "Amazon Timestream Query", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -2336,52 +2444,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -2389,13 +2501,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -2405,224 +2526,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://query.timestream.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://query.timestream.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3020,11 +3092,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#UntagResourceResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.timestreamquery#UpdateScheduledQuery": { "type": "operation", @@ -3078,6 +3156,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ValidationException": { diff --git a/aws/sdk/aws-models/timestream-write.json b/aws/sdk/aws-models/timestream-write.json index a3378d042b1..7c2da01499a 100644 --- a/aws/sdk/aws-models/timestream-write.json +++ b/aws/sdk/aws-models/timestream-write.json @@ -2883,52 +2883,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -2936,13 +2940,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -2952,92 +2965,83 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] } ], @@ -3046,130 +3050,115 @@ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, + "aws-us-gov", { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] } ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://ingest.timestream.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3279,6 +3268,32 @@ "UseDualStack": false } }, + { + "documentation": "For region us-gov-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://ingest.timestream.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-west-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://ingest.timestream.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": true, + "UseDualStack": false + } + }, { "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", "expect": { @@ -3296,7 +3311,7 @@ "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", "expect": { "endpoint": { - "url": "https://ingest.timestream-fips.us-gov-east-1.amazonaws.com" + "url": "https://ingest.timestream.us-gov-east-1.amazonaws.com" } }, "params": { diff --git a/aws/sdk/aws-models/transcribe-streaming.json b/aws/sdk/aws-models/transcribe-streaming.json index a1464b0462e..49bde387a53 100644 --- a/aws/sdk/aws-models/transcribe-streaming.json +++ b/aws/sdk/aws-models/transcribe-streaming.json @@ -96,7 +96,7 @@ } }, "traits": { - "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", + "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", "smithy.api#streaming": {} } }, @@ -915,7 +915,7 @@ "Confidence": { "target": "com.amazonaws.transcribestreaming#Confidence", "traits": { - "smithy.api#documentation": "

The confidence score associated with the identified PHI entity in your audio.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified entity correctly matches the entity spoken in your\n media.

" + "smithy.api#documentation": "

The confidence score associated with the identified PHI entity in your audio.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified entity correctly matches the entity spoken in your\n media.

" } } }, @@ -961,7 +961,7 @@ "Confidence": { "target": "com.amazonaws.transcribestreaming#Confidence", "traits": { - "smithy.api#documentation": "

The confidence score associated with a word or phrase in your transcript.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified item correctly matches the item spoken in your\n media.

" + "smithy.api#documentation": "

The confidence score associated with a word or phrase in your transcript.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified item correctly matches the item spoken in your\n media.

" } }, "Speaker": { @@ -1008,7 +1008,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Indicates if the segment is complete.

\n

If IsPartial is true, the segment is not complete. If\n IsPartial is false, the segment is complete.

" + "smithy.api#documentation": "

Indicates if the segment is complete.

\n

If IsPartial is true, the segment is not complete. If\n IsPartial is false, the segment is complete.

" } }, "Alternatives": { @@ -1025,7 +1025,7 @@ } }, "traits": { - "smithy.api#documentation": "

The Result associated with a \n .

\n

Contains a set of transcription results from one or more audio segments, along with\n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" + "smithy.api#documentation": "

The Result associated with a \n .

\n

Contains a set of transcription results from one or more audio segments, along with\n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" } }, "com.amazonaws.transcribestreaming#MedicalResultList": { @@ -1045,7 +1045,7 @@ } }, "traits": { - "smithy.api#documentation": "

The MedicalTranscript associated with a \n .

\n

\n MedicalTranscript contains Results, which contains a set of \n transcription results from one or more audio segments, along with additional information per your \n request parameters.

" + "smithy.api#documentation": "

The MedicalTranscript associated with a \n .

\n

\n MedicalTranscript contains Results, which contains a set of \n transcription results from one or more audio segments, along with additional information per your \n request parameters.

" } }, "com.amazonaws.transcribestreaming#MedicalTranscriptEvent": { @@ -1059,7 +1059,7 @@ } }, "traits": { - "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with additional \n information per your request parameters.

" + "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with additional \n information per your request parameters.

" } }, "com.amazonaws.transcribestreaming#MedicalTranscriptResultStream": { @@ -1068,7 +1068,7 @@ "TranscriptEvent": { "target": "com.amazonaws.transcribestreaming#MedicalTranscriptEvent", "traits": { - "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with \n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" + "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with \n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" } }, "BadRequestException": { @@ -1457,7 +1457,7 @@ "VocabularyFilterName": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-name" } }, @@ -1471,7 +1471,7 @@ "LanguageModelName": { "target": "com.amazonaws.transcribestreaming#ModelName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", + "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", "smithy.api#httpHeader": "x-amzn-transcribe-language-model-name" } }, @@ -1486,21 +1486,21 @@ "PartialResultsStability": { "target": "com.amazonaws.transcribestreaming#PartialResultsStability", "traits": { - "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", + "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", "smithy.api#httpHeader": "x-amzn-transcribe-partial-results-stability" } }, "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#ContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } }, "ContentRedactionType": { "target": "com.amazonaws.transcribestreaming#ContentRedactionType", "traits": { - "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-redaction-type" } }, @@ -1511,6 +1511,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-pii-entity-types" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionResponse": { @@ -1622,6 +1625,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-pii-entity-types" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#StartMedicalStreamTranscription": { @@ -1650,7 +1656,7 @@ } ], "traits": { - "smithy.api#documentation": "

Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \n Amazon Transcribe Medical and the transcription results are streamed to your\n application.

\n

The following parameters are required:

\n
    \n
  • \n

    \n language-code\n

    \n
  • \n
  • \n

    \n media-encoding\n

    \n
  • \n
  • \n

    \n sample-rate\n

    \n
  • \n
\n

For more information on streaming with Amazon Transcribe Medical, see \n Transcribing\n streaming audio.

", + "smithy.api#documentation": "

Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \n Amazon Transcribe Medical and the transcription results are streamed to your\n application.

\n

The following parameters are required:

\n
    \n
  • \n

    \n language-code\n

    \n
  • \n
  • \n

    \n media-encoding\n

    \n
  • \n
  • \n

    \n sample-rate\n

    \n
  • \n
\n

For more information on streaming with Amazon Transcribe Medical, see \n Transcribing\n streaming audio.

", "smithy.api#http": { "method": "POST", "uri": "/medical-stream-transcription", @@ -1664,7 +1670,7 @@ "LanguageCode": { "target": "com.amazonaws.transcribestreaming#LanguageCode", "traits": { - "smithy.api#documentation": "

Specify the language code that represents the language spoken in your audio.

\n \n

Amazon Transcribe Medical only supports US English (en-US).

\n
", + "smithy.api#documentation": "

Specify the language code that represents the language spoken in your audio.

\n \n

Amazon Transcribe Medical only supports US English (en-US).

\n
", "smithy.api#httpHeader": "x-amzn-transcribe-language-code", "smithy.api#required": {} } @@ -1680,7 +1686,7 @@ "MediaEncoding": { "target": "com.amazonaws.transcribestreaming#MediaEncoding", "traits": { - "smithy.api#documentation": "

Specify the encoding used for the input audio. Supported formats are:

\n
    \n
  • \n

    FLAC

    \n
  • \n
  • \n

    OPUS-encoded audio in an Ogg container

    \n
  • \n
  • \n

    PCM (only signed 16-bit little-endian audio formats, which does not include\n WAV)

    \n
  • \n
\n

For more information, see Media formats.

", + "smithy.api#documentation": "

Specify the encoding used for the input audio. Supported formats are:

\n
    \n
  • \n

    FLAC

    \n
  • \n
  • \n

    OPUS-encoded audio in an Ogg container

    \n
  • \n
  • \n

    PCM (only signed 16-bit little-endian audio formats, which does not include\n WAV)

    \n
  • \n
\n

For more information, see Media formats.

", "smithy.api#httpHeader": "x-amzn-transcribe-media-encoding", "smithy.api#required": {} } @@ -1712,14 +1718,14 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker\n partitioning labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", + "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker\n partitioning labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", "smithy.api#httpHeader": "x-amzn-transcribe-show-speaker-label" } }, "SessionId": { "target": "com.amazonaws.transcribestreaming#SessionId", "traits": { - "smithy.api#documentation": "

Specify a name for your transcription session. If you don't include this parameter in \n your request, Amazon Transcribe Medical generates an ID and returns it in the\n response.

\n

You can use a session ID to retry a streaming session.

", + "smithy.api#documentation": "

Specify a name for your transcription session. If you don't include this parameter in \n your request, Amazon Transcribe Medical generates an ID and returns it in the\n response.

\n

You can use a session ID to retry a streaming session.

", "smithy.api#httpHeader": "x-amzn-transcribe-session-id" } }, @@ -1734,7 +1740,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends\n the output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", + "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends\n the output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", "smithy.api#httpHeader": "x-amzn-transcribe-enable-channel-identification" } }, @@ -1748,10 +1754,13 @@ "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#MedicalContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personal health information (PHI) identified in your transcript.

\n

Content identification is performed at the segment level; PHI is flagged upon complete\n transcription of an audio segment.

\n

For more information, see Identifying personal health information (PHI) in a\n transcription.

", + "smithy.api#documentation": "

Labels all personal health information (PHI) identified in your transcript.

\n

Content identification is performed at the segment level; PHI is flagged upon complete\n transcription of an audio segment.

\n

For more information, see Identifying personal health information (PHI) in a\n transcription.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionResponse": { @@ -1850,6 +1859,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#StartStreamTranscription": { @@ -1929,7 +1941,7 @@ "AudioStream": { "target": "com.amazonaws.transcribestreaming#AudioStream", "traits": { - "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", + "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", "smithy.api#httpPayload": {}, "smithy.api#required": {} } @@ -1937,7 +1949,7 @@ "VocabularyFilterName": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n \n

This parameter is not intended for use with the\n IdentifyLanguage parameter. If you're including IdentifyLanguage\n in your request and want to use one or more vocabulary filters with your transcription, use\n the VocabularyFilterNames parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n \n

This parameter is not intended for use with the\n IdentifyLanguage parameter. If you're including IdentifyLanguage\n in your request and want to use one or more vocabulary filters with your transcription, use\n the VocabularyFilterNames parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-name" } }, @@ -1952,7 +1964,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \n labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", + "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \n labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", "smithy.api#httpHeader": "x-amzn-transcribe-show-speaker-label" } }, @@ -1960,7 +1972,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends the \n output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", + "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends the \n output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", "smithy.api#httpHeader": "x-amzn-transcribe-enable-channel-identification" } }, @@ -1982,21 +1994,21 @@ "PartialResultsStability": { "target": "com.amazonaws.transcribestreaming#PartialResultsStability", "traits": { - "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", + "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", "smithy.api#httpHeader": "x-amzn-transcribe-partial-results-stability" } }, "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#ContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } }, "ContentRedactionType": { "target": "com.amazonaws.transcribestreaming#ContentRedactionType", "traits": { - "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-redaction-type" } }, @@ -2010,7 +2022,7 @@ "LanguageModelName": { "target": "com.amazonaws.transcribestreaming#ModelName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", + "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", "smithy.api#httpHeader": "x-amzn-transcribe-language-model-name" } }, @@ -2018,7 +2030,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables automatic language identification for your transcription.

\n

If you include IdentifyLanguage, you can optionally include a list of \n language codes, using LanguageOptions, that you think may be present in \n your audio stream. Including language options can improve transcription accuracy.

\n

You can also include a preferred language using PreferredLanguage. Adding a \n preferred language can help Amazon Transcribe identify the language faster than if you omit this \n parameter.

\n

If you have multi-channel audio that contains different languages on each channel, and you've \n enabled channel identification, automatic language identification identifies the dominant language on \n each audio channel.

\n

Note that you must include either LanguageCode or \n IdentifyLanguage in your request. If you include both parameters, your request\n fails.

\n

Streaming language identification can't be combined with custom language models or \n redaction.

", + "smithy.api#documentation": "

Enables automatic language identification for your transcription.

\n

If you include IdentifyLanguage, you can optionally include a list of \n language codes, using LanguageOptions, that you think may be present in \n your audio stream. Including language options can improve transcription accuracy.

\n

You can also include a preferred language using PreferredLanguage. Adding a \n preferred language can help Amazon Transcribe identify the language faster than if you omit this \n parameter.

\n

If you have multi-channel audio that contains different languages on each channel, and you've \n enabled channel identification, automatic language identification identifies the dominant language on \n each audio channel.

\n

Note that you must include either LanguageCode or \n IdentifyLanguage in your request. If you include both parameters, your request\n fails.

\n

Streaming language identification can't be combined with custom language models or \n redaction.

", "smithy.api#httpHeader": "x-amzn-transcribe-identify-language" } }, @@ -2039,17 +2051,20 @@ "VocabularyNames": { "target": "com.amazonaws.transcribestreaming#VocabularyNames", "traits": { - "smithy.api#documentation": "

Specify the names of the custom vocabularies that you want to use when processing your\n transcription. Note that vocabulary names are case sensitive.

\n

If none of the languages of the specified custom vocabularies match the language identified in \n your media, your job fails.

\n \n

This parameter is only intended for use with the\n IdentifyLanguage parameter. If you're not\n including IdentifyLanguage in your request and want to use a custom vocabulary\n with your transcription, use the VocabularyName parameter instead.

\n
\n

For more information, see Custom vocabularies.

", + "smithy.api#documentation": "

Specify the names of the custom vocabularies that you want to use when processing your\n transcription. Note that vocabulary names are case sensitive.

\n

If none of the languages of the specified custom vocabularies match the language identified in \n your media, your job fails.

\n \n

This parameter is only intended for use with the\n IdentifyLanguage parameter. If you're not\n including IdentifyLanguage in your request and want to use a custom vocabulary\n with your transcription, use the VocabularyName parameter instead.

\n
\n

For more information, see Custom vocabularies.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-names" } }, "VocabularyFilterNames": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterNames", "traits": { - "smithy.api#documentation": "

Specify the names of the custom vocabulary filters that you want to use when processing\n your transcription. Note that vocabulary filter names are case sensitive.

\n

If none of the languages of the specified custom vocabulary filters match the language identified\n in your media, your job fails.

\n \n

This parameter is only intended for use with \n the IdentifyLanguage parameter. If you're not \n including IdentifyLanguage in your request and want to use a custom vocabulary filter \n with your transcription, use the VocabularyFilterName parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the names of the custom vocabulary filters that you want to use when processing\n your transcription. Note that vocabulary filter names are case sensitive.

\n

If none of the languages of the specified custom vocabulary filters match the language identified\n in your media, your job fails.

\n \n

This parameter is only intended for use with \n the IdentifyLanguage parameter. If you're not \n including IdentifyLanguage in your request and want to use a custom vocabulary filter \n with your transcription, use the VocabularyFilterName parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-names" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartStreamTranscriptionResponse": { @@ -2220,6 +2235,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-names" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#String": { @@ -2291,7 +2309,7 @@ "h2" ] }, - "smithy.api#documentation": "

Amazon Transcribe streaming offers three main types of real-time transcription: \n Standard, Medical, and \n Call Analytics.

\n
    \n
  • \n

    \n Standard transcriptions are the most common option. Refer\n to for details.

    \n
  • \n
  • \n

    \n Medical transcriptions are tailored to medical professionals \n and incorporate medical terms. A common use case for this service is transcribing doctor-patient \n dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\n for details.

    \n
  • \n
  • \n

    \n Call Analytics transcriptions are designed for use with call\n center audio on two different channels; if you're looking for insight into customer service calls, use this \n option. Refer to for details.

    \n
  • \n
", + "smithy.api#documentation": "

Amazon Transcribe streaming offers three main types of real-time transcription: \n Standard, Medical, and \n Call Analytics.

\n
    \n
  • \n

    \n Standard transcriptions are the most common option. Refer\n to for details.

    \n
  • \n
  • \n

    \n Medical transcriptions are tailored to medical professionals \n and incorporate medical terms. A common use case for this service is transcribing doctor-patient \n dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\n for details.

    \n
  • \n
  • \n

    \n Call Analytics transcriptions are designed for use with call\n center audio on two different channels; if you're looking for insight into customer service calls, use this \n option. Refer to for details.

    \n
  • \n
", "smithy.api#title": "Amazon Transcribe Streaming Service", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -2353,52 +2371,56 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], "type": "tree", @@ -2406,13 +2428,22 @@ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], "type": "tree", @@ -2422,224 +2453,175 @@ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] - }, + } + ], + "type": "tree", + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], + ], "type": "tree", "rules": [ { "conditions": [], "endpoint": { - "url": "https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } ] + }, + { + "conditions": [], + "endpoint": { + "url": "https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" } ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, From 4c35d7ed4573d78fe610b8e10850a8a9d60eb3dd Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 25 Sep 2023 16:06:11 -0400 Subject: [PATCH 132/331] Run the diff bot on a large instance (#3000) ## Motivation and Context We never switched the diff bot to the 8 core runner ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/pull-request-bot.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 4828ad3934a..19978590644 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -31,10 +31,9 @@ env: rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt apt_dependencies: libssl-dev gnuplot jq - jobs: generate-diff: - runs-on: ubuntu-latest + runs-on: smithy_ubuntu-latest_8-core name: Generate diff and upload to S3 env: AWS_REGION: us-west-2 @@ -69,7 +68,7 @@ jobs: fi generate-doc-preview: - runs-on: ubuntu-latest + runs-on: smithy_ubuntu-latest_8-core name: Generate rustdoc preview and upload to S3 env: AWS_REGION: us-west-2 From 8a1f09ef8f173319e0ae4dfcc7299a354296f385 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 25 Sep 2023 16:21:38 -0400 Subject: [PATCH 133/331] Update to Smithy 1.39 (#2998) ## Motivation and Context Upgrade to Smithy 1.39: ## Description The main change here is updating the endpoints generator. To get everything building I had to make a couple of other changes: - disable a couple of broken protocol tests - update the models so that they pass the new, more stringent validators - clean up some of our test models that were invalid - delete some protocol tests that were migrated upstream ## Testing CI / verify no codegen diff. - [ ] verify no diff ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: kstich --- .../models/apigateway-rules.smithy | 1 - .../models/single-static-endpoint.smithy | 20 ++ aws/sdk-codegen/build.gradle.kts | 1 + .../rustsdk/EndpointBuiltInsDecorator.kt | 15 +- .../amazon/smithy/rustsdk/RegionDecorator.kt | 11 +- .../endpoints/OperationInputTestGenerator.kt | 6 +- .../rustsdk/EndpointBuiltInsDecoratorTest.kt | 4 +- build.gradle.kts | 2 +- buildSrc/build.gradle.kts | 1 + .../model/endpoint-rules.smithy | 1 - .../model/rest-xml-extras.smithy | 96 ------ .../smithy/endpoint/EndpointRulesetIndex.kt | 2 +- .../smithy/endpoint/EndpointsDecorator.kt | 4 +- .../generators/EndpointParamsGenerator.kt | 8 +- .../generators/EndpointResolverGenerator.kt | 27 +- .../generators/EndpointTestGenerator.kt | 29 +- .../endpoint/rulesgen/ExpressionGenerator.kt | 22 +- .../endpoint/rulesgen/LiteralGenerator.kt | 9 +- .../endpoint/rulesgen/TemplateGenerator.kt | 4 +- .../client/CustomizableOperationGenerator.kt | 2 +- .../protocol/ProtocolTestGenerator.kt | 6 +- .../client/testutil/EndpointTestDiscovery.kt | 40 +++ .../endpoint/EndpointParamsGeneratorTest.kt | 14 +- .../endpoint/EndpointResolverGeneratorTest.kt | 88 +++--- .../smithy/endpoint/EndpointsDecoratorTest.kt | 4 +- .../rulesgen/ExpressionGeneratorTest.kt | 19 +- .../rulesgen/TemplateGeneratorTest.kt | 4 +- .../endpoint-tests/default-values.smithy | 88 ++++++ .../endpoint-tests/deprecated-param.smithy | 44 +++ .../endpoint-tests/duplicate-param.smithy | 55 ++++ .../get-attr-type-inference.smithy | 56 ++++ .../smithy/endpoint-tests/headers.smithy | 80 +++++ .../endpoint-tests/minimal-ruleset.smithy | 33 ++ .../smithy/endpoint-tests/parse-url.smithy | 264 ++++++++++++++++ .../smithy/endpoint-tests/substring.smithy | 293 ++++++++++++++++++ .../smithy/endpoint-tests/uri-encode.smithy | 132 ++++++++ .../endpoint-tests/valid-hostlabel.smithy | 122 ++++++++ .../smithy/endpoint-tests/valid-model.smithy | 73 +++++ .../test/resources/META-INF/smithy/manif3st | 11 + .../rest-json-extras.smithy | 93 ------ .../rust/codegen/core/testutil/TestHelpers.kt | 8 +- .../protocol/ServerProtocolTestGenerator.kt | 1 + design/src/rfcs/rfc0027_endpoints_20.md | 2 +- gradle.properties | 2 +- settings.gradle.kts | 2 +- 45 files changed, 1460 insertions(+), 339 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/manif3st diff --git a/aws/sdk-adhoc-test/models/apigateway-rules.smithy b/aws/sdk-adhoc-test/models/apigateway-rules.smithy index 3e5bb310d30..db13c805e32 100644 --- a/aws/sdk-adhoc-test/models/apigateway-rules.smithy +++ b/aws/sdk-adhoc-test/models/apigateway-rules.smithy @@ -19,7 +19,6 @@ apply BackplaneControlService @endpointRuleSet({ "endpoint": { "url": "https://www.example.com" } }], "parameters": { - "Bucket": { "required": false, "type": "String" }, "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, } }) diff --git a/aws/sdk-adhoc-test/models/single-static-endpoint.smithy b/aws/sdk-adhoc-test/models/single-static-endpoint.smithy index a110cee5c87..cb98b605fd8 100644 --- a/aws/sdk-adhoc-test/models/single-static-endpoint.smithy +++ b/aws/sdk-adhoc-test/models/single-static-endpoint.smithy @@ -26,6 +26,7 @@ use smithy.rules#endpointTests "authSchemes": [{ "name": "sigv4", "signingRegion": "{Region}", + "signingName": "blah" }] } } @@ -33,6 +34,24 @@ use smithy.rules#endpointTests ] }) @endpointTests({"version": "1", "testCases": [ + { + "documentation": "region set", + "expect": { + "endpoint": { + "url": "https://prod.us-east-1.api.myservice.aws.dev", + "properties": { + "authSchemes": [{ + "name": "sigv4", + "signingRegion": "us-east-1", + "signingName": "blah" + }] + + } + } + }, + "params": { "Region": "us-east-1" } + "operationInputs": [ ] + }, { "documentation": "region should fallback to the default", "expect": { @@ -42,6 +61,7 @@ use smithy.rules#endpointTests "authSchemes": [{ "name": "sigv4", "signingRegion": "us-east-2", + "signingName": "blah" }] } diff --git a/aws/sdk-codegen/build.gradle.kts b/aws/sdk-codegen/build.gradle.kts index b7a6471bed3..6eba2aed648 100644 --- a/aws/sdk-codegen/build.gradle.kts +++ b/aws/sdk-codegen/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-rules-engine:$smithyVersion") + implementation("software.amazon.smithy:smithy-aws-endpoints:$smithyVersion") } val generateAwsRuntimeCrateVersion by tasks.registering { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index c202b5c4cd1..47ccba7c258 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -11,8 +11,9 @@ import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.EndpointRuleSet -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.language.syntax.parameters.BuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -57,9 +58,9 @@ fun ClientCodegenContext.getBuiltIn(builtIn: String): Parameter? { } private fun promotedBuiltins(parameter: Parameter) = - parameter.builtIn == Builtins.FIPS.builtIn || - parameter.builtIn == Builtins.DUALSTACK.builtIn || - parameter.builtIn == Builtins.SDK_ENDPOINT.builtIn + parameter.builtIn == AwsBuiltIns.FIPS.builtIn || + parameter.builtIn == AwsBuiltIns.DUALSTACK.builtIn || + parameter.builtIn == BuiltIns.SDK_ENDPOINT.builtIn private fun configParamNewtype(parameter: Parameter, name: String, runtimeConfig: RuntimeConfig): RuntimeType { val type = parameter.symbol().mapRustType { t -> t.stripOuter() } @@ -202,10 +203,10 @@ fun Node.toWritable(): Writable { val PromotedBuiltInsDecorators = listOf( - decoratorForBuiltIn(Builtins.FIPS), - decoratorForBuiltIn(Builtins.DUALSTACK), + decoratorForBuiltIn(AwsBuiltIns.FIPS), + decoratorForBuiltIn(AwsBuiltIns.DUALSTACK), decoratorForBuiltIn( - Builtins.SDK_ENDPOINT, + BuiltIns.SDK_ENDPOINT, ConfigParam.Builder() .name("endpoint_url") .type(RuntimeType.String.toSymbol()) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index 25c72ee3efe..1dd0477163e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -9,7 +9,7 @@ import software.amazon.smithy.aws.traits.auth.SigV4Trait import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule @@ -87,7 +87,7 @@ class RegionDecorator : ClientCodegenDecorator { // Services that have an endpoint ruleset that references the SDK::Region built in, or // that use SigV4, both need a configurable region. private fun usesRegion(codegenContext: ClientCodegenContext) = - codegenContext.getBuiltIn(Builtins.REGION) != null || ServiceIndex.of(codegenContext.model) + codegenContext.getBuiltIn(AwsBuiltIns.REGION) != null || ServiceIndex.of(codegenContext.model) .getEffectiveAuthSchemes(codegenContext.serviceShape).containsKey(SigV4Trait.ID) override fun configCustomizations( @@ -136,7 +136,7 @@ class RegionDecorator : ClientCodegenDecorator { object : EndpointCustomization { override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { return when (parameter.builtIn) { - Builtins.REGION.builtIn -> writable { + AwsBuiltIns.REGION.builtIn -> writable { if (codegenContext.smithyRuntimeMode.generateOrchestrator) { rustTemplate( "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", @@ -146,12 +146,13 @@ class RegionDecorator : ClientCodegenDecorator { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } } + else -> null } } override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? { - if (name != Builtins.REGION.builtIn.get()) { + if (name != AwsBuiltIns.REGION.builtIn.get()) { return null } return writable { @@ -174,6 +175,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi *preludeScope, "Region" to region.resolve("Region"), ) + override fun section(section: ServiceConfig) = writable { when (section) { ServiceConfig.ConfigStruct -> { @@ -181,6 +183,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) } } + ServiceConfig.ConfigImpl -> { if (runtimeMode.generateOrchestrator) { rustTemplate( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index f1a957be611..ff42af1960f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -8,7 +8,7 @@ package software.amazon.smithy.rustsdk.endpoints import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -59,9 +59,9 @@ class OperationInputTestDecorator : ClientCodegenDecorator { private val deprecatedBuiltins = setOf( // The Rust SDK DOES NOT support the S3 global endpoint because we do not support bucket redirects - Builtins.S3_USE_GLOBAL_ENDPOINT, + AwsBuiltIns.S3_USE_GLOBAL_ENDPOINT, // STS global endpoint was deprecated after STS regionalization - Builtins.STS_USE_GLOBAL_ENDPOINT, + AwsBuiltIns.STS_USE_GLOBAL_ENDPOINT, ).map { it.builtIn.get() } fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Boolean { diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt index ad84fb54df5..f5d46f5c513 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt @@ -41,7 +41,7 @@ class EndpointBuiltInsDecoratorTest { "endpoint": { "url": "{endpoint}" "properties": { - "authSchemes": [{"name": "sigv4","signingRegion": "{region}"}] + "authSchemes": [{"name": "sigv4","signingRegion": "{region}", "signingName": "dontcare"}] } } }, @@ -53,7 +53,7 @@ class EndpointBuiltInsDecoratorTest { "endpoint": { "url": "https://WRONG/" "properties": { - "authSchemes": [{"name": "sigv4", "signingRegion": "{region}"}] + "authSchemes": [{"name": "sigv4", "signingRegion": "{region}", "signingName": "dontcare"}] } } } diff --git a/build.gradle.kts b/build.gradle.kts index a2d6385db4e..2a4758345fe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ plugins { } allprojects { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c4b8cf2d35f..7dd86dd69eb 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -13,6 +13,7 @@ plugins { repositories { mavenCentral() google() + /* mavenLocal() */ } // Load properties manually to avoid hard coding smithy version diff --git a/codegen-client-test/model/endpoint-rules.smithy b/codegen-client-test/model/endpoint-rules.smithy index 7b681a3013f..cbd4c903a64 100644 --- a/codegen-client-test/model/endpoint-rules.smithy +++ b/codegen-client-test/model/endpoint-rules.smithy @@ -20,7 +20,6 @@ use aws.protocols#awsJson1_1 }], "parameters": { "Bucket": { "required": false, "type": "String" }, - "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, } }) service TestService { diff --git a/codegen-client-test/model/rest-xml-extras.smithy b/codegen-client-test/model/rest-xml-extras.smithy index 0c20c273cd1..76a6bbd9fa8 100644 --- a/codegen-client-test/model/rest-xml-extras.smithy +++ b/codegen-client-test/model/rest-xml-extras.smithy @@ -21,9 +21,6 @@ service RestXmlExtras { StringHeader, CreateFoo, RequiredMember, - // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy - // They're being added in https://github.com/smithy-lang/smithy/pull/1908 - HttpPayloadWithUnion, ] } @@ -260,96 +257,3 @@ structure RequiredMemberInputOutput { @required requiredString: String } - -// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them -// They're being added in https://github.com/smithy-lang/smithy/pull/1908 - -/// This example serializes a union in the payload. -@idempotent -@http(uri: "/HttpPayloadWithUnion", method: "PUT") -operation HttpPayloadWithUnion { - input: HttpPayloadWithUnionInputOutput, - output: HttpPayloadWithUnionInputOutput -} - -apply HttpPayloadWithUnion @httpRequestTests([ - { - id: "RestXmlHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restXml, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: """ - - hello - """, - bodyMediaType: "application/xml", - headers: { - "Content-Type": "application/xml", - }, - requireHeaders: [ - "Content-Length" - ], - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestXmlHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restXml, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: "", - headers: { - "Content-Type": "application/xml", - "Content-Length": "0" - }, - params: {} - } -]) - -apply HttpPayloadWithUnion @httpResponseTests([ - { - id: "RestXmlHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restXml, - code: 200, - body: """ - - hello - """, - bodyMediaType: "application/xml", - headers: { - "Content-Type": "application/xml", - }, - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestXmlHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restXml, - code: 200, - body: "", - headers: { - "Content-Type": "application/xml", - "Content-Length": "0" - }, - params: {} - } -]) - -structure HttpPayloadWithUnionInputOutput { - @httpPayload - nested: UnionPayload, -} - -union UnionPayload { - greeting: String -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt index c28c4c43a52..a47aa2d8082 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt @@ -25,7 +25,7 @@ class EndpointRulesetIndex : KnowledgeIndex { serviceShape, ) { serviceShape.getTrait()?.ruleSet?.let { EndpointRuleSet.fromNode(it) } - ?.also { it.typecheck() } + ?.also { it.typeCheck() } } fun endpointTests(serviceShape: ServiceShape) = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index 351d205813c..a38ec6afe30 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -49,7 +49,7 @@ interface EndpointCustomization { * ```kotlin * override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { * return when (parameter.builtIn) { - * Builtins.REGION.builtIn -> writable { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } + * AwsBuiltIns.REGION.builtIn -> writable { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } * else -> null * } * } @@ -63,7 +63,7 @@ interface EndpointCustomization { * Example: * ```kotlin * override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? { - * if (name != Builtins.REGION.builtIn.get()) { + * if (name != AwsBuiltIns.REGION.builtIn.get()) { * return null * } * return writable { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt index 779a4eb8d27..59120404693 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt @@ -5,7 +5,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators -import software.amazon.smithy.rulesengine.language.eval.Value +import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue +import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue +import software.amazon.smithy.rulesengine.language.evaluation.value.Value import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -216,8 +218,8 @@ internal class EndpointParamsGenerator( private fun value(value: Value): String { return when (value) { - is Value.String -> value.value().dq() + ".to_string()" - is Value.Bool -> value.expectBool().toString() + is StringValue -> value.value.dq() + ".to_string()" + is BooleanValue -> value.value.toString() else -> TODO("unexpected type: $value") } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index a8237205711..b3848eb5dbc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -7,13 +7,14 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators import software.amazon.smithy.rulesengine.language.Endpoint import software.amazon.smithy.rulesengine.language.EndpointRuleSet -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Reference -import software.amazon.smithy.rulesengine.language.syntax.fn.IsSet +import software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType +import software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Reference +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.IsSet import software.amazon.smithy.rulesengine.language.syntax.rule.Condition import software.amazon.smithy.rulesengine.language.syntax.rule.Rule -import software.amazon.smithy.rulesengine.language.visit.RuleValueVisitor +import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context @@ -247,9 +248,9 @@ internal class EndpointResolverGenerator( } private fun isExhaustive(rule: Rule): Boolean = rule.conditions.isEmpty() || rule.conditions.all { - when (it.fn.type()) { - is Type.Bool -> false - is Type.Option -> false + when (it.function.type()) { + is BooleanType -> false + is OptionalType -> false else -> true } } @@ -262,8 +263,8 @@ internal class EndpointResolverGenerator( * deal with the actual target of the condition but flattening through isSet */ private fun Condition.targetFunction(): Expression { - return when (val fn = this.fn) { - is IsSet -> fn.target + return when (val fn = this.function) { + is IsSet -> fn.arguments[0] else -> fn } } @@ -292,7 +293,7 @@ internal class EndpointResolverGenerator( val target = generator.generate(fn) val next = generateRuleInternal(rule, rest) when { - fn.type() is Type.Option -> { + fn.type() is OptionalType -> { Attribute.AllowUnusedVariables.render(this) rustTemplate( "if let Some($resultName) = #{target:W} { #{next:W} }", @@ -301,7 +302,7 @@ internal class EndpointResolverGenerator( ) } - fn.type() is Type.Bool -> { + fn.type() is BooleanType -> { rustTemplate( """ if #{target:W} {#{binding} @@ -362,7 +363,7 @@ internal class EndpointResolverGenerator( return writable { rustTemplate("#{SmithyEndpoint}::builder().url(#{url:W})", *codegenScope, "url" to url) headers.forEach { (name, values) -> values.forEach { rust(".header(${name.dq()}, #W)", it) } } - properties.forEach { (name, value) -> rust(".property(${name.asString().dq()}, #W)", value) } + properties.forEach { (name, value) -> rust(".property(${name.toString().dq()}, #W)", value) } rust(".build()") } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt index c5b415b2a6b..442adedf81d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt @@ -5,7 +5,12 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators -import software.amazon.smithy.rulesengine.language.eval.Value +import software.amazon.smithy.rulesengine.language.evaluation.value.ArrayValue +import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue +import software.amazon.smithy.rulesengine.language.evaluation.value.IntegerValue +import software.amazon.smithy.rulesengine.language.evaluation.value.RecordValue +import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue +import software.amazon.smithy.rulesengine.language.evaluation.value.Value import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rulesengine.traits.EndpointTestCase @@ -119,9 +124,9 @@ internal class EndpointTestGenerator( private fun generateValue(value: Value): Writable { return { when (value) { - is Value.String -> rust(escape(value.value()).dq() + ".to_string()") - is Value.Bool -> rust(value.toString()) - is Value.Array -> { + is StringValue -> rust(escape(value.value).dq() + ".to_string()") + is BooleanValue -> rust(value.toString()) + is ArrayValue -> { rust( "vec![#W]", value.values.map { member -> @@ -136,22 +141,20 @@ internal class EndpointTestGenerator( ) } - is Value.Integer -> rust(value.expectInteger().toString()) + is IntegerValue -> rust(value.value.toString()) - is Value.Record -> + is RecordValue -> rustBlock("") { rustTemplate( "let mut out = #{HashMap}::::new();", *codegenScope, ) - // TODO(https://github.com/awslabs/smithy/pull/1555): remove sort by name when upgrading to - // Smithy version with this PR merged - val keys = mutableListOf() - value.forEach { id, _ -> keys.add(id) } - keys.sortedBy { it.name.value }.forEach { identifier -> - val v = value.get(identifier) + val ids = mutableListOf() + value.value.forEach { (id, _) -> ids.add(id) } + ids.forEach { id -> + val v = value.get(id) rust( - "out.insert(${identifier.toString().dq()}.to_string(), #W.into());", + "out.insert(${id.toString().dq()}.to_string(), #W.into());", // When writing into the hashmap, it always needs to be an owned type generateValue(v), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt index b0d45366ed0..562ba8e2018 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt @@ -6,13 +6,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import org.jetbrains.annotations.Contract -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Reference -import software.amazon.smithy.rulesengine.language.syntax.fn.FunctionDefinition -import software.amazon.smithy.rulesengine.language.syntax.fn.GetAttr -import software.amazon.smithy.rulesengine.language.visit.ExpressionVisitor +import software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType +import software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType +import software.amazon.smithy.rulesengine.language.evaluation.type.Type +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.ExpressionVisitor +import software.amazon.smithy.rulesengine.language.syntax.expressions.Reference +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.FunctionDefinition +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.GetAttr +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName @@ -51,7 +53,7 @@ class ExpressionGenerator( override fun visitRef(ref: Reference) = writable { if (ownership == Ownership.Owned) { when (ref.type()) { - is Type.Bool -> rust("*${ref.name.rustName()}") + is BooleanType -> rust("*${ref.name.rustName()}") else -> rust("${ref.name.rustName()}.to_owned()") } } else { @@ -75,8 +77,8 @@ class ExpressionGenerator( } } } - if (ownership == Ownership.Owned && getAttr.type() != Type.bool()) { - if (getAttr.type() is Type.Option) { + if (ownership == Ownership.Owned && getAttr.type() != Type.booleanType()) { + if (getAttr.type() is OptionalType) { rust(".map(|t|t.to_owned())") } else { rust(".to_owned()") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt index 8911ddc7a54..a986c50e6da 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt @@ -6,8 +6,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import software.amazon.smithy.rulesengine.language.syntax.Identifier -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.LiteralVisitor import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -24,13 +25,13 @@ import java.util.stream.Stream * The `Document` type is used to support generating JSON-like documents */ class LiteralGenerator(private val ownership: Ownership, private val context: Context) : - Literal.Vistor { + LiteralVisitor { private val runtimeConfig = context.runtimeConfig private val codegenScope = arrayOf( "Document" to RuntimeType.document(runtimeConfig), "HashMap" to RuntimeType.HashMap, ) - override fun visitBool(b: Boolean) = writable { + override fun visitBoolean(b: Boolean) = writable { rust(b.toString()) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt index 93381313926..29b8a8d50f1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt @@ -5,8 +5,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.visit.TemplateVisitor +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.TemplateVisitor import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 2e919d8c56b..bffb0c7b6e2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -246,7 +246,7 @@ class CustomizableOperationGenerator( /// Convenience for `map_request` where infallible direct mutation of request is acceptable. pub fn mutate_request(mut self, f: F) -> Self where - F: #{Fn}(&mut http::Request<#{SdkBody}>) + #{Send} + #{Sync} + 'static, + F: #{Fn}(&mut #{HttpRequest}) + #{Send} + #{Sync} + 'static, { self.interceptors.push( #{SharedInterceptor}::new( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 2f994788fe0..f16182688ef 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -386,7 +386,8 @@ class DefaultProtocolTestGenerator( }); """, "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), - "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), + "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc) + .resolve("client::ser_de::SharedResponseDeserializer"), "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), "RuntimePlugin" to RT.runtimePlugin(rc), @@ -628,6 +629,9 @@ class DefaultProtocolTestGenerator( "SDKAppliedContentEncoding_ec2Query", "SDKAppliedContentEncoding_restJson1", "SDKAppliedContentEncoding_restXml", + "AwsJson11DeserializeIgnoreType", + "AwsJson10DeserializeIgnoreType", + "RestJsonDeserializeIgnoreType", ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt new file mode 100644 index 00000000000..4cc67ae464e --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt @@ -0,0 +1,40 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.testutil + +import software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.ServiceIndex +import software.amazon.smithy.model.loader.ModelAssembler +import software.amazon.smithy.model.loader.ModelDiscovery +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.letIf + +class EndpointTestDiscovery { + fun testCases(): List { + val models = ModelDiscovery.findModels(javaClass.getResource("/META-INF/smithy/manif3st")) + val assembledModels = models.map { url -> ModelAssembler().discoverModels().addImport(url).assemble().unwrap() } + // add a protocol trait so we can generate of it + return assembledModels.map { model -> + if (model.serviceShapes.size > 1) { + PANIC("too many services") + } + val service = model.serviceShapes.first() + if (ServiceIndex.of(model).getProtocols(service).isEmpty()) { + ModelTransformer.create().mapShapes(model) { s -> + s.letIf(s == service) { + s.asServiceShape().get().toBuilder().addTrait( + AwsJson1_0Trait.builder().build(), + ).build() + } + } + } else { + model + } + } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt index 34636f596c5..209e235299a 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt @@ -5,18 +5,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import software.amazon.smithy.rulesengine.testutil.TestDiscovery -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import java.util.stream.Stream - internal class EndpointParamsGeneratorTest { + /* companion object { @JvmStatic fun testSuites(): Stream = TestDiscovery().testSuites() @@ -39,5 +29,5 @@ internal class EndpointParamsGeneratorTest { } } project.compileAndTest() - } + }*/ } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt index 5a798cae4d5..6df462940d3 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt @@ -5,74 +5,60 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource -import software.amazon.smithy.codegen.core.CodegenException import software.amazon.smithy.model.Model -import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.Endpoint -import software.amazon.smithy.rulesengine.language.eval.Scope -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.testutil.TestDiscovery -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointTestGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.awsStandardLib -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import java.util.stream.Stream +import software.amazon.smithy.rust.codegen.client.testutil.EndpointTestDiscovery +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams +import software.amazon.smithy.rust.codegen.core.util.runCommand class EndpointResolverGeneratorTest { companion object { + val testCases = listOf( + "default-values.smithy", + "deprecated-param.smithy", + "duplicate-param.smithy", + "get-attr-type-inference.smithy", + "headers.smithy", + "minimal-ruleset.smithy", + "parse-url.smithy", + "substring.smithy", + "uri-encode.smithy", + "valid-hostlabel.smithy", + "valid-model.smithy", + ) + @JvmStatic - fun testSuites(): Stream = - TestDiscovery().testSuites().map { it.ruleSet().typecheck(); it } + fun testSuites(): List { + return EndpointTestDiscovery().testCases() + } + } + + @Test + fun `test`() { + `generate all rulesets`(testSuites()[0]) } // for tests, load partitions.json from smithy—for real usage, this file will be inserted at codegen time - private val partitionsJson = + /*private val partitionsJson = Node.parse( this::class.java.getResource("/software/amazon/smithy/rulesengine/language/partitions.json")?.readText() ?: throw CodegenException("partitions.json was not present in smithy bundle"), - ) + )*/ @ParameterizedTest(name = "{0}") @MethodSource("testSuites") - fun `generate all rulesets`(suite: TestDiscovery.RulesTestSuite) { + fun `generate all rulesets`(suite: Model) { // snippet to only run one ruleset during tests - if (!suite.toString().contains("hostable")) { - // return - } - val project = TestWorkspace.testProject() - val context = testClientCodegenContext() - suite.ruleSet().typecheck() - project.lib { - val ruleset = EndpointResolverGenerator( - context, - SmithyEndpointsStdLib + awsStandardLib(TestRuntimeConfig, partitionsJson), - ).defaultEndpointResolver(suite.ruleSet()) - val testGenerator = EndpointTestGenerator( - suite.testSuite().testCases, - paramsType = EndpointParamsGenerator(context, suite.ruleSet().parameters).paramsStruct(), - resolverType = ruleset, - suite.ruleSet().parameters, - codegenContext = testClientCodegenContext(model = Model.builder().build()), - endpointCustomizations = listOf(), - ) - testGenerator.generate()(this) - } - project.compileAndTest(runClippy = true) + // if (!suite.toString().contains("hostable")) { + // return + // } + clientIntegrationTest(suite, params = IntegrationTestParams(command = { it -> "cargo test".runCommand(it, mapOf("RUSTFLAGS" to "")) })) } + /* @Test fun `only include actually used functions in endpoints lib`() { testSuites().map { it.ruleSet().sourceLocation.filename }.forEach { println(it) } @@ -108,14 +94,14 @@ class EndpointResolverGeneratorTest { @Test fun generateEndpoints() { val endpoint = Endpoint.builder().url(Expression.of("https://{Region}.amazonaws.com")) - .addHeader("x-amz-test", listOf(Literal.of("header-value"))) + .putHeader("x-amz-test", listOf(Literal.of("header-value"))) .addAuthScheme( "sigv4", hashMapOf("signingName" to Literal.of("service"), "signingScope" to Literal.of("{Region}")), ) .build() val scope = Scope() - scope.insert("Region", Type.string()) + scope.insert("Region", Type.stringType()) endpoint.typeCheck(scope) val context = testClientCodegenContext() val generator = EndpointResolverGenerator(context, listOf()) @@ -130,5 +116,5 @@ class EndpointResolverGeneratorTest { "endpoint" to generator.generateEndpoint(endpoint), ) }.compileAndTest() - } + }*/ } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 9d2e74c1b74..a760c39480e 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -69,7 +69,7 @@ class EndpointsDecoratorTest { documentation: "string docs", type: "string" }, - aBoolParam: { + ABoolParam: { documentation: "bool docs", type: "boolean" } @@ -119,7 +119,7 @@ class EndpointsDecoratorTest { structure NestedStructure { field: String } - """.asSmithyModel() + """.asSmithyModel(disableValidation = true) // TODO(enableNewSmithyRuntimeCleanup): Delete this test (replaced by the second @Test below) @Test diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt index 823d6ace785..58e23cb28b0 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt @@ -9,11 +9,12 @@ import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.ArrayNode import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.stdlib.BooleanEquals import software.amazon.smithy.rulesengine.language.syntax.Identifier -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.BooleanEquals +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.StringEquals +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -29,8 +30,8 @@ internal class ExprGeneratorTest { @Test fun generateExprs() { - val boolEq = Expression.of(true).equal(true) - val strEq = Expression.of("helloworld").equal("goodbyeworld").not() + val boolEq = BooleanEquals.ofExpressions(Expression.of(true), Expression.of(true)) + val strEq = StringEquals.ofExpressions(Expression.of("helloworld"), Expression.of("goodbyeworld")).not() val combined = BooleanEquals.ofExpressions(boolEq, strEq) TestWorkspace.testProject().unitTest { val generator = ExpressionGenerator(Ownership.Borrowed, testContext) @@ -42,10 +43,10 @@ internal class ExprGeneratorTest { @Test fun generateLiterals1() { - val literal = Literal.record( + val literal = Literal.recordLiteral( mutableMapOf( - Identifier.of("this") to Literal.integer(5), - Identifier.of("that") to Literal.string( + Identifier.of("this") to Literal.integerLiteral(5), + Identifier.of("that") to Literal.stringLiteral( Template.fromString("static"), ), ), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt index 8e78e1983c6..95188a9b5dd 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt @@ -6,8 +6,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import org.junit.jupiter.api.Test -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy new file mode 100644 index 00000000000..3a2be041952 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy @@ -0,0 +1,88 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@clientContextParams( + bar: {type: "string", documentation: "a client string parameter"} +) +@endpointRuleSet({ + version: "1.0", + parameters: { + bar: { + type: "string", + documentation: "docs" + }, + endpoint: { + type: "string", + builtIn: "SDK::Endpoint", + required: true, + default: "asdf" + documentation: "docs" + }, + }, + rules: [ + { + "documentation": "Template the region into the URI when FIPS is enabled", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "bar" + } + ] + } + ], + "endpoint": { + "url": "https://example.com" + }, + "type": "endpoint" + }, + { + "conditions": [], + "documentation": "error fallthrough", + "error": "endpoint error", + "type": "error" + } + ] +}) +@endpointTests({ + "version": "1.0", + "testCases": [ + { + "params": { + "bar": "a b", + } + "operationInputs": [{ + "operationName": "GetThing", + "builtInParams": { + "SDK::Endpoint": "https://custom.example.com" + } + }], + "expect": { + "endpoint": { + "url": "https://example.com" + } + } + }, + { + "documentation": "a documentation string", + "expect": { + "error": "endpoint error" + } + } + ] +}) +@aws.protocols#awsJson1_0 +service FizzBuzz { + version: "2022-01-01", + operations: [GetThing] +} + +operation GetThing { + input := {} +} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy new file mode 100644 index 00000000000..c4e5894e074 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy @@ -0,0 +1,44 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "required": false, + "deprecated": { + "message": "use blahdeblah region instead" + }, + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "base rule", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "properties": {} + }, + "type": "endpoint" + } + ], + "version": "1.3" +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy new file mode 100644 index 00000000000..822d6ec93e5 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy @@ -0,0 +1,55 @@ +$version: "1.0" + +namespace example + +use smithy.rules#contextParam +use smithy.rules#endpointRuleSet +use smithy.rules#staticContextParams + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "ParameterBar": { + "type": "String", + "required": true, + "documentation": "docs" + } + }, + "rules": [ + { + "conditions": [], + "documentation": "base rule", + "endpoint": { + "url": "https://{ParameterBar}.amazonaws.com", + "headers": {} + }, + "type": "endpoint" + } + ] +}) +service FizzBuzz { + operations: [GetResource, GetAnotherResource] +} + +@staticContextParams( + "ParameterBar": {value: "bar"} +) +operation GetResource { + input: GetResourceInput +} + +structure GetResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +operation GetAnotherResource { + input: GetAnotherResourceInput +} + +structure GetAnotherResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +string ResourceId diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy new file mode 100644 index 00000000000..50fbe5df74e --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy @@ -0,0 +1,56 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Bucket": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "bucket is set, handle bucket specific endpoints", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + "{Bucket}" + ], + "assign": "bucketUrl" + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketUrl" + }, + "path" + ], + "assign": "path" + } + ], + "endpoint": { + "url": "https://{bucketUrl#authority}/{path}" + }, + "type": "endpoint" + } + ] +}) +@clientContextParams( + Bucket: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy new file mode 100644 index 00000000000..5587c8be35a --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy @@ -0,0 +1,80 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "documentation": "The region to dispatch this request, eg. `us-east-1`." + } + }, + "rules": [ + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "headers": { + "x-amz-region": [ + "{Region}" + ], + "x-amz-multi": [ + "*", + "{Region}" + ] + } + }, + "type": "endpoint" + }, + { + "documentation": "fallback when region is unset", + "conditions": [], + "error": "Region must be set to resolve a valid endpoint", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + "version": "1.0", + "testCases": [ + { + "documentation": "header set to region", + "params": { + "Region": "us-east-1" + }, + "expect": { + "endpoint": { + "url": "https://us-east-1.amazonaws.com", + "headers": { + "x-amz-region": [ + "us-east-1" + ], + "x-amz-multi": [ + "*", + "us-east-1" + ] + } + } + } + } + ] +) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy new file mode 100644 index 00000000000..3a8a927a366 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy @@ -0,0 +1,33 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Region": { + "required": true, + "type": "String", + "documentation": "docs" + } + }, + "rules": [ + { + "conditions": [], + "documentation": "base rule", + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy new file mode 100644 index 00000000000..fce40b5f31e --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy @@ -0,0 +1,264 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Endpoint": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "endpoint is set and is a valid URL", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + "{Endpoint}" + ], + "assign": "url" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}is-ip-addr" + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{url#path}", + "/port" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}/uri-with-port" + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{url#normalizedPath}", + "/" + ] + } + ], + "endpoint": { + "url": "https://{url#scheme}-{url#authority}-nopath.example.com" + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{url#scheme}-{url#authority}.example.com/path-is{url#path}" + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "error": "endpoint was invalid", + "conditions": [], + "type": "error" + } + ] +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "simple URL parsing", + "params": { + "Endpoint": "https://authority.com/custom-path" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com.example.com/path-is/custom-path" + } + } + }, + { + "documentation": "empty path no slash", + "params": { + "Endpoint": "https://authority.com" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com-nopath.example.com" + } + } + }, + { + "documentation": "empty path with slash", + "params": { + "Endpoint": "https://authority.com/" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com-nopath.example.com" + } + } + }, + { + "documentation": "authority with port", + "params": { + "Endpoint": "https://authority.com:8000/port" + }, + "expect": { + "endpoint": { + "url": "https://authority.com:8000/uri-with-port" + } + } + }, + { + "documentation": "http schemes", + "params": { + "Endpoint": "http://authority.com:8000/port" + }, + "expect": { + "endpoint": { + "url": "http://authority.com:8000/uri-with-port" + } + } + }, + { + "documentation": "arbitrary schemes are not supported", + "params": { + "Endpoint": "acbd://example.com" + }, + "expect": { + "error": "endpoint was invalid" + } + }, + { + "documentation": "host labels are not validated", + "params": { + "Endpoint": "http://99_ab.com" + }, + "expect": { + "endpoint": { + "url": "https://http-99_ab.com-nopath.example.com" + } + } + }, + { + "documentation": "host labels are not validated", + "params": { + "Endpoint": "http://99_ab-.com" + }, + "expect": { + "endpoint": { + "url": "https://http-99_ab-.com-nopath.example.com" + } + } + }, + { + "documentation": "invalid URL", + "params": { + "Endpoint": "http://abc.com:a/foo" + }, + "expect": { + "error": "endpoint was invalid" + } + }, + { + "documentation": "IP Address", + "params": { + "Endpoint": "http://192.168.1.1/foo/" + }, + "expect": { + "endpoint": { + "url": "http://192.168.1.1/foo/is-ip-addr" + } + } + }, + { + "documentation": "IP Address with port", + "params": { + "Endpoint": "http://192.168.1.1:1234/foo/" + }, + "expect": { + "endpoint": { + "url": "http://192.168.1.1:1234/foo/is-ip-addr" + } + } + }, + { + "documentation": "IPv6 Address", + "params": { + "Endpoint": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443" + }, + "expect": { + "endpoint": { + "url": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/is-ip-addr" + } + } + }, + { + "documentation": "weird DNS name", + "params": { + "Endpoint": "https://999.999.abc.blah" + }, + "expect": { + "endpoint": { + "url": "https://https-999.999.abc.blah-nopath.example.com" + } + } + }, + { + "documentation": "query in resolved endpoint is not supported", + "params": { + "Endpoint": "https://example.com/path?query1=foo" + }, + "expect": { + "error": "endpoint was invalid" + } + } + ] +) +@clientContextParams( + Endpoint: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy new file mode 100644 index 00000000000..42d93b922d4 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy @@ -0,0 +1,293 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "TestCaseId": { + "type": "string", + "required": true, + "documentation": "Test case id used to select the test case to use" + }, + "Input": { + "type": "string", + "required": true, + "documentation": "the input used to test substring" + } + }, + "rules": [ + { + "documentation": "Substring from beginning of input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "1" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 0, + 4, + false + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "Substring from end of input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "2" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 0, + 4, + true + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "Substring the middle of the string", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "3" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 1, + 3, + false + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "fallback when no tests match", + "conditions": [], + "error": "No tests matched", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "substring when string is long enough", + "params": { + "TestCaseId": "1", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `abcd`" + } + }, + { + "documentation": "substring when string is exactly the right length", + "params": { + "TestCaseId": "1", + "Input": "abcd" + }, + "expect": { + "error": "The value is: `abcd`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "1", + "Input": "abc" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "1", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "1", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "unicode characters always return `None`", + "params": { + "TestCaseId": "1", + "Input": "abcdef\uD83D\uDC31" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "non-ascii cause substring to always return `None`", + "params": { + "TestCaseId": "1", + "Input": "abcdef\u0080" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "the full set of ascii is supported, including non-printable characters", + "params": { + "TestCaseId": "1", + "Input": "\u007Fabcdef" + }, + "expect": { + "error": "The value is: `\u007Fabc`" + } + }, + { + "documentation": "substring when string is long enough", + "params": { + "TestCaseId": "2", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `defg`" + } + }, + { + "documentation": "substring when string is exactly the right length", + "params": { + "TestCaseId": "2", + "Input": "defg" + }, + "expect": { + "error": "The value is: `defg`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "2", + "Input": "abc" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "2", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "2", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is longer", + "params": { + "TestCaseId": "3", + "Input": "defg" + }, + "expect": { + "error": "The value is: `ef`" + } + }, + { + "documentation": "substring when string is exact length", + "params": { + "TestCaseId": "3", + "Input": "def" + }, + "expect": { + "error": "The value is: `ef`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "3", + "Input": "ab" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "3", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "3", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + } + ] +) +@clientContextParams( + TestCaseId: {type: "string", documentation: "docs"} + Input: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy new file mode 100644 index 00000000000..6d2ef57f69c --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy @@ -0,0 +1,132 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "TestCaseId": { + "type": "string", + "required": true, + "documentation": "Test case id used to select the test case to use" + }, + "Input": { + "type": "string", + "required": true, + "documentation": "The input used to test uriEncode" + } + }, + "rules": [ + { + "documentation": "uriEncode on input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "1" + ] + }, + { + "fn": "uriEncode", + "argv": [ + "{Input}" + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "fallback when no tests match", + "conditions": [], + "error": "No tests matched", + "type": "error" + } + ] +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "uriEncode when the string has nothing to encode returns the input", + "params": { + "TestCaseId": "1", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `abcdefg`" + } + }, + { + "documentation": "uriEncode with single character to encode encodes only that character", + "params": { + "TestCaseId": "1", + "Input": "abc:defg" + }, + "expect": { + "error": "The value is: `abc%3Adefg`" + } + }, + { + "documentation": "uriEncode with all ASCII characters to encode encodes all characters", + "params": { + "TestCaseId": "1", + "Input": "/:,?#[]{}|@! $&'()*+;=%<>\"^`\\" + }, + "expect": { + "error": "The value is: `%2F%3A%2C%3F%23%5B%5D%7B%7D%7C%40%21%20%24%26%27%28%29%2A%2B%3B%3D%25%3C%3E%22%5E%60%5C`" + } + }, + { + "documentation": "uriEncode with ASCII characters that should not be encoded returns the input", + "params": { + "TestCaseId": "1", + "Input": "0123456789.underscore_dash-Tilda~" + }, + "expect": { + "error": "The value is: `0123456789.underscore_dash-Tilda~`" + } + }, + { + "documentation": "uriEncode encodes unicode characters", + "params": { + "TestCaseId": "1", + "Input": "\ud83d\ude39" + }, + "expect": { + "error": "The value is: `%F0%9F%98%B9`" + } + }, + { + "documentation": "uriEncode on all printable ASCII characters", + "params": { + "TestCaseId": "1", + "Input": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" + }, + "expect": { + "error": "The value is: `%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~`" + } + }, + { + "documentation": "uriEncode on an empty string", + "params": { + "TestCaseId": "1", + "Input": "" + }, + "expect": { + "error": "The value is: ``" + } + } + ] +) +@clientContextParams( + TestCaseId: {type: "string", documentation: "Test case id used to select the test case to use"}, + Input: {type: "string", documentation: "The input used to test uriEncoder"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy new file mode 100644 index 00000000000..1e951294ea7 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy @@ -0,0 +1,122 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "required": true, + "documentation": "The region to dispatch this request, eg. `us-east-1`." + } + }, + "rules": [ + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com" + }, + "type": "endpoint" + }, + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{Region}-subdomains.amazonaws.com" + }, + "type": "endpoint" + }, + { + "documentation": "Region was not a valid host label", + "conditions": [], + "error": "Invalid hostlabel", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "standard region is a valid hostlabel", + "params": { + "Region": "us-east-1" + }, + "expect": { + "endpoint": { + "url": "https://us-east-1.amazonaws.com" + } + } + }, + { + "documentation": "starting with a number is a valid hostlabel", + "params": { + "Region": "3aws4" + }, + "expect": { + "endpoint": { + "url": "https://3aws4.amazonaws.com" + } + } + }, + { + "documentation": "when there are dots, only match if subdomains are allowed", + "params": { + "Region": "part1.part2" + }, + "expect": { + "endpoint": { + "url": "https://part1.part2-subdomains.amazonaws.com" + } + } + }, + { + "documentation": "a space is never a valid hostlabel", + "params": { + "Region": "part1 part2" + }, + "expect": { + "error": "Invalid hostlabel" + } + }, + { + "documentation": "an empty string is not a valid hostlabel", + "params": { + "Region": "" + }, + "expect": { + "error": "Invalid hostlabel" + } + } + ] +) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy new file mode 100644 index 00000000000..776d3ba7fe0 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy @@ -0,0 +1,73 @@ +$version: "1.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#contextParam +use smithy.rules#endpointRuleSet +use smithy.rules#staticContextParams + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Region": { + "type": "string", + "documentation": "docs" + }, + "ParameterFoo": { + "type": "string", + "documentation": "docs" + }, + "ParameterBar": { + "type": "string", + "documentation": "docs" + }, + "ExtraParameter": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "stub rule", + "conditions": [ ], + "endpoint": { + "url": "https://example.com" + }, + "type": "endpoint" + }, + ] +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz { + operations: [GetResource, GetAnotherResource] +} + +@staticContextParams( + "ParameterFoo": {value: "foo"}, + "ExtraParameter": {value: "someValue"} +) +operation GetResource { + input: GetResourceInput +} + +structure GetResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +@staticContextParams( + "ParameterFoo": {value: "bar"} +) +operation GetAnotherResource { + input: GetAnotherResourceInput +} + +structure GetAnotherResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +string ResourceId diff --git a/codegen-client/src/test/resources/META-INF/smithy/manif3st b/codegen-client/src/test/resources/META-INF/smithy/manif3st new file mode 100644 index 00000000000..b8f6d1fb488 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/manif3st @@ -0,0 +1,11 @@ +endpoint-tests/default-values.smithy +endpoint-tests/deprecated-param.smithy +endpoint-tests/duplicate-param.smithy +endpoint-tests/get-attr-type-inference.smithy +endpoint-tests/headers.smithy +endpoint-tests/minimal-ruleset.smithy +endpoint-tests/parse-url.smithy +endpoint-tests/substring.smithy +endpoint-tests/uri-encode.smithy +endpoint-tests/valid-hostlabel.smithy +endpoint-tests/valid-model.smithy diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index d946ab0b5db..7002e305e41 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -351,96 +351,3 @@ structure EmptyStructWithContentOnWireOpOutput { operation EmptyStructWithContentOnWireOp { output: EmptyStructWithContentOnWireOpOutput, } - -// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them -// They're being added in https://github.com/smithy-lang/smithy/pull/1908 - -/// This examples serializes a union in the payload. -@idempotent -@http(uri: "/HttpPayloadWithUnion", method: "PUT") -operation HttpPayloadWithUnion { - input: HttpPayloadWithUnionInputOutput, - output: HttpPayloadWithUnionInputOutput -} - -structure HttpPayloadWithUnionInputOutput { - @httpPayload - nested: UnionPayload, -} - -union UnionPayload { - greeting: String -} - -apply HttpPayloadWithUnion @httpRequestTests([ - { - id: "RestJsonHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restJson1, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: """ - { - "greeting": "hello" - }""", - bodyMediaType: "application/json", - headers: { - "Content-Type": "application/json" - }, - requireHeaders: [ - "Content-Length" - ], - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestJsonHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restJson1, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: "", - headers: { - "Content-Type": "application/json", - "Content-Length": "0" - }, - params: {} - } -]) - -apply HttpPayloadWithUnion @httpResponseTests([ - { - id: "RestJsonHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restJson1, - code: 200, - body: """ - { - "greeting": "hello" - }""", - bodyMediaType: "application/json", - headers: { - "Content-Type": "application/json" - }, - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestJsonHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restJson1, - code: 200, - body: "", - headers: { - "Content-Type": "application/json", - "Content-Length": "0" - }, - params: {} - } -]) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index b80f211c766..1108e774750 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -132,9 +132,13 @@ fun testRustSettings( ) private const val SmithyVersion = "1.0" -fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = SmithyVersion): Model { +fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = SmithyVersion, disableValidation: Boolean = false): Model { val processed = letIf(!this.trimStart().startsWith("\$version")) { "\$version: ${smithyVersion.dq()}\n$it" } - return Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed).assemble() + val assembler = Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed) + if (disableValidation) { + assembler.disableValidation() + } + return assembler.assemble() .unwrap() } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index ee0038e53c6..d78df801121 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -770,6 +770,7 @@ class ServerProtocolTestGenerator( FailingTest("com.amazonaws.s3#AmazonS3", "S3VirtualHostAccelerateAddressing", TestType.Request), FailingTest("com.amazonaws.s3#AmazonS3", "S3VirtualHostDualstackAccelerateAddressing", TestType.Request), FailingTest("com.amazonaws.s3#AmazonS3", "S3OperationAddressingPreferred", TestType.Request), + FailingTest("com.amazonaws.s3#AmazonS3", "S3OperationNoErrorWrappingResponse", TestType.Response), // AwsJson1.0 failing tests. FailingTest("aws.protocoltests.json10#JsonRpc10", "AwsJson10EndpointTraitWithHostLabel", TestType.Request), diff --git a/design/src/rfcs/rfc0027_endpoints_20.md b/design/src/rfcs/rfc0027_endpoints_20.md index 90739d347bb..b936c07aadc 100644 --- a/design/src/rfcs/rfc0027_endpoints_20.md +++ b/design/src/rfcs/rfc0027_endpoints_20.md @@ -474,7 +474,7 @@ class EndpointParamsDecorator( #### Loading values for builtIns The fundamental point of builtIn values is enabling _other_ code generators to define where these values come from. -Because of that, we will need to expose the ability to customize builtIns. One way to do this is with a new +Because of that, we will need to expose the ability to customize AwsBuiltIns. One way to do this is with a new customization type, `EndpointCustomization`: ```kotlin diff --git a/gradle.properties b/gradle.properties index de21435a169..1db16fc661d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ kotlin.code.style=official # codegen smithyGradlePluginVersion=0.7.0 -smithyVersion=1.35.0 +smithyVersion=1.39.0 # kotlin kotlinVersion=1.7.21 diff --git a/settings.gradle.kts b/settings.gradle.kts index 6c920d72174..d168d72c0d2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -29,7 +29,7 @@ pluginManagement { buildscript { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } From 673e385c732933030769d6c5980c8460235e5241 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:17:55 +0100 Subject: [PATCH 134/331] Add injection hook for structures in no service (#3001) ## Motivation and Context This change will allow to render structures in no service closures with a decorator. ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Signed-off-by: Daniele Ahmed --- .../server/smithy/ServerCodegenVisitor.kt | 4 ++++ .../smithy/customize/ServerCodegenDecorator.kt | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index 156cc455eb2..c8dc16cafd1 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -621,6 +621,7 @@ open class ServerCodegenVisitor( * - Operations ser/de * - Errors via `ServerOperationErrorGenerator` * - OperationShapes via `ServerOperationGenerator` + * - Additional structure shapes via `postprocessGenerateAdditionalStructures` */ override fun operationShape(shape: OperationShape) { // Generate errors. @@ -637,6 +638,9 @@ open class ServerCodegenVisitor( rustCrate.withModule(ServerRustModule.Operation) { protocolGenerator.renderOperation(this, shape) } + + codegenDecorator.postprocessGenerateAdditionalStructures(shape) + .forEach { structureShape -> this.structureShape(structureShape) } } override fun blobShape(shape: BlobShape) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt index 2522024efcb..06f9c3c09be 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt @@ -6,7 +6,9 @@ package software.amazon.smithy.rust.codegen.server.smithy.customize import software.amazon.smithy.build.PluginContext +import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.smithy.customize.CombinedCoreCodegenDecorator import software.amazon.smithy.rust.codegen.core.smithy.customize.CoreCodegenDecorator import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap @@ -31,6 +33,14 @@ interface ServerCodegenDecorator : CoreCodegenDecorator = emptyList() } /** @@ -38,7 +48,7 @@ interface ServerCodegenDecorator : CoreCodegenDecorator) : +class CombinedServerCodegenDecorator(decorators: List) : CombinedCoreCodegenDecorator(decorators), ServerCodegenDecorator { @@ -64,6 +74,11 @@ class CombinedServerCodegenDecorator(private val decorators: List { + return orderedDecorators.map { decorator -> decorator.postprocessGenerateAdditionalStructures(operationShape) } + .flatten() + } + companion object { fun fromClasspath( context: PluginContext, From 75fc85f6ea443af4fcf2604d7db00d89ac5c83b3 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 27 Sep 2023 16:14:40 -0500 Subject: [PATCH 135/331] Remove `futures_core::stream::Stream` from `aws-smithy-async` (#2978) ## Motivation and Context Removes `futures_core::stream::Stream` from the `aws-smithy-async` crate. ## Description This PR is part of our ongoing effort, https://github.com/awslabs/smithy-rs/issues/2413. We remove the `futures_core::stream::Stream` trait from the public API in the `aws-smithy-async` crate. While doing so, we compensate - `FnStream` by providing the explicit `.next` and `.collect` methods to let the previously working code continue working. - `TryFlatMap` by making it return a new-type wrapper `PaginationStream` to hide `FnStream` from those who use paginators. With this change, the latest canary no longer uses `tokio_stream::StreamExt`, since the paginator does not work in terms of the `Stream` trait. Furthermore, `aws-sdk-rust` has been more than [3 releases since release-2023-01-26](https://github.com/awslabs/aws-sdk-rust/releases), so the module `release-2023-01-26` has been removed from `canary-lambda`. ## Testing No new tests added, but made sure the existing tests keep working with the change. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 + .../dynamodb/tests/paginators.rs | 2 - .../integration-tests/ec2/tests/paginators.rs | 2 - .../smithy/generators/PaginatorGenerator.kt | 20 +- .../client/FluentClientGenerator.kt | 2 +- rust-runtime/aws-smithy-async/Cargo.toml | 7 +- .../aws-smithy-async/external-types.toml | 3 - .../aws-smithy-async/src/future/fn_stream.rs | 297 ----------------- .../aws-smithy-async/src/future/mod.rs | 2 +- .../src/future/pagination_stream.rs | 302 ++++++++++++++++++ .../src/future/pagination_stream/collect.rs | 75 +++++ .../src/future/pagination_stream/fn_stream.rs | 124 +++++++ .../aws-smithy-async/src/future/rendezvous.rs | 22 +- .../src/latest/paginator_canary.rs | 1 - tools/ci-cdk/canary-lambda/src/main.rs | 10 +- ...se_2023_01_26.rs => release_2023_08_23.rs} | 0 .../paginator_canary.rs | 6 +- .../s3_canary.rs | 4 +- .../transcribe_canary.rs | 4 +- .../ci-cdk/canary-runner/src/build_bundle.rs | 100 +++--- 20 files changed, 605 insertions(+), 390 deletions(-) delete mode 100644 rust-runtime/aws-smithy-async/src/future/fn_stream.rs create mode 100644 rust-runtime/aws-smithy-async/src/future/pagination_stream.rs create mode 100644 rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs create mode 100644 rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs rename tools/ci-cdk/canary-lambda/src/{release_2023_01_26.rs => release_2023_08_23.rs} (100%) rename tools/ci-cdk/canary-lambda/src/{release_2023_01_26 => release_2023_08_23}/paginator_canary.rs (92%) rename tools/ci-cdk/canary-lambda/src/{release_2023_01_26 => release_2023_08_23}/s3_canary.rs (98%) rename tools/ci-cdk/canary-lambda/src/{release_2023_01_26 => release_2023_08_23}/transcribe_canary.rs (97%) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index afb23e80293..bffedc818e6 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -183,3 +183,15 @@ message = "Produce better docs when items are marked @required" references = ["smithy-rs#2996"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "rcoh" + +[[aws-sdk-rust]] +message = "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`." +references = ["smithy-rs#2978"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "ysaito1001" + +[[smithy-rs]] +message = "The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`." +references = ["smithy-rs#2978"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs index 807a11890de..a3d0c624735 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs @@ -6,8 +6,6 @@ use std::collections::HashMap; use std::iter::FromIterator; -use tokio_stream::StreamExt; - use aws_credential_types::Credentials; use aws_sdk_dynamodb::types::AttributeValue; use aws_sdk_dynamodb::{Client, Config}; diff --git a/aws/sdk/integration-tests/ec2/tests/paginators.rs b/aws/sdk/integration-tests/ec2/tests/paginators.rs index 83528f2075e..d070971a4fc 100644 --- a/aws/sdk/integration-tests/ec2/tests/paginators.rs +++ b/aws/sdk/integration-tests/ec2/tests/paginators.rs @@ -3,8 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use tokio_stream::StreamExt; - use aws_sdk_ec2::{config::Credentials, config::Region, types::InstanceType, Client, Config}; use aws_smithy_client::http_connector::HttpConnector; use aws_smithy_client::test_connection::TestConnection; diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index dedc50f31f8..6f9892b2cc8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -90,7 +90,7 @@ class PaginatorGenerator private constructor( "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), "client" to RuntimeType.smithyClient(runtimeConfig), - "fn_stream" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::fn_stream"), + "pagination_stream" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::pagination_stream"), // External Types "Stream" to RuntimeType.TokioStream.resolve("Stream"), @@ -141,13 +141,14 @@ class PaginatorGenerator private constructor( /// Create the pagination stream /// - /// _Note:_ No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next)). - pub fn send(self) -> impl #{Stream} + #{Unpin} { + /// _Note:_ No requests will be dispatched until the stream is used + /// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method). + pub fn send(self) -> #{pagination_stream}::PaginationStream<#{item_type}> { // Move individual fields out of self for the borrow checker let builder = self.builder; let handle = self.handle; #{runtime_plugin_init} - #{fn_stream}::FnStream::new(move |tx| #{Box}::pin(async move { + #{pagination_stream}::PaginationStream::new(#{pagination_stream}::fn_stream::FnStream::new(move |tx| #{Box}::pin(async move { // Build the input for the first time. If required fields are missing, this is where we'll produce an early error. let mut input = match builder.build().map_err(#{SdkError}::construction_failure) { #{Ok}(input) => input, @@ -177,7 +178,7 @@ class PaginatorGenerator private constructor( return } } - })) + }))) } } """, @@ -257,11 +258,12 @@ class PaginatorGenerator private constructor( impl ${paginatorName}Items { /// Create the pagination stream /// - /// _Note: No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next))._ + /// _Note_: No requests will be dispatched until the stream is used + /// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method). /// - /// To read the entirety of the paginator, use [`.collect::, _>()`](tokio_stream::StreamExt::collect). - pub fn send(self) -> impl #{Stream} + #{Unpin} { - #{fn_stream}::TryFlatMap::new(self.0.send()).flat_map(|page| #{extract_items}(page).unwrap_or_default().into_iter()) + /// To read the entirety of the paginator, use [`.collect::, _>()`](aws_smithy_async::future::pagination_stream::PaginationStream::collect). + pub fn send(self) -> #{pagination_stream}::PaginationStream<#{item_type}> { + #{pagination_stream}::TryFlatMap::new(self.0.send()).flat_map(|page| #{extract_items}(page).unwrap_or_default().into_iter()) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index cd50393a92e..614d89bd488 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -433,7 +433,7 @@ class FluentClientGenerator( """ /// Create a paginator for this request /// - /// Paginators are used by calling [`send().await`](#{Paginator}::send) which returns a `Stream`. + /// Paginators are used by calling [`send().await`](#{Paginator}::send) which returns a [`PaginationStream`](aws_smithy_async::future::pagination_stream::PaginationStream). pub fn into_paginator(self) -> #{Paginator} { #{Paginator}::new(self.handle, self.inner) } diff --git a/rust-runtime/aws-smithy-async/Cargo.toml b/rust-runtime/aws-smithy-async/Cargo.toml index c95862d9ffc..fd51b4fb1e5 100644 --- a/rust-runtime/aws-smithy-async/Cargo.toml +++ b/rust-runtime/aws-smithy-async/Cargo.toml @@ -14,13 +14,18 @@ test-util = [] [dependencies] pin-project-lite = "0.2" tokio = { version = "1.23.1", features = ["sync"] } -tokio-stream = { version = "0.1.5", default-features = false } futures-util = { version = "0.3.16", default-features = false } [dev-dependencies] +pin-utils = "0.1" tokio = { version = "1.23.1", features = ["rt", "macros", "test-util"] } tokio-test = "0.4.2" +# futures-util is used by `now_or_later`, for instance, but the tooling +# reports a false positive, saying it is unused. +[package.metadata.cargo-udeps.ignore] +normal = ["futures-util"] + [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/rust-runtime/aws-smithy-async/external-types.toml b/rust-runtime/aws-smithy-async/external-types.toml index 424f7dc1db2..464456a2dca 100644 --- a/rust-runtime/aws-smithy-async/external-types.toml +++ b/rust-runtime/aws-smithy-async/external-types.toml @@ -2,7 +2,4 @@ allowed_external_types = [ "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized - "futures_core::stream::Stream", ] diff --git a/rust-runtime/aws-smithy-async/src/future/fn_stream.rs b/rust-runtime/aws-smithy-async/src/future/fn_stream.rs deleted file mode 100644 index 804b08f6bbf..00000000000 --- a/rust-runtime/aws-smithy-async/src/future/fn_stream.rs +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Utility to drive a stream with an async function and a channel. - -use crate::future::rendezvous; -use futures_util::StreamExt; -use pin_project_lite::pin_project; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tokio_stream::{Iter, Once, Stream}; - -pin_project! { - /// Utility to drive a stream with an async function and a channel. - /// - /// The closure is passed a reference to a `Sender` which acts as a rendezvous channel. Messages - /// sent to the sender will be emitted to the stream. Because the stream is 1-bounded, the function - /// will not proceed until the stream is read. - /// - /// This utility is used by generated paginators to generate a stream of paginated results. - /// - /// If `tx.send` returns an error, the function MUST return immediately. - /// - /// # Examples - /// ```no_run - /// use tokio_stream::StreamExt; - /// # async fn docs() { - /// use aws_smithy_async::future::fn_stream::FnStream; - /// let stream = FnStream::new(|tx| Box::pin(async move { - /// if let Err(_) = tx.send("Hello!").await { - /// return; - /// } - /// if let Err(_) = tx.send("Goodbye!").await { - /// return; - /// } - /// })); - /// assert_eq!(stream.collect::>().await, vec!["Hello!", "Goodbye!"]); - /// # } - pub struct FnStream { - #[pin] - rx: rendezvous::Receiver, - #[pin] - generator: Option, - } -} - -impl FnStream { - /// Creates a new function based stream driven by `generator`. - /// - /// For examples, see the documentation for [`FnStream`] - pub fn new(generator: T) -> Self - where - T: FnOnce(rendezvous::Sender) -> F, - { - let (tx, rx) = rendezvous::channel::(); - Self { - rx, - generator: Some(generator(tx)), - } - } -} - -impl Stream for FnStream -where - F: Future, -{ - type Item = Item; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let mut me = self.project(); - match me.rx.poll_recv(cx) { - Poll::Ready(item) => Poll::Ready(item), - Poll::Pending => { - if let Some(generator) = me.generator.as_mut().as_pin_mut() { - if generator.poll(cx).is_ready() { - // if the generator returned ready we MUST NOT poll it again—doing so - // will cause a panic. - me.generator.set(None); - } - } - Poll::Pending - } - } - } -} - -/// Utility wrapper to flatten paginated results -/// -/// When flattening paginated results, it's most convenient to produce an iterator where the `Result` -/// is present in each item. This provides `items()` which can wrap an stream of `Result` -/// and produce a stream of `Result`. -#[derive(Debug)] -pub struct TryFlatMap(I); - -impl TryFlatMap { - /// Create a `TryFlatMap` that wraps the input - pub fn new(i: I) -> Self { - Self(i) - } - - /// Produce a new [`Stream`] by mapping this stream with `map` then flattening the result - pub fn flat_map(self, map: M) -> impl Stream> - where - I: Stream>, - M: Fn(Page) -> Iter, - Iter: IntoIterator, - { - self.0.flat_map(move |page| match page { - Ok(page) => OnceOrMany::Many { - many: tokio_stream::iter(map(page).into_iter().map(Ok)), - }, - Err(e) => OnceOrMany::Once { - once: tokio_stream::once(Err(e)), - }, - }) - } -} - -pin_project! { - /// Helper enum to to support returning `Once` and `Iter` from `Items::items` - #[project = OnceOrManyProj] - enum OnceOrMany { - Many { #[pin] many: Iter }, - Once { #[pin] once: Once }, - } -} - -impl Stream for OnceOrMany -where - Iter: Iterator, -{ - type Item = Item; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let me = self.project(); - match me { - OnceOrManyProj::Many { many } => many.poll_next(cx), - OnceOrManyProj::Once { once } => once.poll_next(cx), - } - } -} - -#[cfg(test)] -mod test { - use crate::future::fn_stream::{FnStream, TryFlatMap}; - use std::sync::{Arc, Mutex}; - use std::time::Duration; - use tokio_stream::StreamExt; - - /// basic test of FnStream functionality - #[tokio::test] - async fn fn_stream_returns_results() { - tokio::time::pause(); - let mut stream = FnStream::new(|tx| { - Box::pin(async move { - tx.send("1").await.expect("failed to send"); - tokio::time::sleep(Duration::from_secs(1)).await; - tokio::time::sleep(Duration::from_secs(1)).await; - tx.send("2").await.expect("failed to send"); - tokio::time::sleep(Duration::from_secs(1)).await; - tx.send("3").await.expect("failed to send"); - }) - }); - let mut out = vec![]; - while let Some(value) = stream.next().await { - out.push(value); - } - assert_eq!(out, vec!["1", "2", "3"]); - } - - // smithy-rs#1902: there was a bug where we could continue to poll the generator after it - // had returned Poll::Ready. This test case leaks the tx half so that the channel stays open - // but the send side generator completes. By calling `poll` multiple times on the resulting future, - // we can trigger the bug and validate the fix. - #[tokio::test] - async fn fn_stream_doesnt_poll_after_done() { - let mut stream = FnStream::new(|tx| { - Box::pin(async move { - assert!(tx.send("blah").await.is_ok()); - Box::leak(Box::new(tx)); - }) - }); - assert_eq!(stream.next().await, Some("blah")); - let mut test_stream = tokio_test::task::spawn(stream); - assert!(test_stream.poll_next().is_pending()); - assert!(test_stream.poll_next().is_pending()); - } - - /// Tests that the generator will not advance until demand exists - #[tokio::test] - async fn waits_for_reader() { - let progress = Arc::new(Mutex::new(0)); - let mut stream = FnStream::new(|tx| { - let progress = progress.clone(); - Box::pin(async move { - *progress.lock().unwrap() = 1; - tx.send("1").await.expect("failed to send"); - *progress.lock().unwrap() = 2; - tx.send("2").await.expect("failed to send"); - *progress.lock().unwrap() = 3; - tx.send("3").await.expect("failed to send"); - *progress.lock().unwrap() = 4; - }) - }); - assert_eq!(*progress.lock().unwrap(), 0); - stream.next().await.expect("ready"); - assert_eq!(*progress.lock().unwrap(), 1); - - assert_eq!(stream.next().await.expect("ready"), "2"); - assert_eq!(*progress.lock().unwrap(), 2); - - let _ = stream.next().await.expect("ready"); - assert_eq!(*progress.lock().unwrap(), 3); - assert_eq!(stream.next().await, None); - assert_eq!(*progress.lock().unwrap(), 4); - } - - #[tokio::test] - async fn generator_with_errors() { - let mut stream = FnStream::new(|tx| { - Box::pin(async move { - for i in 0..5 { - if i != 2 { - if tx.send(Ok(i)).await.is_err() { - return; - } - } else { - tx.send(Err(i)).await.unwrap(); - return; - } - } - }) - }); - let mut out = vec![]; - while let Some(Ok(value)) = stream.next().await { - out.push(value); - } - assert_eq!(out, vec![0, 1]); - } - - #[tokio::test] - async fn flatten_items_ok() { - #[derive(Debug)] - struct Output { - items: Vec, - } - let stream = FnStream::new(|tx| { - Box::pin(async move { - tx.send(Ok(Output { - items: vec![1, 2, 3], - })) - .await - .unwrap(); - tx.send(Ok(Output { - items: vec![4, 5, 6], - })) - .await - .unwrap(); - }) - }); - assert_eq!( - TryFlatMap(stream) - .flat_map(|output| output.items.into_iter()) - .collect::, &str>>() - .await, - Ok(vec![1, 2, 3, 4, 5, 6]) - ) - } - - #[tokio::test] - async fn flatten_items_error() { - #[derive(Debug)] - struct Output { - items: Vec, - } - let stream = FnStream::new(|tx| { - Box::pin(async move { - tx.send(Ok(Output { - items: vec![1, 2, 3], - })) - .await - .unwrap(); - tx.send(Err("bummer")).await.unwrap(); - }) - }); - assert_eq!( - TryFlatMap(stream) - .flat_map(|output| output.items.into_iter()) - .collect::, &str>>() - .await, - Err("bummer") - ) - } -} diff --git a/rust-runtime/aws-smithy-async/src/future/mod.rs b/rust-runtime/aws-smithy-async/src/future/mod.rs index 1e99bdc3044..44894e07338 100644 --- a/rust-runtime/aws-smithy-async/src/future/mod.rs +++ b/rust-runtime/aws-smithy-async/src/future/mod.rs @@ -5,8 +5,8 @@ //! Useful runtime-agnostic future implementations. -pub mod fn_stream; pub mod never; pub mod now_or_later; +pub mod pagination_stream; pub mod rendezvous; pub mod timeout; diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs new file mode 100644 index 00000000000..f263685b49a --- /dev/null +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs @@ -0,0 +1,302 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Provides types to support stream-like operations for paginators. + +use crate::future::pagination_stream::collect::sealed::Collectable; +use std::future::Future; +use std::pin::Pin; +pub mod collect; +pub mod fn_stream; +use fn_stream::FnStream; + +/// Stream specifically made to support paginators. +/// +/// `PaginationStream` provides two primary mechanisms for accessing stream of data. +/// 1. With [`.next()`](PaginationStream::next) (or [`try_next()`](PaginationStream::try_next)): +/// +/// ```no_run +/// # async fn docs() { +/// # use aws_smithy_async::future::pagination_stream::PaginationStream; +/// # fn operation_to_yield_paginator() -> PaginationStream { +/// # todo!() +/// # } +/// # struct Page; +/// let mut stream: PaginationStream = operation_to_yield_paginator(); +/// while let Some(page) = stream.next().await { +/// // process `page` +/// } +/// # } +/// ``` +/// 2. With [`.collect()`](PaginationStream::collect) (or [`try_collect()`](PaginationStream::try_collect)): +/// +/// ```no_run +/// # async fn docs() { +/// # use aws_smithy_async::future::pagination_stream::PaginationStream; +/// # fn operation_to_yield_paginator() -> PaginationStream { +/// # todo!() +/// # } +/// # struct Page; +/// let mut stream: PaginationStream = operation_to_yield_paginator(); +/// let result = stream.collect::>().await; +/// # } +/// ``` +/// +/// [`PaginationStream`] is implemented in terms of [`FnStream`], but the latter is meant to be +/// used internally and not by external users. +#[derive(Debug)] +pub struct PaginationStream(FnStream); + +impl PaginationStream { + /// Creates a `PaginationStream` from the given [`FnStream`]. + pub fn new(stream: FnStream) -> Self { + Self(stream) + } + + /// Consumes and returns the next `Item` from this stream. + pub async fn next(&mut self) -> Option { + self.0.next().await + } + + /// Consumes this stream and gathers elements into a collection. + pub async fn collect>(self) -> T { + self.0.collect().await + } +} + +impl PaginationStream> { + /// Yields the next item in the stream or returns an error if an error is encountered. + pub async fn try_next(&mut self) -> Result, E> { + self.next().await.transpose() + } + + /// Convenience method for `.collect::, _>()`. + pub async fn try_collect(self) -> Result, E> { + self.collect::, E>>().await + } +} + +/// Utility wrapper to flatten paginated results +/// +/// When flattening paginated results, it's most convenient to produce an iterator where the `Result` +/// is present in each item. This provides `items()` which can wrap an stream of `Result` +/// and produce a stream of `Result`. +#[derive(Debug)] +pub struct TryFlatMap(PaginationStream>); + +impl TryFlatMap { + /// Creates a `TryFlatMap` that wraps the input. + pub fn new(stream: PaginationStream>) -> Self { + Self(stream) + } + + /// Produces a new [`PaginationStream`] by mapping this stream with `map` then flattening the result. + pub fn flat_map(mut self, map: M) -> PaginationStream> + where + Page: Send + 'static, + Err: Send + 'static, + M: Fn(Page) -> Iter + Send + 'static, + Item: Send + 'static, + Iter: IntoIterator + Send, + ::IntoIter: Send, + { + PaginationStream::new(FnStream::new(|tx| { + Box::pin(async move { + while let Some(page) = self.0.next().await { + match page { + Ok(page) => { + let mapped = map(page); + for item in mapped.into_iter() { + let _ = tx.send(Ok(item)).await; + } + } + Err(e) => { + let _ = tx.send(Err(e)).await; + break; + } + } + } + }) as Pin + Send>> + })) + } +} + +#[cfg(test)] +mod test { + use crate::future::pagination_stream::{FnStream, PaginationStream, TryFlatMap}; + use std::sync::{Arc, Mutex}; + use std::time::Duration; + + /// basic test of FnStream functionality + #[tokio::test] + async fn fn_stream_returns_results() { + tokio::time::pause(); + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + tx.send("1").await.expect("failed to send"); + tokio::time::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_secs(1)).await; + tx.send("2").await.expect("failed to send"); + tokio::time::sleep(Duration::from_secs(1)).await; + tx.send("3").await.expect("failed to send"); + }) + }); + let mut out = vec![]; + while let Some(value) = stream.next().await { + out.push(value); + } + assert_eq!(vec!["1", "2", "3"], out); + } + + #[tokio::test] + async fn fn_stream_try_next() { + tokio::time::pause(); + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + tx.send(Ok(1)).await.unwrap(); + tx.send(Ok(2)).await.unwrap(); + tx.send(Err("err")).await.unwrap(); + }) + }); + let mut out = vec![]; + while let Ok(value) = stream.try_next().await { + out.push(value); + } + assert_eq!(vec![Some(1), Some(2)], out); + } + + // smithy-rs#1902: there was a bug where we could continue to poll the generator after it + // had returned Poll::Ready. This test case leaks the tx half so that the channel stays open + // but the send side generator completes. By calling `poll` multiple times on the resulting future, + // we can trigger the bug and validate the fix. + #[tokio::test] + async fn fn_stream_doesnt_poll_after_done() { + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + assert!(tx.send("blah").await.is_ok()); + Box::leak(Box::new(tx)); + }) + }); + assert_eq!(Some("blah"), stream.next().await); + let mut test_stream = tokio_test::task::spawn(stream); + // `tokio_test::task::Spawn::poll_next` can only be invoked when the wrapped + // type implements the `Stream` trait. Here, `FnStream` does not implement it, + // so we work around it by using the `enter` method. + let _ = test_stream.enter(|ctx, pin| { + let polled = pin.poll_next(ctx); + assert!(polled.is_pending()); + }); + let _ = test_stream.enter(|ctx, pin| { + let polled = pin.poll_next(ctx); + assert!(polled.is_pending()); + }); + } + + /// Tests that the generator will not advance until demand exists + #[tokio::test] + async fn waits_for_reader() { + let progress = Arc::new(Mutex::new(0)); + let mut stream = FnStream::new(|tx| { + let progress = progress.clone(); + Box::pin(async move { + *progress.lock().unwrap() = 1; + tx.send("1").await.expect("failed to send"); + *progress.lock().unwrap() = 2; + tx.send("2").await.expect("failed to send"); + *progress.lock().unwrap() = 3; + tx.send("3").await.expect("failed to send"); + *progress.lock().unwrap() = 4; + }) + }); + assert_eq!(*progress.lock().unwrap(), 0); + stream.next().await.expect("ready"); + assert_eq!(*progress.lock().unwrap(), 1); + + assert_eq!("2", stream.next().await.expect("ready")); + assert_eq!(2, *progress.lock().unwrap()); + + let _ = stream.next().await.expect("ready"); + assert_eq!(3, *progress.lock().unwrap()); + assert_eq!(None, stream.next().await); + assert_eq!(4, *progress.lock().unwrap()); + } + + #[tokio::test] + async fn generator_with_errors() { + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + for i in 0..5 { + if i != 2 { + if tx.send(Ok(i)).await.is_err() { + return; + } + } else { + tx.send(Err(i)).await.unwrap(); + return; + } + } + }) + }); + let mut out = vec![]; + while let Some(Ok(value)) = stream.next().await { + out.push(value); + } + assert_eq!(vec![0, 1], out); + } + + #[tokio::test] + async fn flatten_items_ok() { + #[derive(Debug)] + struct Output { + items: Vec, + } + let stream: FnStream> = FnStream::new(|tx| { + Box::pin(async move { + tx.send(Ok(Output { + items: vec![1, 2, 3], + })) + .await + .unwrap(); + tx.send(Ok(Output { + items: vec![4, 5, 6], + })) + .await + .unwrap(); + }) + }); + assert_eq!( + Ok(vec![1, 2, 3, 4, 5, 6]), + TryFlatMap::new(PaginationStream::new(stream)) + .flat_map(|output| output.items.into_iter()) + .try_collect() + .await, + ); + } + + #[tokio::test] + async fn flatten_items_error() { + #[derive(Debug)] + struct Output { + items: Vec, + } + let stream = FnStream::new(|tx| { + Box::pin(async move { + tx.send(Ok(Output { + items: vec![1, 2, 3], + })) + .await + .unwrap(); + tx.send(Err("bummer")).await.unwrap(); + }) + }); + assert_eq!( + Err("bummer"), + TryFlatMap::new(PaginationStream::new(stream)) + .flat_map(|output| output.items.into_iter()) + .try_collect() + .await + ) + } +} diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs new file mode 100644 index 00000000000..1a6fcfbf9ad --- /dev/null +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs @@ -0,0 +1,75 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Module to extend the functionality of types in `patination_stream` module to allow for +//! collecting elements of the stream into collection. +//! +//! Majority of the code is borrowed from +//! + +pub(crate) mod sealed { + /// A trait that signifies that elements can be collected into `T`. + /// + /// Currently the trait may not be implemented by clients so we can make changes in the future + /// without breaking code depending on it. + #[doc(hidden)] + pub trait Collectable { + type Collection; + + fn initialize() -> Self::Collection; + + fn extend(collection: &mut Self::Collection, item: T) -> bool; + + fn finalize(collection: Self::Collection) -> Self; + } +} + +impl sealed::Collectable for Vec { + type Collection = Self; + + fn initialize() -> Self::Collection { + Vec::default() + } + + fn extend(collection: &mut Self::Collection, item: T) -> bool { + collection.push(item); + true + } + + fn finalize(collection: Self::Collection) -> Self { + collection + } +} + +impl sealed::Collectable> for Result +where + U: sealed::Collectable, +{ + type Collection = Result; + + fn initialize() -> Self::Collection { + Ok(U::initialize()) + } + + fn extend(collection: &mut Self::Collection, item: Result) -> bool { + match item { + Ok(item) => { + let collection = collection.as_mut().ok().expect("invalid state"); + U::extend(collection, item) + } + Err(e) => { + *collection = Err(e); + false + } + } + } + + fn finalize(collection: Self::Collection) -> Self { + match collection { + Ok(collection) => Ok(U::finalize(collection)), + err @ Err(_) => Err(err.map(drop).unwrap_err()), + } + } +} diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs new file mode 100644 index 00000000000..260bfb9e870 --- /dev/null +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs @@ -0,0 +1,124 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Module to define utility to drive a stream with an async function and a channel. + +use crate::future::pagination_stream::collect::sealed::Collectable; +use crate::future::rendezvous; +use pin_project_lite::pin_project; +use std::fmt; +use std::future::poll_fn; +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; + +pin_project! { + /// The closure is passed a reference to a `Sender` which acts as a rendezvous channel. Messages + /// sent to the sender will be emitted to the stream. Because the stream is 1-bounded, the function + /// will not proceed until the stream is read. + /// + /// This utility is used by generated paginators to generate a stream of paginated results. + /// + /// If `tx.send` returns an error, the function MUST return immediately. + /// + /// Note `FnStream` is only `Send` but not `Sync` because `generator` is a boxed future that + /// is `Send` and returns `()` as output when it is done. + /// + /// # Examples + /// ```no_run + /// # async fn docs() { + /// use aws_smithy_async::future::pagination_stream::fn_stream::FnStream; + /// let mut stream = FnStream::new(|tx| Box::pin(async move { + /// if let Err(_) = tx.send("Hello!").await { + /// return; + /// } + /// if let Err(_) = tx.send("Goodbye!").await { + /// return; + /// } + /// })); + /// assert_eq!(stream.collect::>().await, vec!["Hello!", "Goodbye!"]); + /// # } + pub struct FnStream { + #[pin] + rx: rendezvous::Receiver, + generator: Option + Send + 'static>>>, + } +} + +impl fmt::Debug for FnStream { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_typename = std::any::type_name::(); + write!(f, "FnStream<{item_typename}>") + } +} + +impl FnStream { + /// Creates a new function based stream driven by `generator`. + /// + /// For examples, see the documentation for [`FnStream`] + pub fn new(generator: T) -> Self + where + T: FnOnce(rendezvous::Sender) -> Pin + Send + 'static>>, + { + let (tx, rx) = rendezvous::channel::(); + Self { + rx, + generator: Some(Box::pin(generator(tx))), + } + } + + /// Consumes and returns the next `Item` from this stream. + pub async fn next(&mut self) -> Option + where + Self: Unpin, + { + let mut me = Pin::new(self); + poll_fn(|cx| me.as_mut().poll_next(cx)).await + } + + /// Attempts to pull out the next value of this stream, returning `None` if the stream is + /// exhausted. + pub(crate) fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let mut me = self.project(); + match me.rx.poll_recv(cx) { + Poll::Ready(item) => Poll::Ready(item), + Poll::Pending => { + if let Some(generator) = me.generator { + if generator.as_mut().poll(cx).is_ready() { + // `generator` keeps writing items to `tx` and will not be `Poll::Ready` + // until it is done writing to `tx`. Once it is done, it returns `()` + // as output and is `Poll::Ready`, at which point we MUST NOT poll it again + // since doing so will cause a panic. + *me.generator = None; + } + } + Poll::Pending + } + } + } + + /// Consumes this stream and gathers elements into a collection. + pub async fn collect>(mut self) -> T { + let mut collection = T::initialize(); + while let Some(item) = self.next().await { + if !T::extend(&mut collection, item) { + break; + } + } + T::finalize(collection) + } +} + +impl FnStream> { + /// Yields the next item in the stream or returns an error if an error is encountered. + pub async fn try_next(&mut self) -> Result, E> { + self.next().await.transpose() + } + + /// Convenience method for `.collect::, _>()`. + pub async fn try_collect(self) -> Result, E> { + self.collect::, E>>().await + } +} diff --git a/rust-runtime/aws-smithy-async/src/future/rendezvous.rs b/rust-runtime/aws-smithy-async/src/future/rendezvous.rs index 16456f123e6..78762866e23 100644 --- a/rust-runtime/aws-smithy-async/src/future/rendezvous.rs +++ b/rust-runtime/aws-smithy-async/src/future/rendezvous.rs @@ -10,8 +10,9 @@ //! and coordinate with the receiver. //! //! Rendezvous channels should be used with care—it's inherently easy to deadlock unless they're being -//! used from separate tasks or an a coroutine setup (e.g. [`crate::future::fn_stream::FnStream`]) +//! used from separate tasks or an a coroutine setup (e.g. [`crate::future::pagination_stream::fn_stream::FnStream`]) +use std::future::poll_fn; use std::sync::Arc; use std::task::{Context, Poll}; use tokio::sync::Semaphore; @@ -104,7 +105,11 @@ pub struct Receiver { impl Receiver { /// Polls to receive an item from the channel - pub fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { + pub async fn recv(&mut self) -> Option { + poll_fn(|cx| self.poll_recv(cx)).await + } + + pub(crate) fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { // This uses `needs_permit` to track whether this is the first poll since we last returned an item. // If it is, we will grant a permit to the semaphore. Otherwise, we'll just forward the response through. let resp = self.chan.poll_recv(cx); @@ -124,13 +129,8 @@ impl Receiver { #[cfg(test)] mod test { - use crate::future::rendezvous::{channel, Receiver}; + use crate::future::rendezvous::channel; use std::sync::{Arc, Mutex}; - use tokio::macros::support::poll_fn; - - async fn recv(rx: &mut Receiver) -> Option { - poll_fn(|cx| rx.poll_recv(cx)).await - } #[tokio::test] async fn send_blocks_caller() { @@ -145,11 +145,11 @@ mod test { *idone.lock().unwrap() = 3; }); assert_eq!(*done.lock().unwrap(), 0); - assert_eq!(recv(&mut rx).await, Some(0)); + assert_eq!(rx.recv().await, Some(0)); assert_eq!(*done.lock().unwrap(), 1); - assert_eq!(recv(&mut rx).await, Some(1)); + assert_eq!(rx.recv().await, Some(1)); assert_eq!(*done.lock().unwrap(), 2); - assert_eq!(recv(&mut rx).await, None); + assert_eq!(rx.recv().await, None); assert_eq!(*done.lock().unwrap(), 3); let _ = send.await; } diff --git a/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs index d50c4f2be81..11914660ada 100644 --- a/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs @@ -10,7 +10,6 @@ use aws_sdk_ec2 as ec2; use aws_sdk_ec2::types::InstanceType; use crate::CanaryEnv; -use tokio_stream::StreamExt; mk_canary!( "ec2_paginator", diff --git a/tools/ci-cdk/canary-lambda/src/main.rs b/tools/ci-cdk/canary-lambda/src/main.rs index 688462031db..8fc6f4b2e76 100644 --- a/tools/ci-cdk/canary-lambda/src/main.rs +++ b/tools/ci-cdk/canary-lambda/src/main.rs @@ -26,11 +26,11 @@ mod latest; #[cfg(feature = "latest")] pub(crate) use latest as current_canary; -// NOTE: This module can be deleted 3 releases after release-2023-01-26 -#[cfg(feature = "release-2023-01-26")] -mod release_2023_01_26; -#[cfg(feature = "release-2023-01-26")] -pub(crate) use release_2023_01_26 as current_canary; +// NOTE: This module can be deleted 3 releases after release-2023-08-23 +#[cfg(feature = "release-2023-08-23")] +mod release_2023_08_23; +#[cfg(feature = "release-2023-08-23")] +pub(crate) use release_2023_08_23 as current_canary; #[tokio::main] async fn main() -> Result<(), Error> { diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26.rs b/tools/ci-cdk/canary-lambda/src/release_2023_08_23.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_08_23.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_08_23/paginator_canary.rs similarity index 92% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26/paginator_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_08_23/paginator_canary.rs index 72c9b40ed01..66df5a03e4e 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_08_23/paginator_canary.rs @@ -7,7 +7,7 @@ use crate::mk_canary; use anyhow::bail; use aws_sdk_ec2 as ec2; -use aws_sdk_ec2::model::InstanceType; +use aws_sdk_ec2::types::InstanceType; use crate::CanaryEnv; use tokio_stream::StreamExt; @@ -30,7 +30,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: let mut num_pages = 0; while let Some(page) = history.try_next().await? { let items_in_page = page.spot_price_history.unwrap_or_default().len(); - if items_in_page > page_size as usize { + if items_in_page > page_size { bail!( "failed to retrieve results of correct page size (expected {}, got {})", page_size, @@ -60,7 +60,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: #[cfg(test)] mod test { - use crate::paginator_canary::paginator_canary; + use crate::current_canary::paginator_canary::paginator_canary; #[tokio::test] async fn test_paginator() { diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_08_23/s3_canary.rs similarity index 98% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26/s3_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_08_23/s3_canary.rs index 70e3d18c55b..fbcba976d86 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/s3_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_08_23/s3_canary.rs @@ -8,8 +8,8 @@ use crate::{mk_canary, CanaryEnv}; use anyhow::Context; use aws_config::SdkConfig; use aws_sdk_s3 as s3; -use aws_sdk_s3::presigning::config::PresigningConfig; -use s3::types::ByteStream; +use s3::presigning::PresigningConfig; +use s3::primitives::ByteStream; use std::time::Duration; use uuid::Uuid; diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/transcribe_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_08_23/transcribe_canary.rs similarity index 97% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26/transcribe_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_08_23/transcribe_canary.rs index 554f4c3ddf1..8f6420fc1bd 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/transcribe_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_08_23/transcribe_canary.rs @@ -9,10 +9,10 @@ use async_stream::stream; use aws_config::SdkConfig; use aws_sdk_transcribestreaming as transcribe; use bytes::BufMut; -use transcribe::model::{ +use transcribe::primitives::Blob; +use transcribe::types::{ AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream, }; -use transcribe::types::Blob; const CHUNK_SIZE: usize = 8192; use crate::canary::CanaryEnv; diff --git a/tools/ci-cdk/canary-runner/src/build_bundle.rs b/tools/ci-cdk/canary-runner/src/build_bundle.rs index 464ee2e4ad5..4ec7861460e 100644 --- a/tools/ci-cdk/canary-runner/src/build_bundle.rs +++ b/tools/ci-cdk/canary-runner/src/build_bundle.rs @@ -63,9 +63,10 @@ const REQUIRED_SDK_CRATES: &[&str] = &[ "aws-sdk-transcribestreaming", ]; +// The elements in this `Vec` should be sorted in an ascending order by the release date. lazy_static! { static ref NOTABLE_SDK_RELEASE_TAGS: Vec = vec![ - ReleaseTag::from_str("release-2023-01-26").unwrap(), // last version before the crate reorg + ReleaseTag::from_str("release-2023-08-23").unwrap(), // last version before `Stream` trait removal ]; } @@ -112,38 +113,58 @@ enum CrateSource { }, } -fn enabled_features(crate_source: &CrateSource) -> Vec { - let mut enabled = Vec::new(); +fn enabled_feature(crate_source: &CrateSource) -> String { if let CrateSource::VersionsManifest { release_tag, .. } = crate_source { - // we want to select the newest module specified after this release + // we want to select the oldest module specified after this release for notable in NOTABLE_SDK_RELEASE_TAGS.iter() { tracing::debug!(release_tag = ?release_tag, notable = ?notable, "considering if release tag came before notable release"); if release_tag <= notable { tracing::debug!("selecting {} as chosen release", notable); - enabled.push(notable.as_str().into()); - break; + return notable.as_str().into(); } } } - if enabled.is_empty() { - enabled.push("latest".into()); - } - enabled + "latest".into() } fn generate_crate_manifest(crate_source: CrateSource) -> Result { let mut output = BASE_MANIFEST.to_string(); - for &sdk_crate in REQUIRED_SDK_CRATES { + write_dependencies(REQUIRED_SDK_CRATES, &mut output, &crate_source)?; + write!(output, "\n[features]\n").unwrap(); + writeln!(output, "latest = []").unwrap(); + for release_tag in NOTABLE_SDK_RELEASE_TAGS.iter() { + writeln!( + output, + "\"{release_tag}\" = []", + release_tag = release_tag.as_str() + ) + .unwrap(); + } + writeln!( + output, + "default = [\"{enabled}\"]", + enabled = enabled_feature(&crate_source) + ) + .unwrap(); + Ok(output) +} + +fn write_dependencies( + required_crates: &[&str], + output: &mut String, + crate_source: &CrateSource, +) -> Result<()> { + for &required_crate in required_crates { match &crate_source { CrateSource::Path(path) => { - let path_name = match sdk_crate.strip_prefix("aws-sdk-") { + let path_name = match required_crate.strip_prefix("aws-sdk-") { Some(path) => path, - None => sdk_crate, + None => required_crate, }; let crate_path = path.join(path_name); writeln!( output, - r#"{sdk_crate} = {{ path = "{path}" }}"#, + r#"{required_crate} = {{ path = "{path}" }}"#, path = crate_path.to_string_lossy() ) .unwrap() @@ -151,40 +172,20 @@ fn generate_crate_manifest(crate_source: CrateSource) -> Result { CrateSource::VersionsManifest { versions, release_tag, - } => match versions.crates.get(sdk_crate) { + } => match versions.crates.get(required_crate) { Some(version) => writeln!( output, - r#"{sdk_crate} = "{version}""#, + r#"{required_crate} = "{version}""#, version = version.version ) .unwrap(), None => { - bail!("Couldn't find `{sdk_crate}` in versions.toml for `{release_tag}`") + bail!("Couldn't find `{required_crate}` in versions.toml for `{release_tag}`") } }, } } - write!(output, "\n[features]\n").unwrap(); - writeln!(output, "latest = []").unwrap(); - for release_tag in NOTABLE_SDK_RELEASE_TAGS.iter() { - writeln!( - output, - "\"{release_tag}\" = []", - release_tag = release_tag.as_str() - ) - .unwrap(); - } - writeln!( - output, - "default = [{enabled}]", - enabled = enabled_features(&crate_source) - .into_iter() - .map(|f| format!("\"{f}\"")) - .collect::>() - .join(", ") - ) - .unwrap(); - Ok(output) + Ok(()) } fn sha1_file(path: &Path) -> Result { @@ -441,7 +442,7 @@ aws-sdk-transcribestreaming = { path = "some/sdk/path/transcribestreaming" } [features] latest = [] -"release-2023-01-26" = [] +"release-2023-08-23" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::Path("some/sdk/path".into())).expect("success") @@ -505,7 +506,7 @@ aws-sdk-transcribestreaming = "0.16.0" [features] latest = [] -"release-2023-01-26" = [] +"release-2023-08-23" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::VersionsManifest { @@ -523,7 +524,7 @@ default = ["latest"] .collect(), release: None, }, - release_tag: ReleaseTag::from_str("release-2023-05-26").unwrap(), + release_tag: ReleaseTag::from_str("release-2023-08-26").unwrap(), }) .expect("success") ); @@ -577,26 +578,25 @@ default = ["latest"] release: None, }; assert_eq!( - enabled_features(&CrateSource::VersionsManifest { + "latest".to_string(), + enabled_feature(&CrateSource::VersionsManifest { versions: versions.clone(), - release_tag: "release-2023-02-23".parse().unwrap(), + release_tag: "release-9999-12-31".parse().unwrap(), }), - vec!["latest".to_string()] ); - assert_eq!( - enabled_features(&CrateSource::VersionsManifest { + "release-2023-08-23".to_string(), + enabled_feature(&CrateSource::VersionsManifest { versions: versions.clone(), - release_tag: "release-2023-01-26".parse().unwrap(), + release_tag: "release-2023-08-23".parse().unwrap(), }), - vec!["release-2023-01-26".to_string()] ); assert_eq!( - enabled_features(&CrateSource::VersionsManifest { + "release-2023-08-23".to_string(), + enabled_feature(&CrateSource::VersionsManifest { versions, release_tag: "release-2023-01-13".parse().unwrap(), }), - vec!["release-2023-01-26".to_string()] ); } } From 07c993d8c73f4ecd240b614dbac5268c435a572c Mon Sep 17 00:00:00 2001 From: Fahad Zubair Date: Thu, 28 Sep 2023 09:19:46 -0400 Subject: [PATCH 136/331] Update SmithyRs maintainers list (#3004) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context Updating the list of users who are maintaining smithy-rs. ## Description This file is used to distinguish between internal and external contributors. Usernames of external contributors appear in the ‘Contributors’ section of the changelog. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: Fahad Zubair --- tools/ci-build/changelogger/smithy-rs-maintainers.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/ci-build/changelogger/smithy-rs-maintainers.txt b/tools/ci-build/changelogger/smithy-rs-maintainers.txt index f5732607b16..0c3bb189243 100644 --- a/tools/ci-build/changelogger/smithy-rs-maintainers.txt +++ b/tools/ci-build/changelogger/smithy-rs-maintainers.txt @@ -5,3 +5,6 @@ jdisanti rcoh velfi ysaito1001 +drganjoo +rschmitt +rhernandez35 From 3c11815e5e4d0ec8c048d4bde7af94b710039672 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 28 Sep 2023 09:20:04 -0400 Subject: [PATCH 137/331] Merge 0.56.x back into main (#3003) ## Motivation and Context ## Description ## Testing ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 Co-authored-by: John DiSanti Co-authored-by: kstich --- .../src/http_request/canonical_request.rs | 21 +- .../models/apigateway-rules.smithy | 1 - .../models/single-static-endpoint.smithy | 20 + aws/sdk-codegen/build.gradle.kts | 1 + .../rustsdk/EndpointBuiltInsDecorator.kt | 15 +- .../amazon/smithy/rustsdk/RegionDecorator.kt | 10 +- .../endpoints/OperationInputTestGenerator.kt | 6 +- .../rustsdk/EndpointBuiltInsDecoratorTest.kt | 4 +- aws/sdk/aws-models/config.json | 1 + aws/sdk/aws-models/ec2.json | 1147 ++++++++++++++++- aws/sdk/aws-models/ecs.json | 30 +- aws/sdk/aws-models/route53.json | 1 + aws/sdk/aws-models/s3.json | 215 +-- aws/sdk/aws-models/s3control.json | 1 + buildSrc/build.gradle.kts | 1 + codegen-client-test/build.gradle.kts | 8 +- .../model/endpoint-rules.smithy | 1 - .../model/rest-xml-extras.smithy | 96 -- .../smithy/endpoint/EndpointRulesetIndex.kt | 2 +- .../smithy/endpoint/EndpointsDecorator.kt | 4 +- .../generators/EndpointParamsGenerator.kt | 8 +- .../generators/EndpointResolverGenerator.kt | 27 +- .../generators/EndpointTestGenerator.kt | 19 +- .../endpoint/rulesgen/ExpressionGenerator.kt | 22 +- .../endpoint/rulesgen/LiteralGenerator.kt | 9 +- .../endpoint/rulesgen/TemplateGenerator.kt | 4 +- .../client/CustomizableOperationGenerator.kt | 24 +- .../protocol/ProtocolTestGenerator.kt | 3 + .../client/testutil/EndpointTestDiscovery.kt | 40 + .../endpoint/EndpointParamsGeneratorTest.kt | 14 +- .../endpoint/EndpointResolverGeneratorTest.kt | 88 +- .../smithy/endpoint/EndpointsDecoratorTest.kt | 4 +- .../rulesgen/ExpressionGeneratorTest.kt | 19 +- .../rulesgen/TemplateGeneratorTest.kt | 4 +- .../endpoint-tests/default-values.smithy | 88 ++ .../endpoint-tests/deprecated-param.smithy | 44 + .../endpoint-tests/duplicate-param.smithy | 55 + .../get-attr-type-inference.smithy | 56 + .../smithy/endpoint-tests/headers.smithy | 80 ++ .../endpoint-tests/minimal-ruleset.smithy | 33 + .../smithy/endpoint-tests/parse-url.smithy | 264 ++++ .../smithy/endpoint-tests/substring.smithy | 293 +++++ .../smithy/endpoint-tests/uri-encode.smithy | 132 ++ .../endpoint-tests/valid-hostlabel.smithy | 122 ++ .../smithy/endpoint-tests/valid-model.smithy | 73 ++ .../test/resources/META-INF/smithy/manif3st | 11 + .../rest-json-extras.smithy | 96 -- .../rust/codegen/core/testutil/TestHelpers.kt | 8 +- .../protocol/ServerProtocolTestGenerator.kt | 1 + design/src/rfcs/rfc0027_endpoints_20.md | 2 +- gradle.properties | 2 +- 51 files changed, 2737 insertions(+), 493 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy create mode 100644 codegen-client/src/test/resources/META-INF/smithy/manif3st diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index 7f18602c7a4..eb58093cdee 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -843,11 +843,24 @@ mod tests { ); } + fn valid_input(input: &Vec) -> bool { + [ + "content-length".to_owned(), + "content-type".to_owned(), + "host".to_owned(), + ] + .iter() + .all(|element| !input.contains(&element)) + } + proptest! { - #[test] - fn presigning_header_exclusion_with_explicit_exclusion_list_specified( - excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10), - ) { + #[test] + fn presigning_header_exclusion_with_explicit_exclusion_list_specified( + excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10).prop_filter( + "`excluded_headers` should pass the `valid_input` check", + valid_input, + ) + ) { let mut request_builder = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header("content-type", "application/xml") diff --git a/aws/sdk-adhoc-test/models/apigateway-rules.smithy b/aws/sdk-adhoc-test/models/apigateway-rules.smithy index 3e5bb310d30..db13c805e32 100644 --- a/aws/sdk-adhoc-test/models/apigateway-rules.smithy +++ b/aws/sdk-adhoc-test/models/apigateway-rules.smithy @@ -19,7 +19,6 @@ apply BackplaneControlService @endpointRuleSet({ "endpoint": { "url": "https://www.example.com" } }], "parameters": { - "Bucket": { "required": false, "type": "String" }, "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, } }) diff --git a/aws/sdk-adhoc-test/models/single-static-endpoint.smithy b/aws/sdk-adhoc-test/models/single-static-endpoint.smithy index a110cee5c87..cb98b605fd8 100644 --- a/aws/sdk-adhoc-test/models/single-static-endpoint.smithy +++ b/aws/sdk-adhoc-test/models/single-static-endpoint.smithy @@ -26,6 +26,7 @@ use smithy.rules#endpointTests "authSchemes": [{ "name": "sigv4", "signingRegion": "{Region}", + "signingName": "blah" }] } } @@ -33,6 +34,24 @@ use smithy.rules#endpointTests ] }) @endpointTests({"version": "1", "testCases": [ + { + "documentation": "region set", + "expect": { + "endpoint": { + "url": "https://prod.us-east-1.api.myservice.aws.dev", + "properties": { + "authSchemes": [{ + "name": "sigv4", + "signingRegion": "us-east-1", + "signingName": "blah" + }] + + } + } + }, + "params": { "Region": "us-east-1" } + "operationInputs": [ ] + }, { "documentation": "region should fallback to the default", "expect": { @@ -42,6 +61,7 @@ use smithy.rules#endpointTests "authSchemes": [{ "name": "sigv4", "signingRegion": "us-east-2", + "signingName": "blah" }] } diff --git a/aws/sdk-codegen/build.gradle.kts b/aws/sdk-codegen/build.gradle.kts index b7a6471bed3..6eba2aed648 100644 --- a/aws/sdk-codegen/build.gradle.kts +++ b/aws/sdk-codegen/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-rules-engine:$smithyVersion") + implementation("software.amazon.smithy:smithy-aws-endpoints:$smithyVersion") } val generateAwsRuntimeCrateVersion by tasks.registering { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index 2355bf709f7..636f1951596 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -11,8 +11,9 @@ import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.EndpointRuleSet -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.language.syntax.parameters.BuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -57,9 +58,9 @@ fun ClientCodegenContext.getBuiltIn(builtIn: String): Parameter? { } private fun promotedBuiltins(parameter: Parameter) = - parameter.builtIn == Builtins.FIPS.builtIn || - parameter.builtIn == Builtins.DUALSTACK.builtIn || - parameter.builtIn == Builtins.SDK_ENDPOINT.builtIn + parameter.builtIn == AwsBuiltIns.FIPS.builtIn || + parameter.builtIn == AwsBuiltIns.DUALSTACK.builtIn || + parameter.builtIn == BuiltIns.SDK_ENDPOINT.builtIn private fun configParamNewtype(parameter: Parameter, name: String, runtimeConfig: RuntimeConfig): RuntimeType { val type = parameter.symbol().mapRustType { t -> t.stripOuter() } @@ -195,10 +196,10 @@ fun Node.toWritable(): Writable { val PromotedBuiltInsDecorators = listOf( - decoratorForBuiltIn(Builtins.FIPS), - decoratorForBuiltIn(Builtins.DUALSTACK), + decoratorForBuiltIn(AwsBuiltIns.FIPS), + decoratorForBuiltIn(AwsBuiltIns.DUALSTACK), decoratorForBuiltIn( - Builtins.SDK_ENDPOINT, + BuiltIns.SDK_ENDPOINT, ConfigParam.Builder() .name("endpoint_url") .type(RuntimeType.String.toSymbol()) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index a0d47cc4d15..e7bf13e747a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -8,7 +8,7 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.aws.traits.auth.SigV4Trait import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule @@ -84,7 +84,7 @@ class RegionDecorator : ClientCodegenDecorator { // Services that have an endpoint ruleset that references the SDK::Region built in, or // that use SigV4, both need a configurable region. private fun usesRegion(codegenContext: ClientCodegenContext) = - codegenContext.getBuiltIn(Builtins.REGION) != null || ServiceIndex.of(codegenContext.model) + codegenContext.getBuiltIn(AwsBuiltIns.REGION) != null || ServiceIndex.of(codegenContext.model) .getEffectiveAuthSchemes(codegenContext.serviceShape).containsKey(SigV4Trait.ID) override fun configCustomizations( @@ -125,18 +125,19 @@ class RegionDecorator : ClientCodegenDecorator { object : EndpointCustomization { override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { return when (parameter.builtIn) { - Builtins.REGION.builtIn -> writable { + AwsBuiltIns.REGION.builtIn -> writable { rustTemplate( "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", "Region" to region(codegenContext.runtimeConfig).resolve("Region"), ) } + else -> null } } override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? { - if (name != Builtins.REGION.builtIn.get()) { + if (name != AwsBuiltIns.REGION.builtIn.get()) { return null } return writable { @@ -158,6 +159,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi *preludeScope, "Region" to region.resolve("Region"), ) + override fun section(section: ServiceConfig) = writable { when (section) { ServiceConfig.ConfigImpl -> { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index f1a957be611..ff42af1960f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -8,7 +8,7 @@ package software.amazon.smithy.rustsdk.endpoints import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -59,9 +59,9 @@ class OperationInputTestDecorator : ClientCodegenDecorator { private val deprecatedBuiltins = setOf( // The Rust SDK DOES NOT support the S3 global endpoint because we do not support bucket redirects - Builtins.S3_USE_GLOBAL_ENDPOINT, + AwsBuiltIns.S3_USE_GLOBAL_ENDPOINT, // STS global endpoint was deprecated after STS regionalization - Builtins.STS_USE_GLOBAL_ENDPOINT, + AwsBuiltIns.STS_USE_GLOBAL_ENDPOINT, ).map { it.builtIn.get() } fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Boolean { diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt index d66a37130a0..9c1a29ecaea 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt @@ -41,7 +41,7 @@ class EndpointBuiltInsDecoratorTest { "endpoint": { "url": "{endpoint}" "properties": { - "authSchemes": [{"name": "sigv4","signingRegion": "{region}"}] + "authSchemes": [{"name": "sigv4","signingRegion": "{region}", "signingName": "dontcare"}] } } }, @@ -53,7 +53,7 @@ class EndpointBuiltInsDecoratorTest { "endpoint": { "url": "https://WRONG/" "properties": { - "authSchemes": [{"name": "sigv4", "signingRegion": "{region}"}] + "authSchemes": [{"name": "sigv4", "signingRegion": "{region}", "signingName": "dontcare"}] } } } diff --git a/aws/sdk/aws-models/config.json b/aws/sdk/aws-models/config.json index 07c3bf0502c..d98e34a8d6b 100644 --- a/aws/sdk/aws-models/config.json +++ b/aws/sdk/aws-models/config.json @@ -14463,6 +14463,7 @@ "arnNamespace": "config", "cloudFormationName": "Config", "cloudTrailEventSource": "configservice.amazonaws.com", + "docId": "config-2014-11-12", "endpointPrefix": "config" }, "aws.auth#sigv4": { diff --git a/aws/sdk/aws-models/ec2.json b/aws/sdk/aws-models/ec2.json index 16cf8a51163..ee7045e56bf 100644 --- a/aws/sdk/aws-models/ec2.json +++ b/aws/sdk/aws-models/ec2.json @@ -3254,6 +3254,9 @@ { "target": "com.amazonaws.ec2#DisableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccess" + }, { "target": "com.amazonaws.ec2#DisableImageDeprecation" }, @@ -3332,6 +3335,9 @@ { "target": "com.amazonaws.ec2#EnableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccess" + }, { "target": "com.amazonaws.ec2#EnableImageDeprecation" }, @@ -3410,6 +3416,9 @@ { "target": "com.amazonaws.ec2#GetHostReservationPurchasePreview" }, + { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessState" + }, { "target": "com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements" }, @@ -5756,7 +5765,19 @@ "target": "com.amazonaws.ec2#AssignPrivateIpAddressesResult" }, "traits": { - "smithy.api#documentation": "

Assigns one or more secondary private IP addresses to the specified network interface.

\n

You can specify one or more specific secondary IP addresses, or you can specify the number \n of secondary IP addresses to be automatically assigned within the subnet's CIDR block range. \n The number of secondary IP addresses that you can assign to an instance varies by instance type.\n For information about instance types, see Instance Types in the Amazon Elastic Compute Cloud User Guide. For more information about \n Elastic IP addresses, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

When you move a secondary private IP address to another network interface, any Elastic IP address \n that is associated with the IP address is also moved.

\n

Remapping an IP address is an asynchronous operation. When you move an IP address from one network\n interface to another, check network/interfaces/macs/mac/local-ipv4s in the instance\n metadata to confirm that the remapping is complete.

\n

You must specify either the IP addresses or the IP address count in the request.

\n

You can optionally use Prefix Delegation on the network interface. You must specify\n either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\n information, see \n Assigning prefixes to Amazon EC2 network interfaces in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Assigns one or more secondary private IP addresses to the specified network interface.

\n

You can specify one or more specific secondary IP addresses, or you can specify the number \n of secondary IP addresses to be automatically assigned within the subnet's CIDR block range. \n The number of secondary IP addresses that you can assign to an instance varies by instance type.\n For information about instance types, see Instance Types in the Amazon Elastic Compute Cloud User Guide. For more information about \n Elastic IP addresses, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

When you move a secondary private IP address to another network interface, any Elastic IP address \n that is associated with the IP address is also moved.

\n

Remapping an IP address is an asynchronous operation. When you move an IP address from one network\n interface to another, check network/interfaces/macs/mac/local-ipv4s in the instance\n metadata to confirm that the remapping is complete.

\n

You must specify either the IP addresses or the IP address count in the request.

\n

You can optionally use Prefix Delegation on the network interface. You must specify\n either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\n information, see \n Assigning prefixes to Amazon EC2 network interfaces in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To assign a specific secondary private IP address to an interface", + "documentation": "This example assigns the specified secondary private IP address to the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + "10.0.0.82" + ] + } + } + ] } }, "com.amazonaws.ec2#AssignPrivateIpAddressesRequest": { @@ -6557,7 +6578,20 @@ "target": "com.amazonaws.ec2#AssociateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

" + "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To associate a route table with a subnet", + "documentation": "This example associates the specified route table with the specified subnet.", + "input": { + "SubnetId": "subnet-9d4a7b6", + "RouteTableId": "rtb-22574640" + }, + "output": { + "AssociationId": "rtbassoc-781d0d1a" + } + } + ] } }, "com.amazonaws.ec2#AssociateRouteTableRequest": { @@ -7387,7 +7421,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity \n\t\t between the internet and the VPC. For more information, see Internet gateways in the \n\t\t Amazon VPC User Guide.

" + "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity \n\t\t between the internet and the VPC. For more information, see Internet gateways in the \n\t\t Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach an Internet gateway to a VPC", + "documentation": "This example attaches the specified Internet gateway to the specified VPC.", + "input": { + "InternetGatewayId": "igw-c0a643a9", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#AttachInternetGatewayRequest": { @@ -7437,7 +7481,21 @@ "target": "com.amazonaws.ec2#AttachNetworkInterfaceResult" }, "traits": { - "smithy.api#documentation": "

Attaches a network interface to an instance.

" + "smithy.api#documentation": "

Attaches a network interface to an instance.

", + "smithy.api#examples": [ + { + "title": "To attach a network interface to an instance", + "documentation": "This example attaches the specified network interface to the specified instance.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "InstanceId": "i-1234567890abcdef0", + "DeviceIndex": 1 + }, + "output": { + "AttachmentId": "eni-attach-66c4350a" + } + } + ] } }, "com.amazonaws.ec2#AttachNetworkInterfaceRequest": { @@ -8012,7 +8070,29 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

" + "smithy.api#documentation": "

Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

", + "smithy.api#examples": [ + { + "title": "To add a rule that allows outbound traffic to a specific address range", + "documentation": "This example adds a rule that grants access to the specified address ranges on TCP port 80.", + "input": { + "GroupId": "sg-1a2b3c4d", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "IpRanges": [ + { + "CidrIp": "10.0.0.0/16" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#AuthorizeSecurityGroupEgressRequest": { @@ -9707,7 +9787,28 @@ "target": "com.amazonaws.ec2#CancelSpotFleetRequestsResponse" }, "traits": { - "smithy.api#documentation": "

Cancels the specified Spot Fleet requests.

\n

After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.

\n

You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\n choose to terminate the instances, the Spot Fleet request enters the\n cancelled_terminating state. Otherwise, the Spot Fleet request enters\n the cancelled_running state and the instances continue to run until they\n are interrupted or you terminate them manually.

" + "smithy.api#documentation": "

Cancels the specified Spot Fleet requests.

\n

After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.

\n

You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\n choose to terminate the instances, the Spot Fleet request enters the\n cancelled_terminating state. Otherwise, the Spot Fleet request enters\n the cancelled_running state and the instances continue to run until they\n are interrupted or you terminate them manually.

", + "smithy.api#examples": [ + { + "title": "To cancel a Spot fleet request", + "documentation": "This example cancels the specified Spot fleet request and terminates its associated Spot Instances.", + "input": { + "SpotFleetRequestIds": [ + "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + ], + "TerminateInstances": true + }, + "output": { + "SuccessfulFleetRequests": [ + { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "CurrentSpotFleetRequestState": "cancelled_running", + "PreviousSpotFleetRequestState": "active" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CancelSpotFleetRequestsError": { @@ -9917,7 +10018,26 @@ "target": "com.amazonaws.ec2#CancelSpotInstanceRequestsResult" }, "traits": { - "smithy.api#documentation": "

Cancels one or more Spot Instance requests.

\n \n

Canceling a Spot Instance request does not terminate running Spot Instances\n associated with the request.

\n
" + "smithy.api#documentation": "

Cancels one or more Spot Instance requests.

\n \n

Canceling a Spot Instance request does not terminate running Spot Instances\n associated with the request.

\n
", + "smithy.api#examples": [ + { + "title": "To cancel Spot Instance requests", + "documentation": "This example cancels a Spot Instance request.", + "input": { + "SpotInstanceRequestIds": [ + "sir-08b93456" + ] + }, + "output": { + "CancelledSpotInstanceRequests": [ + { + "State": "cancelled", + "SpotInstanceRequestId": "sir-08b93456" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CancelSpotInstanceRequestsRequest": { @@ -16479,7 +16599,41 @@ "target": "com.amazonaws.ec2#CreateNetworkAclResult" }, "traits": { - "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

" + "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a network ACL", + "documentation": "This example creates a network ACL for the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + }, + "output": { + "NetworkAcl": { + "Associations": [], + "NetworkAclId": "acl-5fb85d36", + "VpcId": "vpc-a01106c2", + "Tags": [], + "Entries": [ + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": true, + "RuleAction": "deny" + }, + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": false, + "RuleAction": "deny" + } + ], + "IsDefault": false + } + } + } + ] } }, "com.amazonaws.ec2#CreateNetworkAclEntry": { @@ -16491,7 +16645,25 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs \n in the Amazon VPC User Guide.

" + "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs \n in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a network ACL entry", + "documentation": "This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Protocol": "17", + "RuleAction": "allow", + "Egress": false, + "CidrBlock": "0.0.0.0/0", + "PortRange": { + "From": 53, + "To": 53 + } + } + } + ] } }, "com.amazonaws.ec2#CreateNetworkAclEntryRequest": { @@ -17489,7 +17661,18 @@ "target": "com.amazonaws.ec2#CreateRouteResult" }, "traits": { - "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon VPC User Guide.

" + "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a route", + "documentation": "This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": "igw-c0a643a9" + } + } + ] } }, "com.amazonaws.ec2#CreateRouteRequest": { @@ -17647,7 +17830,32 @@ "target": "com.amazonaws.ec2#CreateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

" + "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a route table", + "documentation": "This example creates a route table for the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + }, + "output": { + "RouteTable": { + "Associations": [], + "RouteTableId": "rtb-22574640", + "VpcId": "vpc-a01106c2", + "PropagatingVgws": [], + "Tags": [], + "Routes": [ + { + "GatewayId": "local", + "DestinationCidrBlock": "10.0.0.0/16", + "State": "active" + } + ] + } + } + } + ] } }, "com.amazonaws.ec2#CreateRouteTableRequest": { @@ -17962,7 +18170,25 @@ "target": "com.amazonaws.ec2#CreateSpotDatafeedSubscriptionResult" }, "traits": { - "smithy.api#documentation": "

Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\n You can create one data feed per Amazon Web Services account. For more information, see\n Spot Instance data feed \n in the Amazon EC2 User Guide for Linux Instances.

" + "smithy.api#documentation": "

Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\n You can create one data feed per Amazon Web Services account. For more information, see\n Spot Instance data feed \n in the Amazon EC2 User Guide for Linux Instances.

", + "smithy.api#examples": [ + { + "title": "To create a Spot Instance datafeed", + "documentation": "This example creates a Spot Instance data feed for your AWS account.", + "input": { + "Bucket": "my-s3-bucket", + "Prefix": "spotdata" + }, + "output": { + "SpotDatafeedSubscription": { + "OwnerId": "123456789012", + "Prefix": "spotdata", + "Bucket": "my-s3-bucket", + "State": "Active" + } + } + } + ] } }, "com.amazonaws.ec2#CreateSpotDatafeedSubscriptionRequest": { @@ -18295,7 +18521,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\n resources. When you specify an existing tag key, the value is overwritten with\n the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\n optional value. Tag keys must be unique per resource.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide. For more information about\n creating IAM policies that control users' access to resources based on tags, see Supported\n resource-level permissions for Amazon EC2 API actions in the Amazon\n Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\n resources. When you specify an existing tag key, the value is overwritten with\n the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\n optional value. Tag keys must be unique per resource.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide. For more information about\n creating IAM policies that control users' access to resources based on tags, see Supported\n resource-level permissions for Amazon EC2 API actions in the Amazon\n Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag to a resource", + "documentation": "This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.", + "input": { + "Resources": [ + "ami-78a54011" + ], + "Tags": [ + { + "Key": "Stack", + "Value": "production" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CreateTagsRequest": { @@ -22310,7 +22553,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified internet gateway. You must detach the internet gateway from the\n\t\t\tVPC before you can delete it.

" + "smithy.api#documentation": "

Deletes the specified internet gateway. You must detach the internet gateway from the\n\t\t\tVPC before you can delete it.

", + "smithy.api#examples": [ + { + "title": "To delete an Internet gateway", + "documentation": "This example deletes the specified Internet gateway.", + "input": { + "InternetGatewayId": "igw-c0a643a9" + } + } + ] } }, "com.amazonaws.ec2#DeleteInternetGatewayRequest": { @@ -23244,7 +23496,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.

" + "smithy.api#documentation": "

Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.

", + "smithy.api#examples": [ + { + "title": "To delete a network ACL", + "documentation": "This example deletes the specified network ACL.", + "input": { + "NetworkAclId": "acl-5fb85d36" + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkAclEntry": { @@ -23256,7 +23517,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified ingress or egress entry (rule) from the specified network ACL.

" + "smithy.api#documentation": "

Deletes the specified ingress or egress entry (rule) from the specified network ACL.

", + "smithy.api#examples": [ + { + "title": "To delete a network ACL entry", + "documentation": "This example deletes ingress rule number 100 from the specified network ACL.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Egress": true + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkAclEntryRequest": { @@ -23554,7 +23826,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified network interface. You must detach the network interface before you can delete it.

" + "smithy.api#documentation": "

Deletes the specified network interface. You must detach the network interface before you can delete it.

", + "smithy.api#examples": [ + { + "title": "To delete a network interface", + "documentation": "This example deletes the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3" + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkInterfacePermission": { @@ -23659,7 +23940,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified placement group. You must terminate all instances in the\n placement group before you can delete the placement group. For more information, see\n Placement groups in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Deletes the specified placement group. You must terminate all instances in the\n placement group before you can delete the placement group. For more information, see\n Placement groups in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a placement group", + "documentation": "This example deletes the specified placement group.\n", + "input": { + "GroupName": "my-cluster" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeletePlacementGroupRequest": { @@ -23876,7 +24167,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified route from the specified route table.

" + "smithy.api#documentation": "

Deletes the specified route from the specified route table.

", + "smithy.api#examples": [ + { + "title": "To delete a route", + "documentation": "This example deletes the specified route from the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "0.0.0.0/0" + } + } + ] } }, "com.amazonaws.ec2#DeleteRouteRequest": { @@ -23938,7 +24239,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.

" + "smithy.api#documentation": "

Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.

", + "smithy.api#examples": [ + { + "title": "To delete a route table", + "documentation": "This example deletes the specified route table.", + "input": { + "RouteTableId": "rtb-22574640" + } + } + ] } }, "com.amazonaws.ec2#DeleteRouteTableRequest": { @@ -24214,7 +24524,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified set of tags from the specified set of resources.

\n

To list the current tags, use DescribeTags. For more information about\n tags, see Tag\n your Amazon EC2 resources in the Amazon Elastic Compute Cloud User\n Guide.

" + "smithy.api#documentation": "

Deletes the specified set of tags from the specified set of resources.

\n

To list the current tags, use DescribeTags. For more information about\n tags, see Tag\n your Amazon EC2 resources in the Amazon Elastic Compute Cloud User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a tag from a resource", + "documentation": "This example deletes the tag Stack=test from the specified image.", + "input": { + "Resources": [ + "ami-78a54011" + ], + "Tags": [ + { + "Key": "Stack", + "Value": "test" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DeleteTagsRequest": { @@ -30568,7 +30895,23 @@ "target": "com.amazonaws.ec2#InstanceAttribute" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified instance. You can specify only one\n attribute at a time. Valid attribute values are: instanceType |\n kernel | ramdisk | userData |\n disableApiTermination | instanceInitiatedShutdownBehavior\n | rootDeviceName | blockDeviceMapping |\n productCodes | sourceDestCheck | groupSet |\n ebsOptimized | sriovNetSupport\n

" + "smithy.api#documentation": "

Describes the specified attribute of the specified instance. You can specify only one\n attribute at a time. Valid attribute values are: instanceType |\n kernel | ramdisk | userData |\n disableApiTermination | instanceInitiatedShutdownBehavior\n | rootDeviceName | blockDeviceMapping |\n productCodes | sourceDestCheck | groupSet |\n ebsOptimized | sriovNetSupport\n

", + "smithy.api#examples": [ + { + "title": "To describe the instance type", + "documentation": "This example describes the instance type of the specified instance.\n", + "input": { + "InstanceId": "i-1234567890abcdef0", + "Attribute": "instanceType" + }, + "output": { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": { + "Value": "t1.micro" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeInstanceAttributeRequest": { @@ -34073,7 +34416,29 @@ "target": "com.amazonaws.ec2#DescribeNetworkInterfaceAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes a network interface attribute. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes a network interface attribute. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the attachment attribute of a network interface", + "documentation": "This example describes the attachment attribute of the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-686ea200", + "Attribute": "attachment" + }, + "output": { + "NetworkInterfaceId": "eni-686ea200", + "Attachment": { + "Status": "attached", + "DeviceIndex": 0, + "AttachTime": "2015-05-21T20:02:20.000Z", + "InstanceId": "i-1234567890abcdef0", + "DeleteOnTermination": true, + "AttachmentId": "eni-attach-43348162", + "InstanceOwnerId": "123456789012" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeNetworkInterfaceAttributeRequest": { @@ -36417,7 +36782,26 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetInstancesResponse" }, "traits": { - "smithy.api#documentation": "

Describes the running instances for the specified Spot Fleet.

" + "smithy.api#documentation": "

Describes the running instances for the specified Spot Fleet.

", + "smithy.api#examples": [ + { + "title": "To describe the Spot Instances associated with a Spot fleet", + "documentation": "This example lists the Spot Instances associated with the specified Spot fleet.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + }, + "output": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "ActiveInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": "m3.medium", + "SpotInstanceRequestId": "sir-08b93456" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults": { @@ -36519,7 +36903,54 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryResponse" }, "traits": { - "smithy.api#documentation": "

Describes the events for the specified Spot Fleet request during the specified\n time.

\n

Spot Fleet events are delayed by up to 30 seconds before they can be described. This\n ensures that you can query by the last evaluated time and not miss a recorded event.\n Spot Fleet events are available for 48 hours.

\n

For more information, see Monitor fleet events using Amazon\n EventBridge in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Describes the events for the specified Spot Fleet request during the specified\n time.

\n

Spot Fleet events are delayed by up to 30 seconds before they can be described. This\n ensures that you can query by the last evaluated time and not miss a recorded event.\n Spot Fleet events are available for 48 hours.

\n

For more information, see Monitor fleet events using Amazon\n EventBridge in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe Spot fleet history", + "documentation": "This example returns the history for the specified Spot fleet starting at the specified time.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "StartTime": "2015-05-26T00:00:00Z" + }, + "output": { + "HistoryRecords": [ + { + "Timestamp": "2015-05-26T23:17:20.697Z", + "EventInformation": { + "EventSubType": "submitted" + }, + "EventType": "fleetRequestChange" + }, + { + "Timestamp": "2015-05-26T23:17:20.873Z", + "EventInformation": { + "EventSubType": "active" + }, + "EventType": "fleetRequestChange" + }, + { + "Timestamp": "2015-05-26T23:21:21.712Z", + "EventInformation": { + "InstanceId": "i-1234567890abcdef0", + "EventSubType": "launched" + }, + "EventType": "instanceChange" + }, + { + "Timestamp": "2015-05-26T23:21:21.816Z", + "EventInformation": { + "InstanceId": "i-1234567890abcdef1", + "EventSubType": "launched" + }, + "EventType": "instanceChange" + } + ], + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "StartTime": "2015-05-26T00:00:00Z", + "NextToken": "CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=" + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults": { @@ -41279,7 +41710,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Detaches an internet gateway from a VPC, disabling connectivity between the internet\n\t\t\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\n\t\t\tpublic IPv4 addresses.

" + "smithy.api#documentation": "

Detaches an internet gateway from a VPC, disabling connectivity between the internet\n\t\t\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\n\t\t\tpublic IPv4 addresses.

", + "smithy.api#examples": [ + { + "title": "To detach an Internet gateway from a VPC", + "documentation": "This example detaches the specified Internet gateway from the specified VPC.", + "input": { + "InternetGatewayId": "igw-c0a643a9", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#DetachInternetGatewayRequest": { @@ -41329,7 +41770,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Detaches a network interface from an instance.

" + "smithy.api#documentation": "

Detaches a network interface from an instance.

", + "smithy.api#examples": [ + { + "title": "To detach a network interface from an instance", + "documentation": "This example detaches the specified network interface from its attached instance.", + "input": { + "AttachmentId": "eni-attach-66c4350a" + } + } + ] } }, "com.amazonaws.ec2#DetachNetworkInterfaceRequest": { @@ -42309,6 +42759,50 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#DisableImageBlockPublicAccess": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccessRequest" + }, + "output": { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccessResult" + }, + "traits": { + "smithy.api#documentation": "

Disables block public access for AMIs at the account level in the\n specified Amazon Web Services Region. This removes the block public access restriction\n from your account. With the restriction removed, you can publicly share your AMIs in the\n specified Amazon Web Services Region.

\n

The API can take up to 10 minutes to configure this setting. During this time, if you run\n GetImageBlockPublicAccessState, the response will be\n block-new-sharing. When the API has completed the configuration, the response\n will be unblocked.

\n

For more information, see Block public access to your AMIs in\n the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccessRequest": { + "type": "structure", + "members": { + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccessResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessDisabledState", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

Returns unblocked if the request succeeds; otherwise, it returns an\n error.

", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#DisableImageDeprecation": { "type": "operation", "input": { @@ -43128,7 +43622,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon VPC User Guide.

" + "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To disassociate a route table", + "documentation": "This example disassociates the specified route table from its associated subnet.", + "input": { + "AssociationId": "rtbassoc-781d0d1a" + } + } + ] } }, "com.amazonaws.ec2#DisassociateRouteTableRequest": { @@ -45541,6 +46044,58 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#EnableImageBlockPublicAccess": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccessRequest" + }, + "output": { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccessResult" + }, + "traits": { + "smithy.api#documentation": "

Enables block public access for AMIs at the account level in the\n specified Amazon Web Services Region. This prevents the public sharing of your AMIs. However, if you already\n have public AMIs, they will remain publicly available.

\n

The API can take up to 10 minutes to configure this setting. During this time, if you run\n GetImageBlockPublicAccessState, the response will be unblocked. When\n the API has completed the configuration, the response will be\n block-new-sharing.

\n

For more information, see Block\n public access to your AMIs in the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccessRequest": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#documentation": "

Specify block-new-sharing to enable block public access for AMIs at the\n account level in the specified Region. This will block any attempt to publicly share your AMIs\n in the specified Region.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccessResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

Returns block-new-sharing if the request succeeds; otherwise, it returns an\n error.

", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#EnableImageDeprecation": { "type": "operation", "input": { @@ -45877,7 +46432,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Enables I/O operations for a volume that had I/O operations disabled because the data on\n the volume was potentially inconsistent.

" + "smithy.api#documentation": "

Enables I/O operations for a volume that had I/O operations disabled because the data on\n the volume was potentially inconsistent.

", + "smithy.api#examples": [ + { + "title": "To enable I/O for a volume", + "documentation": "This example enables I/O on volume ``vol-1234567890abcdef0``.", + "input": { + "VolumeId": "vol-1234567890abcdef0" + } + } + ] } }, "com.amazonaws.ec2#EnableVolumeIORequest": { @@ -50460,6 +51024,50 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#GetImageBlockPublicAccessState": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest" + }, + "output": { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessStateResult" + }, + "traits": { + "smithy.api#documentation": "

Gets the current state of block public access for AMIs at the account\n level in the specified Amazon Web Services Region.

\n

For more information, see Block\n public access to your AMIs in the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest": { + "type": "structure", + "members": { + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#default": false, + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#GetImageBlockPublicAccessStateResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

The current state of block public access for AMIs at the account level in the specified\n Amazon Web Services Region.

\n

Possible values:

\n
    \n
  • \n

    \n block-new-sharing - Any attempt to publicly share your AMIs in the\n specified Region is blocked.

    \n
  • \n
  • \n

    \n unblocked - Your AMIs in the specified Region can be publicly\n shared.

    \n
  • \n
", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements": { "type": "operation", "input": { @@ -54698,6 +55306,28 @@ } } }, + "com.amazonaws.ec2#ImageBlockPublicAccessDisabledState": { + "type": "enum", + "members": { + "unblocked": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unblocked" + } + } + } + }, + "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState": { + "type": "enum", + "members": { + "block_new_sharing": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "block-new-sharing" + } + } + } + }, "com.amazonaws.ec2#ImageDiskContainer": { "type": "structure", "members": { @@ -63680,6 +64310,276 @@ "traits": { "smithy.api#enumValue": "hpc7a.96xlarge" } + }, + "c7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.medium" + } + }, + "c7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.large" + } + }, + "c7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.xlarge" + } + }, + "c7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.2xlarge" + } + }, + "c7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.4xlarge" + } + }, + "c7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.8xlarge" + } + }, + "c7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.12xlarge" + } + }, + "c7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.16xlarge" + } + }, + "m7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.medium" + } + }, + "m7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.large" + } + }, + "m7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.xlarge" + } + }, + "m7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.2xlarge" + } + }, + "m7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.4xlarge" + } + }, + "m7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.8xlarge" + } + }, + "m7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.12xlarge" + } + }, + "m7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.16xlarge" + } + }, + "r7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.medium" + } + }, + "r7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.large" + } + }, + "r7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.xlarge" + } + }, + "r7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.2xlarge" + } + }, + "r7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.4xlarge" + } + }, + "r7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.8xlarge" + } + }, + "r7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.12xlarge" + } + }, + "r7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.16xlarge" + } + }, + "r7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.medium" + } + }, + "r7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.large" + } + }, + "r7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.xlarge" + } + }, + "r7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.2xlarge" + } + }, + "r7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.4xlarge" + } + }, + "r7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.8xlarge" + } + }, + "r7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.12xlarge" + } + }, + "r7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.16xlarge" + } + }, + "r7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.24xlarge" + } + }, + "r7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.32xlarge" + } + }, + "r7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.48xlarge" + } + }, + "c7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.large" + } + }, + "c7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.xlarge" + } + }, + "c7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.2xlarge" + } + }, + "c7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.4xlarge" + } + }, + "c7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.8xlarge" + } + }, + "c7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.12xlarge" + } + }, + "c7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.16xlarge" + } + }, + "c7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.24xlarge" + } + }, + "c7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.48xlarge" + } + }, + "mac2_m2pro_metal": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mac2-m2pro.metal" + } } } }, @@ -70406,6 +71306,12 @@ "traits": { "smithy.api#enumValue": "availability-zone-id" } + }, + "outpost": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "outpost" + } } } }, @@ -71862,7 +72768,20 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified instance. You can specify only one\n attribute at a time.

\n

\n Note: Using this action to change the security groups\n associated with an elastic network interface (ENI) attached to an instance can\n result in an error if the instance has more than one ENI. To change the security groups\n associated with an ENI attached to an instance that has multiple ENIs, we recommend that\n you use the ModifyNetworkInterfaceAttribute action.

\n

To modify some attributes, the instance must be stopped. For more information, see\n Modify a stopped instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified instance. You can specify only one\n attribute at a time.

\n

\n Note: Using this action to change the security groups\n associated with an elastic network interface (ENI) attached to an instance can\n result in an error if the instance has more than one ENI. To change the security groups\n associated with an ENI attached to an instance that has multiple ENIs, we recommend that\n you use the ModifyNetworkInterfaceAttribute action.

\n

To modify some attributes, the instance must be stopped. For more information, see\n Modify a stopped instance in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To modify the instance type", + "documentation": "This example modifies the instance type of the specified stopped instance.", + "input": { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": { + "Value": "m5.large" + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyInstanceAttributeRequest": { @@ -73199,7 +74118,20 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified network interface attribute. You can specify only one\n attribute at a time. You can use this action to attach and detach security groups from\n an existing EC2 instance.

" + "smithy.api#documentation": "

Modifies the specified network interface attribute. You can specify only one\n attribute at a time. You can use this action to attach and detach security groups from\n an existing EC2 instance.

", + "smithy.api#examples": [ + { + "title": "To modify the attachment attribute of a network interface", + "documentation": "This example modifies the attachment attribute of the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-686ea200", + "Attachment": { + "AttachmentId": "eni-attach-43348162", + "DeleteOnTermination": false + } + } + } + ] } }, "com.amazonaws.ec2#ModifyNetworkInterfaceAttributeRequest": { @@ -73639,7 +74571,20 @@ "target": "com.amazonaws.ec2#ModifySpotFleetRequestResponse" }, "traits": { - "smithy.api#documentation": "

Modifies the specified Spot Fleet request.

\n

You can only modify a Spot Fleet request of type maintain.

\n

While the Spot Fleet request is being modified, it is in the modifying\n state.

\n

To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\n additional Spot Instances according to the allocation strategy for the Spot Fleet\n request. If the allocation strategy is lowestPrice, the Spot Fleet launches\n instances using the Spot Instance pool with the lowest price. If the allocation strategy\n is diversified, the Spot Fleet distributes the instances across the Spot\n Instance pools. If the allocation strategy is capacityOptimized, Spot Fleet\n launches instances from Spot Instance pools with optimal capacity for the number of instances\n that are launching.

\n

To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\n cancels any open requests that exceed the new target capacity. You can request that the\n Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\n new target capacity. If the allocation strategy is lowestPrice, the Spot\n Fleet terminates the instances with the highest price per unit. If the allocation\n strategy is capacityOptimized, the Spot Fleet terminates the instances in\n the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\n strategy is diversified, the Spot Fleet terminates instances across the\n Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\n at its current size, but not replace any Spot Instances that are interrupted or that you\n terminate manually.

\n

If you are finished with your Spot Fleet for now, but will use it again later, you can\n set the target capacity to 0.

" + "smithy.api#documentation": "

Modifies the specified Spot Fleet request.

\n

You can only modify a Spot Fleet request of type maintain.

\n

While the Spot Fleet request is being modified, it is in the modifying\n state.

\n

To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\n additional Spot Instances according to the allocation strategy for the Spot Fleet\n request. If the allocation strategy is lowestPrice, the Spot Fleet launches\n instances using the Spot Instance pool with the lowest price. If the allocation strategy\n is diversified, the Spot Fleet distributes the instances across the Spot\n Instance pools. If the allocation strategy is capacityOptimized, Spot Fleet\n launches instances from Spot Instance pools with optimal capacity for the number of instances\n that are launching.

\n

To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\n cancels any open requests that exceed the new target capacity. You can request that the\n Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\n new target capacity. If the allocation strategy is lowestPrice, the Spot\n Fleet terminates the instances with the highest price per unit. If the allocation\n strategy is capacityOptimized, the Spot Fleet terminates the instances in\n the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\n strategy is diversified, the Spot Fleet terminates instances across the\n Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\n at its current size, but not replace any Spot Instances that are interrupted or that you\n terminate manually.

\n

If you are finished with your Spot Fleet for now, but will use it again later, you can\n set the target capacity to 0.

", + "smithy.api#examples": [ + { + "title": "To increase the target capacity of a Spot fleet request", + "documentation": "This example increases the target capacity of the specified Spot fleet request.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "TargetCapacity": 20 + }, + "output": { + "Return": true + } + } + ] } }, "com.amazonaws.ec2#ModifySpotFleetRequestRequest": { @@ -76386,7 +77331,19 @@ "target": "com.amazonaws.ec2#MoveAddressToVpcResult" }, "traits": { - "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\n Elastic IP address must be allocated to your account for more than 24 hours, and it must not\n be associated with an instance. After the Elastic IP address is moved, it is no longer\n available for use in the EC2-Classic platform, unless you move it back using the\n RestoreAddressToClassic request. You cannot move an Elastic IP address that was\n originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\n Elastic IP address must be allocated to your account for more than 24 hours, and it must not\n be associated with an instance. After the Elastic IP address is moved, it is no longer\n available for use in the EC2-Classic platform, unless you move it back using the\n RestoreAddressToClassic request. You cannot move an Elastic IP address that was\n originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.

", + "smithy.api#examples": [ + { + "title": "To move an address to EC2-VPC", + "documentation": "This example moves the specified Elastic IP address to the EC2-VPC platform.", + "input": { + "PublicIp": "54.123.4.56" + }, + "output": { + "Status": "MoveInProgress" + } + } + ] } }, "com.amazonaws.ec2#MoveAddressToVpcRequest": { @@ -83494,7 +84451,20 @@ "target": "com.amazonaws.ec2#ReplaceNetworkAclAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network ACLs in the Amazon VPC User Guide.

\n

This is an idempotent operation.

" + "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network ACLs in the Amazon VPC User Guide.

\n

This is an idempotent operation.

", + "smithy.api#examples": [ + { + "title": "To replace the network ACL associated with a subnet", + "documentation": "This example associates the specified network ACL with the subnet for the specified network ACL association.", + "input": { + "AssociationId": "aclassoc-e5b95c8c", + "NetworkAclId": "acl-5fb85d36" + }, + "output": { + "NewAssociationId": "aclassoc-3999875b" + } + } + ] } }, "com.amazonaws.ec2#ReplaceNetworkAclAssociationRequest": { @@ -83560,7 +84530,25 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

" + "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To replace a network ACL entry", + "documentation": "This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Protocol": "17", + "RuleAction": "allow", + "Egress": false, + "CidrBlock": "203.0.113.12/24", + "PortRange": { + "From": 53, + "To": 53 + } + } + } + ] } }, "com.amazonaws.ec2#ReplaceNetworkAclEntryRequest": { @@ -83817,7 +84805,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

" + "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To replace a route", + "documentation": "This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "10.0.0.0/16", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#ReplaceRouteRequest": { @@ -83965,7 +84964,20 @@ "target": "com.amazonaws.ec2#ReplaceRouteTableAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon VPC User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

" + "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon VPC User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

", + "smithy.api#examples": [ + { + "title": "To replace the route table associated with a subnet", + "documentation": "This example associates the specified route table with the subnet for the specified route table association.", + "input": { + "AssociationId": "rtbassoc-781d0d1a", + "RouteTableId": "rtb-22574640" + }, + "output": { + "NewAssociationId": "rtbassoc-3a1f0f58" + } + } + ] } }, "com.amazonaws.ec2#ReplaceRouteTableAssociationRequest": { @@ -84651,7 +85663,39 @@ "target": "com.amazonaws.ec2#RequestSpotFleetResponse" }, "traits": { - "smithy.api#documentation": "

Creates a Spot Fleet request.

\n

The Spot Fleet request specifies the total target capacity and the On-Demand target\n capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\n capacity, and launches the difference as Spot capacity.

\n

You can submit a single request that includes multiple launch specifications that vary\n by instance type, AMI, Availability Zone, or subnet.

\n

By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\n price per unit is the lowest. Each launch specification can include its own instance\n weighting that reflects the value of the instance type to your application\n workload.

\n

Alternatively, you can specify that the Spot Fleet distribute the target capacity\n across the Spot pools included in its launch specifications. By ensuring that the Spot\n Instances in your Spot Fleet are in different Spot pools, you can improve the\n availability of your fleet.

\n

You can specify tags for the Spot Fleet request and instances launched by the fleet.\n You cannot tag other resource types in a Spot Fleet request because only the\n spot-fleet-request and instance resource types are\n supported.

\n

For more information, see Spot Fleet requests\n in the Amazon EC2 User Guide.

\n \n

We strongly discourage using the RequestSpotFleet API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide.

\n
" + "smithy.api#documentation": "

Creates a Spot Fleet request.

\n

The Spot Fleet request specifies the total target capacity and the On-Demand target\n capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\n capacity, and launches the difference as Spot capacity.

\n

You can submit a single request that includes multiple launch specifications that vary\n by instance type, AMI, Availability Zone, or subnet.

\n

By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\n price per unit is the lowest. Each launch specification can include its own instance\n weighting that reflects the value of the instance type to your application\n workload.

\n

Alternatively, you can specify that the Spot Fleet distribute the target capacity\n across the Spot pools included in its launch specifications. By ensuring that the Spot\n Instances in your Spot Fleet are in different Spot pools, you can improve the\n availability of your fleet.

\n

You can specify tags for the Spot Fleet request and instances launched by the fleet.\n You cannot tag other resource types in a Spot Fleet request because only the\n spot-fleet-request and instance resource types are\n supported.

\n

For more information, see Spot Fleet requests\n in the Amazon EC2 User Guide.

\n \n

We strongly discourage using the RequestSpotFleet API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To request a Spot fleet in the subnet with the lowest price", + "documentation": "This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.", + "input": { + "SpotFleetRequestConfig": { + "SpotPrice": "0.04", + "TargetCapacity": 2, + "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role", + "LaunchSpecifications": [ + { + "ImageId": "ami-1a2b3c4d", + "KeyName": "my-key-pair", + "SecurityGroups": [ + { + "GroupId": "sg-1a2b3c4d" + } + ], + "InstanceType": "m3.medium", + "SubnetId": "subnet-1a2b3c4d, subnet-3c4d5e6f", + "IamInstanceProfile": { + "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role" + } + } + ] + } + }, + "output": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + } + } + ] } }, "com.amazonaws.ec2#RequestSpotFleetRequest": { @@ -86212,7 +87256,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets an attribute of an instance to its default value. To reset the\n kernel or ramdisk, the instance must be in a stopped\n state. To reset the sourceDestCheck, the instance can be either running or\n stopped.

\n

The sourceDestCheck attribute controls whether source/destination\n checking is enabled. The default value is true, which means checking is\n enabled. This value must be false for a NAT instance to perform NAT. For\n more information, see NAT Instances in the\n Amazon VPC User Guide.

" + "smithy.api#documentation": "

Resets an attribute of an instance to its default value. To reset the\n kernel or ramdisk, the instance must be in a stopped\n state. To reset the sourceDestCheck, the instance can be either running or\n stopped.

\n

The sourceDestCheck attribute controls whether source/destination\n checking is enabled. The default value is true, which means checking is\n enabled. This value must be false for a NAT instance to perform NAT. For\n more information, see NAT Instances in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To reset the sourceDestCheck attribute", + "documentation": "This example resets the sourceDestCheck attribute for the specified instance.", + "input": { + "Attribute": "sourceDestCheck", + "InstanceId": "i-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetInstanceAttributeRequest": { @@ -99522,7 +100577,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Unassigns one or more secondary private IP addresses, or IPv4 Prefix Delegation prefixes from a \n \tnetwork interface.

" + "smithy.api#documentation": "

Unassigns one or more secondary private IP addresses, or IPv4 Prefix Delegation prefixes from a \n \tnetwork interface.

", + "smithy.api#examples": [ + { + "title": "To unassign a secondary private IP address from a network interface", + "documentation": "This example unassigns the specified private IP address from the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + "10.0.0.82" + ] + } + } + ] } }, "com.amazonaws.ec2#UnassignPrivateIpAddressesRequest": { diff --git a/aws/sdk/aws-models/ecs.json b/aws/sdk/aws-models/ecs.json index 37ba5292c62..e575905c962 100644 --- a/aws/sdk/aws-models/ecs.json +++ b/aws/sdk/aws-models/ecs.json @@ -1442,7 +1442,7 @@ "managedScaling": { "target": "com.amazonaws.ecs#ManagedScaling", "traits": { - "smithy.api#documentation": "

he managed scaling settings for the Auto Scaling group capacity provider.

" + "smithy.api#documentation": "

The managed scaling settings for the Auto Scaling group capacity provider.

" } }, "managedTerminationProtection": { @@ -2433,7 +2433,7 @@ "systemControls": { "target": "com.amazonaws.ecs#SystemControls", "traits": { - "smithy.api#documentation": "

A list of namespaced kernel parameters to set in the container. This parameter maps to\n\t\t\t\tSysctls in the Create a container section of the\n\t\t\tDocker Remote API and the --sysctl option to docker run.

\n \n

We don't recommended that you specify network-related systemControls\n\t\t\t\tparameters for multiple containers in a single task that also uses either the\n\t\t\t\t\tawsvpc or host network modes. For tasks that use the\n\t\t\t\t\tawsvpc network mode, the container that's started last determines\n\t\t\t\twhich systemControls parameters take effect. For tasks that use the\n\t\t\t\t\thost network mode, it changes the container instance's namespaced\n\t\t\t\tkernel parameters as well as the containers.

\n
" + "smithy.api#documentation": "

A list of namespaced kernel parameters to set in the container. This parameter maps to\n\t\t\t\tSysctls in the Create a container section of the\n\t\t\tDocker Remote API and the --sysctl option to docker run. For example, you can\n\t\t\tconfigure net.ipv4.tcp_keepalive_time setting to maintain\n\t\t\tlonger lived connections.

\n \n

We don't recommended that you specify network-related systemControls\n\t\t\t\tparameters for multiple containers in a single task that also uses either the\n\t\t\t\t\tawsvpc or host network modes. For tasks that use the\n\t\t\t\t\tawsvpc network mode, the container that's started last determines\n\t\t\t\twhich systemControls parameters take effect. For tasks that use the\n\t\t\t\t\thost network mode, it changes the container instance's namespaced\n\t\t\t\tkernel parameters as well as the containers.

\n
\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "resourceRequirements": { @@ -2562,7 +2562,7 @@ "target": "com.amazonaws.ecs#Integer", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

The number of tasks on the container instance that are in the RUNNING\n\t\t\tstatus.

" + "smithy.api#documentation": "

The number of tasks on the container instance that have a desired status (desiredStatus) of RUNNING.

" } }, "pendingTasksCount": { @@ -8318,7 +8318,7 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat are specified, the Amazon Resource Name\n\t\t\t(ARN) and resource ID format of the resource type for a specified user, role, or\n\t\t\tthe root user for an account is affected. The opt-in and opt-out account setting must be\n\t\t\tset for each Amazon ECS resource separately. The ARN and resource ID format of a resource\n\t\t\tis defined by the opt-in status of the user or role that created the resource. You\n\t\t\tmust turn on this setting to use Amazon ECS features such as resource tagging.

\n

When awsvpcTrunking is specified, the elastic network interface (ENI)\n\t\t\tlimit for any new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support the\n\t\t\tfeature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When containerInsights is specified, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When you specify serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat, the Amazon Resource Name (ARN) and\n\t\t\tresource ID format of the resource type for a specified user, role, or the root user for an\n\t\t\taccount is affected. The opt-in and opt-out account setting must be set for each Amazon ECS\n\t\t\tresource separately. The ARN and resource ID format of a resource is defined by the\n\t\t\topt-in status of the user or role that created the resource. You must turn on this\n\t\t\tsetting to use Amazon ECS features such as resource tagging.

\n

When you specify awsvpcTrunking, the elastic network interface (ENI) limit for\n\t\t\tany new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support\n\t\t\tthe feature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When you specify containerInsights, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

\n

When Amazon Web Services determines that a security or infrastructure update is needed for an Amazon ECS\n\t\t\ttask hosted on Fargate, the tasks need to be stopped and new tasks launched to replace\n\t\t\tthem. Use fargateTaskRetirementWaitPeriod to configure the wait time to\n\t\t\tretire a Fargate task. For information about the Fargate tasks maintenance, see Amazon Web Services Fargate task maintenance in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", "smithy.api#examples": [ { "title": "To modify your account settings", @@ -8384,14 +8384,14 @@ "name": { "target": "com.amazonaws.ecs#SettingName", "traits": { - "smithy.api#documentation": "

The resource name for which to modify the account setting. If\n\t\t\t\tserviceLongArnFormat is specified, the ARN for your Amazon ECS services is\n\t\t\taffected. If taskLongArnFormat is specified, the ARN and resource ID for\n\t\t\tyour Amazon ECS tasks is affected. If containerInstanceLongArnFormat is\n\t\t\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\n\t\t\t\tawsvpcTrunking is specified, the ENI limit for your Amazon ECS container\n\t\t\tinstances is affected. If containerInsights is specified, the default\n\t\t\tsetting for Amazon Web Services CloudWatch Container Insights for your clusters is affected. If\n\t\t\t\ttagResourceAuthorization is specified, the opt-in option for tagging\n\t\t\tresources on creation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide.

\n

When you specify fargateFIPSMode for the name and\n\t\t\tenabled for the value, Fargate uses FIPS-140 compliant\n\t\t\tcryptographic algorithms on your tasks. For more information about FIPS-140 compliance\n\t\t\twith Fargate, see Amazon Web Services Fargate Federal Information Processing Standard (FIPS) 140-2\n\t\t\t\tcompliance in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#documentation": "

The resource name for which to modify the account setting. If you specify\n\t\t\t\tserviceLongArnFormat, the ARN for your Amazon ECS services is affected. If\n\t\t\tyou specify taskLongArnFormat, the ARN and resource ID for your Amazon ECS\n\t\t\ttasks is affected. If you specify containerInstanceLongArnFormat, the ARN\n\t\t\tand resource ID for your Amazon ECS container instances is affected. If you specify\n\t\t\t\tawsvpcTrunking, the ENI limit for your Amazon ECS container instances is\n\t\t\taffected. If you specify containerInsights, the default setting for Amazon Web Services\n\t\t\tCloudWatch Container Insights for your clusters is affected. If you specify\n\t\t\t\ttagResourceAuthorization, the opt-in option for tagging resources on\n\t\t\tcreation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide. If you specify fargateTaskRetirementWaitPeriod, the\n\t\t\tdefault wait time to retire a Fargate task due to required maintenance is\n\t\t\taffected.

\n

When you specify fargateFIPSMode for the name and\n\t\t\tenabled for the value, Fargate uses FIPS-140 compliant\n\t\t\tcryptographic algorithms on your tasks. For more information about FIPS-140 compliance\n\t\t\twith Fargate, see Amazon Web Services Fargate Federal Information Processing Standard (FIPS) 140-2\n\t\t\t\tcompliance in the Amazon Elastic Container Service Developer Guide.

\n

When Amazon Web Services determines that a security or infrastructure update is needed for an Amazon ECS task\n\t\t\thosted on Fargate, the tasks need to be stopped and new tasks launched to replace\n\t\t\tthem. Use fargateTaskRetirementWaitPeriod to set the wait time to retire a\n\t\t\tFargate task to the default. For information about the Fargate tasks maintenance,\n\t\t\tsee Amazon Web Services Fargate task\n\t\t\t\tmaintenance in the Amazon ECS Developer Guide.

", "smithy.api#required": {} } }, "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

", + "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

\n

When you specify fargateTaskRetirementWaitPeriod for the\n\t\t\t\tname, the following are the valid values:

\n
    \n
  • \n

    \n 0 - Amazon Web Services sends the notification, and immediately retires the affected tasks.

    \n
  • \n
  • \n

    \n 7 - Amazon Web Services sends the notification, and waits 7 calendar days to retire the tasks.

    \n
  • \n
  • \n

    \n 14 - Amazon Web Services sends the notification, and waits 14 calendar days to retire the tasks.

    \n
  • \n
", "smithy.api#required": {} } } @@ -8420,21 +8420,21 @@ "name": { "target": "com.amazonaws.ecs#SettingName", "traits": { - "smithy.api#documentation": "

The Amazon ECS resource name for which to modify the account setting. If\n\t\t\t\tserviceLongArnFormat is specified, the ARN for your Amazon ECS services is\n\t\t\taffected. If taskLongArnFormat is specified, the ARN and resource ID for\n\t\t\tyour Amazon ECS tasks is affected. If containerInstanceLongArnFormat is\n\t\t\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\n\t\t\t\tawsvpcTrunking is specified, the elastic network interface (ENI) limit\n\t\t\tfor your Amazon ECS container instances is affected. If containerInsights is\n\t\t\tspecified, the default setting for Amazon Web Services CloudWatch Container Insights for your clusters is\n\t\t\taffected. If fargateFIPSMode is specified, Fargate FIPS 140 compliance is\n\t\t\taffected. If tagResourceAuthorization is specified, the opt-in option for\n\t\t\ttagging resources on creation is affected. For information about the opt-in timeline,\n\t\t\tsee Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#documentation": "

The Amazon ECS resource name for which to modify the account setting. If you specify\n\t\t\t\tserviceLongArnFormat, the ARN for your Amazon ECS services is affected. If\n\t\t\tyou specify taskLongArnFormat, the ARN and resource ID for your Amazon ECS\n\t\t\ttasks is affected. If you specify containerInstanceLongArnFormat, the ARN\n\t\t\tand resource ID for your Amazon ECS container instances is affected. If you specify\n\t\t\t\tawsvpcTrunking, the elastic network interface (ENI) limit for your\n\t\t\tAmazon ECS container instances is affected. If you specify containerInsights,\n\t\t\tthe default setting for Amazon Web Services CloudWatch Container Insights for your clusters is affected. If\n\t\t\tyou specify fargateFIPSMode, Fargate FIPS 140 compliance is affected. If\n\t\t\tyou specify tagResourceAuthorization, the opt-in option for tagging\n\t\t\tresources on creation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide. If you specify fargateTaskRetirementWaitPeriod, the\n\t\t\twait time to retire a Fargate task is affected.

", "smithy.api#required": {} } }, "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

", + "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

\n

When you specify fargateTaskRetirementWaitPeriod for the name, the\n\t\t\tfollowing are the valid values:

\n
    \n
  • \n

    \n 0 - Amazon Web Services sends the notification, and immediately retires the affected tasks.

    \n
  • \n
  • \n

    \n 7 - Amazon Web Services sends the notification, and waits 7 calendar days to retire the tasks.

    \n
  • \n
  • \n

    \n 14 - Amazon Web Services sends the notification, and waits 14 calendar days to retire the tasks.

    \n
  • \n
", "smithy.api#required": {} } }, "principalArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The ARN of the principal, which can be a user, role, or the root user. If\n\t\t\tyou specify the root user, it modifies the account setting for all users, roles,\n\t\t\tand the root user of the account unless a user or role explicitly overrides these\n\t\t\tsettings. If this field is omitted, the setting is changed only for the authenticated\n\t\t\tuser.

\n \n

Federated users assume the account setting of the root user and can't have\n\t\t\t\texplicit account settings set for them.

\n
" + "smithy.api#documentation": "

The ARN of the principal, which can be a user, role, or the root user. If\n\t\t\tyou specify the root user, it modifies the account setting for all users, roles,\n\t\t\tand the root user of the account unless a user or role explicitly overrides these\n\t\t\tsettings. If this field is omitted, the setting is changed only for the authenticated\n\t\t\tuser.

\n \n

You must use the root user when you set the Fargate wait time\n\t\t\t\t\t(fargateTaskRetirementWaitPeriod).

\n

Federated users assume the account setting of the root user and can't have\n\t\t\t\texplicit account settings set for them.

\n
" } } }, @@ -8837,7 +8837,7 @@ "pidMode": { "target": "com.amazonaws.ecs#PidMode", "traits": { - "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. If host\n is specified, then all containers within the tasks that specified the\n host PID mode on the same container instance share the\n same process namespace with the host Amazon EC2 instance. If task is\n specified, all containers within the specified task share the same\n process namespace. If no value is specified, the default is a private\n namespace. For more information, see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, be aware that there is a\n heightened risk of undesired process namespace expose. For more\n information, see Docker\n security.

\n \n

This parameter is not supported for Windows containers or tasks run on Fargate.

\n
" + "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. On Fargate for\n Linux containers, the only valid value is task. For\n example, monitoring sidecars might need pidMode to access\n information about other containers running in the same task.

\n

If host is specified, all containers within the tasks\n that specified the host PID mode on the same container\n instance share the same process namespace with the host Amazon EC2\n instance.

\n

If task is specified, all containers within the specified\n task share the same process namespace.

\n

If no value is specified, the\n default is a private namespace for each container. For more information,\n see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, there's a heightened risk\n of undesired process namespace exposure. For more information, see\n Docker security.

\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "ipcMode": { @@ -9915,6 +9915,12 @@ "traits": { "smithy.api#enumValue": "tagResourceAuthorization" } + }, + "FARGATE_TASK_RETIREMENT_WAIT_PERIOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "fargateTaskRetirementWaitPeriod" + } } } }, @@ -10453,7 +10459,7 @@ "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The value for the namespaced kernel parameter that's specified in\n\t\t\t\tnamespace.

" + "smithy.api#documentation": "

The namespaced kernel parameter to set a\n\t\t\tvalue for.

\n

Valid IPC namespace values: \"kernel.msgmax\" | \"kernel.msgmnb\" | \"kernel.msgmni\"\n\t\t\t| \"kernel.sem\" | \"kernel.shmall\" | \"kernel.shmmax\" |\n\t\t\t\"kernel.shmmni\" | \"kernel.shm_rmid_forced\", and\n\t\t\tSysctls that start with\n\t\t\t\"fs.mqueue.*\"\n

\n

Valid network namespace values: Sysctls that start with\n\t\t\t\"net.*\"\n

\n

All of these values are supported by Fargate.

" } } }, @@ -10969,7 +10975,7 @@ "pidMode": { "target": "com.amazonaws.ecs#PidMode", "traits": { - "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. If host\n is specified, then all containers within the tasks that specified the\n host PID mode on the same container instance share the\n same process namespace with the host Amazon EC2 instance. If task is\n specified, all containers within the specified task share the same\n process namespace. If no value is specified, the default is a private\n namespace. For more information, see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, be aware that there is a\n heightened risk of undesired process namespace expose. For more\n information, see Docker\n security.

\n \n

This parameter is not supported for Windows containers or tasks run on Fargate.

\n
" + "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. On Fargate for\n Linux containers, the only valid value is task. For\n example, monitoring sidecars might need pidMode to access\n information about other containers running in the same task.

\n

If host is specified, all containers within the tasks\n that specified the host PID mode on the same container\n instance share the same process namespace with the host Amazon EC2\n instance.

\n

If task is specified, all containers within the specified\n task share the same process namespace.

\n

If no value is specified, the\n default is a private namespace for each container. For more information,\n see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, there's a heightened risk\n of undesired process namespace exposure. For more information, see\n Docker security.

\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "ipcMode": { diff --git a/aws/sdk/aws-models/route53.json b/aws/sdk/aws-models/route53.json index a987bda7ef8..cb171eb7c42 100644 --- a/aws/sdk/aws-models/route53.json +++ b/aws/sdk/aws-models/route53.json @@ -263,6 +263,7 @@ "arnNamespace": "route53", "cloudFormationName": "Route53", "cloudTrailEventSource": "route53.amazonaws.com", + "docId": "route53-2013-04-01", "endpointPrefix": "route53" }, "aws.auth#sigv4": { diff --git a/aws/sdk/aws-models/s3.json b/aws/sdk/aws-models/s3.json index 174eb169d20..d63436f320d 100644 --- a/aws/sdk/aws-models/s3.json +++ b/aws/sdk/aws-models/s3.json @@ -44,7 +44,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will\n wait before permanently removing all parts of the upload. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration in the\n Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will\n wait before permanently removing all parts of the upload. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration in\n the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#AbortMultipartUpload": { @@ -16357,7 +16357,7 @@ "target": "com.amazonaws.s3#CompleteMultipartUploadOutput" }, "traits": { - "smithy.api#documentation": "

Completes a multipart upload by assembling previously uploaded parts.

\n

You first initiate the multipart upload and then upload all parts using the UploadPart\n operation. After successfully uploading all relevant parts of an upload, you call this\n action to complete the upload. Upon receiving this request, Amazon S3 concatenates all the\n parts in ascending order by part number to create a new object. In the Complete Multipart\n Upload request, you must provide the parts list. You must ensure that the parts list is\n complete. This action concatenates the parts that you provide in the list. For each part in\n the list, you must provide the part number and the ETag value, returned after\n that part was uploaded.

\n

Processing of a Complete Multipart Upload request could take several minutes to\n complete. After Amazon S3 begins processing the request, it sends an HTTP response header that\n specifies a 200 OK response. While processing is in progress, Amazon S3 periodically sends white\n space characters to keep the connection from timing out. A request could fail after the\n initial 200 OK response has been sent. This means that a 200 OK response can\n contain either a success or an error. If you call the S3 API directly, make sure to design\n your application to parse the contents of the response and handle it appropriately. If you\n use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply\n error handling per your configuration settings (including automatically retrying the\n request as appropriate). If the condition persists, the SDKs throws an exception (or, for\n the SDKs that don't use exceptions, they return the error).

\n

Note that if CompleteMultipartUpload fails, applications should be prepared\n to retry the failed requests. For more information, see Amazon S3 Error Best\n Practices.

\n \n

You cannot use Content-Type: application/x-www-form-urlencoded with\n Complete Multipart Upload requests. Also, if you do not provide a\n Content-Type header, CompleteMultipartUpload returns a 200\n OK response.

\n
\n

For more information about multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information about permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

\n CompleteMultipartUpload has the following special errors:

\n
    \n
  • \n

    Error code: EntityTooSmall\n

    \n
      \n
    • \n

      Description: Your proposed upload is smaller than the minimum allowed object\n size. Each part must be at least 5 MB in size, except the last part.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPart\n

    \n
      \n
    • \n

      Description: One or more of the specified parts could not be found. The part\n might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPartOrder\n

    \n
      \n
    • \n

      Description: The list of parts was not in ascending order. The parts list\n must be specified in order by part number.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: NoSuchUpload\n

    \n
      \n
    • \n

      Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or\n completed.

      \n
    • \n
    • \n

      404 Not Found

      \n
    • \n
    \n
  • \n
\n

The following operations are related to CompleteMultipartUpload:

\n ", + "smithy.api#documentation": "

Completes a multipart upload by assembling previously uploaded parts.

\n

You first initiate the multipart upload and then upload all parts using the UploadPart\n operation. After successfully uploading all relevant parts of an upload, you call this\n action to complete the upload. Upon receiving this request, Amazon S3 concatenates all the parts\n in ascending order by part number to create a new object. In the Complete Multipart Upload\n request, you must provide the parts list. You must ensure that the parts list is complete.\n This action concatenates the parts that you provide in the list. For each part in the list,\n you must provide the part number and the ETag value, returned after that part\n was uploaded.

\n

Processing of a Complete Multipart Upload request could take several minutes to\n complete. After Amazon S3 begins processing the request, it sends an HTTP response header that\n specifies a 200 OK response. While processing is in progress, Amazon S3 periodically sends white\n space characters to keep the connection from timing out. A request could fail after the\n initial 200 OK response has been sent. This means that a 200 OK response can\n contain either a success or an error. If you call the S3 API directly, make sure to design\n your application to parse the contents of the response and handle it appropriately. If you\n use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply\n error handling per your configuration settings (including automatically retrying the\n request as appropriate). If the condition persists, the SDKs throws an exception (or, for\n the SDKs that don't use exceptions, they return the error).

\n

Note that if CompleteMultipartUpload fails, applications should be prepared\n to retry the failed requests. For more information, see Amazon S3 Error Best\n Practices.

\n \n

You cannot use Content-Type: application/x-www-form-urlencoded with\n Complete Multipart Upload requests. Also, if you do not provide a\n Content-Type header, CompleteMultipartUpload returns a 200\n OK response.

\n
\n

For more information about multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information about permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

\n CompleteMultipartUpload has the following special errors:

\n
    \n
  • \n

    Error code: EntityTooSmall\n

    \n
      \n
    • \n

      Description: Your proposed upload is smaller than the minimum allowed object\n size. Each part must be at least 5 MB in size, except the last part.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPart\n

    \n
      \n
    • \n

      Description: One or more of the specified parts could not be found. The part\n might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPartOrder\n

    \n
      \n
    • \n

      Description: The list of parts was not in ascending order. The parts list\n must be specified in order by part number.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: NoSuchUpload\n

    \n
      \n
    • \n

      Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or\n completed.

      \n
    • \n
    • \n

      404 Not Found

      \n
    • \n
    \n
  • \n
\n

The following operations are related to CompleteMultipartUpload:

\n ", "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?x-id=CompleteMultipartUpload", @@ -16730,7 +16730,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. The request can also result in a data retrieval charge for the\n source if the source storage class bills for data retrieval. For pricing information, see\n Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify new metadata.\n However, the access control list (ACL) is not preserved and is set to private for the user making the request. To\n override the default ACL setting, specify a new ACL when generating a copy request. For\n more information, see Using ACLs.

\n

To specify whether you want the object metadata copied from the source object or\n replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you can use\n the s3:x-amz-metadata-directive condition key to enforce certain metadata\n behavior when objects are uploaded. For more information, see Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list of\n Amazon S3-specific condition keys, see Actions, Resources, and Condition Keys for\n Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and must be\n specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the Etag\n matches or whether the object was modified before or after a specified date, use the\n following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the request\n and evaluate as follows, Amazon S3 returns 200 OK and copies the data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the request and\n evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When\n copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a different type\n of encryption setting for the target object, you can use other appropriate\n encryption-related headers to encrypt the target object with a KMS key, an Amazon S3 managed\n key, or a customer-provided key. With server-side encryption, Amazon S3 encrypts your data as it\n writes your data to disks in its data centers and decrypts the data when you access it. If the\n encryption setting in your request is different from the default encryption configuration\n of the destination bucket, the encryption setting in your request takes precedence. If the\n source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\n encryption information in your request so that Amazon S3 can decrypt the object for copying. For\n more information about server-side encryption, see Using Server-Side\n Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request\n Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based permissions.\n By default, all objects are private. Only the owner has full access control. When adding a\n new object, you can grant permissions to individual Amazon Web Services accounts or to predefined groups\n that are defined by Amazon S3. These permissions are then added to the ACL on the object. For more\n information, see Access Control List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced setting for\n S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use\n this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to the new\n object by default. When you copy the object over, you can optionally specify a different\n checksum algorithm to use with the x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of an object\n that is already stored in Amazon S3 by using the StorageClass parameter. For more\n information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER, you must restore a copy of\n this object before you can use it as a source object for the copy operation. For\n more information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current version of an object\n to copy. If the current version is a delete marker, Amazon S3 behaves as if the object was\n deleted. To copy a different version, use the versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version ID for\n the object being copied. This version ID is different from the version ID of the source\n object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version ID that\n Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", + "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. The request can also result in a data retrieval charge for the\n source if the source storage class bills for data retrieval. For pricing information, see\n Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify\n new metadata. However, the access control list (ACL) is not preserved and is set\n to private for the user making the request. To override the default ACL setting,\n specify a new ACL when generating a copy request. For more information, see Using\n ACLs.

\n

To specify whether you want the object metadata copied from the source object\n or replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you\n can use the s3:x-amz-metadata-directive condition key to enforce\n certain metadata behavior when objects are uploaded. For more information, see\n Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list\n of Amazon S3-specific condition keys, see Actions, Resources, and Condition\n Keys for Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and\n must be specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the\n Etag matches or whether the object was modified before or after a\n specified date, use the following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request and evaluate as follows, Amazon S3 returns 200 OK and copies the\n data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to\n true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request and evaluate as follows, Amazon S3 returns the 412 Precondition\n Failed response code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket.\n When copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a\n different type of encryption setting for the target object, you can use other\n appropriate encryption-related headers to encrypt the target object with a\n KMS key, an Amazon S3 managed key, or a customer-provided key. With server-side\n encryption, Amazon S3 encrypts your data as it writes your data to disks in its data\n centers and decrypts the data when you access it. If the encryption setting in\n your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If\n the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the\n necessary encryption information in your request so that Amazon S3 can decrypt the\n object for copying. For more information about server-side encryption, see Using\n Server-Side Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based\n permissions. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups that are defined by Amazon S3. These permissions\n are then added to the ACL on the object. For more information, see Access Control\n List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced\n setting for S3 Object Ownership, ACLs are disabled and no longer affect\n permissions. Buckets that use this setting only accept PUT requests\n that don't specify an ACL or PUT requests that specify bucket owner\n full control ACLs, such as the bucket-owner-full-control canned ACL\n or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling\n ownership of objects and disabling ACLs in the\n Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership,\n all objects written to the bucket by any account will be owned by the bucket\n owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to\n the new object by default. When you copy the object over, you can optionally\n specify a different checksum algorithm to use with the\n x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of\n an object that is already stored in Amazon S3 by using the StorageClass\n parameter. For more information, see Storage Classes in\n the Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER or\n DEEP_ARCHIVE, or the object's storage class is\n INTELLIGENT_TIERING and it's S3 Intelligent-Tiering access tier is\n Archive Access or Deep Archive Access, you must restore a copy of this object\n before you can use it as a source object for the copy operation. For more\n information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current\n version of an object to copy. If the current version is a delete marker, Amazon S3\n behaves as if the object was deleted. To copy a different version, use the\n versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version\n ID for the object being copied. This version ID is different from the version ID\n of the source object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version\n ID that Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", "smithy.api#examples": [ { "title": "To copy an object", @@ -17013,7 +17013,7 @@ "StorageClass": { "target": "com.amazonaws.s3#StorageClass", "traits": { - "smithy.api#documentation": "

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

", + "smithy.api#documentation": "

If the x-amz-storage-class header is not used, the copied object will be stored in the\n STANDARD Storage Class by default. The STANDARD storage class provides high durability and\n high availability. Depending on performance needs, you can specify a different Storage\n Class. Amazon S3 on Outposts only uses the OUTPOSTS Storage Class. For more information, see\n Storage\n Classes in the Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-storage-class" } }, @@ -17048,7 +17048,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Specifies the KMS key ID to use for object encryption. All GET and PUT requests for an\n object protected by KMS will fail if they're not made via SSL or using SigV4. For\n information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see\n Specifying the\n Signature Version in Request Authentication in the\n Amazon S3 User Guide.

", + "smithy.api#documentation": "

Specifies the KMS ID (Key ID, Key ARN, or Key Alias) to use for object encryption. All GET and PUT requests for an\n object protected by KMS will fail if they're not made via SSL or using SigV4. For\n information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see\n Specifying the\n Signature Version in Request Authentication in the\n Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, @@ -17282,16 +17282,19 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. You might choose a Region to optimize\n latency, minimize costs, or address regulatory requirements. For example, if you reside in\n Europe, you will probably find it advantageous to create buckets in the Europe (Ireland)\n Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature calculations in\n Signature Version 4 must use us-east-1 as the Region, even if the location constraint in\n the request specifies another Region where the bucket is to be created. If you create a\n bucket in a Region other than US East (N. Virginia), your application must be able to\n handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are required when\n your CreateBucket request includes specific headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your CreateBucket request\n specifies access control list (ACL) permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through any other\n ACL, both s3:CreateBucket and s3:PutBucketAcl permissions\n are needed. If the ACL for the CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.

    \n
  • \n
  • \n

    \n Object Lock - If ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your CreateBucket request includes the x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By default, ObjectOwnership is set to BucketOWnerEnforced and ACLs are disabled. We recommend keeping\n ACLs disabled, except in uncommon use cases where you must control access for each object individually. If you want to change the ObjectOwnership setting, you can use the \n x-amz-object-ownership header in your CreateBucket request to set the ObjectOwnership setting of your choice.\n For more information about S3 Object Ownership, see Controlling object\n ownership in the Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your specific use case requires granting public access to your S3 resources, you can disable Block Public Access. You can create a new bucket with Block Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all Block\n Public Access settings are enabled for new buckets. To avoid inadvertent exposure of\n your resources, we recommend keeping the S3 Block Public Access settings enabled. For more information about S3 Block Public Access, see Blocking public\n access to your Amazon S3 storage in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for Amazon S3 Object Ownership\n and specifies a bucket ACL that provides access to an external Amazon Web Services account, your request fails with a 400 error and returns the InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.

\n
\n

The following operations are related to CreateBucket:

\n ", + "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. To constrain the bucket creation to a\n specific Region, you can use \n LocationConstraint\n condition key. You might choose a Region to\n optimize latency, minimize costs, or address regulatory requirements. For example, if you\n reside in Europe, you will probably find it advantageous to create buckets in the Europe\n (Ireland) Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature\n calculations in Signature Version 4 must use us-east-1 as the Region, even\n if the location constraint in the request specifies another Region where the bucket is\n to be created. If you create a bucket in a Region other than US East (N. Virginia), your\n application must be able to handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are\n required when your CreateBucket request includes specific\n headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your\n CreateBucket request specifies access control list (ACL)\n permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through\n any other ACL, both s3:CreateBucket and\n s3:PutBucketAcl permissions are needed. If the ACL for the\n CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.\n

    \n
  • \n
  • \n

    \n Object Lock - If\n ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your\n CreateBucket request includes the\n x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By\n default, ObjectOwnership is set to\n BucketOWnerEnforced and ACLs are disabled. We recommend\n keeping ACLs disabled, except in uncommon use cases where you must control\n access for each object individually. If you want to change the\n ObjectOwnership setting, you can use the\n x-amz-object-ownership header in your\n CreateBucket request to set the ObjectOwnership\n setting of your choice. For more information about S3 Object Ownership, see\n Controlling\n object ownership in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your\n specific use case requires granting public access to your S3 resources, you\n can disable Block Public Access. You can create a new bucket with Block\n Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all\n Block Public Access settings are enabled for new buckets. To avoid\n inadvertent exposure of your resources, we recommend keeping the S3 Block\n Public Access settings enabled. For more information about S3 Block Public\n Access, see Blocking\n public access to your Amazon S3 storage in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for\n Amazon S3 Object Ownership and specifies a bucket ACL that provides access to an external\n Amazon Web Services account, your request fails with a 400 error and returns the\n InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.\n

\n
\n

The following operations are related to CreateBucket:

\n ", "smithy.api#examples": [ { - "title": "To create a bucket ", - "documentation": "The following example creates a bucket.", + "title": "To create a bucket in a specific region", + "documentation": "The following example creates a bucket. The request specifies an AWS region where to create the bucket.", "input": { - "Bucket": "examplebucket" + "Bucket": "examplebucket", + "CreateBucketConfiguration": { + "LocationConstraint": "eu-west-1" + } }, "output": { - "Location": "/examplebucket" + "Location": "http://examplebucket..s3.amazonaws.com/" } } ], @@ -17428,7 +17431,7 @@ "target": "com.amazonaws.s3#CreateMultipartUploadOutput" }, "traits": { - "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data\n by using server-side encryption with an Amazon S3 managed key (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3 encrypts\n your data as it writes it to disks in its data centers and decrypts it when you\n access it. You can request that Amazon S3 encrypts\n data at rest by using server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) – If you\n want Amazon Web Services to manage the keys used to encrypt data, specify the following\n headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object protected\n by KMS fail if you don't make them by using Secure Sockets Layer (SSL),\n Transport Layer Security (TLS), or Signature Version 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", + "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data by using server-side encryption with an Amazon S3 managed key\n (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3\n encrypts your data as it writes it to disks in its data centers and decrypts it\n when you access it. You can request that Amazon S3 encrypts data at rest by using\n server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) –\n If you want Amazon Web Services to manage the keys used to encrypt data, specify the\n following headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object\n protected by KMS fail if you don't make them by using Secure Sockets\n Layer (SSL), Transport Layer Security (TLS), or Signature Version\n 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", "smithy.api#examples": [ { "title": "To initiate a multipart upload", @@ -17457,7 +17460,7 @@ "AbortDate": { "target": "com.amazonaws.s3#AbortDate", "traits": { - "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, the response includes this header. The header indicates when the initiated\n multipart upload becomes eligible for an abort operation. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

The response also includes the x-amz-abort-rule-id header that provides the\n ID of the lifecycle configuration rule that defines this action.

", + "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, the response includes this header. The header indicates when the initiated\n multipart upload becomes eligible for an abort operation. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

The response also includes the x-amz-abort-rule-id header that provides the\n ID of the lifecycle configuration rule that defines this action.

", "smithy.api#httpHeader": "x-amz-abort-date" } }, @@ -17700,7 +17703,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Specifies the ID of the symmetric encryption customer managed key to use for object encryption.\n All GET and PUT requests for an object protected by KMS will fail if they're not made via\n SSL or using SigV4. For information about configuring any of the officially supported Amazon Web Services\n SDKs and Amazon Web Services CLI, see Specifying the Signature Version in Request Authentication\n in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Specifies the ID (Key ID, Key ARN, or Key Alias) of the symmetric encryption customer managed key to use for object encryption.\n All GET and PUT requests for an object protected by KMS will fail if they're not made via\n SSL or using SigV4. For information about configuring any of the officially supported Amazon Web Services\n SDKs and Amazon Web Services CLI, see Specifying the Signature Version in Request Authentication\n in the Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, @@ -17983,7 +17986,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the DELETE action resets the default encryption for the\n bucket as server-side encryption with Amazon S3 managed keys (SSE-S3). For information about the\n bucket default encryption feature, see Amazon S3 Bucket Default Encryption\n in the Amazon S3 User Guide.

\n

To use this operation, you must have permissions to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketEncryption:

\n ", + "smithy.api#documentation": "

This implementation of the DELETE action resets the default encryption for the bucket as\n server-side encryption with Amazon S3 managed keys (SSE-S3). For information about the bucket\n default encryption feature, see Amazon S3 Bucket Default Encryption\n in the Amazon S3 User Guide.

\n

To use this operation, you must have permissions to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketEncryption:

\n ", "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?encryption", @@ -18267,7 +18270,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", + "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", "smithy.api#examples": [ { "title": "To delete bucket policy", @@ -18589,13 +18592,12 @@ "smithy.api#documentation": "

Removes the null version (if there is one) of an object and inserts a delete marker,\n which becomes the latest version of the object. If there isn't a null version, Amazon S3 does\n not remove any objects but will still respond that the command was successful.

\n

To remove a specific version, you must use the version Id subresource. Using this\n subresource permanently deletes the version. If the object deleted is a delete marker, Amazon S3\n sets the response header, x-amz-delete-marker, to true.

\n

If the object you want to delete is in a bucket where the bucket versioning\n configuration is MFA Delete enabled, you must include the x-amz-mfa request\n header in the DELETE versionId request. Requests that include\n x-amz-mfa must use HTTPS.

\n

For more information about MFA Delete, see Using MFA Delete. To see sample\n requests that use versioning, see Sample\n Request.

\n

You can delete objects by explicitly calling DELETE Object or configure its lifecycle\n (PutBucketLifecycle) to enable Amazon S3 to remove them for you. If you want to block\n users or accounts from removing or deleting objects from your bucket, you must deny them\n the s3:DeleteObject, s3:DeleteObjectVersion, and\n s3:PutLifeCycleConfiguration actions.

\n

The following action is related to DeleteObject:

\n ", "smithy.api#examples": [ { - "title": "To delete an object", - "documentation": "The following example deletes an object from an S3 bucket.", + "title": "To delete an object (from a non-versioned bucket)", + "documentation": "The following example deletes an object from a non-versioned bucket.", "input": { - "Bucket": "examplebucket", - "Key": "objectkey.jpg" - }, - "output": {} + "Bucket": "ExampleBucket", + "Key": "HappyFace.jpg" + } } ], "smithy.api#http": { @@ -18612,7 +18614,7 @@ "target": "com.amazonaws.s3#DeleteMarker", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the versioned object that was permanently deleted was (true) or was\n not (false) a delete marker.

", + "smithy.api#documentation": "

Indicates whether the specified object version that was permanently deleted was (true) or was\n not (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or\n not (false) the current version of the object is a delete marker.

", "smithy.api#httpHeader": "x-amz-delete-marker" } }, @@ -18708,15 +18710,14 @@ "smithy.api#documentation": "

Removes the entire tag set from the specified object. For more information about\n managing object tags, see Object Tagging.

\n

To use this operation, you must have permission to perform the\n s3:DeleteObjectTagging action.

\n

To delete tags of a specific object version, add the versionId query\n parameter in the request. You will need permission for the\n s3:DeleteObjectVersionTagging action.

\n

The following operations are related to DeleteObjectTagging:

\n ", "smithy.api#examples": [ { - "title": "To remove tag set from an object version", - "documentation": "The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.", + "title": "To remove tag set from an object", + "documentation": "The following example removes tag set associated with the specified object. If the bucket is versioning enabled, the operation removes tag set from the latest object version.", "input": { "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + "Key": "HappyFace.jpg" }, "output": { - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + "VersionId": "null" } } ], @@ -18796,7 +18797,41 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

This action enables you to delete multiple objects from a bucket using a single HTTP\n request. If you know the object keys that you want to delete, then this action provides a\n suitable alternative to sending individual delete requests, reducing per-request\n overhead.

\n

The request contains a list of up to 1000 keys that you want to delete. In the XML, you\n provide the object key names, and optionally, version IDs if you want to delete a specific\n version of the object from a versioning-enabled bucket. For each key, Amazon S3 performs a\n delete action and returns the result of that delete, success, or failure, in the response.\n Note that if the object specified in the request is not found, Amazon S3 returns the result as\n deleted.

\n

The action supports two modes for the response: verbose and quiet. By default, the\n action uses verbose mode in which the response includes the result of deletion of each key\n in your request. In quiet mode the response includes only keys where the delete action\n encountered an error. For a successful deletion, the action does not return any information\n about the delete in the response body.

\n

When performing this action on an MFA Delete enabled bucket, that attempts to delete any\n versioned objects, you must include an MFA token. If you do not provide one, the entire\n request will fail, even if there are non-versioned objects you are trying to delete. If you\n provide an invalid token, whether there are versioned keys in the request or not, the\n entire Multi-Object Delete request will fail. For information about MFA Delete, see MFA\n Delete.

\n

Finally, the Content-MD5 header is required for all Multi-Object Delete requests. Amazon S3 uses the header value to ensure that your request body has not been altered in\n transit.

\n

The following operations are related to DeleteObjects:

\n ", + "smithy.api#documentation": "

This action enables you to delete multiple objects from a bucket using a single HTTP\n request. If you know the object keys that you want to delete, then this action provides a\n suitable alternative to sending individual delete requests, reducing per-request\n overhead.

\n

The request contains a list of up to 1000 keys that you want to delete. In the XML, you\n provide the object key names, and optionally, version IDs if you want to delete a specific\n version of the object from a versioning-enabled bucket. For each key, Amazon S3 performs a\n delete action and returns the result of that delete, success, or failure, in the response.\n Note that if the object specified in the request is not found, Amazon S3 returns the result as\n deleted.

\n

The action supports two modes for the response: verbose and quiet. By default, the\n action uses verbose mode in which the response includes the result of deletion of each key\n in your request. In quiet mode the response includes only keys where the delete action\n encountered an error. For a successful deletion, the action does not return any information\n about the delete in the response body.

\n

When performing this action on an MFA Delete enabled bucket, that attempts to delete any\n versioned objects, you must include an MFA token. If you do not provide one, the entire\n request will fail, even if there are non-versioned objects you are trying to delete. If you\n provide an invalid token, whether there are versioned keys in the request or not, the\n entire Multi-Object Delete request will fail. For information about MFA Delete, see MFA\n Delete.

\n

Finally, the Content-MD5 header is required for all Multi-Object Delete requests. Amazon S3\n uses the header value to ensure that your request body has not been altered in\n transit.

\n

The following operations are related to DeleteObjects:

\n ", + "smithy.api#examples": [ + { + "title": "To delete multiple object versions from a versioned bucket", + "documentation": "The following example deletes objects from a bucket. The request specifies object versions. S3 deletes specific object versions and returns the key and versions of deleted objects in the response.", + "input": { + "Bucket": "examplebucket", + "Delete": { + "Objects": [ + { + "Key": "HappyFace.jpg", + "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b" + }, + { + "Key": "HappyFace.jpg", + "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd" + } + ], + "Quiet": false + } + }, + "output": { + "Deleted": [ + { + "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd", + "Key": "HappyFace.jpg" + }, + { + "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b", + "Key": "HappyFace.jpg" + } + ] + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}?delete&x-id=DeleteObjects", @@ -18959,7 +18994,7 @@ "target": "com.amazonaws.s3#DeleteMarker", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the versioned object that was permanently deleted was (true) or was\n not (false) a delete marker. In a simple DELETE, this header indicates whether (true) or\n not (false) a delete marker was created.

" + "smithy.api#documentation": "

Indicates whether the specified object version that was permanently deleted was (true) or was\n not (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or\n not (false) the current version of the object is a delete marker.

" } }, "DeleteMarkerVersionId": { @@ -19535,7 +19570,7 @@ "target": "com.amazonaws.s3#GetBucketAccelerateConfigurationOutput" }, "traits": { - "smithy.api#documentation": "

This implementation of the GET action uses the accelerate subresource to\n return the Transfer Acceleration state of a bucket, which is either Enabled or\n Suspended. Amazon S3 Transfer Acceleration is a bucket-level feature that\n enables you to perform faster data transfers to and from Amazon S3.

\n

To use this operation, you must have permission to perform the\n s3:GetAccelerateConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

You set the Transfer Acceleration state of an existing bucket to Enabled or\n Suspended by using the PutBucketAccelerateConfiguration operation.

\n

A GET accelerate request does not return a state value for a bucket that\n has no transfer acceleration state. A bucket has no Transfer Acceleration state if a state\n has never been set on the bucket.

\n

For more information about transfer acceleration, see Transfer Acceleration in\n the Amazon S3 User Guide.

\n

The following operations are related to GetBucketAccelerateConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the GET action uses the accelerate subresource to\n return the Transfer Acceleration state of a bucket, which is either Enabled or\n Suspended. Amazon S3 Transfer Acceleration is a bucket-level feature that\n enables you to perform faster data transfers to and from Amazon S3.

\n

To use this operation, you must have permission to perform the\n s3:GetAccelerateConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

You set the Transfer Acceleration state of an existing bucket to Enabled or\n Suspended by using the PutBucketAccelerateConfiguration operation.

\n

A GET accelerate request does not return a state value for a bucket that\n has no transfer acceleration state. A bucket has no Transfer Acceleration state if a state\n has never been set on the bucket.

\n

For more information about transfer acceleration, see Transfer Acceleration in\n the Amazon S3 User Guide.

\n

The following operations are related to\n GetBucketAccelerateConfiguration:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?accelerate", @@ -19670,7 +19705,7 @@ "target": "com.amazonaws.s3#GetBucketAnalyticsConfigurationOutput" }, "traits": { - "smithy.api#documentation": "

This implementation of the GET action returns an analytics configuration (identified by\n the analytics configuration ID) from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:GetAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

For information about Amazon S3 analytics feature, see Amazon S3 Analytics – Storage Class\n Analysis in the Amazon S3 User Guide.

\n

The following operations are related to GetBucketAnalyticsConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the GET action returns an analytics configuration (identified by\n the analytics configuration ID) from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:GetAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

For information about Amazon S3 analytics feature, see Amazon S3 Analytics – Storage Class\n Analysis in the Amazon S3 User Guide.

\n

The following operations are related to\n GetBucketAnalyticsConfiguration:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?analytics&x-id=GetBucketAnalyticsConfiguration", @@ -20380,7 +20415,7 @@ "target": "com.amazonaws.s3#GetBucketPolicyOutput" }, "traits": { - "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", + "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", "smithy.api#examples": [ { "title": "To get bucket policy", @@ -20927,7 +20962,7 @@ "SHA1" ] }, - "smithy.api#documentation": "

Retrieves objects from Amazon S3. To use GET, you must have READ\n access to the object. If you grant READ access to the anonymous user, you can\n return the object without using an authorization header.

\n

An Amazon S3 bucket has no directory hierarchy such as you would find in a typical computer\n file system. You can, however, create a logical hierarchy by using object key names that\n imply a folder structure. For example, instead of naming an object sample.jpg,\n you can name it photos/2006/February/sample.jpg.

\n

To get an object from such a logical hierarchy, specify the full key name for the object\n in the GET operation. For a virtual hosted-style request example, if you have\n the object photos/2006/February/sample.jpg, specify the resource as\n /photos/2006/February/sample.jpg. For a path-style request example, if you\n have the object photos/2006/February/sample.jpg in the bucket named\n examplebucket, specify the resource as\n /examplebucket/photos/2006/February/sample.jpg. For more information about\n request types, see HTTP Host\n Header Bucket Specification.

\n

For more information about returning the ACL of an object, see GetObjectAcl.

\n

If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval or\n S3 Glacier Deep Archive storage class, or S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, before you can retrieve the object you must first restore a\n copy using RestoreObject. Otherwise, this action returns an\n InvalidObjectState error. For information about restoring archived objects,\n see Restoring\n Archived Objects.

\n

Encryption request headers, like x-amz-server-side-encryption, should not\n be sent for GET requests if your object uses server-side encryption with Key Management Service (KMS)\n keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with Amazon S3 managed encryption keys (SSE-S3). If your object does use\n these types of keys, you’ll get an HTTP 400 Bad Request error.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,\n you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n

Assuming you have the relevant permission to read object tags, the response also returns\n the x-amz-tagging-count header that provides the count of number of tags\n associated with the object. You can use GetObjectTagging to retrieve\n the tag set associated with an object.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation. For more\n information, see Specifying Permissions in a\n Policy. If the object that you request doesn’t exist, the error that Amazon S3 returns depends\n on whether you also have the s3:ListBucket permission.

\n

If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 (Not Found) error.

\n

If you don’t have the s3:ListBucket permission, Amazon S3 returns an\n HTTP status code 403 (\"access denied\") error.

\n
\n
Versioning
\n
\n

By default, the GET action returns the current version of an object. To return a\n different version, use the versionId subresource.

\n \n
    \n
  • \n

    If you supply a versionId, you need the\n s3:GetObjectVersion permission to access a specific version of an\n object. If you request a specific version, you do not need to have the\n s3:GetObject permission. If you request the current version\n without a specific version ID, only s3:GetObject permission is\n required. s3:GetObjectVersion permission won't be required.

    \n
  • \n
  • \n

    If the current version of the object is a delete marker, Amazon S3 behaves as if the\n object was deleted and includes x-amz-delete-marker: true in the\n response.

    \n
  • \n
\n
\n

For more information about versioning, see PutBucketVersioning.

\n
\n
Overriding Response Header Values
\n
\n

There are times when you want to override certain response header values in a GET\n response. For example, you might override the Content-Disposition response\n header value in your GET request.

\n

You can override values for a set of response headers using the following query\n parameters. These response header values are sent only on a successful request, that is,\n when status code 200 OK is returned. The set of headers you can override using these\n parameters is a subset of the headers that Amazon S3 accepts when you create an object. The\n response headers that you can override for the GET response are Content-Type,\n Content-Language, Expires, Cache-Control,\n Content-Disposition, and Content-Encoding. To override these\n header values in the GET response, you use the following request parameters.

\n \n

You must sign the request, either using an Authorization header or a presigned URL,\n when using these parameters. They cannot be used with an unsigned (anonymous)\n request.

\n
\n
    \n
  • \n

    \n response-content-type\n

    \n
  • \n
  • \n

    \n response-content-language\n

    \n
  • \n
  • \n

    \n response-expires\n

    \n
  • \n
  • \n

    \n response-cache-control\n

    \n
  • \n
  • \n

    \n response-content-disposition\n

    \n
  • \n
  • \n

    \n response-content-encoding\n

    \n
  • \n
\n
\n
Overriding Response Header Values
\n
\n

If both of the If-Match and If-Unmodified-Since headers are\n present in the request as follows: If-Match condition evaluates to\n true, and; If-Unmodified-Since condition evaluates to\n false; then, S3 returns 200 OK and the data requested.

\n

If both of the If-None-Match and If-Modified-Since headers are\n present in the request as follows: If-None-Match condition evaluates to\n false, and; If-Modified-Since condition evaluates to\n true; then, S3 returns 304 Not Modified response code.

\n

For more information about conditional requests, see RFC 7232.

\n
\n
\n

The following operations are related to GetObject:

\n ", + "smithy.api#documentation": "

Retrieves objects from Amazon S3. To use GET, you must have READ\n access to the object. If you grant READ access to the anonymous user, you can\n return the object without using an authorization header.

\n

An Amazon S3 bucket has no directory hierarchy such as you would find in a typical computer\n file system. You can, however, create a logical hierarchy by using object key names that\n imply a folder structure. For example, instead of naming an object sample.jpg,\n you can name it photos/2006/February/sample.jpg.

\n

To get an object from such a logical hierarchy, specify the full key name for the object\n in the GET operation. For a virtual hosted-style request example, if you have\n the object photos/2006/February/sample.jpg, specify the resource as\n /photos/2006/February/sample.jpg. For a path-style request example, if you\n have the object photos/2006/February/sample.jpg in the bucket named\n examplebucket, specify the resource as\n /examplebucket/photos/2006/February/sample.jpg. For more information about\n request types, see HTTP Host\n Header Bucket Specification.

\n

For more information about returning the ACL of an object, see GetObjectAcl.

\n

If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval or\n S3 Glacier Deep Archive storage class, or S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, before you can retrieve the object you must first restore a\n copy using RestoreObject. Otherwise, this action returns an\n InvalidObjectState error. For information about restoring archived objects,\n see Restoring\n Archived Objects.

\n

Encryption request headers, like x-amz-server-side-encryption, should not\n be sent for GET requests if your object uses server-side encryption with Key Management Service (KMS)\n keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with Amazon S3 managed encryption keys (SSE-S3). If your object does use\n these types of keys, you’ll get an HTTP 400 Bad Request error.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,\n you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n

Assuming you have the relevant permission to read object tags, the response also returns\n the x-amz-tagging-count header that provides the count of number of tags\n associated with the object. You can use GetObjectTagging to retrieve\n the tag set associated with an object.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation.\n For more information, see Specifying Permissions in\n a Policy. If the object that you request doesn’t exist, the error that\n Amazon S3 returns depends on whether you also have the s3:ListBucket\n permission.

\n

If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 (Not Found) error.

\n

If you don’t have the s3:ListBucket permission, Amazon S3 returns an\n HTTP status code 403 (\"access denied\") error.

\n
\n
Versioning
\n
\n

By default, the GET action returns the current version of an\n object. To return a different version, use the versionId\n subresource.

\n \n
    \n
  • \n

    If you supply a versionId, you need the\n s3:GetObjectVersion permission to access a specific\n version of an object. If you request a specific version, you do not need\n to have the s3:GetObject permission. If you request the\n current version without a specific version ID, only\n s3:GetObject permission is required.\n s3:GetObjectVersion permission won't be required.

    \n
  • \n
  • \n

    If the current version of the object is a delete marker, Amazon S3 behaves\n as if the object was deleted and includes x-amz-delete-marker:\n true in the response.

    \n
  • \n
\n
\n

For more information about versioning, see PutBucketVersioning.

\n
\n
Overriding Response Header Values
\n
\n

There are times when you want to override certain response header values in a\n GET response. For example, you might override the\n Content-Disposition response header value in your GET\n request.

\n

You can override values for a set of response headers using the following query\n parameters. These response header values are sent only on a successful request,\n that is, when status code 200 OK is returned. The set of headers you can override\n using these parameters is a subset of the headers that Amazon S3 accepts when you\n create an object. The response headers that you can override for the\n GET response are Content-Type,\n Content-Language, Expires,\n Cache-Control, Content-Disposition, and\n Content-Encoding. To override these header values in the\n GET response, you use the following request parameters.

\n \n

You must sign the request, either using an Authorization header or a\n presigned URL, when using these parameters. They cannot be used with an\n unsigned (anonymous) request.

\n
\n
    \n
  • \n

    \n response-content-type\n

    \n
  • \n
  • \n

    \n response-content-language\n

    \n
  • \n
  • \n

    \n response-expires\n

    \n
  • \n
  • \n

    \n response-cache-control\n

    \n
  • \n
  • \n

    \n response-content-disposition\n

    \n
  • \n
  • \n

    \n response-content-encoding\n

    \n
  • \n
\n
\n
Overriding Response Header Values
\n
\n

If both of the If-Match and If-Unmodified-Since\n headers are present in the request as follows: If-Match condition\n evaluates to true, and; If-Unmodified-Since condition\n evaluates to false; then, S3 returns 200 OK and the data requested.

\n

If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows: If-None-Match\n condition evaluates to false, and; If-Modified-Since\n condition evaluates to true; then, S3 returns 304 Not Modified\n response code.

\n

For more information about conditional requests, see RFC 7232.

\n
\n
\n

The following operations are related to GetObject:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?x-id=GetObject", @@ -21096,7 +21131,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves all the metadata from an object without returning the object itself. This\n action is useful if you're interested only in an object's metadata. To use\n GetObjectAttributes, you must have READ access to the object.

\n

\n GetObjectAttributes combines the functionality of HeadObject\n and ListParts. All of the data returned with each of those individual calls\n can be returned with a single call to GetObjectAttributes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

\n \n
    \n
  • \n

    Encryption request headers, such as x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side encryption\n with Amazon Web Services KMS keys stored in Amazon Web Services Key Management Service (SSE-KMS) or\n server-side encryption with Amazon S3 managed keys (SSE-S3). If your object does use\n these types of keys, you'll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Consider the following when using request headers:

\n
    \n
  • \n

    If both of the If-Match and If-Unmodified-Since headers\n are present in the request as follows, then Amazon S3 returns the HTTP status code\n 200 OK and the data requested:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true.

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false.

      \n
    • \n
    \n
  • \n
  • \n

    If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows, then Amazon S3 returns the HTTP status code\n 304 Not Modified:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false.

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true.

      \n
    • \n
    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

The permissions that you need to use this operation depend on whether the bucket is\n versioned. If the bucket is versioned, you need both the s3:GetObjectVersion\n and s3:GetObjectVersionAttributes permissions for this operation. If the\n bucket is not versioned, you need the s3:GetObject and\n s3:GetObjectAttributes permissions. For more information, see Specifying\n Permissions in a Policy in the Amazon S3 User Guide. If the\n object that you request does not exist, the error Amazon S3 returns depends on whether you also\n have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3 returns\n an HTTP status code 404 Not Found (\"no such key\") error.

    \n
  • \n
  • \n

    If you don't have the s3:ListBucket permission, Amazon S3 returns an HTTP\n status code 403 Forbidden (\"access denied\") error.

    \n
  • \n
\n
\n
\n

The following actions are related to GetObjectAttributes:

\n ", + "smithy.api#documentation": "

Retrieves all the metadata from an object without returning the object itself. This\n action is useful if you're interested only in an object's metadata. To use\n GetObjectAttributes, you must have READ access to the object.

\n

\n GetObjectAttributes combines the functionality of HeadObject\n and ListParts. All of the data returned with each of those individual calls\n can be returned with a single call to GetObjectAttributes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

\n \n
    \n
  • \n

    Encryption request headers, such as x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side encryption\n with Amazon Web Services KMS keys stored in Amazon Web Services Key Management Service (SSE-KMS) or\n server-side encryption with Amazon S3 managed keys (SSE-S3). If your object does use\n these types of keys, you'll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Consider the following when using request headers:

\n
    \n
  • \n

    If both of the If-Match and If-Unmodified-Since headers\n are present in the request as follows, then Amazon S3 returns the HTTP status code\n 200 OK and the data requested:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true.

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false.

      \n
    • \n
    \n
  • \n
  • \n

    If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows, then Amazon S3 returns the HTTP status code\n 304 Not Modified:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false.

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true.

      \n
    • \n
    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

The permissions that you need to use this operation depend on whether the\n bucket is versioned. If the bucket is versioned, you need both the\n s3:GetObjectVersion and s3:GetObjectVersionAttributes\n permissions for this operation. If the bucket is not versioned, you need the\n s3:GetObject and s3:GetObjectAttributes permissions.\n For more information, see Specifying Permissions in\n a Policy in the Amazon S3 User Guide. If the object\n that you request does not exist, the error Amazon S3 returns depends on whether you\n also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 Not Found (\"no such key\")\n error.

    \n
  • \n
  • \n

    If you don't have the s3:ListBucket permission, Amazon S3 returns\n an HTTP status code 403 Forbidden (\"access denied\")\n error.

    \n
  • \n
\n
\n
\n

The following actions are related to GetObjectAttributes:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?attributes", @@ -21302,7 +21337,7 @@ "ObjectAttributes": { "target": "com.amazonaws.s3#ObjectAttributesList", "traits": { - "smithy.api#documentation": "

Specifies the fields at the root level that you want returned in the\n response. Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the fields at the root level that you want returned in the response. Fields\n that you do not specify are not returned.

", "smithy.api#httpHeader": "x-amz-object-attributes", "smithy.api#required": {} } @@ -21972,19 +22007,22 @@ "smithy.api#documentation": "

Returns the tag-set of an object. You send the GET request against the tagging\n subresource associated with the object.

\n

To use this operation, you must have permission to perform the\n s3:GetObjectTagging action. By default, the GET action returns information\n about current version of an object. For a versioned bucket, you can have multiple versions\n of an object in your bucket. To retrieve tags of any other version, use the versionId query\n parameter. You also need permission for the s3:GetObjectVersionTagging\n action.

\n

By default, the bucket owner has this permission and can grant this permission to\n others.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

The following actions are related to GetObjectTagging:

\n ", "smithy.api#examples": [ { - "title": "To retrieve tag set of a specific object version", - "documentation": "The following example retrieves tag set of an object. The request specifies object version.", + "title": "To retrieve tag set of an object", + "documentation": "The following example retrieves tag set of an object.", "input": { "Bucket": "examplebucket", - "Key": "exampleobject", - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" + "Key": "HappyFace.jpg" }, "output": { - "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI", + "VersionId": "null", "TagSet": [ { - "Value": "Value1", - "Key": "Key1" + "Value": "Value4", + "Key": "Key4" + }, + { + "Value": "Value3", + "Key": "Key3" } ] } @@ -22333,7 +22371,7 @@ } ], "traits": { - "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in place of the\n bucket name or specify the access point ARN. When using the access point ARN, you must direct requests to\n the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", + "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in\n place of the bucket name or specify the access point ARN. When using the access point ARN, you must direct\n requests to the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", "smithy.api#examples": [ { "title": "To determine if bucket exists", @@ -22386,7 +22424,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \n If the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \n For more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the\n bucket name. If the Object Lambda access point alias in a request is not valid, the error code\n InvalidAccessPointAliasError is returned. For more information about\n InvalidAccessPointAliasError, see List of Error\n Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22420,7 +22458,7 @@ } ], "traits": { - "smithy.api#documentation": "

The HEAD action retrieves metadata from an object without returning the object itself.\n This action is useful if you're only interested in an object's metadata. To use HEAD, you\n must have READ access to the object.

\n

A HEAD request has the same options as a GET action on an\n object. The response is identical to the GET response except that there is no\n response body. Because of this, if the HEAD request generates an error, it\n returns a generic 400 Bad Request, 403 Forbidden or 404 Not\n Found code. It is not possible to retrieve the exact exception beyond these error\n codes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n \n
    \n
  • \n

    Encryption request headers, like x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side\n encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side encryption with Amazon S3\n managed encryption keys (SSE-S3). If your object does use these types of keys,\n you’ll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Request headers are limited to 8 KB in size. For more information, see Common\n Request Headers.

\n

Consider the following when using request headers:

\n
    \n
  • \n

    Consideration 1 – If both of the If-Match and\n If-Unmodified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true, and;

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false;

      \n
    • \n
    \n

    Then Amazon S3 returns 200 OK and the data requested.

    \n
  • \n
  • \n

    Consideration 2 – If both of the If-None-Match and\n If-Modified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false,\n and;

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true;

      \n
    • \n
    \n

    Then Amazon S3 returns the 304 Not Modified response code.

    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation. For more\n information, see Actions, resources, and condition keys for Amazon S3. \n If the object you request doesn't exist, the error that Amazon S3 returns depends\n on whether you also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3 returns\n an HTTP status code 404 error.

    \n
  • \n
  • \n

    If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP\n status code 403 error.

    \n
  • \n
\n
\n
\n

The following actions are related to HeadObject:

\n ", + "smithy.api#documentation": "

The HEAD action retrieves metadata from an object without returning the\n object itself. This action is useful if you're only interested in an object's metadata. To\n use HEAD, you must have READ access to the object.

\n

A HEAD request has the same options as a GET action on an\n object. The response is identical to the GET response except that there is no\n response body. Because of this, if the HEAD request generates an error, it\n returns a generic 400 Bad Request, 403 Forbidden or 404 Not\n Found code. It is not possible to retrieve the exact exception beyond these error\n codes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n \n
    \n
  • \n

    Encryption request headers, like x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side\n encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side encryption with Amazon S3\n managed encryption keys (SSE-S3). If your object does use these types of keys,\n you’ll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Request headers are limited to 8 KB in size. For more information, see Common\n Request Headers.

\n

Consider the following when using request headers:

\n
    \n
  • \n

    Consideration 1 – If both of the If-Match and\n If-Unmodified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true, and;

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false;

      \n
    • \n
    \n

    Then Amazon S3 returns 200 OK and the data requested.

    \n
  • \n
  • \n

    Consideration 2 – If both of the If-None-Match and\n If-Modified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false,\n and;

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true;

      \n
    • \n
    \n

    Then Amazon S3 returns the 304 Not Modified response code.

    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation.\n For more information, see Actions, resources, and condition\n keys for Amazon S3. If the object you request doesn't exist, the error that\n Amazon S3 returns depends on whether you also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 error.

    \n
  • \n
  • \n

    If you don’t have the s3:ListBucket permission, Amazon S3 returns\n an HTTP status code 403 error.

    \n
  • \n
\n
\n
\n

The following actions are related to HeadObject:

\n ", "smithy.api#http": { "method": "HEAD", "uri": "/{Bucket}/{Key+}", @@ -23538,7 +23576,7 @@ "Date": { "target": "com.amazonaws.s3#Date", "traits": { - "smithy.api#documentation": "

Indicates at what date the object is to be moved or deleted. The date value must conform to the ISO 8601 format. \n The time is always midnight UTC.

" + "smithy.api#documentation": "

Indicates at what date the object is to be moved or deleted. The date value must conform\n to the ISO 8601 format. The time is always midnight UTC.

" } }, "Days": { @@ -24511,7 +24549,7 @@ "OptionalObjectAttributes": { "target": "com.amazonaws.s3#OptionalObjectAttributesList", "traits": { - "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response.\n Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", "smithy.api#httpHeader": "x-amz-optional-object-attributes" } } @@ -24651,7 +24689,7 @@ "Marker": { "target": "com.amazonaws.s3#Marker", "traits": { - "smithy.api#documentation": "

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after\n this specified key. Marker can be any key in the bucket.

", + "smithy.api#documentation": "

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after this\n specified key. Marker can be any key in the bucket.

", "smithy.api#httpQuery": "marker" } }, @@ -24659,7 +24697,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n

", "smithy.api#httpQuery": "max-keys" } }, @@ -24687,7 +24725,7 @@ "OptionalObjectAttributes": { "target": "com.amazonaws.s3#OptionalObjectAttributesList", "traits": { - "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response.\n Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", "smithy.api#httpHeader": "x-amz-optional-object-attributes" } } @@ -24897,7 +24935,7 @@ "OptionalObjectAttributes": { "target": "com.amazonaws.s3#OptionalObjectAttributesList", "traits": { - "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response.\n Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", "smithy.api#httpHeader": "x-amz-optional-object-attributes" } } @@ -24935,7 +24973,7 @@ "AbortDate": { "target": "com.amazonaws.s3#AbortDate", "traits": { - "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, then the response includes this header indicating when the initiated multipart\n upload will become eligible for abort operation. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

The response will also include the x-amz-abort-rule-id header that will\n provide the ID of the lifecycle configuration rule that defines this action.

", + "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, then the response includes this header indicating when the initiated multipart\n upload will become eligible for abort operation. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

The response will also include the x-amz-abort-rule-id header that will\n provide the ID of the lifecycle configuration rule that defines this action.

", "smithy.api#httpHeader": "x-amz-abort-date" } }, @@ -25625,7 +25663,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies object key name filtering rules. For information about key name filtering, see\n Configuring event notifications using object key name filtering in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies object key name filtering rules. For information about key name filtering, see\n Configuring event\n notifications using object key name filtering in the\n Amazon S3 User Guide.

" } }, "com.amazonaws.s3#NotificationId": { @@ -25684,7 +25722,7 @@ "RestoreStatus": { "target": "com.amazonaws.s3#RestoreStatus", "traits": { - "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must be restored\n before they can be retrieved. For more information about these storage classes and how to work with\n archived objects, see \n Working with archived objects in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" } } }, @@ -26200,7 +26238,7 @@ "RestoreStatus": { "target": "com.amazonaws.s3#RestoreStatus", "traits": { - "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must be restored\n before they can be retrieved. For more information about these storage classes and how to work with\n archived objects, see \n Working with archived objects in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" } } }, @@ -26695,7 +26733,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. Specify the canned ACL name as the\n value of x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n the x-amz-acl header to set a canned ACL. These parameters map to the\n set of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants create,\n overwrite, and delete objects permission to LogDelivery group predefined by Amazon S3 and\n two Amazon Web Services accounts identified by their email addresses.

    \n

    \n x-amz-grant-write: uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\",\n id=\"111122223333\", id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", + "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3\n supports a set of predefined ACLs, known as canned\n ACLs. Each canned ACL has a predefined set of grantees and\n permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other\n access control-specific headers in your request. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers,\n you specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3\n groups) who will receive the permission. If you use these ACL-specific\n headers, you cannot use the x-amz-acl header to set a canned\n ACL. These parameters map to the set of permissions that Amazon S3 supports in an\n ACL. For more information, see Access Control List (ACL)\n Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants\n create, overwrite, and delete objects permission to LogDelivery group\n predefined by Amazon S3 and two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-write:\n uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\", id=\"111122223333\",\n id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights\n (using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET\n Object acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", "smithy.api#examples": [ { "title": "Put bucket acl", @@ -26813,7 +26851,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Sets an analytics configuration for the bucket (specified by the analytics configuration\n ID). You can have up to 1,000 analytics configurations per bucket.

\n

You can choose to have storage class analysis export analysis reports sent to a\n comma-separated values (CSV) flat file. See the DataExport request element.\n Reports are updated daily and are based on the object filters that you configure. When\n selecting data export, you specify a destination bucket and an optional destination prefix\n where the file is written. You can export the data to a destination bucket in a different\n account. However, the destination bucket must be in the same Region as the bucket that you\n are making the PUT analytics configuration to. For more information, see Amazon S3\n Analytics – Storage Class Analysis.

\n \n

You must create a bucket policy on the destination bucket where the exported file is\n written to grant permissions to Amazon S3 to write objects to the bucket. For an example\n policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketAnalyticsConfiguration has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: InvalidArgument\n

      \n
    • \n
    • \n

      \n Cause: Invalid argument.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: TooManyConfigurations\n

      \n
    • \n
    • \n

      \n Cause: You are attempting to create a new configuration but have\n already reached the 1,000-configuration limit.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 403 Forbidden\n

      \n
    • \n
    • \n

      \n Code: AccessDenied\n

      \n
    • \n
    • \n

      \n Cause: You are not the owner of the specified bucket, or you do\n not have the s3:PutAnalyticsConfiguration bucket permission to set the\n configuration on the bucket.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketAnalyticsConfiguration:

\n ", + "smithy.api#documentation": "

Sets an analytics configuration for the bucket (specified by the analytics configuration\n ID). You can have up to 1,000 analytics configurations per bucket.

\n

You can choose to have storage class analysis export analysis reports sent to a\n comma-separated values (CSV) flat file. See the DataExport request element.\n Reports are updated daily and are based on the object filters that you configure. When\n selecting data export, you specify a destination bucket and an optional destination prefix\n where the file is written. You can export the data to a destination bucket in a different\n account. However, the destination bucket must be in the same Region as the bucket that you\n are making the PUT analytics configuration to. For more information, see Amazon S3\n Analytics – Storage Class Analysis.

\n \n

You must create a bucket policy on the destination bucket where the exported file is\n written to grant permissions to Amazon S3 to write objects to the bucket. For an example\n policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketAnalyticsConfiguration has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: InvalidArgument\n

      \n
    • \n
    • \n

      \n Cause: Invalid argument.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: TooManyConfigurations\n

      \n
    • \n
    • \n

      \n Cause: You are attempting to create a new configuration but have\n already reached the 1,000-configuration limit.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 403 Forbidden\n

      \n
    • \n
    • \n

      \n Code: AccessDenied\n

      \n
    • \n
    • \n

      \n Cause: You are not the owner of the specified bucket, or you do\n not have the s3:PutAnalyticsConfiguration bucket permission to set the\n configuration on the bucket.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to\n PutBucketAnalyticsConfiguration:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?analytics", @@ -26990,7 +27028,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

This action uses the encryption subresource to configure default encryption\n and Amazon S3 Bucket Keys for an existing bucket.

\n

By default, all buckets have a default encryption configuration that uses server-side\n encryption with Amazon S3 managed keys (SSE-S3). You can optionally configure default encryption\n for a bucket by using server-side encryption with Key Management Service (KMS) keys (SSE-KMS),\n dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side\n encryption with customer-provided keys (SSE-C). If you specify default encryption by using\n SSE-KMS, you can also configure Amazon S3 Bucket Keys. For information about bucket default\n encryption, see Amazon S3 bucket default encryption\n in the Amazon S3 User Guide. For more information about S3 Bucket Keys, see\n Amazon S3 Bucket\n Keys in the Amazon S3 User Guide.

\n \n

This action requires Amazon Web Services Signature Version 4. For more information, see \n Authenticating Requests (Amazon Web Services Signature Version 4).

\n
\n

To use this operation, you must have permission to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to PutBucketEncryption:

\n ", + "smithy.api#documentation": "

This action uses the encryption subresource to configure default encryption\n and Amazon S3 Bucket Keys for an existing bucket.

\n

By default, all buckets have a default encryption configuration that uses server-side\n encryption with Amazon S3 managed keys (SSE-S3). You can optionally configure default encryption\n for a bucket by using server-side encryption with Key Management Service (KMS) keys (SSE-KMS) or\n dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). If you specify default encryption by using\n SSE-KMS, you can also configure Amazon S3 Bucket\n Keys. If you use PutBucketEncryption to set your default bucket encryption to SSE-KMS, you should verify that your KMS key ID is correct. Amazon S3 does not validate the KMS key ID provided in PutBucketEncryption requests.

\n \n

This action requires Amazon Web Services Signature Version 4. For more information, see \n Authenticating Requests (Amazon Web Services Signature Version 4).

\n
\n

To use this operation, you must have permission to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to PutBucketEncryption:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?encryption", @@ -27055,7 +27093,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to\n 1,000 S3 Intelligent-Tiering configurations per bucket.

\n

The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.

\n

The S3 Intelligent-Tiering storage class is the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.

\n

For more information, see Storage class for automatically optimizing frequently and infrequently accessed objects.

\n

Operations related to PutBucketIntelligentTieringConfiguration include:

\n \n \n

You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically\n move objects stored in the S3 Intelligent-Tiering storage class to the Archive Access\n or Deep Archive Access tier.

\n
\n

\n PutBucketIntelligentTieringConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket,\n or you do not have the s3:PutIntelligentTieringConfiguration\n bucket permission to set the configuration on the bucket.

\n
\n
", + "smithy.api#documentation": "

Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to\n 1,000 S3 Intelligent-Tiering configurations per bucket.

\n

The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.

\n

The S3 Intelligent-Tiering storage class is the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.

\n

For more information, see Storage class for automatically optimizing frequently and infrequently accessed objects.

\n

Operations related to PutBucketIntelligentTieringConfiguration include:

\n \n \n

You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically\n move objects stored in the S3 Intelligent-Tiering storage class to the Archive Access\n or Deep Archive Access tier.

\n
\n

\n PutBucketIntelligentTieringConfiguration has the following special\n errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket, or\n you do not have the s3:PutIntelligentTieringConfiguration bucket\n permission to set the configuration on the bucket.

\n
\n
", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?intelligent-tiering", @@ -27108,7 +27146,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the PUT action adds an inventory configuration\n (identified by the inventory ID) to the bucket. You can have up to 1,000 inventory\n configurations per bucket.

\n

Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly\n basis, and the results are published to a flat file. The bucket that is inventoried is\n called the source bucket, and the bucket where the inventory flat file\n is stored is called the destination bucket. The\n destination bucket must be in the same Amazon Web Services Region as the\n source bucket.

\n

When you configure an inventory for a source bucket, you specify\n the destination bucket where you want the inventory to be stored, and\n whether to generate the inventory daily or weekly. You can also configure what object\n metadata to include and whether to inventory all object versions or only current versions.\n For more information, see Amazon S3 Inventory in the\n Amazon S3 User Guide.

\n \n

You must create a bucket policy on the destination bucket to\n grant permissions to Amazon S3 to write objects to the bucket in the defined location. For an\n example policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n
\n
Permissions
\n
\n

To use this operation, you must have permission to perform the\n s3:PutInventoryConfiguration action. The bucket owner has this permission\n by default and can grant this permission to others.

\n

The s3:PutInventoryConfiguration permission allows a user to create an\n S3\n Inventory report that includes all object metadata fields available and to\n specify the destination bucket to store the inventory. A user with read access to objects\n in the destination bucket can also access all object metadata fields that are available in\n the inventory report.

\n

To restrict access to an inventory report, see Restricting access to an Amazon S3 Inventory report in the\n Amazon S3 User Guide. For more information about the metadata fields\n available in S3 Inventory, see Amazon S3\n Inventory lists in the Amazon S3 User Guide. For more\n information about permissions, see Permissions related to bucket subresource operations and Identity and\n access management in Amazon S3 in the Amazon S3 User Guide.

\n
\n
\n

\n PutBucketInventoryConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket,\n or you do not have the s3:PutInventoryConfiguration bucket\n permission to set the configuration on the bucket.

\n
\n
\n

The following operations are related to PutBucketInventoryConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the PUT action adds an inventory configuration\n (identified by the inventory ID) to the bucket. You can have up to 1,000 inventory\n configurations per bucket.

\n

Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly\n basis, and the results are published to a flat file. The bucket that is inventoried is\n called the source bucket, and the bucket where the inventory flat file\n is stored is called the destination bucket. The\n destination bucket must be in the same Amazon Web Services Region as the\n source bucket.

\n

When you configure an inventory for a source bucket, you specify\n the destination bucket where you want the inventory to be stored, and\n whether to generate the inventory daily or weekly. You can also configure what object\n metadata to include and whether to inventory all object versions or only current versions.\n For more information, see Amazon S3 Inventory in the\n Amazon S3 User Guide.

\n \n

You must create a bucket policy on the destination bucket to\n grant permissions to Amazon S3 to write objects to the bucket in the defined location. For an\n example policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n
\n
Permissions
\n
\n

To use this operation, you must have permission to perform the\n s3:PutInventoryConfiguration action. The bucket owner has this\n permission by default and can grant this permission to others.

\n

The s3:PutInventoryConfiguration permission allows a user to\n create an S3 Inventory\n report that includes all object metadata fields available and to specify the\n destination bucket to store the inventory. A user with read access to objects in\n the destination bucket can also access all object metadata fields that are\n available in the inventory report.

\n

To restrict access to an inventory report, see Restricting access to an Amazon S3 Inventory report in the\n Amazon S3 User Guide. For more information about the metadata\n fields available in S3 Inventory, see Amazon S3 Inventory lists in the Amazon S3 User Guide. For\n more information about permissions, see Permissions related to bucket subresource operations and Identity and access management in Amazon S3 in the\n Amazon S3 User Guide.

\n
\n
\n

\n PutBucketInventoryConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket, or\n you do not have the s3:PutInventoryConfiguration bucket permission to\n set the configuration on the bucket.

\n
\n
\n

The following operations are related to\n PutBucketInventoryConfiguration:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?inventory", @@ -27172,7 +27210,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3 Lifecycle\n configuration can have up to 1,000 rules. This limit is not adjustable. Each rule consists\n of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The filter can\n be based on a key name prefix, object tags, or a combination of both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want Amazon S3 to\n perform on the objects identified by the filter. If the state of your bucket is\n versioning-enabled or versioning-suspended, you can have many versions of the same\n object (one current version and zero or more noncurrent versions). Amazon S3 provides\n predefined actions that you can specify for current and noncurrent object\n versions.

    \n
  • \n
\n

For more information, see Object Lifecycle Management\n and Lifecycle Configuration Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and related\n subresources (for example, lifecycle configuration and website configuration). Only the\n resource owner (that is, the Amazon Web Services account that created it) can access the resource. The\n resource owner can optionally grant access permissions to others by writing an access\n policy. For this operation, a user must get the s3:PutLifecycleConfiguration\n permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any other\n permissions. If you want to block users or accounts from removing or deleting objects from\n your bucket, you must deny them permissions for the following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access Permissions to\n Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to PutBucketLifecycleConfiguration:

\n ", + "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3\n Lifecycle configuration can have up to 1,000 rules. This limit is not adjustable.\n Each rule consists of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The\n filter can be based on a key name prefix, object tags, or a combination of\n both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want\n Amazon S3 to perform on the objects identified by the filter. If the state of\n your bucket is versioning-enabled or versioning-suspended, you can have many\n versions of the same object (one current version and zero or more noncurrent\n versions). Amazon S3 provides predefined actions that you can specify for current\n and noncurrent object versions.

    \n
  • \n
\n

For more information, see Object Lifecycle\n Management and Lifecycle Configuration\n Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and\n related subresources (for example, lifecycle configuration and website\n configuration). Only the resource owner (that is, the Amazon Web Services account that created\n it) can access the resource. The resource owner can optionally grant access\n permissions to others by writing an access policy. For this operation, a user must\n get the s3:PutLifecycleConfiguration permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any\n other permissions. If you want to block users or accounts from removing or\n deleting objects from your bucket, you must deny them permissions for the\n following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access\n Permissions to Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to\n PutBucketLifecycleConfiguration:

\n ", "smithy.api#examples": [ { "title": "Put bucket lifecycle", @@ -27263,7 +27301,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GETObjectAcl\n request, appears as the CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request elements. To disable\n logging, you use an empty BucketLoggingStatus request element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", + "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by\n using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a\n response to a GETObjectAcl request, appears as the\n CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request\n elements. To disable logging, you use an empty BucketLoggingStatus request\n element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", "smithy.api#examples": [ { "title": "Set logging configuration for a bucket", @@ -27557,7 +27595,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", + "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", "smithy.api#examples": [ { "title": "Set bucket policy", @@ -27644,7 +27682,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using server-side\n encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\n SourceSelectionCriteria, SseKmsEncryptedObjects,\n Status, EncryptionConfiguration, and\n ReplicaKmsKeyID. For information about replication configuration, see\n Replicating Objects\n Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the bucket,\n can perform this operation. The resource owner can also grant others permissions to perform\n the operation. For more information about permissions, see Specifying Permissions in a\n Policy and Managing Access Permissions to\n Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have the\n iam:PassRole permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", + "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information. You can invoke this request for a specific\n Amazon Web Services Region by using the \n \n aws:RequestedRegion\n condition key.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using\n server-side encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects,\n add the following: SourceSelectionCriteria,\n SseKmsEncryptedObjects, Status,\n EncryptionConfiguration, and ReplicaKmsKeyID. For\n information about replication configuration, see Replicating\n Objects Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the\n bucket, can perform this operation. The resource owner can also grant others\n permissions to perform the operation. For more information about permissions, see\n Specifying Permissions in\n a Policy and Managing Access\n Permissions to Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have\n the iam:PassRole\n permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", "smithy.api#examples": [ { "title": "Set replication configuration on a bucket", @@ -27824,7 +27862,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3 Bucket\n Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors:

\n
    \n
  • \n

    Error code: InvalidTagError\n

    \n \n
  • \n
  • \n

    Error code: MalformedXMLError\n

    \n
      \n
    • \n

      Description: The XML provided does not match the schema.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: OperationAbortedError \n

    \n
      \n
    • \n

      Description: A conflicting conditional action is currently in progress\n against this resource. Please try again.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InternalError\n

    \n
      \n
    • \n

      Description: The service was unable to apply the provided tag to the\n bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", + "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3\n Bucket Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors. For more Amazon S3 errors\n see, Error\n Responses.

\n
    \n
  • \n

    \n InvalidTag - The tag provided was not a valid tag. This error\n can occur if the tag did not pass input validation. For more information, see Using\n Cost Allocation in Amazon S3 Bucket Tags.

    \n
  • \n
  • \n

    \n MalformedXML - The XML provided does not match the\n schema.

    \n
  • \n
  • \n

    \n OperationAborted - A conflicting conditional action is\n currently in progress against this resource. Please try again.

    \n
  • \n
  • \n

    \n InternalError - The service was unable to apply the provided\n tag to the bucket.

    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", "smithy.api#examples": [ { "title": "Set tags on a bucket", @@ -27915,7 +27953,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket and\n you want to maintain the same permanent delete behavior when you enable versioning, you\n must add a noncurrent expiration policy. The noncurrent expiration lifecycle configuration will\n manage the deletes of the noncurrent object versions in the version-enabled bucket. (A\n version-enabled bucket maintains one current and zero or more noncurrent object\n versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", + "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket\n and you want to maintain the same permanent delete behavior when you enable versioning,\n you must add a noncurrent expiration policy. The noncurrent expiration lifecycle\n configuration will manage the deletes of the noncurrent object versions in the\n version-enabled bucket. (A version-enabled bucket maintains one current and zero or more\n noncurrent object versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", "smithy.api#examples": [ { "title": "Set versioning configuration on a bucket", @@ -28005,7 +28043,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

\n

The maximum request length is limited to 128 KB.

", "smithy.api#examples": [ { "title": "Set website configuration on a bucket", @@ -28095,19 +28133,16 @@ "smithy.api#documentation": "

Adds an object to a bucket. You must have WRITE permissions on a bucket to add an object\n to it.

\n \n

Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the\n entire object to the bucket. You cannot use PutObject to only update a\n single piece of metadata for an existing object. You must put the entire object with\n updated metadata if you want to update some values.

\n
\n

Amazon S3 is a distributed system. If it receives multiple write requests for the same object\n simultaneously, it overwrites all but the last object written. To prevent objects from\n being deleted or overwritten, you can use Amazon S3 Object\n Lock.

\n

To ensure that data is not corrupted traversing the network, use the\n Content-MD5 header. When you use this header, Amazon S3 checks the object\n against the provided MD5 value and, if they do not match, returns an error. Additionally,\n you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to\n the calculated MD5 value.

\n \n
    \n
  • \n

    To successfully complete the PutObject request, you must have the\n s3:PutObject in your IAM permissions.

    \n
  • \n
  • \n

    To successfully change the objects acl of your PutObject request,\n you must have the s3:PutObjectAcl in your IAM permissions.

    \n
  • \n
  • \n

    To successfully set the tag-set with your PutObject request, you\n must have the s3:PutObjectTagging in your IAM permissions.

    \n
  • \n
  • \n

    The Content-MD5 header is required for any request to upload an\n object with a retention period configured using Amazon S3 Object Lock. For more\n information about Amazon S3 Object Lock, see Amazon S3 Object Lock\n Overview in the Amazon S3 User Guide.

    \n
  • \n
\n
\n

You have four mutually exclusive options to protect data using server-side encryption in\n Amazon S3, depending on how you choose to manage the encryption keys. Specifically, the\n encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with server-side\n encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to\n encrypt data at rest by using server-side encryption with other key options. For more\n information, see Using Server-Side\n Encryption.

\n

When adding a new object, you can use headers to grant ACL-based permissions to\n individual Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are\n then added to the ACL on the object. By default, all objects are private. Only the owner\n has full access control. For more information, see Access Control List (ACL) Overview\n and Managing\n ACLs Using the REST API.

\n

If the bucket that you're uploading objects to uses the bucket owner enforced setting\n for S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that\n use this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format. PUT requests that\n contain other ACLs (for example, custom grants to certain Amazon Web Services accounts) fail and return a\n 400 error with the error code AccessControlListNotSupported.\n For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID\n for the object being stored. Amazon S3 returns this ID in the response. When you enable\n versioning for a bucket, if Amazon S3 receives multiple write requests for the same object\n simultaneously, it stores all of the objects. For more information about versioning, see\n Adding Objects to\n Versioning-Enabled Buckets. For information about returning the versioning state\n of a bucket, see GetBucketVersioning.

\n

For more information about related Amazon S3 APIs, see the following:

\n ", "smithy.api#examples": [ { - "title": "To upload an object (specify optional headers)", - "documentation": "The following example uploads an object. The request specifies optional request headers to directs S3 to use specific storage class and use server-side encryption.", + "title": "To upload an object", + "documentation": "The following example uploads an object to a versioning-enabled bucket. The source file is specified using Windows file syntax. S3 returns VersionId of the newly created object.", "input": { "Body": "HappyFace.jpg", "Bucket": "examplebucket", - "Key": "HappyFace.jpg", - "ServerSideEncryption": "AES256", - "StorageClass": "STANDARD_IA" + "Key": "HappyFace.jpg" }, "output": { - "VersionId": "CG612hodqujkf8FaaNfp8U..FIhLROcp", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", - "ServerSideEncryption": "AES256" + "VersionId": "tpf3zF08nBplQK1XLOefGskR7mGDwcDk", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" } } ], @@ -28136,7 +28171,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined set\n of grantees and permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n x-amz-acl header to set a canned ACL. These parameters map to the set\n of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants list\n objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets the ACL of\n the current version of an object. To set the ACL of a different version, use the\n versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", + "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3\n supports a set of predefined ACLs, known as canned ACLs. Each canned ACL has\n a predefined set of grantees and permissions. Specify the canned ACL name as\n the value of x-amz-acl. If you use this header, you cannot use\n other access control-specific headers in your request. For more information,\n see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers,\n you specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3\n groups) who will receive the permission. If you use these ACL-specific\n headers, you cannot use x-amz-acl header to set a canned ACL.\n These parameters map to the set of permissions that Amazon S3 supports in an ACL.\n For more information, see Access Control List (ACL)\n Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants\n list objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights\n (using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET\n Object acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets\n the ACL of the current version of an object. To set the ACL of a different\n version, use the versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", "smithy.api#examples": [ { "title": "To grant permissions using object ACL", @@ -28566,7 +28601,7 @@ "SSEKMSEncryptionContext": { "target": "com.amazonaws.s3#SSEKMSEncryptionContext", "traits": { - "smithy.api#documentation": "

If present, specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The\n value of this header is a base64-encoded UTF-8 string holding JSON with the encryption\n context key-value pairs. This value is stored as object metadata and automatically gets passed\n on to Amazon Web Services KMS for future GetObject or CopyObject operations on\n this object.

", + "smithy.api#documentation": "

If present, specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The\n value of this header is a base64-encoded UTF-8 string holding JSON with the encryption\n context key-value pairs. This value is stored as object metadata and automatically gets\n passed on to Amazon Web Services KMS for future GetObject or CopyObject\n operations on this object.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-context" } }, @@ -28798,14 +28833,14 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

If x-amz-server-side-encryption has a valid value of aws:kms\n or aws:kms:dsse, this header specifies the ID of the Key Management Service (KMS)\n symmetric encryption customer managed key that was used for the object. If you specify\n x-amz-server-side-encryption:aws:kms or\n x-amz-server-side-encryption:aws:kms:dsse, but do not provide\n x-amz-server-side-encryption-aws-kms-key-id, Amazon S3 uses the Amazon Web Services managed key\n (aws/s3) to protect the data. If the KMS key does not exist in the same\n account that's issuing the command, you must use the full ARN and not just the ID.

", + "smithy.api#documentation": "

If x-amz-server-side-encryption has a valid value of aws:kms\n or aws:kms:dsse, this header specifies the ID (Key ID, Key ARN, or Key Alias) of the Key Management Service (KMS)\n symmetric encryption customer managed key that was used for the object. If you specify\n x-amz-server-side-encryption:aws:kms or\n x-amz-server-side-encryption:aws:kms:dsse, but do not provide\n x-amz-server-side-encryption-aws-kms-key-id, Amazon S3 uses the Amazon Web Services managed key\n (aws/s3) to protect the data. If the KMS key does not exist in the same\n account that's issuing the command, you must use the full ARN and not just the ID.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, "SSEKMSEncryptionContext": { "target": "com.amazonaws.s3#SSEKMSEncryptionContext", "traits": { - "smithy.api#documentation": "

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\n this header is a base64-encoded UTF-8 string holding JSON with the encryption context\n key-value pairs. This value is stored as object metadata and automatically gets passed on to\n Amazon Web Services KMS for future GetObject or CopyObject operations on this\n object.

", + "smithy.api#documentation": "

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\n this header is a base64-encoded UTF-8 string holding JSON with the encryption context\n key-value pairs. This value is stored as object metadata and automatically gets passed on\n to Amazon Web Services KMS for future GetObject or CopyObject operations on\n this object.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-context" } }, @@ -28988,7 +29023,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket.

\n

A tag is a key-value pair. You can associate tags with an object by sending a PUT\n request against the tagging subresource that is associated with the object. You can\n retrieve tags by sending a GET request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

\n PutObjectTagging has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n Code: InvalidTagError \n

      \n
    • \n
    • \n

      \n Cause: The tag provided was not a valid tag. This error can occur\n if the tag did not pass input validation. For more information, see Object\n Tagging.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: MalformedXMLError \n

      \n
    • \n
    • \n

      \n Cause: The XML provided does not match the schema.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: OperationAbortedError \n

      \n
    • \n
    • \n

      \n Cause: A conflicting conditional action is currently in progress\n against this resource. Please try again.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InternalError\n

      \n
    • \n
    • \n

      \n Cause: The service was unable to apply the provided tag to the\n object.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", + "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket. A tag is a\n key-value pair. For more information, see Object Tagging.

\n

You can associate tags with an object by sending a PUT request against the tagging\n subresource that is associated with the object. You can retrieve tags by sending a GET\n request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

\n PutObjectTagging has the following special errors. For more Amazon S3 errors\n see, Error\n Responses.

\n
    \n
  • \n

    \n InvalidTag - The tag provided was not a valid tag. This error\n can occur if the tag did not pass input validation. For more information, see Object\n Tagging.

    \n
  • \n
  • \n

    \n MalformedXML - The XML provided does not match the\n schema.

    \n
  • \n
  • \n

    \n OperationAborted - A conflicting conditional action is\n currently in progress against this resource. Please try again.

    \n
  • \n
  • \n

    \n InternalError - The service was unable to apply the provided\n tag to the object.

    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", "smithy.api#examples": [ { "title": "To add tags to an existing object", @@ -29119,7 +29154,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates or modifies the PublicAccessBlock configuration for an Amazon S3 bucket.\n To use this operation, you must have the s3:PutBucketPublicAccessBlock\n permission. For more information about Amazon S3 permissions, see Specifying Permissions in a\n Policy.

\n \n

When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or\n an object, it checks the PublicAccessBlock configuration for both the\n bucket (or the bucket that contains the object) and the bucket owner's account. If the\n PublicAccessBlock configurations are different between the bucket and\n the account, Amazon S3 uses the most restrictive combination of the bucket-level and\n account-level settings.

\n
\n

For more information about when Amazon S3 considers a bucket or an object public, see The Meaning of \"Public\".

\n

The following operations are related to PutPublicAccessBlock:

\n ", + "smithy.api#documentation": "

Creates or modifies the PublicAccessBlock configuration for an Amazon S3 bucket.\n To use this operation, you must have the s3:PutBucketPublicAccessBlock\n permission. For more information about Amazon S3 permissions, see Specifying Permissions in a\n Policy.

\n \n

When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or\n an object, it checks the PublicAccessBlock configuration for both the\n bucket (or the bucket that contains the object) and the bucket owner's account. If the\n PublicAccessBlock configurations are different between the bucket and\n the account, S3 uses the most restrictive combination of the bucket-level and\n account-level settings.

\n
\n

For more information about when Amazon S3 considers a bucket or an object public, see The Meaning of \"Public\".

\n

The following operations are related to PutPublicAccessBlock:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?publicAccessBlock", @@ -29629,7 +29664,7 @@ } }, "traits": { - "smithy.api#documentation": "

Confirms that the requester knows that they will be charged for the request. Bucket\n owners need not specify this parameter in their requests. For information about downloading\n objects from Requester Pays buckets, see Downloading Objects in\n Requester Pays Buckets in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Confirms that the requester knows that they will be charged for the request. Bucket\n owners need not specify this parameter in their requests. If either the source or\n destination Amazon S3 bucket has Requester Pays enabled, the requester will pay for\n corresponding charges to copy the object. For information about downloading objects from\n Requester Pays buckets, see Downloading Objects in\n Requester Pays Buckets in the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#RequestPaymentConfiguration": { @@ -29712,7 +29747,7 @@ "aws.protocols#httpChecksum": { "requestAlgorithmMember": "ChecksumAlgorithm" }, - "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your\n query in the request body's SelectParameters structure. You can use\n expressions like the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified\n object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object,\n you can specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field\n to IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval or\n S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive storage\n classes, you must first initiate a restore request, and then wait until a temporary copy of\n the object is available. If you want a permanent copy of the object, create a copy of it in\n the Amazon S3 Standard storage class in your S3 bucket. To access an archived object, you must\n restore the object for the duration (number of days) that you specify. For objects in the\n Archive Access or Deep Archive Access tiers of S3 Intelligent-Tiering, you must first\n initiate a restore request, and then wait until the object is moved into the Frequent\n Access tier.

\n

To restore a specific object version, you can provide a version ID. If you don't provide\n a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data access tier\n options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access your\n data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier when occasional urgent requests for restoring archives\n are required. For all but the largest archived objects (250 MB+), data accessed using\n Expedited retrievals is typically made available within 1–5 minutes. Provisioned\n capacity ensures that retrieval capacity for Expedited retrievals is available when\n you need it. Expedited retrievals and provisioned capacity are not available for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of your\n archived objects within several hours. This is the default option for retrieval\n requests that do not specify the retrieval option. Standard retrievals typically\n finish within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval Flexible\n Retrieval storage class or S3 Intelligent-Tiering Archive tier. They typically finish within\n 12 hours for objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored in\n S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the S3 Glacier\n Flexible Retrieval and S3 Intelligent-Tiering storage classes, enabling you to\n retrieve large amounts, even petabytes, of data at no cost. Bulk retrievals typically\n finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval\n Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are\n also the lowest-cost retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for objects\n stored in the S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive\n tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity for\n Expedited data access, see Restoring Archived Objects in\n the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster speed\n while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD request.\n Operations return the x-amz-restore header, which provides information about\n the restoration status, in the response. You can use Amazon S3 event notifications to notify you\n when a restore is initiated or completed. For more information, see Configuring Amazon S3\n Event Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by reissuing\n the request with a new period. Amazon S3 updates the restoration period relative to the current\n time and charges only for the request-there are no data transfer charges. You cannot\n update the restoration period when Amazon S3 is actively processing your current restore request\n for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an expiration\n action, the object expiration overrides the life span that you specify in a restore\n request. For example, if you restore an object copy for 10 days, but the object is\n scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days. For more information\n about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle Management\n in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202 Accepted\n status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in the\n response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error does not\n apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available. Try again\n later. (Returned if there is insufficient capacity to process the Expedited\n request. This error applies only to Expedited retrievals and not to\n S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", + "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your query\n in the request body's SelectParameters structure. You can use expressions like\n the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object, you can\n specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field to\n IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by\n default and can grant this permission to others. For more information about\n permissions, see Permissions Related to Bucket Subresource Operations and Managing Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval\n or S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive\n storage classes, you must first initiate a restore request, and then wait until a\n temporary copy of the object is available. If you want a permanent copy of the\n object, create a copy of it in the Amazon S3 Standard storage class in your S3 bucket.\n To access an archived object, you must restore the object for the duration (number\n of days) that you specify. For objects in the Archive Access or Deep Archive\n Access tiers of S3 Intelligent-Tiering, you must first initiate a restore request,\n and then wait until the object is moved into the Frequent Access tier.

\n

To restore a specific object version, you can provide a version ID. If you\n don't provide a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data\n access tier options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access\n your data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval\n storage class or S3 Intelligent-Tiering Archive tier when occasional urgent requests\n for restoring archives are required. For all but the largest archived\n objects (250 MB+), data accessed using Expedited retrievals is typically\n made available within 1–5 minutes. Provisioned capacity ensures that\n retrieval capacity for Expedited retrievals is available when you need it.\n Expedited retrievals and provisioned capacity are not available for objects\n stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of\n your archived objects within several hours. This is the default option for\n retrieval requests that do not specify the retrieval option. Standard\n retrievals typically finish within 3–5 hours for objects stored in the\n S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier. They typically finish within 12 hours for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored\n in S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the\n S3 Glacier Flexible Retrieval and S3 Intelligent-Tiering storage classes,\n enabling you to retrieve large amounts, even petabytes, of data at no cost.\n Bulk retrievals typically finish within 5–12 hours for objects stored in the\n S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier. Bulk retrievals are also the lowest-cost\n retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity\n for Expedited data access, see Restoring Archived\n Objects in the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster\n speed while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD\n request. Operations return the x-amz-restore header, which provides\n information about the restoration status, in the response. You can use Amazon S3 event\n notifications to notify you when a restore is initiated or completed. For more\n information, see Configuring Amazon S3 Event\n Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by\n reissuing the request with a new period. Amazon S3 updates the restoration period\n relative to the current time and charges only for the request-there are no\n data transfer charges. You cannot update the restoration period when Amazon S3 is\n actively processing your current restore request for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an\n expiration action, the object expiration overrides the life span that you specify\n in a restore request. For example, if you restore an object copy for 10 days, but\n the object is scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days.\n For more information about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle\n Management in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202\n Accepted status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in\n the response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error\n does not apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available.\n Try again later. (Returned if there is insufficient capacity to\n process the Expedited request. This error applies only to Expedited\n retrievals and not to S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", "smithy.api#examples": [ { "title": "To restore an archived object", @@ -29891,18 +29926,18 @@ "target": "com.amazonaws.s3#IsRestoreInProgress", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the object is currently being restored. If the object restoration is\n in progress, the header returns the value TRUE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"true\"\n

\n

If the object restoration has completed, the header returns the value FALSE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\", RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

\n

If the object hasn't been restored, there is no header response.

" + "smithy.api#documentation": "

Specifies whether the object is currently being restored. If the object restoration is\n in progress, the header returns the value TRUE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"true\"\n

\n

If the object restoration has completed, the header returns the value\n FALSE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\",\n RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

\n

If the object hasn't been restored, there is no header response.

" } }, "RestoreExpiryDate": { "target": "com.amazonaws.s3#RestoreExpiryDate", "traits": { - "smithy.api#documentation": "

Indicates when the restored copy will expire. This value is populated only if the object\n has already been restored. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\", RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

" + "smithy.api#documentation": "

Indicates when the restored copy will expire. This value is populated only if the object\n has already been restored. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\",\n RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

" } } }, "traits": { - "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must be restored\n before they can be retrieved. For more information about these storage classes and how to work with\n archived objects, see \n Working with archived objects in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#Role": { @@ -30087,7 +30122,7 @@ "target": "com.amazonaws.s3#SelectObjectContentOutput" }, "traits": { - "smithy.api#documentation": "

This action filters the contents of an Amazon S3 object based on a simple structured query\n language (SQL) statement. In the request, along with the SQL expression, you must also\n specify a data serialization format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses\n this format to parse object data into records, and returns only records that match the\n specified SQL expression. You must also specify the data serialization format for the\n response.

\n

This action is not supported by Amazon S3 on Outposts.

\n

For more information about Amazon S3 Select, see Selecting Content from\n Objects and SELECT\n Command in the Amazon S3 User Guide.

\n

\n
\n
Permissions
\n
\n

You must have s3:GetObject permission for this operation. Amazon S3 Select does\n not support anonymous access. For more information about permissions, see Specifying\n Permissions in a Policy in the Amazon S3 User Guide.

\n
\n
Object Data Formats
\n
\n

You can use Amazon S3 Select to query objects that have the following format\n properties:

\n
    \n
  • \n

    \n CSV, JSON, and Parquet - Objects must be in CSV, JSON, or\n Parquet format.

    \n
  • \n
  • \n

    \n UTF-8 - UTF-8 is the only encoding type Amazon S3 Select\n supports.

    \n
  • \n
  • \n

    \n GZIP or BZIP2 - CSV and JSON files can be compressed using\n GZIP or BZIP2. GZIP and BZIP2 are the only compression formats that Amazon S3 Select\n supports for CSV and JSON files. Amazon S3 Select supports columnar compression for\n Parquet using GZIP or Snappy. Amazon S3 Select does not support whole-object compression\n for Parquet objects.

    \n
  • \n
  • \n

    \n Server-side encryption - Amazon S3 Select supports querying\n objects that are protected with server-side encryption.

    \n

    For objects that are encrypted with customer-provided encryption keys (SSE-C), you\n must use HTTPS, and you must use the headers that are documented in the GetObject. For more information about SSE-C, see Server-Side\n Encryption (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

    \n

    For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and Amazon Web Services KMS keys\n (SSE-KMS), server-side encryption is handled transparently, so you don't need to\n specify anything. For more information about server-side encryption, including SSE-S3\n and SSE-KMS, see Protecting Data Using\n Server-Side Encryption in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
Working with the Response Body
\n
\n

Given the response size is unknown, Amazon S3 Select streams the response as a series of\n messages and includes a Transfer-Encoding header with chunked as\n its value in the response. For more information, see Appendix: SelectObjectContent\n Response.

\n
\n
GetObject Support
\n
\n

The SelectObjectContent action does not support the following\n GetObject functionality. For more information, see GetObject.

\n
    \n
  • \n

    \n Range: Although you can specify a scan range for an Amazon S3 Select request\n (see SelectObjectContentRequest - ScanRange in the request parameters),\n you cannot specify the range of bytes of an object to return.

    \n
  • \n
  • \n

    The GLACIER, DEEP_ARCHIVE, and REDUCED_REDUNDANCY storage classes, or the ARCHIVE_ACCESS and \n DEEP_ARCHIVE_ACCESS access tiers of \n the INTELLIGENT_TIERING storage class: You cannot query objects in \n the GLACIER, DEEP_ARCHIVE, or REDUCED_REDUNDANCY storage classes, nor objects in the \n ARCHIVE_ACCESS or \n DEEP_ARCHIVE_ACCESS access tiers of \n the INTELLIGENT_TIERING storage class. For\n more information about storage classes, see Using Amazon S3 storage\n classes in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
Special Errors
\n
\n

For a list of special errors for this operation, see List of\n SELECT Object Content Error Codes\n

\n
\n
\n

The following operations are related to SelectObjectContent:

\n ", + "smithy.api#documentation": "

This action filters the contents of an Amazon S3 object based on a simple structured query\n language (SQL) statement. In the request, along with the SQL expression, you must also\n specify a data serialization format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses\n this format to parse object data into records, and returns only records that match the\n specified SQL expression. You must also specify the data serialization format for the\n response.

\n

This action is not supported by Amazon S3 on Outposts.

\n

For more information about Amazon S3 Select, see Selecting Content from\n Objects and SELECT\n Command in the Amazon S3 User Guide.

\n

\n
\n
Permissions
\n
\n

You must have s3:GetObject permission for this operation. Amazon S3\n Select does not support anonymous access. For more information about permissions,\n see Specifying Permissions in\n a Policy in the Amazon S3 User Guide.

\n
\n
Object Data Formats
\n
\n

You can use Amazon S3 Select to query objects that have the following format\n properties:

\n
    \n
  • \n

    \n CSV, JSON, and Parquet - Objects must be in CSV,\n JSON, or Parquet format.

    \n
  • \n
  • \n

    \n UTF-8 - UTF-8 is the only encoding type Amazon S3 Select\n supports.

    \n
  • \n
  • \n

    \n GZIP or BZIP2 - CSV and JSON files can be compressed\n using GZIP or BZIP2. GZIP and BZIP2 are the only compression formats that\n Amazon S3 Select supports for CSV and JSON files. Amazon S3 Select supports columnar\n compression for Parquet using GZIP or Snappy. Amazon S3 Select does not support\n whole-object compression for Parquet objects.

    \n
  • \n
  • \n

    \n Server-side encryption - Amazon S3 Select supports\n querying objects that are protected with server-side encryption.

    \n

    For objects that are encrypted with customer-provided encryption keys\n (SSE-C), you must use HTTPS, and you must use the headers that are\n documented in the GetObject. For more\n information about SSE-C, see Server-Side Encryption (Using Customer-Provided Encryption Keys)\n in the Amazon S3 User Guide.

    \n

    For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and\n Amazon Web Services KMS keys (SSE-KMS), server-side encryption is handled transparently,\n so you don't need to specify anything. For more information about\n server-side encryption, including SSE-S3 and SSE-KMS, see Protecting Data Using Server-Side Encryption in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
Working with the Response Body
\n
\n

Given the response size is unknown, Amazon S3 Select streams the response as a\n series of messages and includes a Transfer-Encoding header with\n chunked as its value in the response. For more information, see\n Appendix:\n SelectObjectContent\n Response.

\n
\n
GetObject Support
\n
\n

The SelectObjectContent action does not support the following\n GetObject functionality. For more information, see GetObject.

\n
    \n
  • \n

    \n Range: Although you can specify a scan range for an Amazon S3 Select\n request (see SelectObjectContentRequest - ScanRange in the request\n parameters), you cannot specify the range of bytes of an object to return.\n

    \n
  • \n
  • \n

    The GLACIER, DEEP_ARCHIVE, and\n REDUCED_REDUNDANCY storage classes, or the\n ARCHIVE_ACCESS and DEEP_ARCHIVE_ACCESS access\n tiers of the INTELLIGENT_TIERING storage class: You cannot\n query objects in the GLACIER, DEEP_ARCHIVE, or\n REDUCED_REDUNDANCY storage classes, nor objects in the\n ARCHIVE_ACCESS or DEEP_ARCHIVE_ACCESS access\n tiers of the INTELLIGENT_TIERING storage class. For more\n information about storage classes, see Using Amazon S3\n storage classes in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
Special Errors
\n
\n

For a list of special errors for this operation, see List of SELECT Object Content Error Codes\n

\n
\n
\n

The following operations are related to SelectObjectContent:

\n ", "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?select&select-type=2&x-id=SelectObjectContent", @@ -30317,7 +30352,7 @@ "KMSMasterKeyID": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Amazon Web Services Key Management Service (KMS) customer Amazon Web Services KMS key ID to use for the default\n encryption. This parameter is allowed if and only if SSEAlgorithm is set to\n aws:kms.

\n

You can specify the key ID or the Amazon Resource Name (ARN) of the KMS key. If you use\n a key ID, you can run into a LogDestination undeliverable error when creating a VPC flow\n log.

\n

If you are using encryption with cross-account or Amazon Web Services service operations you must use\n a fully qualified KMS key ARN. For more information, see Using encryption for cross-account operations.

\n
    \n
  • \n

    Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key ARN:\n arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
\n \n

Amazon S3 only supports symmetric encryption KMS keys. For more information, see Asymmetric keys in Amazon Web Services KMS in the Amazon Web Services Key Management Service\n Developer Guide.

\n
" + "smithy.api#documentation": "

Amazon Web Services Key Management Service (KMS) customer Amazon Web Services KMS key ID to use for the default\n encryption. This parameter is allowed if and only if SSEAlgorithm is set to\n aws:kms.

\n

You can specify the key ID, key alias, or the Amazon Resource Name (ARN) of the KMS\n key.

\n
    \n
  • \n

    Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key Alias: alias/alias-name\n

    \n
  • \n
\n

If you use a key ID, you can run into a LogDestination undeliverable error when creating\n a VPC flow log.

\n

If you are using encryption with cross-account or Amazon Web Services service operations you must use\n a fully qualified KMS key ARN. For more information, see Using encryption for cross-account operations.

\n \n

Amazon S3 only supports symmetric encryption KMS keys. For more information, see Asymmetric keys in Amazon Web Services KMS in the Amazon Web Services Key Management Service\n Developer Guide.

\n
" } } }, @@ -30951,7 +30986,7 @@ "target": "com.amazonaws.s3#UploadPartCopyOutput" }, "traits": { - "smithy.api#documentation": "

Uploads a part by copying data from an existing object as data source. You specify the\n data source by adding the request header x-amz-copy-source in your request and\n a byte range by adding the request header x-amz-copy-source-range in your\n request.

\n

For information about maximum and minimum part sizes and other multipart upload\n specifications, see Multipart upload limits in the Amazon S3 User Guide.

\n \n

Instead of using an existing object as part data, you might use the UploadPart\n action and provide data in your request.

\n
\n

You must initiate a multipart upload before you can upload any part. In response to your\n initiate request. Amazon S3 returns a unique identifier, the upload ID, that you must include in\n your upload part request.

\n

For more information about using the UploadPartCopy operation, see the\n following:

\n
    \n
  • \n

    For conceptual information about multipart uploads, see Uploading\n Objects Using Multipart Upload in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about permissions required to use the multipart upload API, see\n Multipart Upload and Permissions in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about copying objects using a single atomic action vs. a multipart\n upload, see Operations on Objects in\n the Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about using server-side encryption with customer-provided\n encryption keys with the UploadPartCopy operation, see CopyObject and UploadPart.

    \n
  • \n
\n

Note the following additional considerations about the request headers\n x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,\n x-amz-copy-source-if-unmodified-since, and\n x-amz-copy-source-if-modified-since:

\n

\n
    \n
  • \n

    \n Consideration 1 - If both of the\n x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-match condition evaluates to true,\n and;

    \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false;

    \n

    Amazon S3 returns 200 OK and copies the data.\n

    \n
  • \n
  • \n

    \n Consideration 2 - If both of the\n x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false, and;

    \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true;

    \n

    Amazon S3 returns 412 Precondition Failed response code.\n

    \n
  • \n
\n
\n
Versioning
\n
\n

If your bucket has versioning enabled, you could have multiple versions of the same\n object. By default, x-amz-copy-source identifies the current version of the\n object to copy. If the current version is a delete marker and you don't specify a versionId\n in the x-amz-copy-source, Amazon S3 returns a 404 error, because the object does\n not exist. If you specify versionId in the x-amz-copy-source and the versionId\n is a delete marker, Amazon S3 returns an HTTP 400 error, because you are not allowed to specify\n a delete marker as a version for the x-amz-copy-source.

\n

You can optionally specify a specific version of the source object to copy by adding the\n versionId subresource as shown in the following example:

\n

\n x-amz-copy-source: /bucket/object?versionId=version id\n

\n
\n
Special errors
\n
\n
    \n
  • \n
      \n
    • \n

      \n Code: NoSuchUpload\n

      \n
    • \n
    • \n

      \n Cause: The specified multipart upload does not exist. The upload\n ID might be invalid, or the multipart upload might have been aborted or\n completed.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 404 Not Found\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InvalidRequest\n

      \n
    • \n
    • \n

      \n Cause: The specified copy source is not supported as a byte-range\n copy source.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 400 Bad Request\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to UploadPartCopy:

\n ", + "smithy.api#documentation": "

Uploads a part by copying data from an existing object as data source. You specify the\n data source by adding the request header x-amz-copy-source in your request and\n a byte range by adding the request header x-amz-copy-source-range in your\n request.

\n

For information about maximum and minimum part sizes and other multipart upload\n specifications, see Multipart upload limits in the Amazon S3 User Guide.

\n \n

Instead of using an existing object as part data, you might use the UploadPart\n action and provide data in your request.

\n
\n

You must initiate a multipart upload before you can upload any part. In response to your\n initiate request. Amazon S3 returns a unique identifier, the upload ID, that you must include in\n your upload part request.

\n

For more information about using the UploadPartCopy operation, see the\n following:

\n
    \n
  • \n

    For conceptual information about multipart uploads, see Uploading\n Objects Using Multipart Upload in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about permissions required to use the multipart upload API, see\n Multipart Upload and Permissions in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about copying objects using a single atomic action vs. a multipart\n upload, see Operations on Objects in\n the Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about using server-side encryption with customer-provided\n encryption keys with the UploadPartCopy operation, see CopyObject and UploadPart.

    \n
  • \n
\n

Note the following additional considerations about the request headers\n x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,\n x-amz-copy-source-if-unmodified-since, and\n x-amz-copy-source-if-modified-since:

\n

\n
    \n
  • \n

    \n Consideration 1 - If both of the\n x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-match condition evaluates to true,\n and;

    \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false;

    \n

    Amazon S3 returns 200 OK and copies the data.\n

    \n
  • \n
  • \n

    \n Consideration 2 - If both of the\n x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false, and;

    \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true;

    \n

    Amazon S3 returns 412 Precondition Failed response code.\n

    \n
  • \n
\n
\n
Versioning
\n
\n

If your bucket has versioning enabled, you could have multiple versions of the\n same object. By default, x-amz-copy-source identifies the current\n version of the object to copy. If the current version is a delete marker and you\n don't specify a versionId in the x-amz-copy-source, Amazon S3 returns a\n 404 error, because the object does not exist. If you specify versionId in the\n x-amz-copy-source and the versionId is a delete marker, Amazon S3\n returns an HTTP 400 error, because you are not allowed to specify a delete marker\n as a version for the x-amz-copy-source.

\n

You can optionally specify a specific version of the source object to copy by\n adding the versionId subresource as shown in the following\n example:

\n

\n x-amz-copy-source: /bucket/object?versionId=version id\n

\n
\n
Special errors
\n
\n
    \n
  • \n
      \n
    • \n

      \n Code: NoSuchUpload\n

      \n
    • \n
    • \n

      \n Cause: The specified multipart upload does not exist. The\n upload ID might be invalid, or the multipart upload might have been\n aborted or completed.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 404 Not Found\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InvalidRequest\n

      \n
    • \n
    • \n

      \n Cause: The specified copy source is not supported as a\n byte-range copy source.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 400 Bad Request\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to UploadPartCopy:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=UploadPartCopy", @@ -31751,7 +31786,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

If present, specifies the ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric\n encryption customer managed key that was used for stored in Amazon S3 object.

", + "smithy.api#documentation": "

If present, specifies the ID (Key ID, Key ARN, or Key Alias) of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric\n encryption customer managed key that was used for stored in Amazon S3 object.

", "smithy.api#httpHeader": "x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id" } }, diff --git a/aws/sdk/aws-models/s3control.json b/aws/sdk/aws-models/s3control.json index 34dd5ad3475..7b83470c3f3 100644 --- a/aws/sdk/aws-models/s3control.json +++ b/aws/sdk/aws-models/s3control.json @@ -232,6 +232,7 @@ "arnNamespace": "s3", "cloudFormationName": "S3Control", "cloudTrailEventSource": "s3control.amazonaws.com", + "docId": "s3control-2018-08-20", "endpointPrefix": "s3-control" }, "aws.auth#sigv4": { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c4b8cf2d35f..7dd86dd69eb 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -13,6 +13,7 @@ plugins { repositories { mavenCentral() google() + /* mavenLocal() */ } // Load properties manually to avoid hard coding smithy version diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index 0d39e4b7549..ae84542a3eb 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -15,6 +15,7 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) +fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" val pluginName = "rust-client-codegen" val workingDirUnderBuildDir = "smithyprojections/codegen-client-test/" @@ -49,7 +50,8 @@ data class ClientTest( private fun extraCodegenConfig(): String = StringBuilder().apply { append("\"addMessageToErrors\": $addMessageToErrors,\n") - append("\"renameErrors\": $renameErrors\n") + append("\"renameErrors\": $renameErrors\n,") + append("\"enableNewSmithyRuntime\": \"${getSmithyRuntimeMode()}\"") }.toString() private fun imports(): List = dependsOn.map { "../codegen-core/common-test-models/$it" } @@ -106,14 +108,14 @@ val allCodegenTests = listOf( "pokemon-service-awsjson-client", dependsOn = listOf("pokemon-awsjson.smithy", "pokemon-common.smithy"), ), - ClientTest("aws.protocoltests.json#RequiredValueJson", "required-values-json"), - ClientTest("aws.protocoltests.json#RequiredValueXml", "required-values-xml"), ).map(ClientTest::toCodegenTest) project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +tasks["generateSmithyBuild"].inputs.property("smithy.runtime.mode", getSmithyRuntimeMode()) + tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") diff --git a/codegen-client-test/model/endpoint-rules.smithy b/codegen-client-test/model/endpoint-rules.smithy index 7b681a3013f..cbd4c903a64 100644 --- a/codegen-client-test/model/endpoint-rules.smithy +++ b/codegen-client-test/model/endpoint-rules.smithy @@ -20,7 +20,6 @@ use aws.protocols#awsJson1_1 }], "parameters": { "Bucket": { "required": false, "type": "String" }, - "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, } }) service TestService { diff --git a/codegen-client-test/model/rest-xml-extras.smithy b/codegen-client-test/model/rest-xml-extras.smithy index 0c20c273cd1..76a6bbd9fa8 100644 --- a/codegen-client-test/model/rest-xml-extras.smithy +++ b/codegen-client-test/model/rest-xml-extras.smithy @@ -21,9 +21,6 @@ service RestXmlExtras { StringHeader, CreateFoo, RequiredMember, - // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy - // They're being added in https://github.com/smithy-lang/smithy/pull/1908 - HttpPayloadWithUnion, ] } @@ -260,96 +257,3 @@ structure RequiredMemberInputOutput { @required requiredString: String } - -// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them -// They're being added in https://github.com/smithy-lang/smithy/pull/1908 - -/// This example serializes a union in the payload. -@idempotent -@http(uri: "/HttpPayloadWithUnion", method: "PUT") -operation HttpPayloadWithUnion { - input: HttpPayloadWithUnionInputOutput, - output: HttpPayloadWithUnionInputOutput -} - -apply HttpPayloadWithUnion @httpRequestTests([ - { - id: "RestXmlHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restXml, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: """ - - hello - """, - bodyMediaType: "application/xml", - headers: { - "Content-Type": "application/xml", - }, - requireHeaders: [ - "Content-Length" - ], - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestXmlHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restXml, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: "", - headers: { - "Content-Type": "application/xml", - "Content-Length": "0" - }, - params: {} - } -]) - -apply HttpPayloadWithUnion @httpResponseTests([ - { - id: "RestXmlHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restXml, - code: 200, - body: """ - - hello - """, - bodyMediaType: "application/xml", - headers: { - "Content-Type": "application/xml", - }, - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestXmlHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restXml, - code: 200, - body: "", - headers: { - "Content-Type": "application/xml", - "Content-Length": "0" - }, - params: {} - } -]) - -structure HttpPayloadWithUnionInputOutput { - @httpPayload - nested: UnionPayload, -} - -union UnionPayload { - greeting: String -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt index c28c4c43a52..a47aa2d8082 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt @@ -25,7 +25,7 @@ class EndpointRulesetIndex : KnowledgeIndex { serviceShape, ) { serviceShape.getTrait()?.ruleSet?.let { EndpointRuleSet.fromNode(it) } - ?.also { it.typecheck() } + ?.also { it.typeCheck() } } fun endpointTests(serviceShape: ServiceShape) = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index 56ab7656065..c726a625980 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -33,7 +33,7 @@ interface EndpointCustomization { * ```kotlin * override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { * return when (parameter.builtIn) { - * Builtins.REGION.builtIn -> writable { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } + * AwsBuiltIns.REGION.builtIn -> writable { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } * else -> null * } * } @@ -47,7 +47,7 @@ interface EndpointCustomization { * Example: * ```kotlin * override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? { - * if (name != Builtins.REGION.builtIn.get()) { + * if (name != AwsBuiltIns.REGION.builtIn.get()) { * return null * } * return writable { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt index 561f4885502..2984cc62557 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt @@ -5,7 +5,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators -import software.amazon.smithy.rulesengine.language.eval.Value +import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue +import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue +import software.amazon.smithy.rulesengine.language.evaluation.value.Value import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -216,8 +218,8 @@ internal class EndpointParamsGenerator( private fun value(value: Value): String { return when (value) { - is Value.String -> value.value().dq() + ".to_string()" - is Value.Bool -> value.expectBool().toString() + is StringValue -> value.value.dq() + ".to_string()" + is BooleanValue -> value.value.toString() else -> TODO("unexpected type: $value") } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index 502cd47bb3b..e461f71b300 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -7,13 +7,14 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators import software.amazon.smithy.rulesengine.language.Endpoint import software.amazon.smithy.rulesengine.language.EndpointRuleSet -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Reference -import software.amazon.smithy.rulesengine.language.syntax.fn.IsSet +import software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType +import software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Reference +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.IsSet import software.amazon.smithy.rulesengine.language.syntax.rule.Condition import software.amazon.smithy.rulesengine.language.syntax.rule.Rule -import software.amazon.smithy.rulesengine.language.visit.RuleValueVisitor +import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context @@ -247,9 +248,9 @@ internal class EndpointResolverGenerator( } private fun isExhaustive(rule: Rule): Boolean = rule.conditions.isEmpty() || rule.conditions.all { - when (it.fn.type()) { - is Type.Bool -> false - is Type.Option -> false + when (it.function.type()) { + is BooleanType -> false + is OptionalType -> false else -> true } } @@ -262,8 +263,8 @@ internal class EndpointResolverGenerator( * deal with the actual target of the condition but flattening through isSet */ private fun Condition.targetFunction(): Expression { - return when (val fn = this.fn) { - is IsSet -> fn.target + return when (val fn = this.function) { + is IsSet -> fn.arguments[0] else -> fn } } @@ -292,7 +293,7 @@ internal class EndpointResolverGenerator( val target = generator.generate(fn) val next = generateRuleInternal(rule, rest) when { - fn.type() is Type.Option -> { + fn.type() is OptionalType -> { Attribute.AllowUnusedVariables.render(this) rustTemplate( "if let Some($resultName) = #{target:W} { #{next:W} }", @@ -301,7 +302,7 @@ internal class EndpointResolverGenerator( ) } - fn.type() is Type.Bool -> { + fn.type() is BooleanType -> { rustTemplate( """ if #{target:W} {#{binding} @@ -362,7 +363,7 @@ internal class EndpointResolverGenerator( return writable { rustTemplate("#{SmithyEndpoint}::builder().url(#{url:W})", *codegenScope, "url" to url) headers.forEach { (name, values) -> values.forEach { rust(".header(${name.dq()}, #W)", it) } } - properties.forEach { (name, value) -> rust(".property(${name.asString().dq()}, #W)", value) } + properties.forEach { (name, value) -> rust(".property(${name.toString().dq()}, #W)", value) } rust(".build()") } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt index 8a9fc9914e2..442adedf81d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt @@ -5,7 +5,12 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators -import software.amazon.smithy.rulesengine.language.eval.Value +import software.amazon.smithy.rulesengine.language.evaluation.value.ArrayValue +import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue +import software.amazon.smithy.rulesengine.language.evaluation.value.IntegerValue +import software.amazon.smithy.rulesengine.language.evaluation.value.RecordValue +import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue +import software.amazon.smithy.rulesengine.language.evaluation.value.Value import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rulesengine.traits.EndpointTestCase @@ -119,9 +124,9 @@ internal class EndpointTestGenerator( private fun generateValue(value: Value): Writable { return { when (value) { - is Value.String -> rust(escape(value.value()).dq() + ".to_string()") - is Value.Bool -> rust(value.toString()) - is Value.Array -> { + is StringValue -> rust(escape(value.value).dq() + ".to_string()") + is BooleanValue -> rust(value.toString()) + is ArrayValue -> { rust( "vec![#W]", value.values.map { member -> @@ -136,16 +141,16 @@ internal class EndpointTestGenerator( ) } - is Value.Integer -> rust(value.expectInteger().toString()) + is IntegerValue -> rust(value.value.toString()) - is Value.Record -> + is RecordValue -> rustBlock("") { rustTemplate( "let mut out = #{HashMap}::::new();", *codegenScope, ) val ids = mutableListOf() - value.forEach { id, _ -> ids.add(id) } + value.value.forEach { (id, _) -> ids.add(id) } ids.forEach { id -> val v = value.get(id) rust( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt index b0d45366ed0..562ba8e2018 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt @@ -6,13 +6,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import org.jetbrains.annotations.Contract -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Reference -import software.amazon.smithy.rulesengine.language.syntax.fn.FunctionDefinition -import software.amazon.smithy.rulesengine.language.syntax.fn.GetAttr -import software.amazon.smithy.rulesengine.language.visit.ExpressionVisitor +import software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType +import software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType +import software.amazon.smithy.rulesengine.language.evaluation.type.Type +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.ExpressionVisitor +import software.amazon.smithy.rulesengine.language.syntax.expressions.Reference +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.FunctionDefinition +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.GetAttr +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName @@ -51,7 +53,7 @@ class ExpressionGenerator( override fun visitRef(ref: Reference) = writable { if (ownership == Ownership.Owned) { when (ref.type()) { - is Type.Bool -> rust("*${ref.name.rustName()}") + is BooleanType -> rust("*${ref.name.rustName()}") else -> rust("${ref.name.rustName()}.to_owned()") } } else { @@ -75,8 +77,8 @@ class ExpressionGenerator( } } } - if (ownership == Ownership.Owned && getAttr.type() != Type.bool()) { - if (getAttr.type() is Type.Option) { + if (ownership == Ownership.Owned && getAttr.type() != Type.booleanType()) { + if (getAttr.type() is OptionalType) { rust(".map(|t|t.to_owned())") } else { rust(".to_owned()") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt index 8911ddc7a54..a986c50e6da 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt @@ -6,8 +6,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import software.amazon.smithy.rulesengine.language.syntax.Identifier -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.LiteralVisitor import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -24,13 +25,13 @@ import java.util.stream.Stream * The `Document` type is used to support generating JSON-like documents */ class LiteralGenerator(private val ownership: Ownership, private val context: Context) : - Literal.Vistor { + LiteralVisitor { private val runtimeConfig = context.runtimeConfig private val codegenScope = arrayOf( "Document" to RuntimeType.document(runtimeConfig), "HashMap" to RuntimeType.HashMap, ) - override fun visitBool(b: Boolean) = writable { + override fun visitBoolean(b: Boolean) = writable { rust(b.toString()) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt index 93381313926..29b8a8d50f1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt @@ -5,8 +5,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.visit.TemplateVisitor +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.TemplateVisitor import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index c6f9dd6b0a7..d237a8ff661 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -119,18 +119,18 @@ class CustomizableOperationGenerator( self } - /// Convenience for `map_request` where infallible direct mutation of request is acceptable. - pub fn mutate_request(mut self, f: F) -> Self - where - F: #{Fn}(&mut http::Request<#{SdkBody}>) + #{Send} + #{Sync} + 'static, - { - self.interceptors.push( - #{SharedInterceptor}::new( - #{MutateRequestInterceptor}::new(f), - ), - ); - self - } + /// Convenience for `map_request` where infallible direct mutation of request is acceptable. + pub fn mutate_request(mut self, f: F) -> Self + where + F: #{Fn}(&mut #{HttpRequest}) + #{Send} + #{Sync} + 'static, + { + self.interceptors.push( + #{SharedInterceptor}::new( + #{MutateRequestInterceptor}::new(f), + ), + ); + self + } /// Overrides config for a single operation invocation. /// diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index f2a79906dea..44ff13d45e7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -592,6 +592,9 @@ class DefaultProtocolTestGenerator( "SDKAppliedContentEncoding_ec2Query", "SDKAppliedContentEncoding_restJson1", "SDKAppliedContentEncoding_restXml", + "AwsJson11DeserializeIgnoreType", + "AwsJson10DeserializeIgnoreType", + "RestJsonDeserializeIgnoreType", ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt new file mode 100644 index 00000000000..4cc67ae464e --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt @@ -0,0 +1,40 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.testutil + +import software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.ServiceIndex +import software.amazon.smithy.model.loader.ModelAssembler +import software.amazon.smithy.model.loader.ModelDiscovery +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.letIf + +class EndpointTestDiscovery { + fun testCases(): List { + val models = ModelDiscovery.findModels(javaClass.getResource("/META-INF/smithy/manif3st")) + val assembledModels = models.map { url -> ModelAssembler().discoverModels().addImport(url).assemble().unwrap() } + // add a protocol trait so we can generate of it + return assembledModels.map { model -> + if (model.serviceShapes.size > 1) { + PANIC("too many services") + } + val service = model.serviceShapes.first() + if (ServiceIndex.of(model).getProtocols(service).isEmpty()) { + ModelTransformer.create().mapShapes(model) { s -> + s.letIf(s == service) { + s.asServiceShape().get().toBuilder().addTrait( + AwsJson1_0Trait.builder().build(), + ).build() + } + } + } else { + model + } + } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt index 34636f596c5..209e235299a 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt @@ -5,18 +5,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import software.amazon.smithy.rulesengine.testutil.TestDiscovery -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import java.util.stream.Stream - internal class EndpointParamsGeneratorTest { + /* companion object { @JvmStatic fun testSuites(): Stream = TestDiscovery().testSuites() @@ -39,5 +29,5 @@ internal class EndpointParamsGeneratorTest { } } project.compileAndTest() - } + }*/ } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt index 5a798cae4d5..6df462940d3 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt @@ -5,74 +5,60 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource -import software.amazon.smithy.codegen.core.CodegenException import software.amazon.smithy.model.Model -import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.Endpoint -import software.amazon.smithy.rulesengine.language.eval.Scope -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.testutil.TestDiscovery -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointTestGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.awsStandardLib -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import java.util.stream.Stream +import software.amazon.smithy.rust.codegen.client.testutil.EndpointTestDiscovery +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams +import software.amazon.smithy.rust.codegen.core.util.runCommand class EndpointResolverGeneratorTest { companion object { + val testCases = listOf( + "default-values.smithy", + "deprecated-param.smithy", + "duplicate-param.smithy", + "get-attr-type-inference.smithy", + "headers.smithy", + "minimal-ruleset.smithy", + "parse-url.smithy", + "substring.smithy", + "uri-encode.smithy", + "valid-hostlabel.smithy", + "valid-model.smithy", + ) + @JvmStatic - fun testSuites(): Stream = - TestDiscovery().testSuites().map { it.ruleSet().typecheck(); it } + fun testSuites(): List { + return EndpointTestDiscovery().testCases() + } + } + + @Test + fun `test`() { + `generate all rulesets`(testSuites()[0]) } // for tests, load partitions.json from smithy—for real usage, this file will be inserted at codegen time - private val partitionsJson = + /*private val partitionsJson = Node.parse( this::class.java.getResource("/software/amazon/smithy/rulesengine/language/partitions.json")?.readText() ?: throw CodegenException("partitions.json was not present in smithy bundle"), - ) + )*/ @ParameterizedTest(name = "{0}") @MethodSource("testSuites") - fun `generate all rulesets`(suite: TestDiscovery.RulesTestSuite) { + fun `generate all rulesets`(suite: Model) { // snippet to only run one ruleset during tests - if (!suite.toString().contains("hostable")) { - // return - } - val project = TestWorkspace.testProject() - val context = testClientCodegenContext() - suite.ruleSet().typecheck() - project.lib { - val ruleset = EndpointResolverGenerator( - context, - SmithyEndpointsStdLib + awsStandardLib(TestRuntimeConfig, partitionsJson), - ).defaultEndpointResolver(suite.ruleSet()) - val testGenerator = EndpointTestGenerator( - suite.testSuite().testCases, - paramsType = EndpointParamsGenerator(context, suite.ruleSet().parameters).paramsStruct(), - resolverType = ruleset, - suite.ruleSet().parameters, - codegenContext = testClientCodegenContext(model = Model.builder().build()), - endpointCustomizations = listOf(), - ) - testGenerator.generate()(this) - } - project.compileAndTest(runClippy = true) + // if (!suite.toString().contains("hostable")) { + // return + // } + clientIntegrationTest(suite, params = IntegrationTestParams(command = { it -> "cargo test".runCommand(it, mapOf("RUSTFLAGS" to "")) })) } + /* @Test fun `only include actually used functions in endpoints lib`() { testSuites().map { it.ruleSet().sourceLocation.filename }.forEach { println(it) } @@ -108,14 +94,14 @@ class EndpointResolverGeneratorTest { @Test fun generateEndpoints() { val endpoint = Endpoint.builder().url(Expression.of("https://{Region}.amazonaws.com")) - .addHeader("x-amz-test", listOf(Literal.of("header-value"))) + .putHeader("x-amz-test", listOf(Literal.of("header-value"))) .addAuthScheme( "sigv4", hashMapOf("signingName" to Literal.of("service"), "signingScope" to Literal.of("{Region}")), ) .build() val scope = Scope() - scope.insert("Region", Type.string()) + scope.insert("Region", Type.stringType()) endpoint.typeCheck(scope) val context = testClientCodegenContext() val generator = EndpointResolverGenerator(context, listOf()) @@ -130,5 +116,5 @@ class EndpointResolverGeneratorTest { "endpoint" to generator.generateEndpoint(endpoint), ) }.compileAndTest() - } + }*/ } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 390e9d28806..b55faa439f4 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -68,7 +68,7 @@ class EndpointsDecoratorTest { documentation: "string docs", type: "string" }, - aBoolParam: { + ABoolParam: { documentation: "bool docs", type: "boolean" } @@ -120,7 +120,7 @@ class EndpointsDecoratorTest { structure NestedStructure { field: String } - """.asSmithyModel() + """.asSmithyModel(disableValidation = true) @Test fun `resolve endpoint`() { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt index 823d6ace785..58e23cb28b0 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt @@ -9,11 +9,12 @@ import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.ArrayNode import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.stdlib.BooleanEquals import software.amazon.smithy.rulesengine.language.syntax.Identifier -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.BooleanEquals +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.StringEquals +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -29,8 +30,8 @@ internal class ExprGeneratorTest { @Test fun generateExprs() { - val boolEq = Expression.of(true).equal(true) - val strEq = Expression.of("helloworld").equal("goodbyeworld").not() + val boolEq = BooleanEquals.ofExpressions(Expression.of(true), Expression.of(true)) + val strEq = StringEquals.ofExpressions(Expression.of("helloworld"), Expression.of("goodbyeworld")).not() val combined = BooleanEquals.ofExpressions(boolEq, strEq) TestWorkspace.testProject().unitTest { val generator = ExpressionGenerator(Ownership.Borrowed, testContext) @@ -42,10 +43,10 @@ internal class ExprGeneratorTest { @Test fun generateLiterals1() { - val literal = Literal.record( + val literal = Literal.recordLiteral( mutableMapOf( - Identifier.of("this") to Literal.integer(5), - Identifier.of("that") to Literal.string( + Identifier.of("this") to Literal.integerLiteral(5), + Identifier.of("that") to Literal.stringLiteral( Template.fromString("static"), ), ), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt index 8e78e1983c6..95188a9b5dd 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt @@ -6,8 +6,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import org.junit.jupiter.api.Test -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy new file mode 100644 index 00000000000..3a2be041952 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy @@ -0,0 +1,88 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@clientContextParams( + bar: {type: "string", documentation: "a client string parameter"} +) +@endpointRuleSet({ + version: "1.0", + parameters: { + bar: { + type: "string", + documentation: "docs" + }, + endpoint: { + type: "string", + builtIn: "SDK::Endpoint", + required: true, + default: "asdf" + documentation: "docs" + }, + }, + rules: [ + { + "documentation": "Template the region into the URI when FIPS is enabled", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "bar" + } + ] + } + ], + "endpoint": { + "url": "https://example.com" + }, + "type": "endpoint" + }, + { + "conditions": [], + "documentation": "error fallthrough", + "error": "endpoint error", + "type": "error" + } + ] +}) +@endpointTests({ + "version": "1.0", + "testCases": [ + { + "params": { + "bar": "a b", + } + "operationInputs": [{ + "operationName": "GetThing", + "builtInParams": { + "SDK::Endpoint": "https://custom.example.com" + } + }], + "expect": { + "endpoint": { + "url": "https://example.com" + } + } + }, + { + "documentation": "a documentation string", + "expect": { + "error": "endpoint error" + } + } + ] +}) +@aws.protocols#awsJson1_0 +service FizzBuzz { + version: "2022-01-01", + operations: [GetThing] +} + +operation GetThing { + input := {} +} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy new file mode 100644 index 00000000000..c4e5894e074 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy @@ -0,0 +1,44 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "required": false, + "deprecated": { + "message": "use blahdeblah region instead" + }, + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "base rule", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "properties": {} + }, + "type": "endpoint" + } + ], + "version": "1.3" +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy new file mode 100644 index 00000000000..822d6ec93e5 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy @@ -0,0 +1,55 @@ +$version: "1.0" + +namespace example + +use smithy.rules#contextParam +use smithy.rules#endpointRuleSet +use smithy.rules#staticContextParams + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "ParameterBar": { + "type": "String", + "required": true, + "documentation": "docs" + } + }, + "rules": [ + { + "conditions": [], + "documentation": "base rule", + "endpoint": { + "url": "https://{ParameterBar}.amazonaws.com", + "headers": {} + }, + "type": "endpoint" + } + ] +}) +service FizzBuzz { + operations: [GetResource, GetAnotherResource] +} + +@staticContextParams( + "ParameterBar": {value: "bar"} +) +operation GetResource { + input: GetResourceInput +} + +structure GetResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +operation GetAnotherResource { + input: GetAnotherResourceInput +} + +structure GetAnotherResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +string ResourceId diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy new file mode 100644 index 00000000000..50fbe5df74e --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy @@ -0,0 +1,56 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Bucket": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "bucket is set, handle bucket specific endpoints", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + "{Bucket}" + ], + "assign": "bucketUrl" + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketUrl" + }, + "path" + ], + "assign": "path" + } + ], + "endpoint": { + "url": "https://{bucketUrl#authority}/{path}" + }, + "type": "endpoint" + } + ] +}) +@clientContextParams( + Bucket: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy new file mode 100644 index 00000000000..5587c8be35a --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy @@ -0,0 +1,80 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "documentation": "The region to dispatch this request, eg. `us-east-1`." + } + }, + "rules": [ + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "headers": { + "x-amz-region": [ + "{Region}" + ], + "x-amz-multi": [ + "*", + "{Region}" + ] + } + }, + "type": "endpoint" + }, + { + "documentation": "fallback when region is unset", + "conditions": [], + "error": "Region must be set to resolve a valid endpoint", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + "version": "1.0", + "testCases": [ + { + "documentation": "header set to region", + "params": { + "Region": "us-east-1" + }, + "expect": { + "endpoint": { + "url": "https://us-east-1.amazonaws.com", + "headers": { + "x-amz-region": [ + "us-east-1" + ], + "x-amz-multi": [ + "*", + "us-east-1" + ] + } + } + } + } + ] +) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy new file mode 100644 index 00000000000..3a8a927a366 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy @@ -0,0 +1,33 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Region": { + "required": true, + "type": "String", + "documentation": "docs" + } + }, + "rules": [ + { + "conditions": [], + "documentation": "base rule", + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy new file mode 100644 index 00000000000..fce40b5f31e --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy @@ -0,0 +1,264 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Endpoint": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "endpoint is set and is a valid URL", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + "{Endpoint}" + ], + "assign": "url" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}is-ip-addr" + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{url#path}", + "/port" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}/uri-with-port" + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{url#normalizedPath}", + "/" + ] + } + ], + "endpoint": { + "url": "https://{url#scheme}-{url#authority}-nopath.example.com" + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{url#scheme}-{url#authority}.example.com/path-is{url#path}" + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "error": "endpoint was invalid", + "conditions": [], + "type": "error" + } + ] +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "simple URL parsing", + "params": { + "Endpoint": "https://authority.com/custom-path" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com.example.com/path-is/custom-path" + } + } + }, + { + "documentation": "empty path no slash", + "params": { + "Endpoint": "https://authority.com" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com-nopath.example.com" + } + } + }, + { + "documentation": "empty path with slash", + "params": { + "Endpoint": "https://authority.com/" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com-nopath.example.com" + } + } + }, + { + "documentation": "authority with port", + "params": { + "Endpoint": "https://authority.com:8000/port" + }, + "expect": { + "endpoint": { + "url": "https://authority.com:8000/uri-with-port" + } + } + }, + { + "documentation": "http schemes", + "params": { + "Endpoint": "http://authority.com:8000/port" + }, + "expect": { + "endpoint": { + "url": "http://authority.com:8000/uri-with-port" + } + } + }, + { + "documentation": "arbitrary schemes are not supported", + "params": { + "Endpoint": "acbd://example.com" + }, + "expect": { + "error": "endpoint was invalid" + } + }, + { + "documentation": "host labels are not validated", + "params": { + "Endpoint": "http://99_ab.com" + }, + "expect": { + "endpoint": { + "url": "https://http-99_ab.com-nopath.example.com" + } + } + }, + { + "documentation": "host labels are not validated", + "params": { + "Endpoint": "http://99_ab-.com" + }, + "expect": { + "endpoint": { + "url": "https://http-99_ab-.com-nopath.example.com" + } + } + }, + { + "documentation": "invalid URL", + "params": { + "Endpoint": "http://abc.com:a/foo" + }, + "expect": { + "error": "endpoint was invalid" + } + }, + { + "documentation": "IP Address", + "params": { + "Endpoint": "http://192.168.1.1/foo/" + }, + "expect": { + "endpoint": { + "url": "http://192.168.1.1/foo/is-ip-addr" + } + } + }, + { + "documentation": "IP Address with port", + "params": { + "Endpoint": "http://192.168.1.1:1234/foo/" + }, + "expect": { + "endpoint": { + "url": "http://192.168.1.1:1234/foo/is-ip-addr" + } + } + }, + { + "documentation": "IPv6 Address", + "params": { + "Endpoint": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443" + }, + "expect": { + "endpoint": { + "url": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/is-ip-addr" + } + } + }, + { + "documentation": "weird DNS name", + "params": { + "Endpoint": "https://999.999.abc.blah" + }, + "expect": { + "endpoint": { + "url": "https://https-999.999.abc.blah-nopath.example.com" + } + } + }, + { + "documentation": "query in resolved endpoint is not supported", + "params": { + "Endpoint": "https://example.com/path?query1=foo" + }, + "expect": { + "error": "endpoint was invalid" + } + } + ] +) +@clientContextParams( + Endpoint: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy new file mode 100644 index 00000000000..42d93b922d4 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy @@ -0,0 +1,293 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "TestCaseId": { + "type": "string", + "required": true, + "documentation": "Test case id used to select the test case to use" + }, + "Input": { + "type": "string", + "required": true, + "documentation": "the input used to test substring" + } + }, + "rules": [ + { + "documentation": "Substring from beginning of input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "1" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 0, + 4, + false + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "Substring from end of input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "2" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 0, + 4, + true + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "Substring the middle of the string", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "3" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 1, + 3, + false + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "fallback when no tests match", + "conditions": [], + "error": "No tests matched", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "substring when string is long enough", + "params": { + "TestCaseId": "1", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `abcd`" + } + }, + { + "documentation": "substring when string is exactly the right length", + "params": { + "TestCaseId": "1", + "Input": "abcd" + }, + "expect": { + "error": "The value is: `abcd`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "1", + "Input": "abc" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "1", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "1", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "unicode characters always return `None`", + "params": { + "TestCaseId": "1", + "Input": "abcdef\uD83D\uDC31" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "non-ascii cause substring to always return `None`", + "params": { + "TestCaseId": "1", + "Input": "abcdef\u0080" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "the full set of ascii is supported, including non-printable characters", + "params": { + "TestCaseId": "1", + "Input": "\u007Fabcdef" + }, + "expect": { + "error": "The value is: `\u007Fabc`" + } + }, + { + "documentation": "substring when string is long enough", + "params": { + "TestCaseId": "2", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `defg`" + } + }, + { + "documentation": "substring when string is exactly the right length", + "params": { + "TestCaseId": "2", + "Input": "defg" + }, + "expect": { + "error": "The value is: `defg`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "2", + "Input": "abc" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "2", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "2", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is longer", + "params": { + "TestCaseId": "3", + "Input": "defg" + }, + "expect": { + "error": "The value is: `ef`" + } + }, + { + "documentation": "substring when string is exact length", + "params": { + "TestCaseId": "3", + "Input": "def" + }, + "expect": { + "error": "The value is: `ef`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "3", + "Input": "ab" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "3", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "3", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + } + ] +) +@clientContextParams( + TestCaseId: {type: "string", documentation: "docs"} + Input: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy new file mode 100644 index 00000000000..6d2ef57f69c --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy @@ -0,0 +1,132 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "TestCaseId": { + "type": "string", + "required": true, + "documentation": "Test case id used to select the test case to use" + }, + "Input": { + "type": "string", + "required": true, + "documentation": "The input used to test uriEncode" + } + }, + "rules": [ + { + "documentation": "uriEncode on input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "1" + ] + }, + { + "fn": "uriEncode", + "argv": [ + "{Input}" + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "fallback when no tests match", + "conditions": [], + "error": "No tests matched", + "type": "error" + } + ] +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "uriEncode when the string has nothing to encode returns the input", + "params": { + "TestCaseId": "1", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `abcdefg`" + } + }, + { + "documentation": "uriEncode with single character to encode encodes only that character", + "params": { + "TestCaseId": "1", + "Input": "abc:defg" + }, + "expect": { + "error": "The value is: `abc%3Adefg`" + } + }, + { + "documentation": "uriEncode with all ASCII characters to encode encodes all characters", + "params": { + "TestCaseId": "1", + "Input": "/:,?#[]{}|@! $&'()*+;=%<>\"^`\\" + }, + "expect": { + "error": "The value is: `%2F%3A%2C%3F%23%5B%5D%7B%7D%7C%40%21%20%24%26%27%28%29%2A%2B%3B%3D%25%3C%3E%22%5E%60%5C`" + } + }, + { + "documentation": "uriEncode with ASCII characters that should not be encoded returns the input", + "params": { + "TestCaseId": "1", + "Input": "0123456789.underscore_dash-Tilda~" + }, + "expect": { + "error": "The value is: `0123456789.underscore_dash-Tilda~`" + } + }, + { + "documentation": "uriEncode encodes unicode characters", + "params": { + "TestCaseId": "1", + "Input": "\ud83d\ude39" + }, + "expect": { + "error": "The value is: `%F0%9F%98%B9`" + } + }, + { + "documentation": "uriEncode on all printable ASCII characters", + "params": { + "TestCaseId": "1", + "Input": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" + }, + "expect": { + "error": "The value is: `%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~`" + } + }, + { + "documentation": "uriEncode on an empty string", + "params": { + "TestCaseId": "1", + "Input": "" + }, + "expect": { + "error": "The value is: ``" + } + } + ] +) +@clientContextParams( + TestCaseId: {type: "string", documentation: "Test case id used to select the test case to use"}, + Input: {type: "string", documentation: "The input used to test uriEncoder"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy new file mode 100644 index 00000000000..1e951294ea7 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy @@ -0,0 +1,122 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "required": true, + "documentation": "The region to dispatch this request, eg. `us-east-1`." + } + }, + "rules": [ + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com" + }, + "type": "endpoint" + }, + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{Region}-subdomains.amazonaws.com" + }, + "type": "endpoint" + }, + { + "documentation": "Region was not a valid host label", + "conditions": [], + "error": "Invalid hostlabel", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "standard region is a valid hostlabel", + "params": { + "Region": "us-east-1" + }, + "expect": { + "endpoint": { + "url": "https://us-east-1.amazonaws.com" + } + } + }, + { + "documentation": "starting with a number is a valid hostlabel", + "params": { + "Region": "3aws4" + }, + "expect": { + "endpoint": { + "url": "https://3aws4.amazonaws.com" + } + } + }, + { + "documentation": "when there are dots, only match if subdomains are allowed", + "params": { + "Region": "part1.part2" + }, + "expect": { + "endpoint": { + "url": "https://part1.part2-subdomains.amazonaws.com" + } + } + }, + { + "documentation": "a space is never a valid hostlabel", + "params": { + "Region": "part1 part2" + }, + "expect": { + "error": "Invalid hostlabel" + } + }, + { + "documentation": "an empty string is not a valid hostlabel", + "params": { + "Region": "" + }, + "expect": { + "error": "Invalid hostlabel" + } + } + ] +) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy new file mode 100644 index 00000000000..776d3ba7fe0 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy @@ -0,0 +1,73 @@ +$version: "1.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#contextParam +use smithy.rules#endpointRuleSet +use smithy.rules#staticContextParams + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Region": { + "type": "string", + "documentation": "docs" + }, + "ParameterFoo": { + "type": "string", + "documentation": "docs" + }, + "ParameterBar": { + "type": "string", + "documentation": "docs" + }, + "ExtraParameter": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "stub rule", + "conditions": [ ], + "endpoint": { + "url": "https://example.com" + }, + "type": "endpoint" + }, + ] +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz { + operations: [GetResource, GetAnotherResource] +} + +@staticContextParams( + "ParameterFoo": {value: "foo"}, + "ExtraParameter": {value: "someValue"} +) +operation GetResource { + input: GetResourceInput +} + +structure GetResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +@staticContextParams( + "ParameterFoo": {value: "bar"} +) +operation GetAnotherResource { + input: GetAnotherResourceInput +} + +structure GetAnotherResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +string ResourceId diff --git a/codegen-client/src/test/resources/META-INF/smithy/manif3st b/codegen-client/src/test/resources/META-INF/smithy/manif3st new file mode 100644 index 00000000000..b8f6d1fb488 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/manif3st @@ -0,0 +1,11 @@ +endpoint-tests/default-values.smithy +endpoint-tests/deprecated-param.smithy +endpoint-tests/duplicate-param.smithy +endpoint-tests/get-attr-type-inference.smithy +endpoint-tests/headers.smithy +endpoint-tests/minimal-ruleset.smithy +endpoint-tests/parse-url.smithy +endpoint-tests/substring.smithy +endpoint-tests/uri-encode.smithy +endpoint-tests/valid-hostlabel.smithy +endpoint-tests/valid-model.smithy diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index d946ab0b5db..ff92f36c6bd 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -65,9 +65,6 @@ service RestJsonExtras { NullInNonSparse, CaseInsensitiveErrorOperation, EmptyStructWithContentOnWireOp, - // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy - // They're being added in https://github.com/smithy-lang/smithy/pull/1908 - HttpPayloadWithUnion, ], errors: [ExtraError] } @@ -351,96 +348,3 @@ structure EmptyStructWithContentOnWireOpOutput { operation EmptyStructWithContentOnWireOp { output: EmptyStructWithContentOnWireOpOutput, } - -// TODO(https://github.com/awslabs/smithy-rs/issues/2968): Delete the HttpPayloadWithUnion tests below once Smithy vends them -// They're being added in https://github.com/smithy-lang/smithy/pull/1908 - -/// This examples serializes a union in the payload. -@idempotent -@http(uri: "/HttpPayloadWithUnion", method: "PUT") -operation HttpPayloadWithUnion { - input: HttpPayloadWithUnionInputOutput, - output: HttpPayloadWithUnionInputOutput -} - -structure HttpPayloadWithUnionInputOutput { - @httpPayload - nested: UnionPayload, -} - -union UnionPayload { - greeting: String -} - -apply HttpPayloadWithUnion @httpRequestTests([ - { - id: "RestJsonHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restJson1, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: """ - { - "greeting": "hello" - }""", - bodyMediaType: "application/json", - headers: { - "Content-Type": "application/json" - }, - requireHeaders: [ - "Content-Length" - ], - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestJsonHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restJson1, - method: "PUT", - uri: "/HttpPayloadWithUnion", - body: "", - headers: { - "Content-Type": "application/json", - "Content-Length": "0" - }, - params: {} - } -]) - -apply HttpPayloadWithUnion @httpResponseTests([ - { - id: "RestJsonHttpPayloadWithUnion", - documentation: "Serializes a union in the payload.", - protocol: restJson1, - code: 200, - body: """ - { - "greeting": "hello" - }""", - bodyMediaType: "application/json", - headers: { - "Content-Type": "application/json" - }, - params: { - nested: { - greeting: "hello" - } - } - }, - { - id: "RestJsonHttpPayloadWithUnsetUnion", - documentation: "No payload is sent if the union has no value.", - protocol: restJson1, - code: 200, - body: "", - headers: { - "Content-Type": "application/json", - "Content-Length": "0" - }, - params: {} - } -]) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index 87ebb679cc1..08a50a4843f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -137,9 +137,13 @@ fun testRustSettings( ) private const val SmithyVersion = "1.0" -fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = SmithyVersion): Model { +fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = SmithyVersion, disableValidation: Boolean = false): Model { val processed = letIf(!this.trimStart().startsWith("\$version")) { "\$version: ${smithyVersion.dq()}\n$it" } - return Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed).assemble() + val assembler = Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed) + if (disableValidation) { + assembler.disableValidation() + } + return assembler.assemble() .unwrap() } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index ee0038e53c6..d78df801121 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -770,6 +770,7 @@ class ServerProtocolTestGenerator( FailingTest("com.amazonaws.s3#AmazonS3", "S3VirtualHostAccelerateAddressing", TestType.Request), FailingTest("com.amazonaws.s3#AmazonS3", "S3VirtualHostDualstackAccelerateAddressing", TestType.Request), FailingTest("com.amazonaws.s3#AmazonS3", "S3OperationAddressingPreferred", TestType.Request), + FailingTest("com.amazonaws.s3#AmazonS3", "S3OperationNoErrorWrappingResponse", TestType.Response), // AwsJson1.0 failing tests. FailingTest("aws.protocoltests.json10#JsonRpc10", "AwsJson10EndpointTraitWithHostLabel", TestType.Request), diff --git a/design/src/rfcs/rfc0027_endpoints_20.md b/design/src/rfcs/rfc0027_endpoints_20.md index 90739d347bb..b936c07aadc 100644 --- a/design/src/rfcs/rfc0027_endpoints_20.md +++ b/design/src/rfcs/rfc0027_endpoints_20.md @@ -474,7 +474,7 @@ class EndpointParamsDecorator( #### Loading values for builtIns The fundamental point of builtIn values is enabling _other_ code generators to define where these values come from. -Because of that, we will need to expose the ability to customize builtIns. One way to do this is with a new +Because of that, we will need to expose the ability to customize AwsBuiltIns. One way to do this is with a new customization type, `EndpointCustomization`: ```kotlin diff --git a/gradle.properties b/gradle.properties index a899e93f333..1db16fc661d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ kotlin.code.style=official # codegen smithyGradlePluginVersion=0.7.0 -smithyVersion=1.37.0 +smithyVersion=1.39.0 # kotlin kotlinVersion=1.7.21 From 3229089fbac5ccef83fd0d1199f90952b79c21d0 Mon Sep 17 00:00:00 2001 From: Fahad Zubair Date: Thu, 28 Sep 2023 11:05:08 -0400 Subject: [PATCH 138/331] Allow python middleware to set the URI of a request (#3002) ## Motivation and Context Python middleware were unable to change the URI which makes it impossible to change the route of an incoming request in Python. ## Description URI has a #[setter] that Python side can use to change it. ## Testing - Test has been added that ensures URI can be changed from python. - If the URI is modified by a middleware in a local smithy-rs Python server, a different route will be invoked. ## Checklist - I've updated the changelog.next.toml Co-authored-by: Fahad Zubair --- CHANGELOG.next.toml | 6 +++ .../src/middleware/pytests/layer.rs | 20 +++++++- .../src/middleware/pytests/request.rs | 50 ++++++++++++++++++- .../src/middleware/request.rs | 24 ++++++++- 4 files changed, 96 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index bffedc818e6..b7e821dd98b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -195,3 +195,9 @@ message = "The `futures_core::stream::Stream` trait has been removed from public references = ["smithy-rs#2978"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "ysaito1001" + +[[smithy-rs]] +message = "Python middleware can set URI. This can be used to route a request to a different handler." +references = ["smithy-rs#3005"] +meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "server" } +author = "drganjoo" \ No newline at end of file diff --git a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs index cf6cb2d0952..ead40320adf 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs @@ -141,7 +141,14 @@ async def middleware(request, next): body = bytes(await request.body).decode() body_reversed = body[::-1] request.body = body_reversed.encode() + # Add a new header request.headers["X-From-Middleware"] = "yes" + # Change an existing header. + request.headers["X-Existing"] = "changed" + # Delete an existing header. + del request.headers["X-To-Delete"] + # Change the URI. + request.uri = "/changed_uri" return await next(request) "#, ); @@ -149,7 +156,10 @@ async def middleware(request, next): let th = tokio::spawn(async move { let (req, send_response) = handle.next_request().await.unwrap(); - assert_eq!(&"yes", req.headers().get("X-From-Middleware").unwrap()); + assert_eq!("yes", req.headers().get("X-From-Middleware").unwrap()); + assert_eq!("changed", req.headers().get("X-Existing").unwrap()); + assert!(req.headers().get("X-To-Delete").is_none()); + assert_eq!("/changed_uri", req.uri()); let req_body = hyper::body::to_bytes(req.into_body()).await.unwrap(); assert_eq!(req_body, "hello server".chars().rev().collect::()); send_response.send_response( @@ -159,7 +169,13 @@ async def middleware(request, next): ); }); - let request = simple_request("hello server"); + let mut request = simple_request("hello server"); + assert_ne!(request.uri(), "/changed_uri"); + // Add a header that the middleware should modify. + let headers_mut = request.headers_mut(); + headers_mut.insert("X-Existing", http::HeaderValue::from_static("yes")); + // Add a header that the middleware should remove. + headers_mut.insert("X-To-Delete", http::HeaderValue::from_static("delete-this")); let response = service.call(request); assert_body(response.await?, "hello client").await; diff --git a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs index be5d85f8c93..63a560a7bb4 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs @@ -6,7 +6,7 @@ use aws_smithy_http_server_python::PyRequest; use http::{Request, Version}; use hyper::Body; -use pyo3::{prelude::*, py_run}; +use pyo3::{exceptions::PyValueError, prelude::*, py_run}; #[pyo3_asyncio::tokio::test] async fn accessing_request_properties() -> PyResult<()> { @@ -71,3 +71,51 @@ async def handler(req): Ok(()) } + +#[pyo3_asyncio::tokio::test] +async fn accessing_and_changing_request_uri() -> PyResult<()> { + let request = Request::builder() + .uri("/op1") + .body(Body::from("hello world")) + .expect("could not build request"); + let py_request = PyRequest::new(request); + + // Call an async Python method to change the URI and return it. + let modified_req = Python::with_gil(|py| { + let module = PyModule::from_code( + py, + r#" +async def handler(req): + assert req.uri == "/op1" + # add a trailing slash to the uri + req.uri = "/op1/" + assert req.uri == "/op1/" + return req +"#, + "", + "", + )?; + + let req_ref = PyCell::new(py, py_request)?; + let handler = module.getattr("handler")?; + let output = handler.call1((req_ref,))?; + + Ok::<_, PyErr>(pyo3_asyncio::tokio::into_future(output)) + })?? + .await?; + + // Confirm that the URI has been changed when the modified PyRequest instance + // from Python is converted into a http::Request<> instance. + Python::with_gil(|py| { + let request_cell: &PyCell = modified_req.downcast(py)?; + let mut request = request_cell.borrow_mut(); + let http_request = request + .take_inner() + .ok_or_else(|| PyValueError::new_err("inner http request has already been consumed"))?; + assert_eq!(http_request.uri(), "/op1/"); + + Ok::<_, PyErr>(()) + })?; + + Ok(()) +} diff --git a/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs b/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs index d1eff86e002..5e73b106652 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs @@ -10,7 +10,10 @@ use std::sync::Arc; use aws_smithy_http_server::body::Body; use http::{request::Parts, Request}; -use pyo3::{exceptions::PyRuntimeError, prelude::*}; +use pyo3::{ + exceptions::{PyRuntimeError, PyValueError}, + prelude::*, +}; use tokio::sync::Mutex; use super::{PyHeaderMap, PyMiddlewareError}; @@ -76,6 +79,25 @@ impl PyRequest { .ok_or_else(|| PyMiddlewareError::RequestGone.into()) } + /// Sets the URI of this request. + /// + /// :type str: + #[setter] + fn set_uri(&mut self, uri_str: String) -> PyResult<()> { + self.parts.as_mut().map_or_else( + || Err(PyMiddlewareError::RequestGone.into()), + |parts| { + parts.uri = uri_str.parse().map_err(|e: http::uri::InvalidUri| { + PyValueError::new_err(format!( + "URI `{}` cannot be parsed. Error: {}", + uri_str, e + )) + })?; + Ok(()) + }, + ) + } + /// Return the HTTP version of this request. /// /// :type str: From aaf71c83117dd53d9337ab5ca3885089f659a298 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 28 Sep 2023 12:00:20 -0400 Subject: [PATCH 139/331] Produce `&[T]` instead of `Option<&[T]>` for list fields (#2995) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context When the returned field is a list, there is _almost_ never a reason to know if the returned value was null or `[]` — this addresses the 99% case. Before: ```rust fn blah(&self) -> Option<&[T]> { self.blah.as_deref() } ``` After: ```rust fn blah(&self) -> &[T] { self.blah.as_deref().unwrap_or_default() } ``` **note**: no impact on servers by default, see codegen diff. ## Description Update accessors for lists. ## Testing - [x] codegen diff audit (no server changes) - [x] unit tests ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 22 +++++++++ .../retries-with-client-rate-limiting.rs | 8 ++-- .../webassembly/src/list_buckets.rs | 2 +- .../client/smithy/ClientCodegenVisitor.kt | 2 + .../client/smithy/ClientRustSettings.kt | 7 ++- .../smithy/generators/error/ErrorGenerator.kt | 3 ++ .../codegen/core/smithy/CodegenContext.kt | 3 ++ .../codegen/core/smithy/CoreRustSettings.kt | 3 ++ .../smithy/generators/StructureGenerator.kt | 23 ++++++++- .../rust/codegen/core/testutil/TestHelpers.kt | 3 +- .../smithy/generators/BuilderGeneratorTest.kt | 19 +++++--- .../generators/StructureGeneratorTest.kt | 48 ++++++++++--------- .../RecursiveShapesIntegrationTest.kt | 3 +- .../PythonServerStructureGenerator.kt | 2 +- .../server/smithy/ServerCodegenVisitor.kt | 1 + .../smithy/testutil/ServerTestHelpers.kt | 3 +- .../ServerBuilderDefaultValuesTest.kt | 4 +- .../generators/ServerBuilderGeneratorTest.kt | 2 +- .../generators/TsServerStructureGenerator.kt | 3 +- .../src/rfcs/rfc0035_collection_defaults.md | 6 +-- 20 files changed, 119 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b7e821dd98b..e6f7bc0d53e 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -178,6 +178,28 @@ references = ["smithy-rs#2985"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "rcoh" +[[smithy-rs]] +message = """ +Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting: +```json +{ + "codegen": { + "flattenCollectionAccessors": false, + ... + } +} +``` +""" +references = ["smithy-rs#2995"] +author = "rcoh" +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } + +[[aws-sdk-rust]] +message = "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`." +references = ["smithy-rs#2995"] +author = "rcoh" +meta = { "breaking" = true, "tada" = false, "bug" = false } + [[smithy-rs]] message = "Produce better docs when items are marked @required" references = ["smithy-rs#2996"] diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index f811d8cf243..211e8630a07 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -86,14 +86,14 @@ async fn test_adaptive_retries_with_no_throttling_errors() { let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); let res = client.list_tables().send().await.unwrap(); assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + assert_eq!(res.table_names(), expected_table_names.as_slice()); // Three requests should have been made, two failing & one success assert_eq!(conn.requests().len(), 3); let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); let res = client.list_tables().send().await.unwrap(); assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + assert_eq!(res.table_names(), expected_table_names.as_slice()); // Two requests should have been made, one failing & one success (plus previous requests) assert_eq!(conn.requests().len(), 5); @@ -141,7 +141,7 @@ async fn test_adaptive_retries_with_throttling_errors() { let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); let res = client.list_tables().send().await.unwrap(); assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + assert_eq!(res.table_names(), expected_table_names.as_slice()); // Three requests should have been made, two failing & one success assert_eq!(conn.requests().len(), 3); @@ -149,7 +149,7 @@ async fn test_adaptive_retries_with_throttling_errors() { let res = client.list_tables().send().await.unwrap(); assert!(Duration::from_secs(48) < sleep_impl.total_duration()); assert!(Duration::from_secs(49) > sleep_impl.total_duration()); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); + assert_eq!(res.table_names(), expected_table_names.as_slice()); // Two requests should have been made, one failing & one success (plus previous requests) assert_eq!(conn.requests().len(), 5); } diff --git a/aws/sdk/integration-tests/webassembly/src/list_buckets.rs b/aws/sdk/integration-tests/webassembly/src/list_buckets.rs index 53504e66440..692be0e071c 100644 --- a/aws/sdk/integration-tests/webassembly/src/list_buckets.rs +++ b/aws/sdk/integration-tests/webassembly/src/list_buckets.rs @@ -11,7 +11,7 @@ pub async fn s3_list_buckets() { let shared_config = get_default_config().await; let client = Client::new(&shared_config); let result = client.list_buckets().send().await.unwrap(); - assert_eq!(result.buckets().unwrap().len(), 2) + assert_eq!(result.buckets().len(), 2) } #[tokio::test] diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt index efeef74e4be..ab26c7ae9ec 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt @@ -223,6 +223,7 @@ class ClientCodegenVisitor( this, shape, codegenDecorator.structureCustomizations(codegenContext, emptyList()), + structSettings = codegenContext.structSettings(), ).render() implBlock(symbolProvider.toSymbol(shape)) { @@ -246,6 +247,7 @@ class ClientCodegenVisitor( shape, errorTrait, codegenDecorator.errorImplCustomizations(codegenContext, emptyList()), + codegenContext.structSettings(), ) errorGenerator::renderStruct to errorGenerator::renderBuilder } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index acc0a591844..67b76f0862b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -82,6 +82,7 @@ data class ClientRustSettings( data class ClientCodegenConfig( override val formatTimeoutSeconds: Int = defaultFormatTimeoutSeconds, override val debugMode: Boolean = defaultDebugMode, + override val flattenCollectionAccessors: Boolean = defaultFlattenAccessors, val nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, val renameExceptions: Boolean = defaultRenameExceptions, val includeFluentClient: Boolean = defaultIncludeFluentClient, @@ -92,7 +93,7 @@ data class ClientCodegenConfig( val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig, val enableUserConfigurableRuntimePlugins: Boolean = defaultEnableUserConfigurableRuntimePlugins, ) : CoreCodegenConfig( - formatTimeoutSeconds, debugMode, + formatTimeoutSeconds, debugMode, defaultFlattenAccessors, ) { companion object { private const val defaultRenameExceptions = true @@ -103,10 +104,14 @@ data class ClientCodegenConfig( private const val defaultEnableUserConfigurableRuntimePlugins = true private const val defaultNullabilityCheckMode = "CLIENT" + // Note: only clients default to true, servers default to false + private const val defaultFlattenAccessors = true + fun fromCodegenConfigAndNode(coreCodegenConfig: CoreCodegenConfig, node: Optional) = if (node.isPresent) { ClientCodegenConfig( formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds, + flattenCollectionAccessors = node.get().getBooleanMemberOrDefault("flattenCollectionAccessors", defaultFlattenAccessors), debugMode = coreCodegenConfig.debugMode, eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList").map { array -> array.toList().mapNotNull { node -> diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt index 21d4f24aef6..d90fd441529 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt @@ -22,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderSection +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection @@ -34,6 +35,7 @@ class ErrorGenerator( private val shape: StructureShape, private val error: ErrorTrait, private val implCustomizations: List, + private val structSettings: StructSettings, ) { private val runtimeConfig = symbolProvider.config.runtimeConfig private val symbol = symbolProvider.toSymbol(shape) @@ -59,6 +61,7 @@ class ErrorGenerator( } }, ), + structSettings, ).render() ErrorImplGenerator( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt index ea427fc65f8..a08eddb5ed5 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings /** * [CodegenContext] contains code-generation context that is _common to all_ smithy-rs plugins. @@ -91,5 +92,7 @@ abstract class CodegenContext( "A ModuleDocProvider must be set on the CodegenContext" } + fun structSettings() = StructSettings(settings.codegenConfig.flattenCollectionAccessors) + abstract fun builderInstantiator(): BuilderInstantiator } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt index b477ab5607f..5e103f14625 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt @@ -41,16 +41,19 @@ const val CODEGEN_SETTINGS = "codegen" open class CoreCodegenConfig( open val formatTimeoutSeconds: Int = defaultFormatTimeoutSeconds, open val debugMode: Boolean = defaultDebugMode, + open val flattenCollectionAccessors: Boolean = defaultFlattenMode, ) { companion object { const val defaultFormatTimeoutSeconds = 20 const val defaultDebugMode = false + const val defaultFlattenMode = false fun fromNode(node: Optional): CoreCodegenConfig = if (node.isPresent) { CoreCodegenConfig( formatTimeoutSeconds = node.get().getNumberMemberOrDefault("formatTimeoutSeconds", defaultFormatTimeoutSeconds).toInt(), debugMode = node.get().getBooleanMemberOrDefault("debugMode", defaultDebugMode), + flattenCollectionAccessors = node.get().getBooleanMemberOrDefault("flattenCollectionAccessors", defaultFlattenMode), ) } else { CoreCodegenConfig( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt index 80d89e341ff..cd18547094b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt @@ -16,12 +16,14 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.asDeref import software.amazon.smithy.rust.codegen.core.rustlang.asRef import software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape +import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape import software.amazon.smithy.rust.codegen.core.rustlang.isCopy import software.amazon.smithy.rust.codegen.core.rustlang.isDeref import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization @@ -53,12 +55,15 @@ sealed class StructureSection(name: String) : Section(name) { /** Customizations for StructureGenerator */ abstract class StructureCustomization : NamedCustomization() +data class StructSettings(val flattenVecAccessors: Boolean) + open class StructureGenerator( val model: Model, private val symbolProvider: RustSymbolProvider, private val writer: RustWriter, private val shape: StructureShape, private val customizations: List, + private val structSettings: StructSettings, ) { companion object { /** Reserved struct member names */ @@ -131,15 +136,26 @@ open class StructureGenerator( writer.rustBlock("impl $name") { // Render field accessor methods forEachMember(accessorMembers) { member, memberName, memberSymbol -> - writer.renderMemberDoc(member, memberSymbol) - writer.deprecatedShape(member) val memberType = memberSymbol.rustType() + var unwrapOrDefault = false val returnType = when { + // Automatically flatten vecs + structSettings.flattenVecAccessors && memberType is RustType.Option && memberType.stripOuter() is RustType.Vec -> { + unwrapOrDefault = true + memberType.stripOuter().asDeref().asRef() + } memberType.isCopy() -> memberType memberType is RustType.Option && memberType.member.isDeref() -> memberType.asDeref() memberType.isDeref() -> memberType.asDeref().asRef() else -> memberType.asRef() } + writer.renderMemberDoc(member, memberSymbol) + if (unwrapOrDefault) { + // Add a newline + writer.docs("") + writer.docs("If no value was sent for this field, a default will be set. If you want to determine if no value was sent, use `.$memberName.is_none()`.") + } + writer.deprecatedShape(member) writer.rustBlock("pub fn $memberName(&self) -> ${returnType.render()}") { when { memberType.isCopy() -> rust("self.$memberName") @@ -148,6 +164,9 @@ open class StructureGenerator( memberType.isDeref() -> rust("use std::ops::Deref; self.$memberName.deref()") else -> rust("&self.$memberName") } + if (unwrapOrDefault) { + rust(".unwrap_or_default()") + } } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index 08a50a4843f..c641f895733 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -37,6 +37,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.module import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait @@ -198,7 +199,7 @@ fun StructureShape.renderWithModelBuilder( ) { val struct = this rustCrate.withModule(symbolProvider.moduleForShape(struct)) { - StructureGenerator(model, symbolProvider, this, struct, emptyList()).render() + StructureGenerator(model, symbolProvider, this, struct, emptyList(), StructSettings(true)).render() implBlock(symbolProvider.toSymbol(struct)) { BuilderGenerator.renderConvenienceMethod(this, symbolProvider, struct) } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index 06888429e65..2220a6f10f6 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -7,14 +7,17 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import org.junit.jupiter.api.Test import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.Model import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.AllowDeprecated +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.Default +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.setDefault import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace @@ -37,8 +40,8 @@ internal class BuilderGeneratorTest { val project = TestWorkspace.testProject(provider) project.moduleFor(inner) { rust("##![allow(deprecated)]") - StructureGenerator(model, provider, this, inner, emptyList()).render() - StructureGenerator(model, provider, this, struct, emptyList()).render() + generator(model, provider, this, inner).render() + generator(model, provider, this, struct).render() implBlock(provider.toSymbol(struct)) { BuilderGenerator.renderConvenienceMethod(this, provider, struct) } @@ -73,8 +76,8 @@ internal class BuilderGeneratorTest { project.moduleFor(StructureGeneratorTest.struct) { AllowDeprecated.render(this) - StructureGenerator(model, provider, this, inner, emptyList()).render() - StructureGenerator(model, provider, this, struct, emptyList()).render() + generator(model, provider, this, inner).render() + generator(model, provider, this, struct).render() implBlock(provider.toSymbol(struct)) { BuilderGenerator.renderConvenienceMethod(this, provider, struct) } @@ -94,12 +97,14 @@ internal class BuilderGeneratorTest { project.compileAndTest() } + private fun generator(model: Model, provider: RustSymbolProvider, writer: RustWriter, shape: StructureShape) = StructureGenerator(model, provider, writer, shape, emptyList(), StructSettings(flattenVecAccessors = true)) + @Test fun `builder for a struct with sensitive fields should implement the debug trait as such`() { val provider = testSymbolProvider(model) val project = TestWorkspace.testProject(provider) project.moduleFor(credentials) { - StructureGenerator(model, provider, this, credentials, emptyList()).render() + generator(model, provider, this, credentials).render() implBlock(provider.toSymbol(credentials)) { BuilderGenerator.renderConvenienceMethod(this, provider, credentials) } @@ -126,7 +131,7 @@ internal class BuilderGeneratorTest { val provider = testSymbolProvider(model) val project = TestWorkspace.testProject(provider) project.moduleFor(secretStructure) { - StructureGenerator(model, provider, this, secretStructure, emptyList()).render() + generator(model, provider, this, secretStructure).render() implBlock(provider.toSymbol(secretStructure)) { BuilderGenerator.renderConvenienceMethod(this, provider, secretStructure) } @@ -188,7 +193,7 @@ internal class BuilderGeneratorTest { val project = TestWorkspace.testProject(provider) val shape: StructureShape = model.lookup("com.test#MyStruct") project.useShapeWriter(shape) { - StructureGenerator(model, provider, this, shape, listOf()).render() + generator(model, provider, this, shape).render() BuilderGenerator(model, provider, shape, listOf()).render(this) unitTest("test_defaults") { rustTemplate( diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt index af7ff639b5b..f31fd538e83 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt @@ -8,6 +8,7 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import io.kotest.matchers.string.shouldContainInOrder import io.kotest.matchers.string.shouldNotContain import org.junit.jupiter.api.Test +import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustModule @@ -15,6 +16,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel @@ -92,13 +94,15 @@ class StructureGeneratorTest { ) } + private fun structureGenerator(model: Model, provider: RustSymbolProvider, writer: RustWriter, shape: StructureShape) = StructureGenerator(model, provider, writer, shape, emptyList(), StructSettings(flattenVecAccessors = true)) + @Test fun `generate basic structures`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) val project = TestWorkspace.testProject(provider) project.useShapeWriter(inner) { - StructureGenerator(model, provider, this, inner, emptyList()).render() - StructureGenerator(model, provider, this, struct, emptyList()).render() + structureGenerator(model, provider, this, inner).render() + structureGenerator(model, provider, this, struct).render() unitTest( "struct_fields_optional", """ @@ -120,11 +124,11 @@ class StructureGeneratorTest { project.lib { Attribute.AllowDeprecated.render(this) } project.moduleFor(inner) { - val innerGenerator = StructureGenerator(model, provider, this, inner, emptyList()) + val innerGenerator = structureGenerator(model, provider, this, inner) innerGenerator.render() } project.withModule(RustModule.public("structs")) { - val generator = StructureGenerator(model, provider, this, struct, emptyList()) + val generator = structureGenerator(model, provider, this, struct) generator.render() } // By putting the test in another module, it can't access the struct @@ -147,7 +151,7 @@ class StructureGeneratorTest { fun `generate a custom debug implementation when the sensitive trait is applied to some members`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) TestWorkspace.testProject().unitTest { - StructureGenerator(model, provider, this, credentials, emptyList()).render() + structureGenerator(model, provider, this, credentials).render() this.unitTest( "sensitive_fields_redacted", @@ -167,7 +171,7 @@ class StructureGeneratorTest { fun `generate a custom debug implementation when the sensitive trait is applied to the struct`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) TestWorkspace.testProject().unitTest { - StructureGenerator(model, provider, this, secretStructure, emptyList()).render() + structureGenerator(model, provider, this, secretStructure).render() this.unitTest( "sensitive_structure_redacted", @@ -186,8 +190,8 @@ class StructureGeneratorTest { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) val project = TestWorkspace.testProject(provider) project.useShapeWriter(inner) { - val secretGenerator = StructureGenerator(model, provider, this, secretStructure, emptyList()) - val generator = StructureGenerator(model, provider, this, structWithInnerSecretStructure, emptyList()) + val secretGenerator = structureGenerator(model, provider, this, secretStructure) + val generator = structureGenerator(model, provider, this, structWithInnerSecretStructure) secretGenerator.render() generator.render() unitTest( @@ -230,8 +234,8 @@ class StructureGeneratorTest { Attribute.DenyMissingDocs.render(this) } project.moduleFor(model.lookup("com.test#Inner")) { - StructureGenerator(model, provider, this, model.lookup("com.test#Inner"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("com.test#MyStruct"), emptyList()).render() + structureGenerator(model, provider, this, model.lookup("com.test#Inner")).render() + structureGenerator(model, provider, this, model.lookup("com.test#MyStruct")).render() } project.compileAndTest() @@ -241,7 +245,7 @@ class StructureGeneratorTest { fun `documents are optional in structs`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) TestWorkspace.testProject().unitTest { - StructureGenerator(model, provider, this, structWithDoc, emptyList()).render() + structureGenerator(model, provider, this, structWithDoc).render() rust( """ let _struct = StructWithDoc { @@ -274,10 +278,10 @@ class StructureGeneratorTest { val project = TestWorkspace.testProject(provider) project.lib { rust("##![allow(deprecated)]") } project.moduleFor(model.lookup("test#Foo")) { - StructureGenerator(model, provider, this, model.lookup("test#Foo"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Bar"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Baz"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Qux"), emptyList()).render() + structureGenerator(model, provider, this, model.lookup("test#Foo")).render() + structureGenerator(model, provider, this, model.lookup("test#Bar")).render() + structureGenerator(model, provider, this, model.lookup("test#Baz")).render() + structureGenerator(model, provider, this, model.lookup("test#Qux")).render() } // turn on clippy to check the semver-compliant version of `since`. @@ -307,9 +311,9 @@ class StructureGeneratorTest { val project = TestWorkspace.testProject(provider) project.lib { rust("##![allow(deprecated)]") } project.moduleFor(model.lookup("test#Nested")) { - StructureGenerator(model, provider, this, model.lookup("test#Nested"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Foo"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Bar"), emptyList()).render() + structureGenerator(model, provider, this, model.lookup("test#Nested")).render() + structureGenerator(model, provider, this, model.lookup("test#Foo")).render() + structureGenerator(model, provider, this, model.lookup("test#Bar")).render() } project.compileAndTest() @@ -356,8 +360,8 @@ class StructureGeneratorTest { val project = TestWorkspace.testProject(provider) project.useShapeWriter(inner) { - StructureGenerator(testModel, provider, this, testModel.lookup("test#One"), emptyList()).render() - StructureGenerator(testModel, provider, this, testModel.lookup("test#Two"), emptyList()).render() + structureGenerator(testModel, provider, this, testModel.lookup("test#One")).render() + structureGenerator(testModel, provider, this, testModel.lookup("test#Two")).render() rustBlock("fn compile_test_one(one: &crate::test_model::One)") { rust( @@ -414,7 +418,7 @@ class StructureGeneratorTest { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) RustWriter.forModule("test").let { writer -> - StructureGenerator(model, provider, writer, struct, emptyList()).render() + structureGenerator(model, provider, writer, struct).render() writer.toString().shouldNotContain("#[doc(hidden)]") } } @@ -430,7 +434,7 @@ class StructureGeneratorTest { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) RustWriter.forModule("test").let { writer -> - StructureGenerator(model, provider, writer, struct, emptyList()).render() + structureGenerator(model, provider, writer, struct).render() writer.toString().shouldNotContain("#[doc(hidden)]") } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt index d204a605c43..110836fdadd 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt @@ -11,6 +11,7 @@ import org.junit.jupiter.api.assertThrows import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace @@ -50,7 +51,7 @@ class RecursiveShapesIntegrationTest { val structures = listOf("Expr", "SecondTree").map { input.lookup("com.example#$it") } structures.forEach { struct -> project.moduleFor(struct) { - StructureGenerator(input, symbolProvider, this, struct, emptyList()).render() + StructureGenerator(input, symbolProvider, this, struct, emptyList(), StructSettings(true)).render() } } input.lookup("com.example#Atom").also { atom -> diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt index d9d2df8cc2f..9357383e6b2 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt @@ -40,7 +40,7 @@ class PythonServerStructureGenerator( private val codegenContext: ServerCodegenContext, private val writer: RustWriter, private val shape: StructureShape, -) : StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList()) { +) : StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList(), codegenContext.structSettings()) { private val symbolProvider = codegenContext.symbolProvider private val libName = codegenContext.settings.moduleName.toSnakeCase() diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index c8dc16cafd1..c27cba8ae55 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -294,6 +294,7 @@ open class ServerCodegenVisitor( this, shape, codegenDecorator.structureCustomizations(codegenContext, emptyList()), + structSettings = codegenContext.structSettings(), ).render() shape.getTrait()?.also { errorTrait -> diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt index 82b8af20eac..60978c65eef 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt @@ -17,6 +17,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.testutil.TestModuleDocProvider import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig @@ -145,7 +146,7 @@ fun StructureShape.serverRenderWithModelBuilder( writer: RustWriter, protocol: ServerProtocol? = null, ) { - StructureGenerator(model, symbolProvider, writer, this, emptyList()).render() + StructureGenerator(model, symbolProvider, writer, this, emptyList(), StructSettings(false)).render() val serverCodegenContext = serverTestCodegenContext(model) // Note that this always uses `ServerBuilderGenerator` and _not_ `ServerBuilderGeneratorWithoutPublicConstrainedTypes`, // regardless of the `publicConstrainedTypes` setting. diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt index e8021ad9e74..172ad5f4d98 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt @@ -197,7 +197,7 @@ class ServerBuilderDefaultValuesTest { model.lookup("com.test#Language"), SmithyValidationExceptionConversionGenerator(codegenContext), ).render(writer) - StructureGenerator(model, symbolProvider, writer, struct, emptyList()).render() + StructureGenerator(model, symbolProvider, writer, struct, emptyList(), codegenContext.structSettings()).render() } private fun writeServerBuilderGenerator(rustCrate: RustCrate, writer: RustWriter, model: Model, symbolProvider: RustSymbolProvider) { @@ -220,7 +220,7 @@ class ServerBuilderDefaultValuesTest { model.lookup("com.test#Language"), SmithyValidationExceptionConversionGenerator(codegenContext), ).render(writer) - StructureGenerator(model, symbolProvider, writer, struct, emptyList()).render() + StructureGenerator(model, symbolProvider, writer, struct, emptyList(), codegenContext.structSettings()).render() } private fun structSetters(values: Map, optional: Boolean) = writable { diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt index 0ddbc1c5427..27e45c373c1 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt @@ -45,7 +45,7 @@ class ServerBuilderGeneratorTest { val writer = this val shape = model.lookup("test#Credentials") - StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList()).render() + StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList(), codegenContext.structSettings()).render() val builderGenerator = ServerBuilderGenerator( codegenContext, shape, diff --git a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt index 87d8300ca73..cf08892bc9b 100644 --- a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt +++ b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rustInlineTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency @@ -27,7 +28,7 @@ class TsServerStructureGenerator( private val symbolProvider: RustSymbolProvider, private val writer: RustWriter, private val shape: StructureShape, -) : StructureGenerator(model, symbolProvider, writer, shape, listOf()) { +) : StructureGenerator(model, symbolProvider, writer, shape, listOf(), StructSettings(flattenVecAccessors = false)) { private val napiDerive = TsServerCargoDependency.NapiDerive.toType() diff --git a/design/src/rfcs/rfc0035_collection_defaults.md b/design/src/rfcs/rfc0035_collection_defaults.md index 218782f7894..2237c02b2b2 100644 --- a/design/src/rfcs/rfc0035_collection_defaults.md +++ b/design/src/rfcs/rfc0035_collection_defaults.md @@ -3,7 +3,7 @@ RFC: Collection Defaults ============= -> Status: Accepted +> Status: Implemented > > Applies to: client @@ -78,5 +78,5 @@ No, many existing APIs don't have the default trait. Changes checklist ----------------- Estimated total work: 2 days -- [ ] Update accessor method generation to auto flatten lists -- [ ] Update docs for accessors to guide users to `.field.is_some()` if they MUST determine if the field was set. +- [x] Update accessor method generation to auto flatten lists +- [x] Update docs for accessors to guide users to `.field.is_some()` if they MUST determine if the field was set. From bc418284516975461dc0bee44ea999361f5c95be Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 28 Sep 2023 12:50:33 -0500 Subject: [PATCH 140/331] add Sigv4A support (#2939) ## Motivation smithy-rs#1797 ## Description This PR adds Sigv4a support along with many tests that were ported from the CRT Sigv4a project. **It does not include**: - An E2E test. We should create one, but doing so requires us to set up MRAP which is a good amount of work. - A fuzz test. While I wrote and ran one on my machine, I found the fuzz testing tool to be really difficult to use and it would take some work to include fuzz testing in CI. Additionally, test Sigv4a is annoying because Sigv4a signing is non-deterministic. Because of this, the tests test signature generation by first signing a request, and then by verifying that signature (_This is how the CRT tests this feature_). ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- .gitignore | 1 + CHANGELOG.next.toml | 8 +- aws/rust-runtime/aws-endpoint/src/lib.rs | 2 +- .../src/glacier_interceptors.rs | 2 +- .../src/http_request_checksum.rs | 2 +- .../src/presigning_interceptors.rs | 2 +- aws/rust-runtime/aws-runtime/Cargo.toml | 1 + aws/rust-runtime/aws-runtime/src/auth.rs | 191 ++++++ .../aws-runtime/src/auth/sigv4.rs | 277 ++------ .../aws-runtime/src/auth/sigv4a.rs | 321 +++++++++ .../aws-sig-auth/src/event_stream.rs | 22 +- aws/rust-runtime/aws-sig-auth/src/signer.rs | 7 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 37 +- .../double-encode-path.creq | 2 +- .../aws-sigv4/aws-sig-v4a-test-suite/LICENSE | 202 ++++++ .../aws-sigv4/aws-sig-v4a-test-suite/NOTICE | 2 + .../aws-sig-v4a-test-suite/README.md | 24 + .../get-header-key-duplicate/context.json | 12 + .../header-canonical-request.txt | 10 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 8 + .../query-string-to-sign.txt | 4 + .../get-header-key-duplicate/request.txt | 5 + .../get-header-value-order/context.json | 12 + .../header-canonical-request.txt | 10 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 8 + .../query-string-to-sign.txt | 4 + .../get-header-value-order/request.txt | 6 + .../get-header-value-trim/context.json | 12 + .../header-canonical-request.txt | 11 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 9 + .../query-string-to-sign.txt | 4 + .../get-header-value-trim/request.txt | 4 + .../get-relative-normalized/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-relative-normalized/request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../get-relative-unnormalized/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-relative-unnormalized/request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../get-slash-normalized/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-slash-normalized/request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../get-slash-unnormalized/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-slash-unnormalized/request.txt | 2 + .../get-slashes-normalized/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-slashes-normalized/request.txt | 2 + .../get-slashes-unnormalized/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-slashes-unnormalized/request.txt | 2 + .../get-unreserved/context.json | 12 + .../header-canonical-request.txt | 9 + .../get-unreserved/header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../get-unreserved/query-string-to-sign.txt | 4 + .../get-unreserved/request.txt | 2 + .../get-vanilla-empty-query-key/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-vanilla-empty-query-key/request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../get-vanilla-query-unreserved/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-vanilla-query-unreserved/request.txt | 2 + .../get-vanilla-query/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../get-vanilla-query/request.txt | 2 + .../context.json | 13 + .../header-canonical-request.txt | 10 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../get-vanilla/context.json | 12 + .../get-vanilla/header-canonical-request.txt | 9 + .../get-vanilla/header-string-to-sign.txt | 4 + .../get-vanilla/query-canonical-request.txt | 7 + .../get-vanilla/query-string-to-sign.txt | 4 + .../get-vanilla/request.txt | 2 + .../post-header-key-case/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../post-header-key-case/request.txt | 2 + .../post-header-key-sort/context.json | 12 + .../header-canonical-request.txt | 10 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 8 + .../query-string-to-sign.txt | 4 + .../post-header-key-sort/request.txt | 3 + .../post-header-value-case/context.json | 12 + .../header-canonical-request.txt | 10 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 8 + .../query-string-to-sign.txt | 4 + .../post-header-value-case/request.txt | 3 + .../post-sts-header-after/context.json | 14 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../post-sts-header-after/request.txt | 2 + .../post-sts-header-before/context.json | 14 + .../header-canonical-request.txt | 10 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../post-sts-header-before/request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../request.txt | 2 + .../post-vanilla-query/context.json | 12 + .../header-canonical-request.txt | 9 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 7 + .../query-string-to-sign.txt | 4 + .../post-vanilla-query/request.txt | 2 + .../post-vanilla/context.json | 12 + .../post-vanilla/header-canonical-request.txt | 9 + .../post-vanilla/header-string-to-sign.txt | 4 + .../post-vanilla/query-canonical-request.txt | 7 + .../post-vanilla/query-string-to-sign.txt | 4 + .../post-vanilla/request.txt | 2 + .../context.json | 12 + .../header-canonical-request.txt | 12 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 9 + .../query-string-to-sign.txt | 4 + .../request.txt | 6 + .../post-x-www-form-urlencoded/context.json | 12 + .../header-canonical-request.txt | 12 + .../header-string-to-sign.txt | 4 + .../query-canonical-request.txt | 9 + .../query-string-to-sign.txt | 4 + .../post-x-www-form-urlencoded/request.txt | 6 + aws/rust-runtime/aws-sigv4/benches/sigv4a.rs | 29 + .../aws-sigv4/src/event_stream.rs | 41 +- .../aws-sigv4/src/http_request.rs | 145 ++++- .../src/http_request/canonical_request.rs | 285 +++++--- .../http_request/canonical_request/sigv4a.rs | 12 + .../aws-sigv4/src/http_request/error.rs | 2 +- .../aws-sigv4/src/http_request/settings.rs | 13 +- .../aws-sigv4/src/http_request/sign.rs | 616 +++++++++++++++--- .../aws-sigv4/src/http_request/test.rs | 256 ++++++-- .../http_request/uri_path_normalization.rs | 14 +- aws/rust-runtime/aws-sigv4/src/lib.rs | 164 +---- aws/rust-runtime/aws-sigv4/src/sign.rs | 87 +-- aws/rust-runtime/aws-sigv4/src/sign/v4.rs | 220 +++++++ aws/rust-runtime/aws-sigv4/src/sign/v4a.rs | 215 ++++++ aws/rust-runtime/aws-types/src/region.rs | 47 ++ .../smithy/rustsdk/CredentialProviders.kt | 53 +- .../smithy/rustsdk/SdkConfigDecorator.kt | 1 + .../smithy/rustsdk/SigV4AuthDecorator.kt | 53 +- .../endpoints/OperationInputTestGenerator.kt | 3 - .../amazon/smithy/rustsdk/TestUtil.kt | 3 +- .../integration-tests/s3/tests/endpoints.rs | 32 +- .../codegen/client/smithy/endpoint/Util.kt | 47 +- .../OperationRuntimePluginGenerator.kt | 25 +- .../rust/codegen/core/rustlang/RustType.kt | 3 + .../rust/codegen/core/rustlang/RustWriter.kt | 8 + .../src/client/orchestrator/auth.rs | 80 +-- rust-runtime/aws-smithy-types/README.md | 2 +- 236 files changed, 3948 insertions(+), 875 deletions(-) create mode 100644 aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs create mode 100755 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE create mode 100755 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt create mode 100644 aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt create mode 100644 aws/rust-runtime/aws-sigv4/benches/sigv4a.rs create mode 100644 aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs create mode 100644 aws/rust-runtime/aws-sigv4/src/sign/v4.rs create mode 100644 aws/rust-runtime/aws-sigv4/src/sign/v4a.rs diff --git a/.gitignore b/.gitignore index 268344ecb12..aad300982ae 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ target/ # IDEs .idea/ +.vscode/ .project .settings .classpath diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index e6f7bc0d53e..aa612327bda 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -222,4 +222,10 @@ author = "ysaito1001" message = "Python middleware can set URI. This can be used to route a request to a different handler." references = ["smithy-rs#3005"] meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "server" } -author = "drganjoo" \ No newline at end of file +author = "drganjoo" + +[[aws-sdk-rust]] +message = "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge." +references = ["smithy-rs#1797"] +meta = { "breaking" = true, "tada" = true, "bug" = false } +author = "Velfi" diff --git a/aws/rust-runtime/aws-endpoint/src/lib.rs b/aws/rust-runtime/aws-endpoint/src/lib.rs index b1d0861b365..640e4a87874 100644 --- a/aws/rust-runtime/aws-endpoint/src/lib.rs +++ b/aws/rust-runtime/aws-endpoint/src/lib.rs @@ -212,7 +212,7 @@ mod test { let req = AwsAuthStage.apply(req).expect("should succeed"); assert_eq!( req.properties().get(), - Some(&SigningRegion::from(Region::new("us-east-override"))) + Some(&SigningRegion::from_static("us-east-override")) ); assert_eq!( req.properties().get(), diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 53500eae50a..80cac6842d4 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -6,7 +6,7 @@ // This code is referenced in generated code, so the compiler doesn't realize it is used. #![allow(dead_code)] -use aws_runtime::auth::sigv4::SigV4OperationSigningConfig; +use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream; diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index 701a2e36a0b..c6ce150e5bc 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -8,7 +8,7 @@ //! Interceptor for handling Smithy `@httpChecksum` request checksumming with AWS SigV4 use aws_http::content_encoding::{AwsChunkedBody, AwsChunkedBodyOptions}; -use aws_runtime::auth::sigv4::SigV4OperationSigningConfig; +use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; use aws_smithy_checksums::ChecksumAlgorithm; use aws_smithy_checksums::{body::calculate, http::HttpChecksum}; diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs index 7a477925f05..a981abf0b1d 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs @@ -7,7 +7,7 @@ use crate::presigning::PresigningConfig; use crate::serialization_settings::HeaderSerializationSettings; -use aws_runtime::auth::sigv4::{HttpSignatureType, SigV4OperationSigningConfig}; +use aws_runtime::auth::{HttpSignatureType, SigV4OperationSigningConfig}; use aws_runtime::invocation_id::InvocationIdInterceptor; use aws_runtime::request_info::RequestInfoInterceptor; use aws_runtime::user_agent::UserAgentInterceptor; diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index b6c47352d9c..5542d05f1a9 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -10,6 +10,7 @@ repository = "https://github.com/awslabs/smithy-rs" [features] event-stream = ["dep:aws-smithy-eventstream", "aws-sigv4/sign-eventstream"] test-util = [] +sigv4a = ["aws-sigv4/sigv4a"] [dependencies] aws-credential-types = { path = "../aws-credential-types" } diff --git a/aws/rust-runtime/aws-runtime/src/auth.rs b/aws/rust-runtime/aws-runtime/src/auth.rs index 149466a58a0..74577888fa8 100644 --- a/aws/rust-runtime/aws-runtime/src/auth.rs +++ b/aws/rust-runtime/aws-runtime/src/auth.rs @@ -3,5 +3,196 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sigv4::http_request::{ + PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableBody, SignatureLocation, + SigningSettings, UriPathNormalizationMode, +}; +use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; +use aws_smithy_runtime_api::client::identity::Identity; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::Document; +use aws_types::region::{Region, SigningRegion, SigningRegionSet}; +use aws_types::SigningName; +use std::error::Error as StdError; +use std::fmt; +use std::time::Duration; + /// Auth implementations for SigV4. pub mod sigv4; + +#[cfg(feature = "sigv4a")] +/// Auth implementations for SigV4a. +pub mod sigv4a; + +/// Type of SigV4 signature. +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +pub enum HttpSignatureType { + /// A signature for a full http request should be computed, with header updates applied to the signing result. + HttpRequestHeaders, + + /// A signature for a full http request should be computed, with query param updates applied to the signing result. + /// + /// This is typically used for presigned URLs. + HttpRequestQueryParams, +} + +/// Signing options for SigV4. +#[derive(Clone, Debug, Eq, PartialEq)] +#[non_exhaustive] +pub struct SigningOptions { + /// Apply URI encoding twice. + pub double_uri_encode: bool, + /// Apply a SHA-256 payload checksum. + pub content_sha256_header: bool, + /// Normalize the URI path before signing. + pub normalize_uri_path: bool, + /// Omit the session token from the signature. + pub omit_session_token: bool, + /// Optional override for the payload to be used in signing. + pub payload_override: Option>, + /// Signature type. + pub signature_type: HttpSignatureType, + /// Whether or not the signature is optional. + pub signing_optional: bool, + /// Optional expiration (for presigning) + pub expires_in: Option, +} + +impl Default for SigningOptions { + fn default() -> Self { + Self { + double_uri_encode: true, + content_sha256_header: false, + normalize_uri_path: true, + omit_session_token: false, + payload_override: None, + signature_type: HttpSignatureType::HttpRequestHeaders, + signing_optional: false, + expires_in: None, + } + } +} + +/// SigV4 signing configuration for an operation +/// +/// Although these fields MAY be customized on a per request basis, they are generally static +/// for a given operation +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct SigV4OperationSigningConfig { + /// AWS region to sign for. + /// + /// For an up-to-date list of AWS regions, see + pub region: Option, + /// AWS region set to sign for. + /// + /// A comma-separated list of AWS regions. Examples include typical AWS regions as well as 'wildcard' regions + pub region_set: Option, + /// AWS service to sign for. + pub name: Option, + /// Signing options. + pub signing_options: SigningOptions, +} + +impl Storable for SigV4OperationSigningConfig { + type Storer = StoreReplace; +} + +fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings { + let mut settings = SigningSettings::default(); + settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode { + PercentEncodingMode::Double + } else { + PercentEncodingMode::Single + }; + settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header { + PayloadChecksumKind::XAmzSha256 + } else { + PayloadChecksumKind::NoHeader + }; + settings.uri_path_normalization_mode = if operation_config.signing_options.normalize_uri_path { + UriPathNormalizationMode::Enabled + } else { + UriPathNormalizationMode::Disabled + }; + settings.session_token_mode = if operation_config.signing_options.omit_session_token { + SessionTokenMode::Exclude + } else { + SessionTokenMode::Include + }; + settings.signature_location = match operation_config.signing_options.signature_type { + HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers, + HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams, + }; + settings.expires_in = operation_config.signing_options.expires_in; + settings +} + +#[derive(Debug)] +enum SigV4SigningError { + MissingOperationSigningConfig, + MissingSigningRegion, + #[cfg(feature = "sigv4a")] + MissingSigningRegionSet, + MissingSigningName, + WrongIdentityType(Identity), + BadTypeInEndpointAuthSchemeConfig(&'static str), +} + +impl fmt::Display for SigV4SigningError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use SigV4SigningError::*; + let mut w = |s| f.write_str(s); + match self { + MissingOperationSigningConfig => w("missing operation signing config"), + MissingSigningRegion => w("missing signing region"), + #[cfg(feature = "sigv4a")] + MissingSigningRegionSet => w("missing signing region set"), + MissingSigningName => w("missing signing name"), + WrongIdentityType(identity) => { + write!(f, "wrong identity type for SigV4/sigV4a. Expected AWS credentials but got `{identity:?}`") + } + BadTypeInEndpointAuthSchemeConfig(field_name) => { + write!( + f, + "unexpected type for `{field_name}` in endpoint auth scheme config", + ) + } + } + } +} + +impl StdError for SigV4SigningError {} + +fn extract_endpoint_auth_scheme_signing_name( + endpoint_config: &AuthSchemeEndpointConfig<'_>, +) -> Result, SigV4SigningError> { + use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; + + match extract_field_from_endpoint_config("signingName", endpoint_config) { + Some(Document::String(s)) => Ok(Some(SigningName::from(s.to_string()))), + None => Ok(None), + _ => Err(UnexpectedType("signingName")), + } +} + +fn extract_endpoint_auth_scheme_signing_region( + endpoint_config: &AuthSchemeEndpointConfig<'_>, +) -> Result, SigV4SigningError> { + use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; + + match extract_field_from_endpoint_config("signingRegion", endpoint_config) { + Some(Document::String(s)) => Ok(Some(SigningRegion::from(Region::new(s.clone())))), + None => Ok(None), + _ => Err(UnexpectedType("signingRegion")), + } +} + +fn extract_field_from_endpoint_config<'a>( + field_name: &'static str, + endpoint_config: &'a AuthSchemeEndpointConfig<'_>, +) -> Option<&'a Document> { + endpoint_config + .as_document() + .and_then(Document::as_object) + .and_then(|config| config.get(field_name)) +} diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index 84c0fdff17a..16abeb95cc7 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -3,11 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::auth::{ + extract_endpoint_auth_scheme_signing_name, extract_endpoint_auth_scheme_signing_region, + SigV4OperationSigningConfig, SigV4SigningError, +}; use aws_credential_types::Credentials; use aws_sigv4::http_request::{ - sign, PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableBody, - SignableRequest, SignatureLocation, SigningParams, SigningSettings, UriPathNormalizationMode, + sign, SignableBody, SignableRequest, SigningParams, SigningSettings, }; +use aws_sigv4::sign::v4; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, @@ -15,14 +19,11 @@ use aws_smithy_runtime_api::client::auth::{ use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::Document; -use aws_types::region::{Region, SigningRegion}; +use aws_smithy_types::config_bag::ConfigBag; +use aws_types::region::SigningRegion; use aws_types::SigningName; use std::borrow::Cow; -use std::error::Error as StdError; -use std::fmt; -use std::time::{Duration, SystemTime}; +use std::time::SystemTime; const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ `expires_in` duration because the credentials used to sign it will expire first."; @@ -30,53 +31,6 @@ const EXPIRATION_WARNING: &str = "Presigned request will expire before the given /// Auth scheme ID for SigV4. pub const SCHEME_ID: AuthSchemeId = AuthSchemeId::new("sigv4"); -struct EndpointAuthSchemeConfig { - signing_region_override: Option, - signing_name_override: Option, -} - -#[derive(Debug)] -enum SigV4SigningError { - MissingOperationSigningConfig, - MissingSigningRegion, - MissingSigningName, - WrongIdentityType(Identity), - BadTypeInEndpointAuthSchemeConfig(&'static str), -} - -impl fmt::Display for SigV4SigningError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use SigV4SigningError::*; - let mut w = |s| f.write_str(s); - match self { - MissingOperationSigningConfig => w("missing operation signing config for SigV4"), - MissingSigningRegion => w("missing signing region for SigV4 signing"), - MissingSigningName => w("missing signing service for SigV4 signing"), - WrongIdentityType(identity) => { - write!(f, "wrong identity type for SigV4: {identity:?}") - } - BadTypeInEndpointAuthSchemeConfig(field_name) => { - write!( - f, - "unexpected type for `{field_name}` in endpoint auth scheme config", - ) - } - } - } -} - -impl StdError for SigV4SigningError { - fn source(&self) -> Option<&(dyn StdError + 'static)> { - match self { - Self::MissingOperationSigningConfig => None, - Self::MissingSigningRegion => None, - Self::MissingSigningName => None, - Self::WrongIdentityType(_) => None, - Self::BadTypeInEndpointAuthSchemeConfig(_) => None, - } - } -} - /// SigV4 auth scheme. #[derive(Debug, Default)] pub struct SigV4AuthScheme { @@ -107,73 +61,6 @@ impl AuthScheme for SigV4AuthScheme { } } -/// Type of SigV4 signature. -#[derive(Debug, Eq, PartialEq, Clone, Copy)] -pub enum HttpSignatureType { - /// A signature for a full http request should be computed, with header updates applied to the signing result. - HttpRequestHeaders, - - /// A signature for a full http request should be computed, with query param updates applied to the signing result. - /// - /// This is typically used for presigned URLs. - HttpRequestQueryParams, -} - -/// Signing options for SigV4. -#[derive(Clone, Debug, Eq, PartialEq)] -#[non_exhaustive] -pub struct SigningOptions { - /// Apply URI encoding twice. - pub double_uri_encode: bool, - /// Apply a SHA-256 payload checksum. - pub content_sha256_header: bool, - /// Normalize the URI path before signing. - pub normalize_uri_path: bool, - /// Omit the session token from the signature. - pub omit_session_token: bool, - /// Optional override for the payload to be used in signing. - pub payload_override: Option>, - /// Signature type. - pub signature_type: HttpSignatureType, - /// Whether or not the signature is optional. - pub signing_optional: bool, - /// Optional expiration (for presigning) - pub expires_in: Option, -} - -impl Default for SigningOptions { - fn default() -> Self { - Self { - double_uri_encode: true, - content_sha256_header: false, - normalize_uri_path: true, - omit_session_token: false, - payload_override: None, - signature_type: HttpSignatureType::HttpRequestHeaders, - signing_optional: false, - expires_in: None, - } - } -} - -/// SigV4 signing configuration for an operation -/// -/// Although these fields MAY be customized on a per request basis, they are generally static -/// for a given operation -#[derive(Clone, Debug, Default, PartialEq, Eq)] -pub struct SigV4OperationSigningConfig { - /// AWS Region to sign for. - pub region: Option, - /// AWS Service to sign for. - pub service: Option, - /// Signing options. - pub signing_options: SigningOptions, -} - -impl Storable for SigV4OperationSigningConfig { - type Storer = StoreReplace; -} - /// SigV4 signer. #[derive(Debug, Default)] pub struct SigV4Signer; @@ -185,34 +72,7 @@ impl SigV4Signer { } fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings { - let mut settings = SigningSettings::default(); - settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode { - PercentEncodingMode::Double - } else { - PercentEncodingMode::Single - }; - settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header { - PayloadChecksumKind::XAmzSha256 - } else { - PayloadChecksumKind::NoHeader - }; - settings.uri_path_normalization_mode = - if operation_config.signing_options.normalize_uri_path { - UriPathNormalizationMode::Enabled - } else { - UriPathNormalizationMode::Disabled - }; - settings.session_token_mode = if operation_config.signing_options.omit_session_token { - SessionTokenMode::Exclude - } else { - SessionTokenMode::Include - }; - settings.signature_location = match operation_config.signing_options.signature_type { - HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers, - HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams, - }; - settings.expires_in = operation_config.signing_options.expires_in; - settings + super::settings(operation_config) } fn signing_params<'a>( @@ -220,7 +80,7 @@ impl SigV4Signer { identity: &'a Identity, operation_config: &'a SigV4OperationSigningConfig, request_timestamp: SystemTime, - ) -> Result, SigV4SigningError> { + ) -> Result, SigV4SigningError> { let creds = identity .data::() .ok_or_else(|| SigV4SigningError::WrongIdentityType(identity.clone()))?; @@ -234,7 +94,7 @@ impl SigV4Signer { } } - let builder = SigningParams::builder() + Ok(v4::SigningParams::builder() .identity(identity) .region( operation_config @@ -245,14 +105,15 @@ impl SigV4Signer { ) .name( operation_config - .service + .name .as_ref() .ok_or(SigV4SigningError::MissingSigningName)? .as_ref(), ) .time(request_timestamp) - .settings(settings); - Ok(builder.build().expect("all required fields set")) + .settings(settings) + .build() + .expect("all required fields set")) } fn extract_operation_config<'a>( @@ -263,54 +124,22 @@ impl SigV4Signer { .load::() .ok_or(SigV4SigningError::MissingOperationSigningConfig)?; - let signing_region = config_bag.load::(); - let signing_name = config_bag.load::(); + let name = extract_endpoint_auth_scheme_signing_name(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); - let EndpointAuthSchemeConfig { - signing_region_override, - signing_name_override, - } = Self::extract_endpoint_auth_scheme_config(auth_scheme_endpoint_config)?; + let region = extract_endpoint_auth_scheme_signing_region(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); - match ( - signing_region_override.or_else(|| signing_region.cloned()), - signing_name_override.or_else(|| signing_name.cloned()), - ) { + match (region, name) { (None, None) => Ok(Cow::Borrowed(operation_config)), - (region, service) => { + (region, name) => { let mut operation_config = operation_config.clone(); - if region.is_some() { - operation_config.region = region; - } - if service.is_some() { - operation_config.service = service; - } + operation_config.region = region.or(operation_config.region); + operation_config.name = name.or(operation_config.name); Ok(Cow::Owned(operation_config)) } } } - - fn extract_endpoint_auth_scheme_config( - endpoint_config: AuthSchemeEndpointConfig<'_>, - ) -> Result { - let (mut signing_region_override, mut signing_name_override) = (None, None); - if let Some(config) = endpoint_config.as_document().and_then(Document::as_object) { - use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; - signing_region_override = match config.get("signingRegion") { - Some(Document::String(s)) => Some(SigningRegion::from(Region::new(s.clone()))), - None => None, - _ => return Err(UnexpectedType("signingRegion")), - }; - signing_name_override = match config.get("signingName") { - Some(Document::String(s)) => Some(SigningName::from(s.to_string())), - None => None, - _ => return Err(UnexpectedType("signingName")), - }; - } - Ok(EndpointAuthSchemeConfig { - signing_region_override, - signing_name_override, - }) - } } impl Signer for SigV4Signer { @@ -327,12 +156,7 @@ impl Signer for SigV4Signer { let request_time = runtime_components.time_source().unwrap_or_default().now(); if identity.data::().is_none() { - if operation_config.signing_options.signing_optional { - tracing::debug!("skipped SigV4 signing since signing is optional for this operation and there are no credentials"); - return Ok(()); - } else { - return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); - } + return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); }; let settings = Self::settings(&operation_config); @@ -369,7 +193,7 @@ impl Signer for SigV4Signer { }), signable_body, )?; - sign(signable_request, &signing_params)? + sign(signable_request, &SigningParams::V4(signing_params))? } .into_parts(); @@ -381,12 +205,14 @@ impl Signer for SigV4Signer { if let Some(signer_sender) = config_bag.load::() { let time_source = runtime_components.time_source().unwrap_or_default(); + let region = operation_config.region.clone().unwrap(); + let name = operation_config.name.clone().unwrap(); signer_sender .send(Box::new(SigV4MessageSigner::new( _signature, identity.clone(), - Region::new(signing_params.region().to_string()).into(), - signing_params.name().to_string().into(), + region, + name, time_source, )) as _) .expect("failed to send deferred signer"); @@ -400,7 +226,7 @@ impl Signer for SigV4Signer { #[cfg(feature = "event-stream")] mod event_stream { use aws_sigv4::event_stream::{sign_empty_message, sign_message}; - use aws_sigv4::SigningParams; + use aws_sigv4::sign::v4; use aws_smithy_async::time::SharedTimeSource; use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; use aws_smithy_runtime_api::client::identity::Identity; @@ -434,8 +260,8 @@ mod event_stream { } } - fn signing_params(&self) -> SigningParams<'_, ()> { - let builder = SigningParams::builder() + fn signing_params(&self) -> v4::SigningParams<'_, ()> { + let builder = v4::SigningParams::builder() .identity(&self.identity) .region(self.signing_region.as_ref()) .name(self.signing_name.as_ref()) @@ -449,7 +275,7 @@ mod event_stream { fn sign(&mut self, message: Message) -> Result { let (signed_message, signature) = { let params = self.signing_params(); - sign_message(&message, &self.last_signature, ¶ms).into_parts() + sign_message(&message, &self.last_signature, ¶ms)?.into_parts() }; self.last_signature = signature; Ok(signed_message) @@ -458,7 +284,9 @@ mod event_stream { fn sign_empty(&mut self) -> Option> { let (signed_message, signature) = { let params = self.signing_params(); - sign_empty_message(&self.last_signature, ¶ms).into_parts() + sign_empty_message(&self.last_signature, ¶ms) + .ok()? + .into_parts() }; self.last_signature = signature; Some(Ok(signed_message)) @@ -518,9 +346,11 @@ mod event_stream { #[cfg(test)] mod tests { use super::*; + use crate::auth::{HttpSignatureType, SigningOptions}; use aws_credential_types::Credentials; use aws_sigv4::http_request::SigningSettings; use aws_smithy_types::config_bag::Layer; + use aws_smithy_types::Document; use aws_types::region::SigningRegion; use aws_types::SigningName; use std::collections::HashMap; @@ -546,7 +376,7 @@ mod tests { .into(); let operation_config = SigV4OperationSigningConfig { region: Some(SigningRegion::from_static("test")), - service: Some(SigningName::from_static("test")), + name: Some(SigningName::from_static("test")), signing_options: SigningOptions { double_uri_encode: true, content_sha256_header: true, @@ -557,6 +387,7 @@ mod tests { expires_in: None, payload_override: None, }, + ..Default::default() }; SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap(); assert!(!logs_contain(EXPIRATION_WARNING)); @@ -572,9 +403,9 @@ mod tests { fn endpoint_config_overrides_region_and_service() { let mut layer = Layer::new("test"); layer.store_put(SigV4OperationSigningConfig { - region: Some(SigningRegion::from(Region::new("override-this-region"))), - service: Some(SigningName::from_static("override-this-service")), - signing_options: Default::default(), + region: Some(SigningRegion::from_static("override-this-region")), + name: Some(SigningName::from_static("override-this-name")), + ..Default::default() }); let config = Document::Object({ let mut out = HashMap::new(); @@ -596,12 +427,9 @@ mod tests { assert_eq!( result.region, - Some(SigningRegion::from(Region::new("us-east-override"))) - ); - assert_eq!( - result.service, - Some(SigningName::from_static("qldb-override")) + Some(SigningRegion::from_static("us-east-override")) ); + assert_eq!(result.name, Some(SigningName::from_static("qldb-override"))); assert!(matches!(result, Cow::Owned(_))); } @@ -609,20 +437,17 @@ mod tests { fn endpoint_config_supports_fallback_when_region_or_service_are_unset() { let mut layer = Layer::new("test"); layer.store_put(SigV4OperationSigningConfig { - region: Some(SigningRegion::from(Region::new("us-east-1"))), - service: Some(SigningName::from_static("qldb")), - signing_options: Default::default(), + region: Some(SigningRegion::from_static("us-east-1")), + name: Some(SigningName::from_static("qldb")), + ..Default::default() }); let cfg = ConfigBag::of_layers(vec![layer]); let config = AuthSchemeEndpointConfig::empty(); let result = SigV4Signer::extract_operation_config(config, &cfg).expect("success"); - assert_eq!( - result.region, - Some(SigningRegion::from(Region::new("us-east-1"))) - ); - assert_eq!(result.service, Some(SigningName::from_static("qldb"))); + assert_eq!(result.region, Some(SigningRegion::from_static("us-east-1"))); + assert_eq!(result.name, Some(SigningName::from_static("qldb"))); assert!(matches!(result, Cow::Borrowed(_))); } } diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs new file mode 100644 index 00000000000..daa6f3d42d7 --- /dev/null +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs @@ -0,0 +1,321 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::auth::{ + extract_endpoint_auth_scheme_signing_name, SigV4OperationSigningConfig, SigV4SigningError, +}; +use aws_credential_types::Credentials; +use aws_sigv4::http_request::{sign, SignableBody, SignableRequest, SigningSettings}; +use aws_sigv4::sign::v4a; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::{ + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, +}; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; +use aws_smithy_types::config_bag::ConfigBag; +use aws_types::region::SigningRegionSet; +use aws_types::SigningName; +use std::borrow::Cow; +use std::time::SystemTime; + +const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ + `expires_in` duration because the credentials used to sign it will expire first."; + +/// Auth scheme ID for SigV4a. +pub const SCHEME_ID: AuthSchemeId = AuthSchemeId::new("sigv4a"); + +/// SigV4a auth scheme. +#[derive(Debug, Default)] +pub struct SigV4aAuthScheme { + signer: SigV4aSigner, +} + +impl SigV4aAuthScheme { + /// Creates a new `SigV4aHttpAuthScheme`. + pub fn new() -> Self { + Default::default() + } +} + +impl AuthScheme for SigV4aAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + SCHEME_ID + } + + fn identity_resolver( + &self, + identity_resolvers: &dyn GetIdentityResolver, + ) -> Option { + identity_resolvers.identity_resolver(self.scheme_id()) + } + + fn signer(&self) -> &dyn Signer { + &self.signer + } +} + +/// SigV4a HTTP request signer. +#[derive(Debug, Default)] +#[non_exhaustive] +pub struct SigV4aSigner; + +impl SigV4aSigner { + /// Creates a new signer instance. + pub fn new() -> Self { + Self + } + + fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings { + super::settings(operation_config) + } + + fn signing_params<'a>( + settings: SigningSettings, + identity: &'a Identity, + operation_config: &'a SigV4OperationSigningConfig, + request_timestamp: SystemTime, + ) -> Result, SigV4SigningError> { + if let Some(expires_in) = settings.expires_in { + if let Some(&identity_expiration) = identity.expiration() { + let presigned_expires_time = request_timestamp + expires_in; + if presigned_expires_time > identity_expiration { + tracing::warn!(EXPIRATION_WARNING); + } + } + } + + Ok(v4a::SigningParams::builder() + .identity(identity) + .region_set( + operation_config + .region_set + .as_ref() + .ok_or(SigV4SigningError::MissingSigningRegionSet)? + .as_ref(), + ) + .name( + operation_config + .name + .as_ref() + .ok_or(SigV4SigningError::MissingSigningName)? + .as_ref(), + ) + .time(request_timestamp) + .settings(settings) + .build() + .expect("all required fields set")) + } + + fn extract_operation_config<'a>( + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'a>, + config_bag: &'a ConfigBag, + ) -> Result, SigV4SigningError> { + let operation_config = config_bag + .load::() + .ok_or(SigV4SigningError::MissingOperationSigningConfig)?; + + let name = extract_endpoint_auth_scheme_signing_name(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); + + let region_set = + extract_endpoint_auth_scheme_signing_region_set(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); + + match (region_set, name) { + (None, None) => Ok(Cow::Borrowed(operation_config)), + (region_set, name) => { + let mut operation_config = operation_config.clone(); + operation_config.region_set = region_set.or(operation_config.region_set); + operation_config.name = name.or(operation_config.name); + Ok(Cow::Owned(operation_config)) + } + } + } +} + +fn extract_endpoint_auth_scheme_signing_region_set( + endpoint_config: &AuthSchemeEndpointConfig<'_>, +) -> Result, SigV4SigningError> { + use aws_smithy_types::Document::Array; + use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; + + match super::extract_field_from_endpoint_config("signingRegionSet", endpoint_config) { + Some(Array(docs)) => { + // The service defines the region set as a string array. Here, we convert it to a comma separated list. + let region_set: SigningRegionSet = + docs.iter().filter_map(|doc| doc.as_string()).collect(); + + Ok(Some(region_set)) + } + None => Ok(None), + _it => Err(UnexpectedType("signingRegionSet")), + } +} + +impl Signer for SigV4aSigner { + fn sign_http_request( + &self, + request: &mut HttpRequest, + identity: &Identity, + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, + config_bag: &ConfigBag, + ) -> Result<(), BoxError> { + let operation_config = + Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?; + let request_time = runtime_components.time_source().unwrap_or_default().now(); + + if identity.data::().is_none() { + return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); + } + + let settings = Self::settings(&operation_config); + let signing_params = + Self::signing_params(settings, identity, &operation_config, request_time)?; + + let (signing_instructions, _signature) = { + // A body that is already in memory can be signed directly. A body that is not in memory + // (any sort of streaming body or presigned request) will be signed via UNSIGNED-PAYLOAD. + let signable_body = operation_config + .signing_options + .payload_override + .as_ref() + // the payload_override is a cheap clone because it contains either a + // reference or a short checksum (we're not cloning the entire body) + .cloned() + .unwrap_or_else(|| { + request + .body() + .bytes() + .map(SignableBody::Bytes) + .unwrap_or(SignableBody::UnsignedPayload) + }); + + let signable_request = SignableRequest::new( + request.method().as_str(), + request.uri().to_string(), + request.headers().iter().map(|(k, v)| { + ( + k.as_str(), + // use from_utf8 instead of to_str because we _do_ allow non-ascii header values + std::str::from_utf8(v.as_bytes()).expect("only utf-8 headers are signable"), + ) + }), + signable_body, + )?; + sign(signable_request, &signing_params.into())? + } + .into_parts(); + + signing_instructions.apply_to_request(request); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::{SigV4OperationSigningConfig, SigV4aSigner, EXPIRATION_WARNING}; + use crate::auth::{HttpSignatureType, SigningOptions}; + use aws_credential_types::Credentials; + use aws_sigv4::http_request::SigningSettings; + use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; + use aws_smithy_types::config_bag::{ConfigBag, Layer}; + use aws_smithy_types::Document; + use aws_types::SigningName; + use std::borrow::Cow; + use std::collections::HashMap; + use std::time::{Duration, SystemTime}; + use tracing_test::traced_test; + + #[test] + #[traced_test] + fn expiration_warning() { + let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1000); + let creds_expire_in = Duration::from_secs(100); + + let mut settings = SigningSettings::default(); + settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); + + let identity = Credentials::new( + "test-access-key", + "test-secret-key", + Some("test-session-token".into()), + Some(now + creds_expire_in), + "test", + ) + .into(); + let operation_config = SigV4OperationSigningConfig { + region_set: Some("test".into()), + name: Some(SigningName::from_static("test")), + signing_options: SigningOptions { + double_uri_encode: true, + content_sha256_header: true, + normalize_uri_path: true, + omit_session_token: true, + signature_type: HttpSignatureType::HttpRequestHeaders, + signing_optional: false, + expires_in: None, + payload_override: None, + }, + ..Default::default() + }; + SigV4aSigner::signing_params(settings, &identity, &operation_config, now).unwrap(); + assert!(!logs_contain(EXPIRATION_WARNING)); + + let mut settings = SigningSettings::default(); + settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); + + SigV4aSigner::signing_params(settings, &identity, &operation_config, now).unwrap(); + assert!(logs_contain(EXPIRATION_WARNING)); + } + + #[test] + fn endpoint_config_overrides_region_and_service() { + let mut layer = Layer::new("test"); + layer.store_put(SigV4OperationSigningConfig { + region_set: Some("test".into()), + name: Some(SigningName::from_static("override-this-service")), + ..Default::default() + }); + let config = Document::Object({ + let mut out = HashMap::new(); + out.insert("name".to_owned(), "sigv4a".to_owned().into()); + out.insert("signingName".to_owned(), "qldb-override".to_owned().into()); + out.insert( + "signingRegionSet".to_string(), + Document::Array(vec!["us-east-override".to_string().into()]), + ); + out + }); + let config = AuthSchemeEndpointConfig::from(Some(&config)); + + let cfg = ConfigBag::of_layers(vec![layer]); + let result = SigV4aSigner::extract_operation_config(config, &cfg).expect("success"); + + assert_eq!(result.region_set, Some("us-east-override".into())); + assert_eq!(result.name, Some(SigningName::from_static("qldb-override"))); + assert!(matches!(result, Cow::Owned(_))); + } + + #[test] + fn endpoint_config_supports_fallback_when_region_or_service_are_unset() { + let mut layer = Layer::new("test"); + layer.store_put(SigV4OperationSigningConfig { + region_set: Some("us-east-1".into()), + name: Some(SigningName::from_static("qldb")), + ..Default::default() + }); + let cfg = ConfigBag::of_layers(vec![layer]); + let config = AuthSchemeEndpointConfig::empty(); + + let result = SigV4aSigner::extract_operation_config(config, &cfg).expect("success"); + + assert_eq!(result.region_set, Some("us-east-1".into())); + assert_eq!(result.name, Some(SigningName::from_static("qldb"))); + assert!(matches!(result, Cow::Borrowed(_))); + } +} diff --git a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs index 3c3d5ed2dcf..565377f9f42 100644 --- a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs +++ b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs @@ -9,7 +9,7 @@ use crate::middleware::Signature; use aws_sigv4::event_stream::{sign_empty_message, sign_message}; -use aws_sigv4::SigningParams; +use aws_sigv4::sign::v4; use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; use aws_smithy_http::property_bag::{PropertyBag, SharedPropertyBag}; use aws_smithy_runtime_api::client::identity::Identity; @@ -44,8 +44,8 @@ impl SigV4MessageSigner { } } - fn signing_params(&self) -> SigningParams<()> { - let builder = SigningParams::builder() + fn signing_params(&self) -> v4::SigningParams<()> { + let builder = v4::SigningParams::builder() .identity(&self.identity) .region(self.signing_region.as_ref()) .name(self.signing_name.as_ref()) @@ -59,7 +59,7 @@ impl SignMessage for SigV4MessageSigner { fn sign(&mut self, message: Message) -> Result { let (signed_message, signature) = { let params = self.signing_params(); - sign_message(&message, &self.last_signature, ¶ms).into_parts() + sign_message(&message, &self.last_signature, ¶ms)?.into_parts() }; self.last_signature = signature; Ok(signed_message) @@ -68,7 +68,9 @@ impl SignMessage for SigV4MessageSigner { fn sign_empty(&mut self) -> Option> { let (signed_message, signature) = { let params = self.signing_params(); - sign_empty_message(&self.last_signature, ¶ms).into_parts() + sign_empty_message(&self.last_signature, ¶ms) + .expect("signing an empty message will always succeed.") + .into_parts() }; self.last_signature = signature; Some(Ok(signed_message)) @@ -140,7 +142,7 @@ impl SigV4Signer { } } - fn signing_params(properties: &PropertyBag) -> SigningParams<()> { + fn signing_params(properties: &PropertyBag) -> v4::SigningParams<()> { // Every single one of these values would have been retrieved during the initial request, // so we can safely assume they all exist in the property bag at this point. let identity = properties.get::().unwrap(); @@ -150,7 +152,7 @@ impl SigV4Signer { .get::() .copied() .unwrap_or_else(SystemTime::now); - let builder = SigningParams::builder() + let builder = v4::SigningParams::builder() .identity(identity) .region(region.as_ref()) .name(name.as_ref()) @@ -176,7 +178,7 @@ impl SignMessage for SigV4Signer { let (signed_message, signature) = { let params = Self::signing_params(&properties); - sign_message(&message, self.last_signature.as_ref().unwrap(), ¶ms).into_parts() + sign_message(&message, self.last_signature.as_ref().unwrap(), ¶ms)?.into_parts() }; self.last_signature = Some(signature); Ok(signed_message) @@ -190,7 +192,9 @@ impl SignMessage for SigV4Signer { } let (signed_message, signature) = { let params = Self::signing_params(&properties); - sign_empty_message(self.last_signature.as_ref().unwrap(), ¶ms).into_parts() + sign_empty_message(self.last_signature.as_ref().unwrap(), ¶ms) + .ok()? + .into_parts() }; self.last_signature = Some(signature); Some(Ok(signed_message)) diff --git a/aws/rust-runtime/aws-sig-auth/src/signer.rs b/aws/rust-runtime/aws-sig-auth/src/signer.rs index 7a1561b046d..feda470087f 100644 --- a/aws/rust-runtime/aws-sig-auth/src/signer.rs +++ b/aws/rust-runtime/aws-sig-auth/src/signer.rs @@ -4,10 +4,12 @@ */ use crate::middleware::Signature; +pub use aws_sigv4::http_request::SignableBody; use aws_sigv4::http_request::{ sign, PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableRequest, SignatureLocation, SigningParams, SigningSettings, UriPathNormalizationMode, }; +use aws_sigv4::sign::v4; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::identity::Identity; use aws_types::region::SigningRegion; @@ -15,7 +17,6 @@ use aws_types::SigningName; use std::fmt; use std::time::{Duration, SystemTime}; -pub use aws_sigv4::http_request::SignableBody; pub type SigningError = aws_sigv4::http_request::SigningError; const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ @@ -170,13 +171,13 @@ impl SigV4Signer { } } - let builder = SigningParams::builder() + let builder = v4::SigningParams::builder() .identity(identity) .region(request_config.region.as_ref()) .name(request_config.name.as_ref()) .time(request_config.request_ts) .settings(settings); - builder.build().expect("all required fields set") + builder.build().expect("all required fields set").into() } /// Sign a request using the SigV4 Protocol diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index 005c93a8958..3ceb13b2fd1 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -9,37 +9,47 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [features] -sign-http = ["http", "percent-encoding", "form_urlencoded"] -sign-eventstream = ["aws-smithy-eventstream", "bytes"] -http0-compat = ["http"] default = ["sign-http"] +http0-compat = ["dep:http"] +sign-http = ["dep:http", "dep:percent-encoding", "dep:form_urlencoded"] +sign-eventstream = ["dep:aws-smithy-eventstream"] +sigv4a = ["dep:p256", "dep:num-bigint", "dep:zeroize", "dep:ring"] [dependencies] +aws-credential-types = { path = "../aws-credential-types" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } -aws-credential-types = { path = "../aws-credential-types" } -bytes = { version = "1", optional = true } +bytes = "1" form_urlencoded = { version = "1.0", optional = true } hex = "0.4" +hmac = "0.12" http = { version = "0.2", optional = true } +num-bigint = { version = "0.4", optional = true } once_cell = "1.8" +p256 = { version = "0.11", features = ["ecdsa"], optional = true } percent-encoding = { version = "2.1", optional = true } regex = "1.5" +ring = { version = "0.16", optional = true } +sha2 = "0.10" time = "0.3.5" tracing = "0.1" -hmac = "0.12" -sha2 = "0.10" +zeroize = { version = "^1", optional = true } [dev-dependencies] +aws-credential-types = { path = "../aws-credential-types", features = ["test-util", "hardcoded-credentials"] } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client", "test-util"] } -aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } -criterion = "0.4" bytes = "1" -httparse = "1.5" +criterion = "0.4" +hex-literal = "0.4.1" +httparse = "1.8" +libfuzzer-sys = "0.4.6" pretty_assertions = "1.3" proptest = "1.2" -time = { version = "0.3.4", features = ["parsing"] } +serde = "1.0.180" +serde_derive = "1.0.180" +serde_json = "1.0.104" +time = { version = "0.3.5", features = ["parsing"] } [target.'cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))'.dev-dependencies] ring = "0.16" @@ -48,6 +58,11 @@ ring = "0.16" name = "hmac" harness = false +[[bench]] +name = "sigv4a" +harness = false +required-features = [ "sigv4a" ] + [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq index ae5db8a63aa..313af7b57d2 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq @@ -5,4 +5,4 @@ host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com x-amz-date:20210511T154045Z host;x-amz-date -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ No newline at end of file diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE new file mode 100755 index 00000000000..d6456956733 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE new file mode 100755 index 00000000000..d85f69ecbf7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE @@ -0,0 +1,2 @@ +AWS Signature Version 4a Test Suite +Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md new file mode 100644 index 00000000000..c7166222d58 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md @@ -0,0 +1,24 @@ +Where did the files in this directory come from? +================================================ + +These test files were taken from the [aws-c-auth](https://github.com/awslabs/aws-c-auth/tree/main/tests/aws-signing-test-suite/v4a) project. + +Signature Version 4A Test Suite +------------------------------ + +To assist you in the development of an AWS client that supports Signature Version 4A, you can use the +files in the test suite to ensure your code is performing each step of the signing process correctly. + +Each test group contains several files that you can use to validate most of the tasks described in +Signature Version 4A Signing Process. The following list describes the contents of each file. + +- context.json - Credentials and signer options to use when signing test requests +- request.txt - The web request to be signed. +- header-canonical-request.txt - The resulting canonical request in header-signature mode. +- header-string-to-sign.txt - The resulting string to sign in header-signature mode. +- query-canonical-request.txt - The resulting canonical request in query-signature mode. +- query-string-to-sign.txt - The resulting string to sign in header-query mode. + +Sigv4A signature generation isn't deterministic, so generated signatures can't be tested against known good ones. +Instead, tests generate a signature, derive a verification key from the signing key, and verify the signature and +the string to sign. This mirrors what AWS services do when verifying Sigv4A-signed requests. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt new file mode 100644 index 00000000000..ccb5f437485 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt @@ -0,0 +1,10 @@ +GET +/ + +host:example.amazonaws.com +my-header1:value2,value2,value1 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt new file mode 100644 index 00000000000..8783461a4d4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +30f1f7b639b7fd5982a0f700e6d23bf7bb24f2f1d9e1314005bf22130da61cdf diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt new file mode 100644 index 00000000000..9561297c7a2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt @@ -0,0 +1,8 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:value2,value2,value1 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt new file mode 100644 index 00000000000..3140f6f64d2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +a6e21a0099c98cbb4ec73928a08e8b116dfd634c471a8c03c4007b5258b664ea diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt new file mode 100644 index 00000000000..40455cec6f3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt @@ -0,0 +1,5 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:value2 +My-Header1:value2 +My-Header1:value1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt new file mode 100644 index 00000000000..93751930e42 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt @@ -0,0 +1,10 @@ +GET +/ + +host:example.amazonaws.com +my-header1:value4,value1,value3,value2 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt new file mode 100644 index 00000000000..6400baf52b8 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +e1c3b5d34632ffff080330b3bc31906c8988bf1683f4af689ef3f1811952df36 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt new file mode 100644 index 00000000000..ecf494a365f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt @@ -0,0 +1,8 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:value4,value1,value3,value2 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt new file mode 100644 index 00000000000..b58417973ad --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +e2bf35ea25a1943bf52cfc8348c787db8fd8ca642dc9f2b9443939c2fb0d3c54 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt new file mode 100644 index 00000000000..2c6f49d369b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt @@ -0,0 +1,6 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:value4 +My-Header1:value1 +My-Header1:value3 +My-Header1:value2 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt new file mode 100644 index 00000000000..e91e9524195 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt @@ -0,0 +1,11 @@ +GET +/ + +host:example.amazonaws.com +my-header1:value1 +my-header2:"a b c" +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;my-header2;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt new file mode 100644 index 00000000000..0e407d8557c --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +18b43001be9b531ebdd8202144dbd7630ea8a35bc328a7d0e561dda03a876095 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt new file mode 100644 index 00000000000..8a3b042ca92 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1%3Bmy-header2 +host:example.amazonaws.com +my-header1:value1 +my-header2:"a b c" + +host;my-header1;my-header2 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt new file mode 100644 index 00000000000..5eead2534dc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +4f92ebcf5f0844588e443a2243fafdb64319c6d1ad913c07686129b9991326a3 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt new file mode 100644 index 00000000000..ad1ea986773 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt @@ -0,0 +1,4 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com +My-Header1: value1 +My-Header2: "a b c" diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt new file mode 100644 index 00000000000..6aa9f995bdc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt @@ -0,0 +1,2 @@ +GET /example/.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt new file mode 100644 index 00000000000..a856c107390 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt @@ -0,0 +1,2 @@ +GET /example1/example2/../.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..5e1d1cfcaaa --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example1/example2/../.. + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..1cca6cfb389 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +7bad1fab948577ec4e860ff2bb06ce9b69f0dd60eb8a9ad7c016b584254f9b5b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..95dc10402d7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example1/example2/../.. +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..50edce6de3b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +504892d7f7262dd98d79ab7f3bb6f918cd59d491aacb2d76450f6e065479b31a diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt new file mode 100644 index 00000000000..a856c107390 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /example1/example2/../.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..d6a0abe36fe --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example/.. + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..4a34e937171 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +c859b5032f2ebd5df0285ff633b495b0e6e962e5adb94731c95e8e993a9a8213 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..b1d123ed951 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example/.. +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..a17f5abdbb4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +bbbb3668f996906ebb2c96ebdc2418af99656315adaf647989ab336c88fb516e diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt new file mode 100644 index 00000000000..6aa9f995bdc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /example/.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt new file mode 100644 index 00000000000..2c5ff3851e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt @@ -0,0 +1,2 @@ +GET /./ HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..d05303d006e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/./ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..e1bfb399afb --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +a14dce0217a32357c623c3db790988b6b5aa1494a527158b06d3ca4444561a4b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..f048d0fe58e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/./ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..bfcf245534b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +0d146fed00cdf50d7a87864583b7a33ca75322aab46b0a2d204f5d0c13440917 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt new file mode 100644 index 00000000000..2c5ff3851e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /./ HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt new file mode 100644 index 00000000000..25bc21e36f2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt @@ -0,0 +1,2 @@ +GET // HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..2e36c2065a7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..cd30e8b5c0b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +823cb165e35e124f862c99c89a46414c24e3800f149377591e35a4848317e825 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..77cf28df87d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..49d9b24a725 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +0cc67a8acfed5946b645794c649dd98d3485728119cdf17d38985ba0ff55abca diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt new file mode 100644 index 00000000000..5d919c9ba63 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt @@ -0,0 +1,2 @@ +GET /./example HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..44448421e10 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/./example + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..cc63510cad2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +407314cdff397462b2458ba1860907adefcbb73fd630ddbd3de7300d2f773804 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..ed2cb2d8b1b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/./example +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..c9f3b6ddac5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +efbe4f47c2acbb53fbfd0be6846cfa35a48c21f3f800e741278dae7b721302b4 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt new file mode 100644 index 00000000000..5d919c9ba63 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /./example HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..8a4d33b0ba3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +// + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..874c01c1eea --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +fc8f42c7ce50ba8830a34b16d9fb478170176d78c81339e8d7e31d4baa9ec9f4 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..81d7b0b1570 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +// +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..17e5279ee70 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +633e0570a745c18cc22e43af8be65cfed3e7173061ec403353734bdfae90e0b6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt new file mode 100644 index 00000000000..25bc21e36f2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET // HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..fdf9c48f5a9 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..8f9c95e66f4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +ea6c9c4bc1e85b94f2579cebbc85a84c3f8eaa055c006697555f074dd68509a6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..1046735a533 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..b293cc2be40 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +ab3f7b8af0ce16e0faf508160fb13d890874992d74f36214ae9eec7437361f2b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt new file mode 100644 index 00000000000..12e0931969c --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt @@ -0,0 +1,2 @@ +GET //example// HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..a9c55f62153 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +//example// + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..5c4c2cd4a4f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +bf8c459a6a7f3879f55bff41e4dca65f69df4628456904e47f83013c0deb7276 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..c878ab4f56e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +//example// +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..5f596452cb5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +660b4a6f0bd53b287cefb21cdf69c1574303de44d2e9f7759b5379b428b70157 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt new file mode 100644 index 00000000000..12e0931969c --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET //example// HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt new file mode 100644 index 00000000000..b0db64880ad --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt new file mode 100644 index 00000000000..20c7cd66a45 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b48c0f7d7cdaa2cd05e4b789c913063becd96ccace5296a334c950040e58bcac diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt new file mode 100644 index 00000000000..f9fb7264769 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt new file mode 100644 index 00000000000..ef06e89988b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +a967a5035e5dc574f94fb9f0de0faf9d56e889c26d9a65d7d0a15d89690280d1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt new file mode 100644 index 00000000000..a149694b9cc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt @@ -0,0 +1,2 @@ +GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt new file mode 100644 index 00000000000..bb9d4bfa6af --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +Param1=value1 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt new file mode 100644 index 00000000000..a176f1dfc76 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +894f4237e92aae973c992da1d1f39d7a5913a23e9f7cbcf085e9550685eb498a diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt new file mode 100644 index 00000000000..344384bdb78 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt new file mode 100644 index 00000000000..b6250526be2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +07551f1d699afeb50d6811a527ab7b0270b60448ea27d8cbccb9750d68287b3f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt new file mode 100644 index 00000000000..f4a03bb0ade --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt @@ -0,0 +1,2 @@ +GET /?Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt new file mode 100644 index 00000000000..74f625a1451 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +Param1=value1&Param2=value2 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt new file mode 100644 index 00000000000..44873b70da6 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cc07b29e0d0f0b2d6aa296621a5608fd9c2271159b9b2f737f682704ebb96482 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt new file mode 100644 index 00000000000..6d30727353d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +Param1=value1&Param2=value2&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt new file mode 100644 index 00000000000..99d05105696 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +c688584c3dbae2868c4911c825239f2c9375e66b9962f21db60b9b2fcd75bf45 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt new file mode 100644 index 00000000000..1158ac4ebd9 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt @@ -0,0 +1,2 @@ +GET /?Param2=value2&Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt new file mode 100644 index 00000000000..816c8623016 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt new file mode 100644 index 00000000000..6129fc52fe9 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +377b8a3e195894659b84cd1c475dc8a3663a663360a349430c0c3b82bd82b77b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt new file mode 100644 index 00000000000..b77ee9ffee4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt new file mode 100644 index 00000000000..1cfed7a3cce --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +5d8923c620c699f856a35a6eb8dd786fd4c8c6ab0a35c552caeb5b648989433f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt new file mode 100644 index 00000000000..36b2fe3ea4e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt @@ -0,0 +1,2 @@ +GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt new file mode 100644 index 00000000000..e659c3be2c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt @@ -0,0 +1,2 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json new file mode 100644 index 00000000000..a457c8a6627 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json @@ -0,0 +1,13 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "token": "6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt new file mode 100644 index 00000000000..f14defd8930 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt @@ -0,0 +1,10 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 +x-amz-security-token:6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267 + +host;x-amz-date;x-amz-region-set;x-amz-security-token +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt new file mode 100644 index 00000000000..4edece5422a --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +79893373104239a0547df489af395ec3c1b8873a8601f07f11ffd3f1ac557e7d diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt new file mode 100644 index 00000000000..7c042af70c7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Security-Token=6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt new file mode 100644 index 00000000000..0fd066ab751 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +496062b4c2ed2175fe08ad084158783fa8d013c694542af721d49b25d1ebd390 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt new file mode 100644 index 00000000000..e659c3be2c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt @@ -0,0 +1,2 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt new file mode 100644 index 00000000000..e659c3be2c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt @@ -0,0 +1,2 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt new file mode 100644 index 00000000000..a6942c11715 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt new file mode 100644 index 00000000000..d5650cb8798 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt new file mode 100644 index 00000000000..e48ce070ae3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt new file mode 100644 index 00000000000..34e3382b43d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt new file mode 100644 index 00000000000..a8e1727ba4f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt @@ -0,0 +1,10 @@ +POST +/ + +host:example.amazonaws.com +my-header1:value1 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt new file mode 100644 index 00000000000..f6e3e9b1587 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b92b1e85236a12f9d118f85fb6686c83b0e83fb3428f8d4da3cc9acb2851fcfa diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt new file mode 100644 index 00000000000..0ae73e130b8 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt @@ -0,0 +1,8 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:value1 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt new file mode 100644 index 00000000000..8cb96bfd5a7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +336638ab840d4785edc7db35ab9c036bc15ffb2dc1a4e05b04f3a7cd7407593f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt new file mode 100644 index 00000000000..917720efcb3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt @@ -0,0 +1,3 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:value1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt new file mode 100644 index 00000000000..1dc3ef8e8c1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt @@ -0,0 +1,10 @@ +POST +/ + +host:example.amazonaws.com +my-header1:VALUE1 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt new file mode 100644 index 00000000000..59c7e45e2a5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +7de5a74bc45fb5c8a90faada2ab9538e69e4a5eb7f330f62387715669cecd492 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt new file mode 100644 index 00000000000..377e6f3b6c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt @@ -0,0 +1,8 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:VALUE1 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt new file mode 100644 index 00000000000..84a7afd6dc8 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +949fb555e05d3289760ff0f0566ad73a69ed865000d9843b93a15b916dbc8b6f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt new file mode 100644 index 00000000000..5f14c91595f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt @@ -0,0 +1,3 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:VALUE1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json new file mode 100644 index 00000000000..8f1d5ced769 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json @@ -0,0 +1,14 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "token": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z", + "omit_session_token": true +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt new file mode 100644 index 00000000000..a6942c11715 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt new file mode 100644 index 00000000000..d5650cb8798 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt new file mode 100644 index 00000000000..e48ce070ae3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt new file mode 100644 index 00000000000..34e3382b43d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json new file mode 100644 index 00000000000..5187392c0a6 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json @@ -0,0 +1,14 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "token": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z", + "omit_session_token": false +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt new file mode 100644 index 00000000000..dd408c84e09 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt @@ -0,0 +1,10 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 +x-amz-security-token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== + +host;x-amz-date;x-amz-region-set;x-amz-security-token +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt new file mode 100644 index 00000000000..f352b5416cc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +964c15d46a67b327b877c02d680c81cb75df04e85144142e190da565ff0d029f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt new file mode 100644 index 00000000000..832cdc05040 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt new file mode 100644 index 00000000000..d7f36687c42 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +c3a8ba26c461df46b5010b756fb8644fd922a2aea95d77b56295e5e4d3bb155f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt new file mode 100644 index 00000000000..02af60fb2e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +Param1=value1 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt new file mode 100644 index 00000000000..4256b4ff1b5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +502dea2656f02eea10bd05eeec315ea1a6686ed2861176e1670b2d67e17b2f36 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt new file mode 100644 index 00000000000..fa84bbdc3d4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt new file mode 100644 index 00000000000..de270efe06e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b9ec8df7b378fbee58903f5c54bd50e80a4d2d5aa9532583910ce771e42574fe diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt new file mode 100644 index 00000000000..c9d6e5dfb09 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt @@ -0,0 +1,2 @@ +POST /?Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt new file mode 100644 index 00000000000..02af60fb2e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +Param1=value1 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt new file mode 100644 index 00000000000..4256b4ff1b5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +502dea2656f02eea10bd05eeec315ea1a6686ed2861176e1670b2d67e17b2f36 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt new file mode 100644 index 00000000000..fa84bbdc3d4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt new file mode 100644 index 00000000000..de270efe06e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b9ec8df7b378fbee58903f5c54bd50e80a4d2d5aa9532583910ce771e42574fe diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt new file mode 100644 index 00000000000..c9d6e5dfb09 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt @@ -0,0 +1,2 @@ +POST /?Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt new file mode 100644 index 00000000000..a6942c11715 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt new file mode 100644 index 00000000000..d5650cb8798 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt new file mode 100644 index 00000000000..e48ce070ae3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt new file mode 100644 index 00000000000..34e3382b43d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json new file mode 100644 index 00000000000..fc4bce6dc67 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": true, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt new file mode 100644 index 00000000000..05ab787e7e5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt @@ -0,0 +1,12 @@ +POST +/ + +content-length:13 +content-type:application/x-www-form-urlencoded; charset=utf-8 +host:example.amazonaws.com +x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt new file mode 100644 index 00000000000..b6fdecfa4a2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +03c5c4387e7c1bd3a606d1b19301d277e51d7621ced07c8c9ff2aeb151c0f4c6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt new file mode 100644 index 00000000000..fcc454f230e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost +content-length:13 +content-type:application/x-www-form-urlencoded; charset=utf-8 +host:example.amazonaws.com + +content-length;content-type;host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt new file mode 100644 index 00000000000..a300bea048e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +ab426c74406d082ad98929df8969624e6ed5cb7f4e8501fbbe7d8c20e9c3b417 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt new file mode 100644 index 00000000000..b711c250549 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt @@ -0,0 +1,6 @@ +POST / HTTP/1.1 +Content-Type:application/x-www-form-urlencoded; charset=utf-8 +Host:example.amazonaws.com +Content-Length:13 + +Param1=value1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json new file mode 100644 index 00000000000..fc4bce6dc67 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": true, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt new file mode 100644 index 00000000000..69009dc7613 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt @@ -0,0 +1,12 @@ +POST +/ + +content-length:13 +content-type:application/x-www-form-urlencoded +host:example.amazonaws.com +x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt new file mode 100644 index 00000000000..b6fdecfa4a2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +03c5c4387e7c1bd3a606d1b19301d277e51d7621ced07c8c9ff2aeb151c0f4c6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt new file mode 100644 index 00000000000..9ed065b9e4a --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost +content-length:13 +content-type:application/x-www-form-urlencoded +host:example.amazonaws.com + +content-length;content-type;host +9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt new file mode 100644 index 00000000000..bef3143615b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +4e4122984d30d13170a298ece62cc30f8da12578fb3b482616b1f11036b13934 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt new file mode 100644 index 00000000000..00911020c0e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt @@ -0,0 +1,6 @@ +POST / HTTP/1.1 +Content-Type:application/x-www-form-urlencoded +Host:example.amazonaws.com +Content-Length:13 + +Param1=value1 diff --git a/aws/rust-runtime/aws-sigv4/benches/sigv4a.rs b/aws/rust-runtime/aws-sigv4/benches/sigv4a.rs new file mode 100644 index 00000000000..3d207390e25 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/benches/sigv4a.rs @@ -0,0 +1,29 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sigv4::sign::v4a; +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; + +pub fn generate_signing_key(c: &mut Criterion) { + c.bench_function("generate_signing_key", |b| { + b.iter(|| { + let _ = v4a::generate_signing_key( + black_box("AKIAIOSFODNN7EXAMPLE"), + black_box("wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"), + ); + }) + }); +} + +criterion_group! { + name = benches; + + config = Criterion::default(); + + targets = generate_signing_key +} + +criterion_main!(benches); diff --git a/aws/rust-runtime/aws-sigv4/src/event_stream.rs b/aws/rust-runtime/aws-sigv4/src/event_stream.rs index 4932df47b57..03cdc61303d 100644 --- a/aws/rust-runtime/aws-sigv4/src/event_stream.rs +++ b/aws/rust-runtime/aws-sigv4/src/event_stream.rs @@ -8,11 +8,12 @@ //! # Example: Signing an event stream message //! //! ```rust -//! use aws_sigv4::event_stream::{sign_message, SigningParams}; +//! use aws_sigv4::event_stream::sign_message; //! use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; //! use std::time::SystemTime; //! use aws_credential_types::Credentials; //! use aws_smithy_runtime_api::client::identity::Identity; +//! use aws_sigv4::sign::v4; //! //! // The `last_signature` argument is the previous message's signature, or //! // the signature of the initial HTTP request if a message hasn't been signed yet. @@ -30,7 +31,7 @@ //! None, //! "hardcoded-credentials" //! ).into(); -//! let params = SigningParams::builder() +//! let params = v4::SigningParams::builder() //! .identity(&identity) //! .region("us-east-1") //! .name("exampleservice") @@ -40,20 +41,23 @@ //! .unwrap(); //! //! // Use the returned `signature` to sign the next message. -//! let (signed, signature) = -//! sign_message(&message_to_sign, &last_signature, ¶ms).into_parts(); +//! let (signed, signature) = sign_message(&message_to_sign, &last_signature, ¶ms) +//! .expect("signing should succeed") +//! .into_parts(); //! ``` use crate::date_time::{format_date, format_date_time, truncate_subsecs}; -use crate::sign::{calculate_signature, generate_signing_key, sha256_hex_string}; +use crate::http_request::SigningError; +use crate::sign::v4::{calculate_signature, generate_signing_key, sha256_hex_string}; use crate::SigningOutput; +use aws_credential_types::Credentials; use aws_smithy_eventstream::frame::{write_headers_to, Header, HeaderValue, Message}; use bytes::Bytes; use std::io::Write; use std::time::SystemTime; /// Event stream signing parameters -pub type SigningParams<'a> = super::SigningParams<'a, ()>; +pub type SigningParams<'a> = crate::sign::v4::SigningParams<'a, ()>; /// Creates a string to sign for an Event Stream message. fn calculate_string_to_sign( @@ -95,7 +99,7 @@ pub fn sign_message<'a>( message: &'a Message, last_signature: &'a str, params: &'a SigningParams<'a>, -) -> SigningOutput { +) -> Result, SigningError> { let message_payload = { let mut payload = Vec::new(); message.write_to(&mut payload).unwrap(); @@ -112,7 +116,7 @@ pub fn sign_message<'a>( pub fn sign_empty_message<'a>( last_signature: &'a str, params: &'a SigningParams<'a>, -) -> SigningOutput { +) -> Result, SigningError> { sign_payload(None, last_signature, params) } @@ -120,11 +124,14 @@ fn sign_payload<'a>( message_payload: Option>, last_signature: &'a str, params: &'a SigningParams<'a>, -) -> SigningOutput { - let creds = params.credentials().expect("AWS credentials are required"); +) -> Result, SigningError> { // Truncate the sub-seconds up front since the timestamp written to the signed message header // needs to exactly match the string formatted timestamp, which doesn't include sub-seconds. let time = truncate_subsecs(params.time); + let creds = params + .identity + .data::() + .ok_or_else(SigningError::unsupported_identity_type)?; let signing_key = generate_signing_key(creds.secret_access_key(), time, params.region, params.name); @@ -138,7 +145,7 @@ fn sign_payload<'a>( tracing::trace!(canonical_request = ?message_payload, string_to_sign = ?string_to_sign, "calculated signing parameters"); // Generate the signed wrapper event frame - SigningOutput::new( + Ok(SigningOutput::new( Message::new(message_payload.map(Bytes::from).unwrap_or_else(Bytes::new)) .add_header(Header::new( ":chunk-signature", @@ -146,14 +153,13 @@ fn sign_payload<'a>( )) .add_header(Header::new(":date", HeaderValue::Timestamp(time.into()))), signature, - ) + )) } #[cfg(test)] mod tests { - use crate::event_stream::{calculate_string_to_sign, sign_message}; - use crate::sign::sha256_hex_string; - use crate::SigningParams; + use crate::event_stream::{calculate_string_to_sign, sign_message, SigningParams}; + use crate::sign::v4::sha256_hex_string; use aws_credential_types::Credentials; use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; use std::time::{Duration, UNIX_EPOCH}; @@ -212,8 +218,9 @@ mod tests { }; let last_signature = sha256_hex_string(b"last message sts"); - let (signed, signature) = - sign_message(&message_to_sign, &last_signature, ¶ms).into_parts(); + let (signed, signature) = sign_message(&message_to_sign, &last_signature, ¶ms) + .unwrap() + .into_parts(); assert_eq!(":chunk-signature", signed.headers()[0].name().as_str()); if let HeaderValue::ByteArray(bytes) = signed.headers()[0].value() { assert_eq!(signature, hex::encode(bytes)); diff --git a/aws/rust-runtime/aws-sigv4/src/http_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request.rs index c5df37e5e0a..5616509eaf2 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request.rs @@ -16,6 +16,7 @@ //! #[cfg(feature = "http0-compat")] //! fn test() -> Result<(), aws_sigv4::http_request::SigningError> { //! use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest}; +//! use aws_sigv4::sign::v4; //! use http; //! use std::time::SystemTime; //! @@ -28,14 +29,15 @@ //! "hardcoded-credentials" //! ).into(); //! let signing_settings = SigningSettings::default(); -//! let signing_params = SigningParams::builder() +//! let signing_params = v4::SigningParams::builder() //! .identity(&identity) //! .region("us-east-1") //! .name("exampleservice") //! .time(SystemTime::now()) //! .settings(signing_settings) //! .build() -//! .unwrap(); +//! .unwrap() +//! .into(); //! // Convert the HTTP request into a signable request //! let signable_request = SignableRequest::new( //! "GET", @@ -51,7 +53,6 @@ //! # Ok(()) //! # } //! ``` -//! mod canonical_request; mod error; @@ -63,9 +64,143 @@ mod url_escape; #[cfg(test)] pub(crate) mod test; +use crate::sign::v4; +#[cfg(feature = "sigv4a")] +use crate::sign::v4a; +use crate::SignatureVersion; +use aws_credential_types::Credentials; pub use error::SigningError; pub use settings::{ - PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignatureLocation, SigningParams, - SigningSettings, UriPathNormalizationMode, + PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignatureLocation, SigningSettings, + UriPathNormalizationMode, }; pub use sign::{sign, SignableBody, SignableRequest, SigningInstructions}; +use std::time::SystemTime; + +// Individual Debug impls are responsible for redacting sensitive fields. +#[derive(Debug)] +#[non_exhaustive] +/// Parameters for signing an HTTP request. +pub enum SigningParams<'a> { + /// Sign with the SigV4 algorithm + V4(v4::SigningParams<'a, SigningSettings>), + #[cfg(feature = "sigv4a")] + /// Sign with the SigV4a algorithm + V4a(v4a::SigningParams<'a, SigningSettings>), +} + +impl<'a> From> for SigningParams<'a> { + fn from(value: v4::SigningParams<'a, SigningSettings>) -> Self { + Self::V4(value) + } +} + +#[cfg(feature = "sigv4a")] +impl<'a> From> for SigningParams<'a> { + fn from(value: v4a::SigningParams<'a, SigningSettings>) -> Self { + Self::V4a(value) + } +} + +impl<'a> SigningParams<'a> { + /// Return the credentials within the signing params. + pub(crate) fn credentials(&self) -> Result<&Credentials, SigningError> { + let identity = match self { + Self::V4(v4::SigningParams { identity, .. }) => identity, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { identity, .. }) => identity, + }; + + identity + .data::() + .ok_or_else(SigningError::unsupported_identity_type) + } + + /// If the signing params are for SigV4, return the region. Otherwise, return `None`. + pub fn region(&self) -> Option<&str> { + match self { + SigningParams::V4(v4::SigningParams { region, .. }) => Some(region), + #[allow(unreachable_patterns)] + _ => None, + } + } + + #[cfg(feature = "sigv4a")] + /// If the signing params are for SigV4a, return the region set. Otherwise, return `None`. + pub fn region_set(&self) -> Option<&str> { + match self { + SigningParams::V4a(v4a::SigningParams { region_set, .. }) => Some(region_set), + _ => None, + } + } + + /// Return a reference to the settings held by the signing params. + pub fn settings(&self) -> &SigningSettings { + match self { + Self::V4(v4::SigningParams { settings, .. }) => settings, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { settings, .. }) => settings, + } + } + + /// Return a mutable reference to the settings held by the signing params. + pub fn settings_mut(&mut self) -> &mut SigningSettings { + match self { + Self::V4(v4::SigningParams { settings, .. }) => settings, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { settings, .. }) => settings, + } + } + + #[cfg(test)] + /// Set the [`PayloadChecksumKind`] for the signing params. + pub fn set_payload_checksum_kind(&mut self, kind: PayloadChecksumKind) { + let settings = self.settings_mut(); + + settings.payload_checksum_kind = kind; + } + + #[cfg(test)] + /// Set the [`SessionTokenMode`] for the signing params. + pub fn set_session_token_mode(&mut self, mode: SessionTokenMode) { + let settings = self.settings_mut(); + + settings.session_token_mode = mode; + } + + /// Return a reference to the time in the signing params. + pub fn time(&self) -> &SystemTime { + match self { + Self::V4(v4::SigningParams { time, .. }) => time, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { time, .. }) => time, + } + } + + /// Return a reference to the name in the signing params. + pub fn name(&self) -> &str { + match self { + Self::V4(v4::SigningParams { name, .. }) => name, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { name, .. }) => name, + } + } + + /// Return the name of the configured signing algorithm. + pub fn algorithm(&self) -> &'static str { + match self { + Self::V4(params) => params.algorithm(), + #[cfg(feature = "sigv4a")] + Self::V4a(params) => params.algorithm(), + } + } + + /// Return the name of the signing scheme + pub fn signature_version(&self) -> SignatureVersion { + match self { + Self::V4(..) => SignatureVersion::V4, + #[cfg(feature = "sigv4a")] + Self::V4a(..) => SignatureVersion::V4a, + } + } +} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index eb58093cdee..eb9724666c8 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -12,7 +12,8 @@ use crate::http_request::uri_path_normalization::normalize_uri_path; use crate::http_request::url_escape::percent_encode_path; use crate::http_request::PercentEncodingMode; use crate::http_request::{PayloadChecksumKind, SignableBody, SignatureLocation, SigningParams}; -use crate::sign::sha256_hex_string; +use crate::sign::v4::sha256_hex_string; +use crate::SignatureVersion; use aws_smithy_http::query_writer::QueryWriter; use http::header::{AsHeaderName, HeaderName, HOST}; use http::{HeaderMap, HeaderValue, Uri}; @@ -23,6 +24,9 @@ use std::fmt; use std::str::FromStr; use std::time::SystemTime; +#[cfg(feature = "sigv4a")] +pub(crate) mod sigv4a; + pub(crate) mod header { pub(crate) const X_AMZ_CONTENT_SHA_256: &str = "x-amz-content-sha256"; pub(crate) const X_AMZ_DATE: &str = "x-amz-date"; @@ -46,32 +50,36 @@ const UNSIGNED_PAYLOAD: &str = "UNSIGNED-PAYLOAD"; const STREAMING_UNSIGNED_PAYLOAD_TRAILER: &str = "STREAMING-UNSIGNED-PAYLOAD-TRAILER"; #[derive(Debug, PartialEq)] -pub(super) struct HeaderValues<'a> { - pub(super) content_sha256: Cow<'a, str>, - pub(super) date_time: String, - pub(super) security_token: Option<&'a str>, - pub(super) signed_headers: SignedHeaders, +pub(crate) struct HeaderValues<'a> { + pub(crate) content_sha256: Cow<'a, str>, + pub(crate) date_time: String, + pub(crate) security_token: Option<&'a str>, + pub(crate) signed_headers: SignedHeaders, + #[cfg(feature = "sigv4a")] + pub(crate) region_set: Option<&'a str>, } #[derive(Debug, PartialEq)] -pub(super) struct QueryParamValues<'a> { - pub(super) algorithm: &'static str, - pub(super) content_sha256: Cow<'a, str>, - pub(super) credential: String, - pub(super) date_time: String, - pub(super) expires: String, - pub(super) security_token: Option<&'a str>, - pub(super) signed_headers: SignedHeaders, +pub(crate) struct QueryParamValues<'a> { + pub(crate) algorithm: &'static str, + pub(crate) content_sha256: Cow<'a, str>, + pub(crate) credential: String, + pub(crate) date_time: String, + pub(crate) expires: String, + pub(crate) security_token: Option<&'a str>, + pub(crate) signed_headers: SignedHeaders, + #[cfg(feature = "sigv4a")] + pub(crate) region_set: Option<&'a str>, } #[derive(Debug, PartialEq)] -pub(super) enum SignatureValues<'a> { +pub(crate) enum SignatureValues<'a> { Headers(HeaderValues<'a>), QueryParams(QueryParamValues<'a>), } impl<'a> SignatureValues<'a> { - pub(super) fn signed_headers(&self) -> &SignedHeaders { + pub(crate) fn signed_headers(&self) -> &SignedHeaders { match self { SignatureValues::Headers(values) => &values.signed_headers, SignatureValues::QueryParams(values) => &values.signed_headers, @@ -85,14 +93,14 @@ impl<'a> SignatureValues<'a> { } } - pub(super) fn as_headers(&self) -> Option<&HeaderValues<'_>> { + pub(crate) fn as_headers(&self) -> Option<&HeaderValues<'_>> { match self { SignatureValues::Headers(values) => Some(values), _ => None, } } - pub(super) fn into_query_params(self) -> Result, Self> { + pub(crate) fn into_query_params(self) -> Result, Self> { match self { SignatureValues::QueryParams(values) => Ok(values), _ => Err(self), @@ -101,12 +109,12 @@ impl<'a> SignatureValues<'a> { } #[derive(Debug, PartialEq)] -pub(super) struct CanonicalRequest<'a> { - pub(super) method: &'a str, - pub(super) path: Cow<'a, str>, - pub(super) params: Option, - pub(super) headers: HeaderMap, - pub(super) values: SignatureValues<'a>, +pub(crate) struct CanonicalRequest<'a> { + pub(crate) method: &'a str, + pub(crate) path: Cow<'a, str>, + pub(crate) params: Option, + pub(crate) headers: HeaderMap, + pub(crate) values: SignatureValues<'a>, } impl<'a> CanonicalRequest<'a> { @@ -126,64 +134,85 @@ impl<'a> CanonicalRequest<'a> { /// included before calculating the signature, add it, otherwise omit it. /// - `settings.signature_location` determines where the signature will be placed in a request, /// and also alters the kinds of signing values that go along with it in the request. - pub(super) fn from<'b>( + pub(crate) fn from<'b>( req: &'b SignableRequest<'b>, params: &'b SigningParams<'b>, ) -> Result, CanonicalRequestError> { let creds = params .credentials() - .ok_or_else(CanonicalRequestError::unsupported_credential_type)?; + .map_err(|_| CanonicalRequestError::unsupported_identity_type())?; // Path encoding: if specified, re-encode % as %25 // Set method and path into CanonicalRequest let path = req.uri().path(); - let path = match params.settings.uri_path_normalization_mode { + let path = match params.settings().uri_path_normalization_mode { UriPathNormalizationMode::Enabled => normalize_uri_path(path), UriPathNormalizationMode::Disabled => Cow::Borrowed(path), }; - let path = match params.settings.percent_encoding_mode { + let path = match params.settings().percent_encoding_mode { // The string is already URI encoded, we don't need to encode everything again, just `%` PercentEncodingMode::Double => Cow::Owned(percent_encode_path(&path)), PercentEncodingMode::Single => path, }; let payload_hash = Self::payload_hash(req.body()); - let date_time = format_date_time(params.time); + let date_time = format_date_time(*params.time()); let (signed_headers, canonical_headers) = Self::headers(req, params, &payload_hash, &date_time)?; let signed_headers = SignedHeaders::new(signed_headers); - let security_token = match params.settings.session_token_mode { + let security_token = match params.settings().session_token_mode { SessionTokenMode::Include => creds.session_token(), SessionTokenMode::Exclude => None, }; - let values = match params.settings.signature_location { + let values = match params.settings().signature_location { SignatureLocation::Headers => SignatureValues::Headers(HeaderValues { content_sha256: payload_hash, date_time, security_token, signed_headers, + #[cfg(feature = "sigv4a")] + region_set: params.region_set(), }), - SignatureLocation::QueryParams => SignatureValues::QueryParams(QueryParamValues { - algorithm: "AWS4-HMAC-SHA256", - content_sha256: payload_hash, - credential: format!( - "{}/{}/{}/{}/aws4_request", - creds.access_key_id(), - format_date(params.time), - params.region, - params.name, - ), - date_time, - expires: params - .settings - .expires_in - .expect("presigning requires expires_in") - .as_secs() - .to_string(), - security_token, - signed_headers, - }), + SignatureLocation::QueryParams => { + let credential = match params { + SigningParams::V4(params) => { + format!( + "{}/{}/{}/{}/aws4_request", + creds.access_key_id(), + format_date(params.time), + params.region, + params.name, + ) + } + #[cfg(feature = "sigv4a")] + SigningParams::V4a(params) => { + format!( + "{}/{}/{}/aws4_request", + creds.access_key_id(), + format_date(params.time), + params.name, + ) + } + }; + + SignatureValues::QueryParams(QueryParamValues { + algorithm: params.algorithm(), + content_sha256: payload_hash, + credential, + date_time, + expires: params + .settings() + .expires_in + .expect("presigning requires expires_in") + .as_secs() + .to_string(), + security_token, + signed_headers, + #[cfg(feature = "sigv4a")] + region_set: params.region_set(), + }) + } }; let creq = CanonicalRequest { @@ -202,9 +231,6 @@ impl<'a> CanonicalRequest<'a> { payload_hash: &str, date_time: &str, ) -> Result<(Vec, HeaderMap), CanonicalRequestError> { - let creds = params - .credentials() - .ok_or_else(CanonicalRequestError::unsupported_credential_type)?; // Header computation: // The canonical request will include headers not present in the input. We need to clone and // normalize the headers from the original request and add: @@ -224,7 +250,10 @@ impl<'a> CanonicalRequest<'a> { Self::insert_host_header(&mut canonical_headers, req.uri()); - if params.settings.signature_location == SignatureLocation::Headers { + if params.settings().signature_location == SignatureLocation::Headers { + let creds = params + .credentials() + .map_err(|_| CanonicalRequestError::unsupported_identity_type())?; Self::insert_date_header(&mut canonical_headers, date_time); if let Some(security_token) = creds.session_token() { @@ -233,27 +262,33 @@ impl<'a> CanonicalRequest<'a> { canonical_headers.insert(header::X_AMZ_SECURITY_TOKEN, sec_header); } - if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { + if params.settings().payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { let header = HeaderValue::from_str(payload_hash)?; canonical_headers.insert(header::X_AMZ_CONTENT_SHA_256, header); } + + #[cfg(feature = "sigv4a")] + if let Some(region_set) = params.region_set() { + let header = HeaderValue::from_str(region_set)?; + canonical_headers.insert(sigv4a::header::X_AMZ_REGION_SET, header); + } } let mut signed_headers = Vec::with_capacity(canonical_headers.len()); for name in canonical_headers.keys() { - if let Some(excluded_headers) = params.settings.excluded_headers.as_ref() { + if let Some(excluded_headers) = params.settings().excluded_headers.as_ref() { if excluded_headers.iter().any(|it| name.as_str() == it) { continue; } } - if params.settings.session_token_mode == SessionTokenMode::Exclude + if params.settings().session_token_mode == SessionTokenMode::Exclude && name == HeaderName::from_static(header::X_AMZ_SECURITY_TOKEN) { continue; } - if params.settings.signature_location == SignatureLocation::QueryParams { + if params.settings().signature_location == SignatureLocation::QueryParams { // The X-Amz-User-Agent header should not be signed if this is for a presigned URL if name == HeaderName::from_static(header::X_AMZ_USER_AGENT) { continue; @@ -295,6 +330,12 @@ impl<'a> CanonicalRequest<'a> { if let SignatureValues::QueryParams(values) = values { add_param(&mut params, param::X_AMZ_DATE, &values.date_time); add_param(&mut params, param::X_AMZ_EXPIRES, &values.expires); + + #[cfg(feature = "sigv4a")] + if let Some(regions) = values.region_set { + add_param(&mut params, sigv4a::param::X_AMZ_REGION_SET, regions); + } + add_param(&mut params, param::X_AMZ_ALGORITHM, values.algorithm); add_param(&mut params, param::X_AMZ_CREDENTIAL, &values.credential); add_param( @@ -378,8 +419,7 @@ impl<'a> fmt::Display for CanonicalRequest<'a> { } writeln!(f)?; // write out the signed headers - write!(f, "{}", self.values.signed_headers().as_str())?; - writeln!(f)?; + writeln!(f, "{}", self.values.signed_headers().as_str())?; write!(f, "{}", self.values.content_sha256())?; Ok(()) } @@ -421,7 +461,7 @@ fn normalize_header_value(header_value: &str) -> Result, formatted: String, } @@ -445,7 +485,7 @@ impl SignedHeaders { value } - pub(super) fn as_str(&self) -> &str { + pub(crate) fn as_str(&self) -> &str { &self.formatted } } @@ -472,10 +512,16 @@ impl Ord for CanonicalHeaderName { } #[derive(PartialEq, Debug, Clone)] -pub(super) struct SigningScope<'a> { - pub(super) time: SystemTime, - pub(super) region: &'a str, - pub(super) service: &'a str, +pub(crate) struct SigningScope<'a> { + pub(crate) time: SystemTime, + pub(crate) region: &'a str, + pub(crate) service: &'a str, +} + +impl<'a> SigningScope<'a> { + pub(crate) fn v4a_display(&self) -> String { + format!("{}/{}/aws4_request", format_date(self.time), self.service) + } } impl<'a> fmt::Display for SigningScope<'a> { @@ -490,17 +536,19 @@ impl<'a> fmt::Display for SigningScope<'a> { } } -#[derive(PartialEq, Debug)] -pub(super) struct StringToSign<'a> { - pub(super) scope: SigningScope<'a>, - pub(super) time: SystemTime, - pub(super) region: &'a str, - pub(super) service: &'a str, - pub(super) hashed_creq: &'a str, +#[derive(PartialEq, Debug, Clone)] +pub(crate) struct StringToSign<'a> { + pub(crate) algorithm: &'static str, + pub(crate) scope: SigningScope<'a>, + pub(crate) time: SystemTime, + pub(crate) region: &'a str, + pub(crate) service: &'a str, + pub(crate) hashed_creq: &'a str, + signature_version: SignatureVersion, } impl<'a> StringToSign<'a> { - pub(crate) fn new( + pub(crate) fn new_v4( time: SystemTime, region: &'a str, service: &'a str, @@ -512,11 +560,38 @@ impl<'a> StringToSign<'a> { service, }; Self { + algorithm: HMAC_256, scope, time, region, service, hashed_creq, + signature_version: SignatureVersion::V4, + } + } + + #[cfg(feature = "sigv4a")] + pub(crate) fn new_v4a( + time: SystemTime, + region_set: &'a str, + service: &'a str, + hashed_creq: &'a str, + ) -> Self { + use crate::sign::v4a::ECDSA_256; + + let scope = SigningScope { + time, + region: region_set, + service, + }; + Self { + algorithm: ECDSA_256, + scope, + time, + region: region_set, + service, + hashed_creq, + signature_version: SignatureVersion::V4a, } } } @@ -526,9 +601,12 @@ impl<'a> fmt::Display for StringToSign<'a> { write!( f, "{}\n{}\n{}\n{}", - HMAC_256, + self.algorithm, format_date_time(self.time), - self.scope, + match self.signature_version { + SignatureVersion::V4 => self.scope.to_string(), + SignatureVersion::V4a => self.scope.v4a_display(), + }, self.hashed_creq ) } @@ -540,12 +618,13 @@ mod tests { use crate::http_request::canonical_request::{ normalize_header_value, trim_all, CanonicalRequest, SigningScope, StringToSign, }; - use crate::http_request::test::{test_canonical_request, test_request, test_sts}; + use crate::http_request::test; use crate::http_request::{ PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SignatureLocation, SigningParams, SigningSettings, }; - use crate::sign::sha256_hex_string; + use crate::sign::v4; + use crate::sign::v4::sha256_hex_string; use aws_credential_types::Credentials; use aws_smithy_http::query_writer::QueryWriter; use aws_smithy_runtime_api::client::identity::Identity; @@ -555,18 +634,20 @@ mod tests { use std::time::Duration; fn signing_params(identity: &Identity, settings: SigningSettings) -> SigningParams<'_> { - SigningParams { - identity, - region: "test-region", - name: "testservicename", - time: parse_date_time("20210511T154045Z").unwrap(), - settings, - } + v4::signing_params::Builder::default() + .identity(identity) + .region("test-region") + .name("testservicename") + .time(parse_date_time("20210511T154045Z").unwrap()) + .settings(settings) + .build() + .unwrap() + .into() } #[test] fn test_repeated_header() { - let mut req = test_request("get-vanilla-query-order-key-case"); + let mut req = test::v4::test_request("get-vanilla-query-order-key-case"); req.headers.push(( "x-amz-object-attributes".to_string(), "Checksum".to_string(), @@ -578,6 +659,7 @@ mod tests { let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, + session_token_mode: SessionTokenMode::Exclude, ..Default::default() }; let identity = Credentials::for_tests().into(); @@ -596,10 +678,11 @@ mod tests { #[test] fn test_set_xamz_sha_256() { - let req = test_request("get-vanilla-query-order-key-case"); + let req = test::v4::test_request("get-vanilla-query-order-key-case"); let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, + session_token_mode: SessionTokenMode::Exclude, ..Default::default() }; let identity = Credentials::for_tests().into(); @@ -615,14 +698,14 @@ mod tests { "host;x-amz-content-sha256;x-amz-date" ); - signing_params.settings.payload_checksum_kind = PayloadChecksumKind::NoHeader; + signing_params.set_payload_checksum_kind(PayloadChecksumKind::NoHeader); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!(creq.values.signed_headers().as_str(), "host;x-amz-date"); } #[test] fn test_unsigned_payload() { - let mut req = test_request("get-vanilla-query-order-key-case"); + let mut req = test::v4::test_request("get-vanilla-query-order-key-case"); req.set_body(SignableBody::UnsignedPayload); let req: SignableRequest<'_> = SignableRequest::from(&req); @@ -640,7 +723,7 @@ mod tests { #[test] fn test_precomputed_payload() { let payload_hash = "44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072"; - let mut req = test_request("get-vanilla-query-order-key-case"); + let mut req = test::v4::test_request("get-vanilla-query-order-key-case"); req.set_body(SignableBody::Precomputed(String::from(payload_hash))); let req = SignableRequest::from(&req); let settings = SigningSettings { @@ -668,17 +751,17 @@ mod tests { #[test] fn test_string_to_sign() { let time = parse_date_time("20150830T123600Z").unwrap(); - let creq = test_canonical_request("get-vanilla-query-order-key-case"); - let expected_sts = test_sts("get-vanilla-query-order-key-case"); + let creq = test::v4::test_canonical_request("get-vanilla-query-order-key-case"); + let expected_sts = test::v4::test_sts("get-vanilla-query-order-key-case"); let encoded = sha256_hex_string(creq.as_bytes()); - let actual = StringToSign::new(time, "us-east-1", "service", &encoded); + let actual = StringToSign::new_v4(time, "us-east-1", "service", &encoded); assert_eq!(expected_sts, actual.to_string()); } #[test] fn test_digest_of_canonical_request() { - let creq = test_canonical_request("get-vanilla-query-order-key-case"); + let creq = test::v4::test_canonical_request("get-vanilla-query-order-key-case"); let expected = "816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0"; let actual = sha256_hex_string(creq.as_bytes()); assert_eq!(expected, actual); @@ -686,26 +769,26 @@ mod tests { #[test] fn test_double_url_encode_path() { - let req = test_request("double-encode-path"); + let req = test::v4::test_request("double-encode-path"); let req = SignableRequest::from(&req); let identity = Credentials::for_tests().into(); let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); - let expected = test_canonical_request("double-encode-path"); + let expected = test::v4::test_canonical_request("double-encode-path"); let actual = format!("{}", creq); assert_eq!(actual, expected); } #[test] fn test_double_url_encode() { - let req = test_request("double-url-encode"); + let req = test::v4::test_request("double-url-encode"); let req = SignableRequest::from(&req); let identity = Credentials::for_tests().into(); let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); - let expected = test_canonical_request("double-url-encode"); + let expected = test::v4::test_canonical_request("double-url-encode"); let actual = format!("{}", creq); assert_eq!(actual, expected); } @@ -750,7 +833,7 @@ mod tests { #[test] fn test_omit_session_token() { - let req = test_request("get-vanilla-query-order-key-case"); + let req = test::v4::test_request("get-vanilla-query-order-key-case"); let req = SignableRequest::from(&req); let settings = SigningSettings { session_token_mode: SessionTokenMode::Include, @@ -769,7 +852,7 @@ mod tests { "notarealsessiontoken" ); - signing_params.settings.session_token_mode = SessionTokenMode::Exclude; + signing_params.set_session_token_mode(SessionTokenMode::Exclude); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( creq.headers.get("x-amz-security-token").unwrap(), diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs new file mode 100644 index 00000000000..04b094053fb --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs @@ -0,0 +1,12 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +pub(crate) mod header { + pub(crate) const X_AMZ_REGION_SET: &str = "x-amz-region-set"; +} + +pub(crate) mod param { + pub(crate) const X_AMZ_REGION_SET: &str = "X-Amz-Region-Set"; +} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs index 0e0909aba1c..6909b7db50b 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs @@ -108,7 +108,7 @@ impl CanonicalRequestError { } } - pub(crate) fn unsupported_credential_type() -> Self { + pub(crate) fn unsupported_identity_type() -> Self { Self { kind: CanonicalRequestErrorKind::UnsupportedIdentityType, } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs b/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs index 8349c428595..3c690e6ddca 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs @@ -7,9 +7,6 @@ use http::header::{AUTHORIZATION, USER_AGENT}; use std::borrow::Cow; use std::time::Duration; -/// HTTP signing parameters -pub type SigningParams<'a> = crate::SigningParams<'a, SigningSettings>; - const HEADER_NAME_X_RAY_TRACE_ID: &str = "x-amzn-trace-id"; /// HTTP-specific signing settings @@ -86,6 +83,16 @@ pub enum UriPathNormalizationMode { Disabled, } +impl From for UriPathNormalizationMode { + fn from(value: bool) -> Self { + if value { + UriPathNormalizationMode::Enabled + } else { + UriPathNormalizationMode::Disabled + } + } +} + /// Config value to specify whether X-Amz-Security-Token should be part of the canonical request. /// #[non_exhaustive] diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index 1f8edda5169..12d1e6cb522 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -7,15 +7,15 @@ use super::error::SigningError; use super::{PayloadChecksumKind, SignatureLocation}; use crate::http_request::canonical_request::header; use crate::http_request::canonical_request::param; -use crate::http_request::canonical_request::{CanonicalRequest, StringToSign, HMAC_256}; +use crate::http_request::canonical_request::{CanonicalRequest, StringToSign}; use crate::http_request::error::CanonicalRequestError; use crate::http_request::SigningParams; -use crate::sign::{calculate_signature, generate_signing_key, sha256_hex_string}; -use crate::SigningOutput; - +use crate::sign::v4; +#[cfg(feature = "sigv4a")] +use crate::sign::v4a; +use crate::{SignatureVersion, SigningOutput}; use http::Uri; use std::borrow::Cow; - use std::fmt::{Debug, Formatter}; use std::str; @@ -187,7 +187,7 @@ pub fn sign<'a>( params: &'a SigningParams<'a>, ) -> Result, SigningError> { tracing::trace!(request = ?request, params = ?params, "signing request"); - match params.settings.signature_location { + match params.settings().signature_location { SignatureLocation::Headers => { let (signing_headers, signature) = calculate_signing_headers(&request, params)?.into_parts(); @@ -212,21 +212,36 @@ fn calculate_signing_params<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, ) -> Result<(CalculatedParams, String), SigningError> { - let creds = params - .credentials() - .ok_or_else(SigningError::unsupported_identity_type)?; + let creds = params.credentials()?; let creq = CanonicalRequest::from(request, params)?; - - let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); - let string_to_sign = - StringToSign::new(params.time, params.region, params.name, encoded_creq).to_string(); - let signing_key = generate_signing_key( - creds.secret_access_key(), - params.time, - params.region, - params.name, - ); - let signature = calculate_signature(signing_key, string_to_sign.as_bytes()); + let encoded_creq = &v4::sha256_hex_string(creq.to_string().as_bytes()); + + let (signature, string_to_sign) = match params { + SigningParams::V4(params) => { + let string_to_sign = + StringToSign::new_v4(params.time, params.region, params.name, encoded_creq) + .to_string(); + let signing_key = v4::generate_signing_key( + creds.secret_access_key(), + params.time, + params.region, + params.name, + ); + let signature = v4::calculate_signature(signing_key, string_to_sign.as_bytes()); + (signature, string_to_sign) + } + #[cfg(feature = "sigv4a")] + SigningParams::V4a(params) => { + let string_to_sign = + StringToSign::new_v4a(params.time, params.region_set, params.name, encoded_creq) + .to_string(); + + let secret_key = + v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key()); + let signature = v4a::calculate_signature(&secret_key, string_to_sign.as_bytes()); + (signature, string_to_sign) + } + }; tracing::trace!(canonical_request = %creq, string_to_sign = %string_to_sign, "calculated signing parameters"); let values = creq.values.into_query_params().expect("signing with query"); @@ -242,6 +257,16 @@ fn calculate_signing_params<'a>( (param::X_AMZ_SIGNATURE, Cow::Owned(signature.clone())), ]; + #[cfg(feature = "sigv4a")] + if let Some(region_set) = params.region_set() { + if params.signature_version() == SignatureVersion::V4a { + signing_params.push(( + crate::http_request::canonical_request::sigv4a::param::X_AMZ_REGION_SET, + Cow::Owned(region_set.to_owned()), + )); + } + } + if let Some(security_token) = creds.session_token() { signing_params.push(( param::X_AMZ_SECURITY_TOKEN, @@ -262,52 +287,119 @@ fn calculate_signing_headers<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, ) -> Result>, SigningError> { - let creds = params - .credentials() - .ok_or_else(SigningError::unsupported_identity_type)?; + let creds = params.credentials()?; + // Step 1: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-canonical-request.html. let creq = CanonicalRequest::from(request, params)?; - tracing::trace!(canonical_request = %creq); - // Step 2: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-string-to-sign.html. - let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); - let sts = StringToSign::new(params.time, params.region, params.name, encoded_creq); - - // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html - let signing_key = generate_signing_key( - creds.secret_access_key(), - params.time, - params.region, - params.name, - ); - let signature = calculate_signature(signing_key, sts.to_string().as_bytes()); - - // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html - let values = creq.values.as_headers().expect("signing with headers"); + let encoded_creq = v4::sha256_hex_string(creq.to_string().as_bytes()); + tracing::trace!(canonical_request = %creq); let mut headers = vec![]; - add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); - headers.push(Header { - key: "authorization", - value: build_authorization_header(creds.access_key_id(), &creq, sts, &signature), - sensitive: false, - }); - if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { - add_header( - &mut headers, - header::X_AMZ_CONTENT_SHA_256, - &values.content_sha256, - false, - ); - } - if let Some(security_token) = creds.session_token() { - add_header( - &mut headers, - header::X_AMZ_SECURITY_TOKEN, - security_token, - true, - ); - } + let signature = match params { + SigningParams::V4(params) => { + let sts = StringToSign::new_v4( + params.time, + params.region, + params.name, + encoded_creq.as_str(), + ); + + // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html + let signing_key = v4::generate_signing_key( + creds.secret_access_key(), + params.time, + params.region, + params.name, + ); + let signature = v4::calculate_signature(signing_key, sts.to_string().as_bytes()); + + // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html + let values = creq.values.as_headers().expect("signing with headers"); + add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); + headers.push(Header { + key: "authorization", + value: build_authorization_header( + creds.access_key_id(), + &creq, + sts, + &signature, + SignatureVersion::V4, + ), + sensitive: false, + }); + if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { + add_header( + &mut headers, + header::X_AMZ_CONTENT_SHA_256, + &values.content_sha256, + false, + ); + } + + if let Some(security_token) = creds.session_token() { + add_header( + &mut headers, + header::X_AMZ_SECURITY_TOKEN, + security_token, + true, + ); + } + signature + } + #[cfg(feature = "sigv4a")] + SigningParams::V4a(params) => { + let sts = StringToSign::new_v4a( + params.time, + params.region_set, + params.name, + encoded_creq.as_str(), + ); + + let signing_key = + v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key()); + let signature = v4a::calculate_signature(&signing_key, sts.to_string().as_bytes()); + + let values = creq.values.as_headers().expect("signing with headers"); + add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); + add_header( + &mut headers, + crate::http_request::canonical_request::sigv4a::header::X_AMZ_REGION_SET, + params.region_set, + false, + ); + + headers.push(Header { + key: "authorization", + value: build_authorization_header( + creds.access_key_id(), + &creq, + sts, + &signature, + SignatureVersion::V4a, + ), + sensitive: false, + }); + if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { + add_header( + &mut headers, + header::X_AMZ_CONTENT_SHA_256, + &values.content_sha256, + false, + ); + } + + if let Some(security_token) = creds.session_token() { + add_header( + &mut headers, + header::X_AMZ_SECURITY_TOKEN, + security_token, + true, + ); + } + signature + } + }; Ok(SigningOutput::new(headers, signature)) } @@ -327,33 +419,36 @@ fn build_authorization_header( creq: &CanonicalRequest<'_>, sts: StringToSign<'_>, signature: &str, + signature_version: SignatureVersion, ) -> String { + let scope = match signature_version { + SignatureVersion::V4 => sts.scope.to_string(), + SignatureVersion::V4a => sts.scope.v4a_display(), + }; format!( "{} Credential={}/{}, SignedHeaders={}, Signature={}", - HMAC_256, + sts.algorithm, access_key, - sts.scope, + scope, creq.values.signed_headers().as_str(), signature ) } - #[cfg(test)] mod tests { use crate::date_time::test_parsers::parse_date_time; - use crate::http_request::sign::SignableRequest; - use crate::http_request::test::{ - test_request, test_signed_request, test_signed_request_query_params, - }; + use crate::http_request::sign::{add_header, SignableRequest}; use crate::http_request::{ - SessionTokenMode, SignableBody, SignatureLocation, SigningParams, SigningSettings, + sign, test, SessionTokenMode, SignableBody, SignatureLocation, SigningInstructions, + SigningSettings, }; + use crate::sign::v4; use aws_credential_types::Credentials; use http::{HeaderValue, Request}; use pretty_assertions::assert_eq; use proptest::proptest; + use std::borrow::Cow; use std::iter; - use std::time::Duration; macro_rules! assert_req_eq { @@ -378,17 +473,19 @@ mod tests { #[test] fn test_sign_vanilla_with_headers() { let settings = SigningSettings::default(); - let params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); - let original = test_request("get-vanilla-query-order-key-case"); + let original = test::v4::test_request("get-vanilla-query-order-key-case"); let signable = SignableRequest::from(&original); - let out = crate::http_request::sign(signable, ¶ms).unwrap(); + let out = sign(signable, ¶ms).unwrap(); assert_eq!( "5557820e7380d585310524bd93d51a08d7757fb5efd7344ee12088f2b0860947", out.signature @@ -397,25 +494,283 @@ mod tests { let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let expected = test_signed_request("get-vanilla-query-order-key-case"); + let expected = test::v4::test_signed_request("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); } + #[cfg(feature = "sigv4a")] + mod sigv4a_tests { + use super::*; + use crate::http_request::canonical_request::{CanonicalRequest, StringToSign}; + use crate::http_request::{sign, test, SigningParams}; + use crate::sign::v4a; + use p256::ecdsa::signature::{Signature, Verifier}; + use p256::ecdsa::{DerSignature, SigningKey}; + use pretty_assertions::assert_eq; + + fn new_v4a_signing_params_from_context( + test_context: &'_ test::v4a::TestContext, + signature_location: SignatureLocation, + ) -> SigningParams<'_> { + let mut params = v4a::SigningParams::from(test_context); + params.settings.signature_location = signature_location; + + params.into() + } + + fn run_v4a_test_suite(test_name: &str, signature_location: SignatureLocation) { + let tc = test::v4a::test_context(test_name); + let params = new_v4a_signing_params_from_context(&tc, signature_location); + + let req = test::v4a::test_request(test_name); + let expected_creq = test::v4a::test_canonical_request(test_name, signature_location); + let signable_req = SignableRequest::from(&req); + let actual_creq = CanonicalRequest::from(&signable_req, ¶ms).unwrap(); + + assert_eq!(expected_creq, actual_creq.to_string(), "creq didn't match"); + + let expected_string_to_sign = + test::v4a::test_string_to_sign(test_name, signature_location); + let hashed_creq = &v4::sha256_hex_string(actual_creq.to_string().as_bytes()); + let actual_string_to_sign = StringToSign::new_v4a( + *params.time(), + params.region_set().unwrap(), + params.name(), + hashed_creq, + ) + .to_string(); + + assert_eq!( + expected_string_to_sign, actual_string_to_sign, + "'string to sign' didn't match" + ); + + let out = sign(signable_req, ¶ms).unwrap(); + // Sigv4a signatures are non-deterministic, so we can't compare the signature directly. + out.output.apply_to_request(&mut req.as_http_request()); + + let creds = params.credentials().unwrap(); + let signing_key = + v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key()); + let sig = DerSignature::from_bytes(&hex::decode(out.signature).unwrap()).unwrap(); + let sig = sig + .try_into() + .expect("DER-style signatures are always convertible into fixed-size signatures"); + + let signing_key = SigningKey::from_bytes(signing_key.as_ref()).unwrap(); + let peer_public_key = signing_key.verifying_key(); + let sts = actual_string_to_sign.as_bytes(); + peer_public_key.verify(sts, &sig).unwrap(); + } + + #[test] + fn test_get_header_key_duplicate() { + run_v4a_test_suite("get-header-key-duplicate", SignatureLocation::Headers); + } + + #[test] + fn test_get_header_value_order() { + run_v4a_test_suite("get-header-value-order", SignatureLocation::Headers); + } + + #[test] + fn test_get_header_value_trim() { + run_v4a_test_suite("get-header-value-trim", SignatureLocation::Headers); + } + + #[test] + fn test_get_relative_normalized() { + run_v4a_test_suite("get-relative-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_relative_relative_normalized() { + run_v4a_test_suite( + "get-relative-relative-normalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_relative_relative_unnormalized() { + run_v4a_test_suite( + "get-relative-relative-unnormalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_relative_unnormalized() { + run_v4a_test_suite("get-relative-unnormalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slash_dot_slash_normalized() { + run_v4a_test_suite("get-slash-dot-slash-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slash_dot_slash_unnormalized() { + run_v4a_test_suite( + "get-slash-dot-slash-unnormalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_slash_normalized() { + run_v4a_test_suite("get-slash-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slash_pointless_dot_normalized() { + run_v4a_test_suite( + "get-slash-pointless-dot-normalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_slash_pointless_dot_unnormalized() { + run_v4a_test_suite( + "get-slash-pointless-dot-unnormalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_slash_unnormalized() { + run_v4a_test_suite("get-slash-unnormalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slashes_normalized() { + run_v4a_test_suite("get-slashes-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slashes_unnormalized() { + run_v4a_test_suite("get-slashes-unnormalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_unreserved() { + run_v4a_test_suite("get-unreserved", SignatureLocation::Headers); + } + + #[test] + fn test_get_vanilla() { + run_v4a_test_suite("get-vanilla", SignatureLocation::Headers); + } + + #[test] + fn test_get_vanilla_empty_query_key() { + run_v4a_test_suite( + "get-vanilla-empty-query-key", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_get_vanilla_query() { + run_v4a_test_suite("get-vanilla-query", SignatureLocation::QueryParams); + } + + #[test] + fn test_get_vanilla_query_order_key_case() { + run_v4a_test_suite( + "get-vanilla-query-order-key-case", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_get_vanilla_query_unreserved() { + run_v4a_test_suite( + "get-vanilla-query-unreserved", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_get_vanilla_with_session_token() { + run_v4a_test_suite("get-vanilla-with-session-token", SignatureLocation::Headers); + } + + #[test] + fn test_post_header_key_case() { + run_v4a_test_suite("post-header-key-case", SignatureLocation::Headers); + } + + #[test] + fn test_post_header_key_sort() { + run_v4a_test_suite("post-header-key-sort", SignatureLocation::Headers); + } + + #[test] + fn test_post_header_value_case() { + run_v4a_test_suite("post-header-value-case", SignatureLocation::Headers); + } + + #[test] + fn test_post_sts_header_after() { + run_v4a_test_suite("post-sts-header-after", SignatureLocation::Headers); + } + + #[test] + fn test_post_sts_header_before() { + run_v4a_test_suite("post-sts-header-before", SignatureLocation::Headers); + } + + #[test] + fn test_post_vanilla() { + run_v4a_test_suite("post-vanilla", SignatureLocation::Headers); + } + + #[test] + fn test_post_vanilla_empty_query_value() { + run_v4a_test_suite( + "post-vanilla-empty-query-value", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_post_vanilla_query() { + run_v4a_test_suite("post-vanilla-query", SignatureLocation::QueryParams); + } + + #[test] + fn test_post_x_www_form_urlencoded() { + run_v4a_test_suite("post-x-www-form-urlencoded", SignatureLocation::Headers); + } + + #[test] + fn test_post_x_www_form_urlencoded_parameters() { + run_v4a_test_suite( + "post-x-www-form-urlencoded-parameters", + SignatureLocation::QueryParams, + ); + } + } + #[test] fn test_sign_url_escape() { let test = "double-encode-path"; let settings = SigningSettings::default(); - let params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); - let original = test_request(test); + let original = test::v4::test_request(test); let signable = SignableRequest::from(&original); - let out = crate::http_request::sign(signable, ¶ms).unwrap(); + let out = sign(signable, ¶ms).unwrap(); assert_eq!( "57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705", out.signature @@ -424,7 +779,7 @@ mod tests { let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let expected = test_signed_request(test); + let expected = test::v4::test_signed_request(test); assert_req_eq!(expected, signed); } @@ -435,17 +790,19 @@ mod tests { expires_in: Some(Duration::from_secs(35)), ..Default::default() }; - let params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); - let original = test_request("get-vanilla-query-order-key-case"); + let original = test::v4::test_request("get-vanilla-query-order-key-case"); let signable = SignableRequest::from(&original); - let out = crate::http_request::sign(signable, ¶ms).unwrap(); + let out = sign(signable, ¶ms).unwrap(); assert_eq!( "ecce208e4b4f7d7e3a4cc22ced6acc2ad1d170ee8ba87d7165f6fa4b9aff09ab", out.signature @@ -454,20 +811,23 @@ mod tests { let mut signed = original.as_http_request(); out.output.apply_to_request(&mut signed); - let expected = test_signed_request_query_params("get-vanilla-query-order-key-case"); + let expected = + test::v4::test_signed_request_query_params("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); } #[test] fn test_sign_headers_utf8() { let settings = SigningSettings::default(); - let params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") @@ -476,7 +836,7 @@ mod tests { .unwrap() .into(); let signable = SignableRequest::from(&original); - let out = crate::http_request::sign(signable, ¶ms).unwrap(); + let out = sign(signable, ¶ms).unwrap(); assert_eq!( "55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f", out.signature @@ -513,26 +873,25 @@ mod tests { session_token_mode: SessionTokenMode::Exclude, ..Default::default() }; - let mut params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests_with_session_token().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .body("") .unwrap() .into(); - let out_without_session_token = - crate::http_request::sign(SignableRequest::from(&original), ¶ms).unwrap(); - let identity = Credentials::for_tests_with_session_token().into(); - params.identity = &identity; + let out_without_session_token = sign(SignableRequest::from(&original), ¶ms).unwrap(); let out_with_session_token_but_excluded = - crate::http_request::sign(SignableRequest::from(&original), ¶ms).unwrap(); + sign(SignableRequest::from(&original), ¶ms).unwrap(); assert_eq!( "ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560", out_with_session_token_but_excluded.signature @@ -575,13 +934,15 @@ mod tests { #[test] fn test_sign_headers_space_trimming() { let settings = SigningSettings::default(); - let params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") @@ -593,7 +954,7 @@ mod tests { .unwrap() .into(); let signable = SignableRequest::from(&original); - let out = crate::http_request::sign(signable, ¶ms).unwrap(); + let out = sign(signable, ¶ms).unwrap(); assert_eq!( "244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08", out.signature @@ -635,13 +996,14 @@ mod tests { header in ".*" ) { let settings = SigningSettings::default(); - let params = SigningParams { - identity: &Credentials::for_tests().into(), + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", name: "foo", time: std::time::SystemTime::UNIX_EPOCH, settings, - }; + }.into(); let req = SignableRequest::new( "GET", @@ -656,4 +1018,44 @@ mod tests { } } } + + #[test] + fn apply_signing_instructions_headers() { + let mut headers = vec![]; + add_header(&mut headers, "some-header", "foo", false); + add_header(&mut headers, "some-other-header", "bar", false); + let instructions = SigningInstructions::new(headers, vec![]); + + let mut request = http::Request::builder() + .uri("https://some-endpoint.some-region.amazonaws.com") + .body("") + .unwrap(); + + instructions.apply_to_request(&mut request); + + let get_header = |n: &str| request.headers().get(n).unwrap().to_str().unwrap(); + assert_eq!("foo", get_header("some-header")); + assert_eq!("bar", get_header("some-other-header")); + } + + #[test] + fn apply_signing_instructions_query_params() { + let params = vec![ + ("some-param", Cow::Borrowed("f&o?o")), + ("some-other-param?", Cow::Borrowed("bar")), + ]; + let instructions = SigningInstructions::new(vec![], params); + + let mut request = http::Request::builder() + .uri("https://some-endpoint.some-region.amazonaws.com/some/path") + .body("") + .unwrap(); + + instructions.apply_to_request(&mut request); + + assert_eq!( + "/some/path?some-param=f%26o%3Fo&some-other-param%3F=bar", + request.uri().path_and_query().unwrap().to_string() + ); + } } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/test.rs b/aws/rust-runtime/aws-sigv4/src/http_request/test.rs index 8b349538ac4..9d5bec6d5d0 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/test.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/test.rs @@ -6,52 +6,230 @@ //! Functions shared between the tests of several modules. use crate::http_request::{SignableBody, SignableRequest}; -use http::{Method, Request, Uri}; +use http::{Method, Uri}; use std::error::Error as StdError; -fn path(name: &str, ext: &str) -> String { - format!("aws-sig-v4-test-suite/{}/{}.{}", name, name, ext) -} +pub(crate) mod v4 { + use super::*; -fn read(path: &str) -> String { - println!("Loading `{}` for test case...", path); - match std::fs::read_to_string(path) { - // This replacement is necessary for tests to pass on Windows, as reading the - // sigv4 snapshots from the file system results in CRLF line endings being inserted. - Ok(value) => value.replace("\r\n", "\n"), - Err(err) => { - panic!("failed to load test case `{}`: {}", path, err); + fn path(name: &str, ext: &str) -> String { + format!("aws-sig-v4-test-suite/{}/{}.{}", name, name, ext) + } + + pub(crate) fn test_canonical_request(name: &str) -> String { + // Tests fail if there's a trailing newline in the file, and pre-commit requires trailing newlines + read(&path(name, "creq")).trim().to_string() + } + + pub(crate) fn test_sts(name: &str) -> String { + read(&path(name, "sts")) + } + + pub(crate) fn test_request(name: &str) -> TestRequest { + test_parsed_request(name, "req") + } + + pub(crate) fn test_signed_request(name: &str) -> TestRequest { + test_parsed_request(name, "sreq") + } + + pub(crate) fn test_signed_request_query_params(name: &str) -> TestRequest { + test_parsed_request(name, "qpsreq") + } + + fn test_parsed_request(name: &str, ext: &str) -> TestRequest { + let path = path(name, ext); + match parse_request(read(&path).as_bytes()) { + Ok(parsed) => parsed, + Err(err) => panic!("Failed to parse {}: {}", path, err), } } -} -pub(crate) fn test_canonical_request(name: &str) -> String { - // Tests fail if there's a trailing newline in the file, and pre-commit requires trailing newlines - read(&path(name, "creq")).trim().to_string() -} + #[test] + fn test_parse() { + test_request("post-header-key-case"); + } -pub(crate) fn test_sts(name: &str) -> String { - read(&path(name, "sts")) + #[test] + fn test_read_query_params() { + test_request("get-vanilla-query-order-key-case"); + } } -pub(crate) fn test_request(name: &str) -> TestRequest { - test_parsed_request(name, "req") -} +#[cfg(feature = "sigv4a")] +pub(crate) mod v4a { + use super::*; + use crate::http_request::{ + PayloadChecksumKind, SessionTokenMode, SignatureLocation, SigningSettings, + }; + use aws_credential_types::Credentials; + use aws_smithy_runtime_api::client::identity::Identity; + use serde_derive::Deserialize; + use std::time::{Duration, SystemTime}; + use time::format_description::well_known::Rfc3339; + use time::OffsetDateTime; -pub(crate) fn test_signed_request(name: &str) -> TestRequest { - test_parsed_request(name, "sreq") -} + fn path(test_name: &str, definition_name: &str) -> String { + format!("aws-sig-v4a-test-suite/{test_name}/{definition_name}.txt") + } -pub(crate) fn test_signed_request_query_params(name: &str) -> TestRequest { - test_parsed_request(name, "qpsreq") -} + pub(crate) fn test_request(name: &str) -> TestRequest { + test_parsed_request(&path(name, "request")) + } + + pub(crate) fn test_canonical_request( + name: &str, + signature_location: SignatureLocation, + ) -> String { + match signature_location { + SignatureLocation::QueryParams => read(&path(name, "query-canonical-request")), + SignatureLocation::Headers => read(&path(name, "header-canonical-request")), + } + } + + pub(crate) fn test_string_to_sign(name: &str, signature_location: SignatureLocation) -> String { + match signature_location { + SignatureLocation::QueryParams => read(&path(name, "query-string-to-sign")), + SignatureLocation::Headers => read(&path(name, "header-string-to-sign")), + } + } + + fn test_parsed_request(path: &str) -> TestRequest { + match parse_request(read(path).as_bytes()) { + Ok(parsed) => parsed, + Err(err) => panic!("Failed to parse {}: {}", path, err), + } + } -fn test_parsed_request(name: &str, ext: &str) -> TestRequest { - let path = path(name, ext); - match parse_request(read(&path).as_bytes()) { - Ok(parsed) => parsed, - Err(err) => panic!("Failed to parse {}: {}", path, err), + pub(crate) fn test_context(test_name: &str) -> TestContext { + let path = format!("aws-sig-v4a-test-suite/{test_name}/context.json"); + let context = read(&path); + let tc_builder: TestContextBuilder = serde_json::from_str(&context).unwrap(); + tc_builder.build() } + + pub(crate) struct TestContext { + pub(crate) identity: Identity, + pub(crate) expiration_in_seconds: u64, + pub(crate) normalize: bool, + pub(crate) region: String, + pub(crate) service: String, + pub(crate) timestamp: String, + pub(crate) omit_session_token: bool, + pub(crate) sign_body: bool, + } + + impl<'a> From<&'a TestContext> for crate::sign::v4a::SigningParams<'a, SigningSettings> { + fn from(tc: &'a TestContext) -> Self { + crate::sign::v4a::SigningParams { + identity: &tc.identity, + region_set: &tc.region, + name: &tc.service, + time: OffsetDateTime::parse(&tc.timestamp, &Rfc3339) + .unwrap() + .into(), + settings: SigningSettings { + // payload_checksum_kind: PayloadChecksumKind::XAmzSha256, + expires_in: Some(Duration::from_secs(tc.expiration_in_seconds)), + uri_path_normalization_mode: tc.normalize.into(), + session_token_mode: if tc.omit_session_token { + SessionTokenMode::Exclude + } else { + SessionTokenMode::Include + }, + payload_checksum_kind: if tc.sign_body { + PayloadChecksumKind::XAmzSha256 + } else { + PayloadChecksumKind::NoHeader + }, + ..Default::default() + }, + } + } + } + + // Serde has limitations requiring this odd workaround. + // See https://github.com/serde-rs/serde/issues/368 for more info. + fn return_true() -> bool { + true + } + + #[derive(Deserialize)] + pub(crate) struct TestContextBuilder { + credentials: TestContextCreds, + expiration_in_seconds: u64, + normalize: bool, + region: String, + service: String, + timestamp: String, + #[serde(default)] + omit_session_token: bool, + #[serde(default = "return_true")] + sign_body: bool, + } + + impl TestContextBuilder { + pub(crate) fn build(self) -> TestContext { + let identity = Identity::new( + Credentials::from_keys( + &self.credentials.access_key_id, + &self.credentials.secret_access_key, + self.credentials.token.clone(), + ), + Some(SystemTime::UNIX_EPOCH + Duration::from_secs(self.expiration_in_seconds)), + ); + + TestContext { + identity, + expiration_in_seconds: self.expiration_in_seconds, + normalize: self.normalize, + region: self.region, + service: self.service, + timestamp: self.timestamp, + omit_session_token: self.omit_session_token, + sign_body: self.sign_body, + } + } + } + + #[derive(Deserialize)] + pub(crate) struct TestContextCreds { + access_key_id: String, + secret_access_key: String, + token: Option, + } + + #[test] + fn test_parse() { + let req = test_request("post-header-key-case"); + assert_eq!(req.method, "POST"); + assert_eq!(req.uri, "https://example.amazonaws.com/"); + assert!(req.headers.is_empty()); + } + + #[test] + fn test_read_query_params() { + let req = test_request("get-header-value-trim"); + assert_eq!(req.method, "GET"); + assert_eq!(req.uri, "https://example.amazonaws.com/"); + assert!(!req.headers.is_empty()); + } +} + +fn read(path: &str) -> String { + println!("Loading `{}` for test case...", path); + let v = { + match std::fs::read_to_string(path) { + // This replacement is necessary for tests to pass on Windows, as reading the + // test snapshots from the file system results in CRLF line endings being inserted. + Ok(value) => value.replace("\r\n", "\n"), + Err(err) => { + panic!("failed to load test case `{}`: {}", path, err); + } + } + }; + + v.trim().to_string() } pub(crate) struct TestRequest { @@ -92,7 +270,7 @@ impl TestRequest { } impl> From> for TestRequest { - fn from(value: Request) -> Self { + fn from(value: http::Request) -> Self { let invalid = value .headers() .values() @@ -188,13 +366,3 @@ fn test_parse_headers() { ))) ); } - -#[test] -fn test_parse() { - test_request("post-header-key-case"); -} - -#[test] -fn test_read_query_params() { - test_request("get-vanilla-query-order-key-case"); -} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs b/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs index 7ea834a2523..a38fc276221 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs @@ -20,7 +20,7 @@ pub(super) fn normalize_uri_path(uri_path: &str) -> Cow<'_, str> { Cow::Owned(format!("/{uri_path}")) }; - if !result.contains('.') { + if !(result.contains('.') || result.contains("//")) { return result; } @@ -37,7 +37,8 @@ fn normalize_path_segment(uri_path: &str) -> String { for segment in uri_path.split('/') { match segment { - "." => {} + // Segments that are empty or contain only a single period should not be preserved + "" | "." => {} ".." => { normalized.pop(); } @@ -232,6 +233,15 @@ mod tests { ); } + // The CRT does this so I figured we should too. - Zelda + #[test] + fn normalize_uri_path_should_merge_multiple_subsequent_slashes_into_one() { + assert_eq!( + normalize_uri_path("//foo//"), + Cow::<'_, str>::Owned("/foo/".to_owned()) + ); + } + #[test] fn normalize_uri_path_should_not_remove_dot_when_surrounded_by_percent_encoded_forward_slashes() { diff --git a/aws/rust-runtime/aws-sigv4/src/lib.rs b/aws/rust-runtime/aws-sigv4/src/lib.rs index 4898311773e..5fe83a0bf51 100644 --- a/aws/rust-runtime/aws-sigv4/src/lib.rs +++ b/aws/rust-runtime/aws-sigv4/src/lib.rs @@ -15,9 +15,7 @@ unreachable_pub )] -use aws_credential_types::Credentials; -use aws_smithy_runtime_api::client::identity::Identity; -use std::time::SystemTime; +use std::fmt; pub mod sign; @@ -29,157 +27,21 @@ pub mod event_stream; #[cfg(feature = "sign-http")] pub mod http_request; -/// Parameters to use when signing. -// #[derive(Debug)] assumes that any data `Identity` holds is responsible for handling its own redaction. -#[derive(Debug)] +/// The version of the signing algorithm to use +#[derive(Debug, Eq, PartialEq, Copy, Clone)] #[non_exhaustive] -pub struct SigningParams<'a, S> { - pub(crate) identity: &'a Identity, - - /// Region to sign for. - pub(crate) region: &'a str, - /// Service Name to sign for. - /// - /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name. - pub(crate) name: &'a str, - /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). - pub(crate) time: SystemTime, - - /// Additional signing settings. These differ between HTTP and Event Stream. - pub(crate) settings: S, -} - -impl<'a, S> SigningParams<'a, S> { - /// Returns the signing region. - pub fn region(&self) -> &str { - self.region - } - - /// Returns the signing name. - pub fn name(&self) -> &str { - self.name - } - - /// If the identity in params contains AWS credentials, return them. Otherwise, return `None`. - pub(crate) fn credentials(&self) -> Option<&Credentials> { - self.identity.data::() - } +pub enum SignatureVersion { + /// The SigV4 signing algorithm. + V4, + /// The SigV4a signing algorithm. + V4a, } -impl<'a, S: Default> SigningParams<'a, S> { - /// Returns a builder that can create new `SigningParams`. - pub fn builder() -> signing_params::Builder<'a, S> { - Default::default() - } -} - -/// Builder and error for creating [`SigningParams`] -pub mod signing_params { - use super::{Identity, SigningParams}; - use std::error::Error; - use std::fmt; - use std::time::SystemTime; - - /// [`SigningParams`] builder error - #[derive(Debug)] - pub struct BuildError { - reason: &'static str, - } - impl BuildError { - fn new(reason: &'static str) -> Self { - Self { reason } - } - } - - impl fmt::Display for BuildError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.reason) - } - } - - impl Error for BuildError {} - - /// Builder that can create new [`SigningParams`] - #[derive(Debug, Default)] - pub struct Builder<'a, S> { - identity: Option<&'a Identity>, - region: Option<&'a str>, - name: Option<&'a str>, - time: Option, - settings: Option, - } - - impl<'a, S> Builder<'a, S> { - /// Sets the identity (required). - pub fn identity(mut self, identity: &'a Identity) -> Self { - self.identity = Some(identity); - self - } - /// Sets the identity (required) - pub fn set_identity(&mut self, identity: Option<&'a Identity>) { - self.identity = identity; - } - - /// Sets the region (required) - pub fn region(mut self, region: &'a str) -> Self { - self.region = Some(region); - self - } - /// Sets the region (required) - pub fn set_region(&mut self, region: Option<&'a str>) { - self.region = region; - } - - /// Sets the signing name (required) - pub fn name(mut self, name: &'a str) -> Self { - self.name = Some(name); - self - } - /// Sets the signing name (required) - pub fn set_name(&mut self, name: Option<&'a str>) { - self.name = name; - } - - /// Sets the time to be used in the signature (required) - pub fn time(mut self, time: SystemTime) -> Self { - self.time = Some(time); - self - } - /// Sets the time to be used in the signature (required) - pub fn set_time(&mut self, time: Option) { - self.time = time; - } - - /// Sets additional signing settings (required) - pub fn settings(mut self, settings: S) -> Self { - self.settings = Some(settings); - self - } - /// Sets additional signing settings (required) - pub fn set_settings(&mut self, settings: Option) { - self.settings = settings; - } - - /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if - /// a required argument was not given. - pub fn build(self) -> Result, BuildError> { - Ok(SigningParams { - identity: self - .identity - .ok_or_else(|| BuildError::new("an identity is required"))?, - region: self - .region - .ok_or_else(|| BuildError::new("region is required"))?, - name: self - .name - .ok_or_else(|| BuildError::new("name is required"))?, - time: self - .time - .ok_or_else(|| BuildError::new("time is required"))?, - settings: self - .settings - .ok_or_else(|| BuildError::new("settings are required"))?, - }) +impl fmt::Display for SignatureVersion { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + SignatureVersion::V4 => write!(f, "SigV4"), + SignatureVersion::V4a => write!(f, "SigV4a"), } } } diff --git a/aws/rust-runtime/aws-sigv4/src/sign.rs b/aws/rust-runtime/aws-sigv4/src/sign.rs index 43e9da1ac10..8f02ee57ad4 100644 --- a/aws/rust-runtime/aws-sigv4/src/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/sign.rs @@ -5,86 +5,9 @@ //! Functions to create signing keys and calculate signatures. -use crate::date_time::format_date; -use hmac::{digest::FixedOutput, Hmac, Mac}; -use sha2::{Digest, Sha256}; -use std::time::SystemTime; +/// Support for Sigv4 signing +pub mod v4; -/// HashedPayload = Lowercase(HexEncode(Hash(requestPayload))) -#[allow(dead_code)] // Unused when compiling without certain features -pub(crate) fn sha256_hex_string(bytes: impl AsRef<[u8]>) -> String { - let mut hasher = Sha256::new(); - hasher.update(bytes); - hex::encode(hasher.finalize_fixed()) -} - -/// Calculates a Sigv4 signature -pub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String { - let mut mac = Hmac::::new_from_slice(signing_key.as_ref()) - .expect("HMAC can take key of any size"); - mac.update(string_to_sign); - hex::encode(mac.finalize_fixed()) -} - -/// Generates a signing key for Sigv4 -pub fn generate_signing_key( - secret: &str, - time: SystemTime, - region: &str, - service: &str, -) -> impl AsRef<[u8]> { - // kSecret = your secret access key - // kDate = HMAC("AWS4" + kSecret, Date) - // kRegion = HMAC(kDate, Region) - // kService = HMAC(kRegion, Service) - // kSigning = HMAC(kService, "aws4_request") - - let secret = format!("AWS4{}", secret); - let mut mac = - Hmac::::new_from_slice(secret.as_ref()).expect("HMAC can take key of any size"); - mac.update(format_date(time).as_bytes()); - let tag = mac.finalize_fixed(); - - // sign region - let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); - mac.update(region.as_bytes()); - let tag = mac.finalize_fixed(); - - // sign service - let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); - mac.update(service.as_bytes()); - let tag = mac.finalize_fixed(); - - // sign request - let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); - mac.update("aws4_request".as_bytes()); - mac.finalize_fixed() -} - -#[cfg(test)] -mod tests { - use super::{calculate_signature, generate_signing_key}; - use crate::date_time::test_parsers::parse_date_time; - use crate::http_request::test::test_canonical_request; - use crate::sign::sha256_hex_string; - - #[test] - fn test_signature_calculation() { - let secret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"; - let creq = test_canonical_request("iam"); - let time = parse_date_time("20150830T123600Z").unwrap(); - - let derived_key = generate_signing_key(secret, time, "us-east-1", "iam"); - let signature = calculate_signature(derived_key, creq.as_bytes()); - - let expected = "5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7"; - assert_eq!(expected, &signature); - } - - #[test] - fn sign_payload_empty_string() { - let expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - let actual = sha256_hex_string([]); - assert_eq!(expected, actual); - } -} +/// Support for Sigv4a signing +#[cfg(feature = "sigv4a")] +pub mod v4a; diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4.rs new file mode 100644 index 00000000000..ee1d961e075 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4.rs @@ -0,0 +1,220 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::date_time::format_date; +use aws_smithy_runtime_api::client::identity::Identity; +use hmac::{digest::FixedOutput, Hmac, Mac}; +use sha2::{Digest, Sha256}; +use std::time::SystemTime; + +/// HashedPayload = Lowercase(HexEncode(Hash(requestPayload))) +#[allow(dead_code)] // Unused when compiling without certain features +pub(crate) fn sha256_hex_string(bytes: impl AsRef<[u8]>) -> String { + let mut hasher = Sha256::new(); + hasher.update(bytes); + hex::encode(hasher.finalize_fixed()) +} + +/// Calculates a Sigv4 signature +pub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String { + let mut mac = Hmac::::new_from_slice(signing_key.as_ref()) + .expect("HMAC can take key of any size"); + mac.update(string_to_sign); + hex::encode(mac.finalize_fixed()) +} + +/// Generates a signing key for Sigv4 +pub fn generate_signing_key( + secret: &str, + time: SystemTime, + region: &str, + service: &str, +) -> impl AsRef<[u8]> { + // kSecret = your secret access key + // kDate = HMAC("AWS4" + kSecret, Date) + // kRegion = HMAC(kDate, Region) + // kService = HMAC(kRegion, Service) + // kSigning = HMAC(kService, "aws4_request") + + let secret = format!("AWS4{}", secret); + let mut mac = + Hmac::::new_from_slice(secret.as_ref()).expect("HMAC can take key of any size"); + mac.update(format_date(time).as_bytes()); + let tag = mac.finalize_fixed(); + + // sign region + let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); + mac.update(region.as_bytes()); + let tag = mac.finalize_fixed(); + + // sign service + let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); + mac.update(service.as_bytes()); + let tag = mac.finalize_fixed(); + + // sign request + let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); + mac.update("aws4_request".as_bytes()); + mac.finalize_fixed() +} + +/// Parameters to use when signing. +#[derive(Debug)] +#[non_exhaustive] +pub struct SigningParams<'a, S> { + /// The identity to use when signing a request + pub(crate) identity: &'a Identity, + + /// Region to sign for. + pub(crate) region: &'a str, + /// Service Name to sign for. + /// + /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name. + pub(crate) name: &'a str, + /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). + pub(crate) time: SystemTime, + + /// Additional signing settings. These differ between HTTP and Event Stream. + pub(crate) settings: S, +} + +const HMAC_256: &str = "AWS4-HMAC-SHA256"; + +impl<'a, S> SigningParams<'a, S> { + /// Returns the region that will be used to sign SigV4 requests + pub fn region(&self) -> &str { + self.region + } + + /// Returns the signing name that will be used to sign requests + pub fn name(&self) -> &str { + self.name + } + + /// Return the name of the algorithm used to sign requests + pub fn algorithm(&self) -> &'static str { + HMAC_256 + } +} + +impl<'a, S: Default> SigningParams<'a, S> { + /// Returns a builder that can create new `SigningParams`. + pub fn builder() -> signing_params::Builder<'a, S> { + Default::default() + } +} + +/// Builder and error for creating [`SigningParams`] +pub mod signing_params { + use super::SigningParams; + use aws_smithy_runtime_api::builder_methods; + use aws_smithy_runtime_api::client::identity::Identity; + use std::error::Error; + use std::fmt; + use std::time::SystemTime; + + /// [`SigningParams`] builder error + #[derive(Debug)] + pub struct BuildError { + reason: &'static str, + } + impl BuildError { + fn new(reason: &'static str) -> Self { + Self { reason } + } + } + + impl fmt::Display for BuildError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.reason) + } + } + + impl Error for BuildError {} + + /// Builder that can create new [`SigningParams`] + #[derive(Debug, Default)] + pub struct Builder<'a, S> { + identity: Option<&'a Identity>, + region: Option<&'a str>, + name: Option<&'a str>, + time: Option, + settings: Option, + } + + impl<'a, S> Builder<'a, S> { + builder_methods!( + set_identity, + identity, + &'a Identity, + "Sets the identity (required)", + set_region, + region, + &'a str, + "Sets the region (required)", + set_name, + name, + &'a str, + "Sets the name (required)", + set_time, + time, + SystemTime, + "Sets the time to be used in the signature (required)", + set_settings, + settings, + S, + "Sets additional signing settings (required)" + ); + + /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if + /// a required argument was not given. + pub fn build(self) -> Result, BuildError> { + Ok(SigningParams { + identity: self + .identity + .ok_or_else(|| BuildError::new("identity is required"))?, + region: self + .region + .ok_or_else(|| BuildError::new("region is required"))?, + name: self + .name + .ok_or_else(|| BuildError::new("name is required"))?, + time: self + .time + .ok_or_else(|| BuildError::new("time is required"))?, + settings: self + .settings + .ok_or_else(|| BuildError::new("settings are required"))?, + }) + } + } +} + +#[cfg(test)] +mod tests { + use super::{calculate_signature, generate_signing_key, sha256_hex_string}; + use crate::date_time::test_parsers::parse_date_time; + use crate::http_request::test; + + #[test] + fn test_signature_calculation() { + let secret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"; + let creq = test::v4::test_canonical_request("iam"); + let time = parse_date_time("20150830T123600Z").unwrap(); + + let derived_key = generate_signing_key(secret, time, "us-east-1", "iam"); + let signature = calculate_signature(derived_key, creq.as_bytes()); + + let expected = "5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7"; + assert_eq!(expected, &signature); + } + + #[test] + fn sign_payload_empty_string() { + let expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + let actual = sha256_hex_string([]); + assert_eq!(expected, actual); + } +} diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs new file mode 100644 index 00000000000..9c2b8cb9802 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs @@ -0,0 +1,215 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::identity::Identity; +use bytes::{BufMut, BytesMut}; +use num_bigint::BigInt; +use once_cell::sync::Lazy; +use p256::ecdsa::signature::Signer; +use p256::ecdsa::{Signature, SigningKey}; +use std::io::Write; +use std::time::SystemTime; +use zeroize::Zeroizing; + +const ALGORITHM: &[u8] = b"AWS4-ECDSA-P256-SHA256"; +static BIG_N_MINUS_2: Lazy = Lazy::new(|| { + // The N value from section 3.2.1.3 of https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf + // Used as the N value for the algorithm described in section A.2.2 of https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + // *(Basically a prime number blessed by the NSA for use in p256)* + const ORDER: &[u32] = &[ + 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xBCE6FAAD, 0xA7179E84, 0xF3B9CAC2, + 0xFC632551, + ]; + let big_n = BigInt::from_slice(num_bigint::Sign::Plus, ORDER); + big_n - BigInt::from(2i32) +}); + +/// Calculates a Sigv4a signature +pub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String { + let signing_key = SigningKey::from_bytes(signing_key.as_ref()).unwrap(); + let signature: Signature = signing_key.sign(string_to_sign); + // This conversion sucks but we have to do it afaict. Because we also use + // the HMAC crate, we have to use a compatible (and therefore older) version + // of the p256 crate. That older version requires us to convert between + // signature types instead of using DER-encoded signatures directly. + let signature = signature.to_der(); + hex::encode(signature.as_ref()) +} + +/// Generates a signing key for Sigv4a signing. +pub fn generate_signing_key(access_key: &str, secret_access_key: &str) -> impl AsRef<[u8]> { + // Capacity is the secret access key length plus the length of "AWS4A" + let mut input_key = Zeroizing::new(Vec::with_capacity(secret_access_key.len() + 5)); + write!(input_key, "AWS4A{secret_access_key}").unwrap(); + + // Capacity is the access key length plus the counter byte + let mut kdf_context = Zeroizing::new(Vec::with_capacity(access_key.len() + 1)); + let mut counter = Zeroizing::new(1u8); + let key = loop { + write!(kdf_context, "{access_key}").unwrap(); + kdf_context.push(*counter); + + let mut fis = ALGORITHM.to_vec(); + fis.push(0); + fis.append(&mut kdf_context); + fis.put_i32(256); + + let key = ring::hmac::Key::new(ring::hmac::HMAC_SHA256, &input_key); + + let mut buf = BytesMut::new(); + buf.put_i32(1); + buf.put_slice(&fis); + let tag = ring::hmac::sign(&key, &buf); + let tag = &tag.as_ref()[0..32]; + + let k0 = BigInt::from_bytes_be(num_bigint::Sign::Plus, tag); + + // It would be more secure for this to be a constant time comparison, but because this + // is for client usage, that's not as big a deal. + if k0 <= *BIG_N_MINUS_2 { + let pk = k0 + BigInt::from(1i32); + let d = Zeroizing::new(pk.to_bytes_be().1); + break SigningKey::from_bytes(&d).unwrap(); + } + + *counter = counter + .checked_add(1) + .expect("counter will never get to 255"); + }; + + key.to_bytes() +} + +/// Parameters to use when signing. +#[derive(Debug)] +#[non_exhaustive] +pub struct SigningParams<'a, S> { + /// The identity to use when signing a request + pub(crate) identity: &'a Identity, + + /// Region set to sign for. + pub(crate) region_set: &'a str, + /// Service Name to sign for. + /// + /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name. + pub(crate) name: &'a str, + /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). + pub(crate) time: SystemTime, + + /// Additional signing settings. These differ between HTTP and Event Stream. + pub(crate) settings: S, +} + +pub(crate) const ECDSA_256: &str = "AWS4-ECDSA-P256-SHA256"; + +impl<'a, S> SigningParams<'a, S> { + /// Returns the region that will be used to sign SigV4a requests + pub fn region_set(&self) -> &str { + self.region_set + } + + /// Returns the service name that will be used to sign requests + pub fn name(&self) -> &str { + self.name + } + + /// Return the name of the algorithm used to sign requests + pub fn algorithm(&self) -> &'static str { + ECDSA_256 + } +} + +impl<'a, S: Default> SigningParams<'a, S> { + /// Returns a builder that can create new `SigningParams`. + pub fn builder() -> signing_params::Builder<'a, S> { + Default::default() + } +} + +/// Builder and error for creating [`SigningParams`] +pub mod signing_params { + use super::SigningParams; + use aws_smithy_runtime_api::builder_methods; + use aws_smithy_runtime_api::client::identity::Identity; + use std::error::Error; + use std::fmt; + use std::time::SystemTime; + + /// [`SigningParams`] builder error + #[derive(Debug)] + pub struct BuildError { + reason: &'static str, + } + impl BuildError { + fn new(reason: &'static str) -> Self { + Self { reason } + } + } + + impl fmt::Display for BuildError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.reason) + } + } + + impl Error for BuildError {} + + /// Builder that can create new [`SigningParams`] + #[derive(Debug, Default)] + pub struct Builder<'a, S> { + identity: Option<&'a Identity>, + region_set: Option<&'a str>, + name: Option<&'a str>, + time: Option, + settings: Option, + } + + impl<'a, S> Builder<'a, S> { + builder_methods!( + set_identity, + identity, + &'a Identity, + "Sets the identity (required)", + set_region_set, + region_set, + &'a str, + "Sets the region set (required)", + set_name, + name, + &'a str, + "Sets the name (required)", + set_time, + time, + SystemTime, + "Sets the time to be used in the signature (required)", + set_settings, + settings, + S, + "Sets additional signing settings (required)" + ); + + /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if + /// a required argument was not given. + pub fn build(self) -> Result, BuildError> { + Ok(SigningParams { + identity: self + .identity + .ok_or_else(|| BuildError::new("identity is required"))?, + region_set: self + .region_set + .ok_or_else(|| BuildError::new("region_set is required"))?, + name: self + .name + .ok_or_else(|| BuildError::new("name is required"))?, + time: self + .time + .ok_or_else(|| BuildError::new("time is required"))?, + settings: self + .settings + .ok_or_else(|| BuildError::new("settings are required"))?, + }) + } + } +} diff --git a/aws/rust-runtime/aws-types/src/region.rs b/aws/rust-runtime/aws-types/src/region.rs index a58f809a704..1fe3ad29c28 100644 --- a/aws/rust-runtime/aws-types/src/region.rs +++ b/aws/rust-runtime/aws-types/src/region.rs @@ -86,3 +86,50 @@ impl SigningRegion { impl Storable for SigningRegion { type Storer = StoreReplace; } + +// The region set to use when signing Sigv4a requests +/// +/// Generally, user code will not need to interact with `SigningRegionSet`. See `[Region](crate::Region)`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SigningRegionSet(Cow<'static, str>); + +impl From for SigningRegionSet { + fn from(inp: Region) -> Self { + SigningRegionSet(inp.0) + } +} + +impl From<&'static str> for SigningRegionSet { + fn from(region: &'static str) -> Self { + SigningRegionSet(Cow::Borrowed(region)) + } +} + +impl<'a> FromIterator<&'a str> for SigningRegionSet { + fn from_iter>(iter: T) -> Self { + let mut s = String::new(); + let mut iter = iter.into_iter(); + + if let Some(region) = iter.next() { + s.push_str(region); + } + + // If more than one region is present in the iter, separate remaining regions with commas + for region in iter { + s.push(','); + s.push_str(region); + } + + SigningRegionSet(Cow::Owned(s)) + } +} + +impl Storable for SigningRegionSet { + type Storer = StoreReplace; +} + +impl AsRef for SigningRegionSet { + fn as_ref(&self) -> &str { + self.0.as_ref() + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 760d93ee116..e62773aa9a8 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -9,11 +9,13 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -68,8 +70,10 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus private val codegenScope = arrayOf( *preludeScope, "Credentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials"), - "ProvideCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("provider::ProvideCredentials"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("provider::SharedCredentialsProvider"), + "ProvideCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::ProvideCredentials"), + "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::SharedCredentialsProvider"), "TestCredentials" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig).resolve("Credentials"), ) @@ -110,7 +114,7 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus } class CredentialsIdentityResolverRegistration( - codegenContext: ClientCodegenContext, + private val codegenContext: ClientCodegenContext, ) : ServiceRuntimePluginCustomization() { private val runtimeConfig = codegenContext.runtimeConfig @@ -118,24 +122,39 @@ class CredentialsIdentityResolverRegistration( when (section) { is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { rustBlockTemplate("if let Some(credentials_cache) = ${section.serviceConfigName}.credentials_cache()") { + val codegenScope = arrayOf( + "CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("identity::credentials::CredentialsIdentityResolver"), + "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::identity::SharedIdentityResolver"), + "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4a::SCHEME_ID"), + "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4::SCHEME_ID"), + ) + + rustTemplate( + """ + let shared_identity_resolver = #{SharedIdentityResolver}::new( + #{CredentialsIdentityResolver}::new(credentials_cache) + ); + """, + *codegenScope, + ) + + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + section.registerIdentityResolver(this) { + rustTemplate("#{SIGV4A_SCHEME_ID}, shared_identity_resolver.clone()", *codegenScope) + } + } + } section.registerIdentityResolver(this) { - rustTemplate( - """ - #{SIGV4_SCHEME_ID}, - #{SharedIdentityResolver}::new( - #{CredentialsIdentityResolver}::new(credentials_cache), - ), - """, - "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - "CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("identity::credentials::CredentialsIdentityResolver"), - "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::identity::SharedIdentityResolver"), - ) + rustTemplate("#{SIGV4_SCHEME_ID}, shared_identity_resolver,", *codegenScope) } } } + else -> {} } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index f3277d06d3e..7ad1e412467 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -105,6 +105,7 @@ class SdkConfigDecorator : ClientCodegenDecorator { val codegenScope = arrayOf( "SdkConfig" to AwsRuntimeType.awsTypes(codegenContext.runtimeConfig).resolve("sdk_config::SdkConfig"), ) + rustCrate.withModule(ClientRustModule.config) { rustTemplate( """ diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 90b6fd3ce57..bdf9863fcc5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -14,18 +14,22 @@ import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig +import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations @@ -41,18 +45,21 @@ class SigV4AuthDecorator : ClientCodegenDecorator { operationShape: OperationShape, baseAuthSchemeOptions: List, ): List = baseAuthSchemeOptions + AuthSchemeOption.StaticAuthSchemeOption(SigV4Trait.ID) { - rustTemplate( - "#{scheme_id},", - "scheme_id" to AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - ) + val awsRuntimeAuthModule = AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig).resolve("auth") + rust("#T,", awsRuntimeAuthModule.resolve("sigv4::SCHEME_ID")) + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + rust("#T", awsRuntimeAuthModule.resolve("sigv4a::SCHEME_ID")) + } + rust(",") + } } override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations + AuthServiceRuntimePluginCustomization(codegenContext) + baseCustomizations + listOf(AuthServiceRuntimePluginCustomization(codegenContext)) override fun operationCustomizations( codegenContext: ClientCodegenContext, @@ -65,6 +72,13 @@ class SigV4AuthDecorator : ClientCodegenDecorator { baseCustomizations: List, ): List = baseCustomizations + SigV4SigningConfig(codegenContext.runtimeConfig, codegenContext.serviceShape.getTrait()) + + override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + // Add optional feature for SigV4a support + rustCrate.mergeFeature(Feature("sigv4a", true, listOf("aws-runtime/sigv4a"))) + } + } } private class SigV4SigningConfig( @@ -117,6 +131,7 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( "SigV4AuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4AuthScheme"), + "SigV4aAuthScheme" to awsRuntime.resolve("auth::sigv4a::SigV4aAuthScheme"), "SharedAuthScheme" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::auth::SharedAuthScheme"), ) } @@ -127,11 +142,21 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: val serviceHasEventStream = codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model) if (serviceHasEventStream) { // enable the aws-runtime `sign-eventstream` feature - addDependency(AwsCargoDependency.awsRuntime(runtimeConfig).withFeature("event-stream").toType().toSymbol()) + addDependency( + AwsCargoDependency.awsRuntime(runtimeConfig).withFeature("event-stream").toType().toSymbol(), + ) } section.registerAuthScheme(this) { rustTemplate("#{SharedAuthScheme}::new(#{SigV4AuthScheme}::new())", *codegenScope) } + + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + section.registerAuthScheme(this) { + rustTemplate("#{SharedAuthScheme}::new(#{SigV4aAuthScheme}::new())", *codegenScope) + } + } + } } else -> {} @@ -139,18 +164,18 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: } } -private fun needsAmzSha256(service: ServiceShape) = when (service.id) { +fun needsAmzSha256(service: ServiceShape) = when (service.id) { ShapeId.from("com.amazonaws.s3#AmazonS3") -> true ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820") -> true else -> false } -private fun disableDoubleEncode(service: ServiceShape) = when (service.id) { +fun disableDoubleEncode(service: ServiceShape) = when (service.id) { ShapeId.from("com.amazonaws.s3#AmazonS3") -> true else -> false } -private fun disableUriPathNormalization(service: ServiceShape) = when (service.id) { +fun disableUriPathNormalization(service: ServiceShape) = when (service.id) { ShapeId.from("com.amazonaws.s3#AmazonS3") -> true else -> false } @@ -160,8 +185,8 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg private val codegenScope by lazy { val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( - "SigV4OperationSigningConfig" to awsRuntime.resolve("auth::sigv4::SigV4OperationSigningConfig"), - "SigningOptions" to awsRuntime.resolve("auth::sigv4::SigningOptions"), + "SigV4OperationSigningConfig" to awsRuntime.resolve("auth::SigV4OperationSigningConfig"), + "SigningOptions" to awsRuntime.resolve("auth::SigningOptions"), "SignableBody" to AwsRuntimeType.awsSigv4(runtimeConfig).resolve("http_request::SignableBody"), "Default" to RuntimeType.Default, ) @@ -171,7 +196,8 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg override fun section(section: OperationSection): Writable = writable { when (section) { is OperationSection.AdditionalRuntimePluginConfig -> { - val authSchemes = serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, section.operationShape) + val authSchemes = + serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, section.operationShape) if (authSchemes.containsKey(SigV4Trait.ID)) { val unsignedPayload = section.operationShape.hasTrait() val doubleUriEncode = unsignedPayload || !disableDoubleEncode(codegenContext.serviceShape) @@ -179,7 +205,6 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg val normalizeUrlPath = !disableUriPathNormalization(codegenContext.serviceShape) rustTemplate( """ - // SigningOptions is non-exhaustive, so it can't be created with a struct expression. let mut signing_options = #{SigningOptions}::default(); signing_options.double_uri_encode = $doubleUriEncode; signing_options.content_sha256_header = $contentSha256Header; diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index ff42af1960f..b0ec8aac317 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -129,9 +129,6 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: fun generateInput(testOperationInput: EndpointTestOperationInput) = writable { val operationName = testOperationInput.operationName.toSnakeCase() - if (test.isSigV4a()) { - Attribute.shouldPanic("no request was received").render(this) - } tokioTest(safeName("operation_input_test_$operationName")) { rustTemplate( """ diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index faa113341a9..4277650a84b 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -6,7 +6,6 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.model.Model -import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings @@ -60,7 +59,7 @@ fun awsSdkIntegrationTest( "codegen", ObjectNode.builder() .withMember("includeFluentClient", false) - .withMember("includeEndpointUrlConfig", BooleanNode.from(false)) + .withMember("includeEndpointUrlConfig", false) .build(), ).build(), ), diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index 75e810e0bd3..7a76b24087e 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -64,22 +64,34 @@ async fn dual_stack() { #[tokio::test] async fn multi_region_access_points() { - let (_captured_request, client) = test_client(|b| b); - let response = client + let (captured_request, client) = test_client(|b| b); + let _ = client .get_object() .bucket("arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap") .key("blah") + .customize() + .await + .unwrap() + .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) + .user_agent_for_tests() .send() .await; - let error = response.expect_err("should fail—sigv4a is not supported"); + let captured_request = captured_request.expect_request(); + assert_eq!( + captured_request.uri().to_string(), + "https://mfzwi23gnjvgw.mrap.accesspoint.s3-global.amazonaws.com/blah?x-id=GetObject" + ); + let auth_header = captured_request.headers().get("AUTHORIZATION").unwrap(); + let auth_header = auth_header.to_str().unwrap(); + // Verifies that the sigv4a signing algorithm was used, that the signing scope doesn't include a region, and that the x-amz-region-set header was signed. + let expected_start = + "AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20210618/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature="; + assert!( - dbg!(format!( - "{}", - aws_smithy_types::error::display::DisplayErrorContext(&error) - )) - .contains("selected auth scheme / endpoint config mismatch"), - "message should contain the correct error, found: {:?}", - error + auth_header.starts_with(expected_start), + "expected auth header to start with {} but it was {}", + expected_start, + auth_header ); } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt index bed14f40aeb..c6b5ad282c5 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt @@ -6,10 +6,18 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.rulesengine.language.Endpoint +import software.amazon.smithy.rulesengine.language.EndpointRuleSet import software.amazon.smithy.rulesengine.language.syntax.Identifier +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType +import software.amazon.smithy.rulesengine.language.syntax.rule.Rule +import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor import software.amazon.smithy.rulesengine.traits.ContextParamTrait +import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency @@ -21,7 +29,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.smithy.unsafeToRustName +import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.rust.codegen.core.util.orNull data class Context(val functionRegistry: FunctionRegistry, val runtimeConfig: RuntimeConfig) @@ -65,7 +75,7 @@ fun Parameter.memberName(): String { fun ContextParamTrait.memberName(): String = this.name.unsafeToRustName() /** - * Returns the symbol for a given parameter. This enables [RustWriter] to generate the correct [RustType]. + * Returns the symbol for a given parameter. This enables [software.amazon.smithy.rust.codegen.core.rustlang.RustWriter] to generate the correct [RustType]. */ fun Parameter.symbol(): Symbol { val rustType = when (this.type) { @@ -76,3 +86,38 @@ fun Parameter.symbol(): Symbol { // Parameter return types are always optional return Symbol.builder().rustType(rustType).build().letIf(!this.isRequired) { it.makeOptional() } } + +/** + * A class for fetching the set of auth schemes supported by an `EndpointRuleSet`. + */ +class AuthSchemeLister : RuleValueVisitor> { + companion object { + fun authSchemesForRuleset(endpointRuleSet: EndpointRuleSet): Set { + return AuthSchemeLister().visitTreeRule(endpointRuleSet.rules) + } + } + + override fun visitEndpointRule(endpoint: Endpoint): Set { + return endpoint.properties.getOrDefault(Identifier.of("authSchemes"), Literal.tupleLiteral(listOf())).asTupleLiteral() + .orNull()?.let { + it.map { authScheme -> + authScheme.asRecordLiteral().get()[Identifier.of("name")]!!.asStringLiteral().get().expectLiteral() + } + }?.toHashSet() ?: hashSetOf() + } + + override fun visitTreeRule(rules: MutableList): Set { + return rules.map { it.accept(this) }.reduce { a, b -> a.union(b) } + } + + override fun visitErrorRule(error: Expression?): Set { + return setOf() + } +} + +/** + * Returns a service's supported auth schemes + */ +fun ServiceShape.supportedAuthSchemes(): Set = + this.getTrait()?.ruleSet?.let { EndpointRuleSet.fromNode(it) }?.also { it.typeCheck() } + ?.let { AuthSchemeLister.authSchemesForRuleset(it) } ?: setOf() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index d76f083eef7..fc011307b28 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -133,10 +133,6 @@ class OperationRuntimePluginGenerator( if (authSchemeOptions.any { it is AuthSchemeOption.CustomResolver }) { throw IllegalStateException("AuthSchemeOption.CustomResolver is unimplemented") } else { - val authOptionsMap = authSchemeOptions.associate { - val option = it as AuthSchemeOption.StaticAuthSchemeOption - option.schemeShapeId to option - } withBlockTemplate( """ .with_auth_scheme_option_resolver(#{Some}( @@ -149,10 +145,19 @@ class OperationRuntimePluginGenerator( var noSupportedAuthSchemes = true val authSchemes = ServiceIndex.of(codegenContext.model) .getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) + for (schemeShapeId in authSchemes.keys) { - val authOption = authOptionsMap[schemeShapeId] - if (authOption != null) { - authOption.constructor(this) + val optionsForScheme = authSchemeOptions.filter { + when (it) { + is AuthSchemeOption.CustomResolver -> false + is AuthSchemeOption.StaticAuthSchemeOption -> { + it.schemeShapeId == schemeShapeId + } + } + } + + if (optionsForScheme.isNotEmpty()) { + optionsForScheme.forEach { (it as AuthSchemeOption.StaticAuthSchemeOption).constructor(this) } noSupportedAuthSchemes = false } else { logger.warning( @@ -162,9 +167,11 @@ class OperationRuntimePluginGenerator( } } if (operationShape.hasTrait() || noSupportedAuthSchemes) { - val authOption = authOptionsMap[noAuthSchemeShapeId] + val authOption = authSchemeOptions.find { + it is AuthSchemeOption.StaticAuthSchemeOption && it.schemeShapeId == noAuthSchemeShapeId + } ?: throw IllegalStateException("Missing 'no auth' implementation. This is a codegen bug.") - authOption.constructor(this) + (authOption as AuthSchemeOption.StaticAuthSchemeOption).constructor(this) } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 1ada2d199c3..a3d5d568d8b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -568,6 +568,9 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { fun not(vararg attrMacros: Writable): Writable = macroWithArgs("not", *attrMacros) fun feature(feature: String) = writable("feature = ${feature.dq()}") + fun featureGate(featureName: String): Attribute { + return Attribute(cfg(feature(featureName))) + } fun deprecated(since: String? = null, note: String? = null): Writable { val optionalFields = mutableListOf() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt index dd17595c5f1..d9b54d35b05 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.orNull @@ -440,6 +441,13 @@ fun RustWriter.implBlock(symbol: Symbol, block: Writable) { } } +/** Write a `#[cfg(feature = "...")]` block for the given feature */ +fun RustWriter.featureGateBlock(feature: String, block: Writable) { + rustBlock("##[cfg(feature = ${feature.dq()})]") { + block() + } +} + /** * Write _exactly_ the text as written into the code writer without newlines or formatting */ diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index ae177809791..bbc6001aafd 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -24,26 +24,6 @@ use tracing::trace; enum AuthOrchestrationError { NoMatchingAuthScheme, BadAuthSchemeEndpointConfig(Cow<'static, str>), - AuthSchemeEndpointConfigMismatch(String), -} - -impl AuthOrchestrationError { - fn auth_scheme_endpoint_config_mismatch<'a>( - auth_schemes: impl Iterator, - ) -> Self { - Self::AuthSchemeEndpointConfigMismatch( - auth_schemes - .flat_map(|s| match s { - Document::Object(map) => match map.get("name") { - Some(Document::String(name)) => Some(name.as_str()), - _ => None, - }, - _ => None, - }) - .collect::>() - .join(", "), - ) - } } impl fmt::Display for AuthOrchestrationError { @@ -53,13 +33,6 @@ impl fmt::Display for AuthOrchestrationError { "no auth scheme matched auth scheme options. This is a bug. Please file an issue.", ), Self::BadAuthSchemeEndpointConfig(message) => f.write_str(message), - Self::AuthSchemeEndpointConfigMismatch(supported_schemes) => { - write!(f, - "selected auth scheme / endpoint config mismatch. Couldn't find `sigv4` endpoint config for this endpoint. \ - The authentication schemes supported by this endpoint are: {:?}", - supported_schemes - ) - } } } } @@ -76,6 +49,9 @@ pub(super) async fn orchestrate_auth( .expect("auth scheme option resolver params must be set"); let option_resolver = runtime_components.auth_scheme_option_resolver(); let options = option_resolver.resolve_auth_scheme_options(params)?; + let endpoint = cfg + .load::() + .expect("endpoint added to config bag by endpoint orchestrator"); trace!( auth_scheme_option_resolver_params = ?params, @@ -83,8 +59,11 @@ pub(super) async fn orchestrate_auth( "orchestrating auth", ); + // Iterate over IDs of possibly-supported auth schemes for &scheme_id in options.as_ref() { + // For each ID, try to resolve the corresponding auth scheme. if let Some(auth_scheme) = runtime_components.auth_scheme(scheme_id) { + // Use the resolved auth scheme to resolve an identity if let Some(identity_resolver) = auth_scheme.identity_resolver(runtime_components) { let signer = auth_scheme.signer(); trace!( @@ -94,26 +73,29 @@ pub(super) async fn orchestrate_auth( "resolved auth scheme, identity resolver, and signing implementation" ); - let endpoint = cfg - .load::() - .expect("endpoint added to config bag by endpoint orchestrator"); - let auth_scheme_endpoint_config = - extract_endpoint_auth_scheme_config(endpoint, scheme_id)?; - trace!(auth_scheme_endpoint_config = ?auth_scheme_endpoint_config, "extracted auth scheme endpoint config"); - - let identity = identity_resolver.resolve_identity(cfg).await?; - trace!(identity = ?identity, "resolved identity"); - - trace!("signing request"); - let request = ctx.request_mut().expect("set during serialization"); - signer.sign_http_request( - request, - &identity, - auth_scheme_endpoint_config, - runtime_components, - cfg, - )?; - return Ok(()); + match extract_endpoint_auth_scheme_config(endpoint, scheme_id) { + Ok(auth_scheme_endpoint_config) => { + trace!(auth_scheme_endpoint_config = ?auth_scheme_endpoint_config, "extracted auth scheme endpoint config"); + + let identity = identity_resolver.resolve_identity(cfg).await?; + trace!(identity = ?identity, "resolved identity"); + + trace!("signing request"); + let request = ctx.request_mut().expect("set during serialization"); + signer.sign_http_request( + request, + &identity, + auth_scheme_endpoint_config, + runtime_components, + cfg, + )?; + return Ok(()); + } + Err(AuthOrchestrationError::NoMatchingAuthScheme) => { + continue; + } + Err(other_err) => return Err(other_err.into()), + } } } } @@ -149,9 +131,7 @@ fn extract_endpoint_auth_scheme_config( .and_then(Document::as_string); config_scheme_id == Some(scheme_id.as_str()) }) - .ok_or_else(|| { - AuthOrchestrationError::auth_scheme_endpoint_config_mismatch(auth_schemes.iter()) - })?; + .ok_or(AuthOrchestrationError::NoMatchingAuthScheme)?; Ok(AuthSchemeEndpointConfig::from(Some(auth_scheme_config))) } diff --git a/rust-runtime/aws-smithy-types/README.md b/rust-runtime/aws-smithy-types/README.md index ba9dcecc177..f38b39d2f08 100644 --- a/rust-runtime/aws-smithy-types/README.md +++ b/rust-runtime/aws-smithy-types/README.md @@ -1,6 +1,6 @@ # Fundamental Types for Smithy Services -This crate implements fundmental types shared across all service clients generated +This crate implements fundamental types shared across all service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs). Generally, you should not need to take a direct dependency on this crate as service clients should publicly re-export the types when used. From 33cd698f7f21255ad3327c89e0d1f883554559f3 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 28 Sep 2023 14:47:05 -0500 Subject: [PATCH 141/331] Remove `futures_core::stream::Stream` from `aws_smithy_http::byte_stream::ByteStream` (#2983) ## Motivation and Context Removes `futures_core::stream::Stream` from `aws_smithy_http::byte_stream::ByteStream` ## Description This PR is part of our ongoing effort, https://github.com/awslabs/smithy-rs/issues/2413. We remove the `futures_core::stream::Stream` trait from `aws_smithy_http::byte_stream::ByteStream`. To continue support existing places that relied upon `ByteStream` implementing the `Stream` trait, we provide explicit `.next`, `.try_next`, and `.size_hints` methods on that type. As part of it, a doc-hidden type `FuturesStreamCompatByteStream`, which implements `Stream`, has been added to `aws_smithy_http` to cater to those who need a type implementing `Stream` (see [discussion](https://github.com/awslabs/smithy-rs/pull/2910#discussion_r1317112233) why doc-hidden). Another place we need to update is codegen responsible for rendering stream payload serializer, and this affects the server. The regular server and the python server have slightly different rendering requirements, since the former uses `aws_smithy_http::byte_stream::ByteStream` (that does _not_ implement the `Stream` trait) and latter uses its own [ByteStream](https://github.com/awslabs/smithy-rs/blob/cb79a68e3c38d1e62d3980d5e7baedc1144bacc7/rust-runtime/aws-smithy-http-server-python/src/types.rs#L343) (that does implement `Stream`). We use `ServerHttpBoundProtocolCustomization` to handle the difference: `StreamPayloadSerializerCustomization` and `PythonServerStreamPayloadSerializerCustomization`. ## Testing No new behavior has been added, relied on the existing tests in CI. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 ++ .../aws-inlineable/src/glacier_checksums.rs | 1 - .../rust/codegen/core/smithy/RuntimeType.kt | 3 +- .../protocols/PythonServerProtocolLoader.kt | 21 ++++ .../ServerHttpBoundProtocolGenerator.kt | 32 +++++- .../smithy/protocols/ServerProtocolLoader.kt | 55 ++++++++- .../smithy/protocols/ServerRestXmlFactory.kt | 10 +- .../src/types.rs | 1 - .../aws-smithy-http/src/byte_stream.rs | 108 ++++++++++-------- .../src/futures_stream_adapter.rs | 61 ++++++++++ rust-runtime/aws-smithy-http/src/lib.rs | 6 + 11 files changed, 254 insertions(+), 56 deletions(-) create mode 100644 rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index aa612327bda..07e4f95af07 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -229,3 +229,15 @@ message = "Add support for Sigv4A request signing. Sigv4a signing will be used a references = ["smithy-rs#1797"] meta = { "breaking" = true, "tada" = true, "bug" = false } author = "Velfi" + +[[aws-sdk-rust]] +message = "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner." +references = ["smithy-rs#2983"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "ysaito1001" + +[[smithy-rs]] +message = "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner." +references = ["smithy-rs#2983"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs b/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs index 18f1d9219eb..bf95910e006 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs @@ -14,7 +14,6 @@ use bytes::Buf; use bytes_utils::SegmentedBuf; use http::header::HeaderName; use ring::digest::{Context, Digest, SHA256}; -use tokio_stream::StreamExt; const TREE_HASH_HEADER: &str = "x-amz-sha256-tree-hash"; const X_AMZ_CONTENT_SHA256: &str = "x-amz-content-sha256"; diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index c58596ad945..f7e463b0a7d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -407,9 +407,10 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun retryErrorKind(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("retry::ErrorKind") fun eventStreamReceiver(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::Receiver") - fun eventStreamSender(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::EventStreamSender") + fun futuresStreamCompatByteStream(runtimeConfig: RuntimeConfig): RuntimeType = + smithyHttp(runtimeConfig).resolve("futures_stream_adapter::FuturesStreamCompatByteStream") fun errorMetadata(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::ErrorMetadata") fun errorMetadataBuilder(runtimeConfig: RuntimeConfig) = diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt index f84d35e7cb7..dbfa9e029dc 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt @@ -61,6 +61,7 @@ class PythonServerAfterDeserializedMemberServerHttpBoundCustomization() : is ServerHttpBoundProtocolSection.AfterTimestampDeserializedMember -> writable { rust(".into()") } + else -> emptySection } } @@ -78,6 +79,23 @@ class PythonServerAfterDeserializedMemberHttpBindingCustomization(private val ru } } +/** + * Customization class used to determine how serialized stream payload should be rendered for the Python server. + * + * In this customization, we do not need to wrap the payload in a new-type wrapper to enable the + * `futures_core::stream::Stream` trait since the payload in question has a type + * `aws_smithy_http_server_python::types::ByteStream` which already implements the `Stream` trait. + */ +class PythonServerStreamPayloadSerializerCustomization() : ServerHttpBoundProtocolCustomization() { + override fun section(section: ServerHttpBoundProtocolSection): Writable = when (section) { + is ServerHttpBoundProtocolSection.WrapStreamPayload -> writable { + section.params.payloadGenerator.generatePayload(this, section.params.shapeName, section.params.shape) + } + + else -> emptySection + } +} + class PythonServerProtocolLoader( private val supportedProtocols: ProtocolMap, ) : ProtocolLoader(supportedProtocols) { @@ -91,6 +109,7 @@ class PythonServerProtocolLoader( ), additionalServerHttpBoundProtocolCustomizations = listOf( PythonServerAfterDeserializedMemberServerHttpBoundCustomization(), + PythonServerStreamPayloadSerializerCustomization(), ), additionalHttpBindingCustomizations = listOf( PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig), @@ -103,6 +122,7 @@ class PythonServerProtocolLoader( ), additionalServerHttpBoundProtocolCustomizations = listOf( PythonServerAfterDeserializedMemberServerHttpBoundCustomization(), + PythonServerStreamPayloadSerializerCustomization(), ), additionalHttpBindingCustomizations = listOf( PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig), @@ -115,6 +135,7 @@ class PythonServerProtocolLoader( ), additionalServerHttpBoundProtocolCustomizations = listOf( PythonServerAfterDeserializedMemberServerHttpBoundCustomization(), + PythonServerStreamPayloadSerializerCustomization(), ), additionalHttpBindingCustomizations = listOf( PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig), diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt index c579d644159..11a9a9558ba 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt @@ -81,11 +81,28 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.Ser import software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderSymbol import java.util.logging.Logger +data class StreamPayloadSerializerParams( + val codegenContext: ServerCodegenContext, + val payloadGenerator: ServerHttpBoundProtocolPayloadGenerator, + val shapeName: String, + val shape: OperationShape, +) + /** * Class describing a ServerHttpBoundProtocol section that can be used in a customization. */ sealed class ServerHttpBoundProtocolSection(name: String) : Section(name) { data class AfterTimestampDeserializedMember(val shape: MemberShape) : ServerHttpBoundProtocolSection("AfterTimestampDeserializedMember") + + /** + * Represent a section for rendering the serialized stream payload. + * + * If the payload does not implement the `futures_core::stream::Stream`, which is the case for + * `aws_smithy_http::byte_stream::ByteStream`, the section needs to be overridden and renders a new-type wrapper + * around the payload to enable the `Stream` trait. + */ + data class WrapStreamPayload(val params: StreamPayloadSerializerParams) : + ServerHttpBoundProtocolSection("WrapStreamPayload") } /** @@ -540,7 +557,18 @@ class ServerHttpBoundProtocolTraitImplGenerator( operationShape.outputShape(model).findStreamingMember(model)?.let { val payloadGenerator = ServerHttpBoundProtocolPayloadGenerator(codegenContext, protocol) withBlockTemplate("let body = #{SmithyHttpServer}::body::boxed(#{SmithyHttpServer}::body::Body::wrap_stream(", "));", *codegenScope) { - payloadGenerator.generatePayload(this, "output", operationShape) + for (customization in customizations) { + customization.section( + ServerHttpBoundProtocolSection.WrapStreamPayload( + StreamPayloadSerializerParams( + codegenContext, + payloadGenerator, + "output", + operationShape, + ), + ), + )(this) + } } } ?: run { val payloadGenerator = ServerHttpBoundProtocolPayloadGenerator(codegenContext, protocol) @@ -707,7 +735,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( rustTemplate( """ #{SmithyHttpServer}::protocol::content_type_header_classifier( - &parts.headers, + &parts.headers, Some("$expectedRequestContentType"), )?; input = #{parser}(bytes.as_ref(), input)?; diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt index e52d9e3a3bc..92dde3b2f6d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt @@ -9,21 +9,68 @@ import software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait import software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait import software.amazon.smithy.aws.traits.protocols.RestJson1Trait import software.amazon.smithy.aws.traits.protocols.RestXmlTrait +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolLoader import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap +import software.amazon.smithy.rust.codegen.core.util.isOutputEventStream import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator +class StreamPayloadSerializerCustomization() : ServerHttpBoundProtocolCustomization() { + override fun section(section: ServerHttpBoundProtocolSection): Writable = when (section) { + is ServerHttpBoundProtocolSection.WrapStreamPayload -> writable { + if (section.params.shape.isOutputEventStream(section.params.codegenContext.model)) { + // Event stream payload, of type `aws_smithy_http::event_stream::MessageStreamAdapter`, already + // implements the `Stream` trait, so no need to wrap it in the new-type. + section.params.payloadGenerator.generatePayload(this, section.params.shapeName, section.params.shape) + } else { + // Otherwise, the stream payload is `aws_smithy_http::byte_stream::ByteStream`. We wrap it in the + // new-type to enable the `Stream` trait. + withBlockTemplate( + "#{FuturesStreamCompatByteStream}::new(", + ")", + "FuturesStreamCompatByteStream" to RuntimeType.futuresStreamCompatByteStream(section.params.codegenContext.runtimeConfig), + ) { + section.params.payloadGenerator.generatePayload( + this, + section.params.shapeName, + section.params.shape, + ) + } + } + } + + else -> emptySection + } +} + class ServerProtocolLoader(supportedProtocols: ProtocolMap) : ProtocolLoader(supportedProtocols) { companion object { val DefaultProtocols = mapOf( - RestJson1Trait.ID to ServerRestJsonFactory(), - RestXmlTrait.ID to ServerRestXmlFactory(), - AwsJson1_0Trait.ID to ServerAwsJsonFactory(AwsJsonVersion.Json10), - AwsJson1_1Trait.ID to ServerAwsJsonFactory(AwsJsonVersion.Json11), + RestJson1Trait.ID to ServerRestJsonFactory( + additionalServerHttpBoundProtocolCustomizations = listOf( + StreamPayloadSerializerCustomization(), + ), + ), + RestXmlTrait.ID to ServerRestXmlFactory( + additionalServerHttpBoundProtocolCustomizations = listOf( + StreamPayloadSerializerCustomization(), + ), + ), + AwsJson1_0Trait.ID to ServerAwsJsonFactory( + AwsJsonVersion.Json10, + additionalServerHttpBoundProtocolCustomizations = listOf(StreamPayloadSerializerCustomization()), + ), + AwsJson1_1Trait.ID to ServerAwsJsonFactory( + AwsJsonVersion.Json11, + additionalServerHttpBoundProtocolCustomizations = listOf(StreamPayloadSerializerCustomization()), + ), ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt index f5b3be454fe..9207c56046e 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt @@ -15,11 +15,17 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.Ser * RestXml server-side protocol factory. This factory creates the [ServerHttpProtocolGenerator] * with RestXml specific configurations. */ -class ServerRestXmlFactory : ProtocolGeneratorFactory { +class ServerRestXmlFactory( + private val additionalServerHttpBoundProtocolCustomizations: List = listOf(), +) : ProtocolGeneratorFactory { override fun protocol(codegenContext: ServerCodegenContext): Protocol = ServerRestXmlProtocol(codegenContext) override fun buildProtocolGenerator(codegenContext: ServerCodegenContext): ServerHttpBoundProtocolGenerator = - ServerHttpBoundProtocolGenerator(codegenContext, ServerRestXmlProtocol(codegenContext)) + ServerHttpBoundProtocolGenerator( + codegenContext, + ServerRestXmlProtocol(codegenContext), + additionalServerHttpBoundProtocolCustomizations, + ) override fun support(): ProtocolSupport { return ProtocolSupport( diff --git a/rust-runtime/aws-smithy-http-server-python/src/types.rs b/rust-runtime/aws-smithy-http-server-python/src/types.rs index a2fa3085122..a274efe086d 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/types.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/types.rs @@ -31,7 +31,6 @@ use pyo3::{ prelude::*, }; use tokio::{runtime::Handle, sync::Mutex}; -use tokio_stream::StreamExt; use crate::PyError; diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-http/src/byte_stream.rs index e067018a9db..e6484317497 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-http/src/byte_stream.rs @@ -48,7 +48,8 @@ //! //! ### Stream a ByteStream into a file //! The previous example is recommended in cases where loading the entire file into memory first is desirable. For extremely large -//! files, you may wish to stream the data directly to the file system, chunk by chunk. This is posible using the `futures::Stream` implementation. +//! files, you may wish to stream the data directly to the file system, chunk by chunk. +//! This is possible using the [`.next()`](crate::byte_stream::ByteStream::next) method. //! //! ```no_run //! use bytes::{Buf, Bytes}; @@ -128,6 +129,7 @@ use bytes::Bytes; use bytes_utils::SegmentedBuf; use http_body::Body; use pin_project_lite::pin_project; +use std::future::poll_fn; use std::io::IoSlice; use std::pin::Pin; use std::task::{Context, Poll}; @@ -166,9 +168,7 @@ pin_project! { /// println!("first chunk: {:?}", data.chunk()); /// } /// ``` - /// 2. Via [`impl Stream`](futures_core::Stream): - /// - /// _Note: An import of `StreamExt` is required to use `.try_next()`._ + /// 2. Via [`.next()`](crate::byte_stream::ByteStream::next) or [`.try_next()`](crate::byte_stream::ByteStream::try_next): /// /// For use-cases where holding the entire ByteStream in memory is unnecessary, use the /// `Stream` implementation: @@ -183,7 +183,6 @@ pin_project! { /// # } /// use aws_smithy_http::byte_stream::{ByteStream, AggregatedBytes, error::Error}; /// use aws_smithy_http::body::SdkBody; - /// use tokio_stream::StreamExt; /// /// async fn example() -> Result<(), Error> { /// let mut stream = ByteStream::from(vec![1, 2, 3, 4, 5, 99]); @@ -276,7 +275,7 @@ impl ByteStream { } } - /// Consumes the ByteStream, returning the wrapped SdkBody + /// Consume the `ByteStream`, returning the wrapped SdkBody. // Backwards compatibility note: Because SdkBody has a dyn variant, // we will always be able to implement this method, even if we stop using // SdkBody as the internal representation @@ -284,6 +283,37 @@ impl ByteStream { self.inner.body } + /// Return the next item in the `ByteStream`. + /// + /// There is also a sibling method [`try_next`](ByteStream::try_next), which returns a `Result, Error>` + /// instead of an `Option>`. + pub async fn next(&mut self) -> Option> { + Some(self.inner.next().await?.map_err(Error::streaming)) + } + + /// Attempt to pull out the next value of this stream, returning `None` if the stream is + /// exhausted. + pub fn poll_next( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + self.project().inner.poll_next(cx).map_err(Error::streaming) + } + + /// Consume and return the next item in the `ByteStream` or return an error if an error is + /// encountered. + /// + /// Similar to the [`next`](ByteStream::next) method, but this returns a `Result, Error>` rather than + /// an `Option>`, making for easy use with the `?` operator. + pub async fn try_next(&mut self) -> Result, Error> { + self.next().await.transpose() + } + + /// Return the bounds on the remaining length of the `ByteStream`. + pub fn size_hint(&self) -> (u64, Option) { + self.inner.size_hint() + } + /// Read all the data from this `ByteStream` into memory /// /// If an error in the underlying stream is encountered, `ByteStreamError` is returned. @@ -393,7 +423,9 @@ impl ByteStream { /// # } /// ``` pub fn into_async_read(self) -> impl tokio::io::AsyncRead { - tokio_util::io::StreamReader::new(self) + tokio_util::io::StreamReader::new( + crate::futures_stream_adapter::FuturesStreamCompatByteStream::new(self), + ) } /// Given a function to modify an [`SdkBody`], run it on the `SdkBody` inside this `Bytestream`. @@ -442,18 +474,6 @@ impl From for ByteStream { } } -impl futures_core::stream::Stream for ByteStream { - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_next(cx).map_err(Error::streaming) - } - - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - /// Non-contiguous Binary Data Storage /// /// When data is read from the network, it is read in a sequence of chunks that are not in @@ -524,6 +544,25 @@ impl Inner { Self { body } } + async fn next(&mut self) -> Option> + where + Self: Unpin, + B: http_body::Body, + { + let mut me = Pin::new(self); + poll_fn(|cx| me.as_mut().poll_next(cx)).await + } + + fn poll_next( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> + where + B: http_body::Body, + { + self.project().body.poll_data(cx) + } + async fn collect(self) -> Result where B: http_body::Body, @@ -536,34 +575,13 @@ impl Inner { } Ok(AggregatedBytes(output)) } -} - -const SIZE_HINT_32_BIT_PANIC_MESSAGE: &str = r#" -You're running a 32-bit system and this stream's length is too large to be represented with a usize. -Please limit stream length to less than 4.294Gb or run this program on a 64-bit computer architecture. -"#; - -impl futures_core::stream::Stream for Inner -where - B: http_body::Body, -{ - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().body.poll_data(cx) - } - fn size_hint(&self) -> (usize, Option) { + fn size_hint(&self) -> (u64, Option) + where + B: http_body::Body, + { let size_hint = http_body::Body::size_hint(&self.body); - let lower = size_hint.lower().try_into(); - let upper = size_hint.upper().map(|u| u.try_into()).transpose(); - - match (lower, upper) { - (Ok(lower), Ok(upper)) => (lower, upper), - (Err(_), _) | (_, Err(_)) => { - panic!("{}", SIZE_HINT_32_BIT_PANIC_MESSAGE) - } - } + (size_hint.lower(), size_hint.upper()) } } diff --git a/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs new file mode 100644 index 00000000000..0e718df4932 --- /dev/null +++ b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs @@ -0,0 +1,61 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::body::SdkBody; +use crate::byte_stream::error::Error as ByteStreamError; +use crate::byte_stream::ByteStream; +use bytes::Bytes; +use futures_core::stream::Stream; +use std::pin::Pin; +use std::task::{Context, Poll}; + +/// A new-type wrapper to enable the impl of the `futures_core::stream::Stream` trait +/// +/// [`ByteStream`] no longer implements `futures_core::stream::Stream` so we wrap it in the +/// new-type to enable the trait when it is required. +/// +/// This is meant to be used by codegen code, and users should not need to use it directly. +pub struct FuturesStreamCompatByteStream(ByteStream); + +impl FuturesStreamCompatByteStream { + /// Creates a new `FuturesStreamCompatByteStream` by wrapping `stream`. + pub fn new(stream: ByteStream) -> Self { + Self(stream) + } + + /// Returns [`SdkBody`] of the wrapped [`ByteStream`]. + pub fn into_inner(self) -> SdkBody { + self.0.into_inner() + } +} + +impl Stream for FuturesStreamCompatByteStream { + type Item = Result; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.0).poll_next(cx) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures_core::stream::Stream; + + fn check_compatible_with_hyper_wrap_stream(stream: S) -> S + where + S: Stream> + Send + 'static, + O: Into + 'static, + E: Into> + 'static, + { + stream + } + + #[test] + fn test_byte_stream_stream_can_be_made_compatible_with_hyper_wrap_stream() { + let stream = ByteStream::from_static(b"Hello world"); + check_compatible_with_hyper_wrap_stream(FuturesStreamCompatByteStream::new(stream)); + } +} diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index b24ecd3bf13..52a259b4226 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -27,6 +27,12 @@ pub mod body; pub mod endpoint; +// Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code +// generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being +// in `rust-runtime/inlineable`, each user won't have to pay the cost of running the module's tests +// when compiling their generated SDK. +#[doc(hidden)] +pub mod futures_stream_adapter; pub mod header; pub mod http; pub mod label; From d800d33e283ff10d9d75ec81f933a5137ef14721 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 28 Sep 2023 18:07:49 -0700 Subject: [PATCH 142/331] Use the orchestrator client for ECS and IMDS credentials in aws-config (#2997) This ports the direct uses of the `aws_smithy_client::Client` in aws_config to the orchestrator. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 + aws/rust-runtime/aws-config/Cargo.toml | 6 +- aws/rust-runtime/aws-config/examples/imds.rs | 4 +- aws/rust-runtime/aws-config/src/ecs.rs | 13 +- .../src/http_credential_provider.rs | 427 +++++++------- .../aws-config/src/imds/client.rs | 545 ++++++++++-------- .../aws-config/src/imds/client/error.rs | 7 +- .../aws-config/src/imds/client/token.rs | 331 ++++++----- .../aws-config/src/imds/credentials.rs | 77 +-- .../aws-config/src/imds/region.rs | 19 +- ...ds-tests.json => imds-endpoint-tests.json} | 0 .../aws-runtime/src/user_agent.rs | 38 +- .../SensitiveOutputDecorator.kt | 1 - .../generators/OperationCustomization.kt | 11 +- .../ServiceRuntimePluginGenerator.kt | 3 +- .../aws-smithy-client/src/test_connection.rs | 2 +- rust-runtime/aws-smithy-http/src/result.rs | 5 + .../aws-smithy-runtime-api/src/client/auth.rs | 9 + .../src/client/connectors.rs | 3 + .../src/client/endpoint.rs | 3 + .../src/client/identity.rs | 3 + .../src/client/interceptors.rs | 201 ++++++- .../src/client/orchestrator.rs | 34 +- .../src/client/retries.rs | 3 + .../src/client/runtime_components.rs | 78 ++- .../src/client/runtime_plugin.rs | 58 +- .../src/client/ser_de.rs | 5 + .../aws-smithy-runtime-api/src/lib.rs | 2 + .../aws-smithy-runtime-api/src/shared.rs | 224 +++++++ .../src/client/interceptors.rs | 2 +- .../src/client/orchestrator/endpoints.rs | 11 +- .../src/client/orchestrator/operation.rs | 79 ++- 32 files changed, 1451 insertions(+), 765 deletions(-) rename aws/rust-runtime/aws-config/test-data/imds-config/{imds-tests.json => imds-endpoint-tests.json} (100%) create mode 100644 rust-runtime/aws-smithy-runtime-api/src/shared.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 07e4f95af07..8407592edba 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -241,3 +241,15 @@ message = "The `futures_core::stream::Stream` trait has been removed from [`Byte references = ["smithy-rs#2983"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "ysaito1001" + +[[smithy-rs]] +message = "`StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`." +references = ["smithy-rs#2997"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[aws-sdk-rust]] +message = "The IMDS Client builder's `build()` method is no longer async." +references = ["smithy-rs#2997"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 60fb0f52618..2e9d00f08a1 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [features] -client-hyper = ["aws-smithy-client/client-hyper"] +client-hyper = ["aws-smithy-client/client-hyper", "aws-smithy-runtime/connector-hyper"] rustls = ["aws-smithy-client/rustls", "client-hyper"] native-tls = [] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI @@ -27,7 +27,10 @@ aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", de aws-smithy-http = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-http-tower = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-http-tower" } aws-smithy-json = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-json" } +aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-types" } +aws-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-runtime" } aws-types = { path = "../../sdk/build/aws-sdk/sdk/aws-types" } hyper = { version = "0.14.26", default-features = false } time = { version = "0.3.4", features = ["parsing"] } @@ -48,6 +51,7 @@ hex = { version = "0.4.3", optional = true } zeroize = { version = "1", optional = true } [dev-dependencies] +aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } futures-util = { version = "0.3.16", default-features = false } tracing-test = "0.2.1" tracing-subscriber = { version = "0.3.16", features = ["fmt", "json"] } diff --git a/aws/rust-runtime/aws-config/examples/imds.rs b/aws/rust-runtime/aws-config/examples/imds.rs index 3722835e59b..b1da233363f 100644 --- a/aws/rust-runtime/aws-config/examples/imds.rs +++ b/aws/rust-runtime/aws-config/examples/imds.rs @@ -12,8 +12,8 @@ async fn main() -> Result<(), Box> { use aws_config::imds::Client; - let imds = Client::builder().build().await?; + let imds = Client::builder().build(); let instance_id = imds.get("/latest/meta-data/instance-id").await?; - println!("current instance id: {}", instance_id); + println!("current instance id: {}", instance_id.as_ref()); Ok(()) } diff --git a/aws/rust-runtime/aws-config/src/ecs.rs b/aws/rust-runtime/aws-config/src/ecs.rs index 17fab949f5b..f5ca10e54c1 100644 --- a/aws/rust-runtime/aws-config/src/ecs.rs +++ b/aws/rust-runtime/aws-config/src/ecs.rs @@ -55,7 +55,7 @@ use aws_credential_types::provider::{self, error::CredentialsError, future, Prov use aws_smithy_client::erase::boxclone::BoxCloneService; use aws_smithy_http::endpoint::apply_endpoint; use aws_smithy_types::error::display::DisplayErrorContext; -use http::uri::{InvalidUri, Scheme}; +use http::uri::{InvalidUri, PathAndQuery, Scheme}; use http::{HeaderValue, Uri}; use tower::{Service, ServiceExt}; @@ -166,6 +166,15 @@ impl Provider { Err(EcsConfigurationError::NotConfigured) => return Provider::NotConfigured, Err(err) => return Provider::InvalidConfiguration(err), }; + let path = uri.path().to_string(); + let endpoint = { + let mut parts = uri.into_parts(); + parts.path_and_query = Some(PathAndQuery::from_static("/")); + Uri::from_parts(parts) + } + .expect("parts will be valid") + .to_string(); + let http_provider = HttpCredentialProvider::builder() .configure(&provider_config) .connector_settings( @@ -174,7 +183,7 @@ impl Provider { .read_timeout(DEFAULT_READ_TIMEOUT) .build(), ) - .build("EcsContainer", uri); + .build("EcsContainer", &endpoint, path); Provider::Configured(http_provider) } diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index 2568cc435d2..87950ea17cf 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -8,35 +8,43 @@ //! //! Future work will stabilize this interface and enable it to be used directly. +use crate::connector::expect_connector; +use crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials}; +use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError}; use aws_credential_types::Credentials; -use aws_smithy_client::erase::DynConnector; use aws_smithy_client::http_connector::ConnectorSettings; use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation::{Operation, Request}; -use aws_smithy_http::response::ParseStrictResponse; -use aws_smithy_http::result::{SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_types::retry::{ErrorKind, RetryKind}; - -use crate::connector::expect_connector; -use crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials}; -use crate::provider_config::ProviderConfig; - -use bytes::Bytes; +use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::connectors::adapter::DynConnectorAdapter; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::client::retries::classifier::{ + HttpStatusCodeClassifier, SmithyErrorClassifier, +}; +use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; +use aws_smithy_runtime_api::client::interceptors::context::{Error, InterceptorContext}; +use aws_smithy_runtime_api::client::orchestrator::{ + HttpResponse, OrchestratorError, SensitiveOutput, +}; +use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryClassifiers, RetryReason}; +use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; +use aws_smithy_types::config_bag::Layer; +use aws_smithy_types::retry::{ErrorKind, RetryConfig}; use http::header::{ACCEPT, AUTHORIZATION}; -use http::{HeaderValue, Response, Uri}; +use http::{HeaderValue, Response}; use std::time::Duration; -use tower::layer::util::Identity; const DEFAULT_READ_TIMEOUT: Duration = Duration::from_secs(5); const DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(2); +#[derive(Debug)] +struct HttpProviderAuth { + auth: Option, +} + #[derive(Debug)] pub(crate) struct HttpCredentialProvider { - uri: Uri, - client: aws_smithy_client::Client, - provider_name: &'static str, + operation: Operation, } impl HttpCredentialProvider { @@ -45,34 +53,13 @@ impl HttpCredentialProvider { } pub(crate) async fn credentials(&self, auth: Option) -> provider::Result { - let credentials = self.client.call(self.operation(auth)).await; + let credentials = self.operation.invoke(HttpProviderAuth { auth }).await; match credentials { Ok(creds) => Ok(creds), Err(SdkError::ServiceError(context)) => Err(context.into_err()), Err(other) => Err(CredentialsError::unhandled(other)), } } - - fn operation( - &self, - auth: Option, - ) -> Operation { - let mut http_req = http::Request::builder() - .uri(&self.uri) - .header(ACCEPT, "application/json"); - - if let Some(auth) = auth { - http_req = http_req.header(AUTHORIZATION, auth); - } - let http_req = http_req.body(SdkBody::empty()).expect("valid request"); - Operation::new( - Request::new(http_req), - CredentialsResponseParser { - provider_name: self.provider_name, - }, - ) - .with_retry_classifier(HttpCredentialRetryClassifier) - } } #[derive(Default)] @@ -92,7 +79,12 @@ impl Builder { self } - pub(crate) fn build(self, provider_name: &'static str, uri: Uri) -> HttpCredentialProvider { + pub(crate) fn build( + self, + provider_name: &'static str, + endpoint: &str, + path: impl Into, + ) -> HttpCredentialProvider { let provider_config = self.provider_config.unwrap_or_default(); let connector_settings = self.connector_settings.unwrap_or_else(|| { ConnectorSettings::builder() @@ -104,198 +96,241 @@ impl Builder { "The HTTP credentials provider", provider_config.connector(&connector_settings), ); - let mut client_builder = aws_smithy_client::Client::builder() - .connector(connector) - .middleware(Identity::new()); - client_builder.set_sleep_impl(provider_config.sleep()); - let client = client_builder.build(); - HttpCredentialProvider { - uri, - client, - provider_name, + + // The following errors are retryable: + // - Socket errors + // - Networking timeouts + // - 5xx errors + // - Non-parseable 200 responses. + let retry_classifiers = RetryClassifiers::new() + .with_classifier(HttpCredentialRetryClassifier) + // Socket errors and network timeouts + .with_classifier(SmithyErrorClassifier::::new()) + // 5xx errors + .with_classifier(HttpStatusCodeClassifier::default()); + + let mut builder = Operation::builder() + .service_name("HttpCredentialProvider") + .operation_name("LoadCredentials") + .http_connector(SharedHttpConnector::new(DynConnectorAdapter::new( + connector, + ))) + .endpoint_url(endpoint) + .no_auth() + .runtime_plugin(StaticRuntimePlugin::new().with_config({ + let mut layer = Layer::new("SensitiveOutput"); + layer.store_put(SensitiveOutput); + layer.freeze() + })); + if let Some(sleep_impl) = provider_config.sleep() { + builder = builder + .standard_retry(&RetryConfig::standard()) + .retry_classifiers(retry_classifiers) + .sleep_impl(sleep_impl); + } else { + builder = builder.no_retry(); } + let path = path.into(); + let operation = builder + .serializer(move |input: HttpProviderAuth| { + let mut http_req = http::Request::builder() + .uri(path.clone()) + .header(ACCEPT, "application/json"); + if let Some(auth) = input.auth { + http_req = http_req.header(AUTHORIZATION, auth); + } + Ok(http_req.body(SdkBody::empty()).expect("valid request")) + }) + .deserializer(move |response| parse_response(provider_name, response)) + .build(); + HttpCredentialProvider { operation } } } -#[derive(Clone, Debug)] -struct CredentialsResponseParser { +fn parse_response( provider_name: &'static str, -} -impl ParseStrictResponse for CredentialsResponseParser { - type Output = provider::Result; - - fn parse(&self, response: &Response) -> Self::Output { - if !response.status().is_success() { - return Err(CredentialsError::provider_error(format!( + response: &Response, +) -> Result> { + if !response.status().is_success() { + return Err(OrchestratorError::operation( + CredentialsError::provider_error(format!( "Non-success status from HTTP credential provider: {:?}", response.status() - ))); - } - let str_resp = - std::str::from_utf8(response.body().as_ref()).map_err(CredentialsError::unhandled)?; - let json_creds = parse_json_credentials(str_resp).map_err(CredentialsError::unhandled)?; - match json_creds { - JsonCredentials::RefreshableCredentials(RefreshableCredentials { - access_key_id, - secret_access_key, - session_token, - expiration, - }) => Ok(Credentials::new( - access_key_id, - secret_access_key, - Some(session_token.to_string()), - Some(expiration), - self.provider_name, - )), - JsonCredentials::Error { code, message } => Err(CredentialsError::provider_error( - format!("failed to load credentials [{}]: {}", code, message), )), - } + )); } - - fn sensitive(&self) -> bool { - true + let resp_bytes = response.body().bytes().expect("non-streaming deserializer"); + let str_resp = std::str::from_utf8(resp_bytes) + .map_err(|err| OrchestratorError::operation(CredentialsError::unhandled(err)))?; + let json_creds = parse_json_credentials(str_resp) + .map_err(|err| OrchestratorError::operation(CredentialsError::unhandled(err)))?; + match json_creds { + JsonCredentials::RefreshableCredentials(RefreshableCredentials { + access_key_id, + secret_access_key, + session_token, + expiration, + }) => Ok(Credentials::new( + access_key_id, + secret_access_key, + Some(session_token.to_string()), + Some(expiration), + provider_name, + )), + JsonCredentials::Error { code, message } => Err(OrchestratorError::operation( + CredentialsError::provider_error(format!( + "failed to load credentials [{}]: {}", + code, message + )), + )), } } #[derive(Clone, Debug)] struct HttpCredentialRetryClassifier; -impl ClassifyRetry, SdkError> - for HttpCredentialRetryClassifier -{ - fn classify_retry( - &self, - response: Result<&SdkSuccess, &SdkError>, - ) -> RetryKind { - /* The following errors are retryable: - * - Socket errors - * - Networking timeouts - * - 5xx errors - * - Non-parseable 200 responses. - * */ - match response { - Ok(_) => RetryKind::Unnecessary, - // socket errors, networking timeouts - Err(SdkError::DispatchFailure(client_err)) - if client_err.is_timeout() || client_err.is_io() => - { - RetryKind::Error(ErrorKind::TransientError) - } - // non-parseable 200s - Err(SdkError::ServiceError(context)) - if matches!(context.err(), CredentialsError::Unhandled { .. }) - && context.raw().http().status().is_success() => - { - RetryKind::Error(ErrorKind::ServerError) - } - // 5xx errors - Err(SdkError::ResponseError(context)) - if context.raw().http().status().is_server_error() => - { - RetryKind::Error(ErrorKind::ServerError) - } - Err(SdkError::ServiceError(context)) - if context.raw().http().status().is_server_error() => - { - RetryKind::Error(ErrorKind::ServerError) +impl ClassifyRetry for HttpCredentialRetryClassifier { + fn name(&self) -> &'static str { + "HttpCredentialRetryClassifier" + } + + fn classify_retry(&self, ctx: &InterceptorContext) -> Option { + let output_or_error = ctx.output_or_error()?; + let error = match output_or_error { + Ok(_) => return None, + Err(err) => err, + }; + + // Retry non-parseable 200 responses + if let Some((err, status)) = error + .as_operation_error() + .and_then(|err| err.downcast_ref::()) + .zip(ctx.response().map(HttpResponse::status)) + { + if matches!(err, CredentialsError::Unhandled { .. }) && status.is_success() { + return Some(RetryReason::Error(ErrorKind::ServerError)); } - Err(_) => RetryKind::UnretryableFailure, } + + None } } #[cfg(test)] mod test { - use crate::http_credential_provider::{ - CredentialsResponseParser, HttpCredentialRetryClassifier, - }; + use super::*; use aws_credential_types::provider::error::CredentialsError; - use aws_credential_types::Credentials; + use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation; - use aws_smithy_http::response::ParseStrictResponse; - use aws_smithy_http::result::{SdkError, SdkSuccess}; - use aws_smithy_http::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, RetryKind}; - use bytes::Bytes; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use http::{Request, Response, Uri}; + use std::time::SystemTime; - fn sdk_resp( - resp: http::Response<&'static str>, - ) -> Result, SdkError> { - let resp = resp.map(|data| Bytes::from_static(data.as_bytes())); - match (CredentialsResponseParser { - provider_name: "test", - }) - .parse(&resp) - { - Ok(creds) => Ok(SdkSuccess { - raw: operation::Response::new(resp.map(SdkBody::from)), - parsed: creds, - }), - Err(err) => Err(SdkError::service_error( - err, - operation::Response::new(resp.map(SdkBody::from)), - )), - } + async fn provide_creds( + connector: TestConnection, + ) -> Result { + let provider_config = ProviderConfig::default().with_http_connector(connector.clone()); + let provider = HttpCredentialProvider::builder() + .configure(&provider_config) + .build("test", "http://localhost:1234/", "/some-creds"); + provider.credentials(None).await } - #[test] - fn non_parseable_is_retriable() { - let bad_response = http::Response::builder() - .status(200) - .body("notjson") - .unwrap(); - - assert_eq!( - HttpCredentialRetryClassifier.classify_retry(sdk_resp(bad_response).as_ref()), - RetryKind::Error(ErrorKind::ServerError) - ); + fn successful_req_resp() -> (HttpRequest, HttpResponse) { + ( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(200) + .body(SdkBody::from( + r#"{ + "AccessKeyId" : "MUA...", + "SecretAccessKey" : "/7PC5om....", + "Token" : "AQoDY....=", + "Expiration" : "2016-02-25T06:03:31Z" + }"#, + )) + .unwrap(), + ) } - #[test] - fn ok_response_not_retriable() { - let ok_response = http::Response::builder() - .status(200) - .body( - r#" { - "AccessKeyId" : "MUA...", - "SecretAccessKey" : "/7PC5om....", - "Token" : "AQoDY....=", - "Expiration" : "2016-02-25T06:03:31Z" - }"#, - ) - .unwrap(); - let sdk_result = sdk_resp(ok_response); - + #[tokio::test] + async fn successful_response() { + let connector = TestConnection::new(vec![successful_req_resp()]); + let creds = provide_creds(connector.clone()).await.expect("success"); + assert_eq!("MUA...", creds.access_key_id()); + assert_eq!("/7PC5om....", creds.secret_access_key()); + assert_eq!(Some("AQoDY....="), creds.session_token()); assert_eq!( - HttpCredentialRetryClassifier.classify_retry(sdk_result.as_ref()), - RetryKind::Unnecessary + Some(SystemTime::UNIX_EPOCH + Duration::from_secs(1456380211)), + creds.expiry() ); + connector.assert_requests_match(&[]); + } - assert!(sdk_result.is_ok(), "should be ok: {:?}", sdk_result) + #[tokio::test] + async fn retry_nonparseable_response() { + let connector = TestConnection::new(vec![ + ( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(200) + .body(SdkBody::from(r#"not json"#)) + .unwrap(), + ), + successful_req_resp(), + ]); + let creds = provide_creds(connector.clone()).await.expect("success"); + assert_eq!("MUA...", creds.access_key_id()); + connector.assert_requests_match(&[]); } - #[test] - fn explicit_error_not_retriable() { - let error_response = http::Response::builder() - .status(400) - .body(r#"{ "Code": "Error", "Message": "There was a problem, it was your fault" }"#) - .unwrap(); - let sdk_result = sdk_resp(error_response); - assert_eq!( - HttpCredentialRetryClassifier.classify_retry(sdk_result.as_ref()), - RetryKind::UnretryableFailure - ); - let sdk_error = sdk_result.expect_err("should be error"); + #[tokio::test] + async fn retry_error_code() { + let connector = TestConnection::new(vec![ + ( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(500) + .body(SdkBody::from(r#"it broke"#)) + .unwrap(), + ), + successful_req_resp(), + ]); + let creds = provide_creds(connector.clone()).await.expect("success"); + assert_eq!("MUA...", creds.access_key_id()); + connector.assert_requests_match(&[]); + } + #[tokio::test] + async fn explicit_error_not_retriable() { + let connector = TestConnection::new(vec![( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(400) + .body(SdkBody::from( + r#"{ "Code": "Error", "Message": "There was a problem, it was your fault" }"#, + )) + .unwrap(), + )]); + let err = provide_creds(connector.clone()) + .await + .expect_err("it should fail"); assert!( - matches!( - sdk_error, - SdkError::ServiceError(ref context) if matches!(context.err(), CredentialsError::ProviderError { .. }) - ), - "should be provider error: {}", - sdk_error + matches!(err, CredentialsError::ProviderError { .. }), + "should be CredentialsError::ProviderError: {err}", ); + connector.assert_requests_match(&[]); } } diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index f084bc9a832..ed76fc8660f 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -9,34 +9,48 @@ use crate::connector::expect_connector; use crate::imds::client::error::{BuildError, ImdsError, InnerImdsError, InvalidEndpointMode}; -use crate::imds::client::token::TokenMiddleware; +use crate::imds::client::token::TokenRuntimePlugin; use crate::provider_config::ProviderConfig; use crate::PKG_VERSION; -use aws_http::user_agent::{ApiMetadata, AwsUserAgent, UserAgentStage}; +use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; +use aws_runtime::user_agent::UserAgentInterceptor; +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_client::erase::DynConnector; use aws_smithy_client::http_connector::ConnectorSettings; -use aws_smithy_client::{erase::DynConnector, SdkSuccess}; -use aws_smithy_client::{retry, SdkError}; +use aws_smithy_client::SdkError; use aws_smithy_http::body::SdkBody; -use aws_smithy_http::endpoint::apply_endpoint; -use aws_smithy_http::operation; -use aws_smithy_http::operation::{Metadata, Operation}; -use aws_smithy_http::response::ParseStrictResponse; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_http_tower::map_request::{ - AsyncMapRequestLayer, AsyncMapRequestService, MapRequestLayer, MapRequestService, +use aws_smithy_http::result::ConnectorError; +use aws_smithy_runtime::client::connectors::adapter::DynConnectorAdapter; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; +use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; +use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; +use aws_smithy_runtime_api::client::endpoint::{ + EndpointResolver, EndpointResolverParams, SharedEndpointResolver, }; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::retry::{ErrorKind, RetryKind}; +use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::interceptors::SharedInterceptor; +use aws_smithy_runtime_api::client::orchestrator::{ + Future, HttpResponse, OrchestratorError, SensitiveOutput, +}; +use aws_smithy_runtime_api::client::retries::{ + ClassifyRetry, RetryClassifiers, RetryReason, SharedRetryStrategy, +}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_types::config_bag::{FrozenLayer, Layer}; +use aws_smithy_types::endpoint::Endpoint; +use aws_smithy_types::retry::{ErrorKind, RetryConfig}; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::os_shim_internal::Env; -use bytes::Bytes; -use http::{Response, Uri}; +use http::Uri; use std::borrow::Cow; -use std::error::Error; +use std::error::Error as _; +use std::fmt; use std::str::FromStr; use std::sync::Arc; use std::time::Duration; -use tokio::sync::OnceCell; pub mod error; mod token; @@ -85,8 +99,7 @@ fn user_agent() -> AwsUserAgent { /// # async fn docs() { /// let client = Client::builder() /// .endpoint(Uri::from_static("http://customidms:456/")) -/// .build() -/// .await; +/// .build(); /// # } /// ``` /// @@ -104,7 +117,7 @@ fn user_agent() -> AwsUserAgent { /// ```no_run /// use aws_config::imds::client::{Client, EndpointMode}; /// # async fn docs() { -/// let client = Client::builder().endpoint_mode(EndpointMode::IpV6).build().await; +/// let client = Client::builder().endpoint_mode(EndpointMode::IpV6).build(); /// # } /// ``` /// @@ -123,49 +136,7 @@ fn user_agent() -> AwsUserAgent { /// #[derive(Clone, Debug)] pub struct Client { - inner: Arc, -} - -#[derive(Debug)] -struct ClientInner { - endpoint: Uri, - smithy_client: aws_smithy_client::Client, -} - -/// Client where build is sync, but usage is async -/// -/// Building an imds::Client is actually an async operation, however, for credentials and region -/// providers, we want build to always be a synchronous operation. This allows building to be deferred -/// and cached until request time. -#[derive(Debug)] -pub(super) struct LazyClient { - client: OnceCell>, - builder: Builder, -} - -impl LazyClient { - pub(super) fn from_ready_client(client: Client) -> Self { - Self { - client: OnceCell::from(Ok(client)), - // the builder will never be used in this case - builder: Builder::default(), - } - } - pub(super) async fn client(&self) -> Result<&Client, &BuildError> { - let builder = &self.builder; - self.client - // the clone will only happen once when we actually construct it for the first time, - // after that, we will use the cache. - .get_or_init(|| async { - let client = builder.clone().build().await; - if let Err(err) = &client { - tracing::warn!(err = %DisplayErrorContext(err), "failed to create IMDS client") - } - client - }) - .await - .as_ref() - } + operation: Operation, } impl Client { @@ -187,18 +158,16 @@ impl Client { /// ```no_run /// use aws_config::imds::client::Client; /// # async fn docs() { - /// let client = Client::builder().build().await.expect("valid client"); + /// let client = Client::builder().build(); /// let ami_id = client /// .get("/latest/meta-data/ami-id") /// .await /// .expect("failure communicating with IMDS"); /// # } /// ``` - pub async fn get(&self, path: &str) -> Result { - let operation = self.make_operation(path)?; - self.inner - .smithy_client - .call(operation) + pub async fn get(&self, path: impl Into) -> Result { + self.operation + .invoke(path.into()) .await .map_err(|err| match err { SdkError::ConstructionFailure(_) if err.source().is_some() => { @@ -213,76 +182,112 @@ impl Client { InnerImdsError::InvalidUtf8 => { ImdsError::unexpected("IMDS returned invalid UTF-8") } - InnerImdsError::BadStatus => { - ImdsError::error_response(context.into_raw().into_parts().0) - } + InnerImdsError::BadStatus => ImdsError::error_response(context.into_raw()), }, - SdkError::TimeoutError(_) - | SdkError::DispatchFailure(_) - | SdkError::ResponseError(_) => ImdsError::io_error(err), + // If the error source is an ImdsError, then we need to directly return that source. + // That way, the IMDS token provider's errors can become the top-level ImdsError. + // There is a unit test that checks the correct error is being extracted. + err @ SdkError::DispatchFailure(_) => match err.into_source() { + Ok(source) => match source.downcast::() { + Ok(source) => match source.into_source().downcast::() { + Ok(source) => *source, + Err(err) => ImdsError::unexpected(err), + }, + Err(err) => ImdsError::unexpected(err), + }, + Err(err) => ImdsError::unexpected(err), + }, + SdkError::TimeoutError(_) | SdkError::ResponseError(_) => ImdsError::io_error(err), _ => ImdsError::unexpected(err), }) } +} - /// Creates a aws_smithy_http Operation to for `path` - /// - Convert the path to a URI - /// - Set the base endpoint on the URI - /// - Add a user agent - fn make_operation( - &self, - path: &str, - ) -> Result, ImdsError> { - let mut base_uri: Uri = path.parse().map_err(|_| { - ImdsError::unexpected("IMDS path was not a valid URI. Hint: does it begin with `/`?") - })?; - apply_endpoint(&mut base_uri, &self.inner.endpoint, None).map_err(ImdsError::unexpected)?; - let request = http::Request::builder() - .uri(base_uri) - .body(SdkBody::empty()) - .expect("valid request"); - let mut request = operation::Request::new(request); - request.properties_mut().insert(user_agent()); - Ok(Operation::new(request, ImdsGetResponseHandler) - .with_metadata(Metadata::new("get", "imds")) - .with_retry_classifier(ImdsResponseRetryClassifier)) +/// New-type around `String` that doesn't emit the string value in the `Debug` impl. +#[derive(Clone)] +pub struct SensitiveString(String); + +impl fmt::Debug for SensitiveString { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("SensitiveString") + .field(&"** redacted **") + .finish() } } -/// IMDS Middleware -/// -/// The IMDS middleware includes a token-loader & a UserAgent stage -#[derive(Clone, Debug)] -struct ImdsMiddleware { - token_loader: TokenMiddleware, +impl AsRef for SensitiveString { + fn as_ref(&self) -> &str { + &self.0 + } } -impl tower::Layer for ImdsMiddleware { - type Service = AsyncMapRequestService, TokenMiddleware>; +impl From for SensitiveString { + fn from(value: String) -> Self { + Self(value) + } +} - fn layer(&self, inner: S) -> Self::Service { - AsyncMapRequestLayer::for_mapper(self.token_loader.clone()) - .layer(MapRequestLayer::for_mapper(UserAgentStage::new()).layer(inner)) +impl From for String { + fn from(value: SensitiveString) -> Self { + value.0 } } -#[derive(Copy, Clone)] -struct ImdsGetResponseHandler; +/// Runtime plugin that is used by both the IMDS client and the inner client that resolves +/// the IMDS token and attaches it to requests. This runtime plugin marks the responses as +/// sensitive, configures user agent headers, and sets up retries and timeouts. +#[derive(Debug)] +struct ImdsCommonRuntimePlugin { + config: FrozenLayer, + components: RuntimeComponentsBuilder, +} -impl ParseStrictResponse for ImdsGetResponseHandler { - type Output = Result; +impl ImdsCommonRuntimePlugin { + fn new( + connector: DynConnector, + endpoint_resolver: ImdsEndpointResolver, + retry_config: &RetryConfig, + timeout_config: TimeoutConfig, + time_source: SharedTimeSource, + sleep_impl: Option, + ) -> Self { + let mut layer = Layer::new("ImdsCommonRuntimePlugin"); + layer.store_put(AuthSchemeOptionResolverParams::new(())); + layer.store_put(EndpointResolverParams::new(())); + layer.store_put(SensitiveOutput); + layer.store_put(timeout_config); + layer.store_put(user_agent()); - fn parse(&self, response: &Response) -> Self::Output { - if response.status().is_success() { - std::str::from_utf8(response.body().as_ref()) - .map(|data| data.to_string()) - .map_err(|_| InnerImdsError::InvalidUtf8) - } else { - Err(InnerImdsError::BadStatus) + Self { + config: layer.freeze(), + components: RuntimeComponentsBuilder::new("ImdsCommonRuntimePlugin") + .with_http_connector(Some(SharedHttpConnector::new(DynConnectorAdapter::new( + connector, + )))) + .with_endpoint_resolver(Some(SharedEndpointResolver::new(endpoint_resolver))) + .with_interceptor(SharedInterceptor::new(UserAgentInterceptor::new())) + .with_retry_classifiers(Some( + RetryClassifiers::new().with_classifier(ImdsResponseRetryClassifier), + )) + .with_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new( + retry_config, + )))) + .with_time_source(Some(time_source)) + .with_sleep_impl(sleep_impl), } } +} - fn sensitive(&self) -> bool { - true +impl RuntimePlugin for ImdsCommonRuntimePlugin { + fn config(&self) -> Option { + Some(self.config.clone()) + } + + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.components) } } @@ -415,15 +420,8 @@ impl Builder { self }*/ - pub(super) fn build_lazy(self) -> LazyClient { - LazyClient { - client: OnceCell::new(), - builder: self, - } - } - /// Build an IMDSv2 Client - pub async fn build(self) -> Result { + pub fn build(self) -> Client { let config = self.config.unwrap_or_default(); let timeout_config = TimeoutConfig::builder() .connect_timeout(self.connect_timeout.unwrap_or(DEFAULT_CONNECT_TIMEOUT)) @@ -437,34 +435,46 @@ impl Builder { let endpoint_source = self .endpoint .unwrap_or_else(|| EndpointSource::Env(config.clone())); - let endpoint = endpoint_source.endpoint(self.mode_override).await?; - let retry_config = retry::Config::default() + let endpoint_resolver = ImdsEndpointResolver { + endpoint_source: Arc::new(endpoint_source), + mode_override: self.mode_override, + }; + let retry_config = RetryConfig::standard() .with_max_attempts(self.max_attempts.unwrap_or(DEFAULT_ATTEMPTS)); - let token_loader = token::TokenMiddleware::new( - connector.clone(), + let common_plugin = SharedRuntimePlugin::new(ImdsCommonRuntimePlugin::new( + connector, + endpoint_resolver, + &retry_config, + timeout_config, config.time_source(), - endpoint.clone(), - self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL), - retry_config.clone(), - timeout_config.clone(), config.sleep(), - ); - let middleware = ImdsMiddleware { token_loader }; - let mut smithy_builder = aws_smithy_client::Client::builder() - .connector(connector.clone()) - .middleware(middleware) - .retry_config(retry_config) - .operation_timeout_config(timeout_config.into()); - smithy_builder.set_sleep_impl(config.sleep()); - let smithy_client = smithy_builder.build(); - - let client = Client { - inner: Arc::new(ClientInner { - endpoint, - smithy_client, - }), - }; - Ok(client) + )); + let operation = Operation::builder() + .service_name("imds") + .operation_name("get") + .runtime_plugin(common_plugin.clone()) + .runtime_plugin(TokenRuntimePlugin::new( + common_plugin, + config.time_source(), + self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL), + )) + .serializer(|path| { + Ok(http::Request::builder() + .uri(path) + .body(SdkBody::empty()) + .expect("valid request")) + }) + .deserializer(|response| { + if response.status().is_success() { + std::str::from_utf8(response.body().bytes().expect("non-streaming response")) + .map(|data| SensitiveString::from(data.to_string())) + .map_err(|_| OrchestratorError::operation(InnerImdsError::InvalidUtf8)) + } else { + Err(OrchestratorError::operation(InnerImdsError::BadStatus)) + } + }) + .build(); + Client { operation } } } @@ -531,19 +541,22 @@ impl EndpointSource { } } -#[derive(Clone)] -struct ImdsResponseRetryClassifier; +#[derive(Clone, Debug)] +struct ImdsEndpointResolver { + endpoint_source: Arc, + mode_override: Option, +} -impl ImdsResponseRetryClassifier { - fn classify(response: &operation::Response) -> RetryKind { - let status = response.http().status(); - match status { - _ if status.is_server_error() => RetryKind::Error(ErrorKind::ServerError), - // 401 indicates that the token has expired, this is retryable - _ if status.as_u16() == 401 => RetryKind::Error(ErrorKind::ServerError), - // This catch-all includes successful responses that fail to parse. These should not be retried. - _ => RetryKind::UnretryableFailure, - } +impl EndpointResolver for ImdsEndpointResolver { + fn resolve_endpoint(&self, _: &EndpointResolverParams) -> Future { + let this = self.clone(); + Future::new(Box::pin(async move { + this.endpoint_source + .endpoint(this.mode_override) + .await + .map(|uri| Endpoint::builder().url(uri.to_string()).build()) + .map_err(|err| err.into()) + })) } } @@ -556,13 +569,35 @@ impl ImdsResponseRetryClassifier { /// - 403 (IMDS disabled): **Not Retryable** /// - 404 (Not found): **Not Retryable** /// - >=500 (server error): **Retryable** -impl ClassifyRetry, SdkError> for ImdsResponseRetryClassifier { - fn classify_retry(&self, response: Result<&SdkSuccess, &SdkError>) -> RetryKind { - match response { - Ok(_) => RetryKind::Unnecessary, - Err(SdkError::ResponseError(context)) => Self::classify(context.raw()), - Err(SdkError::ServiceError(context)) => Self::classify(context.raw()), - _ => RetryKind::UnretryableFailure, +#[derive(Clone, Debug)] +struct ImdsResponseRetryClassifier; + +impl ImdsResponseRetryClassifier { + fn classify(response: &HttpResponse) -> Option { + let status = response.status(); + match status { + _ if status.is_server_error() => Some(RetryReason::Error(ErrorKind::ServerError)), + // 401 indicates that the token has expired, this is retryable + _ if status.as_u16() == 401 => Some(RetryReason::Error(ErrorKind::ServerError)), + // This catch-all includes successful responses that fail to parse. These should not be retried. + _ => None, + } + } +} + +impl ClassifyRetry for ImdsResponseRetryClassifier { + fn name(&self) -> &'static str { + "ImdsResponseRetryClassifier" + } + + fn classify_retry(&self, ctx: &InterceptorContext) -> Option { + if let Some(response) = ctx.response() { + Self::classify(response) + } else { + // Don't retry timeouts for IMDS, or else it will take ~30 seconds for the default + // credentials provider chain to fail to provide credentials. + // Also don't retry non-responses. + None } } } @@ -575,10 +610,15 @@ pub(crate) mod test { use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::test_connection::{capture_request, TestConnection}; - use aws_smithy_client::{SdkError, SdkSuccess}; use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation; - use aws_smithy_types::retry::RetryKind; + use aws_smithy_http::result::ConnectorError; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::client::interceptors::context::{ + Input, InterceptorContext, Output, + }; + use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + use aws_smithy_runtime_api::client::retries::ClassifyRetry; + use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; use http::header::USER_AGENT; use http::Uri; @@ -637,7 +677,7 @@ pub(crate) mod test { http::Response::builder().status(200).body(body).unwrap() } - pub(crate) async fn make_client(conn: &TestConnection) -> super::Client + pub(crate) fn make_client(conn: &TestConnection) -> super::Client where SdkBody: From, T: Send + 'static, @@ -650,8 +690,6 @@ pub(crate) mod test { .with_http_connector(DynConnector::new(conn.clone())), ) .build() - .await - .expect("valid client") } #[tokio::test] @@ -670,13 +708,13 @@ pub(crate) mod test { imds_response("output2"), ), ]); - let client = make_client(&connection).await; + let client = make_client(&connection); // load once let metadata = client.get("/latest/metadata").await.expect("failed"); - assert_eq!(metadata, "test-imds-output"); + assert_eq!("test-imds-output", metadata.as_ref()); // load again: the cached token should be used let metadata = client.get("/latest/metadata2").await.expect("failed"); - assert_eq!(metadata, "output2"); + assert_eq!("output2", metadata.as_ref()); connection.assert_requests_match(&[]); } @@ -710,17 +748,15 @@ pub(crate) mod test { ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) - .build() - .await - .expect("valid client"); + .build(); let resp1 = client.get("/latest/metadata").await.expect("success"); // now the cached credential has expired time_source.advance(Duration::from_secs(600)); let resp2 = client.get("/latest/metadata").await.expect("success"); connection.assert_requests_match(&[]); - assert_eq!(resp1, "test-imds-output1"); - assert_eq!(resp2, "test-imds-output2"); + assert_eq!("test-imds-output1", resp1.as_ref()); + assert_eq!("test-imds-output2", resp2.as_ref()); } /// Tokens are refreshed up to 120 seconds early to avoid using an expired token. @@ -761,9 +797,7 @@ pub(crate) mod test { ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) - .build() - .await - .expect("valid client"); + .build(); let resp1 = client.get("/latest/metadata").await.expect("success"); // now the cached credential has expired @@ -772,9 +806,9 @@ pub(crate) mod test { time_source.advance(Duration::from_secs(150)); let resp3 = client.get("/latest/metadata").await.expect("success"); connection.assert_requests_match(&[]); - assert_eq!(resp1, "test-imds-output1"); - assert_eq!(resp2, "test-imds-output2"); - assert_eq!(resp3, "test-imds-output3"); + assert_eq!("test-imds-output1", resp1.as_ref()); + assert_eq!("test-imds-output2", resp2.as_ref()); + assert_eq!("test-imds-output3", resp3.as_ref()); } /// 500 error during the GET should be retried @@ -795,8 +829,15 @@ pub(crate) mod test { imds_response("ok"), ), ]); - let client = make_client(&connection).await; - assert_eq!(client.get("/latest/metadata").await.expect("success"), "ok"); + let client = make_client(&connection); + assert_eq!( + "ok", + client + .get("/latest/metadata") + .await + .expect("success") + .as_ref() + ); connection.assert_requests_match(&[]); // all requests should have a user agent header @@ -823,8 +864,15 @@ pub(crate) mod test { imds_response("ok"), ), ]); - let client = make_client(&connection).await; - assert_eq!(client.get("/latest/metadata").await.expect("success"), "ok"); + let client = make_client(&connection); + assert_eq!( + "ok", + client + .get("/latest/metadata") + .await + .expect("success") + .as_ref() + ); connection.assert_requests_match(&[]); } @@ -850,8 +898,15 @@ pub(crate) mod test { imds_response("ok"), ), ]); - let client = make_client(&connection).await; - assert_eq!(client.get("/latest/metadata").await.expect("success"), "ok"); + let client = make_client(&connection); + assert_eq!( + "ok", + client + .get("/latest/metadata") + .await + .expect("success") + .as_ref() + ); connection.assert_requests_match(&[]); } @@ -863,7 +918,7 @@ pub(crate) mod test { token_request("http://169.254.169.254", 21600), http::Response::builder().status(403).body("").unwrap(), )]); - let client = make_client(&connection).await; + let client = make_client(&connection); let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "forbidden"); connection.assert_requests_match(&[]); @@ -872,30 +927,18 @@ pub(crate) mod test { /// Successful responses should classify as `RetryKind::Unnecessary` #[test] fn successful_response_properly_classified() { - use aws_smithy_http::retry::ClassifyRetry; - + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); + ctx.set_response(imds_response("").map(|_| SdkBody::empty())); let classifier = ImdsResponseRetryClassifier; - fn response_200() -> operation::Response { - operation::Response::new(imds_response("").map(|_| SdkBody::empty())) - } - let success = SdkSuccess { - raw: response_200(), - parsed: (), - }; - assert_eq!( - RetryKind::Unnecessary, - classifier.classify_retry(Ok::<_, &SdkError<()>>(&success)) - ); + assert_eq!(None, classifier.classify_retry(&ctx)); // Emulate a failure to parse the response body (using an io error since it's easy to construct in a test) - let failure = SdkError::<()>::response_error( - io::Error::new(io::ErrorKind::BrokenPipe, "fail to parse"), - response_200(), - ); - assert_eq!( - RetryKind::UnretryableFailure, - classifier.classify_retry(Err::<&SdkSuccess<()>, _>(&failure)) - ); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::connector(ConnectorError::io( + io::Error::new(io::ErrorKind::BrokenPipe, "fail to parse").into(), + )))); + assert_eq!(None, classifier.classify_retry(&ctx)); } // since tokens are sent as headers, the tokens need to be valid header values @@ -905,7 +948,7 @@ pub(crate) mod test { token_request("http://169.254.169.254", 21600), token_response(21600, "replaced").map(|_| vec![1, 0]), )]); - let client = make_client(&connection).await; + let client = make_client(&connection); let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "invalid token"); connection.assert_requests_match(&[]); @@ -926,7 +969,7 @@ pub(crate) mod test { .unwrap(), ), ]); - let client = make_client(&connection).await; + let client = make_client(&connection); let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "invalid UTF-8"); connection.assert_requests_match(&[]); @@ -943,14 +986,20 @@ pub(crate) mod test { let client = Client::builder() // 240.* can never be resolved .endpoint(Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .build(); let now = SystemTime::now(); let resp = client .get("/latest/metadata") .await .expect_err("240.0.0.0 will never resolve"); + match resp { + err @ ImdsError::FailedToLoadToken(_) + if format!("{}", DisplayErrorContext(&err)).contains("timeout") => {} // ok, + other => panic!( + "wrong error, expected construction failure with TimedOutError inside: {}", + DisplayErrorContext(&other) + ), + } let time_elapsed = now.elapsed().unwrap(); assert!( time_elapsed > Duration::from_secs(1), @@ -962,14 +1011,6 @@ pub(crate) mod test { "time_elapsed should be less than 2s but was {:?}", time_elapsed ); - match resp { - err @ ImdsError::FailedToLoadToken(_) - if format!("{}", DisplayErrorContext(&err)).contains("timeout") => {} // ok, - other => panic!( - "wrong error, expected construction failure with TimedOutError inside: {}", - other - ), - } } #[derive(Debug, Deserialize)] @@ -983,8 +1024,10 @@ pub(crate) mod test { } #[tokio::test] - async fn config_tests() -> Result<(), Box> { - let test_cases = std::fs::read_to_string("test-data/imds-config/imds-tests.json")?; + async fn endpoint_config_tests() -> Result<(), Box> { + let _logs = capture_test_logs(); + + let test_cases = std::fs::read_to_string("test-data/imds-config/imds-endpoint-tests.json")?; #[derive(Deserialize)] struct TestCases { tests: Vec, @@ -1014,24 +1057,22 @@ pub(crate) mod test { imds_client = imds_client.endpoint_mode(mode_override.parse().unwrap()); } - let imds_client = imds_client.build().await; - let (uri, imds_client) = match (&test_case.result, imds_client) { - (Ok(uri), Ok(client)) => (uri, client), - (Err(test), Ok(_client)) => panic!( - "test should fail: {} but a valid client was made. {}", - test, test_case.docs - ), - (Err(substr), Err(err)) => { - assert_full_error_contains!(err, substr); - return; + let imds_client = imds_client.build(); + match &test_case.result { + Ok(uri) => { + // this request will fail, we just want to capture the endpoint configuration + let _ = imds_client.get("/hello").await; + assert_eq!(&watcher.expect_request().uri().to_string(), uri); + } + Err(expected) => { + let err = imds_client.get("/hello").await.expect_err("it should fail"); + let message = format!("{}", DisplayErrorContext(&err)); + assert!( + message.contains(expected), + "{}\nexpected error: {expected}\nactual error: {message}", + test_case.docs + ); } - (Ok(_uri), Err(e)) => panic!( - "a valid client should be made but: {}. {}", - e, test_case.docs - ), }; - // this request will fail, we just want to capture the endpoint configuration - let _ = imds_client.get("/hello").await; - assert_eq!(&watcher.expect_request().uri().to_string(), uri); } } diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index b9559486a6c..4d32aee0127 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -8,13 +8,14 @@ use aws_smithy_client::SdkError; use aws_smithy_http::body::SdkBody; use aws_smithy_http::endpoint::error::InvalidEndpointError; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use std::error::Error; use std::fmt; /// Error context for [`ImdsError::FailedToLoadToken`] #[derive(Debug)] pub struct FailedToLoadToken { - source: SdkError, + source: SdkError, } impl FailedToLoadToken { @@ -23,7 +24,7 @@ impl FailedToLoadToken { matches!(self.source, SdkError::DispatchFailure(_)) } - pub(crate) fn into_source(self) -> SdkError { + pub(crate) fn into_source(self) -> SdkError { self.source } } @@ -76,7 +77,7 @@ pub enum ImdsError { } impl ImdsError { - pub(super) fn failed_to_load_token(source: SdkError) -> Self { + pub(super) fn failed_to_load_token(source: SdkError) -> Self { Self::FailedToLoadToken(FailedToLoadToken { source }) } diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index 41e96777b45..98e1a79a80b 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -15,26 +15,29 @@ //! - Attach the token to the request in the `x-aws-ec2-metadata-token` header use crate::imds::client::error::{ImdsError, TokenError, TokenErrorKind}; -use crate::imds::client::ImdsResponseRetryClassifier; use aws_credential_types::cache::ExpiringCache; -use aws_http::user_agent::UserAgentStage; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::retry; use aws_smithy_http::body::SdkBody; -use aws_smithy_http::endpoint::apply_endpoint; -use aws_smithy_http::middleware::AsyncMapRequest; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::operation::{Metadata, Request}; -use aws_smithy_http::response::ParseStrictResponse; -use aws_smithy_http_tower::map_request::MapRequestLayer; -use aws_smithy_types::timeout::TimeoutConfig; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; +use aws_smithy_runtime_api::client::auth::{ + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, +}; +use aws_smithy_runtime_api::client::identity::{ + Identity, IdentityResolver, SharedIdentityResolver, +}; +use aws_smithy_runtime_api::client::orchestrator::{ + Future, HttpRequest, HttpResponse, OrchestratorError, +}; +use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, +}; +use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_types::config_bag::ConfigBag; use http::{HeaderValue, Uri}; -use std::fmt::{Debug, Formatter}; -use std::future::Future; -use std::pin::Pin; +use std::borrow::Cow; +use std::fmt; use std::sync::Arc; use std::time::{Duration, SystemTime}; @@ -47,6 +50,7 @@ const TOKEN_REFRESH_BUFFER: Duration = Duration::from_secs(120); const X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS: &str = "x-aws-ec2-metadata-token-ttl-seconds"; const X_AWS_EC2_METADATA_TOKEN: &str = "x-aws-ec2-metadata-token"; +const IMDS_TOKEN_AUTH_SCHEME: AuthSchemeId = AuthSchemeId::new(X_AWS_EC2_METADATA_TOKEN); /// IMDS Token #[derive(Clone)] @@ -54,151 +58,214 @@ struct Token { value: HeaderValue, expiry: SystemTime, } +impl fmt::Debug for Token { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Token") + .field("value", &"** redacted **") + .field("expiry", &self.expiry) + .finish() + } +} -/// Token Middleware -/// -/// Token middleware will load/cache a token when required and handle caching/expiry. +/// Token Runtime Plugin /// -/// It will attach the token to the incoming request on the `x-aws-ec2-metadata-token` header. -#[derive(Clone)] -pub(super) struct TokenMiddleware { - client: Arc>>, - token_parser: GetTokenResponseHandler, - token: ExpiringCache, - time_source: SharedTimeSource, - endpoint: Uri, - token_ttl: Duration, +/// This runtime plugin wires up the necessary components to load/cache a token +/// when required and handle caching/expiry. This token will get attached to the +/// request to IMDS on the `x-aws-ec2-metadata-token` header. +#[derive(Debug)] +pub(super) struct TokenRuntimePlugin { + components: RuntimeComponentsBuilder, +} + +impl TokenRuntimePlugin { + pub(super) fn new( + common_plugin: SharedRuntimePlugin, + time_source: SharedTimeSource, + token_ttl: Duration, + ) -> Self { + Self { + components: RuntimeComponentsBuilder::new("TokenRuntimePlugin") + .with_auth_scheme(TokenAuthScheme::new()) + .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![ + IMDS_TOKEN_AUTH_SCHEME, + ]))) + .with_identity_resolver( + IMDS_TOKEN_AUTH_SCHEME, + TokenResolver::new(common_plugin, time_source, token_ttl), + ), + } + } } -impl Debug for TokenMiddleware { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "ImdsTokenMiddleware") +impl RuntimePlugin for TokenRuntimePlugin { + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.components) } } -impl TokenMiddleware { - pub(super) fn new( - connector: DynConnector, +#[derive(Debug)] +struct TokenResolverInner { + cache: ExpiringCache, + refresh: Operation<(), Token, TokenError>, + time_source: SharedTimeSource, +} + +#[derive(Clone, Debug)] +struct TokenResolver { + inner: Arc, +} + +impl TokenResolver { + fn new( + common_plugin: SharedRuntimePlugin, time_source: SharedTimeSource, - endpoint: Uri, token_ttl: Duration, - retry_config: retry::Config, - timeout_config: TimeoutConfig, - sleep_impl: Option, ) -> Self { - let mut inner_builder = aws_smithy_client::Client::builder() - .connector(connector) - .middleware(MapRequestLayer::::default()) - .retry_config(retry_config) - .operation_timeout_config(timeout_config.into()); - inner_builder.set_sleep_impl(sleep_impl); - let inner_client = inner_builder.build(); - let client = Arc::new(inner_client); Self { - client, - token_parser: GetTokenResponseHandler { - time: time_source.clone(), - }, - token: ExpiringCache::new(TOKEN_REFRESH_BUFFER), - time_source, - endpoint, - token_ttl, + inner: Arc::new(TokenResolverInner { + cache: ExpiringCache::new(TOKEN_REFRESH_BUFFER), + refresh: Operation::builder() + .service_name("imds") + .operation_name("get-token") + .runtime_plugin(common_plugin) + .no_auth() + .serializer(move |_| { + Ok(http::Request::builder() + .method("PUT") + .uri(Uri::from_static("/latest/api/token")) + .header(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS, token_ttl.as_secs()) + .body(SdkBody::empty()) + .expect("valid HTTP request")) + }) + .deserializer({ + let time_source = time_source.clone(); + move |response| { + let now = time_source.now(); + parse_token_response(response, now) + .map_err(OrchestratorError::operation) + } + }) + .build(), + time_source, + }), } } - async fn add_token(&self, request: Request) -> Result { - let preloaded_token = self - .token - .yield_or_clear_if_expired(self.time_source.now()) - .await; - let token = match preloaded_token { - Some(token) => Ok(token), - None => { - self.token - .get_or_load(|| async move { self.get_token().await }) - .await - } - }?; - request.augment(|mut request, _| { - request - .headers_mut() - .insert(X_AWS_EC2_METADATA_TOKEN, token.value); - Ok(request) - }) - } async fn get_token(&self) -> Result<(Token, SystemTime), ImdsError> { - let mut uri = Uri::from_static("/latest/api/token"); - apply_endpoint(&mut uri, &self.endpoint, None).map_err(ImdsError::unexpected)?; - let request = http::Request::builder() - .header( - X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS, - self.token_ttl.as_secs(), - ) - .uri(uri) - .method("PUT") - .body(SdkBody::empty()) - .expect("valid HTTP request"); - let mut request = operation::Request::new(request); - request.properties_mut().insert(super::user_agent()); - - let operation = Operation::new(request, self.token_parser.clone()) - .with_retry_classifier(ImdsResponseRetryClassifier) - .with_metadata(Metadata::new("get-token", "imds")); - let response = self - .client - .call(operation) + self.inner + .refresh + .invoke(()) .await - .map_err(ImdsError::failed_to_load_token)?; - let expiry = response.expiry; - Ok((response, expiry)) + .map(|token| { + let expiry = token.expiry; + (token, expiry) + }) + .map_err(ImdsError::failed_to_load_token) } } -impl AsyncMapRequest for TokenMiddleware { - type Error = ImdsError; - type Future = Pin> + Send + 'static>>; - - fn name(&self) -> &'static str { - "attach_imds_token" +fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result { + match response.status().as_u16() { + 400 => return Err(TokenErrorKind::InvalidParameters.into()), + 403 => return Err(TokenErrorKind::Forbidden.into()), + _ => {} } + let mut value = + HeaderValue::from_bytes(response.body().bytes().expect("non-streaming response")) + .map_err(|_| TokenErrorKind::InvalidToken)?; + value.set_sensitive(true); + + let ttl: u64 = response + .headers() + .get(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS) + .ok_or(TokenErrorKind::NoTtl)? + .to_str() + .map_err(|_| TokenErrorKind::InvalidTtl)? + .parse() + .map_err(|_parse_error| TokenErrorKind::InvalidTtl)?; + Ok(Token { + value, + expiry: now + Duration::from_secs(ttl), + }) +} - fn apply(&self, request: Request) -> Self::Future { +impl IdentityResolver for TokenResolver { + fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { let this = self.clone(); - Box::pin(async move { this.add_token(request).await }) + Future::new(Box::pin(async move { + let preloaded_token = this + .inner + .cache + .yield_or_clear_if_expired(this.inner.time_source.now()) + .await; + let token = match preloaded_token { + Some(token) => Ok(token), + None => { + this.inner + .cache + .get_or_load(|| { + let this = this.clone(); + async move { this.get_token().await } + }) + .await + } + }?; + + let expiry = token.expiry; + Ok(Identity::new(token, Some(expiry))) + })) } } -#[derive(Clone)] -struct GetTokenResponseHandler { - time: SharedTimeSource, +#[derive(Debug)] +struct TokenAuthScheme { + signer: TokenSigner, } -impl ParseStrictResponse for GetTokenResponseHandler { - type Output = Result; - - fn parse(&self, response: &http::Response) -> Self::Output { - match response.status().as_u16() { - 400 => return Err(TokenErrorKind::InvalidParameters.into()), - 403 => return Err(TokenErrorKind::Forbidden.into()), - _ => {} +impl TokenAuthScheme { + fn new() -> Self { + Self { + signer: TokenSigner, } - let value = HeaderValue::from_maybe_shared(response.body().clone()) - .map_err(|_| TokenErrorKind::InvalidToken)?; - let ttl: u64 = response - .headers() - .get(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS) - .ok_or(TokenErrorKind::NoTtl)? - .to_str() - .map_err(|_| TokenErrorKind::InvalidTtl)? - .parse() - .map_err(|_parse_error| TokenErrorKind::InvalidTtl)?; - Ok(Token { - value, - expiry: self.time.now() + Duration::from_secs(ttl), - }) } +} + +impl AuthScheme for TokenAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + IMDS_TOKEN_AUTH_SCHEME + } + + fn identity_resolver( + &self, + identity_resolvers: &dyn GetIdentityResolver, + ) -> Option { + identity_resolvers.identity_resolver(IMDS_TOKEN_AUTH_SCHEME) + } + + fn signer(&self) -> &dyn Signer { + &self.signer + } +} + +#[derive(Debug)] +struct TokenSigner; - fn sensitive(&self) -> bool { - true +impl Signer for TokenSigner { + fn sign_http_request( + &self, + request: &mut HttpRequest, + identity: &Identity, + _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, + _config_bag: &ConfigBag, + ) -> Result<(), BoxError> { + let token = identity.data::().expect("correct type"); + request + .headers_mut() + .append(X_AWS_EC2_METADATA_TOKEN, token.value.clone()); + Ok(()) } } diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index ccc65eaf992..3bde8a4510f 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -9,8 +9,7 @@ //! This credential provider will NOT fallback to IMDSv1. Ensure that IMDSv2 is enabled on your instances. use super::client::error::ImdsError; -use crate::imds; -use crate::imds::client::LazyClient; +use crate::imds::{self, Client}; use crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials}; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; @@ -50,7 +49,7 @@ impl StdError for ImdsCommunicationError { /// _Note: This credentials provider will NOT fallback to the IMDSv1 flow._ #[derive(Debug)] pub struct ImdsCredentialsProvider { - client: LazyClient, + client: Client, env: Env, profile: Option, time_source: SharedTimeSource, @@ -110,12 +109,7 @@ impl Builder { let env = provider_config.env(); let client = self .imds_override - .map(LazyClient::from_ready_client) - .unwrap_or_else(|| { - imds::Client::builder() - .configure(&provider_config) - .build_lazy() - }); + .unwrap_or_else(|| imds::Client::builder().configure(&provider_config).build()); ImdsCredentialsProvider { client, env, @@ -156,23 +150,14 @@ impl ImdsCredentialsProvider { } } - /// Load an inner IMDS client from the OnceCell - async fn client(&self) -> Result<&imds::Client, CredentialsError> { - self.client.client().await.map_err(|build_error| { - // need to format the build error since we don't own it and it can't be cloned - CredentialsError::invalid_configuration(format!("{}", build_error)) - }) - } - /// Retrieve the instance profile from IMDS async fn get_profile_uncached(&self) -> Result { match self - .client() - .await? + .client .get("/latest/meta-data/iam/security-credentials/") .await { - Ok(profile) => Ok(profile), + Ok(profile) => Ok(profile.as_ref().into()), Err(ImdsError::ErrorResponse(context)) if context.response().status().as_u16() == 404 => { @@ -223,9 +208,11 @@ impl ImdsCredentialsProvider { async fn retrieve_credentials(&self) -> provider::Result { if self.imds_disabled() { - tracing::debug!("IMDS disabled because $AWS_EC2_METADATA_DISABLED was set to `true`"); + tracing::debug!( + "IMDS disabled because AWS_EC2_METADATA_DISABLED env var was set to `true`" + ); return Err(CredentialsError::not_loaded( - "IMDS disabled by $AWS_ECS_METADATA_DISABLED", + "IMDS disabled by AWS_ECS_METADATA_DISABLED env var", )); } tracing::debug!("loading credentials from IMDS"); @@ -235,15 +222,14 @@ impl ImdsCredentialsProvider { }; tracing::debug!(profile = %profile, "loaded profile"); let credentials = self - .client() - .await? - .get(&format!( + .client + .get(format!( "/latest/meta-data/iam/security-credentials/{}", profile )) .await .map_err(CredentialsError::provider_error)?; - match parse_json_credentials(&credentials) { + match parse_json_credentials(credentials.as_ref()) { Ok(JsonCredentials::RefreshableCredentials(RefreshableCredentials { access_key_id, secret_access_key, @@ -296,19 +282,16 @@ impl ImdsCredentialsProvider { #[cfg(test)] mod test { - use std::time::{Duration, UNIX_EPOCH}; - + use super::*; use crate::imds::client::test::{ imds_request, imds_response, make_client, token_request, token_response, }; - use crate::imds::credentials::{ - ImdsCredentialsProvider, WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY, - }; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::test_connection::TestConnection; + use std::time::{Duration, UNIX_EPOCH}; use tracing_test::traced_test; const TOKEN_A: &str = "token_a"; @@ -338,7 +321,7 @@ mod test { ), ]); let client = ImdsCredentialsProvider::builder() - .imds_client(make_client(&connection).await) + .imds_client(make_client(&connection)) .build(); let creds1 = client.provide_credentials().await.expect("valid creds"); let creds2 = client.provide_credentials().await.expect("valid creds"); @@ -376,9 +359,7 @@ mod test { .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) - .build() - .await - .expect("valid client"); + .build(); let provider = ImdsCredentialsProvider::builder() .configure(&provider_config) .imds_client(client) @@ -422,9 +403,7 @@ mod test { .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) - .build() - .await - .expect("valid client"); + .build(); let provider = ImdsCredentialsProvider::builder() .configure(&provider_config) .imds_client(client) @@ -443,9 +422,7 @@ mod test { let client = crate::imds::Client::builder() // 240.* can never be resolved .endpoint(http::Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .build(); let expected = aws_credential_types::Credentials::for_tests(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) @@ -463,18 +440,16 @@ mod test { let client = crate::imds::Client::builder() // 240.* can never be resolved .endpoint(http::Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .build(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) // no fallback credentials provided .build(); let actual = provider.provide_credentials().await; - assert!(matches!( - actual, - Err(aws_credential_types::provider::error::CredentialsError::CredentialsNotLoaded(_)) - )); + assert!( + matches!(actual, Err(CredentialsError::CredentialsNotLoaded(_))), + "\nexpected: Err(CredentialsError::CredentialsNotLoaded(_))\nactual: {actual:?}" + ); } #[tokio::test] @@ -484,9 +459,7 @@ mod test { let client = crate::imds::Client::builder() // 240.* can never be resolved .endpoint(http::Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .build(); let expected = aws_credential_types::Credentials::for_tests(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) @@ -536,7 +509,7 @@ mod test { ), ]); let provider = ImdsCredentialsProvider::builder() - .imds_client(make_client(&connection).await) + .imds_client(make_client(&connection)) .build(); let creds1 = provider.provide_credentials().await.expect("valid creds"); assert_eq!(creds1.access_key_id(), "ASIARTEST"); diff --git a/aws/rust-runtime/aws-config/src/imds/region.rs b/aws/rust-runtime/aws-config/src/imds/region.rs index bc784f8d4f1..072dc97a873 100644 --- a/aws/rust-runtime/aws-config/src/imds/region.rs +++ b/aws/rust-runtime/aws-config/src/imds/region.rs @@ -8,8 +8,7 @@ //! Load region from IMDS from `/latest/meta-data/placement/region` //! This provider has a 5 second timeout. -use crate::imds; -use crate::imds::client::LazyClient; +use crate::imds::{self, Client}; use crate::meta::region::{future, ProvideRegion}; use crate::provider_config::ProviderConfig; use aws_smithy_types::error::display::DisplayErrorContext; @@ -22,7 +21,7 @@ use tracing::Instrument; /// This provider is included in the default region chain, so it does not need to be used manually. #[derive(Debug)] pub struct ImdsRegionProvider { - client: LazyClient, + client: Client, env: Env, } @@ -49,11 +48,10 @@ impl ImdsRegionProvider { tracing::debug!("not using IMDS to load region, IMDS is disabled"); return None; } - let client = self.client.client().await.ok()?; - match client.get(REGION_PATH).await { + match self.client.get(REGION_PATH).await { Ok(region) => { - tracing::debug!(region = %region, "loaded region from IMDS"); - Some(Region::new(region)) + tracing::debug!(region = %region.as_ref(), "loaded region from IMDS"); + Some(Region::new(String::from(region))) } Err(err) => { tracing::warn!(err = %DisplayErrorContext(&err), "failed to load region from IMDS"); @@ -99,12 +97,7 @@ impl Builder { let provider_config = self.provider_config.unwrap_or_default(); let client = self .imds_client_override - .map(LazyClient::from_ready_client) - .unwrap_or_else(|| { - imds::Client::builder() - .configure(&provider_config) - .build_lazy() - }); + .unwrap_or_else(|| imds::Client::builder().configure(&provider_config).build()); ImdsRegionProvider { client, env: provider_config.env(), diff --git a/aws/rust-runtime/aws-config/test-data/imds-config/imds-tests.json b/aws/rust-runtime/aws-config/test-data/imds-config/imds-endpoint-tests.json similarity index 100% rename from aws/rust-runtime/aws-config/test-data/imds-config/imds-tests.json rename to aws/rust-runtime/aws-config/test-data/imds-config/imds-endpoint-tests.json diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 7310820f86c..1b6c3699809 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -82,25 +82,25 @@ impl Interceptor for UserAgentInterceptor { _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let api_metadata = cfg - .load::() - .ok_or(UserAgentInterceptorError::MissingApiMetadata)?; - // Allow for overriding the user agent by an earlier interceptor (so, for example, // tests can use `AwsUserAgent::for_tests()`) by attempting to grab one out of the // config bag before creating one. let ua: Cow<'_, AwsUserAgent> = cfg .load::() .map(Cow::Borrowed) + .map(Result::<_, UserAgentInterceptorError>::Ok) .unwrap_or_else(|| { + let api_metadata = cfg + .load::() + .ok_or(UserAgentInterceptorError::MissingApiMetadata)?; let mut ua = AwsUserAgent::new_from_environment(Env::real(), api_metadata.clone()); let maybe_app_name = cfg.load::(); if let Some(app_name) = maybe_app_name { ua.set_app_name(app_name.clone()); } - Cow::Owned(ua) - }); + Ok(Cow::Owned(ua)) + })?; let headers = context.request_mut().headers_mut(); let (user_agent, x_amz_user_agent) = header_values(&ua)?; @@ -250,4 +250,30 @@ mod tests { "`{error}` should contain message `This is a bug`" ); } + + #[test] + fn test_api_metadata_missing_with_ua_override() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut context = context(); + + let mut layer = Layer::new("test"); + layer.store_put(AwsUserAgent::for_tests()); + let mut config = ConfigBag::of_layers(vec![layer]); + + let interceptor = UserAgentInterceptor::new(); + let mut ctx = Into::into(&mut context); + + interceptor + .modify_before_signing(&mut ctx, &rc, &mut config) + .expect("it should succeed"); + + let header = expect_header(&context, "user-agent"); + assert_eq!(AwsUserAgent::for_tests().ua_header(), header); + assert!(!header.contains("unused")); + + assert_eq!( + AwsUserAgent::for_tests().aws_ua_header(), + expect_header(&context, "x-amz-user-agent") + ); + } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt index a902c1432db..88a1a77c930 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCus import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.SensitiveIndex import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index d872311cd6a..48bfc758951 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -10,7 +10,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section @@ -72,17 +71,9 @@ sealed class OperationSection(name: String) : Section(name) { val operationShape: OperationShape, ) : OperationSection("AdditionalInterceptors") { fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { - val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) writer.rustTemplate( - """ - .with_interceptor( - #{SharedInterceptor}::new( - #{interceptor} - ) as _ - ) - """, + ".with_interceptor(#{interceptor})", "interceptor" to interceptor, - "SharedInterceptor" to smithyRuntimeApi.resolve("client::interceptors::SharedInterceptor"), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index 555ea7e035f..921d16a3e58 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -43,10 +43,9 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { writer.rustTemplate( """ - runtime_components.push_interceptor(#{SharedInterceptor}::new(#{interceptor}) as _); + runtime_components.push_interceptor(#{interceptor}); """, "interceptor" to interceptor, - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), ) } diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs index b0600b369af..622f5fedcec 100644 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ b/rust-runtime/aws-smithy-client/src/test_connection.rs @@ -134,7 +134,7 @@ pub struct ValidateRequest { impl ValidateRequest { pub fn assert_matches(&self, ignore_headers: &[HeaderName]) { let (actual, expected) = (&self.actual, &self.expected); - assert_eq!(actual.uri(), expected.uri()); + assert_eq!(expected.uri(), actual.uri()); for (name, value) in expected.headers() { if !ignore_headers.contains(name) { let actual_header = actual diff --git a/rust-runtime/aws-smithy-http/src/result.rs b/rust-runtime/aws-smithy-http/src/result.rs index 8d60c8d2ed7..c86e9c5f88a 100644 --- a/rust-runtime/aws-smithy-http/src/result.rs +++ b/rust-runtime/aws-smithy-http/src/result.rs @@ -651,6 +651,11 @@ impl ConnectorError { } } + /// Grants ownership of this error's source. + pub fn into_source(self) -> BoxError { + self.source + } + /// Returns metadata about the connection /// /// If a connection was established and provided by the internal connector, a connection will diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index 79a28bef35c..d5e02b6da50 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -9,6 +9,7 @@ use crate::box_error::BoxError; use crate::client::identity::{Identity, SharedIdentityResolver}; use crate::client::orchestrator::HttpRequest; use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; +use crate::impl_shared_conversions; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::type_erasure::TypeErasedBox; use aws_smithy_types::Document; @@ -120,6 +121,12 @@ impl AuthSchemeOptionResolver for SharedAuthSchemeOptionResolver { } } +impl_shared_conversions!( + convert SharedAuthSchemeOptionResolver + from AuthSchemeOptionResolver + using SharedAuthSchemeOptionResolver::new +); + /// An auth scheme. /// /// Auth schemes have unique identifiers (the `scheme_id`), @@ -177,6 +184,8 @@ impl AuthScheme for SharedAuthScheme { } } +impl_shared_conversions!(convert SharedAuthScheme from AuthScheme using SharedAuthScheme::new); + /// Signing implementation for an auth scheme. pub trait Signer: Send + Sync + fmt::Debug { /// Sign the given request with the given identity, components, and config. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs index dd91f634ba3..9399fa05bff 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs @@ -31,6 +31,7 @@ //! The Smithy clients have no knowledge of such concepts. use crate::client::orchestrator::{HttpRequest, HttpResponse}; +use crate::impl_shared_conversions; use aws_smithy_async::future::now_or_later::NowOrLater; use aws_smithy_http::result::ConnectorError; use pin_project_lite::pin_project; @@ -117,3 +118,5 @@ impl HttpConnector for SharedHttpConnector { (*self.0).call(request) } } + +impl_shared_conversions!(convert SharedHttpConnector from HttpConnector using SharedHttpConnector::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index a32ed602fe5..0037b9eb19b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -6,6 +6,7 @@ //! APIs needed to configure endpoint resolution for clients. use crate::client::orchestrator::Future; +use crate::impl_shared_conversions; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; use aws_smithy_types::type_erasure::TypeErasedBox; @@ -60,3 +61,5 @@ impl EndpointResolver for SharedEndpointResolver { self.0.resolve_endpoint(params) } } + +impl_shared_conversions!(convert SharedEndpointResolver from EndpointResolver using SharedEndpointResolver::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index 27c4accf4ef..ee115487c11 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -5,6 +5,7 @@ use crate::client::auth::AuthSchemeId; use crate::client::orchestrator::Future; +use crate::impl_shared_conversions; use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; use std::fmt; @@ -48,6 +49,8 @@ impl IdentityResolver for SharedIdentityResolver { } } +impl_shared_conversions!(convert SharedIdentityResolver from IdentityResolver using SharedIdentityResolver::new); + /// An identity resolver paired with an auth scheme ID that it resolves for. #[derive(Clone, Debug)] pub(crate) struct ConfiguredIdentityResolver { diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 443af2962a7..9a26fbb4062 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -19,12 +19,12 @@ use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; use std::marker::PhantomData; -use std::ops::Deref; use std::sync::Arc; pub mod context; pub mod error; +use crate::impl_shared_conversions; pub use error::InterceptorError; macro_rules! interceptor_trait_fn { @@ -618,19 +618,202 @@ impl SharedInterceptor { } } -impl AsRef for SharedInterceptor { - fn as_ref(&self) -> &(dyn Interceptor + 'static) { - self.interceptor.as_ref() +impl Interceptor for SharedInterceptor { + fn name(&self) -> &'static str { + self.interceptor.name() + } + + fn modify_before_attempt_completion( + &self, + context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_attempt_completion(context, runtime_components, cfg) + } + + fn modify_before_completion( + &self, + context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_completion(context, runtime_components, cfg) + } + + fn modify_before_deserialization( + &self, + context: &mut BeforeDeserializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_deserialization(context, runtime_components, cfg) + } + + fn modify_before_retry_loop( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_retry_loop(context, runtime_components, cfg) + } + + fn modify_before_serialization( + &self, + context: &mut BeforeSerializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_serialization(context, runtime_components, cfg) + } + + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_signing(context, runtime_components, cfg) + } + + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_transmit(context, runtime_components, cfg) + } + + fn read_after_attempt( + &self, + context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_attempt(context, runtime_components, cfg) + } + + fn read_after_deserialization( + &self, + context: &AfterDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_deserialization(context, runtime_components, cfg) + } + + fn read_after_execution( + &self, + context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_execution(context, runtime_components, cfg) + } + + fn read_after_serialization( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_serialization(context, runtime_components, cfg) + } + + fn read_after_signing( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_signing(context, runtime_components, cfg) + } + + fn read_after_transmit( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_transmit(context, runtime_components, cfg) + } + + fn read_before_attempt( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_before_attempt(context, runtime_components, cfg) } -} -impl Deref for SharedInterceptor { - type Target = Arc; - fn deref(&self) -> &Self::Target { - &self.interceptor + fn read_before_deserialization( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_before_deserialization(context, runtime_components, cfg) + } + + fn read_before_execution( + &self, + context: &BeforeSerializationInterceptorContextRef<'_>, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor.read_before_execution(context, cfg) + } + + fn read_before_serialization( + &self, + context: &BeforeSerializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_before_serialization(context, runtime_components, cfg) + } + + fn read_before_signing( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_before_signing(context, runtime_components, cfg) + } + + fn read_before_transmit( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_before_transmit(context, runtime_components, cfg) } } +impl_shared_conversions!(convert SharedInterceptor from Interceptor using SharedInterceptor::new); + /// Generalized interceptor disabling interface /// /// RuntimePlugins can disable interceptors by inserting [`DisableInterceptor`](DisableInterceptor) into the config bag diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 8de224cc80b..a034515562f 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -25,7 +25,8 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::{ConnectorError, SdkError}; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use bytes::Bytes; -use std::fmt::Debug; +use std::error::Error as StdError; +use std::fmt; use std::future::Future as StdFuture; use std::pin::Pin; @@ -244,6 +245,35 @@ impl OrchestratorError { } } +impl StdError for OrchestratorError +where + E: StdError + 'static, +{ + fn source(&self) -> Option<&(dyn StdError + 'static)> { + Some(match &self.kind { + ErrorKind::Connector { source } => source as _, + ErrorKind::Operation { err } => err as _, + ErrorKind::Interceptor { source } => source as _, + ErrorKind::Response { source } => source.as_ref(), + ErrorKind::Timeout { source } => source.as_ref(), + ErrorKind::Other { source } => source.as_ref(), + }) + } +} + +impl fmt::Display for OrchestratorError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self.kind { + ErrorKind::Connector { .. } => "connector error", + ErrorKind::Operation { .. } => "operation error", + ErrorKind::Interceptor { .. } => "interceptor error", + ErrorKind::Response { .. } => "response error", + ErrorKind::Timeout { .. } => "timeout", + ErrorKind::Other { .. } => "an unknown error occurred", + }) + } +} + fn convert_dispatch_error( err: BoxError, response: Option, @@ -262,7 +292,7 @@ fn convert_dispatch_error( impl From for OrchestratorError where - E: Debug + std::error::Error + 'static, + E: fmt::Debug + std::error::Error + 'static, { fn from(err: InterceptorError) -> Self { Self::interceptor(err) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs index 0703e87d873..0fd61b5771b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs @@ -98,6 +98,8 @@ impl RetryStrategy for SharedRetryStrategy { } } +impl_shared_conversions!(convert SharedRetryStrategy from RetryStrategy using SharedRetryStrategy::new); + /// Classification result from [`ClassifyRetry`]. #[non_exhaustive] #[derive(Clone, Eq, PartialEq, Debug)] @@ -231,6 +233,7 @@ mod test_util { use crate::box_error::BoxError; use crate::client::runtime_components::RuntimeComponents; +use crate::impl_shared_conversions; use std::sync::Arc; #[cfg(feature = "test-util")] pub use test_util::AlwaysRetry; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index ac67705ef6d..4a92ec6988d 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -19,6 +19,7 @@ use crate::client::endpoint::SharedEndpointResolver; use crate::client::identity::{ConfiguredIdentityResolver, SharedIdentityResolver}; use crate::client::interceptors::SharedInterceptor; use crate::client::retries::{RetryClassifiers, SharedRetryStrategy}; +use crate::shared::IntoShared; use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_async::time::SharedTimeSource; use std::fmt; @@ -273,17 +274,17 @@ impl RuntimeComponentsBuilder { /// Sets the auth scheme option resolver. pub fn set_auth_scheme_option_resolver( &mut self, - auth_scheme_option_resolver: Option, + auth_scheme_option_resolver: Option>, ) -> &mut Self { self.auth_scheme_option_resolver = - auth_scheme_option_resolver.map(|r| Tracked::new(self.builder_name, r)); + auth_scheme_option_resolver.map(|r| Tracked::new(self.builder_name, r.into_shared())); self } /// Sets the auth scheme option resolver. pub fn with_auth_scheme_option_resolver( mut self, - auth_scheme_option_resolver: Option, + auth_scheme_option_resolver: Option>, ) -> Self { self.set_auth_scheme_option_resolver(auth_scheme_option_resolver); self @@ -295,13 +296,19 @@ impl RuntimeComponentsBuilder { } /// Sets the HTTP connector. - pub fn set_http_connector(&mut self, connector: Option) -> &mut Self { - self.http_connector = connector.map(|c| Tracked::new(self.builder_name, c)); + pub fn set_http_connector( + &mut self, + connector: Option>, + ) -> &mut Self { + self.http_connector = connector.map(|c| Tracked::new(self.builder_name, c.into_shared())); self } /// Sets the HTTP connector. - pub fn with_http_connector(mut self, connector: Option) -> Self { + pub fn with_http_connector( + mut self, + connector: Option>, + ) -> Self { self.set_http_connector(connector); self } @@ -314,16 +321,17 @@ impl RuntimeComponentsBuilder { /// Sets the endpoint resolver. pub fn set_endpoint_resolver( &mut self, - endpoint_resolver: Option, + endpoint_resolver: Option>, ) -> &mut Self { - self.endpoint_resolver = endpoint_resolver.map(|s| Tracked::new(self.builder_name, s)); + self.endpoint_resolver = + endpoint_resolver.map(|s| Tracked::new(self.builder_name, s.into_shared())); self } /// Sets the endpoint resolver. pub fn with_endpoint_resolver( mut self, - endpoint_resolver: Option, + endpoint_resolver: Option>, ) -> Self { self.set_endpoint_resolver(endpoint_resolver); self @@ -335,14 +343,17 @@ impl RuntimeComponentsBuilder { } /// Adds an auth scheme. - pub fn push_auth_scheme(&mut self, auth_scheme: SharedAuthScheme) -> &mut Self { + pub fn push_auth_scheme( + &mut self, + auth_scheme: impl IntoShared, + ) -> &mut Self { self.auth_schemes - .push(Tracked::new(self.builder_name, auth_scheme)); + .push(Tracked::new(self.builder_name, auth_scheme.into_shared())); self } /// Adds an auth scheme. - pub fn with_auth_scheme(mut self, auth_scheme: SharedAuthScheme) -> Self { + pub fn with_auth_scheme(mut self, auth_scheme: impl IntoShared) -> Self { self.push_auth_scheme(auth_scheme); self } @@ -351,11 +362,11 @@ impl RuntimeComponentsBuilder { pub fn push_identity_resolver( &mut self, scheme_id: AuthSchemeId, - identity_resolver: SharedIdentityResolver, + identity_resolver: impl IntoShared, ) -> &mut Self { self.identity_resolvers.push(Tracked::new( self.builder_name, - ConfiguredIdentityResolver::new(scheme_id, identity_resolver), + ConfiguredIdentityResolver::new(scheme_id, identity_resolver.into_shared()), )); self } @@ -364,7 +375,7 @@ impl RuntimeComponentsBuilder { pub fn with_identity_resolver( mut self, scheme_id: AuthSchemeId, - identity_resolver: SharedIdentityResolver, + identity_resolver: impl IntoShared, ) -> Self { self.push_identity_resolver(scheme_id, identity_resolver); self @@ -386,14 +397,17 @@ impl RuntimeComponentsBuilder { } /// Adds an interceptor. - pub fn push_interceptor(&mut self, interceptor: SharedInterceptor) -> &mut Self { + pub fn push_interceptor( + &mut self, + interceptor: impl IntoShared, + ) -> &mut Self { self.interceptors - .push(Tracked::new(self.builder_name, interceptor)); + .push(Tracked::new(self.builder_name, interceptor.into_shared())); self } /// Adds an interceptor. - pub fn with_interceptor(mut self, interceptor: SharedInterceptor) -> Self { + pub fn with_interceptor(mut self, interceptor: impl IntoShared) -> Self { self.push_interceptor(interceptor); self } @@ -444,14 +458,22 @@ impl RuntimeComponentsBuilder { } /// Sets the retry strategy. - pub fn set_retry_strategy(&mut self, retry_strategy: Option) -> &mut Self { - self.retry_strategy = retry_strategy.map(|s| Tracked::new(self.builder_name, s)); + pub fn set_retry_strategy( + &mut self, + retry_strategy: Option>, + ) -> &mut Self { + self.retry_strategy = + retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared())); self } /// Sets the retry strategy. - pub fn with_retry_strategy(mut self, retry_strategy: Option) -> Self { - self.retry_strategy = retry_strategy.map(|s| Tracked::new(self.builder_name, s)); + pub fn with_retry_strategy( + mut self, + retry_strategy: Option>, + ) -> Self { + self.retry_strategy = + retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared())); self } @@ -617,13 +639,13 @@ impl RuntimeComponentsBuilder { } Self::new("aws_smithy_runtime_api::client::runtime_components::RuntimeComponentBuilder::for_tests") - .with_auth_scheme(SharedAuthScheme::new(FakeAuthScheme)) - .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(FakeAuthSchemeOptionResolver))) - .with_endpoint_resolver(Some(SharedEndpointResolver::new(FakeEndpointResolver))) - .with_http_connector(Some(SharedHttpConnector::new(FakeConnector))) - .with_identity_resolver(AuthSchemeId::new("fake"), SharedIdentityResolver::new(FakeIdentityResolver)) + .with_auth_scheme(FakeAuthScheme) + .with_auth_scheme_option_resolver(Some(FakeAuthSchemeOptionResolver)) + .with_endpoint_resolver(Some(FakeEndpointResolver)) + .with_http_connector(Some(FakeConnector)) + .with_identity_resolver(AuthSchemeId::new("fake"), FakeIdentityResolver) .with_retry_classifiers(Some(RetryClassifiers::new())) - .with_retry_strategy(Some(SharedRetryStrategy::new(FakeRetryStrategy))) + .with_retry_strategy(Some(FakeRetryStrategy)) .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep))) .with_time_source(Some(SharedTimeSource::new(FakeTimeSource))) } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 9fec5519a73..34548c0ab71 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -22,6 +22,8 @@ use crate::box_error::BoxError; use crate::client::runtime_components::{ RuntimeComponentsBuilder, EMPTY_RUNTIME_COMPONENTS_BUILDER, }; +use crate::impl_shared_conversions; +use crate::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer}; use std::borrow::Cow; use std::fmt::Debug; @@ -56,7 +58,7 @@ pub enum Order { /// Runtime plugin trait /// -/// A `RuntimePlugin` is the unit of configuration for augmenting the SDK with new behavior. +/// A `RuntimePlugin` is the unit of configuration for augmenting the client with new behavior. /// /// Runtime plugins can register interceptors, set runtime components, and modify configuration. pub trait RuntimePlugin: Debug + Send + Sync { @@ -113,7 +115,7 @@ pub trait RuntimePlugin: Debug + Send + Sync { pub struct SharedRuntimePlugin(Arc); impl SharedRuntimePlugin { - /// Returns a new [`SharedRuntimePlugin`]. + /// Creates a new [`SharedRuntimePlugin`]. pub fn new(plugin: impl RuntimePlugin + 'static) -> Self { Self(Arc::new(plugin)) } @@ -136,6 +138,8 @@ impl RuntimePlugin for SharedRuntimePlugin { } } +impl_shared_conversions!(convert SharedRuntimePlugin from RuntimePlugin using SharedRuntimePlugin::new); + /// Runtime plugin that simply returns the config and components given at construction time. #[derive(Default, Debug)] pub struct StaticRuntimePlugin { @@ -185,15 +189,16 @@ impl RuntimePlugin for StaticRuntimePlugin { self.runtime_components .as_ref() .map(Cow::Borrowed) - .unwrap_or_else(|| RuntimePlugin::runtime_components(self, _current_components)) + .unwrap_or_else(|| Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER)) } } macro_rules! insert_plugin { - ($vec:expr, $plugin:ident, $create_rp:expr) => {{ + ($vec:expr, $plugin:expr) => {{ // Insert the plugin in the correct order + let plugin = $plugin; let mut insert_index = 0; - let order = $plugin.order(); + let order = plugin.order(); for (index, other_plugin) in $vec.iter().enumerate() { let other_order = other_plugin.order(); if other_order <= order { @@ -202,7 +207,7 @@ macro_rules! insert_plugin { break; } } - $vec.insert(insert_index, $create_rp); + $vec.insert(insert_index, plugin); }}; } @@ -235,21 +240,13 @@ impl RuntimePlugins { Default::default() } - pub fn with_client_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { - insert_plugin!( - self.client_plugins, - plugin, - SharedRuntimePlugin::new(plugin) - ); + pub fn with_client_plugin(mut self, plugin: impl IntoShared) -> Self { + insert_plugin!(self.client_plugins, plugin.into_shared()); self } - pub fn with_operation_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { - insert_plugin!( - self.operation_plugins, - plugin, - SharedRuntimePlugin::new(plugin) - ); + pub fn with_operation_plugin(mut self, plugin: impl IntoShared) -> Self { + insert_plugin!(self.operation_plugins, plugin.into_shared()); self } @@ -274,7 +271,7 @@ mod tests { use crate::client::connectors::{HttpConnector, HttpConnectorFuture, SharedHttpConnector}; use crate::client::orchestrator::HttpRequest; use crate::client::runtime_components::RuntimeComponentsBuilder; - use crate::client::runtime_plugin::Order; + use crate::client::runtime_plugin::{Order, SharedRuntimePlugin}; use aws_smithy_http::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use http::HeaderValue; @@ -307,7 +304,7 @@ mod tests { } fn insert_plugin(vec: &mut Vec, plugin: RP) { - insert_plugin!(vec, plugin, plugin); + insert_plugin!(vec, plugin); } let mut vec = Vec::new(); @@ -450,4 +447,25 @@ mod tests { assert_eq!("1", resp.headers().get("rp1").unwrap()); assert_eq!("1", resp.headers().get("rp2").unwrap()); } + + #[test] + fn shared_runtime_plugin_new_specialization() { + #[derive(Debug)] + struct RP; + impl RuntimePlugin for RP {} + + use crate::shared::IntoShared; + let shared1 = SharedRuntimePlugin::new(RP); + let shared2: SharedRuntimePlugin = shared1.clone().into_shared(); + assert_eq!( + "SharedRuntimePlugin(RP)", + format!("{shared1:?}"), + "precondition: RP shows up in the debug format" + ); + assert_eq!( + format!("{shared1:?}"), + format!("{shared2:?}"), + "it should not nest the shared runtime plugins" + ); + } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs index 5a3a77988e2..027b33a5fce 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs @@ -8,6 +8,7 @@ use crate::box_error::BoxError; use crate::client::interceptors::context::{Error, Input, Output}; use crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; +use crate::impl_shared_conversions; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; use std::sync::Arc; @@ -48,6 +49,8 @@ impl Storable for SharedRequestSerializer { type Storer = StoreReplace; } +impl_shared_conversions!(convert SharedRequestSerializer from RequestSerializer using SharedRequestSerializer::new); + /// Deserialization implementation that converts an [`HttpResponse`] into an [`Output`] or [`Error`]. pub trait ResponseDeserializer: Send + Sync + fmt::Debug { /// For streaming requests, deserializes the response headers. @@ -103,3 +106,5 @@ impl ResponseDeserializer for SharedResponseDeserializer { impl Storable for SharedResponseDeserializer { type Storer = StoreReplace; } + +impl_shared_conversions!(convert SharedResponseDeserializer from ResponseDeserializer using SharedResponseDeserializer::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index ebc9225a8a3..56b65f209a1 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -34,3 +34,5 @@ pub mod client; /// Internal builder macros. Not intended to be used outside of the aws-smithy-runtime crates. #[doc(hidden)] pub mod macros; + +pub mod shared; diff --git a/rust-runtime/aws-smithy-runtime-api/src/shared.rs b/rust-runtime/aws-smithy-runtime-api/src/shared.rs new file mode 100644 index 00000000000..c45506c9f3c --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/shared.rs @@ -0,0 +1,224 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Conversion traits for converting an unshared type into a shared type. +//! +//! The standard [`From`](std::convert::From)/[`Into`](std::convert::Into) traits can't be +//! used for this purpose due to the blanket implementation of `Into`. +//! +//! This implementation also adds a [`maybe_shared`] method and [`impl_shared_conversions`](crate::impl_shared_conversions) +//! macro to trivially avoid nesting shared types with other shared types. +//! +//! # What is a shared type? +//! +//! A shared type is a new-type around a `Send + Sync` reference counting smart pointer +//! (i.e., an [`Arc`](std::sync::Arc)) around an object-safe trait. Shared types are +//! used to share a trait object among multiple threads/clients/requests. +#![cfg_attr( + feature = "client", + doc = " +For example, [`SharedHttpConnector`](crate::client::connectors::SharedHttpConnector), is +a shared type for the [`HttpConnector`](crate::client::connectors::HttpConnector) trait, +which allows for sharing a single HTTP connector instance (and its connection pool) among multiple clients. +" +)] +//! +//! A shared type implements the [`FromUnshared`] trait, which allows any implementation +//! of the trait it wraps to easily be converted into it. +//! +#![cfg_attr( + feature = "client", + doc = " +To illustrate, let's examine the +[`RuntimePlugin`](crate::client::runtime_plugin::RuntimePlugin)/[`SharedRuntimePlugin`](crate::client::runtime_plugin::SharedRuntimePlugin) +duo. +The following instantiates a concrete implementation of the `RuntimePlugin` trait. +We can do `RuntimePlugin` things on this instance. + +```rust,no_run +use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; + +let some_plugin = StaticRuntimePlugin::new(); +``` + +We can convert this instance into a shared type in two different ways. + +```rust,no_run +# use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; +# let some_plugin = StaticRuntimePlugin::new(); +use aws_smithy_runtime_api::client::runtime_plugin::SharedRuntimePlugin; +use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; + +// Using the `IntoShared` trait +let shared: SharedRuntimePlugin = some_plugin.into_shared(); + +// Using the `FromUnshared` trait: +# let some_plugin = StaticRuntimePlugin::new(); +let shared = SharedRuntimePlugin::from_unshared(some_plugin); +``` + +The `IntoShared` trait is useful for making functions that take any `RuntimePlugin` impl and convert it to a shared type. +For example, this function will convert the given `plugin` argument into a `SharedRuntimePlugin`. + +```rust,no_run +# use aws_smithy_runtime_api::client::runtime_plugin::{SharedRuntimePlugin, StaticRuntimePlugin}; +# use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; +fn take_shared(plugin: impl IntoShared) { + let _plugin: SharedRuntimePlugin = plugin.into_shared(); +} +``` + +This can be called with different types, and even if a `SharedRuntimePlugin` is passed in, it won't nest that +`SharedRuntimePlugin` inside of another `SharedRuntimePlugin`. + +```rust,no_run +# use aws_smithy_runtime_api::client::runtime_plugin::{SharedRuntimePlugin, StaticRuntimePlugin}; +# use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; +# fn take_shared(plugin: impl IntoShared) { +# let _plugin: SharedRuntimePlugin = plugin.into_shared(); +# } +// Automatically converts it to `SharedRuntimePlugin(StaticRuntimePlugin)` +take_shared(StaticRuntimePlugin::new()); + +// This is OK. +// It create a `SharedRuntimePlugin(StaticRuntimePlugin))` +// instead of a nested `SharedRuntimePlugin(SharedRuntimePlugin(StaticRuntimePlugin)))` +take_shared(SharedRuntimePlugin::new(StaticRuntimePlugin::new())); +``` +" +)] + +use std::any::{Any, TypeId}; + +/// Like the `From` trait, but for converting to a shared type. +/// +/// See the [module docs](crate::shared) for information about shared types. +pub trait FromUnshared { + /// Creates a shared type from an unshared type. + fn from_unshared(value: Unshared) -> Self; +} + +/// Like the `Into` trait, but for (efficiently) converting into a shared type. +/// +/// If the type is already a shared type, it won't be nested in another shared type. +/// +/// See the [module docs](crate::shared) for information about shared types. +pub trait IntoShared { + /// Creates a shared type from an unshared type. + fn into_shared(self) -> Shared; +} + +impl IntoShared for Unshared +where + Shared: FromUnshared, +{ + fn into_shared(self) -> Shared { + FromUnshared::from_unshared(self) + } +} + +/// Given a `value`, determine if that value is already shared. If it is, return it. Otherwise, wrap it in a shared type. +/// +/// See the [module docs](crate::shared) for information about shared types. +pub fn maybe_shared(value: MaybeShared, ctor: F) -> Shared +where + Shared: 'static, + MaybeShared: IntoShared + 'static, + F: FnOnce(MaybeShared) -> Shared, +{ + // Check if the type is already a shared type + if TypeId::of::() == TypeId::of::() { + // Convince the compiler it is already a shared type and return it + let mut placeholder = Some(value); + let value: Shared = (&mut placeholder as &mut dyn Any) + .downcast_mut::>() + .expect("type checked above") + .take() + .expect("set to Some above"); + value + } else { + (ctor)(value) + } +} + +/// Implements `FromUnshared` for a shared type. +/// +/// See the [`shared` module docs](crate::shared) for information about shared types. +/// +/// # Example +/// ```rust,no_run +/// use aws_smithy_runtime_api::impl_shared_conversions; +/// use std::sync::Arc; +/// +/// trait Thing {} +/// +/// struct Thingamajig; +/// impl Thing for Thingamajig {} +/// +/// struct SharedThing(Arc); +/// impl Thing for SharedThing {} +/// impl SharedThing { +/// fn new(thing: impl Thing + 'static) -> Self { +/// Self(Arc::new(thing)) +/// } +/// } +/// impl_shared_conversions!(convert SharedThing from Thing using SharedThing::new); +/// ``` +#[macro_export] +macro_rules! impl_shared_conversions { + (convert $shared_type:ident from $unshared_trait:ident using $ctor:expr) => { + impl $crate::shared::FromUnshared for $shared_type + where + T: $unshared_trait + 'static, + { + fn from_unshared(value: T) -> Self { + $crate::shared::maybe_shared(value, $ctor) + } + } + }; +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fmt; + use std::sync::Arc; + + trait Thing: fmt::Debug {} + + #[derive(Debug)] + struct Thingamajig; + impl Thing for Thingamajig {} + + #[derive(Debug)] + struct SharedThing(Arc); + impl Thing for SharedThing {} + impl SharedThing { + fn new(thing: impl Thing + 'static) -> Self { + Self(Arc::new(thing)) + } + } + impl_shared_conversions!(convert SharedThing from Thing using SharedThing::new); + + #[test] + fn test() { + let thing = Thingamajig; + assert_eq!("Thingamajig", format!("{thing:?}"), "precondition"); + + let shared_thing: SharedThing = thing.into_shared(); + assert_eq!( + "SharedThing(Thingamajig)", + format!("{shared_thing:?}"), + "precondition" + ); + + let very_shared_thing: SharedThing = shared_thing.into_shared(); + assert_eq!( + "SharedThing(Thingamajig)", + format!("{very_shared_thing:?}"), + "it should not nest the shared thing in another shared thing" + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index c9dd0746059..8dff23fcce8 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -273,7 +273,7 @@ struct ConditionallyEnabledInterceptor(SharedInterceptor); impl ConditionallyEnabledInterceptor { fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { if self.0.enabled(cfg) { - Some(self.0.as_ref()) + Some(&self.0) } else { None } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 5257fa66675..ffb3ac92123 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -24,21 +24,22 @@ use tracing::trace; /// An endpoint resolver that uses a static URI. #[derive(Clone, Debug)] pub struct StaticUriEndpointResolver { - endpoint: Uri, + endpoint: String, } impl StaticUriEndpointResolver { /// Create a resolver that resolves to `http://localhost:{port}`. pub fn http_localhost(port: u16) -> Self { Self { - endpoint: Uri::from_str(&format!("http://localhost:{port}")) - .expect("all u16 values are valid ports"), + endpoint: format!("http://localhost:{port}"), } } /// Create a resolver that resolves to the given URI. - pub fn uri(endpoint: Uri) -> Self { - Self { endpoint } + pub fn uri(endpoint: impl Into) -> Self { + Self { + endpoint: endpoint.into(), + } } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index eb619328704..ac61dc72228 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -30,9 +30,9 @@ use aws_smithy_runtime_api::client::runtime_plugin::{ use aws_smithy_runtime_api::client::ser_de::{ RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, }; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; -use http::Uri; use std::borrow::Cow; use std::fmt; use std::marker::PhantomData; @@ -100,7 +100,7 @@ impl fmt::Debug for FnDeserializer { /// Orchestrates execution of a HTTP request without any modeled input or output. #[doc(hidden)] -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct Operation { service_name: Cow<'static, str>, operation_name: Cow<'static, str>, @@ -108,6 +108,18 @@ pub struct Operation { _phantom: PhantomData<(I, O, E)>, } +// Manual Clone implementation needed to get rid of Clone bounds on I, O, and E +impl Clone for Operation { + fn clone(&self) -> Self { + Self { + service_name: self.service_name.clone(), + operation_name: self.operation_name.clone(), + runtime_plugins: self.runtime_plugins.clone(), + _phantom: self._phantom, + } + } +} + impl Operation<(), (), ()> { pub fn builder() -> OperationBuilder { OperationBuilder::new() @@ -177,7 +189,7 @@ impl OperationBuilder { self } - pub fn http_connector(mut self, connector: SharedHttpConnector) -> Self { + pub fn http_connector(mut self, connector: impl IntoShared) -> Self { self.runtime_components.set_http_connector(Some(connector)); self } @@ -186,7 +198,7 @@ impl OperationBuilder { self.config.store_put(EndpointResolverParams::new(())); self.runtime_components .set_endpoint_resolver(Some(SharedEndpointResolver::new( - StaticUriEndpointResolver::uri(Uri::try_from(url).expect("valid URI")), + StaticUriEndpointResolver::uri(url), ))); self } @@ -237,13 +249,13 @@ impl OperationBuilder { self } - pub fn interceptor(mut self, interceptor: SharedInterceptor) -> Self { + pub fn interceptor(mut self, interceptor: impl IntoShared) -> Self { self.runtime_components.push_interceptor(interceptor); self } - pub fn runtime_plugin(mut self, runtime_plugin: SharedRuntimePlugin) -> Self { - self.runtime_plugins.push(runtime_plugin); + pub fn runtime_plugin(mut self, runtime_plugin: impl IntoShared) -> Self { + self.runtime_plugins.push(runtime_plugin.into_shared()); self } @@ -294,26 +306,6 @@ impl OperationBuilder { pub fn build(self) -> Operation { let service_name = self.service_name.expect("service_name required"); let operation_name = self.operation_name.expect("operation_name required"); - assert!( - self.runtime_components.http_connector().is_some(), - "a http_connector is required" - ); - assert!( - self.runtime_components.endpoint_resolver().is_some(), - "a endpoint_resolver is required" - ); - assert!( - self.runtime_components.retry_strategy().is_some(), - "a retry_strategy is required" - ); - assert!( - self.config.load::().is_some(), - "a serializer is required" - ); - assert!( - self.config.load::().is_some(), - "a deserializer is required" - ); let mut runtime_plugins = RuntimePlugins::new().with_client_plugin( StaticRuntimePlugin::new() .with_config(self.config.freeze()) @@ -323,6 +315,39 @@ impl OperationBuilder { runtime_plugins = runtime_plugins.with_client_plugin(runtime_plugin); } + #[cfg(debug_assertions)] + { + let mut config = ConfigBag::base(); + let components = runtime_plugins + .apply_client_configuration(&mut config) + .expect("the runtime plugins should succeed"); + + assert!( + components.http_connector().is_some(), + "a http_connector is required" + ); + assert!( + components.endpoint_resolver().is_some(), + "a endpoint_resolver is required" + ); + assert!( + components.retry_strategy().is_some(), + "a retry_strategy is required" + ); + assert!( + config.load::().is_some(), + "a serializer is required" + ); + assert!( + config.load::().is_some(), + "a deserializer is required" + ); + assert!( + config.load::().is_some(), + "endpoint resolver params are required" + ); + } + Operation { service_name, operation_name, From 2011da488ae86c4dc163f67d1ef2e1b937271708 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 29 Sep 2023 12:38:19 -0500 Subject: [PATCH 143/331] Fix `#[warn(dead_code)]` in the SDK crate for a service with no operations defined (#3012) ## Motivation and Context When a service has no operations, the following places in a generated SDK issue `dead_code` warnings: ``` error: field `runtime_plugins` is never read --> src/client.rs:5:16 | 3 | pub(crate) struct Handle { | ------ field in this struct 4 | pub(crate) conf: crate::Config, 5 | pub(crate) runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, | ^^^^^^^^^^^^^^^ | = note: `Handle` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis = note: `-D dead-code` implied by `-D warnings` error: associated function `new` is never used --> src/client/customize.rs:30:23 | 28 | impl CustomizableOperation { | -------------------------------------------- associated function in this implementation 29 | /// Creates a new `CustomizableOperation` from `customizable_send`. 30 | pub(crate) fn new(customizable_send: B) -> Self { | ^^^ error: associated function `new` is never used --> src/config.rs:853:19 | 852 | impl ConfigOverrideRuntimePlugin { | -------------------------------- associated function in this implementation 853 | pub(crate) fn new( | ^^^ ``` This PR adds `#[allow(dead_code)]` to the code generator at the corresponding places to suppress those warnings. ## Testing - Added a new unit test to ensure that the warnings are not issued for a service with no operations. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../ConfigOverrideRuntimePluginGenerator.kt | 1 + .../client/CustomizableOperationGenerator.kt | 1 + .../generators/client/FluentClientGenerator.kt | 1 + .../client/FluentClientGeneratorTest.kt | 15 +++++++++++++++ 4 files changed, 18 insertions(+) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index 0e595065f9f..04028ef18d6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -48,6 +48,7 @@ class ConfigOverrideRuntimePluginGenerator( } impl ConfigOverrideRuntimePlugin { + ##[allow(dead_code)] // unused when a service does not provide any operations pub(crate) fn new( config_override: Builder, initial_config: #{FrozenLayer}, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index bffb0c7b6e2..e34681c3c51 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -197,6 +197,7 @@ class CustomizableOperationGenerator( impl CustomizableOperation { /// Creates a new `CustomizableOperation` from `customizable_send`. + ##[allow(dead_code)] // unused when a service does not provide any operations pub(crate) fn new(customizable_send: B) -> Self { Self { customizable_send, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index eec95f349b5..aa53db7e9d2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -184,6 +184,7 @@ class FluentClientGenerator( ##[derive(Debug)] pub(crate) struct Handle { pub(crate) conf: crate::Config, + ##[allow(dead_code)] // unused when a service does not provide any operations pub(crate) runtime_plugins: #{RuntimePlugins}, } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index abda9bf6330..bf5d3737de7 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -162,4 +162,19 @@ class FluentClientGeneratorTest { test = test, ) } + + @Test + fun `dead-code warning should not be issued when a service has no operations`() { + val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + + @awsJson1_0 + service HelloService { + version: "1" + } + """.asSmithyModel() + + clientIntegrationTest(model) + } } From 398ad9e562da874e1be240ed559c581ab9257ccb Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 29 Sep 2023 15:32:44 -0500 Subject: [PATCH 144/331] Update a module for the last release date in canary (#3013) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context Fixes [canary failures](https://github.com/awslabs/aws-sdk-rust/actions/runs/6345490441/job/17237658244) by updating the-last-release-before-breaking-change module in `canary-lambda`. ## Description [A previous PR](https://github.com/awslabs/smithy-rs/pull/2978) removing the `Steram` trait from public API had a breaking change, requiring canary to update its code. The latest release at the time while the PR was worked on was `release-2023-08-23` so we created a new module with that date and moved the previously working canary's code prior to the breaking change to it. The `latest` module then contained canary's code after the breaking change. However, before that PR was merged to main, we made several releases in `aws-sdk-rust`, making `release-2023-08-23` no longer the latest release before the breaking change; a new one is `release_2023_09_25`. Hence this PR. ## Testing Manually executed ``` ➜ canary-runner git:(ysaito/fix-canary-module-dates) cargo run -- build-bundle --canary-path ../canary-lambda --sdk-release-tag release-2023-09-25 --musl --manifest-only ➜ canary-runner git:(ysaito/fix-canary-module-dates) cd ../canary-lambda ➜ canary-lambda git:(ysaito/fix-canary-module-dates) cargo check ``` (also tested for `--sdk-release-tag` with `release-2023-09-22` and `release-2023-09-20`) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-cdk/canary-lambda/src/main.rs | 10 +++++----- ...release_2023_08_23.rs => release_2023_09_25.rs} | 0 .../paginator_canary.rs | 0 .../s3_canary.rs | 0 .../transcribe_canary.rs | 0 tools/ci-cdk/canary-runner/src/build_bundle.rs | 14 +++++++------- 6 files changed, 12 insertions(+), 12 deletions(-) rename tools/ci-cdk/canary-lambda/src/{release_2023_08_23.rs => release_2023_09_25.rs} (100%) rename tools/ci-cdk/canary-lambda/src/{release_2023_08_23 => release_2023_09_25}/paginator_canary.rs (100%) rename tools/ci-cdk/canary-lambda/src/{release_2023_08_23 => release_2023_09_25}/s3_canary.rs (100%) rename tools/ci-cdk/canary-lambda/src/{release_2023_08_23 => release_2023_09_25}/transcribe_canary.rs (100%) diff --git a/tools/ci-cdk/canary-lambda/src/main.rs b/tools/ci-cdk/canary-lambda/src/main.rs index 8fc6f4b2e76..644d7ce7954 100644 --- a/tools/ci-cdk/canary-lambda/src/main.rs +++ b/tools/ci-cdk/canary-lambda/src/main.rs @@ -26,11 +26,11 @@ mod latest; #[cfg(feature = "latest")] pub(crate) use latest as current_canary; -// NOTE: This module can be deleted 3 releases after release-2023-08-23 -#[cfg(feature = "release-2023-08-23")] -mod release_2023_08_23; -#[cfg(feature = "release-2023-08-23")] -pub(crate) use release_2023_08_23 as current_canary; +// NOTE: This module can be deleted 3 releases after release-2023-09-25 +#[cfg(feature = "release-2023-09-25")] +mod release_2023_09_25; +#[cfg(feature = "release-2023-09-25")] +pub(crate) use release_2023_09_25 as current_canary; #[tokio::main] async fn main() -> Result<(), Error> { diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_08_23.rs b/tools/ci-cdk/canary-lambda/src/release_2023_09_25.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_08_23.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_09_25.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_08_23/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_09_25/paginator_canary.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_08_23/paginator_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_09_25/paginator_canary.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_08_23/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_09_25/s3_canary.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_08_23/s3_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_09_25/s3_canary.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_08_23/transcribe_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_09_25/transcribe_canary.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_08_23/transcribe_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_09_25/transcribe_canary.rs diff --git a/tools/ci-cdk/canary-runner/src/build_bundle.rs b/tools/ci-cdk/canary-runner/src/build_bundle.rs index 4ec7861460e..6a6408b39ec 100644 --- a/tools/ci-cdk/canary-runner/src/build_bundle.rs +++ b/tools/ci-cdk/canary-runner/src/build_bundle.rs @@ -66,7 +66,7 @@ const REQUIRED_SDK_CRATES: &[&str] = &[ // The elements in this `Vec` should be sorted in an ascending order by the release date. lazy_static! { static ref NOTABLE_SDK_RELEASE_TAGS: Vec = vec![ - ReleaseTag::from_str("release-2023-08-23").unwrap(), // last version before `Stream` trait removal + ReleaseTag::from_str("release-2023-09-25").unwrap(), // last version before `Stream` trait removal ]; } @@ -442,7 +442,7 @@ aws-sdk-transcribestreaming = { path = "some/sdk/path/transcribestreaming" } [features] latest = [] -"release-2023-08-23" = [] +"release-2023-09-25" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::Path("some/sdk/path".into())).expect("success") @@ -506,7 +506,7 @@ aws-sdk-transcribestreaming = "0.16.0" [features] latest = [] -"release-2023-08-23" = [] +"release-2023-09-25" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::VersionsManifest { @@ -524,7 +524,7 @@ default = ["latest"] .collect(), release: None, }, - release_tag: ReleaseTag::from_str("release-2023-08-26").unwrap(), + release_tag: ReleaseTag::from_str("release-9999-12-31").unwrap(), }) .expect("success") ); @@ -585,14 +585,14 @@ default = ["latest"] }), ); assert_eq!( - "release-2023-08-23".to_string(), + "release-2023-09-25".to_string(), enabled_feature(&CrateSource::VersionsManifest { versions: versions.clone(), - release_tag: "release-2023-08-23".parse().unwrap(), + release_tag: "release-2023-09-25".parse().unwrap(), }), ); assert_eq!( - "release-2023-08-23".to_string(), + "release-2023-09-25".to_string(), enabled_feature(&CrateSource::VersionsManifest { versions, release_tag: "release-2023-01-13".parse().unwrap(), From f2041a423d92290396fcecbae969d6e4338c4ec4 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 29 Sep 2023 18:26:51 -0500 Subject: [PATCH 145/331] Specify tilde version requirements for runtime crates in manifest files (#3009) ## Motivation and Context This PR converts version requirements for runtime crates (those under `aws/rust-runtime` and those under `rust-runtime`) in manifest files into tilde requirements, allowing customers to safely incorporate only patch versions (from [The Cargo Book](https://doc.rust-lang.org/nightly/cargo/reference/specifying-dependencies.html)). ## Description Prior to the PR, if one opens the manifest file for an SDK create, a version requirement for a runtime crate looks like [this](https://github.com/awslabs/aws-sdk-rust/blob/655d490682e97ef799da85703520b5501fe91574/sdk/s3/Cargo.toml#L24-L27). Post general availability (GA), those runtime crates will have versions like `1.X.X` and if specified as such in a manifest file, it will be interpreted as `>=1.X.X, <2.0.0`. To protect customers from minor version bumps from runtime crates, we want to change their version requirements to [tilde requirements](https://doc.rust-lang.org/nightly/cargo/reference/specifying-dependencies.html#tilde-requirements) `~1.X`, which then supports a version range `>=1.X.0, <1.X+1.0`. Note that the change being discussed here is only concerned with version requirements of runtime crates. There is a runtime crate that depends on SDK crates (e.g. `aws-config` depending on `aws-sdk-sts`). In that case, we do _not_ want to turn the version requirement of the SDK crate into a tilde version because customers may depend on that SDK crate by themselves, causing multiple versions of it to be brought in to their crate graph. To support the above functionality, `publisher` has been updated. Specifically, when the `fix-manifests` subcommand runs, for runtime crates it will render the tilde version requirements into manifest files. Regarding a implementation detail, since the `semver::Version` used in `publisher` requires three components, `major.minor.patch`, to appear when version requirements are turned into in-memory data structure, it does not quite work well with non-semver version requirements. To address it, our own `crate::package::Version` has been introduced to handle both semver and versions that do not adhere to the semver specification. It then boils down to the `parse_version` function being updated to be able to parse an input string into `crate::package::Version`, as specified at call sites through a generic parameter `P: ParseIntoVersion`. ## Testing - Updated an existing unit test `test_validate_packages` in the `package` module. - Added a new unit test `sdk_crate_version_should_not_be_turned_into_tilde_requirement` to the `fix-manifests` subcommand. - Ran our internal release pipeline and confirmed the generated SDK crates have tilde dependencies for runtime crates in their manifest files. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/publisher/src/package.rs | 178 ++++++++++++++---- tools/ci-build/publisher/src/sort.rs | 27 +-- .../src/subcommand/claim_crate_names.rs | 7 +- .../publisher/src/subcommand/fix_manifests.rs | 102 ++++++++-- .../src/subcommand/fix_manifests/validate.rs | 5 +- .../subcommand/generate_version_manifest.rs | 9 +- .../publisher/src/subcommand/publish.rs | 10 +- 7 files changed, 257 insertions(+), 81 deletions(-) diff --git a/tools/ci-build/publisher/src/package.rs b/tools/ci-build/publisher/src/package.rs index c0cd981b0be..a19f8eee64e 100644 --- a/tools/ci-build/publisher/src/package.rs +++ b/tools/ci-build/publisher/src/package.rs @@ -10,14 +10,77 @@ use crate::sort::dependency_order; use crate::RUST_SDK_CI_OWNER; use anyhow::{Context, Result}; use cargo_toml::{Dependency, DepsSet, Manifest}; -use semver::Version; use smithy_rs_tool_common::package::PackageCategory; use std::collections::{BTreeMap, BTreeSet, HashSet}; use std::error::Error as StdError; use std::fmt; +use std::fmt::Formatter; use std::path::{Path, PathBuf}; +use std::str::FromStr; use tokio::fs; -use tracing::warn; +use tracing::{error, warn}; + +/// A trait that marks a type that can be created from `&str` and turned into +/// [`Version`] +/// +/// This trait is purely for convenience to reduce the number of generic parameters for functions, +/// that is, the functions only need to have a single generic parameter that implements this trait +/// instead of having to specify `ParsedT` and `Err` separately. +pub trait ParseIntoVersion { + type ParsedT: FromStr + Into; + type Err: Into; +} + +/// A type that indicates the `SemVer` variant of [`Version`] will be created as a result of parsing +pub struct SemVer; +impl ParseIntoVersion for SemVer { + type ParsedT = semver::Version; + type Err = semver::Error; +} + +/// A type that indicates the `Lenient` variant of [`Version`] will be created as a result of parsing +pub struct VersionRequirement; +impl ParseIntoVersion for VersionRequirement { + type ParsedT = String; + type Err = std::convert::Infallible; +} + +/// An enum that handles both semver as well as string values that do not adhere to the semver +/// specification. +/// +/// Most of the time, the `SemVer` variant will be used when manifest files are parsed into an +/// in-memory data structure. Those version strings can appear under the `[package]` section as +/// well as the dependency table within a manifest file. +/// The `VersionRequirement` variant is used when the `fix_manifests` subcommand and the +/// `generate_version_manifest` subcommand are executed, allowing version strings to be parsed into +/// tilde version requirements. +#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] +pub enum Version { + SemVer(semver::Version), + VersionRequirement(String), +} + +impl From for Version { + fn from(version: semver::Version) -> Self { + Version::SemVer(version) + } +} + +impl From for Version { + fn from(s: String) -> Self { + Version::VersionRequirement(s) + } +} + +impl fmt::Display for Version { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + let version = match self { + Version::SemVer(v) => v.to_string(), + Version::VersionRequirement(s) => s.clone(), + }; + write!(f, "{}", version) + } +} /// Information required to identify a package (crate). #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] @@ -27,10 +90,10 @@ pub struct PackageHandle { } impl PackageHandle { - pub fn new(name: impl Into, version: Version) -> Self { + pub fn new(name: impl Into, version: impl Into) -> Self { Self { name: name.into(), - version, + version: version.into(), } } } @@ -145,7 +208,7 @@ pub async fn discover_and_validate_package_batches( fs: Fs, path: impl AsRef, ) -> Result<(Vec, PackageStats)> { - let packages = discover_packages(fs, path.as_ref().into()) + let packages = discover_packages::(fs, path.as_ref().into()) .await? .into_iter() .filter(|package| package.publish == Publish::Allowed) @@ -171,6 +234,8 @@ pub enum Error { MissingVersion(PathBuf, String), #[error("crate {0} has multiple versions: {1} and {2}")] MultipleVersions(String, Version, Version), + #[error("multiple version requirements have been specified for crate {0}: {1} and {2}")] + MultipleVersionRequirements(String, Version, Version), } /// Discovers all Cargo.toml files under the given path recursively @@ -192,18 +257,24 @@ pub async fn discover_manifests(path: PathBuf) -> Result> { } /// Discovers and parses all Cargo.toml files that are packages (as opposed to being exclusively workspaces) -pub async fn discover_packages(fs: Fs, path: PathBuf) -> Result> { +pub async fn discover_packages(fs: Fs, path: PathBuf) -> Result> { let manifest_paths = discover_manifests(path).await?; - read_packages(fs, manifest_paths).await + read_packages::

(fs, manifest_paths).await } -/// Parses a semver version number and adds additional error context when parsing fails. -pub fn parse_version(manifest_path: &Path, version: &str) -> Result { - Version::parse(version) +/// Parses `version` into [`Version`] and adds additional error context when parsing fails. +pub fn parse_version( + manifest_path: &Path, + version: &str, +) -> Result { + P::ParsedT::from_str(version) .map_err(|err| Error::InvalidCrateVersion(manifest_path.into(), version.into(), err.into())) } -fn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result> { +fn read_dependencies( + path: &Path, + dependencies: &DepsSet, +) -> Result> { let mut result = Vec::new(); for (name, metadata) in dependencies { match metadata { @@ -213,7 +284,7 @@ fn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result(path, version)) .ok_or_else(|| Error::MissingVersion(path.into(), name.into()))??; result.push(PackageHandle::new(name, version)); } @@ -224,23 +295,28 @@ fn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result Result> { +fn read_package( + path: &Path, + manifest_bytes: &[u8], +) -> Result> { let manifest = Manifest::from_slice(manifest_bytes) .with_context(|| format!("failed to load package manifest for {:?}", path))?; if let Some(package) = manifest.package { let name = package.name; - let version = parse_version(path, &package.version)?; - let handle = PackageHandle { name, version }; + let version = parse_version::

(path, &package.version)?; + let handle = PackageHandle::new(name, version); let publish = match package.publish { cargo_toml::Publish::Flag(true) => Publish::Allowed, _ => Publish::NotAllowed, }; let mut local_dependencies = BTreeSet::new(); - local_dependencies.extend(read_dependencies(path, &manifest.dependencies)?.into_iter()); - local_dependencies.extend(read_dependencies(path, &manifest.dev_dependencies)?.into_iter()); local_dependencies - .extend(read_dependencies(path, &manifest.build_dependencies)?.into_iter()); + .extend(read_dependencies::

(path, &manifest.dependencies)?.into_iter()); + local_dependencies + .extend(read_dependencies::

(path, &manifest.dev_dependencies)?.into_iter()); + local_dependencies + .extend(read_dependencies::

(path, &manifest.build_dependencies)?.into_iter()); Ok(Some(Package::new( handle, path, @@ -255,38 +331,63 @@ fn read_package(path: &Path, manifest_bytes: &[u8]) -> Result> { /// Validates that all of the publishable crates use consistent version numbers /// across all of their local dependencies. fn validate_packages(packages: &[Package]) -> Result<()> { - let mut versions: BTreeMap = BTreeMap::new(); - let track_version = &mut |handle: &PackageHandle| -> Result<(), Error> { - if let Some(version) = versions.get(&handle.name) { + fn track_version( + handle: &PackageHandle, + map: &mut BTreeMap, + error_generator: F, + ) -> Result<(), Error> + where + F: FnOnce(String, Version, Version) -> Result<(), Error>, + { + if let Some(version) = map.get(&handle.name) { if *version != handle.version { - Err(Error::MultipleVersions( + error_generator( (&handle.name).into(), - versions[&handle.name].clone(), + map[&handle.name].clone(), handle.version.clone(), - )) + ) } else { Ok(()) } } else { - versions.insert(handle.name.clone(), handle.version.clone()); + map.insert(handle.name.clone(), handle.version.clone()); Ok(()) } - }; + } + let mut versions: BTreeMap = BTreeMap::new(); + let mut version_requirements: BTreeMap = BTreeMap::new(); for package in packages { - track_version(&package.handle)?; + track_version( + &package.handle, + &mut versions, + |crate_name, version_a, version_b| { + Err(Error::MultipleVersions(crate_name, version_a, version_b)) + }, + )?; for dependency in &package.local_dependencies { - track_version(dependency)?; + track_version( + dependency, + &mut version_requirements, + |crate_name, version_a, version_b| { + Err(Error::MultipleVersionRequirements( + crate_name, version_a, version_b, + )) + }, + )?; } } Ok(()) } -pub async fn read_packages(fs: Fs, manifest_paths: Vec) -> Result> { +pub async fn read_packages( + fs: Fs, + manifest_paths: Vec, +) -> Result> { let mut result = Vec::new(); for path in &manifest_paths { let contents: Vec = fs.read_file(path).await?; - if let Some(package) = read_package(path, &contents)? { + if let Some(package) = read_package::

(path, &contents)? { result.push(package); } } @@ -335,11 +436,10 @@ fn batch_packages(packages: Vec) -> Result> { #[cfg(test)] mod tests { use super::*; - use semver::Version; use std::path::PathBuf; fn version(version: &str) -> Version { - Version::parse(version).unwrap() + semver::Version::parse(version).unwrap().into() } #[test] @@ -363,7 +463,7 @@ mod tests { "#; let path: PathBuf = "test/Cargo.toml".into(); - let package = read_package(&path, manifest) + let package = read_package::(&path, manifest) .expect("parse success") .expect("is a package"); assert_eq!("test", package.handle.name); @@ -393,7 +493,7 @@ mod tests { let error = format!( "{}", - read_package(&path, manifest).expect_err("should fail") + read_package::(&path, manifest).expect_err("should fail") ); assert!( error.contains("Invalid crate version"), @@ -404,11 +504,11 @@ mod tests { fn package(name: &str, dependencies: &[&str]) -> Package { Package::new( - PackageHandle::new(name, Version::parse("1.0.0").unwrap()), + PackageHandle::new(name, semver::Version::parse("1.0.0").unwrap()), format!("{}/Cargo.toml", name), dependencies .iter() - .map(|d| PackageHandle::new(*d, Version::parse("1.0.0").unwrap())) + .map(|d| PackageHandle::new(*d, semver::Version::parse("1.0.0").unwrap())) .collect(), Publish::Allowed, ) @@ -486,11 +586,11 @@ mod tests { fn pkg_ver(name: &str, version: &str, dependencies: &[(&str, &str)]) -> Package { Package::new( - PackageHandle::new(name, Version::parse(version).unwrap()), + PackageHandle::new(name, semver::Version::parse(version).unwrap()), format!("{}/Cargo.toml", name), dependencies .iter() - .map(|p| PackageHandle::new(p.0, Version::parse(p.1).unwrap())) + .map(|p| PackageHandle::new(p.0, semver::Version::parse(p.1).unwrap())) .collect(), Publish::Allowed, ) @@ -526,7 +626,7 @@ mod tests { ]) .expect_err("fail"); assert_eq!( - "crate A has multiple versions: 1.1.0 and 1.0.0", + "multiple version requirements have been specified for crate A: 1.1.0 and 1.0.0", format!("{}", error) ); } diff --git a/tools/ci-build/publisher/src/sort.rs b/tools/ci-build/publisher/src/sort.rs index 5c1d2732944..2666e0fce95 100644 --- a/tools/ci-build/publisher/src/sort.rs +++ b/tools/ci-build/publisher/src/sort.rs @@ -12,9 +12,9 @@ use std::collections::{BTreeMap, BTreeSet}; /// Determines the dependency order of the given packages. pub fn dependency_order(packages: Vec) -> Result> { let mut order = Vec::new(); - let mut packages: BTreeMap = packages + let mut packages: BTreeMap = packages .into_iter() - .map(|p| (p.handle.clone(), p)) + .map(|p| (p.handle.name.clone(), p)) .collect(); let mut visited = BTreeSet::new(); @@ -22,7 +22,7 @@ pub fn dependency_order(packages: Vec) -> Result> { to_visit.sort_by(|a, b| a.local_dependencies.len().cmp(&b.local_dependencies.len())); // Depth-first search topological sort - while let Some(package) = to_visit.iter().find(|e| !visited.contains(&e.handle)) { + while let Some(package) = to_visit.iter().find(|e| !visited.contains(&e.handle.name)) { dependency_order_visit( &package.handle, &packages, @@ -34,27 +34,28 @@ pub fn dependency_order(packages: Vec) -> Result> { Ok(order .into_iter() - .map(&mut |handle| packages.remove(&handle).unwrap()) + .map(&mut |handle: PackageHandle| packages.remove(&handle.name).unwrap()) .collect()) } fn dependency_order_visit( package_handle: &PackageHandle, - packages: &BTreeMap, - stack: &mut BTreeSet, - visited: &mut BTreeSet, + packages: &BTreeMap, + stack: &mut BTreeSet, + visited: &mut BTreeSet, result: &mut Vec, ) -> Result<()> { - if visited.contains(package_handle) { + let crate_name = &package_handle.name; + if visited.contains(crate_name) { return Ok(()); } - if stack.contains(package_handle) { + if stack.contains(crate_name) { tracing::error!(stack = ?stack, handle = ?package_handle, "dependency cycle!"); bail!("dependency cycle detected"); } - stack.insert(package_handle.clone()); + stack.insert(crate_name.clone()); let local_dependencies = &packages - .get(package_handle) + .get(crate_name) .ok_or_else(|| { dbg!(packages); anyhow!("packages to publish doesn't contain {:?}", package_handle) @@ -63,8 +64,8 @@ fn dependency_order_visit( for dependency in local_dependencies { dependency_order_visit(dependency, packages, stack, visited, result)?; } - stack.remove(package_handle); - visited.insert(package_handle.clone()); + stack.remove(crate_name); + visited.insert(crate_name.clone()); result.push(package_handle.clone()); Ok(()) } diff --git a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs index ae7a41b3045..123b5ad5d53 100644 --- a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs +++ b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs @@ -3,13 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ use crate::fs::Fs; -use crate::package::{discover_packages, PackageHandle, Publish}; +use crate::package::{discover_packages, PackageHandle, Publish, SemVer}; use crate::publish::{has_been_published_on_crates_io, publish}; use crate::subcommand::publish::correct_owner; use crate::{cargo, SDK_REPO_NAME}; use clap::Parser; use dialoguer::Confirm; -use semver::Version; use smithy_rs_tool_common::git; use smithy_rs_tool_common::package::PackageCategory; use std::collections::HashSet; @@ -62,7 +61,7 @@ async fn claim_crate_name(name: &str) -> anyhow::Result<()> { create_dummy_lib_crate(Fs::Real, name, crate_dir_path.to_path_buf()).await?; let category = PackageCategory::from_package_name(name); - let package_handle = PackageHandle::new(name, Version::new(0, 0, 1)); + let package_handle = PackageHandle::new(name, semver::Version::new(0, 0, 1)); publish(&package_handle, crate_dir_path).await?; // Keep things slow to avoid getting throttled by crates.io tokio::time::sleep(Duration::from_secs(2)).await; @@ -77,7 +76,7 @@ async fn discover_publishable_crate_names(repository_root: &Path) -> anyhow::Res fs: Fs, path: PathBuf, ) -> anyhow::Result> { - let packages = discover_packages(fs, path).await?; + let packages = discover_packages::(fs, path).await?; let mut publishable_package_names = HashSet::new(); for package in packages { if let Publish::Allowed = package.publish { diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index 2d34c1aba74..148a22d0007 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -10,12 +10,12 @@ //! version numbers in addition to the dependency path. use crate::fs::Fs; -use crate::package::{discover_manifests, parse_version}; +use crate::package::{discover_manifests, parse_version, SemVer}; use crate::SDK_REPO_NAME; use anyhow::{bail, Context, Result}; use clap::Parser; -use semver::Version; use smithy_rs_tool_common::ci::running_in_ci; +use smithy_rs_tool_common::package::PackageCategory; use std::collections::BTreeMap; use std::ffi::OsStr; use std::path::{Path, PathBuf}; @@ -93,7 +93,7 @@ enum FilterType { } struct VersionView<'a>(&'a Versions, FilterType); impl VersionView<'_> { - fn get(&self, crate_name: &str) -> Option<&Version> { + fn get(&self, crate_name: &str) -> Option<&semver::Version> { let version = match (self.1, self.0 .0.get(crate_name)) { (FilterType::AllCrates, version) => version, (FilterType::PublishedOnly, v @ Some(VersionWithMetadata { publish: true, .. })) => v, @@ -112,20 +112,20 @@ impl Versions { VersionView(self, FilterType::PublishedOnly) } - fn published_crates(&self) -> impl Iterator + '_ { + fn published_crates(&self) -> impl Iterator + '_ { self.0 .iter() .filter(|(_, v)| v.publish) .map(|(k, v)| (k.as_str(), &v.version)) } - fn get(&self, crate_name: &str) -> Option<&Version> { + fn get(&self, crate_name: &str) -> Option<&semver::Version> { self.0.get(crate_name).map(|v| &v.version) } } struct VersionWithMetadata { - version: Version, + version: semver::Version, publish: bool, } @@ -162,7 +162,7 @@ fn package_versions(manifests: &[Manifest]) -> Result { .ok_or_else(|| { anyhow::Error::msg(format!("{:?} is missing a package version", manifest.path)) })?; - let version = parse_version(&manifest.path, version)?; + let version = parse_version::(&manifest.path, version)?; versions.insert(name.into(), VersionWithMetadata { version, publish }); } Ok(Versions(versions)) @@ -188,17 +188,32 @@ fn fix_dep_set(versions: &VersionView, key: &str, metadata: &mut Value) -> Resul Ok(changed) } +// Update a version of `dep_name` that has a path dependency to be that appearing in `versions`. +// +// While doing so, we will use the tilde version requirement so customers can update patch versions +// automatically. Specifically, we use tilde versions of the form `~major.minor` (e.g. `~1.2`) so +// it can support the range of versions `>=1.2.0, <1.3.0`. See +// https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#tilde-requirements fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Result { if !table.contains_key("path") { return Ok(0); } - let package_version = match versions.get(dep_name) { - Some(version) => version.to_string(), - None => bail!("version not found for crate {}", dep_name), + let package_version = versions + .get(dep_name) + .ok_or_else(|| anyhow::Error::msg(format!("version not found for crate {dep_name}")))?; + let package_version = if PackageCategory::from_package_name(dep_name) == PackageCategory::AwsSdk + { + // For a crate that depends on an SDK crate (e.g. `aws-config` depending on `aws-sdk-sts`), + // we do _not_ want to turn the version of the SDK crate into a tilde version because + // customers may depend on that SDK crate by themselves, causing multiple versions of it + // to be brought in to their crate graph. + package_version.to_string() + } else { + convert_to_tilde_requirement(package_version)? }; let previous_version = table.insert( "version".into(), - toml::Value::String(package_version.to_string()), + toml::Value::String(package_version.clone()), ); match previous_version { None => Ok(1), @@ -210,6 +225,32 @@ fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Resu } } +// Convert `package_version` into a tilde version requirement +// +// For instance, given `package_version` like `0.12.3`, the function returns `~0.12`. +// The fact that this function takes a `semver::Version` means one can only convert a complete +// semver `x.y.z` into a tilde version requirement, but not those like `0.21.0-alpha.1`. +fn convert_to_tilde_requirement(package_version: &semver::Version) -> Result { + // `package_version` is from the `semver` crate which requires versions to have 3 components, + // major, minor, and patch. So it is safe to assume its string value follows that format. + let package_version = package_version.to_string(); + let package_version = match package_version.rfind('.') { + // Here, we're interested in the `major.minor` part. + Some(index) => { + assert_eq!( + 2, + package_version.chars().filter(|&c| c == '.').count(), + "The number of `.` in {} is not 2", + package_version + ); + &package_version[0..index] + } + None => bail!("{} did not have any dots in it", package_version), + }; + + Ok("~".to_string() + package_version) +} + fn fix_dep_sets(versions: &VersionView, metadata: &mut toml::Value) -> Result { let mut changed = fix_dep_set(versions, "dependencies", metadata)?; // allow dev dependencies to be unpublished @@ -326,7 +367,7 @@ mod tests { ( name.to_string(), VersionWithMetadata { - version: Version::parse(&version).unwrap(), + version: semver::Version::parse(&version).unwrap(), publish, }, ) @@ -412,7 +453,7 @@ mod tests { \n\ [local_something]\n\ path = \"../local_something\"\n\ - version = \"1.1.3\"\n\ + version = \"~1.1\"\n\ ", actual_deps.to_string() ); @@ -424,7 +465,7 @@ mod tests { \n\ [local_dev_something]\n\ path = \"../local_dev_something\"\n\ - version = \"0.1.0\"\n\ + version = \"~0.1\"\n\ ", actual_dev_deps.to_string() ); @@ -436,12 +477,43 @@ mod tests { \n\ [local_build_something]\n\ path = \"../local_build_something\"\n\ - version = \"0.2.0\"\n\ + version = \"~0.2\"\n\ ", actual_build_deps.to_string() ); } + #[test] + fn sdk_crate_version_should_not_be_turned_into_tilde_requirement() { + let manifest = br#" + [package] + name = "test" + version = "1.2.0-preview" + + [dependencies] + aws-sdk-example = { path = "../aws/sdk/example" } + "#; + let metadata = toml::from_slice(manifest).unwrap(); + let mut manifest = Manifest { + path: "test".into(), + metadata, + }; + let versions = &[("aws-sdk-example", "0.2.0", true)]; + let versions = make_versions(versions.iter()); + + fix_dep_sets(&versions.published(), &mut manifest.metadata).expect("success"); + + let actual_deps = &manifest.metadata["dependencies"]; + assert_eq!( + "\ + [aws-sdk-example]\n\ + path = \"../aws/sdk/example\"\n\ + version = \"0.2.0\"\n\ + ", + actual_deps.to_string() + ); + } + #[test] fn test_is_example_manifest() { assert!(!is_example_manifest("aws-sdk-rust/sdk/s3/Cargo.toml")); diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs index 40aa8f609ac..4a3424d32db 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs @@ -7,7 +7,6 @@ use crate::fs::Fs; use crate::package::discover_and_validate_package_batches; use crate::subcommand::fix_manifests::Versions; use anyhow::{anyhow, bail, Result}; -use semver::Version; use smithy_rs_tool_common::package::PackageCategory; use std::path::Path; use tracing::info; @@ -39,7 +38,7 @@ pub(super) fn validate_before_fixes( Ok(()) } -fn confirm_version(name: &str, expected: &Version, actual: &Version) -> Result<()> { +fn confirm_version(name: &str, expected: &semver::Version, actual: &semver::Version) -> Result<()> { if expected != actual { bail!( "Crate named `{}` should be at version `{}` but is at `{}`", @@ -73,7 +72,7 @@ mod test { map.insert( (*name).into(), VersionWithMetadata { - version: Version::from_str(version).unwrap(), + version: semver::Version::from_str(version).unwrap(), publish: true, }, ); diff --git a/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs b/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs index 6b9ac35397b..46636a5ef28 100644 --- a/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs +++ b/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs @@ -4,10 +4,9 @@ */ use crate::fs::Fs; -use crate::package::discover_packages; +use crate::package::{discover_packages, VersionRequirement}; use anyhow::{bail, Context, Result}; use clap::Parser; -use semver::Version; use serde::Deserialize; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::package::PackageCategory; @@ -70,7 +69,7 @@ pub async fn subcommand_generate_version_manifest( (None, Some(output_location)) => output_location, _ => bail!("Only one of `--location` or `--output-location` should be provided"), }; - let packages = discover_packages(Fs::Real, input_location.into()) + let packages = discover_packages::(Fs::Real, input_location.into()) .await .context("read packages")?; @@ -135,8 +134,8 @@ fn generate_release_metadata( } } -fn parse_version(name: &str, value: &str) -> Result { - match Version::parse(value) { +fn parse_version(name: &str, value: &str) -> Result { + match semver::Version::parse(value) { Ok(version) => Ok(version), Err(err) => bail!( "Failed to parse version number `{}` from `{}`: {}", diff --git a/tools/ci-build/publisher/src/subcommand/publish.rs b/tools/ci-build/publisher/src/subcommand/publish.rs index dfa2c7af543..45701214123 100644 --- a/tools/ci-build/publisher/src/subcommand/publish.rs +++ b/tools/ci-build/publisher/src/subcommand/publish.rs @@ -249,10 +249,16 @@ mod test { #[ignore] #[tokio::test] async fn crate_published_works() { - let handle = PackageHandle::new("aws-smithy-http", "0.27.0-alpha.1".parse().unwrap()); + let handle = PackageHandle::new( + "aws-smithy-http", + "0.27.0-alpha.1".parse::().unwrap(), + ); assert!(is_published(&handle).await.expect("failed")); // we will never publish this version - let handle = PackageHandle::new("aws-smithy-http", "0.21.0-alpha.1".parse().unwrap()); + let handle = PackageHandle::new( + "aws-smithy-http", + "0.21.0-alpha.1".parse::().unwrap(), + ); assert!(!is_published(&handle).await.expect("failed")); } } From 5129c1f5f029251625ba14537bcfc77ef4d82c6a Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 2 Oct 2023 09:32:50 -0400 Subject: [PATCH 146/331] Remove ProviderConfig as the configuration source for AssumeRoleProvider (#3014) ## Motivation and Context `AssumeRoleProvider` currently uses `ProviderConfig` as a source of configuration, but that API is hard use and not intended for external consumption. This fixes the Assume Role issue but only for `AssumeRoleProvider` ## Description Update the API (see changelog) to be more ergonomic and derive configuration from `SdkConfig` instead. ## Testing Existing tests + new unit tests ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 + aws/rust-runtime/aws-config/src/lib.rs | 9 +- .../aws-config/src/sts/assume_role.rs | 272 +++++++++++++----- aws/rust-runtime/aws-types/src/sdk_config.rs | 23 ++ rust-runtime/aws-smithy-async/src/time.rs | 7 +- 5 files changed, 249 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8407592edba..620e4e2c33f 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -253,3 +253,11 @@ message = "The IMDS Client builder's `build()` method is no longer async." references = ["smithy-rs#2997"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" + +[[aws-sdk-rust]] +message = """The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`. + +For more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)""" +meta = { "breaking" = true, "tada" = false, "bug" = false } +references = ["smithy-rs#3014"] +author = "rcoh" diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 18fc00e46aa..e1d8657d86d 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -808,13 +808,18 @@ mod loader { movable.fetch_add(1, Ordering::Relaxed); http::Response::new("ok!") }); - let config = from_env().http_connector(conn.clone()).load().await; + let config = from_env() + .fs(Fs::from_slice(&[])) + .env(Env::from_slice(&[])) + .http_connector(conn.clone()) + .load() + .await; config .credentials_provider() .unwrap() .provide_credentials() .await - .expect_err("no traffic is allowed"); + .expect_err("did not expect credentials to be loaded—no traffic is allowed"); let num_requests = num_requests.load(Ordering::Relaxed); assert!(num_requests > 0, "{}", num_requests); } diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 90cd91195f8..3dd290fc82f 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -5,18 +5,18 @@ //! Assume credentials for a role through the AWS Security Token Service (STS). -use crate::connector::expect_connector; -use crate::provider_config::ProviderConfig; use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; +use aws_credential_types::provider::{ + self, error::CredentialsError, future, ProvideCredentials, SharedCredentialsProvider, +}; use aws_sdk_sts::operation::assume_role::builders::AssumeRoleFluentBuilder; use aws_sdk_sts::operation::assume_role::AssumeRoleError; use aws_sdk_sts::types::PolicyDescriptorType; use aws_sdk_sts::Client as StsClient; -use aws_smithy_client::erase::DynConnector; use aws_smithy_http::result::SdkError; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::region::Region; +use aws_types::SdkConfig; use std::time::Duration; use tracing::Instrument; @@ -28,19 +28,44 @@ use tracing::Instrument; /// the desired role. /// /// # Examples +/// Create an AssumeRoleProvider explicitly set to us-east-2 that utilizes the default credentials chain. /// ```no_run -/// use aws_credential_types::Credentials; -/// use aws_config::sts::{AssumeRoleProvider}; +/// use aws_config::sts::AssumeRoleProvider; /// use aws_types::region::Region; -/// use aws_config::environment; -/// use aws_config::environment::credentials::EnvironmentVariableCredentialsProvider; -/// use std::sync::Arc; -/// +/// # async fn docs() { /// let provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/demo") /// .region(Region::from_static("us-east-2")) /// .session_name("testAR") -/// .build(Arc::new(EnvironmentVariableCredentialsProvider::new()) as Arc<_>); +/// .build().await; +/// } +/// ``` +/// +/// Create an AssumeRoleProvider from an explicitly configured base configuration. +/// ```no_run +/// use aws_config::sts::AssumeRoleProvider; +/// use aws_types::region::Region; +/// # async fn docs() { +/// let conf = aws_config::from_env().use_fips(true).load().await; +/// let provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/demo") +/// .configure(&conf) +/// .session_name("testAR") +/// .build().await; +/// } /// ``` +/// +/// Create an AssumeroleProvider that sources credentials from a provider credential provider: +/// ```no_run +/// use aws_config::sts::AssumeRoleProvider; +/// use aws_types::region::Region; +/// use aws_config::environment::EnvironmentVariableCredentialsProvider; +/// # async fn docs() { +/// let provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/demo") +/// .session_name("test-assume-role-session") +/// // only consider environment variables, explicitly. +/// .build_from_provider(EnvironmentVariableCredentialsProvider::new()).await; +/// } +/// ``` +/// #[derive(Debug)] pub struct AssumeRoleProvider { inner: Inner, @@ -72,12 +97,14 @@ pub struct AssumeRoleProviderBuilder { role_arn: String, external_id: Option, session_name: Option, - region: Option, - conf: Option, session_length: Option, policy: Option, policy_arns: Option>, + + region_override: Option, + credentials_cache: Option, + sdk_config: Option, } impl AssumeRoleProviderBuilder { @@ -91,14 +118,14 @@ impl AssumeRoleProviderBuilder { pub fn new(role: impl Into) -> Self { Self { role_arn: role.into(), + credentials_cache: None, external_id: None, session_name: None, session_length: None, - region: None, - conf: None, policy: None, policy_arns: None, - credentials_cache: None, + sdk_config: None, + region_override: None, } } @@ -162,20 +189,10 @@ impl AssumeRoleProviderBuilder { /// Set the region to assume the role in. /// - /// This dictates which STS endpoint the AssumeRole action is invoked on. + /// This dictates which STS endpoint the AssumeRole action is invoked on. This will override + /// a region set from `.configure(...)` pub fn region(mut self, region: Region) -> Self { - self.region = Some(region); - self - } - - /// If the `rustls` or `nativetls` features are enabled, this field is optional and a default - /// backing connection will be provided. - pub fn connection(mut self, conn: impl aws_smithy_client::bounds::SmithyConnector) -> Self { - let conf = match self.conf { - Some(conf) => conf.with_http_connector(DynConnector::new(conn)), - None => ProviderConfig::default().with_http_connector(DynConnector::new(conn)), - }; - self.conf = Some(conf); + self.region_override = Some(region); self } @@ -191,36 +208,57 @@ impl AssumeRoleProviderBuilder { self } - /// Override the configuration used for this provider + /// Sets the configuration used for this provider /// /// This enables overriding the connection used to communicate with STS in addition to other internal /// fields like the time source and sleep implementation used for caching. - pub fn configure(mut self, conf: &ProviderConfig) -> Self { - self.conf = Some(conf.clone()); + /// + /// If this field is not provided, configuration from [`aws_config::load_from_env().await`] is used. + /// + /// # Examples + /// ```rust + /// # async fn docs() { + /// use aws_types::region::Region; + /// use aws_config::sts::AssumeRoleProvider; + /// let config = aws_config::from_env().region(Region::from_static("us-west-2")).load().await; + /// let assume_role_provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/example") + /// .configure(&config) + /// .build(); + /// } + pub fn configure(mut self, conf: &SdkConfig) -> Self { + self.sdk_config = Some(conf.clone()); self } - /// Build a credentials provider for this role authorized by the given `provider`. - pub fn build(self, provider: impl ProvideCredentials + 'static) -> AssumeRoleProvider { - let conf = self.conf.unwrap_or_default(); - - let credentials_cache = self - .credentials_cache - .unwrap_or_else(CredentialsCache::no_caching); - - let mut config = aws_sdk_sts::Config::builder() - .credentials_cache(credentials_cache) - .credentials_provider(provider) - .time_source(conf.time_source()) - .region(self.region.clone()) - .http_connector(expect_connector( - "The AssumeRole credentials provider", - conf.connector(&Default::default()), - )); - config.set_sleep_impl(conf.sleep()); + /// Build a credentials provider for this role. + /// + /// Base credentials will be used from the [`SdkConfig`] set via [`Self::configure`] or loaded + /// from [`aws_config::from_env`](crate::from_env) if `configure` was never called. + pub async fn build(self) -> AssumeRoleProvider { + let mut conf = match self.sdk_config { + Some(conf) => conf, + None => crate::load_from_env().await, + }; + // ignore a credentials cache set from SdkConfig + conf = conf + .into_builder() + .credentials_cache( + self.credentials_cache + .unwrap_or(CredentialsCache::no_caching()), + ) + .build(); + + // set a region override if one exists + if let Some(region) = self.region_override { + conf = conf.into_builder().region(region).build() + } + + let config = aws_sdk_sts::config::Builder::from(&conf); + + let time_source = conf.time_source().expect("A time source must be provided."); let session_name = self.session_name.unwrap_or_else(|| { - super::util::default_session_name("assume-role-provider", conf.time_source().now()) + super::util::default_session_name("assume-role-provider", time_source.now()) }); let sts_client = StsClient::from_conf(config.build()); @@ -237,6 +275,23 @@ impl AssumeRoleProviderBuilder { inner: Inner { fluent_builder }, } } + + /// Build a credentials provider for this role authorized by the given `provider`. + pub async fn build_from_provider( + mut self, + provider: impl ProvideCredentials + 'static, + ) -> AssumeRoleProvider { + let conf = match self.sdk_config { + Some(conf) => conf, + None => crate::load_from_env().await, + }; + let conf = conf + .into_builder() + .credentials_provider(SharedCredentialsProvider::new(provider)) + .build(); + self.sdk_config = Some(conf); + self.build().await + } } impl Inner { @@ -287,40 +342,121 @@ impl ProvideCredentials for AssumeRoleProvider { #[cfg(test)] mod test { - use crate::provider_config::ProviderConfig; use crate::sts::AssumeRoleProvider; use aws_credential_types::credential_fn::provide_credentials_fn; - use aws_credential_types::provider::ProvideCredentials; + use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; use aws_credential_types::Credentials; - use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::StaticTimeSource; use aws_smithy_client::erase::DynConnector; use aws_smithy_client::test_connection::{capture_request, TestConnection}; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_types::os_shim_internal::Env; use aws_types::region::Region; + use aws_types::SdkConfig; + use http::header::AUTHORIZATION; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn configures_session_length() { let (server, request) = capture_request(None); - let provider_conf = ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_time_source(StaticTimeSource::new( + let provider_conf = SdkConfig::builder() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), )) - .with_http_connector(DynConnector::new(server)); + .http_connector(DynConnector::new(server)) + .region(Region::from_static("this-will-be-overridden")) + .build(); let provider = AssumeRoleProvider::builder("myrole") .configure(&provider_conf) .region(Region::new("us-east-1")) .session_length(Duration::from_secs(1234567)) - .build(provide_credentials_fn(|| async { + .build_from_provider(provide_credentials_fn(|| async { Ok(Credentials::for_tests()) - })); - let _ = provider.provide_credentials().await; + })) + .await; + let _ = dbg!(provider.provide_credentials().await); let req = request.expect_request(); let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap(); assert!(str_body.contains("1234567"), "{}", str_body); + assert_eq!(req.uri(), "https://sts.us-east-1.amazonaws.com"); + } + + #[tokio::test] + async fn loads_region_from_sdk_config() { + let (server, request) = capture_request(None); + let provider_conf = SdkConfig::builder() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .time_source(StaticTimeSource::new( + UNIX_EPOCH + Duration::from_secs(1234567890 - 120), + )) + .http_connector(DynConnector::new(server)) + .credentials_provider(SharedCredentialsProvider::new(provide_credentials_fn( + || async { + panic!("don't call me — will be overridden"); + #[allow(unreachable_code)] + Ok(Credentials::for_tests()) + }, + ))) + .region(Region::from_static("us-west-2")) + .build(); + let provider = AssumeRoleProvider::builder("myrole") + .configure(&provider_conf) + .session_length(Duration::from_secs(1234567)) + .build_from_provider(provide_credentials_fn(|| async { + Ok(Credentials::for_tests()) + })) + .await; + let _ = dbg!(provider.provide_credentials().await); + let req = request.expect_request(); + assert_eq!(req.uri(), "https://sts.us-west-2.amazonaws.com"); + } + + /// Test that `build()` where no provider is passed still works + #[tokio::test] + async fn build_method_from_sdk_config() { + let _guard = capture_test_logs(); + let (server, request) = capture_request(Some( + http::Response::builder() + .status(404) + .body(SdkBody::from("")) + .unwrap(), + )); + let conf = crate::from_env() + .env(Env::from_slice(&[ + ("AWS_ACCESS_KEY_ID", "123-key"), + ("AWS_SECRET_ACCESS_KEY", "456"), + ("AWS_REGION", "us-west-17"), + ])) + .use_dual_stack(true) + .use_fips(true) + .time_source(StaticTimeSource::from_secs(1234567890)) + .http_connector(server) + .load() + .await; + let provider = AssumeRoleProvider::builder("role") + .configure(&conf) + .build() + .await; + let _ = provider.provide_credentials().await; + let req = request.expect_request(); + let auth_header = req + .headers() + .get(AUTHORIZATION) + .unwrap() + .to_str() + .unwrap() + .to_string(); + let expect = "Credential=123-key/20090213/us-west-17/sts/aws4_request"; + assert!( + auth_header.contains(expect), + "Expected header to contain {expect} but it was {auth_header}" + ); + // ensure that FIPS & DualStack are also respected + assert_eq!("https://sts-fips.us-west-17.api.aws/", req.uri()) } #[tokio::test] @@ -340,10 +476,11 @@ mod test { UNIX_EPOCH + Duration::from_secs(1234567890 - 120), // 1234567890 since UNIX_EPOCH is 2009-02-13T23:31:30Z ); - let provider_conf = ProviderConfig::empty() - .with_sleep(sleep) - .with_time_source(testing_time_source.clone()) - .with_http_connector(DynConnector::new(conn)); + let provider_conf = SdkConfig::builder() + .sleep_impl(SharedAsyncSleep::new(sleep)) + .time_source(testing_time_source.clone()) + .http_connector(DynConnector::new(conn)) + .build(); let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![ Credentials::new( "test", @@ -364,13 +501,14 @@ mod test { let provider = AssumeRoleProvider::builder("myrole") .configure(&provider_conf) .region(Region::new("us-east-1")) - .build(provide_credentials_fn(move || { + .build_from_provider(provide_credentials_fn(move || { let list = credentials_list.clone(); async move { let next = list.lock().unwrap().remove(0); Ok(next) } - })); + })) + .await; let creds_first = provider .provide_credentials() diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 08e49469ba2..81ce7d35c27 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -602,4 +602,27 @@ impl SdkConfig { pub fn builder() -> Builder { Builder::default() } + + /// Convert this [`SdkConfig`] into a [`Builder`] by cloning it first + pub fn to_builder(&self) -> Builder { + self.clone().into_builder() + } + + /// Convert this [`SdkConfig`] back to a builder to enable modification + pub fn into_builder(self) -> Builder { + Builder { + app_name: self.app_name, + credentials_cache: self.credentials_cache, + credentials_provider: self.credentials_provider, + region: self.region, + endpoint_url: self.endpoint_url, + retry_config: self.retry_config, + sleep_impl: self.sleep_impl, + time_source: self.time_source, + timeout_config: self.timeout_config, + http_connector: self.http_connector, + use_fips: self.use_fips, + use_dual_stack: self.use_dual_stack, + } + } } diff --git a/rust-runtime/aws-smithy-async/src/time.rs b/rust-runtime/aws-smithy-async/src/time.rs index b1b3f5ac1ff..77e1ef05855 100644 --- a/rust-runtime/aws-smithy-async/src/time.rs +++ b/rust-runtime/aws-smithy-async/src/time.rs @@ -6,7 +6,7 @@ //! Time source abstraction to support WASM and testing use std::fmt::Debug; use std::sync::Arc; -use std::time::SystemTime; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; /// Trait with a `now()` function returning the current time pub trait TimeSource: Debug + Send + Sync { @@ -51,6 +51,11 @@ impl StaticTimeSource { pub fn new(time: SystemTime) -> Self { Self { time } } + + /// Creates a new static time source from the provided number of seconds since the UNIX epoch + pub fn from_secs(epoch_secs: u64) -> Self { + Self::new(UNIX_EPOCH + Duration::from_secs(epoch_secs)) + } } impl TimeSource for StaticTimeSource { From cd09fd27838c711cd64de0e34eedf71387b26cbd Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 3 Oct 2023 13:23:29 -0400 Subject: [PATCH 147/331] Allow warnings in examples compilation (#3020) ## Motivation and Context ** needs backport ** Allow warnings in examples compilation ## Description ## Testing Verified that `RUSTFLAGS=""` works as expected. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-scripts/check-aws-sdk-examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/ci-scripts/check-aws-sdk-examples b/tools/ci-scripts/check-aws-sdk-examples index 2efc2752a16..1bb249baea5 100755 --- a/tools/ci-scripts/check-aws-sdk-examples +++ b/tools/ci-scripts/check-aws-sdk-examples @@ -13,7 +13,7 @@ cd aws-sdk/examples for example in *; do echo -e "${C_YELLOW}Checking examples/${example}...${C_RESET}" pushd "${example}" &>/dev/null - cargo check + RUSTFLAGS="" cargo check cargo clean popd &>/dev/null done From 40aaa1e4ab025c88ac3954c971390edf6f645b6e Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 3 Oct 2023 22:44:54 -0500 Subject: [PATCH 148/331] Ensure identity resolver exists when a credentials provider is given only at operation level (#3021) ## Motivation and Context Fixes https://github.com/awslabs/aws-sdk-rust/issues/901 ## Description When a credentials provider is specified _only_ at the operation level (but not at the service config level), the code in the above PR fails on request dispatch, saying `NoMatchingAuthScheme`. This occurs today because if we [do not set a credentials provider at the service config level](https://github.com/awslabs/aws-sdk-rust/blob/main/sdk/kms/src/config.rs#L757-L769), we will [not set the identity resolver for sigv4](https://github.com/awslabs/aws-sdk-rust/blob/main/sdk/kms/src/config.rs#L811-L818). The same goes for configuring a `SigningRegion` when it is only supplied at the operation level. This PR fixes the said issue so that `config_override` sets - the identity resolver for sigv4 when a credentials provider is supplied only at the operation config level - a `SigningRegion` when a `Region` is given only at the operation level ## Testing Added a Kotlin integ test `test_specifying_credentials_provider_only_at_operation_level_should_work` based on the customer reported PR. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 6 ++ .../amazon/smithy/rustsdk/CredentialCaches.kt | 19 +++- .../smithy/rustsdk/SigV4SigningDecorator.kt | 13 +++ .../rustsdk/CredentialCacheConfigTest.kt | 88 +++++++------------ 4 files changed, 69 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 75711a0c91b..f04f291ca12 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -46,3 +46,9 @@ message = "Fix code generation for union members with the `@httpPayload` trait." references = ["smithy-rs#2969", "smithy-rs#1896"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Fix exclusively setting the credentials provider and/or region at operation config-override time. It's now possible to set the region or credentials when an operation is sent (via `.config_override()`), rather than at client-creation time." +references = ["smithy-rs#3021", "aws-sdk-rust#901"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index c25001cb303..5678dcc7cb9 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -57,10 +57,17 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom private val codegenScope = arrayOf( *preludeScope, "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("cache::CredentialsCache"), + "CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("identity::credentials::CredentialsIdentityResolver"), "DefaultProvider" to defaultProvider(), + "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve("auth::sigv4::SCHEME_ID"), "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("cache::SharedCredentialsCache"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("provider::SharedCredentialsProvider"), + "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("cache::SharedCredentialsCache"), + "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::SharedCredentialsProvider"), + "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::identity::SharedIdentityResolver"), ) override fun section(section: ServiceConfig) = writable { @@ -209,7 +216,13 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom #{Some}(credentials_cache), #{Some}(credentials_provider), ) => { - resolver.config_mut().store_put(credentials_cache.create_cache(credentials_provider)); + let credentials_cache = credentials_cache.create_cache(credentials_provider); + resolver.runtime_components_mut().push_identity_resolver( + #{SIGV4_SCHEME_ID}, + #{SharedIdentityResolver}::new( + #{CredentialsIdentityResolver}::new(credentials_cache), + ), + ); } } """, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt index c7ba6f9c60e..3487530b787 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt @@ -120,6 +120,19 @@ class SigV4SigningConfig( ) } } + is ServiceConfig.OperationConfigOverride -> { + if (runtimeMode.generateOrchestrator) { + rustTemplate( + """ + resolver.config_mut() + .load::<#{Region}>() + .cloned() + .map(|r| resolver.config_mut().store_put(#{SigningRegion}::from(r))); + """, + *codegenScope, + ) + } + } else -> emptySection } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt index 960d3adbaf3..cb2f679fb3c 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt @@ -19,10 +19,13 @@ internal class CredentialCacheConfigTest { namespace com.example use aws.protocols#awsJson1_0 use aws.api#service + use aws.auth#sigv4 use smithy.rules#endpointRuleSet @service(sdkId: "Some Value") @awsJson1_0 + @sigv4(name: "dontcare") + @auth([sigv4]) @endpointRuleSet({ "version": "1.0", "rules": [{ @@ -39,7 +42,6 @@ internal class CredentialCacheConfigTest { version: "1" } - @optionalAuth operation SayHello { input: TestInput } structure TestInput { foo: String, @@ -56,14 +58,11 @@ internal class CredentialCacheConfigTest { .resolve("Credentials"), "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) .resolve("cache::CredentialsCache"), - "ProvideCachedCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::ProvideCachedCredentials"), + "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), "RuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::runtime_plugin::RuntimePlugin"), "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) .resolve("cache::SharedCredentialsCache"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::SharedCredentialsProvider"), ) rustCrate.testModule { unitTest( @@ -114,74 +113,55 @@ internal class CredentialCacheConfigTest { ) } - tokioTest("test_overriding_cache_and_provider_leads_to_shared_credentials_cache_in_layer") { + unitTest("test_not_overriding_cache_and_provider_leads_to_no_shared_credentials_cache_in_layer") { rustTemplate( """ - use #{ProvideCachedCredentials}; use #{RuntimePlugin}; - let client_config = crate::config::Config::builder() - .credentials_provider(#{Credentials}::for_tests()) - .build(); - let client_config_layer = client_config.config; - - // make sure test credentials are set in the client config level - assert_eq!(#{Credentials}::for_tests(), - client_config_layer - .load::<#{SharedCredentialsCache}>() - .unwrap() - .provide_cached_credentials() - .await - .unwrap() - ); - - let credentials = #{Credentials}::new( - "test", - "test", - #{None}, - #{None}, - "test", - ); - let config_override = crate::config::Config::builder() - .credentials_cache(#{CredentialsCache}::lazy()) - .credentials_provider(credentials.clone()); + let client_config = crate::config::Config::builder().build(); + let config_override = crate::config::Config::builder(); let sut = crate::config::ConfigOverrideRuntimePlugin::new( config_override, - client_config_layer, + client_config.config, &client_config.runtime_components, ); let sut_layer = sut.config().unwrap(); - - // make sure `.provide_cached_credentials` returns credentials set through `config_override` - assert_eq!(credentials, - sut_layer + assert!(sut_layer .load::<#{SharedCredentialsCache}>() - .unwrap() - .provide_cached_credentials() - .await - .unwrap() - ); + .is_none()); """, *codegenScope, ) } - unitTest("test_not_overriding_cache_and_provider_leads_to_no_shared_credentials_cache_in_layer") { + tokioTest("test_specifying_credentials_provider_only_at_operation_level_should_work") { + // per https://github.com/awslabs/aws-sdk-rust/issues/901 rustTemplate( """ - use #{RuntimePlugin}; - let client_config = crate::config::Config::builder().build(); - let config_override = crate::config::Config::builder(); - let sut = crate::config::ConfigOverrideRuntimePlugin::new( - config_override, - client_config.config, - &client_config.runtime_components, + let client = crate::client::Client::from_conf(client_config); + + let credentials = #{Credentials}::new( + "test", + "test", + #{None}, + #{None}, + "test", ); - let sut_layer = sut.config().unwrap(); - assert!(sut_layer - .load::<#{SharedCredentialsCache}>() - .is_none()); + let operation_config_override = crate::config::Config::builder() + .credentials_cache(#{CredentialsCache}::no_caching()) + .credentials_provider(credentials.clone()) + .region(#{Region}::new("us-west-2")); + + let _ = client + .say_hello() + .customize() + .await + .unwrap() + .config_override(operation_config_override) + .send() + .await + .expect("success"); """, *codegenScope, ) From bb3568869627a72762bb12c6915d44d57d12ae66 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Wed, 4 Oct 2023 10:02:14 -0500 Subject: [PATCH 149/331] fix use_fips in provider config (#3007) I'm not 100% that I fixed this in the right way. Feel free to set me straight if that's the case. ## Motivation and Context aws-sdk-rust#882 ## Description This change causes the`ProviderConfig` to respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile. ## Testing I wrote two tests ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 6 + .../src/default_provider/credentials.rs | 3 + .../aws-config/src/environment/credentials.rs | 2 +- aws/rust-runtime/aws-config/src/lib.rs | 29 +++-- .../aws-config/src/profile/credentials.rs | 17 ++- .../src/profile/credentials/exec.rs | 21 ++-- .../aws-config/src/provider_config.rs | 62 ++++++++-- aws/rust-runtime/aws-config/src/sso.rs | 27 ++--- aws/rust-runtime/aws-config/src/sts.rs | 19 ---- .../aws-config/src/sts/assume_role.rs | 14 +-- aws/rust-runtime/aws-config/src/test_case.rs | 9 ++ .../aws-config/src/web_identity_token.rs | 2 +- .../e2e_fips_and_dual_stack_sso/env.json | 7 ++ .../fs/home/.aws/config | 6 + ...e00cba5f8355ec9d274ceb2bcebdfbeed0e12.json | 5 + .../http-traffic.json | 93 +++++++++++++++ .../test-case.json | 12 ++ .../e2e_fips_and_dual_stack_sts/env.json | 3 + .../fs/home/.aws/config | 9 ++ .../fs/home/.aws/credentials | 3 + .../http-traffic.json | 107 ++++++++++++++++++ .../test-case.json | 12 ++ 22 files changed, 384 insertions(+), 84 deletions(-) create mode 100644 aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json create mode 100644 aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config create mode 100644 aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json create mode 100644 aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json create mode 100644 aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json create mode 100644 aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json create mode 100644 aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config create mode 100644 aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials create mode 100644 aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json create mode 100644 aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 620e4e2c33f..d9ed616628f 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -261,3 +261,9 @@ For more information, see the [Change Log Discussion](https://github.com/awslabs meta = { "breaking" = true, "tada" = false, "bug" = false } references = ["smithy-rs#3014"] author = "rcoh" + +[[aws-sdk-rust]] +message = "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile." +references = ["aws-sdk-rust#882", "smithy-rs#3007"] +meta = { "breaking" = true, "tada" = true, "bug" = true } +author = "Velfi" diff --git a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs index a5e1fb0dc5d..30fd0101acf 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs @@ -306,6 +306,9 @@ mod test { #[cfg(feature = "credentials-sso")] make_test!(sso_no_token_file); + #[cfg(feature = "credentials-sso")] + make_test!(e2e_fips_and_dual_stack_sso); + #[tokio::test] async fn profile_name_override() { let conf = diff --git a/aws/rust-runtime/aws-config/src/environment/credentials.rs b/aws/rust-runtime/aws-config/src/environment/credentials.rs index 2004bed40e7..fa015df41ea 100644 --- a/aws/rust-runtime/aws-config/src/environment/credentials.rs +++ b/aws/rust-runtime/aws-config/src/environment/credentials.rs @@ -245,6 +245,6 @@ mod test { fn real_environment() { let provider = EnvironmentVariableCredentialsProvider::new(); // we don't know what's in the env, just make sure it doesn't crash. - let _ = provider.provide_credentials(); + let _fut = provider.provide_credentials(); } } diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index e1d8657d86d..b39bcf571a8 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -589,6 +589,23 @@ mod loader { .with_http_connector(http_connector.clone()) }) .with_profile_config(self.profile_files_override, self.profile_name_override); + + let use_fips = if let Some(use_fips) = self.use_fips { + Some(use_fips) + } else { + use_fips_provider(&conf).await + }; + + let use_dual_stack = if let Some(use_dual_stack) = self.use_dual_stack { + Some(use_dual_stack) + } else { + use_dual_stack_provider(&conf).await + }; + + let conf = conf + .with_use_fips(use_fips) + .with_use_dual_stack(use_dual_stack); + let region = if let Some(provider) = self.region { provider.region().await } else { @@ -648,18 +665,6 @@ mod loader { None }; - let use_fips = if let Some(use_fips) = self.use_fips { - Some(use_fips) - } else { - use_fips_provider(&conf).await - }; - - let use_dual_stack = if let Some(use_dual_stack) = self.use_dual_stack { - Some(use_dual_stack) - } else { - use_dual_stack_provider(&conf).await - }; - let mut builder = SdkConfig::builder() .region(region) .retry_config(retry_config) diff --git a/aws/rust-runtime/aws-config/src/profile/credentials.rs b/aws/rust-runtime/aws-config/src/profile/credentials.rs index c3d08e58d53..f3809026008 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials.rs @@ -22,15 +22,13 @@ //! - `exec` which contains a chain representation of providers to implement passing bootstrapped credentials //! through a series of providers. -use crate::profile::credentials::exec::named::NamedProviderFactory; -use crate::profile::credentials::exec::ProviderChain; use crate::profile::parser::ProfileFileLoadError; use crate::profile::profile_file::ProfileFiles; use crate::profile::Profile; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; -use aws_sdk_sts::config::Builder as StsConfigBuilder; use aws_smithy_types::error::display::DisplayErrorContext; +use aws_types::SdkConfig; use std::borrow::Cow; use std::collections::HashMap; use std::error::Error; @@ -141,8 +139,8 @@ impl ProvideCredentials for ProfileFileCredentialsProvider { #[doc = include_str!("location_of_profile_files.md")] #[derive(Debug)] pub struct ProfileFileCredentialsProvider { - factory: NamedProviderFactory, - sts_config: StsConfigBuilder, + factory: exec::named::NamedProviderFactory, + sdk_config: SdkConfig, provider_config: ProviderConfig, } @@ -182,7 +180,7 @@ impl ProfileFileCredentialsProvider { }; for provider in inner_provider.chain().iter() { let next_creds = provider - .credentials(creds, &self.sts_config) + .credentials(creds, &self.sdk_config) .instrument(tracing::debug_span!("load_assume_role", provider = ?provider)) .await; match next_creds { @@ -444,7 +442,7 @@ impl Builder { ProfileFileCredentialsProvider { factory, - sts_config: conf.sts_client_config(), + sdk_config: conf.client_config("profile file"), provider_config: conf, } } @@ -452,8 +450,8 @@ impl Builder { async fn build_provider_chain( provider_config: &ProviderConfig, - factory: &NamedProviderFactory, -) -> Result { + factory: &exec::named::NamedProviderFactory, +) -> Result { let profile_set = provider_config .try_profile() .await @@ -485,6 +483,7 @@ mod test { } make_test!(e2e_assume_role); + make_test!(e2e_fips_and_dual_stack_sts); make_test!(empty_config); make_test!(retry_on_error); make_test!(invalid_config); diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs index 838007ad1e3..48a8d0c88a4 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs @@ -11,10 +11,13 @@ use crate::provider_config::ProviderConfig; use crate::sso::{SsoCredentialsProvider, SsoProviderConfig}; use crate::sts; use crate::web_identity_token::{StaticConfiguration, WebIdentityTokenCredentialsProvider}; -use aws_credential_types::provider::{self, error::CredentialsError, ProvideCredentials}; -use aws_sdk_sts::config::{Builder as StsConfigBuilder, Credentials}; +use aws_credential_types::provider::{ + self, error::CredentialsError, ProvideCredentials, SharedCredentialsProvider, +}; +use aws_sdk_sts::config::Credentials; use aws_sdk_sts::Client as StsClient; use aws_smithy_async::time::SharedTimeSource; +use aws_types::SdkConfig; use std::fmt::Debug; use std::sync::Arc; @@ -30,13 +33,13 @@ impl AssumeRoleProvider { pub(super) async fn credentials( &self, input_credentials: Credentials, - sts_config: &StsConfigBuilder, + sdk_config: &SdkConfig, ) -> provider::Result { - let config = sts_config - .clone() - .credentials_provider(input_credentials) + let config = sdk_config + .to_builder() + .credentials_provider(SharedCredentialsProvider::new(input_credentials)) .build(); - let client = StsClient::from_conf(config); + let client = StsClient::new(&config); let session_name = &self.session_name.as_ref().cloned().unwrap_or_else(|| { sts::util::default_session_name("assume-role-from-profile", self.time_source.now()) }); @@ -143,8 +146,8 @@ impl ProviderChain { tracing::info!(role_arn = ?role_arn, "which will be used to assume a role"); AssumeRoleProvider { role_arn: role_arn.role_arn.into(), - external_id: role_arn.external_id.map(|id| id.into()), - session_name: role_arn.session_name.map(|id| id.into()), + external_id: role_arn.external_id.map(Into::into), + session_name: role_arn.session_name.map(Into::into), time_source: provider_config.time_source(), } }) diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index f1caa75e511..ec543a7b66b 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -5,27 +5,26 @@ //! Configuration Options for Credential Providers +use crate::connector::{default_connector, expect_connector}; +use crate::profile; +use crate::profile::profile_file::ProfileFiles; +use crate::profile::{ProfileFileLoadError, ProfileSet}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::SharedTimeSource; use aws_smithy_client::erase::DynConnector; use aws_smithy_types::error::display::DisplayErrorContext; +use aws_smithy_types::retry::RetryConfig; use aws_types::os_shim_internal::{Env, Fs}; use aws_types::{ http_connector::{ConnectorSettings, HttpConnector}, region::Region, + SdkConfig, }; use std::borrow::Cow; - use std::fmt::{Debug, Formatter}; use std::sync::Arc; use tokio::sync::OnceCell; -use crate::connector::default_connector; -use crate::profile; - -use crate::profile::profile_file::ProfileFiles; -use crate::profile::{ProfileFileLoadError, ProfileSet}; - /// Configuration options for Credential Providers /// /// Most credential providers builders offer a `configure` method which applies general provider configuration @@ -42,6 +41,8 @@ pub struct ProviderConfig { connector: HttpConnector, sleep: Option, region: Option, + use_fips: Option, + use_dual_stack: Option, /// An AWS profile created from `ProfileFiles` and a `profile_name` parsed_profile: Arc>>, /// A list of [std::path::Path]s to profile files @@ -57,6 +58,8 @@ impl Debug for ProviderConfig { .field("fs", &self.fs) .field("sleep", &self.sleep) .field("region", &self.region) + .field("use_fips", &self.use_fips) + .field("use_dual_stack", &self.use_dual_stack) .finish() } } @@ -76,6 +79,8 @@ impl Default for ProviderConfig { connector, sleep: default_async_sleep(), region: None, + use_fips: None, + use_dual_stack: None, parsed_profile: Default::default(), profile_files: ProfileFiles::default(), profile_name_override: None, @@ -104,6 +109,8 @@ impl ProviderConfig { connector: HttpConnector::Prebuilt(None), sleep: None, region: None, + use_fips: None, + use_dual_stack: None, profile_name_override: None, } } @@ -144,6 +151,8 @@ impl ProviderConfig { connector: HttpConnector::Prebuilt(None), sleep: None, region: None, + use_fips: None, + use_dual_stack: None, parsed_profile: Default::default(), profile_files: ProfileFiles::default(), profile_name_override: None, @@ -161,6 +170,8 @@ impl ProviderConfig { connector: HttpConnector::Prebuilt(None), sleep, region: None, + use_fips: None, + use_dual_stack: None, profile_name_override: None, } } @@ -181,6 +192,21 @@ impl ProviderConfig { Self::without_region().load_default_region().await } + pub(crate) fn client_config(&self, feature_name: &str) -> SdkConfig { + let mut builder = SdkConfig::builder() + .http_connector(expect_connector( + &format!("The {feature_name} features of aws-config"), + self.connector(&Default::default()), + )) + .retry_config(RetryConfig::standard()) + .region(self.region()) + .time_source(self.time_source()) + .use_fips(self.use_fips().unwrap_or_default()) + .use_dual_stack(self.use_dual_stack().unwrap_or_default()); + builder.set_sleep_impl(self.sleep()); + builder.build() + } + // When all crate features are disabled, these accessors are unused #[allow(dead_code)] @@ -219,6 +245,16 @@ impl ProviderConfig { self.region.clone() } + #[allow(dead_code)] + pub(crate) fn use_fips(&self) -> Option { + self.use_fips + } + + #[allow(dead_code)] + pub(crate) fn use_dual_stack(&self) -> Option { + self.use_dual_stack + } + pub(crate) async fn try_profile(&self) -> Result<&ProfileSet, &ProfileFileLoadError> { let parsed_profile = self .parsed_profile @@ -249,6 +285,18 @@ impl ProviderConfig { self } + /// Override the `use_fips` setting. + pub(crate) fn with_use_fips(mut self, use_fips: Option) -> Self { + self.use_fips = use_fips; + self + } + + /// Override the `use_dual_stack` setting. + pub(crate) fn with_use_dual_stack(mut self, use_dual_stack: Option) -> Self { + self.use_dual_stack = use_dual_stack; + self + } + pub(crate) fn with_profile_name(self, profile_name: String) -> Self { let profile_files = self.profile_files.clone(); self.with_profile_config(Some(profile_files), Some(profile_name)) diff --git a/aws/rust-runtime/aws-config/src/sso.rs b/aws/rust-runtime/aws-config/src/sso.rs index 592ed5b6bc6..7a601f7be40 100644 --- a/aws/rust-runtime/aws-config/src/sso.rs +++ b/aws/rust-runtime/aws-config/src/sso.rs @@ -18,12 +18,13 @@ use aws_credential_types::cache::CredentialsCache; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; use aws_credential_types::Credentials; use aws_sdk_sso::types::RoleCredentials; -use aws_sdk_sso::{config::Builder as SsoConfigBuilder, Client as SsoClient, Config as SsoConfig}; +use aws_sdk_sso::Client as SsoClient; use aws_smithy_json::deserialize::Token; use aws_smithy_types::date_time::Format; use aws_smithy_types::DateTime; use aws_types::os_shim_internal::{Env, Fs}; use aws_types::region::Region; +use aws_types::SdkConfig; use std::convert::TryInto; use std::error::Error; @@ -31,8 +32,6 @@ use std::fmt::{Display, Formatter}; use std::io; use std::path::PathBuf; -use crate::connector::expect_connector; -use aws_smithy_types::retry::RetryConfig; use ring::digest; use zeroize::Zeroizing; @@ -47,7 +46,7 @@ pub struct SsoCredentialsProvider { fs: Fs, env: Env, sso_provider_config: SsoProviderConfig, - sso_config: SsoConfigBuilder, + sdk_config: SdkConfig, } impl SsoCredentialsProvider { @@ -63,26 +62,18 @@ impl SsoCredentialsProvider { let fs = provider_config.fs(); let env = provider_config.env(); - let mut sso_config = SsoConfig::builder() - .http_connector(expect_connector( - "The SSO credentials provider", - provider_config.connector(&Default::default()), - )) - .retry_config(RetryConfig::standard()); - sso_config.set_sleep_impl(provider_config.sleep()); - SsoCredentialsProvider { fs, env, sso_provider_config, - sso_config, + sdk_config: provider_config.client_config("SSO"), } } async fn credentials(&self) -> provider::Result { load_sso_credentials( &self.sso_provider_config, - &self.sso_config, + &self.sdk_config, &self.env, &self.fs, ) @@ -206,20 +197,20 @@ pub(crate) struct SsoProviderConfig { async fn load_sso_credentials( sso_provider_config: &SsoProviderConfig, - sso_config: &SsoConfigBuilder, + sdk_config: &SdkConfig, env: &Env, fs: &Fs, ) -> provider::Result { let token = load_token(&sso_provider_config.start_url, env, fs) .await .map_err(CredentialsError::provider_error)?; - let config = sso_config - .clone() + let config = sdk_config + .to_builder() .region(sso_provider_config.region.clone()) .credentials_cache(CredentialsCache::no_caching()) .build(); // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed - let client = SsoClient::from_conf(config); + let client = SsoClient::new(&config); let resp = client .get_role_credentials() .role_name(&sso_provider_config.role_name) diff --git a/aws/rust-runtime/aws-config/src/sts.rs b/aws/rust-runtime/aws-config/src/sts.rs index 028409bfbef..f774c65906c 100644 --- a/aws/rust-runtime/aws-config/src/sts.rs +++ b/aws/rust-runtime/aws-config/src/sts.rs @@ -10,22 +10,3 @@ pub(crate) mod util; pub use assume_role::{AssumeRoleProvider, AssumeRoleProviderBuilder}; mod assume_role; - -use crate::connector::expect_connector; -use aws_sdk_sts::config::Builder as StsConfigBuilder; -use aws_smithy_types::retry::RetryConfig; - -impl crate::provider_config::ProviderConfig { - pub(crate) fn sts_client_config(&self) -> StsConfigBuilder { - let mut builder = aws_sdk_sts::Config::builder() - .http_connector(expect_connector( - "The STS features of aws-config", - self.connector(&Default::default()), - )) - .retry_config(RetryConfig::standard()) - .region(self.region()) - .time_source(self.time_source()); - builder.set_sleep_impl(self.sleep()); - builder - } -} diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 3dd290fc82f..06e79bc3548 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -362,7 +362,7 @@ mod test { #[tokio::test] async fn configures_session_length() { let (server, request) = capture_request(None); - let provider_conf = SdkConfig::builder() + let sdk_config = SdkConfig::builder() .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), @@ -371,7 +371,7 @@ mod test { .region(Region::from_static("this-will-be-overridden")) .build(); let provider = AssumeRoleProvider::builder("myrole") - .configure(&provider_conf) + .configure(&sdk_config) .region(Region::new("us-east-1")) .session_length(Duration::from_secs(1234567)) .build_from_provider(provide_credentials_fn(|| async { @@ -388,7 +388,7 @@ mod test { #[tokio::test] async fn loads_region_from_sdk_config() { let (server, request) = capture_request(None); - let provider_conf = SdkConfig::builder() + let sdk_config = SdkConfig::builder() .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), @@ -397,14 +397,12 @@ mod test { .credentials_provider(SharedCredentialsProvider::new(provide_credentials_fn( || async { panic!("don't call me — will be overridden"); - #[allow(unreachable_code)] - Ok(Credentials::for_tests()) }, ))) .region(Region::from_static("us-west-2")) .build(); let provider = AssumeRoleProvider::builder("myrole") - .configure(&provider_conf) + .configure(&sdk_config) .session_length(Duration::from_secs(1234567)) .build_from_provider(provide_credentials_fn(|| async { Ok(Credentials::for_tests()) @@ -476,7 +474,7 @@ mod test { UNIX_EPOCH + Duration::from_secs(1234567890 - 120), // 1234567890 since UNIX_EPOCH is 2009-02-13T23:31:30Z ); - let provider_conf = SdkConfig::builder() + let sdk_config = SdkConfig::builder() .sleep_impl(SharedAsyncSleep::new(sleep)) .time_source(testing_time_source.clone()) .http_connector(DynConnector::new(conn)) @@ -499,7 +497,7 @@ mod test { ])); let credentials_list_cloned = credentials_list.clone(); let provider = AssumeRoleProvider::builder("myrole") - .configure(&provider_conf) + .configure(&sdk_config) .region(Region::new("us-east-1")) .build_from_provider(provide_credentials_fn(move || { let list = credentials_list.clone(); diff --git a/aws/rust-runtime/aws-config/src/test_case.rs b/aws/rust-runtime/aws-config/src/test_case.rs index 14859d57ef2..54d39d112de 100644 --- a/aws/rust-runtime/aws-config/src/test_case.rs +++ b/aws/rust-runtime/aws-config/src/test_case.rs @@ -14,6 +14,8 @@ use aws_types::os_shim_internal::{Env, Fs}; use serde::Deserialize; use crate::connector::default_connector; +use crate::default_provider::use_dual_stack::use_dual_stack_provider; +use crate::default_provider::use_fips::use_fips_provider; use aws_smithy_types::error::display::DisplayErrorContext; use std::collections::HashMap; use std::env; @@ -236,6 +238,13 @@ impl TestEnvironment { .with_sleep(TokioSleep::new()) .load_default_region() .await; + + let use_dual_stack = use_dual_stack_provider(&provider_config).await; + let use_fips = use_fips_provider(&provider_config).await; + let provider_config = provider_config + .with_use_fips(use_fips) + .with_use_dual_stack(use_dual_stack); + Ok(TestEnvironment { base_dir: dir.into(), metadata, diff --git a/aws/rust-runtime/aws-config/src/web_identity_token.rs b/aws/rust-runtime/aws-config/src/web_identity_token.rs index 7ea55fdf26c..50d71712281 100644 --- a/aws/rust-runtime/aws-config/src/web_identity_token.rs +++ b/aws/rust-runtime/aws-config/src/web_identity_token.rs @@ -204,7 +204,7 @@ impl Builder { WebIdentityTokenCredentialsProvider { source, fs: conf.fs(), - sts_client: StsClient::from_conf(conf.sts_client_config().build()), + sts_client: StsClient::new(&conf.client_config("STS")), time_source: conf.time_source(), } } diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json new file mode 100644 index 00000000000..7e1f0ed5e68 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json @@ -0,0 +1,7 @@ +{ + "HOME": "/home", + "AWS_REGION": "us-west-2", + "AWS_PROFILE": "sso-test", + "AWS_USE_FIPS_ENDPOINT": "true", + "AWS_USE_DUALSTACK_ENDPOINT": "true" +} diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config new file mode 100644 index 00000000000..7967221048a --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config @@ -0,0 +1,6 @@ +[profile sso-test] +sso_start_url = https://ssotest.awsapps.com/start +sso_region = us-east-2 +sso_account_id = 123456789 +sso_role_name = MySsoRole +region = us-east-2 diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json new file mode 100644 index 00000000000..c4cca143fbc --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json @@ -0,0 +1,5 @@ +{ + "accessToken": "a-token", + "expiresAt": "2080-10-16T03:56:45Z", + "startUrl": "https://ssotest.awsapps.com/start" +} diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json new file mode 100644 index 00000000000..f7f80963e89 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json @@ -0,0 +1,93 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://portal.sso-fips.us-east-2.api.aws/federation/credentials?account_id=123456789&role_name=MySsoRole", + "headers": { + "x-amz-sso_bearer_token": [ + "a-token" + ], + "Host": [ + "portal.sso-fips.us-east-2.api.aws" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "Date": [ + "Mon, 03 Jan 2022 19:13:54 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Content-Length": [ + "144" + ], + "Connection": [ + "keep-alive" + ], + "Access-Control-Expose-Headers": [ + "RequestId" + ], + "Cache-Control": [ + "no-cache" + ], + "RequestId": [ + "b339b807-25d1-474c-a476-b070e9f350e4" + ], + "Server": [ + "AWS SSO" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "{\"roleCredentials\":{\"accessKeyId\":\"ASIARCORRECT\",\"secretAccessKey\":\"secretkeycorrect\",\"sessionToken\":\"tokencorrect\",\"expiration\":1234567890000}}" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "Load SSO credentials", + "version": "V0" +} diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json new file mode 100644 index 00000000000..91d9a21d91d --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json @@ -0,0 +1,12 @@ +{ + "name": "e2e_fips_and_dual_stack_sso", + "docs": "end to end SSO test with FIPS and dual stack enabled", + "result": { + "Ok": { + "access_key_id": "ASIARCORRECT", + "secret_access_key": "secretkeycorrect", + "session_token": "tokencorrect", + "expiry": 1234567890 + } + } +} diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json new file mode 100644 index 00000000000..55fcfbeb051 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json @@ -0,0 +1,3 @@ +{ + "HOME": "/home" +} diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config new file mode 100644 index 00000000000..17d48634379 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config @@ -0,0 +1,9 @@ +[default] +region = us-east-1 +role_arn = arn:aws:iam::123456789:role/integration-test +source_profile = base +use_fips_endpoint = true +use_dualstack_endpoint = true + +[profile base] +region = us-east-1 diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials new file mode 100644 index 00000000000..1cab6a6ca21 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials @@ -0,0 +1,3 @@ +[base] +aws_access_key_id = AKIAFAKE +aws_secret_access_key = FAKE diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json new file mode 100644 index 00000000000..000b74b8e20 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json @@ -0,0 +1,107 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://sts-fips.us-east-1.api.aws/", + "headers": { + "content-type": [ + "application/x-www-form-urlencoded" + ], + "authorization": [ + "AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e" + ], + "user-agent": [ + "aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly" + ], + "content-length": [ + "146" + ], + "x-amz-date": [ + "20210810T003833Z" + ], + "host": [ + "sts-fips.us-east-1.api.aws" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly" + ] + }, + "method": "POST" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session" + }, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "date": [ + "Thu, 05 Aug 2021 18:58:02 GMT" + ], + "content-length": [ + "1491" + ], + "content-type": [ + "text/xml" + ], + "x-amzn-requestid": [ + "c2e971c2-702d-4124-9b1f-1670febbea18" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "\n \n \n AROARABCDEFGHIJKLMNOP:assume-role-provider-session\n arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session\n \n \n ASIARTESTID\n TESTSECRETKEY\n TESTSESSIONTOKEN\n 2021-08-05T19:58:02Z\n \n \n \n c2e971c2-702d-4124-9b1f-1670febbea18\n \n\n" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "standard request / response with STS", + "version": "V0" +} diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json new file mode 100644 index 00000000000..6d1c5079f40 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json @@ -0,0 +1,12 @@ +{ + "name": "e2e_fips_and_dual_stack_sts", + "docs": "end to end STS role assumption test with FIPS and dual stack enabled", + "result": { + "Ok": { + "access_key_id": "ASIARTESTID", + "secret_access_key": "TESTSECRETKEY", + "session_token": "TESTSESSIONTOKEN", + "expiry": 1628193482 + } + } +} From affd87c91fa4d3f5fb6814f27e1656ee7403857b Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 4 Oct 2023 18:36:41 -0500 Subject: [PATCH 150/331] Make versions comparison more flexible in the fix-manifest subcommand of publisher (#3025) ## Motivation and Context Attempts to resolve [a workflow failure](https://github.com/awslabs/aws-sdk-rust/actions/runs/6395300944/job/17358637767#step:6) in `aws-sdk-rust`. ## Description We have observed a series of `WARN`s from the `check-manifests` job. It is caused by #3009, specifically `update_dep` in the `fix-manifests` needs to be updated where it compares a version in a `Table` versus a current version being looked at. For instance, prior to the PR, `0.56.1` and `~0.56` for a crate were considered a mismatch when it should be a match according to our latest logic. ## Testing - Added a unit test for a helper function. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../publisher/src/subcommand/fix_manifests.rs | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index 148a22d0007..d3c02a364d5 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -217,7 +217,7 @@ fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Resu ); match previous_version { None => Ok(1), - Some(prev_version) if prev_version.as_str() == Some(&package_version) => Ok(0), + Some(prev_version) if versions_match(&prev_version, &package_version) => Ok(0), Some(mismatched_version) => { tracing::warn!(expected = ?package_version, actual = ?mismatched_version, "version was set but it did not match"); Ok(1) @@ -251,6 +251,23 @@ fn convert_to_tilde_requirement(package_version: &semver::Version) -> Result bool { + match prev_version.as_str() { + Some(prev_version) => { + if prev_version == current_version { + return true; + } + let prev_version = prev_version.strip_prefix('~').unwrap_or(prev_version); + let current_version = current_version.strip_prefix('~').unwrap_or(current_version); + prev_version.starts_with(current_version) || current_version.starts_with(prev_version) + } + _ => false, + } +} + fn fix_dep_sets(versions: &VersionView, metadata: &mut toml::Value) -> Result { let mut changed = fix_dep_set(versions, "dependencies", metadata)?; // allow dev dependencies to be unpublished @@ -530,4 +547,20 @@ mod tests { "aws-sdk-rust/examples/foo/bar/Cargo.toml" )); } + + #[test] + fn test_versions_match() { + assert!(versions_match(&Value::String("0.56.1".to_owned()), "~0.56")); + assert!(versions_match(&Value::String("~0.56".to_owned()), "0.56.1")); + assert!(!versions_match(&Value::String("~0.56".to_owned()), "~0.57")); + assert!(!versions_match(&Value::String("~0.57".to_owned()), "~0.56")); + assert!(!versions_match( + &Value::String("0.56.1".to_owned()), + "0.56.2" + )); + assert!(!versions_match( + &Value::String("0.56.1".to_owned()), + "0.57.1" + )); + } } From ce5f0aae3fcf8533e519b799236d165b32332a62 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 5 Oct 2023 14:19:56 -0700 Subject: [PATCH 151/331] Port connection poisoning tests to orchestrator and fix issues discovered (#3029) Issues fixed: - `ConnectionPoisoningInterceptor` should use the `read_after_deserialization` hook so that it's possible to poison modeled transient errors. - aws-config should enable connection poisoning on its IMDS/ECS/HTTP clients. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/http_credential_provider.rs | 1 + .../aws-config/src/imds/client.rs | 1 + .../aws-config/src/imds/client/token.rs | 1 + .../client/interceptors/context/wrappers.rs | 104 +++++- .../client/connectors/connection_poisoning.rs | 8 +- .../src/client/orchestrator/operation.rs | 6 + .../tests/reconnect_on_transient_error.rs | 302 ++++++++++++++++++ 7 files changed, 415 insertions(+), 8 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index 87950ea17cf..2bb2cc25c7e 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -115,6 +115,7 @@ impl Builder { .http_connector(SharedHttpConnector::new(DynConnectorAdapter::new( connector, ))) + .with_connection_poisoning() .endpoint_url(endpoint) .no_auth() .runtime_plugin(StaticRuntimePlugin::new().with_config({ diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index ed76fc8660f..32aa772023e 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -458,6 +458,7 @@ impl Builder { config.time_source(), self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL), )) + .with_connection_poisoning() .serializer(|path| { Ok(http::Request::builder() .uri(path) diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index 98e1a79a80b..ec3ffe406d6 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -132,6 +132,7 @@ impl TokenResolver { .operation_name("get-token") .runtime_plugin(common_plugin) .no_auth() + .with_connection_poisoning() .serializer(move |_| { Ok(http::Request::builder() .method("PUT") diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs index 77f751e1369..bead9491db0 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs @@ -54,6 +54,14 @@ impl<'a, I, O, E> BeforeSerializationInterceptorContextRef<'a, I, O, E> { pub fn input(&self) -> &I { expect!(self, input) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } } // @@ -80,6 +88,22 @@ impl<'a, I, O, E> BeforeSerializationInterceptorContextMut<'a, I, O, E> { pub fn input_mut(&mut self) -> &mut I { expect!(self, input_mut) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } } // @@ -101,6 +125,14 @@ impl<'a, I, O, E> BeforeTransmitInterceptorContextRef<'a, I, O, E> { pub fn request(&self) -> &Request { expect!(self, request) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } } // @@ -127,6 +159,22 @@ impl<'a, I, O, E> BeforeTransmitInterceptorContextMut<'a, I, O, E> { pub fn request_mut(&mut self) -> &mut Request { expect!(self, request_mut) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } } // @@ -148,6 +196,14 @@ impl<'a, I, O, E> BeforeDeserializationInterceptorContextRef<'a, I, O, E> { pub fn response(&self) -> &Response { expect!(self, response) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } } // @@ -174,10 +230,18 @@ impl<'a, I, O, E> BeforeDeserializationInterceptorContextMut<'a, I, O, E> { expect!(self, response_mut) } - #[doc(hidden)] - /// Downgrade this helper struct, returning the underlying InterceptorContext. There's no good - /// reason to use this unless you're writing tests or you have to interact with an API that - /// doesn't support the helper structs. + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { self.inner } @@ -206,6 +270,14 @@ impl<'a, I, O, E> AfterDeserializationInterceptorContextRef<'a, I, O, E> { pub fn output_or_error(&self) -> Result<&O, &OrchestratorError> { expect!(self, output_or_error) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } } // @@ -243,6 +315,14 @@ impl<'a, I, O, E> FinalizerInterceptorContextRef<'a, I, O, E> { pub fn output_or_error(&self) -> Option>> { self.inner.output_or_error.as_ref().map(|o| o.as_ref()) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } } // @@ -300,4 +380,20 @@ impl<'a, I, O, E> FinalizerInterceptorContextMut<'a, I, O, E> { pub fn output_or_error_mut(&mut self) -> Option<&mut Result>> { self.inner.output_or_error.as_mut() } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs index 5f6f4e78623..fe26f385203 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs @@ -6,7 +6,7 @@ use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ - BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, + AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; @@ -61,9 +61,9 @@ impl Interceptor for ConnectionPoisoningInterceptor { Ok(()) } - fn modify_before_deserialization( + fn read_after_deserialization( &self, - context: &mut BeforeDeserializationInterceptorContextMut<'_>, + context: &AfterDeserializationInterceptorContextRef<'_>, runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { @@ -77,7 +77,7 @@ impl Interceptor for ConnectionPoisoningInterceptor { .ok_or("retry classifiers are required for connection poisoning to work")?; let error_is_transient = retry_classifiers - .classify_retry(context.inner_mut()) + .classify_retry(context.inner()) .map(|reason| reason == RetryReason::Error(ErrorKind::TransientError)) .unwrap_or_default(); let connection_poisoning_is_enabled = diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index ac61dc72228..3c483ca5939 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -4,6 +4,7 @@ */ use crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID}; +use crate::client::connectors::connection_poisoning::ConnectionPoisoningInterceptor; use crate::client::identity::no_auth::NoAuthIdentityResolver; use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; @@ -254,6 +255,11 @@ impl OperationBuilder { self } + /// Registers the [`ConnectionPoisoningInterceptor`]. + pub fn with_connection_poisoning(self) -> Self { + self.interceptor(ConnectionPoisoningInterceptor::new()) + } + pub fn runtime_plugin(mut self, runtime_plugin: impl IntoShared) -> Self { self.runtime_plugins.push(runtime_plugin.into_shared()); self diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs new file mode 100644 index 00000000000..bf1d8220d9d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -0,0 +1,302 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#![cfg(all( + feature = "client", + feature = "wire-mock", + feature = "connector-hyper-0-14-x", +))] + +use ::aws_smithy_runtime::client::retries::classifier::{ + HttpStatusCodeClassifier, SmithyErrorClassifier, +}; +use ::aws_smithy_runtime_api::client::retries::RetryClassifiers; +use aws_smithy_async::rt::sleep::TokioSleep; +use aws_smithy_http::body::{BoxBody, SdkBody}; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +use aws_smithy_runtime::client::http::test_util::wire::{ + RecordedEvent, ReplayedEvent, WireMockServer, +}; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime::{ev, match_events}; +use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; +use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig}; +use aws_smithy_types::timeout::TimeoutConfig; +use hyper::client::Builder as HyperBuilder; +use std::fmt; +use std::time::Duration; + +const END_OF_TEST: &str = "end_of_test"; + +#[derive(Debug)] +struct OperationError(ErrorKind); + +impl fmt::Display for OperationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +impl ProvideErrorKind for OperationError { + fn retryable_error_kind(&self) -> Option { + Some(self.0) + } + + fn code(&self) -> Option<&str> { + None + } +} + +impl std::error::Error for OperationError {} + +#[derive(Debug)] +struct TestRetryClassifier; + +impl ClassifyRetry for TestRetryClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> Option { + tracing::info!("classifying retry for {ctx:?}"); + let classification = ctx.output_or_error().unwrap().err().and_then(|err| { + if let Some(err) = err.as_operation_error() { + tracing::info!("its an operation error: {err:?}"); + let err = err.downcast_ref::().unwrap(); + Some(RetryReason::Error(err.0)) + } else { + tracing::info!("its something else... using other classifiers"); + SmithyErrorClassifier::::new() + .classify_retry(ctx) + .or_else(|| HttpStatusCodeClassifier::default().classify_retry(ctx)) + } + }); + tracing::info!("classified as {classification:?}"); + classification + } + + fn name(&self) -> &'static str { + "test" + } +} + +async fn h1_and_h2(events: Vec, match_clause: impl Fn(&[RecordedEvent])) { + wire_level_test( + events.clone(), + |_b| {}, + ReconnectMode::ReconnectOnTransientError, + &match_clause, + ) + .await; + wire_level_test( + events, + |b| { + b.http2_only(true); + }, + ReconnectMode::ReconnectOnTransientError, + match_clause, + ) + .await; + tracing::info!("h2 ok!"); +} + +/// Repeatedly send test operation until `end_of_test` is received +/// +/// When the test is over, match_clause is evaluated +async fn wire_level_test( + events: Vec, + hyper_builder_settings: impl Fn(&mut HyperBuilder), + reconnect_mode: ReconnectMode, + match_clause: impl Fn(&[RecordedEvent]), +) { + let mut hyper_builder = hyper::Client::builder(); + hyper_builder_settings(&mut hyper_builder); + + let mock = WireMockServer::start(events).await; + let http_client = HyperClientBuilder::new() + .hyper_builder(hyper_builder) + .build(hyper::client::HttpConnector::new_with_resolver( + mock.dns_resolver(), + )); + + let operation = Operation::builder() + .service_name("test") + .operation_name("test") + .no_auth() + .endpoint_url(&mock.endpoint_url()) + .http_client(http_client) + .timeout_config( + TimeoutConfig::builder() + .operation_attempt_timeout(Duration::from_millis(100)) + .build(), + ) + .standard_retry(&RetryConfig::standard().with_reconnect_mode(reconnect_mode)) + .retry_classifiers(RetryClassifiers::new().with_classifier(TestRetryClassifier)) + .sleep_impl(TokioSleep::new()) + .with_connection_poisoning() + .serializer({ + let endpoint_url = mock.endpoint_url(); + move |_| { + let request = http::Request::builder() + .uri(endpoint_url.clone()) + // Make the body non-replayable since we don't actually want to retry + .body(SdkBody::from_dyn(BoxBody::new(SdkBody::from("body")))) + .unwrap(); + tracing::info!("serializing request: {request:?}"); + Ok(request) + } + }) + .deserializer(|response| { + tracing::info!("deserializing response: {:?}", response); + match response.status() { + s if s.is_success() => { + Ok(String::from_utf8(response.body().bytes().unwrap().into()).unwrap()) + } + s if s.is_client_error() => Err(OrchestratorError::operation(OperationError( + ErrorKind::ServerError, + ))), + s if s.is_server_error() => Err(OrchestratorError::operation(OperationError( + ErrorKind::TransientError, + ))), + _ => panic!("unexpected status: {}", response.status()), + } + }) + .build(); + + let mut iteration = 0; + loop { + tracing::info!("iteration {iteration}..."); + match operation.invoke(()).await { + Ok(resp) => { + tracing::info!("response: {:?}", resp); + if resp == END_OF_TEST { + break; + } + } + Err(e) => tracing::info!("error: {:?}", e), + } + iteration += 1; + if iteration > 50 { + panic!("probably an infinite loop; no satisfying 'end_of_test' response received"); + } + } + let events = mock.events(); + match_clause(&events); + mock.shutdown(); +} + +#[tokio::test] +async fn non_transient_errors_no_reconnect() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::status(400), + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!(ev!(dns), ev!(connect), ev!(http(400)), ev!(http(200))), + ) + .await +} + +#[tokio::test] +async fn reestablish_dns_on_503() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::status(503), + ReplayedEvent::status(503), + ReplayedEvent::status(503), + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!( + // first request + ev!(dns), + ev!(connect), + ev!(http(503)), + // second request + ev!(dns), + ev!(connect), + ev!(http(503)), + // third request + ev!(dns), + ev!(connect), + ev!(http(503)), + // all good + ev!(dns), + ev!(connect), + ev!(http(200)) + ), + ) + .await; +} + +#[tokio::test] +async fn connection_shared_on_success() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::ok(), + ReplayedEvent::ok(), + ReplayedEvent::status(503), + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!( + ev!(dns), + ev!(connect), + ev!(http(200)), + ev!(http(200)), + ev!(http(503)), + ev!(dns), + ev!(connect), + ev!(http(200)) + ), + ) + .await; +} + +#[tokio::test] +async fn no_reconnect_when_disabled() { + let _logs = capture_test_logs(); + wire_level_test( + vec![ + ReplayedEvent::status(503), + ReplayedEvent::with_body(END_OF_TEST), + ], + |_b| {}, + ReconnectMode::ReuseAllConnections, + match_events!(ev!(dns), ev!(connect), ev!(http(503)), ev!(http(200))), + ) + .await; +} + +#[tokio::test] +async fn connection_reestablished_after_timeout() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::ok(), + ReplayedEvent::Timeout, + ReplayedEvent::ok(), + ReplayedEvent::Timeout, + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!( + // first connection + ev!(dns), + ev!(connect), + ev!(http(200)), + // reuse but got a timeout + ev!(timeout), + // so we reconnect + ev!(dns), + ev!(connect), + ev!(http(200)), + ev!(timeout), + ev!(dns), + ev!(connect), + ev!(http(200)) + ), + ) + .await; +} From 99c5a575b3ea5b005f35c586c682743c610353c2 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 5 Oct 2023 21:57:43 -0400 Subject: [PATCH 152/331] Enable the invoke_model_with_response_stream API (#3031) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This API is a streaming API—I tested it manually, an E2E test an example are forthcoming. I also removed the unused `config` service from the smoketest and added bedrock-runtime. ## Motivation and Context This API is suppressed by default because it's an event stream API ## Description ## Testing https://gist.github.com/rcoh/ce61429303a56fefd65ba05bd36d28fc works ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/aws-models/bedrock-runtime.json | 1166 +++++++++++++++++ aws/sdk/gradle.properties | 3 +- .../HttpBoundProtocolPayloadGenerator.kt | 77 +- 3 files changed, 1228 insertions(+), 18 deletions(-) create mode 100644 aws/sdk/aws-models/bedrock-runtime.json diff --git a/aws/sdk/aws-models/bedrock-runtime.json b/aws/sdk/aws-models/bedrock-runtime.json new file mode 100644 index 00000000000..238bd562b85 --- /dev/null +++ b/aws/sdk/aws-models/bedrock-runtime.json @@ -0,0 +1,1166 @@ +{ + "smithy": "2.0", + "shapes": { + "com.amazonaws.bedrockruntime#AccessDeniedException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The request is denied because of missing access permissions.

", + "smithy.api#error": "client", + "smithy.api#httpError": 403 + } + }, + "com.amazonaws.bedrockruntime#AmazonBedrockFrontendService": { + "type": "service", + "version": "2023-09-30", + "resources": [ + { + "target": "com.amazonaws.bedrockruntime#InferenceResource" + } + ], + "traits": { + "aws.api#service": { + "sdkId": "Bedrock Runtime", + "endpointPrefix": "bedrock-runtime", + "cloudTrailEventSource": "bedrock.amazonaws.com" + }, + "aws.auth#sigv4": { + "name": "bedrock" + }, + "aws.protocols#restJson1": {}, + "smithy.api#documentation": "

Describes the API operations for running inference using Bedrock models.

", + "smithy.api#title": "Amazon Bedrock Runtime", + "smithy.rules#endpointRuleSet": { + "version": "1.0", + "parameters": { + "Region": { + "builtIn": "AWS::Region", + "required": false, + "documentation": "The AWS region used to dispatch the request.", + "type": "String" + }, + "UseDualStack": { + "builtIn": "AWS::UseDualStack", + "required": true, + "default": false, + "documentation": "When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.", + "type": "Boolean" + }, + "UseFIPS": { + "builtIn": "AWS::UseFIPS", + "required": true, + "default": false, + "documentation": "When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.", + "type": "Boolean" + }, + "Endpoint": { + "builtIn": "SDK::Endpoint", + "required": false, + "documentation": "Override the endpoint used to send this request", + "type": "String" + } + }, + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Invalid Configuration: FIPS and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "PartitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ] + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" + } + ] + } + ] + }, + "smithy.rules#endpointTests": { + "testCases": [ + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For custom endpoint with region set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with region not set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips enabled and dualstack disabled", + "expect": { + "error": "Invalid Configuration: FIPS and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips disabled and dualstack enabled", + "expect": { + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "Missing region", + "expect": { + "error": "Invalid Configuration: Missing Region" + } + } + ], + "version": "1.0" + } + } + }, + "com.amazonaws.bedrockruntime#Body": { + "type": "blob", + "traits": { + "smithy.api#length": { + "max": 25000000 + }, + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#InferenceResource": { + "type": "resource", + "operations": [ + { + "target": "com.amazonaws.bedrockruntime#InvokeModel" + }, + { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStream" + } + ] + }, + "com.amazonaws.bedrockruntime#InternalServerException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

An internal server error occurred. Retry your request.

", + "smithy.api#error": "server", + "smithy.api#httpError": 500 + } + }, + "com.amazonaws.bedrockruntime#InvokeModel": { + "type": "operation", + "input": { + "target": "com.amazonaws.bedrockruntime#InvokeModelRequest" + }, + "output": { + "target": "com.amazonaws.bedrockruntime#InvokeModelResponse" + }, + "errors": [ + { + "target": "com.amazonaws.bedrockruntime#AccessDeniedException" + }, + { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelNotReadyException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + }, + { + "target": "com.amazonaws.bedrockruntime#ResourceNotFoundException" + }, + { + "target": "com.amazonaws.bedrockruntime#ServiceQuotaExceededException" + }, + { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + { + "target": "com.amazonaws.bedrockruntime#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Invokes the specified Bedrock model to run inference using the input provided in the request body. \n You use InvokeModel to run inference for text models, image models, and embedding models.

\n

For more information, see Run inference in the Bedrock User Guide.

\n

For example requests, see Examples (after the Errors section).

", + "smithy.api#http": { + "code": 200, + "method": "POST", + "uri": "/model/{modelId}/invoke" + } + } + }, + "com.amazonaws.bedrockruntime#InvokeModelIdentifier": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 2048 + }, + "smithy.api#pattern": "^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(([0-9]{12}:custom-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}/[a-z0-9]{12})|(:foundation-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.]?[a-z0-9-]{1,63}))|([0-9]{12}:provisioned-model/[a-z0-9]{12})))|([a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.]?[a-z0-9-]{1,63}))|(([0-9a-zA-Z][_-]?)+)$" + } + }, + "com.amazonaws.bedrockruntime#InvokeModelRequest": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Input data in the format specified in the content-type request header. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the input data in the request. The default value is\n application/json.

", + "smithy.api#httpHeader": "Content-Type" + } + }, + "accept": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The desired MIME type of the inference body in the response. The default value is\n application/json.

", + "smithy.api#httpHeader": "Accept" + } + }, + "modelId": { + "target": "com.amazonaws.bedrockruntime#InvokeModelIdentifier", + "traits": { + "smithy.api#documentation": "

Identifier of the model.

", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Inference response from the model in the format specified in the content-type header field. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the inference result.

", + "smithy.api#httpHeader": "Content-Type", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStream": { + "type": "operation", + "input": { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest" + }, + "output": { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse" + }, + "errors": [ + { + "target": "com.amazonaws.bedrockruntime#AccessDeniedException" + }, + { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelNotReadyException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelStreamErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + }, + { + "target": "com.amazonaws.bedrockruntime#ResourceNotFoundException" + }, + { + "target": "com.amazonaws.bedrockruntime#ServiceQuotaExceededException" + }, + { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + { + "target": "com.amazonaws.bedrockruntime#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Invoke the specified Bedrock model to run inference using the input provided.\n Return the response in a stream.

\n

For more information, see Run inference in the Bedrock User Guide.

\n

For an example request and response, see Examples (after the Errors section).

", + "smithy.api#http": { + "code": 200, + "method": "POST", + "uri": "/model/{modelId}/invoke-with-response-stream" + } + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Inference input in the format specified by the \n content-type. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the input data in the request. The default value is\n application/json.

", + "smithy.api#httpHeader": "Content-Type" + } + }, + "accept": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The desired MIME type of the inference body in the response. The default value is\n application/json.

", + "smithy.api#httpHeader": "X-Amzn-Bedrock-Accept" + } + }, + "modelId": { + "target": "com.amazonaws.bedrockruntime#InvokeModelIdentifier", + "traits": { + "smithy.api#documentation": "

Id of the model to invoke using the streaming request.

", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#ResponseStream", + "traits": { + "smithy.api#documentation": "

Inference response from the model in the format specified by Content-Type. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the inference result.

", + "smithy.api#httpHeader": "X-Amzn-Bedrock-Content-Type", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.bedrockruntime#MimeType": { + "type": "string" + }, + "com.amazonaws.bedrockruntime#ModelErrorException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + }, + "originalStatusCode": { + "target": "com.amazonaws.bedrockruntime#StatusCode", + "traits": { + "smithy.api#documentation": "

The original status code.

" + } + }, + "resourceName": { + "target": "com.amazonaws.bedrockruntime#NonBlankString", + "traits": { + "smithy.api#documentation": "

The resource name.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

The request failed due to an error while processing the model.

", + "smithy.api#error": "client", + "smithy.api#httpError": 424 + } + }, + "com.amazonaws.bedrockruntime#ModelNotReadyException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The model specified in the request is not ready to serve inference requests.

", + "smithy.api#error": "client", + "smithy.api#httpError": 429 + } + }, + "com.amazonaws.bedrockruntime#ModelStreamErrorException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + }, + "originalStatusCode": { + "target": "com.amazonaws.bedrockruntime#StatusCode", + "traits": { + "smithy.api#documentation": "

The original status code.

" + } + }, + "originalMessage": { + "target": "com.amazonaws.bedrockruntime#NonBlankString", + "traits": { + "smithy.api#documentation": "

The original message.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

An error occurred while streaming the response.

", + "smithy.api#error": "client", + "smithy.api#httpError": 424 + } + }, + "com.amazonaws.bedrockruntime#ModelTimeoutException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The request took too long to process. Processing time exceeded the model timeout length.

", + "smithy.api#error": "client", + "smithy.api#httpError": 408 + } + }, + "com.amazonaws.bedrockruntime#NonBlankString": { + "type": "string", + "traits": { + "smithy.api#pattern": "^[\\s\\S]*$" + } + }, + "com.amazonaws.bedrockruntime#PartBody": { + "type": "blob", + "traits": { + "smithy.api#length": { + "max": 1000000 + }, + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#PayloadPart": { + "type": "structure", + "members": { + "bytes": { + "target": "com.amazonaws.bedrockruntime#PartBody", + "traits": { + "smithy.api#documentation": "

Base64-encoded bytes of payload data.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Payload content included in the response.

", + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#ResourceNotFoundException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The specified resource ARN was not found. Check the ARN and try your request again.

", + "smithy.api#error": "client", + "smithy.api#httpError": 404 + } + }, + "com.amazonaws.bedrockruntime#ResponseStream": { + "type": "union", + "members": { + "chunk": { + "target": "com.amazonaws.bedrockruntime#PayloadPart", + "traits": { + "smithy.api#documentation": "

Content included in the response.

" + } + }, + "internalServerException": { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + "modelStreamErrorException": { + "target": "com.amazonaws.bedrockruntime#ModelStreamErrorException" + }, + "validationException": { + "target": "com.amazonaws.bedrockruntime#ValidationException" + }, + "throttlingException": { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + "modelTimeoutException": { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + } + }, + "traits": { + "smithy.api#documentation": "

Definition of content in the response stream.

", + "smithy.api#streaming": {} + } + }, + "com.amazonaws.bedrockruntime#ServiceQuotaExceededException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The number of requests exceeds the service quota. Resubmit your request later.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.bedrockruntime#StatusCode": { + "type": "integer", + "traits": { + "smithy.api#range": { + "min": 100, + "max": 599 + } + } + }, + "com.amazonaws.bedrockruntime#ThrottlingException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The number of requests exceeds the limit. Resubmit your request later.

", + "smithy.api#error": "client", + "smithy.api#httpError": 429 + } + }, + "com.amazonaws.bedrockruntime#ValidationException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

Input validation failed. Check your request parameters and retry the request.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + } + } +} diff --git a/aws/sdk/gradle.properties b/aws/sdk/gradle.properties index 3bd30286069..42754f181dd 100644 --- a/aws/sdk/gradle.properties +++ b/aws/sdk/gradle.properties @@ -8,4 +8,5 @@ aws.services= # List of services to generate Event Stream operations for: aws.services.eventstream.allowlist=\ aws-sdk-transcribestreaming,\ - aws-sdk-s3 + aws-sdk-s3,\ + aws-sdk-bedrockruntime diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt index 0ed594fc285..5b1d9df988a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt @@ -78,6 +78,7 @@ class HttpBoundProtocolPayloadGenerator( val (shape, payloadMemberName) = when (httpMessageType) { HttpMessageType.RESPONSE -> operationShape.outputShape(model) to httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + HttpMessageType.REQUEST -> operationShape.inputShape(model) to httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName } @@ -97,6 +98,7 @@ class HttpBoundProtocolPayloadGenerator( is DocumentShape, is StructureShape, is UnionShape -> ProtocolPayloadGenerator.PayloadMetadata( takesOwnership = false, ) + is StringShape, is BlobShape -> ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = true) else -> UNREACHABLE("Unexpected payload target type: $type") } @@ -110,8 +112,19 @@ class HttpBoundProtocolPayloadGenerator( additionalPayloadContext: AdditionalPayloadContext, ) { when (httpMessageType) { - HttpMessageType.RESPONSE -> generateResponsePayload(writer, shapeName, operationShape, additionalPayloadContext) - HttpMessageType.REQUEST -> generateRequestPayload(writer, shapeName, operationShape, additionalPayloadContext) + HttpMessageType.RESPONSE -> generateResponsePayload( + writer, + shapeName, + operationShape, + additionalPayloadContext, + ) + + HttpMessageType.REQUEST -> generateRequestPayload( + writer, + shapeName, + operationShape, + additionalPayloadContext, + ) } } @@ -119,13 +132,20 @@ class HttpBoundProtocolPayloadGenerator( writer: RustWriter, shapeName: String, operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext, ) { - val payloadMemberName = httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + val payloadMemberName = + httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName if (payloadMemberName == null) { val serializerGenerator = protocol.structuredDataSerializer() generateStructureSerializer(writer, shapeName, serializerGenerator.operationInputSerializer(operationShape)) } else { - generatePayloadMemberSerializer(writer, shapeName, operationShape, payloadMemberName, additionalPayloadContext) + generatePayloadMemberSerializer( + writer, + shapeName, + operationShape, + payloadMemberName, + additionalPayloadContext, + ) } } @@ -133,13 +153,24 @@ class HttpBoundProtocolPayloadGenerator( writer: RustWriter, shapeName: String, operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext, ) { - val payloadMemberName = httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + val payloadMemberName = + httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName if (payloadMemberName == null) { val serializerGenerator = protocol.structuredDataSerializer() - generateStructureSerializer(writer, shapeName, serializerGenerator.operationOutputSerializer(operationShape)) + generateStructureSerializer( + writer, + shapeName, + serializerGenerator.operationOutputSerializer(operationShape), + ) } else { - generatePayloadMemberSerializer(writer, shapeName, operationShape, payloadMemberName, additionalPayloadContext) + generatePayloadMemberSerializer( + writer, + shapeName, + operationShape, + payloadMemberName, + additionalPayloadContext, + ) } } @@ -152,16 +183,24 @@ class HttpBoundProtocolPayloadGenerator( ) { val serializerGenerator = protocol.structuredDataSerializer() - if (operationShape.isEventStream(model)) { - if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) { - val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName) - writer.serializeViaEventStream(operationShape, payloadMember, serializerGenerator, shapeName, additionalPayloadContext) - } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) { - val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName) - writer.serializeViaEventStream(operationShape, payloadMember, serializerGenerator, "output", additionalPayloadContext) - } else { - throw CodegenException("Payload serializer for event streams with an invalid configuration") - } + if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) { + val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName) + writer.serializeViaEventStream( + operationShape, + payloadMember, + serializerGenerator, + shapeName, + additionalPayloadContext, + ) + } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) { + val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName) + writer.serializeViaEventStream( + operationShape, + payloadMember, + serializerGenerator, + "output", + additionalPayloadContext, + ) } else { val bodyMetadata = payloadMetadata(operationShape) val payloadMember = when (httpMessageType) { @@ -268,6 +307,7 @@ class HttpBoundProtocolPayloadGenerator( Vec::new() """, ) + is StructureShape -> rust("#T()", serializerGenerator.unsetStructure(targetShape)) is UnionShape -> rust("#T()", serializerGenerator.unsetUnion(targetShape)) else -> throw CodegenException("`httpPayload` on member shapes targeting shapes of type ${targetShape.type} is unsupported") @@ -310,6 +350,7 @@ class HttpBoundProtocolPayloadGenerator( rust("$payloadName.into_inner()") } } + is StructureShape, is UnionShape -> { check( !((targetShape as? UnionShape)?.isEventStream() ?: false), @@ -320,12 +361,14 @@ class HttpBoundProtocolPayloadGenerator( serializer.payloadSerializer(member), ) } + is DocumentShape -> { rust( "#T($payloadName)", serializer.documentSerializer(), ) } + else -> PANIC("Unexpected payload target type: $targetShape") } } From 562d1787b5a08b2de7ab1cd78d2c885cb8d612aa Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 6 Oct 2023 11:11:09 -0400 Subject: [PATCH 153/331] 0.56 cherry-picks (#3035) - enable bedrock runtime - ignore flaky tests ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/aws-models/bedrock-runtime.json | 1166 +++++++++++++++++ aws/sdk/gradle.properties | 3 +- .../HttpBoundProtocolPayloadGenerator.kt | 77 +- rust-runtime/aws-smithy-client/src/conns.rs | 2 + 4 files changed, 1230 insertions(+), 18 deletions(-) create mode 100644 aws/sdk/aws-models/bedrock-runtime.json diff --git a/aws/sdk/aws-models/bedrock-runtime.json b/aws/sdk/aws-models/bedrock-runtime.json new file mode 100644 index 00000000000..238bd562b85 --- /dev/null +++ b/aws/sdk/aws-models/bedrock-runtime.json @@ -0,0 +1,1166 @@ +{ + "smithy": "2.0", + "shapes": { + "com.amazonaws.bedrockruntime#AccessDeniedException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The request is denied because of missing access permissions.

", + "smithy.api#error": "client", + "smithy.api#httpError": 403 + } + }, + "com.amazonaws.bedrockruntime#AmazonBedrockFrontendService": { + "type": "service", + "version": "2023-09-30", + "resources": [ + { + "target": "com.amazonaws.bedrockruntime#InferenceResource" + } + ], + "traits": { + "aws.api#service": { + "sdkId": "Bedrock Runtime", + "endpointPrefix": "bedrock-runtime", + "cloudTrailEventSource": "bedrock.amazonaws.com" + }, + "aws.auth#sigv4": { + "name": "bedrock" + }, + "aws.protocols#restJson1": {}, + "smithy.api#documentation": "

Describes the API operations for running inference using Bedrock models.

", + "smithy.api#title": "Amazon Bedrock Runtime", + "smithy.rules#endpointRuleSet": { + "version": "1.0", + "parameters": { + "Region": { + "builtIn": "AWS::Region", + "required": false, + "documentation": "The AWS region used to dispatch the request.", + "type": "String" + }, + "UseDualStack": { + "builtIn": "AWS::UseDualStack", + "required": true, + "default": false, + "documentation": "When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.", + "type": "Boolean" + }, + "UseFIPS": { + "builtIn": "AWS::UseFIPS", + "required": true, + "default": false, + "documentation": "When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.", + "type": "Boolean" + }, + "Endpoint": { + "builtIn": "SDK::Endpoint", + "required": false, + "documentation": "Override the endpoint used to send this request", + "type": "String" + } + }, + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Invalid Configuration: FIPS and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "PartitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ] + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" + } + ] + } + ] + }, + "smithy.rules#endpointTests": { + "testCases": [ + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For custom endpoint with region set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with region not set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips enabled and dualstack disabled", + "expect": { + "error": "Invalid Configuration: FIPS and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips disabled and dualstack enabled", + "expect": { + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "Missing region", + "expect": { + "error": "Invalid Configuration: Missing Region" + } + } + ], + "version": "1.0" + } + } + }, + "com.amazonaws.bedrockruntime#Body": { + "type": "blob", + "traits": { + "smithy.api#length": { + "max": 25000000 + }, + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#InferenceResource": { + "type": "resource", + "operations": [ + { + "target": "com.amazonaws.bedrockruntime#InvokeModel" + }, + { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStream" + } + ] + }, + "com.amazonaws.bedrockruntime#InternalServerException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

An internal server error occurred. Retry your request.

", + "smithy.api#error": "server", + "smithy.api#httpError": 500 + } + }, + "com.amazonaws.bedrockruntime#InvokeModel": { + "type": "operation", + "input": { + "target": "com.amazonaws.bedrockruntime#InvokeModelRequest" + }, + "output": { + "target": "com.amazonaws.bedrockruntime#InvokeModelResponse" + }, + "errors": [ + { + "target": "com.amazonaws.bedrockruntime#AccessDeniedException" + }, + { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelNotReadyException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + }, + { + "target": "com.amazonaws.bedrockruntime#ResourceNotFoundException" + }, + { + "target": "com.amazonaws.bedrockruntime#ServiceQuotaExceededException" + }, + { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + { + "target": "com.amazonaws.bedrockruntime#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Invokes the specified Bedrock model to run inference using the input provided in the request body. \n You use InvokeModel to run inference for text models, image models, and embedding models.

\n

For more information, see Run inference in the Bedrock User Guide.

\n

For example requests, see Examples (after the Errors section).

", + "smithy.api#http": { + "code": 200, + "method": "POST", + "uri": "/model/{modelId}/invoke" + } + } + }, + "com.amazonaws.bedrockruntime#InvokeModelIdentifier": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 2048 + }, + "smithy.api#pattern": "^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(([0-9]{12}:custom-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}/[a-z0-9]{12})|(:foundation-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.]?[a-z0-9-]{1,63}))|([0-9]{12}:provisioned-model/[a-z0-9]{12})))|([a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.]?[a-z0-9-]{1,63}))|(([0-9a-zA-Z][_-]?)+)$" + } + }, + "com.amazonaws.bedrockruntime#InvokeModelRequest": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Input data in the format specified in the content-type request header. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the input data in the request. The default value is\n application/json.

", + "smithy.api#httpHeader": "Content-Type" + } + }, + "accept": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The desired MIME type of the inference body in the response. The default value is\n application/json.

", + "smithy.api#httpHeader": "Accept" + } + }, + "modelId": { + "target": "com.amazonaws.bedrockruntime#InvokeModelIdentifier", + "traits": { + "smithy.api#documentation": "

Identifier of the model.

", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Inference response from the model in the format specified in the content-type header field. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the inference result.

", + "smithy.api#httpHeader": "Content-Type", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStream": { + "type": "operation", + "input": { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest" + }, + "output": { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse" + }, + "errors": [ + { + "target": "com.amazonaws.bedrockruntime#AccessDeniedException" + }, + { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelNotReadyException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelStreamErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + }, + { + "target": "com.amazonaws.bedrockruntime#ResourceNotFoundException" + }, + { + "target": "com.amazonaws.bedrockruntime#ServiceQuotaExceededException" + }, + { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + { + "target": "com.amazonaws.bedrockruntime#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Invoke the specified Bedrock model to run inference using the input provided.\n Return the response in a stream.

\n

For more information, see Run inference in the Bedrock User Guide.

\n

For an example request and response, see Examples (after the Errors section).

", + "smithy.api#http": { + "code": 200, + "method": "POST", + "uri": "/model/{modelId}/invoke-with-response-stream" + } + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Inference input in the format specified by the \n content-type. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the input data in the request. The default value is\n application/json.

", + "smithy.api#httpHeader": "Content-Type" + } + }, + "accept": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The desired MIME type of the inference body in the response. The default value is\n application/json.

", + "smithy.api#httpHeader": "X-Amzn-Bedrock-Accept" + } + }, + "modelId": { + "target": "com.amazonaws.bedrockruntime#InvokeModelIdentifier", + "traits": { + "smithy.api#documentation": "

Id of the model to invoke using the streaming request.

", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#ResponseStream", + "traits": { + "smithy.api#documentation": "

Inference response from the model in the format specified by Content-Type. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the inference result.

", + "smithy.api#httpHeader": "X-Amzn-Bedrock-Content-Type", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.bedrockruntime#MimeType": { + "type": "string" + }, + "com.amazonaws.bedrockruntime#ModelErrorException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + }, + "originalStatusCode": { + "target": "com.amazonaws.bedrockruntime#StatusCode", + "traits": { + "smithy.api#documentation": "

The original status code.

" + } + }, + "resourceName": { + "target": "com.amazonaws.bedrockruntime#NonBlankString", + "traits": { + "smithy.api#documentation": "

The resource name.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

The request failed due to an error while processing the model.

", + "smithy.api#error": "client", + "smithy.api#httpError": 424 + } + }, + "com.amazonaws.bedrockruntime#ModelNotReadyException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The model specified in the request is not ready to serve inference requests.

", + "smithy.api#error": "client", + "smithy.api#httpError": 429 + } + }, + "com.amazonaws.bedrockruntime#ModelStreamErrorException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + }, + "originalStatusCode": { + "target": "com.amazonaws.bedrockruntime#StatusCode", + "traits": { + "smithy.api#documentation": "

The original status code.

" + } + }, + "originalMessage": { + "target": "com.amazonaws.bedrockruntime#NonBlankString", + "traits": { + "smithy.api#documentation": "

The original message.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

An error occurred while streaming the response.

", + "smithy.api#error": "client", + "smithy.api#httpError": 424 + } + }, + "com.amazonaws.bedrockruntime#ModelTimeoutException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The request took too long to process. Processing time exceeded the model timeout length.

", + "smithy.api#error": "client", + "smithy.api#httpError": 408 + } + }, + "com.amazonaws.bedrockruntime#NonBlankString": { + "type": "string", + "traits": { + "smithy.api#pattern": "^[\\s\\S]*$" + } + }, + "com.amazonaws.bedrockruntime#PartBody": { + "type": "blob", + "traits": { + "smithy.api#length": { + "max": 1000000 + }, + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#PayloadPart": { + "type": "structure", + "members": { + "bytes": { + "target": "com.amazonaws.bedrockruntime#PartBody", + "traits": { + "smithy.api#documentation": "

Base64-encoded bytes of payload data.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Payload content included in the response.

", + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#ResourceNotFoundException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The specified resource ARN was not found. Check the ARN and try your request again.

", + "smithy.api#error": "client", + "smithy.api#httpError": 404 + } + }, + "com.amazonaws.bedrockruntime#ResponseStream": { + "type": "union", + "members": { + "chunk": { + "target": "com.amazonaws.bedrockruntime#PayloadPart", + "traits": { + "smithy.api#documentation": "

Content included in the response.

" + } + }, + "internalServerException": { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + "modelStreamErrorException": { + "target": "com.amazonaws.bedrockruntime#ModelStreamErrorException" + }, + "validationException": { + "target": "com.amazonaws.bedrockruntime#ValidationException" + }, + "throttlingException": { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + "modelTimeoutException": { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + } + }, + "traits": { + "smithy.api#documentation": "

Definition of content in the response stream.

", + "smithy.api#streaming": {} + } + }, + "com.amazonaws.bedrockruntime#ServiceQuotaExceededException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The number of requests exceeds the service quota. Resubmit your request later.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.bedrockruntime#StatusCode": { + "type": "integer", + "traits": { + "smithy.api#range": { + "min": 100, + "max": 599 + } + } + }, + "com.amazonaws.bedrockruntime#ThrottlingException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The number of requests exceeds the limit. Resubmit your request later.

", + "smithy.api#error": "client", + "smithy.api#httpError": 429 + } + }, + "com.amazonaws.bedrockruntime#ValidationException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

Input validation failed. Check your request parameters and retry the request.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + } + } +} diff --git a/aws/sdk/gradle.properties b/aws/sdk/gradle.properties index 3bd30286069..42754f181dd 100644 --- a/aws/sdk/gradle.properties +++ b/aws/sdk/gradle.properties @@ -8,4 +8,5 @@ aws.services= # List of services to generate Event Stream operations for: aws.services.eventstream.allowlist=\ aws-sdk-transcribestreaming,\ - aws-sdk-s3 + aws-sdk-s3,\ + aws-sdk-bedrockruntime diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt index 0ed594fc285..5b1d9df988a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt @@ -78,6 +78,7 @@ class HttpBoundProtocolPayloadGenerator( val (shape, payloadMemberName) = when (httpMessageType) { HttpMessageType.RESPONSE -> operationShape.outputShape(model) to httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + HttpMessageType.REQUEST -> operationShape.inputShape(model) to httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName } @@ -97,6 +98,7 @@ class HttpBoundProtocolPayloadGenerator( is DocumentShape, is StructureShape, is UnionShape -> ProtocolPayloadGenerator.PayloadMetadata( takesOwnership = false, ) + is StringShape, is BlobShape -> ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = true) else -> UNREACHABLE("Unexpected payload target type: $type") } @@ -110,8 +112,19 @@ class HttpBoundProtocolPayloadGenerator( additionalPayloadContext: AdditionalPayloadContext, ) { when (httpMessageType) { - HttpMessageType.RESPONSE -> generateResponsePayload(writer, shapeName, operationShape, additionalPayloadContext) - HttpMessageType.REQUEST -> generateRequestPayload(writer, shapeName, operationShape, additionalPayloadContext) + HttpMessageType.RESPONSE -> generateResponsePayload( + writer, + shapeName, + operationShape, + additionalPayloadContext, + ) + + HttpMessageType.REQUEST -> generateRequestPayload( + writer, + shapeName, + operationShape, + additionalPayloadContext, + ) } } @@ -119,13 +132,20 @@ class HttpBoundProtocolPayloadGenerator( writer: RustWriter, shapeName: String, operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext, ) { - val payloadMemberName = httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + val payloadMemberName = + httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName if (payloadMemberName == null) { val serializerGenerator = protocol.structuredDataSerializer() generateStructureSerializer(writer, shapeName, serializerGenerator.operationInputSerializer(operationShape)) } else { - generatePayloadMemberSerializer(writer, shapeName, operationShape, payloadMemberName, additionalPayloadContext) + generatePayloadMemberSerializer( + writer, + shapeName, + operationShape, + payloadMemberName, + additionalPayloadContext, + ) } } @@ -133,13 +153,24 @@ class HttpBoundProtocolPayloadGenerator( writer: RustWriter, shapeName: String, operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext, ) { - val payloadMemberName = httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + val payloadMemberName = + httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName if (payloadMemberName == null) { val serializerGenerator = protocol.structuredDataSerializer() - generateStructureSerializer(writer, shapeName, serializerGenerator.operationOutputSerializer(operationShape)) + generateStructureSerializer( + writer, + shapeName, + serializerGenerator.operationOutputSerializer(operationShape), + ) } else { - generatePayloadMemberSerializer(writer, shapeName, operationShape, payloadMemberName, additionalPayloadContext) + generatePayloadMemberSerializer( + writer, + shapeName, + operationShape, + payloadMemberName, + additionalPayloadContext, + ) } } @@ -152,16 +183,24 @@ class HttpBoundProtocolPayloadGenerator( ) { val serializerGenerator = protocol.structuredDataSerializer() - if (operationShape.isEventStream(model)) { - if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) { - val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName) - writer.serializeViaEventStream(operationShape, payloadMember, serializerGenerator, shapeName, additionalPayloadContext) - } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) { - val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName) - writer.serializeViaEventStream(operationShape, payloadMember, serializerGenerator, "output", additionalPayloadContext) - } else { - throw CodegenException("Payload serializer for event streams with an invalid configuration") - } + if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) { + val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName) + writer.serializeViaEventStream( + operationShape, + payloadMember, + serializerGenerator, + shapeName, + additionalPayloadContext, + ) + } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) { + val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName) + writer.serializeViaEventStream( + operationShape, + payloadMember, + serializerGenerator, + "output", + additionalPayloadContext, + ) } else { val bodyMetadata = payloadMetadata(operationShape) val payloadMember = when (httpMessageType) { @@ -268,6 +307,7 @@ class HttpBoundProtocolPayloadGenerator( Vec::new() """, ) + is StructureShape -> rust("#T()", serializerGenerator.unsetStructure(targetShape)) is UnionShape -> rust("#T()", serializerGenerator.unsetUnion(targetShape)) else -> throw CodegenException("`httpPayload` on member shapes targeting shapes of type ${targetShape.type} is unsupported") @@ -310,6 +350,7 @@ class HttpBoundProtocolPayloadGenerator( rust("$payloadName.into_inner()") } } + is StructureShape, is UnionShape -> { check( !((targetShape as? UnionShape)?.isEventStream() ?: false), @@ -320,12 +361,14 @@ class HttpBoundProtocolPayloadGenerator( serializer.payloadSerializer(member), ) } + is DocumentShape -> { rust( "#T($payloadName)", serializer.documentSerializer(), ) } + else -> PANIC("Unexpected payload target type: $targetShape") } } diff --git a/rust-runtime/aws-smithy-client/src/conns.rs b/rust-runtime/aws-smithy-client/src/conns.rs index 8ee1d8a929a..a1514dfa285 100644 --- a/rust-runtime/aws-smithy-client/src/conns.rs +++ b/rust-runtime/aws-smithy-client/src/conns.rs @@ -142,6 +142,7 @@ mod tests { use super::*; #[tokio::test] + #[ignore] async fn test_rustls_connector_can_make_http_requests() { let conn = Adapter::builder().build(https()); let conn = DynConnector::new(conn); @@ -151,6 +152,7 @@ mod tests { } #[tokio::test] + #[ignore] async fn test_rustls_connector_can_make_https_requests() { let conn = Adapter::builder().build(https()); let conn = DynConnector::new(conn); From 5c6b1a19f385cc582d4795f50240394267448f9f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 6 Oct 2023 09:18:53 -0700 Subject: [PATCH 154/331] Update CODEOWNERS to share ownership of examples --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 79b21893c0b..b830b172158 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -4,7 +4,6 @@ /codegen-server-test/ @awslabs/smithy-rs-server /codegen-server/ @awslabs/smithy-rs-server /rust-runtime/aws-smithy-http-server/ @awslabs/smithy-rs-server -/examples/ @awslabs/smithy-rs-server # Python Server /codegen-server-test/python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server @@ -25,6 +24,7 @@ /buildSrc/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server /codegen-core/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server /design/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server +/examples/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server /gradle.properties @awslabs/rust-sdk-owners @awslabs/smithy-rs-server /tools/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server /rust-runtime/aws-smithy-async/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server From 26a914ece072bba2dd9b5b49003204b70e7666ac Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 6 Oct 2023 10:32:35 -0700 Subject: [PATCH 155/331] Replace `DynConnector` and `HttpConnector` with `HttpClient` (#3011) This PR removes the last usages of `DynConnector` and `HttpConnector` from the `aws_smithy_client` crate with their counterparts in aws-smithy-runtime-api and aws-smithy-runtime. It also introduces `HttpClient` to make HTTP connector selection a smoother process, and adds a runtime plugin that configures a default `HttpClient` so that `Config` doesn't have to do that. The `DnsService` from aws-config is also moved into aws-smithy-runtime and refactored to be consistent with the other configurable traits in the orchestrator since it will likely be used in the future for more than just the ECS credentials provider. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 + aws/rust-runtime/aws-config/Cargo.toml | 15 +- .../aws-config/external-types.toml | 12 +- aws/rust-runtime/aws-config/src/connector.rs | 32 -- .../src/default_provider/app_name.rs | 10 +- .../src/default_provider/credentials.rs | 16 +- aws/rust-runtime/aws-config/src/ecs.rs | 241 +++++----- .../src/http_credential_provider.rs | 78 ++-- .../aws-config/src/imds/client.rs | 220 +++++---- .../aws-config/src/imds/client/error.rs | 2 +- .../aws-config/src/imds/credentials.rs | 98 ++-- .../aws-config/src/imds/region.rs | 21 +- aws/rust-runtime/aws-config/src/lib.rs | 139 +++--- .../aws-config/src/profile/credentials.rs | 2 +- .../src/profile/credentials/exec.rs | 4 +- .../aws-config/src/profile/region.rs | 8 +- .../aws-config/src/provider_config.rs | 131 ++---- aws/rust-runtime/aws-config/src/sso.rs | 7 +- aws/rust-runtime/aws-config/src/sts.rs | 3 +- .../aws-config/src/sts/assume_role.rs | 25 +- aws/rust-runtime/aws-config/src/test_case.rs | 55 +-- .../aws-config/src/web_identity_token.rs | 18 +- .../aws-credential-types/external-types.toml | 1 + .../src/cache/lazy_caching.rs | 21 +- aws/rust-runtime/aws-endpoint/Cargo.toml | 1 - aws/rust-runtime/aws-http/Cargo.toml | 1 - aws/rust-runtime/aws-inlineable/Cargo.toml | 4 - .../aws-inlineable/external-types.toml | 17 +- .../aws-inlineable/src/endpoint_discovery.rs | 2 +- .../aws-inlineable/src/glacier_checksums.rs | 227 ---------- .../src/http_body_checksum_middleware.rs | 417 ------------------ aws/rust-runtime/aws-inlineable/src/lib.rs | 7 - .../aws-inlineable/src/s3_request_id.rs | 4 +- aws/rust-runtime/aws-runtime/additional-ci | 12 + .../aws-runtime/src/invocation_id.rs | 3 +- aws/rust-runtime/aws-types/Cargo.toml | 5 +- .../aws-types/external-types.toml | 9 +- aws/rust-runtime/aws-types/src/lib.rs | 2 - aws/rust-runtime/aws-types/src/sdk_config.rs | 109 +++-- .../AwsCustomizableOperationDecorator.kt | 3 +- .../rustsdk/AwsFluentClientDecorator.kt | 5 +- .../amazon/smithy/rustsdk/CredentialCaches.kt | 2 +- .../rustsdk/IntegrationTestDependencies.kt | 5 +- .../smithy/rustsdk/SdkConfigDecorator.kt | 2 +- .../endpoints/OperationInputTestGenerator.kt | 13 +- .../rustsdk/EndpointBuiltInsDecoratorTest.kt | 27 +- .../rustsdk/EndpointsCredentialsTest.kt | 8 +- .../rustsdk/InvocationIdDecoratorTest.kt | 4 +- aws/sdk/integration-tests/dynamodb/Cargo.toml | 1 - .../dynamodb/tests/endpoints.rs | 5 +- .../dynamodb/tests/movies.rs | 390 ++++++++-------- .../dynamodb/tests/paginators.rs | 74 ++-- .../retries-with-client-rate-limiting.rs | 48 +- .../dynamodb/tests/shared-config.rs | 5 +- .../dynamodb/tests/timeouts.rs | 14 +- aws/sdk/integration-tests/ec2/Cargo.toml | 5 +- .../integration-tests/ec2/tests/paginators.rs | 25 +- aws/sdk/integration-tests/glacier/Cargo.toml | 2 +- .../glacier/tests/custom-headers.rs | 14 +- aws/sdk/integration-tests/iam/Cargo.toml | 2 +- .../iam/tests/resolve-global-endpoint.rs | 6 +- aws/sdk/integration-tests/kms/Cargo.toml | 2 +- .../kms/tests/integration.rs | 36 +- .../kms/tests/retryable_errors.rs | 6 +- aws/sdk/integration-tests/lambda/Cargo.toml | 4 +- .../lambda/tests/request_id.rs | 6 +- .../tests/client-construction.rs | 10 +- aws/sdk/integration-tests/polly/Cargo.toml | 1 - .../integration-tests/qldbsession/Cargo.toml | 3 +- .../qldbsession/tests/integration.rs | 12 +- aws/sdk/integration-tests/s3/Cargo.toml | 3 +- .../s3/tests/alternative-async-runtime.rs | 12 +- .../s3/tests/bucket-required.rs | 6 +- .../integration-tests/s3/tests/checksums.rs | 30 +- .../s3/tests/config-override.rs | 6 +- .../s3/tests/customizable-operation.rs | 7 +- .../integration-tests/s3/tests/endpoints.rs | 6 +- .../s3/tests/ignore-invalid-xml-body-root.rs | 12 +- .../s3/tests/interceptors.rs | 11 +- .../s3/tests/naughty-string-metadata.rs | 6 +- aws/sdk/integration-tests/s3/tests/no_auth.rs | 31 +- .../s3/tests/normalize-uri-path.rs | 6 +- .../query-strings-are-correctly-encoded.rs | 6 +- .../integration-tests/s3/tests/reconnects.rs | 14 +- .../s3/tests/recursion-detection.rs | 6 +- .../integration-tests/s3/tests/request_id.rs | 22 +- .../s3/tests/request_information_headers.rs | 18 +- .../s3/tests/required-query-params.rs | 10 +- .../s3/tests/select-object-content.rs | 6 +- ...erride.rs => service_timeout_overrides.rs} | 41 -- .../integration-tests/s3/tests/signing-it.rs | 10 +- .../s3/tests/status-200-errors.rs | 7 +- .../integration-tests/s3/tests/timeouts.rs | 4 +- .../s3/tests/user-agent-app-name.rs | 6 +- .../integration-tests/s3control/Cargo.toml | 3 +- .../s3control/tests/signing-it.rs | 10 +- aws/sdk/integration-tests/sts/Cargo.toml | 2 +- .../integration-tests/sts/tests/signing-it.rs | 18 +- .../timestreamquery/Cargo.toml | 1 - .../timestreamquery/tests/endpoint_disco.rs | 30 +- .../transcribestreaming/Cargo.toml | 2 +- .../transcribestreaming/tests/test.rs | 8 +- .../integration-tests/webassembly/Cargo.toml | 3 +- .../webassembly/src/adapter/http_client.rs | 29 -- .../webassembly/src/adapter/mod.rs | 44 -- .../webassembly/src/default_config.rs | 5 +- .../integration-tests/webassembly/src/http.rs | 62 +++ .../integration-tests/webassembly/src/lib.rs | 2 +- aws/sdk/sdk-external-types.toml | 12 +- .../ConnectionPoisoningConfigCustomization.kt | 2 +- .../HttpConnectorConfigDecorator.kt | 169 +++---- .../ResiliencyConfigCustomization.kt | 6 +- .../customizations/TimeSourceCustomization.kt | 6 +- .../customize/RequiredCustomizations.kt | 8 +- .../client/FluentClientDecorator.kt | 2 +- .../client/FluentClientGenerator.kt | 3 + .../protocol/ProtocolTestGenerator.kt | 15 +- .../customizations/HttpAuthDecoratorTest.kt | 155 ++++--- .../MetadataCustomizationTest.kt | 4 +- .../SensitiveOutputDecoratorTest.kt | 8 +- .../smithy/endpoint/EndpointsDecoratorTest.kt | 15 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 16 +- .../generators/EndpointTraitBindingsTest.kt | 10 +- .../CustomizableOperationGeneratorTest.kt | 11 +- .../client/FluentClientGeneratorTest.kt | 23 +- .../protocols/AwsQueryCompatibleTest.kt | 14 +- .../codegen/core/rustlang/CargoDependency.kt | 1 + .../rust/codegen/core/smithy/RuntimeType.kt | 4 +- examples/pokemon-service-common/Cargo.toml | 4 +- examples/pokemon-service-common/src/lib.rs | 6 +- .../tests/plugins_execution_order.rs | 6 +- examples/pokemon-service-tls/Cargo.toml | 2 +- .../pokemon-service-tls/tests/common/mod.rs | 6 +- .../python/pokemon-service-test/Cargo.toml | 2 +- .../pokemon-service-test/tests/helpers.rs | 6 +- rust-runtime/aws-smithy-async/Cargo.toml | 2 +- .../aws-smithy-async/src/future/mod.rs | 6 + .../aws-smithy-async/src/test_util.rs | 8 +- .../aws-smithy-runtime-api/src/client.rs | 4 +- .../src/client/connectors.rs | 122 ----- .../aws-smithy-runtime-api/src/client/dns.rs | 107 +++++ .../aws-smithy-runtime-api/src/client/http.rs | 308 +++++++++++++ .../src/client/orchestrator.rs | 4 +- .../src/client/runtime_components.rs | 113 +++-- .../src/client/runtime_plugin.rs | 39 +- .../aws-smithy-runtime-api/src/shared.rs | 23 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 10 +- .../aws-smithy-runtime/external-types.toml | 6 +- rust-runtime/aws-smithy-runtime/src/client.rs | 10 +- .../src/client/connectors.rs | 52 --- .../src/client/connectors/test_util.rs | 41 -- .../connectors/test_util/event_connector.rs | 187 -------- .../src/client/connectors/test_util/never.rs | 42 -- .../aws-smithy-runtime/src/client/dns.rs | 48 ++ .../aws-smithy-runtime/src/client/http.rs | 37 ++ .../connection_poisoning.rs | 0 .../hyper_connector.rs => http/hyper_014.rs} | 269 +++++++++-- .../src/client/http/test_util.rs | 58 +++ .../test_util/capture_request.rs | 20 +- .../{connectors => http}/test_util/dvr.rs | 12 +- .../test_util/dvr/record.rs | 36 +- .../test_util/dvr/replay.rs | 38 +- .../test_util/infallible.rs | 39 +- .../src/client/http/test_util/never.rs | 176 ++++++++ .../src/client/http/test_util/replay.rs | 260 +++++++++++ .../src/client/http/test_util/wire.rs | 353 +++++++++++++++ .../src/client/orchestrator.rs | 29 +- .../src/client/orchestrator/operation.rs | 113 +++-- .../aws-smithy-runtime/src/client/timeout.rs | 2 +- tools/ci-resources/tls-stub/Cargo.toml | 2 +- tools/ci-resources/tls-stub/src/main.rs | 7 +- 171 files changed, 3339 insertions(+), 2996 deletions(-) delete mode 100644 aws/rust-runtime/aws-config/src/connector.rs delete mode 100644 aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs delete mode 100644 aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs create mode 100755 aws/rust-runtime/aws-runtime/additional-ci rename aws/sdk/integration-tests/s3/tests/{make-connector-override.rs => service_timeout_overrides.rs} (58%) delete mode 100644 aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs delete mode 100644 aws/sdk/integration-tests/webassembly/src/adapter/mod.rs create mode 100644 aws/sdk/integration-tests/webassembly/src/http.rs delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/dns.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/http.rs delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors.rs delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/dns.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http.rs rename rust-runtime/aws-smithy-runtime/src/client/{connectors => http}/connection_poisoning.rs (100%) rename rust-runtime/aws-smithy-runtime/src/client/{connectors/hyper_connector.rs => http/hyper_014.rs} (76%) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs rename rust-runtime/aws-smithy-runtime/src/client/{connectors => http}/test_util/capture_request.rs (83%) rename rust-runtime/aws-smithy-runtime/src/client/{connectors => http}/test_util/dvr.rs (94%) rename rust-runtime/aws-smithy-runtime/src/client/{connectors => http}/test_util/dvr/record.rs (87%) rename rust-runtime/aws-smithy-runtime/src/client/{connectors => http}/test_util/dvr/replay.rs (91%) rename rust-runtime/aws-smithy-runtime/src/client/{connectors => http}/test_util/infallible.rs (51%) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index d9ed616628f..53ee76961ad 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,6 +11,18 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" +[[smithy-rs]] +message = "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details." +references = ["smithy-rs#3011"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[aws-sdk-rust]] +message = "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details." +references = ["smithy-rs#3011"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + [[smithy-rs]] message = "It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method." references = ["smithy-rs#2909"] diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 2e9d00f08a1..3c43472b1d3 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -9,11 +9,10 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [features] -client-hyper = ["aws-smithy-client/client-hyper", "aws-smithy-runtime/connector-hyper"] -rustls = ["aws-smithy-client/rustls", "client-hyper"] -native-tls = [] +client-hyper = ["aws-smithy-runtime/connector-hyper-0-14-x"] +rustls = ["aws-smithy-runtime/tls-rustls", "client-hyper"] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI -rt-tokio = ["aws-smithy-async/rt-tokio", "tokio/rt"] +rt-tokio = ["aws-smithy-async/rt-tokio", "aws-smithy-runtime/rt-tokio", "tokio/rt"] credentials-sso = ["dep:aws-sdk-sso", "dep:ring", "dep:hex", "dep:zeroize"] default = ["client-hyper", "rustls", "rt-tokio", "credentials-sso"] @@ -23,9 +22,7 @@ aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-type aws-http = { path = "../../sdk/build/aws-sdk/sdk/aws-http" } aws-sdk-sts = { path = "../../sdk/build/aws-sdk/sdk/sts", default-features = false } aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async" } -aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", default-features = false } aws-smithy-http = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-http" } -aws-smithy-http-tower = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-http-tower" } aws-smithy-json = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-json" } aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client"] } aws-smithy-runtime-api = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } @@ -42,7 +39,6 @@ fastrand = "2.0.0" bytes = "1.1.0" http = "0.2.4" -tower = { version = "0.4.8" } # implementation detail of SSO credential caching aws-sdk-sso = { path = "../../sdk/build/aws-sdk/sdk/sso", default-features = false, optional = true } @@ -51,7 +47,7 @@ hex = { version = "0.4.3", optional = true } zeroize = { version = "1", optional = true } [dev-dependencies] -aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } +aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x", "test-util"] } futures-util = { version = "0.3.16", default-features = false } tracing-test = "0.2.1" tracing-subscriber = { version = "0.3.16", features = ["fmt", "json"] } @@ -66,11 +62,10 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rt-tokio", "client-hyper"] } # used for a usage example hyper-rustls = { version = "0.24", features = ["webpki-tokio", "http2", "http1"] } -aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } +aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async", features = ["rt-tokio", "test-util"] } [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index b90a84885cb..450f0b5c9d0 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -9,17 +9,17 @@ allowed_external_types = [ "aws_credential_types::provider::SharedCredentialsProvider", "aws_sdk_sts::types::_policy_descriptor_type::PolicyDescriptorType", "aws_smithy_async::rt::sleep::AsyncSleep", + "aws_smithy_async::rt::sleep::SharedAsyncSleep", + "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_client::bounds::SmithyConnector", - "aws_smithy_client::conns::default_connector::default_connector", - "aws_smithy_client::erase::DynConnector", - "aws_smithy_client::erase::boxclone::BoxCloneService", - "aws_smithy_client::http_connector::ConnectorSettings", - "aws_smithy_client::http_connector::HttpConnector", "aws_smithy_http::body::SdkBody", "aws_smithy_http::endpoint", "aws_smithy_http::endpoint::error::InvalidEndpointError", "aws_smithy_http::result::SdkError", + "aws_smithy_runtime_api::client::dns::DnsResolver", + "aws_smithy_runtime_api::client::dns::SharedDnsResolver", + "aws_smithy_runtime_api::client::http::HttpClient", + "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_types::retry", "aws_smithy_types::retry::*", "aws_smithy_types::timeout", diff --git a/aws/rust-runtime/aws-config/src/connector.rs b/aws/rust-runtime/aws-config/src/connector.rs deleted file mode 100644 index 33c820261fa..00000000000 --- a/aws/rust-runtime/aws-config/src/connector.rs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Functionality related to creating new HTTP Connectors - -use aws_smithy_client::erase::DynConnector; - -/// Unwrap an [`Option`](aws_smithy_client::erase::DynConnector), and panic with a helpful error message if it's `None` -pub(crate) fn expect_connector(for_what: &str, connector: Option) -> DynConnector { - if let Some(conn) = connector { - conn - } else { - panic!("{for_what} require(s) a HTTP connector, but none was available. Enable the `rustls` crate feature or set a connector to fix this.") - } -} - -#[cfg(feature = "client-hyper")] -pub use aws_smithy_client::conns::default_connector; - -#[cfg(all(feature = "native-tls", not(feature = "allow-compilation")))] -compile_error!("Feature native-tls has been removed. For upgrade instructions, see: https://awslabs.github.io/smithy-rs/design/transport/connector.html"); - -/// Given `ConnectorSettings` and a [`SharedAsyncSleep`](aws_smithy_async::rt::sleep::SharedAsyncSleep), create a `DynConnector` from defaults depending on what cargo features are activated. -#[cfg(not(feature = "client-hyper"))] -pub fn default_connector( - _settings: &aws_smithy_client::http_connector::ConnectorSettings, - _sleep: Option, -) -> Option { - None -} diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index 041d0f82612..55e87f82bc1 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -90,7 +90,7 @@ mod tests { use super::*; use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; use crate::provider_config::ProviderConfig; - use crate::test_case::{no_traffic_connector, InstantSleep}; + use crate::test_case::{no_traffic_client, InstantSleep}; use aws_types::os_shim_internal::{Env, Fs}; #[tokio::test] @@ -105,7 +105,7 @@ mod tests { &ProviderConfig::no_configuration() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .app_name() .await; @@ -120,7 +120,7 @@ mod tests { let conf = crate::from_env() .sleep_impl(InstantSleep) .fs(fs) - .http_connector(no_traffic_connector()) + .http_client(no_traffic_client()) .profile_name("custom") .profile_files( ProfileFiles::builder() @@ -141,7 +141,7 @@ mod tests { &ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .app_name() .await; @@ -158,7 +158,7 @@ mod tests { &ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .app_name() .await; diff --git a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs index 30fd0101acf..13636e7d14e 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs @@ -226,7 +226,7 @@ mod test { /// make_test!(live: test_name) /// ``` macro_rules! make_test { - ($name: ident $(#[$m:meta])*) => { + ($name:ident $(#[$m:meta])*) => { make_test!($name, execute, $(#[$m])*); }; (update: $name:ident) => { @@ -235,13 +235,13 @@ mod test { (live: $name:ident) => { make_test!($name, execute_from_live_traffic); }; - ($name: ident, $func: ident, $(#[$m:meta])*) => { + ($name:ident, $func:ident, $(#[$m:meta])*) => { make_test!($name, $func, std::convert::identity $(, #[$m])*); }; - ($name: ident, builder: $provider_config_builder: expr) => { + ($name:ident, builder: $provider_config_builder:expr) => { make_test!($name, execute, $provider_config_builder); }; - ($name: ident, $func: ident, $provider_config_builder: expr $(, #[$m:meta])*) => { + ($name:ident, $func:ident, $provider_config_builder:expr $(, #[$m:meta])*) => { $(#[$m])* #[tokio::test] async fn $name() { @@ -335,14 +335,14 @@ mod test { use crate::provider_config::ProviderConfig; use aws_credential_types::provider::error::CredentialsError; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::boxclone::BoxCloneService; - use aws_smithy_client::never::NeverConnected; + use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; + use aws_smithy_runtime::client::http::test_util::NeverTcpConnector; tokio::time::pause(); let conf = ProviderConfig::no_configuration() - .with_tcp_connector(BoxCloneService::new(NeverConnected::new())) + .with_http_client(HyperClientBuilder::new().build(NeverTcpConnector::new())) .with_time_source(StaticTimeSource::new(UNIX_EPOCH)) - .with_sleep(TokioSleep::new()); + .with_sleep_impl(TokioSleep::new()); let provider = DefaultCredentialsChain::builder() .configure(conf) .build() diff --git a/aws/rust-runtime/aws-config/src/ecs.rs b/aws/rust-runtime/aws-config/src/ecs.rs index f5ca10e54c1..ef63015e692 100644 --- a/aws/rust-runtime/aws-config/src/ecs.rs +++ b/aws/rust-runtime/aws-config/src/ecs.rs @@ -46,24 +46,21 @@ //! } //! ``` -use std::error::Error; -use std::fmt::{Display, Formatter}; -use std::io; -use std::net::IpAddr; - +use crate::http_credential_provider::HttpCredentialProvider; +use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; -use aws_smithy_client::erase::boxclone::BoxCloneService; use aws_smithy_http::endpoint::apply_endpoint; +use aws_smithy_runtime_api::client::dns::{DnsResolver, ResolveDnsError, SharedDnsResolver}; +use aws_smithy_runtime_api::client::http::HttpConnectorSettings; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; -use http::uri::{InvalidUri, PathAndQuery, Scheme}; -use http::{HeaderValue, Uri}; -use tower::{Service, ServiceExt}; - -use crate::http_credential_provider::HttpCredentialProvider; -use crate::provider_config::ProviderConfig; -use aws_smithy_client::http_connector::ConnectorSettings; use aws_types::os_shim_internal::Env; use http::header::InvalidHeaderValue; +use http::uri::{InvalidUri, PathAndQuery, Scheme}; +use http::{HeaderValue, Uri}; +use std::error::Error; +use std::fmt::{Display, Formatter}; +use std::net::IpAddr; use std::time::Duration; use tokio::sync::OnceCell; @@ -143,14 +140,14 @@ enum Provider { } impl Provider { - async fn uri(env: Env, dns: Option) -> Result { + async fn uri(env: Env, dns: Option) -> Result { let relative_uri = env.get(ENV_RELATIVE_URI).ok(); let full_uri = env.get(ENV_FULL_URI).ok(); if let Some(relative_uri) = relative_uri { Self::build_full_uri(relative_uri) } else if let Some(full_uri) = full_uri { - let mut dns = dns.or_else(tokio_dns); - validate_full_uri(&full_uri, dns.as_mut()) + let dns = dns.or_else(default_dns); + validate_full_uri(&full_uri, dns) .await .map_err(|err| EcsConfigurationError::InvalidFullUri { err, uri: full_uri }) } else { @@ -177,8 +174,8 @@ impl Provider { let http_provider = HttpCredentialProvider::builder() .configure(&provider_config) - .connector_settings( - ConnectorSettings::builder() + .http_connector_settings( + HttpConnectorSettings::builder() .connect_timeout(DEFAULT_CONNECT_TIMEOUT) .read_timeout(DEFAULT_READ_TIMEOUT) .build(), @@ -261,7 +258,7 @@ impl Error for EcsConfigurationError { #[derive(Default, Debug, Clone)] pub struct Builder { provider_config: Option, - dns: Option, + dns: Option, connect_timeout: Option, read_timeout: Option, } @@ -275,10 +272,10 @@ impl Builder { /// Override the DNS resolver used to validate URIs /// - /// URIs must refer to loopback addresses. The `DnsService` is used to retrieve IP addresses for - /// a given domain. - pub fn dns(mut self, dns: DnsService) -> Self { - self.dns = Some(dns); + /// URIs must refer to loopback addresses. The [`DnsResolver`](aws_smithy_runtime_api::client::dns::DnsResolver) + /// is used to retrieve IP addresses for a given domain. + pub fn dns(mut self, dns: impl DnsResolver + 'static) -> Self { + self.dns = Some(dns.into_shared()); self } @@ -319,9 +316,9 @@ enum InvalidFullUriErrorKind { #[non_exhaustive] InvalidUri(InvalidUri), - /// No Dns service was provided + /// No Dns resolver was provided #[non_exhaustive] - NoDnsService, + NoDnsResolver, /// The URI did not specify a host #[non_exhaustive] @@ -332,7 +329,7 @@ enum InvalidFullUriErrorKind { NotLoopback, /// DNS lookup failed when attempting to resolve the host to an IP Address for validation. - DnsLookupFailed(io::Error), + DnsLookupFailed(ResolveDnsError), } /// Invalid Full URI @@ -358,7 +355,7 @@ impl Display for InvalidFullUriError { "failed to perform DNS lookup while validating URI" ) } - NoDnsService => write!(f, "no DNS service was provided. Enable `rt-tokio` or provide a `dns` service to the builder.") + NoDnsResolver => write!(f, "no DNS resolver was provided. Enable `rt-tokio` or provide a `dns` resolver to the builder.") } } } @@ -368,7 +365,7 @@ impl Error for InvalidFullUriError { use InvalidFullUriErrorKind::*; match &self.kind { InvalidUri(err) => Some(err), - DnsLookupFailed(err) => Some(err), + DnsLookupFailed(err) => Some(err as _), _ => None, } } @@ -380,9 +377,6 @@ impl From for InvalidFullUriError { } } -/// Dns resolver interface -pub type DnsService = BoxCloneService, io::Error>; - /// Validate that `uri` is valid to be used as a full provider URI /// Either: /// 1. The URL is uses `https` @@ -391,7 +385,7 @@ pub type DnsService = BoxCloneService, io::Error>; /// the credentials provider will return `CredentialsError::InvalidConfiguration` async fn validate_full_uri( uri: &str, - dns: Option<&mut DnsService>, + dns: Option, ) -> Result { let uri = uri .parse::() @@ -404,12 +398,11 @@ async fn validate_full_uri( let is_loopback = match host.parse::() { Ok(addr) => addr.is_loopback(), Err(_domain_name) => { - let dns = dns.ok_or(InvalidFullUriErrorKind::NoDnsService)?; - dns.ready().await.map_err(InvalidFullUriErrorKind::DnsLookupFailed)? - .call(host.to_owned()) - .await - .map_err(InvalidFullUriErrorKind::DnsLookupFailed)? - .iter() + let dns = dns.ok_or(InvalidFullUriErrorKind::NoDnsResolver)?; + dns.resolve_dns(host.to_owned()) + .await + .map_err(|err| InvalidFullUriErrorKind::DnsLookupFailed(ResolveDnsError::new(err)))? + .iter() .all(|addr| { if !addr.is_loopback() { tracing::warn!( @@ -427,87 +420,49 @@ async fn validate_full_uri( } } +/// Default DNS resolver impl +/// +/// DNS resolution is required to validate that provided URIs point to the loopback interface #[cfg(any(not(feature = "rt-tokio"), target_family = "wasm"))] -fn tokio_dns() -> Option { +fn default_dns() -> Option { None } - -/// DNS resolver that uses tokio::spawn_blocking -/// -/// DNS resolution is required to validate that provided URIs point to the loopback interface #[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] -fn tokio_dns() -> Option { - use aws_smithy_client::erase::boxclone::BoxFuture; - use std::io::ErrorKind; - use std::net::ToSocketAddrs; - use std::task::{Context, Poll}; - - #[derive(Clone)] - struct TokioDns; - impl Service for TokioDns { - type Response = Vec; - type Error = io::Error; - type Future = BoxFuture; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: String) -> Self::Future { - Box::pin(async move { - let result = tokio::task::spawn_blocking(move || (req, 0).to_socket_addrs()).await; - match result { - Err(join_failure) => Err(io::Error::new(ErrorKind::Other, join_failure)), - Ok(Ok(dns_result)) => { - Ok(dns_result.into_iter().map(|addr| addr.ip()).collect()) - } - Ok(Err(dns_failure)) => Err(dns_failure), - } - }) - } - } - Some(BoxCloneService::new(TokioDns)) +fn default_dns() -> Option { + use aws_smithy_runtime::client::dns::TokioDnsResolver; + Some(TokioDnsResolver::new().into_shared()) } #[cfg(test)] mod test { - use aws_smithy_client::erase::boxclone::BoxCloneService; - use aws_smithy_client::never::NeverService; - use futures_util::FutureExt; - use http::Uri; - use serde::Deserialize; - use tracing_test::traced_test; - - use crate::ecs::{ - tokio_dns, validate_full_uri, Builder, EcsCredentialsProvider, InvalidFullUriError, - InvalidFullUriErrorKind, Provider, - }; + use super::*; use crate::provider_config::ProviderConfig; use crate::test_case::GenericTestResult; - use aws_credential_types::provider::ProvideCredentials; use aws_credential_types::Credentials; - use aws_types::os_shim_internal::Env; - + use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_runtime_api::client::dns::DnsFuture; + use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::shared::IntoShared; + use aws_types::os_shim_internal::Env; + use futures_util::FutureExt; use http::header::AUTHORIZATION; + use http::Uri; + use serde::Deserialize; use std::collections::HashMap; use std::error::Error; - use std::future::Ready; - use std::io; use std::net::IpAddr; - use std::task::{Context, Poll}; use std::time::{Duration, UNIX_EPOCH}; - use tower::Service; + use tracing_test::traced_test; - fn provider(env: Env, connector: DynConnector) -> EcsCredentialsProvider { + fn provider(env: Env, http_client: impl HttpClient + 'static) -> EcsCredentialsProvider { let provider_config = ProviderConfig::empty() .with_env(env) - .with_http_connector(connector) - .with_sleep(TokioSleep::new()); + .with_http_client(http_client) + .with_sleep_impl(TokioSleep::new()); Builder::default().configure(&provider_config).build() } @@ -520,7 +475,7 @@ mod test { impl EcsUriTest { async fn check(&self) { let env = Env::from(self.env.clone()); - let uri = Provider::uri(env, Some(BoxCloneService::new(TestDns::default()))) + let uri = Provider::uri(env, Some(TestDns::default().into_shared())) .await .map(|uri| uri.to_string()); self.result.assert_matches(uri); @@ -546,8 +501,7 @@ mod test { #[test] fn validate_uri_https() { // over HTTPs, any URI is fine - let never = NeverService::new(); - let mut dns = Some(BoxCloneService::new(never)); + let dns = Some(NeverDns.into_shared()); assert_eq!( validate_full_uri("https://amazon.com", None) .now_or_never() @@ -557,7 +511,7 @@ mod test { ); // over HTTP, it will try to lookup assert!( - validate_full_uri("http://amazon.com", dns.as_mut()) + validate_full_uri("http://amazon.com", dns) .now_or_never() .is_none(), "DNS lookup should occur, but it will never return" @@ -571,7 +525,7 @@ mod test { matches!( no_dns_error, InvalidFullUriError { - kind: InvalidFullUriErrorKind::NoDnsService + kind: InvalidFullUriErrorKind::NoDnsResolver } ), "expected no dns service, got: {}", @@ -603,12 +557,14 @@ mod test { #[test] fn all_addrs_local() { - let svc = TestDns::with_fallback(vec![ - "127.0.0.1".parse().unwrap(), - "127.0.0.2".parse().unwrap(), - ]); - let mut svc = Some(BoxCloneService::new(svc)); - let resp = validate_full_uri("http://localhost:8888", svc.as_mut()) + let dns = Some( + TestDns::with_fallback(vec![ + "127.0.0.1".parse().unwrap(), + "127.0.0.2".parse().unwrap(), + ]) + .into_shared(), + ); + let resp = validate_full_uri("http://localhost:8888", dns) .now_or_never() .unwrap(); assert!(resp.is_ok(), "Should be valid: {:?}", resp); @@ -616,12 +572,14 @@ mod test { #[test] fn all_addrs_not_local() { - let svc = TestDns::with_fallback(vec![ - "127.0.0.1".parse().unwrap(), - "192.168.0.1".parse().unwrap(), - ]); - let mut svc = Some(BoxCloneService::new(svc)); - let resp = validate_full_uri("http://localhost:8888", svc.as_mut()) + let dns = Some( + TestDns::with_fallback(vec![ + "127.0.0.1".parse().unwrap(), + "192.168.0.1".parse().unwrap(), + ]) + .into_shared(), + ); + let resp = validate_full_uri("http://localhost:8888", dns) .now_or_never() .unwrap(); assert!( @@ -675,37 +633,37 @@ mod test { ("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", "/credentials"), ("AWS_CONTAINER_AUTHORIZATION_TOKEN", "Basic password"), ]); - let connector = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( creds_request("http://169.254.170.2/credentials", Some("Basic password")), ok_creds_response(), )]); - let provider = provider(env, DynConnector::new(connector.clone())); + let provider = provider(env, http_client.clone()); let creds = provider .provide_credentials() .await .expect("valid credentials"); assert_correct(creds); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn retry_5xx() { let env = Env::from_slice(&[("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", "/credentials")]); - let connector = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( creds_request("http://169.254.170.2/credentials", None), http::Response::builder() .status(500) .body(SdkBody::empty()) .unwrap(), ), - ( + ReplayEvent::new( creds_request("http://169.254.170.2/credentials", None), ok_creds_response(), ), ]); tokio::time::pause(); - let provider = provider(env, DynConnector::new(connector.clone())); + let provider = provider(env, http_client.clone()); let creds = provider .provide_credentials() .await @@ -716,17 +674,17 @@ mod test { #[tokio::test] async fn load_valid_creds_no_auth() { let env = Env::from_slice(&[("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", "/credentials")]); - let connector = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( creds_request("http://169.254.170.2/credentials", None), ok_creds_response(), )]); - let provider = provider(env, DynConnector::new(connector.clone())); + let provider = provider(env, http_client.clone()); let creds = provider .provide_credentials() .await .expect("valid credentials"); assert_correct(creds); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } // ignored by default because it relies on actual DNS resolution @@ -735,8 +693,12 @@ mod test { #[traced_test] #[ignore] async fn real_dns_lookup() { - let mut dns = Some(tokio_dns().expect("feature must be enabled")); - let err = validate_full_uri("http://www.amazon.com/creds", dns.as_mut()) + let dns = Some( + default_dns() + .expect("feature must be enabled") + .into_shared(), + ); + let err = validate_full_uri("http://www.amazon.com/creds", dns.clone()) .await .expect_err("not a loopback"); assert!( @@ -752,13 +714,13 @@ mod test { assert!(logs_contain( "Address does not resolve to the loopback interface" )); - validate_full_uri("http://localhost:8888/creds", dns.as_mut()) + validate_full_uri("http://localhost:8888/creds", dns) .await .expect("localhost is the loopback interface"); } - /// TestService which always returns the same IP addresses - #[derive(Clone)] + /// Always returns the same IP addresses + #[derive(Clone, Debug)] struct TestDns { addrs: HashMap>, fallback: Vec, @@ -789,17 +751,20 @@ mod test { } } - impl Service for TestDns { - type Response = Vec; - type Error = io::Error; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) + impl DnsResolver for TestDns { + fn resolve_dns(&self, name: String) -> DnsFuture { + DnsFuture::ready(Ok(self.addrs.get(&name).unwrap_or(&self.fallback).clone())) } + } - fn call(&mut self, _req: String) -> Self::Future { - std::future::ready(Ok(self.addrs.get(&_req).unwrap_or(&self.fallback).clone())) + #[derive(Debug)] + struct NeverDns; + impl DnsResolver for NeverDns { + fn resolve_dns(&self, _name: String) -> DnsFuture { + DnsFuture::new(async { + Never::new().await; + unreachable!() + }) } } } diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index 2bb2cc25c7e..0a39adf7b91 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -8,20 +8,17 @@ //! //! Future work will stabilize this interface and enable it to be used directly. -use crate::connector::expect_connector; use crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials}; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError}; use aws_credential_types::Credentials; -use aws_smithy_client::http_connector::ConnectorSettings; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::SdkError; -use aws_smithy_runtime::client::connectors::adapter::DynConnectorAdapter; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::classifier::{ HttpStatusCodeClassifier, SmithyErrorClassifier, }; -use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; +use aws_smithy_runtime_api::client::http::HttpConnectorSettings; use aws_smithy_runtime_api::client::interceptors::context::{Error, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{ HttpResponse, OrchestratorError, SensitiveOutput, @@ -30,6 +27,7 @@ use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryClassifiers, R use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::{ErrorKind, RetryConfig}; +use aws_smithy_types::timeout::TimeoutConfig; use http::header::{ACCEPT, AUTHORIZATION}; use http::{HeaderValue, Response}; use std::time::Duration; @@ -65,7 +63,7 @@ impl HttpCredentialProvider { #[derive(Default)] pub(crate) struct Builder { provider_config: Option, - connector_settings: Option, + http_connector_settings: Option, } impl Builder { @@ -74,8 +72,11 @@ impl Builder { self } - pub(crate) fn connector_settings(mut self, connector_settings: ConnectorSettings) -> Self { - self.connector_settings = Some(connector_settings); + pub(crate) fn http_connector_settings( + mut self, + http_connector_settings: HttpConnectorSettings, + ) -> Self { + self.http_connector_settings = Some(http_connector_settings); self } @@ -86,16 +87,6 @@ impl Builder { path: impl Into, ) -> HttpCredentialProvider { let provider_config = self.provider_config.unwrap_or_default(); - let connector_settings = self.connector_settings.unwrap_or_else(|| { - ConnectorSettings::builder() - .connect_timeout(DEFAULT_CONNECT_TIMEOUT) - .read_timeout(DEFAULT_READ_TIMEOUT) - .build() - }); - let connector = expect_connector( - "The HTTP credentials provider", - provider_config.connector(&connector_settings), - ); // The following errors are retryable: // - Socket errors @@ -112,18 +103,24 @@ impl Builder { let mut builder = Operation::builder() .service_name("HttpCredentialProvider") .operation_name("LoadCredentials") - .http_connector(SharedHttpConnector::new(DynConnectorAdapter::new( - connector, - ))) .with_connection_poisoning() .endpoint_url(endpoint) .no_auth() + .timeout_config( + TimeoutConfig::builder() + .connect_timeout(DEFAULT_CONNECT_TIMEOUT) + .read_timeout(DEFAULT_READ_TIMEOUT) + .build(), + ) .runtime_plugin(StaticRuntimePlugin::new().with_config({ let mut layer = Layer::new("SensitiveOutput"); layer.store_put(SensitiveOutput); layer.freeze() })); - if let Some(sleep_impl) = provider_config.sleep() { + if let Some(http_client) = provider_config.http_client() { + builder = builder.http_client(http_client); + } + if let Some(sleep_impl) = provider_config.sleep_impl() { builder = builder .standard_retry(&RetryConfig::standard()) .retry_classifiers(retry_classifiers) @@ -221,24 +218,23 @@ impl ClassifyRetry for HttpCredentialRetryClassifier { mod test { use super::*; use aws_credential_types::provider::error::CredentialsError; - use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use http::{Request, Response, Uri}; use std::time::SystemTime; async fn provide_creds( - connector: TestConnection, + http_client: StaticReplayClient, ) -> Result { - let provider_config = ProviderConfig::default().with_http_connector(connector.clone()); + let provider_config = ProviderConfig::default().with_http_client(http_client.clone()); let provider = HttpCredentialProvider::builder() .configure(&provider_config) .build("test", "http://localhost:1234/", "/some-creds"); provider.credentials(None).await } - fn successful_req_resp() -> (HttpRequest, HttpResponse) { - ( + fn successful_req_resp() -> ReplayEvent { + ReplayEvent::new( Request::builder() .uri(Uri::from_static("http://localhost:1234/some-creds")) .body(SdkBody::empty()) @@ -259,8 +255,8 @@ mod test { #[tokio::test] async fn successful_response() { - let connector = TestConnection::new(vec![successful_req_resp()]); - let creds = provide_creds(connector.clone()).await.expect("success"); + let http_client = StaticReplayClient::new(vec![successful_req_resp()]); + let creds = provide_creds(http_client.clone()).await.expect("success"); assert_eq!("MUA...", creds.access_key_id()); assert_eq!("/7PC5om....", creds.secret_access_key()); assert_eq!(Some("AQoDY....="), creds.session_token()); @@ -268,13 +264,13 @@ mod test { Some(SystemTime::UNIX_EPOCH + Duration::from_secs(1456380211)), creds.expiry() ); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn retry_nonparseable_response() { - let connector = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( Request::builder() .uri(Uri::from_static("http://localhost:1234/some-creds")) .body(SdkBody::empty()) @@ -286,15 +282,15 @@ mod test { ), successful_req_resp(), ]); - let creds = provide_creds(connector.clone()).await.expect("success"); + let creds = provide_creds(http_client.clone()).await.expect("success"); assert_eq!("MUA...", creds.access_key_id()); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn retry_error_code() { - let connector = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( Request::builder() .uri(Uri::from_static("http://localhost:1234/some-creds")) .body(SdkBody::empty()) @@ -306,14 +302,14 @@ mod test { ), successful_req_resp(), ]); - let creds = provide_creds(connector.clone()).await.expect("success"); + let creds = provide_creds(http_client.clone()).await.expect("success"); assert_eq!("MUA...", creds.access_key_id()); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn explicit_error_not_retriable() { - let connector = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( Request::builder() .uri(Uri::from_static("http://localhost:1234/some-creds")) .body(SdkBody::empty()) @@ -325,13 +321,13 @@ mod test { )) .unwrap(), )]); - let err = provide_creds(connector.clone()) + let err = provide_creds(http_client.clone()) .await .expect_err("it should fail"); assert!( matches!(err, CredentialsError::ProviderError { .. }), "should be CredentialsError::ProviderError: {err}", ); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } } diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 32aa772023e..be93a1fe437 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -7,36 +7,24 @@ //! //! Client for direct access to IMDSv2. -use crate::connector::expect_connector; use crate::imds::client::error::{BuildError, ImdsError, InnerImdsError, InvalidEndpointMode}; use crate::imds::client::token::TokenRuntimePlugin; use crate::provider_config::ProviderConfig; use crate::PKG_VERSION; use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_runtime::user_agent::UserAgentInterceptor; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::http_connector::ConnectorSettings; -use aws_smithy_client::SdkError; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; -use aws_smithy_runtime::client::connectors::adapter::DynConnectorAdapter; +use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; -use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; -use aws_smithy_runtime_api::client::endpoint::{ - EndpointResolver, EndpointResolverParams, SharedEndpointResolver, -}; +use aws_smithy_runtime_api::client::endpoint::{EndpointResolver, EndpointResolverParams}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::interceptors::SharedInterceptor; use aws_smithy_runtime_api::client::orchestrator::{ Future, HttpResponse, OrchestratorError, SensitiveOutput, }; -use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RetryClassifiers, RetryReason, SharedRetryStrategy, -}; +use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryClassifiers, RetryReason}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; use aws_smithy_types::config_bag::{FrozenLayer, Layer}; @@ -244,12 +232,10 @@ struct ImdsCommonRuntimePlugin { impl ImdsCommonRuntimePlugin { fn new( - connector: DynConnector, + config: &ProviderConfig, endpoint_resolver: ImdsEndpointResolver, retry_config: &RetryConfig, timeout_config: TimeoutConfig, - time_source: SharedTimeSource, - sleep_impl: Option, ) -> Self { let mut layer = Layer::new("ImdsCommonRuntimePlugin"); layer.store_put(AuthSchemeOptionResolverParams::new(())); @@ -261,19 +247,15 @@ impl ImdsCommonRuntimePlugin { Self { config: layer.freeze(), components: RuntimeComponentsBuilder::new("ImdsCommonRuntimePlugin") - .with_http_connector(Some(SharedHttpConnector::new(DynConnectorAdapter::new( - connector, - )))) - .with_endpoint_resolver(Some(SharedEndpointResolver::new(endpoint_resolver))) - .with_interceptor(SharedInterceptor::new(UserAgentInterceptor::new())) + .with_http_client(config.http_client()) + .with_endpoint_resolver(Some(endpoint_resolver)) + .with_interceptor(UserAgentInterceptor::new()) .with_retry_classifiers(Some( RetryClassifiers::new().with_classifier(ImdsResponseRetryClassifier), )) - .with_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new( - retry_config, - )))) - .with_time_source(Some(time_source)) - .with_sleep_impl(sleep_impl), + .with_retry_strategy(Some(StandardRetryStrategy::new(retry_config))) + .with_time_source(Some(config.time_source())) + .with_sleep_impl(config.sleep_impl()), } } } @@ -427,11 +409,6 @@ impl Builder { .connect_timeout(self.connect_timeout.unwrap_or(DEFAULT_CONNECT_TIMEOUT)) .read_timeout(self.read_timeout.unwrap_or(DEFAULT_READ_TIMEOUT)) .build(); - let connector_settings = ConnectorSettings::from_timeout_config(&timeout_config); - let connector = expect_connector( - "The IMDS credentials provider", - config.connector(&connector_settings), - ); let endpoint_source = self .endpoint .unwrap_or_else(|| EndpointSource::Env(config.clone())); @@ -442,12 +419,10 @@ impl Builder { let retry_config = RetryConfig::standard() .with_max_attempts(self.max_attempts.unwrap_or(DEFAULT_ATTEMPTS)); let common_plugin = SharedRuntimePlugin::new(ImdsCommonRuntimePlugin::new( - connector, + &config, endpoint_resolver, &retry_config, timeout_config, - config.time_source(), - config.sleep(), )); let operation = Operation::builder() .service_name("imds") @@ -608,16 +583,19 @@ pub(crate) mod test { use crate::imds::client::{Client, EndpointMode, ImdsResponseRetryClassifier}; use crate::provider_config::ProviderConfig; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::{capture_request, TestConnection}; + use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep}; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; + use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, + }; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime_api::client::interceptors::context::{ Input, InterceptorContext, Output, }; - use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + use aws_smithy_runtime_api::client::orchestrator::{ + HttpRequest, HttpResponse, OrchestratorError, + }; use aws_smithy_runtime_api::client::retries::ClassifyRetry; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; @@ -648,7 +626,7 @@ pub(crate) mod test { const TOKEN_A: &str = "AQAEAFTNrA4eEGx0AQgJ1arIq_Cc-t4tWt3fB0Hd8RKhXlKc5ccvhg=="; const TOKEN_B: &str = "alternatetoken=="; - pub(crate) fn token_request(base: &str, ttl: u32) -> http::Request { + pub(crate) fn token_request(base: &str, ttl: u32) -> HttpRequest { http::Request::builder() .uri(format!("{}/latest/api/token", base)) .header("x-aws-ec2-metadata-token-ttl-seconds", ttl) @@ -657,15 +635,15 @@ pub(crate) mod test { .unwrap() } - pub(crate) fn token_response(ttl: u32, token: &'static str) -> http::Response<&'static str> { + pub(crate) fn token_response(ttl: u32, token: &'static str) -> HttpResponse { http::Response::builder() .status(200) .header("X-aws-ec2-metadata-token-ttl-seconds", ttl) - .body(token) + .body(SdkBody::from(token)) .unwrap() } - pub(crate) fn imds_request(path: &'static str, token: &str) -> http::Request { + pub(crate) fn imds_request(path: &'static str, token: &str) -> HttpRequest { http::Request::builder() .uri(Uri::from_static(path)) .method("GET") @@ -674,67 +652,71 @@ pub(crate) mod test { .unwrap() } - pub(crate) fn imds_response(body: &'static str) -> http::Response<&'static str> { - http::Response::builder().status(200).body(body).unwrap() + pub(crate) fn imds_response(body: &'static str) -> HttpResponse { + http::Response::builder() + .status(200) + .body(SdkBody::from(body)) + .unwrap() } - pub(crate) fn make_client(conn: &TestConnection) -> super::Client - where - SdkBody: From, - T: Send + 'static, - { + pub(crate) fn make_imds_client(http_client: &StaticReplayClient) -> super::Client { tokio::time::pause(); super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_sleep(TokioSleep::new()) - .with_http_connector(DynConnector::new(conn.clone())), + .with_sleep_impl(InstantSleep::unlogged()) + .with_http_client(http_client.clone()), ) .build() } + fn mock_imds_client(events: Vec) -> (Client, StaticReplayClient) { + let http_client = StaticReplayClient::new(events); + let client = make_imds_client(&http_client); + (client, http_client) + } + #[tokio::test] async fn client_caches_token() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata2", TOKEN_A), imds_response("output2"), ), ]); - let client = make_client(&connection); // load once let metadata = client.get("/latest/metadata").await.expect("failed"); assert_eq!("test-imds-output", metadata.as_ref()); // load again: the cached token should be used let metadata = client.get("/latest/metadata2").await.expect("failed"); assert_eq!("output2", metadata.as_ref()); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn token_can_expire() { - let connection = TestConnection::new(vec![ - ( + let (_, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output1"#), ), - ( + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_B), ), - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_B), imds_response(r#"test-imds-output2"#), ), @@ -743,9 +725,9 @@ pub(crate) mod test { let client = super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(connection.clone())) + .with_http_client(http_client.clone()) .with_time_source(time_source.clone()) - .with_sleep(sleep), + .with_sleep_impl(sleep), ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) @@ -755,7 +737,7 @@ pub(crate) mod test { // now the cached credential has expired time_source.advance(Duration::from_secs(600)); let resp2 = client.get("/latest/metadata").await.expect("success"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); assert_eq!("test-imds-output1", resp1.as_ref()); assert_eq!("test-imds-output2", resp2.as_ref()); } @@ -763,27 +745,27 @@ pub(crate) mod test { /// Tokens are refreshed up to 120 seconds early to avoid using an expired token. #[tokio::test] async fn token_refresh_buffer() { - let connection = TestConnection::new(vec![ - ( + let (_, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_A), ), // t = 0 - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output1"#), ), // t = 400 (no refresh) - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output2"#), ), // t = 550 (within buffer) - ( + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_B), ), - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_B), imds_response(r#"test-imds-output3"#), ), @@ -792,8 +774,8 @@ pub(crate) mod test { let client = super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_sleep(sleep) - .with_http_connector(DynConnector::new(connection.clone())) + .with_sleep_impl(sleep) + .with_http_client(http_client.clone()) .with_time_source(time_source.clone()), ) .endpoint_mode(EndpointMode::IpV6) @@ -806,7 +788,7 @@ pub(crate) mod test { let resp2 = client.get("/latest/metadata").await.expect("success"); time_source.advance(Duration::from_secs(150)); let resp3 = client.get("/latest/metadata").await.expect("success"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); assert_eq!("test-imds-output1", resp1.as_ref()); assert_eq!("test-imds-output2", resp2.as_ref()); assert_eq!("test-imds-output3", resp3.as_ref()); @@ -816,21 +798,23 @@ pub(crate) mod test { #[tokio::test] #[traced_test] async fn retry_500() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), - http::Response::builder().status(500).body("").unwrap(), + http::Response::builder() + .status(500) + .body(SdkBody::empty()) + .unwrap(), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), imds_response("ok"), ), ]); - let client = make_client(&connection); assert_eq!( "ok", client @@ -839,11 +823,11 @@ pub(crate) mod test { .expect("success") .as_ref() ); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); // all requests should have a user agent header - for request in connection.requests().iter() { - assert!(request.actual.headers().get(USER_AGENT).is_some()); + for request in http_client.actual_requests() { + assert!(request.headers().get(USER_AGENT).is_some()); } } @@ -851,21 +835,23 @@ pub(crate) mod test { #[tokio::test] #[traced_test] async fn retry_token_failure() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), - http::Response::builder().status(500).body("").unwrap(), + http::Response::builder() + .status(500) + .body(SdkBody::empty()) + .unwrap(), ), - ( + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), imds_response("ok"), ), ]); - let client = make_client(&connection); assert_eq!( "ok", client @@ -874,32 +860,34 @@ pub(crate) mod test { .expect("success") .as_ref() ); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// 401 error during metadata retrieval must be retried #[tokio::test] #[traced_test] async fn retry_metadata_401() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(0, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), - http::Response::builder().status(401).body("").unwrap(), + http::Response::builder() + .status(401) + .body(SdkBody::empty()) + .unwrap(), ), - ( + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_B), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_B), imds_response("ok"), ), ]); - let client = make_client(&connection); assert_eq!( "ok", client @@ -908,21 +896,23 @@ pub(crate) mod test { .expect("success") .as_ref() ); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// 403 responses from IMDS during token acquisition MUST NOT be retried #[tokio::test] #[traced_test] async fn no_403_retry() { - let connection = TestConnection::new(vec![( + let (client, http_client) = mock_imds_client(vec![ReplayEvent::new( token_request("http://169.254.169.254", 21600), - http::Response::builder().status(403).body("").unwrap(), + http::Response::builder() + .status(403) + .body(SdkBody::empty()) + .unwrap(), )]); - let client = make_client(&connection); let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "forbidden"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// Successful responses should classify as `RetryKind::Unnecessary` @@ -945,24 +935,23 @@ pub(crate) mod test { // since tokens are sent as headers, the tokens need to be valid header values #[tokio::test] async fn invalid_token() { - let connection = TestConnection::new(vec![( + let (client, http_client) = mock_imds_client(vec![ReplayEvent::new( token_request("http://169.254.169.254", 21600), - token_response(21600, "replaced").map(|_| vec![1, 0]), + token_response(21600, "invalid\nheader\nvalue\0"), )]); - let client = make_client(&connection); let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "invalid token"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn non_utf8_response() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A).map(SdkBody::from), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), http::Response::builder() .status(200) @@ -970,10 +959,9 @@ pub(crate) mod test { .unwrap(), ), ]); - let client = make_client(&connection); let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "invalid UTF-8"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// Verify that the end-to-end real client has a 1-second connect timeout @@ -1043,12 +1031,12 @@ pub(crate) mod test { } async fn check(test_case: ImdsConfigTest) { - let (server, watcher) = capture_request(None); + let (http_client, watcher) = capture_request(None); let provider_config = ProviderConfig::no_configuration() - .with_sleep(TokioSleep::new()) + .with_sleep_impl(TokioSleep::new()) .with_env(Env::from(test_case.env)) .with_fs(Fs::from_map(test_case.fs)) - .with_http_connector(DynConnector::new(server)); + .with_http_client(http_client); let mut imds_client = Client::builder().configure(&provider_config); if let Some(endpoint_override) = test_case.endpoint_override { imds_client = imds_client.endpoint(endpoint_override.parse::().unwrap()); diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index 4d32aee0127..a97c3961c72 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -5,9 +5,9 @@ //! Error types for [`ImdsClient`](crate::imds::client::Client) -use aws_smithy_client::SdkError; use aws_smithy_http::body::SdkBody; use aws_smithy_http::endpoint::error::InvalidEndpointError; +use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use std::error::Error; use std::fmt; diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index 3bde8a4510f..52cf0bb6afb 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -284,13 +284,13 @@ impl ImdsCredentialsProvider { mod test { use super::*; use crate::imds::client::test::{ - imds_request, imds_response, make_client, token_request, token_response, + imds_request, imds_response, make_imds_client, token_request, token_response, }; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::TestConnection; + use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use std::time::{Duration, UNIX_EPOCH}; use tracing_test::traced_test; @@ -298,51 +298,51 @@ mod test { #[tokio::test] async fn profile_is_not_cached() { - let connection = TestConnection::new(vec![ - ( - token_request("http://169.254.169.254", 21600), - token_response(21600, TOKEN_A), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), - imds_response(r#"profile-name"#), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), - imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), - imds_response(r#"different-profile"#), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/different-profile", TOKEN_A), - imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST2\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), - ), - ]); + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( + token_request("http://169.254.169.254", 21600), + token_response(21600, TOKEN_A), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), + imds_response(r#"profile-name"#), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), + imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), + imds_response(r#"different-profile"#), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/different-profile", TOKEN_A), + imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST2\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), + ), + ]); let client = ImdsCredentialsProvider::builder() - .imds_client(make_client(&connection)) + .imds_client(make_imds_client(&http_client)) .build(); let creds1 = client.provide_credentials().await.expect("valid creds"); let creds2 = client.provide_credentials().await.expect("valid creds"); assert_eq!(creds1.access_key_id(), "ASIARTEST"); assert_eq!(creds2.access_key_id(), "ASIARTEST2"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] #[traced_test] async fn credentials_not_stale_should_be_used_as_they_are() { - let connection = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), imds_response(r#"profile-name"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), ), @@ -354,8 +354,8 @@ mod test { let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials); let provider_config = ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(connection.clone())) - .with_sleep(sleep) + .with_http_client(http_client.clone()) + .with_sleep_impl(sleep) .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) @@ -370,7 +370,7 @@ mod test { creds.expiry(), UNIX_EPOCH.checked_add(Duration::from_secs(1632197813)) ); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); // There should not be logs indicating credentials are extended for stability. assert!(!logs_contain(WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY)); @@ -378,16 +378,16 @@ mod test { #[tokio::test] #[traced_test] async fn expired_credentials_should_be_extended() { - let connection = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), imds_response(r#"profile-name"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), ), @@ -398,8 +398,8 @@ mod test { let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials); let provider_config = ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(connection.clone())) - .with_sleep(sleep) + .with_http_client(http_client.clone()) + .with_sleep_impl(sleep) .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) @@ -410,7 +410,7 @@ mod test { .build(); let creds = provider.provide_credentials().await.expect("valid creds"); assert!(creds.expiry().unwrap() > time_of_request_to_fetch_credentials); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); // We should inform customers that expired credentials are being used for stability. assert!(logs_contain(WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY)); @@ -486,36 +486,36 @@ mod test { #[tokio::test] async fn fallback_credentials_should_be_used_when_imds_returns_500_during_credentials_refresh() { - let connection = TestConnection::new(vec![ + let http_client = StaticReplayClient::new(vec![ // The next three request/response pairs will correspond to the first call to `provide_credentials`. // During the call, it populates last_retrieved_credentials. - ( + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), imds_response(r#"profile-name"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), ), // The following request/response pair corresponds to the second call to `provide_credentials`. // During the call, IMDS returns response code 500. - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), - http::Response::builder().status(500).body("").unwrap(), + http::Response::builder().status(500).body(SdkBody::empty()).unwrap(), ), ]); let provider = ImdsCredentialsProvider::builder() - .imds_client(make_client(&connection)) + .imds_client(make_imds_client(&http_client)) .build(); let creds1 = provider.provide_credentials().await.expect("valid creds"); assert_eq!(creds1.access_key_id(), "ASIARTEST"); // `creds1` should be returned as fallback credentials and assigned to `creds2` let creds2 = provider.provide_credentials().await.expect("valid creds"); assert_eq!(creds1, creds2); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } } diff --git a/aws/rust-runtime/aws-config/src/imds/region.rs b/aws/rust-runtime/aws-config/src/imds/region.rs index 072dc97a873..bc19642a642 100644 --- a/aws/rust-runtime/aws-config/src/imds/region.rs +++ b/aws/rust-runtime/aws-config/src/imds/region.rs @@ -110,21 +110,20 @@ mod test { use crate::imds::client::test::{imds_request, imds_response, token_request, token_response}; use crate::imds::region::ImdsRegionProvider; use crate::provider_config::ProviderConfig; - use aws_sdk_sts::config::Region; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_types::region::Region; use tracing_test::traced_test; #[tokio::test] async fn load_region() { - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, "token"), ), - ( + ReplayEvent::new( imds_request( "http://169.254.169.254/latest/meta-data/placement/region", "token", @@ -135,8 +134,8 @@ mod test { let provider = ImdsRegionProvider::builder() .configure( &ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(conn)) - .with_sleep(TokioSleep::new()), + .with_http_client(http_client) + .with_sleep_impl(TokioSleep::new()), ) .build(); assert_eq!( @@ -148,7 +147,7 @@ mod test { #[traced_test] #[tokio::test] async fn no_region_imds_disabled() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( token_request("http://169.254.169.254", 21600), http::Response::builder() .status(403) @@ -158,8 +157,8 @@ mod test { let provider = ImdsRegionProvider::builder() .configure( &ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(conn)) - .with_sleep(TokioSleep::new()), + .with_http_client(http_client) + .with_sleep_impl(TokioSleep::new()), ) .build(); assert_eq!(provider.region().await, None); diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index b39bcf571a8..ba1cb953d84 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -112,7 +112,6 @@ mod fs_util; mod http_credential_provider; mod json_credentials; -pub mod connector; pub mod credential_process; pub mod default_provider; pub mod ecs; @@ -150,28 +149,26 @@ pub async fn load_from_env() -> aws_types::SdkConfig { } mod loader { - use std::sync::Arc; - + use crate::default_provider::use_dual_stack::use_dual_stack_provider; + use crate::default_provider::use_fips::use_fips_provider; + use crate::default_provider::{app_name, credentials, region, retry_config, timeout_config}; + use crate::meta::region::ProvideRegion; + use crate::profile::profile_file::ProfileFiles; + use crate::provider_config::ProviderConfig; use aws_credential_types::cache::CredentialsCache; use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; - use aws_smithy_client::http_connector::HttpConnector; + use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::app_name::AppName; use aws_types::docs_for; use aws_types::os_shim_internal::{Env, Fs}; + use aws_types::sdk_config::SharedHttpClient; use aws_types::SdkConfig; - use crate::connector::default_connector; - use crate::default_provider::use_dual_stack::use_dual_stack_provider; - use crate::default_provider::use_fips::use_fips_provider; - use crate::default_provider::{app_name, credentials, region, retry_config, timeout_config}; - use crate::meta::region::ProvideRegion; - use crate::profile::profile_file::ProfileFiles; - use crate::provider_config::ProviderConfig; - #[derive(Default, Debug)] enum CredentialsProviderOption { /// No provider was set by the user. We can set up the default credentials provider chain. @@ -200,7 +197,7 @@ mod loader { sleep: Option, timeout_config: Option, provider_config: Option, - http_connector: Option, + http_client: Option, profile_name_override: Option, profile_files_override: Option, use_fips: Option, @@ -246,6 +243,7 @@ mod loader { } /// Override the timeout config used to build [`SdkConfig`](aws_types::SdkConfig). + /// /// **Note: This only sets timeouts for calls to AWS services.** Timeouts for the credentials /// provider chain are configured separately. /// @@ -270,63 +268,68 @@ mod loader { self } - /// Override the sleep implementation for this [`ConfigLoader`]. The sleep implementation - /// is used to create timeout futures. + /// Override the sleep implementation for this [`ConfigLoader`]. + /// + /// The sleep implementation is used to create timeout futures. + /// You generally won't need to change this unless you're using an async runtime other + /// than Tokio. pub fn sleep_impl(mut self, sleep: impl AsyncSleep + 'static) -> Self { // it's possible that we could wrapping an `Arc in an `Arc` and that's OK - self.sleep = Some(SharedAsyncSleep::new(sleep)); + self.sleep = Some(sleep.into_shared()); self } - /// Set the time source used for tasks like signing requests + /// Set the time source used for tasks like signing requests. + /// + /// You generally won't need to change this unless you're compiling for a target + /// that can't provide a default, such as WASM, or unless you're writing a test against + /// the client that needs a fixed time. pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { - self.time_source = Some(SharedTimeSource::new(time_source)); + self.time_source = Some(time_source.into_shared()); self } - /// Override the [`HttpConnector`] for this [`ConfigLoader`]. The connector will be used for - /// both AWS services and credential providers. When [`HttpConnector::ConnectorFn`] is used, - /// the connector will be lazily instantiated as needed based on the provided settings. + /// Deprecated. Don't use. + #[deprecated( + note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + )] + pub fn http_connector(self, http_client: impl HttpClient + 'static) -> Self { + self.http_client(http_client) + } + + /// Override the [`HttpClient`](aws_smithy_runtime_api::client::http::HttpClient) for this [`ConfigLoader`]. /// - /// **Note**: In order to take advantage of late-configured timeout settings, you MUST use - /// [`HttpConnector::ConnectorFn`] - /// when configuring this connector. + /// The HTTP client will be used for both AWS services and credentials providers. + /// + /// If you wish to use a separate HTTP client for credentials providers when creating clients, + /// then override the HTTP client set with this function on the client-specific `Config`s. /// - /// If you wish to use a separate connector when creating clients, use the client-specific config. /// ## Examples + /// /// ```no_run /// # use aws_smithy_async::rt::sleep::SharedAsyncSleep; - /// use aws_smithy_client::http_connector::HttpConnector; /// #[cfg(feature = "client-hyper")] /// # async fn create_config() { /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// - /// let connector_fn = |settings: &ConnectorSettings, sleep: Option| { - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// // NOTE: setting `https_only()` will not allow this connector to work with IMDS. - /// .https_only() - /// .enable_http1() - /// .enable_http2() - /// .build(); - /// let mut smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings(settings.clone()); - /// smithy_connector.set_sleep_impl(sleep); - /// Some(DynConnector::new(smithy_connector.build(https_connector))) - /// }; - /// let connector = HttpConnector::ConnectorFn(std::sync::Arc::new(connector_fn)); + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; + /// + /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// .with_webpki_roots() + /// // NOTE: setting `https_only()` will not allow this connector to work with IMDS. + /// .https_only() + /// .enable_http1() + /// .enable_http2() + /// .build(); + /// + /// let hyper_client = HyperClientBuilder::new().build(tls_connector); /// let sdk_config = aws_config::from_env() - /// .http_connector(connector) + /// .http_client(hyper_client) /// .load() /// .await; /// # } /// ``` - pub fn http_connector(mut self, http_connector: impl Into) -> Self { - self.http_connector = Some(http_connector.into()); + pub fn http_client(mut self, http_client: impl HttpClient + 'static) -> Self { + self.http_client = Some(http_client.into_shared()); self } @@ -559,10 +562,6 @@ mod loader { /// This means that if you provide a region provider that does not return a region, no region will /// be set in the resulting [`SdkConfig`](aws_types::SdkConfig) pub async fn load(self) -> SdkConfig { - let http_connector = self - .http_connector - .unwrap_or_else(|| HttpConnector::ConnectorFn(Arc::new(default_connector))); - let time_source = self.time_source.unwrap_or_default(); let sleep_impl = if self.sleep.is_some() { @@ -583,10 +582,13 @@ mod loader { let conf = self .provider_config .unwrap_or_else(|| { - ProviderConfig::init(time_source.clone(), sleep_impl.clone()) + let mut config = ProviderConfig::init(time_source.clone(), sleep_impl.clone()) .with_fs(self.fs.unwrap_or_default()) - .with_env(self.env.unwrap_or_default()) - .with_http_connector(http_connector.clone()) + .with_env(self.env.unwrap_or_default()); + if let Some(http_client) = self.http_client.clone() { + config = config.with_http_client(http_client); + } + config }) .with_profile_config(self.profile_files_override, self.profile_name_override); @@ -658,7 +660,7 @@ mod loader { Some(self.credentials_cache.unwrap_or_else(|| { let mut builder = CredentialsCache::lazy_builder().time_source(conf.time_source()); - builder.set_sleep(conf.sleep()); + builder.set_sleep_impl(conf.sleep_impl()); builder.into_credentials_cache() })) } else { @@ -669,9 +671,9 @@ mod loader { .region(region) .retry_config(retry_config) .timeout_config(timeout_config) - .time_source(time_source) - .http_connector(http_connector); + .time_source(time_source); + builder.set_http_client(self.http_client); builder.set_app_name(app_name); builder.set_credentials_cache(credentials_cache); builder.set_credentials_provider(credentials_provider); @@ -698,12 +700,13 @@ mod loader { #[cfg(test)] mod test { + use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; + use crate::test_case::{no_traffic_client, InstantSleep}; + use crate::{from_env, ConfigLoader}; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_async::time::{StaticTimeSource, TimeSource}; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::never::NeverConnector; - use aws_smithy_client::test_connection::infallible_connection_fn; + use aws_smithy_runtime::client::http::test_util::{infallible_client_fn, NeverClient}; use aws_types::app_name::AppName; use aws_types::os_shim_internal::{Env, Fs}; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -711,10 +714,6 @@ mod loader { use std::time::{SystemTime, UNIX_EPOCH}; use tracing_test::traced_test; - use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; - use crate::test_case::{no_traffic_connector, InstantSleep}; - use crate::{from_env, ConfigLoader}; - #[tokio::test] #[traced_test] async fn provider_config_used() { @@ -730,7 +729,7 @@ mod loader { .sleep_impl(TokioSleep::new()) .env(env) .fs(fs) - .http_connector(DynConnector::new(NeverConnector::new())) + .http_client(NeverClient::new()) .profile_name("custom") .profile_files( ProfileFiles::builder() @@ -772,7 +771,7 @@ mod loader { fn base_conf() -> ConfigLoader { from_env() .sleep_impl(InstantSleep) - .http_connector(no_traffic_connector()) + .http_client(no_traffic_client()) } #[tokio::test] @@ -809,14 +808,14 @@ mod loader { async fn connector_is_shared() { let num_requests = Arc::new(AtomicUsize::new(0)); let movable = num_requests.clone(); - let conn = infallible_connection_fn(move |_req| { + let http_client = infallible_client_fn(move |_req| { movable.fetch_add(1, Ordering::Relaxed); http::Response::new("ok!") }); let config = from_env() .fs(Fs::from_slice(&[])) .env(Env::from_slice(&[])) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .load() .await; config @@ -841,7 +840,7 @@ mod loader { let config = from_env() .sleep_impl(InstantSleep) .time_source(StaticTimeSource::new(UNIX_EPOCH)) - .http_connector(no_traffic_connector()) + .http_client(no_traffic_client()) .load() .await; // assert that the innards contain the customized fields diff --git a/aws/rust-runtime/aws-config/src/profile/credentials.rs b/aws/rust-runtime/aws-config/src/profile/credentials.rs index f3809026008..6469ececbcd 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials.rs @@ -442,7 +442,7 @@ impl Builder { ProfileFileCredentialsProvider { factory, - sdk_config: conf.client_config("profile file"), + sdk_config: conf.client_config(), provider_config: conf, } } diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs index 48a8d0c88a4..c6108a18f18 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs @@ -198,7 +198,7 @@ mod test { use crate::profile::credentials::exec::ProviderChain; use crate::profile::credentials::repr::{BaseProvider, ProfileChain}; use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; + use crate::test_case::no_traffic_client; use aws_credential_types::Credentials; use std::collections::HashMap; @@ -222,7 +222,7 @@ mod test { fn error_on_unknown_provider() { let factory = NamedProviderFactory::new(HashMap::new()); let chain = ProviderChain::from_repr( - &ProviderConfig::empty().with_http_connector(no_traffic_connector()), + &ProviderConfig::empty().with_http_client(no_traffic_client()), ProfileChain { base: BaseProvider::NamedSource("floozle"), chain: vec![], diff --git a/aws/rust-runtime/aws-config/src/profile/region.rs b/aws/rust-runtime/aws-config/src/profile/region.rs index 3cdcf8f7e4f..a293733377d 100644 --- a/aws/rust-runtime/aws-config/src/profile/region.rs +++ b/aws/rust-runtime/aws-config/src/profile/region.rs @@ -157,9 +157,9 @@ impl ProvideRegion for ProfileFileRegionProvider { mod test { use crate::profile::ProfileFileRegionProvider; use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; - use aws_sdk_sts::config::Region; + use crate::test_case::no_traffic_client; use aws_types::os_shim_internal::{Env, Fs}; + use aws_types::region::Region; use futures_util::FutureExt; use tracing_test::traced_test; @@ -169,7 +169,7 @@ mod test { ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()) + .with_http_client(no_traffic_client()) } #[traced_test] @@ -244,7 +244,7 @@ role_arn = arn:aws:iam::123456789012:role/test let provider_config = ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()); + .with_http_client(no_traffic_client()); assert_eq!( Some(Region::new("us-east-1")), diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index ec543a7b66b..dd13270bbce 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -5,21 +5,19 @@ //! Configuration Options for Credential Providers -use crate::connector::{default_connector, expect_connector}; use crate::profile; use crate::profile::profile_file::ProfileFiles; use crate::profile::{ProfileFileLoadError, ProfileSet}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; -use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::DynConnector; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::retry::RetryConfig; use aws_types::os_shim_internal::{Env, Fs}; -use aws_types::{ - http_connector::{ConnectorSettings, HttpConnector}, - region::Region, - SdkConfig, -}; +use aws_types::region::Region; +use aws_types::sdk_config::SharedHttpClient; +use aws_types::SdkConfig; use std::borrow::Cow; use std::fmt::{Debug, Formatter}; use std::sync::Arc; @@ -38,8 +36,8 @@ pub struct ProviderConfig { env: Env, fs: Fs, time_source: SharedTimeSource, - connector: HttpConnector, - sleep: Option, + http_client: Option, + sleep_impl: Option, region: Option, use_fips: Option, use_dual_stack: Option, @@ -56,28 +54,25 @@ impl Debug for ProviderConfig { f.debug_struct("ProviderConfig") .field("env", &self.env) .field("fs", &self.fs) - .field("sleep", &self.sleep) + .field("time_source", &self.time_source) + .field("http_client", &self.http_client) + .field("sleep_impl", &self.sleep_impl) .field("region", &self.region) .field("use_fips", &self.use_fips) .field("use_dual_stack", &self.use_dual_stack) + .field("profile_name_override", &self.profile_name_override) .finish() } } impl Default for ProviderConfig { fn default() -> Self { - let connector = HttpConnector::ConnectorFn(Arc::new( - |settings: &ConnectorSettings, sleep: Option| { - default_connector(settings, sleep) - }, - )); - Self { env: Env::default(), fs: Fs::default(), time_source: SharedTimeSource::default(), - connector, - sleep: default_async_sleep(), + http_client: None, + sleep_impl: default_async_sleep(), region: None, use_fips: None, use_dual_stack: None, @@ -106,8 +101,8 @@ impl ProviderConfig { env, fs, time_source: SharedTimeSource::new(StaticTimeSource::new(UNIX_EPOCH)), - connector: HttpConnector::Prebuilt(None), - sleep: None, + http_client: None, + sleep_impl: None, region: None, use_fips: None, use_dual_stack: None, @@ -148,8 +143,8 @@ impl ProviderConfig { env: Env::default(), fs: Fs::default(), time_source: SharedTimeSource::default(), - connector: HttpConnector::Prebuilt(None), - sleep: None, + http_client: None, + sleep_impl: None, region: None, use_fips: None, use_dual_stack: None, @@ -160,15 +155,18 @@ impl ProviderConfig { } /// Initializer for ConfigBag to avoid possibly setting incorrect defaults. - pub(crate) fn init(time_source: SharedTimeSource, sleep: Option) -> Self { + pub(crate) fn init( + time_source: SharedTimeSource, + sleep_impl: Option, + ) -> Self { Self { parsed_profile: Default::default(), profile_files: ProfileFiles::default(), env: Env::default(), fs: Fs::default(), time_source, - connector: HttpConnector::Prebuilt(None), - sleep, + http_client: None, + sleep_impl, region: None, use_fips: None, use_dual_stack: None, @@ -192,18 +190,15 @@ impl ProviderConfig { Self::without_region().load_default_region().await } - pub(crate) fn client_config(&self, feature_name: &str) -> SdkConfig { + pub(crate) fn client_config(&self) -> SdkConfig { let mut builder = SdkConfig::builder() - .http_connector(expect_connector( - &format!("The {feature_name} features of aws-config"), - self.connector(&Default::default()), - )) .retry_config(RetryConfig::standard()) .region(self.region()) .time_source(self.time_source()) .use_fips(self.use_fips().unwrap_or_default()) .use_dual_stack(self.use_dual_stack().unwrap_or_default()); - builder.set_sleep_impl(self.sleep()); + builder.set_http_client(self.http_client.clone()); + builder.set_sleep_impl(self.sleep_impl.clone()); builder.build() } @@ -225,19 +220,13 @@ impl ProviderConfig { } #[allow(dead_code)] - pub(crate) fn default_connector(&self) -> Option { - self.connector - .connector(&Default::default(), self.sleep.clone()) + pub(crate) fn http_client(&self) -> Option { + self.http_client.clone() } #[allow(dead_code)] - pub(crate) fn connector(&self, settings: &ConnectorSettings) -> Option { - self.connector.connector(settings, self.sleep.clone()) - } - - #[allow(dead_code)] - pub(crate) fn sleep(&self) -> Option { - self.sleep.clone() + pub(crate) fn sleep_impl(&self) -> Option { + self.sleep_impl.clone() } #[allow(dead_code)] @@ -350,65 +339,33 @@ impl ProviderConfig { } /// Override the time source for this configuration - pub fn with_time_source( - self, - time_source: impl aws_smithy_async::time::TimeSource + 'static, - ) -> Self { + pub fn with_time_source(self, time_source: impl TimeSource + 'static) -> Self { ProviderConfig { - time_source: SharedTimeSource::new(time_source), + time_source: time_source.into_shared(), ..self } } - /// Override the HTTPS connector for this configuration - /// - /// **Note**: In order to take advantage of late-configured timeout settings, use [`HttpConnector::ConnectorFn`] - /// when configuring this connector. - pub fn with_http_connector(self, connector: impl Into) -> Self { - ProviderConfig { - connector: connector.into(), - ..self - } + /// Deprecated. Don't use. + #[deprecated( + note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + )] + pub fn with_tcp_connector(self, http_client: impl HttpClient + 'static) -> Self { + self.with_http_client(http_client) } - /// Override the TCP connector for this configuration - /// - /// This connector MUST provide an HTTPS encrypted connection. - /// - /// # Stability - /// This method may change to support HTTP configuration. - #[cfg(feature = "client-hyper")] - pub fn with_tcp_connector(self, connector: C) -> Self - where - C: Clone + Send + Sync + 'static, - C: tower::Service, - C::Response: hyper::client::connect::Connection - + tokio::io::AsyncRead - + tokio::io::AsyncWrite - + Send - + Unpin - + 'static, - C::Future: Unpin + Send + 'static, - C::Error: Into>, - { - let connector_fn = move |settings: &ConnectorSettings, sleep: Option| { - let mut builder = aws_smithy_client::hyper_ext::Adapter::builder() - .connector_settings(settings.clone()); - if let Some(sleep) = sleep { - builder = builder.sleep_impl(sleep); - }; - Some(DynConnector::new(builder.build(connector.clone()))) - }; + /// Override the HTTP client for this configuration + pub fn with_http_client(self, http_client: impl HttpClient + 'static) -> Self { ProviderConfig { - connector: HttpConnector::ConnectorFn(Arc::new(connector_fn)), + http_client: Some(http_client.into_shared()), ..self } } /// Override the sleep implementation for this configuration - pub fn with_sleep(self, sleep: impl AsyncSleep + 'static) -> Self { + pub fn with_sleep_impl(self, sleep_impl: impl AsyncSleep + 'static) -> Self { ProviderConfig { - sleep: Some(SharedAsyncSleep::new(sleep)), + sleep_impl: Some(sleep_impl.into_shared()), ..self } } diff --git a/aws/rust-runtime/aws-config/src/sso.rs b/aws/rust-runtime/aws-config/src/sso.rs index 7a601f7be40..fae2248b35f 100644 --- a/aws/rust-runtime/aws-config/src/sso.rs +++ b/aws/rust-runtime/aws-config/src/sso.rs @@ -13,7 +13,6 @@ use crate::fs_util::{home_dir, Os}; use crate::json_credentials::{json_parse_loop, InvalidJsonCredentials}; use crate::provider_config::ProviderConfig; - use aws_credential_types::cache::CredentialsCache; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; use aws_credential_types::Credentials; @@ -25,14 +24,12 @@ use aws_smithy_types::DateTime; use aws_types::os_shim_internal::{Env, Fs}; use aws_types::region::Region; use aws_types::SdkConfig; - +use ring::digest; use std::convert::TryInto; use std::error::Error; use std::fmt::{Display, Formatter}; use std::io; use std::path::PathBuf; - -use ring::digest; use zeroize::Zeroizing; /// SSO Credentials Provider @@ -66,7 +63,7 @@ impl SsoCredentialsProvider { fs, env, sso_provider_config, - sdk_config: provider_config.client_config("SSO"), + sdk_config: provider_config.client_config(), } } diff --git a/aws/rust-runtime/aws-config/src/sts.rs b/aws/rust-runtime/aws-config/src/sts.rs index f774c65906c..7c3ea29062e 100644 --- a/aws/rust-runtime/aws-config/src/sts.rs +++ b/aws/rust-runtime/aws-config/src/sts.rs @@ -5,8 +5,7 @@ //! Credential provider augmentation through the AWS Security Token Service (STS). -pub(crate) mod util; - pub use assume_role::{AssumeRoleProvider, AssumeRoleProviderBuilder}; mod assume_role; +pub(crate) mod util; diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 06e79bc3548..b6b61ba714b 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -349,9 +349,10 @@ mod test { use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::StaticTimeSource; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::{capture_request, TestConnection}; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, + }; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_types::os_shim_internal::Env; use aws_types::region::Region; @@ -361,13 +362,13 @@ mod test { #[tokio::test] async fn configures_session_length() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let sdk_config = SdkConfig::builder() .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), )) - .http_connector(DynConnector::new(server)) + .http_client(http_client) .region(Region::from_static("this-will-be-overridden")) .build(); let provider = AssumeRoleProvider::builder("myrole") @@ -387,13 +388,13 @@ mod test { #[tokio::test] async fn loads_region_from_sdk_config() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let sdk_config = SdkConfig::builder() .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), )) - .http_connector(DynConnector::new(server)) + .http_client(http_client) .credentials_provider(SharedCredentialsProvider::new(provide_credentials_fn( || async { panic!("don't call me — will be overridden"); @@ -417,7 +418,7 @@ mod test { #[tokio::test] async fn build_method_from_sdk_config() { let _guard = capture_test_logs(); - let (server, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .status(404) .body(SdkBody::from("")) @@ -432,7 +433,7 @@ mod test { .use_dual_stack(true) .use_fips(true) .time_source(StaticTimeSource::from_secs(1234567890)) - .http_connector(server) + .http_client(http_client) .load() .await; let provider = AssumeRoleProvider::builder("role") @@ -459,12 +460,12 @@ mod test { #[tokio::test] async fn provider_does_not_cache_credentials_by_default() { - let conn = TestConnection::new(vec![ - (http::Request::new(SdkBody::from("request body")), + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(http::Request::new(SdkBody::from("request body")), http::Response::builder().status(200).body(SdkBody::from( "\n \n \n AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998\n arn:aws:sts::130633740322:assumed-role/assume-provider-test/assume-role-from-profile-1632246085998\n \n \n ASIARCORRECT\n secretkeycorrect\n tokencorrect\n 2009-02-13T23:31:30Z\n \n \n \n d9d47248-fd55-4686-ad7c-0fb7cd1cddd7\n \n\n" )).unwrap()), - (http::Request::new(SdkBody::from("request body")), + ReplayEvent::new(http::Request::new(SdkBody::from("request body")), http::Response::builder().status(200).body(SdkBody::from( "\n \n \n AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998\n arn:aws:sts::130633740322:assumed-role/assume-provider-test/assume-role-from-profile-1632246085998\n \n \n ASIARCORRECT\n TESTSECRET\n tokencorrect\n 2009-02-13T23:33:30Z\n \n \n \n c2e971c2-702d-4124-9b1f-1670febbea18\n \n\n" )).unwrap()), @@ -477,7 +478,7 @@ mod test { let sdk_config = SdkConfig::builder() .sleep_impl(SharedAsyncSleep::new(sleep)) .time_source(testing_time_source.clone()) - .http_connector(DynConnector::new(conn)) + .http_client(http_client) .build(); let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![ Credentials::new( diff --git a/aws/rust-runtime/aws-config/src/test_case.rs b/aws/rust-runtime/aws-config/src/test_case.rs index 54d39d112de..d567bae89eb 100644 --- a/aws/rust-runtime/aws-config/src/test_case.rs +++ b/aws/rust-runtime/aws-config/src/test_case.rs @@ -3,20 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::default_provider::use_dual_stack::use_dual_stack_provider; +use crate::default_provider::use_fips::use_fips_provider; use crate::provider_config::ProviderConfig; - use aws_credential_types::provider::{self, ProvideCredentials}; use aws_smithy_async::rt::sleep::{AsyncSleep, Sleep, TokioSleep}; -use aws_smithy_client::dvr::{NetworkTraffic, RecordingConnection, ReplayingConnection}; -use aws_smithy_client::erase::DynConnector; +use aws_smithy_runtime::client::http::test_util::dvr::{ + NetworkTraffic, RecordingClient, ReplayingClient, +}; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; - +use aws_types::sdk_config::SharedHttpClient; use serde::Deserialize; - -use crate::connector::default_connector; -use crate::default_provider::use_dual_stack::use_dual_stack_provider; -use crate::default_provider::use_fips::use_fips_provider; -use aws_smithy_types::error::display::DisplayErrorContext; use std::collections::HashMap; use std::env; use std::error::Error; @@ -70,18 +69,18 @@ impl From for Credentials { /// A credentials test environment is a directory containing: /// - an `fs` directory. This is loaded into the test as if it was mounted at `/` /// - an `env.json` file containing environment variables -/// - an `http-traffic.json` file containing an http traffic log from [`dvr`](aws_smithy_client::dvr) +/// - an `http-traffic.json` file containing an http traffic log from [`dvr`](aws_smithy_runtime::client::http::test_utils::dvr) /// - a `test-case.json` file defining the expected output of the test pub(crate) struct TestEnvironment { metadata: Metadata, base_dir: PathBuf, - connector: ReplayingConnection, + http_client: ReplayingClient, provider_config: ProviderConfig, } /// Connector which expects no traffic -pub(crate) fn no_traffic_connector() -> DynConnector { - DynConnector::new(ReplayingConnection::new(vec![])) +pub(crate) fn no_traffic_client() -> SharedHttpClient { + ReplayingClient::new(Vec::new()).into_shared() } #[derive(Debug)] @@ -230,12 +229,12 @@ impl TestEnvironment { &std::fs::read_to_string(dir.join("test-case.json")) .map_err(|e| format!("failed to load test case: {}", e))?, )?; - let connector = ReplayingConnection::new(network_traffic.events().clone()); + let http_client = ReplayingClient::new(network_traffic.events().clone()); let provider_config = ProviderConfig::empty() .with_fs(fs.clone()) .with_env(env.clone()) - .with_http_connector(DynConnector::new(connector.clone())) - .with_sleep(TokioSleep::new()) + .with_http_client(http_client.clone()) + .with_sleep_impl(TokioSleep::new()) .load_default_region() .await; @@ -248,7 +247,7 @@ impl TestEnvironment { Ok(TestEnvironment { base_dir: dir.into(), metadata, - connector, + http_client, provider_config, }) } @@ -266,6 +265,7 @@ impl TestEnvironment { } #[allow(unused)] + #[cfg(all(feature = "client-hyper", feature = "rustls"))] /// Record a test case from live (remote) HTTPS traffic /// /// The `default_connector()` from the crate will be used @@ -277,18 +277,21 @@ impl TestEnvironment { P: ProvideCredentials, { // swap out the connector generated from `http-traffic.json` for a real connector: - let live_connector = - default_connector(&Default::default(), self.provider_config.sleep()).unwrap(); - let live_connector = RecordingConnection::new(live_connector); + let live_connector = aws_smithy_runtime::client::http::hyper_014::default_connector( + &Default::default(), + self.provider_config.sleep_impl(), + ) + .expect("feature gate on this function makes this always return Some"); + let live_client = RecordingClient::new(live_connector); let config = self .provider_config .clone() - .with_http_connector(DynConnector::new(live_connector.clone())); + .with_http_client(live_client.clone()); let provider = make_provider(config).await; let result = provider.provide_credentials().await; std::fs::write( self.base_dir.join("http-traffic-recorded.json"), - serde_json::to_string(&live_connector.network_traffic()).unwrap(), + serde_json::to_string(&live_client.network_traffic()).unwrap(), ) .unwrap(); self.check_results(result); @@ -304,16 +307,16 @@ impl TestEnvironment { F: Future, P: ProvideCredentials, { - let recording_connector = RecordingConnection::new(self.connector.clone()); + let recording_client = RecordingClient::new(self.http_client.clone()); let config = self .provider_config .clone() - .with_http_connector(DynConnector::new(recording_connector.clone())); + .with_http_client(recording_client.clone()); let provider = make_provider(config).await; let result = provider.provide_credentials().await; std::fs::write( self.base_dir.join("http-traffic-recorded.json"), - serde_json::to_string(&recording_connector.network_traffic()).unwrap(), + serde_json::to_string(&recording_client.network_traffic()).unwrap(), ) .unwrap(); self.check_results(result); @@ -350,7 +353,7 @@ impl TestEnvironment { self.check_results(result); // todo: validate bodies match self - .connector + .http_client .clone() .validate( &["CONTENT-TYPE", "x-aws-ec2-metadata-token"], diff --git a/aws/rust-runtime/aws-config/src/web_identity_token.rs b/aws/rust-runtime/aws-config/src/web_identity_token.rs index 50d71712281..7ae4e2f8b0e 100644 --- a/aws/rust-runtime/aws-config/src/web_identity_token.rs +++ b/aws/rust-runtime/aws-config/src/web_identity_token.rs @@ -204,7 +204,7 @@ impl Builder { WebIdentityTokenCredentialsProvider { source, fs: conf.fs(), - sts_client: StsClient::new(&conf.client_config("STS")), + sts_client: StsClient::new(&conf.client_config()), time_source: conf.time_source(), } } @@ -241,24 +241,24 @@ async fn load_credentials( #[cfg(test)] mod test { use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; + use crate::test_case::no_traffic_client; use crate::web_identity_token::{ Builder, ENV_VAR_ROLE_ARN, ENV_VAR_SESSION_NAME, ENV_VAR_TOKEN_FILE, }; use aws_credential_types::provider::error::CredentialsError; - use aws_sdk_sts::config::Region; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; + use aws_types::region::Region; use std::collections::HashMap; #[tokio::test] async fn unloaded_provider() { // empty environment let conf = ProviderConfig::empty() - .with_sleep(TokioSleep::new()) + .with_sleep_impl(TokioSleep::new()) .with_env(Env::from_slice(&[])) - .with_http_connector(no_traffic_connector()) + .with_http_client(no_traffic_client()) .with_region(Some(Region::from_static("us-east-1"))); let provider = Builder::default().configure(&conf).build(); @@ -279,10 +279,10 @@ mod test { let provider = Builder::default() .configure( &ProviderConfig::empty() - .with_sleep(TokioSleep::new()) + .with_sleep_impl(TokioSleep::new()) .with_region(region) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .build(); let err = provider @@ -311,8 +311,8 @@ mod test { let provider = Builder::default() .configure( &ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_http_connector(no_traffic_connector()) + .with_sleep_impl(TokioSleep::new()) + .with_http_client(no_traffic_client()) .with_region(Some(Region::new("us-east-1"))) .with_env(env) .with_fs(fs), diff --git a/aws/rust-runtime/aws-credential-types/external-types.toml b/aws/rust-runtime/aws-credential-types/external-types.toml index e65c743b102..88a5088190a 100644 --- a/aws/rust-runtime/aws-credential-types/external-types.toml +++ b/aws/rust-runtime/aws-credential-types/external-types.toml @@ -1,4 +1,5 @@ allowed_external_types = [ + "aws_smithy_async::rt::sleep::AsyncSleep", "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", diff --git a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs b/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs index 6169c2b930b..d919278db8d 100644 --- a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs +++ b/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs @@ -136,13 +136,14 @@ mod builder { use crate::cache::{CredentialsCache, Inner}; use crate::provider::SharedCredentialsProvider; - use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; - use aws_smithy_async::time::SharedTimeSource; + use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use super::{ LazyCredentialsCache, DEFAULT_BUFFER_TIME, DEFAULT_BUFFER_TIME_JITTER_FRACTION, DEFAULT_CREDENTIAL_EXPIRATION, DEFAULT_LOAD_TIMEOUT, }; + use aws_smithy_runtime_api::shared::IntoShared; /// Builder for constructing a `LazyCredentialsCache`. /// @@ -158,7 +159,7 @@ mod builder { /// `build` to create a `LazyCredentialsCache`. #[derive(Clone, Debug, Default)] pub struct Builder { - sleep: Option, + sleep_impl: Option, time_source: Option, load_timeout: Option, buffer_time: Option, @@ -177,8 +178,8 @@ mod builder { /// This enables use of the `LazyCredentialsCache` with other async runtimes. /// If using Tokio as the async runtime, this should be set to an instance of /// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep). - pub fn sleep(mut self, sleep: SharedAsyncSleep) -> Self { - self.set_sleep(Some(sleep)); + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.set_sleep_impl(Some(sleep_impl.into_shared())); self } @@ -187,14 +188,14 @@ mod builder { /// This enables use of the `LazyCredentialsCache` with other async runtimes. /// If using Tokio as the async runtime, this should be set to an instance of /// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep). - pub fn set_sleep(&mut self, sleep: Option) -> &mut Self { - self.sleep = sleep; + pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { + self.sleep_impl = sleep_impl; self } #[doc(hidden)] // because they only exist for tests - pub fn time_source(mut self, time_source: SharedTimeSource) -> Self { - self.set_time_source(Some(time_source)); + pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { + self.set_time_source(Some(time_source.into_shared())); self } @@ -326,7 +327,7 @@ mod builder { ); LazyCredentialsCache::new( self.time_source.unwrap_or_default(), - self.sleep.unwrap_or_else(|| { + self.sleep_impl.unwrap_or_else(|| { default_async_sleep().expect("no default sleep implementation available") }), provider, diff --git a/aws/rust-runtime/aws-endpoint/Cargo.toml b/aws/rust-runtime/aws-endpoint/Cargo.toml index 67cb4d4e6e1..5a6846d2d6b 100644 --- a/aws/rust-runtime/aws-endpoint/Cargo.toml +++ b/aws/rust-runtime/aws-endpoint/Cargo.toml @@ -12,7 +12,6 @@ aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types"} aws-types = { path = "../aws-types" } http = "0.2.3" -regex = { version = "1.5.5", default-features = false, features = ["std"] } tracing = "0.1" [package.metadata.docs.rs] diff --git a/aws/rust-runtime/aws-http/Cargo.toml b/aws/rust-runtime/aws-http/Cargo.toml index 7b010570162..fc25360575a 100644 --- a/aws/rust-runtime/aws-http/Cargo.toml +++ b/aws/rust-runtime/aws-http/Cargo.toml @@ -15,7 +15,6 @@ aws-types = { path = "../aws-types" } bytes = "1.1" http = "0.2.3" http-body = "0.4.5" -lazy_static = "1.4.0" tracing = "0.1" percent-encoding = "2.1.0" pin-project-lite = "0.2.9" diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 6c70fb8e5f6..28f4aeb2129 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -13,15 +13,11 @@ repository = "https://github.com/awslabs/smithy-rs" [dependencies] aws-credential-types = { path = "../aws-credential-types" } -aws-endpoint = { path = "../aws-endpoint" } aws-http = { path = "../aws-http" } aws-runtime = { path = "../aws-runtime" } aws-sigv4 = { path = "../aws-sigv4" } -aws-sig-auth = { path = "../aws-sig-auth" } aws-smithy-checksums = { path = "../../../rust-runtime/aws-smithy-checksums" } -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client" } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-http-tower = { path = "../../../rust-runtime/aws-smithy-http-tower" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } diff --git a/aws/rust-runtime/aws-inlineable/external-types.toml b/aws/rust-runtime/aws-inlineable/external-types.toml index a261a6c437c..0d2b9f397ca 100644 --- a/aws/rust-runtime/aws-inlineable/external-types.toml +++ b/aws/rust-runtime/aws-inlineable/external-types.toml @@ -1,22 +1,11 @@ allowed_external_types = [ "aws_credential_types::provider::ProvideCredentials", - "aws_endpoint::*", - "aws_http::*", - "aws_sig_auth::*", - "aws_smithy_client::*", "aws_smithy_http::*", - "aws_smithy_http_tower::*", - "aws_smithy_types::*", - "aws_types::*", + + "http::error::Error", "http::header::map::HeaderMap", "http::header::value::HeaderValue", + "http::method::Method", "http::request::Request", - "http::error::Error", "http::uri::Uri", - "http::method::Method", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", - "tower_layer::identity::Identity", - "tower_layer::stack::Stack", ] diff --git a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs index 498844f1b3e..298899e71bf 100644 --- a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs +++ b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs @@ -5,9 +5,9 @@ //! Maintain a cache of discovered endpoints +use aws_smithy_async::future::BoxFuture; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::boxclone::BoxFuture; use aws_smithy_http::endpoint::{ResolveEndpoint, ResolveEndpointError}; use aws_smithy_types::endpoint::Endpoint; use std::fmt::{Debug, Formatter}; diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs b/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs deleted file mode 100644 index bf95910e006..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware - -use aws_sig_auth::signer::SignableBody; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::byte_stream::{self, ByteStream}; -use aws_smithy_http::operation::Request; - -use bytes::Buf; -use bytes_utils::SegmentedBuf; -use http::header::HeaderName; -use ring::digest::{Context, Digest, SHA256}; - -const TREE_HASH_HEADER: &str = "x-amz-sha256-tree-hash"; -const X_AMZ_CONTENT_SHA256: &str = "x-amz-content-sha256"; - -/// Adds a glacier tree hash checksum to the HTTP Request -/// -/// This handles two cases: -/// 1. A body which is retryable: the body will be streamed through a digest calculator, limiting memory usage. -/// 2. A body which is not retryable: the body will be converted into `Bytes`, then streamed through a digest calculator. -/// -/// The actual checksum algorithm will first compute a SHA256 checksum for each 1MB chunk. Then, a tree -/// will be assembled, recursively pairing neighboring chunks and computing their combined checksum. The 1 leftover -/// chunk (if it exists) is paired at the end. -/// -/// See for more information. -pub async fn add_checksum_treehash(request: &mut Request) -> Result<(), byte_stream::error::Error> { - let cloneable = request.http().body().try_clone(); - let http_request = request.http_mut(); - let body_to_process = if let Some(cloned_body) = cloneable { - // we can stream the body - cloned_body - } else { - let body = std::mem::replace(http_request.body_mut(), SdkBody::taken()); - let loaded_body = ByteStream::new(body).collect().await?.into_bytes(); - *http_request.body_mut() = SdkBody::from(loaded_body.clone()); - SdkBody::from(loaded_body) - }; - let (full_body, hashes) = compute_hashes(body_to_process, MEGABYTE).await?; - let tree_hash = hex::encode(compute_hash_tree(hashes)); - let complete_hash = hex::encode(full_body); - if !http_request.headers().contains_key(TREE_HASH_HEADER) { - http_request.headers_mut().insert( - HeaderName::from_static(TREE_HASH_HEADER), - tree_hash.parse().expect("hash must be valid header"), - ); - } - if !http_request.headers().contains_key(X_AMZ_CONTENT_SHA256) { - http_request.headers_mut().insert( - HeaderName::from_static(X_AMZ_CONTENT_SHA256), - complete_hash.parse().expect("hash must be valid header"), - ); - } - // if we end up hitting the signer later, no need to recompute the checksum - request - .properties_mut() - .insert(SignableBody::Precomputed(complete_hash)); - // for convenience & protocol tests, write it in directly here as well - Ok(()) -} - -const MEGABYTE: usize = 1024 * 1024; -async fn compute_hashes( - body: SdkBody, - chunk_size: usize, -) -> Result<(Digest, Vec), byte_stream::error::Error> { - let mut hashes = vec![]; - let mut remaining_in_chunk = chunk_size; - let mut body = ByteStream::new(body); - let mut local = Context::new(&SHA256); - let mut full_body = Context::new(&SHA256); - let mut segmented = SegmentedBuf::new(); - while let Some(data) = body.try_next().await? { - segmented.push(data); - while segmented.has_remaining() { - let next = segmented.chunk(); - let len = next.len().min(remaining_in_chunk); - local.update(&next[..len]); - full_body.update(&next[..len]); - segmented.advance(len); - remaining_in_chunk -= len; - if remaining_in_chunk == 0 { - hashes.push(local.finish()); - local = Context::new(&SHA256); - remaining_in_chunk = chunk_size; - } - } - } - if remaining_in_chunk != chunk_size || hashes.is_empty() { - hashes.push(local.finish()); - } - Ok((full_body.finish(), hashes)) -} - -/// Compute the glacier tree hash for a vector of hashes. -/// -/// Adjacent hashes are combined into a single hash. This process occurs recursively until only 1 hash remains. -/// -/// See for more information. -fn compute_hash_tree(mut hashes: Vec) -> Digest { - assert!( - !hashes.is_empty(), - "even an empty file will produce a digest. this function assumes that hashes is non-empty" - ); - while hashes.len() > 1 { - let next = hashes.chunks(2).map(|chunk| match *chunk { - [left, right] => { - let mut ctx = Context::new(&SHA256); - ctx.update(left.as_ref()); - ctx.update(right.as_ref()); - ctx.finish() - } - [last] => last, - _ => unreachable!(), - }); - hashes = next.collect(); - } - hashes[0] -} - -#[cfg(test)] -mod test { - use crate::glacier_checksums::{ - add_checksum_treehash, compute_hash_tree, compute_hashes, MEGABYTE, TREE_HASH_HEADER, - }; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; - use aws_smithy_http::operation::Request; - - #[tokio::test] - async fn compute_digests() { - { - let body = SdkBody::from("1234"); - let hashes = compute_hashes(body, 1).await.expect("succeeds").1; - assert_eq!(hashes.len(), 4); - } - { - let body = SdkBody::from("1234"); - let hashes = compute_hashes(body, 2).await.expect("succeeds").1; - assert_eq!(hashes.len(), 2); - } - { - let body = SdkBody::from("12345"); - let hashes = compute_hashes(body, 3).await.expect("succeeds").1; - assert_eq!(hashes.len(), 2); - } - { - let body = SdkBody::from("11221122"); - let hashes = compute_hashes(body, 2).await.expect("succeeds").1; - assert_eq!(hashes[0].as_ref(), hashes[2].as_ref()); - } - } - - #[tokio::test] - async fn empty_body_computes_digest() { - let body = SdkBody::from(""); - let (_, hashes) = compute_hashes(body, 2).await.expect("succeeds"); - assert_eq!(hashes.len(), 1); - } - - #[tokio::test] - async fn compute_tree_digest() { - macro_rules! hash { - ($($inp:expr),*) => { - { - let mut ctx = ring::digest::Context::new(&ring::digest::SHA256); - $( - ctx.update($inp.as_ref()); - )* - ctx.finish() - } - } - } - let body = SdkBody::from("1234567891011"); - let (complete, hashes) = compute_hashes(body, 3).await.expect("succeeds"); - assert_eq!(hashes.len(), 5); - assert_eq!(complete.as_ref(), hash!("1234567891011").as_ref()); - let final_digest = compute_hash_tree(hashes); - let expected_digest = hash!( - hash!( - hash!(hash!("123"), hash!("456")), - hash!(hash!("789"), hash!("101")) - ), - hash!("1") - ); - assert_eq!(expected_digest.as_ref(), final_digest.as_ref()); - } - - #[tokio::test] - async fn integration_test() { - // the test data consists of an 11 byte sequence, repeated. Since the sequence length is - // relatively prime with 1 megabyte, we can ensure that chunks will all have different hashes. - let base_seq = b"01245678912"; - let total_size = MEGABYTE * 101 + 500; - let mut test_data = vec![]; - while test_data.len() < total_size { - test_data.extend_from_slice(base_seq) - } - let target = tempfile::NamedTempFile::new().unwrap(); - tokio::fs::write(target.path(), test_data).await.unwrap(); - let body = ByteStream::from_path(target.path()) - .await - .expect("should be valid") - .into_inner(); - - let mut http_req = Request::new( - http::Request::builder() - .uri("http://example.com/hello") - .body(body) - .unwrap(), - ); - - add_checksum_treehash(&mut http_req) - .await - .expect("should succeed"); - // hash value verified with AWS CLI - assert_eq!( - http_req.http().headers().get(TREE_HASH_HEADER).unwrap(), - "3d417484359fc9f5a3bafd576dc47b8b2de2bf2d4fdac5aa2aff768f2210d386" - ); - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs b/aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs deleted file mode 100644 index f71e8708e8f..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Functions for modifying requests and responses for the purposes of checksum validation - -use aws_smithy_http::operation::error::BuildError; - -/// Errors related to constructing checksum-validated HTTP requests -#[derive(Debug)] -#[allow(dead_code)] -pub(crate) enum Error { - /// Only request bodies with a known size can be checksum validated - UnsizedRequestBody, - ChecksumHeadersAreUnsupportedForStreamingBody, -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::UnsizedRequestBody => write!( - f, - "Only request bodies with a known size can be checksum validated." - ), - Self::ChecksumHeadersAreUnsupportedForStreamingBody => write!( - f, - "Checksum header insertion is only supported for non-streaming HTTP bodies. \ - To checksum validate a streaming body, the checksums must be sent as trailers." - ), - } - } -} - -impl std::error::Error for Error {} - -/// Given a `&mut http::request::Request` and a `aws_smithy_checksums::ChecksumAlgorithm`, -/// calculate a checksum and modify the request to include the checksum as a header -/// (for in-memory request bodies) or a trailer (for streaming request bodies.) Streaming bodies -/// must be sized or this will return an error. -#[allow(dead_code)] -pub(crate) fn add_checksum_calculation_to_request( - request: &mut http::request::Request, - property_bag: &mut aws_smithy_http::property_bag::PropertyBag, - checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm, -) -> Result<(), BuildError> { - match request.body().bytes() { - // Body is in-memory: read it and insert the checksum as a header. - Some(data) => { - let mut checksum = checksum_algorithm.into_impl(); - checksum.update(data); - - request - .headers_mut() - .insert(checksum.header_name(), checksum.header_value()); - } - // Body is streaming: wrap the body so it will emit a checksum as a trailer. - None => { - wrap_streaming_request_body_in_checksum_calculating_body( - request, - property_bag, - checksum_algorithm, - )?; - } - } - - Ok(()) -} - -#[allow(dead_code)] -fn wrap_streaming_request_body_in_checksum_calculating_body( - request: &mut http::request::Request, - property_bag: &mut aws_smithy_http::property_bag::PropertyBag, - checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm, -) -> Result<(), BuildError> { - use aws_http::content_encoding::{AwsChunkedBody, AwsChunkedBodyOptions}; - use aws_smithy_checksums::{body::calculate, http::HttpChecksum}; - use http_body::Body; - - let original_body_size = request - .body() - .size_hint() - .exact() - .ok_or_else(|| BuildError::other(Error::UnsizedRequestBody))?; - - // Streaming request bodies with trailers require special signing - property_bag.insert(aws_sig_auth::signer::SignableBody::StreamingUnsignedPayloadTrailer); - - let mut body = { - let body = std::mem::replace(request.body_mut(), aws_smithy_http::body::SdkBody::taken()); - - body.map(move |body| { - let checksum = checksum_algorithm.into_impl(); - let trailer_len = HttpChecksum::size(checksum.as_ref()); - let body = calculate::ChecksumBody::new(body, checksum); - let aws_chunked_body_options = - AwsChunkedBodyOptions::new(original_body_size, vec![trailer_len]); - - let body = AwsChunkedBody::new(body, aws_chunked_body_options); - - aws_smithy_http::body::SdkBody::from_dyn(aws_smithy_http::body::BoxBody::new(body)) - }) - }; - - let encoded_content_length = body - .size_hint() - .exact() - .ok_or_else(|| BuildError::other(Error::UnsizedRequestBody))?; - - let headers = request.headers_mut(); - - headers.insert( - http::header::HeaderName::from_static("x-amz-trailer"), - // Convert into a `HeaderName` and then into a `HeaderValue` - http::header::HeaderName::from(checksum_algorithm).into(), - ); - - headers.insert( - http::header::CONTENT_LENGTH, - http::HeaderValue::from(encoded_content_length), - ); - headers.insert( - http::header::HeaderName::from_static("x-amz-decoded-content-length"), - http::HeaderValue::from(original_body_size), - ); - headers.insert( - http::header::CONTENT_ENCODING, - http::HeaderValue::from_str(aws_http::content_encoding::header_value::AWS_CHUNKED) - .map_err(BuildError::other) - .expect("\"aws-chunked\" will always be a valid HeaderValue"), - ); - - std::mem::swap(request.body_mut(), &mut body); - - Ok(()) -} - -/// Given an `SdkBody`, a `aws_smithy_checksums::ChecksumAlgorithm`, and a pre-calculated checksum, -/// return an `SdkBody` where the body will processed with the checksum algorithm and checked -/// against the pre-calculated checksum. -#[allow(dead_code)] -pub(crate) fn wrap_body_with_checksum_validator( - body: aws_smithy_http::body::SdkBody, - checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm, - precalculated_checksum: bytes::Bytes, -) -> aws_smithy_http::body::SdkBody { - use aws_smithy_checksums::body::validate; - use aws_smithy_http::body::{BoxBody, SdkBody}; - - body.map(move |body| { - SdkBody::from_dyn(BoxBody::new(validate::ChecksumBody::new( - body, - checksum_algorithm.into_impl(), - precalculated_checksum.clone(), - ))) - }) -} - -/// Given a `HeaderMap`, extract any checksum included in the headers as `Some(Bytes)`. -/// If no checksum header is set, return `None`. If multiple checksum headers are set, the one that -/// is fastest to compute will be chosen. -#[allow(dead_code)] -pub(crate) fn check_headers_for_precalculated_checksum( - headers: &http::HeaderMap, - response_algorithms: &[&str], -) -> Option<(aws_smithy_checksums::ChecksumAlgorithm, bytes::Bytes)> { - let checksum_algorithms_to_check = - aws_smithy_checksums::http::CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER - .into_iter() - // Process list of algorithms, from fastest to slowest, that may have been used to checksum - // the response body, ignoring any that aren't marked as supported algorithms by the model. - .flat_map(|algo| { - // For loop is necessary b/c the compiler doesn't infer the correct lifetimes for iter().find() - for res_algo in response_algorithms { - if algo.eq_ignore_ascii_case(res_algo) { - return Some(algo); - } - } - - None - }); - - for checksum_algorithm in checksum_algorithms_to_check { - let checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm = checksum_algorithm.parse().expect( - "CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER only contains valid checksum algorithm names", - ); - if let Some(precalculated_checksum) = - headers.get(http::HeaderName::from(checksum_algorithm)) - { - let base64_encoded_precalculated_checksum = precalculated_checksum - .to_str() - .expect("base64 uses ASCII characters"); - - // S3 needs special handling for checksums of objects uploaded with `MultiPartUpload`. - if is_part_level_checksum(base64_encoded_precalculated_checksum) { - tracing::warn!( - more_info = "See https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums for more information.", - "This checksum is a part-level checksum which can't be validated by the Rust SDK. Disable checksum validation for this request to fix this warning.", - ); - - return None; - } - - let precalculated_checksum = match aws_smithy_types::base64::decode( - base64_encoded_precalculated_checksum, - ) { - Ok(decoded_checksum) => decoded_checksum.into(), - Err(_) => { - tracing::error!("Checksum received from server could not be base64 decoded. No checksum validation will be performed."); - return None; - } - }; - - return Some((checksum_algorithm, precalculated_checksum)); - } - } - - None -} - -fn is_part_level_checksum(checksum: &str) -> bool { - let mut found_number = false; - let mut found_dash = false; - - for ch in checksum.chars().rev() { - // this could be bad - if ch.is_ascii_digit() { - found_number = true; - continue; - } - - // Yup, it's a part-level checksum - if ch == '-' { - if found_dash { - // Found a second dash?? This isn't a part-level checksum. - return false; - } - - found_dash = true; - continue; - } - - break; - } - - found_number && found_dash -} - -#[cfg(test)] -mod tests { - use super::{is_part_level_checksum, wrap_body_with_checksum_validator}; - use aws_smithy_checksums::ChecksumAlgorithm; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; - use aws_smithy_types::error::display::DisplayErrorContext; - use bytes::{Bytes, BytesMut}; - use http_body::Body; - use std::sync::Once; - use tempfile::NamedTempFile; - - static INIT_LOGGER: Once = Once::new(); - fn init_logger() { - INIT_LOGGER.call_once(|| { - tracing_subscriber::fmt::init(); - }); - } - - #[tokio::test] - async fn test_checksum_body_is_retryable() { - let input_text = "Hello world"; - let precalculated_checksum = Bytes::from_static(&[0x8b, 0xd6, 0x9e, 0x52]); - let body = SdkBody::retryable(move || SdkBody::from(input_text)); - - // ensure original SdkBody is retryable - assert!(body.try_clone().is_some()); - - let body = body.map(move |sdk_body| { - let checksum_algorithm: ChecksumAlgorithm = "crc32".parse().unwrap(); - wrap_body_with_checksum_validator( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }); - - // ensure wrapped SdkBody is retryable - let mut body = body.try_clone().expect("body is retryable"); - - let mut validated_body = BytesMut::new(); - - loop { - match body.data().await { - Some(Ok(data)) => validated_body.extend_from_slice(&data), - Some(Err(err)) => panic!("{}", err), - None => { - break; - } - } - } - - let body = std::str::from_utf8(&validated_body).unwrap(); - - // ensure that the wrapped body passes checksum validation - assert_eq!(input_text, body); - } - - #[tokio::test] - async fn test_checksum_body_from_file_is_retryable() { - use std::io::Write; - let mut file = NamedTempFile::new().unwrap(); - let checksum_algorithm: ChecksumAlgorithm = "crc32c".parse().unwrap(); - let mut crc32c_checksum = checksum_algorithm.into_impl(); - - for i in 0..10000 { - let line = format!("This is a large file created for testing purposes {}", i); - file.as_file_mut().write_all(line.as_bytes()).unwrap(); - crc32c_checksum.update(line.as_bytes()); - } - - let body = ByteStream::read_from() - .path(&file) - .buffer_size(1024) - .build() - .await - .unwrap(); - - let precalculated_checksum = crc32c_checksum.finalize(); - let expected_checksum = precalculated_checksum.clone(); - - let body = body.map(move |sdk_body| { - wrap_body_with_checksum_validator( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }); - - // ensure wrapped SdkBody is retryable - let mut body = body.into_inner().try_clone().expect("body is retryable"); - - let mut validated_body = BytesMut::new(); - - // If this loop completes, then it means the body's checksum was valid, but let's calculate - // a checksum again just in case. - let mut redundant_crc32c_checksum = checksum_algorithm.into_impl(); - loop { - match body.data().await { - Some(Ok(data)) => { - redundant_crc32c_checksum.update(&data); - validated_body.extend_from_slice(&data); - } - Some(Err(err)) => panic!("{}", err), - None => { - break; - } - } - } - - let actual_checksum = redundant_crc32c_checksum.finalize(); - assert_eq!(expected_checksum, actual_checksum); - - // Ensure the file's checksum isn't the same as an empty checksum. This way, we'll know that - // data was actually processed. - let unexpected_checksum = checksum_algorithm.into_impl().finalize(); - assert_ne!(unexpected_checksum, actual_checksum); - } - - #[tokio::test] - async fn test_build_checksum_validated_body_works() { - init_logger(); - - let checksum_algorithm = "crc32".parse().unwrap(); - let input_text = "Hello world"; - let precalculated_checksum = Bytes::from_static(&[0x8b, 0xd6, 0x9e, 0x52]); - let body = ByteStream::new(SdkBody::from(input_text)); - - let body = body.map(move |sdk_body| { - wrap_body_with_checksum_validator( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }); - - let mut validated_body = Vec::new(); - if let Err(e) = tokio::io::copy(&mut body.into_async_read(), &mut validated_body).await { - tracing::error!("{}", DisplayErrorContext(&e)); - panic!("checksum validation has failed"); - }; - let body = std::str::from_utf8(&validated_body).unwrap(); - - assert_eq!(input_text, body); - } - - #[test] - fn test_is_multipart_object_checksum() { - // These ARE NOT part-level checksums - assert!(!is_part_level_checksum("abcd")); - assert!(!is_part_level_checksum("abcd=")); - assert!(!is_part_level_checksum("abcd==")); - assert!(!is_part_level_checksum("1234")); - assert!(!is_part_level_checksum("1234=")); - assert!(!is_part_level_checksum("1234==")); - // These ARE part-level checksums - assert!(is_part_level_checksum("abcd-1")); - assert!(is_part_level_checksum("abcd=-12")); - assert!(is_part_level_checksum("abcd12-134")); - assert!(is_part_level_checksum("abcd==-10000")); - // These are gibberish and shouldn't be regarded as a part-level checksum - assert!(!is_part_level_checksum("")); - assert!(!is_part_level_checksum("Spaces? In my header values?")); - assert!(!is_part_level_checksum("abcd==-134!#{!#")); - assert!(!is_part_level_checksum("abcd==-")); - assert!(!is_part_level_checksum("abcd==--11")); - assert!(!is_part_level_checksum("abcd==-AA")); - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/lib.rs b/aws/rust-runtime/aws-inlineable/src/lib.rs index 591d95741db..8ff2f5f4789 100644 --- a/aws/rust-runtime/aws-inlineable/src/lib.rs +++ b/aws/rust-runtime/aws-inlineable/src/lib.rs @@ -34,9 +34,6 @@ pub mod presigning_interceptors; /// Special logic for extracting request IDs from S3's responses. pub mod s3_request_id; -/// Glacier-specific checksumming behavior -pub mod glacier_checksums; - /// Glacier-specific behavior pub mod glacier_interceptors; @@ -49,10 +46,6 @@ pub mod route53_resource_id_preprocessor; pub mod http_request_checksum; pub mod http_response_checksum; -// TODO(enableNewSmithyRuntimeCleanup): Delete this module -/// Convert a streaming `SdkBody` into an aws-chunked streaming body with checksum trailers -pub mod http_body_checksum_middleware; - #[allow(dead_code)] pub mod endpoint_discovery; diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index f19ad434d14..d2e64a70388 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_client::SdkError; use aws_smithy_http::http::HttpHeaders; use aws_smithy_http::operation; +use aws_smithy_http::result::SdkError; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; @@ -101,8 +101,8 @@ fn extract_extended_request_id(headers: &HeaderMap) -> Option<&str> #[cfg(test)] mod test { use super::*; - use aws_smithy_client::SdkError; use aws_smithy_http::body::SdkBody; + use aws_smithy_http::result::SdkError; use http::Response; #[test] diff --git a/aws/rust-runtime/aws-runtime/additional-ci b/aws/rust-runtime/aws-runtime/additional-ci new file mode 100755 index 00000000000..b44c6c05be7 --- /dev/null +++ b/aws/rust-runtime/aws-runtime/additional-ci @@ -0,0 +1,12 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +# This script contains additional CI checks to run for this specific package + +set -e + +echo "### Testing every combination of features (excluding --all-features)" +cargo hack test --feature-powerset --exclude-all-features diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 18fcac7c4a6..7a8b47feb06 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -219,7 +219,7 @@ mod tests { }; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; + use aws_smithy_types::config_bag::ConfigBag; use http::HeaderValue; fn expect_header<'a>( @@ -258,6 +258,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn custom_id_generator() { + use aws_smithy_types::config_bag::Layer; let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); diff --git a/aws/rust-runtime/aws-types/Cargo.toml b/aws/rust-runtime/aws-types/Cargo.toml index eb0b527f427..2570ccff73e 100644 --- a/aws/rust-runtime/aws-types/Cargo.toml +++ b/aws/rust-runtime/aws-types/Cargo.toml @@ -9,13 +9,14 @@ repository = "https://github.com/awslabs/smithy-rs" [features] # This feature is to be used only for doc comments -examples = ["dep:hyper-rustls", "aws-smithy-client/client-hyper", "aws-smithy-client/rustls"] +examples = ["dep:hyper-rustls", "aws-smithy-runtime/client", "aws-smithy-runtime/connector-hyper-0-14-x", "aws-smithy-runtime/tls-rustls"] [dependencies] aws-credential-types = { path = "../aws-credential-types" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client" } +aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", optional = true } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } tracing = "0.1" http = "0.2.6" diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index e43510d69e3..ca858840655 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -1,18 +1,15 @@ allowed_external_types = [ "aws_credential_types::cache::CredentialsCache", "aws_credential_types::provider::SharedCredentialsProvider", + "aws_smithy_async::rt::sleep::AsyncSleep", "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_client::http_connector", - "aws_smithy_client::http_connector::HttpConnector", - "aws_smithy_http::endpoint::Endpoint", - "aws_smithy_http::endpoint::EndpointPrefix", - "aws_smithy_http::endpoint::error::InvalidEndpointError", + "aws_smithy_runtime_api::client::http::HttpClient", + "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", "aws_smithy_types::retry::RetryConfig", "aws_smithy_types::timeout::TimeoutConfig", - "http::uri::Uri", ] diff --git a/aws/rust-runtime/aws-types/src/lib.rs b/aws/rust-runtime/aws-types/src/lib.rs index bf54671e150..e6a0a69dcdb 100644 --- a/aws/rust-runtime/aws-types/src/lib.rs +++ b/aws/rust-runtime/aws-types/src/lib.rs @@ -21,8 +21,6 @@ pub mod endpoint_config; pub mod os_shim_internal; pub mod region; pub mod sdk_config; - -pub use aws_smithy_client::http_connector; pub use sdk_config::SdkConfig; use aws_smithy_types::config_bag::{Storable, StoreReplace}; diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 81ce7d35c27..e97a58cc3d1 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -9,18 +9,21 @@ //! //! This module contains an shared configuration representation that is agnostic from a specific service. -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_types::retry::RetryConfig; -use aws_smithy_types::timeout::TimeoutConfig; - use crate::app_name::AppName; use crate::docs_for; use crate::region::Region; +pub use aws_credential_types::cache::CredentialsCache; +pub use aws_credential_types::provider::SharedCredentialsProvider; +use aws_smithy_async::rt::sleep::AsyncSleep; +pub use aws_smithy_async::rt::sleep::SharedAsyncSleep; +pub use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::client::http::HttpClient; +pub use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::shared::IntoShared; +pub use aws_smithy_types::retry::RetryConfig; +pub use aws_smithy_types::timeout::TimeoutConfig; + #[doc(hidden)] /// Unified docstrings to keep crates in sync. Not intended for public use pub mod unified_docs { @@ -56,7 +59,7 @@ pub struct SdkConfig { sleep_impl: Option, time_source: Option, timeout_config: Option, - http_connector: Option, + http_client: Option, use_fips: Option, use_dual_stack: Option, } @@ -77,7 +80,7 @@ pub struct Builder { sleep_impl: Option, time_source: Option, timeout_config: Option, - http_connector: Option, + http_client: Option, use_fips: Option, use_dual_stack: Option, } @@ -230,8 +233,9 @@ impl Builder { self } - /// Set the sleep implementation for the builder. The sleep implementation is used to create - /// timeout futures. + /// Set the sleep implementation for the builder. + /// + /// The sleep implementation is used to create timeout futures. /// /// _Note:_ If you're using the Tokio runtime, a `TokioSleep` implementation is available in /// the `aws-smithy-async` crate. @@ -254,8 +258,8 @@ impl Builder { /// let sleep_impl = SharedAsyncSleep::new(ForeverSleep); /// let config = SdkConfig::builder().sleep_impl(sleep_impl).build(); /// ``` - pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self { - self.set_sleep_impl(Some(sleep_impl)); + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.set_sleep_impl(Some(sleep_impl.into_shared())); self } @@ -399,81 +403,76 @@ impl Builder { self } - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run /// # #[cfg(feature = "examples")] /// # fn example() { + /// use aws_types::sdk_config::{SdkConfig, TimeoutConfig}; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use aws_types::SdkConfig; /// - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// // Create a connector that will be used to establish TLS connections + /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() + /// // Create a HTTP client that uses the TLS connector. This client is + /// // responsible for creating and caching a HttpConnector when given HttpConnectorSettings. + /// // This hyper client will create HttpConnectors backed by hyper and the tls_connector. + /// let http_client = HyperClientBuilder::new().build(tls_connector); + /// let sdk_config = SdkConfig::builder() + /// .http_client(http_client) + /// // Connect/read timeouts are passed to the HTTP client when servicing a request + /// .timeout_config( + /// TimeoutConfig::builder() /// .connect_timeout(Duration::from_secs(5)) /// .build() /// ) - /// .build(https_connector); - /// let sdk_config = SdkConfig::builder() - /// .http_connector(smithy_connector) /// .build(); /// # } /// ``` - pub fn http_connector(mut self, http_connector: impl Into) -> Self { - self.set_http_connector(Some(http_connector)); + pub fn http_client(mut self, http_client: impl HttpClient + 'static) -> Self { + self.set_http_client(Some(http_client.into_shared())); self } - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run /// # #[cfg(feature = "examples")] /// # fn example() { + /// use aws_types::sdk_config::{Builder, SdkConfig, TimeoutConfig}; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// use std::time::Duration; - /// use aws_smithy_client::hyper_ext; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use aws_types::sdk_config::{Builder, SdkConfig}; /// - /// fn override_http_connector(builder: &mut Builder) { - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// fn override_http_client(builder: &mut Builder) { + /// // Create a connector that will be used to establish TLS connections + /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// builder.set_http_connector(Some(smithy_connector)); + /// // Create a HTTP client that uses the TLS connector. This client is + /// // responsible for creating and caching a HttpConnector when given HttpConnectorSettings. + /// // This hyper client will create HttpConnectors backed by hyper and the tls_connector. + /// let http_client = HyperClientBuilder::new().build(tls_connector); + /// + /// builder.set_http_client(Some(http_client)); /// } /// /// let mut builder = SdkConfig::builder(); - /// override_http_connector(&mut builder); + /// override_http_client(&mut builder); /// let config = builder.build(); /// # } /// ``` - pub fn set_http_connector( - &mut self, - http_connector: Option>, - ) -> &mut Self { - self.http_connector = http_connector.map(|inner| inner.into()); + pub fn set_http_client(&mut self, http_client: Option) -> &mut Self { + self.http_client = http_client; self } @@ -524,7 +523,7 @@ impl Builder { retry_config: self.retry_config, sleep_impl: self.sleep_impl, timeout_config: self.timeout_config, - http_connector: self.http_connector, + http_client: self.http_client, use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, time_source: self.time_source, @@ -579,9 +578,9 @@ impl SdkConfig { self.app_name.as_ref() } - /// Configured HTTP Connector - pub fn http_connector(&self) -> Option<&HttpConnector> { - self.http_connector.as_ref() + /// Configured HTTP client + pub fn http_client(&self) -> Option { + self.http_client.clone() } /// Use FIPS endpoints @@ -620,7 +619,7 @@ impl SdkConfig { sleep_impl: self.sleep_impl, time_source: self.time_source, timeout_config: self.timeout_config, - http_connector: self.http_connector, + http_client: self.http_client, use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt index cd8fe1bef1d..878c4a851f1 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt @@ -26,7 +26,6 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), - "SharedTimeSource" to CargoDependency.smithyAsync(runtimeConfig).toType().resolve("time::SharedTimeSource"), "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::StaticRuntimePlugin"), "StaticTimeSource" to CargoDependency.smithyAsync(runtimeConfig).toType().resolve("time::StaticTimeSource"), "TestParamsSetterInterceptor" to testParamsSetterInterceptor(), @@ -94,7 +93,7 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : #{StaticRuntimePlugin}::new() .with_runtime_components( #{RuntimeComponentsBuilder}::new("request_time_for_tests") - .with_time_source(Some(#{SharedTimeSource}::new(#{StaticTimeSource}::new(request_time)))) + .with_time_source(Some(#{StaticTimeSource}::new(request_time))) ) ) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 7b69c5c72af..fb4b5fa58e1 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -66,8 +66,7 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { rustCrate.withModule(ClientRustModule.client) { AwsFluentClientExtensions(codegenContext, types).render(this) } - val awsSmithyClient = "aws-smithy-client" - rustCrate.mergeFeature(Feature("rustls", default = true, listOf("$awsSmithyClient/rustls"))) + rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-runtime/tls-rustls"))) } override fun libRsCustomizations( @@ -99,7 +98,7 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { let mut ${params.configBuilderName} = ${params.configBuilderName}; ${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1"))); - let config = ${params.configBuilderName}.http_connector(${params.connectorName}).build(); + let config = ${params.configBuilderName}.http_client(${params.httpClientName}).build(); let ${params.clientName} = #{Client}::from_conf(config); """, "Client" to ClientRustModule.root.toType().resolve("Client"), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt index 53ca182cdfa..51f88d2401a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt @@ -106,7 +106,7 @@ class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustom || match sleep { Some(sleep) => { #{CredentialsCache}::lazy_builder() - .sleep(sleep) + .sleep_impl(sleep) .into_credentials_cache() } None => #{CredentialsCache}::lazy(), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index 95553d80064..e6d4a3f442d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -84,17 +84,14 @@ class IntegrationTestDependencies( if (hasTests) { val smithyAsync = CargoDependency.smithyAsync(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) - val smithyClient = CargoDependency.smithyClient(codegenContext.runtimeConfig) - .copy(features = setOf("test-util", "wiremock"), scope = DependencyScope.Dev) val smithyTypes = CargoDependency.smithyTypes(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) addDependency(awsRuntime(runtimeConfig).toDevDependency().withFeature("test-util")) addDependency(FuturesUtil) addDependency(SerdeJson) addDependency(smithyAsync) - addDependency(smithyClient) addDependency(smithyProtocolTestHelpers(codegenContext.runtimeConfig)) - addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) + addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util", "wire-mock"), scope = DependencyScope.Dev)) addDependency(smithyRuntimeApi(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) addDependency(smithyTypes) addDependency(Tokio) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index 7ad1e412467..7167910c08e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -76,7 +76,7 @@ class GenericSmithySdkConfigSettings : ClientCodegenDecorator { ${section.serviceConfigBuilder}.set_timeout_config(${section.sdkConfig}.timeout_config().cloned()); ${section.serviceConfigBuilder}.set_sleep_impl(${section.sdkConfig}.sleep_impl()); - ${section.serviceConfigBuilder}.set_http_connector(${section.sdkConfig}.http_connector().cloned()); + ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client()); ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source()); """, ) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index b0ec8aac317..43210766e08 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -83,12 +83,12 @@ fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Bool * "AWS::S3::UseArnRegion": false * } */ * /* clientParams: {} */ - * let (conn, rcvr) = aws_smithy_client::test_connection::capture_request(None); + * let (http_client, rcvr) = aws_smithy_client::test_connection::capture_request(None); * let conf = { * #[allow(unused_mut)] * let mut builder = aws_sdk_s3::Config::builder() * .with_test_defaults() - * .http_connector(conn); + * .http_client(http_client); * let builder = builder.region(aws_types::region::Region::new("us-west-2")); * let builder = builder.use_arn_region(false); * builder.build() @@ -122,11 +122,6 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private val model = ctx.model private val instantiator = ClientInstantiator(ctx) - /** the Rust SDK doesn't support SigV4a — search endpoint.properties.authSchemes[].name */ - private fun EndpointTestCase.isSigV4a() = - expect.endpoint.orNull()?.properties?.get("authSchemes")?.asArrayNode()?.orNull() - ?.map { it.expectObjectNode().expectStringMember("name").value }?.contains("sigv4a") == true - fun generateInput(testOperationInput: EndpointTestOperationInput) = writable { val operationName = testOperationInput.operationName.toSnakeCase() tokioTest(safeName("operation_input_test_$operationName")) { @@ -134,7 +129,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: """ /* builtIns: ${escape(Node.prettyPrintJson(testOperationInput.builtInParams))} */ /* clientParams: ${escape(Node.prettyPrintJson(testOperationInput.clientParams))} */ - let (conn, rcvr) = #{capture_request}(None); + let (http_client, rcvr) = #{capture_request}(None); let conf = #{conf}; let client = $moduleName::Client::from_conf(conf); let _result = dbg!(#{invoke_operation}); @@ -192,7 +187,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private fun config(operationInput: EndpointTestOperationInput) = writable { rustBlock("") { Attribute.AllowUnusedMut.render(this) - rust("let mut builder = $moduleName::Config::builder().with_test_defaults().http_connector(conn);") + rust("let mut builder = $moduleName::Config::builder().with_test_defaults().http_client(http_client);") operationInput.builtInParams.members.forEach { (builtIn, value) -> val setter = endpointCustomizations.firstNotNullOfOrNull { it.setBuiltInOnServiceConfig( diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt index 9c1a29ecaea..68bfab92fef 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt @@ -87,27 +87,30 @@ class EndpointBuiltInsDecoratorTest { ##[#{tokio}::test] async fn endpoint_url_built_in_works() { - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("https://RIGHT/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("https://RIGHT/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap() + )], + ); let config = Config::builder() - .http_connector(connector.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .endpoint_url("https://RIGHT") .build(); let client = Client::from_conf(config); dbg!(client.some_operation().send().await).expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, "tokio" to CargoDependency.Tokio.toDevDependency().withFeature("rt").withFeature("macros").toType(), - "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) - .toDevDependency().withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), + "StaticReplayClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::StaticReplayClient"), + "ReplayEvent" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::ReplayEvent"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), ) } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt index 07080355410..19ad56d1169 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt @@ -84,9 +84,9 @@ class EndpointsCredentialsTest { tokioTest("default_auth") { rustTemplate( """ - let (conn, rcvr) = #{capture_request}(None); + let (http_client, rcvr) = #{capture_request}(None); let conf = $moduleName::Config::builder() - .http_connector(conn) + .http_client(http_client) .region(#{Region}::new("us-west-2")) .credentials_provider(#{Credentials}::for_tests()) .build(); @@ -107,9 +107,9 @@ class EndpointsCredentialsTest { tokioTest("custom_auth") { rustTemplate( """ - let (conn, rcvr) = #{capture_request}(None); + let (http_client, rcvr) = #{capture_request}(None); let conf = $moduleName::Config::builder() - .http_connector(conn) + .http_client(http_client) .region(#{Region}::new("us-west-2")) .credentials_provider(#{Credentials}::for_tests()) .build(); diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt index 3a792e2a0a1..be0861a045b 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt @@ -32,9 +32,9 @@ class InvocationIdDecoratorTest { } } - let (conn, rx) = #{capture_request}(None); + let (http_client, rx) = #{capture_request}(None); let config = $moduleName::Config::builder() - .http_connector(conn) + .http_client(http_client) .invocation_id_generator(TestIdGen) .build(); assert!(config.invocation_id_generator().is_some()); diff --git a/aws/sdk/integration-tests/dynamodb/Cargo.toml b/aws/sdk/integration-tests/dynamodb/Cargo.toml index 61663dbbed4..2a9d1725af9 100644 --- a/aws/sdk/integration-tests/dynamodb/Cargo.toml +++ b/aws/sdk/integration-tests/dynamodb/Cargo.toml @@ -17,7 +17,6 @@ aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-dynamodb = { path = "../../build/aws-sdk/sdk/dynamodb" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"]} diff --git a/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs b/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs index 25d65bb94ca..2f0180b4494 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs @@ -4,6 +4,7 @@ */ use aws_sdk_dynamodb::config::{self, Credentials, Region}; +use aws_smithy_runtime::client::http::test_util::capture_request; use aws_types::SdkConfig; use http::Uri; @@ -12,11 +13,11 @@ async fn expect_uri( uri: &'static str, customize: fn(config::Builder) -> config::Builder, ) { - let (conn, request) = aws_smithy_client::test_connection::capture_request(None); + let (http_client, request) = capture_request(None); let conf = customize( aws_sdk_dynamodb::config::Builder::from(&conf) .credentials_provider(Credentials::for_tests()) - .http_connector(conn), + .http_client(http_client), ) .build(); let svc = aws_sdk_dynamodb::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/dynamodb/tests/movies.rs b/aws/sdk/integration-tests/dynamodb/tests/movies.rs index 7b045c6f5b5..981562c05a5 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/movies.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/movies.rs @@ -4,8 +4,9 @@ */ use aws_sdk_dynamodb as dynamodb; -use aws_smithy_client::test_connection::TestConnection; +use aws_smithy_async::assert_elapsed; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use dynamodb::config::{Credentials, Region}; use dynamodb::operation::query::QueryOutput; use dynamodb::types::{ @@ -18,7 +19,6 @@ use http::Uri; use serde_json::Value; use std::collections::HashMap; use std::time::Duration; -use tokio::time::Instant; async fn create_table(client: &Client, table_name: &str) { client @@ -128,17 +128,6 @@ async fn wait_for_ready_table(client: &Client, table_name: &str) { } } -/// Validate that time has passed with a 5ms tolerance -/// -/// This is to account for some non-determinism in the Tokio timer -fn assert_time_passed(initial: Instant, passed: Duration) { - let now = tokio::time::Instant::now(); - let delta = now - initial; - if (delta.as_millis() as i128 - passed.as_millis() as i128).abs() > 5 { - assert_eq!(delta, passed) - } -} - /// A partial reimplementation of https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/GettingStarted.Ruby.html /// in Rust /// @@ -151,10 +140,10 @@ async fn movies_it() { let table_name = "Movies-5"; // The waiter will retry 5 times tokio::time::pause(); - let conn = movies_it_test_connection(); // RecordingConnection::https(); + let http_client = movies_it_test_connection(); // RecordingConnection::https(); let conf = dynamodb::Config::builder() .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(Credentials::for_tests()) .build(); let client = Client::from_conf(conf); @@ -164,7 +153,11 @@ async fn movies_it() { let waiter_start = tokio::time::Instant::now(); wait_for_ready_table(&client, table_name).await; - assert_time_passed(waiter_start, Duration::from_secs(4)); + assert_elapsed!( + waiter_start, + Duration::from_secs(4), + Duration::from_millis(10) + ); // data.json contains 2 movies from 2013 let data = match serde_json::from_str(include_str!("data.json")).expect("should be valid JSON") { @@ -194,192 +187,193 @@ async fn movies_it() { ] ); - conn.assert_requests_match(&[AUTHORIZATION, HeaderName::from_static("x-amz-date")]); + http_client.assert_requests_match(&[AUTHORIZATION, HeaderName::from_static("x-amz-date")]); } /// Test connection for the movies IT /// headers are signed with actual creds, at some point we could replace them with verifiable test /// credentials, but there are plenty of other tests that target signing -fn movies_it_test_connection() -> TestConnection<&'static str> { - TestConnection::new(vec![( - http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.CreateTable") - .header("content-length", "313") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4a832eba37651836b524b587986be607607b077ad133c57b4bf7300d2e02f476") - .header("x-amz-date", "20210308T155118Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"AttributeDefinitions":[{"AttributeName":"year","AttributeType":"N"},{"AttributeName":"title","AttributeType":"S"}],"TableName":"Movies-5","KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10}}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "572") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "RCII0AALE00UALC7LJ9AD600B7VV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "3715137447") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"TableDescription":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=01b0129a2a4fb3af14559fde8163d59de9c43907152a12479002b3a7c75fa0df") - .header("x-amz-date", "20210308T155119Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "O1C6QKCG8GT7D2K922T4QRL9N3VV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=7f3a743bb460f26296640ae775d282f0153eda750855ec00ace1815becfd2de5") - .header("x-amz-date", "20210308T155120Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")).body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:20 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "EN5N26BO1FAOEMUUSD7B7SUPPVVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=46a148c560139bc0da171bd915ea8c0b96a7012629f5db7b6bf70fcd1a66fd24") - .header("x-amz-date", "20210308T155121Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:21 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "PHCMGEVI6JLN9JNMKSSA3M76H3VV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=15bb7c9b2350747d62349091b3ea59d9e1800d1dca04029943329259bba85cb4") - .header("x-amz-date", "20210308T155122Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:22 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "1Q22O983HD3511TN6Q5RRTP0MFVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=6d0a78087bc112c68a91b4b2d457efd8c09149b85b8f998f8c4b3f9916c8a743") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "559") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "ONJBNV2A9GBNUT34KH73JLL23BVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "24113616") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"ACTIVE"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.PutItem") - .header("content-length", "619") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=85fc7d2064a0e6d9c38d64751d39d311ad415ae4079ef21ef254b23ecf093519") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"rating":{"N":"6.2"},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"release_date":{"S":"2013-01-18T00:00:00Z"},"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"running_time_secs":{"N":"5215"},"rank":{"N":"11"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]}}},"title":{"S":"Turn It Down, Or Else!"},"year":{"N":"2013"}}}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "2") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "E6TGS5HKHHV08HSQA31IO1IDMFVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "2745614147") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.PutItem") - .header("content-length", "636") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=e4b1658c9f5129b3656381f6592a30e0061b1566263fbf27d982817ea79483f6") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"rating":{"N":"8.3"},"rank":{"N":"2"},"release_date":{"S":"2013-09-02T00:00:00Z"},"directors":{"L":[{"S":"Ron Howard"}]},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"running_time_secs":{"N":"7380"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]}}},"title":{"S":"Rush"},"year":{"N":"2013"}}}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "2") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "B63D54LP2FOGQK9JE5KLJT49HJVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "2745614147") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.Query") - .header("content-length", "156") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=c9a0fdd0c7c3a792faddabca1fc154c8fbb54ddee7b06a8082e1c587615198b5") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2222"}}}"##)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "39") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "AUAS9KJ0TK9BSR986TRPC2RGTRVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "3413411624") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Count":0,"Items":[],"ScannedCount":0}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.Query") - .header("content-length", "156") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=504d6b4de7093b20255b55057085937ec515f62f3c61da68c03bff3f0ce8a160") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2013"}}}"##)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "1231") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "624725176") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#).unwrap()) +fn movies_it_test_connection() -> StaticReplayClient { + StaticReplayClient::new(vec![ + ReplayEvent::new( + http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.CreateTable") + .header("content-length", "313") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4a832eba37651836b524b587986be607607b077ad133c57b4bf7300d2e02f476") + .header("x-amz-date", "20210308T155118Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"AttributeDefinitions":[{"AttributeName":"year","AttributeType":"N"},{"AttributeName":"title","AttributeType":"S"}],"TableName":"Movies-5","KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10}}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "572") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "RCII0AALE00UALC7LJ9AD600B7VV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "3715137447") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"TableDescription":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=01b0129a2a4fb3af14559fde8163d59de9c43907152a12479002b3a7c75fa0df") + .header("x-amz-date", "20210308T155119Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "O1C6QKCG8GT7D2K922T4QRL9N3VV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=7f3a743bb460f26296640ae775d282f0153eda750855ec00ace1815becfd2de5") + .header("x-amz-date", "20210308T155120Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")).body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:20 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "EN5N26BO1FAOEMUUSD7B7SUPPVVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=46a148c560139bc0da171bd915ea8c0b96a7012629f5db7b6bf70fcd1a66fd24") + .header("x-amz-date", "20210308T155121Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:21 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "PHCMGEVI6JLN9JNMKSSA3M76H3VV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=15bb7c9b2350747d62349091b3ea59d9e1800d1dca04029943329259bba85cb4") + .header("x-amz-date", "20210308T155122Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:22 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "1Q22O983HD3511TN6Q5RRTP0MFVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=6d0a78087bc112c68a91b4b2d457efd8c09149b85b8f998f8c4b3f9916c8a743") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "559") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "ONJBNV2A9GBNUT34KH73JLL23BVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "24113616") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"ACTIVE"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.PutItem") + .header("content-length", "619") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=85fc7d2064a0e6d9c38d64751d39d311ad415ae4079ef21ef254b23ecf093519") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"rating":{"N":"6.2"},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"release_date":{"S":"2013-01-18T00:00:00Z"},"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"running_time_secs":{"N":"5215"},"rank":{"N":"11"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]}}},"title":{"S":"Turn It Down, Or Else!"},"year":{"N":"2013"}}}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "2") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "E6TGS5HKHHV08HSQA31IO1IDMFVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "2745614147") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.PutItem") + .header("content-length", "636") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=e4b1658c9f5129b3656381f6592a30e0061b1566263fbf27d982817ea79483f6") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"rating":{"N":"8.3"},"rank":{"N":"2"},"release_date":{"S":"2013-09-02T00:00:00Z"},"directors":{"L":[{"S":"Ron Howard"}]},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"running_time_secs":{"N":"7380"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]}}},"title":{"S":"Rush"},"year":{"N":"2013"}}}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "2") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "B63D54LP2FOGQK9JE5KLJT49HJVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "2745614147") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.Query") + .header("content-length", "156") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=c9a0fdd0c7c3a792faddabca1fc154c8fbb54ddee7b06a8082e1c587615198b5") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2222"}}}"##)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "39") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "AUAS9KJ0TK9BSR986TRPC2RGTRVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "3413411624") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Count":0,"Items":[],"ScannedCount":0}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.Query") + .header("content-length", "156") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=504d6b4de7093b20255b55057085937ec515f62f3c61da68c03bff3f0ce8a160") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2013"}}}"##)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "1231") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "624725176") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#)).unwrap()) ]) } diff --git a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs index a3d0c624735..711feb1e019 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs @@ -9,25 +9,27 @@ use std::iter::FromIterator; use aws_credential_types::Credentials; use aws_sdk_dynamodb::types::AttributeValue; use aws_sdk_dynamodb::{Client, Config}; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_client::test_connection::{capture_request, TestConnection}; use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, +}; +use aws_smithy_runtime_api::client::http::HttpClient; use aws_types::region::Region; -fn stub_config(conn: impl Into) -> Config { +fn stub_config(http_client: impl HttpClient + 'static) -> Config { Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build() } /// Validate that arguments are passed on to the paginator #[tokio::test] async fn paginators_pass_args() { - let (conn, request) = capture_request(None); - let client = Client::from_conf(stub_config(conn)); + let (http_client, request) = capture_request(None); + let client = Client::from_conf(stub_config(http_client)); let mut paginator = client .scan() .table_name("test-table") @@ -57,8 +59,8 @@ fn mk_response(body: &'static str) -> http::Response { #[tokio::test(flavor = "current_thread")] async fn paginators_loop_until_completion() { - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response( r#"{ @@ -74,7 +76,7 @@ async fn paginators_loop_until_completion() { }"#, ), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), @@ -90,14 +92,14 @@ async fn paginators_loop_until_completion() { ), ), ]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut paginator = client .scan() .table_name("test-table") .into_paginator() .page_size(32) .send(); - assert_eq!(conn.requests().len(), 0); + assert_eq!(http_client.actual_requests().count(), 0); let first_page = paginator .try_next() .await @@ -110,7 +112,7 @@ async fn paginators_loop_until_completion() { AttributeValue::S("joe@example.com".to_string()) )])] ); - assert_eq!(conn.requests().len(), 1); + assert_eq!(http_client.actual_requests().count(), 1); let second_page = paginator .try_next() .await @@ -123,36 +125,36 @@ async fn paginators_loop_until_completion() { AttributeValue::S("jack@example.com".to_string()) )])] ); - assert_eq!(conn.requests().len(), 2); + assert_eq!(http_client.actual_requests().count(), 2); assert!( paginator.next().await.is_none(), "no more pages should exist" ); // we shouldn't make another request, we know we're at the end - assert_eq!(conn.requests().len(), 2); - conn.assert_requests_match(&[]); + assert_eq!(http_client.actual_requests().count(), 2); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn paginators_handle_errors() { // LastEvaluatedKey is set but there is only one response in the test connection - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response( r#"{ - "Count": 1, - "Items": [{ - "PostedBy": { - "S": "joe@example.com" - } - }], - "LastEvaluatedKey": { - "PostedBy": { "S": "joe@example.com" } - } - }"#, + "Count": 1, + "Items": [{ + "PostedBy": { + "S": "joe@example.com" + } + }], + "LastEvaluatedKey": { + "PostedBy": { "S": "joe@example.com" } + } + }"#, ), )]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut rows = client .scan() .table_name("test-table") @@ -186,19 +188,19 @@ async fn paginators_stop_on_duplicate_token_by_default() { } }"#; // send the same response twice with the same pagination token - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response(response), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), mk_response(response), ), ]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut rows = client .scan() .table_name("test-table") @@ -239,25 +241,25 @@ async fn paginators_can_continue_on_duplicate_token() { } }"#; // send the same response twice with the same pagination token - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response(response), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), mk_response(response), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), mk_response(response), ), ]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut rows = client .scan() .table_name("test-table") diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index 211e8630a07..3e95a87c35d 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -7,8 +7,8 @@ use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_runtime::client::retries::RetryPartition; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use std::time::{Duration, SystemTime}; @@ -51,20 +51,20 @@ async fn test_adaptive_retries_with_no_throttling_errors() { let events = vec![ // First operation - (req(), err()), - (req(), err()), - (req(), ok()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), // Second operation - (req(), err()), - (req(), ok()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), // Third operation will fail, only errors - (req(), err()), - (req(), err()), - (req(), err()), - (req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), ]; - let conn = TestConnection::new(events); + let http_client = StaticReplayClient::new(events); let config = aws_sdk_dynamodb::Config::builder() .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) @@ -78,7 +78,7 @@ async fn test_adaptive_retries_with_no_throttling_errors() { .retry_partition(RetryPartition::new( "test_adaptive_retries_with_no_throttling_errors", )) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let expected_table_names = vec!["Test".to_owned()]; @@ -88,21 +88,21 @@ async fn test_adaptive_retries_with_no_throttling_errors() { assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3)); assert_eq!(res.table_names(), expected_table_names.as_slice()); // Three requests should have been made, two failing & one success - assert_eq!(conn.requests().len(), 3); + assert_eq!(http_client.actual_requests().count(), 3); let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); let res = client.list_tables().send().await.unwrap(); assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1)); assert_eq!(res.table_names(), expected_table_names.as_slice()); // Two requests should have been made, one failing & one success (plus previous requests) - assert_eq!(conn.requests().len(), 5); + assert_eq!(http_client.actual_requests().count(), 5); let client = aws_sdk_dynamodb::Client::from_conf(config); let err = client.list_tables().send().await.unwrap_err(); assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1 + 7),); assert_eq!(err.code(), Some("InternalServerError")); // four requests should have been made, all failing (plus previous requests) - assert_eq!(conn.requests().len(), 9); + assert_eq!(http_client.actual_requests().count(), 9); } #[tokio::test] @@ -111,15 +111,15 @@ async fn test_adaptive_retries_with_throttling_errors() { let events = vec![ // First operation - (req(), throttling_err()), - (req(), throttling_err()), - (req(), ok()), + ReplayEvent::new(req(), throttling_err()), + ReplayEvent::new(req(), throttling_err()), + ReplayEvent::new(req(), ok()), // Second operation - (req(), err()), - (req(), ok()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), ]; - let conn = TestConnection::new(events); + let http_client = StaticReplayClient::new(events); let config = aws_sdk_dynamodb::Config::builder() .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) @@ -133,7 +133,7 @@ async fn test_adaptive_retries_with_throttling_errors() { .retry_partition(RetryPartition::new( "test_adaptive_retries_with_throttling_errors", )) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let expected_table_names = vec!["Test".to_owned()]; @@ -143,7 +143,7 @@ async fn test_adaptive_retries_with_throttling_errors() { assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40)); assert_eq!(res.table_names(), expected_table_names.as_slice()); // Three requests should have been made, two failing & one success - assert_eq!(conn.requests().len(), 3); + assert_eq!(http_client.actual_requests().count(), 3); let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); let res = client.list_tables().send().await.unwrap(); @@ -151,5 +151,5 @@ async fn test_adaptive_retries_with_throttling_errors() { assert!(Duration::from_secs(49) > sleep_impl.total_duration()); assert_eq!(res.table_names(), expected_table_names.as_slice()); // Two requests should have been made, one failing & one success (plus previous requests) - assert_eq!(conn.requests().len(), 5); + assert_eq!(http_client.actual_requests().count(), 5); } diff --git a/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs b/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs index 3d5edf8cb22..0ce9d0c9deb 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs @@ -4,6 +4,7 @@ */ use aws_sdk_dynamodb::config::{Credentials, Region}; +use aws_smithy_runtime::client::http::test_util::capture_request; use http::Uri; /// Iterative test of loading clients from shared configuration @@ -12,10 +13,10 @@ async fn shared_config_testbed() { let shared_config = aws_types::SdkConfig::builder() .region(Region::new("us-east-4")) .build(); - let (conn, request) = aws_smithy_client::test_connection::capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_dynamodb::config::Builder::from(&shared_config) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .endpoint_url("http://localhost:8000") .build(); let svc = aws_sdk_dynamodb::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs b/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs index d1a9b9369e4..abd63673a5f 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs @@ -9,7 +9,7 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_sdk_dynamodb::error::SdkError; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_client::never::NeverConnector; +use aws_smithy_runtime::client::http::test_util::NeverClient; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; @@ -25,10 +25,10 @@ impl AsyncSleep for InstantSleep { #[tokio::test] async fn api_call_timeout_retries() { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let conf = SdkConfig::builder() .region(Region::new("us-east-2")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .timeout_config( TimeoutConfig::builder() @@ -45,7 +45,7 @@ async fn api_call_timeout_retries() { .await .expect_err("call should fail"); assert_eq!( - conn.num_calls(), + http_client.num_calls(), 3, "client level timeouts should be retried" ); @@ -58,10 +58,10 @@ async fn api_call_timeout_retries() { #[tokio::test] async fn no_retries_on_operation_timeout() { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let conf = SdkConfig::builder() .region(Region::new("us-east-2")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .timeout_config( TimeoutConfig::builder() @@ -78,7 +78,7 @@ async fn no_retries_on_operation_timeout() { .await .expect_err("call should fail"); assert_eq!( - conn.num_calls(), + http_client.num_calls(), 1, "operation level timeouts should not be retried" ); diff --git a/aws/sdk/integration-tests/ec2/Cargo.toml b/aws/sdk/integration-tests/ec2/Cargo.toml index 853b1b594f4..9e2757bea22 100644 --- a/aws/sdk/integration-tests/ec2/Cargo.toml +++ b/aws/sdk/integration-tests/ec2/Cargo.toml @@ -8,8 +8,11 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"]} tokio = { version = "1.23.1", features = ["full"]} http = "0.2.0" tokio-stream = "0.1.5" diff --git a/aws/sdk/integration-tests/ec2/tests/paginators.rs b/aws/sdk/integration-tests/ec2/tests/paginators.rs index d070971a4fc..a9ab25a4a1a 100644 --- a/aws/sdk/integration-tests/ec2/tests/paginators.rs +++ b/aws/sdk/integration-tests/ec2/tests/paginators.rs @@ -4,14 +4,15 @@ */ use aws_sdk_ec2::{config::Credentials, config::Region, types::InstanceType, Client, Config}; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_client::test_connection::TestConnection; +use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_runtime_api::client::http::HttpClient; -fn stub_config(conn: impl Into) -> Config { +fn stub_config(http_client: impl HttpClient + 'static) -> Config { Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build() } @@ -27,17 +28,17 @@ async fn paginators_handle_empty_tokens() { "#; - let conn = TestConnection::<&str>::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .uri("https://ec2.us-east-1.amazonaws.com/") .body(request.into()) .unwrap(), http::Response::builder() .status(200) - .body(response) + .body(SdkBody::from(response)) .unwrap(), )]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let instance_type = InstanceType::from("g5.48xlarge"); let mut paginator = client .describe_spot_price_history() @@ -49,7 +50,7 @@ async fn paginators_handle_empty_tokens() { .send(); let first_item = paginator.try_next().await.expect("success"); assert_eq!(first_item, None); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// See https://github.com/awslabs/aws-sdk-rust/issues/405 @@ -63,17 +64,17 @@ async fn paginators_handle_unset_tokens() { edf3e86c-4baf-47c1-9228-9a5ea09542e8 "#; - let conn = TestConnection::<&str>::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .uri("https://ec2.us-east-1.amazonaws.com/") .body(request.into()) .unwrap(), http::Response::builder() .status(200) - .body(response) + .body(SdkBody::from(response)) .unwrap(), )]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let instance_type = InstanceType::from("g5.48xlarge"); let mut paginator = client .describe_spot_price_history() @@ -85,5 +86,5 @@ async fn paginators_handle_unset_tokens() { .send(); let first_item = paginator.try_next().await.expect("success"); assert_eq!(first_item, None); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/glacier/Cargo.toml b/aws/sdk/integration-tests/glacier/Cargo.toml index 4c4ce34887d..ca08a6e3498 100644 --- a/aws/sdk/integration-tests/glacier/Cargo.toml +++ b/aws/sdk/integration-tests/glacier/Cargo.toml @@ -14,8 +14,8 @@ publish = false aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} aws-sdk-glacier = { path = "../../build/aws-sdk/sdk/glacier" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test"} +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } bytes = "1.0.0" http = "0.2.0" tokio = { version = "1.23.1", features = ["full", "test-util"]} diff --git a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs index 941ed0a999a..c2cd3384ec3 100644 --- a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs +++ b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs @@ -5,16 +5,16 @@ use aws_sdk_glacier::config::{Credentials, Region}; use aws_sdk_glacier::primitives::ByteStream; -use aws_smithy_client::test_connection::capture_request; use aws_smithy_protocol_test::{assert_ok, validate_headers}; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn set_correct_headers() { - let (conn, handler) = capture_request(None); + let (http_client, handler) = capture_request(None); let conf = aws_sdk_glacier::Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_glacier::Client::from_conf(conf); @@ -42,11 +42,11 @@ async fn set_correct_headers() { #[tokio::test] async fn autofill_account_id() { - let (conn, handler) = capture_request(None); + let (http_client, handler) = capture_request(None); let conf = aws_sdk_glacier::Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_glacier::Client::from_conf(conf); @@ -65,11 +65,11 @@ async fn autofill_account_id() { #[tokio::test] async fn api_version_set() { - let (conn, handler) = capture_request(None); + let (http_client, handler) = capture_request(None); let conf = aws_sdk_glacier::Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_glacier::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/iam/Cargo.toml b/aws/sdk/integration-tests/iam/Cargo.toml index 9c7b6b74642..e1d358ea446 100644 --- a/aws/sdk/integration-tests/iam/Cargo.toml +++ b/aws/sdk/integration-tests/iam/Cargo.toml @@ -15,7 +15,7 @@ aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", aws-endpoint = { path = "../../build/aws-sdk/sdk/aws-endpoint"} aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} aws-sdk-iam = { path = "../../build/aws-sdk/sdk/iam" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs b/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs index 923bf568f69..6ef167ba0ae 100644 --- a/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs +++ b/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs @@ -4,18 +4,18 @@ */ use aws_sdk_iam::config::{Credentials, Region}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; // this test is ignored because pseudoregions have been removed. This test should be re-enabled // once FIPS support is added in aws-config #[tokio::test] #[ignore] async fn correct_endpoint_resolver() { - let (conn, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_iam::Config::builder() .region(Region::from_static("iam-fips")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_iam::Client::from_conf(conf); let _ = client.list_roles().send().await; diff --git a/aws/sdk/integration-tests/kms/Cargo.toml b/aws/sdk/integration-tests/kms/Cargo.toml index 2c76644e94a..a26e2dd6720 100644 --- a/aws/sdk/integration-tests/kms/Cargo.toml +++ b/aws/sdk/integration-tests/kms/Cargo.toml @@ -15,10 +15,10 @@ aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime" } aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index 9125ec12e90..d550337ec54 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -5,9 +5,9 @@ use aws_sdk_kms as kms; use aws_sdk_kms::operation::RequestId; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_client::SdkError; use aws_smithy_http::body::SdkBody; +use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use http::header::AUTHORIZATION; use http::Uri; use kms::config::{Config, Credentials, Region}; @@ -20,16 +20,16 @@ use std::time::{Duration, UNIX_EPOCH}; /// Validate that for CN regions we set the URI correctly #[tokio::test] async fn generate_random_cn() { - let conn = TestConnection::new(vec![( + let http_client= StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .uri(Uri::from_static("https://kms.cn-north-1.amazonaws.com.cn/")) .body(SdkBody::from(r#"{"NumberOfBytes":64}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#).unwrap()) + .body(SdkBody::from(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("cn-north-1")) .credentials_provider(Credentials::for_tests()) .build(); @@ -41,13 +41,13 @@ async fn generate_random_cn() { .await .expect("success"); - assert_eq!(conn.requests().len(), 1); - conn.assert_requests_match(&[]); + assert_eq!(http_client.actual_requests().count(), 1); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn generate_random() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") @@ -61,10 +61,10 @@ async fn generate_random() { .body(SdkBody::from(r#"{"NumberOfBytes":64}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#).unwrap()) + .body(SdkBody::from(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests_with_session_token()) .build(); @@ -94,20 +94,20 @@ async fn generate_random() { .sum::(), 8562 ); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn generate_random_malformed_response() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder().body(SdkBody::from(r#"{"NumberOfBytes":64}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) // last `}` replaced with a space, invalid JSON - .body(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==" "#).unwrap()) + .body(SdkBody::from(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==" "#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) .build(); @@ -122,7 +122,7 @@ async fn generate_random_malformed_response() { #[tokio::test] async fn generate_random_keystore_not_found() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") @@ -143,10 +143,10 @@ async fn generate_random_keystore_not_found() { .header("date", "Fri, 05 Mar 2021 15:01:40 GMT") .header("content-type", "application/x-amz-json-1.1") .header("content-length", "44") - .body(r#"{"__type":"CustomKeyStoreNotFoundException"}"#).unwrap()) + .body(SdkBody::from(r#"{"__type":"CustomKeyStoreNotFoundException"}"#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests_with_session_token()) .build(); @@ -174,5 +174,5 @@ async fn generate_random_keystore_not_found() { inner.request_id(), Some("bfe81a0a-9a08-4e71-9910-cdb5ab6ea3b6") ); - conn.assert_requests_match(&[AUTHORIZATION]); + http_client.assert_requests_match(&[AUTHORIZATION]); } diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index 5eee47d9d2e..1b932e4be4c 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -6,8 +6,8 @@ use aws_credential_types::Credentials; use aws_runtime::retries::classifier::AwsErrorCodeClassifier; use aws_sdk_kms as kms; -use aws_smithy_client::test_connection::infallible_connection_fn; use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; @@ -18,9 +18,9 @@ use kms::operation::create_alias::CreateAliasError; async fn make_err( response: impl Fn() -> http::Response + Send + Sync + 'static, ) -> SdkError { - let conn = infallible_connection_fn(move |_| response()); + let http_client = infallible_client_fn(move |_| response()); let conf = kms::Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(kms::config::Region::from_static("us-east-1")) .build(); diff --git a/aws/sdk/integration-tests/lambda/Cargo.toml b/aws/sdk/integration-tests/lambda/Cargo.toml index 6e51d089f53..5f6cc8acbd4 100644 --- a/aws/sdk/integration-tests/lambda/Cargo.toml +++ b/aws/sdk/integration-tests/lambda/Cargo.toml @@ -9,12 +9,12 @@ publish = false [dev-dependencies] async-stream = "0.3.0" -aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } +aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-lambda = { path = "../../build/aws-sdk/sdk/lambda" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-eventstream = { path = "../../build/aws-sdk/sdk/aws-smithy-eventstream" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } base64 = "0.13.0" bytes = "1.0.0" futures-core = "0.3.14" diff --git a/aws/sdk/integration-tests/lambda/tests/request_id.rs b/aws/sdk/integration-tests/lambda/tests/request_id.rs index b4204b08888..6a6e1384ae3 100644 --- a/aws/sdk/integration-tests/lambda/tests/request_id.rs +++ b/aws/sdk/integration-tests/lambda/tests/request_id.rs @@ -7,15 +7,15 @@ use aws_sdk_lambda::config::{Credentials, Region}; use aws_sdk_lambda::operation::list_functions::ListFunctionsError; use aws_sdk_lambda::operation::RequestId; use aws_sdk_lambda::{Client, Config}; -use aws_smithy_client::test_connection::infallible_connection_fn; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; async fn run_test( response: impl Fn() -> http::Response<&'static str> + Send + Sync + 'static, expect_error: bool, ) { - let conn = infallible_connection_fn(move |_| response()); + let http_client = infallible_client_fn(move |_| response()); let conf = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::from_static("us-east-1")) .build(); diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index f90ca59fb16..e7d11dbc31c 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -12,7 +12,9 @@ use std::time::Duration; // If this test doesn't panic, you may have accidentally unified features, resulting in // the connector being enabled transitively #[tokio::test] -#[should_panic(expected = "Enable the `rustls` crate feature or set a connector to fix this.")] +#[should_panic( + expected = "Enable the `rustls` crate feature or configure a HTTP client to fix this." +)] async fn test_clients_from_sdk_config() { aws_config::load_from_env().await; } @@ -42,10 +44,10 @@ async fn test_clients_from_service_config() { .list_buckets() .send() .await - .expect_err("it should fail to send a request because there is no connector"); + .expect_err("it should fail to send a request because there is no HTTP client"); let msg = format!("{}", DisplayErrorContext(err)); assert!( - msg.contains("No HTTP connector was available to send this request. Enable the `rustls` crate feature or set a connector to fix this."), - "expected '{msg}' to contain 'No HTTP connector was available to send this request. Enable the `rustls` crate feature or set a connector to fix this.'" + msg.contains("No HTTP client was available to send this request. Enable the `rustls` crate feature or configure a HTTP client to fix this."), + "expected '{msg}' to contain 'No HTTP client was available to send this request. Enable the `rustls` crate feature or set a HTTP client to fix this.'" ); } diff --git a/aws/sdk/integration-tests/polly/Cargo.toml b/aws/sdk/integration-tests/polly/Cargo.toml index 5412a3dcaf1..444c65beaf3 100644 --- a/aws/sdk/integration-tests/polly/Cargo.toml +++ b/aws/sdk/integration-tests/polly/Cargo.toml @@ -14,7 +14,6 @@ publish = false aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} aws-sdk-polly = { path = "../../build/aws-sdk/sdk/polly" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/qldbsession/Cargo.toml b/aws/sdk/integration-tests/qldbsession/Cargo.toml index ef09721a845..59256fb6cd8 100644 --- a/aws/sdk/integration-tests/qldbsession/Cargo.toml +++ b/aws/sdk/integration-tests/qldbsession/Cargo.toml @@ -14,8 +14,9 @@ publish = false aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-qldbsession = { path = "../../build/aws-sdk/sdk/qldbsession" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } http = "0.2.0" tokio = { version = "1.23.1", features = ["full"]} diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 816f3cd8fb5..3c7a7424fb4 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -6,20 +6,20 @@ use aws_sdk_qldbsession::config::{Config, Credentials, Region}; use aws_sdk_qldbsession::types::StartSessionRequest; use aws_sdk_qldbsession::Client; -use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use http::Uri; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn signv4_use_correct_service_name() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("content-type", "application/x-amz-json-1.0") .header("x-amz-target", "QLDBSession.SendCommand") .header("content-length", "49") .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=350f957e9b736ac3f636d16c59c0a3cee8c2780b0ffadc99bbca841b7f15bee4") - // qldbsession uses the signing name 'qldb' in signature ____________________________________^^^^ + // qldbsession uses the signing name 'qldb' in signature _________________________^^^^ .header("x-amz-date", "20210305T134922Z") .header("x-amz-security-token", "notarealsessiontoken") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") @@ -27,10 +27,10 @@ async fn signv4_use_correct_service_name() { .body(SdkBody::from(r#"{"StartSession":{"LedgerName":"not-real-ledger"}}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{}"#).unwrap()), + .body(SdkBody::from(r#"{}"#)).unwrap()), ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests_with_session_token()) .build(); @@ -58,5 +58,5 @@ async fn signv4_use_correct_service_name() { .await .expect("request should succeed"); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 74453e21e6b..a525f698152 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -19,10 +19,9 @@ aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime", features = ["test- aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "wiremock"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } -aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util", "wire-mock"] } aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } diff --git a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs index a83e9f38d9b..7aee8af9045 100644 --- a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs +++ b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs @@ -13,8 +13,8 @@ use aws_sdk_s3::types::{ use aws_sdk_s3::{Client, Config}; use aws_smithy_async::assert_elapsed; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_client::never::NeverConnector; use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::http::test_util::NeverClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::timeout::TimeoutConfig; @@ -87,14 +87,14 @@ fn test_async_std_runtime_retry() { } async fn timeout_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box> { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let region = Region::from_static("us-east-2"); let timeout_config = TimeoutConfig::builder() .operation_timeout(Duration::from_secs_f32(0.5)) .build(); let config = Config::builder() .region(region) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(Credentials::for_tests()) .timeout_config(timeout_config) .sleep_impl(sleep_impl) @@ -141,10 +141,10 @@ async fn timeout_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box Result<(), Box> { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let conf = aws_types::SdkConfig::builder() .region(Region::new("us-east-2")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .retry_config(RetryConfig::standard().with_max_attempts(3)) .timeout_config( @@ -167,7 +167,7 @@ async fn retry_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box TestConnection<&'static str> { - TestConnection::new(vec![ - (http::Request::builder() +) -> StaticReplayClient { + StaticReplayClient::new(vec![ + ReplayEvent::new(http::Request::builder() .header("x-amz-checksum-mode", "ENABLED") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-date", "20210618T170728Z") @@ -45,7 +47,7 @@ fn new_checksum_validated_response_test_connection( .header("x-amz-id-2", "kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=") .header("accept-ranges", "bytes") .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"Hello world"#).unwrap()), + .body(SdkBody::from(r#"Hello world"#)).unwrap()), ]) } @@ -53,7 +55,7 @@ async fn test_checksum_on_streaming_response( checksum_header_name: &'static str, checksum_header_value: &'static str, ) -> GetObjectOutput { - let conn = new_checksum_validated_response_test_connection( + let http_client = new_checksum_validated_response_test_connection( checksum_header_name, checksum_header_value, ); @@ -61,7 +63,7 @@ async fn test_checksum_on_streaming_response( .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .time_source(UNIX_EPOCH + Duration::from_secs(1624036048)) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); @@ -79,7 +81,7 @@ async fn test_checksum_on_streaming_response( .await .unwrap(); - conn.assert_requests_match(&[ + http_client.assert_requests_match(&[ http::header::HeaderName::from_static("x-amz-checksum-mode"), AUTHORIZATION, ]); @@ -149,11 +151,11 @@ async fn test_checksum_on_streaming_request<'a>( expected_encoded_content_length: &'a str, expected_aws_chunked_encoded_body: &'a str, ) { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); @@ -330,7 +332,7 @@ async fn collect_body_into_string(mut body: aws_smithy_http::body::SdkBody) -> S #[traced_test] async fn test_get_multipart_upload_part_checksum_validation() { let expected_checksum = "cpjwid==-12"; - let (conn, rcvr) = capture_request(Some( + let (http_client, rcvr) = capture_request(Some( http::Response::builder() .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") .header("x-amz-checksum-crc32", expected_checksum) @@ -340,7 +342,7 @@ async fn test_get_multipart_upload_part_checksum_validation() { let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); @@ -376,7 +378,7 @@ async fn test_get_multipart_upload_part_checksum_validation() { #[traced_test] async fn test_response_checksum_ignores_invalid_base64() { let expected_checksum = "{}{!!#{})!{)@$(}"; - let (conn, rcvr) = capture_request(Some( + let (http_client, rcvr) = capture_request(Some( http::Response::builder() .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") .header("x-amz-checksum-crc32", expected_checksum) @@ -386,7 +388,7 @@ async fn test_response_checksum_ignores_invalid_base64() { let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index 28092f37ce4..44c7006888c 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -6,15 +6,15 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::{capture_request, CaptureRequestReceiver}; +use aws_smithy_runtime::client::http::test_util::{capture_request, CaptureRequestReceiver}; use aws_types::SdkConfig; fn test_client() -> (CaptureRequestReceiver, Client) { - let (conn, captured_request) = capture_request(None); + let (http_client, captured_request) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-2")) - .http_connector(conn) + .http_client(http_client) .build(); let client = Client::new(&sdk_config); (captured_request, client) diff --git a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs index 7621393eca5..6bd55816c06 100644 --- a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs +++ b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs @@ -7,19 +7,18 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; - +use aws_smithy_runtime::client::http::test_util::capture_request; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_s3_ops_are_customizable() { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index 7a76b24087e..5ac1ac7ad8a 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -8,15 +8,15 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::Builder; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::{capture_request, CaptureRequestReceiver}; +use aws_smithy_runtime::client::http::test_util::{capture_request, CaptureRequestReceiver}; use std::time::{Duration, UNIX_EPOCH}; fn test_client(update_builder: fn(Builder) -> Builder) -> (CaptureRequestReceiver, Client) { - let (conn, captured_request) = capture_request(None); + let (http_client, captured_request) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-4")) - .http_connector(conn) + .http_client(http_client) .build(); let client = Client::from_conf(update_builder(Builder::from(&sdk_config)).build()); (captured_request, client) diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index 07bf543b8c0..b120a34188c 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -5,8 +5,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::{config::Credentials, config::Region, types::ObjectAttributes, Client}; -use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_types::SdkConfig; use http::header::AUTHORIZATION; use std::time::{Duration, UNIX_EPOCH}; @@ -15,8 +15,8 @@ const RESPONSE_BODY_XML: &[u8] = b"\n< #[tokio::test] async fn ignore_invalid_xml_body_root() { - let conn = TestConnection::new(vec![ - (http::Request::builder() + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(http::Request::builder() .header("x-amz-object-attributes", "Checksum") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-date", "20210618T170728Z") @@ -37,7 +37,7 @@ async fn ignore_invalid_xml_body_root() { .header("server", "AmazonS3") .header("content-length", "224") .status(200) - .body(RESPONSE_BODY_XML) + .body(SdkBody::from(RESPONSE_BODY_XML)) .unwrap()) ]); @@ -46,7 +46,7 @@ async fn ignore_invalid_xml_body_root() { Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); @@ -64,5 +64,5 @@ async fn ignore_invalid_xml_body_root() { .await .unwrap(); - conn.assert_requests_match(&[AUTHORIZATION]); + http_client.assert_requests_match(&[AUTHORIZATION]); } diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs index 825f895fac0..62bc29b0396 100644 --- a/aws/sdk/integration-tests/s3/tests/interceptors.rs +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -6,8 +6,7 @@ use aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextMut; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -57,13 +56,13 @@ async fn interceptor_priority() { } } - let (conn, rx) = capture_request(None); + let (http_client, rx) = capture_request(None); // The first `TestInterceptor` will put `value1` into config let config = aws_sdk_s3::Config::builder() .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn)) + .http_client(http_client) .interceptor(TestInterceptor("value1")) .build(); let client = Client::from_conf(config); @@ -89,12 +88,12 @@ async fn interceptor_priority() { #[tokio::test] async fn set_test_user_agent_through_request_mutation() { - let (conn, rx) = capture_request(None); + let (http_client, rx) = capture_request(None); let config = aws_sdk_s3::Config::builder() .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) + .http_client(http_client.clone()) .build(); let client = Client::from_conf(config); diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index e67da16c270..209fd6bcde9 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -5,7 +5,7 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::{config::Credentials, config::Region, primitives::ByteStream, Client}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; use aws_types::SdkConfig; use http::HeaderValue; use std::time::{Duration, UNIX_EPOCH}; @@ -48,13 +48,13 @@ const NAUGHTY_STRINGS: &str = include_str!("blns/blns.txt"); #[tokio::test] async fn test_s3_signer_with_naughty_string_metadata() { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let config = aws_sdk_s3::config::Builder::from(&sdk_config) .force_path_style(true) diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs index b558a904941..670d85268cf 100644 --- a/aws/sdk/integration-tests/s3/tests/no_auth.rs +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -3,17 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_client::dvr::ReplayingConnection; use aws_smithy_protocol_test::MediaType; +use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; #[tokio::test] async fn list_objects() { let _logs = capture_test_logs(); - let conn = ReplayingConnection::from_file("tests/data/no_auth/list-objects.json").unwrap(); + let http_client = ReplayingClient::from_file("tests/data/no_auth/list-objects.json").unwrap(); let config = aws_config::from_env() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .no_credentials() .region("us-east-1") .load() @@ -33,7 +33,8 @@ async fn list_objects() { .await; dbg!(result).expect("success"); - conn.validate_body_and_headers(None, MediaType::Xml) + http_client + .validate_body_and_headers(None, MediaType::Xml) .await .unwrap(); } @@ -42,9 +43,10 @@ async fn list_objects() { async fn list_objects_v2() { let _logs = capture_test_logs(); - let conn = ReplayingConnection::from_file("tests/data/no_auth/list-objects-v2.json").unwrap(); + let http_client = + ReplayingClient::from_file("tests/data/no_auth/list-objects-v2.json").unwrap(); let config = aws_config::from_env() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .no_credentials() .region("us-east-1") .load() @@ -64,7 +66,8 @@ async fn list_objects_v2() { .await; dbg!(result).expect("success"); - conn.validate_body_and_headers(None, MediaType::Xml) + http_client + .validate_body_and_headers(None, MediaType::Xml) .await .unwrap(); } @@ -73,9 +76,9 @@ async fn list_objects_v2() { async fn head_object() { let _logs = capture_test_logs(); - let conn = ReplayingConnection::from_file("tests/data/no_auth/head-object.json").unwrap(); + let http_client = ReplayingClient::from_file("tests/data/no_auth/head-object.json").unwrap(); let config = aws_config::from_env() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .no_credentials() .region("us-east-1") .load() @@ -95,7 +98,8 @@ async fn head_object() { .await; dbg!(result).expect("success"); - conn.validate_body_and_headers(None, MediaType::Xml) + http_client + .validate_body_and_headers(None, MediaType::Xml) .await .unwrap(); } @@ -104,9 +108,9 @@ async fn head_object() { async fn get_object() { let _logs = capture_test_logs(); - let conn = ReplayingConnection::from_file("tests/data/no_auth/get-object.json").unwrap(); + let http_client = ReplayingClient::from_file("tests/data/no_auth/get-object.json").unwrap(); let config = aws_config::from_env() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .no_credentials() .region("us-east-1") .load() @@ -126,7 +130,8 @@ async fn get_object() { .await; dbg!(result).expect("success"); - conn.validate_body_and_headers(None, MediaType::Xml) + http_client + .validate_body_and_headers(None, MediaType::Xml) .await .unwrap(); } diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index d2b6f4a0000..e91af82846e 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -7,18 +7,18 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::primitives::ByteStream; use aws_sdk_s3::{config::Credentials, config::Region, Client}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_operation_should_not_normalize_uri_path() { - let (conn, rx) = capture_request(None); + let (http_client, rx) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index bc679369249..67557f6e057 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -7,18 +7,18 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_s3_signer_query_string_with_all_valid_chars() { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3/tests/reconnects.rs b/aws/sdk/integration-tests/s3/tests/reconnects.rs index cb29bb2a66b..5390cb2850c 100644 --- a/aws/sdk/integration-tests/s3/tests/reconnects.rs +++ b/aws/sdk/integration-tests/s3/tests/reconnects.rs @@ -6,14 +6,12 @@ use aws_sdk_s3::config::retry::{ReconnectMode, RetryConfig}; use aws_sdk_s3::config::{Credentials, Region, SharedAsyncSleep}; use aws_smithy_async::rt::sleep::TokioSleep; -use aws_smithy_client::test_connection::wire_mock::{ - check_matches, ReplayedEvent, WireLevelTestConnection, -}; -use aws_smithy_client::{ev, match_events}; +use aws_smithy_runtime::client::http::test_util::wire::{ReplayedEvent, WireMockServer}; +use aws_smithy_runtime::{ev, match_events}; #[tokio::test] async fn test_disable_reconnect_on_503() { - let mock = WireLevelTestConnection::spinup(vec![ + let mock = WireMockServer::start(vec![ ReplayedEvent::status(503), ReplayedEvent::status(503), ReplayedEvent::with_body("here-is-your-object"), @@ -25,7 +23,7 @@ async fn test_disable_reconnect_on_503() { .credentials_provider(Credentials::for_tests()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .endpoint_url(mock.endpoint_url()) - .http_connector(mock.http_connector()) + .http_client(mock.http_client()) .retry_config( RetryConfig::standard().with_reconnect_mode(ReconnectMode::ReuseAllConnections), ) @@ -53,7 +51,7 @@ async fn test_disable_reconnect_on_503() { #[tokio::test] async fn test_enabling_reconnect_on_503() { - let mock = WireLevelTestConnection::spinup(vec![ + let mock = WireMockServer::start(vec![ ReplayedEvent::status(503), ReplayedEvent::status(503), ReplayedEvent::with_body("here-is-your-object"), @@ -65,7 +63,7 @@ async fn test_enabling_reconnect_on_503() { .credentials_provider(Credentials::for_tests()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .endpoint_url(mock.endpoint_url()) - .http_connector(mock.http_connector()) + .http_client(mock.http_client()) .retry_config( RetryConfig::standard().with_reconnect_mode(ReconnectMode::ReconnectOnTransientError), ) diff --git a/aws/sdk/integration-tests/s3/tests/recursion-detection.rs b/aws/sdk/integration-tests/s3/tests/recursion-detection.rs index f0aa974d8e1..5bd7b265229 100644 --- a/aws/sdk/integration-tests/s3/tests/recursion-detection.rs +++ b/aws/sdk/integration-tests/s3/tests/recursion-detection.rs @@ -7,18 +7,18 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; use http::HeaderValue; #[tokio::test] async fn recursion_detection_applied() { std::env::set_var("AWS_LAMBDA_FUNCTION_NAME", "some-function"); std::env::set_var("_X_AMZN_TRACE_ID", "traceid"); - let (conn, captured_request) = capture_request(None); + let (http_client, captured_request) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); let _ = client.list_objects_v2().bucket("test-bucket").send().await; diff --git a/aws/sdk/integration-tests/s3/tests/request_id.rs b/aws/sdk/integration-tests/s3/tests/request_id.rs index 1df48038f23..d46bfe66da1 100644 --- a/aws/sdk/integration-tests/s3/tests/request_id.rs +++ b/aws/sdk/integration-tests/s3/tests/request_id.rs @@ -6,12 +6,12 @@ use aws_sdk_s3::operation::get_object::GetObjectError; use aws_sdk_s3::operation::{RequestId, RequestIdExt}; use aws_sdk_s3::{config::Credentials, config::Region, Client, Config}; -use aws_smithy_client::test_connection::capture_request; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn get_request_id_from_modeled_error() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -28,7 +28,7 @@ async fn get_request_id_from_modeled_error() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -60,7 +60,7 @@ async fn get_request_id_from_modeled_error() { #[tokio::test] async fn get_request_id_from_unmodeled_error() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -77,7 +77,7 @@ async fn get_request_id_from_unmodeled_error() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -106,7 +106,7 @@ async fn get_request_id_from_unmodeled_error() { #[tokio::test] async fn get_request_id_from_successful_nonstreaming_response() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -121,7 +121,7 @@ async fn get_request_id_from_successful_nonstreaming_response() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -141,7 +141,7 @@ async fn get_request_id_from_successful_nonstreaming_response() { #[tokio::test] async fn get_request_id_from_successful_streaming_response() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -150,7 +150,7 @@ async fn get_request_id_from_successful_streaming_response() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -173,7 +173,7 @@ async fn get_request_id_from_successful_streaming_response() { // Verify that the conversion from operation error to the top-level service error maintains the request ID #[tokio::test] async fn conversion_to_service_error_maintains_request_id() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -190,7 +190,7 @@ async fn conversion_to_service_error_maintains_request_id() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs index 8c47e8b3671..ab0e8d651d5 100644 --- a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -15,9 +15,8 @@ use aws_sdk_s3::Client; use aws_smithy_async::test_util::InstantSleep; use aws_smithy_async::test_util::ManualTimeSource; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; +use aws_smithy_protocol_test::MediaType; +use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -72,11 +71,11 @@ async fn three_retries_and_then_success() { let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1559347200)); let path = "tests/data/request-information-headers/three-retries_and-then-success.json"; - let conn = dvr::ReplayingConnection::from_file(path).unwrap(); + let http_client = ReplayingClient::from_file(path).unwrap(); let config = aws_sdk_s3::Config::builder() .credentials_provider(Credentials::for_tests_with_session_token()) .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) + .http_client(http_client.clone()) .time_source(SharedTimeSource::new(time_source.clone())) .sleep_impl(SharedAsyncSleep::new(InstantSleep::new(Default::default()))) .retry_config(RetryConfig::standard()) @@ -104,7 +103,10 @@ async fn three_retries_and_then_success() { let resp = resp.expect("valid e2e test"); assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("failed") + http_client + .full_validate(MediaType::Xml) + .await + .expect("failed") } // // // # Client makes 3 separate SDK operation invocations @@ -168,7 +170,7 @@ async fn three_retries_and_then_success() { // let config = aws_sdk_s3::Config::builder() // .credentials_provider(Credentials::for_tests()) // .region(Region::new("us-east-1")) -// .http_connector(DynConnector::new(conn.clone())) +// .http_client(DynConnector::new(conn.clone())) // .build(); // let client = Client::from_conf(config); // let fixup = FixupPlugin { @@ -259,7 +261,7 @@ async fn three_retries_and_then_success() { // let config = aws_sdk_s3::Config::builder() // .credentials_provider(Credentials::for_tests()) // .region(Region::new("us-east-1")) -// .http_connector(DynConnector::new(conn.clone())) +// .http_client(DynConnector::new(conn.clone())) // .build(); // let client = Client::from_conf(config); // let fixup = FixupPlugin { diff --git a/aws/sdk/integration-tests/s3/tests/required-query-params.rs b/aws/sdk/integration-tests/s3/tests/required-query-params.rs index b5fede83a09..1df7f44e4e5 100644 --- a/aws/sdk/integration-tests/s3/tests/required-query-params.rs +++ b/aws/sdk/integration-tests/s3/tests/required-query-params.rs @@ -6,14 +6,14 @@ use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::error::DisplayErrorContext; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; use aws_smithy_http::operation::error::BuildError; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn test_error_when_required_query_param_is_unset() { - let (conn, _request) = capture_request(None); + let (http_client, _request) = capture_request(None); let config = aws_sdk_s3::Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -36,9 +36,9 @@ async fn test_error_when_required_query_param_is_unset() { #[tokio::test] async fn test_error_when_required_query_param_is_set_but_empty() { - let (conn, _request) = capture_request(None); + let (http_client, _request) = capture_request(None); let config = aws_sdk_s3::Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/select-object-content.rs b/aws/sdk/integration-tests/s3/tests/select-object-content.rs index eb4d7a055ca..4ba1e491636 100644 --- a/aws/sdk/integration-tests/s3/tests/select-object-content.rs +++ b/aws/sdk/integration-tests/s3/tests/select-object-content.rs @@ -11,19 +11,19 @@ use aws_sdk_s3::types::{ OutputSerialization, SelectObjectContentEventStream, }; use aws_sdk_s3::Client; -use aws_smithy_client::dvr::{Event, ReplayingConnection}; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime::client::http::test_util::dvr::{Event, ReplayingClient}; use std::error::Error; #[tokio::test] async fn test_success() { let events: Vec = serde_json::from_str(include_str!("select-object-content.json")).unwrap(); - let replayer = ReplayingConnection::new(events); + let replayer = ReplayingClient::new(events); let sdk_config = SdkConfig::builder() .region(Region::from_static("us-east-2")) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .http_connector(replayer.clone()) + .http_client(replayer.clone()) .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3/tests/make-connector-override.rs b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs similarity index 58% rename from aws/sdk/integration-tests/s3/tests/make-connector-override.rs rename to aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs index 90eb79d70c8..ba014b0d7f9 100644 --- a/aws/sdk/integration-tests/s3/tests/make-connector-override.rs +++ b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs @@ -6,54 +6,13 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - -use aws_smithy_client::http_connector::{ConnectorSettings, HttpConnector}; -use aws_smithy_client::test_connection; - use aws_smithy_http::result::SdkError; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; use aws_types::SdkConfig; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; use std::time::Duration; use tokio::time::Instant; -/// Verify that `make_connector_fn` isn't called per request -#[tokio::test] -async fn make_connector_fn_test() { - let sentinel = Arc::new(AtomicUsize::new(0)); - let connector_sentinel = sentinel.clone(); - let connector_with_counter = HttpConnector::ConnectorFn(Arc::new( - move |_settings: &ConnectorSettings, _sleep: Option| { - connector_sentinel.fetch_add(1, Ordering::Relaxed); - Some(test_connection::infallible_connection_fn(|_req| { - http::Response::builder().status(200).body("ok!").unwrap() - })) - }, - )); - let sdk_config = SdkConfig::builder() - .http_connector(connector_with_counter) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .region(Region::from_static("us-east-1")) - .build(); - let client = aws_sdk_s3::Client::new(&sdk_config); - assert_eq!(sentinel.load(Ordering::Relaxed), 1); - for _ in 0..10 { - let _ = client - .get_object() - .bucket("foo") - .key("bar") - .send() - .await - .expect("test connector replies with 200"); - } - assert_eq!(sentinel.load(Ordering::Relaxed), 1); - // but creating another client creates another connector - let _client_2 = aws_sdk_s3::Client::new(&sdk_config); - assert_eq!(sentinel.load(Ordering::Relaxed), 2); -} - /// Use a 5 second operation timeout on SdkConfig and a 0ms connect timeout on the service config #[tokio::test] async fn timeouts_can_be_set_by_service() { diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index 46e1859f0a6..d739bec6c14 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -7,26 +7,26 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_signer() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=ae78f74d26b6b0c3a403d9e8cc7ec3829d6264a2b33db672bf2b151bbb901786") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~") .body(SdkBody::empty()) .unwrap(), - http::Response::builder().status(200).body("").unwrap(), + http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), )]); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); let _ = client @@ -41,5 +41,5 @@ async fn test_signer() { .send() .await; - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/s3/tests/status-200-errors.rs b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs index 5fee498ec65..ad53f1fedbd 100644 --- a/aws/sdk/integration-tests/s3/tests/status-200-errors.rs +++ b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs @@ -6,8 +6,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::infallible_connection_fn; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_types::region::Region; use aws_types::SdkConfig; @@ -23,11 +23,12 @@ const ERROR_RESPONSE: &str = r#" #[tokio::test] async fn status_200_errors() { - let conn = infallible_connection_fn(|_req| http::Response::new(SdkBody::from(ERROR_RESPONSE))); + let http_client = + infallible_client_fn(|_req| http::Response::new(SdkBody::from(ERROR_RESPONSE))); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-4")) - .http_connector(conn) + .http_client(http_client) .build(); let client = Client::new(&sdk_config); let error = client diff --git a/aws/sdk/integration-tests/s3/tests/timeouts.rs b/aws/sdk/integration-tests/s3/tests/timeouts.rs index 59359ad20bd..da324e80fae 100644 --- a/aws/sdk/integration-tests/s3/tests/timeouts.rs +++ b/aws/sdk/integration-tests/s3/tests/timeouts.rs @@ -13,7 +13,7 @@ use aws_sdk_s3::types::{ use aws_sdk_s3::Client; use aws_smithy_async::assert_elapsed; use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep, TokioSleep}; -use aws_smithy_client::never::NeverConnector; +use aws_smithy_runtime::client::http::test_util::NeverClient; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::timeout::TimeoutConfig; use std::future::Future; @@ -27,7 +27,7 @@ async fn test_timeout_service_ends_request_that_never_completes() { let sdk_config = SdkConfig::builder() .region(Region::from_static("us-east-2")) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .http_connector(NeverConnector::new()) + .http_client(NeverClient::new()) .timeout_config( TimeoutConfig::builder() .operation_timeout(Duration::from_secs_f32(0.5)) diff --git a/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs b/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs index 2dfea8d37b7..c9cb041bbdc 100644 --- a/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs +++ b/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs @@ -7,15 +7,15 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{AppName, Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn user_agent_app_name() { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .app_name(AppName::new("test-app-name").expect("valid app name")) // set app name in config .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index beeb8e91777..723f8c964af 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -14,7 +14,8 @@ publish = false aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1.0.0" diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index 4b207f98350..7a1a585d1c0 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -6,14 +6,14 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3control::config::{Credentials, Region}; use aws_sdk_s3control::Client; -use aws_smithy_client::test_connection::TestConnection; use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_types::SdkConfig; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_signer() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20211112/us-east-1/s3/aws4_request, \ @@ -22,13 +22,13 @@ async fn test_signer() { .uri("https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint") .body(SdkBody::empty()) .unwrap(), - http::Response::builder().status(200).body("").unwrap(), + http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), )]); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .build(); let client = Client::new(&sdk_config); @@ -46,5 +46,5 @@ async fn test_signer() { .await .expect_err("empty response"); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/sts/Cargo.toml b/aws/sdk/integration-tests/sts/Cargo.toml index a5e50b83cfa..b9e50af6e09 100644 --- a/aws/sdk/integration-tests/sts/Cargo.toml +++ b/aws/sdk/integration-tests/sts/Cargo.toml @@ -13,8 +13,8 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } diff --git a/aws/sdk/integration-tests/sts/tests/signing-it.rs b/aws/sdk/integration-tests/sts/tests/signing-it.rs index 5bf851a5ca5..1b0a4e918ed 100644 --- a/aws/sdk/integration-tests/sts/tests/signing-it.rs +++ b/aws/sdk/integration-tests/sts/tests/signing-it.rs @@ -4,16 +4,16 @@ */ use aws_sdk_sts::config::{Credentials, Region}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn assume_role_signed() { let creds = Credentials::for_tests(); - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .credentials_provider(creds) .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role().send().await; @@ -26,10 +26,10 @@ async fn assume_role_signed() { #[tokio::test] async fn web_identity_unsigned() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role_with_web_identity().send().await; @@ -42,10 +42,10 @@ async fn web_identity_unsigned() { #[tokio::test] async fn assume_role_saml_unsigned() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role_with_saml().send().await; @@ -58,10 +58,10 @@ async fn assume_role_saml_unsigned() { #[tokio::test] async fn web_identity_no_creds() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role_with_web_identity().send().await; diff --git a/aws/sdk/integration-tests/timestreamquery/Cargo.toml b/aws/sdk/integration-tests/timestreamquery/Cargo.toml index 99955e47647..b8c6a497acb 100644 --- a/aws/sdk/integration-tests/timestreamquery/Cargo.toml +++ b/aws/sdk/integration-tests/timestreamquery/Cargo.toml @@ -14,7 +14,6 @@ publish = false aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-sdk-timestreamquery = { path = "../../build/aws-sdk/sdk/timestreamquery" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"] } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } tokio = { version = "1.23.1", features = ["full", "test-util"] } diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index 4c36c1e157a..4bff784adeb 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_smithy_runtime::client::http::test_util::dvr::{MediaType, ReplayingClient}; + #[tokio::test] async fn do_endpoint_discovery() { use aws_credential_types::provider::SharedCredentialsProvider; @@ -11,19 +13,18 @@ async fn do_endpoint_discovery() { use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_async::test_util::controlled_time_and_sleep; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; - use aws_smithy_client::dvr::{MediaType, ReplayingConnection}; use aws_types::region::Region; use aws_types::SdkConfig; use std::time::{Duration, UNIX_EPOCH}; let _logs = aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs(); - let conn = ReplayingConnection::from_file("tests/traffic.json").unwrap(); + let http_client = ReplayingClient::from_file("tests/traffic.json").unwrap(); //let conn = aws_smithy_client::dvr::RecordingConnection::new(conn); let start = UNIX_EPOCH + Duration::from_secs(1234567890); let (ts, sleep, mut gate) = controlled_time_and_sleep(start); let config = SdkConfig::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::from_static("us-west-2")) .sleep_impl(SharedAsyncSleep::new(sleep)) .credentials_provider(SharedCredentialsProvider::new( @@ -65,15 +66,16 @@ async fn do_endpoint_discovery() { .unwrap(); // if you want to update this test: // conn.dump_to_file("tests/traffic.json").unwrap(); - conn.validate_body_and_headers( - Some(&[ - "x-amz-security-token", - "x-amz-date", - "content-type", - "x-amz-target", - ]), - MediaType::Json, - ) - .await - .unwrap(); + http_client + .validate_body_and_headers( + Some(&[ + "x-amz-security-token", + "x-amz-date", + "content-type", + "x-amz-target", + ]), + MediaType::Json, + ) + .await + .unwrap(); } diff --git a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml index 181ba493cbc..45a26fb836f 100644 --- a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml +++ b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml @@ -13,9 +13,9 @@ async-stream = "0.3.0" aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-transcribestreaming = { path = "../../build/aws-sdk/sdk/transcribestreaming" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } aws-smithy-eventstream = { path = "../../build/aws-sdk/sdk/aws-smithy-eventstream" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } bytes = "1.0.0" futures-core = "0.3.14" hound = "3.4.0" diff --git a/aws/sdk/integration-tests/transcribestreaming/tests/test.rs b/aws/sdk/integration-tests/transcribestreaming/tests/test.rs index 62654ebd82f..fce762d82be 100644 --- a/aws/sdk/integration-tests/transcribestreaming/tests/test.rs +++ b/aws/sdk/integration-tests/transcribestreaming/tests/test.rs @@ -13,8 +13,8 @@ use aws_sdk_transcribestreaming::types::{ AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream, }; use aws_sdk_transcribestreaming::{Client, Config}; -use aws_smithy_client::dvr::{Event, ReplayingConnection}; use aws_smithy_eventstream::frame::{DecodedFrame, HeaderValue, Message, MessageFrameDecoder}; +use aws_smithy_runtime::client::http::test_util::dvr::{Event, ReplayingClient}; use bytes::BufMut; use futures_core::Stream; use std::collections::{BTreeMap, BTreeSet}; @@ -98,14 +98,14 @@ async fn start_request( region: &'static str, events_json: &str, input_stream: impl Stream> + Send + Sync + 'static, -) -> (ReplayingConnection, StartStreamTranscriptionOutput) { +) -> (ReplayingClient, StartStreamTranscriptionOutput) { let events: Vec = serde_json::from_str(events_json).unwrap(); - let replayer = ReplayingConnection::new(events); + let replayer = ReplayingClient::new(events); let region = Region::from_static(region); let config = Config::builder() .region(region) - .http_connector(replayer.clone()) + .http_client(replayer.clone()) .credentials_provider(Credentials::for_tests()) .build(); let client = Client::from_conf(config); diff --git a/aws/sdk/integration-tests/webassembly/Cargo.toml b/aws/sdk/integration-tests/webassembly/Cargo.toml index b66406e6f5f..159fb4b8676 100644 --- a/aws/sdk/integration-tests/webassembly/Cargo.toml +++ b/aws/sdk/integration-tests/webassembly/Cargo.toml @@ -21,8 +21,9 @@ crate-type = ["cdylib"] aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false, features = ["rt-tokio"]} aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["hardcoded-credentials"] } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", default-features = false } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", default-features = false } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } http = "0.2.8" diff --git a/aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs b/aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs deleted file mode 100644 index 5ca84838c9f..00000000000 --- a/aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_http::body::SdkBody; - -pub(crate) fn make_request(_req: http::Request) -> Result, ()> { - // Consumers here would pass the HTTP request to - // the Wasm host in order to get the response back - let body = " - - - - 2023-01-23T11:59:03.575496Z - doc-example-bucket - - - 2023-01-23T23:32:13.125238Z - doc-example-bucket2 - - - - account-name - a3a42310-42d0-46d1-9745-0cee9f4fb851 - - "; - Ok(http::Response::new(SdkBody::from(body))) -} diff --git a/aws/sdk/integration-tests/webassembly/src/adapter/mod.rs b/aws/sdk/integration-tests/webassembly/src/adapter/mod.rs deleted file mode 100644 index b563eb097a8..00000000000 --- a/aws/sdk/integration-tests/webassembly/src/adapter/mod.rs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod http_client; - -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use std::task::{Context, Poll}; -use tower::Service; - -#[derive(Default, Debug, Clone)] -pub(crate) struct Adapter {} - -impl Adapter { - pub fn to_http_connector() -> impl Into { - DynConnector::new(Adapter::default()) - } -} - -impl Service> for Adapter { - type Response = http::Response; - - type Error = ConnectorError; - - #[allow(clippy::type_complexity)] - type Future = std::pin::Pin< - Box> + Send + 'static>, - >; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: http::Request) -> Self::Future { - println!("Adapter: sending request..."); - let res = http_client::make_request(req).unwrap(); - println!("{:?}", res); - Box::pin(async move { Ok(res) }) - } -} diff --git a/aws/sdk/integration-tests/webassembly/src/default_config.rs b/aws/sdk/integration-tests/webassembly/src/default_config.rs index 181d1bb4707..c87a364b5ed 100644 --- a/aws/sdk/integration-tests/webassembly/src/default_config.rs +++ b/aws/sdk/integration-tests/webassembly/src/default_config.rs @@ -3,14 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::http::WasmHttpConnector; use aws_config::retry::RetryConfig; use aws_credential_types::Credentials; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; use std::future::Future; -use crate::adapter::Adapter; - pub(crate) fn get_default_config() -> impl Future { aws_config::from_env() .region(Region::from_static("us-west-2")) @@ -21,7 +20,7 @@ pub(crate) fn get_default_config() -> impl Future) -> Result, ()> { + // Consumers here would pass the HTTP request to + // the Wasm host in order to get the response back + let body = " + + + + 2023-01-23T11:59:03.575496Z + doc-example-bucket + + + 2023-01-23T23:32:13.125238Z + doc-example-bucket2 + + + + account-name + a3a42310-42d0-46d1-9745-0cee9f4fb851 + + "; + Ok(http::Response::new(SdkBody::from(body))) +} + +#[derive(Default, Debug, Clone)] +pub(crate) struct WasmHttpConnector; +impl WasmHttpConnector { + pub fn new() -> Self { + Self + } +} + +impl HttpConnector for WasmHttpConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + println!("Adapter: sending request..."); + let res = make_request(request).unwrap(); + println!("{:?}", res); + HttpConnectorFuture::new(async move { Ok(res) }) + } +} + +impl HttpClient for WasmHttpConnector { + fn http_connector( + &self, + _settings: &HttpConnectorSettings, + _components: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/aws/sdk/integration-tests/webassembly/src/lib.rs b/aws/sdk/integration-tests/webassembly/src/lib.rs index bc9c1a112bf..1c4932afbb9 100644 --- a/aws/sdk/integration-tests/webassembly/src/lib.rs +++ b/aws/sdk/integration-tests/webassembly/src/lib.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -mod adapter; mod default_config; +mod http; mod list_buckets; #[tokio::main(flavor = "current_thread")] diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index b484544c276..4705c4e2952 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -1,17 +1,15 @@ # These are the allowed external types in the `aws-sdk-*` generated crates, checked by CI. allowed_external_types = [ "aws_credential_types::*", - "aws_endpoint::*", "aws_http::*", "aws_runtime::*", "aws_smithy_async::*", - "aws_smithy_client::*", "aws_smithy_http::*", - "aws_smithy_http_tower::*", "aws_smithy_runtime::*", "aws_smithy_runtime_api::*", "aws_smithy_types::*", "aws_types::*", + "http::header::map::HeaderMap", "http::header::value::HeaderValue", "http::request::Request", @@ -19,14 +17,6 @@ allowed_external_types = [ "http::uri::Uri", "http::method::Method", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized - "futures_core::stream::Stream", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", - "tower_layer::identity::Identity", - "tower_layer::stack::Stack", ] diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt index cd797f938fa..d8a9b6818bd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt @@ -26,7 +26,7 @@ class ConnectionPoisoningRuntimePluginCustomization( section.registerInterceptor(runtimeConfig, this) { rust( "#T::new()", - smithyRuntime(runtimeConfig).resolve("client::connectors::connection_poisoning::ConnectionPoisoningInterceptor"), + smithyRuntime(runtimeConfig).resolve("client::http::connection_poisoning::ConnectionPoisoningInterceptor"), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 643d0af31a3..91f08b80be2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -6,7 +6,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig @@ -35,85 +34,30 @@ private class HttpConnectorConfigCustomization( *preludeScope, "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), "ConnectorSettings" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::ConnectorSettings"), - "DynConnectorAdapter" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::connectors::adapter::DynConnectorAdapter"), - "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), + "HttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), + "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedHttpConnector" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::connectors::SharedHttpConnector"), + "SharedHttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"), "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), ) - private fun defaultConnectorFn(): RuntimeType = RuntimeType.forInlineFun("default_connector", ClientRustModule.config) { - rustTemplate( - """ - ##[cfg(feature = "rustls")] - fn default_connector( - connector_settings: &#{ConnectorSettings}, - sleep_impl: #{Option}<#{SharedAsyncSleep}>, - ) -> #{Option}<#{DynConnector}> { - #{default_connector}(connector_settings, sleep_impl) - } - - ##[cfg(not(feature = "rustls"))] - fn default_connector( - _connector_settings: &#{ConnectorSettings}, - _sleep_impl: #{Option}<#{SharedAsyncSleep}>, - ) -> #{Option}<#{DynConnector}> { - #{None} - } - """, - *codegenScope, - "default_connector" to RuntimeType.smithyClient(runtimeConfig).resolve("conns::default_connector"), - "DynConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("erase::DynConnector"), - ) - } - - private fun setConnectorFn(): RuntimeType = RuntimeType.forInlineFun("set_connector", ClientRustModule.config) { - rustTemplate( - """ - fn set_connector(resolver: &mut #{Resolver}<'_>) { - // Initial configuration needs to set a default if no connector is given, so it - // should always get into the condition below. - // - // Override configuration should set the connector if the override config - // contains a connector, sleep impl, or a timeout config since these are all - // incorporated into the final connector. - let must_set_connector = resolver.is_initial() - || resolver.is_latest_set::<#{HttpConnector}>() - || resolver.latest_sleep_impl().is_some() - || resolver.is_latest_set::<#{TimeoutConfig}>(); - if must_set_connector { - let sleep_impl = resolver.sleep_impl(); - let timeout_config = resolver.resolve_config::<#{TimeoutConfig}>() - .cloned() - .unwrap_or_else(#{TimeoutConfig}::disabled); - let connector_settings = #{ConnectorSettings}::from_timeout_config(&timeout_config); - let http_connector = resolver.resolve_config::<#{HttpConnector}>(); - - // TODO(enableNewSmithyRuntimeCleanup): Replace the tower-based DynConnector and remove DynConnectorAdapter when deleting the middleware implementation - let connector = - http_connector - .and_then(|c| c.connector(&connector_settings, sleep_impl.clone())) - .or_else(|| #{default_connector}(&connector_settings, sleep_impl)) - .map(|c| #{SharedHttpConnector}::new(#{DynConnectorAdapter}::new(c))); - - resolver.runtime_components_mut().set_http_connector(connector); - } - } - """, - *codegenScope, - "default_connector" to defaultConnectorFn(), - ) - } - override fun section(section: ServiceConfig): Writable { return when (section) { is ServiceConfig.ConfigImpl -> writable { rustTemplate( """ - /// Return the [`SharedHttpConnector`](#{SharedHttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<#{SharedHttpConnector}> { - self.runtime_components.http_connector() + /// Deprecated. Don't use. + ##[deprecated( + note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + )] + pub fn http_connector(&self) -> Option<#{SharedHttpClient}> { + self.runtime_components.http_client() + } + + /// Return the [`SharedHttpClient`](#{SharedHttpClient}) to use when making requests, if any. + pub fn http_client(&self) -> Option<#{SharedHttpClient}> { + self.runtime_components.http_client() } """, *codegenScope, @@ -123,7 +67,23 @@ private class HttpConnectorConfigCustomization( ServiceConfig.BuilderImpl -> writable { rustTemplate( """ - /// Sets the HTTP connector to use when making requests. + /// Deprecated. Don't use. + ##[deprecated( + note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + )] + pub fn http_connector(self, http_client: impl #{HttpClient} + 'static) -> Self { + self.http_client(http_client) + } + + /// Deprecated. Don't use. + ##[deprecated( + note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + )] + pub fn set_http_connector(&mut self, http_client: Option<#{SharedHttpClient}>) -> &mut Self { + self.set_http_client(http_client) + } + + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run @@ -132,10 +92,8 @@ private class HttpConnectorConfigCustomization( /// ## ##[test] /// ## fn example() { /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; /// use $moduleUseName::config::Config; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() @@ -143,23 +101,23 @@ private class HttpConnectorConfigCustomization( /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); + /// let hyper_client = HyperClientBuilder::new().build(https_connector); + /// + /// // This connector can then be given to a generated service Config + /// let config = my_service_client::Config::builder() + /// .endpoint_url("https://example.com") + /// .http_client(hyper_client) + /// .build(); + /// let client = my_service_client::Client::from_conf(config); /// ## } /// ## } /// ``` - pub fn http_connector(mut self, http_connector: impl Into<#{HttpConnector}>) -> Self { - self.set_http_connector(#{Some}(http_connector)); + pub fn http_client(mut self, http_client: impl #{HttpClient} + 'static) -> Self { + self.set_http_client(#{Some}(#{IntoShared}::into_shared(http_client))); self } - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run @@ -168,41 +126,28 @@ private class HttpConnectorConfigCustomization( /// ## ##[test] /// ## fn example() { /// use std::time::Duration; - /// use aws_smithy_client::hyper_ext; - /// use aws_smithy_client::http_connector::ConnectorSettings; /// use $moduleUseName::config::{Builder, Config}; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// - /// fn override_http_connector(builder: &mut Builder) { + /// fn override_http_client(builder: &mut Builder) { /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// builder.set_http_connector(Some(smithy_connector)); + /// let hyper_client = HyperClientBuilder::new().build(https_connector); + /// builder.set_http_client(Some(hyper_client)); /// } /// /// let mut builder = $moduleUseName::Config::builder(); - /// override_http_connector(&mut builder); + /// override_http_client(&mut builder); /// let config = builder.build(); /// ## } /// ## } /// ``` - """, - *codegenScope, - ) - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { - http_connector.map(|c| self.config.store_put(c.into())); + pub fn set_http_client(&mut self, http_client: Option<#{SharedHttpClient}>) -> &mut Self { + self.runtime_components.set_http_client(http_client); self } """, @@ -210,20 +155,6 @@ private class HttpConnectorConfigCustomization( ) } - is ServiceConfig.BuilderBuild -> writable { - rustTemplate( - "#{set_connector}(&mut resolver);", - "set_connector" to setConnectorFn(), - ) - } - - is ServiceConfig.OperationConfigOverride -> writable { - rustTemplate( - "#{set_connector}(&mut resolver);", - "set_connector" to setConnectorFn(), - ) - } - else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index 87586fbcb73..6f588f11acc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -29,9 +29,11 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, + "AsyncSleep" to sleepModule.resolve("AsyncSleep"), "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), "debug" to RuntimeType.Tracing.resolve("debug"), + "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), "RetryConfig" to retryConfig.resolve("RetryConfig"), "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), "RetryPartition" to retries.resolve("RetryPartition"), @@ -150,8 +152,8 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon /// let sleep_impl = SharedAsyncSleep::new(ForeverSleep); /// let config = Config::builder().sleep_impl(sleep_impl).build(); /// ``` - pub fn sleep_impl(mut self, sleep_impl: #{SharedAsyncSleep}) -> Self { - self.set_sleep_impl(Some(sleep_impl)); + pub fn sleep_impl(mut self, sleep_impl: impl #{AsyncSleep} + 'static) -> Self { + self.set_sleep_impl(Some(#{IntoShared}::into_shared(sleep_impl))); self } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index f3402c950df..67b3664688c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -18,8 +18,10 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.pre class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val codegenScope = arrayOf( *preludeScope, + "IntoShared" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("shared::IntoShared"), "SharedTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::SharedTimeSource"), "StaticTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::StaticTimeSource"), + "TimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::TimeSource"), "UNIX_EPOCH" to RuntimeType.std.resolve("time::UNIX_EPOCH"), "Duration" to RuntimeType.std.resolve("time::Duration"), ) @@ -46,9 +48,9 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust /// Sets the time source used for this service pub fn time_source( mut self, - time_source: impl #{Into}<#{SharedTimeSource}>, + time_source: impl #{TimeSource} + 'static, ) -> Self { - self.set_time_source(#{Some}(time_source.into())); + self.set_time_source(#{Some}(#{IntoShared}::into_shared(time_source))); self } """, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 78686b2877e..3852d09fb24 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -69,7 +69,13 @@ class RequiredCustomizations : ClientCodegenDecorator { val rc = codegenContext.runtimeConfig // Add rt-tokio feature for `ByteStream::from_path` - rustCrate.mergeFeature(Feature("rt-tokio", true, listOf("aws-smithy-http/rt-tokio"))) + rustCrate.mergeFeature( + Feature( + "rt-tokio", + true, + listOf("aws-smithy-async/rt-tokio", "aws-smithy-http/rt-tokio"), + ), + ) rustCrate.mergeFeature(TestUtilFeature) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt index 5234f6fe596..dfe7ca58024 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt @@ -39,7 +39,7 @@ class FluentClientDecorator : ClientCodegenDecorator { customizations = listOf(GenericFluentClient(codegenContext)), ).render(rustCrate) - rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-client/rustls"))) + rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-runtime/tls-rustls"))) } override fun libRsCustomizations( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 0d7bb2fd1ec..4435f732710 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -481,6 +481,7 @@ private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeTyp let mut configured_plugins = #{Vec}::new(); ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); let mut plugins = #{RuntimePlugins}::new() + .with_client_plugin(#{default_http_client_plugin}()) .with_client_plugin( #{StaticRuntimePlugin}::new() .with_config(config.config.clone()) @@ -500,6 +501,8 @@ private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeTyp .resolve("client::auth::no_auth::NoAuthRuntimePlugin"), "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::runtime_plugin::StaticRuntimePlugin"), + "default_http_client_plugin" to RuntimeType.smithyRuntime(runtimeConfig) + .resolve("client::http::default_http_client_plugin"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 44ff13d45e7..4a4f810789c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -49,7 +49,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT data class ClientCreationParams( val codegenContext: ClientCodegenContext, - val connectorName: String, + val httpClientName: String, val configBuilderName: String, val clientName: String, ) @@ -75,7 +75,7 @@ class DefaultProtocolTestGenerator( """ let ${params.clientName} = #{Client}::from_conf( ${params.configBuilderName} - .http_connector(${params.connectorName}) + .http_client(${params.httpClientName}) .build() ); """, @@ -206,20 +206,17 @@ class DefaultProtocolTestGenerator( } ?: writable { } rustTemplate( """ - let (conn, request_receiver) = #{capture_request}(None); + let (http_client, request_receiver) = #{capture_request}(None); let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_resolver("https://example.com"); #{customParams} """, - "capture_request" to CargoDependency.smithyClient(rc) - .toDevDependency() - .withFeature("test-util") - .toType() - .resolve("test_connection::capture_request"), + "capture_request" to CargoDependency.smithyRuntimeTestUtil(rc).toType() + .resolve("client::http::test_util::capture_request"), "config" to ClientRustModule.config, "customParams" to customParams, ) - renderClientCreation(this, ClientCreationParams(codegenContext, "conn", "config_builder", "client")) + renderClientCreation(this, ClientCreationParams(codegenContext, "http_client", "config_builder", "client")) writeInline("let result = ") instantiator.renderFluentCall(this, "client", operationShape, inputShape, httpRequestTestCase.params) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index e53b66fc148..56be3c37785 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -17,9 +17,12 @@ import software.amazon.smithy.rust.codegen.core.testutil.integrationTest class HttpAuthDecoratorTest { private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( - "TestConnection" to CargoDependency.smithyClient(runtimeConfig) + "ReplayEvent" to CargoDependency.smithyRuntime(runtimeConfig) .toDevDependency().withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), + .resolve("client::http::test_util::ReplayEvent"), + "StaticReplayClient" to CargoDependency.smithyRuntime(runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("client::http::test_util::StaticReplayClient"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), ) @@ -34,25 +37,27 @@ class HttpAuthDecoratorTest { async fn use_api_key_auth_when_api_key_provided() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -63,26 +68,28 @@ class HttpAuthDecoratorTest { async fn use_basic_auth_when_basic_auth_login_provided() { use aws_smithy_runtime_api::client::identity::http::Login; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .basic_auth_login(Login::new("some-user", "some-pass", None)) .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -102,25 +109,27 @@ class HttpAuthDecoratorTest { async fn api_key_applied_to_query_string() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -140,26 +149,28 @@ class HttpAuthDecoratorTest { async fn api_key_applied_to_headers() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "ApiKey some-api-key") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "ApiKey some-api-key") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -179,26 +190,28 @@ class HttpAuthDecoratorTest { async fn basic_auth() { use aws_smithy_runtime_api::client::identity::http::Login; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .basic_auth_login(Login::new("some-user", "some-pass", None)) .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -218,26 +231,28 @@ class HttpAuthDecoratorTest { async fn basic_auth() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "Bearer some-token") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "Bearer some-token") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .bearer_token(Token::new("some-token", None)) .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -255,24 +270,26 @@ class HttpAuthDecoratorTest { rustTemplate( """ async fn optional_auth() { - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 1bcc30e0c3b..9010b946594 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -81,10 +81,10 @@ class MetadataCustomizationTest { let (tx, rx) = ::std::sync::mpsc::channel(); - let (conn, _captured_request) = #{capture_request}(#{None}); + let (http_client, _captured_request) = #{capture_request}(#{None}); let client_config = crate::config::Config::builder() .endpoint_resolver("http://localhost:1234/") - .http_connector(conn) + .http_client(http_client) .build(); let client = crate::client::Client::from_conf(client_config); let _ = client diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt index ec4d1521519..bf634170ca0 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -18,9 +17,6 @@ import software.amazon.smithy.rust.codegen.core.testutil.integrationTest class SensitiveOutputDecoratorTest { private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( "capture_request" to RuntimeType.captureRequest(runtimeConfig), - "TestConnection" to CargoDependency.smithyClient(runtimeConfig) - .toDevDependency().withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), ) @@ -56,7 +52,7 @@ class SensitiveOutputDecoratorTest { rustTemplate( """ async fn redacting_sensitive_response_body() { - let (conn, _r) = #{capture_request}(Some( + let (http_client, _r) = #{capture_request}(Some( http::Response::builder() .status(200) .body(#{SdkBody}::from("")) @@ -65,7 +61,7 @@ class SensitiveOutputDecoratorTest { let config = $moduleName::Config::builder() .endpoint_resolver("http://localhost:1234") - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); let _ = client.say_hello() diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index b55faa439f4..d57272b1490 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -10,7 +10,8 @@ import io.kotest.matchers.string.shouldContain import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest @@ -132,11 +133,11 @@ class EndpointsDecoratorTest { rustCrate.integrationTest("endpoint_params_test") { val moduleName = clientCodegenContext.moduleUseName() Attribute.TokioTest.render(this) - rust( + rustTemplate( """ async fn endpoint_params_are_set() { - use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::never::NeverConnector; + use #{NeverClient}; + use #{TokioSleep}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::endpoint::EndpointResolverParams; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -194,7 +195,7 @@ class EndpointsDecoratorTest { let interceptor = TestInterceptor::default(); let config = Config::builder() - .http_connector(NeverConnector::new()) + .http_client(NeverClient::new()) .interceptor(interceptor.clone()) .timeout_config( TimeoutConfig::builder() @@ -218,6 +219,10 @@ class EndpointsDecoratorTest { assert_eq!(format!("{}", err), "failed to construct request"); } """, + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(clientCodegenContext.runtimeConfig) + .toType().resolve("client::http::test_util::NeverClient"), + "TokioSleep" to CargoDependency.smithyAsync(clientCodegenContext.runtimeConfig) + .withFeature("rt-tokio").toType().resolve("rt::sleep::TokioSleep"), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 9534f7a79ea..e7a4ed760f3 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -90,16 +90,16 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { ) rustCrate.testModule { addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) - tokioTest("test_operation_overrides_http_connection") { + tokioTest("test_operation_overrides_http_client") { rustTemplate( """ use #{AsyncSleep}; - let (conn, captured_request) = #{capture_request}(#{None}); + let (http_client, captured_request) = #{capture_request}(#{None}); let expected_url = "http://localhost:1234/"; let client_config = crate::config::Config::builder() .endpoint_resolver(expected_url) - .http_connector(#{NeverConnector}::new()) + .http_client(#{NeverClient}::new()) .build(); let client = crate::client::Client::from_conf(client_config.clone()); let sleep = #{TokioSleep}::new(); @@ -120,7 +120,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { .customize() .await .unwrap() - .config_override(crate::config::Config::builder().http_connector(conn)) + .config_override(crate::config::Config::builder().http_client(http_client)) .send(); let timeout = #{Timeout}::new( @@ -144,11 +144,11 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { *codegenScope, "AsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::AsyncSleep"), "capture_request" to RuntimeType.captureRequest(runtimeConfig), - "NeverConnector" to RuntimeType.smithyClient(runtimeConfig) - .resolve("never::NeverConnector"), + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), "Timeout" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::timeout::Timeout"), - "TokioSleep" to RuntimeType.smithyAsync(runtimeConfig) - .resolve("rt::sleep::TokioSleep"), + "TokioSleep" to CargoDependency.smithyAsync(runtimeConfig).withFeature("rt-tokio") + .toType().resolve("rt::sleep::TokioSleep"), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index 430ff4737ed..3d1dcd009d7 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -160,7 +160,7 @@ internal class EndpointTraitBindingsTest { rustTemplate( """ async fn test_endpoint_prefix() { - use #{aws_smithy_client}::test_connection::capture_request; + use #{capture_request}; use aws_smithy_http::body::SdkBody; use aws_smithy_http::endpoint::EndpointPrefix; use aws_smithy_runtime_api::box_error::BoxError; @@ -202,7 +202,7 @@ internal class EndpointTraitBindingsTest { } } - let (conn, _r) = capture_request(Some( + let (http_client, _r) = capture_request(Some( http::Response::builder() .status(200) .body(SdkBody::from("")) @@ -210,7 +210,7 @@ internal class EndpointTraitBindingsTest { )); let interceptor = TestInterceptor::default(); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .interceptor(interceptor.clone()) .build(); let client = Client::from_conf(config); @@ -246,8 +246,8 @@ internal class EndpointTraitBindingsTest { ); } """, - "aws_smithy_client" to CargoDependency.smithyClient(clientCodegenContext.runtimeConfig) - .toDevDependency().withFeature("test-util").toType(), + "capture_request" to CargoDependency.smithyRuntimeTestUtil(clientCodegenContext.runtimeConfig) + .toType().resolve("client::http::test_util::capture_request"), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt index 8fb6bb888f3..2abb4229c8c 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt @@ -10,7 +10,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest @@ -44,20 +43,16 @@ class CustomizableOperationGeneratorTest { ##[test] fn test() { - let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() - .http_connector(connector.clone()) + .http_client(#{NeverClient}::new()) .endpoint_resolver("http://localhost:1234") .build(); let client = $moduleName::Client::from_conf(config); check_send_and_sync(client.say_hello().customize()); } """, - "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) - .toDevDependency() - .withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index 18399039692..048aa961a3c 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.util.lookup @@ -77,22 +76,16 @@ class FluentClientGeneratorTest { ##[test] fn test() { - let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(#{NeverClient}::new()) .build(); let client = $moduleName::Client::from_conf(config); check_send(client.say_hello().send()); } """, - "TestConnection" to software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.smithyClient( - codegenContext.runtimeConfig, - ) - .toDevDependency() - .withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), - "SdkBody" to software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.sdkBody(codegenContext.runtimeConfig), + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), ) } } @@ -107,10 +100,9 @@ class FluentClientGeneratorTest { """ ##[test] fn test() { - let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .http_client(#{NeverClient}::new()) .build(); let client = $moduleName::Client::from_conf(config); @@ -120,11 +112,8 @@ class FluentClientGeneratorTest { assert_eq!(*input.get_byte_value(), Some(4)); } """, - "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) - .toDevDependency() - .withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt index 332e331cb2d..64c7cae3ba8 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt @@ -58,7 +58,6 @@ class AwsQueryCompatibleTest { ##[cfg(test)] ##[#{tokio}::test] async fn should_parse_code_and_type_fields() { - use #{smithy_client}::test_connection::infallible_connection_fn; use aws_smithy_http::body::SdkBody; let response = |_: http::Request| { @@ -80,7 +79,7 @@ class AwsQueryCompatibleTest { }; let client = crate::Client::from_conf( crate::Config::builder() - .http_connector(infallible_connection_fn(response)) + .http_client(#{infallible_client_fn}(response)) .endpoint_url("http://localhost:1234") .build() ); @@ -92,8 +91,8 @@ class AwsQueryCompatibleTest { assert_eq!(Some("Sender"), error.meta().extra("type")); } """, - "smithy_client" to CargoDependency.smithyClient(context.runtimeConfig) - .toDevDependency().withFeature("test-util").toType(), + "infallible_client_fn" to CargoDependency.smithyRuntimeTestUtil(context.runtimeConfig) + .toType().resolve("client::http::test_util::infallible_client_fn"), "tokio" to CargoDependency.Tokio.toType(), ) } @@ -139,7 +138,6 @@ class AwsQueryCompatibleTest { ##[cfg(test)] ##[#{tokio}::test] async fn should_parse_code_from_payload() { - use #{smithy_client}::test_connection::infallible_connection_fn; use aws_smithy_http::body::SdkBody; let response = |_: http::Request| { @@ -157,7 +155,7 @@ class AwsQueryCompatibleTest { }; let client = crate::Client::from_conf( crate::Config::builder() - .http_connector(infallible_connection_fn(response)) + .http_client(#{infallible_client_fn}(response)) .endpoint_url("http://localhost:1234") .build() ); @@ -166,8 +164,8 @@ class AwsQueryCompatibleTest { assert_eq!(None, error.meta().extra("type")); } """, - "smithy_client" to CargoDependency.smithyClient(context.runtimeConfig) - .toDevDependency().withFeature("test-util").toType(), + "infallible_client_fn" to CargoDependency.smithyRuntimeTestUtil(context.runtimeConfig) + .toType().resolve("client::http::test_util::infallible_client_fn"), "tokio" to CargoDependency.Tokio.toType(), ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 73a5e9ebbe6..9dbb43f497e 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -298,6 +298,7 @@ data class CargoDependency( fun smithyQuery(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-query") fun smithyRuntime(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime") .withFeature("client") + fun smithyRuntimeTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntime(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime-api") .withFeature("client") fun smithyRuntimeApiTestUtil(runtimeConfig: RuntimeConfig) = diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index f7e463b0a7d..639964f762d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -476,8 +476,8 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) return smithyTypes(runtimeConfig).resolve("date_time::Format::$timestampFormat") } - fun captureRequest(runtimeConfig: RuntimeConfig) = - CargoDependency.smithyClientTestUtil(runtimeConfig).toType().resolve("test_connection::capture_request") + fun captureRequest(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType() + .resolve("client::http::test_util::capture_request") fun forInlineDependency(inlineDependency: InlineDependency) = RuntimeType("crate::${inlineDependency.name}", inlineDependency) diff --git a/examples/pokemon-service-common/Cargo.toml b/examples/pokemon-service-common/Cargo.toml index f2c86eee0e5..6a63045004f 100644 --- a/examples/pokemon-service-common/Cargo.toml +++ b/examples/pokemon-service-common/Cargo.toml @@ -16,12 +16,12 @@ tokio = { version = "1", default-features = false, features = ["time"] } tower = "0.4" # Local paths -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client" } +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } +aws-smithy-runtime-api = { path = "../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http" } aws-smithy-http-server = { path = "../../rust-runtime/aws-smithy-http-server" } pokemon-service-client = { path = "../pokemon-service-client" } pokemon-service-server-sdk = { path = "../pokemon-service-server-sdk" } [dev-dependencies] -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client", features = ["test-util"] } aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["test-util"] } diff --git a/examples/pokemon-service-common/src/lib.rs b/examples/pokemon-service-common/src/lib.rs index cb5c4bd604a..be15b071176 100644 --- a/examples/pokemon-service-common/src/lib.rs +++ b/examples/pokemon-service-common/src/lib.rs @@ -15,15 +15,15 @@ use std::{ }; use async_stream::stream; -use aws_smithy_client::{conns, hyper_ext::Adapter}; use aws_smithy_http::{body::SdkBody, byte_stream::ByteStream}; use aws_smithy_http_server::Extension; +use aws_smithy_runtime::client::http::hyper_014::HyperConnector; +use aws_smithy_runtime_api::client::http::HttpConnector; use http::Uri; use pokemon_service_server_sdk::{ error, input, model, model::CapturingPayload, output, types::Blob, }; use rand::{seq::SliceRandom, Rng}; -use tower::Service; use tracing_subscriber::{prelude::*, EnvFilter}; const PIKACHU_ENGLISH_FLAVOR_TEXT: &str = @@ -326,7 +326,7 @@ pub async fn stream_pokemon_radio( .parse::() .expect("Invalid url in `RADIO_STREAMS`"); - let mut connector = Adapter::builder().build(conns::https()); + let connector = HyperConnector::builder().build_https(); let result = connector .call( http::Request::builder() diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index fb5f0fb4d76..35d3ba5fe28 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -14,7 +14,7 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, IdentityPlugin, Plugin}; use tower::{Layer, Service}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; use pokemon_service_client::{Client, Config}; use pokemon_service_common::do_nothing; @@ -46,9 +46,9 @@ async fn plugin_layers_are_executed_in_registration_order() { .build_unchecked(); let request = { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .endpoint_url("http://localhost:1234") .build(); Client::from_conf(config).do_nothing().send().await.unwrap(); diff --git a/examples/pokemon-service-tls/Cargo.toml b/examples/pokemon-service-tls/Cargo.toml index 9f11a904fc8..566afcfc0a7 100644 --- a/examples/pokemon-service-tls/Cargo.toml +++ b/examples/pokemon-service-tls/Cargo.toml @@ -31,7 +31,7 @@ hyper-rustls = { version = "0.24", features = ["http2"] } hyper-tls = { version = "0.5" } # Local paths -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client/", features = ["rustls"] } aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } pokemon-service-client = { path = "../pokemon-service-client/" } diff --git a/examples/pokemon-service-tls/tests/common/mod.rs b/examples/pokemon-service-tls/tests/common/mod.rs index 0d69407cf73..a13c2e60ee3 100644 --- a/examples/pokemon-service-tls/tests/common/mod.rs +++ b/examples/pokemon-service-tls/tests/common/mod.rs @@ -6,7 +6,7 @@ use std::{fs::File, io::BufReader, process::Command, time::Duration}; use assert_cmd::prelude::*; -use aws_smithy_client::hyper_ext::Adapter; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use tokio::time::sleep; use pokemon_service_client::{Client, Config}; @@ -44,7 +44,7 @@ pub fn client_http2_only() -> Client { .build(); let config = Config::builder() - .http_connector(Adapter::builder().build(connector)) + .http_client(HyperClientBuilder::new().build(connector)) .endpoint_url(format!("https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) .build(); Client::from_conf(config) @@ -74,7 +74,7 @@ fn native_tls_connector() -> NativeTlsConnector { pub fn native_tls_client() -> Client { let config = Config::builder() - .http_connector(Adapter::builder().build(native_tls_connector())) + .http_client(HyperClientBuilder::new().build(native_tls_connector())) .endpoint_url(format!("https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) .build(); Client::from_conf(config) diff --git a/examples/python/pokemon-service-test/Cargo.toml b/examples/python/pokemon-service-test/Cargo.toml index b4084185c25..a7960c24e48 100644 --- a/examples/python/pokemon-service-test/Cargo.toml +++ b/examples/python/pokemon-service-test/Cargo.toml @@ -17,7 +17,7 @@ tokio-rustls = "0.24.0" hyper-rustls = { version = "0.24", features = ["http2"] } # Local paths -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client/", features = ["rustls"] } +aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime/", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http/" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types/" } pokemon-service-client = { path = "../pokemon-service-client/" } diff --git a/examples/python/pokemon-service-test/tests/helpers.rs b/examples/python/pokemon-service-test/tests/helpers.rs index 708e17fe883..53064e34024 100644 --- a/examples/python/pokemon-service-test/tests/helpers.rs +++ b/examples/python/pokemon-service-test/tests/helpers.rs @@ -8,7 +8,7 @@ use std::io::BufReader; use std::process::Command; use std::time::Duration; -use aws_smithy_client::hyper_ext::Adapter; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use command_group::{CommandGroup, GroupChild}; use pokemon_service_client::{Client, Config}; use tokio::time; @@ -102,7 +102,7 @@ pub fn http2_client() -> PokemonClient { let mut roots = tokio_rustls::rustls::RootCertStore::empty(); roots.add_parsable_certificates(&certs); - let connector = hyper_rustls::HttpsConnectorBuilder::new() + let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() .with_tls_config( tokio_rustls::rustls::ClientConfig::builder() .with_safe_defaults() @@ -115,7 +115,7 @@ pub fn http2_client() -> PokemonClient { let base_url = PokemonServiceVariant::Http2.base_url(); let config = Config::builder() - .http_connector(Adapter::builder().build(connector)) + .http_client(HyperClientBuilder::new().build(tls_connector)) .endpoint_url(base_url) .build(); Client::from_conf(config) diff --git a/rust-runtime/aws-smithy-async/Cargo.toml b/rust-runtime/aws-smithy-async/Cargo.toml index fd51b4fb1e5..12e72c4fea4 100644 --- a/rust-runtime/aws-smithy-async/Cargo.toml +++ b/rust-runtime/aws-smithy-async/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/awslabs/smithy-rs" [features] rt-tokio = ["tokio/time"] -test-util = [] +test-util = ["rt-tokio"] [dependencies] pin-project-lite = "0.2" diff --git a/rust-runtime/aws-smithy-async/src/future/mod.rs b/rust-runtime/aws-smithy-async/src/future/mod.rs index 44894e07338..d60fc46c772 100644 --- a/rust-runtime/aws-smithy-async/src/future/mod.rs +++ b/rust-runtime/aws-smithy-async/src/future/mod.rs @@ -5,8 +5,14 @@ //! Useful runtime-agnostic future implementations. +use futures_util::Future; +use std::pin::Pin; + pub mod never; pub mod now_or_later; pub mod pagination_stream; pub mod rendezvous; pub mod timeout; + +/// A boxed future that outputs a `Result`. +pub type BoxFuture = Pin> + Send>>; diff --git a/rust-runtime/aws-smithy-async/src/test_util.rs b/rust-runtime/aws-smithy-async/src/test_util.rs index e323478d846..dd7eacfd895 100644 --- a/rust-runtime/aws-smithy-async/src/test_util.rs +++ b/rust-runtime/aws-smithy-async/src/test_util.rs @@ -22,7 +22,6 @@ pub struct ManualTimeSource { log: Arc>>, } -#[cfg(feature = "test-util")] impl ManualTimeSource { /// Get the number of seconds since the UNIX Epoch as an f64. /// @@ -139,6 +138,13 @@ impl InstantSleep { Self { log } } + /// Create an `InstantSleep` without passing in a shared log. + pub fn unlogged() -> Self { + Self { + log: Default::default(), + } + } + /// Return the sleep durations that were logged by this `InstantSleep`. pub fn logs(&self) -> Vec { self.log.lock().unwrap().iter().cloned().collect() diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index 9f8a05686eb..2afc2546c56 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +pub mod dns; + pub mod endpoint; /// Smithy identity used by auth and signing. @@ -20,6 +22,6 @@ pub mod runtime_plugin; pub mod auth; -pub mod connectors; +pub mod http; pub mod ser_de; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs deleted file mode 100644 index 9399fa05bff..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Smithy connectors and related code. -//! -//! # What is a connector? -//! -//! When we talk about connectors, we are referring to the [`HttpConnector`] trait, and implementations of -//! that trait. This trait simply takes a HTTP request, and returns a future with the response for that -//! request. -//! -//! This is slightly different from what a connector is in other libraries such as -//! [`hyper`](https://crates.io/crates/hyper). In hyper 0.x, the connector is a -//! [`tower`](https://crates.io/crates/tower) `Service` that takes a `Uri` and returns -//! a future with something that implements `AsyncRead + AsyncWrite`. -//! -//! The [`HttpConnector`](crate::client::connectors::HttpConnector) is designed to be a layer on top of -//! whole HTTP libraries, such as hyper, which allows Smithy clients to be agnostic to the underlying HTTP -//! transport layer. This also makes it easy to write tests with a fake HTTP connector, and several -//! such test connector implementations are availble in [`aws-smithy-runtime`](https://crates.io/crates/aws-smithy-runtime). -//! -//! # Responsibilities of a connector -//! -//! A connector primarily makes HTTP requests, but can also be used to implement connect and read -//! timeouts. The `HyperConnector` in [`aws-smithy-runtime`](https://crates.io/crates/aws-smithy-runtime) -//! is an example where timeouts are implemented as part of the connector. -//! -//! Connectors are also responsible for DNS lookup, TLS, connection reuse, pooling, and eviction. -//! The Smithy clients have no knowledge of such concepts. - -use crate::client::orchestrator::{HttpRequest, HttpResponse}; -use crate::impl_shared_conversions; -use aws_smithy_async::future::now_or_later::NowOrLater; -use aws_smithy_http::result::ConnectorError; -use pin_project_lite::pin_project; -use std::fmt; -use std::future::Future as StdFuture; -use std::pin::Pin; -use std::sync::Arc; -use std::task::Poll; - -type BoxFuture = Pin> + Send>>; - -pin_project! { - /// Future for [`HttpConnector::call`]. - pub struct HttpConnectorFuture { - #[pin] - inner: NowOrLater, BoxFuture>, - } -} - -impl HttpConnectorFuture { - /// Create a new `HttpConnectorFuture` with the given future. - pub fn new(future: F) -> Self - where - F: StdFuture> + Send + 'static, - { - Self { - inner: NowOrLater::new(Box::pin(future)), - } - } - - /// Create a new `HttpConnectorFuture` with the given boxed future. - /// - /// Use this if you already have a boxed future to avoid double boxing it. - pub fn new_boxed( - future: Pin> + Send>>, - ) -> Self { - Self { - inner: NowOrLater::new(future), - } - } - - /// Create a `HttpConnectorFuture` that is immediately ready with the given result. - pub fn ready(result: Result) -> Self { - Self { - inner: NowOrLater::ready(result), - } - } -} - -impl StdFuture for HttpConnectorFuture { - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll { - let this = self.project(); - this.inner.poll(cx) - } -} - -/// Trait with a `call` function that asynchronously converts a request into a response. -/// -/// Ordinarily, a connector would use an underlying HTTP library such as [hyper](https://crates.io/crates/hyper), -/// and any associated HTTPS implementation alongside it to service requests. -/// -/// However, it can also be useful to create fake connectors implementing this trait -/// for testing. -pub trait HttpConnector: Send + Sync + fmt::Debug { - /// Asynchronously converts a request into a response. - fn call(&self, request: HttpRequest) -> HttpConnectorFuture; -} - -/// A shared [`HttpConnector`] implementation. -#[derive(Clone, Debug)] -pub struct SharedHttpConnector(Arc); - -impl SharedHttpConnector { - /// Returns a new [`SharedHttpConnector`]. - pub fn new(connection: impl HttpConnector + 'static) -> Self { - Self(Arc::new(connection)) - } -} - -impl HttpConnector for SharedHttpConnector { - fn call(&self, request: HttpRequest) -> HttpConnectorFuture { - (*self.0).call(request) - } -} - -impl_shared_conversions!(convert SharedHttpConnector from HttpConnector using SharedHttpConnector::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs b/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs new file mode 100644 index 00000000000..f7dbadec60d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs @@ -0,0 +1,107 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Interfaces for resolving DNS + +use crate::box_error::BoxError; +use crate::impl_shared_conversions; +use aws_smithy_async::future::now_or_later::NowOrLater; +use std::error::Error as StdError; +use std::fmt; +use std::future::Future; +use std::net::IpAddr; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll}; + +/// Error that occurs when failing to perform a DNS lookup. +#[derive(Debug)] +pub struct ResolveDnsError { + source: BoxError, +} + +impl ResolveDnsError { + /// Creates a new `DnsLookupFailed` error. + pub fn new(source: impl Into) -> Self { + ResolveDnsError { + source: source.into(), + } + } +} + +impl fmt::Display for ResolveDnsError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "failed to perform DNS lookup") + } +} + +impl StdError for ResolveDnsError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + Some(&*self.source as _) + } +} + +type BoxFuture = aws_smithy_async::future::BoxFuture; + +/// New-type for the future returned by the [`DnsResolver`] trait. +pub struct DnsFuture(NowOrLater, ResolveDnsError>, BoxFuture>>); +impl DnsFuture { + /// Create a new `DnsFuture` + pub fn new( + future: impl Future, ResolveDnsError>> + Send + 'static, + ) -> Self { + Self(NowOrLater::new(Box::pin(future))) + } + + /// Create a `DnsFuture` that is immediately ready + pub fn ready(result: Result, ResolveDnsError>) -> Self { + Self(NowOrLater::ready(result)) + } +} +impl Future for DnsFuture { + type Output = Result, ResolveDnsError>; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let mut this = self.as_mut(); + let inner = Pin::new(&mut this.0); + Future::poll(inner, cx) + } +} + +/// Trait for resolving domain names +pub trait DnsResolver: fmt::Debug + Send + Sync { + /// Asynchronously resolve the given domain name + fn resolve_dns(&self, name: String) -> DnsFuture; +} + +/// Shared DNS resolver +#[derive(Clone, Debug)] +pub struct SharedDnsResolver(Arc); + +impl SharedDnsResolver { + /// Create a new `SharedDnsResolver`. + pub fn new(resolver: impl DnsResolver + 'static) -> Self { + Self(Arc::new(resolver)) + } +} + +impl DnsResolver for SharedDnsResolver { + fn resolve_dns(&self, name: String) -> DnsFuture { + self.0.resolve_dns(name) + } +} + +impl_shared_conversions!(convert SharedDnsResolver from DnsResolver using SharedDnsResolver::new); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn check_send() { + fn is_send() {} + is_send::(); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs new file mode 100644 index 00000000000..5347f71247a --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -0,0 +1,308 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! HTTP clients and connectors +//! +//! # What is a connector? +//! +//! When we talk about connectors, we are referring to the [`HttpConnector`] trait, and implementations of +//! that trait. This trait simply takes a HTTP request, and returns a future with the response for that +//! request. +//! +//! This is slightly different from what a connector is in other libraries such as +//! [`hyper`]. In hyper 0.x, the connector is a [`tower`] `Service` that takes a `Uri` and returns +//! a future with something that implements `AsyncRead + AsyncWrite`. +//! +//! The [`HttpConnector`] is designed to be a layer on top of +//! whole HTTP libraries, such as hyper, which allows Smithy clients to be agnostic to the underlying HTTP +//! transport layer. This also makes it easy to write tests with a fake HTTP connector, and several +//! such test connector implementations are available in [`aws-smithy-runtime`] +//! with the `test-util` feature enabled. +//! +//! # Responsibilities of a connector +//! +//! A connector primarily makes HTTP requests, but is also the place where connect and read timeouts are +//! implemented. The `HyperConnector` in [`aws-smithy-runtime`] is an example where timeouts are implemented +//! as part of the connector. +//! +//! Connectors are also responsible for DNS lookup, TLS, connection reuse, pooling, and eviction. +//! The Smithy clients have no knowledge of such concepts. +//! +//! # The [`HttpClient`] trait +//! +//! Connectors allow us to make requests, but we need a layer on top of connectors so that we can handle +//! varying connector settings. For example, say we configure some default HTTP connect/read timeouts on +//! Client, and then configure some override connect/read timeouts for a specific operation. These timeouts +//! ultimately are part of the connector, so the same connector can't be reused for the two different sets +//! of timeouts. Thus, the [`HttpClient`] implementation is responsible for managing multiple connectors +//! with varying config. Some example configs that can impact which connector is used: +//! +//! - HTTP protocol versions +//! - TLS settings +//! - Timeouts +//! +//! Some of these aren't implemented yet, but they will appear in the [`HttpConnectorSettings`] struct +//! once they are. +//! +//! [`hyper`]: https://crates.io/crates/hyper +//! [`tower`]: https://crates.io/crates/tower +//! [`aws-smithy-runtime`]: https://crates.io/crates/aws-smithy-runtime + +use crate::client::orchestrator::{HttpRequest, HttpResponse}; +use crate::client::runtime_components::RuntimeComponents; +use crate::impl_shared_conversions; +use aws_smithy_async::future::now_or_later::NowOrLater; +use aws_smithy_http::result::ConnectorError; +use pin_project_lite::pin_project; +use std::fmt; +use std::future::Future as StdFuture; +use std::pin::Pin; +use std::sync::Arc; +use std::task::Poll; +use std::time::Duration; + +type BoxFuture = aws_smithy_async::future::BoxFuture; + +pin_project! { + /// Future for [`HttpConnector::call`]. + pub struct HttpConnectorFuture { + #[pin] + inner: NowOrLater, BoxFuture>, + } +} + +impl HttpConnectorFuture { + /// Create a new `HttpConnectorFuture` with the given future. + pub fn new(future: F) -> Self + where + F: StdFuture> + Send + 'static, + { + Self { + inner: NowOrLater::new(Box::pin(future)), + } + } + + /// Create a new `HttpConnectorFuture` with the given boxed future. + /// + /// Use this if you already have a boxed future to avoid double boxing it. + pub fn new_boxed( + future: Pin> + Send>>, + ) -> Self { + Self { + inner: NowOrLater::new(future), + } + } + + /// Create a `HttpConnectorFuture` that is immediately ready with the given result. + pub fn ready(result: Result) -> Self { + Self { + inner: NowOrLater::ready(result), + } + } +} + +impl StdFuture for HttpConnectorFuture { + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll { + let this = self.project(); + this.inner.poll(cx) + } +} + +/// Trait with a `call` function that asynchronously converts a request into a response. +/// +/// Ordinarily, a connector would use an underlying HTTP library such as [hyper](https://crates.io/crates/hyper), +/// and any associated HTTPS implementation alongside it to service requests. +/// +/// However, it can also be useful to create fake/mock connectors implementing this trait +/// for testing. +pub trait HttpConnector: Send + Sync + fmt::Debug { + /// Asynchronously converts a request into a response. + fn call(&self, request: HttpRequest) -> HttpConnectorFuture; +} + +/// A shared [`HttpConnector`] implementation. +#[derive(Clone, Debug)] +pub struct SharedHttpConnector(Arc); + +impl SharedHttpConnector { + /// Returns a new [`SharedHttpConnector`]. + pub fn new(connection: impl HttpConnector + 'static) -> Self { + Self(Arc::new(connection)) + } +} + +impl HttpConnector for SharedHttpConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + (*self.0).call(request) + } +} + +impl_shared_conversions!(convert SharedHttpConnector from HttpConnector using SharedHttpConnector::new); + +/// Returns a [`SharedHttpClient`] that calls the given `connector` function to select a HTTP connector. +pub fn http_client_fn(connector: F) -> SharedHttpClient +where + F: Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector + + Send + + Sync + + 'static, +{ + struct ConnectorFn(T); + impl fmt::Debug for ConnectorFn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("ConnectorFn") + } + } + impl HttpClient for ConnectorFn + where + T: (Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector) + Send + Sync, + { + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector { + (self.0)(settings, components) + } + } + + SharedHttpClient::new(ConnectorFn(connector)) +} + +/// HTTP client abstraction. +/// +/// A HTTP client implementation must apply connect/read timeout settings, +/// and must maintain a connection pool. +pub trait HttpClient: Send + Sync + fmt::Debug { + /// Returns a HTTP connector based on the requested connector settings. + /// + /// The settings include connector timeouts, which should be incorporated + /// into the connector. The `HttpClient` is responsible for caching + /// the connector across requests. + /// + /// In the future, the settings may have additional parameters added, + /// such as HTTP version, or TLS certificate paths. + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector; +} + +/// Shared HTTP client for use across multiple clients and requests. +#[derive(Clone, Debug)] +pub struct SharedHttpClient { + selector: Arc, +} + +impl SharedHttpClient { + /// Creates a new `SharedHttpClient` + pub fn new(selector: impl HttpClient + 'static) -> Self { + Self { + selector: Arc::new(selector), + } + } +} + +impl HttpClient for SharedHttpClient { + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector { + self.selector.http_connector(settings, components) + } +} + +impl_shared_conversions!(convert SharedHttpClient from HttpClient using SharedHttpClient::new); + +/// Builder for [`HttpConnectorSettings`]. +#[non_exhaustive] +#[derive(Default, Debug)] +pub struct HttpConnectorSettingsBuilder { + connect_timeout: Option, + read_timeout: Option, +} + +impl HttpConnectorSettingsBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Default::default() + } + + /// Sets the connect timeout that should be used. + /// + /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. + pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self { + self.connect_timeout = Some(connect_timeout); + self + } + + /// Sets the connect timeout that should be used. + /// + /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. + pub fn set_connect_timeout(&mut self, connect_timeout: Option) -> &mut Self { + self.connect_timeout = connect_timeout; + self + } + + /// Sets the read timeout that should be used. + /// + /// The read timeout is the limit on the amount of time it takes to read the first byte of a response + /// from the time the request is initiated. + pub fn read_timeout(mut self, read_timeout: Duration) -> Self { + self.read_timeout = Some(read_timeout); + self + } + + /// Sets the read timeout that should be used. + /// + /// The read timeout is the limit on the amount of time it takes to read the first byte of a response + /// from the time the request is initiated. + pub fn set_read_timeout(&mut self, read_timeout: Option) -> &mut Self { + self.read_timeout = read_timeout; + self + } + + /// Builds the [`HttpConnectorSettings`]. + pub fn build(self) -> HttpConnectorSettings { + HttpConnectorSettings { + connect_timeout: self.connect_timeout, + read_timeout: self.read_timeout, + } + } +} + +/// Settings for HTTP Connectors +#[non_exhaustive] +#[derive(Clone, Default, Debug)] +pub struct HttpConnectorSettings { + connect_timeout: Option, + read_timeout: Option, +} + +impl HttpConnectorSettings { + /// Returns a builder for `HttpConnectorSettings`. + pub fn builder() -> HttpConnectorSettingsBuilder { + Default::default() + } + + /// Returns the connect timeout that should be used. + /// + /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. + pub fn connect_timeout(&self) -> Option { + self.connect_timeout + } + + /// Returns the read timeout that should be used. + /// + /// The read timeout is the limit on the amount of time it takes to read the first byte of a response + /// from the time the request is initiated. + pub fn read_timeout(&self) -> Option { + self.read_timeout + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index a034515562f..328117648c9 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -27,8 +27,6 @@ use aws_smithy_types::config_bag::{Storable, StoreReplace}; use bytes::Bytes; use std::error::Error as StdError; use std::fmt; -use std::future::Future as StdFuture; -use std::pin::Pin; /// Type alias for the HTTP request type that the orchestrator uses. pub type HttpRequest = http::Request; @@ -40,7 +38,7 @@ pub type HttpResponse = http::Response; /// /// See [the Rust blog](https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html) for /// more information on async functions in traits. -pub type BoxFuture = Pin> + Send>>; +pub type BoxFuture = aws_smithy_async::future::BoxFuture; /// Type alias for futures that are returned from several traits since async trait functions are not stable yet (as of 2023-07-21). /// diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 4a92ec6988d..0f12d407a52 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -12,16 +12,19 @@ //! [`RuntimeComponents`](RuntimeComponents). use crate::client::auth::{ - AuthScheme, AuthSchemeId, SharedAuthScheme, SharedAuthSchemeOptionResolver, + AuthScheme, AuthSchemeId, AuthSchemeOptionResolver, SharedAuthScheme, + SharedAuthSchemeOptionResolver, }; -use crate::client::connectors::SharedHttpConnector; -use crate::client::endpoint::SharedEndpointResolver; -use crate::client::identity::{ConfiguredIdentityResolver, SharedIdentityResolver}; -use crate::client::interceptors::SharedInterceptor; -use crate::client::retries::{RetryClassifiers, SharedRetryStrategy}; +use crate::client::endpoint::{EndpointResolver, SharedEndpointResolver}; +use crate::client::http::{HttpClient, SharedHttpClient}; +use crate::client::identity::{ + ConfiguredIdentityResolver, IdentityResolver, SharedIdentityResolver, +}; +use crate::client::interceptors::{Interceptor, SharedInterceptor}; +use crate::client::retries::{RetryClassifiers, RetryStrategy, SharedRetryStrategy}; use crate::shared::IntoShared; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use std::fmt; pub(crate) static EMPTY_RUNTIME_COMPONENTS_BUILDER: RuntimeComponentsBuilder = @@ -184,7 +187,7 @@ declare_runtime_components! { auth_scheme_option_resolver: Option, // A connector is not required since a client could technically only be used for presigning - http_connector: Option, + http_client: Option, #[required] endpoint_resolver: Option, @@ -219,9 +222,9 @@ impl RuntimeComponents { self.auth_scheme_option_resolver.value.clone() } - /// Returns the connector. - pub fn http_connector(&self) -> Option { - self.http_connector.as_ref().map(|s| s.value.clone()) + /// Returns the HTTP client. + pub fn http_client(&self) -> Option { + self.http_client.as_ref().map(|s| s.value.clone()) } /// Returns the endpoint resolver. @@ -274,7 +277,7 @@ impl RuntimeComponentsBuilder { /// Sets the auth scheme option resolver. pub fn set_auth_scheme_option_resolver( &mut self, - auth_scheme_option_resolver: Option>, + auth_scheme_option_resolver: Option, ) -> &mut Self { self.auth_scheme_option_resolver = auth_scheme_option_resolver.map(|r| Tracked::new(self.builder_name, r.into_shared())); @@ -284,32 +287,26 @@ impl RuntimeComponentsBuilder { /// Sets the auth scheme option resolver. pub fn with_auth_scheme_option_resolver( mut self, - auth_scheme_option_resolver: Option>, + auth_scheme_option_resolver: Option, ) -> Self { self.set_auth_scheme_option_resolver(auth_scheme_option_resolver); self } - /// Returns the HTTP connector. - pub fn http_connector(&self) -> Option { - self.http_connector.as_ref().map(|s| s.value.clone()) + /// Returns the HTTP client. + pub fn http_client(&self) -> Option { + self.http_client.as_ref().map(|s| s.value.clone()) } - /// Sets the HTTP connector. - pub fn set_http_connector( - &mut self, - connector: Option>, - ) -> &mut Self { - self.http_connector = connector.map(|c| Tracked::new(self.builder_name, c.into_shared())); + /// Sets the HTTP client. + pub fn set_http_client(&mut self, connector: Option) -> &mut Self { + self.http_client = connector.map(|c| Tracked::new(self.builder_name, c.into_shared())); self } - /// Sets the HTTP connector. - pub fn with_http_connector( - mut self, - connector: Option>, - ) -> Self { - self.set_http_connector(connector); + /// Sets the HTTP client. + pub fn with_http_client(mut self, connector: Option) -> Self { + self.set_http_client(connector); self } @@ -321,7 +318,7 @@ impl RuntimeComponentsBuilder { /// Sets the endpoint resolver. pub fn set_endpoint_resolver( &mut self, - endpoint_resolver: Option>, + endpoint_resolver: Option, ) -> &mut Self { self.endpoint_resolver = endpoint_resolver.map(|s| Tracked::new(self.builder_name, s.into_shared())); @@ -331,7 +328,7 @@ impl RuntimeComponentsBuilder { /// Sets the endpoint resolver. pub fn with_endpoint_resolver( mut self, - endpoint_resolver: Option>, + endpoint_resolver: Option, ) -> Self { self.set_endpoint_resolver(endpoint_resolver); self @@ -343,17 +340,14 @@ impl RuntimeComponentsBuilder { } /// Adds an auth scheme. - pub fn push_auth_scheme( - &mut self, - auth_scheme: impl IntoShared, - ) -> &mut Self { + pub fn push_auth_scheme(&mut self, auth_scheme: impl AuthScheme + 'static) -> &mut Self { self.auth_schemes .push(Tracked::new(self.builder_name, auth_scheme.into_shared())); self } /// Adds an auth scheme. - pub fn with_auth_scheme(mut self, auth_scheme: impl IntoShared) -> Self { + pub fn with_auth_scheme(mut self, auth_scheme: impl AuthScheme + 'static) -> Self { self.push_auth_scheme(auth_scheme); self } @@ -362,7 +356,7 @@ impl RuntimeComponentsBuilder { pub fn push_identity_resolver( &mut self, scheme_id: AuthSchemeId, - identity_resolver: impl IntoShared, + identity_resolver: impl IdentityResolver + 'static, ) -> &mut Self { self.identity_resolvers.push(Tracked::new( self.builder_name, @@ -375,7 +369,7 @@ impl RuntimeComponentsBuilder { pub fn with_identity_resolver( mut self, scheme_id: AuthSchemeId, - identity_resolver: impl IntoShared, + identity_resolver: impl IdentityResolver + 'static, ) -> Self { self.push_identity_resolver(scheme_id, identity_resolver); self @@ -397,17 +391,14 @@ impl RuntimeComponentsBuilder { } /// Adds an interceptor. - pub fn push_interceptor( - &mut self, - interceptor: impl IntoShared, - ) -> &mut Self { + pub fn push_interceptor(&mut self, interceptor: impl Interceptor + 'static) -> &mut Self { self.interceptors .push(Tracked::new(self.builder_name, interceptor.into_shared())); self } /// Adds an interceptor. - pub fn with_interceptor(mut self, interceptor: impl IntoShared) -> Self { + pub fn with_interceptor(mut self, interceptor: impl Interceptor + 'static) -> Self { self.push_interceptor(interceptor); self } @@ -460,7 +451,7 @@ impl RuntimeComponentsBuilder { /// Sets the retry strategy. pub fn set_retry_strategy( &mut self, - retry_strategy: Option>, + retry_strategy: Option, ) -> &mut Self { self.retry_strategy = retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared())); @@ -470,7 +461,7 @@ impl RuntimeComponentsBuilder { /// Sets the retry strategy. pub fn with_retry_strategy( mut self, - retry_strategy: Option>, + retry_strategy: Option, ) -> Self { self.retry_strategy = retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared())); @@ -489,8 +480,8 @@ impl RuntimeComponentsBuilder { } /// Sets the async sleep implementation. - pub fn with_sleep_impl(mut self, sleep_impl: Option) -> Self { - self.sleep_impl = sleep_impl.map(|s| Tracked::new(self.builder_name, s)); + pub fn with_sleep_impl(mut self, sleep_impl: Option) -> Self { + self.sleep_impl = sleep_impl.map(|s| Tracked::new(self.builder_name, s.into_shared())); self } @@ -506,8 +497,8 @@ impl RuntimeComponentsBuilder { } /// Sets the time source. - pub fn with_time_source(mut self, time_source: Option) -> Self { - self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s)); + pub fn with_time_source(mut self, time_source: Option) -> Self { + self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s.into_shared())); self } } @@ -532,15 +523,9 @@ impl RuntimeComponentsBuilder { /// Creates a runtime components builder with all the required components filled in with fake (panicking) implementations. #[cfg(feature = "test-util")] pub fn for_tests() -> Self { - use crate::client::auth::AuthSchemeOptionResolver; - use crate::client::connectors::{HttpConnector, HttpConnectorFuture}; - use crate::client::endpoint::{EndpointResolver, EndpointResolverParams}; + use crate::client::endpoint::EndpointResolverParams; use crate::client::identity::Identity; - use crate::client::identity::IdentityResolver; - use crate::client::orchestrator::{Future, HttpRequest}; - use crate::client::retries::RetryStrategy; - use aws_smithy_async::rt::sleep::AsyncSleep; - use aws_smithy_async::time::TimeSource; + use crate::client::orchestrator::Future; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::endpoint::Endpoint; @@ -557,10 +542,14 @@ impl RuntimeComponentsBuilder { } #[derive(Debug)] - struct FakeConnector; - impl HttpConnector for FakeConnector { - fn call(&self, _: HttpRequest) -> HttpConnectorFuture { - unreachable!("fake connector must be overridden for this test") + struct FakeClient; + impl HttpClient for FakeClient { + fn http_connector( + &self, + _: &crate::client::http::HttpConnectorSettings, + _: &RuntimeComponents, + ) -> crate::client::http::SharedHttpConnector { + unreachable!("fake client must be overridden for this test") } } @@ -642,7 +631,7 @@ impl RuntimeComponentsBuilder { .with_auth_scheme(FakeAuthScheme) .with_auth_scheme_option_resolver(Some(FakeAuthSchemeOptionResolver)) .with_endpoint_resolver(Some(FakeEndpointResolver)) - .with_http_connector(Some(FakeConnector)) + .with_http_client(Some(FakeClient)) .with_identity_resolver(AuthSchemeId::new("fake"), FakeIdentityResolver) .with_retry_classifiers(Some(RetryClassifiers::new())) .with_retry_strategy(Some(FakeRetryStrategy)) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 34548c0ab71..56596a60871 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -240,13 +240,21 @@ impl RuntimePlugins { Default::default() } - pub fn with_client_plugin(mut self, plugin: impl IntoShared) -> Self { - insert_plugin!(self.client_plugins, plugin.into_shared()); + /// Adds a client-level runtime plugin. + pub fn with_client_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { + insert_plugin!( + self.client_plugins, + IntoShared::::into_shared(plugin) + ); self } - pub fn with_operation_plugin(mut self, plugin: impl IntoShared) -> Self { - insert_plugin!(self.operation_plugins, plugin.into_shared()); + /// Adds an operation-level runtime plugin. + pub fn with_operation_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { + insert_plugin!( + self.operation_plugins, + IntoShared::::into_shared(plugin) + ); self } @@ -265,13 +273,16 @@ impl RuntimePlugins { } } -#[cfg(test)] +#[cfg(all(test, feature = "test-util"))] mod tests { use super::{RuntimePlugin, RuntimePlugins}; - use crate::client::connectors::{HttpConnector, HttpConnectorFuture, SharedHttpConnector}; + use crate::client::http::{ + http_client_fn, HttpClient, HttpConnector, HttpConnectorFuture, SharedHttpConnector, + }; use crate::client::orchestrator::HttpRequest; use crate::client::runtime_components::RuntimeComponentsBuilder; use crate::client::runtime_plugin::{Order, SharedRuntimePlugin}; + use crate::shared::IntoShared; use aws_smithy_http::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use http::HeaderValue; @@ -392,7 +403,7 @@ mod tests { ) -> Cow<'_, RuntimeComponentsBuilder> { Cow::Owned( RuntimeComponentsBuilder::new("Plugin1") - .with_http_connector(Some(SharedHttpConnector::new(Connector1))), + .with_http_client(Some(http_client_fn(|_, _| Connector1.into_shared()))), ) } } @@ -409,11 +420,13 @@ mod tests { &self, current_components: &RuntimeComponentsBuilder, ) -> Cow<'_, RuntimeComponentsBuilder> { + let current = current_components.http_client().unwrap(); Cow::Owned( - RuntimeComponentsBuilder::new("Plugin2").with_http_connector(Some( - SharedHttpConnector::new(Connector2( - current_components.http_connector().unwrap(), - )), + RuntimeComponentsBuilder::new("Plugin2").with_http_client(Some( + http_client_fn(move |settings, components| { + let connector = current.http_connector(settings, components); + SharedHttpConnector::new(Connector2(connector)) + }), )), ) } @@ -426,11 +439,13 @@ mod tests { .with_client_plugin(Plugin1); let mut cfg = ConfigBag::base(); let components = plugins.apply_client_configuration(&mut cfg).unwrap(); + let fake_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); // Use the resulting HTTP connector to make a response let resp = components - .http_connector() + .http_client() .unwrap() + .http_connector(&Default::default(), &fake_components) .call( http::Request::builder() .method("GET") diff --git a/rust-runtime/aws-smithy-runtime-api/src/shared.rs b/rust-runtime/aws-smithy-runtime-api/src/shared.rs index c45506c9f3c..80b4f68ebeb 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/shared.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/shared.rs @@ -19,8 +19,8 @@ #![cfg_attr( feature = "client", doc = " -For example, [`SharedHttpConnector`](crate::client::connectors::SharedHttpConnector), is -a shared type for the [`HttpConnector`](crate::client::connectors::HttpConnector) trait, +For example, [`SharedHttpConnector`](crate::client::http::SharedHttpConnector), is +a shared type for the [`HttpConnector`](crate::client::http::HttpConnector) trait, which allows for sharing a single HTTP connector instance (and its connection pool) among multiple clients. " )] @@ -63,9 +63,10 @@ The `IntoShared` trait is useful for making functions that take any `RuntimePlug For example, this function will convert the given `plugin` argument into a `SharedRuntimePlugin`. ```rust,no_run -# use aws_smithy_runtime_api::client::runtime_plugin::{SharedRuntimePlugin, StaticRuntimePlugin}; -# use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; -fn take_shared(plugin: impl IntoShared) { +# use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_runtime_api::shared::IntoShared; + +fn take_shared(plugin: impl RuntimePlugin + 'static) { let _plugin: SharedRuntimePlugin = plugin.into_shared(); } ``` @@ -74,9 +75,9 @@ This can be called with different types, and even if a `SharedRuntimePlugin` is `SharedRuntimePlugin` inside of another `SharedRuntimePlugin`. ```rust,no_run -# use aws_smithy_runtime_api::client::runtime_plugin::{SharedRuntimePlugin, StaticRuntimePlugin}; +# use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin, StaticRuntimePlugin}; # use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; -# fn take_shared(plugin: impl IntoShared) { +# fn take_shared(plugin: impl RuntimePlugin + 'static) { # let _plugin: SharedRuntimePlugin = plugin.into_shared(); # } // Automatically converts it to `SharedRuntimePlugin(StaticRuntimePlugin)` @@ -180,6 +181,14 @@ macro_rules! impl_shared_conversions { }; } +// TODO(https://github.com/awslabs/smithy-rs/issues/3016): Move these impls once aws-smithy-async is merged into aws-smithy-runtime-api +mod async_impls { + use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::time::{SharedTimeSource, TimeSource}; + impl_shared_conversions!(convert SharedAsyncSleep from AsyncSleep using SharedAsyncSleep::new); + impl_shared_conversions!(convert SharedTimeSource from TimeSource using SharedTimeSource::new); +} + #[cfg(test)] mod tests { use super::*; diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index 743d5d2dae4..7b569d35c84 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -12,13 +12,16 @@ repository = "https://github.com/awslabs/smithy-rs" [features] client = ["aws-smithy-runtime-api/client"] http-auth = ["aws-smithy-runtime-api/http-auth"] +connector-hyper-0-14-x = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp"] +tls-rustls = ["dep:hyper-rustls", "dep:rustls", "connector-hyper-0-14-x"] +rt-tokio = ["tokio/rt"] + +# Features for testing test-util = ["aws-smithy-runtime-api/test-util", "dep:aws-smithy-protocol-test", "dep:tracing-subscriber", "dep:serde", "dep:serde_json"] -connector-hyper = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp"] -tls-rustls = ["dep:hyper-rustls", "dep:rustls", "connector-hyper"] +wire-mock = ["test-util", "connector-hyper-0-14-x", "hyper?/server"] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } -aws-smithy-client = { path = "../aws-smithy-client" } aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-protocol-test = { path = "../aws-smithy-protocol-test", optional = true } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } @@ -44,7 +47,6 @@ approx = "0.5.1" aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio", "test-util"] } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["test-util"] } -hyper-tls = { version = "0.5.0" } tokio = { version = "1.25", features = ["macros", "rt", "test-util"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } tracing-test = "0.2.1" diff --git a/rust-runtime/aws-smithy-runtime/external-types.toml b/rust-runtime/aws-smithy-runtime/external-types.toml index f735d80eef0..fe24b1a1b04 100644 --- a/rust-runtime/aws-smithy-runtime/external-types.toml +++ b/rust-runtime/aws-smithy-runtime/external-types.toml @@ -3,8 +3,6 @@ allowed_external_types = [ "aws_smithy_async::*", "aws_smithy_http::*", "aws_smithy_types::*", - "aws_smithy_client::erase::DynConnector", - "aws_smithy_client::http_connector::ConnectorSettings", # TODO(audit-external-type-usage) We should newtype these or otherwise avoid exposing them "http::header::name::HeaderName", @@ -13,7 +11,7 @@ allowed_external_types = [ "http::uri::Uri", # Used for creating hyper connectors - "tower_service::Service", + "tower_service::Service", # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature "aws_smithy_protocol_test::MediaType", @@ -22,7 +20,7 @@ allowed_external_types = [ "serde::de::Deserialize", "hyper::client::connect::dns::Name", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper` feature + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper-0-14-x` feature "hyper::client::client::Builder", "hyper::client::connect::Connection", "tokio::io::async_read::AsyncRead", diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index 71d1a0ea0fa..392dc120232 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -6,11 +6,13 @@ /// Smithy auth scheme implementations. pub mod auth; -/// Built-in Smithy connectors. +pub mod dns; + +/// Built-in Smithy HTTP clients and connectors. /// -/// See the [module docs in `aws-smithy-runtime-api`](aws_smithy_runtime_api::client::connectors) -/// for more information about connectors. -pub mod connectors; +/// See the [module docs in `aws-smithy-runtime-api`](aws_smithy_runtime_api::client::http) +/// for more information about clients and connectors. +pub mod http; /// Utility to simplify config building for config and config overrides. pub mod config_override; diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs deleted file mode 100644 index 4666c04bc2b..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -/// Interceptor for connection poisoning. -pub mod connection_poisoning; - -#[cfg(feature = "test-util")] -pub mod test_util; - -/// Default HTTP and TLS connectors that use hyper and rustls. -#[cfg(feature = "connector-hyper")] -pub mod hyper_connector; - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module -/// Unstable API for interfacing the old middleware connectors with the newer orchestrator connectors. -/// -/// Important: This module and its contents will be removed in the next release. -pub mod adapter { - use aws_smithy_client::erase::DynConnector; - use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; - use aws_smithy_runtime_api::client::orchestrator::HttpRequest; - use std::sync::{Arc, Mutex}; - - /// Adapts a [`DynConnector`] to the [`HttpConnector`] trait. - /// - /// This is a temporary adapter that allows the old-style tower-based connectors to - /// work with the new non-tower based architecture of the generated clients. - /// It will be removed in a future release. - #[derive(Debug)] - pub struct DynConnectorAdapter { - // `DynConnector` requires `&mut self`, so we need interior mutability to adapt to it - dyn_connector: Arc>, - } - - impl DynConnectorAdapter { - /// Creates a new `DynConnectorAdapter`. - pub fn new(dyn_connector: DynConnector) -> Self { - Self { - dyn_connector: Arc::new(Mutex::new(dyn_connector)), - } - } - } - - impl HttpConnector for DynConnectorAdapter { - fn call(&self, request: HttpRequest) -> HttpConnectorFuture { - let future = self.dyn_connector.lock().unwrap().call_lite(request); - HttpConnectorFuture::new(future) - } - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs deleted file mode 100644 index 686b7101976..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Module with client connectors useful for testing. -//! -//! Each test connector is useful for different test use cases: -//! - [`capture_request`](capture_request::capture_request): If you don't care what the -//! response is, but just want to check that the serialized request is what you expect, -//! then use `capture_request`. Or, alternatively, if you don't care what the request -//! is, but want to always respond with a given response, then capture request can also -//! be useful since you can optionally give it a response to return. -//! - [`dvr`]: If you want to record real-world traffic and then replay it later, then DVR's -//! [`RecordingConnector`](dvr::RecordingConnector) and [`ReplayingConnector`](dvr::ReplayingConnector) -//! can accomplish this, and the recorded traffic can be saved to JSON and checked in. Note: if -//! the traffic recording has sensitive information in it, such as signatures or authorization, -//! you will need to manually scrub this out if you intend to store the recording alongside -//! your tests. -//! - [`EventConnector`]: If you want to have a set list of requests and their responses in a test, -//! then the event connector will be useful. On construction, it takes a list of tuples that represent -//! each expected request and the response for that request. At the end of the test, you can ask the -//! connector to verify that the requests matched the expectations. -//! - [`infallible_connection_fn`]: Allows you to create a connector from an infallible function -//! that takes a request and returns a response. -//! - [`NeverConnector`]: Useful for testing timeouts, where you want the connector to never respond. - -mod capture_request; -pub use capture_request::{capture_request, CaptureRequestHandler, CaptureRequestReceiver}; - -#[cfg(feature = "connector-hyper")] -pub mod dvr; - -mod event_connector; -pub use event_connector::{ConnectionEvent, EventConnector}; - -mod infallible; -pub use infallible::infallible_connection_fn; - -mod never; -pub use never::NeverConnector; diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs deleted file mode 100644 index 2150235c034..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/event_connector.rs +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; -use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; -use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; -use http::header::{HeaderName, CONTENT_TYPE}; -use std::fmt::Debug; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::time::Duration; - -type ConnectionEvents = Vec; - -/// Test data for the [`EventConnector`]. -/// -/// Each `ConnectionEvent` represents one HTTP request and response -/// through the connector. Optionally, a latency value can be set to simulate -/// network latency (done via async sleep in the `EventConnector`). -#[derive(Debug)] -pub struct ConnectionEvent { - latency: Duration, - req: HttpRequest, - res: HttpResponse, -} - -impl ConnectionEvent { - /// Creates a new `ConnectionEvent`. - pub fn new(req: HttpRequest, res: HttpResponse) -> Self { - Self { - res, - req, - latency: Duration::from_secs(0), - } - } - - /// Add simulated latency to this `ConnectionEvent` - pub fn with_latency(mut self, latency: Duration) -> Self { - self.latency = latency; - self - } - - /// Returns the test request. - pub fn request(&self) -> &HttpRequest { - &self.req - } - - /// Returns the test response. - pub fn response(&self) -> &HttpResponse { - &self.res - } -} - -impl From<(HttpRequest, HttpResponse)> for ConnectionEvent { - fn from((req, res): (HttpRequest, HttpResponse)) -> Self { - Self::new(req, res) - } -} - -#[derive(Debug)] -struct ValidateRequest { - expected: HttpRequest, - actual: HttpRequest, -} - -impl ValidateRequest { - fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { - let (actual, expected) = (&self.actual, &self.expected); - assert_eq!( - actual.uri(), - expected.uri(), - "Request #{index} - URI doesn't match expected value" - ); - for (name, value) in expected.headers() { - if !ignore_headers.contains(name) { - let actual_header = actual - .headers() - .get(name) - .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); - assert_eq!( - actual_header.to_str().unwrap(), - value.to_str().unwrap(), - "Request #{index} - Header {name:?} doesn't match expected value", - ); - } - } - let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); - let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); - let media_type = if actual - .headers() - .get(CONTENT_TYPE) - .map(|v| v.to_str().unwrap().contains("json")) - .unwrap_or(false) - { - MediaType::Json - } else { - MediaType::Other("unknown".to_string()) - }; - match (actual_str, expected_str) { - (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), - _ => assert_eq!( - actual.body().bytes(), - expected.body().bytes(), - "Request #{index} - Body contents didn't match expected value" - ), - }; - } -} - -/// Request/response event-driven connector for use in tests. -/// -/// A basic test connection. It will: -/// - Respond to requests with a preloaded series of responses -/// - Record requests for future examination -#[derive(Debug, Clone)] -pub struct EventConnector { - data: Arc>, - requests: Arc>>, - sleep_impl: SharedAsyncSleep, -} - -impl EventConnector { - /// Creates a new event connector. - pub fn new(mut data: ConnectionEvents, sleep_impl: impl Into) -> Self { - data.reverse(); - EventConnector { - data: Arc::new(Mutex::new(data)), - requests: Default::default(), - sleep_impl: sleep_impl.into(), - } - } - - fn requests(&self) -> impl Deref> + '_ { - self.requests.lock().unwrap() - } - - /// Asserts the expected requests match the actual requests. - /// - /// The expected requests are given as the connection events when the `EventConnector` - /// is created. The `EventConnector` will record the actual requests and assert that - /// they match the expected requests. - /// - /// A list of headers that should be ignored when comparing requests can be passed - /// for cases where headers are non-deterministic or are irrelevant to the test. - #[track_caller] - pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { - for (i, req) in self.requests().iter().enumerate() { - req.assert_matches(i, ignore_headers) - } - let remaining_requests = self.data.lock().unwrap(); - let number_of_remaining_requests = remaining_requests.len(); - let actual_requests = self.requests().len(); - assert!( - remaining_requests.is_empty(), - "Expected {number_of_remaining_requests} additional requests (only {actual_requests} sent)", - ); - } -} - -impl HttpConnector for EventConnector { - fn call(&self, request: HttpRequest) -> HttpConnectorFuture { - let (res, simulated_latency) = if let Some(event) = self.data.lock().unwrap().pop() { - self.requests.lock().unwrap().push(ValidateRequest { - expected: event.req, - actual: request, - }); - - (Ok(event.res.map(SdkBody::from)), event.latency) - } else { - ( - Err(ConnectorError::other("No more data".into(), None)), - Duration::from_secs(0), - ) - }; - - let sleep = self.sleep_impl.sleep(simulated_latency); - HttpConnectorFuture::new(async move { - sleep.await; - res - }) - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs deleted file mode 100644 index dbd1d7c4cf3..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/never.rs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Test connectors that never return data - -use aws_smithy_async::future::never::Never; -use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; - -/// A connector that will never respond. -/// -/// Returned futures will return Pending forever -#[derive(Clone, Debug, Default)] -pub struct NeverConnector { - invocations: Arc, -} - -impl NeverConnector { - /// Create a new never connector. - pub fn new() -> Self { - Default::default() - } - - /// Returns the number of invocations made to this connector. - pub fn num_calls(&self) -> usize { - self.invocations.load(Ordering::SeqCst) - } -} - -impl HttpConnector for NeverConnector { - fn call(&self, _request: HttpRequest) -> HttpConnectorFuture { - self.invocations.fetch_add(1, Ordering::SeqCst); - HttpConnectorFuture::new(async move { - Never::new().await; - unreachable!() - }) - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/dns.rs b/rust-runtime/aws-smithy-runtime/src/client/dns.rs new file mode 100644 index 00000000000..3a311ccd988 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/dns.rs @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Built-in DNS resolver implementations. + +#[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] +mod tokio { + use aws_smithy_runtime_api::client::dns::{DnsFuture, DnsResolver, ResolveDnsError}; + use std::io::{Error as IoError, ErrorKind as IoErrorKind}; + use std::net::ToSocketAddrs; + + /// DNS resolver that uses `tokio::spawn_blocking` to resolve DNS using the standard library. + /// + /// This implementation isn't available for WASM targets. + #[non_exhaustive] + #[derive(Debug, Default)] + pub struct TokioDnsResolver; + + impl TokioDnsResolver { + /// Creates a new Tokio DNS resolver + pub fn new() -> Self { + Self + } + } + + impl DnsResolver for TokioDnsResolver { + fn resolve_dns(&self, name: String) -> DnsFuture { + DnsFuture::new(async move { + let result = tokio::task::spawn_blocking(move || (name, 0).to_socket_addrs()).await; + match result { + Err(join_failure) => Err(ResolveDnsError::new(IoError::new( + IoErrorKind::Other, + join_failure, + ))), + Ok(Ok(dns_result)) => { + Ok(dns_result.into_iter().map(|addr| addr.ip()).collect()) + } + Ok(Err(dns_failure)) => Err(ResolveDnsError::new(dns_failure)), + } + }) + } + } +} + +#[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] +pub use self::tokio::TokioDnsResolver; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http.rs b/rust-runtime/aws-smithy-runtime/src/client/http.rs new file mode 100644 index 00000000000..6f5960d0735 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http.rs @@ -0,0 +1,37 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{ + Order, SharedRuntimePlugin, StaticRuntimePlugin, +}; + +/// Interceptor for connection poisoning. +pub mod connection_poisoning; + +#[cfg(feature = "test-util")] +pub mod test_util; + +/// Default HTTP and TLS connectors that use hyper 0.14.x and rustls. +/// +/// This module is named after the hyper version number since we anticipate +/// needing to provide equivalent functionality for hyper 1.x in the future. +#[cfg(feature = "connector-hyper-0-14-x")] +pub mod hyper_014; + +/// Runtime plugin that provides a default connector. Intended to be used by the generated code. +pub fn default_http_client_plugin() -> SharedRuntimePlugin { + let _default: Option = None; + #[cfg(feature = "connector-hyper-0-14-x")] + let _default = hyper_014::default_client(); + + let plugin = StaticRuntimePlugin::new() + .with_order(Order::Defaults) + .with_runtime_components( + RuntimeComponentsBuilder::new("default_http_client_plugin").with_http_client(_default), + ); + SharedRuntimePlugin::new(plugin) +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs similarity index 100% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs similarity index 76% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 9285394020d..6ddfc8b962b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/hyper_connector.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -4,29 +4,35 @@ */ use aws_smithy_async::future::timeout::TimedOutError; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; -use aws_smithy_client::http_connector::ConnectorSettings; +use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_http::body::SdkBody; use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; -use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, + SharedHttpConnector, +}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::retry::ErrorKind; use http::{Extensions, Uri}; use hyper::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo}; use hyper::service::Service; +use std::collections::HashMap; use std::error::Error; use std::fmt; use std::fmt::Debug; +use std::sync::RwLock; +use std::time::Duration; use tokio::io::{AsyncRead, AsyncWrite}; #[cfg(feature = "tls-rustls")] mod default_connector { use aws_smithy_async::rt::sleep::SharedAsyncSleep; - use aws_smithy_client::http_connector::ConnectorSettings; + use aws_smithy_runtime_api::client::http::HttpConnectorSettings; // Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we // don't need to repeatedly incur that cost. @@ -61,7 +67,7 @@ mod default_connector { }); pub(super) fn base( - settings: &ConnectorSettings, + settings: &HttpConnectorSettings, sleep: Option, ) -> super::HyperConnectorBuilder { let mut hyper = super::HyperConnector::builder().connector_settings(settings.clone()); @@ -80,9 +86,9 @@ mod default_connector { } } -/// Given `ConnectorSettings` and an `SharedAsyncSleep`, create a `SharedHttpConnector` from defaults depending on what cargo features are activated. +/// Given `HttpConnectorSettings` and an `SharedAsyncSleep`, create a `SharedHttpConnector` from defaults depending on what cargo features are activated. pub fn default_connector( - settings: &ConnectorSettings, + settings: &HttpConnectorSettings, sleep: Option, ) -> Option { #[cfg(feature = "tls-rustls")] @@ -98,6 +104,20 @@ pub fn default_connector( } } +/// Creates a hyper-backed HTTPS client from defaults depending on what cargo features are activated. +pub fn default_client() -> Option { + #[cfg(feature = "tls-rustls")] + { + tracing::trace!("creating a new default hyper 0.14.x client"); + Some(HyperClientBuilder::new().build_https()) + } + #[cfg(not(feature = "tls-rustls"))] + { + tracing::trace!("no default connector available"); + None + } +} + /// [`HttpConnector`] that uses [`hyper`] to make HTTP requests. /// /// This connector also implements socket connect and read timeouts. @@ -170,7 +190,7 @@ impl HttpConnector for HyperConnector { /// Builder for [`HyperConnector`]. #[derive(Default, Debug)] pub struct HyperConnectorBuilder { - connector_settings: Option, + connector_settings: Option, sleep_impl: Option, client_builder: Option, } @@ -228,8 +248,8 @@ impl HyperConnectorBuilder { /// /// Calling this is only necessary for testing or to use something other than /// [`default_async_sleep`]. - pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self { - self.sleep_impl = Some(sleep_impl); + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.sleep_impl = Some(sleep_impl.into_shared()); self } @@ -243,7 +263,7 @@ impl HyperConnectorBuilder { } /// Configure the HTTP settings for the `HyperAdapter` - pub fn connector_settings(mut self, connector_settings: ConnectorSettings) -> Self { + pub fn connector_settings(mut self, connector_settings: HttpConnectorSettings) -> Self { self.connector_settings = Some(connector_settings); self } @@ -251,7 +271,7 @@ impl HyperConnectorBuilder { /// Configure the HTTP settings for the `HyperAdapter` pub fn set_connector_settings( &mut self, - connector_settings: Option, + connector_settings: Option, ) -> &mut Self { self.connector_settings = connector_settings; self @@ -391,6 +411,151 @@ fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option None } +#[derive(Clone, Debug, Eq, PartialEq, Hash)] +struct CacheKey { + connect_timeout: Option, + read_timeout: Option, +} + +impl From<&HttpConnectorSettings> for CacheKey { + fn from(value: &HttpConnectorSettings) -> Self { + Self { + connect_timeout: value.connect_timeout(), + read_timeout: value.read_timeout(), + } + } +} + +struct HyperClient { + connector_cache: RwLock>, + client_builder: hyper::client::Builder, + tcp_connector_fn: F, +} + +impl fmt::Debug for HyperClient { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("HyperClient") + .field("connector_cache", &self.connector_cache) + .field("client_builder", &self.client_builder) + .finish() + } +} + +impl HttpClient for HyperClient +where + F: Fn() -> C + Send + Sync, + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, +{ + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector { + let key = CacheKey::from(settings); + let mut connector = self.connector_cache.read().unwrap().get(&key).cloned(); + if connector.is_none() { + let mut cache = self.connector_cache.write().unwrap(); + // Short-circuit if another thread already wrote a connector to the cache for this key + if !cache.contains_key(&key) { + let mut builder = HyperConnector::builder() + .hyper_builder(self.client_builder.clone()) + .connector_settings(settings.clone()); + builder.set_sleep_impl(components.sleep_impl()); + + let tcp_connector = (self.tcp_connector_fn)(); + let connector = SharedHttpConnector::new(builder.build(tcp_connector)); + cache.insert(key.clone(), connector); + } + connector = cache.get(&key).cloned(); + } + + connector.expect("cache populated above") + } +} + +/// Builder for a hyper-backed [`HttpClient`] implementation. +/// +/// This builder can be used to customize the underlying TCP connector used, as well as +/// hyper client configuration. +#[derive(Clone, Default, Debug)] +pub struct HyperClientBuilder { + client_builder: Option, +} + +impl HyperClientBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Self::default() + } + + /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn hyper_builder(mut self, hyper_builder: hyper::client::Builder) -> Self { + self.client_builder = Some(hyper_builder); + self + } + + /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn set_hyper_builder( + &mut self, + hyper_builder: Option, + ) -> &mut Self { + self.client_builder = hyper_builder; + self + } + + /// Create a [`HyperConnector`] with the default rustls HTTPS implementation. + #[cfg(feature = "tls-rustls")] + pub fn build_https(self) -> SharedHttpClient { + self.build(default_connector::https()) + } + + /// Create a [`SharedHttpClient`] from this builder and a given connector. + /// + #[cfg_attr( + feature = "tls-rustls", + doc = "Use [`build_https`](HyperClientBuilder::build_https) if you don't want to provide a custom TCP connector." + )] + pub fn build(self, tcp_connector: C) -> SharedHttpClient + where + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, + { + SharedHttpClient::new(HyperClient { + connector_cache: RwLock::new(HashMap::new()), + client_builder: self.client_builder.unwrap_or_default(), + tcp_connector_fn: move || tcp_connector.clone(), + }) + } + + #[cfg(all(test, feature = "test-util"))] + fn build_with_fn(self, tcp_connector_fn: F) -> SharedHttpClient + where + F: Fn() -> C + Send + Sync + 'static, + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, + { + SharedHttpClient::new(HyperClient { + connector_cache: RwLock::new(HashMap::new()), + client_builder: self.client_builder.unwrap_or_default(), + tcp_connector_fn, + }) + } +} + mod timeout_middleware { use aws_smithy_async::future::timeout::{TimedOutError, Timeout}; use aws_smithy_async::rt::sleep::Sleep; @@ -600,7 +765,6 @@ mod timeout_middleware { use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_http::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; - use aws_smithy_types::timeout::TimeoutConfig; use hyper::client::connect::Connected; use std::time::Duration; use tokio::io::ReadBuf; @@ -699,11 +863,9 @@ mod timeout_middleware { #[tokio::test] async fn http_connect_timeout_works() { let tcp_connector = NeverConnects::default(); - let connector_settings = ConnectorSettings::from_timeout_config( - &TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(), - ); + let connector_settings = HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(1)) + .build(); let hyper = HyperConnector::builder() .connector_settings(connector_settings) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) @@ -738,12 +900,10 @@ mod timeout_middleware { #[tokio::test] async fn http_read_timeout_works() { let tcp_connector = NeverReplies::default(); - let connector_settings = ConnectorSettings::from_timeout_config( - &TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .read_timeout(Duration::from_secs(2)) - .build(), - ); + let connector_settings = HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(1)) + .read_timeout(Duration::from_secs(2)) + .build(); let hyper = HyperConnector::builder() .connector_settings(connector_settings) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) @@ -775,17 +935,74 @@ mod timeout_middleware { } } -#[cfg(test)] +#[cfg(all(test, feature = "test-util"))] mod test { use super::*; + use crate::client::http::test_util::NeverTcpConnector; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use http::Uri; use hyper::client::connect::{Connected, Connection}; use std::io::{Error, ErrorKind}; use std::pin::Pin; + use std::sync::atomic::{AtomicU32, Ordering}; + use std::sync::Arc; use std::task::{Context, Poll}; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + #[tokio::test] + async fn connector_selection() { + // Create a client that increments a count every time it creates a new HyperConnector + let creation_count = Arc::new(AtomicU32::new(0)); + let http_client = HyperClientBuilder::new().build_with_fn({ + let count = creation_count.clone(); + move || { + count.fetch_add(1, Ordering::Relaxed); + NeverTcpConnector::new() + } + }); + + // This configuration should result in 4 separate connectors with different timeout settings + let settings = [ + HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(3)) + .build(), + HttpConnectorSettings::builder() + .read_timeout(Duration::from_secs(3)) + .build(), + HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(3)) + .read_timeout(Duration::from_secs(3)) + .build(), + HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(5)) + .read_timeout(Duration::from_secs(3)) + .build(), + ]; + + // Kick off thousands of parallel tasks that will try to create a connector + let components = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut handles = Vec::new(); + for setting in &settings { + for _ in 0..1000 { + let client = http_client.clone(); + handles.push(tokio::spawn({ + let setting = setting.clone(); + let components = components.clone(); + async move { + let _ = client.http_connector(&setting, &components); + } + })); + } + } + for handle in handles { + handle.await.unwrap(); + } + + // Verify only 4 connectors were created amidst the chaos + assert_eq!(4, creation_count.load(Ordering::Relaxed)); + } + #[tokio::test] async fn hyper_io_error() { let connector = TestConnection { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs new file mode 100644 index 00000000000..c05b3dca543 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs @@ -0,0 +1,58 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Various fake/mock clients for testing. +//! +//! Each test client is useful for different test use cases: +//! - [`capture_request`](capture_request::capture_request): If you don't care what the +//! response is, but just want to check that the serialized request is what you expect, +//! then use `capture_request`. Or, alternatively, if you don't care what the request +//! is, but want to always respond with a given response, then capture request can also +//! be useful since you can optionally give it a response to return. +#![cfg_attr( + feature = "connector-hyper-0-14-x", + doc = "- [`dvr`]: If you want to record real-world traffic and then replay it later, then DVR's" +)] +//! [`RecordingClient`](dvr::RecordingClient) and [`ReplayingClient`](dvr::ReplayingClient) +//! can accomplish this, and the recorded traffic can be saved to JSON and checked in. Note: if +//! the traffic recording has sensitive information in it, such as signatures or authorization, +//! you will need to manually scrub this out if you intend to store the recording alongside +//! your tests. +//! - [`StaticReplayClient`]: If you want to have a set list of requests and their responses in a test, +//! then the static replay client will be useful. On construction, it takes a list of request/response +//! pairs that represent each expected request and the response for that test. At the end of the test, +//! you can ask the client to verify that the requests matched the expectations. +//! - [`infallible_client_fn`]: Allows you to create a client from an infallible function +//! that takes a request and returns a response. +//! - [`NeverClient`]: Useful for testing timeouts, where you want the client to never respond. +//! +#![cfg_attr( + feature = "connector-hyper-0-14-x", + doc = " +There is also the [`NeverTcpConnector`], which makes it easy to test connect/read timeouts. + +Finally, for socket-level mocking, see the [`wire`] module. +" +)] +mod capture_request; +pub use capture_request::{capture_request, CaptureRequestHandler, CaptureRequestReceiver}; + +#[cfg(feature = "connector-hyper-0-14-x")] +pub mod dvr; + +mod replay; +pub use replay::{ReplayEvent, StaticReplayClient}; + +mod infallible; +pub use infallible::infallible_client_fn; + +mod never; +pub use never::NeverClient; + +#[cfg(feature = "connector-hyper-0-14-x")] +pub use never::NeverTcpConnector; + +#[cfg(all(feature = "connector-hyper-0-14-x", feature = "wire-mock"))] +pub mod wire; diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs similarity index 83% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs index 7721af15dee..06915c942eb 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/capture_request.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs @@ -4,8 +4,12 @@ */ use aws_smithy_http::body::SdkBody; -use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; use std::fmt::Debug; use std::sync::{Arc, Mutex}; use tokio::sync::oneshot; @@ -36,6 +40,16 @@ impl HttpConnector for CaptureRequestHandler { } } +impl HttpClient for CaptureRequestHandler { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} + /// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) #[derive(Debug)] pub struct CaptureRequestReceiver { @@ -70,9 +84,9 @@ impl CaptureRequestReceiver { /// /// Example: /// ```compile_fail -/// let (server, request) = capture_request(None); +/// let (capture_client, request) = capture_request(None); /// let conf = aws_sdk_sts::Config::builder() -/// .http_connector(server) +/// .http_client(capture_client) /// .build(); /// let client = aws_sdk_sts::Client::from_conf(conf); /// let _ = client.assume_role_with_saml().send().await; diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs similarity index 94% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index 90f37b95baf..a4c5138dc5c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -18,12 +18,12 @@ mod record; mod replay; pub use aws_smithy_protocol_test::MediaType; -pub use record::RecordingConnector; -pub use replay::ReplayingConnector; +pub use record::RecordingClient; +pub use replay::ReplayingClient; /// A complete traffic recording /// -/// A traffic recording can be replayed with [`RecordingConnector`](RecordingConnector) +/// A traffic recording can be replayed with [`RecordingClient`](RecordingClient) #[derive(Debug, Serialize, Deserialize)] pub struct NetworkTraffic { events: Vec, @@ -232,7 +232,7 @@ mod tests { use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream::ByteStream; - use aws_smithy_runtime_api::client::connectors::{HttpConnector, SharedHttpConnector}; + use aws_smithy_runtime_api::client::http::{HttpConnector, SharedHttpConnector}; use bytes::Bytes; use http::Uri; use std::error::Error; @@ -244,8 +244,8 @@ mod tests { // make a request, then verify that the same traffic was recorded. let network_traffic = fs::read_to_string("test-data/example.com.json")?; let network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?; - let inner = ReplayingConnector::new(network_traffic.events.clone()); - let connection = RecordingConnector::new(SharedHttpConnector::new(inner.clone())); + let inner = ReplayingClient::new(network_traffic.events.clone()); + let connection = RecordingClient::new(SharedHttpConnector::new(inner.clone())); let req = http::Request::post("https://www.example.com") .body(SdkBody::from("hello world")) .unwrap(); diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs similarity index 87% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs index c175b24d3cf..1c682ad7ede 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/record.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs @@ -8,10 +8,12 @@ use super::{ Version, }; use aws_smithy_http::body::SdkBody; -use aws_smithy_runtime_api::client::connectors::{ - HttpConnector, HttpConnectorFuture, SharedHttpConnector, +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; use http_body::Body; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -19,21 +21,21 @@ use std::sync::{Arc, Mutex, MutexGuard}; use std::{fs, io}; use tokio::task::JoinHandle; -/// Recording Connection Wrapper +/// Recording client /// -/// RecordingConnector wraps an inner connection and records all traffic, enabling traffic replay. +/// `RecordingClient` wraps an inner connection and records all traffic, enabling traffic replay. #[derive(Clone, Debug)] -pub struct RecordingConnector { +pub struct RecordingClient { pub(crate) data: Arc>>, pub(crate) num_events: Arc, pub(crate) inner: SharedHttpConnector, } #[cfg(all(feature = "tls-rustls"))] -impl RecordingConnector { - /// Construct a recording connection wrapping a default HTTPS implementation +impl RecordingClient { + /// Construct a recording connection wrapping a default HTTPS implementation without any timeouts. pub fn https() -> Self { - use crate::client::connectors::hyper_connector::HyperConnector; + use crate::client::http::hyper_014::HyperConnector; Self { data: Default::default(), num_events: Arc::new(AtomicUsize::new(0)), @@ -42,13 +44,13 @@ impl RecordingConnector { } } -impl RecordingConnector { +impl RecordingClient { /// Create a new recording connection from a connection - pub fn new(underlying_connector: SharedHttpConnector) -> Self { + pub fn new(underlying_connector: impl HttpConnector + 'static) -> Self { Self { data: Default::default(), num_events: Arc::new(AtomicUsize::new(0)), - inner: underlying_connector, + inner: underlying_connector.into_shared(), } } @@ -141,7 +143,7 @@ fn record_body( }) } -impl HttpConnector for RecordingConnector { +impl HttpConnector for RecordingClient { fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { let event_id = self.next_id(); // A request has three phases: @@ -200,3 +202,13 @@ impl HttpConnector for RecordingConnector { HttpConnectorFuture::new(fut) } } + +impl HttpClient for RecordingClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs similarity index 91% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index 4388e939bed..f9386e624d0 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -7,14 +7,19 @@ use super::{Action, ConnectionId, Direction, Event, NetworkTraffic}; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_protocol_test::MediaType; -use aws_smithy_runtime_api::client::connectors::{HttpConnector, HttpConnectorFuture}; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; use bytes::{Bytes, BytesMut}; use http::{Request, Version}; use http_body::Body; use std::collections::{HashMap, VecDeque}; use std::error::Error; +use std::fmt; use std::ops::DerefMut; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -46,16 +51,25 @@ impl Waitable { } } -/// Replay traffic recorded by a [`RecordingConnector`](super::RecordingConnector) -#[derive(Clone, Debug)] -pub struct ReplayingConnector { +/// Replay traffic recorded by a [`RecordingClient`](super::RecordingClient) +#[derive(Clone)] +pub struct ReplayingClient { live_events: Arc>>>, verifiable_events: Arc>>, num_events: Arc, recorded_requests: Arc>>>>, } -impl ReplayingConnector { +// Ideally, this would just derive Debug, but that makes the tests in aws-config think they found AWS secrets +// when really it's just the test response data they're seeing from the Debug impl of this client. +// This is just a quick workaround. A better fix can be considered later. +impl fmt::Debug for ReplayingClient { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("test_util::dvr::ReplayingClient") + } +} + +impl ReplayingClient { fn next_id(&self) -> ConnectionId { ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed)) } @@ -204,7 +218,7 @@ impl ReplayingConnector { .collect(); let verifiable_events = Arc::new(verifiable_events); - ReplayingConnector { + ReplayingClient { live_events: Arc::new(Mutex::new(event_map)), num_events: Arc::new(AtomicUsize::new(0)), recorded_requests: Default::default(), @@ -263,7 +277,7 @@ fn convert_version(version: &str) -> Version { } } -impl HttpConnector for ReplayingConnector { +impl HttpConnector for ReplayingClient { fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { let event_id = self.next_id(); tracing::debug!("received event {}: {request:?}", event_id.0); @@ -349,3 +363,13 @@ impl HttpConnector for ReplayingConnector { HttpConnectorFuture::new(fut) } } + +impl HttpClient for ReplayingClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs similarity index 51% rename from rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs index b311464774f..491f26c0e2f 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util/infallible.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs @@ -5,32 +5,35 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; -use aws_smithy_runtime_api::client::connectors::{ - HttpConnector, HttpConnectorFuture, SharedHttpConnector, +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, + SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; use std::fmt; use std::sync::Arc; -/// Create a [`SharedHttpConnector`] from `Fn(http:Request) -> http::Response` +/// Create a [`SharedHttpClient`] from `Fn(http:Request) -> http::Response` /// /// # Examples /// /// ```rust -/// use aws_smithy_runtime::client::connectors::test_util::infallible_connection_fn; -/// let connector = infallible_connection_fn(|_req| http::Response::builder().status(200).body("OK!").unwrap()); +/// use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +/// let http_client = infallible_client_fn(|_req| http::Response::builder().status(200).body("OK!").unwrap()); /// ``` -pub fn infallible_connection_fn( +pub fn infallible_client_fn( f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, -) -> SharedHttpConnector +) -> SharedHttpClient where B: Into, { - SharedHttpConnector::new(InfallibleConnectorFn::new(f)) + InfallibleClientFn::new(f).into_shared() } #[derive(Clone)] -struct InfallibleConnectorFn { +struct InfallibleClientFn { #[allow(clippy::type_complexity)] response: Arc< dyn Fn(http::Request) -> Result, ConnectorError> @@ -39,13 +42,13 @@ struct InfallibleConnectorFn { >, } -impl fmt::Debug for InfallibleConnectorFn { +impl fmt::Debug for InfallibleClientFn { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("InfallibleConnectorFn").finish() + f.debug_struct("InfallibleClientFn").finish() } } -impl InfallibleConnectorFn { +impl InfallibleClientFn { fn new>( f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, ) -> Self { @@ -55,8 +58,18 @@ impl InfallibleConnectorFn { } } -impl HttpConnector for InfallibleConnectorFn { +impl HttpConnector for InfallibleClientFn { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { HttpConnectorFuture::ready((self.response)(request)) } } + +impl HttpClient for InfallibleClientFn { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs new file mode 100644 index 00000000000..6afff513d2d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs @@ -0,0 +1,176 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Test connectors that never return data + +use aws_smithy_async::future::never::Never; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; + +/// A client that will never respond. +/// +/// Returned futures will return `Pending` forever +#[derive(Clone, Debug, Default)] +pub struct NeverClient { + invocations: Arc, +} + +impl NeverClient { + /// Create a new never connector. + pub fn new() -> Self { + Default::default() + } + + /// Returns the number of invocations made to this connector. + pub fn num_calls(&self) -> usize { + self.invocations.load(Ordering::SeqCst) + } +} + +impl HttpConnector for NeverClient { + fn call(&self, _request: HttpRequest) -> HttpConnectorFuture { + self.invocations.fetch_add(1, Ordering::SeqCst); + HttpConnectorFuture::new(async move { + Never::new().await; + unreachable!() + }) + } +} + +impl HttpClient for NeverClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} + +/// A TCP connector that never connects. +// In the future, this can be available for multiple hyper version feature flags, with the impls gated between individual features +#[cfg(feature = "connector-hyper-0-14-x")] +#[derive(Clone, Debug, Default)] +pub struct NeverTcpConnector; + +#[cfg(feature = "connector-hyper-0-14-x")] +impl NeverTcpConnector { + /// Creates a new `NeverTcpConnector`. + pub fn new() -> Self { + Self + } +} + +#[cfg(feature = "connector-hyper-0-14-x")] +impl hyper::service::Service for NeverTcpConnector { + type Response = connection::NeverTcpConnection; + type Error = aws_smithy_runtime_api::box_error::BoxError; + type Future = std::pin::Pin< + Box> + Send + Sync>, + >; + + fn poll_ready( + &mut self, + _: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + std::task::Poll::Ready(Ok(())) + } + + fn call(&mut self, _: http::Uri) -> Self::Future { + Box::pin(async { + Never::new().await; + unreachable!() + }) + } +} + +#[cfg(feature = "connector-hyper-0-14-x")] +mod connection { + use hyper::client::connect::{Connected, Connection}; + use std::io::Error; + use std::pin::Pin; + use std::task::{Context, Poll}; + use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + + /// A connection type that appeases hyper's trait bounds for a TCP connector, but will panic if any of its traits are used. + #[non_exhaustive] + #[derive(Debug, Default)] + pub struct NeverTcpConnection; + + impl Connection for NeverTcpConnection { + fn connected(&self) -> Connected { + unreachable!() + } + } + + impl AsyncRead for NeverTcpConnection { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut ReadBuf<'_>, + ) -> Poll> { + unreachable!() + } + } + + impl AsyncWrite for NeverTcpConnection { + fn poll_write( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &[u8], + ) -> Poll> { + unreachable!() + } + + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + unreachable!() + } + + fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + unreachable!() + } + } +} + +#[cfg(all(test, feature = "connector-hyper-0-14-x"))] +#[tokio::test] +async fn never_tcp_connector_plugs_into_hyper_014() { + use super::*; + use crate::client::http::hyper_014::HyperClientBuilder; + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use std::time::Duration; + + // it should compile + let client = HyperClientBuilder::new().build(NeverTcpConnector::new()); + let components = RuntimeComponentsBuilder::for_tests() + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let http_connector = client.http_connector( + &HttpConnectorSettings::builder() + .connect_timeout(Duration::from_millis(100)) + .build(), + &components, + ); + + let err = http_connector + .call( + http::Request::builder() + .uri("https://example.com/") + .body(SdkBody::empty()) + .unwrap(), + ) + .await + .expect_err("it should time out"); + assert!(dbg!(err).is_timeout()); +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs new file mode 100644 index 00000000000..55bd50434c6 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs @@ -0,0 +1,260 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_http::result::ConnectorError; +use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use http::header::{HeaderName, CONTENT_TYPE}; +use std::ops::Deref; +use std::sync::{Arc, Mutex, MutexGuard}; + +type ReplayEvents = Vec; + +/// Test data for the [`StaticReplayClient`]. +/// +/// Each `ReplayEvent` represents one HTTP request and response +/// through the connector. +#[derive(Debug)] +pub struct ReplayEvent { + request: HttpRequest, + response: HttpResponse, +} + +impl ReplayEvent { + /// Creates a new `ReplayEvent`. + pub fn new(request: HttpRequest, response: HttpResponse) -> Self { + Self { request, response } + } + + /// Returns the test request. + pub fn request(&self) -> &HttpRequest { + &self.request + } + + /// Returns the test response. + pub fn response(&self) -> &HttpResponse { + &self.response + } +} + +impl From<(HttpRequest, HttpResponse)> for ReplayEvent { + fn from((request, response): (HttpRequest, HttpResponse)) -> Self { + Self::new(request, response) + } +} + +#[derive(Debug)] +struct ValidateRequest { + expected: HttpRequest, + actual: HttpRequest, +} + +impl ValidateRequest { + fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { + let (actual, expected) = (&self.actual, &self.expected); + assert_eq!( + actual.uri(), + expected.uri(), + "Request #{index} - URI doesn't match expected value" + ); + for (name, value) in expected.headers() { + if !ignore_headers.contains(name) { + let actual_header = actual + .headers() + .get(name) + .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); + assert_eq!( + actual_header.to_str().unwrap(), + value.to_str().unwrap(), + "Request #{index} - Header {name:?} doesn't match expected value", + ); + } + } + let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); + let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); + let media_type = if actual + .headers() + .get(CONTENT_TYPE) + .map(|v| v.to_str().unwrap().contains("json")) + .unwrap_or(false) + { + MediaType::Json + } else { + MediaType::Other("unknown".to_string()) + }; + match (actual_str, expected_str) { + (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), + _ => assert_eq!( + actual.body().bytes(), + expected.body().bytes(), + "Request #{index} - Body contents didn't match expected value" + ), + }; + } +} + +/// Request/response replaying client for use in tests. +/// +/// This mock client takes a list of request/response pairs named [`ReplayEvent`]. While the client +/// is in use, the responses will be given in the order they appear in the list regardless of what +/// the actual request was. The actual request is recorded, but otherwise not validated against what +/// is in the [`ReplayEvent`]. Later, after the client is finished being used, the +/// [`assert_requests_match`] method can be used to validate the requests. +/// +/// This utility is simpler than [DVR], and thus, is good for tests that don't need +/// to record and replay real traffic. +/// +/// # Example +/// +/// ```no_run +/// use aws_smithy_http::body::SdkBody; +/// use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +/// +/// let http_client = StaticReplayClient::new(vec![ +/// // Event that covers the first request/response +/// ReplayEvent::new( +/// // If `assert_requests_match` is called later, then this request will be matched +/// // against the actual request that was made. +/// http::Request::builder().uri("http://localhost:1234/foo").body(SdkBody::empty()).unwrap(), +/// // This response will be given to the first request regardless of whether it matches the request above. +/// http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), +/// ), +/// // The next ReplayEvent covers the second request/response pair... +/// ]); +/// +/// # /* +/// let config = my_generated_client::Config::builder() +/// .http_client(http_client.clone()) +/// .build(); +/// let client = my_generated_client::Client::from_conf(config); +/// # */ +/// +/// // Do stuff with client... +/// +/// // When you're done, assert the requests match what you expected +/// http_client.assert_requests_match(&[]); +/// ``` +/// +/// [`assert_requests_match`]: crate::client::http::test_util::StaticReplayClient::assert_requests_match +/// [DVR]: crate::client::http::test_util::dvr +#[derive(Clone, Debug)] +pub struct StaticReplayClient { + data: Arc>, + requests: Arc>>, +} + +impl StaticReplayClient { + /// Creates a new event connector. + pub fn new(mut data: ReplayEvents) -> Self { + data.reverse(); + StaticReplayClient { + data: Arc::new(Mutex::new(data)), + requests: Default::default(), + } + } + + /// Returns an iterator over the actual requests that were made. + pub fn actual_requests(&self) -> impl Iterator + '_ { + // The iterator trait doesn't allow us to specify a lifetime on `self` in the `next()` method, + // so we have to do some unsafe code in order to actually implement this iterator without + // angering the borrow checker. + struct Iter<'a> { + // We store an exclusive lock to the data so that the data is completely immutable + _guard: MutexGuard<'a, Vec>, + // We store a pointer into the immutable data for accessing it later + values: *const ValidateRequest, + len: usize, + next_index: usize, + } + impl<'a> Iterator for Iter<'a> { + type Item = &'a HttpRequest; + + fn next(&mut self) -> Option { + // Safety: check the next index is in bounds + if self.next_index >= self.len { + None + } else { + // Safety: It is OK to offset into the pointer and dereference since we did a bounds check. + // It is OK to assign lifetime 'a to the reference since we hold the mutex guard for all of lifetime 'a. + let next = unsafe { + let offset = self.values.add(self.next_index); + &*offset + }; + self.next_index += 1; + Some(&next.actual) + } + } + } + + let guard = self.requests.lock().unwrap(); + Iter { + values: guard.as_ptr(), + len: guard.len(), + _guard: guard, + next_index: 0, + } + } + + fn requests(&self) -> impl Deref> + '_ { + self.requests.lock().unwrap() + } + + /// Asserts the expected requests match the actual requests. + /// + /// The expected requests are given as the connection events when the `EventConnector` + /// is created. The `EventConnector` will record the actual requests and assert that + /// they match the expected requests. + /// + /// A list of headers that should be ignored when comparing requests can be passed + /// for cases where headers are non-deterministic or are irrelevant to the test. + #[track_caller] + pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { + for (i, req) in self.requests().iter().enumerate() { + req.assert_matches(i, ignore_headers) + } + let remaining_requests = self.data.lock().unwrap(); + let number_of_remaining_requests = remaining_requests.len(); + let actual_requests = self.requests().len(); + assert!( + remaining_requests.is_empty(), + "Expected {number_of_remaining_requests} additional requests (only {actual_requests} sent)", + ); + } +} + +impl HttpConnector for StaticReplayClient { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let res = if let Some(event) = self.data.lock().unwrap().pop() { + self.requests.lock().unwrap().push(ValidateRequest { + expected: event.request, + actual: request, + }); + + Ok(event.response) + } else { + Err(ConnectorError::other( + "StaticReplayClient: no more test data available to respond with".into(), + None, + )) + }; + + HttpConnectorFuture::new(async move { res }) + } +} + +impl HttpClient for StaticReplayClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs new file mode 100644 index 00000000000..f5dd76e8db4 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs @@ -0,0 +1,353 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Utilities for mocking at the socket level +//! +//! Other tools in this module actually operate at the `http::Request` / `http::Response` level. This +//! is useful, but it shortcuts the HTTP implementation (e.g. Hyper). [`WireMockServer`] binds +//! to an actual socket on the host. +//! +//! # Examples +//! ```no_run +//! use aws_smithy_runtime_api::client::http::HttpConnectorSettings; +//! use aws_smithy_runtime::client::http::test_util::wire::{check_matches, ReplayedEvent, WireMockServer}; +//! use aws_smithy_runtime::{match_events, ev}; +//! # async fn example() { +//! +//! // This connection binds to a local address +//! let mock = WireMockServer::start(vec![ +//! ReplayedEvent::status(503), +//! ReplayedEvent::status(200) +//! ]).await; +//! +//! # /* +//! // Create a client using the wire mock +//! let config = my_generated_client::Config::builder() +//! .http_client(mock.http_client()) +//! .build(); +//! let client = Client::from_conf(config); +//! +//! // ... do something with +//! # */ +//! +//! // assert that you got the events you expected +//! match_events!(ev!(dns), ev!(connect), ev!(http(200)))(&mock.events()); +//! # } +//! ``` + +#![allow(missing_docs)] + +use crate::client::http::hyper_014::HyperClientBuilder; +use aws_smithy_async::future::never::Never; +use aws_smithy_async::future::BoxFuture; +use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::shared::IntoShared; +use bytes::Bytes; +use http::{Request, Response}; +use hyper::client::connect::dns::Name; +use hyper::server::conn::AddrStream; +use hyper::service::{make_service_fn, service_fn, Service}; +use hyper::{Body, Server}; +use std::collections::HashSet; +use std::convert::Infallible; +use std::error::Error; +use std::iter::Once; +use std::net::{SocketAddr, TcpListener}; +use std::sync::{Arc, Mutex}; +use std::task::{Context, Poll}; +use tokio::spawn; +use tokio::sync::oneshot; + +/// An event recorded by [`WireMockServer`]. +#[non_exhaustive] +#[derive(Debug, Clone)] +pub enum RecordedEvent { + DnsLookup(String), + NewConnection, + Response(ReplayedEvent), +} + +type Matcher = ( + Box Result<(), Box>>, + &'static str, +); + +/// This method should only be used by the macro +#[doc(hidden)] +pub fn check_matches(events: &[RecordedEvent], matchers: &[Matcher]) { + let mut events_iter = events.iter(); + let mut matcher_iter = matchers.iter(); + let mut idx = -1; + loop { + idx += 1; + let bail = |err: Box| panic!("failed on event {}:\n {}", idx, err); + match (events_iter.next(), matcher_iter.next()) { + (Some(event), Some((matcher, _msg))) => matcher(event).unwrap_or_else(bail), + (None, None) => return, + (Some(event), None) => { + bail(format!("got {:?} but no more events were expected", event).into()) + } + (None, Some((_expect, msg))) => { + bail(format!("expected {:?} but no more events were expected", msg).into()) + } + } + } +} + +#[macro_export] +macro_rules! matcher { + ($expect:tt) => { + ( + Box::new( + |event: &$crate::client::http::test_util::wire::RecordedEvent| { + if !matches!(event, $expect) { + return Err(format!( + "expected `{}` but got {:?}", + stringify!($expect), + event + ) + .into()); + } + Ok(()) + }, + ), + stringify!($expect), + ) + }; +} + +/// Helper macro to generate a series of test expectations +#[macro_export] +macro_rules! match_events { + ($( $expect:pat),*) => { + |events| { + $crate::client::http::test_util::wire::check_matches(events, &[$( $crate::matcher!($expect) ),*]); + } + }; + } + +/// Helper to generate match expressions for events +#[macro_export] +macro_rules! ev { + (http($status:expr)) => { + $crate::client::http::test_util::wire::RecordedEvent::Response( + $crate::client::http::test_util::wire::ReplayedEvent::HttpResponse { + status: $status, + .. + }, + ) + }; + (dns) => { + $crate::client::http::test_util::wire::RecordedEvent::DnsLookup(_) + }; + (connect) => { + $crate::client::http::test_util::wire::RecordedEvent::NewConnection + }; + (timeout) => { + $crate::client::http::test_util::wire::RecordedEvent::Response( + $crate::client::http::test_util::wire::ReplayedEvent::Timeout, + ) + }; +} + +pub use {ev, match_events, matcher}; + +#[non_exhaustive] +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum ReplayedEvent { + Timeout, + HttpResponse { status: u16, body: Bytes }, +} + +impl ReplayedEvent { + pub fn ok() -> Self { + Self::HttpResponse { + status: 200, + body: Bytes::new(), + } + } + + pub fn with_body(body: &str) -> Self { + Self::HttpResponse { + status: 200, + body: Bytes::copy_from_slice(body.as_ref()), + } + } + + pub fn status(status: u16) -> Self { + Self::HttpResponse { + status, + body: Bytes::new(), + } + } +} + +/// Test server that binds to 127.0.0.1:0 +/// +/// See the [module docs](crate::client::http::test_util::wire) for a usage example. +/// +/// Usage: +/// - Call [`WireMockServer::start`] to start the server +/// - Use [`WireMockServer::http_client`] or [`dns_resolver`](WireMockServer::dns_resolver) to configure your client. +/// - Make requests to [`endpoint_url`](WireMockServer::endpoint_url). +/// - Once the test is complete, retrieve a list of events from [`WireMockServer::events`] +#[derive(Debug)] +pub struct WireMockServer { + event_log: Arc>>, + bind_addr: SocketAddr, + // when the sender is dropped, that stops the server + shutdown_hook: oneshot::Sender<()>, +} + +impl WireMockServer { + /// Start a wire mock server with the given events to replay. + pub async fn start(mut response_events: Vec) -> Self { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let (tx, rx) = oneshot::channel(); + let listener_addr = listener.local_addr().unwrap(); + response_events.reverse(); + let response_events = Arc::new(Mutex::new(response_events)); + let handler_events = response_events; + let wire_events = Arc::new(Mutex::new(vec![])); + let wire_log_for_service = wire_events.clone(); + let poisoned_conns: Arc>> = Default::default(); + let make_service = make_service_fn(move |connection: &AddrStream| { + let poisoned_conns = poisoned_conns.clone(); + let events = handler_events.clone(); + let wire_log = wire_log_for_service.clone(); + let remote_addr = connection.remote_addr(); + tracing::info!("established connection: {:?}", connection); + wire_log.lock().unwrap().push(RecordedEvent::NewConnection); + async move { + Ok::<_, Infallible>(service_fn(move |_: Request| { + if poisoned_conns.lock().unwrap().contains(&remote_addr) { + tracing::error!("poisoned connection {:?} was reused!", &remote_addr); + panic!("poisoned connection was reused!"); + } + let next_event = events.clone().lock().unwrap().pop(); + let wire_log = wire_log.clone(); + let poisoned_conns = poisoned_conns.clone(); + async move { + let next_event = next_event + .unwrap_or_else(|| panic!("no more events! Log: {:?}", wire_log)); + wire_log + .lock() + .unwrap() + .push(RecordedEvent::Response(next_event.clone())); + if next_event == ReplayedEvent::Timeout { + tracing::info!("{} is poisoned", remote_addr); + poisoned_conns.lock().unwrap().insert(remote_addr); + } + tracing::debug!("replying with {:?}", next_event); + let event = generate_response_event(next_event).await; + dbg!(event) + } + })) + } + }); + let server = Server::from_tcp(listener) + .unwrap() + .serve(make_service) + .with_graceful_shutdown(async { + rx.await.ok(); + tracing::info!("server shutdown!"); + }); + spawn(server); + Self { + event_log: wire_events, + bind_addr: listener_addr, + shutdown_hook: tx, + } + } + + /// Retrieve the events recorded by this connection + pub fn events(&self) -> Vec { + self.event_log.lock().unwrap().clone() + } + + fn bind_addr(&self) -> SocketAddr { + self.bind_addr + } + + pub fn dns_resolver(&self) -> LoggingDnsResolver { + let event_log = self.event_log.clone(); + let bind_addr = self.bind_addr; + LoggingDnsResolver { + log: event_log, + socket_addr: bind_addr, + } + } + + /// Prebuilt [`HttpClient`](aws_smithy_runtime_api::client::http::HttpClient) with correctly wired DNS resolver. + /// + /// **Note**: This must be used in tandem with [`Self::dns_resolver`] + pub fn http_client(&self) -> SharedHttpClient { + HyperClientBuilder::new() + .build(hyper::client::HttpConnector::new_with_resolver( + self.dns_resolver(), + )) + .into_shared() + } + + /// Endpoint to use when connecting + /// + /// This works in tandem with the [`Self::dns_resolver`] to bind to the correct local IP Address + pub fn endpoint_url(&self) -> String { + format!( + "http://this-url-is-converted-to-localhost.com:{}", + self.bind_addr().port() + ) + } + + /// Shuts down the mock server. + pub fn shutdown(self) { + let _ = self.shutdown_hook.send(()); + } +} + +async fn generate_response_event(event: ReplayedEvent) -> Result, Infallible> { + let resp = match event { + ReplayedEvent::HttpResponse { status, body } => http::Response::builder() + .status(status) + .body(hyper::Body::from(body)) + .unwrap(), + ReplayedEvent::Timeout => { + Never::new().await; + unreachable!() + } + }; + Ok::<_, Infallible>(resp) +} + +/// DNS resolver that keeps a log of all lookups +/// +/// Regardless of what hostname is requested, it will always return the same socket address. +#[derive(Clone, Debug)] +pub struct LoggingDnsResolver { + log: Arc>>, + socket_addr: SocketAddr, +} + +impl Service for LoggingDnsResolver { + type Response = Once; + type Error = Infallible; + type Future = BoxFuture; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Name) -> Self::Future { + let socket_addr = self.socket_addr; + let log = self.log.clone(); + Box::pin(async move { + println!("looking up {:?}, replying with {:?}", req, socket_addr); + log.lock() + .unwrap() + .push(RecordedEvent::DnsLookup(req.to_string())); + Ok(std::iter::once(socket_addr)) + }) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 85fdd345647..576eab5cf34 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -16,7 +16,7 @@ use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream::ByteStream; use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::connectors::HttpConnector; +use aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings}; use aws_smithy_runtime_api::client::interceptors::context::{ Error, Input, InterceptorContext, Output, RewindResult, }; @@ -30,6 +30,7 @@ use aws_smithy_runtime_api::client::ser_de::{ RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, }; use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_types::timeout::TimeoutConfig; use std::mem; use tracing::{debug, debug_span, instrument, trace, Instrument}; @@ -356,10 +357,18 @@ async fn try_attempt( let response = halt_on_err!([ctx] => { let request = ctx.take_request().expect("set during serialization"); trace!(request = ?request, "transmitting request"); - let connector = halt_on_err!([ctx] => runtime_components.http_connector().ok_or_else(|| - OrchestratorError::other("No HTTP connector was available to send this request. \ - Enable the `rustls` crate feature or set a connector to fix this.") + let http_client = halt_on_err!([ctx] => runtime_components.http_client().ok_or_else(|| + OrchestratorError::other("No HTTP client was available to send this request. \ + Enable the `rustls` crate feature or configure a HTTP client to fix this.") )); + let timeout_config = cfg.load::().expect("timeout config must be set"); + let settings = { + let mut builder = HttpConnectorSettings::builder(); + builder.set_connect_timeout(timeout_config.connect_timeout()); + builder.set_read_timeout(timeout_config.read_timeout()); + builder.build() + }; + let connector = http_client.http_connector(&settings, runtime_components); connector.call(request).await.map_err(OrchestratorError::connector) }); trace!(response = ?response, "received response from service"); @@ -442,12 +451,12 @@ mod tests { use aws_smithy_runtime_api::client::auth::{ AuthSchemeOptionResolverParams, SharedAuthSchemeOptionResolver, }; - use aws_smithy_runtime_api::client::connectors::{ - HttpConnector, HttpConnectorFuture, SharedHttpConnector, - }; use aws_smithy_runtime_api::client::endpoint::{ EndpointResolverParams, SharedEndpointResolver, }; + use aws_smithy_runtime_api::client::http::{ + http_client_fn, HttpConnector, HttpConnectorFuture, + }; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut, BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut, @@ -460,6 +469,7 @@ mod tests { use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins}; + use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use std::borrow::Cow; use std::sync::atomic::{AtomicBool, Ordering}; @@ -515,7 +525,9 @@ mod tests { .with_endpoint_resolver(Some(SharedEndpointResolver::new( StaticUriEndpointResolver::http_localhost(8080), ))) - .with_http_connector(Some(SharedHttpConnector::new(OkConnector::new()))) + .with_http_client(Some(http_client_fn(|_, _| { + OkConnector::new().into_shared() + }))) .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), ))), @@ -530,6 +542,7 @@ mod tests { layer.store_put(EndpointResolverParams::new("dontcare")); layer.store_put(SharedRequestSerializer::new(new_request_serializer())); layer.store_put(SharedResponseDeserializer::new(new_response_deserializer())); + layer.store_put(TimeoutConfig::builder().build()); Some(layer.freeze()) } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index 3c483ca5939..9c4e71237c9 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -4,29 +4,30 @@ */ use crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID}; -use crate::client::connectors::connection_poisoning::ConnectionPoisoningInterceptor; +use crate::client::http::connection_poisoning::ConnectionPoisoningInterceptor; +use crate::client::http::default_http_client_plugin; use crate::client::identity::no_auth::NoAuthIdentityResolver; use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_async::rt::sleep::AsyncSleep; +use aws_smithy_async::time::TimeSource; use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ AuthSchemeOptionResolverParams, SharedAuthScheme, SharedAuthSchemeOptionResolver, }; -use aws_smithy_runtime_api::client::connectors::SharedHttpConnector; use aws_smithy_runtime_api::client::endpoint::{EndpointResolverParams, SharedEndpointResolver}; +use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::client::identity::SharedIdentityResolver; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output}; -use aws_smithy_runtime_api::client::interceptors::SharedInterceptor; +use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError}; use aws_smithy_runtime_api::client::retries::{RetryClassifiers, SharedRetryStrategy}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{ - RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin, + RuntimePlugin, RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin, }; use aws_smithy_runtime_api::client::ser_de::{ RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, @@ -34,6 +35,7 @@ use aws_smithy_runtime_api::client::ser_de::{ use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; +use aws_smithy_types::timeout::TimeoutConfig; use std::borrow::Cow; use std::fmt; use std::marker::PhantomData; @@ -190,8 +192,8 @@ impl OperationBuilder { self } - pub fn http_connector(mut self, connector: impl IntoShared) -> Self { - self.runtime_components.set_http_connector(Some(connector)); + pub fn http_client(mut self, connector: impl HttpClient + 'static) -> Self { + self.runtime_components.set_http_client(Some(connector)); self } @@ -217,6 +219,7 @@ impl OperationBuilder { } pub fn standard_retry(mut self, retry_config: &RetryConfig) -> Self { + self.config.store_put(retry_config.clone()); self.runtime_components .set_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new( retry_config, @@ -224,6 +227,11 @@ impl OperationBuilder { self } + pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self { + self.config.store_put(timeout_config); + self + } + pub fn no_auth(mut self) -> Self { self.config .store_put(AuthSchemeOptionResolverParams::new(())); @@ -240,17 +248,19 @@ impl OperationBuilder { self } - pub fn sleep_impl(mut self, async_sleep: SharedAsyncSleep) -> Self { - self.runtime_components.set_sleep_impl(Some(async_sleep)); + pub fn sleep_impl(mut self, async_sleep: impl AsyncSleep + 'static) -> Self { + self.runtime_components + .set_sleep_impl(Some(async_sleep.into_shared())); self } - pub fn time_source(mut self, time_source: SharedTimeSource) -> Self { - self.runtime_components.set_time_source(Some(time_source)); + pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { + self.runtime_components + .set_time_source(Some(time_source.into_shared())); self } - pub fn interceptor(mut self, interceptor: impl IntoShared) -> Self { + pub fn interceptor(mut self, interceptor: impl Interceptor + 'static) -> Self { self.runtime_components.push_interceptor(interceptor); self } @@ -260,7 +270,7 @@ impl OperationBuilder { self.interceptor(ConnectionPoisoningInterceptor::new()) } - pub fn runtime_plugin(mut self, runtime_plugin: impl IntoShared) -> Self { + pub fn runtime_plugin(mut self, runtime_plugin: impl RuntimePlugin + 'static) -> Self { self.runtime_plugins.push(runtime_plugin.into_shared()); self } @@ -312,11 +322,13 @@ impl OperationBuilder { pub fn build(self) -> Operation { let service_name = self.service_name.expect("service_name required"); let operation_name = self.operation_name.expect("operation_name required"); - let mut runtime_plugins = RuntimePlugins::new().with_client_plugin( - StaticRuntimePlugin::new() - .with_config(self.config.freeze()) - .with_runtime_components(self.runtime_components), - ); + let mut runtime_plugins = RuntimePlugins::new() + .with_client_plugin(default_http_client_plugin()) + .with_client_plugin( + StaticRuntimePlugin::new() + .with_config(self.config.freeze()) + .with_runtime_components(self.runtime_components), + ); for runtime_plugin in self.runtime_plugins { runtime_plugins = runtime_plugins.with_client_plugin(runtime_plugin); } @@ -329,8 +341,8 @@ impl OperationBuilder { .expect("the runtime plugins should succeed"); assert!( - components.http_connector().is_some(), - "a http_connector is required" + components.http_client().is_some(), + "a http_client is required. Enable the `rustls` crate feature or configure a HTTP client to fix this." ); assert!( components.endpoint_resolver().is_some(), @@ -352,6 +364,10 @@ impl OperationBuilder { config.load::().is_some(), "endpoint resolver params are required" ); + assert!( + config.load::().is_some(), + "timeout config is required" + ); } Operation { @@ -366,7 +382,7 @@ impl OperationBuilder { #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; - use crate::client::connectors::test_util::{capture_request, ConnectionEvent, EventConnector}; + use crate::client::http::test_util::{capture_request, ReplayEvent, StaticReplayClient}; use crate::client::retries::classifier::HttpStatusCodeClassifier; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_http::body::SdkBody; @@ -384,10 +400,11 @@ mod tests { let operation = Operation::builder() .service_name("test") .operation_name("test") - .http_connector(SharedHttpConnector::new(connector)) + .http_client(connector) .endpoint_url("http://localhost:1234") .no_auth() .no_retry() + .timeout_config(TimeoutConfig::disabled()) .serializer(|input: String| { Ok(http::Request::builder() .body(SdkBody::from(input.as_bytes())) @@ -414,41 +431,39 @@ mod tests { #[tokio::test] async fn operation_retries() { - let connector = EventConnector::new( - vec![ - ConnectionEvent::new( - http::Request::builder() - .uri("http://localhost:1234/") - .body(SdkBody::from(&b"what are you?"[..])) - .unwrap(), - http::Response::builder() - .status(503) - .body(SdkBody::from(&b""[..])) - .unwrap(), - ), - ConnectionEvent::new( - http::Request::builder() - .uri("http://localhost:1234/") - .body(SdkBody::from(&b"what are you?"[..])) - .unwrap(), - http::Response::builder() - .status(418) - .body(SdkBody::from(&b"I'm a teapot!"[..])) - .unwrap(), - ), - ], - SharedAsyncSleep::new(TokioSleep::new()), - ); + let connector = StaticReplayClient::new(vec![ + ReplayEvent::new( + http::Request::builder() + .uri("http://localhost:1234/") + .body(SdkBody::from(&b"what are you?"[..])) + .unwrap(), + http::Response::builder() + .status(503) + .body(SdkBody::from(&b""[..])) + .unwrap(), + ), + ReplayEvent::new( + http::Request::builder() + .uri("http://localhost:1234/") + .body(SdkBody::from(&b"what are you?"[..])) + .unwrap(), + http::Response::builder() + .status(418) + .body(SdkBody::from(&b"I'm a teapot!"[..])) + .unwrap(), + ), + ]); let operation = Operation::builder() .service_name("test") .operation_name("test") - .http_connector(SharedHttpConnector::new(connector.clone())) + .http_client(connector.clone()) .endpoint_url("http://localhost:1234") .no_auth() .retry_classifiers( RetryClassifiers::new().with_classifier(HttpStatusCodeClassifier::default()), ) .standard_retry(&RetryConfig::standard()) + .timeout_config(TimeoutConfig::disabled()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .serializer(|input: String| { Ok(http::Request::builder() diff --git a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs index c149878dda8..e2e26418ebb 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs @@ -5,7 +5,7 @@ use aws_smithy_async::future::timeout::Timeout; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_client::SdkError; +use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; diff --git a/tools/ci-resources/tls-stub/Cargo.toml b/tools/ci-resources/tls-stub/Cargo.toml index aea6e0a76d0..a70780c482d 100644 --- a/tools/ci-resources/tls-stub/Cargo.toml +++ b/tools/ci-resources/tls-stub/Cargo.toml @@ -13,7 +13,7 @@ publish = false aws-config = {path = "../../../aws/sdk/build/aws-sdk/sdk/aws-config", features = ["client-hyper"] } aws-credential-types = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-credential-types", features = ["hardcoded-credentials"] } aws-sdk-sts = { path = "../../../aws/sdk/build/aws-sdk/sdk/sts" } -aws-smithy-client = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-smithy-client", features = ["client-hyper", "rustls"] } +aws-smithy-runtime = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } exitcode = "1" hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"] } rustls = "0.21" diff --git a/tools/ci-resources/tls-stub/src/main.rs b/tools/ci-resources/tls-stub/src/main.rs index 8daebc5a7d2..f674d0116b0 100644 --- a/tools/ci-resources/tls-stub/src/main.rs +++ b/tools/ci-resources/tls-stub/src/main.rs @@ -11,6 +11,7 @@ use std::time::Duration; use aws_config::timeout::TimeoutConfig; use aws_credential_types::Credentials; use aws_sdk_sts::error::SdkError; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; #[cfg(debug_assertions)] use x509_parser::prelude::*; @@ -103,15 +104,15 @@ async fn create_client( .unwrap() .with_root_certificates(roots) .with_no_client_auth(); - let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() .with_tls_config(tls_config) .https_only() .enable_http1() .enable_http2() .build(); - let smithy_connector = aws_smithy_client::hyper_ext::Adapter::builder().build(https_connector); + let http_client = HyperClientBuilder::new().build(tls_connector); let sdk_config = aws_config::from_env() - .http_connector(smithy_connector) + .http_client(http_client) .credentials_provider(credentials) .region("us-nether-1") .endpoint_url(format!("https://{host}:{port}")) From 08196ec8934bbbfacf861c442f280a21d7c3e836 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 9 Oct 2023 10:13:22 -0700 Subject: [PATCH 156/331] Remove remaining middleware code (#3038) This PR removes the remaining rust-runtime code to support middleware, deprecates empty crates, and removes the remaining codegen references to any of that code. In the interest of keeping code review easier, a separate PR will finish addressing the remaining `TODO(enableNewSmithyRuntime)` comments. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 + aws/rust-runtime/aws-endpoint/Cargo.toml | 9 +- aws/rust-runtime/aws-endpoint/README.md | 3 +- .../aws-endpoint/external-types.toml | 6 +- aws/rust-runtime/aws-endpoint/src/lib.rs | 238 +----- aws/rust-runtime/aws-http/Cargo.toml | 14 +- aws/rust-runtime/aws-http/external-types.toml | 9 +- aws/rust-runtime/aws-http/src/auth.rs | 201 ----- aws/rust-runtime/aws-http/src/lib.rs | 9 - .../aws-http/src/recursion_detection.rs | 173 ---- aws/rust-runtime/aws-http/src/request_id.rs | 26 +- aws/rust-runtime/aws-http/src/retry.rs | 285 ------- aws/rust-runtime/aws-http/src/user_agent.rs | 143 +--- aws/rust-runtime/aws-hyper/README.md | 2 +- aws/rust-runtime/aws-hyper/src/lib.rs | 2 +- aws/rust-runtime/aws-inlineable/Cargo.toml | 12 +- aws/rust-runtime/aws-inlineable/src/lib.rs | 3 - ...e53_resource_id_preprocessor_middleware.rs | 84 -- .../aws-inlineable/src/s3_request_id.rs | 20 +- aws/rust-runtime/aws-sig-auth/Cargo.toml | 24 +- aws/rust-runtime/aws-sig-auth/README.md | 3 +- .../aws-sig-auth/src/event_stream.rs | 251 ------ aws/rust-runtime/aws-sig-auth/src/lib.rs | 117 +-- .../aws-sig-auth/src/middleware.rs | 369 --------- aws/rust-runtime/aws-sig-auth/src/signer.rs | 278 ------- aws/rust-runtime/aws-sigv4/README.md | 4 +- .../smithy/rustsdk/AwsCargoDependency.kt | 3 - .../rustsdk/AwsFluentClientDecorator.kt | 14 - .../amazon/smithy/rustsdk/AwsRuntimeType.kt | 15 - .../endpoints/OperationInputTestGenerator.kt | 2 +- aws/sdk/integration-tests/Makefile | 6 + aws/sdk/integration-tests/iam/Cargo.toml | 1 - aws/sdk/integration-tests/test.sh | 16 + .../timestreamquery/tests/endpoint_disco.rs | 3 +- .../customizations/HttpAuthDecorator.kt | 2 - .../HttpConnectorConfigDecorator.kt | 1 - .../smithy/generators/PaginatorGenerator.kt | 1 - .../client/FluentClientDecorator.kt | 2 +- .../client/FluentClientGenerator.kt | 23 +- .../codegen/core/rustlang/CargoDependency.kt | 5 - .../rust/codegen/core/smithy/RuntimeType.kt | 11 - .../ServerRequiredCustomizations.kt | 3 - .../tests/plugins_execution_order.rs | 12 - .../pokemon-service-tls/tests/common/mod.rs | 4 +- examples/pokemon-service/Cargo.toml | 1 - rust-runtime/aws-smithy-client/Cargo.toml | 59 +- rust-runtime/aws-smithy-client/README.md | 8 +- rust-runtime/aws-smithy-client/additional-ci | 19 - .../aws-smithy-client/external-types.toml | 43 +- rust-runtime/aws-smithy-client/src/bounds.rs | 168 ---- rust-runtime/aws-smithy-client/src/builder.rs | 567 ------------- rust-runtime/aws-smithy-client/src/conns.rs | 220 ----- rust-runtime/aws-smithy-client/src/dvr.rs | 277 ------- .../aws-smithy-client/src/dvr/record.rs | 226 ------ .../aws-smithy-client/src/dvr/replay.rs | 365 --------- rust-runtime/aws-smithy-client/src/erase.rs | 240 ------ .../aws-smithy-client/src/erase/boxclone.rs | 173 ---- .../aws-smithy-client/src/http_connector.rs | 159 ---- .../aws-smithy-client/src/hyper_ext.rs | 762 ------------------ rust-runtime/aws-smithy-client/src/lib.rs | 251 +----- rust-runtime/aws-smithy-client/src/never.rs | 157 ---- rust-runtime/aws-smithy-client/src/poison.rs | 143 ---- rust-runtime/aws-smithy-client/src/retry.rs | 614 -------------- .../aws-smithy-client/src/static_tests.rs | 116 --- .../aws-smithy-client/src/test_connection.rs | 728 ----------------- rust-runtime/aws-smithy-client/src/timeout.rs | 266 ------ .../test-data/example.com.json | 106 --- .../aws-smithy-client/tests/e2e_test.rs | 114 --- .../tests/reconnect_on_transient_error.rs | 229 ------ .../tests/test_operation/mod.rs | 84 -- rust-runtime/aws-smithy-http-auth/Cargo.toml | 3 +- rust-runtime/aws-smithy-http-auth/README.md | 2 +- .../aws-smithy-http-auth/src/api_key.rs | 74 -- .../aws-smithy-http-auth/src/definition.rs | 251 ------ .../aws-smithy-http-auth/src/error.rs | 42 - rust-runtime/aws-smithy-http-auth/src/lib.rs | 12 +- .../aws-smithy-http-auth/src/location.rs | 73 -- rust-runtime/aws-smithy-http-tower/Cargo.toml | 16 +- rust-runtime/aws-smithy-http-tower/README.md | 2 +- .../aws-smithy-http-tower/external-types.toml | 13 +- .../aws-smithy-http-tower/src/dispatch.rs | 85 -- rust-runtime/aws-smithy-http-tower/src/lib.rs | 127 +-- .../aws-smithy-http-tower/src/map_request.rs | 162 ---- .../src/parse_response.rs | 105 --- rust-runtime/aws-smithy-http/src/endpoint.rs | 1 - .../src/endpoint/middleware.rs | 87 -- rust-runtime/aws-smithy-http/src/http.rs | 10 - rust-runtime/aws-smithy-http/src/lib.rs | 4 - .../aws-smithy-http/src/middleware.rs | 177 ---- rust-runtime/aws-smithy-http/src/operation.rs | 312 +------ .../aws-smithy-http/src/property_bag.rs | 293 ------- rust-runtime/aws-smithy-http/src/response.rs | 137 ---- rust-runtime/aws-smithy-http/src/result.rs | 26 +- rust-runtime/aws-smithy-http/src/retry.rs | 215 ----- .../src/client/http/connection_poisoning.rs | 11 +- 95 files changed, 108 insertions(+), 10648 deletions(-) delete mode 100644 aws/rust-runtime/aws-http/src/auth.rs delete mode 100644 aws/rust-runtime/aws-http/src/recursion_detection.rs delete mode 100644 aws/rust-runtime/aws-http/src/retry.rs delete mode 100644 aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs delete mode 100644 aws/rust-runtime/aws-sig-auth/src/event_stream.rs delete mode 100644 aws/rust-runtime/aws-sig-auth/src/middleware.rs delete mode 100644 aws/rust-runtime/aws-sig-auth/src/signer.rs create mode 100644 aws/sdk/integration-tests/Makefile create mode 100755 aws/sdk/integration-tests/test.sh delete mode 100755 rust-runtime/aws-smithy-client/additional-ci delete mode 100644 rust-runtime/aws-smithy-client/src/bounds.rs delete mode 100644 rust-runtime/aws-smithy-client/src/builder.rs delete mode 100644 rust-runtime/aws-smithy-client/src/conns.rs delete mode 100644 rust-runtime/aws-smithy-client/src/dvr.rs delete mode 100644 rust-runtime/aws-smithy-client/src/dvr/record.rs delete mode 100644 rust-runtime/aws-smithy-client/src/dvr/replay.rs delete mode 100644 rust-runtime/aws-smithy-client/src/erase.rs delete mode 100644 rust-runtime/aws-smithy-client/src/erase/boxclone.rs delete mode 100644 rust-runtime/aws-smithy-client/src/http_connector.rs delete mode 100644 rust-runtime/aws-smithy-client/src/hyper_ext.rs delete mode 100644 rust-runtime/aws-smithy-client/src/never.rs delete mode 100644 rust-runtime/aws-smithy-client/src/poison.rs delete mode 100644 rust-runtime/aws-smithy-client/src/retry.rs delete mode 100644 rust-runtime/aws-smithy-client/src/static_tests.rs delete mode 100644 rust-runtime/aws-smithy-client/src/test_connection.rs delete mode 100644 rust-runtime/aws-smithy-client/src/timeout.rs delete mode 100644 rust-runtime/aws-smithy-client/test-data/example.com.json delete mode 100644 rust-runtime/aws-smithy-client/tests/e2e_test.rs delete mode 100644 rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs delete mode 100644 rust-runtime/aws-smithy-client/tests/test_operation/mod.rs delete mode 100644 rust-runtime/aws-smithy-http-auth/src/api_key.rs delete mode 100644 rust-runtime/aws-smithy-http-auth/src/definition.rs delete mode 100644 rust-runtime/aws-smithy-http-auth/src/error.rs delete mode 100644 rust-runtime/aws-smithy-http-auth/src/location.rs delete mode 100644 rust-runtime/aws-smithy-http-tower/src/dispatch.rs delete mode 100644 rust-runtime/aws-smithy-http-tower/src/map_request.rs delete mode 100644 rust-runtime/aws-smithy-http-tower/src/parse_response.rs delete mode 100644 rust-runtime/aws-smithy-http/src/endpoint/middleware.rs delete mode 100644 rust-runtime/aws-smithy-http/src/middleware.rs delete mode 100644 rust-runtime/aws-smithy-http/src/property_bag.rs delete mode 100644 rust-runtime/aws-smithy-http/src/response.rs delete mode 100644 rust-runtime/aws-smithy-http/src/retry.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 53ee76961ad..afe79f7a132 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -17,6 +17,12 @@ references = ["smithy-rs#3011"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" +[[smithy-rs]] +message = "The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/awslabs/smithy-rs/discussions/2887)." +references = ["smithy-rs#3038"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + [[aws-sdk-rust]] message = "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details." references = ["smithy-rs#3011"] @@ -279,3 +285,9 @@ message = "STS and SSO-based credential providers will now respect both `use_fip references = ["aws-sdk-rust#882", "smithy-rs#3007"] meta = { "breaking" = true, "tada" = true, "bug" = true } author = "Velfi" + +[[smithy-rs]] +message = "`SdkError` is no longer re-exported in generated server crates." +references = ["smithy-rs#3038"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-endpoint/Cargo.toml b/aws/rust-runtime/aws-endpoint/Cargo.toml index 5a6846d2d6b..75d1f7a1c1e 100644 --- a/aws/rust-runtime/aws-endpoint/Cargo.toml +++ b/aws/rust-runtime/aws-endpoint/Cargo.toml @@ -2,18 +2,11 @@ name = "aws-endpoint" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "AWS SDK endpoint support." +description = "This crate is no longer used by the AWS SDK and is deprecated." edition = "2021" license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" -[dependencies] -aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types"} -aws-types = { path = "../aws-types" } -http = "0.2.3" -tracing = "0.1" - [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/aws/rust-runtime/aws-endpoint/README.md b/aws/rust-runtime/aws-endpoint/README.md index d4405ac7fad..ac8e3940e92 100644 --- a/aws/rust-runtime/aws-endpoint/README.md +++ b/aws/rust-runtime/aws-endpoint/README.md @@ -1,5 +1,6 @@ # aws-endpoint -This crate defines endpoint resolution logic specific to AWS services. + +This crate is no longer used by the AWS SDK and is deprecated. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-endpoint/external-types.toml b/aws/rust-runtime/aws-endpoint/external-types.toml index a121d9e1236..7fa182b39d1 100644 --- a/aws/rust-runtime/aws-endpoint/external-types.toml +++ b/aws/rust-runtime/aws-endpoint/external-types.toml @@ -1,5 +1 @@ -allowed_external_types = [ - "aws_types::*", - "aws_smithy_http::property_bag::PropertyBag", - "aws_smithy_http::middleware::MapRequest", -] +allowed_external_types = [] diff --git a/aws/rust-runtime/aws-endpoint/src/lib.rs b/aws/rust-runtime/aws-endpoint/src/lib.rs index 640e4a87874..2819d851189 100644 --- a/aws/rust-runtime/aws-endpoint/src/lib.rs +++ b/aws/rust-runtime/aws-endpoint/src/lib.rs @@ -3,240 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -#![allow(clippy::derive_partial_eq_without_eq)] - -use std::error::Error; -use std::fmt; - -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; -use aws_smithy_types::endpoint::Endpoint as SmithyEndpoint; -use aws_smithy_types::Document; - -use aws_types::region::{Region, SigningRegion}; -use aws_types::SigningName; - -/// Middleware Stage to add authentication information from a Smithy endpoint into the property bag -/// -/// AwsAuthStage implements [`MapRequest`](MapRequest). It will: -/// 1. Load an endpoint from the property bag -/// 2. Set the `SigningRegion` and `SigningName` in the property bag to drive downstream -/// signing middleware. -#[derive(Clone, Debug)] -pub struct AwsAuthStage; - -#[derive(Debug)] -enum AwsAuthStageErrorKind { - NoEndpointResolver, - EndpointResolutionError(Box), -} - -#[derive(Debug)] -pub struct AwsAuthStageError { - kind: AwsAuthStageErrorKind, -} - -impl fmt::Display for AwsAuthStageError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use AwsAuthStageErrorKind::*; - match &self.kind { - NoEndpointResolver => write!(f, "endpoint resolution failed: no endpoint present"), - EndpointResolutionError(_) => write!(f, "endpoint resolution failed"), - } - } -} - -impl Error for AwsAuthStageError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - use AwsAuthStageErrorKind::*; - match &self.kind { - EndpointResolutionError(source) => Some(source.as_ref() as _), - NoEndpointResolver => None, - } - } -} - -impl From for AwsAuthStageError { - fn from(kind: AwsAuthStageErrorKind) -> Self { - Self { kind } - } -} - -impl MapRequest for AwsAuthStage { - type Error = AwsAuthStageError; - - fn name(&self) -> &'static str { - "resolve_endpoint" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|http_req, props| { - let endpoint = props - .get::() - .ok_or(AwsAuthStageErrorKind::NoEndpointResolver)?; - let (signing_region_override, signing_name_override) = smithy_to_aws(endpoint) - .map_err(|err| AwsAuthStageErrorKind::EndpointResolutionError(err))?; - - if let Some(signing_region) = signing_region_override { - props.insert(signing_region); - } - if let Some(signing_name) = signing_name_override { - props.insert(signing_name); - } - Ok(http_req) - }) - } -} - -type EndpointMetadata = (Option, Option); - -fn smithy_to_aws(value: &SmithyEndpoint) -> Result> { - // look for v4 as an auth scheme - let auth_schemes = match value.properties().get("authSchemes") { - Some(Document::Array(schemes)) => schemes, - // no auth schemes: - None => return Ok((None, None)), - _other => return Err("expected an array for authSchemes".into()), - }; - let auth_schemes = auth_schemes - .iter() - .flat_map(|doc| match doc { - Document::Object(map) => Some(map), - _ => None, - }) - .map(|it| { - let name = match it.get("name") { - Some(Document::String(s)) => Some(s.as_str()), - _ => None, - }; - (name, it) - }); - let (_, v4) = auth_schemes - .clone() - .find(|(name, _doc)| name.as_deref() == Some("sigv4")) - .ok_or_else(|| { - format!( - "No auth schemes were supported. The Rust SDK only supports sigv4. \ - The authentication schemes supported by this endpoint were: {:?}", - auth_schemes.flat_map(|(name, _)| name).collect::>() - ) - })?; - - let signing_scope = match v4.get("signingRegion") { - Some(Document::String(s)) => Some(SigningRegion::from(Region::new(s.clone()))), - None => None, - _ => return Err("unexpected type".into()), - }; - let signing_name = match v4.get("signingName") { - Some(Document::String(s)) => Some(SigningName::from(s.to_string())), - None => None, - _ => return Err("unexpected type".into()), - }; - Ok((signing_scope, signing_name)) -} - -#[cfg(test)] -mod test { - use std::collections::HashMap; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use aws_smithy_types::endpoint::Endpoint; - use aws_smithy_types::Document; - use http::header::HOST; - - use aws_types::region::{Region, SigningRegion}; - use aws_types::SigningName; - - use crate::AwsAuthStage; - - #[test] - fn default_endpoint_updates_request() { - let endpoint = Endpoint::builder() - .url("kinesis.us-east-1.amazon.com") - .build(); - let req = http::Request::new(SdkBody::from("")); - let region = Region::new("us-east-1"); - let mut req = operation::Request::new(req); - { - let mut props = req.properties_mut(); - props.insert(SigningRegion::from(region.clone())); - props.insert(SigningName::from_static("kinesis")); - props.insert(endpoint); - }; - let req = AwsAuthStage.apply(req).expect("should succeed"); - assert_eq!(req.properties().get(), Some(&SigningRegion::from(region))); - assert_eq!( - req.properties().get(), - Some(&SigningName::from_static("kinesis")) - ); - - assert!(req.http().headers().get(HOST).is_none()); - assert!( - req.properties().get::().is_some(), - "Endpoint middleware MUST leave the result in the bag" - ); - } - - #[test] - fn sets_service_override_when_set() { - let endpoint = Endpoint::builder() - .url("kinesis.us-east-override.amazon.com") - .property( - "authSchemes", - vec![Document::Object({ - let mut out = HashMap::new(); - out.insert("name".to_string(), "sigv4".to_string().into()); - out.insert( - "signingName".to_string(), - "qldb-override".to_string().into(), - ); - out.insert( - "signingRegion".to_string(), - "us-east-override".to_string().into(), - ); - out - })], - ) - .build(); - let req = http::Request::new(SdkBody::from("")); - let region = Region::new("us-east-1"); - let mut req = operation::Request::new(req); - { - let mut props = req.properties_mut(); - props.insert(region); - props.insert(SigningName::from_static("qldb")); - props.insert(endpoint); - }; - let req = AwsAuthStage.apply(req).expect("should succeed"); - assert_eq!( - req.properties().get(), - Some(&SigningRegion::from_static("us-east-override")) - ); - assert_eq!( - req.properties().get(), - Some(&SigningName::from_static("qldb-override")) - ); - } - - #[test] - fn supports_fallback_when_scope_is_unset() { - let endpoint = Endpoint::builder().url("www.service.com").build(); - let req = http::Request::new(SdkBody::from("")); - let region = SigningRegion::from_static("us-east-1"); - let mut req = operation::Request::new(req); - { - let mut props = req.properties_mut(); - props.insert(region.clone()); - props.insert(SigningName::from_static("qldb")); - props.insert(endpoint); - }; - let req = AwsAuthStage.apply(req).expect("should succeed"); - assert_eq!(req.properties().get(), Some(®ion)); - assert_eq!( - req.properties().get(), - Some(&SigningName::from_static("qldb")) - ); - } -} +//! This crate is no longer used by the AWS SDK and is deprecated. diff --git a/aws/rust-runtime/aws-http/Cargo.toml b/aws/rust-runtime/aws-http/Cargo.toml index fc25360575a..9c6e1eb37e8 100644 --- a/aws/rust-runtime/aws-http/Cargo.toml +++ b/aws/rust-runtime/aws-http/Cargo.toml @@ -8,7 +8,6 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [dependencies] -aws-credential-types = { path = "../aws-credential-types" } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-types = { path = "../aws-types" } @@ -16,22 +15,11 @@ bytes = "1.1" http = "0.2.3" http-body = "0.4.5" tracing = "0.1" -percent-encoding = "2.1.0" pin-project-lite = "0.2.9" [dev-dependencies] -async-trait = "0.1.50" -aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } -aws-smithy-checksums = { path = "../../../rust-runtime/aws-smithy-checksums" } -aws-smithy-protocol-test = { path = "../../../rust-runtime/aws-smithy-protocol-test" } bytes-utils = "0.1.2" -env_logger = "0.9" -tokio = { version = "1.23.1", features = ["macros", "rt", "rt-multi-thread", "test-util", "time"] } -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -proptest = "1.2" -serde = { version = "1", features = ["derive"]} -serde_json = "1" +tokio = { version = "1.23.1", features = ["macros", "rt", "time"] } [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-http/external-types.toml b/aws/rust-runtime/aws-http/external-types.toml index d2e362f5156..88240dcad00 100644 --- a/aws/rust-runtime/aws-http/external-types.toml +++ b/aws/rust-runtime/aws-http/external-types.toml @@ -1,8 +1,9 @@ allowed_external_types = [ - "aws_credential_types::*", - "aws_smithy_http::*", - "aws_smithy_types::*", - "aws_types::*", + "aws_smithy_http::body::Error", + "aws_smithy_types::config_bag::storable::Storable", + "aws_smithy_types::config_bag::storable::StoreReplace", + "aws_types::app_name::AppName", + "aws_types::os_shim_internal::Env", "bytes::bytes::Bytes", "http_body::Body", ] diff --git a/aws/rust-runtime/aws-http/src/auth.rs b/aws/rust-runtime/aws-http/src/auth.rs deleted file mode 100644 index 98e0e219bb0..00000000000 --- a/aws/rust-runtime/aws-http/src/auth.rs +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_credential_types::cache::{ProvideCachedCredentials, SharedCredentialsCache}; -use aws_credential_types::provider::error::CredentialsError; -use aws_smithy_http::middleware::AsyncMapRequest; -use aws_smithy_http::operation::Request; -use aws_smithy_http::property_bag::PropertyBag; -use std::future::Future; -use std::pin::Pin; - -/// Sets the credentials cache in the given property bag. -pub fn set_credentials_cache(bag: &mut PropertyBag, cache: SharedCredentialsCache) { - bag.insert(cache); -} - -/// Middleware stage that loads credentials from a [SharedCredentialsCache](aws_credential_types::cache::SharedCredentialsCache) -/// and places them in the property bag of the request. -/// -/// [CredentialsStage] implements [`AsyncMapRequest`](aws_smithy_http::middleware::AsyncMapRequest), and: -/// 1. Retrieves a `SharedCredentialsCache` from the property bag. -/// 2. Calls the credential cache's `provide_cached_credentials` and awaits its result. -/// 3. Places returned `Credentials` into the property bag to drive downstream signing middleware. -#[derive(Clone, Debug, Default)] -#[non_exhaustive] -pub struct CredentialsStage; - -impl CredentialsStage { - /// Creates a new credentials stage. - pub fn new() -> Self { - CredentialsStage - } - - async fn load_creds(mut request: Request) -> Result { - let credentials_cache = request - .properties() - .get::() - .cloned(); - let credentials_cache = match credentials_cache { - Some(credentials_cache) => credentials_cache, - None => { - tracing::info!("no credentials cache for request"); - return Ok(request); - } - }; - match credentials_cache.provide_cached_credentials().await { - Ok(creds) => { - request.properties_mut().insert(creds); - } - // ignore the case where there is no credentials cache wired up - Err(CredentialsError::CredentialsNotLoaded { .. }) => { - tracing::info!("credentials cache returned CredentialsNotLoaded, ignoring") - } - // if we get another error class, there is probably something actually wrong that the user will - // want to know about - Err(other) => return Err(other.into()), - } - Ok(request) - } -} - -mod error { - use aws_credential_types::provider::error::CredentialsError; - use std::error::Error as StdError; - use std::fmt; - - /// Failures that can occur in the credentials middleware. - #[derive(Debug)] - pub struct CredentialsStageError { - source: CredentialsError, - } - - impl StdError for CredentialsStageError { - fn source(&self) -> Option<&(dyn StdError + 'static)> { - Some(&self.source as _) - } - } - - impl fmt::Display for CredentialsStageError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "failed to load credentials from the credentials cache") - } - } - - impl From for CredentialsStageError { - fn from(source: CredentialsError) -> Self { - CredentialsStageError { source } - } - } -} - -pub use error::*; - -type BoxFuture = Pin + Send>>; - -impl AsyncMapRequest for CredentialsStage { - type Error = CredentialsStageError; - type Future = Pin> + Send + 'static>>; - - fn name(&self) -> &'static str { - "retrieve_credentials" - } - - fn apply(&self, request: Request) -> BoxFuture> { - Box::pin(Self::load_creds(request)) - } -} - -#[cfg(test)] -mod tests { - use super::set_credentials_cache; - use super::CredentialsStage; - use aws_credential_types::cache::{ - CredentialsCache, ProvideCachedCredentials, SharedCredentialsCache, - }; - use aws_credential_types::credential_fn::provide_credentials_fn; - use aws_credential_types::provider::SharedCredentialsProvider; - use aws_credential_types::provider::{error::CredentialsError, future}; - use aws_credential_types::Credentials; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::AsyncMapRequest; - use aws_smithy_http::operation; - - #[derive(Debug)] - struct Unhandled; - impl ProvideCachedCredentials for Unhandled { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::ready(Err(CredentialsError::unhandled("whoops"))) - } - } - - #[derive(Debug)] - struct NoCreds; - impl ProvideCachedCredentials for NoCreds { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::ready(Err(CredentialsError::not_loaded("no creds"))) - } - } - - #[tokio::test] - async fn no_credential_cache_is_ok() { - let req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - CredentialsStage::new() - .apply(req) - .await - .expect("no credentials cache should not populate credentials"); - } - - #[tokio::test] - async fn credentials_cache_failure_is_failure() { - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - set_credentials_cache( - &mut req.properties_mut(), - SharedCredentialsCache::new(Unhandled), - ); - CredentialsStage::new() - .apply(req) - .await - .expect_err("no credentials cache should not populate credentials"); - } - - #[tokio::test] - async fn credentials_not_loaded_is_ok() { - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - set_credentials_cache( - &mut req.properties_mut(), - SharedCredentialsCache::new(NoCreds), - ); - CredentialsStage::new() - .apply(req) - .await - .expect("credentials not loaded is OK"); - } - - #[tokio::test] - async fn async_map_request_apply_populates_credentials() { - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - let credentials_cache = CredentialsCache::lazy_builder() - .into_credentials_cache() - .create_cache(SharedCredentialsProvider::new(provide_credentials_fn( - || async { Ok(Credentials::for_tests()) }, - ))); - set_credentials_cache(&mut req.properties_mut(), credentials_cache); - let req = CredentialsStage::new() - .apply(req) - .await - .expect("credentials cache is in the bag; should succeed"); - assert!( - req.properties().get::().is_some(), - "it should set credentials on the request config" - ); - } -} diff --git a/aws/rust-runtime/aws-http/src/lib.rs b/aws/rust-runtime/aws-http/src/lib.rs index d5307bcba3d..4c0f72080f3 100644 --- a/aws/rust-runtime/aws-http/src/lib.rs +++ b/aws/rust-runtime/aws-http/src/lib.rs @@ -14,15 +14,6 @@ unreachable_pub )] -/// Credentials middleware -pub mod auth; - -/// Recursion Detection middleware -pub mod recursion_detection; - -/// AWS-specific retry logic -pub mod retry; - /// User agent middleware pub mod user_agent; diff --git a/aws/rust-runtime/aws-http/src/recursion_detection.rs b/aws/rust-runtime/aws-http/src/recursion_detection.rs deleted file mode 100644 index 3cc27615d33..00000000000 --- a/aws/rust-runtime/aws-http/src/recursion_detection.rs +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::recursion_detection::env::TRACE_ID; -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; -use aws_types::os_shim_internal::Env; -use http::HeaderValue; -use percent_encoding::{percent_encode, CONTROLS}; -use std::borrow::Cow; - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module - -/// Recursion Detection Middleware -/// -/// This middleware inspects the value of the `AWS_LAMBDA_FUNCTION_NAME` and `_X_AMZN_TRACE_ID` environment -/// variables to detect if the request is being invoked in a lambda function. If it is, the `X-Amzn-Trace-Id` header -/// will be set. This enables downstream services to prevent accidentally infinitely recursive invocations spawned -/// from lambda. -#[non_exhaustive] -#[derive(Default, Debug, Clone)] -pub struct RecursionDetectionStage { - env: Env, -} - -impl RecursionDetectionStage { - /// Creates a new `RecursionDetectionStage` - pub fn new() -> Self { - Self::default() - } -} - -impl MapRequest for RecursionDetectionStage { - type Error = std::convert::Infallible; - - fn name(&self) -> &'static str { - "recursion_detection" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut req, _conf| { - augument_request(&mut req, &self.env); - Ok(req) - }) - } -} - -const TRACE_ID_HEADER: &str = "x-amzn-trace-id"; - -mod env { - pub(super) const LAMBDA_FUNCTION_NAME: &str = "AWS_LAMBDA_FUNCTION_NAME"; - pub(super) const TRACE_ID: &str = "_X_AMZN_TRACE_ID"; -} - -/// Set the trace id header from the request -fn augument_request(req: &mut http::Request, env: &Env) { - if req.headers().contains_key(TRACE_ID_HEADER) { - return; - } - if let (Ok(_function_name), Ok(trace_id)) = - (env.get(env::LAMBDA_FUNCTION_NAME), env.get(TRACE_ID)) - { - req.headers_mut() - .insert(TRACE_ID_HEADER, encode_header(trace_id.as_bytes())); - } -} - -/// Encodes a byte slice as a header. -/// -/// ASCII control characters are percent encoded which ensures that all byte sequences are valid headers -fn encode_header(value: &[u8]) -> HeaderValue { - let value: Cow<'_, str> = percent_encode(value, CONTROLS).into(); - HeaderValue::from_bytes(value.as_bytes()).expect("header is encoded, header must be valid") -} - -#[cfg(test)] -mod test { - use crate::recursion_detection::{encode_header, RecursionDetectionStage}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use aws_smithy_protocol_test::{assert_ok, validate_headers}; - use aws_types::os_shim_internal::Env; - use http::HeaderValue; - use proptest::{prelude::*, proptest}; - use serde::Deserialize; - use std::collections::HashMap; - - proptest! { - #[test] - fn header_encoding_never_panics(s in any::>()) { - encode_header(&s); - } - } - - #[test] - fn every_char() { - let buff = (0..=255).collect::>(); - assert_eq!( - encode_header(&buff), - HeaderValue::from_static( - r##"%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF"## - ) - ); - } - - #[test] - fn run_tests() { - let test_cases: Vec = - serde_json::from_str(include_str!("../test-data/recursion-detection.json")) - .expect("invalid test case"); - for test_case in test_cases { - check(test_case) - } - } - - #[derive(Deserialize)] - #[serde(rename_all = "camelCase")] - struct TestCase { - env: HashMap, - request_headers_before: Vec, - request_headers_after: Vec, - } - - impl TestCase { - fn env(&self) -> Env { - Env::from(self.env.clone()) - } - - /// Headers on the input request - fn request_headers_before(&self) -> impl Iterator { - Self::split_headers(&self.request_headers_before) - } - - /// Headers on the output request - fn request_headers_after(&self) -> impl Iterator { - Self::split_headers(&self.request_headers_after) - } - - /// Split text headers on `: ` - fn split_headers(headers: &[String]) -> impl Iterator { - headers - .iter() - .map(|header| header.split_once(": ").expect("header must contain :")) - } - } - - fn check(test_case: TestCase) { - let env = test_case.env(); - let mut req = http::Request::builder(); - for (k, v) in test_case.request_headers_before() { - req = req.header(k, v); - } - let req = req.body(SdkBody::empty()).expect("must be valid"); - let req = operation::Request::new(req); - let augmented_req = RecursionDetectionStage { env } - .apply(req) - .expect("stage must succeed"); - for k in augmented_req.http().headers().keys() { - assert_eq!( - augmented_req.http().headers().get_all(k).iter().count(), - 1, - "No duplicated headers" - ) - } - assert_ok(validate_headers( - augmented_req.http().headers(), - test_case.request_headers_after(), - )) - } -} diff --git a/aws/rust-runtime/aws-http/src/request_id.rs b/aws/rust-runtime/aws-http/src/request_id.rs index 7713328f7cd..692e9cc86f5 100644 --- a/aws/rust-runtime/aws-http/src/request_id.rs +++ b/aws/rust-runtime/aws-http/src/request_id.rs @@ -4,7 +4,6 @@ */ use aws_smithy_http::http::HttpHeaders; -use aws_smithy_http::operation; use aws_smithy_http::result::SdkError; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, @@ -46,12 +45,6 @@ impl RequestId for Unhandled { } } -impl RequestId for operation::Response { - fn request_id(&self) -> Option<&str> { - extract_request_id(self.http().headers()) - } -} - impl RequestId for http::Response { fn request_id(&self) -> Option<&str> { extract_request_id(self.headers()) @@ -106,18 +99,15 @@ mod tests { #[test] fn test_request_id_sdk_error() { - let without_request_id = - || operation::Response::new(Response::builder().body(SdkBody::empty()).unwrap()); + let without_request_id = || Response::builder().body(SdkBody::empty()).unwrap(); let with_request_id = || { - operation::Response::new( - Response::builder() - .header( - "x-amzn-requestid", - HeaderValue::from_static("some-request-id"), - ) - .body(SdkBody::empty()) - .unwrap(), - ) + Response::builder() + .header( + "x-amzn-requestid", + HeaderValue::from_static("some-request-id"), + ) + .body(SdkBody::empty()) + .unwrap() }; assert_eq!( None, diff --git a/aws/rust-runtime/aws-http/src/retry.rs b/aws/rust-runtime/aws-http/src/retry.rs deleted file mode 100644 index 8e7d0fcbb59..00000000000 --- a/aws/rust-runtime/aws-http/src/retry.rs +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -//! AWS-specific retry logic - -use aws_smithy_http::result::SdkError; -use aws_smithy_http::retry::{ClassifyRetry, DefaultResponseRetryClassifier}; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; -use std::time::Duration; - -const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; -const THROTTLING_ERRORS: &[&str] = &[ - "Throttling", - "ThrottlingException", - "ThrottledException", - "RequestThrottledException", - "TooManyRequestsException", - "ProvisionedThroughputExceededException", - "TransactionInProgressException", - "RequestLimitExceeded", - "BandwidthLimitExceeded", - "LimitExceededException", - "RequestThrottled", - "SlowDown", - "PriorRequestNotComplete", - "EC2ThrottledException", -]; -const TRANSIENT_ERRORS: &[&str] = &["RequestTimeout", "RequestTimeoutException"]; - -/// Implementation of [`ClassifyRetry`] that classifies AWS error codes. -/// -/// In order of priority: -/// 1. The `x-amz-retry-after` header is checked -/// 2. The modeled error retry mode is checked -/// 3. The code is checked against a predetermined list of throttling errors & transient error codes -/// 4. The status code is checked against a predetermined list of status codes -#[non_exhaustive] -#[derive(Clone, Debug)] -pub struct AwsResponseRetryClassifier; - -impl AwsResponseRetryClassifier { - /// Create an `AwsResponseRetryClassifier` with the default set of known error & status codes - pub fn new() -> Self { - Self - } -} - -impl Default for AwsResponseRetryClassifier { - fn default() -> Self { - Self::new() - } -} - -impl ClassifyRetry> for AwsResponseRetryClassifier -where - E: ProvideErrorKind, -{ - fn classify_retry(&self, result: Result<&T, &SdkError>) -> RetryKind { - // Run common retry classification logic from aws-smithy-http, and if it yields - // a `RetryKind`, then return that immediately. Otherwise, continue on to run some - // AWS SDK specific classification logic. - let (err, response) = match DefaultResponseRetryClassifier::try_extract_err_response(result) - { - Ok(extracted) => extracted, - Err(retry_kind) => return retry_kind, - }; - if let Some(retry_after_delay) = response - .http() - .headers() - .get("x-amz-retry-after") - .and_then(|header| header.to_str().ok()) - .and_then(|header| header.parse::().ok()) - { - return RetryKind::Explicit(Duration::from_millis(retry_after_delay)); - } - if let Some(kind) = err.retryable_error_kind() { - return RetryKind::Error(kind); - }; - if let Some(code) = err.code() { - if THROTTLING_ERRORS.contains(&code) { - return RetryKind::Error(ErrorKind::ThrottlingError); - } - if TRANSIENT_ERRORS.contains(&code) { - return RetryKind::Error(ErrorKind::TransientError); - } - }; - if TRANSIENT_ERROR_STATUS_CODES.contains(&response.http().status().as_u16()) { - return RetryKind::Error(ErrorKind::TransientError); - }; - // TODO(https://github.com/awslabs/smithy-rs/issues/966): IDPCommuncation error needs to be retried - RetryKind::UnretryableFailure - } -} - -#[cfg(test)] -mod test { - use crate::retry::AwsResponseRetryClassifier; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation; - use aws_smithy_http::result::{SdkError, SdkSuccess}; - use aws_smithy_http::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; - use std::fmt; - use std::time::Duration; - - #[derive(Debug)] - struct UnmodeledError; - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - impl std::error::Error for UnmodeledError {} - - struct CodedError { - code: &'static str, - } - - impl ProvideErrorKind for UnmodeledError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - None - } - } - - impl ProvideErrorKind for CodedError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - Some(self.code) - } - } - - fn make_err( - err: E, - raw: http::Response<&'static str>, - ) -> Result, SdkError> { - Err(SdkError::service_error( - err, - operation::Response::new(raw.map(SdkBody::from)), - )) - } - - #[test] - fn not_an_error() { - let policy = AwsResponseRetryClassifier::new(); - let test_response = http::Response::new("OK"); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_response).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_response_status() { - let policy = AwsResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(500) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn classify_by_response_status_not_retryable() { - let policy = AwsResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(408) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_error_code() { - let test_response = http::Response::new("OK"); - let policy = AwsResponseRetryClassifier::new(); - - assert_eq!( - policy.classify_retry( - make_err(CodedError { code: "Throttling" }, test_response).as_ref() - ), - RetryKind::Error(ErrorKind::ThrottlingError) - ); - - let test_response = http::Response::new("OK"); - assert_eq!( - policy.classify_retry( - make_err( - CodedError { - code: "RequestTimeout" - }, - test_response, - ) - .as_ref() - ), - RetryKind::Error(ErrorKind::TransientError) - ) - } - - #[test] - fn classify_generic() { - let err = aws_smithy_types::Error::builder().code("SlowDown").build(); - let test_response = http::Response::new("OK"); - let policy = AwsResponseRetryClassifier::new(); - assert_eq!( - policy.classify_retry(make_err(err, test_response).as_ref()), - RetryKind::Error(ErrorKind::ThrottlingError) - ); - } - - #[test] - fn classify_by_error_kind() { - struct ModeledRetries; - let test_response = http::Response::new("OK"); - impl ProvideErrorKind for ModeledRetries { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ClientError) - } - - fn code(&self) -> Option<&str> { - // code should not be called when `error_kind` is provided - unimplemented!() - } - } - - let policy = AwsResponseRetryClassifier::new(); - - assert_eq!( - policy.classify_retry(make_err(ModeledRetries, test_response).as_ref()), - RetryKind::Error(ErrorKind::ClientError) - ); - } - - #[test] - fn test_retry_after_header() { - let policy = AwsResponseRetryClassifier::new(); - let test_response = http::Response::builder() - .header("x-amz-retry-after", "5000") - .body("retry later") - .unwrap(); - - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_response).as_ref()), - RetryKind::Explicit(Duration::from_millis(5000)) - ); - } - - #[test] - fn classify_response_error() { - let policy = AwsResponseRetryClassifier::new(); - assert_eq!( - policy.classify_retry( - Result::, SdkError>::Err(SdkError::response_error( - UnmodeledError, - operation::Response::new(http::Response::new("OK").map(SdkBody::from)), - )) - .as_ref() - ), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn test_timeout_error() { - let policy = AwsResponseRetryClassifier::new(); - let err: Result<(), SdkError> = Err(SdkError::timeout_error("blah")); - assert_eq!( - policy.classify_retry(err.as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } -} diff --git a/aws/rust-runtime/aws-http/src/user_agent.rs b/aws/rust-runtime/aws-http/src/user_agent.rs index 27abba7bba9..1e26da4d4e6 100644 --- a/aws/rust-runtime/aws-http/src/user_agent.rs +++ b/aws/rust-runtime/aws-http/src/user_agent.rs @@ -3,24 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_types::app_name::AppName; use aws_types::build_metadata::{OsFamily, BUILD_METADATA}; use aws_types::os_shim_internal::Env; -use http::header::{HeaderName, InvalidHeaderValue, USER_AGENT}; -use http::HeaderValue; use std::borrow::Cow; -use std::convert::TryFrom; use std::error::Error; use std::fmt; /// AWS User Agent /// -/// Ths struct should be inserted into the [`PropertyBag`](aws_smithy_http::operation::Request::properties) -/// during operation construction. [`UserAgentStage`](UserAgentStage) reads `AwsUserAgent` -/// from the property bag and sets the `User-Agent` and `x-amz-user-agent` headers. +/// Ths struct should be inserted into the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) +/// during operation construction. The `UserAgentInterceptor` reads `AwsUserAgent` +/// from the config bag and sets the `User-Agent` and `x-amz-user-agent` headers. #[derive(Clone, Debug)] pub struct AwsUserAgent { sdk_metadata: SdkMetadata, @@ -522,116 +517,12 @@ impl fmt::Display for ExecEnvMetadata { } } -// TODO(enableNewSmithyRuntimeCleanup): Delete the user agent Tower middleware and consider moving all the remaining code into aws-runtime - -/// User agent middleware -#[non_exhaustive] -#[derive(Default, Clone, Debug)] -pub struct UserAgentStage; - -impl UserAgentStage { - /// Creates a new `UserAgentStage` - pub fn new() -> Self { - Self - } -} - -#[derive(Debug)] -enum UserAgentStageErrorKind { - /// There was no [`AwsUserAgent`] in the property bag. - UserAgentMissing, - /// The formatted user agent string is not a valid HTTP header value. This indicates a bug. - InvalidHeader(InvalidHeaderValue), -} - -/// Failures that can arise from the user agent middleware -#[derive(Debug)] -pub struct UserAgentStageError { - kind: UserAgentStageErrorKind, -} - -impl UserAgentStageError { - // `pub(crate)` method instead of implementing `From` so that we - // don't have to expose `InvalidHeaderValue` in public API. - pub(crate) fn from_invalid_header(value: InvalidHeaderValue) -> Self { - Self { - kind: UserAgentStageErrorKind::InvalidHeader(value), - } - } -} - -impl Error for UserAgentStageError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - use UserAgentStageErrorKind::*; - match &self.kind { - InvalidHeader(source) => Some(source as _), - UserAgentMissing => None, - } - } -} - -impl fmt::Display for UserAgentStageError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use UserAgentStageErrorKind::*; - match self.kind { - UserAgentMissing => write!(f, "user agent missing from property bag"), - InvalidHeader(_) => { - write!(f, "provided user agent header was invalid (this is a bug)") - } - } - } -} - -impl From for UserAgentStageError { - fn from(kind: UserAgentStageErrorKind) -> Self { - Self { kind } - } -} - -#[allow(clippy::declare_interior_mutable_const)] // we will never mutate this -const X_AMZ_USER_AGENT: HeaderName = HeaderName::from_static("x-amz-user-agent"); - -impl MapRequest for UserAgentStage { - type Error = UserAgentStageError; - - fn name(&self) -> &'static str { - "generate_user_agent" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut req, conf| { - let ua = conf - .get::() - .ok_or(UserAgentStageErrorKind::UserAgentMissing)?; - req.headers_mut().append( - USER_AGENT, - HeaderValue::try_from(ua.ua_header()) - .map_err(UserAgentStageError::from_invalid_header)?, - ); - req.headers_mut().append( - X_AMZ_USER_AGENT, - HeaderValue::try_from(ua.aws_ua_header()) - .map_err(UserAgentStageError::from_invalid_header)?, - ); - Ok(req) - }) - } -} - #[cfg(test)] mod test { - use crate::user_agent::{ - AdditionalMetadata, ApiMetadata, AwsUserAgent, ConfigMetadata, FrameworkMetadata, - UserAgentStage, - }; - use crate::user_agent::{FeatureMetadata, X_AMZ_USER_AGENT}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; + use super::*; use aws_types::app_name::AppName; use aws_types::build_metadata::OsFamily; use aws_types::os_shim_internal::Env; - use http::header::USER_AGENT; use std::borrow::Cow; fn make_deterministic(ua: &mut AwsUserAgent) { @@ -771,32 +662,6 @@ mod test { "aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0" ); } - - #[test] - fn ua_stage_adds_headers() { - let stage = UserAgentStage::new(); - let req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - stage - .apply(req) - .expect_err("adding UA should fail without a UA set"); - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - req.properties_mut() - .insert(AwsUserAgent::new_from_environment( - Env::from_slice(&[]), - ApiMetadata { - service_id: "dynamodb".into(), - version: "0.123", - }, - )); - let req = stage.apply(req).expect("setting user agent should succeed"); - let (req, _) = req.into_parts(); - req.headers() - .get(USER_AGENT) - .expect("UA header should be set"); - req.headers() - .get(X_AMZ_USER_AGENT) - .expect("UA header should be set"); - } } /* diff --git a/aws/rust-runtime/aws-hyper/README.md b/aws/rust-runtime/aws-hyper/README.md index ace56e1608a..311b8c447fd 100644 --- a/aws/rust-runtime/aws-hyper/README.md +++ b/aws/rust-runtime/aws-hyper/README.md @@ -1,6 +1,6 @@ # AWS Default Middleware -This crate has been removed. Middleware is now defined on a per-service basis. +This crate is no longer used by the AWS SDK. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-hyper/src/lib.rs b/aws/rust-runtime/aws-hyper/src/lib.rs index 9a037350a70..232f28ce9f6 100644 --- a/aws/rust-runtime/aws-hyper/src/lib.rs +++ b/aws/rust-runtime/aws-hyper/src/lib.rs @@ -7,4 +7,4 @@ since = "0.3.0", note = "The functionality of this crate is included in individual AWS services." )] -//! This crate has been removed. Its functionality has be merged into aws-smithy-client and individual AWS services. +//! This crate is no longer used by the AWS SDK. Its functionality has be merged into aws-smithy-runtime and individual AWS services. diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 28f4aeb2129..56ccc8068e2 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -22,26 +22,20 @@ aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } -aws-types = { path = "../aws-types" } bytes = "1" -bytes-utils = "0.1.1" hex = "0.4.3" http = "0.2.9" http-body = "0.4.5" -md-5 = "0.10.1" ring = "0.16" -tokio = { version = "1.23.1", features = ["full"] } -tokio-stream = "0.1.5" +tokio = "1.23.1" tracing = "0.1" [dev-dependencies] -aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client", features = ["test-util"] } +aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http", features = ["rt-tokio"] } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["test-util"] } tempfile = "3.6.0" -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } +tokio = { version = "1.23.1", features = ["macros", "rt", "io-util"] } [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-inlineable/src/lib.rs b/aws/rust-runtime/aws-inlineable/src/lib.rs index 8ff2f5f4789..05679f1f294 100644 --- a/aws/rust-runtime/aws-inlineable/src/lib.rs +++ b/aws/rust-runtime/aws-inlineable/src/lib.rs @@ -37,9 +37,6 @@ pub mod s3_request_id; /// Glacier-specific behavior pub mod glacier_interceptors; -/// Strip prefixes from IDs returned by Route53 operations when those IDs are used to construct requests -pub mod route53_resource_id_preprocessor_middleware; - /// Strip prefixes from IDs returned by Route53 operations when those IDs are used to construct requests pub mod route53_resource_id_preprocessor; diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs deleted file mode 100644 index 545be270de1..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module - -// This function is only used to strip prefixes from resource IDs at the time they're passed as -// input to a request. Resource IDs returned in responses may or may not include a prefix. -/// Strip the resource type prefix from resource ID return -pub fn trim_resource_id(resource_id: &mut Option) { - const PREFIXES: &[&str] = &[ - "/hostedzone/", - "hostedzone/", - "/change/", - "change/", - "/delegationset/", - "delegationset/", - ]; - - for prefix in PREFIXES { - if let Some(id) = resource_id - .as_deref() - .unwrap_or_default() - .strip_prefix(prefix) - { - *resource_id = Some(id.to_string()); - return; - } - } -} - -#[cfg(test)] -mod test { - use crate::route53_resource_id_preprocessor_middleware::trim_resource_id; - - #[test] - fn does_not_change_regular_zones() { - struct OperationInput { - resource: Option, - } - - let mut operation = OperationInput { - resource: Some("Z0441723226OZ66S5ZCNZ".to_string()), - }; - trim_resource_id(&mut operation.resource); - assert_eq!( - &operation.resource.unwrap_or_default(), - "Z0441723226OZ66S5ZCNZ" - ); - } - - #[test] - fn sanitizes_prefixed_zone() { - struct OperationInput { - change_id: Option, - } - - let mut operation = OperationInput { - change_id: Some("/change/Z0441723226OZ66S5ZCNZ".to_string()), - }; - trim_resource_id(&mut operation.change_id); - assert_eq!( - &operation.change_id.unwrap_or_default(), - "Z0441723226OZ66S5ZCNZ" - ); - } - - #[test] - fn allow_no_leading_slash() { - struct OperationInput { - hosted_zone: Option, - } - - let mut operation = OperationInput { - hosted_zone: Some("hostedzone/Z0441723226OZ66S5ZCNZ".to_string()), - }; - trim_resource_id(&mut operation.hosted_zone); - assert_eq!( - &operation.hosted_zone.unwrap_or_default(), - "Z0441723226OZ66S5ZCNZ" - ); - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index d2e64a70388..226eed5f7a3 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -4,7 +4,6 @@ */ use aws_smithy_http::http::HttpHeaders; -use aws_smithy_http::operation; use aws_smithy_http::result::SdkError; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, @@ -47,12 +46,6 @@ impl RequestIdExt for Unhandled { } } -impl RequestIdExt for operation::Response { - fn extended_request_id(&self) -> Option<&str> { - extract_extended_request_id(self.http().headers()) - } -} - impl RequestIdExt for http::Response { fn extended_request_id(&self) -> Option<&str> { extract_extended_request_id(self.headers()) @@ -115,15 +108,12 @@ mod test { #[test] fn test_extended_request_id_sdk_error() { - let without_extended_request_id = - || operation::Response::new(Response::builder().body(SdkBody::empty()).unwrap()); + let without_extended_request_id = || Response::builder().body(SdkBody::empty()).unwrap(); let with_extended_request_id = || { - operation::Response::new( - Response::builder() - .header("x-amz-id-2", HeaderValue::from_static("some-request-id")) - .body(SdkBody::empty()) - .unwrap(), - ) + Response::builder() + .header("x-amz-id-2", HeaderValue::from_static("some-request-id")) + .body(SdkBody::empty()) + .unwrap() }; assert_eq!( None, diff --git a/aws/rust-runtime/aws-sig-auth/Cargo.toml b/aws/rust-runtime/aws-sig-auth/Cargo.toml index db5f4e39651..6d796a290b1 100644 --- a/aws/rust-runtime/aws-sig-auth/Cargo.toml +++ b/aws/rust-runtime/aws-sig-auth/Cargo.toml @@ -2,33 +2,11 @@ name = "aws-sig-auth" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "SigV4 signing middleware for the AWS SDK." +description = "This crate is no longer used by the AWS SDK and is deprecated." edition = "2021" license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" -[features] -sign-eventstream = ["aws-smithy-eventstream", "aws-sigv4/sign-eventstream"] - -[dependencies] -aws-credential-types = { path = "../aws-credential-types" } -# TODO(httpRefactor): Remove feature was http refactor is complete -aws-sigv4 = { path = "../aws-sigv4", features = ["http0-compat"] } -aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } -aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } -aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } -aws-types = { path = "../aws-types" } -http = "0.2.2" -tracing = "0.1" - -[dev-dependencies] -aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } -aws-endpoint = { path = "../aws-endpoint" } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -tracing-test = "0.2.4" -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } - [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/aws/rust-runtime/aws-sig-auth/README.md b/aws/rust-runtime/aws-sig-auth/README.md index 1a579b0fe67..8a76b6c7e69 100644 --- a/aws/rust-runtime/aws-sig-auth/README.md +++ b/aws/rust-runtime/aws-sig-auth/README.md @@ -1,7 +1,6 @@ # aws-sig-auth -This crate implements a standalone request signer for AWS services. For examples, -see [docs.rs](https://docs.rs/aws-sig-auth). +This crate is no longer used by the AWS SDK and is deprecated. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs deleted file mode 100644 index 565377f9f42..00000000000 --- a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// this code is dead -#![allow(deprecated)] -#![allow(clippy::disallowed_methods)] - -use crate::middleware::Signature; -use aws_sigv4::event_stream::{sign_empty_message, sign_message}; -use aws_sigv4::sign::v4; -use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; -use aws_smithy_http::property_bag::{PropertyBag, SharedPropertyBag}; -use aws_smithy_runtime_api::client::identity::Identity; -use aws_types::region::SigningRegion; -use aws_types::SigningName; -use std::time::SystemTime; - -/// Event Stream SigV4 signing implementation. -#[derive(Debug)] -pub struct SigV4MessageSigner { - last_signature: String, - identity: Identity, - signing_region: SigningRegion, - signing_name: SigningName, - time: Option, -} - -impl SigV4MessageSigner { - pub fn new( - last_signature: String, - identity: Identity, - signing_region: SigningRegion, - signing_name: SigningName, - time: Option, - ) -> Self { - Self { - last_signature, - identity, - signing_region, - signing_name, - time, - } - } - - fn signing_params(&self) -> v4::SigningParams<()> { - let builder = v4::SigningParams::builder() - .identity(&self.identity) - .region(self.signing_region.as_ref()) - .name(self.signing_name.as_ref()) - .time(self.time.unwrap_or_else(SystemTime::now)) - .settings(()); - builder.build().unwrap() - } -} - -impl SignMessage for SigV4MessageSigner { - fn sign(&mut self, message: Message) -> Result { - let (signed_message, signature) = { - let params = self.signing_params(); - sign_message(&message, &self.last_signature, ¶ms)?.into_parts() - }; - self.last_signature = signature; - Ok(signed_message) - } - - fn sign_empty(&mut self) -> Option> { - let (signed_message, signature) = { - let params = self.signing_params(); - sign_empty_message(&self.last_signature, ¶ms) - .expect("signing an empty message will always succeed.") - .into_parts() - }; - self.last_signature = signature; - Some(Ok(signed_message)) - } -} - -#[cfg(test)] -mod tests { - use crate::event_stream::SigV4MessageSigner; - use aws_credential_types::Credentials; - use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; - - use aws_types::region::Region; - use aws_types::region::SigningRegion; - use aws_types::SigningName; - use std::time::{Duration, UNIX_EPOCH}; - - fn check_send_sync(value: T) -> T { - value - } - - #[test] - fn sign_message() { - let region = Region::new("us-east-1"); - let mut signer = check_send_sync(SigV4MessageSigner::new( - "initial-signature".into(), - Credentials::for_tests_with_session_token().into(), - SigningRegion::from(region), - SigningName::from_static("transcribe"), - Some(UNIX_EPOCH + Duration::new(1611160427, 0)), - )); - let mut signatures = Vec::new(); - for _ in 0..5 { - let signed = signer - .sign(Message::new(&b"identical message"[..])) - .unwrap(); - if let HeaderValue::ByteArray(signature) = signed - .headers() - .iter() - .find(|h| h.name().as_str() == ":chunk-signature") - .unwrap() - .value() - { - signatures.push(signature.clone()); - } else { - panic!("failed to get the :chunk-signature") - } - } - for i in 1..signatures.len() { - assert_ne!(signatures[i - 1], signatures[i]); - } - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete this old implementation that was kept around to support patch releases. -#[deprecated = "use aws_sig_auth::event_stream::SigV4MessageSigner instead (this may require upgrading the smithy-rs code generator)"] -#[derive(Debug)] -/// Event Stream SigV4 signing implementation. -pub struct SigV4Signer { - properties: SharedPropertyBag, - last_signature: Option, -} - -impl SigV4Signer { - pub fn new(properties: SharedPropertyBag) -> Self { - Self { - properties, - last_signature: None, - } - } - - fn signing_params(properties: &PropertyBag) -> v4::SigningParams<()> { - // Every single one of these values would have been retrieved during the initial request, - // so we can safely assume they all exist in the property bag at this point. - let identity = properties.get::().unwrap(); - let region = properties.get::().unwrap(); - let name = properties.get::().unwrap(); - let time = properties - .get::() - .copied() - .unwrap_or_else(SystemTime::now); - let builder = v4::SigningParams::builder() - .identity(identity) - .region(region.as_ref()) - .name(name.as_ref()) - .time(time) - .settings(()); - builder.build().unwrap() - } -} - -impl SignMessage for SigV4Signer { - fn sign(&mut self, message: Message) -> Result { - let properties = self.properties.acquire(); - if self.last_signature.is_none() { - // The Signature property should exist in the property bag for all Event Stream requests. - self.last_signature = Some( - properties - .get::() - .expect("property bag contains initial Signature") - .as_ref() - .into(), - ) - } - - let (signed_message, signature) = { - let params = Self::signing_params(&properties); - sign_message(&message, self.last_signature.as_ref().unwrap(), ¶ms)?.into_parts() - }; - self.last_signature = Some(signature); - Ok(signed_message) - } - - fn sign_empty(&mut self) -> Option> { - let properties = self.properties.acquire(); - if self.last_signature.is_none() { - // The Signature property should exist in the property bag for all Event Stream requests. - self.last_signature = Some(properties.get::().unwrap().as_ref().into()) - } - let (signed_message, signature) = { - let params = Self::signing_params(&properties); - sign_empty_message(self.last_signature.as_ref().unwrap(), ¶ms) - .ok()? - .into_parts() - }; - self.last_signature = Some(signature); - Some(Ok(signed_message)) - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete this old implementation that was kept around to support patch releases. -#[cfg(test)] -mod old_tests { - use crate::event_stream::SigV4Signer; - use crate::middleware::Signature; - use aws_credential_types::Credentials; - use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; - use aws_smithy_http::property_bag::PropertyBag; - use aws_smithy_runtime_api::client::identity::Identity; - use aws_types::region::Region; - use aws_types::region::SigningRegion; - use aws_types::SigningName; - use std::time::{Duration, UNIX_EPOCH}; - - #[test] - fn sign_message() { - let region = Region::new("us-east-1"); - let mut properties = PropertyBag::new(); - properties.insert(region.clone()); - properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); - properties.insert::(Credentials::for_tests_with_session_token().into()); - properties.insert(SigningName::from_static("transcribe")); - properties.insert(SigningRegion::from(region)); - properties.insert(Signature::new("initial-signature".into())); - - let mut signer = SigV4Signer::new(properties.into()); - let mut signatures = Vec::new(); - for _ in 0..5 { - let signed = signer - .sign(Message::new(&b"identical message"[..])) - .unwrap(); - if let HeaderValue::ByteArray(signature) = signed - .headers() - .iter() - .find(|h| h.name().as_str() == ":chunk-signature") - .unwrap() - .value() - { - signatures.push(signature.clone()); - } else { - panic!("failed to get the :chunk-signature") - } - } - for i in 1..signatures.len() { - assert_ne!(signatures[i - 1], signatures[i]); - } - } -} diff --git a/aws/rust-runtime/aws-sig-auth/src/lib.rs b/aws/rust-runtime/aws-sig-auth/src/lib.rs index 163a881a994..2819d851189 100644 --- a/aws/rust-runtime/aws-sig-auth/src/lib.rs +++ b/aws/rust-runtime/aws-sig-auth/src/lib.rs @@ -3,119 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -// TODO(enableNewSmithyRuntimeCleanup): Deprecate this crate and replace it with empty contents. Remove references to it in the code generator. - -#![allow(clippy::derive_partial_eq_without_eq)] - -//! AWS Signature Authentication Package -//! -//! This crate may be used to generate presigned URLs for unmodeled behavior such as `rds-iam-token` -//! or to sign requests to APIGateway-based services with IAM authorization. -//! -//! # Examples -//! -//! ## Generate RDS IAM Token -//! ```rust -//! use aws_credential_types::Credentials; -//! use aws_smithy_http::body::SdkBody; -//! use aws_types::SigningName; -//! use aws_types::region::{Region, SigningRegion}; -//! use std::time::{Duration, SystemTime, UNIX_EPOCH}; -//! use aws_sig_auth::signer::{self, SigningError, OperationSigningConfig, HttpSignatureType, RequestConfig}; -//! use aws_smithy_runtime_api::client::identity::Identity; -//! -//! fn generate_rds_iam_token( -//! db_hostname: &str, -//! region: Region, -//! port: u16, -//! db_username: &str, -//! identity: &Identity, -//! timestamp: SystemTime, -//! ) -> Result { -//! let signer = signer::SigV4Signer::new(); -//! let mut operation_config = OperationSigningConfig::default_config(); -//! operation_config.signature_type = HttpSignatureType::HttpRequestQueryParams; -//! operation_config.expires_in = Some(Duration::from_secs(15 * 60)); -//! let request_config = RequestConfig { -//! request_ts: timestamp, -//! region: &SigningRegion::from(region), -//! name: &SigningName::from_static("rds-db"), -//! payload_override: None, -//! }; -//! let mut request = http::Request::builder() -//! .uri(format!( -//! "http://{db_hostname}:{port}/?Action=connect&DBUser={db_user}", -//! db_hostname = db_hostname, -//! port = port, -//! db_user = db_username -//! )) -//! .body(SdkBody::empty()) -//! .expect("valid request"); -//! let _signature = signer.sign( -//! &operation_config, -//! &request_config, -//! identity, -//! &mut request, -//! )?; -//! let mut uri = request.uri().to_string(); -//! assert!(uri.starts_with("http://")); -//! let uri = uri.split_off("http://".len()); -//! Ok(uri) -//! } -//! -//! // You will need to get an `identity` from a credentials provider ahead of time -//! # let identity = Credentials::new("AKIDEXAMPLE", "secret", None, None, "example").into(); -//! let token = generate_rds_iam_token( -//! "prod-instance.us-east-1.rds.amazonaws.com", -//! Region::from_static("us-east-1"), -//! 3306, -//! "dbuser", -//! &identity, -//! // this value is hard coded to create deterministic signature for tests. Generally, -//! // `SystemTime::now()` should be used -//! UNIX_EPOCH + Duration::from_secs(1635257380) -//! ).expect("failed to generate token"); -//! # // validate against token generated by the aws CLI -//! # assert_eq!(token, "prod-instance.us-east-1.rds.amazonaws.com:3306/?Action=connect&DBUser=dbuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20211026%2Fus-east-1%2Frds-db%2Faws4_request&X-Amz-Date=20211026T140940Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=9632f5f4fcd2087a3c523f55f72d2fe97fad03b71a0a23b8c1edfb104e8072d1"); -//! ``` -//! -//! ## Sign a request for APIGateway execute-api -//! -//! ```no_run -//! use aws_credential_types::provider::ProvideCredentials; -//! use aws_sig_auth::signer::{OperationSigningConfig, RequestConfig, SigV4Signer}; -//! use aws_smithy_http::body::SdkBody; -//! use aws_types::region::{Region, SigningRegion}; -//! use aws_types::SigningName; -//! use std::error::Error; -//! use std::time::SystemTime; -//! use aws_smithy_runtime_api::client::identity::Identity; -//! async fn sign_request( -//! mut request: &mut http::Request, -//! region: Region, -//! credentials_provider: &impl ProvideCredentials, -//! ) -> Result<(), Box> { -//! let now = SystemTime::now(); -//! let signer = SigV4Signer::new(); -//! let request_config = RequestConfig { -//! request_ts: now, -//! region: &SigningRegion::from(region), -//! name: &SigningName::from_static("execute-api"), -//! payload_override: None, -//! }; -//! let identity = credentials_provider.provide_credentials().await?.into(); -//! signer.sign( -//! &OperationSigningConfig::default_config(), -//! &request_config, -//! &identity, -//! &mut request, -//! )?; -//! Ok((())) -//! } -//! ``` - -#[cfg(feature = "sign-eventstream")] -pub mod event_stream; - -pub mod middleware; -pub mod signer; +//! This crate is no longer used by the AWS SDK and is deprecated. diff --git a/aws/rust-runtime/aws-sig-auth/src/middleware.rs b/aws/rust-runtime/aws-sig-auth/src/middleware.rs deleted file mode 100644 index 3d4e788e37c..00000000000 --- a/aws/rust-runtime/aws-sig-auth/src/middleware.rs +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::error::Error; -use std::fmt::{Display, Formatter}; - -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; -use aws_smithy_http::property_bag::PropertyBag; - -use aws_credential_types::Credentials; -use aws_sigv4::http_request::SignableBody; -use aws_smithy_async::time::SharedTimeSource; -use aws_types::region::SigningRegion; -use aws_types::SigningName; - -use crate::signer::{ - OperationSigningConfig, RequestConfig, SigV4Signer, SigningError, SigningRequirements, -}; - -#[cfg(feature = "sign-eventstream")] -use crate::event_stream::SigV4MessageSigner as EventStreamSigV4Signer; -#[cfg(feature = "sign-eventstream")] -use aws_smithy_eventstream::frame::DeferredSignerSender; - -// TODO(enableNewSmithyRuntimeCleanup): Delete `Signature` when switching to the orchestrator -/// Container for the request signature for use in the property bag. -#[non_exhaustive] -#[derive(Debug, Clone)] -pub struct Signature(String); - -impl Signature { - pub fn new(signature: String) -> Self { - Self(signature) - } -} - -impl AsRef for Signature { - fn as_ref(&self) -> &str { - &self.0 - } -} - -/// Middleware stage to sign requests with SigV4 -/// -/// SigV4RequestSignerStage will load configuration from the request property bag and add -/// a signature. -/// -/// Prior to signing, the following fields MUST be present in the property bag: -/// - [`SigningRegion`]: The region used when signing the request, e.g. `us-east-1` -/// - [`SigningName`]: The name of the service to use when signing the request, e.g. `dynamodb` -/// - [`Credentials`]: Credentials to sign with -/// - [`OperationSigningConfig`]: Operation specific signing configuration, e.g. -/// changes to URL encoding behavior, or headers that must be omitted. -/// - [`SharedTimeSource`]: The time source to use when signing the request. -/// If any of these fields are missing, the middleware will return an error. -#[derive(Clone, Debug)] -pub struct SigV4SigningStage { - signer: SigV4Signer, -} - -impl SigV4SigningStage { - pub fn new(signer: SigV4Signer) -> Self { - Self { signer } - } -} - -#[derive(Debug)] -enum SigningStageErrorKind { - MissingCredentials, - MissingSigningRegion, - MissingSigningName, - MissingSigningConfig, - SigningFailure(SigningError), -} - -#[derive(Debug)] -pub struct SigningStageError { - kind: SigningStageErrorKind, -} - -impl Display for SigningStageError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - use SigningStageErrorKind::*; - match self.kind { - MissingCredentials => { - write!(f, "no credentials in the property bag") - } - MissingSigningRegion => { - write!(f, "no signing region in the property bag") - } - MissingSigningName => { - write!(f, "no signing service in the property bag") - } - MissingSigningConfig => { - write!(f, "no signing configuration in the property bag") - } - SigningFailure(_) => write!(f, "signing failed"), - } - } -} - -impl Error for SigningStageError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - use SigningStageErrorKind as ErrorKind; - match &self.kind { - ErrorKind::SigningFailure(err) => Some(err), - ErrorKind::MissingCredentials - | ErrorKind::MissingSigningRegion - | ErrorKind::MissingSigningName - | ErrorKind::MissingSigningConfig => None, - } - } -} - -impl From for SigningStageError { - fn from(kind: SigningStageErrorKind) -> Self { - Self { kind } - } -} - -impl From for SigningStageError { - fn from(error: SigningError) -> Self { - Self { - kind: SigningStageErrorKind::SigningFailure(error), - } - } -} - -/// Extract a signing config from a [`PropertyBag`](aws_smithy_http::property_bag::PropertyBag) -fn signing_config( - config: &PropertyBag, -) -> Result<(&OperationSigningConfig, RequestConfig, Credentials), SigningStageError> { - let operation_config = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningConfig)?; - let credentials = config - .get::() - .ok_or(SigningStageErrorKind::MissingCredentials)? - .clone(); - let region = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningRegion)?; - let name = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningName)?; - let payload_override = config.get::>(); - let request_config = RequestConfig { - request_ts: config - .get::() - .map(|t| t.now()) - .unwrap_or_else(|| SharedTimeSource::default().now()), - region, - payload_override, - name, - }; - Ok((operation_config, request_config, credentials)) -} - -impl MapRequest for SigV4SigningStage { - type Error = SigningStageError; - - fn name(&self) -> &'static str { - "sigv4_sign_request" - } - - fn apply(&self, req: Request) -> Result { - req.augment(|mut req, config| { - let operation_config = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningConfig)?; - let (operation_config, request_config, creds) = - match &operation_config.signing_requirements { - SigningRequirements::Disabled => return Ok(req), - SigningRequirements::Optional => match signing_config(config) { - Ok(parts) => parts, - Err(_) => return Ok(req), - }, - SigningRequirements::Required => signing_config(config)?, - }; - let identity = creds.into(); - - let signature = self - .signer - .sign(operation_config, &request_config, &identity, &mut req) - .map_err(SigningStageErrorKind::SigningFailure)?; - - // If this is an event stream operation, set up the event stream signer - #[cfg(feature = "sign-eventstream")] - if let Some(signer_sender) = config.get::() { - let time_override = config.get::().map(|ts| ts.now()); - signer_sender - .send(Box::new(EventStreamSigV4Signer::new( - signature.as_ref().into(), - identity, - request_config.region.clone(), - request_config.name.clone(), - time_override, - )) as _) - .expect("failed to send deferred signer"); - } - - config.insert(signature); - Ok(req) - }) - } -} - -#[cfg(test)] -mod test { - use std::convert::Infallible; - use std::time::{Duration, UNIX_EPOCH}; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use http::header::AUTHORIZATION; - - use aws_credential_types::Credentials; - use aws_endpoint::AwsAuthStage; - use aws_smithy_async::time::SharedTimeSource; - - use aws_types::region::{Region, SigningRegion}; - use aws_types::SigningName; - - use crate::middleware::{ - SigV4SigningStage, Signature, SigningStageError, SigningStageErrorKind, - }; - use crate::signer::{OperationSigningConfig, SigV4Signer}; - - #[test] - fn places_signature_in_property_bag() { - let req = http::Request::builder() - .uri("https://test-service.test-region.amazonaws.com/") - .body(SdkBody::from("")) - .unwrap(); - let region = Region::new("us-east-1"); - let req = operation::Request::new(req) - .augment(|req, properties| { - properties.insert(region.clone()); - properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); - properties.insert(SigningName::from_static("kinesis")); - properties.insert(OperationSigningConfig::default_config()); - properties.insert(Credentials::for_tests_with_session_token()); - properties.insert(SigningRegion::from(region)); - Result::<_, Infallible>::Ok(req) - }) - .expect("succeeds"); - - let signer = SigV4SigningStage::new(SigV4Signer::new()); - let req = signer.apply(req).unwrap(); - - let property_bag = req.properties(); - let signature = property_bag.get::(); - assert!(signature.is_some()); - } - - #[cfg(feature = "sign-eventstream")] - #[test] - fn sends_event_stream_signer_for_event_stream_operations() { - use crate::event_stream::SigV4MessageSigner as EventStreamSigV4Signer; - use aws_smithy_eventstream::frame::{DeferredSigner, SignMessage}; - - let (mut deferred_signer, deferred_signer_sender) = DeferredSigner::new(); - let req = http::Request::builder() - .uri("https://test-service.test-region.amazonaws.com/") - .body(SdkBody::from("")) - .unwrap(); - let region = Region::new("us-east-1"); - let req = operation::Request::new(req) - .augment(|req, properties| { - properties.insert(region.clone()); - properties.insert::(SharedTimeSource::new( - UNIX_EPOCH + Duration::new(1611160427, 0), - )); - properties.insert(SigningName::from_static("kinesis")); - properties.insert(OperationSigningConfig::default_config()); - properties.insert(Credentials::for_tests_with_session_token()); - properties.insert(SigningRegion::from(region.clone())); - properties.insert(deferred_signer_sender); - Result::<_, Infallible>::Ok(req) - }) - .expect("succeeds"); - - let signer = SigV4SigningStage::new(SigV4Signer::new()); - let _ = signer.apply(req).unwrap(); - - let mut signer_for_comparison = EventStreamSigV4Signer::new( - // This is the expected SigV4 signature for the HTTP request above - "abac477b4afabf5651079e7b9a0aa6a1a3e356a7418a81d974cdae9d4c8e5441".into(), - Credentials::for_tests_with_session_token().into(), - SigningRegion::from(region), - SigningName::from_static("kinesis"), - Some(UNIX_EPOCH + Duration::new(1611160427, 0)), - ); - - let expected_signed_empty = signer_for_comparison.sign_empty().unwrap().unwrap(); - let actual_signed_empty = deferred_signer.sign_empty().unwrap().unwrap(); - assert_eq!(expected_signed_empty, actual_signed_empty); - } - - // check that the endpoint middleware followed by signing middleware produce the expected result - #[test] - fn endpoint_plus_signer() { - use aws_smithy_types::endpoint::Endpoint; - let endpoint = Endpoint::builder() - .url("https://kinesis.us-east-1.amazonaws.com") - .build(); - let req = http::Request::builder() - .uri("https://kinesis.us-east-1.amazonaws.com") - .body(SdkBody::from("")) - .unwrap(); - let region = SigningRegion::from_static("us-east-1"); - let req = operation::Request::new(req) - .augment(|req, conf| { - conf.insert(region.clone()); - conf.insert(SharedTimeSource::new( - UNIX_EPOCH + Duration::new(1611160427, 0), - )); - conf.insert(SigningName::from_static("kinesis")); - conf.insert(endpoint); - Result::<_, Infallible>::Ok(req) - }) - .expect("succeeds"); - - let endpoint = AwsAuthStage; - let signer = SigV4SigningStage::new(SigV4Signer::new()); - let mut req = endpoint.apply(req).expect("add endpoint should succeed"); - let mut errs = vec![signer - .apply(req.try_clone().expect("can clone")) - .expect_err("no signing config")]; - let mut config = OperationSigningConfig::default_config(); - config.signing_options.content_sha256_header = true; - req.properties_mut().insert(config); - errs.push( - signer - .apply(req.try_clone().expect("can clone")) - .expect_err("no cred provider"), - ); - req.properties_mut() - .insert(Credentials::for_tests_with_session_token()); - let req = signer.apply(req).expect("signing succeeded"); - // make sure we got the correct error types in any order - assert!(errs.iter().all(|el| matches!( - el, - SigningStageError { - kind: SigningStageErrorKind::MissingCredentials - | SigningStageErrorKind::MissingSigningConfig - } - ))); - - let (req, _) = req.into_parts(); - assert_eq!( - req.headers() - .get("x-amz-date") - .expect("x-amz-date must be present"), - "20210120T163347Z" - ); - let auth_header = req - .headers() - .get(AUTHORIZATION) - .expect("auth header must be present") - .to_str() - .unwrap(); - assert_eq!(auth_header, "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210120/us-east-1/kinesis/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=228edaefb06378ac8d050252ea18a219da66117dd72759f4d1d60f02ebc3db64"); - } -} diff --git a/aws/rust-runtime/aws-sig-auth/src/signer.rs b/aws/rust-runtime/aws-sig-auth/src/signer.rs deleted file mode 100644 index feda470087f..00000000000 --- a/aws/rust-runtime/aws-sig-auth/src/signer.rs +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::middleware::Signature; -pub use aws_sigv4::http_request::SignableBody; -use aws_sigv4::http_request::{ - sign, PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableRequest, - SignatureLocation, SigningParams, SigningSettings, UriPathNormalizationMode, -}; -use aws_sigv4::sign::v4; -use aws_smithy_http::body::SdkBody; -use aws_smithy_runtime_api::client::identity::Identity; -use aws_types::region::SigningRegion; -use aws_types::SigningName; -use std::fmt; -use std::time::{Duration, SystemTime}; - -pub type SigningError = aws_sigv4::http_request::SigningError; - -const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ - `expires_in` duration because the credentials used to sign it will expire first."; - -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum SigningAlgorithm { - SigV4, -} - -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum HttpSignatureType { - /// A signature for a full http request should be computed, with header updates applied to the signing result. - HttpRequestHeaders, - - /// A signature for a full http request should be computed, with query param updates applied to the signing result. - /// - /// This is typically used for presigned URLs. - HttpRequestQueryParams, -} - -/// Signing Configuration for an Operation -/// -/// Although these fields MAY be customized on a per request basis, they are generally static -/// for a given operation -#[derive(Clone, PartialEq, Eq)] -#[non_exhaustive] -pub struct OperationSigningConfig { - pub algorithm: SigningAlgorithm, - pub signature_type: HttpSignatureType, - pub signing_options: SigningOptions, - pub signing_requirements: SigningRequirements, - pub expires_in: Option, -} - -impl OperationSigningConfig { - /// Placeholder method to provide a the signing configuration used for most operation - /// - /// In the future, we will code-generate a default configuration for each service - pub fn default_config() -> Self { - OperationSigningConfig { - algorithm: SigningAlgorithm::SigV4, - signature_type: HttpSignatureType::HttpRequestHeaders, - signing_options: SigningOptions { - double_uri_encode: true, - content_sha256_header: false, - normalize_uri_path: true, - omit_session_token: false, - }, - signing_requirements: SigningRequirements::Required, - expires_in: None, - } - } -} - -#[derive(Clone, Copy, Eq, PartialEq)] -pub enum SigningRequirements { - /// A signature MAY be added if credentials are defined - Optional, - - /// A signature MUST be added. - /// - /// If no credentials are provided, this will return an error without dispatching the operation. - Required, - - /// A signature MUST NOT be added. - Disabled, -} - -#[derive(Clone, Eq, PartialEq)] -#[non_exhaustive] -pub struct SigningOptions { - pub double_uri_encode: bool, - pub content_sha256_header: bool, - pub normalize_uri_path: bool, - pub omit_session_token: bool, -} - -/// Signing Configuration for an individual Request -/// -/// These fields may vary on a per-request basis -#[derive(Clone, PartialEq, Eq)] -pub struct RequestConfig<'a> { - pub request_ts: SystemTime, - pub region: &'a SigningRegion, - pub name: &'a SigningName, - pub payload_override: Option<&'a SignableBody<'static>>, -} - -#[derive(Clone, Default)] -pub struct SigV4Signer { - // In the future, the SigV4Signer will use the CRT signer. This will require constructing - // and holding an instance of the signer, so prevent people from constructing a SigV4Signer without - // going through the constructor. - _private: (), -} - -impl fmt::Debug for SigV4Signer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut formatter = f.debug_struct("SigV4Signer"); - formatter.finish() - } -} - -impl SigV4Signer { - pub fn new() -> Self { - SigV4Signer { _private: () } - } - - fn settings(operation_config: &OperationSigningConfig) -> SigningSettings { - let mut settings = SigningSettings::default(); - settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode { - PercentEncodingMode::Double - } else { - PercentEncodingMode::Single - }; - settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header { - PayloadChecksumKind::XAmzSha256 - } else { - PayloadChecksumKind::NoHeader - }; - settings.uri_path_normalization_mode = - if operation_config.signing_options.normalize_uri_path { - UriPathNormalizationMode::Enabled - } else { - UriPathNormalizationMode::Disabled - }; - settings.session_token_mode = if operation_config.signing_options.omit_session_token { - SessionTokenMode::Exclude - } else { - SessionTokenMode::Include - }; - settings.signature_location = match operation_config.signature_type { - HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers, - HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams, - }; - settings.expires_in = operation_config.expires_in; - settings - } - - fn signing_params<'a>( - settings: SigningSettings, - identity: &'a Identity, - request_config: &'a RequestConfig<'a>, - ) -> SigningParams<'a> { - if let Some(expires_in) = settings.expires_in { - if let Some(creds_expires_time) = identity.expiration().cloned() { - let presigned_expires_time = request_config.request_ts + expires_in; - if presigned_expires_time > creds_expires_time { - tracing::warn!(EXPIRATION_WARNING); - } - } - } - - let builder = v4::SigningParams::builder() - .identity(identity) - .region(request_config.region.as_ref()) - .name(request_config.name.as_ref()) - .time(request_config.request_ts) - .settings(settings); - builder.build().expect("all required fields set").into() - } - - /// Sign a request using the SigV4 Protocol - /// - /// Although this function may be used, end users will not typically - /// interact with this code. It is generally used via middleware in the request pipeline. See [`SigV4SigningStage`](crate::middleware::SigV4SigningStage). - pub fn sign( - &self, - operation_config: &OperationSigningConfig, - request_config: &RequestConfig<'_>, - identity: &Identity, - request: &mut http::Request, - ) -> Result { - let settings = Self::settings(operation_config); - let signing_params = Self::signing_params(settings, identity, request_config); - - let (signing_instructions, signature) = { - // A body that is already in memory can be signed directly. A body that is not in memory - // (any sort of streaming body or presigned request) will be signed via UNSIGNED-PAYLOAD. - let signable_body = request_config - .payload_override - // the payload_override is a cheap clone because it contains either a - // reference or a short checksum (we're not cloning the entire body) - .cloned() - .unwrap_or_else(|| { - request - .body() - .bytes() - .map(SignableBody::Bytes) - .unwrap_or(SignableBody::UnsignedPayload) - }); - - let signable_request = SignableRequest::new( - request.method().as_str(), - request.uri().to_string(), - request.headers().iter().map(|(k, v)| { - ( - k.as_str(), - std::str::from_utf8(v.as_bytes()) - .expect("only string headers are signable"), - ) - }), - signable_body, - )?; - sign(signable_request, &signing_params)? - } - .into_parts(); - - signing_instructions.apply_to_request(request); - - Ok(Signature::new(signature)) - } -} - -#[cfg(test)] -mod tests { - use super::{RequestConfig, SigV4Signer, EXPIRATION_WARNING}; - use aws_credential_types::Credentials; - use aws_sigv4::http_request::SigningSettings; - - use aws_types::region::SigningRegion; - use aws_types::SigningName; - use std::time::{Duration, SystemTime}; - use tracing_test::traced_test; - - #[test] - #[traced_test] - fn expiration_warning() { - let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1000); - let creds_expire_in = Duration::from_secs(100); - - let mut settings = SigningSettings::default(); - settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); - - let identity = Credentials::new( - "test-access-key", - "test-secret-key", - Some("test-session-token".into()), - Some(now + creds_expire_in), - "test", - ) - .into(); - let request_config = RequestConfig { - request_ts: now, - region: &SigningRegion::from_static("test"), - name: &SigningName::from_static("test"), - payload_override: None, - }; - SigV4Signer::signing_params(settings, &identity, &request_config); - assert!(!logs_contain(EXPIRATION_WARNING)); - - let mut settings = SigningSettings::default(); - settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); - - SigV4Signer::signing_params(settings, &identity, &request_config); - assert!(logs_contain(EXPIRATION_WARNING)); - } -} diff --git a/aws/rust-runtime/aws-sigv4/README.md b/aws/rust-runtime/aws-sigv4/README.md index 6e69eb5e901..5159a9f01a7 100644 --- a/aws/rust-runtime/aws-sigv4/README.md +++ b/aws/rust-runtime/aws-sigv4/README.md @@ -1,8 +1,6 @@ # aws-sigv4 -Low-level SigV4 request signing implementations. Customers will not generally need to use this crate directly. If you -need to manually sign requests, [aws-sig-auth](https://crates.io/crates/aws-sig-auth) offers a higher level interface -for signing. +Low-level SigV4 request signing implementations. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt index c0127ae1e96..4141c7e0b1e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt @@ -15,12 +15,9 @@ fun RuntimeConfig.awsRuntimeCrate(name: String, features: Set = setOf()) object AwsCargoDependency { fun awsConfig(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-config") fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-credential-types") - fun awsEndpoint(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-endpoint") fun awsHttp(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-http") fun awsRuntime(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-runtime") fun awsRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-runtime-api") - fun awsSigAuth(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-sig-auth") - fun awsSigAuthEventStream(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-sig-auth", setOf("sign-eventstream")) fun awsSigv4(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-sigv4") fun awsTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-types") } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index fb4b5fa58e1..3a1e6e6fbec 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -30,19 +30,12 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault private class Types(runtimeConfig: RuntimeConfig) { - private val smithyClient = RuntimeType.smithyClient(runtimeConfig) private val smithyHttp = RuntimeType.smithyHttp(runtimeConfig) private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig) val connectorError = smithyHttp.resolve("result::ConnectorError") - val connectorSettings = smithyClient.resolve("http_connector::ConnectorSettings") - val dynConnector = smithyClient.resolve("erase::DynConnector") - val dynMiddleware = smithyClient.resolve("erase::DynMiddleware") val retryConfig = smithyTypes.resolve("retry::RetryConfig") - val smithyClientBuilder = smithyClient.resolve("Builder") - val smithyClientRetry = smithyClient.resolve("retry") - val smithyConnector = smithyClient.resolve("bounds::SmithyConnector") val timeoutConfig = smithyTypes.resolve("timeout::TimeoutConfig") } @@ -57,7 +50,6 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { val types = Types(runtimeConfig) FluentClientGenerator( codegenContext, - reexportSmithyClientBuilder = false, customizations = listOf( AwsPresignedFluentBuilderMethod(codegenContext), AwsFluentClientDocs(codegenContext), @@ -111,15 +103,9 @@ private class AwsFluentClientExtensions(private val codegenContext: ClientCodege private val codegenScope = arrayOf( "Arc" to RuntimeType.Arc, "ConnectorError" to types.connectorError, - "ConnectorSettings" to types.connectorSettings, - "DynConnector" to types.dynConnector, - "DynMiddleware" to types.dynMiddleware, "RetryConfig" to types.retryConfig, - "SmithyConnector" to types.smithyConnector, "TimeoutConfig" to types.timeoutConfig, - "SmithyClientBuilder" to types.smithyClientBuilder, "aws_types" to types.awsTypes, - "retry" to types.smithyClientRetry, ) fun render(writer: RustWriter) { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt index 47570de7f42..d77cc0a29c4 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt @@ -42,26 +42,11 @@ object AwsRuntimeType { ), ) - // TODO(enableNewSmithyRuntimeCleanup): Delete defaultMiddleware and middleware.rs, and remove tower dependency from inlinables, when cleaning up middleware - fun RuntimeConfig.defaultMiddleware() = RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile( - "middleware", visibility = Visibility.PUBLIC, - CargoDependency.smithyHttp(this), - CargoDependency.smithyHttpTower(this), - CargoDependency.smithyClient(this), - CargoDependency.Tower, - AwsCargoDependency.awsSigAuth(this), - AwsCargoDependency.awsHttp(this), - AwsCargoDependency.awsEndpoint(this), - ), - ).resolve("DefaultMiddleware") - fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsCredentialTypes(runtimeConfig).toType() fun awsCredentialTypesTestUtil(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsCredentialTypes(runtimeConfig).toDevDependency().withFeature("test-util").toType() - fun awsEndpoint(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsEndpoint(runtimeConfig).toType() fun awsHttp(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsHttp(runtimeConfig).toType() fun awsSigv4(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsSigv4(runtimeConfig).toType() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index 43210766e08..7408f5b76cc 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -83,7 +83,7 @@ fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Bool * "AWS::S3::UseArnRegion": false * } */ * /* clientParams: {} */ - * let (http_client, rcvr) = aws_smithy_client::test_connection::capture_request(None); + * let (http_client, rcvr) = aws_smithy_runtime::client::http::test_util::capture_request(None); * let conf = { * #[allow(unused_mut)] * let mut builder = aws_sdk_s3::Config::builder() diff --git a/aws/sdk/integration-tests/Makefile b/aws/sdk/integration-tests/Makefile new file mode 100644 index 00000000000..6a4673485b8 --- /dev/null +++ b/aws/sdk/integration-tests/Makefile @@ -0,0 +1,6 @@ +all: test + +test: + ./test.sh + +.PHONY: all test diff --git a/aws/sdk/integration-tests/iam/Cargo.toml b/aws/sdk/integration-tests/iam/Cargo.toml index e1d358ea446..296e9167d16 100644 --- a/aws/sdk/integration-tests/iam/Cargo.toml +++ b/aws/sdk/integration-tests/iam/Cargo.toml @@ -12,7 +12,6 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-endpoint = { path = "../../build/aws-sdk/sdk/aws-endpoint"} aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} aws-sdk-iam = { path = "../../build/aws-sdk/sdk/iam" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } diff --git a/aws/sdk/integration-tests/test.sh b/aws/sdk/integration-tests/test.sh new file mode 100755 index 00000000000..f22bf3f6e71 --- /dev/null +++ b/aws/sdk/integration-tests/test.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -eu -o pipefail + +for f in *; do + if [[ -f "${f}/Cargo.toml" ]]; then + echo + echo "Testing ${f}..." + echo "###############" + cargo test --manifest-path "${f}/Cargo.toml" + fi +done diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index 4bff784adeb..42d54619711 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -19,8 +19,9 @@ async fn do_endpoint_discovery() { let _logs = aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs(); + // For recording, switch to: + // let http_client = aws_smithy_runtime::client::http::test_util::dvr::RecordingClient::new(client); let http_client = ReplayingClient::from_file("tests/traffic.json").unwrap(); - //let conn = aws_smithy_client::dvr::RecordingConnection::new(conn); let start = UNIX_EPOCH + Duration::from_secs(1234567890); let (ts, sleep, mut gate) = controlled_time_and_sleep(start); let config = SdkConfig::builder() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index 684def389a0..375a87a2e61 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -26,7 +26,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait @@ -51,7 +50,6 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> "HTTP_DIGEST_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_DIGEST_AUTH_SCHEME_ID"), "IdentityResolver" to smithyRuntimeApi.resolve("client::identity::IdentityResolver"), "Login" to smithyRuntimeApi.resolve("client::identity::http::Login"), - "PropertyBag" to RuntimeType.smithyHttp(runtimeConfig).resolve("property_bag::PropertyBag"), "SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"), "SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"), "Token" to smithyRuntimeApi.resolve("client::identity::http::Token"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 91f08b80be2..0feb667fe08 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -33,7 +33,6 @@ private class HttpConnectorConfigCustomization( private val codegenScope = arrayOf( *preludeScope, "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), - "ConnectorSettings" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::ConnectorSettings"), "HttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index 6f9892b2cc8..2f47ffba7a6 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -89,7 +89,6 @@ class PaginatorGenerator private constructor( // SDK Types "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), - "client" to RuntimeType.smithyClient(runtimeConfig), "pagination_stream" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::pagination_stream"), // External Types diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt index dfe7ca58024..73296eb3378 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt @@ -53,7 +53,7 @@ class FluentClientDecorator : ClientCodegenDecorator { return baseCustomizations + object : LibRsCustomization() { override fun section(section: LibRsSection) = when (section) { is LibRsSection.Body -> writable { - rust("pub use client::{Client, Builder};") + rust("pub use client::Client;") } else -> emptySection } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 4435f732710..4a9c1626962 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -35,7 +35,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.normalizeHtml import software.amazon.smithy.rust.codegen.core.rustlang.qualifiedName import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate @@ -57,7 +57,6 @@ import software.amazon.smithy.rust.codegen.core.util.toSnakeCase class FluentClientGenerator( private val codegenContext: ClientCodegenContext, - private val reexportSmithyClientBuilder: Boolean = true, private val customizations: List = emptyList(), ) { companion object { @@ -94,19 +93,9 @@ class FluentClientGenerator( private fun renderFluentClient(crate: RustCrate) { crate.withModule(ClientRustModule.client) { - if (reexportSmithyClientBuilder) { - rustTemplate( - """ - ##[doc(inline)] - pub use #{client}::Builder; - """, - "client" to RuntimeType.smithyClient(runtimeConfig), - ) - } val clientScope = arrayOf( *preludeScope, "Arc" to RuntimeType.Arc, - "client" to RuntimeType.smithyClient(runtimeConfig), "client_docs" to writable { customizations.forEach { @@ -181,10 +170,7 @@ class FluentClientGenerator( val privateModule = RustModule.private(moduleName, parent = ClientRustModule.client) crate.withModule(privateModule) { - rustBlockTemplate( - "impl super::Client", - "client" to RuntimeType.smithyClient(runtimeConfig), - ) { + rustBlock("impl super::Client") { val fullPath = operation.fullyQualifiedFluentBuilder(symbolProvider) val maybePaginated = if (operation.isPaginated(model)) { "\n/// This operation supports pagination; See [`into_paginator()`]($fullPath::into_paginator)." @@ -327,10 +313,7 @@ class FluentClientGenerator( "SdkError" to RuntimeType.sdkError(runtimeConfig), ) - rustBlockTemplate( - "impl $builderName", - "client" to RuntimeType.smithyClient(runtimeConfig), - ) { + rustBlock("impl $builderName") { rust("/// Creates a new `${operationSymbol.name}`.") withBlockTemplate( "pub(crate) fn new(handle: #{Arc}) -> Self {", diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 9dbb43f497e..aa5d3f51690 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -283,14 +283,9 @@ data class CargoDependency( fun smithyAsync(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-async") fun smithyChecksums(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-checksums") - fun smithyClient(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-client") - fun smithyClientTestUtil(runtimeConfig: RuntimeConfig) = - smithyClient(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyEventStream(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-eventstream") fun smithyHttp(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http") - fun smithyHttpAuth(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http-auth") - fun smithyHttpTower(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http-tower") fun smithyJson(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-json") fun smithyProtocolTestHelpers(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-protocol-test", scope = DependencyScope.Dev) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 639964f762d..b3560584373 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -317,14 +317,9 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) // smithy runtime types fun smithyAsync(runtimeConfig: RuntimeConfig) = CargoDependency.smithyAsync(runtimeConfig).toType() fun smithyChecksums(runtimeConfig: RuntimeConfig) = CargoDependency.smithyChecksums(runtimeConfig).toType() - fun smithyClient(runtimeConfig: RuntimeConfig) = CargoDependency.smithyClient(runtimeConfig).toType() - fun smithyClientTestUtil(runtimeConfig: RuntimeConfig) = CargoDependency.smithyClient(runtimeConfig) - .copy(features = setOf("test-util"), scope = DependencyScope.Dev).toType() fun smithyEventStream(runtimeConfig: RuntimeConfig) = CargoDependency.smithyEventStream(runtimeConfig).toType() fun smithyHttp(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttp(runtimeConfig).toType() - fun smithyHttpAuth(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttpAuth(runtimeConfig).toType() - fun smithyHttpTower(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttpTower(runtimeConfig).toType() fun smithyJson(runtimeConfig: RuntimeConfig) = CargoDependency.smithyJson(runtimeConfig).toType() fun smithyQuery(runtimeConfig: RuntimeConfig) = CargoDependency.smithyQuery(runtimeConfig).toType() fun smithyRuntime(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntime(runtimeConfig).toType() @@ -400,7 +395,6 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun blob(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("Blob") fun byteStream(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("byte_stream::ByteStream") - fun classifyRetry(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("retry::ClassifyRetry") fun dateTime(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("DateTime") fun document(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("Document") fun format(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("date_time::Format") @@ -427,11 +421,6 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun labelFormat(runtimeConfig: RuntimeConfig, func: String) = smithyHttp(runtimeConfig).resolve("label::$func") fun operation(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("operation::Operation") fun operationModule(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("operation") - fun parseHttpResponse(runtimeConfig: RuntimeConfig) = - smithyHttp(runtimeConfig).resolve("response::ParseHttpResponse") - - fun parseStrictResponse(runtimeConfig: RuntimeConfig) = - smithyHttp(runtimeConfig).resolve("response::ParseStrictResponse") fun protocolTest(runtimeConfig: RuntimeConfig, func: String): RuntimeType = smithyProtocolTest(runtimeConfig).resolve(func) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index 5fc86ee04fd..a353eb636b6 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -42,13 +42,10 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { rustCrate.withModule(ServerRustModule.Types) { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) - // TODO(enableNewSmithyRuntimeCleanup): Remove re-export of SdkError in server and add changelog entry rustTemplate( """ - pub type SdkError = #{SdkError}; pub use #{DisplayErrorContext}; """, - "SdkError" to RuntimeType.smithyHttp(rc).resolve("result::SdkError"), "Response" to RuntimeType.smithyHttp(rc).resolve("operation::Response"), "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), ) diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index 35d3ba5fe28..9981540cb85 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -10,7 +10,6 @@ use std::{ task::{Context, Poll}, }; -use aws_smithy_http::body::SdkBody; use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, IdentityPlugin, Plugin}; use tower::{Layer, Service}; @@ -18,17 +17,6 @@ use aws_smithy_runtime::client::http::test_util::capture_request; use pokemon_service_client::{Client, Config}; use pokemon_service_common::do_nothing; -trait OperationExt { - /// Convert an SDK operation into an `http::Request`. - fn into_http(self) -> http::Request; -} - -impl OperationExt for aws_smithy_http::operation::Operation { - fn into_http(self) -> http::Request { - self.into_request_response().0.into_parts().0 - } -} - #[tokio::test] async fn plugin_layers_are_executed_in_registration_order() { // Each plugin layer will push its name into this vector when it gets invoked. diff --git a/examples/pokemon-service-tls/tests/common/mod.rs b/examples/pokemon-service-tls/tests/common/mod.rs index a13c2e60ee3..8954365a205 100644 --- a/examples/pokemon-service-tls/tests/common/mod.rs +++ b/examples/pokemon-service-tls/tests/common/mod.rs @@ -50,8 +50,8 @@ pub fn client_http2_only() -> Client { Client::from_conf(config) } -/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a smithy client, -/// wrap it in a [aws_smithy_client::hyper_ext::Adapter]. +/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a Smithy client, +/// wrap with a [`HyperClientBuilder`]. pub type NativeTlsConnector = hyper_tls::HttpsConnector; fn native_tls_connector() -> NativeTlsConnector { diff --git a/examples/pokemon-service/Cargo.toml b/examples/pokemon-service/Cargo.toml index d3bc81ea0b6..1a2da1ce8f0 100644 --- a/examples/pokemon-service/Cargo.toml +++ b/examples/pokemon-service/Cargo.toml @@ -31,7 +31,6 @@ hyper = { version = "0.14.26", features = ["server", "client"] } hyper-rustls = { version = "0.24", features = ["http2"] } # Local paths -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client/", features = ["rustls"] } aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } pokemon-service-client = { path = "../pokemon-service-client/" } diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index 8e8c5a39c75..0eb190b56dc 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -2,70 +2,13 @@ name = "aws-smithy-client" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "Client for smithy-rs." +description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" -[features] -rt-tokio = ["aws-smithy-async/rt-tokio"] -test-util = ["dep:aws-smithy-protocol-test", "dep:serde", "dep:serde_json", "serde?/derive"] -wiremock = ["test-util", "dep:hyper", "hyper?/server", "hyper?/h2", "rustls", "tokio/full"] -native-tls = [] -allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI -rustls = ["dep:hyper-rustls", "dep:lazy_static", "dep:rustls", "client-hyper", "rt-tokio"] -client-hyper = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp", "dep:h2"] -hyper-webpki-doctest-only = ["dep:hyper-rustls", "hyper-rustls?/webpki-roots"] - -[dependencies] -aws-smithy-async = { path = "../aws-smithy-async" } -aws-smithy-http = { path = "../aws-smithy-http" } -aws-smithy-http-tower = { path = "../aws-smithy-http-tower" } -aws-smithy-protocol-test = { path = "../aws-smithy-protocol-test", optional = true } -aws-smithy-types = { path = "../aws-smithy-types" } -bytes = "1" -fastrand = "2.0.0" -http = "0.2.3" -http-body = "0.4.4" -hyper = { version = "0.14.26", default-features = false, optional = true } -h2 = { version = "0.3", default-features = false, optional = true } -# cargo does not support optional test dependencies, so to completely disable rustls -# we need to add the webpki-roots feature here. -# https://github.com/rust-lang/cargo/issues/1596 -hyper-rustls = { version = "0.24", optional = true, features = ["rustls-native-certs", "http2"] } -hyper-tls = { version = "0.5.0", optional = true } -# This forces a more recent version of `openssl-sys` to be brought in. -# Without this `cargo minimal-versions check` would fail in a container whose base image is `amazonlinux:2023` -# with the failure symptom: https://github.com/sfackler/rust-openssl/issues/1724 -openssl = { version = "0.10.52", optional = true } -rustls = { version = "0.21.1", optional = true } -lazy_static = { version = "1", optional = true } -pin-project-lite = "0.2.7" -serde = { version = "1", features = ["derive"], optional = true } -serde_json = { version = "1", optional = true } -tokio = { version = "1.13.1" } -tower = { version = "0.4.6", features = ["util", "retry"] } -tracing = "0.1" - -[dev-dependencies] -aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio"] } -hyper-tls = { version = "0.5.0" } -# Dependency on `openssl` above needs to be repeated here. -openssl = "0.10.52" -serde = { version = "1", features = ["derive"] } -serde_json = "1" -tokio = { version = "1.23.1", features = ["full", "test-util"] } -tower-test = "0.4.0" -tracing-subscriber = "0.3.16" -tracing-test = "0.2.4" - - [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata - -[[test]] -name = "e2e_test" -required-features = ["test-util", "rt-tokio"] diff --git a/rust-runtime/aws-smithy-client/README.md b/rust-runtime/aws-smithy-client/README.md index b1deae09be3..3c87cd70d4e 100644 --- a/rust-runtime/aws-smithy-client/README.md +++ b/rust-runtime/aws-smithy-client/README.md @@ -1,12 +1,6 @@ # aws-smithy-client -`aws-smithy-client` defines a Tower-based client that implements functionality that exists across all service clients -generated by [smithy-rs](https://github.com/awslabs/smithy-rs) including: - -- Retries -- Connector, request attempt, and multi-request timeouts -- Configurable middleware -- HTTPS implementations +This crate is no longer used by smithy-rs and is deprecated. Its equivalent logic is now in aws-smithy-runtime-api and aws-smithy-runtime. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-client/additional-ci b/rust-runtime/aws-smithy-client/additional-ci deleted file mode 100755 index e2ada6a73e7..00000000000 --- a/rust-runtime/aws-smithy-client/additional-ci +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# - -# This script contains additional CI checks to run for this specific package - -set -e - -# TODO(msrvUpgrade): This can be enabled when upgrading to Rust 1.71 -# echo '### Checking compilation under WASM' -# cargo hack check --no-dev-deps --target wasm32-unknown-unknown - -echo "### Checking for duplicate dependency versions in the normal dependency graph with all features enabled" -cargo tree -d --edges normal --all-features - -echo "### Testing every combination of features (excluding --all-features)" -cargo hack test --feature-powerset --exclude-all-features --exclude-features native-tls diff --git a/rust-runtime/aws-smithy-client/external-types.toml b/rust-runtime/aws-smithy-client/external-types.toml index 74daaad215d..7fa182b39d1 100644 --- a/rust-runtime/aws-smithy-client/external-types.toml +++ b/rust-runtime/aws-smithy-client/external-types.toml @@ -1,42 +1 @@ -allowed_external_types = [ - "aws_smithy_async::*", - "aws_smithy_http::*", - "aws_smithy_http_tower::*", - "aws_smithy_types::*", - "aws_smithy_protocol_test::MediaType", - "http::header::name::HeaderName", - "http::request::Request", - "http::response::Response", - "http::uri::Uri", - "tower::retry::policy::Policy", - "tower_service::Service", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Move `rustls` feature into separate crates - "hyper::client::connect::http::HttpConnector", - "hyper_rustls::connector::HttpsConnector", - "hyper_tls::client::HttpsConnector", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `client-hyper` feature - "hyper::client::client::Builder", - "hyper::client::connect::Connection", - "tokio::io::async_read::AsyncRead", - "tokio::io::async_write::AsyncWrite", - - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature - "bytes::bytes::Bytes", - "serde::ser::Serialize", - "serde::de::Deserialize", - "hyper::client::connect::dns::Name", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate middleware_fn and service_fn, or remove them if they're unused - "tower::util::map_request::MapRequestLayer", - "tower::util::service_fn::ServiceFn", - "tower_util::MapRequestLayer", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose on `tower::BoxError` - "tower::BoxError", -] +allowed_external_types = [] diff --git a/rust-runtime/aws-smithy-client/src/bounds.rs b/rust-runtime/aws-smithy-client/src/bounds.rs deleted file mode 100644 index e0abf9e4dfc..00000000000 --- a/rust-runtime/aws-smithy-client/src/bounds.rs +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! This module holds convenient short-hands for the otherwise fairly extensive trait bounds -//! required for `call` and friends. -//! -//! The short-hands will one day be true [trait aliases], but for now they are traits with blanket -//! implementations. Also, due to [compiler limitations], the bounds repeat a number of associated -//! types with bounds so that those bounds [do not need to be repeated] at the call site. It's a -//! bit of a mess to define, but _should_ be invisible to callers. -//! -//! [trait aliases]: https://rust-lang.github.io/rfcs/1733-trait-alias.html -//! [compiler limitations]: https://github.com/rust-lang/rust/issues/20671 -//! [do not need to be repeated]: https://github.com/rust-lang/rust/issues/20671#issuecomment-529752828 - -use crate::erase::DynConnector; -use crate::http_connector::HttpConnector; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation::{self, Operation}; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_http::result::{ConnectorError, SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; -use tower::{Layer, Service}; - -/// A service that has parsed a raw Smithy response. -pub type Parsed = - aws_smithy_http_tower::parse_response::ParseResponseService; - -/// A low-level Smithy connector that maps from [`http::Request`] to [`http::Response`]. -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyConnector: - Service< - http::Request, - Response = http::Response, - Error = ::Error, - Future = ::Future, - > + Send - + Sync - + Clone - + 'static -{ - /// Forwarding type to `::Error` for bound inference. - /// - /// See module-level docs for details. - type Error: Into + Send + Sync + 'static; - - /// Forwarding type to `::Future` for bound inference. - /// - /// See module-level docs for details. - type Future: Send + 'static; -} - -impl SmithyConnector for T -where - T: Service, Response = http::Response> - + Send - + Sync - + Clone - + 'static, - T::Error: Into + Send + Sync + 'static, - T::Future: Send + 'static, -{ - type Error = T::Error; - type Future = T::Future; -} - -impl From for HttpConnector -where - E: Into + Send + Sync + 'static, - F: Send + 'static, - T: SmithyConnector>, -{ - fn from(smithy_connector: T) -> Self { - HttpConnector::Prebuilt(Some(DynConnector::new(smithy_connector))) - } -} - -/// A Smithy middleware service that adjusts [`aws_smithy_http::operation::Request`](operation::Request)s. -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyMiddlewareService: - Service< - operation::Request, - Response = operation::Response, - Error = aws_smithy_http_tower::SendOperationError, - Future = ::Future, -> -{ - /// Forwarding type to `::Future` for bound inference. - /// - /// See module-level docs for details. - type Future: Send + 'static; -} - -impl SmithyMiddlewareService for T -where - T: Service< - operation::Request, - Response = operation::Response, - Error = aws_smithy_http_tower::SendOperationError, - >, - T::Future: Send + 'static, -{ - type Future = T::Future; -} - -/// A Smithy middleware layer (i.e., factory). -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyMiddleware: - Layer< - aws_smithy_http_tower::dispatch::DispatchService, - Service = >::Service, -> -{ - /// Forwarding type to `::Service` for bound inference. - /// - /// See module-level docs for details. - type Service: SmithyMiddlewareService + Send + Sync + Clone + 'static; -} - -impl SmithyMiddleware for T -where - T: Layer>, - T::Service: SmithyMiddlewareService + Send + Sync + Clone + 'static, -{ - type Service = T::Service; -} - -/// A Smithy retry policy. -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyRetryPolicy: - tower::retry::Policy, SdkSuccess, SdkError> + Clone -{ - /// Forwarding type to `O` for bound inference. - /// - /// See module-level docs for details. - type O: ParseHttpResponse> + Send + Sync + Clone + 'static; - /// Forwarding type to `E` for bound inference. - /// - /// See module-level docs for details. - type E: std::error::Error; - - /// Forwarding type to `Retry` for bound inference. - /// - /// See module-level docs for details. - type Retry: ClassifyRetry, SdkError>; -} - -impl SmithyRetryPolicy for R -where - R: tower::retry::Policy, SdkSuccess, SdkError> + Clone, - O: ParseHttpResponse> + Send + Sync + Clone + 'static, - E: std::error::Error, - Retry: ClassifyRetry, SdkError>, -{ - type O = O; - type E = E; - type Retry = Retry; -} diff --git a/rust-runtime/aws-smithy-client/src/builder.rs b/rust-runtime/aws-smithy-client/src/builder.rs deleted file mode 100644 index 5602c330f5c..00000000000 --- a/rust-runtime/aws-smithy-client/src/builder.rs +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::{bounds, erase, retry, Client}; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_types::retry::ReconnectMode; -use aws_smithy_types::timeout::{OperationTimeoutConfig, TimeoutConfig}; - -#[derive(Clone, Debug)] -struct MaybeRequiresSleep { - requires_sleep: bool, - implementation: I, -} - -impl MaybeRequiresSleep { - fn new(requires_sleep: bool, implementation: I) -> Self { - Self { - requires_sleep, - implementation, - } - } -} - -/// A builder that provides more customization options when constructing a [`Client`]. -/// -/// To start, call [`Builder::new`]. Then, chain the method calls to configure the `Builder`. -/// When configured to your liking, call [`Builder::build`]. The individual methods have additional -/// documentation. -#[derive(Clone, Debug)] -pub struct Builder { - connector: MaybeRequiresSleep, - middleware: M, - retry_policy: MaybeRequiresSleep, - operation_timeout_config: Option, - sleep_impl: Option, - reconnect_mode: Option, -} - -/// transitional default: disable this behavior by default -const fn default_reconnect_mode() -> ReconnectMode { - ReconnectMode::ReuseAllConnections -} - -impl Default for Builder -where - C: Default, - M: Default, -{ - fn default() -> Self { - let default_retry_config = retry::Config::default(); - Self { - connector: MaybeRequiresSleep::new(false, Default::default()), - middleware: Default::default(), - retry_policy: MaybeRequiresSleep::new( - default_retry_config.has_retry(), - retry::Standard::new(default_retry_config), - ), - operation_timeout_config: None, - sleep_impl: default_async_sleep(), - reconnect_mode: Some(default_reconnect_mode()), - } - } -} - -// It'd be nice to include R where R: Default here, but then the caller ends up always having to -// specify R explicitly since type parameter defaults (like the one for R) aren't picked up when R -// cannot be inferred. This is, arguably, a compiler bug/missing language feature, but is -// complicated: https://github.com/rust-lang/rust/issues/27336. -// -// For the time being, we stick with just for ::new. Those can usually be inferred since we -// only implement .constructor and .middleware when C and M are () respectively. Users who really -// need a builder for a custom R can use ::default instead. -impl Builder -where - C: Default, - M: Default, -{ - /// Construct a new builder. This does not specify a [connector](Builder::connector) - /// or [middleware](Builder::middleware). - /// It uses the [standard retry mechanism](retry::Standard). - pub fn new() -> Self { - Self::default() - } -} - -#[cfg(feature = "rustls")] -use crate::erase::DynConnector; -#[cfg(feature = "rustls")] -use crate::http_connector::ConnectorSettings; -#[cfg(feature = "rustls")] -use crate::hyper_ext::Adapter as HyperAdapter; - -#[cfg(all(feature = "native-tls", not(feature = "allow-compilation")))] -compile_error!("Feature native-tls has been removed. For upgrade instructions, see: https://awslabs.github.io/smithy-rs/design/transport/connector.html"); - -/// Max idle connections is not standardized across SDKs. Java V1 and V2 use 50, and Go V2 uses 100. -/// The number below was chosen arbitrarily between those two reference points, and should allow -/// for 14 separate SDK clients in a Lambda where the max file handles is 1024. -#[cfg(feature = "rustls")] -const DEFAULT_MAX_IDLE_CONNECTIONS: usize = 70; - -/// Returns default HTTP client settings for hyper. -#[cfg(feature = "rustls")] -fn default_hyper_builder() -> hyper::client::Builder { - let mut builder = hyper::client::Builder::default(); - builder.pool_max_idle_per_host(DEFAULT_MAX_IDLE_CONNECTIONS); - builder -} - -#[cfg(feature = "rustls")] -impl Builder<(), M, R> { - /// Connect to the service over HTTPS using Rustls using dynamic dispatch. - pub fn rustls_connector( - self, - connector_settings: ConnectorSettings, - ) -> Builder { - self.connector(DynConnector::new( - HyperAdapter::builder() - .hyper_builder(default_hyper_builder()) - .connector_settings(connector_settings) - .build(crate::conns::https()), - )) - } -} - -#[cfg(feature = "rustls")] -impl Builder<(), M, R> { - /// Create a Smithy client builder with an HTTPS connector and the [standard retry - /// policy](crate::retry::Standard) over the default middleware implementation. - /// - /// For convenience, this constructor type-erases the concrete TLS connector backend used using - /// dynamic dispatch. This comes at a slight runtime performance cost. See - /// [`DynConnector`](crate::erase::DynConnector) for details. To avoid that overhead, use - /// [`Builder::rustls_connector`] instead. - #[cfg(feature = "rustls")] - pub fn dyn_https_connector( - self, - connector_settings: ConnectorSettings, - ) -> Builder { - let with_https = |b: Builder<_, M, R>| b.rustls_connector(connector_settings); - with_https(self) - } -} - -impl Builder<(), M, R> { - /// Specify the connector for the eventual client to use. - /// - /// The connector dictates how requests are turned into responses. Normally, this would entail - /// sending the request to some kind of remote server, but in certain settings it's useful to - /// be able to use a custom connector instead, such as to mock the network for tests. - /// - /// If you just want to specify a function from request to response instead, use - /// [`Builder::connector_fn`]. - pub fn connector(self, connector: C) -> Builder { - Builder { - connector: MaybeRequiresSleep::new(false, connector), - middleware: self.middleware, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Use a function that directly maps each request to a response as a connector. - /// - /// ```no_run - /// use aws_smithy_client::Builder; - /// use aws_smithy_http::body::SdkBody; - /// let client = Builder::new() - /// # /* - /// .middleware(..) - /// # */ - /// # .middleware(tower::layer::util::Identity::new()) - /// .connector_fn(|req: http::Request| { - /// async move { - /// Ok(http::Response::new(SdkBody::empty())) - /// } - /// }) - /// .build(); - /// # client.check(); - /// ``` - pub fn connector_fn(self, map: F) -> Builder, M, R> - where - F: Fn(http::Request) -> FF + Send, - FF: std::future::Future, ConnectorError>>, - // NOTE: The extra bound here is to help the type checker give better errors earlier. - tower::util::ServiceFn: bounds::SmithyConnector, - { - self.connector(tower::service_fn(map)) - } -} - -impl Builder { - /// Specify the middleware for the eventual client ot use. - /// - /// The middleware adjusts requests before they are dispatched to the connector. It is - /// responsible for filling in any request parameters that aren't specified by the Smithy - /// protocol definition, such as those used for routing (like the URL), authentication, and - /// authorization. - /// - /// The middleware takes the form of a [`tower::Layer`] that wraps the actual connection for - /// each request. The [`tower::Service`] that the middleware produces must accept requests of - /// the type [`aws_smithy_http::operation::Request`] and return responses of the type - /// [`http::Response`], most likely by modifying the provided request in place, - /// passing it to the inner service, and then ultimately returning the inner service's - /// response. - /// - /// If your requests are already ready to be sent and need no adjustment, you can use - /// [`tower::layer::util::Identity`] as your middleware. - pub fn middleware(self, middleware: M) -> Builder { - Builder { - connector: self.connector, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - middleware, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Use a function-like middleware that directly maps each request. - /// - /// ```no_run - /// use aws_smithy_client::Builder; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::never::NeverConnector; - /// use aws_smithy_http::body::SdkBody; - /// let my_connector = DynConnector::new( - /// // Your own connector here or use `dyn_https_connector()` - /// # NeverConnector::new() - /// ); - /// let client = Builder::new() - /// .connector(my_connector) - /// .middleware_fn(|req: aws_smithy_http::operation::Request| { - /// req - /// }) - /// .build(); - /// # client.check(); - /// ``` - pub fn middleware_fn(self, map: F) -> Builder, R> - where - F: Fn(aws_smithy_http::operation::Request) -> aws_smithy_http::operation::Request - + Clone - + Send - + Sync - + 'static, - { - self.middleware(tower::util::MapRequestLayer::new(map)) - } -} - -impl Builder { - /// Specify the retry policy for the eventual client to use. - /// - /// By default, the Smithy client uses a standard retry policy that works well in most - /// settings. You can use this method to override that policy with a custom one. A new policy - /// instance will be instantiated for each request using [`retry::NewRequestPolicy`]. Each - /// policy instance must implement [`tower::retry::Policy`]. - /// - /// If you just want to modify the policy _configuration_ for the standard retry policy, use - /// [`Builder::set_retry_config`]. - pub fn retry_policy(self, retry_policy: R) -> Builder { - Builder { - connector: self.connector, - retry_policy: MaybeRequiresSleep::new(false, retry_policy), - operation_timeout_config: self.operation_timeout_config, - middleware: self.middleware, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } -} - -impl Builder { - /// Set the standard retry policy's configuration. When `config` is `None`, - /// the default retry policy will be used. - pub fn set_retry_config(&mut self, config: Option) -> &mut Self { - let config = config.unwrap_or_default(); - self.retry_policy = - MaybeRequiresSleep::new(config.has_retry(), retry::Standard::new(config)); - self - } - - /// Set the standard retry policy's configuration. - pub fn retry_config(mut self, config: retry::Config) -> Self { - self.set_retry_config(Some(config)); - self - } - - /// Set operation timeout config for the client. If `operation_timeout_config` is - /// `None`, timeouts will be disabled. - pub fn set_operation_timeout_config( - &mut self, - operation_timeout_config: Option, - ) -> &mut Self { - self.operation_timeout_config = operation_timeout_config; - self - } - - /// Set operation timeout config for the client. - pub fn operation_timeout_config( - mut self, - operation_timeout_config: OperationTimeoutConfig, - ) -> Self { - self.operation_timeout_config = Some(operation_timeout_config); - self - } - - /// Set [`aws_smithy_async::rt::sleep::SharedAsyncSleep`] that the [`Client`] will use to create things like timeout futures. - pub fn set_sleep_impl(&mut self, async_sleep: Option) -> &mut Self { - self.sleep_impl = async_sleep; - self - } - - /// Set [`aws_smithy_async::rt::sleep::SharedAsyncSleep`] that the [`Client`] will use to create things like timeout futures. - pub fn sleep_impl(mut self, async_sleep: SharedAsyncSleep) -> Self { - self.set_sleep_impl(Some(async_sleep)); - self - } -} - -impl Builder { - /// Use a connector that wraps the current connector. - pub fn map_connector(self, map: F) -> Builder - where - F: FnOnce(C) -> C2, - { - Builder { - connector: MaybeRequiresSleep::new( - self.connector.requires_sleep, - map(self.connector.implementation), - ), - middleware: self.middleware, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Use a middleware that wraps the current middleware. - pub fn map_middleware(self, map: F) -> Builder - where - F: FnOnce(M) -> M2, - { - Builder { - connector: self.connector, - middleware: map(self.middleware), - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Set the [`ReconnectMode`] for the retry strategy - /// - /// By default, no reconnection occurs. - /// - /// When enabled and a transient error is encountered, the connection in use will be poisoned. - /// This prevents reusing a connection to a potentially bad host. - pub fn reconnect_mode(mut self, reconnect_mode: ReconnectMode) -> Self { - self.set_reconnect_mode(Some(reconnect_mode)); - self - } - - /// Set the [`ReconnectMode`] for the retry strategy - /// - /// By default, no reconnection occurs. - /// - /// When enabled and a transient error is encountered, the connection in use will be poisoned. - /// This prevents reusing a connection to a potentially bad host. - pub fn set_reconnect_mode(&mut self, reconnect_mode: Option) -> &mut Self { - self.reconnect_mode = reconnect_mode; - self - } - - /// Enable reconnection on transient errors - /// - /// By default, when a transient error is encountered, the connection in use will be poisoned. - /// This prevents reusing a connection to a potentially bad host but may increase the load on - /// the server. - pub fn reconnect_on_transient_errors(self) -> Self { - self.reconnect_mode(ReconnectMode::ReconnectOnTransientError) - } - - /// Build a Smithy service [`Client`]. - pub fn build(self) -> Client { - let operation_timeout_config = self - .operation_timeout_config - .unwrap_or_else(|| TimeoutConfig::disabled().into()); - if self.sleep_impl.is_none() { - const ADDITIONAL_HELP: &str = - "Either disable retry by setting max attempts to one, or pass in a `sleep_impl`. \ - If you're not using Tokio, then an implementation of the `AsyncSleep` trait from \ - the `aws-smithy-async` crate is required for your async runtime. If you are using \ - Tokio, then make sure the `rt-tokio` feature is enabled to have its sleep \ - implementation set automatically."; - if self.connector.requires_sleep { - panic!("Socket-level retries for the default connector require a `sleep_impl`, but none was passed into the builder. {ADDITIONAL_HELP}"); - } - if self.retry_policy.requires_sleep { - panic!("Retries require a `sleep_impl`, but none was passed into the builder. {ADDITIONAL_HELP}"); - } - if operation_timeout_config.has_timeouts() { - panic!("Operation timeouts require a `sleep_impl`, but none was passed into the builder. {ADDITIONAL_HELP}"); - } - } - Client { - connector: self.connector.implementation, - retry_policy: self.retry_policy.implementation, - middleware: self.middleware, - operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode.unwrap_or(default_reconnect_mode()), - } - } -} - -impl Builder -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware + Send + Sync + 'static, - R: retry::NewRequestPolicy, -{ - /// Build a type-erased Smithy service [`Client`]. - /// - /// Note that if you're using the standard retry mechanism, [`retry::Standard`], `DynClient` - /// is equivalent to [`Client`] with no type arguments. - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: aws_smithy_client::Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build_dyn(); - /// let client = MyClient { client }; - /// # client.client.check(); - /// # } - pub fn build_dyn(self) -> erase::DynClient { - self.build().into_dyn() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::never::NeverConnector; - use aws_smithy_async::rt::sleep::{AsyncSleep, Sleep}; - use std::panic::{self, AssertUnwindSafe}; - use std::time::Duration; - - #[derive(Clone, Debug)] - struct StubSleep; - impl AsyncSleep for StubSleep { - fn sleep(&self, _duration: Duration) -> Sleep { - todo!() - } - } - - #[test] - fn defaults_dont_panic() { - let builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - - let _ = builder.build(); - } - - #[test] - fn defaults_panic_if_default_tokio_sleep_not_available() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - builder.set_sleep_impl(None); - - let result = panic::catch_unwind(AssertUnwindSafe(move || { - let _ = builder.build(); - })); - assert!(result.is_err()); - } - - #[test] - fn timeouts_without_sleep_panics() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - builder.set_sleep_impl(None); - - let timeout_config = TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(); - assert!(timeout_config.has_timeouts()); - builder.set_operation_timeout_config(Some(timeout_config.into())); - - let result = panic::catch_unwind(AssertUnwindSafe(move || { - let _ = builder.build(); - })); - assert!(result.is_err()); - } - - #[test] - fn retry_without_sleep_panics() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - builder.set_sleep_impl(None); - - let retry_config = retry::Config::default(); - assert!(retry_config.has_retry()); - builder.set_retry_config(Some(retry_config)); - - let result = panic::catch_unwind(AssertUnwindSafe(move || { - let _ = builder.build(); - })); - assert!(result.is_err()); - } - - #[test] - fn custom_retry_policy_without_sleep_doesnt_panic() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()) - // Using standard retry here as a shortcut in the test; someone setting - // a custom retry policy would manually implement the required traits - .retry_policy(retry::Standard::default()); - builder.set_sleep_impl(None); - let _ = builder.build(); - } - - #[test] - fn no_panics_when_sleep_given() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - - let timeout_config = TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(); - assert!(timeout_config.has_timeouts()); - builder.set_operation_timeout_config(Some(timeout_config.into())); - - let retry_config = retry::Config::default(); - assert!(retry_config.has_retry()); - builder.set_retry_config(Some(retry_config)); - - let _ = builder.build(); - } - - #[test] - fn builder_connection_helpers_are_dyn() { - #[cfg(feature = "rustls")] - let _builder: Builder = - Builder::new().rustls_connector(Default::default()); - } -} diff --git a/rust-runtime/aws-smithy-client/src/conns.rs b/rust-runtime/aws-smithy-client/src/conns.rs deleted file mode 100644 index 8ee1d8a929a..00000000000 --- a/rust-runtime/aws-smithy-client/src/conns.rs +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Type aliases for standard connection types. - -use crate::erase::DynConnector; - -#[cfg(feature = "rustls")] -/// A `hyper` connector that uses the `rustls` crate for TLS. To use this in a smithy client, -/// wrap it in a [hyper_ext::Adapter](crate::hyper_ext::Adapter). -pub type Https = hyper_rustls::HttpsConnector; - -#[cfg(feature = "rustls")] -/// A smithy connector that uses the `rustls` crate for TLS. -pub type Rustls = crate::hyper_ext::Adapter; - -#[cfg(feature = "rustls")] -use hyper_rustls::ConfigBuilderExt; - -// Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we -// don't need to repeatedly incur that cost. -#[cfg(feature = "rustls")] -lazy_static::lazy_static! { - static ref HTTPS_NATIVE_ROOTS: Https = { - hyper_rustls::HttpsConnectorBuilder::new() - .with_tls_config( - rustls::ClientConfig::builder() - .with_cipher_suites(&[ - // TLS1.3 suites - rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - // TLS1.2 suites - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - ]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .expect("Error with the TLS configuration. Please file a bug report under https://github.com/awslabs/smithy-rs/issues.") - .with_native_roots() - .with_no_client_auth() - ) - .https_or_http() - .enable_http1() - .enable_http2() - .build() - }; -} - -mod default_connector { - use crate::erase::DynConnector; - use crate::http_connector::ConnectorSettings; - use aws_smithy_async::rt::sleep::SharedAsyncSleep; - - #[cfg(feature = "rustls")] - fn base( - settings: &ConnectorSettings, - sleep: Option, - ) -> crate::hyper_ext::Builder { - let mut hyper = crate::hyper_ext::Adapter::builder().connector_settings(settings.clone()); - if let Some(sleep) = sleep { - hyper = hyper.sleep_impl(sleep); - } - hyper - } - - /// Given `ConnectorSettings` and an `SharedAsyncSleep`, create a `DynConnector` from defaults depending on what cargo features are activated. - pub fn default_connector( - settings: &ConnectorSettings, - sleep: Option, - ) -> Option { - #[cfg(feature = "rustls")] - { - tracing::trace!(settings = ?settings, sleep = ?sleep, "creating a new default connector"); - let hyper = base(settings, sleep).build(super::https()); - Some(DynConnector::new(hyper)) - } - #[cfg(not(feature = "rustls"))] - { - tracing::trace!(settings = ?settings, sleep = ?sleep, "no default connector available"); - None - } - } -} -pub use default_connector::default_connector; - -/// Error that indicates a connector is required. -#[non_exhaustive] -#[derive(Debug, Default)] -pub struct ConnectorRequiredError; - -impl std::fmt::Display for ConnectorRequiredError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str("No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this.") - } -} - -impl std::error::Error for ConnectorRequiredError {} - -/// Converts an optional connector to a result. -pub fn require_connector( - connector: Option, -) -> Result { - connector.ok_or(ConnectorRequiredError) -} - -#[cfg(feature = "rustls")] -/// Return a default HTTPS connector backed by the `rustls` crate. -/// -/// It requires a minimum TLS version of 1.2. -/// It allows you to connect to both `http` and `https` URLs. -pub fn https() -> Https { - HTTPS_NATIVE_ROOTS.clone() -} - -#[cfg(all(test, feature = "rustls"))] -mod tests { - use crate::erase::DynConnector; - use crate::hyper_ext::Adapter; - use aws_smithy_http::body::SdkBody; - use http::{Method, Request, Uri}; - use tower::{Service, ServiceBuilder}; - - async fn send_request_and_assert_success(conn: DynConnector, uri: &Uri) { - let mut svc = ServiceBuilder::new().service(conn); - let req = Request::builder() - .uri(uri) - .method(Method::GET) - .body(SdkBody::empty()) - .unwrap(); - let res = svc.call(req).await.unwrap(); - assert!(res.status().is_success()); - } - - #[cfg(feature = "rustls")] - mod rustls_tests { - use super::super::https; - use super::*; - - #[tokio::test] - async fn test_rustls_connector_can_make_http_requests() { - let conn = Adapter::builder().build(https()); - let conn = DynConnector::new(conn); - let http_uri: Uri = "http://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &http_uri).await; - } - - #[tokio::test] - async fn test_rustls_connector_can_make_https_requests() { - let conn = Adapter::builder().build(https()); - let conn = DynConnector::new(conn); - let https_uri: Uri = "https://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &https_uri).await; - } - } -} - -#[cfg(test)] -mod custom_tls_tests { - use crate::erase::DynConnector; - use crate::hyper_ext::Adapter; - use aws_smithy_http::body::SdkBody; - use http::{Method, Request, Uri}; - use tower::{Service, ServiceBuilder}; - - type NativeTls = hyper_tls::HttpsConnector; - - fn native_tls() -> NativeTls { - let mut tls = hyper_tls::native_tls::TlsConnector::builder(); - let tls = tls - .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12)) - .build() - .unwrap_or_else(|e| panic!("Error while creating TLS connector: {}", e)); - let mut http = hyper::client::HttpConnector::new(); - http.enforce_http(false); - hyper_tls::HttpsConnector::from((http, tls.into())) - } - - #[tokio::test] - async fn test_native_tls_connector_can_make_http_requests() { - let conn = Adapter::builder().build(native_tls()); - let conn = DynConnector::new(conn); - let http_uri: Uri = "http://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &http_uri).await; - } - - #[tokio::test] - async fn test_native_tls_connector_can_make_https_requests() { - let conn = Adapter::builder().build(native_tls()); - let conn = DynConnector::new(conn); - let https_uri: Uri = "https://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &https_uri).await; - } - - async fn send_request_and_assert_success(conn: DynConnector, uri: &Uri) { - let mut svc = ServiceBuilder::new().service(conn); - let mut att = 0; - let res = loop { - let req = Request::builder() - .uri(uri) - .method(Method::GET) - .body(SdkBody::empty()) - .unwrap(); - if let Ok(res) = svc.call(req).await { - break res; - } - assert!(att < 5); - att += 1; - }; - assert!(res.status().is_success()); - } -} diff --git a/rust-runtime/aws-smithy-client/src/dvr.rs b/rust-runtime/aws-smithy-client/src/dvr.rs deleted file mode 100644 index f0f68a4709d..00000000000 --- a/rust-runtime/aws-smithy-client/src/dvr.rs +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Extremely Experimental Test Connection -//! -//! Warning: Extremely experimental, API likely to change. -//! -//! DVR is an extremely experimental record & replay framework that supports multi-frame HTTP request / response traffic. - -use std::collections::HashMap; - -use bytes::Bytes; -use serde::{Deserialize, Serialize}; - -pub use aws_smithy_protocol_test::MediaType; -use aws_smithy_types::base64; -pub use record::RecordingConnection; -pub use replay::ReplayingConnection; - -mod record; -mod replay; - -/// A complete traffic recording -/// -/// A traffic recording can be replayed with [`RecordingConnection`](RecordingConnection) -#[derive(Debug, Serialize, Deserialize)] -pub struct NetworkTraffic { - events: Vec, - docs: Option, - version: Version, -} - -impl NetworkTraffic { - /// Network events - pub fn events(&self) -> &Vec { - &self.events - } -} - -/// Serialization version of DVR data -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] -pub enum Version { - /// Initial network traffic version - V0, -} - -/// A network traffic recording may contain multiple different connections occurring simultaneously -#[derive(Copy, Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq)] -pub struct ConnectionId(usize); - -/// A network event -/// -/// Network events consist of a connection identifier and an action. An event is sufficient to -/// reproduce traffic later during replay -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] -pub struct Event { - connection_id: ConnectionId, - action: Action, -} - -/// An initial HTTP request, roughly equivalent to `http::Request<()>` -/// -/// The initial request phase of an HTTP request. The body will be -/// sent later as a separate action. -#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] -pub struct Request { - uri: String, - headers: HashMap>, - method: String, -} - -/// An initial HTTP response roughly equivalent to `http::Response<()>` -/// -/// The initial response phase of an HTTP request. The body will be -/// sent later as a separate action. -#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] -pub struct Response { - status: u16, - version: String, - headers: HashMap>, -} - -impl From<&Request> for http::Request<()> { - fn from(request: &Request) -> Self { - let mut builder = http::Request::builder().uri(request.uri.as_str()); - for (k, values) in request.headers.iter() { - for v in values { - builder = builder.header(k, v); - } - } - builder.method(request.method.as_str()).body(()).unwrap() - } -} - -impl<'a, B> From<&'a http::Request> for Request { - fn from(req: &'a http::Request) -> Self { - let uri = req.uri().to_string(); - let headers = headers_to_map(req.headers()); - let method = req.method().to_string(); - Self { - uri, - headers, - method, - } - } -} - -fn headers_to_map(headers: &http::HeaderMap) -> HashMap> { - let mut out: HashMap<_, Vec<_>> = HashMap::new(); - for (header_name, header_value) in headers.iter() { - let entry = out.entry(header_name.to_string()).or_default(); - entry.push(header_value.to_str().unwrap().to_string()); - } - out -} - -impl<'a, B> From<&'a http::Response> for Response { - fn from(resp: &'a http::Response) -> Self { - let status = resp.status().as_u16(); - let version = format!("{:?}", resp.version()); - let headers = headers_to_map(resp.headers()); - Self { - status, - version, - headers, - } - } -} - -/// Error response wrapper -#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] -pub struct Error(String); - -/// Network Action -#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] -#[non_exhaustive] -pub enum Action { - /// Initial HTTP Request - Request { - /// HTTP Request headers, method, and URI - request: Request, - }, - - /// Initial HTTP response or failure - Response { - /// HTTP response or failure - response: Result, - }, - - /// Data segment - Data { - /// Body Data - data: BodyData, - /// Direction: request vs. response - direction: Direction, - }, - - /// End of data - Eof { - /// Succesful vs. failed termination - ok: bool, - /// Direction: request vs. response - direction: Direction, - }, -} - -/// Event direction -/// -/// During replay, this is used to replay data in the right direction -#[derive(Copy, Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] -pub enum Direction { - /// Request phase - Request, - /// Response phase - Response, -} - -impl Direction { - /// The opposite of a given direction - pub fn opposite(self) -> Self { - match self { - Direction::Request => Direction::Response, - Direction::Response => Direction::Request, - } - } -} - -/// HTTP Body Data Abstraction -/// -/// When the data is a UTF-8 encoded string, it will be serialized as a string for readability. -/// Otherwise, it will be base64 encoded. -#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] -#[non_exhaustive] -pub enum BodyData { - /// UTF-8 encoded data - Utf8(String), - - /// Base64 encoded binary data - Base64(String), -} - -impl BodyData { - /// Convert [`BodyData`](BodyData) into Bytes - pub fn into_bytes(self) -> Vec { - match self { - BodyData::Utf8(string) => string.into_bytes(), - BodyData::Base64(string) => base64::decode(string).unwrap(), - } - } - - /// Copy [`BodyData`](BodyData) into a `Vec` - pub fn copy_to_vec(&self) -> Vec { - match self { - BodyData::Utf8(string) => string.as_bytes().into(), - BodyData::Base64(string) => base64::decode(string).unwrap(), - } - } -} - -impl From for BodyData { - fn from(data: Bytes) -> Self { - match std::str::from_utf8(data.as_ref()) { - Ok(string) => BodyData::Utf8(string.to_string()), - Err(_) => BodyData::Base64(base64::encode(data)), - } - } -} - -#[cfg(test)] -mod tests { - use std::error::Error; - use std::fs; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; - - use crate::dvr::{NetworkTraffic, RecordingConnection, ReplayingConnection}; - use bytes::Bytes; - use http::Uri; - - #[tokio::test] - async fn turtles_all_the_way_down() -> Result<(), Box> { - // create a replaying connection from a recording, wrap a recording connection around it, - // make a request, then verify that the same traffic was recorded. - let network_traffic = fs::read_to_string("test-data/example.com.json")?; - let network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?; - let inner = ReplayingConnection::new(network_traffic.events.clone()); - let mut connection = RecordingConnection::new(inner.clone()); - let req = http::Request::post("https://www.example.com") - .body(SdkBody::from("hello world")) - .unwrap(); - use tower::Service; - let mut resp = connection.call(req).await.expect("ok"); - let body = std::mem::replace(resp.body_mut(), SdkBody::taken()); - let data = ByteStream::new(body).collect().await.unwrap().into_bytes(); - assert_eq!( - String::from_utf8(data.to_vec()).unwrap(), - "hello from example.com" - ); - assert_eq!( - connection.events().as_slice(), - network_traffic.events.as_slice() - ); - let requests = inner.take_requests().await; - assert_eq!( - requests[0].uri(), - &Uri::from_static("https://www.example.com") - ); - assert_eq!( - requests[0].body(), - &Bytes::from_static("hello world".as_bytes()) - ); - Ok(()) - } -} diff --git a/rust-runtime/aws-smithy-client/src/dvr/record.rs b/rust-runtime/aws-smithy-client/src/dvr/record.rs deleted file mode 100644 index 9415528f738..00000000000 --- a/rust-runtime/aws-smithy-client/src/dvr/record.rs +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::future::Future; -use std::pin::Pin; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::{Arc, Mutex, MutexGuard}; -use std::task::{Context, Poll}; - -use http_body::Body; -use tokio::task::JoinHandle; -use tower::Service; - -use aws_smithy_http::body::SdkBody; - -use crate::dvr::{self, Action, BodyData, ConnectionId, Direction, Error, NetworkTraffic, Version}; - -use super::Event; -use std::fmt::Display; -use std::io; -use std::path::Path; - -/// Recording Connection Wrapper -/// -/// RecordingConnection wraps an inner connection and records all traffic, enabling traffic replay. -#[derive(Clone, Debug)] -pub struct RecordingConnection { - pub(crate) data: Arc>>, - pub(crate) num_events: Arc, - pub(crate) inner: S, -} - -#[cfg(all(feature = "rustls", feature = "client-hyper"))] -impl RecordingConnection> { - /// Construct a recording connection wrapping a default HTTPS implementation - pub fn https() -> Self { - Self { - data: Default::default(), - inner: crate::hyper_ext::Adapter::builder().build(crate::conns::https()), - num_events: Arc::new(AtomicUsize::new(0)), - } - } -} - -impl RecordingConnection { - /// Create a new recording connection from a connection - pub fn new(connection: S) -> Self { - Self { - data: Default::default(), - inner: connection, - num_events: Arc::new(AtomicUsize::new(0)), - } - } - - /// Return the traffic recorded by this connection - pub fn events(&self) -> MutexGuard<'_, Vec> { - self.data.lock().unwrap() - } - - /// NetworkTraffic struct suitable for serialization - pub fn network_traffic(&self) -> NetworkTraffic { - NetworkTraffic { - events: self.events().clone(), - docs: Some("todo docs".into()), - version: Version::V0, - } - } - - /// Dump the network traffic to a file - pub fn dump_to_file(&self, path: impl AsRef) -> Result<(), io::Error> { - std::fs::write( - path, - serde_json::to_string(&self.network_traffic()).unwrap(), - ) - } - - fn next_id(&self) -> ConnectionId { - ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed)) - } -} - -fn record_body( - body: &mut SdkBody, - event_id: ConnectionId, - direction: Direction, - event_bus: Arc>>, -) -> JoinHandle<()> { - let (sender, output_body) = hyper::Body::channel(); - let real_body = std::mem::replace(body, SdkBody::from(output_body)); - tokio::spawn(async move { - let mut real_body = real_body; - let mut sender = sender; - loop { - let data = real_body.data().await; - match data { - Some(Ok(data)) => { - event_bus.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Data { - data: BodyData::from(data.clone()), - direction, - }, - }); - // This happens if the real connection is closed during recording. - // Need to think more carefully if this is the correct thing to log in this - // case. - if sender.send_data(data).await.is_err() { - event_bus.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Eof { - direction: direction.opposite(), - ok: false, - }, - }) - }; - } - None => { - event_bus.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Eof { - ok: true, - direction, - }, - }); - drop(sender); - break; - } - Some(Err(_err)) => { - event_bus.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Eof { - ok: false, - direction, - }, - }); - sender.abort(); - break; - } - } - } - }) -} - -impl tower::Service> for RecordingConnection -where - S: Service, Response = http::Response> - + Send - + Clone - + 'static, - S::Error: Display + Send + Sync + 'static, - S::Future: Send + 'static, - ResponseBody: Into, -{ - type Response = http::Response; - type Error = S::Error; - #[allow(clippy::type_complexity)] - type Future = - Pin, Self::Error>> + Send>>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, mut req: http::Request) -> Self::Future { - let event_id = self.next_id(); - // A request has two 3 phases: - // 1. A "Request" phase. This is initial HTTP request, headers, & URI - // 2. A body phase. This may contain multiple data segments. - // 3. A finalization phase. An EOF of some sort is sent on the body to indicate that - // the channel should be closed. - - // Phase 1: the initial http request - self.data.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Request { - request: dvr::Request::from(&req), - }, - }); - - // Phase 2: Swap out the real request body for one that will log all traffic that passes - // through it - // This will also handle phase three when the request body runs out of data. - record_body( - req.body_mut(), - event_id, - Direction::Request, - self.data.clone(), - ); - let events = self.data.clone(); - // create a channel we'll use to stream the data while reading it - let resp_fut = self.inner.call(req); - let fut = async move { - let resp = resp_fut.await; - match resp { - Ok(resp) => { - // wrap the hyper body in an SDK body - let mut resp = resp.map(|body| body.into()); - - // push the initial response event - events.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Response { - response: Ok(dvr::Response::from(&resp)), - }, - }); - - // instrument the body and record traffic - record_body(resp.body_mut(), event_id, Direction::Response, events); - Ok(resp) - } - Err(e) => { - events.lock().unwrap().push(Event { - connection_id: event_id, - action: Action::Response { - response: Err(Error(format!("{}", &e))), - }, - }); - Err(e) - } - } - }; - Box::pin(fut) - } -} diff --git a/rust-runtime/aws-smithy-client/src/dvr/replay.rs b/rust-runtime/aws-smithy-client/src/dvr/replay.rs deleted file mode 100644 index 27e606f0824..00000000000 --- a/rust-runtime/aws-smithy-client/src/dvr/replay.rs +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::collections::{HashMap, VecDeque}; -use std::error::Error; -use std::ops::DerefMut; -use std::path::Path; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::{Arc, Mutex}; -use std::task::{Context, Poll}; - -use bytes::{Bytes, BytesMut}; -use http::{Request, Version}; -use http_body::Body; -use tokio::task::JoinHandle; - -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::MediaType; -use aws_smithy_types::error::display::DisplayErrorContext; - -use crate::dvr::{Action, ConnectionId, Direction, Event, NetworkTraffic}; - -/// Wrapper type to enable optionally waiting for a future to complete -#[derive(Debug)] -enum Waitable { - Loading(JoinHandle), - Value(T), -} - -impl Waitable { - /// Consumes the future and returns the value - async fn take(self) -> T { - match self { - Waitable::Loading(f) => f.await.expect("join failed"), - Waitable::Value(value) => value, - } - } - - /// Waits for the future to be ready - async fn wait(&mut self) { - match self { - Waitable::Loading(f) => *self = Waitable::Value(f.await.expect("join failed")), - Waitable::Value(_) => {} - } - } -} - -/// Replay traffic recorded by a [`RecordingConnection`](super::RecordingConnection) -#[derive(Clone, Debug)] -pub struct ReplayingConnection { - live_events: Arc>>>, - verifiable_events: Arc>>, - num_events: Arc, - recorded_requests: Arc>>>>, -} - -impl ReplayingConnection { - fn next_id(&self) -> ConnectionId { - ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed)) - } - - /// Validate all headers and bodies - pub async fn full_validate(self, media_type: MediaType) -> Result<(), Box> { - self.validate_body_and_headers(None, media_type).await - } - - /// Validate actual requests against expected requests - pub async fn validate( - self, - checked_headers: &[&str], - body_comparer: impl Fn(&[u8], &[u8]) -> Result<(), Box>, - ) -> Result<(), Box> { - self.validate_base(Some(checked_headers), body_comparer) - .await - } - - /// Validate that the bodies match, using a given [`MediaType`] for comparison - /// - /// The specified headers are also validated - pub async fn validate_body_and_headers( - self, - checked_headers: Option<&[&str]>, - media_type: MediaType, - ) -> Result<(), Box> { - self.validate_base(checked_headers, |b1, b2| { - aws_smithy_protocol_test::validate_body( - b1, - std::str::from_utf8(b2).unwrap(), - media_type.clone(), - ) - .map_err(|e| Box::new(e) as _) - }) - .await - } - - async fn validate_base( - self, - checked_headers: Option<&[&str]>, - body_comparer: impl Fn(&[u8], &[u8]) -> Result<(), Box>, - ) -> Result<(), Box> { - let mut actual_requests = - std::mem::take(self.recorded_requests.lock().unwrap().deref_mut()); - for conn_id in 0..self.verifiable_events.len() { - let conn_id = ConnectionId(conn_id); - let expected = self.verifiable_events.get(&conn_id).unwrap(); - let actual = actual_requests - .remove(&conn_id) - .ok_or(format!( - "expected connection {:?} but request was never sent", - conn_id - ))? - .take() - .await; - aws_smithy_protocol_test::assert_uris_match(expected.uri(), actual.uri()); - body_comparer(expected.body().as_ref(), actual.body().as_ref())?; - let expected_headers = expected - .headers() - .keys() - .map(|k| k.as_str()) - .filter(|k| match checked_headers { - Some(list) => list.contains(k), - None => true, - }) - .flat_map(|key| { - let _ = expected.headers().get(key)?; - Some(( - key, - expected - .headers() - .get_all(key) - .iter() - .map(|h| h.to_str().unwrap()) - .collect::>() - .join(", "), - )) - }) - .collect::>(); - aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers) - .map_err(|err| { - format!( - "event {} validation failed with: {}", - conn_id.0, - DisplayErrorContext(&err) - ) - })?; - } - Ok(()) - } - - /// Return all the recorded requests for further analysis - pub async fn take_requests(self) -> Vec> { - let mut recorded_requests = - std::mem::take(self.recorded_requests.lock().unwrap().deref_mut()); - let mut out = Vec::with_capacity(recorded_requests.len()); - for conn_id in 0..recorded_requests.len() { - out.push( - recorded_requests - .remove(&ConnectionId(conn_id)) - .expect("should exist") - .take() - .await, - ) - } - out - } - - /// Build a replay connection from a JSON file - pub fn from_file(path: impl AsRef) -> Result> { - let events: NetworkTraffic = - serde_json::from_str(&std::fs::read_to_string(path.as_ref())?)?; - Ok(Self::new(events.events)) - } - - /// Build a replay connection from a sequence of events - pub fn new(events: Vec) -> Self { - let mut event_map: HashMap<_, VecDeque<_>> = HashMap::new(); - for event in events { - let event_buffer = event_map.entry(event.connection_id).or_default(); - event_buffer.push_back(event); - } - let verifiable_events = event_map - .iter() - .map(|(id, events)| { - let mut body = BytesMut::new(); - for event in events { - if let Action::Data { - direction: Direction::Request, - data, - } = &event.action - { - body.extend_from_slice(&data.copy_to_vec()); - } - } - let initial_request = events.iter().next().expect("must have one event"); - let request = match &initial_request.action { - Action::Request { request } => { - http::Request::from(request).map(|_| Bytes::from(body)) - } - _ => panic!("invalid first event"), - }; - (*id, request) - }) - .collect(); - let verifiable_events = Arc::new(verifiable_events); - - ReplayingConnection { - live_events: Arc::new(Mutex::new(event_map)), - num_events: Arc::new(AtomicUsize::new(0)), - recorded_requests: Default::default(), - verifiable_events, - } - } -} - -async fn replay_body(events: VecDeque, mut sender: hyper::body::Sender) { - for event in events { - match event.action { - Action::Request { .. } => panic!(), - Action::Response { .. } => panic!(), - Action::Data { - data, - direction: Direction::Response, - } => { - sender - .send_data(Bytes::from(data.into_bytes())) - .await - .expect("this is in memory traffic that should not fail to send"); - } - Action::Data { - data: _data, - direction: Direction::Request, - } => {} - Action::Eof { - direction: Direction::Request, - .. - } => {} - Action::Eof { - direction: Direction::Response, - ok: true, - .. - } => { - drop(sender); - break; - } - Action::Eof { - direction: Direction::Response, - ok: false, - .. - } => { - sender.abort(); - break; - } - } - } -} - -fn convert_version(version: &str) -> Version { - match version { - "HTTP/1.1" => Version::HTTP_11, - "HTTP/2.0" => Version::HTTP_2, - _ => panic!("unsupported: {}", version), - } -} - -impl tower::Service> for ReplayingConnection { - type Response = http::Response; - type Error = ConnectorError; - - #[allow(clippy::type_complexity)] - type Future = std::pin::Pin< - Box> + Send + 'static>, - >; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, mut req: Request) -> Self::Future { - let event_id = self.next_id(); - tracing::debug!("received event {}: {req:?}", event_id.0); - let mut events = match self.live_events.lock().unwrap().remove(&event_id) { - Some(traffic) => traffic, - None => { - return Box::pin(std::future::ready(Err(ConnectorError::other( - format!("no data for event {}. req: {:?}", event_id.0, req).into(), - None, - )))); - } - }; - - let _initial_request = events.pop_front().unwrap(); - let (sender, response_body) = hyper::Body::channel(); - let body = SdkBody::from(response_body); - let recording = self.recorded_requests.clone(); - let recorded_request = tokio::spawn(async move { - let mut data_read = vec![]; - while let Some(data) = req.body_mut().data().await { - data_read - .extend_from_slice(data.expect("in memory request should not fail").as_ref()) - } - req.map(|_| Bytes::from(data_read)) - }); - let mut recorded_request = Waitable::Loading(recorded_request); - let fut = async move { - let resp = loop { - let event = events - .pop_front() - .expect("no events, needed a response event"); - match event.action { - // to ensure deterministic behavior if the request EOF happens first in the log, - // wait for the request body to be done before returning a response. - Action::Eof { - direction: Direction::Request, - .. - } => { - recorded_request.wait().await; - } - Action::Request { .. } => panic!("invalid"), - Action::Response { - response: Err(error), - } => break Err(ConnectorError::other(error.0.into(), None)), - Action::Response { - response: Ok(response), - } => { - let mut builder = http::Response::builder() - .status(response.status) - .version(convert_version(&response.version)); - for (name, values) in response.headers { - for value in values { - builder = builder.header(&name, &value); - } - } - tokio::spawn(async move { - replay_body(events, sender).await; - // insert the finalized body into - }); - break Ok(builder.body(body).expect("valid builder")); - } - - Action::Data { - direction: Direction::Request, - data: _data, - } => { - tracing::info!("get request data"); - } - Action::Eof { - direction: Direction::Response, - .. - } => panic!("got eof before response"), - - Action::Data { - data: _, - direction: Direction::Response, - } => panic!("got response data before response"), - } - }; - recording.lock().unwrap().insert(event_id, recorded_request); - resp - }; - Box::pin(fut) - } -} diff --git a/rust-runtime/aws-smithy-client/src/erase.rs b/rust-runtime/aws-smithy-client/src/erase.rs deleted file mode 100644 index 406dd973932..00000000000 --- a/rust-runtime/aws-smithy-client/src/erase.rs +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Type-erased variants of [`Client`] and friends. - -use std::fmt; - -use tower::{Layer, Service, ServiceExt}; - -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use boxclone::*; - -use crate::{bounds, retry, Client}; - -// These types are technically public in that they're reachable from the public trait impls on -// DynMiddleware, but no-one should ever look at them or use them. -#[doc(hidden)] -pub mod boxclone; - -/// A [`Client`] whose connector and middleware types have been erased. -/// -/// Mainly useful if you need to name `R` in a type-erased client. If you do not, you can instead -/// just use `Client` with no type parameters, which ends up being the same type. -pub type DynClient = Client, R>; - -impl Client -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware + Send + Sync + 'static, - R: retry::NewRequestPolicy, -{ - /// Erase the middleware type from the client type signature. - /// - /// This makes the final client type easier to name, at the cost of a marginal increase in - /// runtime performance. See [`DynMiddleware`] for details. - /// - /// In practice, you'll use this method once you've constructed a client to your liking: - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build(); - /// let client = MyClient { client: client.into_dyn_middleware() }; - /// # client.client.check(); - /// # } - pub fn into_dyn_middleware(self) -> Client, R> { - Client { - connector: self.connector, - middleware: DynMiddleware::new(self.middleware), - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } -} - -impl Client -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware + Send + Sync + 'static, - R: retry::NewRequestPolicy, -{ - /// Erase the connector type from the client type signature. - /// - /// This makes the final client type easier to name, at the cost of a marginal increase in - /// runtime performance. See [`DynConnector`] for details. - /// - /// In practice, you'll use this method once you've constructed a client to your liking: - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// # type MyMiddleware = aws_smithy_client::DynMiddleware; - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build(); - /// let client = MyClient { client: client.into_dyn_connector() }; - /// # client.client.check(); - /// # } - pub fn into_dyn_connector(self) -> Client { - Client { - connector: DynConnector::new(self.connector), - middleware: self.middleware, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Erase the connector and middleware types from the client type signature. - /// - /// This makes the final client type easier to name, at the cost of a marginal increase in - /// runtime performance. See [`DynConnector`] and [`DynMiddleware`] for details. - /// - /// Note that if you're using the standard retry mechanism, [`retry::Standard`], `DynClient` - /// is equivalent to `Client` with no type arguments. - /// - /// In practice, you'll use this method once you've constructed a client to your liking: - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: aws_smithy_client::Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build(); - /// let client = MyClient { client: client.into_dyn() }; - /// # client.client.check(); - /// # } - pub fn into_dyn(self) -> DynClient { - self.into_dyn_connector().into_dyn_middleware() - } -} - -/// A Smithy connector that uses dynamic dispatch. -/// -/// This type allows you to pay a small runtime cost to avoid having to name the exact connector -/// you're using anywhere you want to hold a [`Client`]. Specifically, this will use `Box` to -/// enable dynamic dispatch for every request that goes through the connector, which increases -/// memory pressure and suffers an additional vtable indirection for each request, but is unlikely -/// to matter in all but the highest-performance settings. -#[non_exhaustive] -#[derive(Clone)] -pub struct DynConnector( - BoxCloneService, http::Response, ConnectorError>, -); - -impl fmt::Debug for DynConnector { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("DynConnector").finish() - } -} - -impl DynConnector { - /// Construct a new dynamically-dispatched Smithy middleware. - pub fn new(connector: C) -> Self - where - C: bounds::SmithyConnector + Send + 'static, - E: Into, - { - Self(BoxCloneService::new(connector.map_err(|e| e.into()))) - } - - #[doc(hidden)] - pub fn call_lite( - &mut self, - req: http::Request, - ) -> BoxFuture, ConnectorError> { - Service::call(self, req) - } -} - -impl Service> for DynConnector { - type Response = http::Response; - type Error = ConnectorError; - type Future = BoxFuture; - - fn poll_ready( - &mut self, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - self.0.poll_ready(cx) - } - - fn call(&mut self, req: http::Request) -> Self::Future { - self.0.call(req) - } -} - -/// A Smithy middleware that uses dynamic dispatch. -/// -/// This type allows you to pay a small runtime cost to avoid having to name the exact middleware -/// you're using anywhere you want to hold a [`Client`]. Specifically, this will use `Box` to -/// enable dynamic dispatch for every request that goes through the middleware, which increases -/// memory pressure and suffers an additional vtable indirection for each request, but is unlikely -/// to matter in all but the highest-performance settings. -#[non_exhaustive] -pub struct DynMiddleware( - ArcCloneLayer< - aws_smithy_http_tower::dispatch::DispatchService, - aws_smithy_http::operation::Request, - aws_smithy_http::operation::Response, - aws_smithy_http_tower::SendOperationError, - >, -); - -impl Clone for DynMiddleware { - fn clone(&self) -> Self { - Self(self.0.clone()) - } -} - -impl fmt::Debug for DynMiddleware { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("DynMiddleware").finish() - } -} - -impl DynMiddleware { - /// Construct a new dynamically-dispatched Smithy middleware. - pub fn new + Send + Sync + 'static>(middleware: M) -> Self { - Self(ArcCloneLayer::new(middleware)) - } -} - -impl Layer> for DynMiddleware { - type Service = BoxCloneService< - aws_smithy_http::operation::Request, - aws_smithy_http::operation::Response, - aws_smithy_http_tower::SendOperationError, - >; - - fn layer(&self, inner: aws_smithy_http_tower::dispatch::DispatchService) -> Self::Service { - self.0.layer(inner) - } -} diff --git a/rust-runtime/aws-smithy-client/src/erase/boxclone.rs b/rust-runtime/aws-smithy-client/src/erase/boxclone.rs deleted file mode 100644 index 1604d448b98..00000000000 --- a/rust-runtime/aws-smithy-client/src/erase/boxclone.rs +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// This is an adaptation of tower::util::{BoxLayer, BoxService} that includes Clone and doesn't -// include Sync. - -use std::fmt; -use std::future::Future; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{Context, Poll}; - -use tower::layer::{layer_fn, Layer}; -use tower::Service; - -pub(super) struct ArcCloneLayer { - inner: Arc> + Send + Sync>, -} - -impl Clone for ArcCloneLayer { - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - } - } -} - -impl ArcCloneLayer { - /// Create a new [`BoxLayer`]. - pub(crate) fn new(inner_layer: L) -> Self - where - L: Layer + Send + Sync + 'static, - L::Service: Service + Clone + Send + Sync + 'static, - >::Future: Send + 'static, - { - let layer = layer_fn(move |inner: In| { - let out = inner_layer.layer(inner); - BoxCloneService::new(out) - }); - - Self { - inner: Arc::new(layer), - } - } -} - -impl Layer for ArcCloneLayer { - type Service = BoxCloneService; - - fn layer(&self, inner: In) -> Self::Service { - self.inner.layer(inner) - } -} - -impl fmt::Debug for ArcCloneLayer { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("ArcCloneLayer").finish() - } -} - -trait CloneService: Service { - fn clone_box( - &self, - ) -> Box< - dyn CloneService - + Send - + Sync - + 'static, - >; -} - -impl CloneService for T -where - T: Service + Clone + Send + Sync + 'static, -{ - fn clone_box( - &self, - ) -> Box< - dyn CloneService< - Request, - Response = Self::Response, - Error = Self::Error, - Future = Self::Future, - > - + 'static - + Send - + Sync, - > { - Box::new(self.clone()) - } -} - -pub type BoxFuture = Pin> + Send>>; -pub struct BoxCloneService { - inner: Box< - dyn CloneService> - + Send - + Sync - + 'static, - >, -} - -#[derive(Debug, Clone)] -struct Boxed { - inner: S, -} - -impl BoxCloneService { - #[allow(missing_docs)] - pub fn new(inner: S) -> Self - where - S: Service + Send + Sync + 'static + Clone, - S::Future: Send + 'static, - { - let inner = Box::new(Boxed { inner }); - BoxCloneService { inner } - } -} - -impl Clone for BoxCloneService -where - T: 'static, - U: 'static, - E: 'static, -{ - fn clone(&self) -> Self { - Self { - inner: self.inner.clone_box(), - } - } -} - -impl Service for BoxCloneService { - type Response = U; - type Error = E; - type Future = BoxFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, request: T) -> BoxFuture { - self.inner.call(request) - } -} - -impl fmt::Debug for BoxCloneService { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("BoxCloneService").finish() - } -} - -impl Service for Boxed -where - S: Service + 'static, - S::Future: Send + 'static, -{ - type Response = S::Response; - type Error = S::Error; - - #[allow(clippy::type_complexity)] - type Future = Pin> + Send>>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, request: Request) -> Self::Future { - Box::pin(self.inner.call(request)) - } -} diff --git a/rust-runtime/aws-smithy-client/src/http_connector.rs b/rust-runtime/aws-smithy-client/src/http_connector.rs deleted file mode 100644 index eaac5805c6b..00000000000 --- a/rust-runtime/aws-smithy-client/src/http_connector.rs +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Default connectors based on what TLS features are active. Also contains HTTP-related abstractions -//! that enable passing HTTP connectors around. - -use crate::erase::DynConnector; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use aws_smithy_types::timeout::TimeoutConfig; -use std::time::Duration; -use std::{fmt::Debug, sync::Arc}; - -/// Type alias for a Connector factory function. -pub type MakeConnectorFn = - dyn Fn(&ConnectorSettings, Option) -> Option + Send + Sync; - -/// Enum for describing the two "kinds" of HTTP Connectors in smithy-rs. -#[derive(Clone)] -pub enum HttpConnector { - /// A `DynConnector` to be used for all requests. - Prebuilt(Option), - /// A factory function that will be used to create new `DynConnector`s whenever one is needed. - ConnectorFn(Arc), -} - -impl Debug for HttpConnector { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Prebuilt(Some(connector)) => { - write!(f, "Prebuilt({:?})", connector) - } - Self::Prebuilt(None) => { - write!(f, "Prebuilt(None)") - } - Self::ConnectorFn(_) => { - write!(f, "ConnectorFn()") - } - } - } -} - -impl Storable for HttpConnector { - type Storer = StoreReplace; -} - -impl HttpConnector { - /// If `HttpConnector` is `Prebuilt`, return a clone of that connector. - /// If `HttpConnector` is `ConnectorFn`, generate a new connector from settings and return it. - pub fn connector( - &self, - settings: &ConnectorSettings, - sleep: Option, - ) -> Option { - match self { - HttpConnector::Prebuilt(conn) => conn.clone(), - HttpConnector::ConnectorFn(func) => func(settings, sleep), - } - } -} - -/// Builder for [`ConnectorSettings`]. -#[non_exhaustive] -#[derive(Default, Debug)] -pub struct ConnectorSettingsBuilder { - connect_timeout: Option, - read_timeout: Option, -} - -impl ConnectorSettingsBuilder { - /// Creates a new builder. - pub fn new() -> Self { - Default::default() - } - - /// Sets the connect timeout that should be used. - /// - /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. - pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self { - self.connect_timeout = Some(connect_timeout); - self - } - - /// Sets the connect timeout that should be used. - /// - /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. - pub fn set_connect_timeout(&mut self, connect_timeout: Option) -> &mut Self { - self.connect_timeout = connect_timeout; - self - } - - /// Sets the read timeout that should be used. - /// - /// The read timeout is the limit on the amount of time it takes to read the first byte of a response - /// from the time the request is initiated. - pub fn read_timeout(mut self, read_timeout: Duration) -> Self { - self.read_timeout = Some(read_timeout); - self - } - - /// Sets the read timeout that should be used. - /// - /// The read timeout is the limit on the amount of time it takes to read the first byte of a response - /// from the time the request is initiated. - pub fn set_read_timeout(&mut self, read_timeout: Option) -> &mut Self { - self.read_timeout = read_timeout; - self - } - - /// Builds the [`ConnectorSettings`]. - pub fn build(self) -> ConnectorSettings { - ConnectorSettings { - connect_timeout: self.connect_timeout, - read_timeout: self.read_timeout, - } - } -} - -/// Settings for HTTP Connectors -#[non_exhaustive] -#[derive(Clone, Default, Debug)] -pub struct ConnectorSettings { - connect_timeout: Option, - read_timeout: Option, -} - -impl ConnectorSettings { - /// Returns a builder for `ConnectorSettings`. - pub fn builder() -> ConnectorSettingsBuilder { - Default::default() - } - - /// Returns the connect timeout that should be used. - /// - /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. - pub fn connect_timeout(&self) -> Option { - self.connect_timeout - } - - /// Returns the read timeout that should be used. - /// - /// The read timeout is the limit on the amount of time it takes to read the first byte of a response - /// from the time the request is initiated. - pub fn read_timeout(&self) -> Option { - self.read_timeout - } - - // This function may be removed/refactored in the future if other non-timeout - // properties are added to the `ConnectorSettings` struct. - #[doc(hidden)] - pub fn from_timeout_config(timeout_config: &TimeoutConfig) -> Self { - Self { - connect_timeout: timeout_config.connect_timeout(), - read_timeout: timeout_config.read_timeout(), - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/hyper_ext.rs b/rust-runtime/aws-smithy-client/src/hyper_ext.rs deleted file mode 100644 index c5906fdb341..00000000000 --- a/rust-runtime/aws-smithy-client/src/hyper_ext.rs +++ /dev/null @@ -1,762 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Implementation of [`SmithyConnector`](crate::bounds::SmithyConnector) for Hyper -//! -//! The module provides [`Adapter`] which enables using a [`hyper::Client`] as the connector for a Smithy -//! [`Client`](crate::Client). For most use cases, this shouldn't need to be used directly, but it is -//! available as an option. -//! -//! # Examples -//! -//! ### Construct a Smithy Client with Hyper and Rustls -//! -//! In the basic case, customers should not need to use this module. A default implementation of Hyper -//! with `rustls` will be constructed during client creation. However, if you are creating a Smithy -//! [`Client`](crate::Client), directly, use the `dyn_https_https()` method to match that default behavior: -//! -#![cfg_attr( - not(all(feature = "rustls", feature = "client-hyper")), - doc = "```no_run,ignore" -)] -#![cfg_attr(all(feature = "rustls", feature = "client-hyper"), doc = "```no_run")] -//! use aws_smithy_client::Client; -//! -//! let client = Client::builder() -//! .dyn_https_connector(Default::default()) -//! .middleware( -//! // Replace this with your middleware type -//! tower::layer::util::Identity::default() -//! ) -//! .build(); -//! ``` -//! -//! ### Use a Hyper client that uses WebPKI roots -//! -//! A use case for where you may want to use the [`Adapter`] is when settings Hyper client settings -//! that aren't otherwise exposed by the `Client` builder interface. -//! -#![cfg_attr( - not(all(feature = "rustls", feature = "client-hyper")), - doc = "```no_run,ignore" -)] -#![cfg_attr( - all( - feature = "rustls", - feature = "client-hyper", - feature = "hyper-webpki-doctest-only" - ), - doc = "```no_run" -)] -//! use std::time::Duration; -//! use aws_smithy_client::{Client, conns, hyper_ext}; -//! use aws_smithy_client::erase::DynConnector; -//! use aws_smithy_client::http_connector::ConnectorSettings; -//! -//! let https_connector = hyper_rustls::HttpsConnectorBuilder::new() -//! .with_webpki_roots() -//! .https_only() -//! .enable_http1() -//! .enable_http2() -//! .build(); -//! let smithy_connector = hyper_ext::Adapter::builder() -//! // Optionally set things like timeouts as well -//! .connector_settings( -//! ConnectorSettings::builder() -//! .connect_timeout(Duration::from_secs(5)) -//! .build() -//! ) -//! .build(https_connector); -//! -//! // Once you have a Smithy connector, use it to construct a Smithy client: -//! let client = Client::builder() -//! .connector(smithy_connector) -//! .middleware(tower::layer::util::Identity::default()) -//! .build(); -//! ``` - -use crate::http_connector::ConnectorSettings; -use crate::hyper_ext::timeout_middleware::{ConnectTimeout, HttpReadTimeout, HttpTimeoutError}; -use crate::never::stream::EmptyStream; -use aws_smithy_async::future::timeout::TimedOutError; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; - -use aws_smithy_http::result::ConnectorError; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::retry::ErrorKind; -use http::{Extensions, Uri}; -use hyper::client::connect::{ - capture_connection, CaptureConnection, Connected, Connection, HttpInfo, -}; - -use h2::Reason; -use std::error::Error; -use std::fmt::Debug; - -use crate::erase::boxclone::BoxFuture; -use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; -use tokio::io::{AsyncRead, AsyncWrite}; -use tower::{BoxError, Service}; - -/// Adapter from a [`hyper::Client`](hyper::Client) to a connector usable by a Smithy [`Client`](crate::Client). -/// -/// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`Adapter::builder`]. For examples -/// see [the module documentation](crate::hyper_ext). -#[derive(Clone, Debug)] -pub struct Adapter { - client: HttpReadTimeout, SdkBody>>, -} - -/// Extract a smithy connection from a hyper CaptureConnection -fn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option { - let capture_conn = capture_conn.clone(); - if let Some(conn) = capture_conn.clone().connection_metadata().as_ref() { - let mut extensions = Extensions::new(); - conn.get_extras(&mut extensions); - let http_info = extensions.get::(); - let smithy_connection = ConnectionMetadata::new( - conn.is_proxied(), - http_info.map(|info| info.remote_addr()), - move || match capture_conn.connection_metadata().as_ref() { - Some(conn) => conn.poison(), - None => tracing::trace!("no connection existed to poison"), - }, - ); - Some(smithy_connection) - } else { - None - } -} - -impl Service> for Adapter -where - C: Clone + Send + Sync + 'static, - C: Service, - C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, - C::Future: Unpin + Send + 'static, - C::Error: Into, -{ - type Response = http::Response; - type Error = ConnectorError; - - type Future = BoxFuture; - - fn poll_ready( - &mut self, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - self.client.poll_ready(cx).map_err(downcast_error) - } - - fn call(&mut self, mut req: http::Request) -> Self::Future { - let capture_connection = capture_connection(&mut req); - if let Some(capture_smithy_connection) = req.extensions().get::() { - capture_smithy_connection - .set_connection_retriever(move || extract_smithy_connection(&capture_connection)); - } - let fut = self.client.call(req); - Box::pin(async move { Ok(fut.await.map_err(downcast_error)?.map(SdkBody::from)) }) - } -} - -impl Adapter<()> { - /// Builder for a Hyper Adapter - /// - /// Generally, end users should not need to construct an [`Adapter`] manually: a hyper adapter - /// will be constructed automatically during client creation. - pub fn builder() -> Builder { - Builder::default() - } -} - -/// Downcast errors coming out of hyper into an appropriate `ConnectorError` -fn downcast_error(err: BoxError) -> ConnectorError { - // is a `TimedOutError` (from aws_smithy_async::timeout) in the chain? if it is, this is a timeout - if find_source::(err.as_ref()).is_some() { - return ConnectorError::timeout(err); - } - // is the top of chain error actually already a `ConnectorError`? return that directly - let err = match err.downcast::() { - Ok(connector_error) => return *connector_error, - Err(box_error) => box_error, - }; - // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific - // error classifications - let err = match err.downcast::() { - Ok(hyper_error) => return to_connector_error(*hyper_error), - Err(box_error) => box_error, - }; - - // otherwise, we have no idea! - ConnectorError::other(err, None) -} - -/// Convert a [`hyper::Error`] into a [`ConnectorError`] -fn to_connector_error(err: hyper::Error) -> ConnectorError { - if err.is_timeout() || find_source::(&err).is_some() { - return ConnectorError::timeout(err.into()); - } - if err.is_user() { - return ConnectorError::user(err.into()); - } - if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() { - return ConnectorError::io(err.into()); - } - // We sometimes receive this from S3: hyper::Error(IncompleteMessage) - if err.is_incomplete_message() { - return ConnectorError::other(err.into(), Some(ErrorKind::TransientError)); - } - if let Some(h2_err) = find_source::(&err) { - if h2_err.is_go_away() - || (h2_err.is_reset() && h2_err.reason() == Some(Reason::REFUSED_STREAM)) - { - return ConnectorError::io(err.into()); - } - } - - tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); - ConnectorError::other(err.into(), None) -} - -fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> { - let mut next = Some(err); - while let Some(err) = next { - if let Some(matching_err) = err.downcast_ref::() { - return Some(matching_err); - } - next = err.source(); - } - None -} - -/// Builder for [`hyper_ext::Adapter`](Adapter) -/// -/// Unlike a Smithy client, the [`Service`] inside a [`hyper_ext::Adapter`](Adapter) is actually a service that -/// accepts a `Uri` and returns a TCP stream. One default implementation of this is provided, -/// that encrypts the stream with `rustls`. -/// -/// # Examples -/// Construct a HyperAdapter with the default HTTP implementation (rustls). This can be useful when you want to share a Hyper connector -/// between multiple Smithy clients. -/// -#[cfg_attr( - not(all(feature = "rustls", feature = "client-hyper")), - doc = "```no_run,ignore" -)] -#[cfg_attr(all(feature = "rustls", feature = "client-hyper"), doc = "```no_run")] -/// use tower::layer::util::Identity; -/// use aws_smithy_client::{conns, hyper_ext}; -/// use aws_smithy_client::erase::DynConnector; -/// -/// let hyper_connector = hyper_ext::Adapter::builder().build(conns::https()); -/// // this client can then be used when constructing a Smithy Client -/// // Replace `Identity` with your middleware implementation: -/// let client = aws_smithy_client::Client::::new(DynConnector::new(hyper_connector)); -/// ``` -#[derive(Default, Debug)] -pub struct Builder { - connector_settings: Option, - sleep_impl: Option, - client_builder: Option, -} - -impl Builder { - /// Create a HyperAdapter from this builder and a given connector - pub fn build(self, connector: C) -> Adapter - where - C: Clone + Send + Sync + 'static, - C: Service, - C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, - C::Future: Unpin + Send + 'static, - C::Error: Into, - { - let client_builder = self.client_builder.unwrap_or_default(); - let sleep_impl = self.sleep_impl.or_else(default_async_sleep); - let (connect_timeout, read_timeout) = self - .connector_settings - .map(|c| (c.connect_timeout(), c.read_timeout())) - .unwrap_or((None, None)); - - // if we are using Hyper, Tokio must already be enabled so we can fallback to Tokio. - let connector = match connect_timeout { - Some(duration) => ConnectTimeout::new( - connector, - sleep_impl - .clone() - .expect("a sleep impl must be provided in order to have a connect timeout"), - duration, - ), - None => ConnectTimeout::no_timeout(connector), - }; - let base = client_builder.build(connector); - let read_timeout = match read_timeout { - Some(duration) => HttpReadTimeout::new( - base, - sleep_impl.expect("a sleep impl must be provided in order to have a read timeout"), - duration, - ), - None => HttpReadTimeout::no_timeout(base), - }; - Adapter { - client: read_timeout, - } - } - - /// Set the async sleep implementation used for timeouts - /// - /// Calling this is only necessary for testing or to use something other than - /// [`default_async_sleep`]. - pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self { - self.sleep_impl = Some(sleep_impl); - self - } - - /// Set the async sleep implementation used for timeouts - /// - /// Calling this is only necessary for testing or to use something other than - /// [`default_async_sleep`]. - pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { - self.sleep_impl = sleep_impl; - self - } - - /// Configure the HTTP settings for the `HyperAdapter` - pub fn connector_settings(mut self, connector_settings: ConnectorSettings) -> Self { - self.connector_settings = Some(connector_settings); - self - } - - /// Configure the HTTP settings for the `HyperAdapter` - pub fn set_connector_settings( - &mut self, - connector_settings: Option, - ) -> &mut Self { - self.connector_settings = connector_settings; - self - } - - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. - /// - /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. - pub fn hyper_builder(mut self, hyper_builder: hyper::client::Builder) -> Self { - self.client_builder = Some(hyper_builder); - self - } - - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. - /// - /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. - pub fn set_hyper_builder( - &mut self, - hyper_builder: Option, - ) -> &mut Self { - self.client_builder = hyper_builder; - self - } -} - -mod timeout_middleware { - use std::error::Error; - use std::fmt::Formatter; - use std::future::Future; - use std::pin::Pin; - use std::task::{Context, Poll}; - use std::time::Duration; - - use http::Uri; - use pin_project_lite::pin_project; - use tower::BoxError; - - use aws_smithy_async::future::timeout::{TimedOutError, Timeout}; - use aws_smithy_async::rt::sleep::Sleep; - use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; - - #[derive(Debug)] - pub(crate) struct HttpTimeoutError { - kind: &'static str, - duration: Duration, - } - - impl std::fmt::Display for HttpTimeoutError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!( - f, - "{} timeout occurred after {:?}", - self.kind, self.duration - ) - } - } - - impl Error for HttpTimeoutError { - // We implement the `source` function as returning a `TimedOutError` because when `downcast_error` - // or `find_source` is called with an `HttpTimeoutError` (or another error wrapping an `HttpTimeoutError`) - // this method will be checked to determine if it's a timeout-related error. - fn source(&self) -> Option<&(dyn Error + 'static)> { - Some(&TimedOutError) - } - } - - /// Timeout wrapper that will timeout on the initial TCP connection - /// - /// # Stability - /// This interface is unstable. - #[derive(Clone, Debug)] - pub(super) struct ConnectTimeout { - inner: I, - timeout: Option<(SharedAsyncSleep, Duration)>, - } - - impl ConnectTimeout { - /// Create a new `ConnectTimeout` around `inner`. - /// - /// Typically, `I` will implement [`hyper::client::connect::Connect`]. - pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { - Self { - inner, - timeout: Some((sleep, timeout)), - } - } - - pub(crate) fn no_timeout(inner: I) -> Self { - Self { - inner, - timeout: None, - } - } - } - - #[derive(Clone, Debug)] - pub(crate) struct HttpReadTimeout { - inner: I, - timeout: Option<(SharedAsyncSleep, Duration)>, - } - - impl HttpReadTimeout { - /// Create a new `HttpReadTimeout` around `inner`. - /// - /// Typically, `I` will implement [`tower::Service>`]. - pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { - Self { - inner, - timeout: Some((sleep, timeout)), - } - } - - pub(crate) fn no_timeout(inner: I) -> Self { - Self { - inner, - timeout: None, - } - } - } - - pin_project! { - /// Timeout future for Tower services - /// - /// Timeout future to handle timing out, mapping errors, and the possibility of not timing out - /// without incurring an additional allocation for each timeout layer. - #[project = MaybeTimeoutFutureProj] - pub enum MaybeTimeoutFuture { - Timeout { - #[pin] - timeout: Timeout, - error_type: &'static str, - duration: Duration, - }, - NoTimeout { - #[pin] - future: F - } - } - } - - impl Future for MaybeTimeoutFuture - where - F: Future>, - E: Into, - { - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let (timeout_future, kind, &mut duration) = match self.project() { - MaybeTimeoutFutureProj::NoTimeout { future } => { - return future.poll(cx).map_err(|err| err.into()); - } - MaybeTimeoutFutureProj::Timeout { - timeout, - error_type, - duration, - } => (timeout, error_type, duration), - }; - match timeout_future.poll(cx) { - Poll::Ready(Ok(response)) => Poll::Ready(response.map_err(|err| err.into())), - Poll::Ready(Err(_timeout)) => { - Poll::Ready(Err(HttpTimeoutError { kind, duration }.into())) - } - Poll::Pending => Poll::Pending, - } - } - } - - impl tower::Service for ConnectTimeout - where - I: tower::Service, - I::Error: Into, - { - type Response = I::Response; - type Error = BoxError; - type Future = MaybeTimeoutFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx).map_err(|err| err.into()) - } - - fn call(&mut self, req: Uri) -> Self::Future { - match &self.timeout { - Some((sleep, duration)) => { - let sleep = sleep.sleep(*duration); - MaybeTimeoutFuture::Timeout { - timeout: Timeout::new(self.inner.call(req), sleep), - error_type: "HTTP connect", - duration: *duration, - } - } - None => MaybeTimeoutFuture::NoTimeout { - future: self.inner.call(req), - }, - } - } - } - - impl tower::Service> for HttpReadTimeout - where - I: tower::Service, Error = hyper::Error>, - { - type Response = I::Response; - type Error = BoxError; - type Future = MaybeTimeoutFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx).map_err(|err| err.into()) - } - - fn call(&mut self, req: http::Request) -> Self::Future { - match &self.timeout { - Some((sleep, duration)) => { - let sleep = sleep.sleep(*duration); - MaybeTimeoutFuture::Timeout { - timeout: Timeout::new(self.inner.call(req), sleep), - error_type: "HTTP read", - duration: *duration, - } - } - None => MaybeTimeoutFuture::NoTimeout { - future: self.inner.call(req), - }, - } - } - } - - #[cfg(test)] - mod test { - use crate::http_connector::ConnectorSettings; - use crate::hyper_ext::Adapter; - use crate::never::{NeverConnected, NeverReplies}; - use aws_smithy_async::assert_elapsed; - use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_types::error::display::DisplayErrorContext; - use aws_smithy_types::timeout::TimeoutConfig; - use std::time::Duration; - use tower::Service; - - #[allow(unused)] - fn connect_timeout_is_correct() { - is_send_sync::>(); - } - - #[allow(unused)] - fn is_send_sync() {} - - #[tokio::test] - async fn http_connect_timeout_works() { - let inner = NeverConnected::new(); - let connector_settings = ConnectorSettings::from_timeout_config( - &TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(), - ); - let mut hyper = Adapter::builder() - .connector_settings(connector_settings) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(inner); - let now = tokio::time::Instant::now(); - tokio::time::pause(); - let resp = hyper - .call( - http::Request::builder() - .uri("http://foo.com") - .body(SdkBody::empty()) - .unwrap(), - ) - .await - .unwrap_err(); - assert!( - resp.is_timeout(), - "expected resp.is_timeout() to be true but it was false, resp == {:?}", - resp - ); - let message = DisplayErrorContext(&resp).to_string(); - let expected = - "timeout: error trying to connect: HTTP connect timeout occurred after 1s"; - assert!( - message.contains(expected), - "expected '{message}' to contain '{expected}'" - ); - assert_elapsed!(now, Duration::from_secs(1)); - } - - #[tokio::test] - async fn http_read_timeout_works() { - let inner = NeverReplies::new(); - let connector_settings = ConnectorSettings::from_timeout_config( - &TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .read_timeout(Duration::from_secs(2)) - .build(), - ); - let mut hyper = Adapter::builder() - .connector_settings(connector_settings) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(inner); - let now = tokio::time::Instant::now(); - tokio::time::pause(); - let resp = hyper - .call( - http::Request::builder() - .uri("http://foo.com") - .body(SdkBody::empty()) - .unwrap(), - ) - .await - .unwrap_err(); - assert!( - resp.is_timeout(), - "expected resp.is_timeout() to be true but it was false, resp == {:?}", - resp - ); - let message = format!("{}", DisplayErrorContext(&resp)); - let expected = "timeout: HTTP read timeout occurred after 2s"; - assert!( - message.contains(expected), - "expected '{message}' to contain '{expected}'" - ); - assert_elapsed!(now, Duration::from_secs(2)); - } - } -} - -/// Make `EmptyStream` compatible with Hyper -impl Connection for EmptyStream { - fn connected(&self) -> Connected { - Connected::new() - } -} - -#[cfg(test)] -mod test { - use crate::hyper_ext::Adapter; - use aws_smithy_http::body::SdkBody; - use http::Uri; - use hyper::client::connect::{Connected, Connection}; - use std::io::{Error, ErrorKind}; - use std::pin::Pin; - use std::task::{Context, Poll}; - use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - use tower::BoxError; - - #[tokio::test] - async fn hyper_io_error() { - let connector = TestConnection { - inner: HangupStream, - }; - let mut adapter = Adapter::builder().build(connector); - use tower::Service; - let err = adapter - .call( - http::Request::builder() - .uri("http://amazon.com") - .body(SdkBody::empty()) - .unwrap(), - ) - .await - .expect_err("socket hangup"); - assert!(err.is_io(), "{:?}", err); - } - - // ---- machinery to make a Hyper connector that responds with an IO Error - #[derive(Clone)] - struct HangupStream; - - impl Connection for HangupStream { - fn connected(&self) -> Connected { - Connected::new() - } - } - - impl AsyncRead for HangupStream { - fn poll_read( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &mut ReadBuf<'_>, - ) -> Poll> { - Poll::Ready(Err(Error::new( - ErrorKind::ConnectionReset, - "connection reset", - ))) - } - } - - impl AsyncWrite for HangupStream { - fn poll_write( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &[u8], - ) -> Poll> { - Poll::Pending - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - - fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - } - - #[derive(Clone)] - struct TestConnection { - inner: T, - } - - impl tower::Service for TestConnection - where - T: Clone + Connection, - { - type Response = T; - type Error = BoxError; - type Future = std::future::Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: Uri) -> Self::Future { - std::future::ready(Ok(self.inner.clone())) - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/lib.rs b/rust-runtime/aws-smithy-client/src/lib.rs index 82ddc4cacb7..32e46abdb4b 100644 --- a/rust-runtime/aws-smithy-client/src/lib.rs +++ b/rust-runtime/aws-smithy-client/src/lib.rs @@ -3,260 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! A Hyper-based Smithy service client. -//! -//! | Feature | Description | -//! |-------------------|-------------| -//! | `event-stream` | Provides Sender/Receiver implementations for Event Stream codegen. | -//! | `rt-tokio` | Run async code with the `tokio` runtime | -//! | `test-util` | Include various testing utils | -//! | `rustls` | Use `rustls` as the HTTP client's TLS implementation | -//! | `client-hyper` | Use `hyper` to handle HTTP requests | +//! This crate is no longer used by smithy-rs and is deprecated. -#![allow(clippy::derive_partial_eq_without_eq)] #![warn( missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms )] - -pub mod bounds; -pub mod erase; -pub mod http_connector; -pub mod never; -mod poison; -pub mod retry; -pub mod timeout; - -// https://github.com/rust-lang/rust/issues/72081 -#[allow(rustdoc::private_doc_tests)] -mod builder; -pub use builder::Builder; - -#[cfg(all(feature = "test-util", feature = "client-hyper"))] -pub mod dvr; -#[cfg(feature = "test-util")] -pub mod test_connection; - -#[cfg(feature = "client-hyper")] -pub mod conns; -#[cfg(feature = "client-hyper")] -pub mod hyper_ext; - -// The types in this module are only used to write the bounds in [`Client::check`]. Customers will -// not need them. But the module and its types must be public so that we can call `check` from -// doc-tests. -#[doc(hidden)] -pub mod static_tests; - -use crate::poison::PoisonLayer; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; - -use aws_smithy_http::operation::Operation; -use aws_smithy_http::response::ParseHttpResponse; -pub use aws_smithy_http::result::{SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_http_tower::dispatch::DispatchLayer; -use aws_smithy_http_tower::parse_response::ParseResponseLayer; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::retry::{ProvideErrorKind, ReconnectMode}; -use aws_smithy_types::timeout::OperationTimeoutConfig; -use timeout::ClientTimeoutParams; -pub use timeout::TimeoutLayer; -use tower::{Service, ServiceBuilder, ServiceExt}; -use tracing::{debug_span, field, Instrument}; - -/// Smithy service client. -/// -/// The service client is customizable in a number of ways (see [`Builder`]), but most customers -/// can stick with the standard constructor provided by [`Client::new`]. It takes only a single -/// argument, which is the middleware that fills out the [`http::Request`] for each higher-level -/// operation so that it can ultimately be sent to the remote host. The middleware is responsible -/// for filling in any request parameters that aren't specified by the Smithy protocol definition, -/// such as those used for routing (like the URL), authentication, and authorization. -/// -/// The middleware takes the form of a [`tower::Layer`] that wraps the actual connection for each -/// request. The [`tower::Service`](Service) that the middleware produces must accept requests of the type -/// [`aws_smithy_http::operation::Request`] and return responses of the type -/// [`http::Response`], most likely by modifying the provided request in place, passing it -/// to the inner service, and then ultimately returning the inner service's response. -/// -/// With the `hyper` feature enabled, you can construct a `Client` directly from a -/// `hyper::Client` using `hyper_ext::Adapter::builder`. You can also enable the `rustls` -/// feature to construct a Client against a standard HTTPS endpoint using `Builder::rustls_connector`. -#[derive(Debug)] -pub struct Client< - Connector = erase::DynConnector, - Middleware = erase::DynMiddleware, - RetryPolicy = retry::Standard, -> { - connector: Connector, - middleware: Middleware, - retry_policy: RetryPolicy, - reconnect_mode: ReconnectMode, - operation_timeout_config: OperationTimeoutConfig, - sleep_impl: Option, -} - -impl Client<(), (), ()> { - /// Returns a client builder - pub fn builder() -> Builder { - Builder::new() - } -} - -// Quick-create for people who just want "the default". -impl Client -where - M: Default, -{ - /// Create a Smithy client from the given `connector`, a middleware default, the - /// [standard retry policy](retry::Standard), and the - /// [`default_async_sleep`](aws_smithy_async::rt::sleep::default_async_sleep) sleep implementation. - pub fn new(connector: C) -> Self { - Builder::new() - .connector(connector) - .middleware(M::default()) - .build() - } -} - -fn check_send_sync(t: T) -> T { - t -} - -impl Client -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware, - R: retry::NewRequestPolicy, -{ - /// Dispatch this request to the network - /// - /// For ergonomics, this does not include the raw response for successful responses. To - /// access the raw response use `call_raw`. - pub async fn call(&self, op: Operation) -> Result> - where - O: Send + Sync, - E: std::error::Error + Send + Sync + 'static, - Retry: Send + Sync, - R::Policy: bounds::SmithyRetryPolicy, - Retry: ClassifyRetry, SdkError>, - bounds::Parsed<>::Service, O, Retry>: - Service, Response = SdkSuccess, Error = SdkError> + Clone, - { - self.call_raw(op).await.map(|res| res.parsed) - } - - /// Dispatch this request to the network - /// - /// The returned result contains the raw HTTP response which can be useful for debugging or - /// implementing unsupported features. - pub async fn call_raw( - &self, - op: Operation, - ) -> Result, SdkError> - where - O: Send + Sync, - E: std::error::Error + Send + Sync + 'static, - Retry: Send + Sync, - R::Policy: bounds::SmithyRetryPolicy, - Retry: ClassifyRetry, SdkError>, - // This bound is not _technically_ inferred by all the previous bounds, but in practice it - // is because _we_ know that there is only implementation of Service for Parsed - // (ParsedResponseService), and it will apply as long as the bounds on C, M, and R hold, - // and will produce (as expected) Response = SdkSuccess, Error = SdkError. But Rust - // doesn't know that -- there _could_ theoretically be other implementations of Service for - // Parsed that don't return those same types. So, we must give the bound. - bounds::Parsed<>::Service, O, Retry>: - Service, Response = SdkSuccess, Error = SdkError> + Clone, - { - let connector = self.connector.clone(); - - let timeout_params = - ClientTimeoutParams::new(&self.operation_timeout_config, self.sleep_impl.clone()); - - let svc = ServiceBuilder::new() - .layer(TimeoutLayer::new(timeout_params.operation_timeout)) - .retry( - self.retry_policy - .new_request_policy(self.sleep_impl.clone()), - ) - .layer(PoisonLayer::new(self.reconnect_mode)) - .layer(TimeoutLayer::new(timeout_params.operation_attempt_timeout)) - .layer(ParseResponseLayer::::new()) - // These layers can be considered as occurring in order. That is, first invoke the - // customer-provided middleware, then dispatch dispatch over the wire. - .layer(&self.middleware) - .layer(DispatchLayer::new()) - .service(connector); - - // send_operation records the full request-response lifecycle. - // NOTE: For operations that stream output, only the setup is captured in this span. - let span = debug_span!( - "send_operation", - operation = field::Empty, - service = field::Empty, - status = field::Empty, - message = field::Empty - ); - let (mut req, parts) = op.into_request_response(); - if let Some(metadata) = &parts.metadata { - // Clippy has a bug related to needless borrows so we need to allow them here - // https://github.com/rust-lang/rust-clippy/issues/9782 - #[allow(clippy::needless_borrow)] - { - span.record("operation", &metadata.name()); - span.record("service", &metadata.service()); - } - // This will clone two `Cow::<&'static str>::Borrow`s in the vast majority of cases - req.properties_mut().insert(metadata.clone()); - } - let op = Operation::from_parts(req, parts); - - let result = async move { check_send_sync(svc).ready().await?.call(op).await } - .instrument(span.clone()) - .await; - #[allow(clippy::needless_borrow)] - match &result { - Ok(_) => { - span.record("status", &"ok"); - } - Err(err) => { - span.record( - "status", - &match err { - SdkError::ConstructionFailure(_) => "construction_failure", - SdkError::DispatchFailure(_) => "dispatch_failure", - SdkError::ResponseError(_) => "response_error", - SdkError::ServiceError(_) => "service_error", - SdkError::TimeoutError(_) => "timeout_error", - _ => "error", - }, - ) - .record("message", &field::display(DisplayErrorContext(err))); - } - } - result - } - - /// Statically check the validity of a `Client` without a request to send. - /// - /// This will make sure that all the bounds hold that would be required by `call` and - /// `call_raw` (modulo those that relate to the specific `Operation` type). Comes in handy to - /// ensure (statically) that all the various constructors actually produce "useful" types. - #[doc(hidden)] - pub fn check(&self) - where - R::Policy: tower::retry::Policy< - static_tests::ValidTestOperation, - SdkSuccess<()>, - SdkError, - > + Clone, - { - let _ = |o: static_tests::ValidTestOperation| { - drop(self.call_raw(o)); - }; - } -} diff --git a/rust-runtime/aws-smithy-client/src/never.rs b/rust-runtime/aws-smithy-client/src/never.rs deleted file mode 100644 index b6dcc07ea20..00000000000 --- a/rust-runtime/aws-smithy-client/src/never.rs +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Test connectors that never return data - -use std::marker::PhantomData; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::task::{Context, Poll}; - -use http::Uri; -use tower::BoxError; - -use aws_smithy_async::future::never::Never; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; - -use crate::erase::boxclone::BoxFuture; - -/// A service that will never return whatever it is you want -/// -/// Returned futures will return Pending forever -#[non_exhaustive] -#[derive(Debug)] -pub struct NeverService { - _resp: PhantomData<(Req, Resp, Err)>, - invocations: Arc, -} - -impl Clone for NeverService { - fn clone(&self) -> Self { - Self { - _resp: Default::default(), - invocations: self.invocations.clone(), - } - } -} - -impl Default for NeverService { - fn default() -> Self { - Self::new() - } -} - -impl NeverService { - /// Create a new NeverService - pub fn new() -> Self { - NeverService { - _resp: Default::default(), - invocations: Default::default(), - } - } - - /// Returns the number of invocations made to this service - pub fn num_calls(&self) -> usize { - self.invocations.load(Ordering::SeqCst) - } -} - -/// A Connector that can be use with [`Client`](crate::Client) that never returns a response. -pub type NeverConnector = - NeverService, http::Response, ConnectorError>; - -/// A service where the underlying TCP connection never connects. -pub type NeverConnected = NeverService; - -/// Streams that never return data -pub(crate) mod stream { - use std::io::Error; - use std::pin::Pin; - use std::task::{Context, Poll}; - - use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - - /// A stream that will never return or accept any data - #[non_exhaustive] - #[derive(Debug, Default)] - pub struct EmptyStream; - - impl EmptyStream { - pub fn new() -> Self { - Self - } - } - - impl AsyncRead for EmptyStream { - fn poll_read( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &mut ReadBuf<'_>, - ) -> Poll> { - Poll::Pending - } - } - - impl AsyncWrite for EmptyStream { - fn poll_write( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &[u8], - ) -> Poll> { - Poll::Pending - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - - fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - } -} - -/// A service that will connect but never send any data -#[derive(Clone, Debug, Default)] -pub struct NeverReplies; -impl NeverReplies { - /// Create a new NeverReplies service - pub fn new() -> Self { - Self - } -} - -impl tower::Service for NeverReplies { - type Response = stream::EmptyStream; - type Error = BoxError; - type Future = std::future::Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: Uri) -> Self::Future { - std::future::ready(Ok(stream::EmptyStream::new())) - } -} - -impl tower::Service for NeverService { - type Response = Resp; - type Error = Err; - type Future = BoxFuture; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: Req) -> Self::Future { - self.invocations.fetch_add(1, Ordering::SeqCst); - Box::pin(async move { - Never::new().await; - unreachable!() - }) - } -} diff --git a/rust-runtime/aws-smithy-client/src/poison.rs b/rust-runtime/aws-smithy-client/src/poison.rs deleted file mode 100644 index ffbaaf8abc1..00000000000 --- a/rust-runtime/aws-smithy-client/src/poison.rs +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Connection Poisoning -//! -//! The client supports behavior where on transient errors (e.g. timeouts, 503, etc.) it will ensure -//! that the offending connection is not reused. This happens to ensure that in the case where the -//! connection itself is broken (e.g. connected to a bad host) we don't reuse it for other requests. -//! -//! This relies on a series of mechanisms: -//! 1. [`CaptureSmithyConnection`] is a container which exists in the operation property bag. It is -//! inserted by this layer before the request is sent. -//! 2. The [`DispatchLayer`](aws_smithy_http_tower::dispatch::DispatchLayer) copies the field from operation extensions HTTP request extensions. -//! 3. The HTTP layer (e.g. Hyper) sets [`ConnectionMetadata`](aws_smithy_http::connection::ConnectionMetadata) -//! when it is available. -//! 4. When the response comes back, if indicated, this layer invokes -//! [`ConnectionMetadata::poison`](aws_smithy_http::connection::ConnectionMetadata::poison). -//! -//! ### Why isn't this integrated into `retry.rs`? -//! If the request has a streaming body, we won't attempt to retry because [`Operation::try_clone()`] will -//! return `None`. Therefore, we need to handle this inside of the retry loop. - -use std::future::Future; - -use aws_smithy_http::operation::Operation; -use aws_smithy_http::result::{SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; - -use aws_smithy_http::connection::CaptureSmithyConnection; -use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryKind}; -use pin_project_lite::pin_project; -use std::marker::PhantomData; -use std::pin::Pin; -use std::task::{Context, Poll}; - -/// PoisonLayer that poisons connections depending on the error kind -pub(crate) struct PoisonLayer { - inner: PhantomData, - mode: ReconnectMode, -} - -impl PoisonLayer { - pub(crate) fn new(mode: ReconnectMode) -> Self { - Self { - inner: Default::default(), - mode, - } - } -} - -impl Clone for PoisonLayer { - fn clone(&self) -> Self { - Self { - inner: Default::default(), - mode: self.mode, - } - } -} - -impl tower::Layer for PoisonLayer { - type Service = PoisonService; - - fn layer(&self, inner: S) -> Self::Service { - PoisonService { - inner, - mode: self.mode, - } - } -} - -#[derive(Clone)] -pub(crate) struct PoisonService { - inner: S, - mode: ReconnectMode, -} - -impl tower::Service> for PoisonService -where - R: ClassifyRetry, SdkError>, - S: tower::Service, Response = SdkSuccess, Error = SdkError>, -{ - type Response = S::Response; - type Error = S::Error; - type Future = PoisonServiceFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, mut req: Operation) -> Self::Future { - let classifier = req.retry_classifier().clone(); - let capture_smithy_connection = CaptureSmithyConnection::new(); - req.properties_mut() - .insert(capture_smithy_connection.clone()); - PoisonServiceFuture { - inner: self.inner.call(req), - conn: capture_smithy_connection, - mode: self.mode, - classifier, - } - } -} - -pin_project! { - pub struct PoisonServiceFuture { - #[pin] - inner: F, - classifier: R, - conn: CaptureSmithyConnection, - mode: ReconnectMode - } -} - -impl Future for PoisonServiceFuture -where - F: Future, SdkError>>, - R: ClassifyRetry, SdkError>, -{ - type Output = F::Output; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.project(); - match this.inner.poll(cx) { - Poll::Ready(resp) => { - let retry_kind = this.classifier.classify_retry(resp.as_ref()); - if this.mode == &ReconnectMode::ReconnectOnTransientError - && retry_kind == RetryKind::Error(ErrorKind::TransientError) - { - if let Some(smithy_conn) = this.conn.get() { - tracing::info!("poisoning connection: {:?}", smithy_conn); - smithy_conn.poison(); - } else { - tracing::trace!("No smithy connection found! The underlying HTTP connection never set a connection."); - } - } - Poll::Ready(resp) - } - Poll::Pending => Poll::Pending, - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/retry.rs b/rust-runtime/aws-smithy-client/src/retry.rs deleted file mode 100644 index 8c2fdc246c3..00000000000 --- a/rust-runtime/aws-smithy-client/src/retry.rs +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Retry support -//! -//! Components: -//! - [`Standard`]: Top level manager, intended to be associated with a [`Client`](crate::Client). -//! Its sole purpose in life is to create a [`RetryHandler`] for individual requests. -//! - [`RetryHandler`]: A request-scoped retry policy, backed by request-local state and shared -//! state contained within [`Standard`]. -//! - [`Config`]: Static configuration (max attempts, max backoff etc.) - -use std::future::Future; -use std::pin::Pin; -use std::sync::{Arc, Mutex}; -use std::time::Duration; - -use tracing::Instrument; - -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; - -use aws_smithy_http::operation::Operation; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_types::retry::{ErrorKind, RetryKind}; - -use crate::{SdkError, SdkSuccess}; - -/// A policy instantiator. -/// -/// Implementors are essentially "policy factories" that can produce a new instance of a retry -/// policy mechanism for each request, which allows both shared global state _and_ per-request -/// local state. -pub trait NewRequestPolicy -where - Self::Policy: Send + Sync, -{ - /// The type of the per-request policy mechanism. - type Policy; - - /// Create a new policy mechanism instance. - fn new_request_policy(&self, sleep_impl: Option) -> Self::Policy; -} - -/// Retry Policy Configuration -/// -/// Without specific use cases, users should generally rely on the default values set -/// by [`Config::default`](Config::default). -/// -/// Currently these fields are private and no setters provided. As needed, this configuration -/// will become user-modifiable in the future. -#[derive(Clone, Debug)] -pub struct Config { - initial_retry_tokens: usize, - retry_cost: usize, - no_retry_increment: usize, - timeout_retry_cost: usize, - max_attempts: u32, - initial_backoff: Duration, - max_backoff: Duration, - base: fn() -> f64, -} - -impl Config { - /// Override `b` in the exponential backoff computation - /// - /// By default, `base` is a randomly generated value between 0 and 1. In tests, it can - /// be helpful to override this: - /// ```no_run - /// use aws_smithy_client::retry::Config; - /// let conf = Config::default().with_base(||1_f64); - /// ``` - pub fn with_base(mut self, base: fn() -> f64) -> Self { - self.base = base; - self - } - - /// Override the maximum number of attempts - /// - /// `max_attempts` must be set to a value of at least `1` (indicating that retries are disabled). - pub fn with_max_attempts(mut self, max_attempts: u32) -> Self { - self.max_attempts = max_attempts; - self - } - - /// Override the default backoff multiplier of 1 second. - /// - /// ## Example - /// - /// For a request that gets retried 3 times, when initial_backoff is 1 second: - /// - the first retry will occur after 0 to 1 seconds - /// - the second retry will occur after 0 to 2 seconds - /// - the third retry will occur after 0 to 4 seconds - /// - /// For a request that gets retried 3 times, when initial_backoff is 30 milliseconds: - /// - the first retry will occur after 0 to 30 milliseconds - /// - the second retry will occur after 0 to 60 milliseconds - /// - the third retry will occur after 0 to 120 milliseconds - pub fn with_initial_backoff(mut self, initial_backoff: Duration) -> Self { - self.initial_backoff = initial_backoff; - self - } - - /// Returns true if retry is enabled with this config - pub fn has_retry(&self) -> bool { - self.max_attempts > 1 - } -} - -impl Default for Config { - fn default() -> Self { - Self { - initial_retry_tokens: INITIAL_RETRY_TOKENS, - retry_cost: RETRY_COST, - no_retry_increment: 1, - timeout_retry_cost: 10, - max_attempts: MAX_ATTEMPTS, - max_backoff: Duration::from_secs(20), - // by default, use a random base for exponential backoff - base: fastrand::f64, - initial_backoff: Duration::from_secs(1), - } - } -} - -impl From for Config { - fn from(conf: aws_smithy_types::retry::RetryConfig) -> Self { - Self::default() - .with_max_attempts(conf.max_attempts()) - .with_initial_backoff(conf.initial_backoff()) - } -} - -const MAX_ATTEMPTS: u32 = 3; -const INITIAL_RETRY_TOKENS: usize = 500; -const RETRY_COST: usize = 5; - -/// Manage retries for a service -/// -/// An implementation of the `standard` AWS retry strategy. A `Strategy` is scoped to a client. -/// For an individual request, call [`Standard::new_request_policy()`](Standard::new_request_policy) -#[derive(Debug, Clone)] -pub struct Standard { - config: Config, - shared_state: CrossRequestRetryState, -} - -impl Standard { - /// Construct a new standard retry policy from the given policy configuration. - pub fn new(config: Config) -> Self { - Self { - shared_state: CrossRequestRetryState::new(config.initial_retry_tokens), - config, - } - } - - /// Set the configuration for this retry policy. - pub fn with_config(&mut self, config: Config) -> &mut Self { - self.config = config; - self - } -} - -impl NewRequestPolicy for Standard { - type Policy = RetryHandler; - - fn new_request_policy(&self, sleep_impl: Option) -> Self::Policy { - RetryHandler { - local: RequestLocalRetryState::new(), - shared: self.shared_state.clone(), - config: self.config.clone(), - sleep_impl, - } - } -} - -impl Default for Standard { - fn default() -> Self { - Self::new(Config::default()) - } -} - -#[derive(Clone, Debug)] -struct RequestLocalRetryState { - attempts: u32, - last_quota_usage: Option, -} - -impl Default for RequestLocalRetryState { - fn default() -> Self { - Self { - // Starts at one to account for the initial request that failed and warranted a retry - attempts: 1, - last_quota_usage: None, - } - } -} - -impl RequestLocalRetryState { - fn new() -> Self { - Self::default() - } -} - -/* TODO(retries) -/// RetryPartition represents a scope for cross request retry state -/// -/// For example, a retry partition could be the id of a service. This would give each service a separate retry budget. -struct RetryPartition(Cow<'static, str>); */ - -/// Shared state between multiple requests to the same client. -#[derive(Clone, Debug)] -struct CrossRequestRetryState { - quota_available: Arc>, -} - -// clippy is upset that we didn't use AtomicUsize here, but doing so makes the code -// significantly more complicated for negligible benefit. -#[allow(clippy::mutex_atomic)] -impl CrossRequestRetryState { - fn new(initial_quota: usize) -> Self { - Self { - quota_available: Arc::new(Mutex::new(initial_quota)), - } - } - - fn quota_release(&self, value: Option, config: &Config) { - let mut quota = self.quota_available.lock().unwrap(); - *quota += value.unwrap_or(config.no_retry_increment); - } - - /// Attempt to acquire retry quota for `ErrorKind` - /// - /// If quota is available, the amount of quota consumed is returned - /// If no quota is available, `None` is returned. - fn quota_acquire(&self, err: &ErrorKind, config: &Config) -> Option { - let mut quota = self.quota_available.lock().unwrap(); - let retry_cost = if err == &ErrorKind::TransientError { - config.timeout_retry_cost - } else { - config.retry_cost - }; - if retry_cost > *quota { - None - } else { - *quota -= retry_cost; - Some(retry_cost) - } - } -} - -type BoxFuture = Pin + Send>>; - -/// RetryHandler -/// -/// Implement retries for an individual request. -/// It is intended to be used as a [Tower Retry Policy](tower::retry::Policy) for use in tower-based -/// middleware stacks. -#[derive(Clone, Debug)] -pub struct RetryHandler { - local: RequestLocalRetryState, - shared: CrossRequestRetryState, - config: Config, - sleep_impl: Option, -} - -#[cfg(test)] -impl RetryHandler { - fn retry_quota(&self) -> usize { - *self.shared.quota_available.lock().unwrap() - } -} - -/// For a request that gets retried 3 times, when base is 1 and initial_backoff is 2 seconds: -/// - the first retry will occur after 0 to 2 seconds -/// - the second retry will occur after 0 to 4 seconds -/// - the third retry will occur after 0 to 8 seconds -/// -/// For a request that gets retried 3 times, when base is 1 and initial_backoff is 30 milliseconds: -/// - the first retry will occur after 0 to 30 milliseconds -/// - the second retry will occur after 0 to 60 milliseconds -/// - the third retry will occur after 0 to 120 milliseconds -fn calculate_exponential_backoff(base: f64, initial_backoff: f64, retry_attempts: u32) -> f64 { - base * initial_backoff * 2_u32.pow(retry_attempts) as f64 -} - -impl RetryHandler { - /// Determine the correct response given `retry_kind` - /// - /// If a retry is specified, this function returns `(next, backoff_duration)` - /// If no retry is specified, this function returns None - fn should_retry_error(&self, error_kind: &ErrorKind) -> Option<(Self, Duration)> { - let quota_used = { - if self.local.attempts == self.config.max_attempts { - tracing::trace!( - attempts = self.local.attempts, - max_attempts = self.config.max_attempts, - "not retrying becuase we are out of attempts" - ); - return None; - } - match self.shared.quota_acquire(error_kind, &self.config) { - Some(quota) => quota, - None => { - tracing::trace!(state = ?self.shared, "not retrying because no quota is available"); - return None; - } - } - }; - let backoff = calculate_exponential_backoff( - // Generate a random base multiplier to create jitter - (self.config.base)(), - // Get the backoff time multiplier in seconds (with fractional seconds) - self.config.initial_backoff.as_secs_f64(), - // `self.local.attempts` tracks number of requests made including the initial request - // The initial attempt shouldn't count towards backoff calculations so we subtract it - self.local.attempts - 1, - ); - let backoff = Duration::from_secs_f64(backoff).min(self.config.max_backoff); - let next = RetryHandler { - local: RequestLocalRetryState { - attempts: self.local.attempts + 1, - last_quota_usage: Some(quota_used), - }, - shared: self.shared.clone(), - config: self.config.clone(), - sleep_impl: self.sleep_impl.clone(), - }; - - Some((next, backoff)) - } - - fn should_retry(&self, retry_kind: &RetryKind) -> Option<(Self, Duration)> { - match retry_kind { - RetryKind::Explicit(dur) => Some((self.clone(), *dur)), - RetryKind::UnretryableFailure => None, - RetryKind::Unnecessary => { - self.shared - .quota_release(self.local.last_quota_usage, &self.config); - None - } - RetryKind::Error(err) => self.should_retry_error(err), - _ => None, - } - } - - fn retry_for(&self, retry_kind: RetryKind) -> Option> { - let retry = self.should_retry(&retry_kind); - tracing::trace!(retry=?retry, retry_kind = ?retry_kind, "retry action"); - let (next, dur) = retry?; - - let sleep = match &self.sleep_impl { - Some(sleep) => sleep, - None => { - if retry_kind != RetryKind::UnretryableFailure { - tracing::debug!("cannot retry because no sleep implementation exists"); - } - return None; - } - }; - - tracing::debug!( - "attempt {} failed with {:?}; retrying after {:?}", - self.local.attempts, - retry_kind, - dur - ); - let sleep_future = sleep.sleep(dur); - let fut = async move { - sleep_future.await; - next - } - .instrument(tracing::debug_span!("retry", kind = &debug(retry_kind))); - Some(check_send(Box::pin(fut))) - } -} - -impl tower::retry::Policy, SdkSuccess, SdkError> - for RetryHandler -where - Handler: Clone, - R: ClassifyRetry, SdkError>, -{ - type Future = BoxFuture; - - fn retry( - &self, - req: &Operation, - result: Result<&SdkSuccess, &SdkError>, - ) -> Option { - let classifier = req.retry_classifier(); - let retry_kind = classifier.classify_retry(result); - tracing::trace!(retry_kind = ?retry_kind, "retry classification"); - self.retry_for(retry_kind) - } - - fn clone_request(&self, req: &Operation) -> Option> { - req.try_clone() - } -} - -fn check_send(t: T) -> T { - t -} - -#[cfg(test)] -mod test { - use super::{calculate_exponential_backoff, Config, NewRequestPolicy, RetryHandler, Standard}; - - use aws_smithy_types::retry::{ErrorKind, RetryKind}; - - use std::time::Duration; - - fn test_config() -> Config { - Config::default().with_base(|| 1_f64) - } - - #[test] - fn retry_handler_send_sync() { - fn must_be_send_sync() {} - - must_be_send_sync::() - } - - #[test] - fn eventual_success() { - let policy = Standard::new(test_config()).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let no_retry = policy.should_retry(&RetryKind::Unnecessary); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 495); - } - - #[test] - fn no_more_attempts() { - let policy = Standard::new(test_config()).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 490); - } - - #[test] - fn no_quota() { - let mut conf = test_config(); - conf.initial_retry_tokens = 5; - let policy = Standard::new(conf).new_request_policy(None); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 0); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 0); - } - - #[test] - fn quota_replenishes_on_success() { - let mut conf = test_config(); - conf.initial_retry_tokens = 100; - let policy = Standard::new(conf).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::TransientError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 90); - - let (policy, dur) = policy - .should_retry(&RetryKind::Explicit(Duration::from_secs(1))) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!( - policy.retry_quota(), - 90, - "explicit retry should not subtract from quota" - ); - - assert!( - policy.should_retry(&RetryKind::Unnecessary).is_none(), - "it should not retry success" - ); - let available = policy.shared.quota_available.lock().unwrap(); - assert_eq!(100, *available, "successful request should replenish quota"); - } - - #[test] - fn backoff_timing() { - let mut conf = test_config(); - conf.max_attempts = 5; - let policy = Standard::new(conf).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(4)); - assert_eq!(policy.retry_quota(), 485); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(8)); - assert_eq!(policy.retry_quota(), 480); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 480); - } - - #[test] - fn max_backoff_time() { - let mut conf = test_config(); - conf.max_attempts = 5; - conf.initial_backoff = Duration::from_secs(1); - conf.max_backoff = Duration::from_secs(3); - let policy = Standard::new(conf).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(3)); - assert_eq!(policy.retry_quota(), 485); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(3)); - assert_eq!(policy.retry_quota(), 480); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 480); - } - - #[test] - fn calculate_exponential_backoff_where_initial_backoff_is_one() { - let initial_backoff = 1.0; - - for (attempt, expected_backoff) in [initial_backoff, 2.0, 4.0].into_iter().enumerate() { - let actual_backoff = - calculate_exponential_backoff(1.0, initial_backoff, attempt as u32); - assert_eq!(expected_backoff, actual_backoff); - } - } - - #[test] - fn calculate_exponential_backoff_where_initial_backoff_is_greater_than_one() { - let initial_backoff = 3.0; - - for (attempt, expected_backoff) in [initial_backoff, 6.0, 12.0].into_iter().enumerate() { - let actual_backoff = - calculate_exponential_backoff(1.0, initial_backoff, attempt as u32); - assert_eq!(expected_backoff, actual_backoff); - } - } - - #[test] - fn calculate_exponential_backoff_where_initial_backoff_is_less_than_one() { - let initial_backoff = 0.03; - - for (attempt, expected_backoff) in [initial_backoff, 0.06, 0.12].into_iter().enumerate() { - let actual_backoff = - calculate_exponential_backoff(1.0, initial_backoff, attempt as u32); - assert_eq!(expected_backoff, actual_backoff); - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/static_tests.rs b/rust-runtime/aws-smithy-client/src/static_tests.rs deleted file mode 100644 index a8cd503022c..00000000000 --- a/rust-runtime/aws-smithy-client/src/static_tests.rs +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -//! This module provides types useful for static tests. -#![allow(missing_docs, missing_debug_implementations)] - -use crate::{Builder, Operation, ParseHttpResponse, ProvideErrorKind}; -use aws_smithy_http::operation; -use aws_smithy_http::retry::DefaultResponseRetryClassifier; - -#[derive(Debug)] -#[non_exhaustive] -pub struct TestOperationError; -impl std::fmt::Display for TestOperationError { - fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - unreachable!("only used for static tests") - } -} -impl std::error::Error for TestOperationError {} -impl ProvideErrorKind for TestOperationError { - fn retryable_error_kind(&self) -> Option { - unreachable!("only used for static tests") - } - - fn code(&self) -> Option<&str> { - unreachable!("only used for static tests") - } -} -#[derive(Clone)] -#[non_exhaustive] -pub struct TestOperation; -impl ParseHttpResponse for TestOperation { - type Output = Result<(), TestOperationError>; - - fn parse_unloaded(&self, _: &mut operation::Response) -> Option { - unreachable!("only used for static tests") - } - - fn parse_loaded(&self, _response: &http::Response) -> Self::Output { - unreachable!("only used for static tests") - } -} -pub type ValidTestOperation = Operation; - -// Statically check that a standard retry can actually be used to build a Client. -#[allow(dead_code)] -#[cfg(test)] -fn sanity_retry() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .check(); -} - -// Statically check that a hyper client can actually be used to build a Client. -#[allow(dead_code)] -#[cfg(all(test, feature = "hyper"))] -fn sanity_hyper(hc: crate::hyper_ext::Adapter) { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector(hc) - .build() - .check(); -} - -// Statically check that a type-erased middleware client is actually a valid Client. -#[allow(dead_code)] -fn sanity_erase_middleware() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn_middleware() - .check(); -} - -// Statically check that a type-erased connector client is actually a valid Client. -#[allow(dead_code)] -fn sanity_erase_connector() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn_connector() - .check(); -} - -// Statically check that a fully type-erased client is actually a valid Client. -#[allow(dead_code)] -fn sanity_erase_full() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn() - .check(); -} - -fn is_send_sync(_: T) {} -fn noarg_is_send_sync() {} - -// Statically check that a fully type-erased client is still Send + Sync. -#[allow(dead_code)] -fn erased_is_send_sync() { - noarg_is_send_sync::(); - noarg_is_send_sync::>(); - is_send_sync( - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn(), - ); -} diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs deleted file mode 100644 index 622f5fedcec..00000000000 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ /dev/null @@ -1,728 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -//! Module with client connectors useful for testing. - -// TODO(docs) -#![allow(missing_docs)] - -use std::fmt::{Debug, Formatter}; -use std::future::Ready; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::task::{Context, Poll}; - -use http::header::{HeaderName, CONTENT_TYPE}; -use http::Request; -use tokio::sync::oneshot; - -use crate::erase::DynConnector; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; - -#[doc(inline)] -pub use crate::never; - -/// Test Connection to capture a single request -#[derive(Debug, Clone)] -pub struct CaptureRequestHandler(Arc>); - -#[derive(Debug)] -struct Inner { - response: Option>, - sender: Option>>, -} - -/// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) -#[derive(Debug)] -pub struct CaptureRequestReceiver { - receiver: oneshot::Receiver>, -} - -impl CaptureRequestReceiver { - /// Expect that a request was sent. Returns the captured request. - /// - /// # Panics - /// If no request was received - #[track_caller] - pub fn expect_request(mut self) -> http::Request { - self.receiver.try_recv().expect("no request was received") - } - - /// Expect that no request was captured. Panics if a request was received. - /// - /// # Panics - /// If a request was received - #[track_caller] - pub fn expect_no_request(mut self) { - self.receiver - .try_recv() - .expect_err("expected no request to be received!"); - } -} - -impl tower::Service> for CaptureRequestHandler { - type Response = http::Response; - type Error = ConnectorError; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Request) -> Self::Future { - let mut inner = self.0.lock().unwrap(); - inner - .sender - .take() - .expect("already sent") - .send(req) - .expect("channel not ready"); - std::future::ready(Ok(inner - .response - .take() - .expect("could not handle second request"))) - } -} - -/// Test connection used to capture a single request -/// -/// If response is `None`, it will reply with a 200 response with an empty body -/// -/// Example: -/// ```compile_fail -/// let (server, request) = capture_request(None); -/// let conf = aws_sdk_sts::Config::builder() -/// .http_connector(server) -/// .build(); -/// let client = aws_sdk_sts::Client::from_conf(conf); -/// let _ = client.assume_role_with_saml().send().await; -/// // web identity should be unsigned -/// assert_eq!( -/// request.expect_request().headers().get("AUTHORIZATION"), -/// None -/// ); -/// ``` -pub fn capture_request( - response: Option>, -) -> (CaptureRequestHandler, CaptureRequestReceiver) { - let (tx, rx) = oneshot::channel(); - ( - CaptureRequestHandler(Arc::new(Mutex::new(Inner { - response: Some(response.unwrap_or_else(|| { - http::Response::builder() - .status(200) - .body(SdkBody::empty()) - .expect("unreachable") - })), - sender: Some(tx), - }))), - CaptureRequestReceiver { receiver: rx }, - ) -} - -type ConnectVec = Vec<(http::Request, http::Response)>; - -#[derive(Debug)] -pub struct ValidateRequest { - pub expected: http::Request, - pub actual: http::Request, -} - -impl ValidateRequest { - pub fn assert_matches(&self, ignore_headers: &[HeaderName]) { - let (actual, expected) = (&self.actual, &self.expected); - assert_eq!(expected.uri(), actual.uri()); - for (name, value) in expected.headers() { - if !ignore_headers.contains(name) { - let actual_header = actual - .headers() - .get(name) - .unwrap_or_else(|| panic!("Header {:?} missing", name)); - assert_eq!( - actual_header.to_str().unwrap(), - value.to_str().unwrap(), - "Header mismatch for {:?}", - name - ); - } - } - let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); - let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); - let media_type = if actual - .headers() - .get(CONTENT_TYPE) - .map(|v| v.to_str().unwrap().contains("json")) - .unwrap_or(false) - { - MediaType::Json - } else { - MediaType::Other("unknown".to_string()) - }; - match (actual_str, expected_str) { - (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), - _ => assert_eq!(expected.body().bytes(), actual.body().bytes()), - }; - } -} - -/// TestConnection for use with a [`Client`](crate::Client). -/// -/// A basic test connection. It will: -/// - Respond to requests with a preloaded series of responses -/// - Record requests for future examination -/// -/// The generic parameter `B` is the type of the response body. -/// For more complex use cases, see [Tower Test](https://docs.rs/tower-test/0.4.0/tower_test/) -/// Usage example: -/// ```no_run -/// use aws_smithy_client::test_connection::TestConnection; -/// use aws_smithy_http::body::SdkBody; -/// let events = vec![( -/// http::Request::new(SdkBody::from("request body")), -/// http::Response::builder() -/// .status(200) -/// .body("response body") -/// .unwrap(), -/// )]; -/// let conn = TestConnection::new(events); -/// let client = aws_smithy_client::Client::from(conn); -/// ``` -#[derive(Debug)] -pub struct TestConnection { - data: Arc>>, - requests: Arc>>, -} - -// Need a clone impl that ignores `B` -impl Clone for TestConnection { - fn clone(&self) -> Self { - TestConnection { - data: self.data.clone(), - requests: self.requests.clone(), - } - } -} - -impl TestConnection { - pub fn new(mut data: ConnectVec) -> Self { - data.reverse(); - TestConnection { - data: Arc::new(Mutex::new(data)), - requests: Default::default(), - } - } - - pub fn requests(&self) -> impl Deref> + '_ { - self.requests.lock().unwrap() - } - - #[track_caller] - pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { - for req in self.requests().iter() { - req.assert_matches(ignore_headers) - } - let remaining_requests = self.data.lock().unwrap().len(); - let actual_requests = self.requests().len(); - assert_eq!( - remaining_requests, 0, - "Expected {} additional requests ({} were made)", - remaining_requests, actual_requests - ); - } -} - -impl tower::Service> for TestConnection -where - SdkBody: From, -{ - type Response = http::Response; - type Error = ConnectorError; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, actual: Request) -> Self::Future { - // todo: validate request - if let Some((expected, resp)) = self.data.lock().unwrap().pop() { - self.requests - .lock() - .unwrap() - .push(ValidateRequest { expected, actual }); - std::future::ready(Ok(resp.map(SdkBody::from))) - } else { - std::future::ready(Err(ConnectorError::other("No more data".into(), None))) - } - } -} - -impl From> for crate::Client, tower::layer::util::Identity> -where - B: Send + 'static, - SdkBody: From, -{ - fn from(tc: TestConnection) -> Self { - crate::Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector(tc) - .build() - } -} - -/// Create a DynConnector from `Fn(http:Request) -> http::Response` -/// -/// # Examples -/// -/// ```rust -/// use aws_smithy_client::test_connection::infallible_connection_fn; -/// let connector = infallible_connection_fn(|_req|http::Response::builder().status(200).body("OK!").unwrap()); -/// ``` -pub fn infallible_connection_fn( - f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, -) -> DynConnector -where - B: Into, -{ - ConnectionFn::infallible(f) -} - -#[derive(Clone)] -struct ConnectionFn { - #[allow(clippy::type_complexity)] - response: Arc< - dyn Fn(http::Request) -> Result, ConnectorError> - + Send - + Sync, - >, -} - -impl Debug for ConnectionFn { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("ConnectionFn").finish() - } -} - -impl ConnectionFn { - fn infallible>( - f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, - ) -> DynConnector { - DynConnector::new(Self { - response: Arc::new(move |request| Ok(f(request).map(|b| b.into()))), - }) - } -} - -impl tower::Service> for ConnectionFn { - type Response = http::Response; - type Error = ConnectorError; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Request) -> Self::Future { - std::future::ready((self.response)(req)) - } -} - -/// [`wire_mock`] contains utilities for mocking at the socket level -/// -/// Other tools in this module actually operate at the `http::Request` / `http::Response` level. This -/// is useful, but it shortcuts the HTTP implementation (e.g. Hyper). [`wire_mock::WireLevelTestConnection`] binds -/// to an actual socket on the host -/// -/// # Examples -/// ``` -/// use tower::layer::util::Identity; -/// use aws_smithy_client::http_connector::ConnectorSettings; -/// use aws_smithy_client::{match_events, ev}; -/// use aws_smithy_client::test_connection::wire_mock::check_matches; -/// # async fn example() { -/// use aws_smithy_client::test_connection::wire_mock::{ReplayedEvent, WireLevelTestConnection}; -/// // This connection binds to a local address -/// let mock = WireLevelTestConnection::spinup(vec![ -/// ReplayedEvent::status(503), -/// ReplayedEvent::status(200) -/// ]).await; -/// let client = aws_smithy_client::Client::builder() -/// .connector(mock.http_connector().connector(&ConnectorSettings::default(), None).unwrap()) -/// .middleware(Identity::new()) -/// .build(); -/// /* do something with */ -/// // assert that you got the events you expected -/// match_events!(ev!(dns), ev!(connect), ev!(http(200)))(&mock.events()); -/// # } -/// ``` -#[cfg(feature = "wiremock")] -pub mod wire_mock { - use bytes::Bytes; - use http::{Request, Response}; - use hyper::client::connect::dns::Name; - use hyper::server::conn::AddrStream; - use hyper::service::{make_service_fn, service_fn}; - use hyper::{Body, Server}; - use std::collections::HashSet; - use std::convert::Infallible; - use std::error::Error; - - use hyper::client::HttpConnector as HyperHttpConnector; - use std::iter; - use std::iter::Once; - use std::net::{SocketAddr, TcpListener}; - use std::sync::{Arc, Mutex}; - use std::task::{Context, Poll}; - - use tokio::spawn; - use tower::Service; - - /// An event recorded by [`WireLevelTestConnection`] - #[derive(Debug, Clone)] - pub enum RecordedEvent { - DnsLookup(String), - NewConnection, - Response(ReplayedEvent), - } - - type Matcher = ( - Box Result<(), Box>>, - &'static str, - ); - - /// This method should only be used by the macro - #[doc(hidden)] - pub fn check_matches(events: &[RecordedEvent], matchers: &[Matcher]) { - let mut events_iter = events.iter(); - let mut matcher_iter = matchers.iter(); - let mut idx = -1; - loop { - idx += 1; - let bail = |err: Box| panic!("failed on event {}:\n {}", idx, err); - match (events_iter.next(), matcher_iter.next()) { - (Some(event), Some((matcher, _msg))) => matcher(event).unwrap_or_else(bail), - (None, None) => return, - (Some(event), None) => { - bail(format!("got {:?} but no more events were expected", event).into()) - } - (None, Some((_expect, msg))) => { - bail(format!("expected {:?} but no more events were expected", msg).into()) - } - } - } - } - - #[macro_export] - macro_rules! matcher { - ($expect:tt) => { - ( - Box::new( - |event: &::aws_smithy_client::test_connection::wire_mock::RecordedEvent| { - if !matches!(event, $expect) { - return Err(format!( - "expected `{}` but got {:?}", - stringify!($expect), - event - ) - .into()); - } - Ok(()) - }, - ), - stringify!($expect), - ) - }; - } - - /// Helper macro to generate a series of test expectations - #[macro_export] - macro_rules! match_events { - ($( $expect:pat),*) => { - |events| { - check_matches(events, &[$( ::aws_smithy_client::matcher!($expect) ),*]); - } - }; - } - - /// Helper to generate match expressions for events - #[macro_export] - macro_rules! ev { - (http($status:expr)) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::Response( - ReplayedEvent::HttpResponse { - status: $status, - .. - }, - ) - }; - (dns) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::DnsLookup(_) - }; - (connect) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::NewConnection - }; - (timeout) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::Response( - ReplayedEvent::Timeout, - ) - }; - } - - pub use {ev, match_events, matcher}; - - #[derive(Clone, Debug, PartialEq, Eq)] - pub enum ReplayedEvent { - Timeout, - HttpResponse { status: u16, body: Bytes }, - } - - impl ReplayedEvent { - pub fn ok() -> Self { - Self::HttpResponse { - status: 200, - body: Bytes::new(), - } - } - - pub fn with_body(body: &str) -> Self { - Self::HttpResponse { - status: 200, - body: Bytes::copy_from_slice(body.as_ref()), - } - } - - pub fn status(status: u16) -> Self { - Self::HttpResponse { - status, - body: Bytes::new(), - } - } - } - - use crate::erase::boxclone::BoxFuture; - use crate::http_connector::HttpConnector; - use crate::hyper_ext; - use aws_smithy_async::future::never::Never; - use tokio::sync::oneshot; - - /// Test connection that starts a server bound to 0.0.0.0 - /// - /// See the [module docs](crate::test_connection::wire_mock) for a usage example. - /// - /// Usage: - /// - Call [`WireLevelTestConnection::spinup`] to start the server - /// - Use [`WireLevelTestConnection::http_connector`] or [`dns_resolver`](WireLevelTestConnection::dns_resolver) to configure your client. - /// - Make requests to [`endpoint_url`](WireLevelTestConnection::endpoint_url). - /// - Once the test is complete, retrieve a list of events from [`WireLevelTestConnection::events`] - #[derive(Debug)] - pub struct WireLevelTestConnection { - event_log: Arc>>, - bind_addr: SocketAddr, - // when the sender is dropped, that stops the server - shutdown_hook: oneshot::Sender<()>, - } - - impl WireLevelTestConnection { - pub async fn spinup(mut response_events: Vec) -> Self { - let listener = TcpListener::bind("127.0.0.1:0").unwrap(); - let (tx, rx) = oneshot::channel(); - let listener_addr = listener.local_addr().unwrap(); - response_events.reverse(); - let response_events = Arc::new(Mutex::new(response_events)); - let handler_events = response_events; - let wire_events = Arc::new(Mutex::new(vec![])); - let wire_log_for_service = wire_events.clone(); - let poisoned_conns: Arc>> = Default::default(); - let make_service = make_service_fn(move |connection: &AddrStream| { - let poisoned_conns = poisoned_conns.clone(); - let events = handler_events.clone(); - let wire_log = wire_log_for_service.clone(); - let remote_addr = connection.remote_addr(); - tracing::info!("established connection: {:?}", connection); - wire_log.lock().unwrap().push(RecordedEvent::NewConnection); - async move { - Ok::<_, Infallible>(service_fn(move |_: Request| { - if poisoned_conns.lock().unwrap().contains(&remote_addr) { - tracing::error!("poisoned connection {:?} was reused!", &remote_addr); - panic!("poisoned connection was reused!"); - } - let next_event = events.clone().lock().unwrap().pop(); - let wire_log = wire_log.clone(); - let poisoned_conns = poisoned_conns.clone(); - async move { - let next_event = next_event - .unwrap_or_else(|| panic!("no more events! Log: {:?}", wire_log)); - wire_log - .lock() - .unwrap() - .push(RecordedEvent::Response(next_event.clone())); - if next_event == ReplayedEvent::Timeout { - tracing::info!("{} is poisoned", remote_addr); - poisoned_conns.lock().unwrap().insert(remote_addr); - } - tracing::debug!("replying with {:?}", next_event); - let event = generate_response_event(next_event).await; - dbg!(event) - } - })) - } - }); - let server = Server::from_tcp(listener) - .unwrap() - .serve(make_service) - .with_graceful_shutdown(async { - rx.await.ok(); - tracing::info!("server shutdown!"); - }); - spawn(server); - Self { - event_log: wire_events, - bind_addr: listener_addr, - shutdown_hook: tx, - } - } - - /// Retrieve the events recorded by this connection - pub fn events(&self) -> Vec { - self.event_log.lock().unwrap().clone() - } - - fn bind_addr(&self) -> SocketAddr { - self.bind_addr - } - - pub fn dns_resolver(&self) -> LoggingDnsResolver { - let event_log = self.event_log.clone(); - let bind_addr = self.bind_addr; - LoggingDnsResolver { - log: event_log, - socket_addr: bind_addr, - } - } - - /// Prebuilt HTTP connector with correctly wired DNS resolver - /// - /// **Note**: This must be used in tandem with [`Self::dns_resolver`] - pub fn http_connector(&self) -> HttpConnector { - let http_connector = HyperHttpConnector::new_with_resolver(self.dns_resolver()); - hyper_ext::Adapter::builder().build(http_connector).into() - } - - /// Endpoint to use when connecting - /// - /// This works in tandem with the [`Self::dns_resolver`] to bind to the correct local IP Address - pub fn endpoint_url(&self) -> String { - format!( - "http://this-url-is-converted-to-localhost.com:{}", - self.bind_addr().port() - ) - } - - pub fn shutdown(self) { - let _ = self.shutdown_hook.send(()); - } - } - - async fn generate_response_event(event: ReplayedEvent) -> Result, Infallible> { - let resp = match event { - ReplayedEvent::HttpResponse { status, body } => http::Response::builder() - .status(status) - .body(hyper::Body::from(body)) - .unwrap(), - ReplayedEvent::Timeout => { - Never::new().await; - unreachable!() - } - }; - Ok::<_, Infallible>(resp) - } - - /// DNS resolver that keeps a log of all lookups - /// - /// Regardless of what hostname is requested, it will always return the same socket address. - #[derive(Clone, Debug)] - pub struct LoggingDnsResolver { - log: Arc>>, - socket_addr: SocketAddr, - } - - impl Service for LoggingDnsResolver { - type Response = Once; - type Error = Infallible; - type Future = BoxFuture; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Name) -> Self::Future { - let sock_addr = self.socket_addr; - let log = self.log.clone(); - Box::pin(async move { - println!("looking up {:?}, replying with {:?}", req, sock_addr); - log.lock() - .unwrap() - .push(RecordedEvent::DnsLookup(req.to_string())); - Ok(iter::once(sock_addr)) - }) - } - } -} - -#[cfg(test)] -mod tests { - use tower::Service; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::result::ConnectorError; - - use crate::bounds::SmithyConnector; - use crate::test_connection::{capture_request, never::NeverService, TestConnection}; - use crate::Client; - - fn is_send_sync(_: T) {} - - #[test] - fn construct_test_client() { - let test_conn = TestConnection::::new(vec![]); - let client: Client<_, _, _> = test_conn.into(); - is_send_sync(client); - } - - fn is_a_connector(_: &T) - where - T: SmithyConnector, - { - } - - fn quacks_like_a_connector(_: &T) - where - T: Service, Response = http::Response> - + Send - + Sync - + Clone - + 'static, - T::Error: Into + Send + Sync + 'static, - T::Future: Send + 'static, - { - } - - #[test] - fn oneshot_client() { - let (tx, _rx) = capture_request(None); - quacks_like_a_connector(&tx); - is_a_connector(&tx) - } - - #[test] - fn never_test() { - is_a_connector(&NeverService::< - http::Request, - http::Response, - ConnectorError, - >::new()) - } -} diff --git a/rust-runtime/aws-smithy-client/src/timeout.rs b/rust-runtime/aws-smithy-client/src/timeout.rs deleted file mode 100644 index f9a03a41f67..00000000000 --- a/rust-runtime/aws-smithy-client/src/timeout.rs +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Timeout Configuration - -use crate::SdkError; -use aws_smithy_async::future::timeout::Timeout; -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_http::operation::Operation; -use aws_smithy_types::timeout::OperationTimeoutConfig; -use pin_project_lite::pin_project; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use std::time::Duration; -use tower::Layer; - -#[derive(Debug)] -struct RequestTimeoutError { - kind: &'static str, - duration: Duration, -} - -impl RequestTimeoutError { - fn new(kind: &'static str, duration: Duration) -> Self { - Self { kind, duration } - } -} - -impl std::fmt::Display for RequestTimeoutError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{} occurred after {:?}", self.kind, self.duration) - } -} - -impl std::error::Error for RequestTimeoutError {} - -#[derive(Clone, Debug)] -/// A struct containing everything needed to create a new [`TimeoutService`] -pub struct TimeoutServiceParams { - /// The duration of timeouts created from these params - duration: Duration, - /// The kind of timeouts created from these params - kind: &'static str, - /// The AsyncSleep impl that will be used to create time-limited futures - async_sleep: SharedAsyncSleep, -} - -#[derive(Clone, Debug, Default)] -/// A struct of structs containing everything needed to create new [`TimeoutService`]s -pub(crate) struct ClientTimeoutParams { - /// Params used to create a new API call [`TimeoutService`] - pub(crate) operation_timeout: Option, - /// Params used to create a new API call attempt [`TimeoutService`] - pub(crate) operation_attempt_timeout: Option, -} - -impl ClientTimeoutParams { - pub(crate) fn new( - timeout_config: &OperationTimeoutConfig, - async_sleep: Option, - ) -> Self { - if let Some(async_sleep) = async_sleep { - Self { - operation_timeout: timeout_config.operation_timeout().map(|duration| { - TimeoutServiceParams { - duration, - kind: "operation timeout (all attempts including retries)", - async_sleep: async_sleep.clone(), - } - }), - operation_attempt_timeout: timeout_config.operation_attempt_timeout().map( - |duration| TimeoutServiceParams { - duration, - kind: "operation attempt timeout (single attempt)", - async_sleep: async_sleep.clone(), - }, - ), - } - } else { - Default::default() - } - } -} - -/// A service that wraps another service, adding the ability to set a timeout for requests -/// handled by the inner service. -#[derive(Clone, Debug)] -pub struct TimeoutService { - inner: S, - params: Option, -} - -impl TimeoutService { - /// Create a new `TimeoutService` that will timeout after the duration specified in `params` elapses - pub fn new(inner: S, params: Option) -> Self { - Self { inner, params } - } - - /// Create a new `TimeoutService` that will never timeout - pub fn no_timeout(inner: S) -> Self { - Self { - inner, - params: None, - } - } -} - -/// A layer that wraps services in a timeout service -#[non_exhaustive] -#[derive(Debug)] -pub struct TimeoutLayer(Option); - -impl TimeoutLayer { - /// Create a new `TimeoutLayer` - pub fn new(params: Option) -> Self { - TimeoutLayer(params) - } -} - -impl Layer for TimeoutLayer { - type Service = TimeoutService; - - fn layer(&self, inner: S) -> Self::Service { - TimeoutService { - inner, - params: self.0.clone(), - } - } -} - -pin_project! { - #[non_exhaustive] - #[must_use = "futures do nothing unless you `.await` or poll them"] - // This allow is needed because otherwise Clippy will get mad we didn't document the - // generated TimeoutServiceFutureProj - #[allow(missing_docs)] - #[project = TimeoutServiceFutureProj] - /// A future generated by a [`TimeoutService`] that may or may not have a timeout depending on - /// whether or not one was set. Because `TimeoutService` can be used at multiple levels of the - /// service stack, a `kind` can be set so that when a timeout occurs, you can know which kind of - /// timeout it was. - pub enum TimeoutServiceFuture { - /// A wrapper around an inner future that will output an [`SdkError`] if it runs longer than - /// the given duration - Timeout { - #[pin] - future: Timeout, - kind: &'static str, - duration: Duration, - }, - /// A thin wrapper around an inner future that will never time out - NoTimeout { - #[pin] - future: F - } - } -} - -impl TimeoutServiceFuture { - /// Given a `future`, an implementor of `AsyncSleep`, a `kind` for this timeout, and a `duration`, - /// wrap the `future` inside a [`Timeout`] future and create a new [`TimeoutServiceFuture`] that - /// will output an [`SdkError`] if `future` doesn't complete before `duration` has elapsed. - pub fn new(future: F, params: &TimeoutServiceParams) -> Self { - Self::Timeout { - future: Timeout::new(future, params.async_sleep.sleep(params.duration)), - kind: params.kind, - duration: params.duration, - } - } - - /// Create a [`TimeoutServiceFuture`] that will never time out. - pub fn no_timeout(future: F) -> Self { - Self::NoTimeout { future } - } -} - -impl Future for TimeoutServiceFuture -where - InnerFuture: Future>>, -{ - type Output = Result>; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let (future, kind, duration) = match self.project() { - TimeoutServiceFutureProj::NoTimeout { future } => return future.poll(cx), - TimeoutServiceFutureProj::Timeout { - future, - kind, - duration, - } => (future, kind, duration), - }; - match future.poll(cx) { - Poll::Ready(Ok(response)) => Poll::Ready(response), - Poll::Ready(Err(_timeout)) => Poll::Ready(Err(SdkError::timeout_error( - RequestTimeoutError::new(kind, *duration), - ))), - Poll::Pending => Poll::Pending, - } - } -} - -impl tower::Service> for TimeoutService -where - InnerService: tower::Service, Error = SdkError>, -{ - type Response = InnerService::Response; - type Error = SdkError; - type Future = TimeoutServiceFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: Operation) -> Self::Future { - let future = self.inner.call(req); - - if let Some(params) = &self.params { - Self::Future::new(future, params) - } else { - Self::Future::no_timeout(future) - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::never::NeverService; - use crate::{SdkError, TimeoutLayer}; - use aws_smithy_async::assert_elapsed; - use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation::{Operation, Request}; - use aws_smithy_types::timeout::TimeoutConfig; - use std::time::Duration; - use tower::{Service, ServiceBuilder, ServiceExt}; - - #[tokio::test] - async fn test_timeout_service_ends_request_that_never_completes() { - let req = Request::new(http::Request::new(SdkBody::empty())); - let op = Operation::new(req, ()); - let never_service: NeverService<_, (), _> = NeverService::new(); - let timeout_config = OperationTimeoutConfig::from( - TimeoutConfig::builder() - .operation_timeout(Duration::from_secs_f32(0.25)) - .build(), - ); - let sleep_impl = SharedAsyncSleep::new(TokioSleep::new()); - let timeout_service_params = ClientTimeoutParams::new(&timeout_config, Some(sleep_impl)); - let mut svc = ServiceBuilder::new() - .layer(TimeoutLayer::new(timeout_service_params.operation_timeout)) - .service(never_service); - - let now = tokio::time::Instant::now(); - tokio::time::pause(); - - let err: SdkError> = - svc.ready().await.unwrap().call(op).await.unwrap_err(); - - assert_eq!(format!("{:?}", err), "TimeoutError(TimeoutError { source: RequestTimeoutError { kind: \"operation timeout (all attempts including retries)\", duration: 250ms } })"); - assert_elapsed!(now, Duration::from_secs_f32(0.25)); - } -} diff --git a/rust-runtime/aws-smithy-client/test-data/example.com.json b/rust-runtime/aws-smithy-client/test-data/example.com.json deleted file mode 100644 index 821548cc217..00000000000 --- a/rust-runtime/aws-smithy-client/test-data/example.com.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "events": [ - { - "connection_id": 0, - "action": { - "Request": { - "request": { - "uri": "https://www.example.com/", - "headers": {}, - "method": "POST" - } - } - } - }, - { - "connection_id": 0, - "action": { - "Data": { - "data": { - "Utf8": "hello world" - }, - "direction": "Request" - } - } - }, - { - "connection_id": 0, - "action": { - "Eof": { - "ok": true, - "direction": "Request" - } - } - }, - { - "connection_id": 0, - "action": { - "Response": { - "response": { - "Ok": { - "status": 200, - "version": "HTTP/2.0", - "headers": { - "etag": [ - "\"3147526947+ident\"" - ], - "vary": [ - "Accept-Encoding" - ], - "server": [ - "ECS (bsa/EB20)" - ], - "x-cache": [ - "HIT" - ], - "age": [ - "355292" - ], - "content-length": [ - "1256" - ], - "cache-control": [ - "max-age=604800" - ], - "expires": [ - "Mon, 16 Aug 2021 18:51:30 GMT" - ], - "content-type": [ - "text/html; charset=UTF-8" - ], - "date": [ - "Mon, 09 Aug 2021 18:51:30 GMT" - ], - "last-modified": [ - "Thu, 17 Oct 2019 07:18:26 GMT" - ] - } - } - } - } - } - }, - { - "connection_id": 0, - "action": { - "Data": { - "data": { - "Utf8": "hello from example.com" - }, - "direction": "Response" - } - } - }, - { - "connection_id": 0, - "action": { - "Eof": { - "ok": true, - "direction": "Response" - } - } - } - ], - "docs": "test of example.com. response body has been manually changed", - "version": "V0" -} diff --git a/rust-runtime/aws-smithy-client/tests/e2e_test.rs b/rust-runtime/aws-smithy-client/tests/e2e_test.rs deleted file mode 100644 index f18a084bb5d..00000000000 --- a/rust-runtime/aws-smithy-client/tests/e2e_test.rs +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod test_operation; -use crate::test_operation::{TestOperationParser, TestRetryClassifier}; -use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_client::Client; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::result::SdkError; -use std::time::Duration; -use tower::layer::util::Identity; - -fn test_operation() -> Operation { - let req = operation::Request::new( - http::Request::builder() - .uri("https://test-service.test-region.amazonaws.com/") - .body(SdkBody::from("request body")) - .unwrap(), - ); - Operation::new(req, TestOperationParser).with_retry_classifier(TestRetryClassifier) -} - -#[tokio::test] -async fn end_to_end_retry_test() { - fn req() -> http::Request { - http::Request::builder() - .body(SdkBody::from("request body")) - .unwrap() - } - - fn ok() -> http::Response<&'static str> { - http::Response::builder() - .status(200) - .body("Hello!") - .unwrap() - } - - fn err() -> http::Response<&'static str> { - http::Response::builder() - .status(500) - .body("This was an error") - .unwrap() - } - // 1 failing response followed by 1 successful response - let events = vec![ - // First operation - (req(), err()), - (req(), err()), - (req(), ok()), - // Second operation - (req(), err()), - (req(), ok()), - // Third operation will fail, only errors - (req(), err()), - (req(), err()), - (req(), err()), - (req(), err()), - ]; - let conn = TestConnection::new(events); - let retry_config = aws_smithy_client::retry::Config::default() - .with_max_attempts(4) - // This is the default, just setting it to be explicit - .with_initial_backoff(Duration::from_secs(1)) - .with_base(|| 1_f64); - let client = Client::builder() - .connector(conn.clone()) - .middleware(Identity::new()) - .retry_config(retry_config) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(); - tokio::time::pause(); - let initial = tokio::time::Instant::now(); - let resp = client - .call(test_operation()) - .await - .expect("successful operation"); - assert_time_passed(initial, Duration::from_secs(3)); - assert_eq!(resp, "Hello!"); - // 3 requests should have been made, 2 failing & one success - assert_eq!(conn.requests().len(), 3); - - let initial = tokio::time::Instant::now(); - client - .call(test_operation()) - .await - .expect("successful operation"); - assert_time_passed(initial, Duration::from_secs(1)); - assert_eq!(conn.requests().len(), 5); - let initial = tokio::time::Instant::now(); - let err = client - .call(test_operation()) - .await - .expect_err("all responses failed"); - // 4 more tries followed by failure - assert_eq!(conn.requests().len(), 9); - assert!(matches!(err, SdkError::ServiceError { .. })); - assert_time_passed(initial, Duration::from_secs(7)); -} - -/// Validate that time has passed with a 5ms tolerance -/// -/// This is to account for some non-determinism in the Tokio timer -fn assert_time_passed(initial: tokio::time::Instant, passed: Duration) { - let now = tokio::time::Instant::now(); - let delta = now - initial; - if (delta.as_millis() as i128 - passed.as_millis() as i128).abs() > 5 { - assert_eq!(delta, passed) - } -} diff --git a/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs deleted file mode 100644 index 695e069cf15..00000000000 --- a/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![cfg(feature = "wiremock")] - -mod test_operation; - -use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; -use aws_smithy_client::test_connection::wire_mock; -use aws_smithy_client::test_connection::wire_mock::{check_matches, RecordedEvent, ReplayedEvent}; -use aws_smithy_client::{hyper_ext, Builder}; -use aws_smithy_client::{match_events, Client}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_types::retry::ReconnectMode; -use aws_smithy_types::timeout::{OperationTimeoutConfig, TimeoutConfig}; -use http::Uri; -use http_body::combinators::BoxBody; -use hyper::client::{Builder as HyperBuilder, HttpConnector}; -use std::convert::Infallible; -use std::time::Duration; -use test_operation::{TestOperationParser, TestRetryClassifier}; -use tower::layer::util::Identity; -use wire_mock::ev; - -fn end_of_test() -> &'static str { - "end_of_test" -} - -fn test_operation( - uri: Uri, - retryable: bool, -) -> Operation { - let mut req = operation::Request::new( - http::Request::builder() - .uri(uri) - .body(SdkBody::from("request body")) - .unwrap(), - ); - if !retryable { - req = req - .augment(|req, _conf| { - Ok::<_, Infallible>( - req.map(|_| SdkBody::from_dyn(BoxBody::new(SdkBody::from("body")))), - ) - }) - .unwrap(); - } - Operation::new(req, TestOperationParser).with_retry_classifier(TestRetryClassifier) -} - -async fn h1_and_h2(events: Vec, match_clause: impl Fn(&[RecordedEvent])) { - wire_level_test(events.clone(), |_b| {}, |b| b, &match_clause).await; - wire_level_test( - events, - |b| { - b.http2_only(true); - }, - |b| b, - match_clause, - ) - .await; - println!("h2 ok!"); -} - -/// Repeatedly send test operation until `end_of_test` is received -/// -/// When the test is over, match_clause is evaluated -async fn wire_level_test( - events: Vec, - hyper_builder_settings: impl Fn(&mut HyperBuilder), - client_builder_settings: impl Fn(Builder) -> Builder, - match_clause: impl Fn(&[RecordedEvent]), -) { - let connection = wire_mock::WireLevelTestConnection::spinup(events).await; - - let http_connector = HttpConnector::new_with_resolver(connection.dns_resolver()); - let mut hyper_builder = hyper::Client::builder(); - hyper_builder_settings(&mut hyper_builder); - let hyper_adapter = hyper_ext::Adapter::builder() - .hyper_builder(hyper_builder) - .build(http_connector); - let client = client_builder_settings( - Client::builder().reconnect_mode(ReconnectMode::ReconnectOnTransientError), - ) - .connector(hyper_adapter) - .middleware(Identity::new()) - .operation_timeout_config(OperationTimeoutConfig::from( - &TimeoutConfig::builder() - .operation_attempt_timeout(Duration::from_millis(100)) - .build(), - )) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(); - loop { - match client - .call(test_operation( - connection.endpoint_url().parse().unwrap(), - false, - )) - .await - { - Ok(resp) => { - tracing::info!("response: {:?}", resp); - if resp == end_of_test() { - break; - } - } - Err(e) => tracing::info!("error: {:?}", e), - } - } - let events = connection.events(); - match_clause(&events); -} - -#[tokio::test] -async fn non_transient_errors_no_reconect() { - h1_and_h2( - vec![ - ReplayedEvent::status(400), - ReplayedEvent::with_body(end_of_test()), - ], - match_events!(ev!(dns), ev!(connect), ev!(http(400)), ev!(http(200))), - ) - .await -} - -#[tokio::test] -async fn reestablish_dns_on_503() { - h1_and_h2( - vec![ - ReplayedEvent::status(503), - ReplayedEvent::status(503), - ReplayedEvent::status(503), - ReplayedEvent::with_body(end_of_test()), - ], - match_events!( - // first request - ev!(dns), - ev!(connect), - ev!(http(503)), - // second request - ev!(dns), - ev!(connect), - ev!(http(503)), - // third request - ev!(dns), - ev!(connect), - ev!(http(503)), - // all good - ev!(dns), - ev!(connect), - ev!(http(200)) - ), - ) - .await; -} - -#[tokio::test] -async fn connection_shared_on_success() { - h1_and_h2( - vec![ - ReplayedEvent::ok(), - ReplayedEvent::ok(), - ReplayedEvent::status(503), - ReplayedEvent::with_body(end_of_test()), - ], - match_events!( - ev!(dns), - ev!(connect), - ev!(http(200)), - ev!(http(200)), - ev!(http(503)), - ev!(dns), - ev!(connect), - ev!(http(200)) - ), - ) - .await; -} - -#[tokio::test] -async fn no_reconnect_when_disabled() { - use wire_mock::ev; - wire_level_test( - vec![ - ReplayedEvent::status(503), - ReplayedEvent::with_body(end_of_test()), - ], - |_b| {}, - |b| b.reconnect_mode(ReconnectMode::ReuseAllConnections), - match_events!(ev!(dns), ev!(connect), ev!(http(503)), ev!(http(200))), - ) - .await; -} - -#[tokio::test] -async fn connection_reestablished_after_timeout() { - use wire_mock::ev; - h1_and_h2( - vec![ - ReplayedEvent::ok(), - ReplayedEvent::Timeout, - ReplayedEvent::ok(), - ReplayedEvent::Timeout, - ReplayedEvent::with_body(end_of_test()), - ], - match_events!( - // first connection - ev!(dns), - ev!(connect), - ev!(http(200)), - // reuse but got a timeout - ev!(timeout), - // so we reconnect - ev!(dns), - ev!(connect), - ev!(http(200)), - ev!(timeout), - ev!(dns), - ev!(connect), - ev!(http(200)) - ), - ) - .await; -} diff --git a/rust-runtime/aws-smithy-client/tests/test_operation/mod.rs b/rust-runtime/aws-smithy-client/tests/test_operation/mod.rs deleted file mode 100644 index db193e4bd9b..00000000000 --- a/rust-runtime/aws-smithy-client/tests/test_operation/mod.rs +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_http::operation; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_http::result::SdkError; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; -use bytes::Bytes; -use std::error::Error; -use std::fmt::{self, Debug, Display, Formatter}; -use std::str; - -#[derive(Clone)] -pub(super) struct TestOperationParser; - -#[derive(Debug)] -pub(super) struct OperationError(ErrorKind); - -impl Display for OperationError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl Error for OperationError {} - -impl ProvideErrorKind for OperationError { - fn retryable_error_kind(&self) -> Option { - Some(self.0) - } - - fn code(&self) -> Option<&str> { - None - } -} - -impl ParseHttpResponse for TestOperationParser { - type Output = Result; - - fn parse_unloaded(&self, response: &mut operation::Response) -> Option { - tracing::debug!("got response: {:?}", response); - match response.http().status() { - s if s.is_success() => None, - s if s.is_client_error() => Some(Err(OperationError(ErrorKind::ServerError))), - s if s.is_server_error() => Some(Err(OperationError(ErrorKind::TransientError))), - _ => panic!("unexpected status: {}", response.http().status()), - } - } - - fn parse_loaded(&self, response: &http::Response) -> Self::Output { - Ok(str::from_utf8(response.body().as_ref()) - .unwrap() - .to_string()) - } -} - -#[derive(Clone)] -pub(super) struct TestRetryClassifier; - -impl ClassifyRetry> for TestRetryClassifier -where - E: ProvideErrorKind + Debug, - T: Debug, -{ - fn classify_retry(&self, err: Result<&T, &SdkError>) -> RetryKind { - tracing::info!("got response: {:?}", err); - let kind = match err { - Err(SdkError::ServiceError(context)) => context.err().retryable_error_kind(), - Err(SdkError::DispatchFailure(err)) if err.is_timeout() => { - Some(ErrorKind::TransientError) - } - Err(SdkError::TimeoutError(_)) => Some(ErrorKind::TransientError), - Ok(_) => return RetryKind::Unnecessary, - _ => panic!("test handler only handles modeled errors got: {:?}", err), - }; - match kind { - Some(kind) => RetryKind::Error(kind), - None => RetryKind::UnretryableFailure, - } - } -} diff --git a/rust-runtime/aws-smithy-http-auth/Cargo.toml b/rust-runtime/aws-smithy-http-auth/Cargo.toml index 0d70b25eec7..4fef70bc0d6 100644 --- a/rust-runtime/aws-smithy-http-auth/Cargo.toml +++ b/rust-runtime/aws-smithy-http-auth/Cargo.toml @@ -5,13 +5,12 @@ authors = [ "AWS Rust SDK Team ", "Eduardo Rodrigues <16357187+eduardomourar@users.noreply.github.com>", ] -description = "Smithy HTTP logic for smithy-rs." +description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [dependencies] -zeroize = "1" [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-http-auth/README.md b/rust-runtime/aws-smithy-http-auth/README.md index 1d963cafce0..38d5d2dc0b1 100644 --- a/rust-runtime/aws-smithy-http-auth/README.md +++ b/rust-runtime/aws-smithy-http-auth/README.md @@ -1,6 +1,6 @@ # aws-smithy-http-auth -HTTP Auth implementation for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs). +This crate is no longer used by smithy-rs and is deprecated. Its equivalent logic is now in aws-smithy-runtime-api and aws-smithy-runtime. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-auth/src/api_key.rs b/rust-runtime/aws-smithy-http-auth/src/api_key.rs deleted file mode 100644 index bb2ab65b3c5..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/api_key.rs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth API Key - -use std::cmp::PartialEq; -use std::fmt::Debug; -use std::sync::Arc; -use zeroize::Zeroizing; - -/// Authentication configuration to connect to a Smithy Service -#[derive(Clone, Eq, PartialEq)] -pub struct AuthApiKey(Arc); - -#[derive(Clone, Eq, PartialEq)] -struct Inner { - api_key: Zeroizing, -} - -impl Debug for AuthApiKey { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut auth_api_key = f.debug_struct("AuthApiKey"); - auth_api_key.field("api_key", &"** redacted **").finish() - } -} - -impl AuthApiKey { - /// Constructs a new API key. - pub fn new(api_key: impl Into) -> Self { - Self(Arc::new(Inner { - api_key: Zeroizing::new(api_key.into()), - })) - } - - /// Returns the underlying api key. - pub fn api_key(&self) -> &str { - &self.0.api_key - } -} - -impl From<&str> for AuthApiKey { - fn from(api_key: &str) -> Self { - Self::from(api_key.to_owned()) - } -} - -impl From for AuthApiKey { - fn from(api_key: String) -> Self { - Self(Arc::new(Inner { - api_key: Zeroizing::new(api_key), - })) - } -} - -#[cfg(test)] -mod tests { - use super::AuthApiKey; - - #[test] - fn api_key_is_equal() { - let api_key_a: AuthApiKey = "some-api-key".into(); - let api_key_b = AuthApiKey::new("some-api-key"); - assert_eq!(api_key_a, api_key_b); - } - - #[test] - fn api_key_is_different() { - let api_key_a = AuthApiKey::new("some-api-key"); - let api_key_b: AuthApiKey = String::from("another-api-key").into(); - assert_ne!(api_key_a, api_key_b); - } -} diff --git a/rust-runtime/aws-smithy-http-auth/src/definition.rs b/rust-runtime/aws-smithy-http-auth/src/definition.rs deleted file mode 100644 index 918f6aae8f3..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/definition.rs +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth Definition - -use crate::location::HttpAuthLocation; -use std::cmp::PartialEq; -use std::fmt::Debug; - -/// A HTTP-specific authentication scheme that sends an arbitrary -/// auth value in a header or query string parameter. -// As described in the Smithy documentation: -// https://github.com/awslabs/smithy/blob/main/smithy-model/src/main/resources/software/amazon/smithy/model/loader/prelude.smithy -#[derive(Clone, Debug, Default, PartialEq)] -pub struct HttpAuthDefinition { - /// Defines the location of where the Auth is serialized. - location: HttpAuthLocation, - - /// Defines the name of the HTTP header or query string parameter - /// that contains the Auth. - name: String, - - /// Defines the security scheme to use on the `Authorization` header value. - /// This can only be set if the "location" property is set to [`HttpAuthLocation::Header`]. - scheme: Option, -} - -impl HttpAuthDefinition { - /// Returns a builder for `HttpAuthDefinition`. - pub fn builder() -> http_auth_definition::Builder { - http_auth_definition::Builder::default() - } - - /// Constructs a new HTTP auth definition in header. - pub fn header(header_name: N, scheme: S) -> Self - where - N: Into, - S: Into>, - { - let mut builder = Self::builder() - .location(HttpAuthLocation::Header) - .name(header_name); - let scheme: Option = scheme.into(); - if scheme.is_some() { - builder.set_scheme(scheme); - } - builder.build() - } - - /// Constructs a new HTTP auth definition following the RFC 2617 for Basic Auth. - pub fn basic_auth() -> Self { - Self::builder() - .location(HttpAuthLocation::Header) - .name("Authorization".to_owned()) - .scheme("Basic".to_owned()) - .build() - } - - /// Constructs a new HTTP auth definition following the RFC 2617 for Digest Auth. - pub fn digest_auth() -> Self { - Self::builder() - .location(HttpAuthLocation::Header) - .name("Authorization".to_owned()) - .scheme("Digest".to_owned()) - .build() - } - - /// Constructs a new HTTP auth definition following the RFC 6750 for Bearer Auth. - pub fn bearer_auth() -> Self { - Self::builder() - .location(HttpAuthLocation::Header) - .name("Authorization".to_owned()) - .scheme("Bearer".to_owned()) - .build() - } - - /// Constructs a new HTTP auth definition in query string. - pub fn query(name: impl Into) -> Self { - Self::builder() - .location(HttpAuthLocation::Query) - .name(name.into()) - .build() - } - - /// Returns the HTTP auth location. - pub fn location(&self) -> HttpAuthLocation { - self.location - } - - /// Returns the HTTP auth name. - pub fn name(&self) -> &str { - &self.name - } - - /// Returns the HTTP auth scheme. - pub fn scheme(&self) -> Option<&str> { - self.scheme.as_deref() - } -} - -/// Types associated with [`HttpAuthDefinition`]. -pub mod http_auth_definition { - use super::HttpAuthDefinition; - use crate::{ - definition::HttpAuthLocation, - error::{AuthError, AuthErrorKind}, - }; - - /// A builder for [`HttpAuthDefinition`]. - #[derive(Debug, Default)] - pub struct Builder { - location: Option, - name: Option, - scheme: Option, - } - - impl Builder { - /// Sets the HTTP auth location. - pub fn location(mut self, location: HttpAuthLocation) -> Self { - self.location = Some(location); - self - } - - /// Sets the HTTP auth location. - pub fn set_location(&mut self, location: Option) -> &mut Self { - self.location = location; - self - } - - /// Sets the the HTTP auth name. - pub fn name(mut self, name: impl Into) -> Self { - self.name = Some(name.into()); - self - } - - /// Sets the the HTTP auth name. - pub fn set_name(&mut self, name: Option) -> &mut Self { - self.name = name; - self - } - - /// Sets the HTTP auth scheme. - pub fn scheme(mut self, scheme: impl Into) -> Self { - self.scheme = Some(scheme.into()); - self - } - - /// Sets the HTTP auth scheme. - pub fn set_scheme(&mut self, scheme: Option) -> &mut Self { - self.scheme = scheme; - self - } - - /// Constructs a [`HttpAuthDefinition`] from the builder. - pub fn build(self) -> HttpAuthDefinition { - if self.scheme.is_some() - && self - .name - .as_deref() - .map_or("".to_string(), |s| s.to_ascii_lowercase()) - != "authorization" - { - // Stop execution because the Smithy model should not contain such combination. - // Otherwise, this would cause unexpected behavior in the SDK. - panic!("{}", AuthError::from(AuthErrorKind::SchemeNotAllowed)); - } - HttpAuthDefinition { - location: self.location.unwrap_or_else(|| { - panic!( - "{}", - AuthError::from(AuthErrorKind::MissingRequiredField("location")) - ) - }), - name: self.name.unwrap_or_else(|| { - panic!( - "{}", - AuthError::from(AuthErrorKind::MissingRequiredField("name")) - ) - }), - scheme: self.scheme, - } - } - } -} - -#[cfg(test)] -mod tests { - use super::HttpAuthDefinition; - use crate::location::HttpAuthLocation; - - #[test] - fn definition_for_header_without_scheme() { - let definition = HttpAuthDefinition::header("Header", None); - assert_eq!(definition.location, HttpAuthLocation::Header); - assert_eq!(definition.name, "Header"); - assert_eq!(definition.scheme, None); - } - - #[test] - fn definition_for_authorization_header_with_scheme() { - let definition = HttpAuthDefinition::header("authorization", "Scheme".to_owned()); - assert_eq!(definition.location(), HttpAuthLocation::Header); - assert_eq!(definition.name(), "authorization"); - assert_eq!(definition.scheme(), Some("Scheme")); - } - - #[test] - #[should_panic] - fn definition_fails_with_scheme_not_allowed() { - let _ = HttpAuthDefinition::header("Invalid".to_owned(), "Scheme".to_owned()); - } - - #[test] - fn definition_for_basic() { - let definition = HttpAuthDefinition::basic_auth(); - assert_eq!( - definition, - HttpAuthDefinition { - location: HttpAuthLocation::Header, - name: "Authorization".to_owned(), - scheme: Some("Basic".to_owned()), - } - ); - } - - #[test] - fn definition_for_digest() { - let definition = HttpAuthDefinition::digest_auth(); - assert_eq!(definition.location(), HttpAuthLocation::Header); - assert_eq!(definition.name(), "Authorization"); - assert_eq!(definition.scheme(), Some("Digest")); - } - - #[test] - fn definition_for_bearer_token() { - let definition = HttpAuthDefinition::bearer_auth(); - assert_eq!(definition.location(), HttpAuthLocation::Header); - assert_eq!(definition.name(), "Authorization"); - assert_eq!(definition.scheme(), Some("Bearer")); - } - - #[test] - fn definition_for_query() { - let definition = HttpAuthDefinition::query("query_key"); - assert_eq!(definition.location(), HttpAuthLocation::Query); - assert_eq!(definition.name(), "query_key"); - assert_eq!(definition.scheme(), None); - } -} diff --git a/rust-runtime/aws-smithy-http-auth/src/error.rs b/rust-runtime/aws-smithy-http-auth/src/error.rs deleted file mode 100644 index 227dbe1cf29..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/error.rs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth Error - -use std::cmp::PartialEq; -use std::fmt::Debug; - -#[derive(Debug, Eq, PartialEq)] -pub(crate) enum AuthErrorKind { - InvalidLocation, - MissingRequiredField(&'static str), - SchemeNotAllowed, -} - -/// Error for Smithy authentication -#[derive(Debug, Eq, PartialEq)] -pub struct AuthError { - kind: AuthErrorKind, -} - -impl std::fmt::Display for AuthError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - use AuthErrorKind::*; - match &self.kind { - InvalidLocation => write!(f, "invalid location: expected `header` or `query`"), - MissingRequiredField(field) => write!(f, "missing required field: {}", field), - SchemeNotAllowed => write!( - f, - "scheme only allowed when it is set into the `Authorization` header" - ), - } - } -} - -impl From for AuthError { - fn from(kind: AuthErrorKind) -> Self { - Self { kind } - } -} diff --git a/rust-runtime/aws-smithy-http-auth/src/lib.rs b/rust-runtime/aws-smithy-http-auth/src/lib.rs index 8f5f956ced6..f54985f0c9c 100644 --- a/rust-runtime/aws-smithy-http-auth/src/lib.rs +++ b/rust-runtime/aws-smithy-http-auth/src/lib.rs @@ -3,11 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -// TODO(enableNewSmithyRuntimeCleanup): The contents of this crate are moving into aws-smithy-runtime. -// This crate is kept to continue sorting the middleware implementation until it is removed. -// When removing the old implementation, clear out this crate and deprecate it. - -#![allow(clippy::derive_partial_eq_without_eq)] #![warn( missing_docs, rustdoc::missing_crate_level_docs, @@ -15,9 +10,4 @@ rust_2018_idioms )] -//! Smithy HTTP Auth Types - -pub mod api_key; -pub mod definition; -pub mod error; -pub mod location; +//! This crate is no longer used by smithy-rs and is deprecated. diff --git a/rust-runtime/aws-smithy-http-auth/src/location.rs b/rust-runtime/aws-smithy-http-auth/src/location.rs deleted file mode 100644 index 5b044cf904e..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/location.rs +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth Location - -use std::cmp::PartialEq; -use std::fmt::Debug; - -use crate::error::{AuthError, AuthErrorKind}; - -/// Enum for describing where the HTTP Auth can be placed. -#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)] -pub enum HttpAuthLocation { - /// In the HTTP header. - #[default] - Header, - /// In the query string of the URL. - Query, -} - -impl HttpAuthLocation { - fn as_str(&self) -> &'static str { - match self { - Self::Header => "header", - Self::Query => "query", - } - } -} - -impl TryFrom<&str> for HttpAuthLocation { - type Error = AuthError; - fn try_from(value: &str) -> Result { - match value { - "header" => Ok(Self::Header), - "query" => Ok(Self::Query), - _ => Err(AuthError::from(AuthErrorKind::InvalidLocation)), - } - } -} - -impl TryFrom for HttpAuthLocation { - type Error = AuthError; - fn try_from(value: String) -> Result { - Self::try_from(value.as_str()) - } -} - -impl AsRef for HttpAuthLocation { - fn as_ref(&self) -> &str { - self.as_str() - } -} - -impl std::fmt::Display for HttpAuthLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(&self.as_str(), f) - } -} - -#[cfg(test)] -mod tests { - use super::HttpAuthLocation; - use crate::error::{AuthError, AuthErrorKind}; - - #[test] - fn fails_if_location_is_invalid() { - let actual = HttpAuthLocation::try_from("invalid").unwrap_err(); - let expected = AuthError::from(AuthErrorKind::InvalidLocation); - assert_eq!(actual, expected); - } -} diff --git a/rust-runtime/aws-smithy-http-tower/Cargo.toml b/rust-runtime/aws-smithy-http-tower/Cargo.toml index 048a96f922f..51d1d9accae 100644 --- a/rust-runtime/aws-smithy-http-tower/Cargo.toml +++ b/rust-runtime/aws-smithy-http-tower/Cargo.toml @@ -2,25 +2,11 @@ name = "aws-smithy-http-tower" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "Tower-compatible shims for smithy-rs middleware." +description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" -[dependencies] -aws-smithy-types = { path = "../aws-smithy-types" } -aws-smithy-http = { path = "../aws-smithy-http" } -tower = { version = "0.4.4" } -pin-project-lite = "0.2.9" -http = "0.2.3" -bytes = "1" -http-body = "0.4.4" -tracing = "0.1" - -[dev-dependencies] -tower = { version = "0.4.4", features = ["util"] } -tokio = { version = "1.23.1", features = ["full"]} - [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/rust-runtime/aws-smithy-http-tower/README.md b/rust-runtime/aws-smithy-http-tower/README.md index a8ce891921d..a76b83783ee 100644 --- a/rust-runtime/aws-smithy-http-tower/README.md +++ b/rust-runtime/aws-smithy-http-tower/README.md @@ -1,6 +1,6 @@ # aws-smithy-http-tower -Bindings between the framework-agnostic traits in `aws-smithy-http` and Tower. +This crate is no longer used by smithy-rs and is deprecated. This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-tower/external-types.toml b/rust-runtime/aws-smithy-http-tower/external-types.toml index 552b7f76eb3..7fa182b39d1 100644 --- a/rust-runtime/aws-smithy-http-tower/external-types.toml +++ b/rust-runtime/aws-smithy-http-tower/external-types.toml @@ -1,12 +1 @@ -allowed_external_types = [ - "aws_smithy_http::*", - "http::request::Request", - "http::response::Response", - "tower_service::Service", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose on `tower::BoxError` - "tower::BoxError", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", -] +allowed_external_types = [] diff --git a/rust-runtime/aws-smithy-http-tower/src/dispatch.rs b/rust-runtime/aws-smithy-http-tower/src/dispatch.rs deleted file mode 100644 index a10693a62b5..00000000000 --- a/rust-runtime/aws-smithy-http-tower/src/dispatch.rs +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::SendOperationError; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::connection::CaptureSmithyConnection; -use aws_smithy_http::operation; -use aws_smithy_http::result::ConnectorError; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tower::{Layer, Service}; -use tracing::{debug_span, trace, Instrument}; - -/// Connects Operation driven middleware to an HTTP implementation. -/// -/// It will also wrap the error type in OperationError to enable operation middleware -/// reporting specific errors -#[derive(Clone)] -pub struct DispatchService { - inner: S, -} - -type BoxedResultFuture = Pin> + Send>>; - -impl Service for DispatchService -where - S: Service, Response = http::Response> + Clone + Send + 'static, - S::Error: Into, - S::Future: Send + 'static, -{ - type Response = operation::Response; - type Error = SendOperationError; - type Future = BoxedResultFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner - .poll_ready(cx) - .map_err(|e| SendOperationError::RequestDispatchError(e.into())) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let (mut req, property_bag) = req.into_parts(); - // copy the smithy connection - if let Some(smithy_conn) = property_bag.acquire().get::() { - req.extensions_mut().insert(smithy_conn.clone()); - } else { - println!("nothing to copy!"); - } - let mut inner = self.inner.clone(); - let future = async move { - trace!(request = ?req, "dispatching request"); - inner - .call(req) - .await - .map(|resp| operation::Response::from_parts(resp, property_bag)) - .map_err(|e| SendOperationError::RequestDispatchError(e.into())) - } - .instrument(debug_span!("dispatch")); - Box::pin(future) - } -} - -#[derive(Clone, Default)] -#[non_exhaustive] -pub struct DispatchLayer; - -impl DispatchLayer { - pub fn new() -> Self { - DispatchLayer - } -} - -impl Layer for DispatchLayer -where - S: Service>, -{ - type Service = DispatchService; - - fn layer(&self, inner: S) -> Self::Service { - DispatchService { inner } - } -} diff --git a/rust-runtime/aws-smithy-http-tower/src/lib.rs b/rust-runtime/aws-smithy-http-tower/src/lib.rs index 8a417961140..32e46abdb4b 100644 --- a/rust-runtime/aws-smithy-http-tower/src/lib.rs +++ b/rust-runtime/aws-smithy-http-tower/src/lib.rs @@ -3,130 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -#![allow(clippy::derive_partial_eq_without_eq)] +//! This crate is no longer used by smithy-rs and is deprecated. + #![warn( - // missing_docs, - // rustdoc::missing_crate_level_docs, + missing_docs, + rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms )] - -pub mod dispatch; -pub mod map_request; -pub mod parse_response; - -use aws_smithy_http::result::{ConnectorError, SdkError}; -use tower::BoxError; - -/// An Error Occurred During the process of sending an Operation -/// -/// The variants are split to enable the final [SdkError](`aws_smithy_http::result::SdkError`) to differentiate -/// between two types of errors: -/// 1. [`RequestConstructionError`](SendOperationError::RequestConstructionError): Errors where the -/// SDK never attempted to dispatch the underlying `http::Request`. These represent errors that -/// occurred during the request construction pipeline. These generally stem from configuration issues. -/// 2. [`RequestDispatchError`](SendOperationError::RequestDispatchError): Errors where the inner -/// tower service failed (e.g. because the hostname couldn't be resolved, connection errors, -/// socket hangup etc.). In this case, we don't know how much of the request was _actually_ sent -/// to the client. We only know that we never got back an `http::Response` (and instead got an error). -/// -/// `SendOperationError` is currently defined only in `aws-smithy-http-tower` because it may be removed -/// or replaced with `SdkError` in the future. -/// -/// `SendOperationError` MAY be moved to a private module in the future. -#[derive(Debug)] -pub enum SendOperationError { - /// The request could not be constructed - /// - /// These errors usually stem from configuration issues (e.g. no region, bad credential provider, etc.) - RequestConstructionError(BoxError), - - /// The request could not be dispatched - RequestDispatchError(ConnectorError), -} - -/// Convert a `SendOperationError` into an `SdkError` -impl From for SdkError { - fn from(err: SendOperationError) -> Self { - match err { - SendOperationError::RequestDispatchError(e) => { - aws_smithy_http::result::SdkError::dispatch_failure(e) - } - SendOperationError::RequestConstructionError(e) => { - aws_smithy_http::result::SdkError::construction_failure(e) - } - } - } -} - -#[cfg(test)] -mod tests { - use crate::dispatch::DispatchLayer; - use crate::map_request::MapRequestLayer; - use crate::parse_response::ParseResponseLayer; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use aws_smithy_http::operation::{Operation, Request}; - use aws_smithy_http::response::ParseStrictResponse; - use aws_smithy_http::result::ConnectorError; - use aws_smithy_http::retry::DefaultResponseRetryClassifier; - use bytes::Bytes; - use http::Response; - use std::convert::{Infallible, TryInto}; - use tower::{service_fn, Service, ServiceBuilder}; - - /// Creates a stubbed service stack and runs it to validate that all the types line up & - /// everything is properly wired - #[tokio::test] - async fn service_stack() { - #[derive(Clone)] - struct AddHeader; - impl MapRequest for AddHeader { - type Error = Infallible; - - fn name(&self) -> &'static str { - "add_header" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut req, _| { - req.headers_mut() - .insert("X-Test", "Value".try_into().unwrap()); - Ok(req) - }) - } - } - - struct TestParseResponse; - impl ParseStrictResponse for TestParseResponse { - type Output = Result; - - fn parse(&self, _response: &Response) -> Self::Output { - Ok("OK".to_string()) - } - } - - let http_layer = service_fn(|_request: http::Request| async move { - if _request.headers().contains_key("X-Test") { - Ok(http::Response::new(SdkBody::from("ok"))) - } else { - Err(ConnectorError::user("header not set".into())) - } - }); - - let mut svc = ServiceBuilder::new() - .layer(ParseResponseLayer::< - TestParseResponse, - DefaultResponseRetryClassifier, - >::new()) - .layer(MapRequestLayer::for_mapper(AddHeader)) - .layer(DispatchLayer) - .service(http_layer); - let req = http::Request::new(SdkBody::from("hello")); - let req = operation::Request::new(req); - let req = Operation::new(req, TestParseResponse); - let resp = svc.call(req).await.expect("Response should succeed"); - assert_eq!(resp.parsed, "OK".to_string()) - } -} diff --git a/rust-runtime/aws-smithy-http-tower/src/map_request.rs b/rust-runtime/aws-smithy-http-tower/src/map_request.rs deleted file mode 100644 index 5dd72a0c89d..00000000000 --- a/rust-runtime/aws-smithy-http-tower/src/map_request.rs +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::SendOperationError; -use aws_smithy_http::middleware::{AsyncMapRequest, MapRequest}; -use aws_smithy_http::operation; -use pin_project_lite::pin_project; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tower::{Layer, Service}; -use tracing::{debug_span, Instrument}; - -#[derive(Debug)] -pub struct AsyncMapRequestLayer { - mapper: M, -} - -impl AsyncMapRequestLayer { - pub fn for_mapper(mapper: M) -> Self { - AsyncMapRequestLayer { mapper } - } -} - -impl Layer for AsyncMapRequestLayer -where - M: Clone, -{ - type Service = AsyncMapRequestService; - - fn layer(&self, inner: S) -> Self::Service { - AsyncMapRequestService { - inner, - mapper: self.mapper.clone(), - } - } -} - -/// Tower service for [`AsyncMapRequest`](aws_smithy_http::middleware::AsyncMapRequest) -#[derive(Clone)] -pub struct AsyncMapRequestService { - inner: S, - mapper: M, -} - -type BoxFuture = Pin + Send>>; - -impl Service for AsyncMapRequestService -where - S: Service + Clone + Send + 'static, - M: AsyncMapRequest, - S::Future: Send + 'static, -{ - type Response = S::Response; - type Error = S::Error; - type Future = BoxFuture>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let mapper_name = self.mapper.name(); - let mut inner = self.inner.clone(); - let future = self.mapper.apply(req); - Box::pin(async move { - let span = debug_span!("async_map_request", name = mapper_name); - let mapped_request = future - .instrument(span) - .await - .map_err(|e| SendOperationError::RequestConstructionError(e.into()))?; - inner.call(mapped_request).await - }) - } -} - -#[derive(Debug, Default)] -pub struct MapRequestLayer { - mapper: M, -} - -impl MapRequestLayer { - pub fn for_mapper(mapper: M) -> Self { - MapRequestLayer { mapper } - } -} - -impl Layer for MapRequestLayer -where - M: Clone, -{ - type Service = MapRequestService; - - fn layer(&self, inner: S) -> Self::Service { - MapRequestService { - inner, - mapper: self.mapper.clone(), - } - } -} - -pin_project! { - #[project = EnumProj] - pub enum MapRequestFuture { - Inner { - #[pin] - inner: F - }, - Ready { inner: Option }, - } -} - -impl Future for MapRequestFuture -where - F: Future>, -{ - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - match self.project() { - EnumProj::Inner { inner: f } => f.poll(cx), - EnumProj::Ready { inner: e } => Poll::Ready(Err(e.take().unwrap())), - } - } -} - -/// Tower service for [`MapRequest`](aws_smithy_http::middleware::MapRequest) -#[derive(Clone)] -pub struct MapRequestService { - inner: S, - mapper: M, -} - -impl Service for MapRequestService -where - S: Service, - M: MapRequest, -{ - type Response = S::Response; - type Error = S::Error; - type Future = MapRequestFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let span = debug_span!("map_request", name = self.mapper.name()); - let mapper = &self.mapper; - match span - .in_scope(|| mapper.apply(req)) - .map_err(|e| SendOperationError::RequestConstructionError(e.into())) - { - Err(e) => MapRequestFuture::Ready { inner: Some(e) }, - Ok(req) => MapRequestFuture::Inner { - inner: self.inner.call(req), - }, - } - } -} diff --git a/rust-runtime/aws-smithy-http-tower/src/parse_response.rs b/rust-runtime/aws-smithy-http-tower/src/parse_response.rs deleted file mode 100644 index 1f6767c661c..00000000000 --- a/rust-runtime/aws-smithy-http-tower/src/parse_response.rs +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::SendOperationError; -use aws_smithy_http::middleware::load_response; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_http::result::{SdkError, SdkSuccess}; -use std::future::Future; -use std::marker::PhantomData; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tower::{Layer, Service}; -use tracing::{debug_span, Instrument}; - -/// `ParseResponseService` dispatches [`Operation`](aws_smithy_http::operation::Operation)s and parses them. -/// -/// `ParseResponseService` is intended to wrap a `DispatchService` which will handle the interface between -/// services that operate on [`operation::Request`](operation::Request) and services that operate -/// on [`http::Request`](http::Request). -#[derive(Clone)] -pub struct ParseResponseService { - inner: S, - _output_type: PhantomData<(O, R)>, -} - -#[derive(Default)] -pub struct ParseResponseLayer { - _output_type: PhantomData<(O, R)>, -} - -/// `ParseResponseLayer` dispatches [`Operation`](aws_smithy_http::operation::Operation)s and parses them. -impl ParseResponseLayer { - pub fn new() -> Self { - ParseResponseLayer { - _output_type: Default::default(), - } - } -} - -impl Layer for ParseResponseLayer -where - S: Service, -{ - type Service = ParseResponseService; - - fn layer(&self, inner: S) -> Self::Service { - ParseResponseService { - inner, - _output_type: Default::default(), - } - } -} - -type BoxedResultFuture = Pin> + Send>>; - -/// ParseResponseService -/// -/// Generic Parameter Listing: -/// `S`: The inner service -/// `O`: The type of the response parser whose output type is `Result` -/// `T`: The happy path return of the response parser -/// `E`: The error path return of the response parser -/// `R`: The type of the retry policy -impl - Service> - for ParseResponseService -where - InnerService: - Service, - InnerService::Future: Send + 'static, - ResponseHandler: ParseHttpResponse> - + Send - + Sync - + 'static, - FailureResponse: std::error::Error + 'static, -{ - type Response = SdkSuccess; - type Error = SdkError; - type Future = BoxedResultFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx).map_err(|err| err.into()) - } - - fn call(&mut self, req: Operation) -> Self::Future { - let (req, parts) = req.into_request_response(); - let handler = parts.response_handler; - let resp = self.inner.call(req); - Box::pin(async move { - match resp.await { - Err(e) => Err(e.into()), - Ok(resp) => { - load_response(resp, &handler) - // load_response contains reading the body as far as is required & parsing the response - .instrument(debug_span!("load_response")) - .await - } - } - }) - } -} diff --git a/rust-runtime/aws-smithy-http/src/endpoint.rs b/rust-runtime/aws-smithy-http/src/endpoint.rs index 3a4939434e5..84962397878 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint.rs @@ -16,7 +16,6 @@ use std::str::FromStr; use std::sync::Arc; pub mod error; -pub mod middleware; pub use error::ResolveEndpointError; diff --git a/rust-runtime/aws-smithy-http/src/endpoint/middleware.rs b/rust-runtime/aws-smithy-http/src/endpoint/middleware.rs deleted file mode 100644 index 1fbb099b117..00000000000 --- a/rust-runtime/aws-smithy-http/src/endpoint/middleware.rs +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! [`MapRequest`]-based middleware for resolving and applying a request's endpoint. - -use crate::endpoint; -use crate::endpoint::{apply_endpoint, EndpointPrefix, ResolveEndpointError}; -use crate::middleware::MapRequest; -use crate::operation::Request; -use http::header::HeaderName; -use http::{HeaderValue, Uri}; -use std::str::FromStr; - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module - -/// Middleware to apply an HTTP endpoint to the request -/// -/// This middleware reads [`aws_smithy_types::endpoint::Endpoint`] out of the request properties and applies -/// it to the HTTP request. -#[non_exhaustive] -#[derive(Default, Debug, Clone)] -pub struct SmithyEndpointStage; -impl SmithyEndpointStage { - /// Create a new `SmithyEndpointStage`. - pub fn new() -> Self { - Self::default() - } -} - -impl MapRequest for SmithyEndpointStage { - type Error = ResolveEndpointError; - - fn name(&self) -> &'static str { - "resolve_endpoint" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut http_req, props| { - // we need to do a little dance so that this works with retries. - // the first pass through, we convert the result into just an endpoint, early returning - // the error. Put the endpoint back in the bag in case this request gets retried. - // - // the next pass through, there is no result, so in that case, we'll look for the - // endpoint directly. - // - // In an ideal world, we would do this in make_operation, but it's much easier for - // certain protocol tests if we allow requests with invalid endpoint to be constructed. - if let Some(endpoint) = props.remove::().transpose()? { - props.insert(endpoint); - }; - let endpoint = props.get::(); - let endpoint = - endpoint.ok_or_else(|| ResolveEndpointError::message("no endpoint present"))?; - - let uri: Uri = endpoint.url().parse().map_err(|err| { - ResolveEndpointError::from_source("endpoint did not have a valid uri", err) - })?; - apply_endpoint(http_req.uri_mut(), &uri, props.get::()).map_err( - |err| { - ResolveEndpointError::message(format!( - "failed to apply endpoint `{:?}` to request `{:?}`", - uri, http_req - )) - .with_source(Some(err.into())) - }, - )?; - for (header_name, header_values) in endpoint.headers() { - http_req.headers_mut().remove(header_name); - for value in header_values { - http_req.headers_mut().insert( - HeaderName::from_str(header_name).map_err(|err| { - ResolveEndpointError::message("invalid header name") - .with_source(Some(err.into())) - })?, - HeaderValue::from_str(value).map_err(|err| { - ResolveEndpointError::message("invalid header value") - .with_source(Some(err.into())) - })?, - ); - } - } - Ok(http_req) - }) - } -} diff --git a/rust-runtime/aws-smithy-http/src/http.rs b/rust-runtime/aws-smithy-http/src/http.rs index ad77e951c3f..2a988f00f2b 100644 --- a/rust-runtime/aws-smithy-http/src/http.rs +++ b/rust-runtime/aws-smithy-http/src/http.rs @@ -27,13 +27,3 @@ impl HttpHeaders for http::Response { self.headers_mut() } } - -impl HttpHeaders for crate::operation::Response { - fn http_headers(&self) -> &HeaderMap { - self.http().http_headers() - } - - fn http_headers_mut(&mut self) -> &mut HeaderMap { - self.http_mut().http_headers_mut() - } -} diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index 52a259b4226..2601a8e7624 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -36,15 +36,11 @@ pub mod futures_stream_adapter; pub mod header; pub mod http; pub mod label; -pub mod middleware; pub mod operation; -pub mod property_bag; pub mod query; #[doc(hidden)] pub mod query_writer; -pub mod response; pub mod result; -pub mod retry; #[cfg(feature = "event-stream")] pub mod event_stream; diff --git a/rust-runtime/aws-smithy-http/src/middleware.rs b/rust-runtime/aws-smithy-http/src/middleware.rs deleted file mode 100644 index 3285dec8721..00000000000 --- a/rust-runtime/aws-smithy-http/src/middleware.rs +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! This modules defines the core, framework agnostic, HTTP middleware interface -//! used by the SDK -//! -//! smithy-middleware-tower provides Tower-specific middleware utilities (todo) - -use crate::body::SdkBody; -use crate::operation; -use crate::response::ParseHttpResponse; -use crate::result::{SdkError, SdkSuccess}; -use bytes::{Buf, Bytes}; -use http_body::Body; -use pin_utils::pin_mut; -use std::error::Error; -use std::future::Future; -use tracing::{debug_span, trace, Instrument}; - -type BoxError = Box; - -const LOG_SENSITIVE_BODIES: &str = "LOG_SENSITIVE_BODIES"; - -/// [`AsyncMapRequest`] defines an asynchronous middleware that transforms an [`operation::Request`]. -/// -/// Typically, these middleware will read configuration from the `PropertyBag` and use it to -/// augment the request. -/// -/// Most fundamental middleware is expressed as `AsyncMapRequest`'s synchronous cousin, `MapRequest`, -/// including signing & endpoint resolution. `AsyncMapRequest` is used for async credential -/// retrieval (e.g., from AWS STS's AssumeRole operation). -pub trait AsyncMapRequest { - /// The type returned when this [`AsyncMapRequest`] encounters an error. - type Error: Into + 'static; - /// The type returned when [`AsyncMapRequest::apply`] is called. - type Future: Future> + Send + 'static; - - /// Returns the name of this map request operation for inclusion in a tracing span. - fn name(&self) -> &'static str; - - /// Call this middleware, returning a future that resolves to a request or an error. - fn apply(&self, request: operation::Request) -> Self::Future; -} - -/// [`MapRequest`] defines a synchronous middleware that transforms an [`operation::Request`]. -/// -/// Typically, these middleware will read configuration from the `PropertyBag` and use it to -/// augment the request. Most fundamental middleware is expressed as `MapRequest`, including -/// signing & endpoint resolution. -/// -/// ## Examples -/// -/// ```rust -/// # use aws_smithy_http::middleware::MapRequest; -/// # use std::convert::Infallible; -/// # use aws_smithy_http::operation; -/// use http::header::{HeaderName, HeaderValue}; -/// -/// /// Signaling struct added to the request property bag if a header should be added -/// struct NeedsHeader; -/// -/// struct AddHeader(HeaderName, HeaderValue); -/// -/// impl MapRequest for AddHeader { -/// type Error = Infallible; -/// -/// fn name(&self) -> &'static str { -/// "add_header" -/// } -/// -/// fn apply(&self, request: operation::Request) -> Result { -/// request.augment(|mut request, properties| { -/// if properties.get::().is_some() { -/// request.headers_mut().append(self.0.clone(), self.1.clone()); -/// } -/// Ok(request) -/// }) -/// } -/// } -/// ``` -pub trait MapRequest { - /// The Error type returned by this operation. - /// - /// If this middleware never fails use [std::convert::Infallible] or similar. - type Error: Into; - - /// Returns the name of this map request operation for inclusion in a tracing span. - fn name(&self) -> &'static str; - - /// Apply this middleware to a request. - /// - /// Typically, implementations will use [`request.augment`](crate::operation::Request::augment) - /// to be able to transform an owned `http::Request`. - fn apply(&self, request: operation::Request) -> Result; -} - -/// Load a response using `handler` to parse the results. -/// -/// This function is intended to be used on the response side of a middleware chain. -/// -/// Success and failure will be split and mapped into `SdkSuccess` and `SdkError`. -/// Generic Parameters: -/// - `O`: The Http response handler that returns `Result` -/// - `T`/`E`: `Result` returned by `handler`. -pub async fn load_response( - mut response: operation::Response, - handler: &O, -) -> Result, SdkError> -where - O: ParseHttpResponse>, -{ - if let Some(parsed_response) = - debug_span!("parse_unloaded").in_scope(|| handler.parse_unloaded(&mut response)) - { - trace!(response = ?response, "read HTTP headers for streaming response"); - return sdk_result(parsed_response, response); - } - - let (http_response, properties) = response.into_parts(); - let (parts, body) = http_response.into_parts(); - let body = match read_body(body).instrument(debug_span!("read_body")).await { - Ok(body) => body, - Err(err) => { - return Err(SdkError::response_error( - err, - operation::Response::from_parts( - http::Response::from_parts(parts, SdkBody::taken()), - properties, - ), - )); - } - }; - - let http_response = http::Response::from_parts(parts, Bytes::from(body)); - if !handler.sensitive() - || std::env::var(LOG_SENSITIVE_BODIES) - .map(|v| v.eq_ignore_ascii_case("true")) - .unwrap_or_default() - { - trace!(http_response = ?http_response, "read HTTP response body"); - } else { - trace!(http_response = "** REDACTED **. To print, set LOG_SENSITIVE_BODIES=true") - } - debug_span!("parse_loaded").in_scope(move || { - let parsed = handler.parse_loaded(&http_response); - sdk_result( - parsed, - operation::Response::from_parts(http_response.map(SdkBody::from), properties), - ) - }) -} - -async fn read_body(body: B) -> Result, B::Error> { - let mut output = Vec::new(); - pin_mut!(body); - while let Some(buf) = body.data().await { - let mut buf = buf?; - while buf.has_remaining() { - output.extend_from_slice(buf.chunk()); - buf.advance(buf.chunk().len()) - } - } - Ok(output) -} - -/// Convert a `Result` into an `SdkResult` that includes the operation response -fn sdk_result( - parsed: Result, - raw: operation::Response, -) -> Result, SdkError> { - match parsed { - Ok(parsed) => Ok(SdkSuccess { raw, parsed }), - Err(err) => Err(SdkError::service_error(err, raw)), - } -} diff --git a/rust-runtime/aws-smithy-http/src/operation.rs b/rust-runtime/aws-smithy-http/src/operation.rs index 2ddbd280704..d31997c85ea 100644 --- a/rust-runtime/aws-smithy-http/src/operation.rs +++ b/rust-runtime/aws-smithy-http/src/operation.rs @@ -6,16 +6,12 @@ //! Types for representing the interaction between a service an a client, referred to as an "operation" in smithy. //! Clients "send" operations to services, which are composed of 1 or more HTTP requests. -use crate::body::SdkBody; -use crate::property_bag::{PropertyBag, SharedPropertyBag}; -use crate::retry::DefaultResponseRetryClassifier; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::borrow::Cow; -use std::ops::{Deref, DerefMut}; pub mod error; -/// Metadata attached to an [`Operation`] that identifies the API being called. +/// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called. #[derive(Clone, Debug)] pub struct Metadata { operation: Cow<'static, str>, @@ -48,309 +44,3 @@ impl Metadata { impl Storable for Metadata { type Storer = StoreReplace; } - -/// Non-request parts of an [`Operation`]. -/// -/// Generics: -/// - `H`: Response handler -/// - `R`: Implementation of `ClassifyRetry` -#[non_exhaustive] -#[derive(Clone, Debug)] -pub struct Parts { - /// The response deserializer that will convert the connector's response into an `operation::Response` - pub response_handler: H, - /// The classifier that will determine if an HTTP response indicates that a request failed for a retryable reason. - pub retry_classifier: R, - /// Metadata describing this operation and the service it relates to. - pub metadata: Option, -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete `operation::Operation` when cleaning up middleware -/// An [`Operation`] is a request paired with a response handler, retry classifier, -/// and metadata that identifies the API being called. -/// -/// Generics: -/// - `H`: Response handler -/// - `R`: Implementation of `ClassifyRetry` -#[derive(Debug)] -pub struct Operation { - request: Request, - parts: Parts, -} - -impl Operation { - /// Converts this operation into its parts. - pub fn into_request_response(self) -> (Request, Parts) { - (self.request, self.parts) - } - - /// Constructs an [`Operation`] from a request and [`Parts`] - pub fn from_parts(request: Request, parts: Parts) -> Self { - Self { request, parts } - } - - /// Returns a mutable reference to the request's property bag. - pub fn properties_mut(&mut self) -> impl DerefMut + '_ { - self.request.properties_mut() - } - - /// Returns an immutable reference to the request's property bag. - pub fn properties(&self) -> impl Deref + '_ { - self.request.properties() - } - - /// Gives mutable access to the underlying HTTP request. - pub fn request_mut(&mut self) -> &mut http::Request { - self.request.http_mut() - } - - /// Gives readonly access to the underlying HTTP request. - pub fn request(&self) -> &http::Request { - self.request.http() - } - - /// Attaches metadata to the operation. - pub fn with_metadata(mut self, metadata: Metadata) -> Self { - self.parts.metadata = Some(metadata); - self - } - - /// Replaces the retry classifier on the operation. - pub fn with_retry_classifier(self, retry_classifier: R2) -> Operation { - Operation { - request: self.request, - parts: Parts { - response_handler: self.parts.response_handler, - retry_classifier, - metadata: self.parts.metadata, - }, - } - } - - /// Returns the retry classifier for this operation. - pub fn retry_classifier(&self) -> &R { - &self.parts.retry_classifier - } - - /// Attempts to clone the operation. - /// - /// Will return `None` if the request body is already consumed and can't be replayed. - pub fn try_clone(&self) -> Option - where - H: Clone, - R: Clone, - { - let request = self.request.try_clone()?; - Some(Self { - request, - parts: self.parts.clone(), - }) - } -} - -impl Operation { - /// Creates a new [`Operation`]. - pub fn new( - request: Request, - response_handler: H, - ) -> Operation { - Operation { - request, - parts: Parts { - response_handler, - retry_classifier: DefaultResponseRetryClassifier::new(), - metadata: None, - }, - } - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete `operation::Request` when cleaning up middleware -/// Operation request type that associates a property bag with an underlying HTTP request. -/// This type represents the request in the Tower `Service` in middleware so that middleware -/// can share information with each other via the properties. -#[derive(Debug)] -pub struct Request { - /// The underlying HTTP Request - inner: http::Request, - - /// Property bag of configuration options - /// - /// Middleware can read and write from the property bag and use its - /// contents to augment the request (see [`Request::augment`](Request::augment)) - properties: SharedPropertyBag, -} - -impl Request { - /// Creates a new operation `Request` with the given `inner` HTTP request. - pub fn new(inner: http::Request) -> Self { - Request { - inner, - properties: SharedPropertyBag::new(), - } - } - - /// Creates a new operation `Request` from its parts. - pub fn from_parts(inner: http::Request, properties: SharedPropertyBag) -> Self { - Request { inner, properties } - } - - /// Allows modification of the HTTP request and associated properties with a fallible closure. - pub fn augment( - self, - f: impl FnOnce(http::Request, &mut PropertyBag) -> Result, T>, - ) -> Result { - let inner = { - let properties: &mut PropertyBag = &mut self.properties.acquire_mut(); - f(self.inner, properties)? - }; - Ok(Request { - inner, - properties: self.properties, - }) - } - - /// Gives mutable access to the properties. - pub fn properties_mut(&mut self) -> impl DerefMut + '_ { - self.properties.acquire_mut() - } - - /// Gives readonly access to the properties. - pub fn properties(&self) -> impl Deref + '_ { - self.properties.acquire() - } - - /// Gives mutable access to the underlying HTTP request. - pub fn http_mut(&mut self) -> &mut http::Request { - &mut self.inner - } - - /// Gives readonly access to the underlying HTTP request. - pub fn http(&self) -> &http::Request { - &self.inner - } - - /// Attempts to clone the operation `Request`. This can fail if the - /// request body can't be cloned, such as if it is being streamed and the - /// stream can't be recreated. - pub fn try_clone(&self) -> Option { - let cloned_body = self.inner.body().try_clone()?; - let mut cloned_request = http::Request::builder() - .uri(self.inner.uri().clone()) - .method(self.inner.method()); - *cloned_request - .headers_mut() - .expect("builder has not been modified, headers must be valid") = - self.inner.headers().clone(); - let inner = cloned_request - .body(cloned_body) - .expect("a clone of a valid request should be a valid request"); - Some(Request { - inner, - properties: self.properties.clone(), - }) - } - - /// Consumes the operation `Request` and returns the underlying HTTP request and properties. - pub fn into_parts(self) -> (http::Request, SharedPropertyBag) { - (self.inner, self.properties) - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete `operation::Response` when cleaning up middleware -/// Operation response type that associates a property bag with an underlying HTTP response. -/// This type represents the response in the Tower `Service` in middleware so that middleware -/// can share information with each other via the properties. -#[derive(Debug)] -pub struct Response { - /// The underlying HTTP Response - inner: http::Response, - - /// Property bag of configuration options - properties: SharedPropertyBag, -} - -impl Response { - /// Creates a new operation `Response` with the given `inner` HTTP response. - pub fn new(inner: http::Response) -> Self { - Response { - inner, - properties: SharedPropertyBag::new(), - } - } - - /// Gives mutable access to the properties. - pub fn properties_mut(&mut self) -> impl DerefMut + '_ { - self.properties.acquire_mut() - } - - /// Gives readonly access to the properties. - pub fn properties(&self) -> impl Deref + '_ { - self.properties.acquire() - } - - /// Gives mutable access to the underlying HTTP response. - pub fn http_mut(&mut self) -> &mut http::Response { - &mut self.inner - } - - /// Gives readonly access to the underlying HTTP response. - pub fn http(&self) -> &http::Response { - &self.inner - } - - /// Consumes the operation `Request` and returns the underlying HTTP response and properties. - pub fn into_parts(self) -> (http::Response, SharedPropertyBag) { - (self.inner, self.properties) - } - - /// Return mutable references to the response and property bag contained within this `operation::Response` - pub fn parts_mut( - &mut self, - ) -> ( - &mut http::Response, - impl DerefMut + '_, - ) { - (&mut self.inner, self.properties.acquire_mut()) - } - - /// Creates a new operation `Response` from an HTTP response and property bag. - pub fn from_parts(inner: http::Response, properties: SharedPropertyBag) -> Self { - Response { inner, properties } - } -} - -#[cfg(test)] -mod test { - use crate::body::SdkBody; - use crate::operation::Request; - use http::header::{AUTHORIZATION, CONTENT_LENGTH}; - use http::Uri; - - #[test] - fn try_clone_clones_all_data() { - let mut request = Request::new( - http::Request::builder() - .uri(Uri::from_static("http://www.amazon.com")) - .method("POST") - .header(CONTENT_LENGTH, 456) - .header(AUTHORIZATION, "Token: hello") - .body(SdkBody::from("hello world!")) - .expect("valid request"), - ); - request.properties_mut().insert("hello"); - let cloned = request.try_clone().expect("request is cloneable"); - - let (request, config) = cloned.into_parts(); - assert_eq!(request.uri(), &Uri::from_static("http://www.amazon.com")); - assert_eq!(request.method(), "POST"); - assert_eq!(request.headers().len(), 2); - assert_eq!( - request.headers().get(AUTHORIZATION).unwrap(), - "Token: hello" - ); - assert_eq!(request.headers().get(CONTENT_LENGTH).unwrap(), "456"); - assert_eq!(request.body().bytes().unwrap(), "hello world!".as_bytes()); - assert_eq!(config.acquire().get::<&str>(), Some(&"hello")); - } -} diff --git a/rust-runtime/aws-smithy-http/src/property_bag.rs b/rust-runtime/aws-smithy-http/src/property_bag.rs deleted file mode 100644 index 1ac6adc989f..00000000000 --- a/rust-runtime/aws-smithy-http/src/property_bag.rs +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! A typemap used to store configuration for smithy operations. -//! -//! This code is functionally equivalent to `Extensions` in the `http` crate. Examples -//! have been updated to be more relevant for smithy use, the interface has been made public, -//! and the doc comments have been updated to reflect how the property bag is used in the SDK. -//! Additionally, optimizations around the HTTP use case have been removed in favor or simpler code. - -use std::any::{Any, TypeId}; -use std::collections::HashMap; -use std::fmt; -use std::fmt::{Debug, Formatter}; -use std::hash::{BuildHasherDefault, Hasher}; -use std::ops::{Deref, DerefMut}; -use std::sync::{Arc, Mutex}; - -type AnyMap = HashMap>; - -struct NamedType { - name: &'static str, - value: Box, -} - -impl NamedType { - fn as_mut(&mut self) -> Option<&mut T> { - self.value.downcast_mut() - } - - fn as_ref(&self) -> Option<&T> { - self.value.downcast_ref() - } - - fn assume(self) -> Option { - self.value.downcast().map(|t| *t).ok() - } - - fn new(value: T) -> Self { - Self { - name: std::any::type_name::(), - value: Box::new(value), - } - } -} - -// With TypeIds as keys, there's no need to hash them. They are already hashes -// themselves, coming from the compiler. The IdHasher just holds the u64 of -// the TypeId, and then returns it, instead of doing any bit fiddling. -#[derive(Default)] -struct IdHasher(u64); - -impl Hasher for IdHasher { - #[inline] - fn finish(&self) -> u64 { - self.0 - } - - fn write(&mut self, _: &[u8]) { - unreachable!("TypeId calls write_u64"); - } - - #[inline] - fn write_u64(&mut self, id: u64) { - self.0 = id; - } -} - -/// A type-map of configuration data. -/// -/// `PropertyBag` can be used by `Request` and `Response` to store -/// data used to configure the SDK request pipeline. -#[derive(Default)] -pub struct PropertyBag { - // In http where this property bag is usually empty, this makes sense. We will almost always put - // something in the bag, so we could consider removing the layer of indirection. - map: AnyMap, -} - -impl PropertyBag { - /// Create an empty `PropertyBag`. - #[inline] - pub fn new() -> PropertyBag { - PropertyBag { - map: AnyMap::default(), - } - } - - /// Insert a type into this `PropertyBag`. - /// - /// If a value of this type already existed, it will be returned. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// - /// #[derive(Debug, Eq, PartialEq)] - /// struct Endpoint(&'static str); - /// assert!(props.insert(Endpoint("dynamo.amazon.com")).is_none()); - /// assert_eq!( - /// props.insert(Endpoint("kinesis.amazon.com")), - /// Some(Endpoint("dynamo.amazon.com")) - /// ); - /// ``` - pub fn insert(&mut self, val: T) -> Option { - self.map - .insert(TypeId::of::(), NamedType::new(val)) - .and_then(|val| val.assume()) - } - - /// Get a reference to a type previously inserted on this `PropertyBag`. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// assert!(props.get::().is_none()); - /// props.insert(5i32); - /// - /// assert_eq!(props.get::(), Some(&5i32)); - /// ``` - pub fn get(&self) -> Option<&T> { - self.map - .get(&TypeId::of::()) - .and_then(|val| val.as_ref()) - } - - /// Returns an iterator of the types contained in this PropertyBag - /// - /// # Stability - /// This method is unstable and may be removed or changed in a future release. The exact - /// format of the returned types may also change. - pub fn contents(&self) -> impl Iterator + '_ { - self.map.values().map(|tpe| tpe.name) - } - - /// Get a mutable reference to a type previously inserted on this `PropertyBag`. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// props.insert(String::from("Hello")); - /// props.get_mut::().unwrap().push_str(" World"); - /// - /// assert_eq!(props.get::().unwrap(), "Hello World"); - /// ``` - pub fn get_mut(&mut self) -> Option<&mut T> { - self.map - .get_mut(&TypeId::of::()) - .map(|val| val.as_mut().expect("type mismatch!")) - } - - /// Remove a type from this `PropertyBag`. - /// - /// If a value of this type existed, it will be returned. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// props.insert(5i32); - /// assert_eq!(props.remove::(), Some(5i32)); - /// assert!(props.get::().is_none()); - /// ``` - pub fn remove(&mut self) -> Option { - self.map.remove(&TypeId::of::()).and_then(|tpe| { - (tpe.value as Box) - .downcast() - .ok() - .map(|boxed| *boxed) - }) - } - - /// Clear the `PropertyBag` of all inserted extensions. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// props.insert(5i32); - /// props.clear(); - /// - /// assert!(props.get::().is_none()); - #[inline] - pub fn clear(&mut self) { - self.map.clear(); - } -} - -impl fmt::Debug for PropertyBag { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut fmt = f.debug_struct("PropertyBag"); - - struct Contents<'a>(&'a PropertyBag); - impl<'a> Debug for Contents<'a> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.0.contents()).finish() - } - } - fmt.field("contents", &Contents(self)); - fmt.finish() - } -} - -/// A wrapper of [`PropertyBag`] that can be safely shared across threads and cheaply cloned. -/// -/// To access properties, use either `acquire` or `acquire_mut`. This can be one line for -/// single property accesses, for example: -/// ```rust -/// # use aws_smithy_http::property_bag::SharedPropertyBag; -/// # let properties = SharedPropertyBag::new(); -/// let my_string = properties.acquire().get::(); -/// ``` -/// -/// For multiple accesses, the acquire result should be stored as a local since calling -/// acquire repeatedly will be slower than calling it once: -/// ```rust -/// # use aws_smithy_http::property_bag::SharedPropertyBag; -/// # let properties = SharedPropertyBag::new(); -/// let props = properties.acquire(); -/// let my_string = props.get::(); -/// let my_vec = props.get::>(); -/// ``` -/// -/// Use `acquire_mut` to insert properties into the bag: -/// ```rust -/// # use aws_smithy_http::property_bag::SharedPropertyBag; -/// # let properties = SharedPropertyBag::new(); -/// properties.acquire_mut().insert("example".to_string()); -/// ``` -#[derive(Clone, Debug, Default)] -pub struct SharedPropertyBag(Arc>); - -impl SharedPropertyBag { - /// Create an empty `SharedPropertyBag`. - pub fn new() -> Self { - SharedPropertyBag(Arc::new(Mutex::new(PropertyBag::new()))) - } - - /// Acquire an immutable reference to the property bag. - pub fn acquire(&self) -> impl Deref + '_ { - self.0.lock().unwrap() - } - - /// Acquire a mutable reference to the property bag. - pub fn acquire_mut(&self) -> impl DerefMut + '_ { - self.0.lock().unwrap() - } -} - -impl From for SharedPropertyBag { - fn from(bag: PropertyBag) -> Self { - SharedPropertyBag(Arc::new(Mutex::new(bag))) - } -} - -#[cfg(test)] -mod test { - use crate::property_bag::PropertyBag; - - #[test] - fn test_extensions() { - #[derive(Debug, PartialEq)] - struct MyType(i32); - - let mut property_bag = PropertyBag::new(); - - property_bag.insert(5i32); - property_bag.insert(MyType(10)); - - assert_eq!(property_bag.get(), Some(&5i32)); - assert_eq!(property_bag.get_mut(), Some(&mut 5i32)); - - assert_eq!(property_bag.remove::(), Some(5i32)); - assert!(property_bag.get::().is_none()); - - assert_eq!(property_bag.get::(), None); - assert_eq!(property_bag.get(), Some(&MyType(10))); - assert_eq!( - format!("{:?}", property_bag), - r#"PropertyBag { contents: ["aws_smithy_http::property_bag::test::test_extensions::MyType"] }"# - ); - } -} diff --git a/rust-runtime/aws-smithy-http/src/response.rs b/rust-runtime/aws-smithy-http/src/response.rs deleted file mode 100644 index 7ba039f4198..00000000000 --- a/rust-runtime/aws-smithy-http/src/response.rs +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types for response parsing. - -use crate::operation; -use bytes::Bytes; - -/// `ParseHttpResponse` is a generic trait for parsing structured data from HTTP responses. -/// -/// It is designed to be nearly infinitely flexible, because `Output` is unconstrained, it can be used to support -/// event streams, S3 streaming responses, regular request-response style operations, as well -/// as any other HTTP-based protocol that we manage to come up with. -/// -/// The split between `parse_unloaded` and `parse_loaded` enables keeping the parsing code pure and sync -/// whenever possible and delegating the process of actually reading the HTTP response to the caller when -/// the required behavior is simply "read to the end." -/// -/// It also enables this critical and core trait to avoid being async, and it makes code that uses -/// the trait easier to test. -pub trait ParseHttpResponse { - /// Output type of the HttpResponse. - /// - /// For request/response style operations, this is typically something like: - /// `Result` - /// - /// For streaming operations, this is something like: - /// `Result, TranscribeStreamingError>` - type Output; - - /// Parse an HTTP request without reading the body. If the body must be provided to proceed, - /// return `None` - /// - /// This exists to serve APIs like S3::GetObject where the body is passed directly into the - /// response and consumed by the client. However, even in the case of S3::GetObject, errors - /// require reading the entire body. - /// - /// This also facilitates `EventStream` and other streaming HTTP protocols by enabling the - /// handler to take ownership of the HTTP response directly. - /// - /// Currently `parse_unloaded` operates on a borrowed HTTP request to enable - /// the caller to provide a raw HTTP response to the caller for inspection after the response is - /// returned. For EventStream-like use cases, the caller can use `mem::swap` to replace - /// the streaming body with an empty body as long as the body implements default. - /// - /// We should consider if this is too limiting & if this should take an owned response instead. - fn parse_unloaded(&self, response: &mut operation::Response) -> Option; - - /// Parse an HTTP request from a fully loaded body. This is for standard request/response style - /// APIs like AwsJson 1.0/1.1 and the error path of most streaming APIs - /// - /// Using an explicit body type of Bytes here is a conscious decision—If you _really_ need - /// to precisely control how the data is loaded into memory (e.g. by using `bytes::Buf`), implement - /// your handler in `parse_unloaded`. - /// - /// Production code will never call `parse_loaded` without first calling `parse_unloaded`. However, - /// in tests it may be easier to use `parse_loaded` directly. It is OK to panic in `parse_loaded` - /// if `parse_unloaded` will never return `None`, however, it may make your code easier to test if an - /// implementation is provided. - fn parse_loaded(&self, response: &http::Response) -> Self::Output; - - /// Returns whether the contents of this response are sensitive - /// - /// When this is set to true, wire logging will be disabled - fn sensitive(&self) -> bool { - false - } -} - -/// Convenience Trait for non-streaming APIs -/// -/// `ParseStrictResponse` enables operations that _never_ need to stream the body incrementally to -/// have cleaner implementations. There is a blanket implementation -pub trait ParseStrictResponse { - /// The type returned by this parser. - type Output; - - /// Parse an [`http::Response`] into `Self::Output`. - fn parse(&self, response: &http::Response) -> Self::Output; - - /// Returns whether the contents of this response are sensitive - /// - /// When this is set to true, wire logging will be disabled - fn sensitive(&self) -> bool { - false - } -} - -impl ParseHttpResponse for T { - type Output = T::Output; - - fn parse_unloaded(&self, _response: &mut operation::Response) -> Option { - None - } - - fn parse_loaded(&self, response: &http::Response) -> Self::Output { - self.parse(response) - } - - fn sensitive(&self) -> bool { - ParseStrictResponse::sensitive(self) - } -} - -#[cfg(test)] -mod test { - use crate::body::SdkBody; - use crate::operation; - use crate::response::ParseHttpResponse; - use bytes::Bytes; - use std::mem; - - #[test] - fn supports_streaming_body() { - struct S3GetObject { - _body: SdkBody, - } - - struct S3GetObjectParser; - - impl ParseHttpResponse for S3GetObjectParser { - type Output = S3GetObject; - - fn parse_unloaded(&self, response: &mut operation::Response) -> Option { - // For responses that pass on the body, use mem::take to leave behind an empty body - let body = mem::replace(response.http_mut().body_mut(), SdkBody::taken()); - Some(S3GetObject { _body: body }) - } - - fn parse_loaded(&self, _response: &http::Response) -> Self::Output { - unimplemented!() - } - } - } -} diff --git a/rust-runtime/aws-smithy-http/src/result.rs b/rust-runtime/aws-smithy-http/src/result.rs index c86e9c5f88a..03119ef64f6 100644 --- a/rust-runtime/aws-smithy-http/src/result.rs +++ b/rust-runtime/aws-smithy-http/src/result.rs @@ -3,31 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! `Result` wrapper types for [success](SdkSuccess) and [failure](SdkError) responses. - -use std::error::Error; -use std::fmt; -use std::fmt::{Debug, Display, Formatter}; +//! Types for [error](SdkError) responses. +use crate::body::SdkBody; +use crate::connection::ConnectionMetadata; use aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA}; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::ErrorKind; - -use crate::connection::ConnectionMetadata; -use crate::operation; +use std::error::Error; +use std::fmt; +use std::fmt::{Debug, Display, Formatter}; type BoxError = Box; -/// Successful SDK Result -#[derive(Debug)] -pub struct SdkSuccess { - /// Raw Response from the service. (e.g. Http Response) - pub raw: operation::Response, - - /// Parsed response from the service - pub parsed: O, -} - /// Builders for `SdkError` variant context. pub mod builders { use super::*; @@ -329,7 +317,7 @@ pub trait CreateUnhandledError { /// [`Error::source`](std::error::Error::source) for more details about the underlying cause. #[non_exhaustive] #[derive(Debug)] -pub enum SdkError { +pub enum SdkError> { /// The request failed during construction. It was not dispatched over the network. ConstructionFailure(ConstructionFailure), diff --git a/rust-runtime/aws-smithy-http/src/retry.rs b/rust-runtime/aws-smithy-http/src/retry.rs deleted file mode 100644 index eaf7d0e0933..00000000000 --- a/rust-runtime/aws-smithy-http/src/retry.rs +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP specific retry behaviors -//! -//! For protocol agnostic retries, see `aws_smithy_types::Retry`. - -use crate::operation::Response; -use crate::result::SdkError; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; - -/// Classifies what kind of retry is needed for a given `response`. -pub trait ClassifyRetry: Clone { - /// Run this classifier against a response to determine if it should be retried. - fn classify_retry(&self, response: Result<&T, &E>) -> RetryKind; -} - -const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; - -/// The default implementation of [`ClassifyRetry`] for generated clients. -#[derive(Clone, Debug, Default)] -pub struct DefaultResponseRetryClassifier; - -impl DefaultResponseRetryClassifier { - /// Creates a new `DefaultResponseRetryClassifier` - pub fn new() -> Self { - Default::default() - } - - /// Matches on the given `result` and, if possible, returns the underlying cause and the operation response - /// that can be used for further classification logic. Otherwise, it returns a `RetryKind` that should be used - /// for the result. - // - // IMPORTANT: This function is used by the AWS SDK in `aws-http` for the SDK's own response classification logic - #[doc(hidden)] - pub fn try_extract_err_response<'a, T, E>( - result: Result<&T, &'a SdkError>, - ) -> Result<(&'a E, &'a Response), RetryKind> { - match result { - Ok(_) => Err(RetryKind::Unnecessary), - Err(SdkError::ServiceError(context)) => Ok((context.err(), context.raw())), - Err(SdkError::TimeoutError(_err)) => Err(RetryKind::Error(ErrorKind::TransientError)), - Err(SdkError::DispatchFailure(err)) => { - if err.is_timeout() || err.is_io() { - Err(RetryKind::Error(ErrorKind::TransientError)) - } else if let Some(ek) = err.as_other() { - Err(RetryKind::Error(ek)) - } else { - Err(RetryKind::UnretryableFailure) - } - } - Err(SdkError::ResponseError { .. }) => Err(RetryKind::Error(ErrorKind::TransientError)), - Err(SdkError::ConstructionFailure(_)) => Err(RetryKind::UnretryableFailure), - } - } -} - -impl ClassifyRetry> for DefaultResponseRetryClassifier -where - E: ProvideErrorKind, -{ - fn classify_retry(&self, result: Result<&T, &SdkError>) -> RetryKind { - let (err, response) = match Self::try_extract_err_response(result) { - Ok(extracted) => extracted, - Err(retry_kind) => return retry_kind, - }; - if let Some(kind) = err.retryable_error_kind() { - return RetryKind::Error(kind); - }; - if TRANSIENT_ERROR_STATUS_CODES.contains(&response.http().status().as_u16()) { - return RetryKind::Error(ErrorKind::TransientError); - }; - RetryKind::UnretryableFailure - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::body::SdkBody; - use crate::operation; - use crate::result::{SdkError, SdkSuccess}; - use crate::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; - use std::fmt; - - #[derive(Debug)] - struct UnmodeledError; - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - impl std::error::Error for UnmodeledError {} - - struct CodedError { - code: &'static str, - } - - impl ProvideErrorKind for UnmodeledError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - None - } - } - - impl ProvideErrorKind for CodedError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - Some(self.code) - } - } - - fn make_err( - err: E, - raw: http::Response<&'static str>, - ) -> Result, SdkError> { - Err(SdkError::service_error( - err, - operation::Response::new(raw.map(SdkBody::from)), - )) - } - - #[test] - fn not_an_error() { - let policy = DefaultResponseRetryClassifier::new(); - let test_response = http::Response::new("OK"); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_response).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_response_status() { - let policy = DefaultResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(500) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn classify_by_response_status_not_retryable() { - let policy = DefaultResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(408) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_error_kind() { - struct ModeledRetries; - let test_response = http::Response::new("OK"); - impl ProvideErrorKind for ModeledRetries { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ClientError) - } - - fn code(&self) -> Option<&str> { - // code should not be called when `error_kind` is provided - unimplemented!() - } - } - - let policy = DefaultResponseRetryClassifier::new(); - - assert_eq!( - policy.classify_retry(make_err(ModeledRetries, test_response).as_ref()), - RetryKind::Error(ErrorKind::ClientError) - ); - } - - #[test] - fn classify_response_error() { - let policy = DefaultResponseRetryClassifier::new(); - assert_eq!( - policy.classify_retry( - Result::, SdkError>::Err(SdkError::response_error( - UnmodeledError, - operation::Response::new(http::Response::new("OK").map(SdkBody::from)), - )) - .as_ref() - ), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn test_timeout_error() { - let policy = DefaultResponseRetryClassifier::new(); - let err: Result<(), SdkError> = Err(SdkError::timeout_error("blah")); - assert_eq!( - policy.classify_retry(err.as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index fe26f385203..d15d8230a05 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -16,7 +16,7 @@ use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryConfig}; use std::fmt; use tracing::{debug, error}; -/// A interceptor for poisoning connections in response to certain events. +/// An interceptor for poisoning connections in response to certain events. /// /// This interceptor, when paired with a compatible connection, allows the connection to be /// poisoned in reaction to certain events *(like receiving a transient error.)* This allows users @@ -25,10 +25,11 @@ use tracing::{debug, error}; /// /// **In order for this interceptor to work,** the configured connection must interact with the /// "connection retriever" stored in an HTTP request's `extensions` map. For an example of this, -/// see [aws_smithy_client::hyper_ext::Adapter](https://github.com/awslabs/smithy-rs/blob/47b3d23ff3cabd67e797af616101f5a4ea6be5e8/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L155). -/// When a connection is made available to the retriever, this interceptor will call a `.poison` -/// method on it, signalling that the connection should be dropped. It is up to the connection -/// implementer to handle this. +/// see [`HyperConnector`]. When a connection is made available to the retriever, this interceptor +/// will call a `.poison` method on it, signalling that the connection should be dropped. It is +/// up to the connection implementer to handle this. +/// +/// [`HyperConnector`]: https://github.com/awslabs/smithy-rs/blob/26a914ece072bba2dd9b5b49003204b70e7666ac/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs#L347 #[non_exhaustive] #[derive(Debug, Default)] pub struct ConnectionPoisoningInterceptor {} From 6b96c1d46ec28124cd2644a9412e54dc3c11d73c Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 9 Oct 2023 13:51:54 -0700 Subject: [PATCH 157/331] Make `customize()` sync and infallible (#3039) This PR addresses a TODO comment to make `customize()` sync and fallible. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++++++ .../rustsdk/CredentialCacheConfigTest.kt | 2 -- .../integration-tests/kms/tests/integration.rs | 4 ---- .../qldbsession/tests/integration.rs | 2 -- .../integration-tests/s3/tests/checksums.rs | 4 ---- .../s3/tests/config-override.rs | 8 -------- .../s3/tests/customizable-operation.rs | 2 -- .../integration-tests/s3/tests/endpoints.rs | 4 ---- .../s3/tests/ignore-invalid-xml-body-root.rs | 2 -- .../integration-tests/s3/tests/interceptors.rs | 4 ---- .../s3/tests/naughty-string-metadata.rs | 2 -- aws/sdk/integration-tests/s3/tests/no_auth.rs | 8 -------- .../s3/tests/normalize-uri-path.rs | 2 -- .../query-strings-are-correctly-encoded.rs | 2 -- .../integration-tests/s3/tests/signing-it.rs | 2 -- .../s3control/tests/signing-it.rs | 2 -- .../codegen/client/smithy/ClientRustModule.kt | 1 - .../generators/client/FluentClientGenerator.kt | 18 ++++-------------- .../MetadataCustomizationTest.kt | 2 -- ...ConfigOverrideRuntimePluginGeneratorTest.kt | 2 -- 20 files changed, 10 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index afe79f7a132..8c370c0ea04 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -291,3 +291,9 @@ message = "`SdkError` is no longer re-exported in generated server crates." references = ["smithy-rs#3038"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } author = "jdisanti" + +[[smithy-rs]] +message = "The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again." +references = ["smithy-rs#3039"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt index 3685c421af1..fe4e9c79d4a 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt @@ -156,8 +156,6 @@ internal class CredentialCacheConfigTest { let _ = client .say_hello() .customize() - .await - .unwrap() .config_override(operation_config_override) .send() .await diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index d550337ec54..e02e32ab525 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -73,8 +73,6 @@ async fn generate_random() { .generate_random() .number_of_bytes(64) .customize() - .await - .expect("customizable") .mutate_request(|req| { // Remove the invocation ID since the signed request above doesn't have it req.headers_mut().remove("amz-sdk-invocation-id"); @@ -157,8 +155,6 @@ async fn generate_random_keystore_not_found() { .number_of_bytes(64) .custom_key_store_id("does not exist") .customize() - .await - .expect("customizable") .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614955644)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 3c7a7424fb4..18ba8e49999 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -45,8 +45,6 @@ async fn signv4_use_correct_service_name() { .unwrap(), ) .customize() - .await - .expect("should be customizable") // Fix the request time and user agent so the headers are stable .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614952162)) .user_agent_for_tests() diff --git a/aws/sdk/integration-tests/s3/tests/checksums.rs b/aws/sdk/integration-tests/s3/tests/checksums.rs index e397ec09ae2..79b8f929000 100644 --- a/aws/sdk/integration-tests/s3/tests/checksums.rs +++ b/aws/sdk/integration-tests/s3/tests/checksums.rs @@ -74,8 +74,6 @@ async fn test_checksum_on_streaming_response( .key("test.txt") .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled) .customize() - .await - .unwrap() .user_agent_for_tests() .send() .await @@ -181,8 +179,6 @@ async fn test_checksum_on_streaming_request<'a>( .body(body) .checksum_algorithm(checksum_algorithm) .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index 44c7006888c..76598b764c2 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -27,8 +27,6 @@ async fn operation_overrides_force_path_style() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().force_path_style(true)) .send() .await; @@ -45,8 +43,6 @@ async fn operation_overrides_fips() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().use_fips(true)) .send() .await; @@ -63,8 +59,6 @@ async fn operation_overrides_dual_stack() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().use_dual_stack(true)) .send() .await; @@ -85,8 +79,6 @@ async fn operation_overrides_credentials_provider() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().credentials_provider(Credentials::new( "test", "test", diff --git a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs index 6bd55816c06..b7c7dfbf55c 100644 --- a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs +++ b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs @@ -26,8 +26,6 @@ async fn test_s3_ops_are_customizable() { let op = client .list_buckets() .customize() - .await - .expect("list_buckets is customizable") .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests(); diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index 5ac1ac7ad8a..2c31986007e 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -70,8 +70,6 @@ async fn multi_region_access_points() { .bucket("arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap") .key("blah") .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests() .send() @@ -103,8 +101,6 @@ async fn s3_object_lambda() { .bucket("arn:aws:s3-object-lambda:us-east-100:123412341234:accesspoint/myolap") .key("s3.txt") .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1234567890)) .send() .await diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index b120a34188c..25a7a34e0b8 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -56,8 +56,6 @@ async fn ignore_invalid_xml_body_root() { .key("test.txt") .object_attributes(ObjectAttributes::Checksum) .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs index 62bc29b0396..7263b6d200b 100644 --- a/aws/sdk/integration-tests/s3/tests/interceptors.rs +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -74,8 +74,6 @@ async fn interceptor_priority() { .bucket("test-bucket") .prefix("prefix~") .customize() - .await - .unwrap() .interceptor(TestInterceptor("value2")) .send() .await @@ -103,8 +101,6 @@ async fn set_test_user_agent_through_request_mutation() { .bucket("test-bucket") .prefix("prefix~") .customize() - .await - .unwrap() .mutate_request(|request| { let headers = request.headers_mut(); headers.insert(USER_AGENT, HeaderValue::try_from("test").unwrap()); diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 209fd6bcde9..422d64c899a 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -79,8 +79,6 @@ async fn test_s3_signer_with_naughty_string_metadata() { let _ = builder .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs index 670d85268cf..f7e8f477ea6 100644 --- a/aws/sdk/integration-tests/s3/tests/no_auth.rs +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -25,8 +25,6 @@ async fn list_objects() { .bucket("gdc-organoid-pancreatic-phs001611-2-open") .max_keys(3) .customize() - .await - .unwrap() .remove_invocation_id_for_tests() .user_agent_for_tests() .send() @@ -58,8 +56,6 @@ async fn list_objects_v2() { .bucket("gdc-organoid-pancreatic-phs001611-2-open") .max_keys(3) .customize() - .await - .unwrap() .remove_invocation_id_for_tests() .user_agent_for_tests() .send() @@ -90,8 +86,6 @@ async fn head_object() { .bucket("gdc-organoid-pancreatic-phs001611-2-open") .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") .customize() - .await - .unwrap() .remove_invocation_id_for_tests() .user_agent_for_tests() .send() @@ -122,8 +116,6 @@ async fn get_object() { .bucket("gdc-organoid-pancreatic-phs001611-2-open") .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") .customize() - .await - .unwrap() .remove_invocation_id_for_tests() .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index e91af82846e..ae8426d16ca 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -31,8 +31,6 @@ async fn test_operation_should_not_normalize_uri_path() { .key("a/.././b.txt") // object key with dot segments .body(ByteStream::from_static("Hello, world".as_bytes())) .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1669257290)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 67557f6e057..9f688fe69b7 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -33,8 +33,6 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { .bucket("test-bucket") .prefix(&prefix) .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index d739bec6c14..1b3e59e3735 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -34,8 +34,6 @@ async fn test_signer() { .bucket("test-bucket") .prefix("prefix~") .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) .user_agent_for_tests() .send() diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index 7a1a585d1c0..b94e3971707 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -37,8 +37,6 @@ async fn test_signer() { .list_access_points() .account_id("test-bucket") .customize() - .await - .unwrap() .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1636751225)) .user_agent_for_tests() .remove_invocation_id_for_tests() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt index 284ed53563b..7c882a3f4b3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt @@ -149,7 +149,6 @@ class ClientModuleDocProvider( let result = client.$opFnName() .customize() - .await? .mutate_request(|req| { // Add `x-example-header` with value req.headers_mut() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 4a9c1626962..c1d9dbae028 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -371,21 +371,11 @@ class FluentClientGenerator( #{Operation}::orchestrate(&runtime_plugins, input).await } - /// Consumes this builder, creating a customizable operation that can be modified before being - /// sent. - // TODO(enableNewSmithyRuntimeCleanup): Remove `async` and `Result` once we switch to orchestrator - pub async fn customize( + /// Consumes this builder, creating a customizable operation that can be modified before being sent. + pub fn customize( self, - ) -> #{Result}< - #{CustomizableOperation}< - #{OperationOutput}, - #{OperationError}, - Self, - >, - #{SdkError}<#{OperationError}>, - > - { - #{Ok}(#{CustomizableOperation}::new(self)) + ) -> #{CustomizableOperation}<#{OperationOutput}, #{OperationError}, Self> { + #{CustomizableOperation}::new(self) } """, *orchestratorScope, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 9010b946594..e959dd333a1 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -90,8 +90,6 @@ class MetadataCustomizationTest { let _ = client .say_hello() .customize() - .await - .expect("operation should be customizable") .interceptor(ExtractMetadataInterceptor(::std::sync::Mutex::new(#{Some}(tx)))) .send() .await; diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index e7a4ed760f3..6772f463af2 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -118,8 +118,6 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { let customizable_send = client .say_hello() .customize() - .await - .unwrap() .config_override(crate::config::Config::builder().http_client(http_client)) .send(); From 7b30ffcbf41f6fd251fe038c9239a925824f5ac1 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 10 Oct 2023 09:03:22 -0400 Subject: [PATCH 158/331] HTTP Wrapper Type RFC & Implementation (#2912) ## Motivation and Context Implementation of the HTTP request wrapper type from RFC ## Description RFC + implementation of HttpRequest ## Testing - IT/UT - Separate PR which uses this type in implementation of the SDK ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- .github/workflows/github-pages.yml | 2 +- design/src/SUMMARY.md | 1 + design/src/rfcs/overview.md | 4 + design/src/rfcs/rfc0037_http_wrapper.md | 111 +++ .../aws-smithy-runtime-api/Cargo.toml | 2 +- .../aws-smithy-runtime-api/src/client/http.rs | 3 + .../src/client/http/request.rs | 651 ++++++++++++++++++ .../src/client/http/response.rs | 6 + 8 files changed, 778 insertions(+), 2 deletions(-) create mode 100644 design/src/rfcs/rfc0037_http_wrapper.md create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index e0910ceca4c..a24f3b3ce64 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -37,7 +37,7 @@ jobs: pushd design &>/dev/null cargo install mdbook - cargo install mdbook-mermaid + cargo install --locked mdbook-mermaid mdbook build --dest-dir ../../output popd &>/dev/null diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index a8277d72f38..ebee4dece1c 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -63,6 +63,7 @@ - [RFC-0034: Smithy Orchestrator](./rfcs/rfc0034_smithy_orchestrator.md) - [RFC-0035: Collection Defaults](./rfcs/rfc0035_collection_defaults.md) - [RFC-0036: HTTP Dependency Exposure](./rfcs/rfc0036_http_dep_elimination.md) + - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/rfcs/overview.md b/design/src/rfcs/overview.md index e388ec49299..c957b532f08 100644 --- a/design/src/rfcs/overview.md +++ b/design/src/rfcs/overview.md @@ -43,3 +43,7 @@ - [RFC-0031: Providing Fallback Credentials on Timeout](./rfc0031_providing_fallback_credentials_on_timeout.md) - [RFC-0032: Better Constraint Violations](./rfc0032_better_constraint_violations.md) - [RFC-0033: Improving access to request IDs in SDK clients](./rfc0033_improve_sdk_request_id_access.md) +- [RFC-0034: The Orchestrator Architecture](./rfc0034_smithy_orchestrator.md) +- [RFC-0035: Sensible Defaults for Collection Values](./rfc0035_collection_defaults.md) +- [RFC-0036: Enabling HTTP crate upgrades in the future](./rfc0036_http_dep_elimination.md) +- [RFC-0037: The HTTP wrapper type](./rfc0037_http_wrapper_type.md) diff --git a/design/src/rfcs/rfc0037_http_wrapper.md b/design/src/rfcs/rfc0037_http_wrapper.md new file mode 100644 index 00000000000..58aa68c55fe --- /dev/null +++ b/design/src/rfcs/rfc0037_http_wrapper.md @@ -0,0 +1,111 @@ + +RFC: The HTTP Wrapper Type +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC defines the API of our wrapper types around `http::Request` and `http::Response`. For more information about why we are wrapping these types, see [RFC 0036: The HTTP Dependency](./rfc0036_http_dep_elimination.md). + + +Terminology +----------- +- `Extensions` / "Request Extensions": The `http` crate Request/Response types include a typed property bag to store additional metadata along with the request. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, external customers and internal code interacts directly with the [`http`](https://crates.io/crates/http) crate. Once this RFC is implemented, interactions at the **public** API level will occur with our own `http` types instead. + +Our types aim to be nearly drop-in-compatible for types in the `http` crate, however: +1. We will not expose existing HTTP types in public APIs in ways that are ossified. +2. When possible, we aim to simplify the APIs to make them easier to use. +3. We will add SDK specific helper functionality when appropriate, e.g. first-level support for applying an endpoint to a request. + + +How to actually implement this RFC +---------------------------------- + +We will need to add two types, `HttpRequest` and `HttpResponse`. + +#### To string or not to String +Our header library restricts header names and values to `String`s (UTF-8). + +Although the `http` library is very precise in its representation—it allows for `HeaderValue`s that are both a super and subset of `String`—a superset because headers support arbitrary binary data but a subset because headers cannot contain control characters like `\n`. + +Although technically allowed, headers containing arbitrary binary data are not widely supported. Generally, Smithy protocols will use base-64 encoding when storing binary data in headers. + +Finally, it's nicer for users if they can stay in "string land". Because of this, HttpRequest and Response expose header names and values as strings. Internally, the current design uses `HeaderName` and `HeaderValue`, however, there is a gate on construction that enforces that values are valid UTF-8. + +**This is a one way door because `.as_str()` would panic in the future if we allow non-string values into headers.** + +#### Where should these types live? +These types will be used by all orchestrator functionality, so they will be housed in `aws-smithy-runtime-api` + +#### What's in and what's out? +At the onset, these types focus on supporting the most ossified usages: `&mut` modification of HTTP types. They **do not** +support construction of HTTP types, other than `impl From` and `From`. We will also make it +possible to use `http::HeaderName` / `http::HeaderValue` in a zero-cost way. + +#### The `AsHeaderComponent` trait +All header insertion methods accept `impl AsHeaderComponent`. This allows us to provide a nice user experience while taking +advantage of zero-cost usage of `'static str`. We will seal this trait to prevent external usage. We will have separate implementation for: +- `&'static str` +- `String` +- http03x::HeaderName + +#### Additional Functionality +Our wrapper type will add the following additional functionality: + +1. Support for `self.try_clone()` +2. Support for `&mut self.apply_endpoint(...)` + +#### Handling failure +There is no stdlib type that cleanly defines what may be placed into headers—String is too broad (even if we restrict to ASCII). This RFC proposes moving fallibility to the APIs: +```rust,ignore +impl HeadersMut<'_> { + pub fn try_insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result, BoxError> { + // ... + } +} +``` + +This allows us to offer user-friendly types while still avoiding runtime panics. We also offer `insert` and `append` which panic on invalid values. + +#### Request Extensions +There is ongoing work which MAY restrict HTTP extensions to clone types. We will preempt that by: +1. Preventing `Extensions` from being present when initially constructing our HTTP request wrapper. +2. Forbidding non-clone extensions from being inserted into the wrapped request. + +This also enables supporting request extensions for different downstream providers by allowing cloning into different extension types. + +#### Proposed Implementation +
+Proposed Implementation of `request` + +```rust,ignore +{{#include ../../../rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs}} +``` +
+ +### Future Work +Currently, the only way to construct `Request` is from a compatible type (e.g. `http03x::Request`) + +Changes checklist +----------------- +- [x] Implement initial implementation and test it against the SDK as written +- [ ] Add test suite of `HTTP` wrapper +- [ ] External design review +- [x] Update the SigV4 crate to remove `http` API dependency +- [ ] Update the SDK to use the new type (breaking change) diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index a17caead014..58ae350e687 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -20,7 +20,7 @@ aws-smithy-async = { path = "../aws-smithy-async" } aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-types = { path = "../aws-smithy-types" } bytes = "1" -http = "0.2.3" +http = "0.2.9" pin-project-lite = "0.2" tokio = { version = "1.25", features = ["sync"] } tracing = "0.1" diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index 5347f71247a..b5031a3f7d3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -50,6 +50,9 @@ //! [`tower`]: https://crates.io/crates/tower //! [`aws-smithy-runtime`]: https://crates.io/crates/aws-smithy-runtime +pub mod request; +pub mod response; + use crate::client::orchestrator::{HttpRequest, HttpResponse}; use crate::client::runtime_components::RuntimeComponents; use crate::impl_shared_conversions; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs new file mode 100644 index 00000000000..9a83d90e29e --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs @@ -0,0 +1,651 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Http Request Types + +use aws_smithy_http::body::SdkBody; +use http as http0; +use http::header::{InvalidHeaderName, InvalidHeaderValue, ToStrError}; +use http::uri::InvalidUri; +use http0::header::Iter; +use http0::uri::PathAndQuery; +use http0::{Extensions, HeaderMap, Method}; +use std::borrow::Cow; +use std::error::Error; +use std::fmt::{Debug, Display, Formatter}; +use std::str::FromStr; + +#[derive(Debug)] +/// An HTTP Request Type +pub struct Request { + body: B, + uri: Uri, + method: Method, + extensions: Extensions, + headers: Headers, +} + +/// A Request URI +#[derive(Debug, Clone)] +pub struct Uri { + as_string: String, + parsed: http0::Uri, +} + +impl Uri { + /// Sets `endpoint` as the endpoint for a URL. + /// + /// An `endpoint` MUST contain a scheme and authority. + /// An `endpoint` MAY contain a port and path. + /// + /// An `endpoint` MUST NOT contain a query + pub fn set_endpoint(&mut self, endpoint: &str) -> Result<(), HttpError> { + let endpoint: http0::Uri = endpoint.parse().map_err(HttpError::invalid_uri)?; + let endpoint = endpoint.into_parts(); + let authority = endpoint + .authority + .ok_or_else(|| HttpError::new("endpoint must contain authority"))?; + let scheme = endpoint + .scheme + .ok_or_else(|| HttpError::new("endpoint must have scheme"))?; + let new_uri = http0::Uri::builder() + .authority(authority) + .scheme(scheme) + .path_and_query(merge_paths(endpoint.path_and_query, &self.parsed).as_ref()) + .build() + .map_err(HttpError::new)?; + self.as_string = new_uri.to_string(); + self.parsed = new_uri; + Ok(()) + } +} + +fn merge_paths(endpoint_path: Option, uri: &http0::Uri) -> Cow<'_, str> { + let uri_path_and_query = uri.path_and_query().map(|pq| pq.as_str()).unwrap_or(""); + let endpoint_path = match endpoint_path { + None => return Cow::Borrowed(uri_path_and_query), + Some(path) => path, + }; + if let Some(query) = endpoint_path.query() { + tracing::warn!(query = %query, "query specified in endpoint will be ignored during endpoint resolution"); + } + let endpoint_path = endpoint_path.path(); + if endpoint_path.is_empty() { + Cow::Borrowed(uri_path_and_query) + } else { + let ep_no_slash = endpoint_path.strip_suffix('/').unwrap_or(endpoint_path); + let uri_path_no_slash = uri_path_and_query + .strip_prefix('/') + .unwrap_or(uri_path_and_query); + Cow::Owned(format!("{}/{}", ep_no_slash, uri_path_no_slash)) + } +} + +impl TryFrom for Uri { + type Error = HttpError; + + fn try_from(value: String) -> Result { + let parsed = value.parse().map_err(HttpError::invalid_uri)?; + Ok(Uri { + as_string: value, + parsed, + }) + } +} + +impl<'a> TryFrom<&'a str> for Uri { + type Error = HttpError; + fn try_from(value: &'a str) -> Result { + Self::try_from(value.to_string()) + } +} + +impl From for Uri { + fn from(value: http::Uri) -> Self { + Self { + as_string: value.to_string(), + parsed: value, + } + } +} + +impl TryInto> for Request { + type Error = HttpError; + + fn try_into(self) -> Result, Self::Error> { + self.into_http03x() + } +} + +impl Request { + /// Converts this request into an http 0.x request. + /// + /// Depending on the internal storage type, this operation may be free or it may have an internal + /// cost. + pub fn into_http03x(self) -> Result, HttpError> { + let mut req = http::Request::builder() + .uri(self.uri.parsed) + .method(self.method) + .body(self.body) + .expect("known valid"); + let mut headers = HeaderMap::new(); + headers.extend( + self.headers + .headers + .into_iter() + .map(|(k, v)| (k, v.into_http03x())), + ); + *req.headers_mut() = headers; + *req.extensions_mut() = self.extensions; + Ok(req) + } + + /// Returns a GET request with no URI + pub fn new(body: B) -> Self { + Self { + body, + uri: Uri::from(http0::Uri::from_static("/")), + method: Method::GET, + extensions: Default::default(), + headers: Default::default(), + } + } + + /// Returns a reference to the header map + pub fn headers(&self) -> &Headers { + &self.headers + } + + /// Returns a mutable reference to the header map + pub fn headers_mut(&mut self) -> &mut Headers { + &mut self.headers + } + + /// Returns the body associated with the request + pub fn body(&self) -> &B { + &self.body + } + + /// Returns a mutable reference to the body + pub fn body_mut(&mut self) -> &mut B { + &mut self.body + } + + /// Returns the method associated with this request + pub fn method(&self) -> &str { + self.method.as_str() + } + + /// Returns the URI associated with this request + pub fn uri(&self) -> &str { + &self.uri.as_string + } + + /// Returns a mutable reference the the URI of this http::Request + pub fn uri_mut(&mut self) -> &mut Uri { + &mut self.uri + } + + /// Sets the URI of this request + pub fn set_uri(&mut self, uri: U) -> Result<(), U::Error> + where + U: TryInto, + { + let uri = uri.try_into()?; + self.uri = uri; + Ok(()) + } + + /// Adds an extension to the request extensions + pub fn add_extension(&mut self, extension: T) { + self.extensions.insert(extension); + } +} + +impl Request { + /// Attempts to clone this request + /// + /// If the body is cloneable, this will clone the request. Otherwise `None` will be returned + pub fn try_clone(&self) -> Option { + let body = self.body().try_clone()?; + Some(Self { + body, + uri: self.uri.clone(), + method: self.method.clone(), + extensions: Extensions::new(), + headers: self.headers.clone(), + }) + } + + /// Replaces this requests body with [`SdkBody::taken()`] + pub fn take_body(&mut self) -> SdkBody { + std::mem::replace(self.body_mut(), SdkBody::taken()) + } +} + +impl TryFrom> for Request { + type Error = HttpError; + + fn try_from(value: http::Request) -> Result { + if let Some(e) = value + .headers() + .values() + .filter_map(|value| value.to_str().err()) + .next() + { + Err(HttpError::header_was_not_a_string(e)) + } else { + let (parts, body) = value.into_parts(); + let mut string_safe_headers: HeaderMap = Default::default(); + string_safe_headers.extend( + parts + .headers + .into_iter() + .map(|(k, v)| (k, HeaderValue::from_http03x(v).expect("validated above"))), + ); + Ok(Self { + body, + uri: parts.uri.into(), + method: parts.method.clone(), + extensions: parts.extensions, + headers: Headers { + headers: string_safe_headers, + }, + }) + } + } +} + +/// An immutable view of request headers +#[derive(Clone, Default, Debug)] +pub struct Headers { + headers: HeaderMap, +} + +impl<'a> IntoIterator for &'a Headers { + type Item = (&'a str, &'a str); + type IntoIter = HeadersIter<'a>; + + fn into_iter(self) -> Self::IntoIter { + HeadersIter { + inner: self.headers.iter(), + } + } +} + +/// An Iterator over headers +pub struct HeadersIter<'a> { + inner: Iter<'a, HeaderValue>, +} + +impl<'a> Iterator for HeadersIter<'a> { + type Item = (&'a str, &'a str); + + fn next(&mut self) -> Option { + self.inner.next().map(|(k, v)| (k.as_str(), v.as_ref())) + } +} + +impl Headers { + /// Returns the value for a given key + /// + /// If multiple values are associated, the first value is returned + /// See [HeaderMap::get] + pub fn get(&self, key: impl AsRef) -> Option<&str> { + self.headers.get(key.as_ref()).map(|v| v.as_ref()) + } + + /// Returns an iterator over the headers + pub fn iter(&self) -> HeadersIter<'_> { + HeadersIter { + inner: self.headers.iter(), + } + } + + /// Returns the total number of **values** stored in the map + pub fn len(&self) -> usize { + self.headers.len() + } + + /// Returns true if there are no headers + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Returns true if this header is present + pub fn contains_key(&self, key: &str) -> bool { + self.headers.contains_key(key) + } + + /// Insert a value into the headers structure. + /// + /// This will *replace* any existing value for this key. Returns the previous associated value if any. + /// + /// # Panics + /// If the key or value are not valid ascii, this function will panic. + pub fn insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Option { + self.try_insert(key, value) + .expect("HeaderName or HeaderValue was invalid") + } + + /// Insert a value into the headers structure. + /// + /// This will *replace* any existing value for this key. Returns the previous associated value if any. + /// + /// If the key or value are not valid ascii, an error is returned + pub fn try_insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result, HttpError> { + let key = header_name(key.into_maybe_static()?)?; + let value = header_value(value.into_maybe_static()?)?; + Ok(self + .headers + .insert(key, value) + .map(|old_value| old_value.into())) + } + + /// Appends a value to a given key + /// + /// If the key or value are NOT valid ascii, an error is returned + pub fn try_append( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result { + let key = header_name(key.into_maybe_static()?)?; + let value = header_value(value.into_maybe_static()?)?; + Ok(self.headers.append(key, value)) + } + + /// Removes all headers with a given key + /// + /// If there are multiple entries for this key, the first entry is returned + pub fn remove(&mut self, key: &str) -> Option { + self.headers.remove(key) + } + + /// Appends a value to a given key + /// + /// # Panics + /// If the key or value are NOT valid ascii, this function will panic + pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool { + self.try_append(key, value) + .expect("HeaderName or HeaderValue was invalid") + } +} + +use sealed::AsHeaderComponent; + +mod sealed { + use super::*; + /// Trait defining things that may be converted into a header component (name or value) + pub trait AsHeaderComponent { + /// If the component can be represented as a Cow<'static, str>, return it + fn into_maybe_static(self) -> Result; + + /// If a component is already internally represented as a `http03x::HeaderName`, return it + fn repr_as_http03x_header_name(self) -> Result + where + Self: Sized, + { + Err(self) + } + } + + impl AsHeaderComponent for &'static str { + fn into_maybe_static(self) -> Result { + Ok(Cow::Borrowed(self)) + } + } + + impl AsHeaderComponent for String { + fn into_maybe_static(self) -> Result { + Ok(Cow::Owned(self)) + } + } + + impl AsHeaderComponent for Cow<'static, str> { + fn into_maybe_static(self) -> Result { + Ok(self) + } + } + + impl AsHeaderComponent for http0::HeaderValue { + fn into_maybe_static(self) -> Result { + Ok(Cow::Owned( + self.to_str() + .map_err(HttpError::header_was_not_a_string)? + .to_string(), + )) + } + } + + impl AsHeaderComponent for http0::HeaderName { + fn into_maybe_static(self) -> Result { + Ok(self.to_string().into()) + } + + fn repr_as_http03x_header_name(self) -> Result + where + Self: Sized, + { + Ok(self) + } + } +} + +mod header_value { + use super::http0; + use std::str::Utf8Error; + + /// HeaderValue type + /// + /// **Note**: Unlike `HeaderValue` in `http`, this only supports UTF-8 header values + #[derive(Debug, Clone)] + pub struct HeaderValue { + _private: http0::HeaderValue, + } + + impl HeaderValue { + pub(crate) fn from_http03x(value: http0::HeaderValue) -> Result { + let _ = std::str::from_utf8(value.as_bytes())?; + Ok(Self { _private: value }) + } + + pub(crate) fn into_http03x(self) -> http0::HeaderValue { + self._private + } + } + + impl AsRef for HeaderValue { + fn as_ref(&self) -> &str { + std::str::from_utf8(self._private.as_bytes()) + .expect("unreachable—only strings may be stored") + } + } + + impl From for String { + fn from(value: HeaderValue) -> Self { + value.as_ref().to_string() + } + } +} + +use crate::box_error::BoxError; +pub use header_value::HeaderValue; + +impl HeaderValue { + /// Returns the string representation of this header value + pub fn as_str(&self) -> &str { + self.as_ref() + } +} + +impl FromStr for HeaderValue { + type Err = HttpError; + + fn from_str(s: &str) -> Result { + HeaderValue::try_from(s.to_string()) + } +} + +impl TryFrom for HeaderValue { + type Error = HttpError; + + fn try_from(value: String) -> Result { + Ok(HeaderValue::from_http03x( + http0::HeaderValue::try_from(value).map_err(HttpError::invalid_header_value)?, + ) + .expect("input was a string")) + } +} + +type MaybeStatic = Cow<'static, str>; + +#[derive(Debug)] +/// An error occurred constructing an Http Request. +/// +/// This is normally due to configuration issues, internal SDK bugs, or other user error. +pub struct HttpError(BoxError); + +impl HttpError { + // TODO(httpRefactor): Add better error internals + fn new>>(err: E) -> Self { + HttpError(err.into()) + } + + fn invalid_header_value(err: InvalidHeaderValue) -> Self { + Self(err.into()) + } + + fn header_was_not_a_string(err: ToStrError) -> Self { + Self(err.into()) + } + + fn invalid_header_name(err: InvalidHeaderName) -> Self { + Self(err.into()) + } + + fn invalid_uri(err: InvalidUri) -> Self { + Self(err.into()) + } +} + +impl Display for HttpError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "an error occurred creating an HTTP Request") + } +} + +impl Error for HttpError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(self.0.as_ref()) + } +} + +fn header_name(name: impl AsHeaderComponent) -> Result { + name.repr_as_http03x_header_name().or_else(|name| { + name.into_maybe_static().and_then(|cow| match cow { + Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), + Cow::Owned(s) => http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name), + }) + }) +} + +fn header_value(value: MaybeStatic) -> Result { + let header = match value { + Cow::Borrowed(b) => http0::HeaderValue::from_static(b), + Cow::Owned(s) => { + http0::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)? + } + }; + HeaderValue::from_http03x(header).map_err(HttpError::new) +} + +#[cfg(test)] +mod test { + use aws_smithy_http::body::SdkBody; + use http::header::{AUTHORIZATION, CONTENT_LENGTH}; + use http::{HeaderValue, Uri}; + + #[test] + fn headers_can_be_any_string() { + let _: HeaderValue = "😹".parse().expect("can be any string"); + let _: HeaderValue = "abcd".parse().expect("can be any string"); + let _ = "a\nb" + .parse::() + .expect_err("cannot contain control characters"); + } + + #[test] + fn request_can_be_created() { + let req = http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Request::try_from(req).unwrap(); + req.headers_mut().insert("a", "b"); + assert_eq!(req.headers().get("a").unwrap(), "b"); + req.headers_mut().append("a", "c"); + assert_eq!(req.headers().get("a").unwrap(), "b"); + let http0 = req.into_http03x().unwrap(); + assert_eq!(http0.uri(), "http://foo.com"); + } + + #[test] + fn uri_mutations() { + let req = http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Request::try_from(req).unwrap(); + assert_eq!(req.uri(), "http://foo.com/"); + req.set_uri("http://bar.com").unwrap(); + assert_eq!(req.uri(), "http://bar.com"); + let http0 = req.into_http03x().unwrap(); + assert_eq!(http0.uri(), "http://bar.com"); + } + + #[test] + #[should_panic] + fn header_panics() { + let req = http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Request::try_from(req).unwrap(); + let _ = req + .headers_mut() + .try_insert("a\nb", "a\nb") + .expect_err("invalid header"); + let _ = req.headers_mut().insert("a\nb", "a\nb"); + } + + #[test] + fn try_clone_clones_all_data() { + let request = ::http::Request::builder() + .uri(Uri::from_static("https://www.amazon.com")) + .method("POST") + .header(CONTENT_LENGTH, 456) + .header(AUTHORIZATION, "Token: hello") + .body(SdkBody::from("hello world!")) + .expect("valid request"); + let request: super::Request = request.try_into().unwrap(); + let cloned = request.try_clone().expect("request is cloneable"); + + assert_eq!("https://www.amazon.com/", cloned.uri()); + assert_eq!("POST", cloned.method()); + assert_eq!(2, cloned.headers().len()); + assert_eq!("Token: hello", cloned.headers().get(AUTHORIZATION).unwrap(),); + assert_eq!("456", cloned.headers().get(CONTENT_LENGTH).unwrap()); + assert_eq!("hello world!".as_bytes(), cloned.body().bytes().unwrap()); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs new file mode 100644 index 00000000000..518961d6d1a --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs @@ -0,0 +1,6 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Http Response Types From 441b05d56ebc5a574f4018714477f1819024cbdf Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 10 Oct 2023 10:09:38 -0400 Subject: [PATCH 159/331] Small update to the production guidance wording (#3049) ## Motivation and Context https://github.com/awslabs/smithy-rs/issues/1692#issuecomment-1754800657 All #1692 subtasks are closed. _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/SDK_README.md.hb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws/SDK_README.md.hb b/aws/SDK_README.md.hb index 7c893114e85..18f6ef8c1fa 100644 --- a/aws/SDK_README.md.hb +++ b/aws/SDK_README.md.hb @@ -16,7 +16,7 @@ To update it, edit the `aws/SDK_README.md.hb` Handlebars template in that reposi This repo contains the new AWS SDK for Rust (the SDK) and its [public roadmap](https://github.com/orgs/awslabs/projects/50/views/1). -**Please Note: The SDK is currently released as a developer preview and is intended strictly for feedback purposes only. Do not use this SDK for production workloads.** +**Please Note**: The SDK is currently released as a developer preview, without support or assistance for use on production workloads. Any use in production is at your own risk. The SDK is code generated from [Smithy models](https://awslabs.github.io/smithy/) that represent each AWS service. The code used to generate the SDK can be found in [smithy-rs](https://github.com/awslabs/smithy-rs). From 38375a5a185370b01f5dd4a49a7b8d58647c2fb9 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 10 Oct 2023 08:58:10 -0700 Subject: [PATCH 160/331] Address some trivial TODO comments (#3040) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../customizations/ResiliencyConfigCustomization.kt | 2 -- .../smithy/customize/RequiredCustomizations.kt | 12 ++++-------- .../generators/EndpointTraitBindingGenerator.kt | 2 -- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index 6f588f11acc..364185b6020 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -382,8 +382,6 @@ class ResiliencyServiceRuntimePluginCustomization(codegenContext: ClientCodegenC override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { is ServiceRuntimePluginSection.DeclareSingletons -> { - // TODO(enableNewSmithyRuntimeCleanup) We can use the standard library's `OnceCell` once we upgrade the - // MSRV to 1.70 rustTemplate( """ static TOKEN_BUCKET: #{StaticPartitionMap}<#{TokenBucketPartition}, #{TokenBucket}> = #{StaticPartitionMap}::new(); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 3852d09fb24..e2f780ddd8f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -21,7 +21,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCus import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Feature -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate @@ -86,20 +85,17 @@ class RequiredCustomizations : ClientCodegenDecorator { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) } rustCrate.withModule(ClientRustModule.Error) { - // TODO(enableNewSmithyRuntimeCleanup): Change SdkError to a `pub use` after changing the generic's default - rust("/// Error type returned by the client.") - rustTemplate( - "pub type SdkError = #{SdkError};", - "SdkError" to RuntimeType.sdkError(rc), - "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), - ) rustTemplate( """ + /// Error type returned by the client. + pub use #{SdkError}; + pub use #{DisplayErrorContext}; pub use #{ProvideErrorMetadata}; """, "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + "SdkError" to RuntimeType.sdkError(rc), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt index 99c0228c1b1..41e76cc498a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt @@ -73,10 +73,8 @@ class EndpointTraitBindings( } if (generateValidation) { val contents = - // TODO(enableNewSmithyRuntimeCleanup): Remove the allow attribute once all places need .into method """ if $field.is_empty() { - ##[allow(clippy::useless_conversion)] return Err(#{invalidFieldError:W}.into()) } """ From 547b63177c7c9a6e675e3b819bb0d1c755f44cd3 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 10 Oct 2023 08:59:22 -0700 Subject: [PATCH 161/331] Remove temporary test customizations (#3044) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../AwsCustomizableOperationDecorator.kt | 134 ------------------ .../rustsdk/AwsFluentClientDecorator.kt | 2 +- .../smithy/rustsdk/UserAgentDecorator.kt | 10 ++ aws/sdk/integration-tests/kms/Cargo.toml | 6 +- .../kms/tests/integration.rs | 20 ++- .../integration-tests/qldbsession/Cargo.toml | 6 +- .../qldbsession/tests/integration.rs | 11 +- aws/sdk/integration-tests/s3/Cargo.toml | 6 +- .../integration-tests/s3/tests/checksums.rs | 84 ++++++----- .../s3/tests/config-override.rs | 1 - .../s3/tests/customizable-operation.rs | 40 ++---- .../integration-tests/s3/tests/endpoints.rs | 17 +-- .../s3/tests/ignore-invalid-xml-body-root.rs | 14 +- .../s3/tests/naughty-string-metadata.rs | 18 +-- aws/sdk/integration-tests/s3/tests/no_auth.rs | 37 ++--- .../s3/tests/normalize-uri-path.rs | 14 +- .../query-strings-are-correctly-encoded.rs | 15 +- .../integration-tests/s3/tests/signing-it.rs | 14 +- .../integration-tests/s3control/Cargo.toml | 6 +- .../s3control/tests/signing-it.rs | 19 +-- .../config/ServiceConfigGenerator.kt | 4 +- 21 files changed, 165 insertions(+), 313 deletions(-) delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt deleted file mode 100644 index 878c4a851f1..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType - -class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : - CustomizableOperationCustomization() { - private val codegenScope = arrayOf( - *RuntimeType.preludeScope, - "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent::AwsUserAgent"), - "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), - "ConfigBag" to RuntimeType.configBag(runtimeConfig), - "http" to CargoDependency.Http.toType(), - "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), - "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::StaticRuntimePlugin"), - "StaticTimeSource" to CargoDependency.smithyAsync(runtimeConfig).toType().resolve("time::StaticTimeSource"), - "TestParamsSetterInterceptor" to testParamsSetterInterceptor(), - ) - - // TODO(enableNewSmithyRuntimeCleanup): Delete this once test helpers on `CustomizableOperation` have been removed - private fun testParamsSetterInterceptor(): RuntimeType = RuntimeType.forInlineFun("TestParamsSetterInterceptor", ClientRustModule.Client.customize) { - rustTemplate( - """ - mod test_params_setter_interceptor { - use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; - use aws_smithy_runtime_api::client::interceptors::Interceptor; - use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; - use aws_smithy_types::config_bag::ConfigBag; - use std::fmt; - - pub(super) struct TestParamsSetterInterceptor { f: F } - - impl fmt::Debug for TestParamsSetterInterceptor { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "TestParamsSetterInterceptor") - } - } - - impl TestParamsSetterInterceptor { - pub fn new(f: F) -> Self { Self { f } } - } - - impl Interceptor for TestParamsSetterInterceptor - where - F: Fn(&mut BeforeTransmitInterceptorContextMut<'_>, &mut ConfigBag) + Send + Sync + 'static, - { - fn name(&self) -> &'static str { - "TestParamsSetterInterceptor" - } - - fn modify_before_signing( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - _runtime_components: &RuntimeComponents, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - (self.f)(context, cfg); - Ok(()) - } - } - } - use test_params_setter_interceptor::TestParamsSetterInterceptor; - """, - *codegenScope, - ) - } - - override fun section(section: CustomizableOperationSection): Writable = - writable { - if (section is CustomizableOperationSection.CustomizableOperationImpl) { - // TODO(enableNewSmithyRuntimeCleanup): Delete these utilities - rustTemplate( - """ - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn request_time_for_tests(self, request_time: ::std::time::SystemTime) -> Self { - self.runtime_plugin( - #{StaticRuntimePlugin}::new() - .with_runtime_components( - #{RuntimeComponentsBuilder}::new("request_time_for_tests") - .with_time_source(Some(#{StaticTimeSource}::new(request_time))) - ) - ) - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn user_agent_for_tests(mut self) -> Self { - let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { - let headers = context.request_mut().headers_mut(); - let user_agent = #{AwsUserAgent}::for_tests(); - headers.insert( - #{http}::header::USER_AGENT, - #{http}::HeaderValue::try_from(user_agent.ua_header()).unwrap(), - ); - headers.insert( - #{http}::HeaderName::from_static("x-amz-user-agent"), - #{http}::HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(), - ); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn remove_invocation_id_for_tests(mut self) -> Self { - let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { - context.request_mut().headers_mut().remove("amz-sdk-invocation-id"); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - """, - *codegenScope, - ) - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 3a1e6e6fbec..93fb926ffee 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -54,7 +54,7 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { AwsPresignedFluentBuilderMethod(codegenContext), AwsFluentClientDocs(codegenContext), ), - ).render(rustCrate, listOf(CustomizableOperationTestHelpers(runtimeConfig))) + ).render(rustCrate, emptyList()) rustCrate.withModule(ClientRustModule.client) { AwsFluentClientExtensions(codegenContext, types).render(this) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index 5d1ee8cb91e..2619b224fcc 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -105,6 +105,7 @@ class UserAgentDecorator : ClientCodegenDecorator { private val codegenScope = arrayOf( *preludeScope, "AppName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("app_name::AppName"), + "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent::AwsUserAgent"), ) override fun section(section: ServiceConfig): Writable = @@ -158,6 +159,15 @@ class UserAgentDecorator : ClientCodegenDecorator { ) } + is ServiceConfig.DefaultForTests -> writable { + rustTemplate( + """ + self.config.store_put(#{AwsUserAgent}::for_tests()); + """, + *codegenScope, + ) + } + else -> emptySection } } diff --git a/aws/sdk/integration-tests/kms/Cargo.toml b/aws/sdk/integration-tests/kms/Cargo.toml index a26e2dd6720..0e84f1a0ecd 100644 --- a/aws/sdk/integration-tests/kms/Cargo.toml +++ b/aws/sdk/integration-tests/kms/Cargo.toml @@ -10,11 +10,15 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime" } -aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms" } +aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index e02e32ab525..96c862c0e60 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -11,7 +11,6 @@ use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClien use http::header::AUTHORIZATION; use http::Uri; use kms::config::{Config, Credentials, Region}; -use std::time::{Duration, UNIX_EPOCH}; // TODO(DVR): having the full HTTP requests right in the code is a bit gross, consider something // like https://github.com/davidbarsky/sigv4/blob/master/aws-sigv4/src/lib.rs#L283-L315 to store @@ -45,6 +44,7 @@ async fn generate_random_cn() { http_client.assert_requests_match(&[]); } +#[cfg(feature = "test-util")] #[tokio::test] async fn generate_random() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( @@ -52,9 +52,8 @@ async fn generate_random() { .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "20") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=2e0dd7259fba92523d553173c452eba8a6ee7990fb5b1f8e2eccdeb75309e9e1") - .header("x-amz-date", "20210305T134922Z") - .header("x-amz-security-token", "notarealsessiontoken") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=53dcf70f6f852cb576185dcabef5aaa3d068704cf1b7ea7dc644efeaa46674d7") + .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") .uri(Uri::from_static("https://kms.us-east-1.amazonaws.com/")) @@ -67,6 +66,7 @@ async fn generate_random() { .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests_with_session_token()) + .with_test_defaults() .build(); let client = kms::Client::from_conf(conf); let resp = client @@ -77,8 +77,6 @@ async fn generate_random() { // Remove the invocation ID since the signed request above doesn't have it req.headers_mut().remove("amz-sdk-invocation-id"); }) - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614952162)) - .user_agent_for_tests() .send() .await .expect("request should succeed"); @@ -118,6 +116,7 @@ async fn generate_random_malformed_response() { .expect_err("response was malformed"); } +#[cfg(feature = "test-util")] #[tokio::test] async fn generate_random_keystore_not_found() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( @@ -125,9 +124,8 @@ async fn generate_random_keystore_not_found() { .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "56") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4ca5cde61676c0ee49fde9ba3c886967e8af16461b6aafdfaee18033eb4ac7a5") - .header("x-amz-date", "20210305T144724Z") - .header("x-amz-security-token", "notarealsessiontoken") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=ffef92c6b75d66cc511daa896eb4a085ec053a2592e17d1f22ecaf167f2fa4bb") + .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") .uri(Uri::from_static("https://kms.us-east-1.amazonaws.com/")) @@ -147,6 +145,7 @@ async fn generate_random_keystore_not_found() { .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests_with_session_token()) + .with_test_defaults() .build(); let client = kms::Client::from_conf(conf); @@ -154,9 +153,6 @@ async fn generate_random_keystore_not_found() { .generate_random() .number_of_bytes(64) .custom_key_store_id("does not exist") - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614955644)) - .user_agent_for_tests() .send() .await .expect_err("key store doesn't exist"); diff --git a/aws/sdk/integration-tests/qldbsession/Cargo.toml b/aws/sdk/integration-tests/qldbsession/Cargo.toml index 59256fb6cd8..fecc6e14959 100644 --- a/aws/sdk/integration-tests/qldbsession/Cargo.toml +++ b/aws/sdk/integration-tests/qldbsession/Cargo.toml @@ -10,10 +10,14 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-qldbsession = { path = "../../build/aws-sdk/sdk/qldbsession" } +aws-sdk-qldbsession = { path = "../../build/aws-sdk/sdk/qldbsession", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 18ba8e49999..0c167712d75 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -9,8 +9,8 @@ use aws_sdk_qldbsession::Client; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use http::Uri; -use std::time::{Duration, UNIX_EPOCH}; +#[cfg(feature = "test-util")] #[tokio::test] async fn signv4_use_correct_service_name() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( @@ -18,10 +18,9 @@ async fn signv4_use_correct_service_name() { .header("content-type", "application/x-amz-json-1.0") .header("x-amz-target", "QLDBSession.SendCommand") .header("content-length", "49") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=350f957e9b736ac3f636d16c59c0a3cee8c2780b0ffadc99bbca841b7f15bee4") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=9a07c60550504d015fb9a2b0f1b175a4d906651f9dd4ee44bebb32a802d03815") // qldbsession uses the signing name 'qldb' in signature _________________________^^^^ - .header("x-amz-date", "20210305T134922Z") - .header("x-amz-security-token", "notarealsessiontoken") + .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .uri(Uri::from_static("https://session.qldb.us-east-1.amazonaws.com/")) .body(SdkBody::from(r#"{"StartSession":{"LedgerName":"not-real-ledger"}}"#)).unwrap(), @@ -33,6 +32,7 @@ async fn signv4_use_correct_service_name() { .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests_with_session_token()) + .with_test_defaults() .build(); let client = Client::from_conf(conf); @@ -45,9 +45,6 @@ async fn signv4_use_correct_service_name() { .unwrap(), ) .customize() - // Fix the request time and user agent so the headers are stable - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614952162)) - .user_agent_for_tests() .mutate_request(|req| { // Remove the invocation ID since the signed request above doesn't have it req.headers_mut().remove("amz-sdk-invocation-id"); diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index a525f698152..1cf92d5d216 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -10,13 +10,17 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] async-std = "1.12.0" aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime", features = ["test-util"] } -aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } +aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", features = ["test-util"] } aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } diff --git a/aws/sdk/integration-tests/s3/tests/checksums.rs b/aws/sdk/integration-tests/s3/tests/checksums.rs index 79b8f929000..b6ea28fef58 100644 --- a/aws/sdk/integration-tests/s3/tests/checksums.rs +++ b/aws/sdk/integration-tests/s3/tests/checksums.rs @@ -7,8 +7,8 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::types::ChecksumMode; -use aws_sdk_s3::Client; use aws_sdk_s3::{operation::get_object::GetObjectOutput, types::ChecksumAlgorithm}; +use aws_sdk_s3::{Client, Config}; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, @@ -25,30 +25,47 @@ fn new_checksum_validated_response_test_connection( checksum_header_name: &'static str, checksum_header_value: &'static str, ) -> StaticReplayClient { - StaticReplayClient::new(vec![ - ReplayEvent::new(http::Request::builder() - .header("x-amz-checksum-mode", "ENABLED") - .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-date", "20210618T170728Z") - .header("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") - .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-checksum-mode;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=eb9e58fa4fb04c8e6f160705017fdbb497ccff0efee4227b3a56f900006c3882") - .uri(Uri::from_static("https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?x-id=GetObject")).body(SdkBody::empty()).unwrap(), - http::Response::builder() - .header("x-amz-request-id", "4B4NGF0EAWN0GE63") - .header("content-length", "11") - .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") - .header(checksum_header_name, checksum_header_value) - .header("content-type", "application/octet-stream") - .header("server", "AmazonS3") - .header("content-encoding", "") - .header("last-modified", "Tue, 21 Jun 2022 16:29:14 GMT") - .header("date", "Tue, 21 Jun 2022 16:29:23 GMT") - .header("x-amz-id-2", "kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=") - .header("accept-ranges", "bytes") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(SdkBody::from(r#"Hello world"#)).unwrap()), - ]) + StaticReplayClient::new(vec![ReplayEvent::new( + http::Request::builder() + .header("x-amz-checksum-mode", "ENABLED") + .header( + "user-agent", + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0", + ) + .header("x-amz-date", "20090213T233130Z") + .header( + "x-amz-content-sha256", + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ) + .header( + "x-amz-user-agent", + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0", + ) + .header("authorization", "not-relevant") + .uri(Uri::from_static( + "https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?x-id=GetObject", + )) + .body(SdkBody::empty()) + .unwrap(), + http::Response::builder() + .header("x-amz-request-id", "4B4NGF0EAWN0GE63") + .header("content-length", "11") + .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") + .header(checksum_header_name, checksum_header_value) + .header("content-type", "application/octet-stream") + .header("server", "AmazonS3") + .header("content-encoding", "") + .header("last-modified", "Tue, 21 Jun 2022 16:29:14 GMT") + .header("date", "Tue, 21 Jun 2022 16:29:23 GMT") + .header( + "x-amz-id-2", + "kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=", + ) + .header("accept-ranges", "bytes") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"Hello world"#)) + .unwrap(), + )]) } async fn test_checksum_on_streaming_response( @@ -59,22 +76,20 @@ async fn test_checksum_on_streaming_response( checksum_header_name, checksum_header_value, ); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .time_source(UNIX_EPOCH + Duration::from_secs(1624036048)) .region(Region::new("us-east-1")) .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let res = client .get_object() .bucket("some-test-bucket") .key("test.txt") .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled) - .customize() - .user_agent_for_tests() .send() .await .unwrap(); @@ -150,13 +165,13 @@ async fn test_checksum_on_streaming_request<'a>( expected_aws_chunked_encoded_body: &'a str, ) { let (http_client, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); // ByteStreams created from a file are streaming and have a known size let mut file = tempfile::NamedTempFile::new().unwrap(); @@ -178,9 +193,6 @@ async fn test_checksum_on_streaming_request<'a>( .key("test.txt") .body(body) .checksum_algorithm(checksum_algorithm) - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await .unwrap(); diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index 76598b764c2..5c1b08eee38 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -86,7 +86,6 @@ async fn operation_overrides_credentials_provider() { Some(std::time::UNIX_EPOCH + std::time::Duration::from_secs(1669257290 + 3600)), "test", ))) - .request_time_for_tests(std::time::UNIX_EPOCH + std::time::Duration::from_secs(1669257290)) .send() .await; diff --git a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs index b7c7dfbf55c..dd838e7efb3 100644 --- a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs +++ b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs @@ -3,17 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; +use aws_sdk_s3::{Client, Config}; use aws_smithy_runtime::client::http::test_util::capture_request; -use std::time::{Duration, UNIX_EPOCH}; +use http::HeaderValue; #[tokio::test] async fn test_s3_ops_are_customizable() { let (http_client, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) @@ -21,38 +20,27 @@ async fn test_s3_ops_are_customizable() { .http_client(http_client.clone()) .build(); - let client = Client::new(&sdk_config); - - let op = client - .list_buckets() - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests(); + let client = Client::from_conf(config); // The response from the fake connection won't return the expected XML but we don't care about // that error in this test - let _ = op + let _ = client + .list_buckets() + .customize() + .mutate_request(|req| { + req.headers_mut() + .append("test-header", HeaderValue::from_static("test-value")); + }) .send() .await .expect_err("this will fail due to not receiving a proper XML response."); let expected_req = rcvr.expect_request(); - let auth_header = expected_req + let test_header = expected_req .headers() - .get("Authorization") + .get("test-header") .unwrap() .to_owned(); - // This is a snapshot test taken from a known working test result - let snapshot_signature = - "Signature=c2028dc806248952fc533ab4b1d9f1bafcdc9b3380ed00482f9935541ae11671"; - assert!( - auth_header - .to_str() - .unwrap() - .contains(snapshot_signature), - "authorization header signature did not match expected signature: got {}, expected it to contain {}", - auth_header.to_str().unwrap(), - snapshot_signature - ); + assert_eq!("test-value", test_header.to_str().unwrap(),); } diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index 2c31986007e..e38269154dd 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -3,22 +3,20 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::Builder; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; +use aws_sdk_s3::{Client, Config}; use aws_smithy_runtime::client::http::test_util::{capture_request, CaptureRequestReceiver}; -use std::time::{Duration, UNIX_EPOCH}; fn test_client(update_builder: fn(Builder) -> Builder) -> (CaptureRequestReceiver, Client) { let (http_client, captured_request) = capture_request(None); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-4")) .http_client(http_client) - .build(); - let client = Client::from_conf(update_builder(Builder::from(&sdk_config)).build()); + .with_test_defaults(); + let client = Client::from_conf(update_builder(config).build()); (captured_request, client) } @@ -69,9 +67,6 @@ async fn multi_region_access_points() { .get_object() .bucket("arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap") .key("blah") - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await; let captured_request = captured_request.expect_request(); @@ -83,7 +78,7 @@ async fn multi_region_access_points() { let auth_header = auth_header.to_str().unwrap(); // Verifies that the sigv4a signing algorithm was used, that the signing scope doesn't include a region, and that the x-amz-region-set header was signed. let expected_start = - "AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20210618/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature="; + "AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20090213/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature="; assert!( auth_header.starts_with(expected_start), @@ -100,8 +95,6 @@ async fn s3_object_lambda() { .get_object() .bucket("arn:aws:s3-object-lambda:us-east-100:123412341234:accesspoint/myolap") .key("s3.txt") - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1234567890)) .send() .await .unwrap(); diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index 25a7a34e0b8..c9bd3749a37 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -4,12 +4,11 @@ */ use aws_credential_types::provider::SharedCredentialsProvider; +use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, types::ObjectAttributes, Client}; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; -use aws_types::SdkConfig; use http::header::AUTHORIZATION; -use std::time::{Duration, UNIX_EPOCH}; const RESPONSE_BODY_XML: &[u8] = b"\ne1AsOh9IyGCa4hLN+2Od7jlnP14="; @@ -19,10 +18,9 @@ async fn ignore_invalid_xml_body_root() { ReplayEvent::new(http::Request::builder() .header("x-amz-object-attributes", "Checksum") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-date", "20210618T170728Z") + .header("x-amz-date", "20090213T233130Z") .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-object-attributes;x-amz-security-token;x-amz-user-agent, Signature=0e6ec749db5a0af07890a83f553319eda95be0e498d058c64880471a474c5378") .header("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") - .header("x-amz-security-token", "notarealsessiontoken") .uri(http::Uri::from_static("https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?attributes")) .body(SdkBody::empty()) .unwrap(), @@ -41,23 +39,21 @@ async fn ignore_invalid_xml_body_root() { .unwrap()) ]); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) .http_client(http_client.clone()) + .with_test_defaults() .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let _ = client .get_object_attributes() .bucket("some-test-bucket") .key("test.txt") .object_attributes(ObjectAttributes::Checksum) - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await .unwrap(); diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 422d64c899a..8f439627634 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -4,11 +4,10 @@ */ use aws_credential_types::provider::SharedCredentialsProvider; +use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, primitives::ByteStream, Client}; use aws_smithy_runtime::client::http::test_util::capture_request; -use aws_types::SdkConfig; use http::HeaderValue; -use std::time::{Duration, UNIX_EPOCH}; const NAUGHTY_STRINGS: &str = include_str!("blns/blns.txt"); @@ -49,14 +48,13 @@ const NAUGHTY_STRINGS: &str = include_str!("blns/blns.txt"); #[tokio::test] async fn test_s3_signer_with_naughty_string_metadata() { let (http_client, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) .http_client(http_client.clone()) - .build(); - let config = aws_sdk_s3::config::Builder::from(&sdk_config) + .with_test_defaults() .force_path_style(true) .build(); @@ -77,13 +75,7 @@ async fn test_s3_signer_with_naughty_string_metadata() { } } - let _ = builder - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() - .send() - .await - .unwrap(); + let _ = builder.send().await.unwrap(); let expected_req = rcvr.expect_request(); let auth_header = expected_req @@ -94,7 +86,7 @@ async fn test_s3_signer_with_naughty_string_metadata() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=8dfa41f2db599a9fba53393b0ae5da646e5e452fa3685f7a1487d6eade5ec5c8"; + "Signature=a5115604df66219874a9e5a8eab4c9f7a28c992ab2d918037a285756c019f3b2"; assert!( auth_header .to_str() diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs index f7e8f477ea6..f3029e4a1db 100644 --- a/aws/sdk/integration-tests/s3/tests/no_auth.rs +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sdk_s3::{Client, Config}; use aws_smithy_protocol_test::MediaType; use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; @@ -18,15 +19,16 @@ async fn list_objects() { .region("us-east-1") .load() .await; - let client = aws_sdk_s3::Client::new(&config); + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = aws_sdk_s3::Client::from_conf(config); let result = client .list_objects() .bucket("gdc-organoid-pancreatic-phs001611-2-open") .max_keys(3) - .customize() - .remove_invocation_id_for_tests() - .user_agent_for_tests() .send() .await; dbg!(result).expect("success"); @@ -49,15 +51,16 @@ async fn list_objects_v2() { .region("us-east-1") .load() .await; - let client = aws_sdk_s3::Client::new(&config); + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = Client::from_conf(config); let result = client .list_objects_v2() .bucket("gdc-organoid-pancreatic-phs001611-2-open") .max_keys(3) - .customize() - .remove_invocation_id_for_tests() - .user_agent_for_tests() .send() .await; dbg!(result).expect("success"); @@ -79,15 +82,16 @@ async fn head_object() { .region("us-east-1") .load() .await; - let client = aws_sdk_s3::Client::new(&config); + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = Client::from_conf(config); let result = client .head_object() .bucket("gdc-organoid-pancreatic-phs001611-2-open") .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") - .customize() - .remove_invocation_id_for_tests() - .user_agent_for_tests() .send() .await; dbg!(result).expect("success"); @@ -109,15 +113,16 @@ async fn get_object() { .region("us-east-1") .load() .await; - let client = aws_sdk_s3::Client::new(&config); + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = Client::from_conf(config); let result = client .get_object() .bucket("gdc-organoid-pancreatic-phs001611-2-open") .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") - .customize() - .remove_invocation_id_for_tests() - .user_agent_for_tests() .send() .await; dbg!(result).expect("success"); diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index ae8426d16ca..a044a3e9214 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -3,25 +3,24 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::primitives::ByteStream; +use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, Client}; use aws_smithy_runtime::client::http::test_util::capture_request; -use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_operation_should_not_normalize_uri_path() { let (http_client, rx) = capture_request(None); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let bucket_name = "test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1"; @@ -30,9 +29,6 @@ async fn test_operation_should_not_normalize_uri_path() { .bucket(bucket_name) .key("a/.././b.txt") // object key with dot segments .body(ByteStream::from_static("Hello, world".as_bytes())) - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1669257290)) - .user_agent_for_tests() .send() .await .unwrap(); @@ -45,7 +41,7 @@ async fn test_operation_should_not_normalize_uri_path() { let expected_uri = "/a/.././b.txt"; assert_eq!(actual_uri, expected_uri); - let expected_sig = "Signature=4803b8b8c794b5ecc055933befd7c5547f8bf6585bb18e4ae33ff65220d5cdd7"; + let expected_sig = "Signature=2ac540538c84dc2616d92fb51d4fc6146ccd9ccc1ee85f518a1a686c5ef97b86"; assert!( actual_auth.contains(expected_sig), "authorization header signature did not match expected signature: expected {} but not found in {}", diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 9f688fe69b7..55c68f61557 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -3,25 +3,23 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; +use aws_sdk_s3::{Client, Config}; use aws_smithy_runtime::client::http::test_util::capture_request; -use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_s3_signer_query_string_with_all_valid_chars() { let (http_client, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); // Generate a string containing all printable ASCII chars let prefix: String = (32u8..127).map(char::from).collect(); @@ -32,9 +30,6 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { .list_objects_v2() .bucket("test-bucket") .prefix(&prefix) - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await; @@ -47,7 +42,7 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=647aa91c7f91f1f1c498ef376fea370b48d0cd8c80a53c8e2cd64e3fc527a5e0"; + "Signature=9a931d20606f93fa4e5553602866a9b5ccac2cd42b54ae5a4b17e4614fb443ce"; assert!( auth_header .to_str() diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index 1b3e59e3735..22dcf7c3d9a 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -3,39 +3,35 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; +use aws_sdk_s3::{Client, Config}; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; -use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_signer() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=ae78f74d26b6b0c3a403d9e8cc7ec3829d6264a2b33db672bf2b151bbb901786") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=27e3f59ec3cffaa10e4f1c92112e8fb62d468a04cd32be39e68215f830404dbb") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~") .body(SdkBody::empty()) .unwrap(), http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), )]); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .region(Region::new("us-east-1")) .http_client(http_client.clone()) + .with_test_defaults() .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let _ = client .list_objects_v2() .bucket("test-bucket") .prefix("prefix~") - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await; diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index 723f8c964af..bd1923c1419 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -10,10 +10,14 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control" } +aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index b94e3971707..242f2f2d783 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -5,41 +5,36 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3control::config::{Credentials, Region}; -use aws_sdk_s3control::Client; +use aws_sdk_s3control::{Client, Config}; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; -use aws_types::SdkConfig; -use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn test_signer() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("authorization", - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20211112/us-east-1/s3/aws4_request, \ - SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, \ - Signature=ac58c2246428af711ab7bca30c704a2b6a5fd7451cf83f3bceff177f1636e277") + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, \ + SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-user-agent, \ + Signature=0102a74cb220f8445c4efada17660572ff813e07b524032ec831e8c2514be903") .uri("https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint") .body(SdkBody::empty()) .unwrap(), http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), )]); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) .http_client(http_client.clone()) .region(Region::new("us-east-1")) + .with_test_defaults() .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let _ = client .list_access_points() .account_id("test-bucket") - .customize() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1636751225)) - .user_agent_for_tests() - .remove_invocation_id_for_tests() .send() .await .expect_err("empty response"); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index 455942df495..a6379bb4b4a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -401,7 +401,7 @@ class ServiceConfigGenerator( testUtilOnly.render(this) Attribute.AllowUnusedMut.render(this) docs("Apply test defaults to the builder") - rustBlock("pub fn set_test_defaults(&mut self) -> &mut Self") { + rustBlock("pub fn apply_test_defaults(&mut self) -> &mut Self") { customizations.forEach { it.section(ServiceConfig.DefaultForTests("self"))(this) } rust("self") } @@ -410,7 +410,7 @@ class ServiceConfigGenerator( Attribute.AllowUnusedMut.render(this) docs("Apply test defaults to the builder") rustBlock("pub fn with_test_defaults(mut self) -> Self") { - rust("self.set_test_defaults(); self") + rust("self.apply_test_defaults(); self") } docs("Builds a [`Config`].") From 8bfc4c615ebf9e65dbf1a396659abba22edb775c Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 10 Oct 2023 12:02:13 -0400 Subject: [PATCH 162/331] Run `--all` in precommit (#3048) ## Motivation and Context Some lint errors don't show up until CI, this fixes that issue. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .pre-commit-hooks/sdk-lints.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-hooks/sdk-lints.sh b/.pre-commit-hooks/sdk-lints.sh index be7bf421f33..2eba2a21d56 100755 --- a/.pre-commit-hooks/sdk-lints.sh +++ b/.pre-commit-hooks/sdk-lints.sh @@ -5,4 +5,4 @@ # set -e -cd "$(git rev-parse --show-toplevel)/tools/ci-build/sdk-lints" && cargo run -- check --license --changelog +cd "$(git rev-parse --show-toplevel)/tools/ci-build/sdk-lints" && cargo run -- check --all From e61fb6f0067c0ec3deeafc348f92fc366f8a8691 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 10 Oct 2023 12:02:37 -0400 Subject: [PATCH 163/331] Update `toSnakeCase` to better handle plurals, version numbers, and other pathological cases (#3037) ## Motivation and Context There are currently a lot of fields in the SDK that are clearly converted to snake-case wrong: Screenshot 2023-10-09 at 12 00 43 PM Screenshot 2023-10-09 at 12 02 48 PM ## Description - Author a new splitWords algorithm - Add snapshot test - Add lots of individual tests. ## Testing - snapshot testing, compared with current behavior. ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../software/amazon/smithy/rustsdk/AwsDocs.kt | 5 +- .../smithy/rust/codegen/core/util/Strings.kt | 106 +- .../rust/codegen/core/util/StringsTest.kt | 81 + codegen-core/src/test/resources/allNames.txt | 62988 ++++++++++++++++ .../src/test/resources/testOutput.txt | 62988 ++++++++++++++++ .../smithy/generators/ScopeMacroGenerator.kt | 3 +- 7 files changed, 126167 insertions(+), 10 deletions(-) create mode 100644 codegen-core/src/test/resources/allNames.txt create mode 100644 codegen-core/src/test/resources/testOutput.txt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8c370c0ea04..84bd2a26d54 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -297,3 +297,9 @@ message = "The `customize()` method is now sync and infallible. Remove any `awai references = ["smithy-rs#3039"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = "Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`." +references = ["smithy-rs#3037", "aws-sdk-rust#756"] +meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "all" } +author = "rcoh" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt index 7166ce11441..e103e43ffc9 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizationsOrElse -import software.amazon.smithy.rust.codegen.core.util.toSnakeCase object AwsDocs { /** @@ -27,7 +26,7 @@ object AwsDocs { ).contains(codegenContext.serviceShape.id) fun constructClient(codegenContext: ClientCodegenContext, indent: String): Writable { - val crateName = codegenContext.moduleName.toSnakeCase() + val crateName = codegenContext.moduleUseName() return writable { writeCustomizationsOrElse( codegenContext.rootDecorator.extraSections(codegenContext), @@ -48,7 +47,7 @@ object AwsDocs { fun clientConstructionDocs(codegenContext: ClientCodegenContext): Writable = { if (canRelyOnAwsConfig(codegenContext)) { - val crateName = codegenContext.moduleName.toSnakeCase() + val crateName = codegenContext.moduleUseName() docsTemplate( """ #### Constructing a `Client` diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt index 9ac1b7004ce..8f5e504b1af 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt @@ -8,20 +8,116 @@ package software.amazon.smithy.rust.codegen.core.util import software.amazon.smithy.utils.CaseUtils import software.amazon.smithy.utils.StringUtils -fun String.doubleQuote(): String = StringUtils.escapeJavaString(this, "").replace(Regex("""\\u([0-9a-f]{4})""")) { matchResult: MatchResult -> - "\\u{" + matchResult.groupValues[1] + "}" as CharSequence -} +fun String.doubleQuote(): String = + StringUtils.escapeJavaString(this, "").replace(Regex("""\\u([0-9a-f]{4})""")) { matchResult: MatchResult -> + "\\u{" + matchResult.groupValues[1] + "}" as CharSequence + } /** * Double quote a string, e.g. "abc" -> "\"abc\"" */ fun String.dq(): String = this.doubleQuote() -// String extensions +private fun String.splitOnWordBoundaries(): List { + val out = mutableListOf() + // These are whole words but cased differently, e.g. `IPv4`, `MiB`, `GiB`, `TtL` + val completeWords = listOf("ipv4", "ipv6", "sigv4", "mib", "gib", "kib", "ttl") + var currentWord = "" + + // emit the current word and update from the next character + val emit = { next: Char -> + if (currentWord.isNotEmpty()) { + out += currentWord.lowercase() + } + currentWord = if (next.isLetterOrDigit()) { + next.toString() + } else { + "" + } + } + val allLowerCase = this.lowercase() == this + this.forEachIndexed { index, nextCharacter -> + val peek = this.getOrNull(index + 1) + val doublePeek = this.getOrNull(index + 2) + val completeWordInProgress = completeWords.any { + (currentWord + this.substring(index)).lowercase().startsWith( + it, + ) + } && !completeWords.contains(currentWord.lowercase()) + when { + // [C] in these docs indicates the value of nextCharacter + // A[_]B + !nextCharacter.isLetterOrDigit() -> emit(nextCharacter) + + // If we have no letters so far, push the next letter (we already know it's a letter or digit) + currentWord.isEmpty() -> currentWord += nextCharacter.toString() + + // Abc[D]ef or Ab2[D]ef + !completeWordInProgress && loweredFollowedByUpper(currentWord, nextCharacter) -> emit(nextCharacter) + + // s3[k]ey + !completeWordInProgress && allLowerCase && digitFollowedByLower(currentWord, nextCharacter) -> emit( + nextCharacter, + ) + + // DB[P]roxy, or `IAM[U]ser` but not AC[L]s + endOfAcronym(currentWord, nextCharacter, peek, doublePeek) -> emit(nextCharacter) + + // If we haven't found a word boundary, push it and keep going + else -> currentWord += nextCharacter.toString() + } + } + if (currentWord.isNotEmpty()) { + out += currentWord + } + return out +} + +/** + * Handle cases like `DB[P]roxy`, `ARN[S]upport`, `AC[L]s` + */ +private fun endOfAcronym(current: String, nextChar: Char, peek: Char?, doublePeek: Char?): Boolean { + if (!current.last().isUpperCase()) { + // Not an acronym in progress + return false + } + if (!nextChar.isUpperCase()) { + // We aren't at the next word yet + return false + } + + if (peek?.isLowerCase() != true) { + return false + } + + // Skip cases like `AR[N]s`, `AC[L]s` but not `IAM[U]ser` + if (peek == 's' && (doublePeek == null || !doublePeek.isLowerCase())) { + return false + } + + // Skip cases like `DynamoD[B]v2` + if (peek == 'v' && doublePeek?.isDigit() == true) { + return false + } + return true +} + +private fun loweredFollowedByUpper(current: String, nextChar: Char): Boolean { + if (!nextChar.isUpperCase()) { + return false + } + return current.last().isLowerCase() || current.last().isDigit() +} + +private fun digitFollowedByLower(current: String, nextChar: Char): Boolean { + return (current.last().isDigit() && nextChar.isLowerCase()) +} + fun String.toSnakeCase(): String { - return CaseUtils.toSnakeCase(this) + return this.splitOnWordBoundaries().joinToString("_") { it.lowercase() } } fun String.toPascalCase(): String { + // TODO(https://github.com/awslabs/smithy-rs/issues/3047): consider using our updated toSnakeCase (but need to audit diff) return CaseUtils.toSnakeCase(this).let { CaseUtils.toPascalCase(it) } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt index ff029c0e182..af4e65d450e 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt @@ -7,6 +7,14 @@ package software.amazon.smithy.rust.codegen.core.util import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtensionContext +import org.junit.jupiter.api.fail +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.ArgumentsProvider +import org.junit.jupiter.params.provider.ArgumentsSource +import java.io.File +import java.util.stream.Stream internal class StringsTest { @@ -18,4 +26,77 @@ internal class StringsTest { "{\"nested\": \"{\\\"nested\\\": 5}\"}\"}" """.trimIndent().trim() } + + @Test + fun correctlyConvertToSnakeCase() { + "NotificationARNs".toSnakeCase() shouldBe "notification_arns" + } + + @Test + fun testAllNames() { + // Set this to true to write a new test expectation file + val publishUpdate = false + val allNames = this::class.java.getResource("/testOutput.txt")?.readText()!! + val errors = mutableListOf() + val output = StringBuilder() + allNames.lines().filter { it.isNotBlank() }.forEach { + val split = it.split(',') + val input = split[0] + val expectation = split[1] + val actual = input.toSnakeCase() + if (input.toSnakeCase() != expectation) { + errors += "$it => $actual (expected $expectation)" + } + output.appendLine("$input,$actual") + } + if (publishUpdate) { + File("testOutput.txt").writeText(output.toString()) + } + if (errors.isNotEmpty()) { + fail(errors.joinToString("\n")) + } + } + + @ParameterizedTest + @ArgumentsSource(TestCasesProvider::class) + fun testSnakeCase(input: String, output: String) { + input.toSnakeCase() shouldBe output + } +} + +class TestCasesProvider : ArgumentsProvider { + override fun provideArguments(context: ExtensionContext?): Stream = + listOf( + "ACLs" to "acls", + "ACLsUpdateStatus" to "acls_update_status", + "AllowedAllVPCs" to "allowed_all_vpcs", + "BluePrimaryX" to "blue_primary_x", + "CIDRs" to "cidrs", + "AuthTtL" to "auth_ttl", + "CNAMEPrefix" to "cname_prefix", + "S3Location" to "s3_location", + "signatureS" to "signature_s", + "signatureR" to "signature_r", + "M3u8Settings" to "m3u8_settings", + "IAMUser" to "iam_user", + "OtaaV1_0_x" to "otaa_v1_0_x", + "DynamoDBv2Action" to "dynamo_dbv2_action", + "SessionKeyEmv2000" to "session_key_emv2000", + "SupportsClassB" to "supports_class_b", + "UnassignIpv6AddressesRequest" to "unassign_ipv6_addresses_request", + "TotalGpuMemoryInMiB" to "total_gpu_memory_in_mib", + "WriteIOs" to "write_ios", + "dynamoDBv2" to "dynamo_dbv2", + "ipv4Address" to "ipv4_address", + "sigv4" to "sigv4", + "s3key" to "s3_key", + "sha256sum" to "sha256_sum", + "Av1QvbrSettings" to "av1_qvbr_settings", + "Av1Settings" to "av1_settings", + "AwsElbv2LoadBalancer" to "aws_elbv2_load_balancer", + "SigV4Authorization" to "sigv4_authorization", + "IpV6Address" to "ipv6_address", + "IpV6Cidr" to "ipv6_cidr", + "IpV4Addresses" to "ipv4_addresses", + ).map { Arguments.of(it.first, it.second) }.stream() } diff --git a/codegen-core/src/test/resources/allNames.txt b/codegen-core/src/test/resources/allNames.txt new file mode 100644 index 00000000000..7f2a5ac7ab5 --- /dev/null +++ b/codegen-core/src/test/resources/allNames.txt @@ -0,0 +1,62988 @@ +ACL +ACLAlreadyExistsFault +ACLName +ACLNames +ACLNotFoundFault +ACLPendingChanges +ACLQuotaExceededFault +ACLToApply +ACLs +ACLsUpdateStatus +ACMCertificateArn +ACTIVE +ADDomainJoinPassword +ADDomainJoinUser +ADM +ADMChannelRequest +ADMChannelResponse +ADMMessage +ALPNPolicyNotSupportedException +APICallRateForCustomerExceededFault +APIKey +APIKeySummaries +APIKeySummary +APIName +APNS +APNSChannelRequest +APNSChannelResponse +APNSMessage +APNSPushNotificationTemplate +APNSPushType +APNSSandboxChannelRequest +APNSSandboxChannelResponse +APNSVoipChannelRequest +APNSVoipChannelResponse +APNSVoipSandboxChannelRequest +APNSVoipSandboxChannelResponse +ARN +ASN1Subject +ASName +ASNumber +ASSERTION +ATIMetricDataPoint +ATIModelPerformance +ATITrainingMetricsValue +AWSAccessKeyId +AWSAccount +AWSAccountId +AWSAccountIds +AWSCost +AWSDomainInformation +AWSKMSKeyARN +AWSLocation +AWSManagedRulesACFPRuleSet +AWSManagedRulesATPRuleSet +AWSManagedRulesBotControlRuleSet +AWSOrganizationsNotInUseException +AWSService +AWSServiceAccessNotEnabledException +AWSServiceName +AWSSessionCredentials +AZList +AZMode +AacSettings +AbortConfig +AbortCriteria +AbortDate +AbortDocumentVersionUploadRequest +AbortEnvironmentUpdateMessage +AbortIncompleteMultipartUpload +AbortMultipartReadSetUploadRequest +AbortMultipartUploadInput +AbortMultipartUploadOutput +AbortMultipartUploadRequest +AbortRuleId +AbortTransaction +AbortTransactionResult +AbortVaultLockInput +AbortableOperationInProgress +AbpV1_0_x +AbpV1_1 +AbrSettings +AbsentInputAudioBehavior +AbsoluteTime +AbsoluteTimeRange +AbuseContactEmail +AbuseContactPhone +Ac3Settings +AccelerateConfiguration +AccelerationSettings +AccelerationStatus +Accelerator +AcceleratorArn +AcceleratorAttributes +AcceleratorCount +AcceleratorCountRequest +AcceleratorEvent +AcceleratorManufacturers +AcceleratorNames +AcceleratorNotDisabledException +AcceleratorNotFoundException +AcceleratorPort +AcceleratorSocketAddresses +AcceleratorTotalMemoryMiB +AcceleratorTotalMemoryMiBRequest +AcceleratorType +AcceleratorTypeOffering +AcceleratorTypes +Accelerators +Accent +AccentForeground +Accept +AcceptAddressTransferRequest +AcceptAddressTransferResult +AcceptAdministratorInvitationRequest +AcceptAnyDate +AcceptAttachmentRequest +AcceptAttachmentResponse +AcceptCertificateTransferRequest +AcceptCode +AcceptCodeValidation +AcceptDirectConnectGatewayAssociationProposalRequest +AcceptDirectConnectGatewayAssociationProposalResult +AcceptDomainTransferFromAnotherAwsAccountRequest +AcceptDomainTransferFromAnotherAwsAccountResponse +AcceptEnvironmentAccountConnectionInput +AcceptEnvironmentAccountConnectionOutput +AcceptEulasRequest +AcceptEulasResponse +AcceptGrantRequest +AcceptGrantResponse +AcceptHandshakeRequest +AcceptHandshakeResponse +AcceptInboundConnectionRequest +AcceptInboundConnectionResponse +AcceptInboundCrossClusterSearchConnectionRequest +AcceptInboundCrossClusterSearchConnectionResponse +AcceptInputDeviceTransferRequest +AcceptInvitationRequest +AcceptLanguage +AcceptMatchInput +AcceptPageRequest +AcceptPortfolioShareInput +AcceptQualificationRequestRequest +AcceptRanges +AcceptReservedInstancesExchangeQuoteRequest +AcceptReservedInstancesExchangeQuoteResult +AcceptReservedNodeExchangeInputMessage +AcceptReservedNodeExchangeOutputMessage +AcceptResourceShareInvitationRequest +AcceptResourceShareInvitationResponse +AcceptShareRequest +AcceptShareResponse +AcceptSharedDirectoryRequest +AcceptSharedDirectoryResult +AcceptTermsAndConditions +AcceptTime +AcceptTransitGatewayMulticastDomainAssociationsRequest +AcceptTransitGatewayMulticastDomainAssociationsResult +AcceptTransitGatewayPeeringAttachmentRequest +AcceptTransitGatewayPeeringAttachmentResult +AcceptTransitGatewayVpcAttachmentRequest +AcceptTransitGatewayVpcAttachmentResult +AcceptType +AcceptVpcEndpointConnectionsRequest +AcceptVpcEndpointConnectionsResult +AcceptVpcPeeringConnectionRequest +AcceptVpcPeeringConnectionResult +AcceptanceRequired +AcceptanceThreshold +AcceptanceTimeoutSeconds +AcceptanceType +Accepted +AcceptedRouteCount +AccepterPeeringConnectionOptions +AccepterTgwInfo +AccepterTransitGatewayAttachmentId +AccepterVpcInfo +Access +AccessAll +AccessAlternateDirectly +AccessBasedEnumeration +AccessConfiguration +AccessControl +AccessControlAllowCredentials +AccessControlAllowHeaders +AccessControlAllowMethods +AccessControlAllowOrigins +AccessControlAttribute +AccessControlAttributeValue +AccessControlAttributes +AccessControlConfigurationId +AccessControlConfigurationSummary +AccessControlConfigurations +AccessControlEntries +AccessControlEntry +AccessControlEntrySummary +AccessControlExposeHeaders +AccessControlGrants +AccessControlList +AccessControlListConfiguration +AccessControlMaxAgeSec +AccessControlPolicy +AccessControlRule +AccessControlTranslation +AccessDenied +AccessDeniedException +AccessDeniedFault +AccessDeniedForDependencyException +AccessDescription +AccessDetail +AccessDetails +AccessEndpoint +AccessEndpoints +AccessForbidden +AccessGroupId +AccessKey +AccessKeyDetails +AccessKeyId +AccessKeyLastUsed +AccessKeyMetadata +AccessLevelFilter +AccessLocation +AccessLog +AccessLogSettings +AccessLogSubscriptionSummary +AccessLoggingEnabled +AccessLogs +AccessMethod +AccessMethodType +AccessPoint +AccessPointAlreadyExists +AccessPointArn +AccessPointDescription +AccessPointId +AccessPointLimitExceeded +AccessPointList +AccessPointNotFound +AccessPointNotFoundException +AccessPoints +AccessPolicies +AccessPoliciesStatus +AccessPolicy +AccessPolicyDetail +AccessPolicyStats +AccessPolicySummary +AccessPreview +AccessPreviewFinding +AccessPreviewStatusReason +AccessPreviewSummary +AccessRights +AccessRole +AccessRoleArn +AccessRules +AccessScopeAnalysisFinding +AccessScopePath +AccessScopePathRequest +AccessStatus +AccessString +AccessSysfs +AccessTier +AccessToClusterDeniedFault +AccessToSnapshotDeniedFault +AccessToken +AccessTokenExpiration +AccessTokenSummary +AccessTokenValidity +AccessType +AccessUrl +Accesses +Accessibility +AccessibilityCaptionHints +Accessor +AccessorId +AccessorSummary +AccessorType +Accessors +Account +AccountActionRequiredException +AccountAggregation +AccountAggregationResponse +AccountAggregationSource +AccountAggregationSources +AccountAlias +AccountAliases +AccountAlreadyClosedException +AccountAlreadyRegisteredException +AccountAssignment +AccountAssignmentCreationRequestId +AccountAssignmentCreationStatus +AccountAssignmentDeletionRequestId +AccountAssignmentDeletionStatus +AccountAssignmentOperationStatus +AccountAssignmentOperationStatusMetadata +AccountAssignments +AccountAssignmentsCreationStatus +AccountAssignmentsDeletionStatus +AccountAssociationsListElement +AccountAttribute +AccountAttributeList +AccountAttributeValue +AccountAttributes +AccountAttributesMessage +AccountChannelLimitExceededException +AccountConfiguration +AccountCustomization +AccountDetail +AccountDetails +AccountEmail +AccountEnrollmentStatus +AccountEntityAggregate +AccountFilterType +AccountFindingsMetric +AccountFreeTrialInfo +AccountGateResult +AccountGrouping +AccountHasOngoingImportException +AccountHealth +AccountID +AccountId +AccountIds +AccountIdsToAdd +AccountIdsToRemove +AccountInfo +AccountInsightHealth +AccountLevel +AccountLevelBpaSync +AccountLevelPermissions +AccountLimit +AccountLimitExceededException +AccountLimits +AccountLinked +AccountMaxReadCapacityUnits +AccountMaxWriteCapacityUnits +AccountModification +AccountModifications +AccountName +AccountNotFoundException +AccountNotRegisteredException +AccountNumber +AccountOwnerNotVerifiedException +AccountPassword +AccountPolicy +AccountQuota +AccountQuotaName +AccountQuotas +AccountRecoverySetting +AccountRecoverySettingType +AccountRegisteredException +AccountScope +AccountSendingPausedException +AccountSettings +AccountSettingsDetail +AccountSetupInProgressException +AccountSharingInfo +AccountSharingInfoList +AccountState +AccountStatus +AccountStatusList +AccountStreamLimitExceededException +AccountSubscriptionStatus +AccountSummary +AccountSuspendedException +AccountTakeoverActionType +AccountTakeoverActionsType +AccountTakeoverRiskConfiguration +AccountTakeoverRiskConfigurationType +AccountType +AccountUsage +AccountWithRestoreAccess +Accounts +AccountsUrl +AccountsWithRestoreAccess +AccumulatedInferenceDataEndTime +AccumulatedInferenceDataStartTime +Accuracy +AccuracyCostTradeoff +AckModeRetryDurationSecs +AcknowledgeActionConfiguration +AcknowledgeAlarmActionRequest +AcknowledgeFlow +AcknowledgeJobInput +AcknowledgeJobOutput +AcknowledgeOrderReceiptRequest +AcknowledgeOrderReceiptResponse +AcknowledgeThirdPartyJobInput +AcknowledgeThirdPartyJobOutput +AcknowledgedAt +Acl +AclConfiguration +AclRule +AcmCertificateArn +AcquisitionPointId +Action +ActionAfterCompletion +ActionArn +ActionCondition +ActionConfiguration +ActionConfigurationProperty +ActionContext +ActionDeclaration +ActionDefinition +ActionDescription +ActionExecution +ActionExecutionDetail +ActionExecutionFilter +ActionExecutionInput +ActionExecutionOutput +ActionExecutionResult +ActionHistories +ActionHistory +ActionHistoryDetails +ActionID +ActionId +ActionIdentifier +ActionInvocation +ActionInvocations +ActionLocalIpDetails +ActionLocalPortDetails +ActionName +ActionNames +ActionNotFoundException +ActionOnFailure +ActionOperations +ActionParameter +ActionParameters +ActionPrefix +ActionRemoteIpDetails +ActionRemotePortDetails +ActionRequired +ActionRequiredCode +ActionRequiredInfo +ActionRevision +ActionSource +ActionState +ActionSubType +ActionSummaries +ActionSummary +ActionTarget +ActionTargetArn +ActionTargetArns +ActionTargets +ActionThreshold +ActionThresholdType +ActionThresholdValue +ActionToUse +ActionType +ActionTypeArtifactDetails +ActionTypeDeclaration +ActionTypeExecutor +ActionTypeId +ActionTypeIdentifier +ActionTypeNotFoundException +ActionTypePermissions +ActionTypeProperty +ActionTypeSettings +ActionTypeUrls +Actions +ActionsEnabled +ActionsGuarded +ActionsRequired +ActionsSuppressedBy +ActionsSuppressedReason +ActionsSuppressor +ActionsSuppressorExtensionPeriod +ActionsSuppressorWaitPeriod +Activate +ActivateAnomalyDetectorRequest +ActivateContactChannelRequest +ActivateDeviceIdentifierRequest +ActivateDeviceIdentifierResponse +ActivateEvaluationFormRequest +ActivateEvaluationFormResponse +ActivateEventSourceRequest +ActivateGatewayInput +ActivateGatewayOutput +ActivateKeySigningKeyRequest +ActivateKeySigningKeyResponse +ActivateNetworkSiteRequest +ActivateNetworkSiteResponse +ActivatePipelineInput +ActivateReadSetFilter +ActivateReadSetJobItem +ActivateReadSetSourceItem +ActivateTypeInput +ActivateTypeOutput +ActivateUserRequest +ActivateUserResponse +Activated +ActivatedRule +ActivatedRules +Activation +ActivationCode +ActivationId +ActivationKey +ActivationList +ActivationOverrideBehavior +ActivationState +ActivationStatus +ActivationUrl +Active +ActiveAssignments +ActiveAvailabilityZoneCount +ActiveChannelPipeline +ActiveContext +ActiveContextTimeToLive +ActiveDate +ActiveDeviceCount +ActiveDirectory +ActiveDirectoryBackupAttributes +ActiveDirectoryComputerAttribute +ActiveDirectoryConfiguration +ActiveDirectoryError +ActiveDirectoryId +ActiveDirectoryIdentityProvider +ActiveDirectoryName +ActiveDirectoryStatus +ActiveGameSessionCount +ActiveIAMPolicyAssignment +ActiveInput +ActiveInputAttachmentName +ActiveInputSwitchActionName +ActiveInstance +ActiveInstanceRefreshNotFoundFault +ActiveInstances +ActiveMQBrokerParameters +ActiveModelArn +ActiveModelVersion +ActiveModelVersionArn +ActiveMotionGraphicsActionName +ActiveMotionGraphicsUri +ActiveNodes +ActiveOperationArn +ActiveServerProcessCount +ActiveServicesCount +ActiveSlotsByChannel +ActiveSpeakerOnlyConfiguration +ActiveSpeakerPosition +ActiveStatementsExceededException +ActiveSubscribedDomains +ActiveTracing +ActiveTrustedKeyGroups +ActiveTrustedSigners +ActiveVersion +ActiveViolation +ActiveWatermarkProcess +Activities +ActivitiesResponse +ActivitiesType +Activity +ActivityDoesNotExist +ActivityFailedEventDetails +ActivityId +ActivityIds +ActivityLimitExceeded +ActivityListItem +ActivityMetrics +ActivityResponse +ActivityScheduleFailedEventDetails +ActivityScheduledEventDetails +ActivityStartedEventDetails +ActivityStatus +ActivityStreamEngineNativeAuditFieldsIncluded +ActivityStreamKinesisStreamName +ActivityStreamKmsKeyId +ActivityStreamMode +ActivityStreamPolicyStatus +ActivityStreamStatus +ActivitySucceededEventDetails +ActivityTask +ActivityTaskCancelRequestedEventAttributes +ActivityTaskCanceledEventAttributes +ActivityTaskCompletedEventAttributes +ActivityTaskFailedEventAttributes +ActivityTaskScheduledEventAttributes +ActivityTaskStartedEventAttributes +ActivityTaskStatus +ActivityTaskTimedOutEventAttributes +ActivityTimedOutEventDetails +ActivityType +ActivityTypeConfiguration +ActivityTypeDetail +ActivityTypeInfo +ActivityTypeInfos +ActivityTypes +ActivityWorkerLimitExceeded +ActorDoesNotExistException +Actual +ActualAmount +ActualBlockHourlyPrice +ActualEndTime +ActualFirewallEndpoint +ActualFirewallSubnetId +ActualFirewallSubnetRoutes +ActualIncrementalBackupSizeInMegaBytes +ActualInternetGatewayRoutes +ActualProperties +ActualSpend +ActualStartTime +ActualValue +Actuator +AdAvailOffset +AdBreak +AdBreakMetadata +AdBreaks +AdDecisionServerUrl +AdHocFilteringOption +AdMarkerHls +AdMarkerPassthrough +AdMarkers +AdMarkupType +AdSegmentUrlPrefix +AdTriggers +AdaptiveQuantization +Add +AddAllocationResourceTags +AddAllowedPrincipals +AddApplicationCloudWatchLoggingOptionRequest +AddApplicationCloudWatchLoggingOptionResponse +AddApplicationInputProcessingConfigurationRequest +AddApplicationInputProcessingConfigurationResponse +AddApplicationInputRequest +AddApplicationInputResponse +AddApplicationOutputRequest +AddApplicationOutputResponse +AddApplicationReferenceDataSourceRequest +AddApplicationReferenceDataSourceResponse +AddApplicationVpcConfigurationRequest +AddApplicationVpcConfigurationResponse +AddArguments +AddAssociationRequest +AddAssociationResponse +AddAttachmentsToSetRequest +AddAttachmentsToSetResponse +AddAttributesActivity +AddAttributesToFindingsRequest +AddAttributesToFindingsResponse +AddAvailabilityZonesInput +AddAvailabilityZonesOutput +AddBridgeFlowSourceRequest +AddBridgeNetworkOutputRequest +AddBridgeNetworkSourceRequest +AddBridgeOutputRequest +AddBridgeOutputsRequest +AddBridgeOutputsResponse +AddBridgeSourceRequest +AddBridgeSourcesRequest +AddBridgeSourcesResponse +AddCacheInput +AddCacheOutput +AddClientIDToOpenIDConnectProviderRequest +AddColumnName +AddCommunicationToCaseRequest +AddCommunicationToCaseResponse +AddCustomAttributesRequest +AddCustomRoutingEndpointsRequest +AddCustomRoutingEndpointsResponse +AddDraftAppVersionResourceMappingsRequest +AddDraftAppVersionResourceMappingsResponse +AddEgressGatewayBridgeRequest +AddEndpointsRequest +AddEndpointsResponse +AddEntries +AddFacetToObject +AddFacetToObjectRequest +AddFlowMediaStreamsRequest +AddFlowMediaStreamsResponse +AddFlowOutputs420Exception +AddFlowOutputsRequest +AddFlowOutputsResponse +AddFlowSourcesRequest +AddFlowSourcesResponse +AddFlowVpcInterfacesRequest +AddFlowVpcInterfacesResponse +AddGatewayLoadBalancerArns +AddGwMetadata +AddHeaderAction +AddIamRoles +AddIdleTimeBetweenReads +AddInId +AddIngressGatewayBridgeRequest +AddIns +AddInstanceFleetInput +AddInstanceFleetOutput +AddInstanceGroupsInput +AddInstanceGroupsOutput +AddIpRoutesRequest +AddIpamOperatingRegion +AddJobFlowStepsInput +AddJobFlowStepsOutput +AddLFTagsToResourceRequest +AddLFTagsToResourceResponse +AddLayerVersionPermissionRequest +AddLayerVersionPermissionResponse +AddLicenseSpecifications +AddListenerCertificatesInput +AddListenerCertificatesOutput +AddMaintenance +AddMediaStreamRequest +AddNetworkLoadBalancerArns +AddNetworkServices +AddNotificationChannelRequest +AddNotificationChannelResponse +AddNotificationChannelsRequest +AddNotificationChannelsResponse +AddObject +AddObjectInput +AddOn +AddOnRequest +AddOperatingRegions +AddOutputRequest +AddPermissionInput +AddPermissionRequest +AddPermissionResponse +AddPrefixListEntry +AddProfileKeyRequest +AddProfileKeyResponse +AddProfilePermissionRequest +AddProfilePermissionResponse +AddPublicKeys +AddRecordTimestamp +AddRegionAction +AddRegionRequest +AddReplicaRegions +AddResourcePermissionsRequest +AddResourcePermissionsResponse +AddRoleToDBClusterMessage +AddRoleToDBInstanceMessage +AddRoleToInstanceProfileRequest +AddRouteTableIds +AddSecurityGroupIds +AddSourceIdentifierToSubscriptionMessage +AddSourceIdentifierToSubscriptionResult +AddStorageSystemRequest +AddStorageSystemResponse +AddSubnetArns +AddSubnetIds +AddSubnets +AddSupplementalLogging +AddSupportedIpAddressTypes +AddTags +AddTagsInput +AddTagsOutput +AddTagsRequest +AddTagsToCertificateRequest +AddTagsToOnPremisesInstancesInput +AddTagsToResourceInput +AddTagsToResourceMessage +AddTagsToResourceOutput +AddTagsToResourceRequest +AddTagsToResourceResponse +AddTagsToStreamInput +AddTagsToVaultInput +AddTexture +AddThingToBillingGroupRequest +AddThingToThingGroupRequest +AddThingsToThingGroupParams +AddTrailingPaddingCharacter +AddTransitGatewayCidrBlocks +AddUploadBufferInput +AddUploadBufferOutput +AddUserToGroupRequest +AddWorkingStorageInput +AddWorkingStorageOutput +AddWorkloadRequest +AddWorkloadResponse +AddedDateTime +AddedPrincipal +AddedPrincipals +AddedToClusterTime +AdditionalAccounts +AdditionalArchivedLogDestId +AdditionalArtifacts +AdditionalAttribute +AdditionalAttributes +AdditionalAuditContext +AdditionalAuthTypes +AdditionalAuthenticationProvider +AdditionalAuthenticationProviders +AdditionalBootstrapServers +AdditionalCodeRepositories +AdditionalCodeRepositoryEquals +AdditionalConfigs +AdditionalConfiguration +AdditionalConstraints +AdditionalContactEmailAddresses +AdditionalDashboardIds +AdditionalDataPending +AdditionalDataSources +AdditionalDataset +AdditionalDatasets +AdditionalDeltaOptions +AdditionalDetail +AdditionalDetailType +AdditionalDetails +AdditionalHudiOptions +AdditionalInferenceSpecificationDefinition +AdditionalInferenceSpecifications +AdditionalInferenceSpecificationsToAdd +AdditionalInfo +AdditionalInformation +AdditionalInstanceConfiguration +AdditionalLanguageCodes +AdditionalLimit +AdditionalLimits +AdditionalLocations +AdditionalManifests +AdditionalMasterSecurityGroups +AdditionalMetadata +AdditionalMetrics +AdditionalOccurrences +AdditionalOptions +AdditionalPlanOptionsMap +AdditionalPlayerCount +AdditionalRegions +AdditionalResources +AdditionalResponseAttributes +AdditionalResponseFields +AdditionalResultAttribute +AdditionalResultAttributeValue +AdditionalRoutesAvailable +AdditionalRunOptions +AdditionalSchemaElements +AdditionalSearchKey +AdditionalSearchKeys +AdditionalSlaveSecurityGroups +AdditionalStagingLabelsToDownload +AdditionalStatistics +AdditionalTreatments +AdditionalVersionWeights +Addon +AddonDetails +AddonHealth +AddonInfo +AddonIssue +AddonStatus +AddonVersion +AddonVersionInfo +Address +Address1 +Address2 +Address3 +Address4 +AddressAllocationIds +AddressAttribute +AddressBook +AddressBookArn +AddressBookData +AddressBooks +AddressConfiguration +AddressCount +AddressDefinition +AddressExternalId +AddressFamily +AddressField +AddressFields +AddressId +AddressLine1 +AddressLine2 +AddressLine3 +AddressNumber +AddressTransfer +AddressTransferStatus +AddressTransfers +AddressType +Addresses +AddressingType +AdiFilename +AdjacentParentShardId +AdjacentShardToMerge +Adjustable +Adjustment +AdjustmentType +AdjustmentTypes +Adjustments +Admin +AdminAccount +AdminAccountId +AdminAccountSummary +AdminAccounts +AdminAddUserToGroupRequest +AdminConfirmSignUpRequest +AdminContact +AdminCreateUserConfig +AdminCreateUserConfigType +AdminCreateUserRequest +AdminCreateUserResponse +AdminDeleteUserAttributesRequest +AdminDeleteUserRequest +AdminDetectorId +AdminDisableProviderForUserRequest +AdminDisableUserRequest +AdminEnableUserRequest +AdminForgetDeviceRequest +AdminGetDeviceRequest +AdminGetDeviceResponse +AdminGetUserRequest +AdminGetUserResponse +AdminGroup +AdminInitiateAuthRequest +AdminInitiateAuthResponse +AdminLinkProviderForUserRequest +AdminListDevicesRequest +AdminListDevicesResponse +AdminListGroupsForUserRequest +AdminListGroupsForUserResponse +AdminListUserAuthEventsRequest +AdminListUserAuthEventsResponse +AdminPassword +AdminPrivacy +AdminRemoveUserFromGroupRequest +AdminResetUserPasswordRequest +AdminRespondToAuthChallengeRequest +AdminRespondToAuthChallengeResponse +AdminScope +AdminSetUserMFAPreferenceRequest +AdminSetUserPasswordRequest +AdminSetUserSettingsRequest +AdminStatus +AdminUpdateAuthEventFeedbackRequest +AdminUpdateDeviceStatusRequest +AdminUpdateUserAttributesRequest +AdminUserGlobalSignOutRequest +AdminUserList +AdminUsername +AdministrationRoleARN +AdministrativeAction +AdministrativeActionFailureDetails +AdministrativeActionType +AdministrativeActions +Administrator +AdministratorId +Administrators +AdsOnDeliveryRestrictions +AdvancedBackupSetting +AdvancedBackupSettings +AdvancedCostOptimizationMetrics +AdvancedDataProtectionMetrics +AdvancedEventSelector +AdvancedEventSelectors +AdvancedFieldSelector +AdvancedInputFilter +AdvancedInputFilterSettings +AdvancedOptions +AdvancedOptionsStatus +AdvancedRecognitionSetting +AdvancedSecurityEnabled +AdvancedSecurityMode +AdvancedSecurityOptions +AdvancedSecurityOptionsInput +AdvancedSecurityOptionsStatus +AdvertiseByoipCidrRequest +AdvertiseByoipCidrResponse +AdvertiseByoipCidrResult +AdvisoryIds +AfdSignaling +AffectedEntity +AffectedResource +AffectedResources +AffectedSensorCount +AffectedSubnets +Affiliated +Affinity +After +AfterConnectScript +AfterContactWorkTimeLimit +AfterCreationDate +AfterFragmentNumber +AgeRange +AgentAlreadyRunningAssessment +AgentArn +AgentArns +AgentAvailabilityTimer +AgentConfig +AgentConfiguration +AgentConfigurationStatus +AgentContactReference +AgentContactState +AgentCount +AgentDetails +AgentFilter +AgentInfo +AgentInstallerUrl +AgentListEntry +AgentMetrics +AgentName +AgentNetworkInfo +AgentOrchestrationConfig +AgentPreview +AgentStatus +AgentStatusARN +AgentStatusId +AgentStatusReference +AgentStatusSummary +AgentStatusSummaryList +AgentStatusTypes +AgentTurnResult +AgentTurnSpecification +AgentVersion +AgentVersions +AgentlessDialerConfig +Agents +AgentsAlreadyRunningAssessmentException +AggFunc +Aggregate +AggregateBy +AggregateColumn +AggregateComplianceByConfigRule +AggregateComplianceByConfigRules +AggregateComplianceByConformancePack +AggregateComplianceByConformancePacks +AggregateComplianceCount +AggregateComplianceCounts +AggregateConformancePackCompliance +AggregateConformancePackComplianceCount +AggregateConformancePackComplianceFilters +AggregateConformancePackComplianceSummaries +AggregateConformancePackComplianceSummary +AggregateConformancePackComplianceSummaryFilters +AggregateEvaluationResult +AggregateEvaluationResults +AggregateKeyType +AggregateOperation +AggregateResourceIdentifier +AggregateStatus +AggregateValue +AggregatedLogOddsMetric +AggregatedProfileTime +AggregatedSourceStatus +AggregatedSourceStatusList +AggregatedUtterancesFilter +AggregatedUtterancesSortBy +AggregatedUtterancesSummary +AggregatedValue +AggregatedVariablesImpactExplanation +AggregatedVariablesImportanceMetrics +Aggregates +Aggregation +AggregationAuthorization +AggregationAuthorizationArn +AggregationAuthorizations +AggregationConfig +AggregationConstraint +AggregationEnabled +AggregationFunction +AggregationFunctionParameters +AggregationSortConfiguration +AggregationSortConfigurations +AggregationStatistic +AggregationType +AggregationVisibility +Aggregations +Aggregator +AggregatorType +Aggregators +AggressiveMode +Aggs +Agreement +AgreementId +Agreements +AiffSettings +AirflowConfigurationOptions +AirflowVersion +Alarm +AlarmARN +AlarmAction +AlarmActions +AlarmArn +AlarmCapabilities +AlarmConfiguration +AlarmConfigurationUpdatedTimestamp +AlarmDescription +AlarmEventActions +AlarmHistoryItem +AlarmHistoryItems +AlarmIdentifier +AlarmModelSummary +AlarmModelVersionSummary +AlarmName +AlarmNamePrefix +AlarmNames +AlarmNotification +AlarmRecommendation +AlarmRoleArn +AlarmRule +AlarmSpecification +AlarmState +AlarmStateInformation +AlarmSummary +AlarmType +AlarmTypes +Alarms +AlarmsLimitExceededException +AlbumArt +AlbumArtFormat +Alert +AlertArn +AlertCode +AlertDescription +AlertFilters +AlertManagerDefinitionDescription +AlertManagerDefinitionStatus +AlertMessage +AlertName +AlertSensitivityThreshold +AlertStatus +AlertSummary +AlertSummaryList +AlertTarget +AlertType +AlexaForBusinessMetadata +AlexaForBusinessRoomArn +AlexaSkillIds +AlexaSkillStatus +AlfrescoConfiguration +Algorithm +AlgorithmArn +AlgorithmControl +AlgorithmDescription +AlgorithmImage +AlgorithmName +AlgorithmSpecification +AlgorithmStatus +AlgorithmStatusDetails +AlgorithmStatusItem +AlgorithmSummary +AlgorithmSummaryList +AlgorithmValidationProfile +AlgorithmValidationSpecification +AlgorithmicStemming +AlgorithmsConfig +Alias +AliasArn +AliasAttributes +AliasConfiguration +AliasExistsException +AliasICPRecordal +AliasICPRecordals +AliasId +AliasIds +AliasListEntry +AliasName +AliasPrefix +AliasRoutingConfiguration +AliasTarget +Aliased +Aliases +AliasesToAdd +AliasesToDelete +AlignedEndTime +AlignedStartTime +Alignment +All +AllAccountsEnabled +AllAvailabilityZones +AllAwsRegions +AllColumnsRequested +AllDataPointsVisibility +AllOrganizationalUnitsEnabled +AllParameters +AllPolicyTypesEnabled +AllQueryArguments +AllRegions +AllRegionsEnabled +AllRowsWildcard +AllSheets +AllocateAddressRequest +AllocateAddressResult +AllocateConnectionOnInterconnectRequest +AllocateHostedConnectionRequest +AllocateHostsRequest +AllocateHostsResult +AllocateIpamPoolCidrRequest +AllocateIpamPoolCidrResult +AllocatePrivateVirtualInterfaceRequest +AllocatePublicVirtualInterfaceRequest +AllocateStaticIpRequest +AllocateStaticIpResult +AllocateTransitVirtualInterfaceRequest +AllocateTransitVirtualInterfaceResult +AllocatedCapacity +AllocatedDpus +AllocatedProvisionedConcurrentExecutions +AllocatedStorage +AllocatedUsageQuantity +AllocationDefaultNetmaskLength +AllocationId +AllocationIdNotFoundException +AllocationIds +AllocationMaxNetmaskLength +AllocationMinNetmaskLength +AllocationResourceTags +AllocationStrategy +AllocationTime +AllocationType +Allow +AllowAction +AllowActions +AllowAdminCreateUserOnly +AllowAllTrafficToEndpoint +AllowAssociation +AllowCancelResize +AllowCheckIn +AllowClassicFlow +AllowCookies +AllowCopyImage +AllowCredentials +AllowCustomRoutingTrafficRequest +AllowDataLoss +AllowDeferredExecution +AllowDenyList +AllowDnsResolutionFromRemoteVpc +AllowEarlyCheckIn +AllowEgressFromLocalClassicLinkToRemoteVpc +AllowEgressFromLocalVpcToRemoteClassicLink +AllowEngineModeChange +AllowExternalDataFiltering +AllowForceDelete +AllowFullTableExternalDataAccess +AllowHeaders +AllowListCriteria +AllowListStatus +AllowListSummary +AllowMajorVersionUpdate +AllowMajorVersionUpgrade +AllowMessages +AllowMethods +AllowNonRestoredState +AllowNotifications +AllowOrigins +AllowProfileCreation +AllowPubliclyAccessibleConsumers +AllowQuotedRecordDelimiter +AllowReassignment +AllowReassociation +AllowReferers +AllowResources +AllowSelectNestedTables +AllowSelfManagement +AllowSingleColumn +AllowSsh +AllowSudo +AllowUnassociatedTargets +AllowUnauthenticatedIdentities +AllowUpdate +AllowUsersToChangePassword +AllowVersionUpgrade +Allowed +AllowedAccessControlTags +AllowedAggregations +AllowedAllVPCs +AllowedAttempts +AllowedByOrganizations +AllowedByPermissionsBoundary +AllowedDomains +AllowedFeatures +AllowedGroupsColumnName +AllowedHeaders +AllowedIPRange +AllowedInputTypes +AllowedInstanceTypes +AllowedIps +AllowedLocations +AllowedMethods +AllowedMonitorCapabilities +AllowedNodeTypeModificationsMessage +AllowedOAuthFlows +AllowedOAuthFlowsUserPoolClient +AllowedOAuthScopes +AllowedOperations +AllowedOrigins +AllowedPattern +AllowedPrincipal +AllowedPrincipals +AllowedPublishers +AllowedRenditionSize +AllowedRenditions +AllowedStatistics +AllowedTargets +AllowedVPCs +AllowedValue +AllowedValues +AllowsMultipleInstanceTypes +AllowsPublicReadAccess +AllowsPublicWriteAccess +AllowsVpcAndNonVpcInstanceMemberships +AlphaBehavior +Alphabet +AlpnPolicy +AlreadyExistsException +AlreadyExistsFault +AlreadyInOrganizationException +AlreadyStreamedException +AlternateBandColorsVisibility +AlternateBandEvenColor +AlternateBandOddColor +AlternateContact +AlternateContactType +AlternateDataSourceParameters +AlternateIdentifier +AlternateKey +AlternatePathHint +AlternatePathHints +AlternateSoftwareMetadata +AlternateSoftwares +AlternateTransferFunctionSei +Alternative +AlternativeTransferFunction +Alternatives +AmazonCodeGuruProfiler +AmazonCodeGuruProfilerIntegration +AmazonElasticsearchParameters +AmazonForecastRoleArn +AmazonId +AmazonIdEventTopic +AmazonManagedKafkaEventSourceConfig +AmazonOpenSearchParameters +AmazonOpenSearchServerlessBufferingHints +AmazonOpenSearchServerlessDestinationConfiguration +AmazonOpenSearchServerlessDestinationDescription +AmazonOpenSearchServerlessDestinationUpdate +AmazonOpenSearchServerlessRetryOptions +AmazonProvidedIpv6CidrBlock +AmazonRedshiftAdvancedOption +AmazonRedshiftNodeData +AmazonRedshiftSource +AmazonRedshiftTarget +AmazonSideAsn +AmazonTranscribeCallAnalyticsProcessorConfiguration +AmazonTranscribeProcessorConfiguration +AmazonopensearchserviceBufferingHints +AmazonopensearchserviceDestinationConfiguration +AmazonopensearchserviceDestinationDescription +AmazonopensearchserviceDestinationUpdate +AmazonopensearchserviceRetryOptions +AmbiguousRoleResolution +AmdSevSnp +AmexCardSecurityCodeVersion1 +AmexCardSecurityCodeVersion2 +Ami +AmiAggregation +AmiAggregationResponse +AmiAssociationScope +AmiDistributionConfiguration +AmiId +AmiLaunchIndex +AmiVersion +AmortizedCommitment +AmortizedRecurringCommitment +AmortizedRecurringFee +AmortizedUpfrontCommitment +AmortizedUpfrontFee +Amount +AmountInUsd +AmplifyFeatureFlags +AmplifyMetaConfig +Amplitude +AmplitudeConnectorProfileCredentials +AmplitudeSourceProperties +AmznClientToken +Analyses +Analysis +AnalysisAclRule +AnalysisArn +AnalysisComponent +AnalysisDefaults +AnalysisDefinition +AnalysisEndTime +AnalysisError +AnalysisFindings +AnalysisId +AnalysisLoadBalancerListener +AnalysisLoadBalancerTarget +AnalysisOptions +AnalysisPacketHeader +AnalysisParameter +AnalysisReport +AnalysisReportId +AnalysisReportSummary +AnalysisReports +AnalysisResult +AnalysisResultLocation +AnalysisRouteTableRoute +AnalysisRule +AnalysisRuleAggregation +AnalysisRuleCustom +AnalysisRuleList +AnalysisSchema +AnalysisScheme +AnalysisSchemeLanguage +AnalysisSchemeName +AnalysisSchemeNames +AnalysisSchemeStatus +AnalysisSchemes +AnalysisSearchFilter +AnalysisSecurityGroupRule +AnalysisSourceEntity +AnalysisSourceTemplate +AnalysisStartTime +AnalysisStartTimeBegin +AnalysisStartTimeEnd +AnalysisStatus +AnalysisSummary +AnalysisSummaryList +AnalysisTemplate +AnalysisTemplateSummary +AnalysisTypes +Analytics +AnalyticsAndOperator +AnalyticsBinBySpecification +AnalyticsBinKey +AnalyticsConfiguration +AnalyticsConfigurationList +AnalyticsConfigurationType +AnalyticsEndpointId +AnalyticsExportDestination +AnalyticsIntentFilter +AnalyticsIntentGroupByKey +AnalyticsIntentGroupBySpecification +AnalyticsIntentMetric +AnalyticsIntentMetricResult +AnalyticsIntentNodeSummary +AnalyticsIntentResult +AnalyticsIntentStageFilter +AnalyticsIntentStageGroupByKey +AnalyticsIntentStageGroupBySpecification +AnalyticsIntentStageMetric +AnalyticsIntentStageMetricResult +AnalyticsIntentStageResult +AnalyticsMetadata +AnalyticsMetadataType +AnalyticsPathFilter +AnalyticsS3BucketDestination +AnalyticsSessionFilter +AnalyticsSessionGroupByKey +AnalyticsSessionGroupBySpecification +AnalyticsSessionMetric +AnalyticsSessionMetricResult +AnalyticsSessionResult +AnalyticsUtteranceAttribute +AnalyticsUtteranceAttributeResult +AnalyticsUtteranceFilter +AnalyticsUtteranceGroupByKey +AnalyticsUtteranceGroupBySpecification +AnalyticsUtteranceMetric +AnalyticsUtteranceMetricResult +AnalyticsUtteranceResult +AnalyzeDocumentModelVersion +AnalyzeDocumentRequest +AnalyzeDocumentResponse +AnalyzeExpenseModelVersion +AnalyzeExpenseRequest +AnalyzeExpenseResponse +AnalyzeIDDetections +AnalyzeIDModelVersion +AnalyzeIDRequest +AnalyzeIDResponse +AnalyzeLendingModelVersion +AnalyzedEniCount +AnalyzedResource +AnalyzedResourceCount +AnalyzedResourceSummary +AnalyzedTime +AnalyzerSummary +AncestorIds +Anchor +AnchorDateConfiguration +AnchorOption +AncillarySourceSettings +And +AndAllFilters +AndConditions +AndStatement +Android +AndroidPushNotificationTemplate +Annotation +AnnotationConsolidationConfig +AnnotationConsolidationLambdaArn +AnnotationDataS3Uri +AnnotationImportItemDetail +AnnotationImportItemSource +AnnotationImportJobItem +AnnotationStoreItem +AnnotationStoreVersionItem +AnnotationValue +Annotations +AnnouncementArn +AnnouncementDirection +Anomalies +AnomalousLogGroup +AnomalousLogGroups +AnomalousService +Anomaly +AnomalyClass +AnomalyDateInterval +AnomalyDetector +AnomalyDetectorArn +AnomalyDetectorConfig +AnomalyDetectorConfigSummary +AnomalyDetectorConfiguration +AnomalyDetectorDataQualityMetric +AnomalyDetectorDataQualityMetricList +AnomalyDetectorDescription +AnomalyDetectorFrequency +AnomalyDetectorName +AnomalyDetectorSummary +AnomalyDetectorSummaryList +AnomalyDetectorTypes +AnomalyDetectors +AnomalyEndDate +AnomalyGroup +AnomalyGroupId +AnomalyGroupScore +AnomalyGroupStatistics +AnomalyGroupSummary +AnomalyGroupSummaryList +AnomalyGroupTimeSeries +AnomalyGroupTimeSeriesFeedback +AnomalyId +AnomalyInstance +AnomalyMask +AnomalyMonitor +AnomalyMonitors +AnomalyReportedTimeRange +AnomalyResource +AnomalyResources +AnomalyScore +AnomalySourceDetails +AnomalySourceMetadata +AnomalyStartDate +AnomalySubscription +AnomalySubscriptions +AnomalyTimeRange +AnonymousAuthDisableDate +AnonymousAuthEnabled +AnonymousUserArn +AnonymousUserDashboardEmbeddingConfiguration +AnonymousUserDashboardVisualEmbeddingConfiguration +AnonymousUserEmbeddingExperienceConfiguration +AnonymousUserQSearchBarEmbeddingConfiguration +AnonymousUserSnapshotJobResult +AnonymousUsers +Answer +AnswerKey +AnswerMachineDetectionConfig +AnswerSummaries +AnswerSummary +Answers +AntennaDemodDecodeDetails +AntennaDownlinkConfig +AntennaDownlinkDemodDecodeConfig +AntennaUplinkConfig +AntiAlias +AntipatternReportResult +AntipatternSeveritySummary +Any +AnywhereConfiguration +ApId +ApacheKafkaCluster +ApacheKafkaClusterDescription +Api +ApiAssociation +ApiCache +ApiCallDetails +ApiDescription +ApiDestination +ApiDestinationArn +ApiDestinationState +ApiDestinations +ApiEndpoint +ApiGatewayApiAsset +ApiGatewayDomainName +ApiGatewayId +ApiGatewayManaged +ApiGatewayProxy +ApiGatewayProxyConfig +ApiGatewayProxyInput +ApiGatewayProxySummary +ApiId +ApiKey +ApiKeyAuthParameters +ApiKeyCredential +ApiKeyCredentials +ApiKeyFilter +ApiKeyIds +ApiKeyLimitExceededException +ApiKeyName +ApiKeyRequired +ApiKeyRestrictions +ApiKeySelectionExpression +ApiKeySource +ApiKeyValidityOutOfBoundsException +ApiKeyValue +ApiKeys +ApiLimitExceededException +ApiMapping +ApiMappingId +ApiMappingKey +ApiMappingSelectionExpression +ApiName +ApiPassthrough +ApiSpecificationDownloadUrl +ApiSpecificationDownloadUrlExpiresAt +ApiSpecificationMd5Hash +ApiSpecificationUploadUrl +ApiSpecificationUploadUrlExpiresAt +ApiStage +App +AppArn +AppAssessment +AppAssessmentSummary +AppAuthorization +AppAuthorizationSummary +AppBlock +AppBlockArn +AppBlockBuilder +AppBlockBuilderAppBlockAssociation +AppBlockBuilderAppBlockAssociations +AppBlockBuilderErrors +AppBlockBuilderName +AppBlockBuilderStateChangeReason +AppBlockBuilders +AppBlockErrors +AppBlocks +AppBoundaryKey +AppBundle +AppBundleSummary +AppComponent +AppComponentCompliance +AppCookieStickinessPolicies +AppCookieStickinessPolicy +AppDetails +AppEui +AppFlowConfig +AppId +AppIdClientRegex +AppIds +AppImageConfigArn +AppImageConfigDetails +AppImageConfigName +AppImageConfigs +AppInputSource +AppInstance +AppInstanceAdmin +AppInstanceAdminArn +AppInstanceAdminSummary +AppInstanceAdmins +AppInstanceArn +AppInstanceBot +AppInstanceBotArn +AppInstanceBotSummary +AppInstanceBots +AppInstanceDataType +AppInstanceRetentionSettings +AppInstanceStreamingConfiguration +AppInstanceStreamingConfigurations +AppInstanceSummary +AppInstanceUser +AppInstanceUserArn +AppInstanceUserEndpoint +AppInstanceUserEndpointSummary +AppInstanceUserEndpoints +AppInstanceUserId +AppInstanceUserMembershipSummary +AppInstanceUserSummary +AppInstanceUsers +AppInstances +AppIntegrationsConfiguration +AppKey +AppLogsEnabled +AppManaged +AppMonitor +AppMonitorConfiguration +AppMonitorDetails +AppMonitorName +AppMonitorSummaries +AppMonitorSummary +AppName +AppNetworkAccessType +AppPackageName +AppRegistryArn +AppRegistryConfiguration +AppSKey +AppSecurityGroupManagement +AppServerPrivateKey +AppSource +AppSpecContent +AppSpecification +AppSummary +AppSyncRuntime +AppTitle +AppType +AppTypeEquals +AppUnitError +AppValidationConfiguration +AppValidationOutput +AppVersion +AppVersionCode +AppVersionSummary +AppVisibility +AppendAccessString +AppendSourcePath +AppflowIntegration +AppflowIntegrationWorkflowAttributes +AppflowIntegrationWorkflowMetrics +AppflowIntegrationWorkflowStep +ApplianceModeSupport +Applicability +Application +ApplicationARN +ApplicationAggregatedStatus +ApplicationAlreadyExistsException +ApplicationArn +ApplicationArns +ApplicationCode +ApplicationCodeConfiguration +ApplicationCodeConfigurationDescription +ApplicationCodeConfigurationUpdate +ApplicationCodeUpdate +ApplicationComponent +ApplicationComponentDetail +ApplicationComponentList +ApplicationComponentStatusSummary +ApplicationComponentStrategy +ApplicationComponentSummary +ApplicationConfig +ApplicationConfiguration +ApplicationConfigurationDescription +ApplicationConfigurationUpdate +ApplicationCredential +ApplicationDPUSizes +ApplicationDateRangeKpiResponse +ApplicationDependencySummary +ApplicationDescription +ApplicationDescriptionMessage +ApplicationDescriptionsMessage +ApplicationDetail +ApplicationDoesNotExistException +ApplicationDomain +ApplicationFleetAssociation +ApplicationFleetAssociations +ApplicationId +ApplicationIdentifier +ApplicationIds +ApplicationInfo +ApplicationInfoList +ApplicationInstance +ApplicationInstanceId +ApplicationInstanceIdToReplace +ApplicationInstances +ApplicationIntegrationURL +ApplicationLayerAutomaticResponseConfiguration +ApplicationLimitExceededException +ApplicationMaintenanceConfigurationDescription +ApplicationMaintenanceConfigurationUpdate +ApplicationMaintenanceWindowEndTime +ApplicationMaintenanceWindowStartTime +ApplicationMaintenanceWindowStartTimeUpdate +ApplicationMetrics +ApplicationMode +ApplicationName +ApplicationNameRequiredException +ApplicationNames +ApplicationPermissions +ApplicationPolicies +ApplicationPolicyStatement +ApplicationPreferences +ApplicationQuota +ApplicationResourceLifecycleConfig +ApplicationResourceLifecycleDescriptionMessage +ApplicationResponse +ApplicationRestoreConfiguration +ApplicationRestoreConfigurationDescription +ApplicationRestoreType +ApplicationRuntimeId +ApplicationServerPublicKey +ApplicationSettings +ApplicationSettingsJourneyLimits +ApplicationSettingsResource +ApplicationSettingsResponse +ApplicationSnapshotConfiguration +ApplicationSnapshotConfigurationDescription +ApplicationSnapshotConfigurationUpdate +ApplicationSource +ApplicationSourceConfig +ApplicationSources +ApplicationState +ApplicationStateList +ApplicationStatus +ApplicationSuccessFeedbackRoleArn +ApplicationSummaries +ApplicationSummary +ApplicationSummaryList +ApplicationTransactionCounter +ApplicationType +ApplicationUpdate +ApplicationVersion +ApplicationVersionArn +ApplicationVersionDescription +ApplicationVersionDescriptionMessage +ApplicationVersionDescriptionsMessage +ApplicationVersionDetail +ApplicationVersionId +ApplicationVersionLifecycleConfig +ApplicationVersionQuota +ApplicationVersionRolledBackFrom +ApplicationVersionRolledBackTo +ApplicationVersionSummaries +ApplicationVersionSummary +ApplicationVersionUpdatedFrom +ApplicationVersions +Applications +ApplicationsResponse +AppliedColorSpaceConversion +AppliedDdls +AppliedDeletes +AppliedExtension +AppliedExtensions +AppliedInserts +AppliedSchemaArn +AppliedSettings +AppliedTerminologies +AppliedTerminology +AppliedUpdates +AppliedValue +ApplyAction +ApplyArchiveRuleRequest +ApplyEnvironmentManagedActionRequest +ApplyEnvironmentManagedActionResult +ApplyFontColor +ApplyImmediately +ApplyMapping +ApplyMethod +ApplyOn +ApplyOnlyAtCronInterval +ApplyPendingMaintenance +ApplyPendingMaintenanceActionMessage +ApplyPendingMaintenanceActionResponse +ApplyPendingMaintenanceActionResult +ApplySchemaRequest +ApplySchemaResponse +ApplySecurityGroupsToClientVpnTargetNetworkRequest +ApplySecurityGroupsToClientVpnTargetNetworkResult +ApplySecurityGroupsToLoadBalancerInput +ApplySecurityGroupsToLoadBalancerOutput +ApplyServerSideEncryptionByDefault +ApplyStatus +ApplyTo +ApplyToAllRegions +ApplyType +Approval +ApprovalAlreadyCompletedException +ApprovalDate +ApprovalDescription +ApprovalModel +ApprovalResult +ApprovalRule +ApprovalRuleContentRequiredException +ApprovalRuleDoesNotExistException +ApprovalRuleEventMetadata +ApprovalRuleNameAlreadyExistsException +ApprovalRuleNameRequiredException +ApprovalRuleOverriddenEventMetadata +ApprovalRuleTemplate +ApprovalRuleTemplateContentRequiredException +ApprovalRuleTemplateDoesNotExistException +ApprovalRuleTemplateInUseException +ApprovalRuleTemplateNameAlreadyExistsException +ApprovalRuleTemplateNameRequiredException +ApprovalRules +ApprovalStateChangedEventMetadata +ApprovalStateRequiredException +ApprovalThresholdPolicy +ApprovalTime +ApproveAfterDays +ApproveAssignmentRequest +ApproveSkillRequest +ApproveUntilDate +ApprovedOrigins +ApprovedPatches +ApprovedPatchesComplianceLevel +ApprovedPatchesEnableNonSecurity +ApprovedVersion +ApproximateAggregateValue +ApproximateArrivalTimestamp +ApproximateAssetCount +ApproximateCount +ApproximateCreationDateTime +ApproximateDurationSeconds +ApproximateNumberOfMessagesMoved +ApproximateNumberOfMessagesToMove +ApproximateResultCount +ApproximateStartTime +ApproximateTime +ApproximateTotalCount +ApproximateUniqueCount +ApproximateValue +Apps +AppsCount +AppsList +AppsListArn +AppsListData +AppsListDataSummary +AppsLists +AppstreamAgentVersion +AquaConfiguration +AquaConfigurationStatus +AquaStatus +ArbitraryPatternLimits +Arc +ArcAngle +ArcAxis +ArcAxisConfiguration +ArcAxisDisplayRange +ArcConfiguration +ArcOptions +ArcThickness +Arch +ArchitecturalDesign +Architecture +ArchitectureTypes +Architectures +ArchivalBackupArn +ArchivalCompleteTime +ArchivalDateTime +ArchivalReason +ArchivalSummary +Archive +ArchiveAllowedFlag +ArchiveApplicationRequest +ArchiveArn +ArchiveCdnSettings +ArchiveContainerSettings +ArchiveCreationOutput +ArchiveDescription +ArchiveFindingsRequest +ArchiveGroupSettings +ArchiveId +ArchiveName +ArchiveOutputSettings +ArchiveRetainRule +ArchiveRule +ArchiveRuleSummary +ArchiveS3Settings +ArchiveSHA256TreeHash +ArchiveSizeInBytes +ArchiveStatus +ArchiveWaveRequest +Archived +ArchivedLogDestId +ArchivedLogsOnly +Archives +AreaCode +AreaOfInterest +AreaStyleSettings +AreaUnderPRCurve +Args +ArgumentException +Arguments +ArgumentsMap +Arib +AribCaptionsPid +AribCaptionsPidControl +AribDestinationSettings +AribSourceSettings +Arn +ArnNotSupportedException +Arns +ArrayColumnInfo +ArrayProperties +ArrayPropertiesDetail +ArrayPropertiesSummary +ArrayValue +ArrivalDate +Artifact +ArtifactArn +ArtifactConfig +ArtifactConfigInput +ArtifactConfigOutput +ArtifactDetail +ArtifactDetails +ArtifactDigest +ArtifactId +ArtifactIdentifier +ArtifactLocation +ArtifactName +ArtifactPath +ArtifactRevision +ArtifactS3Location +ArtifactSource +ArtifactSourceType +ArtifactStore +ArtifactSummaries +ArtifactSummary +ArtifactType +Artifacts +ArtifactsConcatenationConfiguration +ArtifactsConfiguration +Artwork +As2Config +As2ConnectorConfig +As2Id +As2Transports +AsPath +Ascending +AsmPassword +AsmServer +AsmUser +Asn +AsnOrg +AspectRatio +AssembleWith +AssertedControls +AssertionAttributes +AssertionRule +AssertionRuleUpdate +Assessment +AssessmentControl +AssessmentControlSet +AssessmentEvidenceFolder +AssessmentFramework +AssessmentFrameworkMetadata +AssessmentFrameworkShareRequest +AssessmentMetadata +AssessmentMetadataItem +AssessmentProgress +AssessmentReport +AssessmentReportEvidenceError +AssessmentReportMetadata +AssessmentReportTypes +AssessmentReportsDestination +AssessmentResults +AssessmentResultsFile +AssessmentRun +AssessmentRunAgent +AssessmentRunFilter +AssessmentRunInProgressException +AssessmentRunName +AssessmentRunNotification +AssessmentRunStateChange +AssessmentStatus +AssessmentSummary +AssessmentTarget +AssessmentTargetFilter +AssessmentTemplate +AssessmentTemplateFilter +Asset +AssetAttributes +AssetBundleCloudFormationOverridePropertyConfiguration +AssetBundleExportJobAnalysisOverrideProperties +AssetBundleExportJobDashboardOverrideProperties +AssetBundleExportJobDataSetOverrideProperties +AssetBundleExportJobDataSourceOverrideProperties +AssetBundleExportJobError +AssetBundleExportJobId +AssetBundleExportJobRefreshScheduleOverrideProperties +AssetBundleExportJobResourceIdOverrideConfiguration +AssetBundleExportJobSummary +AssetBundleExportJobSummaryList +AssetBundleExportJobThemeOverrideProperties +AssetBundleExportJobVPCConnectionOverrideProperties +AssetBundleImportJobAnalysisOverrideParameters +AssetBundleImportJobDashboardOverrideParameters +AssetBundleImportJobDataSetOverrideParameters +AssetBundleImportJobDataSourceCredentialPair +AssetBundleImportJobDataSourceCredentials +AssetBundleImportJobDataSourceOverrideParameters +AssetBundleImportJobError +AssetBundleImportJobId +AssetBundleImportJobOverrideParameters +AssetBundleImportJobRefreshScheduleOverrideParameters +AssetBundleImportJobResourceIdOverrideConfiguration +AssetBundleImportJobSummary +AssetBundleImportJobSummaryList +AssetBundleImportJobThemeOverrideParameters +AssetBundleImportJobVPCConnectionOverrideParameters +AssetBundleImportSource +AssetBundleImportSourceDescription +AssetCompositeModel +AssetDestinationEntry +AssetDestinations +AssetDetails +AssetEntry +AssetErrorDetails +AssetHierarchy +AssetHierarchyInfo +AssetId +AssetIds +AssetInfo +AssetInformationList +AssetLocation +AssetModelCompositeModel +AssetModelCompositeModelDefinition +AssetModelHierarchy +AssetModelHierarchyDefinition +AssetModelProperty +AssetModelPropertyDefinition +AssetModelPropertySummary +AssetModelStatus +AssetModelSummary +AssetName +AssetProperty +AssetPropertySummary +AssetPropertyTimestamp +AssetPropertyValue +AssetPropertyVariant +AssetRelationshipSummary +AssetShallow +AssetSource +AssetSourceEntry +AssetSources +AssetStatus +AssetSummary +AssetType +AssetValue +Assets +Assign +AssignContactCategoryAction +AssignInstanceRequest +AssignIpv6AddressOnCreation +AssignIpv6AddressesRequest +AssignIpv6AddressesResult +AssignPrivateIpAddressesRequest +AssignPrivateIpAddressesResult +AssignPrivateNatGatewayAddressRequest +AssignPrivateNatGatewayAddressResult +AssignPublicIp +AssignTapePoolInput +AssignTapePoolOutput +AssignVolumeRequest +AssignedIpv4Prefixes +AssignedIpv6Addresses +AssignedIpv6Prefixes +AssignedPrivateIpAddress +AssignedPrivateIpAddresses +Assigning +Assignment +AssignmentDurationInSeconds +AssignmentId +AssignmentName +AssignmentReviewPolicy +AssignmentReviewReport +AssignmentStatus +AssignmentStatuses +Assignments +AssistAltitude +AssistPosition +AssistantAssociationData +AssistantAssociationSummary +AssistantData +AssistantIntegrationConfiguration +AssistantSummary +AssociateAccountsInput +AssociateAccountsOutput +AssociateAddressRequest +AssociateAddressResult +AssociateAdminAccountRequest +AssociateAliasRequest +AssociateApiRequest +AssociateApiResponse +AssociateAppBlockBuilderAppBlockRequest +AssociateAppBlockBuilderAppBlockResult +AssociateApplicationFleetRequest +AssociateApplicationFleetResult +AssociateApplicationToEntitlementRequest +AssociateApplicationsRequest +AssociateApprovalRuleTemplateWithRepositoryInput +AssociateApprovedOriginRequest +AssociateAssessmentReportEvidenceFolderRequest +AssociateAssetsRequest +AssociateAttributeGroupRequest +AssociateAttributeGroupResponse +AssociateAwsAccountWithPartnerAccountRequest +AssociateAwsAccountWithPartnerAccountResponse +AssociateBotRequest +AssociateBrowserSettingsRequest +AssociateBrowserSettingsResponse +AssociateBudgetWithResourceInput +AssociateCarrierIpAddress +AssociateCertificateRequest +AssociateChannelFlowRequest +AssociateClientDeviceWithCoreDeviceEntry +AssociateClientDeviceWithCoreDeviceErrorEntry +AssociateClientVpnTargetNetworkRequest +AssociateClientVpnTargetNetworkResult +AssociateConfigurationItemsToApplicationRequest +AssociateConnectPeerRequest +AssociateConnectPeerResponse +AssociateConnectionAliasRequest +AssociateConnectionAliasResult +AssociateConnectionWithLagRequest +AssociateContactWithAddressBookRequest +AssociateCreatedArtifactRequest +AssociateCustomDomainRequest +AssociateCustomDomainResponse +AssociateCustomerGatewayRequest +AssociateCustomerGatewayResponse +AssociateDRTLogBucketRequest +AssociateDRTRoleRequest +AssociateDataShareConsumerMessage +AssociateDefaultViewInput +AssociateDefaultViewOutput +AssociateDefaultVocabularyRequest +AssociateDelegateToResourceRequest +AssociateDelegationSignerToDomainRequest +AssociateDelegationSignerToDomainResponse +AssociateDeviceWithNetworkProfileRequest +AssociateDeviceWithPlacementRequest +AssociateDeviceWithRoomRequest +AssociateDhcpOptionsRequest +AssociateDiscoveredResourceRequest +AssociateDomainRequest +AssociateElasticIpRequest +AssociateEnclaveCertificateIamRoleRequest +AssociateEnclaveCertificateIamRoleResult +AssociateEncryptionConfigRequest +AssociateEncryptionConfigResponse +AssociateEntireAccount +AssociateEntitiesToExperienceRequest +AssociateEntitiesToExperienceResponse +AssociateEntityToThingRequest +AssociateEnvironmentOperationsRoleMessage +AssociateExternalConnectionRequest +AssociateExternalConnectionResult +AssociateFacesRequest +AssociateFacesResponse +AssociateFileSystemAliasesRequest +AssociateFileSystemAliasesResponse +AssociateFileSystemInput +AssociateFileSystemOutput +AssociateFirewallPolicyRequest +AssociateFirewallPolicyResponse +AssociateFirewallRuleGroupRequest +AssociateFirewallRuleGroupResponse +AssociateFleetRequest +AssociateFraudsterRequest +AssociateFraudsterResponse +AssociateGatewayToServerInput +AssociateGatewayToServerOutput +AssociateHealthCheckRequest +AssociateHostedConnectionRequest +AssociateIamInstanceProfileRequest +AssociateIamInstanceProfileResult +AssociateIdentityProviderConfigRequest +AssociateIdentityProviderConfigResponse +AssociateInstanceEventWindowRequest +AssociateInstanceEventWindowResult +AssociateInstanceStorageConfigRequest +AssociateInstanceStorageConfigResponse +AssociateIpAccessSettingsRequest +AssociateIpAccessSettingsResponse +AssociateIpGroupsRequest +AssociateIpamResourceDiscoveryRequest +AssociateIpamResourceDiscoveryResult +AssociateKmsKeyRequest +AssociateLambdaFunctionRequest +AssociateLensesInput +AssociateLexBotRequest +AssociateLicenseRequest +AssociateLicenseResponse +AssociateLinkRequest +AssociateLinkResponse +AssociateMacSecKeyRequest +AssociateMacSecKeyResponse +AssociateMemberAccountRequest +AssociateMemberRequest +AssociateMemberResponse +AssociateMemberToGroupRequest +AssociateMergedGraphqlApiRequest +AssociateMergedGraphqlApiResponse +AssociateMulticastGroupWithFuotaTaskRequest +AssociateNatGatewayAddressRequest +AssociateNatGatewayAddressResult +AssociateNetworkSettingsRequest +AssociateNetworkSettingsResponse +AssociateNodeRequest +AssociateNodeResponse +AssociateOpsItemRelatedItemRequest +AssociateOpsItemRelatedItemResponse +AssociateOriginationIdentityRequest +AssociateOriginationIdentityResult +AssociatePackageRequest +AssociatePackageResponse +AssociatePersonasToEntitiesRequest +AssociatePersonasToEntitiesResponse +AssociatePhoneNumberContactFlowRequest +AssociatePhoneNumberWithUserRequest +AssociatePhoneNumbersWithVoiceConnectorGroupRequest +AssociatePhoneNumbersWithVoiceConnectorGroupResponse +AssociatePhoneNumbersWithVoiceConnectorRequest +AssociatePhoneNumbersWithVoiceConnectorResponse +AssociatePricingRulesInput +AssociatePricingRulesOutput +AssociatePrincipalWithPortfolioInput +AssociateProactiveEngagementDetailsRequest +AssociateProductWithPortfolioInput +AssociateProfilesInput +AssociatePublicIpAddress +AssociateQualificationWithWorkerRequest +AssociateQueueQuickConnectsRequest +AssociateRepositoryRequest +AssociateRepositoryResponse +AssociateResolverEndpointIpAddressRequest +AssociateResolverEndpointIpAddressResponse +AssociateResolverQueryLogConfigRequest +AssociateResolverQueryLogConfigResponse +AssociateResolverRuleRequest +AssociateResolverRuleResponse +AssociateResourceError +AssociateResourceRequest +AssociateResourceResponse +AssociateResourceResponseElement +AssociateResourceSharePermissionRequest +AssociateResourceSharePermissionResponse +AssociateResourceShareRequest +AssociateResourceShareResponse +AssociateRoleToGroupRequest +AssociateRoleToGroupResponse +AssociateRouteTableRequest +AssociateRouteTableResult +AssociateRoutingProfileQueuesRequest +AssociateS3ResourcesRequest +AssociateS3ResourcesResult +AssociateSecurityKeyRequest +AssociateSecurityKeyResponse +AssociateServiceActionWithProvisioningArtifactInput +AssociateServiceRoleToAccountRequest +AssociateServiceRoleToAccountResponse +AssociateSigninDelegateGroupsWithAccountRequest +AssociateSkillGroupWithRoomRequest +AssociateSkillWithSkillGroupRequest +AssociateSkillWithUsersRequest +AssociateSoftwareTokenRequest +AssociateSoftwareTokenResponse +AssociateSourceGraphqlApiRequest +AssociateSourceGraphqlApiResponse +AssociateSourceNetworkStackRequest +AssociateSourceNetworkStackResponse +AssociateSourceServersRequest +AssociateSubnetCidrBlockRequest +AssociateSubnetCidrBlockResult +AssociateSubnetsRequest +AssociateSubnetsResponse +AssociateTagOptionWithResourceInput +AssociateTargetsWithJobRequest +AssociateTargetsWithJobResponse +AssociateTeamMemberRequest +AssociateTeamMemberResult +AssociateThirdPartyFirewallRequest +AssociateThirdPartyFirewallResponse +AssociateTimeSeriesToAssetPropertyRequest +AssociateTrackerConsumerRequest +AssociateTrafficDistributionGroupUserRequest +AssociateTransitGatewayConnectPeerRequest +AssociateTransitGatewayConnectPeerResponse +AssociateTransitGatewayMulticastDomainRequest +AssociateTransitGatewayMulticastDomainResult +AssociateTransitGatewayPolicyTableRequest +AssociateTransitGatewayPolicyTableResult +AssociateTransitGatewayRouteTableRequest +AssociateTransitGatewayRouteTableResult +AssociateTrialComponentRequest +AssociateTrialComponentResponse +AssociateTrunkInterfaceRequest +AssociateTrunkInterfaceResult +AssociateTrustStoreRequest +AssociateTrustStoreResponse +AssociateUserAccessLoggingSettingsRequest +AssociateUserAccessLoggingSettingsResponse +AssociateUserRequest +AssociateUserResponse +AssociateUserSettingsRequest +AssociateUserSettingsResponse +AssociateUserToPermissionGroupRequest +AssociateUserToPermissionGroupResponse +AssociateVPCWithHostedZoneRequest +AssociateVPCWithHostedZoneResponse +AssociateVehicleFleetRequest +AssociateVirtualInterfaceRequest +AssociateVpcCidrBlockRequest +AssociateVpcCidrBlockResult +AssociateWebACLRequest +AssociateWebsiteAuthorizationProviderRequest +AssociateWebsiteAuthorizationProviderResponse +AssociateWebsiteCertificateAuthorityRequest +AssociateWebsiteCertificateAuthorityResponse +AssociateWirelessDeviceWithFuotaTaskRequest +AssociateWirelessDeviceWithMulticastGroupRequest +AssociateWirelessDeviceWithThingRequest +AssociateWirelessGatewayWithCertificateRequest +AssociateWirelessGatewayWithCertificateResponse +AssociateWirelessGatewayWithThingRequest +AssociatedAccountId +AssociatedApplication +AssociatedAssetsSummary +AssociatedAt +AssociatedClientDevice +AssociatedClusterCount +AssociatedClusters +AssociatedEndpointGroupFoundException +AssociatedFace +AssociatedFaces +AssociatedGateway +AssociatedGlueResource +AssociatedHost +AssociatedInsightId +AssociatedListenerFoundException +AssociatedPermission +AssociatedPricingPlanCount +AssociatedResource +AssociatedResourceArns +AssociatedResources +AssociatedRole +AssociatedRoleArn +AssociatedRoles +AssociatedRuleGroupArn +AssociatedStandard +AssociatedStandards +AssociatedTargetNetwork +AssociatedTargetNetworks +AssociatedTimestamp +AssociatedTranscript +AssociatedTranscriptFilter +AssociatedValues +Association +AssociationArn +AssociationConfig +AssociationCount +AssociationDate +AssociationDefaultRouteTableId +AssociationDescription +AssociationDoesNotExist +AssociationExecution +AssociationExecutionDoesNotExist +AssociationExecutionFilter +AssociationExecutionTarget +AssociationExecutionTargets +AssociationExecutionTargetsFilter +AssociationExecutions +AssociationFilter +AssociationFilterList +AssociationId +AssociationIds +AssociationName +AssociationOverview +AssociationSet +AssociationSetDetails +AssociationSize +AssociationState +AssociationStateDetails +AssociationStatus +AssociationStatusAggregatedCount +AssociationSummaries +AssociationSummary +AssociationTarget +AssociationTime +AssociationType +AssociationVersion +AssociationVersionInfo +AssociationVersionLimitExceeded +AssociationVersions +Associations +AssumeControl +AssumeDecoratedRoleWithSAMLRequest +AssumeDecoratedRoleWithSAMLResponse +AssumeImpersonationRoleRequest +AssumeImpersonationRoleResponse +AssumeRolePolicyDocument +AssumeRoleRequest +AssumeRoleResponse +AssumeRoleWithSAMLRequest +AssumeRoleWithSAMLResponse +AssumeRoleWithWebIdentityRequest +AssumeRoleWithWebIdentityResponse +AssumedRole +AssumedRoleId +AssumedRoleUser +AsymmetricEncryptionAttributes +AsyncErrorDetails +AsyncInferenceClientConfig +AsyncInferenceConfig +AsyncInferenceNotificationConfig +AsyncInferenceOutputConfig +AsyncOperation +AsyncRequestParameters +AsyncResponseDetails +AtRestEncryptionEnabled +AtTime +AthenaConnectorSource +AthenaDatasetDefinition +AthenaError +AthenaErrorCode +AthenaIntegration +AthenaIntegrations +AthenaParameters +AthenaSourceConfig +AtigData +Atime +AttachCertificateToDistributionRequest +AttachCertificateToDistributionResult +AttachClassicLinkVpcRequest +AttachClassicLinkVpcResult +AttachCustomerManagedPolicyReferenceToPermissionSetRequest +AttachDiskRequest +AttachDiskResult +AttachElasticLoadBalancerRequest +AttachGroupPolicyRequest +AttachInstancesQuery +AttachInstancesToLoadBalancerRequest +AttachInstancesToLoadBalancerResult +AttachInternetGatewayRequest +AttachLoadBalancerTargetGroupsType +AttachLoadBalancerTlsCertificateRequest +AttachLoadBalancerTlsCertificateResult +AttachLoadBalancerToSubnetsInput +AttachLoadBalancerToSubnetsOutput +AttachLoadBalancersType +AttachManagedPolicyToPermissionSetRequest +AttachNetworkInterfaceRequest +AttachNetworkInterfaceResult +AttachObject +AttachObjectRequest +AttachObjectResponse +AttachPolicy +AttachPolicyRequest +AttachPrincipalPolicyRequest +AttachRolePolicyRequest +AttachSecurityProfileRequest +AttachStaticIpRequest +AttachStaticIpResult +AttachThingPrincipalRequest +AttachTime +AttachToIndex +AttachToIndexRequest +AttachToIndexResponse +AttachTrafficSourcesType +AttachTypedLink +AttachTypedLinkRequest +AttachTypedLinkResponse +AttachUserPolicyRequest +AttachVerifiedAccessTrustProviderRequest +AttachVerifiedAccessTrustProviderResult +AttachVolumeInput +AttachVolumeOutput +AttachVolumeRequest +AttachVpnGatewayRequest +AttachVpnGatewayResult +AttachedChannels +AttachedDisk +AttachedENIId +AttachedManagedPolicies +AttachedManagedPolicy +AttachedObjectIdentifier +AttachedPermissionsBoundary +AttachedPolicies +AttachedPolicy +AttachedPolicyIds +AttachedTo +AttachedVolumes +Attachment +AttachmentConfiguration +AttachmentContent +AttachmentCount +AttachmentDetails +AttachmentEnaSrdSpecification +AttachmentEnaSrdUdpSpecification +AttachmentFieldMappings +AttachmentId +AttachmentIdNotFound +AttachmentIds +AttachmentInformation +AttachmentItem +AttachmentLimitExceeded +AttachmentName +AttachmentPolicyRuleNumber +AttachmentReference +AttachmentSetExpired +AttachmentSetIdNotFound +AttachmentSetSizeLimitExceeded +AttachmentSizeInBytes +AttachmentStateChange +AttachmentStatuses +AttachmentType +Attachments +AttachmentsContent +AttachmentsInformation +AttachmentsSource +Attack +AttackCount +AttackCounters +AttackDetail +AttackId +AttackLayer +AttackProperties +AttackProperty +AttackPropertyIdentifier +AttackStatisticsDataItem +AttackSummaries +AttackSummary +AttackVectorDescription +AttackVectors +AttackVolume +AttackVolumeStatistics +Attempt +AttemptContainerDetail +AttemptCount +AttemptDetail +Attempts +Attendee +AttendeeCapabilities +AttendeeId +AttendeeIdItem +AttendeeIds +Attendees +AttenuationControl +AttestationDocument +Attribute +AttributeAction +AttributeActionType +AttributeAggregationFunction +AttributeBooleanValue +AttributeConfig +AttributeConfigs +AttributeDataType +AttributeDefinition +AttributeDefinitions +AttributeDetails +AttributeDimension +AttributeFilter +AttributeGroup +AttributeGroupDetails +AttributeGroupSummary +AttributeItem +AttributeKey +AttributeKeyAndValue +AttributeLimitExceededException +AttributeMapping +AttributeMatchingModel +AttributeName +AttributeNameAndValue +AttributeNames +AttributeOperation +AttributePath +AttributePayload +AttributeReference +AttributeSuggestionsConfig +AttributeSuggestionsDescribeConfig +AttributeSuggestionsGetConfig +AttributeSuggestionsMode +AttributeSuggestionsUpdateConfig +AttributeType +AttributeTypesSelector +AttributeUpdateValue +AttributeUpdates +AttributeValue +AttributeValueList +AttributeValueTarget +AttributeValueUpdate +AttributeValues +Attributes +AttributesData +AttributesRequireVerificationBeforeUpdate +AttributesResource +AttributesToDelete +AttributesToGet +Audience +Audio +AudioAggregationEndedAt +AudioAggregationStartedAt +AudioAndDTMFInputSpecification +AudioArtifactsConfiguration +AudioBufferModel +AudioChannelConfigSchemeIdUri +AudioChannelMapping +AudioChannelTaggingSettings +AudioChannels +AudioChunk +AudioCodecOptions +AudioCodecSettings +AudioConcatenationConfiguration +AudioConfiguration +AudioDeduplication +AudioDescription +AudioDescriptionBroadcasterMix +AudioDescriptionNames +AudioDescriptions +AudioDolbyEDecode +AudioDuration +AudioDurationCorrection +AudioEvent +AudioFallbackUrl +AudioFeatures +AudioFramesPerPes +AudioGroupId +AudioHlsRenditionSelection +AudioHostUrl +AudioInputEvent +AudioLanguageSelection +AudioList +AudioLogDestination +AudioLogSetting +AudioMetadata +AudioNormalizationSettings +AudioOnlyContainer +AudioOnlyHeader +AudioOnlyHlsSettings +AudioOnlyImage +AudioOnlyTimecodeControl +AudioPackingMode +AudioParameters +AudioPidSelection +AudioPids +AudioRenditionSets +AudioResponseEvent +AudioSampleRate +AudioSelector +AudioSelectorGroup +AudioSelectorGroups +AudioSelectorName +AudioSelectorNames +AudioSelectorSettings +AudioSelectors +AudioSilenceFailoverSettings +AudioSilenceSettings +AudioSilenceThresholdMsec +AudioSourceName +AudioSpecification +AudioStream +AudioStreamType +AudioTrack +AudioTrackSelection +AudioTrackType +AudioType +AudioTypeControl +AudioWatermarkSettings +AudioWatermarkingSettings +Audit +AuditCheckConfiguration +AuditCheckDetails +AuditContext +AuditDestinationARN +AuditEvent +AuditEventResultEntry +AuditFinding +AuditImage +AuditImages +AuditImagesLimit +AuditLogConfiguration +AuditLogDestination +AuditLogDestinationConfiguration +AuditLogGroup +AuditLogProcessingConfiguration +AuditLogVolume +AuditLogs +AuditMitigationActionExecutionMetadata +AuditMitigationActionsTaskMetadata +AuditMitigationActionsTaskTarget +AuditNotificationTarget +AuditPolicyState +AuditReportId +AuditReportResponseFormat +AuditReportStatus +AuditStreamArn +AuditSuppression +AuditTaskMetadata +AugmentedManifests +AugmentedManifestsListItem +AuroraParameters +AuroraPostgreSqlParameters +Auth +AuthCode +AuthEventType +AuthEvents +AuthException +AuthFlow +AuthInfo +AuthMechanism +AuthMethod +AuthMode +AuthParameter +AuthParameters +AuthPassword +AuthRequest +AuthRequestCryptogram +AuthResources +AuthResponseAttributes +AuthResponseCode +AuthResponseValue +AuthResult +AuthScheme +AuthSecretArn +AuthSessionValidity +AuthSource +AuthStrategy +AuthToken +AuthTokenEnabled +AuthTokenExpirationTime +AuthTokenLastModifiedDate +AuthTokenStatus +AuthTokenUpdateStrategy +AuthTtL +AuthType +AuthUserName +AuthenticateCognitoActionConfig +AuthenticateCognitoConfig +AuthenticateOidcActionConfig +AuthenticateOidcConfig +AuthenticateOnUnsubscribe +Authenticated +Authentication +AuthenticationCode1 +AuthenticationCode2 +AuthenticationConfig +AuthenticationConfiguration +AuthenticationDescription +AuthenticationFailedException +AuthenticationMethod +AuthenticationMode +AuthenticationOptions +AuthenticationProfile +AuthenticationProfileAlreadyExistsFault +AuthenticationProfileContent +AuthenticationProfileName +AuthenticationProfileNotFoundFault +AuthenticationProfileQuotaExceededFault +AuthenticationProfiles +AuthenticationProtocol +AuthenticationRequestExtraParams +AuthenticationResult +AuthenticationResultId +AuthenticationResultType +AuthenticationScheme +AuthenticationStrategy +AuthenticationSummary +AuthenticationToken +AuthenticationType +Author +AuthorDoesNotExistException +AuthorGroup +Authorization +AuthorizationAlreadyExistsFault +AuthorizationConfig +AuthorizationData +AuthorizationEndpoint +AuthorizationErrorException +AuthorizationException +AuthorizationNotFoundFault +AuthorizationPendingException +AuthorizationProviderId +AuthorizationProviderType +AuthorizationQuotaExceededFault +AuthorizationResult +AuthorizationRule +AuthorizationRules +AuthorizationScopes +AuthorizationStrategy +AuthorizationType +AuthorizeAllGroups +AuthorizeCacheSecurityGroupIngressMessage +AuthorizeCacheSecurityGroupIngressResult +AuthorizeClientVpnIngressRequest +AuthorizeClientVpnIngressResult +AuthorizeClusterSecurityGroupIngressMessage +AuthorizeClusterSecurityGroupIngressResult +AuthorizeDBSecurityGroupIngressMessage +AuthorizeDBSecurityGroupIngressResult +AuthorizeDataShareMessage +AuthorizeEndpointAccessMessage +AuthorizeIpRulesRequest +AuthorizeSecurityGroupEgressRequest +AuthorizeSecurityGroupEgressResult +AuthorizeSecurityGroupIngressRequest +AuthorizeSecurityGroupIngressResult +AuthorizeSnapshotAccessMessage +AuthorizeSnapshotAccessResult +AuthorizeTime +AuthorizeVpcEndpointAccessRequest +AuthorizeVpcEndpointAccessResponse +AuthorizedAccountId +AuthorizedAwsRegion +AuthorizedColumns +AuthorizedPrincipal +AuthorizedPrincipalList +AuthorizedResourceArns +AuthorizedSessionTagValueList +AuthorizedUrl +Authorizer +AuthorizerConfig +AuthorizerCredentialsArn +AuthorizerDescription +AuthorizerId +AuthorizerPayloadFormatVersion +AuthorizerResultTtlInSeconds +AuthorizerSummary +AuthorizerType +AuthorizerUri +Authorizers +AutoAccept +AutoAcceptRequests +AutoAcceptSharedAssociations +AutoAcceptSharedAttachments +AutoAddGroupOwner +AutoAdjustData +AutoAdjustType +AutoAppliedAfterDate +AutoApprovalDelayInSeconds +AutoApprovalTime +AutoApprove +AutoAssignElasticIps +AutoAssignPublicIps +AutoAssociate +AutoBranchCreationConfig +AutoConfigEnabled +AutoCreate +AutoCreateApplication +AutoCreateTasks +AutoDeclineConflictingRequests +AutoDeclineRecurringRequests +AutoDeploy +AutoDeployed +AutoDeployment +AutoDeploymentsEnabled +AutoDetectionMetricSource +AutoDetectionS3SourceConfig +AutoEnable +AutoEnableControls +AutoEnableIO +AutoEnableOrganizationMembers +AutoEnableStandards +AutoEnroll +AutoEnrollment +AutoExportPolicy +AutoExportRevisionDestinationEntry +AutoExportRevisionToS3RequestDetails +AutoGenerateEndpointName +AutoGranted +AutoGrantedValue +AutoImport +AutoImportPolicy +AutoMLAlgorithmArns +AutoMLAlgorithmConfig +AutoMLAlgorithms +AutoMLCandidate +AutoMLCandidateGenerationConfig +AutoMLCandidateStep +AutoMLChannel +AutoMLConfig +AutoMLContainerDefinition +AutoMLDataSource +AutoMLDataSplitConfig +AutoMLJob +AutoMLJobArn +AutoMLJobArtifacts +AutoMLJobChannel +AutoMLJobCompletionCriteria +AutoMLJobConfig +AutoMLJobInputDataConfig +AutoMLJobName +AutoMLJobObjective +AutoMLJobSecondaryStatus +AutoMLJobStatus +AutoMLJobStepMetadata +AutoMLJobSummaries +AutoMLJobSummary +AutoMLOutputDataConfig +AutoMLOverrideStrategy +AutoMLPartialFailureReason +AutoMLProblemTypeConfig +AutoMLProblemTypeConfigName +AutoMLProblemTypeResolvedAttributes +AutoMLResolvedAttributes +AutoMLResult +AutoMLS3DataSource +AutoMLSecurityConfig +AutoMerging +AutoMinorVersionUpgrade +AutoParameter +AutoParameters +AutoPause +AutoPlacement +AutoPromotionResult +AutoPromotionResultReason +AutoPushdown +AutoRecovery +AutoRecoverySupported +AutoRenew +AutoRollback +AutoRollbackConfig +AutoRollbackConfiguration +AutoScaling +AutoScalingConfiguration +AutoScalingConfigurationArn +AutoScalingConfigurationName +AutoScalingConfigurationRevision +AutoScalingConfigurationSummary +AutoScalingConfigurationSummaryList +AutoScalingDescription +AutoScalingDisabled +AutoScalingEnabled +AutoScalingEnabledUpdate +AutoScalingGroup +AutoScalingGroupARN +AutoScalingGroupArn +AutoScalingGroupConfiguration +AutoScalingGroupName +AutoScalingGroupNames +AutoScalingGroupNamesType +AutoScalingGroupProvider +AutoScalingGroupProviderUpdate +AutoScalingGroupRecommendation +AutoScalingGroupRecommendationOption +AutoScalingGroupState +AutoScalingGroups +AutoScalingGroupsType +AutoScalingInstanceDetails +AutoScalingInstances +AutoScalingInstancesType +AutoScalingNotificationTypes +AutoScalingPolicy +AutoScalingPolicyDescription +AutoScalingPolicyStateChangeReason +AutoScalingPolicyStatus +AutoScalingPolicyUpdate +AutoScalingRole +AutoScalingRoleArn +AutoScalingSchedule +AutoScalingSettingsDescription +AutoScalingSettingsUpdate +AutoScalingTargetTrackingScalingPolicyConfigurationDescription +AutoScalingTargetTrackingScalingPolicyConfigurationUpdate +AutoScalingThresholds +AutoScalingType +AutoScalingUpdate +AutoSnapshotAddOnRequest +AutoSnapshotDetails +AutoSoftwareUpdateEnabled +AutoStartConfig +AutoStopConfig +AutoTerminate +AutoTerminationPolicy +AutoTune +AutoTuneDetails +AutoTuneMaintenanceSchedule +AutoTuneOptions +AutoTuneOptionsInput +AutoTuneOptionsOutput +AutoTuneOptionsStatus +AutoTuneStatus +AutoTuneType +AutoTunes +AutoUpdate +AutoUpdateAfterRecommendedApplyByDate +AutoUpdateStartDate +AutoUpgrade +AutoUpgradeDate +AutoVerifiedAttributes +AutoWarmupEnabled +AutocommitPeriod +AutodefinedReverse +AutodefinedReverseFlag +AutomatedAbrRule +AutomatedAbrSettings +AutomatedDiscoveryInformation +AutomatedEncodingSettings +AutomatedSnapshotRetentionPeriod +AutomatedSnapshotStartHour +AutomatedUpdateDate +Automatic +AutomaticBackupRetentionDays +AutomaticFail +AutomaticFailover +AutomaticFailoverEnabled +AutomaticFailoverStatus +AutomaticInputFailoverSettings +AutomaticRenewal +AutomaticRestartTime +AutomaticTapeCreationPolicyInfo +AutomaticTapeCreationPolicyInfos +AutomaticTapeCreationRule +AutomaticTapeCreationRules +AutomaticallyAfterDays +Automation +AutomationDefinitionNotApprovedException +AutomationDefinitionNotFoundException +AutomationDefinitionVersionNotFoundException +AutomationExecution +AutomationExecutionException +AutomationExecutionFilter +AutomationExecutionId +AutomationExecutionLimitExceededException +AutomationExecutionMetadata +AutomationExecutionMetadataList +AutomationExecutionNotFoundException +AutomationExecutionStatus +AutomationExecutionTimeoutException +AutomationMode +AutomationRulesAction +AutomationRulesArns +AutomationRulesConfig +AutomationRulesFindingFieldsUpdate +AutomationRulesFindingFilters +AutomationRulesMetadata +AutomationStepNotFoundException +AutomationSubtype +AutomationTargetParameterName +AutomationType +Autoprovision +Autotune +AuxiliaryDataLocation +Av1QvbrSettings +Av1Settings +AvailBlanking +AvailBlankingImage +AvailConfiguration +AvailMatchingCriteria +AvailNum +AvailSettings +AvailSuppression +Availability +AvailabilityConfiguration +AvailabilityConfigurations +AvailabilityLocalHealthEventsConfig +AvailabilityMeasurement +AvailabilityMode +AvailabilityOptions +AvailabilityOptionsStatus +AvailabilityScoreThreshold +AvailabilityStatus +AvailabilityZone +AvailabilityZoneCount +AvailabilityZoneDetail +AvailabilityZoneFilter +AvailabilityZoneGroup +AvailabilityZoneId +AvailabilityZoneIdFilter +AvailabilityZoneInfo +AvailabilityZoneInformation +AvailabilityZoneMessage +AvailabilityZoneName +AvailabilityZoneNotSupportedException +AvailabilityZoneRelocation +AvailabilityZoneRelocationStatus +AvailabilityZones +AvailabilityZonesMismatch +Available +AvailableAddressCount +AvailableBalance +AvailableCIDRCount +AvailableCapacity +AvailableDataNodeCount +AvailableInstanceCapacity +AvailableInstanceCount +AvailableIpAddressCount +AvailableLabels +AvailableNumberSummary +AvailableNumbersList +AvailableOSReleases +AvailablePackageVersion +AvailablePolicyTypes +AvailableProcessorFeature +AvailableProcessorFeatures +AvailableProvisionedConcurrentExecutions +AvailableSlotsByChannel +AvailableUpgrades +AvailableVCpus +AvailsExpected +AvcIntraClass +AvcIntraSettings +AvcIntraUhdSettings +Average +AverageAccuracy +AverageDownloadRateLimitInBitsPerSec +AverageExecutionTimeMillis +AverageF1Score +AverageLength +AverageNormalizedUnitsUsedPerHour +AverageNumberOfInstancesUsedPerHour +AveragePrecision +AverageRecall +AverageUploadRateLimitInBitsPerSec +AverageUtilization +AverageWeightedQuantileLoss +Avg +AvgResizeRateInMegaBytesPerSecond +AvoidEmptyBatches +AvoidFerries +AvoidTolls +AwaitAnswerMachinePrompt +AwsAccount +AwsAccountId +AwsAccountNumber +AwsAmazonMqBroker +AwsAmazonMqBrokerDetails +AwsAmazonMqBrokerEncryptionOptionsDetails +AwsAmazonMqBrokerLdapServerMetadataDetails +AwsAmazonMqBrokerLogsDetails +AwsAmazonMqBrokerLogsPendingDetails +AwsAmazonMqBrokerMaintenanceWindowStartTimeDetails +AwsAmazonMqBrokerUsersDetails +AwsApiCallAction +AwsApiCallActionDomainDetails +AwsApiGatewayAccessLogSettings +AwsApiGatewayCanarySettings +AwsApiGatewayEndpointConfiguration +AwsApiGatewayMethodSettings +AwsApiGatewayRestApi +AwsApiGatewayRestApiDetails +AwsApiGatewayStage +AwsApiGatewayStageDetails +AwsApiGatewayV2Api +AwsApiGatewayV2ApiDetails +AwsApiGatewayV2RouteSettings +AwsApiGatewayV2Stage +AwsApiGatewayV2StageDetails +AwsAppSyncGraphQlApi +AwsAppSyncGraphQlApiAdditionalAuthenticationProvidersDetails +AwsAppSyncGraphQlApiDetails +AwsAppSyncGraphQlApiLambdaAuthorizerConfigDetails +AwsAppSyncGraphQlApiLogConfigDetails +AwsAppSyncGraphQlApiOpenIdConnectConfigDetails +AwsAppSyncGraphQlApiUserPoolConfigDetails +AwsAthenaWorkGroup +AwsAthenaWorkGroupConfigurationDetails +AwsAthenaWorkGroupConfigurationResultConfigurationDetails +AwsAthenaWorkGroupConfigurationResultConfigurationEncryptionConfigurationDetails +AwsAthenaWorkGroupDetails +AwsAutoScalingAutoScalingGroup +AwsAutoScalingAutoScalingGroupAvailabilityZonesListDetails +AwsAutoScalingAutoScalingGroupDetails +AwsAutoScalingAutoScalingGroupLaunchTemplateLaunchTemplateSpecification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyDetails +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyInstancesDistributionDetails +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateDetails +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateLaunchTemplateSpecification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateOverridesListDetails +AwsAutoScalingLaunchConfiguration +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsDetails +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsEbsDetails +AwsAutoScalingLaunchConfigurationDetails +AwsAutoScalingLaunchConfigurationInstanceMonitoringDetails +AwsAutoScalingLaunchConfigurationMetadataOptions +AwsBackupBackupPlan +AwsBackupBackupPlanAdvancedBackupSettingsDetails +AwsBackupBackupPlanBackupPlanDetails +AwsBackupBackupPlanDetails +AwsBackupBackupPlanLifecycleDetails +AwsBackupBackupPlanRuleCopyActionsDetails +AwsBackupBackupPlanRuleDetails +AwsBackupBackupVault +AwsBackupBackupVaultDetails +AwsBackupBackupVaultNotificationsDetails +AwsBackupRecoveryPoint +AwsBackupRecoveryPointArn +AwsBackupRecoveryPointCalculatedLifecycleDetails +AwsBackupRecoveryPointCreatedByDetails +AwsBackupRecoveryPointDetails +AwsBackupRecoveryPointLifecycleDetails +AwsCertificateManagerCertificate +AwsCertificateManagerCertificateDetails +AwsCertificateManagerCertificateDomainValidationOption +AwsCertificateManagerCertificateExtendedKeyUsage +AwsCertificateManagerCertificateKeyUsage +AwsCertificateManagerCertificateOptions +AwsCertificateManagerCertificateRenewalSummary +AwsCertificateManagerCertificateResourceRecord +AwsCloudFormationStack +AwsCloudFormationStackDetails +AwsCloudFormationStackDriftInformationDetails +AwsCloudFormationStackOutputsDetails +AwsCloudFrontDistribution +AwsCloudFrontDistributionCacheBehavior +AwsCloudFrontDistributionCacheBehaviors +AwsCloudFrontDistributionDefaultCacheBehavior +AwsCloudFrontDistributionDetails +AwsCloudFrontDistributionLogging +AwsCloudFrontDistributionOriginCustomOriginConfig +AwsCloudFrontDistributionOriginGroup +AwsCloudFrontDistributionOriginGroupFailover +AwsCloudFrontDistributionOriginGroupFailoverStatusCodes +AwsCloudFrontDistributionOriginGroups +AwsCloudFrontDistributionOriginItem +AwsCloudFrontDistributionOriginS3OriginConfig +AwsCloudFrontDistributionOriginSslProtocols +AwsCloudFrontDistributionOrigins +AwsCloudFrontDistributionViewerCertificate +AwsCloudMapInstanceAttribute +AwsCloudMapServiceDiscovery +AwsCloudTrailTrail +AwsCloudTrailTrailDetails +AwsCloudWatchAlarm +AwsCloudWatchAlarmDetails +AwsCloudWatchAlarmDimensionsDetails +AwsCodeBuildProject +AwsCodeBuildProjectArtifactsDetails +AwsCodeBuildProjectDetails +AwsCodeBuildProjectEnvironment +AwsCodeBuildProjectEnvironmentEnvironmentVariablesDetails +AwsCodeBuildProjectEnvironmentRegistryCredential +AwsCodeBuildProjectLogsConfigCloudWatchLogsDetails +AwsCodeBuildProjectLogsConfigDetails +AwsCodeBuildProjectLogsConfigS3LogsDetails +AwsCodeBuildProjectSource +AwsCodeBuildProjectVpcConfig +AwsCognitoIdentityPoolId +AwsCognitoRegion +AwsCorsConfiguration +AwsCredentials +AwsDynamoDbTable +AwsDynamoDbTableAttributeDefinition +AwsDynamoDbTableBillingModeSummary +AwsDynamoDbTableDetails +AwsDynamoDbTableGlobalSecondaryIndex +AwsDynamoDbTableKeySchema +AwsDynamoDbTableLocalSecondaryIndex +AwsDynamoDbTableProjection +AwsDynamoDbTableProvisionedThroughput +AwsDynamoDbTableProvisionedThroughputOverride +AwsDynamoDbTableReplica +AwsDynamoDbTableReplicaGlobalSecondaryIndex +AwsDynamoDbTableRestoreSummary +AwsDynamoDbTableSseDescription +AwsDynamoDbTableStreamSpecification +AwsEc2Eip +AwsEc2EipDetails +AwsEc2Instance +AwsEc2InstanceDetails +AwsEc2InstanceMetadataOptions +AwsEc2InstanceMonitoringDetails +AwsEc2InstanceNetworkInterfacesDetails +AwsEc2InstanceViolation +AwsEc2LaunchTemplate +AwsEc2LaunchTemplateDataBlockDeviceMappingSetDetails +AwsEc2LaunchTemplateDataBlockDeviceMappingSetEbsDetails +AwsEc2LaunchTemplateDataCapacityReservationSpecificationCapacityReservationTargetDetails +AwsEc2LaunchTemplateDataCapacityReservationSpecificationDetails +AwsEc2LaunchTemplateDataCpuOptionsDetails +AwsEc2LaunchTemplateDataCreditSpecificationDetails +AwsEc2LaunchTemplateDataDetails +AwsEc2LaunchTemplateDataElasticGpuSpecificationSetDetails +AwsEc2LaunchTemplateDataElasticInferenceAcceleratorSetDetails +AwsEc2LaunchTemplateDataEnclaveOptionsDetails +AwsEc2LaunchTemplateDataHibernationOptionsDetails +AwsEc2LaunchTemplateDataIamInstanceProfileDetails +AwsEc2LaunchTemplateDataInstanceMarketOptionsDetails +AwsEc2LaunchTemplateDataInstanceMarketOptionsSpotOptionsDetails +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorCountDetails +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorTotalMemoryMiBDetails +AwsEc2LaunchTemplateDataInstanceRequirementsBaselineEbsBandwidthMbpsDetails +AwsEc2LaunchTemplateDataInstanceRequirementsDetails +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryGiBPerVCpuDetails +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryMiBDetails +AwsEc2LaunchTemplateDataInstanceRequirementsNetworkInterfaceCountDetails +AwsEc2LaunchTemplateDataInstanceRequirementsTotalLocalStorageGBDetails +AwsEc2LaunchTemplateDataInstanceRequirementsVCpuCountDetails +AwsEc2LaunchTemplateDataLicenseSetDetails +AwsEc2LaunchTemplateDataMaintenanceOptionsDetails +AwsEc2LaunchTemplateDataMetadataOptionsDetails +AwsEc2LaunchTemplateDataMonitoringDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv4PrefixesDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6AddressesDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6PrefixesDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetPrivateIpAddressesDetails +AwsEc2LaunchTemplateDataPlacementDetails +AwsEc2LaunchTemplateDataPrivateDnsNameOptionsDetails +AwsEc2LaunchTemplateDetails +AwsEc2NetworkAcl +AwsEc2NetworkAclAssociation +AwsEc2NetworkAclDetails +AwsEc2NetworkAclEntry +AwsEc2NetworkInterface +AwsEc2NetworkInterfaceAttachment +AwsEc2NetworkInterfaceDetails +AwsEc2NetworkInterfaceIpV6AddressDetail +AwsEc2NetworkInterfacePrivateIpAddressDetail +AwsEc2NetworkInterfaceSecurityGroup +AwsEc2NetworkInterfaceViolation +AwsEc2NetworkInterfaceViolations +AwsEc2RouteTable +AwsEc2RouteTableDetails +AwsEc2SecurityGroup +AwsEc2SecurityGroupDetails +AwsEc2SecurityGroupIpPermission +AwsEc2SecurityGroupIpRange +AwsEc2SecurityGroupIpv6Range +AwsEc2SecurityGroupPrefixListId +AwsEc2SecurityGroupUserIdGroupPair +AwsEc2Subnet +AwsEc2SubnetDetails +AwsEc2TransitGateway +AwsEc2TransitGatewayDetails +AwsEc2Volume +AwsEc2VolumeAttachment +AwsEc2VolumeDetails +AwsEc2Vpc +AwsEc2VpcDetails +AwsEc2VpcEndpointService +AwsEc2VpcEndpointServiceDetails +AwsEc2VpcEndpointServiceServiceTypeDetails +AwsEc2VpcPeeringConnection +AwsEc2VpcPeeringConnectionDetails +AwsEc2VpcPeeringConnectionStatusDetails +AwsEc2VpcPeeringConnectionVpcInfoDetails +AwsEc2VpnConnection +AwsEc2VpnConnectionDetails +AwsEc2VpnConnectionOptionsDetails +AwsEc2VpnConnectionOptionsTunnelOptionsDetails +AwsEc2VpnConnectionRoutesDetails +AwsEc2VpnConnectionVgwTelemetryDetails +AwsEcrContainerAggregation +AwsEcrContainerAggregationResponse +AwsEcrContainerImage +AwsEcrContainerImageDetails +AwsEcrRepository +AwsEcrRepositoryDetails +AwsEcrRepositoryImageScanningConfigurationDetails +AwsEcrRepositoryLifecyclePolicyDetails +AwsEcsCluster +AwsEcsClusterClusterSettingsDetails +AwsEcsClusterConfigurationDetails +AwsEcsClusterConfigurationExecuteCommandConfigurationDetails +AwsEcsClusterConfigurationExecuteCommandConfigurationLogConfigurationDetails +AwsEcsClusterDefaultCapacityProviderStrategyDetails +AwsEcsClusterDetails +AwsEcsContainer +AwsEcsContainerDetails +AwsEcsService +AwsEcsServiceCapacityProviderStrategyDetails +AwsEcsServiceDeploymentConfigurationDeploymentCircuitBreakerDetails +AwsEcsServiceDeploymentConfigurationDetails +AwsEcsServiceDeploymentControllerDetails +AwsEcsServiceDetails +AwsEcsServiceLoadBalancersDetails +AwsEcsServiceNetworkConfigurationAwsVpcConfigurationDetails +AwsEcsServiceNetworkConfigurationDetails +AwsEcsServicePlacementConstraintsDetails +AwsEcsServicePlacementStrategiesDetails +AwsEcsServiceServiceRegistriesDetails +AwsEcsTask +AwsEcsTaskDefinition +AwsEcsTaskDefinitionContainerDefinitionsDependsOnDetails +AwsEcsTaskDefinitionContainerDefinitionsDetails +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentDetails +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentFilesDetails +AwsEcsTaskDefinitionContainerDefinitionsExtraHostsDetails +AwsEcsTaskDefinitionContainerDefinitionsFirelensConfigurationDetails +AwsEcsTaskDefinitionContainerDefinitionsHealthCheckDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersCapabilitiesDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDevicesDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersTmpfsDetails +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationDetails +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationSecretOptionsDetails +AwsEcsTaskDefinitionContainerDefinitionsMountPointsDetails +AwsEcsTaskDefinitionContainerDefinitionsPortMappingsDetails +AwsEcsTaskDefinitionContainerDefinitionsRepositoryCredentialsDetails +AwsEcsTaskDefinitionContainerDefinitionsResourceRequirementsDetails +AwsEcsTaskDefinitionContainerDefinitionsSecretsDetails +AwsEcsTaskDefinitionContainerDefinitionsSystemControlsDetails +AwsEcsTaskDefinitionContainerDefinitionsUlimitsDetails +AwsEcsTaskDefinitionContainerDefinitionsVolumesFromDetails +AwsEcsTaskDefinitionDetails +AwsEcsTaskDefinitionInferenceAcceleratorsDetails +AwsEcsTaskDefinitionPlacementConstraintsDetails +AwsEcsTaskDefinitionProxyConfigurationDetails +AwsEcsTaskDefinitionProxyConfigurationProxyConfigurationPropertiesDetails +AwsEcsTaskDefinitionVolumesDetails +AwsEcsTaskDefinitionVolumesDockerVolumeConfigurationDetails +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationAuthorizationConfigDetails +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationDetails +AwsEcsTaskDefinitionVolumesHostDetails +AwsEcsTaskDetails +AwsEcsTaskVolumeDetails +AwsEcsTaskVolumeHostDetails +AwsEfsAccessPoint +AwsEfsAccessPointDetails +AwsEfsAccessPointPosixUserDetails +AwsEfsAccessPointRootDirectoryCreationInfoDetails +AwsEfsAccessPointRootDirectoryDetails +AwsEksCluster +AwsEksClusterDetails +AwsEksClusterLoggingClusterLoggingDetails +AwsEksClusterLoggingDetails +AwsEksClusterResourcesVpcConfigDetails +AwsElasticBeanstalkEnvironment +AwsElasticBeanstalkEnvironmentDetails +AwsElasticBeanstalkEnvironmentEnvironmentLink +AwsElasticBeanstalkEnvironmentOptionSetting +AwsElasticBeanstalkEnvironmentTier +AwsElasticsearchDomain +AwsElasticsearchDomainDetails +AwsElasticsearchDomainDomainEndpointOptions +AwsElasticsearchDomainElasticsearchClusterConfigDetails +AwsElasticsearchDomainElasticsearchClusterConfigZoneAwarenessConfigDetails +AwsElasticsearchDomainEncryptionAtRestOptions +AwsElasticsearchDomainLogPublishingOptions +AwsElasticsearchDomainLogPublishingOptionsLogConfig +AwsElasticsearchDomainNodeToNodeEncryptionOptions +AwsElasticsearchDomainServiceSoftwareOptions +AwsElasticsearchDomainVPCOptions +AwsElbAppCookieStickinessPolicy +AwsElbLbCookieStickinessPolicy +AwsElbLoadBalancer +AwsElbLoadBalancerAccessLog +AwsElbLoadBalancerAdditionalAttribute +AwsElbLoadBalancerAttributes +AwsElbLoadBalancerBackendServerDescription +AwsElbLoadBalancerConnectionDraining +AwsElbLoadBalancerConnectionSettings +AwsElbLoadBalancerCrossZoneLoadBalancing +AwsElbLoadBalancerDetails +AwsElbLoadBalancerHealthCheck +AwsElbLoadBalancerInstance +AwsElbLoadBalancerListener +AwsElbLoadBalancerListenerDescription +AwsElbLoadBalancerPolicies +AwsElbLoadBalancerSourceSecurityGroup +AwsElbv2LoadBalancer +AwsElbv2LoadBalancerAttribute +AwsElbv2LoadBalancerDetails +AwsEventSchemasRegistry +AwsEventSchemasRegistryDetails +AwsGroundStationAgentEndpoint +AwsGuardDutyDetector +AwsGuardDutyDetectorDataSourcesCloudTrailDetails +AwsGuardDutyDetectorDataSourcesDetails +AwsGuardDutyDetectorDataSourcesDnsLogsDetails +AwsGuardDutyDetectorDataSourcesFlowLogsDetails +AwsGuardDutyDetectorDataSourcesKubernetesAuditLogsDetails +AwsGuardDutyDetectorDataSourcesKubernetesDetails +AwsGuardDutyDetectorDataSourcesMalwareProtectionDetails +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsDetails +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsEbsVolumesDetails +AwsGuardDutyDetectorDataSourcesS3LogsDetails +AwsGuardDutyDetectorDetails +AwsGuardDutyDetectorFeaturesDetails +AwsHardwareCertificate +AwsIamAccessKey +AwsIamAccessKeyDetails +AwsIamAccessKeySessionContext +AwsIamAccessKeySessionContextAttributes +AwsIamAccessKeySessionContextSessionIssuer +AwsIamAttachedManagedPolicy +AwsIamConfig +AwsIamGroup +AwsIamGroupDetails +AwsIamGroupPolicy +AwsIamInstanceProfile +AwsIamInstanceProfileRole +AwsIamPermissionsBoundary +AwsIamPolicy +AwsIamPolicyDetails +AwsIamPolicyVersion +AwsIamRole +AwsIamRoleDetails +AwsIamRolePolicy +AwsIamUser +AwsIamUserDetails +AwsIamUserPolicy +AwsIdentity +AwsIotAnalyticsParameters +AwsJobAbortConfig +AwsJobAbortCriteria +AwsJobExecutionsRolloutConfig +AwsJobExponentialRolloutRate +AwsJobPresignedUrlConfig +AwsJobRateIncreaseCriteria +AwsJobTimeoutConfig +AwsKinesisStream +AwsKinesisStreamDetails +AwsKinesisStreamStreamEncryptionDetails +AwsKmsKey +AwsKmsKeyArn +AwsKmsKeyDetails +AwsKmsKeyId +AwsLambdaFunction +AwsLambdaFunctionCode +AwsLambdaFunctionDeadLetterConfig +AwsLambdaFunctionDetails +AwsLambdaFunctionEnvironment +AwsLambdaFunctionEnvironmentError +AwsLambdaFunctionLayer +AwsLambdaFunctionTracingConfig +AwsLambdaFunctionVpcConfig +AwsLambdaLayerVersion +AwsLambdaLayerVersionDetails +AwsLambdaTransformation +AwsLogSourceConfiguration +AwsLogSourceResource +AwsManaged +AwsManagedHumanLoopRequestSource +AwsManagedResources +AwsMountPoint +AwsNetworkFirewallFirewall +AwsNetworkFirewallFirewallDetails +AwsNetworkFirewallFirewallPolicy +AwsNetworkFirewallFirewallPolicyDetails +AwsNetworkFirewallFirewallSubnetMappingsDetails +AwsNetworkFirewallRuleGroup +AwsNetworkFirewallRuleGroupDetails +AwsOpenSearchServiceDomain +AwsOpenSearchServiceDomainAdvancedSecurityOptionsDetails +AwsOpenSearchServiceDomainClusterConfigDetails +AwsOpenSearchServiceDomainClusterConfigZoneAwarenessConfigDetails +AwsOpenSearchServiceDomainDetails +AwsOpenSearchServiceDomainDomainEndpointOptionsDetails +AwsOpenSearchServiceDomainEncryptionAtRestOptionsDetails +AwsOpenSearchServiceDomainLogPublishingOption +AwsOpenSearchServiceDomainLogPublishingOptionsDetails +AwsOpenSearchServiceDomainMasterUserOptionsDetails +AwsOpenSearchServiceDomainNodeToNodeEncryptionOptionsDetails +AwsOpenSearchServiceDomainServiceSoftwareOptionsDetails +AwsOpenSearchServiceDomainVpcOptionsDetails +AwsOrg +AwsOrganizationsSource +AwsRdsDbCluster +AwsRdsDbClusterAssociatedRole +AwsRdsDbClusterDetails +AwsRdsDbClusterMember +AwsRdsDbClusterOptionGroupMembership +AwsRdsDbClusterSnapshot +AwsRdsDbClusterSnapshotDbClusterSnapshotAttribute +AwsRdsDbClusterSnapshotDetails +AwsRdsDbDomainMembership +AwsRdsDbInstance +AwsRdsDbInstanceAssociatedRole +AwsRdsDbInstanceDetails +AwsRdsDbInstanceEndpoint +AwsRdsDbInstanceVpcSecurityGroup +AwsRdsDbOptionGroupMembership +AwsRdsDbParameterGroup +AwsRdsDbPendingModifiedValues +AwsRdsDbProcessorFeature +AwsRdsDbSecurityGroup +AwsRdsDbSecurityGroupDetails +AwsRdsDbSecurityGroupEc2SecurityGroup +AwsRdsDbSecurityGroupIpRange +AwsRdsDbSnapshot +AwsRdsDbSnapshotDetails +AwsRdsDbStatusInfo +AwsRdsDbSubnetGroup +AwsRdsDbSubnetGroupSubnet +AwsRdsDbSubnetGroupSubnetAvailabilityZone +AwsRdsEventSubscription +AwsRdsEventSubscriptionDetails +AwsRdsPendingCloudWatchLogsExports +AwsRedshiftCluster +AwsRedshiftClusterClusterNode +AwsRedshiftClusterClusterParameterGroup +AwsRedshiftClusterClusterParameterStatus +AwsRedshiftClusterClusterSecurityGroup +AwsRedshiftClusterClusterSnapshotCopyStatus +AwsRedshiftClusterDeferredMaintenanceWindow +AwsRedshiftClusterDetails +AwsRedshiftClusterElasticIpStatus +AwsRedshiftClusterEndpoint +AwsRedshiftClusterHsmStatus +AwsRedshiftClusterIamRole +AwsRedshiftClusterLoggingStatus +AwsRedshiftClusterPendingModifiedValues +AwsRedshiftClusterResizeInfo +AwsRedshiftClusterRestoreStatus +AwsRedshiftClusterVpcSecurityGroup +AwsRegion +AwsRegions +AwsS3AccountPublicAccessBlock +AwsS3AccountPublicAccessBlockDetails +AwsS3Bucket +AwsS3BucketBucketLifecycleConfigurationDetails +AwsS3BucketBucketLifecycleConfigurationRulesAbortIncompleteMultipartUploadDetails +AwsS3BucketBucketLifecycleConfigurationRulesDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsTagDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateTagDetails +AwsS3BucketBucketLifecycleConfigurationRulesNoncurrentVersionTransitionsDetails +AwsS3BucketBucketLifecycleConfigurationRulesTransitionsDetails +AwsS3BucketBucketVersioningConfiguration +AwsS3BucketDetails +AwsS3BucketLoggingConfiguration +AwsS3BucketNotificationConfiguration +AwsS3BucketNotificationConfigurationDetail +AwsS3BucketNotificationConfigurationFilter +AwsS3BucketNotificationConfigurationS3KeyFilter +AwsS3BucketNotificationConfigurationS3KeyFilterRule +AwsS3BucketObjectLockConfiguration +AwsS3BucketObjectLockConfigurationRuleDefaultRetentionDetails +AwsS3BucketObjectLockConfigurationRuleDetails +AwsS3BucketServerSideEncryptionByDefault +AwsS3BucketServerSideEncryptionConfiguration +AwsS3BucketServerSideEncryptionRule +AwsS3BucketWebsiteConfiguration +AwsS3BucketWebsiteConfigurationRedirectTo +AwsS3BucketWebsiteConfigurationRoutingRule +AwsS3BucketWebsiteConfigurationRoutingRuleCondition +AwsS3BucketWebsiteConfigurationRoutingRuleRedirect +AwsS3Object +AwsS3ObjectDetails +AwsSageMakerNotebookInstance +AwsSageMakerNotebookInstanceDetails +AwsSageMakerNotebookInstanceMetadataServiceConfigurationDetails +AwsSecretsManagerSecret +AwsSecretsManagerSecretDetails +AwsSecretsManagerSecretRotationRules +AwsSecurityFinding +AwsSecurityFindingFilters +AwsSecurityFindingIdentifier +AwsService +AwsSnsTopic +AwsSnsTopicDetails +AwsSnsTopicSubscription +AwsSqsQueue +AwsSqsQueueDetails +AwsSsmComplianceSummary +AwsSsmPatch +AwsSsmPatchCompliance +AwsSsmPatchComplianceDetails +AwsSsoAuthentication +AwsStepFunctionStateMachine +AwsStepFunctionStateMachineDetails +AwsStepFunctionStateMachineLoggingConfigurationDestinationsCloudWatchLogsLogGroupDetails +AwsStepFunctionStateMachineLoggingConfigurationDestinationsDetails +AwsStepFunctionStateMachineLoggingConfigurationDetails +AwsStepFunctionStateMachineTracingConfigurationDetails +AwsTagKey +AwsTagValue +AwsUserPoolsId +AwsUserPoolsWebClientId +AwsVPCSecurityGroupViolation +AwsVpcConfiguration +AwsWafRateBasedRule +AwsWafRateBasedRuleDetails +AwsWafRateBasedRuleMatchPredicate +AwsWafRegionalRateBasedRule +AwsWafRegionalRateBasedRuleDetails +AwsWafRegionalRateBasedRuleMatchPredicate +AwsWafRegionalRule +AwsWafRegionalRuleDetails +AwsWafRegionalRuleGroup +AwsWafRegionalRuleGroupDetails +AwsWafRegionalRuleGroupRulesActionDetails +AwsWafRegionalRuleGroupRulesDetails +AwsWafRegionalRulePredicateListDetails +AwsWafRegionalWebAcl +AwsWafRegionalWebAclDetails +AwsWafRegionalWebAclRulesListActionDetails +AwsWafRegionalWebAclRulesListDetails +AwsWafRegionalWebAclRulesListOverrideActionDetails +AwsWafRule +AwsWafRuleDetails +AwsWafRuleGroup +AwsWafRuleGroupDetails +AwsWafRuleGroupRulesActionDetails +AwsWafRuleGroupRulesDetails +AwsWafRulePredicateListDetails +AwsWafWebAcl +AwsWafWebAclDetails +AwsWafWebAclRule +AwsWafv2ActionAllowDetails +AwsWafv2ActionBlockDetails +AwsWafv2CustomHttpHeader +AwsWafv2CustomRequestHandlingDetails +AwsWafv2CustomResponseDetails +AwsWafv2RuleGroup +AwsWafv2RuleGroupDetails +AwsWafv2RulesActionCaptchaDetails +AwsWafv2RulesActionCountDetails +AwsWafv2RulesActionDetails +AwsWafv2RulesDetails +AwsWafv2VisibilityConfigDetails +AwsWafv2WebAcl +AwsWafv2WebAclActionDetails +AwsWafv2WebAclCaptchaConfigDetails +AwsWafv2WebAclCaptchaConfigImmunityTimePropertyDetails +AwsWafv2WebAclDetails +AwsXrayEncryptionConfig +AwsXrayEncryptionConfigDetails +AxesRangeScale +AxisBinding +AxisDataOptions +AxisDisplayMinMaxRange +AxisDisplayOptions +AxisDisplayRange +AxisLabelOptions +AxisLabelReferenceOptions +AxisLineVisibility +AxisLinearScale +AxisLogarithmicScale +AxisOffset +AxisOptions +AxisScale +AxisTickLabelOptions +AzureBlobSasConfiguration +B +BGPPeer +BS +BabelfishDatabaseName +BackTestAnomalyDetectorRequest +BackTestConfiguration +BackTestWindowOffset +BackendAPIAppSyncAuthSettings +BackendAPIAuthType +BackendAPIConflictResolution +BackendAPIResourceConfig +BackendAuthAppleProviderConfig +BackendAuthSocialProviderConfig +BackendConnectionErrors +BackendDefaults +BackendEnvironment +BackendEnvironmentList +BackendEnvironmentName +BackendJobRespObj +BackendManagerAppId +BackendServerDescription +BackendServerDescriptions +BackendStoragePermissions +BackfillError +BackfillErrors +BackfillMode +Backfilling +Background +BackgroundColor +BackgroundOpacity +BackgroundStyle +BackgroundVisibility +Backint +BackintConfig +BackintMode +BacktestResults +BacktrackConsumedChangeRecords +BacktrackDBClusterMessage +BacktrackIdentifier +BacktrackRequestCreationTime +BacktrackTo +BacktrackWindow +BacktrackedFrom +Backup +BackupArn +BackupBeingCopied +BackupCreationDateTime +BackupDescription +BackupDetails +BackupExpiryDateTime +BackupFailureDetails +BackupId +BackupIds +BackupInProgress +BackupInUseException +BackupJob +BackupJobId +BackupJobs +BackupName +BackupNotFound +BackupNotFoundException +BackupObject +BackupOptions +BackupPlan +BackupPlanArn +BackupPlanDocument +BackupPlanId +BackupPlanInput +BackupPlanName +BackupPlanRule +BackupPlanTags +BackupPlanTemplateId +BackupPlanTemplateJson +BackupPlanTemplateName +BackupPlanTemplatesList +BackupPlanTemplatesListMember +BackupPlanVersion +BackupPlanVersionsList +BackupPlansList +BackupPlansListMember +BackupPolicy +BackupPolicyDescription +BackupPolicyNotFoundFault +BackupProgressInMegaBytes +BackupRestoring +BackupRetentionCount +BackupRetentionPeriod +BackupRetentionPolicy +BackupRule +BackupRuleId +BackupRuleInput +BackupSelection +BackupSelectionsList +BackupSelectionsListMember +BackupSizeBytes +BackupSizeInBytes +BackupState +BackupStatus +BackupSummaries +BackupSummary +BackupTarget +BackupType +BackupVaultAccountId +BackupVaultArn +BackupVaultEvents +BackupVaultList +BackupVaultListMember +BackupVaultName +BackupVaultTags +Backups +BadDocumentException +BadGatewayException +BadRequest +BadRequestDetail +BadRequestException +Badge +Baidu +BaiduChannelRequest +BaiduChannelResponse +BaiduMessage +BalancingStrategy +BandFilter +BandMathConfigInput +BandName +Bandwidth +BandwidthRateLimitInterval +BandwidthRateLimitIntervals +BandwidthReductionFilter +BandwidthType +BannerText +BarChartAggregatedFieldWells +BarChartConfiguration +BarChartFieldWells +BarChartSortConfiguration +BarChartVisual +BarDataLabels +BarValues +BareMetal +BarsArrangement +Base +Base32StringSeed +Base64String +BaseCanaryRunId +BaseConfigurationItem +BaseConfigurationItems +BaseDirectory +BaseEndpointDnsNames +BaseException +BaseImage +BaseImageArn +BaseKpiResult +BaseLat +BaseLensVersion +BaseLng +BaseMapStyle +BaseModelName +BasePath +BasePathMapping +BasePathMappings +BasePathUpdate +BaseScore +BaseScreenshot +BaseScreenshots +BaseSeriesSettings +BaseStationId +BaseThemeId +BaseUrl +BaseUrlContent +BaseUrlContent1 +BaseUrlManifest +BaseUrlManifest1 +BaseVector +BasedOnSpiceSchedule +Baseline +BaselineBandwidthInGbps +BaselineBandwidthInMbps +BaselineConfig +BaselineData +BaselineDescription +BaselineEbsBandwidthMbps +BaselineEbsBandwidthMbpsRequest +BaselineId +BaselineIdentities +BaselineIdentity +BaselineIops +BaselineMetric +BaselineMetrics +BaselineName +BaselineOverride +BaselineThroughputInMBps +BaselineUsedForDriftCheckConstraints +BaselineUsedForDriftCheckStatistics +BaseliningJobName +Basepath +BasicAuthCredentials +BasicAuthParameters +BasicAuthSecretId +BasicAuthentication +BasicAuthenticationConfiguration +BasicCatalogTarget +BasicLayout +Batch +BatchAcknowledgeAlarmRequest +BatchAcknowledgeAlarmResponse +BatchAddFacetToObject +BatchAlarmActionErrorEntry +BatchApplyUpdateActionMessage +BatchArrayProperties +BatchAssociateApprovalRuleTemplateWithRepositoriesError +BatchAssociateApprovalRuleTemplateWithRepositoriesInput +BatchAssociateApprovalRuleTemplateWithRepositoriesOutput +BatchAssociateAssessmentReportEvidenceRequest +BatchAssociateAssessmentReportEvidenceResponse +BatchAssociateClientDeviceWithCoreDeviceRequest +BatchAssociateClientDeviceWithCoreDeviceResponse +BatchAssociateProjectAssetsRequest +BatchAssociateProjectAssetsResponse +BatchAssociateResourceRequest +BatchAssociateResourceResponse +BatchAssociateResourcesToCustomLineItemInput +BatchAssociateResourcesToCustomLineItemOutput +BatchAssociateScramSecretRequest +BatchAssociateScramSecretResponse +BatchAssociateServiceActionWithProvisioningArtifactInput +BatchAssociateServiceActionWithProvisioningArtifactOutput +BatchAssociateUserStackRequest +BatchAssociateUserStackResult +BatchAttachObject +BatchAttachObjectResponse +BatchAttachPolicy +BatchAttachToIndex +BatchAttachToIndexResponse +BatchAttachTypedLink +BatchAttachTypedLinkResponse +BatchChannelMemberships +BatchCheckLayerAvailabilityRequest +BatchCheckLayerAvailabilityResponse +BatchContainerOverrides +BatchCount +BatchCreateAttendeeRequest +BatchCreateAttendeeResponse +BatchCreateChannelMembershipError +BatchCreateChannelMembershipRequest +BatchCreateChannelMembershipResponse +BatchCreateCustomVocabularyItemRequest +BatchCreateCustomVocabularyItemResponse +BatchCreateDelegationByAssessmentError +BatchCreateDelegationByAssessmentRequest +BatchCreateDelegationByAssessmentResponse +BatchCreateIndex +BatchCreateIndexResponse +BatchCreateObject +BatchCreateObjectResponse +BatchCreatePartitionRequest +BatchCreatePartitionResponse +BatchCreateRoomMembershipRequest +BatchCreateRoomMembershipResponse +BatchCreateRumMetricDefinitionsError +BatchCreateRumMetricDefinitionsRequest +BatchCreateRumMetricDefinitionsResponse +BatchCreateTableRowsRequest +BatchCreateTableRowsResult +BatchCreateVariableError +BatchCreateVariableRequest +BatchCreateVariableResult +BatchCreateVehicleRequest +BatchCreateVehicleResponse +BatchDataCaptureConfig +BatchDeleteAutomationRulesRequest +BatchDeleteAutomationRulesResponse +BatchDeleteBuildsInput +BatchDeleteBuildsOutput +BatchDeleteClusterSnapshotsRequest +BatchDeleteClusterSnapshotsResult +BatchDeleteConnectionRequest +BatchDeleteConnectionResponse +BatchDeleteCustomVocabularyItemRequest +BatchDeleteCustomVocabularyItemResponse +BatchDeleteDelegationByAssessmentError +BatchDeleteDelegationByAssessmentRequest +BatchDeleteDelegationByAssessmentResponse +BatchDeleteDetectorErrorEntry +BatchDeleteDetectorRequest +BatchDeleteDetectorResponse +BatchDeleteDevicePositionHistoryError +BatchDeleteDevicePositionHistoryRequest +BatchDeleteDevicePositionHistoryResponse +BatchDeleteDocumentRequest +BatchDeleteDocumentResponse +BatchDeleteDocumentResponseFailedDocument +BatchDeleteFeaturedResultsSetError +BatchDeleteFeaturedResultsSetRequest +BatchDeleteFeaturedResultsSetResponse +BatchDeleteGeofenceError +BatchDeleteGeofenceRequest +BatchDeleteGeofenceResponse +BatchDeleteImageRequest +BatchDeleteImageResponse +BatchDeleteImportDataError +BatchDeleteImportDataRequest +BatchDeleteImportDataResponse +BatchDeleteObject +BatchDeletePartitionRequest +BatchDeletePartitionResponse +BatchDeletePhoneNumberRequest +BatchDeletePhoneNumberResponse +BatchDeleteReadSetRequest +BatchDeleteReadSetResponse +BatchDeleteRecipeVersionRequest +BatchDeleteRecipeVersionResponse +BatchDeleteRequest +BatchDeleteRequestSizeExceededFault +BatchDeleteResponse +BatchDeleteRumMetricDefinitionsError +BatchDeleteRumMetricDefinitionsRequest +BatchDeleteRumMetricDefinitionsResponse +BatchDeleteScheduledActionAnswer +BatchDeleteScheduledActionType +BatchDeleteTableRequest +BatchDeleteTableResponse +BatchDeleteTableRowsRequest +BatchDeleteTableRowsResult +BatchDeleteTableVersionRequest +BatchDeleteTableVersionResponse +BatchDeleteWorldsRequest +BatchDeleteWorldsResponse +BatchDescribeMergeConflictsError +BatchDescribeMergeConflictsInput +BatchDescribeMergeConflictsOutput +BatchDescribeModelPackageError +BatchDescribeModelPackageErrorMap +BatchDescribeModelPackageInput +BatchDescribeModelPackageOutput +BatchDescribeModelPackageSummary +BatchDescribeSimulationJobRequest +BatchDescribeSimulationJobResponse +BatchDescribeTypeConfigurationsError +BatchDescribeTypeConfigurationsInput +BatchDescribeTypeConfigurationsOutput +BatchDetachFromIndex +BatchDetachFromIndexResponse +BatchDetachObject +BatchDetachObjectResponse +BatchDetachPolicy +BatchDetachTypedLink +BatchDetectDominantLanguageItemResult +BatchDetectDominantLanguageRequest +BatchDetectDominantLanguageResponse +BatchDetectEntitiesItemResult +BatchDetectEntitiesRequest +BatchDetectEntitiesResponse +BatchDetectKeyPhrasesItemResult +BatchDetectKeyPhrasesRequest +BatchDetectKeyPhrasesResponse +BatchDetectSentimentItemResult +BatchDetectSentimentRequest +BatchDetectSentimentResponse +BatchDetectSyntaxItemResult +BatchDetectSyntaxRequest +BatchDetectSyntaxResponse +BatchDetectTargetedSentimentItemResult +BatchDetectTargetedSentimentRequest +BatchDetectTargetedSentimentResponse +BatchDisableAlarmRequest +BatchDisableAlarmResponse +BatchDisableStandardsRequest +BatchDisableStandardsResponse +BatchDisassociateApprovalRuleTemplateFromRepositoriesError +BatchDisassociateApprovalRuleTemplateFromRepositoriesInput +BatchDisassociateApprovalRuleTemplateFromRepositoriesOutput +BatchDisassociateAssessmentReportEvidenceRequest +BatchDisassociateAssessmentReportEvidenceResponse +BatchDisassociateClientDeviceFromCoreDeviceRequest +BatchDisassociateClientDeviceFromCoreDeviceResponse +BatchDisassociateProjectAssetsRequest +BatchDisassociateProjectAssetsResponse +BatchDisassociateResourceRequest +BatchDisassociateResourceResponse +BatchDisassociateResourcesFromCustomLineItemInput +BatchDisassociateResourcesFromCustomLineItemOutput +BatchDisassociateScramSecretRequest +BatchDisassociateScramSecretResponse +BatchDisassociateServiceActionFromProvisioningArtifactInput +BatchDisassociateServiceActionFromProvisioningArtifactOutput +BatchDisassociateUserStackRequest +BatchDisassociateUserStackResult +BatchEnableAlarmRequest +BatchEnableAlarmResponse +BatchEnableStandardsRequest +BatchEnableStandardsResponse +BatchEntryIdsNotDistinctException +BatchEnvironmentVariable +BatchError +BatchEvaluateFeatureRequest +BatchEvaluateFeatureResponse +BatchEvaluateGeofencesError +BatchEvaluateGeofencesRequest +BatchEvaluateGeofencesResponse +BatchExecuteStatementException +BatchExecuteStatementInput +BatchExecuteStatementOutput +BatchExecuteStatementRequest +BatchExecuteStatementResponse +BatchFailedResultModel +BatchGetAccountStatusRequest +BatchGetAccountStatusResponse +BatchGetAggregateResourceConfigRequest +BatchGetAggregateResourceConfigResponse +BatchGetApplicationRevisionsInput +BatchGetApplicationRevisionsOutput +BatchGetApplicationsInput +BatchGetApplicationsOutput +BatchGetAssetPropertyAggregatesEntry +BatchGetAssetPropertyAggregatesErrorEntry +BatchGetAssetPropertyAggregatesErrorInfo +BatchGetAssetPropertyAggregatesRequest +BatchGetAssetPropertyAggregatesResponse +BatchGetAssetPropertyAggregatesSkippedEntry +BatchGetAssetPropertyAggregatesSuccessEntry +BatchGetAssetPropertyValueEntry +BatchGetAssetPropertyValueErrorEntry +BatchGetAssetPropertyValueErrorInfo +BatchGetAssetPropertyValueHistoryEntry +BatchGetAssetPropertyValueHistoryErrorEntry +BatchGetAssetPropertyValueHistoryErrorInfo +BatchGetAssetPropertyValueHistoryRequest +BatchGetAssetPropertyValueHistoryResponse +BatchGetAssetPropertyValueHistorySkippedEntry +BatchGetAssetPropertyValueHistorySuccessEntry +BatchGetAssetPropertyValueRequest +BatchGetAssetPropertyValueResponse +BatchGetAssetPropertyValueSkippedEntry +BatchGetAssetPropertyValueSuccessEntry +BatchGetAutomationRulesRequest +BatchGetAutomationRulesResponse +BatchGetBlueprintsRequest +BatchGetBlueprintsResponse +BatchGetBuildBatchesInput +BatchGetBuildBatchesOutput +BatchGetBuildsInput +BatchGetBuildsOutput +BatchGetChannelRequest +BatchGetChannelResponse +BatchGetCodeSnippetRequest +BatchGetCodeSnippetResponse +BatchGetCollaborationAnalysisTemplateError +BatchGetCollaborationAnalysisTemplateInput +BatchGetCollaborationAnalysisTemplateOutput +BatchGetCollectionRequest +BatchGetCollectionResponse +BatchGetCommitsError +BatchGetCommitsInput +BatchGetCommitsOutput +BatchGetCrawlersRequest +BatchGetCrawlersResponse +BatchGetCustomDataIdentifierSummary +BatchGetCustomDataIdentifiersRequest +BatchGetCustomDataIdentifiersResponse +BatchGetCustomEntityTypesRequest +BatchGetCustomEntityTypesResponse +BatchGetDataQualityResultRequest +BatchGetDataQualityResultResponse +BatchGetDeploymentGroupsInput +BatchGetDeploymentGroupsOutput +BatchGetDeploymentInstancesInput +BatchGetDeploymentInstancesOutput +BatchGetDeploymentTargetsInput +BatchGetDeploymentTargetsOutput +BatchGetDeploymentsInput +BatchGetDeploymentsOutput +BatchGetDevEndpointsRequest +BatchGetDevEndpointsResponse +BatchGetDevicePositionError +BatchGetDevicePositionRequest +BatchGetDevicePositionResponse +BatchGetDocumentStatusRequest +BatchGetDocumentStatusResponse +BatchGetDocumentStatusResponseError +BatchGetFieldRequest +BatchGetFieldResponse +BatchGetFindingDetailsRequest +BatchGetFindingDetailsResponse +BatchGetFindingsError +BatchGetFindingsRequest +BatchGetFindingsResponse +BatchGetFrameMetricDataRequest +BatchGetFrameMetricDataResponse +BatchGetFreeTrialInfoRequest +BatchGetFreeTrialInfoResponse +BatchGetGraphMemberDatasourcesRequest +BatchGetGraphMemberDatasourcesResponse +BatchGetImageRequest +BatchGetImageResponse +BatchGetItemInput +BatchGetItemOutput +BatchGetJobsRequest +BatchGetJobsResponse +BatchGetLinkAttributes +BatchGetLinkAttributesResponse +BatchGetMemberEc2DeepInspectionStatusRequest +BatchGetMemberEc2DeepInspectionStatusResponse +BatchGetMembershipDatasourcesRequest +BatchGetMembershipDatasourcesResponse +BatchGetMetricDataQuery +BatchGetMetricDataRequest +BatchGetMetricDataResponse +BatchGetNamedQueryInput +BatchGetNamedQueryOutput +BatchGetObjectAttributes +BatchGetObjectAttributesResponse +BatchGetObjectInformation +BatchGetObjectInformationResponse +BatchGetOnPremisesInstancesInput +BatchGetOnPremisesInstancesOutput +BatchGetPartitionRequest +BatchGetPartitionResponse +BatchGetPreparedStatementInput +BatchGetPreparedStatementOutput +BatchGetProjectsInput +BatchGetProjectsOutput +BatchGetQueryExecutionInput +BatchGetQueryExecutionOutput +BatchGetRecordError +BatchGetRecordIdentifier +BatchGetRecordRequest +BatchGetRecordResponse +BatchGetRecordResultDetail +BatchGetReportGroupsInput +BatchGetReportGroupsOutput +BatchGetReportsInput +BatchGetReportsOutput +BatchGetRepositoriesInput +BatchGetRepositoriesOutput +BatchGetRepositoryScanningConfigurationRequest +BatchGetRepositoryScanningConfigurationResponse +BatchGetResourceConfigRequest +BatchGetResourceConfigResponse +BatchGetRumMetricDefinitionsRequest +BatchGetRumMetricDefinitionsResponse +BatchGetSchemaError +BatchGetSchemaInput +BatchGetSchemaOutput +BatchGetSecurityControlsRequest +BatchGetSecurityControlsResponse +BatchGetStandardsControlAssociationsRequest +BatchGetStandardsControlAssociationsResponse +BatchGetStreamKeyRequest +BatchGetStreamKeyResponse +BatchGetTokenBalanceErrorItem +BatchGetTokenBalanceInput +BatchGetTokenBalanceInputItem +BatchGetTokenBalanceOutput +BatchGetTokenBalanceOutputItem +BatchGetTracesRequest +BatchGetTracesResult +BatchGetTriggersRequest +BatchGetTriggersResponse +BatchGetUserAccessTasksRequest +BatchGetUserAccessTasksResponse +BatchGetVariableError +BatchGetVariableRequest +BatchGetVariableResult +BatchGetViewError +BatchGetViewInput +BatchGetViewOutput +BatchGetVpcEndpointRequest +BatchGetVpcEndpointResponse +BatchGetWorkflowsRequest +BatchGetWorkflowsResponse +BatchGrantPermissionsRequest +BatchGrantPermissionsResponse +BatchId +BatchImport +BatchImportEvidenceToAssessmentControlError +BatchImportEvidenceToAssessmentControlRequest +BatchImportEvidenceToAssessmentControlResponse +BatchImportFindingsRequest +BatchImportFindingsResponse +BatchImportMetaDataOnCreate +BatchInferenceJob +BatchInferenceJobConfig +BatchInferenceJobInput +BatchInferenceJobOutput +BatchInferenceJobSummary +BatchItem +BatchItemError +BatchJobDependency +BatchJobExecutionSummary +BatchJobParameters +BatchLimitExceededException +BatchListAttachedIndices +BatchListAttachedIndicesResponse +BatchListIncomingTypedLinks +BatchListIncomingTypedLinksResponse +BatchListIndex +BatchListIndexResponse +BatchListObjectAttributes +BatchListObjectAttributesResponse +BatchListObjectChildren +BatchListObjectChildrenResponse +BatchListObjectParentPaths +BatchListObjectParentPathsResponse +BatchListObjectParents +BatchListObjectParentsResponse +BatchListObjectPolicies +BatchListObjectPoliciesResponse +BatchListOutgoingTypedLinks +BatchListOutgoingTypedLinksResponse +BatchListPolicyAttachments +BatchListPolicyAttachmentsResponse +BatchLoadProgressReport +BatchLoadTask +BatchLoadTaskDescription +BatchLoadTasks +BatchLookupPolicy +BatchLookupPolicyResponse +BatchMeterUsageRequest +BatchMeterUsageResult +BatchModifyClusterSnapshotsLimitExceededFault +BatchModifyClusterSnapshotsMessage +BatchModifyClusterSnapshotsOutputMessage +BatchParameters +BatchPermissionsFailureEntry +BatchPermissionsRequestEntry +BatchPolicy +BatchPrediction +BatchPredictionDataSourceId +BatchPredictionId +BatchPredictionName +BatchPutAssetPropertyError +BatchPutAssetPropertyErrorEntry +BatchPutAssetPropertyValueRequest +BatchPutAssetPropertyValueResponse +BatchPutDocumentRequest +BatchPutDocumentResponse +BatchPutDocumentResponseFailedDocument +BatchPutFieldOptionsRequest +BatchPutFieldOptionsResponse +BatchPutGeofenceError +BatchPutGeofenceRequest +BatchPutGeofenceRequestEntry +BatchPutGeofenceResponse +BatchPutGeofenceSuccess +BatchPutMessageErrorEntries +BatchPutMessageErrorEntry +BatchPutMessageRequest +BatchPutMessageResponse +BatchPutMetricsError +BatchPutMetricsRequest +BatchPutMetricsResponse +BatchPutPropertyError +BatchPutPropertyErrorEntry +BatchPutPropertyValuesRequest +BatchPutPropertyValuesResponse +BatchPutScheduledUpdateGroupActionAnswer +BatchPutScheduledUpdateGroupActionType +BatchReadException +BatchReadOperation +BatchReadOperationResponse +BatchReadRequest +BatchReadResponse +BatchReadSuccessfulResponse +BatchRecordsEndTime +BatchRecordsStartTime +BatchReferenceName +BatchRemoveFacetFromObject +BatchRequestTooLongException +BatchResetAlarmRequest +BatchResetAlarmResponse +BatchResourceRequirement +BatchRestrictions +BatchResultErrorEntry +BatchRetryStrategy +BatchRevokePermissionsRequest +BatchRevokePermissionsResponse +BatchScheduleActionCreateRequest +BatchScheduleActionCreateResult +BatchScheduleActionDeleteRequest +BatchScheduleActionDeleteResult +BatchSegmentJob +BatchSegmentJobInput +BatchSegmentJobOutput +BatchSegmentJobSummary +BatchSize +BatchSizeLimitExceededException +BatchSnoozeAlarmRequest +BatchSnoozeAlarmResponse +BatchStartRecommendationsErrorEntry +BatchStartRecommendationsRequest +BatchStartRecommendationsResponse +BatchStartRequest +BatchStartResponse +BatchStartViewerSessionRevocationError +BatchStartViewerSessionRevocationRequest +BatchStartViewerSessionRevocationResponse +BatchStartViewerSessionRevocationViewerSession +BatchStatementError +BatchStatementRequest +BatchStatementResponse +BatchStopJobRunError +BatchStopJobRunRequest +BatchStopJobRunResponse +BatchStopJobRunSuccessfulSubmission +BatchStopRequest +BatchStopResponse +BatchStopUpdateActionMessage +BatchStrategy +BatchSuccessfulResultModel +BatchSuspendUserRequest +BatchSuspendUserResponse +BatchTooLarge +BatchTransformInput +BatchUnsuspendUserRequest +BatchUnsuspendUserResponse +BatchUpdateAttendeeCapabilitiesExceptRequest +BatchUpdateAutomationRulesRequest +BatchUpdateAutomationRulesResponse +BatchUpdateClusterRequest +BatchUpdateClusterResponse +BatchUpdateCustomVocabularyItemRequest +BatchUpdateCustomVocabularyItemResponse +BatchUpdateDetectorErrorEntry +BatchUpdateDetectorRequest +BatchUpdateDetectorResponse +BatchUpdateDevicePositionError +BatchUpdateDevicePositionRequest +BatchUpdateDevicePositionResponse +BatchUpdateFindingsRequest +BatchUpdateFindingsResponse +BatchUpdateFindingsUnprocessedFinding +BatchUpdateLinkAttributes +BatchUpdateMemberEc2DeepInspectionStatusRequest +BatchUpdateMemberEc2DeepInspectionStatusResponse +BatchUpdateObjectAttributes +BatchUpdateObjectAttributesResponse +BatchUpdatePartitionFailureEntry +BatchUpdatePartitionRequest +BatchUpdatePartitionRequestEntry +BatchUpdatePartitionResponse +BatchUpdatePhoneNumberRequest +BatchUpdatePhoneNumberResponse +BatchUpdateRecommendationStatusFailedEntry +BatchUpdateRecommendationStatusRequest +BatchUpdateRecommendationStatusResponse +BatchUpdateRecommendationStatusSuccessfulEntry +BatchUpdateRuleRequest +BatchUpdateRuleResponse +BatchUpdateScheduleRequest +BatchUpdateScheduleResponse +BatchUpdateStandardsControlAssociationsRequest +BatchUpdateStandardsControlAssociationsResponse +BatchUpdateTableRowsRequest +BatchUpdateTableRowsResult +BatchUpdateUserRequest +BatchUpdateUserResponse +BatchUpdateVehicleRequest +BatchUpdateVehicleResponse +BatchUpsertTableRowsRequest +BatchUpsertTableRowsResult +BatchWindow +BatchWriteException +BatchWriteItemInput +BatchWriteItemOutput +BatchWriteOperation +BatchWriteOperationResponse +BatchWriteRequest +BatchWriteResponse +Batches +BatteryLevel +BccAddresses +Bcch +BcpPacketSize +Beaconing +Beard +BearerToken +Before +BeforeCommitIdAndAfterCommitIdAreSameException +BeforeCreationDate +Begin +BeginMarker +BeginOffset +BeginOffsetChar +BeginOffsetMillis +BeginTransactionRequest +BeginTransactionResponse +Behavior +BehaviorCriteria +BehaviorModelTrainingSummary +BehaviorOnMXFailure +BehaviorOnMxFailure +BehaviorType +Beneficiary +BenefitsConsidered +BerkshelfVersion +BestCandidate +BestObjectiveNotImproving +BestPractice +BestPractices +BestTrainingJob +BgpAsn +BgpConfigurations +BgpOptions +BgpStatus +Bias +BiasPosition +BidPrice +BidPriceAsPercentageOfOnDemandPrice +BillDate +BillExpirationException +BillableTimeInSeconds +BillableTrainingTimeInSeconds +BilledSizeBytes +BillingAddress +BillingDetails +BillingEntity +BillingGroupArn +BillingGroupArns +BillingGroupCostReportElement +BillingGroupCostReports +BillingGroupListElement +BillingGroupMetadata +BillingGroupProperties +BillingGroups +BillingMode +BillingModeOverride +BillingModeSummary +BillingPeriod +BillingPeriodRange +BillingProducts +BillingRecord +BillingRecords +BillingSubscriptionId +BillingTagsSource +BillingToken +BillingViewArn +BinCount +BinCountLimit +BinCountOptions +BinOptions +BinWidth +BinWidthOptions +BinaryColumnStatisticsData +BinaryFile +BinaryListValues +BinaryMediaTypes +BinaryPrefixLocation +BinaryValue +BirthDate +BisectBatchOnFunctionError +BitDepth +BitOrder +BitRate +Bitbucket +Bitrate +BitrateClass +BitsPerSecond +BitstreamMode +BlackDetectThreshold +BlackFrame +BlackFrameMsec +Blackhole +Blacklist +BlacklistEntry +BlacklistItemNames +BlacklistReport +BlackoutSlate +BlackoutSlateImage +BlankCellFormat +Blob +BlobAttributeValue +BlobIdDoesNotExistException +BlobIdRequiredException +BlobMetadata +BlobType +Block +BlockAction +BlockAddress +BlockData +BlockDeviceMapping +BlockDeviceMappingSet +BlockDeviceMappings +BlockDurationMinutes +BlockEmail +BlockId +BlockIndex +BlockListSummaryItems +BlockOverrideDnsType +BlockOverrideDomain +BlockOverrideTtl +BlockPublicAccess +BlockPublicAccessConfiguration +BlockPublicAccessConfigurationMetadata +BlockPublicAcls +BlockPublicPolicy +BlockPublicSecurityGroupRules +BlockReference +BlockReferences +BlockResponse +BlockSize +BlockSizeBytes +BlockToken +BlockType +BlockchainInstant +Blocked +BlockedException +BlockedIPRangeList +BlockedReason +BlockerDeclaration +Blocks +BlogConfiguration +BlogFieldMappings +BloomFilterColumns +BloomFilterFalsePositiveProbability +Blue +BlueGreenDeployment +BlueGreenDeploymentAlreadyExistsFault +BlueGreenDeploymentConfiguration +BlueGreenDeploymentIdentifier +BlueGreenDeploymentName +BlueGreenDeploymentNotFoundFault +BlueGreenDeploymentTask +BlueGreenDeployments +BlueGreenUpdatePolicy +BlueInstanceTerminationOption +BluePrimaryX +BluePrimaryY +Blueprint +BlueprintDetails +BlueprintLocation +BlueprintName +BlueprintRun +BlueprintRuns +BlueprintServiceLocation +Blueprints +Body +BodyConfig +BodyContains +BodyOverride +BodyParameters +BodyParts +BodySectionConfiguration +BodySectionContent +BodySections +BonusAmount +BonusPayment +BonusPayments +BookingOptions +Bookmarks +BookmarksConfigurations +BooleanColumnStatisticsData +BooleanFilter +BooleanValue +BootMode +Booting +BootstrapActionConfig +BootstrapActionDetail +BootstrapActions +BootstrapBrokerString +BootstrapBrokerStringPublicSaslIam +BootstrapBrokerStringPublicSaslScram +BootstrapBrokerStringPublicTls +BootstrapBrokerStringSaslIam +BootstrapBrokerStringSaslScram +BootstrapBrokerStringTls +BootstrapBrokerStringVpcConnectivitySaslIam +BootstrapBrokerStringVpcConnectivitySaslScram +BootstrapBrokerStringVpcConnectivityTls +BootstrapServers +Border +BorderColor +BorderRadius +BorderStyle +BorderThickness +BorderVisibility +BorrowConfiguration +BorrowCount +Bot +BotAliasHistoryEvent +BotAliasLocaleSettings +BotAliasMetadata +BotAliasSummary +BotAliasTestExecutionTarget +BotAliases +BotChannelAssociation +BotEmail +BotExportSpecification +BotFilter +BotId +BotImportSpecification +BotLocaleExportSpecification +BotLocaleFilter +BotLocaleHistoryEvent +BotLocaleImportSpecification +BotLocaleSortBy +BotLocaleSummary +BotMember +BotMetadata +BotName +BotRecommendationResultStatistics +BotRecommendationResults +BotRecommendationSummary +BotSortBy +BotSummary +BotType +BotVersionLocaleDetails +BotVersionSortBy +BotVersionSummary +Bots +Bottom +Bounce +BounceAction +BounceSender +BounceSenderArn +BounceSubType +BounceTopic +BounceType +BouncedRecipientInfo +BouncedRecipientInfoList +Bounces +BoundedFiles +BoundedSize +BoundingBox +BoundingBoxCount +Bounds +BoxConfiguration +BoxPlotAggregatedFieldWells +BoxPlotChartConfiguration +BoxPlotFieldWells +BoxPlotOptions +BoxPlotSortConfiguration +BoxPlotStyleOptions +BoxPlotVisual +Branch +BranchDiff +BranchDiffSourceCodeType +BranchDoesNotExistException +BranchInfo +BranchInterfaceId +BranchName +BranchNameExistsException +BranchNameIsTagNameException +BranchNameRequiredException +BranchOrder +Branches +Brand +BrandName +BreachAction +BreachThreshold +BreakdownItemsLimit +Breakdowns +BreakoutCode +Bridge +BridgeArn +BridgeFlowOutput +BridgeFlowSource +BridgeMessages +BridgeNetworkOutput +BridgeNetworkSource +BridgeOutput +BridgePlacement +BridgePorts +BridgeSource +BridgeState +BridgeType +Bridges +Brightness +Broker +BrokerAZDistribution +BrokerArn +BrokerEBSVolumeInfo +BrokerEngineType +BrokerEngineTypes +BrokerId +BrokerIds +BrokerInstance +BrokerInstanceOption +BrokerInstanceOptions +BrokerInstances +BrokerLogs +BrokerName +BrokerNodeGroupInfo +BrokerNodeInfo +BrokerSoftwareInfo +BrokerState +BrokerSummaries +BrokerSummary +BrowserSettings +BrowserSettingsSummary +Bsic +Bucket +BucketARN +BucketARNUpdate +BucketAccessLogConfig +BucketAccessRoleArn +BucketAccountId +BucketArn +BucketBundle +BucketColumns +BucketConfiguration +BucketCountByEffectivePermission +BucketCountByEncryptionType +BucketCountBySharedAccessType +BucketCountPolicyAllowsUnencryptedObjectUploads +BucketCriteriaAdditionalProperties +BucketFolder +BucketInfo +BucketKeyEnabled +BucketLevel +BucketLevelPermissions +BucketLifecycleConfiguration +BucketLoggingConfiguration +BucketLoggingStatus +BucketMetadata +BucketName +BucketNameFilterRequiredException +BucketNotFoundFault +BucketNotificationConfiguration +BucketOwner +BucketPermissionConfiguration +BucketPolicy +BucketPrefix +BucketPublicAccess +BucketRegion +BucketServerSideEncryption +BucketSortCriteria +BucketState +BucketStatisticsBySensitivity +BucketVersioningConfiguration +BucketWebsiteConfiguration +Buckets +BucketsAggregationType +Budget +BudgetAdjustmentPeriod +BudgetDetail +BudgetLimit +BudgetName +BudgetNotificationsForAccount +BudgetPerformanceHistory +BudgetType +BudgetedAmount +BudgetedAndActualAmounts +BudgetedAndActualAmountsList +Budgets +BufFillPct +BufSize +BufferDuration +BufferModel +BufferMsec +BufferSegments +BufferingHints +BugzillaIds +Build +BuildArn +BuildArtifacts +BuildArtifactsObjectKey +BuildBatch +BuildBatchFilter +BuildBatchPhase +BuildBotLocaleRequest +BuildBotLocaleResponse +BuildCommand +BuildConfiguration +BuildGroup +BuildId +BuildNotDeleted +BuildPhase +BuildStatusConfig +BuildSuggestersRequest +BuildSuggestersResponse +BuildSummary +Builder +Builds +BuiltInIntentSortBy +BuiltInIntentSummary +BuiltInSlotTypeSortBy +BuiltInSlotTypeSummary +BuiltinIntentMetadata +BuiltinIntentSlot +BuiltinSlotTypeMetadata +BulkDeployment +BulkDeploymentArn +BulkDeploymentId +BulkDeploymentMetrics +BulkDeploymentResult +BulkDeploymentStatus +BulkDeployments +BulkEmailContent +BulkEmailDestination +BulkEmailDestinationStatus +BulkEmailEntries +BulkEmailEntry +BulkEmailEntryResult +BulkEmailEntryResults +BulkLoadIdNotFoundException +BulkPublishCompleteTime +BulkPublishRequest +BulkPublishResponse +BulkPublishStartTime +BulkPublishStatus +BulletPoints +Bumper +Bundle +BundleDescription +BundleDetails +BundleId +BundleIds +BundleInformation +BundleInstanceRequest +BundleInstanceResult +BundleName +BundleTask +BundleTaskError +BundleTasks +BundleType +Bundles +BurnInDestinationSettings +BurninDestinationSettings +BurstablePerformance +BurstablePerformanceSupported +BusinessCalling +BusinessCallingSettings +BusinessEmailAddress +BusinessGoals +BusinessName +BusinessPhoneNumber +BusinessReport +BusinessReportContentRange +BusinessReportRecurrence +BusinessReportS3Location +BusinessReportSchedule +BusinessReportSchedules +Button +ButtonAction +ByAccountId +ByBackupPlanId +ByBackupVaultName +ByCompleteAfter +ByCompleteBefore +ByCreatedAfter +ByCreatedBefore +ByCreationAfter +ByCreationBefore +ByDestinationVaultArn +ByParentJobId +ByParentRecoveryPointArn +ByReportPlanName +ByResourceArn +ByResourceType +ByShared +ByState +ByStatus +ByVaultType +ByoipCidr +ByoipCidrEvent +ByoipCidrNotFoundException +ByoipCidrs +BypassGovernanceRetention +BypassPolicyLockoutCheck +BypassPolicyLockoutSafetyCheck +BypassSnaplockEnterpriseRetention +ByteMatchSet +ByteMatchSetId +ByteMatchSetSummary +ByteMatchSetUpdate +ByteMatchSets +ByteMatchStatement +ByteMatchTuple +ByteMatchTuples +Bytes +BytesCompressed +BytesConverted +BytesMetered +BytesPerHour +BytesPerSecond +BytesProcessed +BytesReturned +BytesScanned +BytesScannedCutoffPerQuery +BytesTransferred +BytesWritten +CACertificate +CACertificateDescription +CACertificateIdentifier +CAIdentifier +CFNRegistryException +CIDRIP +CIDRSummary +CIDRs +CNAME +CNAMEAlreadyExists +CNAMEPrefix +CORSConfiguration +CORSRule +CORSRules +CPU +CPUUtilization +CRLSign +CSS +CSSColor +CSSVersion +CSV +CSVHeader +CSVInput +CSVMappingParameters +CSVOutput +CUSTOM +CVEIds +CWEMonitorEnabled +CaCertificateIdentifier +CaEndpoint +CaLogs +CacheAllocatedInBytes +CacheAttributes +CacheBehavior +CacheBehaviorPerPath +CacheBehaviors +CacheCluster +CacheClusterAlreadyExistsFault +CacheClusterCreateTime +CacheClusterEnabled +CacheClusterId +CacheClusterIds +CacheClusterMessage +CacheClusterNotFoundFault +CacheClusterSize +CacheClusterStatus +CacheClusters +CacheControl +CacheDataEncrypted +CacheDirtyPercentage +CacheEngineDescription +CacheEngineVersion +CacheEngineVersionDescription +CacheEngineVersionMessage +CacheEngineVersions +CacheFullBehavior +CacheHitPercentage +CacheHitResult +CacheLength +CacheMissPercentage +CacheNode +CacheNodeCount +CacheNodeCreateTime +CacheNodeId +CacheNodeIdsToReboot +CacheNodeIdsToRemove +CacheNodeStatus +CacheNodeType +CacheNodeTypeSpecificParameter +CacheNodeTypeSpecificParameters +CacheNodeTypeSpecificValue +CacheNodeTypeSpecificValues +CacheNodeUpdateStatus +CacheNodes +CacheParameterGroup +CacheParameterGroupAlreadyExistsFault +CacheParameterGroupDetails +CacheParameterGroupFamily +CacheParameterGroupName +CacheParameterGroupNameMessage +CacheParameterGroupNotFoundFault +CacheParameterGroupQuotaExceededFault +CacheParameterGroupStatus +CacheParameterGroups +CacheParameterGroupsMessage +CachePeriodInMinutes +CachePolicy +CachePolicyAlreadyExists +CachePolicyConfig +CachePolicyCookiesConfig +CachePolicyHeadersConfig +CachePolicyId +CachePolicyInUse +CachePolicyList +CachePolicyQueryStringsConfig +CachePolicySummary +CacheSecurityGroup +CacheSecurityGroupAlreadyExistsFault +CacheSecurityGroupMembership +CacheSecurityGroupMessage +CacheSecurityGroupName +CacheSecurityGroupNames +CacheSecurityGroupNotFoundFault +CacheSecurityGroupQuotaExceededFault +CacheSecurityGroups +CacheSettings +CacheSize +CacheStaleTimeoutInSeconds +CacheSubnetGroup +CacheSubnetGroupAlreadyExistsFault +CacheSubnetGroupDescription +CacheSubnetGroupInUse +CacheSubnetGroupMessage +CacheSubnetGroupName +CacheSubnetGroupNotFoundFault +CacheSubnetGroupQuotaExceededFault +CacheSubnetGroups +CacheSubnetQuotaExceededFault +CacheTTL +CacheTtlInSeconds +CacheUsedPercentage +CachedMethods +CachediSCSIVolume +CachediSCSIVolumes +CachingConfig +CachingEnabled +CalculateRouteCarModeOptions +CalculateRouteMatrixRequest +CalculateRouteMatrixResponse +CalculateRouteMatrixSummary +CalculateRouteRequest +CalculateRouteResponse +CalculateRouteSummary +CalculateRouteTruckModeOptions +CalculatedAttributeName +CalculatedBaselineConstraints +CalculatedBaselineStatistics +CalculatedColumn +CalculatedField +CalculatedFieldDescription +CalculatedFieldName +CalculatedFieldSynonyms +CalculatedFields +CalculatedLifecycle +CalculatedMeasureField +CalculatedSpend +Calculation +CalculationConfiguration +CalculationExecutionId +CalculationResult +CalculationStatistics +CalculationStatus +CalculationSummary +Calculations +CalculatorArn +CalculatorName +CalendarNames +CallAnalyticsEntity +CallAnalyticsItem +CallAnalyticsJob +CallAnalyticsJobName +CallAnalyticsJobSettings +CallAnalyticsJobStatus +CallAnalyticsJobSummaries +CallAnalyticsJobSummary +CallAnalyticsStreamCategories +CallAnalyticsTranscriptResultStream +CallAs +CallDetails +CallInstructionsMessage +CallInstructionsMessageType +CallLeg +CallRateLimitExceededException +Callback +CallbackId +CallbackStepMetadata +CallbackToken +CallbackURLs +CallerArn +CallerId +CallerReference +CallerType +CallingCountry +CallingName +CallingNameStatus +CallingNameUpdatedTimestamp +CallingRegions +Campaign +CampaignConfig +CampaignCustomMessage +CampaignDateRangeKpiResponse +CampaignEmailMessage +CampaignEventFilter +CampaignFilters +CampaignHook +CampaignId +CampaignInAppMessage +CampaignLimits +CampaignResponse +CampaignSmsMessage +CampaignState +CampaignStatus +CampaignSummary +CampaignUpdateSummary +CampaignsResponse +CanDbcDefinition +CanInterface +CanSignal +Canaries +CanariesLastRun +Canary +CanaryCodeInput +CanaryCodeOutput +CanaryLastRun +CanaryName +CanaryRun +CanaryRunConfigInput +CanaryRunConfigOutput +CanaryRunStatus +CanaryRunTimeline +CanaryRuns +CanaryScheduleInput +CanaryScheduleOutput +CanarySettings +CanarySize +CanaryStatus +CanaryTimeline +CancelAnnotationImportRequest +CancelArchivalInput +CancelArchivalOutput +CancelAuditMitigationActionsTaskRequest +CancelAuditTaskRequest +CancelBatchImportJobRequest +CancelBatchJobExecutionRequest +CancelBatchPredictionJobRequest +CancelBundleTaskRequest +CancelBundleTaskResult +CancelCapacityReservationFleetError +CancelCapacityReservationFleetsRequest +CancelCapacityReservationFleetsResult +CancelCapacityReservationInput +CancelCapacityReservationRequest +CancelCapacityReservationResult +CancelCertificateTransferRequest +CancelChangeSetRequest +CancelChangeSetResponse +CancelClusterRequest +CancelCommandRequest +CancelComponentDeploymentInput +CancelComponentDeploymentOutput +CancelContactRequest +CancelConversionRequest +CancelDataQualityRuleRecommendationRunRequest +CancelDataQualityRulesetEvaluationRunRequest +CancelDataRepositoryTaskRequest +CancelDataRepositoryTaskResponse +CancelDeploymentJobRequest +CancelDeploymentRequest +CancelDeploymentResponse +CancelDescription +CancelDetectMitigationActionsTaskRequest +CancelDomainTransferToAnotherAwsAccountRequest +CancelDomainTransferToAnotherAwsAccountResponse +CancelElasticsearchServiceSoftwareUpdateRequest +CancelElasticsearchServiceSoftwareUpdateResponse +CancelEnvironmentDeploymentInput +CancelEnvironmentDeploymentOutput +CancelExportJobRequest +CancelExportTaskMessage +CancelExportTaskRequest +CancelFindingsReportRequest +CancelFindingsReportResponse +CancelFlowExecutionsRequest +CancelFlowExecutionsResponse +CancelGremlinQueryInput +CancelGremlinQueryOutput +CancelHandshakeRequest +CancelHandshakeResponse +CancelImageCreationRequest +CancelImageCreationResponse +CancelImageLaunchPermissionRequest +CancelImageLaunchPermissionResult +CancelImportTaskRequest +CancelImportTaskResult +CancelIngestionRequest +CancelIngestionResponse +CancelInputDeviceTransferRequest +CancelInstanceRefreshAnswer +CancelInstanceRefreshType +CancelJobExecutionRequest +CancelJobRequest +CancelJobResponse +CancelJobRunRequest +CancelJobRunResponse +CancelJournalKinesisStreamRequest +CancelJournalKinesisStreamResponse +CancelKeyDeletionRequest +CancelKeyDeletionResponse +CancelLegalHoldInput +CancelLoaderJobInput +CancelLoaderJobOutput +CancelMLDataProcessingJobInput +CancelMLDataProcessingJobOutput +CancelMLModelTrainingJobInput +CancelMLModelTrainingJobOutput +CancelMLModelTransformJobInput +CancelMLModelTransformJobOutput +CancelMLTaskRunRequest +CancelMLTaskRunResponse +CancelMailboxExportJobRequest +CancelMaintenanceWindowExecutionRequest +CancelMaintenanceWindowExecutionResult +CancelMessageMoveTaskRequest +CancelMessageMoveTaskResult +CancelMulticastGroupSessionRequest +CancelOpenCypherQueryInput +CancelOpenCypherQueryOutput +CancelOrderInput +CancelPipelineReprocessingRequest +CancelPolicyGenerationRequest +CancelQuantumTaskRequest +CancelQuantumTaskResponse +CancelQueryRequest +CancelQueryResponse +CancelReason +CancelReplayRequest +CancelReplayResponse +CancelReplicationTaskAssessmentRunMessage +CancelReplicationTaskAssessmentRunResponse +CancelReservedInstancesListingRequest +CancelReservedInstancesListingResult +CancelResizeMessage +CancelResourceRequestInput +CancelResourceRequestOutput +CancelRetrievalInput +CancelRetrievalOutput +CancelRotateSecretRequest +CancelRotateSecretResponse +CancelRunRequest +CancelSbomExportRequest +CancelSbomExportResponse +CancelSchemaExtensionRequest +CancelServiceInstanceDeploymentInput +CancelServiceInstanceDeploymentOutput +CancelServicePipelineDeploymentInput +CancelServicePipelineDeploymentOutput +CancelServiceSoftwareUpdateRequest +CancelServiceSoftwareUpdateResponse +CancelSigningProfileRequest +CancelSimulationJobBatchRequest +CancelSimulationJobRequest +CancelSolNetworkOperationInput +CancelSpotFleetRequestsError +CancelSpotFleetRequestsErrorItem +CancelSpotFleetRequestsRequest +CancelSpotFleetRequestsResponse +CancelSpotFleetRequestsSuccessItem +CancelSpotInstanceRequestsRequest +CancelSpotInstanceRequestsResult +CancelStatementRequest +CancelStatementResponse +CancelStepsInfo +CancelStepsInfoList +CancelStepsInput +CancelStepsOutput +CancelTaskExecutionRequest +CancelTaskInput +CancelTaskOutput +CancelTimerDecisionAttributes +CancelTimerFailedEventAttributes +CancelTransactionRequest +CancelUpdateStackInput +CancelVariantImportRequest +CancelWorkflowExecutionDecisionAttributes +CancelWorkflowExecutionFailedEventAttributes +CancelWorldExportJobRequest +CancelWorldGenerationJobRequest +CancelZonalShiftRequest +Cancellable +CancellationDate +CancellationMessage +CancellationReason +CancellationReasons +CancelledByUserException +CancelledSpotInstanceRequest +CancelledSpotInstanceRequests +CancelledSteps +CandidateAddress +CandidateAddressList +CandidateArtifactLocations +CandidateDefinitionNotebookLocation +CandidateGenerationConfig +CandidateMetrics +CandidateName +CandidateNameEquals +CandidateProperties +CandidateStatus +CandidateStepArn +CandidateStepName +CandidateStepType +CandidateSteps +Candidates +CannedACL +CannedAccessControlList +CannedAcl +CannedAclForObjects +CannotChangeImmutablePublicKeyFields +CannotDelegateManagementAccountException +CannotDeleteApprovalRuleFromTemplateException +CannotDeleteException +CannotListParentOfRootException +CannotModifyApprovalRuleFromTemplateException +CanonicalHostedZoneId +CanonicalHostedZoneName +CanonicalHostedZoneNameID +CanvasAppSettings +CanvasOrientation +CanvasSizeOptions +Cap +CapExceeded +Capabilities +CapabilitiesReason +Capacity +CapacityAllocation +CapacityAllocations +CapacityAssignment +CapacityAssignmentConfiguration +CapacityAssignments +CapacityConfiguration +CapacityDescription +CapacityExceededException +CapacityForecast +CapacityId +CapacityInBytes +CapacityLimits +CapacityProvider +CapacityProviderStrategy +CapacityProviderStrategyItem +CapacityProviders +CapacityProvisioned +CapacityRebalance +CapacityRegion +CapacityReservation +CapacityReservationArn +CapacityReservationFleet +CapacityReservationFleetArn +CapacityReservationFleetCancellationState +CapacityReservationFleetId +CapacityReservationFleetIds +CapacityReservationFleets +CapacityReservationGroup +CapacityReservationGroups +CapacityReservationId +CapacityReservationIds +CapacityReservationName +CapacityReservationOptions +CapacityReservationOptionsRequest +CapacityReservationPreference +CapacityReservationResourceGroupArn +CapacityReservationSpecification +CapacityReservationSpecificationResponse +CapacityReservationTarget +CapacityReservationTargetResponse +CapacityReservations +CapacitySize +CapacitySpecification +CapacitySpecificationSummary +CapacityToRelease +CapacityUnits +CapacityUnitsConfiguration +CapacityUpdate +CapacityUsageSummary +CapacityUsed +CappedCount +Captcha +CaptchaAction +CaptchaConfig +CaptchaResponse +CaptionChannel +CaptionContainerType +CaptionData +CaptionDescription +CaptionDescriptionNames +CaptionDescriptionPreset +CaptionDescriptions +CaptionDestinationSettings +CaptionFormat +CaptionFormats +CaptionLanguageMapping +CaptionLanguageMappings +CaptionLanguageSetting +CaptionRectangle +CaptionSegmentLengthControl +CaptionSelector +CaptionSelectorName +CaptionSelectorSettings +CaptionSelectors +CaptionSource +CaptionSourceFramerate +CaptionSourceSettings +CaptionSources +Captions +CaptureContentTypeHeader +CaptureDdls +CaptureInterval +CaptureIntervalUnits +CaptureMode +CaptureOption +CaptureOptions +CaptureStatus +CaptureTime +CaptureTimeAccuracy +CarModeOptions +CardExpiryDate +CardHolderVerificationValue +CardStatusUpdate +CardVerificationValue1 +CardVerificationValue2 +Cardinality +Carrier +CarrierGateway +CarrierGatewayId +CarrierGatewayIds +CarrierGateways +CarrierIp +CartesianCoordinates +Cascade +CascadingControlConfiguration +CascadingControlSource +CaseCreationLimitExceeded +CaseDetails +CaseEventIncludedData +CaseId +CaseIdNotFound +CaseInsensitive +CaseSensitive +CaseSensitiveNames +CaseSensitivity +CaseSummary +CastColumnTypeOperation +Catalog +CatalogConfiguration +CatalogConfigurationDescription +CatalogConfigurationUpdate +CatalogDatabase +CatalogDeltaSource +CatalogEncryptionMode +CatalogEntry +CatalogHudiSource +CatalogId +CatalogImportStatus +CatalogItem +CatalogItemId +CatalogItems +CatalogKafkaSource +CatalogKinesisSource +CatalogName +CatalogRedshiftSchema +CatalogRedshiftTable +CatalogSchemaChangePolicy +CatalogSource +CatalogTable +CatalogTarget +CatalogTargets +CategoricalAggregationFunction +CategoricalDimensionField +CategoricalHyperParameterRange +CategoricalMeasureField +CategoricalParameter +CategoricalParameterRange +CategoricalParameterRangeSpecification +CategoricalParameterRanges +CategoricalValues +Categories +Category +CategoryAxis +CategoryAxisDisplayOptions +CategoryAxisLabelOptions +CategoryDetails +CategoryDrillDownFilter +CategoryEnum +CategoryEvent +CategoryFilter +CategoryFilterConfiguration +CategoryFilterFunction +CategoryFilterType +CategoryId +CategoryItemsLimit +CategoryItemsLimitConfiguration +CategoryLabelOptions +CategoryLabelVisibility +CategoryList +CategoryName +CategoryProperties +CategorySort +CategoryValue +CategoryValues +CategoryWithFindingNum +CausalAnomalyId +Cause +CausedBy +Causes +CausingEntity +CbetCheckDigitString +CbetSourceId +CbetStepaside +CcAddresses +CcDescriptor +CdcInsertsAndUpdates +CdcInsertsOnly +CdcMaxBatchInterval +CdcMinFileSize +CdcPath +CdcStartPosition +CdcStartTime +CdcStopPosition +CdiInputSpecification +Cdma +CdmaChannel +CdmaLocalId +CdmaNmr +CdmaNmrObj +CdmaObj +CdnConfiguration +CdnIdentifierSecret +CdrBucket +Celebrities +Celebrity +CelebrityDetail +CelebrityFaces +CelebrityRecognition +Cell +CellArn +CellFilters +CellInput +CellName +CellOutput +CellParams +CellReference +CellStyle +CellTowers +CellType +CellValue +CellValueSynonym +CellValueSynonyms +Cells +Center +Cents +CertPolicyId +Certificate +CertificateAlreadyExistsException +CertificateArn +CertificateAssociation +CertificateAssociations +CertificateAuthentication +CertificateAuthenticationRequest +CertificateAuthorities +CertificateAuthority +CertificateAuthorityArn +CertificateAuthorityArnList +CertificateAuthorityConfiguration +CertificateAuthorityData +CertificateAuthorityExpiryInMilliseconds +CertificateAuthorityId +CertificateAuthorityPublicKeyIdentifier +CertificateAuthorityType +CertificateBasedAuthProperties +CertificateBody +CertificateChain +CertificateConfiguration +CertificateConflictException +CertificateCreationDate +CertificateData +CertificateDescription +CertificateDetail +CertificateDetails +CertificateDoesNotExistException +CertificateEnrollmentPolicyServerEndpoint +CertificateExpirationTime +CertificateExpiryInMilliseconds +CertificateFingerprint +CertificateId +CertificateIdentifier +CertificateIds +CertificateInUseException +CertificateInfo +CertificateLimitExceededException +CertificateList +CertificateMessage +CertificateMismatchException +CertificateMode +CertificateName +CertificateNotFoundException +CertificateNotFoundFault +CertificateOptions +CertificateOwner +CertificatePath +CertificatePem +CertificatePolicies +CertificateRevocationList +CertificateRotationRestart +CertificateS3BucketName +CertificateS3ObjectKey +CertificateSerial +CertificateSource +CertificateStateException +CertificateStatuses +CertificateSummary +CertificateSummaryList +CertificateTransparencyLoggingPreference +CertificateType +CertificateUploadDate +CertificateValidationException +CertificateValidationRecord +CertificateValidationRecords +CertificateValidity +CertificateWallet +Certificates +CertificatesInfo +Certifications +CertifyForMarketplace +Chain +ChainId +ChaincodeLogs +Challenge +ChallengeAction +ChallengeCode +ChallengeConfig +ChallengeName +ChallengeParameters +ChallengeRequiredOnNewDevice +ChallengeResponse +ChallengeResponseType +ChallengeResponses +Change +ChangeBatch +ChangeCidrCollectionRequest +ChangeCidrCollectionResponse +ChangeComputeType +ChangeDetails +ChangeDetectingColumns +ChangeId +ChangeInfo +ChangeLog +ChangeMessageVisibilityBatchRequest +ChangeMessageVisibilityBatchRequestEntry +ChangeMessageVisibilityBatchResult +ChangeMessageVisibilityBatchResultEntry +ChangeMessageVisibilityRequest +ChangeName +ChangeOwnershipPrice +ChangePasswordRequest +ChangeProgressDetails +ChangeProgressStage +ChangeProgressStages +ChangeProgressStatus +ChangeProgressStatusDetails +ChangeProgressStatuses +ChangeRequest +ChangeRequestName +ChangeResourceRecordSetsRequest +ChangeResourceRecordSetsResponse +ChangeServerLifeCycleStateRequest +ChangeServerLifeCycleStateSourceServerLifecycle +ChangeSet +ChangeSetArn +ChangeSetHook +ChangeSetHookResourceTargetDetails +ChangeSetHookTargetDetails +ChangeSetId +ChangeSetName +ChangeSetNotFoundException +ChangeSetState +ChangeSetSummary +ChangeSetSummaryList +ChangeSetSummaryListItem +ChangeSetTags +ChangeSetType +ChangeSeverity +ChangeSource +ChangeSummary +ChangeTagsForResourceRequest +ChangeToken +ChangeTokenStatus +ChangeType +ChangeableForDays +ChangedBlock +ChangedBlocks +ChangedBlocksCount +Changes +ChangesetErrorInfo +ChangesetSummary +Channel +ChannelARN +ChannelARNInvalidException +ChannelActivity +ChannelAlreadyExistsException +ChannelArn +ChannelAssociatedWithFlowSummary +ChannelBan +ChannelBanSummary +ChannelBans +ChannelClass +ChannelConfiguration +ChannelCounts +ChannelDefinition +ChannelDefinitions +ChannelEgressEndpoint +ChannelExistsForEDSException +ChannelFlow +ChannelFlowArn +ChannelFlowCallbackRequest +ChannelFlowCallbackResponse +ChannelFlowSummary +ChannelFlows +ChannelGroupListConfiguration +ChannelGroupName +ChannelId +ChannelIdentification +ChannelIds +ChannelInfo +ChannelInfoList +ChannelInsufficientPermission +ChannelListConfiguration +ChannelMapping +ChannelMappings +ChannelMask +ChannelMaxLimitExceededException +ChannelMembership +ChannelMembershipForAppInstanceUserSummary +ChannelMembershipPreferences +ChannelMembershipSummary +ChannelMemberships +ChannelMessage +ChannelMessageCallback +ChannelMessageStatusStructure +ChannelMessageSummary +ChannelMessages +ChannelModeratedByAppInstanceUserSummary +ChannelModerator +ChannelModeratorArn +ChannelModeratorSummary +ChannelModerators +ChannelName +ChannelNameCondition +ChannelNotBroadcasting +ChannelNotFound +ChannelNotFoundException +ChannelOrder +ChannelResponse +ChannelRetentionSettings +ChannelSpecification +ChannelState +ChannelStatistics +ChannelStatus +ChannelStorage +ChannelStorageSummary +ChannelSummary +ChannelTag +ChannelTargetInfo +ChannelType +ChannelUnsupportedSchema +Channels +ChannelsIn +ChannelsOut +ChannelsResponse +ChapCredentials +ChapEnabled +ChapInfo +CharLengthSemantics +CharacterOffsets +CharacterSet +CharacterSetDescription +CharacterSetName +Characters +ChargeDetails +ChargeValue +Charset +ChartAxisLabelOptions +ChartColor +ChartConfiguration +ChatDurationInMinutes +ChatMessage +ChatParticipantRoleConfig +ChatStreamingConfiguration +ChatterFeedConfiguration +CheckCapacityRequest +CheckCapacityResponse +CheckDNSAvailabilityMessage +CheckDNSAvailabilityResultMessage +CheckDetail +CheckDetails +CheckDigitString +CheckDomainAvailabilityRequest +CheckDomainAvailabilityResponse +CheckDomainTransferabilityRequest +CheckDomainTransferabilityResponse +CheckExpression +CheckIfPhoneNumberIsOptedOutInput +CheckIfPhoneNumberIsOptedOutResponse +CheckInLicenseRequest +CheckJobArn +CheckName +CheckSchemaVersionValidityInput +CheckSchemaVersionValidityResponse +CheckSummaries +CheckSummary +CheckType +CheckedTime +CheckerIpRanges +CheckoutBorrowLicenseRequest +CheckoutBorrowLicenseResponse +CheckoutLicenseRequest +CheckoutLicenseResponse +CheckoutMetadata +CheckoutType +CheckpointConfig +CheckpointConfiguration +CheckpointConfigurationDescription +CheckpointConfigurationUpdate +CheckpointDelay +CheckpointInterval +CheckpointIntervalUpdate +CheckpointPercentages +CheckpointingEnabled +CheckpointingEnabledUpdate +Checksum +ChecksumAggregationMethod +ChecksumAlgorithm +ChecksumCRC32 +ChecksumCRC32C +ChecksumMode +ChecksumSHA1 +ChecksumSHA256 +ChefConfiguration +Child +ChildBlock +ChildBlockId +ChildBlocks +ChildComponents +ChildHealthChecks +ChildId +ChildJobsInState +ChildManifestName +ChildNotFoundException +ChildReference +ChildShard +ChildShards +ChildType +ChildWorkflowExecutionCanceledEventAttributes +ChildWorkflowExecutionCompletedEventAttributes +ChildWorkflowExecutionFailedEventAttributes +ChildWorkflowExecutionStartedEventAttributes +ChildWorkflowExecutionTerminatedEventAttributes +ChildWorkflowExecutionTimedOutEventAttributes +Children +ChildrenOfAlarmName +ChimeBearer +ChimeSdkMeetingConcatenationConfiguration +ChimeSdkMeetingConfiguration +ChimeSdkMeetingLiveConnectorConfiguration +Choice +ChoiceAnswer +ChoiceAnswerSummaries +ChoiceAnswerSummary +ChoiceAnswers +ChoiceContent +ChoiceDescription +ChoiceId +ChoiceImprovementPlan +ChoiceTitle +ChoiceUpdate +ChoiceUpdates +Choices +ChromaSampling +Chunk +ChunkChecksum +ChunkChecksumAlgorithm +ChunkIndex +ChunkList +ChunkToken +ChunksCount +Cidr +CidrAllowList +CidrAllowedList +CidrAuthorizationContext +CidrBlock +CidrBlockAssociation +CidrBlockAssociationSet +CidrBlockInUseException +CidrBlockSet +CidrBlockState +CidrBlockSummary +CidrBlocks +CidrCollection +CidrCollectionAlreadyExistsException +CidrCollectionChange +CidrCollectionInUseException +CidrCollectionVersionMismatchException +CidrCollections +CidrIp +CidrIps +CidrIpv4 +CidrIpv6 +CidrList +CidrLocations +CidrRoutingConfig +Cidrs +CifsShareCount +Cipher +CipherText +Ciphers +CiphertextBlob +CiphertextForRecipient +Circle +CisaData +City +CityName +Claim +ClaimCode +ClaimDeviceRequest +ClaimDevicesByClaimCodeRequest +ClaimDevicesByClaimCodeResponse +ClaimFilterOption +ClaimGameServerInput +ClaimGameServerOutput +ClaimPhoneNumberRequest +ClaimPhoneNumberResponse +ClaimRegex +ClaimStatus +ClaimedPhoneNumberSummary +ClapAtom +ClarifyCheck +ClarifyCheckStepMetadata +ClarifyExplainerConfig +ClarifyInferenceConfig +ClarifyShapBaselineConfig +ClarifyShapConfig +ClarifyTextConfig +ClassBTimeout +ClassCTimeout +ClassName +Classes +Classic +ClassicLinkDnsSupport +ClassicLinkDnsSupported +ClassicLinkEnabled +ClassicLinkInstance +ClassicLinkVPCId +ClassicLinkVPCSecurityGroups +ClassicLinkVpcId +ClassicLinkVpcSecurityGroups +ClassicLoadBalancer +ClassicLoadBalancerListener +ClassicLoadBalancers +ClassicLoadBalancersConfig +Classification +ClassificationDetails +ClassificationExportConfiguration +ClassificationResult +ClassificationResultStatus +ClassificationScopeSummary +ClassificationStatus +ClassificationType +ClassificationTypeUpdate +Classifier +ClassifierEvaluationMetrics +ClassifierMetadata +Classifiers +ClassifyDocumentRequest +ClassifyDocumentResponse +CleanAmplifyApp +CleanSourceMetadataOnMismatch +CleansedPhoneNumberE164 +CleansedPhoneNumberNational +ClearAllocationDefaultNetmaskLength +ClearQuerySuggestionsRequest +ClearTimerAction +CliToken +ClickFeedback +ClickFeedbackItems +ClickTime +ClientAffinity +ClientArn +ClientAssociationMetadata +ClientAuthentication +ClientAuthenticationSettingInfo +ClientAuthenticationSettingsInfo +ClientBroker +ClientCache +ClientCertAuthSettings +ClientCertificate +ClientCertificateId +ClientCertificateRevocationListStatus +ClientCertificates +ClientCidrBlock +ClientConfig +ClientConfiguration +ClientConfigurationVersion +ClientConfigurations +ClientConnectOptions +ClientConnectResponseOptions +ClientContext +ClientData +ClientDownloadLandingPage +ClientException +ClientID +ClientIDList +ClientIP +ClientIPPreservationEnabled +ClientId +ClientImpacting +ClientIp +ClientLimitExceededException +ClientList +ClientLoginBannerOptions +ClientLoginBannerResponseOptions +ClientMetadata +ClientName +ClientParameters +ClientPasswordAuthType +ClientPolicy +ClientPolicyTls +ClientProperties +ClientPropertiesList +ClientPropertiesResult +ClientPublicKey +ClientRequestId +ClientRequestImpactStatistics +ClientRequestToken +ClientRequestTokenRequiredException +ClientRootCertificateChain +ClientRootCertificateChainArn +ClientSdkVersion +ClientSecret +ClientSessionId +ClientSideTimestamps +ClientSubnet +ClientSubnets +ClientTimeoutException +ClientToken +ClientTokenConflictException +ClientTokenId +ClientTunnelAddress +ClientVersion +ClientVpcConnection +ClientVpcConnections +ClientVpcIpAddress +ClientVpnAuthentication +ClientVpnAuthenticationRequest +ClientVpnAuthorizationRuleStatus +ClientVpnConnection +ClientVpnConnectionStatus +ClientVpnEndpoint +ClientVpnEndpointAttributeStatus +ClientVpnEndpointId +ClientVpnEndpointIds +ClientVpnEndpointStatus +ClientVpnEndpoints +ClientVpnRoute +ClientVpnRouteStatus +ClientVpnTargetNetworks +Clients +Clip +ClipFragmentSelector +ClipLimits +ClipRange +ClipTimestampRange +ClockRate +ClockSync +Clocks +CloneAppIds +CloneBackendRequest +CloneBackendResponse +CloneGroupId +ClonePermissions +CloneReceiptRuleSetRequest +CloneStackRequest +CloneStackResult +CloseAccountRequest +CloseInstancePublicPortsRequest +CloseInstancePublicPortsResult +CloseStatusFilter +CloseTime +CloseTunnelRequest +Closed +ClosedDays +ClosedDaysRule +CloudComponentStatus +CloudFormation +CloudFormationCollection +CloudFormationCollectionFilter +CloudFormationCostEstimationResourceCollectionFilter +CloudFormationHealth +CloudFormationOverridePropertyConfiguration +CloudFormationStackARN +CloudFormationStackArn +CloudFormationStackRecord +CloudFormationStackRecordSourceInfo +CloudFormationTarget +CloudFrontDefaultCertificate +CloudFrontDistribution +CloudFrontDomain +CloudFrontOriginAccessIdentity +CloudFrontOriginAccessIdentityAlreadyExists +CloudFrontOriginAccessIdentityConfig +CloudFrontOriginAccessIdentityInUse +CloudFrontOriginAccessIdentityList +CloudFrontOriginAccessIdentitySummary +CloudHsmAccessDeniedException +CloudHsmClusterId +CloudHsmClusterInUseException +CloudHsmClusterInvalidConfigurationException +CloudHsmClusterNotActiveException +CloudHsmClusterNotFoundException +CloudHsmClusterNotRelatedException +CloudHsmInternalException +CloudHsmInternalFailureException +CloudHsmInvalidRequestException +CloudHsmResourceNotFoundException +CloudHsmServiceException +CloudHsmTagException +CloudLayout +CloudOnlyDirectoriesCurrentCount +CloudOnlyDirectoriesLimit +CloudOnlyDirectoriesLimitReached +CloudOnlyMicrosoftADCurrentCount +CloudOnlyMicrosoftADLimit +CloudOnlyMicrosoftADLimitReached +CloudRemovalConfigInput +CloudTrail +CloudTrailARNInvalidException +CloudTrailAccessNotEnabledException +CloudTrailConfigurationResult +CloudTrailDetails +CloudTrailEvent +CloudTrailInvalidClientTokenIdException +CloudTrailProperties +CloudWatchAlarmConfiguration +CloudWatchAlarmDefinition +CloudWatchConfig +CloudWatchDashboard +CloudWatchDashboards +CloudWatchDestination +CloudWatchDimensionConfiguration +CloudWatchEncryption +CloudWatchEncryptionEnabled +CloudWatchEncryptionMode +CloudWatchEventDetailType +CloudWatchEventId +CloudWatchEventSource +CloudWatchEventsExecutionDataDetails +CloudWatchLogDeliveryOptions +CloudWatchLogDestination +CloudWatchLogGroupARN +CloudWatchLogGroupArn +CloudWatchLogGroupLogDestination +CloudWatchLogGroupName +CloudWatchLogOptions +CloudWatchLogOptionsSpecification +CloudWatchLoggingConfiguration +CloudWatchLoggingOption +CloudWatchLoggingOptionDescription +CloudWatchLoggingOptionDescriptions +CloudWatchLoggingOptionId +CloudWatchLoggingOptionUpdate +CloudWatchLoggingOptionUpdates +CloudWatchLoggingOptions +CloudWatchLogs +CloudWatchLogsConfig +CloudWatchLogsConfiguration +CloudWatchLogsConfigurationType +CloudWatchLogsDeliveryUnavailableException +CloudWatchLogsDestination +CloudWatchLogsDestinationConfig +CloudWatchLogsDestinationConfiguration +CloudWatchLogsDestinationDetails +CloudWatchLogsDetails +CloudWatchLogsLogDelivery +CloudWatchLogsLogDeliveryDescription +CloudWatchLogsLogGroup +CloudWatchLogsLogGroupArn +CloudWatchLogsLogStream +CloudWatchLogsParameters +CloudWatchLogsRoleArn +CloudWatchMetrics +CloudWatchMetricsDataSummary +CloudWatchMetricsDetail +CloudWatchMetricsDimension +CloudWatchMetricsEnabled +CloudWatchMonitoringConfiguration +CloudWatchOutputConfig +CloudWatchOutputEnabled +CloudWatchOutputUrl +Cloudwatch +CloudwatchAlarmAction +CloudwatchLogGroup +CloudwatchLogStream +CloudwatchLogsAction +CloudwatchLogsExportConfiguration +CloudwatchMetricAction +Cluster +ClusterAlreadyExistsFault +ClusterArn +ClusterAssociatedToSchedule +ClusterAvailabilityStatus +ClusterBlockStorageLogicalUsed +ClusterBlockStorageSize +ClusterBlockStorageUsed +ClusterCertificate +ClusterCloudStorageUsed +ClusterConfig +ClusterConfigStatus +ClusterConfiguration +ClusterContainsContainerInstancesException +ClusterContainsServicesException +ClusterContainsTasksException +ClusterCreateTime +ClusterCredentials +ClusterCsr +ClusterDbRevision +ClusterDbRevisions +ClusterDbRevisionsMessage +ClusterDiscoveryEndpoint +ClusterEnabled +ClusterEndpoint +ClusterEndpointEncryptionType +ClusterEndpoints +ClusterExists +ClusterExtendedCredentials +ClusterHealth +ClusterIamRole +ClusterId +ClusterIdentifier +ClusterInList +ClusterInfo +ClusterInfoList +ClusterIssue +ClusterJDBCURL +ClusterLimitExceededException +ClusterListEntries +ClusterListEntry +ClusterLogging +ClusterMarker +ClusterMarkerConfiguration +ClusterMetadata +ClusterMode +ClusterName +ClusterNameFilter +ClusterNames +ClusterNamespaceArn +ClusterNode +ClusterNodes +ClusterNotFoundException +ClusterNotFoundFault +ClusterOnLatestRevisionFault +ClusterOperationArn +ClusterOperationInfo +ClusterOperationInfoList +ClusterOperationStep +ClusterOperationStepInfo +ClusterOperationV2 +ClusterOperationV2Provisioned +ClusterOperationV2Serverless +ClusterOperationV2Summary +ClusterParameterGroup +ClusterParameterGroupAlreadyExistsFault +ClusterParameterGroupDetails +ClusterParameterGroupFamily +ClusterParameterGroupName +ClusterParameterGroupNameMessage +ClusterParameterGroupNotFoundFault +ClusterParameterGroupQuotaExceededFault +ClusterParameterGroupStatus +ClusterParameterGroups +ClusterParameterGroupsMessage +ClusterParameterStatus +ClusterParameterStatusList +ClusterPendingModifiedValues +ClusterPendingUpdates +ClusterPublicKey +ClusterQuotaExceededFault +ClusterQuotaForCustomerExceededFault +ClusterRevisionNumber +ClusterRoleArn +ClusterSecurityGroup +ClusterSecurityGroupAlreadyExistsFault +ClusterSecurityGroupMembership +ClusterSecurityGroupMessage +ClusterSecurityGroupName +ClusterSecurityGroupNotFoundFault +ClusterSecurityGroupQuotaExceededFault +ClusterSecurityGroups +ClusterServiceConnectDefaults +ClusterServiceConnectDefaultsRequest +ClusterSetting +ClusterSettings +ClusterSnapshot +ClusterSnapshotAlreadyExistsFault +ClusterSnapshotCopyStatus +ClusterSnapshotInList +ClusterSnapshotNotFoundFault +ClusterSnapshotQuotaExceededFault +ClusterState +ClusterStateChangeReason +ClusterStates +ClusterStatus +ClusterSubnetGroup +ClusterSubnetGroupAlreadyExistsFault +ClusterSubnetGroupMessage +ClusterSubnetGroupName +ClusterSubnetGroupNotFoundFault +ClusterSubnetGroupQuotaExceededFault +ClusterSubnetGroups +ClusterSubnetQuotaExceededFault +ClusterSummary +ClusterTimeline +ClusterType +ClusterTypeFilter +ClusterUuid +ClusterVersion +ClusterVersions +ClusterVersionsMessage +ClusteringKey +Clusters +ClustersMessage +CmafAdditionalManifest +CmafEncryption +CmafEncryptionMethod +CmafEncryptionSettings +CmafGroupSettings +CmafImageBasedTrickPlaySettings +CmafPackage +CmafPackageCreateOrUpdateParameters +CmfcSettings +CmkArn +CmkType +Cname +CoIp +Code +CodeArtifacts +CodeBlock +CodeBuildNotInServiceRegionException +CodeBuildServiceRole +CodeCommit +CodeCommitCodeDestination +CodeCommitRepository +CodeConfiguration +CodeConfigurationValues +CodeContent +CodeContentDescription +CodeContentType +CodeContentTypeUpdate +CodeContentUpdate +CodeCoverage +CodeCoverageReportSummary +CodeDeliveryDetails +CodeDeliveryDetailsList +CodeDeliveryDetailsType +CodeDeliveryFailureException +CodeDeployApplication +CodeDeployDeploymentGroup +CodeDeployDeploymentId +CodeDeployInstanceGroupId +CodeDeployState +CodeDestination +CodeError +CodeErrorLocation +CodeFilePath +CodeGenConfigurationNode +CodeGenConfigurationNodes +CodeGenEdge +CodeGenNode +CodeGenNodeArg +CodeHook +CodeHookSpecification +CodeLength +CodeLine +CodeLineCount +CodeMD5 +CodeMismatchException +CodeRepositories +CodeRepository +CodeRepositoryArn +CodeRepositoryName +CodeRepositorySummary +CodeRepositorySummaryList +CodeReview +CodeReviewArn +CodeReviewSummaries +CodeReviewSummary +CodeReviewType +CodeSha256 +CodeSigning +CodeSigningCertificateChain +CodeSigningConfig +CodeSigningConfigArn +CodeSigningConfigId +CodeSigningConfigNotFoundException +CodeSigningConfigs +CodeSigningPolicies +CodeSigningSignature +CodeSize +CodeSizeUnzipped +CodeSizeZipped +CodeSnippetError +CodeSnippetResult +CodeSource +CodeStar +CodeStarParameters +CodeStorageExceededException +CodeValidationException +CodeVerificationFailedException +CodeVulnerabilities +CodeVulnerabilitiesFilePath +CodeVulnerabilityDetails +Codec +CodecLevel +CodecOptions +CodecProfile +CodecSettings +CodecSpecification +CodegenDependency +CodegenFeatureFlags +CodegenGenericDataEnum +CodegenGenericDataField +CodegenGenericDataModel +CodegenGenericDataNonModel +CodegenGenericDataRelationshipType +CodegenJob +CodegenJobAsset +CodegenJobGenericDataSchema +CodegenJobSummary +CodingMode +CognitoConfig +CognitoEnabled +CognitoIdentityProvider +CognitoIdentityProviders +CognitoMemberDefinition +CognitoOptions +CognitoOptionsStatus +CognitoStreams +CognitoUserPoolConfig +CognitoUserPoolConfiguration +CognitoUserPoolId +CohortId +CoipAddressUsage +CoipAddressUsages +CoipCidr +CoipPool +CoipPoolId +CoipPools +ColdStorageOptions +Collaboration +CollaborationAnalysisTemplate +CollaborationAnalysisTemplateSummary +CollaborationSummary +CollapseId +CollapseKey +CollapseStateOptions +CollapsedRowDimensionsVisibility +Collection +CollectionARN +CollectionArn +CollectionConfig +CollectionConfiguration +CollectionConfigurations +CollectionDetail +CollectionDurationMinutes +CollectionEndpoint +CollectionErrorDetail +CollectionFilters +CollectionId +CollectionIds +CollectionName +CollectionParameters +CollectionSummary +CollectionType +CollectionVersion +Collections +CollectiveConstant +Collector +CollectorHealthCheck +CollectorName +CollectorNotFoundFault +CollectorReferencedId +CollectorResponse +CollectorShortInfoResponse +CollectorStatus +CollectorVersion +Collectors +Color +ColorAxis +ColorCorrector +ColorFillType +ColorItemsLimit +ColorItemsLimitConfiguration +ColorLabelOptions +ColorMap +ColorMetadata +ColorRange +ColorScale +ColorSort +ColorSpace +ColorSpaceConversion +ColorSpacePassthroughSettings +ColorSpaceSettings +ColorSpaceUsage +Colorimetry +Colors +ColorsConfiguration +Column +ColumnConfiguration +ColumnConfigurations +ColumnDataRole +ColumnDefinition +ColumnDepth +ColumnDescription +ColumnError +ColumnFormat +ColumnFriendlyName +ColumnGeographicRole +ColumnGroup +ColumnGroupColumnSchema +ColumnGroupColumnSchemaList +ColumnGroupSchema +ColumnGroupSchemaList +ColumnGroups +ColumnHeaderStyle +ColumnHierarchies +ColumnHierarchy +ColumnId +ColumnIdentifier +ColumnImportance +ColumnImportances +ColumnIndex +ColumnInfo +ColumnLFTag +ColumnLabelOptions +ColumnLevelPermissionRule +ColumnLevelPermissionRules +ColumnLevelPermissionRulesApplied +ColumnList +ColumnMetadata +ColumnName +ColumnNames +ColumnNamesVisibility +ColumnRange +ColumnRowFilter +ColumnSchema +ColumnSchemaList +ColumnSelector +ColumnSelectors +ColumnSeparator +ColumnSort +ColumnSpan +ColumnStatistics +ColumnStatisticsConfiguration +ColumnStatisticsConfigurations +ColumnStatisticsData +ColumnStatisticsError +ColumnStatisticsList +ColumnSubtotalOptions +ColumnSynonyms +ColumnTag +ColumnToJsonKeyMappings +ColumnToMatch +ColumnTooltipItem +ColumnTotalOptions +ColumnType +ColumnWildcard +Columns +ComboChartAggregatedFieldWells +ComboChartConfiguration +ComboChartFieldWells +ComboChartSortConfiguration +ComboChartVisual +Command +CommandFilter +CommandId +CommandIds +CommandInvocation +CommandInvocations +CommandPlugin +CommandPlugins +Commands +Comment +CommentContent +CommentContentRequiredException +CommentContentSizeLimitExceededException +CommentDeletedException +CommentDoesNotExistException +CommentFieldMappings +CommentId +CommentIdRequiredException +CommentMetadata +CommentNotCreatedByCallerException +CommentStatus +Comments +CommentsForComparedCommit +CommentsForPullRequest +Commit +CommitDiff +CommitDiffSourceCodeType +CommitDigest +CommitDoesNotExistException +CommitId +CommitIdDoesNotExistException +CommitIdRequiredException +CommitIdsLimitExceededException +CommitIdsListRequiredException +CommitMessage +CommitMessageLengthExceededException +CommitRequiredException +CommitTransaction +CommitTransactionRequest +CommitTransactionResponse +CommitTransactionResult +Commitment +CommitmentConfiguration +CommitmentInformation +CommonAttributes +CommonName +CommonPrefix +CommonPrefixes +CommsProtocol +Communication +CommunicationTypeOptions +CompUpdate +Company +CompanyCode +CompanyName +ComparativeOrder +Comparator +CompareFacesMatch +CompareFacesRequest +CompareFacesResponse +ComparedFace +ComparedSourceImageFace +Comparison +ComparisonConfiguration +ComparisonFormat +ComparisonFormatConfiguration +ComparisonMethod +ComparisonOperator +ComparisonType +ComparisonValue +ComparisonValues +Compatibility +CompatibleArchitecture +CompatibleArchitectures +CompatibleElasticsearchVersions +CompatibleEnvironmentTemplate +CompatibleEnvironmentTemplateInput +CompatibleImage +CompatibleImages +CompatibleKafkaVersion +CompatibleKafkaVersions +CompatibleNodes +CompatibleRuntime +CompatibleRuntimes +CompatibleVersions +CompatibleVersionsMap +CompilationEndTime +CompilationJobArn +CompilationJobName +CompilationJobStatus +CompilationJobSummaries +CompilationJobSummary +CompilationStartTime +CompilationTargetDevice +CompilationTargetPlatformAccelerator +CompilationTargetPlatformArch +CompilationTargetPlatformOs +CompiledOutputConfig +CompilerOptions +Complaint +ComplaintFeedbackType +ComplaintSubType +ComplaintTopic +Complaints +Complete +CompleteAttachmentUploadRequest +CompleteLayerUploadRequest +CompleteLayerUploadResponse +CompleteLifecycleActionType +CompleteMigrationMessage +CompleteMigrationResponse +CompleteMultipartReadSetUploadRequest +CompleteMultipartReadSetUploadResponse +CompleteMultipartUploadInput +CompleteMultipartUploadOutput +CompleteMultipartUploadRequest +CompleteOnConvergence +CompleteReadSetUploadPartListItem +CompleteSnapshotRequest +CompleteSnapshotResponse +CompleteTime +CompleteVaultLockInput +CompleteWindowMinutes +CompleteWorkflowExecutionDecisionAttributes +CompleteWorkflowExecutionFailedEventAttributes +Completed +CompletedAt +CompletedCount +CompletedDate +CompletedMultipartUpload +CompletedOn +CompletedPart +CompletedPieces +CompletedProperties +CompletedTimestamp +CompletionCriteria +CompletionDate +CompletionDateTime +CompletionMessage +CompletionReport +CompletionStatus +CompletionTime +CompletionWindowMinutes +Complexity +Compliance +ComplianceAssociatedStandardsId +ComplianceByConfigRule +ComplianceByConfigRules +ComplianceByResource +ComplianceByResources +ComplianceContributorCount +ComplianceDetails +ComplianceDrift +ComplianceExecutionSummary +ComplianceItem +ComplianceItemEntry +ComplianceItems +ComplianceLevel +ComplianceResourceId +ComplianceResourceIds +ComplianceResourceType +ComplianceResourceTypes +ComplianceSecurityControlId +ComplianceSeverity +ComplianceStatus +ComplianceStringFilter +ComplianceSummariesByResourceType +ComplianceSummary +ComplianceSummaryByResourceType +ComplianceSummaryItem +ComplianceSummaryItems +ComplianceSummaryTimestamp +ComplianceType +ComplianceTypeCountLimitExceededException +ComplianceTypes +ComplianceViolator +CompliantConformancePackCount +CompliantCount +CompliantCriticalCount +CompliantHighCount +CompliantInformationalCount +CompliantLowCount +CompliantMediumCount +CompliantResourceCount +CompliantRuleCount +CompliantSummary +CompliantUnspecifiedCount +Component +ComponentAccount +ComponentArn +ComponentBindingPropertiesValue +ComponentBindingPropertiesValueProperties +ComponentCandidate +ComponentChild +ComponentConditionProperty +ComponentConfiguration +ComponentConfigurationUpdate +ComponentDataConfiguration +ComponentDependencyRequirement +ComponentDeploymentSpecification +ComponentDescription +ComponentEvent +ComponentId +ComponentLatestVersion +ComponentName +ComponentParameter +ComponentParameterDetail +ComponentPlatform +ComponentProperty +ComponentPropertyBindingProperties +ComponentPropertyGroupRequest +ComponentPropertyGroupResponse +ComponentRecommendation +ComponentRegion +ComponentRemarks +ComponentRequest +ComponentResponse +ComponentRunWith +ComponentState +ComponentStatusData +ComponentSummary +ComponentTimestampDelimiter +ComponentType +ComponentTypeSummary +ComponentUpdateRequest +ComponentVariant +ComponentVersion +ComponentVersionArn +ComponentVersionListItem +Components +ComposeEnvironmentsMessage +CompositeAlarm +CompositeAlarms +CompositeMemberIdentifier +CompositeModelProperty +CompositePartitionKey +CompositeSlotTypeSetting +CompositedVideo +CompositedVideoArtifactsConfiguration +CompositedVideoConcatenationConfiguration +Composition +ComprehendMedicalAsyncJobFilter +ComprehendMedicalAsyncJobProperties +ComprehendMedicalAsyncJobPropertiesList +Compress +Compressed +Compression +CompressionFactor +CompressionFormat +CompressionType +CompromisedCredentialsActionsType +CompromisedCredentialsDetected +CompromisedCredentialsRiskConfiguration +CompromisedCredentialsRiskConfigurationType +Computation +ComputationId +ComputationPreference +Computations +Compute +ComputeArn +ComputeAttributes +ComputeCapacity +ComputeCapacityStatus +ComputeConfig +ComputeEnvironmentDetail +ComputeEnvironmentOrder +ComputeFarmConfiguration +ComputeLimits +ComputeList +ComputeName +ComputeResource +ComputeResourceUpdate +ComputeResponse +ComputeStatistics +ComputeStatus +ComputeTime +ComputeType +ComputeTypeName +ComputeUtilization +Computer +ComputerAttributes +ComputerId +ComputerName +ConcatenationSink +ConcatenationSource +Concurrency +ConcurrentAccessException +ConcurrentDeploymentException +ConcurrentExecutionRatePercentage +ConcurrentExecutions +ConcurrentLimitExceededException +ConcurrentModification +ConcurrentModificationException +ConcurrentOperationException +ConcurrentReferenceUpdateException +ConcurrentRunsExceededException +ConcurrentUpdateException +ConcurrentUpdatingException +Condition +ConditionBasedCollectionScheme +ConditionCheck +ConditionCheckFailureException +ConditionDocumentAttributeKey +ConditionExpression +ConditionExpressions +ConditionKey +ConditionOnValue +ConditionParameter +ConditionStepMetadata +ConditionType +ConditionValue +ConditionalBranch +ConditionalCheckFailedException +ConditionalFormatting +ConditionalFormattingColor +ConditionalFormattingCustomIconCondition +ConditionalFormattingCustomIconOptions +ConditionalFormattingGradientColor +ConditionalFormattingIcon +ConditionalFormattingIconDisplayConfiguration +ConditionalFormattingIconSet +ConditionalFormattingOptions +ConditionalFormattingSolidColor +ConditionalForwarder +ConditionalForwarderIpAddrs +ConditionalForwarders +ConditionalOperator +ConditionalSpecification +ConditionalSplit +ConditionalSplitActivity +ConditionalToken +Conditions +ConferencePreference +ConferenceProvider +ConferenceProviderArn +ConferenceProviderName +ConferenceProviderType +ConferenceProviders +Confidence +ConfidenceScore +Config +ConfigCred +ConfigDeliveryS3DestinationArn +ConfigExportDeliveryInfo +ConfigFile +ConfigFileState +ConfigId +ConfigIdResponse +ConfigListItem +ConfigParameter +ConfigRecommendation +ConfigRule +ConfigRuleArn +ConfigRuleComplianceFilters +ConfigRuleComplianceSummaryFilters +ConfigRuleEvaluationStatus +ConfigRuleId +ConfigRuleInvokedTime +ConfigRuleName +ConfigRuleNames +ConfigRuleState +ConfigRules +ConfigRulesEvaluationStatus +ConfigSnapshotDeliveryProperties +ConfigStreamDeliveryInfo +ConfigType +ConfigUri +Configuration +ConfigurationAggregator +ConfigurationAggregatorArn +ConfigurationAggregatorName +ConfigurationAggregatorNames +ConfigurationAggregators +ConfigurationAlias +ConfigurationAliases +ConfigurationArn +ConfigurationEndpoint +ConfigurationErrorDetails +ConfigurationEvent +ConfigurationException +ConfigurationId +ConfigurationInfo +ConfigurationItem +ConfigurationLocationUri +ConfigurationManager +ConfigurationManagers +ConfigurationName +ConfigurationOptionDescription +ConfigurationOptionSetting +ConfigurationOptionsDescription +ConfigurationOverrides +ConfigurationProfile +ConfigurationProfileId +ConfigurationProfileIdentifier +ConfigurationProfileSummary +ConfigurationProfiles +ConfigurationRecorder +ConfigurationRecorderName +ConfigurationRecorderNames +ConfigurationRecorderStatus +ConfigurationRecorders +ConfigurationRecordersStatus +ConfigurationRevision +ConfigurationSchema +ConfigurationSet +ConfigurationSetAlreadyExistsException +ConfigurationSetArn +ConfigurationSetAttributeNames +ConfigurationSetDoesNotExistException +ConfigurationSetFilter +ConfigurationSetInformation +ConfigurationSetName +ConfigurationSetNames +ConfigurationSetSendingPausedException +ConfigurationSets +ConfigurationSettings +ConfigurationSettingsDescription +ConfigurationSettingsDescriptions +ConfigurationSettingsValidationMessages +ConfigurationSource +ConfigurationStatus +ConfigurationSummary +ConfigurationSyncStateSummary +ConfigurationSyncStatus +ConfigurationTag +ConfigurationTemplateQuota +ConfigurationTemplates +ConfigurationToken +ConfigurationType +ConfigurationTypeUpdate +ConfigurationUpdate +ConfigurationUpdates +ConfigurationVersion +Configurations +ConfigurationsVersion +Configure +ConfigureAccessPointRequest +ConfigureAccessPointResponse +ConfigureAgentRequest +ConfigureAgentResponse +ConfigureHealthCheckInput +ConfigureHealthCheckOutput +ConfigureLogsForChannelRequest +ConfigureLogsForChannelResponse +ConfigureLogsForPlaybackConfigurationRequest +ConfigureLogsForPlaybackConfigurationResponse +ConfigureLogsRequest +ConfigureLogsResponse +ConfigureShard +Configured +ConfiguredDataNodeCount +ConfiguredInput +ConfiguredTable +ConfiguredTableAnalysisRule +ConfiguredTableAssociation +ConfiguredTableAssociationSummary +ConfiguredTableSummary +ConfirmConnectionRequest +ConfirmConnectionResponse +ConfirmCustomerAgreementRequest +ConfirmCustomerAgreementResponse +ConfirmDeviceRequest +ConfirmDeviceResponse +ConfirmForgotPasswordRequest +ConfirmPrivateVirtualInterfaceRequest +ConfirmPrivateVirtualInterfaceResponse +ConfirmProductInstanceRequest +ConfirmProductInstanceResult +ConfirmPublicVirtualInterfaceRequest +ConfirmPublicVirtualInterfaceResponse +ConfirmRemoveSelfBucketAccess +ConfirmSignUpRequest +ConfirmSubscriptionInput +ConfirmSubscriptionResponse +ConfirmTopicRuleDestinationRequest +ConfirmTransitVirtualInterfaceRequest +ConfirmTransitVirtualInterfaceResponse +ConfirmationCode +ConfirmationRequired +Conflict +ConflictErrorException +ConflictException +ConflictExceptionErrorArgument +ConflictExceptionType +ConflictMetadata +ConflictResolution +ConflictResolvingModel +ConflictResource +ConflictType +ConflictingAlias +ConflictingAliasesList +ConflictingDomainExists +ConflictingItem +ConflictingItems +ConflictingOperationException +ConflictingPolicyId +ConflictingPriority +ConflictingResourceUpdateException +ConflictingTypes +ConfluenceAttachmentConfiguration +ConfluenceAttachmentToIndexFieldMapping +ConfluenceBlogConfiguration +ConfluenceBlogToIndexFieldMapping +ConfluenceConfiguration +ConfluencePageConfiguration +ConfluencePageToIndexFieldMapping +ConfluenceSpaceConfiguration +ConfluenceSpaceToIndexFieldMapping +ConformancePackArn +ConformancePackComplianceFilters +ConformancePackComplianceScore +ConformancePackComplianceScores +ConformancePackComplianceScoresFilters +ConformancePackComplianceStatus +ConformancePackComplianceSummary +ConformancePackComplianceSummaryList +ConformancePackDetail +ConformancePackDetails +ConformancePackEvaluationFilters +ConformancePackEvaluationResult +ConformancePackId +ConformancePackInputParameter +ConformancePackInputParameters +ConformancePackName +ConformancePackNames +ConformancePackRuleCompliance +ConformancePackRuleComplianceList +ConformancePackRuleEvaluationResults +ConformancePackState +ConformancePackStatusDetail +ConformancePackStatusDetails +ConformancePackStatusReason +ConformancePackTemplateValidationException +ConfusionMatrix +ConnectAppAuthorizationRequest +ConnectAppAuthorizationResponse +ConnectAttachment +ConnectAttachmentId +ConnectAttachmentOptions +ConnectCampaignArn +ConnectCampaignExecutionRoleArn +ConnectClientAddIn +ConnectCustomKeyStoreRequest +ConnectDirectoryRequest +ConnectDirectoryResult +ConnectIps +ConnectParticipant +ConnectPeer +ConnectPeerAssociation +ConnectPeerAssociations +ConnectPeerBgpConfiguration +ConnectPeerConfiguration +ConnectPeerId +ConnectPeerIds +ConnectPeerState +ConnectPeerSummary +ConnectPeers +ConnectSettings +ConnectedAt +ConnectedDatabase +ConnectedDeviceCount +ConnectedDeviceId +ConnectedDirectoriesCurrentCount +ConnectedDirectoriesLimit +ConnectedDirectoriesLimitReached +ConnectedHome +ConnectedHomeForUpdate +ConnectedHomeSettings +ConnectedHomeSettingsForUpdate +ConnectedLinkId +ConnectedToAgentTimestamp +Connection +ConnectionAlias +ConnectionAliasAssociation +ConnectionAliasPermission +ConnectionAliasPermissions +ConnectionAliases +ConnectionApiKeyAuthResponseParameters +ConnectionArn +ConnectionAttempts +ConnectionAuthResponseParameters +ConnectionBasicAuthResponseParameters +ConnectionBodyParameter +ConnectionBorrowTimeout +ConnectionConfiguration +ConnectionCredentials +ConnectionDetails +ConnectionDirection +ConnectionDraining +ConnectionEndTime +ConnectionErrorCode +ConnectionEstablishedTime +ConnectionEvents +ConnectionExpiry +ConnectionHeaderParameter +ConnectionHealth +ConnectionHttpParameters +ConnectionId +ConnectionIdentifier +ConnectionIds +ConnectionInfo +ConnectionInput +ConnectionLimitExceededException +ConnectionList +ConnectionLogOptions +ConnectionLogResponseOptions +ConnectionLost +ConnectionMode +ConnectionName +ConnectionNameList +ConnectionNotification +ConnectionNotificationArn +ConnectionNotificationId +ConnectionNotificationIds +ConnectionNotificationSet +ConnectionNotificationState +ConnectionNotificationType +ConnectionOAuthClientResponseParameters +ConnectionOAuthResponseParameters +ConnectionParameters +ConnectionPasswordEncryption +ConnectionPoolConfig +ConnectionPoolConfiguration +ConnectionPoolConfigurationInfo +ConnectionProperties +ConnectionQueryStringParameter +ConnectionRefusedCount +ConnectionRetryInterval +ConnectionSettings +ConnectionState +ConnectionStateCheckTimestamp +ConnectionStatus +ConnectionStatusEventConfiguration +ConnectionStatusResourceTypeEventConfiguration +ConnectionStatusUpdatedTime +ConnectionStatuses +ConnectionString +ConnectionSummary +ConnectionSummaryList +ConnectionTable +ConnectionTimeout +ConnectionToken +ConnectionType +Connections +ConnectionsList +Connectivity +ConnectivityInfo +ConnectivityStatus +ConnectivityType +Connector +ConnectorArn +ConnectorAuthenticationException +ConnectorConfigRequest +ConnectorConfigResponse +ConnectorConfiguration +ConnectorDefinitionId +ConnectorDefinitionVersion +ConnectorDefinitionVersionArn +ConnectorDefinitionVersionId +ConnectorDetail +ConnectorEntity +ConnectorEntityField +ConnectorFailureException +ConnectorId +ConnectorMetadata +ConnectorName +ConnectorOAuthRequest +ConnectorOperator +ConnectorProfile +ConnectorProfileConfig +ConnectorProfileCredentials +ConnectorProfileName +ConnectorProfileProperties +ConnectorProvisioningConfig +ConnectorRuntimeSetting +ConnectorServerException +ConnectorSummary +ConnectorTimeoutException +ConnectorType +Connectors +Consent +ConsistencyLevel +ConsistentRead +ConsoleAccess +ConsoleURL +ConsolidatedReportMetric +Consolidation +ConsolidationKey +Constant +ConstantBitrate +ConstantInitializationVector +ConstantIv +ConstantType +Constraint +ConstraintDescription +ConstraintDetail +ConstraintDetails +ConstraintId +ConstraintParameters +ConstraintSummaries +ConstraintSummary +ConstraintViolationException +Constraints +ConstraintsResource +ConsumedCapacity +ConsumedIOs +ConsumedLabels +ConsumedLicenseSummary +ConsumedLicenseSummaryList +ConsumedLicenses +ConsumedResources +ConsumedSpiceCapacityInBytes +ConsumedStatefulRuleCapacity +ConsumedStatelessRuleCapacity +ConsumedValue +Consumer +ConsumerARN +ConsumerArn +ConsumerArns +ConsumerCount +ConsumerCreationTimestamp +ConsumerDescription +ConsumerGroupID +ConsumerGroupId +ConsumerIdentifier +ConsumerName +ConsumerRegion +ConsumerStatus +Consumers +Consumption +ConsumptionConfiguration +Contact +ContactAgentId +ContactArn +ContactCenter +ContactCenterActivity +ContactChannel +ContactChannelAddress +ContactChannelArn +ContactChannelId +ContactChannels +ContactContent +ContactData +ContactDetail +ContactEmail +ContactFilter +ContactFlow +ContactFlowArn +ContactFlowId +ContactFlowModule +ContactFlowModuleId +ContactFlowModuleState +ContactFlowModuleSummary +ContactFlowModulesSummaryList +ContactFlowNotPublishedException +ContactFlowState +ContactFlowSummary +ContactFlowSummaryList +ContactFlowType +ContactFlowTypes +ContactId +ContactIdResponse +ContactIds +ContactInformation +ContactLanguage +ContactList +ContactListDestination +ContactListImportAction +ContactListName +ContactLists +ContactMethod +ContactName +ContactNotFoundException +ContactNotes +ContactNumber +ContactPhoneNumber +ContactStates +ContactTargetInfo +ContactType +Contacts +Container +ContainerArguments +ContainerConfig +ContainerConfiguration +ContainerDatasetAction +ContainerDefinition +ContainerDefinitions +ContainerDependency +ContainerDetail +ContainerDetails +ContainerDistributionConfiguration +ContainerEntrypoint +ContainerFormat +ContainerHostname +ContainerImage +ContainerInUseException +ContainerInstance +ContainerInstanceHealthStatus +ContainerLevelMetrics +ContainerLogRotationConfiguration +ContainerName +ContainerNotFoundException +ContainerOverride +ContainerOverrides +ContainerPath +ContainerPort +ContainerProperties +ContainerProvider +ContainerRecipe +ContainerRecipeSummary +ContainerRecommendation +ContainerRuntime +ContainerService +ContainerServiceDeployment +ContainerServiceDeploymentRequest +ContainerServiceECRImagePullerRole +ContainerServiceECRImagePullerRoleRequest +ContainerServiceEndpoint +ContainerServiceHealthCheckConfig +ContainerServiceLogEvent +ContainerServicePower +ContainerServiceRegistryLogin +ContainerServiceStateDetail +ContainerServicesListResult +ContainerSettings +ContainerStartupHealthCheckTimeoutInSeconds +ContainerStateChange +ContainerSummary +ContainerType +ContainerUrl +Containers +ContainsAll +ContainsAny +ContainsHeader +ContainsLabels +ContainsOldGroupVersions +ContainsPiiEntitiesRequest +ContainsPiiEntitiesResponse +Content +ContentArtifactsConfiguration +ContentCategories +ContentClassifiers +ContentColumn +ContentConcatenationConfiguration +ContentConfig +ContentCreatedTimestamp +ContentData +ContentDigest +ContentDisposition +ContentEncoding +ContentHandlingStrategy +ContentHash +ContentIdentificationType +ContentLanguage +ContentLength +ContentMD5 +ContentModerationDetection +ContentModifiedTimestamp +ContentRange +ContentRedaction +ContentRedactionOutput +ContentRedactionType +ContentReference +ContentSHA256 +ContentSecurityPolicy +ContentSegmentUrlPrefix +ContentSha256 +ContentShareLayout +ContentSourceConfiguration +ContentSummary +ContentTemplate +ContentTransformation +ContentType +ContentTypeOptions +ContentTypeProfile +ContentTypeProfileConfig +ContentTypeProfiles +ContentUrl +Contents +Context +ContextArn +ContextAssertion +ContextData +ContextDataType +ContextEntries +ContextEntry +ContextId +ContextKeyName +ContextKeyNames +ContextKeyType +ContextKeyValues +ContextName +ContextScope +ContextScopeType +ContextSource +ContextSummaries +ContextSummary +ContextType +ContextWords +ContinentCode +ContinentName +ContinuationSequenceNumber +ContinuationToken +ContinueAsNewWorkflowExecutionDecisionAttributes +ContinueAsNewWorkflowExecutionFailedEventAttributes +ContinueDeploymentInput +ContinueUpdateRollbackInput +ContinuedFromContactId +ContinuousBackupsDescription +ContinuousBackupsStatus +ContinuousBackupsUnavailableException +ContinuousDeploymentPolicy +ContinuousDeploymentPolicyAlreadyExists +ContinuousDeploymentPolicyConfig +ContinuousDeploymentPolicyId +ContinuousDeploymentPolicyInUse +ContinuousDeploymentPolicyList +ContinuousDeploymentPolicySummary +ContinuousDeploymentSingleHeaderConfig +ContinuousDeploymentSingleWeightConfig +ContinuousExportDescription +ContinuousHyperParameterRange +ContinuousParameterRange +ContinuousParameterRangeSpecification +ContinuousParameterRanges +Contrast +ContributingSubnets +ContributionAnalysisDefault +ContributionAnalysisDefaults +ContributionMatrix +ContributionPercentage +ContributionScore +Contributor +ContributorDimensions +ContributorId +ContributorInsightsAction +ContributorInsightsRuleList +ContributorInsightsStatus +ContributorInsightsSummaries +ContributorInsightsSummary +Contributors +Control +ControlComment +ControlDomainInsights +ControlFindingGenerator +ControlId +ControlInputParameter +ControlInputParameters +ControlInsightsMetadataByAssessmentItem +ControlInsightsMetadataItem +ControlMappingSource +ControlMetadata +ControlName +ControlOperation +ControlPanel +ControlPanelArn +ControlPanelName +ControlPanels +ControlPlanePlacementRequest +ControlPlanePlacementResponse +ControlPlaneTagFilter +ControlScope +ControlSet +ControlStatus +ControlStatusUpdatedAt +ControlTablesFileGroup +Controls +ConvergenceDetected +ConvergenceDetectedTime +ConversationId +ConversationLevelIntentClassificationResultItem +ConversationLevelResultDetail +ConversationLevelSlotResolutionResultItem +ConversationLevelTestResultItem +ConversationLevelTestResults +ConversationLevelTestResultsFilterBy +ConversationLogSettings +ConversationLogsDataSource +ConversationLogsDataSourceFilterBy +ConversationLogsRequest +ConversationLogsResponse +ConversationRetentionSettings +ConversionConfiguration +ConversionProperties +ConversionTask +ConversionTaskId +ConversionTaskIds +ConversionTasks +Convert608To708 +ConvertDotsInJsonKeysToUnderscores +ConvertPaintToPop +ConvertRecoveryPointToSnapshotRequest +ConvertRecoveryPointToSnapshotResponse +ConvertTimestampWithZoneToUTC +Cookie +CookieBehavior +CookieExpirationPeriod +CookieMatchPattern +CookieName +CookieNames +CookieObject +CookiePreference +CookieSpecification +CookieSynchronizationConfiguration +Cookies +CookiesConfig +CoolDown +Cooldown +CoolingPeriod +Coordinates +CoordinatorDpuSize +CopyAction +CopyActions +CopyBackupRequest +CopyBackupResponse +CopyBackupToRegionRequest +CopyBackupToRegionResponse +CopyClusterSnapshotMessage +CopyClusterSnapshotResult +CopyCommand +CopyDBClusterParameterGroupMessage +CopyDBClusterParameterGroupResult +CopyDBClusterSnapshotMessage +CopyDBClusterSnapshotResult +CopyDBParameterGroupMessage +CopyDBParameterGroupResult +CopyDBSnapshotMessage +CopyDBSnapshotResult +CopyDestinationImageSet +CopyDestinationImageSetProperties +CopyDistributionRequest +CopyDistributionResult +CopyFpgaImageRequest +CopyFpgaImageResult +CopyImageRequest +CopyImageResponse +CopyImageResult +CopyImageSetInformation +CopyImageSetRequest +CopyImageSetResponse +CopyImageTags +CopyJob +CopyJobId +CopyJobs +CopyObjectOutput +CopyObjectRequest +CopyObjectResult +CopyOptionGroup +CopyOptionGroupMessage +CopyOptionGroupResult +CopyOptions +CopyPackageVersionsRequest +CopyPackageVersionsResult +CopyPartResult +CopyProductInput +CopyProductOutput +CopyProductStatus +CopyProductToken +CopyProjectVersionRequest +CopyProjectVersionResponse +CopyProtectionAction +CopySnapshotMessage +CopySnapshotRequest +CopySnapshotResponse +CopySnapshotResult +CopySource +CopySourceArn +CopySourceIfMatch +CopySourceIfModifiedSince +CopySourceIfNoneMatch +CopySourceIfUnmodifiedSince +CopySourceImageSetInformation +CopySourceImageSetProperties +CopySourceRange +CopySourceSSECustomerAlgorithm +CopySourceSSECustomerKey +CopySourceSSECustomerKeyMD5 +CopySourceTagsToRestoredResource +CopySourceVersionId +CopyStepDetails +CopyStrategy +CopyTags +CopyTagsFromSource +CopyTagsToBackups +CopyTagsToDataRepositoryAssociations +CopyTagsToSnapshot +CopyTagsToSnapshots +CopyTagsToVolumes +CopyTimestamp +CopyToRegionDisabledFault +CopyWorkspaceImageRequest +CopyWorkspaceImageResult +CopyableCrossAccount +CopyrightHolder +Core +CoreCount +CoreDefinitionId +CoreDefinitionVersion +CoreDefinitionVersionArn +CoreDefinitionVersionId +CoreDevice +CoreDumpConfig +CoreNetwork +CoreNetworkAddress +CoreNetworkArn +CoreNetworkAsn +CoreNetworkAttachmentArn +CoreNetworkAttachmentId +CoreNetworkChange +CoreNetworkChangeEvent +CoreNetworkChangeEventValues +CoreNetworkChangeEvents +CoreNetworkChangeValues +CoreNetworkChanges +CoreNetworkEdge +CoreNetworkId +CoreNetworkPolicy +CoreNetworkPolicyError +CoreNetworkPolicyException +CoreNetworkPolicyVersion +CoreNetworkPolicyVersions +CoreNetworkSegment +CoreNetworkSegmentEdge +CoreNetworkSegmentEdgeIdentifier +CoreNetworkSummary +CoreNetworks +Cores +CornerRadius +CorrectedTerm +Correction +CorrectionGateLevel +Corrections +Cors +CorsConfig +CorsConfiguration +CorsPolicy +CorsPolicyNotFoundException +CorsRule +Cost +CostAllocationTag +CostAllocationTagStatusEntry +CostAllocationTags +CostAllocationTagsStatus +CostCategories +CostCategory +CostCategoryArn +CostCategoryInheritedValueDimension +CostCategoryName +CostCategoryNames +CostCategoryProcessingStatus +CostCategoryReference +CostCategoryReferences +CostCategoryRule +CostCategorySplitChargeRule +CostCategorySplitChargeRuleParameter +CostCategoryValues +CostEstimate +CostEstimationResourceCollectionFilter +CostEstimationTimeRange +CostFilters +CostPerHour +CostPerInference +CostTypes +Costs +Count +CountAction +CountByCoverageStatus +CountByResourceType +CountBySeverity +CountClosedWorkflowExecutionsInput +CountDistinct +CountDistinctLong +CountLong +CountNan +CountNanLong +CountNull +CountNullLong +CountOpenWorkflowExecutionsInput +CountPendingActivityTasksInput +CountPendingDecisionTasksInput +CountPercent +CountUpdate +Counters +Country +CountryCode +CountryCodeIso2 +CountryCodeNumeric +CountryCodes +CountryName +Counts +CountsSummary +County +Coverage +CoverageByTime +CoverageCost +CoverageDateFilter +CoverageEksClusterDetails +CoverageFilterCondition +CoverageFilterCriteria +CoverageFilterCriterion +CoverageHours +CoverageHoursPercentage +CoverageMapFilter +CoverageNormalizedUnits +CoverageNormalizedUnitsPercentage +CoveragePercentage +CoverageResource +CoverageResourceDetails +CoverageSortCriteria +CoverageStatistics +CoverageStatus +CoverageStringFilter +CoverageTime +CoveragesByTime +CoveredNodes +CoveredResource +CoversBodyPart +CpsLimit +CpsUri +Cpu +CpuCredits +CpuManufacturers +CpuOptions +CpuOptionsRequest +CpuThreshold +CpuUtilization +Crawl +CrawlArchivedSpaces +CrawlAttachments +CrawlBotMessage +CrawlChatRooms +CrawlComments +CrawlDepth +CrawlElapsedTime +CrawlFileComments +CrawlId +CrawlIssue +CrawlIssueComment +CrawlIssueCommentAttachment +CrawlPersonalSpaces +CrawlPullRequest +CrawlPullRequestComment +CrawlPullRequestCommentAttachment +CrawlRepositoryDocuments +CrawlState +CrawlSystemFolders +CrawlTasks +CrawlWebLinks +Crawler +CrawlerConnection +CrawlerDetails +CrawlerHistory +CrawlerLineageSettings +CrawlerMetrics +CrawlerMetricsList +CrawlerName +CrawlerNameList +CrawlerNames +CrawlerNodeDetails +CrawlerNotRunningException +CrawlerRunningException +CrawlerSecurityConfiguration +CrawlerStoppingException +CrawlerTargets +Crawlers +CrawlersNotFound +Crawls +CrawlsFilter +Create +CreateACLRequest +CreateACLResponse +CreateAPIKeyRequest +CreateAPIKeyResponse +CreateAcceleratorRequest +CreateAcceleratorResponse +CreateAccessControlConfigurationRequest +CreateAccessControlConfigurationResponse +CreateAccessKeyRequest +CreateAccessKeyResponse +CreateAccessLogSubscriptionRequest +CreateAccessLogSubscriptionResponse +CreateAccessPointForObjectLambdaRequest +CreateAccessPointForObjectLambdaResult +CreateAccessPointInput +CreateAccessPointOutput +CreateAccessPointRequest +CreateAccessPointResult +CreateAccessPolicyRequest +CreateAccessPolicyResponse +CreateAccessPreviewRequest +CreateAccessPreviewResponse +CreateAccessRequest +CreateAccessResponse +CreateAccessTokenRequest +CreateAccessTokenResponse +CreateAccessorInput +CreateAccessorOutput +CreateAccountAliasRequest +CreateAccountAssignmentRequest +CreateAccountAssignmentResponse +CreateAccountCustomizationRequest +CreateAccountCustomizationResponse +CreateAccountRequest +CreateAccountRequestId +CreateAccountResponse +CreateAccountStatus +CreateAccountStatusNotFoundException +CreateAccountStatuses +CreateAccountSubscriptionRequest +CreateAccountSubscriptionResponse +CreateActionRequest +CreateActionResponse +CreateActionTargetRequest +CreateActionTargetResponse +CreateActivationRequest +CreateActivationResult +CreateActivityInput +CreateActivityOutput +CreateAdditionalAssignmentsForHITRequest +CreateAddonRequest +CreateAddonResponse +CreateAddressBookRequest +CreateAddressBookResponse +CreateAddressRequest +CreateAddressResult +CreateAgentRequest +CreateAgentResponse +CreateAgentStatusRequest +CreateAgentStatusResponse +CreateAgreementRequest +CreateAgreementResponse +CreateAlarmModelRequest +CreateAlarmModelResponse +CreateAlertManagerDefinitionRequest +CreateAlertManagerDefinitionResponse +CreateAlertRequest +CreateAlertResponse +CreateAlgorithmInput +CreateAlgorithmOutput +CreateAliasInput +CreateAliasOutput +CreateAliasRequest +CreateAliasResult +CreateAllowListRequest +CreateAllowListResponse +CreateAnalysisRequest +CreateAnalysisResponse +CreateAnalysisTemplateInput +CreateAnalysisTemplateOutput +CreateAnalyzerRequest +CreateAnalyzerResponse +CreateAnnotationStoreRequest +CreateAnnotationStoreResponse +CreateAnnotationStoreVersionRequest +CreateAnnotationStoreVersionResponse +CreateAnomalyDetectorRequest +CreateAnomalyDetectorResponse +CreateAnomalyMonitorRequest +CreateAnomalyMonitorResponse +CreateAnomalySubscriptionRequest +CreateAnomalySubscriptionResponse +CreateApiCacheRequest +CreateApiCacheResponse +CreateApiDestinationRequest +CreateApiDestinationResponse +CreateApiKeyRequest +CreateApiKeyResponse +CreateApiMappingRequest +CreateApiMappingResponse +CreateApiRequest +CreateApiResponse +CreateAppAuthorizationRequest +CreateAppAuthorizationResponse +CreateAppBlockBuilderRequest +CreateAppBlockBuilderResult +CreateAppBlockBuilderStreamingURLRequest +CreateAppBlockBuilderStreamingURLResult +CreateAppBlockRequest +CreateAppBlockResult +CreateAppBundleRequest +CreateAppBundleResponse +CreateAppCookieStickinessPolicyInput +CreateAppImageConfigRequest +CreateAppImageConfigResponse +CreateAppInstanceAdminRequest +CreateAppInstanceAdminResponse +CreateAppInstanceBotRequest +CreateAppInstanceBotResponse +CreateAppInstanceRequest +CreateAppInstanceResponse +CreateAppInstanceUserRequest +CreateAppInstanceUserResponse +CreateAppMonitorRequest +CreateAppMonitorResponse +CreateAppRequest +CreateAppResponse +CreateAppResult +CreateAppVersionAppComponentRequest +CreateAppVersionAppComponentResponse +CreateAppVersionResourceRequest +CreateAppVersionResourceResponse +CreateApplicationInput +CreateApplicationInstanceRequest +CreateApplicationInstanceResponse +CreateApplicationMessage +CreateApplicationOutput +CreateApplicationPresignedUrlRequest +CreateApplicationPresignedUrlResponse +CreateApplicationRequest +CreateApplicationResponse +CreateApplicationResult +CreateApplicationSnapshotRequest +CreateApplicationVersionMessage +CreateApplicationVersionRequest +CreateApplicationVersionResponse +CreateApprovalRuleTemplateInput +CreateApprovalRuleTemplateOutput +CreateArchiveRequest +CreateArchiveResponse +CreateArchiveRuleRequest +CreateArtifactRequest +CreateArtifactResponse +CreateAssessmentFrameworkControl +CreateAssessmentFrameworkControlSet +CreateAssessmentFrameworkRequest +CreateAssessmentFrameworkResponse +CreateAssessmentReportRequest +CreateAssessmentReportResponse +CreateAssessmentRequest +CreateAssessmentResponse +CreateAssessmentTargetRequest +CreateAssessmentTargetResponse +CreateAssessmentTemplateRequest +CreateAssessmentTemplateResponse +CreateAssetModelRequest +CreateAssetModelResponse +CreateAssetRequest +CreateAssetResponse +CreateAssistantAssociationRequest +CreateAssistantAssociationResponse +CreateAssistantRequest +CreateAssistantResponse +CreateAssociationBatchRequest +CreateAssociationBatchRequestEntry +CreateAssociationBatchResult +CreateAssociationRequest +CreateAssociationResult +CreateAttendeeError +CreateAttendeeRequest +CreateAttendeeRequestItem +CreateAttendeeResponse +CreateAttributeGroupRequest +CreateAttributeGroupResponse +CreateAuditSuppressionRequest +CreateAuthChallenge +CreateAuthenticationProfileMessage +CreateAuthenticationProfileResult +CreateAuthorizerRequest +CreateAuthorizerResponse +CreateAutoMLJobRequest +CreateAutoMLJobResponse +CreateAutoMLJobV2Request +CreateAutoMLJobV2Response +CreateAutoPredictorRequest +CreateAutoPredictorResponse +CreateAutoScalingConfigurationRequest +CreateAutoScalingConfigurationResponse +CreateAutoScalingGroupType +CreateAutomationRuleRequest +CreateAutomationRuleResponse +CreateAvailabilityConfigurationRequest +CreateAwsLogSourceRequest +CreateAwsLogSourceResponse +CreateBGPPeerRequest +CreateBGPPeerResponse +CreateBackendAPIRequest +CreateBackendAPIResponse +CreateBackendAuthForgotPasswordConfig +CreateBackendAuthIdentityPoolConfig +CreateBackendAuthMFAConfig +CreateBackendAuthOAuthConfig +CreateBackendAuthPasswordPolicyConfig +CreateBackendAuthRequest +CreateBackendAuthResourceConfig +CreateBackendAuthResponse +CreateBackendAuthUserPoolConfig +CreateBackendAuthVerificationMessageConfig +CreateBackendConfigRequest +CreateBackendConfigResponse +CreateBackendEnvironmentRequest +CreateBackendEnvironmentResult +CreateBackendRequest +CreateBackendResponse +CreateBackendStorageRequest +CreateBackendStorageResourceConfig +CreateBackendStorageResponse +CreateBackupInput +CreateBackupOutput +CreateBackupPlanInput +CreateBackupPlanOutput +CreateBackupRequest +CreateBackupResponse +CreateBackupSelectionInput +CreateBackupSelectionOutput +CreateBackupVaultInput +CreateBackupVaultOutput +CreateBasePathMappingRequest +CreateBatchImportJobRequest +CreateBatchInferenceJobRequest +CreateBatchInferenceJobResponse +CreateBatchLoadTaskRequest +CreateBatchLoadTaskResponse +CreateBatchPredictionInput +CreateBatchPredictionJobRequest +CreateBatchPredictionOutput +CreateBatchSegmentJobRequest +CreateBatchSegmentJobResponse +CreateBillingGroupInput +CreateBillingGroupOutput +CreateBillingGroupRequest +CreateBillingGroupResponse +CreateBlueGreenDeploymentRequest +CreateBlueGreenDeploymentResponse +CreateBlueprintRequest +CreateBlueprintResponse +CreateBotAliasRequest +CreateBotAliasResponse +CreateBotLocaleRequest +CreateBotLocaleResponse +CreateBotRequest +CreateBotResponse +CreateBotVersionRequest +CreateBotVersionResponse +CreateBranchInput +CreateBranchRequest +CreateBranchResult +CreateBridge420Exception +CreateBridgeRequest +CreateBridgeResponse +CreateBrokerRequest +CreateBrokerResponse +CreateBrowserSettingsRequest +CreateBrowserSettingsResponse +CreateBucketAccessKeyRequest +CreateBucketAccessKeyResult +CreateBucketConfiguration +CreateBucketOutput +CreateBucketRequest +CreateBucketResult +CreateBudgetActionRequest +CreateBudgetActionResponse +CreateBudgetRequest +CreateBuildInput +CreateBuildOutput +CreateBulkImportJobRequest +CreateBulkImportJobResponse +CreateBusinessReportScheduleRequest +CreateBusinessReportScheduleResponse +CreateByteMatchSetRequest +CreateByteMatchSetResponse +CreateCacheClusterMessage +CreateCacheClusterResult +CreateCacheParameterGroupMessage +CreateCacheParameterGroupResult +CreateCachePolicyRequest +CreateCachePolicyResult +CreateCacheSecurityGroupMessage +CreateCacheSecurityGroupResult +CreateCacheSubnetGroupMessage +CreateCacheSubnetGroupResult +CreateCachediSCSIVolumeInput +CreateCachediSCSIVolumeOutput +CreateCalculatedAttributeDefinitionRequest +CreateCalculatedAttributeDefinitionResponse +CreateCallAnalyticsCategoryRequest +CreateCallAnalyticsCategoryResponse +CreateCampaignRequest +CreateCampaignResponse +CreateCanaryRequest +CreateCanaryResponse +CreateCapacityProviderRequest +CreateCapacityProviderResponse +CreateCapacityReservationFleetRequest +CreateCapacityReservationFleetResult +CreateCapacityReservationInput +CreateCapacityReservationRequest +CreateCapacityReservationResult +CreateCarrierGatewayRequest +CreateCarrierGatewayResult +CreateCaseRequest +CreateCaseResponse +CreateCellRequest +CreateCellResponse +CreateCertificateAuthorityAuditReportRequest +CreateCertificateAuthorityAuditReportResponse +CreateCertificateAuthorityRequest +CreateCertificateAuthorityResponse +CreateCertificateFromCsrRequest +CreateCertificateFromCsrResponse +CreateCertificateRequest +CreateCertificateResult +CreateChangeSetInput +CreateChangeSetOutput +CreateChangesetRequest +CreateChangesetResponse +CreateChannelBanRequest +CreateChannelBanResponse +CreateChannelFlowRequest +CreateChannelFlowResponse +CreateChannelGroupRequest +CreateChannelGroupResponse +CreateChannelMembershipRequest +CreateChannelMembershipResponse +CreateChannelModeratorRequest +CreateChannelModeratorResponse +CreateChannelRequest +CreateChannelResponse +CreateChatTokenRequest +CreateChatTokenResponse +CreateCidrCollectionRequest +CreateCidrCollectionResponse +CreateClassificationJobRequest +CreateClassificationJobResponse +CreateClassifierRequest +CreateCliTokenRequest +CreateCliTokenResponse +CreateClientVpnEndpointRequest +CreateClientVpnEndpointResult +CreateClientVpnRouteRequest +CreateClientVpnRouteResult +CreateCloudFormationChangeSetRequest +CreateCloudFormationChangeSetResponse +CreateCloudFormationStackRequest +CreateCloudFormationStackResult +CreateCloudFormationTemplateRequest +CreateCloudFormationTemplateResponse +CreateCloudFrontOriginAccessIdentityRequest +CreateCloudFrontOriginAccessIdentityResult +CreateClusterInput +CreateClusterMessage +CreateClusterOutput +CreateClusterParameterGroupMessage +CreateClusterParameterGroupResult +CreateClusterRequest +CreateClusterResponse +CreateClusterResult +CreateClusterSecurityGroupMessage +CreateClusterSecurityGroupResult +CreateClusterSnapshotInput +CreateClusterSnapshotMessage +CreateClusterSnapshotOutput +CreateClusterSnapshotResult +CreateClusterSubnetGroupMessage +CreateClusterSubnetGroupResult +CreateClusterV2Request +CreateClusterV2Response +CreateCodeRepositoryInput +CreateCodeRepositoryOutput +CreateCodeReviewRequest +CreateCodeReviewResponse +CreateCodeSigningConfigRequest +CreateCodeSigningConfigResponse +CreateCoipCidrRequest +CreateCoipCidrResult +CreateCoipPoolRequest +CreateCoipPoolResult +CreateCollaborationInput +CreateCollaborationOutput +CreateCollectionDetail +CreateCollectionRequest +CreateCollectionResponse +CreateColumn +CreateColumnsOperation +CreateCommentRequest +CreateCommentResponse +CreateCommitInput +CreateCommitOutput +CreateCompilationJobRequest +CreateCompilationJobResponse +CreateComponentData +CreateComponentInput +CreateComponentOutput +CreateComponentRequest +CreateComponentResponse +CreateComponentTypeRequest +CreateComponentTypeResponse +CreateComponentVersionRequest +CreateComponentVersionResponse +CreateComputeEnvironmentRequest +CreateComputeEnvironmentResponse +CreateComputerRequest +CreateComputerResult +CreateConditionalForwarderRequest +CreateConferenceProviderRequest +CreateConferenceProviderResponse +CreateConfigRequest +CreateConfigurationProfileRequest +CreateConfigurationRequest +CreateConfigurationResponse +CreateConfigurationSetEventDestinationRequest +CreateConfigurationSetRequest +CreateConfigurationSetResult +CreateConfigurationSetTrackingOptionsRequest +CreateConfigurationTemplateMessage +CreateConfiguredTableAnalysisRuleInput +CreateConfiguredTableAnalysisRuleOutput +CreateConfiguredTableAssociationInput +CreateConfiguredTableAssociationOutput +CreateConfiguredTableInput +CreateConfiguredTableOutput +CreateConnectAttachmentRequest +CreateConnectAttachmentResponse +CreateConnectClientAddInRequest +CreateConnectClientAddInResult +CreateConnectPeerRequest +CreateConnectPeerResponse +CreateConnectionAliasRequest +CreateConnectionAliasResult +CreateConnectionApiKeyAuthRequestParameters +CreateConnectionAuthRequestParameters +CreateConnectionBasicAuthRequestParameters +CreateConnectionInput +CreateConnectionOAuthClientRequestParameters +CreateConnectionOAuthRequestParameters +CreateConnectionOutput +CreateConnectionRequest +CreateConnectionResponse +CreateConnectorDefinitionRequest +CreateConnectorDefinitionResponse +CreateConnectorDefinitionVersionRequest +CreateConnectorDefinitionVersionResponse +CreateConnectorProfileRequest +CreateConnectorProfileResponse +CreateConnectorRequest +CreateConnectorResponse +CreateConstraintInput +CreateConstraintOutput +CreateContactChannelRequest +CreateContactChannelResult +CreateContactFlowModuleRequest +CreateContactFlowModuleResponse +CreateContactFlowRequest +CreateContactFlowResponse +CreateContactListRequest +CreateContactMethodRequest +CreateContactMethodResult +CreateContactRequest +CreateContactResponse +CreateContactResult +CreateContainerInput +CreateContainerOutput +CreateContainerRecipeRequest +CreateContainerRecipeResponse +CreateContainerServiceDeploymentRequest +CreateContainerServiceDeploymentResult +CreateContainerServiceRegistryLoginResult +CreateContainerServiceRequest +CreateContainerServiceResult +CreateContentRequest +CreateContentResponse +CreateContextRequest +CreateContextResponse +CreateContinuousDeploymentPolicyRequest +CreateContinuousDeploymentPolicyResult +CreateControlMappingSource +CreateControlPanelRequest +CreateControlPanelResponse +CreateControlRequest +CreateControlResponse +CreateCoreDefinitionRequest +CreateCoreDefinitionResponse +CreateCoreDefinitionVersionRequest +CreateCoreDefinitionVersionResponse +CreateCoreNetworkRequest +CreateCoreNetworkResponse +CreateCostCategoryDefinitionRequest +CreateCostCategoryDefinitionResponse +CreateCrawlerRequest +CreateCrossAccountAuthorizationRequest +CreateCrossAccountAuthorizationResponse +CreateCsvClassifierRequest +CreateCustomActionTypeInput +CreateCustomActionTypeOutput +CreateCustomDBEngineVersionFault +CreateCustomDBEngineVersionMessage +CreateCustomDataIdentifierRequest +CreateCustomDataIdentifierResponse +CreateCustomDomainAssociationMessage +CreateCustomDomainAssociationResult +CreateCustomEntityTypeRequest +CreateCustomEntityTypeResponse +CreateCustomKeyStoreRequest +CreateCustomKeyStoreResponse +CreateCustomLineItemInput +CreateCustomLineItemOutput +CreateCustomLogSourceRequest +CreateCustomLogSourceResponse +CreateCustomMetadataRequest +CreateCustomMetricRequest +CreateCustomMetricResponse +CreateCustomPluginRequest +CreateCustomPluginResponse +CreateCustomRoutingAcceleratorRequest +CreateCustomRoutingAcceleratorResponse +CreateCustomRoutingEndpointGroupRequest +CreateCustomRoutingEndpointGroupResponse +CreateCustomRoutingListenerRequest +CreateCustomRoutingListenerResponse +CreateCustomVerificationEmailTemplateRequest +CreateCustomerGatewayRequest +CreateCustomerGatewayResult +CreateDBClusterEndpointMessage +CreateDBClusterEndpointOutput +CreateDBClusterMessage +CreateDBClusterParameterGroupMessage +CreateDBClusterParameterGroupResult +CreateDBClusterResult +CreateDBClusterSnapshotMessage +CreateDBClusterSnapshotResult +CreateDBInstanceMessage +CreateDBInstanceReadReplicaMessage +CreateDBInstanceReadReplicaResult +CreateDBInstanceResult +CreateDBParameterGroupMessage +CreateDBParameterGroupResult +CreateDBProxyEndpointRequest +CreateDBProxyEndpointResponse +CreateDBProxyRequest +CreateDBProxyResponse +CreateDBSecurityGroupMessage +CreateDBSecurityGroupResult +CreateDBSnapshotMessage +CreateDBSnapshotResult +CreateDBSubnetGroupMessage +CreateDBSubnetGroupResult +CreateDashboardRequest +CreateDashboardResponse +CreateDataCatalogInput +CreateDataCellsFilterRequest +CreateDataIntegrationRequest +CreateDataIntegrationResponse +CreateDataLakeExceptionSubscriptionRequest +CreateDataLakeOrganizationConfigurationRequest +CreateDataLakeRequest +CreateDataLakeResponse +CreateDataProviderMessage +CreateDataProviderResponse +CreateDataQualityJobDefinitionRequest +CreateDataQualityJobDefinitionResponse +CreateDataQualityRulesetRequest +CreateDataQualityRulesetResponse +CreateDataRepositoryAssociationRequest +CreateDataRepositoryAssociationResponse +CreateDataRepositoryTaskRequest +CreateDataRepositoryTaskResponse +CreateDataSetImportTaskRequest +CreateDataSetImportTaskResponse +CreateDataSetRequest +CreateDataSetResponse +CreateDataSourceFromRDSInput +CreateDataSourceFromRDSOutput +CreateDataSourceFromRedshiftInput +CreateDataSourceFromRedshiftOutput +CreateDataSourceFromS3Input +CreateDataSourceFromS3Output +CreateDataSourceRequest +CreateDataSourceResponse +CreateDataViewRequest +CreateDataViewResponse +CreateDatabaseDefaultPermissions +CreateDatabaseRequest +CreateDatabaseResponse +CreateDataflowEndpointGroupRequest +CreateDatasetContentRequest +CreateDatasetContentResponse +CreateDatasetExportJobRequest +CreateDatasetExportJobResponse +CreateDatasetGroupRequest +CreateDatasetGroupResponse +CreateDatasetImportJobRequest +CreateDatasetImportJobResponse +CreateDatasetRequest +CreateDatasetResponse +CreateDatastoreRequest +CreateDatastoreResponse +CreateDate +CreateDecoderManifestRequest +CreateDecoderManifestResponse +CreateDedicatedIpPoolRequest +CreateDefaultSubnetRequest +CreateDefaultSubnetResult +CreateDefaultVpcRequest +CreateDefaultVpcResult +CreateDelegationRequest +CreateDeliverabilityTestReportRequest +CreateDeliverabilityTestReportResponse +CreateDeliveryStreamInput +CreateDeliveryStreamOutput +CreateDeploymentConfigInput +CreateDeploymentConfigOutput +CreateDeploymentGroupInput +CreateDeploymentGroupOutput +CreateDeploymentInput +CreateDeploymentJobRequest +CreateDeploymentJobResponse +CreateDeploymentOutput +CreateDeploymentRequest +CreateDeploymentResponse +CreateDeploymentResult +CreateDeploymentStrategyRequest +CreateDestinationRequest +CreateDestinationResponse +CreateDetectorModelRequest +CreateDetectorModelResponse +CreateDetectorRequest +CreateDetectorResponse +CreateDetectorVersionRequest +CreateDetectorVersionResult +CreateDevEndpointRequest +CreateDevEndpointResponse +CreateDevEnvironmentRequest +CreateDevEnvironmentResponse +CreateDeviceDefinitionRequest +CreateDeviceDefinitionResponse +CreateDeviceDefinitionVersionRequest +CreateDeviceDefinitionVersionResponse +CreateDeviceFleetRequest +CreateDevicePoolRequest +CreateDevicePoolResult +CreateDeviceProfileRequest +CreateDeviceProfileResponse +CreateDeviceRequest +CreateDeviceResponse +CreateDhcpOptionsRequest +CreateDhcpOptionsResult +CreateDimensionRequest +CreateDimensionResponse +CreateDirectConnectGatewayAssociationProposalRequest +CreateDirectConnectGatewayAssociationProposalResult +CreateDirectConnectGatewayAssociationRequest +CreateDirectConnectGatewayAssociationResult +CreateDirectConnectGatewayRequest +CreateDirectConnectGatewayResult +CreateDirectoryConfigRequest +CreateDirectoryConfigResult +CreateDirectoryRegistrationRequest +CreateDirectoryRegistrationResponse +CreateDirectoryRequest +CreateDirectoryResponse +CreateDirectoryResult +CreateDiscovererRequest +CreateDiscovererResponse +CreateDiskFromSnapshotRequest +CreateDiskFromSnapshotResult +CreateDiskRequest +CreateDiskResult +CreateDiskSnapshotRequest +CreateDiskSnapshotResult +CreateDistributionConfigurationRequest +CreateDistributionConfigurationResponse +CreateDistributionRequest +CreateDistributionResult +CreateDistributionWithTagsRequest +CreateDistributionWithTagsResult +CreateDocumentClassifierRequest +CreateDocumentClassifierResponse +CreateDocumentRequest +CreateDocumentResult +CreateDocumentationPartRequest +CreateDocumentationVersionRequest +CreateDomainAssociationRequest +CreateDomainAssociationResult +CreateDomainConfigurationRequest +CreateDomainConfigurationResponse +CreateDomainEntryRequest +CreateDomainEntryResult +CreateDomainNameRequest +CreateDomainNameResponse +CreateDomainRequest +CreateDomainResponse +CreateDomainResult +CreateDynamicThingGroupRequest +CreateDynamicThingGroupResponse +CreateEdgeDeploymentPlanRequest +CreateEdgeDeploymentPlanResponse +CreateEdgeDeploymentStageRequest +CreateEdgePackagingJobRequest +CreateEgressOnlyInternetGatewayRequest +CreateEgressOnlyInternetGatewayResult +CreateElasticsearchDomainRequest +CreateElasticsearchDomainResponse +CreateEmailIdentityPolicyRequest +CreateEmailIdentityRequest +CreateEmailIdentityResponse +CreateEmailTemplateRequest +CreateEmailTemplateResponse +CreateEndOfMeetingReminder +CreateEndpointAccessMessage +CreateEndpointAccessRequest +CreateEndpointAccessResponse +CreateEndpointConfigInput +CreateEndpointConfigOutput +CreateEndpointGroupRequest +CreateEndpointGroupResponse +CreateEndpointInput +CreateEndpointMessage +CreateEndpointOutput +CreateEndpointRequest +CreateEndpointResponse +CreateEndpointResult +CreateEntitlementRequest +CreateEntitlementResult +CreateEntityRecognizerRequest +CreateEntityRecognizerResponse +CreateEntityRequest +CreateEntityResponse +CreateEnvironmentAccountConnectionInput +CreateEnvironmentAccountConnectionOutput +CreateEnvironmentEC2Request +CreateEnvironmentEC2Result +CreateEnvironmentInput +CreateEnvironmentMembershipRequest +CreateEnvironmentMembershipResult +CreateEnvironmentMessage +CreateEnvironmentOutput +CreateEnvironmentRequest +CreateEnvironmentResponse +CreateEnvironmentTemplateInput +CreateEnvironmentTemplateOutput +CreateEnvironmentTemplateVersionInput +CreateEnvironmentTemplateVersionOutput +CreateEphemerisRequest +CreateEvaluationFormRequest +CreateEvaluationFormResponse +CreateEvaluationInput +CreateEvaluationOutput +CreateEventActionRequest +CreateEventActionResponse +CreateEventBusRequest +CreateEventBusResponse +CreateEventDataStoreRequest +CreateEventDataStoreResponse +CreateEventDestinationRequest +CreateEventDestinationResult +CreateEventIntegrationRequest +CreateEventIntegrationResponse +CreateEventSourceMappingRequest +CreateEventStreamRequest +CreateEventStreamResponse +CreateEventSubscriptionMessage +CreateEventSubscriptionResponse +CreateEventSubscriptionResult +CreateEventTrackerRequest +CreateEventTrackerResponse +CreateExclusionsPreviewRequest +CreateExclusionsPreviewResponse +CreateExperienceRequest +CreateExperienceResponse +CreateExperimentRequest +CreateExperimentResponse +CreateExperimentTemplateActionInput +CreateExperimentTemplateLogConfigurationInput +CreateExperimentTemplateRequest +CreateExperimentTemplateResponse +CreateExperimentTemplateStopConditionInput +CreateExperimentTemplateTargetInput +CreateExplainabilityExportRequest +CreateExplainabilityExportResponse +CreateExplainabilityRequest +CreateExplainabilityResponse +CreateExportJobRequest +CreateExportJobResponse +CreateExportRequest +CreateExportResponse +CreateExportTaskRequest +CreateExportTaskResponse +CreateExtendedSourceServerRequest +CreateExtendedSourceServerResponse +CreateExtensionAssociationRequest +CreateExtensionRequest +CreateFHIRDatastoreRequest +CreateFHIRDatastoreResponse +CreateFaceLivenessSessionRequest +CreateFaceLivenessSessionRequestSettings +CreateFaceLivenessSessionResponse +CreateFacetRequest +CreateFaqRequest +CreateFaqResponse +CreateFargateProfileRequest +CreateFargateProfileResponse +CreateFeatureGroupRequest +CreateFeatureGroupResponse +CreateFeatureRequest +CreateFeatureResponse +CreateFeaturedResultsSetRequest +CreateFeaturedResultsSetResponse +CreateFieldLevelEncryptionConfigRequest +CreateFieldLevelEncryptionConfigResult +CreateFieldLevelEncryptionProfileRequest +CreateFieldLevelEncryptionProfileResult +CreateFieldRequest +CreateFieldResponse +CreateFileCacheLustreConfiguration +CreateFileCacheRequest +CreateFileCacheResponse +CreateFileSystemFromBackupRequest +CreateFileSystemFromBackupResponse +CreateFileSystemLustreConfiguration +CreateFileSystemOntapConfiguration +CreateFileSystemOpenZFSConfiguration +CreateFileSystemRequest +CreateFileSystemResponse +CreateFileSystemWindowsConfiguration +CreateFilterRequest +CreateFilterResponse +CreateFindingAggregatorRequest +CreateFindingAggregatorResponse +CreateFindingsFilterRequest +CreateFindingsFilterResponse +CreateFindingsReportRequest +CreateFindingsReportResponse +CreateFirewallDomainListRequest +CreateFirewallDomainListResponse +CreateFirewallPolicyRequest +CreateFirewallPolicyResponse +CreateFirewallRequest +CreateFirewallResponse +CreateFirewallRuleGroupRequest +CreateFirewallRuleGroupResponse +CreateFirewallRuleRequest +CreateFirewallRuleResponse +CreateFleetAdvisorCollectorRequest +CreateFleetAdvisorCollectorResponse +CreateFleetError +CreateFleetInput +CreateFleetInstance +CreateFleetLocationsInput +CreateFleetLocationsOutput +CreateFleetMetricRequest +CreateFleetMetricResponse +CreateFleetOutput +CreateFleetRequest +CreateFleetResponse +CreateFleetResult +CreateFlow420Exception +CreateFlowDefinitionRequest +CreateFlowDefinitionResponse +CreateFlowLogsRequest +CreateFlowLogsResult +CreateFlowRequest +CreateFlowResponse +CreateFlowTemplateRequest +CreateFlowTemplateResponse +CreateFlywheelRequest +CreateFlywheelResponse +CreateFolderMembershipRequest +CreateFolderMembershipResponse +CreateFolderRequest +CreateFolderResponse +CreateForecastExportJobRequest +CreateForecastExportJobResponse +CreateForecastRequest +CreateForecastResponse +CreateFormData +CreateFormRequest +CreateFormResponse +CreateFpgaImageRequest +CreateFpgaImageResult +CreateFrameworkInput +CreateFrameworkOutput +CreateFreeTierConfig +CreateFunctionDefinitionRequest +CreateFunctionDefinitionResponse +CreateFunctionDefinitionVersionRequest +CreateFunctionDefinitionVersionResponse +CreateFunctionRequest +CreateFunctionResponse +CreateFunctionResult +CreateFunctionUrlConfigRequest +CreateFunctionUrlConfigResponse +CreateFuotaTaskRequest +CreateFuotaTaskResponse +CreateGUISessionAccessDetailsRequest +CreateGUISessionAccessDetailsResult +CreateGameRequest +CreateGameResult +CreateGameServerGroupInput +CreateGameServerGroupOutput +CreateGameSessionInput +CreateGameSessionOutput +CreateGameSessionQueueInput +CreateGameSessionQueueOutput +CreateGateway420Exception +CreateGatewayGroupRequest +CreateGatewayGroupResponse +CreateGatewayInput +CreateGatewayOutput +CreateGatewayRequest +CreateGatewayResponse +CreateGatewayRouteInput +CreateGatewayRouteOutput +CreateGeoMatchSetRequest +CreateGeoMatchSetResponse +CreateGeofenceCollectionRequest +CreateGeofenceCollectionResponse +CreateGlobalClusterMessage +CreateGlobalClusterResult +CreateGlobalNetworkRequest +CreateGlobalNetworkResponse +CreateGlobalReplicationGroupMessage +CreateGlobalReplicationGroupResult +CreateGlobalSecondaryIndexAction +CreateGlobalTableInput +CreateGlobalTableOutput +CreateGovCloudAccountRequest +CreateGovCloudAccountResponse +CreateGrantRequest +CreateGrantResponse +CreateGrantVersionRequest +CreateGrantVersionResponse +CreateGraphRequest +CreateGraphResponse +CreateGraphqlApiRequest +CreateGraphqlApiResponse +CreateGrokClassifierRequest +CreateGroupCertificateAuthorityRequest +CreateGroupCertificateAuthorityResponse +CreateGroupInput +CreateGroupMembershipRequest +CreateGroupMembershipResponse +CreateGroupOutput +CreateGroupRequest +CreateGroupResponse +CreateGroupResult +CreateGroupVersionRequest +CreateGroupVersionResponse +CreateHITRequest +CreateHITResponse +CreateHITTypeRequest +CreateHITTypeResponse +CreateHITWithHITTypeRequest +CreateHITWithHITTypeResponse +CreateHapgRequest +CreateHapgResponse +CreateHarvestJobRequest +CreateHarvestJobResponse +CreateHealthCheckRequest +CreateHealthCheckResponse +CreateHlsManifestConfiguration +CreateHomeRegionControlRequest +CreateHomeRegionControlResult +CreateHostInput +CreateHostOutput +CreateHostedConfigurationVersionRequest +CreateHostedZoneRequest +CreateHostedZoneResponse +CreateHoursOfOperationRequest +CreateHoursOfOperationResponse +CreateHsmClientCertificateMessage +CreateHsmClientCertificateResult +CreateHsmConfigurationMessage +CreateHsmConfigurationResult +CreateHsmRequest +CreateHsmResponse +CreateHttpNamespaceRequest +CreateHttpNamespaceResponse +CreateHubRequest +CreateHubResponse +CreateHumanTaskUiRequest +CreateHumanTaskUiResponse +CreateHyperParameterTuningJobRequest +CreateHyperParameterTuningJobResponse +CreateIAMPolicyAssignmentRequest +CreateIAMPolicyAssignmentResponse +CreateIPSetRequest +CreateIPSetResponse +CreateIdentityPoolInput +CreateIdentityProviderRequest +CreateIdentityProviderResponse +CreateIdentitySourceInput +CreateIdentitySourceOutput +CreateImageBuilderRequest +CreateImageBuilderResult +CreateImageBuilderStreamingURLRequest +CreateImageBuilderStreamingURLResult +CreateImagePipelineRequest +CreateImagePipelineResponse +CreateImageRecipeRequest +CreateImageRecipeResponse +CreateImageRequest +CreateImageResponse +CreateImageResult +CreateImageVersionRequest +CreateImageVersionResponse +CreateImpersonationRoleRequest +CreateImpersonationRoleResponse +CreateImportJobRequest +CreateImportJobResponse +CreateInAppTemplateRequest +CreateInAppTemplateResponse +CreateIndex +CreateIndexInput +CreateIndexOutput +CreateIndexRequest +CreateIndexResponse +CreateInferenceExperimentRequest +CreateInferenceExperimentResponse +CreateInferenceRecommendationsJobRequest +CreateInferenceRecommendationsJobResponse +CreateInferenceSchedulerRequest +CreateInferenceSchedulerResponse +CreateInfrastructureConfigurationRequest +CreateInfrastructureConfigurationResponse +CreateIngestionDestinationRequest +CreateIngestionDestinationResponse +CreateIngestionRequest +CreateIngestionResponse +CreateInputRequest +CreateInputResponse +CreateInputSecurityGroupRequest +CreateInputSecurityGroupResponse +CreateInsightRequest +CreateInsightResponse +CreateInstanceAccessControlAttributeConfigurationRequest +CreateInstanceConnectEndpointRequest +CreateInstanceConnectEndpointResult +CreateInstanceEventWindowRequest +CreateInstanceEventWindowResult +CreateInstanceExportTaskRequest +CreateInstanceExportTaskResult +CreateInstanceProfileMessage +CreateInstanceProfileRequest +CreateInstanceProfileResponse +CreateInstanceProfileResult +CreateInstanceRequest +CreateInstanceResponse +CreateInstanceResult +CreateInstanceSnapshotRequest +CreateInstanceSnapshotResult +CreateInstancesFromSnapshotRequest +CreateInstancesFromSnapshotResult +CreateInstancesRequest +CreateInstancesResult +CreateInstantBooking +CreateIntegrationAssociationRequest +CreateIntegrationAssociationResponse +CreateIntegrationRequest +CreateIntegrationResponseRequest +CreateIntegrationResponseResponse +CreateIntegrationResult +CreateIntegrationWorkflowRequest +CreateIntegrationWorkflowResponse +CreateIntentRequest +CreateIntentResponse +CreateIntentVersionRequest +CreateIntentVersionResponse +CreateInterconnectRequest +CreateInternetGatewayRequest +CreateInternetGatewayResult +CreateInvalidationRequest +CreateInvalidationResult +CreateInvitationsRequest +CreateInvitationsResponse +CreateIpAccessSettingsRequest +CreateIpAccessSettingsResponse +CreateIpGroupRequest +CreateIpGroupResult +CreateIpamPoolRequest +CreateIpamPoolResult +CreateIpamRequest +CreateIpamResourceDiscoveryRequest +CreateIpamResourceDiscoveryResult +CreateIpamResult +CreateIpamScopeRequest +CreateIpamScopeResult +CreateJobForDevicesRequest +CreateJobForDevicesResponse +CreateJobOutput +CreateJobPlaylist +CreateJobQueueRequest +CreateJobQueueResponse +CreateJobRequest +CreateJobResponse +CreateJobResult +CreateJobTemplateRequest +CreateJobTemplateResponse +CreateJourneyRequest +CreateJourneyResponse +CreateJsonClassifierRequest +CreateKeyGroupRequest +CreateKeyGroupResult +CreateKeyInput +CreateKeyOutput +CreateKeyPairRequest +CreateKeyPairResult +CreateKeyRequest +CreateKeyResponse +CreateKeySigningKeyRequest +CreateKeySigningKeyResponse +CreateKeysAndCertificateRequest +CreateKeysAndCertificateResponse +CreateKeyspaceRequest +CreateKeyspaceResponse +CreateKnowledgeBaseRequest +CreateKnowledgeBaseResponse +CreateKxChangesetRequest +CreateKxChangesetResponse +CreateKxClusterRequest +CreateKxClusterResponse +CreateKxDatabaseRequest +CreateKxDatabaseResponse +CreateKxEnvironmentRequest +CreateKxEnvironmentResponse +CreateKxUserRequest +CreateKxUserResponse +CreateLBCookieStickinessPolicyInput +CreateLFTagRequest +CreateLabelGroupRequest +CreateLabelGroupResponse +CreateLabelRequest +CreateLabelResponse +CreateLabelingJobRequest +CreateLabelingJobResponse +CreateLabelsRequest +CreateLagRequest +CreateLakeFormationOptInRequest +CreateLanguageModelRequest +CreateLanguageModelResponse +CreateLaunchConfigurationTemplateRequest +CreateLaunchConfigurationTemplateResponse +CreateLaunchConfigurationType +CreateLaunchProfileRequest +CreateLaunchProfileResponse +CreateLaunchRequest +CreateLaunchResponse +CreateLaunchTemplateRequest +CreateLaunchTemplateResult +CreateLaunchTemplateVersionRequest +CreateLaunchTemplateVersionResult +CreateLayerRequest +CreateLayerResult +CreateLayoutRequest +CreateLayoutResponse +CreateLedgerRequest +CreateLedgerResponse +CreateLegalHoldInput +CreateLegalHoldOutput +CreateLensShareInput +CreateLensShareOutput +CreateLensVersionInput +CreateLensVersionOutput +CreateLicenseConfigurationRequest +CreateLicenseConfigurationResponse +CreateLicenseConversionTaskForResourceRequest +CreateLicenseConversionTaskForResourceResponse +CreateLicenseManagerReportGeneratorRequest +CreateLicenseManagerReportGeneratorResponse +CreateLicenseRequest +CreateLicenseResponse +CreateLicenseVersionRequest +CreateLicenseVersionResponse +CreateLifecyclePolicyRequest +CreateLifecyclePolicyResponse +CreateLinkInput +CreateLinkOutput +CreateLinkRequest +CreateLinkResponse +CreateListRequest +CreateListenerInput +CreateListenerOutput +CreateListenerRequest +CreateListenerResponse +CreateLiveSourceRequest +CreateLiveSourceResponse +CreateLoadBalancerInput +CreateLoadBalancerListenerInput +CreateLoadBalancerOutput +CreateLoadBalancerPolicyInput +CreateLoadBalancerRequest +CreateLoadBalancerResult +CreateLoadBalancerTlsCertificateRequest +CreateLoadBalancerTlsCertificateResult +CreateLocalGatewayRouteRequest +CreateLocalGatewayRouteResult +CreateLocalGatewayRouteTableRequest +CreateLocalGatewayRouteTableResult +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult +CreateLocalGatewayRouteTableVpcAssociationRequest +CreateLocalGatewayRouteTableVpcAssociationResult +CreateLocationAzureBlobRequest +CreateLocationAzureBlobResponse +CreateLocationEfsRequest +CreateLocationEfsResponse +CreateLocationFsxLustreRequest +CreateLocationFsxLustreResponse +CreateLocationFsxOntapRequest +CreateLocationFsxOntapResponse +CreateLocationFsxOpenZfsRequest +CreateLocationFsxOpenZfsResponse +CreateLocationFsxWindowsRequest +CreateLocationFsxWindowsResponse +CreateLocationHdfsRequest +CreateLocationHdfsResponse +CreateLocationInput +CreateLocationNfsRequest +CreateLocationNfsResponse +CreateLocationObjectStorageRequest +CreateLocationObjectStorageResponse +CreateLocationOutput +CreateLocationS3Request +CreateLocationS3Response +CreateLocationSmbRequest +CreateLocationSmbResponse +CreateLogGroupRequest +CreateLogPatternRequest +CreateLogPatternResponse +CreateLogStreamRequest +CreateLogSubscriptionRequest +CreateLoggerDefinitionRequest +CreateLoggerDefinitionResponse +CreateLoggerDefinitionVersionRequest +CreateLoggerDefinitionVersionResponse +CreateLoggingConfigurationRequest +CreateLoggingConfigurationResponse +CreateLogicallyAirGappedBackupVaultInput +CreateLogicallyAirGappedBackupVaultOutput +CreateLoginProfileRequest +CreateLoginProfileResponse +CreateLongTermPricingRequest +CreateLongTermPricingResult +CreateLowLatencyHlsManifestConfiguration +CreateLunaClientRequest +CreateLunaClientResponse +CreateMLEndpointInput +CreateMLEndpointOutput +CreateMLModelInput +CreateMLModelOutput +CreateMLTransformRequest +CreateMLTransformResponse +CreateMaintenanceWindowRequest +CreateMaintenanceWindowResult +CreateManagedEndpointRequest +CreateManagedEndpointResponse +CreateManagedPrefixListRequest +CreateManagedPrefixListResult +CreateMapRequest +CreateMapResponse +CreateMatchingWorkflowInput +CreateMatchingWorkflowOutput +CreateMatchmakingConfigurationInput +CreateMatchmakingConfigurationOutput +CreateMatchmakingRuleSetInput +CreateMatchmakingRuleSetOutput +CreateMediaCapturePipelineRequest +CreateMediaCapturePipelineResponse +CreateMediaConcatenationPipelineRequest +CreateMediaConcatenationPipelineResponse +CreateMediaInsightsPipelineConfigurationRequest +CreateMediaInsightsPipelineConfigurationResponse +CreateMediaInsightsPipelineRequest +CreateMediaInsightsPipelineResponse +CreateMediaLiveConnectorPipelineRequest +CreateMediaLiveConnectorPipelineResponse +CreateMediaPipelineKinesisVideoStreamPoolRequest +CreateMediaPipelineKinesisVideoStreamPoolResponse +CreateMediaStreamPipelineRequest +CreateMediaStreamPipelineResponse +CreateMedicalVocabularyRequest +CreateMedicalVocabularyResponse +CreateMeetingDialOutRequest +CreateMeetingDialOutResponse +CreateMeetingRequest +CreateMeetingResponse +CreateMeetingRoomConfiguration +CreateMeetingWithAttendeesRequest +CreateMeetingWithAttendeesResponse +CreateMemberInput +CreateMemberOutput +CreateMemberRequest +CreateMemberResponse +CreateMembersRequest +CreateMembersResponse +CreateMembershipInput +CreateMembershipOutput +CreateMeshInput +CreateMeshOutput +CreateMetricAttributionRequest +CreateMetricAttributionResponse +CreateMetricSetRequest +CreateMetricSetResponse +CreateMicrosoftADRequest +CreateMicrosoftADResult +CreateMigrationProjectMessage +CreateMigrationProjectResponse +CreateMigrationWorkflowRequest +CreateMigrationWorkflowResponse +CreateMilestoneInput +CreateMilestoneOutput +CreateMissionProfileRequest +CreateMitigationActionRequest +CreateMitigationActionResponse +CreateMobileDeviceAccessRuleRequest +CreateMobileDeviceAccessRuleResponse +CreateModelBiasJobDefinitionRequest +CreateModelBiasJobDefinitionResponse +CreateModelCardExportJobRequest +CreateModelCardExportJobResponse +CreateModelCardRequest +CreateModelCardResponse +CreateModelCustomizationJobRequest +CreateModelCustomizationJobResponse +CreateModelExplainabilityJobDefinitionRequest +CreateModelExplainabilityJobDefinitionResponse +CreateModelInput +CreateModelManifestRequest +CreateModelManifestResponse +CreateModelOutput +CreateModelPackageGroupInput +CreateModelPackageGroupOutput +CreateModelPackageInput +CreateModelPackageOutput +CreateModelQualityJobDefinitionRequest +CreateModelQualityJobDefinitionResponse +CreateModelRequest +CreateModelResponse +CreateModelVersionRequest +CreateModelVersionResult +CreateMonitorInput +CreateMonitorOutput +CreateMonitorRequest +CreateMonitorResponse +CreateMonitoringScheduleRequest +CreateMonitoringScheduleResponse +CreateMonitoringSubscriptionRequest +CreateMonitoringSubscriptionResult +CreateMountTargetRequest +CreateMultiRegionAccessPointInput +CreateMultiRegionAccessPointRequest +CreateMultiRegionAccessPointResult +CreateMulticastGroupRequest +CreateMulticastGroupResponse +CreateMultipartReadSetUploadRequest +CreateMultipartReadSetUploadResponse +CreateMultipartUploadOutput +CreateMultipartUploadRequest +CreateMultiplexProgramRequest +CreateMultiplexProgramResponse +CreateMultiplexRequest +CreateMultiplexResponse +CreateNFSFileShareInput +CreateNFSFileShareOutput +CreateNamedQueryInput +CreateNamedQueryOutput +CreateNamespaceRequest +CreateNamespaceResponse +CreateNatGatewayRequest +CreateNatGatewayResult +CreateNativeDeltaTable +CreateNetworkAclEntryRequest +CreateNetworkAclRequest +CreateNetworkAclResult +CreateNetworkAnalyzerConfigurationRequest +CreateNetworkAnalyzerConfigurationResponse +CreateNetworkInput +CreateNetworkInsightsAccessScopeRequest +CreateNetworkInsightsAccessScopeResult +CreateNetworkInsightsPathRequest +CreateNetworkInsightsPathResult +CreateNetworkInterfacePermissionRequest +CreateNetworkInterfacePermissionResult +CreateNetworkInterfaceRequest +CreateNetworkInterfaceResult +CreateNetworkOutput +CreateNetworkProfileRequest +CreateNetworkProfileResponse +CreateNetworkProfileResult +CreateNetworkRequest +CreateNetworkResponse +CreateNetworkSettingsRequest +CreateNetworkSettingsResponse +CreateNetworkSiteRequest +CreateNetworkSiteResponse +CreateNewVersion +CreateNodeFromTemplateJobRequest +CreateNodeFromTemplateJobResponse +CreateNodeInput +CreateNodeOutput +CreateNodegroupRequest +CreateNodegroupResponse +CreateNotebookInput +CreateNotebookInstanceInput +CreateNotebookInstanceLifecycleConfigInput +CreateNotebookInstanceLifecycleConfigOutput +CreateNotebookInstanceOutput +CreateNotebookOutput +CreateNotificationRequest +CreateNotificationRuleRequest +CreateNotificationRuleResult +CreateNotificationSubscriptionRequest +CreateNotificationSubscriptionResponse +CreateOTAUpdateRequest +CreateOTAUpdateResponse +CreateObject +CreateObjectRequest +CreateObjectResponse +CreateObservabilityConfigurationRequest +CreateObservabilityConfigurationResponse +CreateOntapVolumeConfiguration +CreateOpenIDConnectProviderRequest +CreateOpenIDConnectProviderResponse +CreateOpenZFSOriginSnapshotConfiguration +CreateOpenZFSVolumeConfiguration +CreateOpsItemRequest +CreateOpsItemResponse +CreateOpsMetadataRequest +CreateOpsMetadataResult +CreateOptOutListRequest +CreateOptOutListResult +CreateOptionGroupMessage +CreateOptionGroupResult +CreateOrUpdateTagsType +CreateOrderInput +CreateOrderOutput +CreateOrganizationRequest +CreateOrganizationResponse +CreateOrganizationalUnitRequest +CreateOrganizationalUnitResponse +CreateOriginAccessControlRequest +CreateOriginAccessControlResult +CreateOriginEndpointRequest +CreateOriginEndpointResponse +CreateOriginRequestPolicyRequest +CreateOriginRequestPolicyResult +CreateOutboundConnectionRequest +CreateOutboundConnectionResponse +CreateOutboundCrossClusterSearchConnectionRequest +CreateOutboundCrossClusterSearchConnectionResponse +CreateOutpostInput +CreateOutpostOutput +CreateOutpostResolverRequest +CreateOutpostResolverResponse +CreatePackageImportJobRequest +CreatePackageImportJobResponse +CreatePackageRequest +CreatePackageResponse +CreatePackageVersionRequest +CreatePackageVersionResponse +CreatePackagingConfigurationRequest +CreatePackagingConfigurationResponse +CreatePackagingGroupRequest +CreatePackagingGroupResponse +CreateParallelDataRequest +CreateParallelDataResponse +CreateParameterGroupRequest +CreateParameterGroupResponse +CreateParticipantConnectionRequest +CreateParticipantConnectionResponse +CreateParticipantRequest +CreateParticipantResponse +CreateParticipantTokenRequest +CreateParticipantTokenResponse +CreatePartitionIndexRequest +CreatePartitionRequest +CreatePartnerEventSourceRequest +CreatePartnerEventSourceResponse +CreatePartnerInputRequest +CreatePartnerInputResponse +CreatePatchBaselineRequest +CreatePatchBaselineResult +CreatePerformanceAnalysisReportRequest +CreatePerformanceAnalysisReportResponse +CreatePermissionGroupRequest +CreatePermissionGroupResponse +CreatePermissionRequest +CreatePermissionResponse +CreatePermissionSetRequest +CreatePermissionSetResponse +CreatePermissionVersionRequest +CreatePermissionVersionResponse +CreatePhoneNumberOrderRequest +CreatePhoneNumberOrderResponse +CreatePipeRequest +CreatePipeResponse +CreatePipelineInput +CreatePipelineOutput +CreatePipelineRequest +CreatePipelineResponse +CreatePlaceIndexRequest +CreatePlaceIndexResponse +CreatePlacementGroupRequest +CreatePlacementGroupResult +CreatePlacementRequest +CreatePlatformApplicationInput +CreatePlatformApplicationResponse +CreatePlatformEndpointInput +CreatePlatformVersionRequest +CreatePlatformVersionResult +CreatePlayerSessionInput +CreatePlayerSessionOutput +CreatePlayerSessionsInput +CreatePlayerSessionsOutput +CreatePolicyInput +CreatePolicyOutput +CreatePolicyRequest +CreatePolicyResponse +CreatePolicyStoreInput +CreatePolicyStoreOutput +CreatePolicyTemplateInput +CreatePolicyTemplateOutput +CreatePolicyVersionRequest +CreatePolicyVersionResponse +CreatePoolRequest +CreatePoolResult +CreatePortalRequest +CreatePortalResponse +CreatePortfolioInput +CreatePortfolioOutput +CreatePortfolioShareInput +CreatePortfolioShareOutput +CreatePredictorBacktestExportJobRequest +CreatePredictorBacktestExportJobResponse +CreatePredictorRequest +CreatePredictorResponse +CreatePrefetchScheduleRequest +CreatePrefetchScheduleResponse +CreatePreparedStatementInput +CreatePresetRequest +CreatePresetResponse +CreatePresignedDomainUrlRequest +CreatePresignedDomainUrlResponse +CreatePresignedNotebookInstanceUrlInput +CreatePresignedNotebookInstanceUrlOutput +CreatePresignedNotebookUrlRequest +CreatePresignedNotebookUrlResponse +CreatePricingPlanInput +CreatePricingPlanOutput +CreatePricingRuleInput +CreatePricingRuleOutput +CreatePrivateDnsNamespaceRequest +CreatePrivateDnsNamespaceResponse +CreatePrivateVirtualInterfaceRequest +CreateProactiveJoin +CreateProcessingJobRequest +CreateProcessingJobResponse +CreateProductInput +CreateProductOutput +CreateProfileInput +CreateProfileJobRequest +CreateProfileJobResponse +CreateProfileOutput +CreateProfileRequest +CreateProfileResponse +CreateProfileShareInput +CreateProfileShareOutput +CreateProfilingGroupRequest +CreateProfilingGroupResponse +CreateProgramRequest +CreateProgramResponse +CreateProgressUpdateStreamRequest +CreateProjectInput +CreateProjectOutput +CreateProjectRequest +CreateProjectResponse +CreateProjectResult +CreateProjectVersionRequest +CreateProjectVersionResponse +CreatePromptRequest +CreatePromptResponse +CreateProposalInput +CreateProposalOutput +CreateProtectionGroupRequest +CreateProtectionRequest +CreateProtectionResponse +CreateProvisionedModelThroughputRequest +CreateProvisionedModelThroughputResponse +CreateProvisionedProductPlanInput +CreateProvisionedProductPlanOutput +CreateProvisioningArtifactInput +CreateProvisioningArtifactOutput +CreateProvisioningClaimRequest +CreateProvisioningClaimResponse +CreateProvisioningTemplateRequest +CreateProvisioningTemplateResponse +CreateProvisioningTemplateVersionRequest +CreateProvisioningTemplateVersionResponse +CreateProxySessionRequest +CreateProxySessionResponse +CreatePublicDnsNamespaceRequest +CreatePublicDnsNamespaceResponse +CreatePublicIpv4PoolRequest +CreatePublicIpv4PoolResult +CreatePublicKeyRequest +CreatePublicKeyResult +CreatePublicVirtualInterfaceRequest +CreatePublishingDestinationRequest +CreatePublishingDestinationResponse +CreatePullRequestApprovalRuleInput +CreatePullRequestApprovalRuleOutput +CreatePullRequestInput +CreatePullRequestOutput +CreatePullThroughCacheRuleRequest +CreatePullThroughCacheRuleResponse +CreatePushTemplateRequest +CreatePushTemplateResponse +CreateQualificationTypeRequest +CreateQualificationTypeResponse +CreateQuantumTaskRequest +CreateQuantumTaskResponse +CreateQueryLoggingConfigRequest +CreateQueryLoggingConfigResponse +CreateQuerySuggestionsBlockListRequest +CreateQuerySuggestionsBlockListResponse +CreateQueueRequest +CreateQueueResponse +CreateQueueResult +CreateQuickConnectRequest +CreateQuickConnectResponse +CreateRateBasedRuleRequest +CreateRateBasedRuleResponse +CreateReadinessCheckRequest +CreateReadinessCheckResponse +CreateRealtimeEndpointInput +CreateRealtimeEndpointOutput +CreateRealtimeLogConfigRequest +CreateRealtimeLogConfigResult +CreateReceiptFilterRequest +CreateReceiptRuleRequest +CreateReceiptRuleSetRequest +CreateRecipeJobRequest +CreateRecipeJobResponse +CreateRecipeRequest +CreateRecipeResponse +CreateRecommendationTemplateRequest +CreateRecommendationTemplateResponse +CreateRecommenderConfiguration +CreateRecommenderConfigurationRequest +CreateRecommenderConfigurationResponse +CreateRecommenderConfigurationShape +CreateRecommenderRequest +CreateRecommenderResponse +CreateRecordingConfigurationRequest +CreateRecordingConfigurationResponse +CreateRecoveryGroupRequest +CreateRecoveryGroupResponse +CreateReferenceStoreRequest +CreateReferenceStoreResponse +CreateRefreshScheduleRequest +CreateRefreshScheduleResponse +CreateRegexMatchSetRequest +CreateRegexMatchSetResponse +CreateRegexPatternSetRequest +CreateRegexPatternSetResponse +CreateRegistryInput +CreateRegistryRequest +CreateRegistryResponse +CreateRelatedItemRequest +CreateRelatedItemResponse +CreateRelationalDatabaseFromSnapshotRequest +CreateRelationalDatabaseFromSnapshotResult +CreateRelationalDatabaseRequest +CreateRelationalDatabaseResult +CreateRelationalDatabaseSnapshotRequest +CreateRelationalDatabaseSnapshotResult +CreateRemoteAccessSessionConfiguration +CreateRemoteAccessSessionRequest +CreateRemoteAccessSessionResult +CreateReplaceRootVolumeTaskRequest +CreateReplaceRootVolumeTaskResult +CreateReplicaAction +CreateReplicationConfigMessage +CreateReplicationConfigResponse +CreateReplicationConfigurationRequest +CreateReplicationConfigurationTemplateRequest +CreateReplicationGroupMemberAction +CreateReplicationGroupMessage +CreateReplicationGroupResult +CreateReplicationInstanceMessage +CreateReplicationInstanceResponse +CreateReplicationJobRequest +CreateReplicationJobResponse +CreateReplicationSetInput +CreateReplicationSetOutput +CreateReplicationSubnetGroupMessage +CreateReplicationSubnetGroupResponse +CreateReplicationTaskMessage +CreateReplicationTaskResponse +CreateReportGroupInput +CreateReportGroupOutput +CreateReportPlanInput +CreateReportPlanOutput +CreateRepositoryInput +CreateRepositoryOutput +CreateRepositoryRequest +CreateRepositoryResponse +CreateRepositoryResult +CreateRequestValidatorRequest +CreateRequireCheckIn +CreateRescoreExecutionPlanRequest +CreateRescoreExecutionPlanResponse +CreateReservedInstancesListingRequest +CreateReservedInstancesListingResult +CreateResiliencyPolicyRequest +CreateResiliencyPolicyResponse +CreateResolverEndpointRequest +CreateResolverEndpointResponse +CreateResolverQueryLogConfigRequest +CreateResolverQueryLogConfigResponse +CreateResolverRequest +CreateResolverResponse +CreateResolverRuleRequest +CreateResolverRuleResponse +CreateResourceDataSyncRequest +CreateResourceDefinitionRequest +CreateResourceDefinitionResponse +CreateResourceDefinitionVersionRequest +CreateResourceDefinitionVersionResponse +CreateResourceGroupRequest +CreateResourceGroupResponse +CreateResourceInput +CreateResourceOutput +CreateResourcePolicyRequest +CreateResourcePolicyResponse +CreateResourcePolicyStatementRequest +CreateResourcePolicyStatementResponse +CreateResourceRequest +CreateResourceResponse +CreateResourceServerRequest +CreateResourceServerResponse +CreateResourceSetRequest +CreateResourceSetResponse +CreateResourceShareRequest +CreateResourceShareResponse +CreateResponseHeadersPolicyRequest +CreateResponseHeadersPolicyResult +CreateResponsePlanInput +CreateResponsePlanOutput +CreateRestApiRequest +CreateRestoreImageTaskRequest +CreateRestoreImageTaskResult +CreateRetrainingSchedulerRequest +CreateRetrainingSchedulerResponse +CreateReturnShippingLabelRequest +CreateReturnShippingLabelResult +CreateReusableDelegationSetRequest +CreateReusableDelegationSetResponse +CreateRevisionRequest +CreateRevisionResponse +CreateRobotApplicationRequest +CreateRobotApplicationResponse +CreateRobotApplicationVersionRequest +CreateRobotApplicationVersionResponse +CreateRobotRequest +CreateRobotResponse +CreateRoleAliasRequest +CreateRoleAliasResponse +CreateRoleRequest +CreateRoleResponse +CreateRoomMembershipRequest +CreateRoomMembershipResponse +CreateRoomRequest +CreateRoomResponse +CreateRotationOverrideRequest +CreateRotationOverrideResult +CreateRotationRequest +CreateRotationResult +CreateRouteCalculatorRequest +CreateRouteCalculatorResponse +CreateRouteInput +CreateRouteOutput +CreateRouteRequest +CreateRouteResponse +CreateRouteResponseRequest +CreateRouteResponseResponse +CreateRouteResult +CreateRouteTableRequest +CreateRouteTableResult +CreateRoutingControlRequest +CreateRoutingControlResponse +CreateRoutingProfileRequest +CreateRoutingProfileResponse +CreateRowData +CreateRule +CreateRuleGroupRequest +CreateRuleGroupResponse +CreateRuleGroupsNamespaceRequest +CreateRuleGroupsNamespaceResponse +CreateRuleInput +CreateRuleOutput +CreateRuleRequest +CreateRuleResponse +CreateRuleResult +CreateRulesetRequest +CreateRulesetResponse +CreateRunGroupRequest +CreateRunGroupResponse +CreateS3DataAccessFromS3Bucket +CreateS3DataAccessFromS3BucketRequestDetails +CreateS3DataAccessFromS3BucketResponseDetails +CreateSAMLProviderRequest +CreateSAMLProviderResponse +CreateSMBFileShareInput +CreateSMBFileShareOutput +CreateSMSSandboxPhoneNumberInput +CreateSafetyRuleRequest +CreateSafetyRuleResponse +CreateSampleFindingsRequest +CreateSamplingRuleRequest +CreateSamplingRuleResult +CreateSavingsPlanRequest +CreateSavingsPlanResponse +CreateSbomExportRequest +CreateSbomExportResponse +CreateScalingPlanRequest +CreateScalingPlanResponse +CreateScanRequest +CreateScanResponse +CreateSceneRequest +CreateSceneResponse +CreateScheduleGroupInput +CreateScheduleGroupOutput +CreateScheduleInput +CreateScheduleOutput +CreateScheduleRequest +CreateScheduleResponse +CreateScheduledActionMessage +CreateScheduledAuditRequest +CreateScheduledAuditResponse +CreateScheduledQueryRequest +CreateScheduledQueryResponse +CreateSchedulingPolicyRequest +CreateSchedulingPolicyResponse +CreateSchemaInput +CreateSchemaMappingInput +CreateSchemaMappingOutput +CreateSchemaRequest +CreateSchemaResponse +CreateScriptInput +CreateScriptOutput +CreateScriptRequest +CreateScriptResponse +CreateSecretRequest +CreateSecretResponse +CreateSecurityConfigRequest +CreateSecurityConfigResponse +CreateSecurityConfigurationInput +CreateSecurityConfigurationOutput +CreateSecurityConfigurationRequest +CreateSecurityConfigurationResponse +CreateSecurityGroupRequest +CreateSecurityGroupResult +CreateSecurityPolicyRequest +CreateSecurityPolicyResponse +CreateSecurityProfileRequest +CreateSecurityProfileResponse +CreateSegmentRequest +CreateSegmentResponse +CreateSequenceStoreRequest +CreateSequenceStoreResponse +CreateServerRequest +CreateServerResponse +CreateServiceActionInput +CreateServiceActionOutput +CreateServiceInput +CreateServiceInstanceInput +CreateServiceInstanceOutput +CreateServiceLinkedRoleRequest +CreateServiceLinkedRoleResponse +CreateServiceNetworkRequest +CreateServiceNetworkResponse +CreateServiceNetworkServiceAssociationRequest +CreateServiceNetworkServiceAssociationResponse +CreateServiceNetworkVpcAssociationRequest +CreateServiceNetworkVpcAssociationResponse +CreateServiceOutput +CreateServicePrincipalNameRequest +CreateServiceProfileRequest +CreateServiceProfileResponse +CreateServiceRequest +CreateServiceResponse +CreateServiceSpecificCredentialRequest +CreateServiceSpecificCredentialResponse +CreateServiceSyncConfigInput +CreateServiceSyncConfigOutput +CreateServiceTemplateInput +CreateServiceTemplateOutput +CreateServiceTemplateVersionInput +CreateServiceTemplateVersionOutput +CreateSessionRequest +CreateSessionResponse +CreateShareRequest +CreateShareResponse +CreateSignalCatalogRequest +CreateSignalCatalogResponse +CreateSignalingChannelInput +CreateSignalingChannelOutput +CreateSimulationApplicationRequest +CreateSimulationApplicationResponse +CreateSimulationApplicationVersionRequest +CreateSimulationApplicationVersionResponse +CreateSimulationJobRequest +CreateSimulationJobResponse +CreateSinkInput +CreateSinkOutput +CreateSipMediaApplicationCallRequest +CreateSipMediaApplicationCallResponse +CreateSipMediaApplicationRequest +CreateSipMediaApplicationResponse +CreateSipRuleRequest +CreateSipRuleResponse +CreateSiteInput +CreateSiteOutput +CreateSiteRequest +CreateSiteResponse +CreateSiteToSiteVpnAttachmentRequest +CreateSiteToSiteVpnAttachmentResponse +CreateSizeConstraintSetRequest +CreateSizeConstraintSetResponse +CreateSkillGroupRequest +CreateSkillGroupResponse +CreateSlackChannelConfigurationRequest +CreateSlotRequest +CreateSlotResponse +CreateSlotTypeRequest +CreateSlotTypeResponse +CreateSlotTypeVersionRequest +CreateSlotTypeVersionResponse +CreateSmsTemplateRequest +CreateSmsTemplateResponse +CreateSnaplockConfiguration +CreateSnapshotBeforeSchemaExtension +CreateSnapshotBeforeUpdate +CreateSnapshotCopyGrantMessage +CreateSnapshotCopyGrantResult +CreateSnapshotFromVolumeRecoveryPointInput +CreateSnapshotFromVolumeRecoveryPointOutput +CreateSnapshotInput +CreateSnapshotMessage +CreateSnapshotOutput +CreateSnapshotRequest +CreateSnapshotResponse +CreateSnapshotResult +CreateSnapshotScheduleMessage +CreateSnapshotsRequest +CreateSnapshotsResult +CreateSoftwareUpdateJobRequest +CreateSoftwareUpdateJobResponse +CreateSolFunctionPackageInput +CreateSolFunctionPackageOutput +CreateSolNetworkInstanceInput +CreateSolNetworkInstanceOutput +CreateSolNetworkPackageInput +CreateSolNetworkPackageOutput +CreateSolutionRequest +CreateSolutionResponse +CreateSolutionVersionRequest +CreateSolutionVersionResponse +CreateSourceLocationRequest +CreateSourceLocationResponse +CreateSourceNetworkRequest +CreateSourceNetworkResponse +CreateSourceRepositoryBranchRequest +CreateSourceRepositoryBranchResponse +CreateSourceRepositoryRequest +CreateSourceRepositoryResponse +CreateSpaceRequest +CreateSpaceResponse +CreateSpotDatafeedSubscriptionRequest +CreateSpotDatafeedSubscriptionResult +CreateSqlInjectionMatchSetRequest +CreateSqlInjectionMatchSetResponse +CreateStackInput +CreateStackInstancesInput +CreateStackInstancesOutput +CreateStackOutput +CreateStackRequest +CreateStackResult +CreateStackSetInput +CreateStackSetOutput +CreateStageRequest +CreateStageResponse +CreateStageResult +CreateStandbyWorkspacesRequest +CreateStandbyWorkspacesResult +CreateStateMachineAliasInput +CreateStateMachineAliasOutput +CreateStateMachineInput +CreateStateMachineOutput +CreateStorageLocationResultMessage +CreateStorageVirtualMachineRequest +CreateStorageVirtualMachineResponse +CreateStoreImageTaskRequest +CreateStoreImageTaskResult +CreateStorediSCSIVolumeInput +CreateStorediSCSIVolumeOutput +CreateStreamInput +CreateStreamKeyRequest +CreateStreamKeyResponse +CreateStreamOutput +CreateStreamProcessorRequest +CreateStreamProcessorResponse +CreateStreamRequest +CreateStreamResponse +CreateStreamingDistributionRequest +CreateStreamingDistributionResult +CreateStreamingDistributionWithTagsRequest +CreateStreamingDistributionWithTagsResult +CreateStreamingImageRequest +CreateStreamingImageResponse +CreateStreamingSessionRequest +CreateStreamingSessionResponse +CreateStreamingSessionStreamRequest +CreateStreamingSessionStreamResponse +CreateStreamingURLRequest +CreateStreamingURLResult +CreateStudioComponentRequest +CreateStudioComponentResponse +CreateStudioInput +CreateStudioLifecycleConfigRequest +CreateStudioLifecycleConfigResponse +CreateStudioOutput +CreateStudioRequest +CreateStudioResponse +CreateStudioSessionMappingInput +CreateSubnetCidrReservationRequest +CreateSubnetCidrReservationResult +CreateSubnetGroupRequest +CreateSubnetGroupResponse +CreateSubnetRequest +CreateSubnetResult +CreateSubscriberNotificationRequest +CreateSubscriberNotificationResponse +CreateSubscriberRequest +CreateSubscriberResponse +CreateSubscriptionDefinitionRequest +CreateSubscriptionDefinitionResponse +CreateSubscriptionDefinitionVersionRequest +CreateSubscriptionDefinitionVersionResponse +CreateSuiteDefinitionRequest +CreateSuiteDefinitionResponse +CreateSvmActiveDirectoryConfiguration +CreateSyncJobRequest +CreateSyncJobResponse +CreateSystemInstanceRequest +CreateSystemInstanceResponse +CreateSystemTemplateRequest +CreateSystemTemplateResponse +CreateTLSInspectionConfigurationRequest +CreateTLSInspectionConfigurationResponse +CreateTableDefaultPermissions +CreateTableInput +CreateTableOutput +CreateTableRequest +CreateTableResponse +CreateTagOptionInput +CreateTagOptionOutput +CreateTagsMessage +CreateTagsRequest +CreateTapePoolInput +CreateTapePoolOutput +CreateTapeWithBarcodeInput +CreateTapeWithBarcodeOutput +CreateTapesInput +CreateTapesOutput +CreateTargetGroupInput +CreateTargetGroupOutput +CreateTargetGroupRequest +CreateTargetGroupResponse +CreateTaskInput +CreateTaskOutput +CreateTaskRequest +CreateTaskResponse +CreateTaskSetRequest +CreateTaskSetResponse +CreateTaskTemplateRequest +CreateTaskTemplateResponse +CreateTemplateAliasRequest +CreateTemplateAliasResponse +CreateTemplateGroupAccessControlEntryRequest +CreateTemplateMessageBody +CreateTemplateRequest +CreateTemplateResponse +CreateTemplateSyncConfigInput +CreateTemplateSyncConfigOutput +CreateTestGridProjectRequest +CreateTestGridProjectResult +CreateTestGridUrlRequest +CreateTestGridUrlResult +CreateTestSetDiscrepancyReportRequest +CreateTestSetDiscrepancyReportResponse +CreateThemeAliasRequest +CreateThemeAliasResponse +CreateThemeData +CreateThemeRequest +CreateThemeResponse +CreateThesaurusRequest +CreateThesaurusResponse +CreateThingGroupRequest +CreateThingGroupResponse +CreateThingRequest +CreateThingResponse +CreateThingTypeRequest +CreateThingTypeResponse +CreateThreatIntelSetRequest +CreateThreatIntelSetResponse +CreateTieringInput +CreateTime +CreateTimelineEventInput +CreateTimelineEventOutput +CreateTimestamp +CreateTokenRequest +CreateTokenResponse +CreateTopicInput +CreateTopicRefreshScheduleRequest +CreateTopicRefreshScheduleResponse +CreateTopicRequest +CreateTopicResponse +CreateTopicRuleDestinationRequest +CreateTopicRuleDestinationResponse +CreateTopicRuleRequest +CreateTrackerRequest +CreateTrackerResponse +CreateTrafficDistributionGroupRequest +CreateTrafficDistributionGroupResponse +CreateTrafficMirrorFilterRequest +CreateTrafficMirrorFilterResult +CreateTrafficMirrorFilterRuleRequest +CreateTrafficMirrorFilterRuleResult +CreateTrafficMirrorSessionRequest +CreateTrafficMirrorSessionResult +CreateTrafficMirrorTargetRequest +CreateTrafficMirrorTargetResult +CreateTrafficPolicyInstanceRequest +CreateTrafficPolicyInstanceResponse +CreateTrafficPolicyRequest +CreateTrafficPolicyResponse +CreateTrafficPolicyVersionRequest +CreateTrafficPolicyVersionResponse +CreateTrailRequest +CreateTrailResponse +CreateTrainingJobRequest +CreateTrainingJobResponse +CreateTransformJobRequest +CreateTransformJobResponse +CreateTransitGatewayConnectPeerRequest +CreateTransitGatewayConnectPeerResult +CreateTransitGatewayConnectRequest +CreateTransitGatewayConnectRequestOptions +CreateTransitGatewayConnectResult +CreateTransitGatewayMulticastDomainRequest +CreateTransitGatewayMulticastDomainRequestOptions +CreateTransitGatewayMulticastDomainResult +CreateTransitGatewayPeeringAttachmentRequest +CreateTransitGatewayPeeringAttachmentRequestOptions +CreateTransitGatewayPeeringAttachmentResult +CreateTransitGatewayPeeringRequest +CreateTransitGatewayPeeringResponse +CreateTransitGatewayPolicyTableRequest +CreateTransitGatewayPolicyTableResult +CreateTransitGatewayPrefixListReferenceRequest +CreateTransitGatewayPrefixListReferenceResult +CreateTransitGatewayRequest +CreateTransitGatewayResult +CreateTransitGatewayRouteRequest +CreateTransitGatewayRouteResult +CreateTransitGatewayRouteTableAnnouncementRequest +CreateTransitGatewayRouteTableAnnouncementResult +CreateTransitGatewayRouteTableAttachmentRequest +CreateTransitGatewayRouteTableAttachmentResponse +CreateTransitGatewayRouteTableRequest +CreateTransitGatewayRouteTableResult +CreateTransitGatewayVpcAttachmentRequest +CreateTransitGatewayVpcAttachmentRequestOptions +CreateTransitGatewayVpcAttachmentResult +CreateTransitVirtualInterfaceRequest +CreateTransitVirtualInterfaceResult +CreateTrialComponentRequest +CreateTrialComponentResponse +CreateTrialRequest +CreateTrialResponse +CreateTriggerRequest +CreateTriggerResponse +CreateTrustAnchorRequest +CreateTrustRequest +CreateTrustResult +CreateTrustStoreRequest +CreateTrustStoreResponse +CreateTypeRequest +CreateTypeResponse +CreateTypedLinkFacetRequest +CreateUnreferencedMergeCommitInput +CreateUnreferencedMergeCommitOutput +CreateUpdatedImageRequest +CreateUpdatedImageResult +CreateUpdatedWorkspaceImageRequest +CreateUpdatedWorkspaceImageResult +CreateUploadRequest +CreateUploadResult +CreateUploadUrlRequest +CreateUploadUrlResponse +CreateUsageLimitMessage +CreateUsageLimitRequest +CreateUsageLimitResponse +CreateUsagePlanKeyRequest +CreateUsagePlanRequest +CreateUsageReportSubscriptionResult +CreateUseCaseRequest +CreateUseCaseResponse +CreateUserAccessLoggingSettingsRequest +CreateUserAccessLoggingSettingsResponse +CreateUserDefinedFunctionRequest +CreateUserGroupMessage +CreateUserHierarchyGroupRequest +CreateUserHierarchyGroupResponse +CreateUserImportJobRequest +CreateUserImportJobResponse +CreateUserMessage +CreateUserPoolClientRequest +CreateUserPoolClientResponse +CreateUserPoolDomainRequest +CreateUserPoolDomainResponse +CreateUserPoolRequest +CreateUserPoolResponse +CreateUserProfileRequest +CreateUserProfileResponse +CreateUserProfileResult +CreateUserRequest +CreateUserResponse +CreateUserSettingsRequest +CreateUserSettingsResponse +CreateVPCAssociationAuthorizationRequest +CreateVPCAssociationAuthorizationResponse +CreateVPCConnectionRequest +CreateVPCConnectionResponse +CreateVPCEConfigurationRequest +CreateVPCEConfigurationResult +CreateVariableRequest +CreateVariantStoreRequest +CreateVariantStoreResponse +CreateVaultInput +CreateVaultOutput +CreateVehicleError +CreateVehicleRequest +CreateVehicleRequestItem +CreateVehicleResponse +CreateVehicleResponseItem +CreateVerifiedAccessEndpointEniOptions +CreateVerifiedAccessEndpointLoadBalancerOptions +CreateVerifiedAccessEndpointRequest +CreateVerifiedAccessEndpointResult +CreateVerifiedAccessGroupRequest +CreateVerifiedAccessGroupResult +CreateVerifiedAccessInstanceRequest +CreateVerifiedAccessInstanceResult +CreateVerifiedAccessTrustProviderDeviceOptions +CreateVerifiedAccessTrustProviderOidcOptions +CreateVerifiedAccessTrustProviderRequest +CreateVerifiedAccessTrustProviderResult +CreateViewInput +CreateViewOutput +CreateViewRequest +CreateViewResponse +CreateViewVersionRequest +CreateViewVersionResponse +CreateVirtualClusterRequest +CreateVirtualClusterResponse +CreateVirtualGatewayInput +CreateVirtualGatewayOutput +CreateVirtualMFADeviceRequest +CreateVirtualMFADeviceResponse +CreateVirtualNodeInput +CreateVirtualNodeOutput +CreateVirtualRouterInput +CreateVirtualRouterOutput +CreateVirtualServiceInput +CreateVirtualServiceOutput +CreateVocabularyFilterRequest +CreateVocabularyFilterResponse +CreateVocabularyRequest +CreateVocabularyResponse +CreateVodSourceRequest +CreateVodSourceResponse +CreateVoiceConnectorGroupRequest +CreateVoiceConnectorGroupResponse +CreateVoiceConnectorRequest +CreateVoiceConnectorResponse +CreateVoiceProfileDomainRequest +CreateVoiceProfileDomainResponse +CreateVoiceProfileRequest +CreateVoiceProfileResponse +CreateVoiceTemplateRequest +CreateVoiceTemplateResponse +CreateVolumeFromBackupRequest +CreateVolumeFromBackupResponse +CreateVolumePermission +CreateVolumePermissionModifications +CreateVolumePermissions +CreateVolumeRequest +CreateVolumeResponse +CreateVpcAttachmentRequest +CreateVpcAttachmentResponse +CreateVpcConnectionRequest +CreateVpcConnectionResponse +CreateVpcConnectorRequest +CreateVpcConnectorResponse +CreateVpcEndpointConnectionNotificationRequest +CreateVpcEndpointConnectionNotificationResult +CreateVpcEndpointDetail +CreateVpcEndpointRequest +CreateVpcEndpointResponse +CreateVpcEndpointResult +CreateVpcEndpointServiceConfigurationRequest +CreateVpcEndpointServiceConfigurationResult +CreateVpcIngressConnectionRequest +CreateVpcIngressConnectionResponse +CreateVpcLinkRequest +CreateVpcLinkResponse +CreateVpcPeeringAuthorizationInput +CreateVpcPeeringAuthorizationOutput +CreateVpcPeeringConnectionInput +CreateVpcPeeringConnectionRequest +CreateVpcPeeringConnectionResult +CreateVpcRequest +CreateVpcResult +CreateVpnConnectionRequest +CreateVpnConnectionResult +CreateVpnConnectionRouteRequest +CreateVpnGatewayRequest +CreateVpnGatewayResult +CreateWatchlistRequest +CreateWatchlistResponse +CreateWaveRequest +CreateWebACLMigrationStackRequest +CreateWebACLMigrationStackResponse +CreateWebACLRequest +CreateWebACLResponse +CreateWebLoginTokenRequest +CreateWebLoginTokenResponse +CreateWebhookInput +CreateWebhookOutput +CreateWebhookRequest +CreateWebhookResult +CreateWhatIfAnalysisRequest +CreateWhatIfAnalysisResponse +CreateWhatIfForecastExportRequest +CreateWhatIfForecastExportResponse +CreateWhatIfForecastRequest +CreateWhatIfForecastResponse +CreateWirelessDeviceRequest +CreateWirelessDeviceResponse +CreateWirelessGatewayRequest +CreateWirelessGatewayResponse +CreateWirelessGatewayTaskDefinitionRequest +CreateWirelessGatewayTaskDefinitionResponse +CreateWirelessGatewayTaskRequest +CreateWirelessGatewayTaskResponse +CreateWorkGroupInput +CreateWorkerBlockRequest +CreateWorkerConfigurationRequest +CreateWorkerConfigurationResponse +CreateWorkerFleetRequest +CreateWorkerFleetResponse +CreateWorkerRequest +CreateWorkerResponse +CreateWorkflowRequest +CreateWorkflowResponse +CreateWorkflowStepGroupRequest +CreateWorkflowStepGroupResponse +CreateWorkflowStepRequest +CreateWorkflowStepResponse +CreateWorkforceRequest +CreateWorkforceResponse +CreateWorkgroupRequest +CreateWorkgroupResponse +CreateWorkloadInput +CreateWorkloadOutput +CreateWorkloadShareInput +CreateWorkloadShareOutput +CreateWorkspaceApiKeyRequest +CreateWorkspaceApiKeyResponse +CreateWorkspaceBundleRequest +CreateWorkspaceBundleResult +CreateWorkspaceImageRequest +CreateWorkspaceImageResult +CreateWorkspaceRequest +CreateWorkspaceResponse +CreateWorkspacesRequest +CreateWorkspacesResult +CreateWorkteamRequest +CreateWorkteamResponse +CreateWorldExportJobRequest +CreateWorldExportJobResponse +CreateWorldGenerationJobRequest +CreateWorldGenerationJobResponse +CreateWorldTemplateRequest +CreateWorldTemplateResponse +CreateXMLClassifierRequest +CreateXssMatchSetRequest +CreateXssMatchSetResponse +Created +CreatedAfter +CreatedArtifact +CreatedArtifactList +CreatedArtifactName +CreatedAt +CreatedAtEndTime +CreatedAtStartTime +CreatedBefore +CreatedButModifiedException +CreatedBy +CreatedByAccountId +CreatedByArn +CreatedByIamUser +CreatedByService +CreatedDate +CreatedDateTime +CreatedOn +CreatedRange +CreatedResourceArn +CreatedRulesetName +CreatedTime +CreatedTimeStamp +CreatedTimestamp +CreatedUsingAutoPredictor +Creates +CreationDate +CreationDateTime +CreationInfo +CreationLimitExceededException +CreationPath +CreationRequestDateTime +CreationStatus +CreationTime +CreationTimeAfter +CreationTimeBefore +CreationTimestamp +CreationToken +CreatorId +CreatorRequestId +Credential +CredentialPair +CredentialProvider +CredentialReportExpiredException +CredentialReportNotPresentException +CredentialReportNotReadyException +CredentialSummary +CredentialType +Credentials +CredentialsArn +CredentialsParameter +CredentialsSecretName +CredentialsToAddOrUpdate +CredentialsToRemove +CreditSpecification +CreditSpecificationRequest +Criteria +CriteriaBlockForJob +CriteriaForJob +Criterion +CriterionAdditionalProperties +CriterionKey +Critical +CriticalCount +CriticalNonCompliantCount +Criticality +CrlConfiguration +CrlDetail +CrlDetailResponse +CronExpression +CronExpressionForRecurrence +Crop +CrossAccount +CrossAccountAuthorization +CrossAccountAuthorizations +CrossAccountClone +CrossAccountFilterOption +CrossAccountModelRegisterRoleArn +CrossChannelBehavior +CrossClusterSearch +CrossClusterSearchConnection +CrossClusterSearchConnectionId +CrossClusterSearchConnectionProperties +CrossClusterSearchConnections +CrossDataset +CrossRealmTrustPrincipalPassword +CrossRegionCopy +CrossRegionCopyAction +CrossRegionCopyDeprecateRule +CrossRegionCopyRetainRule +CrossRegionCopyRule +CrossRegionCopyRules +CrossZoneLoadBalancing +CryptoProviders +CryptogramVerificationArpcMethod1 +CryptogramVerificationArpcMethod2 +Csid +CslgAtom +Csr +CsrExtensions +Csv +CsvClassifier +CsvConfiguration +CsvContentTypes +CsvDelimiter +CsvFormatDescriptor +CsvNoSupValue +CsvNullValue +CsvOptions +CsvOutputOptions +CsvReport +CsvRowDelimiter +CttsVersion +CumulativeBytesMetered +CumulativeBytesScanned +Currency +CurrencyCode +CurrencyDisplayFormatConfiguration +CurrencySymbol +Current +CurrentAction +CurrentActiveJob +CurrentActiveVersion +CurrentActiveVersionArn +CurrentApplicationVersionId +CurrentApplyDate +CurrentAverageCoverage +CurrentAverageHourlyOnDemandSpend +CurrentBackupRateInMegaBytesPerSecond +CurrentBrokerSoftwareInfo +CurrentCapacity +CurrentCoverage +CurrentDatabaseRevision +CurrentDefaultVersion +CurrentDeliveryStreamVersionId +CurrentExpiryYear +CurrentFirewallSubnetRouteTable +CurrentFleetState +CurrentGeneration +CurrentInferenceUnits +CurrentInstance +CurrentInstanceBootMode +CurrentInstanceCount +CurrentInstances +CurrentInternetGatewayRouteTable +CurrentIpamScopeId +CurrentLensVersion +CurrentLsn +CurrentMaximumHourlyOnDemandSpend +CurrentMetric +CurrentMetricData +CurrentMetricResult +CurrentMetricSortCriteria +CurrentMetrics +CurrentMinimumHourlyOnDemandSpend +CurrentNetworkingStatus +CurrentOnDemandSpend +CurrentOperationStatus +CurrentParallelism +CurrentPassword +CurrentPerformanceRiskRatings +CurrentPhase +CurrentPlayerSessionCount +CurrentPolicyDescription +CurrentProfileVersion +CurrentRateInMegaBytesPerSecond +CurrentRegionAvailability +CurrentRestoreRateInMegaBytesPerSecond +CurrentRevision +CurrentRole +CurrentRouteTable +CurrentSamplingPercentage +CurrentScore +CurrentServerlessConfig +CurrentShardCount +CurrentShardLevelMetrics +CurrentSigningKeyLength +CurrentSoftware +CurrentSpotFleetRequestState +CurrentState +CurrentStatus +CurrentStepName +CurrentTaskExecutionArn +CurrentVersion +CurrentWeight +CustSubscriptionId +CustomAction +CustomActionFilterOperation +CustomActionId +CustomActionNavigationOperation +CustomActionSetParametersOperation +CustomActionURLOperation +CustomActions +CustomAmi +CustomAmiId +CustomAmiList +CustomArtifactConfiguration +CustomArtifactConfigurationDescription +CustomArtifactsConfiguration +CustomArtifactsConfigurationDescription +CustomArtifactsConfigurationUpdate +CustomAttribute +CustomAttributes +CustomAuthConfig +CustomAuthCredentials +CustomAvailabilityZoneNotFoundFault +CustomCertificate +CustomCname +CustomCnameAssociationFault +CustomCode +CustomCodeSigning +CustomColor +CustomColors +CustomCondition +CustomConfig +CustomConnector +CustomConnectorDestinationProperties +CustomConnectorProfileCredentials +CustomConnectorProfileProperties +CustomConnectorSourceProperties +CustomContentConfiguration +CustomContentVisual +CustomCookbooksSource +CustomDBEngineVersionAMI +CustomDBEngineVersionAlreadyExistsFault +CustomDBEngineVersionManifest +CustomDBEngineVersionNotFoundFault +CustomDBEngineVersionQuotaExceededFault +CustomDNSServer +CustomDataIdentifierSummary +CustomDataIdentifiers +CustomDataIdentifiersDetections +CustomDataIdentifiersResult +CustomDatatypeConfigured +CustomDatatypes +CustomDeliveryConfiguration +CustomDetection +CustomDnsServers +CustomDocumentEnrichmentConfiguration +CustomDomain +CustomDomainAssociationNotFoundFault +CustomDomainAssociationsMessage +CustomDomainCertExpiryTime +CustomDomainCertificateArn +CustomDomainCertificateExpiryDate +CustomDomainConfig +CustomDomainConfigType +CustomDomainName +CustomDomains +CustomEmailLambdaVersionConfigType +CustomEmailSender +CustomEndpoint +CustomEndpointCertificateArn +CustomEndpointEnabled +CustomEndpointType +CustomEndpoints +CustomEntityType +CustomEntityTypes +CustomEntityTypesNotFound +CustomEpoch +CustomErrorResponse +CustomErrorResponses +CustomEventData +CustomEvents +CustomExtension +CustomExtensions +CustomFederationProviderUrl +CustomFilterConfiguration +CustomFilterListConfiguration +CustomHTTPHeader +CustomHeaders +CustomHeadersConfig +CustomHealthNotFound +CustomIamInstanceProfile +CustomIconContent +CustomImage +CustomImages +CustomIndices +CustomIndicesInput +CustomInstanceProfileArn +CustomJson +CustomKeyStoreHasCMKsException +CustomKeyStoreId +CustomKeyStoreInvalidStateException +CustomKeyStoreName +CustomKeyStoreNameInUseException +CustomKeyStoreNotFoundException +CustomKeyStoreType +CustomKeyStores +CustomKeyStoresListEntry +CustomKeys +CustomKnowledgeArticleTypeConfigurations +CustomLabel +CustomLabelConfiguration +CustomLabels +CustomLanguageCode +CustomLibraries +CustomLineItemBillingPeriodRange +CustomLineItemChargeDetails +CustomLineItemFlatChargeDetails +CustomLineItemListElement +CustomLineItemPercentageChargeDetails +CustomLineItemVersionListElement +CustomLineItemVersions +CustomLineItems +CustomLogSourceAttributes +CustomLogSourceConfiguration +CustomLogSourceCrawlerConfiguration +CustomLogSourceProvider +CustomLogSourceResource +CustomMessage +CustomMessageActivity +CustomMetadata +CustomMetadataLimitExceededException +CustomModelSummary +CustomModelTrainingParameters +CustomModelTransformParameters +CustomName +CustomNarrative +CustomNarrativeOptions +CustomObjectIdentifier +CustomOriginConfig +CustomParameterValues +CustomPatterns +CustomPayload +CustomPermissionsName +CustomPlatformQuota +CustomPlugin +CustomPluginDescription +CustomPluginFileDescription +CustomPluginLocation +CustomPluginLocationDescription +CustomPluginRevisionSummary +CustomPluginSummary +CustomPolicyDetails +CustomPrivateKey +CustomRecipes +CustomRedirectDomain +CustomRequestHandling +CustomResponse +CustomResponseBodies +CustomResponseBody +CustomResponseBodyKey +CustomRoleArn +CustomRoutingAccelerator +CustomRoutingAcceleratorAttributes +CustomRoutingDestinationConfiguration +CustomRoutingDestinationDescription +CustomRoutingEndpointConfiguration +CustomRoutingEndpointDescription +CustomRoutingEndpointGroup +CustomRoutingListener +CustomRule +CustomSMSLambdaVersionConfigType +CustomSMSSender +CustomSchemaCountLimitExceededException +CustomSeasonalityValue +CustomSecurityGroupId +CustomSecurityGroupIds +CustomSql +CustomStepDetails +CustomSuffix +CustomTextContent +CustomUserData +CustomValue +CustomValues +CustomValuesConfiguration +CustomVerificationEmailInvalidContentException +CustomVerificationEmailTemplate +CustomVerificationEmailTemplateAlreadyExistsException +CustomVerificationEmailTemplateDoesNotExistException +CustomVerificationEmailTemplateMetadata +CustomVerificationEmailTemplateName +CustomVerificationEmailTemplates +CustomVocabularyEntryId +CustomVocabularyExportSpecification +CustomVocabularyImportSpecification +CustomVocabularyItem +CustomerAWSAccountId +CustomerAction +CustomerAgentInfo +CustomerAgentlessCollectorInfo +CustomerAgreement +CustomerArtifactPaths +CustomerAvailabilityZone +CustomerAwsId +CustomerConnectorInfo +CustomerContentEncryptionConfiguration +CustomerDnsIps +CustomerGateway +CustomerGatewayArn +CustomerGatewayArns +CustomerGatewayAssociation +CustomerGatewayAssociations +CustomerGatewayConfiguration +CustomerGatewayId +CustomerGatewayIds +CustomerGateways +CustomerIdentifier +CustomerManagedChannelS3Storage +CustomerManagedChannelS3StorageSummary +CustomerManagedDatastoreS3Storage +CustomerManagedDatastoreS3StorageSummary +CustomerManagedKeyEnabled +CustomerManagedPolicyReference +CustomerManagedPolicyReferences +CustomerManagedS3Storage +CustomerMasterKeySpec +CustomerMeCollectorInfo +CustomerMetadataProperties +CustomerMetadataPropertiesToRemove +CustomerNodeEndpoint +CustomerNodeEndpointList +CustomerNotEntitledException +CustomerOutpostArn +CustomerOverride +CustomerOverrideValidTill +CustomerOwnedIp +CustomerOwnedIpEnabled +CustomerOwnedIpv4Pool +CustomerProfiles +CustomerProfilesDestinationProperties +CustomerResultObject +CustomerSpeakerId +CustomerStorageMessage +CustomerUserName +CustomizedCapacityMetricSpecification +CustomizedLoadMetricSpecification +CustomizedMetricSpecification +CustomizedScalingMetricSpecification +Cutoff +CutoffBehavior +Cvss +Cvss2 +Cvss3 +CvssScore +CvssScoreAdjustment +CvssScoreDetails +CwLog +CwLogEnabled +CwLogGroup +Cwes +DASHFragmentSelector +DASHStreamingSessionURL +DASHTimestampRange +DBCluster +DBClusterAlreadyExistsFault +DBClusterArn +DBClusterAutomatedBackup +DBClusterAutomatedBackupMessage +DBClusterAutomatedBackupNotFoundFault +DBClusterAutomatedBackupQuotaExceededFault +DBClusterAutomatedBackups +DBClusterAutomatedBackupsArn +DBClusterBacktrack +DBClusterBacktrackMessage +DBClusterBacktrackNotFoundFault +DBClusterBacktracks +DBClusterCapacityInfo +DBClusterEndpoint +DBClusterEndpointAlreadyExistsFault +DBClusterEndpointArn +DBClusterEndpointIdentifier +DBClusterEndpointMessage +DBClusterEndpointNotFoundFault +DBClusterEndpointQuotaExceededFault +DBClusterEndpointResourceIdentifier +DBClusterEndpoints +DBClusterIdentifier +DBClusterIdentifiers +DBClusterInstanceClass +DBClusterMember +DBClusterMembers +DBClusterMessage +DBClusterNotFoundFault +DBClusterOptionGroupMemberships +DBClusterOptionGroupName +DBClusterOptionGroupStatus +DBClusterParameterGroup +DBClusterParameterGroupArn +DBClusterParameterGroupDetails +DBClusterParameterGroupName +DBClusterParameterGroupNameMessage +DBClusterParameterGroupNotFoundFault +DBClusterParameterGroupStatus +DBClusterParameterGroups +DBClusterParameterGroupsMessage +DBClusterQuotaExceededFault +DBClusterRole +DBClusterRoleAlreadyExistsFault +DBClusterRoleNotFoundFault +DBClusterRoleQuotaExceededFault +DBClusterSnapshot +DBClusterSnapshotAlreadyExistsFault +DBClusterSnapshotArn +DBClusterSnapshotAttribute +DBClusterSnapshotAttributes +DBClusterSnapshotAttributesResult +DBClusterSnapshotIdentifier +DBClusterSnapshotMessage +DBClusterSnapshotNotFoundFault +DBClusterSnapshots +DBClusters +DBEngineDescription +DBEngineMediaType +DBEngineVersion +DBEngineVersionArn +DBEngineVersionDescription +DBEngineVersionMessage +DBEngineVersions +DBInstance +DBInstanceAlreadyExistsFault +DBInstanceArn +DBInstanceAutomatedBackup +DBInstanceAutomatedBackupMessage +DBInstanceAutomatedBackupNotFoundFault +DBInstanceAutomatedBackupQuotaExceededFault +DBInstanceAutomatedBackups +DBInstanceAutomatedBackupsArn +DBInstanceAutomatedBackupsReplication +DBInstanceAutomatedBackupsReplications +DBInstanceClass +DBInstanceCount +DBInstanceIdentifier +DBInstanceIdentifiers +DBInstanceMessage +DBInstanceNotFoundFault +DBInstanceParameterGroupName +DBInstanceRole +DBInstanceRoleAlreadyExistsFault +DBInstanceRoleNotFoundFault +DBInstanceRoleQuotaExceededFault +DBInstanceStatus +DBInstanceStatusInfo +DBInstances +DBLogFileNotFoundFault +DBName +DBParameterGroup +DBParameterGroupAlreadyExistsFault +DBParameterGroupArn +DBParameterGroupDetails +DBParameterGroupFamily +DBParameterGroupName +DBParameterGroupNameMessage +DBParameterGroupNotFoundFault +DBParameterGroupQuotaExceededFault +DBParameterGroupStatus +DBParameterGroups +DBParameterGroupsMessage +DBPortNumber +DBProxies +DBProxy +DBProxyAlreadyExistsFault +DBProxyArn +DBProxyEndpoint +DBProxyEndpointAlreadyExistsFault +DBProxyEndpointArn +DBProxyEndpointName +DBProxyEndpointNotFoundFault +DBProxyEndpointQuotaExceededFault +DBProxyEndpoints +DBProxyName +DBProxyNotFoundFault +DBProxyQuotaExceededFault +DBProxyTarget +DBProxyTargetAlreadyRegisteredFault +DBProxyTargetGroup +DBProxyTargetGroupNotFoundFault +DBProxyTargetNotFoundFault +DBProxyTargets +DBSecurityGroup +DBSecurityGroupAlreadyExistsFault +DBSecurityGroupArn +DBSecurityGroupDescription +DBSecurityGroupMembership +DBSecurityGroupMemberships +DBSecurityGroupMessage +DBSecurityGroupName +DBSecurityGroupNotFoundFault +DBSecurityGroupNotSupportedFault +DBSecurityGroupQuotaExceededFault +DBSecurityGroups +DBSnapshot +DBSnapshotAlreadyExistsFault +DBSnapshotArn +DBSnapshotAttribute +DBSnapshotAttributes +DBSnapshotAttributesResult +DBSnapshotIdentifier +DBSnapshotMessage +DBSnapshotNotFoundFault +DBSnapshots +DBSubnetGroup +DBSubnetGroupAlreadyExistsFault +DBSubnetGroupArn +DBSubnetGroupDescription +DBSubnetGroupDoesNotCoverEnoughAZs +DBSubnetGroupMessage +DBSubnetGroupName +DBSubnetGroupNotAllowedFault +DBSubnetGroupNotFoundFault +DBSubnetGroupQuotaExceededFault +DBSubnetGroups +DBSubnetQuotaExceededFault +DBSystemId +DBUpgradeDependencyFailureFault +DESIRED +DICOMAccessionNumber +DICOMImportJobProperties +DICOMImportJobSummary +DICOMNumberOfStudyRelatedInstances +DICOMNumberOfStudyRelatedSeries +DICOMPatientBirthDate +DICOMPatientId +DICOMPatientName +DICOMPatientSex +DICOMStudyDate +DICOMStudyDateAndTime +DICOMStudyDescription +DICOMStudyId +DICOMStudyInstanceUID +DICOMStudyTime +DICOMTags +DICOMUpdates +DNIS +DNISEmergencyCallingConfiguration +DNSKEYRecord +DNSLogs +DNSLogsConfigurationResult +DNSName +DNSSECNotFound +DNSSECStatus +DNSTarget +DNSTargetResource +DPDTimeoutAction +DPDTimeoutSeconds +DPUHour +DPUSeconds +DQResultsPublishingOptions +DQStopJobOnFailureOptions +DSRecord +DTMFInputEvent +DTMFSpecification +DagEdges +DagNodes +DagProcessingLogs +DagS3Path +Daily +DailyAutomaticBackupStartTime +DailyCap +DailyCommitmentToPurchase +DailySettings +DailyVolume +DailyVolumes +DakCertificateMetadata +Danger +DangerForeground +DashAdditionalManifest +DashConfiguration +DashConfigurationForPut +DashEncryption +DashIsoEncryptionSettings +DashIsoGroupSettings +DashIsoImageBasedTrickPlaySettings +DashManifest +DashManifestStyle +DashManifests +DashPackage +DashPlaylistSettings +DashSignaledSystemIds +Dashboard +DashboardArn +DashboardAttributes +DashboardBody +DashboardEnabled +DashboardEntries +DashboardEntry +DashboardError +DashboardId +DashboardInvalidInputError +DashboardName +DashboardNamePrefix +DashboardNames +DashboardNotFoundError +DashboardOptions +DashboardPublishOptions +DashboardSearchFilter +DashboardSourceEntity +DashboardSourceTemplate +DashboardSummary +DashboardSummaryList +DashboardValidationMessage +DashboardValidationMessages +DashboardVersion +DashboardVersionDefinition +DashboardVersionSummary +DashboardVersionSummaryList +DashboardVisual +DashboardVisualId +DashboardVisualPublishOptions +Dashboards +Data +DataAccessRoleArn +DataAggregation +DataAlreadyAcceptedException +DataAlreadyExistsException +DataAnalysisEndTime +DataAnalysisStartTime +DataAttributes +DataBars +DataBarsOptions +DataCaptureConfig +DataCaptureConfigSummary +DataCapturedDestinationS3Uri +DataCatalog +DataCatalogConfig +DataCatalogEncryptionSettings +DataCatalogInputDefinition +DataCatalogOutput +DataCatalogOutputs +DataCatalogSummary +DataCatalogsSummary +DataCellsFilter +DataCellsFilterResource +DataCellsFilters +DataChannel +DataChannelConcatenationConfiguration +DataClassification +DataClassificationDetails +DataCollectionDetails +DataColor +DataColorPalette +DataCompressionType +DataConfig +DataConfiguration +DataConnector +DataDelayOffsetInMinutes +DataDestination +DataDistributionType +DataDriven +DataEncipherment +DataEncryptionException +DataEncryptionKeyId +DataEncryptionMetadata +DataEndTime +DataEndTimeBefore +DataEndpoint +DataExists +DataExplorationNotebookLocation +DataExport +DataFieldSeriesItem +DataFormat +DataFormatConversionConfiguration +DataFrequency +DataId +DataIngestionJobSummaries +DataIngestionJobSummary +DataInputConfig +DataInputConfiguration +DataIntegrationArn +DataIntegrationAssociationArn +DataIntegrationAssociationSummary +DataIntegrationAssociations +DataIntegrationIdentifier +DataIntegrationSummary +DataIntegrations +DataItem +DataItems +DataLabelOptions +DataLabelType +DataLabelTypes +DataLabels +DataLakeAdmins +DataLakeAutoEnableNewAccountConfiguration +DataLakeConfiguration +DataLakeEncryptionConfiguration +DataLakeException +DataLakeKmsKeyId +DataLakeLifecycleConfiguration +DataLakeLifecycleExpiration +DataLakeLifecycleTransition +DataLakePrincipal +DataLakePrincipalIdentifier +DataLakeReplicationConfiguration +DataLakeResource +DataLakeS3Uri +DataLakeSettings +DataLakeSource +DataLakeSourceStatus +DataLakeUpdateException +DataLakeUpdateStatus +DataLength +DataLocation +DataLocationResource +DataLocationS3 +DataManifestLocation +DataModel +DataModelConfiguration +DataModelS3Configuration +DataNodeCount +DataOptions +DataOutputConfiguration +DataPTSControl +DataPageSize +DataPath +DataPathColor +DataPathLabelType +DataPathList +DataPathOptions +DataPathSort +DataPathValue +DataPipelineId +DataPoint +DataPointDrillUpDownOption +DataPointMenuLabelOption +DataPointTooltipOption +DataPoints +DataPolicyCount +DataPreProcessingConfiguration +DataPreviewOptions +DataPrivacy +DataProcessing +DataProtectionPolicy +DataProvider +DataProviderArn +DataProviderCreationTime +DataProviderDescriptor +DataProviderDescriptorDefinition +DataProviderIdentifier +DataProviderName +DataProviders +DataPullMode +DataQualityAppSpecification +DataQualityBaselineConfig +DataQualityEvaluationRunAdditionalRunOptions +DataQualityJobInput +DataQualityJobOutputConfig +DataQualityMetric +DataQualityMetricList +DataQualityResult +DataQualityResultDescription +DataQualityResultFilterCriteria +DataQualityRuleRecommendationRunDescription +DataQualityRuleRecommendationRunFilter +DataQualityRuleResult +DataQualityRulesetEvaluationRunDescription +DataQualityRulesetEvaluationRunFilter +DataQualityRulesetFilterCriteria +DataQualityRulesetListDetails +DataQualitySummary +DataQualityTargetTable +DataQueries +DataQuery +DataRate +DataRearrangement +DataReplicationCounterpart +DataReplicationError +DataReplicationInfo +DataReplicationInfoReplicatedDisk +DataReplicationInitiation +DataReplicationInitiationStep +DataReplicationMetadata +DataReplicationMetadataOutput +DataReplicationMode +DataReplicationPrimaryBrokerArn +DataReplicationRole +DataRepositoryAssociation +DataRepositoryAssociationIds +DataRepositoryAssociationNotFound +DataRepositoryAssociations +DataRepositoryConfiguration +DataRepositoryFailureDetails +DataRepositoryPath +DataRepositorySubdirectories +DataRepositoryTask +DataRepositoryTaskEnded +DataRepositoryTaskExecuting +DataRepositoryTaskFailureDetails +DataRepositoryTaskFilter +DataRepositoryTaskNotFound +DataRepositoryTaskStatus +DataRepositoryTasks +DataResource +DataResources +DataResponse +DataResponses +DataRetentionChangeInHours +DataRetentionInHours +DataRetentionOptIn +DataRetentionSupport +DataRetrievalPolicy +DataRetrievalRule +DataScannedBytes +DataScannedInBytes +DataSchema +DataSchemaLocationS3 +DataSchemaUri +DataSecurityConfig +DataSet +DataSetArn +DataSetArns +DataSetConfiguration +DataSetConfigurations +DataSetEntry +DataSetId +DataSetIdentifier +DataSetIdentifierDeclaration +DataSetIdentifierDeclarations +DataSetImportItem +DataSetImportSummary +DataSetImportTask +DataSetName +DataSetParameterName +DataSetPlaceholder +DataSetReference +DataSetReferences +DataSetRefreshProperties +DataSetSchema +DataSetSearchFilter +DataSetSummaries +DataSetSummary +DataSetUsageConfiguration +DataSets +DataShare +DataShareArn +DataShareAssociation +DataShareAssociations +DataShares +DataSharingPreference +DataSharingPreferenceForUpdate +DataSize +DataSizeInBytes +DataSnapshotTime +DataSource +DataSourceArn +DataSourceConfig +DataSourceConfiguration +DataSourceConfigurations +DataSourceConfigurationsResult +DataSourceCredentials +DataSourceErrorCode +DataSourceErrorInfo +DataSourceFieldName +DataSourceFreeTrial +DataSourceGroup +DataSourceGroups +DataSourceId +DataSourceIds +DataSourceName +DataSourceParameters +DataSourceS3Configuration +DataSourceSchema +DataSourceSearchFilter +DataSourceSummaries +DataSourceSummary +DataSourceSyncJob +DataSourceSyncJobId +DataSourceSyncJobMetricTarget +DataSourceSyncJobMetrics +DataSourceToIndexFieldMapping +DataSourceVpcConfiguration +DataSources +DataSourcesFreeTrial +DataSpec +DataSplitConfig +DataStartTime +DataStartTimeAfter +DataStorage +DataStorageConfig +DataTableColumns +DataTableName +DataTiering +DataTieringEnabled +DataTraceEnabled +DataTransfer +DataTransferApi +DataTransferProgress +DataTransferProgressPercent +DataTransferProtection +DataTransferSubscriberFeePercent +DataTransferredInMegaBytes +DataTransforms +DataType +DataTypeMapping +DataUnavailableException +DataUploadFrequency +DataValidationMetrics +DataValue +DataViewDestinationTypeParams +DataViewErrorInfo +DataViewSummary +DataVolumeKMSKeyId +DataWrites +Database +DatabaseARN +DatabaseARNUpdate +DatabaseArn +DatabaseConfigDetail +DatabaseConfiguration +DatabaseConnectionException +DatabaseCredentials +DatabaseEdition +DatabaseEngine +DatabaseEngineType +DatabaseHost +DatabaseId +DatabaseIdentifier +DatabaseIds +DatabaseInformation +DatabaseInput +DatabaseInputDefinition +DatabaseInstallationFilesS3BucketName +DatabaseInstallationFilesS3Prefix +DatabaseInstance +DatabaseInstanceSoftwareDetailsResponse +DatabaseIpAddress +DatabaseLFTagPolicy +DatabaseLFTagPolicyAndPermissions +DatabaseList +DatabaseMode +DatabaseName +DatabaseOptions +DatabaseOutput +DatabaseOutputMode +DatabaseOutputs +DatabasePort +DatabasePreferences +DatabaseResource +DatabaseResponse +DatabaseRevision +DatabaseRevisionReleaseDate +DatabaseShortInfoResponse +DatabaseSummary +DatabaseTableName +DatabaseTableOutputOptions +DatabaseType +DatabaseUserName +DatabaseVersion +Databases +DatabricksParameters +Datadog +DatadogConnectorProfileCredentials +DatadogConnectorProfileProperties +DatadogSourceProperties +DataflowDetail +DataflowEndpoint +DataflowEndpointConfig +DataflowEndpointGroupIdResponse +DataflowEndpointListItem +Datapoint +Datapoints +DatapointsToAlarm +DatapointsToAlert +Dataset +DatasetAction +DatasetActionSummary +DatasetArn +DatasetArns +DatasetAugmentedManifestsListItem +DatasetChanges +DatasetContentDeliveryDestination +DatasetContentDeliveryRule +DatasetContentStatus +DatasetContentSummary +DatasetContentVersionValue +DatasetCount +DatasetDefinition +DatasetDeletedAfterRequestedSyncCount +DatasetDescription +DatasetDocumentClassifierInputDataConfig +DatasetEntityRecognizerAnnotations +DatasetEntityRecognizerDocuments +DatasetEntityRecognizerEntityList +DatasetEntityRecognizerInputDataConfig +DatasetEntries +DatasetEntry +DatasetExists +DatasetExportJob +DatasetExportJobOutput +DatasetExportJobSummary +DatasetFilter +DatasetFormat +DatasetGroundTruthManifest +DatasetGroup +DatasetGroupArn +DatasetGroupName +DatasetGroupSummary +DatasetGroups +DatasetId +DatasetImageStats +DatasetImportJob +DatasetImportJobArn +DatasetImportJobArns +DatasetImportJobName +DatasetImportJobSummary +DatasetImportJobs +DatasetInputDataConfig +DatasetLabelDescription +DatasetLabelDescriptions +DatasetLabelStats +DatasetMetadata +DatasetName +DatasetNameBeginsWith +DatasetOwnerInfo +DatasetParameter +DatasetParameters +DatasetProperties +DatasetPropertiesList +DatasetRowDateGranularity +DatasetS3Uri +DatasetSchema +DatasetSchemaSummary +DatasetSource +DatasetStatisticsConfiguration +DatasetStats +DatasetSummaries +DatasetSummary +DatasetSyncCount +DatasetTrigger +DatasetType +DatasetUpdateSummary +Datasets +DatasourcePackageIngestDetail +DatasourcePackageIngestHistory +DatasourcePackageIngestState +DatasourcePackageIngestStates +DatasourcePackageUsageInfo +DatasourcePackages +Datastore +DatastoreActivity +DatastoreArn +DatastoreEndpoint +DatastoreFilter +DatastoreId +DatastoreIotSiteWiseMultiLayerStorage +DatastoreIotSiteWiseMultiLayerStorageSummary +DatastoreName +DatastorePartition +DatastorePartitions +DatastoreProperties +DatastorePropertiesList +DatastoreStatistics +DatastoreStatus +DatastoreStorageSummary +DatastoreSummary +DatastoreTypeVersion +Datatype +Date +DateAggregationFunction +DateArrayOptions +DateAxisOptions +DateColumnStatisticsData +DateCreated +DateDimensionField +DateEnabled +DateFieldFormat +DateFilter +DateFormat +DateGranularity +DateImported +DateInterval +DateMeasureField +DateModified +DateNewProvisioningDataAvailable +DateOptions +DatePartitionDelimiter +DatePartitionEnabled +DatePartitionSequence +DatePartitionTimezone +DateProvisioned +DateRange +DateRangeFilter +DateRangeType +DateReference +DateTime +DateTimeDatasetParameter +DateTimeDatasetParameterDefaultValues +DateTimeDefaultValues +DateTimeFormat +DateTimeFormatConfiguration +DateTimeHierarchy +DateTimeParameter +DateTimeParameterDeclaration +DateTimeParameters +DateTimePicker +DateTimePickerControlDisplayOptions +DateTimeRange +DateTimeStaticValues +DateTimeValueWhenUnsetConfiguration +DateTimeValues +DateUpdated +DateValue +Datetime +DatetimeFormat +DatetimeOptions +DatetimeRange +DatetimeTypeFieldName +Datum +Day +DayOfMonth +DayOfTheWeek +DayOfWeek +Days +DaysAfterInitiation +DaysBeforeExpiry +DaysOfWeek +DbClusterIdentifier +DbClusterMembers +DbClusterOptionGroupMemberships +DbClusterOptionGroupName +DbClusterParameterGroup +DbClusterParameterGroupStatus +DbClusterResourceId +DbClusterSnapshotAttributes +DbClusterSnapshotIdentifier +DbGroups +DbInstanceArn +DbInstanceClass +DbInstanceIdentifier +DbInstancePort +DbInstanceStatus +DbName +DbParameterGroupName +DbParameterGroups +DbPassword +DbSecurityGroupArn +DbSecurityGroupDescription +DbSecurityGroupName +DbSecurityGroups +DbSnapshotIdentifier +DbSubnetGroup +DbSubnetGroupArn +DbSubnetGroupDescription +DbSubnetGroupName +DbUser +DbiResourceId +DcFilter +DdlArtifactsSchema +Ddls +DdsHandling +DdsXCoordinate +DdsYCoordinate +DeactivateAnomalyDetectorRequest +DeactivateContactChannelRequest +DeactivateDeviceIdentifierRequest +DeactivateDeviceIdentifierResponse +DeactivateEvaluationFormRequest +DeactivateEvaluationFormResponse +DeactivateEventSourceRequest +DeactivateKeySigningKeyRequest +DeactivateKeySigningKeyResponse +DeactivateMFADeviceRequest +DeactivatePipelineInput +DeactivateTypeInput +DeactivateUserRequest +DeactivatingLastSystemUserException +DeadLetterConfig +DeadLetterQueueUrl +DeadLetterTargetArn +Deadline +DeauthorizeConnectionRequest +DeauthorizeConnectionResponse +DeauthorizeDataShareMessage +DeblockFilter +DebugHookConfig +DebugLogDeliveryAccounts +DebugLogging +DebugRuleConfiguration +DebugRuleConfigurations +DebugRuleEvaluationStatus +DebugRuleEvaluationStatuses +DebugSession +DecimalColumnStatisticsData +DecimalDatasetParameter +DecimalDatasetParameterDefaultValues +DecimalDefaultValues +DecimalNumber +DecimalParameter +DecimalParameterDeclaration +DecimalParameters +DecimalPlaces +DecimalPlacesConfiguration +DecimalSeparator +DecimalStaticValues +DecimalValueWhenUnsetConfiguration +DecimalValues +DecimalizationTable +DecipherOnly +Decision +DecisionTask +DecisionTaskCompletedEventAttributes +DecisionTaskScheduledEventAttributes +DecisionTaskStartedEventAttributes +DecisionTaskTimedOutEventAttributes +Declared +DeclaredTransforms +DeclineHandshakeRequest +DeclineHandshakeResponse +DeclineInvitationsRequest +DeclineInvitationsResponse +DecodeAuthorizationMessageRequest +DecodeAuthorizationMessageResponse +DecodeConfig +DecodedMessage +DecoderManifestSummary +DecoderManifestValidationException +DecommissionTimeout +DecreaseNodeGroupsInGlobalReplicationGroupMessage +DecreaseNodeGroupsInGlobalReplicationGroupResult +DecreaseReplicaCountMessage +DecreaseReplicaCountResult +DecreaseReplicationFactorRequest +DecreaseReplicationFactorResponse +DecreaseStreamRetentionPeriodInput +Decrypt +DecryptDataInput +DecryptDataOutput +DecryptRequest +DecryptResponse +DecryptStepDetails +Decryption +DecryptionAttributes +DecryptionFailure +DecryptionMode +DecryptionSettings +DedicatedHostIds +DedicatedHostsSupported +DedicatedIp +DedicatedIpAutoWarmupEnabled +DedicatedIpPool +DedicatedIpPools +DedicatedIps +DedicatedMaster +DedicatedMasterCount +DedicatedMasterEnabled +DedicatedMasterType +DedicatedTenancyManagementCidrRange +DedicatedTenancySupport +Default +DefaultAction +DefaultActions +DefaultActivity +DefaultAdmin +DefaultAllocatedStorage +DefaultArguments +DefaultAssociationRouteTable +DefaultAuthType +DefaultAuthenticationMethod +DefaultAvailabilityZone +DefaultBaseline +DefaultBehavior +DefaultBranchCannotBeDeletedException +DefaultButtonConfiguration +DefaultCacheBehavior +DefaultCapacityProviderStrategy +DefaultCategoricalHyperParameterRange +DefaultCellWidth +DefaultCertificateForNewLaunches +DefaultCharacterSet +DefaultClientBrandingAttributes +DefaultClusterParameters +DefaultCodeRepository +DefaultCodeRepositoryContains +DefaultConditionalBranch +DefaultConferenceProviderArn +DefaultConfig +DefaultContent +DefaultContinuousHyperParameterRange +DefaultControlPanel +DefaultCooldown +DefaultCores +DefaultDateColumnName +DefaultDetection +DefaultDimensionValue +DefaultDocumentIdFormat +DefaultDomain +DefaultEmailCustomizationTemplate +DefaultEmailOption +DefaultEmailTags +DefaultEncryptionKey +DefaultErrorDetails +DefaultExecutorDpuSize +DefaultExpirationDays +DefaultExportDestination +DefaultFieldValues +DefaultForAz +DefaultFormatting +DefaultFreeFormLayoutConfiguration +DefaultGateway +DefaultGid +DefaultGridLayoutConfiguration +DefaultHyperParameterRanges +DefaultIamRoleArn +DefaultImportClientBrandingAttributes +DefaultInstanceName +DefaultInstanceProfileArn +DefaultInstanceWarmup +DefaultIntegerHyperParameterRange +DefaultInteractiveLayoutConfiguration +DefaultLicense +DefaultList +DefaultLists +DefaultLogLevel +DefaultMailDomain +DefaultMessage +DefaultMessageType +DefaultNamespace +DefaultNetworkCardIndex +DefaultNewSheetConfiguration +DefaultOnly +DefaultOptionRefId +DefaultOs +DefaultOu +DefaultOutboundQueueId +DefaultPaginatedLayoutConfiguration +DefaultPhoneNumber +DefaultPort +DefaultPropagationRouteTable +DefaultPushNotificationMessage +DefaultPushNotificationTemplate +DefaultRecipes +DefaultRedirectURI +DefaultResourceDiscoveryAssociationId +DefaultResourceDiscoveryId +DefaultResourceSpec +DefaultResult +DefaultRetention +DefaultRootDeviceType +DefaultRootObject +DefaultRoute +DefaultRouteInput +DefaultRouteSettings +DefaultRouteTableAssociation +DefaultRouteTablePropagation +DefaultRunProperties +DefaultRuntimeContextDevice +DefaultRuntimeContextDeviceName +DefaultS3Location +DefaultSectionBasedLayoutConfiguration +DefaultSecurityGroupNames +DefaultSegmentDeliveryConfiguration +DefaultSelection +DefaultSenderId +DefaultSeriesSettings +DefaultServerSideEncryption +DefaultSessionExpiryMinutes +DefaultSizeInspectionLimit +DefaultSpaceSettings +DefaultSshKeyName +DefaultState +DefaultStorageClass +DefaultSubnetId +DefaultSubscriptionStatus +DefaultSubstitutions +DefaultTTL +DefaultTags +DefaultTargetCapacityType +DefaultTargetInstance +DefaultTemplateData +DefaultTheme +DefaultThreadsPerCore +DefaultUid +DefaultUndefinedFault +DefaultUserAssociatedToUserGroupFault +DefaultUserRequired +DefaultUserSettings +DefaultVCpus +DefaultValue +DefaultValueColumn +DefaultValues +DefaultVersion +DefaultVersionId +DefaultVersionName +DefaultVersionNumber +DefaultVocabulary +DefaultVocabularyList +DefaultWatchlist +DefaultWatchlistId +DefaultWorkspaceCreationProperties +Defaults +DeferActivation +DeferMaintenance +DeferMaintenanceDuration +DeferMaintenanceEndTime +DeferMaintenanceIdentifier +DeferMaintenanceStartTime +DeferredMaintenanceWindow +DeferredMaintenanceWindows +DefineAnalysisSchemeRequest +DefineAnalysisSchemeResponse +DefineAuthChallenge +DefineExpressionRequest +DefineExpressionResponse +DefineIndexFieldRequest +DefineIndexFieldResponse +DefineSegment +DefineSuggesterRequest +DefineSuggesterResponse +Definition +DefinitionArn +DefinitionDocument +DefinitionInformation +DefinitionName +DefinitionTimestamp +DefinitionType +Definitions +Degraded +Deinterlacer +Delay +DelaySeconds +DelayUntilElbConnectionsDrained +Delegate +DelegatedAdmin +DelegatedAdminAccount +DelegatedAdminAccountId +DelegatedAdminAccountLimitExceededException +DelegatedAdministrator +DelegatedAdministrators +DelegatedService +DelegatedServices +Delegates +Delegation +DelegationEnabledDate +DelegationMetadata +DelegationSet +DelegationSetAlreadyCreated +DelegationSetAlreadyReusable +DelegationSetId +DelegationSetInUse +DelegationSetNotAvailable +DelegationSetNotReusable +DelegationSets +DelegationTime +Delete +DeleteACLRequest +DeleteACLResponse +DeleteAcceleratorRequest +DeleteAccessControlConfigurationRequest +DeleteAccessControlRuleRequest +DeleteAccessKeyRequest +DeleteAccessLogSettingsRequest +DeleteAccessLogSubscriptionRequest +DeleteAccessPointForObjectLambdaRequest +DeleteAccessPointInput +DeleteAccessPointPolicyForObjectLambdaRequest +DeleteAccessPointPolicyRequest +DeleteAccessPointRequest +DeleteAccessPolicyRequest +DeleteAccessRequest +DeleteAccessTokenRequest +DeleteAccessorInput +DeleteAccountAliasRequest +DeleteAccountAssignmentRequest +DeleteAccountAssignmentResponse +DeleteAccountAuditConfigurationRequest +DeleteAccountCustomizationRequest +DeleteAccountCustomizationResponse +DeleteAccountPolicyRequest +DeleteAccountRequest +DeleteAccountSettingRequest +DeleteAccountSettingResponse +DeleteAccountSubscriptionRequest +DeleteAccountSubscriptionResponse +DeleteActionRequest +DeleteActionResponse +DeleteActionTargetRequest +DeleteActionTargetResponse +DeleteActivationRequest +DeleteActivityInput +DeleteAddonRequest +DeleteAddonResponse +DeleteAddressBookRequest +DeleteAdmChannelRequest +DeleteAdmChannelResponse +DeleteAfterDays +DeleteAfterUpload +DeleteAgentRequest +DeleteAggregationAuthorizationRequest +DeleteAgreementRequest +DeleteAlarmModelRequest +DeleteAlarmRequest +DeleteAlarmResult +DeleteAlarmsInput +DeleteAlertManagerDefinitionRequest +DeleteAlertRequest +DeleteAlgorithmInput +DeleteAliasInput +DeleteAliasRequest +DeleteAll +DeleteAllPolicyResources +DeleteAllRevisions +DeleteAllowListRequest +DeleteAlternateContactRequest +DeleteAnalysisRequest +DeleteAnalysisResponse +DeleteAnalysisSchemeRequest +DeleteAnalysisSchemeResponse +DeleteAnalysisTemplateInput +DeleteAnalyzerRequest +DeleteAnnotationStoreRequest +DeleteAnnotationStoreResponse +DeleteAnnotationStoreVersionsRequest +DeleteAnnotationStoreVersionsResponse +DeleteAnomalyDetectorInput +DeleteAnomalyDetectorRequest +DeleteAnomalyMonitorRequest +DeleteAnomalySubscriptionRequest +DeleteApiCacheRequest +DeleteApiDestinationRequest +DeleteApiKeyRequest +DeleteApiMappingRequest +DeleteApiRequest +DeleteApnsChannelRequest +DeleteApnsChannelResponse +DeleteApnsSandboxChannelRequest +DeleteApnsSandboxChannelResponse +DeleteApnsVoipChannelRequest +DeleteApnsVoipChannelResponse +DeleteApnsVoipSandboxChannelRequest +DeleteApnsVoipSandboxChannelResponse +DeleteAppAssessmentRequest +DeleteAppAssessmentResponse +DeleteAppAuthorizationRequest +DeleteAppBlockBuilderRequest +DeleteAppBlockRequest +DeleteAppBundleRequest +DeleteAppImageConfigRequest +DeleteAppInput +DeleteAppInputSourceRequest +DeleteAppInputSourceResponse +DeleteAppInstanceAdminRequest +DeleteAppInstanceBotRequest +DeleteAppInstanceRequest +DeleteAppInstanceStreamingConfigurationsRequest +DeleteAppInstanceUserRequest +DeleteAppLaunchConfigurationRequest +DeleteAppMonitorRequest +DeleteAppReplicationConfigurationRequest +DeleteAppRequest +DeleteAppResponse +DeleteAppResult +DeleteAppValidationConfigurationRequest +DeleteAppVersionAppComponentRequest +DeleteAppVersionAppComponentResponse +DeleteAppVersionResourceRequest +DeleteAppVersionResourceResponse +DeleteApplicationCloudWatchLoggingOptionRequest +DeleteApplicationCloudWatchLoggingOptionResponse +DeleteApplicationFromEnvironmentRequest +DeleteApplicationInput +DeleteApplicationInputProcessingConfigurationRequest +DeleteApplicationInputProcessingConfigurationResponse +DeleteApplicationMessage +DeleteApplicationOutputRequest +DeleteApplicationOutputResponse +DeleteApplicationReferenceDataSourceRequest +DeleteApplicationReferenceDataSourceResponse +DeleteApplicationRequest +DeleteApplicationResponse +DeleteApplicationSnapshotRequest +DeleteApplicationVersionMessage +DeleteApplicationVpcConfigurationRequest +DeleteApplicationVpcConfigurationResponse +DeleteApplicationsRequest +DeleteApprovalRuleTemplateInput +DeleteApprovalRuleTemplateOutput +DeleteAppsListRequest +DeleteArchiveInput +DeleteArchiveRequest +DeleteArchiveRuleRequest +DeleteArguments +DeleteArtifactRequest +DeleteArtifactResponse +DeleteAssessmentFrameworkRequest +DeleteAssessmentFrameworkShareRequest +DeleteAssessmentReportRequest +DeleteAssessmentRequest +DeleteAssessmentRunRequest +DeleteAssessmentTargetRequest +DeleteAssessmentTemplateRequest +DeleteAssetModelRequest +DeleteAssetModelResponse +DeleteAssetRequest +DeleteAssetResponse +DeleteAssistantAssociationRequest +DeleteAssistantRequest +DeleteAssociatedConditionalForwarder +DeleteAssociationRequest +DeleteAssociationResponse +DeleteAt +DeleteAttachmentRequest +DeleteAttachmentResponse +DeleteAttendeeRequest +DeleteAttributeGroupRequest +DeleteAttributeGroupResponse +DeleteAttributesRequest +DeleteAttributesResponse +DeleteAuditSuppressionRequest +DeleteAuthPolicyRequest +DeleteAuthenticationProfileMessage +DeleteAuthenticationProfileResult +DeleteAuthorizerRequest +DeleteAutoScalingConfigurationRequest +DeleteAutoScalingConfigurationResponse +DeleteAutoScalingGroupType +DeleteAutoSnapshotRequest +DeleteAutoSnapshotResult +DeleteAutomatedBackups +DeleteAutomaticTapeCreationPolicyInput +DeleteAutomaticTapeCreationPolicyOutput +DeleteAvailabilityConfigurationRequest +DeleteAwsLogSourceRequest +DeleteAwsLogSourceResponse +DeleteBGPPeerRequest +DeleteBGPPeerResponse +DeleteBackendAPIRequest +DeleteBackendAPIResponse +DeleteBackendAuthRequest +DeleteBackendAuthResponse +DeleteBackendEnvironmentRequest +DeleteBackendEnvironmentResult +DeleteBackendRequest +DeleteBackendResponse +DeleteBackendStorageRequest +DeleteBackendStorageResponse +DeleteBackupInput +DeleteBackupOutput +DeleteBackupPlanInput +DeleteBackupPlanOutput +DeleteBackupRequest +DeleteBackupResponse +DeleteBackupSelectionInput +DeleteBackupVaultAccessPolicyInput +DeleteBackupVaultInput +DeleteBackupVaultLockConfigurationInput +DeleteBackupVaultNotificationsInput +DeleteBaiduChannelRequest +DeleteBaiduChannelResponse +DeleteBandwidthRateLimitInput +DeleteBandwidthRateLimitOutput +DeleteBasePathMappingRequest +DeleteBatchImportJobRequest +DeleteBatchPredictionInput +DeleteBatchPredictionJobRequest +DeleteBatchPredictionOutput +DeleteBehavior +DeleteBillingGroupInput +DeleteBillingGroupOutput +DeleteBillingGroupRequest +DeleteBlueGreenDeploymentRequest +DeleteBlueGreenDeploymentResponse +DeleteBlueprintRequest +DeleteBlueprintResponse +DeleteBotAliasRequest +DeleteBotAliasResponse +DeleteBotChannelAssociationRequest +DeleteBotLocaleRequest +DeleteBotLocaleResponse +DeleteBotRequest +DeleteBotResponse +DeleteBotVersionRequest +DeleteBotVersionResponse +DeleteBranchInput +DeleteBranchOutput +DeleteBranchRequest +DeleteBranchResult +DeleteBridgeRequest +DeleteBridgeResponse +DeleteBrokerRequest +DeleteBrokerResponse +DeleteBrowserSettingsRequest +DeleteBucketAccessKeyRequest +DeleteBucketAccessKeyResult +DeleteBucketAnalyticsConfigurationRequest +DeleteBucketCorsRequest +DeleteBucketEncryptionRequest +DeleteBucketIntelligentTieringConfigurationRequest +DeleteBucketInventoryConfigurationRequest +DeleteBucketLifecycleConfigurationRequest +DeleteBucketLifecycleRequest +DeleteBucketMetricsConfigurationRequest +DeleteBucketOwnershipControlsRequest +DeleteBucketPolicyRequest +DeleteBucketReplicationRequest +DeleteBucketRequest +DeleteBucketResult +DeleteBucketTaggingRequest +DeleteBucketWebsiteRequest +DeleteBudgetActionRequest +DeleteBudgetActionResponse +DeleteBudgetRequest +DeleteBuildBatchInput +DeleteBuildBatchOutput +DeleteBuildInput +DeleteBusinessReportScheduleRequest +DeleteByteMatchSetRequest +DeleteByteMatchSetResponse +DeleteCACertificateRequest +DeleteCacheClusterMessage +DeleteCacheClusterResult +DeleteCacheParameterGroupMessage +DeleteCachePolicyRequest +DeleteCacheSecurityGroupMessage +DeleteCacheSubnetGroupMessage +DeleteCalculatedAttributeDefinitionRequest +DeleteCallAnalyticsCategoryRequest +DeleteCallAnalyticsJobRequest +DeleteCampaignRequest +DeleteCampaignResponse +DeleteCanaryRequest +DeleteCapacityProviderRequest +DeleteCapacityProviderResponse +DeleteCapacityReservationInput +DeleteCarrierGatewayRequest +DeleteCarrierGatewayResult +DeleteCellRequest +DeleteCertificateAuthorityRequest +DeleteCertificateMessage +DeleteCertificateRequest +DeleteCertificateResponse +DeleteCertificateResult +DeleteChangeSetInput +DeleteChannelBanRequest +DeleteChannelFlowRequest +DeleteChannelGroupRequest +DeleteChannelMembershipRequest +DeleteChannelMessageRequest +DeleteChannelModeratorRequest +DeleteChannelPolicyRequest +DeleteChannelRequest +DeleteChannelResponse +DeleteChapCredentialsInput +DeleteChapCredentialsOutput +DeleteCidrCollectionRequest +DeleteClassifierRequest +DeleteClientBrandingRequest +DeleteClientCertificateRequest +DeleteClientVpnEndpointRequest +DeleteClientVpnEndpointResult +DeleteClientVpnRouteRequest +DeleteClientVpnRouteResult +DeleteClonedVolumes +DeleteCloudFrontOriginAccessIdentityRequest +DeleteClusterInput +DeleteClusterMessage +DeleteClusterOutput +DeleteClusterParameterGroupMessage +DeleteClusterPolicyRequest +DeleteClusterRequest +DeleteClusterResponse +DeleteClusterResult +DeleteClusterSecurityGroupMessage +DeleteClusterSnapshotInput +DeleteClusterSnapshotMessage +DeleteClusterSnapshotOutput +DeleteClusterSnapshotResult +DeleteClusterSubnetGroupMessage +DeleteCodeRepositoryInput +DeleteCodeSigningConfigRequest +DeleteCoipCidrRequest +DeleteCoipCidrResult +DeleteCoipPoolRequest +DeleteCoipPoolResult +DeleteCollaborationInput +DeleteCollectionDetail +DeleteCollectionRequest +DeleteCollectionResponse +DeleteCollectorRequest +DeleteColumnStatisticsForPartitionRequest +DeleteColumnStatisticsForTableRequest +DeleteCommentContentInput +DeleteCommentContentOutput +DeleteCommentRequest +DeleteComponentInput +DeleteComponentOutput +DeleteComponentRequest +DeleteComponentResponse +DeleteComponentTypeRequest +DeleteComponentTypeResponse +DeleteComputeEnvironmentRequest +DeleteConditionalForwarderRequest +DeleteConferenceProviderRequest +DeleteConfigRequest +DeleteConfigRuleRequest +DeleteConfigurationAggregatorRequest +DeleteConfigurationProfileRequest +DeleteConfigurationRecorderRequest +DeleteConfigurationRequest +DeleteConfigurationResponse +DeleteConfigurationSetEventDestinationRequest +DeleteConfigurationSetRequest +DeleteConfigurationSetResult +DeleteConfigurationSetTrackingOptionsRequest +DeleteConfigurationTemplateMessage +DeleteConfiguredTableAnalysisRuleInput +DeleteConfiguredTableAssociationInput +DeleteConfiguredTableInput +DeleteConflictException +DeleteConformancePackRequest +DeleteConnectClientAddInRequest +DeleteConnectInstanceConfigRequest +DeleteConnectPeerRequest +DeleteConnectPeerResponse +DeleteConnectionAliasRequest +DeleteConnectionInput +DeleteConnectionMessage +DeleteConnectionRequest +DeleteConnectionResponse +DeleteConnectorDefinitionRequest +DeleteConnectorProfileRequest +DeleteConnectorRequest +DeleteConnectorResponse +DeleteConstraintInput +DeleteContactChannelRequest +DeleteContactEvaluationRequest +DeleteContactFlowModuleRequest +DeleteContactFlowRequest +DeleteContactListRequest +DeleteContactMethodRequest +DeleteContactMethodResult +DeleteContactRequest +DeleteContainerImageRequest +DeleteContainerInput +DeleteContainerPolicyInput +DeleteContainerRecipeRequest +DeleteContainerRecipeResponse +DeleteContainerServiceRequest +DeleteContentRequest +DeleteContextRequest +DeleteContextResponse +DeleteContinuousDeploymentPolicyRequest +DeleteControlPanelRequest +DeleteControlRequest +DeleteCoreDefinitionRequest +DeleteCoreDeviceRequest +DeleteCoreNetworkPolicyVersionRequest +DeleteCoreNetworkPolicyVersionResponse +DeleteCoreNetworkRequest +DeleteCoreNetworkResponse +DeleteCorsConfigurationRequest +DeleteCorsPolicyInput +DeleteCostCategoryDefinitionRequest +DeleteCostCategoryDefinitionResponse +DeleteCrawlerRequest +DeleteCrossAccountAuthorizationRequest +DeleteCustomActionTypeInput +DeleteCustomDBEngineVersionMessage +DeleteCustomDataIdentifierRequest +DeleteCustomDomainAssociationMessage +DeleteCustomEntityTypeRequest +DeleteCustomEntityTypeResponse +DeleteCustomKeyStoreRequest +DeleteCustomLineItemInput +DeleteCustomLineItemOutput +DeleteCustomLogSourceRequest +DeleteCustomMetadataRequest +DeleteCustomMetricRequest +DeleteCustomModelRequest +DeleteCustomPluginRequest +DeleteCustomPluginResponse +DeleteCustomRoutingAcceleratorRequest +DeleteCustomRoutingEndpointGroupRequest +DeleteCustomRoutingListenerRequest +DeleteCustomVerificationEmailTemplateRequest +DeleteCustomVocabularyRequest +DeleteCustomVocabularyResponse +DeleteCustomerGatewayRequest +DeleteDBClusterAutomatedBackupMessage +DeleteDBClusterAutomatedBackupResult +DeleteDBClusterEndpointMessage +DeleteDBClusterEndpointOutput +DeleteDBClusterMessage +DeleteDBClusterParameterGroupMessage +DeleteDBClusterResult +DeleteDBClusterSnapshotMessage +DeleteDBClusterSnapshotResult +DeleteDBInstanceAutomatedBackupMessage +DeleteDBInstanceAutomatedBackupResult +DeleteDBInstanceMessage +DeleteDBInstanceResult +DeleteDBParameterGroupMessage +DeleteDBProxyEndpointRequest +DeleteDBProxyEndpointResponse +DeleteDBProxyRequest +DeleteDBProxyResponse +DeleteDBSecurityGroupMessage +DeleteDBSnapshotMessage +DeleteDBSnapshotResult +DeleteDBSubnetGroupMessage +DeleteDashboardRequest +DeleteDashboardResponse +DeleteDashboardsInput +DeleteDataCatalogInput +DeleteDataCellsFilterRequest +DeleteDataInFileSystem +DeleteDataIntegrationRequest +DeleteDataLakeOrganizationConfigurationRequest +DeleteDataLakeRequest +DeleteDataProtectionPolicyRequest +DeleteDataProviderMessage +DeleteDataProviderResponse +DeleteDataQualityJobDefinitionRequest +DeleteDataQualityRulesetRequest +DeleteDataRepositoryAssociationRequest +DeleteDataRepositoryAssociationResponse +DeleteDataSetRefreshPropertiesRequest +DeleteDataSetRefreshPropertiesResponse +DeleteDataSetRequest +DeleteDataSetResponse +DeleteDataSourceInput +DeleteDataSourceOutput +DeleteDataSourceRequest +DeleteDataSourceResponse +DeleteDatabaseRequest +DeleteDataflowEndpointGroupRequest +DeleteDatasetContentRequest +DeleteDatasetGroupRequest +DeleteDatasetImportJobRequest +DeleteDatasetRequest +DeleteDatasetResponse +DeleteDatastoreRequest +DeleteDatastoreResponse +DeleteDecoderManifestRequest +DeleteDecoderManifestResponse +DeleteDedicatedIpPoolRequest +DeleteDefaultMessageTypeRequest +DeleteDefaultMessageTypeResult +DeleteDefaultSenderIdRequest +DeleteDefaultSenderIdResult +DeleteDeliveryChannelRequest +DeleteDeliveryStreamInput +DeleteDeploymentConfigInput +DeleteDeploymentGroupInput +DeleteDeploymentGroupOutput +DeleteDeploymentInput +DeleteDeploymentOutput +DeleteDeploymentRequest +DeleteDeploymentStrategyRequest +DeleteDestinationRequest +DeleteDetectorModelRequest +DeleteDetectorRequest +DeleteDetectorVersionRequest +DeleteDevEndpointRequest +DeleteDevEnvironmentRequest +DeleteDevEnvironmentResponse +DeleteDeviceDefinitionRequest +DeleteDeviceFleetRequest +DeleteDevicePoolRequest +DeleteDeviceProfileRequest +DeleteDeviceRequest +DeleteDeviceResponse +DeleteDeviceUsageDataRequest +DeleteDhcpOptionsRequest +DeleteDimensionRequest +DeleteDirectConnectGatewayAssociationProposalRequest +DeleteDirectConnectGatewayAssociationProposalResult +DeleteDirectConnectGatewayAssociationRequest +DeleteDirectConnectGatewayAssociationResult +DeleteDirectConnectGatewayRequest +DeleteDirectConnectGatewayResult +DeleteDirectory +DeleteDirectoryConfigRequest +DeleteDirectoryRegistrationRequest +DeleteDirectoryRequest +DeleteDirectoryResponse +DeleteDirectoryResult +DeleteDiscovererRequest +DeleteDiskRequest +DeleteDiskResult +DeleteDiskSnapshotRequest +DeleteDiskSnapshotResult +DeleteDistributionConfigurationRequest +DeleteDistributionConfigurationResponse +DeleteDistributionRequest +DeleteDistributionResult +DeleteDocumentClassifierRequest +DeleteDocumentRequest +DeleteDocumentVersionRequest +DeleteDocumentationPartRequest +DeleteDocumentationVersionRequest +DeleteDomainAssociationRequest +DeleteDomainAssociationResult +DeleteDomainConfigurationRequest +DeleteDomainEntryRequest +DeleteDomainEntryResult +DeleteDomainNameRequest +DeleteDomainPermissionsPolicyRequest +DeleteDomainPermissionsPolicyResult +DeleteDomainRequest +DeleteDomainResponse +DeleteDomainResult +DeleteDynamicThingGroupRequest +DeleteEarthObservationJobInput +DeleteEdgeConfigurationInput +DeleteEdgeDeploymentPlanRequest +DeleteEdgeDeploymentStageRequest +DeleteEgressOnlyInternetGatewayRequest +DeleteEgressOnlyInternetGatewayResult +DeleteElasticIp +DeleteElasticsearchDomainRequest +DeleteElasticsearchDomainResponse +DeleteEmailChannelRequest +DeleteEmailChannelResponse +DeleteEmailIdentityPolicyRequest +DeleteEmailIdentityRequest +DeleteEmailMonitoringConfigurationRequest +DeleteEmailTemplateRequest +DeleteEmailTemplateResponse +DeleteEndpointAccessMessage +DeleteEndpointAccessRequest +DeleteEndpointAccessResponse +DeleteEndpointConfigInput +DeleteEndpointGroupRequest +DeleteEndpointInput +DeleteEndpointMessage +DeleteEndpointRequest +DeleteEndpointResponse +DeleteEntitlementRequest +DeleteEntityRecognizerRequest +DeleteEntityRequest +DeleteEntityResponse +DeleteEntityTypeRequest +DeleteEnvironmentAccountConnectionInput +DeleteEnvironmentAccountConnectionOutput +DeleteEnvironmentConfigurationMessage +DeleteEnvironmentInput +DeleteEnvironmentMembershipRequest +DeleteEnvironmentOutput +DeleteEnvironmentRequest +DeleteEnvironmentResponse +DeleteEnvironmentTemplateInput +DeleteEnvironmentTemplateOutput +DeleteEnvironmentTemplateVersionInput +DeleteEnvironmentTemplateVersionOutput +DeleteEphemerisRequest +DeleteEvaluationFormRequest +DeleteEvaluationInput +DeleteEvaluationOutput +DeleteEvaluationResultsRequest +DeleteEventActionRequest +DeleteEventBusRequest +DeleteEventDataStoreRequest +DeleteEventDestinationRequest +DeleteEventDestinationResult +DeleteEventIntegrationRequest +DeleteEventRequest +DeleteEventSourceMappingRequest +DeleteEventStreamRequest +DeleteEventStreamResponse +DeleteEventSubscriptionMessage +DeleteEventSubscriptionResponse +DeleteEventSubscriptionResult +DeleteEventTrackerRequest +DeleteEventTypeRequest +DeleteEventsByEventTypeRequest +DeleteEventsByEventTypeResult +DeleteEventsConfigurationRequest +DeleteExperienceRequest +DeleteExperimentRequest +DeleteExperimentResponse +DeleteExperimentTemplateRequest +DeleteExperimentTemplateResponse +DeleteExplainabilityExportRequest +DeleteExplainabilityRequest +DeleteExportRequest +DeleteExportResponse +DeleteExpressionRequest +DeleteExpressionResponse +DeleteExtensionAssociationRequest +DeleteExtensionRequest +DeleteExternalModelRequest +DeleteFHIRDatastoreRequest +DeleteFHIRDatastoreResponse +DeleteFacesRequest +DeleteFacesResponse +DeleteFacetRequest +DeleteFaqRequest +DeleteFargateProfileRequest +DeleteFargateProfileResponse +DeleteFeatureGroupRequest +DeleteFeatureRequest +DeleteFieldLevelEncryptionConfigRequest +DeleteFieldLevelEncryptionProfileRequest +DeleteFileCacheRequest +DeleteFileCacheResponse +DeleteFileEntry +DeleteFileInput +DeleteFileOutput +DeleteFileShareInput +DeleteFileShareOutput +DeleteFileSystemLustreConfiguration +DeleteFileSystemLustreResponse +DeleteFileSystemOpenZFSConfiguration +DeleteFileSystemOpenZFSResponse +DeleteFileSystemPolicyRequest +DeleteFileSystemRequest +DeleteFileSystemResponse +DeleteFileSystemWindowsConfiguration +DeleteFileSystemWindowsResponse +DeleteFilterRequest +DeleteFilterResponse +DeleteFindingAggregatorRequest +DeleteFindingsFilterRequest +DeleteFirewallDomainListRequest +DeleteFirewallDomainListResponse +DeleteFirewallManagerRuleGroupsRequest +DeleteFirewallManagerRuleGroupsResponse +DeleteFirewallPolicyRequest +DeleteFirewallPolicyResponse +DeleteFirewallRequest +DeleteFirewallResponse +DeleteFirewallRuleGroupRequest +DeleteFirewallRuleGroupResponse +DeleteFirewallRuleRequest +DeleteFirewallRuleResponse +DeleteFleetAdvisorDatabasesRequest +DeleteFleetAdvisorDatabasesResponse +DeleteFleetError +DeleteFleetErrorItem +DeleteFleetInput +DeleteFleetLocationsInput +DeleteFleetLocationsOutput +DeleteFleetMetricRequest +DeleteFleetRequest +DeleteFleetResponse +DeleteFleetSuccessItem +DeleteFleetsRequest +DeleteFleetsResult +DeleteFlowDefinitionRequest +DeleteFlowLogsRequest +DeleteFlowLogsResult +DeleteFlowRequest +DeleteFlowResponse +DeleteFlowTemplateRequest +DeleteFlywheelRequest +DeleteFolderContentsRequest +DeleteFolderMembershipRequest +DeleteFolderMembershipResponse +DeleteFolderRequest +DeleteFolderResponse +DeleteForecastExportJobRequest +DeleteForecastRequest +DeleteFormRequest +DeleteFpgaImageRequest +DeleteFpgaImageResult +DeleteFrameworkInput +DeleteFraudsterRequest +DeleteFunctionCodeSigningConfigRequest +DeleteFunctionConcurrencyRequest +DeleteFunctionDefinitionRequest +DeleteFunctionEventInvokeConfigRequest +DeleteFunctionRequest +DeleteFunctionUrlConfigRequest +DeleteFuotaTaskRequest +DeleteGameRequest +DeleteGameServerGroupInput +DeleteGameServerGroupOutput +DeleteGameSessionQueueInput +DeleteGatewayGroupRequest +DeleteGatewayInput +DeleteGatewayOutput +DeleteGatewayRequest +DeleteGatewayResponse +DeleteGatewayResponseRequest +DeleteGatewayRouteInput +DeleteGatewayRouteOutput +DeleteGcmChannelRequest +DeleteGcmChannelResponse +DeleteGeoMatchSetRequest +DeleteGeoMatchSetResponse +DeleteGeofenceCollectionRequest +DeleteGitHubAccountTokenInput +DeleteGitHubAccountTokenOutput +DeleteGlobalClusterMessage +DeleteGlobalClusterResult +DeleteGlobalNetworkRequest +DeleteGlobalNetworkResponse +DeleteGlobalReplicationGroupMessage +DeleteGlobalReplicationGroupResult +DeleteGlobalSecondaryIndexAction +DeleteGrantRequest +DeleteGrantResponse +DeleteGraphRequest +DeleteGraphqlApiRequest +DeleteGroupInput +DeleteGroupMembershipRequest +DeleteGroupMembershipResponse +DeleteGroupOutput +DeleteGroupPolicyRequest +DeleteGroupRequest +DeleteGroupResponse +DeleteHITRequest +DeleteHapgRequest +DeleteHapgResponse +DeleteHealthCheckRequest +DeleteHostInput +DeleteHostKeyRequest +DeleteHostedConfigurationVersionRequest +DeleteHostedZoneRequest +DeleteHostedZoneResponse +DeleteHoursOfOperationRequest +DeleteHsmClientCertificateMessage +DeleteHsmConfigurationMessage +DeleteHsmRequest +DeleteHsmResponse +DeleteHubContentRequest +DeleteHubRequest +DeleteHumanLoopRequest +DeleteHumanTaskUiRequest +DeleteHypervisorInput +DeleteHypervisorOutput +DeleteIAMPolicyAssignmentRequest +DeleteIAMPolicyAssignmentResponse +DeleteIPSetRequest +DeleteIPSetResponse +DeleteIdentitiesInput +DeleteIdentitiesResponse +DeleteIdentityPolicyRequest +DeleteIdentityPoolInput +DeleteIdentityProviderRequest +DeleteIdentityRequest +DeleteIdentitySourceInput +DeleteImageBuilderRequest +DeleteImageBuilderResult +DeleteImagePermissionsRequest +DeleteImagePipelineRequest +DeleteImagePipelineResponse +DeleteImageRecipeRequest +DeleteImageRecipeResponse +DeleteImageRequest +DeleteImageResponse +DeleteImageResult +DeleteImageSetRequest +DeleteImageSetResponse +DeleteImageVersionRequest +DeleteImpersonationRoleRequest +DeleteImportRequest +DeleteImportResponse +DeleteImportedKeyMaterialRequest +DeleteInAppTemplateRequest +DeleteInAppTemplateResponse +DeleteInboundConnectionRequest +DeleteInboundConnectionResponse +DeleteInboundCrossClusterSearchConnectionRequest +DeleteInboundCrossClusterSearchConnectionResponse +DeleteIncidentRecordInput +DeleteIndexFieldRequest +DeleteIndexFieldResponse +DeleteIndexInput +DeleteIndexOutput +DeleteIndexRequest +DeleteInferenceExperimentRequest +DeleteInferenceExperimentResponse +DeleteInferenceSchedulerRequest +DeleteInfrastructureConfigurationRequest +DeleteInfrastructureConfigurationResponse +DeleteIngestionDestinationRequest +DeleteIngestionRequest +DeleteInlinePolicyFromPermissionSetRequest +DeleteInputRequest +DeleteInputSecurityGroupRequest +DeleteInsightRequest +DeleteInsightResponse +DeleteInsightRulesInput +DeleteInsightRulesOutput +DeleteInstanceAccessControlAttributeConfigurationRequest +DeleteInstanceConnectEndpointRequest +DeleteInstanceConnectEndpointResult +DeleteInstanceEventWindowRequest +DeleteInstanceEventWindowResult +DeleteInstanceOnboardingJobRequest +DeleteInstanceProfileMessage +DeleteInstanceProfileRequest +DeleteInstanceProfileResponse +DeleteInstanceRequest +DeleteInstanceResult +DeleteInstanceSnapshotRequest +DeleteInstanceSnapshotResult +DeleteIntegrationAssociationRequest +DeleteIntegrationRequest +DeleteIntegrationResponse +DeleteIntegrationResponseRequest +DeleteIntentRequest +DeleteIntentVersionRequest +DeleteInterconnectRequest +DeleteInterconnectResponse +DeleteIntermediateSnaphots +DeleteInternetGatewayRequest +DeleteInventoryRequest +DeleteInventoryResult +DeleteInvitationsRequest +DeleteInvitationsResponse +DeleteIpAccessSettingsRequest +DeleteIpGroupRequest +DeleteIpamPoolRequest +DeleteIpamPoolResult +DeleteIpamRequest +DeleteIpamResourceDiscoveryRequest +DeleteIpamResourceDiscoveryResult +DeleteIpamResult +DeleteIpamScopeRequest +DeleteIpamScopeResult +DeleteItemInput +DeleteItemOutput +DeleteJobExecutionRequest +DeleteJobQueueRequest +DeleteJobRequest +DeleteJobResponse +DeleteJobResult +DeleteJobTaggingRequest +DeleteJobTemplateRequest +DeleteJobTemplateResponse +DeleteJourneyRequest +DeleteJourneyResponse +DeleteKeyGroupRequest +DeleteKeyInDays +DeleteKeyInput +DeleteKeyOutput +DeleteKeyPairRequest +DeleteKeyPairResult +DeleteKeyRequest +DeleteKeySigningKeyRequest +DeleteKeySigningKeyResponse +DeleteKeyspaceRequest +DeleteKeywordRequest +DeleteKeywordResult +DeleteKnowledgeBaseRequest +DeleteKnownHostKeysRequest +DeleteKnownHostKeysResult +DeleteKxClusterRequest +DeleteKxDatabaseRequest +DeleteKxEnvironmentRequest +DeleteKxUserRequest +DeleteLFTagRequest +DeleteLabelGroupRequest +DeleteLabelRequest +DeleteLabelsRequest +DeleteLagRequest +DeleteLakeFormationOptInRequest +DeleteLambda +DeleteLanguageModelRequest +DeleteLaunchActionRequest +DeleteLaunchConfigurationTemplateRequest +DeleteLaunchProfileMemberRequest +DeleteLaunchProfileRequest +DeleteLaunchProfileResponse +DeleteLaunchRequest +DeleteLaunchTemplateRequest +DeleteLaunchTemplateResult +DeleteLaunchTemplateVersionsRequest +DeleteLaunchTemplateVersionsResponseErrorItem +DeleteLaunchTemplateVersionsResponseSuccessItem +DeleteLaunchTemplateVersionsResult +DeleteLayerRequest +DeleteLayerVersionRequest +DeleteLedgerRequest +DeleteLensInput +DeleteLensShareInput +DeleteLexiconInput +DeleteLicenseConfigurationRequest +DeleteLicenseManagerReportGeneratorRequest +DeleteLicenseRequest +DeleteLicenseResponse +DeleteLifecycleHookType +DeleteLifecyclePolicyInput +DeleteLifecyclePolicyRequest +DeleteLifecyclePolicyResponse +DeleteLinkInput +DeleteLinkRequest +DeleteLinkResponse +DeleteListRequest +DeleteListenerInput +DeleteListenerRequest +DeleteLiveSourceRequest +DeleteLoadBalancerInput +DeleteLoadBalancerListenerInput +DeleteLoadBalancerPolicyInput +DeleteLoadBalancerRequest +DeleteLoadBalancerResult +DeleteLoadBalancerTlsCertificateRequest +DeleteLoadBalancerTlsCertificateResult +DeleteLocalGatewayRouteRequest +DeleteLocalGatewayRouteResult +DeleteLocalGatewayRouteTableRequest +DeleteLocalGatewayRouteTableResult +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult +DeleteLocalGatewayRouteTableVpcAssociationRequest +DeleteLocalGatewayRouteTableVpcAssociationResult +DeleteLocationInput +DeleteLocationRequest +DeleteLogGroupRequest +DeleteLogPatternRequest +DeleteLogStreamRequest +DeleteLogSubscriptionRequest +DeleteLoggerDefinitionRequest +DeleteLoggingConfigurationRequest +DeleteLoginProfileRequest +DeleteLunaClientRequest +DeleteLunaClientResponse +DeleteMLEndpointInput +DeleteMLEndpointOutput +DeleteMLModelInput +DeleteMLModelOutput +DeleteMLTransformRequest +DeleteMLTransformResponse +DeleteMailboxPermissionsRequest +DeleteMaintenanceWindowRequest +DeleteMaintenanceWindowResult +DeleteManagedEndpointRequest +DeleteManagedEndpointResponse +DeleteManagedPrefixListRequest +DeleteManagedPrefixListResult +DeleteMapRequest +DeleteMarker +DeleteMarkerEntry +DeleteMarkerReplication +DeleteMarkerVersionId +DeleteMarkers +DeleteMatchingWorkflowInput +DeleteMatchingWorkflowOutput +DeleteMatchmakingConfigurationInput +DeleteMatchmakingRuleSetInput +DeleteMediaCapturePipelineRequest +DeleteMediaInsightsPipelineConfigurationRequest +DeleteMediaPipelineKinesisVideoStreamPoolRequest +DeleteMediaPipelineRequest +DeleteMedicalTranscriptionJobRequest +DeleteMedicalVocabularyRequest +DeleteMeetingRequest +DeleteMemberInput +DeleteMemberRequest +DeleteMembersRequest +DeleteMembersResponse +DeleteMembershipInput +DeleteMeshInput +DeleteMeshOutput +DeleteMessageBatchRequest +DeleteMessageBatchRequestEntry +DeleteMessageBatchResult +DeleteMessageBatchResultEntry +DeleteMessageRequest +DeleteMessageResponse +DeleteMessagingStreamingConfigurationsRequest +DeleteMethodRequest +DeleteMethodResponseRequest +DeleteMetricAttributionRequest +DeleteMetricFilterRequest +DeleteMetricPolicyInput +DeleteMetricStreamInput +DeleteMigrationProjectMessage +DeleteMigrationProjectResponse +DeleteMigrationWorkflowRequest +DeleteMigrationWorkflowResponse +DeleteMissionProfileRequest +DeleteMitigationActionRequest +DeleteMobileDeviceAccessOverrideRequest +DeleteMobileDeviceAccessRuleRequest +DeleteModelBiasJobDefinitionRequest +DeleteModelCardRequest +DeleteModelExplainabilityJobDefinitionRequest +DeleteModelInput +DeleteModelManifestRequest +DeleteModelManifestResponse +DeleteModelPackageGroupInput +DeleteModelPackageGroupPolicyInput +DeleteModelPackageInput +DeleteModelQualityJobDefinitionRequest +DeleteModelRequest +DeleteModelResponse +DeleteModelVersionRequest +DeleteMonitorInput +DeleteMonitorRequest +DeleteMonitoringScheduleRequest +DeleteMonitoringSubscriptionRequest +DeleteMountTargetRequest +DeleteMultiRegionAccessPointInput +DeleteMultiRegionAccessPointRequest +DeleteMultiRegionAccessPointResult +DeleteMulticastGroupRequest +DeleteMultiplexProgramRequest +DeleteMultiplexProgramResponse +DeleteMultiplexRequest +DeleteMultiplexResponse +DeleteNamedQueryInput +DeleteNamespaceRequest +DeleteNamespaceResponse +DeleteNatGatewayRequest +DeleteNatGatewayResult +DeleteNetworkAclEntryRequest +DeleteNetworkAclRequest +DeleteNetworkAnalyzerConfigurationRequest +DeleteNetworkInsightsAccessScopeAnalysisRequest +DeleteNetworkInsightsAccessScopeAnalysisResult +DeleteNetworkInsightsAccessScopeRequest +DeleteNetworkInsightsAccessScopeResult +DeleteNetworkInsightsAnalysisRequest +DeleteNetworkInsightsAnalysisResult +DeleteNetworkInsightsPathRequest +DeleteNetworkInsightsPathResult +DeleteNetworkInterfacePermissionRequest +DeleteNetworkInterfacePermissionResult +DeleteNetworkInterfaceRequest +DeleteNetworkProfileRequest +DeleteNetworkRequest +DeleteNetworkResponse +DeleteNetworkSettingsRequest +DeleteNetworkSiteRequest +DeleteNetworkSiteResponse +DeleteNodeInput +DeleteNodegroupRequest +DeleteNodegroupResponse +DeleteNotebookInput +DeleteNotebookInstanceInput +DeleteNotebookInstanceLifecycleConfigInput +DeleteNotificationConfigurationType +DeleteNotificationRequest +DeleteNotificationRuleRequest +DeleteNotificationRuleResult +DeleteNotificationSubscriptionRequest +DeleteOTAUpdateRequest +DeleteObject +DeleteObjectInput +DeleteObjectOutput +DeleteObjectRequest +DeleteObjectTaggingOutput +DeleteObjectTaggingRequest +DeleteObjectsOnCancelRequest +DeleteObjectsOutput +DeleteObjectsRequest +DeleteObservabilityConfigurationRequest +DeleteObservabilityConfigurationResponse +DeleteOnTermination +DeleteOpenIDConnectProviderRequest +DeleteOpsMetadataRequest +DeleteOptOutListRequest +DeleteOptOutListResult +DeleteOptedOutNumberRequest +DeleteOptedOutNumberResult +DeleteOption +DeleteOptionGroupMessage +DeleteOrganizationConfigRuleRequest +DeleteOrganizationConformancePackRequest +DeleteOrganizationRequest +DeleteOrganizationResponse +DeleteOrganizationalUnitRequest +DeleteOriginAccessControlRequest +DeleteOriginEndpointPolicyRequest +DeleteOriginEndpointRequest +DeleteOriginRequestPolicyRequest +DeleteOutboundConnectionRequest +DeleteOutboundConnectionResponse +DeleteOutboundCrossClusterSearchConnectionRequest +DeleteOutboundCrossClusterSearchConnectionResponse +DeleteOutcomeRequest +DeleteOutpostInput +DeleteOutpostResolverRequest +DeleteOutpostResolverResponse +DeletePackageRequest +DeletePackageResponse +DeletePackageResult +DeletePackageVersionRequest +DeletePackageVersionsRequest +DeletePackageVersionsResult +DeletePackagingConfigurationRequest +DeletePackagingGroupRequest +DeleteParallelDataRequest +DeleteParallelDataResponse +DeleteParameterGroupRequest +DeleteParameterGroupResponse +DeleteParameterRequest +DeleteParametersRequest +DeleteParametersResult +DeletePartitionIndexRequest +DeletePartitionRequest +DeletePartnerEventSourceRequest +DeletePatchBaselineRequest +DeletePatchBaselineResult +DeletePeeringRequest +DeletePeeringResponse +DeletePendingAggregationRequestRequest +DeletePendingTimestamp +DeletePerformanceAnalysisReportRequest +DeletePermissionGroupRequest +DeletePermissionGroupResponse +DeletePermissionPolicyRequest +DeletePermissionRequest +DeletePermissionResponse +DeletePermissionSetRequest +DeletePermissionVersionRequest +DeletePermissionVersionResponse +DeletePermissionsBoundaryFromPermissionSetRequest +DeletePhoneNumberRequest +DeletePipeRequest +DeletePipeResponse +DeletePipelineInput +DeletePipelineRequest +DeletePipelineResponse +DeletePlaceIndexRequest +DeletePlacementGroupRequest +DeletePlacementRequest +DeletePlatformApplicationInput +DeletePlatformVersionRequest +DeletePlatformVersionResult +DeletePlaybackConfigurationRequest +DeletePlaybackKeyPairRequest +DeletePolicyInput +DeletePolicyRequest +DeletePolicyStoreInput +DeletePolicyTemplateInput +DeletePolicyType +DeletePolicyVersionRequest +DeletePoolRequest +DeletePoolResult +DeletePortalRequest +DeletePortalResponse +DeletePortfolioInput +DeletePortfolioShareInput +DeletePortfolioShareOutput +DeletePredictorBacktestExportJobRequest +DeletePredictorRequest +DeletePrefetchScheduleRequest +DeletePreparedStatementInput +DeletePresetRequest +DeletePricingPlanInput +DeletePricingPlanOutput +DeletePricingRuleInput +DeletePricingRuleOutput +DeletePrincipalMappingRequest +DeletePriorVersions +DeleteProductInput +DeleteProfileInput +DeleteProfileKeyRequest +DeleteProfileKeyResponse +DeleteProfileObjectRequest +DeleteProfileObjectResponse +DeleteProfileObjectTypeRequest +DeleteProfileObjectTypeResponse +DeleteProfileRequest +DeleteProfileResponse +DeleteProfileShareInput +DeleteProfilingGroupRequest +DeleteProgramRequest +DeleteProgressUpdateStreamRequest +DeleteProjectInput +DeleteProjectPolicyRequest +DeleteProjectRequest +DeleteProjectResponse +DeleteProjectResult +DeleteProjectVersionRequest +DeleteProjectVersionResponse +DeletePromptRequest +DeleteProperties +DeletePropertygraphStatisticsOutput +DeleteProtection +DeleteProtectionGroupRequest +DeleteProtectionRequest +DeleteProtocolsListRequest +DeleteProvisionedConcurrencyConfigRequest +DeleteProvisionedModelThroughputRequest +DeleteProvisionedProductPlanInput +DeleteProvisioningArtifactInput +DeleteProvisioningTemplateRequest +DeleteProvisioningTemplateVersionRequest +DeleteProxySessionRequest +DeletePublicAccessBlockRequest +DeletePublicIpv4PoolRequest +DeletePublicIpv4PoolResult +DeletePublicKeyRequest +DeletePublicKeys +DeletePublishingDestinationRequest +DeletePullRequestApprovalRuleInput +DeletePullRequestApprovalRuleOutput +DeletePullThroughCacheRuleRequest +DeletePullThroughCacheRuleResponse +DeletePushTemplateRequest +DeletePushTemplateResponse +DeleteQualificationTypeRequest +DeleteQueryDefinitionRequest +DeleteQueryDefinitionResponse +DeleteQueryLoggingConfigRequest +DeleteQuerySuggestionsBlockListRequest +DeleteQueueRequest +DeleteQueuedMessagesRequest +DeleteQueuedReservedInstancesError +DeleteQueuedReservedInstancesRequest +DeleteQueuedReservedInstancesResult +DeleteQueuedSavingsPlanRequest +DeleteQuickConnectRequest +DeleteRate +DeleteRateBasedRuleRequest +DeleteRateBasedRuleResponse +DeleteReadinessCheckRequest +DeleteRealtimeEndpointInput +DeleteRealtimeEndpointOutput +DeleteRealtimeLogConfigRequest +DeleteReceiptFilterRequest +DeleteReceiptRuleRequest +DeleteReceiptRuleSetRequest +DeleteRecipeVersionRequest +DeleteRecipeVersionResponse +DeleteRecommendationPreferencesRequest +DeleteRecommendationTemplateRequest +DeleteRecommendationTemplateResponse +DeleteRecommenderConfigurationRequest +DeleteRecommenderConfigurationResponse +DeleteRecommenderRequest +DeleteRecordRequest +DeleteRecordingConfigurationRequest +DeleteRecoveryGroupRequest +DeleteRecoveryInstanceRequest +DeleteRecoveryPointInput +DeleteReferenceRequest +DeleteReferenceStoreRequest +DeleteRefreshScheduleRequest +DeleteRefreshScheduleResponse +DeleteRegexMatchSetRequest +DeleteRegexMatchSetResponse +DeleteRegexPatternSetRequest +DeleteRegexPatternSetResponse +DeleteRegionAction +DeleteRegistryInput +DeleteRegistryPolicyResponse +DeleteRegistryRequest +DeleteRegistryResponse +DeleteRelationalDatabaseRequest +DeleteRelationalDatabaseResult +DeleteRelationalDatabaseSnapshotRequest +DeleteRelationalDatabaseSnapshotResult +DeleteRemediationConfigurationRequest +DeleteRemediationExceptionsRequest +DeleteRemediationExceptionsResponse +DeleteRemoteAccessSessionRequest +DeleteReplacedRootVolume +DeleteReplicaAction +DeleteReplicationConfigMessage +DeleteReplicationConfigResponse +DeleteReplicationConfigurationRequest +DeleteReplicationConfigurationTemplateRequest +DeleteReplicationGroupMemberAction +DeleteReplicationGroupMessage +DeleteReplicationGroupResult +DeleteReplicationInstanceMessage +DeleteReplicationInstanceResponse +DeleteReplicationJobRequest +DeleteReplicationSetInput +DeleteReplicationSubnetGroupMessage +DeleteReplicationTaskAssessmentRunMessage +DeleteReplicationTaskAssessmentRunResponse +DeleteReplicationTaskMessage +DeleteReplicationTaskResponse +DeleteReportDefinitionRequest +DeleteReportDefinitionResponse +DeleteReportDefinitionResult +DeleteReportGroupInput +DeleteReportInput +DeleteReportPlanInput +DeleteRepositoryInput +DeleteRepositoryOutput +DeleteRepositoryPermissionsPolicyRequest +DeleteRepositoryPermissionsPolicyResult +DeleteRepositoryPolicyRequest +DeleteRepositoryPolicyResponse +DeleteRepositoryRequest +DeleteRepositoryResponse +DeleteRepositoryResult +DeleteRequest +DeleteRequestValidatorRequest +DeleteRescoreExecutionPlanRequest +DeleteReservationRequest +DeleteReservationResponse +DeleteResiliencyPolicyRequest +DeleteResiliencyPolicyResponse +DeleteResolverEndpointRequest +DeleteResolverEndpointResponse +DeleteResolverQueryLogConfigRequest +DeleteResolverQueryLogConfigResponse +DeleteResolverRequest +DeleteResolverRuleRequest +DeleteResolverRuleResponse +DeleteResource +DeleteResourceConfigRequest +DeleteResourceDataSyncRequest +DeleteResourceDefinitionRequest +DeleteResourceInput +DeleteResourceOutput +DeleteResourcePermissionInput +DeleteResourcePermissionOutput +DeleteResourcePolicyInput +DeleteResourcePolicyRequest +DeleteResourcePolicyResponse +DeleteResourcePolicyStatementRequest +DeleteResourcePolicyStatementResponse +DeleteResourceRequest +DeleteResourceServerRequest +DeleteResourceSetRequest +DeleteResourceShareRequest +DeleteResourceShareResponse +DeleteResourceTreeRequest +DeleteResourcesByExternalIdInput +DeleteResponseHeadersPolicyRequest +DeleteResponsePlanInput +DeleteRestApiRequest +DeleteRetentionConfigurationRequest +DeleteRetentionPolicyRequest +DeleteRetrainingSchedulerRequest +DeleteReusableDelegationSetRequest +DeleteRevisionRequest +DeleteRobotApplicationRequest +DeleteRobotRequest +DeleteRoleAliasRequest +DeleteRolePermissionsBoundaryRequest +DeleteRolePolicyRequest +DeleteRoleRequest +DeleteRoomMembershipRequest +DeleteRoomRequest +DeleteRoomSkillParameterRequest +DeleteRotationOverrideRequest +DeleteRotationRequest +DeleteRouteCalculatorRequest +DeleteRouteInput +DeleteRouteOutput +DeleteRouteRequest +DeleteRouteRequestParameterRequest +DeleteRouteResponse +DeleteRouteResponseRequest +DeleteRouteSettingsRequest +DeleteRouteTableRequest +DeleteRoutingControlRequest +DeleteRoutingProfileRequest +DeleteRuleGroupRequest +DeleteRuleGroupResponse +DeleteRuleGroupsNamespaceRequest +DeleteRuleInput +DeleteRuleRequest +DeleteRuleResponse +DeleteRulesetRequest +DeleteRulesetResponse +DeleteRumMetricsDestinationRequest +DeleteRunGroupRequest +DeleteRunRequest +DeleteSAMLProviderRequest +DeleteSMSSandboxPhoneNumberInput +DeleteSSHPublicKeyRequest +DeleteSafetyRuleRequest +DeleteSamplingRuleRequest +DeleteSamplingRuleResult +DeleteScalingPlanRequest +DeleteScalingPolicyInput +DeleteScalingPolicyRequest +DeleteSceneRequest +DeleteScheduleGroupInput +DeleteScheduleInput +DeleteScheduleRequest +DeleteScheduleResponse +DeleteScheduledActionMessage +DeleteScheduledActionRequest +DeleteScheduledActionType +DeleteScheduledAuditRequest +DeleteScheduledQueryRequest +DeleteSchedulingPolicyRequest +DeleteSchemaInput +DeleteSchemaMappingInput +DeleteSchemaMappingOutput +DeleteSchemaRequest +DeleteSchemaResponse +DeleteSchemaVersionRequest +DeleteSchemaVersionsInput +DeleteSchemaVersionsResponse +DeleteScriptInput +DeleteSecretRequest +DeleteSecretResponse +DeleteSecurityConfigRequest +DeleteSecurityConfigurationInput +DeleteSecurityConfigurationRequest +DeleteSecurityGroupRequest +DeleteSecurityPolicyRequest +DeleteSecurityProfileRequest +DeleteSegmentRequest +DeleteSegmentResponse +DeleteSequenceStoreRequest +DeleteServerCertificateRequest +DeleteServerRequest +DeleteServiceActionInput +DeleteServiceInput +DeleteServiceLinkedRoleRequest +DeleteServiceLinkedRoleResponse +DeleteServiceNetworkRequest +DeleteServiceNetworkServiceAssociationRequest +DeleteServiceNetworkServiceAssociationResponse +DeleteServiceNetworkVpcAssociationRequest +DeleteServiceNetworkVpcAssociationResponse +DeleteServiceOutput +DeleteServicePrincipalNameRequest +DeleteServiceProfileRequest +DeleteServiceQuotaIncreaseRequestFromTemplateRequest +DeleteServiceRequest +DeleteServiceResponse +DeleteServiceSpecificCredentialRequest +DeleteServiceSyncConfigInput +DeleteServiceSyncConfigOutput +DeleteServiceTemplateInput +DeleteServiceTemplateOutput +DeleteServiceTemplateVersionInput +DeleteServiceTemplateVersionOutput +DeleteSessionRequest +DeleteSessionResponse +DeleteShareRequest +DeleteShareResponse +DeleteSignalCatalogRequest +DeleteSignalCatalogResponse +DeleteSignalingChannelInput +DeleteSigningCertificateRequest +DeleteSimulationApplicationRequest +DeleteSimulationInput +DeleteSinkInput +DeleteSipMediaApplicationRequest +DeleteSipRuleRequest +DeleteSiteInput +DeleteSiteRequest +DeleteSiteResponse +DeleteSizeConstraintSetRequest +DeleteSizeConstraintSetResponse +DeleteSkillAuthorizationRequest +DeleteSkillGroupRequest +DeleteSlackChannelConfigurationRequest +DeleteSlackWorkspaceConfigurationRequest +DeleteSlotRequest +DeleteSlotTypeRequest +DeleteSlotTypeVersionRequest +DeleteSmsChannelRequest +DeleteSmsChannelResponse +DeleteSmsTemplateRequest +DeleteSmsTemplateResponse +DeleteSnapshotCopyGrantMessage +DeleteSnapshotMessage +DeleteSnapshotRequest +DeleteSnapshotResponse +DeleteSnapshotResult +DeleteSnapshotScheduleInput +DeleteSnapshotScheduleMessage +DeleteSnapshotScheduleOutput +DeleteSolFunctionPackageInput +DeleteSolNetworkInstanceInput +DeleteSolNetworkPackageInput +DeleteSolutionRequest +DeleteSourceBundle +DeleteSourceCredentialsInput +DeleteSourceCredentialsOutput +DeleteSourceFromS3 +DeleteSourceLocationRequest +DeleteSourceNetworkRequest +DeleteSourceRepositoryRequest +DeleteSourceRepositoryResponse +DeleteSourceServerRequest +DeleteSpaceRequest +DeleteSpaceResponse +DeleteSparqlStatisticsOutput +DeleteSpeakerRequest +DeleteSpotDatafeedSubscriptionRequest +DeleteSqlInjectionMatchSetRequest +DeleteSqlInjectionMatchSetResponse +DeleteSshPublicKeyRequest +DeleteStackInput +DeleteStackInstancesInput +DeleteStackInstancesOutput +DeleteStackRequest +DeleteStackSetInput +DeleteStageRequest +DeleteStateMachineAliasInput +DeleteStateMachineInput +DeleteStateMachineVersionInput +DeleteStatisticsValueMap +DeleteStepDetails +DeleteStorageConnectors +DeleteStorageLensConfigurationRequest +DeleteStorageLensConfigurationTaggingRequest +DeleteStorageVirtualMachineRequest +DeleteStorageVirtualMachineResponse +DeleteStoredQueryRequest +DeleteStreamInput +DeleteStreamKeyRequest +DeleteStreamProcessorRequest +DeleteStreamRequest +DeleteStreamingDistributionRequest +DeleteStreamingImageRequest +DeleteStreamingImageResponse +DeleteStreamingSessionRequest +DeleteStreamingSessionResponse +DeleteStudioComponentRequest +DeleteStudioComponentResponse +DeleteStudioInput +DeleteStudioLifecycleConfigRequest +DeleteStudioMemberRequest +DeleteStudioRequest +DeleteStudioResponse +DeleteStudioSessionMappingInput +DeleteSubnetCidrReservationRequest +DeleteSubnetCidrReservationResult +DeleteSubnetGroupRequest +DeleteSubnetGroupResponse +DeleteSubnetRequest +DeleteSubscriberNotificationRequest +DeleteSubscriberRequest +DeleteSubscriptionDefinitionRequest +DeleteSubscriptionFilterRequest +DeleteSuggesterRequest +DeleteSuggesterResponse +DeleteSuiteDefinitionRequest +DeleteSuppressedDestinationRequest +DeleteSyncJobRequest +DeleteSyncJobResponse +DeleteSystemInstanceRequest +DeleteSystemTemplateRequest +DeleteTLSInspectionConfigurationRequest +DeleteTLSInspectionConfigurationResponse +DeleteTableInput +DeleteTableOutput +DeleteTableRequest +DeleteTableVersionRequest +DeleteTagOptionInput +DeleteTagsForDomainRequest +DeleteTagsInput +DeleteTagsMessage +DeleteTagsOutput +DeleteTagsRequest +DeleteTagsType +DeleteTapeArchiveInput +DeleteTapeArchiveOutput +DeleteTapeInput +DeleteTapeOutput +DeleteTapePoolInput +DeleteTapePoolOutput +DeleteTarget +DeleteTargetGroupInput +DeleteTargetGroupRequest +DeleteTargetGroupResponse +DeleteTargetRequest +DeleteTaskDefinitionsRequest +DeleteTaskDefinitionsResponse +DeleteTaskRequest +DeleteTaskSetRequest +DeleteTaskSetResponse +DeleteTaskTemplateRequest +DeleteTemplateAliasRequest +DeleteTemplateAliasResponse +DeleteTemplateGroupAccessControlEntryRequest +DeleteTemplateRequest +DeleteTemplateResponse +DeleteTemplateSyncConfigInput +DeleteTemplateSyncConfigOutput +DeleteTerminologyRequest +DeleteTestGridProjectRequest +DeleteTestSetRequest +DeleteTextMessageSpendLimitOverrideResult +DeleteThemeAliasRequest +DeleteThemeAliasResponse +DeleteThemeRequest +DeleteThemeResponse +DeleteThesaurusRequest +DeleteThingGroupRequest +DeleteThingRequest +DeleteThingShadowRequest +DeleteThingShadowResponse +DeleteThingTypeRequest +DeleteThreatIntelSetRequest +DeleteTime +DeleteTimeSeriesRequest +DeleteTimelineEventInput +DeleteTimestamp +DeleteTokenRequest +DeleteTokenResponse +DeleteTopicInput +DeleteTopicRefreshScheduleRequest +DeleteTopicRefreshScheduleResponse +DeleteTopicRequest +DeleteTopicResponse +DeleteTopicRuleDestinationRequest +DeleteTopicRuleRequest +DeleteTrackerRequest +DeleteTrafficDistributionGroupRequest +DeleteTrafficMirrorFilterRequest +DeleteTrafficMirrorFilterResult +DeleteTrafficMirrorFilterRuleRequest +DeleteTrafficMirrorFilterRuleResult +DeleteTrafficMirrorSessionRequest +DeleteTrafficMirrorSessionResult +DeleteTrafficMirrorTargetRequest +DeleteTrafficMirrorTargetResult +DeleteTrafficPolicyInstanceRequest +DeleteTrafficPolicyRequest +DeleteTrailRequest +DeleteTranscriptionJobRequest +DeleteTransitGatewayConnectPeerRequest +DeleteTransitGatewayConnectPeerResult +DeleteTransitGatewayConnectRequest +DeleteTransitGatewayConnectResult +DeleteTransitGatewayMulticastDomainRequest +DeleteTransitGatewayMulticastDomainResult +DeleteTransitGatewayPeeringAttachmentRequest +DeleteTransitGatewayPeeringAttachmentResult +DeleteTransitGatewayPolicyTableRequest +DeleteTransitGatewayPolicyTableResult +DeleteTransitGatewayPrefixListReferenceRequest +DeleteTransitGatewayPrefixListReferenceResult +DeleteTransitGatewayRequest +DeleteTransitGatewayResult +DeleteTransitGatewayRouteRequest +DeleteTransitGatewayRouteResult +DeleteTransitGatewayRouteTableAnnouncementRequest +DeleteTransitGatewayRouteTableAnnouncementResult +DeleteTransitGatewayRouteTableRequest +DeleteTransitGatewayRouteTableResult +DeleteTransitGatewayVpcAttachmentRequest +DeleteTransitGatewayVpcAttachmentResult +DeleteTrialComponentRequest +DeleteTrialComponentResponse +DeleteTrialRequest +DeleteTrialResponse +DeleteTriggerRequest +DeleteTriggerResponse +DeleteTrustRequest +DeleteTrustResult +DeleteTrustStoreRequest +DeleteTypeRequest +DeleteTypedLinkFacetRequest +DeleteUnusedFMManagedResources +DeleteUploadRequest +DeleteUsageLimitMessage +DeleteUsageLimitRequest +DeleteUsageLimitResponse +DeleteUsagePlanKeyRequest +DeleteUsagePlanRequest +DeleteUseCaseRequest +DeleteUserAccessLoggingSettingsRequest +DeleteUserAttributesRequest +DeleteUserByPrincipalIdRequest +DeleteUserByPrincipalIdResponse +DeleteUserDefinedFunctionRequest +DeleteUserEndpointsRequest +DeleteUserEndpointsResponse +DeleteUserGroupMessage +DeleteUserHierarchyGroupRequest +DeleteUserMessage +DeleteUserPermissionsBoundaryRequest +DeleteUserPolicyRequest +DeleteUserPoolClientRequest +DeleteUserPoolDomainRequest +DeleteUserPoolRequest +DeleteUserProfileRequest +DeleteUserProfileResult +DeleteUserRequest +DeleteUserResponse +DeleteUserSettingsRequest +DeleteUtterancesRequest +DeleteV2LoggingLevelRequest +DeleteVPCAssociationAuthorizationRequest +DeleteVPCConnectionRequest +DeleteVPCConnectionResponse +DeleteVPCEConfigurationRequest +DeleteVariableRequest +DeleteVariantStoreRequest +DeleteVariantStoreResponse +DeleteVaultAccessPolicyInput +DeleteVaultInput +DeleteVaultNotificationsInput +DeleteVcenterClientRequest +DeleteVectorEnrichmentJobInput +DeleteVehicleRequest +DeleteVehicleResponse +DeleteVerifiedAccessEndpointRequest +DeleteVerifiedAccessEndpointResult +DeleteVerifiedAccessGroupRequest +DeleteVerifiedAccessGroupResult +DeleteVerifiedAccessInstanceRequest +DeleteVerifiedAccessInstanceResult +DeleteVerifiedAccessTrustProviderRequest +DeleteVerifiedAccessTrustProviderResult +DeleteVerifiedEmailAddressRequest +DeleteViewInput +DeleteViewOutput +DeleteViewRequest +DeleteViewVersionRequest +DeleteVirtualClusterRequest +DeleteVirtualClusterResponse +DeleteVirtualGatewayInput +DeleteVirtualGatewayOutput +DeleteVirtualInterfaceRequest +DeleteVirtualInterfaceResponse +DeleteVirtualMFADeviceRequest +DeleteVirtualNodeInput +DeleteVirtualNodeOutput +DeleteVirtualRouterInput +DeleteVirtualRouterOutput +DeleteVirtualServiceInput +DeleteVirtualServiceOutput +DeleteVocabularyFilterRequest +DeleteVocabularyRequest +DeleteVocabularyResponse +DeleteVodSourceRequest +DeleteVoiceChannelRequest +DeleteVoiceChannelResponse +DeleteVoiceConnectorEmergencyCallingConfigurationRequest +DeleteVoiceConnectorGroupRequest +DeleteVoiceConnectorOriginationRequest +DeleteVoiceConnectorProxyRequest +DeleteVoiceConnectorRequest +DeleteVoiceConnectorStreamingConfigurationRequest +DeleteVoiceConnectorTerminationCredentialsRequest +DeleteVoiceConnectorTerminationRequest +DeleteVoiceMessageSpendLimitOverrideResult +DeleteVoiceProfileDomainRequest +DeleteVoiceProfileRequest +DeleteVoiceTemplateRequest +DeleteVoiceTemplateResponse +DeleteVolumeInput +DeleteVolumeOntapConfiguration +DeleteVolumeOntapResponse +DeleteVolumeOpenZFSConfiguration +DeleteVolumeOutput +DeleteVolumeRequest +DeleteVolumeResponse +DeleteVolumes +DeleteVpcConfig +DeleteVpcConnectionRequest +DeleteVpcConnectionResponse +DeleteVpcConnectorRequest +DeleteVpcConnectorResponse +DeleteVpcEndpointConnectionNotificationsRequest +DeleteVpcEndpointConnectionNotificationsResult +DeleteVpcEndpointDetail +DeleteVpcEndpointRequest +DeleteVpcEndpointResponse +DeleteVpcEndpointServiceConfigurationsRequest +DeleteVpcEndpointServiceConfigurationsResult +DeleteVpcEndpointsRequest +DeleteVpcEndpointsResult +DeleteVpcIngressConnectionRequest +DeleteVpcIngressConnectionResponse +DeleteVpcLinkRequest +DeleteVpcPeeringAuthorizationInput +DeleteVpcPeeringConnectionInput +DeleteVpcPeeringConnectionRequest +DeleteVpcPeeringConnectionResult +DeleteVpcRequest +DeleteVpnConnectionRequest +DeleteVpnConnectionRouteRequest +DeleteVpnGatewayRequest +DeleteWarmPoolType +DeleteWatchlistRequest +DeleteWaveRequest +DeleteWebACLRequest +DeleteWebACLResponse +DeleteWebhookInput +DeleteWebhookRequest +DeleteWebhookResult +DeleteWhatIfAnalysisRequest +DeleteWhatIfForecastExportRequest +DeleteWhatIfForecastRequest +DeleteWirelessDeviceImportTaskRequest +DeleteWirelessDeviceRequest +DeleteWirelessGatewayRequest +DeleteWirelessGatewayTaskDefinitionRequest +DeleteWirelessGatewayTaskRequest +DeleteWorkGroupInput +DeleteWorkerBlockRequest +DeleteWorkerFleetRequest +DeleteWorkerRequest +DeleteWorkflowRequest +DeleteWorkflowResponse +DeleteWorkflowStepGroupRequest +DeleteWorkflowStepRequest +DeleteWorkforceRequest +DeleteWorkgroupRequest +DeleteWorkgroupResponse +DeleteWorkloadInput +DeleteWorkloadShareInput +DeleteWorkspaceApiKeyRequest +DeleteWorkspaceApiKeyResponse +DeleteWorkspaceBundleRequest +DeleteWorkspaceImageRequest +DeleteWorkspaceRequest +DeleteWorkspaceResponse +DeleteWorkteamRequest +DeleteWorkteamResponse +DeleteWorldTemplateRequest +DeleteXssMatchSetRequest +DeleteXssMatchSetResponse +Deleted +DeletedAt +DeletedDate +DeletedFaces +DeletedObject +DeletedParameters +DeletedSubnetCidrReservation +Deletes +DeletionConfig +DeletionDate +DeletionId +DeletionMessage +DeletionMode +DeletionProtection +DeletionProtectionEnabled +DeletionStartTime +DeletionStatus +DeletionSummary +DeletionTaskFailureReasonType +DeletionTaskId +DeletionTime +DeletionTimestamp +DelimitedTextImportOptions +Delimiter +DeliverConfigSnapshotRequest +DeliverConfigSnapshotResponse +DeliverCrossAccountRole +DeliverLogsErrorMessage +DeliverLogsPermissionArn +DeliverLogsStatus +DeliverabilityTestReport +DeliverabilityTestReports +DeliverabilityTestStatus +DeliveredTimestamp +DeliveryAddress +DeliveryAttempts +DeliveryChannel +DeliveryChannelName +DeliveryChannelNames +DeliveryChannelStatus +DeliveryChannels +DeliveryChannelsStatus +DeliveryMedium +DeliveryMethod +DeliveryOptions +DeliveryRestrictions +DeliveryS3Bucket +DeliveryS3KeyPrefix +DeliveryS3Uri +DeliveryStartTimestamp +DeliveryStatus +DeliveryStream +DeliveryStreamARN +DeliveryStreamArn +DeliveryStreamDescription +DeliveryStreamEncryptionConfiguration +DeliveryStreamEncryptionConfigurationInput +DeliveryStreamName +DeliveryStreamNames +DeliveryStreamStatus +DeliveryStreamType +DeliveryTime +DeliveryTimedOutCount +DeliveryTopic +DeliveryUri +DeltaSyncConfig +DeltaTables +DeltaTarget +DeltaTargets +DeltaTime +DeltaTimeSessionWindowConfiguration +DemodulationConfig +Demographic +Denied +DenoiseFilter +DenyAllIgwTraffic +DenyAllTrafficToEndpoint +DenyCustomRoutingTrafficRequest +DepartNow +Department +DeparturePosition +DeparturePositions +DepartureTime +Dependencies +DependencyAccessDeniedException +DependencyCopyPath +DependencyException +DependencyFailedException +DependencyFailureException +DependencyOriginPath +DependencyRevision +DependencyThrottleException +DependencyTimeout +DependencyTimeoutException +DependentEntities +DependentEntity +DependentJobName +DependentResourceIds +DependentService +DependentServiceFailureException +DependentServiceRequestThrottlingFault +DependentServiceUnavailableFault +DependentServices +DependsOn +Deploy +DeployAsApplicationConfiguration +DeployAsApplicationConfigurationDescription +DeployAsApplicationConfigurationUpdate +DeploySystemInstanceRequest +DeploySystemInstanceResponse +Deployed +DeployedImage +DeployedImages +DeployedStageName +DeployedVersionSummary +Deployment +DeploymentAction +DeploymentAlarms +DeploymentAlreadyCompletedException +DeploymentApplicationConfig +DeploymentArn +DeploymentCanarySettings +DeploymentCircuitBreaker +DeploymentCommand +DeploymentComponentUpdatePolicy +DeploymentConfig +DeploymentConfigAlreadyExistsException +DeploymentConfigDoesNotExistException +DeploymentConfigInUseException +DeploymentConfigInfo +DeploymentConfigLimitExceededException +DeploymentConfigNameRequiredException +DeploymentConfiguration +DeploymentConfigurationValidationPolicy +DeploymentController +DeploymentDoesNotExistException +DeploymentDurationInMinutes +DeploymentEndTime +DeploymentEvent +DeploymentGroupAlreadyExistsException +DeploymentGroupDoesNotExistException +DeploymentGroupInfo +DeploymentGroupLimitExceededException +DeploymentGroupNameRequiredException +DeploymentId +DeploymentIdRequiredException +DeploymentIds +DeploymentInfo +DeploymentIoTJobConfiguration +DeploymentIsNotInReadyStateException +DeploymentJob +DeploymentLaunchConfig +DeploymentLimitExceededException +DeploymentMode +DeploymentModel +DeploymentModels +DeploymentName +DeploymentNotStartedException +DeploymentNumber +DeploymentOption +DeploymentOverview +DeploymentPolicies +DeploymentReadyOption +DeploymentRecommendation +DeploymentResult +DeploymentStage +DeploymentStageStatusSummary +DeploymentStartTime +DeploymentState +DeploymentStatus +DeploymentStatusMessage +DeploymentStrategies +DeploymentStrategy +DeploymentStrategyId +DeploymentStyle +DeploymentSummary +DeploymentTarget +DeploymentTargetDoesNotExistException +DeploymentTargetIdRequiredException +DeploymentTargetListSizeExceededException +DeploymentTargets +DeploymentTime +DeploymentType +Deployments +DeprecateActivityTypeInput +DeprecateAt +DeprecateDomainInput +DeprecateFlowTemplateRequest +DeprecateRule +DeprecateSystemTemplateRequest +DeprecateThingTypeRequest +DeprecateWorkflowTypeInput +DeprecatedStatus +DeprecationDate +DeprecationTime +DeprovisionByoipCidrRequest +DeprovisionByoipCidrResponse +DeprovisionByoipCidrResult +DeprovisionIpamPoolCidrRequest +DeprovisionIpamPoolCidrResult +DeprovisionPublicIpv4PoolCidrRequest +DeprovisionPublicIpv4PoolCidrResult +DeprovisionedAddresses +DeregisterAccountResponse +DeregisterAppInstanceUserEndpointRequest +DeregisterApplicationInput +DeregisterCertificateRequest +DeregisterClusterRequest +DeregisterClusterResponse +DeregisterComputeInput +DeregisterContainerInstanceRequest +DeregisterContainerInstanceResponse +DeregisterDBProxyTargetsRequest +DeregisterDelegatedAdministratorRequest +DeregisterDevicesRequest +DeregisterEcsClusterRequest +DeregisterElasticIpRequest +DeregisterEndPointsInput +DeregisterEndPointsOutput +DeregisterEventTopicRequest +DeregisterFromWorkMailRequest +DeregisterGameServerInput +DeregisterGatewayInstanceRequest +DeregisterGatewayInstanceResponse +DeregisterIdentityProviderRequest +DeregisterIdentityProviderResponse +DeregisterImageRequest +DeregisterInstanceEventNotificationAttributesRequest +DeregisterInstanceEventNotificationAttributesResult +DeregisterInstanceRequest +DeregisterInstanceResponse +DeregisterInstanceTagAttributeRequest +DeregisterJobDefinitionRequest +DeregisterMailDomainRequest +DeregisterManagedInstanceRequest +DeregisterOnPremisesInstanceInput +DeregisterOrganizationAdminAccountRequest +DeregisterOrganizationDelegatedAdminRequest +DeregisterPackageVersionRequest +DeregisterPatchBaselineForPatchGroupRequest +DeregisterPatchBaselineForPatchGroupResult +DeregisterRdsDbInstanceRequest +DeregisterResourceRequest +DeregisterRobotRequest +DeregisterRobotResponse +DeregisterScalableTargetRequest +DeregisterStreamConsumerInput +DeregisterTargetFromMaintenanceWindowRequest +DeregisterTargetFromMaintenanceWindowResult +DeregisterTargetsInput +DeregisterTargetsRequest +DeregisterTargetsResponse +DeregisterTaskDefinitionRequest +DeregisterTaskDefinitionResponse +DeregisterTaskFromMaintenanceWindowRequest +DeregisterTaskFromMaintenanceWindowResult +DeregisterTransitGatewayMulticastGroupMembersRequest +DeregisterTransitGatewayMulticastGroupMembersResult +DeregisterTransitGatewayMulticastGroupSourcesRequest +DeregisterTransitGatewayMulticastGroupSourcesResult +DeregisterTransitGatewayRequest +DeregisterTransitGatewayResponse +DeregisterTypeInput +DeregisterVolumeRequest +DeregisterWebhookWithThirdPartyInput +DeregisterWirelessDeviceRequest +DeregisterWorkspaceDirectoryRequest +DeregisteredMulticastGroupMembers +DeregisteredMulticastGroupSources +DeregisteredNetworkInterfaceIds +Deregistering +DeregistrationPolicy +DeriveKey +DerivedDataInputConfig +DerivedInformation +DescribeACLsRequest +DescribeACLsResponse +DescribeAcceleratorAttributesRequest +DescribeAcceleratorAttributesResponse +DescribeAcceleratorOfferingsRequest +DescribeAcceleratorOfferingsResponse +DescribeAcceleratorRequest +DescribeAcceleratorResponse +DescribeAcceleratorTypesResponse +DescribeAcceleratorsRequest +DescribeAcceleratorsResponse +DescribeAccessControlConfigurationRequest +DescribeAccessControlConfigurationResponse +DescribeAccessPointsInput +DescribeAccessPointsOutput +DescribeAccessPointsRequest +DescribeAccessPointsResponse +DescribeAccessPolicyRequest +DescribeAccessPolicyResponse +DescribeAccessRequest +DescribeAccessResponse +DescribeAccountAssignmentCreationStatusRequest +DescribeAccountAssignmentCreationStatusResponse +DescribeAccountAssignmentDeletionStatusRequest +DescribeAccountAssignmentDeletionStatusResponse +DescribeAccountAttributesMessage +DescribeAccountAttributesRequest +DescribeAccountAttributesResponse +DescribeAccountAttributesResult +DescribeAccountAuditConfigurationResponse +DescribeAccountConfigurationResponse +DescribeAccountCustomizationRequest +DescribeAccountCustomizationResponse +DescribeAccountHealthResponse +DescribeAccountLimitsAnswer +DescribeAccountLimitsInput +DescribeAccountLimitsOutput +DescribeAccountLimitsRequest +DescribeAccountLimitsResult +DescribeAccountModificationsRequest +DescribeAccountModificationsResult +DescribeAccountOverviewRequest +DescribeAccountOverviewResponse +DescribeAccountPoliciesRequest +DescribeAccountPoliciesResponse +DescribeAccountPreferencesRequest +DescribeAccountPreferencesResponse +DescribeAccountRequest +DescribeAccountResponse +DescribeAccountResult +DescribeAccountSettingsRequest +DescribeAccountSettingsResponse +DescribeAccountSubscriptionRequest +DescribeAccountSubscriptionResponse +DescribeActionRequest +DescribeActionResponse +DescribeActionTargetsRequest +DescribeActionTargetsResponse +DescribeActivationsFilter +DescribeActivationsRequest +DescribeActivationsResult +DescribeActiveReceiptRuleSetResponse +DescribeActivitiesRequest +DescribeActivitiesResponse +DescribeActivityInput +DescribeActivityOutput +DescribeActivityTypeInput +DescribeAddonConfigurationRequest +DescribeAddonConfigurationResponse +DescribeAddonRequest +DescribeAddonResponse +DescribeAddonVersionsRequest +DescribeAddonVersionsResponse +DescribeAddressRequest +DescribeAddressResult +DescribeAddressTransfersRequest +DescribeAddressTransfersResult +DescribeAddressesAttributeRequest +DescribeAddressesAttributeResult +DescribeAddressesRequest +DescribeAddressesResult +DescribeAdjustmentTypesAnswer +DescribeAffectedAccountsForOrganizationRequest +DescribeAffectedAccountsForOrganizationResponse +DescribeAffectedEntitiesForOrganizationRequest +DescribeAffectedEntitiesForOrganizationResponse +DescribeAffectedEntitiesRequest +DescribeAffectedEntitiesResponse +DescribeAgentRequest +DescribeAgentResponse +DescribeAgentStatusRequest +DescribeAgentStatusResponse +DescribeAgentVersionsRequest +DescribeAgentVersionsResult +DescribeAgentsRequest +DescribeAgentsResponse +DescribeAggregateComplianceByConfigRulesRequest +DescribeAggregateComplianceByConfigRulesResponse +DescribeAggregateComplianceByConformancePacksRequest +DescribeAggregateComplianceByConformancePacksResponse +DescribeAggregateIdFormatRequest +DescribeAggregateIdFormatResult +DescribeAggregationAuthorizationsRequest +DescribeAggregationAuthorizationsResponse +DescribeAgreementRequest +DescribeAgreementResponse +DescribeAlarmHistoryInput +DescribeAlarmHistoryOutput +DescribeAlarmModelRequest +DescribeAlarmModelResponse +DescribeAlarmRequest +DescribeAlarmResponse +DescribeAlarmsForMetricInput +DescribeAlarmsForMetricOutput +DescribeAlarmsInput +DescribeAlarmsOutput +DescribeAlertManagerDefinitionRequest +DescribeAlertManagerDefinitionResponse +DescribeAlertRequest +DescribeAlertResponse +DescribeAlgorithmInput +DescribeAlgorithmOutput +DescribeAlgorithmRequest +DescribeAlgorithmResponse +DescribeAliasInput +DescribeAliasOutput +DescribeAllManagedProductsRequest +DescribeAllManagedProductsResponse +DescribeAnalysisDefinitionRequest +DescribeAnalysisDefinitionResponse +DescribeAnalysisPermissionsRequest +DescribeAnalysisPermissionsResponse +DescribeAnalysisRequest +DescribeAnalysisResponse +DescribeAnalysisSchemesRequest +DescribeAnalysisSchemesResponse +DescribeAnomalyDetectionExecutionsRequest +DescribeAnomalyDetectionExecutionsResponse +DescribeAnomalyDetectorRequest +DescribeAnomalyDetectorResponse +DescribeAnomalyDetectorsInput +DescribeAnomalyDetectorsOutput +DescribeAnomalyRequest +DescribeAnomalyResponse +DescribeApiDestinationRequest +DescribeApiDestinationResponse +DescribeAppAssessmentRequest +DescribeAppAssessmentResponse +DescribeAppBlockBuilderAppBlockAssociationsRequest +DescribeAppBlockBuilderAppBlockAssociationsResult +DescribeAppBlockBuildersRequest +DescribeAppBlockBuildersResult +DescribeAppBlocksRequest +DescribeAppBlocksResult +DescribeAppImageConfigRequest +DescribeAppImageConfigResponse +DescribeAppInput +DescribeAppInstanceAdminRequest +DescribeAppInstanceAdminResponse +DescribeAppInstanceBotRequest +DescribeAppInstanceBotResponse +DescribeAppInstanceRequest +DescribeAppInstanceResponse +DescribeAppInstanceUserEndpointRequest +DescribeAppInstanceUserEndpointResponse +DescribeAppInstanceUserRequest +DescribeAppInstanceUserResponse +DescribeAppOutput +DescribeAppRequest +DescribeAppResponse +DescribeAppVersionAppComponentRequest +DescribeAppVersionAppComponentResponse +DescribeAppVersionRequest +DescribeAppVersionResourceRequest +DescribeAppVersionResourceResponse +DescribeAppVersionResourcesResolutionStatusRequest +DescribeAppVersionResourcesResolutionStatusResponse +DescribeAppVersionResponse +DescribeAppVersionTemplateRequest +DescribeAppVersionTemplateResponse +DescribeApplicableIndividualAssessmentsMessage +DescribeApplicableIndividualAssessmentsResponse +DescribeApplicationFleetAssociationsRequest +DescribeApplicationFleetAssociationsResult +DescribeApplicationInstanceDetailsRequest +DescribeApplicationInstanceDetailsResponse +DescribeApplicationInstanceRequest +DescribeApplicationInstanceResponse +DescribeApplicationRequest +DescribeApplicationResponse +DescribeApplicationSnapshotRequest +DescribeApplicationSnapshotResponse +DescribeApplicationStateRequest +DescribeApplicationStateResult +DescribeApplicationVersionRequest +DescribeApplicationVersionResponse +DescribeApplicationVersionsMessage +DescribeApplicationsMessage +DescribeApplicationsRequest +DescribeApplicationsResult +DescribeAppsRequest +DescribeAppsResult +DescribeArchiveRequest +DescribeArchiveResponse +DescribeArtifactRequest +DescribeArtifactResponse +DescribeAssessmentRunsRequest +DescribeAssessmentRunsResponse +DescribeAssessmentTargetsRequest +DescribeAssessmentTargetsResponse +DescribeAssessmentTemplatesRequest +DescribeAssessmentTemplatesResponse +DescribeAssetBundleExportJobRequest +DescribeAssetBundleExportJobResponse +DescribeAssetBundleImportJobRequest +DescribeAssetBundleImportJobResponse +DescribeAssetModelRequest +DescribeAssetModelResponse +DescribeAssetPropertyRequest +DescribeAssetPropertyResponse +DescribeAssetRequest +DescribeAssetResponse +DescribeAssociationExecutionTargetsRequest +DescribeAssociationExecutionTargetsResult +DescribeAssociationExecutionsRequest +DescribeAssociationExecutionsResult +DescribeAssociationRequest +DescribeAssociationResult +DescribeAttachmentLimitExceeded +DescribeAttachmentRequest +DescribeAttachmentResponse +DescribeAttackRequest +DescribeAttackResponse +DescribeAttackStatisticsResponse +DescribeAuditFindingRequest +DescribeAuditFindingResponse +DescribeAuditMitigationActionsTaskRequest +DescribeAuditMitigationActionsTaskResponse +DescribeAuditStreamConfigurationRequest +DescribeAuditStreamConfigurationResponse +DescribeAuditSuppressionRequest +DescribeAuditSuppressionResponse +DescribeAuditTaskRequest +DescribeAuditTaskResponse +DescribeAuthenticationProfilesMessage +DescribeAuthenticationProfilesResult +DescribeAuthorizerRequest +DescribeAuthorizerResponse +DescribeAutoMLJobRequest +DescribeAutoMLJobResponse +DescribeAutoMLJobV2Request +DescribeAutoMLJobV2Response +DescribeAutoPredictorRequest +DescribeAutoPredictorResponse +DescribeAutoScalingConfigurationRequest +DescribeAutoScalingConfigurationResponse +DescribeAutoScalingInstancesType +DescribeAutoScalingNotificationTypesAnswer +DescribeAutomationExecutionsRequest +DescribeAutomationExecutionsResult +DescribeAutomationStepExecutionsRequest +DescribeAutomationStepExecutionsResult +DescribeAvailabilityMonitorTestInput +DescribeAvailabilityMonitorTestOutput +DescribeAvailabilityOptionsRequest +DescribeAvailabilityOptionsResponse +DescribeAvailabilityZonesRequest +DescribeAvailabilityZonesResult +DescribeAvailablePatchesRequest +DescribeAvailablePatchesResult +DescribeAwsNetworkPerformanceMetricSubscriptionsRequest +DescribeAwsNetworkPerformanceMetricSubscriptionsResult +DescribeBackupInput +DescribeBackupJobInput +DescribeBackupJobOutput +DescribeBackupOutput +DescribeBackupPolicyRequest +DescribeBackupVaultInput +DescribeBackupVaultOutput +DescribeBackupsRequest +DescribeBackupsResponse +DescribeBandwidthRateLimitInput +DescribeBandwidthRateLimitOutput +DescribeBandwidthRateLimitScheduleInput +DescribeBandwidthRateLimitScheduleOutput +DescribeBatchInferenceJobRequest +DescribeBatchInferenceJobResponse +DescribeBatchLoadTaskRequest +DescribeBatchLoadTaskResponse +DescribeBatchPredictionsInput +DescribeBatchPredictionsOutput +DescribeBatchSegmentJobRequest +DescribeBatchSegmentJobResponse +DescribeBillingGroupRequest +DescribeBillingGroupResponse +DescribeBlueGreenDeploymentsRequest +DescribeBlueGreenDeploymentsResponse +DescribeBotAliasRequest +DescribeBotAliasResponse +DescribeBotLocaleRequest +DescribeBotLocaleResponse +DescribeBotRecommendationRequest +DescribeBotRecommendationResponse +DescribeBotRequest +DescribeBotResponse +DescribeBotVersionRequest +DescribeBotVersionResponse +DescribeBridgeRequest +DescribeBridgeResponse +DescribeBrokerEngineTypesRequest +DescribeBrokerEngineTypesResponse +DescribeBrokerInstanceOptionsRequest +DescribeBrokerInstanceOptionsResponse +DescribeBrokerRequest +DescribeBrokerResponse +DescribeBucketsRequest +DescribeBucketsResponse +DescribeBudgetActionHistoriesRequest +DescribeBudgetActionHistoriesResponse +DescribeBudgetActionRequest +DescribeBudgetActionResponse +DescribeBudgetActionsForAccountRequest +DescribeBudgetActionsForAccountResponse +DescribeBudgetActionsForBudgetRequest +DescribeBudgetActionsForBudgetResponse +DescribeBudgetNotificationsForAccountRequest +DescribeBudgetNotificationsForAccountResponse +DescribeBudgetPerformanceHistoryRequest +DescribeBudgetPerformanceHistoryResponse +DescribeBudgetRequest +DescribeBudgetResponse +DescribeBudgetsRequest +DescribeBudgetsResponse +DescribeBuildInput +DescribeBuildOutput +DescribeBulkImportJobRequest +DescribeBulkImportJobResponse +DescribeBundleRequest +DescribeBundleResult +DescribeBundleTasksRequest +DescribeBundleTasksResult +DescribeByoipCidrsRequest +DescribeByoipCidrsResult +DescribeCACertificateRequest +DescribeCACertificateResponse +DescribeCacheClustersMessage +DescribeCacheEngineVersionsMessage +DescribeCacheInput +DescribeCacheOutput +DescribeCacheParameterGroupsMessage +DescribeCacheParametersMessage +DescribeCacheSecurityGroupsMessage +DescribeCacheSubnetGroupsMessage +DescribeCachediSCSIVolumesInput +DescribeCachediSCSIVolumesOutput +DescribeCampaignRequest +DescribeCampaignResponse +DescribeCanariesLastRunRequest +DescribeCanariesLastRunResponse +DescribeCanariesRequest +DescribeCanariesResponse +DescribeCapacityProvidersRequest +DescribeCapacityProvidersResponse +DescribeCapacityReservationFleetsRequest +DescribeCapacityReservationFleetsResult +DescribeCapacityReservationsRequest +DescribeCapacityReservationsResult +DescribeCarrierGatewaysRequest +DescribeCarrierGatewaysResult +DescribeCasesRequest +DescribeCasesResponse +DescribeCertificateAuthorityAuditReportRequest +DescribeCertificateAuthorityAuditReportResponse +DescribeCertificateAuthorityRequest +DescribeCertificateAuthorityResponse +DescribeCertificateRequest +DescribeCertificateResponse +DescribeCertificateResult +DescribeCertificatesMessage +DescribeCertificatesResponse +DescribeChangeSetHooksInput +DescribeChangeSetHooksOutput +DescribeChangeSetInput +DescribeChangeSetOutput +DescribeChangeSetRequest +DescribeChangeSetResponse +DescribeChannelBanRequest +DescribeChannelBanResponse +DescribeChannelFlowRequest +DescribeChannelFlowResponse +DescribeChannelMembershipForAppInstanceUserRequest +DescribeChannelMembershipForAppInstanceUserResponse +DescribeChannelMembershipRequest +DescribeChannelMembershipResponse +DescribeChannelModeratedByAppInstanceUserRequest +DescribeChannelModeratedByAppInstanceUserResponse +DescribeChannelModeratorRequest +DescribeChannelModeratorResponse +DescribeChannelRequest +DescribeChannelResponse +DescribeChapCredentialsInput +DescribeChapCredentialsOutput +DescribeClassicLinkInstancesRequest +DescribeClassicLinkInstancesResult +DescribeClassificationJobRequest +DescribeClassificationJobResponse +DescribeClientAuthenticationSettingsRequest +DescribeClientAuthenticationSettingsResult +DescribeClientBrandingRequest +DescribeClientBrandingResult +DescribeClientPropertiesRequest +DescribeClientPropertiesResult +DescribeClientVpnAuthorizationRulesRequest +DescribeClientVpnAuthorizationRulesResult +DescribeClientVpnConnectionsRequest +DescribeClientVpnConnectionsResult +DescribeClientVpnEndpointsRequest +DescribeClientVpnEndpointsResult +DescribeClientVpnRoutesRequest +DescribeClientVpnRoutesResult +DescribeClientVpnTargetNetworksRequest +DescribeClientVpnTargetNetworksResult +DescribeClusterDbRevisionsMessage +DescribeClusterInput +DescribeClusterOperationRequest +DescribeClusterOperationResponse +DescribeClusterOperationV2Request +DescribeClusterOperationV2Response +DescribeClusterOutput +DescribeClusterParameterGroupsMessage +DescribeClusterParametersMessage +DescribeClusterRequest +DescribeClusterResponse +DescribeClusterResult +DescribeClusterSecurityGroupsMessage +DescribeClusterSnapshotsMessage +DescribeClusterSubnetGroupsMessage +DescribeClusterTracksMessage +DescribeClusterV2Request +DescribeClusterV2Response +DescribeClusterVersionsMessage +DescribeClustersMessage +DescribeClustersRequest +DescribeClustersResponse +DescribeCodeBindingRequest +DescribeCodeBindingResponse +DescribeCodeCoveragesInput +DescribeCodeCoveragesOutput +DescribeCodeRepositoryInput +DescribeCodeRepositoryOutput +DescribeCodeReviewRequest +DescribeCodeReviewResponse +DescribeCoipPoolsRequest +DescribeCoipPoolsResult +DescribeCollectionRequest +DescribeCollectionResponse +DescribeCommandsRequest +DescribeCommandsResult +DescribeCommentsRequest +DescribeCommentsResponse +DescribeCommunicationsRequest +DescribeCommunicationsResponse +DescribeCompanyNetworkConfigurationRequest +DescribeCompanyNetworkConfigurationResponse +DescribeCompilationJobRequest +DescribeCompilationJobResponse +DescribeComplianceByConfigRuleRequest +DescribeComplianceByConfigRuleResponse +DescribeComplianceByResourceRequest +DescribeComplianceByResourceResponse +DescribeComponentConfigurationRecommendationRequest +DescribeComponentConfigurationRecommendationResponse +DescribeComponentConfigurationRequest +DescribeComponentConfigurationResponse +DescribeComponentRequest +DescribeComponentResponse +DescribeComputeEnvironmentsRequest +DescribeComputeEnvironmentsResponse +DescribeComputeInput +DescribeComputeOutput +DescribeConditionalForwardersRequest +DescribeConditionalForwardersResult +DescribeConfigRuleEvaluationStatusRequest +DescribeConfigRuleEvaluationStatusResponse +DescribeConfigRulesFilters +DescribeConfigRulesRequest +DescribeConfigRulesResponse +DescribeConfigurationAggregatorSourcesStatusRequest +DescribeConfigurationAggregatorSourcesStatusResponse +DescribeConfigurationAggregatorsRequest +DescribeConfigurationAggregatorsResponse +DescribeConfigurationOptionsMessage +DescribeConfigurationRecorderStatusRequest +DescribeConfigurationRecorderStatusResponse +DescribeConfigurationRecordersRequest +DescribeConfigurationRecordersResponse +DescribeConfigurationRequest +DescribeConfigurationResponse +DescribeConfigurationRevisionRequest +DescribeConfigurationRevisionResponse +DescribeConfigurationSetRequest +DescribeConfigurationSetResponse +DescribeConfigurationSetsRequest +DescribeConfigurationSetsResult +DescribeConfigurationSettingsMessage +DescribeConfigurationsRequest +DescribeConfigurationsResponse +DescribeConformancePackComplianceRequest +DescribeConformancePackComplianceResponse +DescribeConformancePackStatusRequest +DescribeConformancePackStatusResponse +DescribeConformancePacksRequest +DescribeConformancePacksResponse +DescribeConnectClientAddInsRequest +DescribeConnectClientAddInsResult +DescribeConnectionAliasPermissionsRequest +DescribeConnectionAliasPermissionsResult +DescribeConnectionAliasesRequest +DescribeConnectionAliasesResult +DescribeConnectionLoaRequest +DescribeConnectionLoaResponse +DescribeConnectionRequest +DescribeConnectionResponse +DescribeConnectionsMessage +DescribeConnectionsOnInterconnectRequest +DescribeConnectionsRequest +DescribeConnectionsResponse +DescribeConnectorEntityRequest +DescribeConnectorEntityResponse +DescribeConnectorProfilesRequest +DescribeConnectorProfilesResponse +DescribeConnectorRequest +DescribeConnectorResponse +DescribeConnectorsRequest +DescribeConnectorsResponse +DescribeConstraintInput +DescribeConstraintOutput +DescribeContactEvaluationRequest +DescribeContactEvaluationResponse +DescribeContactFlowModuleRequest +DescribeContactFlowModuleResponse +DescribeContactFlowRequest +DescribeContactFlowResponse +DescribeContactRequest +DescribeContactResponse +DescribeContainerInput +DescribeContainerInstancesRequest +DescribeContainerInstancesResponse +DescribeContainerOutput +DescribeContextRequest +DescribeContextResponse +DescribeContinuousBackupsInput +DescribeContinuousBackupsOutput +DescribeContinuousExportsRequest +DescribeContinuousExportsResponse +DescribeContributorInsightsInput +DescribeContributorInsightsOutput +DescribeControlPanelRequest +DescribeControlPanelResponse +DescribeConversionConfigurationMessage +DescribeConversionConfigurationResponse +DescribeConversionTasksRequest +DescribeConversionTasksResult +DescribeCopyJobInput +DescribeCopyJobOutput +DescribeCopyProductStatusInput +DescribeCopyProductStatusOutput +DescribeCostCategoryDefinitionRequest +DescribeCostCategoryDefinitionResponse +DescribeCreateAccountStatusRequest +DescribeCreateAccountStatusResponse +DescribeCreateCaseOptionsRequest +DescribeCreateCaseOptionsResponse +DescribeCrossAccountAccessRoleResponse +DescribeCustomDomainAssociationsMessage +DescribeCustomDomainsRequest +DescribeCustomDomainsResponse +DescribeCustomKeyStoresRequest +DescribeCustomKeyStoresResponse +DescribeCustomMetricRequest +DescribeCustomMetricResponse +DescribeCustomPluginRequest +DescribeCustomPluginResponse +DescribeCustomRoutingAcceleratorAttributesRequest +DescribeCustomRoutingAcceleratorAttributesResponse +DescribeCustomRoutingAcceleratorRequest +DescribeCustomRoutingAcceleratorResponse +DescribeCustomRoutingEndpointGroupRequest +DescribeCustomRoutingEndpointGroupResponse +DescribeCustomRoutingListenerRequest +DescribeCustomRoutingListenerResponse +DescribeCustomVocabularyMetadataRequest +DescribeCustomVocabularyMetadataResponse +DescribeCustomerGatewaysRequest +DescribeCustomerGatewaysResult +DescribeCustomerMetadataResponse +DescribeDBClusterAutomatedBackupsMessage +DescribeDBClusterBacktracksMessage +DescribeDBClusterEndpointsMessage +DescribeDBClusterParameterGroupsMessage +DescribeDBClusterParametersMessage +DescribeDBClusterSnapshotAttributesMessage +DescribeDBClusterSnapshotAttributesResult +DescribeDBClusterSnapshotsMessage +DescribeDBClustersMessage +DescribeDBEngineVersionsMessage +DescribeDBInstanceAutomatedBackupsMessage +DescribeDBInstancesMessage +DescribeDBLogFiles +DescribeDBLogFilesDetails +DescribeDBLogFilesMessage +DescribeDBLogFilesResponse +DescribeDBParameterGroupsMessage +DescribeDBParametersMessage +DescribeDBProxiesRequest +DescribeDBProxiesResponse +DescribeDBProxyEndpointsRequest +DescribeDBProxyEndpointsResponse +DescribeDBProxyTargetGroupsRequest +DescribeDBProxyTargetGroupsResponse +DescribeDBProxyTargetsRequest +DescribeDBProxyTargetsResponse +DescribeDBSecurityGroupsMessage +DescribeDBSnapshotAttributesMessage +DescribeDBSnapshotAttributesResult +DescribeDBSnapshotsMessage +DescribeDBSubnetGroupsMessage +DescribeDRTAccessResponse +DescribeDashboardDefinitionRequest +DescribeDashboardDefinitionResponse +DescribeDashboardPermissionsRequest +DescribeDashboardPermissionsResponse +DescribeDashboardRequest +DescribeDashboardResponse +DescribeDashboardSnapshotJobRequest +DescribeDashboardSnapshotJobResponse +DescribeDashboardSnapshotJobResultRequest +DescribeDashboardSnapshotJobResultResponse +DescribeDataIngestionJobRequest +DescribeDataIngestionJobResponse +DescribeDataProvidersMessage +DescribeDataProvidersResponse +DescribeDataQualityJobDefinitionRequest +DescribeDataQualityJobDefinitionResponse +DescribeDataRepositoryAssociationsRequest +DescribeDataRepositoryAssociationsResponse +DescribeDataRepositoryTasksRequest +DescribeDataRepositoryTasksResponse +DescribeDataSetPermissionsRequest +DescribeDataSetPermissionsResponse +DescribeDataSetRefreshPropertiesRequest +DescribeDataSetRefreshPropertiesResponse +DescribeDataSetRequest +DescribeDataSetResponse +DescribeDataSharesForConsumerMessage +DescribeDataSharesForConsumerResult +DescribeDataSharesForProducerMessage +DescribeDataSharesForProducerResult +DescribeDataSharesMessage +DescribeDataSharesResult +DescribeDataSourcePermissionsRequest +DescribeDataSourcePermissionsResponse +DescribeDataSourceRequest +DescribeDataSourceResponse +DescribeDataSourcesInput +DescribeDataSourcesOutput +DescribeDatabaseRequest +DescribeDatabaseResponse +DescribeDatasetExportJobRequest +DescribeDatasetExportJobResponse +DescribeDatasetGroupRequest +DescribeDatasetGroupResponse +DescribeDatasetImportJobRequest +DescribeDatasetImportJobResponse +DescribeDatasetRequest +DescribeDatasetResponse +DescribeDatastoreRequest +DescribeDatastoreResponse +DescribeDefaultAuthorizerResponse +DescribeDefaultClusterParametersMessage +DescribeDefaultClusterParametersResult +DescribeDefaultEncryptionConfigurationResponse +DescribeDefaultParametersRequest +DescribeDefaultParametersResponse +DescribeDeliveryChannelStatusRequest +DescribeDeliveryChannelStatusResponse +DescribeDeliveryChannelsRequest +DescribeDeliveryChannelsResponse +DescribeDeliveryStreamInput +DescribeDeliveryStreamOutput +DescribeDeploymentJobRequest +DescribeDeploymentJobResponse +DescribeDeploymentsRequest +DescribeDeploymentsResult +DescribeDestinationsRequest +DescribeDestinationsResponse +DescribeDetectMitigationActionsTaskRequest +DescribeDetectMitigationActionsTaskResponse +DescribeDetectorModelAnalysisRequest +DescribeDetectorModelAnalysisResponse +DescribeDetectorModelRequest +DescribeDetectorModelResponse +DescribeDetectorRequest +DescribeDetectorResponse +DescribeDetectorResult +DescribeDeviceEc2Input +DescribeDeviceEc2Output +DescribeDeviceFleetRequest +DescribeDeviceFleetResponse +DescribeDeviceInput +DescribeDeviceJobRequest +DescribeDeviceJobResponse +DescribeDeviceOutput +DescribeDevicePolicyConfigurationRequest +DescribeDevicePolicyConfigurationResponse +DescribeDeviceRequest +DescribeDeviceResponse +DescribeDhcpOptionsRequest +DescribeDhcpOptionsResult +DescribeDimensionKeysRequest +DescribeDimensionKeysResponse +DescribeDimensionRequest +DescribeDimensionResponse +DescribeDirectConnectGatewayAssociationProposalsRequest +DescribeDirectConnectGatewayAssociationProposalsResult +DescribeDirectConnectGatewayAssociationsRequest +DescribeDirectConnectGatewayAssociationsResult +DescribeDirectConnectGatewayAttachmentsRequest +DescribeDirectConnectGatewayAttachmentsResult +DescribeDirectConnectGatewaysRequest +DescribeDirectConnectGatewaysResult +DescribeDirectoriesRequest +DescribeDirectoriesResult +DescribeDirectoryConfigsRequest +DescribeDirectoryConfigsResult +DescribeDiscovererRequest +DescribeDiscovererResponse +DescribeDiscoveryJobRequest +DescribeDiscoveryJobResponse +DescribeDocumentClassificationJobRequest +DescribeDocumentClassificationJobResponse +DescribeDocumentClassifierRequest +DescribeDocumentClassifierResponse +DescribeDocumentPermissionRequest +DescribeDocumentPermissionResponse +DescribeDocumentRequest +DescribeDocumentResult +DescribeDocumentVersionsRequest +DescribeDocumentVersionsResponse +DescribeDomainAutoTunesRequest +DescribeDomainAutoTunesResponse +DescribeDomainChangeProgressRequest +DescribeDomainChangeProgressResponse +DescribeDomainConfigRequest +DescribeDomainConfigResponse +DescribeDomainConfigurationRequest +DescribeDomainConfigurationResponse +DescribeDomainControllersRequest +DescribeDomainControllersResult +DescribeDomainEndpointOptionsRequest +DescribeDomainEndpointOptionsResponse +DescribeDomainHealthRequest +DescribeDomainHealthResponse +DescribeDomainInput +DescribeDomainNodesRequest +DescribeDomainNodesResponse +DescribeDomainRequest +DescribeDomainResponse +DescribeDomainResult +DescribeDomainsRequest +DescribeDomainsResponse +DescribeDominantLanguageDetectionJobRequest +DescribeDominantLanguageDetectionJobResponse +DescribeDraftAppVersionResourcesImportStatusRequest +DescribeDraftAppVersionResourcesImportStatusResponse +DescribeDryRunProgressRequest +DescribeDryRunProgressResponse +DescribeEC2InstanceLimitsInput +DescribeEC2InstanceLimitsOutput +DescribeEcsClustersRequest +DescribeEcsClustersResult +DescribeEdgeConfigurationInput +DescribeEdgeConfigurationOutput +DescribeEdgeDeploymentPlanRequest +DescribeEdgeDeploymentPlanResponse +DescribeEdgePackagingJobRequest +DescribeEdgePackagingJobResponse +DescribeEffectiveInstanceAssociationsRequest +DescribeEffectiveInstanceAssociationsResult +DescribeEffectivePatchesForPatchBaselineRequest +DescribeEffectivePatchesForPatchBaselineResult +DescribeEffectivePolicyRequest +DescribeEffectivePolicyResponse +DescribeEgressOnlyInternetGatewaysRequest +DescribeEgressOnlyInternetGatewaysResult +DescribeElasticGpusRequest +DescribeElasticGpusResult +DescribeElasticIpsRequest +DescribeElasticIpsResult +DescribeElasticLoadBalancersRequest +DescribeElasticLoadBalancersResult +DescribeElasticsearchDomainConfigRequest +DescribeElasticsearchDomainConfigResponse +DescribeElasticsearchDomainRequest +DescribeElasticsearchDomainResponse +DescribeElasticsearchDomainsRequest +DescribeElasticsearchDomainsResponse +DescribeElasticsearchInstanceTypeLimitsRequest +DescribeElasticsearchInstanceTypeLimitsResponse +DescribeEmailMonitoringConfigurationRequest +DescribeEmailMonitoringConfigurationResponse +DescribeEmergencyContactSettingsResponse +DescribeEndPointStateInput +DescribeEndPointStateOutput +DescribeEndpointAccessMessage +DescribeEndpointAuthorizationMessage +DescribeEndpointConfigInput +DescribeEndpointConfigOutput +DescribeEndpointGroupRequest +DescribeEndpointGroupResponse +DescribeEndpointInput +DescribeEndpointOutput +DescribeEndpointRequest +DescribeEndpointResponse +DescribeEndpointSettingsMessage +DescribeEndpointSettingsResponse +DescribeEndpointTypesMessage +DescribeEndpointTypesResponse +DescribeEndpointsMessage +DescribeEndpointsRequest +DescribeEndpointsResponse +DescribeEngagementRequest +DescribeEngagementResult +DescribeEngineDefaultClusterParametersMessage +DescribeEngineDefaultClusterParametersResult +DescribeEngineDefaultParametersMessage +DescribeEngineDefaultParametersResult +DescribeEngineVersionsMessage +DescribeEngineVersionsRequest +DescribeEngineVersionsResponse +DescribeEntitiesDetectionJobRequest +DescribeEntitiesDetectionJobResponse +DescribeEntitiesDetectionV2JobRequest +DescribeEntitiesDetectionV2JobResponse +DescribeEntitlementsRequest +DescribeEntitlementsResult +DescribeEntityAggregatesForOrganizationRequest +DescribeEntityAggregatesForOrganizationResponse +DescribeEntityAggregatesRequest +DescribeEntityAggregatesResponse +DescribeEntityRecognizerRequest +DescribeEntityRecognizerResponse +DescribeEntityRequest +DescribeEntityResponse +DescribeEnvironmentHealthRequest +DescribeEnvironmentHealthResult +DescribeEnvironmentManagedActionHistoryRequest +DescribeEnvironmentManagedActionHistoryResult +DescribeEnvironmentManagedActionsRequest +DescribeEnvironmentManagedActionsResult +DescribeEnvironmentMembershipsRequest +DescribeEnvironmentMembershipsResult +DescribeEnvironmentResourcesMessage +DescribeEnvironmentStatusRequest +DescribeEnvironmentStatusResult +DescribeEnvironmentsMessage +DescribeEnvironmentsRequest +DescribeEnvironmentsResult +DescribeEphemerisRequest +DescribeEphemerisResponse +DescribeEvaluationFormRequest +DescribeEvaluationFormResponse +DescribeEvaluationsInput +DescribeEvaluationsOutput +DescribeEventAggregatesRequest +DescribeEventAggregatesResponse +DescribeEventBusRequest +DescribeEventBusResponse +DescribeEventCategoriesMessage +DescribeEventCategoriesResponse +DescribeEventConfigurationsResponse +DescribeEventDetailsForOrganizationRequest +DescribeEventDetailsForOrganizationResponse +DescribeEventDetailsRequest +DescribeEventDetailsResponse +DescribeEventSourceRequest +DescribeEventSourceResponse +DescribeEventSourcesConfigResponse +DescribeEventSubscriptionsMessage +DescribeEventSubscriptionsResponse +DescribeEventTopicsRequest +DescribeEventTopicsResult +DescribeEventTrackerRequest +DescribeEventTrackerResponse +DescribeEventTypesRequest +DescribeEventTypesResponse +DescribeEventsDetectionJobRequest +DescribeEventsDetectionJobResponse +DescribeEventsForOrganizationRequest +DescribeEventsForOrganizationResponse +DescribeEventsMessage +DescribeEventsRequest +DescribeEventsResponse +DescribeExclusionsRequest +DescribeExclusionsResponse +DescribeExecutionInput +DescribeExecutionOutput +DescribeExecutionRequest +DescribeExecutionResponse +DescribeExperienceRequest +DescribeExperienceResponse +DescribeExperimentRequest +DescribeExperimentResponse +DescribeExplainabilityExportRequest +DescribeExplainabilityExportResponse +DescribeExplainabilityRequest +DescribeExplainabilityResponse +DescribeExportConfigurationsRequest +DescribeExportConfigurationsResponse +DescribeExportImageTasksRequest +DescribeExportImageTasksResult +DescribeExportInput +DescribeExportOutput +DescribeExportRequest +DescribeExportResponse +DescribeExportTasksMessage +DescribeExportTasksRequest +DescribeExportTasksResponse +DescribeExportTasksResult +DescribeExpressionsRequest +DescribeExpressionsResponse +DescribeExtensionPackAssociationsMessage +DescribeExtensionPackAssociationsResponse +DescribeFHIRDatastoreRequest +DescribeFHIRDatastoreResponse +DescribeFHIRExportJobRequest +DescribeFHIRExportJobResponse +DescribeFHIRImportJobRequest +DescribeFHIRImportJobResponse +DescribeFaqRequest +DescribeFaqResponse +DescribeFargateProfileRequest +DescribeFargateProfileResponse +DescribeFastLaunchImagesRequest +DescribeFastLaunchImagesResult +DescribeFastLaunchImagesSuccessItem +DescribeFastSnapshotRestoreSuccessItem +DescribeFastSnapshotRestoresRequest +DescribeFastSnapshotRestoresResult +DescribeFeatureGroupRequest +DescribeFeatureGroupResponse +DescribeFeatureMetadataRequest +DescribeFeatureMetadataResponse +DescribeFeatureTransformationRequest +DescribeFeatureTransformationResponse +DescribeFeaturedResultsSetRequest +DescribeFeaturedResultsSetResponse +DescribeFeedbackRequest +DescribeFeedbackResponse +DescribeFileCachesRequest +DescribeFileCachesResponse +DescribeFileSystemAliasesRequest +DescribeFileSystemAliasesResponse +DescribeFileSystemAssociationsInput +DescribeFileSystemAssociationsOutput +DescribeFileSystemPolicyRequest +DescribeFileSystemsRequest +DescribeFileSystemsResponse +DescribeFilterRequest +DescribeFilterResponse +DescribeFindingsRequest +DescribeFindingsResponse +DescribeFirewallPolicyRequest +DescribeFirewallPolicyResponse +DescribeFirewallRequest +DescribeFirewallResponse +DescribeFleetAdvisorCollectorsRequest +DescribeFleetAdvisorCollectorsResponse +DescribeFleetAdvisorDatabasesRequest +DescribeFleetAdvisorDatabasesResponse +DescribeFleetAdvisorLsaAnalysisRequest +DescribeFleetAdvisorLsaAnalysisResponse +DescribeFleetAdvisorSchemaObjectSummaryRequest +DescribeFleetAdvisorSchemaObjectSummaryResponse +DescribeFleetAdvisorSchemasRequest +DescribeFleetAdvisorSchemasResponse +DescribeFleetAttributesInput +DescribeFleetAttributesOutput +DescribeFleetCapacityInput +DescribeFleetCapacityOutput +DescribeFleetError +DescribeFleetEventsInput +DescribeFleetEventsOutput +DescribeFleetHistoryRequest +DescribeFleetHistoryResult +DescribeFleetInstancesRequest +DescribeFleetInstancesResult +DescribeFleetLocationAttributesInput +DescribeFleetLocationAttributesOutput +DescribeFleetLocationCapacityInput +DescribeFleetLocationCapacityOutput +DescribeFleetLocationUtilizationInput +DescribeFleetLocationUtilizationOutput +DescribeFleetMetadataRequest +DescribeFleetMetadataResponse +DescribeFleetMetricRequest +DescribeFleetMetricResponse +DescribeFleetPortSettingsInput +DescribeFleetPortSettingsOutput +DescribeFleetRequest +DescribeFleetResponse +DescribeFleetUtilizationInput +DescribeFleetUtilizationOutput +DescribeFleetsInstances +DescribeFleetsRequest +DescribeFleetsResult +DescribeFlowDefinitionRequest +DescribeFlowDefinitionResponse +DescribeFlowExecutionRecordsRequest +DescribeFlowExecutionRecordsResponse +DescribeFlowLogsRequest +DescribeFlowLogsResult +DescribeFlowRequest +DescribeFlowResponse +DescribeFlywheelIterationRequest +DescribeFlywheelIterationResponse +DescribeFlywheelRequest +DescribeFlywheelResponse +DescribeFolderContentsRequest +DescribeFolderContentsResponse +DescribeFolderPermissionsRequest +DescribeFolderPermissionsResponse +DescribeFolderRequest +DescribeFolderResolvedPermissionsRequest +DescribeFolderResolvedPermissionsResponse +DescribeFolderResponse +DescribeForecastExportJobRequest +DescribeForecastExportJobResponse +DescribeForecastRequest +DescribeForecastResponse +DescribeFpgaImageAttributeRequest +DescribeFpgaImageAttributeResult +DescribeFpgaImagesRequest +DescribeFpgaImagesResult +DescribeFrameworkInput +DescribeFrameworkOutput +DescribeFraudsterRegistrationJobRequest +DescribeFraudsterRegistrationJobResponse +DescribeFraudsterRequest +DescribeFraudsterResponse +DescribeFunctionRequest +DescribeFunctionResult +DescribeGameServerGroupInput +DescribeGameServerGroupOutput +DescribeGameServerInput +DescribeGameServerInstancesInput +DescribeGameServerInstancesOutput +DescribeGameServerOutput +DescribeGameSessionDetailsInput +DescribeGameSessionDetailsOutput +DescribeGameSessionPlacementInput +DescribeGameSessionPlacementOutput +DescribeGameSessionQueuesInput +DescribeGameSessionQueuesOutput +DescribeGameSessionsInput +DescribeGameSessionsOutput +DescribeGatewayCapabilityConfigurationRequest +DescribeGatewayCapabilityConfigurationResponse +DescribeGatewayInformationInput +DescribeGatewayInformationOutput +DescribeGatewayInstanceRequest +DescribeGatewayInstanceResponse +DescribeGatewayRequest +DescribeGatewayResponse +DescribeGatewayRouteInput +DescribeGatewayRouteOutput +DescribeGeofenceCollectionRequest +DescribeGeofenceCollectionResponse +DescribeGlobalClustersMessage +DescribeGlobalNetworksRequest +DescribeGlobalNetworksResponse +DescribeGlobalReplicationGroupsMessage +DescribeGlobalReplicationGroupsResult +DescribeGlobalSettingsOutput +DescribeGlobalTableInput +DescribeGlobalTableOutput +DescribeGlobalTableSettingsInput +DescribeGlobalTableSettingsOutput +DescribeGroupMembershipRequest +DescribeGroupMembershipResponse +DescribeGroupRequest +DescribeGroupResponse +DescribeGroupsRequest +DescribeGroupsResponse +DescribeHandshakeRequest +DescribeHandshakeResponse +DescribeHapgRequest +DescribeHapgResponse +DescribeHarvestJobRequest +DescribeHarvestJobResponse +DescribeHealthServiceStatusForOrganizationResponse +DescribeHomeRegionControlsRequest +DescribeHomeRegionControlsResult +DescribeHostKeyRequest +DescribeHostKeyResponse +DescribeHostReservationOfferingsRequest +DescribeHostReservationOfferingsResult +DescribeHostReservationsRequest +DescribeHostReservationsResult +DescribeHostedConnectionsRequest +DescribeHostsRequest +DescribeHostsResult +DescribeHoursOfOperationRequest +DescribeHoursOfOperationResponse +DescribeHsmClientCertificatesMessage +DescribeHsmConfigurationsMessage +DescribeHsmRequest +DescribeHsmResponse +DescribeHubContentRequest +DescribeHubContentResponse +DescribeHubRequest +DescribeHubResponse +DescribeHumanLoopRequest +DescribeHumanLoopResponse +DescribeHumanTaskUiRequest +DescribeHumanTaskUiResponse +DescribeHyperParameterTuningJobRequest +DescribeHyperParameterTuningJobResponse +DescribeIAMPolicyAssignmentRequest +DescribeIAMPolicyAssignmentResponse +DescribeICD10CMInferenceJobRequest +DescribeICD10CMInferenceJobResponse +DescribeIamInstanceProfileAssociationsRequest +DescribeIamInstanceProfileAssociationsResult +DescribeIdFormatRequest +DescribeIdFormatResult +DescribeIdentityIdFormatRequest +DescribeIdentityIdFormatResult +DescribeIdentityInput +DescribeIdentityPoolInput +DescribeIdentityPoolUsageRequest +DescribeIdentityPoolUsageResponse +DescribeIdentityProviderConfigRequest +DescribeIdentityProviderConfigResponse +DescribeIdentityProviderConfigurationRequest +DescribeIdentityProviderConfigurationResponse +DescribeIdentityProviderRequest +DescribeIdentityProviderResponse +DescribeIdentityUsageRequest +DescribeIdentityUsageResponse +DescribeImageAttributeRequest +DescribeImageBuildersRequest +DescribeImageBuildersResult +DescribeImageGenerationConfigurationInput +DescribeImageGenerationConfigurationOutput +DescribeImagePermissionsRequest +DescribeImagePermissionsResult +DescribeImageReplicationStatusRequest +DescribeImageReplicationStatusResponse +DescribeImageRequest +DescribeImageResponse +DescribeImageScanFindingsRequest +DescribeImageScanFindingsResponse +DescribeImageTagsRequest +DescribeImageTagsResponse +DescribeImageVersionRequest +DescribeImageVersionResponse +DescribeImagesFilter +DescribeImagesRequest +DescribeImagesResponse +DescribeImagesResult +DescribeImportImageTasksRequest +DescribeImportImageTasksResult +DescribeImportInput +DescribeImportOutput +DescribeImportRequest +DescribeImportResponse +DescribeImportSnapshotTasksRequest +DescribeImportSnapshotTasksResult +DescribeImportTasksRequest +DescribeImportTasksResponse +DescribeInboundConnectionsRequest +DescribeInboundConnectionsResponse +DescribeInboundCrossClusterSearchConnectionsRequest +DescribeInboundCrossClusterSearchConnectionsResponse +DescribeInboundDmarcSettingsRequest +DescribeInboundDmarcSettingsResponse +DescribeIndexFieldsRequest +DescribeIndexFieldsResponse +DescribeIndexRequest +DescribeIndexResponse +DescribeInferenceExperimentRequest +DescribeInferenceExperimentResponse +DescribeInferenceRecommendationsJobRequest +DescribeInferenceRecommendationsJobResponse +DescribeInferenceSchedulerRequest +DescribeInferenceSchedulerResponse +DescribeIngestionRequest +DescribeIngestionResponse +DescribeInputDeviceRequest +DescribeInputDeviceResponse +DescribeInputDeviceThumbnailRequest +DescribeInputDeviceThumbnailResponse +DescribeInputRequest +DescribeInputResponse +DescribeInputSecurityGroupRequest +DescribeInputSecurityGroupResponse +DescribeInsightRequest +DescribeInsightResponse +DescribeInsightRulesInput +DescribeInsightRulesOutput +DescribeInstanceAccessControlAttributeConfigurationRequest +DescribeInstanceAccessControlAttributeConfigurationResponse +DescribeInstanceAssociationsStatusRequest +DescribeInstanceAssociationsStatusResult +DescribeInstanceAttributeRequest +DescribeInstanceAttributeResponse +DescribeInstanceConnectEndpointsRequest +DescribeInstanceConnectEndpointsResult +DescribeInstanceCreditSpecificationsRequest +DescribeInstanceCreditSpecificationsResult +DescribeInstanceEventNotificationAttributesRequest +DescribeInstanceEventNotificationAttributesResult +DescribeInstanceEventWindowsRequest +DescribeInstanceEventWindowsResult +DescribeInstanceInformationRequest +DescribeInstanceInformationResult +DescribeInstancePatchStatesForPatchGroupRequest +DescribeInstancePatchStatesForPatchGroupResult +DescribeInstancePatchStatesRequest +DescribeInstancePatchStatesResult +DescribeInstancePatchesRequest +DescribeInstancePatchesResult +DescribeInstanceProfilesMessage +DescribeInstanceProfilesResponse +DescribeInstanceRefreshesAnswer +DescribeInstanceRefreshesType +DescribeInstanceRequest +DescribeInstanceResponse +DescribeInstanceStatusRequest +DescribeInstanceStatusResult +DescribeInstanceStorageConfigRequest +DescribeInstanceStorageConfigResponse +DescribeInstanceTypeLimitsRequest +DescribeInstanceTypeLimitsResponse +DescribeInstanceTypeOfferingsRequest +DescribeInstanceTypeOfferingsResult +DescribeInstanceTypesRequest +DescribeInstanceTypesResult +DescribeInstancesHealthRequest +DescribeInstancesHealthResult +DescribeInstancesInput +DescribeInstancesOutput +DescribeInstancesRequest +DescribeInstancesResult +DescribeIntentRequest +DescribeIntentResponse +DescribeInterconnectLoaRequest +DescribeInterconnectLoaResponse +DescribeInterconnectsRequest +DescribeInternetGatewaysRequest +DescribeInternetGatewaysResult +DescribeInventoryDeletionsRequest +DescribeInventoryDeletionsResult +DescribeIpGroupsRequest +DescribeIpGroupsResult +DescribeIpRestrictionRequest +DescribeIpRestrictionResponse +DescribeIpamPoolsRequest +DescribeIpamPoolsResult +DescribeIpamResourceDiscoveriesRequest +DescribeIpamResourceDiscoveriesResult +DescribeIpamResourceDiscoveryAssociationsRequest +DescribeIpamResourceDiscoveryAssociationsResult +DescribeIpamScopesRequest +DescribeIpamScopesResult +DescribeIpamsRequest +DescribeIpamsResult +DescribeIpv6PoolsRequest +DescribeIpv6PoolsResult +DescribeJobDefinitionsRequest +DescribeJobDefinitionsResponse +DescribeJobExecutionRequest +DescribeJobExecutionResponse +DescribeJobFlowsInput +DescribeJobFlowsOutput +DescribeJobInput +DescribeJobLogItemsRequest +DescribeJobLogItemsResponse +DescribeJobQueuesRequest +DescribeJobQueuesResponse +DescribeJobRequest +DescribeJobResponse +DescribeJobResult +DescribeJobRunRequest +DescribeJobRunResponse +DescribeJobTemplateRequest +DescribeJobTemplateResponse +DescribeJobsRequest +DescribeJobsRequestFilters +DescribeJobsResponse +DescribeJournalKinesisStreamRequest +DescribeJournalKinesisStreamResponse +DescribeJournalS3ExportRequest +DescribeJournalS3ExportResponse +DescribeKeyPairsRequest +DescribeKeyPairsResult +DescribeKeyPhrasesDetectionJobRequest +DescribeKeyPhrasesDetectionJobResponse +DescribeKeyRequest +DescribeKeyResponse +DescribeKeywordsRequest +DescribeKeywordsResult +DescribeKinesisStreamingDestinationInput +DescribeKinesisStreamingDestinationOutput +DescribeLDAPSSettingsRequest +DescribeLDAPSSettingsResult +DescribeLabelGroupRequest +DescribeLabelGroupResponse +DescribeLabelRequest +DescribeLabelResponse +DescribeLabelingJobRequest +DescribeLabelingJobResponse +DescribeLagsRequest +DescribeLanguageModelRequest +DescribeLanguageModelResponse +DescribeLaunchConfigurationTemplatesRequest +DescribeLaunchConfigurationTemplatesResponse +DescribeLaunchTemplateVersionsRequest +DescribeLaunchTemplateVersionsResult +DescribeLaunchTemplatesRequest +DescribeLaunchTemplatesResult +DescribeLayersRequest +DescribeLayersResult +DescribeLedgerRequest +DescribeLedgerResponse +DescribeLifecycleConfigurationRequest +DescribeLifecycleHookTypesAnswer +DescribeLifecycleHooksAnswer +DescribeLifecycleHooksType +DescribeLimitsOutput +DescribeLineageGroupRequest +DescribeLineageGroupResponse +DescribeListenerCertificatesInput +DescribeListenerCertificatesOutput +DescribeListenerRequest +DescribeListenerResponse +DescribeListenersInput +DescribeListenersOutput +DescribeLiveSourceRequest +DescribeLiveSourceResponse +DescribeLoaRequest +DescribeLoadBalancerAttributesInput +DescribeLoadBalancerAttributesOutput +DescribeLoadBalancerPoliciesInput +DescribeLoadBalancerPoliciesOutput +DescribeLoadBalancerPolicyTypesInput +DescribeLoadBalancerPolicyTypesOutput +DescribeLoadBalancerTargetGroupsRequest +DescribeLoadBalancerTargetGroupsResponse +DescribeLoadBalancersInput +DescribeLoadBalancersOutput +DescribeLoadBalancersRequest +DescribeLoadBalancersResponse +DescribeLoadBasedAutoScalingRequest +DescribeLoadBasedAutoScalingResult +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult +DescribeLocalGatewayRouteTableVpcAssociationsRequest +DescribeLocalGatewayRouteTableVpcAssociationsResult +DescribeLocalGatewayRouteTablesRequest +DescribeLocalGatewayRouteTablesResult +DescribeLocalGatewayVirtualInterfaceGroupsRequest +DescribeLocalGatewayVirtualInterfaceGroupsResult +DescribeLocalGatewayVirtualInterfacesRequest +DescribeLocalGatewayVirtualInterfacesResult +DescribeLocalGatewaysRequest +DescribeLocalGatewaysResult +DescribeLocationAzureBlobRequest +DescribeLocationAzureBlobResponse +DescribeLocationEfsRequest +DescribeLocationEfsResponse +DescribeLocationFsxLustreRequest +DescribeLocationFsxLustreResponse +DescribeLocationFsxOntapRequest +DescribeLocationFsxOntapResponse +DescribeLocationFsxOpenZfsRequest +DescribeLocationFsxOpenZfsResponse +DescribeLocationFsxWindowsRequest +DescribeLocationFsxWindowsResponse +DescribeLocationHdfsRequest +DescribeLocationHdfsResponse +DescribeLocationNfsRequest +DescribeLocationNfsResponse +DescribeLocationObjectStorageRequest +DescribeLocationObjectStorageResponse +DescribeLocationS3Request +DescribeLocationS3Response +DescribeLocationSmbRequest +DescribeLocationSmbResponse +DescribeLogGroupsRequest +DescribeLogGroupsResponse +DescribeLogPatternRequest +DescribeLogPatternResponse +DescribeLogStreamsRequest +DescribeLogStreamsResponse +DescribeLoggingConfigurationRequest +DescribeLoggingConfigurationResponse +DescribeLoggingOptionsResponse +DescribeLoggingStatusMessage +DescribeLunaClientRequest +DescribeLunaClientResponse +DescribeMLModelsInput +DescribeMLModelsOutput +DescribeMailboxExportJobRequest +DescribeMailboxExportJobResponse +DescribeMaintenanceStartTimeInput +DescribeMaintenanceStartTimeOutput +DescribeMaintenanceWindowExecutionTaskInvocationsRequest +DescribeMaintenanceWindowExecutionTaskInvocationsResult +DescribeMaintenanceWindowExecutionTasksRequest +DescribeMaintenanceWindowExecutionTasksResult +DescribeMaintenanceWindowExecutionsRequest +DescribeMaintenanceWindowExecutionsResult +DescribeMaintenanceWindowScheduleRequest +DescribeMaintenanceWindowScheduleResult +DescribeMaintenanceWindowTargetsRequest +DescribeMaintenanceWindowTargetsResult +DescribeMaintenanceWindowTasksRequest +DescribeMaintenanceWindowTasksResult +DescribeMaintenanceWindowsForTargetRequest +DescribeMaintenanceWindowsForTargetResult +DescribeMaintenanceWindowsRequest +DescribeMaintenanceWindowsResult +DescribeMalwareScansRequest +DescribeMalwareScansResponse +DescribeManagedEndpointRequest +DescribeManagedEndpointResponse +DescribeManagedJobTemplateRequest +DescribeManagedJobTemplateResponse +DescribeManagedPrefixListsRequest +DescribeManagedPrefixListsResult +DescribeManagedProductsByVendorRequest +DescribeManagedProductsByVendorResponse +DescribeManagedRuleGroupRequest +DescribeManagedRuleGroupResponse +DescribeMapRequest +DescribeMapResponse +DescribeMapRunInput +DescribeMapRunOutput +DescribeMappedResourceConfigurationInput +DescribeMappedResourceConfigurationOutput +DescribeMatchmakingConfigurationsInput +DescribeMatchmakingConfigurationsOutput +DescribeMatchmakingInput +DescribeMatchmakingOutput +DescribeMatchmakingRuleSetsInput +DescribeMatchmakingRuleSetsOutput +DescribeMediaStorageConfigurationInput +DescribeMediaStorageConfigurationOutput +DescribeMergeConflictsInput +DescribeMergeConflictsOutput +DescribeMeshInput +DescribeMeshOutput +DescribeMetadataModelAssessmentsMessage +DescribeMetadataModelAssessmentsResponse +DescribeMetadataModelConversionsMessage +DescribeMetadataModelConversionsResponse +DescribeMetadataModelExportsAsScriptMessage +DescribeMetadataModelExportsAsScriptResponse +DescribeMetadataModelExportsToTargetMessage +DescribeMetadataModelExportsToTargetResponse +DescribeMetadataModelImportsMessage +DescribeMetadataModelImportsResponse +DescribeMetricAttributionRequest +DescribeMetricAttributionResponse +DescribeMetricCollectionTypesAnswer +DescribeMetricFiltersRequest +DescribeMetricFiltersResponse +DescribeMetricSetRequest +DescribeMetricSetResponse +DescribeMigrationProjectsMessage +DescribeMigrationProjectsResponse +DescribeMigrationTaskRequest +DescribeMigrationTaskResult +DescribeMitigationActionRequest +DescribeMitigationActionResponse +DescribeModelBiasJobDefinitionRequest +DescribeModelBiasJobDefinitionResponse +DescribeModelCardExportJobRequest +DescribeModelCardExportJobResponse +DescribeModelCardRequest +DescribeModelCardResponse +DescribeModelExplainabilityJobDefinitionRequest +DescribeModelExplainabilityJobDefinitionResponse +DescribeModelInput +DescribeModelOutput +DescribeModelPackageGroupInput +DescribeModelPackageGroupOutput +DescribeModelPackageInput +DescribeModelPackageOutput +DescribeModelPackagingJobRequest +DescribeModelPackagingJobResponse +DescribeModelQualityJobDefinitionRequest +DescribeModelQualityJobDefinitionResponse +DescribeModelRequest +DescribeModelResponse +DescribeModelVersionRequest +DescribeModelVersionResponse +DescribeModelVersionsRequest +DescribeModelVersionsResult +DescribeMonitorRequest +DescribeMonitorResponse +DescribeMonitoringScheduleRequest +DescribeMonitoringScheduleResponse +DescribeMountTargetSecurityGroupsRequest +DescribeMountTargetSecurityGroupsResponse +DescribeMountTargetsRequest +DescribeMountTargetsResponse +DescribeMovingAddressesRequest +DescribeMovingAddressesResult +DescribeMultiRegionAccessPointOperationRequest +DescribeMultiRegionAccessPointOperationResult +DescribeMultiplexProgramRequest +DescribeMultiplexProgramResponse +DescribeMultiplexRequest +DescribeMultiplexResponse +DescribeMyUserProfileResult +DescribeNFSFileSharesInput +DescribeNFSFileSharesOutput +DescribeNamespaceRequest +DescribeNamespaceResponse +DescribeNatGatewaysRequest +DescribeNatGatewaysResult +DescribeNetworkAclsRequest +DescribeNetworkAclsResult +DescribeNetworkInsightsAccessScopeAnalysesRequest +DescribeNetworkInsightsAccessScopeAnalysesResult +DescribeNetworkInsightsAccessScopesRequest +DescribeNetworkInsightsAccessScopesResult +DescribeNetworkInsightsAnalysesRequest +DescribeNetworkInsightsAnalysesResult +DescribeNetworkInsightsPathsRequest +DescribeNetworkInsightsPathsResult +DescribeNetworkInterfaceAttributeRequest +DescribeNetworkInterfaceAttributeResult +DescribeNetworkInterfacePermissionsRequest +DescribeNetworkInterfacePermissionsResult +DescribeNetworkInterfacesRequest +DescribeNetworkInterfacesResult +DescribeNodeAssociationStatusRequest +DescribeNodeAssociationStatusResponse +DescribeNodeConfigurationOptionsMessage +DescribeNodeFromTemplateJobRequest +DescribeNodeFromTemplateJobResponse +DescribeNodeRequest +DescribeNodeResponse +DescribeNodegroupRequest +DescribeNodegroupResponse +DescribeNotebookExecutionInput +DescribeNotebookExecutionOutput +DescribeNotebookInstanceInput +DescribeNotebookInstanceLifecycleConfigInput +DescribeNotebookInstanceLifecycleConfigOutput +DescribeNotebookInstanceOutput +DescribeNotificationConfigurationInput +DescribeNotificationConfigurationOutput +DescribeNotificationConfigurationsAnswer +DescribeNotificationConfigurationsType +DescribeNotificationRuleRequest +DescribeNotificationRuleResult +DescribeNotificationSubscriptionsRequest +DescribeNotificationSubscriptionsResponse +DescribeNotificationsForBudgetRequest +DescribeNotificationsForBudgetResponse +DescribeObjectRequest +DescribeObjectResponse +DescribeObjectsInput +DescribeObjectsOutput +DescribeObservabilityConfigurationRequest +DescribeObservabilityConfigurationResponse +DescribeObservationRequest +DescribeObservationResponse +DescribeOfferingRequest +DescribeOfferingResponse +DescribeOperatingSystemsResponse +DescribeOpsItemsRequest +DescribeOpsItemsResponse +DescribeOptOutListsRequest +DescribeOptOutListsResult +DescribeOptedOutNumbersRequest +DescribeOptedOutNumbersResult +DescribeOptionGroupOptionsMessage +DescribeOptionGroupsMessage +DescribeOrderableClusterOptionsMessage +DescribeOrderableDBInstanceOptionsMessage +DescribeOrderableReplicationInstancesMessage +DescribeOrderableReplicationInstancesResponse +DescribeOrganizationConfigRuleStatusesRequest +DescribeOrganizationConfigRuleStatusesResponse +DescribeOrganizationConfigRulesRequest +DescribeOrganizationConfigRulesResponse +DescribeOrganizationConfigurationRequest +DescribeOrganizationConfigurationResponse +DescribeOrganizationConformancePackStatusesRequest +DescribeOrganizationConformancePackStatusesResponse +DescribeOrganizationConformancePacksRequest +DescribeOrganizationConformancePacksResponse +DescribeOrganizationHealthRequest +DescribeOrganizationHealthResponse +DescribeOrganizationOverviewRequest +DescribeOrganizationOverviewResponse +DescribeOrganizationRequest +DescribeOrganizationResourceCollectionHealthRequest +DescribeOrganizationResourceCollectionHealthResponse +DescribeOrganizationResponse +DescribeOrganizationalUnitRequest +DescribeOrganizationalUnitResponse +DescribeOrganizationsAccessInput +DescribeOrganizationsAccessOutput +DescribeOriginEndpointRequest +DescribeOriginEndpointResponse +DescribeOutboundConnectionsRequest +DescribeOutboundConnectionsResponse +DescribeOutboundCrossClusterSearchConnectionsRequest +DescribeOutboundCrossClusterSearchConnectionsResponse +DescribePHIDetectionJobRequest +DescribePHIDetectionJobResponse +DescribePackageImportJobRequest +DescribePackageImportJobResponse +DescribePackageRequest +DescribePackageResponse +DescribePackageResult +DescribePackageVersionRequest +DescribePackageVersionResponse +DescribePackageVersionResult +DescribePackagesFilter +DescribePackagesRequest +DescribePackagesResponse +DescribePackagingConfigurationRequest +DescribePackagingConfigurationResponse +DescribePackagingGroupRequest +DescribePackagingGroupResponse +DescribePageRequest +DescribePageResult +DescribeParameterGroupsRequest +DescribeParameterGroupsResponse +DescribeParametersRequest +DescribeParametersResponse +DescribeParametersResult +DescribePartnerEventSourceRequest +DescribePartnerEventSourceResponse +DescribePartnersInputMessage +DescribePartnersOutputMessage +DescribePatchBaselinesRequest +DescribePatchBaselinesResult +DescribePatchGroupStateRequest +DescribePatchGroupStateResult +DescribePatchGroupsRequest +DescribePatchGroupsResult +DescribePatchPropertiesRequest +DescribePatchPropertiesResult +DescribePendingAggregationRequestsRequest +DescribePendingAggregationRequestsResponse +DescribePendingMaintenanceActionsMessage +DescribePendingMaintenanceActionsResponse +DescribePermissionSetProvisioningStatusRequest +DescribePermissionSetProvisioningStatusResponse +DescribePermissionSetRequest +DescribePermissionSetResponse +DescribePermissionsRequest +DescribePermissionsResult +DescribePhoneNumberRequest +DescribePhoneNumberResponse +DescribePhoneNumbersRequest +DescribePhoneNumbersResult +DescribePiiEntitiesDetectionJobRequest +DescribePiiEntitiesDetectionJobResponse +DescribePipeRequest +DescribePipeResponse +DescribePipelineDefinitionForExecutionRequest +DescribePipelineDefinitionForExecutionResponse +DescribePipelineExecutionRequest +DescribePipelineExecutionResponse +DescribePipelineRequest +DescribePipelineResponse +DescribePipelinesInput +DescribePipelinesOutput +DescribePlaceIndexRequest +DescribePlaceIndexResponse +DescribePlacementGroupsRequest +DescribePlacementGroupsResult +DescribePlacementRequest +DescribePlacementResponse +DescribePlatformVersionRequest +DescribePlatformVersionResult +DescribePlayerSessionsInput +DescribePlayerSessionsOutput +DescribePoliciesType +DescribePolicyRequest +DescribePolicyResponse +DescribePoolsRequest +DescribePoolsResult +DescribePortalRequest +DescribePortalResponse +DescribePortfolioInput +DescribePortfolioOutput +DescribePortfolioShareStatusInput +DescribePortfolioShareStatusOutput +DescribePortfolioSharesInput +DescribePortfolioSharesOutput +DescribePredictorBacktestExportJobRequest +DescribePredictorBacktestExportJobResponse +DescribePredictorRequest +DescribePredictorResponse +DescribePrefixListsRequest +DescribePrefixListsResult +DescribePrincipalIdFormatRequest +DescribePrincipalIdFormatResult +DescribePrincipalMappingRequest +DescribePrincipalMappingResponse +DescribeProblemObservationsRequest +DescribeProblemObservationsResponse +DescribeProblemRequest +DescribeProblemResponse +DescribeProcessingJobRequest +DescribeProcessingJobResponse +DescribeProductAsAdminInput +DescribeProductAsAdminOutput +DescribeProductInput +DescribeProductOutput +DescribeProductViewInput +DescribeProductViewOutput +DescribeProductsRequest +DescribeProductsResponse +DescribeProfileRequest +DescribeProfileResponse +DescribeProfilingGroupRequest +DescribeProfilingGroupResponse +DescribeProgramRequest +DescribeProgramResponse +DescribeProjectInput +DescribeProjectOutput +DescribeProjectRequest +DescribeProjectResponse +DescribeProjectResult +DescribeProjectVersionsRequest +DescribeProjectVersionsResponse +DescribeProjectsRequest +DescribeProjectsResponse +DescribePromptRequest +DescribePromptResponse +DescribeProtectedResourceInput +DescribeProtectedResourceOutput +DescribeProtectionGroupRequest +DescribeProtectionGroupResponse +DescribeProtectionRequest +DescribeProtectionResponse +DescribeProvisionedProductInput +DescribeProvisionedProductOutput +DescribeProvisionedProductPlanInput +DescribeProvisionedProductPlanOutput +DescribeProvisioningArtifactInput +DescribeProvisioningArtifactOutput +DescribeProvisioningParametersInput +DescribeProvisioningParametersOutput +DescribeProvisioningTemplateRequest +DescribeProvisioningTemplateResponse +DescribeProvisioningTemplateVersionRequest +DescribeProvisioningTemplateVersionResponse +DescribePublicIpv4PoolsRequest +DescribePublicIpv4PoolsResult +DescribePublisherInput +DescribePublisherOutput +DescribePublishingDestinationRequest +DescribePublishingDestinationResponse +DescribePullRequestEventsInput +DescribePullRequestEventsOutput +DescribePullThroughCacheRulesRequest +DescribePullThroughCacheRulesResponse +DescribeQueriesRequest +DescribeQueriesResponse +DescribeQueryDefinitionsRequest +DescribeQueryDefinitionsResponse +DescribeQueryRequest +DescribeQueryResponse +DescribeQuerySuggestionsBlockListRequest +DescribeQuerySuggestionsBlockListResponse +DescribeQuerySuggestionsConfigRequest +DescribeQuerySuggestionsConfigResponse +DescribeQueueRequest +DescribeQueueResponse +DescribeQuickConnectRequest +DescribeQuickConnectResponse +DescribeRaidArraysRequest +DescribeRaidArraysResult +DescribeRdsDbInstancesRequest +DescribeRdsDbInstancesResult +DescribeReceiptRuleRequest +DescribeReceiptRuleResponse +DescribeReceiptRuleSetRequest +DescribeReceiptRuleSetResponse +DescribeRecipeRequest +DescribeRecipeResponse +DescribeRecommendationExportJobsRequest +DescribeRecommendationExportJobsResponse +DescribeRecommendationFeedbackRequest +DescribeRecommendationFeedbackResponse +DescribeRecommendationLimitationsRequest +DescribeRecommendationLimitationsResponse +DescribeRecommendationsRequest +DescribeRecommendationsResponse +DescribeRecommenderRequest +DescribeRecommenderResponse +DescribeRecordInput +DescribeRecordOutput +DescribeRecoveryInstancesRequest +DescribeRecoveryInstancesRequestFilters +DescribeRecoveryInstancesResponse +DescribeRecoveryPointInput +DescribeRecoveryPointOutput +DescribeRecoverySnapshotsRequest +DescribeRecoverySnapshotsRequestFilters +DescribeRecoverySnapshotsResponse +DescribeRefreshScheduleRequest +DescribeRefreshScheduleResponse +DescribeRefreshSchemasStatusMessage +DescribeRefreshSchemasStatusResponse +DescribeRegionSettingsOutput +DescribeRegionsRequest +DescribeRegionsResult +DescribeRegistriesRequest +DescribeRegistriesResponse +DescribeRegistryRequest +DescribeRegistryResponse +DescribeReleaseLabelInput +DescribeReleaseLabelOutput +DescribeRemediationConfigurationsRequest +DescribeRemediationConfigurationsResponse +DescribeRemediationExceptionsRequest +DescribeRemediationExceptionsResponse +DescribeRemediationExecutionStatusRequest +DescribeRemediationExecutionStatusResponse +DescribeReplaceRootVolumeTasksRequest +DescribeReplaceRootVolumeTasksResult +DescribeReplayRequest +DescribeReplayResponse +DescribeReplicationConfigsMessage +DescribeReplicationConfigsResponse +DescribeReplicationConfigurationTemplatesRequest +DescribeReplicationConfigurationTemplatesResponse +DescribeReplicationConfigurationsRequest +DescribeReplicationConfigurationsResponse +DescribeReplicationGroupsMessage +DescribeReplicationInstanceTaskLogsMessage +DescribeReplicationInstanceTaskLogsResponse +DescribeReplicationInstancesMessage +DescribeReplicationInstancesResponse +DescribeReplicationSubnetGroupsMessage +DescribeReplicationSubnetGroupsResponse +DescribeReplicationTableStatisticsMessage +DescribeReplicationTableStatisticsResponse +DescribeReplicationTaskAssessmentResultsMessage +DescribeReplicationTaskAssessmentResultsResponse +DescribeReplicationTaskAssessmentRunsMessage +DescribeReplicationTaskAssessmentRunsResponse +DescribeReplicationTaskIndividualAssessmentsMessage +DescribeReplicationTaskIndividualAssessmentsResponse +DescribeReplicationTasksMessage +DescribeReplicationTasksResponse +DescribeReplicationsMessage +DescribeReplicationsResponse +DescribeReportCreationOutput +DescribeReportDefinitionsRequest +DescribeReportDefinitionsResponse +DescribeReportJobInput +DescribeReportJobOutput +DescribeReportPlanInput +DescribeReportPlanOutput +DescribeRepositoriesRequest +DescribeRepositoriesResponse +DescribeRepositoryAssociationRequest +DescribeRepositoryAssociationResponse +DescribeRepositoryRequest +DescribeRepositoryResult +DescribeRescoreExecutionPlanRequest +DescribeRescoreExecutionPlanResponse +DescribeReservationRequest +DescribeReservationResponse +DescribeReservedCacheNodesMessage +DescribeReservedCacheNodesOfferingsMessage +DescribeReservedDBInstancesMessage +DescribeReservedDBInstancesOfferingsMessage +DescribeReservedElasticsearchInstanceOfferingsRequest +DescribeReservedElasticsearchInstanceOfferingsResponse +DescribeReservedElasticsearchInstancesRequest +DescribeReservedElasticsearchInstancesResponse +DescribeReservedInstanceOfferingsRequest +DescribeReservedInstanceOfferingsResponse +DescribeReservedInstancesListingsRequest +DescribeReservedInstancesListingsResult +DescribeReservedInstancesModificationsRequest +DescribeReservedInstancesModificationsResult +DescribeReservedInstancesOfferingsRequest +DescribeReservedInstancesOfferingsResult +DescribeReservedInstancesRequest +DescribeReservedInstancesResponse +DescribeReservedInstancesResult +DescribeReservedNodeExchangeStatusInputMessage +DescribeReservedNodeExchangeStatusOutputMessage +DescribeReservedNodeOfferingsMessage +DescribeReservedNodesMessage +DescribeReservedNodesOfferingsRequest +DescribeReservedNodesOfferingsResponse +DescribeReservedNodesRequest +DescribeReservedNodesResponse +DescribeResiliencyPolicyRequest +DescribeResiliencyPolicyResponse +DescribeResizeMessage +DescribeResourceCollectionHealthRequest +DescribeResourceCollectionHealthResponse +DescribeResourceGroupsRequest +DescribeResourceGroupsResponse +DescribeResourcePermissionsRequest +DescribeResourcePermissionsResponse +DescribeResourcePoliciesRequest +DescribeResourcePoliciesResponse +DescribeResourcePolicyRequest +DescribeResourcePolicyResponse +DescribeResourceRequest +DescribeResourceResponse +DescribeResourceServerRequest +DescribeResourceServerResponse +DescribeRestoreJobInput +DescribeRestoreJobOutput +DescribeRetentionConfigurationsRequest +DescribeRetentionConfigurationsResponse +DescribeRetrainingSchedulerRequest +DescribeRetrainingSchedulerResponse +DescribeReturnShippingLabelRequest +DescribeReturnShippingLabelResult +DescribeRiskConfigurationRequest +DescribeRiskConfigurationResponse +DescribeRobotApplicationRequest +DescribeRobotApplicationResponse +DescribeRobotRequest +DescribeRobotResponse +DescribeRoleAliasRequest +DescribeRoleAliasResponse +DescribeRootFoldersRequest +DescribeRootFoldersResponse +DescribeRouteCalculatorRequest +DescribeRouteCalculatorResponse +DescribeRouteInput +DescribeRouteOutput +DescribeRouteTablesRequest +DescribeRouteTablesResult +DescribeRouterConfigurationRequest +DescribeRouterConfigurationResponse +DescribeRoutingControlRequest +DescribeRoutingControlResponse +DescribeRoutingProfileRequest +DescribeRoutingProfileResponse +DescribeRuleGroupMetadataRequest +DescribeRuleGroupMetadataResponse +DescribeRuleGroupRequest +DescribeRuleGroupResponse +DescribeRuleGroupsNamespaceRequest +DescribeRuleGroupsNamespaceResponse +DescribeRuleRequest +DescribeRuleResponse +DescribeRulesInput +DescribeRulesOutput +DescribeRulesPackagesRequest +DescribeRulesPackagesResponse +DescribeRulesetRequest +DescribeRulesetResponse +DescribeRuntimeConfigurationInput +DescribeRuntimeConfigurationOutput +DescribeRuntimeVersionsRequest +DescribeRuntimeVersionsResponse +DescribeRxNormInferenceJobRequest +DescribeRxNormInferenceJobResponse +DescribeSMBFileSharesInput +DescribeSMBFileSharesOutput +DescribeSMBSettingsInput +DescribeSMBSettingsOutput +DescribeSNOMEDCTInferenceJobRequest +DescribeSNOMEDCTInferenceJobResponse +DescribeSSLPoliciesInput +DescribeSSLPoliciesOutput +DescribeSafetyRuleRequest +DescribeSafetyRuleResponse +DescribeSavingsPlanRatesRequest +DescribeSavingsPlanRatesResponse +DescribeSavingsPlansOfferingRatesRequest +DescribeSavingsPlansOfferingRatesResponse +DescribeSavingsPlansOfferingsRequest +DescribeSavingsPlansOfferingsResponse +DescribeSavingsPlansRequest +DescribeSavingsPlansResponse +DescribeScalableTargetsRequest +DescribeScalableTargetsResponse +DescribeScalingActivitiesRequest +DescribeScalingActivitiesResponse +DescribeScalingActivitiesType +DescribeScalingParametersRequest +DescribeScalingParametersResponse +DescribeScalingPlanResourcesRequest +DescribeScalingPlanResourcesResponse +DescribeScalingPlansRequest +DescribeScalingPlansResponse +DescribeScalingPoliciesInput +DescribeScalingPoliciesOutput +DescribeScalingPoliciesRequest +DescribeScalingPoliciesResponse +DescribeScheduleRequest +DescribeScheduleResponse +DescribeScheduledActionsMessage +DescribeScheduledActionsRequest +DescribeScheduledActionsResponse +DescribeScheduledActionsType +DescribeScheduledAuditRequest +DescribeScheduledAuditResponse +DescribeScheduledInstanceAvailabilityRequest +DescribeScheduledInstanceAvailabilityResult +DescribeScheduledInstancesRequest +DescribeScheduledInstancesResult +DescribeScheduledQueryRequest +DescribeScheduledQueryResponse +DescribeSchedulingPoliciesRequest +DescribeSchedulingPoliciesResponse +DescribeSchemaRequest +DescribeSchemaResponse +DescribeSchemasMessage +DescribeSchemasResponse +DescribeScriptInput +DescribeScriptOutput +DescribeSecretRequest +DescribeSecretResponse +DescribeSecurityConfigurationInput +DescribeSecurityConfigurationOutput +DescribeSecurityGroupReferencesRequest +DescribeSecurityGroupReferencesResult +DescribeSecurityGroupRulesRequest +DescribeSecurityGroupRulesResult +DescribeSecurityGroupsRequest +DescribeSecurityGroupsResult +DescribeSecurityPolicyRequest +DescribeSecurityPolicyResponse +DescribeSecurityProfileRequest +DescribeSecurityProfileResponse +DescribeSenderIdsRequest +DescribeSenderIdsResult +DescribeSentimentDetectionJobRequest +DescribeSentimentDetectionJobResponse +DescribeServerRequest +DescribeServerResponse +DescribeServersRequest +DescribeServersResponse +DescribeServiceAccessPoliciesRequest +DescribeServiceAccessPoliciesResponse +DescribeServiceActionExecutionParametersInput +DescribeServiceActionExecutionParametersOutput +DescribeServiceActionInput +DescribeServiceActionOutput +DescribeServiceErrorsRequest +DescribeServiceErrorsResult +DescribeServiceIntegrationResponse +DescribeServiceRequest +DescribeServiceResponse +DescribeServiceUpdatesMessage +DescribeServiceUpdatesRequest +DescribeServiceUpdatesResponse +DescribeServicesRequest +DescribeServicesResponse +DescribeSessionsRequest +DescribeSessionsResponse +DescribeSessionsResult +DescribeSettingsRequest +DescribeSettingsResult +DescribeSeverityLevelsRequest +DescribeSeverityLevelsResponse +DescribeShardInterval +DescribeSharedDirectoriesRequest +DescribeSharedDirectoriesResult +DescribeSignalingChannelInput +DescribeSignalingChannelOutput +DescribeSigningJobRequest +DescribeSigningJobResponse +DescribeSimulationApplicationRequest +DescribeSimulationApplicationResponse +DescribeSimulationInput +DescribeSimulationJobBatchRequest +DescribeSimulationJobBatchResponse +DescribeSimulationJobRequest +DescribeSimulationJobResponse +DescribeSimulationOutput +DescribeSlotRequest +DescribeSlotResponse +DescribeSlotTypeRequest +DescribeSlotTypeResponse +DescribeSnapshotAttributeRequest +DescribeSnapshotAttributeResult +DescribeSnapshotCopyGrantsMessage +DescribeSnapshotScheduleInput +DescribeSnapshotScheduleOutput +DescribeSnapshotSchedulesMessage +DescribeSnapshotSchedulesOutputMessage +DescribeSnapshotTierStatusRequest +DescribeSnapshotTierStatusResult +DescribeSnapshotsListMessage +DescribeSnapshotsMessage +DescribeSnapshotsRequest +DescribeSnapshotsResponse +DescribeSnapshotsResult +DescribeSolutionRequest +DescribeSolutionResponse +DescribeSolutionVersionRequest +DescribeSolutionVersionResponse +DescribeSourceLocationRequest +DescribeSourceLocationResponse +DescribeSourceNetworksRequest +DescribeSourceNetworksRequestFilters +DescribeSourceNetworksResponse +DescribeSourceRegionsMessage +DescribeSourceServersRequest +DescribeSourceServersRequestFilters +DescribeSourceServersResponse +DescribeSpaceRequest +DescribeSpaceResponse +DescribeSpeakerEnrollmentJobRequest +DescribeSpeakerEnrollmentJobResponse +DescribeSpeakerRequest +DescribeSpeakerResponse +DescribeSpendLimitsRequest +DescribeSpendLimitsResult +DescribeSpotDatafeedSubscriptionRequest +DescribeSpotDatafeedSubscriptionResult +DescribeSpotFleetInstancesRequest +DescribeSpotFleetInstancesResponse +DescribeSpotFleetRequestHistoryRequest +DescribeSpotFleetRequestHistoryResponse +DescribeSpotFleetRequestsRequest +DescribeSpotFleetRequestsResponse +DescribeSpotInstanceRequestsRequest +DescribeSpotInstanceRequestsResult +DescribeSpotPriceHistoryRequest +DescribeSpotPriceHistoryResult +DescribeStackDriftDetectionStatusInput +DescribeStackDriftDetectionStatusOutput +DescribeStackEventsInput +DescribeStackEventsOutput +DescribeStackInstanceInput +DescribeStackInstanceOutput +DescribeStackProvisioningParametersRequest +DescribeStackProvisioningParametersResult +DescribeStackResourceDriftsInput +DescribeStackResourceDriftsOutput +DescribeStackResourceInput +DescribeStackResourceOutput +DescribeStackResourcesInput +DescribeStackResourcesOutput +DescribeStackSetInput +DescribeStackSetOperationInput +DescribeStackSetOperationOutput +DescribeStackSetOutput +DescribeStackSummaryRequest +DescribeStackSummaryResult +DescribeStacksInput +DescribeStacksOutput +DescribeStacksRequest +DescribeStacksResult +DescribeStaleSecurityGroupsRequest +DescribeStaleSecurityGroupsResult +DescribeStandardsControlsRequest +DescribeStandardsControlsResponse +DescribeStandardsRequest +DescribeStandardsResponse +DescribeStateMachineAliasInput +DescribeStateMachineAliasOutput +DescribeStateMachineForExecutionInput +DescribeStateMachineForExecutionOutput +DescribeStateMachineInput +DescribeStateMachineOutput +DescribeStatementRequest +DescribeStatementResponse +DescribeStepInput +DescribeStepOutput +DescribeStorageConfigurationResponse +DescribeStorageSystemRequest +DescribeStorageSystemResourceMetricsRequest +DescribeStorageSystemResourceMetricsResponse +DescribeStorageSystemResourcesRequest +DescribeStorageSystemResourcesResponse +DescribeStorageSystemResponse +DescribeStorageVirtualMachinesRequest +DescribeStorageVirtualMachinesResponse +DescribeStoreImageTasksRequest +DescribeStoreImageTasksResult +DescribeStorediSCSIVolumesInput +DescribeStorediSCSIVolumesOutput +DescribeStreamConsumerInput +DescribeStreamConsumerOutput +DescribeStreamInput +DescribeStreamOutput +DescribeStreamProcessorRequest +DescribeStreamProcessorResponse +DescribeStreamRequest +DescribeStreamResponse +DescribeStreamSummaryInput +DescribeStreamSummaryOutput +DescribeStudioInput +DescribeStudioLifecycleConfigRequest +DescribeStudioLifecycleConfigResponse +DescribeStudioOutput +DescribeSubnetGroupsRequest +DescribeSubnetGroupsResponse +DescribeSubnetsRequest +DescribeSubnetsResult +DescribeSubscribedWorkteamRequest +DescribeSubscribedWorkteamResponse +DescribeSubscribersForNotificationRequest +DescribeSubscribersForNotificationResponse +DescribeSubscriptionFiltersRequest +DescribeSubscriptionFiltersResponse +DescribeSubscriptionResponse +DescribeSuggestersRequest +DescribeSuggestersResponse +DescribeSupportedLanguagesRequest +DescribeSupportedLanguagesResponse +DescribeTLSInspectionConfigurationRequest +DescribeTLSInspectionConfigurationResponse +DescribeTableDataImportJobRequest +DescribeTableDataImportJobResult +DescribeTableInput +DescribeTableOutput +DescribeTableReplicaAutoScalingInput +DescribeTableReplicaAutoScalingOutput +DescribeTableRequest +DescribeTableResponse +DescribeTableRestoreStatusMessage +DescribeTableStatisticsMessage +DescribeTableStatisticsResponse +DescribeTagOptionInput +DescribeTagOptionOutput +DescribeTagsInput +DescribeTagsMessage +DescribeTagsOutput +DescribeTagsRequest +DescribeTagsResponse +DescribeTagsResult +DescribeTagsType +DescribeTapeArchivesInput +DescribeTapeArchivesOutput +DescribeTapeRecoveryPointsInput +DescribeTapeRecoveryPointsOutput +DescribeTapesInput +DescribeTapesOutput +DescribeTargetGroupAttributesInput +DescribeTargetGroupAttributesOutput +DescribeTargetGroupsInput +DescribeTargetGroupsOutput +DescribeTargetHealthInput +DescribeTargetHealthOutput +DescribeTargetedSentimentDetectionJobRequest +DescribeTargetedSentimentDetectionJobResponse +DescribeTaskDefinitionRequest +DescribeTaskDefinitionResponse +DescribeTaskExecutionRequest +DescribeTaskExecutionResponse +DescribeTaskInput +DescribeTaskOutput +DescribeTaskRequest +DescribeTaskResponse +DescribeTaskSetsRequest +DescribeTaskSetsResponse +DescribeTasksRequest +DescribeTasksResponse +DescribeTemplateAliasRequest +DescribeTemplateAliasResponse +DescribeTemplateDefinitionRequest +DescribeTemplateDefinitionResponse +DescribeTemplatePermissionsRequest +DescribeTemplatePermissionsResponse +DescribeTemplateRequest +DescribeTemplateResponse +DescribeTerminationPolicyTypesAnswer +DescribeTestCasesInput +DescribeTestCasesOutput +DescribeTestExecutionRequest +DescribeTestExecutionResponse +DescribeTestSetDiscrepancyReportRequest +DescribeTestSetDiscrepancyReportResponse +DescribeTestSetGenerationRequest +DescribeTestSetGenerationResponse +DescribeTestSetRequest +DescribeTestSetResponse +DescribeTextTranslationJobRequest +DescribeTextTranslationJobResponse +DescribeThemeAliasRequest +DescribeThemeAliasResponse +DescribeThemePermissionsRequest +DescribeThemePermissionsResponse +DescribeThemeRequest +DescribeThemeResponse +DescribeThesaurusRequest +DescribeThesaurusResponse +DescribeThingGroupRequest +DescribeThingGroupResponse +DescribeThingRegistrationTaskRequest +DescribeThingRegistrationTaskResponse +DescribeThingRequest +DescribeThingResponse +DescribeThingTypeRequest +DescribeThingTypeResponse +DescribeThumbnailsRequest +DescribeThumbnailsResponse +DescribeTimeBasedAutoScalingRequest +DescribeTimeBasedAutoScalingResult +DescribeTimeSeriesRequest +DescribeTimeSeriesResponse +DescribeTimeToLiveInput +DescribeTimeToLiveOutput +DescribeTopicPermissionsRequest +DescribeTopicPermissionsResponse +DescribeTopicRefreshRequest +DescribeTopicRefreshResponse +DescribeTopicRefreshScheduleRequest +DescribeTopicRefreshScheduleResponse +DescribeTopicRequest +DescribeTopicResponse +DescribeTopicsDetectionJobRequest +DescribeTopicsDetectionJobResponse +DescribeTrackerRequest +DescribeTrackerResponse +DescribeTrafficDistributionGroupRequest +DescribeTrafficDistributionGroupResponse +DescribeTrafficMirrorFiltersRequest +DescribeTrafficMirrorFiltersResult +DescribeTrafficMirrorSessionsRequest +DescribeTrafficMirrorSessionsResult +DescribeTrafficMirrorTargetsRequest +DescribeTrafficMirrorTargetsResult +DescribeTrafficSourcesRequest +DescribeTrafficSourcesResponse +DescribeTrailsRequest +DescribeTrailsResponse +DescribeTrainingJobRequest +DescribeTrainingJobResponse +DescribeTransactionRequest +DescribeTransactionResponse +DescribeTransformJobRequest +DescribeTransformJobResponse +DescribeTransitGatewayAttachmentsRequest +DescribeTransitGatewayAttachmentsResult +DescribeTransitGatewayConnectPeersRequest +DescribeTransitGatewayConnectPeersResult +DescribeTransitGatewayConnectsRequest +DescribeTransitGatewayConnectsResult +DescribeTransitGatewayMulticastDomainsRequest +DescribeTransitGatewayMulticastDomainsResult +DescribeTransitGatewayPeeringAttachmentsRequest +DescribeTransitGatewayPeeringAttachmentsResult +DescribeTransitGatewayPolicyTablesRequest +DescribeTransitGatewayPolicyTablesResult +DescribeTransitGatewayRouteTableAnnouncementsRequest +DescribeTransitGatewayRouteTableAnnouncementsResult +DescribeTransitGatewayRouteTablesRequest +DescribeTransitGatewayRouteTablesResult +DescribeTransitGatewayVpcAttachmentsRequest +DescribeTransitGatewayVpcAttachmentsResult +DescribeTransitGatewaysRequest +DescribeTransitGatewaysResult +DescribeTrialComponentRequest +DescribeTrialComponentResponse +DescribeTrialRequest +DescribeTrialResponse +DescribeTrunkInterfaceAssociationsRequest +DescribeTrunkInterfaceAssociationsResult +DescribeTrustedAdvisorCheckRefreshStatusesRequest +DescribeTrustedAdvisorCheckRefreshStatusesResponse +DescribeTrustedAdvisorCheckResultRequest +DescribeTrustedAdvisorCheckResultResponse +DescribeTrustedAdvisorCheckSummariesRequest +DescribeTrustedAdvisorCheckSummariesResponse +DescribeTrustedAdvisorChecksRequest +DescribeTrustedAdvisorChecksResponse +DescribeTrustsRequest +DescribeTrustsResult +DescribeTunnelRequest +DescribeTunnelResponse +DescribeTypeInput +DescribeTypeOutput +DescribeTypeRegistrationInput +DescribeTypeRegistrationOutput +DescribeUpdateActionsMessage +DescribeUpdateDirectoryRequest +DescribeUpdateDirectoryResult +DescribeUpdateRequest +DescribeUpdateResponse +DescribeUploadBufferInput +DescribeUploadBufferOutput +DescribeUsageLimitsMessage +DescribeUsageReportSubscriptionsRequest +DescribeUsageReportSubscriptionsResult +DescribeUserGroupsMessage +DescribeUserGroupsResult +DescribeUserHierarchyGroupRequest +DescribeUserHierarchyGroupResponse +DescribeUserHierarchyStructureRequest +DescribeUserHierarchyStructureResponse +DescribeUserImportJobRequest +DescribeUserImportJobResponse +DescribeUserPoolClientRequest +DescribeUserPoolClientResponse +DescribeUserPoolDomainRequest +DescribeUserPoolDomainResponse +DescribeUserPoolRequest +DescribeUserPoolResponse +DescribeUserProfileRequest +DescribeUserProfileResponse +DescribeUserProfileResult +DescribeUserProfilesRequest +DescribeUserProfilesResult +DescribeUserRequest +DescribeUserResponse +DescribeUserStackAssociationsRequest +DescribeUserStackAssociationsResult +DescribeUsersMessage +DescribeUsersRequest +DescribeUsersResponse +DescribeUsersResult +DescribeVPCConnectionRequest +DescribeVPCConnectionResponse +DescribeVTLDevicesInput +DescribeVTLDevicesOutput +DescribeValidDBInstanceModificationsMessage +DescribeValidDBInstanceModificationsResult +DescribeVaultInput +DescribeVaultOutput +DescribeVcenterClientsRequest +DescribeVcenterClientsResponse +DescribeVerifiedAccessEndpointsRequest +DescribeVerifiedAccessEndpointsResult +DescribeVerifiedAccessGroupsRequest +DescribeVerifiedAccessGroupsResult +DescribeVerifiedAccessInstanceLoggingConfigurationsRequest +DescribeVerifiedAccessInstanceLoggingConfigurationsResult +DescribeVerifiedAccessInstancesRequest +DescribeVerifiedAccessInstancesResult +DescribeVerifiedAccessTrustProvidersRequest +DescribeVerifiedAccessTrustProvidersResult +DescribeViewRequest +DescribeViewResponse +DescribeVirtualClusterRequest +DescribeVirtualClusterResponse +DescribeVirtualGatewayInput +DescribeVirtualGatewayOutput +DescribeVirtualInterfacesRequest +DescribeVirtualNodeInput +DescribeVirtualNodeOutput +DescribeVirtualRouterInput +DescribeVirtualRouterOutput +DescribeVirtualServiceInput +DescribeVirtualServiceOutput +DescribeVocabularyRequest +DescribeVocabularyResponse +DescribeVodSourceRequest +DescribeVodSourceResponse +DescribeVoicesInput +DescribeVoicesOutput +DescribeVolumeAttributeRequest +DescribeVolumeAttributeResult +DescribeVolumeStatusRequest +DescribeVolumeStatusResult +DescribeVolumesModificationsRequest +DescribeVolumesModificationsResult +DescribeVolumesRequest +DescribeVolumesResponse +DescribeVolumesResult +DescribeVpcAttributeRequest +DescribeVpcAttributeResult +DescribeVpcClassicLinkDnsSupportRequest +DescribeVpcClassicLinkDnsSupportResult +DescribeVpcClassicLinkRequest +DescribeVpcClassicLinkResult +DescribeVpcConnectionRequest +DescribeVpcConnectionResponse +DescribeVpcConnectorRequest +DescribeVpcConnectorResponse +DescribeVpcEndpointConnectionNotificationsRequest +DescribeVpcEndpointConnectionNotificationsResult +DescribeVpcEndpointConnectionsRequest +DescribeVpcEndpointConnectionsResult +DescribeVpcEndpointServiceConfigurationsRequest +DescribeVpcEndpointServiceConfigurationsResult +DescribeVpcEndpointServicePermissionsRequest +DescribeVpcEndpointServicePermissionsResult +DescribeVpcEndpointServicesRequest +DescribeVpcEndpointServicesResult +DescribeVpcEndpointsRequest +DescribeVpcEndpointsResponse +DescribeVpcEndpointsResult +DescribeVpcIngressConnectionRequest +DescribeVpcIngressConnectionResponse +DescribeVpcPeeringAuthorizationsOutput +DescribeVpcPeeringConnectionsInput +DescribeVpcPeeringConnectionsOutput +DescribeVpcPeeringConnectionsRequest +DescribeVpcPeeringConnectionsResult +DescribeVpcsRequest +DescribeVpcsResult +DescribeVpnConnectionsRequest +DescribeVpnConnectionsResult +DescribeVpnGatewaysRequest +DescribeVpnGatewaysResult +DescribeWarmPoolAnswer +DescribeWarmPoolType +DescribeWatchlistRequest +DescribeWatchlistResponse +DescribeWebsiteCertificateAuthorityRequest +DescribeWebsiteCertificateAuthorityResponse +DescribeWhatIfAnalysisRequest +DescribeWhatIfAnalysisResponse +DescribeWhatIfForecastExportRequest +DescribeWhatIfForecastExportResponse +DescribeWhatIfForecastRequest +DescribeWhatIfForecastResponse +DescribeWorkerConfigurationRequest +DescribeWorkerConfigurationResponse +DescribeWorkflowExecutionInput +DescribeWorkflowRequest +DescribeWorkflowResponse +DescribeWorkflowTypeInput +DescribeWorkforceRequest +DescribeWorkforceResponse +DescribeWorkingStorageInput +DescribeWorkingStorageOutput +DescribeWorkloadRequest +DescribeWorkloadResponse +DescribeWorkspaceAuthenticationRequest +DescribeWorkspaceAuthenticationResponse +DescribeWorkspaceBundlesRequest +DescribeWorkspaceBundlesResult +DescribeWorkspaceConfigurationRequest +DescribeWorkspaceConfigurationResponse +DescribeWorkspaceDirectoriesRequest +DescribeWorkspaceDirectoriesResult +DescribeWorkspaceImagePermissionsRequest +DescribeWorkspaceImagePermissionsResult +DescribeWorkspaceImagesRequest +DescribeWorkspaceImagesResult +DescribeWorkspaceRequest +DescribeWorkspaceResponse +DescribeWorkspaceSnapshotsRequest +DescribeWorkspaceSnapshotsResult +DescribeWorkspacesConnectionStatusRequest +DescribeWorkspacesConnectionStatusResult +DescribeWorkspacesRequest +DescribeWorkspacesResult +DescribeWorkteamRequest +DescribeWorkteamResponse +DescribeWorldExportJobRequest +DescribeWorldExportJobResponse +DescribeWorldGenerationJobRequest +DescribeWorldGenerationJobResponse +DescribeWorldRequest +DescribeWorldResponse +DescribeWorldTemplateRequest +DescribeWorldTemplateResponse +DescribedAccess +DescribedAgreement +DescribedCertificate +DescribedConnector +DescribedExecution +DescribedHostKey +DescribedProfile +DescribedSecurityPolicy +DescribedServer +DescribedUser +DescribedWorkflow +Description +DescriptionPageUrl +DescriptionRegex +DescriptionTooLongException +DescriptiveMentionIndex +DescriptiveVideoServiceFlag +Deserializer +Desired +DesiredCapacity +DesiredCapacityType +DesiredConfiguration +DesiredCount +DesiredDataAccessRoleArn +DesiredDeliveryMediums +DesiredInferenceUnits +DesiredInstanceCount +DesiredInstanceType +DesiredInstances +DesiredModelArn +DesiredModelVariants +DesiredNumber +DesiredNumberOfDomainControllers +DesiredPartitionCount +DesiredPlayerSession +DesiredPlayerSessions +DesiredReplicationCount +DesiredServerlessConfig +DesiredShardLevelMetrics +DesiredStartTime +DesiredState +DesiredValue +DesiredWeight +DesiredWeightAndCapacity +DesiredWeightsAndCapacities +DeskPhoneNumber +Destination +Destination608ChannelNumber +Destination708ServiceNumber +DestinationAddress +DestinationAddresses +DestinationArn +DestinationBackup +DestinationBackupVaultArn +DestinationBranchName +DestinationBucketName +DestinationCidr +DestinationCidrBlock +DestinationColumn +DestinationCommit +DestinationConfig +DestinationConfiguration +DestinationConfigurationRequest +DestinationConfigurations +DestinationConnectorProperties +DestinationCountryParameters +DestinationDataSharing +DestinationDataSharingType +DestinationDescription +DestinationDescriptions +DestinationDetails +DestinationDomain +DestinationDomainInfo +DestinationEncryptionAlgorithm +DestinationEncryptionContext +DestinationEnvironmentId +DestinationEnvironmentName +DestinationField +DestinationFieldProperties +DestinationFileLocation +DestinationFilters +DestinationFlowConfig +DestinationId +DestinationIdentifier +DestinationIdentity +DestinationImageDescription +DestinationImageName +DestinationInfo +DestinationIp +DestinationIpV4 +DestinationIpV6 +DestinationIpamScopeId +DestinationIpv6CidrBlock +DestinationItemsLimit +DestinationKeyId +DestinationLicenseContext +DestinationList +DestinationLocationArn +DestinationName +DestinationNamePrefix +DestinationNetworkInterfaceArns +DestinationNotAllowedException +DestinationOptions +DestinationOptionsRequest +DestinationOptionsResponse +DestinationOutpostArn +DestinationParameterName +DestinationParameterValueConfiguration +DestinationParentId +DestinationParentNotFoundException +DestinationPath +DestinationPhoneNumber +DestinationPoolName +DestinationPort +DestinationPortMapping +DestinationPortMappings +DestinationPortRange +DestinationPortRanges +DestinationPorts +DestinationPosition +DestinationPositions +DestinationPrefixListId +DestinationPrefixLists +DestinationProjectArn +DestinationProperties +DestinationQueue +DestinationRecoveryPointArn +DestinationRefId +DestinationRegion +DestinationS3Uri +DestinationSchema +DestinationSchemaUpdate +DestinationSettings +DestinationSocketAddress +DestinationStatus +DestinationStatusDescription +DestinationStreamArn +DestinationSummary +DestinationToCreate +DestinationTrafficState +DestinationType +DestinationUser +DestinationUserIdentifier +DestinationVpc +Destinations +DetachCertificateFromDistributionRequest +DetachCertificateFromDistributionResult +DetachClassicLinkVpcRequest +DetachClassicLinkVpcResult +DetachCustomerManagedPolicyReferenceFromPermissionSetRequest +DetachDiskRequest +DetachDiskResult +DetachElasticLoadBalancerRequest +DetachFromIndex +DetachFromIndexRequest +DetachFromIndexResponse +DetachGroupPolicyRequest +DetachInstancesAnswer +DetachInstancesFromLoadBalancerRequest +DetachInstancesFromLoadBalancerResult +DetachInstancesQuery +DetachInternetGatewayRequest +DetachLoadBalancerFromSubnetsInput +DetachLoadBalancerFromSubnetsOutput +DetachLoadBalancerTargetGroupsType +DetachLoadBalancersType +DetachManagedPolicyFromPermissionSetRequest +DetachNetworkInterfaceRequest +DetachObject +DetachObjectRequest +DetachObjectResponse +DetachPolicy +DetachPolicyRequest +DetachPrincipalPolicyRequest +DetachRolePolicyRequest +DetachSecurityProfileRequest +DetachStaticIpRequest +DetachStaticIpResult +DetachThingPrincipalRequest +DetachTrafficSourcesType +DetachTypedLink +DetachTypedLinkRequest +DetachUserPolicyRequest +DetachVerifiedAccessTrustProviderRequest +DetachVerifiedAccessTrustProviderResult +DetachVolumeInput +DetachVolumeOutput +DetachVolumeRequest +DetachVpnGatewayRequest +DetachedObjectIdentifier +Detail +DetailType +DetailedError +DetailedErrorCode +DetailedErrorMessage +DetailedMetricsEnabled +DetailedResultsLocation +DetailedStatus +DetailedStatusCodesMetrics +Details +DetailsMap +DetectAnomaliesRequest +DetectAnomaliesResponse +DetectAnomalyResult +DetectCustomLabelsRequest +DetectCustomLabelsResponse +DetectDocumentTextModelVersion +DetectDocumentTextRequest +DetectDocumentTextResponse +DetectDominantLanguageRequest +DetectDominantLanguageResponse +DetectEntitiesRequest +DetectEntitiesResponse +DetectEntitiesV2Request +DetectEntitiesV2Response +DetectFacesRequest +DetectFacesResponse +DetectKeyPhrasesRequest +DetectKeyPhrasesResponse +DetectLabelsImageBackground +DetectLabelsImageForeground +DetectLabelsImageProperties +DetectLabelsImagePropertiesSettings +DetectLabelsImageQuality +DetectLabelsRequest +DetectLabelsResponse +DetectLabelsSettings +DetectMetricSetConfigRequest +DetectMetricSetConfigResponse +DetectMitigationActionExecution +DetectMitigationActionsTaskStatistics +DetectMitigationActionsTaskSummary +DetectMitigationActionsTaskTarget +DetectModerationLabelsRequest +DetectModerationLabelsResponse +DetectPHIRequest +DetectPHIResponse +DetectPiiEntitiesRequest +DetectPiiEntitiesResponse +DetectProtectiveEquipmentRequest +DetectProtectiveEquipmentResponse +DetectSchema +DetectSentimentRequest +DetectSentimentResponse +DetectStackDriftInput +DetectStackDriftOutput +DetectStackResourceDriftInput +DetectStackResourceDriftOutput +DetectStackSetDriftInput +DetectStackSetDriftOutput +DetectSyntaxRequest +DetectSyntaxResponse +DetectTargetedSentimentRequest +DetectTargetedSentimentResponse +DetectTextFilters +DetectTextRequest +DetectTextResponse +DetectedCsvFormatDescriptor +DetectedDataDetails +DetectedField +DetectedFileFormatDescriptor +DetectedJsonFormatDescriptor +DetectedLanguageCode +DetectedLanguageLowConfidenceException +DetectedMetricSetConfig +DetectedMetricSource +DetectedProperties +DetectedS3SourceConfig +DetectedSignature +DetectedSignatures +DetectedText +DetectedWorkload +Detection +DetectionAttributes +DetectionFilter +DetectionStatus +DetectionStatusReason +Detections +Detector +DetectorAdditionalConfiguration +DetectorAdditionalConfigurationResult +DetectorDebugOption +DetectorFeatureConfiguration +DetectorFeatureConfigurationResult +DetectorId +DetectorIds +DetectorModel +DetectorModelConfiguration +DetectorModelDefinition +DetectorModelSummary +DetectorModelVersionSummary +DetectorState +DetectorStateDefinition +DetectorStateSummary +DetectorSummary +DetectorVersionSummary +DeterminingPolicyItem +DevAddr +DevEndpoint +DevEndpointCustomLibraries +DevEndpointNames +DevEndpoints +DevEndpointsNotFound +DevEnvironmentAccessDetails +DevEnvironmentRepositorySummary +DevEnvironmentSessionConfiguration +DevEnvironmentSessionSummary +DevEnvironmentSummary +DevEui +DevEuiEventTopic +DevStatusReqFreq +DeveloperInfo +DeveloperName +DeveloperOnlyAttribute +DeveloperProviderName +DeveloperUserAlreadyRegisteredException +DeveloperUserIdentifier +DeveloperUserIdentifierList +DevelopmentSchemaArn +Device +DeviceAggregatedStatus +DeviceAggregatedStatusFilter +DeviceArn +DeviceAttributes +DeviceCaCertificate +DeviceCertificates +DeviceConfig +DeviceConfiguration +DeviceConfigurationType +DeviceConnectionStatus +DeviceCreateDate +DeviceCreationFile +DeviceCreationFileList +DeviceData +DeviceDefinitionId +DeviceDefinitionVersion +DeviceDefinitionVersionArn +DeviceDefinitionVersionId +DeviceDeploymentStatus +DeviceDeploymentStatusMessage +DeviceDeploymentSummaries +DeviceDeploymentSummary +DeviceDescription +DeviceEvent +DeviceEvents +DeviceFilter +DeviceFleetArn +DeviceFleetName +DeviceFleetNameContains +DeviceFleetSummaries +DeviceFleetSummary +DeviceGroupKey +DeviceId +DeviceIdentifier +DeviceIds +DeviceIndex +DeviceInstance +DeviceJob +DeviceJobConfig +DeviceJobs +DeviceKey +DeviceLastAuthenticatedDate +DeviceLastModifiedDate +DeviceMethod +DeviceMethodParameters +DeviceMethodResponse +DeviceMethods +DeviceMinutes +DeviceModel +DeviceModels +DeviceName +DeviceNameContains +DeviceNames +DeviceNetworkProfileInfo +DeviceNotRegisteredException +DeviceOfflineException +DeviceOnlyRememberedOnUserPrompt +DeviceOperatingSystem +DeviceOperatingSystems +DeviceOptions +DevicePickupId +DevicePickupSnsTopicARN +DevicePool +DevicePoolCompatibilityResult +DevicePosition +DevicePositionUpdate +DevicePositionUpdates +DevicePositions +DeviceProfile +DeviceProfileId +DeviceProfileList +DeviceProfileType +DeviceQueueInfo +DeviceRegistration +DeviceRegistrationState +DeviceRegistrationStateEventConfiguration +DeviceRegistrationStateResourceTypeEventConfiguration +DeviceRegistryEnrichActivity +DeviceRememberedStatus +DeviceReportedStatus +DeviceReportedTime +DeviceRestrictions +DeviceRetiredException +DeviceSecretVerifierConfig +DeviceSecretVerifierConfigType +DeviceSelectionConfig +DeviceSelectionConfiguration +DeviceSelectionResult +DeviceSerialNumber +DeviceSettingsSyncState +DeviceShadowEnrichActivity +DeviceState +DeviceStats +DeviceStatus +DeviceStatusDetail +DeviceStatusDetails +DeviceStatusInfo +DeviceStreamLimitExceededException +DeviceSubsetType +DeviceSummaries +DeviceSummary +DeviceTemplate +DeviceToken +DeviceTrustProviderType +DeviceType +DeviceTypeAndroid +DeviceTypeChromeOs +DeviceTypeId +DeviceTypeIos +DeviceTypeLinux +DeviceTypeOsx +DeviceTypeWeb +DeviceTypeWindows +DeviceTypeZeroClient +DeviceTypes +DeviceUnderTest +DeviceUpdateStatus +DeviceUsageType +DeviceUserAgent +DeviceUserAgents +DeviceValidationDomain +DeviceiSCSIAttributes +Devices +DhcpConfiguration +DhcpConfigurations +DhcpOptions +DhcpOptionsId +DhcpOptionsIds +DiagnosticCode +Diagnostics +DialRequest +Dialnorm +DialogAction +DialogCodeHookInvocationSetting +DialogCodeHookSettings +DialogState +DialogueIntelligence +DictPageSizeLimit +DictionaryKeyThreshold +Diff +Difference +DifferenceStatus +DifferenceType +Digest +DigestAlgorithmMnemonic +DigestAlgorithmType +DigestTipAddress +DigestType +DigestValue +DigitalSignature +DigitalSignatureMethod +Dimension +DimensionConfigurations +DimensionContribution +DimensionContributionList +DimensionDetail +DimensionField +DimensionFilter +DimensionFilterList +DimensionForeground +DimensionGroup +DimensionGroupDetail +DimensionKey +DimensionKeyDescription +DimensionKeyDetail +DimensionKeys +DimensionList +DimensionMapping +DimensionMappings +DimensionName +DimensionNameValue +DimensionType +DimensionValue +DimensionValueAttributes +DimensionValueContribution +DimensionValueContributionList +DimensionValueList +DimensionValueSource +DimensionValueType +DimensionValues +DimensionValuesWithAttributes +DimensionalValueCount +Dimensions +DirectConnectClientException +DirectConnectGateway +DirectConnectGatewayAssociation +DirectConnectGatewayAssociationProposal +DirectConnectGatewayAttachment +DirectConnectServerException +DirectInternetAccess +DirectJDBCSource +DirectKafkaSource +DirectKinesisSource +DirectMessageConfiguration +DirectPathNoLog +DirectPathParallelLoad +DirectPutContent +DirectSchemaChangePolicy +Direction +Directionality +Directories +Directory +DirectoryAlreadyExistsException +DirectoryAlreadyInRegionException +DirectoryAlreadySharedException +DirectoryArn +DirectoryConfig +DirectoryConfigs +DirectoryConnectSettings +DirectoryConnectSettingsDescription +DirectoryDeletedException +DirectoryDescription +DirectoryDescriptions +DirectoryDoesNotExistException +DirectoryId +DirectoryIds +DirectoryInDesiredStateException +DirectoryInUseException +DirectoryInformation +DirectoryLimitExceededException +DirectoryLimits +DirectoryMode +DirectoryName +DirectoryNameConflictsWithFileNameException +DirectoryNames +DirectoryNotDisabledException +DirectoryNotEnabledException +DirectoryNotSharedException +DirectoryPath +DirectoryRegistration +DirectoryRegistrationArn +DirectoryRegistrationSummary +DirectoryRegistrations +DirectoryServiceAuthentication +DirectoryServiceAuthenticationFailedException +DirectoryServiceAuthenticationRequest +DirectoryStructure +DirectoryType +DirectoryUnavailableException +DirectoryUserId +DirectoryVpcSettings +DirectoryVpcSettingsDescription +DisableAWSServiceAccessRequest +DisableActionConfiguration +DisableAddOnRequest +DisableAddOnResult +DisableAddressTransferRequest +DisableAddressTransferResult +DisableAlarmActionRequest +DisableAlarmActionsInput +DisableApiStop +DisableApiTermination +DisableApplicationLayerAutomaticResponseRequest +DisableAutomatedBackup +DisableAwsNetworkPerformanceMetricSubscriptionRequest +DisableAwsNetworkPerformanceMetricSubscriptionResult +DisableClientAuthenticationRequest +DisableControlInput +DisableControlOutput +DisableDelegatedAdminAccountRequest +DisableDelegatedAdminAccountResponse +DisableDirectoryRequest +DisableDirectoryResponse +DisableDomain +DisableDomainAutoRenewRequest +DisableDomainTransferLockRequest +DisableDomainTransferLockResponse +DisableDynamicScaling +DisableEbsEncryptionByDefaultRequest +DisableEbsEncryptionByDefaultResult +DisableEmailNotification +DisableEnhancedMonitoringInput +DisableExecuteApiEndpoint +DisableFastLaunchRequest +DisableFastLaunchResult +DisableFastSnapshotRestoreErrorItem +DisableFastSnapshotRestoreStateError +DisableFastSnapshotRestoreStateErrorItem +DisableFastSnapshotRestoreSuccessItem +DisableFastSnapshotRestoresRequest +DisableFastSnapshotRestoresResult +DisableGatewayInput +DisableGatewayOutput +DisableGlueTableCreation +DisableHostedZoneDNSSECRequest +DisableHostedZoneDNSSECResponse +DisableImageBlockPublicAccessRequest +DisableImageBlockPublicAccessResult +DisableImageDeprecationRequest +DisableImageDeprecationResult +DisableImportFindingsForProductRequest +DisableIndexing +DisableInsightRulesInput +DisableInsightRulesOutput +DisableIpamOrganizationAdminAccountRequest +DisableIpamOrganizationAdminAccountResult +DisableKeyRequest +DisableKeyRotationRequest +DisableLDAPSRequest +DisableLniAtDeviceIndex +DisableLocalGroups +DisableLogTypes +DisableLoggingMessage +DisableMetricsCollectionQuery +DisableNetworking +DisableOrganizationAdminAccountRequest +DisablePolicyTypeRequest +DisablePolicyTypeResponse +DisableProfiler +DisableRadiusRequest +DisableRegionRequest +DisableRemoteControl +DisableRequest +DisableResponse +DisableRollback +DisableRuleRequest +DisableScaleIn +DisableSchemaValidation +DisableSerialConsoleAccessRequest +DisableSerialConsoleAccessResult +DisableSnapshotCopyMessage +DisableSnapshotCopyResult +DisableSsl +DisableSsoRequest +DisableStageTransitionInput +DisableTemplateValidation +DisableTopicRuleRequest +DisableTransitGatewayRouteTablePropagationRequest +DisableTransitGatewayRouteTablePropagationResult +DisableUseAsDirectQuerySource +DisableUseAsImportedSource +DisableUserRequest +DisableUserResponse +DisableValueTrimming +DisableVgwRoutePropagationRequest +DisableVpcClassicLinkDnsSupportRequest +DisableVpcClassicLinkDnsSupportResult +DisableVpcClassicLinkRequest +DisableVpcClassicLinkResult +Disabled +DisabledApiException +DisabledDate +DisabledException +DisabledOperationException +DisabledReason +DisabledTime +DisablingTime +DisallowedCidrs +DisassociateAcceleratorTypes +DisassociateAccountsInput +DisassociateAccountsOutput +DisassociateAdditionalCodeRepositories +DisassociateAddressRequest +DisassociateApiRequest +DisassociateAppBlockBuilderAppBlockRequest +DisassociateApplicationFleetRequest +DisassociateApplicationFromEntitlementRequest +DisassociateApplicationsRequest +DisassociateApprovalRuleTemplateFromRepositoryInput +DisassociateApprovedOriginRequest +DisassociateAssessmentReportEvidenceFolderRequest +DisassociateAssetsRequest +DisassociateAttributeGroupRequest +DisassociateAttributeGroupResponse +DisassociateAwsAccountFromPartnerAccountRequest +DisassociateBotRequest +DisassociateBrowserSettingsRequest +DisassociateBudgetFromResourceInput +DisassociateCertificateRequest +DisassociateChannelFlowRequest +DisassociateClientDeviceFromCoreDeviceEntry +DisassociateClientDeviceFromCoreDeviceErrorEntry +DisassociateClientVpnTargetNetworkRequest +DisassociateClientVpnTargetNetworkResult +DisassociateConfigurationItemsFromApplicationRequest +DisassociateConnectPeerRequest +DisassociateConnectPeerResponse +DisassociateConnectionAliasRequest +DisassociateConnectionFromLagRequest +DisassociateConnectorRequest +DisassociateContactFromAddressBookRequest +DisassociateCreatedArtifactRequest +DisassociateCustomDomainRequest +DisassociateCustomDomainResponse +DisassociateCustomerGatewayRequest +DisassociateCustomerGatewayResponse +DisassociateDRTLogBucketRequest +DisassociateDataShareConsumerMessage +DisassociateDefaultCodeRepository +DisassociateDelegateFromResourceRequest +DisassociateDelegationSignerFromDomainRequest +DisassociateDelegationSignerFromDomainResponse +DisassociateDeviceFromPlacementRequest +DisassociateDeviceFromRoomRequest +DisassociateDiscoveredResourceRequest +DisassociateDomainRequest +DisassociateElasticIpRequest +DisassociateEnclaveCertificateIamRoleRequest +DisassociateEnclaveCertificateIamRoleResult +DisassociateEntireAccount +DisassociateEntitiesFromExperienceRequest +DisassociateEntitiesFromExperienceResponse +DisassociateEnvironmentOperationsRoleMessage +DisassociateExternalConnectionRequest +DisassociateExternalConnectionResult +DisassociateFacesRequest +DisassociateFacesResponse +DisassociateFileSystemAliasesRequest +DisassociateFileSystemAliasesResponse +DisassociateFileSystemInput +DisassociateFileSystemOutput +DisassociateFirewallRuleGroupRequest +DisassociateFirewallRuleGroupResponse +DisassociateFleetRequest +DisassociateFraudsterRequest +DisassociateFraudsterResponse +DisassociateFromAdministratorAccountRequest +DisassociateFromMasterAccountRequest +DisassociateGatewayFromServerInput +DisassociateGatewayFromServerOutput +DisassociateGlobalReplicationGroupMessage +DisassociateGlobalReplicationGroupResult +DisassociateHealthCheckRequest +DisassociateIamInstanceProfileRequest +DisassociateIamInstanceProfileResult +DisassociateIdentityProviderConfigRequest +DisassociateIdentityProviderConfigResponse +DisassociateInstanceEventWindowRequest +DisassociateInstanceEventWindowResult +DisassociateInstanceStorageConfigRequest +DisassociateIpAccessSettingsRequest +DisassociateIpGroupsRequest +DisassociateIpamResourceDiscoveryRequest +DisassociateIpamResourceDiscoveryResult +DisassociateKmsKeyRequest +DisassociateLambdaFunctionRequest +DisassociateLensesInput +DisassociateLexBotRequest +DisassociateLicenseRequest +DisassociateLicenseResponse +DisassociateLifecycleConfig +DisassociateLinkRequest +DisassociateLinkResponse +DisassociateMacSecKeyRequest +DisassociateMacSecKeyResponse +DisassociateMemberAccountRequest +DisassociateMemberFromGroupRequest +DisassociateMemberRequest +DisassociateMemberResponse +DisassociateMembersRequest +DisassociateMembersResponse +DisassociateMembershipRequest +DisassociateMergedGraphqlApiRequest +DisassociateMergedGraphqlApiResponse +DisassociateMulticastGroupFromFuotaTaskRequest +DisassociateNatGatewayAddressRequest +DisassociateNatGatewayAddressResult +DisassociateNetworkSettingsRequest +DisassociateNodeRequest +DisassociateNodeResponse +DisassociateOpsItemRelatedItemRequest +DisassociateOriginationIdentityRequest +DisassociateOriginationIdentityResult +DisassociatePersonasFromEntitiesRequest +DisassociatePersonasFromEntitiesResponse +DisassociatePhoneNumberContactFlowRequest +DisassociatePhoneNumberFromUserRequest +DisassociatePhoneNumbersFromVoiceConnectorGroupRequest +DisassociatePhoneNumbersFromVoiceConnectorGroupResponse +DisassociatePhoneNumbersFromVoiceConnectorRequest +DisassociatePhoneNumbersFromVoiceConnectorResponse +DisassociatePricingRulesInput +DisassociatePricingRulesOutput +DisassociatePrincipalFromPortfolioInput +DisassociateProductFromPortfolioInput +DisassociateProfilesInput +DisassociateQualificationFromWorkerRequest +DisassociateQueueQuickConnectsRequest +DisassociateRecoveryPointFromParentInput +DisassociateRecoveryPointInput +DisassociateRepositoryRequest +DisassociateRepositoryResponse +DisassociateResolverEndpointIpAddressRequest +DisassociateResolverEndpointIpAddressResponse +DisassociateResolverQueryLogConfigRequest +DisassociateResolverQueryLogConfigResponse +DisassociateResolverRuleRequest +DisassociateResolverRuleResponse +DisassociateResourceRequest +DisassociateResourceResponse +DisassociateResourceResponseElement +DisassociateResourceSharePermissionRequest +DisassociateResourceSharePermissionResponse +DisassociateResourceShareRequest +DisassociateResourceShareResponse +DisassociateRoleFromGroupRequest +DisassociateRoleFromGroupResponse +DisassociateRouteTableRequest +DisassociateRoutingProfileQueuesRequest +DisassociateS3ResourcesRequest +DisassociateS3ResourcesResult +DisassociateSchedule +DisassociateSecurityKeyRequest +DisassociateServiceActionFromProvisioningArtifactInput +DisassociateServiceRoleFromAccountResponse +DisassociateSigninDelegateGroupsFromAccountRequest +DisassociateSkillFromSkillGroupRequest +DisassociateSkillFromUsersRequest +DisassociateSkillGroupFromRoomRequest +DisassociateSourceGraphqlApiRequest +DisassociateSourceGraphqlApiResponse +DisassociateSourceServersRequest +DisassociateSubnetCidrBlockRequest +DisassociateSubnetCidrBlockResult +DisassociateSubnetsRequest +DisassociateSubnetsResponse +DisassociateTagOptionFromResourceInput +DisassociateTeamMemberRequest +DisassociateThirdPartyFirewallRequest +DisassociateThirdPartyFirewallResponse +DisassociateTimeSeriesFromAssetPropertyRequest +DisassociateTrackerConsumerRequest +DisassociateTrafficDistributionGroupUserRequest +DisassociateTransitGatewayConnectPeerRequest +DisassociateTransitGatewayConnectPeerResponse +DisassociateTransitGatewayMulticastDomainRequest +DisassociateTransitGatewayMulticastDomainResult +DisassociateTransitGatewayPolicyTableRequest +DisassociateTransitGatewayPolicyTableResult +DisassociateTransitGatewayRouteTableRequest +DisassociateTransitGatewayRouteTableResult +DisassociateTrialComponentRequest +DisassociateTrialComponentResponse +DisassociateTrunkInterfaceRequest +DisassociateTrunkInterfaceResult +DisassociateTrustStoreRequest +DisassociateUserAccessLoggingSettingsRequest +DisassociateUserFromPermissionGroupRequest +DisassociateUserFromPermissionGroupResponse +DisassociateUserRequest +DisassociateUserResponse +DisassociateUserSettingsRequest +DisassociateVPCFromHostedZoneRequest +DisassociateVPCFromHostedZoneResponse +DisassociateVehicleFleetRequest +DisassociateVpcCidrBlockRequest +DisassociateVpcCidrBlockResult +DisassociateWebACLRequest +DisassociateWebsiteAuthorizationProviderRequest +DisassociateWebsiteCertificateAuthorityRequest +DisassociateWhenNotFound +DisassociateWirelessDeviceFromFuotaTaskRequest +DisassociateWirelessDeviceFromMulticastGroupRequest +DisassociateWirelessDeviceFromThingRequest +DisassociateWirelessGatewayFromCertificateRequest +DisassociateWirelessGatewayFromThingRequest +DisassociatedAt +DisassociatedFace +DisassociatedFaces +DisassociationDate +DiscardedFiles +DisconnectCustomKeyStoreRequest +DisconnectFailures +DisconnectFromServiceRequest +DisconnectParticipantRequest +DisconnectPlayerRequest +DisconnectPlayerResult +DisconnectRecoveryInstanceRequest +DisconnectSourceServerRequest +DisconnectSuccesses +DisconnectTimeoutInSeconds +DisconnectTimestamp +DisconnectUserRequest +DisconnectionEvent +DiscontinuityMode +DiscontinuityTags +DiscoverDynamicCardVerificationCode +DiscoverInputSchemaRequest +DiscoverInputSchemaResponse +DiscoverInstancesRequest +DiscoverInstancesResponse +DiscoverInstancesRevisionRequest +DiscoverInstancesRevisionResponse +DiscoverPollEndpointRequest +DiscoverPollEndpointResponse +DiscoveredResource +DiscoveredResourceList +DiscovererArn +DiscovererId +DiscovererIdPrefix +DiscovererSummary +Discoverers +DiscoveryConfig +DiscoveryData +DiscoveryIntegrationStatus +DiscoveryJobArn +DiscoveryJobListEntry +DiscoveryJobs +DiscoveryRegion +DiscoveryServerConfiguration +DiscoveryStatus +DiscoveryType +Disk +DiskAllocationResource +DiskAllocationType +DiskAttributeList +DiskContainer +DiskContainers +DiskId +DiskIds +DiskImage +DiskImageDescription +DiskImageDetail +DiskImageFormat +DiskImageSize +DiskImageVolumeDescription +DiskImages +DiskInfo +DiskIopsConfiguration +DiskMap +DiskNode +DiskPath +DiskReadBytesPerSecond +DiskReadOpsPerSecond +DiskResourceUtilization +DiskSizeInBytes +DiskSnapshot +DiskSnapshotInfo +DiskStatus +DiskWriteBytesPerSecond +DiskWriteOpsPerSecond +Disks +DismissUserContactRequest +DisplayAs +DisplayAspectRatio +DisplayConfiguration +DisplayData +DisplayFormat +DisplayFormatOptions +DisplayFragmentNumber +DisplayFragmentTimestamp +DisplayLabel +DisplayLanguageCode +DisplayMode +DisplayName +DisplayNamePrefix +DisplayOptions +DisplayOrder +DisplayText +Displayable +DisposePackageVersionsRequest +DisposePackageVersionsResult +DisruptionCompliance +DissociateEntityFromThingRequest +DissociatePackageRequest +DissociatePackageResponse +Distance +DistanceUnit +DistinguishedNameQualifier +DistributeDataset +DistributeDatasetEntriesRequest +Distribution +DistributionAlreadyExists +DistributionBundle +DistributionConfig +DistributionConfigWithTags +DistributionConfiguration +DistributionConfigurationSummary +DistributionId +DistributionIdList +DistributionList +DistributionNotDisabled +DistributionSummary +Distributions +Distributor +DistributorId +DistrictOrCounty +DkimAttributes +DkimEnabled +DkimPercentage +DkimSigningAttributes +DkimStatus +DkimTokens +DkimVerificationStatus +DlBucketSize +DlClass +DlDr +DlFreq +DlRate +DlRatePolicy +DlqEventQueueArn +DmsTransferSettings +Dns +DnsAddresses +DnsConfig +DnsConfigChange +DnsDuplicateRuleGroupViolation +DnsEntries +DnsEntry +DnsIpAddr +DnsIpAddresses +DnsIpAddrs +DnsIps +DnsLogs +DnsName +DnsNameServers +DnsOptions +DnsOptionsSpecification +DnsProperties +DnsRecord +DnsRecordCreationState +DnsRecordIpType +DnsRecords +DnsRequestAction +DnsResolvers +DnsRuleGroupLimitExceededViolation +DnsRuleGroupPriorityConflictViolation +DnsSearchDomains +DnsSec +DnsServers +DnsServersOptionsModifyStructure +DnsServiceDiscovery +DnsSupport +DnsTargetResource +DnssecKey +DnssecKeys +DnssecLimitExceeded +DnssecSigningAttributes +DocDbDataProviderSettings +DocDbSettings +DocService +DockerLabels +DockerSecurityOptions +DockerVolumeConfiguration +DocsToInvestigate +Document +DocumentAlreadyExists +DocumentAttribute +DocumentAttributeCondition +DocumentAttributeKey +DocumentAttributeTarget +DocumentAttributeValue +DocumentAttributeValueCountPair +DocumentAttributeValueCountPairs +DocumentAttributeValueType +DocumentAttributes +DocumentClass +DocumentClassificationConfig +DocumentClassificationJobFilter +DocumentClassificationJobProperties +DocumentClassificationJobPropertiesList +DocumentClassifierArn +DocumentClassifierDocuments +DocumentClassifierFilter +DocumentClassifierInputDataConfig +DocumentClassifierName +DocumentClassifierOutputDataConfig +DocumentClassifierProperties +DocumentClassifierPropertiesList +DocumentClassifierSummariesList +DocumentClassifierSummary +DocumentContentDeletion +DocumentDBEventSourceConfig +DocumentDataColumnName +DocumentDataFieldName +DocumentDefaultVersionDescription +DocumentDescription +DocumentExcerpt +DocumentFilter +DocumentFilterList +DocumentFormat +DocumentGroup +DocumentGroups +DocumentHash +DocumentHashType +DocumentId +DocumentIdColumnName +DocumentIdList +DocumentIdOptions +DocumentIdentifier +DocumentIdentifiers +DocumentIndex +DocumentInfo +DocumentInfoList +DocumentKeyValuesFilter +DocumentLabel +DocumentLibraryFieldMappings +DocumentLimitExceeded +DocumentLocation +DocumentLockedForCommentsException +DocumentMetadata +DocumentMetadataConfiguration +DocumentMetadataConfigurationUpdates +DocumentMetadataConfigurations +DocumentMetadataResponseInfo +DocumentName +DocumentPages +DocumentParameter +DocumentPermissionLimit +DocumentReadAction +DocumentReadMode +DocumentReaderConfig +DocumentRelevanceConfiguration +DocumentRelevanceOverrideConfigurations +DocumentRequires +DocumentReviewCommentSource +DocumentReviewerResponseSource +DocumentReviews +DocumentSchemaVersion +DocumentServiceException +DocumentServiceWarning +DocumentSizeInBytes +DocumentStatus +DocumentStatusList +DocumentSuggesterOptions +DocumentText +DocumentTitle +DocumentTitleColumnName +DocumentTitleFieldName +DocumentTooLargeException +DocumentType +DocumentTypeListItem +DocumentURI +DocumentVersion +DocumentVersionInfo +DocumentVersionLimitExceeded +DocumentVersionMetadata +DocumentVersions +DocumentationPart +DocumentationPartIds +DocumentationPartLocation +DocumentationParts +DocumentationUrl +DocumentationVersion +DocumentationVersions +Documents +DocumentsAdded +DocumentsDeleted +DocumentsFailed +DocumentsMetadataConfiguration +DocumentsModified +DocumentsScanned +DocumentsWithErrorsCount +DoesNotExistException +DolbyEDecode +DolbyVision +DolbyVision81Settings +DolbyVisionLevel6Metadata +DolbyVisionMetadataXml +Dollars +Domain +DomainARN +DomainAlreadyExistsFault +DomainArn +DomainAssociation +DomainAuthSecretArn +DomainCertificateArn +DomainConfig +DomainConfiguration +DomainConfigurationSummary +DomainController +DomainControllerId +DomainControllerIds +DomainControllerLimitExceededException +DomainControllers +DomainCount +DomainDeliverabilityCampaign +DomainDeliverabilityCampaigns +DomainDeliverabilityTrackingOption +DomainDeprecatedFault +DomainDescription +DomainDescriptionType +DomainDetail +DomainDetails +DomainDnsIps +DomainEndpoint +DomainEndpointOptions +DomainEndpointOptionsStatus +DomainEndpoints +DomainEntry +DomainEntryPoint +DomainExecutionRoleArn +DomainFileUrl +DomainFqdn +DomainIAMRoleName +DomainId +DomainIdEquals +DomainInfo +DomainInformation +DomainInformationContainer +DomainInfos +DomainIspPlacement +DomainIspPlacements +DomainJoinInfo +DomainLimitExceeded +DomainMembership +DomainMemberships +DomainName +DomainNameConfig +DomainNameConfiguration +DomainNameConfigurations +DomainNameStatus +DomainNameStatusMessage +DomainNames +DomainNodesStatus +DomainNodesStatusList +DomainNotFoundFault +DomainNotWhitelistedException +DomainOu +DomainPackageDetails +DomainPackageDetailsList +DomainPackageStatus +DomainPrefix +DomainPrice +DomainSettings +DomainSettingsForUpdate +DomainSigningPrivateKey +DomainSigningSelector +DomainState +DomainStats +DomainStatus +DomainStatusList +DomainSuggestion +DomainSummaries +DomainSummary +DomainTransferability +DomainValidation +DomainValidationOption +DomainValidationOptions +DomainValidationRecord +Domains +DominantColor +DominantColors +DominantLanguage +DominantLanguageDetectionJobFilter +DominantLanguageDetectionJobProperties +DominantLanguageDetectionJobPropertiesList +DonutCenterOptions +DonutOptions +DoubleArrayOptions +DoubleColumnStatisticsData +DoubleOptions +DoubleRange +DoubleValue +DownScaling +DownlinkFrequency +DownlinkMode +DownlinkQueueMessage +DownlinkQueueMessagesList +DownloadDBLogFilePortionDetails +DownloadDBLogFilePortionMessage +DownloadDefaultKeyPairResult +DownloadSpeed +DownloadUri +DownloadUrl +DownmixControl +DpdTimeoutAction +DpdTimeoutSeconds +DpuExecutionInMillis +DrMax +DrMin +DraftUploadOutOfSyncException +DrcLine +DrcProfile +DrcRf +DriftCheckBaselines +DriftCheckBias +DriftCheckExplainability +DriftCheckModelDataQuality +DriftCheckModelQuality +DriftDetectionStatus +DriftInformation +DriftStatus +DriftedStackInstancesCount +DriftedStackResourceCount +DrillDownFilter +DrillDownFilters +DriveCacheType +Driver +DriverOpts +DrmSystems +Drop +DropDownControlDisplayOptions +DropDuplicates +DropFields +DropFrameTimecode +DropNullFields +Dropdown +Dropped +DryRun +DryRunConfig +DryRunId +DryRunMode +DryRunOperation +DryRunOperationException +DryRunProgressStatus +DryRunResults +DryRunStatus +DualStackDnsName +DukptAttributes +DukptDerivationAttributes +DukptDerivationType +DukptEncryptionAttributes +DukptKeyDerivationType +DukptKeyVariant +DuplicateAccessPointNameException +DuplicateAccountException +DuplicateCertificateException +DuplicateDocumentContent +DuplicateDocumentVersionName +DuplicateHandshakeException +DuplicateItemException +DuplicateListenerException +DuplicateLoadBalancerNameException +DuplicateOperationId +DuplicateOrganizationalUnitException +DuplicatePolicyAttachmentException +DuplicatePolicyException +DuplicatePolicyNameException +DuplicateProviderException +DuplicateRecordException +DuplicateRegistrationAction +DuplicateReportNameException +DuplicateRequest +DuplicateRequestException +DuplicateResourceException +DuplicateSSHPublicKeyException +DuplicateTagKeysException +DuplicateTargetGroupNameException +DuplicateTimestamps +DuplicateUserNameFault +DuplicatedAuditEventId +DuplicatedStopRequestException +Duration +DurationFrames +DurationHistogram +DurationInMinutes +DurationInMs +DurationInSeconds +DurationInYears +DurationMillis +DurationMinutes +DurationMode +DurationRange +DurationSMPTE +DurationSeconds +DurationSinceLastAccess +DurationUnits +DvbNitSettings +DvbSdtSettings +DvbSubDestinationSettings +DvbSubPids +DvbSubSourceSettings +DvbTdtSettings +DvbTeletextPid +DynamicCardVerificationCode +DynamicCardVerificationValue +DynamicConfiguration +DynamicDefaultValue +DynamicPartitioningConfiguration +DynamicRangeCompressionLine +DynamicRangeCompressionProfile +DynamicRangeCompressionRf +DynamicRangeControl +DynamicRouting +DynamicScalingConfiguration +DynamicScalingInSuspended +DynamicScalingOutSuspended +DynamicSubGop +DynamicTransform +DynamicValue +DynamicVariable +DynamicVariables +DynamoDB +DynamoDBAction +DynamoDBCatalogSource +DynamoDBStreamParameters +DynamoDBTarget +DynamoDBTargets +DynamoDBv2Action +DynamoDbSettings +DynamodbDataSourceConfig +Dynatrace +DynatraceConnectorProfileCredentials +DynatraceConnectorProfileProperties +DynatraceSourceProperties +E164PhoneNumber +E164PhoneNumbers +EBSEnabled +EBSFilter +EBSOptions +EBSOptionsStatus +EBSResourceUtilization +EBSStorageInfo +EBSUtilizationMetric +EC2AccessDeniedException +EC2AssociateRouteTableAction +EC2Capacities +EC2Capacity +EC2CopyRouteTableAction +EC2CreateRouteAction +EC2CreateRouteTableAction +EC2DeleteRouteAction +EC2ErrorCode +EC2FamilyFilter +EC2InboundPermissions +EC2InstanceCounts +EC2InstanceDetails +EC2InstanceId +EC2InstanceIdsToTerminate +EC2InstanceLimit +EC2InstanceLimits +EC2InstanceNotFoundException +EC2InstanceStateInvalidException +EC2InstanceType +EC2InstanceTypeInvalidException +EC2InstanceUnavailableException +EC2ReplaceRouteAction +EC2ReplaceRouteTableAssociationAction +EC2ResourceDetails +EC2ResourceUtilization +EC2SecurityGroup +EC2SecurityGroupId +EC2SecurityGroupName +EC2SecurityGroupOwnerId +EC2SecurityGroups +EC2Specification +EC2TagFilter +EC2TagSet +EC2ThrottledException +EC2UnexpectedException +ECSService +ECSServiceMappingLimitExceededException +ECSServiceProjectedMetric +ECSServiceProjectedUtilizationMetric +ECSServiceRecommendation +ECSServiceRecommendationFilter +ECSServiceRecommendationOption +ECSServiceRecommendedOptionProjectedMetric +ECSServiceUtilizationMetric +ECSTarget +ECSTaskSet +EDNS0ClientSubnetIP +EDNS0ClientSubnetMask +EFSAuthorizationConfig +EFSIOException +EFSMountConnectivityException +EFSMountFailureException +EFSMountTimeoutException +EFSVolumeConfiguration +EKSAnywhereVersion +EKSOnDeviceService +EKSOnDeviceServiceConfiguration +ELBInfo +EMAIL +EMR +EMRStepMetadata +ENILimitReachedException +EQ +ESInstanceDetails +ETag +Eac3AtmosSettings +Eac3Settings +EapMethod +Earfcn +EarliestBacktrackTime +EarliestRestorableDateTime +EarliestRestorableTime +EarliestTime +EarthObservationJobErrorDetails +EarthObservationJobSummaries +East +Ebif +EbpAudioInterval +EbpLookaheadMs +EbpPlacement +Ebs +EbsBlockDevice +EbsBlockDeviceConfig +EbsBlockDeviceConfigs +EbsBlockDevices +EbsCause +EbsConfiguration +EbsEncryptionByDefault +EbsEvent +EbsInfo +EbsInstanceBlockDevice +EbsInstanceBlockDeviceSpecification +EbsOptimized +EbsOptimizedAvailable +EbsOptimizedByDefault +EbsOptimizedInfo +EbsOptimizedSupport +EbsReadBytesPerSecond +EbsReadOpsPerSecond +EbsRequestId +EbsResult +EbsRootVolumeSize +EbsSnapshotConfiguration +EbsSnapshotPreservation +EbsStorageInfo +EbsStorageOnly +EbsVolume +EbsVolumeDetails +EbsVolumeScanDetails +EbsVolumes +EbsVolumesResult +EbsWriteBytesPerSecond +EbsWriteOpsPerSecond +EbuTtDDestinationSettings +Ec2AmiResource +Ec2AmiResources +Ec2AvailabilityZone +Ec2Config +Ec2Configuration +Ec2ImageId +Ec2ImagePropertiesNotSupportedFault +Ec2InstanceAggregation +Ec2InstanceAggregationResponse +Ec2InstanceAttributes +Ec2InstanceConnectEndpoint +Ec2InstanceId +Ec2InstanceIds +Ec2InstanceRegion +Ec2KeyName +Ec2Metadata +Ec2RecommendationsExportPreferences +Ec2RequestFailedException +Ec2SecurityGroupId +Ec2SecurityGroupName +Ec2SecurityGroupOwnerId +Ec2SecurityGroups +Ec2State +Ec2SubnetId +Ec2SubnetIds +Ec2VolumeId +EchoReduction +EcmPid +EcrConfiguration +EcrConfigurationState +EcrContainerImageMetadata +EcrRepositoryConfiguration +EcrRepositoryMetadata +EcrRescanDurationState +EcsCluster +EcsClusterArn +EcsClusterArns +EcsClusterDetails +EcsClusterName +EcsClusters +EcsContainerInstanceArn +EcsContainerOverride +EcsEnvironmentFile +EcsEnvironmentVariable +EcsEphemeralStorage +EcsInferenceAcceleratorOverride +EcsParameters +EcsResourceRequirement +EcsTaskDetails +EcsTaskOverride +EcsTaskParameters +Edge +EdgeAgentStatus +EdgeConfig +EdgeConfigs +EdgeDeployment +EdgeDeploymentConfig +EdgeDeploymentFailed +EdgeDeploymentFailedInStage +EdgeDeploymentModelConfig +EdgeDeploymentPending +EdgeDeploymentPendingInStage +EdgeDeploymentPlanArn +EdgeDeploymentPlanName +EdgeDeploymentPlanSummaries +EdgeDeploymentPlanSummary +EdgeDeploymentStageStartTime +EdgeDeploymentStatus +EdgeDeploymentStatusMessage +EdgeDeploymentSuccess +EdgeDeploymentSuccessInStage +EdgeLocation +EdgeLocations +EdgeMetric +EdgeModel +EdgeModelStat +EdgeModelSummary +EdgeOutputConfig +EdgePackagingJobArn +EdgePackagingJobName +EdgePackagingJobStatus +EdgePackagingJobStatusMessage +EdgePackagingJobSummaries +EdgePackagingJobSummary +EdgePresetDeploymentOutput +EdgeRetentionInHours +EdgeStatistics +EdgeStructure +EdgeSummaryStatistics +EdgeType +Edges +EdiPartyName +Edition +EditorId +EfaInfo +EfaSupported +Effect +EffectiveDate +EffectiveDeployment +EffectiveDeploymentStatusDetails +EffectiveEnd +EffectiveEngineVersion +EffectiveOn +EffectivePatch +EffectivePatches +EffectivePermission +EffectivePolicy +EffectivePolicyNotFoundException +EffectiveRecommendationPreferences +EffectiveStart +EfsFileLocation +EfsFileSystemConfiguration +EfsFilesystemArn +EfsStorageConfiguration +EfsVolumeConfiguration +Egress +EgressAccessLogs +EgressBytes +EgressCidrBlocks +EgressConfiguration +EgressDomain +EgressEndpoint +EgressEndpoints +EgressFilter +EgressFilterRules +EgressGatewayBridge +EgressIp +EgressOnlyInternetGateway +EgressOnlyInternetGatewayId +EgressOnlyInternetGatewayIds +EgressOnlyInternetGateways +EgressPackets +EgressType +Eirp +EksAttemptContainerDetail +EksAttemptDetail +EksClusterDetails +EksConfiguration +EksContainer +EksContainerDetail +EksContainerEnvironmentVariable +EksContainerOverride +EksContainerResourceRequirements +EksContainerSecurityContext +EksContainerVolumeMount +EksEmptyDir +EksHostPath +EksInfo +EksMetadata +EksPodProperties +EksPodPropertiesDetail +EksPodPropertiesOverride +EksProperties +EksPropertiesDetail +EksPropertiesOverride +EksSecret +EksSource +EksSourceClusterNamespace +EksVolume +ElapsedTimeInActiveSeconds +ElapsedTimeInSeconds +ElapsedTimeMillis +ElastiCacheInstanceDetails +ElasticBeanstalkServiceException +ElasticChannelConfiguration +ElasticGpuAssociation +ElasticGpuAssociationId +ElasticGpuAssociationState +ElasticGpuAssociationTime +ElasticGpuAssociations +ElasticGpuHealth +ElasticGpuId +ElasticGpuIds +ElasticGpuSet +ElasticGpuSpecification +ElasticGpuSpecificationResponse +ElasticGpuSpecificationSet +ElasticGpuSpecifications +ElasticGpuState +ElasticGpuType +ElasticGpus +ElasticInferenceAccelerator +ElasticInferenceAcceleratorArn +ElasticInferenceAcceleratorAssociation +ElasticInferenceAcceleratorAssociationId +ElasticInferenceAcceleratorAssociationState +ElasticInferenceAcceleratorAssociationTime +ElasticInferenceAcceleratorAssociations +ElasticInferenceAcceleratorHealth +ElasticInferenceAcceleratorSet +ElasticInferenceAccelerators +ElasticIp +ElasticIpStatus +ElasticIps +ElasticLoadBalancer +ElasticLoadBalancerListener +ElasticLoadBalancerName +ElasticLoadBalancers +ElasticResizeNumberOfNodeOptions +ElasticsearchAction +ElasticsearchBufferingHints +ElasticsearchClusterConfig +ElasticsearchClusterConfigStatus +ElasticsearchDataSourceConfig +ElasticsearchDestinationConfiguration +ElasticsearchDestinationDescription +ElasticsearchDestinationUpdate +ElasticsearchDomainConfig +ElasticsearchDomainStatus +ElasticsearchInstanceCount +ElasticsearchInstanceType +ElasticsearchInstanceTypes +ElasticsearchRetryOptions +ElasticsearchSettings +ElasticsearchVersion +ElasticsearchVersionStatus +ElasticsearchVersions +Element +ElementId +ElementName +ElementPath +ElementStatuses +ElementType +Elements +Elevation +ElicitSubSlot +ElicitationCodeHookInvocationSetting +EligibleForReplication +Email +EmailAddress +EmailAddressInUseException +EmailChannelRequest +EmailChannelResponse +EmailConfiguration +EmailConfigurationFailure +EmailConfigurationType +EmailContent +EmailField +EmailForwardingEnabled +EmailIdentities +EmailIdentity +EmailInsights +EmailMessage +EmailMessageActivity +EmailMessageByLink +EmailRecipients +EmailReference +EmailSendingAccount +EmailSettings +EmailStatus +EmailSubject +EmailSubjectByLink +EmailTags +EmailTemplate +EmailTemplateContent +EmailTemplateMetadata +EmailTemplateRequest +EmailTemplateResponse +EmailVerificationMessage +EmailVerificationSubject +Emails +EmbedHostDomains +EmbedUrl +EmbeddedDestinationSettings +EmbeddedPlusScte20DestinationSettings +EmbeddedSourceSettings +EmbeddedTimecodeOverride +EmergencyCallingConfiguration +EmergencyContact +EmergencyContactList +EmergencyPhoneNumber +EmitConsumerLagMetrics +EmitInterval +Emotion +Emotions +EmptyAsNull +EmptyBatchRequestException +EmptyFillColor +EmptyUploadException +EmptyVisual +EmrManagedMasterSecurityGroup +EmrManagedSlaveSecurityGroup +EnaSrdEnabled +EnaSrdSpecification +EnaSrdSupported +EnaSrdUdpEnabled +EnaSrdUdpSpecification +EnaSupport +Enable +EnableAWSServiceAccessRequest +EnableAcceleration +EnableAcceptEncodingBrotli +EnableAcceptEncodingGzip +EnableActionConfiguration +EnableAddOnRequest +EnableAddOnResult +EnableAdditionalMetadata +EnableAddressTransferRequest +EnableAddressTransferResult +EnableAlarmActionRequest +EnableAlarmActionsInput +EnableAllFeaturesResponse +EnableAllOpsDataSources +EnableAnswerMachineDetection +EnableApplicationLayerAutomaticResponseRequest +EnableAutoHealing +EnableAwsNetworkPerformanceMetricSubscriptionRequest +EnableAwsNetworkPerformanceMetricSubscriptionResult +EnableCapture +EnableCaseSensitiveIdentifier +EnableChannelIdentification +EnableClientAuthenticationRequest +EnableCloudwatchLogsExports +EnableContinuousBackup +EnableControlInput +EnableControlOutput +EnableCrossAccountsDiscovery +EnableCustomerOwnedIp +EnableDate +EnableDebugLogDelivery +EnableDefaultInternetAccess +EnableDefaultStandards +EnableDelegatedAdminAccountRequest +EnableDelegatedAdminAccountResponse +EnableDialOut +EnableDictionaryCompression +EnableDirectoryRequest +EnableDirectoryResponse +EnableDns64 +EnableDnsHostnames +EnableDnsSupport +EnableDomainAutoRenewRequest +EnableDomainTransferLockRequest +EnableDomainTransferLockResponse +EnableDynamicFieldUpdate +EnableECSManagedTags +EnableEbsEncryptionByDefaultRequest +EnableEbsEncryptionByDefaultResult +EnableEcsManagedTags +EnableEnhancedMonitoringInput +EnableExecuteCommand +EnableExplanations +EnableFastLaunchRequest +EnableFastLaunchResult +EnableFastSnapshotRestoreErrorItem +EnableFastSnapshotRestoreStateError +EnableFastSnapshotRestoreStateErrorItem +EnableFastSnapshotRestoreSuccessItem +EnableFastSnapshotRestoresRequest +EnableFastSnapshotRestoresResult +EnableGlobalWriteForwarding +EnableHomogenousTablespace +EnableHostedZoneDNSSECRequest +EnableHostedZoneDNSSECResponse +EnableHttpEndpoint +EnableHybrid +EnableIAMDatabaseAuthentication +EnableImageBlockPublicAccessRequest +EnableImageBlockPublicAccessResult +EnableImageDeprecationRequest +EnableImageDeprecationResult +EnableImportFindingsForProductRequest +EnableImportFindingsForProductResponse +EnableInsightRulesInput +EnableInsightRulesOutput +EnableIntegration +EnableInterContainerTrafficEncryption +EnableInternetAccess +EnableInteroperability +EnableIoTLoggingParams +EnableIotRoleAlias +EnableIpamOrganizationAdminAccountRequest +EnableIpamOrganizationAdminAccountResult +EnableKeyRequest +EnableKeyReuseOnNtTokenKeysetStorageFull +EnableKeyRotationRequest +EnableLDAPSRequest +EnableLniAtDeviceIndex +EnableLocalWriteForwarding +EnableLogFileValidation +EnableLogTypes +EnableLoggingMessage +EnableMFADeviceRequest +EnableMachineLearning +EnableMacieRequest +EnableMagneticStoreWrites +EnableMaintenanceMode +EnableManagedSpotTraining +EnableManifestOutput +EnableMediaMetricLogs +EnableMetricsCollectionQuery +EnableMinimumEncryptionConfiguration +EnableNetworkAddressUsageMetrics +EnableNetworkIsolation +EnableNonSecurity +EnableOnlineStore +EnableOrganizationAdminAccountRequest +EnablePadding +EnablePartialResultsStabilization +EnablePerformanceInsights +EnablePolicyTypeRequest +EnablePolicyTypeResponse +EnablePrimaryIpv6 +EnablePropagateAdditionalUserContextData +EnableRadiusRequest +EnableReachabilityAnalyzerOrganizationSharingRequest +EnableReachabilityAnalyzerOrganizationSharingResult +EnableRegexInPath +EnableRegionRequest +EnableRequest +EnableResourceNameDnsAAAARecord +EnableResourceNameDnsAAAARecordOnLaunch +EnableResourceNameDnsARecord +EnableResourceNameDnsARecordOnLaunch +EnableResponse +EnableRuleRequest +EnableSIPLogs +EnableSNI +EnableSSMAccess +EnableSageMakerMetricsTimeSeries +EnableSamplePath +EnableSecurityHubRequest +EnableSelfService +EnableSerialConsoleAccessRequest +EnableSerialConsoleAccessResult +EnableSharingWithAwsOrganizationResponse +EnableSimpleResponses +EnableSipMediaApplicationMessageLogs +EnableSnapshotCopyMessage +EnableSnapshotCopyResult +EnableSoftwareTokenMFAException +EnableSsl +EnableSsoRequest +EnableStageTransitionInput +EnableStatistics +EnableTerminationProtection +EnableTokenRevocation +EnableTopicRuleRequest +EnableTransitGatewayRouteTablePropagationRequest +EnableTransitGatewayRouteTablePropagationResult +EnableTunnelLifecycleControl +EnableUpdateCatalog +EnableUserRequest +EnableUserResponse +EnableVgwRoutePropagationRequest +EnableVisualization +EnableVolumeIORequest +EnableVpcClassicLinkDnsSupportRequest +EnableVpcClassicLinkDnsSupportResult +EnableVpcClassicLinkRequest +EnableVpcClassicLinkResult +EnableWWWSubdomain +EnableWorkDocs +EnableXRay +Enabled +EnabledByDefault +EnabledByMotion +EnabledCloudWatchLogsExports +EnabledCloudwatchLogsExports +EnabledControlSummary +EnabledDate +EnabledInBroker +EnabledMetric +EnabledMetrics +EnabledProtocols +EnabledServicePrincipal +EnabledServicePrincipals +EnabledTime +EnablementType +EnablingTime +EncipherOnly +EnclaveOptions +EnclaveOptionsRequest +EncodedData +EncodedKey +EncodedMessage +EncoderProfile +EncoderSettings +Encoding +EncodingName +EncodingParameters +EncodingParametersRequest +EncodingType +Encrypt +EncryptDataInput +EncryptDataOutput +EncryptRequest +EncryptResponse +Encrypted +EncryptedDecryptionKey +EncryptedKeyMaterial +EncryptedPinBlock +EncryptedWithHSM +Encryption +EncryptionAlgorithm +EncryptionAlgorithmOptions +EncryptionAlgorithms +EncryptionAtRest +EncryptionAtRestOptions +EncryptionAtRestOptionsStatus +EncryptionAttributes +EncryptionConfig +EncryptionConfiguration +EncryptionContext +EncryptionContextEquals +EncryptionContextSubset +EncryptionContractConfiguration +EncryptionDescription +EncryptionDisabled +EncryptionEnabled +EncryptionEntities +EncryptionEntity +EncryptionFailure +EncryptionInTransit +EncryptionInTransitSupported +EncryptionInfo +EncryptionIntegrityChecksFailedException +EncryptionKey +EncryptionKeyAccessDeniedException +EncryptionKeyArn +EncryptionKeyCheckValue +EncryptionKeyDisabledException +EncryptionKeyIdentifier +EncryptionKeyNotFoundException +EncryptionKeyUnavailableException +EncryptionKmsKeyId +EncryptionMethod +EncryptionMode +EncryptionOption +EncryptionOptions +EncryptionPolicyCount +EncryptionSetting +EncryptionSpecification +EncryptionStatus +EncryptionSupport +EncryptionType +End +EndBillingPeriod +EndDate +EndDateTime +EndDateType +EndEventTime +EndFrameNumber +EndHour +EndHourOfDay +EndLine +EndMarker +EndMinuteOfHour +EndMode +EndOfMeetingReminder +EndOffset +EndOffsetChar +EndOffsetMillis +EndPercentage +EndPoint +EndPoints +EndPosition +EndSession +EndSessionResult +EndTime +EndTimeExclusive +EndTimeOffset +EndTimeRange +EndTimecode +EndTimecodeSMPTE +EndTimestamp +EndTimestampMillis +EndUrl +EndUserLicenseAgreement +EndUserOptedOut +EndValue +EndWeekDay +EndedAt +EndedTimestamp +EndingHashKey +EndingOffsets +EndingSequenceNumber +Endpoint +EndpointAccess +EndpointAccessList +EndpointAlreadyExistsException +EndpointAlreadyExistsFault +EndpointArn +EndpointAttributes +EndpointAuthorization +EndpointAuthorizationAlreadyExistsFault +EndpointAuthorizationList +EndpointAuthorizationNotFoundFault +EndpointAuthorizationsPerClusterLimitExceededFault +EndpointBatchItem +EndpointBatchRequest +EndpointConfigArn +EndpointConfigName +EndpointConfigSummary +EndpointConfigs +EndpointConfiguration +EndpointConfigurations +EndpointCount +EndpointCreateTime +EndpointDemographic +EndpointDescription +EndpointDescriptions +EndpointDetails +EndpointDisabledException +EndpointDomain +EndpointDomainPrefix +EndpointEventBus +EndpointFilter +EndpointGroup +EndpointGroupAlreadyExistsException +EndpointGroupArn +EndpointGroupNotFoundException +EndpointGroupRegion +EndpointGroups +EndpointId +EndpointIdentifier +EndpointIdentifiers +EndpointIds +EndpointInfo +EndpointInput +EndpointInputConfiguration +EndpointIpAddress +EndpointIpAddressRange +EndpointItemResponse +EndpointLocation +EndpointMessageResult +EndpointMetadata +EndpointMetrics +EndpointName +EndpointNetworkConfiguration +EndpointNotFoundException +EndpointNotFoundFault +EndpointOutputConfiguration +EndpointPerformance +EndpointPerformances +EndpointPort +EndpointProperties +EndpointPropertiesList +EndpointPublicAccess +EndpointReentryCap +EndpointReentryInterval +EndpointRequest +EndpointResponse +EndpointResult +EndpointSendConfiguration +EndpointSetting +EndpointSettings +EndpointState +EndpointStatus +EndpointSummary +EndpointTemporarilyUnavailableException +EndpointType +EndpointTypes +EndpointURL +EndpointUri +EndpointUrl +EndpointUser +Endpoints +EndpointsPerAuthorizationLimitExceededFault +EndpointsPerClusterLimitExceededFault +EndpointsResponse +EndsWith +EnforceConsumerDeletion +EnforceHTTPS +EnforceProvidedLabels +EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic +EnforceWorkGroupConfiguration +Enforced +EnforcedLimit +EnforcementInRecord +EnforcementStatus +Engagement +EngagementArn +EngagementId +EngagementMetrics +Engagements +Engine +EngineArn +EngineAttribute +EngineAttributes +EngineConfiguration +EngineDefaults +EngineDisplayName +EngineEdition +EngineExecutionTimeInMillis +EngineFamily +EngineFullVersion +EngineMode +EngineModel +EngineName +EngineNativeAuditFieldsIncluded +EngineNotSupportedException +EnginePatchVersion +EngineSecurityGroupId +EngineTranscribeMedicalSettings +EngineTranscribeSettings +EngineType +EngineVersion +EngineVersionInfo +EngineVersions +EngineVersionsSummary +EngineWorkflowResourceIdentifier +EnhancedImageScanFinding +EnhancedMetrics +EnhancedMonitoring +EnhancedMonitoringOutput +EnhancedMonitoringResourceArn +EnhancedVpcRouting +EniId +EniIp +EniPrivateIpAddress +EnqueueTimestamp +Enrichment +EnrichmentParameters +Enroll +EnrollmentConfig +EnrollmentFilter +EnrollmentFlags +EnrollmentFlagsV2 +EnrollmentFlagsV3 +EnrollmentFlagsV4 +EnrollmentId +EnrollmentJobFraudDetectionConfig +EnrollmentStatus +EnsureNoBackupInProcess +EnterStandbyAnswer +EnterStandbyQuery +EnterpriseId +Entities +EntitiesDetectionJobFilter +EntitiesDetectionJobProperties +EntitiesDetectionJobPropertiesList +EntitledApplication +EntitledApplications +Entitlement +EntitlementAlreadyExistsException +EntitlementArn +EntitlementAttribute +EntitlementData +EntitlementName +EntitlementNotAllowedException +EntitlementNotFoundException +EntitlementStatus +EntitlementUsage +EntitlementUsages +EntitlementValue +Entitlements +EntitlementsAllowed +Entity +EntityAccountFilter +EntityAggregate +EntityAlreadyExistsException +EntityAlreadyRegisteredException +EntityArn +EntityConfiguration +EntityDescription +EntityDetails +EntityDetailsList +EntityDetectorConfiguration +EntityDisplayData +EntityDoesNotExistException +EntityFilter +EntityId +EntityIdList +EntityIdentifier +EntityIds +EntityInfo +EntityItem +EntityLabel +EntityList +EntityName +EntityNotExistsException +EntityNotFoundException +EntityPath +EntityPersonaConfiguration +EntityPropertyReference +EntityRecognitionConfig +EntityRecognizerAnnotations +EntityRecognizerArn +EntityRecognizerDocuments +EntityRecognizerEntityList +EntityRecognizerEvaluationMetrics +EntityRecognizerFilter +EntityRecognizerInputDataConfig +EntityRecognizerMetadata +EntityRecognizerMetadataEntityTypesListItem +EntityRecognizerOutputDataConfig +EntityRecognizerProperties +EntityRecognizerPropertiesList +EntityRecognizerSummariesList +EntityRecognizerSummary +EntitySelectorExpression +EntityStateException +EntitySummary +EntitySummaryList +EntitySynonyms +EntityTags +EntityTemporarilyUnmodifiableException +EntityType +EntityTypes +EntityTypesEvaluationMetrics +EntityTypesListItem +EntityTypesToDetect +Entries +EntropyEncoding +Entry +EntryCount +EntryPoint +EnumDefinition +EnumValues +EnumerationValue +Environment +EnvironmentAccountConnection +EnvironmentAccountConnectionSummary +EnvironmentArn +EnvironmentClass +EnvironmentDescription +EnvironmentDescriptionsMessage +EnvironmentError +EnvironmentFile +EnvironmentFiles +EnvironmentId +EnvironmentIdentifier +EnvironmentIds +EnvironmentImage +EnvironmentInfo +EnvironmentInfoDescription +EnvironmentInformation +EnvironmentLanguage +EnvironmentLifecycle +EnvironmentLink +EnvironmentLinks +EnvironmentMember +EnvironmentName +EnvironmentNames +EnvironmentParameter +EnvironmentParameterRanges +EnvironmentParameters +EnvironmentPlatform +EnvironmentProperties +EnvironmentPropertyDescriptions +EnvironmentPropertyUpdates +EnvironmentQuota +EnvironmentResourceDescription +EnvironmentResourceDescriptionsMessage +EnvironmentResources +EnvironmentResourcesDescription +EnvironmentResponse +EnvironmentState +EnvironmentSummary +EnvironmentSummaryList +EnvironmentTemplate +EnvironmentTemplateFilter +EnvironmentTemplateSummary +EnvironmentTemplateVersion +EnvironmentTemplateVersionSummary +EnvironmentTier +EnvironmentVariable +EnvironmentVariables +EnvironmentVpc +EnvironmentVpcList +Environments +EoCloudCover +EoCloudCoverInput +EphemeralStorage +EphemerisDescription +EphemerisIdResponse +EphemerisItem +EphemerisMetaData +EpisodeId +Epoch +EpochLockingSettings +Epss +EpssDetails +EpssScore +Eq +Equals +EqualsTo +EqualsValue +Equation +Equipment +EquipmentDetection +EquipmentDetections +Error +ErrorArguments +ErrorAttribute +ErrorCachingMinTTL +ErrorCategory +ErrorCause +ErrorClearTimeMsec +ErrorCode +ErrorCodeReason +ErrorCount +ErrorData +ErrorDescription +ErrorDetail +ErrorDetailList +ErrorDetails +ErrorDocument +ErrorEntries +ErrorHandlingConfig +ErrorId +ErrorInfo +ErrorInformation +ErrorList +ErrorMessage +ErrorMetric +ErrorMetrics +ErrorName +ErrorOutputPrefix +ErrorPercentage +ErrorReason +ErrorReportConfiguration +ErrorReportLocation +ErrorResponse +ErrorRetryDuration +ErrorRootCause +ErrorRootCauseEntity +ErrorRootCauseService +ErrorRootCauses +ErrorStatistics +ErrorString +ErrorTimestamp +ErrorTopic +ErrorType +ErrorValue +ErroredActions +Errors +ErrorsListItem +EsRateInPes +Esam +EsamManifestConfirmConditionNotification +EsamSettings +EsamSignalProcessingNotification +EscapeChar +Escaper +Esps +Essential +Established +EstablishedMultiRegionAccessPointPolicy +EstimateByTime +EstimateTemplateCostInput +EstimateTemplateCostOutput +Estimated +EstimatedAverageCoverage +EstimatedAverageUtilization +EstimatedBreakEvenInMonths +EstimatedBytesToTransfer +EstimatedCompletionTime +EstimatedCoverage +EstimatedDataToScanBytes +EstimatedDiskUtilizationPercent +EstimatedEvaluationTimeRemainingInMinutes +EstimatedFilesToDelete +EstimatedFilesToTransfer +EstimatedInstanceWarmup +EstimatedMonthlyCost +EstimatedMonthlyOnDemandCost +EstimatedMonthlySavings +EstimatedMonthlySavingsAmount +EstimatedMonthlySavingsPercentage +EstimatedMonthlyStorageCost +EstimatedNewCommitmentUtilization +EstimatedNumberOfUsers +EstimatedOnDemandCost +EstimatedOnDemandCostWithCurrentCommitment +EstimatedProgress +EstimatedROI +EstimatedReservationCostForLookbackPeriod +EstimatedResourceSize +EstimatedSPCost +EstimatedSavingsAmount +EstimatedSavingsPercentage +EstimatedSecondsToCompletion +EstimatedTimeRemainingInMinutes +EstimatedTimeToCompletionInSeconds +EstimatedTotalCost +EstimatedTotalMonthlySavingsAmount +EstimatedUpdateTime +EstimatedWaitTime +Etag +Ethereum +Ethernet0 +Ethernet0Status +Ethernet1 +Ethernet1Status +EthernetPayload +EthernetStatus +EtvPlatformPid +EtvSignalPid +Euid +Eula +EulaAcceptance +EutranCid +EvalActionName +EvalDecision +EvalDecisionDetails +EvalResourceDecision +EvalResourceName +EvaluateCodeErrorDetail +EvaluateCodeRequest +EvaluateCodeResponse +EvaluateDataQuality +EvaluateDataQualityMultiFrame +EvaluateExpressionInput +EvaluateExpressionOutput +EvaluateFeatureRequest +EvaluateFeatureResponse +EvaluateLowSampleCountPercentile +EvaluateMappingTemplateRequest +EvaluateMappingTemplateResponse +EvaluateOnExit +EvaluatePullRequestApprovalRulesInput +EvaluatePullRequestApprovalRulesOutput +EvaluateSessionRequest +EvaluateSessionResponse +EvaluateTargetHealth +EvaluatedExternalModel +EvaluatedMetrics +EvaluatedModelArn +EvaluatedModelMetrics +EvaluatedModelVersion +EvaluatedRule +Evaluation +EvaluationAnswerInput +EvaluationAnswerOutput +EvaluationArn +EvaluationContext +EvaluationContextIdentifier +EvaluationDataEndTime +EvaluationDataSourceId +EvaluationDataStartTime +EvaluationEndTimestamp +EvaluationErrorItem +EvaluationForm +EvaluationFormArn +EvaluationFormContent +EvaluationFormId +EvaluationFormNumericQuestionOption +EvaluationFormNumericQuestionProperties +EvaluationFormQuestion +EvaluationFormScoringStrategy +EvaluationFormSection +EvaluationFormSingleSelectQuestionAutomation +EvaluationFormSingleSelectQuestionOption +EvaluationFormSingleSelectQuestionProperties +EvaluationFormSummary +EvaluationFormSummaryList +EvaluationFormTitle +EvaluationFormVersion +EvaluationFormVersionSummary +EvaluationFormVersionSummaryList +EvaluationId +EvaluationLimitExceeded +EvaluationManifest +EvaluationManifestS3Prefix +EvaluationMessage +EvaluationMetadata +EvaluationMetrics +EvaluationMode +EvaluationModeConfiguration +EvaluationModes +EvaluationName +EvaluationNote +EvaluationParameters +EvaluationPeriod +EvaluationPeriods +EvaluationRequest +EvaluationResult +EvaluationResultIdentifier +EvaluationResultQualifier +EvaluationResults +EvaluationRule +EvaluationScore +EvaluationStartDate +EvaluationStartTimestamp +EvaluationState +EvaluationStatus +EvaluationSummary +EvaluationSummaryList +EvaluationTime +EvaluationTimeout +EvaluationType +EvaluationWaitTime +Evaluations +EvaluatorArn +Event +EventAccountFilter +EventAction +EventActionArn +EventActionEntry +EventActionId +EventActions +EventAggregate +EventArn +EventBatchingCondition +EventBridge +EventBridgeAction +EventBridgeActionDefinition +EventBridgeBus +EventBridgeConfiguration +EventBridgeDataSourceConfig +EventBridgeDestinationProperties +EventBridgeEnabled +EventBridgeEventBusParameters +EventBridgeParameters +EventBridgeRuleName +EventBus +EventBusArn +EventBusName +EventBuses +EventCategories +EventCategoriesList +EventCategoriesMap +EventCategoriesMapList +EventCategoriesMessage +EventCategory +EventCategoryGroup +EventCategoryGroupList +EventClass +EventCode +EventCondition +EventConfigurationItem +EventConfigurationsList +EventContextData +EventContextDataType +EventCount +EventDataStore +EventDataStoreARNInvalidException +EventDataStoreAlreadyExistsException +EventDataStoreArn +EventDataStoreHasOngoingImportException +EventDataStoreMaxLimitExceededException +EventDataStoreNotFoundException +EventDataStoreTerminationProtectedException +EventDataStores +EventDate +EventDescription +EventDescriptionsMessage +EventDestination +EventDestinationAlreadyExistsException +EventDestinationDefinition +EventDestinationDoesNotExistException +EventDestinationName +EventDestinations +EventDetail +EventDetails +EventDetailsErrorItem +EventDimensions +EventDurationInSeconds +EventEndTime +EventFeedback +EventFeedbackType +EventFilter +EventFirstSeen +EventId +EventIdMode +EventIncludedData +EventInfo +EventInfoMap +EventInformation +EventIngestionUrl +EventIntegration +EventIntegrationArn +EventIntegrationAssociation +EventIntegrationAssociationArn +EventIntegrationAssociationId +EventIntegrationAssociations +EventIntegrationName +EventIntegrations +EventItemResponse +EventLastReplayedTime +EventLastSeen +EventList +EventLog +EventLogEntry +EventName +EventNotificationItemConfigurations +EventObject +EventOrchestration +EventParameters +EventPattern +EventPayload +EventPredictionSummary +EventQueueArn +EventResource +EventResourceARN +EventResourceName +EventResourceType +EventResponse +EventRisk +EventRiskType +EventSelector +EventSelectors +EventSource +EventSourceArn +EventSourceId +EventSourceMappingConfiguration +EventSourceMappings +EventSourceName +EventSourceToken +EventSources +EventSourcesConfig +EventStartCondition +EventStartTime +EventStatus +EventStopBehavior +EventStream +EventStreamArn +EventStreamDestinationDetails +EventStreamName +EventStreamSummary +EventSubType +EventSubscription +EventSubscriptionArn +EventSubscriptionQuotaExceededFault +EventSubscriptionsList +EventSubscriptionsMessage +EventSummary +EventTaggingEnabled +EventThreshold +EventTime +EventTimeFeatureName +EventTimeRange +EventTopic +EventTopics +EventTracker +EventTrackerSummary +EventTriggerDefinition +EventTriggers +EventType +EventTypeFilter +EventTypeId +EventTypeIds +EventTypeName +EventTypeSummary +EventTypes +EventVariableSummary +Events +EventsBatch +EventsCompleted +EventsConfiguration +EventsDetectionJobFilter +EventsDetectionJobProperties +EventsDetectionJobPropertiesList +EventsItemResponse +EventsMatched +EventsMessage +EventsPollInterval +EventsRequest +EventsResponse +EventsScanned +Evidence +EvidenceFinderEnablement +EvidenceInsights +EwsAvailabilityProvider +EwsEndpoint +EwsPassword +EwsProvider +EwsUsername +ExactCidrMatches +ExactFramerate +ExactSettings +Example +ExampleError +ExasolParameters +ExceedsLimitException +Excel +ExcelOptions +ExceptionCause +ExceptionDescription +ExceptionName +ExceptionResponse +ExceptionType +Exceptions +ExcessCapacityTerminationPolicy +ExchangeCodeForTokenRequest +ExchangeCodeForTokenRequestBody +ExchangeCodeForTokenResponse +ExchangeId +ExchangedReservedNode +Exclude +ExcludeArchived +ExcludeAttachmentFilePatterns +ExcludeBootVolume +ExcludeCharacters +ExcludeColumnSchema +ExcludeCompliantResources +ExcludeDataVolumeIds +ExcludeDataVolumeTags +ExcludeDevicesDeployedInOtherStage +ExcludeFeaturesAttribute +ExcludeFilters +ExcludeLowercase +ExcludeManagementEventSources +ExcludeMap +ExcludeMimeTypes +ExcludeNumbers +ExcludePaths +ExcludePeriodConfiguration +ExcludePunctuation +ExcludeResourceTags +ExcludeRetainedVariantProperties +ExcludeSharedDrives +ExcludeSpaces +ExcludeSpecifiedAccounts +ExcludeSpecifiedOrganizationalUnits +ExcludeUppercase +ExcludeUserAccounts +ExcludeVerboseContent +ExcludedAccounts +ExcludedAttendeeIds +ExcludedColumnNames +ExcludedCookies +ExcludedHeaders +ExcludedInstanceTypes +ExcludedMembers +ExcludedPages +ExcludedRule +ExcludedRules +ExcludedTimeRanges +Excludes +Exclusion +ExclusionByResourceTypes +ExclusionFileNamePatterns +ExclusionFileTypePatterns +ExclusionFolderNamePatterns +ExclusionPatterns +ExclusionPreview +Exclusions +ExclusiveEndBillingPeriod +ExclusiveEndTime +ExclusiveStartApplicationName +ExclusiveStartBackupArn +ExclusiveStartDeliveryStreamName +ExclusiveStartDestinationId +ExclusiveStartGlobalTableName +ExclusiveStartKey +ExclusiveStartShardId +ExclusiveStartStreamArn +ExclusiveStartStreamName +ExclusiveStartTableName +ExclusiveStartTagKey +ExecArgs +Executable +ExecutableParameters +ExecutablePath +ExecutableSha256 +ExecutableUsers +ExecuteBudgetActionRequest +ExecuteBudgetActionResponse +ExecuteChangeSetInput +ExecuteCommandConfiguration +ExecuteCommandLogConfiguration +ExecuteCommandRequest +ExecuteCommandResponse +ExecuteCommandSessionConfiguration +ExecuteCoreNetworkChangeSetRequest +ExecuteFastResetInput +ExecuteFastResetOutput +ExecuteGremlinExplainQueryInput +ExecuteGremlinExplainQueryOutput +ExecuteGremlinProfileQueryInput +ExecuteGremlinProfileQueryOutput +ExecuteGremlinQueryInput +ExecuteGremlinQueryOutput +ExecuteOpenCypherExplainQueryInput +ExecuteOpenCypherExplainQueryOutput +ExecuteOpenCypherQueryInput +ExecuteOpenCypherQueryOutput +ExecutePolicyType +ExecuteProvisionedProductPlanInput +ExecuteProvisionedProductPlanOutput +ExecuteProvisionedProductServiceActionInput +ExecuteProvisionedProductServiceActionOutput +ExecuteQueryRequest +ExecuteQueryResponse +ExecuteScheduledQueryRequest +ExecuteSqlRequest +ExecuteSqlResponse +ExecuteStatement +ExecuteStatementException +ExecuteStatementInput +ExecuteStatementOutput +ExecuteStatementRequest +ExecuteStatementResponse +ExecuteStatementResult +ExecuteTimeout +ExecuteToken +ExecuteTransactionInput +ExecuteTransactionOutput +ExecutedBy +ExecutedTime +ExecutedVersion +Execution +ExecutionAbortedEventDetails +ExecutionAlreadyExists +ExecutionClass +ExecutionConfiguration +ExecutionControls +ExecutionCount +ExecutionDate +ExecutionDetails +ExecutionDoesNotExist +ExecutionElapsedTime +ExecutionEndDateTime +ExecutionEndTime +ExecutionEngine +ExecutionEngineConfig +ExecutionEngineId +ExecutionError +ExecutionErrorDetails +ExecutionFailedEventDetails +ExecutionId +ExecutionLimitExceeded +ExecutionList +ExecutionListItem +ExecutionMessage +ExecutionMetrics +ExecutionOrder +ExecutionParameter +ExecutionParameters +ExecutionProperty +ExecutionRecord +ExecutionResult +ExecutionResults +ExecutionRole +ExecutionRoleArn +ExecutionRoleIdentityConfig +ExecutionRoleName +ExecutionStartDateTime +ExecutionStartTime +ExecutionStartedEventDetails +ExecutionStatistics +ExecutionStats +ExecutionStatus +ExecutionStatusDetail +ExecutionStepResult +ExecutionSucceededEventDetails +ExecutionSummary +ExecutionTime +ExecutionTimeFilter +ExecutionTimeInMillis +ExecutionTimedOutEventDetails +ExecutionTimeout +ExecutionTrigger +ExecutionType +Executions +ExecutorConfiguration +ExecutorId +ExecutorSize +ExecutorState +ExecutorStateFilter +ExecutorType +ExecutorsSummary +ExistingEnrollmentAction +ExistingHourlyCommitment +ExistingObjectReplication +ExistingVersion +Exists +ExitCode +ExitMessage +ExitStandbyAnswer +ExitStandbyQuery +Expected +ExpectedAttributeValue +ExpectedBucketOwner +ExpectedCompletionDate +ExpectedCompletionTimeMinutes +ExpectedFirewallEndpoint +ExpectedFirewallSubnetId +ExpectedFirewallSubnetRoutes +ExpectedInternetGatewayRoutes +ExpectedManifestBucketOwner +ExpectedNextSnapshotScheduleTime +ExpectedNextSnapshotScheduleTimeStatus +ExpectedPolicyDescription +ExpectedProperties +ExpectedResourceUtilization +ExpectedRoute +ExpectedRouteTable +ExpectedRoutes +ExpectedSourceBucketOwner +ExpectedValue +ExpenseCurrency +ExpenseDetection +ExpenseDocument +ExpenseDocuments +ExpenseField +ExpenseGroupProperty +ExpenseIndex +ExpenseType +ExperienceConfiguration +ExperienceEndpoint +ExperienceEntitiesSummary +ExperienceScore +ExperiencesSummary +Experiment +ExperimentAction +ExperimentActionState +ExperimentArn +ExperimentCloudWatchLogsLogConfiguration +ExperimentConfig +ExperimentExecution +ExperimentLogConfiguration +ExperimentName +ExperimentReport +ExperimentResultsData +ExperimentS3LogConfiguration +ExperimentSchedule +ExperimentSource +ExperimentState +ExperimentStopCondition +ExperimentSummaries +ExperimentSummary +ExperimentTarget +ExperimentTargetFilter +ExperimentTemplate +ExperimentTemplateAction +ExperimentTemplateCloudWatchLogsLogConfiguration +ExperimentTemplateCloudWatchLogsLogConfigurationInput +ExperimentTemplateLogConfiguration +ExperimentTemplateS3LogConfiguration +ExperimentTemplateS3LogConfigurationInput +ExperimentTemplateStopCondition +ExperimentTemplateSummary +ExperimentTemplateTarget +ExperimentTemplateTargetFilter +ExperimentTemplateTargetInputFilter +Expiration +ExpirationCriterion +ExpirationDate +ExpirationDays +ExpirationInDays +ExpirationModel +ExpirationSettings +ExpirationTime +ExpirationTimeResponse +ExpirationTimestamp +ExpireAt +ExpirePasswords +ExpireSessionRequest +ExpireTime +Expired +ExpiredAt +ExpiredCodeException +ExpiredException +ExpiredImportTokenException +ExpiredIteratorException +ExpiredNextTokenException +ExpiredObjectDeleteMarker +ExpiredStreamException +ExpiredTokenException +Expires +ExpiresAfter +ExpiresAt +ExpiresIn +ExpiresInSeconds +ExpiringVersion +Expiry +ExpiryDateTime +ExpiryEvents +ExpiryEventsConfiguration +ExpiryMinutes +ExpiryTime +ExpiryTimestamp +ExplainPredictor +Explainabilities +Explainability +ExplainabilityArn +ExplainabilityConfig +ExplainabilityExportArn +ExplainabilityExportName +ExplainabilityExportSummary +ExplainabilityExports +ExplainabilityInfo +ExplainabilityName +ExplainabilitySummary +ExplainerConfig +Explanation +ExplanationCode +Explanations +ExplicitAuthFlows +ExplicitDeny +ExplicitHashKey +ExplicitHierarchy +ExplicitIds +ExploitAvailable +ExploitObserved +ExploitabilityDetails +ExponentialRolloutRate +Export +ExportApiRequest +ExportApiResponse +ExportArn +ExportArtifacts +ExportAssetToSignedUrl +ExportAssetToSignedUrlRequestDetails +ExportAssetToSignedUrlResponseDetails +ExportAssetsToS3 +ExportAssetsToS3RequestDetails +ExportAssetsToS3ResponseDetails +ExportAttributeName +ExportAutoScalingGroupRecommendationsRequest +ExportAutoScalingGroupRecommendationsResponse +ExportBackupPlanTemplateInput +ExportBackupPlanTemplateOutput +ExportBundleRequest +ExportBundleResult +ExportCertificateRequest +ExportCertificateResponse +ExportClientVpnClientCertificateRevocationListRequest +ExportClientVpnClientCertificateRevocationListResult +ExportClientVpnClientConfigurationRequest +ExportClientVpnClientConfigurationResult +ExportComponentsRequest +ExportComponentsResponse +ExportConfigurationsResponse +ExportConflictException +ExportCreationTime +ExportDataSource +ExportDescription +ExportDestination +ExportEBSVolumeRecommendationsRequest +ExportEBSVolumeRecommendationsResponse +ExportEC2InstanceRecommendationsRequest +ExportEC2InstanceRecommendationsResponse +ExportECSServiceRecommendationsRequest +ExportECSServiceRecommendationsResponse +ExportEarthObservationJobInput +ExportEarthObservationJobOutput +ExportErrorData +ExportErrorDetails +ExportErrorDetailsOutput +ExportFilter +ExportFormat +ExportFormsRequest +ExportFormsResponse +ExportFromTime +ExportHiddenFieldsOption +ExportId +ExportImageRequest +ExportImageResult +ExportImageTask +ExportImageTaskId +ExportImageTaskIds +ExportImageTasks +ExportInfo +ExportJobProperties +ExportJobPropertiesList +ExportJobRequest +ExportJobResource +ExportJobResponse +ExportJobSummary +ExportJobs +ExportJobsResponse +ExportJournalToS3Request +ExportJournalToS3Response +ExportKeyIdentifier +ExportKeyInput +ExportKeyOutput +ExportLabelsTaskRunProperties +ExportLambdaFunctionRecommendationsRequest +ExportLambdaFunctionRecommendationsResponse +ExportLensInput +ExportLensOutput +ExportLicenseRecommendationsRequest +ExportLicenseRecommendationsResponse +ExportManifest +ExportMetadataModelAssessmentMessage +ExportMetadataModelAssessmentResponse +ExportMetadataModelAssessmentResultEntry +ExportMetric +ExportName +ExportNotFoundException +ExportNotebookInput +ExportNotebookOutput +ExportOnly +ExportPath +ExportProjectRequest +ExportProjectResult +ExportReadSet +ExportReadSetDetail +ExportReadSetFilter +ExportReadSetJobDetail +ExportResourceSpecification +ExportResponse +ExportResults +ExportRevisionToS3 +ExportRevisionsToS3 +ExportRevisionsToS3RequestDetails +ExportRevisionsToS3ResponseDetails +ExportS3DataInput +ExportSchemaRequest +ExportSchemaResponse +ExportServerEngineAttributeRequest +ExportServerEngineAttributeResponse +ExportServerSideEncryption +ExportSnapshotRecord +ExportSnapshotRecordSourceInfo +ExportSnapshotRequest +ExportSnapshotResult +ExportSortBy +ExportSourceImages +ExportSourceNetworkCfnTemplateRequest +ExportSourceNetworkCfnTemplateResponse +ExportSourceType +ExportSqlDetails +ExportStatistics +ExportStatus +ExportSummaries +ExportSummary +ExportTableToPointInTimeInput +ExportTableToPointInTimeOutput +ExportTask +ExportTaskAlreadyExistsFault +ExportTaskError +ExportTaskExecutionInfo +ExportTaskId +ExportTaskIdentifier +ExportTaskIds +ExportTaskNotFoundFault +ExportTaskS3Location +ExportTaskS3LocationRequest +ExportTaskStatus +ExportTaskSummary +ExportTasks +ExportTasksMessage +ExportThemesRequest +ExportThemesResponse +ExportTime +ExportToCSVOption +ExportToS3Task +ExportToS3TaskSpecification +ExportToTime +ExportToken +ExportTr31KeyBlock +ExportTr34KeyBlock +ExportTransitGatewayRoutesRequest +ExportTransitGatewayRoutesResult +ExportType +ExportVectorEnrichmentJobInput +ExportVectorEnrichmentJobOutput +ExportVectorEnrichmentJobOutputConfig +ExportVersion +ExportViewType +ExportWithHiddenFieldsOption +Exportable +ExportableKey +ExportableLogTypes +Exported +ExportedEnvironmentVariable +ExportedRecordsCount +ExportingConfig +ExportingLocation +ExportingStackId +Exports +ExposeHeaders +Expression +ExpressionAttributeNames +ExpressionAttributeValues +ExpressionName +ExpressionNames +ExpressionStatus +ExpressionType +ExpressionValue +ExpressionVariable +Expressions +ExtendLicenseConsumptionRequest +ExtendLicenseConsumptionResponse +ExtendTransactionRequest +ExtendedDataServices +ExtendedKeyUsage +ExtendedKeyUsageObjectIdentifier +ExtendedKeyUsageType +ExtendedKeyUsages +ExtendedS3DestinationConfiguration +ExtendedS3DestinationDescription +ExtendedS3DestinationUpdate +ExtendedStatistic +ExtendedStatistics +Extension +ExtensionArn +ExtensionAssociation +ExtensionAssociationId +ExtensionAssociationSummary +ExtensionAssociations +ExtensionDetails +ExtensionField +ExtensionFields +ExtensionId +ExtensionIdentifier +ExtensionSummary +ExtensionVersion +ExtensionVersionDetails +ExtensionVersionNumber +ExtensionVersions +Extensions +ExtensionsV2 +ExtensionsV3 +ExtensionsV4 +ExternalAudioFileInput +ExternalDataFilteringAllowList +ExternalEvaluation +ExternalEventsDetail +ExternalId +ExternalIds +ExternalImageId +ExternalLoginFederationProviderType +ExternalLoginFederationProviderUrl +ExternalLoginId +ExternalMeetingId +ExternalMetricStatus +ExternalMetricsPreference +ExternalModel +ExternalModelOutputs +ExternalModelSummary +ExternalServiceException +ExternalSourceSetting +ExternalTableDefinition +ExternalUrlConfig +ExternalUserId +ExternalUserIds +ExternalWorkflowExecutionCancelRequestedEventAttributes +ExternalWorkflowExecutionSignaledEventAttributes +ExtraArchivedLogDestIds +ExtraConnectionAttributes +ExtraHosts +ExtraJarsS3Path +ExtraParam +ExtraParams +ExtraPythonLibsS3Path +ExtractDocId +ExtractedCharacters +ExtractedCharactersListItem +Extraction +Extractions +EyeDirection +EyeOpen +Eyeglasses +EyesOpen +F1 +F1Score +F4vSettings +FCntStart +FIAuthKey +FIPSEnabled +FMSPolicyUpdateFirewallCreationConfigAction +FNwkSIntKey +FPort +FPorts +FQDN +FSxWindowsFileServerAuthorizationConfig +FSxWindowsFileServerVolumeConfiguration +Fabric +Face +FaceAttributes +FaceCount +FaceDetail +FaceDetails +FaceDetection +FaceId +FaceIds +FaceMatch +FaceMatchThreshold +FaceMatches +FaceModelVersion +FaceModelVersions +FaceOccluded +FaceRecord +FaceRecords +FaceSearch +FaceSearchSettings +Facebook +Faces +Facet +FacetAlreadyExistsException +FacetAttribute +FacetAttributeDefinition +FacetAttributeReference +FacetAttributeUpdate +FacetEnabled +FacetFilter +FacetInUseException +FacetName +FacetNames +FacetNotFoundException +FacetResult +FacetResults +FacetStyle +FacetValidationException +Facetable +Facets +FactoryPresetFreqsList +FactorySupport +FadeIn +FadeOut +Fail +FailOnWarnings +FailStepMetadata +FailTasksOnLobTruncation +FailWorkflowExecutionDecisionAttributes +FailWorkflowExecutionFailedEventAttributes +Failed +FailedAccount +FailedActions +FailedAssociatedResources +FailedBatchItem +FailedBatches +FailedCampaignStateResponse +FailedCapacityReservationFleetCancellationResult +FailedCount +FailedCreateAssociation +FailedCreateSimulationJobRequest +FailedCreateStandbyWorkspacesRequest +FailedCreateWorkspaceRequest +FailedCustomVocabularyItem +FailedDeleteRemediationExceptionsBatch +FailedDependencyException +FailedDisassociatedResources +FailedDocuments +FailedEntity +FailedEntityList +FailedEntries +FailedEntryCount +FailedEvaluations +FailedFindings +FailedFleetCancellations +FailedImportedDeviceCount +FailedItem +FailedItemDetails +FailedItems +FailedLoginAttempts +FailedMemberAccountEc2DeepInspectionStatusState +FailedNonRetryableError +FailedPieces +FailedPutCount +FailedQueuedPurchaseDeletion +FailedQueuedPurchaseDeletions +FailedReason +FailedRecordCount +FailedRecordsCount +FailedRecordsS3Url +FailedRemediationBatch +FailedRemediationExceptionBatch +FailedRequest +FailedRequests +FailedResource +FailedResourceAccessException +FailedResourcesMap +FailedS3Resource +FailedScheduledActions +FailedScheduledUpdateGroupActionRequest +FailedScheduledUpdateGroupActions +FailedServiceActionAssociation +FailedServiceActionAssociations +FailedStackInstancesCount +FailedStandbyRequests +FailedStatusDetails +FailedSteps +FailedUsers +FailedWorkspaceChangeRequest +Failover +FailoverCondition +FailoverConditionSettings +FailoverConditions +FailoverConfig +FailoverCriteria +FailoverDBClusterMessage +FailoverDBClusterResult +FailoverGlobalClusterMessage +FailoverGlobalClusterResult +FailoverGlobalReplicationGroupMessage +FailoverGlobalReplicationGroupResult +FailoverMode +FailoverShardRequest +FailoverShardResponse +FailoverState +Failure +FailureAction +FailureByQueryException +FailureCause +FailureCode +FailureCodes +FailureDescription +FailureDetails +FailureException +FailureHandlingPolicy +FailureInfo +FailureLocation +FailureMessage +FailureMessages +FailureMode +FailurePolicy +FailureReason +FailureReasons +FailureRedirectionURL +FailureResource +FailureRetentionPeriodInDays +FailureStage +FailureStrings +FailureSummary +FailureThreshold +FailureTime +FailureToleranceCount +FailureTolerancePercentage +FailureType +FailureValues +Failures +FairsharePolicy +FallBackPhoneNumber +FallbackAction +FallbackBehavior +FallbackFont +FalseActivity +FalseyCellValue +FalseyCellValueSynonyms +Family +FamilyName +FaqIds +FaqStatistics +FaqSummary +FaqSummaryItems +FargatePlatformConfiguration +FargateProfile +FargateProfileSelector +FastLaunchConfiguration +FastLaunchImages +FastLaunchLaunchTemplateSpecification +FastLaunchLaunchTemplateSpecificationRequest +FastLaunchLaunchTemplateSpecificationResponse +FastLaunchSnapshotConfiguration +FastLaunchSnapshotConfigurationRequest +FastLaunchSnapshotConfigurationResponse +FastResetToken +FastRestoreRule +FastRestored +FastSnapshotRestoreStateErrors +FastSnapshotRestores +Fault +FaultCode +FaultCodes +FaultCount +FaultCountHigh +FaultCountLow +FaultRootCause +FaultRootCauseEntity +FaultRootCauseService +FaultRootCauses +FaultStatistics +FaultTolerance +FavoritePages +Fax +Feature +FeatureActivations +FeatureAdditions +FeatureConfigurations +FeatureDefinition +FeatureDefinitions +FeatureGroup +FeatureGroupArn +FeatureGroupName +FeatureGroupStatus +FeatureGroupStatusEquals +FeatureGroupSummaries +FeatureGroupSummary +FeatureHeaders +FeatureMetadata +FeatureName +FeatureNames +FeatureNotAvailableException +FeatureParameter +FeatureSet +FeatureSpecificationS3Uri +FeatureStoreOutput +FeatureSummary +FeatureTransformation +FeatureType +FeatureTypes +FeatureValue +FeaturedDocument +FeaturedDocumentMissing +FeaturedDocumentWithMetadata +FeaturedDocuments +FeaturedDocumentsMissing +FeaturedDocumentsWithMetadata +FeaturedResultsConflictException +FeaturedResultsItem +FeaturedResultsItems +FeaturedResultsSet +FeaturedResultsSetId +FeaturedResultsSetIds +FeaturedResultsSetName +FeaturedResultsSetSummary +FeaturedResultsSetSummaryItems +Features +FeaturesAttribute +Featurization +FeaturizationConfig +FeaturizationMethod +FeaturizationMethodName +FeaturizationMethodParameters +FeaturizationPipeline +Featurizations +Fec +FecOutputSettings +FederatedAuthentication +FederatedAuthenticationRequest +FederatedDatabase +FederatedResourceAlreadyExistsException +FederatedTable +FederatedUser +FederatedUserId +FederationParameters +FederationSourceErrorCode +FederationSourceException +FederationSourceRetryableException +Feedback +FeedbackDate +FeedbackForwardingAddress +FeedbackForwardingEmailAddress +FeedbackForwardingEmailAddressIdentityArn +FeedbackForwardingStatus +FeedbackId +FeedbackToken +FeedbackURL +FeedbackValue +FetchOwner +FetchPage +FetchPageRequest +FetchPageResult +FiberOpticCableType +Field +FieldBasedTooltip +FieldConfig +FieldDataPathValues +FieldDelimiter +FieldEncoding +FieldError +FieldFolder +FieldFolders +FieldGroup +FieldId +FieldIdentifier +FieldInfo +FieldInputConfig +FieldItem +FieldLabelType +FieldLevel +FieldLevelEncryption +FieldLevelEncryptionConfig +FieldLevelEncryptionConfigAlreadyExists +FieldLevelEncryptionConfigInUse +FieldLevelEncryptionId +FieldLevelEncryptionList +FieldLevelEncryptionProfile +FieldLevelEncryptionProfileAlreadyExists +FieldLevelEncryptionProfileConfig +FieldLevelEncryptionProfileInUse +FieldLevelEncryptionProfileList +FieldLevelEncryptionProfileSizeExceeded +FieldLevelEncryptionProfileSummary +FieldLevelEncryptionSummary +FieldLevelOptions +FieldList +FieldLogLevel +FieldMappings +FieldName +FieldNames +FieldOption +FieldOptionError +FieldOptions +FieldPatterns +FieldSelectors +FieldSeriesItem +FieldSort +FieldSortOptions +FieldSourceProfileIds +FieldStatistics +FieldStats +FieldSummary +FieldToMatch +FieldTooltipItem +FieldTypeDetails +FieldValidationConfiguration +FieldValidationMessage +FieldValue +FieldWells +Fields +File +FileAccessAuditLogLevel +FileAccessLog +FileBatchJobDefinition +FileBatchJobIdentifier +FileCache +FileCacheCreating +FileCacheDataRepositoryAssociation +FileCacheFailureDetails +FileCacheId +FileCacheIds +FileCacheLustreConfiguration +FileCacheLustreMetadataConfiguration +FileCacheNFSConfiguration +FileCacheNotFound +FileCachePath +FileCacheType +FileCacheTypeVersion +FileCaches +FileCompression +FileConfiguration +FileContentAndSourceFileSpecifiedException +FileContentRequiredException +FileContentSizeLimitExceededException +FileCount +FileDoesNotExistException +FileEntryRequiredException +FileFailures +FileFieldMappings +FileFingerprintLines +FileFormat +FileFormatConfiguration +FileFormatDescriptor +FileFormats +FileGroupSettings +FileGroups +FileHeaderInfo +FileInformation +FileInput +FileKey +FileKeyUpdate +FileLastWritten +FileLocation +FileMetadata +FileMode +FileModeRequiredException +FileModes +FileName +FileNameConflictsWithDirectoryNameException +FileOffset +FilePath +FilePathConflictsWithSubmodulePathException +FilePaths +FileShareARN +FileShareARNList +FileShareAccessAuditLogLevel +FileShareId +FileShareInfo +FileShareInfoList +FileShareName +FileShareStatus +FileShareType +FileSharesVisible +FileSize +FileSizeBytes +FileSizes +FileSource +FileSourceSettings +FileSystem +FileSystemAccessMode +FileSystemAccessRoleArn +FileSystemAdministratorsGroup +FileSystemAlreadyExists +FileSystemArn +FileSystemAssociationARN +FileSystemAssociationARNList +FileSystemAssociationId +FileSystemAssociationInfo +FileSystemAssociationInfoList +FileSystemAssociationStatus +FileSystemAssociationStatusDetail +FileSystemAssociationStatusDetails +FileSystemAssociationSummary +FileSystemAssociationSummaryList +FileSystemConfig +FileSystemConfigs +FileSystemDataSource +FileSystemDescription +FileSystemEndpoint +FileSystemEndpoints +FileSystemFailureDetails +FileSystemId +FileSystemIds +FileSystemInUse +FileSystemLimitExceeded +FileSystemNotFound +FileSystemPath +FileSystemPolicyDescription +FileSystemSize +FileSystemType +FileSystemTypeVersion +FileSystems +FileTooLargeException +FileTransferUploadStreams +FileUploadURL +FileUploaderFieldConfig +FileValidationMessage +FileVersion +FilecacheDuration +FilenameContains +Files +FilesCompleted +FilesDeleted +FilesLimit +FilesSkipped +FilesTransferred +FilesVerified +FilesystemId +FillLineGap +FillMissingValues +FillPolicy +FillStyle +FilledMapAggregatedFieldWells +FilledMapConditionalFormatting +FilledMapConditionalFormattingOption +FilledMapConfiguration +FilledMapFieldWells +FilledMapShapeConditionalFormatting +FilledMapSortConfiguration +FilledMapVisual +FilledPath +FillerSlate +Filling +FilmGrainSynthesis +Filter +FilterActivity +FilterArn +FilterArns +FilterAtDestination +FilterAtSource +FilterAttributeRanges +FilterBBox +FilterCategories +FilterClass +FilterCondition +FilterConditionList +FilterConditions +FilterConfiguration +FilterControl +FilterControlId +FilterControls +FilterCountries +FilterCriteria +FilterCriterion +FilterDateTimePickerControl +FilterDefinition +FilterDescription +FilterDropDownControl +FilterEnable +FilterExpression +FilterGroup +FilterGroupId +FilterGroups +FilterId +FilterInArns +FilterKey +FilterLimitExceededException +FilterList +FilterListConfiguration +FilterListControl +FilterLogEventsRequest +FilterLogEventsResponse +FilterName +FilterNames +FilterOperation +FilterOperationSelectedFieldsConfiguration +FilterOperationTargetVisualsConfiguration +FilterOperator +FilterOption +FilterPartialResults +FilterPolicyLimitExceededException +FilterPortRange +FilterPredicate +FilterQuery +FilterRelativeDateTimeControl +FilterRule +FilterRules +FilterScopeConfiguration +FilterSelectableValues +FilterSettings +FilterSliderControl +FilterStrength +FilterString +FilterSummary +FilterSynonyms +FilterTextAreaControl +FilterTextFieldControl +FilterType +FilterTypedLink +FilterV2 +FilterValue +FilterValues +FilterVariable +FilteredLogEvent +FilteredStatus +Filters +FinalActiveLearningModelArn +FinalAutoMLJobObjectiveMetric +FinalBackupId +FinalBackupTags +FinalBakeTimeInMinutes +FinalClusterSnapshotIdentifier +FinalClusterSnapshotRetentionPeriod +FinalDBSnapshotIdentifier +FinalHyperParameterTuningJobObjectiveMetric +FinalMetricDataList +FinalRecipient +FinalSnapshotIdentifier +FinalSnapshotName +FinalizeCutoverRequest +FinalizeDeviceClaimRequest +FinalizeDeviceClaimResponse +Finalized +FinalizingOrganizationException +FindMatchesMetrics +FindMatchesParameters +FindMatchesTaskRunProperties +Finding +FindingAction +FindingActor +FindingAggregationRegion +FindingAggregator +FindingAggregatorArn +FindingAggregators +FindingComponents +FindingCreated +FindingCriteria +FindingDetail +FindingDetailsError +FindingFieldsUpdate +FindingFilter +FindingHistoryRecord +FindingHistoryUpdate +FindingHistoryUpdateSource +FindingId +FindingIdentifier +FindingIdentifiers +FindingIds +FindingMetricsValuePerSeverity +FindingProviderFields +FindingProviderFieldsConfidence +FindingProviderFieldsCriticality +FindingProviderFieldsRelatedFindingsId +FindingProviderFieldsRelatedFindingsProductArn +FindingProviderFieldsSeverityLabel +FindingProviderFieldsSeverityOriginal +FindingProviderFieldsTypes +FindingProviderSeverity +FindingPublishingFrequency +FindingReasonCodes +FindingSource +FindingSourceDetail +FindingStatisticTypes +FindingStatistics +FindingStatisticsSortCriteria +FindingSummary +FindingTypeAggregation +FindingTypeAggregationResponse +FindingTypes +Findings +FindingsCount +FindingsFilterListItem +FindingsFound +FindingsReportSummary +FineGrainedAuthorizationEnabled +Fingerprint +FinishTime +FinishTimeMillis +FinishedAt +FinishedTime +FinishedWorldsSummary +Fips +FipsDnsName +FipsEnabled +Firehose +FirehoseAction +FirehoseArn +FirehoseDestinationConfiguration +FirehoseFailureFeedbackRoleArn +FirehoseLogDelivery +FirehoseLogDeliveryDescription +FirehoseStream +FirehoseSuccessFeedbackRoleArn +FirelensConfiguration +Firewall +FirewallArn +FirewallConfig +FirewallConfigs +FirewallCreationConfig +FirewallDeploymentModel +FirewallDomainList +FirewallDomainListId +FirewallDomainListMetadata +FirewallDomainLists +FirewallEndpoint +FirewallFailOpen +FirewallId +FirewallManagerRuleGroup +FirewallManagerStatement +FirewallMetadata +FirewallName +FirewallPolicies +FirewallPolicy +FirewallPolicyArn +FirewallPolicyChangeProtection +FirewallPolicyDetails +FirewallPolicyId +FirewallPolicyMetadata +FirewallPolicyName +FirewallPolicyResponse +FirewallPolicyStatefulRuleGroupReferencesDetails +FirewallPolicyStatelessCustomActionsDetails +FirewallPolicyStatelessRuleGroupReferencesDetails +FirewallPolicyStatus +FirewallRule +FirewallRuleGroup +FirewallRuleGroupAssociation +FirewallRuleGroupAssociationId +FirewallRuleGroupAssociations +FirewallRuleGroupId +FirewallRuleGroupMetadata +FirewallRuleGroupPolicy +FirewallRuleGroups +FirewallRules +FirewallStatefulRule +FirewallStatelessRule +FirewallStatus +FirewallSubnetId +FirewallSubnetIsOutOfScopeViolation +FirewallSubnetMissingVPCEndpointViolation +FirewallSubnetRoutes +Firewalls +FirmwareUpdateImage +FirmwareUpdateRole +First +FirstAccessedTime +FirstActivatedTime +FirstAddress +FirstBlockToken +FirstEvaluationStarted +FirstExecutionFrom +FirstName +FirstObservedAt +FirstPage +FirstSchemaVersionNumber +FirstSeen +FirstSeenDateTime +FirstSlotStartTime +FirstSlotStartTimeRange +FirstSnapshotId +FixAvailable +FixedAfd +FixedGOP +FixedInVersion +FixedModeScheduleActionStartSettings +FixedPrice +FixedRate +FixedResponseAction +FixedResponseActionConfig +FixedResponseConfig +FlacSettings +Flag +FlaggedResources +Flags +Flat +FlatInvocations +Fleet +FleetAdvisorLsaAnalysisResponse +FleetAdvisorSchemaObjectResponse +FleetAdvisorSchemaObjects +FleetAdvisorSchemas +FleetArn +FleetAttributes +FleetCapacity +FleetCapacityExceededException +FleetCapacityReservation +FleetCapacityReservations +FleetData +FleetError +FleetErrors +FleetId +FleetIds +FleetLaunchTemplateConfig +FleetLaunchTemplateConfigRequest +FleetLaunchTemplateOverrides +FleetLaunchTemplateOverridesRequest +FleetLaunchTemplateSpecification +FleetLaunchTemplateSpecificationRequest +FleetMetricNameAndArn +FleetName +FleetSpotCapacityRebalance +FleetSpotCapacityRebalanceRequest +FleetSpotMaintenanceStrategies +FleetSpotMaintenanceStrategiesRequest +FleetState +FleetStatus +FleetSummary +FleetSummaryList +FleetType +FleetUtilization +Fleets +FlexCacheEndpointType +FlexMatchMode +FlexibleTimeWindow +FlickerAdaptiveQuantization +FlickerAq +FlinkApplicationConfiguration +FlinkApplicationConfigurationDescription +FlinkApplicationConfigurationUpdate +FlinkRunConfiguration +FlinkRunConfigurationDescription +Flow +FlowArn +FlowDefinition +FlowDefinitionArn +FlowDefinitionName +FlowDefinitionOutputConfig +FlowDefinitionStatus +FlowDefinitionSummaries +FlowDefinitionSummary +FlowExecutionMessage +FlowExecutionSummary +FlowLog +FlowLogId +FlowLogIds +FlowLogStatus +FlowLogs +FlowLogsConfigurationResult +FlowLogsEnabled +FlowLogsS3Bucket +FlowLogsS3Prefix +FlowName +FlowOutput +FlowSource +FlowSourceArn +FlowTemplateDescription +FlowTemplateFilter +FlowTemplateSummary +FlowVpcInterfaceAttachment +Flows +FlushApiCacheRequest +FlushStageAuthorizersCacheRequest +FlushStageCacheRequest +FlywheelArn +FlywheelFilter +FlywheelIterationFilter +FlywheelIterationId +FlywheelIterationProperties +FlywheelIterationPropertiesList +FlywheelModelEvaluationMetrics +FlywheelName +FlywheelProperties +FlywheelStatsS3Prefix +FlywheelSummary +FlywheelSummaryList +Fmp4HlsSettings +Fmt +Fmtp +FmtpRequest +Folder +FolderConfiguration +FolderConfigurations +FolderContentSizeLimitExceededException +FolderDoesNotExistException +FolderId +FolderIds +FolderList +FolderMember +FolderMemberList +FolderMetadata +FolderPath +FolderSearchFilter +FolderSummary +FolderSummaryList +FolderType +Folders +FollowInputIndex +FollowModeScheduleActionStartSettings +FollowPoint +FollowUpPrompt +Font +FontColor +FontConfiguration +FontDecoration +FontFamilies +FontFamily +FontOpacity +FontResolution +FontScript +FontSize +FontStack +FontStyle +FontUnicodeRange +FontWeight +FooterSections +ForbiddenException +Force +ForceAliasCreation +ForceAssociate +ForceCreateJobs +ForceDelete +ForceDeleteWithoutRecovery +ForceDetach +ForceFailover +ForceFieldPictures +ForceIncludeRenditionSize +ForceIncludeRenditions +ForceLobLookup +ForceMove +ForceOverwriteReplicaSecret +ForcePlannedFailover +ForceTerminate +ForceTsVideoEbpOrder +ForceUnsubscribeAll +ForceUpdate +ForceUpgradeDate +ForcedApplyDate +Forecast +ForecastArn +ForecastComputation +ForecastConfiguration +ForecastConfigurations +ForecastDataType +ForecastDimensions +ForecastExportJobArn +ForecastExportJobName +ForecastExportJobSummary +ForecastExportJobs +ForecastFrequency +ForecastHorizon +ForecastName +ForecastProperties +ForecastQuantiles +ForecastResult +ForecastResultsByTime +ForecastScenario +ForecastStatistics +ForecastSummary +ForecastType +ForecastTypes +ForecastedLifetime +ForecastedSpend +Forecasts +Foreground +ForegroundColor +ForgetDeviceRequest +ForgetSmartHomeAppliancesRequest +ForgotPassword +ForgotPasswordLink +ForgotPasswordRequest +ForgotPasswordResponse +Form +FormBindingElement +FormButton +FormCTA +FormDataTypeConfig +FormInputBindingPropertiesValue +FormInputBindingPropertiesValueProperties +FormInputValueProperty +FormInputValuePropertyBindingProperties +FormStyle +FormSummary +Formality +Format +FormatConfig +FormatConfiguration +FormatOptions +FormatText +FormatType +FormatVersion +Formats +Formatted +Forward +ForwardAction +ForwardActionConfig +ForwardConfig +ForwardPath +ForwardPathComponents +ForwardWhenContentTypeIsUnknown +ForwardWhenQueryArgProfileIsUnknown +ForwardedIP +ForwardedIPConfig +ForwardedValues +ForwardingAddressId +ForwardingConfig +ForwardingEnabled +FoundByItems +FoundByKeyValue +FoundationModelDetails +FoundationModelSummary +FpgaDeviceInfo +FpgaDeviceMemoryInfo +FpgaImage +FpgaImageAttribute +FpgaImageGlobalId +FpgaImageId +FpgaImageIds +FpgaImageState +FpgaImages +FpgaInfo +Fpgas +Fqdn +FractionDigits +Fragment +FragmentIntervalMS +FragmentLength +FragmentLengthControl +FragmentLengthInMilliseconds +FragmentNumber +FragmentSelector +FragmentSelectorType +FragmentSizeBytes +FragmentSizeInBytes +FragmentTime +Fragments +FrameCaptureCdnSettings +FrameCaptureGroupSettings +FrameCaptureHlsSettings +FrameCaptureOutputSettings +FrameCaptureS3Settings +FrameCaptureSettings +FrameHeight +FrameMetric +FrameMetricDatum +FrameOption +FrameOptions +FrameRate +FrameWidth +Framerate +FramerateControl +FramerateConversionAlgorithm +FramerateDenominator +FramerateNumerator +Framework +FrameworkArn +FrameworkArns +FrameworkAttributes +FrameworkConfiguration +FrameworkControl +FrameworkControls +FrameworkDescription +FrameworkMetadata +FrameworkName +FrameworkStatus +FrameworkTags +FrameworkVersion +Frameworks +FraudDetectionAction +FraudDetectionConfig +FraudDetectionConfiguration +FraudDetectionResult +FraudDetectionResultId +FraudRiskDetails +Fraudster +FraudsterId +FraudsterRegistrationJob +FraudsterRegistrationJobSummary +FraudsterSimilarityThreshold +FraudsterSummaries +FraudsterSummary +FreeForm +FreeFormLayout +FreeFormLayoutCanvasSizeOptions +FreeFormLayoutConfiguration +FreeFormLayoutElement +FreeFormLayoutElementBackgroundStyle +FreeFormLayoutElementBorderStyle +FreeFormLayoutScreenCanvasSizeOptions +FreeFormSectionLayoutConfiguration +FreeSpaceBox +FreeTier +FreeTierConfig +FreeTierEligible +FreeTrialAccountInfo +FreeTrialDaysRemaining +FreeTrialFeatureConfigurationResult +FreeTrialInfo +FreeTrialInfoError +FreeUntil +Frequencies +Frequency +FrequencyBandwidth +FreshStartDate +Freshness +Friday +FriendlyDeviceName +FriendlyName +From +FromAddress +FromArn +FromDate +FromDbClusterArn +FromEmailAddress +FromEmailAddressIdentityArn +FromEmailAddressNotVerifiedException +FromFederationSource +FromInclusive +FromPath +FromPhoneNumber +FromPort +FromTime +FromTimeStamp +FromType +FromValue +FsxAdminPassword +FsxConfiguration +FsxFilesystemArn +FsxProtocol +FsxProtocolNfs +FsxProtocolSmb +FsxStorageConfiguration +FulfilledCapacity +FulfilledOnDemandCapacity +FulfillmentActivity +FulfillmentCodeHookSettings +FulfillmentStartResponseSpecification +FulfillmentUpdateResponseSpecification +FulfillmentUpdatesSpecification +FullDocument +FullLoadCondtnlChkFailedRows +FullLoadEndTime +FullLoadErrorPercentage +FullLoadErrorRows +FullLoadFinishDate +FullLoadProgressPercent +FullLoadReloaded +FullLoadRows +FullLoadStartDate +FullLoadStartTime +FullName +FullyQualifiedCNAME +FullyQualifiedDomainName +Function +FunctionARN +FunctionAlreadyExists +FunctionArn +FunctionArns +FunctionArtifactMeta +FunctionAssociation +FunctionAssociations +FunctionCode +FunctionCodeLocation +FunctionConfig +FunctionConfiguration +FunctionConfigurationEnvironment +FunctionCount +FunctionDefaultConfig +FunctionDefaultExecutionConfig +FunctionDefinitionId +FunctionDefinitionVersion +FunctionDefinitionVersionArn +FunctionDefinitionVersionId +FunctionError +FunctionErrorMessage +FunctionEventInvokeConfig +FunctionEventInvokeConfigs +FunctionExecutionConfig +FunctionExecutionLogs +FunctionInUse +FunctionInput +FunctionList +FunctionMetadata +FunctionName +FunctionOutput +FunctionPayload +FunctionRequest +FunctionResponse +FunctionResponseTypes +FunctionRunAsConfig +FunctionRuntimeOverride +FunctionSizeLimitExceeded +FunctionSummary +FunctionUrl +FunctionUrlAuthType +FunctionUrlConfig +FunctionUrlConfigs +FunctionVersion +Functions +FunnelChartAggregatedFieldWells +FunnelChartConfiguration +FunnelChartDataLabelOptions +FunnelChartFieldWells +FunnelChartSortConfiguration +FunnelChartVisual +Fuota +FuotaDeviceStatus +FuotaTask +FuotaTaskId +FuotaTaskList +FuzzyMatching +GATING +GCM +GCMChannelRequest +GCMChannelResponse +GCMMessage +GE +GPSCoordinates +GPSPoint +GPSPointDimension +GSTIN +GT +Gain +Game +GameConfiguration +GameConfigurationDetails +GameDetails +GameKey +GameLiftAwsAccountId +GameLiftServiceSdkEndpoint +GameLiftVpcId +GameName +GameProperties +GameProperty +GameSdkVersion +GameServer +GameServerData +GameServerGroup +GameServerGroupArn +GameServerGroupAutoScalingPolicy +GameServerGroupName +GameServerGroups +GameServerId +GameServerInstance +GameServerInstances +GameServerProtectionPolicy +GameServers +GameSession +GameSessionActivationTimeoutSeconds +GameSessionArn +GameSessionConnectionInfo +GameSessionData +GameSessionDetail +GameSessionDetails +GameSessionFullException +GameSessionId +GameSessionName +GameSessionPlacement +GameSessionQueue +GameSessionQueueArn +GameSessionQueueArns +GameSessionQueueDestination +GameSessionQueueName +GameSessionQueues +GameSessionRegion +GameSessions +GameSummary +Games +Gateway +GatewayARN +GatewayAdmins +GatewayArn +GatewayAssociationState +GatewayBridgeSource +GatewayCapabilitySummary +GatewayCapacity +GatewayDetails +GatewayDisplayName +GatewayEui +GatewayEuiEventTopic +GatewayGroup +GatewayGroupArn +GatewayGroupSummary +GatewayGroups +GatewayId +GatewayInfo +GatewayInstance +GatewayInstanceArn +GatewayList +GatewayListItem +GatewayLoadBalancerArns +GatewayLoadBalancerEndpointId +GatewayMessages +GatewayName +GatewayNetwork +GatewayNetworkInterfaces +GatewayOperationalState +GatewayPlatform +GatewayRegion +GatewayResponse +GatewayResponses +GatewayRouteData +GatewayRouteHostnameMatch +GatewayRouteHostnameRewrite +GatewayRouteRef +GatewayRouteSpec +GatewayRouteStatus +GatewayRouteTarget +GatewayRouteVirtualService +GatewayState +GatewaySummary +GatewayTimeoutException +GatewayTimezone +GatewayType +Gateways +GatingControls +GatingRule +GatingRuleUpdate +GaugeChartArcConditionalFormatting +GaugeChartConditionalFormatting +GaugeChartConditionalFormattingOption +GaugeChartConfiguration +GaugeChartFieldWells +GaugeChartOptions +GaugeChartPrimaryValueConditionalFormatting +GaugeChartVisual +GcpMySQLSettings +GdgAttributes +GdgDetailAttributes +GenAppKey +Gender +GenderString +General +GeneralFlags +GeneralFlagsV2 +GeneralFlagsV3 +GeneralFlagsV4 +GeneralLabels +GeneralLabelsSettings +GeneralLogGroup +GeneralName +GeneralServiceException +Generate +GenerateAccessLogsRequest +GenerateAccessLogsResult +GenerateBackendAPIModelsRequest +GenerateBackendAPIModelsResponse +GenerateCandidateDefinitionsOnly +GenerateCardValidationDataInput +GenerateCardValidationDataOutput +GenerateChangeSetRequest +GenerateChangeSetResponse +GenerateClientCertificateRequest +GenerateCredentialReportResponse +GenerateDataKeyPairRequest +GenerateDataKeyPairResponse +GenerateDataKeyPairWithoutPlaintextRequest +GenerateDataKeyPairWithoutPlaintextResponse +GenerateDataKeyRequest +GenerateDataKeyResponse +GenerateDataKeyWithoutPlaintextRequest +GenerateDataKeyWithoutPlaintextResponse +GenerateDataSetRequest +GenerateDataSetResult +GenerateEmbedUrlForAnonymousUserRequest +GenerateEmbedUrlForAnonymousUserResponse +GenerateEmbedUrlForRegisteredUserRequest +GenerateEmbedUrlForRegisteredUserResponse +GenerateInferenceId +GenerateMacInput +GenerateMacOutput +GenerateMacRequest +GenerateMacResponse +GenerateMobileSdkReleaseUrlRequest +GenerateMobileSdkReleaseUrlResponse +GenerateOrganizationsAccessReportRequest +GenerateOrganizationsAccessReportResponse +GeneratePinDataInput +GeneratePinDataOutput +GenerateRandomRequest +GenerateRandomResponse +GenerateRecommendationsRequest +GenerateSecret +GenerateServiceLastAccessedDetailsRequest +GenerateServiceLastAccessedDetailsResponse +GenerateTemplateRequest +GenerateTemplateResponse +GeneratedBy +GeneratedCodeJob +GeneratedCodeJobDetails +GeneratedCodeJobId +GeneratedCodeJobs +GeneratedFraudsterId +GeneratedManifestDescriptor +GeneratedManifestEncryption +GeneratedPolicy +GeneratedPolicyProperties +GeneratedPolicyResult +GeneratedPrefixLocation +GeneratedRulesType +GeneratedSpeakerId +GeneratedTime +GenerationAttributes +GenerationCompletionTime +GenerationExistsException +GenerationKeyArn +GenerationKeyCheckValue +GenerationKeyIdentifier +GenerationQualifier +GenerationStartedTime +GenerationStatus +GenerationSummary +GenerationSummaryList +GenerationTimestamp +Generator +GeneratorDetails +GeneratorId +GenericAttachment +GenericKeywords +GenericRevisionInfo +GeoJsonPayload +GeoLocation +GeoLocationDetails +GeoLocationDetailsList +GeoMatchConstraint +GeoMatchConstraints +GeoMatchLevel +GeoMatchParams +GeoMatchSet +GeoMatchSetId +GeoMatchSetSummary +GeoMatchSetUpdate +GeoMatchSets +GeoMatchStatement +GeoMosaicConfigInput +GeoRestriction +GeoSpatialColumnGroup +GeofenceGeometry +GeofenceId +GeofenceIds +GeofenceProperties +GeographicRole +GeolocationFormat +Geometry +GeometryOffset +Geospatial +GeospatialCoordinateBounds +GeospatialHeatmapColorScale +GeospatialHeatmapConfiguration +GeospatialHeatmapDataColor +GeospatialMapAggregatedFieldWells +GeospatialMapConfiguration +GeospatialMapFieldWells +GeospatialMapStyleOptions +GeospatialMapVisual +GeospatialPointStyleOptions +GeospatialWindowOptions +GeranCid +Get +GetAWSDefaultServiceQuotaRequest +GetAWSDefaultServiceQuotaResponse +GetAWSOrganizationsAccessStatusOutput +GetAccessControlEffectRequest +GetAccessControlEffectResponse +GetAccessKeyInfoRequest +GetAccessKeyInfoResponse +GetAccessKeyLastUsedRequest +GetAccessKeyLastUsedResponse +GetAccessLogSubscriptionRequest +GetAccessLogSubscriptionResponse +GetAccessPointConfigurationForObjectLambdaRequest +GetAccessPointConfigurationForObjectLambdaResult +GetAccessPointForObjectLambdaRequest +GetAccessPointForObjectLambdaResult +GetAccessPointPolicyForObjectLambdaRequest +GetAccessPointPolicyForObjectLambdaResult +GetAccessPointPolicyRequest +GetAccessPointPolicyResult +GetAccessPointPolicyStatusForObjectLambdaRequest +GetAccessPointPolicyStatusForObjectLambdaResult +GetAccessPointPolicyStatusRequest +GetAccessPointPolicyStatusResult +GetAccessPointRequest +GetAccessPointResult +GetAccessPolicyRequest +GetAccessPolicyResponse +GetAccessPreviewRequest +GetAccessPreviewResponse +GetAccessTokenRequest +GetAccessTokenResponse +GetAccessorInput +GetAccessorOutput +GetAccountAliasResult +GetAccountAuthorizationDetailsRequest +GetAccountAuthorizationDetailsResponse +GetAccountBalanceResponse +GetAccountConfigurationResponse +GetAccountLimitRequest +GetAccountLimitResponse +GetAccountPasswordPolicyResponse +GetAccountRequest +GetAccountResponse +GetAccountSendingEnabledResponse +GetAccountSettingsOutput +GetAccountSettingsRequest +GetAccountSettingsResponse +GetAccountSettingsResult +GetAccountStatusResponse +GetAccountSummaryResponse +GetAccuracyMetricsRequest +GetAccuracyMetricsResponse +GetActionRequest +GetActionResponse +GetActionTypeInput +GetActionTypeOutput +GetActiveNamesRequest +GetActiveNamesResult +GetActivityTaskInput +GetActivityTaskOutput +GetAddressBookRequest +GetAddressBookResponse +GetAdmChannelRequest +GetAdmChannelResponse +GetAdminAccountResponse +GetAdminScopeRequest +GetAdminScopeResponse +GetAdministratorAccountRequest +GetAdministratorAccountResponse +GetAgentConfigurationRequest +GetAgentConfigurationResponse +GetAggregateComplianceDetailsByConfigRuleRequest +GetAggregateComplianceDetailsByConfigRuleResponse +GetAggregateConfigRuleComplianceSummaryRequest +GetAggregateConfigRuleComplianceSummaryResponse +GetAggregateConformancePackComplianceSummaryRequest +GetAggregateConformancePackComplianceSummaryResponse +GetAggregateDiscoveredResourceCountsRequest +GetAggregateDiscoveredResourceCountsResponse +GetAggregateResourceConfigRequest +GetAggregateResourceConfigResponse +GetAlarmsRequest +GetAlarmsResult +GetAliasInput +GetAliasOutput +GetAliasRequest +GetAllowListRequest +GetAllowListResponse +GetAlternateContactRequest +GetAlternateContactResponse +GetAnalysisTemplateInput +GetAnalysisTemplateOutput +GetAnalyzedResourceRequest +GetAnalyzedResourceResponse +GetAnalyzerRequest +GetAnalyzerResponse +GetAnnotationImportRequest +GetAnnotationImportResponse +GetAnnotationStoreRequest +GetAnnotationStoreResponse +GetAnnotationStoreVersionRequest +GetAnnotationStoreVersionResponse +GetAnomaliesRequest +GetAnomaliesResponse +GetAnomalyGroupRequest +GetAnomalyGroupResponse +GetAnomalyMonitorsRequest +GetAnomalyMonitorsResponse +GetAnomalySubscriptionsRequest +GetAnomalySubscriptionsResponse +GetAnswerInput +GetAnswerOutput +GetApiAssociationRequest +GetApiAssociationResponse +GetApiCacheRequest +GetApiCacheResponse +GetApiKeyRequest +GetApiKeysRequest +GetApiMappingRequest +GetApiMappingResponse +GetApiMappingsRequest +GetApiMappingsResponse +GetApiRequest +GetApiResponse +GetApisRequest +GetApisResponse +GetApnsChannelRequest +GetApnsChannelResponse +GetApnsSandboxChannelRequest +GetApnsSandboxChannelResponse +GetApnsVoipChannelRequest +GetApnsVoipChannelResponse +GetApnsVoipSandboxChannelRequest +GetApnsVoipSandboxChannelResponse +GetAppAuthorizationRequest +GetAppAuthorizationResponse +GetAppBundleRequest +GetAppBundleResponse +GetAppInstanceRetentionSettingsRequest +GetAppInstanceRetentionSettingsResponse +GetAppInstanceStreamingConfigurationsRequest +GetAppInstanceStreamingConfigurationsResponse +GetAppLaunchConfigurationRequest +GetAppLaunchConfigurationResponse +GetAppMonitorDataRequest +GetAppMonitorDataResponse +GetAppMonitorRequest +GetAppMonitorResponse +GetAppReplicationConfigurationRequest +GetAppReplicationConfigurationResponse +GetAppRequest +GetAppResponse +GetAppResult +GetAppValidationConfigurationRequest +GetAppValidationConfigurationResponse +GetAppValidationOutputRequest +GetAppValidationOutputResponse +GetApplicationComponentDetailsRequest +GetApplicationComponentDetailsResponse +GetApplicationComponentStrategiesRequest +GetApplicationComponentStrategiesResponse +GetApplicationDateRangeKpiRequest +GetApplicationDateRangeKpiResponse +GetApplicationInput +GetApplicationOutput +GetApplicationPolicyRequest +GetApplicationPolicyResponse +GetApplicationRequest +GetApplicationResponse +GetApplicationRevisionInput +GetApplicationRevisionOutput +GetApplicationSettingsRequest +GetApplicationSettingsResponse +GetApplicationVersionRequest +GetApplicationVersionResponse +GetAppliedSchemaVersionRequest +GetAppliedSchemaVersionResponse +GetApprovalRuleTemplateInput +GetApprovalRuleTemplateOutput +GetAppsListRequest +GetAppsListResponse +GetAppsRequest +GetAppsResponse +GetArchitectureRecommendationsRequest +GetArchitectureRecommendationsResponse +GetArchiveRuleRequest +GetArchiveRuleResponse +GetArtifactUrlRequest +GetArtifactUrlResult +GetAssessmentFrameworkRequest +GetAssessmentFrameworkResponse +GetAssessmentReportRequest +GetAssessmentReportResponse +GetAssessmentReportUrlRequest +GetAssessmentReportUrlResponse +GetAssessmentRequest +GetAssessmentResponse +GetAssetPropertyAggregatesRequest +GetAssetPropertyAggregatesResponse +GetAssetPropertyValueHistoryRequest +GetAssetPropertyValueHistoryResponse +GetAssetPropertyValueRequest +GetAssetPropertyValueResponse +GetAssetRequest +GetAssetResponse +GetAssignmentRequest +GetAssignmentResponse +GetAssistantAssociationRequest +GetAssistantAssociationResponse +GetAssistantRequest +GetAssistantResponse +GetAssociatedEnclaveCertificateIamRolesRequest +GetAssociatedEnclaveCertificateIamRolesResult +GetAssociatedIpv6PoolCidrsRequest +GetAssociatedIpv6PoolCidrsResult +GetAssociatedResourceRequest +GetAssociatedResourceResponse +GetAssociatedRoleRequest +GetAssociatedRoleResponse +GetAssociationForServiceQuotaTemplateResponse +GetAttachmentRequest +GetAttachmentResponse +GetAttendeeRequest +GetAttendeeResponse +GetAttributeGroupRequest +GetAttributeGroupResponse +GetAttributeValuesRequest +GetAttributeValuesResponse +GetAuthPolicyRequest +GetAuthPolicyResponse +GetAuthorizationTokenRequest +GetAuthorizationTokenResponse +GetAuthorizationTokenResult +GetAuthorizerRequest +GetAuthorizerResponse +GetAuthorizersRequest +GetAuthorizersResponse +GetAutoMergingPreviewRequest +GetAutoMergingPreviewResponse +GetAutoScalingGroupRecommendationsRequest +GetAutoScalingGroupRecommendationsResponse +GetAutoSnapshotsRequest +GetAutoSnapshotsResult +GetAutoTerminationPolicyInput +GetAutoTerminationPolicyOutput +GetAutomatedDiscoveryConfigurationResponse +GetAutomationExecutionRequest +GetAutomationExecutionResult +GetAwsNetworkPerformanceDataRequest +GetAwsNetworkPerformanceDataResult +GetBackendAPIModelsRequest +GetBackendAPIModelsResponse +GetBackendAPIRequest +GetBackendAPIResponse +GetBackendAuthRequest +GetBackendAuthResponse +GetBackendEnvironmentRequest +GetBackendEnvironmentResult +GetBackendJobRequest +GetBackendJobResponse +GetBackendRequest +GetBackendResponse +GetBackendStorageRequest +GetBackendStorageResourceConfig +GetBackendStorageResponse +GetBackupPlanFromJSONInput +GetBackupPlanFromJSONOutput +GetBackupPlanFromTemplateInput +GetBackupPlanFromTemplateOutput +GetBackupPlanInput +GetBackupPlanOutput +GetBackupSelectionInput +GetBackupSelectionOutput +GetBackupVaultAccessPolicyInput +GetBackupVaultAccessPolicyOutput +GetBackupVaultNotificationsInput +GetBackupVaultNotificationsOutput +GetBaiduChannelRequest +GetBaiduChannelResponse +GetBandwidthRateLimitScheduleInput +GetBandwidthRateLimitScheduleOutput +GetBasePathMappingRequest +GetBasePathMappingsRequest +GetBatchImportJobsRequest +GetBatchImportJobsResult +GetBatchJobExecutionRequest +GetBatchJobExecutionResponse +GetBatchPredictionInput +GetBatchPredictionJobsRequest +GetBatchPredictionJobsResult +GetBatchPredictionOutput +GetBehaviorModelTrainingSummariesRequest +GetBehaviorModelTrainingSummariesResponse +GetBlacklistReportsRequest +GetBlacklistReportsResponse +GetBlobInput +GetBlobOutput +GetBlockPublicAccessConfigurationOutput +GetBlockRequest +GetBlockResponse +GetBlueprintRequest +GetBlueprintResponse +GetBlueprintRunRequest +GetBlueprintRunResponse +GetBlueprintRunsRequest +GetBlueprintRunsResponse +GetBlueprintsRequest +GetBlueprintsResult +GetBootstrapBrokersRequest +GetBootstrapBrokersResponse +GetBotAliasRequest +GetBotAliasResponse +GetBotAliasesRequest +GetBotAliasesResponse +GetBotChannelAssociationRequest +GetBotChannelAssociationResponse +GetBotChannelAssociationsRequest +GetBotChannelAssociationsResponse +GetBotRequest +GetBotResponse +GetBotVersionsRequest +GetBotVersionsResponse +GetBotsRequest +GetBotsResponse +GetBranchInput +GetBranchOutput +GetBranchRequest +GetBranchResult +GetBrowserSettingsRequest +GetBrowserSettingsResponse +GetBucketAccelerateConfigurationOutput +GetBucketAccelerateConfigurationRequest +GetBucketAccessKeysRequest +GetBucketAccessKeysResult +GetBucketAclOutput +GetBucketAclRequest +GetBucketAnalyticsConfigurationOutput +GetBucketAnalyticsConfigurationRequest +GetBucketBundlesRequest +GetBucketBundlesResult +GetBucketCorsOutput +GetBucketCorsRequest +GetBucketEncryptionOutput +GetBucketEncryptionRequest +GetBucketIntelligentTieringConfigurationOutput +GetBucketIntelligentTieringConfigurationRequest +GetBucketInventoryConfigurationOutput +GetBucketInventoryConfigurationRequest +GetBucketLifecycleConfigurationOutput +GetBucketLifecycleConfigurationRequest +GetBucketLifecycleConfigurationResult +GetBucketLocationOutput +GetBucketLocationRequest +GetBucketLoggingOutput +GetBucketLoggingRequest +GetBucketMetricDataRequest +GetBucketMetricDataResult +GetBucketMetricsConfigurationOutput +GetBucketMetricsConfigurationRequest +GetBucketNotificationConfigurationRequest +GetBucketOwnershipControlsOutput +GetBucketOwnershipControlsRequest +GetBucketPolicyOutput +GetBucketPolicyRequest +GetBucketPolicyResult +GetBucketPolicyStatusOutput +GetBucketPolicyStatusRequest +GetBucketReplicationOutput +GetBucketReplicationRequest +GetBucketReplicationResult +GetBucketRequest +GetBucketRequestPaymentOutput +GetBucketRequestPaymentRequest +GetBucketResult +GetBucketStatisticsRequest +GetBucketStatisticsResponse +GetBucketTaggingOutput +GetBucketTaggingRequest +GetBucketTaggingResult +GetBucketVersioningOutput +GetBucketVersioningRequest +GetBucketVersioningResult +GetBucketWebsiteOutput +GetBucketWebsiteRequest +GetBucketsAggregationRequest +GetBucketsAggregationResponse +GetBucketsRequest +GetBucketsResult +GetBuiltinIntentRequest +GetBuiltinIntentResponse +GetBuiltinIntentsRequest +GetBuiltinIntentsResponse +GetBuiltinSlotTypesRequest +GetBuiltinSlotTypesResponse +GetBulkDeploymentStatusRequest +GetBulkDeploymentStatusResponse +GetBulkPublishDetailsRequest +GetBulkPublishDetailsResponse +GetBundlesRequest +GetBundlesResult +GetByteMatchSetRequest +GetByteMatchSetResponse +GetCSVHeaderRequest +GetCSVHeaderResponse +GetCachePolicyConfigRequest +GetCachePolicyConfigResult +GetCachePolicyRequest +GetCachePolicyResult +GetCalculatedAttributeDefinitionRequest +GetCalculatedAttributeDefinitionResponse +GetCalculatedAttributeForProfileRequest +GetCalculatedAttributeForProfileResponse +GetCalculationExecutionCodeRequest +GetCalculationExecutionCodeResponse +GetCalculationExecutionRequest +GetCalculationExecutionResponse +GetCalculationExecutionStatusRequest +GetCalculationExecutionStatusResponse +GetCalendarStateRequest +GetCalendarStateResponse +GetCallAnalyticsCategoryRequest +GetCallAnalyticsCategoryResponse +GetCallAnalyticsJobRequest +GetCallAnalyticsJobResponse +GetCallerIdentityResponse +GetCampaignActivitiesRequest +GetCampaignActivitiesResponse +GetCampaignDateRangeKpiRequest +GetCampaignDateRangeKpiResponse +GetCampaignRequest +GetCampaignResponse +GetCampaignStateBatchRequest +GetCampaignStateBatchResponse +GetCampaignStateRequest +GetCampaignStateResponse +GetCampaignVersionRequest +GetCampaignVersionResponse +GetCampaignVersionsRequest +GetCampaignVersionsResponse +GetCampaignsRequest +GetCampaignsResponse +GetCanaryRequest +GetCanaryResponse +GetCanaryRunsRequest +GetCanaryRunsResponse +GetCapacityAssignmentConfigurationInput +GetCapacityAssignmentConfigurationOutput +GetCapacityReservationInput +GetCapacityReservationOutput +GetCapacityReservationUsageRequest +GetCapacityReservationUsageResult +GetCardinalityRequest +GetCardinalityResponse +GetCaseEventConfigurationRequest +GetCaseEventConfigurationResponse +GetCaseRequest +GetCaseResponse +GetCatalogImportStatusRequest +GetCatalogImportStatusResponse +GetCatalogItemInput +GetCatalogItemOutput +GetCelebrityInfoRequest +GetCelebrityInfoResponse +GetCelebrityRecognitionRequest +GetCelebrityRecognitionResponse +GetCellReadinessSummaryRequest +GetCellReadinessSummaryResponse +GetCellRequest +GetCellResponse +GetCertificateAuthorityCertificateRequest +GetCertificateAuthorityCertificateResponse +GetCertificateAuthorityCsrRequest +GetCertificateAuthorityCsrResponse +GetCertificateRequest +GetCertificateResponse +GetCertificatesRequest +GetCertificatesResult +GetChangeLogsRequest +GetChangeLogsResponse +GetChangeRequest +GetChangeResponse +GetChangeTokenResponse +GetChangeTokenStatusRequest +GetChangeTokenStatusResponse +GetChangesetRequest +GetChangesetResponse +GetChannelGroupRequest +GetChannelGroupResponse +GetChannelMembershipPreferencesRequest +GetChannelMembershipPreferencesResponse +GetChannelMessageRequest +GetChannelMessageResponse +GetChannelMessageStatusRequest +GetChannelMessageStatusResponse +GetChannelPolicyRequest +GetChannelPolicyResponse +GetChannelRequest +GetChannelResponse +GetChannelScheduleRequest +GetChannelScheduleResponse +GetChannelsRequest +GetChannelsResponse +GetCheckerIpRangesResponse +GetChunkInput +GetChunkOutput +GetClassificationExportConfigurationResponse +GetClassificationScopeRequest +GetClassificationScopeResponse +GetClassifierRequest +GetClassifierResponse +GetClassifiersRequest +GetClassifiersResponse +GetClientCertificateRequest +GetClientCertificatesRequest +GetClipInput +GetClipOutput +GetCloudFormationStackRecordsRequest +GetCloudFormationStackRecordsResult +GetCloudFormationTemplateRequest +GetCloudFormationTemplateResponse +GetCloudFrontOriginAccessIdentityConfigRequest +GetCloudFrontOriginAccessIdentityConfigResult +GetCloudFrontOriginAccessIdentityRequest +GetCloudFrontOriginAccessIdentityResult +GetClusterCredentialsMessage +GetClusterCredentialsWithIAMMessage +GetClusterInput +GetClusterOutput +GetClusterPolicyRequest +GetClusterPolicyResponse +GetClusterSessionCredentialsInput +GetClusterSessionCredentialsOutput +GetClusterSnapshotInput +GetClusterSnapshotOutput +GetCodeBindingSourceRequest +GetCodeBindingSourceResponse +GetCodeSigningConfigRequest +GetCodeSigningConfigResponse +GetCodegenJobRequest +GetCodegenJobResponse +GetCognitoEventsRequest +GetCognitoEventsResponse +GetCoipPoolUsageRequest +GetCoipPoolUsageResult +GetCollaborationAnalysisTemplateInput +GetCollaborationAnalysisTemplateOutput +GetCollaborationInput +GetCollaborationOutput +GetColumnStatisticsForPartitionRequest +GetColumnStatisticsForPartitionResponse +GetColumnStatisticsForTableRequest +GetColumnStatisticsForTableResponse +GetCommandInvocationRequest +GetCommandInvocationResult +GetCommentInput +GetCommentOutput +GetCommentReactionsInput +GetCommentReactionsOutput +GetCommentsForComparedCommitInput +GetCommentsForComparedCommitOutput +GetCommentsForPullRequestInput +GetCommentsForPullRequestOutput +GetCommitInput +GetCommitOutput +GetCompatibleElasticsearchVersionsRequest +GetCompatibleElasticsearchVersionsResponse +GetCompatibleKafkaVersionsRequest +GetCompatibleKafkaVersionsResponse +GetCompatibleVersionsRequest +GetCompatibleVersionsResponse +GetComplianceDetailRequest +GetComplianceDetailResponse +GetComplianceDetailsByConfigRuleRequest +GetComplianceDetailsByConfigRuleResponse +GetComplianceDetailsByResourceRequest +GetComplianceDetailsByResourceResponse +GetComplianceSummaryByConfigRuleResponse +GetComplianceSummaryByResourceTypeRequest +GetComplianceSummaryByResourceTypeResponse +GetComplianceSummaryInput +GetComplianceSummaryOutput +GetComponentInput +GetComponentOutput +GetComponentPolicyRequest +GetComponentPolicyResponse +GetComponentRequest +GetComponentResponse +GetComponentTypeRequest +GetComponentTypeResponse +GetComponentVersionArtifactRequest +GetComponentVersionArtifactResponse +GetComputeAccessInput +GetComputeAccessOutput +GetComputeAuthTokenInput +GetComputeAuthTokenOutput +GetConferencePreferenceResponse +GetConferenceProviderRequest +GetConferenceProviderResponse +GetConfigRequest +GetConfigResponse +GetConfigurationProfileRequest +GetConfigurationRequest +GetConfigurationResponse +GetConfigurationSetEventDestinationsRequest +GetConfigurationSetEventDestinationsResponse +GetConfigurationSetRequest +GetConfigurationSetResponse +GetConfiguredTableAnalysisRuleInput +GetConfiguredTableAnalysisRuleOutput +GetConfiguredTableAssociationInput +GetConfiguredTableAssociationOutput +GetConfiguredTableInput +GetConfiguredTableOutput +GetConformancePackComplianceDetailsRequest +GetConformancePackComplianceDetailsResponse +GetConformancePackComplianceSummaryRequest +GetConformancePackComplianceSummaryResponse +GetConnectAttachmentRequest +GetConnectAttachmentResponse +GetConnectInstanceConfigRequest +GetConnectInstanceConfigResponse +GetConnectPeerAssociationsRequest +GetConnectPeerAssociationsResponse +GetConnectPeerRequest +GetConnectPeerResponse +GetConnectionInput +GetConnectionOutput +GetConnectionRequest +GetConnectionResponse +GetConnectionStatusRequest +GetConnectionStatusResponse +GetConnectionsFilter +GetConnectionsRequest +GetConnectionsResponse +GetConnectivityInfoRequest +GetConnectivityInfoResponse +GetConnectorDefinitionRequest +GetConnectorDefinitionResponse +GetConnectorDefinitionVersionRequest +GetConnectorDefinitionVersionResponse +GetConnectorRequest +GetConnectorResponse +GetConnectorsRequest +GetConnectorsResponse +GetConsoleOutputRequest +GetConsoleOutputResult +GetConsoleScreenshotRequest +GetConsoleScreenshotResult +GetConsolidatedReportInput +GetConsolidatedReportOutput +GetContactAttributesRequest +GetContactAttributesResponse +GetContactChannelRequest +GetContactChannelResult +GetContactInformationRequest +GetContactInformationResponse +GetContactListRequest +GetContactListResponse +GetContactMethodsRequest +GetContactMethodsResult +GetContactPolicyRequest +GetContactPolicyResult +GetContactReachabilityStatusRequest +GetContactReachabilityStatusResponse +GetContactRequest +GetContactResponse +GetContactResult +GetContainerAPIMetadataResult +GetContainerImagesRequest +GetContainerImagesResult +GetContainerLogRequest +GetContainerLogResult +GetContainerPolicyInput +GetContainerPolicyOutput +GetContainerRecipePolicyRequest +GetContainerRecipePolicyResponse +GetContainerRecipeRequest +GetContainerRecipeResponse +GetContainerServiceDeploymentsRequest +GetContainerServiceDeploymentsResult +GetContainerServiceMetricDataRequest +GetContainerServiceMetricDataResult +GetContainerServicePowersResult +GetContainerServicesRequest +GetContentModerationRequest +GetContentModerationRequestMetadata +GetContentModerationResponse +GetContentRequest +GetContentResponse +GetContentSummaryRequest +GetContentSummaryResponse +GetContextKeysForCustomPolicyRequest +GetContextKeysForPolicyResponse +GetContextKeysForPrincipalPolicyRequest +GetContinuousDeploymentPolicyConfigRequest +GetContinuousDeploymentPolicyConfigResult +GetContinuousDeploymentPolicyRequest +GetContinuousDeploymentPolicyResult +GetControlOperationInput +GetControlOperationOutput +GetControlRequest +GetControlResponse +GetCoreDefinitionRequest +GetCoreDefinitionResponse +GetCoreDefinitionVersionRequest +GetCoreDefinitionVersionResponse +GetCoreDeviceRequest +GetCoreDeviceResponse +GetCoreNetworkChangeEventsRequest +GetCoreNetworkChangeEventsResponse +GetCoreNetworkChangeSetRequest +GetCoreNetworkChangeSetResponse +GetCoreNetworkPolicyRequest +GetCoreNetworkPolicyResponse +GetCoreNetworkRequest +GetCoreNetworkResponse +GetCorsPolicyInput +GetCorsPolicyOutput +GetCostAndUsageRequest +GetCostAndUsageResponse +GetCostAndUsageWithResourcesRequest +GetCostAndUsageWithResourcesResponse +GetCostCategoriesRequest +GetCostCategoriesResponse +GetCostEstimateRequest +GetCostEstimateResult +GetCostEstimationRequest +GetCostEstimationResponse +GetCostForecastRequest +GetCostForecastResponse +GetCoverageStatisticsRequest +GetCoverageStatisticsResponse +GetCrawlerMetricsRequest +GetCrawlerMetricsResponse +GetCrawlerRequest +GetCrawlerResponse +GetCrawlersRequest +GetCrawlersResponse +GetCredentialReportResponse +GetCredentialsForIdentityInput +GetCredentialsForIdentityResponse +GetCredentialsRequest +GetCredentialsResponse +GetCurrentMetricDataRequest +GetCurrentMetricDataResponse +GetCurrentUserDataRequest +GetCurrentUserDataResponse +GetCurrentUserRequest +GetCurrentUserResponse +GetCustomDataIdentifierRequest +GetCustomDataIdentifierResponse +GetCustomEntityTypeRequest +GetCustomEntityTypeResponse +GetCustomModelRequest +GetCustomModelResponse +GetCustomRulePolicyRequest +GetCustomRulePolicyResponse +GetCustomVerificationEmailTemplateRequest +GetCustomVerificationEmailTemplateResponse +GetCustomerGatewayAssociationsRequest +GetCustomerGatewayAssociationsResponse +GetDASHStreamingSessionURLInput +GetDASHStreamingSessionURLOutput +GetDICOMImportJobRequest +GetDICOMImportJobResponse +GetDNSSECRequest +GetDNSSECResponse +GetDashboardEmbedUrlRequest +GetDashboardEmbedUrlResponse +GetDashboardForJobRunRequest +GetDashboardForJobRunResponse +GetDashboardInput +GetDashboardOutput +GetDataCatalogEncryptionSettingsRequest +GetDataCatalogEncryptionSettingsResponse +GetDataCatalogInput +GetDataCatalogOutput +GetDataCellsFilterRequest +GetDataCellsFilterResponse +GetDataEndpointInput +GetDataEndpointOutput +GetDataIntegrationRequest +GetDataIntegrationResponse +GetDataLakeExceptionSubscriptionResponse +GetDataLakeOrganizationConfigurationResponse +GetDataLakeSettingsRequest +GetDataLakeSettingsResponse +GetDataLakeSourcesRequest +GetDataLakeSourcesResponse +GetDataProtectionPolicyInput +GetDataProtectionPolicyRequest +GetDataProtectionPolicyResponse +GetDataQualityMetricsRequest +GetDataQualityMetricsResponse +GetDataQualityResultRequest +GetDataQualityResultResponse +GetDataQualityRuleRecommendationRunRequest +GetDataQualityRuleRecommendationRunResponse +GetDataQualityRulesetEvaluationRunRequest +GetDataQualityRulesetEvaluationRunResponse +GetDataQualityRulesetRequest +GetDataQualityRulesetResponse +GetDataRetrievalPolicyInput +GetDataRetrievalPolicyOutput +GetDataSetDetailsRequest +GetDataSetDetailsResponse +GetDataSetImportTaskRequest +GetDataSetImportTaskResponse +GetDataSetRequest +GetDataSetResponse +GetDataSourceInput +GetDataSourceOutput +GetDataSourceRequest +GetDataSourceResponse +GetDataViewRequest +GetDataViewResponse +GetDatabaseInput +GetDatabaseOutput +GetDatabaseRequest +GetDatabaseResponse +GetDatabasesRequest +GetDatabasesResponse +GetDataflowEndpointGroupRequest +GetDataflowEndpointGroupResponse +GetDataflowGraphRequest +GetDataflowGraphResponse +GetDatasetContentRequest +GetDatasetContentResponse +GetDatasetRequest +GetDatasetResponse +GetDatastoreRequest +GetDatastoreResponse +GetDecoderManifestRequest +GetDecoderManifestResponse +GetDecryptedAPIKeyRequest +GetDecryptedAPIKeyResponse +GetDedicatedIpPoolRequest +GetDedicatedIpPoolResponse +GetDedicatedIpRequest +GetDedicatedIpResponse +GetDedicatedIpsRequest +GetDedicatedIpsResponse +GetDefaultCreditSpecificationRequest +GetDefaultCreditSpecificationResult +GetDefaultPatchBaselineRequest +GetDefaultPatchBaselineResult +GetDefaultRetentionPolicyRequest +GetDefaultRetentionPolicyResponse +GetDefaultViewOutput +GetDelegatedAdminAccountResponse +GetDelegationsRequest +GetDelegationsResponse +GetDeleteEventsByEventTypeStatusRequest +GetDeleteEventsByEventTypeStatusResult +GetDeliverabilityDashboardOptionsResponse +GetDeliverabilityTestReportRequest +GetDeliverabilityTestReportResponse +GetDeployablePatchSnapshotForInstanceRequest +GetDeployablePatchSnapshotForInstanceResult +GetDeploymentConfigInput +GetDeploymentConfigOutput +GetDeploymentGroupInput +GetDeploymentGroupOutput +GetDeploymentInput +GetDeploymentInstanceInput +GetDeploymentInstanceOutput +GetDeploymentOutput +GetDeploymentRequest +GetDeploymentResponse +GetDeploymentStatusRequest +GetDeploymentStatusResponse +GetDeploymentStrategyRequest +GetDeploymentTargetInput +GetDeploymentTargetOutput +GetDeploymentsRequest +GetDeploymentsResponse +GetDeploymentsResult +GetDestinationRequest +GetDestinationResponse +GetDetectorModelAnalysisResultsRequest +GetDetectorModelAnalysisResultsResponse +GetDetectorRequest +GetDetectorResponse +GetDetectorVersionRequest +GetDetectorVersionResult +GetDetectorsRequest +GetDetectorsResult +GetDevEndpointRequest +GetDevEndpointResponse +GetDevEndpointsRequest +GetDevEndpointsResponse +GetDevEnvironmentRequest +GetDevEnvironmentResponse +GetDeviceDefinitionRequest +GetDeviceDefinitionResponse +GetDeviceDefinitionVersionRequest +GetDeviceDefinitionVersionResponse +GetDeviceFleetReportRequest +GetDeviceFleetReportResponse +GetDeviceIdentifierRequest +GetDeviceIdentifierResponse +GetDeviceInstanceRequest +GetDeviceInstanceResult +GetDeviceMethodsRequest +GetDeviceMethodsResponse +GetDevicePoolCompatibilityRequest +GetDevicePoolCompatibilityResult +GetDevicePoolRequest +GetDevicePoolResult +GetDevicePositionHistoryRequest +GetDevicePositionHistoryResponse +GetDevicePositionRequest +GetDevicePositionResponse +GetDeviceProfileRequest +GetDeviceProfileResponse +GetDeviceRegistrationRequest +GetDeviceRegistrationResult +GetDeviceRequest +GetDeviceResponse +GetDeviceResult +GetDevicesInPlacementRequest +GetDevicesInPlacementResponse +GetDevicesRequest +GetDevicesResponse +GetDifferencesInput +GetDifferencesOutput +GetDigestRequest +GetDigestResponse +GetDimensionKeyDetailsRequest +GetDimensionKeyDetailsResponse +GetDimensionValuesRequest +GetDimensionValuesResponse +GetDirectoryLimitsResult +GetDirectoryRegistrationRequest +GetDirectoryRegistrationResponse +GetDirectoryRequest +GetDirectoryResponse +GetDiscoveredResourceCountsRequest +GetDiscoveredResourceCountsResponse +GetDiscoveredSchemaRequest +GetDiscoveredSchemaResponse +GetDiscoverySummaryResponse +GetDiskRequest +GetDiskResult +GetDiskSnapshotRequest +GetDiskSnapshotResult +GetDiskSnapshotsRequest +GetDiskSnapshotsResult +GetDisksRequest +GetDisksResult +GetDistributionBundlesResult +GetDistributionConfigRequest +GetDistributionConfigResult +GetDistributionConfigurationRequest +GetDistributionConfigurationResponse +GetDistributionLatestCacheResetRequest +GetDistributionLatestCacheResetResult +GetDistributionMetricDataRequest +GetDistributionMetricDataResult +GetDistributionRequest +GetDistributionResult +GetDistributionsRequest +GetDistributionsResult +GetDocumentAnalysisRequest +GetDocumentAnalysisResponse +GetDocumentPathRequest +GetDocumentPathResponse +GetDocumentRequest +GetDocumentResponse +GetDocumentResult +GetDocumentTextDetectionRequest +GetDocumentTextDetectionResponse +GetDocumentVersionRequest +GetDocumentVersionResponse +GetDocumentationPartRequest +GetDocumentationPartsRequest +GetDocumentationVersionRequest +GetDocumentationVersionsRequest +GetDomainAssociationRequest +GetDomainAssociationResult +GetDomainDeliverabilityCampaignRequest +GetDomainDeliverabilityCampaignResponse +GetDomainDetailRequest +GetDomainDetailResponse +GetDomainNameRequest +GetDomainNameResponse +GetDomainNamesRequest +GetDomainNamesResponse +GetDomainPermissionsPolicyRequest +GetDomainPermissionsPolicyResult +GetDomainRequest +GetDomainResponse +GetDomainResult +GetDomainStatisticsReportRequest +GetDomainStatisticsReportResponse +GetDomainSuggestionsRequest +GetDomainSuggestionsResponse +GetDomainsRequest +GetDomainsResult +GetDownloadUrlForLayerRequest +GetDownloadUrlForLayerResponse +GetEBSVolumeRecommendationsRequest +GetEBSVolumeRecommendationsResponse +GetEC2InstanceRecommendationsRequest +GetEC2InstanceRecommendationsResponse +GetEC2RecommendationProjectedMetricsRequest +GetEC2RecommendationProjectedMetricsResponse +GetECSServiceRecommendationProjectedMetricsRequest +GetECSServiceRecommendationProjectedMetricsResponse +GetECSServiceRecommendationsRequest +GetECSServiceRecommendationsResponse +GetEarthObservationJobInput +GetEarthObservationJobOutput +GetEbsDefaultKmsKeyIdRequest +GetEbsDefaultKmsKeyIdResult +GetEbsEncryptionByDefaultRequest +GetEbsEncryptionByDefaultResult +GetEc2DeepInspectionConfigurationResponse +GetEffectivePermissionsForPathRequest +GetEffectivePermissionsForPathResponse +GetEffectivePoliciesRequest +GetEffectivePoliciesResponse +GetEffectiveRecommendationPreferencesRequest +GetEffectiveRecommendationPreferencesResponse +GetEmailChannelRequest +GetEmailChannelResponse +GetEmailIdentityPoliciesRequest +GetEmailIdentityPoliciesResponse +GetEmailIdentityRequest +GetEmailIdentityResponse +GetEmailTemplateRequest +GetEmailTemplateResponse +GetEnabledStandardsRequest +GetEnabledStandardsResponse +GetEncryptionConfigResult +GetEncryptionConfigurationResponse +GetEncryptionKeyRequest +GetEncryptionKeyResponse +GetEndpointAccessRequest +GetEndpointAccessResponse +GetEndpointAttributesInput +GetEndpointAttributesResponse +GetEndpointRequest +GetEndpointResponse +GetEngineStatusOutput +GetEnrollmentStatusResponse +GetEnrollmentStatusesForOrganizationRequest +GetEnrollmentStatusesForOrganizationResponse +GetEntitiesRequest +GetEntitiesResponse +GetEntitlementsRequest +GetEntitlementsResult +GetEntityRequest +GetEntityResponse +GetEntityTypesRequest +GetEntityTypesResult +GetEnvironmentAccountConnectionInput +GetEnvironmentAccountConnectionOutput +GetEnvironmentInput +GetEnvironmentOutput +GetEnvironmentRequest +GetEnvironmentResponse +GetEnvironmentTemplateInput +GetEnvironmentTemplateOutput +GetEnvironmentTemplateVersionInput +GetEnvironmentTemplateVersionOutput +GetEulaRequest +GetEulaResponse +GetEvaluationInput +GetEvaluationOutput +GetEventActionRequest +GetEventActionResponse +GetEventConfigurationByResourceTypesResponse +GetEventDataStoreRequest +GetEventDataStoreResponse +GetEventIntegrationRequest +GetEventIntegrationResponse +GetEventPredictionMetadataRequest +GetEventPredictionMetadataResult +GetEventPredictionRequest +GetEventPredictionResult +GetEventRequest +GetEventResult +GetEventSelectorsRequest +GetEventSelectorsResponse +GetEventSourceMappingRequest +GetEventStreamRequest +GetEventStreamResponse +GetEventTypesRequest +GetEventTypesResult +GetEventsConfigurationRequest +GetEventsConfigurationResponse +GetEvidenceByEvidenceFolderRequest +GetEvidenceByEvidenceFolderResponse +GetEvidenceFileUploadUrlRequest +GetEvidenceFileUploadUrlResponse +GetEvidenceFolderRequest +GetEvidenceFolderResponse +GetEvidenceFoldersByAssessmentControlRequest +GetEvidenceFoldersByAssessmentControlResponse +GetEvidenceFoldersByAssessmentRequest +GetEvidenceFoldersByAssessmentResponse +GetEvidenceRequest +GetEvidenceResponse +GetExclusionsPreviewRequest +GetExclusionsPreviewResponse +GetExecutionHistoryInput +GetExecutionHistoryOutput +GetExpenseAnalysisRequest +GetExpenseAnalysisResponse +GetExperimentRequest +GetExperimentResponse +GetExperimentResultsRequest +GetExperimentResultsResponse +GetExperimentTemplateRequest +GetExperimentTemplateResponse +GetExportJobRequest +GetExportJobResponse +GetExportJobsRequest +GetExportJobsResponse +GetExportRequest +GetExportResponse +GetExportSnapshotRecordsRequest +GetExportSnapshotRecordsResult +GetExtensionAssociationRequest +GetExtensionRequest +GetExtensionResult +GetExtensionVersionRequest +GetExtensionVersionResult +GetExternalDataViewAccessDetailsRequest +GetExternalDataViewAccessDetailsResponse +GetExternalModelsRequest +GetExternalModelsResult +GetFaceDetectionRequest +GetFaceDetectionResponse +GetFaceLivenessSessionResultsRequest +GetFaceLivenessSessionResultsResponse +GetFaceSearchRequest +GetFaceSearchResponse +GetFacetRequest +GetFacetResponse +GetFailbackReplicationConfigurationRequest +GetFailbackReplicationConfigurationResponse +GetFeatureRequest +GetFeatureResponse +GetFederationTokenRequest +GetFederationTokenResponse +GetFeedbackRequest +GetFeedbackResponse +GetFieldLevelEncryptionConfigRequest +GetFieldLevelEncryptionConfigResult +GetFieldLevelEncryptionProfileConfigRequest +GetFieldLevelEncryptionProfileConfigResult +GetFieldLevelEncryptionProfileRequest +GetFieldLevelEncryptionProfileResult +GetFieldLevelEncryptionRequest +GetFieldLevelEncryptionResult +GetFieldResponse +GetFileInput +GetFileOutput +GetFileUploadURLRequest +GetFileUploadURLResponse +GetFilterRequest +GetFilterResponse +GetFindingAggregatorRequest +GetFindingAggregatorResponse +GetFindingHistoryRequest +GetFindingHistoryResponse +GetFindingRequest +GetFindingResponse +GetFindingStatisticsRequest +GetFindingStatisticsResponse +GetFindingsFilterRequest +GetFindingsFilterResponse +GetFindingsPublicationConfigurationResponse +GetFindingsReportAccountSummaryRequest +GetFindingsReportAccountSummaryResponse +GetFindingsReportStatusRequest +GetFindingsReportStatusResponse +GetFindingsRequest +GetFindingsResponse +GetFindingsStatisticsRequest +GetFindingsStatisticsResponse +GetFirewallConfigRequest +GetFirewallConfigResponse +GetFirewallDomainListRequest +GetFirewallDomainListResponse +GetFirewallRuleGroupAssociationRequest +GetFirewallRuleGroupAssociationResponse +GetFirewallRuleGroupPolicyRequest +GetFirewallRuleGroupPolicyResponse +GetFirewallRuleGroupRequest +GetFirewallRuleGroupResponse +GetFleetRequest +GetFleetResponse +GetFlowLogsIntegrationTemplateRequest +GetFlowLogsIntegrationTemplateResult +GetFlowTemplateRequest +GetFlowTemplateResponse +GetFlowTemplateRevisionsRequest +GetFlowTemplateRevisionsResponse +GetFolderInput +GetFolderOutput +GetFolderPathRequest +GetFolderPathResponse +GetFolderRequest +GetFolderResponse +GetFormRequest +GetFormResponse +GetFoundationModelRequest +GetFoundationModelResponse +GetFunctionCodeSigningConfigRequest +GetFunctionCodeSigningConfigResponse +GetFunctionConcurrencyRequest +GetFunctionConcurrencyResponse +GetFunctionConfigurationRequest +GetFunctionDefinitionRequest +GetFunctionDefinitionResponse +GetFunctionDefinitionVersionRequest +GetFunctionDefinitionVersionResponse +GetFunctionEventInvokeConfigRequest +GetFunctionRequest +GetFunctionResponse +GetFunctionResult +GetFunctionUrlConfigRequest +GetFunctionUrlConfigResponse +GetFuotaTaskRequest +GetFuotaTaskResponse +GetGameConfigurationRequest +GetGameConfigurationResult +GetGameRequest +GetGameResult +GetGameSessionLogUrlInput +GetGameSessionLogUrlOutput +GetGatewayGroupRequest +GetGatewayGroupResponse +GetGatewayInput +GetGatewayOutput +GetGatewayRequest +GetGatewayResponse +GetGatewayResponseRequest +GetGatewayResponsesRequest +GetGcmChannelRequest +GetGcmChannelResponse +GetGeneratedCodeJobRequest +GetGeneratedCodeJobResult +GetGeneratedPolicyRequest +GetGeneratedPolicyResponse +GetGeoLocationRequest +GetGeoLocationResponse +GetGeoMatchSetRequest +GetGeoMatchSetResponse +GetGeofenceRequest +GetGeofenceResponse +GetGlobalSettingsResponse +GetGrantRequest +GetGrantResponse +GetGraphqlApiRequest +GetGraphqlApiResponse +GetGremlinQueryStatusInput +GetGremlinQueryStatusOutput +GetGroupCertificateAuthorityRequest +GetGroupCertificateAuthorityResponse +GetGroupCertificateConfigurationRequest +GetGroupCertificateConfigurationResponse +GetGroupConfigurationInput +GetGroupConfigurationOutput +GetGroupIdRequest +GetGroupIdResponse +GetGroupInput +GetGroupMembershipIdRequest +GetGroupMembershipIdResponse +GetGroupOutput +GetGroupPolicyRequest +GetGroupPolicyResponse +GetGroupQueryInput +GetGroupQueryOutput +GetGroupRequest +GetGroupResponse +GetGroupResult +GetGroupVersionRequest +GetGroupVersionResponse +GetGroupsForCapacityReservationRequest +GetGroupsForCapacityReservationResult +GetGroupsRequest +GetGroupsResult +GetHITRequest +GetHITResponse +GetHLSStreamingSessionURLInput +GetHLSStreamingSessionURLOutput +GetHealthCheckCountResponse +GetHealthCheckLastFailureReasonRequest +GetHealthCheckLastFailureReasonResponse +GetHealthCheckRequest +GetHealthCheckResponse +GetHealthCheckStatusRequest +GetHealthCheckStatusResponse +GetHealthEventInput +GetHealthEventOutput +GetHlsManifestConfiguration +GetHomeRegionResult +GetHostInput +GetHostOutput +GetHostReservationPurchasePreviewRequest +GetHostReservationPurchasePreviewResult +GetHostedConfigurationVersionRequest +GetHostedZoneCountResponse +GetHostedZoneLimitRequest +GetHostedZoneLimitResponse +GetHostedZoneRequest +GetHostedZoneResponse +GetHostnameSuggestionRequest +GetHostnameSuggestionResult +GetHypervisorInput +GetHypervisorOutput +GetHypervisorPropertyMappingsInput +GetHypervisorPropertyMappingsOutput +GetIPSetRequest +GetIPSetResponse +GetIceServerConfigRequest +GetIceServerConfigResponse +GetIdInput +GetIdResponse +GetIdentityDkimAttributesRequest +GetIdentityDkimAttributesResponse +GetIdentityMailFromDomainAttributesRequest +GetIdentityMailFromDomainAttributesResponse +GetIdentityNotificationAttributesRequest +GetIdentityNotificationAttributesResponse +GetIdentityPoliciesRequest +GetIdentityPoliciesResponse +GetIdentityPoolConfigurationRequest +GetIdentityPoolConfigurationResponse +GetIdentityPoolRolesInput +GetIdentityPoolRolesResponse +GetIdentityProviderByIdentifierRequest +GetIdentityProviderByIdentifierResponse +GetIdentityProviderRequest +GetIdentityProviderResponse +GetIdentityResolutionJobRequest +GetIdentityResolutionJobResponse +GetIdentitySourceInput +GetIdentitySourceOutput +GetIdentityVerificationAttributesRequest +GetIdentityVerificationAttributesResponse +GetImageBlockPublicAccessStateRequest +GetImageBlockPublicAccessStateResult +GetImageFrameRequest +GetImageFrameResponse +GetImagePipelineRequest +GetImagePipelineResponse +GetImagePolicyRequest +GetImagePolicyResponse +GetImageRecipePolicyRequest +GetImageRecipePolicyResponse +GetImageRecipeRequest +GetImageRecipeResponse +GetImageRequest +GetImageResponse +GetImageSetMetadataRequest +GetImageSetMetadataResponse +GetImageSetRequest +GetImageSetResponse +GetImagesInput +GetImagesOutput +GetImpersonationRoleEffectRequest +GetImpersonationRoleEffectResponse +GetImpersonationRoleRequest +GetImpersonationRoleResponse +GetImportFileTaskRequest +GetImportFileTaskResponse +GetImportJobRequest +GetImportJobResponse +GetImportJobsRequest +GetImportJobsResponse +GetImportRequest +GetImportResponse +GetInAppMessagesRequest +GetInAppMessagesResponse +GetInAppTemplateRequest +GetInAppTemplateResponse +GetIncidentRecordInput +GetIncidentRecordOutput +GetIndexOutput +GetIndexingConfigurationResponse +GetInfrastructureConfigurationRequest +GetInfrastructureConfigurationResponse +GetIngestionDestinationRequest +GetIngestionDestinationResponse +GetIngestionRequest +GetIngestionResponse +GetInlinePolicyForPermissionSetRequest +GetInlinePolicyForPermissionSetResponse +GetInsightEventsRequest +GetInsightEventsResult +GetInsightImpactGraphRequest +GetInsightImpactGraphResult +GetInsightRequest +GetInsightResult +GetInsightResultsRequest +GetInsightResultsResponse +GetInsightRuleReportInput +GetInsightRuleReportOutput +GetInsightSelectorsRequest +GetInsightSelectorsResponse +GetInsightSummariesRequest +GetInsightSummariesResult +GetInsightsByAssessmentRequest +GetInsightsByAssessmentResponse +GetInsightsRequest +GetInsightsResponse +GetInstanceAccessDetailsRequest +GetInstanceAccessDetailsResult +GetInstanceAccessInput +GetInstanceAccessOutput +GetInstanceMetricDataRequest +GetInstanceMetricDataResult +GetInstanceOnboardingJobStatusRequest +GetInstanceOnboardingJobStatusResponse +GetInstancePortStatesRequest +GetInstancePortStatesResult +GetInstanceProfileRequest +GetInstanceProfileResponse +GetInstanceProfileResult +GetInstanceRequest +GetInstanceResponse +GetInstanceResult +GetInstanceSnapshotRequest +GetInstanceSnapshotResult +GetInstanceSnapshotsRequest +GetInstanceSnapshotsResult +GetInstanceStateRequest +GetInstanceStateResult +GetInstanceTypesFromInstanceRequirementsRequest +GetInstanceTypesFromInstanceRequirementsResult +GetInstanceUefiDataRequest +GetInstanceUefiDataResult +GetInstancesHealthStatusRequest +GetInstancesHealthStatusResponse +GetInstancesRequest +GetInstancesResult +GetIntegrationRequest +GetIntegrationResponse +GetIntegrationResponseRequest +GetIntegrationResponseResponse +GetIntegrationResponsesRequest +GetIntegrationResponsesResponse +GetIntegrationResult +GetIntegrationsRequest +GetIntegrationsResponse +GetIntentRequest +GetIntentResponse +GetIntentVersionsRequest +GetIntentVersionsResponse +GetIntentsRequest +GetIntentsResponse +GetInterpolatedAssetPropertyValuesRequest +GetInterpolatedAssetPropertyValuesResponse +GetIntrospectionSchemaRequest +GetIntrospectionSchemaResponse +GetInvalidationRequest +GetInvalidationResult +GetInventoryRequest +GetInventoryResult +GetInventorySchemaRequest +GetInventorySchemaResult +GetInvitationConfigurationResponse +GetInvitationsCountResponse +GetIpAccessSettingsRequest +GetIpAccessSettingsResponse +GetIpamAddressHistoryRequest +GetIpamAddressHistoryResult +GetIpamDiscoveredAccountsRequest +GetIpamDiscoveredAccountsResult +GetIpamDiscoveredResourceCidrsRequest +GetIpamDiscoveredResourceCidrsResult +GetIpamPoolAllocationsRequest +GetIpamPoolAllocationsResult +GetIpamPoolCidrsRequest +GetIpamPoolCidrsResult +GetIpamResourceCidrsRequest +GetIpamResourceCidrsResult +GetItemInput +GetItemOutput +GetJobBookmarkRequest +GetJobBookmarkResponse +GetJobDetailsInput +GetJobDetailsOutput +GetJobDocumentRequest +GetJobDocumentResponse +GetJobManifestRequest +GetJobManifestResult +GetJobOutputInput +GetJobOutputOutput +GetJobRequest +GetJobResponse +GetJobResult +GetJobRunRequest +GetJobRunResponse +GetJobRunsRequest +GetJobRunsResponse +GetJobTaggingRequest +GetJobTaggingResult +GetJobTemplateRequest +GetJobTemplateResponse +GetJobUnlockCodeRequest +GetJobUnlockCodeResult +GetJobsRequest +GetJobsResponse +GetJourneyDateRangeKpiRequest +GetJourneyDateRangeKpiResponse +GetJourneyExecutionActivityMetricsRequest +GetJourneyExecutionActivityMetricsResponse +GetJourneyExecutionMetricsRequest +GetJourneyExecutionMetricsResponse +GetJourneyRequest +GetJourneyResponse +GetJourneyRunExecutionActivityMetricsRequest +GetJourneyRunExecutionActivityMetricsResponse +GetJourneyRunExecutionMetricsRequest +GetJourneyRunExecutionMetricsResponse +GetJourneyRunsRequest +GetJourneyRunsResponse +GetKMSEncryptionKeyResult +GetKeyGroupConfigRequest +GetKeyGroupConfigResult +GetKeyGroupRequest +GetKeyGroupResult +GetKeyInput +GetKeyOutput +GetKeyPairRequest +GetKeyPairResult +GetKeyPairsRequest +GetKeyPairsResult +GetKeyPolicyRequest +GetKeyPolicyResponse +GetKeyRotationStatusRequest +GetKeyRotationStatusResponse +GetKeyspaceRequest +GetKeyspaceResponse +GetKnowledgeBaseRequest +GetKnowledgeBaseResponse +GetKxChangesetRequest +GetKxChangesetResponse +GetKxClusterRequest +GetKxClusterResponse +GetKxConnectionStringRequest +GetKxConnectionStringResponse +GetKxDatabaseRequest +GetKxDatabaseResponse +GetKxEnvironmentRequest +GetKxEnvironmentResponse +GetKxUserRequest +GetKxUserResponse +GetLFTagRequest +GetLFTagResponse +GetLabelDetectionRequest +GetLabelDetectionRequestMetadata +GetLabelDetectionResponse +GetLabelsRequest +GetLabelsResult +GetLambdaFunctionRecommendationsRequest +GetLambdaFunctionRecommendationsResponse +GetLatestAssessmentIdResponse +GetLatestConfigurationRequest +GetLatestConfigurationResponse +GetLaunchConfigurationRequest +GetLaunchProfileDetailsRequest +GetLaunchProfileDetailsResponse +GetLaunchProfileInitializationRequest +GetLaunchProfileInitializationResponse +GetLaunchProfileMemberRequest +GetLaunchProfileMemberResponse +GetLaunchProfileRequest +GetLaunchProfileResponse +GetLaunchRequest +GetLaunchResponse +GetLaunchTemplateDataRequest +GetLaunchTemplateDataResult +GetLayerVersionByArnRequest +GetLayerVersionPolicyRequest +GetLayerVersionPolicyResponse +GetLayerVersionRequest +GetLayerVersionResponse +GetLayoutRequest +GetLayoutResponse +GetLegalHoldInput +GetLegalHoldOutput +GetLendingAnalysisRequest +GetLendingAnalysisResponse +GetLendingAnalysisSummaryRequest +GetLendingAnalysisSummaryResponse +GetLensInput +GetLensOutput +GetLensReviewInput +GetLensReviewOutput +GetLensReviewReportInput +GetLensReviewReportOutput +GetLensVersionDifferenceInput +GetLensVersionDifferenceOutput +GetLexiconInput +GetLexiconOutput +GetLicenseConfigurationRequest +GetLicenseConfigurationResponse +GetLicenseConversionTaskRequest +GetLicenseConversionTaskResponse +GetLicenseManagerReportGeneratorRequest +GetLicenseManagerReportGeneratorResponse +GetLicenseRecommendationsRequest +GetLicenseRecommendationsResponse +GetLicenseRequest +GetLicenseResponse +GetLicenseUsageRequest +GetLicenseUsageResponse +GetLifecyclePoliciesRequest +GetLifecyclePoliciesResponse +GetLifecyclePolicyInput +GetLifecyclePolicyOutput +GetLifecyclePolicyPreviewRequest +GetLifecyclePolicyPreviewResponse +GetLifecyclePolicyRequest +GetLifecyclePolicyResponse +GetLineageGroupPolicyRequest +GetLineageGroupPolicyResponse +GetLinkAssociationsRequest +GetLinkAssociationsResponse +GetLinkAttributes +GetLinkAttributesRequest +GetLinkAttributesResponse +GetLinkInput +GetLinkOutput +GetLinksRequest +GetLinksResponse +GetListElementsRequest +GetListElementsResult +GetListenerRequest +GetListenerResponse +GetListsMetadataRequest +GetListsMetadataResult +GetLoadBalancerMetricDataRequest +GetLoadBalancerMetricDataResult +GetLoadBalancerRequest +GetLoadBalancerResult +GetLoadBalancerTlsCertificatesRequest +GetLoadBalancerTlsCertificatesResult +GetLoadBalancerTlsPoliciesRequest +GetLoadBalancerTlsPoliciesResult +GetLoadBalancersRequest +GetLoadBalancersResult +GetLoaderJobStatusInput +GetLoaderJobStatusOutput +GetLogDeliveryConfigurationRequest +GetLogDeliveryConfigurationResponse +GetLogEventsRequest +GetLogEventsResponse +GetLogGroupFieldsRequest +GetLogGroupFieldsResponse +GetLogLevelsByResourceTypesResponse +GetLogRecordRequest +GetLogRecordResponse +GetLoggerDefinitionRequest +GetLoggerDefinitionResponse +GetLoggerDefinitionVersionRequest +GetLoggerDefinitionVersionResponse +GetLoggingConfigurationRequest +GetLoggingConfigurationResponse +GetLoggingOptionsResponse +GetLoginProfileRequest +GetLoginProfileResponse +GetLowLatencyHlsManifestConfiguration +GetMFADeviceRequest +GetMFADeviceResponse +GetMLDataProcessingJobInput +GetMLDataProcessingJobOutput +GetMLEndpointInput +GetMLEndpointOutput +GetMLModelInput +GetMLModelOutput +GetMLModelTrainingJobInput +GetMLModelTrainingJobOutput +GetMLModelTransformJobInput +GetMLModelTransformJobOutput +GetMLTaskRunRequest +GetMLTaskRunResponse +GetMLTaskRunsRequest +GetMLTaskRunsResponse +GetMLTransformRequest +GetMLTransformResponse +GetMLTransformsRequest +GetMLTransformsResponse +GetMacieSessionResponse +GetMailDomainRequest +GetMailDomainResponse +GetMailboxDetailsRequest +GetMailboxDetailsResponse +GetMaintenanceWindowExecutionRequest +GetMaintenanceWindowExecutionResult +GetMaintenanceWindowExecutionTaskInvocationRequest +GetMaintenanceWindowExecutionTaskInvocationResult +GetMaintenanceWindowExecutionTaskRequest +GetMaintenanceWindowExecutionTaskResult +GetMaintenanceWindowRequest +GetMaintenanceWindowResult +GetMaintenanceWindowTaskRequest +GetMaintenanceWindowTaskResult +GetMalwareScanSettingsRequest +GetMalwareScanSettingsResponse +GetManagedEndpointSessionCredentialsRequest +GetManagedEndpointSessionCredentialsResponse +GetManagedPrefixListAssociationsRequest +GetManagedPrefixListAssociationsResult +GetManagedPrefixListEntriesRequest +GetManagedPrefixListEntriesResult +GetManagedResourceRequest +GetManagedResourceResponse +GetManagedRuleSetRequest +GetManagedRuleSetResponse +GetManagedScalingPolicyInput +GetManagedScalingPolicyOutput +GetMapGlyphsRequest +GetMapGlyphsResponse +GetMapSpritesRequest +GetMapSpritesResponse +GetMapStyleDescriptorRequest +GetMapStyleDescriptorResponse +GetMapTileRequest +GetMapTileResponse +GetMappingRequest +GetMappingResponse +GetMasterAccountRequest +GetMasterAccountResponse +GetMatchIdInput +GetMatchIdOutput +GetMatchesRequest +GetMatchesResponse +GetMatchingJobInput +GetMatchingJobOutput +GetMatchingWorkflowInput +GetMatchingWorkflowOutput +GetMediaCapturePipelineRequest +GetMediaCapturePipelineResponse +GetMediaForFragmentListInput +GetMediaForFragmentListOutput +GetMediaInput +GetMediaInsightsPipelineConfigurationRequest +GetMediaInsightsPipelineConfigurationResponse +GetMediaOutput +GetMediaPipelineKinesisVideoStreamPoolRequest +GetMediaPipelineKinesisVideoStreamPoolResponse +GetMediaPipelineRequest +GetMediaPipelineResponse +GetMedicalTranscriptionJobRequest +GetMedicalTranscriptionJobResponse +GetMedicalVocabularyRequest +GetMedicalVocabularyResponse +GetMeetingRequest +GetMeetingResponse +GetMemberDetectorsRequest +GetMemberDetectorsResponse +GetMemberInput +GetMemberOutput +GetMemberRequest +GetMemberResponse +GetMembersRequest +GetMembersResponse +GetMembershipInput +GetMembershipOutput +GetMergeCommitInput +GetMergeCommitOutput +GetMergeConflictsInput +GetMergeConflictsOutput +GetMergeOptionsInput +GetMergeOptionsOutput +GetMessageInsightsRequest +GetMessageInsightsResponse +GetMessagingSessionEndpointResponse +GetMessagingStreamingConfigurationsRequest +GetMessagingStreamingConfigurationsResponse +GetMetadataRequest +GetMetadataResponse +GetMethodRequest +GetMethodResponseRequest +GetMetricDataInput +GetMetricDataOutput +GetMetricDataRequest +GetMetricDataResponse +GetMetricDataV2Request +GetMetricDataV2Response +GetMetricPolicyInput +GetMetricPolicyOutput +GetMetricStatisticsInput +GetMetricStatisticsOutput +GetMetricStreamInput +GetMetricStreamOutput +GetMetricWidgetImageInput +GetMetricWidgetImageOutput +GetMetricsSummaryRequest +GetMetricsSummaryResponse +GetMigrationRequest +GetMigrationResponse +GetMigrationWorkflowRequest +GetMigrationWorkflowResponse +GetMigrationWorkflowTemplateRequest +GetMigrationWorkflowTemplateResponse +GetMigrationsRequest +GetMigrationsResponse +GetMilestoneInput +GetMilestoneOutput +GetMinuteUsageRequest +GetMinuteUsageResponse +GetMissionProfileRequest +GetMissionProfileResponse +GetMobileDeviceAccessEffectRequest +GetMobileDeviceAccessEffectResponse +GetMobileDeviceAccessOverrideRequest +GetMobileDeviceAccessOverrideResponse +GetMobileSdkReleaseRequest +GetMobileSdkReleaseResponse +GetModelCustomizationJobRequest +GetModelCustomizationJobResponse +GetModelInvocationLoggingConfigurationResponse +GetModelManifestRequest +GetModelManifestResponse +GetModelPackageGroupPolicyInput +GetModelPackageGroupPolicyOutput +GetModelRequest +GetModelResponse +GetModelTemplateRequest +GetModelTemplateResponse +GetModelVersionRequest +GetModelVersionResult +GetModelsRequest +GetModelsResponse +GetModelsResult +GetMonitorInput +GetMonitorOutput +GetMonitoringSubscriptionRequest +GetMonitoringSubscriptionResult +GetMultiRegionAccessPointPolicyRequest +GetMultiRegionAccessPointPolicyResult +GetMultiRegionAccessPointPolicyStatusRequest +GetMultiRegionAccessPointPolicyStatusResult +GetMultiRegionAccessPointRequest +GetMultiRegionAccessPointResult +GetMultiRegionAccessPointRoutesRequest +GetMultiRegionAccessPointRoutesResult +GetMulticastGroupRequest +GetMulticastGroupResponse +GetMulticastGroupSessionRequest +GetMulticastGroupSessionResponse +GetNamedQueryInput +GetNamedQueryOutput +GetNamespaceDeletionStatusResponse +GetNamespaceRequest +GetNamespaceResponse +GetNetworkAnalyzerConfigurationRequest +GetNetworkAnalyzerConfigurationResponse +GetNetworkInput +GetNetworkInsightsAccessScopeAnalysisFindingsRequest +GetNetworkInsightsAccessScopeAnalysisFindingsResult +GetNetworkInsightsAccessScopeContentRequest +GetNetworkInsightsAccessScopeContentResult +GetNetworkOutput +GetNetworkProfileRequest +GetNetworkProfileResponse +GetNetworkProfileResult +GetNetworkRequest +GetNetworkResourceCountsRequest +GetNetworkResourceCountsResponse +GetNetworkResourceRelationshipsRequest +GetNetworkResourceRelationshipsResponse +GetNetworkResourceRequest +GetNetworkResourceResponse +GetNetworkResourcesRequest +GetNetworkResourcesResponse +GetNetworkResponse +GetNetworkRoutesRequest +GetNetworkRoutesResponse +GetNetworkSettingsRequest +GetNetworkSettingsResponse +GetNetworkSiteRequest +GetNetworkSiteResponse +GetNetworkTelemetryRequest +GetNetworkTelemetryResponse +GetNodeInput +GetNodeOutput +GetNotebookMetadataInput +GetNotebookMetadataOutput +GetNotificationChannelResponse +GetNotificationConfigurationRequest +GetNotificationConfigurationResponse +GetOTAUpdateRequest +GetOTAUpdateResponse +GetObjectAclOutput +GetObjectAclRequest +GetObjectAttributes +GetObjectAttributesOutput +GetObjectAttributesParts +GetObjectAttributesRequest +GetObjectAttributesResponse +GetObjectInformation +GetObjectInformationRequest +GetObjectInformationResponse +GetObjectLegalHoldOutput +GetObjectLegalHoldRequest +GetObjectLockConfigurationOutput +GetObjectLockConfigurationRequest +GetObjectMetadataInput +GetObjectMetadataOutput +GetObjectOutput +GetObjectRequest +GetObjectResponse +GetObjectRetentionOutput +GetObjectRetentionRequest +GetObjectTaggingOutput +GetObjectTaggingRequest +GetObjectTorrentOutput +GetObjectTorrentRequest +GetOfferingStatusRequest +GetOfferingStatusResult +GetOnPremisesInstanceInput +GetOnPremisesInstanceOutput +GetOpenCypherQueryStatusInput +GetOpenCypherQueryStatusOutput +GetOpenIDConnectProviderRequest +GetOpenIDConnectProviderResponse +GetOpenIdTokenForDeveloperIdentityInput +GetOpenIdTokenForDeveloperIdentityResponse +GetOpenIdTokenInput +GetOpenIdTokenResponse +GetOperationDetailRequest +GetOperationDetailResponse +GetOperationInput +GetOperationOutput +GetOperationRequest +GetOperationResponse +GetOperationResult +GetOperationsForResourceRequest +GetOperationsForResourceResult +GetOperationsRequest +GetOperationsResult +GetOpsItemRequest +GetOpsItemResponse +GetOpsMetadataRequest +GetOpsMetadataResult +GetOpsSummaryRequest +GetOpsSummaryResult +GetOrderInput +GetOrderOutput +GetOrderRequest +GetOrderResponse +GetOrganizationAdminAccountResponse +GetOrganizationConfigRuleDetailedStatusRequest +GetOrganizationConfigRuleDetailedStatusResponse +GetOrganizationConformancePackDetailedStatusRequest +GetOrganizationConformancePackDetailedStatusResponse +GetOrganizationCustomRulePolicyRequest +GetOrganizationCustomRulePolicyResponse +GetOrganizationsAccessReportRequest +GetOrganizationsAccessReportResponse +GetOriginAccessControlConfigRequest +GetOriginAccessControlConfigResult +GetOriginAccessControlRequest +GetOriginAccessControlResult +GetOriginEndpointPolicyRequest +GetOriginEndpointPolicyResponse +GetOriginEndpointRequest +GetOriginEndpointResponse +GetOriginRequestPolicyConfigRequest +GetOriginRequestPolicyConfigResult +GetOriginRequestPolicyRequest +GetOriginRequestPolicyResult +GetOutcomesRequest +GetOutcomesResult +GetOutpostInput +GetOutpostInstanceTypesInput +GetOutpostInstanceTypesOutput +GetOutpostOutput +GetOutpostResolverRequest +GetOutpostResolverResponse +GetPackageConfigurationResponse +GetPackageRequest +GetPackageResponse +GetPackageVersionAssetRequest +GetPackageVersionAssetResult +GetPackageVersionHistoryRequest +GetPackageVersionHistoryResponse +GetPackageVersionReadmeRequest +GetPackageVersionReadmeResult +GetPackageVersionRequest +GetPackageVersionResponse +GetParallelDataRequest +GetParallelDataResponse +GetParameterHistoryRequest +GetParameterHistoryResult +GetParameterRequest +GetParameterResult +GetParametersByPathRequest +GetParametersByPathResult +GetParametersForExportInput +GetParametersForExportOutput +GetParametersForImportInput +GetParametersForImportOutput +GetParametersForImportRequest +GetParametersForImportResponse +GetParametersRequest +GetParametersResult +GetParticipantRequest +GetParticipantResponse +GetPartitionIndexesRequest +GetPartitionIndexesResponse +GetPartitionRequest +GetPartitionResponse +GetPartitionsRequest +GetPartitionsResponse +GetPartnerAccountRequest +GetPartnerAccountResponse +GetPasswordDataRequest +GetPasswordDataResult +GetPatchBaselineForPatchGroupRequest +GetPatchBaselineForPatchGroupResult +GetPatchBaselineRequest +GetPatchBaselineResult +GetPendingJobExecutionsRequest +GetPendingJobExecutionsResponse +GetPercentilesRequest +GetPercentilesResponse +GetPerformanceAnalysisReportRequest +GetPerformanceAnalysisReportResponse +GetPermissionGroupRequest +GetPermissionGroupResponse +GetPermissionPolicyRequest +GetPermissionPolicyResponse +GetPermissionRequest +GetPermissionResponse +GetPermissionsBoundaryForPermissionSetRequest +GetPermissionsBoundaryForPermissionSetResponse +GetPersonTrackingRequest +GetPersonTrackingResponse +GetPersonalizedRankingRequest +GetPersonalizedRankingResponse +GetPhoneNumberOrderRequest +GetPhoneNumberOrderResponse +GetPhoneNumberRequest +GetPhoneNumberResponse +GetPhoneNumberSettingsResponse +GetPipelineBlueprintRequest +GetPipelineBlueprintResponse +GetPipelineChangeProgressRequest +GetPipelineChangeProgressResponse +GetPipelineDefinitionInput +GetPipelineDefinitionOutput +GetPipelineExecutionInput +GetPipelineExecutionOutput +GetPipelineInput +GetPipelineOutput +GetPipelineRequest +GetPipelineResponse +GetPipelineStateInput +GetPipelineStateOutput +GetPlaceRequest +GetPlaceResponse +GetPlanRequest +GetPlanResponse +GetPlatformApplicationAttributesInput +GetPlatformApplicationAttributesResponse +GetPlaybackConfigurationRequest +GetPlaybackConfigurationResponse +GetPlaybackKeyPairRequest +GetPlaybackKeyPairResponse +GetPlayerConnectionStatusRequest +GetPlayerConnectionStatusResult +GetPoliciesStatsResponse +GetPolicyInput +GetPolicyOutput +GetPolicyRequest +GetPolicyResponse +GetPolicyStoreInput +GetPolicyStoreOutput +GetPolicyTemplateInput +GetPolicyTemplateOutput +GetPolicyVersionRequest +GetPolicyVersionResponse +GetPortalRequest +GetPortalResponse +GetPortalServiceProviderMetadataRequest +GetPortalServiceProviderMetadataResponse +GetPortfolioPreferencesResponse +GetPortfolioSummaryResponse +GetPositionConfigurationRequest +GetPositionConfigurationResponse +GetPositionEstimateRequest +GetPositionEstimateResponse +GetPositionRequest +GetPositionResponse +GetPredictiveScalingForecastAnswer +GetPredictiveScalingForecastType +GetPrefetchScheduleRequest +GetPrefetchScheduleResponse +GetPreparedStatementInput +GetPreparedStatementOutput +GetPresetRequest +GetPresetResponse +GetPriceListFileUrlRequest +GetPriceListFileUrlResponse +GetPricingPlanResponse +GetPrincipalTagAttributeMapInput +GetPrincipalTagAttributeMapResponse +GetProductsRequest +GetProductsResponse +GetProfileInput +GetProfileObjectTypeRequest +GetProfileObjectTypeResponse +GetProfileObjectTypeTemplateRequest +GetProfileObjectTypeTemplateResponse +GetProfileOutput +GetProfileRequest +GetProfileResponse +GetProfileTemplateOutput +GetProgrammaticAccessCredentialsRequest +GetProgrammaticAccessCredentialsResponse +GetProjectRequest +GetProjectResponse +GetProjectResult +GetPromptFileRequest +GetPromptFileResponse +GetPropertyValueHistoryRequest +GetPropertyValueHistoryResponse +GetPropertyValueRequest +GetPropertyValueResponse +GetPropertygraphStatisticsOutput +GetPropertygraphStreamInput +GetPropertygraphStreamOutput +GetPropertygraphSummaryInput +GetPropertygraphSummaryOutput +GetProposalInput +GetProposalOutput +GetProtectedQueryInput +GetProtectedQueryOutput +GetProtectionStatusRequest +GetProtectionStatusResponse +GetProtocolsListRequest +GetProtocolsListResponse +GetProvisionedConcurrencyConfigRequest +GetProvisionedConcurrencyConfigResponse +GetProvisionedModelThroughputRequest +GetProvisionedModelThroughputResponse +GetProvisionedProductOutputsInput +GetProvisionedProductOutputsOutput +GetProxySessionRequest +GetProxySessionResponse +GetPublicAccessBlockOutput +GetPublicAccessBlockRequest +GetPublicKeyCertificateInput +GetPublicKeyCertificateOutput +GetPublicKeyConfigRequest +GetPublicKeyConfigResult +GetPublicKeyRequest +GetPublicKeyResponse +GetPublicKeyResult +GetPullRequestApprovalStatesInput +GetPullRequestApprovalStatesOutput +GetPullRequestInput +GetPullRequestOutput +GetPullRequestOverrideStateInput +GetPullRequestOverrideStateOutput +GetPushTemplateRequest +GetPushTemplateResponse +GetQualificationScoreRequest +GetQualificationScoreResponse +GetQualificationTypeRequest +GetQualificationTypeResponse +GetQuantumTaskRequest +GetQuantumTaskResponse +GetQueryExecutionInput +GetQueryExecutionOutput +GetQueryLoggingConfigRequest +GetQueryLoggingConfigResponse +GetQueryResultsInput +GetQueryResultsOutput +GetQueryResultsRequest +GetQueryResultsResponse +GetQueryRuntimeStatisticsInput +GetQueryRuntimeStatisticsOutput +GetQueryStateRequest +GetQueryStateResponse +GetQueryStatisticsRequest +GetQueryStatisticsResponse +GetQuerySuggestionsRequest +GetQuerySuggestionsResponse +GetQueueAttributesRequest +GetQueueAttributesResult +GetQueueRequest +GetQueueResponse +GetQueueUrlRequest +GetQueueUrlResult +GetRDFGraphSummaryInput +GetRDFGraphSummaryOutput +GetRandomPasswordRequest +GetRandomPasswordResponse +GetRasterDataCollectionInput +GetRasterDataCollectionOutput +GetRateBasedRuleManagedKeysRequest +GetRateBasedRuleManagedKeysResponse +GetRateBasedRuleRequest +GetRateBasedRuleResponse +GetRateBasedStatementManagedKeysRequest +GetRateBasedStatementManagedKeysResponse +GetRawMessageContentRequest +GetRawMessageContentResponse +GetReadSetActivationJobRequest +GetReadSetActivationJobResponse +GetReadSetExportJobRequest +GetReadSetExportJobResponse +GetReadSetImportJobRequest +GetReadSetImportJobResponse +GetReadSetMetadataRequest +GetReadSetMetadataResponse +GetReadSetRequest +GetReadSetResponse +GetReadinessCheckRequest +GetReadinessCheckResourceStatusRequest +GetReadinessCheckResourceStatusResponse +GetReadinessCheckResponse +GetReadinessCheckStatusRequest +GetReadinessCheckStatusResponse +GetRealtimeLogConfigRequest +GetRealtimeLogConfigResult +GetRecommendationError +GetRecommendationPreferencesRequest +GetRecommendationPreferencesResponse +GetRecommendationReportDetailsRequest +GetRecommendationReportDetailsResponse +GetRecommendationSummariesRequest +GetRecommendationSummariesResponse +GetRecommendationsRequest +GetRecommendationsResponse +GetRecommenderConfigurationRequest +GetRecommenderConfigurationResponse +GetRecommenderConfigurationsRequest +GetRecommenderConfigurationsResponse +GetRecordRequest +GetRecordResponse +GetRecordingConfigurationRequest +GetRecordingConfigurationResponse +GetRecordsInput +GetRecordsOutput +GetRecoveryGroupReadinessSummaryRequest +GetRecoveryGroupReadinessSummaryResponse +GetRecoveryGroupRequest +GetRecoveryGroupResponse +GetRecoveryPointRequest +GetRecoveryPointResponse +GetRecoveryPointRestoreMetadataInput +GetRecoveryPointRestoreMetadataOutput +GetReferenceImportJobRequest +GetReferenceImportJobResponse +GetReferenceMetadataRequest +GetReferenceMetadataResponse +GetReferenceRequest +GetReferenceResponse +GetReferenceStoreRequest +GetReferenceStoreResponse +GetRegexMatchSetRequest +GetRegexMatchSetResponse +GetRegexPatternSetRequest +GetRegexPatternSetResponse +GetRegionOptStatusRequest +GetRegionOptStatusResponse +GetRegionsRequest +GetRegionsResult +GetRegisterAccountStatusResponse +GetRegistrationCodeResponse +GetRegistryCatalogDataResponse +GetRegistryInput +GetRegistryPolicyResponse +GetRegistryResponse +GetRegistryScanningConfigurationResponse +GetRelationalDatabaseBlueprintsRequest +GetRelationalDatabaseBlueprintsResult +GetRelationalDatabaseBundlesRequest +GetRelationalDatabaseBundlesResult +GetRelationalDatabaseEventsRequest +GetRelationalDatabaseEventsResult +GetRelationalDatabaseLogEventsRequest +GetRelationalDatabaseLogEventsResult +GetRelationalDatabaseLogStreamsRequest +GetRelationalDatabaseLogStreamsResult +GetRelationalDatabaseMasterUserPasswordRequest +GetRelationalDatabaseMasterUserPasswordResult +GetRelationalDatabaseMetricDataRequest +GetRelationalDatabaseMetricDataResult +GetRelationalDatabaseParametersRequest +GetRelationalDatabaseParametersResult +GetRelationalDatabaseRequest +GetRelationalDatabaseResult +GetRelationalDatabaseSnapshotRequest +GetRelationalDatabaseSnapshotResult +GetRelationalDatabaseSnapshotsRequest +GetRelationalDatabaseSnapshotsResult +GetRelationalDatabasesRequest +GetRelationalDatabasesResult +GetRemainingFreeTrialDaysRequest +GetRemainingFreeTrialDaysResponse +GetRemoteAccessSessionRequest +GetRemoteAccessSessionResult +GetReplicationConfigurationRequest +GetReplicationJobsRequest +GetReplicationJobsResponse +GetReplicationRunsRequest +GetReplicationRunsResponse +GetReplicationSetInput +GetReplicationSetOutput +GetReportDefinitionRequest +GetReportDefinitionResult +GetReportGroupTrendInput +GetReportGroupTrendOutput +GetRepositoryCatalogDataRequest +GetRepositoryCatalogDataResponse +GetRepositoryEndpointRequest +GetRepositoryEndpointResult +GetRepositoryInput +GetRepositoryOutput +GetRepositoryPermissionsPolicyRequest +GetRepositoryPermissionsPolicyResult +GetRepositoryPolicyRequest +GetRepositoryPolicyResponse +GetRepositorySyncStatusInput +GetRepositorySyncStatusOutput +GetRepositoryTriggersInput +GetRepositoryTriggersOutput +GetRequestMetadata +GetRequestValidatorRequest +GetRequestValidatorsRequest +GetRequestedServiceQuotaChangeRequest +GetRequestedServiceQuotaChangeResponse +GetReservationCoverageRequest +GetReservationCoverageResponse +GetReservationPurchaseRecommendationRequest +GetReservationPurchaseRecommendationResponse +GetReservationUtilizationRequest +GetReservationUtilizationResponse +GetReservedInstancesExchangeQuoteRequest +GetReservedInstancesExchangeQuoteResult +GetReservedNodeExchangeConfigurationOptionsInputMessage +GetReservedNodeExchangeConfigurationOptionsOutputMessage +GetReservedNodeExchangeOfferingsInputMessage +GetReservedNodeExchangeOfferingsOutputMessage +GetResolverConfigRequest +GetResolverConfigResponse +GetResolverDnssecConfigRequest +GetResolverDnssecConfigResponse +GetResolverEndpointRequest +GetResolverEndpointResponse +GetResolverQueryLogConfigAssociationRequest +GetResolverQueryLogConfigAssociationResponse +GetResolverQueryLogConfigPolicyRequest +GetResolverQueryLogConfigPolicyResponse +GetResolverQueryLogConfigRequest +GetResolverQueryLogConfigResponse +GetResolverRequest +GetResolverResponse +GetResolverRuleAssociationRequest +GetResolverRuleAssociationResponse +GetResolverRulePolicyRequest +GetResolverRulePolicyResponse +GetResolverRuleRequest +GetResolverRuleResponse +GetResourceCollectionRequest +GetResourceCollectionResponse +GetResourceConfigHistoryRequest +GetResourceConfigHistoryResponse +GetResourceDefinitionRequest +GetResourceDefinitionResponse +GetResourceDefinitionVersionRequest +GetResourceDefinitionVersionResponse +GetResourceEvaluationSummaryRequest +GetResourceEvaluationSummaryResponse +GetResourceEventConfigurationRequest +GetResourceEventConfigurationResponse +GetResourceInput +GetResourceLFTagsRequest +GetResourceLFTagsResponse +GetResourceLogLevelRequest +GetResourceLogLevelResponse +GetResourceMetadataRequest +GetResourceMetadataResponse +GetResourceMetricsRequest +GetResourceMetricsResponse +GetResourceOutput +GetResourcePermissionInput +GetResourcePermissionOutput +GetResourcePoliciesInput +GetResourcePoliciesOutput +GetResourcePoliciesRequest +GetResourcePoliciesResponse +GetResourcePoliciesResponseEntry +GetResourcePoliciesResponseList +GetResourcePolicyInput +GetResourcePolicyOutput +GetResourcePolicyRequest +GetResourcePolicyResponse +GetResourcePositionRequest +GetResourcePositionResponse +GetResourceProfileRequest +GetResourceProfileResponse +GetResourceRequest +GetResourceRequestStatusInput +GetResourceRequestStatusOutput +GetResourceSetRequest +GetResourceSetResponse +GetResourceShareAssociationsRequest +GetResourceShareAssociationsResponse +GetResourceShareInvitationsRequest +GetResourceShareInvitationsResponse +GetResourceSharesRequest +GetResourceSharesResponse +GetResourcesInput +GetResourcesOutput +GetResourcesRequest +GetResourcesResponse +GetResourcesSummaryOutput +GetResponseHeadersPolicyConfigRequest +GetResponseHeadersPolicyConfigResult +GetResponseHeadersPolicyRequest +GetResponseHeadersPolicyResult +GetResponsePlanInput +GetResponsePlanOutput +GetRestApiRequest +GetRestApisRequest +GetRetainedMessageRequest +GetRetainedMessageResponse +GetRetentionSettingsRequest +GetRetentionSettingsResponse +GetReusableDelegationSetLimitRequest +GetReusableDelegationSetLimitResponse +GetReusableDelegationSetRequest +GetReusableDelegationSetResponse +GetRevealConfigurationResponse +GetRevisionRequest +GetRevisionResponse +GetRevocationStatusRequest +GetRevocationStatusResponse +GetRightsizingRecommendationRequest +GetRightsizingRecommendationResponse +GetRoleCredentialsRequest +GetRoleCredentialsResponse +GetRolePolicyRequest +GetRolePolicyResponse +GetRoleRequest +GetRoleResponse +GetRoomRequest +GetRoomResponse +GetRoomSkillParameterRequest +GetRoomSkillParameterResponse +GetRotationOverrideRequest +GetRotationOverrideResult +GetRotationRequest +GetRotationResult +GetRouteAnalysisRequest +GetRouteAnalysisResponse +GetRouteRequest +GetRouteResponse +GetRouteResponseRequest +GetRouteResponseResponse +GetRouteResponsesRequest +GetRouteResponsesResponse +GetRouteResult +GetRoutesRequest +GetRoutesResponse +GetRoutingControlStateRequest +GetRoutingControlStateResponse +GetRuleGroupRequest +GetRuleGroupResponse +GetRuleRequest +GetRuleResponse +GetRulesRequest +GetRulesResult +GetRunGroupRequest +GetRunGroupResponse +GetRunRequest +GetRunResponse +GetRunResult +GetRunTaskRequest +GetRunTaskResponse +GetRuntimeManagementConfigRequest +GetRuntimeManagementConfigResponse +GetSAMLProviderRequest +GetSAMLProviderResponse +GetSMSAttributesInput +GetSMSAttributesResponse +GetSMSSandboxAccountStatusResult +GetSSHPublicKeyRequest +GetSSHPublicKeyResponse +GetSagemakerServicecatalogPortfolioStatusOutput +GetSampleDataRequest +GetSampleDataResponse +GetSampledRequestsRequest +GetSampledRequestsResponse +GetSamplingRulesRequest +GetSamplingRulesResult +GetSamplingStatisticSummariesRequest +GetSamplingStatisticSummariesResult +GetSamplingTargetsRequest +GetSamplingTargetsResult +GetSatelliteRequest +GetSatelliteResponse +GetSavingsPlanPurchaseRecommendationDetailsRequest +GetSavingsPlanPurchaseRecommendationDetailsResponse +GetSavingsPlansCoverageRequest +GetSavingsPlansCoverageResponse +GetSavingsPlansPurchaseRecommendationRequest +GetSavingsPlansPurchaseRecommendationResponse +GetSavingsPlansUtilizationDetailsRequest +GetSavingsPlansUtilizationDetailsResponse +GetSavingsPlansUtilizationRequest +GetSavingsPlansUtilizationResponse +GetSbomExportRequest +GetSbomExportResponse +GetScalingConfigurationRecommendationRequest +GetScalingConfigurationRecommendationResponse +GetScalingPlanResourceForecastDataRequest +GetScalingPlanResourceForecastDataResponse +GetScanRequest +GetScanResponse +GetSceneRequest +GetSceneResponse +GetScheduleGroupInput +GetScheduleGroupOutput +GetScheduleInput +GetScheduleOutput +GetSchemaAnalysisRuleInput +GetSchemaAnalysisRuleOutput +GetSchemaAsJsonRequest +GetSchemaAsJsonResponse +GetSchemaByDefinitionInput +GetSchemaByDefinitionResponse +GetSchemaCreationStatusRequest +GetSchemaCreationStatusResponse +GetSchemaInput +GetSchemaMappingInput +GetSchemaMappingOutput +GetSchemaOutput +GetSchemaResponse +GetSchemaVersionInput +GetSchemaVersionResponse +GetSchemaVersionsDiffInput +GetSchemaVersionsDiffResponse +GetScreenDataRequest +GetScreenDataResult +GetSdkRequest +GetSdkTypeRequest +GetSdkTypesRequest +GetSearchSuggestionsRequest +GetSearchSuggestionsResponse +GetSecretValueRequest +GetSecretValueResponse +GetSecurityConfigRequest +GetSecurityConfigResponse +GetSecurityConfigurationRequest +GetSecurityConfigurationResponse +GetSecurityConfigurationsRequest +GetSecurityConfigurationsResponse +GetSecurityPolicyRequest +GetSecurityPolicyResponse +GetSegmentDetectionRequest +GetSegmentDetectionResponse +GetSegmentExportJobsRequest +GetSegmentExportJobsResponse +GetSegmentImportJobsRequest +GetSegmentImportJobsResponse +GetSegmentRequest +GetSegmentResponse +GetSegmentVersionRequest +GetSegmentVersionResponse +GetSegmentVersionsRequest +GetSegmentVersionsResponse +GetSegmentsRequest +GetSegmentsResponse +GetSendQuotaResponse +GetSendStatisticsResponse +GetSensitiveDataOccurrencesAvailabilityRequest +GetSensitiveDataOccurrencesAvailabilityResponse +GetSensitiveDataOccurrencesRequest +GetSensitiveDataOccurrencesResponse +GetSensitivityInspectionTemplateRequest +GetSensitivityInspectionTemplateResponse +GetSequenceStoreRequest +GetSequenceStoreResponse +GetSerialConsoleAccessStatusRequest +GetSerialConsoleAccessStatusResult +GetServerCertificateRequest +GetServerCertificateResponse +GetServerDetailsRequest +GetServerDetailsResponse +GetServerStrategiesRequest +GetServerStrategiesResponse +GetServersRequest +GetServersResponse +GetServiceEndpointRequest +GetServiceEndpointResponse +GetServiceGraphRequest +GetServiceGraphResult +GetServiceInput +GetServiceInstanceInput +GetServiceInstanceOutput +GetServiceInstanceSyncStatusInput +GetServiceInstanceSyncStatusOutput +GetServiceLastAccessedDetailsRequest +GetServiceLastAccessedDetailsResponse +GetServiceLastAccessedDetailsWithEntitiesRequest +GetServiceLastAccessedDetailsWithEntitiesResponse +GetServiceLinkedRoleDeletionStatusRequest +GetServiceLinkedRoleDeletionStatusResponse +GetServiceNetworkRequest +GetServiceNetworkResponse +GetServiceNetworkServiceAssociationRequest +GetServiceNetworkServiceAssociationResponse +GetServiceNetworkVpcAssociationRequest +GetServiceNetworkVpcAssociationResponse +GetServiceOutput +GetServicePrincipalNameRequest +GetServicePrincipalNameResponse +GetServiceProfileRequest +GetServiceProfileResponse +GetServiceQuotaIncreaseRequestFromTemplateRequest +GetServiceQuotaIncreaseRequestFromTemplateResponse +GetServiceQuotaRequest +GetServiceQuotaResponse +GetServiceRequest +GetServiceResponse +GetServiceRoleForAccountResponse +GetServiceSettingRequest +GetServiceSettingResult +GetServiceSettingsResponse +GetServiceSyncBlockerSummaryInput +GetServiceSyncBlockerSummaryOutput +GetServiceSyncConfigInput +GetServiceSyncConfigOutput +GetServiceTemplateInput +GetServiceTemplateOutput +GetServiceTemplateVersionInput +GetServiceTemplateVersionOutput +GetServicesInScopeResponse +GetSessionEmbedUrlRequest +GetSessionEmbedUrlResponse +GetSessionRequest +GetSessionResponse +GetSessionStatusRequest +GetSessionStatusResponse +GetSessionTokenRequest +GetSessionTokenResponse +GetSettingsRequest +GetSettingsResponse +GetShardIteratorInput +GetShardIteratorOutput +GetShareRequest +GetShareResponse +GetSignalCatalogRequest +GetSignalCatalogResponse +GetSignalingChannelEndpointInput +GetSignalingChannelEndpointOutput +GetSignedBluinsightsUrlResponse +GetSigningCertificateRequest +GetSigningCertificateResponse +GetSigningPlatformRequest +GetSigningPlatformResponse +GetSigningProfileRequest +GetSigningProfileResponse +GetSimilarProfilesRequest +GetSimilarProfilesResponse +GetSinkInput +GetSinkOutput +GetSinkPolicyInput +GetSinkPolicyOutput +GetSipMediaApplicationAlexaSkillConfigurationRequest +GetSipMediaApplicationAlexaSkillConfigurationResponse +GetSipMediaApplicationLoggingConfigurationRequest +GetSipMediaApplicationLoggingConfigurationResponse +GetSipMediaApplicationRequest +GetSipMediaApplicationResponse +GetSipRuleRequest +GetSipRuleResponse +GetSiteAddressInput +GetSiteAddressOutput +GetSiteInput +GetSiteOutput +GetSiteRequest +GetSiteResponse +GetSiteToSiteVpnAttachmentRequest +GetSiteToSiteVpnAttachmentResponse +GetSitesRequest +GetSitesResponse +GetSizeConstraintSetRequest +GetSizeConstraintSetResponse +GetSkillGroupRequest +GetSkillGroupResponse +GetSlotTypeRequest +GetSlotTypeResponse +GetSlotTypeVersionsRequest +GetSlotTypeVersionsResponse +GetSlotTypesRequest +GetSlotTypesResponse +GetSmsChannelRequest +GetSmsChannelResponse +GetSmsTemplateRequest +GetSmsTemplateResponse +GetSnapshotBlockRequest +GetSnapshotBlockResponse +GetSnapshotLimitsRequest +GetSnapshotLimitsResult +GetSnapshotRequest +GetSnapshotResponse +GetSnapshotResult +GetSnapshotsRequest +GetSnapshotsResponse +GetSnowballUsageResult +GetSoftwareUpdatesRequest +GetSoftwareUpdatesResult +GetSolFunctionInstanceInput +GetSolFunctionInstanceMetadata +GetSolFunctionInstanceOutput +GetSolFunctionPackageContentInput +GetSolFunctionPackageContentOutput +GetSolFunctionPackageDescriptorInput +GetSolFunctionPackageDescriptorOutput +GetSolFunctionPackageInput +GetSolFunctionPackageMetadata +GetSolFunctionPackageOutput +GetSolInstantiatedVnfInfo +GetSolNetworkInstanceInput +GetSolNetworkInstanceMetadata +GetSolNetworkInstanceOutput +GetSolNetworkOperationInput +GetSolNetworkOperationMetadata +GetSolNetworkOperationOutput +GetSolNetworkOperationTaskDetails +GetSolNetworkPackageContentInput +GetSolNetworkPackageContentOutput +GetSolNetworkPackageDescriptorInput +GetSolNetworkPackageDescriptorOutput +GetSolNetworkPackageInput +GetSolNetworkPackageMetadata +GetSolNetworkPackageOutput +GetSolVnfInfo +GetSolVnfcResourceInfo +GetSolVnfcResourceInfoMetadata +GetSolutionMetricsRequest +GetSolutionMetricsResponse +GetSourceApiAssociationRequest +GetSourceApiAssociationResponse +GetSourceRepositoryCloneUrlsRequest +GetSourceRepositoryCloneUrlsResponse +GetSourceRepositoryRequest +GetSourceRepositoryResponse +GetSpaceRequest +GetSpaceResponse +GetSparqlStatisticsOutput +GetSparqlStreamInput +GetSparqlStreamOutput +GetSpeakerSearchTaskRequest +GetSpeakerSearchTaskResponse +GetSpeechSynthesisTaskInput +GetSpeechSynthesisTaskOutput +GetSpotPlacementScoresRequest +GetSpotPlacementScoresResult +GetSqlInjectionMatchSetRequest +GetSqlInjectionMatchSetResponse +GetStackPolicyInput +GetStackPolicyOutput +GetStageDeploymentRequest +GetStageDeploymentResult +GetStageRequest +GetStageResponse +GetStageResult +GetStageSessionRequest +GetStageSessionResponse +GetStagesRequest +GetStagesResponse +GetStatementRequest +GetStatementResponse +GetStatementResultRequest +GetStatementResultResponse +GetStaticIpRequest +GetStaticIpResult +GetStaticIpsRequest +GetStaticIpsResult +GetStatisticsRequest +GetStatisticsResponse +GetStorageLensConfigurationRequest +GetStorageLensConfigurationResult +GetStorageLensConfigurationTaggingRequest +GetStorageLensConfigurationTaggingResult +GetStoredQueryRequest +GetStoredQueryResponse +GetStreamKeyRequest +GetStreamKeyResponse +GetStreamRequest +GetStreamResponse +GetStreamSessionRequest +GetStreamSessionResponse +GetStreamingDistributionConfigRequest +GetStreamingDistributionConfigResult +GetStreamingDistributionRequest +GetStreamingDistributionResult +GetStreamingImageRequest +GetStreamingImageResponse +GetStreamingSessionBackupRequest +GetStreamingSessionBackupResponse +GetStreamingSessionRequest +GetStreamingSessionResponse +GetStreamingSessionStreamRequest +GetStreamingSessionStreamResponse +GetStudioComponentRequest +GetStudioComponentResponse +GetStudioMemberRequest +GetStudioMemberResponse +GetStudioRequest +GetStudioResponse +GetStudioSessionMappingInput +GetStudioSessionMappingOutput +GetSubnetCidrReservationsRequest +GetSubnetCidrReservationsResult +GetSubscriberRequest +GetSubscriberResponse +GetSubscriptionAttributesInput +GetSubscriptionAttributesResponse +GetSubscriptionDefinitionRequest +GetSubscriptionDefinitionResponse +GetSubscriptionDefinitionVersionRequest +GetSubscriptionDefinitionVersionResponse +GetSubscriptionRequest +GetSubscriptionResponse +GetSubscriptionStateResponse +GetSuiteDefinitionRequest +GetSuiteDefinitionResponse +GetSuiteRequest +GetSuiteResult +GetSuiteRunReportRequest +GetSuiteRunReportResponse +GetSuiteRunRequest +GetSuiteRunResponse +GetSupportedResourceTypesOutput +GetSuppressedDestinationRequest +GetSuppressedDestinationResponse +GetSyncJobRequest +GetSyncJobResponse +GetSystemInstanceRequest +GetSystemInstanceResponse +GetSystemTemplateRequest +GetSystemTemplateResponse +GetSystemTemplateRevisionsRequest +GetSystemTemplateRevisionsResponse +GetTableMetadataInput +GetTableMetadataOutput +GetTableObjectsRequest +GetTableObjectsResponse +GetTableRequest +GetTableResponse +GetTableRestoreStatusRequest +GetTableRestoreStatusResponse +GetTableVersionRequest +GetTableVersionResponse +GetTableVersionsRequest +GetTableVersionsResponse +GetTablesRequest +GetTablesResponse +GetTagKeysInput +GetTagKeysOutput +GetTagValuesInput +GetTagValuesOutput +GetTagsInput +GetTagsOutput +GetTagsRequest +GetTagsResponse +GetTargetGroupRequest +GetTargetGroupResponse +GetTargetResourceTypeRequest +GetTargetResourceTypeResponse +GetTaskProtectionRequest +GetTaskProtectionResponse +GetTaskTemplateRequest +GetTaskTemplateResponse +GetTelemetryMetadataRequest +GetTelemetryMetadataResponse +GetTemplateGroupAccessControlEntryRequest +GetTemplateGroupAccessControlEntryResponse +GetTemplateInput +GetTemplateOutput +GetTemplateRequest +GetTemplateResponse +GetTemplateStepGroupRequest +GetTemplateStepGroupResponse +GetTemplateStepRequest +GetTemplateStepResponse +GetTemplateSummaryInput +GetTemplateSummaryOutput +GetTemplateSyncConfigInput +GetTemplateSyncConfigOutput +GetTemplateSyncStatusInput +GetTemplateSyncStatusOutput +GetTemporaryGluePartitionCredentialsRequest +GetTemporaryGluePartitionCredentialsResponse +GetTemporaryGlueTableCredentialsRequest +GetTemporaryGlueTableCredentialsResponse +GetTerminologyRequest +GetTerminologyResponse +GetTestExecutionArtifactsUrlRequest +GetTestExecutionArtifactsUrlResponse +GetTestGridProjectRequest +GetTestGridProjectResult +GetTestGridSessionRequest +GetTestGridSessionResult +GetTestRequest +GetTestResult +GetTextDetectionRequest +GetTextDetectionResponse +GetThemeRequest +GetThemeResponse +GetThingRuntimeConfigurationRequest +GetThingRuntimeConfigurationResponse +GetThingShadowRequest +GetThingShadowResponse +GetThirdPartyFirewallAssociationStatusRequest +GetThirdPartyFirewallAssociationStatusResponse +GetThirdPartyJobDetailsInput +GetThirdPartyJobDetailsOutput +GetThreatIntelSetRequest +GetThreatIntelSetResponse +GetTileInput +GetTileOutput +GetTimeSeriesServiceStatisticsRequest +GetTimeSeriesServiceStatisticsResult +GetTimelineEventInput +GetTimelineEventOutput +GetTokenBalanceInput +GetTokenBalanceOutput +GetTokenRequest +GetTokenResponse +GetTopicAttributesInput +GetTopicAttributesResponse +GetTopicRuleDestinationRequest +GetTopicRuleDestinationResponse +GetTopicRuleRequest +GetTopicRuleResponse +GetTraceGraphRequest +GetTraceGraphResult +GetTraceSummariesRequest +GetTraceSummariesResult +GetTrafficDistributionRequest +GetTrafficDistributionResponse +GetTrafficPolicyInstanceCountResponse +GetTrafficPolicyInstanceRequest +GetTrafficPolicyInstanceResponse +GetTrafficPolicyRequest +GetTrafficPolicyResponse +GetTrailRequest +GetTrailResponse +GetTrailStatusRequest +GetTrailStatusResponse +GetTransactionInput +GetTransactionOutput +GetTranscriptRequest +GetTranscriptResponse +GetTranscriptionJobRequest +GetTranscriptionJobResponse +GetTransitGatewayAttachmentPropagationsRequest +GetTransitGatewayAttachmentPropagationsResult +GetTransitGatewayConnectPeerAssociationsRequest +GetTransitGatewayConnectPeerAssociationsResponse +GetTransitGatewayMulticastDomainAssociationsRequest +GetTransitGatewayMulticastDomainAssociationsResult +GetTransitGatewayPeeringRequest +GetTransitGatewayPeeringResponse +GetTransitGatewayPolicyTableAssociationsRequest +GetTransitGatewayPolicyTableAssociationsResult +GetTransitGatewayPolicyTableEntriesRequest +GetTransitGatewayPolicyTableEntriesResult +GetTransitGatewayPrefixListReferencesRequest +GetTransitGatewayPrefixListReferencesResult +GetTransitGatewayRegistrationsRequest +GetTransitGatewayRegistrationsResponse +GetTransitGatewayRouteTableAssociationsRequest +GetTransitGatewayRouteTableAssociationsResult +GetTransitGatewayRouteTableAttachmentRequest +GetTransitGatewayRouteTableAttachmentResponse +GetTransitGatewayRouteTablePropagationsRequest +GetTransitGatewayRouteTablePropagationsResult +GetTriggerRequest +GetTriggerResponse +GetTriggersRequest +GetTriggersResponse +GetTrustStoreCertificateRequest +GetTrustStoreCertificateResponse +GetTrustStoreRequest +GetTrustStoreResponse +GetTypeRequest +GetTypeResponse +GetTypedLinkFacetInformationRequest +GetTypedLinkFacetInformationResponse +GetUICustomizationRequest +GetUICustomizationResponse +GetUnfilteredPartitionMetadataRequest +GetUnfilteredPartitionMetadataResponse +GetUnfilteredPartitionsMetadataRequest +GetUnfilteredPartitionsMetadataResponse +GetUnfilteredTableMetadataRequest +GetUnfilteredTableMetadataResponse +GetUpgradeHistoryRequest +GetUpgradeHistoryResponse +GetUpgradeStatusRequest +GetUpgradeStatusResponse +GetUploadRequest +GetUploadResult +GetUploadStatusRequest +GetUploadStatusResponse +GetUsageForecastRequest +GetUsageForecastResponse +GetUsageLimitRequest +GetUsageLimitResponse +GetUsagePlanKeyRequest +GetUsagePlanKeysRequest +GetUsagePlanRequest +GetUsagePlansRequest +GetUsageRequest +GetUsageStatisticsRequest +GetUsageStatisticsResponse +GetUsageTotalsRequest +GetUsageTotalsResponse +GetUserAccessLoggingSettingsRequest +GetUserAccessLoggingSettingsResponse +GetUserAttributeVerificationCodeRequest +GetUserAttributeVerificationCodeResponse +GetUserDefinedFunctionRequest +GetUserDefinedFunctionResponse +GetUserDefinedFunctionsRequest +GetUserDefinedFunctionsResponse +GetUserDetailsRequest +GetUserDetailsResponse +GetUserEndpointsRequest +GetUserEndpointsResponse +GetUserIdRequest +GetUserIdResponse +GetUserPolicyRequest +GetUserPolicyResponse +GetUserPoolMfaConfigRequest +GetUserPoolMfaConfigResponse +GetUserRequest +GetUserResponse +GetUserSettingsRequest +GetUserSettingsResponse +GetUtterancesViewRequest +GetUtterancesViewResponse +GetV2LoggingOptionsResponse +GetVPCEConfigurationRequest +GetVPCEConfigurationResult +GetVariablesRequest +GetVariablesResult +GetVariantImportRequest +GetVariantImportResponse +GetVariantStoreRequest +GetVariantStoreResponse +GetVaultAccessPolicyInput +GetVaultAccessPolicyOutput +GetVaultLockInput +GetVaultLockOutput +GetVaultNotificationsInput +GetVaultNotificationsOutput +GetVectorEnrichmentJobInput +GetVectorEnrichmentJobOutput +GetVehicleRequest +GetVehicleResponse +GetVehicleStatusRequest +GetVehicleStatusResponse +GetVerifiedAccessEndpointPolicyRequest +GetVerifiedAccessEndpointPolicyResult +GetVerifiedAccessGroupPolicyRequest +GetVerifiedAccessGroupPolicyResult +GetViewInput +GetViewOutput +GetViolationDetailsRequest +GetViolationDetailsResponse +GetVirtualMachineInput +GetVirtualMachineOutput +GetVocabularyFilterRequest +GetVocabularyFilterResponse +GetVocabularyRequest +GetVocabularyResponse +GetVoiceChannelRequest +GetVoiceChannelResponse +GetVoiceConnectorEmergencyCallingConfigurationRequest +GetVoiceConnectorEmergencyCallingConfigurationResponse +GetVoiceConnectorGroupRequest +GetVoiceConnectorGroupResponse +GetVoiceConnectorLoggingConfigurationRequest +GetVoiceConnectorLoggingConfigurationResponse +GetVoiceConnectorOriginationRequest +GetVoiceConnectorOriginationResponse +GetVoiceConnectorProxyRequest +GetVoiceConnectorProxyResponse +GetVoiceConnectorRequest +GetVoiceConnectorResponse +GetVoiceConnectorStreamingConfigurationRequest +GetVoiceConnectorStreamingConfigurationResponse +GetVoiceConnectorTerminationHealthRequest +GetVoiceConnectorTerminationHealthResponse +GetVoiceConnectorTerminationRequest +GetVoiceConnectorTerminationResponse +GetVoiceProfileDomainRequest +GetVoiceProfileDomainResponse +GetVoiceProfileRequest +GetVoiceProfileResponse +GetVoiceTemplateRequest +GetVoiceTemplateResponse +GetVoiceToneAnalysisTaskRequest +GetVoiceToneAnalysisTaskResponse +GetVpcAttachmentRequest +GetVpcAttachmentResponse +GetVpcLinkRequest +GetVpcLinkResponse +GetVpcLinksRequest +GetVpcLinksResponse +GetVpnConnectionDeviceSampleConfigurationRequest +GetVpnConnectionDeviceSampleConfigurationResult +GetVpnConnectionDeviceTypesRequest +GetVpnConnectionDeviceTypesResult +GetVpnTunnelReplacementStatusRequest +GetVpnTunnelReplacementStatusResult +GetWebACLForResourceRequest +GetWebACLForResourceResponse +GetWebACLRequest +GetWebACLResponse +GetWebhookRequest +GetWebhookResult +GetWirelessDeviceImportTaskRequest +GetWirelessDeviceImportTaskResponse +GetWirelessDeviceRequest +GetWirelessDeviceResponse +GetWirelessDeviceStatisticsRequest +GetWirelessDeviceStatisticsResponse +GetWirelessGatewayCertificateRequest +GetWirelessGatewayCertificateResponse +GetWirelessGatewayFirmwareInformationRequest +GetWirelessGatewayFirmwareInformationResponse +GetWirelessGatewayRequest +GetWirelessGatewayResponse +GetWirelessGatewayStatisticsRequest +GetWirelessGatewayStatisticsResponse +GetWirelessGatewayTaskDefinitionRequest +GetWirelessGatewayTaskDefinitionResponse +GetWirelessGatewayTaskRequest +GetWirelessGatewayTaskResponse +GetWorkGroupInput +GetWorkGroupOutput +GetWorkUnitResultsRequest +GetWorkUnitResultsResponse +GetWorkUnitsRequest +GetWorkUnitsResponse +GetWorkerFleetRequest +GetWorkerFleetResponse +GetWorkerRequest +GetWorkerResponse +GetWorkflowExecutionHistoryInput +GetWorkflowExecutionRequest +GetWorkflowExecutionResponse +GetWorkflowRequest +GetWorkflowResponse +GetWorkflowRunPropertiesRequest +GetWorkflowRunPropertiesResponse +GetWorkflowRunRequest +GetWorkflowRunResponse +GetWorkflowRunsRequest +GetWorkflowRunsResponse +GetWorkflowStepExecutionRequest +GetWorkflowStepExecutionResponse +GetWorkflowStepGroupRequest +GetWorkflowStepGroupResponse +GetWorkflowStepRequest +GetWorkflowStepResponse +GetWorkflowStepsRequest +GetWorkflowStepsResponse +GetWorkgroupRequest +GetWorkgroupResponse +GetWorkingLocationRequest +GetWorkingLocationResponse +GetWorkloadInput +GetWorkloadOutput +GetWorkspaceRequest +GetWorkspaceResponse +GetWorldTemplateBodyRequest +GetWorldTemplateBodyResponse +GetXssMatchSetRequest +GetXssMatchSetResponse +Gid +GitCloneDepth +GitConfig +GitConfigForUpdate +GitHubAccountTokenDoesNotExistException +GitHubAccountTokenNameRequiredException +GitHubCodeDestination +GitHubCommitConfigurationFieldMappings +GitHubConfiguration +GitHubDocumentCrawlProperties +GitHubEnterpriseServer +GitHubIssueAttachmentConfigurationFieldMappings +GitHubIssueCommentConfigurationFieldMappings +GitHubIssueDocumentConfigurationFieldMappings +GitHubLocation +GitHubPullRequestCommentConfigurationFieldMappings +GitHubPullRequestDocumentAttachmentConfigurationFieldMappings +GitHubPullRequestDocumentConfigurationFieldMappings +GitHubRepositoryConfigurationFieldMappings +GitSubmodulesConfig +GivenName +GlacierJobDescription +GlacierJobParameters +GlacierJobTier +Global +GlobalCluster +GlobalClusterAlreadyExistsFault +GlobalClusterArn +GlobalClusterIdentifier +GlobalClusterMember +GlobalClusterMembers +GlobalClusterNotFoundFault +GlobalClusterQuotaExceededFault +GlobalClusterResourceId +GlobalClusters +GlobalClustersMessage +GlobalConfiguration +GlobalEndpointTokenVersion +GlobalFilters +GlobalIdentity +GlobalNetwork +GlobalNetworkArn +GlobalNetworkId +GlobalNetworkIds +GlobalNetworks +GlobalNodeGroup +GlobalNodeGroupId +GlobalNodeGroups +GlobalNodeGroupsToRemove +GlobalNodeGroupsToRetain +GlobalQuota +GlobalReplicationGroup +GlobalReplicationGroupAlreadyExistsFault +GlobalReplicationGroupDescription +GlobalReplicationGroupId +GlobalReplicationGroupIdSuffix +GlobalReplicationGroupInfo +GlobalReplicationGroupMember +GlobalReplicationGroupMemberRole +GlobalReplicationGroupNotFoundFault +GlobalReplicationGroups +GlobalSecondaryIndex +GlobalSecondaryIndexAutoScalingUpdate +GlobalSecondaryIndexDescription +GlobalSecondaryIndexInfo +GlobalSecondaryIndexOverride +GlobalSecondaryIndexUpdate +GlobalSecondaryIndexUpdates +GlobalSecondaryIndexes +GlobalSettings +GlobalSignOutRequest +GlobalTable +GlobalTableAlreadyExistsException +GlobalTableArn +GlobalTableBillingMode +GlobalTableBorderOptions +GlobalTableDescription +GlobalTableGlobalSecondaryIndexSettingsUpdate +GlobalTableName +GlobalTableNotFoundException +GlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate +GlobalTableProvisionedWriteCapacityUnits +GlobalTableStatus +GlobalTableVersion +GlobalTables +GlobalTimeout +GlobalWriteForwardingRequested +GlobalWriteForwardingStatus +GlueCatalogGeneration +GlueConfiguration +GlueConnectionName +GlueDataCatalogConfig +GlueDataCatalogConfiguration +GlueDataCatalogConfigurationDescription +GlueDataCatalogConfigurationUpdate +GlueEncryptionException +GlueIps +GluePolicy +GlueSchema +GlueStudioSchemaColumn +GlueTable +GlueTableReference +GlueVersion +Gnss +GoneException +Google +GoogleAnalytics +GoogleAnalyticsConnectorProfileCredentials +GoogleAnalyticsMetadata +GoogleAnalyticsSourceProperties +GoogleDriveConfiguration +GopBReference +GopClosedCadence +GopNumBFrames +GopSize +GopSizeUnits +GovCloudAccountId +GovernedCatalogSource +GovernedCatalogTarget +Gpu +GpuDeviceInfo +GpuDeviceMemoryInfo +GpuInfo +Gpus +Gradient +GradientColor +GradientOffset +GradientStop +GrammarSlotTypeSetting +GrammarSlotTypeSource +Grant +GrantAccessRequest +GrantAccessResult +GrantArn +GrantArns +GrantConstraints +GrantEntitlementRequest +GrantFlowEntitlements420Exception +GrantFlowEntitlementsRequest +GrantFlowEntitlementsResponse +GrantFullControl +GrantId +GrantLinkPermissions +GrantListEntry +GrantName +GrantPermissions +GrantPermissionsRequest +GrantPoweruserPrivileges +GrantRead +GrantReadACP +GrantStatus +GrantTime +GrantToken +GrantTokens +GrantWrite +GrantWriteACP +GrantedLicense +GrantedOperations +Grantee +GranteeId +GranteePrincipal +GranteePrincipalArn +GranteeType +Grantor +Grants +Granularities +Granularity +Graph +GraphArn +GraphArns +GraphList +GraphQLRenderConfig +GraphQLSchemaException +GraphqlApi +GreKey +GreaterThan +GreaterThanOrEqual +GreaterThanOrEquals +Green +GreenFleetProvisioningOption +GreenPrimaryX +GreenPrimaryY +Greengrass +GreengrassConfiguration +GreengrassOutputDetails +GreengrassV2 +GremlinQueryStatus +GremlinQueryStatusAttributes +Grid +GridLayout +GridLayoutCanvasSizeOptions +GridLayoutConfiguration +GridLayoutElement +GridLayoutScreenCanvasSizeOptions +GridLineVisibility +GridViewConfiguration +GrokClassifier +GrokPattern +GroundStationData +GroundTruth +GroundTruthManifest +GroundTruthS3Input +Group +GroupARN +GroupArn +GroupAttributeField +GroupBy +GroupByAttribute +GroupByAttributeValue +GroupByKey +GroupCertificateAuthorities +GroupCertificateAuthorityArn +GroupCertificateAuthorityId +GroupCertificateAuthorityProperties +GroupConfiguration +GroupConfigurationItem +GroupConfigurationParameter +GroupCount +GroupDefinition +GroupDefinitions +GroupDesc +GroupDetail +GroupDetailList +GroupDisplayName +GroupExistsException +GroupFiles +GroupFilter +GroupId +GroupIdentifier +GroupIdentifiers +GroupIdentity +GroupIds +GroupInformation +GroupIpAddress +GroupLabelOptions +GroupLifecycleEventsDesiredStatus +GroupLifecycleEventsStatus +GroupLifecycleEventsStatusMessage +GroupList +GroupMember +GroupMemberList +GroupMembers +GroupMembership +GroupMembershipExistenceResult +GroupMemberships +GroupMetadata +GroupName +GroupNameAndArn +GroupNameColumn +GroupNamePrefix +GroupNames +GroupOrderingIdSummaries +GroupOrderingIdSummary +GroupOwner +GroupOwnerId +GroupOwnerSetting +GroupPermission +GroupPolicyList +GroupProperties +GroupQuery +GroupResourcesInput +GroupResourcesOutput +GroupResult +GroupScore +GroupSearchFilter +GroupSecurityIdentifier +GroupSize +GroupSource +GroupSummary +GroupType +GroupVersion +GroupVersionId +GroupedBys +GroupedResourceCount +GroupedResourceCounts +GroupingAttributeNames +GroupingSeparator +GroupingType +Groupings +Groups +GroupsSummaries +GrowthFactor +GrowthRate +GrowthRateComputation +GrowthType +GrpcCode +GrpcGatewayRoute +GrpcGatewayRouteAction +GrpcGatewayRouteMatch +GrpcGatewayRouteMetadata +GrpcGatewayRouteRewrite +GrpcRetryPolicy +GrpcRoute +GrpcRouteAction +GrpcRouteMatch +GrpcRouteMetadata +GrpcTimeout +Gsm +GsmLocalId +GsmNmr +GsmNmrObj +GsmObj +GsmTimingAdvance +Gt +Gte +GuardDutyFindingId +GuardianAttributes +GuardianOptions +GuessMIMETypeEnabled +GuestRoleArn +Guidance +Gutter +GutterSpacing +GutterStyle +GutterVisibility +H264ColorSpaceSettings +H264FilterSettings +H264QvbrSettings +H264Settings +H265ColorSpaceSettings +H265FilterSettings +H265PackagingType +H265QvbrSettings +H265Settings +HECAcknowledgmentTimeoutInSeconds +HECEndpoint +HECEndpointType +HECToken +HIT +HITGroupId +HITId +HITLayoutId +HITLayoutParameter +HITLayoutParameters +HITReviewPolicy +HITReviewReport +HITReviewStatus +HITStatus +HITTypeId +HITs +HLSFragmentSelector +HLSStreamingSessionURL +HLSTimestampRange +HPOConfig +HPOObjective +HPOResourceConfig +HTTPCode4XXCount +HTTPCode5XXCount +HTTPHeader +HTTPMethod +HTTPPort +HTTPRequest +HTTPSPort +HTTPVersion +HadoopJarStep +HadoopJarStepConfig +HadoopStepConfig +HadoopVersion +HammingLoss +HandOffTime +Handler +HandlerFailureException +HandlerInternalFailureException +Handshake +HandshakeAlreadyInStateException +HandshakeConstraintViolationException +HandshakeFilter +HandshakeId +HandshakeNotFoundException +HandshakeParty +HandshakeResource +Handshakes +HapgArn +HapgList +HapgSerial +HardExpiry +HardLimit +HarvestJob +HarvestJobs +HasAdditionalSubjectAlternativeNames +HasAssociatedService +HasCredential +HasCustomEventSelectors +HasDefaultPath +HasError +HasErrors +HasFault +HasFcmServiceCredentials +HasInsightSelectors +HasMoreApplications +HasMoreDeliveryStreams +HasMoreDestinations +HasMoreShards +HasMoreStreams +HasMoreTags +HasResultSet +HasThrottle +HasTokenKey +Hash +HashAlgorithm +HashAlgorithmOptions +HashKeyRange +HashType +HbbtvCompliance +HdDeviceSettings +HdbVersion +HdfsNameNode +Hdr10Metadata +Hdr10Plus +Hdr10Settings +HdrToSdrToneMapper +HeadBucketRequest +HeadObjectOutput +HeadObjectRequest +Header +HeaderBehavior +HeaderConfig +HeaderFooterSectionConfiguration +HeaderList +HeaderMatch +HeaderMatchPattern +HeaderName +HeaderObject +HeaderOrder +HeaderParameters +HeaderRow +HeaderSections +HeaderStyle +HeaderValue +HeaderValues +Headers +HeadersConfig +HeadersInBounceNotificationsEnabled +HeadersInComplaintNotificationsEnabled +HeadersInDeliveryNotificationsEnabled +HeadersToInclude +Health +HealthCheck +HealthCheckAlreadyExists +HealthCheckArn +HealthCheckConfig +HealthCheckConfiguration +HealthCheckCount +HealthCheckCustomConfig +HealthCheckEnabled +HealthCheckGracePeriod +HealthCheckGracePeriodSeconds +HealthCheckId +HealthCheckIds +HealthCheckInUse +HealthCheckIntervalSeconds +HealthCheckObservation +HealthCheckObservations +HealthCheckPath +HealthCheckPolicy +HealthCheckPort +HealthCheckProtocol +HealthCheckTimeoutSeconds +HealthCheckType +HealthCheckVersion +HealthCheckVersionMismatch +HealthChecks +HealthEvent +HealthEventArn +HealthEventDescription +HealthEventTypeCategory +HealthEventTypeCode +HealthEvents +HealthEventsConfig +HealthReason +HealthScoreThreshold +HealthService +HealthState +HealthStatus +HealthThreshold +HealthUnavailableException +HealthUrl +HealthyThreshold +HealthyThresholdCount +HeartbeatEnable +HeartbeatEvent +HeartbeatFrequency +HeartbeatSchema +HeartbeatTimeout +HeatMapAggregatedFieldWells +HeatMapColumnItemsLimitConfiguration +HeatMapColumnSort +HeatMapConfiguration +HeatMapFieldWells +HeatMapRowItemsLimitConfiguration +HeatMapRowSort +HeatMapSortConfiguration +HeatMapVisual +HeatmapColor +HeatmapConfiguration +Height +HeightInPx +HeightPixels +HeightTrim +HelpfulResource +HelpfulResourceDisplayText +HelpfulResourceUrl +Heterogeneous +HexCode +HexFontColor +Hibernate +HibernationOptions +HibernationOptionsRequest +HibernationSupported +HiddenColumns +HiddenFromGlobalAddressList +HideDisabled +HidePassword +HierarchicalAccessControlList +HierarchicalPrincipal +HierarchyGroup +HierarchyGroupArn +HierarchyGroupCondition +HierarchyGroupId +HierarchyGroupMatchType +HierarchyGroupSummary +HierarchyGroupSummaryReference +HierarchyId +HierarchyLevel +HierarchyLevelLimitExceededException +HierarchyLevelUpdate +HierarchyPath +HierarchyPathReference +HierarchyStructure +HierarchyStructureUpdate +HierarchyTypeMismatchException +High +HighAction +HighAvailabilityConfig +HighCount +HighestSeverityThreatDetails +Highlight +HighlightColor +HighlightEnabled +Highlighted +Highlights +HistogramAggregatedFieldWells +HistogramBinOptions +HistogramConfiguration +HistogramEntry +HistogramFieldWells +HistogramVisual +HistoricalDataPathList +HistoricalMetric +HistoricalMetricData +HistoricalMetricResult +HistoricalMetrics +HistoricalOptions +History +HistoryData +HistoryEvent +HistoryEventExecutionDataDetails +HistoryItemType +HistoryRecord +HistoryRecordEntry +HistoryRecords +HistorySummary +Hit +Hits +Hive +HiveCompatiblePartitions +HiveJsonSerDe +HlsAdditionalManifest +HlsAkamaiSettings +HlsBasicPutSettings +HlsCaptionLanguageMapping +HlsCdnSettings +HlsConfiguration +HlsContentProtection +HlsEncryption +HlsEncryptionSettings +HlsGroupSettings +HlsId3SegmentTagging +HlsId3SegmentTaggingScheduleActionSettings +HlsId3SegmentTaggingSettings +HlsImageBasedTrickPlaySettings +HlsIngest +HlsInputSettings +HlsManifest +HlsManifestCreateOrUpdateParameters +HlsManifests +HlsMediaStoreSettings +HlsOutputSettings +HlsPackage +HlsPlaylistSettings +HlsRenditionGroupSettings +HlsS3Settings +HlsSettings +HlsSignaledSystemIds +HlsTimedMetadataScheduleActionSettings +HlsTimedMetadataSettings +HlsWebdavSettings +Holdout +HoldoutActivity +HoldoutPercent +HolidayConfig +HolidayConfigAttributes +HomeDirectory +HomeDirectoryMapEntry +HomeDirectoryMappings +HomeDirectoryType +HomeEfsFileSystem +HomeEfsFileSystemId +HomeEfsFileSystemKmsKeyId +HomeEfsFileSystemUid +HomePageUrl +HomePhoneNumber +HomeRegion +HomeRegionControl +HomeRegionControls +HomeRegionNotSetException +HomeRegions +Homogeneous +Honeycode +HoneycodeConnectorProfileCredentials +HoneycodeDestinationProperties +HoneycodeMetadata +HonorCooldown +HonorificPrefix +HonorificSuffix +Hook +HookConfiguration +HookFailureMode +HookInvocationCount +HookInvocationPoint +HookParameters +HookStatus +HookStatusReason +HookType +Hooks +HopDestination +HopDestinations +Horizontal +HorizontalAccuracy +HorizontalAlign +HorizontalLayoutConfiguration +HorizontalOffset +HorizontalPosition +HorizontalTextAlignment +Horovod +Host +HostAddress +HostArn +HostArnFilter +HostEntry +HostEnvironment +HostEnvironmentId +HostHeaderConditionConfig +HostHeaderConfig +HostId +HostIdFilter +HostIdSet +HostIds +HostInstance +HostInstanceType +HostIp +HostKey +HostKeyAttributes +HostKeyBody +HostKeyFingerprint +HostKeyId +HostKeys +HostMaintenance +HostName +HostNetwork +HostOffering +HostPath +HostPort +HostProperties +HostRecovery +HostReservation +HostReservationId +HostReservationIdSet +HostReservationSet +HostResourceGroupArn +HostRole +HostUrl +HostVPCId +HostVolumeProperties +HostedConfigurationVersion +HostedConfigurationVersionSummary +HostedConfigurationVersions +HostedZone +HostedZoneAlreadyExists +HostedZoneArn +HostedZoneConfig +HostedZoneCount +HostedZoneId +HostedZoneIdMarker +HostedZoneLimit +HostedZoneNotEmpty +HostedZoneNotFound +HostedZoneNotPrivate +HostedZoneOwner +HostedZonePartiallyDelegated +HostedZoneSummaries +HostedZoneSummary +HostedZones +Hostname +HostnameTheme +HostnameType +Hosts +Hour +HourOfDay +HourlyCommitmentToPurchase +HourlyOnDemandRate +HourlyPrice +Hours +HoursOfOperation +HoursOfOperationArn +HoursOfOperationConfig +HoursOfOperationId +HoursOfOperationSearchCriteria +HoursOfOperationSearchFilter +HoursOfOperationSummary +HoursOfOperationSummaryList +HoursOfOperationTimeSlice +HoursOfOperations +HrAllowed +HrdBufferFinalFillPercentage +HrdBufferInitialFillPercentage +HrdBufferSize +Href +Hsm +HsmArn +HsmCertificate +HsmClientCertificate +HsmClientCertificateAlreadyExistsFault +HsmClientCertificateIdentifier +HsmClientCertificateMessage +HsmClientCertificateNotFoundFault +HsmClientCertificatePublicKey +HsmClientCertificateQuotaExceededFault +HsmClientCertificates +HsmConfiguration +HsmConfigurationAlreadyExistsFault +HsmConfigurationIdentifier +HsmConfigurationMessage +HsmConfigurationNotFoundFault +HsmConfigurationQuotaExceededFault +HsmConfigurations +HsmId +HsmIpAddress +HsmList +HsmPartitionName +HsmPartitionPassword +HsmSerialNumber +HsmServerPublicCertificate +HsmStatus +HsmType +Hsms +HsmsLastActionFailed +HsmsPendingDeletion +HsmsPendingRegistration +HsrOperationMode +HsrReplicationMode +HsrTier +Html +HtmlBody +HtmlMotionGraphicsSettings +HtmlPart +Http +HttpAction +HttpActionHeader +HttpAuthorization +HttpCode +HttpConfiguration +HttpContext +HttpDataSourceConfig +HttpEndpoint +HttpEndpointBufferingHints +HttpEndpointCommonAttribute +HttpEndpointConfiguration +HttpEndpointDescription +HttpEndpointDestinationConfiguration +HttpEndpointDestinationDescription +HttpEndpointDestinationUpdate +HttpEndpointEnabled +HttpEndpointRequestConfiguration +HttpEndpointRetryOptions +HttpErrorCodeReturnedEquals +HttpExpiresDate +HttpFailureFeedbackRoleArn +HttpGatewayRoute +HttpGatewayRouteAction +HttpGatewayRouteHeader +HttpGatewayRouteMatch +HttpGatewayRoutePathRewrite +HttpGatewayRoutePrefixRewrite +HttpGatewayRouteRewrite +HttpHeader +HttpHeaderConditionConfig +HttpHeaderConfig +HttpHeaderName +HttpHeaders +HttpInputs +HttpInstanceSummary +HttpMatch +HttpMethod +HttpName +HttpNamespaceChange +HttpPackageConfiguration +HttpPackageConfigurations +HttpParameters +HttpPathMatch +HttpPort +HttpProperties +HttpProtocolIpv6 +HttpPutResponseHopLimit +HttpQueryParameter +HttpRedirectCode +HttpRequestMethodConditionConfig +HttpRequestMethodConfig +HttpRetryPolicy +HttpRoute +HttpRouteAction +HttpRouteHeader +HttpRouteMatch +HttpStatus +HttpSuccessFeedbackRoleArn +HttpTimeout +HttpTokens +HttpTransferMode +HttpURL +HttpUrlDestinationConfiguration +HttpUrlDestinationProperties +HttpUrlDestinationSummary +HttpVersion +HttpsInputs +HttpsNotificationConfiguration +HttpsPort +HubArn +HubContentArn +HubContentDependencies +HubContentDependency +HubContentDescription +HubContentDisplayName +HubContentDocument +HubContentInfo +HubContentMarkdown +HubContentName +HubContentSearchKeywords +HubContentStatus +HubContentSummaries +HubContentType +HubContentVersion +HubDescription +HubDeviceArn +HubDisplayName +HubInfo +HubName +HubS3StorageConfig +HubSearchKeywords +HubStatus +HubSummaries +HudiTarget +HudiTargets +Hue +HumanLabeled +HumanLoopActivationConditions +HumanLoopActivationConditionsConfig +HumanLoopActivationConditionsEvaluationResults +HumanLoopActivationConfig +HumanLoopActivationOutput +HumanLoopActivationReasons +HumanLoopArn +HumanLoopConfig +HumanLoopDataAttributes +HumanLoopInput +HumanLoopName +HumanLoopOutput +HumanLoopQuotaExceededException +HumanLoopRequestSource +HumanLoopStatus +HumanLoopSummaries +HumanLoopSummary +HumanTaskConfig +HumanTaskUiArn +HumanTaskUiName +HumanTaskUiStatus +HumanTaskUiSummaries +HumanTaskUiSummary +HwAddress +HybridAccessEnabled +HybridJobQueueInfo +HyperParameterAlgorithmSpecification +HyperParameterRanges +HyperParameterSpecification +HyperParameterTrainingJobDefinition +HyperParameterTrainingJobSummary +HyperParameterTuningEndTime +HyperParameterTuningInstanceConfig +HyperParameterTuningJob +HyperParameterTuningJobArn +HyperParameterTuningJobCompletionDetails +HyperParameterTuningJobConfig +HyperParameterTuningJobConsumedResources +HyperParameterTuningJobName +HyperParameterTuningJobObjective +HyperParameterTuningJobSearchEntity +HyperParameterTuningJobStatus +HyperParameterTuningJobStrategyConfig +HyperParameterTuningJobSummaries +HyperParameterTuningJobSummary +HyperParameterTuningJobWarmStartConfig +HyperParameterTuningResourceConfig +HyperParameters +HyperbandStrategyConfig +Hypervisor +HypervisorArn +HypervisorDetails +HypervisorId +Hypervisors +IAMAuth +IAMCertificateId +IAMDatabaseAuthenticationEnabled +IAMIdentityCenterInstanceArn +IAMPolicyAssignment +IAMPolicyAssignmentSummary +IAMPolicyAssignments +IAMRoleARN +IAMRoleIdentity +IAMRoleName +IAMUser +IAMUserIdentity +IBMDb2Settings +ICD10CMAttribute +ICD10CMConcept +ICD10CMConcepts +ICD10CMEntity +ICD10CMTrait +ICPRecordalStatus +ID +IDLE +IDPCommunicationErrorException +IDPRejectedClaimException +IFrameOnlyManifest +IFrameOnlyPlaylists +IKEVersions +IKEVersionsListValue +IKEVersionsRequestListValue +IND +INDTaxDocuments +IOOptimizedNextAllowedModificationTime +IOPS +IOS +IOUsage +IOWait +IP +IPAddress +IPAddressBasedRemoteInfo +IPAddressType +IPAddressVersion +IPDialIn +IPRange +IPRanges +IPSet +IPSetDescriptor +IPSetDescriptors +IPSetForwardedIPConfig +IPSetId +IPSetMetadata +IPSetReference +IPSetReferenceStatement +IPSetReferences +IPSetSummary +IPSetUpdate +IPSets +IPV4Range +IPV6Range +IPv6Address +IRQ +Iam +IamActionDefinition +IamArn +IamArnRequiredException +IamAuthEnabled +IamCertificateId +IamDatabaseAuthenticationEnabled +IamFleetRole +IamIdentity +IamInstanceProfile +IamInstanceProfileArn +IamInstanceProfileAssociation +IamInstanceProfileAssociations +IamInstanceProfileSpecification +IamRegistrationResponse +IamResources +IamRole +IamRoleArn +IamRoleConfiguration +IamRoleId +IamRoleMissingPermissionsFault +IamRoleName +IamRoleNotFoundFault +IamRoles +IamSessionArnAlreadyRegisteredException +IamUser +IamUserAccessToBilling +IamUserArn +IamUserArnAlreadyRegisteredException +IamUserArnRequiredException +IamUserArns +IanaProtocolNumber +IatTtL +Ibm3624NaturalPin +Ibm3624PinFromOffset +Ibm3624PinOffset +Ibm3624PinVerification +Ibm3624RandomPin +IceServer +IceServerList +IcebergInput +IcebergTarget +IcebergTargets +IcmpTypeCode +Icon +IconDisplayOption +IconOptions +IconReference +IconS3Location +IconSet +IconSetType +IconURL +IconUrl +Id +Id3 +Id3Insertion +Id3Insertions +IdAttributeName +IdFormat +IdToken +IdTokenValidity +Ide +IdeConfiguration +IdempotencyException +IdempotencyParameterMismatchException +IdempotencyToken +IdempotentParameterMismatch +IdempotentParameterMismatchException +IdentificationExpirationDate +IdentificationHints +IdentificationIssuingOrg +IdentificationNumber +IdentifiedLanguageScore +IdentifiedUserName +Identifier +IdentifierPath +IdentifierType +Identifiers +IdentifyLanguage +IdentifyMultipleLanguages +Identities +Identity +IdentityAttributeName +IdentityAttributeOrder +IdentityAttributeValues +IdentityDescription +IdentityDkimAttributes +IdentityDocument +IdentityDocumentField +IdentityDocumentFields +IdentityDocuments +IdentityId +IdentityIdsToDelete +IdentityInfo +IdentityMailFromDomainAttributes +IdentityManagementType +IdentityName +IdentityNotificationAttributes +IdentityPool +IdentityPoolConfigs +IdentityPoolId +IdentityPoolName +IdentityPoolShortDescription +IdentityPoolTags +IdentityPoolUsage +IdentityPoolUsages +IdentityPools +IdentityProvider +IdentityProviderConfig +IdentityProviderConfigResponse +IdentityProviderConfiguration +IdentityProviderDetails +IdentityProviderName +IdentityProviderOAuthSetting +IdentityProviderOAuthSettings +IdentityProviderSamlMetadata +IdentityProviderSummaries +IdentityProviderSummary +IdentityProviderType +IdentityResolutionJob +IdentityResolutionJobsList +IdentitySource +IdentitySourceDetails +IdentitySourceFilter +IdentitySourceItem +IdentitySourceItemDetails +IdentityStore +IdentityStoreId +IdentityType +IdentityTypeNotSupportedException +IdentityUsage +IdentityValidationExpression +IdentityVerificationAttributes +Idle +IdleClientTimeout +IdleDisconnectTimeoutInSeconds +IdleSinceDateTime +IdleTTL +IdleTimeBetweenReadsInMs +IdleTimeout +IdleTimeoutSeconds +IdnLangCode +Idp +IdpAuthUrl +IdpIdentifier +IdpIdentifiers +IdpLambdaArn +IdpRelayStateParameterName +Ids +IfMatch +IfModifiedSince +IfNoneMatch +IfUnmodifiedSince +Igmpv2Support +IgnoreCoordinates +IgnoreErrors +IgnoreHeaderRows +IgnoreMetricsTime +IgnorePollAlarmFailure +IgnorePublicAcls +IgnoreUnsupportedType +IkeVersions +IllegalActionException +IllegalArgumentException +IllegalBlueprintStateException +IllegalDelete +IllegalFieldLevelEncryptionConfigAssociationWithCacheBehavior +IllegalOriginAccessConfiguration +IllegalSessionStateException +IllegalStatusException +IllegalUpdate +IllegalUserStateException +IllegalWorkflowStateException +Image +ImageAggregation +ImageAlreadyExistsException +ImageArn +ImageAssets +ImageAttribute +ImageBasedTrickPlay +ImageBasedTrickPlaySettings +ImageBlockPublicAccessState +ImageBuilder +ImageBuilderErrors +ImageBuilderName +ImageBuilderStateChangeReason +ImageBuilderSupported +ImageBuilders +ImageClassificationJobConfig +ImageConfig +ImageConfigError +ImageConfigResponse +ImageConfiguration +ImageConfigurationInput +ImageContent +ImageData +ImageDescription +ImageDetail +ImageDigest +ImageDigestDoesNotMatchException +ImageDiskContainer +ImageErrors +ImageFailure +ImageFile +ImageFrameInformation +ImageGenerationConfiguration +ImageGenerationDestinationConfig +ImageIconUrl +ImageId +ImageIdentifier +ImageIds +ImageInserter +ImageInserterInput +ImageLayerAggregation +ImageLayerAggregationResponse +ImageLocation +ImageMask +ImageName +ImageNotFoundException +ImageOwnerAlias +ImagePackage +ImagePermission +ImagePermissions +ImagePipeline +ImagePipelineAggregation +ImagePrefix +ImageProperties +ImagePublishedAt +ImagePullCredentialsType +ImageQuality +ImageRecipe +ImageRecipeSummary +ImageRecycleBinInfo +ImageReplicationStatus +ImageRepository +ImageRepositoryType +ImageResponseCard +ImageScaling +ImageScanFinding +ImageScanFindingAggregation +ImageScanFindings +ImageScanFindingsFilter +ImageScanFindingsSummary +ImageScanState +ImageScanStatus +ImageScanStatuses +ImageScanningConfiguration +ImageSelectorType +ImageSetProperties +ImageSetWorkflowStatus +ImageSetsMetadataSummary +ImageSmallIconUrl +ImageSource +ImageSourceBands +ImageState +ImageStateChangeReason +ImageStats +ImageStatus +ImageSummary +ImageTagAlreadyExistsException +ImageTagDetail +ImageTagMutability +ImageTags +ImageTestsConfiguration +ImageTooLargeException +ImageType +ImageUri +ImageUrl +ImageVersion +ImageVersionArn +ImageVersionNumber +ImageVersionStatus +ImageVersions +ImageX +ImageY +Images +ImdsSupport +ImmediateModeScheduleActionStartSettings +ImmunityTime +ImmunityTimeProperty +Impact +ImpactEndTime +ImpactLevel +ImpactStartTime +ImpactType +ImpactedLocation +ImpactedLocations +ImpairedSince +ImpersonationMatchedRule +ImpersonationRole +ImpersonationRoleId +ImpersonationRoleIds +ImpersonationRule +ImpersonationRuleId +ImplicitDeny +ImportApiKeysRequest +ImportApiRequest +ImportApiResponse +ImportAppCatalogRequest +ImportApplicationUsageRequest +ImportApplicationUsageResult +ImportArn +ImportAsProvisionedProductInput +ImportAsProvisionedProductOutput +ImportAssetFromApiGatewayApi +ImportAssetFromApiGatewayApiRequestDetails +ImportAssetFromApiGatewayApiResponseDetails +ImportAssetFromSignedUrl +ImportAssetFromSignedUrlJobErrorDetails +ImportAssetFromSignedUrlRequestDetails +ImportAssetFromSignedUrlResponseDetails +ImportAssetsFromLakeFormationTagPolicy +ImportAssetsFromLakeFormationTagPolicyRequestDetails +ImportAssetsFromLakeFormationTagPolicyResponseDetails +ImportAssetsFromRedshiftDataShares +ImportAssetsFromRedshiftDataSharesRequestDetails +ImportAssetsFromRedshiftDataSharesResponseDetails +ImportAssetsFromS3 +ImportAssetsFromS3JobErrorDetails +ImportAssetsFromS3RequestDetails +ImportAssetsFromS3ResponseDetails +ImportBackendAuthRequest +ImportBackendAuthResponse +ImportBackendStorageRequest +ImportBackendStorageResponse +ImportCatalogToGlueRequest +ImportCertificateAuthorityCertificateRequest +ImportCertificateMessage +ImportCertificateRequest +ImportCertificateResponse +ImportClientBrandingRequest +ImportClientBrandingResult +ImportClientVpnClientCertificateRevocationListRequest +ImportClientVpnClientCertificateRevocationListResult +ImportCompleted +ImportComponentRequest +ImportComponentResponse +ImportConflictException +ImportCrlRequest +ImportDataSource +ImportDataSourceConfig +ImportDatasetRequest +ImportDatasetResponse +ImportDecoderManifestRequest +ImportDecoderManifestResponse +ImportDefinition +ImportDestination +ImportDestinationType +ImportDocumentationPartsRequest +ImportErrorData +ImportFailureListItem +ImportFileTaskInformation +ImportFilter +ImportFindingsError +ImportFirewallDomainsRequest +ImportFirewallDomainsResponse +ImportGameConfigurationRequest +ImportGameConfigurationResult +ImportGameConfigurationSource +ImportHostKeyRequest +ImportHostKeyResponse +ImportHubContentRequest +ImportHubContentResponse +ImportHypervisorConfigurationInput +ImportHypervisorConfigurationOutput +ImportId +ImportImageLicenseConfigurationRequest +ImportImageLicenseConfigurationResponse +ImportImageRequest +ImportImageResult +ImportImageTask +ImportImageTasks +ImportInfo +ImportInstance +ImportInstanceLaunchSpecification +ImportInstanceRequest +ImportInstanceResult +ImportInstanceTaskDetails +ImportInstanceVolumeDetailItem +ImportJobEndTime +ImportJobProperties +ImportJobPropertiesList +ImportJobRequest +ImportJobResource +ImportJobResponse +ImportJobStartTime +ImportJobSubmitter +ImportJobSummary +ImportJobs +ImportJobsResponse +ImportKeyInput +ImportKeyMaterialRequest +ImportKeyOutput +ImportKeyPairRequest +ImportKeyPairResult +ImportLabelsTaskRunProperties +ImportLensInput +ImportLensOutput +ImportManifestUrl +ImportMigrationTaskRequest +ImportMode +ImportModelRequest +ImportModelResponse +ImportModelVersionRequest +ImportModelVersionResponse +ImportNotFoundException +ImportNotebookInput +ImportNotebookOutput +ImportOptions +ImportPath +ImportPlaybackKeyPairRequest +ImportPlaybackKeyPairResponse +ImportReadSetFilter +ImportReadSetJobItem +ImportReadSetSourceItem +ImportReferenceFilter +ImportReferenceJobItem +ImportReferenceSourceItem +ImportResourceSpecification +ImportResourcesToDraftAppVersionRequest +ImportResourcesToDraftAppVersionResponse +ImportRestApiRequest +ImportSignalCatalogRequest +ImportSignalCatalogResponse +ImportSnapshotRequest +ImportSnapshotResult +ImportSnapshotTask +ImportSnapshotTasks +ImportSortBy +ImportSource +ImportSourceCredentialsInput +ImportSourceCredentialsOutput +ImportSshPublicKeyRequest +ImportSshPublicKeyResponse +ImportStacksToStackSetInput +ImportStacksToStackSetOutput +ImportStatistics +ImportStatus +ImportSummary +ImportSummaryList +ImportTableDescription +ImportTableInput +ImportTableOutput +ImportTablesCompleted +ImportTablesInProgress +ImportTablesNotStarted +ImportTask +ImportTaskError +ImportTaskFilter +ImportTaskId +ImportTaskIds +ImportTaskSummary +ImportTaskSummaryApplications +ImportTaskSummaryServers +ImportTaskSummaryWaves +ImportTerminologyRequest +ImportTerminologyResponse +ImportTime +ImportToken +ImportTr31KeyBlock +ImportTr34KeyBlock +ImportVmImageRequest +ImportVmImageResponse +ImportVolume +ImportVolumeRequest +ImportVolumeResult +ImportVolumeTaskDetails +ImportWorkspaceImageRequest +ImportWorkspaceImageResult +Importance +Imported +ImportedAt +ImportedBy +ImportedDataSize +ImportedDataSizeInBytes +ImportedFileChunkSize +ImportedItemCount +ImportedRecordCount +ImportedSidewalkDevice +ImportedUsers +ImportedWirelessDevice +ImportedWirelessDeviceList +Imports +ImportsListItem +ImprovementPlan +ImprovementPlanUrl +ImprovementPlans +ImprovementStatus +ImprovementSummaries +ImprovementSummary +ImputedPath +ImscDestinationSettings +InAppCampaignSchedule +InAppMessage +InAppMessageBodyConfig +InAppMessageButton +InAppMessageCampaign +InAppMessageCampaigns +InAppMessageContent +InAppMessageHeaderConfig +InAppMessagesResponse +InAppStreamNames +InAppTemplate +InAppTemplateRequest +InAppTemplateResponse +InCluster +InProgress +InProgressInvalidationBatches +InProgressStackInstancesCount +InProgressTableRestoreQuotaExceededFault +InSyncStackInstancesCount +InTransitEncryption +InUse +InUseBy +InaccessibleEncryptionDateTime +InaccessibleKmsKeyDateTime +InactiveDate +InactiveEventDataStoreException +InactiveQueryException +InboundCall +InboundCalling +InboundCallsEnabled +InboundConnection +InboundConnectionStatus +InboundCrossClusterSearchConnection +InboundCrossClusterSearchConnectionStatus +InboundHeader +InboundMMS +InboundPermissionAuthorizations +InboundPermissionRevocations +InboundPermissions +InboundSMS +InboundShipment +InboxCount +InboxPercentage +InboxPlacementTrackingOption +InboxRawCount +IncidentId +IncidentRecord +IncidentRecordSource +IncidentRecordSummary +IncidentTemplate +Include +IncludeAdditionalDetails +IncludeAdditionalLanguageCodes +IncludeAll +IncludeAllDependencies +IncludeAllInstances +IncludeAllLinksToEachParent +IncludeAllTagsOfInstance +IncludeAttachmentFilePatterns +IncludeBlueprint +IncludeBody +IncludeChannelId +IncludeChildPaths +IncludeComplianceDetails +IncludeControlDetails +IncludeCookies +IncludeCredit +IncludeCustomMetadata +IncludeDeleted +IncludeDeletedGroups +IncludeDeletedRecords +IncludeDeprecated +IncludeDiscount +IncludeDvbSubtitles +IncludeEdges +IncludeEncoderConfigurationInSegments +IncludeExecutionData +IncludeExtensions +IncludeFec +IncludeFillerNalUnits +IncludeFilterTypes +IncludeFilters +IncludeFutureRegions +IncludeGlobalServiceEvents +IncludeGraph +IncludeHeaders +IncludeHidden +IncludeIframeOnlyStream +IncludeIframeOnlyStreams +IncludeIndirectActivities +IncludeInferenceResponseIn +IncludeLegGeometry +IncludeLinkedAccounts +IncludeLinkedAccountsMetrics +IncludeManagementEvents +IncludeMap +IncludeMarketplace +IncludeMaximum +IncludeMetrics +IncludeMinimum +IncludeNestedStacks +IncludeNotScaledActivities +IncludeNullAndEmpty +IncludeNullValue +IncludeOnly +IncludeOpForFullLoad +IncludeOtherSubscription +IncludeParameterSpec +IncludePartitionValue +IncludePlannedDeletion +IncludeProvisioningArtifactParameters +IncludePublic +IncludePublicKey +IncludeQueriesWithoutUserInformation +IncludeQuerySpellCheckSuggestions +IncludeRecurring +IncludeRefund +IncludeRelated +IncludeReturnPath +IncludeShared +IncludeSharedResources +IncludeSpace +IncludeSpaces +IncludeStatus +IncludeSubdomains +IncludeSubscription +IncludeSupport +IncludeSymmetricAlgorithms +IncludeTableAlterOperations +IncludeTax +IncludeTransactionDetails +IncludeTrustContext +IncludeUpfront +IncludedAllocatedStorage +IncludedCookies +IncludedDeletedBackTo +IncludedHeaders +IncludedObjectVersions +IncludedPages +IncludedPaths +IncludedProperties +IncludedProperty +IncludedStates +IncludedStatistics +Includes +InclusionFileNamePatterns +InclusionFileTypePatterns +InclusionFilters +InclusionFolderNamePatterns +InclusionPatterns +InclusionPrefixes +InclusionProtectionFilters +InclusionProtectionGroupFilters +Inclusive +InclusiveStartBillingPeriod +InclusiveStartTime +IncomingDukptAttributes +IncomingEncryptionAttributes +IncomingKeyIdentifier +IncomingTranslationAttributes +IncompatibilityMessage +IncompatibleImageException +IncompatibleOrderableOptions +IncompatibleParameterError +IncompatiblePolicyException +IncompatibleProtocolsException +IncompatibleRegionForMultiAZ +IncompatibleSchemaException +IncompatibleSettingsException +IncompatibleVersion +IncompatibleVersionException +IncompleteSegmentBehavior +InconsistentQuantities +IncorrectCidrStateException +IncorrectFileSystemLifeCycleState +IncorrectKeyException +IncorrectKeyMaterialException +IncorrectMountTargetState +IncorrectTrustAnchorException +IncreaseNodeGroupsInGlobalReplicationGroupMessage +IncreaseNodeGroupsInGlobalReplicationGroupResult +IncreaseReplicaCountMessage +IncreaseReplicaCountResult +IncreaseReplicationFactorRequest +IncreaseReplicationFactorResponse +IncreaseStreamRetentionPeriodInput +IncreaseVolumeSize +IncrementalExportSpecification +IncrementalPullConfig +IncrementalRefresh +IncrementalRunConfig +Index +IndexArn +IndexAttachment +IndexAttachments +IndexConfigurationSummary +IndexConfigurationSummaryItems +IndexDocument +IndexDocumentSuffix +IndexDocumentsRequest +IndexDocumentsResponse +IndexFacesModelVersion +IndexFacesRequest +IndexFacesResponse +IndexField +IndexFieldName +IndexFieldStatus +IndexFieldType +IndexFields +IndexId +IndexNSegments +IndexName +IndexNotFoundException +IndexNotReadyException +IndexReference +IndexRotationPeriod +IndexSizeBytes +IndexSlowLogs +IndexStatistics +IndexStatus +IndexedAttributeMissingException +IndexedAttributes +IndexedQuestionAnswersCount +IndexedTextBytes +IndexedTextDocumentsCount +Indexes +IndexingFilter +IndividualAssessmentCompletedCount +IndividualAssessmentCount +IndividualAssessmentName +IndividualAssessmentNames +Industry +IndustryType +InferICD10CMRequest +InferICD10CMResponse +InferRxNormRequest +InferRxNormResponse +InferSNOMEDCTRequest +InferSNOMEDCTResponse +InferenceAccelerator +InferenceAcceleratorInfo +InferenceAcceleratorOverride +InferenceAcceleratorOverrides +InferenceAccelerators +InferenceAttribute +InferenceBenchmark +InferenceConfig +InferenceContainerDefinitions +InferenceContainers +InferenceDataImportStrategy +InferenceDeviceInfo +InferenceDeviceMemoryInfo +InferenceEventSummaries +InferenceEventSummary +InferenceExecutionConfig +InferenceExecutionSummaries +InferenceExecutionSummary +InferenceExperimentArn +InferenceExperimentDataStorageConfig +InferenceExperimentSchedule +InferenceExperimentSummary +InferenceExperiments +InferenceId +InferenceImage +InferenceInputConfiguration +InferenceInputNameConfiguration +InferenceMetrics +InferenceOutputConfiguration +InferenceRecommendation +InferenceRecommendations +InferenceRecommendationsJob +InferenceRecommendationsJobName +InferenceRecommendationsJobStep +InferenceRecommendationsJobs +InferenceS3InputConfiguration +InferenceS3OutputConfiguration +InferenceSchedulerArn +InferenceSchedulerName +InferenceSchedulerNameBeginsWith +InferenceSchedulerSummaries +InferenceSchedulerSummary +InferenceSpecification +InferenceSpecificationName +Inferred +InferredWorkloadSaving +Info +InfoIconLabelOptions +InfoIconText +InfoType +InforNexus +InforNexusConnectorProfileCredentials +InforNexusConnectorProfileProperties +InforNexusSourceProperties +InformationalCount +InfrastructureClass +InfrastructureConfig +InfrastructureConfiguration +InfrastructureConfigurationSummary +InfrastructureType +IngestConfiguration +IngestEndpoint +IngestEndpointId +IngestEndpointUrls +IngestEndpoints +IngestIp +IngestPort +IngestedDataSize +IngestedEventStatistics +IngestedEventsDetail +IngestedEventsTimeWindow +IngestedFilesSummary +IngestedNumberOfFiles +Ingestion +IngestionArn +IngestionDestination +IngestionDestinationSummary +IngestionId +IngestionInputConfiguration +IngestionJobId +IngestionProcess +IngestionS3InputConfiguration +IngestionSizeInBytes +IngestionStatus +IngestionSummary +IngestionTimeInSeconds +IngestionType +Ingestions +Ingress +IngressAccessLogs +IngressBytes +IngressConfiguration +IngressFilterRules +IngressGatewayBridge +IngressPackets +IngressPortMappings +IngressRouteTable +IngressVpcConfiguration +InheritedValue +InitProcessEnabled +InitQuery +InitialActiveLearningModelArn +InitialAudioGain +InitialCapacityConfig +InitialClusterSize +InitialConfigurationToken +InitialContactId +InitialDashboardId +InitialDashboardVisualId +InitialFileLocation +InitialInstanceCount +InitialMessage +InitialNumberOfUsers +InitialPath +InitialPosition +InitialResponseSetting +InitialSamplingPercentage +InitialTopicId +InitialVariantWeight +InitialVersion +InitializationConfiguration +InitializationVector +InitializationVectorInManifest +InitializeClusterRequest +InitializeClusterResponse +InitializedImportedDeviceCount +Initials +InitiateAuthRequest +InitiateAuthResponse +InitiateDeletionTimestamp +InitiateDeviceClaimRequest +InitiateDeviceClaimResponse +InitiateDocumentVersionUploadRequest +InitiateDocumentVersionUploadResponse +InitiateJobInput +InitiateJobOutput +InitiateLayerUploadRequest +InitiateLayerUploadResponse +InitiateMultipartUploadInput +InitiateMultipartUploadOutput +InitiateVaultLockInput +InitiateVaultLockOutput +Initiated +InitiatedBy +InitiationMethod +InitiationTimestamp +Initiator +InitiatorName +Initiators +InlineArchiveRule +InlineChunk +InlineChunkChecksum +InlineChunkChecksumAlgorithm +InlineChunkLength +InlineConfigurations +InlineCustomDocumentEnrichmentConfiguration +InlineDataSchema +InlinePolicy +InnerHorizontal +InnerVertical +Input +InputArtifact +InputArtifacts +InputArtifactsToRemove +InputAttachment +InputAttachmentName +InputAttachmentNameReference +InputAttachments +InputAttributes +InputBucket +InputBytes +InputCaptions +InputChannel +InputChannelLevel +InputChannelLevels +InputChannels +InputChannelsFineTune +InputClass +InputClipping +InputClippingSettings +InputClippings +InputColumn +InputColumns +InputCompressionType +InputConfig +InputConfigInput +InputConfigOutput +InputConfiguration +InputConfigurationRequest +InputConfigurations +InputContent +InputContext +InputDataConfig +InputDataLocationS3 +InputDecryptionSettings +InputDefinition +InputDescription +InputDescriptions +InputDestination +InputDestinationRequest +InputDestinationVpc +InputDeviceConfigurableSettings +InputDeviceHdSettings +InputDeviceId +InputDeviceMediaConnectConfigurableSettings +InputDeviceMediaConnectSettings +InputDeviceNetworkSettings +InputDeviceRequest +InputDeviceSettings +InputDeviceSummary +InputDeviceTransfers +InputDeviceUhdSettings +InputDevices +InputDocumentsCount +InputEndAction +InputFileConfig +InputFileLocation +InputFileUri +InputFilter +InputFormat +InputFormatConfiguration +InputFormatOptions +InputId +InputIdentifier +InputIds +InputIp +InputKey +InputLambdaProcessor +InputLambdaProcessorDescription +InputLambdaProcessorUpdate +InputLocation +InputLogEvent +InputLossAction +InputLossBehavior +InputLossFailoverSettings +InputLossImageColor +InputLossImageSlate +InputLossImageType +InputLossSettings +InputLossThresholdMsec +InputMode +InputName +InputOrigin +InputParallelism +InputParallelismUpdate +InputParameters +InputPartnerIds +InputPath +InputPathsMap +InputPort +InputPreference +InputPrepareScheduleActionSettings +InputPrepareScheduleActions +InputPrepareSettings +InputProcessingConfiguration +InputProcessingConfigurationDescription +InputProcessingConfigurationUpdate +InputRecordTables +InputRows +InputS3Object +InputS3Path +InputScanType +InputSchema +InputSchemaUpdate +InputSecurityGroup +InputSecurityGroupId +InputSecurityGroupIds +InputSecurityGroups +InputSerialization +InputSessionStateSpecification +InputSettings +InputSource +InputSourceRequest +InputSourceType +InputSpecification +InputStartingPosition +InputStartingPositionConfiguration +InputStorageLocation +InputSummary +InputSwitchScheduleActionSettings +InputSwitchSettings +InputTemplate +InputTimeZoneOffset +InputTimecodeSource +InputTransformer +InputType +InputUpdate +InputUpdates +InputVideoGenerator +InputVpcRequest +InputWhitelistRule +InputWhitelistRuleCidr +Inputs +InsecureSsl +InsertHeaders +InsertableImage +InsertableImages +InsertionMode +Inserts +InsideCidrBlocks +Insight +InsightArn +InsightArns +InsightConfiguration +InsightData +InsightEvent +InsightEvents +InsightFeedback +InsightHealth +InsightId +InsightImpactGraphEdge +InsightImpactGraphService +InsightNotEnabledException +InsightResultValue +InsightResults +InsightRule +InsightRuleContributor +InsightRuleContributorDatapoint +InsightRuleMetricDatapoint +InsightRules +InsightSelector +InsightSelectors +InsightSummaries +InsightSummary +InsightTimeRange +InsightType +InsightVisual +Insights +InsightsByAssessment +InsightsConfiguration +InsightsEnabled +InsightsEvent +InsightsTarget +InspectionLevel +InspectorScoreDetails +InspectorServiceAttributes +InstallOverrideList +InstallToRemoteAccessSessionRequest +InstallToRemoteAccessSessionResult +InstallUpdatesOnBoot +InstalledComponent +InstalledCount +InstalledOtherCount +InstalledPendingReboot +InstalledPendingRebootCount +InstalledRejectedCount +InstalledTime +Instance +InstanceAccess +InstanceAccessControlAttributeConfiguration +InstanceAccessDetails +InstanceAccessUrl +InstanceAggregatedAssociationOverview +InstanceAlias +InstanceArn +InstanceAssociation +InstanceAssociationOutputLocation +InstanceAssociationOutputUrl +InstanceAssociationStatusAggregatedCount +InstanceAssociationStatusInfo +InstanceAssociationStatusInfos +InstanceAttribute +InstanceBlockDeviceMapping +InstanceBlockDeviceMappingSpecification +InstanceCapacity +InstanceClass +InstanceCollectionType +InstanceConfig +InstanceConfigs +InstanceConfiguration +InstanceConnectEndpoint +InstanceConnectEndpointArn +InstanceConnectEndpointId +InstanceConnectEndpointIds +InstanceConnectEndpoints +InstanceCount +InstanceCountLimits +InstanceCounts +InstanceCreateTime +InstanceCredentials +InstanceCreditSpecification +InstanceCreditSpecificationRequest +InstanceCreditSpecifications +InstanceDefinition +InstanceDefinitions +InstanceDetails +InstanceDoesNotExistException +InstanceEntry +InstanceEventId +InstanceEventWindow +InstanceEventWindowAssociationRequest +InstanceEventWindowAssociationTarget +InstanceEventWindowDisassociationRequest +InstanceEventWindowId +InstanceEventWindowIds +InstanceEventWindowState +InstanceEventWindowStateChange +InstanceEventWindowTimeRange +InstanceEventWindowTimeRangeRequest +InstanceEventWindows +InstanceExportDetails +InstanceFamilies +InstanceFamily +InstanceFamilyCreditSpecification +InstanceFamilyId +InstanceFleet +InstanceFleetConfig +InstanceFleetId +InstanceFleetModifyConfig +InstanceFleetProvisioningSpecifications +InstanceFleetResizingSpecifications +InstanceFleetStateChangeReason +InstanceFleetStatus +InstanceFleetTimeline +InstanceFleetType +InstanceFleets +InstanceGenerations +InstanceGroup +InstanceGroupConfig +InstanceGroupDetail +InstanceGroupId +InstanceGroupIds +InstanceGroupModifyConfig +InstanceGroupName +InstanceGroupNames +InstanceGroupStateChangeReason +InstanceGroupStatus +InstanceGroupTimeline +InstanceGroupType +InstanceGroupTypes +InstanceGroups +InstanceHardware +InstanceHealth +InstanceHealthCheckResult +InstanceHealthList +InstanceHealthSummary +InstanceID +InstanceId +InstanceIdDetail +InstanceIdFilter +InstanceIdRequiredException +InstanceIdSet +InstanceIdentifier +InstanceIdentity +InstanceIds +InstanceInfo +InstanceInformation +InstanceInformationFilter +InstanceInformationFilterList +InstanceInformationList +InstanceInformationStringFilter +InstanceInitiatedShutdownBehavior +InstanceInterruptionBehavior +InstanceIpv4Prefix +InstanceIpv6Address +InstanceIpv6AddressRequest +InstanceIpv6Prefix +InstanceLifecycle +InstanceLimit +InstanceLimitExceededException +InstanceLimits +InstanceMaintenanceOptions +InstanceMaintenanceOptionsRequest +InstanceMarketOptions +InstanceMarketOptionsRequest +InstanceMatchCriteria +InstanceMemory +InstanceMessages +InstanceMetadata +InstanceMetadataOptions +InstanceMetadataOptionsRequest +InstanceMetadataOptionsResponse +InstanceMetadataServiceConfiguration +InstanceMetadataTags +InstanceMonitoring +InstanceMonitorings +InstanceName +InstanceNameAlreadyRegisteredException +InstanceNameRequiredException +InstanceNetworkInterface +InstanceNetworkInterfaceAssociation +InstanceNetworkInterfaceAttachment +InstanceNetworkInterfaceSpecification +InstanceNetworking +InstanceNotFound +InstanceNotRegisteredException +InstanceOSUser +InstanceOnboardingJobStatus +InstanceOwnerId +InstancePatchState +InstancePatchStateFilter +InstancePatchStates +InstancePlatform +InstancePoolsToUseCount +InstancePort +InstancePortInfo +InstancePortState +InstancePrivateIpAddress +InstanceProfile +InstanceProfileArn +InstanceProfileCreationTime +InstanceProfileId +InstanceProfileIdentifier +InstanceProfileList +InstanceProfileName +InstanceProfiles +InstanceProperty +InstanceProtocol +InstanceQuotaExceededFault +InstanceRecommendation +InstanceRecommendationOption +InstanceRefresh +InstanceRefreshId +InstanceRefreshIds +InstanceRefreshInProgressFault +InstanceRefreshLivePoolProgress +InstanceRefreshProgressDetails +InstanceRefreshWarmPoolProgress +InstanceRefreshes +InstanceRequestCount +InstanceRequirements +InstanceRequirementsRequest +InstanceRequirementsWithMetadata +InstanceRequirementsWithMetadataRequest +InstanceResizePolicy +InstanceReusePolicy +InstanceRole +InstanceRoleArn +InstanceRunningCount +InstanceSize +InstanceSizingType +InstanceSnapshot +InstanceSnapshotInfo +InstanceSpecification +InstanceState +InstanceStateChange +InstanceStateChangeReason +InstanceStates +InstanceStatus +InstanceStatusDetails +InstanceStatusEvent +InstanceStatusReason +InstanceStatusSummary +InstanceStatuses +InstanceStorageConfig +InstanceStorageInfo +InstanceStorageSupported +InstanceSummaries +InstanceSummary +InstanceSummaryList +InstanceTagAttribute +InstanceTagKeys +InstanceTagNotificationAttribute +InstanceTags +InstanceTarget +InstanceTenancy +InstanceTerminationTimeout +InstanceTimeline +InstanceType +InstanceTypeConfig +InstanceTypeConfigs +InstanceTypeDetails +InstanceTypeInfo +InstanceTypeInfoFromInstanceRequirements +InstanceTypeItem +InstanceTypeOffering +InstanceTypeOfferings +InstanceTypeSpecification +InstanceTypeSpecifications +InstanceTypes +InstanceUsage +InstanceUsages +InstanceUserSummaries +InstanceUserSummary +InstanceVcpu +InstanceWarmup +Instances +InstancesCount +InstancesDistribution +InstancesHealth +InstancesRevision +InstancesToProtect +InstancesToTerminate +InstancesToUpdate +InstancesToUpdateOnRollback +InstancesWithCriticalNonCompliantPatches +InstancesWithFailedPatches +InstancesWithInstalledOtherPatches +InstancesWithInstalledPatches +InstancesWithInstalledPendingRebootPatches +InstancesWithInstalledRejectedPatches +InstancesWithMissingPatches +InstancesWithNotApplicablePatches +InstancesWithOtherNonCompliantPatches +InstancesWithSecurityNonCompliantPatches +InstancesWithUnreportedNotApplicablePatches +InstantBooking +InstantiateSolNetworkInstanceInput +InstantiateSolNetworkInstanceOutput +Instructions +InsufficientAvailableIPsInSubnetFault +InsufficientCacheClusterCapacityFault +InsufficientCapabilitiesException +InsufficientCapacityException +InsufficientCloudWatchLogsResourcePolicy +InsufficientClusterCapacityFault +InsufficientDBClusterCapacityFault +InsufficientDBInstanceCapacityFault +InsufficientDataActions +InsufficientDataHealthStatus +InsufficientDeliveryPolicyException +InsufficientDependencyServiceAccessPermissionException +InsufficientEncryptionPolicyException +InsufficientPermissionsException +InsufficientPrivilegesException +InsufficientResourceCapacityFault +InsufficientS3BucketPolicyException +InsufficientS3BucketPolicyFault +InsufficientSensorData +InsufficientSnsTopicPolicyException +InsufficientStorageClusterCapacityFault +InsufficientThroughputCapacity +IntArrayOptions +IntOptions +IntValueMax +IntValueMin +IntegerDatasetParameter +IntegerDatasetParameterDefaultValues +IntegerDefaultValues +IntegerHyperParameterRange +IntegerParameter +IntegerParameterDeclaration +IntegerParameterRange +IntegerParameterRangeSpecification +IntegerParameterRanges +IntegerParameters +IntegerRange +IntegerStaticValues +IntegerValue +IntegerValueWhenUnsetConfiguration +IntegerValues +IntegrateServices +Integration +IntegrationArn +IntegrationAssociationArn +IntegrationAssociationId +IntegrationAssociationSummary +IntegrationAssociationSummaryList +IntegrationConfig +IntegrationId +IntegrationMethod +IntegrationResponse +IntegrationResponseId +IntegrationResponseKey +IntegrationResponseSelectionExpression +IntegrationResultS3DestinationArn +IntegrationSubtype +IntegrationType +IntegrationTypes +IntegrationUri +Integrations +IntelligentTieringAndOperator +IntelligentTieringConfiguration +IntelligentTieringConfigurationList +IntelligentTieringFilter +IntendedUse +Intent +IntentClassificationTestResultItem +IntentClassificationTestResultItemCounts +IntentClassificationTestResults +IntentClosingSetting +IntentConfidence +IntentConfirmationSetting +IntentFilter +IntentLevelSlotResolutionTestResultItem +IntentLevelSlotResolutionTestResults +IntentMetadata +IntentOverride +IntentResultEvent +IntentSortBy +IntentStatistics +IntentSummary +InterMetricImpactDetails +InterMetricImpactList +Interactive +InteractiveLayoutConfiguration +Intercluster +Interconnect +Interconnects +Interface +InterfaceAssociation +InterfaceAssociations +InterfacePermission +InterfaceProtocol +InterfaceRequest +InterfaceType +InterlaceMode +Interlaced +InternalDependencyException +InternalError +InternalErrorException +InternalException +InternalFailure +InternalFailureException +InternalServerError +InternalServerErrorException +InternalServerException +InternalServiceError +InternalServiceErrorException +InternalServiceException +InternalServiceFault +InternalStreamFailure +InternalUserDatabaseEnabled +InternetGateway +InternetGatewayAttachment +InternetGatewayId +InternetGatewayIds +InternetGatewayRoutes +InternetGateways +InternetHealth +InternetKeyExchangeVersion +InternetMeasurementsLogDelivery +InteroperabilityEnabled +Interpolated +InterpolatedAssetPropertyValue +InterpolationParameters +InterpolationValue +Interpretation +InterruptionFilter +Interval +IntervalCadence +IntervalEndTime +IntervalInSeconds +IntervalStartTime +IntervalUnit +IntraDcPrecision +InvalidACLStateFault +InvalidARNFault +InvalidAccessException +InvalidAccountStatusException +InvalidActionDeclarationException +InvalidActivation +InvalidActivationId +InvalidActorArnException +InvalidAddressException +InvalidAggregationException +InvalidAggregatorException +InvalidAlarmConfigException +InvalidAliasNameException +InvalidAllowedPatternException +InvalidApplicationConfigurationException +InvalidApplicationNameException +InvalidApprovalRuleContentException +InvalidApprovalRuleNameException +InvalidApprovalRuleTemplateContentException +InvalidApprovalRuleTemplateDescriptionException +InvalidApprovalRuleTemplateNameException +InvalidApprovalStateException +InvalidApprovalTokenException +InvalidArgsException +InvalidArgument +InvalidArgumentException +InvalidArn +InvalidArnException +InvalidAssociation +InvalidAssociationVersion +InvalidAttachmentException +InvalidAuthenticationCodeException +InvalidAuthenticationProfileRequestFault +InvalidAuthorArnException +InvalidAuthorizationMessageException +InvalidAuthorizationStateFault +InvalidAutoRollbackConfigException +InvalidAutoScalingGroupException +InvalidAutomationExecutionParametersException +InvalidAutomationSignalException +InvalidAutomationStatusUpdateException +InvalidBatchEntryIdException +InvalidBlobIdException +InvalidBlockerDeclarationException +InvalidBlueGreenDeploymentConfigurationException +InvalidBlueGreenDeploymentStateFault +InvalidBranchNameException +InvalidBucketNameFilterException +InvalidCacheClusterStateFault +InvalidCacheParameterGroupStateFault +InvalidCacheSecurityGroupStateFault +InvalidCampaignStateException +InvalidCertificateAuthorityException +InvalidCertificateException +InvalidCertificateFault +InvalidChangeBatch +InvalidChangeSetStatusException +InvalidChannelARN +InvalidCiphertextException +InvalidClientAuthStatusException +InvalidClientException +InvalidClientMetadataException +InvalidClientRequestTokenException +InvalidClientTokenException +InvalidCloudWatchDestinationException +InvalidCloudWatchLogsLogGroupArnException +InvalidCloudWatchLogsRoleArnException +InvalidClusterParameterGroupStateFault +InvalidClusterSecurityGroupStateFault +InvalidClusterSnapshotScheduleStateFault +InvalidClusterSnapshotStateFault +InvalidClusterStateFault +InvalidClusterSubnetGroupStateFault +InvalidClusterSubnetStateFault +InvalidClusterTrackFault +InvalidCodeSignatureException +InvalidCodecPrivateDataException +InvalidCommentIdException +InvalidCommentOperationException +InvalidCommitException +InvalidCommitIdException +InvalidComputePlatformException +InvalidConfigurationDetail +InvalidConfigurationException +InvalidConfigurationRecorderNameException +InvalidConfigurationRequestException +InvalidConfigurationSetException +InvalidConflictDetailLevelException +InvalidConflictResolutionException +InvalidConflictResolutionStrategyException +InvalidContactFlowException +InvalidContactFlowModuleException +InvalidContentLocation +InvalidContinuationTokenException +InvalidCredentialsException +InvalidCrossAccountRoleException +InvalidCustomDBEngineVersionStateFault +InvalidCustomSesConfigurationException +InvalidCustomerIdentifierException +InvalidDBClusterAutomatedBackupStateFault +InvalidDBClusterCapacityFault +InvalidDBClusterEndpointStateFault +InvalidDBClusterSnapshotStateFault +InvalidDBClusterStateFault +InvalidDBInstanceAutomatedBackupStateFault +InvalidDBInstanceStateFault +InvalidDBParameterGroupStateFault +InvalidDBProxyEndpointStateFault +InvalidDBProxyStateFault +InvalidDBSecurityGroupStateFault +InvalidDBSnapshotStateFault +InvalidDBSubnetGroupFault +InvalidDBSubnetGroupStateFault +InvalidDBSubnetStateFault +InvalidDataRepositoryType +InvalidDataShareFault +InvalidDateEntries +InvalidDateRangeException +InvalidDefaultRootObject +InvalidDefinition +InvalidDeleteInventoryParametersException +InvalidDeletionIdException +InvalidDeletionParameterException +InvalidDeliveryChannelNameException +InvalidDeliveryOptionsException +InvalidDeployedStateFilterException +InvalidDeploymentConfigNameException +InvalidDeploymentGroupNameException +InvalidDeploymentIdException +InvalidDeploymentInstanceTypeException +InvalidDeploymentStatusException +InvalidDeploymentStyleException +InvalidDeploymentTargetIdException +InvalidDeploymentWaitTypeException +InvalidDescriptionException +InvalidDestinationCommitSpecifierException +InvalidDestinationKmsKey +InvalidDeviceException +InvalidDocument +InvalidDocumentContent +InvalidDocumentOperation +InvalidDocumentSchemaVersion +InvalidDocumentType +InvalidDocumentVersion +InvalidDomainName +InvalidDomainNameForOriginAccessControl +InvalidDomainValidationOptionsException +InvalidEC2TagCombinationException +InvalidEC2TagException +InvalidECSServiceException +InvalidElasticIpFault +InvalidEmailException +InvalidEmailRoleAccessPolicyException +InvalidEncodingException +InvalidEndPointException +InvalidEndpointException +InvalidEndpointRegionException +InvalidEndpointStateFault +InvalidErrorCode +InvalidEventCategoryException +InvalidEventDataStoreCategoryException +InvalidEventDataStoreStatusException +InvalidEventPatternException +InvalidEventSelectorsException +InvalidEventSubscriptionStateFault +InvalidExecutionInput +InvalidExportOnlyFault +InvalidExportPath +InvalidExportSourceStateFault +InvalidExportTaskStateFault +InvalidExportTimeException +InvalidExpressionException +InvalidExternalIdException +InvalidFacetUpdateException +InvalidFallbackBehavior +InvalidFileExistsBehaviorException +InvalidFileLocationException +InvalidFileModeException +InvalidFilePositionException +InvalidFilter +InvalidFilterException +InvalidFilterOption +InvalidFilterValue +InvalidFirehoseDestinationException +InvalidFleetStatusException +InvalidFormatFault +InvalidForwardCookies +InvalidFunctionAssociation +InvalidGameSessionStatusException +InvalidGatewayRequestException +InvalidGeoRestrictionParameter +InvalidGitHubAccountTokenException +InvalidGitHubAccountTokenNameException +InvalidGlobalClusterStateFault +InvalidGlobalReplicationGroupStateFault +InvalidGrantException +InvalidGrantIdException +InvalidGrantTokenException +InvalidHandshakeTransitionException +InvalidHeadersForS3Origin +InvalidHomeRegionException +InvalidHsmClientCertificateStateFault +InvalidHsmConfigurationStateFault +InvalidIamSessionArnException +InvalidIamUserArnException +InvalidIdentityPoolConfigurationException +InvalidIdentityTokenException +InvalidIfMatchVersion +InvalidIgnoreApplicationStopFailuresValueException +InvalidImageFormatException +InvalidImportPath +InvalidImportSourceException +InvalidImportTokenException +InvalidInput +InvalidInputCombinationException +InvalidInputException +InvalidInputRecords +InvalidInsightSelectorsException +InvalidInstanceId +InvalidInstanceInformationFilterValue +InvalidInstanceNameException +InvalidInstanceStatusException +InvalidInstanceTypeException +InvalidInventoryGroupException +InvalidInventoryItemContextException +InvalidInventoryRequestException +InvalidItemContentException +InvalidJobException +InvalidJobIdException +InvalidJobStateException +InvalidKMSArn +InvalidKMSKeyException +InvalidKMSKeyFault +InvalidKMSResourceException +InvalidKeyId +InvalidKeyPrefixFilterException +InvalidKeySigningKeyName +InvalidKeySigningKeyStatus +InvalidKeyUsageException +InvalidKmsKeyIdException +InvalidLDAPSStatusException +InvalidLabels +InvalidLambdaFunctionAssociation +InvalidLambdaFunctionException +InvalidLambdaFunctionOutputException +InvalidLambdaResponseException +InvalidLayerException +InvalidLayerPartException +InvalidLexiconException +InvalidLifecycleEventHookExecutionIdException +InvalidLifecycleEventHookExecutionStatusException +InvalidLimitException +InvalidLoadBalancerActionException +InvalidLoadBalancerInfoException +InvalidLocationCode +InvalidLoggingConfiguration +InvalidLookupAttributesException +InvalidMarkerException +InvalidMaxConflictFilesException +InvalidMaxMergeHunksException +InvalidMaxResultsException +InvalidMediaFrameException +InvalidMergeOptionException +InvalidMinimumHealthyHostValueException +InvalidMinimumProtocolVersion +InvalidName +InvalidNamespaceFault +InvalidNetworkInterface +InvalidNetworkSettings +InvalidNextToken +InvalidNextTokenException +InvalidNodeException +InvalidNodeStateFault +InvalidNonceException +InvalidNotificationConfig +InvalidNumericDataException +InvalidOAuthFlowException +InvalidObjectState +InvalidOnPremisesTagCombinationException +InvalidOperationException +InvalidOperationFault +InvalidOptionException +InvalidOptionGroupStateFault +InvalidOrderException +InvalidOrigin +InvalidOriginAccessControl +InvalidOriginAccessIdentity +InvalidOriginKeepaliveTimeout +InvalidOriginReadTimeout +InvalidOutput +InvalidOverrideStatusException +InvalidPaginationException +InvalidPaginationToken +InvalidPaginationTokenException +InvalidParameter +InvalidParameterCombinationException +InvalidParameterDetail +InvalidParameterException +InvalidParameterGroupStateFault +InvalidParameterValueException +InvalidParameterValuesException +InvalidParameters +InvalidParametersException +InvalidParentCommitIdException +InvalidPasswordException +InvalidPathException +InvalidPerUnitStorageThroughput +InvalidPermissionType +InvalidPolicyAttributeException +InvalidPolicyDocument +InvalidPolicyException +InvalidPolicyRevisionIdException +InvalidPolicyTypeException +InvalidPortRangeException +InvalidProductCodeException +InvalidProtocolSettings +InvalidPublicKeyException +InvalidPublicKeyVersionException +InvalidPullRequestEventTypeException +InvalidPullRequestIdException +InvalidPullRequestStatusException +InvalidPullRequestStatusUpdateException +InvalidQueryException +InvalidQueryStatementException +InvalidQueryStatusException +InvalidQueryStringParameters +InvalidReactionUserArnException +InvalidReactionValueException +InvalidRecordCount +InvalidRecordingGroupException +InvalidReferenceNameException +InvalidRegion +InvalidRegionException +InvalidRegistrationStatusException +InvalidRelativeFileVersionEnumException +InvalidRelativePath +InvalidRenderingParameterException +InvalidReplacementContentException +InvalidReplacementTypeException +InvalidReplicationGroupStateFault +InvalidRepositoryDescriptionException +InvalidRepositoryNameException +InvalidRepositoryTriggerBranchNameException +InvalidRepositoryTriggerCustomDataException +InvalidRepositoryTriggerDestinationArnException +InvalidRepositoryTriggerEventsException +InvalidRepositoryTriggerNameException +InvalidRepositoryTriggerRegionException +InvalidRequestContentException +InvalidRequestDetail +InvalidRequestException +InvalidRequiredProtocol +InvalidReservedNodeStateFault +InvalidResourceArnException +InvalidResourceException +InvalidResourceFormatException +InvalidResourcePolicyException +InvalidResourceStateException +InvalidResourceStateFault +InvalidResourceTypeException +InvalidResponseCode +InvalidResponseException +InvalidRestoreFault +InvalidRestoreTimeException +InvalidResultAttributeException +InvalidResultTokenException +InvalidRetentionPeriodFault +InvalidRevisionException +InvalidRevisionIdException +InvalidRole +InvalidRoleException +InvalidRouteTableId +InvalidRuleContentSha256Exception +InvalidRuleException +InvalidRuntimeException +InvalidS3BucketException +InvalidS3BucketFault +InvalidS3BucketNameException +InvalidS3BucketNameFault +InvalidS3ConfigurationException +InvalidS3KeyException +InvalidS3KeyPrefixException +InvalidS3KeyPrefixFault +InvalidS3KmsKeyArnException +InvalidS3ObjectException +InvalidS3PrefixException +InvalidSNSDestinationException +InvalidSNSTopicARNException +InvalidSampleRateException +InvalidSchedule +InvalidScheduleFault +InvalidScheduledActionFault +InvalidSchemaDocException +InvalidSchemeException +InvalidScopeException +InvalidSecretsManagerResourceException +InvalidSecurityException +InvalidSecurityGroupException +InvalidSecurityGroupIDException +InvalidSecurityGroupId +InvalidSensorData +InvalidSequenceTokenException +InvalidServiceLinkedRoleStateException +InvalidServiceRoleException +InvalidSessionException +InvalidSignal +InvalidSignalDecoder +InvalidSignalsException +InvalidSigningStatus +InvalidSmsRoleAccessPolicyException +InvalidSmsRoleTrustRelationshipException +InvalidSnapshotCopyGrantStateFault +InvalidSnapshotStateFault +InvalidSnsTopicArnException +InvalidSnsTopicException +InvalidSnsTopicNameException +InvalidSortByException +InvalidSortOrderException +InvalidSourceCommitSpecifierException +InvalidSourceException +InvalidSourceKmsKey +InvalidSsmlException +InvalidStageDeclarationException +InvalidStateException +InvalidStateTransitionException +InvalidStructureException +InvalidSubnet +InvalidSubnetException +InvalidSubnetIDException +InvalidSubnetId +InvalidSubscriptionStateFault +InvalidSystemTagUsageException +InvalidTTLOrder +InvalidTableRestoreArgumentFault +InvalidTag +InvalidTagException +InvalidTagFault +InvalidTagFilterException +InvalidTagKeysListException +InvalidTagParameterException +InvalidTagging +InvalidTaggingRequestException +InvalidTagsException +InvalidTagsMapException +InvalidTagsToAddException +InvalidTarget +InvalidTargetBranchException +InvalidTargetException +InvalidTargetFilterNameException +InvalidTargetGroupPairException +InvalidTargetInstancesException +InvalidTargetMaps +InvalidTargetsException +InvalidTaskIdException +InvalidTemplateException +InvalidTimeRangeException +InvalidTitleException +InvalidToken +InvalidTokenException +InvalidTracingConfiguration +InvalidTrackingOptionsException +InvalidTrafficPolicyDocument +InvalidTrafficRoutingConfigurationException +InvalidTrailNameException +InvalidTriggerConfigException +InvalidTypeException +InvalidTypeNameException +InvalidUpdate +InvalidUpdateOutdatedInstancesOnlyValueException +InvalidUsageAllocationsException +InvalidUsageDimensionException +InvalidUsageLimitFault +InvalidUserGroupStateFault +InvalidUserList +InvalidUserPoolConfigurationException +InvalidUserStateFault +InvalidUserStatusException +InvalidUserTypeException +InvalidVPCId +InvalidVPCNetworkStateFault +InvalidValues +InvalidVersionNumberException +InvalidViewerCertificate +InvalidWebACLId +InvalidWebhookAuthenticationParametersException +InvalidWebhookFilterPatternException +InvalidZipFileException +InvalidateProjectCacheInput +Invalidation +InvalidationBatch +InvalidationList +InvalidationSummary +InventoryAggregator +InventoryConfiguration +InventoryConfigurationList +InventoryData +InventoryDeletionStatusItem +InventoryDeletionSummary +InventoryDeletionSummaryItem +InventoryDeletions +InventoryDestination +InventoryEncryption +InventoryFilter +InventoryGroup +InventoryItem +InventoryItemAttribute +InventoryItemSchema +InventoryResultEntity +InventoryResultItem +InventoryRetrievalJobDescription +InventoryRetrievalJobInput +InventoryRetrievalParameters +InventoryS3BucketDestination +InventorySchedule +InventorySizeInBytes +Inverse +Inverted +InvisibleFieldInfo +InvisibleFields +Invitation +InvitationId +InvitationType +Invitations +InvitationsCount +Invite +InviteAccountToOrganizationRequest +InviteAccountToOrganizationResponse +InviteAction +InviteId +InviteMembersRequest +InviteMembersResponse +InviteMessageTemplate +InviteUsersRequest +InviteUsersResponse +InvitedAt +InvitedBy +InvitedOn +InvitedTime +InviteePrincipalId +Invites +InvocationCondition +InvocationEndTime +InvocationEndpoint +InvocationHttpParameters +InvocationId +InvocationPhrase +InvocationPoint +InvocationRateLimitPerSecond +InvocationRequest +InvocationResponse +InvocationRole +InvocationStartTime +InvocationTime +InvocationTimeoutSeconds +InvocationType +InvocationsMaxRetries +InvocationsPerInstance +InvocationsTimeoutInSeconds +InvoiceId +InvokeArgs +InvokeAsyncRequest +InvokeAsyncResponse +InvokeDeviceMethodRequest +InvokeDeviceMethodResponse +InvokeEndpointAsyncInput +InvokeEndpointAsyncOutput +InvokeEndpointInput +InvokeEndpointOutput +InvokeEndpointWithResponseStreamInput +InvokeEndpointWithResponseStreamOutput +InvokeMode +InvokeModelRequest +InvokeModelResponse +InvokeModelWithResponseStreamRequest +InvokeModelWithResponseStreamResponse +InvokeResponseStreamUpdate +InvokeScreenAutomationRequest +InvokeScreenAutomationResult +InvokeWithResponseStreamCompleteEvent +InvokeWithResponseStreamRequest +InvokeWithResponseStreamResponse +InvokedBy +InvokedIntentSample +InvokedProductionVariant +IoPerformance +IoTJobAbortConfig +IoTJobAbortCriteria +IoTJobExecutionsRolloutConfig +IoTJobExponentialRolloutRate +IoTJobRateIncreaseCriteria +IoTJobTimeoutConfig +IonBinary +IonText +Iops +IopsOther +IopsRead +IopsToStorageRatio +IopsTotal +IopsWrite +IosClientBrandingAttributes +IosImportClientBrandingAttributes +IotAnalyticsAction +IotCertificateId +IotEventsAction +IotEventsDestinationConfiguration +IotEventsInputIdentifier +IotJobArn +IotJobId +IotRoleAlias +IotSiteWiseAction +IotSiteWiseAssetModelPropertyIdentifier +IotSiteWiseCustomerManagedDatastoreS3Storage +IotSiteWiseCustomerManagedDatastoreS3StorageSummary +IotSiteWiseInputIdentifier +IotThingName +IotTopicPublishAction +Ip +IpAccessSettings +IpAccessSettingsSummary +IpAddress +IpAddressCount +IpAddressDetails +IpAddressFamily +IpAddressInUse +IpAddressRequest +IpAddressResponse +IpAddressType +IpAddressUpdate +IpAddressV4 +IpAddresses +IpCity +IpCountry +IpDiscovery +IpFamily +IpFilter +IpGeoLocation +IpId +IpOrganizationDetails +IpOwner +IpOwnerId +IpPermission +IpPermissions +IpPermissionsEgress +IpProtocol +IpRange +IpRanges +IpRestrictionRuleMap +IpRoute +IpRouteInfo +IpRouteLimitExceededException +IpRouteStatusMsg +IpRouteStatusReason +IpRoutes +IpRoutesInfo +IpRule +IpRuleItem +IpScheme +IpSet +IpSetId +IpSetIds +IpSets +IpUsage +IpV4Addresses +IpV4Cidr +IpV4CidrBlock +IpV6Address +IpV6Addresses +IpV6Cidr +Ipam +IpamAddressHistoryRecord +IpamArn +IpamCidrAuthorizationContext +IpamDiscoveredAccount +IpamDiscoveredAccounts +IpamDiscoveredResourceCidr +IpamDiscoveredResourceCidrs +IpamDiscoveryFailureReason +IpamId +IpamIds +IpamOperatingRegion +IpamPool +IpamPoolAllocation +IpamPoolAllocationId +IpamPoolAllocations +IpamPoolArn +IpamPoolCidr +IpamPoolCidrFailureReason +IpamPoolCidrId +IpamPoolCidrs +IpamPoolId +IpamPoolIds +IpamPoolOwner +IpamPools +IpamRegion +IpamResourceCidr +IpamResourceCidrs +IpamResourceDiscoveries +IpamResourceDiscovery +IpamResourceDiscoveryArn +IpamResourceDiscoveryAssociation +IpamResourceDiscoveryAssociationArn +IpamResourceDiscoveryAssociationId +IpamResourceDiscoveryAssociationIds +IpamResourceDiscoveryAssociations +IpamResourceDiscoveryId +IpamResourceDiscoveryIds +IpamResourceDiscoveryRegion +IpamResourceTag +IpamScope +IpamScopeArn +IpamScopeId +IpamScopeIds +IpamScopeType +IpamScopes +Ipams +IpcMode +Ips +Ipv4 +Ipv4Address +Ipv4AddressesPerInterface +Ipv4IpamPoolId +Ipv4NetmaskLength +Ipv4Prefix +Ipv4PrefixCount +Ipv4PrefixSpecification +Ipv4PrefixSpecificationRequest +Ipv4PrefixSpecificationResponse +Ipv4Prefixes +Ipv6 +Ipv6Address +Ipv6AddressCount +Ipv6Addresses +Ipv6AddressesPerInterface +Ipv6Cidr +Ipv6CidrAssociation +Ipv6CidrAssociations +Ipv6CidrBlock +Ipv6CidrBlockAssociation +Ipv6CidrBlockAssociationSet +Ipv6CidrBlockNetworkBorderGroup +Ipv6CidrBlockSet +Ipv6CidrBlockState +Ipv6IpamPoolId +Ipv6Native +Ipv6NetmaskLength +Ipv6Pool +Ipv6Pools +Ipv6Prefix +Ipv6PrefixCount +Ipv6PrefixSpecification +Ipv6PrefixSpecificationRequest +Ipv6PrefixSpecificationResponse +Ipv6Prefixes +Ipv6Range +Ipv6Ranges +Ipv6Support +Ipv6Supported +IrreversibleInstanceRefreshFault +Is64BitsOnly +IsActivated +IsAdvancedManagedRuleSet +IsAlexaForBusinessEnabled +IsAnomalous +IsAnomaly +IsApplicable +IsArchived +IsAttachable +IsAuthorizedInput +IsAuthorizedOutput +IsAuthorizedWithTokenInput +IsAuthorizedWithTokenOutput +IsAutoPredictor +IsBatchStatement +IsBinaryFile +IsCaller +IsClusterWriter +IsCollection +IsCritical +IsDataLossAllowed +IsDataPartial +IsDefault +IsDefaultAction +IsDefaultConfiguration +IsDefaultVersion +IsEgress +IsEmpty +IsEnabled +IsEncrypted +IsEnd +IsEssential +IsGlobal +IsIPV6Enabled +IsImmutable +IsInSandbox +IsIncludedInTopic +IsIndirectActivity +IsLatest +IsLatestPatch +IsLatestVersion +IsLocalTime +IsLogging +IsLoggingEnabled +IsLongTermPricingAutoRenew +IsMajorVersion +IsMajorVersionUpgrade +IsMaster +IsMemberInGroupsRequest +IsMemberInGroupsResponse +IsMfaDeleteEnabled +IsMiddlebox +IsModifiable +IsMultiRegionTrail +IsNegOne +IsNewProvisioningAvailable +IsNoEcho +IsNullString +IsOptional +IsOrganizationTrail +IsOwned +IsParent +IsPartial +IsPaused +IsPermanentRestore +IsPrimary +IsPrimaryIpv6 +IsPublic +IsPubliclyAccessible +IsRegisteredWithLakeFormation +IsRequestable +IsRequired +IsRestoreInProgress +IsRestricted +IsReviewOwnerUpdateAcknowledged +IsRouteTableUsedInDifferentAZ +IsSuccess +IsTerminal +IsTestDomain +IsTruncated +IsTunable +IsUnique +IsUnstructured +IsValidExchange +IsValueSecret +IsVerifiedAuthor +IsVersioningSupported +IsVpcPeeredResult +IsWifiEnabled +IsWriter +Iscsi +Iso2CountryCode +IsoCountryCode +IsolationMode +Isp +IspName +IspPlacement +IspPlacements +Issue +IssueCertificateRequest +IssueCertificateResponse +IssueDetected +IssueDetectionConfiguration +IssueFieldMappings +IssueInfoMap +IssueSubEntityFilter +IssueType +IssuedAt +Issuer +IssuerCertificateIdentifier +IssuerDetails +Issues +IssuesDetected +IssuingAccount +Item +ItemClassFilter +ItemCollectionKey +ItemCollectionMetrics +ItemCollectionSizeLimitExceededException +ItemContentHash +ItemContentMismatchException +ItemCount +ItemIdentifier +ItemIdentifierAttributeName +ItemResponse +ItemSizeLimitExceededException +ItemSource +ItemStatus +ItemizedMetricStats +ItemizedMetricStatsList +Items +ItemsLimit +ItemsLimitConfiguration +IvInManifest +IvSource +JA3Fingerprint +JDBCConnectorOptions +JDBCConnectorSource +JDBCConnectorTarget +JSON +JSONInput +JSONMappingParameters +JSONOutput +JSONString +JWTConfiguration +JamSyncTime +JapaneseTokenizationDictionary +Jar +Jdbc +JdbcTarget +JdbcTargets +JiraAccountUrl +JiraConfiguration +JiraParameters +JmxExporter +JmxExporterInfo +Job +JobAlbumArt +JobArn +JobBookmark +JobBookmarkEntry +JobBookmarkKeys +JobBookmarkKeysSortOrder +JobBookmarksEncryption +JobBookmarksEncryptionMode +JobCheckpointConfig +JobCommand +JobCompletionDate +JobCompletionReportURI +JobConfig +JobConfiguration +JobCreationDate +JobData +JobDefinition +JobDefinitionArn +JobDefinitionName +JobDefinitionSummaries +JobDependency +JobDescription +JobDescriptor +JobDetail +JobDetails +JobDriver +JobDurationInSeconds +JobEndTime +JobEntry +JobError +JobEventDetails +JobExecution +JobExecutionSettings +JobExecutionState +JobExecutionStatusDetails +JobExecutionSummary +JobExecutionSummaryForJob +JobExecutionSummaryForThing +JobExecutionsRetryConfig +JobExecutionsRolloutConfig +JobExpirationTime +JobFailure +JobFailureLogURI +JobFilter +JobFlowDetail +JobFlowExecutionStatusDetail +JobFlowId +JobFlowIds +JobFlowInstancesConfig +JobFlowInstancesDetail +JobFlowRole +JobFlowStates +JobFlows +JobId +JobIds +JobInput +JobList +JobListDescriptor +JobListEntries +JobListEntry +JobLog +JobLogEventData +JobLogInfo +JobLogs +JobManifest +JobManifestGeneratorFilter +JobManifestLocation +JobManifestSpec +JobMessages +JobMetadata +JobMetrics +JobName +JobNameContains +JobNames +JobNodeDetails +JobNotFoundException +JobOperation +JobOutput +JobOutputDataConfig +JobOutputPath +JobParameters +JobPercentComplete +JobPlanDescription +JobPostLaunchActionsLaunchStatus +JobProcessDetails +JobProgress +JobProgressSummary +JobQueueDetail +JobReferenceCode +JobReferenceCodeContains +JobReport +JobResource +JobResourceTags +JobResources +JobRun +JobRunId +JobRunIds +JobRunState +JobRunSummary +JobRuns +JobSample +JobSchedule +JobScheduleFrequency +JobScopeTerm +JobScopingBlock +JobSettings +JobStartTime +JobState +JobStatesToNotify +JobStats +JobStatus +JobStatusDetails +JobStatusException +JobStatuses +JobStoppingCondition +JobSuccessLogURI +JobSummaries +JobSummary +JobTag +JobTags +JobTemplate +JobTemplateData +JobTemplateSettings +JobTemplateSummary +JobTemplates +JobTimeout +JobTimers +JobTitle +JobType +JobUpdate +JobWatermark +JobWorkerExecutorConfiguration +Jobs +JobsNotFound +Join +JoinColumn +JoinDomainInput +JoinDomainOutput +JoinEui +JoinEuiFilters +JoinEventConfiguration +JoinInstruction +JoinKeyProperties +JoinResourceTypeEventConfiguration +JoinSource +JoinStorageSessionInput +JoinToken +JoinType +JoinedMethod +JoinedTimestamp +JournalKinesisStreamDescription +JournalS3ExportDescription +JournalS3Exports +JourneyActivityId +JourneyChannelSettings +JourneyCustomMessage +JourneyDateRangeKpiResponse +JourneyEmailMessage +JourneyExecutionActivityMetricsResponse +JourneyExecutionMetricsResponse +JourneyId +JourneyLimits +JourneyPushMessage +JourneyResponse +JourneyRunExecutionActivityMetricsResponse +JourneyRunExecutionMetricsResponse +JourneyRunResponse +JourneyRunsResponse +JourneySMSMessage +JourneySchedule +JourneyStateRequest +JourneyTimeframeCap +JourneysResponse +Json +JsonBody +JsonClassifier +JsonContentTypes +JsonFormatDescriptor +JsonFormatRef +JsonMatchPattern +JsonOptions +JsonPath +JsonTokenTypeConfiguration +JunctionPath +JupyterServerAppSettings +JwksUri +JwtConfiguration +JwtTokenTypeConfiguration +KBId +KGKeyPairIds +KMSAccessDeniedException +KMSAccessDeniedFault +KMSArn +KMSContext +KMSDisabledException +KMSDisabledFault +KMSEncrypted +KMSEncryptionConfig +KMSEncryptionContext +KMSFault +KMSInternalException +KMSInvalidKeyUsageException +KMSInvalidMacException +KMSInvalidSignatureException +KMSInvalidStateException +KMSInvalidStateFault +KMSKey +KMSKeyArn +KMSKeyDetails +KMSKeyID +KMSKeyId +KMSKeyNotAccessibleFault +KMSMasterKeyArn +KMSMasterKeyID +KMSMasterKeyId +KMSNotFoundException +KMSNotFoundFault +KMSOptInRequired +KMSRequestFailedException +KMSServerSideEncryption +KMSServerSideEncryptionIntegration +KMSServerSideEncryptionIntegrationConfig +KMSThrottlingException +KMSThrottlingFault +KPIActualValueConditionalFormatting +KPIComparisonValueConditionalFormatting +KPIConditionalFormatting +KPIConditionalFormattingOption +KPIConfiguration +KPIFieldWells +KPIOptions +KPIPrimaryValueConditionalFormatting +KPIProgressBarConditionalFormatting +KPISortConfiguration +KPISparklineOptions +KPIVisual +KPIVisualLayoutOptions +KPIVisualStandardLayout +KVSStreamStartSelector +KafkaAction +KafkaActionHeader +KafkaBrokerNodeId +KafkaCluster +KafkaClusterClientAuthentication +KafkaClusterClientAuthenticationDescription +KafkaClusterDescription +KafkaClusterEncryptionInTransit +KafkaClusterEncryptionInTransitDescription +KafkaSettings +KafkaStreamingSourceOptions +KafkaVersion +KafkaVersions +KantarLicenseId +KantarServerUrl +KantarWatermark +KantarWatermarkSettings +KbNumber +KdcAdminPassword +KeepAlivePeriodInSeconds +KeepJobFlowAliveWhenNoSteps +KeepSegments +KendraConfiguration +KerberosAttributes +KerberosKeytab +KerberosKrb5Conf +KerberosPrincipal +Kernel +KernelCapabilities +KernelGatewayAppSettings +KernelGatewayImageConfig +KernelId +KernelSpec +KernelSpecs +Key +KeyARN +KeyAgreement +KeyAlgorithm +KeyArn +KeyAttributes +KeyBlockFormat +KeyCertSign +KeyCertificate +KeyCertificateChain +KeyCheckValue +KeyCheckValueAlgorithm +KeyClass +KeyConditionExpression +KeyConditions +KeyCount +KeyDetection +KeyEncipherment +KeyEncryptionAlgorithm +KeyFingerprint +KeyFormat +KeyFormatVersions +KeyGroup +KeyGroupAlreadyExists +KeyGroupConfig +KeyGroupId +KeyGroupList +KeyGroupSummary +KeyId +KeyIdentifier +KeyLabels +KeyLength +KeyListEntry +KeyLocation +KeyManagementServiceArn +KeyManager +KeyMarker +KeyMaterial +KeyMaterialType +KeyMd5 +KeyMetadata +KeyModesOfUse +KeyName +KeyNames +KeyOrigin +KeyPair +KeyPairId +KeyPairIds +KeyPairInfo +KeyPairMismatchException +KeyPairSpec +KeyPairs +KeyPath +KeyPattern +KeyPhrase +KeyPhrases +KeyPhrasesDetectionJobFilter +KeyPhrasesDetectionJobProperties +KeyPhrasesDetectionJobPropertiesList +KeyPrefix +KeyPrefixEquals +KeyPrefixes +KeyProviderServer +KeyProviderSettings +KeyRange +KeyRotationEnabled +KeyRotationIntervalSeconds +KeyRotationStatus +KeySchema +KeySchemaElement +KeySerialNumber +KeySigningKey +KeySigningKeyAlreadyExists +KeySigningKeyInParentDSRecord +KeySigningKeyInUse +KeySigningKeyWithActiveStatusNotFound +KeySigningKeys +KeySpec +KeyState +KeyStatus +KeyStoragePolicy +KeyStorageSecurityStandard +KeyStorePassword +KeySummary +KeyTag +KeyType +KeyUnavailableException +KeyUsage +KeyUsageFlags +KeyUsageProperty +KeyUsagePropertyFlags +KeyUsages +KeyValue +KeyValuePair +KeyValuesPair +KeyframesMaxDist +Keys +KeysAndAttributes +KeysToDelete +KeysWithNoncompliantValues +KeyspaceSummary +Keyword +KeywordAction +KeywordFilter +KeywordInformation +KeywordMatchConfiguration +KeywordMessage +Keywords +KinesisAction +KinesisConfiguration +KinesisDataFirehose +KinesisDataStream +KinesisDataStreamDestination +KinesisDataStreamDestinations +KinesisDataStreamSinkConfiguration +KinesisFirehoseConfig +KinesisFirehoseDestination +KinesisFirehoseDestinationDetails +KinesisFirehoseDetails +KinesisFirehoseInput +KinesisFirehoseInputDescription +KinesisFirehoseInputUpdate +KinesisFirehoseOutput +KinesisFirehoseOutputDescription +KinesisFirehoseOutputUpdate +KinesisParameters +KinesisSettings +KinesisStreamARN +KinesisStreamConfig +KinesisStreamName +KinesisStreamParameters +KinesisStreamSourceConfiguration +KinesisStreamSourceDescription +KinesisStreamingDestinationInput +KinesisStreamingDestinationOutput +KinesisStreamingSourceOptions +KinesisStreamsInput +KinesisStreamsInputDescription +KinesisStreamsInputUpdate +KinesisStreamsOutput +KinesisStreamsOutputDescription +KinesisStreamsOutputUpdate +KinesisVideoStream +KinesisVideoStreamConfig +KinesisVideoStreamConfiguration +KinesisVideoStreamConfigurationUpdate +KinesisVideoStreamPoolConfiguration +KinesisVideoStreamPoolSummary +KinesisVideoStreamPools +KinesisVideoStreamRecordingSourceRuntimeConfiguration +KinesisVideoStreamSourceRuntimeConfiguration +KinesisVideoStreamSourceTaskConfiguration +KinesisVideoStreamStartSelector +Klv +KlvBehavior +KlvDataPids +KlvMetadata +KmsArn +KmsDataKeyReusePeriodSeconds +KmsEncryptionConfig +KmsEncryptionContext +KmsException +KmsGrantConfiguration +KmsGrantConstraints +KmsKey +KmsKeyARN +KmsKeyArn +KmsKeyConfiguration +KmsKeyDisabledException +KmsKeyId +KmsKeyIdentifier +KmsKeyIds +KmsKeyNotFoundException +KmsKeyProviderUri +KmsKeyRegion +KmsKeyToGrant +KmsKeyValidationException +KmsKeysToGrant +KmsMasterKeyArn +KmsMasterKeyId +KnowledgeArticleConfiguration +KnowledgeBaseAssociationData +KnowledgeBaseData +KnowledgeBaseSummary +KnownFraudsterRisk +KnownGender +KpiName +KpiResult +Kubernetes +KubernetesApiCallAction +KubernetesAuditLogsConfiguration +KubernetesAuditLogsConfigurationResult +KubernetesConfiguration +KubernetesConfigurationResult +KubernetesDataSourceFreeTrial +KubernetesDetails +KubernetesNetworkConfigRequest +KubernetesNetworkConfigResponse +KubernetesUserDetails +KubernetesVersion +KubernetesWorkloadDetails +KxCacheStorageConfiguration +KxChangesetListEntry +KxCluster +KxCommandLineArgument +KxDatabaseCacheConfiguration +KxDatabaseConfiguration +KxDatabaseListEntry +KxDeploymentConfiguration +KxEnvironment +KxNode +KxSavedownStorageConfiguration +KxUser +L6Metadata +L6Mode +LBCookieStickinessPolicies +LBCookieStickinessPolicy +LDAPSSettingInfo +LDAPSSettingsInfo +LDAPSStatus +LDAPSStatusReason +LE +LFResourceDetails +LFTag +LFTagError +LFTagKeyResource +LFTagOnDatabase +LFTagPair +LFTagPolicy +LFTagPolicyDetails +LFTagPolicyResource +LFTags +LFTagsOnColumns +LFTagsOnTable +LT +Label +LabelAlias +LabelAttribute +LabelAttributeName +LabelCategory +LabelCategoryConfigS3Uri +LabelCategoryExclusionFilters +LabelCategoryInclusionFilters +LabelColor +LabelConfiguration +LabelContent +LabelCount +LabelCounters +LabelCountersForWorkteam +LabelDelimiter +LabelDetection +LabelDetectionSettings +LabelExclusionFilters +LabelFontConfiguration +LabelGroupArn +LabelGroupName +LabelGroupNameBeginsWith +LabelGroupSummaries +LabelGroupSummary +LabelHeaders +LabelId +LabelInclusionFilters +LabelIndex +LabelMatchStatement +LabelModelVersion +LabelName +LabelNameCondition +LabelNamespace +LabelOptions +LabelParameterVersionRequest +LabelParameterVersionResult +LabelSchema +LabelStats +LabelSummaries +LabelSummary +LabelTemplate +LabelVisibility +Labeled +LabeledEntries +LabelingJobAlgorithmSpecificationArn +LabelingJobAlgorithmsConfig +LabelingJobArn +LabelingJobDataAttributes +LabelingJobDataSource +LabelingJobForWorkteamSummary +LabelingJobInputConfig +LabelingJobName +LabelingJobOutput +LabelingJobOutputConfig +LabelingJobResourceConfig +LabelingJobS3DataSource +LabelingJobSnsDataSource +LabelingJobStatus +LabelingJobStoppingConditions +LabelingJobSummary +LabelingJobSummaryList +LabelingSetGenerationTaskRunProperties +Labels +LabelsInputConfiguration +LabelsS3InputConfiguration +Lac +Lag +Lags +LakeFormationConfiguration +LakeFormationDataPermissionAsset +LakeFormationDataPermissionDetails +LakeFormationDataPermissionType +LakeFormationOptInsInfo +LakeFormationOptInsInfoList +Lambda +LambdaAction +LambdaActivity +LambdaArn +LambdaAuthorizerConfig +LambdaAvailabilityProvider +LambdaCodeHook +LambdaConfig +LambdaConfigType +LambdaConfiguration +LambdaConflictHandlerConfig +LambdaConnectorProvisioningConfig +LambdaContainerParams +LambdaDataSourceConfig +LambdaDetails +LambdaDeviceMount +LambdaEndpoint +LambdaEndpointConfig +LambdaEndpointInput +LambdaEndpointSummary +LambdaEventSource +LambdaExecutionParameters +LambdaExecutorConfiguration +LambdaFunction +LambdaFunctionARN +LambdaFunctionAggregation +LambdaFunctionAggregationResponse +LambdaFunctionArn +LambdaFunctionAssociation +LambdaFunctionAssociations +LambdaFunctionCompletedEventAttributes +LambdaFunctionConfiguration +LambdaFunctionConfigurations +LambdaFunctionFailedEventAttributes +LambdaFunctionFailedEventDetails +LambdaFunctionInfo +LambdaFunctionMemoryProjectedMetric +LambdaFunctionMemoryRecommendationOption +LambdaFunctionMetadata +LambdaFunctionName +LambdaFunctionParameters +LambdaFunctionRecipeSource +LambdaFunctionRecommendation +LambdaFunctionRecommendationFilter +LambdaFunctionScheduleFailedEventDetails +LambdaFunctionScheduledEventAttributes +LambdaFunctionScheduledEventDetails +LambdaFunctionSinkConfiguration +LambdaFunctionStartFailedEventDetails +LambdaFunctionStartedEventAttributes +LambdaFunctionSucceededEventDetails +LambdaFunctionTimedOutEventAttributes +LambdaFunctionTimedOutEventDetails +LambdaFunctionUtilizationMetric +LambdaFunctions +LambdaInvoke +LambdaInvokeOperation +LambdaLayerAggregation +LambdaLayerAggregationResponse +LambdaLinuxProcessParams +LambdaOutput +LambdaOutputDescription +LambdaOutputUpdate +LambdaProvider +LambdaResource +LambdaResources +LambdaStepMetadata +LambdaTarget +LambdaThrottledException +LambdaVersion +LambdaVolumeMount +LambdaVpcConfig +Landmark +Landmarks +LandsatCloudCoverLand +LandsatCloudCoverLandInput +Lang +Language +LanguageCode +LanguageCodeControl +LanguageCodeItem +LanguageCodes +LanguageDescription +LanguageIdSettings +LanguageIdentification +LanguageModel +LanguageModelName +LanguageName +LanguageNotSupportedException +LanguageOptions +LanguageSelectionPolicy +LanguageWithScore +Languages +LargeTimestampGaps +Last +LastAccessTime +LastAccessedAt +LastAccessedDate +LastAccessedEntity +LastAccessedRegion +LastAccessedTime +LastActivatedBy +LastActivatedTime +LastActiveAt +LastActiveDefinition +LastAddress +LastAllocation +LastAnalyzedTime +LastAssociationExecutionDate +LastAttemptDate +LastAttemptedDiscoveryTime +LastAttemptedExecutionTime +LastAuditTimestamp +LastAuthenticated +LastAuthenticatedEntity +LastAuthenticatedRegion +LastAuthenticatedTime +LastAuthorizedTime +LastAutoAdjustTime +LastBackupDate +LastBackupTime +LastBatchTransformJob +LastBusinessReport +LastChangedDate +LastCheckTimestamp +LastCheckedTimestamp +LastClaimTime +LastClearTime +LastCollectedTime +LastCommitId +LastConnectionTime +LastCrawl +LastCrawlInfo +LastDataReceived +LastDeactivatedTime +LastDebugLogDeliveryStatus +LastDebugLogDeliveryStatusReason +LastDebugLogDeliveryTime +LastDecreaseDateTime +LastDeliveryChannelDeleteFailedException +LastDeliveryEvent +LastDeploymentConfig +LastDeploymentInfo +LastDeploymentStatusMessage +LastDriftCheckTimestamp +LastEditedTimestamp +LastEngagementEvent +LastError +LastErrorCode +LastErrorMessage +LastEvaluatedBackupArn +LastEvaluatedDate +LastEvaluatedGlobalTableName +LastEvaluatedKey +LastEvaluatedShardId +LastEvaluatedStreamArn +LastEvaluatedTableName +LastEvaluatedTime +LastEvaluationState +LastEvaluationTime +LastExecutionDate +LastExecutionTime +LastFailedEvaluationTime +LastFailedInvocationTime +LastFailureMessage +LastFailureTime +LastFrameClippingBehavior +LastFreshStart +LastGeneratedReportDate +LastHealthCheckTime +LastHealthCheckTimestamp +LastIncreaseDateTime +LastIngestStateChange +LastInventoryDate +LastKeyGenerationTimestamp +LastKnownUserConnectionTimestamp +LastLaunchedTime +LastMaintenanceApplied +LastMessageTimestamp +LastModificationDate +LastModificationTime +LastModified +LastModifiedAfter +LastModifiedAt +LastModifiedBefore +LastModifiedBy +LastModifiedDate +LastModifiedDateCondition +LastModifiedDateTime +LastModifiedOn +LastModifiedTime +LastModifiedTimeAfter +LastModifiedTimeBefore +LastModifiedTimestamp +LastModifiedUser +LastMonitoringExecutionSummary +LastName +LastNoRebootInstallOperationTime +LastObservedAt +LastOperationId +LastPingDateTime +LastProcessingResult +LastProvisioningRecordId +LastPublishedTime +LastRecordId +LastRecorderStatus +LastRecurrenceTime +LastRefreshDate +LastReplicatedTimestamp +LastReportGenerationExecutionError +LastReportGenerationTime +LastReportedAt +LastRequestedDateTime +LastRestoreTime +LastRotatedDate +LastRuleModification +LastRun +LastRunDetails +LastRunErrorStatus +LastRunFailureReason +LastRunStatus +LastRunSummary +LastRunTime +LastRuntimeSeconds +LastSeen +LastSeenDateTime +LastSeenTime +LastServiceErrorId +LastSoftwareUpdate +LastStarted +LastStateChangeAt +LastStateChangeReason +LastStatus +LastStatusChange +LastStatusCheckDate +LastStatusMessage +LastStatusUpdateTime +LastStopped +LastSuccessfulAllocationTime +LastSuccessfulAssociationExecutionDate +LastSuccessfulDeliveryTime +LastSuccessfulDiscoveryTime +LastSuccessfulEvaluationTime +LastSuccessfulExecutionDate +LastSuccessfulExecutionTime +LastSuccessfulInvocationTime +LastSuccessfulMetadataSyncTime +LastSuccessfulProvisioningRecordId +LastSuccessfulSyncProvisioningArtifactId +LastSuccessfulSyncTime +LastSuccessfullyAppliedConfigurations +LastSuccessfullyAppliedConfigurationsVersion +LastSuggestionsBuildTime +LastSync +LastSyncCount +LastSyncStatus +LastSyncStatusMessage +LastSyncTime +LastTieringOperationStatus +LastTieringOperationStatusDetail +LastTieringProgress +LastTieringStartTime +LastUpdate +LastUpdateAssociationDate +LastUpdateCompletedTime +LastUpdateDate +LastUpdateDateTime +LastUpdateRequestedTime +LastUpdateStatus +LastUpdateStatusReason +LastUpdateStatusReasonCode +LastUpdateTime +LastUpdateTimestamp +LastUpdateToPayPerRequestDateTime +LastUpdated +LastUpdatedAt +LastUpdatedBy +LastUpdatedDate +LastUpdatedDateTime +LastUpdatedTime +LastUpdatedTimeStamp +LastUpdatedTimestamp +LastUplinkReceivedAt +LastUploaderStatus +LastUsedDate +LastUserActivityTimestamp +LastVPCAssociation +LastWritten +Lat +LatLonOptions +LateDataRule +LateDataRuleConfiguration +Latency +LatencyInMilliseconds +LatencyInMs +LatencyMs +LatencyOther +LatencyRead +LatencyWrite +Latest +LatestAlternateSoftware +LatestCloudWatchLogsDeliveryError +LatestCloudWatchLogsDeliveryTime +LatestDeliveryAttemptSucceeded +LatestDeliveryAttemptTime +LatestDeliveryError +LatestDeliveryTime +LatestDeviceJob +LatestDigestDeliveryError +LatestDigestDeliveryTime +LatestFlywheelIteration +LatestHeartbeat +LatestHeartbeatAfter +LatestInference +LatestInferenceResult +LatestIngestionAttemptEventID +LatestIngestionAttemptTime +LatestIngestionErrorCode +LatestIngestionSuccessEventID +LatestIngestionSuccessTime +LatestLensVersion +LatestMatchingVersion +LatestMetadataSyncStatus +LatestMetadataSyncStatusMessage +LatestNotificationAttemptSucceeded +LatestNotificationAttemptTime +LatestNotificationError +LatestNotificationTime +LatestOnly +LatestProfileVersion +LatestPublicVersion +LatestRestorableDateTime +LatestRestorableTime +LatestRevision +LatestSampleTime +LatestScheduledRetrainingAvailableDataInDays +LatestScheduledRetrainingFailedReason +LatestScheduledRetrainingModelVersion +LatestScheduledRetrainingStartTime +LatestScheduledRetrainingStatus +LatestSchemaVersion +LatestSoftware +LatestStreamArn +LatestStreamLabel +LatestTime +LatestUpdateAttemptAt +LatestUpdateAttemptAuxiliaryDataLocation +LatestUpdateAttemptStatus +LatestUsageTimestamp +LatestVersion +LatestVersionArn +LatestVersionCreatedAt +LatestVersionId +LatestVersionMetadata +LatestVersionName +LatestVersionNumber +LatestVersionSize +LatestVersionStatus +Latitude +Launch +LaunchAction +LaunchActionParameter +LaunchActionRun +LaunchActionsRequestFilters +LaunchActionsStatus +LaunchAppRequest +LaunchCommands +LaunchConfig +LaunchConfiguration +LaunchConfigurationARN +LaunchConfigurationName +LaunchConfigurationNameType +LaunchConfigurationNames +LaunchConfigurationNamesType +LaunchConfigurationTemplate +LaunchConfigurations +LaunchConfigurationsType +LaunchDate +LaunchDetails +LaunchExecution +LaunchGroup +LaunchGroupConfig +LaunchOverrides +LaunchParameters +LaunchPath +LaunchPathSummaries +LaunchPathSummary +LaunchPaths +LaunchPermission +LaunchPermissionConfiguration +LaunchPermissionModifications +LaunchPermissions +LaunchProfile +LaunchProfileInitialization +LaunchProfileInitializationActiveDirectory +LaunchProfileInitializationScript +LaunchProfileMembership +LaunchRoleArn +LaunchSpecification +LaunchSpecifications +LaunchTemplate +LaunchTemplateAndOverrides +LaunchTemplateAndOverridesResponse +LaunchTemplateBlockDeviceMapping +LaunchTemplateBlockDeviceMappingRequest +LaunchTemplateCapacityReservationSpecificationRequest +LaunchTemplateCapacityReservationSpecificationResponse +LaunchTemplateConfig +LaunchTemplateConfigs +LaunchTemplateConfiguration +LaunchTemplateCpuOptions +LaunchTemplateCpuOptionsRequest +LaunchTemplateData +LaunchTemplateDiskConf +LaunchTemplateEbsBlockDevice +LaunchTemplateEbsBlockDeviceRequest +LaunchTemplateElasticInferenceAccelerator +LaunchTemplateElasticInferenceAcceleratorResponse +LaunchTemplateEnclaveOptions +LaunchTemplateEnclaveOptionsRequest +LaunchTemplateHibernationOptions +LaunchTemplateHibernationOptionsRequest +LaunchTemplateIamInstanceProfileSpecification +LaunchTemplateIamInstanceProfileSpecificationRequest +LaunchTemplateId +LaunchTemplateIds +LaunchTemplateInstanceMaintenanceOptions +LaunchTemplateInstanceMaintenanceOptionsRequest +LaunchTemplateInstanceMarketOptions +LaunchTemplateInstanceMarketOptionsRequest +LaunchTemplateInstanceMetadataOptions +LaunchTemplateInstanceMetadataOptionsRequest +LaunchTemplateInstanceNetworkInterfaceSpecification +LaunchTemplateInstanceNetworkInterfaceSpecificationRequest +LaunchTemplateLicenseConfiguration +LaunchTemplateLicenseConfigurationRequest +LaunchTemplateName +LaunchTemplateNames +LaunchTemplateOverrides +LaunchTemplatePlacement +LaunchTemplatePlacementRequest +LaunchTemplatePrivateDnsNameOptions +LaunchTemplatePrivateDnsNameOptionsRequest +LaunchTemplateSpecification +LaunchTemplateSpotMarketOptions +LaunchTemplateSpotMarketOptionsRequest +LaunchTemplateTagSpecification +LaunchTemplateTagSpecificationRequest +LaunchTemplateVersion +LaunchTemplateVersions +LaunchTemplates +LaunchTemplatesMonitoring +LaunchTemplatesMonitoringRequest +LaunchTime +LaunchType +LaunchedAt +LaunchedAvailabilityZone +LaunchedInstance +Layer +LayerAlreadyExistsException +LayerArn +LayerFailure +LayerId +LayerIds +LayerInaccessibleException +LayerName +LayerPartTooSmallException +LayerVersionArn +LayerVersionContentInput +LayerVersionContentOutput +LayerVersions +LayerVersionsListItem +Layers +LayersCount +LayersListItem +LayersNotFoundException +Layout +LayoutConfiguration +LayoutSections +LayoutSummary +Layouts +LbCookieStickinessPolicies +LcmOperationInfo +LdPreloadValue +LdapServerMetadata +LdapServerMetadataInput +LdapServerMetadataOutput +LdifContent +LeaseExpirationTime +LeaseId +LedgerEncryptionDescription +LedgerName +LedgerSummary +Ledgers +Left +LeftJoinKeyProperties +LeftOffset +LeftOperand +Leg +LegGeometry +LegalHold +LegalHoldArn +LegalHoldId +LegalHolds +Legend +LegendOptions +Legs +LendingDetection +LendingDocument +LendingField +LendingFields +LendingResult +LendingSummary +Length +Lens +LensAlias +LensAliases +LensArn +LensJSON +LensMetric +LensName +LensNamePrefix +LensNotes +LensReview +LensReviewReport +LensReviewSummaries +LensReviewSummary +LensShareSummaries +LensShareSummary +LensStatus +LensSummaries +LensSummary +LensType +LensUpgradeSummary +LensVersion +Lenses +LensesAppliedCount +LessThan +LessThanOrEqual +LessThanOrEquals +Level +LevelFive +LevelFour +LevelId +LevelOne +LevelThree +LevelTwo +Lex +LexBot +LexBotAliasArn +LexBotConfig +LexBots +LexConfiguration +LexRegion +LexTranscriptFilter +LexV2Bot +LexVersion +LexemesCount +Lexicon +LexiconArn +LexiconAttributes +LexiconDescription +LexiconNames +LexiconNotFoundException +LexiconSizeExceededException +Lexicons +LfeControl +LfeFilter +LibraryPath +License +LicenseAcquisitionUrl +LicenseArn +LicenseArns +LicenseBody +LicenseConfiguration +LicenseConfigurationArn +LicenseConfigurationArns +LicenseConfigurationAssociation +LicenseConfigurationAssociations +LicenseConfigurationId +LicenseConfigurationRequest +LicenseConfigurationStatus +LicenseConfigurationUsage +LicenseConfigurationUsageList +LicenseConfigurations +LicenseConsumptionToken +LicenseConversionContext +LicenseConversionTask +LicenseConversionTaskId +LicenseConversionTasks +LicenseConversionTime +LicenseCount +LicenseCountHardLimit +LicenseCountingType +LicenseInfo +LicenseManagerReportGeneratorArn +LicenseManagerResourceShareArn +LicenseMetadata +LicenseModel +LicenseName +LicenseOperationFailure +LicenseOperationFailureList +LicenseRecommendation +LicenseRecommendationFilter +LicenseRecommendationOption +LicenseRules +LicenseServiceConfiguration +LicenseSet +LicenseSpecification +LicenseSpecifications +LicenseType +LicenseUrl +LicenseUsage +LicenseUsageException +Licenses +Licensing +LifeCycle +LifeCycleLastCutover +LifeCycleLastCutoverFinalized +LifeCycleLastCutoverInitiated +LifeCycleLastCutoverReverted +LifeCycleLastLaunch +LifeCycleLastLaunchInitiated +LifeCycleLastTest +LifeCycleLastTestFinalized +LifeCycleLastTestInitiated +LifeCycleLastTestReverted +LifeCycleState +LifeCycleStatus +LifeCycleStatusFilter +Lifecycle +LifecycleActionResult +LifecycleActionToken +LifecycleConfigArn +LifecycleConfigArns +LifecycleConfigName +LifecycleConfiguration +LifecycleConfigurationDescription +LifecycleEvent +LifecycleEventAlreadyCompletedException +LifecycleEventConfiguration +LifecycleExpiration +LifecycleHook +LifecycleHookLimitExceededException +LifecycleHookName +LifecycleHookNames +LifecycleHookSpecification +LifecycleHookSpecificationList +LifecycleHookTypes +LifecycleHooks +LifecyclePolicies +LifecyclePolicy +LifecyclePolicyNotFoundException +LifecyclePolicyPreviewFilter +LifecyclePolicyPreviewInProgressException +LifecyclePolicyPreviewNotFoundException +LifecyclePolicyPreviewResult +LifecyclePolicyPreviewSummary +LifecyclePolicyRuleAction +LifecyclePolicySummary +LifecyclePolicyText +LifecycleRule +LifecycleRuleAndOperator +LifecycleRuleFilter +LifecycleState +LifecycleTransition +LifecycleTransitionReason +LifetimeInSeconds +LightsailDistribution +Limit +LimitCode +LimitExceeded +LimitExceededException +LimitExceededFault +LimitName +LimitPrice +LimitType +LimitValue +LimitValues +Limitation +Limitations +Limits +LimitsByRole +LimitsExceeded +LimitsExceededException +Line +LineChartAggregatedFieldWells +LineChartConfiguration +LineChartDefaultSeriesSettings +LineChartFieldWells +LineChartLineStyleSettings +LineChartMarkerStyleSettings +LineChartSeriesSettings +LineChartSortConfiguration +LineChartVisual +LineDataLabels +LineInterpolation +LineItem +LineItemAssetInformation +LineItemCountsByStatus +LineItemExpenseFields +LineItemFields +LineItemFilter +LineItemFilters +LineItemGroup +LineItemGroupIndex +LineItemGroups +LineItemId +LineItemRequest +LineItems +LineNumber +LineRange +LineRanges +LineSeriesAxisDisplayOptions +LineString +LineStyle +LineStyleSettings +LineTime +LineValues +LineVisibility +LineWidth +Lineage +LineageConfiguration +LineageGroupArn +LineageGroupName +LineageGroupSummaries +LineageGroupSummary +LineageObject +LineageType +LineageTypes +Linear +LinearStepSize +Link +LinkArn +LinkAssociation +LinkAssociationState +LinkAssociations +LinkAttributeAction +LinkAttributeUpdate +LinkConfiguration +LinkId +LinkIds +LinkName +LinkNameAlreadyInUseException +LinkSharingConfiguration +LinkSpecifiers +LinkToDataSetColumn +LinkedAccount +LinkedAccountIds +LinkedAccountName +LinkedAccounts +LinkedService +Links +LinuxParameters +LinuxSubscriptionsDiscovery +LinuxSubscriptionsDiscoverySettings +List +ListAPIKeysRequest +ListAPIKeysResponse +ListAWSDefaultServiceQuotasRequest +ListAWSDefaultServiceQuotasResponse +ListAWSServiceAccessForOrganizationRequest +ListAWSServiceAccessForOrganizationResponse +ListAcceleratorsRequest +ListAcceleratorsResponse +ListAcceptedPortfolioSharesInput +ListAcceptedPortfolioSharesOutput +ListAccessControlConfigurationsRequest +ListAccessControlConfigurationsResponse +ListAccessControlRulesRequest +ListAccessControlRulesResponse +ListAccessKeysRequest +ListAccessKeysResponse +ListAccessLogSubscriptionsRequest +ListAccessLogSubscriptionsResponse +ListAccessPointsForObjectLambdaRequest +ListAccessPointsForObjectLambdaResult +ListAccessPointsRequest +ListAccessPointsResult +ListAccessPoliciesRequest +ListAccessPoliciesResponse +ListAccessPreviewFindingsRequest +ListAccessPreviewFindingsResponse +ListAccessPreviewsRequest +ListAccessPreviewsResponse +ListAccessTokensRequest +ListAccessTokensResponse +ListAccessesRequest +ListAccessesResponse +ListAccessorsInput +ListAccessorsOutput +ListAccountAliasesRequest +ListAccountAliasesResponse +ListAccountAssignmentCreationStatusRequest +ListAccountAssignmentCreationStatusResponse +ListAccountAssignmentDeletionStatusRequest +ListAccountAssignmentDeletionStatusResponse +ListAccountAssignmentsRequest +ListAccountAssignmentsResponse +ListAccountAssociationsFilter +ListAccountAssociationsInput +ListAccountAssociationsOutput +ListAccountIntegrationsRequest +ListAccountIntegrationsResponse +ListAccountPermissionsRequest +ListAccountPermissionsResponse +ListAccountRolesRequest +ListAccountRolesResponse +ListAccountSettingsRequest +ListAccountSettingsResponse +ListAccountsForParentRequest +ListAccountsForParentResponse +ListAccountsForProvisionedPermissionSetRequest +ListAccountsForProvisionedPermissionSetResponse +ListAccountsRequest +ListAccountsResponse +ListActionExecutionsInput +ListActionExecutionsOutput +ListActionTypesInput +ListActionTypesOutput +ListActionsRequest +ListActionsResponse +ListActivatedRulesInRuleGroupRequest +ListActivatedRulesInRuleGroupResponse +ListActiveViolationsRequest +ListActiveViolationsResponse +ListActivitiesInput +ListActivitiesOutput +ListActivityTypesInput +ListAddonsRequest +ListAddonsResponse +ListAdminAccountsForOrganizationRequest +ListAdminAccountsForOrganizationResponse +ListAdminsManagingAccountRequest +ListAdminsManagingAccountResponse +ListAgentStatusRequest +ListAgentStatusResponse +ListAgentsRequest +ListAgentsResponse +ListAggregateDiscoveredResourcesRequest +ListAggregateDiscoveredResourcesResponse +ListAggregatedUtterancesRequest +ListAggregatedUtterancesResponse +ListAgreementsRequest +ListAgreementsResponse +ListAlarmModelVersionsRequest +ListAlarmModelVersionsResponse +ListAlarmModelsRequest +ListAlarmModelsResponse +ListAlarmRecommendationsRequest +ListAlarmRecommendationsResponse +ListAlarmsRequest +ListAlarmsResponse +ListAlertsRequest +ListAlertsResponse +ListAlgorithmsInput +ListAlgorithmsOutput +ListAliasesInput +ListAliasesOutput +ListAliasesRequest +ListAliasesResponse +ListAllowListsRequest +ListAllowListsResponse +ListAllowedNodeTypeModificationsMessage +ListAllowedNodeTypeUpdatesRequest +ListAllowedNodeTypeUpdatesResponse +ListAnalysesRequest +ListAnalysesResponse +ListAnalysisTemplatesInput +ListAnalysisTemplatesOutput +ListAnalyzedResourcesRequest +ListAnalyzedResourcesResponse +ListAnalyzersRequest +ListAnalyzersResponse +ListAnnotationImportJobsFilter +ListAnnotationImportJobsRequest +ListAnnotationImportJobsResponse +ListAnnotationStoreVersionsFilter +ListAnnotationStoreVersionsRequest +ListAnnotationStoreVersionsResponse +ListAnnotationStoresFilter +ListAnnotationStoresRequest +ListAnnotationStoresResponse +ListAnomaliesForInsightFilters +ListAnomaliesForInsightRequest +ListAnomaliesForInsightResponse +ListAnomalousLogGroupsRequest +ListAnomalousLogGroupsResponse +ListAnomalyDetectorsRequest +ListAnomalyDetectorsResponse +ListAnomalyGroupRelatedMetricsRequest +ListAnomalyGroupRelatedMetricsResponse +ListAnomalyGroupSummariesRequest +ListAnomalyGroupSummariesResponse +ListAnomalyGroupTimeSeriesRequest +ListAnomalyGroupTimeSeriesResponse +ListAnswersInput +ListAnswersOutput +ListApiDestinationsRequest +ListApiDestinationsResponse +ListApiKeysRequest +ListApiKeysResponse +ListAppAssessmentComplianceDriftsRequest +ListAppAssessmentComplianceDriftsResponse +ListAppAssessmentsRequest +ListAppAssessmentsResponse +ListAppAuthorizationsRequest +ListAppAuthorizationsResponse +ListAppBundlesRequest +ListAppBundlesResponse +ListAppComponentCompliancesRequest +ListAppComponentCompliancesResponse +ListAppComponentRecommendationsRequest +ListAppComponentRecommendationsResponse +ListAppImageConfigsRequest +ListAppImageConfigsResponse +ListAppInputSourcesRequest +ListAppInputSourcesResponse +ListAppInstanceAdminsRequest +ListAppInstanceAdminsResponse +ListAppInstanceBotsRequest +ListAppInstanceBotsResponse +ListAppInstanceUserEndpointsRequest +ListAppInstanceUserEndpointsResponse +ListAppInstanceUsersRequest +ListAppInstanceUsersResponse +ListAppInstancesRequest +ListAppInstancesResponse +ListAppMonitorsRequest +ListAppMonitorsResponse +ListAppVersionAppComponentsRequest +ListAppVersionAppComponentsResponse +ListAppVersionResourceMappingsRequest +ListAppVersionResourceMappingsResponse +ListAppVersionResourcesRequest +ListAppVersionResourcesResponse +ListAppVersionsRequest +ListAppVersionsResponse +ListApplicationComponentsRequest +ListApplicationComponentsResponse +ListApplicationDPUSizesInput +ListApplicationDPUSizesOutput +ListApplicationDependenciesRequest +ListApplicationDependenciesResponse +ListApplicationInstanceDependenciesRequest +ListApplicationInstanceDependenciesResponse +ListApplicationInstanceNodeInstancesRequest +ListApplicationInstanceNodeInstancesResponse +ListApplicationInstancesRequest +ListApplicationInstancesResponse +ListApplicationRevisionsInput +ListApplicationRevisionsOutput +ListApplicationSnapshotsRequest +ListApplicationSnapshotsResponse +ListApplicationStatesRequest +ListApplicationStatesResult +ListApplicationVersionsRequest +ListApplicationVersionsResponse +ListApplicationsInput +ListApplicationsOutput +ListApplicationsRequest +ListApplicationsRequestFilters +ListApplicationsResponse +ListAppliedSchemaArnsRequest +ListAppliedSchemaArnsResponse +ListApprovalRuleTemplatesInput +ListApprovalRuleTemplatesOutput +ListApprovedOriginsRequest +ListApprovedOriginsResponse +ListAppsInput +ListAppsListsRequest +ListAppsListsResponse +ListAppsOutput +ListAppsRequest +ListAppsResponse +ListAppsResult +ListArchiveRulesRequest +ListArchiveRulesResponse +ListArchivesRequest +ListArchivesResponse +ListArn +ListArtifactsRequest +ListArtifactsResponse +ListArtifactsResult +ListAssessmentControlInsightsByControlDomainRequest +ListAssessmentControlInsightsByControlDomainResponse +ListAssessmentFrameworkShareRequestsRequest +ListAssessmentFrameworkShareRequestsResponse +ListAssessmentFrameworksRequest +ListAssessmentFrameworksResponse +ListAssessmentReportsRequest +ListAssessmentReportsResponse +ListAssessmentRunAgentsRequest +ListAssessmentRunAgentsResponse +ListAssessmentRunsRequest +ListAssessmentRunsResponse +ListAssessmentTargetsRequest +ListAssessmentTargetsResponse +ListAssessmentTemplatesRequest +ListAssessmentTemplatesResponse +ListAssessmentsRequest +ListAssessmentsResponse +ListAssetBundleExportJobsRequest +ListAssetBundleExportJobsResponse +ListAssetBundleImportJobsRequest +ListAssetBundleImportJobsResponse +ListAssetModelPropertiesRequest +ListAssetModelPropertiesResponse +ListAssetModelsRequest +ListAssetModelsResponse +ListAssetPropertiesRequest +ListAssetPropertiesResponse +ListAssetRelationshipsRequest +ListAssetRelationshipsResponse +ListAssetsInput +ListAssetsOutput +ListAssetsRequest +ListAssetsResponse +ListAssignmentsForHITRequest +ListAssignmentsForHITResponse +ListAssistantAssociationsRequest +ListAssistantAssociationsResponse +ListAssistantsRequest +ListAssistantsResponse +ListAssociatedApprovalRuleTemplatesForRepositoryInput +ListAssociatedApprovalRuleTemplatesForRepositoryOutput +ListAssociatedAssetsRequest +ListAssociatedAssetsResponse +ListAssociatedAttributeGroupsRequest +ListAssociatedAttributeGroupsResponse +ListAssociatedFleetsRequest +ListAssociatedFleetsResult +ListAssociatedGroupsRequest +ListAssociatedGroupsResponse +ListAssociatedResourcesRequest +ListAssociatedResourcesResponse +ListAssociatedRoute53HealthChecksRequest +ListAssociatedRoute53HealthChecksResponse +ListAssociatedStacksRequest +ListAssociatedStacksResult +ListAssociationVersionsRequest +ListAssociationVersionsResult +ListAssociationsForLicenseConfigurationRequest +ListAssociationsForLicenseConfigurationResponse +ListAssociationsRequest +ListAssociationsResponse +ListAssociationsResult +ListAttachedGroupPoliciesRequest +ListAttachedGroupPoliciesResponse +ListAttachedIndices +ListAttachedIndicesRequest +ListAttachedIndicesResponse +ListAttachedLinksInput +ListAttachedLinksItem +ListAttachedLinksOutput +ListAttachedPoliciesRequest +ListAttachedPoliciesResponse +ListAttachedRolePoliciesRequest +ListAttachedRolePoliciesResponse +ListAttachedUserPoliciesRequest +ListAttachedUserPoliciesResponse +ListAttachmentsRequest +ListAttachmentsResponse +ListAttacksRequest +ListAttacksResponse +ListAttendeeTagsRequest +ListAttendeeTagsResponse +ListAttendeesRequest +ListAttendeesResponse +ListAttributeGroupsForApplicationRequest +ListAttributeGroupsForApplicationResponse +ListAttributeGroupsRequest +ListAttributeGroupsResponse +ListAttributesRequest +ListAttributesResponse +ListAuditFindingsRequest +ListAuditFindingsResponse +ListAuditMitigationActionsExecutionsRequest +ListAuditMitigationActionsExecutionsResponse +ListAuditMitigationActionsTasksRequest +ListAuditMitigationActionsTasksResponse +ListAuditSuppressionsRequest +ListAuditSuppressionsResponse +ListAuditTasksRequest +ListAuditTasksResponse +ListAuthorizersRequest +ListAuthorizersResponse +ListAutoMLJobsRequest +ListAutoMLJobsResponse +ListAutoScalingConfigurationsRequest +ListAutoScalingConfigurationsResponse +ListAutomaticTapeCreationPoliciesInput +ListAutomaticTapeCreationPoliciesOutput +ListAutomationRulesRequest +ListAutomationRulesResponse +ListAvailabilityConfigurationsRequest +ListAvailabilityConfigurationsResponse +ListAvailableManagedRuleGroupVersionsRequest +ListAvailableManagedRuleGroupVersionsResponse +ListAvailableManagedRuleGroupsRequest +ListAvailableManagedRuleGroupsResponse +ListAvailableManagementCidrRangesRequest +ListAvailableManagementCidrRangesResult +ListAvailableResourceDimensionsRequest +ListAvailableResourceDimensionsResponse +ListAvailableResourceMetricsRequest +ListAvailableResourceMetricsResponse +ListAvailableSolutionStacksResultMessage +ListAvailableVoiceConnectorRegionsResponse +ListAvailableZonesResponse +ListBackendEnvironmentsRequest +ListBackendEnvironmentsResult +ListBackendJobsRequest +ListBackendJobsResponse +ListBackupJobsInput +ListBackupJobsOutput +ListBackupPlanTemplatesInput +ListBackupPlanTemplatesOutput +ListBackupPlanVersionsInput +ListBackupPlanVersionsOutput +ListBackupPlansInput +ListBackupPlansOutput +ListBackupSelectionsInput +ListBackupSelectionsOutput +ListBackupVaultsInput +ListBackupVaultsOutput +ListBackupsInput +ListBackupsOutput +ListBatchInferenceJobsRequest +ListBatchInferenceJobsResponse +ListBatchJobDefinitionsRequest +ListBatchJobDefinitionsResponse +ListBatchJobExecutionsRequest +ListBatchJobExecutionsResponse +ListBatchLoadTasksRequest +ListBatchLoadTasksResponse +ListBatchSegmentJobsRequest +ListBatchSegmentJobsResponse +ListBillingGroupAccountGrouping +ListBillingGroupCostReportsFilter +ListBillingGroupCostReportsInput +ListBillingGroupCostReportsOutput +ListBillingGroupsFilter +ListBillingGroupsInput +ListBillingGroupsOutput +ListBillingGroupsRequest +ListBillingGroupsResponse +ListBlueprintsRequest +ListBlueprintsResponse +ListBonusPaymentsRequest +ListBonusPaymentsResponse +ListBootstrapActionsInput +ListBootstrapActionsOutput +ListBotAliasesRequest +ListBotAliasesResponse +ListBotLocalesRequest +ListBotLocalesResponse +ListBotRecommendationsRequest +ListBotRecommendationsResponse +ListBotVersionsRequest +ListBotVersionsResponse +ListBotsRequest +ListBotsResponse +ListBranchesInput +ListBranchesOutput +ListBranchesRequest +ListBranchesResult +ListBridgesRequest +ListBridgesResponse +ListBrokersRequest +ListBrokersResponse +ListBrowserSettingsRequest +ListBrowserSettingsResponse +ListBucketAnalyticsConfigurationsOutput +ListBucketAnalyticsConfigurationsRequest +ListBucketIntelligentTieringConfigurationsOutput +ListBucketIntelligentTieringConfigurationsRequest +ListBucketInventoryConfigurationsOutput +ListBucketInventoryConfigurationsRequest +ListBucketMetricsConfigurationsOutput +ListBucketMetricsConfigurationsRequest +ListBucketsOutput +ListBudgetsForResourceInput +ListBudgetsForResourceOutput +ListBuildBatchesForProjectInput +ListBuildBatchesForProjectOutput +ListBuildBatchesInput +ListBuildBatchesOutput +ListBuildsForProjectInput +ListBuildsForProjectOutput +ListBuildsInput +ListBuildsOutput +ListBuiltInIntentsRequest +ListBuiltInIntentsResponse +ListBuiltInSlotTypesRequest +ListBuiltInSlotTypesResponse +ListBulkDeploymentDetailedReportsRequest +ListBulkDeploymentDetailedReportsResponse +ListBulkDeploymentsRequest +ListBulkDeploymentsResponse +ListBulkImportJobsRequest +ListBulkImportJobsResponse +ListBundlesRequest +ListBundlesResult +ListBusinessReportSchedulesRequest +ListBusinessReportSchedulesResponse +ListBy +ListByoipCidrsRequest +ListByoipCidrsResponse +ListByteMatchSetsRequest +ListByteMatchSetsResponse +ListCACertificatesRequest +ListCACertificatesResponse +ListCachePoliciesRequest +ListCachePoliciesResult +ListCalculatedAttributeDefinitionItem +ListCalculatedAttributeDefinitionsRequest +ListCalculatedAttributeDefinitionsResponse +ListCalculatedAttributeForProfileItem +ListCalculatedAttributesForProfileRequest +ListCalculatedAttributesForProfileResponse +ListCalculationExecutionsRequest +ListCalculationExecutionsResponse +ListCallAnalyticsCategoriesRequest +ListCallAnalyticsCategoriesResponse +ListCallAnalyticsJobsRequest +ListCallAnalyticsJobsResponse +ListCampaignsRequest +ListCampaignsResponse +ListCandidatesForAutoMLJobRequest +ListCandidatesForAutoMLJobResponse +ListCapacityReservationsInput +ListCapacityReservationsOutput +ListCasesForContactRequest +ListCasesForContactResponse +ListCatalogItemsInput +ListCatalogItemsOutput +ListCellsRequest +ListCellsResponse +ListCertificateAuthoritiesRequest +ListCertificateAuthoritiesResponse +ListCertificatesByCARequest +ListCertificatesByCAResponse +ListCertificatesRequest +ListCertificatesResponse +ListCertificatesResult +ListChangeSetsInput +ListChangeSetsOutput +ListChangeSetsRequest +ListChangeSetsResponse +ListChangedBlocksRequest +ListChangedBlocksResponse +ListChangesetsRequest +ListChangesetsResponse +ListChannelBansRequest +ListChannelBansResponse +ListChannelFlowsRequest +ListChannelFlowsResponse +ListChannelGroupsRequest +ListChannelGroupsResponse +ListChannelMembershipsForAppInstanceUserRequest +ListChannelMembershipsForAppInstanceUserResponse +ListChannelMembershipsRequest +ListChannelMembershipsResponse +ListChannelMessagesRequest +ListChannelMessagesResponse +ListChannelModeratorsRequest +ListChannelModeratorsResponse +ListChannelsAssociatedWithChannelFlowRequest +ListChannelsAssociatedWithChannelFlowResponse +ListChannelsModeratedByAppInstanceUserRequest +ListChannelsModeratedByAppInstanceUserResponse +ListChannelsRequest +ListChannelsResponse +ListCheckDetailsInput +ListCheckDetailsOutput +ListCheckSummariesInput +ListCheckSummariesOutput +ListChildrenRequest +ListChildrenResponse +ListChunksInput +ListChunksOutput +ListCidrBlocksRequest +ListCidrBlocksResponse +ListCidrCollectionsRequest +ListCidrCollectionsResponse +ListCidrLocationsRequest +ListCidrLocationsResponse +ListClassificationJobsRequest +ListClassificationJobsResponse +ListClassificationScopesRequest +ListClassificationScopesResponse +ListClientDevicesAssociatedWithCoreDeviceRequest +ListClientDevicesAssociatedWithCoreDeviceResponse +ListClientVpcConnectionsRequest +ListClientVpcConnectionsResponse +ListClosedWorkflowExecutionsInput +ListCloudFrontOriginAccessIdentitiesRequest +ListCloudFrontOriginAccessIdentitiesResult +ListClusterJobsRequest +ListClusterJobsResult +ListClusterOperationsRequest +ListClusterOperationsResponse +ListClusterOperationsV2Request +ListClusterOperationsV2Response +ListClusterSnapshotsInput +ListClusterSnapshotsOutput +ListClustersInput +ListClustersOutput +ListClustersRequest +ListClustersResponse +ListClustersResult +ListClustersV2Request +ListClustersV2Response +ListCodeRepositoriesInput +ListCodeRepositoriesOutput +ListCodeReviewsRequest +ListCodeReviewsResponse +ListCodeSigningConfigsRequest +ListCodeSigningConfigsResponse +ListCodegenJobsRequest +ListCodegenJobsResponse +ListCollaborationAnalysisTemplatesInput +ListCollaborationAnalysisTemplatesOutput +ListCollaborationsInput +ListCollaborationsOutput +ListCollectionsRequest +ListCollectionsResponse +ListCollectorsRequest +ListCollectorsResponse +ListCommandInvocationsRequest +ListCommandInvocationsResult +ListCommandsRequest +ListCommandsResult +ListCompatibleImagesRequest +ListCompatibleImagesResult +ListCompilationJobsRequest +ListCompilationJobsResponse +ListComplianceItemsRequest +ListComplianceItemsResult +ListComplianceStatusRequest +ListComplianceStatusResponse +ListComplianceSummariesRequest +ListComplianceSummariesResult +ListComponentBuildVersionsRequest +ListComponentBuildVersionsResponse +ListComponentOutputsInput +ListComponentOutputsOutput +ListComponentProvisionedResourcesInput +ListComponentProvisionedResourcesOutput +ListComponentTypesRequest +ListComponentTypesResponse +ListComponentVersionsRequest +ListComponentVersionsResponse +ListComponentsInput +ListComponentsOutput +ListComponentsRequest +ListComponentsResponse +ListComputeInput +ListComputeOutput +ListConferenceProvidersRequest +ListConferenceProvidersResponse +ListConfigsRequest +ListConfigsResponse +ListConfigurationHistoryRequest +ListConfigurationHistoryResponse +ListConfigurationProfilesRequest +ListConfigurationRevisionsRequest +ListConfigurationRevisionsResponse +ListConfigurationSetsRequest +ListConfigurationSetsResponse +ListConfigurationsRequest +ListConfigurationsResponse +ListConfiguredTableAssociationsInput +ListConfiguredTableAssociationsOutput +ListConfiguredTablesInput +ListConfiguredTablesOutput +ListConflictingAliasesRequest +ListConflictingAliasesResult +ListConformancePackComplianceScoresRequest +ListConformancePackComplianceScoresResponse +ListConnectPeersRequest +ListConnectPeersResponse +ListConnectionsInput +ListConnectionsOutput +ListConnectionsRequest +ListConnectionsResponse +ListConnectorDefinitionVersionsRequest +ListConnectorDefinitionVersionsResponse +ListConnectorDefinitionsRequest +ListConnectorDefinitionsResponse +ListConnectorEntitiesRequest +ListConnectorEntitiesResponse +ListConnectorsRequest +ListConnectorsResponse +ListConstraintsForPortfolioInput +ListConstraintsForPortfolioOutput +ListContactChannelsRequest +ListContactChannelsResult +ListContactEvaluationsRequest +ListContactEvaluationsResponse +ListContactFlowModulesRequest +ListContactFlowModulesResponse +ListContactFlowsRequest +ListContactFlowsResponse +ListContactListsRequest +ListContactListsResponse +ListContactReferencesRequest +ListContactReferencesResponse +ListContactsFilter +ListContactsRequest +ListContactsResponse +ListContactsResult +ListContainerInstancesRequest +ListContainerInstancesResponse +ListContainerRecipesRequest +ListContainerRecipesResponse +ListContainersInput +ListContainersOutput +ListContentsRequest +ListContentsResponse +ListContextsRequest +ListContextsResponse +ListContinuousDeploymentPoliciesRequest +ListContinuousDeploymentPoliciesResult +ListContributorInsightsInput +ListContributorInsightsOutput +ListControlDisplayOptions +ListControlDomainInsightsByAssessmentRequest +ListControlDomainInsightsByAssessmentResponse +ListControlDomainInsightsRequest +ListControlDomainInsightsResponse +ListControlInsightsByControlDomainRequest +ListControlInsightsByControlDomainResponse +ListControlPanelsRequest +ListControlPanelsResponse +ListControlSearchOptions +ListControlSelectAllOptions +ListControlsRequest +ListControlsResponse +ListCopyJobsInput +ListCopyJobsOutput +ListCoreDefinitionVersionsRequest +ListCoreDefinitionVersionsResponse +ListCoreDefinitionsRequest +ListCoreDefinitionsResponse +ListCoreDevicesRequest +ListCoreDevicesResponse +ListCoreNetworkPolicyVersionsRequest +ListCoreNetworkPolicyVersionsResponse +ListCoreNetworksRequest +ListCoreNetworksResponse +ListCostAllocationTagsRequest +ListCostAllocationTagsResponse +ListCostCategoryDefinitionsRequest +ListCostCategoryDefinitionsResponse +ListCoverageRequest +ListCoverageResponse +ListCoverageStatisticsRequest +ListCoverageStatisticsResponse +ListCrawlersRequest +ListCrawlersResponse +ListCrawlsRequest +ListCrawlsResponse +ListCreateAccountStatusRequest +ListCreateAccountStatusResponse +ListCreatedArtifactsRequest +ListCreatedArtifactsResult +ListCrlsResponse +ListCrossAccountAuthorizationsRequest +ListCrossAccountAuthorizationsResponse +ListCuratedEnvironmentImagesOutput +ListCustomDataIdentifiersRequest +ListCustomDataIdentifiersResponse +ListCustomEntityTypesRequest +ListCustomEntityTypesResponse +ListCustomLineItemChargeDetails +ListCustomLineItemFlatChargeDetails +ListCustomLineItemPercentageChargeDetails +ListCustomLineItemVersionsBillingPeriodRangeFilter +ListCustomLineItemVersionsFilter +ListCustomLineItemVersionsInput +ListCustomLineItemVersionsOutput +ListCustomLineItemsFilter +ListCustomLineItemsInput +ListCustomLineItemsOutput +ListCustomMetricsRequest +ListCustomMetricsResponse +ListCustomModelsRequest +ListCustomModelsResponse +ListCustomPluginsRequest +ListCustomPluginsResponse +ListCustomRoutingAcceleratorsRequest +ListCustomRoutingAcceleratorsResponse +ListCustomRoutingEndpointGroupsRequest +ListCustomRoutingEndpointGroupsResponse +ListCustomRoutingListenersRequest +ListCustomRoutingListenersResponse +ListCustomRoutingPortMappingsByDestinationRequest +ListCustomRoutingPortMappingsByDestinationResponse +ListCustomRoutingPortMappingsRequest +ListCustomRoutingPortMappingsResponse +ListCustomVerificationEmailTemplatesRequest +ListCustomVerificationEmailTemplatesResponse +ListCustomVocabularyItemsRequest +ListCustomVocabularyItemsResponse +ListCustomerManagedPolicyReferencesInPermissionSetRequest +ListCustomerManagedPolicyReferencesInPermissionSetResponse +ListDICOMImportJobsRequest +ListDICOMImportJobsResponse +ListDashboardVersionsRequest +ListDashboardVersionsResponse +ListDashboardsInput +ListDashboardsOutput +ListDashboardsRequest +ListDashboardsResponse +ListDataCatalogsInput +ListDataCatalogsOutput +ListDataCellsFilterRequest +ListDataCellsFilterResponse +ListDataIngestionJobsRequest +ListDataIngestionJobsResponse +ListDataIntegrationAssociationsRequest +ListDataIntegrationAssociationsResponse +ListDataIntegrationsRequest +ListDataIntegrationsResponse +ListDataLakeExceptionsRequest +ListDataLakeExceptionsResponse +ListDataLakesRequest +ListDataLakesResponse +ListDataQualityJobDefinitionsRequest +ListDataQualityJobDefinitionsResponse +ListDataQualityResultsRequest +ListDataQualityResultsResponse +ListDataQualityRuleRecommendationRunsRequest +ListDataQualityRuleRecommendationRunsResponse +ListDataQualityRulesetEvaluationRunsRequest +ListDataQualityRulesetEvaluationRunsResponse +ListDataQualityRulesetsRequest +ListDataQualityRulesetsResponse +ListDataSetImportHistoryRequest +ListDataSetImportHistoryResponse +ListDataSetRevisionsRequest +ListDataSetRevisionsResponse +ListDataSetsRequest +ListDataSetsResponse +ListDataSourceSyncJobsRequest +ListDataSourceSyncJobsResponse +ListDataSourcesRequest +ListDataSourcesResponse +ListDataViewsRequest +ListDataViewsResponse +ListDatabasesInput +ListDatabasesOutput +ListDatabasesRequest +ListDatabasesResponse +ListDataflowEndpointGroupsRequest +ListDataflowEndpointGroupsResponse +ListDatasetContentsRequest +ListDatasetContentsResponse +ListDatasetEntriesRequest +ListDatasetEntriesResponse +ListDatasetExportJobsRequest +ListDatasetExportJobsResponse +ListDatasetGroupsRequest +ListDatasetGroupsResponse +ListDatasetImportJobsRequest +ListDatasetImportJobsResponse +ListDatasetLabelsRequest +ListDatasetLabelsResponse +ListDatasetsRequest +ListDatasetsResponse +ListDatasourcePackagesRequest +ListDatasourcePackagesResponse +ListDatastoresRequest +ListDatastoresResponse +ListDeadLetterSourceQueuesRequest +ListDeadLetterSourceQueuesResult +ListDecoderManifestNetworkInterfacesRequest +ListDecoderManifestNetworkInterfacesResponse +ListDecoderManifestSignalsRequest +ListDecoderManifestSignalsResponse +ListDecoderManifestsRequest +ListDecoderManifestsResponse +ListDedicatedIpPoolsRequest +ListDedicatedIpPoolsResponse +ListDefaultVocabulariesRequest +ListDefaultVocabulariesResponse +ListDelegatedAdminAccountsRequest +ListDelegatedAdminAccountsResponse +ListDelegatedAdministratorsRequest +ListDelegatedAdministratorsResponse +ListDelegatedServicesForAccountRequest +ListDelegatedServicesForAccountResponse +ListDeliverabilityTestReportsRequest +ListDeliverabilityTestReportsResponse +ListDeliveryStreamsInput +ListDeliveryStreamsOutput +ListDeploymentConfigsInput +ListDeploymentConfigsOutput +ListDeploymentGroupsInput +ListDeploymentGroupsOutput +ListDeploymentInstancesInput +ListDeploymentInstancesOutput +ListDeploymentJobsRequest +ListDeploymentJobsResponse +ListDeploymentStrategiesRequest +ListDeploymentTargetsInput +ListDeploymentTargetsOutput +ListDeploymentsInput +ListDeploymentsOutput +ListDeploymentsRequest +ListDeploymentsResponse +ListDestinationsRequest +ListDestinationsResponse +ListDetectMitigationActionsExecutionsRequest +ListDetectMitigationActionsExecutionsResponse +ListDetectMitigationActionsTasksRequest +ListDetectMitigationActionsTasksResponse +ListDetectorModelVersionsRequest +ListDetectorModelVersionsResponse +ListDetectorModelsRequest +ListDetectorModelsResponse +ListDetectorsRequest +ListDetectorsResponse +ListDevEndpointsRequest +ListDevEndpointsResponse +ListDevEnvironmentSessionsRequest +ListDevEnvironmentSessionsResponse +ListDevEnvironmentsRequest +ListDevEnvironmentsResponse +ListDevelopmentSchemaArnsRequest +ListDevelopmentSchemaArnsResponse +ListDeviceDefinitionVersionsRequest +ListDeviceDefinitionVersionsResponse +ListDeviceDefinitionsRequest +ListDeviceDefinitionsResponse +ListDeviceEventsRequest +ListDeviceEventsResponse +ListDeviceFleetsRequest +ListDeviceFleetsResponse +ListDeviceIdentifiersRequest +ListDeviceIdentifiersResponse +ListDeviceInstancesRequest +ListDeviceInstancesResult +ListDevicePoolsRequest +ListDevicePoolsResult +ListDevicePositionsRequest +ListDevicePositionsResponse +ListDevicePositionsResponseEntry +ListDeviceProfilesRequest +ListDeviceProfilesResponse +ListDeviceResourcesInput +ListDeviceResourcesOutput +ListDevicesForWirelessDeviceImportTaskRequest +ListDevicesForWirelessDeviceImportTaskResponse +ListDevicesInput +ListDevicesJobsRequest +ListDevicesJobsResponse +ListDevicesOutput +ListDevicesRequest +ListDevicesResponse +ListDevicesResult +ListDimensionsRequest +ListDimensionsResponse +ListDirectoriesRequest +ListDirectoriesResponse +ListDirectoryRegistrationsRequest +ListDirectoryRegistrationsResponse +ListDiscoveredResourcesRequest +ListDiscoveredResourcesResponse +ListDiscoveredResourcesResult +ListDiscoverersRequest +ListDiscoverersResponse +ListDiscoveryJobsRequest +ListDiscoveryJobsResponse +ListDistributedGrantsRequest +ListDistributedGrantsResponse +ListDistributionConfigurationsRequest +ListDistributionConfigurationsResponse +ListDistributionsByCachePolicyIdRequest +ListDistributionsByCachePolicyIdResult +ListDistributionsByKeyGroupRequest +ListDistributionsByKeyGroupResult +ListDistributionsByOriginRequestPolicyIdRequest +ListDistributionsByOriginRequestPolicyIdResult +ListDistributionsByRealtimeLogConfigRequest +ListDistributionsByRealtimeLogConfigResult +ListDistributionsByResponseHeadersPolicyIdRequest +ListDistributionsByResponseHeadersPolicyIdResult +ListDistributionsByWebACLIdRequest +ListDistributionsByWebACLIdResult +ListDistributionsRequest +ListDistributionsResult +ListDocumentClassificationJobsRequest +ListDocumentClassificationJobsResponse +ListDocumentClassifierSummariesRequest +ListDocumentClassifierSummariesResponse +ListDocumentClassifiersRequest +ListDocumentClassifiersResponse +ListDocumentMetadataHistoryRequest +ListDocumentMetadataHistoryResponse +ListDocumentVersionsRequest +ListDocumentVersionsResult +ListDocumentsRequest +ListDocumentsResult +ListDomainAssociationsRequest +ListDomainAssociationsResult +ListDomainConfigurationsRequest +ListDomainConfigurationsResponse +ListDomainDeliverabilityCampaignsRequest +ListDomainDeliverabilityCampaignsResponse +ListDomainItem +ListDomainNamesRequest +ListDomainNamesResponse +ListDomainsForPackageRequest +ListDomainsForPackageResponse +ListDomainsInput +ListDomainsRequest +ListDomainsResponse +ListDomainsResult +ListDominantLanguageDetectionJobsRequest +ListDominantLanguageDetectionJobsResponse +ListEarthObservationJobInput +ListEarthObservationJobOutput +ListEarthObservationJobOutputConfig +ListEdgeAgentConfigurationsEdgeConfig +ListEdgeAgentConfigurationsInput +ListEdgeAgentConfigurationsOutput +ListEdgeDeploymentPlansRequest +ListEdgeDeploymentPlansResponse +ListEdgePackagingJobsRequest +ListEdgePackagingJobsResponse +ListEffectiveDeploymentsRequest +ListEffectiveDeploymentsResponse +ListElasticsearchInstanceTypesRequest +ListElasticsearchInstanceTypesResponse +ListElasticsearchVersionsRequest +ListElasticsearchVersionsResponse +ListEmailIdentitiesRequest +ListEmailIdentitiesResponse +ListEmailTemplatesRequest +ListEmailTemplatesResponse +ListEnabledControlsInput +ListEnabledControlsOutput +ListEnabledProductsForImportRequest +ListEnabledProductsForImportResponse +ListEndpointAccessRequest +ListEndpointAccessResponse +ListEndpointConfigsInput +ListEndpointConfigsOutput +ListEndpointGroupsRequest +ListEndpointGroupsResponse +ListEndpointsByPlatformApplicationInput +ListEndpointsByPlatformApplicationResponse +ListEndpointsInput +ListEndpointsOutput +ListEndpointsRequest +ListEndpointsResponse +ListEndpointsResult +ListEngagementsRequest +ListEngagementsResult +ListEngineVersionsInput +ListEngineVersionsOutput +ListEngineVersionsRequest +ListEngineVersionsResponse +ListEntitiesDetectionJobsRequest +ListEntitiesDetectionJobsResponse +ListEntitiesDetectionV2JobsRequest +ListEntitiesDetectionV2JobsResponse +ListEntitiesForPolicyRequest +ListEntitiesForPolicyResponse +ListEntitiesRequest +ListEntitiesResponse +ListEntitledApplicationsRequest +ListEntitledApplicationsResult +ListEntitlementsRequest +ListEntitlementsResponse +ListEntityPersonasRequest +ListEntityPersonasResponse +ListEntityRecognizerSummariesRequest +ListEntityRecognizerSummariesResponse +ListEntityRecognizersRequest +ListEntityRecognizersResponse +ListEnvironmentAccountConnectionsInput +ListEnvironmentAccountConnectionsOutput +ListEnvironmentOutputsInput +ListEnvironmentOutputsOutput +ListEnvironmentProvisionedResourcesInput +ListEnvironmentProvisionedResourcesOutput +ListEnvironmentTemplateVersionsInput +ListEnvironmentTemplateVersionsOutput +ListEnvironmentTemplatesInput +ListEnvironmentTemplatesOutput +ListEnvironmentVpcsRequest +ListEnvironmentVpcsResponse +ListEnvironmentsInput +ListEnvironmentsOutput +ListEnvironmentsRequest +ListEnvironmentsResponse +ListEnvironmentsResult +ListEphemeridesRequest +ListEphemeridesResponse +ListEulaAcceptancesRequest +ListEulaAcceptancesResponse +ListEulasRequest +ListEulasResponse +ListEvaluationFormVersionsRequest +ListEvaluationFormVersionsResponse +ListEvaluationFormsRequest +ListEvaluationFormsResponse +ListEventActionsRequest +ListEventActionsResponse +ListEventBusesRequest +ListEventBusesResponse +ListEventConfigurationsRequest +ListEventConfigurationsResponse +ListEventDataStoresRequest +ListEventDataStoresResponse +ListEventIntegrationAssociationsRequest +ListEventIntegrationAssociationsResponse +ListEventIntegrationsRequest +ListEventIntegrationsResponse +ListEventLogsRequest +ListEventLogsResponse +ListEventPredictionsRequest +ListEventPredictionsResult +ListEventSourceMappingsRequest +ListEventSourceMappingsResponse +ListEventSourcesRequest +ListEventSourcesResponse +ListEventStreamsRequest +ListEventStreamsResponse +ListEventSubscriptionsRequest +ListEventSubscriptionsResponse +ListEventTrackersRequest +ListEventTrackersResponse +ListEventTypesFilter +ListEventTypesRequest +ListEventTypesResult +ListEventsDetectionJobsRequest +ListEventsDetectionJobsResponse +ListEventsFilters +ListEventsRequest +ListEventsResponse +ListExclusionsRequest +ListExclusionsResponse +ListExecutionsInput +ListExecutionsOutput +ListExecutionsRequest +ListExecutionsResponse +ListExecutorsRequest +ListExecutorsResponse +ListExperienceEntitiesRequest +ListExperienceEntitiesResponse +ListExperiencesRequest +ListExperiencesResponse +ListExperimentTemplatesRequest +ListExperimentTemplatesResponse +ListExperimentsRequest +ListExperimentsResponse +ListExplainabilitiesRequest +ListExplainabilitiesResponse +ListExplainabilityExportsRequest +ListExplainabilityExportsResponse +ListExportErrorsRequest +ListExportErrorsResponse +ListExportJobsRequest +ListExportJobsResponse +ListExportsInput +ListExportsOutput +ListExportsRequest +ListExportsRequestFilters +ListExportsResponse +ListExtensibleSourceServersRequest +ListExtensibleSourceServersResponse +ListExtensionAssociationsRequest +ListExtensionVersionsRequest +ListExtensionVersionsResult +ListExtensionsRequest +ListExtensionsResult +ListFHIRDatastoresRequest +ListFHIRDatastoresResponse +ListFHIRExportJobsRequest +ListFHIRExportJobsResponse +ListFHIRImportJobsRequest +ListFHIRImportJobsResponse +ListFacesRequest +ListFacesResponse +ListFacetAttributesRequest +ListFacetAttributesResponse +ListFacetNamesRequest +ListFacetNamesResponse +ListFailuresForLicenseConfigurationOperationsRequest +ListFailuresForLicenseConfigurationOperationsResponse +ListFaqsRequest +ListFaqsResponse +ListFargateProfilesRequest +ListFargateProfilesResponse +ListFeatureGroupsRequest +ListFeatureGroupsResponse +ListFeaturedResultsSetsRequest +ListFeaturedResultsSetsResponse +ListFeaturesRequest +ListFeaturesResponse +ListFieldLevelEncryptionConfigsRequest +ListFieldLevelEncryptionConfigsResult +ListFieldLevelEncryptionProfilesRequest +ListFieldLevelEncryptionProfilesResult +ListFieldOptionsRequest +ListFieldOptionsResponse +ListFieldsRequest +ListFieldsResponse +ListFileCommitHistoryRequest +ListFileCommitHistoryResponse +ListFileSharesInput +ListFileSharesOutput +ListFileSystemAssociationsInput +ListFileSystemAssociationsOutput +ListFiltersRequest +ListFiltersResponse +ListFindingAggregationsRequest +ListFindingAggregationsResponse +ListFindingAggregatorsRequest +ListFindingAggregatorsResponse +ListFindingsFiltersRequest +ListFindingsFiltersResponse +ListFindingsMetricsRequest +ListFindingsMetricsResponse +ListFindingsReportsRequest +ListFindingsReportsResponse +ListFindingsRequest +ListFindingsResponse +ListFirewallConfigsRequest +ListFirewallConfigsResponse +ListFirewallDomainListsRequest +ListFirewallDomainListsResponse +ListFirewallDomainsRequest +ListFirewallDomainsResponse +ListFirewallPoliciesRequest +ListFirewallPoliciesResponse +ListFirewallRuleGroupAssociationsRequest +ListFirewallRuleGroupAssociationsResponse +ListFirewallRuleGroupsRequest +ListFirewallRuleGroupsResponse +ListFirewallRulesRequest +ListFirewallRulesResponse +ListFirewallsRequest +ListFirewallsResponse +ListFleetMetricsRequest +ListFleetMetricsResponse +ListFleetsForVehicleRequest +ListFleetsForVehicleResponse +ListFleetsInput +ListFleetsOutput +ListFleetsRequest +ListFleetsResponse +ListFlowDefinitionsRequest +ListFlowDefinitionsResponse +ListFlowExecutionMessagesRequest +ListFlowExecutionMessagesResponse +ListFlowsRequest +ListFlowsResponse +ListFlywheelIterationHistoryRequest +ListFlywheelIterationHistoryResponse +ListFlywheelsRequest +ListFlywheelsResponse +ListFolderMembersRequest +ListFolderMembersResponse +ListFoldersRequest +ListFoldersResponse +ListForecastExportJobsRequest +ListForecastExportJobsResponse +ListForecastsRequest +ListForecastsResponse +ListFormsRequest +ListFormsResponse +ListFoundationModelsRequest +ListFoundationModelsResponse +ListFragmentsInput +ListFragmentsOutput +ListFrameworksInput +ListFrameworksOutput +ListFraudsterRegistrationJobsRequest +ListFraudsterRegistrationJobsResponse +ListFraudstersRequest +ListFraudstersResponse +ListFunctionDefinitionVersionsRequest +ListFunctionDefinitionVersionsResponse +ListFunctionDefinitionsRequest +ListFunctionDefinitionsResponse +ListFunctionEventInvokeConfigsRequest +ListFunctionEventInvokeConfigsResponse +ListFunctionUrlConfigsRequest +ListFunctionUrlConfigsResponse +ListFunctionsByCodeSigningConfigRequest +ListFunctionsByCodeSigningConfigResponse +ListFunctionsRequest +ListFunctionsResponse +ListFunctionsResult +ListFuotaTasksRequest +ListFuotaTasksResponse +ListGameServerGroupsInput +ListGameServerGroupsOutput +ListGameServersInput +ListGameServersOutput +ListGamesRequest +ListGamesResult +ListGatewayGroupsRequest +ListGatewayGroupsResponse +ListGatewayInstancesRequest +ListGatewayInstancesResponse +ListGatewayRoutesInput +ListGatewayRoutesOutput +ListGatewaysInput +ListGatewaysOutput +ListGatewaysRequest +ListGatewaysResponse +ListGeneratedCodeJobsRequest +ListGeneratedCodeJobsResult +ListGeoLocationsRequest +ListGeoLocationsResponse +ListGeoMatchSetsRequest +ListGeoMatchSetsResponse +ListGeofenceCollectionsRequest +ListGeofenceCollectionsResponse +ListGeofenceCollectionsResponseEntry +ListGeofenceResponseEntry +ListGeofencesRequest +ListGeofencesResponse +ListGitHubAccountTokenNamesInput +ListGitHubAccountTokenNamesOutput +ListGlobalTablesInput +ListGlobalTablesOutput +ListGrantsRequest +ListGrantsResponse +ListGraphqlApisRequest +ListGraphqlApisResponse +ListGraphsRequest +ListGraphsResponse +ListGremlinQueriesInput +ListGremlinQueriesOutput +ListGroundStationsRequest +ListGroundStationsResponse +ListGroupCertificateAuthoritiesRequest +ListGroupCertificateAuthoritiesResponse +ListGroupMembersRequest +ListGroupMembersResponse +ListGroupMembershipsForMemberRequest +ListGroupMembershipsForMemberResponse +ListGroupMembershipsRequest +ListGroupMembershipsResponse +ListGroupPoliciesRequest +ListGroupPoliciesResponse +ListGroupResourcesInput +ListGroupResourcesItem +ListGroupResourcesOutput +ListGroupResourcesRequest +ListGroupResourcesResponse +ListGroupVersionsRequest +ListGroupVersionsResponse +ListGroupsFilters +ListGroupsForEntityFilters +ListGroupsForEntityRequest +ListGroupsForEntityResponse +ListGroupsForUserRequest +ListGroupsForUserResponse +ListGroupsInput +ListGroupsOlderThanOrderingIdRequest +ListGroupsOlderThanOrderingIdResponse +ListGroupsOutput +ListGroupsRequest +ListGroupsResponse +ListHITsForQualificationTypeRequest +ListHITsForQualificationTypeResponse +ListHITsRequest +ListHITsResponse +ListHandshakesForAccountRequest +ListHandshakesForAccountResponse +ListHandshakesForOrganizationRequest +ListHandshakesForOrganizationResponse +ListHapgsRequest +ListHapgsResponse +ListHarvestJobsRequest +ListHarvestJobsResponse +ListHealthChecksRequest +ListHealthChecksResponse +ListHealthEventsInput +ListHealthEventsOutput +ListHlsManifestConfiguration +ListHostKeysRequest +ListHostKeysResponse +ListHostedConfigurationVersionsRequest +ListHostedZonesByNameRequest +ListHostedZonesByNameResponse +ListHostedZonesByVPCRequest +ListHostedZonesByVPCResponse +ListHostedZonesRequest +ListHostedZonesResponse +ListHostsInput +ListHostsOutput +ListHoursOfOperationsRequest +ListHoursOfOperationsResponse +ListHsmsRequest +ListHsmsResponse +ListHubContentVersionsRequest +ListHubContentVersionsResponse +ListHubContentsRequest +ListHubContentsResponse +ListHubsRequest +ListHubsResponse +ListHumanLoopsRequest +ListHumanLoopsResponse +ListHumanTaskUisRequest +ListHumanTaskUisResponse +ListHyperParameterTuningJobsRequest +ListHyperParameterTuningJobsResponse +ListHypervisorsInput +ListHypervisorsOutput +ListIAMPolicyAssignmentsForUserRequest +ListIAMPolicyAssignmentsForUserResponse +ListIAMPolicyAssignmentsRequest +ListIAMPolicyAssignmentsResponse +ListICD10CMInferenceJobsRequest +ListICD10CMInferenceJobsResponse +ListIPSetsRequest +ListIPSetsResponse +ListId +ListIdentitiesInput +ListIdentitiesRequest +ListIdentitiesResponse +ListIdentityPoliciesRequest +ListIdentityPoliciesResponse +ListIdentityPoolUsageRequest +ListIdentityPoolUsageResponse +ListIdentityPoolsInput +ListIdentityPoolsResponse +ListIdentityProviderConfigsRequest +ListIdentityProviderConfigsResponse +ListIdentityProvidersRequest +ListIdentityProvidersResponse +ListIdentityResolutionJobsRequest +ListIdentityResolutionJobsResponse +ListIdentitySourcesInput +ListIdentitySourcesOutput +ListImageBuildVersionsRequest +ListImageBuildVersionsResponse +ListImagePackagesRequest +ListImagePackagesResponse +ListImagePipelineImagesRequest +ListImagePipelineImagesResponse +ListImagePipelinesRequest +ListImagePipelinesResponse +ListImageRecipesRequest +ListImageRecipesResponse +ListImageScanFindingAggregationsRequest +ListImageScanFindingAggregationsResponse +ListImageScanFindingsRequest +ListImageScanFindingsResponse +ListImageSetVersionsRequest +ListImageSetVersionsResponse +ListImageVersionsRequest +ListImageVersionsResponse +ListImagesFilter +ListImagesInRecycleBinRequest +ListImagesInRecycleBinResult +ListImagesRequest +ListImagesResponse +ListImpersonationRolesRequest +ListImpersonationRolesResponse +ListImportErrorsRequest +ListImportErrorsResponse +ListImportFailuresRequest +ListImportFailuresResponse +ListImportFileTaskRequest +ListImportFileTaskResponse +ListImportJobsRequest +ListImportJobsResponse +ListImportsInput +ListImportsOutput +ListImportsRequest +ListImportsRequestFilters +ListImportsResponse +ListIncidentRecordsInput +ListIncidentRecordsOutput +ListIncomingTypedLinks +ListIncomingTypedLinksRequest +ListIncomingTypedLinksResponse +ListIndex +ListIndexRequest +ListIndexResponse +ListIndexesInput +ListIndexesOutput +ListIndicesRequest +ListIndicesResponse +ListInferenceEventsRequest +ListInferenceEventsResponse +ListInferenceExecutionsRequest +ListInferenceExecutionsResponse +ListInferenceExperimentsRequest +ListInferenceExperimentsResponse +ListInferenceRecommendationsJobStepsRequest +ListInferenceRecommendationsJobStepsResponse +ListInferenceRecommendationsJobsRequest +ListInferenceRecommendationsJobsResponse +ListInferenceSchedulersRequest +ListInferenceSchedulersResponse +ListInfrastructureConfigurationsRequest +ListInfrastructureConfigurationsResponse +ListIngestionDestinationsRequest +ListIngestionDestinationsResponse +ListIngestionsRequest +ListIngestionsResponse +ListInputDeviceTransfersRequest +ListInputDeviceTransfersResponse +ListInputDevicesRequest +ListInputDevicesResponse +ListInputRoutingsRequest +ListInputRoutingsResponse +ListInputSecurityGroupsRequest +ListInputSecurityGroupsResponse +ListInputsRequest +ListInputsResponse +ListInsightsAnyStatusFilter +ListInsightsClosedStatusFilter +ListInsightsOngoingStatusFilter +ListInsightsRequest +ListInsightsResponse +ListInsightsStatusFilter +ListInstalledComponentsRequest +ListInstalledComponentsResponse +ListInstanceAttributesRequest +ListInstanceAttributesResponse +ListInstanceFleetsInput +ListInstanceFleetsOutput +ListInstanceGroupsInput +ListInstanceGroupsOutput +ListInstanceProfileTagsRequest +ListInstanceProfileTagsResponse +ListInstanceProfilesForRoleRequest +ListInstanceProfilesForRoleResponse +ListInstanceProfilesRequest +ListInstanceProfilesResponse +ListInstanceProfilesResult +ListInstanceStorageConfigsRequest +ListInstanceStorageConfigsResponse +ListInstanceTypeDetailsRequest +ListInstanceTypeDetailsResponse +ListInstancesInput +ListInstancesOutput +ListInstancesRequest +ListInstancesResponse +ListIntegrationAssociationsRequest +ListIntegrationAssociationsResponse +ListIntegrationItem +ListIntegrationsRequest +ListIntegrationsResponse +ListIntentMetricsRequest +ListIntentMetricsResponse +ListIntentPathsRequest +ListIntentPathsResponse +ListIntentStageMetricsRequest +ListIntentStageMetricsResponse +ListIntentsRequest +ListIntentsResponse +ListInvalidationsRequest +ListInvalidationsResult +ListInventoryEntriesRequest +ListInventoryEntriesResult +ListInvitationsInput +ListInvitationsOutput +ListInvitationsRequest +ListInvitationsResponse +ListIpAccessSettingsRequest +ListIpAccessSettingsResponse +ListIpRoutesRequest +ListIpRoutesResult +ListItemsRequest +ListItemsResponse +ListJobExecutionsForJobRequest +ListJobExecutionsForJobResponse +ListJobExecutionsForThingRequest +ListJobExecutionsForThingResponse +ListJobRunsRequest +ListJobRunsResponse +ListJobTemplatesRequest +ListJobTemplatesResponse +ListJobsByPipelineRequest +ListJobsByPipelineResponse +ListJobsByStatusRequest +ListJobsByStatusResponse +ListJobsFilterCriteria +ListJobsFilterTerm +ListJobsInput +ListJobsOutput +ListJobsRequest +ListJobsResponse +ListJobsResult +ListJobsSortCriteria +ListJournalKinesisStreamsForLedgerRequest +ListJournalKinesisStreamsForLedgerResponse +ListJournalS3ExportsForLedgerRequest +ListJournalS3ExportsForLedgerResponse +ListJournalS3ExportsRequest +ListJournalS3ExportsResponse +ListJourneysRequest +ListJourneysResponse +ListKafkaVersionsRequest +ListKafkaVersionsResponse +ListKeyGroupsRequest +ListKeyGroupsResult +ListKeyPhrasesDetectionJobsRequest +ListKeyPhrasesDetectionJobsResponse +ListKeyPoliciesRequest +ListKeyPoliciesResponse +ListKeysInput +ListKeysOutput +ListKeysRequest +ListKeysResponse +ListKeysResponseEntry +ListKeyspacesRequest +ListKeyspacesResponse +ListKeywordsForDataSourceRequest +ListKeywordsForDataSourceResponse +ListKnowledgeBasesRequest +ListKnowledgeBasesResponse +ListKxChangesetsRequest +ListKxChangesetsResponse +ListKxClusterNodesRequest +ListKxClusterNodesResponse +ListKxClustersRequest +ListKxClustersResponse +ListKxDatabasesRequest +ListKxDatabasesResponse +ListKxEnvironmentsRequest +ListKxEnvironmentsResponse +ListKxUsersRequest +ListKxUsersResponse +ListLFTagsRequest +ListLFTagsResponse +ListLabelGroupsRequest +ListLabelGroupsResponse +ListLabelingJobsForWorkteamRequest +ListLabelingJobsForWorkteamResponse +ListLabelingJobsRequest +ListLabelingJobsResponse +ListLabelsRequest +ListLabelsResponse +ListLakeFormationOptInsRequest +ListLakeFormationOptInsResponse +ListLambdaFunctionsRequest +ListLambdaFunctionsResponse +ListLanguageModelsRequest +ListLanguageModelsResponse +ListLanguagesRequest +ListLanguagesResponse +ListLaunchActionsRequest +ListLaunchActionsResponse +ListLaunchPathsInput +ListLaunchPathsOutput +ListLaunchProfileMembersRequest +ListLaunchProfileMembersResponse +ListLaunchProfilesRequest +ListLaunchProfilesResponse +ListLaunchesRequest +ListLaunchesResponse +ListLayerVersionsRequest +ListLayerVersionsResponse +ListLayersRequest +ListLayersResponse +ListLayoutsRequest +ListLayoutsResponse +ListLedgersRequest +ListLedgersResponse +ListLegalHoldsInput +ListLegalHoldsOutput +ListLensReviewImprovementsInput +ListLensReviewImprovementsOutput +ListLensReviewsInput +ListLensReviewsOutput +ListLensSharesInput +ListLensSharesOutput +ListLensesInput +ListLensesOutput +ListLexBotsRequest +ListLexBotsResponse +ListLexiconsInput +ListLexiconsOutput +ListLicenseConfigurationsRequest +ListLicenseConfigurationsResponse +ListLicenseConversionTasksRequest +ListLicenseConversionTasksResponse +ListLicenseManagerReportGeneratorsRequest +ListLicenseManagerReportGeneratorsResponse +ListLicenseSpecificationsForResourceRequest +ListLicenseSpecificationsForResourceResponse +ListLicenseVersionsRequest +ListLicenseVersionsResponse +ListLicensesRequest +ListLicensesResponse +ListLineageGroupsRequest +ListLineageGroupsResponse +ListLinksInput +ListLinksItem +ListLinksOutput +ListLinuxSubscriptionInstancesRequest +ListLinuxSubscriptionInstancesResponse +ListLinuxSubscriptionsRequest +ListLinuxSubscriptionsResponse +ListListenersRequest +ListListenersResponse +ListLiveSourcesRequest +ListLiveSourcesResponse +ListLoaderJobsInput +ListLoaderJobsOutput +ListLocalDisksInput +ListLocalDisksOutput +ListLocationsInput +ListLocationsOutput +ListLocationsRequest +ListLocationsResponse +ListLogPatternSetsRequest +ListLogPatternSetsResponse +ListLogPatternsRequest +ListLogPatternsResponse +ListLogSourcesRequest +ListLogSourcesResponse +ListLogSubscriptionsRequest +ListLogSubscriptionsResult +ListLoggerDefinitionVersionsRequest +ListLoggerDefinitionVersionsResponse +ListLoggerDefinitionsRequest +ListLoggerDefinitionsResponse +ListLoggingConfigurationsRequest +ListLoggingConfigurationsResponse +ListLongTermPricingRequest +ListLongTermPricingResult +ListLowLatencyHlsManifestConfiguration +ListLunaClientsRequest +ListLunaClientsResponse +ListMFADeviceTagsRequest +ListMFADeviceTagsResponse +ListMFADevicesRequest +ListMFADevicesResponse +ListMLDataProcessingJobsInput +ListMLDataProcessingJobsOutput +ListMLEndpointsInput +ListMLEndpointsOutput +ListMLModelTrainingJobsInput +ListMLModelTrainingJobsOutput +ListMLModelTransformJobsInput +ListMLModelTransformJobsOutput +ListMLTransformsRequest +ListMLTransformsResponse +ListMailDomainsRequest +ListMailDomainsResponse +ListMailboxExportJobsRequest +ListMailboxExportJobsResponse +ListMailboxPermissionsRequest +ListMailboxPermissionsResponse +ListManagedAccountsRequest +ListManagedAccountsResponse +ListManagedDataIdentifiersRequest +ListManagedDataIdentifiersResponse +ListManagedEndpointsRequest +ListManagedEndpointsResponse +ListManagedInsightRulesInput +ListManagedInsightRulesOutput +ListManagedJobTemplatesRequest +ListManagedJobTemplatesResponse +ListManagedPoliciesInPermissionSetRequest +ListManagedPoliciesInPermissionSetResponse +ListManagedResourcesRequest +ListManagedResourcesResponse +ListManagedRuleSetsRequest +ListManagedRuleSetsResponse +ListManagedSchemaArnsRequest +ListManagedSchemaArnsResponse +ListManagementOptions +ListMapRunsInput +ListMapRunsOutput +ListMapsRequest +ListMapsResponse +ListMapsResponseEntry +ListMatchingJobsInput +ListMatchingJobsOutput +ListMatchingWorkflowsInput +ListMatchingWorkflowsOutput +ListMediaCapturePipelinesRequest +ListMediaCapturePipelinesResponse +ListMediaInsightsPipelineConfigurationsRequest +ListMediaInsightsPipelineConfigurationsResponse +ListMediaPipelineKinesisVideoStreamPoolsRequest +ListMediaPipelineKinesisVideoStreamPoolsResponse +ListMediaPipelinesRequest +ListMediaPipelinesResponse +ListMedicalTranscriptionJobsRequest +ListMedicalTranscriptionJobsResponse +ListMedicalVocabulariesRequest +ListMedicalVocabulariesResponse +ListMeetingTagsRequest +ListMeetingTagsResponse +ListMeetingsRequest +ListMeetingsResponse +ListMemberAccountsRequest +ListMemberAccountsResponse +ListMemberAccountsResult +ListMembersInput +ListMembersOutput +ListMembersRequest +ListMembersResponse +ListMembershipsInput +ListMembershipsOutput +ListMeshesInput +ListMeshesOutput +ListMessageMoveTasksRequest +ListMessageMoveTasksResult +ListMessageMoveTasksResultEntry +ListMetricAttributionMetricsRequest +ListMetricAttributionMetricsResponse +ListMetricAttributionsRequest +ListMetricAttributionsResponse +ListMetricSetsRequest +ListMetricSetsResponse +ListMetricStreamsInput +ListMetricStreamsOutput +ListMetricValuesRequest +ListMetricValuesResponse +ListMetricsInput +ListMetricsOutput +ListMigrationTasksRequest +ListMigrationTasksResult +ListMigrationWorkflowTemplatesRequest +ListMigrationWorkflowTemplatesResponse +ListMigrationWorkflowsRequest +ListMigrationWorkflowsResponse +ListMilestonesInput +ListMilestonesOutput +ListMissionProfilesRequest +ListMissionProfilesResponse +ListMitigationActionsRequest +ListMitigationActionsResponse +ListMobileDeviceAccessOverridesRequest +ListMobileDeviceAccessOverridesResponse +ListMobileDeviceAccessRulesRequest +ListMobileDeviceAccessRulesResponse +ListMobileSdkReleasesRequest +ListMobileSdkReleasesResponse +ListModelBiasJobDefinitionsRequest +ListModelBiasJobDefinitionsResponse +ListModelCardExportJobsRequest +ListModelCardExportJobsResponse +ListModelCardVersionsRequest +ListModelCardVersionsResponse +ListModelCardsRequest +ListModelCardsResponse +ListModelCustomizationJobsRequest +ListModelCustomizationJobsResponse +ListModelExplainabilityJobDefinitionsRequest +ListModelExplainabilityJobDefinitionsResponse +ListModelManifestNodesRequest +ListModelManifestNodesResponse +ListModelManifestsRequest +ListModelManifestsResponse +ListModelMetadataRequest +ListModelMetadataResponse +ListModelPackageGroupsInput +ListModelPackageGroupsOutput +ListModelPackagesInput +ListModelPackagesOutput +ListModelPackagingJobsRequest +ListModelPackagingJobsResponse +ListModelQualityJobDefinitionsRequest +ListModelQualityJobDefinitionsResponse +ListModelVersionsRequest +ListModelVersionsResponse +ListModelsInput +ListModelsOutput +ListModelsRequest +ListModelsResponse +ListMonitorEvaluationsRequest +ListMonitorEvaluationsResponse +ListMonitoredResourcesFilters +ListMonitoredResourcesRequest +ListMonitoredResourcesResponse +ListMonitoringAlertHistoryRequest +ListMonitoringAlertHistoryResponse +ListMonitoringAlertsRequest +ListMonitoringAlertsResponse +ListMonitoringExecutionsRequest +ListMonitoringExecutionsResponse +ListMonitoringSchedulesRequest +ListMonitoringSchedulesResponse +ListMonitorsInput +ListMonitorsOutput +ListMonitorsRequest +ListMonitorsResponse +ListMultiRegionAccessPointsRequest +ListMultiRegionAccessPointsResult +ListMulticastGroupsByFuotaTaskRequest +ListMulticastGroupsByFuotaTaskResponse +ListMulticastGroupsRequest +ListMulticastGroupsResponse +ListMultipartReadSetUploadsRequest +ListMultipartReadSetUploadsResponse +ListMultipartUploadsInput +ListMultipartUploadsOutput +ListMultipartUploadsRequest +ListMultiplexProgramsRequest +ListMultiplexProgramsResponse +ListMultiplexesRequest +ListMultiplexesResponse +ListName +ListNamedQueriesInput +ListNamedQueriesOutput +ListNamedShadowsForThingRequest +ListNamedShadowsForThingResponse +ListNamespacesRequest +ListNamespacesResponse +ListNetworkAnalyzerConfigurationsRequest +ListNetworkAnalyzerConfigurationsResponse +ListNetworkProfilesRequest +ListNetworkProfilesResult +ListNetworkResourcesRequest +ListNetworkResourcesResponse +ListNetworkSettingsRequest +ListNetworkSettingsResponse +ListNetworkSitesRequest +ListNetworkSitesResponse +ListNetworksInput +ListNetworksOutput +ListNetworksRequest +ListNetworksResponse +ListNodeFromTemplateJobsRequest +ListNodeFromTemplateJobsResponse +ListNodegroupsRequest +ListNodegroupsResponse +ListNodesInput +ListNodesOutput +ListNodesRequest +ListNodesResponse +ListNotebookExecutionsInput +ListNotebookExecutionsOutput +ListNotebookInstanceLifecycleConfigsInput +ListNotebookInstanceLifecycleConfigsOutput +ListNotebookInstancesInput +ListNotebookInstancesOutput +ListNotebookMetadataInput +ListNotebookMetadataOutput +ListNotebookSessionsRequest +ListNotebookSessionsResponse +ListNotificationChannelsRequest +ListNotificationChannelsResponse +ListNotificationRulesFilter +ListNotificationRulesRequest +ListNotificationRulesResult +ListNotificationsInput +ListNotificationsOutput +ListNotificationsRequest +ListNotificationsResponse +ListOTAUpdatesRequest +ListOTAUpdatesResponse +ListObjectAttributes +ListObjectAttributesRequest +ListObjectAttributesResponse +ListObjectChildren +ListObjectChildrenRequest +ListObjectChildrenResponse +ListObjectParentPaths +ListObjectParentPathsRequest +ListObjectParentPathsResponse +ListObjectParents +ListObjectParentsRequest +ListObjectParentsResponse +ListObjectPolicies +ListObjectPoliciesRequest +ListObjectPoliciesResponse +ListObjectVersionsOutput +ListObjectVersionsRequest +ListObjectsInput +ListObjectsOutput +ListObjectsRequest +ListObjectsV2Output +ListObjectsV2Request +ListObservabilityConfigurationsRequest +ListObservabilityConfigurationsResponse +ListOfTags +ListOfferingPromotionsRequest +ListOfferingPromotionsResult +ListOfferingTransactionsRequest +ListOfferingTransactionsResult +ListOfferingsRequest +ListOfferingsResponse +ListOfferingsResult +ListOnPremisesInstancesInput +ListOnPremisesInstancesOutput +ListOpenCypherQueriesInput +ListOpenCypherQueriesOutput +ListOpenIDConnectProviderTagsRequest +ListOpenIDConnectProviderTagsResponse +ListOpenIDConnectProvidersResponse +ListOpenWorkflowExecutionsInput +ListOperationsInput +ListOperationsOutput +ListOperationsRequest +ListOperationsResponse +ListOpsItemEventsRequest +ListOpsItemEventsResponse +ListOpsItemRelatedItemsRequest +ListOpsItemRelatedItemsResponse +ListOpsMetadataRequest +ListOpsMetadataResult +ListOrdersInput +ListOrdersOutput +ListOrdersRequest +ListOrdersResponse +ListOrganizationAdminAccountsRequest +ListOrganizationAdminAccountsResponse +ListOrganizationInsightsRequest +ListOrganizationInsightsResponse +ListOrganizationPortfolioAccessInput +ListOrganizationPortfolioAccessOutput +ListOrganizationServiceAccessStatusRequest +ListOrganizationServiceAccessStatusResponse +ListOrganizationalUnitsForParentRequest +ListOrganizationalUnitsForParentResponse +ListOrganizationsRequest +ListOrganizationsResponse +ListOriginAccessControlsRequest +ListOriginAccessControlsResult +ListOriginEndpointsRequest +ListOriginEndpointsResponse +ListOriginRequestPoliciesRequest +ListOriginRequestPoliciesResult +ListOriginationNumbersRequest +ListOriginationNumbersResult +ListOutgoingCertificatesRequest +ListOutgoingCertificatesResponse +ListOutgoingTypedLinks +ListOutgoingTypedLinksRequest +ListOutgoingTypedLinksResponse +ListOutpostResolversRequest +ListOutpostResolversResponse +ListOutpostsInput +ListOutpostsOutput +ListOutpostsWithS3Request +ListOutpostsWithS3Result +ListPHIDetectionJobsRequest +ListPHIDetectionJobsResponse +ListPackageImportJobsRequest +ListPackageImportJobsResponse +ListPackageVersionAssetsRequest +ListPackageVersionAssetsResult +ListPackageVersionDependenciesRequest +ListPackageVersionDependenciesResult +ListPackageVersionsRequest +ListPackageVersionsResponse +ListPackageVersionsResult +ListPackagesForDomainRequest +ListPackagesForDomainResponse +ListPackagesRequest +ListPackagesResponse +ListPackagesResult +ListPackagingConfigurationsRequest +ListPackagingConfigurationsResponse +ListPackagingGroupsRequest +ListPackagingGroupsResponse +ListPageReceiptsRequest +ListPageReceiptsResult +ListPageResolutionsRequest +ListPageResolutionsResult +ListPagesByContactRequest +ListPagesByContactResult +ListPagesByEngagementRequest +ListPagesByEngagementResult +ListParallelDataRequest +ListParallelDataResponse +ListParentsRequest +ListParentsResponse +ListParticipantEventsRequest +ListParticipantEventsResponse +ListParticipantsRequest +ListParticipantsResponse +ListPartnerAccountsRequest +ListPartnerAccountsResponse +ListPartnerEventSourceAccountsRequest +ListPartnerEventSourceAccountsResponse +ListPartnerEventSourcesRequest +ListPartnerEventSourcesResponse +ListPartsInput +ListPartsOutput +ListPartsRequest +ListPeeringsRequest +ListPeeringsResponse +ListPendingInvitationResourcesRequest +ListPendingInvitationResourcesResponse +ListPerformanceAnalysisReportsRequest +ListPerformanceAnalysisReportsResponse +ListPermissionAssociationsRequest +ListPermissionAssociationsResponse +ListPermissionGroupsByUserRequest +ListPermissionGroupsByUserResponse +ListPermissionGroupsRequest +ListPermissionGroupsResponse +ListPermissionSetProvisioningStatusRequest +ListPermissionSetProvisioningStatusResponse +ListPermissionSetsProvisionedToAccountRequest +ListPermissionSetsProvisionedToAccountResponse +ListPermissionSetsRequest +ListPermissionSetsResponse +ListPermissionVersionsRequest +ListPermissionVersionsResponse +ListPermissionsRequest +ListPermissionsResponse +ListPhoneNumberOrdersRequest +ListPhoneNumberOrdersResponse +ListPhoneNumbersOptedOutInput +ListPhoneNumbersOptedOutResponse +ListPhoneNumbersRequest +ListPhoneNumbersResponse +ListPhoneNumbersSummary +ListPhoneNumbersSummaryList +ListPhoneNumbersV2Request +ListPhoneNumbersV2Response +ListPickupLocationsRequest +ListPickupLocationsResult +ListPiiEntitiesDetectionJobsRequest +ListPiiEntitiesDetectionJobsResponse +ListPipelineBlueprintsResponse +ListPipelineExecutionStepsRequest +ListPipelineExecutionStepsResponse +ListPipelineExecutionsInput +ListPipelineExecutionsOutput +ListPipelineExecutionsRequest +ListPipelineExecutionsResponse +ListPipelineParametersForExecutionRequest +ListPipelineParametersForExecutionResponse +ListPipelinesInput +ListPipelinesOutput +ListPipelinesRequest +ListPipelinesResponse +ListPipesRequest +ListPipesResponse +ListPlaceIndexesRequest +ListPlaceIndexesResponse +ListPlaceIndexesResponseEntry +ListPlacementsRequest +ListPlacementsResponse +ListPlatformApplicationsInput +ListPlatformApplicationsResponse +ListPlatformBranchesRequest +ListPlatformBranchesResult +ListPlatformVersionsRequest +ListPlatformVersionsResult +ListPlaybackConfigurationsRequest +ListPlaybackConfigurationsResponse +ListPlaybackKeyPairsRequest +ListPlaybackKeyPairsResponse +ListPluginsRequest +ListPluginsResponse +ListPoliciesForTargetRequest +ListPoliciesForTargetResponse +ListPoliciesGrantingServiceAccessEntry +ListPoliciesGrantingServiceAccessRequest +ListPoliciesGrantingServiceAccessResponse +ListPoliciesInput +ListPoliciesOutput +ListPoliciesRequest +ListPoliciesResponse +ListPolicyAttachments +ListPolicyAttachmentsRequest +ListPolicyAttachmentsResponse +ListPolicyGenerationsRequest +ListPolicyGenerationsResponse +ListPolicyPrincipalsRequest +ListPolicyPrincipalsResponse +ListPolicyStoresInput +ListPolicyStoresOutput +ListPolicyTagsRequest +ListPolicyTagsResponse +ListPolicyTemplatesInput +ListPolicyTemplatesOutput +ListPolicyVersionsRequest +ListPolicyVersionsResponse +ListPoolOriginationIdentitiesRequest +ListPoolOriginationIdentitiesResult +ListPortalsRequest +ListPortalsResponse +ListPortfolioAccessInput +ListPortfolioAccessOutput +ListPortfoliosForProductInput +ListPortfoliosForProductOutput +ListPortfoliosInput +ListPortfoliosOutput +ListPositionConfigurationsRequest +ListPositionConfigurationsResponse +ListPredictorBacktestExportJobsRequest +ListPredictorBacktestExportJobsResponse +ListPredictorsRequest +ListPredictorsResponse +ListPrefetchSchedulesRequest +ListPrefetchSchedulesResponse +ListPreparedStatementsInput +ListPreparedStatementsOutput +ListPresetsRequest +ListPresetsResponse +ListPreviewRotationShiftsRequest +ListPreviewRotationShiftsResult +ListPriceListsRequest +ListPriceListsResponse +ListPricesRequest +ListPricesResponse +ListPricingPlansAssociatedWithPricingRuleInput +ListPricingPlansAssociatedWithPricingRuleOutput +ListPricingPlansFilter +ListPricingPlansInput +ListPricingPlansOutput +ListPricingRulesAssociatedToPricingPlanInput +ListPricingRulesAssociatedToPricingPlanOutput +ListPricingRulesFilter +ListPricingRulesInput +ListPricingRulesOutput +ListPrincipalPoliciesRequest +ListPrincipalPoliciesResponse +ListPrincipalThingsRequest +ListPrincipalThingsResponse +ListPrincipalsForPortfolioInput +ListPrincipalsForPortfolioOutput +ListPrincipalsRequest +ListPrincipalsResponse +ListProblemsRequest +ListProblemsResponse +ListProcessingJobsRequest +ListProcessingJobsResponse +ListProductSubscriptionsRequest +ListProductSubscriptionsResponse +ListProfileNotificationsInput +ListProfileNotificationsOutput +ListProfileObjectTypeItem +ListProfileObjectTypeTemplateItem +ListProfileObjectTypeTemplatesRequest +ListProfileObjectTypeTemplatesResponse +ListProfileObjectTypesRequest +ListProfileObjectTypesResponse +ListProfileObjectsItem +ListProfileObjectsRequest +ListProfileObjectsResponse +ListProfilePermissionsRequest +ListProfilePermissionsResponse +ListProfileSharesInput +ListProfileSharesOutput +ListProfileTimesRequest +ListProfileTimesResponse +ListProfilesInput +ListProfilesOutput +ListProfilesRequest +ListProfilesResponse +ListProfilingGroupsRequest +ListProfilingGroupsResponse +ListProgressUpdateStreamsRequest +ListProgressUpdateStreamsResult +ListProjectAssetsRequest +ListProjectAssetsResponse +ListProjectPoliciesRequest +ListProjectPoliciesResponse +ListProjectsInput +ListProjectsOutput +ListProjectsRequest +ListProjectsResponse +ListProjectsResult +ListPromptsRequest +ListPromptsResponse +ListProposalVotesInput +ListProposalVotesOutput +ListProposalsInput +ListProposalsOutput +ListProtectedQueriesInput +ListProtectedQueriesOutput +ListProtectedResourcesByBackupVaultInput +ListProtectedResourcesByBackupVaultOutput +ListProtectedResourcesInput +ListProtectedResourcesOutput +ListProtectionGroupsRequest +ListProtectionGroupsResponse +ListProtectionsRequest +ListProtectionsResponse +ListProtocolsListsRequest +ListProtocolsListsResponse +ListProvisionedCapacityInput +ListProvisionedCapacityOutput +ListProvisionedConcurrencyConfigsRequest +ListProvisionedConcurrencyConfigsResponse +ListProvisionedModelThroughputsRequest +ListProvisionedModelThroughputsResponse +ListProvisionedProductPlansInput +ListProvisionedProductPlansOutput +ListProvisioningArtifactsForServiceActionInput +ListProvisioningArtifactsForServiceActionOutput +ListProvisioningArtifactsInput +ListProvisioningArtifactsOutput +ListProvisioningTemplateVersionsRequest +ListProvisioningTemplateVersionsResponse +ListProvisioningTemplatesRequest +ListProvisioningTemplatesResponse +ListProxySessionsRequest +ListProxySessionsResponse +ListPublicKeysRequest +ListPublicKeysResponse +ListPublicKeysResult +ListPublishedSchemaArnsRequest +ListPublishedSchemaArnsResponse +ListPublishingDestinationsRequest +ListPublishingDestinationsResponse +ListPullRequestsInput +ListPullRequestsOutput +ListQualificationRequestsRequest +ListQualificationRequestsResponse +ListQualificationTypesRequest +ListQualificationTypesResponse +ListQueriesRequest +ListQueriesResponse +ListQueryExecutionsInput +ListQueryExecutionsOutput +ListQueryLoggingConfigsRequest +ListQueryLoggingConfigsResponse +ListQuerySuggestionsBlockListsRequest +ListQuerySuggestionsBlockListsResponse +ListQueueQuickConnectsRequest +ListQueueQuickConnectsResponse +ListQueueTagsRequest +ListQueueTagsResult +ListQueuedMessagesRequest +ListQueuedMessagesResponse +ListQueuesRequest +ListQueuesResponse +ListQueuesResult +ListQuickConnectsRequest +ListQuickConnectsResponse +ListRasterDataCollectionsInput +ListRasterDataCollectionsOutput +ListRateBasedRulesRequest +ListRateBasedRulesResponse +ListReadSetActivationJobsRequest +ListReadSetActivationJobsResponse +ListReadSetExportJobsRequest +ListReadSetExportJobsResponse +ListReadSetImportJobsRequest +ListReadSetImportJobsResponse +ListReadSetUploadPartsRequest +ListReadSetUploadPartsResponse +ListReadSetsRequest +ListReadSetsResponse +ListReadinessChecksRequest +ListReadinessChecksResponse +ListRealtimeContactAnalysisSegmentsRequest +ListRealtimeContactAnalysisSegmentsResponse +ListRealtimeLogConfigsRequest +ListRealtimeLogConfigsResult +ListReceiptFiltersResponse +ListReceiptRuleSetsRequest +ListReceiptRuleSetsResponse +ListReceivedGrantsForOrganizationRequest +ListReceivedGrantsForOrganizationResponse +ListReceivedGrantsRequest +ListReceivedGrantsResponse +ListReceivedLicensesForOrganizationRequest +ListReceivedLicensesForOrganizationResponse +ListReceivedLicensesRequest +ListReceivedLicensesResponse +ListRecipeVersionsRequest +ListRecipeVersionsResponse +ListRecipesRequest +ListRecipesResponse +ListRecommendationFeedbackRequest +ListRecommendationFeedbackResponse +ListRecommendationTemplatesRequest +ListRecommendationTemplatesResponse +ListRecommendationsRequest +ListRecommendationsResponse +ListRecommendedIntentsRequest +ListRecommendedIntentsResponse +ListRecommenderConfigurationsResponse +ListRecommendersRequest +ListRecommendersResponse +ListRecordHistoryInput +ListRecordHistoryOutput +ListRecordHistorySearchFilter +ListRecordingConfigurationsRequest +ListRecordingConfigurationsResponse +ListRecordsRequest +ListRecordsResponse +ListRecoveryGroupsRequest +ListRecoveryGroupsResponse +ListRecoveryPointsByBackupVaultInput +ListRecoveryPointsByBackupVaultOutput +ListRecoveryPointsByLegalHoldInput +ListRecoveryPointsByLegalHoldOutput +ListRecoveryPointsByResourceInput +ListRecoveryPointsByResourceOutput +ListRecoveryPointsRequest +ListRecoveryPointsResponse +ListReferenceImportJobsRequest +ListReferenceImportJobsResponse +ListReferenceStoresRequest +ListReferenceStoresResponse +ListReferencesRequest +ListReferencesResponse +ListRefreshSchedulesRequest +ListRefreshSchedulesResponse +ListRegexMatchSetsRequest +ListRegexMatchSetsResponse +ListRegexPatternSetsRequest +ListRegexPatternSetsResponse +ListRegionalBucketsRequest +ListRegionalBucketsResult +ListRegionsRequest +ListRegionsResponse +ListRegistriesInput +ListRegistriesRequest +ListRegistriesResponse +ListRelatedItemsInput +ListRelatedItemsOutput +ListRelatedResourcesForAuditFindingRequest +ListRelatedResourcesForAuditFindingResponse +ListReleaseLabelsInput +ListReleaseLabelsOutput +ListRemoteAccessSessionsRequest +ListRemoteAccessSessionsResult +ListReplacePermissionAssociationsWorkRequest +ListReplacePermissionAssociationsWorkResponse +ListReplaysRequest +ListReplaysResponse +ListReplicationSetsInput +ListReplicationSetsOutput +ListReportDefinitionsRequest +ListReportDefinitionsResult +ListReportGroupsInput +ListReportGroupsOutput +ListReportJobsInput +ListReportJobsOutput +ListReportPlansInput +ListReportPlansOutput +ListReportsForReportGroupInput +ListReportsForReportGroupOutput +ListReportsInput +ListReportsOutput +ListRepositoriesForApprovalRuleTemplateInput +ListRepositoriesForApprovalRuleTemplateOutput +ListRepositoriesInDomainRequest +ListRepositoriesInDomainResult +ListRepositoriesInput +ListRepositoriesOutput +ListRepositoriesRequest +ListRepositoriesResult +ListRepositoryAssociationsRequest +ListRepositoryAssociationsResponse +ListRepositorySyncDefinitionsInput +ListRepositorySyncDefinitionsOutput +ListRequest +ListRequestedServiceQuotaChangeHistoryByQuotaRequest +ListRequestedServiceQuotaChangeHistoryByQuotaResponse +ListRequestedServiceQuotaChangeHistoryRequest +ListRequestedServiceQuotaChangeHistoryResponse +ListRescoreExecutionPlansRequest +ListRescoreExecutionPlansResponse +ListReservationsRequest +ListReservationsResponse +ListResiliencyPoliciesRequest +ListResiliencyPoliciesResponse +ListResolverConfigsRequest +ListResolverConfigsResponse +ListResolverDnssecConfigsRequest +ListResolverDnssecConfigsResponse +ListResolverEndpointIpAddressesRequest +ListResolverEndpointIpAddressesResponse +ListResolverEndpointsRequest +ListResolverEndpointsResponse +ListResolverQueryLogConfigAssociationsRequest +ListResolverQueryLogConfigAssociationsResponse +ListResolverQueryLogConfigsRequest +ListResolverQueryLogConfigsResponse +ListResolverRuleAssociationsRequest +ListResolverRuleAssociationsResponse +ListResolverRulesRequest +ListResolverRulesResponse +ListResolversByFunctionRequest +ListResolversByFunctionResponse +ListResolversRequest +ListResolversResponse +ListResourceCatalogsRequest +ListResourceCatalogsResponse +ListResourceComplianceSummariesRequest +ListResourceComplianceSummariesResult +ListResourceDataSyncRequest +ListResourceDataSyncResult +ListResourceDefinitionVersionsRequest +ListResourceDefinitionVersionsResponse +ListResourceDefinitionsRequest +ListResourceDefinitionsResponse +ListResourceDelegatesRequest +ListResourceDelegatesResponse +ListResourceEvaluationsRequest +ListResourceEvaluationsResponse +ListResourceInventoryRequest +ListResourceInventoryResponse +ListResourcePoliciesRequest +ListResourcePoliciesResult +ListResourceProfileArtifactsRequest +ListResourceProfileArtifactsResponse +ListResourceProfileDetectionsRequest +ListResourceProfileDetectionsResponse +ListResourceRecordSetsRequest +ListResourceRecordSetsResponse +ListResourceRequestsInput +ListResourceRequestsOutput +ListResourceServersRequest +ListResourceServersResponse +ListResourceSetResourcesRequest +ListResourceSetResourcesResponse +ListResourceSetsRequest +ListResourceSetsResponse +ListResourceSharePermissionsRequest +ListResourceSharePermissionsResponse +ListResourceTagsRequest +ListResourceTagsResponse +ListResourceTypesRequest +ListResourceTypesResponse +ListResourcesAssociatedToCustomLineItemFilter +ListResourcesAssociatedToCustomLineItemInput +ListResourcesAssociatedToCustomLineItemOutput +ListResourcesAssociatedToCustomLineItemResponseElement +ListResourcesFilters +ListResourcesForTagOptionInput +ListResourcesForTagOptionOutput +ListResourcesForWebACLRequest +ListResourcesForWebACLResponse +ListResourcesInProtectionGroupRequest +ListResourcesInProtectionGroupResponse +ListResourcesInput +ListResourcesOutput +ListResourcesRequest +ListResourcesResponse +ListResourcesResult +ListResponseHeadersPoliciesRequest +ListResponseHeadersPoliciesResult +ListResponsePlansInput +ListResponsePlansOutput +ListRestoreJobsInput +ListRestoreJobsOutput +ListRetainedMessagesRequest +ListRetainedMessagesResponse +ListRetirableGrantsRequest +ListRetrainingSchedulersRequest +ListRetrainingSchedulersResponse +ListReusableDelegationSetsRequest +ListReusableDelegationSetsResponse +ListReviewPolicyResultsForHITRequest +ListReviewPolicyResultsForHITResponse +ListReviewableHITsRequest +ListReviewableHITsResponse +ListRevisionAssetsRequest +ListRevisionAssetsResponse +ListRobotApplicationsRequest +ListRobotApplicationsResponse +ListRobotsRequest +ListRobotsResponse +ListRoleAliasesRequest +ListRoleAliasesResponse +ListRolePoliciesRequest +ListRolePoliciesResponse +ListRoleTagsRequest +ListRoleTagsResponse +ListRolesRequest +ListRolesResponse +ListRoomMembershipsRequest +ListRoomMembershipsResponse +ListRoomsRequest +ListRoomsResponse +ListRootsRequest +ListRootsResponse +ListRotationOverridesRequest +ListRotationOverridesResult +ListRotationShiftsRequest +ListRotationShiftsResult +ListRotationsRequest +ListRotationsResult +ListRouteCalculatorsRequest +ListRouteCalculatorsResponse +ListRouteCalculatorsResponseEntry +ListRoutesInput +ListRoutesOutput +ListRoutesRequest +ListRoutesResponse +ListRoutingControlsRequest +ListRoutingControlsResponse +ListRoutingProfileQueuesRequest +ListRoutingProfileQueuesResponse +ListRoutingProfilesRequest +ListRoutingProfilesResponse +ListRuleBasedMatchesRequest +ListRuleBasedMatchesResponse +ListRuleGroupsNamespacesRequest +ListRuleGroupsNamespacesResponse +ListRuleGroupsRequest +ListRuleGroupsResponse +ListRuleNamesByTargetRequest +ListRuleNamesByTargetResponse +ListRulesOutput +ListRulesPackagesRequest +ListRulesPackagesResponse +ListRulesRequest +ListRulesResponse +ListRulesetsRequest +ListRulesetsResponse +ListRumMetricsDestinationsRequest +ListRumMetricsDestinationsResponse +ListRunGroupsRequest +ListRunGroupsResponse +ListRunTasksRequest +ListRunTasksResponse +ListRunsRequest +ListRunsResponse +ListRunsResult +ListRxNormInferenceJobsRequest +ListRxNormInferenceJobsResponse +ListS3BucketsRequest +ListS3BucketsResponse +ListS3ResourcesRequest +ListS3ResourcesResult +ListSAMLProviderTagsRequest +ListSAMLProviderTagsResponse +ListSAMLProvidersResponse +ListSMSSandboxPhoneNumbersInput +ListSMSSandboxPhoneNumbersResult +ListSNOMEDCTInferenceJobsRequest +ListSNOMEDCTInferenceJobsResponse +ListSSHPublicKeysRequest +ListSSHPublicKeysResponse +ListSafetyRulesRequest +ListSafetyRulesResponse +ListSamplesRequest +ListSamplesResult +ListSatellitesRequest +ListSatellitesResponse +ListSavingsPlansPurchaseRecommendationGenerationRequest +ListSavingsPlansPurchaseRecommendationGenerationResponse +ListScansRequest +ListScansResponse +ListScenesRequest +ListScenesResponse +ListScheduleGroupsInput +ListScheduleGroupsOutput +ListScheduledActionsRequest +ListScheduledActionsResponse +ListScheduledAuditsRequest +ListScheduledAuditsResponse +ListScheduledQueriesRequest +ListScheduledQueriesResponse +ListSchedulesInput +ListSchedulesOutput +ListSchedulesRequest +ListSchedulesResponse +ListSchedulingPoliciesRequest +ListSchedulingPoliciesResponse +ListSchemaExtensionsRequest +ListSchemaExtensionsResult +ListSchemaMappingsInput +ListSchemaMappingsOutput +ListSchemaVersionsInput +ListSchemaVersionsRequest +ListSchemaVersionsResponse +ListSchemasInput +ListSchemasOutput +ListSchemasRequest +ListSchemasResponse +ListScramSecretsRequest +ListScramSecretsResponse +ListScriptsInput +ListScriptsOutput +ListSecretVersionIdsRequest +ListSecretVersionIdsResponse +ListSecretsRequest +ListSecretsResponse +ListSecurityConfigsRequest +ListSecurityConfigsResponse +ListSecurityConfigurationsInput +ListSecurityConfigurationsOutput +ListSecurityControlDefinitionsRequest +ListSecurityControlDefinitionsResponse +ListSecurityKeysRequest +ListSecurityKeysResponse +ListSecurityPoliciesRequest +ListSecurityPoliciesResponse +ListSecurityProfileApplicationsRequest +ListSecurityProfileApplicationsResponse +ListSecurityProfilePermissionsRequest +ListSecurityProfilePermissionsResponse +ListSecurityProfilesForTargetRequest +ListSecurityProfilesForTargetResponse +ListSecurityProfilesRequest +ListSecurityProfilesResponse +ListSegmentReferencesRequest +ListSegmentReferencesResponse +ListSegmentsRequest +ListSegmentsResponse +ListSensitivityInspectionTemplatesRequest +ListSensitivityInspectionTemplatesResponse +ListSensorStatisticsRequest +ListSensorStatisticsResponse +ListSentimentDetectionJobsRequest +ListSentimentDetectionJobsResponse +ListSequenceStoresRequest +ListSequenceStoresResponse +ListServerCertificateTagsRequest +ListServerCertificateTagsResponse +ListServerCertificatesRequest +ListServerCertificatesResponse +ListServerNeighborsRequest +ListServerNeighborsResponse +ListServersRequest +ListServersResponse +ListServiceActionsForProvisioningArtifactInput +ListServiceActionsForProvisioningArtifactOutput +ListServiceActionsInput +ListServiceActionsOutput +ListServiceInstanceOutputsInput +ListServiceInstanceOutputsOutput +ListServiceInstanceProvisionedResourcesInput +ListServiceInstanceProvisionedResourcesOutput +ListServiceInstancesFilter +ListServiceInstancesInput +ListServiceInstancesOutput +ListServiceNetworkServiceAssociationsRequest +ListServiceNetworkServiceAssociationsResponse +ListServiceNetworkVpcAssociationsRequest +ListServiceNetworkVpcAssociationsResponse +ListServiceNetworksRequest +ListServiceNetworksResponse +ListServicePipelineOutputsInput +ListServicePipelineOutputsOutput +ListServicePipelineProvisionedResourcesInput +ListServicePipelineProvisionedResourcesOutput +ListServicePrincipalNamesRequest +ListServicePrincipalNamesResponse +ListServiceProfilesRequest +ListServiceProfilesResponse +ListServiceQuotaIncreaseRequestsInTemplateRequest +ListServiceQuotaIncreaseRequestsInTemplateResponse +ListServiceQuotasRequest +ListServiceQuotasResponse +ListServiceSpecificCredentialsRequest +ListServiceSpecificCredentialsResponse +ListServiceTemplateVersionsInput +ListServiceTemplateVersionsOutput +ListServiceTemplatesInput +ListServiceTemplatesOutput +ListServiceVersionsRequest +ListServiceVersionsResult +ListServicesByNamespaceRequest +ListServicesByNamespaceResponse +ListServicesForAutoScalingConfigurationRequest +ListServicesForAutoScalingConfigurationResponse +ListServicesInput +ListServicesOutput +ListServicesRequest +ListServicesResponse +ListSessionAnalyticsDataRequest +ListSessionAnalyticsDataResponse +ListSessionMetricsRequest +ListSessionMetricsResponse +ListSessionsRequest +ListSessionsResponse +ListShardsInput +ListShardsOutput +ListShareInvitationsInput +ListShareInvitationsOutput +ListSharedEndpointsRequest +ListSharedEndpointsResult +ListSharedProjectsInput +ListSharedProjectsOutput +ListSharedReportGroupsInput +ListSharedReportGroupsOutput +ListSharesRequest +ListSharesResponse +ListSignalCatalogNodesRequest +ListSignalCatalogNodesResponse +ListSignalCatalogsRequest +ListSignalCatalogsResponse +ListSignalingChannelsInput +ListSignalingChannelsOutput +ListSigningCertificatesRequest +ListSigningCertificatesResponse +ListSigningJobsRequest +ListSigningJobsResponse +ListSigningPlatformsRequest +ListSigningPlatformsResponse +ListSigningProfilesRequest +ListSigningProfilesResponse +ListSimulationApplicationsRequest +ListSimulationApplicationsResponse +ListSimulationJobBatchesRequest +ListSimulationJobBatchesResponse +ListSimulationJobsRequest +ListSimulationJobsResponse +ListSimulationsInput +ListSimulationsOutput +ListSinksInput +ListSinksItem +ListSinksOutput +ListSipMediaApplicationsRequest +ListSipMediaApplicationsResponse +ListSipRulesRequest +ListSipRulesResponse +ListSitesInput +ListSitesOutput +ListSitesRequest +ListSitesResponse +ListSizeConstraintSetsRequest +ListSizeConstraintSetsResponse +ListSkillsRequest +ListSkillsResponse +ListSkillsStoreCategoriesRequest +ListSkillsStoreCategoriesResponse +ListSkillsStoreSkillsByCategoryRequest +ListSkillsStoreSkillsByCategoryResponse +ListSlackChannelConfigurationsRequest +ListSlackChannelConfigurationsResult +ListSlackWorkspaceConfigurationsRequest +ListSlackWorkspaceConfigurationsResult +ListSlotTypesRequest +ListSlotTypesResponse +ListSlotsRequest +ListSlotsResponse +ListSmartHomeAppliancesRequest +ListSmartHomeAppliancesResponse +ListSnapshotBlocksRequest +ListSnapshotBlocksResponse +ListSnapshotsInRecycleBinRequest +ListSnapshotsInRecycleBinResult +ListSnapshotsRequest +ListSnapshotsResponse +ListSnapshotsResult +ListSolFunctionInstanceInfo +ListSolFunctionInstanceMetadata +ListSolFunctionInstancesInput +ListSolFunctionInstancesOutput +ListSolFunctionPackageInfo +ListSolFunctionPackageMetadata +ListSolFunctionPackagesInput +ListSolFunctionPackagesOutput +ListSolNetworkInstanceInfo +ListSolNetworkInstanceMetadata +ListSolNetworkInstancesInput +ListSolNetworkInstancesOutput +ListSolNetworkOperationsInfo +ListSolNetworkOperationsInput +ListSolNetworkOperationsMetadata +ListSolNetworkOperationsOutput +ListSolNetworkPackageInfo +ListSolNetworkPackageMetadata +ListSolNetworkPackagesInput +ListSolNetworkPackagesOutput +ListSolutionVersionsRequest +ListSolutionVersionsResponse +ListSolutionsRequest +ListSolutionsResponse +ListSopRecommendationsRequest +ListSopRecommendationsResponse +ListSourceApiAssociationsRequest +ListSourceApiAssociationsResponse +ListSourceCredentialsOutput +ListSourceLocationsRequest +ListSourceLocationsResponse +ListSourceRepositoriesItem +ListSourceRepositoriesRequest +ListSourceRepositoriesResponse +ListSourceRepositoryBranchesItem +ListSourceRepositoryBranchesRequest +ListSourceRepositoryBranchesResponse +ListSourceServerActionsRequest +ListSourceServerActionsResponse +ListSpacesRequest +ListSpacesResponse +ListSpeakerEnrollmentJobsRequest +ListSpeakerEnrollmentJobsResponse +ListSpeakersRequest +ListSpeakersResponse +ListSpeechSynthesisTasksInput +ListSpeechSynthesisTasksOutput +ListSqlInjectionMatchSetsRequest +ListSqlInjectionMatchSetsResponse +ListStackInstanceResourceDriftsInput +ListStackInstanceResourceDriftsOutput +ListStackInstancesForProvisionedProductInput +ListStackInstancesForProvisionedProductOutput +ListStackInstancesInput +ListStackInstancesOutput +ListStackResourcesInput +ListStackResourcesOutput +ListStackSetOperationResultsInput +ListStackSetOperationResultsOutput +ListStackSetOperationsInput +ListStackSetOperationsOutput +ListStackSetsInput +ListStackSetsOutput +ListStacksInput +ListStacksOutput +ListStageDeploymentsRequest +ListStageDeploymentsResult +ListStageDevicesRequest +ListStageDevicesResponse +ListStageSessionsRequest +ListStageSessionsResponse +ListStagesRequest +ListStagesResponse +ListStagesResult +ListStagingAccountsRequest +ListStagingAccountsResponse +ListStandardsControlAssociationsRequest +ListStandardsControlAssociationsResponse +ListStateMachineAliasesInput +ListStateMachineAliasesOutput +ListStateMachineVersionsInput +ListStateMachineVersionsOutput +ListStateMachinesInput +ListStateMachinesOutput +ListStatementsRequest +ListStatementsResponse +ListStepsInput +ListStepsOutput +ListStorageLensConfigurationEntry +ListStorageLensConfigurationsRequest +ListStorageLensConfigurationsResult +ListStorageSystemsRequest +ListStorageSystemsResponse +ListStoredQueriesRequest +ListStoredQueriesResponse +ListStreamConsumersInput +ListStreamConsumersOutput +ListStreamKeysRequest +ListStreamKeysResponse +ListStreamProcessorsRequest +ListStreamProcessorsResponse +ListStreamSessionsRequest +ListStreamSessionsResponse +ListStreamingDistributionsRequest +ListStreamingDistributionsResult +ListStreamingImagesRequest +ListStreamingImagesResponse +ListStreamingSessionBackupsRequest +ListStreamingSessionBackupsResponse +ListStreamingSessionsRequest +ListStreamingSessionsResponse +ListStreamsInput +ListStreamsOutput +ListStreamsRequest +ListStreamsResponse +ListStudioComponentsRequest +ListStudioComponentsResponse +ListStudioLifecycleConfigsRequest +ListStudioLifecycleConfigsResponse +ListStudioMembersRequest +ListStudioMembersResponse +ListStudioSessionMappingsInput +ListStudioSessionMappingsOutput +ListStudiosInput +ListStudiosOutput +ListStudiosRequest +ListStudiosResponse +ListSubChannelsRequest +ListSubChannelsResponse +ListSubjectsResponse +ListSubscribedRuleGroupsRequest +ListSubscribedRuleGroupsResponse +ListSubscribedWorkteamsRequest +ListSubscribedWorkteamsResponse +ListSubscribersRequest +ListSubscribersResponse +ListSubscriptionDefinitionVersionsRequest +ListSubscriptionDefinitionVersionsResponse +ListSubscriptionDefinitionsRequest +ListSubscriptionDefinitionsResponse +ListSubscriptionsByTopicInput +ListSubscriptionsByTopicResponse +ListSubscriptionsInput +ListSubscriptionsResponse +ListSuggestedResiliencyPoliciesRequest +ListSuggestedResiliencyPoliciesResponse +ListSuiteDefinitionsRequest +ListSuiteDefinitionsResponse +ListSuiteRunsRequest +ListSuiteRunsResponse +ListSuitesRequest +ListSuitesResult +ListSupportedCharacterSets +ListSupportedInstanceTypesInput +ListSupportedInstanceTypesOutput +ListSupportedPhoneNumberCountriesRequest +ListSupportedPhoneNumberCountriesResponse +ListSupportedResourceTypesInput +ListSupportedResourceTypesOutput +ListSupportedTimezones +ListSuppressedDestinationsRequest +ListSuppressedDestinationsResponse +ListSyncJobsRequest +ListSyncJobsResponse +ListSyncResourcesRequest +ListSyncResourcesResponse +ListTLSInspectionConfigurationsRequest +ListTLSInspectionConfigurationsResponse +ListTableColumnsRequest +ListTableColumnsResult +ListTableMetadataInput +ListTableMetadataOutput +ListTableRestoreStatusRequest +ListTableRestoreStatusResponse +ListTableRowsRequest +ListTableRowsResult +ListTableStorageOptimizersRequest +ListTableStorageOptimizersResponse +ListTablesInput +ListTablesOutput +ListTablesRequest +ListTablesResponse +ListTablesResult +ListTagOptionsFilters +ListTagOptionsInput +ListTagOptionsOutput +ListTags +ListTagsForCertificateRequest +ListTagsForCertificateResponse +ListTagsForDeliveryStreamInput +ListTagsForDeliveryStreamOutput +ListTagsForDomainRequest +ListTagsForDomainResponse +ListTagsForProjectRequest +ListTagsForProjectResult +ListTagsForResourceInput +ListTagsForResourceMessage +ListTagsForResourceOutput +ListTagsForResourceRequest +ListTagsForResourceResponse +ListTagsForResourceResult +ListTagsForResourcesRequest +ListTagsForResourcesResponse +ListTagsForStreamInput +ListTagsForStreamOutput +ListTagsForVaultInput +ListTagsForVaultOutput +ListTagsInput +ListTagsLogGroupRequest +ListTagsLogGroupResponse +ListTagsOfResourceInput +ListTagsOfResourceOutput +ListTagsOutput +ListTagsRequest +ListTagsResponse +ListTagsResult +ListTapePoolsInput +ListTapePoolsOutput +ListTapesInput +ListTapesOutput +ListTargetGroupsRequest +ListTargetGroupsResponse +ListTargetResourceTypesRequest +ListTargetResourceTypesResponse +ListTargetedSentimentDetectionJobsRequest +ListTargetedSentimentDetectionJobsResponse +ListTargetsByRuleRequest +ListTargetsByRuleResponse +ListTargetsFilter +ListTargetsForPolicyRequest +ListTargetsForPolicyResponse +ListTargetsForSecurityProfileRequest +ListTargetsForSecurityProfileResponse +ListTargetsRequest +ListTargetsResponse +ListTargetsResult +ListTaskDefinitionFamiliesRequest +ListTaskDefinitionFamiliesResponse +ListTaskDefinitionsRequest +ListTaskDefinitionsResponse +ListTaskExecutionsRequest +ListTaskExecutionsResponse +ListTaskTemplatesRequest +ListTaskTemplatesResponse +ListTasksInput +ListTasksOutput +ListTasksRequest +ListTasksResponse +ListTeamMembersRequest +ListTeamMembersResult +ListTemplateActionsRequest +ListTemplateActionsResponse +ListTemplateAliasesRequest +ListTemplateAliasesResponse +ListTemplateGroupAccessControlEntriesRequest +ListTemplateGroupAccessControlEntriesResponse +ListTemplateStepGroupsRequest +ListTemplateStepGroupsResponse +ListTemplateStepsRequest +ListTemplateStepsResponse +ListTemplateVersionsRequest +ListTemplateVersionsResponse +ListTemplatesRequest +ListTemplatesResponse +ListTerminologiesRequest +ListTerminologiesResponse +ListTestExecutionResultItemsRequest +ListTestExecutionResultItemsResponse +ListTestExecutionsRequest +ListTestExecutionsResponse +ListTestGridProjectsRequest +ListTestGridProjectsResult +ListTestGridSessionActionsRequest +ListTestGridSessionActionsResult +ListTestGridSessionArtifactsRequest +ListTestGridSessionArtifactsResult +ListTestGridSessionsRequest +ListTestGridSessionsResult +ListTestRecommendationsRequest +ListTestRecommendationsResponse +ListTestSetRecordsRequest +ListTestSetRecordsResponse +ListTestSetsRequest +ListTestSetsResponse +ListTestsRequest +ListTestsResult +ListTextTranslationJobsRequest +ListTextTranslationJobsResponse +ListThemeAliasesRequest +ListThemeAliasesResponse +ListThemeVersionsRequest +ListThemeVersionsResponse +ListThemesRequest +ListThemesResponse +ListThesauriRequest +ListThesauriResponse +ListThingGroupsForThingRequest +ListThingGroupsForThingResponse +ListThingGroupsRequest +ListThingGroupsResponse +ListThingPrincipalsRequest +ListThingPrincipalsResponse +ListThingRegistrationTaskReportsRequest +ListThingRegistrationTaskReportsResponse +ListThingRegistrationTasksRequest +ListThingRegistrationTasksResponse +ListThingTypesRequest +ListThingTypesResponse +ListThingsInBillingGroupRequest +ListThingsInBillingGroupResponse +ListThingsInThingGroupRequest +ListThingsInThingGroupResponse +ListThingsRequest +ListThingsResponse +ListThirdPartyFirewallFirewallPoliciesRequest +ListThirdPartyFirewallFirewallPoliciesResponse +ListThreatIntelSetsRequest +ListThreatIntelSetsResponse +ListTimeSeriesRequest +ListTimeSeriesResponse +ListTimelineEventsInput +ListTimelineEventsOutput +ListTokenBalancesInput +ListTokenBalancesOutput +ListTokensRequest +ListTokensResponse +ListTopicRefreshSchedulesRequest +ListTopicRefreshSchedulesResponse +ListTopicRuleDestinationsRequest +ListTopicRuleDestinationsResponse +ListTopicRulesRequest +ListTopicRulesResponse +ListTopicsDetectionJobsRequest +ListTopicsDetectionJobsResponse +ListTopicsInput +ListTopicsRequest +ListTopicsResponse +ListTrackerConsumersRequest +ListTrackerConsumersResponse +ListTrackersRequest +ListTrackersResponse +ListTrackersResponseEntry +ListTrafficDistributionGroupUsersRequest +ListTrafficDistributionGroupUsersResponse +ListTrafficDistributionGroupsRequest +ListTrafficDistributionGroupsResponse +ListTrafficPoliciesRequest +ListTrafficPoliciesResponse +ListTrafficPolicyInstancesByHostedZoneRequest +ListTrafficPolicyInstancesByHostedZoneResponse +ListTrafficPolicyInstancesByPolicyRequest +ListTrafficPolicyInstancesByPolicyResponse +ListTrafficPolicyInstancesRequest +ListTrafficPolicyInstancesResponse +ListTrafficPolicyVersionsRequest +ListTrafficPolicyVersionsResponse +ListTrailsRequest +ListTrailsResponse +ListTrainingJobsForHyperParameterTuningJobRequest +ListTrainingJobsForHyperParameterTuningJobResponse +ListTrainingJobsRequest +ListTrainingJobsResponse +ListTransactionEventsInput +ListTransactionEventsOutput +ListTransactionsInput +ListTransactionsOutput +ListTransactionsRequest +ListTransactionsResponse +ListTransactionsSort +ListTranscriptionJobsRequest +ListTranscriptionJobsResponse +ListTransformJobsRequest +ListTransformJobsResponse +ListTrialComponentsRequest +ListTrialComponentsResponse +ListTrialsRequest +ListTrialsResponse +ListTriggersRequest +ListTriggersResponse +ListTrustAnchorsResponse +ListTrustStoreCertificatesRequest +ListTrustStoreCertificatesResponse +ListTrustStoresRequest +ListTrustStoresResponse +ListTunnelsRequest +ListTunnelsResponse +ListType +ListTypeRegistrationsInput +ListTypeRegistrationsOutput +ListTypeVersionsInput +ListTypeVersionsOutput +ListTypedLinkFacetAttributesRequest +ListTypedLinkFacetAttributesResponse +ListTypedLinkFacetNamesRequest +ListTypedLinkFacetNamesResponse +ListTypesByAssociationRequest +ListTypesByAssociationResponse +ListTypesInput +ListTypesOutput +ListTypesRequest +ListTypesResponse +ListUniqueProblemsRequest +ListUniqueProblemsResult +ListUnsupportedAppVersionResourcesRequest +ListUnsupportedAppVersionResourcesResponse +ListUpdateToken +ListUpdatesRequest +ListUpdatesResponse +ListUploadsRequest +ListUploadsResult +ListUsageForLicenseConfigurationRequest +ListUsageForLicenseConfigurationResponse +ListUsageLimitsRequest +ListUsageLimitsResponse +ListUsageTotalsRequest +ListUsageTotalsResponse +ListUseCasesRequest +ListUseCasesResponse +ListUserAccessLoggingSettingsRequest +ListUserAccessLoggingSettingsResponse +ListUserAssociationsRequest +ListUserAssociationsResponse +ListUserGroupsRequest +ListUserGroupsResponse +ListUserHierarchyGroupsRequest +ListUserHierarchyGroupsResponse +ListUserImportJobsRequest +ListUserImportJobsResponse +ListUserPoliciesRequest +ListUserPoliciesResponse +ListUserPoolClientsRequest +ListUserPoolClientsResponse +ListUserPoolsRequest +ListUserPoolsResponse +ListUserProfilesRequest +ListUserProfilesResponse +ListUserProfilesResult +ListUserSettingsRequest +ListUserSettingsResponse +ListUserTagsRequest +ListUserTagsResponse +ListUsersByPermissionGroupRequest +ListUsersByPermissionGroupResponse +ListUsersFilters +ListUsersInGroupRequest +ListUsersInGroupResponse +ListUsersRequest +ListUsersResponse +ListUtteranceAnalyticsDataRequest +ListUtteranceAnalyticsDataResponse +ListUtteranceMetricsRequest +ListUtteranceMetricsResponse +ListV2LoggingLevelsRequest +ListV2LoggingLevelsResponse +ListVPCAssociationAuthorizationsRequest +ListVPCAssociationAuthorizationsResponse +ListVPCConnectionsRequest +ListVPCConnectionsResponse +ListVPCEConfigurationsRequest +ListVPCEConfigurationsResult +ListVariantImportJobsFilter +ListVariantImportJobsRequest +ListVariantImportJobsResponse +ListVariantStoresFilter +ListVariantStoresRequest +ListVariantStoresResponse +ListVaultsInput +ListVaultsOutput +ListVectorEnrichmentJobInput +ListVectorEnrichmentJobOutput +ListVectorEnrichmentJobOutputConfig +ListVehiclesInFleetRequest +ListVehiclesInFleetResponse +ListVehiclesRequest +ListVehiclesResponse +ListVerifiedEmailAddressesResponse +ListVersionsByFunctionRequest +ListVersionsByFunctionResponse +ListVersionsRequest +ListVersionsResponse +ListViewVersionsRequest +ListViewVersionsResponse +ListViewsInput +ListViewsOutput +ListViewsRequest +ListViewsResponse +ListViolationEventsRequest +ListViolationEventsResponse +ListVirtualClustersRequest +ListVirtualClustersResponse +ListVirtualGatewaysInput +ListVirtualGatewaysOutput +ListVirtualInterfaceTestHistoryRequest +ListVirtualInterfaceTestHistoryResponse +ListVirtualMFADevicesRequest +ListVirtualMFADevicesResponse +ListVirtualMachinesInput +ListVirtualMachinesOutput +ListVirtualNodesInput +ListVirtualNodesOutput +ListVirtualRoutersInput +ListVirtualRoutersOutput +ListVirtualServicesInput +ListVirtualServicesOutput +ListVocabulariesRequest +ListVocabulariesResponse +ListVocabularyFiltersRequest +ListVocabularyFiltersResponse +ListVodSourcesRequest +ListVodSourcesResponse +ListVoiceConnectorGroupsRequest +ListVoiceConnectorGroupsResponse +ListVoiceConnectorTerminationCredentialsRequest +ListVoiceConnectorTerminationCredentialsResponse +ListVoiceConnectorsRequest +ListVoiceConnectorsResponse +ListVoiceProfileDomainsRequest +ListVoiceProfileDomainsResponse +ListVoiceProfilesRequest +ListVoiceProfilesResponse +ListVolumeInitiatorsInput +ListVolumeInitiatorsOutput +ListVolumeRecoveryPointsInput +ListVolumeRecoveryPointsOutput +ListVolumesInput +ListVolumesOutput +ListVpcConnectionsRequest +ListVpcConnectionsResponse +ListVpcConnectorsRequest +ListVpcConnectorsResponse +ListVpcEndpointAccessRequest +ListVpcEndpointAccessResponse +ListVpcEndpointsForDomainRequest +ListVpcEndpointsForDomainResponse +ListVpcEndpointsRequest +ListVpcEndpointsResponse +ListVpcIngressConnectionsFilter +ListVpcIngressConnectionsRequest +ListVpcIngressConnectionsResponse +ListWatchlistsRequest +ListWatchlistsResponse +ListWavesRequest +ListWavesRequestFilters +ListWavesResponse +ListWebACLsRequest +ListWebACLsResponse +ListWebhookItem +ListWebhooksInput +ListWebhooksOutput +ListWebhooksRequest +ListWebhooksResult +ListWebsiteAuthorizationProvidersRequest +ListWebsiteAuthorizationProvidersResponse +ListWebsiteCertificateAuthoritiesRequest +ListWebsiteCertificateAuthoritiesResponse +ListWhatIfAnalysesRequest +ListWhatIfAnalysesResponse +ListWhatIfForecastExportsRequest +ListWhatIfForecastExportsResponse +ListWhatIfForecastsRequest +ListWhatIfForecastsResponse +ListWirelessDeviceImportTasksRequest +ListWirelessDeviceImportTasksResponse +ListWirelessDevicesRequest +ListWirelessDevicesResponse +ListWirelessGatewayTaskDefinitionsRequest +ListWirelessGatewayTaskDefinitionsResponse +ListWirelessGatewaysRequest +ListWirelessGatewaysResponse +ListWorkGroupsInput +ListWorkGroupsOutput +ListWorkerBlocksRequest +ListWorkerBlocksResponse +ListWorkerConfigurationsRequest +ListWorkerConfigurationsResponse +ListWorkerFleetsRequest +ListWorkerFleetsResponse +ListWorkersRequest +ListWorkersResponse +ListWorkersWithQualificationTypeRequest +ListWorkersWithQualificationTypeResponse +ListWorkflowExecutionsRequest +ListWorkflowExecutionsResponse +ListWorkflowStepExecutionsRequest +ListWorkflowStepExecutionsResponse +ListWorkflowStepGroupsRequest +ListWorkflowStepGroupsResponse +ListWorkflowStepsRequest +ListWorkflowStepsResponse +ListWorkflowTypesInput +ListWorkflowsItem +ListWorkflowsRequest +ListWorkflowsResponse +ListWorkforcesRequest +ListWorkforcesResponse +ListWorkgroupsRequest +ListWorkgroupsResponse +ListWorkloadSharesInput +ListWorkloadSharesOutput +ListWorkloadsInput +ListWorkloadsOutput +ListWorkloadsRequest +ListWorkloadsResponse +ListWorkspacesRequest +ListWorkspacesResponse +ListWorkteamsRequest +ListWorkteamsResponse +ListWorldExportJobsRequest +ListWorldExportJobsResponse +ListWorldGenerationJobsRequest +ListWorldGenerationJobsResponse +ListWorldTemplatesRequest +ListWorldTemplatesResponse +ListWorldsRequest +ListWorldsResponse +ListXssMatchSetsRequest +ListXssMatchSetsResponse +ListZonalShiftsRequest +ListZonalShiftsResponse +ListedAccess +ListedAgreement +ListedBridge +ListedCertificate +ListedConnector +ListedEntitlement +ListedExecution +ListedFlow +ListedGateway +ListedGatewayInstance +ListedHostKey +ListedProfile +ListedServer +ListedUser +ListedWorkflow +Listener +ListenerAddress +ListenerArn +ListenerArns +ListenerDescription +ListenerDescriptions +ListenerEndpoint +ListenerNotFoundException +ListenerPort +ListenerSummary +ListenerTls +ListenerTlsAcmCertificate +ListenerTlsFileCertificate +ListenerTlsSdsCertificate +ListenerTlsValidationContext +Listeners +ListingId +ListingTime +LiteralArrayOptions +LiteralOptions +LiveConnectorRTMPConfiguration +LiveConnectorSinkConfiguration +LiveConnectorSourceConfiguration +LivePoolProgress +LivePreRollConfiguration +LiveSimulationState +LiveSource +LiveSourceName +LivenessOutputConfig +LoRaWAN +LoRaWANConnectionStatusEventNotificationConfigurations +LoRaWANConnectionStatusResourceTypeEventConfiguration +LoRaWANDevice +LoRaWANDeviceMetadata +LoRaWANDeviceProfile +LoRaWANFuotaTask +LoRaWANFuotaTaskGetInfo +LoRaWANGateway +LoRaWANGatewayCurrentVersion +LoRaWANGatewayMetadata +LoRaWANGatewayVersion +LoRaWANGetServiceProfileInfo +LoRaWANJoinEventNotificationConfigurations +LoRaWANJoinResourceTypeEventConfiguration +LoRaWANListDevice +LoRaWANMulticast +LoRaWANMulticastGet +LoRaWANMulticastMetadata +LoRaWANMulticastSession +LoRaWANNetworkServerCertificateId +LoRaWANSendDataToDevice +LoRaWANServiceProfile +LoRaWANStartFuotaTask +LoRaWANUpdateDevice +LoRaWANUpdateGatewayTaskCreate +LoRaWANUpdateGatewayTaskEntry +LoRoCenterMixLevel +LoRoSurroundMixLevel +Loa +LoadAverage +LoadBalancer +LoadBalancerAddress +LoadBalancerAddresses +LoadBalancerArn +LoadBalancerArns +LoadBalancerAttribute +LoadBalancerAttributeNotFoundException +LoadBalancerAttributes +LoadBalancerDescription +LoadBalancerDescriptions +LoadBalancerInfo +LoadBalancerListenerPort +LoadBalancerName +LoadBalancerNames +LoadBalancerNotFoundException +LoadBalancerOptions +LoadBalancerPort +LoadBalancerPorts +LoadBalancerState +LoadBalancerTarget +LoadBalancerTargetGroup +LoadBalancerTargetGroupARN +LoadBalancerTargetGroupState +LoadBalancerTargetGroups +LoadBalancerTargetPort +LoadBalancerTlsCertificate +LoadBalancerTlsCertificateDnsRecordCreationState +LoadBalancerTlsCertificateDomainValidationOption +LoadBalancerTlsCertificateDomainValidationRecord +LoadBalancerTlsCertificateRenewalSummary +LoadBalancerTlsCertificateSummary +LoadBalancerTlsPolicy +LoadBalancerType +LoadBalancers +LoadBalancersConfig +LoadBasedAutoScalingConfiguration +LoadBasedAutoScalingConfigurations +LoadDryRunConfig +LoadForecast +LoadPermission +LoadPermissionModifications +LoadPermissionRequest +LoadPermissions +LoadSampleData +LoadThreshold +LoadTimeout +LoadUrlAccessDeniedException +LoaderIdResult +LoadingAnimation +LocalAddress +LocalBgpAsn +LocalCollectorS3Access +LocalConsolePassword +LocalDeviceResourceData +LocalDirectoryPath +LocalDomainInfo +LocalGateway +LocalGatewayId +LocalGatewayIds +LocalGatewayRoute +LocalGatewayRouteTable +LocalGatewayRouteTableArn +LocalGatewayRouteTableId +LocalGatewayRouteTableIds +LocalGatewayRouteTableVirtualInterfaceGroupAssociation +LocalGatewayRouteTableVirtualInterfaceGroupAssociationId +LocalGatewayRouteTableVirtualInterfaceGroupAssociationIds +LocalGatewayRouteTableVirtualInterfaceGroupAssociations +LocalGatewayRouteTableVpcAssociation +LocalGatewayRouteTableVpcAssociationId +LocalGatewayRouteTableVpcAssociationIds +LocalGatewayRouteTableVpcAssociations +LocalGatewayRouteTables +LocalGatewayVirtualInterface +LocalGatewayVirtualInterfaceGroup +LocalGatewayVirtualInterfaceGroupId +LocalGatewayVirtualInterfaceGroupIds +LocalGatewayVirtualInterfaceGroups +LocalGatewayVirtualInterfaceId +LocalGatewayVirtualInterfaceIds +LocalGatewayVirtualInterfaces +LocalGateways +LocalHealthEventsConfig +LocalIpDetails +LocalIpv4NetworkCidr +LocalIpv6NetworkCidr +LocalMountPath +LocalNavigationConfiguration +LocalPath +LocalPortDetails +LocalProfileId +LocalSecondaryIndex +LocalSecondaryIndexDescription +LocalSecondaryIndexInfo +LocalSecondaryIndexOverride +LocalSecondaryIndexes +LocalSizeConfig +LocalStorage +LocalStorageTypes +LocalTarget +LocalTime +LocalVolumeResourceData +LocalWriteForwardingStatus +Locale +LocaleCode +LocaleId +LocaleValue +LocaleValues +Locality +Location +LocationARN +LocationAction +LocationArn +LocationAttributes +LocationConfiguration +LocationConstraint +LocationFilter +LocationListEntry +LocationModel +LocationName +LocationOrder +LocationState +LocationStates +LocationSummary +LocationTimestamp +LocationType +LocationUri +Locations +LockConfiguration +LockDate +LockEndTime +LockRuleRequest +LockRuleResponse +LockState +LockToken +Locked +LockedSubscriptionException +LockoutPreventedException +LockoutPreventionException +LogAnomalyClass +LogAnomalyClasses +LogAnomalyShowcase +LogAnomalyShowcases +LogAnomalyToken +LogAnomalyType +LogBucket +LogBucketList +LogConfig +LogConfiguration +LogConfigurationForChannel +LogConfigurationType +LogConfigurations +LogDelivery +LogDeliveryBucket +LogDeliveryConfiguration +LogDeliveryConfigurationRequest +LogDeliveryConfigurationType +LogDeliveryConfigurations +LogDeliveryDescription +LogDeliveryStatus +LogDestination +LogDestinationConfig +LogDestinationConfigs +LogDestinationPermissionException +LogDestinationType +LogDriver +LogEnabled +LogEncryptionKmsKeyId +LogEvent +LogEventId +LogEventTimestamp +LogExports +LogFile +LogFileData +LogFileName +LogFilePath +LogFilePrefix +LogFileValidationEnabled +LogFilter +LogFormat +LogGroup +LogGroupArn +LogGroupField +LogGroupName +LogGroupSummary +LogLevel +LogLevelUpdate +LogOddsMetric +LogOptions +LogOutputFormat +LogPaths +LogPattern +LogPatternSets +LogPatterns +LogPublishingConfiguration +LogPublishingOption +LogPublishingOptions +LogPublishingOptionsStatus +LogResult +LogRoleArn +LogSettingsRequest +LogSettingsResponse +LogSetup +LogSource +LogStream +LogStreamARN +LogStreamARNUpdate +LogStreamArn +LogStreamName +LogStreams +LogSubscription +LogSubscriptions +LogTarget +LogTargetConfiguration +LogText +LogType +LogTypes +LogTypesToDisable +LogTypesToEnable +LogUploadEnabled +LogUri +LogUrl +LogVersion +Logarithmic +Logger +LoggerDefinitionId +LoggerDefinitionVersion +LoggerDefinitionVersionArn +LoggerDefinitionVersionId +Loggers +Logging +LoggingConfig +LoggingConfiguration +LoggingConfigurationInput +LoggingConfigurationMetadata +LoggingConfigurationStatus +LoggingConfigurationSummary +LoggingConfigurations +LoggingEnabled +LoggingFilter +LoggingInfo +LoggingLevel +LoggingOptions +LoggingOptionsPayload +LoggingRole +LoggingStatus +Logical +LogicalCapacityUsed +LogicalIdHierarchy +LogicalOperator +LogicalResourceId +LogicalResourceIds +LogicalTable +LogicalTableMap +LogicalTableSource +LogicalUsed +LoginAttribute +LoginAttributes +LoginAuthConfig +LoginAuthConfigReqObj +LoginMessage +LoginPath +LoginProfile +LoginWithAmazon +Logins +LoginsToRemove +Logo +Logo2x +Logo2xUrl +Logo3x +Logo3xUrl +LogoUrl +LogoutEndpoint +LogoutRequest +LogoutURLs +LogoutUserRequest +Logref +Logs +LogsAnomalyDetection +LogsAnomalyDetectionIntegration +LogsAnomalyDetectionIntegrationConfig +LogsConfig +LogsLocation +LogsStorageLocation +LogsSummary +Lon +LongColumnStatisticsData +LongDescription +LongFormatText +LongRangeType +LongTermPricingEndDate +LongTermPricingEntries +LongTermPricingId +LongTermPricingIds +LongTermPricingListEntry +LongTermPricingStartDate +LongTermPricingStatus +LongTermPricingType +LongValue +LongestPrefixMatches +Longitude +LookAheadRateControl +LookBackAvailablePeriods +LookBackPeriod +LookbackPeriodInDays +LookbackWindow +LookoutMetrics +LookupAttribute +LookupAttributes +LookupDeveloperIdentityInput +LookupDeveloperIdentityResponse +LookupEventsRequest +LookupEventsResponse +LookupPolicy +LookupPolicyRequest +LookupPolicyResponse +LoopDetectedException +LossValue +LoudnessLogging +Low +LowAction +LowCount +LowLatencyHlsManifests +LowerBound +LowerBoundary +LsaAnalysisId +Lt +LtRtCenterMixLevel +LtRtSurroundMixLevel +Lte +LteLocalId +LteNmr +LteNmrObj +LteObj +LteTimingAdvance +LunCount +LunNumber +LustreConfiguration +LustreFileSystemConfiguration +LustreLogConfiguration +LustreLogCreateConfiguration +LustreResponse +LustreRootSquashConfiguration +M2tsScte35Esam +M2tsSettings +M3u8Settings +MAPE +MASE +MAXIMUM +MD5 +MD5OfBody +MD5OfMessageAttributes +MD5OfMessageBody +MD5OfMessageSystemAttributes +MFA +MFADelete +MFADevice +MFADevices +MFAMethodNotFoundException +MFAMode +MFAOptionType +MFAOptions +MINIMUM +MLFramework +MLModel +MLModelId +MLModelName +MLModelType +MLResourceNotFoundException +MLTransform +MLTransformNotReadyException +MLUserDataEncryption +MSKClusterARN +MSKSourceConfiguration +MSKSourceDescription +Mac +MacAddress +MacAddressList +MacAlgorithm +MacAlgorithmDukpt +MacAlgorithmEmv +MacAlgorithms +MacLength +MacSecKey +MacValid +MacVersion +MachineLabeled +MachineLearningDetectionConfig +MachineType +MagneticDuration +MagneticStore +MagneticStoreRejectedDataLocation +MagneticStoreRetentionPeriodInDays +MagneticStoreWriteProperties +MailDomainInUseException +MailDomainNotFoundException +MailDomainStateException +MailDomainSummary +MailDomains +MailFromAttributes +MailFromDomain +MailFromDomainAttributes +MailFromDomainNotVerifiedException +MailFromDomainStatus +MailType +MailboxDeprovisionedDate +MailboxExportJob +MailboxProvisionedDate +MailboxQuota +MailboxSize +MailingAddress +Main +MainClass +MainProfileId +Maintainer +Maintenance +MaintenanceAutoAppliedAfter +MaintenanceCreateSettings +MaintenanceDay +MaintenanceDeadline +MaintenanceDetails +MaintenanceOperationsInProgress +MaintenanceOptions +MaintenanceSchedule +MaintenanceScheduledDate +MaintenanceSchedules +MaintenanceStartHour +MaintenanceStartTime +MaintenanceStatus +MaintenanceStrategies +MaintenanceTrack +MaintenanceTrackName +MaintenanceTracks +MaintenanceUpdateSettings +MaintenanceWindow +MaintenanceWindowAutomationParameters +MaintenanceWindowExecution +MaintenanceWindowExecutionTaskIdentity +MaintenanceWindowExecutionTaskInvocationIdentity +MaintenanceWindowFilter +MaintenanceWindowIdentity +MaintenanceWindowIdentityForTarget +MaintenanceWindowLambdaParameters +MaintenanceWindowRunCommandParameters +MaintenanceWindowStartTime +MaintenanceWindowStepFunctionsParameters +MaintenanceWindowTarget +MaintenanceWindowTask +MaintenanceWindowTaskInvocationParameters +MaintenanceWindowTaskParameterValueExpression +MajorEngineVersion +MajorKeyDerivationMode +MajorRevision +MajorVersion +Make +MalformedArnException +MalformedCSRException +MalformedCertificateException +MalformedPolicyDocumentException +MalformedPolicyException +MalformedPolicyTemplateException +MalformedQueryException +Malware +MalwareName +MalwarePath +MalwareProtection +MalwareProtectionConfiguration +MalwareProtectionConfigurationResult +MalwareProtectionDataSourceFreeTrial +MalwareState +MalwareType +ManageBerkshelf +ManageMasterUserPassword +ManagePropertygraphStatisticsInput +ManagePropertygraphStatisticsOutput +ManageSparqlStatisticsInput +ManageSparqlStatisticsOutput +ManagedAccount +ManagedAction +ManagedActionHistoryItem +ManagedActionHistoryItems +ManagedActionInvalidStateException +ManagedActions +ManagedAgent +ManagedAgentStateChange +ManagedBy +ManagedByFirewallManager +ManagedDataIdentifierSummary +ManagedExecution +ManagedJobTemplateSummary +ManagedKeys +ManagedKeysIPV4 +ManagedKeysIPV6 +ManagedOwnerName +ManagedPersistenceMonitoringConfiguration +ManagedPolicyArn +ManagedPolicyDetail +ManagedPrefixList +ManagedProductDescriptor +ManagedProducts +ManagedResourceSummary +ManagedResourceSummaryList +ManagedRule +ManagedRuleDescription +ManagedRuleException +ManagedRuleGroupConfig +ManagedRuleGroupConfigs +ManagedRuleGroupStatement +ManagedRuleGroupSummary +ManagedRuleGroupVersion +ManagedRuleGroups +ManagedRuleSet +ManagedRuleSetName +ManagedRuleSetSummary +ManagedRuleSetVersion +ManagedRuleSets +ManagedRuleState +ManagedRules +ManagedScaling +ManagedScalingPolicy +ManagedServiceData +ManagedStreamingKafkaParameters +ManagedType +ManagedbyFirewallManager +Management +ManagementCidrRangeConstraint +ManagementCidrRanges +ManagementState +ManagementType +ManagesVpcEndpoints +Mandatory +Manifest +ManifestCompression +ManifestConfirmConditionNotification +ManifestDurationFormat +ManifestEncoding +ManifestEncryption +ManifestEndpointPrefix +ManifestFileLocation +ManifestFilePath +ManifestFormat +ManifestGenerator +ManifestKey +ManifestLayout +ManifestMetadataSignaling +ManifestName +ManifestNameModifier +ManifestOutputLocation +ManifestOverridesPayload +ManifestPayload +ManifestPrefix +ManifestPrefixLocation +ManifestProcessingRules +ManifestS3Uri +ManifestSummary +ManifestURI +ManifestWindowSeconds +Manual +ManualEvidence +ManualMergeRequiredException +ManualSnapshotRemainingDays +ManualSnapshotRetentionPeriod +ManualSnapshotsCurrentCount +ManualSnapshotsLimit +ManualSnapshotsLimitReached +Manufacturer +ManufacturerHardwareCertificate +ManufacturerName +MapArn +MapBooleanAsBoolean +MapConfiguration +MapConfigurationUpdate +MapCustomerOwnedIpOnLaunch +MapEntries +MapEquals +MapFilter +MapIterationEventDetails +MapJsonbAsClob +MapLongVarcharAs +MapMatchingConfig +MapName +MapPublicIpOnLaunch +MapRunExecutionCounts +MapRunFailedEventDetails +MapRunItemCounts +MapRunListItem +MapRunStartedEventDetails +MapStateStartedEventDetails +MapStyleOptions +MapZoomMode +MappedDataSetParameter +MappedDataSetParameters +MappedResourceConfigurationList +MappedResourceConfigurationListItem +Mapping +MappingEntry +MappingParameters +MappingRule +Mappings +Margin +MarginPercentage +MarginStyle +MariaDbDataProviderSettings +MariaDbParameters +MarkAsArchivedRequest +MarkLatest +Marker +MarkerColor +MarkerRecordedEventAttributes +MarkerShape +MarkerSize +MarkerStyleSettings +MarkerVisibility +Market +MarketType +Marketo +MarketoConnectorProfileCredentials +MarketoConnectorProfileProperties +MarketoDestinationProperties +MarketoSourceProperties +Marketplace +MarketplaceCommerceAnalyticsException +MarketplaceDescription +MarketplaceInformation +MarketplaceOnboardingStatus +MarketplaceTitle +MarketplaceUrl +MarksNotSupportedForFormatException +Mask +MaskCharacter +MaskMode +MaskValue +Masks +Master +MasterAccountArn +MasterAccountEmail +MasterAccountId +MasterArn +MasterBackendRole +MasterCannotLeaveOrganizationException +MasterEligibleNodeCount +MasterId +MasterInstanceId +MasterInstanceSecurityGroupId +MasterInstanceType +MasterNode +MasterPublicDnsName +MasterRegion +MasterUserARN +MasterUserArn +MasterUserName +MasterUserOptions +MasterUserPassword +MasterUserSecret +MasterUserSecretKmsKeyId +MasterUsername +MasteringMonitorNits +Match +MatchAllValue +MatchAttributes +MatchConfidence +MatchCriteria +MatchGenerationDate +MatchId +MatchIds +MatchItem +MatchOperator +MatchOption +MatchOptions +MatchPaths +MatchPattern +MatchPredicates +MatchRange +MatchScope +MatchType +MatchedCategories +MatchedDetails +MatchedEventTime +MatchedPlayerSession +MatchedPlayerSessions +MatchedRules +MatchedStatements +MatchedUser +Matcher +Matches +Matching +MatchingAttributesList +MatchingBucket +MatchingEventTypes +MatchingRequest +MatchingResource +MatchingResponse +MatchingRule +MatchingRules +MatchingWorkflowSummary +MatchmakerData +MatchmakingConfiguration +MatchmakingRuleSet +MatchmakingTicket +MathActivity +MavenReference +MavenReferenceDescription +Max +Max24HourSend +MaxAbrBitrate +MaxActiveResourcesExceededException +MaxAge +MaxAgeInDays +MaxAgeInMinutes +MaxAgeRule +MaxAgeSeconds +MaxAggregationInterval +MaxAllocatedStorage +MaxAllowedRuleLevelForMatching +MaxAllowedRuleLevelForMerging +MaxAllowedSignature +MaxAlternatives +MaxAncDataSize +MaxAssignments +MaxAttempts +MaxAutoMLJobRuntimeInSeconds +MaxAverageBitrate +MaxBand +MaxBitrate +MaxCandidates +MaxCapacity +MaxCapacityBreachBehavior +MaxCapacityBuffer +MaxCapacityUnits +MaxCaptures +MaxCityNetworksToMonitor +MaxCll +MaxConcurrency +MaxConcurrentCount +MaxConcurrentDpus +MaxConcurrentGameSessionActivations +MaxConcurrentInvocationsPerInstance +MaxConcurrentPercentage +MaxConcurrentQueriesException +MaxConcurrentRuns +MaxConcurrentSessions +MaxConcurrentTaskCount +MaxConcurrentTransforms +MaxConnections +MaxConnectionsPercent +MaxContacts +MaxContentLightLevel +MaxContentSizePerPageInMegaBytes +MaxContributorCount +MaxContributorValue +MaxCount +MaxCountRule +MaxCpuUtilizationPercentage +MaxDatapoints +MaxDepth +MaxDocumentSizeExceeded +MaxDominantColors +MaxDrainDurationSeconds +MaxDuration +MaxDurationInSeconds +MaxDurationSeconds +MaxDutyCycle +MaxEirp +MaxEntries +MaxErrors +MaxExpirationTime +MaxFaces +MaxFall +MaxFetchRecordsPerShard +MaxFetchTimeInMs +MaxFileSize +MaxFiles +MaxFilesInBand +MaxFrameAverageLightLevel +MaxFrameRate +MaxGroupPreparedCapacity +MaxHeight +MaxHumanLabeledObjectCount +MaxIdleConnectionsPercent +MaxImpact +MaxInferenceUnits +MaxInstanceCount +MaxInstanceLifetime +MaxInvocations +MaxInvocationsPerMinute +MaxIopsPerDbInstance +MaxIopsPerGib +MaxItems +MaxKBytesPerRead +MaxKeys +MaxLabels +MaxLatency +MaxLength +MaxLexemeLengthExceededException +MaxLexiconsNumberExceededException +MaxLimit +MaxLinksPerPage +MaxLocalMediaSizeInMB +MaxLuminance +MaxManifestFragmentResults +MaxMediaPlaylistFragmentResults +MaxMembers +MaxMemoryUtilizationPercentage +MaxModelVersion +MaxModels +MaxNumberOfAutoScalingGroups +MaxNumberOfConfigRulesExceededException +MaxNumberOfConfigurationRecordersExceededException +MaxNumberOfConformancePacksExceededException +MaxNumberOfDeliveryChannelsExceededException +MaxNumberOfLaunchConfigurations +MaxNumberOfMessages +MaxNumberOfMessagesPerSecond +MaxNumberOfOrganizationConfigRulesExceededException +MaxNumberOfOrganizationConformancePacksExceededException +MaxNumberOfRetentionConfigurationsExceededException +MaxNumberOfTests +MaxNumberOfTrainingJobs +MaxNumberOfTrainingJobsNotImproving +MaxOffsetsPerTrigger +MaxOutputFiles +MaxOutputs +MaxP95Performance +MaxPaddingBytes +MaxParallelExecutionSteps +MaxParallelLaunches +MaxParallelOfTests +MaxParallelTrainingJobs +MaxParts +MaxPasswordAge +MaxPayloadInMB +MaxPcrInterval +MaxPercentageOfInputDatasetLabeled +MaxPixelThreshold +MaxPrice +MaxPricePerMinute +MaxProtectionGroups +MaxQueryResults +MaxRange +MaxRecordCount +MaxRecordPerRead +MaxRecords +MaxRenditions +MaxResource +MaxResults +MaxRetentionDays +MaxRetries +MaxRetryCount +MaxRetryIntervalMs +MaxRows +MaxRuntimeInSeconds +MaxRuntimePerTrainingJobInSeconds +MaxSchemaVersion +MaxScore +MaxSelectedChoices +MaxSendRate +MaxSessionDuration +MaxSize +MaxSlotDurationInHours +MaxSlotsByChannel +MaxSpeakerLabels +MaxStorageSize +MaxStorageThroughputPerDbInstance +MaxStorageThroughputPerIops +MaxStorageUtilizationPercentage +MaxSuggestionsCount +MaxSwap +MaxSyncBuffer +MaxTTL +MaxTermDurationInDays +MaxTimeToLiveInMinutes +MaxTimestampGapInDays +MaxTotalPrice +MaxUnits +MaxUploads +MaxUrlsPerMinuteCrawlRate +MaxUserDurationInSeconds +MaxUsers +MaxValue +MaxVersion +MaxVideoBitsPerSecond +MaxVisibleColumns +MaxVisibleRows +MaxVolumeLimit +MaxWaitTimeInSeconds +MaxWidth +MaxWorkers +Maximum +MaximumAllowedResources +MaximumAutomaticAttempts +MaximumBandwidthInMbps +MaximumBatchSize +MaximumBatchingWindowInSeconds +MaximumBitrate +MaximumBranchesExceededException +MaximumCapacityUnits +MaximumConcurrency +MaximumConflictResolutionEntriesExceededException +MaximumCoreCapacityUnits +MaximumDuration +MaximumEfaInterfaces +MaximumEventAgeInSeconds +MaximumExecutionFrequency +MaximumExecutionTimeoutInSeconds +MaximumFileContentToLoadExceededException +MaximumFileEntriesExceededException +MaximumFramerate +MaximumIndividualPlayerLatencyMilliseconds +MaximumInstanceCount +MaximumIops +MaximumItemsToCompareExceededException +MaximumLabelType +MaximumLength +MaximumMinimum +MaximumMinimumComputation +MaximumNetworkCards +MaximumNetworkInterfaces +MaximumNormalizedUnitsUsedPerHour +MaximumNumberOfApprovalsExceededException +MaximumNumberOfInstancesUsedPerHour +MaximumNumberOfTrailsExceededException +MaximumOnDemandCapacityUnits +MaximumOpenPullRequestsExceededException +MaximumPartitionCount +MaximumPercent +MaximumPlayerSessionCount +MaximumRGBTolerance +MaximumRecordAgeInSeconds +MaximumReplicationCount +MaximumRepositoryNamesExceededException +MaximumRepositoryTriggersExceededException +MaximumResultReturnedException +MaximumRetention +MaximumRetryAttempts +MaximumRuleTemplatesAssociatedWithRepositoryException +MaximumStringLength +MaximumSubChannels +MaximumSupportedWeightLbs +MaximumTTL +MaximumThroughputInMBps +MaximumTraversalDepth +MaximumUnits +MaximumValue +MaximumVideoBufferDelayMilliseconds +MaximumWindowInMinutes +MaximumYUV +McGroupId +Mcc +MccXml +Md5Hash +MdnResponse +MdnSigningAlgorithm +MeanTimeToRecoverInMilliseconds +MeanValue +Measure +MeasureAggregationFunction +MeasureDataLabelStyle +MeasureField +MeasureFieldId +MeasureForeground +MeasureLabelVisibility +MeasureLatency +MeasureName +MeasureNameColumn +MeasureValue +MeasureValueType +MeasureValues +Measurement +MeasurementProcessingConfig +Media +MediaCapturePipeline +MediaCapturePipelineSourceConfiguration +MediaCapturePipelineSummary +MediaCapturePipelines +MediaConcatenationPipeline +MediaConcurrencies +MediaConcurrency +MediaConnectFlow +MediaConnectFlowRequest +MediaConnectFlows +MediaConnectSettings +MediaEncoding +MediaFileUri +MediaFormat +MediaInsightsConfiguration +MediaInsightsPipeline +MediaInsightsPipelineConfiguration +MediaInsightsPipelineConfigurationArn +MediaInsightsPipelineConfigurationElement +MediaInsightsPipelineConfigurationId +MediaInsightsPipelineConfigurationName +MediaInsightsPipelineConfigurationSummary +MediaInsightsPipelineConfigurations +MediaInsightsPipelineElementStatus +MediaInsightsRuntimeMetadata +MediaLiveConnectorPipeline +MediaLiveInputArn +MediaPackageGroupSettings +MediaPackageOutputDestinationSettings +MediaPackageOutputSettings +MediaPackageSettings +MediaPipeline +MediaPipelineArn +MediaPipelineId +MediaPipelineSummary +MediaPipelines +MediaPlacement +MediaRegion +MediaSampleRate +MediaSampleRateHertz +MediaSourceConfig +MediaStorageConfiguration +MediaStoreStorageClass +MediaStream +MediaStreamAttributes +MediaStreamAttributesRequest +MediaStreamId +MediaStreamName +MediaStreamOutputConfiguration +MediaStreamOutputConfigurationRequest +MediaStreamOutputConfigurations +MediaStreamPipeline +MediaStreamSink +MediaStreamSource +MediaStreamSourceConfiguration +MediaStreamSourceConfigurationRequest +MediaStreamSourceConfigurations +MediaStreamType +MediaStreams +MediaType +MediaUriSecretArn +MediaUriType +MediaUrl +MediaconnectSettings +MedialiveInputArns +MedianRuntimeSeconds +MedicalAlternative +MedicalEntity +MedicalItem +MedicalResult +MedicalTranscript +MedicalTranscriptEvent +MedicalTranscriptionJob +MedicalTranscriptionJobName +MedicalTranscriptionJobSummaries +MedicalTranscriptionJobSummary +MedicalTranscriptionSetting +MediumAction +MediumChangerType +MediumCount +Meeting +MeetingArn +MeetingEvents +MeetingEventsConcatenationConfiguration +MeetingFeatures +MeetingFeaturesConfiguration +MeetingHostId +MeetingId +MeetingNotificationConfiguration +MeetingRoomConfiguration +MeetingSetting +Meetings +Member +MemberAccount +MemberAccountEc2DeepInspectionStatus +MemberAccountEc2DeepInspectionStatusState +MemberAccountId +MemberAccountIds +MemberAccountLimitReached +MemberAccountRuleStatus +MemberAccountStatus +MemberAccounts +MemberAdditionalConfiguration +MemberAdditionalConfigurationResult +MemberArn +MemberArns +MemberClusters +MemberClustersOutpostArns +MemberConfiguration +MemberDataSourceConfiguration +MemberDataSourceConfigurations +MemberDatasources +MemberDefinition +MemberDefinitions +MemberDetail +MemberDetails +MemberError +MemberFabricAttributes +MemberFabricConfiguration +MemberFabricLogPublishingConfiguration +MemberFeaturesConfiguration +MemberFeaturesConfigurationResult +MemberFrameworkAttributes +MemberFrameworkConfiguration +MemberGroup +MemberGroups +MemberId +MemberIdArnPair +MemberLogPublishingConfiguration +MemberName +MemberOfServiceLinkedResourceGroup +MemberSpecification +MemberStatus +MemberSummary +MemberType +MemberUser +MemberUsers +Members +Membership +MembershipCount +MembershipDatasources +MembershipExists +MembershipId +MembershipItem +MembershipItemList +MembershipProtectedQueryResultConfiguration +MembershipSummary +Memory +MemoryDuration +MemoryGB +MemoryGiBPerVCpu +MemoryGiBPerVCpuRequest +MemoryInMB +MemoryInfo +MemoryLimitExceededException +MemoryMiB +MemoryMiBRequest +MemoryRegions +MemoryReservation +MemorySize +MemorySizeConfiguration +MemorySizeInMB +MemoryStore +MemoryStoreRetentionPeriodInHours +MemoryThreshold +MemoryUtilization +MentionSentiment +Mentions +Merge +MergeAction +MergeBaseCommit +MergeBranchesByFastForwardInput +MergeBranchesByFastForwardOutput +MergeBranchesBySquashInput +MergeBranchesBySquashOutput +MergeBranchesByThreeWayInput +MergeBranchesByThreeWayOutput +MergeClause +MergeDeveloperIdentitiesInput +MergeDeveloperIdentitiesResponse +MergeHunk +MergeHunkDetail +MergeMetadata +MergeOperations +MergeOptionRequiredException +MergePolicy +MergeProfilesRequest +MergeProfilesResponse +MergePullRequestByFastForwardInput +MergePullRequestByFastForwardOutput +MergePullRequestBySquashInput +MergePullRequestBySquashOutput +MergePullRequestByThreeWayInput +MergePullRequestByThreeWayOutput +MergeShardsInput +MergeStrategy +MergeWhenMatched +MergeWhenNotMatched +MergedDatasetNames +MeshData +MeshRef +MeshServiceDiscovery +MeshSpec +MeshStatus +Message +MessageAction +MessageActivity +MessageAttributeNames +MessageAttributeValue +MessageAttributes +MessageBody +MessageBodyTextType +MessageConfig +MessageConfiguration +MessageData +MessageDeduplicationId +MessageDeliveryStatus +MessageDeliveryStatusEventConfiguration +MessageDeliveryStatusResourceTypeEventConfiguration +MessageDetail +MessageDsn +MessageFieldMappings +MessageFormat +MessageFrozen +MessageGroup +MessageGroupId +MessageId +MessageInsightsDataSource +MessageInsightsFilters +MessageMaxBytes +MessageMetadata +MessagePayload +MessagePrefix +MessageRejected +MessageRequest +MessageResponse +MessageResult +MessageReviewHandler +MessageStructure +MessageSubject +MessageSystemAttributeValue +MessageSystemAttributes +MessageTag +MessageTemplateType +MessageText +MessageTtlSeconds +MessageType +MessageTypes +Messages +MessagesPerSecond +MessagingSessionEndpoint +MetaData +MetaDataKey +MetaDataValue +Metadata +Metadata3 +Metadata4 +Metadata5 +Metadata6 +Metadata7 +Metadata8 +MetadataBlob +MetadataBlobChecksum +MetadataBlobChecksumAlgorithm +MetadataBlobLength +MetadataCatalogConfig +MetadataCatalogDetail +MetadataConfiguration +MetadataContent +MetadataControl +MetadataDestination +MetadataDirective +MetadataEntry +MetadataException +MetadataInfo +MetadataInfoMap +MetadataKey +MetadataKeyValue +MetadataKeyValuePair +MetadataList +MetadataOperation +MetadataOptions +MetadataProperties +MetadataString +MetadataToUpdate +MetadataValue +MeterUsageRequest +MeterUsageResult +MeteredLinesOfCodeCount +MeteringMode +MeteringProfileCount +MeteringRecordId +Method +MethodName +MethodNotAllowedException +MethodResponse +MethodSetting +MethodSettings +MethodSnapshot +Methods +Metric +MetricAggregationType +MetricAlarm +MetricAlarms +MetricAttribute +MetricAttribution +MetricAttributionOutput +MetricAttributionSummary +MetricCollectionType +MetricComparison +MetricComparisonComputation +MetricData +MetricDataError +MetricDataPoint +MetricDataQueries +MetricDataQuery +MetricDataResult +MetricDataResults +MetricDataSummary +MetricDataV2 +MetricDatapoint +MetricDatapoints +MetricDatum +MetricDefinition +MetricDefinitionConfig +MetricDefinitionId +MetricDefinitionIds +MetricDefinitionRequest +MetricDefinitions +MetricDescription +MetricDestinationSummary +MetricDimension +MetricDimensionGroups +MetricDimensions +MetricDisplayName +MetricFilter +MetricFilterKey +MetricFilterMatchRecord +MetricFilterV2 +MetricFilterValues +MetricFilters +MetricGoal +MetricGoalConfig +MetricGranularityType +MetricGroups +MetricHeaderCellStyle +MetricIndex +MetricInfo +MetricIntervalLowerBound +MetricIntervalUpperBound +MetricKeyDataPoints +MetricLevelImpact +MetricLevelImpactList +MetricList +MetricMathAnomalyDetector +MetricMonitor +MetricMonitorConfig +MetricName +MetricNames +MetricNamespace +MetricPlacement +MetricPoint +MetricPoints +MetricPolicy +MetricPolicyRule +MetricPolicyRules +MetricProcessingConfig +MetricQueries +MetricQuery +MetricResult +MetricResultV2 +MetricResults +MetricSetArn +MetricSetDataQualityMetric +MetricSetDataQualityMetricList +MetricSetDescription +MetricSetDimensionFilter +MetricSetFrequency +MetricSetName +MetricSetSummary +MetricSetSummaryList +MetricSource +MetricSpecification +MetricSpecifications +MetricStat +MetricStatisticRecommendation +MetricStreamEntry +MetricStreamFilter +MetricStreamStatisticsConfiguration +MetricStreamStatisticsMetric +MetricTimezone +MetricToRetain +MetricTransformation +MetricType +MetricTypes +MetricV2 +MetricValue +MetricValueList +MetricWidget +MetricWidgetImage +MetricWindow +Metrics +MetricsAnalyzed +MetricsAndOperator +MetricsConfiguration +MetricsConfigurationList +MetricsDataSource +MetricsEnabled +MetricsLevel +MetricsLevelUpdate +MetricsOverLookbackPeriod +MetricsSource +MetricsSummary +Metro +Mfa +MfaAuthenticated +MfaConfiguration +MfaEmail +MfaTypes +MicroF1Score +MicroPrecision +MicroRecall +MicrosoftSQLServerCatalogSource +MicrosoftSQLServerCatalogTarget +MicrosoftSQLServerSettings +MicrosoftSqlServerDataProviderSettings +MiddleName +MigrateWorkspaceRequest +MigrateWorkspaceResult +MigrationAdmin +MigrationAlert +MigrationErrorReason +MigrationErrorType +MigrationProject +MigrationProjectArn +MigrationProjectCreationTime +MigrationProjectIdentifier +MigrationProjectName +MigrationProjects +MigrationSummary +MigrationTask +MigrationTaskName +MigrationTaskSummary +MigrationTaskSummaryList +MigrationType +MigrationWorkflowSummary +Milestone +MilestoneName +MilestoneNumber +MilestoneSummaries +MilestoneSummary +MillisBehindLatest +MimeType +Min +MinAbrBitrate +MinAdjustmentMagnitude +MinAdjustmentStep +MinAllocatedStorage +MinAllowedConfidenceScoreForMerging +MinBottomRenditionSize +MinBoundingBoxHeight +MinBoundingBoxWidth +MinBufferTime +MinBufferTimeSeconds +MinCapacity +MinCapacityUnits +MinConfidence +MinCount +MinCoveragePercentage +MinDuration +MinEbpInterval +MinFinalSegmentLength +MinGwDiversity +MinHealthyPercentage +MinIInterval +MinInferenceUnits +MinInvocationsPerMinute +MinIopsPerDbInstance +MinIopsPerGib +MinLatency +MinLength +MinLuminance +MinMax +MinMaxGradient +MinModelVersion +MinPartitions +MinPauseBetweenCheckpoints +MinPauseBetweenCheckpointsUpdate +MinRange +MinResource +MinRetentionDays +MinSegmentConfidence +MinSegmentLength +MinSelectedChoices +MinSize +MinSlotDurationInHours +MinStorageBytesPercentage +MinStorageSize +MinStorageThroughputPerDbInstance +MinStorageThroughputPerIops +MinTTL +MinTargetCapacity +MinTermDurationInDays +MinTopRenditionSize +MinTrafficImpact +MinUnits +MinUpdatePeriodSeconds +MinValue +MinVersion +MinVideoBitsPerSecond +MinWorkers +MinimalKeyLength +Minimum +MinimumBitrate +MinimumCapacityUnits +MinimumCompressionSize +MinimumEngineVersion +MinimumEngineVersionPerAllowedValue +MinimumGranularity +MinimumHealthyHosts +MinimumHealthyPercent +MinimumInstanceCount +MinimumInstanceMetadataServiceVersion +MinimumLabelType +MinimumLength +MinimumMembershipPercentage +MinimumNormalizedUnitsUsedPerHour +MinimumNumTapes +MinimumNumberOfInstancesUsedPerHour +MinimumNumberOfQueryingUsers +MinimumPasswordLength +MinimumProtocolVersion +MinimumQueryCount +MinimumRGBTolerance +MinimumRequiredMinorEngineVersion +MinimumRetention +MinimumUnits +MinimumValue +MinimumYUV +MinorRevision +MinorVersion +MinuteOfHour +Minutes +MissingAuthenticationToken +MissingBlueprints +MissingBody +MissingCodecPrivateDataException +MissingCompleteSensorData +MissingComponent +MissingContextValues +MissingCount +MissingDataConfiguration +MissingDataConfigurations +MissingDateVisibility +MissingFileCacheConfiguration +MissingFileSystemConfiguration +MissingMeta +MissingOnRds +MissingParameterException +MissingParameterValueException +MissingPercentage +MissingRenderingAttributeException +MissingRequiredParameter +MissingRequiredParameterException +MissingSensorData +MissingValues +MissingVersionException +MissingVolumeConfiguration +MissingWorkflows +MissionProfileIdResponse +MissionProfileListItem +Mitigation +MitigationAction +MitigationActionIdentifier +MitigationActionParams +MitigationName +Mitigations +Mixed +MixedInstancesPolicy +MixedMeasureMapping +MixedMeasureMappings +MlConfigDefinition +MlResourceDefinition +MlUserDataEncryption +MlUserDataEncryptionMode +Mnc +Mobile +MobileDeviceAccessMatchedRule +MobileDeviceAccessOverride +MobileDeviceAccessRule +MobileDeviceAccessRuleId +MobilePhoneNumber +MobileSdkRelease +Mode +ModeBlock +Model +ModelApprovalStatus +ModelArn +ModelArtifact +ModelArtifacts +ModelBiasAppSpecification +ModelBiasBaselineConfig +ModelBiasJobInput +ModelBiasJobOutputConfig +ModelCacheSetting +ModelCard +ModelCardArn +ModelCardExportArtifacts +ModelCardExportJobArn +ModelCardExportJobName +ModelCardExportJobNameContains +ModelCardExportJobSummaries +ModelCardExportJobSummary +ModelCardExportOutputConfig +ModelCardName +ModelCardProcessingStatus +ModelCardSecurityConfig +ModelCardStatus +ModelCardSummaries +ModelCardSummary +ModelCardVersion +ModelCardVersionSummary +ModelCardVersionSummaryList +ModelClientConfig +ModelConfigs +ModelConfiguration +ModelCustomizationJobSummary +ModelDashboardEndpoint +ModelDashboardIndicator +ModelDashboardIndicatorAction +ModelDashboardModel +ModelDashboardModelCard +ModelDashboardMonitoringSchedule +ModelDataDownloadTimeoutInSeconds +ModelDataQuality +ModelDataSource +ModelDataUrl +ModelDeployConfig +ModelDeployResult +ModelDescription +ModelDigests +ModelEndpointDataBlob +ModelError +ModelErrorException +ModelExplainabilityAppSpecification +ModelExplainabilityBaselineConfig +ModelExplainabilityJobInput +ModelExplainabilityJobOutputConfig +ModelHandle +ModelId +ModelInfrastructureConfig +ModelInput +ModelInputConfiguration +ModelInsights +ModelIntrospectionSchema +ModelKmsKeyId +ModelLatency +ModelLatencyThreshold +ModelLatencyThresholds +ModelManifestSummary +ModelMetadata +ModelMetadataFilter +ModelMetadataSearchExpression +ModelMetadataSummaries +ModelMetadataSummary +ModelMetrics +ModelName +ModelNameBeginsWith +ModelNameContains +ModelNameEquals +ModelNotReadyException +ModelOutputConfiguration +ModelPackage +ModelPackageArn +ModelPackageArnList +ModelPackageContainerDefinition +ModelPackageDescription +ModelPackageGroup +ModelPackageGroupArn +ModelPackageGroupDescription +ModelPackageGroupName +ModelPackageGroupStatus +ModelPackageGroupSummary +ModelPackageGroupSummaryList +ModelPackageName +ModelPackageStatus +ModelPackageStatusDetails +ModelPackageStatusItem +ModelPackageSummaries +ModelPackageSummary +ModelPackageSummaryList +ModelPackageType +ModelPackageValidationProfile +ModelPackageValidationSpecification +ModelPackageVersion +ModelPackageVersionArn +ModelPackageVersionArnEquals +ModelPackagingConfiguration +ModelPackagingDescription +ModelPackagingJobDescription +ModelPackagingJobMetadata +ModelPackagingJobs +ModelPackagingMethod +ModelPackagingOutputDetails +ModelPerformance +ModelPolicy +ModelQuality +ModelQualityAppSpecification +ModelQualityBaselineConfig +ModelQualityJobInput +ModelQualityJobOutputConfig +ModelRegisterSettings +ModelScores +ModelSelectionExpression +ModelSettings +ModelSetupTime +ModelSignature +ModelStats +ModelStatus +ModelStepMetadata +ModelStreamError +ModelStreamErrorException +ModelSummaries +ModelSummary +ModelTimeoutException +ModelType +ModelVariantActions +ModelVariantConfig +ModelVariantConfigSummary +ModelVariants +ModelVersion +ModelVersionActivatedAt +ModelVersionArn +ModelVersionDetail +ModelVersionEvaluation +ModelVersionSummaries +ModelVersionSummary +Models +ModerationLabel +ModerationLabels +ModerationModelVersion +Moderator +ModeratorArns +ModificationResults +ModificationState +ModificationStates +ModificationTime +Modifications +ModifiedAfter +ModifiedAt +ModifiedBefore +ModifiedDate +ModifiedRange +ModifiedSinceConstraint +ModifiedTimeAfter +ModifiedTimeBefore +ModifiedTimestamp +ModifierPercentage +ModifyAccountRequest +ModifyActivityStreamRequest +ModifyActivityStreamResponse +ModifyAddressAttributeRequest +ModifyAddressAttributeResult +ModifyAquaInputMessage +ModifyAquaOutputMessage +ModifyAuthenticationProfileMessage +ModifyAuthenticationProfileResult +ModifyAvailabilityZoneGroupRequest +ModifyAvailabilityZoneGroupResult +ModifyBackupAttributesRequest +ModifyBackupAttributesResponse +ModifyCacheClusterMessage +ModifyCacheClusterResult +ModifyCacheParameterGroupMessage +ModifyCacheSubnetGroupMessage +ModifyCacheSubnetGroupResult +ModifyCapacityReservationFleetRequest +ModifyCapacityReservationFleetResult +ModifyCapacityReservationRequest +ModifyCapacityReservationResult +ModifyCertificateBasedAuthPropertiesRequest +ModifyCertificatesMessage +ModifyCertificatesResult +ModifyClientPropertiesRequest +ModifyClientVpnEndpointRequest +ModifyClientVpnEndpointResult +ModifyClusterDbRevisionMessage +ModifyClusterDbRevisionResult +ModifyClusterIamRolesMessage +ModifyClusterIamRolesResult +ModifyClusterInput +ModifyClusterMaintenanceMessage +ModifyClusterMaintenanceResult +ModifyClusterMessage +ModifyClusterOutput +ModifyClusterParameterGroupMessage +ModifyClusterRequest +ModifyClusterResponse +ModifyClusterResult +ModifyClusterSnapshotMessage +ModifyClusterSnapshotResult +ModifyClusterSnapshotScheduleMessage +ModifyClusterSubnetGroupMessage +ModifyClusterSubnetGroupResult +ModifyConversionConfigurationMessage +ModifyConversionConfigurationResponse +ModifyCurrentDBClusterCapacityMessage +ModifyCustomDBEngineVersionMessage +ModifyCustomDomainAssociationMessage +ModifyCustomDomainAssociationResult +ModifyDBClusterEndpointMessage +ModifyDBClusterEndpointOutput +ModifyDBClusterMessage +ModifyDBClusterParameterGroupMessage +ModifyDBClusterResult +ModifyDBClusterSnapshotAttributeMessage +ModifyDBClusterSnapshotAttributeResult +ModifyDBInstanceMessage +ModifyDBInstanceResult +ModifyDBParameterGroupMessage +ModifyDBProxyEndpointRequest +ModifyDBProxyEndpointResponse +ModifyDBProxyRequest +ModifyDBProxyResponse +ModifyDBProxyTargetGroupRequest +ModifyDBProxyTargetGroupResponse +ModifyDBSnapshotAttributeMessage +ModifyDBSnapshotAttributeResult +ModifyDBSnapshotMessage +ModifyDBSnapshotResult +ModifyDBSubnetGroupMessage +ModifyDBSubnetGroupResult +ModifyDataProviderMessage +ModifyDataProviderResponse +ModifyDefaultCreditSpecificationRequest +ModifyDefaultCreditSpecificationResult +ModifyDocumentPermissionRequest +ModifyEbsDefaultKmsKeyIdRequest +ModifyEbsDefaultKmsKeyIdResult +ModifyEndpointAccessMessage +ModifyEndpointMessage +ModifyEndpointResponse +ModifyEventSubscriptionMessage +ModifyEventSubscriptionResponse +ModifyEventSubscriptionResult +ModifyFleetRequest +ModifyFleetResult +ModifyFpgaImageAttributeRequest +ModifyFpgaImageAttributeResult +ModifyGlobalClusterMessage +ModifyGlobalClusterResult +ModifyGlobalReplicationGroupMessage +ModifyGlobalReplicationGroupResult +ModifyHapgRequest +ModifyHapgResponse +ModifyHostsRequest +ModifyHostsResult +ModifyHsmRequest +ModifyHsmResponse +ModifyIdFormatRequest +ModifyIdentityIdFormatRequest +ModifyImageAttributeRequest +ModifyInstanceAttributeRequest +ModifyInstanceCapacityReservationAttributesRequest +ModifyInstanceCapacityReservationAttributesResult +ModifyInstanceCreditSpecificationRequest +ModifyInstanceCreditSpecificationResult +ModifyInstanceEventStartTimeRequest +ModifyInstanceEventStartTimeResult +ModifyInstanceEventWindowRequest +ModifyInstanceEventWindowResult +ModifyInstanceFleetInput +ModifyInstanceGroupsInput +ModifyInstanceMaintenanceOptionsRequest +ModifyInstanceMaintenanceOptionsResult +ModifyInstanceMetadataOptionsRequest +ModifyInstanceMetadataOptionsResult +ModifyInstancePlacementRequest +ModifyInstancePlacementResult +ModifyInstanceProfileMessage +ModifyInstanceProfileResponse +ModifyIpamPoolRequest +ModifyIpamPoolResult +ModifyIpamRequest +ModifyIpamResourceCidrRequest +ModifyIpamResourceCidrResult +ModifyIpamResourceDiscoveryRequest +ModifyIpamResourceDiscoveryResult +ModifyIpamResult +ModifyIpamScopeRequest +ModifyIpamScopeResult +ModifyLaunchTemplateRequest +ModifyLaunchTemplateResult +ModifyListenerInput +ModifyListenerOutput +ModifyLoadBalancerAttributesInput +ModifyLoadBalancerAttributesOutput +ModifyLocalGatewayRouteRequest +ModifyLocalGatewayRouteResult +ModifyLunaClientRequest +ModifyLunaClientResponse +ModifyManagedPrefixListRequest +ModifyManagedPrefixListResult +ModifyMigrationProjectMessage +ModifyMigrationProjectResponse +ModifyMountTargetSecurityGroupsRequest +ModifyNetworkInterfaceAttributeRequest +ModifyOptionGroupMessage +ModifyOptionGroupResult +ModifyPrivateDnsNameOptionsRequest +ModifyPrivateDnsNameOptionsResult +ModifyRecommendationDetail +ModifyReplicationConfigMessage +ModifyReplicationConfigResponse +ModifyReplicationGroupMessage +ModifyReplicationGroupResult +ModifyReplicationGroupShardConfigurationMessage +ModifyReplicationGroupShardConfigurationResult +ModifyReplicationInstanceMessage +ModifyReplicationInstanceResponse +ModifyReplicationSubnetGroupMessage +ModifyReplicationSubnetGroupResponse +ModifyReplicationTaskMessage +ModifyReplicationTaskResponse +ModifyReportDefinitionRequest +ModifyReservedInstancesRequest +ModifyReservedInstancesResult +ModifyRuleInput +ModifyRuleOutput +ModifySamlPropertiesRequest +ModifyScheduledActionMessage +ModifySecurityGroupRulesRequest +ModifySecurityGroupRulesResult +ModifySelfservicePermissionsRequest +ModifySnapshotAttributeRequest +ModifySnapshotCopyRetentionPeriodMessage +ModifySnapshotCopyRetentionPeriodResult +ModifySnapshotScheduleMessage +ModifySnapshotTierRequest +ModifySnapshotTierResult +ModifySpotFleetRequestRequest +ModifySpotFleetRequestResponse +ModifyStatus +ModifySubnetAttributeRequest +ModifyTargetGroupAttributesInput +ModifyTargetGroupAttributesOutput +ModifyTargetGroupInput +ModifyTargetGroupOutput +ModifyTrafficMirrorFilterNetworkServicesRequest +ModifyTrafficMirrorFilterNetworkServicesResult +ModifyTrafficMirrorFilterRuleRequest +ModifyTrafficMirrorFilterRuleResult +ModifyTrafficMirrorSessionRequest +ModifyTrafficMirrorSessionResult +ModifyTransitGatewayOptions +ModifyTransitGatewayPrefixListReferenceRequest +ModifyTransitGatewayPrefixListReferenceResult +ModifyTransitGatewayRequest +ModifyTransitGatewayResult +ModifyTransitGatewayVpcAttachmentRequest +ModifyTransitGatewayVpcAttachmentRequestOptions +ModifyTransitGatewayVpcAttachmentResult +ModifyUsageLimitMessage +ModifyUserGroupMessage +ModifyUserMessage +ModifyVerifiedAccessEndpointEniOptions +ModifyVerifiedAccessEndpointLoadBalancerOptions +ModifyVerifiedAccessEndpointPolicyRequest +ModifyVerifiedAccessEndpointPolicyResult +ModifyVerifiedAccessEndpointRequest +ModifyVerifiedAccessEndpointResult +ModifyVerifiedAccessGroupPolicyRequest +ModifyVerifiedAccessGroupPolicyResult +ModifyVerifiedAccessGroupRequest +ModifyVerifiedAccessGroupResult +ModifyVerifiedAccessInstanceLoggingConfigurationRequest +ModifyVerifiedAccessInstanceLoggingConfigurationResult +ModifyVerifiedAccessInstanceRequest +ModifyVerifiedAccessInstanceResult +ModifyVerifiedAccessTrustProviderOidcOptions +ModifyVerifiedAccessTrustProviderRequest +ModifyVerifiedAccessTrustProviderResult +ModifyVolumeAttributeRequest +ModifyVolumeRequest +ModifyVolumeResult +ModifyVpcAttributeRequest +ModifyVpcEndpointConnectionNotificationRequest +ModifyVpcEndpointConnectionNotificationResult +ModifyVpcEndpointRequest +ModifyVpcEndpointResult +ModifyVpcEndpointServiceConfigurationRequest +ModifyVpcEndpointServiceConfigurationResult +ModifyVpcEndpointServicePayerResponsibilityRequest +ModifyVpcEndpointServicePayerResponsibilityResult +ModifyVpcEndpointServicePermissionsRequest +ModifyVpcEndpointServicePermissionsResult +ModifyVpcPeeringConnectionOptionsRequest +ModifyVpcPeeringConnectionOptionsResult +ModifyVpcTenancyRequest +ModifyVpcTenancyResult +ModifyVpnConnectionOptionsRequest +ModifyVpnConnectionOptionsResult +ModifyVpnConnectionRequest +ModifyVpnConnectionResult +ModifyVpnTunnelCertificateRequest +ModifyVpnTunnelCertificateResult +ModifyVpnTunnelOptionsRequest +ModifyVpnTunnelOptionsResult +ModifyVpnTunnelOptionsSpecification +ModifyWorkspaceAccessPropertiesRequest +ModifyWorkspaceCreationPropertiesRequest +ModifyWorkspacePropertiesRequest +ModifyWorkspaceStateRequest +ModifyingProcess +ModuleFilePath +ModuleInfo +ModuleLoggingConfiguration +ModuleLoggingConfigurationInput +ModuleName +ModuleSha256 +Monday +MonetaryAmount +MongoDBTarget +MongoDBTargets +MongoDbDataProviderSettings +MongoDbSettings +Monitor +MonitorArn +MonitorArnList +MonitorConfig +MonitorContactRequest +MonitorContactResponse +MonitorDataSource +MonitorDimension +MonitorErrorDetails +MonitorInfo +MonitorInstancesRequest +MonitorInstancesResult +MonitorName +MonitorSpecification +MonitorStatus +MonitorSummary +MonitorType +Monitored +MonitoredResourceARN +MonitoredResourceIdentifier +MonitoredResourceIdentifiers +MonitoredResourceInfo +MonitoredResourceName +Monitoring +MonitoringAlertActions +MonitoringAlertHistory +MonitoringAlertHistorySummary +MonitoringAlertName +MonitoringAlertSummaries +MonitoringAlertSummary +MonitoringAppSpecification +MonitoringBaselineConfig +MonitoringClusterConfig +MonitoringConfiguration +MonitoringConfigurationDescription +MonitoringConfigurationUpdate +MonitoringConstraintsResource +MonitoringCsvDatasetFormat +MonitoringDatasetFormat +MonitoringExecutionStatus +MonitoringExecutionSummaries +MonitoringExecutionSummary +MonitoringGroundTruthS3Input +MonitoringInput +MonitoringInputs +MonitoringInterval +MonitoringJobDefinition +MonitoringJobDefinitionArn +MonitoringJobDefinitionName +MonitoringJobDefinitionSummary +MonitoringJsonDatasetFormat +MonitoringNetworkConfig +MonitoringOutput +MonitoringOutputConfig +MonitoringOutputs +MonitoringResources +MonitoringRoleArn +MonitoringS3Output +MonitoringSchedule +MonitoringScheduleArn +MonitoringScheduleConfig +MonitoringScheduleName +MonitoringScheduleStatus +MonitoringScheduleSummaries +MonitoringScheduleSummary +MonitoringSchedules +MonitoringStatisticsResource +MonitoringStoppingCondition +MonitoringSubscription +MonitoringSubscriptionAlreadyExists +MonitoringTimeInMinutes +MonitoringType +MonitoringTypeEquals +Monitors +MonotonicValues +Monotonicity +Month +MonthlyCost +MonthlyLeasingPrice +MonthlyLimit +MonthlySchedule +MonthlySetting +MonthlySettings +MonthlyTransfer +MoovPlacement +MostRecent +MotionGraphicsActivateScheduleActionSettings +MotionGraphicsConfiguration +MotionGraphicsImageActivateSettings +MotionGraphicsImageDeactivateSettings +MotionGraphicsInsertion +MotionGraphicsSettings +MotionImageInserter +MotionImageInsertionFramerate +MotionImageInsertionOffset +MountName +MountOptions +MountPath +MountPoint +MountPoints +MountSource +MountTarget +MountTargetConflict +MountTargetDescription +MountTargetId +MountTargetNotFound +MountTargets +MouthOpen +MovSettings +MoveAccountRequest +MoveAddressToVpcRequest +MoveAddressToVpcResult +MoveByoipCidrToIpamRequest +MoveByoipCidrToIpamResult +MoveReplicationTaskMessage +MoveReplicationTaskResponse +MoveStatus +MoveToColdStorageAfterDays +MoveToColdStorageAt +MoveToVersionId +MoverSize +MovingAddressStatus +MovingAddressStatuses +Mp2Settings +Mp3Settings +Mp4MajorBrand +Mp4Settings +MpdLocation +MpdManifestBandwidthType +MpdProfile +MpdSettings +Mpeg2FilterSettings +Mpeg2FourCCControl +Mpeg2Settings +MqttContext +MqttHeaders +Mrap +MsSmoothAdditionalManifest +MsSmoothEncryptionSettings +MsSmoothGroupSettings +MsSmoothOutputSettings +MsrcNumber +MsrcSeverity +MssEncryption +MssManifest +MssManifests +MssPackage +Mtime +MultiAZ +MultiAZCapable +MultiAZEnabled +MultiAZWithStandbyEnabled +MultiAttachEnabled +MultiAz +MultiCondition +MultiConditionalBranch +MultiConditionalSplitActivity +MultiLayerStorage +MultiLine +MultiLineStartPattern +MultiMeasureAttributeMapping +MultiMeasureAttributeMappings +MultiMeasureMappings +MultiModelConfig +MultiPolygonGeometryInput +MultiRegion +MultiRegionAccessPointDetails +MultiRegionAccessPointPolicyDocument +MultiRegionAccessPointRegionalResponse +MultiRegionAccessPointReport +MultiRegionAccessPointRoute +MultiRegionAccessPointsAsyncResponse +MultiRegionConfiguration +MultiRegionEnabled +MultiRegionKey +MultiRegionKeyType +MultiValueAnswer +Multicast +MulticastDeviceStatus +MulticastDomainAssociations +MulticastFrameInfo +MulticastGroup +MulticastGroupByFuotaTask +MulticastGroupId +MulticastGroupList +MulticastGroups +MulticastGroupsToAdd +MulticastGroupsToRemove +MulticastIp +MulticastSupport +MulticastWirelessMetadata +Multiline +MultipartReadSetUploadListItem +MultipartUpload +MultipartUploadId +MultipleConflictResolutionEntriesException +MultipleIamArnsProvidedException +MultipleOperatingModes +MultipleRepositoriesInPullRequestException +MultipleValuesSetting +Multiplex +MultiplexGroupSettings +MultiplexId +MultiplexIds +MultiplexMediaConnectOutputDestinationSettings +MultiplexOutputDestination +MultiplexOutputSettings +MultiplexProgram +MultiplexProgramChannelDestinationSettings +MultiplexProgramPacketIdentifiersMap +MultiplexProgramPipelineDetail +MultiplexProgramServiceDescriptor +MultiplexProgramSettings +MultiplexProgramSummary +MultiplexPrograms +MultiplexSettings +MultiplexSettingsSummary +MultiplexStatmuxVideoSettings +MultiplexSummary +MultiplexVideoSettings +Multiplexes +Municipality +MustBeOwnedByCaller +MustBeRequestable +Mustache +Mutable +MutableClusterInfo +MutationActionSetStateParameter +MutationProtection +MutualAuthentication +MutualTlsAuthentication +MutualTlsAuthenticationInput +MutuallyExclusiveParameters +MuxType +MxfSettings +MxfXavcProfileSettings +MySQLCatalogSource +MySQLCatalogTarget +MySQLSettings +MySqlDataProviderSettings +MySqlParameters +N +NE +NFS +NFSDataRepositoryConfiguration +NFSFileShareDefaults +NFSFileShareInfo +NFSFileShareInfoList +NFSOnDeviceService +NFSOnDeviceServiceConfiguration +NLBResource +NS +Name +NameAlreadyExistsException +NameAssigner +NameAvailabilityException +NameContains +NameFilter +NameInUseException +NameLengthExceededException +NameModifier +NameNodes +NamePrefix +NamePrefixUpdate +NameQualifier +NameServers +NameServersUpdateState +NameStartsWith +NameTag +NameUpdate +NameValuePair +NamedEntities +NamedEntityDefinition +NamedEntityDefinitionMetric +NamedQueries +NamedQuery +NamedQueryId +NamedQueryIds +Names +Nameserver +Nameservers +Namespace +NamespaceAlreadyExists +NamespaceError +NamespaceFilter +NamespaceId +NamespaceInfoV2 +NamespaceName +NamespaceNotFound +NamespaceNotFoundException +NamespacePid +NamespaceProperties +NamespaceSummary +NamespaceType +Namespaces +Narrative +NatGateway +NatGatewayAddress +NatGatewayAddresses +NatGatewayId +NatGatewayIds +NatGateways +NativeClientId +NavigationOperation +NcharCharacterSetName +NearestModelName +Negate +Negated +Negative +NegativeColor +NegativeFormat +NegativeValueConfiguration +NeighborConnectionDetail +Neighborhood +NeoVpcConfig +NeptuneSettings +Neq +NestedFilters +NestedPropertyName +NestingLevel +NetAppONTAPCluster +NetAppONTAPClusters +NetAppONTAPSVM +NetAppONTAPSVMs +NetAppONTAPVolume +NetAppONTAPVolumes +NetBiosName +NetIdFilters +NetRISavings +NetSavings +NetmaskLength +Network +NetworkACLEntry +NetworkAccessConfiguration +NetworkAcl +NetworkAclAssociation +NetworkAclAssociationId +NetworkAclEntry +NetworkAclId +NetworkAclIds +NetworkAcls +NetworkAnalyzerConfigurationList +NetworkAnalyzerConfigurations +NetworkArtifactMeta +NetworkBandwidthGbps +NetworkBandwidthGbpsRequest +NetworkBinding +NetworkBorderGroup +NetworkCardIndex +NetworkCardInfo +NetworkCards +NetworkConfig +NetworkConfiguration +NetworkConnectionAction +NetworkDestinationDomain +NetworkDestinationIpV4 +NetworkDestinationIpV6 +NetworkDestinationPort +NetworkDirection +NetworkEndBlackout +NetworkEndBlackoutImage +NetworkEthereumAttributes +NetworkEventType +NetworkFabricAttributes +NetworkFabricConfiguration +NetworkFabricType +NetworkFailureException +NetworkFirewallBlackHoleRouteDetectedViolation +NetworkFirewallInternetTrafficNotInspectedViolation +NetworkFirewallInvalidRouteConfigurationViolation +NetworkFirewallMissingExpectedRTViolation +NetworkFirewallMissingExpectedRoutesViolation +NetworkFirewallMissingFirewallViolation +NetworkFirewallMissingSubnetViolation +NetworkFirewallPolicy +NetworkFirewallPolicyDescription +NetworkFirewallPolicyModifiedViolation +NetworkFirewallStatefulRuleGroupOverride +NetworkFirewallUnexpectedFirewallRoutesViolation +NetworkFirewallUnexpectedGatewayRoutesViolation +NetworkFrameworkAttributes +NetworkFrameworkConfiguration +NetworkHeader +NetworkId +NetworkImpairment +NetworkInBytesPerSecond +NetworkInfo +NetworkInputSettings +NetworkInsightsAccessScope +NetworkInsightsAccessScopeAnalyses +NetworkInsightsAccessScopeAnalysis +NetworkInsightsAccessScopeAnalysisArn +NetworkInsightsAccessScopeAnalysisId +NetworkInsightsAccessScopeAnalysisIds +NetworkInsightsAccessScopeArn +NetworkInsightsAccessScopeContent +NetworkInsightsAccessScopeId +NetworkInsightsAccessScopeIds +NetworkInsightsAccessScopes +NetworkInsightsAnalyses +NetworkInsightsAnalysis +NetworkInsightsAnalysisArn +NetworkInsightsAnalysisId +NetworkInsightsAnalysisIds +NetworkInsightsPath +NetworkInsightsPathArn +NetworkInsightsPathId +NetworkInsightsPathIds +NetworkInsightsPaths +NetworkInterface +NetworkInterfaceAssociation +NetworkInterfaceAttachment +NetworkInterfaceAttachmentChanges +NetworkInterfaceCount +NetworkInterfaceCountRequest +NetworkInterfaceDeviceIndex +NetworkInterfaceId +NetworkInterfaceIds +NetworkInterfaceIpv6Address +NetworkInterfaceLimitExceeded +NetworkInterfaceOptions +NetworkInterfaceOwnerId +NetworkInterfacePermission +NetworkInterfacePermissionId +NetworkInterfacePermissionIds +NetworkInterfacePermissionState +NetworkInterfacePermissions +NetworkInterfacePort +NetworkInterfacePrivateIpAddress +NetworkInterfaceSet +NetworkInterfaceType +NetworkInterfaces +NetworkLoadBalancerArn +NetworkLoadBalancerArns +NetworkMode +NetworkName +NetworkOrigin +NetworkOutBytesPerSecond +NetworkOutput +NetworkPacketsInPerSecond +NetworkPacketsOutPerSecond +NetworkPath +NetworkPathComponent +NetworkPathComponentDetails +NetworkPathFound +NetworkPayload +NetworkPerformance +NetworkPlatform +NetworkPolicyCount +NetworkProfile +NetworkProfileArn +NetworkProfileData +NetworkProfileInfo +NetworkProfileName +NetworkProfiles +NetworkProtocol +NetworkReachabilityDetails +NetworkResource +NetworkResourceCount +NetworkResourceCounts +NetworkResourceDefinition +NetworkResourceSummary +NetworkResourceUtilization +NetworkResources +NetworkRoute +NetworkRouteDestination +NetworkRoutes +NetworkServices +NetworkSettings +NetworkSettingsSummary +NetworkSite +NetworkSource +NetworkSourceDomain +NetworkSourceIpV4 +NetworkSourceIpV6 +NetworkSourceMac +NetworkSourcePort +NetworkStatus +NetworkSummary +NetworkTelemetry +NetworkType +NetworkTypeNotSupported +NetworkingConfiguration +Networks +Neutral +NeverAggregateInFilter +NeverExpires +NewAction +NewAssertionRule +NewAssociationId +NewAvailabilityZones +NewBGPPeer +NewBudget +NewClusterIdentifier +NewColumnName +NewColumnType +NewComponentName +NewContactIds +NewCustomKeyStoreName +NewCustomVocabularyItem +NewDBClusterIdentifier +NewDBInstanceIdentifier +NewDBProxyEndpointName +NewDBProxyName +NewDefaultValues +NewDeviceMetadata +NewDeviceMetadataType +NewDhcpConfiguration +NewGameSessionProtectionPolicy +NewGameSessionsPerCreator +NewGatingRule +NewGlobalClusterIdentifier +NewGroupName +NewImage +NewInThisVersionBulletPoints +NewInstancesProtectedFromScaleIn +NewLaunchProfileMember +NewMembers +NewName +NewNotification +NewObjectMetadata +NewObjectTagging +NewParameterName +NewPassword +NewPath +NewPrivateVirtualInterface +NewPrivateVirtualInterfaceAllocation +NewPublicVirtualInterface +NewPublicVirtualInterfaceAllocation +NewReplicaCount +NewReplicationFactor +NewServerCertificateName +NewStartingHashKey +NewStudioMember +NewSubscriber +NewSupportedProducts +NewTableName +NewTransitVirtualInterface +NewTransitVirtualInterfaceAllocation +NewUserName +NewValue +NewValues +NewVersion +NewerNoncurrentVersions +NexGuardFileMarkerSettings +NexguardFileMarkerSettings +NextActivity +NextContinentCode +NextContinuationToken +NextCountryCode +NextDNSName +NextExecutionTime +NextHostedZoneId +NextInvocationTime +NextInvocations +NextKeyMarker +NextLockToken +NextMaintenanceWindowStartTime +NextMarker +NextPageMarker +NextPageToken +NextPartNumberMarker +NextPassword +NextPollConfigurationToken +NextPollIntervalInSeconds +NextRecordIdentifier +NextRecordName +NextRecordType +NextRefreshTime +NextRotationDate +NextScheduledRetrainingStartDate +NextSchemaVersion +NextShardIterator +NextSigningKeyLength +NextSlotStartTime +NextStatus +NextStep +NextSubdivisionCode +NextToken +NextTransitionTime +NextUpdateAvailabilityDate +NextUpdateAvailabilityTime +NextUpdateSeconds +NextUploadIdMarker +NextVersionIdMarker +NextWebACLLockToken +Nfs +NfsExported +NfsExportedVolumes +NfsExports +NfsMountOptions +Nice +NickName +NielsenCBET +NielsenCbetSettings +NielsenConfiguration +NielsenDistributionType +NielsenId3 +NielsenId3Behavior +NielsenNaesIiNw +NielsenNaesIiNwSettings +NielsenNonLinearWatermark +NielsenNonLinearWatermarkSettings +NielsenPcmToId3Tagging +NielsenWatermarksSettings +NitInterval +NitroEnclavesSupport +NitroTpmInfo +NitroTpmSupport +NlbArn +NlbName +NoActionEmail +NoAssociatedRoleException +NoAvailableCertificateException +NoAvailableConfigurationRecorderException +NoAvailableDeliveryChannelException +NoAvailableOrganizationException +NoChangeException +NoConnectorsAvailableException +NoData +NoDataRetentionException +NoDatabaseMigrationPreference +NoDevice +NoEcho +NoEncryptionConfig +NoEntitlementsAllowedException +NoExpiry +NoFreeAddressesInSubnet +NoHexPrefix +NoManagementAccountSLRExistsException +NoManagementPreference +NoOperationFault +NoPasswordRequired +NoReboot +NoRegionalBlackoutFlag +NoRestrictions +NoRunningConfigurationRecorderException +NoScheduleException +NoSecurityExtension +NoSquashNids +NoSuchBucketException +NoSuchCachePolicy +NoSuchChange +NoSuchCidrCollectionException +NoSuchCidrLocationException +NoSuchCloudFrontOriginAccessIdentity +NoSuchCloudWatchLogsLogGroup +NoSuchConfigRuleException +NoSuchConfigRuleInConformancePackException +NoSuchConfigurationAggregatorException +NoSuchConfigurationRecorderException +NoSuchConformancePackException +NoSuchContinuousDeploymentPolicy +NoSuchDelegationSet +NoSuchDeliveryChannelException +NoSuchDistribution +NoSuchEntityException +NoSuchFieldLevelEncryptionConfig +NoSuchFieldLevelEncryptionProfile +NoSuchFunctionExists +NoSuchGeoLocation +NoSuchHealthCheck +NoSuchHostedZone +NoSuchInvalidation +NoSuchKeySigningKey +NoSuchMonitoringSubscription +NoSuchOrganizationConfigRuleException +NoSuchOrganizationConformancePackException +NoSuchOrigin +NoSuchOriginAccessControl +NoSuchOriginRequestPolicy +NoSuchPublicAccessBlockConfiguration +NoSuchPublicKey +NoSuchQueryLoggingConfig +NoSuchRealtimeLogConfig +NoSuchRemediationConfigurationException +NoSuchRemediationExceptionException +NoSuchResource +NoSuchResourceException +NoSuchResponseHeadersPolicy +NoSuchRetentionConfigurationException +NoSuchStreamingDistribution +NoSuchTrafficPolicy +NoSuchTrafficPolicyInstance +NoUpdateAvailableException +NoVoteCount +Node +NodeARN +NodeAssociationStatus +NodeAssociationStatusToken +NodeConfiguration +NodeConfigurationOption +NodeConfigurationOptionList +NodeConfigurationOptionsFilter +NodeConfigurationOptionsMessage +NodeCount +NodeCounts +NodeCreateTime +NodeDeletionDate +NodeDescription +NodeDetails +NodeEthereumAttributes +NodeExporter +NodeExporterInfo +NodeFabricAttributes +NodeFabricLogPublishingConfiguration +NodeFrameworkAttributes +NodeFromTemplateJob +NodeFromTemplateJobs +NodeGroup +NodeGroupConfiguration +NodeGroupCount +NodeGroupId +NodeGroupMember +NodeGroupMemberUpdateStatus +NodeGroupMembers +NodeGroupNotFoundFault +NodeGroupUpdateStatus +NodeGroups +NodeGroupsPerReplicationGroupQuotaExceededFault +NodeGroupsToRemove +NodeGroupsToRetain +NodeId +NodeIds +NodeIdsToReboot +NodeIdsToRemove +NodeInfo +NodeInfoList +NodeInputPort +NodeInstance +NodeInstanceId +NodeInstances +NodeInterface +NodeLogPublishingConfiguration +NodeName +NodeNotFoundFault +NodeOutputPort +NodeOverrides +NodeProperties +NodePropertiesSummary +NodePropertyOverride +NodeQuotaForClusterExceededFault +NodeQuotaForCustomerExceededFault +NodeRangeProperty +NodeRole +NodeSignal +NodeSignals +NodeSnapshot +NodeSnapshots +NodeStatus +NodeStructure +NodeSummary +NodeToNodeEncryptionOptions +NodeToNodeEncryptionOptionsStatus +NodeType +NodeTypeSpecificValue +NodeTypeSpecificValues +NodeUpdateEndDate +NodeUpdateInitiatedBy +NodeUpdateInitiatedDate +NodeUpdateStartDate +NodeUpdateStatus +NodeUpdateStatusModifiedDate +Nodegroup +NodegroupHealth +NodegroupResources +NodegroupScalingConfig +NodegroupUpdateConfig +Nodes +NodesUpdated +NoiseReducer +NoiseReducerFilterSettings +NoiseReducerSpatialFilterSettings +NoiseReducerTemporalFilterSettings +NonAdditive +NonAwsRegions +NonCompliantConformancePackCount +NonCompliantCount +NonCompliantCriticalCount +NonCompliantHighCount +NonCompliantInformationalCount +NonCompliantLowCount +NonCompliantMediumCount +NonCompliantResource +NonCompliantResourceCount +NonCompliantResources +NonCompliantRuleCount +NonCompliantSummary +NonCompliantUnspecifiedCount +NonDeletedNetworkInterfaceIds +NonKeyAttributes +NonOverridableArguments +NonRepudiation +NonRetryableError +NonTalkTimeFilter +Nonce +NoncompliantKeys +NoncurrentDays +NoncurrentVersionExpiration +NoncurrentVersionExpirationInDays +NoncurrentVersionTransition +NoncurrentVersionTransitions +None +Normal +Normalized +NormalizedInstanceHours +NormalizedValue +North +Not +NotAcceptableException +NotActions +NotAfter +NotAfterDate +NotAllowedAggregations +NotApplicable +NotApplicableCount +NotApplicableEnabled +NotAuthorizedException +NotBefore +NotBeforeDate +NotBeforeDeadline +NotConfiguredException +NotDeviceModels +NotDeviceOperatingSystems +NotDeviceTypes +NotDeviceUserAgents +NotEligibleException +NotEndsWith +NotEquals +NotFilter +NotFoundException +NotImpersonationRoleIds +NotIndexException +NotIpRanges +NotLatestPipelineExecutionException +NotNodeException +NotOrganizationManagementAccountException +NotOrganizationMasterAccountException +NotPolicyException +NotReadableInputStreamException +NotResources +NotScaledReason +NotScaledReasons +NotServiceResourceError +NotStabilizedException +NotStartsWith +NotStatement +NotSupportedOperationException +NotTargetUsers +NotUpdatableException +NotUserIds +Note +NoteText +NoteUpdate +NoteUpdatedAt +NoteUpdatedBy +NotebookExecution +NotebookExecutionId +NotebookExecutionName +NotebookExecutionSummary +NotebookExecutions +NotebookId +NotebookInstanceArn +NotebookInstanceLifecycleConfigArn +NotebookInstanceLifecycleConfigName +NotebookInstanceLifecycleConfigNameContains +NotebookInstanceLifecycleConfigSummary +NotebookInstanceLifecycleConfigs +NotebookInstanceLifecycleHook +NotebookInstanceName +NotebookInstanceSecurityGroupId +NotebookInstanceStatus +NotebookInstanceSummary +NotebookInstances +NotebookMetadata +NotebookMetadataList +NotebookOutputOption +NotebookParams +NotebookS3Location +NotebookS3LocationForOutput +NotebookS3LocationFromInput +NotebookSessionSummary +NotebookSessionsList +NotebookUrl +NotebookVersion +Notes +Notification +NotificationARNs +NotificationAction +NotificationArn +NotificationArns +NotificationAttributes +NotificationChannel +NotificationChannelConfig +NotificationConfig +NotificationConfiguration +NotificationConfigurationFilter +NotificationConfigurations +NotificationContext +NotificationDestinationConfig +NotificationEmail +NotificationEvents +NotificationFilterConfig +NotificationId +NotificationMetadata +NotificationOptions +NotificationPolicy +NotificationProperty +NotificationRecipientType +NotificationRuleSummary +NotificationRules +NotificationSetting +NotificationSettingDetail +NotificationSettingKey +NotificationSpecification +NotificationState +NotificationSummaries +NotificationSummary +NotificationTarget +NotificationTargetARN +NotificationTargetActions +NotificationTopicArn +NotificationTopicStatus +NotificationType +NotificationTypes +NotificationWithSubscribers +Notifications +NotificationsConfiguration +NotificationsEnabled +NotificationsWithSubscribers +Notify +NotifyAll +NotifyAppValidationOutputRequest +NotifyApplicationStateRequest +NotifyCollaborators +NotifyConfiguration +NotifyConfigurationType +NotifyDelayAfter +NotifyEmailType +NotifyMigrationTaskStateRequest +NotifyObjectCompleteInput +NotifyObjectCompleteOutput +NotifyProvisionProductEngineWorkflowResultInput +NotifyRecommendationsReceivedError +NotifyRecommendationsReceivedRequest +NotifyRecommendationsReceivedResponse +NotifyResourceDeploymentStatusChangeInput +NotifyTerminateProvisionedProductEngineWorkflowResultInput +NotifyUpdateProvisionedProductEngineWorkflowResultInput +NotifyWhenUploadedInput +NotifyWhenUploadedOutput +NotifyWorkersFailureCode +NotifyWorkersFailureMessage +NotifyWorkersFailureStatus +NotifyWorkersFailureStatuses +NotifyWorkersRequest +NotifyWorkersResponse +NrCapable +Ntp +NtpPayload +NtpServerName +NtpServers +NtpStatus +NullCheckBoxList +NullOption +NullPacketBitrate +NullString +NullTextList +NullValue +NullValueColor +NullValueField +NullValueFormatConfiguration +Nullable +NumCacheClusters +NumCacheNodes +NumFalseNegatives +NumFalsePositives +NumItemsEvaluated +NumNodeGroups +NumPartitions +NumRecords +NumRefFrames +NumReplicasPerShard +NumResults +NumRetries +NumShards +NumTapesToCreate +NumTimeSeries +NumTrueNegatives +NumTruePositives +Number +NumberAttributeConstraints +NumberAttributeConstraintsType +NumberBFramesBetweenReferenceFrames +NumberCapabilities +NumberDatatypeScale +NumberDisplayFormatConfiguration +NumberFilter +NumberFormatConfiguration +NumberOfAdditionalAssignments +NumberOfArchives +NumberOfAssignmentsAvailable +NumberOfAssignmentsCompleted +NumberOfAssignmentsPending +NumberOfAssociatedQueues +NumberOfAssociatedUsers +NumberOfAssociations +NumberOfAutoScalingGroups +NumberOfBacktestWindows +NumberOfBrokerNodes +NumberOfBuckets +NumberOfBytes +NumberOfCategory +NumberOfChannels +NumberOfChildJobs +NumberOfControls +NumberOfDatabases +NumberOfDecreasesToday +NumberOfDevicesInGroup +NumberOfDevicesRequested +NumberOfDisks +NumberOfDistinctValues +NumberOfDocuments +NumberOfFalses +NumberOfFiles +NumberOfFrameworks +NumberOfHumanWorkersPerDataObject +NumberOfLabels +NumberOfLargeTimestampGaps +NumberOfLaunchConfigurations +NumberOfLines +NumberOfLogLinesOccurrences +NumberOfLogLinesScanned +NumberOfMatchesFound +NumberOfMatchesInSample +NumberOfMergesDone +NumberOfMountTargets +NumberOfNodes +NumberOfNodesPerClusterLimitExceededFault +NumberOfNodesQuotaExceededFault +NumberOfNulls +NumberOfObjects +NumberOfOnCalls +NumberOfProfilesInSample +NumberOfProfilesReviewed +NumberOfProfilesWillBeMerged +NumberOfRecoveryPoints +NumberOfRuleGroupsAlreadyAssociated +NumberOfRuleTemplatesExceededException +NumberOfRules +NumberOfRulesExceededException +NumberOfSamples +NumberOfSchemas +NumberOfServicesAccessible +NumberOfServicesNotAccessed +NumberOfShards +NumberOfSteps +NumberOfTasksFailed +NumberOfTasksSucceeded +NumberOfTestDocuments +NumberOfTopics +NumberOfTrainMentions +NumberOfTrainedDocuments +NumberOfTrainingJobsObjectiveNotImproving +NumberOfTrues +NumberOfVersions +NumberOfWorkers +NumberReference +NumberReferenceFrames +NumberScale +NumberSelectionBehavior +NumberType +NumberValidateRequest +NumberValidateResponse +NumericAxisOptions +NumericEqualityDrillDownFilter +NumericEqualityFilter +NumericFormatConfiguration +NumericOperator +NumericQuestionPropertyValueAutomation +NumericRangeFilter +NumericRangeFilterValue +NumericSeparatorConfiguration +NumericalAggregationFunction +NumericalDimensionField +NumericalMeasureField +NvmeSupport +NwkGeoLoc +NwkKey +NwkSEncKey +NwkSKey +OAuth +OAuth2Credentials +OAuth2CustomParameter +OAuth2Defaults +OAuth2Properties +OAuthCredentials +OAuthGrantType +OAuthHttpParameters +OAuthParameters +OAuthProperties +OAuthProviderException +OAuthScopes +OCSPUrl +OEMEphemeris +OFIMetricDataPoint +OFIModelPerformance +OFITrainingMetricsValue +OID +OIDC +OId +OKActions +OS +OSInfo +OSRelease +OSReleaseLabel +OSUpdateSettings +OSVersion +OTAJobConfig +OTAUpdateFile +OTAUpdateInfo +OTAUpdateSummary +OU +Oauth2Credential +ObdInterface +ObdSignal +ObfuscationSetting +Object +ObjectACL +ObjectAlreadyDetachedException +ObjectArn +ObjectAttributeAction +ObjectAttributeActionType +ObjectAttributeKey +ObjectAttributeList +ObjectAttributeRange +ObjectAttributeUpdate +ObjectAttributeUpdateValue +ObjectAttributes +ObjectChecksum +ObjectChecksumAlgorithm +ObjectConfiguration +ObjectCount +ObjectCountByEncryptionType +ObjectEncryptionType +ObjectFilter +ObjectGroup +ObjectGroupName +ObjectIdentifier +ObjectIdentifierAndLinkNameTuple +ObjectIdentifiers +ObjectKey +ObjectKeyPrefix +ObjectLambdaAccessPoint +ObjectLambdaAccessPointAlias +ObjectLambdaAccessPointArn +ObjectLambdaAccessPointList +ObjectLambdaConfiguration +ObjectLambdaTransformationConfiguration +ObjectLevelStatistics +ObjectList +ObjectLockConfiguration +ObjectLockEnabled +ObjectLockEnabledForBucket +ObjectLockLegalHold +ObjectLockLegalHoldStatus +ObjectLockMode +ObjectLockRetainUntilDate +ObjectLockRetention +ObjectLockRule +ObjectName +ObjectNotDetachedException +ObjectNotFoundException +ObjectOwnership +ObjectPart +ObjectParts +ObjectReference +ObjectReplicationStatuses +ObjectSize +ObjectSizeGreaterThan +ObjectSizeLessThan +ObjectTags +ObjectToken +ObjectType +ObjectTypeField +ObjectTypeKey +ObjectTypeName +ObjectTypeNames +ObjectTypes +ObjectURL +ObjectVersion +ObjectVersionId +ObjectVersionIds +ObjectVersionUpdate +ObjectiveStatus +ObjectiveStatusCounters +Objects +ObjectsTransferred +ObservabilityConfiguration +ObservabilityConfigurationArn +ObservabilityConfigurationName +ObservabilityConfigurationRevision +ObservabilityConfigurationSummary +ObservabilityConfigurationSummaryList +ObservabilityEnabled +Observation +ObservationId +ObservationList +OccConflictException +OccurredAt +OccurrenceCount +OccurrenceDaySet +OccurrenceDays +OccurrenceRelativeToEnd +OccurrenceUnit +Occurrences +OcrLanguage +OcspConfiguration +OcspCustomCname +OcuLimitExceededException +OffCondition +OffPeakWindow +OffPeakWindowOptions +OffPeakWindowOptionsStatus +Offering +OfferingArn +OfferingClass +OfferingDescription +OfferingId +OfferingPromotion +OfferingSet +OfferingStatus +OfferingTransaction +OfferingType +Offerings +Office +OfflineDeviceCount +OfflineEncrypted +OfflineStoreConfig +OfflineStoreStatus +OfflineStoreStatusEquals +Offset +OffsetMillis +OffsetRange +OffsetRanges +OidcConfig +OidcConfigForResponse +OidcIdentityProviderConfig +OidcIdentityProviderConfigRequest +OidcMemberDefinition +OidcOptions +Ok +OkActions +OkCount +OldAction +OldImage +OldKmsKeyId +OldNotification +OldPassword +OldSubscriber +OldValue +OnClause +OnCreate +OnDemandAllocationStrategy +OnDemandBaseCapacity +OnDemandCapacityReservationOptions +OnDemandCost +OnDemandCostEquivalent +OnDemandCostOfRIHoursUsed +OnDemandFulfilledCapacity +OnDemandHours +OnDemandHoursInLookbackPeriod +OnDemandMaxPricePercentageOverLowestPrice +OnDemandMaxTotalPrice +OnDemandNormalizedUnits +OnDemandOptions +OnDemandOptionsRequest +OnDemandPercentageAboveBaseCapacity +OnDemandProvisioningSpecification +OnDemandResizeSpecification +OnDemandResizingSpecification +OnDemandSpecification +OnDemandStreamCount +OnDemandStreamCountLimit +OnDemandTargetCapacity +OnDeviceServiceConfiguration +OnEnterLifecycle +OnExceptionSteps +OnExitLifecycle +OnFailure +OnHoldBalance +OnInputLifecycle +OnPartialBatchItemFailure +OnPartialUpload +OnPremConfig +OnPremiseConfiguration +OnPremisesTagSet +OnStackFailure +OnStart +OnSuccess +OnUnauthenticatedRequest +OnUpload +OnboardedImportedDeviceCount +OnboardingStatus +OnboardingStatusReason +OneClickIdDelay +OneClickPinDelay +OneDriveConfiguration +OneDriveUserList +OneDriveUserS3Path +OneDriveUsers +OneTimePassword +Ongoing +Online +OnlineAbConfig +OnlineAbDefinition +OnlineStoreConfig +OnlineStoreConfigUpdate +OnlineStoreSecurityConfig +OnlineStoreTotalSizeBytes +OnlyAssociated +OnlyAttached +OnlyAvailable +OntapConfiguration +OntapFileSystemConfiguration +OntapResponse +OntapVolumeConfiguration +OntapVolumeType +Op +Opacity +OpenDate +OpenHours +OpenHoursRule +OpenIDAuthTTL +OpenIDClientId +OpenIDConnectConfig +OpenIDConnectProviderArn +OpenIDConnectProviderList +OpenIDConnectProviderListEntry +OpenIDIatTTL +OpenIDIssueURL +OpenIDProviderName +OpenIdConnectConfig +OpenIdConnectProviderARNs +OpenInstancePublicPortsRequest +OpenInstancePublicPortsResult +OpenMonitoring +OpenMonitoringInfo +OpenPortRange +OpenProactiveInsights +OpenReactiveInsights +OpenSearchAction +OpenSearchServiceDataSourceConfig +OpenShardCount +OpenTableFormatInput +OpenTime +OpenTransactionWindow +OpenTunnelRequest +OpenTunnelResponse +OpenXJsonSerDe +OpenZFSClientConfiguration +OpenZFSConfiguration +OpenZFSCreateRootVolumeConfiguration +OpenZFSFileSystemConfiguration +OpenZFSNfsExport +OpenZFSOriginSnapshotConfiguration +OpenZFSResponse +OpenZFSUserOrGroupQuota +OpenZFSVolumeConfiguration +OpenedBy +OperandFieldName +Operands +OperatingAddress +OperatingAddressCity +OperatingAddressCityFilter +OperatingAddressCountryCode +OperatingAddressCountryCodeFilter +OperatingAddressStateOrRegion +OperatingAddressStateOrRegionFilter +OperatingRegions +OperatingSystem +OperatingSystemConfigurationManager +OperatingSystemName +OperatingSystemVersion +OperatingSystems +Operation +OperationAbortedException +OperationArn +OperationDisabledException +OperationEndTime +OperationFailureException +OperationFilter +OperationId +OperationIdAlreadyExistsException +OperationIds +OperationInProgressException +OperationLimitExceeded +OperationName +OperationNotFound +OperationNotFoundException +OperationNotPermittedException +OperationNotPermittedFault +OperationNotSupportedException +OperationPreferences +OperationRequestedBy +OperationResultFilter +OperationStartTime +OperationState +OperationStatus +OperationStatusCheckFailedException +OperationStatusFilter +OperationStatuses +OperationSteps +OperationSummary +OperationSummaryList +OperationTimeoutException +OperationType +OperationalData +OperationalDataToDelete +Operations +OperationsRole +Operator +OplocksEnabled +OpsAggregator +OpsCenter +OpsCenterEnabled +OpsCenterIntegration +OpsCenterIntegrationConfig +OpsEntity +OpsEntityItem +OpsFilter +OpsItem +OpsItemAccessDeniedException +OpsItemAlreadyExistsException +OpsItemArn +OpsItemDataValue +OpsItemEventFilter +OpsItemEventSummary +OpsItemFilter +OpsItemFilters +OpsItemId +OpsItemIdentity +OpsItemInvalidParameterException +OpsItemLimitExceededException +OpsItemNotFoundException +OpsItemNotification +OpsItemRelatedItemAlreadyExistsException +OpsItemRelatedItemAssociationNotFoundException +OpsItemRelatedItemSummary +OpsItemRelatedItemsFilter +OpsItemSNSTopicArn +OpsItemSummaries +OpsItemSummary +OpsItemType +OpsMetadata +OpsMetadataAlreadyExistsException +OpsMetadataArn +OpsMetadataFilter +OpsMetadataInvalidArgumentException +OpsMetadataKeyLimitExceededException +OpsMetadataLimitExceededException +OpsMetadataList +OpsMetadataNotFoundException +OpsMetadataTooManyUpdatesException +OpsResultAttribute +OptIn +OptInPhoneNumberInput +OptInRequiredException +OptInStatus +OptInType +OptOut +OptOutListArn +OptOutListInformation +OptOutListName +OptOutListNames +OptOutLists +OptOutSpeakerRequest +OptOutSpeakerResponse +OptedOutException +OptedOutFilter +OptedOutNumber +OptedOutNumberInformation +OptedOutNumbers +OptedOutTimestamp +OpticalStandard +OptimisticLockException +OptimizationMetric +OptimizationObjective +OptimizationStatus +OptimizeForEndUserLocation +OptimizePerformance +OptimizedSharedDelivery +OptimizedViewPortWidth +OptimizingTime +Option +OptionConfiguration +OptionDescription +OptionGroup +OptionGroupAlreadyExistsFault +OptionGroupArn +OptionGroupDescription +OptionGroupMembership +OptionGroupMemberships +OptionGroupName +OptionGroupNotFoundFault +OptionGroupOption +OptionGroupOptionSetting +OptionGroupOptionSettings +OptionGroupOptionVersions +OptionGroupOptions +OptionGroupOptionsMessage +OptionGroupQuotaExceededFault +OptionGroups +OptionGroupsList +OptionName +OptionRefId +OptionRestrictionRegex +OptionSetting +OptionSettings +OptionSpecification +OptionStatus +OptionVersion +OptionalDeployment +OptionalFields +OptionalObjectAttributes +OptionalParameters +Options +OptionsConflictsWith +OptionsDependedOn +OptionsToInclude +OptionsToRemove +OpusSettings +Or +OrAllFilters +OrConditions +OrStatement +OracleDataProviderSettings +OracleParameters +OraclePathPrefix +OracleSQLCatalogSource +OracleSQLCatalogTarget +OracleSettings +OrcSerDe +Order +OrderBy +OrderByElement +OrderFulfilledDate +OrderId +OrderSubmissionDate +OrderSummary +OrderType +OrderableClusterOption +OrderableClusterOptions +OrderableClusterOptionsMessage +OrderableDBInstanceOption +OrderableDBInstanceOptions +OrderableDBInstanceOptionsMessage +OrderableReplicationInstance +OrderableReplicationInstances +OrderedBy +OrderedIndexedAttributeList +OrderedPhoneNumber +OrderedPhoneNumbers +OrderedRemediationActions +OrderedResourceDefinition +OrderingId +OrderingServiceEndpoint +OrderingTimestamp +Orders +Org +Organization +OrganizationAccessDeniedException +OrganizationAdditionalConfiguration +OrganizationAdditionalConfigurationResult +OrganizationAffectedEntitiesErrorItem +OrganizationAggregationSource +OrganizationAllFeaturesNotEnabledException +OrganizationArn +OrganizationArns +OrganizationAwsServiceAccessStatus +OrganizationConfigRule +OrganizationConfigRuleArn +OrganizationConfigRuleDetailedStatus +OrganizationConfigRuleName +OrganizationConfigRuleNames +OrganizationConfigRuleStatus +OrganizationConfigRuleStatuses +OrganizationConfigRuleTriggerTypes +OrganizationConfigRules +OrganizationConfiguration +OrganizationConformancePack +OrganizationConformancePackArn +OrganizationConformancePackDetailedStatus +OrganizationConformancePackDetailedStatuses +OrganizationConformancePackName +OrganizationConformancePackNames +OrganizationConformancePackStatus +OrganizationConformancePackStatuses +OrganizationConformancePackTemplateValidationException +OrganizationConformancePacks +OrganizationCustomPolicyRuleMetadata +OrganizationCustomPolicyRuleMetadataNoPolicy +OrganizationCustomRuleMetadata +OrganizationDataSourceConfigurations +OrganizationDataSourceConfigurationsResult +OrganizationEbsVolumes +OrganizationEbsVolumesResult +OrganizationEnabled +OrganizationEntityAggregate +OrganizationEvent +OrganizationEventDetails +OrganizationEventDetailsErrorItem +OrganizationEventFilter +OrganizationFeatureConfiguration +OrganizationFeatureConfigurationResult +OrganizationId +OrganizationIntegration +OrganizationKubernetesAuditLogsConfiguration +OrganizationKubernetesAuditLogsConfigurationResult +OrganizationKubernetesConfiguration +OrganizationKubernetesConfigurationResult +OrganizationMalwareProtectionConfiguration +OrganizationMalwareProtectionConfigurationResult +OrganizationManagedRuleMetadata +OrganizationName +OrganizationNode +OrganizationNodeType +OrganizationNodeValue +OrganizationNodes +OrganizationNotEmptyException +OrganizationNotFoundException +OrganizationNotInAllFeaturesModeException +OrganizationParentId +OrganizationResourceCollectionType +OrganizationResourceDetailedStatusFilters +OrganizationResourceId +OrganizationRuleStatus +OrganizationS3LogsConfiguration +OrganizationS3LogsConfigurationResult +OrganizationScanEc2InstanceWithFindings +OrganizationScanEc2InstanceWithFindingsResult +OrganizationSharingStatus +OrganizationSourceType +OrganizationStateException +OrganizationStatus +OrganizationSummaries +OrganizationSummary +OrganizationUnits +OrganizationalUnit +OrganizationalUnitArn +OrganizationalUnitArns +OrganizationalUnitDistinguishedName +OrganizationalUnitDistinguishedNames +OrganizationalUnitId +OrganizationalUnitIds +OrganizationalUnitNotEmptyException +OrganizationalUnitNotFoundException +OrganizationalUnitScope +OrganizationalUnits +OrganizationsDecisionDetail +OrganizationsException +OrganizationsNotInUseException +OrganizationsPolicyId +Orientation +OrientationCorrection +Origin +OriginAccessControl +OriginAccessControlAlreadyExists +OriginAccessControlConfig +OriginAccessControlId +OriginAccessControlInUse +OriginAccessControlList +OriginAccessControlOriginType +OriginAccessControlSummary +OriginAccessIdentity +OriginApprovalRuleTemplate +OriginCustomHeader +OriginDetails +OriginEndpoint +OriginEndpointId +OriginEndpointListConfiguration +OriginEndpointName +OriginEndpoints +OriginGroup +OriginGroupFailoverCriteria +OriginGroupMember +OriginGroupMembers +OriginGroups +OriginId +OriginKeepaliveTimeout +OriginManifestType +OriginOverride +OriginPath +OriginProtocolPolicy +OriginReadTimeout +OriginRequestPolicy +OriginRequestPolicyAlreadyExists +OriginRequestPolicyConfig +OriginRequestPolicyCookiesConfig +OriginRequestPolicyHeadersConfig +OriginRequestPolicyId +OriginRequestPolicyInUse +OriginRequestPolicyList +OriginRequestPolicyQueryStringsConfig +OriginRequestPolicySummary +OriginShield +OriginShieldRegion +OriginSnapshot +OriginSslProtocols +Original +OriginalCountryCodeIso2 +OriginalIops +OriginalMessage +OriginalMessageId +OriginalMultiAttachEnabled +OriginalName +OriginalParent +OriginalPhoneNumber +OriginalRuleSetName +OriginalSchema +OriginalScore +OriginalSize +OriginalSnapshotCreateTime +OriginalSourceFileSystemArn +OriginalStatusCode +OriginalTextCharacters +OriginalThroughput +OriginalTypeArn +OriginalTypeName +OriginalVolumeType +Origination +OriginationIdentities +OriginationIdentity +OriginationIdentityArn +OriginationIdentityMetadata +OriginationNumber +OriginationPhoneNumber +OriginationRoute +Origins +Os +OsArchitecture +OsType +OsVersion +OtaaV1_0_x +OtaaV1_1 +Other +OtherCategories +OtherCount +OtherMetadataValueList +OtherMetadataValueListItem +OtherName +OtherNonCompliantCount +OtherPolicies +Otp +OutOfCapacityException +OutPutS3Location +OutboundCall +OutboundCallConfig +OutboundCallerConfig +OutboundCallerIdName +OutboundCallerIdNumberId +OutboundCalling +OutboundCallsEnabled +OutboundConnection +OutboundConnectionStatus +OutboundContactNotPermittedException +OutboundCrossClusterSearchConnection +OutboundCrossClusterSearchConnectionStatus +OutboundEventsHTTPSEndpoint +OutboundFlowId +OutboundHeader +OutboundHostName +OutboundIp +OutboundMMS +OutboundSMS +OutboundShipment +Outcome +OutgoingCertificate +OutgoingDukptAttributes +OutgoingEncryptionAttributes +OutgoingKeyIdentifier +OutgoingTranslationAttributes +OutlierDetection +OutlierVisibility +OutlineColor +OutlineSize +Outpost +OutpostArn +OutpostCapable +OutpostConfigRequest +OutpostConfigResponse +OutpostId +OutpostIdentifier +OutpostIdentifierFilter +OutpostMode +OutpostOfflineException +OutpostResolver +OutpostResolvers +Outposts +OutpostsId +Output +OutputArn +OutputArtifact +OutputArtifacts +OutputArtifactsToRemove +OutputAttribute +OutputBand +OutputBands +OutputBucket +OutputBucketName +OutputBytes +OutputChannel +OutputChannelMapping +OutputChannels +OutputColumn +OutputColumnName +OutputColumns +OutputCompression +OutputConfig +OutputConfigInput +OutputContext +OutputDataConfig +OutputDataType +OutputDatasetS3Uri +OutputDescription +OutputDescriptions +OutputDestination +OutputDestinationSettings +OutputDetail +OutputDetails +OutputEncryptionKMSKeyId +OutputFileUriValue +OutputFilter +OutputFormat +OutputFormatConfiguration +OutputFormatOptions +OutputGroup +OutputGroupDetail +OutputGroupDetails +OutputGroupSettings +OutputGroups +OutputId +OutputKey +OutputKeyPrefix +OutputKeys +OutputLocation +OutputLocationRef +OutputLocationType +OutputLockingMode +OutputLockingSettings +OutputLogEvent +OutputName +OutputNotebookFormat +OutputNotebookS3Location +OutputNotebookS3LocationForOutput +OutputNotebookS3LocationFromInput +OutputNotebookURI +OutputPackageName +OutputPackageVersion +OutputParameter +OutputParameters +OutputRectangle +OutputReservedInstancesWillExpireAt +OutputResolution +OutputResolutionResamplingInput +OutputResolutionStackInput +OutputResources +OutputRows +OutputS3BucketName +OutputS3KeyPrefix +OutputS3Location +OutputS3Object +OutputS3Path +OutputS3Region +OutputS3Uri +OutputSchemaVersion +OutputSchemas +OutputSdt +OutputSelection +OutputSerialization +OutputSettings +OutputSource +OutputSourceId +OutputSourceType +OutputStage +OutputStartIndex +OutputTimingSource +OutputType +OutputUpdate +OutputUpdates +OutputUri +OutputUrl +OutputValue +OutputVariablesSizeExceededException +Outputs +OutsideIpAddress +OutsideIpAddressType +OutstandingVoteCount +Overage +OverallBestTrainingJob +OverallPlacement +OverallSeverity +OverallTestResultItem +OverallTestResults +OverallVolume +OverflowColumnHeaderVisibility +Overlap +OverlapStatus +Overridden +OverriddenAction +OverriddenContactIds +OverriddenParameters +Override +OverrideAction +OverrideAlreadySetException +OverrideArtifactName +OverrideButtonConfiguration +OverrideDatasetParameterOperation +OverrideOptions +OverrideParameters +OverridePullRequestApprovalRulesInput +OverrideRejection +OverrideStatusRequiredException +Overrides +OversizeHandling +OversizedConfigurationItemException +Overview +Overwrite +OverwriteExisting +OverwriteExtensionPack +OverwriteMode +Owner +OwnerAccount +OwnerAccountId +OwnerAlias +OwnerDirectoryDescription +OwnerDirectoryId +OwnerFilter +OwnerGid +OwnerId +OwnerIdentifier +OwnerIds +OwnerInformation +OwnerName +OwnerSetting +OwnerType +OwnerUid +Owners +OwnershipControls +OwnershipControlsRule +OwnershipType +OwnershipVerificationCertificateArn +OwnershipVerificationStatus +OwningAccount +OwningAccountId +OwningAccounts +OwningService +P10 +P50 +P75 +P85 +P90 +P95 +P95Metrics +P99 +P999 +PENDING +PIIDetection +PITPolicyRule +PSTNDialIn +PSTNEnabled +PUSH +PackageAggregation +PackageAggregationResponse +PackageArn +PackageDependency +PackageDescription +PackageDetails +PackageDetailsList +PackageFilter +PackageID +PackageId +PackageImportJob +PackageImportJobInputConfig +PackageImportJobOutput +PackageImportJobOutputConfig +PackageImportJobs +PackageListItem +PackageManager +PackageName +PackageObject +PackageObjects +PackageOriginConfiguration +PackageOriginRestrictions +PackagePatchVersion +PackageSource +PackageStatus +PackageSummary +PackageType +PackageVersion +PackageVersionDescription +PackageVersionError +PackageVersionHistory +PackageVersionHistoryList +PackageVersionInputConfig +PackageVersionOrigin +PackageVersionOutputConfig +PackageVersionSummary +PackageVulnerabilityDetails +Packages +Packaging +PackagingConfiguration +PackagingConfigurationId +PackagingConfigurations +PackagingGroup +PackagingGroupId +PackagingGroups +PackagingType +PackedPolicySize +PackedPolicyTooLargeException +PacketField +PacketHeaderStatement +PacketHeaderStatementRequest +PacketIdentifiersMap +PacketLength +PacketsPerSecond +PadVideo +Padding +PaddingControl +PaddingPolicy +PaddingTolerance +PaddingType +Page +PageArn +PageBreakConfiguration +PageClassification +PageConfiguration +PageFieldMappings +PageId +PageNumber +PageResolutions +PageSize +PageSizeBytes +PageToken +PageType +PageTypes +PagerDutyConfiguration +PagerDutyIncidentConfiguration +PagerDutyIncidentDetail +Pages +PaginatedLayoutConfiguration +PaginatedReportOptions +PaginationConfiguration +PaginationToken +PaginationTokenExpiredException +PanSequenceNumber +PanelConfiguration +PanelTitleOptions +PaperCanvasSizeOptions +PaperMargin +PaperOrientation +PaperSize +Par +ParControl +ParDenominator +ParNumerator +ParallelAsmReadThreads +ParallelDataConfig +ParallelDataDataLocation +ParallelDataNames +ParallelDataProperties +ParallelDataPropertiesList +ParallelLoadThreads +Parallelism +ParallelismConfiguration +ParallelismConfigurationDescription +ParallelismConfigurationUpdate +ParallelismPerKPU +ParallelismPerKPUUpdate +ParallelismUpdate +ParallelizationFactor +Param +Parameter +ParameterAdditions +ParameterAlreadyExists +ParameterApplyErrorDescription +ParameterApplyStatus +ParameterAttribute +ParameterConstraints +ParameterControl +ParameterControlId +ParameterControls +ParameterDateTimePickerControl +ParameterDeclaration +ParameterDeclarations +ParameterDefinition +ParameterDefinitions +ParameterDropDownControl +ParameterFilters +ParameterGroup +ParameterGroupAlreadyExistsFault +ParameterGroupFamily +ParameterGroupName +ParameterGroupNames +ParameterGroupNotFoundFault +ParameterGroupQuotaExceededFault +ParameterGroupStatus +ParameterGroups +ParameterHistory +ParameterInlinePolicy +ParameterKey +ParameterLimitExceeded +ParameterListControl +ParameterMapEntry +ParameterMapping +ParameterMaxVersionLimitExceeded +ParameterMetadata +ParameterName +ParameterNameValue +ParameterNameValues +ParameterNames +ParameterNotFound +ParameterObject +ParameterOverrides +ParameterPatternMismatchException +ParameterRange +ParameterRanges +ParameterRemovals +ParameterSelectableValues +ParameterSliderControl +ParameterSpec +ParameterStringFilter +ParameterTextAreaControl +ParameterTextFieldControl +ParameterType +ParameterValue +ParameterValueConfigurations +ParameterValueType +ParameterValues +ParameterVersion +ParameterVersionLabelLimitExceeded +ParameterVersionNotFound +ParameterizedStatement +Parameters +ParametersFilter +ParametersInCacheKeyAndForwardedToOrigin +ParametersToDelete +ParametersToRemove +ParametersValidTo +ParametersValidUntilTimestamp +ParametricCloudWatchMonitoringConfiguration +ParametricConfigurationOverrides +ParametricMonitoringConfiguration +ParametricS3MonitoringConfiguration +Pardot +PardotConnectorProfileCredentials +PardotConnectorProfileProperties +PardotSourceProperties +Parent +ParentArn +ParentAutomationExecutionId +ParentBotNetwork +ParentChangeSetId +ParentCommitDoesNotExistException +ParentCommitIdOutdatedException +ParentCommitIdRequiredException +ParentComponent +ParentEntityUpdateRequest +ParentFolderArn +ParentFolderId +ParentGroupId +ParentHandshakeId +ParentHyperParameterTuningJob +ParentHyperParameterTuningJobs +ParentId +ParentJobId +ParentLinks +ParentName +ParentNotFoundException +ParentPid +ParentReadinessScopes +ParentRecoveryPointArn +ParentReference +ParentSavingsPlanOffering +ParentShardId +ParentShards +ParentSnapshotId +ParentUuid +ParentVolumeId +ParentZoneId +ParentZoneName +Parents +ParentsOfAlarmName +Parquet +ParquetConfiguration +ParquetSerDe +ParquetTimestampInMillisecond +ParquetVersion +ParseFailures +ParsedInputRecords +ParsingException +Part +PartListElement +PartNumber +PartNumberMarker +PartOfSpeech +PartOfSpeechTag +PartSizeInBytes +PartialFailure +PartialFailureMessage +PartialFailureReasons +PartialMatch +PartialMatches +PartialResultsStability +Participant +ParticipantCredentials +ParticipantDetails +ParticipantDetailsToAdd +ParticipantId +ParticipantPhoneNumbers +ParticipantRole +ParticipantSummary +ParticipantTimerConfigList +ParticipantTimerConfiguration +ParticipantToken +ParticipantTokenConfiguration +ParticipantTokenCredentials +Participants +ParticipatingGateways +ParticipatingResource +ParticipatingServer +Parties +Partition +PartitionBy +PartitionColumn +PartitionColumns +PartitionCount +PartitionEndDate +PartitionError +PartitionIncludeSchemaTable +PartitionIndex +PartitionIndexDescriptor +PartitionIndexDescriptorList +PartitionIndexes +PartitionInput +PartitionInputList +PartitionKey +PartitionKeyPath +PartitionKeys +PartitionLoadFrequency +PartitionNumber +PartitionObjects +PartitionPredicate +PartitionSerialList +PartitionStartDate +PartitionValueList +PartitionValues +Partitions +PartitionsToDelete +PartitionsToGet +PartnerAccountId +PartnerEventSource +PartnerEventSourceAccount +PartnerEventSourceAccounts +PartnerEventSources +PartnerIntegrationInfo +PartnerIntegrationInfoList +PartnerIntegrationInputMessage +PartnerIntegrationOutputMessage +PartnerName +PartnerNotFoundFault +PartnerProfileId +PartnerType +PartnerWatermarking +Parts +PartsCount +PartyName +PartyType +PartyTypeString +PassThroughSettings +PassiveIp +Passphrase +PassthroughBehavior +PassthroughControl +Password +PasswordCount +PasswordData +PasswordField +PasswordLastUsed +PasswordLength +PasswordParam +PasswordPolicy +PasswordPolicyType +PasswordPolicyViolationException +PasswordResetRequired +PasswordResetRequiredException +PasswordReusePrevention +PasswordVerifier +Passwords +PatInterval +Patch +PatchBaselineId +PatchBaselineIdentity +PatchComplianceData +PatchDocument +PatchFilter +PatchFilterGroup +PatchFilters +PatchGroup +PatchGroupPatchBaselineMapping +PatchGroups +PatchLevel +PatchOperation +PatchOrchestratorFilter +PatchRule +PatchRuleGroup +PatchRules +PatchSet +PatchSource +PatchStatus +PatchSummary +PatchVersion +Patches +Path +PathComponent +PathDoesNotExistException +PathFilter +PathFormat +PathId +PathLoss +PathMatch +PathName +PathOptions +PathParameterValues +PathPattern +PathPatternConditionConfig +PathPatternConfig +PathPrefix +PathRequestFilter +PathRequiredException +PathResourceToId +PathStatement +PathStatementRequest +PathToObjectIdentifiers +PathToObjectIdentifiersList +Paths +Pattern +PatternName +PatternSetName +PatternTypeLimits +Patterns +PauseCampaignRequest +PauseCluster +PauseClusterMessage +PauseClusterResult +PauseReplicationRequest +PauseServiceRequest +PauseServiceResponse +PauseStateScheduleActionSettings +PauseStateSettings +Payer +PayerResponsibility +Payload +PayloadConfig +PayloadData +PayloadFormatVersion +PayloadPart +PayloadTooLargeException +PayloadType +PaymentDue +PaymentOption +PaymentTerm +Pci +PciId +PcrControl +PcrPeriod +PcrPid +PdfReport +PeakBandwidthInGbps +PeakCalculation +PeakRequestsPerSecond +PeerAccountId +PeerAddress +PeerAsn +PeerBgpAsn +PeerCoreNetworkId +PeerEndpoint +PeerEventEndpoint +PeerLogs +PeerOwnerId +PeerRegion +PeerTransitGatewayId +PeerVpcAwsAccountId +PeerVpcId +PeerVpcResult +Peering +PeeringAttachmentId +PeeringAttachmentStatus +PeeringConnectionOptions +PeeringConnectionOptionsRequest +PeeringId +PeeringOptions +PeeringStatus +PeeringTgwInfo +PeeringType +Peerings +PemEncodedCertificate +Pending +PendingActions +PendingAggregationRequest +PendingAggregationRequests +PendingAuthenticationStrategy +PendingCapacity +PendingChange +PendingChanges +PendingCloudWatchLogsExports +PendingCloudwatchLogsExports +PendingCreateStandbyWorkspacesRequest +PendingDataReplicationMetadata +PendingDataReplicationMode +PendingDeletion +PendingDeletionWindowInDays +PendingDeploymentSummary +PendingEngineVersion +PendingExpirationSubscribedDomains +PendingHostInstanceType +PendingHuman +PendingImportedDeviceCount +PendingLdapServerMetadata +PendingLogDeliveryConfiguration +PendingLogs +PendingMaintenance +PendingMaintenanceAction +PendingMaintenanceActionDetails +PendingMaintenanceActions +PendingMaintenanceActionsMessage +PendingModifiedRelationalDatabaseValues +PendingModifiedServiceUpdate +PendingModifiedValues +PendingProductionVariantSummary +PendingProperties +PendingRequests +PendingResource +PendingReviewVersion +PendingSecurityGroups +PendingStandbyRequests +PendingTaskCount +PendingUpdates +PendingVerification +PendingWindowInDays +PerHourPartition +PerObjectStatus +PerUnitStorageThroughput +PercentComplete +PercentDone +PercentEnabled +PercentOfClientLocationImpacted +PercentOfGraphUtilization +PercentOfGraphUtilizationUpdatedTime +PercentOfTotalTrafficImpacted +PercentPair +PercentProgress +PercentRange +PercentTraffic +PercentVisibleRange +Percentage +PercentageComplete +PercentageCompleteOnRollback +PercentageDisplayFormatConfiguration +PercentageValue +Percentile +PercentileAggregation +PercentileValue +PerformAutoML +PerformCheckOnly +PerformHPO +Performance +PerformanceInsightsEnabled +PerformanceInsightsKMSKeyId +PerformanceInsightsKmsKeyId +PerformanceInsightsMetric +PerformanceInsightsMetricDimensionGroup +PerformanceInsightsMetricQuery +PerformanceInsightsMetrics +PerformanceInsightsMetricsDetail +PerformanceInsightsReferenceComparisonValues +PerformanceInsightsReferenceData +PerformanceInsightsReferenceMetric +PerformanceInsightsReferenceScalar +PerformanceInsightsRetentionPeriod +PerformanceInsightsStat +PerformanceLocalHealthEventsConfig +PerformanceMeasurement +PerformanceMetrics +PerformanceMode +PerformanceScoreThreshold +Period +PeriodAlignment +PeriodInSeconds +PeriodOverPeriod +PeriodOverPeriodComputation +PeriodSize +PeriodTimeGranularity +PeriodToDate +PeriodToDateComputation +PeriodTriggers +PeriodType +PeriodUnit +PeriodValue +PeriodsBackward +PeriodsForward +Permanent +PermanentDeletionTimeInDays +PermanentRestore +Permission +PermissionAlreadyExistsException +PermissionConfiguration +PermissionEntry +PermissionGroup +PermissionGroupByUser +PermissionGroupParams +PermissionInfo +PermissionLimitExceededException +PermissionModel +PermissionPolicy +PermissionSet +PermissionSetArn +PermissionSetProvisioningStatus +PermissionSetProvisioningStatusMetadata +PermissionSets +PermissionSetsProvisioningStatus +PermissionState +PermissionType +PermissionTypeMismatchException +PermissionValues +PermissionVersionsLimitExceededException +Permissions +PermissionsBoundary +PermissionsBoundaryArn +PermissionsBoundaryDecisionDetail +PermissionsBoundaryPolicyInputList +PermissionsBoundaryType +PermissionsBoundaryUsageCount +PermissionsMode +PermissionsWithGrantOption +PermittedFileTypes +PermittedPublicSecurityGroupRuleRanges +Persistence +Persistent +PersistentChat +PersistentStorage +PersistentStorageConfiguration +Person +PersonDetail +PersonDetection +PersonMatch +Persona +PersonalEmailAddress +PersonalPIN +PersonalizationThresholdSeconds +Personas +PersonasSummary +Persons +PersonsIndeterminate +PersonsWithRequiredEquipment +PersonsWithoutRequiredEquipment +Phase +Phase1DHGroupNumbers +Phase1DHGroupNumbersListValue +Phase1DHGroupNumbersRequestListValue +Phase1DhGroupNumbers +Phase1EncryptionAlgorithms +Phase1EncryptionAlgorithmsListValue +Phase1EncryptionAlgorithmsRequestListValue +Phase1IntegrityAlgorithms +Phase1IntegrityAlgorithmsListValue +Phase1IntegrityAlgorithmsRequestListValue +Phase1LifetimeSeconds +Phase2DHGroupNumbers +Phase2DHGroupNumbersListValue +Phase2DHGroupNumbersRequestListValue +Phase2DhGroupNumbers +Phase2EncryptionAlgorithms +Phase2EncryptionAlgorithmsListValue +Phase2EncryptionAlgorithmsRequestListValue +Phase2IntegrityAlgorithms +Phase2IntegrityAlgorithmsListValue +Phase2IntegrityAlgorithmsRequestListValue +Phase2LifetimeSeconds +PhaseContext +PhaseControl +Phases +PhoneConfig +PhoneNumber +PhoneNumberArn +PhoneNumberAssociation +PhoneNumberCapabilities +PhoneNumberCountries +PhoneNumberCountry +PhoneNumberCountryCode +PhoneNumberCountryCodes +PhoneNumberDescription +PhoneNumberError +PhoneNumberErrors +PhoneNumberField +PhoneNumberFields +PhoneNumberFilter +PhoneNumberId +PhoneNumberIds +PhoneNumberInformation +PhoneNumberOrder +PhoneNumberOrderId +PhoneNumberOrders +PhoneNumberPoolCountries +PhoneNumberPrefix +PhoneNumberQuickConnectConfig +PhoneNumberStatus +PhoneNumberSummary +PhoneNumberSummaryList +PhoneNumberType +PhoneNumberTypes +PhoneNumberValidateRequest +PhoneNumberValidateResponse +PhoneNumbers +PhoneType +PhoneTypeCode +Phrases +PhysicalConnectionRequirements +PhysicalId +PhysicalNetworkInterface +PhysicalResource +PhysicalResourceId +PhysicalResourceIdContext +PhysicalResourceIdContextKeyValuePair +PhysicalTableId +PhysicalTableMap +PickupDetails +Pid +PidMode +Pids +PieChartAggregatedFieldWells +PieChartConfiguration +PieChartFieldWells +PieChartSortConfiguration +PieChartVisual +PiiEntitiesDetectionJobFilter +PiiEntitiesDetectionJobProperties +PiiEntitiesDetectionJobPropertiesList +PiiEntity +PiiEntityTypes +PiiOutputDataConfig +PiiType +PillarDifference +PillarDifferences +PillarId +PillarMetric +PillarName +PillarNotes +PillarPriorities +PillarReviewSummaries +PillarReviewSummary +Pillars +PilotPower +PinBlock +PinBlockFormat +PinData +PinDataLength +PinOffset +PinValidationData +PinValidationDataPadCharacter +PinVerificationKeyIndex +PingResponse +PingSlotDr +PingSlotFreq +PingSlotPeriod +PingStatus +Pinned +PinnedFieldOptions +PinnedLeftFields +PinpointDestination +Pipe +PipeEnrichmentHttpParameters +PipeEnrichmentParameters +PipeSourceActiveMQBrokerParameters +PipeSourceDynamoDBStreamParameters +PipeSourceKinesisStreamParameters +PipeSourceManagedStreamingKafkaParameters +PipeSourceParameters +PipeSourceRabbitMQBrokerParameters +PipeSourceSelfManagedKafkaParameters +PipeSourceSqsQueueParameters +PipeTargetBatchJobParameters +PipeTargetCloudWatchLogsParameters +PipeTargetEcsTaskParameters +PipeTargetEventBridgeEventBusParameters +PipeTargetHttpParameters +PipeTargetKinesisStreamParameters +PipeTargetLambdaFunctionParameters +PipeTargetParameters +PipeTargetRedshiftDataParameters +PipeTargetSageMakerPipelineParameters +PipeTargetSqsQueueParameters +PipeTargetStateMachineParameters +Pipeline +PipelineActivity +PipelineArn +PipelineBlueprint +PipelineBlueprintSummary +PipelineConfig +PipelineConfigurationBody +PipelineContext +PipelineDeclaration +PipelineDefinition +PipelineDefinitionS3Location +PipelineDeletedException +PipelineDescription +PipelineDetail +PipelineDetails +PipelineDisplayName +PipelineExecution +PipelineExecutionArn +PipelineExecutionDescription +PipelineExecutionDisplayName +PipelineExecutionFailureReason +PipelineExecutionNotFoundException +PipelineExecutionNotStoppableException +PipelineExecutionStatus +PipelineExecutionStep +PipelineExecutionStepMetadata +PipelineExecutionSteps +PipelineExecutionSummaries +PipelineExecutionSummary +PipelineExperimentConfig +PipelineId +PipelineIdName +PipelineInfo +PipelineLockingSettings +PipelineMetadata +PipelineName +PipelineNameInUseException +PipelineNamePrefix +PipelineNotFoundException +PipelineObject +PipelineOutputConfig +PipelineParameterList +PipelineParameters +PipelinePauseStateSettings +PipelineStatus +PipelineStatusReason +PipelineSummaries +PipelineSummary +PipelineVersionNotFoundException +Pipelines +PipelinesRunningCount +Pipes +Pitch +PivotFieldSortOptions +PivotTableAggregatedFieldWells +PivotTableCellConditionalFormatting +PivotTableConditionalFormatting +PivotTableConditionalFormattingOption +PivotTableConditionalFormattingScope +PivotTableConfiguration +PivotTableDataPathOption +PivotTableFieldCollapseStateOption +PivotTableFieldCollapseStateTarget +PivotTableFieldOption +PivotTableFieldOptions +PivotTableFieldSubtotalOptions +PivotTableFieldWells +PivotTableOptions +PivotTablePaginatedReportOptions +PivotTableRowsLabelOptions +PivotTableSortBy +PivotTableSortConfiguration +PivotTableTotalOptions +PivotTableVisual +PivotTotalOptions +PixelAnomaly +PixelPercent +Place +PlaceGeometry +PlaceId +PlacedPlayerSession +PlacedPlayerSessions +Placeholder +PlaceholderOptions +Placement +PlacementArn +PlacementConstraint +PlacementConstraints +PlacementDescription +PlacementGroup +PlacementGroupArn +PlacementGroupConfig +PlacementGroupConfigs +PlacementGroupInfo +PlacementGroups +PlacementId +PlacementResponse +PlacementStatistics +PlacementStrategies +PlacementStrategy +PlacementSummary +PlacementTemplate +PlacementTenancy +PlacementType +PlainText +PlainTextMessage +PlainTextMessageType +Plaintext +Plan +PlanId +PlanName +PlanType +PlannedBudgetLimits +PlannedEndTime +PlannedStartTime +PlanningStatistics +PlanningTimeMillis +Platform +PlatformApplication +PlatformApplicationArn +PlatformApplicationDisabledException +PlatformApplications +PlatformArn +PlatformBranchLifecycleState +PlatformBranchName +PlatformBranchSummary +PlatformBranchSummaryList +PlatformCategory +PlatformCommand +PlatformDefinitionBundle +PlatformDescription +PlatformDetails +PlatformDevice +PlatformDifferences +PlatformFilter +PlatformFramework +PlatformIdentifier +PlatformInput +PlatformLifecycleState +PlatformName +PlatformNotSupportedException +PlatformOwner +PlatformProgrammingLanguage +PlatformScriptKey +PlatformSoftwareVersion +PlatformStatus +PlatformSummary +PlatformSummaryList +PlatformTaskDefinitionIncompatibilityException +PlatformType +PlatformTypes +PlatformUnknownException +PlatformVersion +PlatformVersionStillReferencedException +Platforms +PlayReadyDrm +Playback +PlaybackCompletionEvent +PlaybackConfiguration +PlaybackConfigurationArn +PlaybackConfigurationName +PlaybackDeviceCompatibility +PlaybackEndpointPrefix +PlaybackInterruptionEvent +PlaybackKeyPair +PlaybackKeyPairSummary +PlaybackMode +PlaybackUrl +Player +PlayerAttributes +PlayerData +PlayerDataMap +PlayerId +PlayerIds +PlayerLatencies +PlayerLatency +PlayerLatencyPolicies +PlayerLatencyPolicy +PlayerSession +PlayerSessionCreationPolicy +PlayerSessionId +PlayerSessionStatusFilter +PlayerSessions +Players +Playlist +PlaylistType +PlaylistWindowSeconds +Playlists +Plugin +PluginDescription +PluginName +PluginSummary +PluginsS3ObjectVersion +PluginsS3Path +PmtInterval +PmtPid +PnOffset +PoAttributes +PoDetailAttributes +Point +PointInTimeRecovery +PointInTimeRecoveryDescription +PointInTimeRecoveryEnabled +PointInTimeRecoverySpecification +PointInTimeRecoveryStatus +PointInTimeRecoverySummary +PointInTimeRecoveryUnavailableException +PointInTimeRestoreNotEnabledFault +PointOfInterest +PointStyleOptions +PointsOfInterest +PoisEndpoint +Policies +PoliciesGrantingServiceAccess +PoliciesLimitExceededException +PoliciesType +Policy +PolicyARN +PolicyARNType +PolicyArn +PolicyArns +PolicyAttachment +PolicyAttribute +PolicyAttributeDescription +PolicyAttributeDescriptions +PolicyAttributeTypeDescription +PolicyAttributeTypeDescriptions +PolicyAttributes +PolicyChangesInProgressException +PolicyComplianceDetail +PolicyComplianceStatus +PolicyComplianceStatusList +PolicyContent +PolicyCountLimitExceededException +PolicyDescription +PolicyDescriptions +PolicyDescriptorType +PolicyDetail +PolicyDetails +PolicyDocument +PolicyDurationSeconds +PolicyEnabled +PolicyEnforcedException +PolicyErrorException +PolicyErrors +PolicyEvaluationException +PolicyExistsCondition +PolicyFilter +PolicyGeneration +PolicyGenerationDetails +PolicyGrantingServiceAccess +PolicyGroup +PolicyGroups +PolicyHash +PolicyHashCondition +PolicyId +PolicyIds +PolicyInJson +PolicyInUseException +PolicyInformation +PolicyInputList +PolicyItem +PolicyLengthExceededException +PolicyLevels +PolicyList +PolicyName +PolicyNames +PolicyNotAttachableException +PolicyNotAttachedException +PolicyNotFound +PolicyNotFoundException +PolicyOption +PolicyOwner +PolicyParameter +PolicyPeriodInMinutes +PolicyQualifierId +PolicyQualifierInfo +PolicyQualifiers +PolicyReference +PolicyReferenceName +PolicyRevisionId +PolicyRole +PolicyRoles +PolicyRule +PolicyRuleNumber +PolicyRuntime +PolicySchema +PolicySizeLimitExceededException +PolicySourceArn +PolicyStatus +PolicyStoreItem +PolicySummary +PolicyTargetSummary +PolicyTemplateItem +PolicyText +PolicyToPath +PolicyToPathList +PolicyType +PolicyTypeAlreadyEnabledException +PolicyTypeDescription +PolicyTypeDescriptions +PolicyTypeName +PolicyTypeNames +PolicyTypeNotAvailableForOrganizationException +PolicyTypeNotEnabledException +PolicyTypeNotFoundException +PolicyTypeScope +PolicyTypeSummary +PolicyTypes +PolicyUpdateToken +PolicyUsageFilter +PolicyUser +PolicyUsers +PolicyValidationPassed +PolicyVariables +PolicyVersion +PolicyVersionId +PolicyVersionIdentifier +PolicyVersionList +PoliticalView +PollForActivityTaskInput +PollForDecisionTaskInput +PollForJobsInput +PollForJobsOutput +PollForTaskInput +PollForTaskOutput +PollForThirdPartyJobsInput +PollForThirdPartyJobsOutput +PollTimeoutMs +PollingTime +Polygon +PolygonGeometryInput +PoolARN +PoolARNs +PoolAddressRange +PoolAddressRanges +PoolArn +PoolCidrBlock +PoolCidrBlocks +PoolCidrs +PoolCount +PoolDepth +PoolEntryDate +PoolFilter +PoolId +PoolIds +PoolInfo +PoolInformation +PoolInfos +PoolName +PoolOriginationIdentitiesFilter +PoolSize +PoolState +PoolStatus +PoolTagSpecifications +Pools +PopulationSize +Port +PortForwardingConfig +PortInfo +PortMapping +PortMappings +PortName +PortNumber +PortOverride +PortOverrides +PortProbeAction +PortProbeDetail +PortProbeDetails +PortRange +PortRangeFilter +PortRangeFromTo +PortRanges +PortRequired +PortSet +PortSets +Portal +PortalResource +PortalStatus +PortalSummary +PortfolioDetail +PortfolioDetails +PortfolioId +PortfolioShareDetail +PortfolioShareDetails +PortfolioShareToken +PortfolioShareType +Pose +Position +PositionConfigurationItem +PositionConfigurationList +PositionFiltering +PositionProperties +PositionSolverConfigurations +PositionSolverDetails +PositionalAccuracy +PositionalConstraint +Positioning +Positive +PositiveColor +PosixPermissions +PosixProfile +PosixUser +PossibleRemediationAction +PossibleRemediationActions +PossibleSecurityGroupRemediationActions +PostAction +PostAgentProfileRequest +PostAnalyticsProcessorSourceUri +PostAuthentication +PostAuthenticationLoginBanner +PostCallAnalyticsSettings +PostCommentForComparedCommitInput +PostCommentForComparedCommitOutput +PostCommentForPullRequestInput +PostCommentForPullRequestOutput +PostCommentReplyInput +PostCommentReplyOutput +PostConfirmation +PostContentRequest +PostContentResponse +PostDialogCodeHookInvocationSpecification +PostExtractionHookConfiguration +PostFilterSharpenStrength +PostFilterSharpening +PostFulfillmentStatusSpecification +PostLaunchActions +PostLaunchActionsStatus +PostProcessFirewallManagerRuleGroups +PostSetupScriptDetails +PostTemporalSharpening +PostTemporalSharpeningStrength +PostTextRequest +PostTextResponse +PostToConnectionRequest +PostTrainingConstraints +PostTrainingReport +PostalCode +PostgreSQLCatalogSource +PostgreSQLCatalogTarget +PostgreSQLSettings +PostgreSqlDataProviderSettings +PostgreSqlParameters +PostureComplianceStatuses +PotentialMatches +PowerConnector +PowerDrawKva +PowerFeedDrop +PowerKva +PowerPhase +PrAllowed +PreAction +PreAuthentication +PreAuthenticationLoginBanner +PreCoPassword +PreExtractionHookConfiguration +PreHumanTaskLambdaArn +PreProcessFirewallManagerRuleGroups +PreSharedKey +PreSignUp +PreSignedLogUrl +PreSignedUrl +PreTokenGeneration +PreTrainingConstraints +PreTrainingReport +Precedence +Precision +PrecisionRecallTradeoff +PreconditionFailed +PreconditionFailedException +PreconditionNotMetException +PreconditionsFailedException +Predecessor +PredecessorRuns +PredecessorsIncluded +Predefined +PredefinedHierarchy +PredefinedIndices +PredefinedLoadMetricSpecification +PredefinedLoadMetricType +PredefinedMetricPairSpecification +PredefinedMetricSpecification +PredefinedMetricType +PredefinedScalingMetricSpecification +PredefinedScalingMetricType +Predicate +PredicateList +Predicates +PredictEndpoint +PredictInput +PredictOutput +PredictedCapacity +PredictedIntent +PredictedItem +Prediction +PredictionExplanations +PredictionInterval +PredictionIntervalLevel +PredictionIntervalLowerBound +PredictionIntervalUpperBound +PredictionTimeRange +Predictions +PredictiveDialerConfig +PredictiveScalingConfiguration +PredictiveScalingCustomizedCapacityMetric +PredictiveScalingCustomizedLoadMetric +PredictiveScalingCustomizedScalingMetric +PredictiveScalingMaxCapacityBehavior +PredictiveScalingMaxCapacityBuffer +PredictiveScalingMetricSpecification +PredictiveScalingMode +PredictiveScalingPredefinedLoadMetric +PredictiveScalingPredefinedMetricPair +PredictiveScalingPredefinedScalingMetric +PredictorArn +PredictorBacktestExportJobArn +PredictorBacktestExportJobName +PredictorBacktestExportJobSummary +PredictorBacktestExportJobs +PredictorBaseline +PredictorEvaluationResults +PredictorEvent +PredictorExecution +PredictorExecutionDetails +PredictorExecutions +PredictorMonitorEvaluation +PredictorMonitorEvaluations +PredictorName +PredictorNotMountedException +PredictorSummary +Predictors +PrefectureOrDistrict +Preference +Preferences +Preferred +PreferredAuthenticationMethod +PreferredAvailabilityZone +PreferredAvailabilityZones +PreferredBackupWindow +PreferredCacheClusterAZs +PreferredChannelPipeline +PreferredFileServerIp +PreferredInstanceType +PreferredLanguage +PreferredMaintenanceWindow +PreferredMfa +PreferredMfaSetting +PreferredOutpostArn +PreferredOutpostArns +PreferredProtocol +PreferredSubnetId +PrefetchConsumption +PrefetchRetrieval +PrefetchSchedule +Prefix +PrefixConfig +PrefixForAllResources +PrefixLevel +PrefixLevelStorageMetrics +PrefixList +PrefixListArn +PrefixListAssociation +PrefixListAssociations +PrefixListEntry +PrefixListId +PrefixListIds +PrefixListName +PrefixListOwnerId +PrefixLists +PrefixesCompleted +PrefixesFound +Preload +PreloadDataConfig +PreloadDataType +PrepareDuration +PrepareQueryRequest +PrepareQueryResponse +PrepareStatus +PreparedStatement +PreparedStatementNames +PreparedStatementSummary +PreparedStatements +PresenterOnlyConfiguration +PresenterPosition +PreserveClientIp +PreserveDeletedFiles +PreserveDevices +PreserveExistingData +PreserveTransactions +PreservedExistingData +Preset +PresetDeploymentConfig +PresetDeploymentOutput +PresetDeploymentType +PresetId +PresetSettings +PresetSpeke20Audio +PresetSpeke20Video +PresetWatermark +PresetWatermarkId +Presets +PresignedUrl +PresignedUrlConfig +PrestoParameters +PreventUserExistenceErrors +Preview +PreviewAgentsRequest +PreviewAgentsResponse +PreviewGenerationInProgressException +PreviewNextCidr +PreviewOverride +PreviousActiveModelVersion +PreviousActiveModelVersionArn +PreviousActiveVersion +PreviousActiveVersionArn +PreviousAppsList +PreviousContactId +PreviousEarthObservationJobArn +PreviousFleetState +PreviousInvocationTime +PreviousLineItemId +PreviousModelVersionActivatedAt +PreviousOrderId +PreviousPassword +PreviousProtocolsList +PreviousRunId +PreviousSlotEndTime +PreviousSpotFleetRequestState +PreviousState +PreviousStatus +PreviousValue +PreviousValues +PreviousVersion +Price +PriceClass +PriceList +PriceListArn +PriceLists +PricePerUnit +PriceSchedule +PriceScheduleSpecification +PriceSchedules +PriceUnits +PriceWithCurrency +Prices +PricingDetail +PricingDetails +PricingPlan +PricingPlanArn +PricingPlanArns +PricingPlanDataSource +PricingPlanListElement +PricingPlans +PricingRuleArn +PricingRuleArns +PricingRuleListElement +PricingRules +Primary +PrimaryAccountId +PrimaryAccountNumber +PrimaryAvailabilityZone +PrimaryBackground +PrimaryBtn +PrimaryClusterId +PrimaryContainer +PrimaryDistributionId +PrimaryEmail +PrimaryEmailPrefix +PrimaryEndpoint +PrimaryForeground +PrimaryHost +PrimaryIpv6 +PrimaryKey +PrimaryKeyColumnName +PrimaryKeys +PrimaryMeetingId +PrimaryMetricName +PrimaryOutpostArn +PrimaryProvisionedNumber +PrimaryRegion +PrimaryReplicationGroupId +PrimarySource +PrimaryStatus +PrimaryValue +PrimaryValueDisplayType +PrimaryValueFontConfiguration +PrimaryWorkspaceId +PrimaryYAxisDisplayOptions +PrimaryYAxisLabelOptions +Principal +PrincipalARN +PrincipalArn +PrincipalId +PrincipalIdFormat +PrincipalList +PrincipalName +PrincipalOrgID +PrincipalOrgIDs +PrincipalPermissions +PrincipalResourcePermissions +PrincipalTags +PrincipalType +Principals +PriorModelMetrics +PriorRequestNotComplete +PrioritizeBusinessGoals +PrioritizedRiskCounts +Priority +PriorityConfiguration +PriorityInUseException +PriorityOrder +Privacy +PrivacyPolicy +PrivacyProtectAdminContact +PrivacyProtectRegistrantContact +PrivacyProtectTechContact +PrivateAddress +PrivateChannelFilter +PrivateConnectionProvisioningState +PrivateDefaultScopeId +PrivateDns +PrivateDnsDetails +PrivateDnsEnabled +PrivateDnsHostnameType +PrivateDnsHostnameTypeOnLaunch +PrivateDnsName +PrivateDnsNameConfiguration +PrivateDnsNameOptions +PrivateDnsNameOptionsOnLaunch +PrivateDnsNameOptionsRequest +PrivateDnsNameOptionsResponse +PrivateDnsNameVerificationState +PrivateDnsNames +PrivateDnsNamespaceChange +PrivateDnsNamespaceProperties +PrivateDnsNamespacePropertiesChange +PrivateDnsOnlyForInboundResolverEndpoint +PrivateDnsPropertiesMutable +PrivateDnsPropertiesMutableChange +PrivateIPAddress +PrivateIPv4Address +PrivateIp +PrivateIpAddress +PrivateIpAddressConfigs +PrivateIpAddressCount +PrivateIpAddressDetails +PrivateIpAddressSpecification +PrivateIpAddresses +PrivateKey +PrivateKeyAttributes +PrivateKeyAttributesV2 +PrivateKeyAttributesV3 +PrivateKeyAttributesV4 +PrivateKeyCiphertextBlob +PrivateKeyFlags +PrivateKeyFlagsV2 +PrivateKeyFlagsV3 +PrivateKeyFlagsV4 +PrivateKeyPlaintext +PrivateKeys +PrivateLinkConfig +PrivateLinkEndpoint +PrivateMetadataPid +PrivateRegistryAccess +PrivateRegistryAccessRequest +PrivateSkillIds +PrivateTypeException +PrivateZone +Privileged +PrivilegedDelete +PrivilegedMode +ProactiveAnomalies +ProactiveAnomaly +ProactiveAnomalySummary +ProactiveEngagementStatus +ProactiveInsight +ProactiveInsightSummary +ProactiveInsights +ProactiveJoin +ProactiveOrganizationInsightSummary +Prob +ProbabilityAttribute +ProbabilityIndex +ProbabilityThresholdAttribute +Problem +ProblemDetail +ProblemDetails +ProblemId +ProblemList +ProblemType +Problems +Process +ProcessDetails +ProcessLaunchedAt +ProcessName +ProcessParentPid +ProcessPath +ProcessPid +ProcessTerminatedAt +ProcessType +ProcessedAutomationRules +ProcessedClusters +ProcessedFindings +ProcessedInputRecords +ProcessedItemCount +ProcessedRecordsCount +ProcessedSizeBytes +ProcessedUpdateAction +ProcessedUpdateActions +Processes +ProcessesType +Processing +ProcessingClusterConfig +ProcessingConfiguration +ProcessingEndTime +ProcessingFeatureStoreOutput +ProcessingInput +ProcessingInputs +ProcessingJob +ProcessingJobArn +ProcessingJobName +ProcessingJobStatus +ProcessingJobStepMetadata +ProcessingJobSummaries +ProcessingJobSummary +ProcessingOutput +ProcessingOutputConfig +ProcessingResources +ProcessingResult +ProcessingS3Input +ProcessingS3Output +ProcessingStartTime +ProcessingStatus +ProcessingStatusInfo +ProcessingStoppingCondition +ProcessingTimeMilliseconds +Processor +ProcessorConfiguration +ProcessorFeature +ProcessorFeatures +ProcessorInfo +ProcessorParameter +Processors +ProducerArn +ProducerTimestamp +Product +ProductARN +ProductArn +ProductCode +ProductCodeId +ProductCodeType +ProductCodes +ProductDescription +ProductDescriptions +ProductFamily +ProductFields +ProductId +ProductInformation +ProductInformationFilter +ProductInformationFilterComparator +ProductInformationFilterList +ProductInformationFilterName +ProductInformationFilterValue +ProductInformationList +ProductLink +ProductListingIds +ProductName +ProductSKU +ProductSource +ProductSubscriptionArn +ProductSubscriptionResourcePolicy +ProductSubscriptions +ProductTitle +ProductType +ProductUserSummaries +ProductUserSummary +ProductViewAggregationValue +ProductViewAggregations +ProductViewDetail +ProductViewDetails +ProductViewSummaries +ProductViewSummary +ProductionAccessEnabled +ProductionAccessNotGrantedException +ProductionBranch +ProductionVariant +ProductionVariantCoreDumpConfig +ProductionVariantServerlessConfig +ProductionVariantServerlessUpdateConfig +ProductionVariantStatus +ProductionVariantSummary +ProductionVariants +Products +Profanity +Profile +ProfileArn +ProfileArns +ProfileChoice +ProfileColumns +ProfileConfiguration +ProfileCount +ProfileData +ProfileDescription +ProfileDetail +ProfileDetailResponse +ProfileId +ProfileIds +ProfileIdsToBeMerged +ProfileName +ProfileNamePrefix +ProfileNotificationSummary +ProfileObjectUniqueKey +ProfileOwnerType +ProfileQuestion +ProfileQuestionUpdate +ProfileQuestions +ProfileShareSummaries +ProfileShareSummary +ProfileSummaries +ProfileSummary +ProfileTemplate +ProfileTemplateChoice +ProfileTemplateQuestion +ProfileTime +ProfileType +ProfileUrl +ProfileVersion +ProfilerConfig +ProfilerConfigForUpdate +ProfilerRuleConfiguration +ProfilerRuleConfigurations +ProfilerRuleEvaluationStatus +ProfilerRuleEvaluationStatuses +Profiles +ProfilingGroupDescription +ProfilingIntervalInMilliseconds +ProfilingParameters +ProfilingStatus +ProformaCost +ProgramCount +ProgramDateTime +ProgramDateTimeClock +ProgramDateTimeIntervalSeconds +ProgramDateTimePeriod +ProgramId +ProgramName +ProgramNum +ProgramNumber +ProgramSelection +ProgrammingLang +ProgrammingLanguages +Progress +ProgressBar +ProgressBarOptions +ProgressCounters +ProgressDetail +ProgressDetails +ProgressDetailsOnRollback +ProgressEvent +ProgressInMegaBytes +ProgressPercent +ProgressPercentage +ProgressReport +ProgressStatus +ProgressSummary +ProgressUpdateStream +ProgressUpdateStreamName +ProgressUpdateStreamSummary +ProgressUpdateStreamSummaryList +Progressing +ProgressingJobsCount +ProgressiveDialerConfig +ProgressiveWriteHlsManifest +ProhibitedStateException +Project +ProjectAlreadyExistsException +ProjectAppConfigResource +ProjectAppConfigResourceConfig +ProjectArn +ProjectArtifacts +ProjectBadge +ProjectBuildBatchConfig +ProjectCache +ProjectConfigurationException +ProjectCreationFailedException +ProjectDataDelivery +ProjectDataDeliveryConfig +ProjectDescription +ProjectDescriptions +ProjectDetails +ProjectEnvironment +ProjectFieldMappings +ProjectFileSystemLocation +ProjectId +ProjectInformation +ProjectListFilter +ProjectMetadata +ProjectName +ProjectNames +ProjectNotFoundException +ProjectOperation +ProjectPolicies +ProjectPolicy +ProjectResource +ProjectSource +ProjectSourceVersion +ProjectStatus +ProjectSummary +ProjectSummaryList +ProjectVersionArn +ProjectVersionDescription +ProjectVersionDescriptions +ProjectedColumns +ProjectedInbox +ProjectedMetric +ProjectedSpam +ProjectedVolume +Projection +ProjectionExpression +ProjectionType +Projects +Prometheus +PrometheusInfo +PromoteMode +PromotePermissionCreatedFromPolicyRequest +PromotePermissionCreatedFromPolicyResponse +PromoteReadReplicaDBClusterMessage +PromoteReadReplicaDBClusterResult +PromoteReadReplicaMessage +PromoteReadReplicaResult +PromoteRequest +PromoteResourceShareCreatedFromPolicyRequest +PromoteResourceShareCreatedFromPolicyResponse +PromoteResponse +Promotion +PromotionTier +PromotionalMessagesPerSecond +Prompt +PromptARN +PromptAttemptSpecification +PromptId +PromptPresignedUrl +PromptSearchCriteria +PromptSearchFilter +PromptSpecification +PromptSummary +PromptSummaryList +Prompts +Proof +PropagateAtLaunch +PropagateTags +PropagatingVgw +PropagatingVgwSet +PropagatingVgwSetDetails +PropagatingVgws +Propagation +PropagationDefaultRouteTableId +Properties +PropertiesToDelete +PropertiesToRemove +Property +PropertyDefinitionRequest +PropertyDefinitionResponse +PropertyDifference +PropertyDifferences +PropertyFilter +PropertyFilters +PropertyGroup +PropertyGroupDescriptions +PropertyGroupId +PropertyGroupRequest +PropertyGroupResponse +PropertyGroups +PropertyLatestValue +PropertyList +PropertyMap +PropertyName +PropertyNameHint +PropertyNameQuery +PropertyNameSuggestion +PropertyNameSuggestions +PropertyNotification +PropertyPath +PropertyPredicate +PropertyRequest +PropertyResponse +PropertyRole +PropertyType +PropertyUsage +PropertyValidationException +PropertyValidationExceptionProperty +PropertyValue +PropertyValueEntry +PropertyValueHistory +PropertygraphData +PropertygraphRecord +PropertygraphSummary +PropertygraphSummaryValueMap +Proposal +ProposalActions +ProposalDurationInHours +ProposalId +ProposalSummary +ProposalVotes +Proposals +Proposed +ProposedByMemberId +ProposedByMemberName +ProposedConfiguration +ProposedMultiRegionAccessPointPolicy +ProposedPassword +ProposedSegmentChange +ProprietaryAuthenticationData +ProresSettings +ProtectedFromScaleIn +ProtectedQuery +ProtectedQueryError +ProtectedQueryResult +ProtectedQueryResultConfiguration +ProtectedQueryS3Output +ProtectedQueryS3OutputConfiguration +ProtectedQuerySQLParameters +ProtectedQuerySingleMemberOutput +ProtectedQueryStatistics +ProtectedQuerySummary +ProtectedResource +ProtectedResourceTypeLimits +ProtectedTask +Protection +ProtectionArn +ProtectionGroup +ProtectionGroupArbitraryPatternLimits +ProtectionGroupArn +ProtectionGroupId +ProtectionGroupIds +ProtectionGroupLimits +ProtectionGroupPatternTypeLimits +ProtectionGroups +ProtectionId +ProtectionLimits +ProtectionNames +ProtectionPolicy +Protections +ProtectiveEquipmentBodyPart +ProtectiveEquipmentModelVersion +ProtectiveEquipmentPerson +ProtectiveEquipmentSummarizationAttributes +ProtectiveEquipmentSummary +Protocol +ProtocolDetails +ProtocolType +ProtocolVersion +Protocols +ProtocolsList +ProtocolsListArn +ProtocolsListData +ProtocolsListDataSummary +ProtocolsLists +ProvideAnomalyFeedbackRequest +ProvideAnomalyFeedbackResponse +ProvidedContext +ProvidedContexts +Provider +ProviderArn +ProviderAttributeName +ProviderAttributeValue +ProviderCalendarId +ProviderDescription +ProviderDetails +ProviderEndpoint +ProviderId +ProviderName +ProviderType +ProviderTypeFilter +ProviderTypes +ProviderUserIdentifierType +Providers +Province +ProvisionByoipCidrRequest +ProvisionByoipCidrResponse +ProvisionByoipCidrResult +ProvisionData +ProvisionDeviceRequest +ProvisionDeviceResponse +ProvisionIpamPoolCidrRequest +ProvisionIpamPoolCidrResult +ProvisionPermissionSetRequest +ProvisionPermissionSetRequestId +ProvisionPermissionSetResponse +ProvisionProductId +ProvisionProductInput +ProvisionProductName +ProvisionProductOutput +ProvisionPublicIpv4PoolCidrRequest +ProvisionPublicIpv4PoolCidrResult +ProvisionState +ProvisionTime +ProvisionToken +ProvisionalConfiguration +Provisioned +ProvisionedBandwidth +ProvisionedCapacity +ProvisionedCapacityDescription +ProvisionedCapacityList +ProvisionedCapacityUnits +ProvisionedCapacityUpdate +ProvisionedConcurrency +ProvisionedConcurrencyConfigListItem +ProvisionedConcurrencyConfigNotFoundException +ProvisionedConcurrencyConfigs +ProvisionedConcurrentExecutions +ProvisionedIops +ProvisionedIopsNotAvailableInAZFault +ProvisionedModelSummary +ProvisionedOnDemandCapacity +ProvisionedProductAttribute +ProvisionedProductDetail +ProvisionedProductId +ProvisionedProductName +ProvisionedProductPlanDetails +ProvisionedProductPlanSummary +ProvisionedProductPlans +ProvisionedProductProperties +ProvisionedProductStatusMessage +ProvisionedProductType +ProvisionedProducts +ProvisionedReadCapacityAutoScalingSettings +ProvisionedReadCapacityAutoScalingSettingsUpdate +ProvisionedReadCapacityAutoScalingUpdate +ProvisionedReadCapacityUnits +ProvisionedRequest +ProvisionedResource +ProvisionedSpotCapacity +ProvisionedStorageThroughput +ProvisionedThroughput +ProvisionedThroughputDescription +ProvisionedThroughputExceededException +ProvisionedThroughputInMibps +ProvisionedThroughputOverride +ProvisionedWriteCapacityAutoScalingSettings +ProvisionedWriteCapacityAutoScalingSettingsUpdate +ProvisionedWriteCapacityAutoScalingUpdate +ProvisionedWriteCapacityUnits +ProvisioningArtifact +ProvisioningArtifactDetail +ProvisioningArtifactDetails +ProvisioningArtifactId +ProvisioningArtifactMetadata +ProvisioningArtifactName +ProvisioningArtifactOutput +ProvisioningArtifactOutputKeys +ProvisioningArtifactOutputs +ProvisioningArtifactParameter +ProvisioningArtifactParameters +ProvisioningArtifactPreferences +ProvisioningArtifactProperties +ProvisioningArtifactSummaries +ProvisioningArtifactSummary +ProvisioningArtifactView +ProvisioningArtifactViews +ProvisioningArtifacts +ProvisioningHook +ProvisioningParameter +ProvisioningParameters +ProvisioningPreferences +ProvisioningStatus +ProvisioningTemplateSummary +ProvisioningTemplateVersionSummary +ProvisioningType +Proximity +ProximityEventConfiguration +ProximityResourceTypeEventConfiguration +Proxy +ProxyConfiguration +ProxyConfigurationProperties +ProxyPhoneNumber +ProxySession +ProxySessionId +ProxySessions +ProxyType +ProxyUrl +PsAttributes +PsDetailAttributes +Psc +PseudoTerminal +Pseudonym +PsiControl +PtrRecord +PtrRecordUpdate +PtrUpdateStatus +PtsOffset +PtsOffsetHandlingForBFrames +PtsOffsetMode +Public +PublicAccess +PublicAccessBlock +PublicAccessBlockConfiguration +PublicAccessBlockEnabled +PublicAddress +PublicAddressAllocationIds +PublicBaseImageReleasedDate +PublicChannelFilter +PublicContent +PublicDefaultScopeId +PublicDns +PublicDnsName +PublicDnsNamespaceChange +PublicDnsNamespaceProperties +PublicDnsNamespacePropertiesChange +PublicDnsPropertiesMutable +PublicDnsPropertiesMutableChange +PublicEndpoint +PublicIPAddress +PublicIp +PublicIpAddress +PublicIpSource +PublicIps +PublicIpv4Pool +PublicIpv4PoolRange +PublicIpv4Pools +PublicKey +PublicKeyAlreadyExists +PublicKeyCertificate +PublicKeyConfig +PublicKeyId +PublicKeyInUse +PublicKeyList +PublicKeyMaterial +PublicKeyRotationTimestamp +PublicKeySummary +PublicKeyVersion +PublicKeys +PublicPolicyException +PublicSharingEnabled +PublicSubject +PublicTypeArn +PublicVersionNumber +PublicWorkforceTaskPrice +PublicZoneVPCAssociation +Publication +Publications +PubliclyAccessible +PubliclyAdvertisable +Publish +PublishAppVersionRequest +PublishAppVersionResponse +PublishBatchInput +PublishBatchRequestEntries +PublishBatchRequestEntry +PublishBatchResponse +PublishBatchResultEntry +PublishCloudWatchMetricsEnabled +PublishFindingToSnsParams +PublishFunctionRequest +PublishFunctionResult +PublishInput +PublishLayerVersionRequest +PublishLayerVersionResponse +PublishMetricAction +PublishMetricsInput +PublishPackageVersionRequest +PublishPackageVersionResult +PublishRecipeRequest +PublishRecipeResponse +PublishRequest +PublishResponse +PublishSchemaRequest +PublishSchemaResponse +PublishStateMachineVersionInput +PublishStateMachineVersionOutput +PublishStatus +PublishTimestamp +PublishTypeInput +PublishTypeOutput +PublishVersionRequest +PublishedBy +PublishedDate +PublishedSchemaArn +PublishedVersionNumber +PublishedVersions +PublisherId +PublisherIdentity +PublisherName +PublisherProfile +PublisherStatus +PublishingFailureStartTimestamp +PublishingOptions +PullRequest +PullRequestAlreadyClosedException +PullRequestApprovalRulesNotSatisfiedException +PullRequestCannotBeApprovedByAuthorException +PullRequestCreatedEventMetadata +PullRequestDoesNotExistException +PullRequestEvent +PullRequestId +PullRequestIdRequiredException +PullRequestMergedStateChangedEventMetadata +PullRequestSourceReferenceUpdatedEventMetadata +PullRequestStatusChangedEventMetadata +PullRequestStatusRequiredException +PullRequestTarget +PullThroughCacheRule +PullThroughCacheRuleAlreadyExistsException +PullThroughCacheRuleNotFoundException +Purchase +PurchaseHostReservationRequest +PurchaseHostReservationResult +PurchaseOfferingRequest +PurchaseOfferingResponse +PurchaseOfferingResult +PurchaseProvisionedCapacityInput +PurchaseProvisionedCapacityOutput +PurchaseRequest +PurchaseRequests +PurchaseReservedCacheNodesOfferingMessage +PurchaseReservedCacheNodesOfferingResult +PurchaseReservedDBInstancesOfferingMessage +PurchaseReservedDBInstancesOfferingResult +PurchaseReservedElasticsearchInstanceOfferingRequest +PurchaseReservedElasticsearchInstanceOfferingResponse +PurchaseReservedInstanceOfferingRequest +PurchaseReservedInstanceOfferingResponse +PurchaseReservedInstancesOfferingRequest +PurchaseReservedInstancesOfferingResult +PurchaseReservedNodeOfferingMessage +PurchaseReservedNodeOfferingResult +PurchaseReservedNodesOfferingRequest +PurchaseReservedNodesOfferingResponse +PurchaseScheduledInstancesRequest +PurchaseScheduledInstancesResult +PurchaseTime +PurchaseToken +PurchasedAt +PurchasedHours +PurchasedUnits +PurgeQueueRequest +PushDomainRequest +PushMessageActivity +PushNotification +PushNotificationConfiguration +PushNotificationPreferences +PushNotificationTemplateRequest +PushNotificationTemplateResponse +PushNotifications +PushSync +PushTemplate +Put +PutAccessControlRuleRequest +PutAccessPointConfigurationForObjectLambdaRequest +PutAccessPointPolicyForObjectLambdaRequest +PutAccessPointPolicyRequest +PutAccountAliasRequest +PutAccountConfigurationRequest +PutAccountDedicatedIpWarmupAttributesRequest +PutAccountDetailsRequest +PutAccountPolicyRequest +PutAccountPolicyResponse +PutAccountPreferencesRequest +PutAccountPreferencesResponse +PutAccountSendingAttributesRequest +PutAccountSettingDefaultRequest +PutAccountSettingDefaultResponse +PutAccountSettingRequest +PutAccountSettingResponse +PutAccountSuppressionAttributesRequest +PutAccountVdmAttributesRequest +PutActionRevisionInput +PutActionRevisionOutput +PutAdminAccountRequest +PutAggregationAuthorizationRequest +PutAggregationAuthorizationResponse +PutAlarmRequest +PutAlarmResult +PutAlertManagerDefinitionRequest +PutAlertManagerDefinitionResponse +PutAlternateContactRequest +PutAnomalyDetectorInput +PutAppInstanceRetentionSettingsRequest +PutAppInstanceRetentionSettingsResponse +PutAppInstanceStreamingConfigurationsRequest +PutAppInstanceStreamingConfigurationsResponse +PutAppInstanceUserExpirationSettingsRequest +PutAppInstanceUserExpirationSettingsResponse +PutAppLaunchConfigurationRequest +PutAppReplicationConfigurationRequest +PutAppValidationConfigurationRequest +PutApplicationPolicyRequest +PutApplicationPolicyResponse +PutApprovalResultInput +PutApprovalResultOutput +PutAppsListRequest +PutAppsListResponse +PutAssetPropertyValueEntry +PutAttributesRequest +PutAttributesResponse +PutAuditEventsRequest +PutAuditEventsResponse +PutAuthPolicyRequest +PutAuthPolicyResponse +PutAutoScalingPolicyInput +PutAutoScalingPolicyOutput +PutAutoTerminationPolicyInput +PutBackupPolicyRequest +PutBackupVaultAccessPolicyInput +PutBackupVaultLockConfigurationInput +PutBackupVaultNotificationsInput +PutBandwidthRateLimitScheduleInput +PutBandwidthRateLimitScheduleOutput +PutBlockPublicAccessConfigurationInput +PutBotAliasRequest +PutBotAliasResponse +PutBotRequest +PutBotResponse +PutBucketAccelerateConfigurationRequest +PutBucketAclRequest +PutBucketAnalyticsConfigurationRequest +PutBucketCorsRequest +PutBucketEncryptionRequest +PutBucketIntelligentTieringConfigurationRequest +PutBucketInventoryConfigurationRequest +PutBucketLifecycleConfigurationRequest +PutBucketLoggingRequest +PutBucketMetricsConfigurationRequest +PutBucketNotificationConfigurationRequest +PutBucketOwnershipControlsRequest +PutBucketPolicyRequest +PutBucketReplicationRequest +PutBucketRequestPaymentRequest +PutBucketTaggingRequest +PutBucketVersioningRequest +PutBucketWebsiteRequest +PutCapacityAssignmentConfigurationInput +PutCaseEventConfigurationRequest +PutChannelExpirationSettingsRequest +PutChannelExpirationSettingsResponse +PutChannelMembershipPreferencesRequest +PutChannelMembershipPreferencesResponse +PutChannelPolicyRequest +PutChunkInput +PutChunkOutput +PutClassificationExportConfigurationRequest +PutClassificationExportConfigurationResponse +PutClusterCapacityProvidersRequest +PutClusterCapacityProvidersResponse +PutClusterPolicyRequest +PutClusterPolicyResponse +PutCodeBindingRequest +PutCodeBindingResponse +PutCommentReactionInput +PutComplianceItemsRequest +PutComponentPolicyRequest +PutComponentPolicyResponse +PutCompositeAlarmInput +PutConferencePreferenceRequest +PutConfigRuleRequest +PutConfigurationAggregatorRequest +PutConfigurationAggregatorResponse +PutConfigurationRecorderRequest +PutConfigurationRequest +PutConfigurationSetDeliveryOptionsRequest +PutConfigurationSetReputationOptionsRequest +PutConfigurationSetSendingOptionsRequest +PutConfigurationSetSuppressionOptionsRequest +PutConfigurationSetTrackingOptionsRequest +PutConfigurationSetVdmOptionsRequest +PutConformancePackRequest +PutConformancePackResponse +PutContactInformationRequest +PutContactPolicyRequest +PutContainerPolicyInput +PutContainerRecipePolicyRequest +PutContainerRecipePolicyResponse +PutCoreNetworkPolicyRequest +PutCoreNetworkPolicyResponse +PutCorsPolicyInput +PutDashboardInput +PutDashboardOutput +PutDataCatalogEncryptionSettingsRequest +PutDataLakeSettingsRequest +PutDataProtectionPolicyInput +PutDataProtectionPolicyRequest +PutDataProtectionPolicyResponse +PutDataSetRefreshPropertiesRequest +PutDataSetRefreshPropertiesResponse +PutDedicatedIpInPoolRequest +PutDedicatedIpPoolScalingAttributesRequest +PutDedicatedIpWarmupAttributesRequest +PutDefaultEncryptionConfigurationRequest +PutDefaultEncryptionConfigurationResponse +PutDeliverabilityDashboardOptionRequest +PutDeliveryChannelRequest +PutDestinationPolicyRequest +PutDestinationRequest +PutDestinationResponse +PutDetectorRequest +PutDialRequestBatchRequest +PutDialRequestBatchResponse +PutDomainPermissionsPolicyRequest +PutDomainPermissionsPolicyResult +PutDraftAppVersionTemplateRequest +PutDraftAppVersionTemplateResponse +PutEmailIdentityConfigurationSetAttributesRequest +PutEmailIdentityDkimAttributesRequest +PutEmailIdentityDkimSigningAttributesRequest +PutEmailIdentityDkimSigningAttributesResponse +PutEmailIdentityFeedbackAttributesRequest +PutEmailIdentityMailFromAttributesRequest +PutEmailMonitoringConfigurationRequest +PutEncryptionConfigRequest +PutEncryptionConfigResult +PutEncryptionConfigurationRequest +PutEncryptionConfigurationResponse +PutEntityTypeRequest +PutEvaluationsRequest +PutEvaluationsResponse +PutEventSelectorsRequest +PutEventSelectorsResponse +PutEventStreamRequest +PutEventStreamResponse +PutEventTypeRequest +PutEventsConfigurationRequest +PutEventsConfigurationResponse +PutEventsRequest +PutEventsRequestEntry +PutEventsResponse +PutEventsResultEntry +PutExternalEvaluationRequest +PutExternalModelRequest +PutFeedbackRequest +PutFileEntry +PutFileEntryConflictException +PutFileInput +PutFileOutput +PutFileSystemPolicyRequest +PutFindingsPublicationConfigurationRequest +PutFirewallRuleGroupPolicyRequest +PutFirewallRuleGroupPolicyResponse +PutFunctionCodeSigningConfigRequest +PutFunctionCodeSigningConfigResponse +PutFunctionConcurrencyRequest +PutFunctionEventInvokeConfigRequest +PutGatewayResponseRequest +PutGeofenceRequest +PutGeofenceResponse +PutGroupConfigurationInput +PutGroupPolicyRequest +PutHypervisorPropertyMappingsInput +PutHypervisorPropertyMappingsOutput +PutIdentityPolicyRequest +PutImagePolicyRequest +PutImagePolicyResponse +PutImageRecipePolicyRequest +PutImageRecipePolicyResponse +PutImageRequest +PutImageResponse +PutImageScanningConfigurationRequest +PutImageScanningConfigurationResponse +PutImageTagMutabilityRequest +PutImageTagMutabilityResponse +PutInboundDmarcSettingsRequest +PutInlinePolicyToPermissionSetRequest +PutInsightRuleInput +PutInsightSelectorsRequest +PutInsightSelectorsResponse +PutInstancePublicPortsRequest +PutInstancePublicPortsResult +PutIntegrationRequest +PutIntegrationResponse +PutIntegrationResponseRequest +PutIntentRequest +PutIntentResponse +PutInventoryRequest +PutInventoryResult +PutInvitationConfigurationRequest +PutItemInput +PutItemOutput +PutItemsRequest +PutJobFailureResultInput +PutJobSuccessResultInput +PutJobTaggingRequest +PutKMSEncryptionKeyRequest +PutKeyPolicyRequest +PutKeywordRequest +PutKeywordResult +PutLabelRequest +PutLaunchActionRequest +PutLaunchActionResponse +PutLaunchProfileMembersRequest +PutLexiconInput +PutLifecycleConfigurationRequest +PutLifecycleEventHookExecutionStatusInput +PutLifecycleEventHookExecutionStatusOutput +PutLifecycleHookType +PutLifecyclePolicyInput +PutLifecyclePolicyRequest +PutLifecyclePolicyResponse +PutLogEventsRequest +PutLogEventsResponse +PutLoggingConfigurationRequest +PutLoggingConfigurationResponse +PutLoggingOptionsRequest +PutMailboxPermissionsRequest +PutMaintenanceStartTimeInput +PutMaintenanceStartTimeOutput +PutManagedInsightRulesInput +PutManagedInsightRulesOutput +PutManagedRuleSetVersionsRequest +PutManagedRuleSetVersionsResponse +PutManagedScalingPolicyInput +PutMessagingStreamingConfigurationsRequest +PutMessagingStreamingConfigurationsResponse +PutMetadataFlagBody +PutMetadataFlagRequest +PutMetadataRequest +PutMethodRequest +PutMethodResponseRequest +PutMetricAlarmInput +PutMetricDataInput +PutMetricFilterRequest +PutMetricPolicyInput +PutMetricStreamInput +PutMetricStreamOutput +PutMobileDeviceAccessOverrideRequest +PutModelInvocationLoggingConfigurationRequest +PutModelPackageGroupPolicyInput +PutModelPackageGroupPolicyOutput +PutMultiRegionAccessPointPolicyInput +PutMultiRegionAccessPointPolicyRequest +PutMultiRegionAccessPointPolicyResult +PutNotificationChannelRequest +PutNotificationConfigurationType +PutNotificationSettingsRequest +PutNotificationSettingsResponse +PutObjectAclOutput +PutObjectAclRequest +PutObjectInput +PutObjectLegalHoldOutput +PutObjectLegalHoldRequest +PutObjectLockConfigurationOutput +PutObjectLockConfigurationRequest +PutObjectOutput +PutObjectRequest +PutObjectResponse +PutObjectRetentionOutput +PutObjectRetentionRequest +PutObjectTaggingOutput +PutObjectTaggingRequest +PutOptedOutNumberRequest +PutOptedOutNumberResult +PutOrganizationConfigRuleRequest +PutOrganizationConfigRuleResponse +PutOrganizationConformancePackRequest +PutOrganizationConformancePackResponse +PutOriginEndpointPolicyRequest +PutOutcomeRequest +PutPackageOriginConfigurationRequest +PutPackageOriginConfigurationResult +PutParameterRequest +PutParameterResult +PutPartnerEventsRequest +PutPartnerEventsRequestEntry +PutPartnerEventsResponse +PutPartnerEventsResultEntry +PutPermissionPolicyRequest +PutPermissionRequest +PutPermissionResponse +PutPermissionsBoundaryToPermissionSetRequest +PutPipelineDefinitionInput +PutPipelineDefinitionOutput +PutPlaybackConfigurationRequest +PutPlaybackConfigurationResponse +PutPolicyRequest +PutPolicyResponse +PutPortfolioPreferencesRequest +PutPositionConfigurationRequest +PutPrincipalMappingRequest +PutProfileObjectRequest +PutProfileObjectResponse +PutProfileObjectTypeRequest +PutProfileObjectTypeResponse +PutProjectEventsRequest +PutProjectEventsResponse +PutProjectEventsResultEntry +PutProjectPolicyRequest +PutProjectPolicyResponse +PutProtocolsListRequest +PutProtocolsListResponse +PutProvisionedConcurrencyConfigRequest +PutProvisionedConcurrencyConfigResponse +PutPublicAccessBlockRequest +PutQueryDefinitionRequest +PutQueryDefinitionResponse +PutRawMessageContentRequest +PutRecommendationFeedbackRequest +PutRecommendationPreferencesRequest +PutRecordBatchInput +PutRecordBatchOutput +PutRecordBatchResponseEntry +PutRecordInput +PutRecordOutput +PutRecordRequest +PutRecordsInput +PutRecordsOutput +PutRecordsRequestEntry +PutRecordsResultEntry +PutRegistryCatalogDataRequest +PutRegistryCatalogDataResponse +PutRegistryPolicyRequest +PutRegistryPolicyResponse +PutRegistryScanningConfigurationRequest +PutRegistryScanningConfigurationResponse +PutRemediationConfigurationsRequest +PutRemediationConfigurationsResponse +PutRemediationExceptionsRequest +PutRemediationExceptionsResponse +PutReplicationConfigurationRequest +PutReplicationConfigurationResponse +PutReportDefinitionRequest +PutReportDefinitionResult +PutRepositoryCatalogDataRequest +PutRepositoryCatalogDataResponse +PutRepositoryPermissionsPolicyRequest +PutRepositoryPermissionsPolicyResult +PutRepositoryTriggersInput +PutRepositoryTriggersOutput +PutRequest +PutResolverQueryLogConfigPolicyRequest +PutResolverQueryLogConfigPolicyResponse +PutResolverRulePolicyRequest +PutResolverRulePolicyResponse +PutResourceAttributesRequest +PutResourceConfigRequest +PutResourceLogLevelRequest +PutResourcePermissionInput +PutResourcePermissionOutput +PutResourcePolicyInput +PutResourcePolicyOutput +PutResourcePolicyRequest +PutResourcePolicyResponse +PutResourcePolicyResult +PutResourceSetRequest +PutResourceSetResponse +PutRestApiRequest +PutRetentionConfigurationRequest +PutRetentionConfigurationResponse +PutRetentionPolicyRequest +PutRetentionSettingsRequest +PutRetentionSettingsResponse +PutRolePermissionsBoundaryRequest +PutRolePolicyRequest +PutRoomSkillParameterRequest +PutRuleGroupsNamespaceRequest +PutRuleGroupsNamespaceResponse +PutRuleRequest +PutRuleResponse +PutRumEventsRequest +PutRumMetricsDestinationRequest +PutRuntimeManagementConfigRequest +PutRuntimeManagementConfigResponse +PutScalingPolicyInput +PutScalingPolicyOutput +PutScalingPolicyRequest +PutScalingPolicyResponse +PutScalingPolicyType +PutScheduledActionRequest +PutScheduledUpdateGroupActionType +PutSchemaFromJsonRequest +PutSchemaFromJsonResponse +PutSchemaInput +PutSchemaOutput +PutSchemaVersionMetadataInput +PutSchemaVersionMetadataResponse +PutSecretValueRequest +PutSecretValueResponse +PutServiceQuotaIncreaseRequestIntoTemplateRequest +PutServiceQuotaIncreaseRequestIntoTemplateResponse +PutSessionRequest +PutSessionResponse +PutSigningProfileRequest +PutSigningProfileResponse +PutSinkPolicyInput +PutSinkPolicyOutput +PutSipMediaApplicationAlexaSkillConfigurationRequest +PutSipMediaApplicationAlexaSkillConfigurationResponse +PutSipMediaApplicationLoggingConfigurationRequest +PutSipMediaApplicationLoggingConfigurationResponse +PutSkillAuthorizationRequest +PutSlotTypeRequest +PutSlotTypeResponse +PutSnapshotBlockRequest +PutSnapshotBlockResponse +PutSolFunctionPackageContentInput +PutSolFunctionPackageContentMetadata +PutSolFunctionPackageContentOutput +PutSolNetworkPackageContentInput +PutSolNetworkPackageContentMetadata +PutSolNetworkPackageContentOutput +PutSourceServerActionRequest +PutStorageConfigurationRequest +PutStorageConfigurationResponse +PutStorageLensConfigurationRequest +PutStorageLensConfigurationTaggingRequest +PutStoredQueryRequest +PutStoredQueryResponse +PutStudioMembersRequest +PutSubscriptionFilterRequest +PutSuppressedDestinationRequest +PutTargetsRequest +PutTargetsResponse +PutTargetsResultEntry +PutTelemetryRecordsRequest +PutTemplateActionRequest +PutThirdPartyJobFailureResultInput +PutThirdPartyJobSuccessResultInput +PutTraceSegmentsRequest +PutTraceSegmentsResult +PutUserPermissionsBoundaryRequest +PutUserPolicyRequest +PutUserStatusRequest +PutUsersRequest +PutVerificationStateOnViolationRequest +PutVoiceConnectorEmergencyCallingConfigurationRequest +PutVoiceConnectorEmergencyCallingConfigurationResponse +PutVoiceConnectorLoggingConfigurationRequest +PutVoiceConnectorLoggingConfigurationResponse +PutVoiceConnectorOriginationRequest +PutVoiceConnectorOriginationResponse +PutVoiceConnectorProxyRequest +PutVoiceConnectorProxyResponse +PutVoiceConnectorStreamingConfigurationRequest +PutVoiceConnectorStreamingConfigurationResponse +PutVoiceConnectorTerminationCredentialsRequest +PutVoiceConnectorTerminationRequest +PutVoiceConnectorTerminationResponse +PutWarmPoolType +PutWebhookInput +PutWebhookOutput +PutWorkflowRunPropertiesRequest +Pwd +PythonScript +PythonVersion +QRCodePNG +QSearchBar +QopConfiguration +Qualification +QualificationRequest +QualificationRequestId +QualificationRequests +QualificationRequirement +QualificationRequirements +QualificationStatus +QualificationType +QualificationTypeId +QualificationTypeStatus +QualificationTypes +Qualifications +Qualifier +Quality +QualityCheck +QualityCheckStepMetadata +QualityFilter +QualityLevel +QualityTuningLevel +Quantile +Quantity +QuantumTaskQueueInfo +QuantumTaskSummary +Queries +QueriesConfig +Query +QueryAlias +QueryArg +QueryArgProfile +QueryArgProfileConfig +QueryArgProfileEmpty +QueryArgProfiles +QueryArgument +QueryArn +QueryAsOfTime +QueryAssistantRequest +QueryAssistantResponse +QueryCapacityUnits +QueryCompileError +QueryCompileErrorLocation +QueryDefinition +QueryEndDate +QueryError +QueryErrors +QueryEvalStats +QueryExecution +QueryExecutionContext +QueryExecutionException +QueryExecutionId +QueryExecutionIds +QueryExecutionStatistics +QueryExecutionStatus +QueryExecutions +QueryFilter +QueryFilters +QueryForecastRequest +QueryForecastResponse +QueryId +QueryIdNotFoundException +QueryIdentifiersEnclosingOption +QueryInfo +QueryInput +QueryLanguageVersion +QueryLimitExceededException +QueryLimitException +QueryLineageRequest +QueryLineageResponse +QueryLogLookBackWindowInDays +QueryLoggingConfig +QueryLoggingConfigAlreadyExists +QueryLoggingConfigs +QueryName +QueryObjectsInput +QueryObjectsOutput +QueryOutput +QueryParameterMatch +QueryParameters +QueryPlanningContext +QueryPlanningTimeInMillis +QueryQueueTimeInMillis +QueryRecommendationTriggerData +QueryRequest +QueryResponse +QueryResult +QueryResultItem +QueryResultRows +QueryResultTypeFilter +QueryRuntimeStatistics +QueryRuntimeStatisticsRows +QueryRuntimeStatisticsTimeline +QuerySchemaVersionMetadataInput +QuerySchemaVersionMetadataResponse +QueryScopes +QuerySingleAlwaysOnNode +QueryStage +QueryStagePlan +QueryStagePlanNode +QueryStartDate +QueryStatement +QueryStatistics +QueryStatisticsForDescribeQuery +QueryStatus +QueryString +QueryStringBehavior +QueryStringCacheKeys +QueryStringConditionConfig +QueryStringConfig +QueryStringKeyValuePair +QueryStringNames +QueryStringObject +QueryStringParameters +QueryStrings +QueryStringsConfig +QuerySubmissionTime +QuerySuggestionsBlockListSummary +QuerySuggestionsId +QueryTableRowsRequest +QueryTableRowsResult +QueryText +QueryTexts +QueryTimeoutException +QueryTooLargeException +QueryWhatIfForecastRequest +QueryWhatIfForecastResponse +Question +QuestionChoices +QuestionDescription +QuestionDifference +QuestionDifferences +QuestionId +QuestionIdentifier +QuestionMetric +QuestionPriority +QuestionTitle +QuestionType +QuestionTypeProperties +Questions +Queue +QueueArn +QueueConfig +QueueConfigs +QueueConfiguration +QueueConfigurations +QueueId +QueueInfo +QueueName +QueueNamePrefix +QueueOwnerAWSAccountId +QueueQuickConnectConfig +QueueReference +QueueReferences +QueueSearchCriteria +QueueSearchFilter +QueueSummary +QueueSummaryList +QueueTimeMillis +QueueTransition +QueueTransitions +QueueType +QueueTypeCondition +QueueTypes +QueueUrl +QueueUrls +QueuedIngestion +Queues +QuickConnect +QuickConnectARN +QuickConnectConfig +QuickConnectId +QuickConnectIds +QuickConnectSearchCriteria +QuickConnectSearchFilter +QuickConnectSummary +QuickConnectSummaryList +QuickConnectType +QuickConnectTypes +QuickConnects +QuickSightConsole +QuickSightUserNotFoundException +Quiet +QuietTime +QuipConfiguration +Quota +QuotaAppliedAtLevel +QuotaArn +QuotaCode +QuotaContext +QuotaContextInfo +QuotaExceededException +QuotaName +QuotaPeriod +QuotaRequestedAtLevel +QuotaSettings +Quotas +QuoteChar +QuoteCharacter +QuoteEscapeCharacter +QuoteFields +QuoteSymbol +QvbrQualityLevel +QvbrQualityLevelFineTune +QvbrSettings +R53HostedZoneDeletionState +R53Resource +R53ResourceRecord +RDFGraphSummary +RDFGraphSummaryValueMap +RDSData +RDSDataSpec +RDSDatabase +RDSDatabaseCredentials +RDSInstanceDetails +RDSMetadata +RDSSourceConfig +RICostForUnusedHours +RMSE +RSessionAppSettings +RStudioConnectUrl +RStudioPackageManagerUrl +RStudioServerProAppSettings +RStudioServerProDomainSettings +RStudioServerProDomainSettingsForUpdate +RTMPConfiguration +RaAllowed +RabbitMQBrokerParameters +RackElevation +RackId +RackPhysicalProperties +RadarChartAggregatedFieldWells +RadarChartAreaStyleSettings +RadarChartConfiguration +RadarChartFieldWells +RadarChartSeriesSettings +RadarChartSortConfiguration +RadarChartVisual +Radios +Radius +RadiusPort +RadiusRetries +RadiusServers +RadiusSettings +RadiusStatus +RadiusTimeout +RaidArray +RaidArrayId +RaidArrayIds +RaidArrays +RaidLevel +RamDiskId +Ramdisk +RamdiskId +RandomNonce +RandomPassword +RandomSeed +RandomSplit +RandomSplitActivity +RandomSplitEntry +Range +RangeConstant +RangeEndsLabelType +RangeInBytes +RangeInKilometers +RangeMaximum +RangeMaximumValue +RangeMinimum +RangeMinimumValue +RangeNotSatisfiableException +RangedConnectionDetails +RangedSocketAddress +RangesOnIndexedValues +Rank +RankOrder +RasterDataCollectionArn +RasterDataCollectionMetadata +RasterDataCollectionName +RasterDataCollectionQuery +RasterDataCollectionQueryInput +RasterDataCollectionQueryOutput +RasterDataCollectionQueryWithBandFilterInput +RasterDataCollectionSummaries +RateBasedRule +RateBasedStatement +RateBasedStatementCustomKey +RateBasedStatementManagedKeysIPSet +RateControlMode +RateExceededException +RateIncreaseCriteria +RateKey +RateLimit +RateLimitCookie +RateLimitExceededException +RateLimitHeader +RateLimitLabelNamespace +RateLimitQueryArgument +RateLimitQueryString +RateLimitUriPath +RateMode +Rating +Raw +RawContent +RawEmail +RawFormat +RawInputRecords +RawMessage +RawMessageContent +RawMetricData +RawSecretAccessKey +RawSettings +RawString +RblName +RdsConfiguration +RdsDbClusterSnapshotConfiguration +RdsDbInstance +RdsDbInstanceArn +RdsDbInstanceArns +RdsDbInstanceDetails +RdsDbInstances +RdsDbSnapshotConfiguration +RdsDbUserDetails +RdsEngine +RdsEventCategories +RdsEventMessage +RdsHttpEndpointConfig +RdsLoginAttemptAction +RdsParameters +RdsRecommendation +RdsRequirements +RdsResourceId +ReEncryptDataInput +ReEncryptDataOutput +ReEncryptRequest +ReEncryptResponse +ReactStartCodegenJobData +ReactionForComment +ReactionLimitExceededException +ReactionValueFormats +ReactionValueRequiredException +Reactions +ReactiveAnomalies +ReactiveAnomaly +ReactiveAnomalySummary +ReactiveInsight +ReactiveInsightSummary +ReactiveInsights +ReactiveOrganizationInsightSummary +Read +ReadAccessPrincipalArns +ReadAheadBlocks +ReadAttributes +ReadBackupOnly +ReadCapacityUnits +ReadDeleteRate +ReadEndpoint +ReadIOs +ReadJobRequest +ReadJobResponse +ReadMarkerTimestamp +ReadOnly +ReadOnlyAdmins +ReadOnlyFieldInfo +ReadOnlyFields +ReadOnlyViolationException +ReadOptions +ReadPipelineRequest +ReadPipelineResponse +ReadPresetRequest +ReadPresetResponse +ReadRate +ReadRatePercent +ReadReplicaCapable +ReadReplicaDBClusterIdentifiers +ReadReplicaDBInstanceIdentifiers +ReadReplicaIdentifiers +ReadReplicaSourceDBClusterIdentifier +ReadReplicaSourceDBInstanceIdentifier +ReadSetBatchError +ReadSetFiles +ReadSetFilter +ReadSetListItem +ReadSetUploadPartListFilter +ReadSetUploadPartListItem +ReadTableSpaceName +ReadTime +ReadTimestamp +ReadWriteType +ReaderEndpoint +ReaderGroup +Readers +Readiness +ReadinessCheckArn +ReadinessCheckName +ReadinessCheckOutput +ReadinessCheckSummary +ReadinessChecks +ReadinessScopes +ReadmeBody +ReadmeUrl +ReadonlyRootFilesystem +Ready +ReadyDateTime +RealTimeAlertConfiguration +RealTimeAlertRule +RealTimeInferenceConfig +RealTimeInferenceRecommendation +RealTimeInferenceRecommendations +RealizedSavings +Realm +RealtimeContactAnalysisSegment +RealtimeEndpointInfo +RealtimeLogConfig +RealtimeLogConfigAlreadyExists +RealtimeLogConfigArn +RealtimeLogConfigInUse +RealtimeLogConfigName +RealtimeLogConfigOwnerMismatch +RealtimeLogConfigs +RealtimeMetricsSubscriptionConfig +RealtimeMetricsSubscriptionStatus +Reason +ReasonCode +ReasonCodeSummary +ReasonCodes +ReasonContext +ReasonForNewProvisioningData +ReasonMessage +Reasons +RebalanceSlotsInGlobalReplicationGroupMessage +RebalanceSlotsInGlobalReplicationGroupResult +RebootBrokerRequest +RebootBrokerResponse +RebootCacheClusterMessage +RebootCacheClusterResult +RebootClusterMessage +RebootClusterResult +RebootDBClusterMessage +RebootDBClusterResult +RebootDBInstanceMessage +RebootDBInstanceResult +RebootInputDeviceRequest +RebootInstanceRequest +RebootInstanceResult +RebootInstancesRequest +RebootNodeRequest +RebootNodeResponse +RebootOption +RebootRelationalDatabaseRequest +RebootRelationalDatabaseResult +RebootReplicationInstanceMessage +RebootReplicationInstanceResponse +RebootRequest +RebootWorkspaceRequests +RebootWorkspacesRequest +RebootWorkspacesResult +Rebooting +RebuildEnvironmentMessage +RebuildRequest +RebuildSnapshots +RebuildWorkspace +RebuildWorkspaceRequests +RebuildWorkspacesRequest +RebuildWorkspacesResult +Rec601Settings +Rec709Settings +Recall +Receipt +ReceiptAction +ReceiptFilter +ReceiptHandle +ReceiptInfo +ReceiptIpFilter +ReceiptRule +ReceiptRuleSetMetadata +ReceiptTime +ReceiptType +Receipts +ReceiveMessageRequest +ReceiveMessageResult +ReceiveRequestAttemptId +ReceivedAt +ReceivedEventAgeHistogram +ReceivedMetadata +ReceivedStatus +ReceivedStatusReason +ReceivedTime +Recency +RecencyDimension +RecencyType +RecentCaseCommunications +RecentlyActive +RecentlyFailedRuns +Recipe +RecipeAction +RecipeArn +RecipeName +RecipeReference +RecipeStep +RecipeSummary +RecipeUri +RecipeVersion +RecipeVersionErrorDetail +RecipeVersions +Recipes +Recipient +RecipientArn +RecipientDetail +RecipientDsnFields +RecipientId +RecipientInfo +RecipientParticipantId +Recipients +RecognizeCelebritiesRequest +RecognizeCelebritiesResponse +RecognizeTextRequest +RecognizeTextResponse +RecognizeUtteranceRequest +RecognizeUtteranceResponse +RecognizedBotMember +RecognizerMetadata +RecognizerName +Recommendation +RecommendationCategory +RecommendationData +RecommendationDescription +RecommendationDetailData +RecommendationDetailHourlyMetrics +RecommendationDetailId +RecommendationDetails +RecommendationDisruptionCompliance +RecommendationExportJob +RecommendationFeedback +RecommendationFeedbackSummaries +RecommendationFeedbackSummary +RecommendationId +RecommendationIds +RecommendationItem +RecommendationJobCompiledOutputConfig +RecommendationJobContainerConfig +RecommendationJobInferenceBenchmark +RecommendationJobInputConfig +RecommendationJobOutputConfig +RecommendationJobPayloadConfig +RecommendationJobResourceLimit +RecommendationJobStoppingConditions +RecommendationJobVpcConfig +RecommendationMetrics +RecommendationPreferences +RecommendationPreferencesDetail +RecommendationProviderIdType +RecommendationProviderRoleArn +RecommendationProviderUri +RecommendationRelatedAnomaly +RecommendationRelatedAnomalyResource +RecommendationRelatedAnomalySourceDetail +RecommendationRelatedCloudWatchMetricsSourceDetail +RecommendationRelatedEvent +RecommendationRelatedEventResource +RecommendationReportDetails +RecommendationRunId +RecommendationSet +RecommendationSettings +RecommendationSource +RecommendationStatus +RecommendationSummaries +RecommendationSummary +RecommendationTarget +RecommendationTemplate +RecommendationText +RecommendationTransformerUri +RecommendationTrigger +RecommendationType +Recommendations +RecommendationsDisplayName +RecommendationsPerMessage +RecommendedIntentSummary +RecommendedNormalizedUnitsToPurchase +RecommendedNumberOfInstancesToPurchase +RecommendedOptionProjectedMetric +RecommendedRuleset +RecommendedVersion +Recommender +RecommenderConfig +RecommenderConfigurationResponse +RecommenderId +RecommenderSummary +RecommenderUpdateSummary +ReconfigurationType +ReconnectEnabled +Record +RecordActivityTaskHeartbeatInput +RecordColumn +RecordColumnDelimiter +RecordColumnUpdates +RecordColumns +RecordData +RecordDelimiter +RecordDetail +RecordDetails +RecordEncoding +RecordEncodingUpdate +RecordError +RecordErrors +RecordFormat +RecordFormatType +RecordFormatUpdate +RecordHandlerProgressInput +RecordId +RecordIdentifierFeatureName +RecordIdentifierValueAsString +RecordIdentifiersValueAsString +RecordIndex +RecordIngestionFailures +RecordLength +RecordLifecycleActionHeartbeatType +RecordMarkerDecisionAttributes +RecordMarkerFailedEventAttributes +RecordName +RecordOutput +RecordOutputs +RecordPatch +RecordPatches +RecordPollingLimit +RecordPreprocessorSourceUri +RecordRowDelimiter +RecordRowPath +RecordSetId +RecordSizeKiB +RecordState +RecordTag +RecordTags +RecordType +RecordVersion +RecordWrapperType +RecordedAt +RecorderConfig +RecorderStatus +RecordingConfiguration +RecordingConfigurationSummary +RecordingFileFormat +RecordingGroup +RecordingStrategy +RecordingStreamConfiguration +Records +RecordsEvent +RecordsIngested +RecordsProcessed +RecoveryCheckpoint +RecoveryGroupArn +RecoveryGroupName +RecoveryGroupOutput +RecoveryGroups +RecoveryInstance +RecoveryInstanceDataReplicationError +RecoveryInstanceDataReplicationInfo +RecoveryInstanceDataReplicationInfoReplicatedDisk +RecoveryInstanceDataReplicationInitiation +RecoveryInstanceDataReplicationInitiationStep +RecoveryInstanceDisk +RecoveryInstanceFailback +RecoveryInstanceProperties +RecoveryLifeCycle +RecoveryMechanisms +RecoveryOptionType +RecoveryPoint +RecoveryPointArn +RecoveryPointByBackupVault +RecoveryPointByResource +RecoveryPointCreator +RecoveryPointMember +RecoveryPointSelection +RecoveryPointTags +RecoveryPoints +RecoverySnapshot +RecoveryWindow +RecoveryWindowInDays +RecrawlBehavior +RecrawlPolicy +Rectangle +Recurrence +RecurrenceInHours +RecurrenceMultiplier +RecurrenceSettings +RecurringCharge +RecurringChargeAmount +RecurringChargeFrequency +RecurringCharges +RecurringCount +RecurringStandardMonthlyCost +Recurse +Recursive +RecursiveDeleteOption +RecursiveInvocationException +RecycleBinEnterTime +RecycleBinExitTime +RecycleBinFolderId +Red +RedPrimaryX +RedPrimaryY +RedactChannelMessageRequest +RedactChannelMessageResponse +RedactConversationMessageRequest +RedactRoomMessageRequest +Redacted +RedactedEwsAvailabilityProvider +RedactedFields +RedactedMediaFileUri +RedactedTranscriptFileUri +RedactionConfig +RedactionOutput +RedactionType +Redirect +RedirectActionConfig +RedirectAllRequestsTo +RedirectConfig +RedirectException +RedirectLocation +RedirectSignInURIs +RedirectSignOutURIs +RedirectURL +RedisSettings +Redshift +RedshiftConnectorProfileCredentials +RedshiftConnectorProfileProperties +RedshiftDataParameters +RedshiftDataProviderSettings +RedshiftDataShareAsset +RedshiftDataShareAssetSourceEntry +RedshiftDataSpec +RedshiftDatabase +RedshiftDatabaseCredentials +RedshiftDatasetDefinition +RedshiftDestinationConfiguration +RedshiftDestinationDescription +RedshiftDestinationProperties +RedshiftDestinationUpdate +RedshiftInstanceDetails +RedshiftMetadata +RedshiftParameters +RedshiftPid +RedshiftQueryId +RedshiftRetryOptions +RedshiftSettings +RedshiftSource +RedshiftSourceConfig +RedshiftTarget +RedshiftTmpDir +RedundancyPercent +RedundantManifest +ReenrollAllCertificateHolders +RefId +RefResource +Reference +ReferenceActionName +ReferenceArn +ReferenceData +ReferenceDataSource +ReferenceDataSourceDescription +ReferenceDataSourceDescriptions +ReferenceDataSourceUpdate +ReferenceDataSourceUpdates +ReferenceDataSources +ReferenceDoesNotExistException +ReferenceFiles +ReferenceFilter +ReferenceId +ReferenceImage +ReferenceLine +ReferenceLineCustomLabelConfiguration +ReferenceLineDataConfiguration +ReferenceLineDynamicDataConfiguration +ReferenceLineLabelConfiguration +ReferenceLineStaticDataConfiguration +ReferenceLineStyleConfiguration +ReferenceLineValueLabelConfiguration +ReferenceLines +ReferenceListItem +ReferenceMetric +ReferenceNameRequiredException +ReferencePath +ReferencePredictorArn +ReferencePredictorSummary +ReferenceRoleARN +ReferenceRoleARNUpdate +ReferenceScalar +ReferenceSchema +ReferenceSchemaUpdate +ReferenceSets +ReferenceStoreDetail +ReferenceStoreFilter +ReferenceSummaryList +ReferenceTypeNotSupportedException +ReferenceTypes +ReferenceUrls +ReferencedBy +ReferencedByResources +ReferencedGroupId +ReferencedGroupInfo +ReferencedImageDetail +ReferencedImagesNotFoundException +ReferencedSecurityGroup +References +ReferencingVpcId +ReferrerPolicy +Refresh +RefreshArn +RefreshCacheInput +RefreshCacheOutput +RefreshClosedReports +RefreshConfiguration +RefreshDetails +RefreshFrequency +RefreshId +RefreshOnDay +RefreshOnSegmentUpdate +RefreshPreferences +RefreshSchedule +RefreshSchedules +RefreshSchemasMessage +RefreshSchemasResponse +RefreshSchemasStatus +RefreshStatisticsIdMap +RefreshStatus +RefreshToken +RefreshTokenExpiration +RefreshTokenRequest +RefreshTokenRequestBody +RefreshTokenResponse +RefreshTokenValidity +RefreshTrustedAdvisorCheckRequest +RefreshTrustedAdvisorCheckResponse +RefreshType +RefreshedAt +RegParamsRevision +RegenerateSecurityTokenRequest +RegenerateSecurityTokenResponse +Regex +RegexMatchSet +RegexMatchSetId +RegexMatchSetSummary +RegexMatchSetUpdate +RegexMatchSets +RegexMatchStatement +RegexMatchTuple +RegexMatchTuples +RegexPatternSet +RegexPatternSetId +RegexPatternSetReferenceStatement +RegexPatternSetSummary +RegexPatternSetUpdate +RegexPatternSets +RegexPatternString +RegexPatternStrings +RegexString +Region +RegionCode +RegionConcurrencyType +RegionDescription +RegionDisabledException +RegionFilters +RegionIdentifier +RegionInfo +RegionLimitExceededException +RegionLinkingMode +RegionMapInputValue +RegionName +RegionNames +RegionOfInterest +RegionOptStatus +RegionOptStatusContains +RegionOrder +RegionReport +RegionScope +RegionType +RegionalBucket +RegionalBucketList +RegionalConfiguration +RegionalConfigurations +Regions +RegionsDescription +RegionsInfo +RegionsOfInterest +RegionsOfInterestForUpdate +RegisterAVSDeviceRequest +RegisterAVSDeviceResponse +RegisterAccountRequest +RegisterAccountResponse +RegisterActivityTypeInput +RegisterAgentRequest +RegisterAgentResponse +RegisterAppInstanceUserEndpointRequest +RegisterAppInstanceUserEndpointResponse +RegisterApplicationInput +RegisterApplicationOutput +RegisterApplicationRevisionInput +RegisterCACertificateRequest +RegisterCACertificateResponse +RegisterCertificateRequest +RegisterCertificateResponse +RegisterCertificateResult +RegisterCertificateWithoutCARequest +RegisterCertificateWithoutCAResponse +RegisterClientRequest +RegisterClientResponse +RegisterClusterRequest +RegisterClusterResponse +RegisterComputeInput +RegisterComputeOutput +RegisterConnectorRequest +RegisterConnectorResponse +RegisterContainerImageRequest +RegisterContainerImageResult +RegisterContainerInstanceRequest +RegisterContainerInstanceResponse +RegisterCrossAccountAccessRoleRequest +RegisterDBProxyTargetsRequest +RegisterDBProxyTargetsResponse +RegisterDataLakeDelegatedAdministratorRequest +RegisterDefaultPatchBaselineRequest +RegisterDefaultPatchBaselineResult +RegisterDelegatedAdministratorRequest +RegisterDeviceRequest +RegisterDeviceResponse +RegisterDevicesRequest +RegisterDomainInput +RegisterDomainRequest +RegisterDomainResponse +RegisterEcsClusterRequest +RegisterEcsClusterResult +RegisterElasticIpRequest +RegisterElasticIpResult +RegisterEndPointsInput +RegisterEndPointsOutput +RegisterEndpoints +RegisterEventTopicRequest +RegisterGameServerInput +RegisterGameServerOutput +RegisterIdentityProviderRequest +RegisterIdentityProviderResponse +RegisterImageRequest +RegisterImageResult +RegisterInstanceEventNotificationAttributesRequest +RegisterInstanceEventNotificationAttributesResult +RegisterInstanceRequest +RegisterInstanceResponse +RegisterInstanceResult +RegisterInstanceTagAttributeRequest +RegisterJobDefinitionRequest +RegisterJobDefinitionResponse +RegisterMailDomainRequest +RegisterModel +RegisterModelStepMetadata +RegisterNewBaseline +RegisterOnPremisesInstanceInput +RegisterOrganizationAdminAccountRequest +RegisterOrganizationAdminAccountResponse +RegisterOrganizationDelegatedAdminRequest +RegisterPackageVersionRequest +RegisterPatchBaselineForPatchGroupRequest +RegisterPatchBaselineForPatchGroupResult +RegisterPublisherInput +RegisterPublisherOutput +RegisterRdsDbInstanceRequest +RegisterResourceRequest +RegisterRobotRequest +RegisterRobotResponse +RegisterScalableTargetRequest +RegisterScalableTargetResponse +RegisterSchemaVersionInput +RegisterSchemaVersionResponse +RegisterSlackWorkspaceForOrganizationRequest +RegisterSlackWorkspaceForOrganizationResult +RegisterStreamConsumerInput +RegisterStreamConsumerOutput +RegisterTargetWithMaintenanceWindowRequest +RegisterTargetWithMaintenanceWindowResult +RegisterTargetsInput +RegisterTargetsRequest +RegisterTargetsResponse +RegisterTaskDefinitionRequest +RegisterTaskDefinitionResponse +RegisterTaskWithMaintenanceWindowRequest +RegisterTaskWithMaintenanceWindowResult +RegisterThingRequest +RegisterThingResponse +RegisterToWorkMailRequest +RegisterTransitGatewayMulticastGroupMembersRequest +RegisterTransitGatewayMulticastGroupMembersResult +RegisterTransitGatewayMulticastGroupSourcesRequest +RegisterTransitGatewayMulticastGroupSourcesResult +RegisterTransitGatewayRequest +RegisterTransitGatewayResponse +RegisterTypeInput +RegisterTypeOutput +RegisterUsageRequest +RegisterUsageResult +RegisterUserRequest +RegisterUserResponse +RegisterVolumeRequest +RegisterVolumeResult +RegisterWebhookWithThirdPartyInput +RegisterWorkflowTypeInput +RegisterWorkspaceDirectoryRequest +Registered +RegisteredAt +RegisteredBy +RegisteredContainerInstancesCount +RegisteredDate +RegisteredDateTime +RegisteredDeviceCount +RegisteredDomainDelegationInfo +RegisteredGatewayArn +RegisteredId +RegisteredMulticastGroupMembers +RegisteredMulticastGroupSources +RegisteredNetworkInterfaceIds +RegisteredOn +RegisteredTime +RegisteredUserConsoleFeatureConfigurations +RegisteredUserDashboardEmbeddingConfiguration +RegisteredUserDashboardFeatureConfigurations +RegisteredUserDashboardVisualEmbeddingConfiguration +RegisteredUserEmbeddingExperienceConfiguration +RegisteredUserQSearchBarEmbeddingConfiguration +RegisteredUserQuickSightConsoleEmbeddingConfiguration +Registering +RegistrantContact +RegistrantPrivacy +RegistrarName +RegistrarUrl +RegistrationCode +RegistrationCodeValidationException +RegistrationConfig +RegistrationDate +RegistrationId +RegistrationLimit +RegistrationMetadata +RegistrationMetadataItem +RegistrationOutput +RegistrationPagePath +RegistrationPrice +RegistrationStatusFilter +RegistrationTime +RegistrationToken +RegistrationTokenList +RegistrationZone +RegistrationsCount +Registries +Registry +RegistryAlias +RegistryArn +RegistryCatalogData +RegistryCredential +RegistryDomainId +RegistryId +RegistryListItem +RegistryName +RegistryNamePrefix +RegistryNotFoundException +RegistryPolicyNotFoundException +RegistryScanningConfiguration +RegistryScanningRule +RegistrySummary +RegularExpressionList +RehydrationType +ReimportApiRequest +ReimportApiResponse +RejectAssignmentRequest +RejectAttachmentRequest +RejectAttachmentResponse +RejectCertificateTransferRequest +RejectClientVpcConnectionRequest +RejectDataShareMessage +RejectDomainTransferFromAnotherAwsAccountRequest +RejectDomainTransferFromAnotherAwsAccountResponse +RejectEnvironmentAccountConnectionInput +RejectEnvironmentAccountConnectionOutput +RejectGrantRequest +RejectGrantResponse +RejectInboundConnectionRequest +RejectInboundConnectionResponse +RejectInboundCrossClusterSearchConnectionRequest +RejectInboundCrossClusterSearchConnectionResponse +RejectInputDeviceTransferRequest +RejectInvitationInput +RejectInvitationRequest +RejectPortfolioShareInput +RejectQualificationRequestRequest +RejectResourceShareInvitationRequest +RejectResourceShareInvitationResponse +RejectSharedDirectoryRequest +RejectSharedDirectoryResult +RejectSkillRequest +RejectTransitGatewayMulticastDomainAssociationsRequest +RejectTransitGatewayMulticastDomainAssociationsResult +RejectTransitGatewayPeeringAttachmentRequest +RejectTransitGatewayPeeringAttachmentResult +RejectTransitGatewayVpcAttachmentRequest +RejectTransitGatewayVpcAttachmentResult +RejectVpcEndpointConnectionsRequest +RejectVpcEndpointConnectionsResult +RejectVpcPeeringConnectionRequest +RejectVpcPeeringConnectionResult +RejectedLogEventsInfo +RejectedPatches +RejectedPatchesAction +RejectedRecord +RejectedRecords +RejectedRecordsException +RejectionTime +Rejects +RekeyFuzzPercentage +RekeyMarginTimeSeconds +RelatedAnomalies +RelatedColumnName +RelatedContactId +RelatedDeployments +RelatedEvents +RelatedFinding +RelatedFindings +RelatedFindingsId +RelatedFindingsProductArn +RelatedItem +RelatedItemEventIncludedData +RelatedObservations +RelatedOpsItem +RelatedOpsItems +RelatedRequirements +RelatedResource +RelatedResourceArns +RelatedVulnerabilities +RelatedWorkspaceProperties +RelatedWorkspaces +RelationType +RelationalCatalogSource +RelationalDatabase +RelationalDatabaseBlueprint +RelationalDatabaseBundle +RelationalDatabaseDataSourceConfig +RelationalDatabaseEndpoint +RelationalDatabaseEvent +RelationalDatabaseHardware +RelationalDatabaseParameter +RelationalDatabaseSnapshot +RelationalTable +Relationship +RelationshipScore +RelationshipStatus +RelationshipType +RelationshipTypeFilter +RelationshipValue +Relationships +RelationshipsListItem +Relative +RelativeAggregationDuration +RelativeDateFilter +RelativeDateFilterFunction +RelativeDateTime +RelativeDateTimeControlDisplayOptions +RelativeDateType +RelativeDateValue +RelativeDatesFilter +RelativePath +RelativePosition +RelativeProgram +RelativeTimeRange +RelayState +RelayStateParameterName +Release +ReleaseAddressRequest +ReleaseAfterMinutes +ReleaseAgentPath +ReleaseConfiguration +ReleaseDate +ReleaseFileSystemNfsV3LocksRequest +ReleaseFileSystemNfsV3LocksResponse +ReleaseHostsRequest +ReleaseHostsResult +ReleaseIpamPoolAllocationRequest +ReleaseIpamPoolAllocationResult +ReleaseLabel +ReleaseLabelFilter +ReleaseLabels +ReleaseNotes +ReleasePhoneNumberRequest +ReleasePhoneNumberResult +ReleaseStaticIpRequest +ReleaseStaticIpResult +ReleaseStatus +ReleaseSummaries +ReleaseSummary +ReleaseTime +ReleaseVersion +ReleasedCapacity +Relevance +RelevanceFeedback +RelevanceFeedbackItems +RelevanceValue +ReloadOption +ReloadReplicationTablesMessage +ReloadReplicationTablesResponse +ReloadTablesMessage +ReloadTablesResponse +RemainingCount +RemainingLife +RemainingTotalValue +RemainingUpfrontValue +Remarks +Remediation +RemediationAction +RemediationActionType +RemediationActionWithOrder +RemediationConfiguration +RemediationConfigurations +RemediationEnabled +RemediationException +RemediationExceptionResourceKey +RemediationExceptions +RemediationExecutionStatus +RemediationExecutionStatuses +RemediationExecutionStep +RemediationInProgressException +RemediationParameterValue +RemediationRecommendation +RemediationResult +RemediationUrl +ReminderAtMinutes +ReminderType +RemixSettings +Remote +RemoteAccessConfig +RemoteAccessSession +RemoteAccountDetails +RemoteAdministrationEndpoint +RemoteDirectoryPath +RemoteDomainInfo +RemoteDomainName +RemoteDomainNames +RemoteId +RemoteIpDetails +RemoteIpv4NetworkCidr +RemoteIpv6NetworkCidr +RemoteManagement +RemoteMta +RemotePortDetails +RemoteSourceCodeAnalysisServerInfo +RemoteSources +Removals +Remove +RemoveAccountFromOrganizationRequest +RemoveAclConfiguration +RemoveAction +RemoveAllBackendsRequest +RemoveAllBackendsResponse +RemoveAllPermissions +RemoveAllResourcePermissionsRequest +RemoveAllocationResourceTags +RemoveAllowedPrincipals +RemoveApplicationInstanceRequest +RemoveAttributesActivity +RemoveAttributesFromFindingsRequest +RemoveAttributesFromFindingsResponse +RemoveAttributesRequest +RemoveAttributesResponse +RemoveAutoScalingPolicyInput +RemoveAutoTerminationPolicyInput +RemoveAvailabilityZonesInput +RemoveAvailabilityZonesOutput +RemoveBackendConfigRequest +RemoveBackendConfigResponse +RemoveBridgeOutputRequest +RemoveBridgeOutputResponse +RemoveBridgeSourceRequest +RemoveBridgeSourceResponse +RemoveBytesScannedCutoffPerQuery +RemoveClientIDFromOpenIDConnectProviderRequest +RemoveCustomRoutingEndpointsRequest +RemoveCustomerContentEncryptionConfiguration +RemoveCustomerOverride +RemoveDraftAppVersionResourceMappingsRequest +RemoveDraftAppVersionResourceMappingsResponse +RemoveEncryptionConfiguration +RemoveEndDate +RemoveEndpointsRequest +RemoveEntries +RemoveExpectedBucketOwner +RemoveFacetFromObject +RemoveFacetFromObjectRequest +RemoveFields +RemoveFlowMediaStreamRequest +RemoveFlowMediaStreamResponse +RemoveFlowOutputRequest +RemoveFlowOutputResponse +RemoveFlowSourceRequest +RemoveFlowSourceResponse +RemoveFlowVpcInterfaceRequest +RemoveFlowVpcInterfaceResponse +RemoveFromGlobalClusterMessage +RemoveFromGlobalClusterResult +RemoveFromVersionId +RemoveGatewayLoadBalancerArns +RemoveHeadersConfig +RemoveIamRoles +RemoveInvalidCertificateFromPersonalStore +RemoveIpRoutesRequest +RemoveIpamOperatingRegion +RemoveKnowledgeBaseTemplateUriRequest +RemoveLFTagsFromResourceRequest +RemoveLFTagsFromResourceResponse +RemoveLayerVersionPermissionRequest +RemoveLicenseSpecifications +RemoveListenerCertificatesInput +RemoveManagedScalingPolicyInput +RemoveNetworkLoadBalancerArns +RemoveNetworkServices +RemoveNotificationChannelRequest +RemoveNotificationChannelResponse +RemoveOperatingRegions +RemoveOutputLocation +RemovePermissionInput +RemovePermissionRequest +RemovePermissionResponse +RemovePrefixListEntry +RemovePrivateDnsName +RemoveProfilePermissionRequest +RemoveProfilePermissionResponse +RemoveQuotes +RemoveRegionRequest +RemoveRegionsFromReplicationRequest +RemoveRegionsFromReplicationResponse +RemoveReplicaRegions +RemoveResourcePermissionRequest +RemoveRoleFromDBClusterMessage +RemoveRoleFromDBInstanceMessage +RemoveRoleFromInstanceProfileRequest +RemoveRouteTableIds +RemoveSNSTopic +RemoveSchemaVersionMetadataInput +RemoveSchemaVersionMetadataResponse +RemoveSecurityGroupIds +RemoveSourceIdentifierFromSubscriptionMessage +RemoveSourceIdentifierFromSubscriptionResult +RemoveSourceServerActionRequest +RemoveStorageSystemRequest +RemoveSubnetArns +RemoveSubnetIds +RemoveSubnets +RemoveSupportedIpAddressTypes +RemoveTagKeys +RemoveTags +RemoveTagsFromCertificateRequest +RemoveTagsFromOnPremisesInstancesInput +RemoveTagsFromResourceInput +RemoveTagsFromResourceMessage +RemoveTagsFromResourceOutput +RemoveTagsFromResourceRequest +RemoveTagsFromResourceResponse +RemoveTagsFromStreamInput +RemoveTagsFromVaultInput +RemoveTagsInput +RemoveTagsRequest +RemoveTargetsRequest +RemoveTargetsResponse +RemoveTargetsResultEntry +RemoveTemplateActionRequest +RemoveThingFromBillingGroupRequest +RemoveThingFromThingGroupRequest +RemoveTransitGatewayCidrBlocks +RemoveUserFromGroupRequest +RemoveUserGroups +RemoveWorkloadRequest +RemovedLabels +RenameColumnOperation +RenameField +RenderUiTemplateRequest +RenderUiTemplateResponse +RenderableTask +RenderedContent +RenderedTemplate +RenderingConfiguration +RenderingEngine +RenderingError +RenderingRules +RenditionConfiguration +RenditionGroupId +RenditionLanguageCode +RenditionName +RenewCertificateRequest +RenewDomainRequest +RenewDomainResponse +RenewOfferingRequest +RenewOfferingResult +RenewType +RenewalCount +RenewalEligibility +RenewalPeriod +RenewalPrice +RenewalSettings +RenewalStatus +RenewalStatusReason +RenewalSummary +RenewalType +ReorderReceiptRuleSetRequest +RepInterval +RepeatAt +RepeatExtXKey +RepeatFrameMsec +RepeatPps +Replace +ReplaceAllLabels +ReplaceChars +ReplaceContentEntry +ReplaceDefaultPolicyVersionParams +ReplaceIamInstanceProfileAssociationRequest +ReplaceIamInstanceProfileAssociationResult +ReplaceInvalidChars +ReplaceKeyPrefixWith +ReplaceKeyWith +ReplaceNetworkAclAssociationRequest +ReplaceNetworkAclAssociationResult +ReplaceNetworkAclEntryRequest +ReplacePathPrefix +ReplacePermissionAssociationsRequest +ReplacePermissionAssociationsResponse +ReplacePermissionAssociationsWork +ReplaceRootVolumeTask +ReplaceRootVolumeTaskId +ReplaceRootVolumeTaskIds +ReplaceRootVolumeTasks +ReplaceRouteRequest +ReplaceRouteTableAssociationRequest +ReplaceRouteTableAssociationResult +ReplaceTopicRuleRequest +ReplaceTransitGatewayRouteRequest +ReplaceTransitGatewayRouteResult +ReplaceUnhealthyInstances +ReplaceVpnTunnelRequest +ReplaceVpnTunnelResult +Replacement +ReplacementContentRequiredException +ReplacementEmailContent +ReplacementJob +ReplacementStrategy +ReplacementTags +ReplacementTemplate +ReplacementTemplateData +ReplacementTypeRequiredException +Replay +ReplayArn +ReplayDestination +ReplayEndTime +ReplayName +ReplayStartTime +ReplayWindowSize +Replays +Replica +ReplicaAlias +ReplicaAlreadyExistsException +ReplicaAutoScalingDescription +ReplicaAutoScalingUpdate +ReplicaAvailabilityZones +ReplicaBillingModeSummary +ReplicaConfiguration +ReplicaConfigurationRequest +ReplicaCount +ReplicaDescription +ReplicaGlobalSecondaryIndex +ReplicaGlobalSecondaryIndexAutoScalingDescription +ReplicaGlobalSecondaryIndexAutoScalingUpdate +ReplicaGlobalSecondaryIndexDescription +ReplicaGlobalSecondaryIndexSettings +ReplicaGlobalSecondaryIndexSettingsDescription +ReplicaGlobalSecondaryIndexSettingsUpdate +ReplicaGlobalSecondaryIndexUpdates +ReplicaInaccessibleDateTime +ReplicaKeyMetadata +ReplicaKeys +ReplicaKmsKeyID +ReplicaMode +ReplicaModifications +ReplicaNotFoundException +ReplicaOutpostArns +ReplicaPolicy +ReplicaProvisionedReadCapacityAutoScalingSettings +ReplicaProvisionedReadCapacityAutoScalingSettingsUpdate +ReplicaProvisionedReadCapacityAutoScalingUpdate +ReplicaProvisionedReadCapacityUnits +ReplicaProvisionedWriteCapacityAutoScalingSettings +ReplicaProvisionedWriteCapacityUnits +ReplicaRegion +ReplicaRegionType +ReplicaSettings +ReplicaSettingsDescription +ReplicaSettingsUpdate +ReplicaStatus +ReplicaStatusDescription +ReplicaStatusPercentProgress +ReplicaTableClass +ReplicaTableClassSummary +ReplicaTags +ReplicaUpdate +ReplicaUpdates +Replicas +ReplicasPerNodeGroup +ReplicasToRemove +ReplicateInstanceRequest +ReplicateInstanceResponse +ReplicateKeyRequest +ReplicateKeyResponse +ReplicateSecretToRegionsRequest +ReplicateSecretToRegionsResponse +ReplicateShardCollections +ReplicateTo +ReplicatingFrom +ReplicatingTo +Replication +ReplicationConfig +ReplicationConfigArn +ReplicationConfigCreateTime +ReplicationConfigIdentifier +ReplicationConfigUpdateTime +ReplicationConfigs +ReplicationConfiguration +ReplicationConfigurationDescription +ReplicationConfigurationReplicatedDisk +ReplicationConfigurationTemplate +ReplicationCreateTime +ReplicationDestination +ReplicationDetails +ReplicationFactor +ReplicationGroup +ReplicationGroupAlreadyExistsFault +ReplicationGroupAlreadyUnderMigrationFault +ReplicationGroupCreateTime +ReplicationGroupDescription +ReplicationGroupId +ReplicationGroupIds +ReplicationGroupLogDeliveryEnabled +ReplicationGroupMessage +ReplicationGroupNotFoundFault +ReplicationGroupNotUnderMigrationFault +ReplicationGroupPendingModifiedValues +ReplicationGroupRegion +ReplicationGroupUpdate +ReplicationGroups +ReplicationInstance +ReplicationInstanceArn +ReplicationInstanceClass +ReplicationInstanceEngineMinimumVersion +ReplicationInstanceIdentifier +ReplicationInstanceIpv6Addresses +ReplicationInstancePrivateIpAddress +ReplicationInstancePrivateIpAddresses +ReplicationInstancePublicIpAddress +ReplicationInstancePublicIpAddresses +ReplicationInstanceStatus +ReplicationInstanceTaskLog +ReplicationInstanceTaskLogSize +ReplicationInstanceTaskLogs +ReplicationInstances +ReplicationJob +ReplicationJobAlreadyExistsException +ReplicationJobNotFoundException +ReplicationLastStopTime +ReplicationNotFound +ReplicationPendingModifiedValues +ReplicationRule +ReplicationRuleAndOperator +ReplicationRuleFilter +ReplicationRun +ReplicationRunLimitExceededException +ReplicationRunStageDetails +ReplicationScope +ReplicationSet +ReplicationSettings +ReplicationSourceIdentifier +ReplicationSpecification +ReplicationStats +ReplicationStatus +ReplicationStatusType +ReplicationSubnetGroup +ReplicationSubnetGroupDescription +ReplicationSubnetGroupDoesNotCoverEnoughAZs +ReplicationSubnetGroupId +ReplicationSubnetGroupIdentifier +ReplicationSubnetGroups +ReplicationTableStatistics +ReplicationTask +ReplicationTaskArn +ReplicationTaskAssessmentResult +ReplicationTaskAssessmentResults +ReplicationTaskAssessmentRun +ReplicationTaskAssessmentRunArn +ReplicationTaskAssessmentRunCreationDate +ReplicationTaskAssessmentRunProgress +ReplicationTaskAssessmentRuns +ReplicationTaskCreationDate +ReplicationTaskIdentifier +ReplicationTaskIndividualAssessment +ReplicationTaskIndividualAssessmentArn +ReplicationTaskIndividualAssessmentStartDate +ReplicationTaskIndividualAssessments +ReplicationTaskLastAssessmentDate +ReplicationTaskName +ReplicationTaskSettings +ReplicationTaskStartDate +ReplicationTaskStats +ReplicationTasks +ReplicationTime +ReplicationTimeValue +ReplicationType +ReplicationUpdateTime +ReplicationUser +Replications +ReplyTo +ReplyToAddresses +ReplyToEmailAddress +RepoPrefixLocation +RepoUpgradeOnBoot +Report +ReportConfiguration +ReportContext +ReportCreatorAccount +ReportDefinition +ReportDefinitions +ReportDeliveryChannel +ReportDestination +ReportDestinationS3 +ReportDevStatusBattery +ReportDevStatusMargin +ReportExportConfig +ReportFilter +ReportFormat +ReportFrequency +ReportGenerated +ReportGenerationLimitExceededException +ReportGenerator +ReportGeneratorName +ReportGenerators +ReportGroup +ReportGroupTrendStats +ReportId +ReportInstanceStatusRequest +ReportJob +ReportJobId +ReportJobs +ReportLevel +ReportLimitReachedException +ReportName +ReportOverride +ReportOverrides +ReportPlan +ReportPlanArn +ReportPlanDescription +ReportPlanName +ReportPlanTags +ReportPlans +ReportResult +ReportS3Configuration +ReportScope +ReportSetting +ReportTaskProgressInput +ReportTaskProgressOutput +ReportTaskRunnerHeartbeatInput +ReportTaskRunnerHeartbeatOutput +ReportTemplate +ReportType +ReportUri +ReportVersioning +ReportWithRawData +ReportedAgentVersion +ReportedName +ReportedOs +ReportedRuntimeContextState +ReportedVersion +ReportingMta +Repository +RepositoryAccessMode +RepositoryAggregation +RepositoryAggregationResponse +RepositoryAlreadyExistsException +RepositoryAnalysis +RepositoryAssociation +RepositoryAssociationArn +RepositoryAssociationSummaries +RepositoryAssociationSummary +RepositoryAuthConfig +RepositoryBranch +RepositoryBranchInput +RepositoryCatalogData +RepositoryCatalogDataInput +RepositoryCatalogDataNotFoundException +RepositoryCredentials +RepositoryCredentialsProviderArn +RepositoryDescription +RepositoryDoesNotExistException +RepositoryExternalConnectionInfo +RepositoryFilter +RepositoryHead +RepositoryHeadSourceCodeType +RepositoryInput +RepositoryLimitExceededException +RepositoryMetadata +RepositoryName +RepositoryNameExistsException +RepositoryNameIdPair +RepositoryNameRequiredException +RepositoryNames +RepositoryNamesRequiredException +RepositoryNotAssociatedWithPullRequestException +RepositoryNotEmptyException +RepositoryNotFoundException +RepositoryOwner +RepositoryPolicyNotFoundException +RepositoryPolicyText +RepositoryScanningConfiguration +RepositoryScanningConfigurationFailure +RepositorySummary +RepositorySyncAttempt +RepositorySyncDefinition +RepositorySyncEvent +RepositoryTrigger +RepositoryTriggerBranchNameListRequiredException +RepositoryTriggerDestinationArnRequiredException +RepositoryTriggerEventsListRequiredException +RepositoryTriggerExecutionFailure +RepositoryTriggerNameRequiredException +RepositoryTriggersListRequiredException +RepositoryType +RepositoryUrl +ReprocessingSummary +RepublishAction +ReputationMetricsEnabled +ReputationOptions +Request +RequestAlreadyInProgressException +RequestAlreadyProcessedException +RequestBody +RequestBodyAssociatedResourceTypeConfig +RequestCancelActivityTaskDecisionAttributes +RequestCancelActivityTaskFailedEventAttributes +RequestCancelExternalWorkflowExecutionDecisionAttributes +RequestCancelExternalWorkflowExecutionFailedEventAttributes +RequestCancelExternalWorkflowExecutionInitiatedEventAttributes +RequestCancelWorkflowExecutionInput +RequestCertificateRequest +RequestCertificateResponse +RequestChangedException +RequestCharacters +RequestCharged +RequestCompletionTime +RequestConfiguration +RequestCount +RequestDetailedStatus +RequestDetails +RequestEntityTooLargeException +RequestEntry +RequestEnvironmentInfoMessage +RequestError +RequestFailedException +RequestFilterPortRange +RequestHeaders +RequestHeadersInserted +RequestID +RequestId +RequestIdentifier +RequestImpactStatistics +RequestInProgressException +RequestInspection +RequestInspectionACFP +RequestInterval +RequestIpamResourceTag +RequestItems +RequestLaunchTemplateData +RequestLimitExceeded +RequestLimitExceededException +RequestMetadata +RequestModels +RequestOrigin +RequestOutputItem +RequestParameterKey +RequestParameters +RequestPayer +RequestPaymentConfiguration +RequestPhoneNumberRequest +RequestPhoneNumberResult +RequestProgress +RequestResponses +RequestRoute +RequestServiceQuotaIncreaseRequest +RequestServiceQuotaIncreaseResponse +RequestSource +RequestSpotFleetRequest +RequestSpotFleetResponse +RequestSpotInstancesRequest +RequestSpotInstancesResult +RequestSpotLaunchSpecification +RequestStatus +RequestStatusMessage +RequestTTLSeconds +RequestTemplates +RequestThrottledException +RequestTime +RequestTimeoutException +RequestTimeoutSeconds +RequestToken +RequestTokenARN +RequestTokenNotFoundException +RequestTooLargeException +RequestType +RequestUploadCredentialsInput +RequestUploadCredentialsOutput +RequestUri +RequestValidator +RequestValidators +Requested +RequestedAmiVersion +RequestedColumns +RequestedDateTime +RequestedDimensions +RequestedDocumentAttributes +RequestedEc2AvailabilityZones +RequestedEc2SubnetIds +RequestedEntityTooLargeException +RequestedInstanceCount +RequestedJobStatus +RequestedProvisionedConcurrentExecutions +RequestedQuota +RequestedQuotas +RequestedRangeNotSatisfiableException +RequestedServiceQuotaChange +RequestedTime +RequestedTimestamp +RequestedValue +Requester +RequesterAccountId +RequesterAnnotation +RequesterAwsRegion +RequesterCharged +RequesterFeedback +RequesterId +RequesterManaged +RequesterPays +RequesterPaysEnabled +RequesterPeeringConnectionOptions +RequesterTgwInfo +RequesterVpcInfo +Requests +RequestsPerSecond +RequireAlternateSignatureAlgorithm +RequireAuthorizationForCacheControl +RequireCheckIn +RequireCommonName +RequireDirectoryPath +RequireDnsAsCn +RequireEachIncludedType +RequireEmail +RequireEncryption +RequireHibernateSupport +RequireLowercase +RequireLowercaseCharacters +RequireNumbers +RequirePin +RequireSameKeyRenewal +RequireSymbols +RequireTLS +RequireType +RequireUppercase +RequireUppercaseCharacters +Required +RequiredActivatedType +RequiredActivatedTypes +RequiredBehavior +RequiredCapabilities +RequiredEquipmentTypes +RequiredField +RequiredFieldInfo +RequiredFields +RequiredMinimumPollIntervalInSeconds +RequiredParameters +RequiredSignUpAttributes +RequiredTenancy +RequiredToPreview +Requirement +RequirementsS3ObjectVersion +RequirementsS3Path +RequirementsToTarget +Requires +RequiresAutoMinorEngineVersionUpgrade +RequiresCompatibilities +RequiresIndexDocuments +RequiresRecreation +ResamplingConfigInput +RescoreCapacityUnits +RescoreExecutionPlanId +RescoreExecutionPlanSummary +RescoreId +RescoreRequest +RescoreResult +RescoreResultItem +Reseller +ResendConfirmationCodeRequest +ResendConfirmationCodeResponse +ResendContactReachabilityEmailRequest +ResendContactReachabilityEmailResponse +ResendOperationAuthorizationRequest +ResendValidationEmailRequest +Reservation +ReservationARN +ReservationAggregates +ReservationArn +ReservationCoverageGroup +ReservationCoveredHoursInLookbackPeriod +ReservationFleetInstanceSpecification +ReservationId +ReservationName +ReservationPlan +ReservationPlanSettings +ReservationPurchaseRecommendation +ReservationPurchaseRecommendationDetail +ReservationPurchaseRecommendationMetadata +ReservationPurchaseRecommendationSummary +ReservationResourceSpecification +ReservationState +ReservationType +ReservationUtilizationGroup +ReservationValue +Reservations +ReserveContactRequest +ReserveRange +Reserved +ReservedBitrate +ReservedCacheNode +ReservedCacheNodeAlreadyExistsFault +ReservedCacheNodeId +ReservedCacheNodeMessage +ReservedCacheNodeNotFoundFault +ReservedCacheNodeQuotaExceededFault +ReservedCacheNodes +ReservedCacheNodesOffering +ReservedCacheNodesOfferingId +ReservedCacheNodesOfferingMessage +ReservedCacheNodesOfferingNotFoundFault +ReservedCacheNodesOfferings +ReservedConcurrentExecutions +ReservedDBInstance +ReservedDBInstanceAlreadyExistsFault +ReservedDBInstanceArn +ReservedDBInstanceId +ReservedDBInstanceMessage +ReservedDBInstanceNotFoundFault +ReservedDBInstanceQuotaExceededFault +ReservedDBInstances +ReservedDBInstancesOffering +ReservedDBInstancesOfferingId +ReservedDBInstancesOfferingMessage +ReservedDBInstancesOfferingNotFoundFault +ReservedDBInstancesOfferings +ReservedElasticsearchInstance +ReservedElasticsearchInstanceId +ReservedElasticsearchInstanceOffering +ReservedElasticsearchInstanceOfferingId +ReservedElasticsearchInstanceOfferings +ReservedElasticsearchInstances +ReservedHours +ReservedInstance +ReservedInstanceId +ReservedInstanceIds +ReservedInstanceLimitPrice +ReservedInstanceOffering +ReservedInstanceOfferingId +ReservedInstanceOfferings +ReservedInstanceOptions +ReservedInstanceReservationValue +ReservedInstanceValueRollup +ReservedInstanceValueSet +ReservedInstances +ReservedInstancesConfiguration +ReservedInstancesId +ReservedInstancesIds +ReservedInstancesListing +ReservedInstancesListingId +ReservedInstancesListings +ReservedInstancesModification +ReservedInstancesModificationId +ReservedInstancesModificationIds +ReservedInstancesModificationResult +ReservedInstancesModifications +ReservedInstancesOffering +ReservedInstancesOfferingId +ReservedInstancesOfferingIds +ReservedInstancesOfferings +ReservedNameException +ReservedNode +ReservedNodeAlreadyExistsFault +ReservedNodeAlreadyMigratedFault +ReservedNodeConfigurationOption +ReservedNodeConfigurationOptionList +ReservedNodeExchangeNotFoundFault +ReservedNodeExchangeRequestId +ReservedNodeExchangeStatus +ReservedNodeExchangeStatusDetails +ReservedNodeId +ReservedNodeNotFoundFault +ReservedNodeOffering +ReservedNodeOfferingId +ReservedNodeOfferingNotFoundFault +ReservedNodeOfferingType +ReservedNodeOfferings +ReservedNodeOfferingsMessage +ReservedNodeQuotaExceededFault +ReservedNodes +ReservedNodesMessage +ReservedNodesOffering +ReservedNodesOfferingId +ReservedNodesOfferingNotFoundFault +ReservedNodesOfferings +ReservedNormalizedUnits +ReservedSlots +ReservedStreamCapacity +ReservoirQuota +ReservoirQuotaTTL +ReservoirSize +ResetActionConfiguration +ResetAddressAttributeRequest +ResetAddressAttributeResult +ResetAlarmActionRequest +ResetAllParameters +ResetAuthorizersCacheRequest +ResetCacheInput +ResetCacheOutput +ResetCacheParameterGroupMessage +ResetClusterParameterGroupMessage +ResetConnectorMetadataCacheRequest +ResetDBClusterParameterGroupMessage +ResetDBParameterGroupMessage +ResetDeploymentsRequest +ResetDeploymentsResponse +ResetDisabled +ResetDistributionCacheRequest +ResetDistributionCacheResult +ResetEbsDefaultKmsKeyIdRequest +ResetEbsDefaultKmsKeyIdResult +ResetElements +ResetEncryptionKeyRequest +ResetFpgaImageAttributeRequest +ResetFpgaImageAttributeResult +ResetImageAttributeRequest +ResetInstanceAttributeRequest +ResetJobBookmarkRequest +ResetJobBookmarkResponse +ResetNetworkInterfaceAttributeRequest +ResetNotificationSettingsRequest +ResetNotificationSettingsResponse +ResetOrderNumber +ResetParameterGroupRequest +ResetParameterGroupResponse +ResetPasswordRequest +ResetPersonalPINRequest +ResetPersonalPINResponse +ResetPolicy +ResetResourceLogLevelRequest +ResetServiceSettingRequest +ResetServiceSettingResult +ResetServiceSpecificCredentialRequest +ResetServiceSpecificCredentialResponse +ResetSnapshotAttributeRequest +ResetTimerAction +ResetUserPasswordRequest +ResetUserPasswordResponse +Resharding +ReshardingConfiguration +ReshardingStatus +Resilience +ResiliencyPolicy +ResiliencyScore +ResizeCluster +ResizeClusterMessage +ResizeClusterResult +ResizeInfo +ResizeNotFoundFault +ResizeOption +ResizeProgressMessage +ResizeSpecifications +ResizeType +Resolution +ResolutionContact +ResolutionMethod +ResolutionStrategy +ResolutionTechniques +ResolutionTime +ResolveAlias +ResolveAliasInput +ResolveAliasOutput +ResolveAppVersionResourcesRequest +ResolveAppVersionResourcesResponse +ResolveCaseRequest +ResolveCaseResponse +ResolveComponentCandidatesRequest +ResolveComponentCandidatesResponse +ResolveCustomerRequest +ResolveCustomerResult +ResolveRoomRequest +ResolveRoomResponse +Resolved +ResolvedArtifact +ResolvedAttributes +ResolvedCIDRCount +ResolvedComponentVersion +ResolvedImage +ResolvedImageUri +ResolvedOutputS3Uri +ResolvedTargets +ResolvedValue +Resolver +ResolverConfig +ResolverConfigs +ResolverDNSSECConfig +ResolverDnssecConfig +ResolverDnssecConfigs +ResolverEndpoint +ResolverEndpointId +ResolverEndpointType +ResolverEndpoints +ResolverIP +ResolverQueryLogConfig +ResolverQueryLogConfigAssociation +ResolverQueryLogConfigAssociationId +ResolverQueryLogConfigAssociations +ResolverQueryLogConfigId +ResolverQueryLogConfigPolicy +ResolverQueryLogConfigs +ResolverRule +ResolverRuleAssociation +ResolverRuleAssociationId +ResolverRuleAssociations +ResolverRuleConfig +ResolverRuleId +ResolverRulePolicy +ResolverRules +Resource +ResourceARN +ResourceARNDetail +ResourceARNList +ResourceARNNotValidException +ResourceARNUpdate +ResourceARNs +ResourceAccessPolicies +ResourceAccessPolicy +ResourceAccessRoleArn +ResourceAction +ResourceAlreadyCheckedOutException +ResourceAlreadyExistException +ResourceAlreadyExistsException +ResourceAlreadyExistsFault +ResourceArn +ResourceArnList +ResourceArnNotFoundException +ResourceArnRequiredException +ResourceArns +ResourceAssociatedException +ResourceAttribute +ResourceAttributeList +ResourceAwsEc2InstanceIamInstanceProfileArn +ResourceAwsEc2InstanceImageId +ResourceAwsEc2InstanceIpV4Addresses +ResourceAwsEc2InstanceIpV6Addresses +ResourceAwsEc2InstanceKeyName +ResourceAwsEc2InstanceLaunchedAt +ResourceAwsEc2InstanceSubnetId +ResourceAwsEc2InstanceType +ResourceAwsEc2InstanceVpcId +ResourceAwsIamAccessKeyCreatedAt +ResourceAwsIamAccessKeyPrincipalName +ResourceAwsIamAccessKeyStatus +ResourceAwsIamAccessKeyUserName +ResourceAwsIamUserUserName +ResourceAwsS3BucketOwnerId +ResourceAwsS3BucketOwnerName +ResourceBudgetEstimate +ResourceCatalog +ResourceCatalogArn +ResourceCatalogName +ResourceCatalogs +ResourceChange +ResourceChangeDetail +ResourceChanges +ResourceCidr +ResourceCollection +ResourceCollectionFilter +ResourceCollectionType +ResourceComplianceStatus +ResourceComplianceSummaryItem +ResourceComplianceSummaryItems +ResourceConcurrentModificationException +ResourceConfig +ResourceConfigForUpdate +ResourceConfiguration +ResourceConfigurationSchemaType +ResourceConflict +ResourceConflictException +ResourceContainerImageId +ResourceContainerImageName +ResourceContainerLaunchedAt +ResourceContainerName +ResourceContentionFault +ResourceCount +ResourceCountByStatus +ResourceCountFilters +ResourceCountsSummary +ResourceCreationFailedException +ResourceCreationLimitPolicy +ResourceDataContainer +ResourceDataSyncAlreadyExistsException +ResourceDataSyncAwsOrganizationsSource +ResourceDataSyncConflictException +ResourceDataSyncCountExceededException +ResourceDataSyncDestinationDataSharing +ResourceDataSyncInvalidConfigurationException +ResourceDataSyncItem +ResourceDataSyncItems +ResourceDataSyncNotFoundException +ResourceDataSyncOrganizationalUnit +ResourceDataSyncS3Destination +ResourceDataSyncSource +ResourceDataSyncSourceWithState +ResourceDefinitionId +ResourceDefinitionVersion +ResourceDefinitionVersionArn +ResourceDefinitionVersionId +ResourceDependencyException +ResourceDescription +ResourceDescriptions +ResourceDetail +ResourceDetails +ResourceDetailsOther +ResourceDiscoveryAssociationCount +ResourceDiscoveryStatus +ResourceDoesNotSupportTagging +ResourceDownloadOwnerSetting +ResourceEndpoint +ResourceEndpointList +ResourceEndpointListItem +ResourceError +ResourceErrorsDetails +ResourceEvaluation +ResourceEvaluationFilters +ResourceEvaluationId +ResourceEvaluations +ResourceExistsException +ResourceFilter +ResourceFilterCriteria +ResourceFilters +ResourceGroup +ResourceGroupName +ResourceGroupTag +ResourceHandlingOption +ResourceHours +ResourceId +ResourceIdList +ResourceIdOverrideConfiguration +ResourceIdPreference +ResourceIdScope +ResourceIdType +ResourceIdentifier +ResourceIdentifierSummaries +ResourceIdentifierSummary +ResourceIdentifiers +ResourceIds +ResourceInUse +ResourceInUseException +ResourceInUseFault +ResourceInfo +ResourceInfoList +ResourceIntegrations +ResourceInventory +ResourceInventoryList +ResourceKey +ResourceKeys +ResourceLabel +ResourceLifecycleConfig +ResourceLimit +ResourceLimitExceeded +ResourceLimitExceededException +ResourceLimits +ResourceList +ResourceLocation +ResourceLocations +ResourceLockedException +ResourceMapFilter +ResourceMapping +ResourceMetadata +ResourceMetrics +ResourceModel +ResourceName +ResourceNotAvailableException +ResourceNotDiscoveredException +ResourceNotFound +ResourceNotFoundException +ResourceNotFoundFault +ResourceNotReadyException +ResourceNotSupportedException +ResourceNumberLimitExceededException +ResourceOverlapStatus +ResourceOwner +ResourceOwnerCheckException +ResourceOwnerId +ResourceOwningAccountId +ResourcePartition +ResourcePath +ResourcePathComponent +ResourcePendingMaintenanceActions +ResourcePermission +ResourcePolicies +ResourcePolicy +ResourcePolicyConflictException +ResourcePolicyInvalidParameterException +ResourcePolicyLimitExceededException +ResourcePolicyNotFoundException +ResourcePolicyNotValidException +ResourcePolicySummary +ResourcePreconditionNotMetException +ResourceProfileArtifact +ResourcePropagationDelayException +ResourceProperties +ResourceProperty +ResourceProvisionedThroughputExceededException +ResourceQuery +ResourceQuota +ResourceQuotaExceededException +ResourceQuotaExceededFault +ResourceQuotas +ResourceReceivingAccess +ResourceRecord +ResourceRecordSet +ResourceRecordSetCount +ResourceRecordSets +ResourceRecords +ResourceReference +ResourceRegion +ResourceRegistrationFailureException +ResourceRequestStatusFilter +ResourceRequestStatusSummaries +ResourceRequirement +ResourceRequirements +ResourceResult +ResourceRetainedBillableTimeInSeconds +ResourceRole +ResourceScanMetadata +ResourceServer +ResourceServerScopeType +ResourceServerType +ResourceServers +ResourceSet +ResourceSetArn +ResourceSetIdentifier +ResourceSetIds +ResourceSetName +ResourceSetOutput +ResourceSetStatus +ResourceSetSummary +ResourceSetType +ResourceSets +ResourceShare +ResourceShareAssociation +ResourceShareInvitation +ResourceShareInvitationAlreadyAcceptedException +ResourceShareInvitationAlreadyRejectedException +ResourceShareInvitationArnNotFoundException +ResourceShareInvitationExpiredException +ResourceShareLimitExceededException +ResourceSharePermissionDetail +ResourceSharePermissionSummary +ResourceShareType +ResourceSpec +ResourceSpecificResult +ResourceSpecificResults +ResourceSpecification +ResourceState +ResourceStatement +ResourceStatementRequest +ResourceStatistics +ResourceStatus +ResourceStatusReason +ResourceStringFilter +ResourceSummary +ResourceSyncAttempt +ResourceSyncEvent +ResourceTag +ResourceTagKey +ResourceTagKeys +ResourceTagList +ResourceTagMapping +ResourceTagMappingList +ResourceTagSet +ResourceTagSets +ResourceTagValue +ResourceTags +ResourceTagsDescriptionMessage +ResourceTagsSearchCriteria +ResourceTargetDefinition +ResourceTargetDetails +ResourceToImport +ResourceType +ResourceTypeFilters +ResourceTypeList +ResourceTypeManagementPreference +ResourceTypeNotFound +ResourceTypeNotSupportedException +ResourceTypeOptInPreference +ResourceTypes +ResourceTypesScope +ResourceUnavailableException +ResourceUri +ResourceUris +ResourceUtilization +ResourceValidationException +ResourceValue +ResourceViolation +ResourceViolations +Resources +ResourcesAffected +ResourcesPerPage +ResourcesSupported +ResourcesToAdd +ResourcesToImport +ResourcesToRemove +ResourcesToSkip +ResourcesVpcConfig +RespondActivityTaskCanceledInput +RespondActivityTaskCompletedInput +RespondActivityTaskFailedInput +RespondDecisionTaskCompletedInput +RespondToAfd +RespondToAuthChallengeRequest +RespondToAuthChallengeResponse +RespondsTo +Response +ResponseAction +ResponseCacheControl +ResponseCard +ResponseCode +ResponseCodeSent +ResponseContentDisposition +ResponseContentEncoding +ResponseContentLanguage +ResponseContentType +ResponseDetails +ResponseError +ResponseExpires +ResponseFinishDateTime +ResponseHeaders +ResponseHeadersPolicy +ResponseHeadersPolicyAccessControlAllowHeaders +ResponseHeadersPolicyAccessControlAllowMethods +ResponseHeadersPolicyAccessControlAllowOrigins +ResponseHeadersPolicyAccessControlExposeHeaders +ResponseHeadersPolicyAlreadyExists +ResponseHeadersPolicyConfig +ResponseHeadersPolicyContentSecurityPolicy +ResponseHeadersPolicyContentTypeOptions +ResponseHeadersPolicyCorsConfig +ResponseHeadersPolicyCustomHeader +ResponseHeadersPolicyCustomHeadersConfig +ResponseHeadersPolicyFrameOptions +ResponseHeadersPolicyId +ResponseHeadersPolicyInUse +ResponseHeadersPolicyList +ResponseHeadersPolicyReferrerPolicy +ResponseHeadersPolicyRemoveHeader +ResponseHeadersPolicyRemoveHeadersConfig +ResponseHeadersPolicySecurityHeadersConfig +ResponseHeadersPolicyServerTimingHeadersConfig +ResponseHeadersPolicyStrictTransportSecurity +ResponseHeadersPolicySummary +ResponseHeadersPolicyXSSProtection +ResponseInspection +ResponseInspectionBodyContains +ResponseInspectionHeader +ResponseInspectionJson +ResponseInspectionStatusCode +ResponseItem +ResponseLaunchTemplateData +ResponseMessage +ResponseModels +ResponseOutputItem +ResponsePagePath +ResponseParameters +ResponsePartitionKey +ResponsePlanSummary +ResponseResourceMetric +ResponseResourceMetricKey +ResponseSignalPreroll +ResponseSpecification +ResponseStartDateTime +ResponseStreamContentType +ResponseTemplates +ResponseTime +ResponseTimeHistogram +ResponseTimeRootCause +ResponseTimeRootCauseEntity +ResponseTimeRootCauseService +ResponseTimeRootCauses +Responses +RestApi +RestApis +RestartAppServerMessage +RestartDelay +RestartSimulationJobRequest +RestartWorkspace +RestorableByUserIds +RestorableNodeTypes +RestorableUntil +RestorationPrice +Restore +RestoreAddressToClassicRequest +RestoreAddressToClassicResult +RestoreAnalysisRequest +RestoreAnalysisResponse +RestoreBackupRequest +RestoreBackupResponse +RestoreCertificateAuthorityRequest +RestoreClusterFromSnapshotInput +RestoreClusterFromSnapshotOutput +RestoreCoreNetworkPolicyVersionRequest +RestoreCoreNetworkPolicyVersionResponse +RestoreDBClusterFromS3Message +RestoreDBClusterFromS3Result +RestoreDBClusterFromSnapshotMessage +RestoreDBClusterFromSnapshotResult +RestoreDBClusterToPointInTimeMessage +RestoreDBClusterToPointInTimeResult +RestoreDBInstanceFromDBSnapshotMessage +RestoreDBInstanceFromDBSnapshotResult +RestoreDBInstanceFromS3Message +RestoreDBInstanceFromS3Result +RestoreDBInstanceToPointInTimeMessage +RestoreDBInstanceToPointInTimeResult +RestoreDateTime +RestoreDocumentVersionsRequest +RestoreDomainAccessRequest +RestoreDuration +RestoreEventDataStoreRequest +RestoreEventDataStoreResponse +RestoreExpiryDate +RestoreExpiryTime +RestoreFromClusterSnapshotMessage +RestoreFromClusterSnapshotResult +RestoreFromRecoveryPointRequest +RestoreFromRecoveryPointResponse +RestoreFromSnapshotRequest +RestoreFromSnapshotResponse +RestoreImageFromRecycleBinRequest +RestoreImageFromRecycleBinResult +RestoreInProgress +RestoreJobId +RestoreJobs +RestoreJobsListMember +RestoreKeyInput +RestoreKeyOutput +RestoreManagedPrefixListVersionRequest +RestoreManagedPrefixListVersionResult +RestoreMetadata +RestoreObjectOutput +RestoreObjectRequest +RestoreOutputPath +RestorePhoneNumberRequest +RestorePhoneNumberResponse +RestoreRequest +RestoreSecretRequest +RestoreSecretResponse +RestoreServerRequest +RestoreServerResponse +RestoreSnapshotFromRecycleBinRequest +RestoreSnapshotFromRecycleBinResult +RestoreSnapshotTierRequest +RestoreSnapshotTierResult +RestoreSnapshots +RestoreStartTime +RestoreStatus +RestoreSummary +RestoreTableFromBackupInput +RestoreTableFromBackupOutput +RestoreTableFromClusterSnapshotMessage +RestoreTableFromClusterSnapshotResult +RestoreTableFromSnapshotRequest +RestoreTableFromSnapshotResponse +RestoreTableRequest +RestoreTableResponse +RestoreTableToPointInTimeInput +RestoreTableToPointInTimeOutput +RestoreTime +RestoreToSnapshot +RestoreToTime +RestoreType +RestoreVolumeFromSnapshotRequest +RestoreVolumeFromSnapshotResponse +RestoreWindow +RestoreWorkspaceRequest +RestrictPublicBuckets +RestrictedPackageName +RestrictedSourceFileException +RestrictionType +Restrictions +Result +ResultAttribute +ResultAttributes +ResultBBox +ResultByTime +ResultCode +ResultConfiguration +ResultConfigurationUpdates +ResultData +ResultEncryptionMode +ResultErrorEntry +ResultField +ResultFrame +ResultId +ResultIds +ResultItems +ResultKmsKeyArn +ResultList +ResultLocationBucket +ResultLocationFolder +ResultRecordedTime +ResultReuseByAgeConfiguration +ResultReuseConfiguration +ResultReuseInformation +ResultRow +ResultRowValue +ResultRows +ResultS3Uri +ResultSet +ResultSetMetadata +ResultSetOptions +ResultSize +ResultStream +ResultToken +ResultType +ResultValues +Results +ResultsByTime +ResultsCount +ResultsNotFound +ResultsPublishingEnabled +ResultsS3Prefix +ResumableUntil +ResumeActions +ResumeBatchLoadTaskRequest +ResumeCampaignRequest +ResumeCluster +ResumeClusterMessage +ResumeClusterResult +ResumeContactRecordingRequest +ResumeFullAutomationModeMinutes +ResumeFullAutomationModeTime +ResumeGameServerGroupInput +ResumeGameServerGroupOutput +ResumeReplicationRequest +ResumeResourceRequest +ResumeServiceRequest +ResumeServiceResponse +ResumeSessionRequest +ResumeSessionResponse +ResumeWorkflowRunRequest +ResumeWorkflowRunResponse +ResyncMFADeviceRequest +RetainAllVariantProperties +RetainDeploymentConfig +RetainExceptOnCreate +RetainPhysicalResources +RetainPrimaryCluster +RetainPrimaryReplicationGroup +RetainRecordInDays +RetainRecordUntil +RetainResources +RetainRule +RetainStacks +RetainStacksOnAccountRemoval +RetainUntilDate +RetainedMessageSummary +Retention +RetentionArchiveTier +RetentionConfiguration +RetentionConfigurationName +RetentionConfigurationNames +RetentionConfigurations +RetentionDays +RetentionLockTimeInDays +RetentionLockType +RetentionPeriod +RetentionPeriodHours +RetentionPeriodInDays +RetentionPeriodUnit +RetentionPeriodValue +RetentionPolicy +RetentionProperties +RetentionSettings +RetentionStartDate +RetireGrantRequest +RetiringPrincipal +RetrainingAvailableDataInDays +RetrainingFrequency +RetrainingSchedulerStatus +RetrainingSchedulerSummaries +RetrainingSchedulerSummary +RetrainingStartDate +Retries +Retrieval +RetrievalByteRange +RetrievalRoleArn +RetrieveAZs +RetrieveActions +RetrieveDomainAuthCodeRequest +RetrieveDomainAuthCodeResponse +RetrieveEnvironmentInfoMessage +RetrieveEnvironmentInfoResultMessage +RetrieveFilePaths +RetrieveRequest +RetrieveResult +RetrieveResultItem +RetrieveResults +RetrieveTapeArchiveInput +RetrieveTapeArchiveOutput +RetrieveTapeRecoveryPointInput +RetrieveTapeRecoveryPointOutput +RetrievedTo +RetryAfter +RetryAfterSeconds +RetryAttemptSeconds +RetryAttempts +RetryBuildBatchInput +RetryBuildBatchOutput +RetryBuildInput +RetryBuildOutput +RetryCount +RetryCriteria +RetryDataReplicationRequest +RetryDelayInSeconds +RetryInterval +RetryIntervalInMinutes +RetryIntervalMs +RetryOptions +RetryPipelineExecutionRequest +RetryPipelineExecutionResponse +RetryPolicy +RetryPolicyConfiguration +RetryPolicyExecution +RetryStageExecutionInput +RetryStageExecutionOutput +RetryStrategy +RetryWorkflowStepRequest +RetryWorkflowStepResponse +Retryable +RetryableConflictException +RetryableError +RetryableException +Return +ReturnCode +ReturnConnectionPasswordEncrypted +ReturnConsumedCapacity +ReturnData +ReturnEnabled +ReturnInformation +ReturnItemCollectionMetrics +ReturnPath +ReturnPathArn +ReturnPathComponents +ReturnShippingLabelAlreadyExistsException +ReturnShippingLabelURI +ReturnSize +ReturnSubscriptionArn +ReturnValue +ReturnValues +ReturnValuesOnConditionCheckFailure +ReusableDelegationSetLimit +ReuseOnScaleIn +ReusedByJob +ReusedPreviousResult +RevealConfiguration +ReverseGeocodingConfig +ReverseOrder +ReverseReplicationRequest +ReverseReplicationResponse +Revert +ReviewActionDetail +ReviewActions +ReviewDetails +ReviewInformation +ReviewOwner +ReviewPolicy +ReviewReport +ReviewRestrictionDate +ReviewResultDetail +ReviewResults +ReviewStatus +ReviewedTime +Reviewer +ReviewerResponse +Reviews +Revision +RevisionDestination +RevisionDestinationEntry +RevisionDestinations +RevisionDoesNotExistException +RevisionEntry +RevisionId +RevisionIdRequiredException +RevisionInfo +RevisionLocation +RevisionNotCurrentException +RevisionPublished +RevisionRequiredException +RevisionTarget +RevisionTargets +Revisions +RevocationComment +RevocationConfiguration +RevocationReason +RevokeAllGroups +RevokeCacheSecurityGroupIngressMessage +RevokeCacheSecurityGroupIngressResult +RevokeCertificateRequest +RevokeClientVpnIngressRequest +RevokeClientVpnIngressResult +RevokeClusterSecurityGroupIngressMessage +RevokeClusterSecurityGroupIngressResult +RevokeDBSecurityGroupIngressMessage +RevokeDBSecurityGroupIngressResult +RevokeDomainAccessRequest +RevokeEndpointAccessMessage +RevokeFlowEntitlementRequest +RevokeFlowEntitlementResponse +RevokeGrantRequest +RevokeInvitationRequest +RevokeIpRulesRequest +RevokeLinkPermissions +RevokePermissions +RevokePermissionsRequest +RevokeRevisionRequest +RevokeRevisionResponse +RevokeSecurityGroupEgressRequest +RevokeSecurityGroupEgressResult +RevokeSecurityGroupIngressRequest +RevokeSecurityGroupIngressResult +RevokeSignatureRequest +RevokeSigningProfileRequest +RevokeSnapshotAccessMessage +RevokeSnapshotAccessResult +RevokeTokenRequest +RevokeVpcEndpointAccessRequest +Revoked +RevokedAt +Reward +RfRegion +Rfc4180 +Rfc822Name +RichText +Right +RightJoinKeyProperties +RightOperand +RightsizingRecommendation +RightsizingRecommendationConfiguration +RightsizingRecommendationMetadata +RightsizingRecommendationSummary +RightsizingRecommendations +RightsizingType +Risk +RiskConfiguration +RiskConfigurationType +RiskCounts +RiskDecision +RiskDetails +RiskExceptionConfiguration +RiskExceptionConfigurationType +RiskLevel +RiskRating +RiskScore +RiskThreshold +Robot +RobotApplicationConfig +RobotApplicationSummary +RobotDeployment +RobotSoftwareSuite +Role +RoleARN +RoleARNUpdate +RoleAliasDescription +RoleArn +RoleArns +RoleBase +RoleCredentials +RoleDetail +RoleDetailList +RoleId +RoleInfo +RoleLastUsed +RoleLevel +RoleMapping +RoleMappings +RoleName +RolePolicyList +RoleRequiredException +RoleSearchMatching +RoleSearchSubtree +RoleSessionName +RoleStatus +RoleUsageList +RoleUsageType +RoleValues +Roles +RolesKey +Roll +Rollback +RollbackApplicationRequest +RollbackApplicationResponse +RollbackConfiguration +RollbackDetails +RollbackErrorMessage +RollbackErrors +RollbackFailureReason +RollbackInfo +RollbackInstanceRefreshAnswer +RollbackInstanceRefreshType +RollbackMaximumBatchSize +RollbackOnDisable +RollbackReason +RollbackStackInput +RollbackStackOutput +RollbackStartTime +RollbackTransactionRequest +RollbackTransactionResponse +RollbackTrigger +RollbackTriggers +RollingDate +RollingDateConfiguration +RollingUpdatePolicy +RolloverInterval +Room +RoomArn +RoomData +RoomFilters +RoomId +RoomMembership +RoomMemberships +RoomName +RoomRetentionSettings +RoomSkillParameter +RoomSkillParameters +RoomSummary +RoomUtilizationMetricsEnabled +Rooms +Root +RootAccess +RootCause +RootCauseException +RootCauseServiceId +RootCauseServiceRequestImpactStatistics +RootCauses +RootCertificatePublicKey +RootChangeSetId +RootDeviceName +RootDeviceType +RootDeviceVolumeId +RootDirectory +RootFolderId +RootId +RootNotFoundException +RootSquash +RootSquashConfiguration +RootStorage +RootVolumeConfiguration +RootVolumeEncryptionEnabled +RootVolumeId +RootVolumeSecurityStyle +RootVolumeSizeGib +Roots +Rotate +RotateChannelCredentialsRequest +RotateChannelCredentialsResponse +RotateEncryptionKeyMessage +RotateEncryptionKeyResult +RotateImmediately +RotateIngestEndpointCredentialsRequest +RotateIngestEndpointCredentialsResponse +RotateMasterUserPassword +RotateSecretRequest +RotateSecretResponse +RotateTunnelAccessTokenRequest +RotateTunnelAccessTokenResponse +Rotation +RotationAngle +RotationArn +RotationEnabled +RotationId +RotationIds +RotationLambdaARN +RotationLambdaArn +RotationNamePrefix +RotationOccurredWithinFrequency +RotationOverride +RotationOverrideId +RotationOverrides +RotationRules +RotationRulesType +RotationShift +RotationShifts +RotationStartTime +Rotations +RoundTripTime +Route +RouteAnalysis +RouteAnalysisCompletion +RouteAnalysisEndpointOptions +RouteAnalysisEndpointOptionsSpecification +RouteAnalysisId +RouteAnalysisPath +RouteBBox +RouteCount +RouteData +RouteFilterPrefix +RouteHasOutOfScopeEndpointViolation +RouteId +RouteIdentifier +RouteKey +RouteMatrix +RouteMatrixEntry +RouteMatrixEntryError +RouteOrigin +RouteRef +RouteResponse +RouteResponseId +RouteResponseKey +RouteResponseSelectionExpression +RouteSelectionExpression +RouteSet +RouteSetDetails +RouteSettings +RouteSpec +RouteStatus +RouteSummary +RouteSummaryList +RouteTable +RouteTableArn +RouteTableAssociation +RouteTableAssociationId +RouteTableAssociationState +RouteTableId +RouteTableIdentifier +RouteTableIds +RouteTableRoute +RouteTableTimestamp +RouteTableType +RouteTables +RouteType +RouteUpdates +RoutedResource +RouterType +Routes +RoutingConfig +RoutingConfigurationListItem +RoutingControl +RoutingControlArn +RoutingControlCount +RoutingControlName +RoutingControlState +RoutingControls +RoutingPolicy +RoutingProfile +RoutingProfileArn +RoutingProfileId +RoutingProfileQueueConfig +RoutingProfileQueueConfigSummary +RoutingProfileQueueConfigSummaryList +RoutingProfileQueueReference +RoutingProfileReference +RoutingProfileSearchCriteria +RoutingProfileSearchFilter +RoutingProfileSummary +RoutingProfileSummaryList +RoutingProfiles +RoutingRule +RoutingRules +RoutingStrategy +RoutingStrategyType +Row +RowAlternateColorOptions +RowAlternateColors +RowColumnInfo +RowFieldNamesStyle +RowFilter +RowFilterExpression +RowGroupLength +RowHeaderStyle +RowIndex +RowIndexStride +RowInfo +RowLabelOptions +RowLength +RowLevelPermissionDataSet +RowLevelPermissionTagConfiguration +RowLevelPermissionTagConfigurationApplied +RowLevelPermissionTagKeys +RowLevelPermissionTagRule +RowLevelPermissionTags +RowRange +RowSort +RowSpan +RowSubtotalOptions +RowTag +RowTotalOptions +RowValue +Rows +RowsDropped +RowsIngested +RowsLabelOptions +RowsLayout +RpcProtection +RsaPublicKey +RsaPublicKeyFingerprint +Rscp +Rsrp +Rsrq +Rss +Rssi +RtmpCaptionInfoDestinationSettings +RtmpGroupSettings +RtmpOutputSettings +Rule +RuleARN +RuleAction +RuleActionOverride +RuleActionOverrides +RuleArn +RuleArns +RuleBasedMatching +RuleBasedMatchingRequest +RuleBasedMatchingResponse +RuleBasedProperties +RuleCondition +RuleConfig +RuleConfigurationName +RuleCount +RuleDefinition +RuleDescription +RuleDetail +RuleDoesNotExistException +RuleEvaluation +RuleEvaluationJobArn +RuleEvaluationStatus +RuleEvaluatorImage +RuleGroup +RuleGroupArn +RuleGroupDetails +RuleGroupId +RuleGroupMetadata +RuleGroupName +RuleGroupReferenceStatement +RuleGroupResponse +RuleGroupRuleName +RuleGroupRuleOptionsPair +RuleGroupRuleOptionsPairs +RuleGroupSource +RuleGroupSourceCustomActionsDetails +RuleGroupSourceListDetails +RuleGroupSourceStatefulRulesDetails +RuleGroupSourceStatefulRulesHeaderDetails +RuleGroupSourceStatefulRulesOptionsDetails +RuleGroupSourceStatelessRuleDefinition +RuleGroupSourceStatelessRuleMatchAttributes +RuleGroupSourceStatelessRuleMatchAttributesDestinationPorts +RuleGroupSourceStatelessRuleMatchAttributesDestinations +RuleGroupSourceStatelessRuleMatchAttributesSourcePorts +RuleGroupSourceStatelessRuleMatchAttributesSources +RuleGroupSourceStatelessRuleMatchAttributesTcpFlags +RuleGroupSourceStatelessRulesAndCustomActionsDetails +RuleGroupSourceStatelessRulesDetails +RuleGroupStatus +RuleGroupSummary +RuleGroupType +RuleGroupTypePair +RuleGroupTypePairs +RuleGroupUpdate +RuleGroupVariables +RuleGroupVariablesIpSetsDetails +RuleGroupVariablesPortSetsDetails +RuleGroups +RuleGroupsNamespaceDescription +RuleGroupsNamespaceStatus +RuleGroupsNamespaceSummary +RuleId +RuleIdentifier +RuleLabels +RuleLevel +RuleLimitExceededException +RuleMetadata +RuleMetricName +RuleName +RuleNameWithinRuleGroup +RuleNames +RuleNotFoundException +RuleNumber +RuleOption +RuleOptions +RuleOrder +RuleParameters +RulePriorities +RulePriorityPair +RuleResult +RuleResults +RuleSet +RuleSetArn +RuleSetBody +RuleSetDoesNotExistException +RuleSetName +RuleSets +RuleState +RuleStatus +RuleSummary +RuleSummaryList +RuleTags +RuleTriggerEventSource +RuleType +RuleUpdate +RuleUpdateFailure +RuleUpdateSuccess +RuleVariables +RuleVersion +RuleWithinRuleGroup +Rules +RulesConfiguration +RulesConfigurationType +RulesList +RulesPackage +RulesSource +RulesSourceList +RulesString +Ruleset +RulesetArn +RulesetEvaluationRunId +RulesetItem +RulesetName +RulesetNames +Rulesets +RumEvent +RumEvents +Run +RunAs +RunBackTestMode +RunCommand +RunCommandParameters +RunCommandTarget +RunCommandTargets +RunConfig +RunConfiguration +RunConfigurationDescription +RunConfigurationUpdate +RunFleetAdvisorLsaAnalysisResponse +RunGroupListItem +RunId +RunInstancesMonitoringEnabled +RunInstancesRequest +RunJobFlowInput +RunJobFlowOutput +RunListItem +RunName +RunPipelineActivityRequest +RunPipelineActivityResponse +RunProperties +RunScheduledInstancesRequest +RunScheduledInstancesResult +RunStatementRequest +RunStatementResponse +RunStatus +RunTaskRequest +RunTaskResponse +Runbook +Runbooks +RuncBinaryPath +Running +RunningActions +RunningAmiVersion +RunningBridgeCount +RunningInstanceCount +RunningMode +RunningModeAutoStopTimeoutInMinutes +RunningSetup +RunningTasksCount +Runs +Runtime +RuntimeConfiguration +RuntimeContext +RuntimeContextName +RuntimeContextStates +RuntimeDetails +RuntimeEnvironment +RuntimeEnvironmentSecrets +RuntimeEnvironmentVariables +RuntimeHintDetails +RuntimeHintValue +RuntimeHints +RuntimeInSeconds +RuntimePlatform +RuntimeRoleArn +RuntimeVersion +RuntimeVersionArn +RuntimeVersionConfig +RuntimeVersionError +RuntimeVersions +RxDataRate2 +RxDelay1 +RxDrOffset1 +RxFreq2 +RxLevel +RxNormAttribute +RxNormConcept +RxNormConcepts +RxNormEntity +RxNormTrait +S +S3 +S3AccessControlList +S3AccessControlPolicy +S3AccessDeniedFault +S3AccessPointAlias +S3AccessPointArn +S3AccessPointConfiguration +S3AclOption +S3Action +S3ApplicationCodeLocationDescription +S3ArtifactLocation +S3ArtifactPath +S3BackupConfiguration +S3BackupDescription +S3BackupMode +S3BackupUpdate +S3Bucket +S3BucketAccessRoleArn +S3BucketAclGrantConfiguration +S3BucketArn +S3BucketConfiguration +S3BucketCriteriaForJob +S3BucketDefinitionForJob +S3BucketDestination +S3BucketDetail +S3BucketDetails +S3BucketDoesNotExistException +S3BucketFolder +S3BucketInfo +S3BucketLogDestination +S3BucketName +S3BucketOwner +S3BucketPath +S3BucketPrefix +S3BucketRegion +S3BucketRepository +S3BucketRoleArn +S3BucketSinkConfiguration +S3BucketSource +S3BucketTranscriptSource +S3CanonicalUserId +S3CatalogDeltaSource +S3CatalogHudiSource +S3CatalogSource +S3CatalogTarget +S3ClassificationScope +S3ClassificationScopeExclusion +S3ClassificationScopeExclusionUpdate +S3ClassificationScopeUpdate +S3CompressionType +S3Config +S3Configuration +S3ContentBaseLocation +S3ContentBaseLocationDescription +S3ContentBaseLocationUpdate +S3ContentLocation +S3ContentLocationDescription +S3ContentLocationUpdate +S3CopyObjectOperation +S3CsvSource +S3Data +S3DataAccessAsset +S3DataAccessAssetSourceEntry +S3DataConfig +S3DataDistributionType +S3DataRepositoryConfiguration +S3DataSize +S3DataSource +S3DataSourceConfiguration +S3DataSpec +S3DataType +S3DataUrl +S3DeleteObjectTagging +S3DeltaCatalogTarget +S3DeltaDirectTarget +S3DeltaSource +S3Destination +S3DestinationAccessControl +S3DestinationConfig +S3DestinationConfiguration +S3DestinationDescription +S3DestinationProperties +S3DestinationSettings +S3DestinationUpdate +S3Destinations +S3DirectSourceAdditionalOptions +S3DirectTarget +S3Encryption +S3EncryptionConfig +S3EncryptionConfiguration +S3EncryptionEnabled +S3EncryptionMode +S3EncryptionSettings +S3EventName +S3Exception +S3ExportArtifacts +S3ExportConfiguration +S3ExportLocation +S3Exporting +S3ExportingConfig +S3ExportingLocation +S3FailurePath +S3FileLocation +S3GeneratedManifestDescriptor +S3GlueParquetTarget +S3Grant +S3Grantee +S3HudiCatalogTarget +S3HudiDirectTarget +S3HudiSource +S3ImportSource +S3IngestionRoleArn +S3InitiateRestoreObject +S3InitiateRestoreObjectOperation +S3Input +S3InputConfiguration +S3InputDefinition +S3InputFileLocation +S3InputFormatConfig +S3InputMode +S3Inputs +S3JobDefinition +S3JobManifestGenerator +S3JsonSource +S3Key +S3KeyFilter +S3KeyName +S3KeyOutput +S3KeyPrefix +S3Keys +S3KmsKeyId +S3Location +S3LocationDescription +S3LocationNotInServiceRegionException +S3LocationUri +S3LogDelivery +S3LogDeliveryDescription +S3LogUrl +S3Logs +S3LogsConfig +S3LogsConfiguration +S3LogsConfigurationResult +S3MachineLearningModelResourceData +S3ManifestOutputLocation +S3ModelArtifacts +S3ModelDataSource +S3MonitoringConfiguration +S3Object +S3ObjectAcl +S3ObjectKey +S3ObjectLockLegalHold +S3ObjectMetadata +S3ObjectOwner +S3ObjectSource +S3ObjectTag +S3ObjectTags +S3ObjectUrl +S3ObjectVersion +S3OnDeviceService +S3OnDeviceServiceConfiguration +S3Options +S3Origin +S3OriginConfig +S3Output +S3OutputConfiguration +S3OutputFormatConfig +S3OutputLocation +S3OutputPath +S3OutputUri +S3OutputUrl +S3Parameters +S3ParquetSource +S3Path +S3PathforGroupMembers +S3Prefix +S3PublicAccessBlockConfiguration +S3PutObjectAcl +S3PutObjectCopy +S3PutObjectLegalHold +S3PutObjectRetention +S3PutObjectTagging +S3RecordingConfig +S3RecordingDetails +S3RecordingSinkConfiguration +S3RecordingSinkRuntimeConfiguration +S3Reference +S3ReferenceDataSource +S3ReferenceDataSourceDescription +S3ReferenceDataSourceUpdate +S3Region +S3ReplicateObject +S3ReportExportConfig +S3ReportLocation +S3Repository +S3RepositoryDetails +S3Resource +S3ResourceClassification +S3ResourceClassificationUpdate +S3ResourceNotFoundFault +S3Resources +S3Results +S3ResultsPath +S3Retention +S3SetObjectAclOperation +S3SetObjectLegalHoldOperation +S3SetObjectRetentionOperation +S3SetObjectTaggingOperation +S3Settings +S3SignedObject +S3SnapshotAsset +S3Source +S3SourceAdditionalOptions +S3SourceConfig +S3SourceProperties +S3SseAlgorithm +S3SseKmsKeyId +S3StagingLocation +S3Storage +S3StorageClass +S3StorageConfig +S3SubscriptionRequiredException +S3TableOutputOptions +S3Tag +S3Target +S3Targets +S3Update +S3UploadMode +S3Uri +S3Url +S3UrlPrefix +S3UrlSignerRole +S3Version +S3WordsList +S3objectKey +SAMLAssertion +SAMLIdp +SAMLMetadataDocument +SAMLOptions +SAMLOptionsInput +SAMLOptionsOutput +SAMLProviderArn +SAMLProviderList +SAMLProviderListEntry +SAPOData +SAPODataConnectorProfileCredentials +SAPODataConnectorProfileProperties +SAPODataDestinationProperties +SAPODataPaginationConfig +SAPODataParallelismConfig +SAPODataSourceProperties +SCApplicationAttributes +SDM +SHA256TreeHash +SL +SLRDeploymentStatus +SMB +SMBACLEnabled +SMBFileShareInfo +SMBFileShareInfoList +SMBGuestPasswordSet +SMBLocalGroups +SMBSecurityStrategy +SMS +SMSChannelRequest +SMSChannelResponse +SMSConfiguration +SMSMessage +SMSMessageActivity +SMSMfaSettings +SMSMfaSettingsType +SMSSandboxPhoneNumber +SMSTemplate +SMSTemplateRequest +SMSTemplateResponse +SNOMEDCTAttribute +SNOMEDCTConcept +SNOMEDCTConcepts +SNOMEDCTDetails +SNOMEDCTEntity +SNOMEDCTTrait +SNSAction +SNSConfiguration +SNSDestination +SNSInvalidTopicFault +SNSNoAuthorizationFault +SNSTopic +SNSTopicArn +SNSTopicArnNotFoundFault +SNSTopicPublishAction +SNwkSIntKey +SOA +SOAChange +SQLPort +SS +SSEAlgorithm +SSEAwsKmsKeyId +SSECustomerAlgorithm +SSECustomerKey +SSECustomerKeyMD5 +SSEDescription +SSEKMS +SSEKMSEncryption +SSEKMSEncryptionContext +SSEKMSKeyId +SSES3 +SSESpecification +SSESpecificationOverride +SSEType +SSHPublicKey +SSHPublicKeyBody +SSHPublicKeyId +SSHPublicKeyMetadata +SSHPublicKeys +SSLCertificateId +SSLPolicyNotFoundException +SSLSupportMethod +SSMLMessage +SSMLMessageType +SSMOutput +SSMValidationParameters +SSOIdentity +SaaSConfiguration +Safe +SafeguardPolicy +SafetyRuleArn +SafetyRules +SafetyRulesToOverride +SageMakerImageArn +SageMakerImageVersionAliases +SageMakerImageVersionArn +SageMakerJobArn +SageMakerMachineLearningModelResourceData +SageMakerPipelineParameter +SageMakerPipelineParameters +Salesforce +SalesforceAction +SalesforceChatterFeedConfiguration +SalesforceConfiguration +SalesforceConnectorProfileCredentials +SalesforceConnectorProfileProperties +SalesforceCustomKnowledgeArticleTypeConfiguration +SalesforceDestinationProperties +SalesforceKnowledgeArticleConfiguration +SalesforceMetadata +SalesforceSourceProperties +SalesforceStandardKnowledgeArticleTypeConfiguration +SalesforceStandardObjectAttachmentConfiguration +SalesforceStandardObjectConfiguration +Salt +SameFileContentException +SamePathRequestException +SameSheetTargetVisualConfiguration +SamlAuthentication +SamlConfigCount +SamlConfigOptions +SamlConfiguration +SamlProperties +SamlProviderARNs +SamlProviderArn +Sample +SampleAdaptiveOffsetFilterMode +SampleChannelDataRequest +SampleChannelDataResponse +SampleCount +SampleDataS3SourceConfig +SampleFraction +SamplePath +SamplePayloadUrl +SampleQuery +SampleRange +SampleRangeConversion +SampleRate +SampleRows +SampleSize +SampleTime +SampleTimestamp +SampleUtterance +SampleUtterances +SampleValue +SampleWeightAttributeName +SampledCount +SampledEndTime +SampledHTTPRequest +SampledRequests +SampledRequestsEnabled +SampledStartTime +Sampling +SamplingDeviceCount +SamplingInterval +SamplingPercentage +SamplingRate +SamplingRule +SamplingRuleRecord +SamplingRuleRecords +SamplingRuleUpdate +SamplingStatisticSummaries +SamplingStatisticSummary +SamplingStatisticsDocument +SamplingStatisticsDocuments +SamplingStrategy +SamplingTargetDocument +SamplingTargetDocuments +SanRequireDirectoryGuid +SanRequireDns +SanRequireDomainDns +SanRequireEmail +SanRequireSpn +SanRequireUpn +SanitizationWarning +SankeyDiagramAggregatedFieldWells +SankeyDiagramChartConfiguration +SankeyDiagramFieldWells +SankeyDiagramSortConfiguration +SankeyDiagramVisual +SapHostname +SapInstanceNumber +SapKernelVersion +SasConfiguration +Sasl +SaslMechanism +SaslPassword +SaslUsername +SatelliteListItem +Saturation +Saturday +Savings +SavingsCurrencyCode +SavingsOpportunity +SavingsPercentage +SavingsPlan +SavingsPlanArn +SavingsPlanFilter +SavingsPlanOffering +SavingsPlanOfferingFilterElement +SavingsPlanOfferingProperty +SavingsPlanOfferingRate +SavingsPlanOfferingRateFilterElement +SavingsPlanOfferingRateProperty +SavingsPlanRate +SavingsPlanRateFilter +SavingsPlanRateProperty +SavingsPlansAmortizedCommitment +SavingsPlansCoverage +SavingsPlansCoverageData +SavingsPlansCoverages +SavingsPlansCoveredHoursInLookbackPeriod +SavingsPlansDetails +SavingsPlansPurchaseRecommendation +SavingsPlansPurchaseRecommendationDetail +SavingsPlansPurchaseRecommendationDetails +SavingsPlansPurchaseRecommendationMetadata +SavingsPlansPurchaseRecommendationSummary +SavingsPlansSavings +SavingsPlansType +SavingsPlansUtilization +SavingsPlansUtilizationAggregates +SavingsPlansUtilizationByTime +SavingsPlansUtilizationDetail +SavingsPlansUtilizationDetails +SavingsPlansUtilizationsByTime +ScalaCode +ScalableDimension +ScalableTarget +ScalableTargetARN +ScalableTargetAction +ScalableTargets +ScalarCrlRequest +ScalarProfileRequest +ScalarSubjectRequest +ScalarTrustAnchorRequest +ScalarType +ScalarValue +Scale +ScaleDownBehavior +ScaleDownModifications +ScaleDownNodeTypes +ScaleInCooldown +ScaleInPolicy +ScaleInPolicyDescription +ScaleInPolicyUpdate +ScaleInProtectedInstances +ScaleOutCooldown +ScaleOutPolicy +ScaleOutPolicyDescription +ScaleOutPolicyUpdate +ScaleUpModifications +ScaleUpNodeTypes +ScalingAction +ScalingActivities +ScalingActivity +ScalingActivityInProgressFault +ScalingAdjustment +ScalingAdjustmentType +ScalingBehavior +ScalingConfig +ScalingConfiguration +ScalingConfigurationInfo +ScalingConstraints +ScalingInstruction +ScalingInstructions +ScalingMode +ScalingParameters +ScalingParametersStatus +ScalingPlan +ScalingPlanName +ScalingPlanNames +ScalingPlanResource +ScalingPlanResources +ScalingPlanVersion +ScalingPlans +ScalingPolicies +ScalingPolicy +ScalingPolicyMetric +ScalingPolicyObjective +ScalingPolicyUpdate +ScalingPolicyUpdateBehavior +ScalingProcessQuery +ScalingProcesses +ScalingRule +ScalingStatusCode +ScalingStatusMessage +ScalingTrigger +ScalingType +Scan +ScanAll +ScanBy +ScanCompletedAt +ScanCondition +ScanConditionPair +ScanDetections +ScanDirection +ScanEc2InstanceWithFindings +ScanEc2InstanceWithFindingsResult +ScanEnabled +ScanEndTime +ScanFilePath +ScanFilter +ScanId +ScanIndexForward +ScanInput +ScanMode +ScanNameWithFindingNum +ScanNotFoundException +ScanOnPush +ScanOutput +ScanProvisionedProductsInput +ScanProvisionedProductsOutput +ScanRange +ScanResourceCriteria +ScanResult +ScanResultDetails +ScanStartTime +ScanStartedAt +ScanStatus +ScanSummary +ScanThreatName +ScanType +ScanTypeConversionMode +ScannedCount +ScannedItemCount +ScannedVolumeDetails +ScanningRepositoryFilter +Scans +ScatterPlotCategoricallyAggregatedFieldWells +ScatterPlotConfiguration +ScatterPlotFieldWells +ScatterPlotUnaggregatedFieldWells +ScatterPlotVisual +SccDestinationSettings +SccXml +Scenario +SceneChangeDetect +SceneError +SceneSummary +Schedule +ScheduleAction +ScheduleActionSettings +ScheduleActionStartSettings +ScheduleActions +ScheduleActivityTaskDecisionAttributes +ScheduleActivityTaskFailedEventAttributes +ScheduleAdBreak +ScheduleAdBreaks +ScheduleArn +ScheduleAssociationState +ScheduleAt +ScheduleConfig +ScheduleConfiguration +ScheduleDefinitionTypeUnsupportedFault +ScheduleDefinitions +ScheduleDescription +ScheduleEndTime +ScheduleEntry +ScheduleEntryType +ScheduleExpression +ScheduleExpressionTimezone +ScheduleFrequency +ScheduleGroupArn +ScheduleGroupSummary +ScheduleGroups +ScheduleId +ScheduleIdentifier +ScheduleKeyDeletionRequest +ScheduleKeyDeletionResponse +ScheduleLambdaFunctionDecisionAttributes +ScheduleLambdaFunctionFailedEventAttributes +ScheduleName +ScheduleOffset +ScheduleRefreshOnEntity +ScheduleRunConfiguration +ScheduleRunRequest +ScheduleRunResult +ScheduleRunTest +ScheduleStartTime +ScheduleSummary +ScheduleTimezone +Scheduled +ScheduledAction +ScheduledActionARN +ScheduledActionAlreadyExistsFault +ScheduledActionBufferTime +ScheduledActionDescription +ScheduledActionFilter +ScheduledActionName +ScheduledActionNames +ScheduledActionNotFoundFault +ScheduledActionQuotaExceededFault +ScheduledActionType +ScheduledActionTypeUnsupportedFault +ScheduledActions +ScheduledActionsMessage +ScheduledActionsType +ScheduledAuditMetadata +ScheduledAutoTuneDetails +ScheduledBy +ScheduledEndTime +ScheduledInstance +ScheduledInstanceAvailability +ScheduledInstanceAvailabilitySet +ScheduledInstanceId +ScheduledInstanceIds +ScheduledInstanceRecurrence +ScheduledInstanceRecurrenceRequest +ScheduledInstanceSet +ScheduledInstancesBlockDeviceMapping +ScheduledInstancesEbs +ScheduledInstancesIamInstanceProfile +ScheduledInstancesIpv6Address +ScheduledInstancesLaunchSpecification +ScheduledInstancesMonitoring +ScheduledInstancesNetworkInterface +ScheduledInstancesPlacement +ScheduledInstancesPrivateIpAddressConfig +ScheduledJobRollout +ScheduledQueries +ScheduledQuery +ScheduledQueryArn +ScheduledQueryDescription +ScheduledQueryExecutionRoleArn +ScheduledQueryRunSummary +ScheduledScalingSuspended +ScheduledSplit +ScheduledSplitConfig +ScheduledSplitsLaunchConfig +ScheduledSplitsLaunchDefinition +ScheduledStart +ScheduledStartTime +ScheduledStartTimeMillis +ScheduledTime +ScheduledTimeAfter +ScheduledTimeBefore +ScheduledTimestamp +ScheduledTriggerProperties +ScheduledUpdateGroupAction +ScheduledUpdateGroupActionRequest +ScheduledUpdateGroupActions +ScheduledWindowExecution +ScheduledWindowExecutions +SchedulerLogs +SchedulerNotRunningException +SchedulerRunningException +SchedulerTransitioningException +Schedulers +Schedules +SchedulingBufferTime +SchedulingConfig +SchedulingPolicyDetail +SchedulingPolicyListingDetail +SchedulingStrategy +Schema +SchemaAlreadyExistsException +SchemaAlreadyPublishedException +SchemaArn +SchemaArns +SchemaAttribute +SchemaAttributeType +SchemaAttributes +SchemaChangePolicy +SchemaCheckpoint +SchemaColumn +SchemaConfiguration +SchemaConversionApplicationAttributes +SchemaConversionRequest +SchemaDefinition +SchemaDeleteOption +SchemaDiffType +SchemaError +SchemaExtensionId +SchemaExtensionInfo +SchemaExtensionStatus +SchemaExtensionStatusReason +SchemaExtensionsInfo +SchemaFacet +SchemaFacets +SchemaHandlerPackage +SchemaId +SchemaInputAttribute +SchemaListItem +SchemaMappingSummary +SchemaName +SchemaNamePrefix +SchemaPattern +SchemaReference +SchemaResponse +SchemaS3Location +SchemaShortInfoResponse +SchemaStatus +SchemaSummary +SchemaUnion +SchemaVersion +SchemaVersionErrorItem +SchemaVersionErrors +SchemaVersionId +SchemaVersionListItem +SchemaVersionNumber +SchemaVersionStatus +SchemaVersionSummary +SchemaVersions +Schemas +Scheme +Scope +ScopeConfiguration +ScopeCount +ScopeDescription +ScopeDoesNotExistException +ScopeDownStatement +ScopeName +Scopes +Scoping +Score +ScoreAttributes +ScoreConfidence +ScoreDetails +ScoreThreshold +ScoreThresholdLastUpdatedAt +Scores +ScoringStrategy +ScpActionDefinition +Scram +ScreenCanvasSizeOptions +ScreenDataUrl +ScreenSharingUrl +ScreenViewingUrl +ScreenshotName +Script +ScriptArn +ScriptBatchJobDefinition +ScriptBatchJobIdentifier +ScriptBootstrapAction +ScriptBootstrapActionConfig +ScriptDetails +ScriptId +ScriptLocation +ScriptModeConfig +ScriptParameterKeyValue +ScriptPath +ScriptS3Location +Scripts +ScrollBarOptions +ScrollStatus +ScrollbarOptions +Scte +Scte20Detection +Scte20PlusEmbeddedDestinationSettings +Scte20SourceSettings +Scte27DestinationSettings +Scte27Pids +Scte27SourceSettings +Scte35Behavior +Scte35Control +Scte35DeliveryRestrictions +Scte35Descriptor +Scte35DescriptorSettings +Scte35Descriptors +Scte35Esam +Scte35EsamPid +Scte35InputScheduleActionSettings +Scte35InputSettings +Scte35Pid +Scte35PrerollPullupMilliseconds +Scte35ReturnToNetworkScheduleActionSettings +Scte35ReturnToNetworkSettings +Scte35SegmentationDescriptor +Scte35Source +Scte35SpliceInsert +Scte35SpliceInsertScheduleActionSettings +Scte35SpliceInsertSettings +Scte35TimeSignalApos +Scte35TimeSignalScheduleActionSettings +Scte35TimeSignalSettings +ScteFilter +ScteHls +ScteMarkersSource +SdkConfigurationProperty +SdkName +SdkResponse +SdkType +SdkTypes +SdrReferenceWhiteLevel +SdtInterval +Search +SearchAddressBooksRequest +SearchAddressBooksResponse +SearchAnalysesRequest +SearchAnalysesResponse +SearchAssociatedTranscriptsRequest +SearchAssociatedTranscriptsResponse +SearchAvailablePhoneNumbersRequest +SearchAvailablePhoneNumbersResponse +SearchCasesRequest +SearchCasesResponse +SearchCasesResponseItem +SearchChannelsRequest +SearchChannelsResponse +SearchCollectionTypes +SearchContactsRequest +SearchContactsResponse +SearchContentRequest +SearchContentResponse +SearchCriteria +SearchDashboardsRequest +SearchDashboardsResponse +SearchDataSetsRequest +SearchDataSetsResponse +SearchDataSourcesRequest +SearchDataSourcesResponse +SearchDatabasesByLFTagsRequest +SearchDatabasesByLFTagsResponse +SearchDevicesFilter +SearchDevicesRequest +SearchDevicesResponse +SearchEnabled +SearchEntitiesRequest +SearchEntitiesResponse +SearchException +SearchExpression +SearchFacesByImageRequest +SearchFacesByImageResponse +SearchFacesRequest +SearchFacesResponse +SearchField +SearchFilter +SearchFlowExecutionsRequest +SearchFlowExecutionsResponse +SearchFlowTemplatesRequest +SearchFlowTemplatesResponse +SearchFoldersRequest +SearchFoldersResponse +SearchForPositionResult +SearchForSuggestionsResult +SearchForTextResult +SearchGameSessionsInput +SearchGameSessionsOutput +SearchGroupsRequest +SearchGroupsResponse +SearchHoursOfOperationsRequest +SearchHoursOfOperationsResponse +SearchImageSetsRequest +SearchImageSetsResponse +SearchIndexRequest +SearchIndexResponse +SearchInput +SearchInsightsFilters +SearchInsightsRequest +SearchInsightsResponse +SearchInstanceCount +SearchInstanceType +SearchJobsFilter +SearchJobsRequest +SearchJobsResponse +SearchKey +SearchLocalGatewayRoutesRequest +SearchLocalGatewayRoutesResult +SearchNetworkProfilesRequest +SearchNetworkProfilesResponse +SearchOptions +SearchOrganizationInsightsFilters +SearchOrganizationInsightsRequest +SearchOrganizationInsightsResponse +SearchOutput +SearchPartitionCount +SearchPlaceIndexForPositionRequest +SearchPlaceIndexForPositionResponse +SearchPlaceIndexForPositionSummary +SearchPlaceIndexForSuggestionsRequest +SearchPlaceIndexForSuggestionsResponse +SearchPlaceIndexForSuggestionsSummary +SearchPlaceIndexForTextRequest +SearchPlaceIndexForTextResponse +SearchPlaceIndexForTextSummary +SearchPrincipalType +SearchProductsAsAdminInput +SearchProductsAsAdminOutput +SearchProductsInput +SearchProductsOutput +SearchProfilesRequest +SearchProfilesResponse +SearchPromptsRequest +SearchPromptsResponse +SearchProvisionedProductsInput +SearchProvisionedProductsOutput +SearchQuantumTasksFilter +SearchQuantumTasksRequest +SearchQuantumTasksResponse +SearchQuery +SearchQueuesRequest +SearchQueuesResponse +SearchQuickConnectsRequest +SearchQuickConnectsResponse +SearchRasterDataCollectionInput +SearchRasterDataCollectionOutput +SearchRecord +SearchRelatedItemsRequest +SearchRelatedItemsResponse +SearchRelatedItemsResponseItem +SearchRequest +SearchResourceTagsRequest +SearchResourceTagsResponse +SearchResourcesBucketCriteria +SearchResourcesCriteria +SearchResourcesCriteriaBlock +SearchResourcesInput +SearchResourcesOutput +SearchResourcesRequest +SearchResourcesResponse +SearchResourcesSimpleCriterion +SearchResourcesSortCriteria +SearchResourcesTagCriterion +SearchResourcesTagCriterionPair +SearchResponse +SearchRoomsRequest +SearchRoomsResponse +SearchRoutingProfilesRequest +SearchRoutingProfilesResponse +SearchSchemaSummary +SearchSchemaVersionSummary +SearchSchemasRequest +SearchSchemasResponse +SearchSecurityProfilesRequest +SearchSecurityProfilesResponse +SearchService +SearchSessionsRequest +SearchSessionsResponse +SearchSkillGroupsRequest +SearchSkillGroupsResponse +SearchSlowLogs +SearchSortResult +SearchStatus +SearchString +SearchSystemInstancesRequest +SearchSystemInstancesResponse +SearchSystemTemplatesRequest +SearchSystemTemplatesResponse +SearchTablesByLFTagsRequest +SearchTablesByLFTagsResponse +SearchTablesRequest +SearchTablesResponse +SearchText +SearchThingsRequest +SearchThingsResponse +SearchTransitGatewayMulticastGroupsRequest +SearchTransitGatewayMulticastGroupsResult +SearchTransitGatewayRoutesRequest +SearchTransitGatewayRoutesResult +SearchUsersByImageRequest +SearchUsersByImageResponse +SearchUsersRequest +SearchUsersResponse +SearchValue +SearchVocabulariesRequest +SearchVocabulariesResponse +SearchVulnerabilitiesFilterCriteria +SearchVulnerabilitiesRequest +SearchVulnerabilitiesResponse +Searchable +SearchedFace +SearchedFaceBoundingBox +SearchedFaceConfidence +SearchedFaceDetails +SearchedFaceId +SearchedLogStream +SearchedUser +Seasonality +SecondBlockToken +SecondSchemaVersionNumber +SecondSnapshotId +Secondary +SecondaryAllocationIds +SecondaryArtifacts +SecondaryAvailabilityZone +SecondaryBackground +SecondaryBtn +SecondaryEmail +SecondaryForeground +SecondaryGids +SecondaryInputId +SecondaryPrivateIpAddressCount +SecondaryPrivateIpAddresses +SecondaryStatus +SecondaryStatusTransition +SecondaryStatusTransitions +SecondaryValue +SecondaryValueFontConfiguration +SecondaryValueOptions +SecondaryYAxisDisplayOptions +SecondaryYAxisLabelOptions +SecondsBeforeTimeout +SecondsUntilAutoPause +Secret +SecretAccessKey +SecretArn +SecretArnList +SecretBinary +SecretCode +SecretHash +SecretId +SecretKey +SecretList +SecretListEntry +SecretManagerArn +SecretOptions +SecretStatus +SecretString +SecretStringKey +SecretToAuthenticateInitiator +SecretToAuthenticateTarget +SecretToken +SecretVersionsListEntry +SecretVersionsToStages +Secrets +SecretsManagerAccessRoleArn +SecretsManagerAccessTokenConfiguration +SecretsManagerArn +SecretsManagerOracleAsmAccessRoleArn +SecretsManagerOracleAsmSecretId +SecretsManagerSecretConfiguration +SecretsManagerSecretId +SecretsManagerSecretResourceData +SecretsManagerSecurityDbEncryptionAccessRoleArn +SecretsManagerSecurityDbEncryptionSecretId +SecretsRoleArn +Section +SectionAfterPageBreak +SectionBased +SectionBasedLayout +SectionBasedLayoutCanvasSizeOptions +SectionBasedLayoutConfiguration +SectionBasedLayoutPaperCanvasSizeOptions +SectionId +SectionLayoutConfiguration +SectionModification +SectionPageBreakConfiguration +SectionStyle +SectionalElement +Sections +Secure +SecurityConfig +SecurityConfigDetail +SecurityConfigStats +SecurityConfigSummary +SecurityConfiguration +SecurityConfigurationSummary +SecurityConfigurations +SecurityContext +SecurityControl +SecurityControlArn +SecurityControlDefinition +SecurityControlDefinitions +SecurityControlId +SecurityControlIds +SecurityControlStatus +SecurityControls +SecurityDbEncryption +SecurityDbEncryptionName +SecurityDescriptorCopyFlags +SecurityDetails +SecurityGroup +SecurityGroupArns +SecurityGroupId +SecurityGroupIdForDomainBoundary +SecurityGroupIdList +SecurityGroupIdSet +SecurityGroupIdUpdates +SecurityGroupIdentifier +SecurityGroupIds +SecurityGroupLimitExceeded +SecurityGroupMembership +SecurityGroupNotFound +SecurityGroupReference +SecurityGroupReferenceSet +SecurityGroupRemediationAction +SecurityGroupRule +SecurityGroupRuleDescription +SecurityGroupRuleDescriptions +SecurityGroupRuleId +SecurityGroupRuleIds +SecurityGroupRuleRequest +SecurityGroupRuleUpdate +SecurityGroupRules +SecurityGroupSet +SecurityGroups +SecurityHeadersConfig +SecurityHubConfiguration +SecurityKey +SecurityKeys +SecurityNonCompliantCount +SecurityPolicy +SecurityPolicyDetail +SecurityPolicyName +SecurityPolicyNames +SecurityPolicyStats +SecurityPolicySummary +SecurityProfile +SecurityProfileArn +SecurityProfileId +SecurityProfileIdentifier +SecurityProfileIds +SecurityProfileName +SecurityProfileSearchCriteria +SecurityProfileSearchSummary +SecurityProfileSummary +SecurityProfileSummaryList +SecurityProfileTarget +SecurityProfileTargetMapping +SecurityProfiles +SecurityProfilesSearchFilter +SecurityProtocol +SecurityServicePolicyData +SecurityServiceType +SecurityStyle +SecurityToken +SecurityType +Seed +SeedUrlConfiguration +SeedUrls +Segment +SegmentBehaviors +SegmentCondition +SegmentControl +SegmentDeliveryConfiguration +SegmentDeliveryConfigurations +SegmentDemographics +SegmentDetection +SegmentDimensions +SegmentDuration +SegmentDurationSeconds +SegmentGroup +SegmentGroupList +SegmentGroups +SegmentId +SegmentImportResource +SegmentLength +SegmentLengthControl +SegmentLocation +SegmentModifier +SegmentName +SegmentNum +SegmentNumber +SegmentOverride +SegmentPrefix +SegmentReference +SegmentResponse +SegmentStartCondition +SegmentTemplateFormat +SegmentType +SegmentTypeInfo +SegmentTypes +SegmentVersion +SegmentationCancelIndicator +SegmentationDescriptor +SegmentationDescriptorScte35DescriptorSettings +SegmentationDescriptors +SegmentationDuration +SegmentationEventId +SegmentationMarkers +SegmentationMode +SegmentationStyle +SegmentationTime +SegmentationTypeId +SegmentationUpid +SegmentationUpidType +Segments +SegmentsExpected +SegmentsPerSubdirectory +SegmentsReceivedCount +SegmentsRejectedCount +SegmentsResponse +SegmentsSentCount +SegmentsSpilloverCount +Select +SelectAggregateResourceConfigRequest +SelectAggregateResourceConfigResponse +SelectAllOptions +SelectAllValueOptions +SelectAttributesActivity +SelectColumn +SelectFields +SelectFromCollection +SelectObjectContentOutput +SelectObjectContentRequest +SelectParameters +SelectResourceConfigRequest +SelectResourceConfigResponse +SelectSqlQuery +SelectableValues +SelectedBinType +SelectedBorderStyle +SelectedChoiceIds +SelectedChoices +SelectedColumns +SelectedEngineVersion +SelectedFieldOptions +SelectedFields +SelectedFieldsConfiguration +SelectedOutputs +SelectedPointStyle +SelectedSegmentTypes +SelectedSheets +SelectedSheetsFilterScopeConfiguration +SelectedStep +SelectedSteps +SelectedTooltipType +SelectedVideoStreams +SelectionCriteria +SelectionId +SelectionName +SelectionRules +SelectionScope +SelectionStatus +SelectiveAuth +SelectiveExecutionConfig +SelectiveExecutionResult +Selector +SelectorSettings +SelectorType +Selectors +SelfManageResources +SelfManagedActiveDirectoryAttributes +SelfManagedActiveDirectoryConfiguration +SelfManagedActiveDirectoryConfigurationUpdates +SelfManagedEventSource +SelfManagedKafkaAccessConfigurationVpc +SelfManagedKafkaEventSourceConfig +SelfManagedKafkaParameters +SelfManagedOptOutsEnabled +SelfServicePortal +SelfServicePortalUrl +SelfServiceSAMLProviderArn +SelfServiceSamlProviderArn +SelfUserProfile +SelfservicePermissions +SellerName +SemanticEntityType +SemanticType +SemanticVersion +SemtechGnss +SemtechGnssConfiguration +SemtechGnssDetail +SendActivationCodeRequest +SendAlexaOfferToMasterRequest +SendAlexaOfferToMasterResponse +SendAnnouncementRequest +SendAnnouncementResponse +SendApiAssetRequest +SendApiAssetResponse +SendAutomationSignalRequest +SendBonusRequest +SendBounceRequest +SendBounceResponse +SendBulkEmailRequest +SendBulkEmailResponse +SendBulkTemplatedEmailRequest +SendBulkTemplatedEmailResponse +SendChannelMessageRequest +SendChannelMessageResponse +SendCommandRequest +SendCommandResult +SendContactMethodVerificationRequest +SendContactMethodVerificationResult +SendCustomVerificationEmailRequest +SendCustomVerificationEmailResponse +SendDataPoint +SendDataPoints +SendDataToMulticastGroupRequest +SendDataToMulticastGroupResponse +SendDataToWirelessDeviceRequest +SendDataToWirelessDeviceResponse +SendDelayMs +SendDiagnosticInterruptRequest +SendEmail +SendEmailNotification +SendEmailRequest +SendEmailResponse +SendEventRequest +SendEventResponse +SendFilePaths +SendHeartbeatRequest +SendInvitationRequest +SendMessageBatchRequest +SendMessageBatchRequestEntry +SendMessageBatchResult +SendMessageBatchResultEntry +SendMessageRequest +SendMessageResponse +SendMessageResult +SendMessagesRequest +SendMessagesResponse +SendNotification +SendNotificationAction +SendNotificationActionDefinition +SendOTPMessageRequest +SendOTPMessageRequestParameters +SendOTPMessageResponse +SendPipelineExecutionStepFailureRequest +SendPipelineExecutionStepFailureResponse +SendPipelineExecutionStepSuccessRequest +SendPipelineExecutionStepSuccessResponse +SendProjectSessionActionRequest +SendProjectSessionActionResponse +SendQuota +SendRawEmailRequest +SendRawEmailResponse +SendSSHPublicKeyRequest +SendSSHPublicKeyResponse +SendSerialConsoleSSHPublicKeyRequest +SendSerialConsoleSSHPublicKeyResponse +SendTaskFailureInput +SendTaskHeartbeatInput +SendTaskSuccessInput +SendTemplatedEmailRequest +SendTemplatedEmailResponse +SendTestEventNotificationRequest +SendTextMessageRequest +SendTextMessageResult +SendUsersMessageRequest +SendUsersMessageResponse +SendUsersMessagesRequest +SendUsersMessagesResponse +SendVoiceMessageRequest +SendVoiceMessageResponse +SendVoiceMessageResult +SendWorkflowStepStateRequest +Sender +SenderClientId +SenderControlPort +SenderFault +SenderId +SenderIdAndCountry +SenderIdArn +SenderIdFilter +SenderIdInformation +SenderIds +SenderIpAddress +SendingEnabled +SendingIps +SendingOptions +SendingPausedException +SendingPoolName +SendingSchedule +Sensitive +SensitiveData +SensitiveDataDetections +SensitiveDataItem +SensitiveDataResult +SensitivityAggregations +SensitivityInspectionTemplateExcludes +SensitivityInspectionTemplateIncludes +SensitivityInspectionTemplatesEntry +SensitivityLevel +SensitivityThreshold +Sensor +SensorName +SensorStatisticsSummaries +SensorStatisticsSummary +SensorsWithShortDateRange +SentLast24Hours +SentTime +Sentiment +SentimentAnalysisSettings +SentimentConfiguration +SentimentDetectionJobFilter +SentimentDetectionJobProperties +SentimentDetectionJobPropertiesList +SentimentFilter +SentimentResponse +SentimentScore +SentimentType +Sentiments +Separator +SeparatorConfiguration +Seq +Sequence +SequenceInformation +SequenceNumber +SequenceNumberForOrdering +SequenceNumberRange +SequenceStoreDetail +SequenceStoreFilter +SerDeInfo +Serde +SerdeInfo +Serial +SerialConsoleAccessDisabledException +SerialConsoleAccessEnabled +SerialConsoleSessionLimitExceededException +SerialConsoleSessionUnavailableException +SerialNumber +SerialPort +SerializationLibrary +Serializer +Series +SeriesItem +ServeSignature +Server +ServerArn +ServerCannotBeReplicatedException +ServerCertLastUpdated +ServerCertUri +ServerCertificate +ServerCertificateArn +ServerCertificateConfiguration +ServerCertificateConfigurations +ServerCertificateId +ServerCertificateMetadata +ServerCertificateMetadataList +ServerCertificateName +ServerCertificateScope +ServerCertificateSummary +ServerCertificates +ServerConfiguration +ServerDetail +ServerEndpoint +ServerError +ServerEvent +ServerEvents +ServerException +ServerGroup +ServerGroupLaunchConfiguration +ServerGroupReplicationConfiguration +ServerGroupValidationConfiguration +ServerHostname +ServerId +ServerInternalErrorException +ServerInternalException +ServerLaunchConfiguration +ServerLaunchParameters +ServerLaunchPath +ServerName +ServerNameToVerify +ServerOsType +ServerPath +ServerPort +ServerProcess +ServerProcesses +ServerProperties +ServerProtocol +ServerPublicKey +ServerReplicationConfiguration +ServerReplicationParameters +ServerRootCaCertificate +ServerSdkVersion +ServerShortInfoResponse +ServerShutdownException +ServerSideEncryption +ServerSideEncryptionByDefault +ServerSideEncryptionConfiguration +ServerSideEncryptionKmsKeyId +ServerSideEncryptionRule +ServerSideEncryptionUpdateDetails +ServerSideKmsKeyId +ServerSideTokenCheck +ServerStatusSummary +ServerStrategy +ServerSummary +ServerTimestamp +ServerTimezone +ServerTimingHeadersConfig +ServerTrust +ServerTunnelAddress +ServerUrl +ServerValidation +ServerValidationConfiguration +ServerValidationOutput +Serverless +ServerlessClientAuthentication +ServerlessConfig +ServerlessRequest +ServerlessSasl +ServerlessUpdateConfig +ServerlessV2ScalingConfiguration +ServerlessV2ScalingConfigurationInfo +Servers +Service +ServiceAccessRoleArn +ServiceAccessSecurityGroup +ServiceAccountCredentials +ServiceAccountException +ServiceAccountPassword +ServiceAccountUsername +ServiceActionAssociation +ServiceActionAssociations +ServiceActionDetail +ServiceActionId +ServiceActionParameters +ServiceActionSummaries +ServiceActionSummary +ServiceAdditionalInfo +ServiceAlreadyExists +ServiceArn +ServiceArnList +ServiceCatalogConfiguration +ServiceCatalogProvisionedProductDetails +ServiceCatalogProvisioningDetails +ServiceCatalogProvisioningUpdateDetails +ServiceChange +ServiceCode +ServiceCollection +ServiceConfiguration +ServiceConfigurations +ServiceConnectClientAlias +ServiceConnectConfiguration +ServiceConnectService +ServiceConnectServiceResource +ServiceCount +ServiceDescriptor +ServiceDetail +ServiceDetails +ServiceEndpoint +ServiceError +ServiceErrorId +ServiceErrorIds +ServiceErrors +ServiceEvent +ServiceException +ServiceExecutionRole +ServiceExecutionRoleUpdate +ServiceFailureException +ServiceFault +ServiceFilter +ServiceForecastStatistics +ServiceGraphEndTime +ServiceGraphStartTime +ServiceHealth +ServiceId +ServiceIdentifier +ServiceIds +ServiceInfo +ServiceInsightHealth +ServiceInstance +ServiceInstanceState +ServiceInstanceSummary +ServiceIntegration +ServiceIntegrationConfig +ServiceInternalErrorException +ServiceInternalException +ServiceJson +ServiceLastAccessed +ServiceLimit +ServiceLimitExceeded +ServiceLimitExceededException +ServiceLinkedRoleARN +ServiceLinkedRoleFailure +ServiceLinkedRoleLockClientException +ServiceLinkedRoleNotFoundFault +ServiceLocation +ServiceMetadata +ServiceName +ServiceNameAndResourceType +ServiceNames +ServiceNamespace +ServiceNamespaces +ServiceNetworkServiceAssociationSummary +ServiceNetworkSummary +ServiceNetworkVpcAssociationSummary +ServiceNotActiveException +ServiceNotFound +ServiceNotFoundException +ServiceNotSupportedException +ServiceNow +ServiceNowBuildVersion +ServiceNowConfiguration +ServiceNowConnectorProfileCredentials +ServiceNowConnectorProfileProperties +ServiceNowKnowledgeArticleConfiguration +ServiceNowParameters +ServiceNowServiceCatalogConfiguration +ServiceNowSourceProperties +ServiceObservabilityConfiguration +ServicePack +ServicePassword +ServicePermissionId +ServicePipeline +ServicePipelineState +ServicePrincipal +ServicePrincipalName +ServicePrincipalNameSummary +ServicePrincipalNames +ServiceProcessingTimeInMillis +ServiceProfile +ServiceProfileId +ServiceProfileList +ServiceProviderName +ServiceProviderSamlMetadata +ServiceQuota +ServiceQuotaExceededException +ServiceQuotaIncreaseRequestInTemplate +ServiceQuotaIncreaseRequestInTemplateList +ServiceQuotaTemplateAssociationStatus +ServiceQuotaTemplateNotInUseException +ServiceRegistries +ServiceRegistry +ServiceResourceCost +ServiceRole +ServiceRoleArn +ServiceSetting +ServiceSettingNotFound +ServiceSize +ServiceSoftwareOptions +ServiceSpecificCredential +ServiceSpecificCredentialId +ServiceSpecificCredentialMetadata +ServiceSpecificCredentials +ServiceSpecification +ServiceState +ServiceStatistics +ServiceSummary +ServiceSummaryList +ServiceSummaryStatistics +ServiceSyncBlockerSummary +ServiceSyncConfig +ServiceTemplate +ServiceTemplateSummary +ServiceTemplateVersion +ServiceTemplateVersionSummary +ServiceTemporarilyUnavailableException +ServiceType +ServiceTypeDetail +ServiceUnavailable +ServiceUnavailableError +ServiceUnavailableException +ServiceUpdate +ServiceUpdateDescription +ServiceUpdateEndDate +ServiceUpdateName +ServiceUpdateNameToApply +ServiceUpdateNotFoundFault +ServiceUpdateRecommendedApplyByDate +ServiceUpdateReleaseDate +ServiceUpdateRequest +ServiceUpdateSeverity +ServiceUpdateStatus +ServiceUpdateTimeRange +ServiceUpdateType +ServiceUpdates +ServiceUpdatesMessage +ServiceUrl +ServiceUserName +ServiceVersion +ServiceVersions +Services +ServicesLastAccessed +Session +SessionAlreadyExistsException +SessionArn +SessionCap +SessionCommand +SessionConfiguration +SessionContext +SessionContextAttributes +SessionCookieName +SessionData +SessionDataSortBy +SessionDuration +SessionExpirationDurationInSeconds +SessionExpiredException +SessionFilter +SessionId +SessionIdleTimeoutInMinutes +SessionInitializationEndpointPrefix +SessionIntegrationConfiguration +SessionIssuer +SessionKeyAmex +SessionKeyDerivationAttributes +SessionKeyDerivationMode +SessionKeyDerivationValue +SessionKeyEmv2000 +SessionKeyEmvCommon +SessionKeyMastercard +SessionKeyVisa +SessionKeys +SessionKeysAbpV1_0_x +SessionKeysAbpV1_1 +SessionLifetimeInMinutes +SessionLifetimeInMinutesInvalidException +SessionManagerOutputUrl +SessionMapping +SessionMappingDetail +SessionMappingSummary +SessionMappings +SessionName +SessionNameOrId +SessionNotFoundException +SessionNumber +SessionPinningFilters +SessionPolicyArn +SessionSampleRate +SessionScriptS3Location +SessionSpecification +SessionStartTime +SessionState +SessionStatistics +SessionStatus +SessionStickinessConfig +SessionSummary +SessionTag +SessionTags +SessionTimeout +SessionTimeoutHours +SessionTimeoutMinutes +SessionToken +Sessions +Set +SetActiveReceiptRuleSetRequest +SetAlarmStateInput +SetAsDefault +SetCognitoEventsRequest +SetDataCaptureChanges +SetDataRetrievalPolicyInput +SetDefaultAuthorizerRequest +SetDefaultAuthorizerResponse +SetDefaultMessageTypeRequest +SetDefaultMessageTypeResult +SetDefaultPermissionVersionRequest +SetDefaultPermissionVersionResponse +SetDefaultPolicyVersionRequest +SetDefaultSenderIdRequest +SetDefaultSenderIdResult +SetDesiredCapacityType +SetDimension +SetEndpointAttributesInput +SetFileModeEntry +SetGatewayBridgeSourceRequest +SetId +SetIdentifier +SetIdentityDkimEnabledRequest +SetIdentityFeedbackForwardingEnabledRequest +SetIdentityHeadersInNotificationsEnabledRequest +SetIdentityMailFromDomainRequest +SetIdentityNotificationTopicRequest +SetIdentityPoolConfigurationRequest +SetIdentityPoolConfigurationResponse +SetIdentityPoolRolesInput +SetInstanceHealthQuery +SetInstanceProtectionQuery +SetIpAddressTypeInput +SetIpAddressTypeOutput +SetIpAddressTypeRequest +SetIpAddressTypeResult +SetLoadBalancerListenerSSLCertificateInput +SetLoadBalancerPoliciesForBackendServerInput +SetLoadBalancerPoliciesOfListenerInput +SetLoadBasedAutoScalingRequest +SetLocalConsolePasswordInput +SetLocalConsolePasswordOutput +SetLogDeliveryConfigurationRequest +SetLogDeliveryConfigurationResponse +SetLoggingOptionsRequest +SetName +SetParameterValueConfiguration +SetParametersOperation +SetPermissionRequest +SetPlatformApplicationAttributesInput +SetPrincipalTagAttributeMapInput +SetPrincipalTagAttributeMapResponse +SetQueueAttributesRequest +SetReceiptRulePositionRequest +SetRepositoryPolicyRequest +SetRepositoryPolicyResponse +SetResourceAccessForBucketRequest +SetResourceAccessForBucketResult +SetRiskConfigurationRequest +SetRiskConfigurationResponse +SetRulePrioritiesInput +SetRulePrioritiesOutput +SetSMBGuestPasswordInput +SetSMBGuestPasswordOutput +SetSMSAttributesInput +SetSecurityGroupsInput +SetSecurityGroupsOutput +SetSecurityTokenServicePreferencesRequest +SetSourceRequest +SetStackPolicyInput +SetStatOption +SetStatusInput +SetSubnetsInput +SetSubnetsOutput +SetSubscriptionAttributesInput +SetTagsForResourceRequest +SetTaskStatusInput +SetTerminationProtectionInput +SetTextMessageSpendLimitOverrideRequest +SetTextMessageSpendLimitOverrideResult +SetTimeBasedAutoScalingRequest +SetTimerAction +SetTopicAttributesInput +SetTypeConfigurationInput +SetTypeConfigurationOutput +SetTypeDefaultVersionInput +SetUICustomizationRequest +SetUICustomizationResponse +SetUserMFAPreferenceRequest +SetUserPoolMfaConfigRequest +SetUserPoolMfaConfigResponse +SetUserSettingsRequest +SetV2LoggingLevelRequest +SetV2LoggingOptionsRequest +SetVariableAction +SetVaultAccessPolicyInput +SetVaultNotificationsInput +SetVisibleToAllUsersInput +SetVoiceMessageSpendLimitOverrideRequest +SetVoiceMessageSpendLimitOverrideResult +Setting +SettingDescription +SettingEntries +SettingEntry +SettingId +SettingName +SettingValue +Settings +SettingsForUpdate +SettingsGroup +Setup +SetupFailed +SetupModeDisabled +SetupScriptDetails +Severe +Severities +Severity +SeverityCounts +SeverityLabel +SeverityLevel +SeverityNormalized +SeverityProduct +SeverityRating +SeveritySummary +SeverityUpdate +SftpAuthenticationMethods +SftpConfig +SftpConnectorConfig +Sha1 +ShadowColor +ShadowModeConfig +ShadowModelVariantConfig +ShadowModelVariantName +ShadowModelVariants +ShadowOpacity +ShadowProductionVariants +ShadowXOffset +ShadowYOffset +ShapBaseline +ShapBaselineConfig +ShapBaselineUri +ShapConfig +Shape +ShapeConditionalFormat +Shard +ShardConfiguration +ShardConfigurationRequest +ShardCount +ShardDetail +ShardFilter +ShardId +ShardIterator +ShardIteratorType +ShardLevelMetrics +ShardLimit +ShardName +ShardNotFoundFault +ShardToMerge +ShardToSplit +Shards +ShardsPerClusterQuotaExceededFault +ShareAttributes +ShareDetails +ShareDirectoryRequest +ShareDirectoryResult +ShareError +ShareErrors +ShareId +ShareInvitation +ShareInvitationAction +ShareInvitationId +ShareInvitationSummaries +ShareInvitationSummary +ShareLimitExceededException +ShareMethod +ShareNotes +SharePointConfiguration +SharePointVersion +SharePrincipal +SharePrincipals +ShareResourceType +ShareResult +ShareResults +ShareRule +ShareRules +ShareStatus +ShareTagOptions +ShareTarget +SharedAccountId +SharedAwsAccountIds +SharedBy +SharedDirectories +SharedDirectory +SharedDirectoryId +SharedDirectoryIds +SharedDocumentVersion +SharedFileSystemConfiguration +SharedImagePermissions +SharedImagePermissionsList +SharedMemorySize +SharedRoutesEnabled +SharedSecret +SharedSegments +SharedSnapshotQuotaExceededFault +SharedWith +SharedWithPrefix +SharingModel +SharingSettings +Sharpening +Sharpness +Sheet +SheetContentType +SheetControlInfoIconLabelOptions +SheetControlLayout +SheetControlLayoutConfiguration +SheetControlLayouts +SheetControlsOption +SheetDefinition +SheetElementConfigurationOverrides +SheetElementRenderingRule +SheetId +SheetIndexes +SheetLayoutElementMaximizationOption +SheetNames +SheetSelections +SheetStyle +SheetTextBox +SheetTextBoxId +SheetVisualScopingConfiguration +SheetVisualScopingConfigurations +Sheets +ShellHistoryFilePath +ShellVersion +ShiftCoverages +ShiftDetails +Shipment +ShipmentCarrier +ShipmentInformation +ShipmentState +ShipmentTrackingNumber +ShippingAddress +ShippingDetails +ShippingOption +ShortCode +ShortDescription +ShortFormatText +ShortName +Shortened +Shortname +ShotFilter +ShotSegment +ShouldDecrementDesiredCapacity +ShouldRespectGracePeriod +Show +ShowAlternatives +ShowAssignedLFTags +ShowCacheClustersNotInReplicationGroups +ShowCacheNodeInfo +ShowDetail +ShowMemberInfo +ShowNodeGroupConfig +ShowNodeLevelUpdateStatus +ShowShardDetails +ShowSpeakerLabel +ShowSpeakerLabels +ShrinkPolicy +ShuffleConfig +Shutdown +ShutdownEventConfiguration +ShutdownGatewayInput +ShutdownGatewayOutput +ShuttingDown +Sid +SideSpecificBorder +Sidewalk +SidewalkAccountInfo +SidewalkAccountInfoWithFingerprint +SidewalkCreateWirelessDevice +SidewalkDevice +SidewalkDeviceMetadata +SidewalkEventNotificationConfigurations +SidewalkGetDeviceProfile +SidewalkGetStartImportInfo +SidewalkId +SidewalkListDevice +SidewalkManufacturingSn +SidewalkResourceTypeEventConfiguration +SidewalkSendDataToDevice +SidewalkSingleStartImportInfo +SidewalkStartImportInfo +SidewalkUpdateAccount +SidewalkUpdateImportInfo +SigKeyCrc +SigV4Authorization +Sign +SignInConfig +SignInDistribution +SignInMethod +SignInUrl +SignInWithApple +SignKey +SignOutUserRequest +SignPayloadRequest +SignPayloadResponse +SignRequest +SignResponse +SignUpRequest +SignUpResponse +Signal +SignalApplicationInstanceNodeInstancesRequest +SignalApplicationInstanceNodeInstancesResponse +SignalCatalogSummary +SignalDecoder +SignalExternalWorkflowExecutionDecisionAttributes +SignalExternalWorkflowExecutionFailedEventAttributes +SignalExternalWorkflowExecutionInitiatedEventAttributes +SignalInformation +SignalProcessingNotification +SignalResourceInput +SignalType +SignalWorkflowExecutionInput +SignalingUrl +Signature +SignatureAlgorithm +SignatureDetection +SignatureDetections +SignatureValid +SignatureValidityPeriod +Signed +SignedCert +SignedHeaders +SignedObject +SignedToken +SignedUrl +SignedUrlExpiresAt +Signer +SigninDelegateGroup +SigninDelegateGroups +SigningAlg +SigningAlgorithm +SigningAlgorithmMnemonic +SigningAlgorithmType +SigningAlgorithms +SigningAttributes +SigningAttributesOrigin +SigningBehavior +SigningCertificate +SigningConfiguration +SigningConfigurationOverrides +SigningEnabled +SigningImageFormat +SigningJob +SigningJobArn +SigningJobRevocationRecord +SigningKeyAlgorithm +SigningKeyCertificate +SigningKeyCertificateChain +SigningMaterial +SigningPlatform +SigningPlatformOverrides +SigningProfile +SigningProfileParameter +SigningProfileRevocationRecord +SigningProfileVersionArn +SigningProfileVersionArns +SigningProtocol +SignupResponse +SilentPush +Similarity +SimilarityThreshold +Simple +SimpleAddress +SimpleAttributeAggregation +SimpleClusterMarker +SimpleCondition +SimpleCriterionForJob +SimpleEmail +SimpleEmailPart +SimpleNumericalAggregation +SimpleRule +SimpleRuleEvaluation +SimpleScalingPolicyConfiguration +SimpleScopeTerm +SimpleUser +SimplifiedApplication +SimplifiedColor +SimulateCustomPolicyRequest +SimulatePolicyResponse +SimulatePrincipalPolicyRequest +SimulateReservedQueue +Simulation +SimulationAppEndpointInfo +SimulationAppMetadata +SimulationAppPortMapping +SimulationApplicationConfig +SimulationApplicationSummary +SimulationClock +SimulationJob +SimulationJobBatchSummary +SimulationJobRequest +SimulationJobSummary +SimulationMetadata +SimulationSoftwareSuite +Simulations +SinceCrawlDate +SingleAvailabilityZone +SingleHeader +SingleHeaderConfig +SingleInstanceHealth +SingleInstanceType +SingleMasterChannelEndpointConfiguration +SingleMasterConfiguration +SingleMetricAnomalyDetector +SingleMetricVisibility +SingleQueryArgument +SingleSelectOptions +SingleSelectQuestionRuleCategoryAutomation +SingleSignOnManagedApplicationInstanceId +SingleSignOnUserIdentifier +SingleSignOnUserValue +SingleWeightConfig +Singular +SingularConnectorProfileCredentials +SingularConstant +SingularSourceProperties +SinkArn +SinkId +SinkIdentifier +SinkType +Sinks +SipAddress +SipAddresses +SipHeaders +SipMediaApplication +SipMediaApplicationAlexaSkillConfiguration +SipMediaApplicationArn +SipMediaApplicationCall +SipMediaApplicationEndpoint +SipMediaApplicationId +SipMediaApplicationLoggingConfiguration +SipMediaApplications +SipRule +SipRuleId +SipRuleTargetApplication +SipRules +Site +SiteArn +SiteBaseUrl +SiteId +SiteIds +SiteMaps +SiteMapsConfiguration +SitePlan +SiteToSiteVpnAttachment +SiteUrl +Sites +Size +SizeBytes +SizeClassified +SizeConstraint +SizeConstraintSet +SizeConstraintSetId +SizeConstraintSetSummary +SizeConstraintSetUpdate +SizeConstraintSets +SizeConstraintStatement +SizeConstraints +SizeEstimateRangeGB +SizeFlexEligible +SizeInBytes +SizeInGB +SizeInMBs +SizeInMegabytes +SizeInMiB +SizeLabelOptions +SizeOnDisk +SizePercent +SizeRange +SizeUnit +Sizes +SizingOptions +SizingPolicy +SkewedColumnNames +SkewedColumnValueLocationMaps +SkewedColumnValues +SkewedInfo +SkillDetails +SkillGroup +SkillGroupArn +SkillGroupData +SkillGroupName +SkillGroups +SkillId +SkillName +SkillNotLinkedException +SkillSummaries +SkillSummary +SkillType +SkillTypes +SkillsStoreSkill +SkillsStoreSkills +SkipArchive +SkipCheck +SkipDestinationValidation +SkipFinalBackup +SkipFinalClusterSnapshot +SkipFinalSnapshot +SkipFirst +SkipMatching +SkipModelValidation +SkipTunnelReplacement +SkipUnavailable +SkipWaitTimeForInstanceTerminationInput +Skipped +SkippedIPRangeList +SkippedRecordCount +SkippedTermCount +SkippedUsers +SkippedVolumeDetails +Sku +SlaMet +Slack +SlackChannelConfiguration +SlackConfiguration +SlackConnectorProfileCredentials +SlackConnectorProfileProperties +SlackEntityList +SlackMetadata +SlackSourceProperties +SlackWorkspaceConfiguration +Slate +SlateAdUrl +SlateSource +SlaveInstanceType +Slices +Slider +SliderControlDisplayOptions +Slot +SlotCaptureSetting +SlotDateTimeRangeRequest +SlotDefaultValue +SlotDefaultValueSpec +SlotDefaultValueSpecification +SlotDurationInHours +SlotFilter +SlotMigration +SlotName +SlotNotAvailableException +SlotPriority +SlotResolutionTestResultItem +SlotResolutionTestResultItemCounts +SlotSortBy +SlotStartTimeRange +SlotStartTimeRangeRequest +SlotSuggestions +SlotSummary +SlotTypeConfiguration +SlotTypeFilter +SlotTypeMetadata +SlotTypeRegexConfiguration +SlotTypeSortBy +SlotTypeStatistics +SlotTypeSummary +SlotTypeValue +SlotValue +SlotValueElicitationSetting +SlotValueOverride +SlotValueRegexFilter +SlotValueSelectionSetting +Slots +SlowDownException +SlowPal +SmallImageIconUrl +SmallMultiples +SmallMultiplesAxisProperties +SmallMultiplesLimitConfiguration +SmallMultiplesOptions +SmallMultiplesSort +SmartHomeAppliance +SmartHomeAppliances +Smb +SmbMountOptions +Smile +SmoothStreaming +SmoothingLatency +Smpte2038DataPreference +SmpteTtDestinationSettings +SmsAuthenticationMessage +SmsConfiguration +SmsConfigurationFailure +SmsConfigurationType +SmsMessage +SmsMfaConfigType +SmsMfaConfiguration +SmsSettings +SmsVerificationMessage +SmtpReplyCode +SnapShotTimeFilter +SnapStart +SnapStartException +SnapStartNotReadyException +SnapStartResponse +SnapStartTimeoutException +SnaplockConfiguration +SnaplockRetentionPeriod +SnaplockType +SnappedDeparturePositions +SnappedDestinationPositions +Snapshot +SnapshotARN +SnapshotAlreadyExistsFault +SnapshotAnonymousUser +SnapshotAnonymousUserRedacted +SnapshotArn +SnapshotArns +SnapshotCapacityUsed +SnapshotClusterIdentifier +SnapshotConfiguration +SnapshotCopyAlreadyDisabledFault +SnapshotCopyAlreadyEnabledFault +SnapshotCopyDisabledFault +SnapshotCopyGrant +SnapshotCopyGrantAlreadyExistsFault +SnapshotCopyGrantMessage +SnapshotCopyGrantName +SnapshotCopyGrantNotFoundFault +SnapshotCopyGrantQuotaExceededFault +SnapshotCopyGrants +SnapshotCreateTime +SnapshotCreationTime +SnapshotCreationTimestamp +SnapshotDatabaseTime +SnapshotDescription +SnapshotDestinationConfiguration +SnapshotDetail +SnapshotDetails +SnapshotDiskContainer +SnapshotDownloadUrl +SnapshotErrorMessage +SnapshotFeatureNotSupportedFault +SnapshotFile +SnapshotFileGroup +SnapshotFileSheetSelection +SnapshotFilter +SnapshotId +SnapshotIdentifier +SnapshotIdentifierList +SnapshotIds +SnapshotInfo +SnapshotJobErrorInfo +SnapshotJobId +SnapshotJobResult +SnapshotJobResultErrorInfo +SnapshotJobResultFileGroup +SnapshotJobS3Result +SnapshotLimitExceededException +SnapshotLimits +SnapshotMessage +SnapshotName +SnapshotNotFound +SnapshotNotFoundFault +SnapshotOptions +SnapshotOptionsStatus +SnapshotOwner +SnapshotPolicy +SnapshotQuotaExceededFault +SnapshotRecycleBinInfo +SnapshotRetentionLimit +SnapshotRetentionStartTime +SnapshotS3DestinationConfiguration +SnapshotS3Location +SnapshotSchedule +SnapshotScheduleAlreadyExistsFault +SnapshotScheduleIdentifier +SnapshotScheduleNotFoundFault +SnapshotScheduleQuotaExceededFault +SnapshotScheduleState +SnapshotScheduleUpdateInProgressFault +SnapshotSchedules +SnapshotSizeInMegaBytes +SnapshotSortingEntity +SnapshotSource +SnapshotStatus +SnapshotSummaries +SnapshotSummary +SnapshotTarget +SnapshotTaskDetail +SnapshotTierStatus +SnapshotTierStatuses +SnapshotTime +SnapshotType +SnapshotUserConfiguration +SnapshotUserConfigurationRedacted +SnapshotVersion +SnapshotWindow +Snapshots +SnapshotsData +SnapshotsDataHeader +SnapshotsEnabled +SnapshotsEnabledUpdate +SnapshottingClusterId +SnoozeActionConfiguration +SnoozeAlarmActionRequest +SnowballAmiId +SnowballCapacityPreference +SnowballId +SnowballLimit +SnowballType +SnowballsInUse +SnowconeDeviceConfiguration +Snowflake +SnowflakeConnectorProfileCredentials +SnowflakeConnectorProfileProperties +SnowflakeDestinationProperties +SnowflakeMetadata +SnowflakeNodeData +SnowflakeParameters +SnowflakeSource +SnowflakeTarget +Snr +Sns +SnsAction +SnsCallerArn +SnsChannelConfig +SnsConfiguration +SnsDataSource +SnsDestination +SnsFormat +SnsRegion +SnsRoleName +SnsTopic +SnsTopicARN +SnsTopicArn +SnsTopicConfiguration +SnsTopicName +SnsTopicSinkConfiguration +SnsTopicStatus +SocialProviderSettings +SocketAddress +SocketPath +Sockets +SoftIRQ +SoftLimit +Softness +Software +SoftwareDetails +SoftwareInformation +SoftwarePackage +SoftwareToUpdate +SoftwareTokenMFANotFoundException +SoftwareTokenMfaConfigType +SoftwareTokenMfaConfiguration +SoftwareTokenMfaSettings +SoftwareTokenMfaSettingsType +SoftwareUpdateOptions +SoftwareUpdateOptionsStatus +SoftwareUpdatesEndDate +SoftwareVersion +Solid +Solution +SolutionConfig +SolutionStackDescription +SolutionStackDetails +SolutionStackName +SolutionStacks +SolutionSummary +SolutionVersion +SolutionVersionSummary +SolveTimestamp +SolverProvider +SolverType +SolverVersion +Solvers +SopRecommendation +Sort +SortAscending +SortBy +SortByMetric +SortColumns +SortCondition +SortConfiguration +SortCriteria +SortCriterion +SortDefinition +SortDirection +SortEnabled +SortExpression +SortIconVisibility +SortKey +SortOrder +SortPaths +SortProperty +Sortable +SortingConfiguration +SortingEntities +Sound +Source +Source608ChannelNumber +Source608TrackNumber +SourceARN +SourceAccessConfiguration +SourceAccessConfigurations +SourceAccount +SourceAccountId +SourceAddress +SourceAddresses +SourceAlgorithm +SourceAlgorithmSpecification +SourceAlgorithms +SourceAnalysis +SourceAncillaryChannelNumber +SourceAndDestinationAreSameException +SourceApiAssociation +SourceApiAssociationConfig +SourceApiAssociationSummary +SourceApplicationName +SourceApplicationUrl +SourceArn +SourceArnPrefix +SourceAuth +SourceBackup +SourceBackupArn +SourceBackupId +SourceBackupRegion +SourceBackupUnavailable +SourceBackupVaultArn +SourceBackupVaultName +SourceBranchName +SourceBucket +SourceBucketArn +SourceBuildInformation +SourceBundle +SourceBundleDeletionException +SourceCacheNodeId +SourceCidrBlock +SourceCloudProperties +SourceCluster +SourceClusterInfo +SourceClusterNotSupportedFault +SourceCode +SourceCodeArchiveUrl +SourceCodeArtifactsObjectKey +SourceCodeRepository +SourceCodeType +SourceCodeUrl +SourceCodeVersion +SourceColumn +SourceCommit +SourceConfig +SourceConfiguration +SourceConnection +SourceConnectionDetail +SourceConnectionParameters +SourceConnectorProperties +SourceConnectorType +SourceContactId +SourceContainer +SourceControlDetails +SourceControls +SourceCredentialsInfo +SourceCustomDbEngineVersionIdentifier +SourceDBClusterIdentifier +SourceDBClusterParameterGroupIdentifier +SourceDBClusterSnapshotArn +SourceDBClusterSnapshotIdentifier +SourceDBInstanceArn +SourceDBInstanceAutomatedBackupsArn +SourceDBInstanceIdentifier +SourceDBParameterGroupIdentifier +SourceDBSnapshotIdentifier +SourceDataColumnProperties +SourceDataProviderDescriptors +SourceDatabaseName +SourceDatabaseNotSupportedFault +SourceDatasetArn +SourceDbClusterResourceId +SourceDbSnapshotIdentifier +SourceDbiResourceId +SourceDescription +SourceDestCheck +SourceDetail +SourceDetails +SourceDirectory +SourceDocument +SourceDocuments +SourceDocumentsS3Uri +SourceDomain +SourceDomainInfo +SourceEncryptionAlgorithm +SourceEncryptionContext +SourceEndBehavior +SourceEndpointArn +SourceEngine +SourceEngineName +SourceEngineVersion +SourceEntity +SourceEntityArn +SourceEnvironmentId +SourceEnvironmentName +SourceFailoverConfig +SourceField +SourceFieldProperties +SourceFields +SourceFile +SourceFileLocation +SourceFileOrContentRequiredException +SourceFileSpecifier +SourceFileSystemArn +SourceFileSystemId +SourceFileSystemRegion +SourceFiles +SourceFilterId +SourceFlowConfig +SourceFpgaImageId +SourceGroup +SourceId +SourceIdType +SourceIdentifier +SourceIdentity +SourceIds +SourceIdsList +SourceImage +SourceImageFace +SourceImageId +SourceImageName +SourceImageOrientationCorrection +SourceIp +SourceIpConditionConfig +SourceIpConfig +SourceIpV4 +SourceIpV6 +SourceIpamPoolId +SourceIps +SourceItemsLimit +SourceKeyId +SourceKeyword +SourceLanguageCode +SourceLastUpdatedTimestampFormat +SourceLayerArn +SourceLayerHash +SourceLicenseContext +SourceListenerAddress +SourceListenerPort +SourceLocation +SourceLocationArn +SourceLocationName +SourceMac +SourceMember +SourceMetadata +SourceModelArn +SourceModelVariantName +SourceModelVersionArn +SourceName +SourceNetwork +SourceNetworkData +SourceNetworkInterfaceArns +SourceNotFoundFault +SourceObject +SourceObjectReference +SourceOptionGroup +SourceOptionGroupIdentifier +SourceParameterName +SourceParameters +SourceParentId +SourceParentNotFoundException +SourcePath +SourcePhoneNumber +SourcePipelineExecutionArn +SourcePolicyId +SourcePolicyType +SourcePort +SourcePortRange +SourcePortRanges +SourcePortfolioId +SourcePorts +SourcePrefix +SourcePrefixLists +SourcePriority +SourceProductArn +SourceProjectArn +SourceProjectVersionArn +SourceProperties +SourceProvisioningArtifactIdentifiers +SourceQueue +SourceRecoveryPointArn +SourceRefContains +SourceRegion +SourceRegionMessage +SourceRegions +SourceRepository +SourceReservedNode +SourceReservedNodeCount +SourceReservedNodeId +SourceReservedNodeType +SourceResourceArn +SourceResourceName +SourceResourceType +SourceResult +SourceRevision +SourceRoleArn +SourceS3Location +SourceS3Path +SourceSchema +SourceSchemaName +SourceSecurityGroup +SourceSecurityGroupName +SourceSecurityGroupOwnerId +SourceSegments +SourceSelectionCriteria +SourceServer +SourceServerActionDocument +SourceServerActionsRequestFilters +SourceSettings +SourceSheetControlId +SourceSnapshotClusterIdentifier +SourceSnapshotId +SourceSnapshotIdentifier +SourceSnapshotIds +SourceSnapshotName +SourceStackId +SourceTable +SourceTableArn +SourceTableDetails +SourceTableFeatureDetails +SourceTableName +SourceTemplate +SourceText +SourceType +SourceTypes +SourceURI +SourceUpdateToken +SourceUri +SourceUrl +SourceUser +SourceUserIdentifier +SourceVersion +SourceVolume +SourceVolumeARN +SourceVpc +SourceWatermarkStatus +SourceWorkspaceId +Sources +South +Space +SpaceArn +SpaceConfiguration +SpaceDetails +SpaceFieldMappings +SpaceName +SpaceNameContains +SpaceNameEquals +SpaceSettings +SpaceSummary +Spaces +Spacing +SpamCount +SpamPercentage +SpamRawCount +Span +SparkConnectorSource +SparkConnectorTarget +SparkParameters +SparkProperties +SparkSQL +SparkSqlJobDriver +SparkSubmit +SparkSubmitJobDriver +Sparkline +SparqlData +SparqlRecord +SparseTrackType +SpatialAdaptiveQuantization +SpatialAq +SpatialDataOptionToGeoJsonFunctionName +SpatialFilterSettings +SpawnRate +SpdxLicenseId +Speaker +SpeakerEnrollmentJob +SpeakerEnrollmentJobSummary +SpeakerId +SpeakerSearchDetails +SpeakerSearchResult +SpeakerSearchStatus +SpeakerSearchTask +SpeakerSearchTaskId +SpeakerSearchTaskStatus +SpeakerSummaries +SpeakerSummary +Spec +SpecialFeature +SpecialValue +Specialty +SpecifedOrder +Specification +Specifications +SpecifiedImage +SpectrumConfig +SpeechMarkTypes +SpeechThreshold +Speed +SpekeKeyProvider +SpekeKeyProviderCmaf +SpellCorrectedQueries +SpellCorrectedQuery +SpellCorrectionConfiguration +Spend +SpendCoveredBySavingsPlans +SpendLimit +SpendLimits +SpfPercentage +Spigot +SpliceEventId +SpliceInsertMessage +Split +SplitChargeRules +SplitDocument +SplitDocuments +SplitFields +SplitShardInput +SplitTunnel +SplitType +SplunkDestinationConfiguration +SplunkDestinationDescription +SplunkDestinationUpdate +SplunkRetryOptions +SpotAllocationStrategy +SpotCapacityRebalance +SpotDatafeedSubscription +SpotFleetLaunchSpecification +SpotFleetMonitoring +SpotFleetRequestConfig +SpotFleetRequestConfigData +SpotFleetRequestConfigs +SpotFleetRequestId +SpotFleetRequestIds +SpotFleetRequestState +SpotFleetTagSpecification +SpotInstancePools +SpotInstanceRequest +SpotInstanceRequestId +SpotInstanceRequestIds +SpotInstanceRequests +SpotInstanceStateFault +SpotInstanceStatus +SpotInstanceType +SpotMaintenanceStrategies +SpotMarketOptions +SpotMaxPrice +SpotMaxPricePercentageOverLowestPrice +SpotMaxTotalPrice +SpotOptions +SpotOptionsRequest +SpotPlacement +SpotPlacementScore +SpotPlacementScores +SpotPrice +SpotPriceHistory +SpotProvisioningSpecification +SpotResizeSpecification +SpotResizingSpecification +SpotSpecification +SpotTargetCapacity +SpreadDomain +SpreadLevel +Sql +SqlAlias +SqlAliases +SqlApplicationConfiguration +SqlApplicationConfigurationDescription +SqlApplicationConfigurationUpdate +SqlConfiguration +SqlEndpointPath +SqlInjectionMatchSet +SqlInjectionMatchSetId +SqlInjectionMatchSetSummary +SqlInjectionMatchSetUpdate +SqlInjectionMatchSets +SqlInjectionMatchTuple +SqlInjectionMatchTuples +SqlParameter +SqlParseException +SqlQuery +SqlQueryDatasetAction +SqlRunConfiguration +SqlRunConfigurations +SqlServerParameters +SqlStatementResult +SqlType +SqliMatchStatement +Sqls +SqsAction +SqsFailureFeedbackRoleArn +SqsParameters +SqsQueueArn +SqsQueueConfiguration +SqsQueueParameters +SqsQueueSinkConfiguration +SqsQueueUrl +SqsSuccessFeedbackRoleArn +Squash +SriovNetSupport +SrtDestinationSettings +SseAwsKmsKeyId +SseConfig +SseConfiguration +SseDescription +SseKmsEncryptedObjects +SseSpecification +SseType +SshCiphers +SshHostDsaKeyFingerprint +SshHostRsaKeyFingerprint +SshKexs +SshKey +SshKeyLastUpdated +SshKeyName +SshMacs +SshPublicKey +SshPublicKeyBody +SshPublicKeyCount +SshPublicKeyId +SshPublicKeys +SshUsername +Ssid +Ssl +SslCaCertificateArn +SslCertificateId +SslCertificateS3Path +SslClientCertificateArn +SslClientKeyArn +SslClientKeyPassword +SslConfiguration +SslEndpointIdentificationAlgorithm +SslMode +SslPolicies +SslPolicy +SslProperties +SslProtocols +SslSecurityProtocol +SslSupportMethod +SsmActionDefinition +SsmAutomation +SsmControls +SsmDocument +SsmOpsItemId +SsmParameterStoreParameter +Ssml +SsmlList +SsmlMarksNotSupportedForTextTypeException +SsoEnabled +Stable +Stack +StackArn +StackConfigInput +StackConfigurationManager +StackDriftDetectionId +StackDriftInformation +StackDriftInformationSummary +StackDriftStatus +StackError +StackErrors +StackEvent +StackEvents +StackId +StackIds +StackIdsUrl +StackInstance +StackInstanceAccount +StackInstanceComprehensiveStatus +StackInstanceFilter +StackInstanceNotFoundException +StackInstanceRegion +StackInstanceResourceDriftStatuses +StackInstanceResourceDriftsSummary +StackInstanceStatus +StackInstanceSummary +StackInstances +StackName +StackNames +StackNotFoundException +StackPolicyBody +StackPolicyDuringUpdateBody +StackPolicyDuringUpdateURL +StackPolicyURL +StackResource +StackResourceDetail +StackResourceDrift +StackResourceDriftInformation +StackResourceDriftInformationSummary +StackResourceDriftStatus +StackResourceDriftStatusFilters +StackResourceDrifts +StackResourceSummaries +StackResourceSummary +StackResources +StackSet +StackSetARN +StackSetAccounts +StackSetDriftDetectionDetails +StackSetFailureToleranceCount +StackSetFailureTolerancePercentage +StackSetId +StackSetMaxConcurrencyCount +StackSetMaxConcurrencyPercentage +StackSetName +StackSetNotEmptyException +StackSetNotFoundException +StackSetOperation +StackSetOperationPreferences +StackSetOperationResultSummary +StackSetOperationStatusDetails +StackSetOperationSummary +StackSetOperationType +StackSetRegions +StackSetSummary +StackStatus +StackStatusFilter +StackStatusReason +StackSummaries +StackSummary +Stacks +Stage +StageContext +StageDeclaration +StageDeployment +StageDeploymentDetails +StageDeploymentSummary +StageDeployments +StageDetails +StageExecution +StageId +StageIndex +StageKey +StageLastUpdatedDateTime +StageName +StageNotFoundException +StageNotRetryableException +StageReason +StageSession +StageSessionSummary +StageState +StageStatus +StageSummary +StageVariableOverrides +StageVariables +Stages +StagesAvailable +Staging +StagingArea +StagingDistributionDnsNames +StagingDistributionId +StagingDistributionInUse +StagingSourceServer +StagingTable +Stairs +StaleIpPermission +StaleIpPermissions +StaleIpPermissionsEgress +StaleRequestException +StaleSecurityGroup +StaleSecurityGroupSet +StaleTagException +StandByAvailabilityZoneCount +Standard +StandardErrorContent +StandardErrorUrl +StandardHlsSettings +StandardIdentifiers +StandardKnowledgeArticleTypeConfiguration +StandardLayout +StandardMessages +StandardMetricName +StandardObjectAttachmentConfiguration +StandardObjectConfigurations +StandardOutputContent +StandardOutputUrl +Standards +StandardsArn +StandardsControl +StandardsControlArn +StandardsControlArns +StandardsControlAssociationDetail +StandardsControlAssociationDetails +StandardsControlAssociationId +StandardsControlAssociationIds +StandardsControlAssociationSummaries +StandardsControlAssociationSummary +StandardsControlAssociationUpdate +StandardsControlAssociationUpdates +StandardsControlDescription +StandardsControlTitle +StandardsId +StandardsInput +StandardsManagedBy +StandardsStatus +StandardsStatusReason +StandardsSubscription +StandardsSubscriptionArn +StandardsSubscriptionArns +StandardsSubscriptionRequest +StandardsSubscriptionRequests +StandardsSubscriptions +StandbyDelayTime +StandbyInstances +StandbyWorkspace +StandbyWorkspaceRequest +StandbyWorkspaces +Start +StartAccessLoggingInput +StartActivity +StartActivityStreamRequest +StartActivityStreamResponse +StartAfter +StartAfterDateTime +StartAngle +StartAnnotationImportRequest +StartAnnotationImportResponse +StartAppAssessmentRequest +StartAppAssessmentResponse +StartAppBlockBuilderRequest +StartAppBlockBuilderResult +StartAppInput +StartAppOutput +StartAppReplicationRequest +StartApplicationRefreshInput +StartApplicationRefreshOutput +StartApplicationRequest +StartArns +StartAssessmentFrameworkShareRequest +StartAssessmentFrameworkShareResponse +StartAssessmentRequest +StartAssessmentResponse +StartAssessmentRunRequest +StartAssessmentRunResponse +StartAssetBundleExportJobRequest +StartAssetBundleExportJobResponse +StartAssetBundleImportJobRequest +StartAssetBundleImportJobResponse +StartAssociationsOnceRequest +StartAt +StartAttachmentUploadRequest +StartAttachmentUploadResponse +StartAuditMitigationActionsTaskRequest +StartAuditMitigationActionsTaskResponse +StartAutomationExecutionRequest +StartAutomationExecutionResult +StartAvailabilityMonitorTestInput +StartAvailabilityMonitorTestOutput +StartBackupJobInput +StartBackupJobOutput +StartBatchJobRequest +StartBatchJobResponse +StartBgpFailoverTestRequest +StartBgpFailoverTestResponse +StartBillingPeriod +StartBlueprintRunRequest +StartBlueprintRunResponse +StartBotRecommendationRequest +StartBotRecommendationResponse +StartBuildBatchInput +StartBuildBatchOutput +StartBuildInput +StartBuildOutput +StartBulkAssociateWirelessDeviceWithMulticastGroupRequest +StartBulkDeploymentRequest +StartBulkDeploymentResponse +StartBulkDisassociateWirelessDeviceFromMulticastGroupRequest +StartBy +StartCalculationExecutionRequest +StartCalculationExecutionResponse +StartCallAnalyticsJobRequest +StartCallAnalyticsJobResponse +StartCallAnalyticsStreamTranscriptionRequest +StartCallAnalyticsStreamTranscriptionResponse +StartCampaignRequest +StartCanaryRequest +StartCelebrityRecognitionRequest +StartCelebrityRecognitionResponse +StartChangeRequestExecutionRequest +StartChangeRequestExecutionResult +StartChangeSetRequest +StartChangeSetResponse +StartChannelRequest +StartChannelResponse +StartChatContactRequest +StartChatContactResponse +StartChildWorkflowExecutionDecisionAttributes +StartChildWorkflowExecutionFailedEventAttributes +StartChildWorkflowExecutionInitiatedEventAttributes +StartClockInput +StartCodegenJobData +StartCodegenJobRequest +StartCodegenJobResponse +StartColumn +StartColumnIndex +StartCommand +StartCondition +StartConfigRulesEvaluationRequest +StartConfigurationRecorderRequest +StartConfigurationSessionRequest +StartConfigurationSessionResponse +StartConnectionRequest +StartConnectionResponse +StartContactEvaluationRequest +StartContactEvaluationResponse +StartContactRecordingRequest +StartContactStreamingRequest +StartContactStreamingResponse +StartContentModerationRequest +StartContentModerationResponse +StartContentUploadRequest +StartContentUploadResponse +StartContinentCode +StartContinuousExportResponse +StartConversationRequest +StartConversationResponse +StartCopyJobInput +StartCopyJobOutput +StartCostEstimationRequest +StartCountryCode +StartCrawlerRequest +StartCrawlerScheduleRequest +StartCutoverRequest +StartCutoverResponse +StartDBClusterMessage +StartDBClusterResult +StartDBInstanceAutomatedBackupsReplicationMessage +StartDBInstanceAutomatedBackupsReplicationResult +StartDBInstanceMessage +StartDBInstanceResult +StartDICOMImportJobRequest +StartDICOMImportJobResponse +StartDashboardSnapshotJobRequest +StartDashboardSnapshotJobResponse +StartDataCollectionByAgentIdsRequest +StartDataCollectionByAgentIdsResponse +StartDataIngestionJobRequest +StartDataIngestionJobResponse +StartDataQualityRuleRecommendationRunRequest +StartDataQualityRuleRecommendationRunResponse +StartDataQualityRulesetEvaluationRunRequest +StartDataQualityRulesetEvaluationRunResponse +StartDataSourceSyncJobRequest +StartDataSourceSyncJobResponse +StartDate +StartDateTime +StartDeliveryStreamEncryptionInput +StartDeploymentRequest +StartDeploymentResponse +StartDeploymentResult +StartDetectMitigationActionsTaskRequest +StartDetectMitigationActionsTaskResponse +StartDetectorModelAnalysisRequest +StartDetectorModelAnalysisResponse +StartDevEnvironmentRequest +StartDevEnvironmentResponse +StartDevEnvironmentSessionRequest +StartDevEnvironmentSessionResponse +StartDeviceAuthorizationRequest +StartDeviceAuthorizationResponse +StartDeviceSyncRequest +StartDiscovererRequest +StartDiscovererResponse +StartDiscoveryJobRequest +StartDiscoveryJobResponse +StartDocumentAnalysisRequest +StartDocumentAnalysisResponse +StartDocumentClassificationJobRequest +StartDocumentClassificationJobResponse +StartDocumentTextDetectionRequest +StartDocumentTextDetectionResponse +StartDominantLanguageDetectionJobRequest +StartDominantLanguageDetectionJobResponse +StartEarthObservationJobInput +StartEarthObservationJobOutput +StartEdgeConfigurationUpdateInput +StartEdgeConfigurationUpdateOutput +StartEdgeDeploymentStageRequest +StartElasticsearchServiceSoftwareUpdateRequest +StartElasticsearchServiceSoftwareUpdateResponse +StartEngagementRequest +StartEngagementResult +StartEntitiesDetectionJobRequest +StartEntitiesDetectionJobResponse +StartEntitiesDetectionV2JobRequest +StartEntitiesDetectionV2JobResponse +StartError +StartEventDataStoreIngestionRequest +StartEventTime +StartEventsDetectionJobRequest +StartEventsDetectionJobResponse +StartExecutionInput +StartExecutionOutput +StartExpenseAnalysisRequest +StartExpenseAnalysisResponse +StartExperimentRequest +StartExperimentResponse +StartExportLabelsTaskRunRequest +StartExportLabelsTaskRunResponse +StartExportRequest +StartExportResponse +StartExportTaskMessage +StartExportTaskRequest +StartExportTaskResponse +StartExtensionPackAssociationMessage +StartExtensionPackAssociationResponse +StartFHIRExportJobRequest +StartFHIRExportJobResponse +StartFHIRImportJobRequest +StartFHIRImportJobResponse +StartFaceDetectionRequest +StartFaceDetectionResponse +StartFaceSearchRequest +StartFaceSearchResponse +StartFailbackLaunchRequest +StartFailbackLaunchResponse +StartFailed +StartFileTransferRequest +StartFileTransferResponse +StartFleetActionsInput +StartFleetActionsOutput +StartFleetRequest +StartFlowRequest +StartFlowResponse +StartFlywheelIterationRequest +StartFlywheelIterationResponse +StartFrameNumber +StartFraudsterRegistrationJobRequest +StartFraudsterRegistrationJobResponse +StartFromRow +StartFuotaTaskRequest +StartGUISessionRequest +StartGUISessionResult +StartGameSessionPlacementInput +StartGameSessionPlacementOutput +StartGatewayInput +StartGatewayOutput +StartGeneratedCodeJobRequest +StartGeneratedCodeJobResult +StartHour +StartHourOfDay +StartHumanLoopRequest +StartHumanLoopResponse +StartICD10CMInferenceJobRequest +StartICD10CMInferenceJobResponse +StartImageBuilderRequest +StartImageBuilderResult +StartImagePipelineExecutionRequest +StartImagePipelineExecutionResponse +StartImageScanRequest +StartImageScanResponse +StartImportFileTaskRequest +StartImportFileTaskResponse +StartImportLabelsTaskRunRequest +StartImportLabelsTaskRunResponse +StartImportRequest +StartImportResponse +StartImportTaskRequest +StartImportTaskResponse +StartIncidentInput +StartIncidentOutput +StartInferenceExperimentRequest +StartInferenceExperimentResponse +StartInferenceSchedulerRequest +StartInferenceSchedulerResponse +StartIngestion +StartIngestionRequest +StartInputDeviceMaintenanceWindowRequest +StartInputDeviceRequest +StartInstanceOnboardingJobRequest +StartInstanceOnboardingJobResponse +StartInstanceRefreshAnswer +StartInstanceRefreshType +StartInstanceRequest +StartInstanceResult +StartInstancesRequest +StartInstancesResult +StartJobRequest +StartJobResult +StartJobRunRequest +StartJobRunResponse +StartKeyPhrasesDetectionJobRequest +StartKeyPhrasesDetectionJobResponse +StartKeyUsageInput +StartKeyUsageOutput +StartLabelDetectionRequest +StartLabelDetectionResponse +StartLambdaFunctionFailedEventAttributes +StartLaunchRequest +StartLaunchResponse +StartLendingAnalysisRequest +StartLendingAnalysisResponse +StartLifecyclePolicyPreviewRequest +StartLifecyclePolicyPreviewResponse +StartLine +StartLoaderJobInput +StartLoaderJobOutput +StartLoggingRequest +StartLoggingTime +StartMLDataProcessingJobInput +StartMLDataProcessingJobOutput +StartMLEvaluationTaskRunRequest +StartMLEvaluationTaskRunResponse +StartMLLabelingSetGenerationTaskRunRequest +StartMLLabelingSetGenerationTaskRunResponse +StartMLModelTrainingJobInput +StartMLModelTrainingJobOutput +StartMLModelTransformJobInput +StartMLModelTransformJobOutput +StartMailboxExportJobRequest +StartMailboxExportJobResponse +StartMaintenanceRequest +StartMaintenanceResponse +StartMalwareScanRequest +StartMalwareScanResponse +StartMatchBackfillInput +StartMatchBackfillOutput +StartMatchingJobInput +StartMatchingJobOutput +StartMatchmakingInput +StartMatchmakingOutput +StartMedicalStreamTranscriptionRequest +StartMedicalStreamTranscriptionResponse +StartMedicalTranscriptionJobRequest +StartMedicalTranscriptionJobResponse +StartMeetingTranscriptionRequest +StartMessageMoveTaskRequest +StartMessageMoveTaskResult +StartMetadataModelAssessmentMessage +StartMetadataModelAssessmentResponse +StartMetadataModelConversionMessage +StartMetadataModelConversionResponse +StartMetadataModelExportAsScriptMessage +StartMetadataModelExportAsScriptResponse +StartMetadataModelExportToTargetMessage +StartMetadataModelExportToTargetResponse +StartMetadataModelImportMessage +StartMetadataModelImportResponse +StartMetricStreamsInput +StartMigrationMessage +StartMigrationRequest +StartMigrationResponse +StartMigrationWorkflowRequest +StartMigrationWorkflowResponse +StartMinuteOfHour +StartMode +StartModelPackagingJobRequest +StartModelPackagingJobResponse +StartModelRequest +StartModelResponse +StartMonitoringMemberRequest +StartMonitoringMembersRequest +StartMonitoringMembersResponse +StartMonitoringScheduleRequest +StartMulticastGroupSessionRequest +StartMultiplexRequest +StartMultiplexResponse +StartNetworkInsightsAccessScopeAnalysisRequest +StartNetworkInsightsAccessScopeAnalysisResult +StartNetworkInsightsAnalysisRequest +StartNetworkInsightsAnalysisResult +StartNetworkResourceUpdateRequest +StartNetworkResourceUpdateResponse +StartNextPendingJobExecutionRequest +StartNextPendingJobExecutionResponse +StartNotebookExecutionInput +StartNotebookExecutionOutput +StartNotebookInstanceInput +StartObjectInput +StartObjectOutput +StartOnCreation +StartOnDemandAppReplicationRequest +StartOnDemandAuditTaskRequest +StartOnDemandAuditTaskResponse +StartOnDemandReplicationRunRequest +StartOnDemandReplicationRunResponse +StartOrganizationServiceAccessUpdateRequest +StartOrganizationServiceAccessUpdateResponse +StartOutboundVoiceContactRequest +StartOutboundVoiceContactResponse +StartPHIDetectionJobRequest +StartPHIDetectionJobResponse +StartPercentage +StartPeriod +StartPersonTrackingRequest +StartPersonTrackingResponse +StartPiiEntitiesDetectionJobRequest +StartPiiEntitiesDetectionJobResponse +StartPipeRequest +StartPipeResponse +StartPipelineExecutionInput +StartPipelineExecutionOutput +StartPipelineExecutionRequest +StartPipelineExecutionResponse +StartPipelineReprocessingRequest +StartPipelineReprocessingResponse +StartPipelineRequest +StartPipelineResponse +StartPolicyGenerationRequest +StartPolicyGenerationResponse +StartPosition +StartProductSubscriptionRequest +StartProductSubscriptionResponse +StartProjectSessionRequest +StartProjectSessionResponse +StartProjectVersionRequest +StartProjectVersionResponse +StartProtectedQueryInput +StartProtectedQueryOutput +StartQueryExecutionInput +StartQueryExecutionOutput +StartQueryPlanningRequest +StartQueryPlanningResponse +StartQueryRequest +StartQueryResponse +StartReadSetActivationJobRequest +StartReadSetActivationJobResponse +StartReadSetActivationJobSourceItem +StartReadSetExportJobRequest +StartReadSetExportJobResponse +StartReadSetImportJobRequest +StartReadSetImportJobResponse +StartReadSetImportJobSourceItem +StartRecommendationReportGenerationRequest +StartRecommendationReportGenerationResponse +StartRecommendationsRequest +StartRecommendationsRequestEntry +StartRecommenderRequest +StartRecommenderResponse +StartRecordIdentifier +StartRecordName +StartRecordType +StartRecoveryRequest +StartRecoveryRequestSourceServer +StartRecoveryResponse +StartReferenceImportJobRequest +StartReferenceImportJobResponse +StartReferenceImportJobSourceItem +StartRelationalDatabaseRequest +StartRelationalDatabaseResult +StartRemediationExecutionRequest +StartRemediationExecutionResponse +StartReplayRequest +StartReplayResponse +StartReplicationMessage +StartReplicationRequest +StartReplicationResponse +StartReplicationTaskAssessmentMessage +StartReplicationTaskAssessmentResponse +StartReplicationTaskAssessmentRunMessage +StartReplicationTaskAssessmentRunResponse +StartReplicationTaskMessage +StartReplicationTaskResponse +StartReplicationTaskType +StartReplicationType +StartReportCreationInput +StartReportJobInput +StartReportJobOutput +StartRequest +StartResourceEvaluationRequest +StartResourceEvaluationResponse +StartResourceScanRequest +StartRestoreJobInput +StartRestoreJobOutput +StartRetrainingSchedulerRequest +StartRetrainingSchedulerResponse +StartRouteAnalysisRequest +StartRouteAnalysisResponse +StartRowIndex +StartRunRequest +StartRunResponse +StartRxNormInferenceJobRequest +StartRxNormInferenceJobResponse +StartSNOMEDCTInferenceJobRequest +StartSNOMEDCTInferenceJobResponse +StartSavingsPlansPurchaseRecommendationGenerationResponse +StartSchemaCreationRequest +StartSchemaCreationResponse +StartSchemaExtensionRequest +StartSchemaExtensionResult +StartSchemaMergeRequest +StartSchemaMergeResponse +StartSegmentDetectionFilters +StartSegmentDetectionRequest +StartSegmentDetectionResponse +StartSelector +StartSelectorType +StartSentimentDetectionJobRequest +StartSentimentDetectionJobResponse +StartServerRequest +StartServiceSoftwareUpdateRequest +StartServiceSoftwareUpdateResponse +StartSession +StartSessionRequest +StartSessionResponse +StartSessionResult +StartShotDetectionFilter +StartSigningJobParameter +StartSigningJobRequest +StartSigningJobResponse +StartSimulationInput +StartSimulationJobBatchRequest +StartSimulationJobBatchResponse +StartSimulationOutput +StartSingleWirelessDeviceImportTaskRequest +StartSingleWirelessDeviceImportTaskResponse +StartSmartHomeApplianceDiscoveryRequest +StartSnapshotRequest +StartSnapshotResponse +StartSourceNetworkRecoveryRequest +StartSourceNetworkRecoveryRequestNetworkEntry +StartSourceNetworkRecoveryResponse +StartSourceNetworkReplicationRequest +StartSourceNetworkReplicationResponse +StartSpeakerEnrollmentJobRequest +StartSpeakerEnrollmentJobResponse +StartSpeakerSearchTaskRequest +StartSpeakerSearchTaskResponse +StartSpeechSynthesisTaskInput +StartSpeechSynthesisTaskOutput +StartStackRequest +StartStageDeploymentRequest +StartStageDeploymentResult +StartStreamEncryptionInput +StartStreamProcessorRequest +StartStreamProcessorResponse +StartStreamTranscriptionRequest +StartStreamTranscriptionResponse +StartStreamingSessionRequest +StartStreamingSessionResponse +StartStudioSSOConfigurationRepairRequest +StartStudioSSOConfigurationRepairResponse +StartSubdivisionCode +StartSuiteRunRequest +StartSuiteRunResponse +StartSupportDataExportRequest +StartSupportDataExportResult +StartSyncExecutionInput +StartSyncExecutionOutput +StartTableDataImportJobRequest +StartTableDataImportJobResult +StartTargetedSentimentDetectionJobRequest +StartTargetedSentimentDetectionJobResponse +StartTaskContactRequest +StartTaskContactResponse +StartTaskExecutionRequest +StartTaskExecutionResponse +StartTaskRequest +StartTaskResponse +StartTechnicalCueDetectionFilter +StartTestExecutionRequest +StartTestExecutionResponse +StartTestRequest +StartTestResponse +StartTestSetGenerationRequest +StartTestSetGenerationResponse +StartTextDetectionFilters +StartTextDetectionRequest +StartTextDetectionResponse +StartTextTranslationJobRequest +StartTextTranslationJobResponse +StartThingRegistrationTaskRequest +StartThingRegistrationTaskResponse +StartTime +StartTimeFilter +StartTimeInclusive +StartTimeMillis +StartTimeOffset +StartTimeRange +StartTimecode +StartTimecodeSMPTE +StartTimeout +StartTimerDecisionAttributes +StartTimerFailedEventAttributes +StartTimestamp +StartTimestampMillis +StartTopicsDetectionJobRequest +StartTopicsDetectionJobResponse +StartTransaction +StartTransactionRequest +StartTransactionResponse +StartTransactionResult +StartTranscriptionJobRequest +StartTranscriptionJobResponse +StartTriggerRequest +StartTriggerResponse +StartUrl +StartUserAccessTasksRequest +StartUserAccessTasksResponse +StartUserImportJobRequest +StartUserImportJobResponse +StartValue +StartVariantImportRequest +StartVariantImportResponse +StartVectorEnrichmentJobInput +StartVectorEnrichmentJobOutput +StartViewerSessionRevocationRequest +StartVirtualMachinesMetadataSyncInput +StartVirtualMachinesMetadataSyncOutput +StartVoiceToneAnalysisTaskRequest +StartVoiceToneAnalysisTaskResponse +StartVpcEndpointServicePrivateDnsVerificationRequest +StartVpcEndpointServicePrivateDnsVerificationResult +StartWeekDay +StartWindowMinutes +StartWirelessDeviceImportTaskRequest +StartWirelessDeviceImportTaskResponse +StartWorkflowExecutionInput +StartWorkflowRunRequest +StartWorkflowRunResponse +StartWorkspaceRequests +StartWorkspacesRequest +StartWorkspacesResult +StartZonalShiftRequest +Started +StartedAfter +StartedAt +StartedBefore +StartedBy +StartedOn +StartedTimestamp +StartingAt +StartingBlockIndex +StartingEventBatchCondition +StartingHashKey +StartingInstances +StartingObjectName +StartingObjectPrefix +StartingOffsets +StartingPosition +StartingPositionTimestamp +StartingSequenceNumber +StartingTimestamp +StartoverWindowSeconds +StartsWith +StartupAction +StartupScriptS3ObjectVersion +StartupScriptS3Path +Stat +State +StateChangeConfiguration +StateChangeReason +StateDB +StateDescription +StateEnteredEventDetails +StateEquals +StateExitedEventDetails +StateFilter +StateInfo +StateLastUpdatedDateTime +StateMachineAliasListItem +StateMachineAlreadyExists +StateMachineArn +StateMachineDeleting +StateMachineDoesNotExist +StateMachineLimitExceeded +StateMachineListItem +StateMachineTypeNotSupported +StateMachineVersionListItem +StateMessage +StateOrProvince +StateOrRegion +StatePersistence +StatePersistenceConfigurations +StatePersistenceEnabled +StateReason +StateReasonCode +StateReasonData +StateStartTimestamp +StateTransitionReason +StateTransitionTime +StateTransitionedTimestamp +StateUpdatedTimestamp +StateValue +StatefulDefaultActions +StatefulEngineOptions +StatefulRule +StatefulRuleGroup +StatefulRuleGroupOverride +StatefulRuleGroupReference +StatefulRuleGroupReferences +StatefulRuleGroups +StatefulRuleOptions +StatefulRules +StatelessCustomActionDefinition +StatelessCustomActions +StatelessCustomPublishMetricAction +StatelessCustomPublishMetricActionDimension +StatelessDefaultActions +StatelessFragmentDefaultActions +StatelessRule +StatelessRuleGroup +StatelessRuleGroupReference +StatelessRuleGroupReferences +StatelessRuleGroups +StatelessRules +StatelessRulesAndCustomActions +Statement +StatementData +StatementId +StatementName +StatementOutput +StatementOutputData +StatementTimeoutException +StatementType +Statements +States +StatesArn +StatesExecutionArn +StatesInput +StatesStatus +StaticColumn +StaticConfiguration +StaticHyperParameters +StaticImageActivateScheduleActionSettings +StaticImageActivateSettings +StaticImageDeactivateScheduleActionSettings +StaticImageDeactivateSettings +StaticIp +StaticIpConnectionInfo +StaticKeyProvider +StaticKeySettings +StaticKeyValue +StaticMembers +StaticPolicyDefinition +StaticPolicyDefinitionDetail +StaticPolicyDefinitionItem +StaticRoutesOnly +StaticSourcesSupport +StaticValue +StaticValues +Station +Statistic +StatisticOverride +StatisticSet +StatisticValues +StatisticalThreshold +Statistics +StatisticsConfiguration +StatisticsConfigurations +StatisticsData +StatisticsNotAvailableException +StatisticsNotReadyYetException +StatisticsResource +StatisticsSummary +StatisticsType +StatmuxSettings +Stats +StatsAtAnomaly +StatsAtBaseline +StatsEvent +Status +Status2xx +Status3xx +Status4xx +Status5xx +StatusArn +StatusChangeDate +StatusCode +StatusCodes +StatusDescription +StatusDetail +StatusDetailFilters +StatusDetails +StatusEquals +StatusFilter +StatusFlag +StatusInformation +StatusInfos +StatusLastUpdatedDateTime +StatusList +StatusMessage +StatusMessageCode +StatusName +StatusReason +StatusReasonCode +StatusReasons +StatusReport +StatusStartTime +StatusStartTimestamp +StatusType +StatusUpdateInterval +StatusUpdateReason +Statuses +StdDev +StdErrorS3Uri +StdEvent +StdOutS3Uri +Stddev +StemmingDictionary +Step +StepAdjustment +StepAdjustments +StepAutomationConfiguration +StepCancellationOption +StepConcurrencyLevel +StepConfig +StepCount +StepDescription +StepDetail +StepDetails +StepDisplayName +StepExecution +StepExecutionFilter +StepExecutionId +StepExecutionStatusDetail +StepExecutions +StepExecutionsTruncated +StepFunctionStateMachineParameters +StepFunctions +StepFunctionsAction +StepId +StepIds +StepIndex +StepInfo +StepName +StepOutput +StepScalingPolicyConfiguration +StepSize +StepStateChangeReason +StepStates +StepStatus +StepSummary +StepTimeline +StepType +Steps +StepsCompleted +StepsList +StereoDownmix +StillContainsLinksException +StillEstimating +StillWaitingResponseSpecification +StopAccessLoggingInput +StopAction +StopActivityStreamRequest +StopActivityStreamResponse +StopAppBlockBuilderRequest +StopAppBlockBuilderResult +StopAppInput +StopAppReplicationRequest +StopApplicationRequest +StopAssessmentRequest +StopAssessmentRunRequest +StopAutoMLJobRequest +StopAutomationExecutionRequest +StopBackupJobInput +StopBgpFailoverTestRequest +StopBgpFailoverTestResponse +StopBotRecommendationRequest +StopBotRecommendationResponse +StopBuildBatchInput +StopBuildBatchOutput +StopBuildInput +StopBuildOutput +StopBulkDeploymentRequest +StopCalculationExecutionRequest +StopCalculationExecutionResponse +StopCampaignRequest +StopCanaryRequest +StopChannelRequest +StopChannelResponse +StopClockInput +StopCompilationJobRequest +StopConfigurationRecorderRequest +StopContactRecordingRequest +StopContactRequest +StopContactStreamingRequest +StopContinuousExportRequest +StopContinuousExportResponse +StopCrawlerRequest +StopCrawlerScheduleRequest +StopDBClusterMessage +StopDBClusterResult +StopDBInstanceAutomatedBackupsReplicationMessage +StopDBInstanceAutomatedBackupsReplicationResult +StopDBInstanceMessage +StopDBInstanceResult +StopDataCollectionByAgentIdsRequest +StopDataCollectionByAgentIdsResponse +StopDataSourceSyncJobRequest +StopDate +StopDeliveryStreamEncryptionInput +StopDeploymentInput +StopDeploymentOutput +StopDeploymentRequest +StopDevEnvironmentRequest +StopDevEnvironmentResponse +StopDevEnvironmentSessionRequest +StopDevEnvironmentSessionResponse +StopDiscovererRequest +StopDiscovererResponse +StopDiscoveryJobRequest +StopDominantLanguageDetectionJobRequest +StopDominantLanguageDetectionJobResponse +StopEarthObservationJobInput +StopEdgeDeploymentStageRequest +StopEdgePackagingJobRequest +StopEngagementRequest +StopEntitiesDetectionJobRequest +StopEntitiesDetectionJobResponse +StopEntitiesDetectionV2JobRequest +StopEntitiesDetectionV2JobResponse +StopEventDataStoreIngestionRequest +StopEventsDetectionJobRequest +StopEventsDetectionJobResponse +StopExecutionInput +StopExecutionOutput +StopExecutionTrigger +StopExperimentRequest +StopExperimentResponse +StopFailbackRequest +StopFailed +StopFleetActionsInput +StopFleetActionsOutput +StopFleetRequest +StopFlowRequest +StopFlowResponse +StopGUISessionRequest +StopGUISessionResult +StopGameSessionPlacementInput +StopGameSessionPlacementOutput +StopHumanLoopRequest +StopHyperParameterTuningJobRequest +StopICD10CMInferenceJobRequest +StopICD10CMInferenceJobResponse +StopImageBuilderRequest +StopImageBuilderResult +StopImportRequest +StopImportResponse +StopInferenceExperimentRequest +StopInferenceExperimentResponse +StopInferenceRecommendationsJobRequest +StopInferenceSchedulerRequest +StopInferenceSchedulerResponse +StopIngestionRequest +StopInputDeviceRequest +StopInstanceOnIdleRequest +StopInstanceRequest +StopInstanceResult +StopInstancesRequest +StopInstancesResult +StopJobOnFailureOptions +StopJobOnFailureTiming +StopJobRequest +StopJobResult +StopJobRunRequest +StopJobRunResponse +StopKeyPhrasesDetectionJobRequest +StopKeyPhrasesDetectionJobResponse +StopKeyUsageInput +StopKeyUsageOutput +StopLabelingJobRequest +StopLaunchRequest +StopLaunchResponse +StopLoggingRequest +StopLoggingTime +StopMatchmakingInput +StopMeetingTranscriptionRequest +StopMetricStreamsInput +StopMigrationWorkflowRequest +StopMigrationWorkflowResponse +StopModelCustomizationJobRequest +StopModelRequest +StopModelResponse +StopMonitoringMembersRequest +StopMonitoringMembersResponse +StopMonitoringScheduleRequest +StopMultiplexRequest +StopMultiplexResponse +StopNotebookExecutionInput +StopNotebookInstanceInput +StopPHIDetectionJobRequest +StopPHIDetectionJobResponse +StopPiiEntitiesDetectionJobRequest +StopPiiEntitiesDetectionJobResponse +StopPipeRequest +StopPipeResponse +StopPipelineExecutionInput +StopPipelineExecutionOutput +StopPipelineExecutionRequest +StopPipelineExecutionResponse +StopPipelineRequest +StopPipelineResponse +StopProcessingJobRequest +StopProductSubscriptionRequest +StopProductSubscriptionResponse +StopProjectVersionRequest +StopProjectVersionResponse +StopQueryExecutionInput +StopQueryRequest +StopQueryResponse +StopReason +StopRecommenderRequest +StopRecommenderResponse +StopRelationalDatabaseRequest +StopRelationalDatabaseResult +StopRemoteAccessSessionRequest +StopRemoteAccessSessionResult +StopReplicationMessage +StopReplicationRequest +StopReplicationResponse +StopReplicationTaskMessage +StopReplicationTaskResponse +StopReplicationToReplicaRequest +StopReplicationToReplicaResponse +StopRequest +StopResourceRequest +StopRetrainingSchedulerRequest +StopRetrainingSchedulerResponse +StopRunRequest +StopRunResult +StopRxNormInferenceJobRequest +StopRxNormInferenceJobResponse +StopSNOMEDCTInferenceJobRequest +StopSNOMEDCTInferenceJobResponse +StopSelector +StopSentimentDetectionJobRequest +StopSentimentDetectionJobResponse +StopServerRequest +StopSessionRequest +StopSessionResponse +StopSimulationInput +StopSolutionVersionCreationRequest +StopSourceNetworkReplicationRequest +StopSourceNetworkReplicationResponse +StopSpeakerSearchTaskRequest +StopStackRequest +StopStackSetOperationInput +StopStreamEncryptionInput +StopStreamProcessorRequest +StopStreamRequest +StopStreamingSessionRequest +StopStreamingSessionResponse +StopSuiteRunRequest +StopTargetedSentimentDetectionJobRequest +StopTargetedSentimentDetectionJobResponse +StopTaskRequest +StopTaskResponse +StopTextTranslationJobRequest +StopTextTranslationJobResponse +StopThingRegistrationTaskRequest +StopTime +StopTimecode +StopTimeout +StopTimestamp +StopTrainingDocumentClassifierRequest +StopTrainingEntityRecognizerRequest +StopTrainingJobRequest +StopTransformJobRequest +StopTriggerRequest +StopTriggerResponse +StopUserImportJobRequest +StopUserImportJobResponse +StopVectorEnrichmentJobInput +StopVoiceToneAnalysisTaskRequest +StopWorkflowRunRequest +StopWorkspaceRequests +StopWorkspacesRequest +StopWorkspacesResult +Stopped +StoppedActions +StoppedSince +Stopping +StoppingCondition +StoppingConditions +StoppingInstances +Stops +Stopwords +Storage +StorageAllocatedInBytes +StorageCapacity +StorageCapacityQuotaGiB +StorageCapacityReservationGiB +StorageCapacityUnits +StorageClass +StorageClassAnalysis +StorageClassAnalysisDataExport +StorageConfig +StorageConfigs +StorageConfiguration +StorageConnector +StorageConnectors +StorageDescriptor +StorageEfficiencyEnabled +StorageEncrypted +StorageGB +StorageGatewayError +StorageInfo +StorageIops +StorageJobId +StorageLensArn +StorageLensAwsOrg +StorageLensConfiguration +StorageLensConfigurationList +StorageLensDataExport +StorageLensDataExportEncryption +StorageLensTag +StorageLimit +StorageLimitExceededException +StorageLimitWillExceedException +StorageLocation +StorageMetrics +StorageMode +StorageOptimizer +StorageOptimizerConfig +StorageOptimizerList +StorageOptimizerType +StorageQuotaExceededFault +StorageResolution +StorageRule +StorageRuleType +StorageSize +StorageSubTypeName +StorageSystemArn +StorageSystemListEntry +StorageSystems +StorageThroughput +StorageThroughputToIopsRatio +StorageTier +StorageType +StorageTypeLimit +StorageTypeLimits +StorageTypeName +StorageTypeNotAvailableFault +StorageTypeNotSupportedFault +StorageTypes +StorageUnit +StorageUtilizedInBytes +StorageVirtualMachine +StorageVirtualMachineArn +StorageVirtualMachineFilter +StorageVirtualMachineId +StorageVirtualMachineIds +StorageVirtualMachineNotFound +StorageVirtualMachineRoot +StorageVirtualMachines +StorageVolumeType +StoreImageTaskResult +StoreImageTaskResults +StoreTaskFailureReason +StoreTaskState +StoredAsSubDirectories +StoredQuery +StoredQueryMetadata +StorediSCSIVolume +StorediSCSIVolumes +Strategy +StrategyConfig +StrategyOnFullSize +StrategyOption +StrategySummary +Stream +StreamARN +StreamArn +StreamChannelDefinition +StreamConfiguration +StreamConfigurationCreate +StreamConfigurationSessionBackup +StreamConfigurationSessionStorage +StreamCreationTimestamp +StreamDescription +StreamDescriptionSummary +StreamEdgeConfigurationNotFoundException +StreamEnabled +StreamEncryption +StreamEvent +StreamExceptionPolicy +StreamFile +StreamFilters +StreamId +StreamInfResolution +StreamInfo +StreamInfoList +StreamJournalToKinesisRequest +StreamJournalToKinesisResponse +StreamKey +StreamKeySummary +StreamLabel +StreamManifestBehavior +StreamMode +StreamModeDetails +StreamName +StreamNameCondition +StreamNames +StreamOrder +StreamProcessingStartSelector +StreamProcessingStopSelector +StreamProcessor +StreamProcessorArn +StreamProcessorDataSharingPreference +StreamProcessorInput +StreamProcessorNotificationChannel +StreamProcessorOutput +StreamProcessorSettings +StreamProcessorSettingsForUpdate +StreamProcessors +StreamRecord +StreamRecordsNotFoundException +StreamSelection +StreamSession +StreamSessionSummary +StreamSpecification +StreamStatus +StreamSummaries +StreamSummary +StreamType +StreamUnavailable +StreamUrl +StreamView +StreamViewType +StreamingConfiguration +StreamingConfigurations +StreamingDataPreviewOptions +StreamingDistribution +StreamingDistributionAlreadyExists +StreamingDistributionConfig +StreamingDistributionConfigWithTags +StreamingDistributionList +StreamingDistributionNotDisabled +StreamingDistributionSummary +StreamingEndpointArn +StreamingExperienceSettings +StreamingId +StreamingImage +StreamingImageEncryptionConfiguration +StreamingLoggingConfig +StreamingNotificationTarget +StreamingNotificationTargets +StreamingOptions +StreamingSession +StreamingSessionBackup +StreamingSessionStorageRoot +StreamingSessionStream +StreamingStatus +StreamingURL +Streams +Street +Street1 +Street2 +Street3 +StreetAddress +StreetInfo +StreetNumber +Strength +StrictTransportSecurity +StringAttributeConstraints +StringAttributeConstraintsType +StringColumnStatisticsData +StringCondition +StringDatasetParameter +StringDatasetParameterDefaultValues +StringDefaultValues +StringEquals +StringFilter +StringFormatConfiguration +StringLike +StringListValue +StringListValues +StringNotEquals +StringNotLike +StringParameter +StringParameterDeclaration +StringParameters +StringReference +StringStaticValues +StringValue +StringValueList +StringValueWhenUnsetConfiguration +StringValues +StripeSizeBytes +StrongKeyProtectionRequired +StructValue +StructuredLogDestinations +Studio +StudioArn +StudioComponent +StudioComponentInitializationScript +StudioComponentSummary +StudioEncryptionConfiguration +StudioId +StudioLifecycleConfigAppType +StudioLifecycleConfigArn +StudioLifecycleConfigContent +StudioLifecycleConfigDetails +StudioLifecycleConfigName +StudioLifecycleConfigs +StudioMembership +StudioSummary +Studios +Style +StyleConfiguration +StyleControl +StyleOptions +StylePassthrough +StyleTargets +SubBands +SubChannelId +SubChannelSummary +SubChannels +SubDomain +SubDomainSetting +SubErrorCode +SubErrorCodeReason +SubExpressions +SubJobMetadata +SubModule +SubRegion +SubResourceSummary +SubResources +SubSegmentNum +SubSegmentsExpected +SubSlotSetting +SubSlotTypeComposition +SubSlotValueElicitationSetting +SubStages +SubStatementData +SubStatements +SubType +SubTypeCountLimitExceededException +SubTypeName +Subdirectory +Subdivision +SubdivisionCode +SubdivisionName +SubgopLength +Subject +SubjectAlternativeNameMatchers +SubjectAlternativeNameSummaries +SubjectAlternativeNames +SubjectDetail +SubjectDetailResponse +SubjectFromWebIdentityToken +SubjectId +SubjectInformationAccess +SubjectKey +SubjectNameFlags +SubjectNameFlagsV2 +SubjectNameFlagsV3 +SubjectNameFlagsV4 +SubjectPart +SubjectStructure +SubjectSummary +SubjectType +SubmissionDateTime +SubmitAttachmentStateChangesRequest +SubmitAttachmentStateChangesResponse +SubmitContactEvaluationRequest +SubmitContactEvaluationResponse +SubmitContainerStateChangeRequest +SubmitContainerStateChangeResponse +SubmitFeedbackRequest +SubmitJobRequest +SubmitJobResponse +SubmitMultiRegionAccessPointRoutesRequest +SubmitTaskStateChangeRequest +SubmitTaskStateChangeResponse +SubmitTime +SubmitTimeAfter +SubmitTimeBefore +SubmitTimeMillis +SubmittedAfter +SubmittedAfterTime +SubmittedAt +SubmittedBefore +SubmittedBeforeTime +SubmittedDate +SubmittedJobsCount +SubmittedSince +SubmittedTime +Subnet +SubnetAlreadyInUse +SubnetArn +SubnetArns +SubnetAssociation +SubnetAvailabilityZone +SubnetAvailabilityZoneId +SubnetChangeProtection +SubnetCidrBlockState +SubnetCidrReservation +SubnetCidrReservationId +SubnetConfiguration +SubnetConfigurations +SubnetGroup +SubnetGroupAlreadyExistsFault +SubnetGroupIdentifier +SubnetGroupInUseFault +SubnetGroupName +SubnetGroupNames +SubnetGroupNotFoundFault +SubnetGroupQuotaExceededFault +SubnetGroupStatus +SubnetGroups +SubnetIPAddressLimitReachedException +SubnetId +SubnetIdList +SubnetIdUpdates +SubnetIdentifier +SubnetIds +SubnetInUse +SubnetIpv4CidrReservations +SubnetIpv6CidrBlockAssociation +SubnetIpv6CidrReservations +SubnetMapping +SubnetMappings +SubnetMask +SubnetNotAllowedFault +SubnetNotFound +SubnetNotFoundException +SubnetOfMatches +SubnetOutpost +SubnetOutpostArn +SubnetQuotaExceededFault +SubnetRouteTable +SubnetStatus +Subnets +SubscribeInput +SubscribePattern +SubscribeRequest +SubscribeResponse +SubscribeResult +SubscribeToDatasetRequest +SubscribeToEventRequest +SubscribeToShardEvent +SubscribeToShardInput +SubscribeToShardOutput +SubscribedAt +SubscribedDomain +SubscribedDomains +SubscribedRuleGroupSummary +SubscribedWorkteam +SubscribedWorkteams +Subscriber +SubscriberResource +Subscribers +Subscription +SubscriptionAlreadyExistFault +SubscriptionArn +SubscriptionArnList +SubscriptionCategoryNotFoundFault +SubscriptionCreatedDateTime +SubscriptionCreationTime +SubscriptionDefinitionId +SubscriptionDefinitionVersion +SubscriptionDefinitionVersionArn +SubscriptionDefinitionVersionId +SubscriptionEndDate +SubscriptionErrors +SubscriptionEventIdNotFoundFault +SubscriptionExpiryDate +SubscriptionFilter +SubscriptionId +SubscriptionLimitExceededException +SubscriptionLimits +SubscriptionName +SubscriptionNotFoundFault +SubscriptionSeverityNotFoundFault +SubscriptionStartDate +SubscriptionState +SubscriptionStatus +SubscriptionType +Subscriptions +SubstatementType +SubstitutionMap +Substitutions +Substring +SubsystemId +SubsystemVendorId +Subtitle +SubtitleFileUris +Subtitles +SubtitlesOutput +SubtitlingType +SubtotalOptions +Subtype +Succeeded +SucceededActions +SucceededCount +Success +SuccessCodes +SuccessCount +SuccessForeground +SuccessRedirectionURL +SuccessResponseHandlingConfig +SuccessRetentionPeriodInDays +SuccessSteps +SuccessStrings +SuccessTopic +SuccessValues +Successes +Successful +SuccessfulCampaignStateResponse +SuccessfulEndpointCount +SuccessfulFleetCancellations +SuccessfulFleetDeletions +SuccessfulFleetRequests +SuccessfulInstanceCreditSpecificationItem +SuccessfulInstanceCreditSpecifications +SuccessfulLoginAttempts +SuccessfulPackageVersionInfo +SuccessfulQueuedPurchaseDeletion +SuccessfulQueuedPurchaseDeletions +SuccessfulRequest +SuccessfulResponse +SuccessfulShares +SuccessfulSubmissions +SuccessfullyAssociatedResources +SuccessfullyDeletedLaunchTemplateVersions +SuccessfullyDisassociatedResources +Suffix +SuggestModel +SuggestRequest +SuggestResponse +SuggestStatus +Suggestable +SuggestableConfig +SuggestableConfigList +SuggestedAccounts +SuggestedFix +SuggestedPresentationDelaySeconds +SuggestedQueryText +Suggester +SuggesterName +SuggesterNames +SuggesterStatus +Suggesters +Suggestion +SuggestionAttributes +SuggestionCount +SuggestionHighlight +SuggestionMatch +SuggestionQuery +SuggestionTextWithHighlights +SuggestionTypes +SuggestionValue +Suggestions +SuggestionsList +Suite +SuiteDefinitionConfiguration +SuiteDefinitionInformation +SuiteRunConfiguration +SuiteRunInformation +Sum +SumByAccount +SumByDataSource +SumByFeature +SumByResource +Summaries +SummarizationAttributes +SummarizedAttackVector +SummarizedCounter +Summary +SummaryFields +SummaryItems +SummaryList +SummaryMap +SummaryStatistics +Sunday +Sunglasses +SupernetOfMatches +SupersededTemplates +SuperuserParameters +SupplementalCategories +SupplementalImps +SupplementalSettings +SupplementaryFeature +SupplementaryFeatures +SupportDescription +SupportEmail +SupportLevel +SupportLink +SupportLowFramerateInputs +SupportUrl +Supported +SupportedActivityStreamModes +SupportedAddonList +SupportedArchitectures +SupportedBootModes +SupportedCACertificateIdentifiers +SupportedCharacterSets +SupportedCompressionTypes +SupportedContentTypes +SupportedDPUSizes +SupportedDeploymentModes +SupportedEndpointType +SupportedEndpointTypes +SupportedEngineModes +SupportedEngineVersions +SupportedEngines +SupportedFeatureNames +SupportedFeatures +SupportedFieldTypeDetails +SupportedFilters +SupportedGatewayCapacities +SupportedHardwareType +SupportedHour +SupportedHyperParameters +SupportedIdentityProviders +SupportedInputModes +SupportedInstanceType +SupportedInstanceTypes +SupportedIpAddressTypes +SupportedLanguage +SupportedLicenses +SupportedLoadBalancerTypes +SupportedLoginProviders +SupportedMajorVersions +SupportedMessagingContentTypes +SupportedNcharCharacterSets +SupportedNetworkTypes +SupportedOperation +SupportedOperations +SupportedPermissionTypes +SupportedPhoneNumberTypes +SupportedPlatform +SupportedPlatforms +SupportedProductConfig +SupportedProducts +SupportedRealtimeInferenceInstanceTypes +SupportedResourceType +SupportedResponseMIMETypes +SupportedRootDeviceTypes +SupportedStorage +SupportedStorageFilter +SupportedStrategies +SupportedTierList +SupportedTimezones +SupportedTrainingInstanceTypes +SupportedTransformInstanceTypes +SupportedTuningJobObjectiveMetrics +SupportedUplinkGbps +SupportedUsageClasses +SupportedVersions +SupportedVirtualizationTypes +SupportingAccessPoint +SupportingInsights +Supports32BitFCnt +SupportsBabelfish +SupportsCDC +SupportsCertificateRotationWithoutRestart +SupportsClassB +SupportsClassC +SupportsClusters +SupportsDBInstanceAutomatedBackupsReplication +SupportsDistributedTraining +SupportsEnhancedMonitoring +SupportsGlobalDatabases +SupportsIAMDatabaseAuthentication +SupportsIops +SupportsJoin +SupportsKerberosAuthentication +SupportsLinking +SupportsLocalWriteForwarding +SupportsLogExportsToCloudwatchLogs +SupportsOptionVersionDowngrade +SupportsParallelQuery +SupportsPerformanceInsights +SupportsReadReplica +SupportsStorageAutoscaling +SupportsStorageEncryption +SupportsStorageThroughput +SuppressDataIdentifier +SuppressedDestination +SuppressedDestinationAttributes +SuppressedDestinationSummaries +SuppressedDestinationSummary +SuppressedLinesOfCodeCount +SuppressedReasons +SuppressionAttributes +SuppressionListDestination +SuppressionListImportAction +SuppressionOptions +Surname +SurroundExMode +SurroundMode +SurroundTrim +SuspendActions +SuspendContactRecordingRequest +SuspendGameServerGroupInput +SuspendGameServerGroupOutput +SuspendedActions +SuspendedCause +SuspendedDate +SuspendedProcess +SuspendedProcesses +SuspendedState +SuspensionReason +SustainedClockSpeedInGhz +SvmActiveDirectoryConfiguration +SvmAdminPassword +SvmEndpoint +SvmEndpoints +SvmName +SvmUuid +SwapEnvironmentCNAMEsMessage +Swappiness +SwitchRunningMode +Switchover +SwitchoverBlueGreenDeploymentRequest +SwitchoverBlueGreenDeploymentResponse +SwitchoverDetail +SwitchoverDetails +SwitchoverGlobalClusterMessage +SwitchoverGlobalClusterResult +SwitchoverReadReplicaMessage +SwitchoverReadReplicaResult +SwitchoverTimeout +SybaseSettings +Symbol +SymbolicLink +SymmetricEncryptionAttributes +SyncBlocker +SyncBlockerContext +SyncCompliance +SyncConfig +SyncCount +SyncCreatedTime +SyncDeploymentJobRequest +SyncDeploymentJobResponse +SyncFormat +SyncJobStatus +SyncJobSummary +SyncLastModifiedTime +SyncName +SyncResourceRequest +SyncResourceResponse +SyncResourceStatus +SyncResourceSummary +SyncSessionToken +SyncSessionsCount +SyncShadow +SyncSource +SyncState +SyncStates +SyncStatus +SyncThreshold +SyncType +SynchronizationStatus +SynonymRuleCount +Synonyms +Syntax +SyntaxToken +SyntaxTokens +SynthesisTask +SynthesisTaskNotFoundException +SynthesisTasks +SynthesizeSpeechInput +SynthesizeSpeechOutput +SyslogIp +System +SystemControl +SystemControls +SystemEvent +SystemId +SystemIds +SystemInfo +SystemInstanceDescription +SystemInstanceFilter +SystemInstanceSummary +SystemResourceLimits +SystemStatus +SystemSuggestedValue +SystemTemplateDescription +SystemTemplateFilter +SystemTemplateSummary +SystemType +SystemsManagerAgent +TCPFlagField +TCPFlags +TERMINATING +TFIMetricDataPoint +TFIModelPerformance +TFITrainingMetricsValue +TGWOnDeviceService +TGWOnDeviceServiceConfiguration +TLDRulesViolation +TLEData +TLEEphemeris +TLSEnabled +TLSInspectionConfiguration +TLSInspectionConfigurationArn +TLSInspectionConfigurationId +TLSInspectionConfigurationMetadata +TLSInspectionConfigurationName +TLSInspectionConfigurationResponse +TLSInspectionConfigurationStatus +TLSInspectionConfigurations +TLSSecurityPolicy +TTL +Table +TableAggregatedFieldWells +TableAlreadyExistsException +TableArn +TableAutoScalingDescription +TableBorderOptions +TableCatalogId +TableCell +TableCellConditionalFormatting +TableCellImageScalingConfiguration +TableCellImageSizingConfiguration +TableCellStyle +TableClass +TableClassOverride +TableClassSummary +TableColumn +TableConditionalFormatting +TableConditionalFormattingOption +TableConfiguration +TableCount +TableCreationDateTime +TableCreationParameters +TableData +TableDataImportJobMetadata +TableDescription +TableError +TableExcerpt +TableFieldCustomIconContent +TableFieldCustomTextContent +TableFieldImageConfiguration +TableFieldLinkConfiguration +TableFieldLinkContentConfiguration +TableFieldOption +TableFieldOptions +TableFieldURLConfiguration +TableFieldWells +TableFormat +TableId +TableIdentifier +TableInUseException +TableInlineVisualization +TableInlineVisualizations +TableInput +TableLFTagPolicy +TableLFTagPolicyAndPermissions +TableLimitExceededFault +TableList +TableLocation +TableMappings +TableMaxReadCapacityUnits +TableMaxWriteCapacityUnits +TableMember +TableMetadata +TableMetadataList +TableName +TableNameUpdate +TableNames +TableNotFoundException +TableObject +TableOptions +TablePaginatedReportOptions +TablePattern +TablePinnedFieldOptions +TablePrefix +TableResource +TableRestoreNotFoundFault +TableRestoreRequestId +TableRestoreStatus +TableRestoreStatusDetails +TableRestoreStatusMessage +TableRow +TableRowConditionalFormatting +TableSchema +TableSideBorderOptions +TableSizeBytes +TableSortConfiguration +TableState +TableStatistics +TableStatus +TableStyleTarget +TableSummary +TableToReload +TableType +TableUnaggregatedFieldWells +TableVersion +TableVersionError +TableVersions +TableVisual +TableWildcard +TableWithColumns +TableWithColumnsResource +Tables +TablesCreated +TablesDeleted +TablesErrored +TablesLoaded +TablesLoading +TablesQueued +TablesToDelete +TablesToReload +TablesUpdated +TabularConditions +TabularJobConfig +TabularResolvedAttributes +Tac +Tag +TagAttendeeRequest +TagCertificateAuthorityRequest +TagCollection +TagCollectionFilter +TagColumnOperation +TagCondition +TagCostEstimationResourceCollectionFilter +TagCount +TagCriterionForJob +TagCriterionPairForJob +TagDeliveryStreamInput +TagDescription +TagDescriptions +TagException +TagFilter +TagFilters +TagHealth +TagInfoForResource +TagInput +TagInstanceProfileRequest +TagKey +TagKeyFilters +TagKeyList +TagKeyOnly +TagKeyScope +TagKeys +TagKeysListRequiredException +TagLimitExceededException +TagLimitExceededFault +TagList +TagListEntry +TagListMessage +TagLogGroupRequest +TagMFADeviceRequest +TagMeetingRequest +TagMultiValueDelimiter +TagNames +TagNotFoundFault +TagOpenIDConnectProviderRequest +TagOperationException +TagOptionDetail +TagOptionDetails +TagOptionId +TagOptionNotMigratedException +TagOptionSummary +TagOptions +TagOutput +TagPolicyException +TagPolicyRequest +TagPolicyViolationException +TagProjectRequest +TagProjectResult +TagQueryConfiguration +TagQueueRequest +TagQuotaPerResourceExceeded +TagRef +TagRequiredException +TagResourceInput +TagResourceOutput +TagResourceRequest +TagResourceResponse +TagResourceResult +TagResourcesInput +TagResourcesOutput +TagRestrictedResources +TagRoleRequest +TagRuleConfigurations +TagRules +TagSAMLProviderRequest +TagScopeTerm +TagSearchCondition +TagServerCertificateRequest +TagSet +TagSetListLimitExceededException +TagSpecification +TagSpecifications +TagStepDetails +TagStreamInput +TagUserRequest +TagValue +TagValuePair +TagValueScope +TagValues +TagValuesToAdd +TagValuesToDelete +TaggedDatabase +TaggedResource +TaggedResourceListMessage +TaggedResources +TaggedTable +Tagging +TaggingDirective +TaggingFailedException +Tags +TagsAlreadyExistException +TagsLimitExceededException +TagsList +TagsMapRequiredException +TagsModel +TagsPerPage +TagsPerResourceExceededLimitException +TagsToAdd +TagsToDelete +TagsToRemove +TagsToUpdate +TagsType +Taint +Tape +TapeARN +TapeARNs +TapeArchive +TapeArchives +TapeBarcode +TapeBarcodePrefix +TapeCreatedDate +TapeDriveType +TapeInfo +TapeInfos +TapeRecoveryPointInfo +TapeRecoveryPointInfos +TapeRecoveryPointTime +TapeSizeInBytes +TapeStatus +TapeUsedInBytes +Tapes +Target +TargetARN +TargetAccounts +TargetAction +TargetActionType +TargetAddress +TargetApplications +TargetArn +TargetAttributeName +TargetBackupVault +TargetBackupVaultName +TargetBands +TargetBrokerEBSVolumeInfo +TargetBucket +TargetCapacity +TargetCapacitySpecification +TargetCapacitySpecificationRequest +TargetCapacityUnitType +TargetClusterArn +TargetClusterInfo +TargetClusterType +TargetColumn +TargetConfiguration +TargetConfigurationRequest +TargetConfigurationValueRollup +TargetConfigurationValueSet +TargetConfigurations +TargetContainerHostname +TargetContainerRepository +TargetControls +TargetCount +TargetCpuUtilizationPerCore +TargetCustomAvailabilityZone +TargetCustomerId +TargetDBClusterParameterGroupDescription +TargetDBClusterParameterGroupIdentifier +TargetDBClusterParameterGroupName +TargetDBClusterSnapshotIdentifier +TargetDBInstanceIdentifier +TargetDBParameterGroupDescription +TargetDBParameterGroupIdentifier +TargetDBParameterGroupName +TargetDBSnapshotIdentifier +TargetDataProviderDescriptors +TargetDatabase +TargetDatabaseName +TargetDbClusterIdentifier +TargetDbType +TargetDescription +TargetDestination +TargetDetails +TargetDevice +TargetDistributionId +TargetDocumentAttributeKey +TargetDocumentAttributeValue +TargetDocumentAttributeValueDeletion +TargetDpus +TargetDurationCompatibilityMode +TargetEncryptionType +TargetEndpointArn +TargetEngineName +TargetEngineVersion +TargetEnvironment +TargetEnvironmentName +TargetEventTypes +TargetFacetName +TargetFailure +TargetFileSystemValues +TargetGrant +TargetGrants +TargetGroup +TargetGroupARNs +TargetGroupArn +TargetGroupArns +TargetGroupAssociationLimitException +TargetGroupAttribute +TargetGroupConfig +TargetGroupInfo +TargetGroupName +TargetGroupNotFoundException +TargetGroupPairInfo +TargetGroupStickinessConfig +TargetGroupSummary +TargetGroupTuple +TargetGroups +TargetGroupsConfig +TargetHealth +TargetHealthDescription +TargetHealthDescriptions +TargetId +TargetIdFilters +TargetIdType +TargetIds +TargetImage +TargetImageOrientationCorrection +TargetInUseException +TargetInstance +TargetInstanceType +TargetInstances +TargetIops +TargetIps +TargetKafkaVersion +TargetKeyId +TargetKeyPrefix +TargetLabelColumn +TargetLanguageCode +TargetLanguageCodes +TargetLensVersion +TargetLkfs +TargetLocation +TargetLocationAlarmConfiguration +TargetLocationMaxConcurrency +TargetLocationMaxErrors +TargetLocations +TargetMaps +TargetMeasureName +TargetMember +TargetMembershipsPerSubChannel +TargetModel +TargetMonitorNits +TargetMultiAttachEnabled +TargetMultiMeasureAttributeName +TargetMultiMeasureName +TargetName +TargetNetwork +TargetNetworkCidr +TargetNetworkId +TargetNodeType +TargetNotConnected +TargetNotConnectedException +TargetNotFoundException +TargetNumberOfBrokerNodes +TargetNumberOfNodes +TargetObjectReference +TargetObjectiveMetricValue +TargetOnDemandCapacity +TargetOnDeviceService +TargetOnDeviceServices +TargetOptionGroupDescription +TargetOptionGroupIdentifier +TargetOriginId +TargetParameter +TargetParameterName +TargetParameters +TargetPath +TargetPer +TargetPlatform +TargetPrefix +TargetProcess +TargetProductId +TargetProductName +TargetReference +TargetRegion +TargetReplicationInstanceArn +TargetRequiredException +TargetReservationValue +TargetReservedNodeCount +TargetReservedNodeOffering +TargetReservedNodeOfferingId +TargetReservedNodeType +TargetResource +TargetResourceCount +TargetResourceType +TargetResourceTypeParameter +TargetResourceTypeSummary +TargetRole +TargetRouteTableId +TargetSamplingRate +TargetSchemaName +TargetShardCount +TargetSheetId +TargetSize +TargetSnapshotIdentifier +TargetSnapshotName +TargetSnapshotValues +TargetSpotCapacity +TargetStatus +TargetStores +TargetString +TargetSubnet +TargetSummary +TargetTable +TargetTableName +TargetTags +TargetText +TargetThroughput +TargetTrackingConfiguration +TargetTrackingConfigurations +TargetTrackingMetric +TargetTrackingMetricDataQuery +TargetTrackingMetricDimension +TargetTrackingMetricStat +TargetTrackingScalingPolicyConfiguration +TargetType +TargetTypes +TargetUser +TargetUsers +TargetValue +TargetValues +TargetVariant +TargetVersion +TargetVersions +TargetViolationReason +TargetViolationReasons +TargetVisualOptions +TargetVisuals +TargetVisualsConfiguration +TargetVolumeType +TargetVolumeValues +TargetVpcSubnetId +TargetWorkspaceId +TargetedMessages +TargetedSentimentDetectionJobFilter +TargetedSentimentDetectionJobProperties +TargetedSentimentDetectionJobPropertiesList +TargetedSentimentEntity +TargetedSentimentMention +Targets +TargetsRequiredException +Task +TaskAction +TaskActionDefinition +TaskAlreadyExistsException +TaskArn +TaskAvailabilityLifetimeInSeconds +TaskConfig +TaskCount +TaskCreatedAt +TaskCredentials +TaskData +TaskDefinition +TaskDefinitionArn +TaskDefinitionPlacementConstraint +TaskDefinitionType +TaskDefinitions +TaskDescription +TaskDetails +TaskDoesNotExist +TaskEndTime +TaskError +TaskExecutionArn +TaskExecutionId +TaskExecutionListEntry +TaskExecutionResultDetail +TaskExecutions +TaskFailedEventDetails +TaskFieldMappings +TaskFilter +TaskHandle +TaskId +TaskIds +TaskInvocationParameters +TaskKeywords +TaskList +TaskListEntry +TaskListItem +TaskLogs +TaskNotFoundException +TaskObject +TaskOverride +TaskParameters +TaskProperties +TaskQueueing +TaskReportConfig +TaskRoleArn +TaskRun +TaskRunFilterCriteria +TaskRunId +TaskRunProperties +TaskRunSecurityConfigurationName +TaskRunSortCriteria +TaskRunType +TaskRuns +TaskSchedule +TaskScheduledEventDetails +TaskSet +TaskSetNotFoundException +TaskStartFailedEventDetails +TaskStartTime +TaskStartedEventDetails +TaskState +TaskStatistics +TaskStatisticsForAuditCheck +TaskStatus +TaskStatusReason +TaskSubmitFailedEventDetails +TaskSubmittedEventDetails +TaskSucceededEventDetails +TaskSummary +TaskTemplateConstraints +TaskTemplateDefaultFieldValue +TaskTemplateDefaults +TaskTemplateField +TaskTemplateFieldIdentifier +TaskTemplateId +TaskTemplateMetadata +TaskTemplates +TaskTimeLimitInSeconds +TaskTimedOut +TaskTimedOutEventDetails +TaskTitle +TaskType +Tasks +TaxDocuments +TcpFlags +TcpRoute +TcpRouteAction +TcpRouteMatch +TcpTimeout +Tcs +TdeCredentialArn +TdeCredentialPassword +Tdscdma +TdscdmaLocalId +TdscdmaNmr +TdscdmaNmrObj +TdscdmaObj +TdscdmaTimingAdvance +TdtInterval +Team +TeamId +TeamMember +TeamMemberAlreadyAssociatedException +TeamMemberNotFoundException +TechContact +TechPrivacy +TechnicalCueFilter +TechnicalCueSegment +Telecine +Telemetries +Telemetry +TelemetryConfiguration +TelemetryConfigurationUpdate +TelemetryMetadata +TelemetryRecord +TelemetryRecords +Telephone +Telephony +TelephonyConfig +TelephonySettings +TeletextDestinationSettings +TeletextGridControl +TeletextSourceSettings +TeletextSpacing +TempDir +TempDirectory +TemperatureUnit +Template +TemplateActionDocument +TemplateActionsRequestFilters +TemplateActiveVersionRequest +TemplateAlias +TemplateAliasList +TemplateArn +TemplateBody +TemplateConfiguration +TemplateContent +TemplateCreateMessageBody +TemplateData +TemplateDescription +TemplateDoesNotExistException +TemplateError +TemplateId +TemplateInput +TemplateLinkedPolicyDefinition +TemplateLinkedPolicyDefinitionDetail +TemplateLinkedPolicyDefinitionItem +TemplateLocation +TemplateMetadata +TemplateName +TemplateParameter +TemplateParameterConfiguration +TemplateParameters +TemplateQuestions +TemplateResponse +TemplateRevision +TemplateS3Uri +TemplateSSMDocumentDetails +TemplateSelectionExpression +TemplateSourceAnalysis +TemplateSourceEntity +TemplateSourceTemplate +TemplateStage +TemplateStepGroupSummary +TemplateStepSummary +TemplateSubject +TemplateSummary +TemplateSummaryConfig +TemplateSummaryList +TemplateSyncConfig +TemplateType +TemplateURL +TemplateUrl +TemplateV2 +TemplateV3 +TemplateV4 +TemplateVersion +TemplateVersionDefinition +TemplateVersionNumber +TemplateVersionResponse +TemplateVersionSummary +TemplateVersionSummaryList +TemplateVersionsResponse +TemplatedPathList +Templates +TemplatesMetadata +TemplatesNotAvailableInRegionException +TemplatesResponse +TemporalAdaptiveQuantization +TemporalAq +TemporalFilterSettings +TemporalIds +TemporalStatisticsConfigInput +TemporaryCredential +TemporaryPassword +TemporaryPasswordValidityDays +TemporaryRestoreDays +Tenancy +Tenant +TenantDomain +TenantId +TenantIds +TensorBoardAppSettings +TensorBoardOutputConfig +TenthFractionsOfACent +TeradataParameters +Term +TermCount +TermEndDate +TermInYears +TermStartDate +TerminalRoutingStrategyException +TerminalStateException +TerminateAppRequest +TerminateCaptions +TerminateClientVpnConnectionsRequest +TerminateClientVpnConnectionsResult +TerminateConnectionStatus +TerminateEnvByForce +TerminateEnvironmentMessage +TerminateInstanceInAutoScalingGroupType +TerminateInstances +TerminateInstancesRequest +TerminateInstancesResult +TerminateInstancesWithExpiration +TerminateJobFlowsInput +TerminateJobRequest +TerminateProvisionedProductInput +TerminateProvisionedProductOutput +TerminateRecommendationDetail +TerminateRecoveryInstancesRequest +TerminateRecoveryInstancesResponse +TerminateRequest +TerminateResources +TerminateSessionRequest +TerminateSessionResponse +TerminateSolNetworkInstanceInput +TerminateSolNetworkInstanceOutput +TerminateTargetInstancesRequest +TerminateTargetInstancesResponse +TerminateToken +TerminateWorkflowExecutionInput +TerminateWorkspaceRequests +TerminateWorkspacesRequest +TerminateWorkspacesResult +Terminated +TerminatedAt +Terminating +TerminatingInstances +Termination +TerminationDate +TerminationDateTime +TerminationDelay +TerminationHealth +TerminationPolicies +TerminationPolicyTypes +TerminationProtected +TerminationProtectionEnabled +TerminationTime +TerminationWaitInSeconds +TerminologyData +TerminologyDataFormat +TerminologyDataLocation +TerminologyNames +TerminologyProperties +TerminologyPropertiesList +Terms +TermsAggregation +TerraformSource +Test +TestAlarmRequest +TestAlarmResult +TestAuthorizationRequest +TestAuthorizationResponse +TestAvailabilityConfigurationRequest +TestAvailabilityConfigurationResponse +TestCase +TestCaseFilter +TestCaseRun +TestCaseScenario +TestConnectionMessage +TestConnectionRequest +TestConnectionResponse +TestCustomDataIdentifierRequest +TestCustomDataIdentifierResponse +TestDNSAnswerRequest +TestDNSAnswerResponse +TestDurationInSeconds +TestEventPatternRequest +TestEventPatternResponse +TestEventType +TestExecutionResultFilterBy +TestExecutionResultItems +TestExecutionSortBy +TestExecutionSummary +TestExecutionTarget +TestFailoverMessage +TestFailoverNotAvailableFault +TestFailoverResult +TestFunctionFailed +TestFunctionRequest +TestFunctionResult +TestGridProject +TestGridSession +TestGridSessionAction +TestGridSessionArtifact +TestGridVpcConfig +TestHypervisorConfigurationInput +TestIdentityProviderRequest +TestIdentityProviderResponse +TestInvokeAuthorizerRequest +TestInvokeAuthorizerResponse +TestInvokeMethodRequest +TestInvokeMethodResponse +TestMetricFilterRequest +TestMetricFilterResponse +TestMigrationMessage +TestMigrationResponse +TestMode +TestPassed +TestPhoneNumber +TestRecommendation +TestRenderEmailTemplateRequest +TestRenderEmailTemplateResponse +TestRenderTemplateRequest +TestRenderTemplateResponse +TestReportSummary +TestRepositoryTriggersInput +TestRepositoryTriggersOutput +TestResult +TestRoleRequest +TestRoleResponse +TestS3Uri +TestSegmentPatternRequest +TestSegmentPatternResponse +TestSetDiscrepancyErrors +TestSetDiscrepancyReportBotAliasTarget +TestSetDiscrepancyReportResourceTarget +TestSetExportSpecification +TestSetGenerationDataSource +TestSetImportInputLocation +TestSetImportResourceSpecification +TestSetIntentDiscrepancyItem +TestSetSlotDiscrepancyItem +TestSetSortBy +TestSetStorageLocation +TestSetSummary +TestSetTurnRecord +TestSetTurnResult +TestTypeInput +TestTypeOutput +TestWindowEnd +TestWindowStart +TestWindowSummary +TestWindows +TestWirelessDeviceRequest +TestWirelessDeviceResponse +TestingData +TestingDataResult +Text +TextArea +TextAreaControlDisplayOptions +TextArrayOptions +TextBody +TextBoxes +TextClassificationJobConfig +TextColor +TextConditionalFormat +TextConfig +TextContent +TextContentUpdate +TextControlPlaceholderOptions +TextDetection +TextDetectionResult +TextDetections +TextDocumentStatistics +TextField +TextFieldControlDisplayOptions +TextFormat +TextInputEvent +TextInputSpecification +TextLengthExceededException +TextList +TextLocales +TextLogDestination +TextLogSetting +TextModelVersion +TextOptions +TextPart +TextPlain +TextQualifier +TextResponseEvent +TextSizeLimitExceededException +TextTransformation +TextTransformations +TextTranslationJobFilter +TextTranslationJobProperties +TextTranslationJobPropertiesList +TextType +TextWithHighlights +TextWithHighlightsValue +TextWrap +Theme +ThemeAlias +ThemeAliasList +ThemeArn +ThemeConfiguration +ThemeError +ThemeId +ThemeSummary +ThemeSummaryList +ThemeValue +ThemeValues +ThemeVersion +ThemeVersionNumber +ThemeVersionSummary +ThemeVersionSummaryList +Themes +ThesaurusSummary +ThesaurusSummaryItems +Thickness +Thing +ThingArn +ThingAttribute +ThingConnectivity +ThingDocument +ThingGroupDocument +ThingGroupIndexingConfiguration +ThingGroupMetadata +ThingGroupProperties +ThingIndexingConfiguration +ThingName +ThingTypeDefinition +ThingTypeMetadata +ThingTypeProperties +ThirdPartyFirewall +ThirdPartyFirewallFirewallPolicies +ThirdPartyFirewallFirewallPolicy +ThirdPartyFirewallMissingExpectedRouteTableViolation +ThirdPartyFirewallMissingFirewallViolation +ThirdPartyFirewallMissingSubnetViolation +ThirdPartyFirewallPolicy +ThirdPartyFirewallStatus +ThirdPartyJob +ThirdPartyJobData +ThirdPartyJobDetails +ThirdPartySourceRepository +ThousandSeparatorOptions +ThousandsSeparator +ThreadFieldMappings +ThreadId +ThreadsPerCore +Threat +ThreatDetectedByName +ThreatIntelIndicator +ThreatIntelIndicatorCategory +ThreatIntelIndicatorLastObservedAt +ThreatIntelIndicatorSource +ThreatIntelIndicatorSourceUrl +ThreatIntelIndicatorType +ThreatIntelIndicatorValue +ThreatIntelIndicators +ThreatIntelSetId +ThreatIntelSetIds +ThreatIntelligenceDetail +ThreatIntelligenceDetails +ThreatListName +ThreatName +ThreatNames +Threats +ThreatsDetectedItemCount +Threshold +ThresholdComparator +ThresholdCount +ThresholdExpression +ThresholdFraction +ThresholdMetricId +ThresholdPercentage +ThresholdType +ThresholdV2 +ThresholdValue +ThresholdsWaitTime +ThrottleCount +ThrottleSettings +ThrottledClientException +ThrottledException +ThrottlingBurstLimit +ThrottlingException +ThrottlingRateLimit +ThroughResources +ThroughResourcesStatement +ThroughResourcesStatementRequest +Throughput +ThroughputCapacity +ThroughputLimitExceeded +ThroughputMode +ThroughputOther +ThroughputRead +ThroughputTotal +ThroughputWrite +ThrowOnDuplicate +Thumbnail +ThumbnailConfig +ThumbnailConfiguration +ThumbnailDetail +ThumbnailDetails +ThumbnailEncryption +ThumbnailHeight +ThumbnailInterval +ThumbnailPattern +ThumbnailType +ThumbnailWidth +Thumbnails +Thumbprint +ThumbprintList +Thursday +TicServerUrl +TickLabelOptions +TicketId +TicketIds +TicketList +Tier +Tiering +TieringPolicy +TieringStartTime +Tierings +Tile +TileAspectRatio +TileCount +TileHeight +TileLayout +TileLayoutStyle +TileOrder +TilePosition +TileStyle +TileWidth +Tiles +Time +TimeAlignmentBoundary +TimeBasedAutoScalingConfiguration +TimeBasedAutoScalingConfigurations +TimeBasedCanary +TimeBasedCollectionScheme +TimeBasedForecastProperties +TimeBasedLinear +TimeColumn +TimeCommitmentInSeconds +TimeCreated +TimeDelaySeconds +TimeDelta +TimeDeltaUnits +TimeEqualityFilter +TimeFormat +TimeGranularity +TimeInNanos +TimeLeftSeconds +TimeLimitExceededException +TimeLoggingStarted +TimeLoggingStopped +TimeOfDay +TimeOfTheDay +TimeOffset +TimePeriod +TimePointGranularity +TimeRange +TimeRangeDrillDownFilter +TimeRangeFilter +TimeRangeFilterInput +TimeRangeFilterOutput +TimeRangeFilterValue +TimeRangeLowerBound +TimeRangeType +TimeRangeUpperBound +TimeRangeValue +TimeRanges +TimeSeries +TimeSeriesCondition +TimeSeriesConditions +TimeSeriesConfig +TimeSeriesDataPoint +TimeSeriesFeedback +TimeSeriesForecastingJobConfig +TimeSeriesForecastingSettings +TimeSeriesGranularity +TimeSeriesId +TimeSeriesIdentifiers +TimeSeriesList +TimeSeriesMeasureValueColumnInfo +TimeSeriesReplacementsDataSource +TimeSeriesSelector +TimeSeriesServiceStatistics +TimeSeriesSummaries +TimeSeriesSummary +TimeSeriesTransformation +TimeSeriesTransformations +TimeSeriesValue +TimeSignalMessage +TimeSpan +TimeStamp +TimeToLive +TimeToLiveDescription +TimeToLiveInSeconds +TimeToLiveSpecification +TimeToLiveStatus +TimeUnit +TimeWindow +TimeZone +TimeZoneId +Timecode +TimecodeBurnin +TimecodeBurninSettings +TimecodeConfig +TimecodeInsertion +TimecodeSource +TimecodeStart +TimedMetadata +TimedMetadataBehavior +TimedMetadataBoxVersion +TimedMetadataId3Frame +TimedMetadataId3Period +TimedMetadataInsertion +TimedMetadataPid +TimedMetadataSchemeIdUri +TimedMetadataValue +TimedOutSteps +TimeframeCap +Timeline +TimelineEvent +Timeout +TimeoutAction +TimeoutActions +TimeoutConfig +TimeoutCount +TimeoutDurationMinutes +TimeoutInMillis +TimeoutInMinutes +TimeoutInSeconds +TimeoutSeconds +Timer +TimerCanceledEventAttributes +TimerDefinition +TimerFiredEventAttributes +TimerStartedEventAttributes +TimerType +TimerValue +Timers +Times +Timestamp +TimestampAttributeName +TimestampColumn +TimestampColumnName +TimestampDeltaMilliseconds +TimestampForCollection +TimestampFormat +TimestampFormats +TimestampList +TimestampMetricValuePair +TimestampMetricValuePairList +TimestampOffset +TimestampOffsetMode +TimestampOutOfBoundsException +TimestampPartition +TimestampRange +TimestampRanges +TimestampStructure +TimestampValue +Timestamps +TimestreamAction +TimestreamConfig +TimestreamConfiguration +TimestreamDestination +TimestreamDimension +TimestreamRegistrationResponse +TimestreamResources +TimestreamSettings +TimestreamTimestamp +Timezone +TimezoneEstimationMethods +TimezoneName +TimezoneOffset +TimezonesCompletedCount +TimezonesTotalCount +Timing +TimingInformation +TipOfSourceReferenceIsDifferentException +TipsDivergenceExceededException +Title +TitleAggregation +TitleAggregationResponse +TitleOptions +TitleOverride +TitleRequiredException +Tld +TlogAccessMode +Tls +TlsCertificate +TlsCertificateData +TlsCiphers +TlsConfig +TlsConfigInput +TlsContext +TlsPolicy +TlsSessionResumptionMode +TlsValidationContext +TlsValidationContextAcmTrust +TlsValidationContextFileTrust +TlsValidationContextSdsTrust +TmpDirIAMRole +Tmpfs +To +ToAddresses +ToDate +ToDbClusterArn +ToExclusive +ToKey +ToPhoneNumber +ToPort +ToTime +ToTimeStamp +ToType +ToggleButtonsVisibility +Token +TokenAlreadyExistsException +TokenBalance +TokenCode +TokenData +TokenDomains +TokenDuration +TokenEndpoint +TokenFilter +TokenId +TokenIdentifier +TokenIds +TokenKey +TokenKeyId +TokenProperties +TokenType +TokenValidityUnits +TokenValidityUnitsType +TokenValue +TokenizedBody +TokenizedTitle +Tokens +TollFreePrefix +TooLongCSPInResponseHeadersPolicy +TooManyAccessPointsException +TooManyActionsException +TooManyApplicationVersionsException +TooManyApplicationsException +TooManyBucketsException +TooManyCacheBehaviors +TooManyCachePolicies +TooManyCertificates +TooManyCertificatesException +TooManyCloudFrontOriginAccessIdentities +TooManyConfigurationTemplatesException +TooManyContinuousDeploymentPolicies +TooManyCookieNamesInWhiteList +TooManyCookiesInCachePolicy +TooManyCookiesInOriginRequestPolicy +TooManyCustomHeadersInResponseHeadersPolicy +TooManyDistributionCNAMEs +TooManyDistributions +TooManyDistributionsAssociatedToCachePolicy +TooManyDistributionsAssociatedToFieldLevelEncryptionConfig +TooManyDistributionsAssociatedToKeyGroup +TooManyDistributionsAssociatedToOriginAccessControl +TooManyDistributionsAssociatedToOriginRequestPolicy +TooManyDistributionsAssociatedToResponseHeadersPolicy +TooManyDistributionsWithFunctionAssociations +TooManyDistributionsWithLambdaAssociations +TooManyDistributionsWithSingleFunctionARN +TooManyEntriesInBatchRequestException +TooManyEnvironmentsException +TooManyFailedAttemptsException +TooManyFieldLevelEncryptionConfigs +TooManyFieldLevelEncryptionContentTypeProfiles +TooManyFieldLevelEncryptionEncryptionEntities +TooManyFieldLevelEncryptionFieldPatterns +TooManyFieldLevelEncryptionProfiles +TooManyFieldLevelEncryptionQueryArgProfiles +TooManyFunctionAssociations +TooManyFunctions +TooManyHeadersInCachePolicy +TooManyHeadersInForwardedValues +TooManyHeadersInOriginRequestPolicy +TooManyHealthChecks +TooManyHostedZones +TooManyInvalidationsInProgress +TooManyKeyGroups +TooManyKeyGroupsAssociatedToDistribution +TooManyKeySigningKeys +TooManyLabelsException +TooManyLambdaFunctionAssociations +TooManyListenersException +TooManyLoadBalancersException +TooManyOriginAccessControls +TooManyOriginCustomHeaders +TooManyOriginGroupsPerDistribution +TooManyOriginRequestPolicies +TooManyOrigins +TooManyPlatformsException +TooManyPoliciesException +TooManyPublicKeys +TooManyPublicKeysInKeyGroup +TooManyQueryStringParameters +TooManyQueryStringsInCachePolicy +TooManyQueryStringsInOriginRequestPolicy +TooManyRealtimeLogConfigs +TooManyRegistrationsForTargetIdException +TooManyRemoveHeadersInResponseHeadersPolicy +TooManyRequests +TooManyRequestsException +TooManyResponseHeadersPolicies +TooManyRulesException +TooManyStreamingDistributionCNAMEs +TooManyStreamingDistributions +TooManySubscriptionsException +TooManyTagKeysException +TooManyTags +TooManyTagsException +TooManyTagsFault +TooManyTargetGroupsException +TooManyTargetsException +TooManyTrafficPolicies +TooManyTrafficPolicyInstances +TooManyTrafficPolicyVersionsForCurrentPolicy +TooManyTrustedSigners +TooManyUniqueTargetGroupsPerLoadBalancerException +TooManyUpdates +TooManyVPCAssociationAuthorizations +Tool +Toolchain +ToolchainSource +ToolsVersion +Tooltip +TooltipFields +TooltipItem +TooltipOptions +TooltipTitleType +TooltipVisibility +Top +TopAnomalousServices +TopAnswer +TopBottomFilter +TopBottomMovers +TopBottomMoversComputation +TopBottomRanked +TopBottomRankedComputation +TopContributors +TopOffset +TopResources +Topic +TopicARN +TopicArn +TopicCalculatedField +TopicCategoryFilter +TopicCategoryFilterConstant +TopicColumn +TopicConfiguration +TopicConfigurations +TopicDateRangeFilter +TopicDefaultPreferences +TopicDetails +TopicFilter +TopicId +TopicLimitExceededException +TopicName +TopicNamedEntity +TopicNames +TopicNumericEqualityFilter +TopicNumericRangeFilter +TopicPreference +TopicPreferences +TopicRangeFilterConstant +TopicRefreshDetails +TopicRefreshSchedule +TopicRefreshScheduleSummary +TopicRelativeDateFilter +TopicRule +TopicRuleDestination +TopicRuleDestinationConfiguration +TopicRuleDestinationSummary +TopicRuleListItem +TopicRulePayload +TopicScheduleType +TopicSingularFilterConstant +TopicStatus +TopicSummary +Topics +TopicsDetectionJobFilter +TopicsDetectionJobProperties +TopicsDetectionJobPropertiesList +TopicsSummaries +Topk +ToscaOverride +Total +TotalActions +TotalActualHours +TotalActualSpend +TotalActualUnits +TotalAddressCount +TotalAggregation +TotalAggregationComputation +TotalAmortizedCommitment +TotalAmortizedFee +TotalAuthenticatedEntities +TotalAvailableAddressCount +TotalBackupSizeInMegaBytes +TotalBarLabel +TotalBytes +TotalCap +TotalCapacity +TotalCapacityProvisioned +TotalCapacityUsed +TotalCellStyle +TotalCodeSize +TotalCommitment +TotalCost +TotalCount +TotalDataInMegaBytes +TotalDiscoveredResources +TotalDuration +TotalEndpointCount +TotalEntries +TotalEstimatedMonthlySavingsAmount +TotalEstimatedMonthlySavingsPercentage +TotalExecutionTimeInMillis +TotalExpectedSpend +TotalExtractedDataInGB +TotalFailures +TotalFilteredCount +TotalFpgaMemoryInMiB +TotalFulfilledCapacity +TotalGb +TotalGpuMemoryInMiB +TotalHourlyPrice +TotalImpact +TotalImpactFilter +TotalImpactPercentage +TotalInferenceMemoryInMiB +TotalInstanceCount +TotalLabeled +TotalLabels +TotalLocalStorageGB +TotalLocalStorageGBRequest +TotalLogicalCapacityUsed +TotalNodes +TotalNumRows +TotalNumberOfDuplicateTimestamps +TotalNumberOfFiles +TotalNumberOfInvalidValues +TotalNumberOfMissingValues +TotalNumberOfResults +TotalNumberOfRows +TotalNumberOfStages +TotalNumberOfTasks +TotalNumberOfUnsupportedTimestamps +TotalNumberOfUsers +TotalObjects +TotalOptions +TotalPartsCount +TotalPercentageArea +TotalPieces +TotalPolicyCount +TotalPotentialRISavings +TotalProcessed +TotalProvisionedStorageInMegaBytes +TotalRecommendationCount +TotalRecordCount +TotalResizeDataInMegaBytes +TotalResourceUtilization +TotalResources +TotalResponseTime +TotalResultsCount +TotalRowsInDataset +TotalRuleCount +TotalRunningHours +TotalRunningHoursInLookbackPeriod +TotalRunningNormalizedUnits +TotalScheduledInstanceHours +TotalSegments +TotalShards +TotalSize +TotalSizeInGB +TotalSizeLimitExceededException +TotalSnapshotCapacityUsed +TotalStackInstancesCount +TotalSteps +TotalStorageCapacityInMegaBytes +TotalSuggestionsCount +TotalTargetCapacity +TotalUnAssignedShards +TotalUpfrontPrice +TotalVCpus +TotalsVisibility +ToxicityCategories +ToxicityDetection +ToxicityDetectionSettings +TpmSupport +Trace +TraceConfiguration +TraceContent +TraceHeader +TraceId +TraceIds +TraceOutput +TraceSegmentDocuments +TraceSummaries +TraceSummary +TraceUser +Traceback +Traces +TracesProcessedCount +TracingConfig +TracingConfigResponse +TracingConfiguration +TracingEnabled +Track +TrackData +TrackListMessage +TrackNumber +TrackSourceSettings +TrackedActionLastAccessed +TrackedActionsLastAccessed +TrackedClusterId +TrackedIsps +TrackerArn +TrackerName +TrackingConfig +TrackingInformation +TrackingNumber +TrackingOptions +TrackingOptionsAlreadyExistsException +TrackingOptionsDoesNotExistException +Tracks +TrafficConfig +TrafficDialPercentage +TrafficDirection +TrafficDistributionGroup +TrafficDistributionGroupId +TrafficDistributionGroupSummary +TrafficDistributionGroupSummaryList +TrafficDistributionGroupUserSummary +TrafficDistributionGroupUserSummaryList +TrafficMirrorFilter +TrafficMirrorFilterId +TrafficMirrorFilterIds +TrafficMirrorFilterRule +TrafficMirrorFilterRuleId +TrafficMirrorFilters +TrafficMirrorPortRange +TrafficMirrorPortRangeRequest +TrafficMirrorSession +TrafficMirrorSessionId +TrafficMirrorSessionIds +TrafficMirrorSessions +TrafficMirrorTarget +TrafficMirrorTargetId +TrafficMirrorTargetIds +TrafficMirrorTargets +TrafficPattern +TrafficPercentageToMonitor +TrafficPolicies +TrafficPolicy +TrafficPolicyAlreadyExists +TrafficPolicyCount +TrafficPolicyId +TrafficPolicyIdMarker +TrafficPolicyInUse +TrafficPolicyInstance +TrafficPolicyInstanceAlreadyExists +TrafficPolicyInstanceCount +TrafficPolicyInstanceId +TrafficPolicyInstanceNameMarker +TrafficPolicyInstanceTypeMarker +TrafficPolicyInstances +TrafficPolicySummaries +TrafficPolicySummary +TrafficPolicyType +TrafficPolicyVersion +TrafficPolicyVersionMarker +TrafficRoute +TrafficRoutingConfig +TrafficRoutingConfiguration +TrafficSource +TrafficSourceIdentifier +TrafficSourceState +TrafficSourceType +TrafficSources +TrafficType +Trail +TrailARN +TrailAlreadyExistsException +TrailArn +TrailInfo +TrailName +TrailNotFoundException +TrailNotProvidedException +TrailProperties +Trails +TrainedModelArn +TrainedModelMetrics +TrainingChannels +TrainingData +TrainingDataConfig +TrainingDataEndTime +TrainingDataResult +TrainingDataSchema +TrainingDataSourceId +TrainingDataStartTime +TrainingEndTime +TrainingEndTimestamp +TrainingExecutionEndTime +TrainingExecutionStartTime +TrainingImage +TrainingImageConfig +TrainingImageDigest +TrainingInputMode +TrainingJob +TrainingJobArn +TrainingJobDefinition +TrainingJobDefinitionName +TrainingJobDefinitions +TrainingJobEarlyStoppingType +TrainingJobName +TrainingJobStatus +TrainingJobStatusCounters +TrainingJobStepMetadata +TrainingJobSummaries +TrainingJobSummary +TrainingMetrics +TrainingMetricsV2 +TrainingParameters +TrainingRepositoryAccessMode +TrainingRepositoryAuthConfig +TrainingRepositoryCredentialsProviderArn +TrainingResult +TrainingResultV2 +TrainingSpecification +TrainingStartTime +TrainingTimeInSeconds +Trait +TraitDiffRule +Traits +TransactGetItem +TransactGetItemsInput +TransactGetItemsOutput +TransactItems +TransactStatements +TransactWriteItem +TransactWriteItemsInput +TransactWriteItemsOutput +Transaction +TransactionCanceledException +TransactionCommitInProgressException +TransactionCommittedException +TransactionConflictException +TransactionData +TransactionDescription +TransactionEndTime +TransactionEvent +TransactionId +TransactionInProgressException +TransactionOutputItem +TransactionStartTime +TransactionStatus +TransactionType +TransactionalMessagesPerSecond +Transactions +TranscodeProfileName +Transcript +TranscriptEvent +TranscriptFileUri +TranscriptFilter +TranscriptFilterType +TranscriptResultStream +TranscriptSourceSetting +TranscriptionConfiguration +TranscriptionJob +TranscriptionJobName +TranscriptionJobStatus +TranscriptionJobSummaries +TranscriptionJobSummary +TranscriptionMessages +TranscriptionMessagesConcatenationConfiguration +TransferAccountId +TransferAlreadyCompletedException +TransferCertificateRequest +TransferCertificateResponse +TransferConflictException +TransferContactRequest +TransferContactResponse +TransferData +TransferDomainRequest +TransferDomainResponse +TransferDomainToAnotherAwsAccountRequest +TransferDomainToAnotherAwsAccountResponse +TransferDuration +TransferId +TransferInputDeviceRequest +TransferLock +TransferMessage +TransferMode +TransferOfferAcceptedTimestamp +TransferOfferExpirationTimestamp +TransferOption +TransferPrice +TransferStatus +TransferType +Transferability +Transferable +Transferred +TransferringInputDeviceSummary +Transform +TransformConfigParameter +TransformDataSource +TransformEncryption +TransformEndTime +TransformFilterCriteria +TransformId +TransformIds +TransformInput +TransformJob +TransformJobArn +TransformJobDefinition +TransformJobName +TransformJobStatus +TransformJobStepMetadata +TransformJobSummaries +TransformJobSummary +TransformName +TransformOutput +TransformParameters +TransformProcessingConfig +TransformResources +TransformS3DataSource +TransformSchema +TransformSortCriteria +TransformStartTime +TransformType +TransformationConfigurations +TransformationRules +TransformationTool +Transformations +Transforms +TransitEncryption +TransitEncryptionEnabled +TransitEncryptionMode +TransitEncryptionPort +TransitGateway +TransitGatewayAddress +TransitGatewayArn +TransitGatewayArns +TransitGatewayAsn +TransitGatewayAssociation +TransitGatewayAttachment +TransitGatewayAttachmentArn +TransitGatewayAttachmentAssociation +TransitGatewayAttachmentBgpConfiguration +TransitGatewayAttachmentId +TransitGatewayAttachmentIds +TransitGatewayAttachmentPropagation +TransitGatewayAttachmentPropagations +TransitGatewayAttachments +TransitGatewayCidrBlocks +TransitGatewayConfiguration +TransitGatewayConnect +TransitGatewayConnectOptions +TransitGatewayConnectPeer +TransitGatewayConnectPeerArn +TransitGatewayConnectPeerArns +TransitGatewayConnectPeerAssociation +TransitGatewayConnectPeerAssociations +TransitGatewayConnectPeerConfiguration +TransitGatewayConnectPeerId +TransitGatewayConnectPeerIds +TransitGatewayConnectPeers +TransitGatewayConnectRequestBgpOptions +TransitGatewayConnects +TransitGatewayId +TransitGatewayIds +TransitGatewayMulticastDeregisteredGroupMembers +TransitGatewayMulticastDeregisteredGroupSources +TransitGatewayMulticastDomain +TransitGatewayMulticastDomainArn +TransitGatewayMulticastDomainAssociation +TransitGatewayMulticastDomainAssociations +TransitGatewayMulticastDomainId +TransitGatewayMulticastDomainIds +TransitGatewayMulticastDomainOptions +TransitGatewayMulticastDomains +TransitGatewayMulticastGroup +TransitGatewayMulticastRegisteredGroupMembers +TransitGatewayMulticastRegisteredGroupSources +TransitGatewayOptions +TransitGatewayOwnerId +TransitGatewayPeering +TransitGatewayPeeringAttachment +TransitGatewayPeeringAttachmentId +TransitGatewayPeeringAttachmentOptions +TransitGatewayPeeringAttachments +TransitGatewayPolicyRule +TransitGatewayPolicyRuleMetaData +TransitGatewayPolicyTable +TransitGatewayPolicyTableAssociation +TransitGatewayPolicyTableEntries +TransitGatewayPolicyTableEntry +TransitGatewayPolicyTableId +TransitGatewayPolicyTableIds +TransitGatewayPolicyTables +TransitGatewayPrefixListAttachment +TransitGatewayPrefixListReference +TransitGatewayPrefixListReferences +TransitGatewayPropagation +TransitGatewayRegistration +TransitGatewayRegistrationStateReason +TransitGatewayRegistrations +TransitGatewayRequestOptions +TransitGatewayRoute +TransitGatewayRouteAttachment +TransitGatewayRouteTable +TransitGatewayRouteTableAnnouncement +TransitGatewayRouteTableAnnouncementId +TransitGatewayRouteTableAnnouncementIds +TransitGatewayRouteTableAnnouncements +TransitGatewayRouteTableArn +TransitGatewayRouteTableAssociation +TransitGatewayRouteTableAttachment +TransitGatewayRouteTableId +TransitGatewayRouteTableIds +TransitGatewayRouteTablePropagation +TransitGatewayRouteTablePropagations +TransitGatewayRouteTableRoute +TransitGatewayRouteTables +TransitGatewayVpcAttachment +TransitGatewayVpcAttachmentOptions +TransitGatewayVpcAttachments +TransitGateways +Transition +TransitionEvent +TransitionState +TransitionToIA +TransitionToPrimaryStorageClass +Transitions +TransitiveTagKeys +TranslateDocumentRequest +TranslateDocumentResponse +TranslatePinDataInput +TranslatePinDataOutput +TranslateTextRequest +TranslateTextResponse +TranslatedDocument +TranslatedDocumentsCount +TranslatedText +TranslationPinDataIsoFormat034 +TranslationSettings +TransmissionInterval +TransmitMode +Transport +TransportAttachmentId +TransportProtocol +TransportStreamBitrate +TransportStreamId +TransportStreamReservedBitrate +TransportTransitGatewayAttachmentId +TravelMode +TreatMissingData +TreatUndefinedSpecifiedValues +TreatUnrecognizedResourceTypesAsWarnings +Treatment +TreatmentConfig +TreatmentDescription +TreatmentId +TreatmentName +TreatmentOption +TreatmentResource +TreeMapAggregatedFieldWells +TreeMapConfiguration +TreeMapFieldWells +TreeMapGroupItemsLimitConfiguration +TreeMapSort +TreeMapSortConfiguration +TreeMapVisual +TrendArrowOptions +TrendArrows +TrendGroupSort +TrendGroups +Trendmicro +TrendmicroConnectorProfileCredentials +TrendmicroSourceProperties +Trial +TrialArn +TrialComponent +TrialComponentArn +TrialComponentArtifact +TrialComponentDisplayName +TrialComponentMetricSummary +TrialComponentName +TrialComponentSimpleSummary +TrialComponentSource +TrialComponentSourceDetail +TrialComponentStatus +TrialComponentSummaries +TrialComponentSummary +TrialMinutes +TrialName +TrialSource +TrialSummaries +TrialSummary +Trigger +TriggerConfig +TriggerDetails +TriggerEventSource +TriggerFindingId +TriggerName +TriggerNames +TriggerNodeDetails +TriggerProperties +TriggerTargetsLimitExceededException +TriggerTime +TriggerType +TriggerUpdate +TriggerValue +TriggeredAlarms +TriggeredBy +TriggeringDataset +Triggers +TriggersNotFound +TrimBlanks +TrimSpaceInChar +TrimWhiteSpace +TrimmedDataAccessException +TruckDimensions +TruckModeOptions +TruckWeight +TrueActivity +TruePeakLimiterThreshold +TruncateColumns +Truncated +TrunkInterfaceAssociation +TrunkInterfaceId +Trust +TrustAnchor +TrustAnchorCertificate +TrustAnchorDetail +TrustAnchorDetailResponse +TrustAnchors +TrustDirection +TrustId +TrustIds +TrustPassword +TrustProviderType +TrustState +TrustStateReason +TrustStore +TrustStoreSummary +TrustType +TrustedAdvisorCategorySpecificSummary +TrustedAdvisorCheckDescription +TrustedAdvisorCheckRefreshStatus +TrustedAdvisorCheckResult +TrustedAdvisorCheckSummary +TrustedAdvisorCostOptimizingSummary +TrustedAdvisorIntegrationStatus +TrustedAdvisorResourceDetail +TrustedAdvisorResourcesSummary +TrustedCertificatePublicKey +TrustedHostKeys +TrustedKeyGroupDoesNotExist +TrustedKeyGroups +TrustedResourceOwners +TrustedSignerDoesNotExist +TrustedSigners +Trusts +TruststoreUri +TruststoreVersion +TruststoreWarnings +TruthyCellValue +TruthyCellValueSynonyms +TsEncryptionMethod +TsFileMode +TsIncludeDvbSubtitles +TsUseAudioRenditionGroup +TsvOptions +TsvStoreOptions +TsvVersionOptions +Ttl +TtlDuration +TtmlDestinationSettings +Tuesday +TumblingWindow +TumblingWindowInSeconds +TunedHPOParams +TunedHyperParameters +TuningDataS3Uri +TuningJob +TuningJobArn +TuningJobCompletionCriteria +TuningJobCompletionDetails +TuningJobName +TuningJobStepMetaData +TuningObjective +Tunnel +TunnelInsideCidr +TunnelInsideIpVersion +TunnelInsideIpv6Cidr +TunnelOption +TunnelOptions +TunnelSummary +TurkErrorCode +TurnControlUrl +TurnSpecification +TwitterParameters +TwoWayChannelArn +TwoWayEnabled +Type +TypeAlreadyExistsFault +TypeArn +TypeConfigurationAlias +TypeConfigurationArn +TypeConfigurationDetails +TypeConfigurationIdentifier +TypeConfigurationIdentifiers +TypeConfigurationNotFoundException +TypeConfigurationVersionId +TypeConfigurations +TypeDeprecatedFault +TypeFilters +TypeHierarchy +TypeId +TypeIdentifier +TypeName +TypeNameAlias +TypeNamePrefix +TypeNotFoundException +TypeParameters +TypeSummaries +TypeSummary +TypeTestsStatus +TypeTestsStatusDescription +TypeVersionArn +TypeVersionId +TypeVersionSummaries +TypeVersionSummary +TypedAttributeValueRange +TypedLinkAttributeDefinition +TypedLinkAttributeRange +TypedLinkFacet +TypedLinkFacetAttributeUpdate +TypedLinkName +TypedLinkSchemaAndFacetName +TypedLinkSpecifier +TypedLinkSpecifiers +Types +Typography +UIColorPalette +UICustomization +UICustomizationType +URI +URL +URLOperation +URLPath +URLStyling +URLTarget +URLTemplate +USD +UUID +Uarfcn +Uarfcndl +UdpContainerSettings +UdpGroupSettings +UdpOutputSettings +UefiData +UhdDeviceSettings +UiConfig +UiTemplate +UiTemplateInfo +UiTemplateS3Uri +Uid +UlBucketSize +UlRate +UlRatePolicy +Ulimit +Ulimits +UnAuthenticated +UnModifiedSinceConstraint +UnableToDetectSchemaException +UnaggregatedField +UnapplyCustomPermissions +UnarchiveApplicationRequest +UnarchiveFindingsRequest +UnarchiveWaveRequest +UnassignInstanceRequest +UnassignIpv6AddressesRequest +UnassignIpv6AddressesResult +UnassignPrivateIpAddressesRequest +UnassignPrivateNatGatewayAddressRequest +UnassignPrivateNatGatewayAddressResult +UnassignVolumeRequest +UnassignedIpv6Addresses +UnassignedIpv6Prefixes +Unassigning +Unauthenticated +UnauthenticatedException +UnauthenticatedLogin +UnauthorizedCacheControlHeaderStrategy +UnauthorizedClientException +UnauthorizedException +UnauthorizedOperation +UnauthorizedOperationException +UnauthorizedPartnerIntegrationFault +UnauthorizedResourceAccessException +UnavailablePriorities +UncertaintyRange +UnclaimDeviceRequest +UnclaimDeviceResponse +Undeploy +UndeploySystemInstanceRequest +UndeploySystemInstanceResponse +UndeprecateActivityTypeInput +UndeprecateDomainInput +UndeprecateWorkflowTypeInput +UnderlayIpAddress +UndetectedDocumentTypes +UndetectedSignature +UndetectedSignatures +UndoRedoDisabled +UnexpectedLambdaException +UnfilteredPartition +UnfilteredPartitions +UngroupResourcesInput +UngroupResourcesOutput +UnhealthySince +UnhealthyThreshold +UnhealthyThresholdCount +UnicodeIcon +UniformBorder +UniformResourceIdentifier +UnindexedFace +UnindexedFaces +UninitializedAccountException +Union +UnionType +UniqueAccountIdentifier +UniqueAttribute +UniqueContributors +UniqueId +UniqueKey +UniqueProblem +UniqueProgramId +UniqueRequestToken +UniqueTag +UniqueTagResourceIdentifier +UniqueThreatNameCount +UniqueTicPerAudioTrack +UniqueValues +UniqueValuesComputation +Unit +UnitCost +UnitLabel +UnitNumber +UnitScaler +UnitType +Units +Unknown +UnknownHostCount +UnknownIpPermissions +UnknownMonitorException +UnknownResourceException +UnknownResourceFault +UnknownSnapshotCopyRegionFault +UnknownSubscriptionException +UnlabelParameterVersionRequest +UnlabelParameterVersionResult +Unlabeled +UnlinkDeveloperIdentityInput +UnlinkIdentityInput +UnlockCode +UnlockDelay +UnlockDelayUnit +UnlockDelayValue +UnlockRuleRequest +UnlockRuleResponse +UnmappedAttribute +UnmappedAttributes +UnmatchedFaces +UnmatchedPolicyPermissionException +UnmodifiableEntityException +UnmonitorInstancesRequest +UnmonitorInstancesResult +UnpeerVpcResult +UnpredictableNumber +UnprocessableEntityException +UnprocessedAccount +UnprocessedAccounts +UnprocessedAssociationUpdates +UnprocessedAssociations +UnprocessedAutomationRule +UnprocessedAutomationRules +UnprocessedCluster +UnprocessedClusters +UnprocessedDataSources +UnprocessedDataSourcesResult +UnprocessedFindings +UnprocessedGraph +UnprocessedGraphs +UnprocessedIdentifiers +UnprocessedIdentityId +UnprocessedIdentityIds +UnprocessedIds +UnprocessedItems +UnprocessedKeys +UnprocessedNamedQueryId +UnprocessedNamedQueryIds +UnprocessedPreparedStatementName +UnprocessedPreparedStatementNames +UnprocessedQueryExecutionId +UnprocessedQueryExecutionIds +UnprocessedRecords +UnprocessedResourceIdentifiers +UnprocessedScramSecret +UnprocessedScramSecrets +UnprocessedSecurityControl +UnprocessedStandardsControlAssociation +UnprocessedStandardsControlAssociationUpdate +UnprocessedStatistics +UnprocessedTraceIds +UnprocessedTraceSegment +UnprocessedTraceSegments +UnprocessedTypeConfigurations +UnprocessedUpdateAction +UnprocessedUpdateActions +UnrealizedSavings +UnrecognizedClientException +UnrecognizedFaces +UnrecognizedPublicKeyEncodingException +UnrecognizedResourceTypes +UnregisterConnectorRequest +UnregisteredSeiTimecode +UnreportedNotApplicableCount +UnreservedConcurrentExecutions +UnresolvableUsageUnitException +UnscaledValue +UnsearchedFace +UnsearchedFaces +UnshareApplicationRequest +UnshareDirectoryRequest +UnshareDirectoryResult +UnshareInterval +UnshareIntervalUnit +UnshareTarget +UnspecifiedCount +UnsubscribeAll +UnsubscribeFromDatasetRequest +UnsubscribeFromEventRequest +UnsubscribeInput +UnsubscribeRequest +UnsubscribeResult +Unsuccessful +UnsuccessfulFaceAssociation +UnsuccessfulFaceAssociations +UnsuccessfulFaceDeletion +UnsuccessfulFaceDeletions +UnsuccessfulFaceDisassociation +UnsuccessfulFaceDisassociations +UnsuccessfulFleetDeletions +UnsuccessfulFleetRequests +UnsuccessfulInstanceCreditSpecificationItem +UnsuccessfulInstanceCreditSpecificationItemError +UnsuccessfulInstanceCreditSpecifications +UnsuccessfulItem +UnsuccessfulItemError +UnsuccessfullyDeletedLaunchTemplateVersions +UnsupportedAPIEndpointException +UnsupportedActionException +UnsupportedActionForDeploymentTypeException +UnsupportedAddressException +UnsupportedAvailabilityZone +UnsupportedAvailabilityZoneException +UnsupportedCalendarException +UnsupportedCommandException +UnsupportedDigitalSignatureMethodException +UnsupportedDisplayLanguageCodeException +UnsupportedDocumentEncodingException +UnsupportedDocumentException +UnsupportedFeatureException +UnsupportedFeatureRequiredException +UnsupportedGrantTypeException +UnsupportedIdentityProviderException +UnsupportedImageTypeException +UnsupportedIndexTypeException +UnsupportedInventoryItemContextException +UnsupportedInventorySchemaVersionException +UnsupportedLanguageException +UnsupportedLanguagePairException +UnsupportedLocale +UnsupportedMediaTypeException +UnsupportedNetworkConfigurationException +UnsupportedOperatingSystem +UnsupportedOperation +UnsupportedOperationException +UnsupportedOperationFault +UnsupportedOptionFault +UnsupportedParameterType +UnsupportedPlatformType +UnsupportedPlsAlphabetException +UnsupportedPlsLanguageException +UnsupportedPricingPlanException +UnsupportedProtocolException +UnsupportedRegionException +UnsupportedResource +UnsupportedSettingsException +UnsupportedStreamMediaTypeException +UnsupportedTLD +UnsupportedTimestamps +UnsupportedTokenTypeException +UnsupportedUpstreamRegistryException +UnsupportedUserEditionException +UnsupportedUserStateException +UnsupportedWorkspaceConfigurationException +UntagAttendeeRequest +UntagCertificateAuthorityRequest +UntagColumnOperation +UntagDeliveryStreamInput +UntagInput +UntagInstanceProfileRequest +UntagLogGroupRequest +UntagMFADeviceRequest +UntagMeetingRequest +UntagOpenIDConnectProviderRequest +UntagOutput +UntagPolicyRequest +UntagProjectRequest +UntagQueueRequest +UntagResourceInput +UntagResourceOutput +UntagResourceRequest +UntagResourceResponse +UntagResourceResult +UntagResourcesInput +UntagResourcesOutput +UntagRoleRequest +UntagSAMLProviderRequest +UntagServerCertificateRequest +UntagStreamInput +UntagUserRequest +UntrustedArtifactOnDeployment +UnusedAccountValidityDays +UnusedCommitment +UnusedHours +UnusedUnits +Unwrap +UpScaling +Update +UpdateACLRequest +UpdateACLResponse +UpdateAbpV1_0_x +UpdateAbpV1_1 +UpdateAcceleratorAttributesRequest +UpdateAcceleratorAttributesResponse +UpdateAcceleratorRequest +UpdateAcceleratorResponse +UpdateAccessControlConfigurationRequest +UpdateAccessKeyRequest +UpdateAccessLogSubscriptionRequest +UpdateAccessLogSubscriptionResponse +UpdateAccessPolicyRequest +UpdateAccessPolicyResponse +UpdateAccessRequest +UpdateAccessResponse +UpdateAccountAuditConfigurationRequest +UpdateAccountConfigurationRequest +UpdateAccountConfigurationResponse +UpdateAccountCustomizationRequest +UpdateAccountCustomizationResponse +UpdateAccountPasswordPolicyRequest +UpdateAccountRequest +UpdateAccountResponse +UpdateAccountSendingEnabledRequest +UpdateAccountSettingsInput +UpdateAccountSettingsOutput +UpdateAccountSettingsRequest +UpdateAccountSettingsResponse +UpdateAction +UpdateActionAvailableDate +UpdateActionRequest +UpdateActionResponse +UpdateActionResultsMessage +UpdateActionStatus +UpdateActionStatusModifiedDate +UpdateActionTargetRequest +UpdateActionTypeInput +UpdateActions +UpdateActionsMessage +UpdateActiveModelVersionRequest +UpdateActiveModelVersionResponse +UpdateActivities +UpdateAddonRequest +UpdateAddonResponse +UpdateAddress +UpdateAddressBookRequest +UpdateAdmChannelRequest +UpdateAdmChannelResponse +UpdateAgentLogLevel +UpdateAgentRequest +UpdateAgentStatusRequest +UpdateAgentStatusResponse +UpdateAgreementRequest +UpdateAgreementResponse +UpdateAlarmModelRequest +UpdateAlarmModelResponse +UpdateAlertRequest +UpdateAlertResponse +UpdateAliasInput +UpdateAliasOutput +UpdateAliasRequest +UpdateAllowListRequest +UpdateAllowListResponse +UpdateAnalysisPermissionsRequest +UpdateAnalysisPermissionsResponse +UpdateAnalysisRequest +UpdateAnalysisResponse +UpdateAnalysisTemplateInput +UpdateAnalysisTemplateOutput +UpdateAnnotationStoreRequest +UpdateAnnotationStoreResponse +UpdateAnnotationStoreVersionRequest +UpdateAnnotationStoreVersionResponse +UpdateAnomalyDetectorRequest +UpdateAnomalyDetectorResponse +UpdateAnomalyMonitorRequest +UpdateAnomalyMonitorResponse +UpdateAnomalySubscriptionRequest +UpdateAnomalySubscriptionResponse +UpdateAnswerInput +UpdateAnswerOutput +UpdateApiCacheRequest +UpdateApiCacheResponse +UpdateApiDestinationRequest +UpdateApiDestinationResponse +UpdateApiKeyRequest +UpdateApiKeyResponse +UpdateApiMappingRequest +UpdateApiMappingResponse +UpdateApiRequest +UpdateApiResponse +UpdateApnsChannelRequest +UpdateApnsChannelResponse +UpdateApnsSandboxChannelRequest +UpdateApnsSandboxChannelResponse +UpdateApnsVoipChannelRequest +UpdateApnsVoipChannelResponse +UpdateApnsVoipSandboxChannelRequest +UpdateApnsVoipSandboxChannelResponse +UpdateAppAuthorizationRequest +UpdateAppAuthorizationResponse +UpdateAppBlockBuilderRequest +UpdateAppBlockBuilderResult +UpdateAppImageConfigRequest +UpdateAppImageConfigResponse +UpdateAppInstanceBotRequest +UpdateAppInstanceBotResponse +UpdateAppInstanceRequest +UpdateAppInstanceResponse +UpdateAppInstanceUserEndpointRequest +UpdateAppInstanceUserEndpointResponse +UpdateAppInstanceUserRequest +UpdateAppInstanceUserResponse +UpdateAppMonitorRequest +UpdateAppRequest +UpdateAppResponse +UpdateAppResult +UpdateAppVersionAppComponentRequest +UpdateAppVersionAppComponentResponse +UpdateAppVersionRequest +UpdateAppVersionResourceRequest +UpdateAppVersionResourceResponse +UpdateAppVersionResponse +UpdateApplicationComponentConfigRequest +UpdateApplicationInput +UpdateApplicationLayerAutomaticResponseRequest +UpdateApplicationMaintenanceConfigurationRequest +UpdateApplicationMaintenanceConfigurationResponse +UpdateApplicationMessage +UpdateApplicationRequest +UpdateApplicationResourceLifecycleMessage +UpdateApplicationResponse +UpdateApplicationResult +UpdateApplicationSettingsInput +UpdateApplicationSettingsOutput +UpdateApplicationSettingsRequest +UpdateApplicationSettingsResponse +UpdateApplicationVersionMessage +UpdateApprovalRuleTemplateContentInput +UpdateApprovalRuleTemplateContentOutput +UpdateApprovalRuleTemplateDescriptionInput +UpdateApprovalRuleTemplateDescriptionOutput +UpdateApprovalRuleTemplateNameInput +UpdateApprovalRuleTemplateNameOutput +UpdateArchiveRequest +UpdateArchiveResponse +UpdateArchiveRuleRequest +UpdateArtifactRequest +UpdateArtifactResponse +UpdateAssessmentControlRequest +UpdateAssessmentControlResponse +UpdateAssessmentControlSetStatusRequest +UpdateAssessmentControlSetStatusResponse +UpdateAssessmentFrameworkControlSet +UpdateAssessmentFrameworkRequest +UpdateAssessmentFrameworkResponse +UpdateAssessmentFrameworkShareRequest +UpdateAssessmentFrameworkShareResponse +UpdateAssessmentRequest +UpdateAssessmentResponse +UpdateAssessmentStatusRequest +UpdateAssessmentStatusResponse +UpdateAssessmentTargetRequest +UpdateAssetModelRequest +UpdateAssetModelResponse +UpdateAssetPropertyRequest +UpdateAssetRequest +UpdateAssetResponse +UpdateAssociationRequest +UpdateAssociationResult +UpdateAssociationStatusRequest +UpdateAssociationStatusResult +UpdateAssumeRolePolicyRequest +UpdateAttendeeCapabilitiesRequest +UpdateAttendeeCapabilitiesResponse +UpdateAttributeGroupRequest +UpdateAttributeGroupResponse +UpdateAttributesRequest +UpdateAuditStreamConfigurationRequest +UpdateAuditSuppressionRequest +UpdateAuthEventFeedbackRequest +UpdateAuthorizerRequest +UpdateAuthorizerResponse +UpdateAutoScalingGroupType +UpdateAutomatedDiscoveryConfigurationRequest +UpdateAutomaticTapeCreationPolicyInput +UpdateAutomaticTapeCreationPolicyOutput +UpdateAutomationRulesRequestItem +UpdateAutomationRulesRequestItems +UpdateAvailabilityConfigurationRequest +UpdateAvailabilityOptionsRequest +UpdateAvailabilityOptionsResponse +UpdateAvailable +UpdateBackendAPIRequest +UpdateBackendAPIResponse +UpdateBackendAuthForgotPasswordConfig +UpdateBackendAuthIdentityPoolConfig +UpdateBackendAuthMFAConfig +UpdateBackendAuthOAuthConfig +UpdateBackendAuthPasswordPolicyConfig +UpdateBackendAuthRequest +UpdateBackendAuthResourceConfig +UpdateBackendAuthResponse +UpdateBackendAuthUserPoolConfig +UpdateBackendAuthVerificationMessageConfig +UpdateBackendConfigRequest +UpdateBackendConfigResponse +UpdateBackendJobRequest +UpdateBackendJobResponse +UpdateBackendStorageRequest +UpdateBackendStorageResourceConfig +UpdateBackendStorageResponse +UpdateBackupPlanInput +UpdateBackupPlanOutput +UpdateBaiduChannelRequest +UpdateBaiduChannelResponse +UpdateBandwidthRateLimitInput +UpdateBandwidthRateLimitOutput +UpdateBandwidthRateLimitScheduleInput +UpdateBandwidthRateLimitScheduleOutput +UpdateBasePathMappingRequest +UpdateBatchPredictionInput +UpdateBatchPredictionOutput +UpdateBehavior +UpdateBillingGroupAccountGrouping +UpdateBillingGroupInput +UpdateBillingGroupOutput +UpdateBillingGroupRequest +UpdateBillingGroupResponse +UpdateBlueprintRequest +UpdateBlueprintResponse +UpdateBotAliasRequest +UpdateBotAliasResponse +UpdateBotLocaleRequest +UpdateBotLocaleResponse +UpdateBotRecommendationRequest +UpdateBotRecommendationResponse +UpdateBotRequest +UpdateBotResponse +UpdateBranchRequest +UpdateBranchResult +UpdateBridgeFlowSourceRequest +UpdateBridgeNetworkOutputRequest +UpdateBridgeNetworkSourceRequest +UpdateBridgeOutputRequest +UpdateBridgeOutputResponse +UpdateBridgeRequest +UpdateBridgeResponse +UpdateBridgeSourceRequest +UpdateBridgeSourceResponse +UpdateBridgeStateRequest +UpdateBridgeStateResponse +UpdateBrokerCountRequest +UpdateBrokerCountResponse +UpdateBrokerRequest +UpdateBrokerResponse +UpdateBrokerStorageRequest +UpdateBrokerStorageResponse +UpdateBrokerTypeRequest +UpdateBrokerTypeResponse +UpdateBrowserSettingsRequest +UpdateBrowserSettingsResponse +UpdateBucketBundleRequest +UpdateBucketBundleResult +UpdateBucketRequest +UpdateBucketResult +UpdateBudgetActionRequest +UpdateBudgetActionResponse +UpdateBudgetRequest +UpdateBuildInput +UpdateBuildOutput +UpdateBusinessReportScheduleRequest +UpdateByteMatchSetRequest +UpdateByteMatchSetResponse +UpdateCACertificateParams +UpdateCACertificateRequest +UpdateCachePolicyRequest +UpdateCachePolicyResult +UpdateCalculatedAttributeDefinitionRequest +UpdateCalculatedAttributeDefinitionResponse +UpdateCallAnalyticsCategoryRequest +UpdateCallAnalyticsCategoryResponse +UpdateCampaignDialerConfigRequest +UpdateCampaignNameRequest +UpdateCampaignOutboundCallConfigRequest +UpdateCampaignRequest +UpdateCampaignResponse +UpdateCanaryRequest +UpdateCapacityProviderRequest +UpdateCapacityProviderResponse +UpdateCapacityReservationInput +UpdateCaseRequest +UpdateCellRequest +UpdateCellResponse +UpdateCertificateAuthorityRequest +UpdateCertificateOptionsRequest +UpdateCertificateRequest +UpdateCertificateResponse +UpdateChangesetRequest +UpdateChangesetResponse +UpdateChannelClassRequest +UpdateChannelClassResponse +UpdateChannelFlowRequest +UpdateChannelFlowResponse +UpdateChannelGroupRequest +UpdateChannelGroupResponse +UpdateChannelMessageRequest +UpdateChannelMessageResponse +UpdateChannelReadMarkerRequest +UpdateChannelReadMarkerResponse +UpdateChannelRequest +UpdateChannelResponse +UpdateChapCredentialsInput +UpdateChapCredentialsOutput +UpdateClassificationJobRequest +UpdateClassificationScopeRequest +UpdateClassifierRequest +UpdateClientCertificateRequest +UpdateCloudFormationCollectionFilter +UpdateCloudFrontOriginAccessIdentityRequest +UpdateCloudFrontOriginAccessIdentityResult +UpdateClusterConfigRequest +UpdateClusterConfigResponse +UpdateClusterConfigurationRequest +UpdateClusterConfigurationResponse +UpdateClusterInput +UpdateClusterKafkaVersionRequest +UpdateClusterKafkaVersionResponse +UpdateClusterOutput +UpdateClusterRequest +UpdateClusterResponse +UpdateClusterSettingsRequest +UpdateClusterSettingsResponse +UpdateClusterVersionRequest +UpdateClusterVersionResponse +UpdateCodeRepositoryInput +UpdateCodeRepositoryOutput +UpdateCodeSigningConfigRequest +UpdateCodeSigningConfigResponse +UpdateCognitoUserPoolConfiguration +UpdateCollaborationInput +UpdateCollaborationOutput +UpdateCollectionDetail +UpdateCollectionRequest +UpdateCollectionResponse +UpdateColumnStatisticsForPartitionRequest +UpdateColumnStatisticsForPartitionResponse +UpdateColumnStatisticsForTableRequest +UpdateColumnStatisticsForTableResponse +UpdateCommentInput +UpdateCommentOutput +UpdateCompanyNetworkConfigurationRequest +UpdateComponentConfigurationRequest +UpdateComponentData +UpdateComponentInput +UpdateComponentOutput +UpdateComponentRequest +UpdateComponentResponse +UpdateComponentTypeRequest +UpdateComponentTypeResponse +UpdateComputeEnvironmentRequest +UpdateComputeEnvironmentResponse +UpdateConditionalForwarderRequest +UpdateConferenceProviderRequest +UpdateConfigRequest +UpdateConfigurationProfileRequest +UpdateConfigurationRequest +UpdateConfigurationResponse +UpdateConfigurationSetEventDestinationRequest +UpdateConfigurationSetReputationMetricsEnabledRequest +UpdateConfigurationSetSendingEnabledRequest +UpdateConfigurationSetTrackingOptionsRequest +UpdateConfigurationTemplateMessage +UpdateConfiguredTableAnalysisRuleInput +UpdateConfiguredTableAnalysisRuleOutput +UpdateConfiguredTableAssociationInput +UpdateConfiguredTableAssociationOutput +UpdateConfiguredTableInput +UpdateConfiguredTableOutput +UpdateConnectClientAddInRequest +UpdateConnectionAliasPermissionRequest +UpdateConnectionApiKeyAuthRequestParameters +UpdateConnectionAuthRequestParameters +UpdateConnectionBasicAuthRequestParameters +UpdateConnectionOAuthClientRequestParameters +UpdateConnectionOAuthRequestParameters +UpdateConnectionRequest +UpdateConnectionResponse +UpdateConnectivityInfoRequest +UpdateConnectivityInfoResponse +UpdateConnectivityRequest +UpdateConnectivityResponse +UpdateConnectorDefinitionRequest +UpdateConnectorProfileRequest +UpdateConnectorProfileResponse +UpdateConnectorRegistrationRequest +UpdateConnectorRegistrationResponse +UpdateConnectorRequest +UpdateConnectorResponse +UpdateConstraintInput +UpdateConstraintOutput +UpdateContactAttributesRequest +UpdateContactChannelRequest +UpdateContactEvaluationRequest +UpdateContactEvaluationResponse +UpdateContactFlowContentRequest +UpdateContactFlowMetadataRequest +UpdateContactFlowModuleContentRequest +UpdateContactFlowModuleMetadataRequest +UpdateContactFlowNameRequest +UpdateContactListRequest +UpdateContactRequest +UpdateContactScheduleRequest +UpdateContainerAgentRequest +UpdateContainerAgentResponse +UpdateContainerInstancesStateRequest +UpdateContainerInstancesStateResponse +UpdateContainerServiceRequest +UpdateContainerServiceResult +UpdateContentRequest +UpdateContentResponse +UpdateContextRequest +UpdateContextResponse +UpdateContinuousBackupsInput +UpdateContinuousBackupsOutput +UpdateContinuousDeploymentPolicyRequest +UpdateContinuousDeploymentPolicyResult +UpdateContributorInsightsInput +UpdateContributorInsightsOutput +UpdateControlPanelRequest +UpdateControlPanelResponse +UpdateControlRequest +UpdateControlResponse +UpdateCoreDefinitionRequest +UpdateCoreNetworkRequest +UpdateCoreNetworkResponse +UpdateCostAllocationTagsStatusError +UpdateCostAllocationTagsStatusRequest +UpdateCostAllocationTagsStatusResponse +UpdateCostCategoryDefinitionRequest +UpdateCostCategoryDefinitionResponse +UpdateCount +UpdateCrawlerRequest +UpdateCrawlerScheduleRequest +UpdateCrlRequest +UpdateCsvClassifierRequest +UpdateCustomKeyStoreRequest +UpdateCustomLineItemChargeDetails +UpdateCustomLineItemFlatChargeDetails +UpdateCustomLineItemInput +UpdateCustomLineItemOutput +UpdateCustomLineItemPercentageChargeDetails +UpdateCustomMetricRequest +UpdateCustomMetricResponse +UpdateCustomRoutingAcceleratorAttributesRequest +UpdateCustomRoutingAcceleratorAttributesResponse +UpdateCustomRoutingAcceleratorRequest +UpdateCustomRoutingAcceleratorResponse +UpdateCustomRoutingListenerRequest +UpdateCustomRoutingListenerResponse +UpdateCustomVerificationEmailTemplateRequest +UpdateDashboardPermissionsRequest +UpdateDashboardPermissionsResponse +UpdateDashboardPublishedVersionRequest +UpdateDashboardPublishedVersionResponse +UpdateDashboardRequest +UpdateDashboardResponse +UpdateDataCatalogInput +UpdateDataCellsFilterRequest +UpdateDataIntegrationRequest +UpdateDataLakeExceptionSubscriptionRequest +UpdateDataLakeRequest +UpdateDataLakeResponse +UpdateDataQualityRulesetRequest +UpdateDataQualityRulesetResponse +UpdateDataRepositoryAssociationRequest +UpdateDataRepositoryAssociationResponse +UpdateDataRetentionInput +UpdateDataRole +UpdateDataSecurityConfig +UpdateDataSetPermissionsRequest +UpdateDataSetPermissionsResponse +UpdateDataSetRequest +UpdateDataSetResponse +UpdateDataSource +UpdateDataSourceInput +UpdateDataSourceOutput +UpdateDataSourcePermissionsRequest +UpdateDataSourcePermissionsResponse +UpdateDataSourceRequest +UpdateDataSourceResponse +UpdateDatabaseRequest +UpdateDatabaseResponse +UpdateDatasetEntriesRequest +UpdateDatasetEntriesResponse +UpdateDatasetGroupRequest +UpdateDatasetRequest +UpdateDatasetResponse +UpdateDatasourcePackagesRequest +UpdateDatastoreRequest +UpdateDate +UpdateDateTime +UpdateDecoderManifestRequest +UpdateDecoderManifestResponse +UpdateDefaultAutoScalingConfigurationRequest +UpdateDefaultAutoScalingConfigurationResponse +UpdateDefaultBranchInput +UpdateDefaultMailDomainRequest +UpdateDeletionProtectionInput +UpdateDeploymentGroupInput +UpdateDeploymentGroupOutput +UpdateDeploymentRequest +UpdateDeploymentResponse +UpdateDeploymentStrategyRequest +UpdateDestinationInput +UpdateDestinationRequest +UpdateDestinationResponse +UpdateDetectorModelRequest +UpdateDetectorModelResponse +UpdateDetectorRequest +UpdateDetectorVersionMetadataRequest +UpdateDetectorVersionRequest +UpdateDetectorVersionStatusRequest +UpdateDevEndpointRequest +UpdateDevEnvironmentRequest +UpdateDevEnvironmentResponse +UpdateDeviceCertificateParams +UpdateDeviceDefinitionRequest +UpdateDeviceFleetRequest +UpdateDeviceInstanceRequest +UpdateDeviceInstanceResult +UpdateDeviceMetadataRequest +UpdateDeviceMetadataResponse +UpdateDevicePolicyConfigurationRequest +UpdateDevicePoolRequest +UpdateDevicePoolResult +UpdateDeviceRequest +UpdateDeviceResponse +UpdateDeviceStateRequest +UpdateDeviceStatusRequest +UpdateDevicesRequest +UpdateDimensionRequest +UpdateDimensionResponse +UpdateDirectConnectGatewayAssociationRequest +UpdateDirectConnectGatewayAssociationResult +UpdateDirectConnectGatewayRequest +UpdateDirectConnectGatewayResponse +UpdateDirectoryConfigRequest +UpdateDirectoryConfigResult +UpdateDirectorySetupRequest +UpdateDiscovererRequest +UpdateDiscovererResponse +UpdateDiscoveryJobRequest +UpdateDistributionBundleRequest +UpdateDistributionBundleResult +UpdateDistributionConfigurationRequest +UpdateDistributionConfigurationResponse +UpdateDistributionRequest +UpdateDistributionResult +UpdateDistributionWithStagingConfigRequest +UpdateDistributionWithStagingConfigResult +UpdateDocumentDefaultVersionRequest +UpdateDocumentDefaultVersionResult +UpdateDocumentMetadataRequest +UpdateDocumentRequest +UpdateDocumentResult +UpdateDocumentVersionRequest +UpdateDocumentationPartRequest +UpdateDocumentationVersionRequest +UpdateDomainAssociationRequest +UpdateDomainAssociationResult +UpdateDomainConfigRequest +UpdateDomainConfigResponse +UpdateDomainConfigurationRequest +UpdateDomainConfigurationResponse +UpdateDomainContactPrivacyRequest +UpdateDomainContactPrivacyResponse +UpdateDomainContactRequest +UpdateDomainContactResponse +UpdateDomainEndpointOptionsRequest +UpdateDomainEndpointOptionsResponse +UpdateDomainEntryRequest +UpdateDomainEntryResult +UpdateDomainMetadataRequest +UpdateDomainNameRequest +UpdateDomainNameResponse +UpdateDomainNameserversRequest +UpdateDomainNameserversResponse +UpdateDomainRequest +UpdateDomainResponse +UpdateDynamicThingGroupRequest +UpdateDynamicThingGroupResponse +UpdateEc2DeepInspectionConfigurationRequest +UpdateEc2DeepInspectionConfigurationResponse +UpdateEgressGatewayBridgeRequest +UpdateElasticIpRequest +UpdateElasticsearchDomainConfigRequest +UpdateElasticsearchDomainConfigResponse +UpdateEmailChannelRequest +UpdateEmailChannelResponse +UpdateEmailIdentityPolicyRequest +UpdateEmailTemplateRequest +UpdateEmailTemplateResponse +UpdateEmergencyContactSettingsRequest +UpdateEncryption +UpdateEncryptionKeyRequest +UpdateEndOfMeetingReminder +UpdateEndpointAccessRequest +UpdateEndpointAccessResponse +UpdateEndpointGroupRequest +UpdateEndpointGroupResponse +UpdateEndpointInput +UpdateEndpointOutput +UpdateEndpointRequest +UpdateEndpointResponse +UpdateEndpointWeightsAndCapacitiesInput +UpdateEndpointWeightsAndCapacitiesOutput +UpdateEndpointsBatchRequest +UpdateEndpointsBatchResponse +UpdateEnrollmentStatusRequest +UpdateEnrollmentStatusResponse +UpdateEntitlementRequest +UpdateEntitlementResult +UpdateEntityRequest +UpdateEntityResponse +UpdateEnvironmentAccountConnectionInput +UpdateEnvironmentAccountConnectionOutput +UpdateEnvironmentInput +UpdateEnvironmentMembershipRequest +UpdateEnvironmentMembershipResult +UpdateEnvironmentMessage +UpdateEnvironmentOutput +UpdateEnvironmentRequest +UpdateEnvironmentResponse +UpdateEnvironmentTemplateInput +UpdateEnvironmentTemplateOutput +UpdateEnvironmentTemplateVersionInput +UpdateEnvironmentTemplateVersionOutput +UpdateEphemerisRequest +UpdateError +UpdateEtlLibraries +UpdateEvaluationFormRequest +UpdateEvaluationFormResponse +UpdateEvaluationInput +UpdateEvaluationOutput +UpdateEventActionRequest +UpdateEventActionResponse +UpdateEventConfigurationByResourceTypesRequest +UpdateEventConfigurationsRequest +UpdateEventDataStoreRequest +UpdateEventDataStoreResponse +UpdateEventDestinationRequest +UpdateEventDestinationResult +UpdateEventIntegrationRequest +UpdateEventLabelRequest +UpdateEventSourceMappingRequest +UpdateEventSourcesConfigRequest +UpdateExperienceRequest +UpdateExperimentRequest +UpdateExperimentResponse +UpdateExperimentTemplateActionInputItem +UpdateExperimentTemplateLogConfigurationInput +UpdateExperimentTemplateRequest +UpdateExperimentTemplateResponse +UpdateExperimentTemplateStopConditionInput +UpdateExperimentTemplateTargetInput +UpdateExpirationForHITRequest +UpdateExportRequest +UpdateExportResponse +UpdateExpression +UpdateExtensionAssociationRequest +UpdateExtensionRequest +UpdateFPorts +UpdateFacetRequest +UpdateFailbackReplicationConfigurationRequest +UpdateFailoverConfig +UpdateFeatureGroupRequest +UpdateFeatureGroupResponse +UpdateFeatureMetadataRequest +UpdateFeatureRequest +UpdateFeatureResponse +UpdateFeaturedResultsSetRequest +UpdateFeaturedResultsSetResponse +UpdateFieldLevelEncryptionConfigRequest +UpdateFieldLevelEncryptionConfigResult +UpdateFieldLevelEncryptionProfileRequest +UpdateFieldLevelEncryptionProfileResult +UpdateFieldRequest +UpdateFileCacheLustreConfiguration +UpdateFileCacheRequest +UpdateFileCacheResponse +UpdateFileSystemAssociationInput +UpdateFileSystemAssociationOutput +UpdateFileSystemLustreConfiguration +UpdateFileSystemOntapConfiguration +UpdateFileSystemOpenZFSConfiguration +UpdateFileSystemRequest +UpdateFileSystemResponse +UpdateFileSystemWindowsConfiguration +UpdateFilterRequest +UpdateFilterResponse +UpdateFindingAggregatorRequest +UpdateFindingAggregatorResponse +UpdateFindingsFeedbackRequest +UpdateFindingsFilterRequest +UpdateFindingsFilterResponse +UpdateFindingsRequest +UpdateFirewallConfigRequest +UpdateFirewallConfigResponse +UpdateFirewallDeleteProtectionRequest +UpdateFirewallDeleteProtectionResponse +UpdateFirewallDescriptionRequest +UpdateFirewallDescriptionResponse +UpdateFirewallDomainsRequest +UpdateFirewallDomainsResponse +UpdateFirewallEncryptionConfigurationRequest +UpdateFirewallEncryptionConfigurationResponse +UpdateFirewallPolicyChangeProtectionRequest +UpdateFirewallPolicyChangeProtectionResponse +UpdateFirewallPolicyRequest +UpdateFirewallPolicyResponse +UpdateFirewallRuleGroupAssociationRequest +UpdateFirewallRuleGroupAssociationResponse +UpdateFirewallRuleRequest +UpdateFirewallRuleResponse +UpdateFleetAttributesInput +UpdateFleetAttributesOutput +UpdateFleetCapacityInput +UpdateFleetCapacityOutput +UpdateFleetMetadataRequest +UpdateFleetMetricRequest +UpdateFleetPortSettingsInput +UpdateFleetPortSettingsOutput +UpdateFleetRequest +UpdateFleetResponse +UpdateFleetResult +UpdateFlowEntitlementRequest +UpdateFlowEntitlementResponse +UpdateFlowMediaStreamRequest +UpdateFlowMediaStreamResponse +UpdateFlowOutputRequest +UpdateFlowOutputResponse +UpdateFlowRequest +UpdateFlowResponse +UpdateFlowSourceRequest +UpdateFlowSourceResponse +UpdateFlowTemplateRequest +UpdateFlowTemplateResponse +UpdateFlywheelRequest +UpdateFlywheelResponse +UpdateFolderPermissionsRequest +UpdateFolderPermissionsResponse +UpdateFolderRequest +UpdateFolderResponse +UpdateFormData +UpdateFormRequest +UpdateFormResponse +UpdateFrameworkInput +UpdateFrameworkOutput +UpdateFreeTierConfig +UpdateFunctionCodeRequest +UpdateFunctionConfigurationRequest +UpdateFunctionDefinitionRequest +UpdateFunctionEventInvokeConfigRequest +UpdateFunctionRequest +UpdateFunctionResponse +UpdateFunctionResult +UpdateFunctionUrlConfigRequest +UpdateFunctionUrlConfigResponse +UpdateFuotaTaskRequest +UpdateGameConfigurationRequest +UpdateGameConfigurationResult +UpdateGameRequest +UpdateGameResult +UpdateGameServerGroupInput +UpdateGameServerGroupOutput +UpdateGameServerInput +UpdateGameServerOutput +UpdateGameSessionInput +UpdateGameSessionOutput +UpdateGameSessionQueueInput +UpdateGameSessionQueueOutput +UpdateGatewayBridgeSourceRequest +UpdateGatewayCapabilityConfigurationRequest +UpdateGatewayCapabilityConfigurationResponse +UpdateGatewayGroupRequest +UpdateGatewayInformationInput +UpdateGatewayInformationOutput +UpdateGatewayInstanceRequest +UpdateGatewayInstanceResponse +UpdateGatewayRequest +UpdateGatewayResponseRequest +UpdateGatewayRouteInput +UpdateGatewayRouteOutput +UpdateGatewaySoftwareNowInput +UpdateGatewaySoftwareNowOutput +UpdateGcmChannelRequest +UpdateGcmChannelResponse +UpdateGeoMatchSetRequest +UpdateGeoMatchSetResponse +UpdateGeofenceCollectionRequest +UpdateGeofenceCollectionResponse +UpdateGlobalNetworkRequest +UpdateGlobalNetworkResponse +UpdateGlobalSecondaryIndexAction +UpdateGlobalSettingsInput +UpdateGlobalSettingsRequest +UpdateGlobalTableInput +UpdateGlobalTableOutput +UpdateGlobalTableSettingsInput +UpdateGlobalTableSettingsOutput +UpdateGraphqlApiRequest +UpdateGraphqlApiResponse +UpdateGrokClassifierRequest +UpdateGroupCertificateConfigurationRequest +UpdateGroupCertificateConfigurationResponse +UpdateGroupInput +UpdateGroupOutput +UpdateGroupQueryInput +UpdateGroupQueryOutput +UpdateGroupRequest +UpdateGroupResponse +UpdateGroupResult +UpdateHITReviewStatusRequest +UpdateHITTypeOfHITRequest +UpdateHealthCheckRequest +UpdateHealthCheckResponse +UpdateHostInput +UpdateHostKeyRequest +UpdateHostKeyResponse +UpdateHostedZoneCommentRequest +UpdateHostedZoneCommentResponse +UpdateHoursOfOperationRequest +UpdateHttpNamespaceRequest +UpdateHttpNamespaceResponse +UpdateHubRequest +UpdateHubResponse +UpdateHypervisorInput +UpdateHypervisorOutput +UpdateIAMPolicyAssignmentRequest +UpdateIAMPolicyAssignmentResponse +UpdateIPSetRequest +UpdateIPSetResponse +UpdateIdentityProviderConfigurationRequest +UpdateIdentityProviderRequest +UpdateIdentityProviderResponse +UpdateIdentityProviderSettingsRequest +UpdateIdentityProviderSettingsResponse +UpdateIdentitySourceInput +UpdateIdentitySourceOutput +UpdateImageGenerationConfigurationInput +UpdateImagePermissionsRequest +UpdateImagePipelineRequest +UpdateImagePipelineResponse +UpdateImageRequest +UpdateImageResponse +UpdateImageSetMetadataRequest +UpdateImageSetMetadataResponse +UpdateImageVersionRequest +UpdateImageVersionResponse +UpdateImpersonationRoleRequest +UpdateInAppTemplateRequest +UpdateInAppTemplateResponse +UpdateInProgressException +UpdateIncidentRecordInput +UpdateIndexRequest +UpdateIndexTypeInput +UpdateIndexTypeOutput +UpdateIndexingConfigurationRequest +UpdateInferenceExperimentRequest +UpdateInferenceExperimentResponse +UpdateInferenceSchedulerRequest +UpdateInfoEntry +UpdateInfrastructureConfigurationRequest +UpdateInfrastructureConfigurationResponse +UpdateIngestionDestinationRequest +UpdateIngestionDestinationResponse +UpdateIngressGatewayBridgeRequest +UpdateInputDeviceRequest +UpdateInputDeviceResponse +UpdateInputRequest +UpdateInputResponse +UpdateInputSecurityGroupRequest +UpdateInputSecurityGroupResponse +UpdateInsightRequest +UpdateInstanceAccessControlAttributeConfigurationRequest +UpdateInstanceAttributeRequest +UpdateInstanceCustomHealthStatusRequest +UpdateInstanceMetadataOptionsRequest +UpdateInstanceMetadataOptionsResult +UpdateInstanceProfileRequest +UpdateInstanceProfileResult +UpdateInstanceRequest +UpdateInstanceStorageConfigRequest +UpdateInstantBooking +UpdateInstruction +UpdateIntegrationRequest +UpdateIntegrationResponseRequest +UpdateIntegrationResponseResponse +UpdateIntegrationResult +UpdateIntentRequest +UpdateIntentResponse +UpdateIpAccessSettingsRequest +UpdateIpAccessSettingsResponse +UpdateIpAddress +UpdateIpAddresses +UpdateIpRestrictionRequest +UpdateIpRestrictionResponse +UpdateItemInput +UpdateItemOutput +UpdateJobExecutionRequest +UpdateJobExecutionResponse +UpdateJobFromSourceControlRequest +UpdateJobFromSourceControlResponse +UpdateJobPriorityRequest +UpdateJobPriorityResult +UpdateJobQueueRequest +UpdateJobQueueResponse +UpdateJobRequest +UpdateJobResponse +UpdateJobShipmentStateRequest +UpdateJobStatusRequest +UpdateJobStatusResult +UpdateJobTemplateRequest +UpdateJobTemplateResponse +UpdateJourneyRequest +UpdateJourneyResponse +UpdateJourneyStateRequest +UpdateJourneyStateResponse +UpdateJsonClassifierRequest +UpdateKeyDescriptionRequest +UpdateKeyGroupRequest +UpdateKeyGroupResult +UpdateKeyRequest +UpdateKeyResponse +UpdateKnowledgeBaseTemplateUriRequest +UpdateKnowledgeBaseTemplateUriResponse +UpdateKxClusterDatabasesRequest +UpdateKxDatabaseRequest +UpdateKxDatabaseResponse +UpdateKxEnvironmentNetworkRequest +UpdateKxEnvironmentNetworkResponse +UpdateKxEnvironmentRequest +UpdateKxEnvironmentResponse +UpdateKxUserRequest +UpdateKxUserResponse +UpdateLFTagRequest +UpdateLabelGroupRequest +UpdateLabelsPayload +UpdateLagRequest +UpdateLaunchConfigurationRequest +UpdateLaunchConfigurationTemplateRequest +UpdateLaunchConfigurationTemplateResponse +UpdateLaunchProfileMemberRequest +UpdateLaunchProfileMemberResponse +UpdateLaunchProfileRequest +UpdateLaunchProfileResponse +UpdateLaunchRequest +UpdateLaunchResponse +UpdateLayerRequest +UpdateLayoutRequest +UpdateLedgerPermissionsModeRequest +UpdateLedgerPermissionsModeResponse +UpdateLedgerRequest +UpdateLedgerResponse +UpdateLensReviewInput +UpdateLensReviewOutput +UpdateLicenseConfigurationRequest +UpdateLicenseManagerReportGeneratorRequest +UpdateLicenseSpecificationsForResourceRequest +UpdateLifecyclePolicyRequest +UpdateLinkAttributes +UpdateLinkAttributesRequest +UpdateLinkInput +UpdateLinkOutput +UpdateLinkRequest +UpdateLinkResponse +UpdateListRequest +UpdateListenerRequest +UpdateListenerResponse +UpdateLiveSourceRequest +UpdateLiveSourceResponse +UpdateLoadBalancerAttributeRequest +UpdateLoadBalancerAttributeResult +UpdateLocationAzureBlobRequest +UpdateLocationHdfsRequest +UpdateLocationNfsRequest +UpdateLocationObjectStorageRequest +UpdateLocationSmbRequest +UpdateLogLevelsByResourceTypesRequest +UpdateLogPatternRequest +UpdateLogPatternResponse +UpdateLoggerDefinitionRequest +UpdateLoggingConfigurationRequest +UpdateLoggingConfigurationResponse +UpdateLoginProfileRequest +UpdateLongTermPricingRequest +UpdateMLModelInput +UpdateMLModelOutput +UpdateMLTransformRequest +UpdateMLTransformResponse +UpdateMacieSessionRequest +UpdateMailboxQuotaRequest +UpdateMaintenance +UpdateMaintenanceStartTimeInput +UpdateMaintenanceStartTimeOutput +UpdateMaintenanceWindowRequest +UpdateMaintenanceWindowResult +UpdateMaintenanceWindowTargetRequest +UpdateMaintenanceWindowTargetResult +UpdateMaintenanceWindowTaskRequest +UpdateMaintenanceWindowTaskResult +UpdateMalwareScanSettingsRequest +UpdateManagedInstanceRoleRequest +UpdateManagedRuleSetVersionExpiryDateRequest +UpdateManagedRuleSetVersionExpiryDateResponse +UpdateMapRequest +UpdateMapResponse +UpdateMapRunInput +UpdateMatchingWorkflowInput +UpdateMatchingWorkflowOutput +UpdateMatchmakingConfigurationInput +UpdateMatchmakingConfigurationOutput +UpdateMediaInsightsPipelineConfigurationRequest +UpdateMediaInsightsPipelineConfigurationResponse +UpdateMediaInsightsPipelineStatusRequest +UpdateMediaPipelineKinesisVideoStreamPoolRequest +UpdateMediaPipelineKinesisVideoStreamPoolResponse +UpdateMediaStorageConfigurationInput +UpdateMedicalVocabularyRequest +UpdateMedicalVocabularyResponse +UpdateMeetingRoomConfiguration +UpdateMemberDetectorsRequest +UpdateMemberDetectorsResponse +UpdateMemberInput +UpdateMemberSessionRequest +UpdateMembershipInput +UpdateMembershipOutput +UpdateMeshInput +UpdateMeshOutput +UpdateMethodRequest +UpdateMethodResponseRequest +UpdateMetricAttributionRequest +UpdateMetricAttributionResponse +UpdateMetricSetRequest +UpdateMetricSetResponse +UpdateMigrationWorkflowRequest +UpdateMigrationWorkflowResponse +UpdateMissionProfileRequest +UpdateMitigationActionRequest +UpdateMitigationActionResponse +UpdateMobileDeviceAccessRuleRequest +UpdateModelCardRequest +UpdateModelCardResponse +UpdateModelManifestRequest +UpdateModelManifestResponse +UpdateModelPackageInput +UpdateModelPackageOutput +UpdateModelRequest +UpdateModelResponse +UpdateModelVersionRequest +UpdateModelVersionResult +UpdateModelVersionStatusRequest +UpdateMonitorInput +UpdateMonitorOutput +UpdateMonitoringAlertRequest +UpdateMonitoringAlertResponse +UpdateMonitoringRequest +UpdateMonitoringResponse +UpdateMonitoringScheduleRequest +UpdateMonitoringScheduleResponse +UpdateMulticastGroupRequest +UpdateMultiplexProgramRequest +UpdateMultiplexProgramResponse +UpdateMultiplexRequest +UpdateMultiplexResponse +UpdateMyUserProfileRequest +UpdateNFSFileShareInput +UpdateNFSFileShareOutput +UpdateNamedQueryInput +UpdateNamespaceRequest +UpdateNamespaceResponse +UpdateNetworkAnalyzerConfigurationRequest +UpdateNetworkConfigurationInput +UpdateNetworkProfileRequest +UpdateNetworkProfileResult +UpdateNetworkResourceMetadataRequest +UpdateNetworkResourceMetadataResponse +UpdateNetworkSettingsRequest +UpdateNetworkSettingsResponse +UpdateNetworkSitePlanRequest +UpdateNetworkSiteRequest +UpdateNetworkSiteResponse +UpdateNodeInput +UpdateNodegroupConfigRequest +UpdateNodegroupConfigResponse +UpdateNodegroupVersionRequest +UpdateNodegroupVersionResponse +UpdateNotebookInput +UpdateNotebookInstanceInput +UpdateNotebookInstanceLifecycleConfigInput +UpdateNotebookMetadataInput +UpdateNotificationConfigurationInput +UpdateNotificationRequest +UpdateNotificationRuleRequest +UpdateNotificationSettingsRequest +UpdateNumberOfDomainControllersRequest +UpdateObjectAttributes +UpdateObjectAttributesRequest +UpdateObjectAttributesResponse +UpdateOntapVolumeConfiguration +UpdateOpenIDConnectProviderThumbprintRequest +UpdateOpenZFSVolumeConfiguration +UpdateOpsItemRequest +UpdateOpsMetadataRequest +UpdateOpsMetadataResult +UpdateOrgEc2DeepInspectionConfigurationRequest +UpdateOrganizationConfigurationRequest +UpdateOrganizationConfigurationResponse +UpdateOrganizationalUnitRequest +UpdateOrganizationalUnitResponse +UpdateOriginAccessControlRequest +UpdateOriginAccessControlResult +UpdateOriginEndpointRequest +UpdateOriginEndpointResponse +UpdateOriginRequestPolicyRequest +UpdateOriginRequestPolicyResult +UpdateOutpostInput +UpdateOutpostOutput +UpdateOutpostResolverRequest +UpdateOutpostResolverResponse +UpdatePackageConfigurationRequest +UpdatePackageRequest +UpdatePackageResponse +UpdatePackageVersionRequest +UpdatePackageVersionsStatusRequest +UpdatePackageVersionsStatusResult +UpdatePackagingGroupRequest +UpdatePackagingGroupResponse +UpdateParallelDataRequest +UpdateParallelDataResponse +UpdateParam +UpdateParameterGroupRequest +UpdateParameterGroupResponse +UpdateParticipantRoleConfigRequest +UpdatePartitionRequest +UpdatePartnerAccountRequest +UpdatePartnerStatusInputMessage +UpdatePatchBaselineRequest +UpdatePatchBaselineResult +UpdatePermissionGroupRequest +UpdatePermissionGroupResponse +UpdatePermissionSetRequest +UpdatePermissionsRequest +UpdatePermissionsResponse +UpdatePhoneNumberRequest +UpdatePhoneNumberRequestItem +UpdatePhoneNumberRequestItems +UpdatePhoneNumberResponse +UpdatePhoneNumberResult +UpdatePhoneNumberSettingsRequest +UpdatePipeRequest +UpdatePipeResponse +UpdatePipeSourceActiveMQBrokerParameters +UpdatePipeSourceDynamoDBStreamParameters +UpdatePipeSourceKinesisStreamParameters +UpdatePipeSourceManagedStreamingKafkaParameters +UpdatePipeSourceParameters +UpdatePipeSourceRabbitMQBrokerParameters +UpdatePipeSourceSelfManagedKafkaParameters +UpdatePipeSourceSqsQueueParameters +UpdatePipelineExecutionRequest +UpdatePipelineExecutionResponse +UpdatePipelineInput +UpdatePipelineNotificationsRequest +UpdatePipelineNotificationsResponse +UpdatePipelineOutput +UpdatePipelineRequest +UpdatePipelineResponse +UpdatePipelineStatusRequest +UpdatePipelineStatusResponse +UpdatePlaceIndexRequest +UpdatePlaceIndexResponse +UpdatePlacementRequest +UpdatePolicy +UpdatePolicyInput +UpdatePolicyOutput +UpdatePolicyRequest +UpdatePolicyResponse +UpdatePolicyStoreInput +UpdatePolicyStoreOutput +UpdatePolicyTemplateInput +UpdatePolicyTemplateOutput +UpdatePoolRequest +UpdatePoolResult +UpdatePortalRequest +UpdatePortalResponse +UpdatePortfolioInput +UpdatePortfolioOutput +UpdatePortfolioShareInput +UpdatePortfolioShareOutput +UpdatePositionRequest +UpdatePreparedStatementInput +UpdatePresetRequest +UpdatePresetResponse +UpdatePricingPlanInput +UpdatePricingPlanOutput +UpdatePricingPlanRequest +UpdatePricingPlanResponse +UpdatePricingRuleInput +UpdatePricingRuleOutput +UpdatePrimaryEmailAddressRequest +UpdatePrimaryRegionRequest +UpdatePrivateDnsNamespaceRequest +UpdatePrivateDnsNamespaceResponse +UpdateProactiveJoin +UpdateProblemRequest +UpdateProductInput +UpdateProductOutput +UpdateProfileInput +UpdateProfileJobRequest +UpdateProfileJobResponse +UpdateProfileOutput +UpdateProfileRequest +UpdateProfileResponse +UpdateProfilingGroupRequest +UpdateProfilingGroupResponse +UpdateProgramRequest +UpdateProgramResponse +UpdateProgramScheduleConfiguration +UpdateProgramTransition +UpdateProjectDataDeliveryRequest +UpdateProjectDataDeliveryResponse +UpdateProjectInput +UpdateProjectOutput +UpdateProjectRequest +UpdateProjectResponse +UpdateProjectResult +UpdateProjectVisibilityInput +UpdateProjectVisibilityOutput +UpdatePromptRequest +UpdatePromptResponse +UpdateProtectedQueryInput +UpdateProtectedQueryOutput +UpdateProtectionGroupRequest +UpdateProvisionedModelThroughputRequest +UpdateProvisionedProductInput +UpdateProvisionedProductOutput +UpdateProvisionedProductPropertiesInput +UpdateProvisionedProductPropertiesOutput +UpdateProvisioningArtifactInput +UpdateProvisioningArtifactOutput +UpdateProvisioningParameter +UpdateProvisioningPreferences +UpdateProvisioningTemplateRequest +UpdateProxySessionRequest +UpdateProxySessionResponse +UpdatePublicDnsNamespaceRequest +UpdatePublicDnsNamespaceResponse +UpdatePublicKeyRequest +UpdatePublicKeyResult +UpdatePublicSharingSettingsRequest +UpdatePublicSharingSettingsResponse +UpdatePublishingDestinationRequest +UpdatePullRequestApprovalRuleContentInput +UpdatePullRequestApprovalRuleContentOutput +UpdatePullRequestApprovalStateInput +UpdatePullRequestDescriptionInput +UpdatePullRequestDescriptionOutput +UpdatePullRequestStatusInput +UpdatePullRequestStatusOutput +UpdatePullRequestTitleInput +UpdatePullRequestTitleOutput +UpdatePushTemplateRequest +UpdatePushTemplateResponse +UpdateQualificationTypeRequest +UpdateQualificationTypeResponse +UpdateQuerySuggestionsBlockListRequest +UpdateQuerySuggestionsConfigRequest +UpdateQueueHoursOfOperationRequest +UpdateQueueMaxContactsRequest +UpdateQueueNameRequest +UpdateQueueOutboundCallerConfigRequest +UpdateQueueRequest +UpdateQueueResponse +UpdateQueueStatusRequest +UpdateQuickConnectConfigRequest +UpdateQuickConnectNameRequest +UpdateRadiusRequest +UpdateRateBasedRuleRequest +UpdateRateBasedRuleResponse +UpdateRdsDbInstanceRequest +UpdateReadinessCheckRequest +UpdateReadinessCheckResponse +UpdateRealtimeLogConfigRequest +UpdateRealtimeLogConfigResult +UpdateReceiptRuleRequest +UpdateRecipeJobRequest +UpdateRecipeJobResponse +UpdateRecipeRequest +UpdateRecipeResponse +UpdateRecommendationStatusItem +UpdateRecommendationStatusRequestEntry +UpdateRecommenderConfiguration +UpdateRecommenderConfigurationRequest +UpdateRecommenderConfigurationResponse +UpdateRecommenderConfigurationShape +UpdateRecommenderRequest +UpdateRecommenderResponse +UpdateRecordsRequest +UpdateRecordsResponse +UpdateRecoveryGroupRequest +UpdateRecoveryGroupResponse +UpdateRecoveryPointLifecycleInput +UpdateRecoveryPointLifecycleOutput +UpdateRefreshScheduleRequest +UpdateRefreshScheduleResponse +UpdateRegexMatchSetRequest +UpdateRegexMatchSetResponse +UpdateRegexPatternSetRequest +UpdateRegexPatternSetResponse +UpdateRegionSettingsInput +UpdateRegistryInput +UpdateRegistryRequest +UpdateRegistryResponse +UpdateRelatedItemsInput +UpdateRelationalDatabaseParametersRequest +UpdateRelationalDatabaseParametersResult +UpdateRelationalDatabaseRequest +UpdateRelationalDatabaseResult +UpdateReplicationConfigurationRequest +UpdateReplicationConfigurationTemplateRequest +UpdateReplicationGroupMemberAction +UpdateReplicationJobRequest +UpdateReplicationSetInput +UpdateReportDefinitionRequest +UpdateReportDefinitionResult +UpdateReportGroupInput +UpdateReportGroupOutput +UpdateReportPlanInput +UpdateReportPlanOutput +UpdateRepositoryDescriptionInput +UpdateRepositoryNameInput +UpdateRepositoryRequest +UpdateRepositoryResult +UpdateRequestValidatorRequest +UpdateRequireCheckIn +UpdateRescoreExecutionPlanRequest +UpdateReservationRequest +UpdateReservationResponse +UpdateResiliencyPolicyRequest +UpdateResiliencyPolicyResponse +UpdateResolverConfigRequest +UpdateResolverConfigResponse +UpdateResolverDnssecConfigRequest +UpdateResolverDnssecConfigResponse +UpdateResolverEndpointRequest +UpdateResolverEndpointResponse +UpdateResolverRequest +UpdateResolverResponse +UpdateResolverRuleRequest +UpdateResolverRuleResponse +UpdateResourceCollectionFilter +UpdateResourceCollectionRequest +UpdateResourceDataSyncRequest +UpdateResourceDefinitionRequest +UpdateResourceEventConfigurationRequest +UpdateResourceInput +UpdateResourceOutput +UpdateResourcePolicyRequest +UpdateResourcePolicyResponse +UpdateResourcePositionRequest +UpdateResourceProfileDetectionsRequest +UpdateResourceProfileRequest +UpdateResourceRequest +UpdateResourceServerRequest +UpdateResourceServerResponse +UpdateResourceSetRequest +UpdateResourceSetResponse +UpdateResourceShareRequest +UpdateResourceShareResponse +UpdateResponseHeadersPolicyRequest +UpdateResponseHeadersPolicyResult +UpdateResponsePlanInput +UpdateRestApiRequest +UpdateResult +UpdateRetrainingSchedulerRequest +UpdateRevealConfigurationRequest +UpdateRevealConfigurationResponse +UpdateRevisionRequest +UpdateRevisionResponse +UpdateRobotApplicationRequest +UpdateRobotApplicationResponse +UpdateRoleAliasRequest +UpdateRoleAliasResponse +UpdateRoleDescriptionRequest +UpdateRoleDescriptionResponse +UpdateRoleRequest +UpdateRoomMembershipRequest +UpdateRoomMembershipResponse +UpdateRoomRequest +UpdateRoomResponse +UpdateRotationRequest +UpdateRouteCalculatorRequest +UpdateRouteCalculatorResponse +UpdateRouteInput +UpdateRouteOutput +UpdateRouteRequest +UpdateRouteResponse +UpdateRouteResponseRequest +UpdateRouteResponseResponse +UpdateRouteResult +UpdateRoutingControlRequest +UpdateRoutingControlResponse +UpdateRoutingControlStateEntries +UpdateRoutingControlStateEntry +UpdateRoutingControlStateRequest +UpdateRoutingControlStatesRequest +UpdateRoutingProfileAgentAvailabilityTimerRequest +UpdateRoutingProfileConcurrencyRequest +UpdateRoutingProfileDefaultOutboundQueueRequest +UpdateRoutingProfileNameRequest +UpdateRoutingProfileQueuesRequest +UpdateRowData +UpdateRuleGroupRequest +UpdateRuleGroupResponse +UpdateRuleMetadataRequest +UpdateRuleRequest +UpdateRuleResponse +UpdateRuleVersionRequest +UpdateRuleVersionResult +UpdateRulesOfIpGroupRequest +UpdateRulesetRequest +UpdateRulesetResponse +UpdateRumMetricDefinitionRequest +UpdateRunGroupRequest +UpdateRuntimeConfigurationInput +UpdateRuntimeConfigurationOutput +UpdateRuntimeOn +UpdateS3ResourcesRequest +UpdateS3ResourcesResult +UpdateSAMLProviderRequest +UpdateSAMLProviderResponse +UpdateSMBFileShareInput +UpdateSMBFileShareOutput +UpdateSMBFileShareVisibilityInput +UpdateSMBFileShareVisibilityOutput +UpdateSMBLocalGroupsInput +UpdateSMBLocalGroupsOutput +UpdateSMBSecurityStrategyInput +UpdateSMBSecurityStrategyOutput +UpdateSSHPublicKeyRequest +UpdateSafetyRuleRequest +UpdateSafetyRuleResponse +UpdateSamplingRuleRequest +UpdateSamplingRuleResult +UpdateScalingParametersRequest +UpdateScalingParametersResponse +UpdateScalingPlanRequest +UpdateSceneRequest +UpdateSceneResponse +UpdateScheduleInput +UpdateScheduleOutput +UpdateScheduleRequest +UpdateScheduleResponse +UpdateScheduledActionRequest +UpdateScheduledActionResponse +UpdateScheduledAuditRequest +UpdateScheduledAuditResponse +UpdateScheduledQueryRequest +UpdateSchedulingPolicyRequest +UpdateSchemaInput +UpdateSchemaRequest +UpdateSchemaResponse +UpdateScriptInput +UpdateScriptOutput +UpdateSecretRequest +UpdateSecretResponse +UpdateSecretVersionStageRequest +UpdateSecretVersionStageResponse +UpdateSecurityConfigRequest +UpdateSecurityConfigResponse +UpdateSecurityGroupForDirectoryControllers +UpdateSecurityGroupRuleDescriptionsEgressRequest +UpdateSecurityGroupRuleDescriptionsEgressResult +UpdateSecurityGroupRuleDescriptionsIngressRequest +UpdateSecurityGroupRuleDescriptionsIngressResult +UpdateSecurityHubConfigurationRequest +UpdateSecurityPolicyRequest +UpdateSecurityPolicyResponse +UpdateSecurityProfileRequest +UpdateSecurityProfileResponse +UpdateSecurityRequest +UpdateSecurityResponse +UpdateSegmentRequest +UpdateSegmentResponse +UpdateSensitivityInspectionTemplateRequest +UpdateServerCertificateRequest +UpdateServerConfigRequest +UpdateServerEngineAttributesRequest +UpdateServerEngineAttributesResponse +UpdateServerRequest +UpdateServerResponse +UpdateServiceAccessPoliciesRequest +UpdateServiceAccessPoliciesResponse +UpdateServiceActionInput +UpdateServiceActionOutput +UpdateServiceInput +UpdateServiceInstanceInput +UpdateServiceInstanceOutput +UpdateServiceIntegrationConfig +UpdateServiceIntegrationRequest +UpdateServiceNetworkRequest +UpdateServiceNetworkResponse +UpdateServiceNetworkVpcAssociationRequest +UpdateServiceNetworkVpcAssociationResponse +UpdateServiceOutput +UpdateServicePipelineInput +UpdateServicePipelineOutput +UpdateServicePrimaryTaskSetRequest +UpdateServicePrimaryTaskSetResponse +UpdateServiceRequest +UpdateServiceResponse +UpdateServiceSettingRequest +UpdateServiceSettingsRequest +UpdateServiceSettingsResponse +UpdateServiceSpecificCredentialRequest +UpdateServiceSyncBlockerInput +UpdateServiceSyncBlockerOutput +UpdateServiceSyncConfigInput +UpdateServiceSyncConfigOutput +UpdateServiceTemplateInput +UpdateServiceTemplateOutput +UpdateServiceTemplateVersionInput +UpdateServiceTemplateVersionOutput +UpdateSettings +UpdateSettingsRequest +UpdateSettingsResponse +UpdateSettingsResult +UpdateShardCountInput +UpdateShardCountOutput +UpdateShareInvitationInput +UpdateShareInvitationOutput +UpdateSignalCatalogRequest +UpdateSignalCatalogResponse +UpdateSignalingChannelInput +UpdateSignature +UpdateSigningCertificateRequest +UpdateSimulationApplicationRequest +UpdateSimulationApplicationResponse +UpdateSipMediaApplicationCallRequest +UpdateSipMediaApplicationCallResponse +UpdateSipMediaApplicationRequest +UpdateSipMediaApplicationResponse +UpdateSipRuleRequest +UpdateSipRuleResponse +UpdateSiteAddressInput +UpdateSiteAddressOutput +UpdateSiteInput +UpdateSiteOutput +UpdateSiteRackPhysicalPropertiesInput +UpdateSiteRackPhysicalPropertiesOutput +UpdateSiteRequest +UpdateSiteResponse +UpdateSizeConstraintSetRequest +UpdateSizeConstraintSetResponse +UpdateSkillGroupRequest +UpdateSlackChannelConfigurationRequest +UpdateSlackChannelConfigurationResult +UpdateSlotRequest +UpdateSlotResponse +UpdateSlotTypeRequest +UpdateSlotTypeResponse +UpdateSmsChannelRequest +UpdateSmsChannelResponse +UpdateSmsTemplateRequest +UpdateSmsTemplateResponse +UpdateSnaplockConfiguration +UpdateSnapshotRequest +UpdateSnapshotResponse +UpdateSnapshotResult +UpdateSnapshotScheduleInput +UpdateSnapshotScheduleOutput +UpdateSolFunctionPackageInput +UpdateSolFunctionPackageOutput +UpdateSolNetworkInstanceInput +UpdateSolNetworkInstanceOutput +UpdateSolNetworkModify +UpdateSolNetworkPackageInput +UpdateSolNetworkPackageOutput +UpdateSource +UpdateSourceApiAssociationRequest +UpdateSourceApiAssociationResponse +UpdateSourceControlFromJobRequest +UpdateSourceControlFromJobResponse +UpdateSourceLocationRequest +UpdateSourceLocationResponse +UpdateSourceServerReplicationTypeRequest +UpdateSpaceRequest +UpdateSpaceResponse +UpdateSqlInjectionMatchSetRequest +UpdateSqlInjectionMatchSetResponse +UpdateStackInput +UpdateStackInstancesInput +UpdateStackInstancesOutput +UpdateStackOutput +UpdateStackRequest +UpdateStackResult +UpdateStackSetInput +UpdateStackSetOutput +UpdateStageRequest +UpdateStageResponse +UpdateStageResult +UpdateStandardsControlRequest +UpdateStateMachineAliasInput +UpdateStateMachineAliasOutput +UpdateStateMachineInput +UpdateStateMachineOutput +UpdateStaticPolicyDefinition +UpdateStatus +UpdateStorageRequest +UpdateStorageResponse +UpdateStorageSystemRequest +UpdateStorageVirtualMachineRequest +UpdateStorageVirtualMachineResponse +UpdateStreamInput +UpdateStreamModeInput +UpdateStreamProcessorRequest +UpdateStreamRequest +UpdateStreamResponse +UpdateStreamingDistributionRequest +UpdateStreamingDistributionResult +UpdateStreamingImageRequest +UpdateStreamingImageResponse +UpdateStudioComponentRequest +UpdateStudioComponentResponse +UpdateStudioInput +UpdateStudioRequest +UpdateStudioResponse +UpdateStudioSessionMappingInput +UpdateSubnetChangeProtectionRequest +UpdateSubnetChangeProtectionResponse +UpdateSubnetGroupRequest +UpdateSubnetGroupResponse +UpdateSubscriberNotificationRequest +UpdateSubscriberNotificationResponse +UpdateSubscriberRequest +UpdateSubscriberResponse +UpdateSubscriptionDefinitionRequest +UpdateSubscriptionRequest +UpdateSubscriptionsToEventBridgeMessage +UpdateSubscriptionsToEventBridgeResponse +UpdateSuiteDefinitionRequest +UpdateSuiteDefinitionResponse +UpdateSvmActiveDirectoryConfiguration +UpdateSystemTemplateRequest +UpdateSystemTemplateResponse +UpdateTLSInspectionConfigurationRequest +UpdateTLSInspectionConfigurationResponse +UpdateTableInput +UpdateTableObjectsRequest +UpdateTableOutput +UpdateTableReplicaAutoScalingInput +UpdateTableReplicaAutoScalingOutput +UpdateTableRequest +UpdateTableResponse +UpdateTableStorageOptimizerRequest +UpdateTableStorageOptimizerResponse +UpdateTagCollectionFilter +UpdateTagOptionInput +UpdateTagOptionOutput +UpdateTagsForDomainRequest +UpdateTagsForResourceMessage +UpdateTaintsPayload +UpdateTarget +UpdateTargetGroupRequest +UpdateTargetGroupResponse +UpdateTargets +UpdateTargetsArchitecture +UpdateTargetsOperatingSystem +UpdateTaskExecutionRequest +UpdateTaskProtectionRequest +UpdateTaskProtectionResponse +UpdateTaskRequest +UpdateTaskSetRequest +UpdateTaskSetResponse +UpdateTaskTemplateRequest +UpdateTaskTemplateResponse +UpdateTeamMemberRequest +UpdateTeamMemberResult +UpdateTemplateActiveVersionRequest +UpdateTemplateActiveVersionResponse +UpdateTemplateAliasRequest +UpdateTemplateAliasResponse +UpdateTemplateGroupAccessControlEntryRequest +UpdateTemplatePermissionsRequest +UpdateTemplatePermissionsResponse +UpdateTemplateRequest +UpdateTemplateResponse +UpdateTemplateSyncConfigInput +UpdateTemplateSyncConfigOutput +UpdateTerminationProtectionInput +UpdateTerminationProtectionOutput +UpdateTestGridProjectRequest +UpdateTestGridProjectResult +UpdateTestSetRequest +UpdateTestSetResponse +UpdateThemeAliasRequest +UpdateThemeAliasResponse +UpdateThemeData +UpdateThemePermissionsRequest +UpdateThemePermissionsResponse +UpdateThemeRequest +UpdateThemeResponse +UpdateThesaurusRequest +UpdateThingGroupRequest +UpdateThingGroupResponse +UpdateThingGroupsForThingRequest +UpdateThingRequest +UpdateThingRuntimeConfigurationRequest +UpdateThingShadowRequest +UpdateThingShadowResponse +UpdateThreatIntelSetRequest +UpdateTieringInput +UpdateTime +UpdateTimeToLiveInput +UpdateTimeToLiveOutput +UpdateTimelineEventInput +UpdateToken +UpdateTopicPermissionsRequest +UpdateTopicPermissionsResponse +UpdateTopicRefreshScheduleRequest +UpdateTopicRefreshScheduleResponse +UpdateTopicRequest +UpdateTopicResponse +UpdateTopicRuleDestinationRequest +UpdateTrackerRequest +UpdateTrackerResponse +UpdateTrafficDistributionRequest +UpdateTrafficPolicyCommentRequest +UpdateTrafficPolicyCommentResponse +UpdateTrafficPolicyInstanceRequest +UpdateTrafficPolicyInstanceResponse +UpdateTrailRequest +UpdateTrailResponse +UpdateTrainingJobRequest +UpdateTrainingJobResponse +UpdateTrialComponentRequest +UpdateTrialComponentResponse +UpdateTrialRequest +UpdateTrialResponse +UpdateTriggerRequest +UpdateTriggerResponse +UpdateTrustAnchorRequest +UpdateTrustRequest +UpdateTrustResult +UpdateTrustStoreRequest +UpdateTrustStoreResponse +UpdateType +UpdateTypeRequest +UpdateTypeResponse +UpdateTypedLinkFacetRequest +UpdateUploadRequest +UpdateUploadResult +UpdateUsageLimitRequest +UpdateUsageLimitResponse +UpdateUsagePlanRequest +UpdateUsageRequest +UpdateUserAccessLoggingSettingsRequest +UpdateUserAccessLoggingSettingsResponse +UpdateUserAttributesRequest +UpdateUserAttributesResponse +UpdateUserDefinedFunctionRequest +UpdateUserHierarchyGroupNameRequest +UpdateUserHierarchyRequest +UpdateUserHierarchyStructureRequest +UpdateUserIdentityInfoRequest +UpdateUserPhoneConfigRequest +UpdateUserPoolClientRequest +UpdateUserPoolClientResponse +UpdateUserPoolDomainRequest +UpdateUserPoolDomainResponse +UpdateUserPoolRequest +UpdateUserProfileRequest +UpdateUserProfileResponse +UpdateUserProfileResult +UpdateUserRequest +UpdateUserRequestItem +UpdateUserRequestItems +UpdateUserResponse +UpdateUserRoutingProfileRequest +UpdateUserSecurityProfilesRequest +UpdateUserSettingsRequest +UpdateUserSettingsResponse +UpdateVPCConnectionRequest +UpdateVPCConnectionResponse +UpdateVPCEConfigurationRequest +UpdateVPCEConfigurationResult +UpdateVTLDeviceTypeInput +UpdateVTLDeviceTypeOutput +UpdateValue +UpdateVariableRequest +UpdateVariantStoreRequest +UpdateVariantStoreResponse +UpdateVehicleError +UpdateVehicleRequest +UpdateVehicleRequestItem +UpdateVehicleResponse +UpdateVehicleResponseItem +UpdateVersion +UpdateViewContentRequest +UpdateViewContentResponse +UpdateViewInput +UpdateViewMetadataRequest +UpdateViewOutput +UpdateVirtualGatewayInput +UpdateVirtualGatewayOutput +UpdateVirtualInterfaceAttributesRequest +UpdateVirtualNodeInput +UpdateVirtualNodeOutput +UpdateVirtualRouterInput +UpdateVirtualRouterOutput +UpdateVirtualServiceInput +UpdateVirtualServiceOutput +UpdateVocabularyFilterRequest +UpdateVocabularyFilterResponse +UpdateVocabularyRequest +UpdateVocabularyResponse +UpdateVodSourceRequest +UpdateVodSourceResponse +UpdateVoiceChannelRequest +UpdateVoiceChannelResponse +UpdateVoiceConnectorGroupRequest +UpdateVoiceConnectorGroupResponse +UpdateVoiceConnectorRequest +UpdateVoiceConnectorResponse +UpdateVoiceProfileDomainRequest +UpdateVoiceProfileDomainResponse +UpdateVoiceProfileRequest +UpdateVoiceProfileResponse +UpdateVoiceTemplateRequest +UpdateVoiceTemplateResponse +UpdateVolumeRequest +UpdateVolumeResponse +UpdateVpcAttachmentRequest +UpdateVpcAttachmentResponse +UpdateVpcEndpointDetail +UpdateVpcEndpointRequest +UpdateVpcEndpointResponse +UpdateVpcIngressConnectionRequest +UpdateVpcIngressConnectionResponse +UpdateVpcLinkRequest +UpdateVpcLinkResponse +UpdateWatchlistRequest +UpdateWatchlistResponse +UpdateWaveRequest +UpdateWebACLRequest +UpdateWebACLResponse +UpdateWebhookInput +UpdateWebhookOutput +UpdateWebhookRequest +UpdateWebhookResult +UpdateWirelessDeviceImportTaskRequest +UpdateWirelessDeviceRequest +UpdateWirelessGatewayRequest +UpdateWirelessGatewayTaskCreate +UpdateWirelessGatewayTaskEntry +UpdateWorkGroupInput +UpdateWorkerFleetRequest +UpdateWorkerFleetResponse +UpdateWorkerRequest +UpdateWorkerResponse +UpdateWorkflowRequest +UpdateWorkflowResponse +UpdateWorkflowStepGroupRequest +UpdateWorkflowStepGroupResponse +UpdateWorkflowStepRequest +UpdateWorkflowStepResponse +UpdateWorkforceRequest +UpdateWorkforceResponse +UpdateWorkgroupRequest +UpdateWorkgroupResponse +UpdateWorkloadInput +UpdateWorkloadOutput +UpdateWorkloadRequest +UpdateWorkloadResponse +UpdateWorkloadShareInput +UpdateWorkloadShareOutput +UpdateWorkspaceAliasRequest +UpdateWorkspaceAuthenticationRequest +UpdateWorkspaceAuthenticationResponse +UpdateWorkspaceBundleRequest +UpdateWorkspaceConfigurationRequest +UpdateWorkspaceImagePermissionRequest +UpdateWorkspaceRequest +UpdateWorkspaceResponse +UpdateWorkteamRequest +UpdateWorkteamResponse +UpdateWorldTemplateRequest +UpdateWorldTemplateResponse +UpdateXMLClassifierRequest +UpdateXssMatchSetRequest +UpdateXssMatchSetResponse +UpdateZonalShiftRequest +UpdatedAt +UpdatedBy +UpdatedDate +UpdatedField +UpdatedLatestPatchVersion +UpdatedReason +UpdatedTime +UpdatedTimestamp +UpdatedToken +UpdaterRequestId +Updates +UpdatesURI +UpfrontCost +UpfrontPrice +UpgradeAppliedSchemaRequest +UpgradeAppliedSchemaResponse +UpgradeAvailability +UpgradeDependencyFailureFault +UpgradeDomainRequest +UpgradeDomainResponse +UpgradeElasticsearchDomainRequest +UpgradeElasticsearchDomainResponse +UpgradeHistories +UpgradeHistory +UpgradeId +UpgradeLensReviewInput +UpgradeName +UpgradeProcessing +UpgradeProfileVersionInput +UpgradePublishedSchemaRequest +UpgradePublishedSchemaResponse +UpgradeStatus +UpgradeStep +UpgradeStepItem +UpgradeStepStatus +UpgradeTarget +UpgradedSchemaArn +UplinkCount +UplinkEchoConfig +UplinkGbps +UplinkSpectrumConfig +Upload +UploadArchiveInput +UploadAvailability +UploadBufferAllocatedInBytes +UploadBufferUsedInBytes +UploadConfiguration +UploadCredentials +UploadDate +UploadDocumentsRequest +UploadDocumentsResponse +UploadEnd +UploadEntityDefinitionsRequest +UploadEntityDefinitionsResponse +UploadId +UploadIdMarker +UploadLayerPartRequest +UploadLayerPartResponse +UploadListElement +UploadMetadata +UploadMultipartPartInput +UploadMultipartPartOutput +UploadNotFoundException +UploadPartCopyOutput +UploadPartCopyRequest +UploadPartOutput +UploadPartRequest +UploadPolicy +UploadPolicySignature +UploadReadSetPartRequest +UploadReadSetPartResponse +UploadSSHPublicKeyRequest +UploadSSHPublicKeyResponse +UploadServerCertificateRequest +UploadServerCertificateResponse +UploadSettings +UploadSigningCertificateRequest +UploadSigningCertificateResponse +UploadSize +UploadSpeed +UploadStart +UploadType +UploadUrl +UploaderConfig +UploaderStatus +Uploads +UploadsList +UpperBound +UpperBoundary +Upsert +UpsertKeys +UpsertRedshiftOptions +UpsertRedshiftTargetOptions +UpsertRowData +UpsertRowsResult +Upsolver +UpsolverDestinationProperties +UpsolverS3OutputFormatConfig +UpstreamRepository +UpstreamRepositoryInfo +Uri +UriEndpoint +UriPath +UriPathRoute +UriPathRouteInput +Uris +Url +UrlEndpoint +UrlEndpointConfig +UrlEndpointInput +UrlEndpointSummary +UrlExclusionPatterns +UrlExpiry +UrlInclusionPatterns +UrlPath +UrlReference +UrlType +Urls +Usage +UsageAccountResult +UsageAllocation +UsageAllocations +UsageByAccount +UsageCriteria +UsageDataSourceResult +UsageDimension +UsageFeatureResult +UsageFlags +UsageInstruction +UsageInstructions +UsageLimit +UsageLimitAlreadyExistsFault +UsageLimitId +UsageLimitList +UsageLimitNotFoundFault +UsageLimits +UsageMetric +UsageMetricBasis +UsageMode +UsageOperation +UsageOperationUpdateTime +UsagePlan +UsagePlanKey +UsagePlanKeys +UsagePlans +UsagePrice +UsageQuantity +UsageRecord +UsageRecordResult +UsageRecords +UsageReportSubscription +UsageReportSubscriptions +UsageResourceResult +UsageStartTimestamp +UsageStatisticType +UsageStatistics +UsageStatisticsFilter +UsageStatisticsSortBy +UsageStopTimestamp +UsageStrategy +UsageTotal +UsageType +UsbDeviceFilterStrings +Use2DSolver +UseAlternateFolderForOnline +UseAmortized +UseAudioRenditionGroup +UseAwsOwnedKey +UseAwsProvidedLatestImage +UseBFile +UseBcpFullLoad +UseBlankCellFormat +UseBlended +UseCase +UseCaseArn +UseCaseDescription +UseCaseId +UseCaseSummaryList +UseCaseType +UseChangeLog +UseCsvNoSupValue +UseCustomCookbooks +UseDefaultIfPreferenceUnavailable +UseDefaultProcessorFeatures +UseDefaults +UseDirectPathFullLoad +UseEarliestTimeOnPointInTimeUnavailable +UseEbsOptimizedInstances +UseExistingClientSecret +UseGeolocationForTimeZone +UseGrouping +UseLakeFormationCredentials +UseLatestRestorableTime +UseLegacyProvider +UseLogit +UseLogminerReader +UseLongIds +UseLongIdsAggregated +UseMiddleboxes +UseNewMappingType +UseOffPeakWindow +UseOpsworksSecurityGroups +UseOrdering +UsePathPrefix +UsePreviousTemplate +UsePreviousValue +UsePrimaryBackgroundColor +UseSameUsername +UseServiceLinkedRole +UseStageCache +UseTaskStartTimeForFullLoadTimestamp +UseThirdPartyBackupDevice +UseUpdateLookUp +Used +UsedCommitment +UsedInstanceCount +User +UserAccessLoggingSettings +UserAccessLoggingSettingsSummary +UserAccessResultItem +UserAccessTaskItem +UserAccessUrl +UserActivities +UserAgent +UserAlreadyExistsFault +UserAndGroupQuotas +UserArn +UserArnSession +UserAttributeNames +UserAttributeUpdateSettings +UserAttributeUpdateSettingsType +UserAttributes +UserAuthConfig +UserAuthConfigInfo +UserBase +UserBucket +UserBucketDetails +UserByPermissionGroup +UserCode +UserConfig +UserConfiguration +UserConfirmationNecessary +UserConfirmed +UserContext +UserContextData +UserContextDataType +UserContextPolicy +UserCount +UserCreateDate +UserData +UserDataFilters +UserDataList +UserDataShared +UserDataValidationParameters +UserDefined +UserDefinedFields +UserDefinedFunction +UserDefinedFunctionInput +UserDefinedFunctions +UserDetail +UserDetailList +UserDetails +UserDoesNotExistException +UserEmail +UserEmailList +UserEnabledAsLocalAdministrator +UserError +UserErrorException +UserErrors +UserFeedback +UserGroup +UserGroupAlreadyExistsFault +UserGroupId +UserGroupIds +UserGroupIdsToAdd +UserGroupIdsToRemove +UserGroupNotFoundFault +UserGroupPendingChanges +UserGroupQuotaExceededFault +UserGroupResolutionConfiguration +UserGroupResolutionMode +UserGroups +UserGroupsUpdateStatus +UserHierarchyGroupSummaryList +UserHierarchyGroups +UserId +UserIdGroupPair +UserIdGroupPairs +UserIdList +UserIdentity +UserIdentityConfiguration +UserIdentityInfo +UserIdentityInfoLite +UserIdentityRoot +UserIds +UserIdsToAdd +UserIdsToRemove +UserImportInProgressException +UserImportJob +UserImportJobType +UserImportJobs +UserInfo +UserInfoEndpoint +UserInteractionRequired +UserInvitationStatus +UserInvitationUrl +UserLambdaValidationException +UserLastModifiedDate +UserList +UserMFASettingList +UserMatch +UserMatchThreshold +UserMatches +UserMetadata +UserMigration +UserName +UserNameAttributeField +UserNameColumn +UserNames +UserNamesToAdd +UserNamesToRemove +UserNotConfirmedException +UserNotFoundException +UserNotFoundFault +UserPassword +UserPausedDetails +UserPendingChanges +UserPhoneConfig +UserPolicyList +UserPool +UserPoolAddOnNotEnabledException +UserPoolAddOns +UserPoolAddOnsType +UserPoolArn +UserPoolClient +UserPoolClientDescription +UserPoolClientId +UserPoolClientType +UserPoolClients +UserPoolConfig +UserPoolConfigs +UserPoolDescriptionType +UserPoolDomain +UserPoolId +UserPoolName +UserPoolPolicyType +UserPoolTaggingException +UserPoolTags +UserPoolType +UserPools +UserProfile +UserProfileAlreadyExistsException +UserProfileArn +UserProfileDetails +UserProfileName +UserProfileNameContains +UserProfileNameEquals +UserProfileNotFoundException +UserProfileSummary +UserProfiles +UserProperty +UserQuickConnectConfig +UserQuotaExceededFault +UserReference +UserRegistrationStatus +UserRole +UserRoleName +UserRules +UserSearchCriteria +UserSearchFilter +UserSearchMatching +UserSearchSubtree +UserSearchSummary +UserSecretId +UserSetting +UserSettings +UserSettingsSummary +UserStackAssociation +UserStackAssociationError +UserStackAssociations +UserStatus +UserStorage +UserStorageMetadata +UserSub +UserSummary +UserSummaryList +UserTags +UserTokenConfiguration +UserTokenConfigurations +UserTrustProviderType +UserTurnInputSpecification +UserTurnIntentOutput +UserTurnOutputSpecification +UserTurnResult +UserTurnSlotOutput +UserTurnSpecification +UserType +UserVolumeEncryptionEnabled +UserVolumeSizeGib +Username +UsernameAttributes +UsernameConfiguration +UsernameConfigurationType +UsernameExistsException +UsernameField +UsernamePassword +UsernamePrefix +Usernames +Users +UsersPerStep +UtcTiming +UtcTimingUri +Utilization +UtilizationByTime +UtilizationMetric +UtilizationPercentage +UtilizationPercentageInUnits +UtilizationStatus +UtilizationsByTime +UtilizedCIDRCount +UtranCid +UtteranceAggregationDuration +UtteranceAudioInputSpecification +UtteranceBotResponse +UtteranceData +UtteranceDataSortBy +UtteranceEvent +UtteranceId +UtteranceInputSpecification +UtteranceLevelTestResultItem +UtteranceLevelTestResults +UtteranceList +UtteranceSpecification +Uuid +VCPU +VCpuCount +VCpuCountRange +VCpuCountRangeRequest +VCpuCountRequest +VCpuInfo +VOICE +VPC +VPCAssociationAuthorizationNotFound +VPCAssociationNotFound +VPCConfig +VPCConfigResponse +VPCConnection +VPCConnectionId +VPCConnectionSummaries +VPCConnectionSummary +VPCConnections +VPCDerivedInfo +VPCDerivedInfoStatus +VPCEConfiguration +VPCEndpoint +VPCEndpointDNSName +VPCId +VPCOptions +VPCRegion +VPCSettings +VPCZoneIdentifier +VPCs +VTLDevice +VTLDeviceARN +VTLDeviceARNs +VTLDeviceProductIdentifier +VTLDeviceType +VTLDeviceVendor +VTLDevices +Valid +ValidCores +ValidDBInstanceModificationsMessage +ValidForInMinutes +ValidFrom +ValidFromDate +ValidNextSteps +ValidProcessorFeatures +ValidStorageOptions +ValidThreadsPerCore +ValidTill +ValidTo +ValidToDate +ValidUntil +ValidUpgradeTarget +ValidUserList +ValidateAssessmentReportIntegrityRequest +ValidateAssessmentReportIntegrityResponse +ValidateConfigurationRequest +ValidateConfigurationSettingsMessage +ValidateE911AddressRequest +ValidateE911AddressResponse +ValidateMatchmakingRuleSetInput +ValidateMatchmakingRuleSetOutput +ValidateOnly +ValidatePipelineDefinitionInput +ValidatePipelineDefinitionOutput +ValidatePipelineRequest +ValidatePipelineResponse +ValidatePolicyFinding +ValidatePolicyRequest +ValidatePolicyResponse +ValidateResourcePolicyRequest +ValidateResourcePolicyResponse +ValidateSecurityProfileBehaviorsRequest +ValidateSecurityProfileBehaviorsResponse +ValidateSolFunctionPackageContentInput +ValidateSolFunctionPackageContentMetadata +ValidateSolFunctionPackageContentOutput +ValidateSolNetworkPackageContentInput +ValidateSolNetworkPackageContentMetadata +ValidateSolNetworkPackageContentOutput +ValidateTemplateInput +ValidateTemplateOutput +Validation +ValidationConfiguration +ValidationConfigurations +ValidationData +ValidationDataConfig +ValidationDataLength +ValidationDomain +ValidationEmails +ValidationError +ValidationErrors +ValidationErrorsEntry +ValidationException +ValidationExceptionErrorArgument +ValidationExceptionField +ValidationExceptionType +ValidationFailedRecords +ValidationFailure +ValidationFailureReason +ValidationFailures +ValidationFraction +ValidationIssue +ValidationMessage +ValidationMethod +ValidationMode +ValidationOutput +ValidationPendingRecords +ValidationProfiles +ValidationResult +ValidationRole +ValidationRule +ValidationSettings +ValidationSpecification +ValidationState +ValidationStateDetails +ValidationStatus +ValidationStatuses +ValidationSuspendedRecords +ValidationWarning +Validator +ValidatorMetric +ValidatorTypes +Validators +Validity +ValidityEndTime +ValidityNotBefore +ValidityPeriod +ValidityStartTime +Value +ValueAsString +ValueAsStringList +ValueAxis +ValueCellStyle +ValueDetection +ValueDetections +ValueForMultipleValues +ValueFrom +ValueHint +ValueHolder +ValueImportanceMap +ValueInIA +ValueInMilliseconds +ValueInStandard +ValueKey +ValueLabelConfiguration +ValueLabelOptions +ValueList +ValueMapping +ValueMappings +ValueOptions +ValueType +ValueWhenUnset +ValueWhenUnsetOption +ValueWithServiceIds +Values +ValuesMap +ValuesToAdd +ValuesToRemove +VarCharValue +Variable +VariableDefinition +VariableEntry +VariableImpactExplanation +VariableImportanceMetrics +VariableTags +VariableValue +Variables +Variant +VariantImportItemDetail +VariantImportItemSource +VariantImportJobItem +VariantName +VariantProperty +VariantPropertyType +VariantStatus +VariantStoreItem +Variation +VariationConfig +VaultARN +VaultAccessPolicy +VaultList +VaultLockPolicy +VaultName +VaultNames +VaultNotificationConfig +VaultState +VaultType +VbrQuality +Vc3Class +Vc3Settings +VcenterBasedRemoteInfo +VcenterClient +VcfOptions +VchipAction +Vcpu +VdmAttributes +VdmEnabled +VdmOptions +VectorConfig +VectorCounters +VectorEnrichmentJobErrorDetails +VectorEnrichmentJobExportErrorDetails +VectorEnrichmentJobInputConfig +VectorEnrichmentJobS3Data +VectorEnrichmentJobSummaries +VectorType +Veeva +VeevaConnectorProfileCredentials +VeevaConnectorProfileProperties +VeevaSourceProperties +VehicleStatus +VehicleSummary +Vendor +VendorCreatedAt +VendorGuidance +VendorId +VendorName +VendorProperties +VendorSeverity +VendorUpdatedAt +Verb +Verbose +VerificationAttributes +VerificationException +VerificationFailedException +VerificationKeyArn +VerificationKeyCheckValue +VerificationKeyIdentifier +VerificationMessage +VerificationMessageTemplate +VerificationMessageTemplateType +VerificationResponse +VerificationState +VerificationStatus +VerificationToken +VerificationValue +Verified +VerifiedAccessEndpoint +VerifiedAccessEndpointEniOptions +VerifiedAccessEndpointId +VerifiedAccessEndpointIds +VerifiedAccessEndpointLoadBalancerOptions +VerifiedAccessEndpointStatus +VerifiedAccessEndpoints +VerifiedAccessGroup +VerifiedAccessGroupArn +VerifiedAccessGroupId +VerifiedAccessGroupIds +VerifiedAccessGroups +VerifiedAccessInstance +VerifiedAccessInstanceId +VerifiedAccessInstanceIds +VerifiedAccessInstanceLoggingConfiguration +VerifiedAccessInstances +VerifiedAccessLogCloudWatchLogsDestination +VerifiedAccessLogCloudWatchLogsDestinationOptions +VerifiedAccessLogDeliveryStatus +VerifiedAccessLogKinesisDataFirehoseDestination +VerifiedAccessLogKinesisDataFirehoseDestinationOptions +VerifiedAccessLogOptions +VerifiedAccessLogS3Destination +VerifiedAccessLogS3DestinationOptions +VerifiedAccessLogs +VerifiedAccessSseSpecificationRequest +VerifiedAccessSseSpecificationResponse +VerifiedAccessTrustProvider +VerifiedAccessTrustProviderCondensed +VerifiedAccessTrustProviderId +VerifiedAccessTrustProviderIds +VerifiedAccessTrustProviders +VerifiedAuthorUrl +VerifiedEmailAddresses +VerifiedForSendingStatus +Verify +VerifyAuthChallengeResponse +VerifyAuthRequestCryptogramInput +VerifyAuthRequestCryptogramOutput +VerifyCardValidationDataInput +VerifyCardValidationDataOutput +VerifyDomainDkimRequest +VerifyDomainDkimResponse +VerifyDomainIdentityRequest +VerifyDomainIdentityResponse +VerifyDuration +VerifyEmailAddressRequest +VerifyEmailIdentityRequest +VerifyMacInput +VerifyMacOutput +VerifyMacRequest +VerifyMacResponse +VerifyMode +VerifyOTPMessageRequest +VerifyOTPMessageRequestParameters +VerifyOTPMessageResponse +VerifyPinDataInput +VerifyPinDataOutput +VerifyRequest +VerifyResponse +VerifySMSSandboxPhoneNumberInput +VerifySessionResponse +VerifySoftwareTokenRequest +VerifySoftwareTokenResponse +VerifyStatus +VerifyTrustRequest +VerifyTrustResult +VerifyUserAttributeRequest +Version +VersionArn +VersionBump +VersionConflictException +VersionControlInfo +VersionCount +VersionCreatedDate +VersionDate +VersionDeleteError +VersionDescription +VersionDifferences +VersionId +VersionIdMarker +VersionIds +VersionIdsToStages +VersionInfo +VersionInformation +VersionLabel +VersionLabels +VersionLifecycleConfig +VersionMismatchException +VersionName +VersionNames +VersionNumber +VersionStage +VersionStages +VersionStatus +VersionSummary +VersionToExpire +VersionToPublish +VersionUpdateByJobsConfig +VersioningConfiguration +VersioningSupported +Versions +VersionsLimitExceededException +VersionsToPublish +Vertex +VerticalAccuracy +VerticalAlign +VerticalLayoutConfiguration +VerticalOffset +VerticalOverflowVisibility +VerticalPosition +VerticalTextAlignment +Vertices +VgwTelemetry +Video +VideoArtifactsConfiguration +VideoAttribute +VideoBlackFailoverSettings +VideoBlackSettings +VideoBlackThresholdMsec +VideoCodecSettings +VideoCompositionOffsets +VideoConcatenationConfiguration +VideoConfiguration +VideoContentSourceUrl +VideoDescription +VideoDescriptionName +VideoDescriptions +VideoDetail +VideoDetails +VideoFormat +VideoGenerator +VideoMetadata +VideoParameters +VideoPid +VideoPreprocessor +VideoPreprocessors +VideoQuality +VideoSelector +VideoSelectorColorSpaceSettings +VideoSelectorPid +VideoSelectorProgramId +VideoSelectorSettings +VideoSettings +VideoTooLargeException +View +ViewArn +ViewArns +ViewBillingRequest +ViewBillingResponse +ViewContent +ViewContentSha256 +ViewExpandedText +ViewFrame +ViewId +ViewInputContent +ViewName +ViewOffNadir +ViewOffNadirInput +ViewOriginalText +ViewSummary +ViewSunAzimuth +ViewSunAzimuthInput +ViewSunElevation +ViewSunElevationInput +ViewToken +ViewVersion +ViewVersionSummary +ViewVersionSummaryList +ViewerCertificate +ViewerProtocolPolicy +Views +ViewsSummaryList +ViolatedEntities +ViolatingRoute +ViolatingRoutes +ViolatingSecurityGroups +ViolationDetail +ViolationEvent +ViolationEventAdditionalInfo +ViolationEventOccurrenceRange +ViolationReason +ViolationReport +ViolationTarget +ViolationTargetDescription +ViolatorCount +Violators +VirtualCluster +VirtualGateway +VirtualGatewayBackendDefaults +VirtualGatewayClientPolicy +VirtualGatewayClientPolicyTls +VirtualGatewayData +VirtualGatewayFileAccessLog +VirtualGatewayGrpcConnectionPool +VirtualGatewayHealthCheckPolicy +VirtualGatewayHttp2ConnectionPool +VirtualGatewayHttpConnectionPool +VirtualGatewayListener +VirtualGatewayListenerTls +VirtualGatewayListenerTlsAcmCertificate +VirtualGatewayListenerTlsFileCertificate +VirtualGatewayListenerTlsSdsCertificate +VirtualGatewayListenerTlsValidationContext +VirtualGatewayLogging +VirtualGatewayPortMapping +VirtualGatewayRef +VirtualGatewaySpec +VirtualGatewayStatus +VirtualGatewayTlsValidationContext +VirtualGatewayTlsValidationContextAcmTrust +VirtualGatewayTlsValidationContextFileTrust +VirtualGatewayTlsValidationContextSdsTrust +VirtualGateways +VirtualHost +VirtualInterface +VirtualInterfaceTestHistory +VirtualInterfaces +VirtualMFADevice +VirtualMFADeviceName +VirtualMFADevices +VirtualMachine +VirtualMachineDetails +VirtualMachines +VirtualName +VirtualNetworkId +VirtualNodeData +VirtualNodeGrpcConnectionPool +VirtualNodeHttp2ConnectionPool +VirtualNodeHttpConnectionPool +VirtualNodeRef +VirtualNodeServiceProvider +VirtualNodeSpec +VirtualNodeStatus +VirtualNodeTcpConnectionPool +VirtualObject +VirtualRouterData +VirtualRouterListener +VirtualRouterRef +VirtualRouterServiceProvider +VirtualRouterSpec +VirtualRouterStatus +VirtualServiceBackend +VirtualServiceData +VirtualServiceRef +VirtualServiceSpec +VirtualServiceStatus +VirtualizationType +VirtualizationTypes +VisaPin +VisaPinVerification +VisaPinVerificationValue +Visibility +VisibilityConfig +VisibilityState +VisibilityTimeout +VisibleRange +VisibleRangeOptions +VisibleToAllUsers +VisitorId +Visual +VisualAxisSortOption +VisualCustomAction +VisualCustomActionOperation +VisualId +VisualIds +VisualLayoutOptions +VisualMenuOption +VisualPalette +VisualPublishOptions +VisualReference +VisualReferenceInput +VisualReferenceOutput +VisualSubtitleLabelOptions +VisualTitleLabelOptions +Visuals +Vlan +VlanId +VmServer +VmServerAddress +VmwareCategory +VmwareTag +VmwareTagDescription +VmwareTagName +VmwareTags +VmwareToAwsTagMapping +VmwareToAwsTagMappings +Vocabularies +Vocabulary +VocabularyArn +VocabularyFileUri +VocabularyFilterFileUri +VocabularyFilterInfo +VocabularyFilterMatch +VocabularyFilterMethod +VocabularyFilterName +VocabularyFilterNames +VocabularyFilters +VocabularyId +VocabularyInfo +VocabularyName +VocabularyNames +VocabularyState +VocabularySummary +VocabularySummaryList +VodSource +VodSourceName +Voice +VoiceAnalyticsProcessorConfiguration +VoiceChannelRequest +VoiceChannelResponse +VoiceConnector +VoiceConnectorArn +VoiceConnectorGroup +VoiceConnectorGroupArn +VoiceConnectorGroupId +VoiceConnectorGroups +VoiceConnectorId +VoiceConnectorItem +VoiceConnectorItems +VoiceConnectorRegions +VoiceConnectorSettings +VoiceConnectors +VoiceEnhancementSinkConfiguration +VoiceId +VoiceMessage +VoiceMessageContent +VoiceProfile +VoiceProfileArn +VoiceProfileDomain +VoiceProfileDomainArn +VoiceProfileDomainId +VoiceProfileDomainSummary +VoiceProfileDomains +VoiceProfileId +VoiceProfileSummary +VoiceProfiles +VoiceRecordingConfiguration +VoiceRecordingTrack +VoiceSettings +VoiceSpoofingRisk +VoiceTemplate +VoiceTemplateRequest +VoiceTemplateResponse +VoiceToneAnalysisStatus +VoiceToneAnalysisTask +VoiceToneAnalysisTaskId +VoiceToneAnalysisTaskStatus +VoiceprintGenerationStatus +Voices +VoipDeviceToken +Volume +VolumeARN +VolumeARNs +VolumeAppendModeEnabled +VolumeArn +VolumeAttachment +VolumeAttachmentStatus +VolumeConfiguration +VolumeConfigurations +VolumeDetail +VolumeDiskId +VolumeEncryptionKey +VolumeFilter +VolumeFrom +VolumeId +VolumeIds +VolumeInfo +VolumeInfos +VolumeKmsKeyId +VolumeModification +VolumeMount +VolumeMounts +VolumeName +VolumeNotFound +VolumePath +VolumeProgress +VolumeRecommendation +VolumeRecommendationOption +VolumeRecoveryPointInfo +VolumeRecoveryPointInfos +VolumeRecoveryPointTime +VolumeScanStatus +VolumeSize +VolumeSizeGB +VolumeSizeInBytes +VolumeSizeInGB +VolumeSpecification +VolumeStatistics +VolumeStatus +VolumeStatusAction +VolumeStatusAttachmentStatus +VolumeStatusDetails +VolumeStatusEvent +VolumeStatusInfo +VolumeStatusItem +VolumeStatuses +VolumeThroughput +VolumeType +VolumeUsageByDatasourcePackage +VolumeUsageInBytes +VolumeUsageUpdateTime +VolumeUsageUpdatedTime +VolumeUsedInBytes +VolumeiSCSIAttributes +Volumes +VolumesFrom +VolumesModifications +VolumesPerInstance +VorbisSettings +Vote +VoteOnProposalInput +VoteSummary +VoterMemberId +VotingPolicy +Vp8Settings +Vp9Settings +Vpc +VpcArn +VpcAttachment +VpcAttachments +VpcCidrBlockAssociation +VpcCidrBlockState +VpcClassicLink +VpcConfig +VpcConfigInput +VpcConfigOutput +VpcConfigRequest +VpcConfigResponse +VpcConfigs +VpcConfiguration +VpcConfigurationDescription +VpcConfigurationDescriptions +VpcConfigurationId +VpcConfigurationUpdate +VpcConfigurationUpdates +VpcConfigurations +VpcConnection +VpcConnectionArn +VpcConnectionInfo +VpcConnectionInfoServerless +VpcConnectionProperties +VpcConnections +VpcConnectivity +VpcConnectivityClientAuthentication +VpcConnectivityIam +VpcConnectivitySasl +VpcConnectivityScram +VpcConnectivityTls +VpcConnector +VpcConnectorArn +VpcConnectorName +VpcConnectorRevision +VpcConnectors +VpcDNSTarget +VpcDNSTargets +VpcDescription +VpcDestinationConfiguration +VpcDestinationProperties +VpcDestinationSummary +VpcEndpoint +VpcEndpointConnection +VpcEndpointConnectionId +VpcEndpointConnections +VpcEndpointDetail +VpcEndpointError +VpcEndpointErrorDetail +VpcEndpointErrors +VpcEndpointFilters +VpcEndpointId +VpcEndpointIds +VpcEndpointOwner +VpcEndpointPolicySupported +VpcEndpointService +VpcEndpointServiceName +VpcEndpointState +VpcEndpointSummary +VpcEndpointSummaryList +VpcEndpointType +VpcEndpoints +VpcId +VpcIds +VpcInfoCidrBlockSetDetails +VpcInfoIpv6CidrBlockSetDetails +VpcInfoPeeringOptionsDetails +VpcInformation +VpcIngressConnection +VpcIngressConnectionArn +VpcIngressConnectionName +VpcIngressConnectionSummary +VpcIngressConnectionSummaryList +VpcInterface +VpcInterfaceAttachment +VpcInterfaceName +VpcInterfaceRequest +VpcInterfaces +VpcIpv6CidrBlockAssociation +VpcLink +VpcLinkId +VpcLinkStatus +VpcLinkStatusMessage +VpcLinkVersion +VpcLinks +VpcName +VpcOnly +VpcOptions +VpcOutputSettings +VpcOutputSettingsDescription +VpcOwnerId +VpcPeeringAuthorization +VpcPeeringAuthorizations +VpcPeeringConnection +VpcPeeringConnectionId +VpcPeeringConnectionIds +VpcPeeringConnectionOptionsDescription +VpcPeeringConnectionStateReason +VpcPeeringConnectionStatus +VpcPeeringConnectionVpcInfo +VpcPeeringConnections +VpcSecurityGroupId +VpcSecurityGroupIds +VpcSecurityGroupMembership +VpcSecurityGroupMemberships +VpcSecurityGroups +VpcSettings +VpcSubnetIds +VpcSubnets +VpceId +Vpcs +VpnConnection +VpnConnectionArn +VpnConnectionDeviceSampleConfiguration +VpnConnectionDeviceType +VpnConnectionDeviceTypeId +VpnConnectionDeviceTypes +VpnConnectionId +VpnConnectionIds +VpnConnectionOptions +VpnConnectionOptionsSpecification +VpnConnections +VpnEcmpSupport +VpnGateway +VpnGatewayId +VpnGatewayIds +VpnGateways +VpnPort +VpnProtocol +VpnStaticRoute +VpnTunnelLogOptions +VpnTunnelLogOptionsSpecification +VpnTunnelOptionsSpecification +VpnTunnelOutsideIpAddress +VsamAttributes +VsamDetailAttributes +Vulnerabilities +Vulnerability +VulnerabilityCodeVulnerabilities +VulnerabilityIdAggregation +VulnerabilityVendor +VulnerablePackage +VulnerablePackages +WAFAssociatedItemException +WAFBadRequestException +WAFConfigurationWarningException +WAFDisallowedNameException +WAFDuplicateItemException +WAFEntityMigrationException +WAFExpiredManagedRuleGroupVersionException +WAFInternalErrorException +WAFInvalidOperationException +WAFInvalidParameterException +WAFInvalidPermissionPolicyException +WAFInvalidRegexPatternException +WAFInvalidResourceException +WAFLimitsExceededException +WAFLogDestinationPermissionIssueException +WAFNonEmptyEntityException +WAFNonexistentContainerException +WAFNonexistentItemException +WAFOptimisticLockException +WAFReferencedItemException +WAFServiceLinkedRoleErrorException +WAFStaleDataException +WAFSubscriptionNotFoundException +WAFTagOperationException +WAFTagOperationInternalErrorException +WAFUnavailableEntityException +WAFUnsupportedAggregateKeyTypeException +WAPE +WafAction +WafExcludedRule +WafOverrideAction +WafWebAclArn +Wait +WaitActivity +WaitAndContinueSpecification +WaitFor +WaitForQuietTime +WaitIntervalInSeconds +WaitMinutes +WaitPeriodMs +WaitTime +WaitTimeSeconds +WaitUntil +WaitingActions +WaitingOnIngestion +WakeUp +WakeWord +Warehouse +WarmCount +WarmEnabled +WarmNodeCount +WarmPoolConfiguration +WarmPoolProgress +WarmPoolSize +WarmPoolStatus +WarmPoolStatusEquals +WarmStartConfig +WarmStartType +WarmType +WarmupPercentage +WarmupStatus +WarnCode +WarnMessage +Warning +WarningForeground +WarningGroup +WarningMessage +Warnings +WarningsListItem +Watchlist +WatchlistDetails +WatchlistId +WatchlistIds +WatchlistSummaries +WatchlistSummary +WaterfallChartAggregatedFieldWells +WaterfallChartConfiguration +WaterfallChartFieldWells +WaterfallChartOptions +WaterfallChartSortConfiguration +WaterfallVisual +Watermarks +WavSettings +Wave +WaveAggregatedStatus +WaypointPositions +Wcdma +WcdmaLocalId +WcdmaNmr +WcdmaNmrObj +WcdmaObj +Web +WebACL +WebACLArn +WebACLId +WebACLLockToken +WebACLName +WebACLSummary +WebACLUpdate +WebACLs +WebAclArn +WebAclId +WebClientId +WebCollectorGrantedRoleBasedAccess +WebCollectorS3Access +WebCrawlerConfiguration +WebCrawlerMode +WebDeliveryAllowedFlag +WebIdentityToken +WebLinkFieldMappings +WebServerHostname +WebSocketEndpoint +WebToken +WebUrl +Webhook +WebhookAuthConfiguration +WebhookDefinition +WebhookFilter +WebhookFilterRule +WebserverAccessMode +WebserverLogs +WebserverUrl +WebsiteAuthorizationProviderSummary +WebsiteAuthorizationProviders +WebsiteCaId +WebsiteCaSummary +WebsiteCertificateAuthorities +WebsiteConfiguration +WebsiteRedirectLocation +WebsiteURL +WebsiteUrl +Websocket +WebvttDestinationSettings +WebvttHlsSourceSettings +Wednesday +WeeklyAutoScalingSchedule +WeeklyMaintenanceStartTime +WeeklyMaintenanceWindowStart +WeeklySchedule +WeeklySetting +WeeklySettings +WeeklyStartTime +Weight +WeightLbs +WeightSort +WeightedCapacity +WeightedQuantileLoss +WeightedQuantileLosses +WeightedTarget +WeightedTargetGroup +WelcomeIntent +West +WhatIfAnalyses +WhatIfAnalysisArn +WhatIfAnalysisName +WhatIfAnalysisSummary +WhatIfForecastArn +WhatIfForecastArns +WhatIfForecastExportArn +WhatIfForecastExportName +WhatIfForecastExportSummary +WhatIfForecastExports +WhatIfForecastName +WhatIfForecastSummary +WhatIfForecasts +WhatIfPointScenario +WhatIfRangeScenario +WhitePointX +WhitePointY +Whitelist +WhitelistCidr +WhitelistRules +WhitelistedNames +WhoIsServer +WiFiAccessPoint +WiFiAccessPoints +Width +WidthInPx +WidthPixels +WikiFieldMappings +WindowEndDatetime +WindowExecutionId +WindowExecutionTaskIdentities +WindowExecutionTaskInvocationIdentities +WindowExecutions +WindowId +WindowIdentities +WindowOptions +WindowSize +WindowStartDatetime +WindowStartTime +WindowSummary +WindowTargetId +WindowTaskId +WindowsAuditLogConfiguration +WindowsAuditLogCreateConfiguration +WindowsConfiguration +WindowsFileSystemConfiguration +WindowsResponse +WirelessConnection +WirelessDeviceEventLogOption +WirelessDeviceEventTopic +WirelessDeviceFrameInfo +WirelessDeviceId +WirelessDeviceIdEventTopic +WirelessDeviceImportTask +WirelessDeviceImportTaskList +WirelessDeviceList +WirelessDeviceLogOption +WirelessDeviceLogOptions +WirelessDeviceStatistics +WirelessDeviceType +WirelessDevices +WirelessDevicesToAdd +WirelessDevicesToRemove +WirelessGatewayEventLogOption +WirelessGatewayEventTopic +WirelessGatewayId +WirelessGatewayIdEventTopic +WirelessGatewayList +WirelessGatewayLogOption +WirelessGatewayLogOptions +WirelessGatewayStatistics +WirelessGatewayTaskDefinitionId +WirelessGateways +WirelessGatewaysToAdd +WirelessGatewaysToRemove +WirelessMetadata +WisdomInfo +WithDecryption +WithEvent +WithFederation +WithHeader +WithdrawByoipCidrRequest +WithdrawByoipCidrResponse +WithdrawByoipCidrResult +WithoutSettings +WordCasing +WordCloudAggregatedFieldWells +WordCloudChartConfiguration +WordCloudFieldWells +WordCloudOptions +WordCloudSortConfiguration +WordCloudVisual +WordFilter +WordOrientation +WordPadding +WordScaling +Words +WorkDocsConfiguration +WorkGroup +WorkGroupConfiguration +WorkGroupConfigurationUpdates +WorkGroupName +WorkGroupNames +WorkGroupSummary +WorkGroups +WorkLogFieldMappings +WorkRequesterAccountId +WorkUnitId +WorkUnitIdMax +WorkUnitIdMin +WorkUnitRange +WorkUnitRanges +WorkUnitToken +WorkUnitsExecutedCount +WorkUnitsGeneratedCount +WorkUnitsNotReadyYetException +Worker +WorkerBlock +WorkerBlocks +WorkerConfiguration +WorkerConfigurationDescription +WorkerConfigurationRevisionDescription +WorkerConfigurationRevisionSummary +WorkerConfigurationSummary +WorkerFleet +WorkerId +WorkerIds +WorkerLogDelivery +WorkerLogDeliveryDescription +WorkerLogs +WorkerResourceConfig +WorkerType +WorkerTypeSpecification +WorkerTypeSpecificationInput +Workflow +WorkflowAttributes +WorkflowDetail +WorkflowDetails +WorkflowExecution +WorkflowExecutionAlreadyStartedFault +WorkflowExecutionCancelRequestedEventAttributes +WorkflowExecutionCanceledEventAttributes +WorkflowExecutionCompletedEventAttributes +WorkflowExecutionConfiguration +WorkflowExecutionContinuedAsNewEventAttributes +WorkflowExecutionCount +WorkflowExecutionDetail +WorkflowExecutionFailedEventAttributes +WorkflowExecutionFilter +WorkflowExecutionInfo +WorkflowExecutionInfos +WorkflowExecutionMetadata +WorkflowExecutionOpenCounts +WorkflowExecutionSignaledEventAttributes +WorkflowExecutionStartedEventAttributes +WorkflowExecutionTerminatedEventAttributes +WorkflowExecutionTimedOutEventAttributes +WorkflowGraph +WorkflowId +WorkflowListItem +WorkflowMetrics +WorkflowName +WorkflowParameter +WorkflowRun +WorkflowRunId +WorkflowRunProperties +WorkflowRunStatistics +WorkflowState +WorkflowStatus +WorkflowStep +WorkflowStepAutomationConfiguration +WorkflowStepGroupSummary +WorkflowStepItem +WorkflowStepMetadata +WorkflowStepOutput +WorkflowStepSummary +WorkflowToken +WorkflowType +WorkflowTypeConfiguration +WorkflowTypeDetail +WorkflowTypeFilter +WorkflowTypeInfo +WorkflowTypeInfos +WorkflowUpdate +Workflows +Workforce +WorkforceArn +WorkforceName +WorkforceVpcConfig +WorkforceVpcConfigRequest +WorkforceVpcConfigResponse +Workforces +Workgroup +WorkgroupName +WorkingDirectory +WorkingStorageAllocatedInBytes +WorkingStorageUsedInBytes +Workload +WorkloadArn +WorkloadConfiguration +WorkloadDiscoveryConfig +WorkloadId +WorkloadList +WorkloadName +WorkloadNamePrefix +WorkloadProfile +WorkloadRemarks +WorkloadResourceDefinition +WorkloadShare +WorkloadShareSummaries +WorkloadShareSummary +WorkloadSummaries +WorkloadSummary +WorkloadType +WorkmailAction +Workspace +WorkspaceAccessProperties +WorkspaceBundle +WorkspaceConnectionStatus +WorkspaceCreationProperties +WorkspaceDescription +WorkspaceDirectory +WorkspaceId +WorkspaceIds +WorkspaceImage +WorkspaceProperties +WorkspaceRequest +WorkspaceSecurityGroupId +WorkspaceSettings +WorkspaceState +WorkspaceStatus +WorkspaceSummary +Workspaces +WorkspacesConnectionStatus +WorkspacesDefaultRoleNotFoundException +WorkspacesIpGroup +Workteam +WorkteamArn +WorkteamName +Workteams +WorldConfig +WorldCount +WorldExportJobSummary +WorldFailure +WorldGenerationJobSummary +WorldSummary +Worm +Wrap +WrappedKey +WrappedKeyBlock +WrappedKeyMaterialFormat +WrappingAlgorithm +WrappingKeyAlgorithm +WrappingKeyArn +WrappingKeyCertificate +WrappingKeyCertificateChain +WrappingKeyIdentifier +WrappingKeySpec +Write +WriteAccessPrincipalArns +WriteApplicationSettingsRequest +WriteAttributes +WriteBufferSize +WriteCampaignRequest +WriteCapacityUnits +WriteDashManifest +WriteEventStream +WriteGetObjectResponseRequest +WriteHeader +WriteHlsManifest +WriteIOs +WriteJourneyRequest +WriteManifest +WriteMp4PackagingType +WriteOperation +WriteOperations +WriteRecordsRequest +WriteRecordsResponse +WriteRequest +WriteSegmentRequest +WriteSegmentTimelineInRepresentation +WriteTreatmentResource +WriterVersion +X +XAttributeName +XAxis +XAxisDisplayOptions +XAxisLabelOptions +XAxisLocation +XMLClassifier +XPosition +XRayErrorPercent +XRayFaultPercent +XRayNodeName +XRayNodeType +XRayRequestAverageLatency +XRayRequestCount +XRayThrottlePercent +XSSProtection +Xavc4kIntraCbgProfileSettings +Xavc4kIntraVbrProfileSettings +Xavc4kProfileSettings +XavcClass +XavcHdIntraCbgProfileSettings +XavcHdProfileSettings +XavcProfileSettings +XavcSettings +XksKeyAlreadyInUseException +XksKeyConfiguration +XksKeyConfigurationType +XksKeyId +XksKeyInvalidConfigurationException +XksKeyNotFoundException +XksProxyAuthenticationCredential +XksProxyAuthenticationCredentialType +XksProxyConfiguration +XksProxyConfigurationType +XksProxyConnectivity +XksProxyIncorrectAuthenticationCredentialException +XksProxyInvalidConfigurationException +XksProxyInvalidResponseException +XksProxyUriEndpoint +XksProxyUriEndpointInUseException +XksProxyUriInUseException +XksProxyUriPath +XksProxyUriUnreachableException +XksProxyVpcEndpointServiceInUseException +XksProxyVpcEndpointServiceInvalidConfigurationException +XksProxyVpcEndpointServiceName +XksProxyVpcEndpointServiceNotFoundException +XrayEnabled +XssMatchSet +XssMatchSetId +XssMatchSetSummary +XssMatchSetUpdate +XssMatchSets +XssMatchStatement +XssMatchTuple +XssMatchTuples +Y +YAttributeName +YAxis +YAxisDisplayOptions +YAxisLabelOptions +YAxisLocation +YPosition +YarnEndpointAddress +Yaw +Years +YesVoteCount +Z +Zendesk +ZendeskConnectorProfileCredentials +ZendeskConnectorProfileProperties +ZendeskDestinationProperties +ZendeskMetadata +ZendeskSourceProperties +ZeppelinApplicationConfiguration +ZeppelinApplicationConfigurationDescription +ZeppelinApplicationConfigurationUpdate +ZeppelinMonitoringConfiguration +ZeppelinMonitoringConfigurationDescription +ZeppelinMonitoringConfigurationUpdate +ZeppelinRemoteSparkInterpreterPort +ZipCode +ZipFile +ZipFileContent +ZipFileContentUpdate +ZonalShift +ZonalShiftInResource +ZonalShiftSummary +ZonalStatisticsConfigInput +Zone +ZoneAwarenessConfig +ZoneAwarenessEnabled +ZoneId +ZoneIdentity +ZoneIds +ZoneName +ZoneNames +ZoneS3Path +ZoneS3PathKmsKeyId +ZoneStatus +ZoneType +ZookeeperConnectString +ZookeeperConnectStringTls +ZookeeperId +ZookeeperNodeInfo +ZookeeperVersion +abandon +abilities +ableToUpdateBundle +abortConfig +abortCriteriaList +abortStatement +aborted +aboutText +absolutePath +acceleratorHealth +acceleratorId +acceleratorIds +acceleratorSet +acceleratorType +acceleratorTypeName +acceleratorTypeOfferings +acceleratorTypes +accelerators +accept +acceptDate +acceptRanges +acceptedAt +acceptedBy +acceptedFileTypes +acceptedMediaTypes +acceptedQueryCount +accepteeId +accepts +access +accessControlList +accessDetails +accessDirection +accessFrom +accessKey +accessKeyId +accessKeys +accessLevel +accessLog +accessLogConfig +accessLogSettings +accessLogSubscriptionIdentifier +accessPoint +accessPointAccount +accessPointArn +accessPointId +accessPointPolicy +accessPoints +accessPolicy +accessPolicyArn +accessPolicyCreationDate +accessPolicyDetail +accessPolicyId +accessPolicyIdentity +accessPolicyLastUpdateDate +accessPolicyPermission +accessPolicyResource +accessPolicySummaries +accessPreview +accessPreviewId +accessPreviews +accessRole +accessRules +accessToken +accessTokenId +accessType +accessTypes +account +accountAccessType +accountAggregation +accountAlias +accountEnrollmentStatuses +accountID +accountId +accountIdentifiers +accountIds +accountLevelBpaSync +accountLevelPermissions +accountList +accountName +accountPolicies +accountPolicy +accountSettings +accountSettingsDetail +accountStatus +accountType +accounts +accountsCleanup +accountsWithProvisionedRestoreAccess +accountsWithRestoreAccess +achievableRpoInSecs +achievableRtoInSecs +acknowledgeActionConfiguration +acknowledgeActionRequests +acknowledgeFlow +acknowledgment +acknowledgmentStatus +action +actionArn +actionCode +actionConfiguration +actionConfigurationProperties +actionExecutionDetails +actionExecutionId +actionGroup +actionID +actionIDs +actionId +actionIdentifiers +actionIds +actionName +actionOnTimeout +actionOwnerFilter +actionParams +actionPlanInstructions +actionPlanTitle +actionRevision +actionStates +actionStatus +actionTaken +actionType +actionTypeId +actionTypes +actionVersion +actions +actionsDefinition +actionsExecuted +actionsExecutions +actionsFailed +actionsSkipped +activateCaseSensitiveIdentifier +activateDeepInspection +activationCode +activationExpiry +activationId +activationJobs +active +activeAgentlessCollectors +activeAgents +activeAssessmentsCount +activeConnectors +activeContexts +activeDirectory +activeDirectoryUser +activeExperimentCount +activeFromTimestamp +activeJobId +activeLaunchCount +activeMeCollectors +activeNames +activeServicesCount +activeSessionId +activeUntilTimestamp +activeViolations +activities +activityArn +activityFailedEventDetails +activityId +activityScheduleFailedEventDetails +activityScheduledEventDetails +activityStartedEventDetails +activitySucceededEventDetails +activityTaskCancelRequestedEventAttributes +activityTaskCanceledEventAttributes +activityTaskCompletedEventAttributes +activityTaskFailedEventAttributes +activityTaskScheduledEventAttributes +activityTaskStartedEventAttributes +activityTaskTimedOutEventAttributes +activityTimedOutEventDetails +activityType +actor +actorArn +actualAgentPrompt +actualCapacity +actualElicitedSlot +actualIncrementalBackupSizeInMegaBytes +actualIntent +actualOutput +actualReferenceId +actualValue +add +addAllowedPrefixesToDirectConnectGateway +addAttributes +addColumns +addGroupOwner +addMetrics +addOnRequest +addOnType +addOns +addOrUpdateLabels +addOrUpdateTaints +addOrUpdateVariations +addSecurityGroupIds +addSubnetIds +addThingsToThingGroupParams +addedToServiceDateTime +additionalAllowedHeaders +additionalAttributeNames +additionalAuthenticationProviders +additionalContext +additionalData +additionalDeploymentStatusInfo +additionalEncryptionContext +additionalExposedHeaders +additionalFixedProperties +additionalInfo +additionalInstanceConfiguration +additionalMessage +additionalMetricsToRetain +additionalMetricsToRetainV2 +additionalOccurrences +additionalParameters +additionalParamsForNs +additionalTransientProperties +addon +addonArn +addonName +addonVersion +addonVersions +addons +address +addressFamily +adds +adjustedCvss +adjustments +admin +adminAccountId +adminAccounts +adminRoleArn +adminUserName +adminUserPassword +adminUsername +administrator +administratorAccount +administratorAccountId +adr +adsApplicationConfigurationId +adsApplicationConfigurationName +adsApplicationName +advancedRecognitionSetting +affectedAccounts +affectedImages +affectedInstances +afterBlob +afterBlobId +afterCommitId +afterCommitSpecifier +afterPath +afterTime +agent +agentConnected +agentCpuCores +agentDetails +agentHash +agentHealth +agentHealthCode +agentHealthCodes +agentHealthDetails +agentHealths +agentId +agentIds +agentLastSeenByServiceDateTime +agentNetworkInfoList +agentOrchestrationConfig +agentParameters +agentPreviews +agentProfile +agentPrompt +agentStatus +agentSummary +agentTurn +agentType +agentUpdateStatus +agentVersion +agentlessCollectorSummary +agents +agentsConfigurationStatus +agentsInfo +agentsTruncated +aggregateColumns +aggregateField +aggregateStatus +aggregateTypes +aggregateValue +aggregatedUtterancesSummaries +aggregatedValues +aggregatedVariablesImpactExplanations +aggregatedVariablesImportance +aggregatedVariablesImportanceMetrics +aggregationConfig +aggregationDuration +aggregationField +aggregationLastRefreshedDateTime +aggregationRequest +aggregationType +aggregationWindowEndTime +aggregationWindowStartTime +agreementName +agreements +alarm +alarmActions +alarmCapabilities +alarmConfiguration +alarmEventActions +alarmModelArn +alarmModelDescription +alarmModelName +alarmModelSummaries +alarmModelVersion +alarmModelVersionSummaries +alarmName +alarmNames +alarmNotification +alarmRecommendations +alarmRoleArn +alarmRule +alarmState +alarmSummaries +alarms +alertManagerDefinition +alertTargetArn +alertTargets +alerts +algorithm +algorithmArn +algorithmHyperParameterRanges +algorithmHyperParameters +algorithmImage +algorithmSpecification +alias +aliasPrefix +aliases +alignment +all +allColumns +allMatchesCount +allMatchesSum +allRegions +allSupported +allocationStrategy +allowAudioInput +allowAuthorizerOverride +allowAutoRegistration +allowCleartext +allowConstraintErrors +allowDTMFInput +allowDuplicates +allowExternalPrincipals +allowFleet +allowImageBuilder +allowInterrupt +allowJoinsOnColumnsWithDifferentNames +allowListIds +allowLists +allowMultipleValues +allowOrganizationMemberAccount +allowOverwrite +allowPublicOverrides +allowed +allowedAccounts +allowedAnalyses +allowedAnalysisProviders +allowedColumns +allowedHTTPMethods +allowedInputTypes +allowedJoinOperators +allowedOrganizations +allowedPrefixesToDirectConnectGateway +allowedValues +allowlist +allowsHostedConnections +allowsPublicReadAccess +allowsPublicWriteAccess +allowsUnencryptedObjectUploads +alreadyImplemented +alternateKeys +alternativeDomainNames +alternativeIntents +amazonAddress +amazonSideAsn +ami +amiDistributionConfiguration +amiId +amiLaunchIndex +amiTags +amiType +amis +amount +amznErrorType +analysisCompleteTime +analysisId +analysisMethod +analysisParameters +analysisResults +analysisRule +analysisRulePolicy +analysisRuleType +analysisRuleTypes +analysisStatus +analysisTemplate +analysisTemplateArn +analysisTemplateArns +analysisTemplateIdentifier +analysisTemplateSummaries +analysisType +analyzedAt +analyzedResources +analyzer +analyzerArn +analyzerName +analyzers +anchor +and +androidPaths +annotationFields +annotationImportJobs +annotationStoreVersions +annotationStores +annotationType +anomalies +anomalyInstanceId +answerMachineDetectionConfig +antennaUplinkConfigArn +antiPatternReportS3Object +antipatternReportResultList +antipatternReportS3Object +antipatternReportStatus +antipatternReportStatusMessage +apacheKafkaCluster +api +apiAccess +apiAccessPrincipalArn +apiAssociation +apiCache +apiCachingBehavior +apiCallDateTime +apiCallDetails +apiConfiguration +apiId +apiKey +apiKeyRequired +apiKeySource +apiKeyVersion +apiKeys +apiMode +apiSecretKey +apiServiceName +apiStages +apiSummary +apiToken +apiType +apiVersion +app +appArn +appAuthorization +appAuthorizationArn +appAuthorizationIdentifier +appAuthorizationSummary +appAuthorizationSummaryList +appBundle +appBundleArn +appBundleIdentifier +appBundleSummaryList +appCategory +appComponent +appComponentName +appComponentNames +appComponents +appConfigResource +appId +appIdClientRegex +appIds +appInputSource +appInputSources +appIntegrationArn +appPackagesCleanup +appProtocol +appRegistryAppName +appRegistryAppNames +appSpecContent +appSummaries +appSummary +appTemplateBody +appType +appUnitError +appUnitErrorCategory +appUpload +appValidationConfigurations +appValidationOutput +appValidationStrategy +appVersion +appVersions +application +applicationAggregatedStatus +applicationArn +applicationCallBackURL +applicationComponentCriteria +applicationComponentDetail +applicationComponentId +applicationComponentInfos +applicationComponentStrategies +applicationComponentStrategySummary +applicationConfiguration +applicationConfigurationId +applicationCreationDate +applicationDescription +applicationHostUrl +applicationID +applicationIDs +applicationId +applicationImportFailure +applicationImportSuccess +applicationKey +applicationLastUpdateDate +applicationMode +applicationName +applicationNames +applicationPermissions +applicationPort +applicationPreferences +applicationServicePath +applicationState +applicationSummaries +applicationType +applicationUrl +applicationVersion +applicationVersions +applications +applicationsCount +applicationsInfo +appliedRulePriority +appliedScanFilters +appliedStatus +appliedWeights +applyDuringMaintenanceWindow +applyImmediately +applyMethod +applyNormalization +applyType +approvalRule +approvalRuleContent +approvalRuleEventMetadata +approvalRuleId +approvalRuleName +approvalRuleOverriddenEventMetadata +approvalRuleTemplate +approvalRuleTemplateContent +approvalRuleTemplateDescription +approvalRuleTemplateId +approvalRuleTemplateName +approvalRuleTemplateNames +approvalRules +approvalRulesNotSatisfied +approvalRulesSatisfied +approvalState +approvalStateChangedEventMetadata +approvalStatus +approvals +approved +approvedAt +approximateNumberOfObjectsToProcess +approximateSecondsBeforeTimedOut +apps +appsyncDomainName +arch +architecture +architectures +archiveDescription +archiveId +archiveRule +archiveRules +archiveSize +archived +args +arguments +arn +arns +arrayBaseColumnType +arrayJobId +arrayProperties +artifactCredentials +artifactFileName +artifactId +artifactIdentifier +artifactMediaType +artifactName +artifactRevisions +artifactStore +artifactStores +artifactUrl +artifacts +artifactsOverride +artifactsUrl +asOfTimestamp +ascendingOrder +asi +asn +asnOrg +assertionAttributes +assessment +assessmentArn +assessmentControlsCountByNoncompliantEvidence +assessmentDescription +assessmentFrameworkShareRequest +assessmentFrameworkShareRequests +assessmentId +assessmentMetadata +assessmentName +assessmentReport +assessmentReportEvidenceCount +assessmentReportId +assessmentReportSelection +assessmentReportSelectionCount +assessmentReports +assessmentReportsDestination +assessmentRunAgents +assessmentRunArn +assessmentRunArns +assessmentRunArnsTruncated +assessmentRunCount +assessmentRunName +assessmentRuns +assessmentSchedule +assessmentStatus +assessmentSummaries +assessmentSummary +assessmentTargetArn +assessmentTargetArns +assessmentTargetName +assessmentTargetNamePattern +assessmentTargets +assessmentTemplateArn +assessmentTemplateArns +assessmentTemplateName +assessmentTemplates +asset +assetArn +assetAttributes +assetCompositeModelId +assetCompositeModels +assetContent +assetCreationDate +assetDescription +assetHierarchies +assetId +assetIds +assetLastUpdateDate +assetModelArn +assetModelCompositeModelId +assetModelCompositeModels +assetModelCreationDate +assetModelDescription +assetModelHierarchies +assetModelId +assetModelLastUpdateDate +assetModelName +assetModelProperties +assetModelPropertySummaries +assetModelStatus +assetModelSummaries +assetName +assetProperties +assetProperty +assetPropertySummaries +assetPropertyValue +assetPropertyValueHistory +assetRelationshipSummaries +assetSHA256 +assetSizeBytes +assetStatus +assetSummaries +assetType +assets +assignPublicIp +assignedLabel +assignedValue +assistant +assistantArn +assistantAssociation +assistantAssociationArn +assistantAssociationId +assistantAssociationSummaries +assistantId +assistantSummaries +associateDefaultSecurityGroup +associatePublicIpAddress +associatedApplications +associatedAt +associatedClientDevices +associatedEntity +associatedFields +associatedGateway +associatedGatewayId +associatedGatewayOwnerAccount +associatedIntentName +associatedOn +associatedPortalArns +associatedRepositoryNames +associatedResourceCount +associatedResources +associatedS3Resources +associatedServerId +associatedServerIds +associatedSlotName +associatedTranscripts +associatedTranscriptsPassword +associatedTranscriptsUrl +associatedWithJob +association +associationArn +associationBehavior +associationData +associationId +associationState +associationStatus +associationTime +associationTimestamp +associationType +assumedRole +atBlockchainInstant +atRestEncryptionEnabled +ati +atigData +atodr +attachTime +attachedDiskMapping +attachedObjectIdentifier +attachedResource +attachedTo +attachment +attachmentArn +attachmentId +attachmentLinkUrl +attachmentNetworkAclConfiguration +attachmentSet +attachmentSetId +attachmentState +attachmentType +attachments +attachmentsStatus +attemptDurationSeconds +attemptId +attempts +attribute +attributeGroup +attributeGroupArn +attributeGroups +attributeGroupsDetails +attributeKeys +attributeMap +attributeMatchingModel +attributeName +attributePartition +attributePayload +attributeResults +attributeUpdateMode +attributeValue +attributes +auc +audio +audioAndDTMFInputSpecification +audioChunk +audioFileS3Location +audioInput +audioLogSettings +audioRecognitionStrategy +audioSpecification +audioStream +audioVoiceDurationMillis +auditCheckConfigurations +auditCheckToActionsMapping +auditCheckToReasonCodeFilter +auditDetails +auditEvents +auditNotificationTargetConfigurations +auditResults +auditTaskId +auth +authCode +authCodeUrl +authCodeUrls +authDecision +authDefinition +authInfo +authInfos +authKey +authParameters +authRequest +authResults +authTTL +authType +authUrl +authentication +authenticationConfig +authenticationConfiguration +authenticationMethod +authenticationProviders +authenticationType +author +authorArn +authorName +authorization +authorizationApiKeyName +authorizationApiKeyValue +authorizationConfig +authorizationData +authorizationEndpoint +authorizationScopes +authorizationToken +authorizationType +authorized +authorizerArn +authorizerConfig +authorizerCredentials +authorizerDescription +authorizerFunctionArn +authorizerId +authorizerName +authorizerResultTtlInSeconds +authorizerUri +authorizers +autoBranchCreationConfig +autoBranchCreationPatterns +autoCompute +autoEnable +autoEnableNewAccount +autoGenerateForms +autoLaunch +autoMLConfig +autoMLResult +autoMountStatus +autoMounting +autoRegistrationStatus +autoReplicateNewDisks +autoResolve +autoRollbackConfiguration +autoRollbackEnabled +autoScaling +autoScalingConfiguration +autoScalingGroup +autoScalingGroupArn +autoScalingGroupArns +autoScalingGroupName +autoScalingGroupProvider +autoScalingGroupRecommendations +autoScalingGroups +autoScalingMetric +autoSnapshotAddOnRequest +autoSnapshots +autoStartConfiguration +autoStopConfiguration +autoSubDomainCreationPatterns +autoSubDomainIAMRole +autoUpdate +autoUpdateOutdatedInstancesDeploymentIds +autoUpdateOutdatedInstancesRootDeploymentId +automatedDiscoveryFreeTrialStartDate +automaticRenewal +automaticStopTimeMinutes +automaticTerminationMode +automationExecutions +autoprovision +autotrack +auxiliaryApps +availability +availabilityZone +availabilityZoneId +availabilityZoneIds +availabilityZones +available +availableMacSecPortSpeeds +availablePlatforms +availablePortSpeeds +availableProviders +avcLevel +avcProfile +average +awayFrom +awsAccount +awsAccountId +awsAccountIds +awsAccountName +awsAccountNumber +awsAccounts +awsDevice +awsDeviceV2 +awsEc2Instance +awsEcrContainerImage +awsGroundStationAgentEndpoint +awsIamConfig +awsInstanceID +awsIotJobArn +awsIotJobId +awsIotSqlVersion +awsJobAbortConfig +awsJobExecutionsRolloutConfig +awsJobPresignedUrlConfig +awsJobTimeoutConfig +awsLambdaFunction +awsLogicalDeviceId +awsOrganization +awsRegion +awsSecretStoreArn +awsService +awsServices +awsSignerJobId +awsSso +awsvpcConfiguration +azMode +backendDefaults +backendEnvironment +backendEnvironmentArn +backendEnvironments +backends +backfillStatus +backloggedStorageBytes +backupId +backupMode +backupProgressInMegaBytes +backupRetentionEnabled +badge +badgeEnabled +badgeRequestUrl +balance +bandwidth +bandwidthAllocation +bandwidthThrottling +base +baseCapacity +baseCommitId +baseConfigurationItems +baseEjectionDuration +baseModelArn +baseModelArnEquals +baseModelIdentifier +baseModelName +basePath +baseProcessingInstanceType +baseProcessingInstanceVolumeSizeInGB +baseProcessingJob +baseRatePerMinute +baseScore +baseStat +baseTableTTL +basic +basicAuthCredentials +batch +batchDeleteDetectorErrorEntries +batchImports +batchInferenceJob +batchInferenceJobArn +batchInferenceJobConfig +batchInferenceJobs +batchItemId +batchJobDefinitions +batchJobExecutions +batchJobIdentifier +batchMode +batchPolicy +batchPredictions +batchPutMessageErrorEntries +batchReportMode +batchSegmentJob +batchSegmentJobArn +batchSegmentJobs +batchSize +batchUpdateDetectorErrorEntries +beforeBlob +beforeBlobId +beforeCommitId +beforeCommitSpecifier +beforePath +beforeTime +begin +beginDate +beginInclusive +beginOffsetInclusive +behavior +behaviorCriteriaType +behaviorName +behaviors +behindMajor +behindMinor +belongsToFieldOnRelatedModel +bestRecipeArn +bgpPeerId +bgpPeerState +bgpPeers +bgpStatus +bidPercentage +billableDuration +billableEntityCount +billedDurationInMilliseconds +billedMemoryUsedInMB +billedResourceUtilization +billingDetails +billingGroupArn +billingGroupDescription +billingGroupId +billingGroupMetadata +billingGroupName +billingGroupProperties +billingGroups +billingMethod +billingMinutes +binBy +binKeys +binaryMediaTypes +bindIP +bindingEvent +bindingProperties +bindings +bitMaskLength +bitRightShift +blackListedAgents +blackListedConnectors +blobId +blockDeviceMappings +blockHash +blockNumber +blockPublicAccess +blockPublicAcls +blockPublicPolicy +blockers +blocklist +blocksize +blueGreenDeploymentConfiguration +blueprintId +blueprintName +blueprints +bluetooth +body +booleanValue +bootMode +bootstrapServers +botAlias +botAliasHistoryEvents +botAliasId +botAliasLocaleSettings +botAliasName +botAliasStatus +botAliasSummaries +botAliasTarget +botChannelAssociations +botConfiguration +botExportSpecification +botId +botImportSpecification +botLocaleExportPassword +botLocaleExportSpecification +botLocaleExportUrl +botLocaleHistoryEvents +botLocaleImportSpecification +botLocaleStatus +botLocaleSummaries +botMemberAliasId +botMemberAliasName +botMemberId +botMemberName +botMemberVersion +botMembers +botName +botRecommendationId +botRecommendationResults +botRecommendationStatus +botRecommendationSummaries +botResponseAudioVoiceId +botResponses +botStatus +botSummaries +botTags +botType +botVersion +botVersionLocaleSpecification +botVersionSummaries +botVersions +bots +bpaImpactsLightsail +branch +branchArn +branchCoveragePercentage +branchFilter +branchName +branches +branchesCovered +branchesMissed +breachAction +breakingChanges +browserPolicy +browserSettings +browserSettingsArn +browserType +bucket +bucketAclGrants +bucketArn +bucketCount +bucketCountByEffectivePermission +bucketCountByEncryptionType +bucketCountByObjectEncryptionRequirement +bucketCountBySharedAccessType +bucketCreatedAt +bucketCriteria +bucketDefinitions +bucketKey +bucketLevelPermissions +bucketName +bucketNames +bucketOwner +bucketOwnerAccess +bucketPolicy +bucketPrefix +bucketPublicAccessBlock +bucketStatisticsBySensitivity +buckets +bucketsAggregationType +build +buildBatch +buildBatchArn +buildBatchConfig +buildBatchConfigOverride +buildBatchNumber +buildBatchStatus +buildBatches +buildBatchesNotFound +buildComplete +buildGroups +buildNumber +buildSpec +buildStatus +buildStatusConfig +buildStatusConfigOverride +buildTimeoutInMinutes +buildTimeoutInMinutesOverride +buildType +builds +buildsDeleted +buildsNotDeleted +buildsNotFound +buildspec +buildspecOverride +builtInIntentSummaries +builtInSlotTypeSummaries +bundleId +bundleInformation +bundleList +bundleNames +bundleType +bundles +burstLimit +businessGoals +businessUnitId +buttons +byCustomizationType +byInferenceType +byName +byOutputModality +byProvider +byteBuffer +byteLength +bytes +bytesProcessed +bytesReceived +bytesScanned +bytesSent +bytesWritten +caCertificate +caCertificateId +caCertificateIdentifier +caCertificatePem +cache +cacheAtStartup +cacheBehaviorSettings +cacheBehaviors +cacheClusterEnabled +cacheClusterSize +cacheClusterStatus +cacheConfigurations +cacheDataEncrypted +cacheKeyParameters +cacheNamespace +cacheOverride +cacheStorageConfigurations +cacheTtlInSeconds +cacheType +cachedHTTPMethods +cachingConfig +cachingEnabled +cachingKeys +cak +callbackOverrides +callerReactions +campaign +campaignArn +campaignConfig +campaignId +campaignIds +campaignName +campaignSummaries +campaignSummaryList +campaigns +canDbcFiles +canInterface +canRetry +canSignal +canUnlinkAssociatedModel +canUpdateImage +canUseAsDestination +canUseAsSource +canaryInterval +canaryPercentage +canarySettings +cancel +cancelActive +cancelRequested +cancelTimerDecisionAttributes +cancelTimerFailedEventAttributes +cancelWorkflowExecutionDecisionAttributes +cancelWorkflowExecutionFailedEventAttributes +canceled +canceledChecks +canceledFindingsCount +cancellationStatus +cancelled +cannedAcl +capabilities +capabilityArn +capabilityArns +capabilityConfiguration +capabilityList +capabilityNamespace +capabilitySyncStatus +capacity +capacityConfiguration +capacityId +capacityLimits +capacityProvider +capacityProviderArn +capacityProviderName +capacityProviderStrategy +capacityProviders +capacitySpecification +capacitySpecificationOverride +capacityType +captureConditional +captureNextStep +captureResponse +cardinality +carrier +caseArn +caseData +caseId +caseIdList +caseSensitive +cases +catalogData +catalogType +categoricalHyperParameterRanges +categories +categoriesWithMostFindings +category +categoryCode +categoryName +categorySpecificSummary +cause +causedBy +causedByEventId +ccEmailAddresses +cellReference +cells +cellsToCreate +cellsToUpdate +centerFrequency +certKey +certificate +certificateAlternativeNames +certificateArn +certificateAuthority +certificateAuthorityArn +certificateAuthorityArns +certificateBody +certificateChain +certificateData +certificateDescription +certificateDetail +certificateDomainName +certificateHashes +certificateId +certificateList +certificateMode +certificateName +certificateOverride +certificatePathOnDevice +certificatePem +certificatePrivateKey +certificateSigningRequest +certificateStatuses +certificateUploadDate +certificateVerificationDNSRecord +certificates +certificatesToAdd +certificatesToDelete +cfnStackName +change +changeDescription +changeIdentifier +changeLogs +changeRequests +changeType +changesetArn +changesetFormat +changesetId +changesets +channel +channelArn +channelId +channelMessages +channelName +channelRoleArn +channelStorage +channelSummaries +channels +chatChannel +checkCompliant +checkId +checkIds +checkName +checkRunStatus +checkpointConfig +checkpointLabel +checkpointLabelFilter +checks +checksum +childAssetId +childAssetModelId +childConnectionTags +childDirected +childPolicy +childWorkflowExecutionCanceledEventAttributes +childWorkflowExecutionCompletedEventAttributes +childWorkflowExecutionFailedEventAttributes +childWorkflowExecutionStartedEventAttributes +childWorkflowExecutionTerminatedEventAttributes +childWorkflowExecutionTimedOutEventAttributes +children +chop +chronologicalOrder +cidr +cidrBlock +cidrListAliases +cidrs +ciphers +ciphertext +cisaData +city +ckn +claims +clarificationPrompt +className +classes +classifiableObjectCount +classifiableSizeInBytes +classification +classificationDetails +classificationError +classificationResultStatus +classificationScopeId +classificationScopes +classificationType +classificationTypeUpdate +clean +clear +clearMaxDevices +clearResiliencyPolicyArn +clearTimer +clientAliases +clientCertificateId +clientCredentialsArn +clientId +clientIdIssuedAt +clientIds +clientMode +clientName +clientNumber +clientPolicy +clientProperties +clientRequestToken +clientSecret +clientSecretExpiresAt +clientSideTimestamps +clientStatus +clientTimestampMillis +clientToken +clientType +clipboardMode +clock +cloneFrom +cloneUrlHttp +cloneUrlSsh +closeStatus +closeStatusFilter +closeTimeFilter +closeTimestamp +closedFindings +closingResponse +cloudFormationStackRecords +cloudFormationTarget +cloudMetricEnabled +cloudTrailArn +cloudTrailDetails +cloudTrailProperties +cloudWatch +cloudWatchConfig +cloudWatchEncryptionEnabled +cloudWatchLogDelivery +cloudWatchLogGroupArn +cloudWatchLogGroupName +cloudWatchLoggingConfiguration +cloudWatchLogs +cloudWatchLogsArn +cloudWatchLogsConfiguration +cloudWatchLogsLogGroup +cloudWatchLogsRoleArn +cloudWatchMonitoringConfiguration +cloudwatchAlarm +cloudwatchLogUrl +cloudwatchLogs +cloudwatchMetric +cloudwatchRoleArn +cluster +clusterArn +clusterArns +clusterCreationTime +clusterDescription +clusterEndpoint +clusterIdentifier +clusterLogging +clusterName +clusterSecurityGroupId +clusterType +clusterVersion +clusteringKeys +clusters +code +codeArtifactId +codeCommit +codeCoverageSummary +codeCoverages +codeErrors +codeHook +codeHookInterfaceVersion +codeHookSpecification +codeSha256 +codeSigning +codeSnippet +codeSnippetResults +codeVulnerabilityDetails +codeVulnerabilityDetectorName +codeVulnerabilityDetectorTags +codeVulnerabilityFilePath +codebuildRoleArn +codec +codegenJobToCreate +cognitoIdentityPoolId +collaboration +collaborationAnalysisTemplate +collaborationAnalysisTemplateSummaries +collaborationAnalysisTemplates +collaborationArn +collaborationCreatorAccountId +collaborationCreatorDisplayName +collaborationId +collaborationIdentifier +collaborationList +collaborationName +collectionBindingProperties +collectionDetails +collectionEndpoint +collectionErrorDetails +collectionFilters +collectionProperties +collectionScheme +collectionStatus +collectionSummaries +collectorHealth +collectorId +collectorVersion +column +columnCount +columnDefault +columnDescription +columnDescriptions +columnIds +columnIndex +columnMap +columnMetadata +columnName +columnNames +columns +combineArtifacts +command +commandLineArguments +comment +commentBody +commentId +comments +commentsForComparedCommitData +commentsForPullRequestData +commit +commitId +commitIds +commitMessage +commitNum +commitSpecifier +commitTime +commitTimestampInMillis +commitment +commitmentConfiguration +commitmentDuration +commitmentExpirationTime +commitmentInformation +commitmentLength +commits +committer +commonName +communicationBody +communicationTypes +communications +company +comparator +comparison +comparisonOperator +compatibilities +compatible +compatibleDevices +compatibleEnvironmentTemplates +compatibleNamespaceVersion +complete +completeTime +completeWorkflowExecutionDecisionAttributes +completeWorkflowExecutionFailedEventAttributes +completed +completedAt +completedJobs +completedOn +completedSteps +completedTime +completionStatus +completionTime +completionTimeRange +compliance +complianceCheck +complianceDrifts +complianceStatus +complianceType +compliantChecks +compliantEvidenceCount +component +componentArn +componentBuildVersionArn +componentCandidates +componentCompliances +componentDependencies +componentId +componentLambdaParameters +componentName +componentPlatforms +componentRecommendations +componentRoleArn +componentState +componentStatuses +componentSummaryList +componentToCreate +componentType +componentTypeId +componentTypeName +componentTypeSummaries +componentUpdatePolicy +componentUpdates +componentVersion +componentVersionArn +componentVersionList +componentVersions +components +compositeModel +compositeSlotTypeSetting +compressed +compression +compressionType +compute +computeEnvironment +computeEnvironmentArn +computeEnvironmentName +computeEnvironmentOrder +computeEnvironments +computeLocation +computePlatform +computeReservation +computeResources +computeType +computeTypeOverride +computeTypesAllowed +computedDesiredCount +computerAttributes +concat +conclusionStatement +concurrentBuildLimit +concurrentDeploymentPercentage +condition +conditionLanguageVersion +conditional +conditionalBranches +confidence +confidenceLevel +config +configArn +configData +configDetails +configFileName +configHistoryDeliveryInfo +configId +configList +configParameters +configRecommendations +configSnapshotDeliveryInfo +configSnapshotDeliveryProperties +configSnapshotId +configStreamDeliveryInfo +configType +configVersion +configuration +configurationId +configurationIds +configurationItemCaptureTime +configurationItemMD5Hash +configurationItemStatus +configurationItems +configurationOptions +configurationOverrides +configurationProfileId +configurationProperties +configurationSchema +configurationStateId +configurationStatus +configurationSummary +configurationType +configurationUpdate +configurationUrl +configurationValidationPolicy +configurationValues +configurations +configurationsDownloadUrl +configureOnly +configureScript +configureScriptType +configured +configuredBy +configuredTable +configuredTableArn +configuredTableAssociation +configuredTableAssociationIdentifier +configuredTableAssociationSummaries +configuredTableId +configuredTableIdentifier +configuredTableSummaries +confirmationConditional +confirmationNextStep +confirmationPrompt +confirmationResponse +confirmationState +confirmationStatus +confirmationToken +confirmationUrl +conflictDetailLevel +conflictDetection +conflictHandler +conflictMetadata +conflictMetadataList +conflictResolution +conflictResolutionStrategy +conflicts +connectContactFlowId +connectInstanceConfig +connectInstanceId +connectInstanceOnboardingJobStatus +connectQueueId +connectSourcePhoneNumber +connected +connectedToSystemTime +connectionArn +connectionId +connectionMode +connectionName +connectionPool +connectionState +connectionType +connections +connectionsBandwidth +connectionsCount +connectivity +connectivityAt +connectivityInfo +connectorArn +connectorConfig +connectorConfiguration +connectorConfigurations +connectorDescription +connectorEntityFields +connectorEntityMap +connectorEntityName +connectorId +connectorLabel +connectorList +connectorMetadata +connectorModes +connectorName +connectorNamePrefix +connectorOperator +connectorOwner +connectorProfileArn +connectorProfileConfig +connectorProfileCredentials +connectorProfileDetails +connectorProfileName +connectorProfileNames +connectorProfileProperties +connectorProvisioningConfig +connectorProvisioningType +connectorRuntimeSettings +connectorState +connectorSummary +connectorSuppliedValueOptions +connectorSuppliedValues +connectorType +connectorTypes +connectorVersion +connectors +consecutiveDatapointsToAlarm +consecutiveDatapointsToClear +consoleUrl +constraints +contactArn +contactEndpoint +contactId +contactList +contactMethods +contactPostPassDurationSeconds +contactPrePassDurationSeconds +contactProtocols +contactStatus +container +containerAction +containerArn +containerConfigurations +containerDefinitions +containerDistributionConfiguration +containerImage +containerImages +containerInstance +containerInstanceArn +containerInstanceArns +containerInstances +containerLogRotationConfiguration +containerName +containerOrchestrationType +containerOverrides +containerParams +containerPath +containerPort +containerPortRange +containerProperties +containerProvider +containerProviderId +containerProviderType +containerRecipe +containerRecipeArn +containerRecipeSummaryList +containerRecommendations +containerService +containerServiceName +containerServices +containerTags +containerType +containers +contains +containsDataFromDeletedResources +content +contentArn +contentConflict +contentDeliveryRules +contentDisposition +contentEncoding +contentExpression +contentHandling +contentId +contentLength +contentLocation +contentRange +contentReference +contentSummaries +contentSummary +contentType +contents +context +contextAttributes +contextRowId +contexts +continentCode +continuationToken +continueAfterTimeout +continueAsNewWorkflowExecutionDecisionAttributes +continueAsNewWorkflowExecutionFailedEventAttributes +continueResponse +continuedExecutionRunId +continuous +continuousHyperParameterRanges +contractAddress +control +controlDomainId +controlDomainInsights +controlId +controlIdentifier +controlInsightsByAssessment +controlInsightsMetadata +controlMappingSources +controlMetadataList +controlName +controlOperation +controlPlaneInstanceType +controlPlanePlacement +controlSet +controlSetId +controlSetName +controlSets +controlSetsCount +controlSources +controlStatus +controlTreatmentName +controlType +controls +controlsCount +controlsCountByNoncompliantEvidence +conversationDurationSeconds +conversationEndState +conversationEndTime +conversationId +conversationLevelResult +conversationLevelTestResults +conversationLevelTestResultsFilterBy +conversationLogSettings +conversationLogs +conversationLogsDataSource +conversationMode +conversationStartTime +conversionProperties +conversionServerID +cookieSynchronizationConfiguration +cookiesAllowList +copyAllowed +copyImageSetInformation +copyPrivateIp +copyTags +coreCount +coreDeviceExecutionStatus +coreDeviceThingName +coreDevices +coreVersion +cores +correlationData +cors +cost +costEstimates +costOptimizing +count +counters +countersToAggregate +country +countryCode +counts +countsByGroup +coveredResources +cpiSecretKey +cpiUserId +cpiUserPassword +cpiUsername +cpu +cpuArchitecture +cpuCount +cpuOptions +cpuPerformanceMetricBasis +cpuUtilizationPercentage +cpuVendorArchitectures +cpus +cr +crawlerArn +crawlerConfiguration +createCollectionDetail +createDate +createDelegationRequest +createDelegationRequests +createPublicIP +createSimulationJobRequests +createStatus +createTime +createTimeRange +createTimestamp +createVersion +createVpcEndpointDetail +created +createdAfter +createdAt +createdAtAfter +createdAtBefore +createdBefore +createdBy +createdCount +createdDate +createdOn +createdReason +createdRequestCount +createdRequests +createdRows +createdTime +createdTimeStamp +createdTimestamp +creationDate +creationDateTime +creationTime +creationTimeAfter +creationTimeBefore +creationTimeInMillis +creationTimeRange +creationTimestamp +creationType +creator +creatorAccountId +creatorDisplayName +creatorId +creatorMemberAbilities +credential +credentialDurationSeconds +credentialProvider +credentialSpecs +credentialType +credentials +credentialsArn +credentialsMap +credentialsParameter +criteria +criteriaList +criterion +critical +crl +crlArn +crlData +crlId +crls +crossAccountRoleArns +csv +csvIndexToVariableMap +csvInputTemplate +cta +cumulativeGasUsed +currencies +currency +currencyCode +current +currentApplicationVersion +currentApplyDate +currentAttemptCount +currentBackupRateInMegaBytesPerSecond +currentBuildSummary +currentConfiguration +currentDeployment +currentDeploymentGroupName +currentEphemeris +currentInstanceGpuInfo +currentInstanceType +currentLabel +currentLicenseConfiguration +currentMemorySize +currentPerformanceRisk +currentPerformanceRiskRatings +currentPhase +currentPlan +currentPricingPlan +currentProgress +currentRevision +currentRevisionId +currentRpoInSecs +currentRtoInSecs +currentServiceConfiguration +currentVersion +cursor +custom +customAuthConfigs +customAuthenticationType +customCodeSigning +customControlsCount +customDNSConfiguration +customDNSServerIP +customDNSServerName +customData +customDataIdentifierId +customDataIdentifierIds +customDataIdentifiers +customDomainName +customDomains +customFields +customHeaders +customImageName +customModelArn +customModelKmsKeyId +customModelName +customModelTags +customModelTrainingParameters +customModelTransformParameters +customPayload +customPlugin +customPluginArn +customPluginState +customPlugins +customProperties +customRules +customVocabularyExportSpecification +customVocabularyImportSpecification +customVocabularyItemList +customVocabularyItems +customVocabularyStatus +customerAccountId +customerAction +customerAddress +customerArtifactPaths +customerDefinedValues +customerId +customerManaged +customerManagedKey +customerManagedKeyArn +customerManagedKeyIdentifier +customerManagedS3 +customerManagedS3Storage +customerRouterConfig +customerVersion +customizationsSupported +cvss +cvss2 +cvss3 +cvssSource +cwes +dailyReportsOnly +dailySchedule +dashboardArn +dashboardCreationDate +dashboardDefinition +dashboardDescription +dashboardEndpoint +dashboardId +dashboardLastUpdateDate +dashboardName +dashboardSummaries +dashboardValidationMessages +data +dataAccessRoleArn +dataApiRoleArn +dataBundles +dataCharacterEncoding +dataCollected +dataCollectionDetails +dataCollectionStatus +dataDelivery +dataDestinationConfigs +dataEncryptionMetadata +dataExtraDimensions +dataFormat +dataItems +dataLakeArn +dataLakeSources +dataLakes +dataLocation +dataLocationConstraint +dataPlaneRouting +dataPrivacy +dataProcessingJobId +dataProtectionStatus +dataPullEndTime +dataPullMode +dataPullStartTime +dataReplicationError +dataReplicationInfo +dataReplicationInitiation +dataReplicationState +dataSet +dataSetImportTasks +dataSetName +dataSetOrg +dataSetPublicationDate +dataSetRequestId +dataSetType +dataSets +dataSize +dataSource +dataSourceArn +dataSourceConfig +dataSourceName +dataSourceNames +dataSourceType +dataSourceUrl +dataSources +dataTimestamp +dataTraceEnabled +dataTransferApi +dataTransferApis +dataType +dataTypeName +dataTypeSpec +dataTypeValue +dataURI +dataValidationMetrics +dataViewArn +dataViewId +dataViews +database +databaseArn +databaseConfigDetail +databaseManagementPreference +databaseMigrationPreference +databaseName +databasePreferences +databaseUrl +databases +datacenterName +dataflowDestinationRegion +dataflowEdges +dataflowEndpointGroupArn +dataflowEndpointGroupId +dataflowEndpointGroupList +dataflowEndpointName +dataflowEndpointRegion +dataflowId +dataflowList +dataflowSourceRegion +datakey +datapointsCollectionPercentage +datapointsToAlarm +dataset +datasetArn +datasetContentSummaries +datasetContentVersionValue +datasetDescription +datasetExportJob +datasetExportJobArn +datasetExportJobs +datasetGroup +datasetGroupArn +datasetGroups +datasetId +datasetImportJob +datasetImportJobArn +datasetImportJobs +datasetName +datasetOrg +datasetPermissions +datasetSummaries +datasetTitle +datasetType +datasets +datastore +datastoreArn +datastoreId +datastoreName +datastorePartitions +datastoreProperties +datastoreStatus +datastoreStorage +datastoreSummaries +datasyncErrorCode +date +dateAdded +dateCreated +dateDue +dateLastRun +dateNextRun +dateRangeFilter +dateUpdated +datesWithoutSupport +datetimeTypeFieldName +dayOfMonth +dayOfWeek +days +dbClusterIdentifier +dbClusterOrInstanceArn +dbConnectionId +dbEngineVersion +dbName +dbPassword +dbPath +dbPaths +dbUser +debugSession +debugSessionEnabled +decimalReturnType +decision +decisionTaskCompletedEventAttributes +decisionTaskCompletedEventId +decisionTaskScheduledEventAttributes +decisionTaskStartedEventAttributes +decisionTaskTimedOutEventAttributes +decisionType +decisions +declinationConditional +declinationNextStep +declinationResponse +decodeConfig +decoderManifestArn +decryptionError +dedicatedServiceAccountId +dedupeString +deepLink +defaultAction +defaultAssessmentReportsDestination +defaultAttributes +defaultAuthorizerName +defaultBranch +defaultBranchName +defaultCacheBehavior +defaultCapacityProviderStrategy +defaultChecked +defaultChildPolicy +defaultClientId +defaultCountryCode +defaultDevices +defaultDisplayVersion +defaultDomain +defaultExecutionStartToCloseTimeout +defaultExportDestination +defaultFormat +defaultGateway +defaultHyperParameterRanges +defaultHyperParameters +defaultIamRoleArn +defaultJobTimeoutMinutes +defaultLambdaRole +defaultLargeStagingDiskType +defaultLayout +defaultLogLevel +defaultParameters +defaultPrefix +defaultProcessOwners +defaultRegistryAlias +defaultResourceConfig +defaultResponse +defaultResultConfiguration +defaultServerSideEncryption +defaultTTL +defaultTargetHostname +defaultTaskHeartbeatTimeout +defaultTaskList +defaultTaskPriority +defaultTaskScheduleToCloseTimeout +defaultTaskScheduleToStartTimeout +defaultTaskStartToCloseTimeout +defaultTimeToLive +defaultValue +defaultValueList +defaultValueSpec +defaultValueSpecification +defaultVariation +defaultVersion +defaultVersionId +defaultVersionName +definedIn +definition +definitionContent +definitionUri +definitionZip +delayInSeconds +delegatedAdmin +delegatedAdminAccount +delegatedAdminAccountId +delegatedAdminAccounts +delegationId +delegationIds +delegations +delete +deleteAdditionalMetricsToRetain +deleteAlertTargets +deleteAuditHistory +deleteBehaviors +deleteCollectionDetail +deleteFiles +deleteOnTermination +deletePipelineProvisioningRepository +deleteReports +deleteResources +deleteScheduledAudits +deleteStack +deleteStream +deleteVpcEndpointDetail +deleted +deletedAt +deletedBranch +deletedPackage +deletedResources +deletes +deletionCharacter +deletionProtected +delimitedTextOptions +delimiter +deliveryChannelName +deliveryFrequency +deliveryStream +deliveryStreamName +deltaSyncConfig +deltaSyncTableName +deltaSyncTableTTL +deltaTime +deltaTimeSessionWindowConfiguration +demodulationConfig +denied +deniesUnencryptedObjectUploads +denyListedAgentlessCollectors +denyListedMeCollectors +dependencies +dependencyType +dependsOn +dependsOnAlarms +deployAsNew +deployed +deployedVersion +deployment +deploymentApplicationConfigs +deploymentArtifacts +deploymentCircuitBreaker +deploymentConfig +deploymentConfigId +deploymentConfigInfo +deploymentConfigName +deploymentConfigsList +deploymentConfiguration +deploymentController +deploymentDetail +deploymentFinishTime +deploymentGroupId +deploymentGroupInfo +deploymentGroupName +deploymentGroupNames +deploymentGroups +deploymentGroupsInfo +deploymentId +deploymentIds +deploymentInfo +deploymentJobs +deploymentName +deploymentOption +deploymentOverview +deploymentPolicies +deploymentReadyOption +deploymentStartTime +deploymentStatus +deploymentStatusMessage +deploymentStatusMessages +deploymentStrategy +deploymentStyle +deploymentTarget +deploymentTargetType +deploymentTargets +deploymentType +deploymentWaitType +deployments +deploymentsInfo +deprecateExistingEntities +deprecated +deprecationDate +deprecationMessage +deregisterTime +deregisteredAt +deregistrationPolicy +descending +description +descriptions +descriptiveText +desiredCapacity +desiredChange +desiredCount +desiredModelArn +desiredModelId +desiredModelUnits +desiredProvisionedModelName +desiredSize +desiredState +desiredStatus +desiredvCpus +destination +destinationAccessToken +destinationAccount +destinationArn +destinationBranch +destinationCommit +destinationCommitId +destinationCommitSpecifier +destinationConfig +destinationConfiguration +destinationConnectionState +destinationConnectorLabel +destinationConnectorProperties +destinationConnectorType +destinationField +destinationFlowConfigList +destinationImageSet +destinationImageSetProperties +destinationInfo +destinationName +destinationOptions +destinationPackageVersions +destinationPath +destinationPort +destinationPrefix +destinationProperties +destinationReference +destinationRegion +destinationRepository +destinationS3BucketName +destinationS3Location +destinationS3Prefix +destinationServerId +destinationSummaries +destinationTableId +destinationType +destinationTypeParams +destinationTypeProperties +destinations +detachedObjectIdentifier +detail +detailedMessage +detailedResultsLocation +details +detailsMap +detectSentiment +detectionPlatforms +detections +detector +detectorDebugOptions +detectorId +detectorModel +detectorModelArn +detectorModelConfiguration +detectorModelDefinition +detectorModelDescription +detectorModelName +detectorModelSummaries +detectorModelVersion +detectorModelVersionSummaries +detectorName +detectorSummaries +detectorTags +detectorVersion +detectorVersionId +detectorVersionStatus +detectorVersionSummaries +detectors +determiningPolicies +devEnvironmentId +device +deviceArn +deviceCapabilities +deviceCapacities +deviceCertificateArn +deviceCertificateId +deviceCode +deviceConfig +deviceDefender +deviceDefenderIndexingMode +deviceHostPaths +deviceId +deviceIdentifier +deviceIdentifierArn +deviceIdentifiers +deviceInstance +deviceInstances +deviceMinutes +deviceName +deviceParameters +devicePermissionRoleArn +devicePool +devicePoolArn +devicePools +deviceQueueInfo +deviceRegistryEnrich +deviceRoleArn +deviceSelectionConfiguration +deviceSelectionResult +deviceShadowEnrich +deviceState +deviceStatus +deviceTemplateName +deviceTemplates +deviceType +deviceUdid +devices +dfeQueryEngine +diagnostics +diagnosticsMode +dialRequests +dialerConfig +dialingCapacity +dialogAction +dialogActionType +dialogCodeHook +dialogState +diffType +differences +digest +dimensionColumns +dimensionName +dimensionNames +dimensionValueOperator +dimensions +directConnectGateway +directConnectGatewayAssociation +directConnectGatewayAssociationProposal +directConnectGatewayAssociationProposals +directConnectGatewayAssociations +directConnectGatewayAttachments +directConnectGatewayId +directConnectGatewayName +directConnectGatewayOwnerAccount +directConnectGatewayState +directConnectGateways +direction +directory +directoryId +directoryName +directoryType +disableActionConfiguration +disableActionRequests +disableAllLogs +disableBackupRetention +disableEmailNotification +disableExecuteApiEndpoint +disableNetworking +disablePlayback +disableSSO +disabledAt +disabledOnInitialization +disabledReason +disassociatedAt +disassociatedDataStorage +disassociatedRepositoryNames +disconnectAfterInSeconds +disconnectReason +disconnectTimeoutInMinutes +discoveredIntentCount +discoveredSlotTypeCount +discoveryArn +discoveryData +discoveryName +discoveryUrl +disk +diskImageFormat +diskName +diskPath +diskSize +diskSizeInGb +diskSnapshot +diskSnapshotInfo +diskSnapshotName +diskSnapshots +disks +display +displayAs +displayId +displayName +displayValue +disruptionScore +distinctOutgoingEdgeLabels +distinctUsers +distribution +distributionConfiguration +distributionConfigurationArn +distributionConfigurationSummaryList +distributionDomainName +distributionHostedZoneId +distributionName +distributions +dns +dnsEntry +dnsIpAddresses +dnsName +dnsPolicy +dnsRecord +dnsRecordCreationState +dnsSearchDomains +dnsServers +dnsStatus +dockerLabels +dockerSecurityOptions +dockerURI +dockerVersion +dockerVolumeConfiguration +dockerfileTemplateData +dockerfileTemplateUri +docs +document +documentIdentifier +documentName +documentParameters +documentSource +documentType +documentVersion +documentation +documentationPartId +documentationVersion +documents +domain +domainArn +domainAssociation +domainAssociationArn +domainAssociations +domainConfigurationArn +domainConfigurationName +domainConfigurationStatus +domainConfigurations +domainDetails +domainEntries +domainEntry +domainEntryPoint +domainId +domainInfo +domainInfos +domainName +domainNameConfig +domainNameConfigs +domainNameStatus +domainNameStatusMessage +domainOwner +domainStatus +domainType +domainValidationOptions +domainValidationRecords +domains +doubleValue +downlinkBandwidthBits +downlinkDelayMs +downlinkJitterMs +downlinkLossPercent +downloadAllowed +downloadArtifactsUrl +downloadConditionFile +downloadUrl +driftStatus +driftType +driver +driverOpts +drop +dryRun +dtcRequestIntervalSeconds +dtmfSpecification +duration +durationExpression +durationInMinutes +durationInNanoSeconds +durationInSeconds +durationRange +durationSeconds +durations +dynamicParameters +dynamoDB +dynamoDBv2 +dynamodb +dynamodbConfig +eTag +earlierTime +earliestRestorableTimestamp +ebs +ebsEncryption +ebsEncryptionKeyArn +ebsSnapshots +ebsVolumeID +ec2 +ec2Configuration +ec2ImageId +ec2InstanceFamily +ec2InstanceID +ec2InstanceId +ec2InstanceImageId +ec2InstanceState +ec2InstanceSubnetId +ec2InstanceTags +ec2InstanceType +ec2InstanceTypes +ec2InstanceVpcId +ec2KeyName +ec2KeyPair +ec2LaunchTemplateID +ec2ScanStatus +ec2SecurityGroupIds +ec2SshKey +ec2SubnetIds +ec2TagFilters +ec2TagSet +ec2TagSetList +ecr +ecrConfiguration +ecrImage +ecrImageArchitecture +ecrImageHash +ecrImagePullerRole +ecrImagePushedAt +ecrImageRegistry +ecrImageRepositoryName +ecrImageTags +ecrRepository +ecrRepositoryName +ecrRepositoryPrefix +ecrRepositoryPrefixes +ecsClusterArn +ecsServiceRecommendations +ecsServices +ecsTarget +edgeLabels +edgeProperties +edgeStructures +editContent +editor +effect +effectiveDateTime +effectiveDeployments +effectiveGasPrice +effectiveOn +effectivePermission +effectivePolicies +effectiveRecommendationPreferences +effectiveSettings +effectiveTime +efsVolumeConfiguration +egressAddress +egressFilter +eksAttempts +eksClusterArn +eksConfiguration +eksProperties +eksPropertiesOverride +eksSourceClusterNamespace +eksSourceName +eksSourceNames +eksSources +elapsed +elapsedReplicationDuration +elapsedTimeInSeconds +elasticsearch +elasticsearchConfig +elbInfoList +element +elements +elevation +elevationReference +elevationUnit +elicitationCodeHook +eligibleToRenew +else +email +emailAddress +emailConfigurations +embed +embeddingDataDeliveryEnabled +emoji +emptyDir +enable +enableActionConfiguration +enableActionRequests +enableAnswerMachineDetection +enableAutoBranchCreation +enableAutoBuild +enableAutoSubDomain +enableBackupRetention +enableBasicAuth +enableBranchAutoBuild +enableBranchAutoDeletion +enableCachingForHttp +enableCodeHookInvocation +enableDynamicFieldUpdate +enableECSManagedTags +enableExecuteCommand +enableIoTLoggingParams +enableManagedSpotTraining +enableMapAutoTagging +enableModelImprovements +enableNotification +enableObjectVersioning +enableOnPublicIp +enablePerformanceMode +enablePullRequestPreview +enableSiteLink +enabled +enabledControls +enablementStatus +encodedInputTranscript +encodedMessage +encoder +encoding +encodings +encrypted +encryptionAlgorithm +encryptionAlgorithmOptions +encryptionConfig +encryptionConfiguration +encryptionContextEquals +encryptionContextSubset +encryptionDisabled +encryptionKey +encryptionKeyArn +encryptionKeyOverride +encryptionMode +encryptionSetting +encryptionSpecification +encryptionSpecificationOverride +encryptionStatus +encryptionType +end +endAt +endBehavior +endCharOffset +endCharacter +endDate +endDateTime +endInclusive +endLine +endOffsetExclusive +endTime +endTimeAfter +endTimeBefore +endTimeInSeconds +endTimeOffsetInNanos +endTimeoutMs +endTimes +endToEndResult +endToEndResultCounts +ended +endedAt +endedTime +endpoint +endpointAddress +endpointArn +endpointConfig +endpointConfiguration +endpointCreateTime +endpointDetails +endpointIdentifier +endpointName +endpointPrivateAccess +endpointPublicAccess +endpointStatus +endpointType +endpoints +endpointsDetails +enforce +engagements +engine +engineDescription +engineType +engineVersion +engineVersionDescription +engineVersions +enhancedFindings +enhancedImageMetadataEnabled +enhancedInfrastructureMetrics +enhancedVpcRouting +entities +entitiesPath +entity +entityAggregates +entityArn +entityArns +entityId +entityIdKey +entityName +entityOverrides +entityPropertyReference +entitySummaries +entityType +entityTypes +entityUrl +entityUrlTemplate +entityValue +entityValues +entries +entry +entryId +entryName +entryPoint +entryPointArguments +enumerationValues +enums +env +environment +environmentAccountConnection +environmentAccountConnectionId +environmentAccountConnections +environmentAccountId +environmentArn +environmentFiles +environmentId +environmentIds +environmentName +environmentTemplate +environmentTemplateVersion +environmentTemplates +environmentTypeOverride +environmentUrl +environmentVariables +environmentVariablesOverride +environments +ephemeralStorage +ephemerides +ephemeris +ephemerisData +ephemerisId +epoch +epss +epssScore +eq +eqExactMatch +error +errorAction +errorCategory +errorCode +errorData +errorDateTime +errorDescription +errorDetails +errorEntries +errorHandlingConfig +errorId +errorInfo +errorInformation +errorMessage +errorName +errorReason +errorReportLocation +errorStack +errorStackTrace +errorTimestamp +errorType +errorTypes +error_description +errored +errors +errorsAndFailedEntriesZip +errorsPerPage +escape +escapeQuotes +essential +estimatedCost +estimatedCostTier +estimatedMinutesRemaining +estimatedMonthlyCost +estimatedMonthlySavings +estimatedOn +estimatedPercentMonthlySavings +estimatedSecondsToCompletion +estimatedSizeInBytes +estimatedTimeRemainingSeconds +etaDateTime +etag +eula +eulaAcceptanceId +eulaAcceptances +eulaId +eulaIds +eulas +evaluateExpressions +evaluateOnExit +evaluated +evaluatedExpression +evaluatedExternalModels +evaluatedModelVersions +evaluation +evaluationContext +evaluationMethod +evaluationOrder +evaluationPeriods +evaluationResult +evaluationRules +evaluationScore +evaluationStrategy +evaluations +event +eventAggregates +eventArn +eventArns +eventAttributionSource +eventBridge +eventBridgeConfig +eventBridgeEnabled +eventBusArn +eventCategories +eventCategory +eventClasses +eventConfigurations +eventCount +eventData +eventDataChecksum +eventDataSizeInBytes +eventDataStoreArn +eventDate +eventDescription +eventID +eventId +eventIngestion +eventList +eventMessage +eventMetadata +eventName +eventNumber +eventOrchestration +eventPattern +eventPredictionSummaries +eventPublishers +eventReason +eventReferences +eventResourceData +eventResults +eventScopeCode +eventSource +eventSources +eventStatusCodes +eventSubscriptions +eventSummaries +eventTime +eventTimestamp +eventTracker +eventTrackerArn +eventTrackers +eventType +eventTypeCategories +eventTypeCategory +eventTypeCode +eventTypeCodes +eventTypeName +eventTypes +eventUpdatedTime +eventValue +eventValueThreshold +eventVariableName +eventVariableNames +eventVariables +eventVersion +events +eventsDeletionStatus +evidence +evidenceAwsAccountId +evidenceAwsServiceSourceCount +evidenceByType +evidenceByTypeComplianceCheckCount +evidenceByTypeComplianceCheckIssuesCount +evidenceByTypeConfigurationDataCount +evidenceByTypeManualCount +evidenceByTypeUserActivityCount +evidenceCount +evidenceDetail +evidenceFileName +evidenceFinderEnabled +evidenceFinderEnablement +evidenceFolder +evidenceFolderId +evidenceFolders +evidenceId +evidenceIds +evidenceInsights +evidenceResourcesIncludedCount +evidenceRule +evidenceSources +evidences +exact +example +exampleReference +exception +exceptionMessage +exceptionName +exceptionTimeToLive +exceptions +excerpt +excludeAppPackagesFromCleanup +excludeMatchedPattern +excludeProperties +excludeReason +excludeVerboseContent +excluded +excludedDatasetColumns +excludedInstanceTypes +excludes +exclusionArns +exclusionByResourceTypes +exclusionPreviews +exclusions +execArgs +executeCommandConfiguration +executeCommandSessionConfiguration +execution +executionAbortedEventDetails +executionArn +executionConfiguration +executionContext +executionCounts +executionDetails +executionEndDate +executionFailedEventDetails +executionFilter +executionID +executionId +executionIds +executionInfo +executionInfos +executionMessage +executionNamePrefix +executionNumber +executionResult +executionRole +executionRoleArn +executionStartDate +executionStartToCloseTimeout +executionStartedEventDetails +executionState +executionStatus +executionStoppedAt +executionSucceededEventDetails +executionSummaries +executionTimedOutEventDetails +executionTimeoutMinutes +executionTimeoutSeconds +executionUrlTemplate +executions +executor +existingAllowedPrefixesToDirectConnectGateway +existingFindingId +existingFindingStatus +existingImageName +existingRuleContentSha256 +exists +exitBehavior +exitCode +expected +expectedAgentPrompt +expectedComplianceStatus +expectedFingerprint +expectedOutput +expectedReferenceId +expectedRevisionId +expectedRpoDescription +expectedRpoInSecs +expectedRtoDescription +expectedRtoInSecs +expectedSequenceToken +expectedStatus +expectedTimestamp +expectedValue +expectedVersion +experiment +experimentCount +experimentTemplate +experimentTemplateId +experimentTemplates +experiments +expiration +expirationDate +expirationInSeconds +expirationTime +expired +expiredLogEventEndIndex +expires +expiresAt +expiresIn +expiresInMinutes +expiresInSec +expiresInSeconds +expiresOn +expiresTime +expiringImageTotalCount +expiryTime +explainMode +explicitDeny +exploitAvailable +exploitObserved +exploitabilityDetails +exponentialRate +export +exportBucketArn +exportConfig +exportConfigType +exportDataFormat +exportID +exportIDs +exportId +exportIds +exportJobs +exportRequestTime +exportSnapshotRecords +exportStatus +exportSummaries +exportTask +exportTasks +exportType +exportedEnvironmentVariables +exportsInfo +expr +expression +expressionString +expressionWithValues +exprs +extendedKeyUsage +extendsFrom +extension +external +externalConnection +externalConnectionName +externalConnections +externalEventsDetail +externalExecutionId +externalExecutionSummary +externalExecutionUrl +externalId +externalIdProperty +externalInitiatedEventId +externalLocation +externalMetricStatus +externalMetricsPreference +externalModel +externalModelEndpointDataBlobs +externalModelEndpoints +externalModelOutputs +externalModels +externalParameters +externalSourceSetting +externalWorkflowExecution +externalWorkflowExecutionCancelRequestedEventAttributes +externalWorkflowExecutionSignaledEventAttributes +extraDataPackageArn +extraHosts +extractedValues +facet +facets +fact +factor +facts +failOnError +failOnFirstDestinationError +failOnWarnings +failWhenMissing +failWorkflowExecutionDecisionAttributes +failWorkflowExecutionFailedEventAttributes +failback +failbackClientID +failbackClientLastSeenByServiceDateTime +failbackInitiationTime +failbackJobID +failbackLaunchType +failbackToOriginalServer +failed +failedAccountIds +failedAccounts +failedAt +failedBatchItems +failedChecks +failedEntries +failedEventCount +failedExecutions +failedFindings +failedFindingsCount +failedItem +failedItems +failedRecordsCount +failedRequestCount +failedRequests +failedS3Resources +failedSet +failedTasks +failedVersions +failedWorldCount +failure +failureBehavior +failureCause +failureCode +failureConditional +failureCount +failureDetails +failureHandlingPolicy +failureMessage +failureNextStep +failureReason +failureReasons +failureResource +failureResponse +failureSummary +failureThresholdPercentage +failureType +failures +fairsharePolicy +fallbackLocation +fallbackResult +families +family +familyPrefix +fargatePlatformConfiguration +fargateProfile +fargateProfileArn +fargateProfileName +fargateProfileNames +fastLaunchConfigurations +feature +featureCount +featureName +featureSet +featureTransformation +featureTransformationArn +featureTransformationParameters +featureVariations +features +federatedUser +federationMode +federationParameters +federationProviderName +federationURN +fetchSubmodules +field +fieldArn +fieldId +fieldLengthRange +fieldLevelMessages +fieldList +fieldLogLevel +fieldName +fieldType +fieldValueRange +fields +fieldsToExport +file +fileContent +fileDescription +fileExistsBehavior +fileFormat +fileFormatConfiguration +fileFormatType +fileId +fileKey +fileLevelMessages +fileLocation +fileMap +fileMd5 +fileMode +fileModeConflict +fileModes +fileName +filePassword +filePath +filePaths +filePosition +fileSize +fileSizes +fileSystemId +fileSystemLocations +fileSystemPolicy +fileSystemType +fileType +fileUploadUrls +fileUploaderConfig +fileVersion +filename +files +filesAdded +filesDeleted +filesUpdated +filter +filterArn +filterBy +filterByName +filterByPublished +filterByRecordingConfigurationArn +filterByState +filterByUserId +filterCriteria +filterExpression +filterFormula +filterGroups +filterName +filterNamePrefix +filterOperators +filterPattern +filterQuery +filterType +filterValue +filterValues +filters +finalCaseStatus +finalRelationalDatabaseSnapshotName +finalSnapshotName +finalSnapshotRetentionPeriod +finalized +finding +findingArn +findingArns +findingCounts +findingCriteria +findingDetails +findingId +findingIdentifiers +findingIds +findingNumber +findingPublishingFrequency +findingReasonCodes +findingSeverityCounts +findingStatus +findingTime +findingType +findingTypes +findings +findingsFilterListItems +findingsMetrics +findingsReportSummaries +fingerprint +fingerprintSHA1 +fingerprintSHA256 +finishedAt +finishedCount +finishedWorldsSummary +firehose +firelensConfiguration +firstBoot +firstByteDateTime +firstEnabledAt +firstEventTimestamp +firstExecutionFrom +firstJoinTime +firstName +firstObservedAt +firstSeen +firstUsedTime +firstUtteredDate +fixAvailable +fixedInVersion +flaggedResources +flatten +fleet +fleetArn +fleetDetails +fleetId +fleetInstanceId +fleetMetrics +fleetName +fleetSummaries +fleetType +fleets +floorplanCount +flowActionsRoleArn +flowArn +flowErrorDeactivationThreshold +flowExecutionId +flowExecutions +flowName +flowStatus +flowStatusMessage +flowTemplateId +flows +folderPath +followUpPrompt +force +forceCanceled +forceDelete +forceDeleteAWSJob +forceDeleteAddOns +forceNewDeployment +forceStop +forceStopAppReplication +forceTerminateApp +forceUefi +forceUpdate +form +formActionType +formFactor +formToCreate +format +formatOptions +formatParams +formatRecordsAs +formatToHeader +formattedRecords +formattedValue +formattedValues +formula +forwardedCookies +forwardedHeaders +forwardedQueryStrings +forwardingConfig +found +foundationModelArn +foundationModelArnEquals +fpr +fqdn +fqdnForActionFramework +fragmentsFilePath +frameAddress +frameMetric +frameMetricData +frameMetrics +frameName +framework +frameworkDescription +frameworkId +frameworkMetadataList +frameworkName +frameworkType +freeTrialConsumed +freeTrialExpiration +freeTrialInfo +freeTrialStartDate +frequency +frequencyInSeconds +friendlyName +from +fromAttachedDisks +fromBlockchainInstant +fromBlueprintId +fromBundleId +fromDate +fromDateTime +fromDiskArn +fromDiskInfo +fromDiskName +fromInstanceArn +fromInstanceName +fromPermissionArn +fromPermissionVersion +fromPort +fromRelationalDatabaseArn +fromRelationalDatabaseBlueprintId +fromRelationalDatabaseBundleId +fromRelationalDatabaseName +fromResourceArn +fromResourceName +fsxWindowsFileServerVolumeConfiguration +fulfillmentActivity +fulfillmentCodeHook +fulfillmentState +fulfillmentUpdatesSpecification +fullString +fullyQualifiedName +function +functionAlias +functionArn +functionArns +functionConfiguration +functionId +functionInstances +functionName +functionNames +functionPackages +functionTags +functionVersion +functions +gasUsed +gatewayArn +gatewayCapabilitySummaries +gatewayId +gatewayName +gatewayPlatform +gatewayRoute +gatewayRouteName +gatewayRoutes +gatewaySummaries +gbInUse +gbPerMonthAllocated +generateDistinctId +generatedFields +generatedFrom +generatedId +generatedPolicies +generatedPolicyResult +generatedSceneMetadata +generationDataSource +generationId +generationJob +generatorId +genericAttachments +genericDataSchema +genericRevisionInfo +getObject +getTokenBalanceInputs +gitCloneDepth +gitCloneDepthOverride +gitHub +gitHubAccountName +gitHubLocation +gitSubmodulesConfig +gitSubmodulesConfigOverride +global +glueConfiguration +glueDataCatalog +gps +gpuCount +gpuIds +gpuMemorySizeInMiB +gpuUnitLimit +gpus +grafanaVersion +grafanaVersions +grammarSlotTypeSetting +grantType +grantee +granteePrincipal +grants +graphSummary +graphqlApi +graphqlApis +greenFleetProvisioningOption +greenGrassGroupId +greengrass +greengrassDeploymentId +greengrassGroupId +greengrassGroupName +greengrassGroupVersionId +greengrassV2 +gremlin +gremlinQuery +groundStation +groundStationId +groundStationList +groundStationName +groundStations +group +groupArn +groupAttribute +groupBy +groupByKeys +groupDesc +groupId +groupIdFilter +groupKey +groupName +groupNumber +groupType +groupWeights +groups +groupsClaim +groupsPrefix +grpcRetryEvents +grpcRoute +gt +gte +haArchitecture +hardLimit +hardware +hardwareId +hasChildEntities +hasErrorEvent +hasFlaggedResources +hasHeaderRow +hasLogicalRedundancy +hasMoreErrors +hasMoreResults +hasNestedEntities +hasTransmissionEcu +hashAlgorithm +hashAlgorithmOptions +hashKeyField +hashKeyType +hashKeyValue +hashed +hashes +headCommitId +header +headerMatches +headerName +headerValue +headers +headersAllowList +headersToInclude +health +healthCheck +healthCheckGracePeriodSeconds +healthCheckIntervalSeconds +healthCheckPath +healthCheckTimeoutSeconds +healthReasons +healthServiceAccessStatusForOrganization +healthStatus +healthyAgentlessCollectors +healthyAgents +healthyConnectors +healthyMeCollectors +healthyThreshold +healthyThresholdCount +heapSize +heartbeatInSeconds +heartbeatTimeout +height +helmChart +hierarchies +hierarchyId +hierarchyInfo +high +highAvailabilityConfig +highlight +highlights +historyFilter +hit +hitCount +hits +homePage +homeRegion +hook +hooksNotCleanedUp +horizontalGap +host +hostAddress +hostKeys +hostName +hostNetwork +hostPath +hostPort +hostPortRange +hostPrefix +hostedZoneId +hostname +hpoConfig +hpoJob +hpoObjective +hpoResourceConfig +http +http2Route +httpApiKeyAuth +httpConfig +httpContext +httpEndpoint +httpMethod +httpProtocolIpv6 +httpPutResponseHopLimit +httpRetryEvents +httpRoute +httpTokens +httpUrlConfiguration +httpUrlProperties +httpUrlSummary +https +httpsRedirectionEnabled +hunkContent +hyperParameters +hyperlinkName +iam +iamArn +iamId +iamInstanceProfileArn +iamInstanceProfileName +iamRegistrationResponse +iamResources +iamRole +iamRoleArn +iamRoles +iamServiceRoleArn +iamSessionArn +iamUser +iamUserArn +iatTTL +iccid +icmpTypeCode +iconUrl +id +idFieldNames +idRef +idToken +idempotencyToken +identifer +identificationHints +identifier +identifiers +identity +identityId +identityProvider +identityProviderArn +identityProviderConfig +identityProviderConfigArn +identityProviderConfigName +identityProviderConfigs +identityProviderDetails +identityProviderName +identityProviderType +identityProviders +identitySource +identitySourceId +identitySources +identityStoreId +identityToken +identityType +identityValidationExpression +ides +idle +idleDisconnectTimeoutInMinutes +idleSessionTTLInSeconds +idleTimeoutMinutes +idpMetadata +ids +ignoreApplicationStopFailures +ignoreEmptyRows +ignoreFailure +ignoreFilterField +ignoreJobChecks +ignorePollAlarmFailure +ignorePublicAcls +ignoreQualField +ignoreWords +image +imageAggregation +imageArn +imageBuildVersionArn +imageConfiguration +imageDataDeliveryEnabled +imageDetail +imageDetails +imageDigest +imageFrameBlob +imageFrameId +imageFrameInformation +imageHash +imageId +imageIdOverride +imageIds +imageKubernetesVersion +imageManifest +imageManifestMediaType +imageOsVersionOverride +imageOverride +imagePackageList +imagePermissions +imagePipeline +imagePipelineAggregation +imagePipelineArn +imagePipelineList +imagePullCredentialsType +imagePullCredentialsTypeOverride +imagePullPolicy +imagePushedAt +imageRecipe +imageRecipeArn +imageRecipeSummaryList +imageResponseCard +imageScanCompletedAt +imageScanFindings +imageScanFindingsSummary +imageScanStatus +imageScanningConfiguration +imageScanningEnabled +imageSetArn +imageSetId +imageSetMetadataBlob +imageSetPropertiesList +imageSetState +imageSetWorkflowStatus +imageSetsMetadataSummaries +imageSha +imageShas +imageSizeInBytes +imageSource +imageSummaryList +imageTag +imageTagDetails +imageTagMutability +imageTags +imageTestsConfiguration +imageTestsEnabled +imageType +imageUri +imageUris +imageUrl +imageVersionArn +imageVersionList +images +impact +implementedBy +implicitDeny +importCompletionTime +importConfig +importDeletedTime +importID +importIDs +importId +importInputLocation +importJobs +importMode +importName +importOptions +importRequestTime +importStatus +importStrategy +importSummaries +importTask +importTaskId +importTaskIds +importType +importUrl +importedAppId +importedResourceId +importedResourceName +importedResourceType +importedValue +impression +imsi +in +inProgress +inProgressChecks +inProgressJobs +inProgressTimeoutInMinutes +inReplyTo +inUseResourceCount +inactivityTimeoutMinutes +inboundExecution +inboundTransitionState +incidentRecord +incidentRecordArn +incidentRecordSource +incidentRecordSummaries +incidentTags +incidentTemplate +incidentTemplateDedupeString +incidentTemplateImpact +incidentTemplateNotificationTargets +incidentTemplateSummary +incidentTemplateTags +incidentTemplateTitle +include +includeAllVersions +includeAvailabilityZones +includeCanceled +includeCertificateDetails +includeCommunications +includeConnectedResources +includeContent +includeDefaultKeyPair +includeDeletedRecords +includeDeletedResources +includeDeprecated +includeDescription +includeDirectives +includeExecutionData +includeFromUpstream +includeGlobalResourceTypes +includeInactive +includeJobDocument +includeJobExecutionState +includeLinkedAccounts +includeMemberAccounts +includeOnlyActiveViolations +includeOnlyStatuses +includeQueuedLoads +includeRelationalDatabaseAvailabilityZones +includeRenditions +includeResolvedCases +includeResourcePlaceholders +includeResultMetadata +includeServiceLevelTemplate +includeShadowTrails +includeSourceFiles +includeStatistics +includeSuppressedAlerts +includeValue +includeValues +includeWaiting +included +includedData +includes +inclusionStatus +incompatibilityMessages +incompatibleDevices +inconclusiveEvidenceCount +incrementFactor +incrementalPullConfig +incrementalRunConfig +incrementalRunType +index +indexName +indexNames +indexOps +indexStatus +indicatorOfCompromise +inferenceAcceleratorOverrides +inferenceAccelerators +inferenceTypesSupported +inferredWorkloadSavings +inferredWorkloadTypes +info +infrastructureConfiguration +infrastructureConfigurationArn +infrastructureConfigurationSummaryList +ingestConfiguration +ingestEndpoint +ingestedEventStatistics +ingestedEventsDetail +ingestedEventsTimeWindow +ingestion +ingestionArn +ingestionDestination +ingestionDestinationIdentifier +ingestionDestinations +ingestionIdentifier +ingestionMode +ingestionTime +ingestionType +ingestions +ingressAddress +ingressPortOverride +inheritedProperties +initProcessEnabled +initQueryFile +initialCapacity +initialCaseStatus +initialResponse +initialResponseSetting +initialRevision +initialRun +initialState +initialStateName +initializationConfiguration +initializationScript +initializationScripts +initiated +initiatedBy +initiatedEventId +initiator +inlineDocument +inlineRecipe +inlineSourceMap +input +inputArn +inputArtifactDetails +inputArtifacts +inputCharacter +inputConfiguration +inputContexts +inputDataConfig +inputDataS3Location +inputDefinition +inputDescription +inputDetails +inputFileBucket +inputFileKey +inputIdentifier +inputList +inputModalities +inputMode +inputName +inputParameters +inputPath +inputPayloadEncodingType +inputProperty +inputPropertyValue +inputRecords +inputS3Bucket +inputS3Key +inputS3Uri +inputSourceARN +inputSourceConfig +inputStream +inputSummaries +inputText +inputToken +inputTranscript +inputType +inputVariables +inputs +insecureIngest +insecureSkipVerification +insecureSsl +insecureSslOverride +insights +inspectorScore +inspectorScoreDetails +installState +installedComponents +installedVersion +installingVersion +instance +instanceArn +instanceArns +instanceConfig +instanceConfiguration +instanceCount +instanceGpuInfo +instanceHealth +instanceHealthReason +instanceHealthSummary +instanceId +instanceIdFilter +instanceIdentity +instanceIdentityDocument +instanceIdentityDocumentSignature +instanceIds +instanceInfo +instanceInfos +instanceLabel +instanceMetadataOptions +instanceName +instanceNames +instancePort +instanceProfile +instanceProfileName +instanceProfiles +instanceProperties +instanceRecommendations +instanceRole +instanceSnapshot +instanceSnapshotInfo +instanceSnapshotName +instanceSnapshots +instanceState +instanceStatusFilter +instanceSummary +instanceTags +instanceTarget +instanceTerminationWaitTimeStarted +instanceType +instanceTypeFilter +instanceTypes +instanceUrl +instanceWarmupPeriod +instances +instancesList +instancesSummary +instantiatedVnfInfo +instantiationState +integerHyperParameterRanges +integerValue +integrationConfiguration +integrationHttpMethod +integrationResponses +integrations +intendedForQualification +intent +intentClassificationResults +intentClassificationTestResults +intentClosingSetting +intentConfirmationSetting +intentCount +intentDiscrepancies +intentId +intentLevel +intentLevelSlotResolutionTestResults +intentMatchResult +intentMatchResultCounts +intentName +intentPath +intentSignature +intentState +intentSummaries +intentVersion +intents +intentsCount +interactionMode +interactive +interconnectId +interconnectName +interconnectState +interconnects +interfaceId +interfaceName +interiorCountPerFloorplan +interleaved +intermediateBucketName +internal +internalDeviceName +interpolatedAssetPropertyValues +interpolation +interpolationType +interpretations +interpretedValue +interval +intervalInSeconds +intervalMillis +intervalSeconds +intervalWindowInSeconds +invalidExecutions +invalidNetworkInterfaces +invalidNodes +invalidReason +invalidSignals +invert +invitationId +invitationTimestamp +invitations +invitationsCount +invitedAt +invocationLabel +invokeModelEndpointRoleArn +invokedBy +invokedIntentSamples +invoker +invokerRoleName +iops +iosPaths +iotAnalytics +iotEvents +iotEventsDestinationConfiguration +iotEventsInputIdentifier +iotJobArn +iotJobConfiguration +iotJobId +iotSiteWise +iotSiteWiseAssetModelPropertyIdentifier +iotSiteWiseInputIdentifier +iotSiteWiseMultiLayerStorage +iotTopicPublish +ipAccessSettings +ipAccessSettingsArn +ipAddress +ipAddressAssignment +ipAddressBasedRemoteInfoList +ipAddressConfigurationTimeStamp +ipAddressDetails +ipAddressType +ipAddressV4 +ipCity +ipCountry +ipFamily +ipGeoLocation +ipGroupIds +ipOwner +ipPreference +ipRange +ipRule +ipRules +ipV4Addresses +ipV6Addresses +ipcMode +ips +ipv4Address +ipv4Addresses +ipv6Address +ipv6Addresses +ipv6Cidrs +isAbstract +isActive +isAlias +isAlreadyVerified +isApiKeyAuthSupported +isArchived +isArray +isAttached +isAuthenticated +isAutoIncrement +isAwsOrgEnabled +isBasicAuthSupported +isBigEndian +isBinaryFile +isBootDisk +isCancelled +isCaseSensitive +isComplete +isConcurrent +isConflict +isCreatable +isCurrency +isCustomAuthSupported +isDefault +isDefaultVersion +isDefaultedOnCreate +isDefinedInJob +isDeprecated +isDisabled +isDrill +isEnabled +isEncrypted +isEngineDefault +isExternalId +isFinal +isFromAutoSnapshot +isHasManyIndex +isImported +isInherited +isJoinTable +isLastOp +isLatestForTarget +isLongDurationTest +isMainNode +isMerged +isModifiable +isMonitoredByJob +isMove +isNative +isNonModelSupported +isNullable +isOAuth2Supported +isOptedOut +isPeered +isPreferred +isPrimary +isPrimaryKey +isPrivateLinkEnabled +isPrivateLinkEndpointUrlRequired +isPublic +isQueryable +isRecursive +isRedshiftServerless +isRelationshipSupported +isRequired +isRequiredInEntity +isReservedMinutesCustomer +isResourceTypeDefault +isResumable +isRetrievable +isRevoked +isRoot +isSandboxEnvironment +isSchemaInitialized +isSemVer +isSensitiveField +isServiceLimited +isSigned +isSingleton +isStaticIp +isStoredExternally +isSuppressed +isSystemDisk +isTerminal +isTerminated +isTimeSeries +isTimestampFieldForIncrementalQueries +isTruncated +isTunable +isUpdatable +isUpsertable +isValid +isolationMode +isp +issueCode +issueType +issuedAt +issuer +issuerCA +issuerCertificateIdentifier +issuerCertificateSerialNumber +issuerCertificateSubject +issuerId +issuerUrl +issues +issuesEnabled +issuingAccount +item +itemAttribute +itemCount +itemCounts +itemExplorationConfig +itemId +itemList +items +iteratorType +job +jobArn +jobConfiguration +jobCreationDate +jobDefinition +jobDefinitionArn +jobDefinitionName +jobDefinitions +jobDetails +jobDocument +jobDriver +jobError +jobExecutionSummary +jobExecutionTimeoutMinutes +jobExecutionsRetryConfig +jobExecutionsRolloutConfig +jobExpiresAt +jobID +jobIDs +jobId +jobIdentifier +jobIds +jobImminentExpirationHealthEventArn +jobInput +jobInvoker +jobLastUpdateDate +jobMetadata +jobName +jobOutput +jobOutputPath +jobOwner +jobParameters +jobParams +jobPausedAt +jobPort +jobProcessDetails +jobProperties +jobQueue +jobQueueArn +jobQueueName +jobQueues +jobReason +jobRoleArn +jobRun +jobRunId +jobRuns +jobStatus +jobSummaries +jobSummary +jobSummaryList +jobTags +jobTemplate +jobTemplateArn +jobTemplateData +jobTemplateId +jobTemplateParameters +jobTemplates +jobTimeout +jobTimeoutMinutes +jobToken +jobType +jobUser +jobWorkerExecutorConfiguration +jobs +joinColumns +joinRequired +jsonConfiguration +jsonInputTemplate +jsonKeyToVariableMap +jsonPath +jumboFrameCapable +jwtToken +kafka +kafkaCluster +kafkaClusterClientAuthentication +kafkaClusterEncryptionInTransit +kafkaConnectVersion +keepEmptyFolders +kendraConfiguration +kendraIndex +kernelVersion +key +keyAlgorithm +keyArn +keyId +keyName +keyPair +keyPairName +keyPairs +keyPolicies +keyPrefix +keyRole +keyTemplate +keyType +keyTypes +keyUsage +keyValue +keyspaceName +keyspaces +keyword +keywordInputType +keywordValue +keywords +kind +kinesis +kinesisStreamArn +kmsArn +kmsEncryptionKeyArn +kmsError +kmsKey +kmsKeyArn +kmsKeyId +kmsKeyIdentifier +kmsManaged +kmsMasterKeyId +knowledgeBase +knowledgeBaseArn +knowledgeBaseId +knowledgeBaseSummaries +knowledgeBaseType +knownDependencyCount +kubernetesNamespace +kubernetesNetworkConfig +kubernetesVersion +kxChangesets +kxClusterSummaries +kxDatabases +labMode +label +labelDecorator +labelMapper +labelSchema +labelTimestamp +labels +lagDuration +lagId +lagName +lagState +lags +lambda +lambdaARN +lambdaAction +lambdaArn +lambdaAuthorizerConfig +lambdaCode +lambdaCodeHook +lambdaConfig +lambdaConflictHandlerArn +lambdaConflictHandlerConfig +lambdaEventStructureVersion +lambdaExecutorConfiguration +lambdaFunction +lambdaFunctionArn +lambdaFunctionCompletedEventAttributes +lambdaFunctionExecutionRoleArn +lambdaFunctionFailedEventAttributes +lambdaFunctionFailedEventDetails +lambdaFunctionInfo +lambdaFunctionLastModifiedAt +lambdaFunctionLayers +lambdaFunctionName +lambdaFunctionRecommendations +lambdaFunctionRuntime +lambdaFunctionScheduleFailedEventDetails +lambdaFunctionScheduledEventAttributes +lambdaFunctionScheduledEventDetails +lambdaFunctionStartFailedEventDetails +lambdaFunctionStartedEventAttributes +lambdaFunctionSucceededEventDetails +lambdaFunctionTags +lambdaFunctionTimedOutEventAttributes +lambdaFunctionTimedOutEventDetails +lambdaName +lambdaRole +lambdaTags +lambdaTarget +language +languageAvailability +languages +largeDataDeliveryS3Config +largeVolumeConf +lastAccess +lastActivityDate +lastActivityTimeStamp +lastAnalyzedTimestamp +lastAppComplianceEvaluationTime +lastAssessmentRunArn +lastAttemptTime +lastAttemptedDeployment +lastAttemptedDeploymentId +lastAutomatedDiscoveryTime +lastBuildSubmittedDateTime +lastByteReceived +lastChangedAt +lastChangedBy +lastClientRequestToken +lastCompletedChangesetId +lastContentModificationTime +lastCutover +lastDeployTime +lastDeploymentAttemptedAt +lastDeploymentJob +lastDeploymentStatus +lastDeploymentSucceededAt +lastDeploymentTime +lastDisabledTime +lastDriftEvaluationTime +lastEnabledTime +lastErrorCode +lastErrorMessage +lastEvaluatedAt +lastEventId +lastEventTimestamp +lastHealthPingTime +lastHeartbeatTime +lastIngestionTime +lastInstallationSource +lastJobId +lastJobRunTime +lastKnownExploitAt +lastLaunch +lastLaunchResult +lastLoginTime +lastMessageArrivalTime +lastModelRefreshDate +lastModificationTime +lastModified +lastModifiedAt +lastModifiedBy +lastModifiedDate +lastModifiedDateTime +lastModifiedOn +lastModifiedSecret +lastModifiedTime +lastModifiedTimestamp +lastModifiedUser +lastName +lastObservedAt +lastReachedOutAt +lastRecordedPullTime +lastRecovery +lastRecoveryResult +lastReferencedTime +lastRefreshTimestamp +lastReportedTimestamp +lastResiliencyScoreEvaluationTime +lastResourceAnalyzed +lastResourceAnalyzedAt +lastRunErrorStatus +lastRunExecutionDetails +lastRunMetadataCatalogDetails +lastRunTime +lastScannedAt +lastSeen +lastSeenAt +lastSeenByServiceDateTime +lastSeenDatetime +lastSnapshotDateTime +lastStartTime +lastStartedAt +lastStatisticsComputationTime +lastStatus +lastStatusChange +lastStatusChangeDate +lastStatusChangeTime +lastStatusChangeTimestamp +lastStatusUpdateTimestamp +lastStopTime +lastSucceededDeploymentId +lastSuccessfulComponentDeploymentIds +lastSuccessfulDeployment +lastSuccessfulEnvironmentDeploymentId +lastSuccessfulMergeDate +lastSuccessfulServicePipelineDeploymentId +lastSuccessfulTime +lastSyncedAt +lastTest +lastTriggered +lastTrxTimestampInMillis +lastUpdateDate +lastUpdateDateTime +lastUpdateTime +lastUpdateToPayPerRequestTimestamp +lastUpdated +lastUpdatedAt +lastUpdatedBy +lastUpdatedDataTime +lastUpdatedDate +lastUpdatedDateTime +lastUpdatedOn +lastUpdatedTime +lastUpdatedTimes +lastUpdatedTimestamp +lastUsed +lastUsedDate +lastUsedIntent +lastUsedTime +lastUtteredDate +lastValidByteReceived +lastViolationTime +lastViolationValue +lat +lateDataRules +latency +latencyMode +laterTime +latestActivityTaskTimestamp +latestAgentOrchestratedAt +latestAgentProfileReportedAt +latestAggregatedProfile +latestAmiId +latestBlockers +latestBotVersion +latestCampaignUpdate +latestCancelRequestedEventId +latestDatasetUpdate +latestDate +latestDescription +latestExecution +latestExecutionContext +latestLaunchTime +latestRecommenderUpdate +latestReplicationTime +latestRestorableTime +latestRevision +latestSolutionVersion +latestSuccessfulSync +latestSync +latestValidationTime +latestVersion +latestVersionId +latitude +launch +launchActionsStatus +launchConfig +launchConfigurationStatus +launchConfigurationTemplate +launchConfigurationTemplateID +launchConfigurationTemplateIDs +launchCount +launchDetails +launchDisposition +launchFile +launchOrder +launchPermission +launchProfile +launchProfileId +launchProfileInitialization +launchProfileProtocolVersion +launchProfileProtocolVersions +launchProfiles +launchPurpose +launchStatus +launchStatusMessage +launchTemplate +launchTemplateConfigurations +launchTemplateId +launchTemplateName +launchTemplateVersion +launchTime +launchType +launchedAt +launchedEc2InstanceID +launchedInstance +launchedVpcID +launches +layerArn +layerArns +layerAvailability +layerDigest +layerDigests +layerHash +layerHashes +layerPartBlob +layerSize +layers +layoutArn +layoutConfiguration +layoutId +layouts +lcmOpInfo +lcmOperationType +learnMoreLink +leastRecentEvent +length +level +lexTranscriptFilter +licenseConfigurationArns +licenseCostReduction +licenseEdition +licenseExpiration +licenseModel +licenseName +licenseRecommendationOptions +licenseRecommendations +licenseType +licenseUrl +licenseVersion +licenses +licensing +lifeCycle +lifeCycleStates +lifecycle +lifecycleConfiguration +lifecycleEventHookExecutionId +lifecycleEventName +lifecycleEvents +lifecyclePolicyText +lifecycleState +lifecycleStateDetails +lifecycleStatusCodes +limit +limitCode +limits +line +lineCoveragePercentage +lineNumber +lineRange +lineRanges +lineSep +linearInterval +linearPercentage +linesCovered +linesMissed +link +linkOutUri +linkedToGitHub +links +linux +linuxMountPoint +linuxParameters +linuxProcessParams +listAntipatternSeveritySummary +listApplicationComponentStatusSummary +listApplicationComponentStrategySummary +listApplicationComponentSummary +listColumns +listServerStatusSummary +listServerStrategySummary +listServerSummary +listSuppressedAlerts +listSuppressedFindings +listValue +listenerArns +listenerIdentifier +listenerPorts +listeners +lists +loa +loaContent +loaContentType +loaIssueTime +loadBalancer +loadBalancerArn +loadBalancerDnsName +loadBalancerInfo +loadBalancerName +loadBalancers +loadId +loadIds +localPath +localTraits +locale +localeId +localeName +location +locationCode +locationName +locationStatus +locationType +locations +lockId +log +logConfig +logConfiguration +logContext +logDateTime +logDelivery +logDriver +logEventMessages +logEvents +logExports +logGroup +logGroupArn +logGroupFields +logGroupIdentifier +logGroupIdentifiers +logGroupName +logGroupNamePattern +logGroupNamePrefix +logGroupNames +logGroups +logLevel +logOddsImpact +logOddsMetrics +logPrefix +logRecord +logRecordPointer +logResult +logSchemaVersion +logSettings +logStream +logStreamName +logStreamNamePrefix +logStreamNames +logStreams +logTail +logTarget +logTargetConfigurations +logType +logTypes +logUri +logUrl +logging +loggingConfig +loggingConfiguration +loggingConfigurationIdentifier +loggingConfigurationIdentifiers +loggingConfigurations +loggingLevel +loggingOptions +loggingOptionsPayload +logicalId +logicalResourceId +logicalStackName +logicalStackNames +login +loginValidityDuration +logo +logoImageBlob +logoURL +logoUrl +logonLanguage +logs +logsConfig +logsConfigOverride +lon +longReturnType +longValue +longitude +lookBackPeriodInDays +lookbackPeriodInDays +low +lowerBoundValue +lowerBoundValues +lowerInclusive +lt +lte +macAddress +macSecCapable +macSecKeys +main +mainNode +maintenanceWindows +majorVersion +majorVersionNumber +managedAgentName +managedAgents +managedCredentialsAction +managedCredentialsStatus +managedDataIdentifierIds +managedDataIdentifierSelector +managedDeviceArn +managedDeviceId +managedFields +managedJobTemplates +managedPersistenceMonitoringConfiguration +managedPolicyArns +managedScaling +managedTerminationProtection +managementAccountId +managementPreference +manifest +manualEvidence +manualEvidenceCount +manufacturer +mapAutoTaggingMpeID +mapIterationAbortedEventDetails +mapIterationFailedEventDetails +mapIterationStartedEventDetails +mapIterationSucceededEventDetails +mapRunArn +mapRunFailedEventDetails +mapRunStartedEventDetails +mapRuns +mapStateStartedEventDetails +mapValue +mappedInputFields +mappingType +marker +markerName +markerRecordedEventAttributes +marketplaceCertified +marketplaceInformation +master +masterAccount +masterAccountId +masterDatabaseName +masterEndpoint +masterUserPassword +masterUsername +match +matchCount +matchEquals +matchIDs +matchId +matchKey +matchResult +matched +matchedDevicesCount +matcher +matches +matchingBucket +matchingKeys +matchingResources +math +max +maxAccountLimitReached +maxAge +maxAttempts +maxBackupsToRetain +maxBatchSize +maxBuckets +maxConcurrency +maxConflictFiles +maxConnections +maxCpus +maxDepth +maxDevices +maxDuration +maxEjectionPercent +maxFileCount +maxFilesToKeep +maxGpus +maxHPONumberOfTrainingJobs +maxHPOParallelTrainingJobs +maxIdleTimeInSeconds +maxIndexingCapacityInOCU +maxInstancesCount +maxItems +maxJobDurationInSeconds +maxJobTimeoutMinutes +maxLength +maxLengthMs +maxLifetimeTimeoutMinutes +maxLineCoveragePercentage +maxMergeHunks +maxMessages +maxNodeCount +maxNumberOfTrainingJobs +maxPageSize +maxParallelLaunches +maxParallelTrainingJobs +maxParallelism +maxPendingRequests +maxQueueSize +maxRequests +maxResult +maxResults +maxRetries +maxRuns +maxRuntimeInSeconds +maxSampleCount +maxSearchCapacityInOCU +maxSeconds +maxServerErrors +maxSessionLengthInMinutes +maxSize +maxSizeInMB +maxSlots +maxStoppedSessionLengthInMinutes +maxSwap +maxUnavailable +maxUnavailablePercentage +maxValue +maxVersions +maxWorkerCount +maximum +maximumBuildsAllowed +maximumCapacity +maximumCount +maximumElevation +maximumMatchDistance +maximumMessageLength +maximumMessageRatePerSecond +maximumPageSize +maximumPerMinute +maximumPercent +maximumScalingStepSize +maximumTTL +maxvCpus +mcuCount +md5 +md5sum +meCollectorSummary +mean +meanTimeToClose +measurement +mediaType +medium +member +memberAbilities +memberAccountId +memberAccounts +memberAccountsEnrolled +memberFileExtensions +memberStatus +memberSummaries +members +membership +membershipArn +membershipId +membershipIdentifier +membershipStatus +membershipSummaries +memberships +memory +memoryGBHour +memoryInfo +memoryReservation +memorySize +memorySizeConfiguration +memorySizeInKB +memorySizeRecommendationOptions +merge +mergeBase +mergeCommitId +mergeHunks +mergeMetadata +mergeOperations +mergeOption +mergeOptions +mergeStrategy +mergeType +mergeable +mergedApiArn +mergedApiExecutionRoleArn +mergedApiId +mergedApiIdentifier +mergedBy +mergedCommitId +mesh +meshName +meshOwner +meshes +message +messageContent +messageExpiry +messageFormat +messageGroups +messageId +messageReviewHandler +messageReviewHandlerUri +messageSelectionStrategy +messageType +messageVersion +messages +meta +metaStoreManagerRoleArn +metadata +metadataCatalogConfig +metadataCatalogDetails +metadataKey +metadataOptions +metered +method +methodIntegration +methodName +methodResponses +methodSettings +metric +metricArn +metricAttribution +metricAttributionArn +metricAttributions +metricData +metricDataPoints +metricDatumList +metricDefinition +metricDimension +metricFilterCount +metricFilters +metricGoals +metricMonitors +metricName +metricNames +metricNamespace +metricRegex +metricRuleRoleArn +metricTarget +metricTimestamp +metricTransformations +metricType +metricUnit +metricValue +metrics +metricsConfiguration +metricsEnabled +metricsOutputConfig +metricsResults +metricsSource +metricsSummary +mfaAuthenticated +migrationEffort +migrationId +migrationStatus +migrationStatusEquals +migrationStrategy +migrationSummaries +migrationTimestamp +migrationWorkflowSummary +millisUntilNextRefreshable +mimeType +min +minLineCoveragePercentage +minNodeCount +minNumberOfExecutedThings +minPower +minProvisionedTPS +minRecommendationRequestsPerSecond +minSeconds +minSize +minValue +minWorkerCount +minimum +minimumCompressionSize +minimumCount +minimumHealthyHosts +minimumHealthyPercent +minimumLinks +minimumSamplingIntervalMs +minimumScalingStepSize +minimumTTL +minimumTriggerIntervalMs +minimumViableContactDurationSeconds +minorVersion +minvCpus +missedCount +missing +missingContextValues +missionProfileArn +missionProfileId +missionProfileList +mixed +mixin +mlDetectionConfig +mlModelTrainingJobId +mlModelTransformJobId +mlModels +modality +mode +model +modelArn +modelArnEquals +modelCustomizationJobSummaries +modelDetails +modelEndpoint +modelEndpointStatus +modelId +modelIdentifier +modelKmsKeyArn +modelManifestArn +modelMetrics +modelName +modelPerformance +modelScores +modelSource +modelStatus +modelSummaries +modelTransformJob +modelTransformOutputS3Location +modelType +modelUnits +modelVariables +modelVersion +modelVersionDetails +modelVersionNumber +modelVersions +models +modernizeInfrastructureWithCloudNativeTechnologies +modes +modified +modifiedAt +modifiedCount +modifiedTimestamp +modifyVnfInfoData +module +monitoredResourceInfo +monitoredResourceName +monitoringConfiguration +month +monthlySchedule +monthlyTransfer +moreApplicationResource +moreInfo +moreServerAssociationExists +mostRecentEvent +mostRecentExecutionMessage +mostRecentExecutionStatus +mostRecentExecutionTime +mountOptions +mountPath +mountPoint +mountPoints +mountROSysfs +mqttContext +mqttTopic +mtu +multiLayerStorage +multiNodeJobId +multiTurnConversation +multiValueHeaders +multipleValuesSetting +mustSucceedForCutover +mutationsFilePath +mutualTlsAuthentication +name +nameContains +namePattern +namePrefixFilter +nameQuery +nameServersUpdateState +namedShadowIndexingMode +namedShadowNames +names +namespace +namespaceArn +namespaceId +namespaceName +namespaceType +namespaceVersion +namespaces +needsReplacements +negative +neighborConfigurationIds +neighbors +neptuneIamRoleArn +neq +nestedType +netMask +netmask +network +networkAccessControl +networkArn +networkBindings +networkConfiguration +networkFileDefinitions +networkFindings +networkInfoList +networkInstances +networkInterface +networkInterfaceId +networkInterfaces +networkInterfacesToAdd +networkInterfacesToRemove +networkInterfacesToUpdate +networkMode +networkName +networkOperations +networkOrigin +networkPackages +networkPath +networkProfile +networkProfileArn +networkProfiles +networkProtocol +networkReachabilityDetails +networkResource +networkResourceArn +networkResources +networkSettings +networkSettingsArn +networkSite +networkSiteArn +networkSiteName +networkSites +networking +networks +neutral +newApplicationName +newApprovalRuleTemplateName +newAutoRegistrationStatus +newBGPPeer +newDeploymentGroupName +newDirectConnectGatewayName +newDiskName +newExecutionRunId +newFindings +newImageDescription +newImageDisplayName +newImageName +newImageTags +newName +newPrivateVirtualInterface +newPrivateVirtualInterfaceAllocation +newPublicVirtualInterface +newPublicVirtualInterfaceAllocation +newRevision +newRuleContent +newStatus +newTableName +newTransitVirtualInterface +newTransitVirtualInterfaceAllocation +newValue +next +nextAttemptDateTime +nextBackwardToken +nextDeliveryTime +nextDeployment +nextForwardToken +nextIndex +nextMarker +nextPageCount +nextPageToken +nextPeriod +nextRefreshTime +nextReplicationRunStartTime +nextSequenceToken +nextSnapshotTimeOfDay +nextState +nextStep +nextToken +nfc +nluConfidence +nluIntentConfidence +nluIntentConfidenceThreshold +nniPartnerType +noDevice +noEcho +noInlineDocumentSupport +noOfSrvCompleted +noOfSrvFailed +nodeCount +nodeCounts +nodeDetails +nodeGroup +nodeId +nodeIndex +nodeLabels +nodeName +nodeOverrides +nodeProperties +nodePropertyOverrides +nodeRangeProperties +nodeRole +nodeStructures +nodeSummaries +nodeType +nodegroup +nodegroupArn +nodegroupName +nodegroups +nodes +nodesToAdd +nodesToRemove +nodesToUpdate +nonCompliantChecks +nonCompliantResource +nonCompliantResourcesCount +nonModels +nonce +noncompliantEvidenceCount +noradSatelliteID +notAfter +notBefore +notClassified +notFoundIdentifierIds +notSensitive +notShared +notValidAfter +notValidBefore +note +notification +notificationActions +notificationConfiguration +notificationContext +notificationDestinations +notificationEnabled +notificationEndpoint +notificationLambdaArn +notificationSenderEmail +notificationSettingKeys +notificationSettings +notificationTargets +notificationTriggers +notifications +notifyOnAddCorrespondenceToCase +notifyOnCaseSeverity +notifyOnCreateOrReopenCase +notifyOnResolveCase +nsDescription +nsInstanceDescription +nsInstanceId +nsInstanceName +nsLcmOpOccId +nsName +nsState +nsd +nsdContent +nsdDesigner +nsdId +nsdInfoId +nsdInvariantId +nsdName +nsdOnboardingState +nsdOperationalState +nsdUsageState +nsdVersion +nullable +numBytes +numChangesets +numClasses +numDistinctPredicates +numDistinctSubjects +numEdgeLabels +numEdgeProperties +numEdges +numFiles +numNodeLabels +numNodeProperties +numNodes +numOfReports +numParallelProcesses +numQuads +numResults +numTurns +numValues +numVersions +number +numberOfApplicationComponents +numberOfAssociatedServices +numberOfAssociatedVPCs +numberOfCanceledThings +numberOfConflicts +numberOfConnections +numberOfCores +numberOfDays +numberOfEvents +numberOfFailedThings +numberOfInProgressThings +numberOfInvocations +numberOfMemberAccountsOptedIn +numberOfNotifiedThings +numberOfQueuedThings +numberOfRecentAmisToKeep +numberOfRecordsFailed +numberOfRecordsSuccess +numberOfRecordsUpdated +numberOfRejectedThings +numberOfRemovedThings +numberOfRetries +numberOfRevisions +numberOfRuns +numberOfSucceededThings +numberOfTimedOutThings +numberOfTransactions +numberOfTurns +numbers +numericSeverity +oAuth2Credentials +oAuth2Defaults +oAuth2GrantType +oAuth2Properties +oAuthCredentials +oAuthProperties +oAuthRequest +oAuthScopes +oauth2 +oauth2CustomProperties +oauth2GrantTypesSupported +oauthScopes +oauthToken +obdInterface +obdSignal +obdStandard +obfuscate +obfuscationSetting +obfuscationSettingType +object +objectCount +objectCountByEncryptionType +objectFields +objectId +objectIds +objectKey +objectName +objectPath +objectPrefixes +objectType +objectTypeConflict +objectTypeName +objectTypes +objectVersion +objectVersioning +objectiveSensitivity +objects +occurrences +occurrencesThreshold +oemData +offering +offeringClass +offeringId +offeringIds +offeringPromotionId +offeringPromotions +offeringStatus +offeringTransaction +offeringTransactions +offerings +offset +offsetInNanos +offsetRange +offsetRanges +offsetSeconds +ofi +oidc +oldApprovalRuleTemplateName +oldName +oldestDate +onEnter +onExit +onExitCode +onFailure +onInput +onPremisesInstanceTagFilters +onPremisesTagSet +onPremisesTagSetList +onReason +onStatusReason +onboardingState +oneTime +onlineAbConfig +onlineAbDefinition +onlyActiveViolationsIncluded +onlyAssociated +op +opNum +openActivityTasks +openChildWorkflowExecutions +openCounts +openCypherQuery +openDecisionTasks +openFindings +openIDConnectConfig +openIdIssuer +openLambdaFunctions +openPortRange +openSearch +openSearchServiceConfig +openTimers +opencypher +operand +operandType +operatingSystem +operatingSystemFamily +operatingSystems +operation +operationDetails +operationId +operationIdentifier +operationName +operationState +operationSucceeded +operationType +operationalState +operations +operator +optimizationObjective +optimizationType +optimizedStagingDiskType +option +optional +options +or +order +orderArn +orderBy +orderByTime +orderedResources +orders +org +orgPackagePaths +organizationArns +organizationEntityAccountFilters +organizationEntityAggregates +organizationEntityFilters +organizationEventDetailFilters +organizationId +organizationRoleName +organizationalUnitArns +organizationalUnitDistinguishedName +organizationalUnits +orientation +origin +originAccountID +originApprovalRuleTemplate +originAvailabilityZone +originConfiguration +originEnvironment +originPublicDNS +originRegion +originType +originalDiskPath +originalMessage +originalStatusCode +originalValue +originatingRequestId +orphanedResources +os +osByol +osDriver +osInfo +osType +osVersion +otaUpdateArn +otaUpdateFiles +otaUpdateId +otaUpdateInfo +otaUpdateStatus +otaUpdates +outboundCallConfig +outcomes +outdatedInstancesStrategy +outerPadding +outgoingCertificates +outlierDetection +outpostArns +outpostConfig +output +outputArtifactDetails +outputArtifacts +outputConfiguration +outputConstraints +outputContexts +outputDataConfig +outputDetails +outputFileUriValue +outputFormat +outputLocation +outputModalities +outputModelArn +outputModelKmsKeyArn +outputModelName +outputNode +outputPath +outputResources +outputS3Bucket +outputS3BucketName +outputS3Directory +outputS3KeyPrefix +outputS3Path +outputS3Uri +outputSourceConfig +outputToken +outputType +outputUri +outputVariableName +outputVariables +outputs +overallStatus +overallTestResults +overridden +overrideAlarmConfiguration +overrideAllowedPrefixesToDirectConnectGateway +overrideArtifactName +overrideDynamicGroups +overrideFormat +overrideLinkOutUri +overrideStatus +overrider +overrides +ownedBy +owner +ownerAccount +ownerArn +ownerContact +ownerFilter +ownerId +ownerIdentifier +ownerInfo +owners +ownershipVerificationCertificateArn +owningAccountId +package +packageArn +packageCleanup +packageContent +packageFormat +packageManager +packageName +packageNames +packagePaths +packagePrefix +packageSummaries +packageType +packageVersion +packageVersionArn +packageVersionRevision +packageVersionSummaries +packageVulnerabilityDetails +packages +packaging +packetsDropped +page +pageNumber +pageSize +pageToken +pagerDutyIncidentConfiguration +pages +paginated +paginationConfig +parallelRun +parallelism +parallelismConfig +parameter +parameterApplyStatus +parameterConfiguration +parameterKey +parameterName +parameterObjects +parameterSets +parameterTemplate +parameterType +parameterValue +parameterValues +parameters +params +parent +parentAssetId +parentBotNetworks +parentCommitId +parentConnectionId +parentEntityId +parentEntityUpdate +parentGroup +parentGroupName +parentGroupNames +parentId +parentIdentifier +parentImage +parentInitiatedEventId +parentIntentSignature +parentResourceName +parentSlotTypeSignature +parentTargetArn +parentWorkflowExecution +parents +parquetConfiguration +parserConfiguration +parsingResultUrl +partFirstByte +partLastByte +partNumber +partSize +partSource +partial +participant +participantId +participantToken +participantTokenConfigurations +participantTokens +participants +participatingResourceID +participatingResources +participatingServers +partition +partitionColumns +partitionKey +partitionKeys +partitionRegistrationOutput +partitions +partner +partnerName +parts +passed +passthroughBehavior +password +passwordData +passwordVersion +pasteAllowed +patchOperations +path +pathFormat +pathMatch +pathPart +pathPrefixHierarchy +pathWithQueryString +pattern +payload +payloadField +payloadFormat +payloadFormatIndicator +payloadSize +payloadUrl +payloadVersion +payloads +paymentOption +paymentOptions +pemEncodedCertificate +pending +pendingCount +pendingMaintenance +pendingMaintenanceActions +pendingModifiedValues +pendingPlan +pendingPricingPlan +pendingRequestCount +pendingRequests +pendingTasksCount +perRequest +perRetryTimeout +percent +percentComplete +percentDone +percentPromotedItems +percentTraffic +percentageAdjust +percentageComplete +percentageProgress +percentiles +percents +performAutoML +performHPO +performanceRisk +period +periodInSeconds +periodMs +permission +permissionArn +permissionArns +permissionConfiguration +permissionGroup +permissionGroupId +permissionGroupParams +permissionGroups +permissionModel +permissionStatus +permissionType +permissionVersion +permissions +persistentAppUI +persistentStorage +persona +personalizedRanking +phaseStatus +phaseType +phases +phoneNumber +phoneNumbers +phrase +physicalConnectorType +physicalNetworkInterfaceId +physicalNetworkInterfaces +physicalResource +physicalResourceId +physicalResources +pid +pidMode +pidRequestIntervalSeconds +pidResponseLength +pinned +pipeline +pipelineActivities +pipelineActivity +pipelineArn +pipelineCodebuildRoleArn +pipelineConfig +pipelineConfigurationTimeStamp +pipelineContext +pipelineDescriptionList +pipelineExecution +pipelineExecutionId +pipelineExecutionStartCondition +pipelineExecutionSummaries +pipelineId +pipelineIdList +pipelineIds +pipelineInfoList +pipelineName +pipelineObjects +pipelineProvisioning +pipelineProvisioningRepository +pipelineServiceRoleArn +pipelineSummaries +pipelineType +pipelineVersion +pipelines +pitPolicy +placeholder +placement +placementConstraints +placementGroup +placementName +placementStrategy +placementTemplate +placements +plainTextMessage +planDescription +planType +planTypes +platform +platformCapabilities +platformDevices +platformDifferences +platformDisplayName +platformFamily +platformId +platformOverride +platformVersion +platformVersions +platforms +playbackUrl +pluginId +plugins +podExecutionRoleArn +podName +podProperties +pointInTimeRecovery +pointInTimeRecoveryOverride +pointInTimeSnapshotDateTime +polarization +policies +policy +policyArn +policyDescription +policyDetails +policyDocument +policyDocuments +policyGenerationDetails +policyGenerations +policyId +policyName +policyNamesToAdd +policyNamesToSkip +policyRevision +policySizeBytes +policyStatementsTemplate +policyStoreId +policyStores +policyTemplate +policyTemplateId +policyTemplates +policyText +policyType +policyVersion +policyVersionId +policyVersionIdentifier +policyVersions +pollingAccounts +pollingDisabledAt +pollingServicePrincipals +port +portEncryptionStatus +portForwardingConfig +portInfo +portInfoSource +portInformationNeeded +portInfos +portMapping +portMappings +portName +portNumber +portRange +portStates +portal +portalArn +portalAuthMode +portalClientId +portalContactEmail +portalCreationDate +portalDescription +portalEndpoint +portalId +portalLastUpdateDate +portalLogoImage +portalLogoImageFile +portalLogoImageLocation +portalName +portalStartUrl +portalStatus +portalSummaries +portals +ports +position +positive +posixUser +postCodeHookSpecification +postDirectional +postFulfillmentStatusSpecification +postLaunchActions +postLaunchActionsLaunchStatusList +postLaunchActionsStatus +postLaunchEnabled +postLaunchFile +postPassEndTime +postTriggerCollectionDuration +postalCode +postalCodePlus4 +postedDate +power +powerId +powers +preDirectional +preLaunchFile +prePassStartTime +preProvisioningHook +preSignedUrl +precision +predicate +predicateCount +predicates +predictedLabel +predictedScores +predictedValue +predictionExplanations +predictionTimeRange +predictionTimestamp +preferences +preferredBackupWindow +preferredMaintenanceWindow +preferredRegion +prefix +prefixConfig +prefixFormat +prefixListIds +prefixType +prerequisite +preserve +preserveNulls +preserveSourceDataTyping +preset +presignedUrlConfig +previewAgentsArn +previewResults +previewStatus +previewToken +previous +previousDataProcessingJobId +previousEventId +previousModelTrainingJobId +previousOwnedBy +previousRevision +previousStartedEventId +price +pricingMode +pricingTier +pricingUnit +primaryArtifact +primaryDevice +primaryEmail +primaryKey +primaryKeyColumns +primaryKeys +primaryRegistryAlias +primaryTaskSet +principal +principalArn +principalEntityType +principalId +principalSubscriber +principals +printAllowed +priorBuildSummaryList +prioritizeBusinessGoals +priority +privateConnectionProvisioningState +privateDnsName +privateDomainName +privateIpAddress +privateIpAddresses +privateIpv4Address +privateKey +privateKeyBase64 +privateLinkServiceName +privateRegistryAccess +privateRepository +privileged +privilegedMode +privilegedModeOverride +problems +processBehavior +processedDataS3Location +processedRecordsCount +processingConfig +processingConfiguration +processingInstanceType +processingInstanceVolumeSizeInGB +processingJob +processingTargets +processingTimeOutInSeconds +prodTrafficRoute +productCode +productId +productType +productTypes +productUrl +productionBranch +products +profile +profileArn +profileEndTime +profileId +profileName +profileOwner +profileProperties +profileStartTime +profileTimes +profileToken +profileUpdatedAt +profileVersion +profileVersionArn +profiles +profilingEnabled +profilingGroup +profilingGroupName +profilingGroupNames +profilingGroups +profilingStatus +progress +progressDetail +progressInMegaBytes +progressPercentage +progressStatus +project +projectArn +projectCreationDate +projectDescription +projectId +projectInformation +projectLastUpdateDate +projectName +projectRole +projectSummaries +projectTemplateId +projectVisibility +projectedMetrics +projectedUtilizationMetrics +projects +projectsNotFound +prometheusEndpoint +promotionName +promotions +prompt +promptAttemptsSpecification +promptSpecification +propagateTags +properties +propertiesFileContent +property +propertyAlias +propertyDefinitions +propertyFilters +propertyGroupName +propertyGroupUpdates +propertyGroups +propertyId +propertyName +propertyNames +propertyNotificationState +propertyReference +propertyUnit +propertyUpdates +propertyValue +propertyValues +proposalId +proposalState +protectedQueries +protectedQuery +protectedQueryIdentifier +protectedTasks +protectionEnabled +protocol +protocolDefinition +protocolName +protocolPolicy +protocolVersion +protocols +protonServiceRoleArn +provider +providerARNs +providerArn +providerIdentity +providerName +providers +provisionedCapacity +provisionedModelArn +provisionedModelId +provisionedModelName +provisionedModelSummaries +provisionedResources +provisioning +provisioningEngine +provisioningRepository +provisioningRoleArn +proxyConfiguration +proxyEndpoint +pseudoTerminal +publicAccess +publicAccessBlock +publicAccessCidrs +publicDnsName +publicDomainNames +publicEndpoint +publicIp +publicIpAddress +publicIpAddresses +publicKey +publicKeyBase64 +publicKeyMaterial +publicPorts +publicProjectAlias +publiclyAccessible +publiclyAccessibleCount +publiclyReadable +publiclyWritable +publish +publishAttributionMetricsToS3 +publishClassificationFindings +publishFindingToSnsParams +publishPolicyFindings +published +publishedTime +publisher +publishers +pullRequest +pullRequestCreatedEventMetadata +pullRequestEnvironmentName +pullRequestEventType +pullRequestEvents +pullRequestId +pullRequestIds +pullRequestMergedStateChangedEventMetadata +pullRequestSourceReferenceUpdatedEventMetadata +pullRequestStatus +pullRequestStatusChangedEventMetadata +pullRequestTargets +pullStartedAt +pullStoppedAt +pullThroughCacheRules +purchaseTime +purchasingOption +pushedAt +putAssetPropertyValueEntries +putFailuresCount +putFiles +putItem +qos +qualificationReportDownloadUrl +qualities +quality +quantity +quantumTaskArn +quantumTasks +queries +queriesFilePath +query +queryAction +queryCompileError +queryDefinitionId +queryDefinitionNamePrefix +queryDefinitions +queryEvalStats +queryFilterString +queryFilterStringEnabled +queryId +queryLogStatus +queryOptions +queryParam +queryParameters +queryParser +queryStatement +queryString +queryStringsAllowList +queryText +queryVersion +queryable +queue +queueInfo +queuePolicy +queuePriority +queueRequest +queueSize +queueUrl +queueUrls +queuedAt +queuedJobs +queuedTimeoutInMinutes +queuedTimeoutInMinutesOverride +quota +quotaCode +quotaName +quotaValue +quote +quoteAll +r53HostedZoneDeletionState +radio +radios +ramBytes +ramPerformanceMetricBasis +ramResourceShareRegion +ramSizeInGb +randomizationSalt +range +rangeKeyField +rangeKeyType +rangeKeyValue +rank +rate +rateIncreaseCriteria +rateLimit +rawData +rawError +rawValue +rdsHttpEndpointConfig +reaction +reactionCounts +reactionUserArn +reactionUsers +reactionValue +reactionsForComment +reactionsFromDeletedUsersCount +readCapacityUnits +readOnly +readOnlyRootFilesystem +readOptions +readSetId +readSets +readme +readonlyAccessAccounts +readonlyRootFilesystem +reason +reasonCode +reasonCodeSummaries +reasonForNonCompliance +reasonForNonComplianceCode +reasons +rebootAfterUse +receiverAccountId +receiverArn +recentCommunications +recentIntentSummaryView +recipe +recipeArn +recipeList +recipeOutputFormat +recipeProvider +recipeType +recipes +recipients +recognizedBotMember +recommendation +recommendationCompliance +recommendationExportJobs +recommendationId +recommendationIds +recommendationOptions +recommendationPreferenceNames +recommendationPreferences +recommendationPreferencesDetails +recommendationReportDetails +recommendationResourceType +recommendationSet +recommendationSourceArn +recommendationSourceType +recommendationSources +recommendationStatus +recommendationSummaries +recommendationTemplate +recommendationTemplateArn +recommendationTemplates +recommendationTypes +recommendations +recommended +recommendedActions +recommendedCpuUnits +recommendedInstanceType +recommendedMemorySize +recommendedMinorVersion +recommendedOptionProjectedMetrics +recommendedVersion +recommender +recommenderArn +recommenderConfig +recommenders +record +recordAllRosTopics +recordFormat +recordIndex +recordLength +recordMarkerDecisionAttributes +recordMarkerFailedEventAttributes +recordNumber +recording +recordingConfiguration +recordingConfigurationArn +recordingConfigurations +recordingGroup +recordingMode +recordingReconnectWindowSeconds +recordingStrategy +records +recordsMatched +recordsNotProcessed +recordsProcessed +recordsScanned +recoveryInstanceID +recoveryInstanceIDs +recoveryInstanceId +recoveryInstanceProperties +recoveryPoint +recoveryPointCreateTime +recoveryPointId +recoveryPoints +recoverySnapshotID +recurringCharges +recurringPaymentAmount +recursive +redirectUri +reduceOperationalOverheadWithManagedServices +ref +refValue +reference +referenceArn +referenceId +referenceStoreId +referenceStores +referenceType +referenceURLs +referenceUrls +referencedBy +referencedTables +references +refreshAfterInSeconds +refreshToken +refreshTokenBody +regex +regexConfiguration +regexFilter +region +regionFilter +regionList +regionMap +regionName +regionalCertificateArn +regionalCertificateName +regionalDomainName +regionalHostedZoneId +regions +registerAccountStatus +registerTime +registeredAt +registeredBy +registeredContainerInstancesCount +registeredDomainDelegationInfo +registeredResources +registeredTime +registeredTimeStamp +registrationCode +registrationConfig +registrationStatus +registries +registry +registryArn +registryCatalogData +registryCredential +registryCredentialOverride +registryId +registryIds +registryLogin +registryScanningConfiguration +registryUri +rejectDate +rejectReason +rejectedLogEventsInfo +rejectionStatement +rel +relatedDeployments +relatedEvents +relatedItemArn +relatedItemData +relatedItemId +relatedItems +relatedItemsUpdate +relatedJoinFieldName +relatedJoinTableName +relatedModelFields +relatedModelName +relatedResources +relatedVulnerabilities +relationalDatabase +relationalDatabaseAvailabilityZones +relationalDatabaseBlueprintId +relationalDatabaseBundleId +relationalDatabaseConfig +relationalDatabaseEvents +relationalDatabaseName +relationalDatabaseSnapshot +relationalDatabaseSnapshotName +relationalDatabaseSnapshots +relationalDatabaseSourceType +relationalDatabases +relationship +relationshipName +relationshipStatus +relationshipType +relationshipValue +relationships +relativeAggregationDuration +relativeFileVersion +relativeImpact +relativePath +release +releaseLabel +releaseVersion +relevanceLevel +relevanceScore +remaining +remainingResources +remediation +remoteAccess +remoteAccessAllowed +remoteAccessEnabled +remoteAccessSecurityGroup +remoteAccessSession +remoteAccessSessionArn +remoteAccessSessions +remoteDebugEnabled +remoteModelTransformJob +remoteParticipantId +remoteRecordAppArn +remoteRecordEnabled +remoteSourceCodeAnalysisServerConfigurationTimestamp +remoteSourceCodeAnalysisServerInfo +removableAttributes +removeAllowedPrefixesToDirectConnectGateway +removeAttributes +removeAuthorizerConfig +removeAutoRegistration +removeLabels +removeMetrics +removeNetworkAccessConfiguration +removeOverrideLinkOutUri +removePreProvisioningHook +removeSecurityGroupIds +removeSegment +removeSubnetIds +removeTaints +removeThingType +removeVariations +removeVpcConfiguration +renderConfig +renderTypeDeclarations +rendererType +renderingConfiguration +renderingEngine +renditionConfiguration +renditionSelection +renditions +renewalStatus +renewalStatusReason +renewalSummary +replace +replaceContents +replaceDefaultPolicyVersionParams +replacePermissionAssociationsWork +replacePermissionAssociationsWorks +replacementOrderArn +replacementType +replicated +replicatedDisks +replicatedExternally +replicatedStorageBytes +replicationAccounts +replicationConfiguration +replicationConfigurationStatus +replicationConfigurationTemplateID +replicationConfigurationTemplateIDs +replicationDetails +replicationDirection +replicationJob +replicationJobId +replicationJobList +replicationJobTerminated +replicationRegions +replicationRunId +replicationRunList +replicationServerInstanceType +replicationServersSecurityGroupsIDs +replicationSet +replicationSetArns +replicationSpecification +replicationStartedDateTime +replicationStatus +replicationStatusDetails +replicationStatusMessage +replicationStatuses +replicationStrategy +replicationType +replicationTypes +reportARN +reportArn +reportArns +reportBuildBatchStatusOverride +reportBuildStatus +reportBuildStatusOverride +reportDefinitions +reportDescription +reportFileFormat +reportFormat +reportFrequency +reportGroup +reportGroupArn +reportGroupArns +reportGroups +reportGroupsNotFound +reportId +reportName +reportNames +reportSummaries +reportType +reports +reportsNotFound +repositories +repositoriesNotFound +repository +repositoryArn +repositoryCloneMethod +repositoryConnectionArn +repositoryCount +repositoryCredentials +repositoryDescription +repositoryEndpoint +repositoryFilters +repositoryId +repositoryMetadata +repositoryName +repositoryNames +repositoryPolicy +repositoryPrefix +repositoryProvider +repositoryUri +reprocessingId +reprocessingSummaries +republish +request +requestAttributes +requestCancelActivityTaskDecisionAttributes +requestCancelActivityTaskFailedEventAttributes +requestCancelExternalWorkflowExecutionDecisionAttributes +requestCancelExternalWorkflowExecutionFailedEventAttributes +requestCancelExternalWorkflowExecutionInitiatedEventAttributes +requestCompression +requestContentType +requestEntries +requestEventStream +requestFailureReason +requestHeaders +requestId +requestMACSec +requestMappingTemplate +requestMessageId +requestMethod +requestModels +requestParameters +requestPayload +requestTemplates +requestTime +requestType +requestValidatorId +requestedAllowedPrefixesToDirectConnectGateway +requestedAt +requestedBy +requestedEndTime +requestedOn +requestedStartTime +requests +requireAuthorizationForCacheControl +requireInstanceProperties +required +requiredClaims +requiredFields +requiredProperties +requiresAttributes +requiresCompatibilities +requiresConfiguration +rescanDuration +rescanDurationState +rescannedStorageBytes +reservedCpuCores +reservedInstanceOptions +reset +resetActionConfiguration +resetActionRequests +resetTimer +resiliencyPolicies +resiliencyScore +resolution +resolutionId +resolutionSteps +resolutionStrategy +resolutionTechniques +resolutionType +resolveConflicts +resolvedAt +resolvedComponentVersions +resolvedConfiguration +resolvedImageDigest +resolvedReason +resolvedSourceVersion +resolvedTime +resolvedValues +resolver +resolverArn +resolvers +resource +resourceARN +resourceAccessRole +resourceArn +resourceArns +resourceConfiguration +resourceCount +resourceCounts +resourceCreationTime +resourceDefinitions +resourceDeletionTime +resourceDetails +resourceDigests +resourceErrors +resourceErrorsDetails +resourceFilterCriteria +resourceGroup +resourceGroupArn +resourceGroupArns +resourceGroupName +resourceGroupNames +resourceGroupTags +resourceGroups +resourceId +resourceIdentifier +resourceIdentifiers +resourceIds +resourceKeys +resourceLinks +resourceLogEvents +resourceMappings +resourceMetadata +resourceMethods +resourceName +resourceNames +resourceOwner +resourceOwnerAccount +resourcePolicies +resourcePolicy +resourcePrefix +resourceRecord +resourceRegionScope +resourceRequirements +resourceShare +resourceShareArn +resourceShareArns +resourceShareAssociations +resourceShareInvitation +resourceShareInvitationArn +resourceShareInvitationArns +resourceShareInvitations +resourceShareName +resourceShareStatus +resourceShares +resourceSpecification +resourceState +resourceStatus +resourceSubType +resourceTags +resourceType +resourceTypes +resources +resourcesAffected +resourcesBudgetEstimate +resourcesFlagged +resourcesIgnored +resourcesIncluded +resourcesProcessed +resourcesReceivingAccess +resourcesSummary +resourcesSuppressed +resourcesVpcConfig +response +responseCard +responseContentType +responseEventStream +responseMappingTemplate +responseModels +responseParameters +responsePayload +responsePlanArn +responsePlanSummaries +responseStreamingSupported +responseTemplates +responseTopic +responseType +responses +restApiId +restoreDate +restoreTime +restoreTimestamp +restoredTableARN +restrictPublicBuckets +restrictions +result +resultCode +resultConfiguration +resultCounts +resultFilterBy +resultFormat +resultFrame +resultId +resultList +resultSetMetadata +resultSetOptions +resultStat +resultStats +resultStatus +resultTypeFilter +results +resultsByTime +resultsData +resultsWritten +retain +retainedTopics +retentionDuration +retentionInDays +retentionMode +retentionPeriod +retiringPrincipal +retries +retryAfter +retryAfterSeconds +retryAttempt +retryMode +retryPolicy +retryPolicyConfiguration +retryPolicyExecution +retryStrategy +retryType +retryable +return +returnCode +returnInformation +returnReason +returnValue +reverseOrder +reversedDirectionSourceServerArn +reverted +revision +revisionChangeId +revisionChangeIdentifier +revisionChildren +revisionDag +revisionId +revisionInfo +revisionLocation +revisionNumber +revisionSummary +revisionType +revisionUrl +revisionUrlTemplate +revisions +revocationEffectiveFrom +revocationReason +revocationRecord +revocationSupported +revokedAt +revokedBy +revokedEntities +rewrite +rid +risk +riskScore +robot +robotApplicationNames +robotApplicationSummaries +robotApplications +robotDeploymentSummary +robotDeploymentTimeoutInSeconds +robotSoftwareSuite +robots +role +roleARN +roleAlias +roleAliasArn +roleAliasDescription +roleAliases +roleArn +roleArnForLogging +roleArns +roleCredentials +roleList +roleName +roleNameArn +roleType +roleValues +roles +rollDisposition +rollback +rollbackDeploymentId +rollbackInfo +rollbackMessage +rollbackStatus +rollbackTriggeringDeploymentId +rollingBackTrxCount +rollingBackTrxEarliestStartTime +rolloutState +rolloutStateReason +roomIdentifier +rooms +root +rootDeviceName +rootDirectory +rootGroup +rootResourceId +rootToParentThingGroups +rootVolume +rootVolumeName +rotateMasterUserPassword +rotateSecret +rotationSize +routableCIDRSpace +route +routeFilterPrefixes +routeName +routedResources +router +routerTypeIdentifier +routes +routingConfiguration +row +rowData +rowId +rowIds +rowIdsNotFound +rowNumber +rows +rowsToCreate +rowsToUpdate +rowsToUpsert +rpoDescription +rpoInSecs +rpoReferenceId +rtoDescription +rtoInSecs +rtoReferenceId +rule +ruleAction +ruleArn +ruleBasedProperties +ruleConfiguration +ruleContentSha256 +ruleDesc +ruleDetails +ruleDisabled +ruleEvaluation +ruleExecutionMode +ruleGroupsNamespace +ruleGroupsNamespaces +ruleID +ruleId +ruleIdentifier +ruleName +ruleNames +ruleNumber +ruleResults +ruleVersion +rules +rulesPackageArn +rulesPackageArns +rulesPackages +run +runAsGroup +runAsNonRoot +runAsUser +runContext +runEnvironment +runGroupId +runId +runLeftNormalization +runOnce +runOrder +runTimeAssessmentStatus +runWith +running +runningCount +runningQueryCount +runningTasksCount +runs +runtime +runtimeConfiguration +runtimeHintValues +runtimeHints +runtimeId +runtimePlatform +runtimeRoleArn +runtimeStatus +runtimeStatusMessage +runtimeVersion +runtimes +s3 +s3Bucket +s3BucketArn +s3BucketName +s3BucketOwner +s3BucketRegion +s3BucketSource +s3BucketTranscriptSource +s3Config +s3Configuration +s3DataDestination +s3DataSource +s3DeepLink +s3Destination +s3DestinationConfig +s3DestinationConfiguration +s3DestinationExportFileFormat +s3DestinationExportFileFormatOptions +s3DestinationUrl +s3EncryptionEnabled +s3Etags +s3ExportConfiguration +s3InputFileType +s3InputFormatConfig +s3JobDefinition +s3Key +s3KeyPrefix +s3Keys +s3KmsKeyArn +s3Location +s3LogBucket +s3Logs +s3LogsArn +s3Managed +s3MonitoringConfiguration +s3Object +s3ObjectKey +s3ObjectVersion +s3OutputEncryptionKMSKey +s3OutputFormatConfig +s3OutputKeyPrefix +s3Path +s3Paths +s3Prefix +s3Reference +s3RelativePath +s3ResourceArn +s3ResourcePath +s3Resources +s3ResourcesUpdate +s3StateFileUrl +s3Uri +s3Url +s3WordsList +s3bucketForAnalysisData +s3bucketForReportData +s3key +s3location +sageMakerStudioDomainUrl +sagemakerIamRoleArn +salesforce +saml +samlConfiguration +samlConfigurationStatus +samlMetadataDocument +samlMetadataURL +samlOptions +sample +sampleCount +sampleFailureReason +sampleId +sampleRate +sampleText +sampleUtterances +sampleUtterancesCount +sampleValue +samples +samplingPercentage +samplingRate +satelliteArn +satelliteId +satellites +savedownStorageConfiguration +savingsOpportunity +savingsOpportunityPercentage +savingsPlanArn +savingsPlanArns +savingsPlanId +savingsPlanIds +savingsPlanOffering +savingsPlanOfferingId +savingsPlanOfferingIds +savingsPlanPaymentOptions +savingsPlanType +savingsPlanTypes +savingsPlans +scalarFunctions +scale +scaleInCooldownSeconds +scaleInPolicy +scaleOutCooldownSeconds +scaleOutPolicy +scaling +scalingConfig +scanAll +scanFrequency +scanName +scanNameArn +scanOnPush +scanRate +scanState +scanStatus +scanStatusCode +scanStatusReason +scanType +scanningConfiguration +scanningConfigurations +scansWithMostOpenCriticalFindings +scansWithMostOpenFindings +sceneId +sceneMetadata +sceneSummaries +schedule +scheduleActivityTaskDecisionAttributes +scheduleActivityTaskFailedEventAttributes +scheduleEndTime +scheduleExpression +scheduleFrequency +scheduleLambdaFunctionDecisionAttributes +scheduleLambdaFunctionFailedEventAttributes +scheduleOffset +scheduleStartTime +scheduleTime +scheduleToCloseTimeout +scheduleToStartTimeout +scheduledAuditArn +scheduledAuditName +scheduledAudits +scheduledBefore +scheduledEventId +scheduledJobRollouts +scheduledOnOrAfter +scheduledSplitsConfig +scheduledSplitsDefinition +scheduledStartTime +schedulingConfig +schedulingPolicies +schedulingPolicyArn +schedulingPriority +schedulingPriorityOverride +schedulingStrategy +schema +schemaArn +schemaDefinition +schemaList +schemaName +schemaStorageConfig +schemaSummaries +schemaType +schemaVersion +schemas +scheme +scope +scopes +scoping +score +scoreDetails +scoreSource +scores +scoringVector +screenAutomationId +screenId +screenshots +script +scriptLocation +scriptLocationS3Bucket +scriptLocationS3Key +scriptModeConfig +scriptName +scriptOutputLocation +scriptParameters +scriptType +sdkType +searchCriteria +searchExpression +searchOrder +searchResults +searchTerm +searchableAttributes +searchedCompletely +searchedLogStreams +secondaryArtifacts +secondaryArtifactsOverride +secondaryAvailabilityZone +secondarySourceVersions +secondarySources +secondarySourcesOverride +secondarySourcesVersionOverride +seconds +secondsToLive +secret +secretARN +secretAccessKey +secretArn +secretId +secretKey +secretName +secretOptions +secretPolicy +secrets +secretsManagerKey +sectionalElements +sections +secureInitializationRoleArn +securityConfigDetail +securityConfigSummaries +securityContext +securityDetails +securityGroup +securityGroupIds +securityGroups +securityHubConfiguration +securityPolicy +securityPolicyDetail +securityPolicySummaries +securityProfileArn +securityProfileDescription +securityProfileIdentifier +securityProfileIdentifiers +securityProfileName +securityProfileTargetArn +securityProfileTargetMappings +securityProfileTargets +seed +seedReplicationTime +seedTime +seenAt +segment +segmentOverrides +segments +selectAttributes +selectedProperties +selectedTestList +selectionMode +selectionPattern +selector +selectors +seleniumProperties +semanticVersion +senderAccountId +senderId +sensitive +sensitiveData +sensitiveDataOccurrences +sensitivityInspectionTemplateId +sensitivityInspectionTemplates +sensitivityScore +sensitivityScoreOverridden +sensitivityScoreOverride +sentAt +sentiment +sentimentAnalysisSettings +sentimentLabel +sentimentResponse +sentimentScore +sep +separator +sequenceInformation +sequenceStoreId +sequenceStores +sequenceToken +serial +serialNumber +serializer +server +serverCatalogStatus +serverCertificateArn +serverCertificateArns +serverCertificateStatus +serverCertificateStatusDetail +serverCertificates +serverCriteria +serverDetail +serverError +serverErrorCategory +serverGroupId +serverGroupLaunchConfigurations +serverGroupReplicationConfigurations +serverGroupValidationConfigurations +serverGroups +serverId +serverImportFailure +serverImportSuccess +serverInfos +serverLaunchConfigurations +serverList +serverName +serverReplicationConfigurations +serverReplicationParameters +serverSideEncryption +serverSideEncryptionConfiguration +serverStrategies +serverType +serverUrl +serverValidationConfigurations +serverValidationOutput +serverValidationStrategy +servers +serversCount +serversMappedToApplications +serversMappedtoTags +service +serviceAccountName +serviceAccountRoleArn +serviceArn +serviceArns +serviceAttributes +serviceCode +serviceCodeList +serviceCodes +serviceConnectConfiguration +serviceConnectDefaults +serviceConnectEndpoint +serviceConnectResources +serviceDiscovery +serviceDnsName +serviceExecutionRoleArn +serviceId +serviceIdentifier +serviceInstance +serviceInstanceName +serviceInstances +serviceIpv4Cidr +serviceIpv6Cidr +serviceLimit +serviceLinkedRoleArn +serviceManagedS3 +serviceMetadata +serviceMode +serviceName +serviceNetworkArn +serviceNetworkId +serviceNetworkIdentifier +serviceNetworkName +serviceNetworkServiceAssociationIdentifier +serviceNetworkVpcAssociationIdentifier +serviceProviderSamlMetadata +serviceRecommendationOptions +serviceRegistries +serviceRole +serviceRoleArn +serviceRoleOverride +serviceSpec +serviceSyncBlocker +serviceSyncBlockerSummary +serviceSyncConfig +serviceTemplate +serviceTemplateVersion +serviceTemplates +serviceType +services +session +sessionArn +sessionAttributes +sessionBackup +sessionConfiguration +sessionContext +sessionDurationInMinutes +sessionEnabled +sessionExpirationTime +sessionId +sessionIds +sessionIssuer +sessionPersistenceMode +sessionPolicy +sessionState +sessionStorage +sessionSummaries +sessionTarget +sessionTimeout +sessionToken +sessionType +sessions +set +setAsActive +setAsDefault +setDefaultVersion +setFileModes +setTimer +setVariable +setting +settings +severities +severity +severityCode +severityCounts +severityLevels +sha +sha256 +sha256sum +shadow +shadowName +shape +shapeId +shardCapacity +shardCount +share +shareDecaySeconds +shareDistribution +shareId +shareIdentifier +shareName +shareUrl +sharedAccess +sharedAccountId +sharedMemorySize +sharedVia +shares +shippingAddress +shippingLabel +shortCode +shots +shouldOverwrite +shouldProfile +showThumbnails +shutdownAgentlessCollectors +shutdownAgents +shutdownConnectors +shutdownMeCollectors +sid +signalCatalogArn +signalDecoders +signalDecodersToAdd +signalDecodersToRemove +signalDecodersToUpdate +signalExternalWorkflowExecutionDecisionAttributes +signalExternalWorkflowExecutionFailedEventAttributes +signalExternalWorkflowExecutionInitiatedEventAttributes +signalName +signalsMap +signalsToCollect +signature +signatureAlgorithm +signatureContains +signatureCount +signatureDateTime +signatureExpiresAfter +signatureExpiresAt +signatureExpiresBefore +signatureInfo +signatureKeyId +signatureMap +signatureR +signatureS +signatureTimestamp +signatureV +signatureValid +signatureValidityPeriod +signedBiUrl +signedConnectionString +signedObject +signingConfiguration +signingDisabled +signingImageFormat +signingMaterial +signingParameters +signingProfileName +signingProfileParameter +signingRegion +signingServiceName +sigv4 +silent +simpleCriterion +simpleRule +simpleRuleEvaluation +simpleScopeTerm +simulationApplicationNames +simulationApplicationSummaries +simulationApplications +simulationJobBatchSummaries +simulationJobSummaries +simulationSoftwareSuite +simulationTimeMillis +simulationUnitLimit +since +site +siteLinkEnabled +sites +size +sizeClassified +sizeInBytes +sizeInBytesCompressed +sizeInGb +sizeInGiB +sizeInMiB +sizeLimit +skipAppResign +skipFinalSnapshot +skipResourceInUseCheck +skipped +skippedEntries +skippedFindingsCount +slackChannelConfigurations +slackWorkspaceConfigurations +slotCaptureSetting +slotConstraint +slotDiscrepancies +slotElicitationStyle +slotHints +slotId +slotMatchResult +slotMatchResultCounts +slotName +slotPriorities +slotResolutionResults +slotSpecifications +slotSummaries +slotToElicit +slotType +slotTypeCategory +slotTypeConfigurations +slotTypeId +slotTypeName +slotTypeSignature +slotTypeSummaries +slotTypeValues +slotTypeVersion +slotTypes +slotTypesCount +slots +slotsFilledInSession +smallVolumeConf +smallVolumeMaxSize +smsConfigurations +snapshot +snapshotArn +snapshotConfiguration +snapshotCreateTime +snapshotCreationTime +snapshotID +snapshotId +snapshotName +snapshotRemainingDays +snapshotRetentionPeriod +snapshotRetentionStartTime +snapshotTimeOfDay +snapshots +snoozeActionConfiguration +snoozeActionRequests +snoozeDuration +sns +snsPublishStatusCode +snsTopic +snsTopicARN +snsTopicArn +socketAddress +softLimit +software +solution +solutionArn +solutionConfig +solutionVersion +solutionVersionArn +solutionVersions +solutions +sopRecommendations +sort +sortBy +sortByAttribute +sortByOrder +sortColumns +sortCriteria +sortOrder +sorts +source +source1 +source2 +sourceAccessToken +sourceAccount +sourceAccountID +sourceApiArn +sourceApiAssociation +sourceApiAssociationConfig +sourceApiAssociationStatus +sourceApiAssociationStatusDetail +sourceApiAssociationSummaries +sourceApiId +sourceApiIdentifier +sourceArn +sourceArns +sourceAuthOverride +sourceBotVersion +sourceBranch +sourceCloudProperties +sourceCode +sourceCodeList +sourceCodeRepositories +sourceCodeRepository +sourceCommit +sourceCommitId +sourceCommitSpecifier +sourceConfiguration +sourceConnectionState +sourceConnectorLabel +sourceConnectorProperties +sourceConnectorType +sourceContainer +sourceCredentialsInfos +sourceData +sourceDatabaseName +sourceDescription +sourceDiskName +sourceFields +sourceFile +sourceFileType +sourceFiles +sourceFlowConfig +sourceFrequency +sourceId +sourceIdentifier +sourceImageSet +sourceImageSetId +sourceImageSetProperties +sourceInfo +sourceInstanceName +sourceIpAddress +sourceKeyspaceName +sourceKeyword +sourceLambdaLayerArn +sourceLayerHash +sourceLocationOverride +sourceName +sourceNetwork +sourceNetworkID +sourceNetworkIDs +sourceNetworks +sourceParams +sourcePath +sourcePipelineArn +sourcePipelineName +sourceProperties +sourceReference +sourceRegion +sourceRelationalDatabaseName +sourceRepository +sourceRepositoryName +sourceResourceName +sourceRevisions +sourceS3DirectoryPath +sourceS3Location +sourceS3Object +sourceSchemaName +sourceSecurityGroups +sourceServer +sourceServerArn +sourceServerID +sourceServerIDs +sourceServerId +sourceServerTags +sourceServers +sourceSetUpOption +sourceSnapshotName +sourceStatuses +sourceTableName +sourceType +sourceTypeOverride +sourceUrl +sourceVersion +sourceVolume +sourceVpc +sourceVpcID +sources +spaceName +span +sparkSqlJobDriver +sparkSqlParameters +sparkSubmitJobDriver +sparkSubmitParameters +sparql +spec +spectrumConfig +speechTranscriptionResult +speechTranscriptionResultCounts +speedOfMigration +sphere +spoolingMode +spotIamFleetRole +sql +sqlParameters +sqlQuery +sqlStatementResults +sqlStatements +sqs +srcCodeOrDbAnalysisStatus +sseConfig +sseKmsKeyId +sshKeyName +sshPublicKey +ssmAgentDiscoveryDatetime +ssmDocument +ssmDocumentName +ssmDocumentType +ssmDocuments +ssmOutput +ssmValidationParameters +ssmlMessage +ssoApplicationId +ssoClientId +ssoIdentity +stabilityStatus +stabilityStatusAt +stackId +stackName +stackParameters +stackSetName +stage +stageArn +stageDescription +stageDetails +stageKeys +stageName +stageProgress +stageSession +stageSessions +stageStates +stageVariableOverrides +stageVariables +stages +stagingAccountID +stagingAccountIDs +stagingArea +stagingAreaSubnetId +stagingAreaTags +stagingAvailabilityZone +stagingDiskType +stagingSourceServerArn +standardControlsCount +standardDeviation +start +startAfter +startAt +startAtPreviousStartedEvent +startBit +startByte +startCharOffset +startChildWorkflowExecutionDecisionAttributes +startChildWorkflowExecutionFailedEventAttributes +startChildWorkflowExecutionInitiatedEventAttributes +startColumn +startDate +startDateTime +startFromHead +startInclusive +startLambdaFunctionFailedEventAttributes +startLine +startOn +startPeriod +startResponse +startSigningJobParameter +startTime +startTimeFilter +startTimeInSeconds +startTimeOffsetInNanos +startTimeRange +startTimeout +startTimeoutMs +startTimerDecisionAttributes +startTimerFailedEventAttributes +startTimes +startTimestamp +startToCloseTimeout +startToFireTimeout +startToken +startUrl +started +startedAfter +startedAt +startedBefore +startedBy +startedEventId +startedFromBackupId +startedOn +startedTime +startingToken +stat +state +stateChangeConfiguration +stateChangeError +stateChangeTimeRange +stateChangedAt +stateChanges +stateDescription +stateDetail +stateDetails +stateEnteredEventDetails +stateExitedEventDetails +stateMachineAliasArn +stateMachineAliases +stateMachineArn +stateMachineName +stateMachineVersionArn +stateMachineVersions +stateMachines +stateName +stateOrProvince +stateReason +stateValue +statement +statementId +states +staticColumns +staticIp +staticIpName +staticIps +statistic +statisticalThreshold +statistics +statisticsId +stats +status +statusChangeTime +statusChangedAt +statusCode +statusCodes +statusCounts +statusDetail +statusDetails +statusEquals +statusFilter +statusList +statusMessage +statusReason +statusReportS3Bucket +statusReportS3Key +statusSummary +statusTimeoutInSeconds +statusType +statusUpdateDateTime +statuscode +statuses +stdDeviation +stddev +step +stepActionType +stepAutomationConfiguration +stepExecutionId +stepFunctions +stepGroupId +stepId +stepName +stepTarget +stepTargets +stepTimeoutInMinutes +steps +stillWaitingResponse +stmt +stopAction +stopAt +stopCode +stopConditions +stopDate +stopInstanceOnIdleRequest +stopTime +stopTimeout +stopTrigger +stopped +stoppedAt +stoppedBy +stoppedReason +stoppingAt +stoppingCondition +storage +storageCapacity +storageClass +storageCompressionFormat +storageConfigurations +storageGBHour +storageLocation +storagePerMonthInGb +storageType +storeArn +storeFormat +storeId +storeName +storeOptions +storeSizeBytes +storedBytes +strValues +strategy +strategyOption +stream +streamArn +streamConfiguration +streamId +streamInfo +streamKey +streamKeys +streamName +streamOutputToCloudWatch +streamSession +streamSessions +streamUI +streamUrl +streamVersion +streamingImage +streamingImageId +streamingImageIds +streamingImages +streamingSessionBackup +streamingSessionBackups +streams +streamsKmsKey +streamsKmsRole +street1 +street2 +street3 +streetInfo +streetName +streetNumber +streetSuffix +string +stringSetValue +stringValue +stringValues +strings +structurallyExclusive +studio +studioComponent +studioComponentId +studioComponentIds +studioComponentName +studioComponentSummaries +studioComponents +studioEncryptionConfiguration +studioId +studioName +studioUrl +studios +style +subDomainSetting +subDomainSettings +subDomains +subFolders +subModules +subResourceId +subSlotHints +subSlotSetting +subSlotToElicit +subSlots +subTitle +subdirectory +subject +subjectAlternativeNames +subjectArn +subjectId +subjectStructures +subjects +submit +submitTime +submittedAt +submittedBy +submitter +subnet +subnetId +subnetIds +subnets +subqueries +subscribedAt +subscriber +subscriberArn +subscriberDescription +subscriberEndpoint +subscriberId +subscriberIdentity +subscriberName +subscriberStatus +subscribers +subscriptionFilters +subscriptionProtocol +subscriptionType +subscriptions +subscriptionsFilePath +subtitle +subtype +succeeded +succeededFindingsCount +succeededWorldCount +succeededWorlds +success +successCodes +successConditional +successCount +successEntries +successNextStep +successResponse +successResponseHandlingConfig +successful +successfulEntries +successfulExecutions +successfulRequests +successfulSet +successfulVersions +suffix +suggest +suggestedChanges +suggestedFixes +suggester +suggestion +suggestions +suite +suiteDefinitionArn +suiteDefinitionConfiguration +suiteDefinitionId +suiteDefinitionInformationList +suiteDefinitionName +suiteDefinitionVersion +suiteRunArn +suiteRunConfiguration +suiteRunId +suiteRunsList +suites +sum +sumOfSquares +summaries +summary +summaryList +superuserParameters +supplementaryConfiguration +suppliedData +supportCode +supportedApiVersions +supportedAppCategories +supportedComponentSources +supportedDataTransferApis +supportedDataTransferTypes +supportedDateFormat +supportedDestinationConnectors +supportedFieldTypeDetails +supportedFormats +supportedHours +supportedLanguages +supportedLocales +supportedOperators +supportedOsVersions +supportedPlatforms +supportedRegions +supportedSchedulingFrequencies +supportedTriggerTypes +supportedValues +supportedVersion +supportedWriteOperations +supportsNitroInstances +suppressAlerts +suppressDataIdentifiers +suppressIndefinitely +suppressNextMessage +suppressed +suppressedAlertsIncluded +suppressedNonCompliantResourcesCount +suppressions +swappiness +symbolicLinks +syncConfig +syncDefinitions +syncFromResources +syncJobSummaries +syncResources +syncRole +syncSource +syncType +syncWithPublicNamespace +synonyms +systemControls +systemEvent +systemEvidenceCount +systemInfo +systemInitializationScripts +systemInstanceId +systemMessage +systemResourceLimits +systemsManagerAgent +tableArn +tableColumnId +tableColumnName +tableColumns +tableId +tableName +tablePrefix +tableReference +tableRegistrationOutput +tableRestoreRequestId +tableRestoreStatus +tableRestoreStatuses +tables +tabularConditions +tabularPropertyValues +tabularSchemaConfig +tag +tagCriterion +tagFilter +tagFilters +tagKey +tagKeyComparisonType +tagKeys +tagList +tagQueryConfiguration +tagScopeTerm +tagStatus +tagValue +tagValueComparisonType +tagValues +tags +tagsOverride +taints +target +targetAccount +targetAccountId +targetAccountIds +targetAction +targetArn +targetArns +targetAwsAccount +targetBitrate +targetBranch +targetCapacity +targetCheckNames +targetComponentName +targetComponentTypeId +targetDatabaseEngine +targetDatabaseName +targetDestination +targetEirp +targetEntityId +targetFileSize +targetFilters +targetFramerate +targetFrames +targetFramesIndex +targetGroup +targetGroupArn +targetGroupArns +targetGroupIdentifier +targetGroupInfoList +targetGroupPairInfoList +targetGroupType +targetGroups +targetId +targetIdentifier +targetIds +targetInstanceID +targetInstanceTypeRightSizingMethod +targetInstances +targetIntervalSeconds +targetKeyspaceName +targetName +targetNodes +targetPipeline +targetRegion +targetRepository +targetResolution +targetResource +targetResourceCount +targetResourceCreatedAt +targetResourceType +targetResourceTypes +targetRevision +targetRoleArn +targetSchemaName +targetSelection +targetSnapshotName +targetState +targetStatus +targetTableName +targetType +targetUrl +targetVersion +targetVersionWeight +targetVpc +targets +task +taskArn +taskArns +taskContext +taskCredentials +taskDefinition +taskDefinitionArn +taskDefinitionArns +taskDefinitions +taskEndTime +taskError +taskErrorDetails +taskFailedEventDetails +taskId +taskIdList +taskIds +taskInfos +taskList +taskListScheduleToStartTimeout +taskName +taskObject +taskPriority +taskProperties +taskRoleArn +taskScheduledEventDetails +taskSet +taskSetArn +taskSetLabel +taskSets +taskSetsInfo +taskStartFailedEventDetails +taskStartTime +taskStartToCloseTimeout +taskStartedEventDetails +taskStatistics +taskStatus +taskSubmitFailedEventDetails +taskSubmittedEventDetails +taskSucceededEventDetails +taskSummary +taskTimedOutEventDetails +taskToken +taskType +taskingDocument +taskrunnerId +tasks +tcpRetryEvents +tcpRoute +teamId +teamMembers +teamName +telemetryEndpoint +telemetryMetadata +template +templateArn +templateBody +templateFile +templateFormat +templateId +templateLocation +templateMajorVersion +templateMinorVersion +templateName +templateStepGroupSummary +templateStepSummaryList +templateSummaries +templateSummary +templateSyncConfig +templateType +templateUri +templateVersion +templateVersions +templates +templatesLocation +temporaryPassword +tenancy +tenant +tenantDisplayName +tenantId +tenantIdentifier +termDurationInSeconds +termLength +terminate +terminateAt +terminateBlueInstancesOnDeploymentSuccess +terminateInstanceOnFailure +terminateJobsOnUpdate +terminationWaitTimeInMinutes +termsAggregation +terraformSource +terraformSourceName +terraformSourceNames +terraformSources +test +testArtifactsUrl +testBotAliasTags +testCaseDefinitionId +testCaseDefinitionName +testCaseRunId +testCaseScenarioId +testCaseScenarioType +testCases +testConfigUrl +testDurationInMinutes +testExecutionId +testExecutionModality +testExecutionResults +testExecutionStatus +testExecutions +testGridProject +testGridProjects +testGridSession +testGridSessions +testId +testPackageArn +testRawDataPath +testRecommendations +testResult +testScenarios +testSetDiscrepancyRawOutputUrl +testSetDiscrepancyReportId +testSetDiscrepancyReportStatus +testSetDiscrepancyTopErrors +testSetExportSpecification +testSetGenerationId +testSetGenerationStatus +testSetId +testSetImportResourceSpecification +testSetName +testSetRecords +testSetTags +testSets +testSpecArn +testSummary +testTrafficRoute +testType +testingInformation +tests +text +textDataDeliveryEnabled +textInput +textInputSpecification +textLogSettings +textResponse +tfi +tgwStatus +theme +themeToCreate +then +thingArn +thingConnectivityIndexingMode +thingGroupArn +thingGroupDescription +thingGroupId +thingGroupIndexingConfiguration +thingGroupIndexingMode +thingGroupMetadata +thingGroupName +thingGroupNames +thingGroupProperties +thingGroups +thingGroupsToAdd +thingGroupsToRemove +thingId +thingIndexingConfiguration +thingIndexingMode +thingName +thingTypeArn +thingTypeDescription +thingTypeId +thingTypeMetadata +thingTypeName +thingTypeProperties +thingTypes +things +thirdPartyConfigurationUrl +threadStates +threadsPerCore +threshold +thresholdBreachValue +thresholdPercent +thresholdPercentage +thresholdValue +throttle +throttleSettings +throttling +throttlingBurstLimit +throttlingRateLimit +throughput +throughputInfo +throughputMode +thumbnailConfiguration +thumbnailUrl +thumbprint +tier +time +timeBasedCanary +timeBasedLinear +timeCreated +timeDimension +timeExpression +timeInMillis +timeInSeconds +timeOfCreation +timeOfEvent +timeOrdering +timePeriod +timeRange +timeSeriesArn +timeSeriesCreationDate +timeSeriesId +timeSeriesLastUpdateDate +timeSeriesType +timeToLive +timeToLiveInSeconds +timeValue +timedOut +timems +timeout +timeoutConditional +timeoutConfig +timeoutInMillis +timeoutInMins +timeoutInMinutes +timeoutInMinutesOverride +timeoutInSeconds +timeoutMillis +timeoutMinutes +timeoutNextStep +timeoutResponse +timeoutSeconds +timeoutType +timerCanceledEventAttributes +timerFiredEventAttributes +timerId +timerName +timerStartedEventAttributes +timers +timestamp +timestampFormat +timestampPartition +timestamps +timestream +timestreamDatabaseArn +timestreamDatabaseName +timestreamRegistrationResponse +timestreamResources +timestreamTableArn +timestreamTableName +timezone +tip +title +titles +tleData +tleLine1 +tleLine2 +tls +tlsCertificateSummaries +tlsCertificates +tlsConfig +tlsContext +tlsPolicies +tlsPolicyName +tmpfs +to +toBlockchainInstant +toDate +toDateTime +toPermissionArn +toPermissionVersion +toPort +token +tokenBalances +tokenEndpoint +tokenExpirationTime +tokenFilter +tokenId +tokenIdentifier +tokenKeyName +tokenName +tokenNameList +tokenSignature +tokenSigningPublicKeys +tokenType +tokenUrl +tokenUrlCustomProperties +tokenUrls +tokenValue +toleratedFailureCount +toleratedFailurePercentage +tooNewLogEventStartIndex +tooOldLogEventEndIndex +toolName +toolchain +tools +topMatches +topPanel +topic +topicArn +topicIntegrationArn +topicPattern +topicPolicy +topicRuleDestination +topicRulePayload +topologyFilter +total +totalActuators +totalAgentlessCollectors +totalAgents +totalApplications +totalAssessmentControlsCount +totalAttributes +totalBackupSizeInMegaBytes +totalBaseCount +totalBranches +totalBytesClassified +totalChecks +totalConnectors +totalControlsCount +totalCount +totalCounts +totalDataInMegaBytes +totalDetections +totalDetectionsSuppressed +totalDiscoveredResources +totalDurationInMillis +totalEdgePropertyValues +totalEvidence +totalExecutionDurationSeconds +totalFailureCount +totalFindingsCount +totalItemsClassified +totalItemsSensitive +totalItemsSkipped +totalItemsSkippedInvalidEncryption +totalItemsSkippedInvalidKms +totalItemsSkippedPermissionDenied +totalJobs +totalMeCollectors +totalNoOfSrv +totalNodePropertyValues +totalNodes +totalNumberOfFindings +totalNumberOfJobs +totalParts +totalReadCount +totalRecords +totalRecordsCount +totalRecordsProcessed +totalReservedMinuteAllocation +totalResourceUtilization +totalResources +totalResourcesCount +totalResultCount +totalResults +totalScheduledMinutes +totalSensors +totalServerGroups +totalServers +totalSizeInBytes +totalSizeInMegaBytes +totalSourceServers +totalStepCount +totalSteps +totalStepsFailed +totalStepsSkipped +totalStepsSucceeded +totalStorageBytes +totals +tpr +traceHeader +tracingConfiguration +tracingEnabled +trackerName +trackingConfigArn +trackingId +trackingInformation +trackingNamespaceName +trackingNamespaceVersion +trackingNumber +trafficGroupArn +trafficRoutingConfig +trafficWeight +trailList +trailNameList +trailProperties +trails +trainModelS3Location +trainingDataCollectionStartDate +trainingDataConfig +trainingDataSchema +trainingDataSource +trainingEntryPointScript +trainingHours +trainingInputMode +trainingInstanceType +trainingInstanceVolumeSizeInGB +trainingJobName +trainingLoss +trainingMetrics +trainingMetricsV2 +trainingMode +trainingResult +trainingResultV2 +trainingTimeOutInSeconds +trait +traits +tranformationToolInstallationLink +transaction +transactionFee +transactionHash +transactionId +transactionIndex +transactionStatus +transactionTimestamp +transactions +transcript +transcriptFilter +transcriptFormat +transcriptSourceSetting +transferData +transferDate +transferMessage +transferPerMonthInGb +transferredCertificateArn +transferredTo +transform +transformEntryPointScript +transformationTool +transitEncryption +transitEncryptionEnabled +transitEncryptionPort +transitGatewayConfiguration +transitGatewayID +transitionEvents +transitionType +transitions +transmitDisabled +transportProtocol +traversalDirection +traversalType +treatMissingData +treatmentName +treatmentNames +treatmentWeights +treatments +treeId +trendField +trialMinutes +trigger +triggerArn +triggerConfig +triggerConfigurations +triggerDetail +triggerDetails +triggerEvents +triggerMode +triggerName +triggerProperties +triggerTargetArn +triggerType +triggers +troubleshootingText +truncated +truncatedEvents +trust +trustAnchor +trustAnchorArn +trustAnchorId +trustAnchors +trustPolicy +trustStore +trustStoreArn +trustStores +truststoreUri +truststoreVersion +truststoreWarnings +ttl +ttps +tumbling +tunedHPOParams +tunnel +tunnelArn +tunnelId +tunnelSummaries +turnNumber +turnResult +turnSpecification +turnsToLive +type +typeFilter +typeHint +typeInfo +typeInfos +typeName +types +typesFilePath +udid +uid +ulimits +unauthorizedCacheControlHeaderStrategy +uncertaintyRange +unclassifiableObjectCount +unclassifiableObjectSizeInBytes +undoDeprecate +unencrypted +unfinished +unhealthyAgentlessCollectors +unhealthyAgents +unhealthyConnectors +unhealthyMeCollectors +unhealthyThreshold +unhealthyThresholdCount +unicode +uninstallAfterBuild +uniqueId +uniqueProblems +unit +unitLabel +unitOfMeasure +units +unknown +unknownAgentlessCollectors +unknownAgents +unknownConnectors +unknownMeCollectors +unlabeledEventsTreatment +unlimited +unmanagedvCpus +unmask +unmetered +unmeteredDevices +unmeteredRemoteAccessDevices +unprocessedAccounts +unprocessedEndTimes +unprocessedJobs +unprocessedResourceKeys +unprocessedWorlds +unsetDefaultVersion +unsuccessful +unsupportedResourceStatus +unsupportedResources +unvalidatedJSON +upToDate +upcomingMinutesScheduled +updatableAttributes +update +updateCACertificateParams +updateCollectionDetail +updateConfig +updateConfiguration +updateDate +updateDateTime +updateDeviceCertificateParams +updateId +updateIds +updateImageSetMetadataUpdates +updateInstructionBatch +updateMode +updateOutdatedInstancesOnly +updatePolicy +updateReason +updateResponse +updateResults +updateSingleCardinalityProperties +updateStatus +updateStatusReason +updateTime +updateTimestamp +updateToLatestImageVersion +updateType +updated +updatedAt +updatedBy +updatedByChangesetId +updatedComponent +updatedDate +updatedForm +updatedTheme +updatedTime +updatesChangesetId +upfrontPaymentAmount +uplinkBandwidthBits +uplinkDelayMs +uplinkJitterMs +uplinkLossPercent +upload +uploadAllowed +uploadBehavior +uploadConfigurations +uploadId +uploadSequenceToken +uploadStatus +uploadUrl +uploads +upperBoundValue +upperBoundValues +upperInclusive +upsertAction +upstream +upstreamRegistryUrl +upstreams +uri +uris +url +urlExpiry +urls +usage +usageCost +usageLimit +usageLimitArn +usageLimitId +usageLimits +usagePlanId +usageState +usageText +usageTotals +usageType +usageTypes +useBase64 +useCallerCredentials +useDedicatedReplicationServer +useDefaultApplications +useDefaultTools +useDefaultUploadConfigurations +useEventVariables +useExtendedIds +useFipsEndpoint +useLatestRestorableAutoSnapshot +useLatestRestorableTime +useOnly +usePrefixAttributeValue +usePrivateIP +usePrivateLinkForMetadataAndAuthorization +useStageCache +used +user +userAccessLoggingSettings +userAccessLoggingSettingsArn +userAccessResultsList +userAccessTasksList +userAgent +userArn +userAttribute +userAttributes +userAttributesForFindings +userCode +userData +userDataOverride +userDataValidationParameters +userFeedback +userFirstName +userFullName +userGroups +userId +userIdentity +userIds +userInitializationScripts +userLastName +userLoginName +userName +userPausedDetails +userPoolArn +userPoolConfig +userPoolId +userProfiles +userProperties +userProvidedEdgeIds +userProvidedID +userRole +userRoleArn +userRules +userSettings +userSettingsArn +userStatus +userTurn +userType +username +usernameClaim +usernamePrefix +users +utilizationMetrics +utterance +utteranceFirstRecordedInAggregationDuration +utteranceInput +utteranceLastRecordedInAggregationDuration +utteranceLevelTestResults +utteranceRequestId +utteranceString +utteranceTimestamp +utteranceUnderstood +utterances +uuid +v1 +v1BotLocale +v1BotName +v1BotNameContains +v1BotVersion +v2BotId +v2BotName +v2BotRole +vCPUHour +valid +validTimeRange +validZones +validatePolicyResourceType +validateRequestBody +validateRequestParameters +validatedDependencyRevisions +validatedNamespaceVersion +validation +validationCertificateArn +validationDataConfig +validationErrors +validationId +validationLoss +validationMessage +validationMetrics +validationOutputList +validationResults +validationSettings +validationStatus +validationWarnings +validations +validators +validity +value +valueElicitationPrompt +valueElicitationPromptSpecification +valueElicitationSetting +valueFrom +valueKey +valueMappings +valueRegexPattern +valueSelectionSetting +valueSelectionStrategy +valueSet +valueString +valueType +values +variableEntries +variableImpactExplanations +variableImportance +variableImportanceMetrics +variableName +variableNames +variableType +variables +variance +variantImportJobs +variantStores +variantValues +variants +variation +variations +vaultName +vaultNotificationConfig +vcenterBasedRemoteInfoList +vcenterClientID +vcenterConfigurationTimeStamp +vcenterUUID +vcpus +vehicleName +vehicleSummaries +vehicles +vendor +vendorAdditionalFixedProperties +vendorAdditionalTransientProperties +vendorCreatedAt +vendorGuidance +vendorGuidanceMessage +vendorProperties +vendorSeverity +vendorUpdatedAt +vendorWorkerId +vendorWorkerIpAddress +verificationCertificate +verificationState +verificationStateDescription +verificationUri +verificationUriComplete +verified +version +versionArn +versionCode +versionControl +versionControlConfigurationTimeStamp +versionControlInfoList +versionControlType +versionDescription +versionId +versionInfo +versionName +versionNumber +versionOptions +versionOrAlias +versionQualifier +versionRequirement +versionRequirements +versionRevision +versionRevisions +versionSizeBytes +versionStatus +versionUpdateByJobsConfig +versioned +versioning +versioningConfiguration +versions +verticalGap +veryLow +video +videoCapture +videoEndpoint +videoHeight +videoWidth +viewerCount +viewerId +viewerSessionVersionsLessThanOrEqualTo +viewerSessions +violationEventAdditionalInfo +violationEventOccurrenceRange +violationEventTime +violationEventType +violationEvents +violationId +violationIds +violationStartTime +virtualCluster +virtualClusterId +virtualClusterIdentifier +virtualClusters +virtualGateway +virtualGatewayId +virtualGatewayName +virtualGatewayOwnerAccount +virtualGatewayRegion +virtualGatewayState +virtualGateways +virtualInterface +virtualInterfaceId +virtualInterfaceName +virtualInterfaceOwnerAccount +virtualInterfaceRegion +virtualInterfaceState +virtualInterfaceTest +virtualInterfaceTestHistory +virtualInterfaceType +virtualInterfaces +virtualName +virtualNode +virtualNodeName +virtualNodes +virtualRouter +virtualRouterName +virtualRouters +virtualService +virtualServiceName +virtualServices +visibility +vlan +vmId +vmImportTaskId +vmManagerId +vmManagerName +vmManagerType +vmName +vmPath +vmServer +vmServerAddress +vmServerAddressList +vmWareUuid +vnfConfigurableProperties +vnfInstanceId +vnfPkgId +vnfPkgIds +vnfPkgName +vnfProductName +vnfProvider +vnfState +vnfcResourceInfo +vnfd +vnfdId +vnfdVersion +voiceId +voiceSettings +volumeArn +volumeArns +volumeBaselineIOPS +volumeBaselineThroughput +volumeBurstIOPS +volumeBurstThroughput +volumeConfiguration +volumeEncryptionKMSKey +volumeId +volumeMounts +volumeRecommendationOptions +volumeRecommendations +volumeRetentionMode +volumeSize +volumeSizeInGB +volumeSizeInGb +volumeToConversionMap +volumeToVolumeSize +volumeType +volumes +volumesFrom +voutIndex +vpc +vpcConfig +vpcConfiguration +vpcDestinationSummary +vpcEndpoint +vpcEndpointDetails +vpcEndpointErrorDetails +vpcEndpointFilters +vpcEndpointId +vpcEndpointIds +vpcEndpointSummaries +vpcEndpoints +vpcID +vpcId +vpcIdentifier +vpcLinkId +vpcProperties +vpcSecurityGroupId +vpcSecurityGroupIds +vpcSecurityGroups +vpceConfiguration +vpceConfigurationArns +vpceConfigurationDescription +vpceConfigurationName +vpceConfigurations +vpceIds +vpceServiceName +vss +vulnerabilities +vulnerability +vulnerabilityId +vulnerabilityIdAggregation +vulnerabilityIds +vulnerabilitySource +vulnerabilitySourceUpdatedAt +vulnerablePackages +wafWebAclArn +waitAndContinueSpecification +waitTimeInMinutes +waitTimeSeconds +waited +waitingForDataCollectionChecks +waitingResponse +warehouse +warned +warnings +waveAggregatedStatus +waveID +waveIDs +waves +wavesCount +webAclArn +webUrl +webhook +webhookArn +webhookId +webhookName +webhookUrl +webhooks +weeklySchedule +weight +weightFactor +weightedTargets +weights +welcomeMessages +width +wifi +window +windows +windowsMountDrive +windowsUser +witnessedAt +workIds +workbookCursor +workbookId +workerConfiguration +workerConfigurationArn +workerConfigurations +workerCount +workerFleets +workerGroup +workerLogDelivery +workerName +workerTypeSpecifications +workers +workflowArn +workflowBucket +workflowBuildVersionArn +workflowExecution +workflowExecutionCancelRequestedEventAttributes +workflowExecutionCanceledEventAttributes +workflowExecutionCompletedEventAttributes +workflowExecutionContinuedAsNewEventAttributes +workflowExecutionFailedEventAttributes +workflowExecutionId +workflowExecutionRetentionPeriodInDays +workflowExecutionSignaledEventAttributes +workflowExecutionStartedEventAttributes +workflowExecutionTerminatedEventAttributes +workflowExecutionTimedOutEventAttributes +workflowExecutions +workflowId +workflowInputs +workflowName +workflowStepAutomationConfiguration +workflowStepGroupsSummary +workflowStepsSummary +workflowSummaries +workflowType +workflowTypeVersion +workgroup +workgroupArn +workgroupId +workgroupName +workgroups +workingDirectory +workspace +workspaceDataSources +workspaceDescription +workspaceId +workspaceName +workspaceNotificationDestinations +workspaceOrganizationalUnits +workspaceRoleArn +workspaceSummaries +workspaces +world +worldConfigs +worldCount +worldDescriptionBody +worldExportJobSummaries +worldGenerationJobSummaries +worldSummaries +worldTags +worlds +writeCapacityUnits +writeOperationType +x +x509CertificateData +x509Subject +xAmzErrorType +xmlNamespace +xrayEnabled +xsltTemplateName +xsltTemplateNameForMacSec +y +year +z +zipUploadUrl +zonalShiftId +zonalShifts +zoneName diff --git a/codegen-core/src/test/resources/testOutput.txt b/codegen-core/src/test/resources/testOutput.txt new file mode 100644 index 00000000000..08b51fdf854 --- /dev/null +++ b/codegen-core/src/test/resources/testOutput.txt @@ -0,0 +1,62988 @@ +ACL,acl +ACLAlreadyExistsFault,acl_already_exists_fault +ACLName,acl_name +ACLNames,acl_names +ACLNotFoundFault,acl_not_found_fault +ACLPendingChanges,acl_pending_changes +ACLQuotaExceededFault,acl_quota_exceeded_fault +ACLToApply,acl_to_apply +ACLs,acls +ACLsUpdateStatus,acls_update_status +ACMCertificateArn,acm_certificate_arn +ACTIVE,active +ADDomainJoinPassword,ad_domain_join_password +ADDomainJoinUser,ad_domain_join_user +ADM,adm +ADMChannelRequest,adm_channel_request +ADMChannelResponse,adm_channel_response +ADMMessage,adm_message +ALPNPolicyNotSupportedException,alpn_policy_not_supported_exception +APICallRateForCustomerExceededFault,api_call_rate_for_customer_exceeded_fault +APIKey,api_key +APIKeySummaries,api_key_summaries +APIKeySummary,api_key_summary +APIName,api_name +APNS,apns +APNSChannelRequest,apns_channel_request +APNSChannelResponse,apns_channel_response +APNSMessage,apns_message +APNSPushNotificationTemplate,apns_push_notification_template +APNSPushType,apns_push_type +APNSSandboxChannelRequest,apns_sandbox_channel_request +APNSSandboxChannelResponse,apns_sandbox_channel_response +APNSVoipChannelRequest,apns_voip_channel_request +APNSVoipChannelResponse,apns_voip_channel_response +APNSVoipSandboxChannelRequest,apns_voip_sandbox_channel_request +APNSVoipSandboxChannelResponse,apns_voip_sandbox_channel_response +ARN,arn +ASN1Subject,asn1_subject +ASName,as_name +ASNumber,as_number +ASSERTION,assertion +ATIMetricDataPoint,ati_metric_data_point +ATIModelPerformance,ati_model_performance +ATITrainingMetricsValue,ati_training_metrics_value +AWSAccessKeyId,aws_access_key_id +AWSAccount,aws_account +AWSAccountId,aws_account_id +AWSAccountIds,aws_account_ids +AWSCost,aws_cost +AWSDomainInformation,aws_domain_information +AWSKMSKeyARN,awskms_key_arn +AWSLocation,aws_location +AWSManagedRulesACFPRuleSet,aws_managed_rules_acfp_rule_set +AWSManagedRulesATPRuleSet,aws_managed_rules_atp_rule_set +AWSManagedRulesBotControlRuleSet,aws_managed_rules_bot_control_rule_set +AWSOrganizationsNotInUseException,aws_organizations_not_in_use_exception +AWSService,aws_service +AWSServiceAccessNotEnabledException,aws_service_access_not_enabled_exception +AWSServiceName,aws_service_name +AWSSessionCredentials,aws_session_credentials +AZList,az_list +AZMode,az_mode +AacSettings,aac_settings +AbortConfig,abort_config +AbortCriteria,abort_criteria +AbortDate,abort_date +AbortDocumentVersionUploadRequest,abort_document_version_upload_request +AbortEnvironmentUpdateMessage,abort_environment_update_message +AbortIncompleteMultipartUpload,abort_incomplete_multipart_upload +AbortMultipartReadSetUploadRequest,abort_multipart_read_set_upload_request +AbortMultipartUploadInput,abort_multipart_upload_input +AbortMultipartUploadOutput,abort_multipart_upload_output +AbortMultipartUploadRequest,abort_multipart_upload_request +AbortRuleId,abort_rule_id +AbortTransaction,abort_transaction +AbortTransactionResult,abort_transaction_result +AbortVaultLockInput,abort_vault_lock_input +AbortableOperationInProgress,abortable_operation_in_progress +AbpV1_0_x,abp_v1_0_x +AbpV1_1,abp_v1_1 +AbrSettings,abr_settings +AbsentInputAudioBehavior,absent_input_audio_behavior +AbsoluteTime,absolute_time +AbsoluteTimeRange,absolute_time_range +AbuseContactEmail,abuse_contact_email +AbuseContactPhone,abuse_contact_phone +Ac3Settings,ac3_settings +AccelerateConfiguration,accelerate_configuration +AccelerationSettings,acceleration_settings +AccelerationStatus,acceleration_status +Accelerator,accelerator +AcceleratorArn,accelerator_arn +AcceleratorAttributes,accelerator_attributes +AcceleratorCount,accelerator_count +AcceleratorCountRequest,accelerator_count_request +AcceleratorEvent,accelerator_event +AcceleratorManufacturers,accelerator_manufacturers +AcceleratorNames,accelerator_names +AcceleratorNotDisabledException,accelerator_not_disabled_exception +AcceleratorNotFoundException,accelerator_not_found_exception +AcceleratorPort,accelerator_port +AcceleratorSocketAddresses,accelerator_socket_addresses +AcceleratorTotalMemoryMiB,accelerator_total_memory_mib +AcceleratorTotalMemoryMiBRequest,accelerator_total_memory_mib_request +AcceleratorType,accelerator_type +AcceleratorTypeOffering,accelerator_type_offering +AcceleratorTypes,accelerator_types +Accelerators,accelerators +Accent,accent +AccentForeground,accent_foreground +Accept,accept +AcceptAddressTransferRequest,accept_address_transfer_request +AcceptAddressTransferResult,accept_address_transfer_result +AcceptAdministratorInvitationRequest,accept_administrator_invitation_request +AcceptAnyDate,accept_any_date +AcceptAttachmentRequest,accept_attachment_request +AcceptAttachmentResponse,accept_attachment_response +AcceptCertificateTransferRequest,accept_certificate_transfer_request +AcceptCode,accept_code +AcceptCodeValidation,accept_code_validation +AcceptDirectConnectGatewayAssociationProposalRequest,accept_direct_connect_gateway_association_proposal_request +AcceptDirectConnectGatewayAssociationProposalResult,accept_direct_connect_gateway_association_proposal_result +AcceptDomainTransferFromAnotherAwsAccountRequest,accept_domain_transfer_from_another_aws_account_request +AcceptDomainTransferFromAnotherAwsAccountResponse,accept_domain_transfer_from_another_aws_account_response +AcceptEnvironmentAccountConnectionInput,accept_environment_account_connection_input +AcceptEnvironmentAccountConnectionOutput,accept_environment_account_connection_output +AcceptEulasRequest,accept_eulas_request +AcceptEulasResponse,accept_eulas_response +AcceptGrantRequest,accept_grant_request +AcceptGrantResponse,accept_grant_response +AcceptHandshakeRequest,accept_handshake_request +AcceptHandshakeResponse,accept_handshake_response +AcceptInboundConnectionRequest,accept_inbound_connection_request +AcceptInboundConnectionResponse,accept_inbound_connection_response +AcceptInboundCrossClusterSearchConnectionRequest,accept_inbound_cross_cluster_search_connection_request +AcceptInboundCrossClusterSearchConnectionResponse,accept_inbound_cross_cluster_search_connection_response +AcceptInputDeviceTransferRequest,accept_input_device_transfer_request +AcceptInvitationRequest,accept_invitation_request +AcceptLanguage,accept_language +AcceptMatchInput,accept_match_input +AcceptPageRequest,accept_page_request +AcceptPortfolioShareInput,accept_portfolio_share_input +AcceptQualificationRequestRequest,accept_qualification_request_request +AcceptRanges,accept_ranges +AcceptReservedInstancesExchangeQuoteRequest,accept_reserved_instances_exchange_quote_request +AcceptReservedInstancesExchangeQuoteResult,accept_reserved_instances_exchange_quote_result +AcceptReservedNodeExchangeInputMessage,accept_reserved_node_exchange_input_message +AcceptReservedNodeExchangeOutputMessage,accept_reserved_node_exchange_output_message +AcceptResourceShareInvitationRequest,accept_resource_share_invitation_request +AcceptResourceShareInvitationResponse,accept_resource_share_invitation_response +AcceptShareRequest,accept_share_request +AcceptShareResponse,accept_share_response +AcceptSharedDirectoryRequest,accept_shared_directory_request +AcceptSharedDirectoryResult,accept_shared_directory_result +AcceptTermsAndConditions,accept_terms_and_conditions +AcceptTime,accept_time +AcceptTransitGatewayMulticastDomainAssociationsRequest,accept_transit_gateway_multicast_domain_associations_request +AcceptTransitGatewayMulticastDomainAssociationsResult,accept_transit_gateway_multicast_domain_associations_result +AcceptTransitGatewayPeeringAttachmentRequest,accept_transit_gateway_peering_attachment_request +AcceptTransitGatewayPeeringAttachmentResult,accept_transit_gateway_peering_attachment_result +AcceptTransitGatewayVpcAttachmentRequest,accept_transit_gateway_vpc_attachment_request +AcceptTransitGatewayVpcAttachmentResult,accept_transit_gateway_vpc_attachment_result +AcceptType,accept_type +AcceptVpcEndpointConnectionsRequest,accept_vpc_endpoint_connections_request +AcceptVpcEndpointConnectionsResult,accept_vpc_endpoint_connections_result +AcceptVpcPeeringConnectionRequest,accept_vpc_peering_connection_request +AcceptVpcPeeringConnectionResult,accept_vpc_peering_connection_result +AcceptanceRequired,acceptance_required +AcceptanceThreshold,acceptance_threshold +AcceptanceTimeoutSeconds,acceptance_timeout_seconds +AcceptanceType,acceptance_type +Accepted,accepted +AcceptedRouteCount,accepted_route_count +AccepterPeeringConnectionOptions,accepter_peering_connection_options +AccepterTgwInfo,accepter_tgw_info +AccepterTransitGatewayAttachmentId,accepter_transit_gateway_attachment_id +AccepterVpcInfo,accepter_vpc_info +Access,access +AccessAll,access_all +AccessAlternateDirectly,access_alternate_directly +AccessBasedEnumeration,access_based_enumeration +AccessConfiguration,access_configuration +AccessControl,access_control +AccessControlAllowCredentials,access_control_allow_credentials +AccessControlAllowHeaders,access_control_allow_headers +AccessControlAllowMethods,access_control_allow_methods +AccessControlAllowOrigins,access_control_allow_origins +AccessControlAttribute,access_control_attribute +AccessControlAttributeValue,access_control_attribute_value +AccessControlAttributes,access_control_attributes +AccessControlConfigurationId,access_control_configuration_id +AccessControlConfigurationSummary,access_control_configuration_summary +AccessControlConfigurations,access_control_configurations +AccessControlEntries,access_control_entries +AccessControlEntry,access_control_entry +AccessControlEntrySummary,access_control_entry_summary +AccessControlExposeHeaders,access_control_expose_headers +AccessControlGrants,access_control_grants +AccessControlList,access_control_list +AccessControlListConfiguration,access_control_list_configuration +AccessControlMaxAgeSec,access_control_max_age_sec +AccessControlPolicy,access_control_policy +AccessControlRule,access_control_rule +AccessControlTranslation,access_control_translation +AccessDenied,access_denied +AccessDeniedException,access_denied_exception +AccessDeniedFault,access_denied_fault +AccessDeniedForDependencyException,access_denied_for_dependency_exception +AccessDescription,access_description +AccessDetail,access_detail +AccessDetails,access_details +AccessEndpoint,access_endpoint +AccessEndpoints,access_endpoints +AccessForbidden,access_forbidden +AccessGroupId,access_group_id +AccessKey,access_key +AccessKeyDetails,access_key_details +AccessKeyId,access_key_id +AccessKeyLastUsed,access_key_last_used +AccessKeyMetadata,access_key_metadata +AccessLevelFilter,access_level_filter +AccessLocation,access_location +AccessLog,access_log +AccessLogSettings,access_log_settings +AccessLogSubscriptionSummary,access_log_subscription_summary +AccessLoggingEnabled,access_logging_enabled +AccessLogs,access_logs +AccessMethod,access_method +AccessMethodType,access_method_type +AccessPoint,access_point +AccessPointAlreadyExists,access_point_already_exists +AccessPointArn,access_point_arn +AccessPointDescription,access_point_description +AccessPointId,access_point_id +AccessPointLimitExceeded,access_point_limit_exceeded +AccessPointList,access_point_list +AccessPointNotFound,access_point_not_found +AccessPointNotFoundException,access_point_not_found_exception +AccessPoints,access_points +AccessPolicies,access_policies +AccessPoliciesStatus,access_policies_status +AccessPolicy,access_policy +AccessPolicyDetail,access_policy_detail +AccessPolicyStats,access_policy_stats +AccessPolicySummary,access_policy_summary +AccessPreview,access_preview +AccessPreviewFinding,access_preview_finding +AccessPreviewStatusReason,access_preview_status_reason +AccessPreviewSummary,access_preview_summary +AccessRights,access_rights +AccessRole,access_role +AccessRoleArn,access_role_arn +AccessRules,access_rules +AccessScopeAnalysisFinding,access_scope_analysis_finding +AccessScopePath,access_scope_path +AccessScopePathRequest,access_scope_path_request +AccessStatus,access_status +AccessString,access_string +AccessSysfs,access_sysfs +AccessTier,access_tier +AccessToClusterDeniedFault,access_to_cluster_denied_fault +AccessToSnapshotDeniedFault,access_to_snapshot_denied_fault +AccessToken,access_token +AccessTokenExpiration,access_token_expiration +AccessTokenSummary,access_token_summary +AccessTokenValidity,access_token_validity +AccessType,access_type +AccessUrl,access_url +Accesses,accesses +Accessibility,accessibility +AccessibilityCaptionHints,accessibility_caption_hints +Accessor,accessor +AccessorId,accessor_id +AccessorSummary,accessor_summary +AccessorType,accessor_type +Accessors,accessors +Account,account +AccountActionRequiredException,account_action_required_exception +AccountAggregation,account_aggregation +AccountAggregationResponse,account_aggregation_response +AccountAggregationSource,account_aggregation_source +AccountAggregationSources,account_aggregation_sources +AccountAlias,account_alias +AccountAliases,account_aliases +AccountAlreadyClosedException,account_already_closed_exception +AccountAlreadyRegisteredException,account_already_registered_exception +AccountAssignment,account_assignment +AccountAssignmentCreationRequestId,account_assignment_creation_request_id +AccountAssignmentCreationStatus,account_assignment_creation_status +AccountAssignmentDeletionRequestId,account_assignment_deletion_request_id +AccountAssignmentDeletionStatus,account_assignment_deletion_status +AccountAssignmentOperationStatus,account_assignment_operation_status +AccountAssignmentOperationStatusMetadata,account_assignment_operation_status_metadata +AccountAssignments,account_assignments +AccountAssignmentsCreationStatus,account_assignments_creation_status +AccountAssignmentsDeletionStatus,account_assignments_deletion_status +AccountAssociationsListElement,account_associations_list_element +AccountAttribute,account_attribute +AccountAttributeList,account_attribute_list +AccountAttributeValue,account_attribute_value +AccountAttributes,account_attributes +AccountAttributesMessage,account_attributes_message +AccountChannelLimitExceededException,account_channel_limit_exceeded_exception +AccountConfiguration,account_configuration +AccountCustomization,account_customization +AccountDetail,account_detail +AccountDetails,account_details +AccountEmail,account_email +AccountEnrollmentStatus,account_enrollment_status +AccountEntityAggregate,account_entity_aggregate +AccountFilterType,account_filter_type +AccountFindingsMetric,account_findings_metric +AccountFreeTrialInfo,account_free_trial_info +AccountGateResult,account_gate_result +AccountGrouping,account_grouping +AccountHasOngoingImportException,account_has_ongoing_import_exception +AccountHealth,account_health +AccountID,account_id +AccountId,account_id +AccountIds,account_ids +AccountIdsToAdd,account_ids_to_add +AccountIdsToRemove,account_ids_to_remove +AccountInfo,account_info +AccountInsightHealth,account_insight_health +AccountLevel,account_level +AccountLevelBpaSync,account_level_bpa_sync +AccountLevelPermissions,account_level_permissions +AccountLimit,account_limit +AccountLimitExceededException,account_limit_exceeded_exception +AccountLimits,account_limits +AccountLinked,account_linked +AccountMaxReadCapacityUnits,account_max_read_capacity_units +AccountMaxWriteCapacityUnits,account_max_write_capacity_units +AccountModification,account_modification +AccountModifications,account_modifications +AccountName,account_name +AccountNotFoundException,account_not_found_exception +AccountNotRegisteredException,account_not_registered_exception +AccountNumber,account_number +AccountOwnerNotVerifiedException,account_owner_not_verified_exception +AccountPassword,account_password +AccountPolicy,account_policy +AccountQuota,account_quota +AccountQuotaName,account_quota_name +AccountQuotas,account_quotas +AccountRecoverySetting,account_recovery_setting +AccountRecoverySettingType,account_recovery_setting_type +AccountRegisteredException,account_registered_exception +AccountScope,account_scope +AccountSendingPausedException,account_sending_paused_exception +AccountSettings,account_settings +AccountSettingsDetail,account_settings_detail +AccountSetupInProgressException,account_setup_in_progress_exception +AccountSharingInfo,account_sharing_info +AccountSharingInfoList,account_sharing_info_list +AccountState,account_state +AccountStatus,account_status +AccountStatusList,account_status_list +AccountStreamLimitExceededException,account_stream_limit_exceeded_exception +AccountSubscriptionStatus,account_subscription_status +AccountSummary,account_summary +AccountSuspendedException,account_suspended_exception +AccountTakeoverActionType,account_takeover_action_type +AccountTakeoverActionsType,account_takeover_actions_type +AccountTakeoverRiskConfiguration,account_takeover_risk_configuration +AccountTakeoverRiskConfigurationType,account_takeover_risk_configuration_type +AccountType,account_type +AccountUsage,account_usage +AccountWithRestoreAccess,account_with_restore_access +Accounts,accounts +AccountsUrl,accounts_url +AccountsWithRestoreAccess,accounts_with_restore_access +AccumulatedInferenceDataEndTime,accumulated_inference_data_end_time +AccumulatedInferenceDataStartTime,accumulated_inference_data_start_time +Accuracy,accuracy +AccuracyCostTradeoff,accuracy_cost_tradeoff +AckModeRetryDurationSecs,ack_mode_retry_duration_secs +AcknowledgeActionConfiguration,acknowledge_action_configuration +AcknowledgeAlarmActionRequest,acknowledge_alarm_action_request +AcknowledgeFlow,acknowledge_flow +AcknowledgeJobInput,acknowledge_job_input +AcknowledgeJobOutput,acknowledge_job_output +AcknowledgeOrderReceiptRequest,acknowledge_order_receipt_request +AcknowledgeOrderReceiptResponse,acknowledge_order_receipt_response +AcknowledgeThirdPartyJobInput,acknowledge_third_party_job_input +AcknowledgeThirdPartyJobOutput,acknowledge_third_party_job_output +AcknowledgedAt,acknowledged_at +Acl,acl +AclConfiguration,acl_configuration +AclRule,acl_rule +AcmCertificateArn,acm_certificate_arn +AcquisitionPointId,acquisition_point_id +Action,action +ActionAfterCompletion,action_after_completion +ActionArn,action_arn +ActionCondition,action_condition +ActionConfiguration,action_configuration +ActionConfigurationProperty,action_configuration_property +ActionContext,action_context +ActionDeclaration,action_declaration +ActionDefinition,action_definition +ActionDescription,action_description +ActionExecution,action_execution +ActionExecutionDetail,action_execution_detail +ActionExecutionFilter,action_execution_filter +ActionExecutionInput,action_execution_input +ActionExecutionOutput,action_execution_output +ActionExecutionResult,action_execution_result +ActionHistories,action_histories +ActionHistory,action_history +ActionHistoryDetails,action_history_details +ActionID,action_id +ActionId,action_id +ActionIdentifier,action_identifier +ActionInvocation,action_invocation +ActionInvocations,action_invocations +ActionLocalIpDetails,action_local_ip_details +ActionLocalPortDetails,action_local_port_details +ActionName,action_name +ActionNames,action_names +ActionNotFoundException,action_not_found_exception +ActionOnFailure,action_on_failure +ActionOperations,action_operations +ActionParameter,action_parameter +ActionParameters,action_parameters +ActionPrefix,action_prefix +ActionRemoteIpDetails,action_remote_ip_details +ActionRemotePortDetails,action_remote_port_details +ActionRequired,action_required +ActionRequiredCode,action_required_code +ActionRequiredInfo,action_required_info +ActionRevision,action_revision +ActionSource,action_source +ActionState,action_state +ActionSubType,action_sub_type +ActionSummaries,action_summaries +ActionSummary,action_summary +ActionTarget,action_target +ActionTargetArn,action_target_arn +ActionTargetArns,action_target_arns +ActionTargets,action_targets +ActionThreshold,action_threshold +ActionThresholdType,action_threshold_type +ActionThresholdValue,action_threshold_value +ActionToUse,action_to_use +ActionType,action_type +ActionTypeArtifactDetails,action_type_artifact_details +ActionTypeDeclaration,action_type_declaration +ActionTypeExecutor,action_type_executor +ActionTypeId,action_type_id +ActionTypeIdentifier,action_type_identifier +ActionTypeNotFoundException,action_type_not_found_exception +ActionTypePermissions,action_type_permissions +ActionTypeProperty,action_type_property +ActionTypeSettings,action_type_settings +ActionTypeUrls,action_type_urls +Actions,actions +ActionsEnabled,actions_enabled +ActionsGuarded,actions_guarded +ActionsRequired,actions_required +ActionsSuppressedBy,actions_suppressed_by +ActionsSuppressedReason,actions_suppressed_reason +ActionsSuppressor,actions_suppressor +ActionsSuppressorExtensionPeriod,actions_suppressor_extension_period +ActionsSuppressorWaitPeriod,actions_suppressor_wait_period +Activate,activate +ActivateAnomalyDetectorRequest,activate_anomaly_detector_request +ActivateContactChannelRequest,activate_contact_channel_request +ActivateDeviceIdentifierRequest,activate_device_identifier_request +ActivateDeviceIdentifierResponse,activate_device_identifier_response +ActivateEvaluationFormRequest,activate_evaluation_form_request +ActivateEvaluationFormResponse,activate_evaluation_form_response +ActivateEventSourceRequest,activate_event_source_request +ActivateGatewayInput,activate_gateway_input +ActivateGatewayOutput,activate_gateway_output +ActivateKeySigningKeyRequest,activate_key_signing_key_request +ActivateKeySigningKeyResponse,activate_key_signing_key_response +ActivateNetworkSiteRequest,activate_network_site_request +ActivateNetworkSiteResponse,activate_network_site_response +ActivatePipelineInput,activate_pipeline_input +ActivateReadSetFilter,activate_read_set_filter +ActivateReadSetJobItem,activate_read_set_job_item +ActivateReadSetSourceItem,activate_read_set_source_item +ActivateTypeInput,activate_type_input +ActivateTypeOutput,activate_type_output +ActivateUserRequest,activate_user_request +ActivateUserResponse,activate_user_response +Activated,activated +ActivatedRule,activated_rule +ActivatedRules,activated_rules +Activation,activation +ActivationCode,activation_code +ActivationId,activation_id +ActivationKey,activation_key +ActivationList,activation_list +ActivationOverrideBehavior,activation_override_behavior +ActivationState,activation_state +ActivationStatus,activation_status +ActivationUrl,activation_url +Active,active +ActiveAssignments,active_assignments +ActiveAvailabilityZoneCount,active_availability_zone_count +ActiveChannelPipeline,active_channel_pipeline +ActiveContext,active_context +ActiveContextTimeToLive,active_context_time_to_live +ActiveDate,active_date +ActiveDeviceCount,active_device_count +ActiveDirectory,active_directory +ActiveDirectoryBackupAttributes,active_directory_backup_attributes +ActiveDirectoryComputerAttribute,active_directory_computer_attribute +ActiveDirectoryConfiguration,active_directory_configuration +ActiveDirectoryError,active_directory_error +ActiveDirectoryId,active_directory_id +ActiveDirectoryIdentityProvider,active_directory_identity_provider +ActiveDirectoryName,active_directory_name +ActiveDirectoryStatus,active_directory_status +ActiveGameSessionCount,active_game_session_count +ActiveIAMPolicyAssignment,active_iam_policy_assignment +ActiveInput,active_input +ActiveInputAttachmentName,active_input_attachment_name +ActiveInputSwitchActionName,active_input_switch_action_name +ActiveInstance,active_instance +ActiveInstanceRefreshNotFoundFault,active_instance_refresh_not_found_fault +ActiveInstances,active_instances +ActiveMQBrokerParameters,active_mq_broker_parameters +ActiveModelArn,active_model_arn +ActiveModelVersion,active_model_version +ActiveModelVersionArn,active_model_version_arn +ActiveMotionGraphicsActionName,active_motion_graphics_action_name +ActiveMotionGraphicsUri,active_motion_graphics_uri +ActiveNodes,active_nodes +ActiveOperationArn,active_operation_arn +ActiveServerProcessCount,active_server_process_count +ActiveServicesCount,active_services_count +ActiveSlotsByChannel,active_slots_by_channel +ActiveSpeakerOnlyConfiguration,active_speaker_only_configuration +ActiveSpeakerPosition,active_speaker_position +ActiveStatementsExceededException,active_statements_exceeded_exception +ActiveSubscribedDomains,active_subscribed_domains +ActiveTracing,active_tracing +ActiveTrustedKeyGroups,active_trusted_key_groups +ActiveTrustedSigners,active_trusted_signers +ActiveVersion,active_version +ActiveViolation,active_violation +ActiveWatermarkProcess,active_watermark_process +Activities,activities +ActivitiesResponse,activities_response +ActivitiesType,activities_type +Activity,activity +ActivityDoesNotExist,activity_does_not_exist +ActivityFailedEventDetails,activity_failed_event_details +ActivityId,activity_id +ActivityIds,activity_ids +ActivityLimitExceeded,activity_limit_exceeded +ActivityListItem,activity_list_item +ActivityMetrics,activity_metrics +ActivityResponse,activity_response +ActivityScheduleFailedEventDetails,activity_schedule_failed_event_details +ActivityScheduledEventDetails,activity_scheduled_event_details +ActivityStartedEventDetails,activity_started_event_details +ActivityStatus,activity_status +ActivityStreamEngineNativeAuditFieldsIncluded,activity_stream_engine_native_audit_fields_included +ActivityStreamKinesisStreamName,activity_stream_kinesis_stream_name +ActivityStreamKmsKeyId,activity_stream_kms_key_id +ActivityStreamMode,activity_stream_mode +ActivityStreamPolicyStatus,activity_stream_policy_status +ActivityStreamStatus,activity_stream_status +ActivitySucceededEventDetails,activity_succeeded_event_details +ActivityTask,activity_task +ActivityTaskCancelRequestedEventAttributes,activity_task_cancel_requested_event_attributes +ActivityTaskCanceledEventAttributes,activity_task_canceled_event_attributes +ActivityTaskCompletedEventAttributes,activity_task_completed_event_attributes +ActivityTaskFailedEventAttributes,activity_task_failed_event_attributes +ActivityTaskScheduledEventAttributes,activity_task_scheduled_event_attributes +ActivityTaskStartedEventAttributes,activity_task_started_event_attributes +ActivityTaskStatus,activity_task_status +ActivityTaskTimedOutEventAttributes,activity_task_timed_out_event_attributes +ActivityTimedOutEventDetails,activity_timed_out_event_details +ActivityType,activity_type +ActivityTypeConfiguration,activity_type_configuration +ActivityTypeDetail,activity_type_detail +ActivityTypeInfo,activity_type_info +ActivityTypeInfos,activity_type_infos +ActivityTypes,activity_types +ActivityWorkerLimitExceeded,activity_worker_limit_exceeded +ActorDoesNotExistException,actor_does_not_exist_exception +Actual,actual +ActualAmount,actual_amount +ActualBlockHourlyPrice,actual_block_hourly_price +ActualEndTime,actual_end_time +ActualFirewallEndpoint,actual_firewall_endpoint +ActualFirewallSubnetId,actual_firewall_subnet_id +ActualFirewallSubnetRoutes,actual_firewall_subnet_routes +ActualIncrementalBackupSizeInMegaBytes,actual_incremental_backup_size_in_mega_bytes +ActualInternetGatewayRoutes,actual_internet_gateway_routes +ActualProperties,actual_properties +ActualSpend,actual_spend +ActualStartTime,actual_start_time +ActualValue,actual_value +Actuator,actuator +AdAvailOffset,ad_avail_offset +AdBreak,ad_break +AdBreakMetadata,ad_break_metadata +AdBreaks,ad_breaks +AdDecisionServerUrl,ad_decision_server_url +AdHocFilteringOption,ad_hoc_filtering_option +AdMarkerHls,ad_marker_hls +AdMarkerPassthrough,ad_marker_passthrough +AdMarkers,ad_markers +AdMarkupType,ad_markup_type +AdSegmentUrlPrefix,ad_segment_url_prefix +AdTriggers,ad_triggers +AdaptiveQuantization,adaptive_quantization +Add,add +AddAllocationResourceTags,add_allocation_resource_tags +AddAllowedPrincipals,add_allowed_principals +AddApplicationCloudWatchLoggingOptionRequest,add_application_cloud_watch_logging_option_request +AddApplicationCloudWatchLoggingOptionResponse,add_application_cloud_watch_logging_option_response +AddApplicationInputProcessingConfigurationRequest,add_application_input_processing_configuration_request +AddApplicationInputProcessingConfigurationResponse,add_application_input_processing_configuration_response +AddApplicationInputRequest,add_application_input_request +AddApplicationInputResponse,add_application_input_response +AddApplicationOutputRequest,add_application_output_request +AddApplicationOutputResponse,add_application_output_response +AddApplicationReferenceDataSourceRequest,add_application_reference_data_source_request +AddApplicationReferenceDataSourceResponse,add_application_reference_data_source_response +AddApplicationVpcConfigurationRequest,add_application_vpc_configuration_request +AddApplicationVpcConfigurationResponse,add_application_vpc_configuration_response +AddArguments,add_arguments +AddAssociationRequest,add_association_request +AddAssociationResponse,add_association_response +AddAttachmentsToSetRequest,add_attachments_to_set_request +AddAttachmentsToSetResponse,add_attachments_to_set_response +AddAttributesActivity,add_attributes_activity +AddAttributesToFindingsRequest,add_attributes_to_findings_request +AddAttributesToFindingsResponse,add_attributes_to_findings_response +AddAvailabilityZonesInput,add_availability_zones_input +AddAvailabilityZonesOutput,add_availability_zones_output +AddBridgeFlowSourceRequest,add_bridge_flow_source_request +AddBridgeNetworkOutputRequest,add_bridge_network_output_request +AddBridgeNetworkSourceRequest,add_bridge_network_source_request +AddBridgeOutputRequest,add_bridge_output_request +AddBridgeOutputsRequest,add_bridge_outputs_request +AddBridgeOutputsResponse,add_bridge_outputs_response +AddBridgeSourceRequest,add_bridge_source_request +AddBridgeSourcesRequest,add_bridge_sources_request +AddBridgeSourcesResponse,add_bridge_sources_response +AddCacheInput,add_cache_input +AddCacheOutput,add_cache_output +AddClientIDToOpenIDConnectProviderRequest,add_client_id_to_open_id_connect_provider_request +AddColumnName,add_column_name +AddCommunicationToCaseRequest,add_communication_to_case_request +AddCommunicationToCaseResponse,add_communication_to_case_response +AddCustomAttributesRequest,add_custom_attributes_request +AddCustomRoutingEndpointsRequest,add_custom_routing_endpoints_request +AddCustomRoutingEndpointsResponse,add_custom_routing_endpoints_response +AddDraftAppVersionResourceMappingsRequest,add_draft_app_version_resource_mappings_request +AddDraftAppVersionResourceMappingsResponse,add_draft_app_version_resource_mappings_response +AddEgressGatewayBridgeRequest,add_egress_gateway_bridge_request +AddEndpointsRequest,add_endpoints_request +AddEndpointsResponse,add_endpoints_response +AddEntries,add_entries +AddFacetToObject,add_facet_to_object +AddFacetToObjectRequest,add_facet_to_object_request +AddFlowMediaStreamsRequest,add_flow_media_streams_request +AddFlowMediaStreamsResponse,add_flow_media_streams_response +AddFlowOutputs420Exception,add_flow_outputs420_exception +AddFlowOutputsRequest,add_flow_outputs_request +AddFlowOutputsResponse,add_flow_outputs_response +AddFlowSourcesRequest,add_flow_sources_request +AddFlowSourcesResponse,add_flow_sources_response +AddFlowVpcInterfacesRequest,add_flow_vpc_interfaces_request +AddFlowVpcInterfacesResponse,add_flow_vpc_interfaces_response +AddGatewayLoadBalancerArns,add_gateway_load_balancer_arns +AddGwMetadata,add_gw_metadata +AddHeaderAction,add_header_action +AddIamRoles,add_iam_roles +AddIdleTimeBetweenReads,add_idle_time_between_reads +AddInId,add_in_id +AddIngressGatewayBridgeRequest,add_ingress_gateway_bridge_request +AddIns,add_ins +AddInstanceFleetInput,add_instance_fleet_input +AddInstanceFleetOutput,add_instance_fleet_output +AddInstanceGroupsInput,add_instance_groups_input +AddInstanceGroupsOutput,add_instance_groups_output +AddIpRoutesRequest,add_ip_routes_request +AddIpamOperatingRegion,add_ipam_operating_region +AddJobFlowStepsInput,add_job_flow_steps_input +AddJobFlowStepsOutput,add_job_flow_steps_output +AddLFTagsToResourceRequest,add_lf_tags_to_resource_request +AddLFTagsToResourceResponse,add_lf_tags_to_resource_response +AddLayerVersionPermissionRequest,add_layer_version_permission_request +AddLayerVersionPermissionResponse,add_layer_version_permission_response +AddLicenseSpecifications,add_license_specifications +AddListenerCertificatesInput,add_listener_certificates_input +AddListenerCertificatesOutput,add_listener_certificates_output +AddMaintenance,add_maintenance +AddMediaStreamRequest,add_media_stream_request +AddNetworkLoadBalancerArns,add_network_load_balancer_arns +AddNetworkServices,add_network_services +AddNotificationChannelRequest,add_notification_channel_request +AddNotificationChannelResponse,add_notification_channel_response +AddNotificationChannelsRequest,add_notification_channels_request +AddNotificationChannelsResponse,add_notification_channels_response +AddObject,add_object +AddObjectInput,add_object_input +AddOn,add_on +AddOnRequest,add_on_request +AddOperatingRegions,add_operating_regions +AddOutputRequest,add_output_request +AddPermissionInput,add_permission_input +AddPermissionRequest,add_permission_request +AddPermissionResponse,add_permission_response +AddPrefixListEntry,add_prefix_list_entry +AddProfileKeyRequest,add_profile_key_request +AddProfileKeyResponse,add_profile_key_response +AddProfilePermissionRequest,add_profile_permission_request +AddProfilePermissionResponse,add_profile_permission_response +AddPublicKeys,add_public_keys +AddRecordTimestamp,add_record_timestamp +AddRegionAction,add_region_action +AddRegionRequest,add_region_request +AddReplicaRegions,add_replica_regions +AddResourcePermissionsRequest,add_resource_permissions_request +AddResourcePermissionsResponse,add_resource_permissions_response +AddRoleToDBClusterMessage,add_role_to_db_cluster_message +AddRoleToDBInstanceMessage,add_role_to_db_instance_message +AddRoleToInstanceProfileRequest,add_role_to_instance_profile_request +AddRouteTableIds,add_route_table_ids +AddSecurityGroupIds,add_security_group_ids +AddSourceIdentifierToSubscriptionMessage,add_source_identifier_to_subscription_message +AddSourceIdentifierToSubscriptionResult,add_source_identifier_to_subscription_result +AddStorageSystemRequest,add_storage_system_request +AddStorageSystemResponse,add_storage_system_response +AddSubnetArns,add_subnet_arns +AddSubnetIds,add_subnet_ids +AddSubnets,add_subnets +AddSupplementalLogging,add_supplemental_logging +AddSupportedIpAddressTypes,add_supported_ip_address_types +AddTags,add_tags +AddTagsInput,add_tags_input +AddTagsOutput,add_tags_output +AddTagsRequest,add_tags_request +AddTagsToCertificateRequest,add_tags_to_certificate_request +AddTagsToOnPremisesInstancesInput,add_tags_to_on_premises_instances_input +AddTagsToResourceInput,add_tags_to_resource_input +AddTagsToResourceMessage,add_tags_to_resource_message +AddTagsToResourceOutput,add_tags_to_resource_output +AddTagsToResourceRequest,add_tags_to_resource_request +AddTagsToResourceResponse,add_tags_to_resource_response +AddTagsToStreamInput,add_tags_to_stream_input +AddTagsToVaultInput,add_tags_to_vault_input +AddTexture,add_texture +AddThingToBillingGroupRequest,add_thing_to_billing_group_request +AddThingToThingGroupRequest,add_thing_to_thing_group_request +AddThingsToThingGroupParams,add_things_to_thing_group_params +AddTrailingPaddingCharacter,add_trailing_padding_character +AddTransitGatewayCidrBlocks,add_transit_gateway_cidr_blocks +AddUploadBufferInput,add_upload_buffer_input +AddUploadBufferOutput,add_upload_buffer_output +AddUserToGroupRequest,add_user_to_group_request +AddWorkingStorageInput,add_working_storage_input +AddWorkingStorageOutput,add_working_storage_output +AddWorkloadRequest,add_workload_request +AddWorkloadResponse,add_workload_response +AddedDateTime,added_date_time +AddedPrincipal,added_principal +AddedPrincipals,added_principals +AddedToClusterTime,added_to_cluster_time +AdditionalAccounts,additional_accounts +AdditionalArchivedLogDestId,additional_archived_log_dest_id +AdditionalArtifacts,additional_artifacts +AdditionalAttribute,additional_attribute +AdditionalAttributes,additional_attributes +AdditionalAuditContext,additional_audit_context +AdditionalAuthTypes,additional_auth_types +AdditionalAuthenticationProvider,additional_authentication_provider +AdditionalAuthenticationProviders,additional_authentication_providers +AdditionalBootstrapServers,additional_bootstrap_servers +AdditionalCodeRepositories,additional_code_repositories +AdditionalCodeRepositoryEquals,additional_code_repository_equals +AdditionalConfigs,additional_configs +AdditionalConfiguration,additional_configuration +AdditionalConstraints,additional_constraints +AdditionalContactEmailAddresses,additional_contact_email_addresses +AdditionalDashboardIds,additional_dashboard_ids +AdditionalDataPending,additional_data_pending +AdditionalDataSources,additional_data_sources +AdditionalDataset,additional_dataset +AdditionalDatasets,additional_datasets +AdditionalDeltaOptions,additional_delta_options +AdditionalDetail,additional_detail +AdditionalDetailType,additional_detail_type +AdditionalDetails,additional_details +AdditionalHudiOptions,additional_hudi_options +AdditionalInferenceSpecificationDefinition,additional_inference_specification_definition +AdditionalInferenceSpecifications,additional_inference_specifications +AdditionalInferenceSpecificationsToAdd,additional_inference_specifications_to_add +AdditionalInfo,additional_info +AdditionalInformation,additional_information +AdditionalInstanceConfiguration,additional_instance_configuration +AdditionalLanguageCodes,additional_language_codes +AdditionalLimit,additional_limit +AdditionalLimits,additional_limits +AdditionalLocations,additional_locations +AdditionalManifests,additional_manifests +AdditionalMasterSecurityGroups,additional_master_security_groups +AdditionalMetadata,additional_metadata +AdditionalMetrics,additional_metrics +AdditionalOccurrences,additional_occurrences +AdditionalOptions,additional_options +AdditionalPlanOptionsMap,additional_plan_options_map +AdditionalPlayerCount,additional_player_count +AdditionalRegions,additional_regions +AdditionalResources,additional_resources +AdditionalResponseAttributes,additional_response_attributes +AdditionalResponseFields,additional_response_fields +AdditionalResultAttribute,additional_result_attribute +AdditionalResultAttributeValue,additional_result_attribute_value +AdditionalRoutesAvailable,additional_routes_available +AdditionalRunOptions,additional_run_options +AdditionalSchemaElements,additional_schema_elements +AdditionalSearchKey,additional_search_key +AdditionalSearchKeys,additional_search_keys +AdditionalSlaveSecurityGroups,additional_slave_security_groups +AdditionalStagingLabelsToDownload,additional_staging_labels_to_download +AdditionalStatistics,additional_statistics +AdditionalTreatments,additional_treatments +AdditionalVersionWeights,additional_version_weights +Addon,addon +AddonDetails,addon_details +AddonHealth,addon_health +AddonInfo,addon_info +AddonIssue,addon_issue +AddonStatus,addon_status +AddonVersion,addon_version +AddonVersionInfo,addon_version_info +Address,address +Address1,address1 +Address2,address2 +Address3,address3 +Address4,address4 +AddressAllocationIds,address_allocation_ids +AddressAttribute,address_attribute +AddressBook,address_book +AddressBookArn,address_book_arn +AddressBookData,address_book_data +AddressBooks,address_books +AddressConfiguration,address_configuration +AddressCount,address_count +AddressDefinition,address_definition +AddressExternalId,address_external_id +AddressFamily,address_family +AddressField,address_field +AddressFields,address_fields +AddressId,address_id +AddressLine1,address_line1 +AddressLine2,address_line2 +AddressLine3,address_line3 +AddressNumber,address_number +AddressTransfer,address_transfer +AddressTransferStatus,address_transfer_status +AddressTransfers,address_transfers +AddressType,address_type +Addresses,addresses +AddressingType,addressing_type +AdiFilename,adi_filename +AdjacentParentShardId,adjacent_parent_shard_id +AdjacentShardToMerge,adjacent_shard_to_merge +Adjustable,adjustable +Adjustment,adjustment +AdjustmentType,adjustment_type +AdjustmentTypes,adjustment_types +Adjustments,adjustments +Admin,admin +AdminAccount,admin_account +AdminAccountId,admin_account_id +AdminAccountSummary,admin_account_summary +AdminAccounts,admin_accounts +AdminAddUserToGroupRequest,admin_add_user_to_group_request +AdminConfirmSignUpRequest,admin_confirm_sign_up_request +AdminContact,admin_contact +AdminCreateUserConfig,admin_create_user_config +AdminCreateUserConfigType,admin_create_user_config_type +AdminCreateUserRequest,admin_create_user_request +AdminCreateUserResponse,admin_create_user_response +AdminDeleteUserAttributesRequest,admin_delete_user_attributes_request +AdminDeleteUserRequest,admin_delete_user_request +AdminDetectorId,admin_detector_id +AdminDisableProviderForUserRequest,admin_disable_provider_for_user_request +AdminDisableUserRequest,admin_disable_user_request +AdminEnableUserRequest,admin_enable_user_request +AdminForgetDeviceRequest,admin_forget_device_request +AdminGetDeviceRequest,admin_get_device_request +AdminGetDeviceResponse,admin_get_device_response +AdminGetUserRequest,admin_get_user_request +AdminGetUserResponse,admin_get_user_response +AdminGroup,admin_group +AdminInitiateAuthRequest,admin_initiate_auth_request +AdminInitiateAuthResponse,admin_initiate_auth_response +AdminLinkProviderForUserRequest,admin_link_provider_for_user_request +AdminListDevicesRequest,admin_list_devices_request +AdminListDevicesResponse,admin_list_devices_response +AdminListGroupsForUserRequest,admin_list_groups_for_user_request +AdminListGroupsForUserResponse,admin_list_groups_for_user_response +AdminListUserAuthEventsRequest,admin_list_user_auth_events_request +AdminListUserAuthEventsResponse,admin_list_user_auth_events_response +AdminPassword,admin_password +AdminPrivacy,admin_privacy +AdminRemoveUserFromGroupRequest,admin_remove_user_from_group_request +AdminResetUserPasswordRequest,admin_reset_user_password_request +AdminRespondToAuthChallengeRequest,admin_respond_to_auth_challenge_request +AdminRespondToAuthChallengeResponse,admin_respond_to_auth_challenge_response +AdminScope,admin_scope +AdminSetUserMFAPreferenceRequest,admin_set_user_mfa_preference_request +AdminSetUserPasswordRequest,admin_set_user_password_request +AdminSetUserSettingsRequest,admin_set_user_settings_request +AdminStatus,admin_status +AdminUpdateAuthEventFeedbackRequest,admin_update_auth_event_feedback_request +AdminUpdateDeviceStatusRequest,admin_update_device_status_request +AdminUpdateUserAttributesRequest,admin_update_user_attributes_request +AdminUserGlobalSignOutRequest,admin_user_global_sign_out_request +AdminUserList,admin_user_list +AdminUsername,admin_username +AdministrationRoleARN,administration_role_arn +AdministrativeAction,administrative_action +AdministrativeActionFailureDetails,administrative_action_failure_details +AdministrativeActionType,administrative_action_type +AdministrativeActions,administrative_actions +Administrator,administrator +AdministratorId,administrator_id +Administrators,administrators +AdsOnDeliveryRestrictions,ads_on_delivery_restrictions +AdvancedBackupSetting,advanced_backup_setting +AdvancedBackupSettings,advanced_backup_settings +AdvancedCostOptimizationMetrics,advanced_cost_optimization_metrics +AdvancedDataProtectionMetrics,advanced_data_protection_metrics +AdvancedEventSelector,advanced_event_selector +AdvancedEventSelectors,advanced_event_selectors +AdvancedFieldSelector,advanced_field_selector +AdvancedInputFilter,advanced_input_filter +AdvancedInputFilterSettings,advanced_input_filter_settings +AdvancedOptions,advanced_options +AdvancedOptionsStatus,advanced_options_status +AdvancedRecognitionSetting,advanced_recognition_setting +AdvancedSecurityEnabled,advanced_security_enabled +AdvancedSecurityMode,advanced_security_mode +AdvancedSecurityOptions,advanced_security_options +AdvancedSecurityOptionsInput,advanced_security_options_input +AdvancedSecurityOptionsStatus,advanced_security_options_status +AdvertiseByoipCidrRequest,advertise_byoip_cidr_request +AdvertiseByoipCidrResponse,advertise_byoip_cidr_response +AdvertiseByoipCidrResult,advertise_byoip_cidr_result +AdvisoryIds,advisory_ids +AfdSignaling,afd_signaling +AffectedEntity,affected_entity +AffectedResource,affected_resource +AffectedResources,affected_resources +AffectedSensorCount,affected_sensor_count +AffectedSubnets,affected_subnets +Affiliated,affiliated +Affinity,affinity +After,after +AfterConnectScript,after_connect_script +AfterContactWorkTimeLimit,after_contact_work_time_limit +AfterCreationDate,after_creation_date +AfterFragmentNumber,after_fragment_number +AgeRange,age_range +AgentAlreadyRunningAssessment,agent_already_running_assessment +AgentArn,agent_arn +AgentArns,agent_arns +AgentAvailabilityTimer,agent_availability_timer +AgentConfig,agent_config +AgentConfiguration,agent_configuration +AgentConfigurationStatus,agent_configuration_status +AgentContactReference,agent_contact_reference +AgentContactState,agent_contact_state +AgentCount,agent_count +AgentDetails,agent_details +AgentFilter,agent_filter +AgentInfo,agent_info +AgentInstallerUrl,agent_installer_url +AgentListEntry,agent_list_entry +AgentMetrics,agent_metrics +AgentName,agent_name +AgentNetworkInfo,agent_network_info +AgentOrchestrationConfig,agent_orchestration_config +AgentPreview,agent_preview +AgentStatus,agent_status +AgentStatusARN,agent_status_arn +AgentStatusId,agent_status_id +AgentStatusReference,agent_status_reference +AgentStatusSummary,agent_status_summary +AgentStatusSummaryList,agent_status_summary_list +AgentStatusTypes,agent_status_types +AgentTurnResult,agent_turn_result +AgentTurnSpecification,agent_turn_specification +AgentVersion,agent_version +AgentVersions,agent_versions +AgentlessDialerConfig,agentless_dialer_config +Agents,agents +AgentsAlreadyRunningAssessmentException,agents_already_running_assessment_exception +AggFunc,agg_func +Aggregate,aggregate +AggregateBy,aggregate_by +AggregateColumn,aggregate_column +AggregateComplianceByConfigRule,aggregate_compliance_by_config_rule +AggregateComplianceByConfigRules,aggregate_compliance_by_config_rules +AggregateComplianceByConformancePack,aggregate_compliance_by_conformance_pack +AggregateComplianceByConformancePacks,aggregate_compliance_by_conformance_packs +AggregateComplianceCount,aggregate_compliance_count +AggregateComplianceCounts,aggregate_compliance_counts +AggregateConformancePackCompliance,aggregate_conformance_pack_compliance +AggregateConformancePackComplianceCount,aggregate_conformance_pack_compliance_count +AggregateConformancePackComplianceFilters,aggregate_conformance_pack_compliance_filters +AggregateConformancePackComplianceSummaries,aggregate_conformance_pack_compliance_summaries +AggregateConformancePackComplianceSummary,aggregate_conformance_pack_compliance_summary +AggregateConformancePackComplianceSummaryFilters,aggregate_conformance_pack_compliance_summary_filters +AggregateEvaluationResult,aggregate_evaluation_result +AggregateEvaluationResults,aggregate_evaluation_results +AggregateKeyType,aggregate_key_type +AggregateOperation,aggregate_operation +AggregateResourceIdentifier,aggregate_resource_identifier +AggregateStatus,aggregate_status +AggregateValue,aggregate_value +AggregatedLogOddsMetric,aggregated_log_odds_metric +AggregatedProfileTime,aggregated_profile_time +AggregatedSourceStatus,aggregated_source_status +AggregatedSourceStatusList,aggregated_source_status_list +AggregatedUtterancesFilter,aggregated_utterances_filter +AggregatedUtterancesSortBy,aggregated_utterances_sort_by +AggregatedUtterancesSummary,aggregated_utterances_summary +AggregatedValue,aggregated_value +AggregatedVariablesImpactExplanation,aggregated_variables_impact_explanation +AggregatedVariablesImportanceMetrics,aggregated_variables_importance_metrics +Aggregates,aggregates +Aggregation,aggregation +AggregationAuthorization,aggregation_authorization +AggregationAuthorizationArn,aggregation_authorization_arn +AggregationAuthorizations,aggregation_authorizations +AggregationConfig,aggregation_config +AggregationConstraint,aggregation_constraint +AggregationEnabled,aggregation_enabled +AggregationFunction,aggregation_function +AggregationFunctionParameters,aggregation_function_parameters +AggregationSortConfiguration,aggregation_sort_configuration +AggregationSortConfigurations,aggregation_sort_configurations +AggregationStatistic,aggregation_statistic +AggregationType,aggregation_type +AggregationVisibility,aggregation_visibility +Aggregations,aggregations +Aggregator,aggregator +AggregatorType,aggregator_type +Aggregators,aggregators +AggressiveMode,aggressive_mode +Aggs,aggs +Agreement,agreement +AgreementId,agreement_id +Agreements,agreements +AiffSettings,aiff_settings +AirflowConfigurationOptions,airflow_configuration_options +AirflowVersion,airflow_version +Alarm,alarm +AlarmARN,alarm_arn +AlarmAction,alarm_action +AlarmActions,alarm_actions +AlarmArn,alarm_arn +AlarmCapabilities,alarm_capabilities +AlarmConfiguration,alarm_configuration +AlarmConfigurationUpdatedTimestamp,alarm_configuration_updated_timestamp +AlarmDescription,alarm_description +AlarmEventActions,alarm_event_actions +AlarmHistoryItem,alarm_history_item +AlarmHistoryItems,alarm_history_items +AlarmIdentifier,alarm_identifier +AlarmModelSummary,alarm_model_summary +AlarmModelVersionSummary,alarm_model_version_summary +AlarmName,alarm_name +AlarmNamePrefix,alarm_name_prefix +AlarmNames,alarm_names +AlarmNotification,alarm_notification +AlarmRecommendation,alarm_recommendation +AlarmRoleArn,alarm_role_arn +AlarmRule,alarm_rule +AlarmSpecification,alarm_specification +AlarmState,alarm_state +AlarmStateInformation,alarm_state_information +AlarmSummary,alarm_summary +AlarmType,alarm_type +AlarmTypes,alarm_types +Alarms,alarms +AlarmsLimitExceededException,alarms_limit_exceeded_exception +AlbumArt,album_art +AlbumArtFormat,album_art_format +Alert,alert +AlertArn,alert_arn +AlertCode,alert_code +AlertDescription,alert_description +AlertFilters,alert_filters +AlertManagerDefinitionDescription,alert_manager_definition_description +AlertManagerDefinitionStatus,alert_manager_definition_status +AlertMessage,alert_message +AlertName,alert_name +AlertSensitivityThreshold,alert_sensitivity_threshold +AlertStatus,alert_status +AlertSummary,alert_summary +AlertSummaryList,alert_summary_list +AlertTarget,alert_target +AlertType,alert_type +AlexaForBusinessMetadata,alexa_for_business_metadata +AlexaForBusinessRoomArn,alexa_for_business_room_arn +AlexaSkillIds,alexa_skill_ids +AlexaSkillStatus,alexa_skill_status +AlfrescoConfiguration,alfresco_configuration +Algorithm,algorithm +AlgorithmArn,algorithm_arn +AlgorithmControl,algorithm_control +AlgorithmDescription,algorithm_description +AlgorithmImage,algorithm_image +AlgorithmName,algorithm_name +AlgorithmSpecification,algorithm_specification +AlgorithmStatus,algorithm_status +AlgorithmStatusDetails,algorithm_status_details +AlgorithmStatusItem,algorithm_status_item +AlgorithmSummary,algorithm_summary +AlgorithmSummaryList,algorithm_summary_list +AlgorithmValidationProfile,algorithm_validation_profile +AlgorithmValidationSpecification,algorithm_validation_specification +AlgorithmicStemming,algorithmic_stemming +AlgorithmsConfig,algorithms_config +Alias,alias +AliasArn,alias_arn +AliasAttributes,alias_attributes +AliasConfiguration,alias_configuration +AliasExistsException,alias_exists_exception +AliasICPRecordal,alias_icp_recordal +AliasICPRecordals,alias_icp_recordals +AliasId,alias_id +AliasIds,alias_ids +AliasListEntry,alias_list_entry +AliasName,alias_name +AliasPrefix,alias_prefix +AliasRoutingConfiguration,alias_routing_configuration +AliasTarget,alias_target +Aliased,aliased +Aliases,aliases +AliasesToAdd,aliases_to_add +AliasesToDelete,aliases_to_delete +AlignedEndTime,aligned_end_time +AlignedStartTime,aligned_start_time +Alignment,alignment +All,all +AllAccountsEnabled,all_accounts_enabled +AllAvailabilityZones,all_availability_zones +AllAwsRegions,all_aws_regions +AllColumnsRequested,all_columns_requested +AllDataPointsVisibility,all_data_points_visibility +AllOrganizationalUnitsEnabled,all_organizational_units_enabled +AllParameters,all_parameters +AllPolicyTypesEnabled,all_policy_types_enabled +AllQueryArguments,all_query_arguments +AllRegions,all_regions +AllRegionsEnabled,all_regions_enabled +AllRowsWildcard,all_rows_wildcard +AllSheets,all_sheets +AllocateAddressRequest,allocate_address_request +AllocateAddressResult,allocate_address_result +AllocateConnectionOnInterconnectRequest,allocate_connection_on_interconnect_request +AllocateHostedConnectionRequest,allocate_hosted_connection_request +AllocateHostsRequest,allocate_hosts_request +AllocateHostsResult,allocate_hosts_result +AllocateIpamPoolCidrRequest,allocate_ipam_pool_cidr_request +AllocateIpamPoolCidrResult,allocate_ipam_pool_cidr_result +AllocatePrivateVirtualInterfaceRequest,allocate_private_virtual_interface_request +AllocatePublicVirtualInterfaceRequest,allocate_public_virtual_interface_request +AllocateStaticIpRequest,allocate_static_ip_request +AllocateStaticIpResult,allocate_static_ip_result +AllocateTransitVirtualInterfaceRequest,allocate_transit_virtual_interface_request +AllocateTransitVirtualInterfaceResult,allocate_transit_virtual_interface_result +AllocatedCapacity,allocated_capacity +AllocatedDpus,allocated_dpus +AllocatedProvisionedConcurrentExecutions,allocated_provisioned_concurrent_executions +AllocatedStorage,allocated_storage +AllocatedUsageQuantity,allocated_usage_quantity +AllocationDefaultNetmaskLength,allocation_default_netmask_length +AllocationId,allocation_id +AllocationIdNotFoundException,allocation_id_not_found_exception +AllocationIds,allocation_ids +AllocationMaxNetmaskLength,allocation_max_netmask_length +AllocationMinNetmaskLength,allocation_min_netmask_length +AllocationResourceTags,allocation_resource_tags +AllocationStrategy,allocation_strategy +AllocationTime,allocation_time +AllocationType,allocation_type +Allow,allow +AllowAction,allow_action +AllowActions,allow_actions +AllowAdminCreateUserOnly,allow_admin_create_user_only +AllowAllTrafficToEndpoint,allow_all_traffic_to_endpoint +AllowAssociation,allow_association +AllowCancelResize,allow_cancel_resize +AllowCheckIn,allow_check_in +AllowClassicFlow,allow_classic_flow +AllowCookies,allow_cookies +AllowCopyImage,allow_copy_image +AllowCredentials,allow_credentials +AllowCustomRoutingTrafficRequest,allow_custom_routing_traffic_request +AllowDataLoss,allow_data_loss +AllowDeferredExecution,allow_deferred_execution +AllowDenyList,allow_deny_list +AllowDnsResolutionFromRemoteVpc,allow_dns_resolution_from_remote_vpc +AllowEarlyCheckIn,allow_early_check_in +AllowEgressFromLocalClassicLinkToRemoteVpc,allow_egress_from_local_classic_link_to_remote_vpc +AllowEgressFromLocalVpcToRemoteClassicLink,allow_egress_from_local_vpc_to_remote_classic_link +AllowEngineModeChange,allow_engine_mode_change +AllowExternalDataFiltering,allow_external_data_filtering +AllowForceDelete,allow_force_delete +AllowFullTableExternalDataAccess,allow_full_table_external_data_access +AllowHeaders,allow_headers +AllowListCriteria,allow_list_criteria +AllowListStatus,allow_list_status +AllowListSummary,allow_list_summary +AllowMajorVersionUpdate,allow_major_version_update +AllowMajorVersionUpgrade,allow_major_version_upgrade +AllowMessages,allow_messages +AllowMethods,allow_methods +AllowNonRestoredState,allow_non_restored_state +AllowNotifications,allow_notifications +AllowOrigins,allow_origins +AllowProfileCreation,allow_profile_creation +AllowPubliclyAccessibleConsumers,allow_publicly_accessible_consumers +AllowQuotedRecordDelimiter,allow_quoted_record_delimiter +AllowReassignment,allow_reassignment +AllowReassociation,allow_reassociation +AllowReferers,allow_referers +AllowResources,allow_resources +AllowSelectNestedTables,allow_select_nested_tables +AllowSelfManagement,allow_self_management +AllowSingleColumn,allow_single_column +AllowSsh,allow_ssh +AllowSudo,allow_sudo +AllowUnassociatedTargets,allow_unassociated_targets +AllowUnauthenticatedIdentities,allow_unauthenticated_identities +AllowUpdate,allow_update +AllowUsersToChangePassword,allow_users_to_change_password +AllowVersionUpgrade,allow_version_upgrade +Allowed,allowed +AllowedAccessControlTags,allowed_access_control_tags +AllowedAggregations,allowed_aggregations +AllowedAllVPCs,allowed_all_vpcs +AllowedAttempts,allowed_attempts +AllowedByOrganizations,allowed_by_organizations +AllowedByPermissionsBoundary,allowed_by_permissions_boundary +AllowedDomains,allowed_domains +AllowedFeatures,allowed_features +AllowedGroupsColumnName,allowed_groups_column_name +AllowedHeaders,allowed_headers +AllowedIPRange,allowed_ip_range +AllowedInputTypes,allowed_input_types +AllowedInstanceTypes,allowed_instance_types +AllowedIps,allowed_ips +AllowedLocations,allowed_locations +AllowedMethods,allowed_methods +AllowedMonitorCapabilities,allowed_monitor_capabilities +AllowedNodeTypeModificationsMessage,allowed_node_type_modifications_message +AllowedOAuthFlows,allowed_o_auth_flows +AllowedOAuthFlowsUserPoolClient,allowed_o_auth_flows_user_pool_client +AllowedOAuthScopes,allowed_o_auth_scopes +AllowedOperations,allowed_operations +AllowedOrigins,allowed_origins +AllowedPattern,allowed_pattern +AllowedPrincipal,allowed_principal +AllowedPrincipals,allowed_principals +AllowedPublishers,allowed_publishers +AllowedRenditionSize,allowed_rendition_size +AllowedRenditions,allowed_renditions +AllowedStatistics,allowed_statistics +AllowedTargets,allowed_targets +AllowedVPCs,allowed_vpcs +AllowedValue,allowed_value +AllowedValues,allowed_values +AllowsMultipleInstanceTypes,allows_multiple_instance_types +AllowsPublicReadAccess,allows_public_read_access +AllowsPublicWriteAccess,allows_public_write_access +AllowsVpcAndNonVpcInstanceMemberships,allows_vpc_and_non_vpc_instance_memberships +AlphaBehavior,alpha_behavior +Alphabet,alphabet +AlpnPolicy,alpn_policy +AlreadyExistsException,already_exists_exception +AlreadyExistsFault,already_exists_fault +AlreadyInOrganizationException,already_in_organization_exception +AlreadyStreamedException,already_streamed_exception +AlternateBandColorsVisibility,alternate_band_colors_visibility +AlternateBandEvenColor,alternate_band_even_color +AlternateBandOddColor,alternate_band_odd_color +AlternateContact,alternate_contact +AlternateContactType,alternate_contact_type +AlternateDataSourceParameters,alternate_data_source_parameters +AlternateIdentifier,alternate_identifier +AlternateKey,alternate_key +AlternatePathHint,alternate_path_hint +AlternatePathHints,alternate_path_hints +AlternateSoftwareMetadata,alternate_software_metadata +AlternateSoftwares,alternate_softwares +AlternateTransferFunctionSei,alternate_transfer_function_sei +Alternative,alternative +AlternativeTransferFunction,alternative_transfer_function +Alternatives,alternatives +AmazonCodeGuruProfiler,amazon_code_guru_profiler +AmazonCodeGuruProfilerIntegration,amazon_code_guru_profiler_integration +AmazonElasticsearchParameters,amazon_elasticsearch_parameters +AmazonForecastRoleArn,amazon_forecast_role_arn +AmazonId,amazon_id +AmazonIdEventTopic,amazon_id_event_topic +AmazonManagedKafkaEventSourceConfig,amazon_managed_kafka_event_source_config +AmazonOpenSearchParameters,amazon_open_search_parameters +AmazonOpenSearchServerlessBufferingHints,amazon_open_search_serverless_buffering_hints +AmazonOpenSearchServerlessDestinationConfiguration,amazon_open_search_serverless_destination_configuration +AmazonOpenSearchServerlessDestinationDescription,amazon_open_search_serverless_destination_description +AmazonOpenSearchServerlessDestinationUpdate,amazon_open_search_serverless_destination_update +AmazonOpenSearchServerlessRetryOptions,amazon_open_search_serverless_retry_options +AmazonProvidedIpv6CidrBlock,amazon_provided_ipv6_cidr_block +AmazonRedshiftAdvancedOption,amazon_redshift_advanced_option +AmazonRedshiftNodeData,amazon_redshift_node_data +AmazonRedshiftSource,amazon_redshift_source +AmazonRedshiftTarget,amazon_redshift_target +AmazonSideAsn,amazon_side_asn +AmazonTranscribeCallAnalyticsProcessorConfiguration,amazon_transcribe_call_analytics_processor_configuration +AmazonTranscribeProcessorConfiguration,amazon_transcribe_processor_configuration +AmazonopensearchserviceBufferingHints,amazonopensearchservice_buffering_hints +AmazonopensearchserviceDestinationConfiguration,amazonopensearchservice_destination_configuration +AmazonopensearchserviceDestinationDescription,amazonopensearchservice_destination_description +AmazonopensearchserviceDestinationUpdate,amazonopensearchservice_destination_update +AmazonopensearchserviceRetryOptions,amazonopensearchservice_retry_options +AmbiguousRoleResolution,ambiguous_role_resolution +AmdSevSnp,amd_sev_snp +AmexCardSecurityCodeVersion1,amex_card_security_code_version1 +AmexCardSecurityCodeVersion2,amex_card_security_code_version2 +Ami,ami +AmiAggregation,ami_aggregation +AmiAggregationResponse,ami_aggregation_response +AmiAssociationScope,ami_association_scope +AmiDistributionConfiguration,ami_distribution_configuration +AmiId,ami_id +AmiLaunchIndex,ami_launch_index +AmiVersion,ami_version +AmortizedCommitment,amortized_commitment +AmortizedRecurringCommitment,amortized_recurring_commitment +AmortizedRecurringFee,amortized_recurring_fee +AmortizedUpfrontCommitment,amortized_upfront_commitment +AmortizedUpfrontFee,amortized_upfront_fee +Amount,amount +AmountInUsd,amount_in_usd +AmplifyFeatureFlags,amplify_feature_flags +AmplifyMetaConfig,amplify_meta_config +Amplitude,amplitude +AmplitudeConnectorProfileCredentials,amplitude_connector_profile_credentials +AmplitudeSourceProperties,amplitude_source_properties +AmznClientToken,amzn_client_token +Analyses,analyses +Analysis,analysis +AnalysisAclRule,analysis_acl_rule +AnalysisArn,analysis_arn +AnalysisComponent,analysis_component +AnalysisDefaults,analysis_defaults +AnalysisDefinition,analysis_definition +AnalysisEndTime,analysis_end_time +AnalysisError,analysis_error +AnalysisFindings,analysis_findings +AnalysisId,analysis_id +AnalysisLoadBalancerListener,analysis_load_balancer_listener +AnalysisLoadBalancerTarget,analysis_load_balancer_target +AnalysisOptions,analysis_options +AnalysisPacketHeader,analysis_packet_header +AnalysisParameter,analysis_parameter +AnalysisReport,analysis_report +AnalysisReportId,analysis_report_id +AnalysisReportSummary,analysis_report_summary +AnalysisReports,analysis_reports +AnalysisResult,analysis_result +AnalysisResultLocation,analysis_result_location +AnalysisRouteTableRoute,analysis_route_table_route +AnalysisRule,analysis_rule +AnalysisRuleAggregation,analysis_rule_aggregation +AnalysisRuleCustom,analysis_rule_custom +AnalysisRuleList,analysis_rule_list +AnalysisSchema,analysis_schema +AnalysisScheme,analysis_scheme +AnalysisSchemeLanguage,analysis_scheme_language +AnalysisSchemeName,analysis_scheme_name +AnalysisSchemeNames,analysis_scheme_names +AnalysisSchemeStatus,analysis_scheme_status +AnalysisSchemes,analysis_schemes +AnalysisSearchFilter,analysis_search_filter +AnalysisSecurityGroupRule,analysis_security_group_rule +AnalysisSourceEntity,analysis_source_entity +AnalysisSourceTemplate,analysis_source_template +AnalysisStartTime,analysis_start_time +AnalysisStartTimeBegin,analysis_start_time_begin +AnalysisStartTimeEnd,analysis_start_time_end +AnalysisStatus,analysis_status +AnalysisSummary,analysis_summary +AnalysisSummaryList,analysis_summary_list +AnalysisTemplate,analysis_template +AnalysisTemplateSummary,analysis_template_summary +AnalysisTypes,analysis_types +Analytics,analytics +AnalyticsAndOperator,analytics_and_operator +AnalyticsBinBySpecification,analytics_bin_by_specification +AnalyticsBinKey,analytics_bin_key +AnalyticsConfiguration,analytics_configuration +AnalyticsConfigurationList,analytics_configuration_list +AnalyticsConfigurationType,analytics_configuration_type +AnalyticsEndpointId,analytics_endpoint_id +AnalyticsExportDestination,analytics_export_destination +AnalyticsIntentFilter,analytics_intent_filter +AnalyticsIntentGroupByKey,analytics_intent_group_by_key +AnalyticsIntentGroupBySpecification,analytics_intent_group_by_specification +AnalyticsIntentMetric,analytics_intent_metric +AnalyticsIntentMetricResult,analytics_intent_metric_result +AnalyticsIntentNodeSummary,analytics_intent_node_summary +AnalyticsIntentResult,analytics_intent_result +AnalyticsIntentStageFilter,analytics_intent_stage_filter +AnalyticsIntentStageGroupByKey,analytics_intent_stage_group_by_key +AnalyticsIntentStageGroupBySpecification,analytics_intent_stage_group_by_specification +AnalyticsIntentStageMetric,analytics_intent_stage_metric +AnalyticsIntentStageMetricResult,analytics_intent_stage_metric_result +AnalyticsIntentStageResult,analytics_intent_stage_result +AnalyticsMetadata,analytics_metadata +AnalyticsMetadataType,analytics_metadata_type +AnalyticsPathFilter,analytics_path_filter +AnalyticsS3BucketDestination,analytics_s3_bucket_destination +AnalyticsSessionFilter,analytics_session_filter +AnalyticsSessionGroupByKey,analytics_session_group_by_key +AnalyticsSessionGroupBySpecification,analytics_session_group_by_specification +AnalyticsSessionMetric,analytics_session_metric +AnalyticsSessionMetricResult,analytics_session_metric_result +AnalyticsSessionResult,analytics_session_result +AnalyticsUtteranceAttribute,analytics_utterance_attribute +AnalyticsUtteranceAttributeResult,analytics_utterance_attribute_result +AnalyticsUtteranceFilter,analytics_utterance_filter +AnalyticsUtteranceGroupByKey,analytics_utterance_group_by_key +AnalyticsUtteranceGroupBySpecification,analytics_utterance_group_by_specification +AnalyticsUtteranceMetric,analytics_utterance_metric +AnalyticsUtteranceMetricResult,analytics_utterance_metric_result +AnalyticsUtteranceResult,analytics_utterance_result +AnalyzeDocumentModelVersion,analyze_document_model_version +AnalyzeDocumentRequest,analyze_document_request +AnalyzeDocumentResponse,analyze_document_response +AnalyzeExpenseModelVersion,analyze_expense_model_version +AnalyzeExpenseRequest,analyze_expense_request +AnalyzeExpenseResponse,analyze_expense_response +AnalyzeIDDetections,analyze_id_detections +AnalyzeIDModelVersion,analyze_id_model_version +AnalyzeIDRequest,analyze_id_request +AnalyzeIDResponse,analyze_id_response +AnalyzeLendingModelVersion,analyze_lending_model_version +AnalyzedEniCount,analyzed_eni_count +AnalyzedResource,analyzed_resource +AnalyzedResourceCount,analyzed_resource_count +AnalyzedResourceSummary,analyzed_resource_summary +AnalyzedTime,analyzed_time +AnalyzerSummary,analyzer_summary +AncestorIds,ancestor_ids +Anchor,anchor +AnchorDateConfiguration,anchor_date_configuration +AnchorOption,anchor_option +AncillarySourceSettings,ancillary_source_settings +And,and +AndAllFilters,and_all_filters +AndConditions,and_conditions +AndStatement,and_statement +Android,android +AndroidPushNotificationTemplate,android_push_notification_template +Annotation,annotation +AnnotationConsolidationConfig,annotation_consolidation_config +AnnotationConsolidationLambdaArn,annotation_consolidation_lambda_arn +AnnotationDataS3Uri,annotation_data_s3_uri +AnnotationImportItemDetail,annotation_import_item_detail +AnnotationImportItemSource,annotation_import_item_source +AnnotationImportJobItem,annotation_import_job_item +AnnotationStoreItem,annotation_store_item +AnnotationStoreVersionItem,annotation_store_version_item +AnnotationValue,annotation_value +Annotations,annotations +AnnouncementArn,announcement_arn +AnnouncementDirection,announcement_direction +Anomalies,anomalies +AnomalousLogGroup,anomalous_log_group +AnomalousLogGroups,anomalous_log_groups +AnomalousService,anomalous_service +Anomaly,anomaly +AnomalyClass,anomaly_class +AnomalyDateInterval,anomaly_date_interval +AnomalyDetector,anomaly_detector +AnomalyDetectorArn,anomaly_detector_arn +AnomalyDetectorConfig,anomaly_detector_config +AnomalyDetectorConfigSummary,anomaly_detector_config_summary +AnomalyDetectorConfiguration,anomaly_detector_configuration +AnomalyDetectorDataQualityMetric,anomaly_detector_data_quality_metric +AnomalyDetectorDataQualityMetricList,anomaly_detector_data_quality_metric_list +AnomalyDetectorDescription,anomaly_detector_description +AnomalyDetectorFrequency,anomaly_detector_frequency +AnomalyDetectorName,anomaly_detector_name +AnomalyDetectorSummary,anomaly_detector_summary +AnomalyDetectorSummaryList,anomaly_detector_summary_list +AnomalyDetectorTypes,anomaly_detector_types +AnomalyDetectors,anomaly_detectors +AnomalyEndDate,anomaly_end_date +AnomalyGroup,anomaly_group +AnomalyGroupId,anomaly_group_id +AnomalyGroupScore,anomaly_group_score +AnomalyGroupStatistics,anomaly_group_statistics +AnomalyGroupSummary,anomaly_group_summary +AnomalyGroupSummaryList,anomaly_group_summary_list +AnomalyGroupTimeSeries,anomaly_group_time_series +AnomalyGroupTimeSeriesFeedback,anomaly_group_time_series_feedback +AnomalyId,anomaly_id +AnomalyInstance,anomaly_instance +AnomalyMask,anomaly_mask +AnomalyMonitor,anomaly_monitor +AnomalyMonitors,anomaly_monitors +AnomalyReportedTimeRange,anomaly_reported_time_range +AnomalyResource,anomaly_resource +AnomalyResources,anomaly_resources +AnomalyScore,anomaly_score +AnomalySourceDetails,anomaly_source_details +AnomalySourceMetadata,anomaly_source_metadata +AnomalyStartDate,anomaly_start_date +AnomalySubscription,anomaly_subscription +AnomalySubscriptions,anomaly_subscriptions +AnomalyTimeRange,anomaly_time_range +AnonymousAuthDisableDate,anonymous_auth_disable_date +AnonymousAuthEnabled,anonymous_auth_enabled +AnonymousUserArn,anonymous_user_arn +AnonymousUserDashboardEmbeddingConfiguration,anonymous_user_dashboard_embedding_configuration +AnonymousUserDashboardVisualEmbeddingConfiguration,anonymous_user_dashboard_visual_embedding_configuration +AnonymousUserEmbeddingExperienceConfiguration,anonymous_user_embedding_experience_configuration +AnonymousUserQSearchBarEmbeddingConfiguration,anonymous_user_q_search_bar_embedding_configuration +AnonymousUserSnapshotJobResult,anonymous_user_snapshot_job_result +AnonymousUsers,anonymous_users +Answer,answer +AnswerKey,answer_key +AnswerMachineDetectionConfig,answer_machine_detection_config +AnswerSummaries,answer_summaries +AnswerSummary,answer_summary +Answers,answers +AntennaDemodDecodeDetails,antenna_demod_decode_details +AntennaDownlinkConfig,antenna_downlink_config +AntennaDownlinkDemodDecodeConfig,antenna_downlink_demod_decode_config +AntennaUplinkConfig,antenna_uplink_config +AntiAlias,anti_alias +AntipatternReportResult,antipattern_report_result +AntipatternSeveritySummary,antipattern_severity_summary +Any,any +AnywhereConfiguration,anywhere_configuration +ApId,ap_id +ApacheKafkaCluster,apache_kafka_cluster +ApacheKafkaClusterDescription,apache_kafka_cluster_description +Api,api +ApiAssociation,api_association +ApiCache,api_cache +ApiCallDetails,api_call_details +ApiDescription,api_description +ApiDestination,api_destination +ApiDestinationArn,api_destination_arn +ApiDestinationState,api_destination_state +ApiDestinations,api_destinations +ApiEndpoint,api_endpoint +ApiGatewayApiAsset,api_gateway_api_asset +ApiGatewayDomainName,api_gateway_domain_name +ApiGatewayId,api_gateway_id +ApiGatewayManaged,api_gateway_managed +ApiGatewayProxy,api_gateway_proxy +ApiGatewayProxyConfig,api_gateway_proxy_config +ApiGatewayProxyInput,api_gateway_proxy_input +ApiGatewayProxySummary,api_gateway_proxy_summary +ApiId,api_id +ApiKey,api_key +ApiKeyAuthParameters,api_key_auth_parameters +ApiKeyCredential,api_key_credential +ApiKeyCredentials,api_key_credentials +ApiKeyFilter,api_key_filter +ApiKeyIds,api_key_ids +ApiKeyLimitExceededException,api_key_limit_exceeded_exception +ApiKeyName,api_key_name +ApiKeyRequired,api_key_required +ApiKeyRestrictions,api_key_restrictions +ApiKeySelectionExpression,api_key_selection_expression +ApiKeySource,api_key_source +ApiKeyValidityOutOfBoundsException,api_key_validity_out_of_bounds_exception +ApiKeyValue,api_key_value +ApiKeys,api_keys +ApiLimitExceededException,api_limit_exceeded_exception +ApiMapping,api_mapping +ApiMappingId,api_mapping_id +ApiMappingKey,api_mapping_key +ApiMappingSelectionExpression,api_mapping_selection_expression +ApiName,api_name +ApiPassthrough,api_passthrough +ApiSpecificationDownloadUrl,api_specification_download_url +ApiSpecificationDownloadUrlExpiresAt,api_specification_download_url_expires_at +ApiSpecificationMd5Hash,api_specification_md5_hash +ApiSpecificationUploadUrl,api_specification_upload_url +ApiSpecificationUploadUrlExpiresAt,api_specification_upload_url_expires_at +ApiStage,api_stage +App,app +AppArn,app_arn +AppAssessment,app_assessment +AppAssessmentSummary,app_assessment_summary +AppAuthorization,app_authorization +AppAuthorizationSummary,app_authorization_summary +AppBlock,app_block +AppBlockArn,app_block_arn +AppBlockBuilder,app_block_builder +AppBlockBuilderAppBlockAssociation,app_block_builder_app_block_association +AppBlockBuilderAppBlockAssociations,app_block_builder_app_block_associations +AppBlockBuilderErrors,app_block_builder_errors +AppBlockBuilderName,app_block_builder_name +AppBlockBuilderStateChangeReason,app_block_builder_state_change_reason +AppBlockBuilders,app_block_builders +AppBlockErrors,app_block_errors +AppBlocks,app_blocks +AppBoundaryKey,app_boundary_key +AppBundle,app_bundle +AppBundleSummary,app_bundle_summary +AppComponent,app_component +AppComponentCompliance,app_component_compliance +AppCookieStickinessPolicies,app_cookie_stickiness_policies +AppCookieStickinessPolicy,app_cookie_stickiness_policy +AppDetails,app_details +AppEui,app_eui +AppFlowConfig,app_flow_config +AppId,app_id +AppIdClientRegex,app_id_client_regex +AppIds,app_ids +AppImageConfigArn,app_image_config_arn +AppImageConfigDetails,app_image_config_details +AppImageConfigName,app_image_config_name +AppImageConfigs,app_image_configs +AppInputSource,app_input_source +AppInstance,app_instance +AppInstanceAdmin,app_instance_admin +AppInstanceAdminArn,app_instance_admin_arn +AppInstanceAdminSummary,app_instance_admin_summary +AppInstanceAdmins,app_instance_admins +AppInstanceArn,app_instance_arn +AppInstanceBot,app_instance_bot +AppInstanceBotArn,app_instance_bot_arn +AppInstanceBotSummary,app_instance_bot_summary +AppInstanceBots,app_instance_bots +AppInstanceDataType,app_instance_data_type +AppInstanceRetentionSettings,app_instance_retention_settings +AppInstanceStreamingConfiguration,app_instance_streaming_configuration +AppInstanceStreamingConfigurations,app_instance_streaming_configurations +AppInstanceSummary,app_instance_summary +AppInstanceUser,app_instance_user +AppInstanceUserArn,app_instance_user_arn +AppInstanceUserEndpoint,app_instance_user_endpoint +AppInstanceUserEndpointSummary,app_instance_user_endpoint_summary +AppInstanceUserEndpoints,app_instance_user_endpoints +AppInstanceUserId,app_instance_user_id +AppInstanceUserMembershipSummary,app_instance_user_membership_summary +AppInstanceUserSummary,app_instance_user_summary +AppInstanceUsers,app_instance_users +AppInstances,app_instances +AppIntegrationsConfiguration,app_integrations_configuration +AppKey,app_key +AppLogsEnabled,app_logs_enabled +AppManaged,app_managed +AppMonitor,app_monitor +AppMonitorConfiguration,app_monitor_configuration +AppMonitorDetails,app_monitor_details +AppMonitorName,app_monitor_name +AppMonitorSummaries,app_monitor_summaries +AppMonitorSummary,app_monitor_summary +AppName,app_name +AppNetworkAccessType,app_network_access_type +AppPackageName,app_package_name +AppRegistryArn,app_registry_arn +AppRegistryConfiguration,app_registry_configuration +AppSKey,app_s_key +AppSecurityGroupManagement,app_security_group_management +AppServerPrivateKey,app_server_private_key +AppSource,app_source +AppSpecContent,app_spec_content +AppSpecification,app_specification +AppSummary,app_summary +AppSyncRuntime,app_sync_runtime +AppTitle,app_title +AppType,app_type +AppTypeEquals,app_type_equals +AppUnitError,app_unit_error +AppValidationConfiguration,app_validation_configuration +AppValidationOutput,app_validation_output +AppVersion,app_version +AppVersionCode,app_version_code +AppVersionSummary,app_version_summary +AppVisibility,app_visibility +AppendAccessString,append_access_string +AppendSourcePath,append_source_path +AppflowIntegration,appflow_integration +AppflowIntegrationWorkflowAttributes,appflow_integration_workflow_attributes +AppflowIntegrationWorkflowMetrics,appflow_integration_workflow_metrics +AppflowIntegrationWorkflowStep,appflow_integration_workflow_step +ApplianceModeSupport,appliance_mode_support +Applicability,applicability +Application,application +ApplicationARN,application_arn +ApplicationAggregatedStatus,application_aggregated_status +ApplicationAlreadyExistsException,application_already_exists_exception +ApplicationArn,application_arn +ApplicationArns,application_arns +ApplicationCode,application_code +ApplicationCodeConfiguration,application_code_configuration +ApplicationCodeConfigurationDescription,application_code_configuration_description +ApplicationCodeConfigurationUpdate,application_code_configuration_update +ApplicationCodeUpdate,application_code_update +ApplicationComponent,application_component +ApplicationComponentDetail,application_component_detail +ApplicationComponentList,application_component_list +ApplicationComponentStatusSummary,application_component_status_summary +ApplicationComponentStrategy,application_component_strategy +ApplicationComponentSummary,application_component_summary +ApplicationConfig,application_config +ApplicationConfiguration,application_configuration +ApplicationConfigurationDescription,application_configuration_description +ApplicationConfigurationUpdate,application_configuration_update +ApplicationCredential,application_credential +ApplicationDPUSizes,application_dpu_sizes +ApplicationDateRangeKpiResponse,application_date_range_kpi_response +ApplicationDependencySummary,application_dependency_summary +ApplicationDescription,application_description +ApplicationDescriptionMessage,application_description_message +ApplicationDescriptionsMessage,application_descriptions_message +ApplicationDetail,application_detail +ApplicationDoesNotExistException,application_does_not_exist_exception +ApplicationDomain,application_domain +ApplicationFleetAssociation,application_fleet_association +ApplicationFleetAssociations,application_fleet_associations +ApplicationId,application_id +ApplicationIdentifier,application_identifier +ApplicationIds,application_ids +ApplicationInfo,application_info +ApplicationInfoList,application_info_list +ApplicationInstance,application_instance +ApplicationInstanceId,application_instance_id +ApplicationInstanceIdToReplace,application_instance_id_to_replace +ApplicationInstances,application_instances +ApplicationIntegrationURL,application_integration_url +ApplicationLayerAutomaticResponseConfiguration,application_layer_automatic_response_configuration +ApplicationLimitExceededException,application_limit_exceeded_exception +ApplicationMaintenanceConfigurationDescription,application_maintenance_configuration_description +ApplicationMaintenanceConfigurationUpdate,application_maintenance_configuration_update +ApplicationMaintenanceWindowEndTime,application_maintenance_window_end_time +ApplicationMaintenanceWindowStartTime,application_maintenance_window_start_time +ApplicationMaintenanceWindowStartTimeUpdate,application_maintenance_window_start_time_update +ApplicationMetrics,application_metrics +ApplicationMode,application_mode +ApplicationName,application_name +ApplicationNameRequiredException,application_name_required_exception +ApplicationNames,application_names +ApplicationPermissions,application_permissions +ApplicationPolicies,application_policies +ApplicationPolicyStatement,application_policy_statement +ApplicationPreferences,application_preferences +ApplicationQuota,application_quota +ApplicationResourceLifecycleConfig,application_resource_lifecycle_config +ApplicationResourceLifecycleDescriptionMessage,application_resource_lifecycle_description_message +ApplicationResponse,application_response +ApplicationRestoreConfiguration,application_restore_configuration +ApplicationRestoreConfigurationDescription,application_restore_configuration_description +ApplicationRestoreType,application_restore_type +ApplicationRuntimeId,application_runtime_id +ApplicationServerPublicKey,application_server_public_key +ApplicationSettings,application_settings +ApplicationSettingsJourneyLimits,application_settings_journey_limits +ApplicationSettingsResource,application_settings_resource +ApplicationSettingsResponse,application_settings_response +ApplicationSnapshotConfiguration,application_snapshot_configuration +ApplicationSnapshotConfigurationDescription,application_snapshot_configuration_description +ApplicationSnapshotConfigurationUpdate,application_snapshot_configuration_update +ApplicationSource,application_source +ApplicationSourceConfig,application_source_config +ApplicationSources,application_sources +ApplicationState,application_state +ApplicationStateList,application_state_list +ApplicationStatus,application_status +ApplicationSuccessFeedbackRoleArn,application_success_feedback_role_arn +ApplicationSummaries,application_summaries +ApplicationSummary,application_summary +ApplicationSummaryList,application_summary_list +ApplicationTransactionCounter,application_transaction_counter +ApplicationType,application_type +ApplicationUpdate,application_update +ApplicationVersion,application_version +ApplicationVersionArn,application_version_arn +ApplicationVersionDescription,application_version_description +ApplicationVersionDescriptionMessage,application_version_description_message +ApplicationVersionDescriptionsMessage,application_version_descriptions_message +ApplicationVersionDetail,application_version_detail +ApplicationVersionId,application_version_id +ApplicationVersionLifecycleConfig,application_version_lifecycle_config +ApplicationVersionQuota,application_version_quota +ApplicationVersionRolledBackFrom,application_version_rolled_back_from +ApplicationVersionRolledBackTo,application_version_rolled_back_to +ApplicationVersionSummaries,application_version_summaries +ApplicationVersionSummary,application_version_summary +ApplicationVersionUpdatedFrom,application_version_updated_from +ApplicationVersions,application_versions +Applications,applications +ApplicationsResponse,applications_response +AppliedColorSpaceConversion,applied_color_space_conversion +AppliedDdls,applied_ddls +AppliedDeletes,applied_deletes +AppliedExtension,applied_extension +AppliedExtensions,applied_extensions +AppliedInserts,applied_inserts +AppliedSchemaArn,applied_schema_arn +AppliedSettings,applied_settings +AppliedTerminologies,applied_terminologies +AppliedTerminology,applied_terminology +AppliedUpdates,applied_updates +AppliedValue,applied_value +ApplyAction,apply_action +ApplyArchiveRuleRequest,apply_archive_rule_request +ApplyEnvironmentManagedActionRequest,apply_environment_managed_action_request +ApplyEnvironmentManagedActionResult,apply_environment_managed_action_result +ApplyFontColor,apply_font_color +ApplyImmediately,apply_immediately +ApplyMapping,apply_mapping +ApplyMethod,apply_method +ApplyOn,apply_on +ApplyOnlyAtCronInterval,apply_only_at_cron_interval +ApplyPendingMaintenance,apply_pending_maintenance +ApplyPendingMaintenanceActionMessage,apply_pending_maintenance_action_message +ApplyPendingMaintenanceActionResponse,apply_pending_maintenance_action_response +ApplyPendingMaintenanceActionResult,apply_pending_maintenance_action_result +ApplySchemaRequest,apply_schema_request +ApplySchemaResponse,apply_schema_response +ApplySecurityGroupsToClientVpnTargetNetworkRequest,apply_security_groups_to_client_vpn_target_network_request +ApplySecurityGroupsToClientVpnTargetNetworkResult,apply_security_groups_to_client_vpn_target_network_result +ApplySecurityGroupsToLoadBalancerInput,apply_security_groups_to_load_balancer_input +ApplySecurityGroupsToLoadBalancerOutput,apply_security_groups_to_load_balancer_output +ApplyServerSideEncryptionByDefault,apply_server_side_encryption_by_default +ApplyStatus,apply_status +ApplyTo,apply_to +ApplyToAllRegions,apply_to_all_regions +ApplyType,apply_type +Approval,approval +ApprovalAlreadyCompletedException,approval_already_completed_exception +ApprovalDate,approval_date +ApprovalDescription,approval_description +ApprovalModel,approval_model +ApprovalResult,approval_result +ApprovalRule,approval_rule +ApprovalRuleContentRequiredException,approval_rule_content_required_exception +ApprovalRuleDoesNotExistException,approval_rule_does_not_exist_exception +ApprovalRuleEventMetadata,approval_rule_event_metadata +ApprovalRuleNameAlreadyExistsException,approval_rule_name_already_exists_exception +ApprovalRuleNameRequiredException,approval_rule_name_required_exception +ApprovalRuleOverriddenEventMetadata,approval_rule_overridden_event_metadata +ApprovalRuleTemplate,approval_rule_template +ApprovalRuleTemplateContentRequiredException,approval_rule_template_content_required_exception +ApprovalRuleTemplateDoesNotExistException,approval_rule_template_does_not_exist_exception +ApprovalRuleTemplateInUseException,approval_rule_template_in_use_exception +ApprovalRuleTemplateNameAlreadyExistsException,approval_rule_template_name_already_exists_exception +ApprovalRuleTemplateNameRequiredException,approval_rule_template_name_required_exception +ApprovalRules,approval_rules +ApprovalStateChangedEventMetadata,approval_state_changed_event_metadata +ApprovalStateRequiredException,approval_state_required_exception +ApprovalThresholdPolicy,approval_threshold_policy +ApprovalTime,approval_time +ApproveAfterDays,approve_after_days +ApproveAssignmentRequest,approve_assignment_request +ApproveSkillRequest,approve_skill_request +ApproveUntilDate,approve_until_date +ApprovedOrigins,approved_origins +ApprovedPatches,approved_patches +ApprovedPatchesComplianceLevel,approved_patches_compliance_level +ApprovedPatchesEnableNonSecurity,approved_patches_enable_non_security +ApprovedVersion,approved_version +ApproximateAggregateValue,approximate_aggregate_value +ApproximateArrivalTimestamp,approximate_arrival_timestamp +ApproximateAssetCount,approximate_asset_count +ApproximateCount,approximate_count +ApproximateCreationDateTime,approximate_creation_date_time +ApproximateDurationSeconds,approximate_duration_seconds +ApproximateNumberOfMessagesMoved,approximate_number_of_messages_moved +ApproximateNumberOfMessagesToMove,approximate_number_of_messages_to_move +ApproximateResultCount,approximate_result_count +ApproximateStartTime,approximate_start_time +ApproximateTime,approximate_time +ApproximateTotalCount,approximate_total_count +ApproximateUniqueCount,approximate_unique_count +ApproximateValue,approximate_value +Apps,apps +AppsCount,apps_count +AppsList,apps_list +AppsListArn,apps_list_arn +AppsListData,apps_list_data +AppsListDataSummary,apps_list_data_summary +AppsLists,apps_lists +AppstreamAgentVersion,appstream_agent_version +AquaConfiguration,aqua_configuration +AquaConfigurationStatus,aqua_configuration_status +AquaStatus,aqua_status +ArbitraryPatternLimits,arbitrary_pattern_limits +Arc,arc +ArcAngle,arc_angle +ArcAxis,arc_axis +ArcAxisConfiguration,arc_axis_configuration +ArcAxisDisplayRange,arc_axis_display_range +ArcConfiguration,arc_configuration +ArcOptions,arc_options +ArcThickness,arc_thickness +Arch,arch +ArchitecturalDesign,architectural_design +Architecture,architecture +ArchitectureTypes,architecture_types +Architectures,architectures +ArchivalBackupArn,archival_backup_arn +ArchivalCompleteTime,archival_complete_time +ArchivalDateTime,archival_date_time +ArchivalReason,archival_reason +ArchivalSummary,archival_summary +Archive,archive +ArchiveAllowedFlag,archive_allowed_flag +ArchiveApplicationRequest,archive_application_request +ArchiveArn,archive_arn +ArchiveCdnSettings,archive_cdn_settings +ArchiveContainerSettings,archive_container_settings +ArchiveCreationOutput,archive_creation_output +ArchiveDescription,archive_description +ArchiveFindingsRequest,archive_findings_request +ArchiveGroupSettings,archive_group_settings +ArchiveId,archive_id +ArchiveName,archive_name +ArchiveOutputSettings,archive_output_settings +ArchiveRetainRule,archive_retain_rule +ArchiveRule,archive_rule +ArchiveRuleSummary,archive_rule_summary +ArchiveS3Settings,archive_s3_settings +ArchiveSHA256TreeHash,archive_sha256_tree_hash +ArchiveSizeInBytes,archive_size_in_bytes +ArchiveStatus,archive_status +ArchiveWaveRequest,archive_wave_request +Archived,archived +ArchivedLogDestId,archived_log_dest_id +ArchivedLogsOnly,archived_logs_only +Archives,archives +AreaCode,area_code +AreaOfInterest,area_of_interest +AreaStyleSettings,area_style_settings +AreaUnderPRCurve,area_under_pr_curve +Args,args +ArgumentException,argument_exception +Arguments,arguments +ArgumentsMap,arguments_map +Arib,arib +AribCaptionsPid,arib_captions_pid +AribCaptionsPidControl,arib_captions_pid_control +AribDestinationSettings,arib_destination_settings +AribSourceSettings,arib_source_settings +Arn,arn +ArnNotSupportedException,arn_not_supported_exception +Arns,arns +ArrayColumnInfo,array_column_info +ArrayProperties,array_properties +ArrayPropertiesDetail,array_properties_detail +ArrayPropertiesSummary,array_properties_summary +ArrayValue,array_value +ArrivalDate,arrival_date +Artifact,artifact +ArtifactArn,artifact_arn +ArtifactConfig,artifact_config +ArtifactConfigInput,artifact_config_input +ArtifactConfigOutput,artifact_config_output +ArtifactDetail,artifact_detail +ArtifactDetails,artifact_details +ArtifactDigest,artifact_digest +ArtifactId,artifact_id +ArtifactIdentifier,artifact_identifier +ArtifactLocation,artifact_location +ArtifactName,artifact_name +ArtifactPath,artifact_path +ArtifactRevision,artifact_revision +ArtifactS3Location,artifact_s3_location +ArtifactSource,artifact_source +ArtifactSourceType,artifact_source_type +ArtifactStore,artifact_store +ArtifactSummaries,artifact_summaries +ArtifactSummary,artifact_summary +ArtifactType,artifact_type +Artifacts,artifacts +ArtifactsConcatenationConfiguration,artifacts_concatenation_configuration +ArtifactsConfiguration,artifacts_configuration +Artwork,artwork +As2Config,as2_config +As2ConnectorConfig,as2_connector_config +As2Id,as2_id +As2Transports,as2_transports +AsPath,as_path +Ascending,ascending +AsmPassword,asm_password +AsmServer,asm_server +AsmUser,asm_user +Asn,asn +AsnOrg,asn_org +AspectRatio,aspect_ratio +AssembleWith,assemble_with +AssertedControls,asserted_controls +AssertionAttributes,assertion_attributes +AssertionRule,assertion_rule +AssertionRuleUpdate,assertion_rule_update +Assessment,assessment +AssessmentControl,assessment_control +AssessmentControlSet,assessment_control_set +AssessmentEvidenceFolder,assessment_evidence_folder +AssessmentFramework,assessment_framework +AssessmentFrameworkMetadata,assessment_framework_metadata +AssessmentFrameworkShareRequest,assessment_framework_share_request +AssessmentMetadata,assessment_metadata +AssessmentMetadataItem,assessment_metadata_item +AssessmentProgress,assessment_progress +AssessmentReport,assessment_report +AssessmentReportEvidenceError,assessment_report_evidence_error +AssessmentReportMetadata,assessment_report_metadata +AssessmentReportTypes,assessment_report_types +AssessmentReportsDestination,assessment_reports_destination +AssessmentResults,assessment_results +AssessmentResultsFile,assessment_results_file +AssessmentRun,assessment_run +AssessmentRunAgent,assessment_run_agent +AssessmentRunFilter,assessment_run_filter +AssessmentRunInProgressException,assessment_run_in_progress_exception +AssessmentRunName,assessment_run_name +AssessmentRunNotification,assessment_run_notification +AssessmentRunStateChange,assessment_run_state_change +AssessmentStatus,assessment_status +AssessmentSummary,assessment_summary +AssessmentTarget,assessment_target +AssessmentTargetFilter,assessment_target_filter +AssessmentTemplate,assessment_template +AssessmentTemplateFilter,assessment_template_filter +Asset,asset +AssetAttributes,asset_attributes +AssetBundleCloudFormationOverridePropertyConfiguration,asset_bundle_cloud_formation_override_property_configuration +AssetBundleExportJobAnalysisOverrideProperties,asset_bundle_export_job_analysis_override_properties +AssetBundleExportJobDashboardOverrideProperties,asset_bundle_export_job_dashboard_override_properties +AssetBundleExportJobDataSetOverrideProperties,asset_bundle_export_job_data_set_override_properties +AssetBundleExportJobDataSourceOverrideProperties,asset_bundle_export_job_data_source_override_properties +AssetBundleExportJobError,asset_bundle_export_job_error +AssetBundleExportJobId,asset_bundle_export_job_id +AssetBundleExportJobRefreshScheduleOverrideProperties,asset_bundle_export_job_refresh_schedule_override_properties +AssetBundleExportJobResourceIdOverrideConfiguration,asset_bundle_export_job_resource_id_override_configuration +AssetBundleExportJobSummary,asset_bundle_export_job_summary +AssetBundleExportJobSummaryList,asset_bundle_export_job_summary_list +AssetBundleExportJobThemeOverrideProperties,asset_bundle_export_job_theme_override_properties +AssetBundleExportJobVPCConnectionOverrideProperties,asset_bundle_export_job_vpc_connection_override_properties +AssetBundleImportJobAnalysisOverrideParameters,asset_bundle_import_job_analysis_override_parameters +AssetBundleImportJobDashboardOverrideParameters,asset_bundle_import_job_dashboard_override_parameters +AssetBundleImportJobDataSetOverrideParameters,asset_bundle_import_job_data_set_override_parameters +AssetBundleImportJobDataSourceCredentialPair,asset_bundle_import_job_data_source_credential_pair +AssetBundleImportJobDataSourceCredentials,asset_bundle_import_job_data_source_credentials +AssetBundleImportJobDataSourceOverrideParameters,asset_bundle_import_job_data_source_override_parameters +AssetBundleImportJobError,asset_bundle_import_job_error +AssetBundleImportJobId,asset_bundle_import_job_id +AssetBundleImportJobOverrideParameters,asset_bundle_import_job_override_parameters +AssetBundleImportJobRefreshScheduleOverrideParameters,asset_bundle_import_job_refresh_schedule_override_parameters +AssetBundleImportJobResourceIdOverrideConfiguration,asset_bundle_import_job_resource_id_override_configuration +AssetBundleImportJobSummary,asset_bundle_import_job_summary +AssetBundleImportJobSummaryList,asset_bundle_import_job_summary_list +AssetBundleImportJobThemeOverrideParameters,asset_bundle_import_job_theme_override_parameters +AssetBundleImportJobVPCConnectionOverrideParameters,asset_bundle_import_job_vpc_connection_override_parameters +AssetBundleImportSource,asset_bundle_import_source +AssetBundleImportSourceDescription,asset_bundle_import_source_description +AssetCompositeModel,asset_composite_model +AssetDestinationEntry,asset_destination_entry +AssetDestinations,asset_destinations +AssetDetails,asset_details +AssetEntry,asset_entry +AssetErrorDetails,asset_error_details +AssetHierarchy,asset_hierarchy +AssetHierarchyInfo,asset_hierarchy_info +AssetId,asset_id +AssetIds,asset_ids +AssetInfo,asset_info +AssetInformationList,asset_information_list +AssetLocation,asset_location +AssetModelCompositeModel,asset_model_composite_model +AssetModelCompositeModelDefinition,asset_model_composite_model_definition +AssetModelHierarchy,asset_model_hierarchy +AssetModelHierarchyDefinition,asset_model_hierarchy_definition +AssetModelProperty,asset_model_property +AssetModelPropertyDefinition,asset_model_property_definition +AssetModelPropertySummary,asset_model_property_summary +AssetModelStatus,asset_model_status +AssetModelSummary,asset_model_summary +AssetName,asset_name +AssetProperty,asset_property +AssetPropertySummary,asset_property_summary +AssetPropertyTimestamp,asset_property_timestamp +AssetPropertyValue,asset_property_value +AssetPropertyVariant,asset_property_variant +AssetRelationshipSummary,asset_relationship_summary +AssetShallow,asset_shallow +AssetSource,asset_source +AssetSourceEntry,asset_source_entry +AssetSources,asset_sources +AssetStatus,asset_status +AssetSummary,asset_summary +AssetType,asset_type +AssetValue,asset_value +Assets,assets +Assign,assign +AssignContactCategoryAction,assign_contact_category_action +AssignInstanceRequest,assign_instance_request +AssignIpv6AddressOnCreation,assign_ipv6_address_on_creation +AssignIpv6AddressesRequest,assign_ipv6_addresses_request +AssignIpv6AddressesResult,assign_ipv6_addresses_result +AssignPrivateIpAddressesRequest,assign_private_ip_addresses_request +AssignPrivateIpAddressesResult,assign_private_ip_addresses_result +AssignPrivateNatGatewayAddressRequest,assign_private_nat_gateway_address_request +AssignPrivateNatGatewayAddressResult,assign_private_nat_gateway_address_result +AssignPublicIp,assign_public_ip +AssignTapePoolInput,assign_tape_pool_input +AssignTapePoolOutput,assign_tape_pool_output +AssignVolumeRequest,assign_volume_request +AssignedIpv4Prefixes,assigned_ipv4_prefixes +AssignedIpv6Addresses,assigned_ipv6_addresses +AssignedIpv6Prefixes,assigned_ipv6_prefixes +AssignedPrivateIpAddress,assigned_private_ip_address +AssignedPrivateIpAddresses,assigned_private_ip_addresses +Assigning,assigning +Assignment,assignment +AssignmentDurationInSeconds,assignment_duration_in_seconds +AssignmentId,assignment_id +AssignmentName,assignment_name +AssignmentReviewPolicy,assignment_review_policy +AssignmentReviewReport,assignment_review_report +AssignmentStatus,assignment_status +AssignmentStatuses,assignment_statuses +Assignments,assignments +AssistAltitude,assist_altitude +AssistPosition,assist_position +AssistantAssociationData,assistant_association_data +AssistantAssociationSummary,assistant_association_summary +AssistantData,assistant_data +AssistantIntegrationConfiguration,assistant_integration_configuration +AssistantSummary,assistant_summary +AssociateAccountsInput,associate_accounts_input +AssociateAccountsOutput,associate_accounts_output +AssociateAddressRequest,associate_address_request +AssociateAddressResult,associate_address_result +AssociateAdminAccountRequest,associate_admin_account_request +AssociateAliasRequest,associate_alias_request +AssociateApiRequest,associate_api_request +AssociateApiResponse,associate_api_response +AssociateAppBlockBuilderAppBlockRequest,associate_app_block_builder_app_block_request +AssociateAppBlockBuilderAppBlockResult,associate_app_block_builder_app_block_result +AssociateApplicationFleetRequest,associate_application_fleet_request +AssociateApplicationFleetResult,associate_application_fleet_result +AssociateApplicationToEntitlementRequest,associate_application_to_entitlement_request +AssociateApplicationsRequest,associate_applications_request +AssociateApprovalRuleTemplateWithRepositoryInput,associate_approval_rule_template_with_repository_input +AssociateApprovedOriginRequest,associate_approved_origin_request +AssociateAssessmentReportEvidenceFolderRequest,associate_assessment_report_evidence_folder_request +AssociateAssetsRequest,associate_assets_request +AssociateAttributeGroupRequest,associate_attribute_group_request +AssociateAttributeGroupResponse,associate_attribute_group_response +AssociateAwsAccountWithPartnerAccountRequest,associate_aws_account_with_partner_account_request +AssociateAwsAccountWithPartnerAccountResponse,associate_aws_account_with_partner_account_response +AssociateBotRequest,associate_bot_request +AssociateBrowserSettingsRequest,associate_browser_settings_request +AssociateBrowserSettingsResponse,associate_browser_settings_response +AssociateBudgetWithResourceInput,associate_budget_with_resource_input +AssociateCarrierIpAddress,associate_carrier_ip_address +AssociateCertificateRequest,associate_certificate_request +AssociateChannelFlowRequest,associate_channel_flow_request +AssociateClientDeviceWithCoreDeviceEntry,associate_client_device_with_core_device_entry +AssociateClientDeviceWithCoreDeviceErrorEntry,associate_client_device_with_core_device_error_entry +AssociateClientVpnTargetNetworkRequest,associate_client_vpn_target_network_request +AssociateClientVpnTargetNetworkResult,associate_client_vpn_target_network_result +AssociateConfigurationItemsToApplicationRequest,associate_configuration_items_to_application_request +AssociateConnectPeerRequest,associate_connect_peer_request +AssociateConnectPeerResponse,associate_connect_peer_response +AssociateConnectionAliasRequest,associate_connection_alias_request +AssociateConnectionAliasResult,associate_connection_alias_result +AssociateConnectionWithLagRequest,associate_connection_with_lag_request +AssociateContactWithAddressBookRequest,associate_contact_with_address_book_request +AssociateCreatedArtifactRequest,associate_created_artifact_request +AssociateCustomDomainRequest,associate_custom_domain_request +AssociateCustomDomainResponse,associate_custom_domain_response +AssociateCustomerGatewayRequest,associate_customer_gateway_request +AssociateCustomerGatewayResponse,associate_customer_gateway_response +AssociateDRTLogBucketRequest,associate_drt_log_bucket_request +AssociateDRTRoleRequest,associate_drt_role_request +AssociateDataShareConsumerMessage,associate_data_share_consumer_message +AssociateDefaultViewInput,associate_default_view_input +AssociateDefaultViewOutput,associate_default_view_output +AssociateDefaultVocabularyRequest,associate_default_vocabulary_request +AssociateDelegateToResourceRequest,associate_delegate_to_resource_request +AssociateDelegationSignerToDomainRequest,associate_delegation_signer_to_domain_request +AssociateDelegationSignerToDomainResponse,associate_delegation_signer_to_domain_response +AssociateDeviceWithNetworkProfileRequest,associate_device_with_network_profile_request +AssociateDeviceWithPlacementRequest,associate_device_with_placement_request +AssociateDeviceWithRoomRequest,associate_device_with_room_request +AssociateDhcpOptionsRequest,associate_dhcp_options_request +AssociateDiscoveredResourceRequest,associate_discovered_resource_request +AssociateDomainRequest,associate_domain_request +AssociateElasticIpRequest,associate_elastic_ip_request +AssociateEnclaveCertificateIamRoleRequest,associate_enclave_certificate_iam_role_request +AssociateEnclaveCertificateIamRoleResult,associate_enclave_certificate_iam_role_result +AssociateEncryptionConfigRequest,associate_encryption_config_request +AssociateEncryptionConfigResponse,associate_encryption_config_response +AssociateEntireAccount,associate_entire_account +AssociateEntitiesToExperienceRequest,associate_entities_to_experience_request +AssociateEntitiesToExperienceResponse,associate_entities_to_experience_response +AssociateEntityToThingRequest,associate_entity_to_thing_request +AssociateEnvironmentOperationsRoleMessage,associate_environment_operations_role_message +AssociateExternalConnectionRequest,associate_external_connection_request +AssociateExternalConnectionResult,associate_external_connection_result +AssociateFacesRequest,associate_faces_request +AssociateFacesResponse,associate_faces_response +AssociateFileSystemAliasesRequest,associate_file_system_aliases_request +AssociateFileSystemAliasesResponse,associate_file_system_aliases_response +AssociateFileSystemInput,associate_file_system_input +AssociateFileSystemOutput,associate_file_system_output +AssociateFirewallPolicyRequest,associate_firewall_policy_request +AssociateFirewallPolicyResponse,associate_firewall_policy_response +AssociateFirewallRuleGroupRequest,associate_firewall_rule_group_request +AssociateFirewallRuleGroupResponse,associate_firewall_rule_group_response +AssociateFleetRequest,associate_fleet_request +AssociateFraudsterRequest,associate_fraudster_request +AssociateFraudsterResponse,associate_fraudster_response +AssociateGatewayToServerInput,associate_gateway_to_server_input +AssociateGatewayToServerOutput,associate_gateway_to_server_output +AssociateHealthCheckRequest,associate_health_check_request +AssociateHostedConnectionRequest,associate_hosted_connection_request +AssociateIamInstanceProfileRequest,associate_iam_instance_profile_request +AssociateIamInstanceProfileResult,associate_iam_instance_profile_result +AssociateIdentityProviderConfigRequest,associate_identity_provider_config_request +AssociateIdentityProviderConfigResponse,associate_identity_provider_config_response +AssociateInstanceEventWindowRequest,associate_instance_event_window_request +AssociateInstanceEventWindowResult,associate_instance_event_window_result +AssociateInstanceStorageConfigRequest,associate_instance_storage_config_request +AssociateInstanceStorageConfigResponse,associate_instance_storage_config_response +AssociateIpAccessSettingsRequest,associate_ip_access_settings_request +AssociateIpAccessSettingsResponse,associate_ip_access_settings_response +AssociateIpGroupsRequest,associate_ip_groups_request +AssociateIpamResourceDiscoveryRequest,associate_ipam_resource_discovery_request +AssociateIpamResourceDiscoveryResult,associate_ipam_resource_discovery_result +AssociateKmsKeyRequest,associate_kms_key_request +AssociateLambdaFunctionRequest,associate_lambda_function_request +AssociateLensesInput,associate_lenses_input +AssociateLexBotRequest,associate_lex_bot_request +AssociateLicenseRequest,associate_license_request +AssociateLicenseResponse,associate_license_response +AssociateLinkRequest,associate_link_request +AssociateLinkResponse,associate_link_response +AssociateMacSecKeyRequest,associate_mac_sec_key_request +AssociateMacSecKeyResponse,associate_mac_sec_key_response +AssociateMemberAccountRequest,associate_member_account_request +AssociateMemberRequest,associate_member_request +AssociateMemberResponse,associate_member_response +AssociateMemberToGroupRequest,associate_member_to_group_request +AssociateMergedGraphqlApiRequest,associate_merged_graphql_api_request +AssociateMergedGraphqlApiResponse,associate_merged_graphql_api_response +AssociateMulticastGroupWithFuotaTaskRequest,associate_multicast_group_with_fuota_task_request +AssociateNatGatewayAddressRequest,associate_nat_gateway_address_request +AssociateNatGatewayAddressResult,associate_nat_gateway_address_result +AssociateNetworkSettingsRequest,associate_network_settings_request +AssociateNetworkSettingsResponse,associate_network_settings_response +AssociateNodeRequest,associate_node_request +AssociateNodeResponse,associate_node_response +AssociateOpsItemRelatedItemRequest,associate_ops_item_related_item_request +AssociateOpsItemRelatedItemResponse,associate_ops_item_related_item_response +AssociateOriginationIdentityRequest,associate_origination_identity_request +AssociateOriginationIdentityResult,associate_origination_identity_result +AssociatePackageRequest,associate_package_request +AssociatePackageResponse,associate_package_response +AssociatePersonasToEntitiesRequest,associate_personas_to_entities_request +AssociatePersonasToEntitiesResponse,associate_personas_to_entities_response +AssociatePhoneNumberContactFlowRequest,associate_phone_number_contact_flow_request +AssociatePhoneNumberWithUserRequest,associate_phone_number_with_user_request +AssociatePhoneNumbersWithVoiceConnectorGroupRequest,associate_phone_numbers_with_voice_connector_group_request +AssociatePhoneNumbersWithVoiceConnectorGroupResponse,associate_phone_numbers_with_voice_connector_group_response +AssociatePhoneNumbersWithVoiceConnectorRequest,associate_phone_numbers_with_voice_connector_request +AssociatePhoneNumbersWithVoiceConnectorResponse,associate_phone_numbers_with_voice_connector_response +AssociatePricingRulesInput,associate_pricing_rules_input +AssociatePricingRulesOutput,associate_pricing_rules_output +AssociatePrincipalWithPortfolioInput,associate_principal_with_portfolio_input +AssociateProactiveEngagementDetailsRequest,associate_proactive_engagement_details_request +AssociateProductWithPortfolioInput,associate_product_with_portfolio_input +AssociateProfilesInput,associate_profiles_input +AssociatePublicIpAddress,associate_public_ip_address +AssociateQualificationWithWorkerRequest,associate_qualification_with_worker_request +AssociateQueueQuickConnectsRequest,associate_queue_quick_connects_request +AssociateRepositoryRequest,associate_repository_request +AssociateRepositoryResponse,associate_repository_response +AssociateResolverEndpointIpAddressRequest,associate_resolver_endpoint_ip_address_request +AssociateResolverEndpointIpAddressResponse,associate_resolver_endpoint_ip_address_response +AssociateResolverQueryLogConfigRequest,associate_resolver_query_log_config_request +AssociateResolverQueryLogConfigResponse,associate_resolver_query_log_config_response +AssociateResolverRuleRequest,associate_resolver_rule_request +AssociateResolverRuleResponse,associate_resolver_rule_response +AssociateResourceError,associate_resource_error +AssociateResourceRequest,associate_resource_request +AssociateResourceResponse,associate_resource_response +AssociateResourceResponseElement,associate_resource_response_element +AssociateResourceSharePermissionRequest,associate_resource_share_permission_request +AssociateResourceSharePermissionResponse,associate_resource_share_permission_response +AssociateResourceShareRequest,associate_resource_share_request +AssociateResourceShareResponse,associate_resource_share_response +AssociateRoleToGroupRequest,associate_role_to_group_request +AssociateRoleToGroupResponse,associate_role_to_group_response +AssociateRouteTableRequest,associate_route_table_request +AssociateRouteTableResult,associate_route_table_result +AssociateRoutingProfileQueuesRequest,associate_routing_profile_queues_request +AssociateS3ResourcesRequest,associate_s3_resources_request +AssociateS3ResourcesResult,associate_s3_resources_result +AssociateSecurityKeyRequest,associate_security_key_request +AssociateSecurityKeyResponse,associate_security_key_response +AssociateServiceActionWithProvisioningArtifactInput,associate_service_action_with_provisioning_artifact_input +AssociateServiceRoleToAccountRequest,associate_service_role_to_account_request +AssociateServiceRoleToAccountResponse,associate_service_role_to_account_response +AssociateSigninDelegateGroupsWithAccountRequest,associate_signin_delegate_groups_with_account_request +AssociateSkillGroupWithRoomRequest,associate_skill_group_with_room_request +AssociateSkillWithSkillGroupRequest,associate_skill_with_skill_group_request +AssociateSkillWithUsersRequest,associate_skill_with_users_request +AssociateSoftwareTokenRequest,associate_software_token_request +AssociateSoftwareTokenResponse,associate_software_token_response +AssociateSourceGraphqlApiRequest,associate_source_graphql_api_request +AssociateSourceGraphqlApiResponse,associate_source_graphql_api_response +AssociateSourceNetworkStackRequest,associate_source_network_stack_request +AssociateSourceNetworkStackResponse,associate_source_network_stack_response +AssociateSourceServersRequest,associate_source_servers_request +AssociateSubnetCidrBlockRequest,associate_subnet_cidr_block_request +AssociateSubnetCidrBlockResult,associate_subnet_cidr_block_result +AssociateSubnetsRequest,associate_subnets_request +AssociateSubnetsResponse,associate_subnets_response +AssociateTagOptionWithResourceInput,associate_tag_option_with_resource_input +AssociateTargetsWithJobRequest,associate_targets_with_job_request +AssociateTargetsWithJobResponse,associate_targets_with_job_response +AssociateTeamMemberRequest,associate_team_member_request +AssociateTeamMemberResult,associate_team_member_result +AssociateThirdPartyFirewallRequest,associate_third_party_firewall_request +AssociateThirdPartyFirewallResponse,associate_third_party_firewall_response +AssociateTimeSeriesToAssetPropertyRequest,associate_time_series_to_asset_property_request +AssociateTrackerConsumerRequest,associate_tracker_consumer_request +AssociateTrafficDistributionGroupUserRequest,associate_traffic_distribution_group_user_request +AssociateTransitGatewayConnectPeerRequest,associate_transit_gateway_connect_peer_request +AssociateTransitGatewayConnectPeerResponse,associate_transit_gateway_connect_peer_response +AssociateTransitGatewayMulticastDomainRequest,associate_transit_gateway_multicast_domain_request +AssociateTransitGatewayMulticastDomainResult,associate_transit_gateway_multicast_domain_result +AssociateTransitGatewayPolicyTableRequest,associate_transit_gateway_policy_table_request +AssociateTransitGatewayPolicyTableResult,associate_transit_gateway_policy_table_result +AssociateTransitGatewayRouteTableRequest,associate_transit_gateway_route_table_request +AssociateTransitGatewayRouteTableResult,associate_transit_gateway_route_table_result +AssociateTrialComponentRequest,associate_trial_component_request +AssociateTrialComponentResponse,associate_trial_component_response +AssociateTrunkInterfaceRequest,associate_trunk_interface_request +AssociateTrunkInterfaceResult,associate_trunk_interface_result +AssociateTrustStoreRequest,associate_trust_store_request +AssociateTrustStoreResponse,associate_trust_store_response +AssociateUserAccessLoggingSettingsRequest,associate_user_access_logging_settings_request +AssociateUserAccessLoggingSettingsResponse,associate_user_access_logging_settings_response +AssociateUserRequest,associate_user_request +AssociateUserResponse,associate_user_response +AssociateUserSettingsRequest,associate_user_settings_request +AssociateUserSettingsResponse,associate_user_settings_response +AssociateUserToPermissionGroupRequest,associate_user_to_permission_group_request +AssociateUserToPermissionGroupResponse,associate_user_to_permission_group_response +AssociateVPCWithHostedZoneRequest,associate_vpc_with_hosted_zone_request +AssociateVPCWithHostedZoneResponse,associate_vpc_with_hosted_zone_response +AssociateVehicleFleetRequest,associate_vehicle_fleet_request +AssociateVirtualInterfaceRequest,associate_virtual_interface_request +AssociateVpcCidrBlockRequest,associate_vpc_cidr_block_request +AssociateVpcCidrBlockResult,associate_vpc_cidr_block_result +AssociateWebACLRequest,associate_web_acl_request +AssociateWebsiteAuthorizationProviderRequest,associate_website_authorization_provider_request +AssociateWebsiteAuthorizationProviderResponse,associate_website_authorization_provider_response +AssociateWebsiteCertificateAuthorityRequest,associate_website_certificate_authority_request +AssociateWebsiteCertificateAuthorityResponse,associate_website_certificate_authority_response +AssociateWirelessDeviceWithFuotaTaskRequest,associate_wireless_device_with_fuota_task_request +AssociateWirelessDeviceWithMulticastGroupRequest,associate_wireless_device_with_multicast_group_request +AssociateWirelessDeviceWithThingRequest,associate_wireless_device_with_thing_request +AssociateWirelessGatewayWithCertificateRequest,associate_wireless_gateway_with_certificate_request +AssociateWirelessGatewayWithCertificateResponse,associate_wireless_gateway_with_certificate_response +AssociateWirelessGatewayWithThingRequest,associate_wireless_gateway_with_thing_request +AssociatedAccountId,associated_account_id +AssociatedApplication,associated_application +AssociatedAssetsSummary,associated_assets_summary +AssociatedAt,associated_at +AssociatedClientDevice,associated_client_device +AssociatedClusterCount,associated_cluster_count +AssociatedClusters,associated_clusters +AssociatedEndpointGroupFoundException,associated_endpoint_group_found_exception +AssociatedFace,associated_face +AssociatedFaces,associated_faces +AssociatedGateway,associated_gateway +AssociatedGlueResource,associated_glue_resource +AssociatedHost,associated_host +AssociatedInsightId,associated_insight_id +AssociatedListenerFoundException,associated_listener_found_exception +AssociatedPermission,associated_permission +AssociatedPricingPlanCount,associated_pricing_plan_count +AssociatedResource,associated_resource +AssociatedResourceArns,associated_resource_arns +AssociatedResources,associated_resources +AssociatedRole,associated_role +AssociatedRoleArn,associated_role_arn +AssociatedRoles,associated_roles +AssociatedRuleGroupArn,associated_rule_group_arn +AssociatedStandard,associated_standard +AssociatedStandards,associated_standards +AssociatedTargetNetwork,associated_target_network +AssociatedTargetNetworks,associated_target_networks +AssociatedTimestamp,associated_timestamp +AssociatedTranscript,associated_transcript +AssociatedTranscriptFilter,associated_transcript_filter +AssociatedValues,associated_values +Association,association +AssociationArn,association_arn +AssociationConfig,association_config +AssociationCount,association_count +AssociationDate,association_date +AssociationDefaultRouteTableId,association_default_route_table_id +AssociationDescription,association_description +AssociationDoesNotExist,association_does_not_exist +AssociationExecution,association_execution +AssociationExecutionDoesNotExist,association_execution_does_not_exist +AssociationExecutionFilter,association_execution_filter +AssociationExecutionTarget,association_execution_target +AssociationExecutionTargets,association_execution_targets +AssociationExecutionTargetsFilter,association_execution_targets_filter +AssociationExecutions,association_executions +AssociationFilter,association_filter +AssociationFilterList,association_filter_list +AssociationId,association_id +AssociationIds,association_ids +AssociationName,association_name +AssociationOverview,association_overview +AssociationSet,association_set +AssociationSetDetails,association_set_details +AssociationSize,association_size +AssociationState,association_state +AssociationStateDetails,association_state_details +AssociationStatus,association_status +AssociationStatusAggregatedCount,association_status_aggregated_count +AssociationSummaries,association_summaries +AssociationSummary,association_summary +AssociationTarget,association_target +AssociationTime,association_time +AssociationType,association_type +AssociationVersion,association_version +AssociationVersionInfo,association_version_info +AssociationVersionLimitExceeded,association_version_limit_exceeded +AssociationVersions,association_versions +Associations,associations +AssumeControl,assume_control +AssumeDecoratedRoleWithSAMLRequest,assume_decorated_role_with_saml_request +AssumeDecoratedRoleWithSAMLResponse,assume_decorated_role_with_saml_response +AssumeImpersonationRoleRequest,assume_impersonation_role_request +AssumeImpersonationRoleResponse,assume_impersonation_role_response +AssumeRolePolicyDocument,assume_role_policy_document +AssumeRoleRequest,assume_role_request +AssumeRoleResponse,assume_role_response +AssumeRoleWithSAMLRequest,assume_role_with_saml_request +AssumeRoleWithSAMLResponse,assume_role_with_saml_response +AssumeRoleWithWebIdentityRequest,assume_role_with_web_identity_request +AssumeRoleWithWebIdentityResponse,assume_role_with_web_identity_response +AssumedRole,assumed_role +AssumedRoleId,assumed_role_id +AssumedRoleUser,assumed_role_user +AsymmetricEncryptionAttributes,asymmetric_encryption_attributes +AsyncErrorDetails,async_error_details +AsyncInferenceClientConfig,async_inference_client_config +AsyncInferenceConfig,async_inference_config +AsyncInferenceNotificationConfig,async_inference_notification_config +AsyncInferenceOutputConfig,async_inference_output_config +AsyncOperation,async_operation +AsyncRequestParameters,async_request_parameters +AsyncResponseDetails,async_response_details +AtRestEncryptionEnabled,at_rest_encryption_enabled +AtTime,at_time +AthenaConnectorSource,athena_connector_source +AthenaDatasetDefinition,athena_dataset_definition +AthenaError,athena_error +AthenaErrorCode,athena_error_code +AthenaIntegration,athena_integration +AthenaIntegrations,athena_integrations +AthenaParameters,athena_parameters +AthenaSourceConfig,athena_source_config +AtigData,atig_data +Atime,atime +AttachCertificateToDistributionRequest,attach_certificate_to_distribution_request +AttachCertificateToDistributionResult,attach_certificate_to_distribution_result +AttachClassicLinkVpcRequest,attach_classic_link_vpc_request +AttachClassicLinkVpcResult,attach_classic_link_vpc_result +AttachCustomerManagedPolicyReferenceToPermissionSetRequest,attach_customer_managed_policy_reference_to_permission_set_request +AttachDiskRequest,attach_disk_request +AttachDiskResult,attach_disk_result +AttachElasticLoadBalancerRequest,attach_elastic_load_balancer_request +AttachGroupPolicyRequest,attach_group_policy_request +AttachInstancesQuery,attach_instances_query +AttachInstancesToLoadBalancerRequest,attach_instances_to_load_balancer_request +AttachInstancesToLoadBalancerResult,attach_instances_to_load_balancer_result +AttachInternetGatewayRequest,attach_internet_gateway_request +AttachLoadBalancerTargetGroupsType,attach_load_balancer_target_groups_type +AttachLoadBalancerTlsCertificateRequest,attach_load_balancer_tls_certificate_request +AttachLoadBalancerTlsCertificateResult,attach_load_balancer_tls_certificate_result +AttachLoadBalancerToSubnetsInput,attach_load_balancer_to_subnets_input +AttachLoadBalancerToSubnetsOutput,attach_load_balancer_to_subnets_output +AttachLoadBalancersType,attach_load_balancers_type +AttachManagedPolicyToPermissionSetRequest,attach_managed_policy_to_permission_set_request +AttachNetworkInterfaceRequest,attach_network_interface_request +AttachNetworkInterfaceResult,attach_network_interface_result +AttachObject,attach_object +AttachObjectRequest,attach_object_request +AttachObjectResponse,attach_object_response +AttachPolicy,attach_policy +AttachPolicyRequest,attach_policy_request +AttachPrincipalPolicyRequest,attach_principal_policy_request +AttachRolePolicyRequest,attach_role_policy_request +AttachSecurityProfileRequest,attach_security_profile_request +AttachStaticIpRequest,attach_static_ip_request +AttachStaticIpResult,attach_static_ip_result +AttachThingPrincipalRequest,attach_thing_principal_request +AttachTime,attach_time +AttachToIndex,attach_to_index +AttachToIndexRequest,attach_to_index_request +AttachToIndexResponse,attach_to_index_response +AttachTrafficSourcesType,attach_traffic_sources_type +AttachTypedLink,attach_typed_link +AttachTypedLinkRequest,attach_typed_link_request +AttachTypedLinkResponse,attach_typed_link_response +AttachUserPolicyRequest,attach_user_policy_request +AttachVerifiedAccessTrustProviderRequest,attach_verified_access_trust_provider_request +AttachVerifiedAccessTrustProviderResult,attach_verified_access_trust_provider_result +AttachVolumeInput,attach_volume_input +AttachVolumeOutput,attach_volume_output +AttachVolumeRequest,attach_volume_request +AttachVpnGatewayRequest,attach_vpn_gateway_request +AttachVpnGatewayResult,attach_vpn_gateway_result +AttachedChannels,attached_channels +AttachedDisk,attached_disk +AttachedENIId,attached_eni_id +AttachedManagedPolicies,attached_managed_policies +AttachedManagedPolicy,attached_managed_policy +AttachedObjectIdentifier,attached_object_identifier +AttachedPermissionsBoundary,attached_permissions_boundary +AttachedPolicies,attached_policies +AttachedPolicy,attached_policy +AttachedPolicyIds,attached_policy_ids +AttachedTo,attached_to +AttachedVolumes,attached_volumes +Attachment,attachment +AttachmentConfiguration,attachment_configuration +AttachmentContent,attachment_content +AttachmentCount,attachment_count +AttachmentDetails,attachment_details +AttachmentEnaSrdSpecification,attachment_ena_srd_specification +AttachmentEnaSrdUdpSpecification,attachment_ena_srd_udp_specification +AttachmentFieldMappings,attachment_field_mappings +AttachmentId,attachment_id +AttachmentIdNotFound,attachment_id_not_found +AttachmentIds,attachment_ids +AttachmentInformation,attachment_information +AttachmentItem,attachment_item +AttachmentLimitExceeded,attachment_limit_exceeded +AttachmentName,attachment_name +AttachmentPolicyRuleNumber,attachment_policy_rule_number +AttachmentReference,attachment_reference +AttachmentSetExpired,attachment_set_expired +AttachmentSetIdNotFound,attachment_set_id_not_found +AttachmentSetSizeLimitExceeded,attachment_set_size_limit_exceeded +AttachmentSizeInBytes,attachment_size_in_bytes +AttachmentStateChange,attachment_state_change +AttachmentStatuses,attachment_statuses +AttachmentType,attachment_type +Attachments,attachments +AttachmentsContent,attachments_content +AttachmentsInformation,attachments_information +AttachmentsSource,attachments_source +Attack,attack +AttackCount,attack_count +AttackCounters,attack_counters +AttackDetail,attack_detail +AttackId,attack_id +AttackLayer,attack_layer +AttackProperties,attack_properties +AttackProperty,attack_property +AttackPropertyIdentifier,attack_property_identifier +AttackStatisticsDataItem,attack_statistics_data_item +AttackSummaries,attack_summaries +AttackSummary,attack_summary +AttackVectorDescription,attack_vector_description +AttackVectors,attack_vectors +AttackVolume,attack_volume +AttackVolumeStatistics,attack_volume_statistics +Attempt,attempt +AttemptContainerDetail,attempt_container_detail +AttemptCount,attempt_count +AttemptDetail,attempt_detail +Attempts,attempts +Attendee,attendee +AttendeeCapabilities,attendee_capabilities +AttendeeId,attendee_id +AttendeeIdItem,attendee_id_item +AttendeeIds,attendee_ids +Attendees,attendees +AttenuationControl,attenuation_control +AttestationDocument,attestation_document +Attribute,attribute +AttributeAction,attribute_action +AttributeActionType,attribute_action_type +AttributeAggregationFunction,attribute_aggregation_function +AttributeBooleanValue,attribute_boolean_value +AttributeConfig,attribute_config +AttributeConfigs,attribute_configs +AttributeDataType,attribute_data_type +AttributeDefinition,attribute_definition +AttributeDefinitions,attribute_definitions +AttributeDetails,attribute_details +AttributeDimension,attribute_dimension +AttributeFilter,attribute_filter +AttributeGroup,attribute_group +AttributeGroupDetails,attribute_group_details +AttributeGroupSummary,attribute_group_summary +AttributeItem,attribute_item +AttributeKey,attribute_key +AttributeKeyAndValue,attribute_key_and_value +AttributeLimitExceededException,attribute_limit_exceeded_exception +AttributeMapping,attribute_mapping +AttributeMatchingModel,attribute_matching_model +AttributeName,attribute_name +AttributeNameAndValue,attribute_name_and_value +AttributeNames,attribute_names +AttributeOperation,attribute_operation +AttributePath,attribute_path +AttributePayload,attribute_payload +AttributeReference,attribute_reference +AttributeSuggestionsConfig,attribute_suggestions_config +AttributeSuggestionsDescribeConfig,attribute_suggestions_describe_config +AttributeSuggestionsGetConfig,attribute_suggestions_get_config +AttributeSuggestionsMode,attribute_suggestions_mode +AttributeSuggestionsUpdateConfig,attribute_suggestions_update_config +AttributeType,attribute_type +AttributeTypesSelector,attribute_types_selector +AttributeUpdateValue,attribute_update_value +AttributeUpdates,attribute_updates +AttributeValue,attribute_value +AttributeValueList,attribute_value_list +AttributeValueTarget,attribute_value_target +AttributeValueUpdate,attribute_value_update +AttributeValues,attribute_values +Attributes,attributes +AttributesData,attributes_data +AttributesRequireVerificationBeforeUpdate,attributes_require_verification_before_update +AttributesResource,attributes_resource +AttributesToDelete,attributes_to_delete +AttributesToGet,attributes_to_get +Audience,audience +Audio,audio +AudioAggregationEndedAt,audio_aggregation_ended_at +AudioAggregationStartedAt,audio_aggregation_started_at +AudioAndDTMFInputSpecification,audio_and_dtmf_input_specification +AudioArtifactsConfiguration,audio_artifacts_configuration +AudioBufferModel,audio_buffer_model +AudioChannelConfigSchemeIdUri,audio_channel_config_scheme_id_uri +AudioChannelMapping,audio_channel_mapping +AudioChannelTaggingSettings,audio_channel_tagging_settings +AudioChannels,audio_channels +AudioChunk,audio_chunk +AudioCodecOptions,audio_codec_options +AudioCodecSettings,audio_codec_settings +AudioConcatenationConfiguration,audio_concatenation_configuration +AudioConfiguration,audio_configuration +AudioDeduplication,audio_deduplication +AudioDescription,audio_description +AudioDescriptionBroadcasterMix,audio_description_broadcaster_mix +AudioDescriptionNames,audio_description_names +AudioDescriptions,audio_descriptions +AudioDolbyEDecode,audio_dolby_e_decode +AudioDuration,audio_duration +AudioDurationCorrection,audio_duration_correction +AudioEvent,audio_event +AudioFallbackUrl,audio_fallback_url +AudioFeatures,audio_features +AudioFramesPerPes,audio_frames_per_pes +AudioGroupId,audio_group_id +AudioHlsRenditionSelection,audio_hls_rendition_selection +AudioHostUrl,audio_host_url +AudioInputEvent,audio_input_event +AudioLanguageSelection,audio_language_selection +AudioList,audio_list +AudioLogDestination,audio_log_destination +AudioLogSetting,audio_log_setting +AudioMetadata,audio_metadata +AudioNormalizationSettings,audio_normalization_settings +AudioOnlyContainer,audio_only_container +AudioOnlyHeader,audio_only_header +AudioOnlyHlsSettings,audio_only_hls_settings +AudioOnlyImage,audio_only_image +AudioOnlyTimecodeControl,audio_only_timecode_control +AudioPackingMode,audio_packing_mode +AudioParameters,audio_parameters +AudioPidSelection,audio_pid_selection +AudioPids,audio_pids +AudioRenditionSets,audio_rendition_sets +AudioResponseEvent,audio_response_event +AudioSampleRate,audio_sample_rate +AudioSelector,audio_selector +AudioSelectorGroup,audio_selector_group +AudioSelectorGroups,audio_selector_groups +AudioSelectorName,audio_selector_name +AudioSelectorNames,audio_selector_names +AudioSelectorSettings,audio_selector_settings +AudioSelectors,audio_selectors +AudioSilenceFailoverSettings,audio_silence_failover_settings +AudioSilenceSettings,audio_silence_settings +AudioSilenceThresholdMsec,audio_silence_threshold_msec +AudioSourceName,audio_source_name +AudioSpecification,audio_specification +AudioStream,audio_stream +AudioStreamType,audio_stream_type +AudioTrack,audio_track +AudioTrackSelection,audio_track_selection +AudioTrackType,audio_track_type +AudioType,audio_type +AudioTypeControl,audio_type_control +AudioWatermarkSettings,audio_watermark_settings +AudioWatermarkingSettings,audio_watermarking_settings +Audit,audit +AuditCheckConfiguration,audit_check_configuration +AuditCheckDetails,audit_check_details +AuditContext,audit_context +AuditDestinationARN,audit_destination_arn +AuditEvent,audit_event +AuditEventResultEntry,audit_event_result_entry +AuditFinding,audit_finding +AuditImage,audit_image +AuditImages,audit_images +AuditImagesLimit,audit_images_limit +AuditLogConfiguration,audit_log_configuration +AuditLogDestination,audit_log_destination +AuditLogDestinationConfiguration,audit_log_destination_configuration +AuditLogGroup,audit_log_group +AuditLogProcessingConfiguration,audit_log_processing_configuration +AuditLogVolume,audit_log_volume +AuditLogs,audit_logs +AuditMitigationActionExecutionMetadata,audit_mitigation_action_execution_metadata +AuditMitigationActionsTaskMetadata,audit_mitigation_actions_task_metadata +AuditMitigationActionsTaskTarget,audit_mitigation_actions_task_target +AuditNotificationTarget,audit_notification_target +AuditPolicyState,audit_policy_state +AuditReportId,audit_report_id +AuditReportResponseFormat,audit_report_response_format +AuditReportStatus,audit_report_status +AuditStreamArn,audit_stream_arn +AuditSuppression,audit_suppression +AuditTaskMetadata,audit_task_metadata +AugmentedManifests,augmented_manifests +AugmentedManifestsListItem,augmented_manifests_list_item +AuroraParameters,aurora_parameters +AuroraPostgreSqlParameters,aurora_postgre_sql_parameters +Auth,auth +AuthCode,auth_code +AuthEventType,auth_event_type +AuthEvents,auth_events +AuthException,auth_exception +AuthFlow,auth_flow +AuthInfo,auth_info +AuthMechanism,auth_mechanism +AuthMethod,auth_method +AuthMode,auth_mode +AuthParameter,auth_parameter +AuthParameters,auth_parameters +AuthPassword,auth_password +AuthRequest,auth_request +AuthRequestCryptogram,auth_request_cryptogram +AuthResources,auth_resources +AuthResponseAttributes,auth_response_attributes +AuthResponseCode,auth_response_code +AuthResponseValue,auth_response_value +AuthResult,auth_result +AuthScheme,auth_scheme +AuthSecretArn,auth_secret_arn +AuthSessionValidity,auth_session_validity +AuthSource,auth_source +AuthStrategy,auth_strategy +AuthToken,auth_token +AuthTokenEnabled,auth_token_enabled +AuthTokenExpirationTime,auth_token_expiration_time +AuthTokenLastModifiedDate,auth_token_last_modified_date +AuthTokenStatus,auth_token_status +AuthTokenUpdateStrategy,auth_token_update_strategy +AuthTtL,auth_ttl +AuthType,auth_type +AuthUserName,auth_user_name +AuthenticateCognitoActionConfig,authenticate_cognito_action_config +AuthenticateCognitoConfig,authenticate_cognito_config +AuthenticateOidcActionConfig,authenticate_oidc_action_config +AuthenticateOidcConfig,authenticate_oidc_config +AuthenticateOnUnsubscribe,authenticate_on_unsubscribe +Authenticated,authenticated +Authentication,authentication +AuthenticationCode1,authentication_code1 +AuthenticationCode2,authentication_code2 +AuthenticationConfig,authentication_config +AuthenticationConfiguration,authentication_configuration +AuthenticationDescription,authentication_description +AuthenticationFailedException,authentication_failed_exception +AuthenticationMethod,authentication_method +AuthenticationMode,authentication_mode +AuthenticationOptions,authentication_options +AuthenticationProfile,authentication_profile +AuthenticationProfileAlreadyExistsFault,authentication_profile_already_exists_fault +AuthenticationProfileContent,authentication_profile_content +AuthenticationProfileName,authentication_profile_name +AuthenticationProfileNotFoundFault,authentication_profile_not_found_fault +AuthenticationProfileQuotaExceededFault,authentication_profile_quota_exceeded_fault +AuthenticationProfiles,authentication_profiles +AuthenticationProtocol,authentication_protocol +AuthenticationRequestExtraParams,authentication_request_extra_params +AuthenticationResult,authentication_result +AuthenticationResultId,authentication_result_id +AuthenticationResultType,authentication_result_type +AuthenticationScheme,authentication_scheme +AuthenticationStrategy,authentication_strategy +AuthenticationSummary,authentication_summary +AuthenticationToken,authentication_token +AuthenticationType,authentication_type +Author,author +AuthorDoesNotExistException,author_does_not_exist_exception +AuthorGroup,author_group +Authorization,authorization +AuthorizationAlreadyExistsFault,authorization_already_exists_fault +AuthorizationConfig,authorization_config +AuthorizationData,authorization_data +AuthorizationEndpoint,authorization_endpoint +AuthorizationErrorException,authorization_error_exception +AuthorizationException,authorization_exception +AuthorizationNotFoundFault,authorization_not_found_fault +AuthorizationPendingException,authorization_pending_exception +AuthorizationProviderId,authorization_provider_id +AuthorizationProviderType,authorization_provider_type +AuthorizationQuotaExceededFault,authorization_quota_exceeded_fault +AuthorizationResult,authorization_result +AuthorizationRule,authorization_rule +AuthorizationRules,authorization_rules +AuthorizationScopes,authorization_scopes +AuthorizationStrategy,authorization_strategy +AuthorizationType,authorization_type +AuthorizeAllGroups,authorize_all_groups +AuthorizeCacheSecurityGroupIngressMessage,authorize_cache_security_group_ingress_message +AuthorizeCacheSecurityGroupIngressResult,authorize_cache_security_group_ingress_result +AuthorizeClientVpnIngressRequest,authorize_client_vpn_ingress_request +AuthorizeClientVpnIngressResult,authorize_client_vpn_ingress_result +AuthorizeClusterSecurityGroupIngressMessage,authorize_cluster_security_group_ingress_message +AuthorizeClusterSecurityGroupIngressResult,authorize_cluster_security_group_ingress_result +AuthorizeDBSecurityGroupIngressMessage,authorize_db_security_group_ingress_message +AuthorizeDBSecurityGroupIngressResult,authorize_db_security_group_ingress_result +AuthorizeDataShareMessage,authorize_data_share_message +AuthorizeEndpointAccessMessage,authorize_endpoint_access_message +AuthorizeIpRulesRequest,authorize_ip_rules_request +AuthorizeSecurityGroupEgressRequest,authorize_security_group_egress_request +AuthorizeSecurityGroupEgressResult,authorize_security_group_egress_result +AuthorizeSecurityGroupIngressRequest,authorize_security_group_ingress_request +AuthorizeSecurityGroupIngressResult,authorize_security_group_ingress_result +AuthorizeSnapshotAccessMessage,authorize_snapshot_access_message +AuthorizeSnapshotAccessResult,authorize_snapshot_access_result +AuthorizeTime,authorize_time +AuthorizeVpcEndpointAccessRequest,authorize_vpc_endpoint_access_request +AuthorizeVpcEndpointAccessResponse,authorize_vpc_endpoint_access_response +AuthorizedAccountId,authorized_account_id +AuthorizedAwsRegion,authorized_aws_region +AuthorizedColumns,authorized_columns +AuthorizedPrincipal,authorized_principal +AuthorizedPrincipalList,authorized_principal_list +AuthorizedResourceArns,authorized_resource_arns +AuthorizedSessionTagValueList,authorized_session_tag_value_list +AuthorizedUrl,authorized_url +Authorizer,authorizer +AuthorizerConfig,authorizer_config +AuthorizerCredentialsArn,authorizer_credentials_arn +AuthorizerDescription,authorizer_description +AuthorizerId,authorizer_id +AuthorizerPayloadFormatVersion,authorizer_payload_format_version +AuthorizerResultTtlInSeconds,authorizer_result_ttl_in_seconds +AuthorizerSummary,authorizer_summary +AuthorizerType,authorizer_type +AuthorizerUri,authorizer_uri +Authorizers,authorizers +AutoAccept,auto_accept +AutoAcceptRequests,auto_accept_requests +AutoAcceptSharedAssociations,auto_accept_shared_associations +AutoAcceptSharedAttachments,auto_accept_shared_attachments +AutoAddGroupOwner,auto_add_group_owner +AutoAdjustData,auto_adjust_data +AutoAdjustType,auto_adjust_type +AutoAppliedAfterDate,auto_applied_after_date +AutoApprovalDelayInSeconds,auto_approval_delay_in_seconds +AutoApprovalTime,auto_approval_time +AutoApprove,auto_approve +AutoAssignElasticIps,auto_assign_elastic_ips +AutoAssignPublicIps,auto_assign_public_ips +AutoAssociate,auto_associate +AutoBranchCreationConfig,auto_branch_creation_config +AutoConfigEnabled,auto_config_enabled +AutoCreate,auto_create +AutoCreateApplication,auto_create_application +AutoCreateTasks,auto_create_tasks +AutoDeclineConflictingRequests,auto_decline_conflicting_requests +AutoDeclineRecurringRequests,auto_decline_recurring_requests +AutoDeploy,auto_deploy +AutoDeployed,auto_deployed +AutoDeployment,auto_deployment +AutoDeploymentsEnabled,auto_deployments_enabled +AutoDetectionMetricSource,auto_detection_metric_source +AutoDetectionS3SourceConfig,auto_detection_s3_source_config +AutoEnable,auto_enable +AutoEnableControls,auto_enable_controls +AutoEnableIO,auto_enable_io +AutoEnableOrganizationMembers,auto_enable_organization_members +AutoEnableStandards,auto_enable_standards +AutoEnroll,auto_enroll +AutoEnrollment,auto_enrollment +AutoExportPolicy,auto_export_policy +AutoExportRevisionDestinationEntry,auto_export_revision_destination_entry +AutoExportRevisionToS3RequestDetails,auto_export_revision_to_s3_request_details +AutoGenerateEndpointName,auto_generate_endpoint_name +AutoGranted,auto_granted +AutoGrantedValue,auto_granted_value +AutoImport,auto_import +AutoImportPolicy,auto_import_policy +AutoMLAlgorithmArns,auto_ml_algorithm_arns +AutoMLAlgorithmConfig,auto_ml_algorithm_config +AutoMLAlgorithms,auto_ml_algorithms +AutoMLCandidate,auto_ml_candidate +AutoMLCandidateGenerationConfig,auto_ml_candidate_generation_config +AutoMLCandidateStep,auto_ml_candidate_step +AutoMLChannel,auto_ml_channel +AutoMLConfig,auto_ml_config +AutoMLContainerDefinition,auto_ml_container_definition +AutoMLDataSource,auto_ml_data_source +AutoMLDataSplitConfig,auto_ml_data_split_config +AutoMLJob,auto_ml_job +AutoMLJobArn,auto_ml_job_arn +AutoMLJobArtifacts,auto_ml_job_artifacts +AutoMLJobChannel,auto_ml_job_channel +AutoMLJobCompletionCriteria,auto_ml_job_completion_criteria +AutoMLJobConfig,auto_ml_job_config +AutoMLJobInputDataConfig,auto_ml_job_input_data_config +AutoMLJobName,auto_ml_job_name +AutoMLJobObjective,auto_ml_job_objective +AutoMLJobSecondaryStatus,auto_ml_job_secondary_status +AutoMLJobStatus,auto_ml_job_status +AutoMLJobStepMetadata,auto_ml_job_step_metadata +AutoMLJobSummaries,auto_ml_job_summaries +AutoMLJobSummary,auto_ml_job_summary +AutoMLOutputDataConfig,auto_ml_output_data_config +AutoMLOverrideStrategy,auto_ml_override_strategy +AutoMLPartialFailureReason,auto_ml_partial_failure_reason +AutoMLProblemTypeConfig,auto_ml_problem_type_config +AutoMLProblemTypeConfigName,auto_ml_problem_type_config_name +AutoMLProblemTypeResolvedAttributes,auto_ml_problem_type_resolved_attributes +AutoMLResolvedAttributes,auto_ml_resolved_attributes +AutoMLResult,auto_ml_result +AutoMLS3DataSource,auto_mls3_data_source +AutoMLSecurityConfig,auto_ml_security_config +AutoMerging,auto_merging +AutoMinorVersionUpgrade,auto_minor_version_upgrade +AutoParameter,auto_parameter +AutoParameters,auto_parameters +AutoPause,auto_pause +AutoPlacement,auto_placement +AutoPromotionResult,auto_promotion_result +AutoPromotionResultReason,auto_promotion_result_reason +AutoPushdown,auto_pushdown +AutoRecovery,auto_recovery +AutoRecoverySupported,auto_recovery_supported +AutoRenew,auto_renew +AutoRollback,auto_rollback +AutoRollbackConfig,auto_rollback_config +AutoRollbackConfiguration,auto_rollback_configuration +AutoScaling,auto_scaling +AutoScalingConfiguration,auto_scaling_configuration +AutoScalingConfigurationArn,auto_scaling_configuration_arn +AutoScalingConfigurationName,auto_scaling_configuration_name +AutoScalingConfigurationRevision,auto_scaling_configuration_revision +AutoScalingConfigurationSummary,auto_scaling_configuration_summary +AutoScalingConfigurationSummaryList,auto_scaling_configuration_summary_list +AutoScalingDescription,auto_scaling_description +AutoScalingDisabled,auto_scaling_disabled +AutoScalingEnabled,auto_scaling_enabled +AutoScalingEnabledUpdate,auto_scaling_enabled_update +AutoScalingGroup,auto_scaling_group +AutoScalingGroupARN,auto_scaling_group_arn +AutoScalingGroupArn,auto_scaling_group_arn +AutoScalingGroupConfiguration,auto_scaling_group_configuration +AutoScalingGroupName,auto_scaling_group_name +AutoScalingGroupNames,auto_scaling_group_names +AutoScalingGroupNamesType,auto_scaling_group_names_type +AutoScalingGroupProvider,auto_scaling_group_provider +AutoScalingGroupProviderUpdate,auto_scaling_group_provider_update +AutoScalingGroupRecommendation,auto_scaling_group_recommendation +AutoScalingGroupRecommendationOption,auto_scaling_group_recommendation_option +AutoScalingGroupState,auto_scaling_group_state +AutoScalingGroups,auto_scaling_groups +AutoScalingGroupsType,auto_scaling_groups_type +AutoScalingInstanceDetails,auto_scaling_instance_details +AutoScalingInstances,auto_scaling_instances +AutoScalingInstancesType,auto_scaling_instances_type +AutoScalingNotificationTypes,auto_scaling_notification_types +AutoScalingPolicy,auto_scaling_policy +AutoScalingPolicyDescription,auto_scaling_policy_description +AutoScalingPolicyStateChangeReason,auto_scaling_policy_state_change_reason +AutoScalingPolicyStatus,auto_scaling_policy_status +AutoScalingPolicyUpdate,auto_scaling_policy_update +AutoScalingRole,auto_scaling_role +AutoScalingRoleArn,auto_scaling_role_arn +AutoScalingSchedule,auto_scaling_schedule +AutoScalingSettingsDescription,auto_scaling_settings_description +AutoScalingSettingsUpdate,auto_scaling_settings_update +AutoScalingTargetTrackingScalingPolicyConfigurationDescription,auto_scaling_target_tracking_scaling_policy_configuration_description +AutoScalingTargetTrackingScalingPolicyConfigurationUpdate,auto_scaling_target_tracking_scaling_policy_configuration_update +AutoScalingThresholds,auto_scaling_thresholds +AutoScalingType,auto_scaling_type +AutoScalingUpdate,auto_scaling_update +AutoSnapshotAddOnRequest,auto_snapshot_add_on_request +AutoSnapshotDetails,auto_snapshot_details +AutoSoftwareUpdateEnabled,auto_software_update_enabled +AutoStartConfig,auto_start_config +AutoStopConfig,auto_stop_config +AutoTerminate,auto_terminate +AutoTerminationPolicy,auto_termination_policy +AutoTune,auto_tune +AutoTuneDetails,auto_tune_details +AutoTuneMaintenanceSchedule,auto_tune_maintenance_schedule +AutoTuneOptions,auto_tune_options +AutoTuneOptionsInput,auto_tune_options_input +AutoTuneOptionsOutput,auto_tune_options_output +AutoTuneOptionsStatus,auto_tune_options_status +AutoTuneStatus,auto_tune_status +AutoTuneType,auto_tune_type +AutoTunes,auto_tunes +AutoUpdate,auto_update +AutoUpdateAfterRecommendedApplyByDate,auto_update_after_recommended_apply_by_date +AutoUpdateStartDate,auto_update_start_date +AutoUpgrade,auto_upgrade +AutoUpgradeDate,auto_upgrade_date +AutoVerifiedAttributes,auto_verified_attributes +AutoWarmupEnabled,auto_warmup_enabled +AutocommitPeriod,autocommit_period +AutodefinedReverse,autodefined_reverse +AutodefinedReverseFlag,autodefined_reverse_flag +AutomatedAbrRule,automated_abr_rule +AutomatedAbrSettings,automated_abr_settings +AutomatedDiscoveryInformation,automated_discovery_information +AutomatedEncodingSettings,automated_encoding_settings +AutomatedSnapshotRetentionPeriod,automated_snapshot_retention_period +AutomatedSnapshotStartHour,automated_snapshot_start_hour +AutomatedUpdateDate,automated_update_date +Automatic,automatic +AutomaticBackupRetentionDays,automatic_backup_retention_days +AutomaticFail,automatic_fail +AutomaticFailover,automatic_failover +AutomaticFailoverEnabled,automatic_failover_enabled +AutomaticFailoverStatus,automatic_failover_status +AutomaticInputFailoverSettings,automatic_input_failover_settings +AutomaticRenewal,automatic_renewal +AutomaticRestartTime,automatic_restart_time +AutomaticTapeCreationPolicyInfo,automatic_tape_creation_policy_info +AutomaticTapeCreationPolicyInfos,automatic_tape_creation_policy_infos +AutomaticTapeCreationRule,automatic_tape_creation_rule +AutomaticTapeCreationRules,automatic_tape_creation_rules +AutomaticallyAfterDays,automatically_after_days +Automation,automation +AutomationDefinitionNotApprovedException,automation_definition_not_approved_exception +AutomationDefinitionNotFoundException,automation_definition_not_found_exception +AutomationDefinitionVersionNotFoundException,automation_definition_version_not_found_exception +AutomationExecution,automation_execution +AutomationExecutionException,automation_execution_exception +AutomationExecutionFilter,automation_execution_filter +AutomationExecutionId,automation_execution_id +AutomationExecutionLimitExceededException,automation_execution_limit_exceeded_exception +AutomationExecutionMetadata,automation_execution_metadata +AutomationExecutionMetadataList,automation_execution_metadata_list +AutomationExecutionNotFoundException,automation_execution_not_found_exception +AutomationExecutionStatus,automation_execution_status +AutomationExecutionTimeoutException,automation_execution_timeout_exception +AutomationMode,automation_mode +AutomationRulesAction,automation_rules_action +AutomationRulesArns,automation_rules_arns +AutomationRulesConfig,automation_rules_config +AutomationRulesFindingFieldsUpdate,automation_rules_finding_fields_update +AutomationRulesFindingFilters,automation_rules_finding_filters +AutomationRulesMetadata,automation_rules_metadata +AutomationStepNotFoundException,automation_step_not_found_exception +AutomationSubtype,automation_subtype +AutomationTargetParameterName,automation_target_parameter_name +AutomationType,automation_type +Autoprovision,autoprovision +Autotune,autotune +AuxiliaryDataLocation,auxiliary_data_location +Av1QvbrSettings,av1_qvbr_settings +Av1Settings,av1_settings +AvailBlanking,avail_blanking +AvailBlankingImage,avail_blanking_image +AvailConfiguration,avail_configuration +AvailMatchingCriteria,avail_matching_criteria +AvailNum,avail_num +AvailSettings,avail_settings +AvailSuppression,avail_suppression +Availability,availability +AvailabilityConfiguration,availability_configuration +AvailabilityConfigurations,availability_configurations +AvailabilityLocalHealthEventsConfig,availability_local_health_events_config +AvailabilityMeasurement,availability_measurement +AvailabilityMode,availability_mode +AvailabilityOptions,availability_options +AvailabilityOptionsStatus,availability_options_status +AvailabilityScoreThreshold,availability_score_threshold +AvailabilityStatus,availability_status +AvailabilityZone,availability_zone +AvailabilityZoneCount,availability_zone_count +AvailabilityZoneDetail,availability_zone_detail +AvailabilityZoneFilter,availability_zone_filter +AvailabilityZoneGroup,availability_zone_group +AvailabilityZoneId,availability_zone_id +AvailabilityZoneIdFilter,availability_zone_id_filter +AvailabilityZoneInfo,availability_zone_info +AvailabilityZoneInformation,availability_zone_information +AvailabilityZoneMessage,availability_zone_message +AvailabilityZoneName,availability_zone_name +AvailabilityZoneNotSupportedException,availability_zone_not_supported_exception +AvailabilityZoneRelocation,availability_zone_relocation +AvailabilityZoneRelocationStatus,availability_zone_relocation_status +AvailabilityZones,availability_zones +AvailabilityZonesMismatch,availability_zones_mismatch +Available,available +AvailableAddressCount,available_address_count +AvailableBalance,available_balance +AvailableCIDRCount,available_cidr_count +AvailableCapacity,available_capacity +AvailableDataNodeCount,available_data_node_count +AvailableInstanceCapacity,available_instance_capacity +AvailableInstanceCount,available_instance_count +AvailableIpAddressCount,available_ip_address_count +AvailableLabels,available_labels +AvailableNumberSummary,available_number_summary +AvailableNumbersList,available_numbers_list +AvailableOSReleases,available_os_releases +AvailablePackageVersion,available_package_version +AvailablePolicyTypes,available_policy_types +AvailableProcessorFeature,available_processor_feature +AvailableProcessorFeatures,available_processor_features +AvailableProvisionedConcurrentExecutions,available_provisioned_concurrent_executions +AvailableSlotsByChannel,available_slots_by_channel +AvailableUpgrades,available_upgrades +AvailableVCpus,available_v_cpus +AvailsExpected,avails_expected +AvcIntraClass,avc_intra_class +AvcIntraSettings,avc_intra_settings +AvcIntraUhdSettings,avc_intra_uhd_settings +Average,average +AverageAccuracy,average_accuracy +AverageDownloadRateLimitInBitsPerSec,average_download_rate_limit_in_bits_per_sec +AverageExecutionTimeMillis,average_execution_time_millis +AverageF1Score,average_f1_score +AverageLength,average_length +AverageNormalizedUnitsUsedPerHour,average_normalized_units_used_per_hour +AverageNumberOfInstancesUsedPerHour,average_number_of_instances_used_per_hour +AveragePrecision,average_precision +AverageRecall,average_recall +AverageUploadRateLimitInBitsPerSec,average_upload_rate_limit_in_bits_per_sec +AverageUtilization,average_utilization +AverageWeightedQuantileLoss,average_weighted_quantile_loss +Avg,avg +AvgResizeRateInMegaBytesPerSecond,avg_resize_rate_in_mega_bytes_per_second +AvoidEmptyBatches,avoid_empty_batches +AvoidFerries,avoid_ferries +AvoidTolls,avoid_tolls +AwaitAnswerMachinePrompt,await_answer_machine_prompt +AwsAccount,aws_account +AwsAccountId,aws_account_id +AwsAccountNumber,aws_account_number +AwsAmazonMqBroker,aws_amazon_mq_broker +AwsAmazonMqBrokerDetails,aws_amazon_mq_broker_details +AwsAmazonMqBrokerEncryptionOptionsDetails,aws_amazon_mq_broker_encryption_options_details +AwsAmazonMqBrokerLdapServerMetadataDetails,aws_amazon_mq_broker_ldap_server_metadata_details +AwsAmazonMqBrokerLogsDetails,aws_amazon_mq_broker_logs_details +AwsAmazonMqBrokerLogsPendingDetails,aws_amazon_mq_broker_logs_pending_details +AwsAmazonMqBrokerMaintenanceWindowStartTimeDetails,aws_amazon_mq_broker_maintenance_window_start_time_details +AwsAmazonMqBrokerUsersDetails,aws_amazon_mq_broker_users_details +AwsApiCallAction,aws_api_call_action +AwsApiCallActionDomainDetails,aws_api_call_action_domain_details +AwsApiGatewayAccessLogSettings,aws_api_gateway_access_log_settings +AwsApiGatewayCanarySettings,aws_api_gateway_canary_settings +AwsApiGatewayEndpointConfiguration,aws_api_gateway_endpoint_configuration +AwsApiGatewayMethodSettings,aws_api_gateway_method_settings +AwsApiGatewayRestApi,aws_api_gateway_rest_api +AwsApiGatewayRestApiDetails,aws_api_gateway_rest_api_details +AwsApiGatewayStage,aws_api_gateway_stage +AwsApiGatewayStageDetails,aws_api_gateway_stage_details +AwsApiGatewayV2Api,aws_api_gateway_v2_api +AwsApiGatewayV2ApiDetails,aws_api_gateway_v2_api_details +AwsApiGatewayV2RouteSettings,aws_api_gateway_v2_route_settings +AwsApiGatewayV2Stage,aws_api_gateway_v2_stage +AwsApiGatewayV2StageDetails,aws_api_gateway_v2_stage_details +AwsAppSyncGraphQlApi,aws_app_sync_graph_ql_api +AwsAppSyncGraphQlApiAdditionalAuthenticationProvidersDetails,aws_app_sync_graph_ql_api_additional_authentication_providers_details +AwsAppSyncGraphQlApiDetails,aws_app_sync_graph_ql_api_details +AwsAppSyncGraphQlApiLambdaAuthorizerConfigDetails,aws_app_sync_graph_ql_api_lambda_authorizer_config_details +AwsAppSyncGraphQlApiLogConfigDetails,aws_app_sync_graph_ql_api_log_config_details +AwsAppSyncGraphQlApiOpenIdConnectConfigDetails,aws_app_sync_graph_ql_api_open_id_connect_config_details +AwsAppSyncGraphQlApiUserPoolConfigDetails,aws_app_sync_graph_ql_api_user_pool_config_details +AwsAthenaWorkGroup,aws_athena_work_group +AwsAthenaWorkGroupConfigurationDetails,aws_athena_work_group_configuration_details +AwsAthenaWorkGroupConfigurationResultConfigurationDetails,aws_athena_work_group_configuration_result_configuration_details +AwsAthenaWorkGroupConfigurationResultConfigurationEncryptionConfigurationDetails,aws_athena_work_group_configuration_result_configuration_encryption_configuration_details +AwsAthenaWorkGroupDetails,aws_athena_work_group_details +AwsAutoScalingAutoScalingGroup,aws_auto_scaling_auto_scaling_group +AwsAutoScalingAutoScalingGroupAvailabilityZonesListDetails,aws_auto_scaling_auto_scaling_group_availability_zones_list_details +AwsAutoScalingAutoScalingGroupDetails,aws_auto_scaling_auto_scaling_group_details +AwsAutoScalingAutoScalingGroupLaunchTemplateLaunchTemplateSpecification,aws_auto_scaling_auto_scaling_group_launch_template_launch_template_specification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_details +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyInstancesDistributionDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_instances_distribution_details +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_details +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateLaunchTemplateSpecification,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_launch_template_specification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateOverridesListDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_overrides_list_details +AwsAutoScalingLaunchConfiguration,aws_auto_scaling_launch_configuration +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsDetails,aws_auto_scaling_launch_configuration_block_device_mappings_details +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsEbsDetails,aws_auto_scaling_launch_configuration_block_device_mappings_ebs_details +AwsAutoScalingLaunchConfigurationDetails,aws_auto_scaling_launch_configuration_details +AwsAutoScalingLaunchConfigurationInstanceMonitoringDetails,aws_auto_scaling_launch_configuration_instance_monitoring_details +AwsAutoScalingLaunchConfigurationMetadataOptions,aws_auto_scaling_launch_configuration_metadata_options +AwsBackupBackupPlan,aws_backup_backup_plan +AwsBackupBackupPlanAdvancedBackupSettingsDetails,aws_backup_backup_plan_advanced_backup_settings_details +AwsBackupBackupPlanBackupPlanDetails,aws_backup_backup_plan_backup_plan_details +AwsBackupBackupPlanDetails,aws_backup_backup_plan_details +AwsBackupBackupPlanLifecycleDetails,aws_backup_backup_plan_lifecycle_details +AwsBackupBackupPlanRuleCopyActionsDetails,aws_backup_backup_plan_rule_copy_actions_details +AwsBackupBackupPlanRuleDetails,aws_backup_backup_plan_rule_details +AwsBackupBackupVault,aws_backup_backup_vault +AwsBackupBackupVaultDetails,aws_backup_backup_vault_details +AwsBackupBackupVaultNotificationsDetails,aws_backup_backup_vault_notifications_details +AwsBackupRecoveryPoint,aws_backup_recovery_point +AwsBackupRecoveryPointArn,aws_backup_recovery_point_arn +AwsBackupRecoveryPointCalculatedLifecycleDetails,aws_backup_recovery_point_calculated_lifecycle_details +AwsBackupRecoveryPointCreatedByDetails,aws_backup_recovery_point_created_by_details +AwsBackupRecoveryPointDetails,aws_backup_recovery_point_details +AwsBackupRecoveryPointLifecycleDetails,aws_backup_recovery_point_lifecycle_details +AwsCertificateManagerCertificate,aws_certificate_manager_certificate +AwsCertificateManagerCertificateDetails,aws_certificate_manager_certificate_details +AwsCertificateManagerCertificateDomainValidationOption,aws_certificate_manager_certificate_domain_validation_option +AwsCertificateManagerCertificateExtendedKeyUsage,aws_certificate_manager_certificate_extended_key_usage +AwsCertificateManagerCertificateKeyUsage,aws_certificate_manager_certificate_key_usage +AwsCertificateManagerCertificateOptions,aws_certificate_manager_certificate_options +AwsCertificateManagerCertificateRenewalSummary,aws_certificate_manager_certificate_renewal_summary +AwsCertificateManagerCertificateResourceRecord,aws_certificate_manager_certificate_resource_record +AwsCloudFormationStack,aws_cloud_formation_stack +AwsCloudFormationStackDetails,aws_cloud_formation_stack_details +AwsCloudFormationStackDriftInformationDetails,aws_cloud_formation_stack_drift_information_details +AwsCloudFormationStackOutputsDetails,aws_cloud_formation_stack_outputs_details +AwsCloudFrontDistribution,aws_cloud_front_distribution +AwsCloudFrontDistributionCacheBehavior,aws_cloud_front_distribution_cache_behavior +AwsCloudFrontDistributionCacheBehaviors,aws_cloud_front_distribution_cache_behaviors +AwsCloudFrontDistributionDefaultCacheBehavior,aws_cloud_front_distribution_default_cache_behavior +AwsCloudFrontDistributionDetails,aws_cloud_front_distribution_details +AwsCloudFrontDistributionLogging,aws_cloud_front_distribution_logging +AwsCloudFrontDistributionOriginCustomOriginConfig,aws_cloud_front_distribution_origin_custom_origin_config +AwsCloudFrontDistributionOriginGroup,aws_cloud_front_distribution_origin_group +AwsCloudFrontDistributionOriginGroupFailover,aws_cloud_front_distribution_origin_group_failover +AwsCloudFrontDistributionOriginGroupFailoverStatusCodes,aws_cloud_front_distribution_origin_group_failover_status_codes +AwsCloudFrontDistributionOriginGroups,aws_cloud_front_distribution_origin_groups +AwsCloudFrontDistributionOriginItem,aws_cloud_front_distribution_origin_item +AwsCloudFrontDistributionOriginS3OriginConfig,aws_cloud_front_distribution_origin_s3_origin_config +AwsCloudFrontDistributionOriginSslProtocols,aws_cloud_front_distribution_origin_ssl_protocols +AwsCloudFrontDistributionOrigins,aws_cloud_front_distribution_origins +AwsCloudFrontDistributionViewerCertificate,aws_cloud_front_distribution_viewer_certificate +AwsCloudMapInstanceAttribute,aws_cloud_map_instance_attribute +AwsCloudMapServiceDiscovery,aws_cloud_map_service_discovery +AwsCloudTrailTrail,aws_cloud_trail_trail +AwsCloudTrailTrailDetails,aws_cloud_trail_trail_details +AwsCloudWatchAlarm,aws_cloud_watch_alarm +AwsCloudWatchAlarmDetails,aws_cloud_watch_alarm_details +AwsCloudWatchAlarmDimensionsDetails,aws_cloud_watch_alarm_dimensions_details +AwsCodeBuildProject,aws_code_build_project +AwsCodeBuildProjectArtifactsDetails,aws_code_build_project_artifacts_details +AwsCodeBuildProjectDetails,aws_code_build_project_details +AwsCodeBuildProjectEnvironment,aws_code_build_project_environment +AwsCodeBuildProjectEnvironmentEnvironmentVariablesDetails,aws_code_build_project_environment_environment_variables_details +AwsCodeBuildProjectEnvironmentRegistryCredential,aws_code_build_project_environment_registry_credential +AwsCodeBuildProjectLogsConfigCloudWatchLogsDetails,aws_code_build_project_logs_config_cloud_watch_logs_details +AwsCodeBuildProjectLogsConfigDetails,aws_code_build_project_logs_config_details +AwsCodeBuildProjectLogsConfigS3LogsDetails,aws_code_build_project_logs_config_s3_logs_details +AwsCodeBuildProjectSource,aws_code_build_project_source +AwsCodeBuildProjectVpcConfig,aws_code_build_project_vpc_config +AwsCognitoIdentityPoolId,aws_cognito_identity_pool_id +AwsCognitoRegion,aws_cognito_region +AwsCorsConfiguration,aws_cors_configuration +AwsCredentials,aws_credentials +AwsDynamoDbTable,aws_dynamo_db_table +AwsDynamoDbTableAttributeDefinition,aws_dynamo_db_table_attribute_definition +AwsDynamoDbTableBillingModeSummary,aws_dynamo_db_table_billing_mode_summary +AwsDynamoDbTableDetails,aws_dynamo_db_table_details +AwsDynamoDbTableGlobalSecondaryIndex,aws_dynamo_db_table_global_secondary_index +AwsDynamoDbTableKeySchema,aws_dynamo_db_table_key_schema +AwsDynamoDbTableLocalSecondaryIndex,aws_dynamo_db_table_local_secondary_index +AwsDynamoDbTableProjection,aws_dynamo_db_table_projection +AwsDynamoDbTableProvisionedThroughput,aws_dynamo_db_table_provisioned_throughput +AwsDynamoDbTableProvisionedThroughputOverride,aws_dynamo_db_table_provisioned_throughput_override +AwsDynamoDbTableReplica,aws_dynamo_db_table_replica +AwsDynamoDbTableReplicaGlobalSecondaryIndex,aws_dynamo_db_table_replica_global_secondary_index +AwsDynamoDbTableRestoreSummary,aws_dynamo_db_table_restore_summary +AwsDynamoDbTableSseDescription,aws_dynamo_db_table_sse_description +AwsDynamoDbTableStreamSpecification,aws_dynamo_db_table_stream_specification +AwsEc2Eip,aws_ec2_eip +AwsEc2EipDetails,aws_ec2_eip_details +AwsEc2Instance,aws_ec2_instance +AwsEc2InstanceDetails,aws_ec2_instance_details +AwsEc2InstanceMetadataOptions,aws_ec2_instance_metadata_options +AwsEc2InstanceMonitoringDetails,aws_ec2_instance_monitoring_details +AwsEc2InstanceNetworkInterfacesDetails,aws_ec2_instance_network_interfaces_details +AwsEc2InstanceViolation,aws_ec2_instance_violation +AwsEc2LaunchTemplate,aws_ec2_launch_template +AwsEc2LaunchTemplateDataBlockDeviceMappingSetDetails,aws_ec2_launch_template_data_block_device_mapping_set_details +AwsEc2LaunchTemplateDataBlockDeviceMappingSetEbsDetails,aws_ec2_launch_template_data_block_device_mapping_set_ebs_details +AwsEc2LaunchTemplateDataCapacityReservationSpecificationCapacityReservationTargetDetails,aws_ec2_launch_template_data_capacity_reservation_specification_capacity_reservation_target_details +AwsEc2LaunchTemplateDataCapacityReservationSpecificationDetails,aws_ec2_launch_template_data_capacity_reservation_specification_details +AwsEc2LaunchTemplateDataCpuOptionsDetails,aws_ec2_launch_template_data_cpu_options_details +AwsEc2LaunchTemplateDataCreditSpecificationDetails,aws_ec2_launch_template_data_credit_specification_details +AwsEc2LaunchTemplateDataDetails,aws_ec2_launch_template_data_details +AwsEc2LaunchTemplateDataElasticGpuSpecificationSetDetails,aws_ec2_launch_template_data_elastic_gpu_specification_set_details +AwsEc2LaunchTemplateDataElasticInferenceAcceleratorSetDetails,aws_ec2_launch_template_data_elastic_inference_accelerator_set_details +AwsEc2LaunchTemplateDataEnclaveOptionsDetails,aws_ec2_launch_template_data_enclave_options_details +AwsEc2LaunchTemplateDataHibernationOptionsDetails,aws_ec2_launch_template_data_hibernation_options_details +AwsEc2LaunchTemplateDataIamInstanceProfileDetails,aws_ec2_launch_template_data_iam_instance_profile_details +AwsEc2LaunchTemplateDataInstanceMarketOptionsDetails,aws_ec2_launch_template_data_instance_market_options_details +AwsEc2LaunchTemplateDataInstanceMarketOptionsSpotOptionsDetails,aws_ec2_launch_template_data_instance_market_options_spot_options_details +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorCountDetails,aws_ec2_launch_template_data_instance_requirements_accelerator_count_details +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorTotalMemoryMiBDetails,aws_ec2_launch_template_data_instance_requirements_accelerator_total_memory_mib_details +AwsEc2LaunchTemplateDataInstanceRequirementsBaselineEbsBandwidthMbpsDetails,aws_ec2_launch_template_data_instance_requirements_baseline_ebs_bandwidth_mbps_details +AwsEc2LaunchTemplateDataInstanceRequirementsDetails,aws_ec2_launch_template_data_instance_requirements_details +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryGiBPerVCpuDetails,aws_ec2_launch_template_data_instance_requirements_memory_gib_per_v_cpu_details +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryMiBDetails,aws_ec2_launch_template_data_instance_requirements_memory_mib_details +AwsEc2LaunchTemplateDataInstanceRequirementsNetworkInterfaceCountDetails,aws_ec2_launch_template_data_instance_requirements_network_interface_count_details +AwsEc2LaunchTemplateDataInstanceRequirementsTotalLocalStorageGBDetails,aws_ec2_launch_template_data_instance_requirements_total_local_storage_gb_details +AwsEc2LaunchTemplateDataInstanceRequirementsVCpuCountDetails,aws_ec2_launch_template_data_instance_requirements_v_cpu_count_details +AwsEc2LaunchTemplateDataLicenseSetDetails,aws_ec2_launch_template_data_license_set_details +AwsEc2LaunchTemplateDataMaintenanceOptionsDetails,aws_ec2_launch_template_data_maintenance_options_details +AwsEc2LaunchTemplateDataMetadataOptionsDetails,aws_ec2_launch_template_data_metadata_options_details +AwsEc2LaunchTemplateDataMonitoringDetails,aws_ec2_launch_template_data_monitoring_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetDetails,aws_ec2_launch_template_data_network_interface_set_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv4PrefixesDetails,aws_ec2_launch_template_data_network_interface_set_ipv4_prefixes_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6AddressesDetails,aws_ec2_launch_template_data_network_interface_set_ipv6_addresses_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6PrefixesDetails,aws_ec2_launch_template_data_network_interface_set_ipv6_prefixes_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetPrivateIpAddressesDetails,aws_ec2_launch_template_data_network_interface_set_private_ip_addresses_details +AwsEc2LaunchTemplateDataPlacementDetails,aws_ec2_launch_template_data_placement_details +AwsEc2LaunchTemplateDataPrivateDnsNameOptionsDetails,aws_ec2_launch_template_data_private_dns_name_options_details +AwsEc2LaunchTemplateDetails,aws_ec2_launch_template_details +AwsEc2NetworkAcl,aws_ec2_network_acl +AwsEc2NetworkAclAssociation,aws_ec2_network_acl_association +AwsEc2NetworkAclDetails,aws_ec2_network_acl_details +AwsEc2NetworkAclEntry,aws_ec2_network_acl_entry +AwsEc2NetworkInterface,aws_ec2_network_interface +AwsEc2NetworkInterfaceAttachment,aws_ec2_network_interface_attachment +AwsEc2NetworkInterfaceDetails,aws_ec2_network_interface_details +AwsEc2NetworkInterfaceIpV6AddressDetail,aws_ec2_network_interface_ipv6_address_detail +AwsEc2NetworkInterfacePrivateIpAddressDetail,aws_ec2_network_interface_private_ip_address_detail +AwsEc2NetworkInterfaceSecurityGroup,aws_ec2_network_interface_security_group +AwsEc2NetworkInterfaceViolation,aws_ec2_network_interface_violation +AwsEc2NetworkInterfaceViolations,aws_ec2_network_interface_violations +AwsEc2RouteTable,aws_ec2_route_table +AwsEc2RouteTableDetails,aws_ec2_route_table_details +AwsEc2SecurityGroup,aws_ec2_security_group +AwsEc2SecurityGroupDetails,aws_ec2_security_group_details +AwsEc2SecurityGroupIpPermission,aws_ec2_security_group_ip_permission +AwsEc2SecurityGroupIpRange,aws_ec2_security_group_ip_range +AwsEc2SecurityGroupIpv6Range,aws_ec2_security_group_ipv6_range +AwsEc2SecurityGroupPrefixListId,aws_ec2_security_group_prefix_list_id +AwsEc2SecurityGroupUserIdGroupPair,aws_ec2_security_group_user_id_group_pair +AwsEc2Subnet,aws_ec2_subnet +AwsEc2SubnetDetails,aws_ec2_subnet_details +AwsEc2TransitGateway,aws_ec2_transit_gateway +AwsEc2TransitGatewayDetails,aws_ec2_transit_gateway_details +AwsEc2Volume,aws_ec2_volume +AwsEc2VolumeAttachment,aws_ec2_volume_attachment +AwsEc2VolumeDetails,aws_ec2_volume_details +AwsEc2Vpc,aws_ec2_vpc +AwsEc2VpcDetails,aws_ec2_vpc_details +AwsEc2VpcEndpointService,aws_ec2_vpc_endpoint_service +AwsEc2VpcEndpointServiceDetails,aws_ec2_vpc_endpoint_service_details +AwsEc2VpcEndpointServiceServiceTypeDetails,aws_ec2_vpc_endpoint_service_service_type_details +AwsEc2VpcPeeringConnection,aws_ec2_vpc_peering_connection +AwsEc2VpcPeeringConnectionDetails,aws_ec2_vpc_peering_connection_details +AwsEc2VpcPeeringConnectionStatusDetails,aws_ec2_vpc_peering_connection_status_details +AwsEc2VpcPeeringConnectionVpcInfoDetails,aws_ec2_vpc_peering_connection_vpc_info_details +AwsEc2VpnConnection,aws_ec2_vpn_connection +AwsEc2VpnConnectionDetails,aws_ec2_vpn_connection_details +AwsEc2VpnConnectionOptionsDetails,aws_ec2_vpn_connection_options_details +AwsEc2VpnConnectionOptionsTunnelOptionsDetails,aws_ec2_vpn_connection_options_tunnel_options_details +AwsEc2VpnConnectionRoutesDetails,aws_ec2_vpn_connection_routes_details +AwsEc2VpnConnectionVgwTelemetryDetails,aws_ec2_vpn_connection_vgw_telemetry_details +AwsEcrContainerAggregation,aws_ecr_container_aggregation +AwsEcrContainerAggregationResponse,aws_ecr_container_aggregation_response +AwsEcrContainerImage,aws_ecr_container_image +AwsEcrContainerImageDetails,aws_ecr_container_image_details +AwsEcrRepository,aws_ecr_repository +AwsEcrRepositoryDetails,aws_ecr_repository_details +AwsEcrRepositoryImageScanningConfigurationDetails,aws_ecr_repository_image_scanning_configuration_details +AwsEcrRepositoryLifecyclePolicyDetails,aws_ecr_repository_lifecycle_policy_details +AwsEcsCluster,aws_ecs_cluster +AwsEcsClusterClusterSettingsDetails,aws_ecs_cluster_cluster_settings_details +AwsEcsClusterConfigurationDetails,aws_ecs_cluster_configuration_details +AwsEcsClusterConfigurationExecuteCommandConfigurationDetails,aws_ecs_cluster_configuration_execute_command_configuration_details +AwsEcsClusterConfigurationExecuteCommandConfigurationLogConfigurationDetails,aws_ecs_cluster_configuration_execute_command_configuration_log_configuration_details +AwsEcsClusterDefaultCapacityProviderStrategyDetails,aws_ecs_cluster_default_capacity_provider_strategy_details +AwsEcsClusterDetails,aws_ecs_cluster_details +AwsEcsContainer,aws_ecs_container +AwsEcsContainerDetails,aws_ecs_container_details +AwsEcsService,aws_ecs_service +AwsEcsServiceCapacityProviderStrategyDetails,aws_ecs_service_capacity_provider_strategy_details +AwsEcsServiceDeploymentConfigurationDeploymentCircuitBreakerDetails,aws_ecs_service_deployment_configuration_deployment_circuit_breaker_details +AwsEcsServiceDeploymentConfigurationDetails,aws_ecs_service_deployment_configuration_details +AwsEcsServiceDeploymentControllerDetails,aws_ecs_service_deployment_controller_details +AwsEcsServiceDetails,aws_ecs_service_details +AwsEcsServiceLoadBalancersDetails,aws_ecs_service_load_balancers_details +AwsEcsServiceNetworkConfigurationAwsVpcConfigurationDetails,aws_ecs_service_network_configuration_aws_vpc_configuration_details +AwsEcsServiceNetworkConfigurationDetails,aws_ecs_service_network_configuration_details +AwsEcsServicePlacementConstraintsDetails,aws_ecs_service_placement_constraints_details +AwsEcsServicePlacementStrategiesDetails,aws_ecs_service_placement_strategies_details +AwsEcsServiceServiceRegistriesDetails,aws_ecs_service_service_registries_details +AwsEcsTask,aws_ecs_task +AwsEcsTaskDefinition,aws_ecs_task_definition +AwsEcsTaskDefinitionContainerDefinitionsDependsOnDetails,aws_ecs_task_definition_container_definitions_depends_on_details +AwsEcsTaskDefinitionContainerDefinitionsDetails,aws_ecs_task_definition_container_definitions_details +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentDetails,aws_ecs_task_definition_container_definitions_environment_details +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentFilesDetails,aws_ecs_task_definition_container_definitions_environment_files_details +AwsEcsTaskDefinitionContainerDefinitionsExtraHostsDetails,aws_ecs_task_definition_container_definitions_extra_hosts_details +AwsEcsTaskDefinitionContainerDefinitionsFirelensConfigurationDetails,aws_ecs_task_definition_container_definitions_firelens_configuration_details +AwsEcsTaskDefinitionContainerDefinitionsHealthCheckDetails,aws_ecs_task_definition_container_definitions_health_check_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersCapabilitiesDetails,aws_ecs_task_definition_container_definitions_linux_parameters_capabilities_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDetails,aws_ecs_task_definition_container_definitions_linux_parameters_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDevicesDetails,aws_ecs_task_definition_container_definitions_linux_parameters_devices_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersTmpfsDetails,aws_ecs_task_definition_container_definitions_linux_parameters_tmpfs_details +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationDetails,aws_ecs_task_definition_container_definitions_log_configuration_details +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationSecretOptionsDetails,aws_ecs_task_definition_container_definitions_log_configuration_secret_options_details +AwsEcsTaskDefinitionContainerDefinitionsMountPointsDetails,aws_ecs_task_definition_container_definitions_mount_points_details +AwsEcsTaskDefinitionContainerDefinitionsPortMappingsDetails,aws_ecs_task_definition_container_definitions_port_mappings_details +AwsEcsTaskDefinitionContainerDefinitionsRepositoryCredentialsDetails,aws_ecs_task_definition_container_definitions_repository_credentials_details +AwsEcsTaskDefinitionContainerDefinitionsResourceRequirementsDetails,aws_ecs_task_definition_container_definitions_resource_requirements_details +AwsEcsTaskDefinitionContainerDefinitionsSecretsDetails,aws_ecs_task_definition_container_definitions_secrets_details +AwsEcsTaskDefinitionContainerDefinitionsSystemControlsDetails,aws_ecs_task_definition_container_definitions_system_controls_details +AwsEcsTaskDefinitionContainerDefinitionsUlimitsDetails,aws_ecs_task_definition_container_definitions_ulimits_details +AwsEcsTaskDefinitionContainerDefinitionsVolumesFromDetails,aws_ecs_task_definition_container_definitions_volumes_from_details +AwsEcsTaskDefinitionDetails,aws_ecs_task_definition_details +AwsEcsTaskDefinitionInferenceAcceleratorsDetails,aws_ecs_task_definition_inference_accelerators_details +AwsEcsTaskDefinitionPlacementConstraintsDetails,aws_ecs_task_definition_placement_constraints_details +AwsEcsTaskDefinitionProxyConfigurationDetails,aws_ecs_task_definition_proxy_configuration_details +AwsEcsTaskDefinitionProxyConfigurationProxyConfigurationPropertiesDetails,aws_ecs_task_definition_proxy_configuration_proxy_configuration_properties_details +AwsEcsTaskDefinitionVolumesDetails,aws_ecs_task_definition_volumes_details +AwsEcsTaskDefinitionVolumesDockerVolumeConfigurationDetails,aws_ecs_task_definition_volumes_docker_volume_configuration_details +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationAuthorizationConfigDetails,aws_ecs_task_definition_volumes_efs_volume_configuration_authorization_config_details +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationDetails,aws_ecs_task_definition_volumes_efs_volume_configuration_details +AwsEcsTaskDefinitionVolumesHostDetails,aws_ecs_task_definition_volumes_host_details +AwsEcsTaskDetails,aws_ecs_task_details +AwsEcsTaskVolumeDetails,aws_ecs_task_volume_details +AwsEcsTaskVolumeHostDetails,aws_ecs_task_volume_host_details +AwsEfsAccessPoint,aws_efs_access_point +AwsEfsAccessPointDetails,aws_efs_access_point_details +AwsEfsAccessPointPosixUserDetails,aws_efs_access_point_posix_user_details +AwsEfsAccessPointRootDirectoryCreationInfoDetails,aws_efs_access_point_root_directory_creation_info_details +AwsEfsAccessPointRootDirectoryDetails,aws_efs_access_point_root_directory_details +AwsEksCluster,aws_eks_cluster +AwsEksClusterDetails,aws_eks_cluster_details +AwsEksClusterLoggingClusterLoggingDetails,aws_eks_cluster_logging_cluster_logging_details +AwsEksClusterLoggingDetails,aws_eks_cluster_logging_details +AwsEksClusterResourcesVpcConfigDetails,aws_eks_cluster_resources_vpc_config_details +AwsElasticBeanstalkEnvironment,aws_elastic_beanstalk_environment +AwsElasticBeanstalkEnvironmentDetails,aws_elastic_beanstalk_environment_details +AwsElasticBeanstalkEnvironmentEnvironmentLink,aws_elastic_beanstalk_environment_environment_link +AwsElasticBeanstalkEnvironmentOptionSetting,aws_elastic_beanstalk_environment_option_setting +AwsElasticBeanstalkEnvironmentTier,aws_elastic_beanstalk_environment_tier +AwsElasticsearchDomain,aws_elasticsearch_domain +AwsElasticsearchDomainDetails,aws_elasticsearch_domain_details +AwsElasticsearchDomainDomainEndpointOptions,aws_elasticsearch_domain_domain_endpoint_options +AwsElasticsearchDomainElasticsearchClusterConfigDetails,aws_elasticsearch_domain_elasticsearch_cluster_config_details +AwsElasticsearchDomainElasticsearchClusterConfigZoneAwarenessConfigDetails,aws_elasticsearch_domain_elasticsearch_cluster_config_zone_awareness_config_details +AwsElasticsearchDomainEncryptionAtRestOptions,aws_elasticsearch_domain_encryption_at_rest_options +AwsElasticsearchDomainLogPublishingOptions,aws_elasticsearch_domain_log_publishing_options +AwsElasticsearchDomainLogPublishingOptionsLogConfig,aws_elasticsearch_domain_log_publishing_options_log_config +AwsElasticsearchDomainNodeToNodeEncryptionOptions,aws_elasticsearch_domain_node_to_node_encryption_options +AwsElasticsearchDomainServiceSoftwareOptions,aws_elasticsearch_domain_service_software_options +AwsElasticsearchDomainVPCOptions,aws_elasticsearch_domain_vpc_options +AwsElbAppCookieStickinessPolicy,aws_elb_app_cookie_stickiness_policy +AwsElbLbCookieStickinessPolicy,aws_elb_lb_cookie_stickiness_policy +AwsElbLoadBalancer,aws_elb_load_balancer +AwsElbLoadBalancerAccessLog,aws_elb_load_balancer_access_log +AwsElbLoadBalancerAdditionalAttribute,aws_elb_load_balancer_additional_attribute +AwsElbLoadBalancerAttributes,aws_elb_load_balancer_attributes +AwsElbLoadBalancerBackendServerDescription,aws_elb_load_balancer_backend_server_description +AwsElbLoadBalancerConnectionDraining,aws_elb_load_balancer_connection_draining +AwsElbLoadBalancerConnectionSettings,aws_elb_load_balancer_connection_settings +AwsElbLoadBalancerCrossZoneLoadBalancing,aws_elb_load_balancer_cross_zone_load_balancing +AwsElbLoadBalancerDetails,aws_elb_load_balancer_details +AwsElbLoadBalancerHealthCheck,aws_elb_load_balancer_health_check +AwsElbLoadBalancerInstance,aws_elb_load_balancer_instance +AwsElbLoadBalancerListener,aws_elb_load_balancer_listener +AwsElbLoadBalancerListenerDescription,aws_elb_load_balancer_listener_description +AwsElbLoadBalancerPolicies,aws_elb_load_balancer_policies +AwsElbLoadBalancerSourceSecurityGroup,aws_elb_load_balancer_source_security_group +AwsElbv2LoadBalancer,aws_elbv2_load_balancer +AwsElbv2LoadBalancerAttribute,aws_elbv2_load_balancer_attribute +AwsElbv2LoadBalancerDetails,aws_elbv2_load_balancer_details +AwsEventSchemasRegistry,aws_event_schemas_registry +AwsEventSchemasRegistryDetails,aws_event_schemas_registry_details +AwsGroundStationAgentEndpoint,aws_ground_station_agent_endpoint +AwsGuardDutyDetector,aws_guard_duty_detector +AwsGuardDutyDetectorDataSourcesCloudTrailDetails,aws_guard_duty_detector_data_sources_cloud_trail_details +AwsGuardDutyDetectorDataSourcesDetails,aws_guard_duty_detector_data_sources_details +AwsGuardDutyDetectorDataSourcesDnsLogsDetails,aws_guard_duty_detector_data_sources_dns_logs_details +AwsGuardDutyDetectorDataSourcesFlowLogsDetails,aws_guard_duty_detector_data_sources_flow_logs_details +AwsGuardDutyDetectorDataSourcesKubernetesAuditLogsDetails,aws_guard_duty_detector_data_sources_kubernetes_audit_logs_details +AwsGuardDutyDetectorDataSourcesKubernetesDetails,aws_guard_duty_detector_data_sources_kubernetes_details +AwsGuardDutyDetectorDataSourcesMalwareProtectionDetails,aws_guard_duty_detector_data_sources_malware_protection_details +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsDetails,aws_guard_duty_detector_data_sources_malware_protection_scan_ec2_instance_with_findings_details +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsEbsVolumesDetails,aws_guard_duty_detector_data_sources_malware_protection_scan_ec2_instance_with_findings_ebs_volumes_details +AwsGuardDutyDetectorDataSourcesS3LogsDetails,aws_guard_duty_detector_data_sources_s3_logs_details +AwsGuardDutyDetectorDetails,aws_guard_duty_detector_details +AwsGuardDutyDetectorFeaturesDetails,aws_guard_duty_detector_features_details +AwsHardwareCertificate,aws_hardware_certificate +AwsIamAccessKey,aws_iam_access_key +AwsIamAccessKeyDetails,aws_iam_access_key_details +AwsIamAccessKeySessionContext,aws_iam_access_key_session_context +AwsIamAccessKeySessionContextAttributes,aws_iam_access_key_session_context_attributes +AwsIamAccessKeySessionContextSessionIssuer,aws_iam_access_key_session_context_session_issuer +AwsIamAttachedManagedPolicy,aws_iam_attached_managed_policy +AwsIamConfig,aws_iam_config +AwsIamGroup,aws_iam_group +AwsIamGroupDetails,aws_iam_group_details +AwsIamGroupPolicy,aws_iam_group_policy +AwsIamInstanceProfile,aws_iam_instance_profile +AwsIamInstanceProfileRole,aws_iam_instance_profile_role +AwsIamPermissionsBoundary,aws_iam_permissions_boundary +AwsIamPolicy,aws_iam_policy +AwsIamPolicyDetails,aws_iam_policy_details +AwsIamPolicyVersion,aws_iam_policy_version +AwsIamRole,aws_iam_role +AwsIamRoleDetails,aws_iam_role_details +AwsIamRolePolicy,aws_iam_role_policy +AwsIamUser,aws_iam_user +AwsIamUserDetails,aws_iam_user_details +AwsIamUserPolicy,aws_iam_user_policy +AwsIdentity,aws_identity +AwsIotAnalyticsParameters,aws_iot_analytics_parameters +AwsJobAbortConfig,aws_job_abort_config +AwsJobAbortCriteria,aws_job_abort_criteria +AwsJobExecutionsRolloutConfig,aws_job_executions_rollout_config +AwsJobExponentialRolloutRate,aws_job_exponential_rollout_rate +AwsJobPresignedUrlConfig,aws_job_presigned_url_config +AwsJobRateIncreaseCriteria,aws_job_rate_increase_criteria +AwsJobTimeoutConfig,aws_job_timeout_config +AwsKinesisStream,aws_kinesis_stream +AwsKinesisStreamDetails,aws_kinesis_stream_details +AwsKinesisStreamStreamEncryptionDetails,aws_kinesis_stream_stream_encryption_details +AwsKmsKey,aws_kms_key +AwsKmsKeyArn,aws_kms_key_arn +AwsKmsKeyDetails,aws_kms_key_details +AwsKmsKeyId,aws_kms_key_id +AwsLambdaFunction,aws_lambda_function +AwsLambdaFunctionCode,aws_lambda_function_code +AwsLambdaFunctionDeadLetterConfig,aws_lambda_function_dead_letter_config +AwsLambdaFunctionDetails,aws_lambda_function_details +AwsLambdaFunctionEnvironment,aws_lambda_function_environment +AwsLambdaFunctionEnvironmentError,aws_lambda_function_environment_error +AwsLambdaFunctionLayer,aws_lambda_function_layer +AwsLambdaFunctionTracingConfig,aws_lambda_function_tracing_config +AwsLambdaFunctionVpcConfig,aws_lambda_function_vpc_config +AwsLambdaLayerVersion,aws_lambda_layer_version +AwsLambdaLayerVersionDetails,aws_lambda_layer_version_details +AwsLambdaTransformation,aws_lambda_transformation +AwsLogSourceConfiguration,aws_log_source_configuration +AwsLogSourceResource,aws_log_source_resource +AwsManaged,aws_managed +AwsManagedHumanLoopRequestSource,aws_managed_human_loop_request_source +AwsManagedResources,aws_managed_resources +AwsMountPoint,aws_mount_point +AwsNetworkFirewallFirewall,aws_network_firewall_firewall +AwsNetworkFirewallFirewallDetails,aws_network_firewall_firewall_details +AwsNetworkFirewallFirewallPolicy,aws_network_firewall_firewall_policy +AwsNetworkFirewallFirewallPolicyDetails,aws_network_firewall_firewall_policy_details +AwsNetworkFirewallFirewallSubnetMappingsDetails,aws_network_firewall_firewall_subnet_mappings_details +AwsNetworkFirewallRuleGroup,aws_network_firewall_rule_group +AwsNetworkFirewallRuleGroupDetails,aws_network_firewall_rule_group_details +AwsOpenSearchServiceDomain,aws_open_search_service_domain +AwsOpenSearchServiceDomainAdvancedSecurityOptionsDetails,aws_open_search_service_domain_advanced_security_options_details +AwsOpenSearchServiceDomainClusterConfigDetails,aws_open_search_service_domain_cluster_config_details +AwsOpenSearchServiceDomainClusterConfigZoneAwarenessConfigDetails,aws_open_search_service_domain_cluster_config_zone_awareness_config_details +AwsOpenSearchServiceDomainDetails,aws_open_search_service_domain_details +AwsOpenSearchServiceDomainDomainEndpointOptionsDetails,aws_open_search_service_domain_domain_endpoint_options_details +AwsOpenSearchServiceDomainEncryptionAtRestOptionsDetails,aws_open_search_service_domain_encryption_at_rest_options_details +AwsOpenSearchServiceDomainLogPublishingOption,aws_open_search_service_domain_log_publishing_option +AwsOpenSearchServiceDomainLogPublishingOptionsDetails,aws_open_search_service_domain_log_publishing_options_details +AwsOpenSearchServiceDomainMasterUserOptionsDetails,aws_open_search_service_domain_master_user_options_details +AwsOpenSearchServiceDomainNodeToNodeEncryptionOptionsDetails,aws_open_search_service_domain_node_to_node_encryption_options_details +AwsOpenSearchServiceDomainServiceSoftwareOptionsDetails,aws_open_search_service_domain_service_software_options_details +AwsOpenSearchServiceDomainVpcOptionsDetails,aws_open_search_service_domain_vpc_options_details +AwsOrg,aws_org +AwsOrganizationsSource,aws_organizations_source +AwsRdsDbCluster,aws_rds_db_cluster +AwsRdsDbClusterAssociatedRole,aws_rds_db_cluster_associated_role +AwsRdsDbClusterDetails,aws_rds_db_cluster_details +AwsRdsDbClusterMember,aws_rds_db_cluster_member +AwsRdsDbClusterOptionGroupMembership,aws_rds_db_cluster_option_group_membership +AwsRdsDbClusterSnapshot,aws_rds_db_cluster_snapshot +AwsRdsDbClusterSnapshotDbClusterSnapshotAttribute,aws_rds_db_cluster_snapshot_db_cluster_snapshot_attribute +AwsRdsDbClusterSnapshotDetails,aws_rds_db_cluster_snapshot_details +AwsRdsDbDomainMembership,aws_rds_db_domain_membership +AwsRdsDbInstance,aws_rds_db_instance +AwsRdsDbInstanceAssociatedRole,aws_rds_db_instance_associated_role +AwsRdsDbInstanceDetails,aws_rds_db_instance_details +AwsRdsDbInstanceEndpoint,aws_rds_db_instance_endpoint +AwsRdsDbInstanceVpcSecurityGroup,aws_rds_db_instance_vpc_security_group +AwsRdsDbOptionGroupMembership,aws_rds_db_option_group_membership +AwsRdsDbParameterGroup,aws_rds_db_parameter_group +AwsRdsDbPendingModifiedValues,aws_rds_db_pending_modified_values +AwsRdsDbProcessorFeature,aws_rds_db_processor_feature +AwsRdsDbSecurityGroup,aws_rds_db_security_group +AwsRdsDbSecurityGroupDetails,aws_rds_db_security_group_details +AwsRdsDbSecurityGroupEc2SecurityGroup,aws_rds_db_security_group_ec2_security_group +AwsRdsDbSecurityGroupIpRange,aws_rds_db_security_group_ip_range +AwsRdsDbSnapshot,aws_rds_db_snapshot +AwsRdsDbSnapshotDetails,aws_rds_db_snapshot_details +AwsRdsDbStatusInfo,aws_rds_db_status_info +AwsRdsDbSubnetGroup,aws_rds_db_subnet_group +AwsRdsDbSubnetGroupSubnet,aws_rds_db_subnet_group_subnet +AwsRdsDbSubnetGroupSubnetAvailabilityZone,aws_rds_db_subnet_group_subnet_availability_zone +AwsRdsEventSubscription,aws_rds_event_subscription +AwsRdsEventSubscriptionDetails,aws_rds_event_subscription_details +AwsRdsPendingCloudWatchLogsExports,aws_rds_pending_cloud_watch_logs_exports +AwsRedshiftCluster,aws_redshift_cluster +AwsRedshiftClusterClusterNode,aws_redshift_cluster_cluster_node +AwsRedshiftClusterClusterParameterGroup,aws_redshift_cluster_cluster_parameter_group +AwsRedshiftClusterClusterParameterStatus,aws_redshift_cluster_cluster_parameter_status +AwsRedshiftClusterClusterSecurityGroup,aws_redshift_cluster_cluster_security_group +AwsRedshiftClusterClusterSnapshotCopyStatus,aws_redshift_cluster_cluster_snapshot_copy_status +AwsRedshiftClusterDeferredMaintenanceWindow,aws_redshift_cluster_deferred_maintenance_window +AwsRedshiftClusterDetails,aws_redshift_cluster_details +AwsRedshiftClusterElasticIpStatus,aws_redshift_cluster_elastic_ip_status +AwsRedshiftClusterEndpoint,aws_redshift_cluster_endpoint +AwsRedshiftClusterHsmStatus,aws_redshift_cluster_hsm_status +AwsRedshiftClusterIamRole,aws_redshift_cluster_iam_role +AwsRedshiftClusterLoggingStatus,aws_redshift_cluster_logging_status +AwsRedshiftClusterPendingModifiedValues,aws_redshift_cluster_pending_modified_values +AwsRedshiftClusterResizeInfo,aws_redshift_cluster_resize_info +AwsRedshiftClusterRestoreStatus,aws_redshift_cluster_restore_status +AwsRedshiftClusterVpcSecurityGroup,aws_redshift_cluster_vpc_security_group +AwsRegion,aws_region +AwsRegions,aws_regions +AwsS3AccountPublicAccessBlock,aws_s3_account_public_access_block +AwsS3AccountPublicAccessBlockDetails,aws_s3_account_public_access_block_details +AwsS3Bucket,aws_s3_bucket +AwsS3BucketBucketLifecycleConfigurationDetails,aws_s3_bucket_bucket_lifecycle_configuration_details +AwsS3BucketBucketLifecycleConfigurationRulesAbortIncompleteMultipartUploadDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_abort_incomplete_multipart_upload_details +AwsS3BucketBucketLifecycleConfigurationRulesDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_operands_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsTagDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_operands_tag_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateTagDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_tag_details +AwsS3BucketBucketLifecycleConfigurationRulesNoncurrentVersionTransitionsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_noncurrent_version_transitions_details +AwsS3BucketBucketLifecycleConfigurationRulesTransitionsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_transitions_details +AwsS3BucketBucketVersioningConfiguration,aws_s3_bucket_bucket_versioning_configuration +AwsS3BucketDetails,aws_s3_bucket_details +AwsS3BucketLoggingConfiguration,aws_s3_bucket_logging_configuration +AwsS3BucketNotificationConfiguration,aws_s3_bucket_notification_configuration +AwsS3BucketNotificationConfigurationDetail,aws_s3_bucket_notification_configuration_detail +AwsS3BucketNotificationConfigurationFilter,aws_s3_bucket_notification_configuration_filter +AwsS3BucketNotificationConfigurationS3KeyFilter,aws_s3_bucket_notification_configuration_s3_key_filter +AwsS3BucketNotificationConfigurationS3KeyFilterRule,aws_s3_bucket_notification_configuration_s3_key_filter_rule +AwsS3BucketObjectLockConfiguration,aws_s3_bucket_object_lock_configuration +AwsS3BucketObjectLockConfigurationRuleDefaultRetentionDetails,aws_s3_bucket_object_lock_configuration_rule_default_retention_details +AwsS3BucketObjectLockConfigurationRuleDetails,aws_s3_bucket_object_lock_configuration_rule_details +AwsS3BucketServerSideEncryptionByDefault,aws_s3_bucket_server_side_encryption_by_default +AwsS3BucketServerSideEncryptionConfiguration,aws_s3_bucket_server_side_encryption_configuration +AwsS3BucketServerSideEncryptionRule,aws_s3_bucket_server_side_encryption_rule +AwsS3BucketWebsiteConfiguration,aws_s3_bucket_website_configuration +AwsS3BucketWebsiteConfigurationRedirectTo,aws_s3_bucket_website_configuration_redirect_to +AwsS3BucketWebsiteConfigurationRoutingRule,aws_s3_bucket_website_configuration_routing_rule +AwsS3BucketWebsiteConfigurationRoutingRuleCondition,aws_s3_bucket_website_configuration_routing_rule_condition +AwsS3BucketWebsiteConfigurationRoutingRuleRedirect,aws_s3_bucket_website_configuration_routing_rule_redirect +AwsS3Object,aws_s3_object +AwsS3ObjectDetails,aws_s3_object_details +AwsSageMakerNotebookInstance,aws_sage_maker_notebook_instance +AwsSageMakerNotebookInstanceDetails,aws_sage_maker_notebook_instance_details +AwsSageMakerNotebookInstanceMetadataServiceConfigurationDetails,aws_sage_maker_notebook_instance_metadata_service_configuration_details +AwsSecretsManagerSecret,aws_secrets_manager_secret +AwsSecretsManagerSecretDetails,aws_secrets_manager_secret_details +AwsSecretsManagerSecretRotationRules,aws_secrets_manager_secret_rotation_rules +AwsSecurityFinding,aws_security_finding +AwsSecurityFindingFilters,aws_security_finding_filters +AwsSecurityFindingIdentifier,aws_security_finding_identifier +AwsService,aws_service +AwsSnsTopic,aws_sns_topic +AwsSnsTopicDetails,aws_sns_topic_details +AwsSnsTopicSubscription,aws_sns_topic_subscription +AwsSqsQueue,aws_sqs_queue +AwsSqsQueueDetails,aws_sqs_queue_details +AwsSsmComplianceSummary,aws_ssm_compliance_summary +AwsSsmPatch,aws_ssm_patch +AwsSsmPatchCompliance,aws_ssm_patch_compliance +AwsSsmPatchComplianceDetails,aws_ssm_patch_compliance_details +AwsSsoAuthentication,aws_sso_authentication +AwsStepFunctionStateMachine,aws_step_function_state_machine +AwsStepFunctionStateMachineDetails,aws_step_function_state_machine_details +AwsStepFunctionStateMachineLoggingConfigurationDestinationsCloudWatchLogsLogGroupDetails,aws_step_function_state_machine_logging_configuration_destinations_cloud_watch_logs_log_group_details +AwsStepFunctionStateMachineLoggingConfigurationDestinationsDetails,aws_step_function_state_machine_logging_configuration_destinations_details +AwsStepFunctionStateMachineLoggingConfigurationDetails,aws_step_function_state_machine_logging_configuration_details +AwsStepFunctionStateMachineTracingConfigurationDetails,aws_step_function_state_machine_tracing_configuration_details +AwsTagKey,aws_tag_key +AwsTagValue,aws_tag_value +AwsUserPoolsId,aws_user_pools_id +AwsUserPoolsWebClientId,aws_user_pools_web_client_id +AwsVPCSecurityGroupViolation,aws_vpc_security_group_violation +AwsVpcConfiguration,aws_vpc_configuration +AwsWafRateBasedRule,aws_waf_rate_based_rule +AwsWafRateBasedRuleDetails,aws_waf_rate_based_rule_details +AwsWafRateBasedRuleMatchPredicate,aws_waf_rate_based_rule_match_predicate +AwsWafRegionalRateBasedRule,aws_waf_regional_rate_based_rule +AwsWafRegionalRateBasedRuleDetails,aws_waf_regional_rate_based_rule_details +AwsWafRegionalRateBasedRuleMatchPredicate,aws_waf_regional_rate_based_rule_match_predicate +AwsWafRegionalRule,aws_waf_regional_rule +AwsWafRegionalRuleDetails,aws_waf_regional_rule_details +AwsWafRegionalRuleGroup,aws_waf_regional_rule_group +AwsWafRegionalRuleGroupDetails,aws_waf_regional_rule_group_details +AwsWafRegionalRuleGroupRulesActionDetails,aws_waf_regional_rule_group_rules_action_details +AwsWafRegionalRuleGroupRulesDetails,aws_waf_regional_rule_group_rules_details +AwsWafRegionalRulePredicateListDetails,aws_waf_regional_rule_predicate_list_details +AwsWafRegionalWebAcl,aws_waf_regional_web_acl +AwsWafRegionalWebAclDetails,aws_waf_regional_web_acl_details +AwsWafRegionalWebAclRulesListActionDetails,aws_waf_regional_web_acl_rules_list_action_details +AwsWafRegionalWebAclRulesListDetails,aws_waf_regional_web_acl_rules_list_details +AwsWafRegionalWebAclRulesListOverrideActionDetails,aws_waf_regional_web_acl_rules_list_override_action_details +AwsWafRule,aws_waf_rule +AwsWafRuleDetails,aws_waf_rule_details +AwsWafRuleGroup,aws_waf_rule_group +AwsWafRuleGroupDetails,aws_waf_rule_group_details +AwsWafRuleGroupRulesActionDetails,aws_waf_rule_group_rules_action_details +AwsWafRuleGroupRulesDetails,aws_waf_rule_group_rules_details +AwsWafRulePredicateListDetails,aws_waf_rule_predicate_list_details +AwsWafWebAcl,aws_waf_web_acl +AwsWafWebAclDetails,aws_waf_web_acl_details +AwsWafWebAclRule,aws_waf_web_acl_rule +AwsWafv2ActionAllowDetails,aws_wafv2_action_allow_details +AwsWafv2ActionBlockDetails,aws_wafv2_action_block_details +AwsWafv2CustomHttpHeader,aws_wafv2_custom_http_header +AwsWafv2CustomRequestHandlingDetails,aws_wafv2_custom_request_handling_details +AwsWafv2CustomResponseDetails,aws_wafv2_custom_response_details +AwsWafv2RuleGroup,aws_wafv2_rule_group +AwsWafv2RuleGroupDetails,aws_wafv2_rule_group_details +AwsWafv2RulesActionCaptchaDetails,aws_wafv2_rules_action_captcha_details +AwsWafv2RulesActionCountDetails,aws_wafv2_rules_action_count_details +AwsWafv2RulesActionDetails,aws_wafv2_rules_action_details +AwsWafv2RulesDetails,aws_wafv2_rules_details +AwsWafv2VisibilityConfigDetails,aws_wafv2_visibility_config_details +AwsWafv2WebAcl,aws_wafv2_web_acl +AwsWafv2WebAclActionDetails,aws_wafv2_web_acl_action_details +AwsWafv2WebAclCaptchaConfigDetails,aws_wafv2_web_acl_captcha_config_details +AwsWafv2WebAclCaptchaConfigImmunityTimePropertyDetails,aws_wafv2_web_acl_captcha_config_immunity_time_property_details +AwsWafv2WebAclDetails,aws_wafv2_web_acl_details +AwsXrayEncryptionConfig,aws_xray_encryption_config +AwsXrayEncryptionConfigDetails,aws_xray_encryption_config_details +AxesRangeScale,axes_range_scale +AxisBinding,axis_binding +AxisDataOptions,axis_data_options +AxisDisplayMinMaxRange,axis_display_min_max_range +AxisDisplayOptions,axis_display_options +AxisDisplayRange,axis_display_range +AxisLabelOptions,axis_label_options +AxisLabelReferenceOptions,axis_label_reference_options +AxisLineVisibility,axis_line_visibility +AxisLinearScale,axis_linear_scale +AxisLogarithmicScale,axis_logarithmic_scale +AxisOffset,axis_offset +AxisOptions,axis_options +AxisScale,axis_scale +AxisTickLabelOptions,axis_tick_label_options +AzureBlobSasConfiguration,azure_blob_sas_configuration +B,b +BGPPeer,bgp_peer +BS,bs +BabelfishDatabaseName,babelfish_database_name +BackTestAnomalyDetectorRequest,back_test_anomaly_detector_request +BackTestConfiguration,back_test_configuration +BackTestWindowOffset,back_test_window_offset +BackendAPIAppSyncAuthSettings,backend_api_app_sync_auth_settings +BackendAPIAuthType,backend_api_auth_type +BackendAPIConflictResolution,backend_api_conflict_resolution +BackendAPIResourceConfig,backend_api_resource_config +BackendAuthAppleProviderConfig,backend_auth_apple_provider_config +BackendAuthSocialProviderConfig,backend_auth_social_provider_config +BackendConnectionErrors,backend_connection_errors +BackendDefaults,backend_defaults +BackendEnvironment,backend_environment +BackendEnvironmentList,backend_environment_list +BackendEnvironmentName,backend_environment_name +BackendJobRespObj,backend_job_resp_obj +BackendManagerAppId,backend_manager_app_id +BackendServerDescription,backend_server_description +BackendServerDescriptions,backend_server_descriptions +BackendStoragePermissions,backend_storage_permissions +BackfillError,backfill_error +BackfillErrors,backfill_errors +BackfillMode,backfill_mode +Backfilling,backfilling +Background,background +BackgroundColor,background_color +BackgroundOpacity,background_opacity +BackgroundStyle,background_style +BackgroundVisibility,background_visibility +Backint,backint +BackintConfig,backint_config +BackintMode,backint_mode +BacktestResults,backtest_results +BacktrackConsumedChangeRecords,backtrack_consumed_change_records +BacktrackDBClusterMessage,backtrack_db_cluster_message +BacktrackIdentifier,backtrack_identifier +BacktrackRequestCreationTime,backtrack_request_creation_time +BacktrackTo,backtrack_to +BacktrackWindow,backtrack_window +BacktrackedFrom,backtracked_from +Backup,backup +BackupArn,backup_arn +BackupBeingCopied,backup_being_copied +BackupCreationDateTime,backup_creation_date_time +BackupDescription,backup_description +BackupDetails,backup_details +BackupExpiryDateTime,backup_expiry_date_time +BackupFailureDetails,backup_failure_details +BackupId,backup_id +BackupIds,backup_ids +BackupInProgress,backup_in_progress +BackupInUseException,backup_in_use_exception +BackupJob,backup_job +BackupJobId,backup_job_id +BackupJobs,backup_jobs +BackupName,backup_name +BackupNotFound,backup_not_found +BackupNotFoundException,backup_not_found_exception +BackupObject,backup_object +BackupOptions,backup_options +BackupPlan,backup_plan +BackupPlanArn,backup_plan_arn +BackupPlanDocument,backup_plan_document +BackupPlanId,backup_plan_id +BackupPlanInput,backup_plan_input +BackupPlanName,backup_plan_name +BackupPlanRule,backup_plan_rule +BackupPlanTags,backup_plan_tags +BackupPlanTemplateId,backup_plan_template_id +BackupPlanTemplateJson,backup_plan_template_json +BackupPlanTemplateName,backup_plan_template_name +BackupPlanTemplatesList,backup_plan_templates_list +BackupPlanTemplatesListMember,backup_plan_templates_list_member +BackupPlanVersion,backup_plan_version +BackupPlanVersionsList,backup_plan_versions_list +BackupPlansList,backup_plans_list +BackupPlansListMember,backup_plans_list_member +BackupPolicy,backup_policy +BackupPolicyDescription,backup_policy_description +BackupPolicyNotFoundFault,backup_policy_not_found_fault +BackupProgressInMegaBytes,backup_progress_in_mega_bytes +BackupRestoring,backup_restoring +BackupRetentionCount,backup_retention_count +BackupRetentionPeriod,backup_retention_period +BackupRetentionPolicy,backup_retention_policy +BackupRule,backup_rule +BackupRuleId,backup_rule_id +BackupRuleInput,backup_rule_input +BackupSelection,backup_selection +BackupSelectionsList,backup_selections_list +BackupSelectionsListMember,backup_selections_list_member +BackupSizeBytes,backup_size_bytes +BackupSizeInBytes,backup_size_in_bytes +BackupState,backup_state +BackupStatus,backup_status +BackupSummaries,backup_summaries +BackupSummary,backup_summary +BackupTarget,backup_target +BackupType,backup_type +BackupVaultAccountId,backup_vault_account_id +BackupVaultArn,backup_vault_arn +BackupVaultEvents,backup_vault_events +BackupVaultList,backup_vault_list +BackupVaultListMember,backup_vault_list_member +BackupVaultName,backup_vault_name +BackupVaultTags,backup_vault_tags +Backups,backups +BadDocumentException,bad_document_exception +BadGatewayException,bad_gateway_exception +BadRequest,bad_request +BadRequestDetail,bad_request_detail +BadRequestException,bad_request_exception +Badge,badge +Baidu,baidu +BaiduChannelRequest,baidu_channel_request +BaiduChannelResponse,baidu_channel_response +BaiduMessage,baidu_message +BalancingStrategy,balancing_strategy +BandFilter,band_filter +BandMathConfigInput,band_math_config_input +BandName,band_name +Bandwidth,bandwidth +BandwidthRateLimitInterval,bandwidth_rate_limit_interval +BandwidthRateLimitIntervals,bandwidth_rate_limit_intervals +BandwidthReductionFilter,bandwidth_reduction_filter +BandwidthType,bandwidth_type +BannerText,banner_text +BarChartAggregatedFieldWells,bar_chart_aggregated_field_wells +BarChartConfiguration,bar_chart_configuration +BarChartFieldWells,bar_chart_field_wells +BarChartSortConfiguration,bar_chart_sort_configuration +BarChartVisual,bar_chart_visual +BarDataLabels,bar_data_labels +BarValues,bar_values +BareMetal,bare_metal +BarsArrangement,bars_arrangement +Base,base +Base32StringSeed,base32_string_seed +Base64String,base64_string +BaseCanaryRunId,base_canary_run_id +BaseConfigurationItem,base_configuration_item +BaseConfigurationItems,base_configuration_items +BaseDirectory,base_directory +BaseEndpointDnsNames,base_endpoint_dns_names +BaseException,base_exception +BaseImage,base_image +BaseImageArn,base_image_arn +BaseKpiResult,base_kpi_result +BaseLat,base_lat +BaseLensVersion,base_lens_version +BaseLng,base_lng +BaseMapStyle,base_map_style +BaseModelName,base_model_name +BasePath,base_path +BasePathMapping,base_path_mapping +BasePathMappings,base_path_mappings +BasePathUpdate,base_path_update +BaseScore,base_score +BaseScreenshot,base_screenshot +BaseScreenshots,base_screenshots +BaseSeriesSettings,base_series_settings +BaseStationId,base_station_id +BaseThemeId,base_theme_id +BaseUrl,base_url +BaseUrlContent,base_url_content +BaseUrlContent1,base_url_content1 +BaseUrlManifest,base_url_manifest +BaseUrlManifest1,base_url_manifest1 +BaseVector,base_vector +BasedOnSpiceSchedule,based_on_spice_schedule +Baseline,baseline +BaselineBandwidthInGbps,baseline_bandwidth_in_gbps +BaselineBandwidthInMbps,baseline_bandwidth_in_mbps +BaselineConfig,baseline_config +BaselineData,baseline_data +BaselineDescription,baseline_description +BaselineEbsBandwidthMbps,baseline_ebs_bandwidth_mbps +BaselineEbsBandwidthMbpsRequest,baseline_ebs_bandwidth_mbps_request +BaselineId,baseline_id +BaselineIdentities,baseline_identities +BaselineIdentity,baseline_identity +BaselineIops,baseline_iops +BaselineMetric,baseline_metric +BaselineMetrics,baseline_metrics +BaselineName,baseline_name +BaselineOverride,baseline_override +BaselineThroughputInMBps,baseline_throughput_in_m_bps +BaselineUsedForDriftCheckConstraints,baseline_used_for_drift_check_constraints +BaselineUsedForDriftCheckStatistics,baseline_used_for_drift_check_statistics +BaseliningJobName,baselining_job_name +Basepath,basepath +BasicAuthCredentials,basic_auth_credentials +BasicAuthParameters,basic_auth_parameters +BasicAuthSecretId,basic_auth_secret_id +BasicAuthentication,basic_authentication +BasicAuthenticationConfiguration,basic_authentication_configuration +BasicCatalogTarget,basic_catalog_target +BasicLayout,basic_layout +Batch,batch +BatchAcknowledgeAlarmRequest,batch_acknowledge_alarm_request +BatchAcknowledgeAlarmResponse,batch_acknowledge_alarm_response +BatchAddFacetToObject,batch_add_facet_to_object +BatchAlarmActionErrorEntry,batch_alarm_action_error_entry +BatchApplyUpdateActionMessage,batch_apply_update_action_message +BatchArrayProperties,batch_array_properties +BatchAssociateApprovalRuleTemplateWithRepositoriesError,batch_associate_approval_rule_template_with_repositories_error +BatchAssociateApprovalRuleTemplateWithRepositoriesInput,batch_associate_approval_rule_template_with_repositories_input +BatchAssociateApprovalRuleTemplateWithRepositoriesOutput,batch_associate_approval_rule_template_with_repositories_output +BatchAssociateAssessmentReportEvidenceRequest,batch_associate_assessment_report_evidence_request +BatchAssociateAssessmentReportEvidenceResponse,batch_associate_assessment_report_evidence_response +BatchAssociateClientDeviceWithCoreDeviceRequest,batch_associate_client_device_with_core_device_request +BatchAssociateClientDeviceWithCoreDeviceResponse,batch_associate_client_device_with_core_device_response +BatchAssociateProjectAssetsRequest,batch_associate_project_assets_request +BatchAssociateProjectAssetsResponse,batch_associate_project_assets_response +BatchAssociateResourceRequest,batch_associate_resource_request +BatchAssociateResourceResponse,batch_associate_resource_response +BatchAssociateResourcesToCustomLineItemInput,batch_associate_resources_to_custom_line_item_input +BatchAssociateResourcesToCustomLineItemOutput,batch_associate_resources_to_custom_line_item_output +BatchAssociateScramSecretRequest,batch_associate_scram_secret_request +BatchAssociateScramSecretResponse,batch_associate_scram_secret_response +BatchAssociateServiceActionWithProvisioningArtifactInput,batch_associate_service_action_with_provisioning_artifact_input +BatchAssociateServiceActionWithProvisioningArtifactOutput,batch_associate_service_action_with_provisioning_artifact_output +BatchAssociateUserStackRequest,batch_associate_user_stack_request +BatchAssociateUserStackResult,batch_associate_user_stack_result +BatchAttachObject,batch_attach_object +BatchAttachObjectResponse,batch_attach_object_response +BatchAttachPolicy,batch_attach_policy +BatchAttachToIndex,batch_attach_to_index +BatchAttachToIndexResponse,batch_attach_to_index_response +BatchAttachTypedLink,batch_attach_typed_link +BatchAttachTypedLinkResponse,batch_attach_typed_link_response +BatchChannelMemberships,batch_channel_memberships +BatchCheckLayerAvailabilityRequest,batch_check_layer_availability_request +BatchCheckLayerAvailabilityResponse,batch_check_layer_availability_response +BatchContainerOverrides,batch_container_overrides +BatchCount,batch_count +BatchCreateAttendeeRequest,batch_create_attendee_request +BatchCreateAttendeeResponse,batch_create_attendee_response +BatchCreateChannelMembershipError,batch_create_channel_membership_error +BatchCreateChannelMembershipRequest,batch_create_channel_membership_request +BatchCreateChannelMembershipResponse,batch_create_channel_membership_response +BatchCreateCustomVocabularyItemRequest,batch_create_custom_vocabulary_item_request +BatchCreateCustomVocabularyItemResponse,batch_create_custom_vocabulary_item_response +BatchCreateDelegationByAssessmentError,batch_create_delegation_by_assessment_error +BatchCreateDelegationByAssessmentRequest,batch_create_delegation_by_assessment_request +BatchCreateDelegationByAssessmentResponse,batch_create_delegation_by_assessment_response +BatchCreateIndex,batch_create_index +BatchCreateIndexResponse,batch_create_index_response +BatchCreateObject,batch_create_object +BatchCreateObjectResponse,batch_create_object_response +BatchCreatePartitionRequest,batch_create_partition_request +BatchCreatePartitionResponse,batch_create_partition_response +BatchCreateRoomMembershipRequest,batch_create_room_membership_request +BatchCreateRoomMembershipResponse,batch_create_room_membership_response +BatchCreateRumMetricDefinitionsError,batch_create_rum_metric_definitions_error +BatchCreateRumMetricDefinitionsRequest,batch_create_rum_metric_definitions_request +BatchCreateRumMetricDefinitionsResponse,batch_create_rum_metric_definitions_response +BatchCreateTableRowsRequest,batch_create_table_rows_request +BatchCreateTableRowsResult,batch_create_table_rows_result +BatchCreateVariableError,batch_create_variable_error +BatchCreateVariableRequest,batch_create_variable_request +BatchCreateVariableResult,batch_create_variable_result +BatchCreateVehicleRequest,batch_create_vehicle_request +BatchCreateVehicleResponse,batch_create_vehicle_response +BatchDataCaptureConfig,batch_data_capture_config +BatchDeleteAutomationRulesRequest,batch_delete_automation_rules_request +BatchDeleteAutomationRulesResponse,batch_delete_automation_rules_response +BatchDeleteBuildsInput,batch_delete_builds_input +BatchDeleteBuildsOutput,batch_delete_builds_output +BatchDeleteClusterSnapshotsRequest,batch_delete_cluster_snapshots_request +BatchDeleteClusterSnapshotsResult,batch_delete_cluster_snapshots_result +BatchDeleteConnectionRequest,batch_delete_connection_request +BatchDeleteConnectionResponse,batch_delete_connection_response +BatchDeleteCustomVocabularyItemRequest,batch_delete_custom_vocabulary_item_request +BatchDeleteCustomVocabularyItemResponse,batch_delete_custom_vocabulary_item_response +BatchDeleteDelegationByAssessmentError,batch_delete_delegation_by_assessment_error +BatchDeleteDelegationByAssessmentRequest,batch_delete_delegation_by_assessment_request +BatchDeleteDelegationByAssessmentResponse,batch_delete_delegation_by_assessment_response +BatchDeleteDetectorErrorEntry,batch_delete_detector_error_entry +BatchDeleteDetectorRequest,batch_delete_detector_request +BatchDeleteDetectorResponse,batch_delete_detector_response +BatchDeleteDevicePositionHistoryError,batch_delete_device_position_history_error +BatchDeleteDevicePositionHistoryRequest,batch_delete_device_position_history_request +BatchDeleteDevicePositionHistoryResponse,batch_delete_device_position_history_response +BatchDeleteDocumentRequest,batch_delete_document_request +BatchDeleteDocumentResponse,batch_delete_document_response +BatchDeleteDocumentResponseFailedDocument,batch_delete_document_response_failed_document +BatchDeleteFeaturedResultsSetError,batch_delete_featured_results_set_error +BatchDeleteFeaturedResultsSetRequest,batch_delete_featured_results_set_request +BatchDeleteFeaturedResultsSetResponse,batch_delete_featured_results_set_response +BatchDeleteGeofenceError,batch_delete_geofence_error +BatchDeleteGeofenceRequest,batch_delete_geofence_request +BatchDeleteGeofenceResponse,batch_delete_geofence_response +BatchDeleteImageRequest,batch_delete_image_request +BatchDeleteImageResponse,batch_delete_image_response +BatchDeleteImportDataError,batch_delete_import_data_error +BatchDeleteImportDataRequest,batch_delete_import_data_request +BatchDeleteImportDataResponse,batch_delete_import_data_response +BatchDeleteObject,batch_delete_object +BatchDeletePartitionRequest,batch_delete_partition_request +BatchDeletePartitionResponse,batch_delete_partition_response +BatchDeletePhoneNumberRequest,batch_delete_phone_number_request +BatchDeletePhoneNumberResponse,batch_delete_phone_number_response +BatchDeleteReadSetRequest,batch_delete_read_set_request +BatchDeleteReadSetResponse,batch_delete_read_set_response +BatchDeleteRecipeVersionRequest,batch_delete_recipe_version_request +BatchDeleteRecipeVersionResponse,batch_delete_recipe_version_response +BatchDeleteRequest,batch_delete_request +BatchDeleteRequestSizeExceededFault,batch_delete_request_size_exceeded_fault +BatchDeleteResponse,batch_delete_response +BatchDeleteRumMetricDefinitionsError,batch_delete_rum_metric_definitions_error +BatchDeleteRumMetricDefinitionsRequest,batch_delete_rum_metric_definitions_request +BatchDeleteRumMetricDefinitionsResponse,batch_delete_rum_metric_definitions_response +BatchDeleteScheduledActionAnswer,batch_delete_scheduled_action_answer +BatchDeleteScheduledActionType,batch_delete_scheduled_action_type +BatchDeleteTableRequest,batch_delete_table_request +BatchDeleteTableResponse,batch_delete_table_response +BatchDeleteTableRowsRequest,batch_delete_table_rows_request +BatchDeleteTableRowsResult,batch_delete_table_rows_result +BatchDeleteTableVersionRequest,batch_delete_table_version_request +BatchDeleteTableVersionResponse,batch_delete_table_version_response +BatchDeleteWorldsRequest,batch_delete_worlds_request +BatchDeleteWorldsResponse,batch_delete_worlds_response +BatchDescribeMergeConflictsError,batch_describe_merge_conflicts_error +BatchDescribeMergeConflictsInput,batch_describe_merge_conflicts_input +BatchDescribeMergeConflictsOutput,batch_describe_merge_conflicts_output +BatchDescribeModelPackageError,batch_describe_model_package_error +BatchDescribeModelPackageErrorMap,batch_describe_model_package_error_map +BatchDescribeModelPackageInput,batch_describe_model_package_input +BatchDescribeModelPackageOutput,batch_describe_model_package_output +BatchDescribeModelPackageSummary,batch_describe_model_package_summary +BatchDescribeSimulationJobRequest,batch_describe_simulation_job_request +BatchDescribeSimulationJobResponse,batch_describe_simulation_job_response +BatchDescribeTypeConfigurationsError,batch_describe_type_configurations_error +BatchDescribeTypeConfigurationsInput,batch_describe_type_configurations_input +BatchDescribeTypeConfigurationsOutput,batch_describe_type_configurations_output +BatchDetachFromIndex,batch_detach_from_index +BatchDetachFromIndexResponse,batch_detach_from_index_response +BatchDetachObject,batch_detach_object +BatchDetachObjectResponse,batch_detach_object_response +BatchDetachPolicy,batch_detach_policy +BatchDetachTypedLink,batch_detach_typed_link +BatchDetectDominantLanguageItemResult,batch_detect_dominant_language_item_result +BatchDetectDominantLanguageRequest,batch_detect_dominant_language_request +BatchDetectDominantLanguageResponse,batch_detect_dominant_language_response +BatchDetectEntitiesItemResult,batch_detect_entities_item_result +BatchDetectEntitiesRequest,batch_detect_entities_request +BatchDetectEntitiesResponse,batch_detect_entities_response +BatchDetectKeyPhrasesItemResult,batch_detect_key_phrases_item_result +BatchDetectKeyPhrasesRequest,batch_detect_key_phrases_request +BatchDetectKeyPhrasesResponse,batch_detect_key_phrases_response +BatchDetectSentimentItemResult,batch_detect_sentiment_item_result +BatchDetectSentimentRequest,batch_detect_sentiment_request +BatchDetectSentimentResponse,batch_detect_sentiment_response +BatchDetectSyntaxItemResult,batch_detect_syntax_item_result +BatchDetectSyntaxRequest,batch_detect_syntax_request +BatchDetectSyntaxResponse,batch_detect_syntax_response +BatchDetectTargetedSentimentItemResult,batch_detect_targeted_sentiment_item_result +BatchDetectTargetedSentimentRequest,batch_detect_targeted_sentiment_request +BatchDetectTargetedSentimentResponse,batch_detect_targeted_sentiment_response +BatchDisableAlarmRequest,batch_disable_alarm_request +BatchDisableAlarmResponse,batch_disable_alarm_response +BatchDisableStandardsRequest,batch_disable_standards_request +BatchDisableStandardsResponse,batch_disable_standards_response +BatchDisassociateApprovalRuleTemplateFromRepositoriesError,batch_disassociate_approval_rule_template_from_repositories_error +BatchDisassociateApprovalRuleTemplateFromRepositoriesInput,batch_disassociate_approval_rule_template_from_repositories_input +BatchDisassociateApprovalRuleTemplateFromRepositoriesOutput,batch_disassociate_approval_rule_template_from_repositories_output +BatchDisassociateAssessmentReportEvidenceRequest,batch_disassociate_assessment_report_evidence_request +BatchDisassociateAssessmentReportEvidenceResponse,batch_disassociate_assessment_report_evidence_response +BatchDisassociateClientDeviceFromCoreDeviceRequest,batch_disassociate_client_device_from_core_device_request +BatchDisassociateClientDeviceFromCoreDeviceResponse,batch_disassociate_client_device_from_core_device_response +BatchDisassociateProjectAssetsRequest,batch_disassociate_project_assets_request +BatchDisassociateProjectAssetsResponse,batch_disassociate_project_assets_response +BatchDisassociateResourceRequest,batch_disassociate_resource_request +BatchDisassociateResourceResponse,batch_disassociate_resource_response +BatchDisassociateResourcesFromCustomLineItemInput,batch_disassociate_resources_from_custom_line_item_input +BatchDisassociateResourcesFromCustomLineItemOutput,batch_disassociate_resources_from_custom_line_item_output +BatchDisassociateScramSecretRequest,batch_disassociate_scram_secret_request +BatchDisassociateScramSecretResponse,batch_disassociate_scram_secret_response +BatchDisassociateServiceActionFromProvisioningArtifactInput,batch_disassociate_service_action_from_provisioning_artifact_input +BatchDisassociateServiceActionFromProvisioningArtifactOutput,batch_disassociate_service_action_from_provisioning_artifact_output +BatchDisassociateUserStackRequest,batch_disassociate_user_stack_request +BatchDisassociateUserStackResult,batch_disassociate_user_stack_result +BatchEnableAlarmRequest,batch_enable_alarm_request +BatchEnableAlarmResponse,batch_enable_alarm_response +BatchEnableStandardsRequest,batch_enable_standards_request +BatchEnableStandardsResponse,batch_enable_standards_response +BatchEntryIdsNotDistinctException,batch_entry_ids_not_distinct_exception +BatchEnvironmentVariable,batch_environment_variable +BatchError,batch_error +BatchEvaluateFeatureRequest,batch_evaluate_feature_request +BatchEvaluateFeatureResponse,batch_evaluate_feature_response +BatchEvaluateGeofencesError,batch_evaluate_geofences_error +BatchEvaluateGeofencesRequest,batch_evaluate_geofences_request +BatchEvaluateGeofencesResponse,batch_evaluate_geofences_response +BatchExecuteStatementException,batch_execute_statement_exception +BatchExecuteStatementInput,batch_execute_statement_input +BatchExecuteStatementOutput,batch_execute_statement_output +BatchExecuteStatementRequest,batch_execute_statement_request +BatchExecuteStatementResponse,batch_execute_statement_response +BatchFailedResultModel,batch_failed_result_model +BatchGetAccountStatusRequest,batch_get_account_status_request +BatchGetAccountStatusResponse,batch_get_account_status_response +BatchGetAggregateResourceConfigRequest,batch_get_aggregate_resource_config_request +BatchGetAggregateResourceConfigResponse,batch_get_aggregate_resource_config_response +BatchGetApplicationRevisionsInput,batch_get_application_revisions_input +BatchGetApplicationRevisionsOutput,batch_get_application_revisions_output +BatchGetApplicationsInput,batch_get_applications_input +BatchGetApplicationsOutput,batch_get_applications_output +BatchGetAssetPropertyAggregatesEntry,batch_get_asset_property_aggregates_entry +BatchGetAssetPropertyAggregatesErrorEntry,batch_get_asset_property_aggregates_error_entry +BatchGetAssetPropertyAggregatesErrorInfo,batch_get_asset_property_aggregates_error_info +BatchGetAssetPropertyAggregatesRequest,batch_get_asset_property_aggregates_request +BatchGetAssetPropertyAggregatesResponse,batch_get_asset_property_aggregates_response +BatchGetAssetPropertyAggregatesSkippedEntry,batch_get_asset_property_aggregates_skipped_entry +BatchGetAssetPropertyAggregatesSuccessEntry,batch_get_asset_property_aggregates_success_entry +BatchGetAssetPropertyValueEntry,batch_get_asset_property_value_entry +BatchGetAssetPropertyValueErrorEntry,batch_get_asset_property_value_error_entry +BatchGetAssetPropertyValueErrorInfo,batch_get_asset_property_value_error_info +BatchGetAssetPropertyValueHistoryEntry,batch_get_asset_property_value_history_entry +BatchGetAssetPropertyValueHistoryErrorEntry,batch_get_asset_property_value_history_error_entry +BatchGetAssetPropertyValueHistoryErrorInfo,batch_get_asset_property_value_history_error_info +BatchGetAssetPropertyValueHistoryRequest,batch_get_asset_property_value_history_request +BatchGetAssetPropertyValueHistoryResponse,batch_get_asset_property_value_history_response +BatchGetAssetPropertyValueHistorySkippedEntry,batch_get_asset_property_value_history_skipped_entry +BatchGetAssetPropertyValueHistorySuccessEntry,batch_get_asset_property_value_history_success_entry +BatchGetAssetPropertyValueRequest,batch_get_asset_property_value_request +BatchGetAssetPropertyValueResponse,batch_get_asset_property_value_response +BatchGetAssetPropertyValueSkippedEntry,batch_get_asset_property_value_skipped_entry +BatchGetAssetPropertyValueSuccessEntry,batch_get_asset_property_value_success_entry +BatchGetAutomationRulesRequest,batch_get_automation_rules_request +BatchGetAutomationRulesResponse,batch_get_automation_rules_response +BatchGetBlueprintsRequest,batch_get_blueprints_request +BatchGetBlueprintsResponse,batch_get_blueprints_response +BatchGetBuildBatchesInput,batch_get_build_batches_input +BatchGetBuildBatchesOutput,batch_get_build_batches_output +BatchGetBuildsInput,batch_get_builds_input +BatchGetBuildsOutput,batch_get_builds_output +BatchGetChannelRequest,batch_get_channel_request +BatchGetChannelResponse,batch_get_channel_response +BatchGetCodeSnippetRequest,batch_get_code_snippet_request +BatchGetCodeSnippetResponse,batch_get_code_snippet_response +BatchGetCollaborationAnalysisTemplateError,batch_get_collaboration_analysis_template_error +BatchGetCollaborationAnalysisTemplateInput,batch_get_collaboration_analysis_template_input +BatchGetCollaborationAnalysisTemplateOutput,batch_get_collaboration_analysis_template_output +BatchGetCollectionRequest,batch_get_collection_request +BatchGetCollectionResponse,batch_get_collection_response +BatchGetCommitsError,batch_get_commits_error +BatchGetCommitsInput,batch_get_commits_input +BatchGetCommitsOutput,batch_get_commits_output +BatchGetCrawlersRequest,batch_get_crawlers_request +BatchGetCrawlersResponse,batch_get_crawlers_response +BatchGetCustomDataIdentifierSummary,batch_get_custom_data_identifier_summary +BatchGetCustomDataIdentifiersRequest,batch_get_custom_data_identifiers_request +BatchGetCustomDataIdentifiersResponse,batch_get_custom_data_identifiers_response +BatchGetCustomEntityTypesRequest,batch_get_custom_entity_types_request +BatchGetCustomEntityTypesResponse,batch_get_custom_entity_types_response +BatchGetDataQualityResultRequest,batch_get_data_quality_result_request +BatchGetDataQualityResultResponse,batch_get_data_quality_result_response +BatchGetDeploymentGroupsInput,batch_get_deployment_groups_input +BatchGetDeploymentGroupsOutput,batch_get_deployment_groups_output +BatchGetDeploymentInstancesInput,batch_get_deployment_instances_input +BatchGetDeploymentInstancesOutput,batch_get_deployment_instances_output +BatchGetDeploymentTargetsInput,batch_get_deployment_targets_input +BatchGetDeploymentTargetsOutput,batch_get_deployment_targets_output +BatchGetDeploymentsInput,batch_get_deployments_input +BatchGetDeploymentsOutput,batch_get_deployments_output +BatchGetDevEndpointsRequest,batch_get_dev_endpoints_request +BatchGetDevEndpointsResponse,batch_get_dev_endpoints_response +BatchGetDevicePositionError,batch_get_device_position_error +BatchGetDevicePositionRequest,batch_get_device_position_request +BatchGetDevicePositionResponse,batch_get_device_position_response +BatchGetDocumentStatusRequest,batch_get_document_status_request +BatchGetDocumentStatusResponse,batch_get_document_status_response +BatchGetDocumentStatusResponseError,batch_get_document_status_response_error +BatchGetFieldRequest,batch_get_field_request +BatchGetFieldResponse,batch_get_field_response +BatchGetFindingDetailsRequest,batch_get_finding_details_request +BatchGetFindingDetailsResponse,batch_get_finding_details_response +BatchGetFindingsError,batch_get_findings_error +BatchGetFindingsRequest,batch_get_findings_request +BatchGetFindingsResponse,batch_get_findings_response +BatchGetFrameMetricDataRequest,batch_get_frame_metric_data_request +BatchGetFrameMetricDataResponse,batch_get_frame_metric_data_response +BatchGetFreeTrialInfoRequest,batch_get_free_trial_info_request +BatchGetFreeTrialInfoResponse,batch_get_free_trial_info_response +BatchGetGraphMemberDatasourcesRequest,batch_get_graph_member_datasources_request +BatchGetGraphMemberDatasourcesResponse,batch_get_graph_member_datasources_response +BatchGetImageRequest,batch_get_image_request +BatchGetImageResponse,batch_get_image_response +BatchGetItemInput,batch_get_item_input +BatchGetItemOutput,batch_get_item_output +BatchGetJobsRequest,batch_get_jobs_request +BatchGetJobsResponse,batch_get_jobs_response +BatchGetLinkAttributes,batch_get_link_attributes +BatchGetLinkAttributesResponse,batch_get_link_attributes_response +BatchGetMemberEc2DeepInspectionStatusRequest,batch_get_member_ec2_deep_inspection_status_request +BatchGetMemberEc2DeepInspectionStatusResponse,batch_get_member_ec2_deep_inspection_status_response +BatchGetMembershipDatasourcesRequest,batch_get_membership_datasources_request +BatchGetMembershipDatasourcesResponse,batch_get_membership_datasources_response +BatchGetMetricDataQuery,batch_get_metric_data_query +BatchGetMetricDataRequest,batch_get_metric_data_request +BatchGetMetricDataResponse,batch_get_metric_data_response +BatchGetNamedQueryInput,batch_get_named_query_input +BatchGetNamedQueryOutput,batch_get_named_query_output +BatchGetObjectAttributes,batch_get_object_attributes +BatchGetObjectAttributesResponse,batch_get_object_attributes_response +BatchGetObjectInformation,batch_get_object_information +BatchGetObjectInformationResponse,batch_get_object_information_response +BatchGetOnPremisesInstancesInput,batch_get_on_premises_instances_input +BatchGetOnPremisesInstancesOutput,batch_get_on_premises_instances_output +BatchGetPartitionRequest,batch_get_partition_request +BatchGetPartitionResponse,batch_get_partition_response +BatchGetPreparedStatementInput,batch_get_prepared_statement_input +BatchGetPreparedStatementOutput,batch_get_prepared_statement_output +BatchGetProjectsInput,batch_get_projects_input +BatchGetProjectsOutput,batch_get_projects_output +BatchGetQueryExecutionInput,batch_get_query_execution_input +BatchGetQueryExecutionOutput,batch_get_query_execution_output +BatchGetRecordError,batch_get_record_error +BatchGetRecordIdentifier,batch_get_record_identifier +BatchGetRecordRequest,batch_get_record_request +BatchGetRecordResponse,batch_get_record_response +BatchGetRecordResultDetail,batch_get_record_result_detail +BatchGetReportGroupsInput,batch_get_report_groups_input +BatchGetReportGroupsOutput,batch_get_report_groups_output +BatchGetReportsInput,batch_get_reports_input +BatchGetReportsOutput,batch_get_reports_output +BatchGetRepositoriesInput,batch_get_repositories_input +BatchGetRepositoriesOutput,batch_get_repositories_output +BatchGetRepositoryScanningConfigurationRequest,batch_get_repository_scanning_configuration_request +BatchGetRepositoryScanningConfigurationResponse,batch_get_repository_scanning_configuration_response +BatchGetResourceConfigRequest,batch_get_resource_config_request +BatchGetResourceConfigResponse,batch_get_resource_config_response +BatchGetRumMetricDefinitionsRequest,batch_get_rum_metric_definitions_request +BatchGetRumMetricDefinitionsResponse,batch_get_rum_metric_definitions_response +BatchGetSchemaError,batch_get_schema_error +BatchGetSchemaInput,batch_get_schema_input +BatchGetSchemaOutput,batch_get_schema_output +BatchGetSecurityControlsRequest,batch_get_security_controls_request +BatchGetSecurityControlsResponse,batch_get_security_controls_response +BatchGetStandardsControlAssociationsRequest,batch_get_standards_control_associations_request +BatchGetStandardsControlAssociationsResponse,batch_get_standards_control_associations_response +BatchGetStreamKeyRequest,batch_get_stream_key_request +BatchGetStreamKeyResponse,batch_get_stream_key_response +BatchGetTokenBalanceErrorItem,batch_get_token_balance_error_item +BatchGetTokenBalanceInput,batch_get_token_balance_input +BatchGetTokenBalanceInputItem,batch_get_token_balance_input_item +BatchGetTokenBalanceOutput,batch_get_token_balance_output +BatchGetTokenBalanceOutputItem,batch_get_token_balance_output_item +BatchGetTracesRequest,batch_get_traces_request +BatchGetTracesResult,batch_get_traces_result +BatchGetTriggersRequest,batch_get_triggers_request +BatchGetTriggersResponse,batch_get_triggers_response +BatchGetUserAccessTasksRequest,batch_get_user_access_tasks_request +BatchGetUserAccessTasksResponse,batch_get_user_access_tasks_response +BatchGetVariableError,batch_get_variable_error +BatchGetVariableRequest,batch_get_variable_request +BatchGetVariableResult,batch_get_variable_result +BatchGetViewError,batch_get_view_error +BatchGetViewInput,batch_get_view_input +BatchGetViewOutput,batch_get_view_output +BatchGetVpcEndpointRequest,batch_get_vpc_endpoint_request +BatchGetVpcEndpointResponse,batch_get_vpc_endpoint_response +BatchGetWorkflowsRequest,batch_get_workflows_request +BatchGetWorkflowsResponse,batch_get_workflows_response +BatchGrantPermissionsRequest,batch_grant_permissions_request +BatchGrantPermissionsResponse,batch_grant_permissions_response +BatchId,batch_id +BatchImport,batch_import +BatchImportEvidenceToAssessmentControlError,batch_import_evidence_to_assessment_control_error +BatchImportEvidenceToAssessmentControlRequest,batch_import_evidence_to_assessment_control_request +BatchImportEvidenceToAssessmentControlResponse,batch_import_evidence_to_assessment_control_response +BatchImportFindingsRequest,batch_import_findings_request +BatchImportFindingsResponse,batch_import_findings_response +BatchImportMetaDataOnCreate,batch_import_meta_data_on_create +BatchInferenceJob,batch_inference_job +BatchInferenceJobConfig,batch_inference_job_config +BatchInferenceJobInput,batch_inference_job_input +BatchInferenceJobOutput,batch_inference_job_output +BatchInferenceJobSummary,batch_inference_job_summary +BatchItem,batch_item +BatchItemError,batch_item_error +BatchJobDependency,batch_job_dependency +BatchJobExecutionSummary,batch_job_execution_summary +BatchJobParameters,batch_job_parameters +BatchLimitExceededException,batch_limit_exceeded_exception +BatchListAttachedIndices,batch_list_attached_indices +BatchListAttachedIndicesResponse,batch_list_attached_indices_response +BatchListIncomingTypedLinks,batch_list_incoming_typed_links +BatchListIncomingTypedLinksResponse,batch_list_incoming_typed_links_response +BatchListIndex,batch_list_index +BatchListIndexResponse,batch_list_index_response +BatchListObjectAttributes,batch_list_object_attributes +BatchListObjectAttributesResponse,batch_list_object_attributes_response +BatchListObjectChildren,batch_list_object_children +BatchListObjectChildrenResponse,batch_list_object_children_response +BatchListObjectParentPaths,batch_list_object_parent_paths +BatchListObjectParentPathsResponse,batch_list_object_parent_paths_response +BatchListObjectParents,batch_list_object_parents +BatchListObjectParentsResponse,batch_list_object_parents_response +BatchListObjectPolicies,batch_list_object_policies +BatchListObjectPoliciesResponse,batch_list_object_policies_response +BatchListOutgoingTypedLinks,batch_list_outgoing_typed_links +BatchListOutgoingTypedLinksResponse,batch_list_outgoing_typed_links_response +BatchListPolicyAttachments,batch_list_policy_attachments +BatchListPolicyAttachmentsResponse,batch_list_policy_attachments_response +BatchLoadProgressReport,batch_load_progress_report +BatchLoadTask,batch_load_task +BatchLoadTaskDescription,batch_load_task_description +BatchLoadTasks,batch_load_tasks +BatchLookupPolicy,batch_lookup_policy +BatchLookupPolicyResponse,batch_lookup_policy_response +BatchMeterUsageRequest,batch_meter_usage_request +BatchMeterUsageResult,batch_meter_usage_result +BatchModifyClusterSnapshotsLimitExceededFault,batch_modify_cluster_snapshots_limit_exceeded_fault +BatchModifyClusterSnapshotsMessage,batch_modify_cluster_snapshots_message +BatchModifyClusterSnapshotsOutputMessage,batch_modify_cluster_snapshots_output_message +BatchParameters,batch_parameters +BatchPermissionsFailureEntry,batch_permissions_failure_entry +BatchPermissionsRequestEntry,batch_permissions_request_entry +BatchPolicy,batch_policy +BatchPrediction,batch_prediction +BatchPredictionDataSourceId,batch_prediction_data_source_id +BatchPredictionId,batch_prediction_id +BatchPredictionName,batch_prediction_name +BatchPutAssetPropertyError,batch_put_asset_property_error +BatchPutAssetPropertyErrorEntry,batch_put_asset_property_error_entry +BatchPutAssetPropertyValueRequest,batch_put_asset_property_value_request +BatchPutAssetPropertyValueResponse,batch_put_asset_property_value_response +BatchPutDocumentRequest,batch_put_document_request +BatchPutDocumentResponse,batch_put_document_response +BatchPutDocumentResponseFailedDocument,batch_put_document_response_failed_document +BatchPutFieldOptionsRequest,batch_put_field_options_request +BatchPutFieldOptionsResponse,batch_put_field_options_response +BatchPutGeofenceError,batch_put_geofence_error +BatchPutGeofenceRequest,batch_put_geofence_request +BatchPutGeofenceRequestEntry,batch_put_geofence_request_entry +BatchPutGeofenceResponse,batch_put_geofence_response +BatchPutGeofenceSuccess,batch_put_geofence_success +BatchPutMessageErrorEntries,batch_put_message_error_entries +BatchPutMessageErrorEntry,batch_put_message_error_entry +BatchPutMessageRequest,batch_put_message_request +BatchPutMessageResponse,batch_put_message_response +BatchPutMetricsError,batch_put_metrics_error +BatchPutMetricsRequest,batch_put_metrics_request +BatchPutMetricsResponse,batch_put_metrics_response +BatchPutPropertyError,batch_put_property_error +BatchPutPropertyErrorEntry,batch_put_property_error_entry +BatchPutPropertyValuesRequest,batch_put_property_values_request +BatchPutPropertyValuesResponse,batch_put_property_values_response +BatchPutScheduledUpdateGroupActionAnswer,batch_put_scheduled_update_group_action_answer +BatchPutScheduledUpdateGroupActionType,batch_put_scheduled_update_group_action_type +BatchReadException,batch_read_exception +BatchReadOperation,batch_read_operation +BatchReadOperationResponse,batch_read_operation_response +BatchReadRequest,batch_read_request +BatchReadResponse,batch_read_response +BatchReadSuccessfulResponse,batch_read_successful_response +BatchRecordsEndTime,batch_records_end_time +BatchRecordsStartTime,batch_records_start_time +BatchReferenceName,batch_reference_name +BatchRemoveFacetFromObject,batch_remove_facet_from_object +BatchRequestTooLongException,batch_request_too_long_exception +BatchResetAlarmRequest,batch_reset_alarm_request +BatchResetAlarmResponse,batch_reset_alarm_response +BatchResourceRequirement,batch_resource_requirement +BatchRestrictions,batch_restrictions +BatchResultErrorEntry,batch_result_error_entry +BatchRetryStrategy,batch_retry_strategy +BatchRevokePermissionsRequest,batch_revoke_permissions_request +BatchRevokePermissionsResponse,batch_revoke_permissions_response +BatchScheduleActionCreateRequest,batch_schedule_action_create_request +BatchScheduleActionCreateResult,batch_schedule_action_create_result +BatchScheduleActionDeleteRequest,batch_schedule_action_delete_request +BatchScheduleActionDeleteResult,batch_schedule_action_delete_result +BatchSegmentJob,batch_segment_job +BatchSegmentJobInput,batch_segment_job_input +BatchSegmentJobOutput,batch_segment_job_output +BatchSegmentJobSummary,batch_segment_job_summary +BatchSize,batch_size +BatchSizeLimitExceededException,batch_size_limit_exceeded_exception +BatchSnoozeAlarmRequest,batch_snooze_alarm_request +BatchSnoozeAlarmResponse,batch_snooze_alarm_response +BatchStartRecommendationsErrorEntry,batch_start_recommendations_error_entry +BatchStartRecommendationsRequest,batch_start_recommendations_request +BatchStartRecommendationsResponse,batch_start_recommendations_response +BatchStartRequest,batch_start_request +BatchStartResponse,batch_start_response +BatchStartViewerSessionRevocationError,batch_start_viewer_session_revocation_error +BatchStartViewerSessionRevocationRequest,batch_start_viewer_session_revocation_request +BatchStartViewerSessionRevocationResponse,batch_start_viewer_session_revocation_response +BatchStartViewerSessionRevocationViewerSession,batch_start_viewer_session_revocation_viewer_session +BatchStatementError,batch_statement_error +BatchStatementRequest,batch_statement_request +BatchStatementResponse,batch_statement_response +BatchStopJobRunError,batch_stop_job_run_error +BatchStopJobRunRequest,batch_stop_job_run_request +BatchStopJobRunResponse,batch_stop_job_run_response +BatchStopJobRunSuccessfulSubmission,batch_stop_job_run_successful_submission +BatchStopRequest,batch_stop_request +BatchStopResponse,batch_stop_response +BatchStopUpdateActionMessage,batch_stop_update_action_message +BatchStrategy,batch_strategy +BatchSuccessfulResultModel,batch_successful_result_model +BatchSuspendUserRequest,batch_suspend_user_request +BatchSuspendUserResponse,batch_suspend_user_response +BatchTooLarge,batch_too_large +BatchTransformInput,batch_transform_input +BatchUnsuspendUserRequest,batch_unsuspend_user_request +BatchUnsuspendUserResponse,batch_unsuspend_user_response +BatchUpdateAttendeeCapabilitiesExceptRequest,batch_update_attendee_capabilities_except_request +BatchUpdateAutomationRulesRequest,batch_update_automation_rules_request +BatchUpdateAutomationRulesResponse,batch_update_automation_rules_response +BatchUpdateClusterRequest,batch_update_cluster_request +BatchUpdateClusterResponse,batch_update_cluster_response +BatchUpdateCustomVocabularyItemRequest,batch_update_custom_vocabulary_item_request +BatchUpdateCustomVocabularyItemResponse,batch_update_custom_vocabulary_item_response +BatchUpdateDetectorErrorEntry,batch_update_detector_error_entry +BatchUpdateDetectorRequest,batch_update_detector_request +BatchUpdateDetectorResponse,batch_update_detector_response +BatchUpdateDevicePositionError,batch_update_device_position_error +BatchUpdateDevicePositionRequest,batch_update_device_position_request +BatchUpdateDevicePositionResponse,batch_update_device_position_response +BatchUpdateFindingsRequest,batch_update_findings_request +BatchUpdateFindingsResponse,batch_update_findings_response +BatchUpdateFindingsUnprocessedFinding,batch_update_findings_unprocessed_finding +BatchUpdateLinkAttributes,batch_update_link_attributes +BatchUpdateMemberEc2DeepInspectionStatusRequest,batch_update_member_ec2_deep_inspection_status_request +BatchUpdateMemberEc2DeepInspectionStatusResponse,batch_update_member_ec2_deep_inspection_status_response +BatchUpdateObjectAttributes,batch_update_object_attributes +BatchUpdateObjectAttributesResponse,batch_update_object_attributes_response +BatchUpdatePartitionFailureEntry,batch_update_partition_failure_entry +BatchUpdatePartitionRequest,batch_update_partition_request +BatchUpdatePartitionRequestEntry,batch_update_partition_request_entry +BatchUpdatePartitionResponse,batch_update_partition_response +BatchUpdatePhoneNumberRequest,batch_update_phone_number_request +BatchUpdatePhoneNumberResponse,batch_update_phone_number_response +BatchUpdateRecommendationStatusFailedEntry,batch_update_recommendation_status_failed_entry +BatchUpdateRecommendationStatusRequest,batch_update_recommendation_status_request +BatchUpdateRecommendationStatusResponse,batch_update_recommendation_status_response +BatchUpdateRecommendationStatusSuccessfulEntry,batch_update_recommendation_status_successful_entry +BatchUpdateRuleRequest,batch_update_rule_request +BatchUpdateRuleResponse,batch_update_rule_response +BatchUpdateScheduleRequest,batch_update_schedule_request +BatchUpdateScheduleResponse,batch_update_schedule_response +BatchUpdateStandardsControlAssociationsRequest,batch_update_standards_control_associations_request +BatchUpdateStandardsControlAssociationsResponse,batch_update_standards_control_associations_response +BatchUpdateTableRowsRequest,batch_update_table_rows_request +BatchUpdateTableRowsResult,batch_update_table_rows_result +BatchUpdateUserRequest,batch_update_user_request +BatchUpdateUserResponse,batch_update_user_response +BatchUpdateVehicleRequest,batch_update_vehicle_request +BatchUpdateVehicleResponse,batch_update_vehicle_response +BatchUpsertTableRowsRequest,batch_upsert_table_rows_request +BatchUpsertTableRowsResult,batch_upsert_table_rows_result +BatchWindow,batch_window +BatchWriteException,batch_write_exception +BatchWriteItemInput,batch_write_item_input +BatchWriteItemOutput,batch_write_item_output +BatchWriteOperation,batch_write_operation +BatchWriteOperationResponse,batch_write_operation_response +BatchWriteRequest,batch_write_request +BatchWriteResponse,batch_write_response +Batches,batches +BatteryLevel,battery_level +BccAddresses,bcc_addresses +Bcch,bcch +BcpPacketSize,bcp_packet_size +Beaconing,beaconing +Beard,beard +BearerToken,bearer_token +Before,before +BeforeCommitIdAndAfterCommitIdAreSameException,before_commit_id_and_after_commit_id_are_same_exception +BeforeCreationDate,before_creation_date +Begin,begin +BeginMarker,begin_marker +BeginOffset,begin_offset +BeginOffsetChar,begin_offset_char +BeginOffsetMillis,begin_offset_millis +BeginTransactionRequest,begin_transaction_request +BeginTransactionResponse,begin_transaction_response +Behavior,behavior +BehaviorCriteria,behavior_criteria +BehaviorModelTrainingSummary,behavior_model_training_summary +BehaviorOnMXFailure,behavior_on_mx_failure +BehaviorOnMxFailure,behavior_on_mx_failure +BehaviorType,behavior_type +Beneficiary,beneficiary +BenefitsConsidered,benefits_considered +BerkshelfVersion,berkshelf_version +BestCandidate,best_candidate +BestObjectiveNotImproving,best_objective_not_improving +BestPractice,best_practice +BestPractices,best_practices +BestTrainingJob,best_training_job +BgpAsn,bgp_asn +BgpConfigurations,bgp_configurations +BgpOptions,bgp_options +BgpStatus,bgp_status +Bias,bias +BiasPosition,bias_position +BidPrice,bid_price +BidPriceAsPercentageOfOnDemandPrice,bid_price_as_percentage_of_on_demand_price +BillDate,bill_date +BillExpirationException,bill_expiration_exception +BillableTimeInSeconds,billable_time_in_seconds +BillableTrainingTimeInSeconds,billable_training_time_in_seconds +BilledSizeBytes,billed_size_bytes +BillingAddress,billing_address +BillingDetails,billing_details +BillingEntity,billing_entity +BillingGroupArn,billing_group_arn +BillingGroupArns,billing_group_arns +BillingGroupCostReportElement,billing_group_cost_report_element +BillingGroupCostReports,billing_group_cost_reports +BillingGroupListElement,billing_group_list_element +BillingGroupMetadata,billing_group_metadata +BillingGroupProperties,billing_group_properties +BillingGroups,billing_groups +BillingMode,billing_mode +BillingModeOverride,billing_mode_override +BillingModeSummary,billing_mode_summary +BillingPeriod,billing_period +BillingPeriodRange,billing_period_range +BillingProducts,billing_products +BillingRecord,billing_record +BillingRecords,billing_records +BillingSubscriptionId,billing_subscription_id +BillingTagsSource,billing_tags_source +BillingToken,billing_token +BillingViewArn,billing_view_arn +BinCount,bin_count +BinCountLimit,bin_count_limit +BinCountOptions,bin_count_options +BinOptions,bin_options +BinWidth,bin_width +BinWidthOptions,bin_width_options +BinaryColumnStatisticsData,binary_column_statistics_data +BinaryFile,binary_file +BinaryListValues,binary_list_values +BinaryMediaTypes,binary_media_types +BinaryPrefixLocation,binary_prefix_location +BinaryValue,binary_value +BirthDate,birth_date +BisectBatchOnFunctionError,bisect_batch_on_function_error +BitDepth,bit_depth +BitOrder,bit_order +BitRate,bit_rate +Bitbucket,bitbucket +Bitrate,bitrate +BitrateClass,bitrate_class +BitsPerSecond,bits_per_second +BitstreamMode,bitstream_mode +BlackDetectThreshold,black_detect_threshold +BlackFrame,black_frame +BlackFrameMsec,black_frame_msec +Blackhole,blackhole +Blacklist,blacklist +BlacklistEntry,blacklist_entry +BlacklistItemNames,blacklist_item_names +BlacklistReport,blacklist_report +BlackoutSlate,blackout_slate +BlackoutSlateImage,blackout_slate_image +BlankCellFormat,blank_cell_format +Blob,blob +BlobAttributeValue,blob_attribute_value +BlobIdDoesNotExistException,blob_id_does_not_exist_exception +BlobIdRequiredException,blob_id_required_exception +BlobMetadata,blob_metadata +BlobType,blob_type +Block,block +BlockAction,block_action +BlockAddress,block_address +BlockData,block_data +BlockDeviceMapping,block_device_mapping +BlockDeviceMappingSet,block_device_mapping_set +BlockDeviceMappings,block_device_mappings +BlockDurationMinutes,block_duration_minutes +BlockEmail,block_email +BlockId,block_id +BlockIndex,block_index +BlockListSummaryItems,block_list_summary_items +BlockOverrideDnsType,block_override_dns_type +BlockOverrideDomain,block_override_domain +BlockOverrideTtl,block_override_ttl +BlockPublicAccess,block_public_access +BlockPublicAccessConfiguration,block_public_access_configuration +BlockPublicAccessConfigurationMetadata,block_public_access_configuration_metadata +BlockPublicAcls,block_public_acls +BlockPublicPolicy,block_public_policy +BlockPublicSecurityGroupRules,block_public_security_group_rules +BlockReference,block_reference +BlockReferences,block_references +BlockResponse,block_response +BlockSize,block_size +BlockSizeBytes,block_size_bytes +BlockToken,block_token +BlockType,block_type +BlockchainInstant,blockchain_instant +Blocked,blocked +BlockedException,blocked_exception +BlockedIPRangeList,blocked_ip_range_list +BlockedReason,blocked_reason +BlockerDeclaration,blocker_declaration +Blocks,blocks +BlogConfiguration,blog_configuration +BlogFieldMappings,blog_field_mappings +BloomFilterColumns,bloom_filter_columns +BloomFilterFalsePositiveProbability,bloom_filter_false_positive_probability +Blue,blue +BlueGreenDeployment,blue_green_deployment +BlueGreenDeploymentAlreadyExistsFault,blue_green_deployment_already_exists_fault +BlueGreenDeploymentConfiguration,blue_green_deployment_configuration +BlueGreenDeploymentIdentifier,blue_green_deployment_identifier +BlueGreenDeploymentName,blue_green_deployment_name +BlueGreenDeploymentNotFoundFault,blue_green_deployment_not_found_fault +BlueGreenDeploymentTask,blue_green_deployment_task +BlueGreenDeployments,blue_green_deployments +BlueGreenUpdatePolicy,blue_green_update_policy +BlueInstanceTerminationOption,blue_instance_termination_option +BluePrimaryX,blue_primary_x +BluePrimaryY,blue_primary_y +Blueprint,blueprint +BlueprintDetails,blueprint_details +BlueprintLocation,blueprint_location +BlueprintName,blueprint_name +BlueprintRun,blueprint_run +BlueprintRuns,blueprint_runs +BlueprintServiceLocation,blueprint_service_location +Blueprints,blueprints +Body,body +BodyConfig,body_config +BodyContains,body_contains +BodyOverride,body_override +BodyParameters,body_parameters +BodyParts,body_parts +BodySectionConfiguration,body_section_configuration +BodySectionContent,body_section_content +BodySections,body_sections +BonusAmount,bonus_amount +BonusPayment,bonus_payment +BonusPayments,bonus_payments +BookingOptions,booking_options +Bookmarks,bookmarks +BookmarksConfigurations,bookmarks_configurations +BooleanColumnStatisticsData,boolean_column_statistics_data +BooleanFilter,boolean_filter +BooleanValue,boolean_value +BootMode,boot_mode +Booting,booting +BootstrapActionConfig,bootstrap_action_config +BootstrapActionDetail,bootstrap_action_detail +BootstrapActions,bootstrap_actions +BootstrapBrokerString,bootstrap_broker_string +BootstrapBrokerStringPublicSaslIam,bootstrap_broker_string_public_sasl_iam +BootstrapBrokerStringPublicSaslScram,bootstrap_broker_string_public_sasl_scram +BootstrapBrokerStringPublicTls,bootstrap_broker_string_public_tls +BootstrapBrokerStringSaslIam,bootstrap_broker_string_sasl_iam +BootstrapBrokerStringSaslScram,bootstrap_broker_string_sasl_scram +BootstrapBrokerStringTls,bootstrap_broker_string_tls +BootstrapBrokerStringVpcConnectivitySaslIam,bootstrap_broker_string_vpc_connectivity_sasl_iam +BootstrapBrokerStringVpcConnectivitySaslScram,bootstrap_broker_string_vpc_connectivity_sasl_scram +BootstrapBrokerStringVpcConnectivityTls,bootstrap_broker_string_vpc_connectivity_tls +BootstrapServers,bootstrap_servers +Border,border +BorderColor,border_color +BorderRadius,border_radius +BorderStyle,border_style +BorderThickness,border_thickness +BorderVisibility,border_visibility +BorrowConfiguration,borrow_configuration +BorrowCount,borrow_count +Bot,bot +BotAliasHistoryEvent,bot_alias_history_event +BotAliasLocaleSettings,bot_alias_locale_settings +BotAliasMetadata,bot_alias_metadata +BotAliasSummary,bot_alias_summary +BotAliasTestExecutionTarget,bot_alias_test_execution_target +BotAliases,bot_aliases +BotChannelAssociation,bot_channel_association +BotEmail,bot_email +BotExportSpecification,bot_export_specification +BotFilter,bot_filter +BotId,bot_id +BotImportSpecification,bot_import_specification +BotLocaleExportSpecification,bot_locale_export_specification +BotLocaleFilter,bot_locale_filter +BotLocaleHistoryEvent,bot_locale_history_event +BotLocaleImportSpecification,bot_locale_import_specification +BotLocaleSortBy,bot_locale_sort_by +BotLocaleSummary,bot_locale_summary +BotMember,bot_member +BotMetadata,bot_metadata +BotName,bot_name +BotRecommendationResultStatistics,bot_recommendation_result_statistics +BotRecommendationResults,bot_recommendation_results +BotRecommendationSummary,bot_recommendation_summary +BotSortBy,bot_sort_by +BotSummary,bot_summary +BotType,bot_type +BotVersionLocaleDetails,bot_version_locale_details +BotVersionSortBy,bot_version_sort_by +BotVersionSummary,bot_version_summary +Bots,bots +Bottom,bottom +Bounce,bounce +BounceAction,bounce_action +BounceSender,bounce_sender +BounceSenderArn,bounce_sender_arn +BounceSubType,bounce_sub_type +BounceTopic,bounce_topic +BounceType,bounce_type +BouncedRecipientInfo,bounced_recipient_info +BouncedRecipientInfoList,bounced_recipient_info_list +Bounces,bounces +BoundedFiles,bounded_files +BoundedSize,bounded_size +BoundingBox,bounding_box +BoundingBoxCount,bounding_box_count +Bounds,bounds +BoxConfiguration,box_configuration +BoxPlotAggregatedFieldWells,box_plot_aggregated_field_wells +BoxPlotChartConfiguration,box_plot_chart_configuration +BoxPlotFieldWells,box_plot_field_wells +BoxPlotOptions,box_plot_options +BoxPlotSortConfiguration,box_plot_sort_configuration +BoxPlotStyleOptions,box_plot_style_options +BoxPlotVisual,box_plot_visual +Branch,branch +BranchDiff,branch_diff +BranchDiffSourceCodeType,branch_diff_source_code_type +BranchDoesNotExistException,branch_does_not_exist_exception +BranchInfo,branch_info +BranchInterfaceId,branch_interface_id +BranchName,branch_name +BranchNameExistsException,branch_name_exists_exception +BranchNameIsTagNameException,branch_name_is_tag_name_exception +BranchNameRequiredException,branch_name_required_exception +BranchOrder,branch_order +Branches,branches +Brand,brand +BrandName,brand_name +BreachAction,breach_action +BreachThreshold,breach_threshold +BreakdownItemsLimit,breakdown_items_limit +Breakdowns,breakdowns +BreakoutCode,breakout_code +Bridge,bridge +BridgeArn,bridge_arn +BridgeFlowOutput,bridge_flow_output +BridgeFlowSource,bridge_flow_source +BridgeMessages,bridge_messages +BridgeNetworkOutput,bridge_network_output +BridgeNetworkSource,bridge_network_source +BridgeOutput,bridge_output +BridgePlacement,bridge_placement +BridgePorts,bridge_ports +BridgeSource,bridge_source +BridgeState,bridge_state +BridgeType,bridge_type +Bridges,bridges +Brightness,brightness +Broker,broker +BrokerAZDistribution,broker_az_distribution +BrokerArn,broker_arn +BrokerEBSVolumeInfo,broker_ebs_volume_info +BrokerEngineType,broker_engine_type +BrokerEngineTypes,broker_engine_types +BrokerId,broker_id +BrokerIds,broker_ids +BrokerInstance,broker_instance +BrokerInstanceOption,broker_instance_option +BrokerInstanceOptions,broker_instance_options +BrokerInstances,broker_instances +BrokerLogs,broker_logs +BrokerName,broker_name +BrokerNodeGroupInfo,broker_node_group_info +BrokerNodeInfo,broker_node_info +BrokerSoftwareInfo,broker_software_info +BrokerState,broker_state +BrokerSummaries,broker_summaries +BrokerSummary,broker_summary +BrowserSettings,browser_settings +BrowserSettingsSummary,browser_settings_summary +Bsic,bsic +Bucket,bucket +BucketARN,bucket_arn +BucketARNUpdate,bucket_arn_update +BucketAccessLogConfig,bucket_access_log_config +BucketAccessRoleArn,bucket_access_role_arn +BucketAccountId,bucket_account_id +BucketArn,bucket_arn +BucketBundle,bucket_bundle +BucketColumns,bucket_columns +BucketConfiguration,bucket_configuration +BucketCountByEffectivePermission,bucket_count_by_effective_permission +BucketCountByEncryptionType,bucket_count_by_encryption_type +BucketCountBySharedAccessType,bucket_count_by_shared_access_type +BucketCountPolicyAllowsUnencryptedObjectUploads,bucket_count_policy_allows_unencrypted_object_uploads +BucketCriteriaAdditionalProperties,bucket_criteria_additional_properties +BucketFolder,bucket_folder +BucketInfo,bucket_info +BucketKeyEnabled,bucket_key_enabled +BucketLevel,bucket_level +BucketLevelPermissions,bucket_level_permissions +BucketLifecycleConfiguration,bucket_lifecycle_configuration +BucketLoggingConfiguration,bucket_logging_configuration +BucketLoggingStatus,bucket_logging_status +BucketMetadata,bucket_metadata +BucketName,bucket_name +BucketNameFilterRequiredException,bucket_name_filter_required_exception +BucketNotFoundFault,bucket_not_found_fault +BucketNotificationConfiguration,bucket_notification_configuration +BucketOwner,bucket_owner +BucketPermissionConfiguration,bucket_permission_configuration +BucketPolicy,bucket_policy +BucketPrefix,bucket_prefix +BucketPublicAccess,bucket_public_access +BucketRegion,bucket_region +BucketServerSideEncryption,bucket_server_side_encryption +BucketSortCriteria,bucket_sort_criteria +BucketState,bucket_state +BucketStatisticsBySensitivity,bucket_statistics_by_sensitivity +BucketVersioningConfiguration,bucket_versioning_configuration +BucketWebsiteConfiguration,bucket_website_configuration +Buckets,buckets +BucketsAggregationType,buckets_aggregation_type +Budget,budget +BudgetAdjustmentPeriod,budget_adjustment_period +BudgetDetail,budget_detail +BudgetLimit,budget_limit +BudgetName,budget_name +BudgetNotificationsForAccount,budget_notifications_for_account +BudgetPerformanceHistory,budget_performance_history +BudgetType,budget_type +BudgetedAmount,budgeted_amount +BudgetedAndActualAmounts,budgeted_and_actual_amounts +BudgetedAndActualAmountsList,budgeted_and_actual_amounts_list +Budgets,budgets +BufFillPct,buf_fill_pct +BufSize,buf_size +BufferDuration,buffer_duration +BufferModel,buffer_model +BufferMsec,buffer_msec +BufferSegments,buffer_segments +BufferingHints,buffering_hints +BugzillaIds,bugzilla_ids +Build,build +BuildArn,build_arn +BuildArtifacts,build_artifacts +BuildArtifactsObjectKey,build_artifacts_object_key +BuildBatch,build_batch +BuildBatchFilter,build_batch_filter +BuildBatchPhase,build_batch_phase +BuildBotLocaleRequest,build_bot_locale_request +BuildBotLocaleResponse,build_bot_locale_response +BuildCommand,build_command +BuildConfiguration,build_configuration +BuildGroup,build_group +BuildId,build_id +BuildNotDeleted,build_not_deleted +BuildPhase,build_phase +BuildStatusConfig,build_status_config +BuildSuggestersRequest,build_suggesters_request +BuildSuggestersResponse,build_suggesters_response +BuildSummary,build_summary +Builder,builder +Builds,builds +BuiltInIntentSortBy,built_in_intent_sort_by +BuiltInIntentSummary,built_in_intent_summary +BuiltInSlotTypeSortBy,built_in_slot_type_sort_by +BuiltInSlotTypeSummary,built_in_slot_type_summary +BuiltinIntentMetadata,builtin_intent_metadata +BuiltinIntentSlot,builtin_intent_slot +BuiltinSlotTypeMetadata,builtin_slot_type_metadata +BulkDeployment,bulk_deployment +BulkDeploymentArn,bulk_deployment_arn +BulkDeploymentId,bulk_deployment_id +BulkDeploymentMetrics,bulk_deployment_metrics +BulkDeploymentResult,bulk_deployment_result +BulkDeploymentStatus,bulk_deployment_status +BulkDeployments,bulk_deployments +BulkEmailContent,bulk_email_content +BulkEmailDestination,bulk_email_destination +BulkEmailDestinationStatus,bulk_email_destination_status +BulkEmailEntries,bulk_email_entries +BulkEmailEntry,bulk_email_entry +BulkEmailEntryResult,bulk_email_entry_result +BulkEmailEntryResults,bulk_email_entry_results +BulkLoadIdNotFoundException,bulk_load_id_not_found_exception +BulkPublishCompleteTime,bulk_publish_complete_time +BulkPublishRequest,bulk_publish_request +BulkPublishResponse,bulk_publish_response +BulkPublishStartTime,bulk_publish_start_time +BulkPublishStatus,bulk_publish_status +BulletPoints,bullet_points +Bumper,bumper +Bundle,bundle +BundleDescription,bundle_description +BundleDetails,bundle_details +BundleId,bundle_id +BundleIds,bundle_ids +BundleInformation,bundle_information +BundleInstanceRequest,bundle_instance_request +BundleInstanceResult,bundle_instance_result +BundleName,bundle_name +BundleTask,bundle_task +BundleTaskError,bundle_task_error +BundleTasks,bundle_tasks +BundleType,bundle_type +Bundles,bundles +BurnInDestinationSettings,burn_in_destination_settings +BurninDestinationSettings,burnin_destination_settings +BurstablePerformance,burstable_performance +BurstablePerformanceSupported,burstable_performance_supported +BusinessCalling,business_calling +BusinessCallingSettings,business_calling_settings +BusinessEmailAddress,business_email_address +BusinessGoals,business_goals +BusinessName,business_name +BusinessPhoneNumber,business_phone_number +BusinessReport,business_report +BusinessReportContentRange,business_report_content_range +BusinessReportRecurrence,business_report_recurrence +BusinessReportS3Location,business_report_s3_location +BusinessReportSchedule,business_report_schedule +BusinessReportSchedules,business_report_schedules +Button,button +ButtonAction,button_action +ByAccountId,by_account_id +ByBackupPlanId,by_backup_plan_id +ByBackupVaultName,by_backup_vault_name +ByCompleteAfter,by_complete_after +ByCompleteBefore,by_complete_before +ByCreatedAfter,by_created_after +ByCreatedBefore,by_created_before +ByCreationAfter,by_creation_after +ByCreationBefore,by_creation_before +ByDestinationVaultArn,by_destination_vault_arn +ByParentJobId,by_parent_job_id +ByParentRecoveryPointArn,by_parent_recovery_point_arn +ByReportPlanName,by_report_plan_name +ByResourceArn,by_resource_arn +ByResourceType,by_resource_type +ByShared,by_shared +ByState,by_state +ByStatus,by_status +ByVaultType,by_vault_type +ByoipCidr,byoip_cidr +ByoipCidrEvent,byoip_cidr_event +ByoipCidrNotFoundException,byoip_cidr_not_found_exception +ByoipCidrs,byoip_cidrs +BypassGovernanceRetention,bypass_governance_retention +BypassPolicyLockoutCheck,bypass_policy_lockout_check +BypassPolicyLockoutSafetyCheck,bypass_policy_lockout_safety_check +BypassSnaplockEnterpriseRetention,bypass_snaplock_enterprise_retention +ByteMatchSet,byte_match_set +ByteMatchSetId,byte_match_set_id +ByteMatchSetSummary,byte_match_set_summary +ByteMatchSetUpdate,byte_match_set_update +ByteMatchSets,byte_match_sets +ByteMatchStatement,byte_match_statement +ByteMatchTuple,byte_match_tuple +ByteMatchTuples,byte_match_tuples +Bytes,bytes +BytesCompressed,bytes_compressed +BytesConverted,bytes_converted +BytesMetered,bytes_metered +BytesPerHour,bytes_per_hour +BytesPerSecond,bytes_per_second +BytesProcessed,bytes_processed +BytesReturned,bytes_returned +BytesScanned,bytes_scanned +BytesScannedCutoffPerQuery,bytes_scanned_cutoff_per_query +BytesTransferred,bytes_transferred +BytesWritten,bytes_written +CACertificate,ca_certificate +CACertificateDescription,ca_certificate_description +CACertificateIdentifier,ca_certificate_identifier +CAIdentifier,ca_identifier +CFNRegistryException,cfn_registry_exception +CIDRIP,cidrip +CIDRSummary,cidr_summary +CIDRs,cidrs +CNAME,cname +CNAMEAlreadyExists,cname_already_exists +CNAMEPrefix,cname_prefix +CORSConfiguration,cors_configuration +CORSRule,cors_rule +CORSRules,cors_rules +CPU,cpu +CPUUtilization,cpu_utilization +CRLSign,crl_sign +CSS,css +CSSColor,css_color +CSSVersion,css_version +CSV,csv +CSVHeader,csv_header +CSVInput,csv_input +CSVMappingParameters,csv_mapping_parameters +CSVOutput,csv_output +CUSTOM,custom +CVEIds,cve_ids +CWEMonitorEnabled,cwe_monitor_enabled +CaCertificateIdentifier,ca_certificate_identifier +CaEndpoint,ca_endpoint +CaLogs,ca_logs +CacheAllocatedInBytes,cache_allocated_in_bytes +CacheAttributes,cache_attributes +CacheBehavior,cache_behavior +CacheBehaviorPerPath,cache_behavior_per_path +CacheBehaviors,cache_behaviors +CacheCluster,cache_cluster +CacheClusterAlreadyExistsFault,cache_cluster_already_exists_fault +CacheClusterCreateTime,cache_cluster_create_time +CacheClusterEnabled,cache_cluster_enabled +CacheClusterId,cache_cluster_id +CacheClusterIds,cache_cluster_ids +CacheClusterMessage,cache_cluster_message +CacheClusterNotFoundFault,cache_cluster_not_found_fault +CacheClusterSize,cache_cluster_size +CacheClusterStatus,cache_cluster_status +CacheClusters,cache_clusters +CacheControl,cache_control +CacheDataEncrypted,cache_data_encrypted +CacheDirtyPercentage,cache_dirty_percentage +CacheEngineDescription,cache_engine_description +CacheEngineVersion,cache_engine_version +CacheEngineVersionDescription,cache_engine_version_description +CacheEngineVersionMessage,cache_engine_version_message +CacheEngineVersions,cache_engine_versions +CacheFullBehavior,cache_full_behavior +CacheHitPercentage,cache_hit_percentage +CacheHitResult,cache_hit_result +CacheLength,cache_length +CacheMissPercentage,cache_miss_percentage +CacheNode,cache_node +CacheNodeCount,cache_node_count +CacheNodeCreateTime,cache_node_create_time +CacheNodeId,cache_node_id +CacheNodeIdsToReboot,cache_node_ids_to_reboot +CacheNodeIdsToRemove,cache_node_ids_to_remove +CacheNodeStatus,cache_node_status +CacheNodeType,cache_node_type +CacheNodeTypeSpecificParameter,cache_node_type_specific_parameter +CacheNodeTypeSpecificParameters,cache_node_type_specific_parameters +CacheNodeTypeSpecificValue,cache_node_type_specific_value +CacheNodeTypeSpecificValues,cache_node_type_specific_values +CacheNodeUpdateStatus,cache_node_update_status +CacheNodes,cache_nodes +CacheParameterGroup,cache_parameter_group +CacheParameterGroupAlreadyExistsFault,cache_parameter_group_already_exists_fault +CacheParameterGroupDetails,cache_parameter_group_details +CacheParameterGroupFamily,cache_parameter_group_family +CacheParameterGroupName,cache_parameter_group_name +CacheParameterGroupNameMessage,cache_parameter_group_name_message +CacheParameterGroupNotFoundFault,cache_parameter_group_not_found_fault +CacheParameterGroupQuotaExceededFault,cache_parameter_group_quota_exceeded_fault +CacheParameterGroupStatus,cache_parameter_group_status +CacheParameterGroups,cache_parameter_groups +CacheParameterGroupsMessage,cache_parameter_groups_message +CachePeriodInMinutes,cache_period_in_minutes +CachePolicy,cache_policy +CachePolicyAlreadyExists,cache_policy_already_exists +CachePolicyConfig,cache_policy_config +CachePolicyCookiesConfig,cache_policy_cookies_config +CachePolicyHeadersConfig,cache_policy_headers_config +CachePolicyId,cache_policy_id +CachePolicyInUse,cache_policy_in_use +CachePolicyList,cache_policy_list +CachePolicyQueryStringsConfig,cache_policy_query_strings_config +CachePolicySummary,cache_policy_summary +CacheSecurityGroup,cache_security_group +CacheSecurityGroupAlreadyExistsFault,cache_security_group_already_exists_fault +CacheSecurityGroupMembership,cache_security_group_membership +CacheSecurityGroupMessage,cache_security_group_message +CacheSecurityGroupName,cache_security_group_name +CacheSecurityGroupNames,cache_security_group_names +CacheSecurityGroupNotFoundFault,cache_security_group_not_found_fault +CacheSecurityGroupQuotaExceededFault,cache_security_group_quota_exceeded_fault +CacheSecurityGroups,cache_security_groups +CacheSettings,cache_settings +CacheSize,cache_size +CacheStaleTimeoutInSeconds,cache_stale_timeout_in_seconds +CacheSubnetGroup,cache_subnet_group +CacheSubnetGroupAlreadyExistsFault,cache_subnet_group_already_exists_fault +CacheSubnetGroupDescription,cache_subnet_group_description +CacheSubnetGroupInUse,cache_subnet_group_in_use +CacheSubnetGroupMessage,cache_subnet_group_message +CacheSubnetGroupName,cache_subnet_group_name +CacheSubnetGroupNotFoundFault,cache_subnet_group_not_found_fault +CacheSubnetGroupQuotaExceededFault,cache_subnet_group_quota_exceeded_fault +CacheSubnetGroups,cache_subnet_groups +CacheSubnetQuotaExceededFault,cache_subnet_quota_exceeded_fault +CacheTTL,cache_ttl +CacheTtlInSeconds,cache_ttl_in_seconds +CacheUsedPercentage,cache_used_percentage +CachedMethods,cached_methods +CachediSCSIVolume,cachedi_scsi_volume +CachediSCSIVolumes,cachedi_scsi_volumes +CachingConfig,caching_config +CachingEnabled,caching_enabled +CalculateRouteCarModeOptions,calculate_route_car_mode_options +CalculateRouteMatrixRequest,calculate_route_matrix_request +CalculateRouteMatrixResponse,calculate_route_matrix_response +CalculateRouteMatrixSummary,calculate_route_matrix_summary +CalculateRouteRequest,calculate_route_request +CalculateRouteResponse,calculate_route_response +CalculateRouteSummary,calculate_route_summary +CalculateRouteTruckModeOptions,calculate_route_truck_mode_options +CalculatedAttributeName,calculated_attribute_name +CalculatedBaselineConstraints,calculated_baseline_constraints +CalculatedBaselineStatistics,calculated_baseline_statistics +CalculatedColumn,calculated_column +CalculatedField,calculated_field +CalculatedFieldDescription,calculated_field_description +CalculatedFieldName,calculated_field_name +CalculatedFieldSynonyms,calculated_field_synonyms +CalculatedFields,calculated_fields +CalculatedLifecycle,calculated_lifecycle +CalculatedMeasureField,calculated_measure_field +CalculatedSpend,calculated_spend +Calculation,calculation +CalculationConfiguration,calculation_configuration +CalculationExecutionId,calculation_execution_id +CalculationResult,calculation_result +CalculationStatistics,calculation_statistics +CalculationStatus,calculation_status +CalculationSummary,calculation_summary +Calculations,calculations +CalculatorArn,calculator_arn +CalculatorName,calculator_name +CalendarNames,calendar_names +CallAnalyticsEntity,call_analytics_entity +CallAnalyticsItem,call_analytics_item +CallAnalyticsJob,call_analytics_job +CallAnalyticsJobName,call_analytics_job_name +CallAnalyticsJobSettings,call_analytics_job_settings +CallAnalyticsJobStatus,call_analytics_job_status +CallAnalyticsJobSummaries,call_analytics_job_summaries +CallAnalyticsJobSummary,call_analytics_job_summary +CallAnalyticsStreamCategories,call_analytics_stream_categories +CallAnalyticsTranscriptResultStream,call_analytics_transcript_result_stream +CallAs,call_as +CallDetails,call_details +CallInstructionsMessage,call_instructions_message +CallInstructionsMessageType,call_instructions_message_type +CallLeg,call_leg +CallRateLimitExceededException,call_rate_limit_exceeded_exception +Callback,callback +CallbackId,callback_id +CallbackStepMetadata,callback_step_metadata +CallbackToken,callback_token +CallbackURLs,callback_urls +CallerArn,caller_arn +CallerId,caller_id +CallerReference,caller_reference +CallerType,caller_type +CallingCountry,calling_country +CallingName,calling_name +CallingNameStatus,calling_name_status +CallingNameUpdatedTimestamp,calling_name_updated_timestamp +CallingRegions,calling_regions +Campaign,campaign +CampaignConfig,campaign_config +CampaignCustomMessage,campaign_custom_message +CampaignDateRangeKpiResponse,campaign_date_range_kpi_response +CampaignEmailMessage,campaign_email_message +CampaignEventFilter,campaign_event_filter +CampaignFilters,campaign_filters +CampaignHook,campaign_hook +CampaignId,campaign_id +CampaignInAppMessage,campaign_in_app_message +CampaignLimits,campaign_limits +CampaignResponse,campaign_response +CampaignSmsMessage,campaign_sms_message +CampaignState,campaign_state +CampaignStatus,campaign_status +CampaignSummary,campaign_summary +CampaignUpdateSummary,campaign_update_summary +CampaignsResponse,campaigns_response +CanDbcDefinition,can_dbc_definition +CanInterface,can_interface +CanSignal,can_signal +Canaries,canaries +CanariesLastRun,canaries_last_run +Canary,canary +CanaryCodeInput,canary_code_input +CanaryCodeOutput,canary_code_output +CanaryLastRun,canary_last_run +CanaryName,canary_name +CanaryRun,canary_run +CanaryRunConfigInput,canary_run_config_input +CanaryRunConfigOutput,canary_run_config_output +CanaryRunStatus,canary_run_status +CanaryRunTimeline,canary_run_timeline +CanaryRuns,canary_runs +CanaryScheduleInput,canary_schedule_input +CanaryScheduleOutput,canary_schedule_output +CanarySettings,canary_settings +CanarySize,canary_size +CanaryStatus,canary_status +CanaryTimeline,canary_timeline +CancelAnnotationImportRequest,cancel_annotation_import_request +CancelArchivalInput,cancel_archival_input +CancelArchivalOutput,cancel_archival_output +CancelAuditMitigationActionsTaskRequest,cancel_audit_mitigation_actions_task_request +CancelAuditTaskRequest,cancel_audit_task_request +CancelBatchImportJobRequest,cancel_batch_import_job_request +CancelBatchJobExecutionRequest,cancel_batch_job_execution_request +CancelBatchPredictionJobRequest,cancel_batch_prediction_job_request +CancelBundleTaskRequest,cancel_bundle_task_request +CancelBundleTaskResult,cancel_bundle_task_result +CancelCapacityReservationFleetError,cancel_capacity_reservation_fleet_error +CancelCapacityReservationFleetsRequest,cancel_capacity_reservation_fleets_request +CancelCapacityReservationFleetsResult,cancel_capacity_reservation_fleets_result +CancelCapacityReservationInput,cancel_capacity_reservation_input +CancelCapacityReservationRequest,cancel_capacity_reservation_request +CancelCapacityReservationResult,cancel_capacity_reservation_result +CancelCertificateTransferRequest,cancel_certificate_transfer_request +CancelChangeSetRequest,cancel_change_set_request +CancelChangeSetResponse,cancel_change_set_response +CancelClusterRequest,cancel_cluster_request +CancelCommandRequest,cancel_command_request +CancelComponentDeploymentInput,cancel_component_deployment_input +CancelComponentDeploymentOutput,cancel_component_deployment_output +CancelContactRequest,cancel_contact_request +CancelConversionRequest,cancel_conversion_request +CancelDataQualityRuleRecommendationRunRequest,cancel_data_quality_rule_recommendation_run_request +CancelDataQualityRulesetEvaluationRunRequest,cancel_data_quality_ruleset_evaluation_run_request +CancelDataRepositoryTaskRequest,cancel_data_repository_task_request +CancelDataRepositoryTaskResponse,cancel_data_repository_task_response +CancelDeploymentJobRequest,cancel_deployment_job_request +CancelDeploymentRequest,cancel_deployment_request +CancelDeploymentResponse,cancel_deployment_response +CancelDescription,cancel_description +CancelDetectMitigationActionsTaskRequest,cancel_detect_mitigation_actions_task_request +CancelDomainTransferToAnotherAwsAccountRequest,cancel_domain_transfer_to_another_aws_account_request +CancelDomainTransferToAnotherAwsAccountResponse,cancel_domain_transfer_to_another_aws_account_response +CancelElasticsearchServiceSoftwareUpdateRequest,cancel_elasticsearch_service_software_update_request +CancelElasticsearchServiceSoftwareUpdateResponse,cancel_elasticsearch_service_software_update_response +CancelEnvironmentDeploymentInput,cancel_environment_deployment_input +CancelEnvironmentDeploymentOutput,cancel_environment_deployment_output +CancelExportJobRequest,cancel_export_job_request +CancelExportTaskMessage,cancel_export_task_message +CancelExportTaskRequest,cancel_export_task_request +CancelFindingsReportRequest,cancel_findings_report_request +CancelFindingsReportResponse,cancel_findings_report_response +CancelFlowExecutionsRequest,cancel_flow_executions_request +CancelFlowExecutionsResponse,cancel_flow_executions_response +CancelGremlinQueryInput,cancel_gremlin_query_input +CancelGremlinQueryOutput,cancel_gremlin_query_output +CancelHandshakeRequest,cancel_handshake_request +CancelHandshakeResponse,cancel_handshake_response +CancelImageCreationRequest,cancel_image_creation_request +CancelImageCreationResponse,cancel_image_creation_response +CancelImageLaunchPermissionRequest,cancel_image_launch_permission_request +CancelImageLaunchPermissionResult,cancel_image_launch_permission_result +CancelImportTaskRequest,cancel_import_task_request +CancelImportTaskResult,cancel_import_task_result +CancelIngestionRequest,cancel_ingestion_request +CancelIngestionResponse,cancel_ingestion_response +CancelInputDeviceTransferRequest,cancel_input_device_transfer_request +CancelInstanceRefreshAnswer,cancel_instance_refresh_answer +CancelInstanceRefreshType,cancel_instance_refresh_type +CancelJobExecutionRequest,cancel_job_execution_request +CancelJobRequest,cancel_job_request +CancelJobResponse,cancel_job_response +CancelJobRunRequest,cancel_job_run_request +CancelJobRunResponse,cancel_job_run_response +CancelJournalKinesisStreamRequest,cancel_journal_kinesis_stream_request +CancelJournalKinesisStreamResponse,cancel_journal_kinesis_stream_response +CancelKeyDeletionRequest,cancel_key_deletion_request +CancelKeyDeletionResponse,cancel_key_deletion_response +CancelLegalHoldInput,cancel_legal_hold_input +CancelLoaderJobInput,cancel_loader_job_input +CancelLoaderJobOutput,cancel_loader_job_output +CancelMLDataProcessingJobInput,cancel_ml_data_processing_job_input +CancelMLDataProcessingJobOutput,cancel_ml_data_processing_job_output +CancelMLModelTrainingJobInput,cancel_ml_model_training_job_input +CancelMLModelTrainingJobOutput,cancel_ml_model_training_job_output +CancelMLModelTransformJobInput,cancel_ml_model_transform_job_input +CancelMLModelTransformJobOutput,cancel_ml_model_transform_job_output +CancelMLTaskRunRequest,cancel_ml_task_run_request +CancelMLTaskRunResponse,cancel_ml_task_run_response +CancelMailboxExportJobRequest,cancel_mailbox_export_job_request +CancelMaintenanceWindowExecutionRequest,cancel_maintenance_window_execution_request +CancelMaintenanceWindowExecutionResult,cancel_maintenance_window_execution_result +CancelMessageMoveTaskRequest,cancel_message_move_task_request +CancelMessageMoveTaskResult,cancel_message_move_task_result +CancelMulticastGroupSessionRequest,cancel_multicast_group_session_request +CancelOpenCypherQueryInput,cancel_open_cypher_query_input +CancelOpenCypherQueryOutput,cancel_open_cypher_query_output +CancelOrderInput,cancel_order_input +CancelPipelineReprocessingRequest,cancel_pipeline_reprocessing_request +CancelPolicyGenerationRequest,cancel_policy_generation_request +CancelQuantumTaskRequest,cancel_quantum_task_request +CancelQuantumTaskResponse,cancel_quantum_task_response +CancelQueryRequest,cancel_query_request +CancelQueryResponse,cancel_query_response +CancelReason,cancel_reason +CancelReplayRequest,cancel_replay_request +CancelReplayResponse,cancel_replay_response +CancelReplicationTaskAssessmentRunMessage,cancel_replication_task_assessment_run_message +CancelReplicationTaskAssessmentRunResponse,cancel_replication_task_assessment_run_response +CancelReservedInstancesListingRequest,cancel_reserved_instances_listing_request +CancelReservedInstancesListingResult,cancel_reserved_instances_listing_result +CancelResizeMessage,cancel_resize_message +CancelResourceRequestInput,cancel_resource_request_input +CancelResourceRequestOutput,cancel_resource_request_output +CancelRetrievalInput,cancel_retrieval_input +CancelRetrievalOutput,cancel_retrieval_output +CancelRotateSecretRequest,cancel_rotate_secret_request +CancelRotateSecretResponse,cancel_rotate_secret_response +CancelRunRequest,cancel_run_request +CancelSbomExportRequest,cancel_sbom_export_request +CancelSbomExportResponse,cancel_sbom_export_response +CancelSchemaExtensionRequest,cancel_schema_extension_request +CancelServiceInstanceDeploymentInput,cancel_service_instance_deployment_input +CancelServiceInstanceDeploymentOutput,cancel_service_instance_deployment_output +CancelServicePipelineDeploymentInput,cancel_service_pipeline_deployment_input +CancelServicePipelineDeploymentOutput,cancel_service_pipeline_deployment_output +CancelServiceSoftwareUpdateRequest,cancel_service_software_update_request +CancelServiceSoftwareUpdateResponse,cancel_service_software_update_response +CancelSigningProfileRequest,cancel_signing_profile_request +CancelSimulationJobBatchRequest,cancel_simulation_job_batch_request +CancelSimulationJobRequest,cancel_simulation_job_request +CancelSolNetworkOperationInput,cancel_sol_network_operation_input +CancelSpotFleetRequestsError,cancel_spot_fleet_requests_error +CancelSpotFleetRequestsErrorItem,cancel_spot_fleet_requests_error_item +CancelSpotFleetRequestsRequest,cancel_spot_fleet_requests_request +CancelSpotFleetRequestsResponse,cancel_spot_fleet_requests_response +CancelSpotFleetRequestsSuccessItem,cancel_spot_fleet_requests_success_item +CancelSpotInstanceRequestsRequest,cancel_spot_instance_requests_request +CancelSpotInstanceRequestsResult,cancel_spot_instance_requests_result +CancelStatementRequest,cancel_statement_request +CancelStatementResponse,cancel_statement_response +CancelStepsInfo,cancel_steps_info +CancelStepsInfoList,cancel_steps_info_list +CancelStepsInput,cancel_steps_input +CancelStepsOutput,cancel_steps_output +CancelTaskExecutionRequest,cancel_task_execution_request +CancelTaskInput,cancel_task_input +CancelTaskOutput,cancel_task_output +CancelTimerDecisionAttributes,cancel_timer_decision_attributes +CancelTimerFailedEventAttributes,cancel_timer_failed_event_attributes +CancelTransactionRequest,cancel_transaction_request +CancelUpdateStackInput,cancel_update_stack_input +CancelVariantImportRequest,cancel_variant_import_request +CancelWorkflowExecutionDecisionAttributes,cancel_workflow_execution_decision_attributes +CancelWorkflowExecutionFailedEventAttributes,cancel_workflow_execution_failed_event_attributes +CancelWorldExportJobRequest,cancel_world_export_job_request +CancelWorldGenerationJobRequest,cancel_world_generation_job_request +CancelZonalShiftRequest,cancel_zonal_shift_request +Cancellable,cancellable +CancellationDate,cancellation_date +CancellationMessage,cancellation_message +CancellationReason,cancellation_reason +CancellationReasons,cancellation_reasons +CancelledByUserException,cancelled_by_user_exception +CancelledSpotInstanceRequest,cancelled_spot_instance_request +CancelledSpotInstanceRequests,cancelled_spot_instance_requests +CancelledSteps,cancelled_steps +CandidateAddress,candidate_address +CandidateAddressList,candidate_address_list +CandidateArtifactLocations,candidate_artifact_locations +CandidateDefinitionNotebookLocation,candidate_definition_notebook_location +CandidateGenerationConfig,candidate_generation_config +CandidateMetrics,candidate_metrics +CandidateName,candidate_name +CandidateNameEquals,candidate_name_equals +CandidateProperties,candidate_properties +CandidateStatus,candidate_status +CandidateStepArn,candidate_step_arn +CandidateStepName,candidate_step_name +CandidateStepType,candidate_step_type +CandidateSteps,candidate_steps +Candidates,candidates +CannedACL,canned_acl +CannedAccessControlList,canned_access_control_list +CannedAcl,canned_acl +CannedAclForObjects,canned_acl_for_objects +CannotChangeImmutablePublicKeyFields,cannot_change_immutable_public_key_fields +CannotDelegateManagementAccountException,cannot_delegate_management_account_exception +CannotDeleteApprovalRuleFromTemplateException,cannot_delete_approval_rule_from_template_exception +CannotDeleteException,cannot_delete_exception +CannotListParentOfRootException,cannot_list_parent_of_root_exception +CannotModifyApprovalRuleFromTemplateException,cannot_modify_approval_rule_from_template_exception +CanonicalHostedZoneId,canonical_hosted_zone_id +CanonicalHostedZoneName,canonical_hosted_zone_name +CanonicalHostedZoneNameID,canonical_hosted_zone_name_id +CanvasAppSettings,canvas_app_settings +CanvasOrientation,canvas_orientation +CanvasSizeOptions,canvas_size_options +Cap,cap +CapExceeded,cap_exceeded +Capabilities,capabilities +CapabilitiesReason,capabilities_reason +Capacity,capacity +CapacityAllocation,capacity_allocation +CapacityAllocations,capacity_allocations +CapacityAssignment,capacity_assignment +CapacityAssignmentConfiguration,capacity_assignment_configuration +CapacityAssignments,capacity_assignments +CapacityConfiguration,capacity_configuration +CapacityDescription,capacity_description +CapacityExceededException,capacity_exceeded_exception +CapacityForecast,capacity_forecast +CapacityId,capacity_id +CapacityInBytes,capacity_in_bytes +CapacityLimits,capacity_limits +CapacityProvider,capacity_provider +CapacityProviderStrategy,capacity_provider_strategy +CapacityProviderStrategyItem,capacity_provider_strategy_item +CapacityProviders,capacity_providers +CapacityProvisioned,capacity_provisioned +CapacityRebalance,capacity_rebalance +CapacityRegion,capacity_region +CapacityReservation,capacity_reservation +CapacityReservationArn,capacity_reservation_arn +CapacityReservationFleet,capacity_reservation_fleet +CapacityReservationFleetArn,capacity_reservation_fleet_arn +CapacityReservationFleetCancellationState,capacity_reservation_fleet_cancellation_state +CapacityReservationFleetId,capacity_reservation_fleet_id +CapacityReservationFleetIds,capacity_reservation_fleet_ids +CapacityReservationFleets,capacity_reservation_fleets +CapacityReservationGroup,capacity_reservation_group +CapacityReservationGroups,capacity_reservation_groups +CapacityReservationId,capacity_reservation_id +CapacityReservationIds,capacity_reservation_ids +CapacityReservationName,capacity_reservation_name +CapacityReservationOptions,capacity_reservation_options +CapacityReservationOptionsRequest,capacity_reservation_options_request +CapacityReservationPreference,capacity_reservation_preference +CapacityReservationResourceGroupArn,capacity_reservation_resource_group_arn +CapacityReservationSpecification,capacity_reservation_specification +CapacityReservationSpecificationResponse,capacity_reservation_specification_response +CapacityReservationTarget,capacity_reservation_target +CapacityReservationTargetResponse,capacity_reservation_target_response +CapacityReservations,capacity_reservations +CapacitySize,capacity_size +CapacitySpecification,capacity_specification +CapacitySpecificationSummary,capacity_specification_summary +CapacityToRelease,capacity_to_release +CapacityUnits,capacity_units +CapacityUnitsConfiguration,capacity_units_configuration +CapacityUpdate,capacity_update +CapacityUsageSummary,capacity_usage_summary +CapacityUsed,capacity_used +CappedCount,capped_count +Captcha,captcha +CaptchaAction,captcha_action +CaptchaConfig,captcha_config +CaptchaResponse,captcha_response +CaptionChannel,caption_channel +CaptionContainerType,caption_container_type +CaptionData,caption_data +CaptionDescription,caption_description +CaptionDescriptionNames,caption_description_names +CaptionDescriptionPreset,caption_description_preset +CaptionDescriptions,caption_descriptions +CaptionDestinationSettings,caption_destination_settings +CaptionFormat,caption_format +CaptionFormats,caption_formats +CaptionLanguageMapping,caption_language_mapping +CaptionLanguageMappings,caption_language_mappings +CaptionLanguageSetting,caption_language_setting +CaptionRectangle,caption_rectangle +CaptionSegmentLengthControl,caption_segment_length_control +CaptionSelector,caption_selector +CaptionSelectorName,caption_selector_name +CaptionSelectorSettings,caption_selector_settings +CaptionSelectors,caption_selectors +CaptionSource,caption_source +CaptionSourceFramerate,caption_source_framerate +CaptionSourceSettings,caption_source_settings +CaptionSources,caption_sources +Captions,captions +CaptureContentTypeHeader,capture_content_type_header +CaptureDdls,capture_ddls +CaptureInterval,capture_interval +CaptureIntervalUnits,capture_interval_units +CaptureMode,capture_mode +CaptureOption,capture_option +CaptureOptions,capture_options +CaptureStatus,capture_status +CaptureTime,capture_time +CaptureTimeAccuracy,capture_time_accuracy +CarModeOptions,car_mode_options +CardExpiryDate,card_expiry_date +CardHolderVerificationValue,card_holder_verification_value +CardStatusUpdate,card_status_update +CardVerificationValue1,card_verification_value1 +CardVerificationValue2,card_verification_value2 +Cardinality,cardinality +Carrier,carrier +CarrierGateway,carrier_gateway +CarrierGatewayId,carrier_gateway_id +CarrierGatewayIds,carrier_gateway_ids +CarrierGateways,carrier_gateways +CarrierIp,carrier_ip +CartesianCoordinates,cartesian_coordinates +Cascade,cascade +CascadingControlConfiguration,cascading_control_configuration +CascadingControlSource,cascading_control_source +CaseCreationLimitExceeded,case_creation_limit_exceeded +CaseDetails,case_details +CaseEventIncludedData,case_event_included_data +CaseId,case_id +CaseIdNotFound,case_id_not_found +CaseInsensitive,case_insensitive +CaseSensitive,case_sensitive +CaseSensitiveNames,case_sensitive_names +CaseSensitivity,case_sensitivity +CaseSummary,case_summary +CastColumnTypeOperation,cast_column_type_operation +Catalog,catalog +CatalogConfiguration,catalog_configuration +CatalogConfigurationDescription,catalog_configuration_description +CatalogConfigurationUpdate,catalog_configuration_update +CatalogDatabase,catalog_database +CatalogDeltaSource,catalog_delta_source +CatalogEncryptionMode,catalog_encryption_mode +CatalogEntry,catalog_entry +CatalogHudiSource,catalog_hudi_source +CatalogId,catalog_id +CatalogImportStatus,catalog_import_status +CatalogItem,catalog_item +CatalogItemId,catalog_item_id +CatalogItems,catalog_items +CatalogKafkaSource,catalog_kafka_source +CatalogKinesisSource,catalog_kinesis_source +CatalogName,catalog_name +CatalogRedshiftSchema,catalog_redshift_schema +CatalogRedshiftTable,catalog_redshift_table +CatalogSchemaChangePolicy,catalog_schema_change_policy +CatalogSource,catalog_source +CatalogTable,catalog_table +CatalogTarget,catalog_target +CatalogTargets,catalog_targets +CategoricalAggregationFunction,categorical_aggregation_function +CategoricalDimensionField,categorical_dimension_field +CategoricalHyperParameterRange,categorical_hyper_parameter_range +CategoricalMeasureField,categorical_measure_field +CategoricalParameter,categorical_parameter +CategoricalParameterRange,categorical_parameter_range +CategoricalParameterRangeSpecification,categorical_parameter_range_specification +CategoricalParameterRanges,categorical_parameter_ranges +CategoricalValues,categorical_values +Categories,categories +Category,category +CategoryAxis,category_axis +CategoryAxisDisplayOptions,category_axis_display_options +CategoryAxisLabelOptions,category_axis_label_options +CategoryDetails,category_details +CategoryDrillDownFilter,category_drill_down_filter +CategoryEnum,category_enum +CategoryEvent,category_event +CategoryFilter,category_filter +CategoryFilterConfiguration,category_filter_configuration +CategoryFilterFunction,category_filter_function +CategoryFilterType,category_filter_type +CategoryId,category_id +CategoryItemsLimit,category_items_limit +CategoryItemsLimitConfiguration,category_items_limit_configuration +CategoryLabelOptions,category_label_options +CategoryLabelVisibility,category_label_visibility +CategoryList,category_list +CategoryName,category_name +CategoryProperties,category_properties +CategorySort,category_sort +CategoryValue,category_value +CategoryValues,category_values +CategoryWithFindingNum,category_with_finding_num +CausalAnomalyId,causal_anomaly_id +Cause,cause +CausedBy,caused_by +Causes,causes +CausingEntity,causing_entity +CbetCheckDigitString,cbet_check_digit_string +CbetSourceId,cbet_source_id +CbetStepaside,cbet_stepaside +CcAddresses,cc_addresses +CcDescriptor,cc_descriptor +CdcInsertsAndUpdates,cdc_inserts_and_updates +CdcInsertsOnly,cdc_inserts_only +CdcMaxBatchInterval,cdc_max_batch_interval +CdcMinFileSize,cdc_min_file_size +CdcPath,cdc_path +CdcStartPosition,cdc_start_position +CdcStartTime,cdc_start_time +CdcStopPosition,cdc_stop_position +CdiInputSpecification,cdi_input_specification +Cdma,cdma +CdmaChannel,cdma_channel +CdmaLocalId,cdma_local_id +CdmaNmr,cdma_nmr +CdmaNmrObj,cdma_nmr_obj +CdmaObj,cdma_obj +CdnConfiguration,cdn_configuration +CdnIdentifierSecret,cdn_identifier_secret +CdrBucket,cdr_bucket +Celebrities,celebrities +Celebrity,celebrity +CelebrityDetail,celebrity_detail +CelebrityFaces,celebrity_faces +CelebrityRecognition,celebrity_recognition +Cell,cell +CellArn,cell_arn +CellFilters,cell_filters +CellInput,cell_input +CellName,cell_name +CellOutput,cell_output +CellParams,cell_params +CellReference,cell_reference +CellStyle,cell_style +CellTowers,cell_towers +CellType,cell_type +CellValue,cell_value +CellValueSynonym,cell_value_synonym +CellValueSynonyms,cell_value_synonyms +Cells,cells +Center,center +Cents,cents +CertPolicyId,cert_policy_id +Certificate,certificate +CertificateAlreadyExistsException,certificate_already_exists_exception +CertificateArn,certificate_arn +CertificateAssociation,certificate_association +CertificateAssociations,certificate_associations +CertificateAuthentication,certificate_authentication +CertificateAuthenticationRequest,certificate_authentication_request +CertificateAuthorities,certificate_authorities +CertificateAuthority,certificate_authority +CertificateAuthorityArn,certificate_authority_arn +CertificateAuthorityArnList,certificate_authority_arn_list +CertificateAuthorityConfiguration,certificate_authority_configuration +CertificateAuthorityData,certificate_authority_data +CertificateAuthorityExpiryInMilliseconds,certificate_authority_expiry_in_milliseconds +CertificateAuthorityId,certificate_authority_id +CertificateAuthorityPublicKeyIdentifier,certificate_authority_public_key_identifier +CertificateAuthorityType,certificate_authority_type +CertificateBasedAuthProperties,certificate_based_auth_properties +CertificateBody,certificate_body +CertificateChain,certificate_chain +CertificateConfiguration,certificate_configuration +CertificateConflictException,certificate_conflict_exception +CertificateCreationDate,certificate_creation_date +CertificateData,certificate_data +CertificateDescription,certificate_description +CertificateDetail,certificate_detail +CertificateDetails,certificate_details +CertificateDoesNotExistException,certificate_does_not_exist_exception +CertificateEnrollmentPolicyServerEndpoint,certificate_enrollment_policy_server_endpoint +CertificateExpirationTime,certificate_expiration_time +CertificateExpiryInMilliseconds,certificate_expiry_in_milliseconds +CertificateFingerprint,certificate_fingerprint +CertificateId,certificate_id +CertificateIdentifier,certificate_identifier +CertificateIds,certificate_ids +CertificateInUseException,certificate_in_use_exception +CertificateInfo,certificate_info +CertificateLimitExceededException,certificate_limit_exceeded_exception +CertificateList,certificate_list +CertificateMessage,certificate_message +CertificateMismatchException,certificate_mismatch_exception +CertificateMode,certificate_mode +CertificateName,certificate_name +CertificateNotFoundException,certificate_not_found_exception +CertificateNotFoundFault,certificate_not_found_fault +CertificateOptions,certificate_options +CertificateOwner,certificate_owner +CertificatePath,certificate_path +CertificatePem,certificate_pem +CertificatePolicies,certificate_policies +CertificateRevocationList,certificate_revocation_list +CertificateRotationRestart,certificate_rotation_restart +CertificateS3BucketName,certificate_s3_bucket_name +CertificateS3ObjectKey,certificate_s3_object_key +CertificateSerial,certificate_serial +CertificateSource,certificate_source +CertificateStateException,certificate_state_exception +CertificateStatuses,certificate_statuses +CertificateSummary,certificate_summary +CertificateSummaryList,certificate_summary_list +CertificateTransparencyLoggingPreference,certificate_transparency_logging_preference +CertificateType,certificate_type +CertificateUploadDate,certificate_upload_date +CertificateValidationException,certificate_validation_exception +CertificateValidationRecord,certificate_validation_record +CertificateValidationRecords,certificate_validation_records +CertificateValidity,certificate_validity +CertificateWallet,certificate_wallet +Certificates,certificates +CertificatesInfo,certificates_info +Certifications,certifications +CertifyForMarketplace,certify_for_marketplace +Chain,chain +ChainId,chain_id +ChaincodeLogs,chaincode_logs +Challenge,challenge +ChallengeAction,challenge_action +ChallengeCode,challenge_code +ChallengeConfig,challenge_config +ChallengeName,challenge_name +ChallengeParameters,challenge_parameters +ChallengeRequiredOnNewDevice,challenge_required_on_new_device +ChallengeResponse,challenge_response +ChallengeResponseType,challenge_response_type +ChallengeResponses,challenge_responses +Change,change +ChangeBatch,change_batch +ChangeCidrCollectionRequest,change_cidr_collection_request +ChangeCidrCollectionResponse,change_cidr_collection_response +ChangeComputeType,change_compute_type +ChangeDetails,change_details +ChangeDetectingColumns,change_detecting_columns +ChangeId,change_id +ChangeInfo,change_info +ChangeLog,change_log +ChangeMessageVisibilityBatchRequest,change_message_visibility_batch_request +ChangeMessageVisibilityBatchRequestEntry,change_message_visibility_batch_request_entry +ChangeMessageVisibilityBatchResult,change_message_visibility_batch_result +ChangeMessageVisibilityBatchResultEntry,change_message_visibility_batch_result_entry +ChangeMessageVisibilityRequest,change_message_visibility_request +ChangeName,change_name +ChangeOwnershipPrice,change_ownership_price +ChangePasswordRequest,change_password_request +ChangeProgressDetails,change_progress_details +ChangeProgressStage,change_progress_stage +ChangeProgressStages,change_progress_stages +ChangeProgressStatus,change_progress_status +ChangeProgressStatusDetails,change_progress_status_details +ChangeProgressStatuses,change_progress_statuses +ChangeRequest,change_request +ChangeRequestName,change_request_name +ChangeResourceRecordSetsRequest,change_resource_record_sets_request +ChangeResourceRecordSetsResponse,change_resource_record_sets_response +ChangeServerLifeCycleStateRequest,change_server_life_cycle_state_request +ChangeServerLifeCycleStateSourceServerLifecycle,change_server_life_cycle_state_source_server_lifecycle +ChangeSet,change_set +ChangeSetArn,change_set_arn +ChangeSetHook,change_set_hook +ChangeSetHookResourceTargetDetails,change_set_hook_resource_target_details +ChangeSetHookTargetDetails,change_set_hook_target_details +ChangeSetId,change_set_id +ChangeSetName,change_set_name +ChangeSetNotFoundException,change_set_not_found_exception +ChangeSetState,change_set_state +ChangeSetSummary,change_set_summary +ChangeSetSummaryList,change_set_summary_list +ChangeSetSummaryListItem,change_set_summary_list_item +ChangeSetTags,change_set_tags +ChangeSetType,change_set_type +ChangeSeverity,change_severity +ChangeSource,change_source +ChangeSummary,change_summary +ChangeTagsForResourceRequest,change_tags_for_resource_request +ChangeToken,change_token +ChangeTokenStatus,change_token_status +ChangeType,change_type +ChangeableForDays,changeable_for_days +ChangedBlock,changed_block +ChangedBlocks,changed_blocks +ChangedBlocksCount,changed_blocks_count +Changes,changes +ChangesetErrorInfo,changeset_error_info +ChangesetSummary,changeset_summary +Channel,channel +ChannelARN,channel_arn +ChannelARNInvalidException,channel_arn_invalid_exception +ChannelActivity,channel_activity +ChannelAlreadyExistsException,channel_already_exists_exception +ChannelArn,channel_arn +ChannelAssociatedWithFlowSummary,channel_associated_with_flow_summary +ChannelBan,channel_ban +ChannelBanSummary,channel_ban_summary +ChannelBans,channel_bans +ChannelClass,channel_class +ChannelConfiguration,channel_configuration +ChannelCounts,channel_counts +ChannelDefinition,channel_definition +ChannelDefinitions,channel_definitions +ChannelEgressEndpoint,channel_egress_endpoint +ChannelExistsForEDSException,channel_exists_for_eds_exception +ChannelFlow,channel_flow +ChannelFlowArn,channel_flow_arn +ChannelFlowCallbackRequest,channel_flow_callback_request +ChannelFlowCallbackResponse,channel_flow_callback_response +ChannelFlowSummary,channel_flow_summary +ChannelFlows,channel_flows +ChannelGroupListConfiguration,channel_group_list_configuration +ChannelGroupName,channel_group_name +ChannelId,channel_id +ChannelIdentification,channel_identification +ChannelIds,channel_ids +ChannelInfo,channel_info +ChannelInfoList,channel_info_list +ChannelInsufficientPermission,channel_insufficient_permission +ChannelListConfiguration,channel_list_configuration +ChannelMapping,channel_mapping +ChannelMappings,channel_mappings +ChannelMask,channel_mask +ChannelMaxLimitExceededException,channel_max_limit_exceeded_exception +ChannelMembership,channel_membership +ChannelMembershipForAppInstanceUserSummary,channel_membership_for_app_instance_user_summary +ChannelMembershipPreferences,channel_membership_preferences +ChannelMembershipSummary,channel_membership_summary +ChannelMemberships,channel_memberships +ChannelMessage,channel_message +ChannelMessageCallback,channel_message_callback +ChannelMessageStatusStructure,channel_message_status_structure +ChannelMessageSummary,channel_message_summary +ChannelMessages,channel_messages +ChannelModeratedByAppInstanceUserSummary,channel_moderated_by_app_instance_user_summary +ChannelModerator,channel_moderator +ChannelModeratorArn,channel_moderator_arn +ChannelModeratorSummary,channel_moderator_summary +ChannelModerators,channel_moderators +ChannelName,channel_name +ChannelNameCondition,channel_name_condition +ChannelNotBroadcasting,channel_not_broadcasting +ChannelNotFound,channel_not_found +ChannelNotFoundException,channel_not_found_exception +ChannelOrder,channel_order +ChannelResponse,channel_response +ChannelRetentionSettings,channel_retention_settings +ChannelSpecification,channel_specification +ChannelState,channel_state +ChannelStatistics,channel_statistics +ChannelStatus,channel_status +ChannelStorage,channel_storage +ChannelStorageSummary,channel_storage_summary +ChannelSummary,channel_summary +ChannelTag,channel_tag +ChannelTargetInfo,channel_target_info +ChannelType,channel_type +ChannelUnsupportedSchema,channel_unsupported_schema +Channels,channels +ChannelsIn,channels_in +ChannelsOut,channels_out +ChannelsResponse,channels_response +ChapCredentials,chap_credentials +ChapEnabled,chap_enabled +ChapInfo,chap_info +CharLengthSemantics,char_length_semantics +CharacterOffsets,character_offsets +CharacterSet,character_set +CharacterSetDescription,character_set_description +CharacterSetName,character_set_name +Characters,characters +ChargeDetails,charge_details +ChargeValue,charge_value +Charset,charset +ChartAxisLabelOptions,chart_axis_label_options +ChartColor,chart_color +ChartConfiguration,chart_configuration +ChatDurationInMinutes,chat_duration_in_minutes +ChatMessage,chat_message +ChatParticipantRoleConfig,chat_participant_role_config +ChatStreamingConfiguration,chat_streaming_configuration +ChatterFeedConfiguration,chatter_feed_configuration +CheckCapacityRequest,check_capacity_request +CheckCapacityResponse,check_capacity_response +CheckDNSAvailabilityMessage,check_dns_availability_message +CheckDNSAvailabilityResultMessage,check_dns_availability_result_message +CheckDetail,check_detail +CheckDetails,check_details +CheckDigitString,check_digit_string +CheckDomainAvailabilityRequest,check_domain_availability_request +CheckDomainAvailabilityResponse,check_domain_availability_response +CheckDomainTransferabilityRequest,check_domain_transferability_request +CheckDomainTransferabilityResponse,check_domain_transferability_response +CheckExpression,check_expression +CheckIfPhoneNumberIsOptedOutInput,check_if_phone_number_is_opted_out_input +CheckIfPhoneNumberIsOptedOutResponse,check_if_phone_number_is_opted_out_response +CheckInLicenseRequest,check_in_license_request +CheckJobArn,check_job_arn +CheckName,check_name +CheckSchemaVersionValidityInput,check_schema_version_validity_input +CheckSchemaVersionValidityResponse,check_schema_version_validity_response +CheckSummaries,check_summaries +CheckSummary,check_summary +CheckType,check_type +CheckedTime,checked_time +CheckerIpRanges,checker_ip_ranges +CheckoutBorrowLicenseRequest,checkout_borrow_license_request +CheckoutBorrowLicenseResponse,checkout_borrow_license_response +CheckoutLicenseRequest,checkout_license_request +CheckoutLicenseResponse,checkout_license_response +CheckoutMetadata,checkout_metadata +CheckoutType,checkout_type +CheckpointConfig,checkpoint_config +CheckpointConfiguration,checkpoint_configuration +CheckpointConfigurationDescription,checkpoint_configuration_description +CheckpointConfigurationUpdate,checkpoint_configuration_update +CheckpointDelay,checkpoint_delay +CheckpointInterval,checkpoint_interval +CheckpointIntervalUpdate,checkpoint_interval_update +CheckpointPercentages,checkpoint_percentages +CheckpointingEnabled,checkpointing_enabled +CheckpointingEnabledUpdate,checkpointing_enabled_update +Checksum,checksum +ChecksumAggregationMethod,checksum_aggregation_method +ChecksumAlgorithm,checksum_algorithm +ChecksumCRC32,checksum_crc32 +ChecksumCRC32C,checksum_crc32_c +ChecksumMode,checksum_mode +ChecksumSHA1,checksum_sha1 +ChecksumSHA256,checksum_sha256 +ChefConfiguration,chef_configuration +Child,child +ChildBlock,child_block +ChildBlockId,child_block_id +ChildBlocks,child_blocks +ChildComponents,child_components +ChildHealthChecks,child_health_checks +ChildId,child_id +ChildJobsInState,child_jobs_in_state +ChildManifestName,child_manifest_name +ChildNotFoundException,child_not_found_exception +ChildReference,child_reference +ChildShard,child_shard +ChildShards,child_shards +ChildType,child_type +ChildWorkflowExecutionCanceledEventAttributes,child_workflow_execution_canceled_event_attributes +ChildWorkflowExecutionCompletedEventAttributes,child_workflow_execution_completed_event_attributes +ChildWorkflowExecutionFailedEventAttributes,child_workflow_execution_failed_event_attributes +ChildWorkflowExecutionStartedEventAttributes,child_workflow_execution_started_event_attributes +ChildWorkflowExecutionTerminatedEventAttributes,child_workflow_execution_terminated_event_attributes +ChildWorkflowExecutionTimedOutEventAttributes,child_workflow_execution_timed_out_event_attributes +Children,children +ChildrenOfAlarmName,children_of_alarm_name +ChimeBearer,chime_bearer +ChimeSdkMeetingConcatenationConfiguration,chime_sdk_meeting_concatenation_configuration +ChimeSdkMeetingConfiguration,chime_sdk_meeting_configuration +ChimeSdkMeetingLiveConnectorConfiguration,chime_sdk_meeting_live_connector_configuration +Choice,choice +ChoiceAnswer,choice_answer +ChoiceAnswerSummaries,choice_answer_summaries +ChoiceAnswerSummary,choice_answer_summary +ChoiceAnswers,choice_answers +ChoiceContent,choice_content +ChoiceDescription,choice_description +ChoiceId,choice_id +ChoiceImprovementPlan,choice_improvement_plan +ChoiceTitle,choice_title +ChoiceUpdate,choice_update +ChoiceUpdates,choice_updates +Choices,choices +ChromaSampling,chroma_sampling +Chunk,chunk +ChunkChecksum,chunk_checksum +ChunkChecksumAlgorithm,chunk_checksum_algorithm +ChunkIndex,chunk_index +ChunkList,chunk_list +ChunkToken,chunk_token +ChunksCount,chunks_count +Cidr,cidr +CidrAllowList,cidr_allow_list +CidrAllowedList,cidr_allowed_list +CidrAuthorizationContext,cidr_authorization_context +CidrBlock,cidr_block +CidrBlockAssociation,cidr_block_association +CidrBlockAssociationSet,cidr_block_association_set +CidrBlockInUseException,cidr_block_in_use_exception +CidrBlockSet,cidr_block_set +CidrBlockState,cidr_block_state +CidrBlockSummary,cidr_block_summary +CidrBlocks,cidr_blocks +CidrCollection,cidr_collection +CidrCollectionAlreadyExistsException,cidr_collection_already_exists_exception +CidrCollectionChange,cidr_collection_change +CidrCollectionInUseException,cidr_collection_in_use_exception +CidrCollectionVersionMismatchException,cidr_collection_version_mismatch_exception +CidrCollections,cidr_collections +CidrIp,cidr_ip +CidrIps,cidr_ips +CidrIpv4,cidr_ipv4 +CidrIpv6,cidr_ipv6 +CidrList,cidr_list +CidrLocations,cidr_locations +CidrRoutingConfig,cidr_routing_config +Cidrs,cidrs +CifsShareCount,cifs_share_count +Cipher,cipher +CipherText,cipher_text +Ciphers,ciphers +CiphertextBlob,ciphertext_blob +CiphertextForRecipient,ciphertext_for_recipient +Circle,circle +CisaData,cisa_data +City,city +CityName,city_name +Claim,claim +ClaimCode,claim_code +ClaimDeviceRequest,claim_device_request +ClaimDevicesByClaimCodeRequest,claim_devices_by_claim_code_request +ClaimDevicesByClaimCodeResponse,claim_devices_by_claim_code_response +ClaimFilterOption,claim_filter_option +ClaimGameServerInput,claim_game_server_input +ClaimGameServerOutput,claim_game_server_output +ClaimPhoneNumberRequest,claim_phone_number_request +ClaimPhoneNumberResponse,claim_phone_number_response +ClaimRegex,claim_regex +ClaimStatus,claim_status +ClaimedPhoneNumberSummary,claimed_phone_number_summary +ClapAtom,clap_atom +ClarifyCheck,clarify_check +ClarifyCheckStepMetadata,clarify_check_step_metadata +ClarifyExplainerConfig,clarify_explainer_config +ClarifyInferenceConfig,clarify_inference_config +ClarifyShapBaselineConfig,clarify_shap_baseline_config +ClarifyShapConfig,clarify_shap_config +ClarifyTextConfig,clarify_text_config +ClassBTimeout,class_b_timeout +ClassCTimeout,class_c_timeout +ClassName,class_name +Classes,classes +Classic,classic +ClassicLinkDnsSupport,classic_link_dns_support +ClassicLinkDnsSupported,classic_link_dns_supported +ClassicLinkEnabled,classic_link_enabled +ClassicLinkInstance,classic_link_instance +ClassicLinkVPCId,classic_link_vpc_id +ClassicLinkVPCSecurityGroups,classic_link_vpc_security_groups +ClassicLinkVpcId,classic_link_vpc_id +ClassicLinkVpcSecurityGroups,classic_link_vpc_security_groups +ClassicLoadBalancer,classic_load_balancer +ClassicLoadBalancerListener,classic_load_balancer_listener +ClassicLoadBalancers,classic_load_balancers +ClassicLoadBalancersConfig,classic_load_balancers_config +Classification,classification +ClassificationDetails,classification_details +ClassificationExportConfiguration,classification_export_configuration +ClassificationResult,classification_result +ClassificationResultStatus,classification_result_status +ClassificationScopeSummary,classification_scope_summary +ClassificationStatus,classification_status +ClassificationType,classification_type +ClassificationTypeUpdate,classification_type_update +Classifier,classifier +ClassifierEvaluationMetrics,classifier_evaluation_metrics +ClassifierMetadata,classifier_metadata +Classifiers,classifiers +ClassifyDocumentRequest,classify_document_request +ClassifyDocumentResponse,classify_document_response +CleanAmplifyApp,clean_amplify_app +CleanSourceMetadataOnMismatch,clean_source_metadata_on_mismatch +CleansedPhoneNumberE164,cleansed_phone_number_e164 +CleansedPhoneNumberNational,cleansed_phone_number_national +ClearAllocationDefaultNetmaskLength,clear_allocation_default_netmask_length +ClearQuerySuggestionsRequest,clear_query_suggestions_request +ClearTimerAction,clear_timer_action +CliToken,cli_token +ClickFeedback,click_feedback +ClickFeedbackItems,click_feedback_items +ClickTime,click_time +ClientAffinity,client_affinity +ClientArn,client_arn +ClientAssociationMetadata,client_association_metadata +ClientAuthentication,client_authentication +ClientAuthenticationSettingInfo,client_authentication_setting_info +ClientAuthenticationSettingsInfo,client_authentication_settings_info +ClientBroker,client_broker +ClientCache,client_cache +ClientCertAuthSettings,client_cert_auth_settings +ClientCertificate,client_certificate +ClientCertificateId,client_certificate_id +ClientCertificateRevocationListStatus,client_certificate_revocation_list_status +ClientCertificates,client_certificates +ClientCidrBlock,client_cidr_block +ClientConfig,client_config +ClientConfiguration,client_configuration +ClientConfigurationVersion,client_configuration_version +ClientConfigurations,client_configurations +ClientConnectOptions,client_connect_options +ClientConnectResponseOptions,client_connect_response_options +ClientContext,client_context +ClientData,client_data +ClientDownloadLandingPage,client_download_landing_page +ClientException,client_exception +ClientID,client_id +ClientIDList,client_id_list +ClientIP,client_ip +ClientIPPreservationEnabled,client_ip_preservation_enabled +ClientId,client_id +ClientImpacting,client_impacting +ClientIp,client_ip +ClientLimitExceededException,client_limit_exceeded_exception +ClientList,client_list +ClientLoginBannerOptions,client_login_banner_options +ClientLoginBannerResponseOptions,client_login_banner_response_options +ClientMetadata,client_metadata +ClientName,client_name +ClientParameters,client_parameters +ClientPasswordAuthType,client_password_auth_type +ClientPolicy,client_policy +ClientPolicyTls,client_policy_tls +ClientProperties,client_properties +ClientPropertiesList,client_properties_list +ClientPropertiesResult,client_properties_result +ClientPublicKey,client_public_key +ClientRequestId,client_request_id +ClientRequestImpactStatistics,client_request_impact_statistics +ClientRequestToken,client_request_token +ClientRequestTokenRequiredException,client_request_token_required_exception +ClientRootCertificateChain,client_root_certificate_chain +ClientRootCertificateChainArn,client_root_certificate_chain_arn +ClientSdkVersion,client_sdk_version +ClientSecret,client_secret +ClientSessionId,client_session_id +ClientSideTimestamps,client_side_timestamps +ClientSubnet,client_subnet +ClientSubnets,client_subnets +ClientTimeoutException,client_timeout_exception +ClientToken,client_token +ClientTokenConflictException,client_token_conflict_exception +ClientTokenId,client_token_id +ClientTunnelAddress,client_tunnel_address +ClientVersion,client_version +ClientVpcConnection,client_vpc_connection +ClientVpcConnections,client_vpc_connections +ClientVpcIpAddress,client_vpc_ip_address +ClientVpnAuthentication,client_vpn_authentication +ClientVpnAuthenticationRequest,client_vpn_authentication_request +ClientVpnAuthorizationRuleStatus,client_vpn_authorization_rule_status +ClientVpnConnection,client_vpn_connection +ClientVpnConnectionStatus,client_vpn_connection_status +ClientVpnEndpoint,client_vpn_endpoint +ClientVpnEndpointAttributeStatus,client_vpn_endpoint_attribute_status +ClientVpnEndpointId,client_vpn_endpoint_id +ClientVpnEndpointIds,client_vpn_endpoint_ids +ClientVpnEndpointStatus,client_vpn_endpoint_status +ClientVpnEndpoints,client_vpn_endpoints +ClientVpnRoute,client_vpn_route +ClientVpnRouteStatus,client_vpn_route_status +ClientVpnTargetNetworks,client_vpn_target_networks +Clients,clients +Clip,clip +ClipFragmentSelector,clip_fragment_selector +ClipLimits,clip_limits +ClipRange,clip_range +ClipTimestampRange,clip_timestamp_range +ClockRate,clock_rate +ClockSync,clock_sync +Clocks,clocks +CloneAppIds,clone_app_ids +CloneBackendRequest,clone_backend_request +CloneBackendResponse,clone_backend_response +CloneGroupId,clone_group_id +ClonePermissions,clone_permissions +CloneReceiptRuleSetRequest,clone_receipt_rule_set_request +CloneStackRequest,clone_stack_request +CloneStackResult,clone_stack_result +CloseAccountRequest,close_account_request +CloseInstancePublicPortsRequest,close_instance_public_ports_request +CloseInstancePublicPortsResult,close_instance_public_ports_result +CloseStatusFilter,close_status_filter +CloseTime,close_time +CloseTunnelRequest,close_tunnel_request +Closed,closed +ClosedDays,closed_days +ClosedDaysRule,closed_days_rule +CloudComponentStatus,cloud_component_status +CloudFormation,cloud_formation +CloudFormationCollection,cloud_formation_collection +CloudFormationCollectionFilter,cloud_formation_collection_filter +CloudFormationCostEstimationResourceCollectionFilter,cloud_formation_cost_estimation_resource_collection_filter +CloudFormationHealth,cloud_formation_health +CloudFormationOverridePropertyConfiguration,cloud_formation_override_property_configuration +CloudFormationStackARN,cloud_formation_stack_arn +CloudFormationStackArn,cloud_formation_stack_arn +CloudFormationStackRecord,cloud_formation_stack_record +CloudFormationStackRecordSourceInfo,cloud_formation_stack_record_source_info +CloudFormationTarget,cloud_formation_target +CloudFrontDefaultCertificate,cloud_front_default_certificate +CloudFrontDistribution,cloud_front_distribution +CloudFrontDomain,cloud_front_domain +CloudFrontOriginAccessIdentity,cloud_front_origin_access_identity +CloudFrontOriginAccessIdentityAlreadyExists,cloud_front_origin_access_identity_already_exists +CloudFrontOriginAccessIdentityConfig,cloud_front_origin_access_identity_config +CloudFrontOriginAccessIdentityInUse,cloud_front_origin_access_identity_in_use +CloudFrontOriginAccessIdentityList,cloud_front_origin_access_identity_list +CloudFrontOriginAccessIdentitySummary,cloud_front_origin_access_identity_summary +CloudHsmAccessDeniedException,cloud_hsm_access_denied_exception +CloudHsmClusterId,cloud_hsm_cluster_id +CloudHsmClusterInUseException,cloud_hsm_cluster_in_use_exception +CloudHsmClusterInvalidConfigurationException,cloud_hsm_cluster_invalid_configuration_exception +CloudHsmClusterNotActiveException,cloud_hsm_cluster_not_active_exception +CloudHsmClusterNotFoundException,cloud_hsm_cluster_not_found_exception +CloudHsmClusterNotRelatedException,cloud_hsm_cluster_not_related_exception +CloudHsmInternalException,cloud_hsm_internal_exception +CloudHsmInternalFailureException,cloud_hsm_internal_failure_exception +CloudHsmInvalidRequestException,cloud_hsm_invalid_request_exception +CloudHsmResourceNotFoundException,cloud_hsm_resource_not_found_exception +CloudHsmServiceException,cloud_hsm_service_exception +CloudHsmTagException,cloud_hsm_tag_exception +CloudLayout,cloud_layout +CloudOnlyDirectoriesCurrentCount,cloud_only_directories_current_count +CloudOnlyDirectoriesLimit,cloud_only_directories_limit +CloudOnlyDirectoriesLimitReached,cloud_only_directories_limit_reached +CloudOnlyMicrosoftADCurrentCount,cloud_only_microsoft_ad_current_count +CloudOnlyMicrosoftADLimit,cloud_only_microsoft_ad_limit +CloudOnlyMicrosoftADLimitReached,cloud_only_microsoft_ad_limit_reached +CloudRemovalConfigInput,cloud_removal_config_input +CloudTrail,cloud_trail +CloudTrailARNInvalidException,cloud_trail_arn_invalid_exception +CloudTrailAccessNotEnabledException,cloud_trail_access_not_enabled_exception +CloudTrailConfigurationResult,cloud_trail_configuration_result +CloudTrailDetails,cloud_trail_details +CloudTrailEvent,cloud_trail_event +CloudTrailInvalidClientTokenIdException,cloud_trail_invalid_client_token_id_exception +CloudTrailProperties,cloud_trail_properties +CloudWatchAlarmConfiguration,cloud_watch_alarm_configuration +CloudWatchAlarmDefinition,cloud_watch_alarm_definition +CloudWatchConfig,cloud_watch_config +CloudWatchDashboard,cloud_watch_dashboard +CloudWatchDashboards,cloud_watch_dashboards +CloudWatchDestination,cloud_watch_destination +CloudWatchDimensionConfiguration,cloud_watch_dimension_configuration +CloudWatchEncryption,cloud_watch_encryption +CloudWatchEncryptionEnabled,cloud_watch_encryption_enabled +CloudWatchEncryptionMode,cloud_watch_encryption_mode +CloudWatchEventDetailType,cloud_watch_event_detail_type +CloudWatchEventId,cloud_watch_event_id +CloudWatchEventSource,cloud_watch_event_source +CloudWatchEventsExecutionDataDetails,cloud_watch_events_execution_data_details +CloudWatchLogDeliveryOptions,cloud_watch_log_delivery_options +CloudWatchLogDestination,cloud_watch_log_destination +CloudWatchLogGroupARN,cloud_watch_log_group_arn +CloudWatchLogGroupArn,cloud_watch_log_group_arn +CloudWatchLogGroupLogDestination,cloud_watch_log_group_log_destination +CloudWatchLogGroupName,cloud_watch_log_group_name +CloudWatchLogOptions,cloud_watch_log_options +CloudWatchLogOptionsSpecification,cloud_watch_log_options_specification +CloudWatchLoggingConfiguration,cloud_watch_logging_configuration +CloudWatchLoggingOption,cloud_watch_logging_option +CloudWatchLoggingOptionDescription,cloud_watch_logging_option_description +CloudWatchLoggingOptionDescriptions,cloud_watch_logging_option_descriptions +CloudWatchLoggingOptionId,cloud_watch_logging_option_id +CloudWatchLoggingOptionUpdate,cloud_watch_logging_option_update +CloudWatchLoggingOptionUpdates,cloud_watch_logging_option_updates +CloudWatchLoggingOptions,cloud_watch_logging_options +CloudWatchLogs,cloud_watch_logs +CloudWatchLogsConfig,cloud_watch_logs_config +CloudWatchLogsConfiguration,cloud_watch_logs_configuration +CloudWatchLogsConfigurationType,cloud_watch_logs_configuration_type +CloudWatchLogsDeliveryUnavailableException,cloud_watch_logs_delivery_unavailable_exception +CloudWatchLogsDestination,cloud_watch_logs_destination +CloudWatchLogsDestinationConfig,cloud_watch_logs_destination_config +CloudWatchLogsDestinationConfiguration,cloud_watch_logs_destination_configuration +CloudWatchLogsDestinationDetails,cloud_watch_logs_destination_details +CloudWatchLogsDetails,cloud_watch_logs_details +CloudWatchLogsLogDelivery,cloud_watch_logs_log_delivery +CloudWatchLogsLogDeliveryDescription,cloud_watch_logs_log_delivery_description +CloudWatchLogsLogGroup,cloud_watch_logs_log_group +CloudWatchLogsLogGroupArn,cloud_watch_logs_log_group_arn +CloudWatchLogsLogStream,cloud_watch_logs_log_stream +CloudWatchLogsParameters,cloud_watch_logs_parameters +CloudWatchLogsRoleArn,cloud_watch_logs_role_arn +CloudWatchMetrics,cloud_watch_metrics +CloudWatchMetricsDataSummary,cloud_watch_metrics_data_summary +CloudWatchMetricsDetail,cloud_watch_metrics_detail +CloudWatchMetricsDimension,cloud_watch_metrics_dimension +CloudWatchMetricsEnabled,cloud_watch_metrics_enabled +CloudWatchMonitoringConfiguration,cloud_watch_monitoring_configuration +CloudWatchOutputConfig,cloud_watch_output_config +CloudWatchOutputEnabled,cloud_watch_output_enabled +CloudWatchOutputUrl,cloud_watch_output_url +Cloudwatch,cloudwatch +CloudwatchAlarmAction,cloudwatch_alarm_action +CloudwatchLogGroup,cloudwatch_log_group +CloudwatchLogStream,cloudwatch_log_stream +CloudwatchLogsAction,cloudwatch_logs_action +CloudwatchLogsExportConfiguration,cloudwatch_logs_export_configuration +CloudwatchMetricAction,cloudwatch_metric_action +Cluster,cluster +ClusterAlreadyExistsFault,cluster_already_exists_fault +ClusterArn,cluster_arn +ClusterAssociatedToSchedule,cluster_associated_to_schedule +ClusterAvailabilityStatus,cluster_availability_status +ClusterBlockStorageLogicalUsed,cluster_block_storage_logical_used +ClusterBlockStorageSize,cluster_block_storage_size +ClusterBlockStorageUsed,cluster_block_storage_used +ClusterCertificate,cluster_certificate +ClusterCloudStorageUsed,cluster_cloud_storage_used +ClusterConfig,cluster_config +ClusterConfigStatus,cluster_config_status +ClusterConfiguration,cluster_configuration +ClusterContainsContainerInstancesException,cluster_contains_container_instances_exception +ClusterContainsServicesException,cluster_contains_services_exception +ClusterContainsTasksException,cluster_contains_tasks_exception +ClusterCreateTime,cluster_create_time +ClusterCredentials,cluster_credentials +ClusterCsr,cluster_csr +ClusterDbRevision,cluster_db_revision +ClusterDbRevisions,cluster_db_revisions +ClusterDbRevisionsMessage,cluster_db_revisions_message +ClusterDiscoveryEndpoint,cluster_discovery_endpoint +ClusterEnabled,cluster_enabled +ClusterEndpoint,cluster_endpoint +ClusterEndpointEncryptionType,cluster_endpoint_encryption_type +ClusterEndpoints,cluster_endpoints +ClusterExists,cluster_exists +ClusterExtendedCredentials,cluster_extended_credentials +ClusterHealth,cluster_health +ClusterIamRole,cluster_iam_role +ClusterId,cluster_id +ClusterIdentifier,cluster_identifier +ClusterInList,cluster_in_list +ClusterInfo,cluster_info +ClusterInfoList,cluster_info_list +ClusterIssue,cluster_issue +ClusterJDBCURL,cluster_jdbcurl +ClusterLimitExceededException,cluster_limit_exceeded_exception +ClusterListEntries,cluster_list_entries +ClusterListEntry,cluster_list_entry +ClusterLogging,cluster_logging +ClusterMarker,cluster_marker +ClusterMarkerConfiguration,cluster_marker_configuration +ClusterMetadata,cluster_metadata +ClusterMode,cluster_mode +ClusterName,cluster_name +ClusterNameFilter,cluster_name_filter +ClusterNames,cluster_names +ClusterNamespaceArn,cluster_namespace_arn +ClusterNode,cluster_node +ClusterNodes,cluster_nodes +ClusterNotFoundException,cluster_not_found_exception +ClusterNotFoundFault,cluster_not_found_fault +ClusterOnLatestRevisionFault,cluster_on_latest_revision_fault +ClusterOperationArn,cluster_operation_arn +ClusterOperationInfo,cluster_operation_info +ClusterOperationInfoList,cluster_operation_info_list +ClusterOperationStep,cluster_operation_step +ClusterOperationStepInfo,cluster_operation_step_info +ClusterOperationV2,cluster_operation_v2 +ClusterOperationV2Provisioned,cluster_operation_v2_provisioned +ClusterOperationV2Serverless,cluster_operation_v2_serverless +ClusterOperationV2Summary,cluster_operation_v2_summary +ClusterParameterGroup,cluster_parameter_group +ClusterParameterGroupAlreadyExistsFault,cluster_parameter_group_already_exists_fault +ClusterParameterGroupDetails,cluster_parameter_group_details +ClusterParameterGroupFamily,cluster_parameter_group_family +ClusterParameterGroupName,cluster_parameter_group_name +ClusterParameterGroupNameMessage,cluster_parameter_group_name_message +ClusterParameterGroupNotFoundFault,cluster_parameter_group_not_found_fault +ClusterParameterGroupQuotaExceededFault,cluster_parameter_group_quota_exceeded_fault +ClusterParameterGroupStatus,cluster_parameter_group_status +ClusterParameterGroups,cluster_parameter_groups +ClusterParameterGroupsMessage,cluster_parameter_groups_message +ClusterParameterStatus,cluster_parameter_status +ClusterParameterStatusList,cluster_parameter_status_list +ClusterPendingModifiedValues,cluster_pending_modified_values +ClusterPendingUpdates,cluster_pending_updates +ClusterPublicKey,cluster_public_key +ClusterQuotaExceededFault,cluster_quota_exceeded_fault +ClusterQuotaForCustomerExceededFault,cluster_quota_for_customer_exceeded_fault +ClusterRevisionNumber,cluster_revision_number +ClusterRoleArn,cluster_role_arn +ClusterSecurityGroup,cluster_security_group +ClusterSecurityGroupAlreadyExistsFault,cluster_security_group_already_exists_fault +ClusterSecurityGroupMembership,cluster_security_group_membership +ClusterSecurityGroupMessage,cluster_security_group_message +ClusterSecurityGroupName,cluster_security_group_name +ClusterSecurityGroupNotFoundFault,cluster_security_group_not_found_fault +ClusterSecurityGroupQuotaExceededFault,cluster_security_group_quota_exceeded_fault +ClusterSecurityGroups,cluster_security_groups +ClusterServiceConnectDefaults,cluster_service_connect_defaults +ClusterServiceConnectDefaultsRequest,cluster_service_connect_defaults_request +ClusterSetting,cluster_setting +ClusterSettings,cluster_settings +ClusterSnapshot,cluster_snapshot +ClusterSnapshotAlreadyExistsFault,cluster_snapshot_already_exists_fault +ClusterSnapshotCopyStatus,cluster_snapshot_copy_status +ClusterSnapshotInList,cluster_snapshot_in_list +ClusterSnapshotNotFoundFault,cluster_snapshot_not_found_fault +ClusterSnapshotQuotaExceededFault,cluster_snapshot_quota_exceeded_fault +ClusterState,cluster_state +ClusterStateChangeReason,cluster_state_change_reason +ClusterStates,cluster_states +ClusterStatus,cluster_status +ClusterSubnetGroup,cluster_subnet_group +ClusterSubnetGroupAlreadyExistsFault,cluster_subnet_group_already_exists_fault +ClusterSubnetGroupMessage,cluster_subnet_group_message +ClusterSubnetGroupName,cluster_subnet_group_name +ClusterSubnetGroupNotFoundFault,cluster_subnet_group_not_found_fault +ClusterSubnetGroupQuotaExceededFault,cluster_subnet_group_quota_exceeded_fault +ClusterSubnetGroups,cluster_subnet_groups +ClusterSubnetQuotaExceededFault,cluster_subnet_quota_exceeded_fault +ClusterSummary,cluster_summary +ClusterTimeline,cluster_timeline +ClusterType,cluster_type +ClusterTypeFilter,cluster_type_filter +ClusterUuid,cluster_uuid +ClusterVersion,cluster_version +ClusterVersions,cluster_versions +ClusterVersionsMessage,cluster_versions_message +ClusteringKey,clustering_key +Clusters,clusters +ClustersMessage,clusters_message +CmafAdditionalManifest,cmaf_additional_manifest +CmafEncryption,cmaf_encryption +CmafEncryptionMethod,cmaf_encryption_method +CmafEncryptionSettings,cmaf_encryption_settings +CmafGroupSettings,cmaf_group_settings +CmafImageBasedTrickPlaySettings,cmaf_image_based_trick_play_settings +CmafPackage,cmaf_package +CmafPackageCreateOrUpdateParameters,cmaf_package_create_or_update_parameters +CmfcSettings,cmfc_settings +CmkArn,cmk_arn +CmkType,cmk_type +Cname,cname +CoIp,co_ip +Code,code +CodeArtifacts,code_artifacts +CodeBlock,code_block +CodeBuildNotInServiceRegionException,code_build_not_in_service_region_exception +CodeBuildServiceRole,code_build_service_role +CodeCommit,code_commit +CodeCommitCodeDestination,code_commit_code_destination +CodeCommitRepository,code_commit_repository +CodeConfiguration,code_configuration +CodeConfigurationValues,code_configuration_values +CodeContent,code_content +CodeContentDescription,code_content_description +CodeContentType,code_content_type +CodeContentTypeUpdate,code_content_type_update +CodeContentUpdate,code_content_update +CodeCoverage,code_coverage +CodeCoverageReportSummary,code_coverage_report_summary +CodeDeliveryDetails,code_delivery_details +CodeDeliveryDetailsList,code_delivery_details_list +CodeDeliveryDetailsType,code_delivery_details_type +CodeDeliveryFailureException,code_delivery_failure_exception +CodeDeployApplication,code_deploy_application +CodeDeployDeploymentGroup,code_deploy_deployment_group +CodeDeployDeploymentId,code_deploy_deployment_id +CodeDeployInstanceGroupId,code_deploy_instance_group_id +CodeDeployState,code_deploy_state +CodeDestination,code_destination +CodeError,code_error +CodeErrorLocation,code_error_location +CodeFilePath,code_file_path +CodeGenConfigurationNode,code_gen_configuration_node +CodeGenConfigurationNodes,code_gen_configuration_nodes +CodeGenEdge,code_gen_edge +CodeGenNode,code_gen_node +CodeGenNodeArg,code_gen_node_arg +CodeHook,code_hook +CodeHookSpecification,code_hook_specification +CodeLength,code_length +CodeLine,code_line +CodeLineCount,code_line_count +CodeMD5,code_md5 +CodeMismatchException,code_mismatch_exception +CodeRepositories,code_repositories +CodeRepository,code_repository +CodeRepositoryArn,code_repository_arn +CodeRepositoryName,code_repository_name +CodeRepositorySummary,code_repository_summary +CodeRepositorySummaryList,code_repository_summary_list +CodeReview,code_review +CodeReviewArn,code_review_arn +CodeReviewSummaries,code_review_summaries +CodeReviewSummary,code_review_summary +CodeReviewType,code_review_type +CodeSha256,code_sha256 +CodeSigning,code_signing +CodeSigningCertificateChain,code_signing_certificate_chain +CodeSigningConfig,code_signing_config +CodeSigningConfigArn,code_signing_config_arn +CodeSigningConfigId,code_signing_config_id +CodeSigningConfigNotFoundException,code_signing_config_not_found_exception +CodeSigningConfigs,code_signing_configs +CodeSigningPolicies,code_signing_policies +CodeSigningSignature,code_signing_signature +CodeSize,code_size +CodeSizeUnzipped,code_size_unzipped +CodeSizeZipped,code_size_zipped +CodeSnippetError,code_snippet_error +CodeSnippetResult,code_snippet_result +CodeSource,code_source +CodeStar,code_star +CodeStarParameters,code_star_parameters +CodeStorageExceededException,code_storage_exceeded_exception +CodeValidationException,code_validation_exception +CodeVerificationFailedException,code_verification_failed_exception +CodeVulnerabilities,code_vulnerabilities +CodeVulnerabilitiesFilePath,code_vulnerabilities_file_path +CodeVulnerabilityDetails,code_vulnerability_details +Codec,codec +CodecLevel,codec_level +CodecOptions,codec_options +CodecProfile,codec_profile +CodecSettings,codec_settings +CodecSpecification,codec_specification +CodegenDependency,codegen_dependency +CodegenFeatureFlags,codegen_feature_flags +CodegenGenericDataEnum,codegen_generic_data_enum +CodegenGenericDataField,codegen_generic_data_field +CodegenGenericDataModel,codegen_generic_data_model +CodegenGenericDataNonModel,codegen_generic_data_non_model +CodegenGenericDataRelationshipType,codegen_generic_data_relationship_type +CodegenJob,codegen_job +CodegenJobAsset,codegen_job_asset +CodegenJobGenericDataSchema,codegen_job_generic_data_schema +CodegenJobSummary,codegen_job_summary +CodingMode,coding_mode +CognitoConfig,cognito_config +CognitoEnabled,cognito_enabled +CognitoIdentityProvider,cognito_identity_provider +CognitoIdentityProviders,cognito_identity_providers +CognitoMemberDefinition,cognito_member_definition +CognitoOptions,cognito_options +CognitoOptionsStatus,cognito_options_status +CognitoStreams,cognito_streams +CognitoUserPoolConfig,cognito_user_pool_config +CognitoUserPoolConfiguration,cognito_user_pool_configuration +CognitoUserPoolId,cognito_user_pool_id +CohortId,cohort_id +CoipAddressUsage,coip_address_usage +CoipAddressUsages,coip_address_usages +CoipCidr,coip_cidr +CoipPool,coip_pool +CoipPoolId,coip_pool_id +CoipPools,coip_pools +ColdStorageOptions,cold_storage_options +Collaboration,collaboration +CollaborationAnalysisTemplate,collaboration_analysis_template +CollaborationAnalysisTemplateSummary,collaboration_analysis_template_summary +CollaborationSummary,collaboration_summary +CollapseId,collapse_id +CollapseKey,collapse_key +CollapseStateOptions,collapse_state_options +CollapsedRowDimensionsVisibility,collapsed_row_dimensions_visibility +Collection,collection +CollectionARN,collection_arn +CollectionArn,collection_arn +CollectionConfig,collection_config +CollectionConfiguration,collection_configuration +CollectionConfigurations,collection_configurations +CollectionDetail,collection_detail +CollectionDurationMinutes,collection_duration_minutes +CollectionEndpoint,collection_endpoint +CollectionErrorDetail,collection_error_detail +CollectionFilters,collection_filters +CollectionId,collection_id +CollectionIds,collection_ids +CollectionName,collection_name +CollectionParameters,collection_parameters +CollectionSummary,collection_summary +CollectionType,collection_type +CollectionVersion,collection_version +Collections,collections +CollectiveConstant,collective_constant +Collector,collector +CollectorHealthCheck,collector_health_check +CollectorName,collector_name +CollectorNotFoundFault,collector_not_found_fault +CollectorReferencedId,collector_referenced_id +CollectorResponse,collector_response +CollectorShortInfoResponse,collector_short_info_response +CollectorStatus,collector_status +CollectorVersion,collector_version +Collectors,collectors +Color,color +ColorAxis,color_axis +ColorCorrector,color_corrector +ColorFillType,color_fill_type +ColorItemsLimit,color_items_limit +ColorItemsLimitConfiguration,color_items_limit_configuration +ColorLabelOptions,color_label_options +ColorMap,color_map +ColorMetadata,color_metadata +ColorRange,color_range +ColorScale,color_scale +ColorSort,color_sort +ColorSpace,color_space +ColorSpaceConversion,color_space_conversion +ColorSpacePassthroughSettings,color_space_passthrough_settings +ColorSpaceSettings,color_space_settings +ColorSpaceUsage,color_space_usage +Colorimetry,colorimetry +Colors,colors +ColorsConfiguration,colors_configuration +Column,column +ColumnConfiguration,column_configuration +ColumnConfigurations,column_configurations +ColumnDataRole,column_data_role +ColumnDefinition,column_definition +ColumnDepth,column_depth +ColumnDescription,column_description +ColumnError,column_error +ColumnFormat,column_format +ColumnFriendlyName,column_friendly_name +ColumnGeographicRole,column_geographic_role +ColumnGroup,column_group +ColumnGroupColumnSchema,column_group_column_schema +ColumnGroupColumnSchemaList,column_group_column_schema_list +ColumnGroupSchema,column_group_schema +ColumnGroupSchemaList,column_group_schema_list +ColumnGroups,column_groups +ColumnHeaderStyle,column_header_style +ColumnHierarchies,column_hierarchies +ColumnHierarchy,column_hierarchy +ColumnId,column_id +ColumnIdentifier,column_identifier +ColumnImportance,column_importance +ColumnImportances,column_importances +ColumnIndex,column_index +ColumnInfo,column_info +ColumnLFTag,column_lf_tag +ColumnLabelOptions,column_label_options +ColumnLevelPermissionRule,column_level_permission_rule +ColumnLevelPermissionRules,column_level_permission_rules +ColumnLevelPermissionRulesApplied,column_level_permission_rules_applied +ColumnList,column_list +ColumnMetadata,column_metadata +ColumnName,column_name +ColumnNames,column_names +ColumnNamesVisibility,column_names_visibility +ColumnRange,column_range +ColumnRowFilter,column_row_filter +ColumnSchema,column_schema +ColumnSchemaList,column_schema_list +ColumnSelector,column_selector +ColumnSelectors,column_selectors +ColumnSeparator,column_separator +ColumnSort,column_sort +ColumnSpan,column_span +ColumnStatistics,column_statistics +ColumnStatisticsConfiguration,column_statistics_configuration +ColumnStatisticsConfigurations,column_statistics_configurations +ColumnStatisticsData,column_statistics_data +ColumnStatisticsError,column_statistics_error +ColumnStatisticsList,column_statistics_list +ColumnSubtotalOptions,column_subtotal_options +ColumnSynonyms,column_synonyms +ColumnTag,column_tag +ColumnToJsonKeyMappings,column_to_json_key_mappings +ColumnToMatch,column_to_match +ColumnTooltipItem,column_tooltip_item +ColumnTotalOptions,column_total_options +ColumnType,column_type +ColumnWildcard,column_wildcard +Columns,columns +ComboChartAggregatedFieldWells,combo_chart_aggregated_field_wells +ComboChartConfiguration,combo_chart_configuration +ComboChartFieldWells,combo_chart_field_wells +ComboChartSortConfiguration,combo_chart_sort_configuration +ComboChartVisual,combo_chart_visual +Command,command +CommandFilter,command_filter +CommandId,command_id +CommandIds,command_ids +CommandInvocation,command_invocation +CommandInvocations,command_invocations +CommandPlugin,command_plugin +CommandPlugins,command_plugins +Commands,commands +Comment,comment +CommentContent,comment_content +CommentContentRequiredException,comment_content_required_exception +CommentContentSizeLimitExceededException,comment_content_size_limit_exceeded_exception +CommentDeletedException,comment_deleted_exception +CommentDoesNotExistException,comment_does_not_exist_exception +CommentFieldMappings,comment_field_mappings +CommentId,comment_id +CommentIdRequiredException,comment_id_required_exception +CommentMetadata,comment_metadata +CommentNotCreatedByCallerException,comment_not_created_by_caller_exception +CommentStatus,comment_status +Comments,comments +CommentsForComparedCommit,comments_for_compared_commit +CommentsForPullRequest,comments_for_pull_request +Commit,commit +CommitDiff,commit_diff +CommitDiffSourceCodeType,commit_diff_source_code_type +CommitDigest,commit_digest +CommitDoesNotExistException,commit_does_not_exist_exception +CommitId,commit_id +CommitIdDoesNotExistException,commit_id_does_not_exist_exception +CommitIdRequiredException,commit_id_required_exception +CommitIdsLimitExceededException,commit_ids_limit_exceeded_exception +CommitIdsListRequiredException,commit_ids_list_required_exception +CommitMessage,commit_message +CommitMessageLengthExceededException,commit_message_length_exceeded_exception +CommitRequiredException,commit_required_exception +CommitTransaction,commit_transaction +CommitTransactionRequest,commit_transaction_request +CommitTransactionResponse,commit_transaction_response +CommitTransactionResult,commit_transaction_result +Commitment,commitment +CommitmentConfiguration,commitment_configuration +CommitmentInformation,commitment_information +CommonAttributes,common_attributes +CommonName,common_name +CommonPrefix,common_prefix +CommonPrefixes,common_prefixes +CommsProtocol,comms_protocol +Communication,communication +CommunicationTypeOptions,communication_type_options +CompUpdate,comp_update +Company,company +CompanyCode,company_code +CompanyName,company_name +ComparativeOrder,comparative_order +Comparator,comparator +CompareFacesMatch,compare_faces_match +CompareFacesRequest,compare_faces_request +CompareFacesResponse,compare_faces_response +ComparedFace,compared_face +ComparedSourceImageFace,compared_source_image_face +Comparison,comparison +ComparisonConfiguration,comparison_configuration +ComparisonFormat,comparison_format +ComparisonFormatConfiguration,comparison_format_configuration +ComparisonMethod,comparison_method +ComparisonOperator,comparison_operator +ComparisonType,comparison_type +ComparisonValue,comparison_value +ComparisonValues,comparison_values +Compatibility,compatibility +CompatibleArchitecture,compatible_architecture +CompatibleArchitectures,compatible_architectures +CompatibleElasticsearchVersions,compatible_elasticsearch_versions +CompatibleEnvironmentTemplate,compatible_environment_template +CompatibleEnvironmentTemplateInput,compatible_environment_template_input +CompatibleImage,compatible_image +CompatibleImages,compatible_images +CompatibleKafkaVersion,compatible_kafka_version +CompatibleKafkaVersions,compatible_kafka_versions +CompatibleNodes,compatible_nodes +CompatibleRuntime,compatible_runtime +CompatibleRuntimes,compatible_runtimes +CompatibleVersions,compatible_versions +CompatibleVersionsMap,compatible_versions_map +CompilationEndTime,compilation_end_time +CompilationJobArn,compilation_job_arn +CompilationJobName,compilation_job_name +CompilationJobStatus,compilation_job_status +CompilationJobSummaries,compilation_job_summaries +CompilationJobSummary,compilation_job_summary +CompilationStartTime,compilation_start_time +CompilationTargetDevice,compilation_target_device +CompilationTargetPlatformAccelerator,compilation_target_platform_accelerator +CompilationTargetPlatformArch,compilation_target_platform_arch +CompilationTargetPlatformOs,compilation_target_platform_os +CompiledOutputConfig,compiled_output_config +CompilerOptions,compiler_options +Complaint,complaint +ComplaintFeedbackType,complaint_feedback_type +ComplaintSubType,complaint_sub_type +ComplaintTopic,complaint_topic +Complaints,complaints +Complete,complete +CompleteAttachmentUploadRequest,complete_attachment_upload_request +CompleteLayerUploadRequest,complete_layer_upload_request +CompleteLayerUploadResponse,complete_layer_upload_response +CompleteLifecycleActionType,complete_lifecycle_action_type +CompleteMigrationMessage,complete_migration_message +CompleteMigrationResponse,complete_migration_response +CompleteMultipartReadSetUploadRequest,complete_multipart_read_set_upload_request +CompleteMultipartReadSetUploadResponse,complete_multipart_read_set_upload_response +CompleteMultipartUploadInput,complete_multipart_upload_input +CompleteMultipartUploadOutput,complete_multipart_upload_output +CompleteMultipartUploadRequest,complete_multipart_upload_request +CompleteOnConvergence,complete_on_convergence +CompleteReadSetUploadPartListItem,complete_read_set_upload_part_list_item +CompleteSnapshotRequest,complete_snapshot_request +CompleteSnapshotResponse,complete_snapshot_response +CompleteTime,complete_time +CompleteVaultLockInput,complete_vault_lock_input +CompleteWindowMinutes,complete_window_minutes +CompleteWorkflowExecutionDecisionAttributes,complete_workflow_execution_decision_attributes +CompleteWorkflowExecutionFailedEventAttributes,complete_workflow_execution_failed_event_attributes +Completed,completed +CompletedAt,completed_at +CompletedCount,completed_count +CompletedDate,completed_date +CompletedMultipartUpload,completed_multipart_upload +CompletedOn,completed_on +CompletedPart,completed_part +CompletedPieces,completed_pieces +CompletedProperties,completed_properties +CompletedTimestamp,completed_timestamp +CompletionCriteria,completion_criteria +CompletionDate,completion_date +CompletionDateTime,completion_date_time +CompletionMessage,completion_message +CompletionReport,completion_report +CompletionStatus,completion_status +CompletionTime,completion_time +CompletionWindowMinutes,completion_window_minutes +Complexity,complexity +Compliance,compliance +ComplianceAssociatedStandardsId,compliance_associated_standards_id +ComplianceByConfigRule,compliance_by_config_rule +ComplianceByConfigRules,compliance_by_config_rules +ComplianceByResource,compliance_by_resource +ComplianceByResources,compliance_by_resources +ComplianceContributorCount,compliance_contributor_count +ComplianceDetails,compliance_details +ComplianceDrift,compliance_drift +ComplianceExecutionSummary,compliance_execution_summary +ComplianceItem,compliance_item +ComplianceItemEntry,compliance_item_entry +ComplianceItems,compliance_items +ComplianceLevel,compliance_level +ComplianceResourceId,compliance_resource_id +ComplianceResourceIds,compliance_resource_ids +ComplianceResourceType,compliance_resource_type +ComplianceResourceTypes,compliance_resource_types +ComplianceSecurityControlId,compliance_security_control_id +ComplianceSeverity,compliance_severity +ComplianceStatus,compliance_status +ComplianceStringFilter,compliance_string_filter +ComplianceSummariesByResourceType,compliance_summaries_by_resource_type +ComplianceSummary,compliance_summary +ComplianceSummaryByResourceType,compliance_summary_by_resource_type +ComplianceSummaryItem,compliance_summary_item +ComplianceSummaryItems,compliance_summary_items +ComplianceSummaryTimestamp,compliance_summary_timestamp +ComplianceType,compliance_type +ComplianceTypeCountLimitExceededException,compliance_type_count_limit_exceeded_exception +ComplianceTypes,compliance_types +ComplianceViolator,compliance_violator +CompliantConformancePackCount,compliant_conformance_pack_count +CompliantCount,compliant_count +CompliantCriticalCount,compliant_critical_count +CompliantHighCount,compliant_high_count +CompliantInformationalCount,compliant_informational_count +CompliantLowCount,compliant_low_count +CompliantMediumCount,compliant_medium_count +CompliantResourceCount,compliant_resource_count +CompliantRuleCount,compliant_rule_count +CompliantSummary,compliant_summary +CompliantUnspecifiedCount,compliant_unspecified_count +Component,component +ComponentAccount,component_account +ComponentArn,component_arn +ComponentBindingPropertiesValue,component_binding_properties_value +ComponentBindingPropertiesValueProperties,component_binding_properties_value_properties +ComponentCandidate,component_candidate +ComponentChild,component_child +ComponentConditionProperty,component_condition_property +ComponentConfiguration,component_configuration +ComponentConfigurationUpdate,component_configuration_update +ComponentDataConfiguration,component_data_configuration +ComponentDependencyRequirement,component_dependency_requirement +ComponentDeploymentSpecification,component_deployment_specification +ComponentDescription,component_description +ComponentEvent,component_event +ComponentId,component_id +ComponentLatestVersion,component_latest_version +ComponentName,component_name +ComponentParameter,component_parameter +ComponentParameterDetail,component_parameter_detail +ComponentPlatform,component_platform +ComponentProperty,component_property +ComponentPropertyBindingProperties,component_property_binding_properties +ComponentPropertyGroupRequest,component_property_group_request +ComponentPropertyGroupResponse,component_property_group_response +ComponentRecommendation,component_recommendation +ComponentRegion,component_region +ComponentRemarks,component_remarks +ComponentRequest,component_request +ComponentResponse,component_response +ComponentRunWith,component_run_with +ComponentState,component_state +ComponentStatusData,component_status_data +ComponentSummary,component_summary +ComponentTimestampDelimiter,component_timestamp_delimiter +ComponentType,component_type +ComponentTypeSummary,component_type_summary +ComponentUpdateRequest,component_update_request +ComponentVariant,component_variant +ComponentVersion,component_version +ComponentVersionArn,component_version_arn +ComponentVersionListItem,component_version_list_item +Components,components +ComposeEnvironmentsMessage,compose_environments_message +CompositeAlarm,composite_alarm +CompositeAlarms,composite_alarms +CompositeMemberIdentifier,composite_member_identifier +CompositeModelProperty,composite_model_property +CompositePartitionKey,composite_partition_key +CompositeSlotTypeSetting,composite_slot_type_setting +CompositedVideo,composited_video +CompositedVideoArtifactsConfiguration,composited_video_artifacts_configuration +CompositedVideoConcatenationConfiguration,composited_video_concatenation_configuration +Composition,composition +ComprehendMedicalAsyncJobFilter,comprehend_medical_async_job_filter +ComprehendMedicalAsyncJobProperties,comprehend_medical_async_job_properties +ComprehendMedicalAsyncJobPropertiesList,comprehend_medical_async_job_properties_list +Compress,compress +Compressed,compressed +Compression,compression +CompressionFactor,compression_factor +CompressionFormat,compression_format +CompressionType,compression_type +CompromisedCredentialsActionsType,compromised_credentials_actions_type +CompromisedCredentialsDetected,compromised_credentials_detected +CompromisedCredentialsRiskConfiguration,compromised_credentials_risk_configuration +CompromisedCredentialsRiskConfigurationType,compromised_credentials_risk_configuration_type +Computation,computation +ComputationId,computation_id +ComputationPreference,computation_preference +Computations,computations +Compute,compute +ComputeArn,compute_arn +ComputeAttributes,compute_attributes +ComputeCapacity,compute_capacity +ComputeCapacityStatus,compute_capacity_status +ComputeConfig,compute_config +ComputeEnvironmentDetail,compute_environment_detail +ComputeEnvironmentOrder,compute_environment_order +ComputeFarmConfiguration,compute_farm_configuration +ComputeLimits,compute_limits +ComputeList,compute_list +ComputeName,compute_name +ComputeResource,compute_resource +ComputeResourceUpdate,compute_resource_update +ComputeResponse,compute_response +ComputeStatistics,compute_statistics +ComputeStatus,compute_status +ComputeTime,compute_time +ComputeType,compute_type +ComputeTypeName,compute_type_name +ComputeUtilization,compute_utilization +Computer,computer +ComputerAttributes,computer_attributes +ComputerId,computer_id +ComputerName,computer_name +ConcatenationSink,concatenation_sink +ConcatenationSource,concatenation_source +Concurrency,concurrency +ConcurrentAccessException,concurrent_access_exception +ConcurrentDeploymentException,concurrent_deployment_exception +ConcurrentExecutionRatePercentage,concurrent_execution_rate_percentage +ConcurrentExecutions,concurrent_executions +ConcurrentLimitExceededException,concurrent_limit_exceeded_exception +ConcurrentModification,concurrent_modification +ConcurrentModificationException,concurrent_modification_exception +ConcurrentOperationException,concurrent_operation_exception +ConcurrentReferenceUpdateException,concurrent_reference_update_exception +ConcurrentRunsExceededException,concurrent_runs_exceeded_exception +ConcurrentUpdateException,concurrent_update_exception +ConcurrentUpdatingException,concurrent_updating_exception +Condition,condition +ConditionBasedCollectionScheme,condition_based_collection_scheme +ConditionCheck,condition_check +ConditionCheckFailureException,condition_check_failure_exception +ConditionDocumentAttributeKey,condition_document_attribute_key +ConditionExpression,condition_expression +ConditionExpressions,condition_expressions +ConditionKey,condition_key +ConditionOnValue,condition_on_value +ConditionParameter,condition_parameter +ConditionStepMetadata,condition_step_metadata +ConditionType,condition_type +ConditionValue,condition_value +ConditionalBranch,conditional_branch +ConditionalCheckFailedException,conditional_check_failed_exception +ConditionalFormatting,conditional_formatting +ConditionalFormattingColor,conditional_formatting_color +ConditionalFormattingCustomIconCondition,conditional_formatting_custom_icon_condition +ConditionalFormattingCustomIconOptions,conditional_formatting_custom_icon_options +ConditionalFormattingGradientColor,conditional_formatting_gradient_color +ConditionalFormattingIcon,conditional_formatting_icon +ConditionalFormattingIconDisplayConfiguration,conditional_formatting_icon_display_configuration +ConditionalFormattingIconSet,conditional_formatting_icon_set +ConditionalFormattingOptions,conditional_formatting_options +ConditionalFormattingSolidColor,conditional_formatting_solid_color +ConditionalForwarder,conditional_forwarder +ConditionalForwarderIpAddrs,conditional_forwarder_ip_addrs +ConditionalForwarders,conditional_forwarders +ConditionalOperator,conditional_operator +ConditionalSpecification,conditional_specification +ConditionalSplit,conditional_split +ConditionalSplitActivity,conditional_split_activity +ConditionalToken,conditional_token +Conditions,conditions +ConferencePreference,conference_preference +ConferenceProvider,conference_provider +ConferenceProviderArn,conference_provider_arn +ConferenceProviderName,conference_provider_name +ConferenceProviderType,conference_provider_type +ConferenceProviders,conference_providers +Confidence,confidence +ConfidenceScore,confidence_score +Config,config +ConfigCred,config_cred +ConfigDeliveryS3DestinationArn,config_delivery_s3_destination_arn +ConfigExportDeliveryInfo,config_export_delivery_info +ConfigFile,config_file +ConfigFileState,config_file_state +ConfigId,config_id +ConfigIdResponse,config_id_response +ConfigListItem,config_list_item +ConfigParameter,config_parameter +ConfigRecommendation,config_recommendation +ConfigRule,config_rule +ConfigRuleArn,config_rule_arn +ConfigRuleComplianceFilters,config_rule_compliance_filters +ConfigRuleComplianceSummaryFilters,config_rule_compliance_summary_filters +ConfigRuleEvaluationStatus,config_rule_evaluation_status +ConfigRuleId,config_rule_id +ConfigRuleInvokedTime,config_rule_invoked_time +ConfigRuleName,config_rule_name +ConfigRuleNames,config_rule_names +ConfigRuleState,config_rule_state +ConfigRules,config_rules +ConfigRulesEvaluationStatus,config_rules_evaluation_status +ConfigSnapshotDeliveryProperties,config_snapshot_delivery_properties +ConfigStreamDeliveryInfo,config_stream_delivery_info +ConfigType,config_type +ConfigUri,config_uri +Configuration,configuration +ConfigurationAggregator,configuration_aggregator +ConfigurationAggregatorArn,configuration_aggregator_arn +ConfigurationAggregatorName,configuration_aggregator_name +ConfigurationAggregatorNames,configuration_aggregator_names +ConfigurationAggregators,configuration_aggregators +ConfigurationAlias,configuration_alias +ConfigurationAliases,configuration_aliases +ConfigurationArn,configuration_arn +ConfigurationEndpoint,configuration_endpoint +ConfigurationErrorDetails,configuration_error_details +ConfigurationEvent,configuration_event +ConfigurationException,configuration_exception +ConfigurationId,configuration_id +ConfigurationInfo,configuration_info +ConfigurationItem,configuration_item +ConfigurationLocationUri,configuration_location_uri +ConfigurationManager,configuration_manager +ConfigurationManagers,configuration_managers +ConfigurationName,configuration_name +ConfigurationOptionDescription,configuration_option_description +ConfigurationOptionSetting,configuration_option_setting +ConfigurationOptionsDescription,configuration_options_description +ConfigurationOverrides,configuration_overrides +ConfigurationProfile,configuration_profile +ConfigurationProfileId,configuration_profile_id +ConfigurationProfileIdentifier,configuration_profile_identifier +ConfigurationProfileSummary,configuration_profile_summary +ConfigurationProfiles,configuration_profiles +ConfigurationRecorder,configuration_recorder +ConfigurationRecorderName,configuration_recorder_name +ConfigurationRecorderNames,configuration_recorder_names +ConfigurationRecorderStatus,configuration_recorder_status +ConfigurationRecorders,configuration_recorders +ConfigurationRecordersStatus,configuration_recorders_status +ConfigurationRevision,configuration_revision +ConfigurationSchema,configuration_schema +ConfigurationSet,configuration_set +ConfigurationSetAlreadyExistsException,configuration_set_already_exists_exception +ConfigurationSetArn,configuration_set_arn +ConfigurationSetAttributeNames,configuration_set_attribute_names +ConfigurationSetDoesNotExistException,configuration_set_does_not_exist_exception +ConfigurationSetFilter,configuration_set_filter +ConfigurationSetInformation,configuration_set_information +ConfigurationSetName,configuration_set_name +ConfigurationSetNames,configuration_set_names +ConfigurationSetSendingPausedException,configuration_set_sending_paused_exception +ConfigurationSets,configuration_sets +ConfigurationSettings,configuration_settings +ConfigurationSettingsDescription,configuration_settings_description +ConfigurationSettingsDescriptions,configuration_settings_descriptions +ConfigurationSettingsValidationMessages,configuration_settings_validation_messages +ConfigurationSource,configuration_source +ConfigurationStatus,configuration_status +ConfigurationSummary,configuration_summary +ConfigurationSyncStateSummary,configuration_sync_state_summary +ConfigurationSyncStatus,configuration_sync_status +ConfigurationTag,configuration_tag +ConfigurationTemplateQuota,configuration_template_quota +ConfigurationTemplates,configuration_templates +ConfigurationToken,configuration_token +ConfigurationType,configuration_type +ConfigurationTypeUpdate,configuration_type_update +ConfigurationUpdate,configuration_update +ConfigurationUpdates,configuration_updates +ConfigurationVersion,configuration_version +Configurations,configurations +ConfigurationsVersion,configurations_version +Configure,configure +ConfigureAccessPointRequest,configure_access_point_request +ConfigureAccessPointResponse,configure_access_point_response +ConfigureAgentRequest,configure_agent_request +ConfigureAgentResponse,configure_agent_response +ConfigureHealthCheckInput,configure_health_check_input +ConfigureHealthCheckOutput,configure_health_check_output +ConfigureLogsForChannelRequest,configure_logs_for_channel_request +ConfigureLogsForChannelResponse,configure_logs_for_channel_response +ConfigureLogsForPlaybackConfigurationRequest,configure_logs_for_playback_configuration_request +ConfigureLogsForPlaybackConfigurationResponse,configure_logs_for_playback_configuration_response +ConfigureLogsRequest,configure_logs_request +ConfigureLogsResponse,configure_logs_response +ConfigureShard,configure_shard +Configured,configured +ConfiguredDataNodeCount,configured_data_node_count +ConfiguredInput,configured_input +ConfiguredTable,configured_table +ConfiguredTableAnalysisRule,configured_table_analysis_rule +ConfiguredTableAssociation,configured_table_association +ConfiguredTableAssociationSummary,configured_table_association_summary +ConfiguredTableSummary,configured_table_summary +ConfirmConnectionRequest,confirm_connection_request +ConfirmConnectionResponse,confirm_connection_response +ConfirmCustomerAgreementRequest,confirm_customer_agreement_request +ConfirmCustomerAgreementResponse,confirm_customer_agreement_response +ConfirmDeviceRequest,confirm_device_request +ConfirmDeviceResponse,confirm_device_response +ConfirmForgotPasswordRequest,confirm_forgot_password_request +ConfirmPrivateVirtualInterfaceRequest,confirm_private_virtual_interface_request +ConfirmPrivateVirtualInterfaceResponse,confirm_private_virtual_interface_response +ConfirmProductInstanceRequest,confirm_product_instance_request +ConfirmProductInstanceResult,confirm_product_instance_result +ConfirmPublicVirtualInterfaceRequest,confirm_public_virtual_interface_request +ConfirmPublicVirtualInterfaceResponse,confirm_public_virtual_interface_response +ConfirmRemoveSelfBucketAccess,confirm_remove_self_bucket_access +ConfirmSignUpRequest,confirm_sign_up_request +ConfirmSubscriptionInput,confirm_subscription_input +ConfirmSubscriptionResponse,confirm_subscription_response +ConfirmTopicRuleDestinationRequest,confirm_topic_rule_destination_request +ConfirmTransitVirtualInterfaceRequest,confirm_transit_virtual_interface_request +ConfirmTransitVirtualInterfaceResponse,confirm_transit_virtual_interface_response +ConfirmationCode,confirmation_code +ConfirmationRequired,confirmation_required +Conflict,conflict +ConflictErrorException,conflict_error_exception +ConflictException,conflict_exception +ConflictExceptionErrorArgument,conflict_exception_error_argument +ConflictExceptionType,conflict_exception_type +ConflictMetadata,conflict_metadata +ConflictResolution,conflict_resolution +ConflictResolvingModel,conflict_resolving_model +ConflictResource,conflict_resource +ConflictType,conflict_type +ConflictingAlias,conflicting_alias +ConflictingAliasesList,conflicting_aliases_list +ConflictingDomainExists,conflicting_domain_exists +ConflictingItem,conflicting_item +ConflictingItems,conflicting_items +ConflictingOperationException,conflicting_operation_exception +ConflictingPolicyId,conflicting_policy_id +ConflictingPriority,conflicting_priority +ConflictingResourceUpdateException,conflicting_resource_update_exception +ConflictingTypes,conflicting_types +ConfluenceAttachmentConfiguration,confluence_attachment_configuration +ConfluenceAttachmentToIndexFieldMapping,confluence_attachment_to_index_field_mapping +ConfluenceBlogConfiguration,confluence_blog_configuration +ConfluenceBlogToIndexFieldMapping,confluence_blog_to_index_field_mapping +ConfluenceConfiguration,confluence_configuration +ConfluencePageConfiguration,confluence_page_configuration +ConfluencePageToIndexFieldMapping,confluence_page_to_index_field_mapping +ConfluenceSpaceConfiguration,confluence_space_configuration +ConfluenceSpaceToIndexFieldMapping,confluence_space_to_index_field_mapping +ConformancePackArn,conformance_pack_arn +ConformancePackComplianceFilters,conformance_pack_compliance_filters +ConformancePackComplianceScore,conformance_pack_compliance_score +ConformancePackComplianceScores,conformance_pack_compliance_scores +ConformancePackComplianceScoresFilters,conformance_pack_compliance_scores_filters +ConformancePackComplianceStatus,conformance_pack_compliance_status +ConformancePackComplianceSummary,conformance_pack_compliance_summary +ConformancePackComplianceSummaryList,conformance_pack_compliance_summary_list +ConformancePackDetail,conformance_pack_detail +ConformancePackDetails,conformance_pack_details +ConformancePackEvaluationFilters,conformance_pack_evaluation_filters +ConformancePackEvaluationResult,conformance_pack_evaluation_result +ConformancePackId,conformance_pack_id +ConformancePackInputParameter,conformance_pack_input_parameter +ConformancePackInputParameters,conformance_pack_input_parameters +ConformancePackName,conformance_pack_name +ConformancePackNames,conformance_pack_names +ConformancePackRuleCompliance,conformance_pack_rule_compliance +ConformancePackRuleComplianceList,conformance_pack_rule_compliance_list +ConformancePackRuleEvaluationResults,conformance_pack_rule_evaluation_results +ConformancePackState,conformance_pack_state +ConformancePackStatusDetail,conformance_pack_status_detail +ConformancePackStatusDetails,conformance_pack_status_details +ConformancePackStatusReason,conformance_pack_status_reason +ConformancePackTemplateValidationException,conformance_pack_template_validation_exception +ConfusionMatrix,confusion_matrix +ConnectAppAuthorizationRequest,connect_app_authorization_request +ConnectAppAuthorizationResponse,connect_app_authorization_response +ConnectAttachment,connect_attachment +ConnectAttachmentId,connect_attachment_id +ConnectAttachmentOptions,connect_attachment_options +ConnectCampaignArn,connect_campaign_arn +ConnectCampaignExecutionRoleArn,connect_campaign_execution_role_arn +ConnectClientAddIn,connect_client_add_in +ConnectCustomKeyStoreRequest,connect_custom_key_store_request +ConnectDirectoryRequest,connect_directory_request +ConnectDirectoryResult,connect_directory_result +ConnectIps,connect_ips +ConnectParticipant,connect_participant +ConnectPeer,connect_peer +ConnectPeerAssociation,connect_peer_association +ConnectPeerAssociations,connect_peer_associations +ConnectPeerBgpConfiguration,connect_peer_bgp_configuration +ConnectPeerConfiguration,connect_peer_configuration +ConnectPeerId,connect_peer_id +ConnectPeerIds,connect_peer_ids +ConnectPeerState,connect_peer_state +ConnectPeerSummary,connect_peer_summary +ConnectPeers,connect_peers +ConnectSettings,connect_settings +ConnectedAt,connected_at +ConnectedDatabase,connected_database +ConnectedDeviceCount,connected_device_count +ConnectedDeviceId,connected_device_id +ConnectedDirectoriesCurrentCount,connected_directories_current_count +ConnectedDirectoriesLimit,connected_directories_limit +ConnectedDirectoriesLimitReached,connected_directories_limit_reached +ConnectedHome,connected_home +ConnectedHomeForUpdate,connected_home_for_update +ConnectedHomeSettings,connected_home_settings +ConnectedHomeSettingsForUpdate,connected_home_settings_for_update +ConnectedLinkId,connected_link_id +ConnectedToAgentTimestamp,connected_to_agent_timestamp +Connection,connection +ConnectionAlias,connection_alias +ConnectionAliasAssociation,connection_alias_association +ConnectionAliasPermission,connection_alias_permission +ConnectionAliasPermissions,connection_alias_permissions +ConnectionAliases,connection_aliases +ConnectionApiKeyAuthResponseParameters,connection_api_key_auth_response_parameters +ConnectionArn,connection_arn +ConnectionAttempts,connection_attempts +ConnectionAuthResponseParameters,connection_auth_response_parameters +ConnectionBasicAuthResponseParameters,connection_basic_auth_response_parameters +ConnectionBodyParameter,connection_body_parameter +ConnectionBorrowTimeout,connection_borrow_timeout +ConnectionConfiguration,connection_configuration +ConnectionCredentials,connection_credentials +ConnectionDetails,connection_details +ConnectionDirection,connection_direction +ConnectionDraining,connection_draining +ConnectionEndTime,connection_end_time +ConnectionErrorCode,connection_error_code +ConnectionEstablishedTime,connection_established_time +ConnectionEvents,connection_events +ConnectionExpiry,connection_expiry +ConnectionHeaderParameter,connection_header_parameter +ConnectionHealth,connection_health +ConnectionHttpParameters,connection_http_parameters +ConnectionId,connection_id +ConnectionIdentifier,connection_identifier +ConnectionIds,connection_ids +ConnectionInfo,connection_info +ConnectionInput,connection_input +ConnectionLimitExceededException,connection_limit_exceeded_exception +ConnectionList,connection_list +ConnectionLogOptions,connection_log_options +ConnectionLogResponseOptions,connection_log_response_options +ConnectionLost,connection_lost +ConnectionMode,connection_mode +ConnectionName,connection_name +ConnectionNameList,connection_name_list +ConnectionNotification,connection_notification +ConnectionNotificationArn,connection_notification_arn +ConnectionNotificationId,connection_notification_id +ConnectionNotificationIds,connection_notification_ids +ConnectionNotificationSet,connection_notification_set +ConnectionNotificationState,connection_notification_state +ConnectionNotificationType,connection_notification_type +ConnectionOAuthClientResponseParameters,connection_o_auth_client_response_parameters +ConnectionOAuthResponseParameters,connection_o_auth_response_parameters +ConnectionParameters,connection_parameters +ConnectionPasswordEncryption,connection_password_encryption +ConnectionPoolConfig,connection_pool_config +ConnectionPoolConfiguration,connection_pool_configuration +ConnectionPoolConfigurationInfo,connection_pool_configuration_info +ConnectionProperties,connection_properties +ConnectionQueryStringParameter,connection_query_string_parameter +ConnectionRefusedCount,connection_refused_count +ConnectionRetryInterval,connection_retry_interval +ConnectionSettings,connection_settings +ConnectionState,connection_state +ConnectionStateCheckTimestamp,connection_state_check_timestamp +ConnectionStatus,connection_status +ConnectionStatusEventConfiguration,connection_status_event_configuration +ConnectionStatusResourceTypeEventConfiguration,connection_status_resource_type_event_configuration +ConnectionStatusUpdatedTime,connection_status_updated_time +ConnectionStatuses,connection_statuses +ConnectionString,connection_string +ConnectionSummary,connection_summary +ConnectionSummaryList,connection_summary_list +ConnectionTable,connection_table +ConnectionTimeout,connection_timeout +ConnectionToken,connection_token +ConnectionType,connection_type +Connections,connections +ConnectionsList,connections_list +Connectivity,connectivity +ConnectivityInfo,connectivity_info +ConnectivityStatus,connectivity_status +ConnectivityType,connectivity_type +Connector,connector +ConnectorArn,connector_arn +ConnectorAuthenticationException,connector_authentication_exception +ConnectorConfigRequest,connector_config_request +ConnectorConfigResponse,connector_config_response +ConnectorConfiguration,connector_configuration +ConnectorDefinitionId,connector_definition_id +ConnectorDefinitionVersion,connector_definition_version +ConnectorDefinitionVersionArn,connector_definition_version_arn +ConnectorDefinitionVersionId,connector_definition_version_id +ConnectorDetail,connector_detail +ConnectorEntity,connector_entity +ConnectorEntityField,connector_entity_field +ConnectorFailureException,connector_failure_exception +ConnectorId,connector_id +ConnectorMetadata,connector_metadata +ConnectorName,connector_name +ConnectorOAuthRequest,connector_o_auth_request +ConnectorOperator,connector_operator +ConnectorProfile,connector_profile +ConnectorProfileConfig,connector_profile_config +ConnectorProfileCredentials,connector_profile_credentials +ConnectorProfileName,connector_profile_name +ConnectorProfileProperties,connector_profile_properties +ConnectorProvisioningConfig,connector_provisioning_config +ConnectorRuntimeSetting,connector_runtime_setting +ConnectorServerException,connector_server_exception +ConnectorSummary,connector_summary +ConnectorTimeoutException,connector_timeout_exception +ConnectorType,connector_type +Connectors,connectors +Consent,consent +ConsistencyLevel,consistency_level +ConsistentRead,consistent_read +ConsoleAccess,console_access +ConsoleURL,console_url +ConsolidatedReportMetric,consolidated_report_metric +Consolidation,consolidation +ConsolidationKey,consolidation_key +Constant,constant +ConstantBitrate,constant_bitrate +ConstantInitializationVector,constant_initialization_vector +ConstantIv,constant_iv +ConstantType,constant_type +Constraint,constraint +ConstraintDescription,constraint_description +ConstraintDetail,constraint_detail +ConstraintDetails,constraint_details +ConstraintId,constraint_id +ConstraintParameters,constraint_parameters +ConstraintSummaries,constraint_summaries +ConstraintSummary,constraint_summary +ConstraintViolationException,constraint_violation_exception +Constraints,constraints +ConstraintsResource,constraints_resource +ConsumedCapacity,consumed_capacity +ConsumedIOs,consumed_ios +ConsumedLabels,consumed_labels +ConsumedLicenseSummary,consumed_license_summary +ConsumedLicenseSummaryList,consumed_license_summary_list +ConsumedLicenses,consumed_licenses +ConsumedResources,consumed_resources +ConsumedSpiceCapacityInBytes,consumed_spice_capacity_in_bytes +ConsumedStatefulRuleCapacity,consumed_stateful_rule_capacity +ConsumedStatelessRuleCapacity,consumed_stateless_rule_capacity +ConsumedValue,consumed_value +Consumer,consumer +ConsumerARN,consumer_arn +ConsumerArn,consumer_arn +ConsumerArns,consumer_arns +ConsumerCount,consumer_count +ConsumerCreationTimestamp,consumer_creation_timestamp +ConsumerDescription,consumer_description +ConsumerGroupID,consumer_group_id +ConsumerGroupId,consumer_group_id +ConsumerIdentifier,consumer_identifier +ConsumerName,consumer_name +ConsumerRegion,consumer_region +ConsumerStatus,consumer_status +Consumers,consumers +Consumption,consumption +ConsumptionConfiguration,consumption_configuration +Contact,contact +ContactAgentId,contact_agent_id +ContactArn,contact_arn +ContactCenter,contact_center +ContactCenterActivity,contact_center_activity +ContactChannel,contact_channel +ContactChannelAddress,contact_channel_address +ContactChannelArn,contact_channel_arn +ContactChannelId,contact_channel_id +ContactChannels,contact_channels +ContactContent,contact_content +ContactData,contact_data +ContactDetail,contact_detail +ContactEmail,contact_email +ContactFilter,contact_filter +ContactFlow,contact_flow +ContactFlowArn,contact_flow_arn +ContactFlowId,contact_flow_id +ContactFlowModule,contact_flow_module +ContactFlowModuleId,contact_flow_module_id +ContactFlowModuleState,contact_flow_module_state +ContactFlowModuleSummary,contact_flow_module_summary +ContactFlowModulesSummaryList,contact_flow_modules_summary_list +ContactFlowNotPublishedException,contact_flow_not_published_exception +ContactFlowState,contact_flow_state +ContactFlowSummary,contact_flow_summary +ContactFlowSummaryList,contact_flow_summary_list +ContactFlowType,contact_flow_type +ContactFlowTypes,contact_flow_types +ContactId,contact_id +ContactIdResponse,contact_id_response +ContactIds,contact_ids +ContactInformation,contact_information +ContactLanguage,contact_language +ContactList,contact_list +ContactListDestination,contact_list_destination +ContactListImportAction,contact_list_import_action +ContactListName,contact_list_name +ContactLists,contact_lists +ContactMethod,contact_method +ContactName,contact_name +ContactNotFoundException,contact_not_found_exception +ContactNotes,contact_notes +ContactNumber,contact_number +ContactPhoneNumber,contact_phone_number +ContactStates,contact_states +ContactTargetInfo,contact_target_info +ContactType,contact_type +Contacts,contacts +Container,container +ContainerArguments,container_arguments +ContainerConfig,container_config +ContainerConfiguration,container_configuration +ContainerDatasetAction,container_dataset_action +ContainerDefinition,container_definition +ContainerDefinitions,container_definitions +ContainerDependency,container_dependency +ContainerDetail,container_detail +ContainerDetails,container_details +ContainerDistributionConfiguration,container_distribution_configuration +ContainerEntrypoint,container_entrypoint +ContainerFormat,container_format +ContainerHostname,container_hostname +ContainerImage,container_image +ContainerInUseException,container_in_use_exception +ContainerInstance,container_instance +ContainerInstanceHealthStatus,container_instance_health_status +ContainerLevelMetrics,container_level_metrics +ContainerLogRotationConfiguration,container_log_rotation_configuration +ContainerName,container_name +ContainerNotFoundException,container_not_found_exception +ContainerOverride,container_override +ContainerOverrides,container_overrides +ContainerPath,container_path +ContainerPort,container_port +ContainerProperties,container_properties +ContainerProvider,container_provider +ContainerRecipe,container_recipe +ContainerRecipeSummary,container_recipe_summary +ContainerRecommendation,container_recommendation +ContainerRuntime,container_runtime +ContainerService,container_service +ContainerServiceDeployment,container_service_deployment +ContainerServiceDeploymentRequest,container_service_deployment_request +ContainerServiceECRImagePullerRole,container_service_ecr_image_puller_role +ContainerServiceECRImagePullerRoleRequest,container_service_ecr_image_puller_role_request +ContainerServiceEndpoint,container_service_endpoint +ContainerServiceHealthCheckConfig,container_service_health_check_config +ContainerServiceLogEvent,container_service_log_event +ContainerServicePower,container_service_power +ContainerServiceRegistryLogin,container_service_registry_login +ContainerServiceStateDetail,container_service_state_detail +ContainerServicesListResult,container_services_list_result +ContainerSettings,container_settings +ContainerStartupHealthCheckTimeoutInSeconds,container_startup_health_check_timeout_in_seconds +ContainerStateChange,container_state_change +ContainerSummary,container_summary +ContainerType,container_type +ContainerUrl,container_url +Containers,containers +ContainsAll,contains_all +ContainsAny,contains_any +ContainsHeader,contains_header +ContainsLabels,contains_labels +ContainsOldGroupVersions,contains_old_group_versions +ContainsPiiEntitiesRequest,contains_pii_entities_request +ContainsPiiEntitiesResponse,contains_pii_entities_response +Content,content +ContentArtifactsConfiguration,content_artifacts_configuration +ContentCategories,content_categories +ContentClassifiers,content_classifiers +ContentColumn,content_column +ContentConcatenationConfiguration,content_concatenation_configuration +ContentConfig,content_config +ContentCreatedTimestamp,content_created_timestamp +ContentData,content_data +ContentDigest,content_digest +ContentDisposition,content_disposition +ContentEncoding,content_encoding +ContentHandlingStrategy,content_handling_strategy +ContentHash,content_hash +ContentIdentificationType,content_identification_type +ContentLanguage,content_language +ContentLength,content_length +ContentMD5,content_md5 +ContentModerationDetection,content_moderation_detection +ContentModifiedTimestamp,content_modified_timestamp +ContentRange,content_range +ContentRedaction,content_redaction +ContentRedactionOutput,content_redaction_output +ContentRedactionType,content_redaction_type +ContentReference,content_reference +ContentSHA256,content_sha256 +ContentSecurityPolicy,content_security_policy +ContentSegmentUrlPrefix,content_segment_url_prefix +ContentSha256,content_sha256 +ContentShareLayout,content_share_layout +ContentSourceConfiguration,content_source_configuration +ContentSummary,content_summary +ContentTemplate,content_template +ContentTransformation,content_transformation +ContentType,content_type +ContentTypeOptions,content_type_options +ContentTypeProfile,content_type_profile +ContentTypeProfileConfig,content_type_profile_config +ContentTypeProfiles,content_type_profiles +ContentUrl,content_url +Contents,contents +Context,context +ContextArn,context_arn +ContextAssertion,context_assertion +ContextData,context_data +ContextDataType,context_data_type +ContextEntries,context_entries +ContextEntry,context_entry +ContextId,context_id +ContextKeyName,context_key_name +ContextKeyNames,context_key_names +ContextKeyType,context_key_type +ContextKeyValues,context_key_values +ContextName,context_name +ContextScope,context_scope +ContextScopeType,context_scope_type +ContextSource,context_source +ContextSummaries,context_summaries +ContextSummary,context_summary +ContextType,context_type +ContextWords,context_words +ContinentCode,continent_code +ContinentName,continent_name +ContinuationSequenceNumber,continuation_sequence_number +ContinuationToken,continuation_token +ContinueAsNewWorkflowExecutionDecisionAttributes,continue_as_new_workflow_execution_decision_attributes +ContinueAsNewWorkflowExecutionFailedEventAttributes,continue_as_new_workflow_execution_failed_event_attributes +ContinueDeploymentInput,continue_deployment_input +ContinueUpdateRollbackInput,continue_update_rollback_input +ContinuedFromContactId,continued_from_contact_id +ContinuousBackupsDescription,continuous_backups_description +ContinuousBackupsStatus,continuous_backups_status +ContinuousBackupsUnavailableException,continuous_backups_unavailable_exception +ContinuousDeploymentPolicy,continuous_deployment_policy +ContinuousDeploymentPolicyAlreadyExists,continuous_deployment_policy_already_exists +ContinuousDeploymentPolicyConfig,continuous_deployment_policy_config +ContinuousDeploymentPolicyId,continuous_deployment_policy_id +ContinuousDeploymentPolicyInUse,continuous_deployment_policy_in_use +ContinuousDeploymentPolicyList,continuous_deployment_policy_list +ContinuousDeploymentPolicySummary,continuous_deployment_policy_summary +ContinuousDeploymentSingleHeaderConfig,continuous_deployment_single_header_config +ContinuousDeploymentSingleWeightConfig,continuous_deployment_single_weight_config +ContinuousExportDescription,continuous_export_description +ContinuousHyperParameterRange,continuous_hyper_parameter_range +ContinuousParameterRange,continuous_parameter_range +ContinuousParameterRangeSpecification,continuous_parameter_range_specification +ContinuousParameterRanges,continuous_parameter_ranges +Contrast,contrast +ContributingSubnets,contributing_subnets +ContributionAnalysisDefault,contribution_analysis_default +ContributionAnalysisDefaults,contribution_analysis_defaults +ContributionMatrix,contribution_matrix +ContributionPercentage,contribution_percentage +ContributionScore,contribution_score +Contributor,contributor +ContributorDimensions,contributor_dimensions +ContributorId,contributor_id +ContributorInsightsAction,contributor_insights_action +ContributorInsightsRuleList,contributor_insights_rule_list +ContributorInsightsStatus,contributor_insights_status +ContributorInsightsSummaries,contributor_insights_summaries +ContributorInsightsSummary,contributor_insights_summary +Contributors,contributors +Control,control +ControlComment,control_comment +ControlDomainInsights,control_domain_insights +ControlFindingGenerator,control_finding_generator +ControlId,control_id +ControlInputParameter,control_input_parameter +ControlInputParameters,control_input_parameters +ControlInsightsMetadataByAssessmentItem,control_insights_metadata_by_assessment_item +ControlInsightsMetadataItem,control_insights_metadata_item +ControlMappingSource,control_mapping_source +ControlMetadata,control_metadata +ControlName,control_name +ControlOperation,control_operation +ControlPanel,control_panel +ControlPanelArn,control_panel_arn +ControlPanelName,control_panel_name +ControlPanels,control_panels +ControlPlanePlacementRequest,control_plane_placement_request +ControlPlanePlacementResponse,control_plane_placement_response +ControlPlaneTagFilter,control_plane_tag_filter +ControlScope,control_scope +ControlSet,control_set +ControlStatus,control_status +ControlStatusUpdatedAt,control_status_updated_at +ControlTablesFileGroup,control_tables_file_group +Controls,controls +ConvergenceDetected,convergence_detected +ConvergenceDetectedTime,convergence_detected_time +ConversationId,conversation_id +ConversationLevelIntentClassificationResultItem,conversation_level_intent_classification_result_item +ConversationLevelResultDetail,conversation_level_result_detail +ConversationLevelSlotResolutionResultItem,conversation_level_slot_resolution_result_item +ConversationLevelTestResultItem,conversation_level_test_result_item +ConversationLevelTestResults,conversation_level_test_results +ConversationLevelTestResultsFilterBy,conversation_level_test_results_filter_by +ConversationLogSettings,conversation_log_settings +ConversationLogsDataSource,conversation_logs_data_source +ConversationLogsDataSourceFilterBy,conversation_logs_data_source_filter_by +ConversationLogsRequest,conversation_logs_request +ConversationLogsResponse,conversation_logs_response +ConversationRetentionSettings,conversation_retention_settings +ConversionConfiguration,conversion_configuration +ConversionProperties,conversion_properties +ConversionTask,conversion_task +ConversionTaskId,conversion_task_id +ConversionTaskIds,conversion_task_ids +ConversionTasks,conversion_tasks +Convert608To708,convert608_to708 +ConvertDotsInJsonKeysToUnderscores,convert_dots_in_json_keys_to_underscores +ConvertPaintToPop,convert_paint_to_pop +ConvertRecoveryPointToSnapshotRequest,convert_recovery_point_to_snapshot_request +ConvertRecoveryPointToSnapshotResponse,convert_recovery_point_to_snapshot_response +ConvertTimestampWithZoneToUTC,convert_timestamp_with_zone_to_utc +Cookie,cookie +CookieBehavior,cookie_behavior +CookieExpirationPeriod,cookie_expiration_period +CookieMatchPattern,cookie_match_pattern +CookieName,cookie_name +CookieNames,cookie_names +CookieObject,cookie_object +CookiePreference,cookie_preference +CookieSpecification,cookie_specification +CookieSynchronizationConfiguration,cookie_synchronization_configuration +Cookies,cookies +CookiesConfig,cookies_config +CoolDown,cool_down +Cooldown,cooldown +CoolingPeriod,cooling_period +Coordinates,coordinates +CoordinatorDpuSize,coordinator_dpu_size +CopyAction,copy_action +CopyActions,copy_actions +CopyBackupRequest,copy_backup_request +CopyBackupResponse,copy_backup_response +CopyBackupToRegionRequest,copy_backup_to_region_request +CopyBackupToRegionResponse,copy_backup_to_region_response +CopyClusterSnapshotMessage,copy_cluster_snapshot_message +CopyClusterSnapshotResult,copy_cluster_snapshot_result +CopyCommand,copy_command +CopyDBClusterParameterGroupMessage,copy_db_cluster_parameter_group_message +CopyDBClusterParameterGroupResult,copy_db_cluster_parameter_group_result +CopyDBClusterSnapshotMessage,copy_db_cluster_snapshot_message +CopyDBClusterSnapshotResult,copy_db_cluster_snapshot_result +CopyDBParameterGroupMessage,copy_db_parameter_group_message +CopyDBParameterGroupResult,copy_db_parameter_group_result +CopyDBSnapshotMessage,copy_db_snapshot_message +CopyDBSnapshotResult,copy_db_snapshot_result +CopyDestinationImageSet,copy_destination_image_set +CopyDestinationImageSetProperties,copy_destination_image_set_properties +CopyDistributionRequest,copy_distribution_request +CopyDistributionResult,copy_distribution_result +CopyFpgaImageRequest,copy_fpga_image_request +CopyFpgaImageResult,copy_fpga_image_result +CopyImageRequest,copy_image_request +CopyImageResponse,copy_image_response +CopyImageResult,copy_image_result +CopyImageSetInformation,copy_image_set_information +CopyImageSetRequest,copy_image_set_request +CopyImageSetResponse,copy_image_set_response +CopyImageTags,copy_image_tags +CopyJob,copy_job +CopyJobId,copy_job_id +CopyJobs,copy_jobs +CopyObjectOutput,copy_object_output +CopyObjectRequest,copy_object_request +CopyObjectResult,copy_object_result +CopyOptionGroup,copy_option_group +CopyOptionGroupMessage,copy_option_group_message +CopyOptionGroupResult,copy_option_group_result +CopyOptions,copy_options +CopyPackageVersionsRequest,copy_package_versions_request +CopyPackageVersionsResult,copy_package_versions_result +CopyPartResult,copy_part_result +CopyProductInput,copy_product_input +CopyProductOutput,copy_product_output +CopyProductStatus,copy_product_status +CopyProductToken,copy_product_token +CopyProjectVersionRequest,copy_project_version_request +CopyProjectVersionResponse,copy_project_version_response +CopyProtectionAction,copy_protection_action +CopySnapshotMessage,copy_snapshot_message +CopySnapshotRequest,copy_snapshot_request +CopySnapshotResponse,copy_snapshot_response +CopySnapshotResult,copy_snapshot_result +CopySource,copy_source +CopySourceArn,copy_source_arn +CopySourceIfMatch,copy_source_if_match +CopySourceIfModifiedSince,copy_source_if_modified_since +CopySourceIfNoneMatch,copy_source_if_none_match +CopySourceIfUnmodifiedSince,copy_source_if_unmodified_since +CopySourceImageSetInformation,copy_source_image_set_information +CopySourceImageSetProperties,copy_source_image_set_properties +CopySourceRange,copy_source_range +CopySourceSSECustomerAlgorithm,copy_source_sse_customer_algorithm +CopySourceSSECustomerKey,copy_source_sse_customer_key +CopySourceSSECustomerKeyMD5,copy_source_sse_customer_key_md5 +CopySourceTagsToRestoredResource,copy_source_tags_to_restored_resource +CopySourceVersionId,copy_source_version_id +CopyStepDetails,copy_step_details +CopyStrategy,copy_strategy +CopyTags,copy_tags +CopyTagsFromSource,copy_tags_from_source +CopyTagsToBackups,copy_tags_to_backups +CopyTagsToDataRepositoryAssociations,copy_tags_to_data_repository_associations +CopyTagsToSnapshot,copy_tags_to_snapshot +CopyTagsToSnapshots,copy_tags_to_snapshots +CopyTagsToVolumes,copy_tags_to_volumes +CopyTimestamp,copy_timestamp +CopyToRegionDisabledFault,copy_to_region_disabled_fault +CopyWorkspaceImageRequest,copy_workspace_image_request +CopyWorkspaceImageResult,copy_workspace_image_result +CopyableCrossAccount,copyable_cross_account +CopyrightHolder,copyright_holder +Core,core +CoreCount,core_count +CoreDefinitionId,core_definition_id +CoreDefinitionVersion,core_definition_version +CoreDefinitionVersionArn,core_definition_version_arn +CoreDefinitionVersionId,core_definition_version_id +CoreDevice,core_device +CoreDumpConfig,core_dump_config +CoreNetwork,core_network +CoreNetworkAddress,core_network_address +CoreNetworkArn,core_network_arn +CoreNetworkAsn,core_network_asn +CoreNetworkAttachmentArn,core_network_attachment_arn +CoreNetworkAttachmentId,core_network_attachment_id +CoreNetworkChange,core_network_change +CoreNetworkChangeEvent,core_network_change_event +CoreNetworkChangeEventValues,core_network_change_event_values +CoreNetworkChangeEvents,core_network_change_events +CoreNetworkChangeValues,core_network_change_values +CoreNetworkChanges,core_network_changes +CoreNetworkEdge,core_network_edge +CoreNetworkId,core_network_id +CoreNetworkPolicy,core_network_policy +CoreNetworkPolicyError,core_network_policy_error +CoreNetworkPolicyException,core_network_policy_exception +CoreNetworkPolicyVersion,core_network_policy_version +CoreNetworkPolicyVersions,core_network_policy_versions +CoreNetworkSegment,core_network_segment +CoreNetworkSegmentEdge,core_network_segment_edge +CoreNetworkSegmentEdgeIdentifier,core_network_segment_edge_identifier +CoreNetworkSummary,core_network_summary +CoreNetworks,core_networks +Cores,cores +CornerRadius,corner_radius +CorrectedTerm,corrected_term +Correction,correction +CorrectionGateLevel,correction_gate_level +Corrections,corrections +Cors,cors +CorsConfig,cors_config +CorsConfiguration,cors_configuration +CorsPolicy,cors_policy +CorsPolicyNotFoundException,cors_policy_not_found_exception +CorsRule,cors_rule +Cost,cost +CostAllocationTag,cost_allocation_tag +CostAllocationTagStatusEntry,cost_allocation_tag_status_entry +CostAllocationTags,cost_allocation_tags +CostAllocationTagsStatus,cost_allocation_tags_status +CostCategories,cost_categories +CostCategory,cost_category +CostCategoryArn,cost_category_arn +CostCategoryInheritedValueDimension,cost_category_inherited_value_dimension +CostCategoryName,cost_category_name +CostCategoryNames,cost_category_names +CostCategoryProcessingStatus,cost_category_processing_status +CostCategoryReference,cost_category_reference +CostCategoryReferences,cost_category_references +CostCategoryRule,cost_category_rule +CostCategorySplitChargeRule,cost_category_split_charge_rule +CostCategorySplitChargeRuleParameter,cost_category_split_charge_rule_parameter +CostCategoryValues,cost_category_values +CostEstimate,cost_estimate +CostEstimationResourceCollectionFilter,cost_estimation_resource_collection_filter +CostEstimationTimeRange,cost_estimation_time_range +CostFilters,cost_filters +CostPerHour,cost_per_hour +CostPerInference,cost_per_inference +CostTypes,cost_types +Costs,costs +Count,count +CountAction,count_action +CountByCoverageStatus,count_by_coverage_status +CountByResourceType,count_by_resource_type +CountBySeverity,count_by_severity +CountClosedWorkflowExecutionsInput,count_closed_workflow_executions_input +CountDistinct,count_distinct +CountDistinctLong,count_distinct_long +CountLong,count_long +CountNan,count_nan +CountNanLong,count_nan_long +CountNull,count_null +CountNullLong,count_null_long +CountOpenWorkflowExecutionsInput,count_open_workflow_executions_input +CountPendingActivityTasksInput,count_pending_activity_tasks_input +CountPendingDecisionTasksInput,count_pending_decision_tasks_input +CountPercent,count_percent +CountUpdate,count_update +Counters,counters +Country,country +CountryCode,country_code +CountryCodeIso2,country_code_iso2 +CountryCodeNumeric,country_code_numeric +CountryCodes,country_codes +CountryName,country_name +Counts,counts +CountsSummary,counts_summary +County,county +Coverage,coverage +CoverageByTime,coverage_by_time +CoverageCost,coverage_cost +CoverageDateFilter,coverage_date_filter +CoverageEksClusterDetails,coverage_eks_cluster_details +CoverageFilterCondition,coverage_filter_condition +CoverageFilterCriteria,coverage_filter_criteria +CoverageFilterCriterion,coverage_filter_criterion +CoverageHours,coverage_hours +CoverageHoursPercentage,coverage_hours_percentage +CoverageMapFilter,coverage_map_filter +CoverageNormalizedUnits,coverage_normalized_units +CoverageNormalizedUnitsPercentage,coverage_normalized_units_percentage +CoveragePercentage,coverage_percentage +CoverageResource,coverage_resource +CoverageResourceDetails,coverage_resource_details +CoverageSortCriteria,coverage_sort_criteria +CoverageStatistics,coverage_statistics +CoverageStatus,coverage_status +CoverageStringFilter,coverage_string_filter +CoverageTime,coverage_time +CoveragesByTime,coverages_by_time +CoveredNodes,covered_nodes +CoveredResource,covered_resource +CoversBodyPart,covers_body_part +CpsLimit,cps_limit +CpsUri,cps_uri +Cpu,cpu +CpuCredits,cpu_credits +CpuManufacturers,cpu_manufacturers +CpuOptions,cpu_options +CpuOptionsRequest,cpu_options_request +CpuThreshold,cpu_threshold +CpuUtilization,cpu_utilization +Crawl,crawl +CrawlArchivedSpaces,crawl_archived_spaces +CrawlAttachments,crawl_attachments +CrawlBotMessage,crawl_bot_message +CrawlChatRooms,crawl_chat_rooms +CrawlComments,crawl_comments +CrawlDepth,crawl_depth +CrawlElapsedTime,crawl_elapsed_time +CrawlFileComments,crawl_file_comments +CrawlId,crawl_id +CrawlIssue,crawl_issue +CrawlIssueComment,crawl_issue_comment +CrawlIssueCommentAttachment,crawl_issue_comment_attachment +CrawlPersonalSpaces,crawl_personal_spaces +CrawlPullRequest,crawl_pull_request +CrawlPullRequestComment,crawl_pull_request_comment +CrawlPullRequestCommentAttachment,crawl_pull_request_comment_attachment +CrawlRepositoryDocuments,crawl_repository_documents +CrawlState,crawl_state +CrawlSystemFolders,crawl_system_folders +CrawlTasks,crawl_tasks +CrawlWebLinks,crawl_web_links +Crawler,crawler +CrawlerConnection,crawler_connection +CrawlerDetails,crawler_details +CrawlerHistory,crawler_history +CrawlerLineageSettings,crawler_lineage_settings +CrawlerMetrics,crawler_metrics +CrawlerMetricsList,crawler_metrics_list +CrawlerName,crawler_name +CrawlerNameList,crawler_name_list +CrawlerNames,crawler_names +CrawlerNodeDetails,crawler_node_details +CrawlerNotRunningException,crawler_not_running_exception +CrawlerRunningException,crawler_running_exception +CrawlerSecurityConfiguration,crawler_security_configuration +CrawlerStoppingException,crawler_stopping_exception +CrawlerTargets,crawler_targets +Crawlers,crawlers +CrawlersNotFound,crawlers_not_found +Crawls,crawls +CrawlsFilter,crawls_filter +Create,create +CreateACLRequest,create_acl_request +CreateACLResponse,create_acl_response +CreateAPIKeyRequest,create_api_key_request +CreateAPIKeyResponse,create_api_key_response +CreateAcceleratorRequest,create_accelerator_request +CreateAcceleratorResponse,create_accelerator_response +CreateAccessControlConfigurationRequest,create_access_control_configuration_request +CreateAccessControlConfigurationResponse,create_access_control_configuration_response +CreateAccessKeyRequest,create_access_key_request +CreateAccessKeyResponse,create_access_key_response +CreateAccessLogSubscriptionRequest,create_access_log_subscription_request +CreateAccessLogSubscriptionResponse,create_access_log_subscription_response +CreateAccessPointForObjectLambdaRequest,create_access_point_for_object_lambda_request +CreateAccessPointForObjectLambdaResult,create_access_point_for_object_lambda_result +CreateAccessPointInput,create_access_point_input +CreateAccessPointOutput,create_access_point_output +CreateAccessPointRequest,create_access_point_request +CreateAccessPointResult,create_access_point_result +CreateAccessPolicyRequest,create_access_policy_request +CreateAccessPolicyResponse,create_access_policy_response +CreateAccessPreviewRequest,create_access_preview_request +CreateAccessPreviewResponse,create_access_preview_response +CreateAccessRequest,create_access_request +CreateAccessResponse,create_access_response +CreateAccessTokenRequest,create_access_token_request +CreateAccessTokenResponse,create_access_token_response +CreateAccessorInput,create_accessor_input +CreateAccessorOutput,create_accessor_output +CreateAccountAliasRequest,create_account_alias_request +CreateAccountAssignmentRequest,create_account_assignment_request +CreateAccountAssignmentResponse,create_account_assignment_response +CreateAccountCustomizationRequest,create_account_customization_request +CreateAccountCustomizationResponse,create_account_customization_response +CreateAccountRequest,create_account_request +CreateAccountRequestId,create_account_request_id +CreateAccountResponse,create_account_response +CreateAccountStatus,create_account_status +CreateAccountStatusNotFoundException,create_account_status_not_found_exception +CreateAccountStatuses,create_account_statuses +CreateAccountSubscriptionRequest,create_account_subscription_request +CreateAccountSubscriptionResponse,create_account_subscription_response +CreateActionRequest,create_action_request +CreateActionResponse,create_action_response +CreateActionTargetRequest,create_action_target_request +CreateActionTargetResponse,create_action_target_response +CreateActivationRequest,create_activation_request +CreateActivationResult,create_activation_result +CreateActivityInput,create_activity_input +CreateActivityOutput,create_activity_output +CreateAdditionalAssignmentsForHITRequest,create_additional_assignments_for_hit_request +CreateAddonRequest,create_addon_request +CreateAddonResponse,create_addon_response +CreateAddressBookRequest,create_address_book_request +CreateAddressBookResponse,create_address_book_response +CreateAddressRequest,create_address_request +CreateAddressResult,create_address_result +CreateAgentRequest,create_agent_request +CreateAgentResponse,create_agent_response +CreateAgentStatusRequest,create_agent_status_request +CreateAgentStatusResponse,create_agent_status_response +CreateAgreementRequest,create_agreement_request +CreateAgreementResponse,create_agreement_response +CreateAlarmModelRequest,create_alarm_model_request +CreateAlarmModelResponse,create_alarm_model_response +CreateAlertManagerDefinitionRequest,create_alert_manager_definition_request +CreateAlertManagerDefinitionResponse,create_alert_manager_definition_response +CreateAlertRequest,create_alert_request +CreateAlertResponse,create_alert_response +CreateAlgorithmInput,create_algorithm_input +CreateAlgorithmOutput,create_algorithm_output +CreateAliasInput,create_alias_input +CreateAliasOutput,create_alias_output +CreateAliasRequest,create_alias_request +CreateAliasResult,create_alias_result +CreateAllowListRequest,create_allow_list_request +CreateAllowListResponse,create_allow_list_response +CreateAnalysisRequest,create_analysis_request +CreateAnalysisResponse,create_analysis_response +CreateAnalysisTemplateInput,create_analysis_template_input +CreateAnalysisTemplateOutput,create_analysis_template_output +CreateAnalyzerRequest,create_analyzer_request +CreateAnalyzerResponse,create_analyzer_response +CreateAnnotationStoreRequest,create_annotation_store_request +CreateAnnotationStoreResponse,create_annotation_store_response +CreateAnnotationStoreVersionRequest,create_annotation_store_version_request +CreateAnnotationStoreVersionResponse,create_annotation_store_version_response +CreateAnomalyDetectorRequest,create_anomaly_detector_request +CreateAnomalyDetectorResponse,create_anomaly_detector_response +CreateAnomalyMonitorRequest,create_anomaly_monitor_request +CreateAnomalyMonitorResponse,create_anomaly_monitor_response +CreateAnomalySubscriptionRequest,create_anomaly_subscription_request +CreateAnomalySubscriptionResponse,create_anomaly_subscription_response +CreateApiCacheRequest,create_api_cache_request +CreateApiCacheResponse,create_api_cache_response +CreateApiDestinationRequest,create_api_destination_request +CreateApiDestinationResponse,create_api_destination_response +CreateApiKeyRequest,create_api_key_request +CreateApiKeyResponse,create_api_key_response +CreateApiMappingRequest,create_api_mapping_request +CreateApiMappingResponse,create_api_mapping_response +CreateApiRequest,create_api_request +CreateApiResponse,create_api_response +CreateAppAuthorizationRequest,create_app_authorization_request +CreateAppAuthorizationResponse,create_app_authorization_response +CreateAppBlockBuilderRequest,create_app_block_builder_request +CreateAppBlockBuilderResult,create_app_block_builder_result +CreateAppBlockBuilderStreamingURLRequest,create_app_block_builder_streaming_url_request +CreateAppBlockBuilderStreamingURLResult,create_app_block_builder_streaming_url_result +CreateAppBlockRequest,create_app_block_request +CreateAppBlockResult,create_app_block_result +CreateAppBundleRequest,create_app_bundle_request +CreateAppBundleResponse,create_app_bundle_response +CreateAppCookieStickinessPolicyInput,create_app_cookie_stickiness_policy_input +CreateAppImageConfigRequest,create_app_image_config_request +CreateAppImageConfigResponse,create_app_image_config_response +CreateAppInstanceAdminRequest,create_app_instance_admin_request +CreateAppInstanceAdminResponse,create_app_instance_admin_response +CreateAppInstanceBotRequest,create_app_instance_bot_request +CreateAppInstanceBotResponse,create_app_instance_bot_response +CreateAppInstanceRequest,create_app_instance_request +CreateAppInstanceResponse,create_app_instance_response +CreateAppInstanceUserRequest,create_app_instance_user_request +CreateAppInstanceUserResponse,create_app_instance_user_response +CreateAppMonitorRequest,create_app_monitor_request +CreateAppMonitorResponse,create_app_monitor_response +CreateAppRequest,create_app_request +CreateAppResponse,create_app_response +CreateAppResult,create_app_result +CreateAppVersionAppComponentRequest,create_app_version_app_component_request +CreateAppVersionAppComponentResponse,create_app_version_app_component_response +CreateAppVersionResourceRequest,create_app_version_resource_request +CreateAppVersionResourceResponse,create_app_version_resource_response +CreateApplicationInput,create_application_input +CreateApplicationInstanceRequest,create_application_instance_request +CreateApplicationInstanceResponse,create_application_instance_response +CreateApplicationMessage,create_application_message +CreateApplicationOutput,create_application_output +CreateApplicationPresignedUrlRequest,create_application_presigned_url_request +CreateApplicationPresignedUrlResponse,create_application_presigned_url_response +CreateApplicationRequest,create_application_request +CreateApplicationResponse,create_application_response +CreateApplicationResult,create_application_result +CreateApplicationSnapshotRequest,create_application_snapshot_request +CreateApplicationVersionMessage,create_application_version_message +CreateApplicationVersionRequest,create_application_version_request +CreateApplicationVersionResponse,create_application_version_response +CreateApprovalRuleTemplateInput,create_approval_rule_template_input +CreateApprovalRuleTemplateOutput,create_approval_rule_template_output +CreateArchiveRequest,create_archive_request +CreateArchiveResponse,create_archive_response +CreateArchiveRuleRequest,create_archive_rule_request +CreateArtifactRequest,create_artifact_request +CreateArtifactResponse,create_artifact_response +CreateAssessmentFrameworkControl,create_assessment_framework_control +CreateAssessmentFrameworkControlSet,create_assessment_framework_control_set +CreateAssessmentFrameworkRequest,create_assessment_framework_request +CreateAssessmentFrameworkResponse,create_assessment_framework_response +CreateAssessmentReportRequest,create_assessment_report_request +CreateAssessmentReportResponse,create_assessment_report_response +CreateAssessmentRequest,create_assessment_request +CreateAssessmentResponse,create_assessment_response +CreateAssessmentTargetRequest,create_assessment_target_request +CreateAssessmentTargetResponse,create_assessment_target_response +CreateAssessmentTemplateRequest,create_assessment_template_request +CreateAssessmentTemplateResponse,create_assessment_template_response +CreateAssetModelRequest,create_asset_model_request +CreateAssetModelResponse,create_asset_model_response +CreateAssetRequest,create_asset_request +CreateAssetResponse,create_asset_response +CreateAssistantAssociationRequest,create_assistant_association_request +CreateAssistantAssociationResponse,create_assistant_association_response +CreateAssistantRequest,create_assistant_request +CreateAssistantResponse,create_assistant_response +CreateAssociationBatchRequest,create_association_batch_request +CreateAssociationBatchRequestEntry,create_association_batch_request_entry +CreateAssociationBatchResult,create_association_batch_result +CreateAssociationRequest,create_association_request +CreateAssociationResult,create_association_result +CreateAttendeeError,create_attendee_error +CreateAttendeeRequest,create_attendee_request +CreateAttendeeRequestItem,create_attendee_request_item +CreateAttendeeResponse,create_attendee_response +CreateAttributeGroupRequest,create_attribute_group_request +CreateAttributeGroupResponse,create_attribute_group_response +CreateAuditSuppressionRequest,create_audit_suppression_request +CreateAuthChallenge,create_auth_challenge +CreateAuthenticationProfileMessage,create_authentication_profile_message +CreateAuthenticationProfileResult,create_authentication_profile_result +CreateAuthorizerRequest,create_authorizer_request +CreateAuthorizerResponse,create_authorizer_response +CreateAutoMLJobRequest,create_auto_ml_job_request +CreateAutoMLJobResponse,create_auto_ml_job_response +CreateAutoMLJobV2Request,create_auto_ml_job_v2_request +CreateAutoMLJobV2Response,create_auto_ml_job_v2_response +CreateAutoPredictorRequest,create_auto_predictor_request +CreateAutoPredictorResponse,create_auto_predictor_response +CreateAutoScalingConfigurationRequest,create_auto_scaling_configuration_request +CreateAutoScalingConfigurationResponse,create_auto_scaling_configuration_response +CreateAutoScalingGroupType,create_auto_scaling_group_type +CreateAutomationRuleRequest,create_automation_rule_request +CreateAutomationRuleResponse,create_automation_rule_response +CreateAvailabilityConfigurationRequest,create_availability_configuration_request +CreateAwsLogSourceRequest,create_aws_log_source_request +CreateAwsLogSourceResponse,create_aws_log_source_response +CreateBGPPeerRequest,create_bgp_peer_request +CreateBGPPeerResponse,create_bgp_peer_response +CreateBackendAPIRequest,create_backend_api_request +CreateBackendAPIResponse,create_backend_api_response +CreateBackendAuthForgotPasswordConfig,create_backend_auth_forgot_password_config +CreateBackendAuthIdentityPoolConfig,create_backend_auth_identity_pool_config +CreateBackendAuthMFAConfig,create_backend_auth_mfa_config +CreateBackendAuthOAuthConfig,create_backend_auth_o_auth_config +CreateBackendAuthPasswordPolicyConfig,create_backend_auth_password_policy_config +CreateBackendAuthRequest,create_backend_auth_request +CreateBackendAuthResourceConfig,create_backend_auth_resource_config +CreateBackendAuthResponse,create_backend_auth_response +CreateBackendAuthUserPoolConfig,create_backend_auth_user_pool_config +CreateBackendAuthVerificationMessageConfig,create_backend_auth_verification_message_config +CreateBackendConfigRequest,create_backend_config_request +CreateBackendConfigResponse,create_backend_config_response +CreateBackendEnvironmentRequest,create_backend_environment_request +CreateBackendEnvironmentResult,create_backend_environment_result +CreateBackendRequest,create_backend_request +CreateBackendResponse,create_backend_response +CreateBackendStorageRequest,create_backend_storage_request +CreateBackendStorageResourceConfig,create_backend_storage_resource_config +CreateBackendStorageResponse,create_backend_storage_response +CreateBackupInput,create_backup_input +CreateBackupOutput,create_backup_output +CreateBackupPlanInput,create_backup_plan_input +CreateBackupPlanOutput,create_backup_plan_output +CreateBackupRequest,create_backup_request +CreateBackupResponse,create_backup_response +CreateBackupSelectionInput,create_backup_selection_input +CreateBackupSelectionOutput,create_backup_selection_output +CreateBackupVaultInput,create_backup_vault_input +CreateBackupVaultOutput,create_backup_vault_output +CreateBasePathMappingRequest,create_base_path_mapping_request +CreateBatchImportJobRequest,create_batch_import_job_request +CreateBatchInferenceJobRequest,create_batch_inference_job_request +CreateBatchInferenceJobResponse,create_batch_inference_job_response +CreateBatchLoadTaskRequest,create_batch_load_task_request +CreateBatchLoadTaskResponse,create_batch_load_task_response +CreateBatchPredictionInput,create_batch_prediction_input +CreateBatchPredictionJobRequest,create_batch_prediction_job_request +CreateBatchPredictionOutput,create_batch_prediction_output +CreateBatchSegmentJobRequest,create_batch_segment_job_request +CreateBatchSegmentJobResponse,create_batch_segment_job_response +CreateBillingGroupInput,create_billing_group_input +CreateBillingGroupOutput,create_billing_group_output +CreateBillingGroupRequest,create_billing_group_request +CreateBillingGroupResponse,create_billing_group_response +CreateBlueGreenDeploymentRequest,create_blue_green_deployment_request +CreateBlueGreenDeploymentResponse,create_blue_green_deployment_response +CreateBlueprintRequest,create_blueprint_request +CreateBlueprintResponse,create_blueprint_response +CreateBotAliasRequest,create_bot_alias_request +CreateBotAliasResponse,create_bot_alias_response +CreateBotLocaleRequest,create_bot_locale_request +CreateBotLocaleResponse,create_bot_locale_response +CreateBotRequest,create_bot_request +CreateBotResponse,create_bot_response +CreateBotVersionRequest,create_bot_version_request +CreateBotVersionResponse,create_bot_version_response +CreateBranchInput,create_branch_input +CreateBranchRequest,create_branch_request +CreateBranchResult,create_branch_result +CreateBridge420Exception,create_bridge420_exception +CreateBridgeRequest,create_bridge_request +CreateBridgeResponse,create_bridge_response +CreateBrokerRequest,create_broker_request +CreateBrokerResponse,create_broker_response +CreateBrowserSettingsRequest,create_browser_settings_request +CreateBrowserSettingsResponse,create_browser_settings_response +CreateBucketAccessKeyRequest,create_bucket_access_key_request +CreateBucketAccessKeyResult,create_bucket_access_key_result +CreateBucketConfiguration,create_bucket_configuration +CreateBucketOutput,create_bucket_output +CreateBucketRequest,create_bucket_request +CreateBucketResult,create_bucket_result +CreateBudgetActionRequest,create_budget_action_request +CreateBudgetActionResponse,create_budget_action_response +CreateBudgetRequest,create_budget_request +CreateBuildInput,create_build_input +CreateBuildOutput,create_build_output +CreateBulkImportJobRequest,create_bulk_import_job_request +CreateBulkImportJobResponse,create_bulk_import_job_response +CreateBusinessReportScheduleRequest,create_business_report_schedule_request +CreateBusinessReportScheduleResponse,create_business_report_schedule_response +CreateByteMatchSetRequest,create_byte_match_set_request +CreateByteMatchSetResponse,create_byte_match_set_response +CreateCacheClusterMessage,create_cache_cluster_message +CreateCacheClusterResult,create_cache_cluster_result +CreateCacheParameterGroupMessage,create_cache_parameter_group_message +CreateCacheParameterGroupResult,create_cache_parameter_group_result +CreateCachePolicyRequest,create_cache_policy_request +CreateCachePolicyResult,create_cache_policy_result +CreateCacheSecurityGroupMessage,create_cache_security_group_message +CreateCacheSecurityGroupResult,create_cache_security_group_result +CreateCacheSubnetGroupMessage,create_cache_subnet_group_message +CreateCacheSubnetGroupResult,create_cache_subnet_group_result +CreateCachediSCSIVolumeInput,create_cachedi_scsi_volume_input +CreateCachediSCSIVolumeOutput,create_cachedi_scsi_volume_output +CreateCalculatedAttributeDefinitionRequest,create_calculated_attribute_definition_request +CreateCalculatedAttributeDefinitionResponse,create_calculated_attribute_definition_response +CreateCallAnalyticsCategoryRequest,create_call_analytics_category_request +CreateCallAnalyticsCategoryResponse,create_call_analytics_category_response +CreateCampaignRequest,create_campaign_request +CreateCampaignResponse,create_campaign_response +CreateCanaryRequest,create_canary_request +CreateCanaryResponse,create_canary_response +CreateCapacityProviderRequest,create_capacity_provider_request +CreateCapacityProviderResponse,create_capacity_provider_response +CreateCapacityReservationFleetRequest,create_capacity_reservation_fleet_request +CreateCapacityReservationFleetResult,create_capacity_reservation_fleet_result +CreateCapacityReservationInput,create_capacity_reservation_input +CreateCapacityReservationRequest,create_capacity_reservation_request +CreateCapacityReservationResult,create_capacity_reservation_result +CreateCarrierGatewayRequest,create_carrier_gateway_request +CreateCarrierGatewayResult,create_carrier_gateway_result +CreateCaseRequest,create_case_request +CreateCaseResponse,create_case_response +CreateCellRequest,create_cell_request +CreateCellResponse,create_cell_response +CreateCertificateAuthorityAuditReportRequest,create_certificate_authority_audit_report_request +CreateCertificateAuthorityAuditReportResponse,create_certificate_authority_audit_report_response +CreateCertificateAuthorityRequest,create_certificate_authority_request +CreateCertificateAuthorityResponse,create_certificate_authority_response +CreateCertificateFromCsrRequest,create_certificate_from_csr_request +CreateCertificateFromCsrResponse,create_certificate_from_csr_response +CreateCertificateRequest,create_certificate_request +CreateCertificateResult,create_certificate_result +CreateChangeSetInput,create_change_set_input +CreateChangeSetOutput,create_change_set_output +CreateChangesetRequest,create_changeset_request +CreateChangesetResponse,create_changeset_response +CreateChannelBanRequest,create_channel_ban_request +CreateChannelBanResponse,create_channel_ban_response +CreateChannelFlowRequest,create_channel_flow_request +CreateChannelFlowResponse,create_channel_flow_response +CreateChannelGroupRequest,create_channel_group_request +CreateChannelGroupResponse,create_channel_group_response +CreateChannelMembershipRequest,create_channel_membership_request +CreateChannelMembershipResponse,create_channel_membership_response +CreateChannelModeratorRequest,create_channel_moderator_request +CreateChannelModeratorResponse,create_channel_moderator_response +CreateChannelRequest,create_channel_request +CreateChannelResponse,create_channel_response +CreateChatTokenRequest,create_chat_token_request +CreateChatTokenResponse,create_chat_token_response +CreateCidrCollectionRequest,create_cidr_collection_request +CreateCidrCollectionResponse,create_cidr_collection_response +CreateClassificationJobRequest,create_classification_job_request +CreateClassificationJobResponse,create_classification_job_response +CreateClassifierRequest,create_classifier_request +CreateCliTokenRequest,create_cli_token_request +CreateCliTokenResponse,create_cli_token_response +CreateClientVpnEndpointRequest,create_client_vpn_endpoint_request +CreateClientVpnEndpointResult,create_client_vpn_endpoint_result +CreateClientVpnRouteRequest,create_client_vpn_route_request +CreateClientVpnRouteResult,create_client_vpn_route_result +CreateCloudFormationChangeSetRequest,create_cloud_formation_change_set_request +CreateCloudFormationChangeSetResponse,create_cloud_formation_change_set_response +CreateCloudFormationStackRequest,create_cloud_formation_stack_request +CreateCloudFormationStackResult,create_cloud_formation_stack_result +CreateCloudFormationTemplateRequest,create_cloud_formation_template_request +CreateCloudFormationTemplateResponse,create_cloud_formation_template_response +CreateCloudFrontOriginAccessIdentityRequest,create_cloud_front_origin_access_identity_request +CreateCloudFrontOriginAccessIdentityResult,create_cloud_front_origin_access_identity_result +CreateClusterInput,create_cluster_input +CreateClusterMessage,create_cluster_message +CreateClusterOutput,create_cluster_output +CreateClusterParameterGroupMessage,create_cluster_parameter_group_message +CreateClusterParameterGroupResult,create_cluster_parameter_group_result +CreateClusterRequest,create_cluster_request +CreateClusterResponse,create_cluster_response +CreateClusterResult,create_cluster_result +CreateClusterSecurityGroupMessage,create_cluster_security_group_message +CreateClusterSecurityGroupResult,create_cluster_security_group_result +CreateClusterSnapshotInput,create_cluster_snapshot_input +CreateClusterSnapshotMessage,create_cluster_snapshot_message +CreateClusterSnapshotOutput,create_cluster_snapshot_output +CreateClusterSnapshotResult,create_cluster_snapshot_result +CreateClusterSubnetGroupMessage,create_cluster_subnet_group_message +CreateClusterSubnetGroupResult,create_cluster_subnet_group_result +CreateClusterV2Request,create_cluster_v2_request +CreateClusterV2Response,create_cluster_v2_response +CreateCodeRepositoryInput,create_code_repository_input +CreateCodeRepositoryOutput,create_code_repository_output +CreateCodeReviewRequest,create_code_review_request +CreateCodeReviewResponse,create_code_review_response +CreateCodeSigningConfigRequest,create_code_signing_config_request +CreateCodeSigningConfigResponse,create_code_signing_config_response +CreateCoipCidrRequest,create_coip_cidr_request +CreateCoipCidrResult,create_coip_cidr_result +CreateCoipPoolRequest,create_coip_pool_request +CreateCoipPoolResult,create_coip_pool_result +CreateCollaborationInput,create_collaboration_input +CreateCollaborationOutput,create_collaboration_output +CreateCollectionDetail,create_collection_detail +CreateCollectionRequest,create_collection_request +CreateCollectionResponse,create_collection_response +CreateColumn,create_column +CreateColumnsOperation,create_columns_operation +CreateCommentRequest,create_comment_request +CreateCommentResponse,create_comment_response +CreateCommitInput,create_commit_input +CreateCommitOutput,create_commit_output +CreateCompilationJobRequest,create_compilation_job_request +CreateCompilationJobResponse,create_compilation_job_response +CreateComponentData,create_component_data +CreateComponentInput,create_component_input +CreateComponentOutput,create_component_output +CreateComponentRequest,create_component_request +CreateComponentResponse,create_component_response +CreateComponentTypeRequest,create_component_type_request +CreateComponentTypeResponse,create_component_type_response +CreateComponentVersionRequest,create_component_version_request +CreateComponentVersionResponse,create_component_version_response +CreateComputeEnvironmentRequest,create_compute_environment_request +CreateComputeEnvironmentResponse,create_compute_environment_response +CreateComputerRequest,create_computer_request +CreateComputerResult,create_computer_result +CreateConditionalForwarderRequest,create_conditional_forwarder_request +CreateConferenceProviderRequest,create_conference_provider_request +CreateConferenceProviderResponse,create_conference_provider_response +CreateConfigRequest,create_config_request +CreateConfigurationProfileRequest,create_configuration_profile_request +CreateConfigurationRequest,create_configuration_request +CreateConfigurationResponse,create_configuration_response +CreateConfigurationSetEventDestinationRequest,create_configuration_set_event_destination_request +CreateConfigurationSetRequest,create_configuration_set_request +CreateConfigurationSetResult,create_configuration_set_result +CreateConfigurationSetTrackingOptionsRequest,create_configuration_set_tracking_options_request +CreateConfigurationTemplateMessage,create_configuration_template_message +CreateConfiguredTableAnalysisRuleInput,create_configured_table_analysis_rule_input +CreateConfiguredTableAnalysisRuleOutput,create_configured_table_analysis_rule_output +CreateConfiguredTableAssociationInput,create_configured_table_association_input +CreateConfiguredTableAssociationOutput,create_configured_table_association_output +CreateConfiguredTableInput,create_configured_table_input +CreateConfiguredTableOutput,create_configured_table_output +CreateConnectAttachmentRequest,create_connect_attachment_request +CreateConnectAttachmentResponse,create_connect_attachment_response +CreateConnectClientAddInRequest,create_connect_client_add_in_request +CreateConnectClientAddInResult,create_connect_client_add_in_result +CreateConnectPeerRequest,create_connect_peer_request +CreateConnectPeerResponse,create_connect_peer_response +CreateConnectionAliasRequest,create_connection_alias_request +CreateConnectionAliasResult,create_connection_alias_result +CreateConnectionApiKeyAuthRequestParameters,create_connection_api_key_auth_request_parameters +CreateConnectionAuthRequestParameters,create_connection_auth_request_parameters +CreateConnectionBasicAuthRequestParameters,create_connection_basic_auth_request_parameters +CreateConnectionInput,create_connection_input +CreateConnectionOAuthClientRequestParameters,create_connection_o_auth_client_request_parameters +CreateConnectionOAuthRequestParameters,create_connection_o_auth_request_parameters +CreateConnectionOutput,create_connection_output +CreateConnectionRequest,create_connection_request +CreateConnectionResponse,create_connection_response +CreateConnectorDefinitionRequest,create_connector_definition_request +CreateConnectorDefinitionResponse,create_connector_definition_response +CreateConnectorDefinitionVersionRequest,create_connector_definition_version_request +CreateConnectorDefinitionVersionResponse,create_connector_definition_version_response +CreateConnectorProfileRequest,create_connector_profile_request +CreateConnectorProfileResponse,create_connector_profile_response +CreateConnectorRequest,create_connector_request +CreateConnectorResponse,create_connector_response +CreateConstraintInput,create_constraint_input +CreateConstraintOutput,create_constraint_output +CreateContactChannelRequest,create_contact_channel_request +CreateContactChannelResult,create_contact_channel_result +CreateContactFlowModuleRequest,create_contact_flow_module_request +CreateContactFlowModuleResponse,create_contact_flow_module_response +CreateContactFlowRequest,create_contact_flow_request +CreateContactFlowResponse,create_contact_flow_response +CreateContactListRequest,create_contact_list_request +CreateContactMethodRequest,create_contact_method_request +CreateContactMethodResult,create_contact_method_result +CreateContactRequest,create_contact_request +CreateContactResponse,create_contact_response +CreateContactResult,create_contact_result +CreateContainerInput,create_container_input +CreateContainerOutput,create_container_output +CreateContainerRecipeRequest,create_container_recipe_request +CreateContainerRecipeResponse,create_container_recipe_response +CreateContainerServiceDeploymentRequest,create_container_service_deployment_request +CreateContainerServiceDeploymentResult,create_container_service_deployment_result +CreateContainerServiceRegistryLoginResult,create_container_service_registry_login_result +CreateContainerServiceRequest,create_container_service_request +CreateContainerServiceResult,create_container_service_result +CreateContentRequest,create_content_request +CreateContentResponse,create_content_response +CreateContextRequest,create_context_request +CreateContextResponse,create_context_response +CreateContinuousDeploymentPolicyRequest,create_continuous_deployment_policy_request +CreateContinuousDeploymentPolicyResult,create_continuous_deployment_policy_result +CreateControlMappingSource,create_control_mapping_source +CreateControlPanelRequest,create_control_panel_request +CreateControlPanelResponse,create_control_panel_response +CreateControlRequest,create_control_request +CreateControlResponse,create_control_response +CreateCoreDefinitionRequest,create_core_definition_request +CreateCoreDefinitionResponse,create_core_definition_response +CreateCoreDefinitionVersionRequest,create_core_definition_version_request +CreateCoreDefinitionVersionResponse,create_core_definition_version_response +CreateCoreNetworkRequest,create_core_network_request +CreateCoreNetworkResponse,create_core_network_response +CreateCostCategoryDefinitionRequest,create_cost_category_definition_request +CreateCostCategoryDefinitionResponse,create_cost_category_definition_response +CreateCrawlerRequest,create_crawler_request +CreateCrossAccountAuthorizationRequest,create_cross_account_authorization_request +CreateCrossAccountAuthorizationResponse,create_cross_account_authorization_response +CreateCsvClassifierRequest,create_csv_classifier_request +CreateCustomActionTypeInput,create_custom_action_type_input +CreateCustomActionTypeOutput,create_custom_action_type_output +CreateCustomDBEngineVersionFault,create_custom_db_engine_version_fault +CreateCustomDBEngineVersionMessage,create_custom_db_engine_version_message +CreateCustomDataIdentifierRequest,create_custom_data_identifier_request +CreateCustomDataIdentifierResponse,create_custom_data_identifier_response +CreateCustomDomainAssociationMessage,create_custom_domain_association_message +CreateCustomDomainAssociationResult,create_custom_domain_association_result +CreateCustomEntityTypeRequest,create_custom_entity_type_request +CreateCustomEntityTypeResponse,create_custom_entity_type_response +CreateCustomKeyStoreRequest,create_custom_key_store_request +CreateCustomKeyStoreResponse,create_custom_key_store_response +CreateCustomLineItemInput,create_custom_line_item_input +CreateCustomLineItemOutput,create_custom_line_item_output +CreateCustomLogSourceRequest,create_custom_log_source_request +CreateCustomLogSourceResponse,create_custom_log_source_response +CreateCustomMetadataRequest,create_custom_metadata_request +CreateCustomMetricRequest,create_custom_metric_request +CreateCustomMetricResponse,create_custom_metric_response +CreateCustomPluginRequest,create_custom_plugin_request +CreateCustomPluginResponse,create_custom_plugin_response +CreateCustomRoutingAcceleratorRequest,create_custom_routing_accelerator_request +CreateCustomRoutingAcceleratorResponse,create_custom_routing_accelerator_response +CreateCustomRoutingEndpointGroupRequest,create_custom_routing_endpoint_group_request +CreateCustomRoutingEndpointGroupResponse,create_custom_routing_endpoint_group_response +CreateCustomRoutingListenerRequest,create_custom_routing_listener_request +CreateCustomRoutingListenerResponse,create_custom_routing_listener_response +CreateCustomVerificationEmailTemplateRequest,create_custom_verification_email_template_request +CreateCustomerGatewayRequest,create_customer_gateway_request +CreateCustomerGatewayResult,create_customer_gateway_result +CreateDBClusterEndpointMessage,create_db_cluster_endpoint_message +CreateDBClusterEndpointOutput,create_db_cluster_endpoint_output +CreateDBClusterMessage,create_db_cluster_message +CreateDBClusterParameterGroupMessage,create_db_cluster_parameter_group_message +CreateDBClusterParameterGroupResult,create_db_cluster_parameter_group_result +CreateDBClusterResult,create_db_cluster_result +CreateDBClusterSnapshotMessage,create_db_cluster_snapshot_message +CreateDBClusterSnapshotResult,create_db_cluster_snapshot_result +CreateDBInstanceMessage,create_db_instance_message +CreateDBInstanceReadReplicaMessage,create_db_instance_read_replica_message +CreateDBInstanceReadReplicaResult,create_db_instance_read_replica_result +CreateDBInstanceResult,create_db_instance_result +CreateDBParameterGroupMessage,create_db_parameter_group_message +CreateDBParameterGroupResult,create_db_parameter_group_result +CreateDBProxyEndpointRequest,create_db_proxy_endpoint_request +CreateDBProxyEndpointResponse,create_db_proxy_endpoint_response +CreateDBProxyRequest,create_db_proxy_request +CreateDBProxyResponse,create_db_proxy_response +CreateDBSecurityGroupMessage,create_db_security_group_message +CreateDBSecurityGroupResult,create_db_security_group_result +CreateDBSnapshotMessage,create_db_snapshot_message +CreateDBSnapshotResult,create_db_snapshot_result +CreateDBSubnetGroupMessage,create_db_subnet_group_message +CreateDBSubnetGroupResult,create_db_subnet_group_result +CreateDashboardRequest,create_dashboard_request +CreateDashboardResponse,create_dashboard_response +CreateDataCatalogInput,create_data_catalog_input +CreateDataCellsFilterRequest,create_data_cells_filter_request +CreateDataIntegrationRequest,create_data_integration_request +CreateDataIntegrationResponse,create_data_integration_response +CreateDataLakeExceptionSubscriptionRequest,create_data_lake_exception_subscription_request +CreateDataLakeOrganizationConfigurationRequest,create_data_lake_organization_configuration_request +CreateDataLakeRequest,create_data_lake_request +CreateDataLakeResponse,create_data_lake_response +CreateDataProviderMessage,create_data_provider_message +CreateDataProviderResponse,create_data_provider_response +CreateDataQualityJobDefinitionRequest,create_data_quality_job_definition_request +CreateDataQualityJobDefinitionResponse,create_data_quality_job_definition_response +CreateDataQualityRulesetRequest,create_data_quality_ruleset_request +CreateDataQualityRulesetResponse,create_data_quality_ruleset_response +CreateDataRepositoryAssociationRequest,create_data_repository_association_request +CreateDataRepositoryAssociationResponse,create_data_repository_association_response +CreateDataRepositoryTaskRequest,create_data_repository_task_request +CreateDataRepositoryTaskResponse,create_data_repository_task_response +CreateDataSetImportTaskRequest,create_data_set_import_task_request +CreateDataSetImportTaskResponse,create_data_set_import_task_response +CreateDataSetRequest,create_data_set_request +CreateDataSetResponse,create_data_set_response +CreateDataSourceFromRDSInput,create_data_source_from_rds_input +CreateDataSourceFromRDSOutput,create_data_source_from_rds_output +CreateDataSourceFromRedshiftInput,create_data_source_from_redshift_input +CreateDataSourceFromRedshiftOutput,create_data_source_from_redshift_output +CreateDataSourceFromS3Input,create_data_source_from_s3_input +CreateDataSourceFromS3Output,create_data_source_from_s3_output +CreateDataSourceRequest,create_data_source_request +CreateDataSourceResponse,create_data_source_response +CreateDataViewRequest,create_data_view_request +CreateDataViewResponse,create_data_view_response +CreateDatabaseDefaultPermissions,create_database_default_permissions +CreateDatabaseRequest,create_database_request +CreateDatabaseResponse,create_database_response +CreateDataflowEndpointGroupRequest,create_dataflow_endpoint_group_request +CreateDatasetContentRequest,create_dataset_content_request +CreateDatasetContentResponse,create_dataset_content_response +CreateDatasetExportJobRequest,create_dataset_export_job_request +CreateDatasetExportJobResponse,create_dataset_export_job_response +CreateDatasetGroupRequest,create_dataset_group_request +CreateDatasetGroupResponse,create_dataset_group_response +CreateDatasetImportJobRequest,create_dataset_import_job_request +CreateDatasetImportJobResponse,create_dataset_import_job_response +CreateDatasetRequest,create_dataset_request +CreateDatasetResponse,create_dataset_response +CreateDatastoreRequest,create_datastore_request +CreateDatastoreResponse,create_datastore_response +CreateDate,create_date +CreateDecoderManifestRequest,create_decoder_manifest_request +CreateDecoderManifestResponse,create_decoder_manifest_response +CreateDedicatedIpPoolRequest,create_dedicated_ip_pool_request +CreateDefaultSubnetRequest,create_default_subnet_request +CreateDefaultSubnetResult,create_default_subnet_result +CreateDefaultVpcRequest,create_default_vpc_request +CreateDefaultVpcResult,create_default_vpc_result +CreateDelegationRequest,create_delegation_request +CreateDeliverabilityTestReportRequest,create_deliverability_test_report_request +CreateDeliverabilityTestReportResponse,create_deliverability_test_report_response +CreateDeliveryStreamInput,create_delivery_stream_input +CreateDeliveryStreamOutput,create_delivery_stream_output +CreateDeploymentConfigInput,create_deployment_config_input +CreateDeploymentConfigOutput,create_deployment_config_output +CreateDeploymentGroupInput,create_deployment_group_input +CreateDeploymentGroupOutput,create_deployment_group_output +CreateDeploymentInput,create_deployment_input +CreateDeploymentJobRequest,create_deployment_job_request +CreateDeploymentJobResponse,create_deployment_job_response +CreateDeploymentOutput,create_deployment_output +CreateDeploymentRequest,create_deployment_request +CreateDeploymentResponse,create_deployment_response +CreateDeploymentResult,create_deployment_result +CreateDeploymentStrategyRequest,create_deployment_strategy_request +CreateDestinationRequest,create_destination_request +CreateDestinationResponse,create_destination_response +CreateDetectorModelRequest,create_detector_model_request +CreateDetectorModelResponse,create_detector_model_response +CreateDetectorRequest,create_detector_request +CreateDetectorResponse,create_detector_response +CreateDetectorVersionRequest,create_detector_version_request +CreateDetectorVersionResult,create_detector_version_result +CreateDevEndpointRequest,create_dev_endpoint_request +CreateDevEndpointResponse,create_dev_endpoint_response +CreateDevEnvironmentRequest,create_dev_environment_request +CreateDevEnvironmentResponse,create_dev_environment_response +CreateDeviceDefinitionRequest,create_device_definition_request +CreateDeviceDefinitionResponse,create_device_definition_response +CreateDeviceDefinitionVersionRequest,create_device_definition_version_request +CreateDeviceDefinitionVersionResponse,create_device_definition_version_response +CreateDeviceFleetRequest,create_device_fleet_request +CreateDevicePoolRequest,create_device_pool_request +CreateDevicePoolResult,create_device_pool_result +CreateDeviceProfileRequest,create_device_profile_request +CreateDeviceProfileResponse,create_device_profile_response +CreateDeviceRequest,create_device_request +CreateDeviceResponse,create_device_response +CreateDhcpOptionsRequest,create_dhcp_options_request +CreateDhcpOptionsResult,create_dhcp_options_result +CreateDimensionRequest,create_dimension_request +CreateDimensionResponse,create_dimension_response +CreateDirectConnectGatewayAssociationProposalRequest,create_direct_connect_gateway_association_proposal_request +CreateDirectConnectGatewayAssociationProposalResult,create_direct_connect_gateway_association_proposal_result +CreateDirectConnectGatewayAssociationRequest,create_direct_connect_gateway_association_request +CreateDirectConnectGatewayAssociationResult,create_direct_connect_gateway_association_result +CreateDirectConnectGatewayRequest,create_direct_connect_gateway_request +CreateDirectConnectGatewayResult,create_direct_connect_gateway_result +CreateDirectoryConfigRequest,create_directory_config_request +CreateDirectoryConfigResult,create_directory_config_result +CreateDirectoryRegistrationRequest,create_directory_registration_request +CreateDirectoryRegistrationResponse,create_directory_registration_response +CreateDirectoryRequest,create_directory_request +CreateDirectoryResponse,create_directory_response +CreateDirectoryResult,create_directory_result +CreateDiscovererRequest,create_discoverer_request +CreateDiscovererResponse,create_discoverer_response +CreateDiskFromSnapshotRequest,create_disk_from_snapshot_request +CreateDiskFromSnapshotResult,create_disk_from_snapshot_result +CreateDiskRequest,create_disk_request +CreateDiskResult,create_disk_result +CreateDiskSnapshotRequest,create_disk_snapshot_request +CreateDiskSnapshotResult,create_disk_snapshot_result +CreateDistributionConfigurationRequest,create_distribution_configuration_request +CreateDistributionConfigurationResponse,create_distribution_configuration_response +CreateDistributionRequest,create_distribution_request +CreateDistributionResult,create_distribution_result +CreateDistributionWithTagsRequest,create_distribution_with_tags_request +CreateDistributionWithTagsResult,create_distribution_with_tags_result +CreateDocumentClassifierRequest,create_document_classifier_request +CreateDocumentClassifierResponse,create_document_classifier_response +CreateDocumentRequest,create_document_request +CreateDocumentResult,create_document_result +CreateDocumentationPartRequest,create_documentation_part_request +CreateDocumentationVersionRequest,create_documentation_version_request +CreateDomainAssociationRequest,create_domain_association_request +CreateDomainAssociationResult,create_domain_association_result +CreateDomainConfigurationRequest,create_domain_configuration_request +CreateDomainConfigurationResponse,create_domain_configuration_response +CreateDomainEntryRequest,create_domain_entry_request +CreateDomainEntryResult,create_domain_entry_result +CreateDomainNameRequest,create_domain_name_request +CreateDomainNameResponse,create_domain_name_response +CreateDomainRequest,create_domain_request +CreateDomainResponse,create_domain_response +CreateDomainResult,create_domain_result +CreateDynamicThingGroupRequest,create_dynamic_thing_group_request +CreateDynamicThingGroupResponse,create_dynamic_thing_group_response +CreateEdgeDeploymentPlanRequest,create_edge_deployment_plan_request +CreateEdgeDeploymentPlanResponse,create_edge_deployment_plan_response +CreateEdgeDeploymentStageRequest,create_edge_deployment_stage_request +CreateEdgePackagingJobRequest,create_edge_packaging_job_request +CreateEgressOnlyInternetGatewayRequest,create_egress_only_internet_gateway_request +CreateEgressOnlyInternetGatewayResult,create_egress_only_internet_gateway_result +CreateElasticsearchDomainRequest,create_elasticsearch_domain_request +CreateElasticsearchDomainResponse,create_elasticsearch_domain_response +CreateEmailIdentityPolicyRequest,create_email_identity_policy_request +CreateEmailIdentityRequest,create_email_identity_request +CreateEmailIdentityResponse,create_email_identity_response +CreateEmailTemplateRequest,create_email_template_request +CreateEmailTemplateResponse,create_email_template_response +CreateEndOfMeetingReminder,create_end_of_meeting_reminder +CreateEndpointAccessMessage,create_endpoint_access_message +CreateEndpointAccessRequest,create_endpoint_access_request +CreateEndpointAccessResponse,create_endpoint_access_response +CreateEndpointConfigInput,create_endpoint_config_input +CreateEndpointConfigOutput,create_endpoint_config_output +CreateEndpointGroupRequest,create_endpoint_group_request +CreateEndpointGroupResponse,create_endpoint_group_response +CreateEndpointInput,create_endpoint_input +CreateEndpointMessage,create_endpoint_message +CreateEndpointOutput,create_endpoint_output +CreateEndpointRequest,create_endpoint_request +CreateEndpointResponse,create_endpoint_response +CreateEndpointResult,create_endpoint_result +CreateEntitlementRequest,create_entitlement_request +CreateEntitlementResult,create_entitlement_result +CreateEntityRecognizerRequest,create_entity_recognizer_request +CreateEntityRecognizerResponse,create_entity_recognizer_response +CreateEntityRequest,create_entity_request +CreateEntityResponse,create_entity_response +CreateEnvironmentAccountConnectionInput,create_environment_account_connection_input +CreateEnvironmentAccountConnectionOutput,create_environment_account_connection_output +CreateEnvironmentEC2Request,create_environment_ec2_request +CreateEnvironmentEC2Result,create_environment_ec2_result +CreateEnvironmentInput,create_environment_input +CreateEnvironmentMembershipRequest,create_environment_membership_request +CreateEnvironmentMembershipResult,create_environment_membership_result +CreateEnvironmentMessage,create_environment_message +CreateEnvironmentOutput,create_environment_output +CreateEnvironmentRequest,create_environment_request +CreateEnvironmentResponse,create_environment_response +CreateEnvironmentTemplateInput,create_environment_template_input +CreateEnvironmentTemplateOutput,create_environment_template_output +CreateEnvironmentTemplateVersionInput,create_environment_template_version_input +CreateEnvironmentTemplateVersionOutput,create_environment_template_version_output +CreateEphemerisRequest,create_ephemeris_request +CreateEvaluationFormRequest,create_evaluation_form_request +CreateEvaluationFormResponse,create_evaluation_form_response +CreateEvaluationInput,create_evaluation_input +CreateEvaluationOutput,create_evaluation_output +CreateEventActionRequest,create_event_action_request +CreateEventActionResponse,create_event_action_response +CreateEventBusRequest,create_event_bus_request +CreateEventBusResponse,create_event_bus_response +CreateEventDataStoreRequest,create_event_data_store_request +CreateEventDataStoreResponse,create_event_data_store_response +CreateEventDestinationRequest,create_event_destination_request +CreateEventDestinationResult,create_event_destination_result +CreateEventIntegrationRequest,create_event_integration_request +CreateEventIntegrationResponse,create_event_integration_response +CreateEventSourceMappingRequest,create_event_source_mapping_request +CreateEventStreamRequest,create_event_stream_request +CreateEventStreamResponse,create_event_stream_response +CreateEventSubscriptionMessage,create_event_subscription_message +CreateEventSubscriptionResponse,create_event_subscription_response +CreateEventSubscriptionResult,create_event_subscription_result +CreateEventTrackerRequest,create_event_tracker_request +CreateEventTrackerResponse,create_event_tracker_response +CreateExclusionsPreviewRequest,create_exclusions_preview_request +CreateExclusionsPreviewResponse,create_exclusions_preview_response +CreateExperienceRequest,create_experience_request +CreateExperienceResponse,create_experience_response +CreateExperimentRequest,create_experiment_request +CreateExperimentResponse,create_experiment_response +CreateExperimentTemplateActionInput,create_experiment_template_action_input +CreateExperimentTemplateLogConfigurationInput,create_experiment_template_log_configuration_input +CreateExperimentTemplateRequest,create_experiment_template_request +CreateExperimentTemplateResponse,create_experiment_template_response +CreateExperimentTemplateStopConditionInput,create_experiment_template_stop_condition_input +CreateExperimentTemplateTargetInput,create_experiment_template_target_input +CreateExplainabilityExportRequest,create_explainability_export_request +CreateExplainabilityExportResponse,create_explainability_export_response +CreateExplainabilityRequest,create_explainability_request +CreateExplainabilityResponse,create_explainability_response +CreateExportJobRequest,create_export_job_request +CreateExportJobResponse,create_export_job_response +CreateExportRequest,create_export_request +CreateExportResponse,create_export_response +CreateExportTaskRequest,create_export_task_request +CreateExportTaskResponse,create_export_task_response +CreateExtendedSourceServerRequest,create_extended_source_server_request +CreateExtendedSourceServerResponse,create_extended_source_server_response +CreateExtensionAssociationRequest,create_extension_association_request +CreateExtensionRequest,create_extension_request +CreateFHIRDatastoreRequest,create_fhir_datastore_request +CreateFHIRDatastoreResponse,create_fhir_datastore_response +CreateFaceLivenessSessionRequest,create_face_liveness_session_request +CreateFaceLivenessSessionRequestSettings,create_face_liveness_session_request_settings +CreateFaceLivenessSessionResponse,create_face_liveness_session_response +CreateFacetRequest,create_facet_request +CreateFaqRequest,create_faq_request +CreateFaqResponse,create_faq_response +CreateFargateProfileRequest,create_fargate_profile_request +CreateFargateProfileResponse,create_fargate_profile_response +CreateFeatureGroupRequest,create_feature_group_request +CreateFeatureGroupResponse,create_feature_group_response +CreateFeatureRequest,create_feature_request +CreateFeatureResponse,create_feature_response +CreateFeaturedResultsSetRequest,create_featured_results_set_request +CreateFeaturedResultsSetResponse,create_featured_results_set_response +CreateFieldLevelEncryptionConfigRequest,create_field_level_encryption_config_request +CreateFieldLevelEncryptionConfigResult,create_field_level_encryption_config_result +CreateFieldLevelEncryptionProfileRequest,create_field_level_encryption_profile_request +CreateFieldLevelEncryptionProfileResult,create_field_level_encryption_profile_result +CreateFieldRequest,create_field_request +CreateFieldResponse,create_field_response +CreateFileCacheLustreConfiguration,create_file_cache_lustre_configuration +CreateFileCacheRequest,create_file_cache_request +CreateFileCacheResponse,create_file_cache_response +CreateFileSystemFromBackupRequest,create_file_system_from_backup_request +CreateFileSystemFromBackupResponse,create_file_system_from_backup_response +CreateFileSystemLustreConfiguration,create_file_system_lustre_configuration +CreateFileSystemOntapConfiguration,create_file_system_ontap_configuration +CreateFileSystemOpenZFSConfiguration,create_file_system_open_zfs_configuration +CreateFileSystemRequest,create_file_system_request +CreateFileSystemResponse,create_file_system_response +CreateFileSystemWindowsConfiguration,create_file_system_windows_configuration +CreateFilterRequest,create_filter_request +CreateFilterResponse,create_filter_response +CreateFindingAggregatorRequest,create_finding_aggregator_request +CreateFindingAggregatorResponse,create_finding_aggregator_response +CreateFindingsFilterRequest,create_findings_filter_request +CreateFindingsFilterResponse,create_findings_filter_response +CreateFindingsReportRequest,create_findings_report_request +CreateFindingsReportResponse,create_findings_report_response +CreateFirewallDomainListRequest,create_firewall_domain_list_request +CreateFirewallDomainListResponse,create_firewall_domain_list_response +CreateFirewallPolicyRequest,create_firewall_policy_request +CreateFirewallPolicyResponse,create_firewall_policy_response +CreateFirewallRequest,create_firewall_request +CreateFirewallResponse,create_firewall_response +CreateFirewallRuleGroupRequest,create_firewall_rule_group_request +CreateFirewallRuleGroupResponse,create_firewall_rule_group_response +CreateFirewallRuleRequest,create_firewall_rule_request +CreateFirewallRuleResponse,create_firewall_rule_response +CreateFleetAdvisorCollectorRequest,create_fleet_advisor_collector_request +CreateFleetAdvisorCollectorResponse,create_fleet_advisor_collector_response +CreateFleetError,create_fleet_error +CreateFleetInput,create_fleet_input +CreateFleetInstance,create_fleet_instance +CreateFleetLocationsInput,create_fleet_locations_input +CreateFleetLocationsOutput,create_fleet_locations_output +CreateFleetMetricRequest,create_fleet_metric_request +CreateFleetMetricResponse,create_fleet_metric_response +CreateFleetOutput,create_fleet_output +CreateFleetRequest,create_fleet_request +CreateFleetResponse,create_fleet_response +CreateFleetResult,create_fleet_result +CreateFlow420Exception,create_flow420_exception +CreateFlowDefinitionRequest,create_flow_definition_request +CreateFlowDefinitionResponse,create_flow_definition_response +CreateFlowLogsRequest,create_flow_logs_request +CreateFlowLogsResult,create_flow_logs_result +CreateFlowRequest,create_flow_request +CreateFlowResponse,create_flow_response +CreateFlowTemplateRequest,create_flow_template_request +CreateFlowTemplateResponse,create_flow_template_response +CreateFlywheelRequest,create_flywheel_request +CreateFlywheelResponse,create_flywheel_response +CreateFolderMembershipRequest,create_folder_membership_request +CreateFolderMembershipResponse,create_folder_membership_response +CreateFolderRequest,create_folder_request +CreateFolderResponse,create_folder_response +CreateForecastExportJobRequest,create_forecast_export_job_request +CreateForecastExportJobResponse,create_forecast_export_job_response +CreateForecastRequest,create_forecast_request +CreateForecastResponse,create_forecast_response +CreateFormData,create_form_data +CreateFormRequest,create_form_request +CreateFormResponse,create_form_response +CreateFpgaImageRequest,create_fpga_image_request +CreateFpgaImageResult,create_fpga_image_result +CreateFrameworkInput,create_framework_input +CreateFrameworkOutput,create_framework_output +CreateFreeTierConfig,create_free_tier_config +CreateFunctionDefinitionRequest,create_function_definition_request +CreateFunctionDefinitionResponse,create_function_definition_response +CreateFunctionDefinitionVersionRequest,create_function_definition_version_request +CreateFunctionDefinitionVersionResponse,create_function_definition_version_response +CreateFunctionRequest,create_function_request +CreateFunctionResponse,create_function_response +CreateFunctionResult,create_function_result +CreateFunctionUrlConfigRequest,create_function_url_config_request +CreateFunctionUrlConfigResponse,create_function_url_config_response +CreateFuotaTaskRequest,create_fuota_task_request +CreateFuotaTaskResponse,create_fuota_task_response +CreateGUISessionAccessDetailsRequest,create_gui_session_access_details_request +CreateGUISessionAccessDetailsResult,create_gui_session_access_details_result +CreateGameRequest,create_game_request +CreateGameResult,create_game_result +CreateGameServerGroupInput,create_game_server_group_input +CreateGameServerGroupOutput,create_game_server_group_output +CreateGameSessionInput,create_game_session_input +CreateGameSessionOutput,create_game_session_output +CreateGameSessionQueueInput,create_game_session_queue_input +CreateGameSessionQueueOutput,create_game_session_queue_output +CreateGateway420Exception,create_gateway420_exception +CreateGatewayGroupRequest,create_gateway_group_request +CreateGatewayGroupResponse,create_gateway_group_response +CreateGatewayInput,create_gateway_input +CreateGatewayOutput,create_gateway_output +CreateGatewayRequest,create_gateway_request +CreateGatewayResponse,create_gateway_response +CreateGatewayRouteInput,create_gateway_route_input +CreateGatewayRouteOutput,create_gateway_route_output +CreateGeoMatchSetRequest,create_geo_match_set_request +CreateGeoMatchSetResponse,create_geo_match_set_response +CreateGeofenceCollectionRequest,create_geofence_collection_request +CreateGeofenceCollectionResponse,create_geofence_collection_response +CreateGlobalClusterMessage,create_global_cluster_message +CreateGlobalClusterResult,create_global_cluster_result +CreateGlobalNetworkRequest,create_global_network_request +CreateGlobalNetworkResponse,create_global_network_response +CreateGlobalReplicationGroupMessage,create_global_replication_group_message +CreateGlobalReplicationGroupResult,create_global_replication_group_result +CreateGlobalSecondaryIndexAction,create_global_secondary_index_action +CreateGlobalTableInput,create_global_table_input +CreateGlobalTableOutput,create_global_table_output +CreateGovCloudAccountRequest,create_gov_cloud_account_request +CreateGovCloudAccountResponse,create_gov_cloud_account_response +CreateGrantRequest,create_grant_request +CreateGrantResponse,create_grant_response +CreateGrantVersionRequest,create_grant_version_request +CreateGrantVersionResponse,create_grant_version_response +CreateGraphRequest,create_graph_request +CreateGraphResponse,create_graph_response +CreateGraphqlApiRequest,create_graphql_api_request +CreateGraphqlApiResponse,create_graphql_api_response +CreateGrokClassifierRequest,create_grok_classifier_request +CreateGroupCertificateAuthorityRequest,create_group_certificate_authority_request +CreateGroupCertificateAuthorityResponse,create_group_certificate_authority_response +CreateGroupInput,create_group_input +CreateGroupMembershipRequest,create_group_membership_request +CreateGroupMembershipResponse,create_group_membership_response +CreateGroupOutput,create_group_output +CreateGroupRequest,create_group_request +CreateGroupResponse,create_group_response +CreateGroupResult,create_group_result +CreateGroupVersionRequest,create_group_version_request +CreateGroupVersionResponse,create_group_version_response +CreateHITRequest,create_hit_request +CreateHITResponse,create_hit_response +CreateHITTypeRequest,create_hit_type_request +CreateHITTypeResponse,create_hit_type_response +CreateHITWithHITTypeRequest,create_hit_with_hit_type_request +CreateHITWithHITTypeResponse,create_hit_with_hit_type_response +CreateHapgRequest,create_hapg_request +CreateHapgResponse,create_hapg_response +CreateHarvestJobRequest,create_harvest_job_request +CreateHarvestJobResponse,create_harvest_job_response +CreateHealthCheckRequest,create_health_check_request +CreateHealthCheckResponse,create_health_check_response +CreateHlsManifestConfiguration,create_hls_manifest_configuration +CreateHomeRegionControlRequest,create_home_region_control_request +CreateHomeRegionControlResult,create_home_region_control_result +CreateHostInput,create_host_input +CreateHostOutput,create_host_output +CreateHostedConfigurationVersionRequest,create_hosted_configuration_version_request +CreateHostedZoneRequest,create_hosted_zone_request +CreateHostedZoneResponse,create_hosted_zone_response +CreateHoursOfOperationRequest,create_hours_of_operation_request +CreateHoursOfOperationResponse,create_hours_of_operation_response +CreateHsmClientCertificateMessage,create_hsm_client_certificate_message +CreateHsmClientCertificateResult,create_hsm_client_certificate_result +CreateHsmConfigurationMessage,create_hsm_configuration_message +CreateHsmConfigurationResult,create_hsm_configuration_result +CreateHsmRequest,create_hsm_request +CreateHsmResponse,create_hsm_response +CreateHttpNamespaceRequest,create_http_namespace_request +CreateHttpNamespaceResponse,create_http_namespace_response +CreateHubRequest,create_hub_request +CreateHubResponse,create_hub_response +CreateHumanTaskUiRequest,create_human_task_ui_request +CreateHumanTaskUiResponse,create_human_task_ui_response +CreateHyperParameterTuningJobRequest,create_hyper_parameter_tuning_job_request +CreateHyperParameterTuningJobResponse,create_hyper_parameter_tuning_job_response +CreateIAMPolicyAssignmentRequest,create_iam_policy_assignment_request +CreateIAMPolicyAssignmentResponse,create_iam_policy_assignment_response +CreateIPSetRequest,create_ip_set_request +CreateIPSetResponse,create_ip_set_response +CreateIdentityPoolInput,create_identity_pool_input +CreateIdentityProviderRequest,create_identity_provider_request +CreateIdentityProviderResponse,create_identity_provider_response +CreateIdentitySourceInput,create_identity_source_input +CreateIdentitySourceOutput,create_identity_source_output +CreateImageBuilderRequest,create_image_builder_request +CreateImageBuilderResult,create_image_builder_result +CreateImageBuilderStreamingURLRequest,create_image_builder_streaming_url_request +CreateImageBuilderStreamingURLResult,create_image_builder_streaming_url_result +CreateImagePipelineRequest,create_image_pipeline_request +CreateImagePipelineResponse,create_image_pipeline_response +CreateImageRecipeRequest,create_image_recipe_request +CreateImageRecipeResponse,create_image_recipe_response +CreateImageRequest,create_image_request +CreateImageResponse,create_image_response +CreateImageResult,create_image_result +CreateImageVersionRequest,create_image_version_request +CreateImageVersionResponse,create_image_version_response +CreateImpersonationRoleRequest,create_impersonation_role_request +CreateImpersonationRoleResponse,create_impersonation_role_response +CreateImportJobRequest,create_import_job_request +CreateImportJobResponse,create_import_job_response +CreateInAppTemplateRequest,create_in_app_template_request +CreateInAppTemplateResponse,create_in_app_template_response +CreateIndex,create_index +CreateIndexInput,create_index_input +CreateIndexOutput,create_index_output +CreateIndexRequest,create_index_request +CreateIndexResponse,create_index_response +CreateInferenceExperimentRequest,create_inference_experiment_request +CreateInferenceExperimentResponse,create_inference_experiment_response +CreateInferenceRecommendationsJobRequest,create_inference_recommendations_job_request +CreateInferenceRecommendationsJobResponse,create_inference_recommendations_job_response +CreateInferenceSchedulerRequest,create_inference_scheduler_request +CreateInferenceSchedulerResponse,create_inference_scheduler_response +CreateInfrastructureConfigurationRequest,create_infrastructure_configuration_request +CreateInfrastructureConfigurationResponse,create_infrastructure_configuration_response +CreateIngestionDestinationRequest,create_ingestion_destination_request +CreateIngestionDestinationResponse,create_ingestion_destination_response +CreateIngestionRequest,create_ingestion_request +CreateIngestionResponse,create_ingestion_response +CreateInputRequest,create_input_request +CreateInputResponse,create_input_response +CreateInputSecurityGroupRequest,create_input_security_group_request +CreateInputSecurityGroupResponse,create_input_security_group_response +CreateInsightRequest,create_insight_request +CreateInsightResponse,create_insight_response +CreateInstanceAccessControlAttributeConfigurationRequest,create_instance_access_control_attribute_configuration_request +CreateInstanceConnectEndpointRequest,create_instance_connect_endpoint_request +CreateInstanceConnectEndpointResult,create_instance_connect_endpoint_result +CreateInstanceEventWindowRequest,create_instance_event_window_request +CreateInstanceEventWindowResult,create_instance_event_window_result +CreateInstanceExportTaskRequest,create_instance_export_task_request +CreateInstanceExportTaskResult,create_instance_export_task_result +CreateInstanceProfileMessage,create_instance_profile_message +CreateInstanceProfileRequest,create_instance_profile_request +CreateInstanceProfileResponse,create_instance_profile_response +CreateInstanceProfileResult,create_instance_profile_result +CreateInstanceRequest,create_instance_request +CreateInstanceResponse,create_instance_response +CreateInstanceResult,create_instance_result +CreateInstanceSnapshotRequest,create_instance_snapshot_request +CreateInstanceSnapshotResult,create_instance_snapshot_result +CreateInstancesFromSnapshotRequest,create_instances_from_snapshot_request +CreateInstancesFromSnapshotResult,create_instances_from_snapshot_result +CreateInstancesRequest,create_instances_request +CreateInstancesResult,create_instances_result +CreateInstantBooking,create_instant_booking +CreateIntegrationAssociationRequest,create_integration_association_request +CreateIntegrationAssociationResponse,create_integration_association_response +CreateIntegrationRequest,create_integration_request +CreateIntegrationResponseRequest,create_integration_response_request +CreateIntegrationResponseResponse,create_integration_response_response +CreateIntegrationResult,create_integration_result +CreateIntegrationWorkflowRequest,create_integration_workflow_request +CreateIntegrationWorkflowResponse,create_integration_workflow_response +CreateIntentRequest,create_intent_request +CreateIntentResponse,create_intent_response +CreateIntentVersionRequest,create_intent_version_request +CreateIntentVersionResponse,create_intent_version_response +CreateInterconnectRequest,create_interconnect_request +CreateInternetGatewayRequest,create_internet_gateway_request +CreateInternetGatewayResult,create_internet_gateway_result +CreateInvalidationRequest,create_invalidation_request +CreateInvalidationResult,create_invalidation_result +CreateInvitationsRequest,create_invitations_request +CreateInvitationsResponse,create_invitations_response +CreateIpAccessSettingsRequest,create_ip_access_settings_request +CreateIpAccessSettingsResponse,create_ip_access_settings_response +CreateIpGroupRequest,create_ip_group_request +CreateIpGroupResult,create_ip_group_result +CreateIpamPoolRequest,create_ipam_pool_request +CreateIpamPoolResult,create_ipam_pool_result +CreateIpamRequest,create_ipam_request +CreateIpamResourceDiscoveryRequest,create_ipam_resource_discovery_request +CreateIpamResourceDiscoveryResult,create_ipam_resource_discovery_result +CreateIpamResult,create_ipam_result +CreateIpamScopeRequest,create_ipam_scope_request +CreateIpamScopeResult,create_ipam_scope_result +CreateJobForDevicesRequest,create_job_for_devices_request +CreateJobForDevicesResponse,create_job_for_devices_response +CreateJobOutput,create_job_output +CreateJobPlaylist,create_job_playlist +CreateJobQueueRequest,create_job_queue_request +CreateJobQueueResponse,create_job_queue_response +CreateJobRequest,create_job_request +CreateJobResponse,create_job_response +CreateJobResult,create_job_result +CreateJobTemplateRequest,create_job_template_request +CreateJobTemplateResponse,create_job_template_response +CreateJourneyRequest,create_journey_request +CreateJourneyResponse,create_journey_response +CreateJsonClassifierRequest,create_json_classifier_request +CreateKeyGroupRequest,create_key_group_request +CreateKeyGroupResult,create_key_group_result +CreateKeyInput,create_key_input +CreateKeyOutput,create_key_output +CreateKeyPairRequest,create_key_pair_request +CreateKeyPairResult,create_key_pair_result +CreateKeyRequest,create_key_request +CreateKeyResponse,create_key_response +CreateKeySigningKeyRequest,create_key_signing_key_request +CreateKeySigningKeyResponse,create_key_signing_key_response +CreateKeysAndCertificateRequest,create_keys_and_certificate_request +CreateKeysAndCertificateResponse,create_keys_and_certificate_response +CreateKeyspaceRequest,create_keyspace_request +CreateKeyspaceResponse,create_keyspace_response +CreateKnowledgeBaseRequest,create_knowledge_base_request +CreateKnowledgeBaseResponse,create_knowledge_base_response +CreateKxChangesetRequest,create_kx_changeset_request +CreateKxChangesetResponse,create_kx_changeset_response +CreateKxClusterRequest,create_kx_cluster_request +CreateKxClusterResponse,create_kx_cluster_response +CreateKxDatabaseRequest,create_kx_database_request +CreateKxDatabaseResponse,create_kx_database_response +CreateKxEnvironmentRequest,create_kx_environment_request +CreateKxEnvironmentResponse,create_kx_environment_response +CreateKxUserRequest,create_kx_user_request +CreateKxUserResponse,create_kx_user_response +CreateLBCookieStickinessPolicyInput,create_lb_cookie_stickiness_policy_input +CreateLFTagRequest,create_lf_tag_request +CreateLabelGroupRequest,create_label_group_request +CreateLabelGroupResponse,create_label_group_response +CreateLabelRequest,create_label_request +CreateLabelResponse,create_label_response +CreateLabelingJobRequest,create_labeling_job_request +CreateLabelingJobResponse,create_labeling_job_response +CreateLabelsRequest,create_labels_request +CreateLagRequest,create_lag_request +CreateLakeFormationOptInRequest,create_lake_formation_opt_in_request +CreateLanguageModelRequest,create_language_model_request +CreateLanguageModelResponse,create_language_model_response +CreateLaunchConfigurationTemplateRequest,create_launch_configuration_template_request +CreateLaunchConfigurationTemplateResponse,create_launch_configuration_template_response +CreateLaunchConfigurationType,create_launch_configuration_type +CreateLaunchProfileRequest,create_launch_profile_request +CreateLaunchProfileResponse,create_launch_profile_response +CreateLaunchRequest,create_launch_request +CreateLaunchResponse,create_launch_response +CreateLaunchTemplateRequest,create_launch_template_request +CreateLaunchTemplateResult,create_launch_template_result +CreateLaunchTemplateVersionRequest,create_launch_template_version_request +CreateLaunchTemplateVersionResult,create_launch_template_version_result +CreateLayerRequest,create_layer_request +CreateLayerResult,create_layer_result +CreateLayoutRequest,create_layout_request +CreateLayoutResponse,create_layout_response +CreateLedgerRequest,create_ledger_request +CreateLedgerResponse,create_ledger_response +CreateLegalHoldInput,create_legal_hold_input +CreateLegalHoldOutput,create_legal_hold_output +CreateLensShareInput,create_lens_share_input +CreateLensShareOutput,create_lens_share_output +CreateLensVersionInput,create_lens_version_input +CreateLensVersionOutput,create_lens_version_output +CreateLicenseConfigurationRequest,create_license_configuration_request +CreateLicenseConfigurationResponse,create_license_configuration_response +CreateLicenseConversionTaskForResourceRequest,create_license_conversion_task_for_resource_request +CreateLicenseConversionTaskForResourceResponse,create_license_conversion_task_for_resource_response +CreateLicenseManagerReportGeneratorRequest,create_license_manager_report_generator_request +CreateLicenseManagerReportGeneratorResponse,create_license_manager_report_generator_response +CreateLicenseRequest,create_license_request +CreateLicenseResponse,create_license_response +CreateLicenseVersionRequest,create_license_version_request +CreateLicenseVersionResponse,create_license_version_response +CreateLifecyclePolicyRequest,create_lifecycle_policy_request +CreateLifecyclePolicyResponse,create_lifecycle_policy_response +CreateLinkInput,create_link_input +CreateLinkOutput,create_link_output +CreateLinkRequest,create_link_request +CreateLinkResponse,create_link_response +CreateListRequest,create_list_request +CreateListenerInput,create_listener_input +CreateListenerOutput,create_listener_output +CreateListenerRequest,create_listener_request +CreateListenerResponse,create_listener_response +CreateLiveSourceRequest,create_live_source_request +CreateLiveSourceResponse,create_live_source_response +CreateLoadBalancerInput,create_load_balancer_input +CreateLoadBalancerListenerInput,create_load_balancer_listener_input +CreateLoadBalancerOutput,create_load_balancer_output +CreateLoadBalancerPolicyInput,create_load_balancer_policy_input +CreateLoadBalancerRequest,create_load_balancer_request +CreateLoadBalancerResult,create_load_balancer_result +CreateLoadBalancerTlsCertificateRequest,create_load_balancer_tls_certificate_request +CreateLoadBalancerTlsCertificateResult,create_load_balancer_tls_certificate_result +CreateLocalGatewayRouteRequest,create_local_gateway_route_request +CreateLocalGatewayRouteResult,create_local_gateway_route_result +CreateLocalGatewayRouteTableRequest,create_local_gateway_route_table_request +CreateLocalGatewayRouteTableResult,create_local_gateway_route_table_result +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest,create_local_gateway_route_table_virtual_interface_group_association_request +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult,create_local_gateway_route_table_virtual_interface_group_association_result +CreateLocalGatewayRouteTableVpcAssociationRequest,create_local_gateway_route_table_vpc_association_request +CreateLocalGatewayRouteTableVpcAssociationResult,create_local_gateway_route_table_vpc_association_result +CreateLocationAzureBlobRequest,create_location_azure_blob_request +CreateLocationAzureBlobResponse,create_location_azure_blob_response +CreateLocationEfsRequest,create_location_efs_request +CreateLocationEfsResponse,create_location_efs_response +CreateLocationFsxLustreRequest,create_location_fsx_lustre_request +CreateLocationFsxLustreResponse,create_location_fsx_lustre_response +CreateLocationFsxOntapRequest,create_location_fsx_ontap_request +CreateLocationFsxOntapResponse,create_location_fsx_ontap_response +CreateLocationFsxOpenZfsRequest,create_location_fsx_open_zfs_request +CreateLocationFsxOpenZfsResponse,create_location_fsx_open_zfs_response +CreateLocationFsxWindowsRequest,create_location_fsx_windows_request +CreateLocationFsxWindowsResponse,create_location_fsx_windows_response +CreateLocationHdfsRequest,create_location_hdfs_request +CreateLocationHdfsResponse,create_location_hdfs_response +CreateLocationInput,create_location_input +CreateLocationNfsRequest,create_location_nfs_request +CreateLocationNfsResponse,create_location_nfs_response +CreateLocationObjectStorageRequest,create_location_object_storage_request +CreateLocationObjectStorageResponse,create_location_object_storage_response +CreateLocationOutput,create_location_output +CreateLocationS3Request,create_location_s3_request +CreateLocationS3Response,create_location_s3_response +CreateLocationSmbRequest,create_location_smb_request +CreateLocationSmbResponse,create_location_smb_response +CreateLogGroupRequest,create_log_group_request +CreateLogPatternRequest,create_log_pattern_request +CreateLogPatternResponse,create_log_pattern_response +CreateLogStreamRequest,create_log_stream_request +CreateLogSubscriptionRequest,create_log_subscription_request +CreateLoggerDefinitionRequest,create_logger_definition_request +CreateLoggerDefinitionResponse,create_logger_definition_response +CreateLoggerDefinitionVersionRequest,create_logger_definition_version_request +CreateLoggerDefinitionVersionResponse,create_logger_definition_version_response +CreateLoggingConfigurationRequest,create_logging_configuration_request +CreateLoggingConfigurationResponse,create_logging_configuration_response +CreateLogicallyAirGappedBackupVaultInput,create_logically_air_gapped_backup_vault_input +CreateLogicallyAirGappedBackupVaultOutput,create_logically_air_gapped_backup_vault_output +CreateLoginProfileRequest,create_login_profile_request +CreateLoginProfileResponse,create_login_profile_response +CreateLongTermPricingRequest,create_long_term_pricing_request +CreateLongTermPricingResult,create_long_term_pricing_result +CreateLowLatencyHlsManifestConfiguration,create_low_latency_hls_manifest_configuration +CreateLunaClientRequest,create_luna_client_request +CreateLunaClientResponse,create_luna_client_response +CreateMLEndpointInput,create_ml_endpoint_input +CreateMLEndpointOutput,create_ml_endpoint_output +CreateMLModelInput,create_ml_model_input +CreateMLModelOutput,create_ml_model_output +CreateMLTransformRequest,create_ml_transform_request +CreateMLTransformResponse,create_ml_transform_response +CreateMaintenanceWindowRequest,create_maintenance_window_request +CreateMaintenanceWindowResult,create_maintenance_window_result +CreateManagedEndpointRequest,create_managed_endpoint_request +CreateManagedEndpointResponse,create_managed_endpoint_response +CreateManagedPrefixListRequest,create_managed_prefix_list_request +CreateManagedPrefixListResult,create_managed_prefix_list_result +CreateMapRequest,create_map_request +CreateMapResponse,create_map_response +CreateMatchingWorkflowInput,create_matching_workflow_input +CreateMatchingWorkflowOutput,create_matching_workflow_output +CreateMatchmakingConfigurationInput,create_matchmaking_configuration_input +CreateMatchmakingConfigurationOutput,create_matchmaking_configuration_output +CreateMatchmakingRuleSetInput,create_matchmaking_rule_set_input +CreateMatchmakingRuleSetOutput,create_matchmaking_rule_set_output +CreateMediaCapturePipelineRequest,create_media_capture_pipeline_request +CreateMediaCapturePipelineResponse,create_media_capture_pipeline_response +CreateMediaConcatenationPipelineRequest,create_media_concatenation_pipeline_request +CreateMediaConcatenationPipelineResponse,create_media_concatenation_pipeline_response +CreateMediaInsightsPipelineConfigurationRequest,create_media_insights_pipeline_configuration_request +CreateMediaInsightsPipelineConfigurationResponse,create_media_insights_pipeline_configuration_response +CreateMediaInsightsPipelineRequest,create_media_insights_pipeline_request +CreateMediaInsightsPipelineResponse,create_media_insights_pipeline_response +CreateMediaLiveConnectorPipelineRequest,create_media_live_connector_pipeline_request +CreateMediaLiveConnectorPipelineResponse,create_media_live_connector_pipeline_response +CreateMediaPipelineKinesisVideoStreamPoolRequest,create_media_pipeline_kinesis_video_stream_pool_request +CreateMediaPipelineKinesisVideoStreamPoolResponse,create_media_pipeline_kinesis_video_stream_pool_response +CreateMediaStreamPipelineRequest,create_media_stream_pipeline_request +CreateMediaStreamPipelineResponse,create_media_stream_pipeline_response +CreateMedicalVocabularyRequest,create_medical_vocabulary_request +CreateMedicalVocabularyResponse,create_medical_vocabulary_response +CreateMeetingDialOutRequest,create_meeting_dial_out_request +CreateMeetingDialOutResponse,create_meeting_dial_out_response +CreateMeetingRequest,create_meeting_request +CreateMeetingResponse,create_meeting_response +CreateMeetingRoomConfiguration,create_meeting_room_configuration +CreateMeetingWithAttendeesRequest,create_meeting_with_attendees_request +CreateMeetingWithAttendeesResponse,create_meeting_with_attendees_response +CreateMemberInput,create_member_input +CreateMemberOutput,create_member_output +CreateMemberRequest,create_member_request +CreateMemberResponse,create_member_response +CreateMembersRequest,create_members_request +CreateMembersResponse,create_members_response +CreateMembershipInput,create_membership_input +CreateMembershipOutput,create_membership_output +CreateMeshInput,create_mesh_input +CreateMeshOutput,create_mesh_output +CreateMetricAttributionRequest,create_metric_attribution_request +CreateMetricAttributionResponse,create_metric_attribution_response +CreateMetricSetRequest,create_metric_set_request +CreateMetricSetResponse,create_metric_set_response +CreateMicrosoftADRequest,create_microsoft_ad_request +CreateMicrosoftADResult,create_microsoft_ad_result +CreateMigrationProjectMessage,create_migration_project_message +CreateMigrationProjectResponse,create_migration_project_response +CreateMigrationWorkflowRequest,create_migration_workflow_request +CreateMigrationWorkflowResponse,create_migration_workflow_response +CreateMilestoneInput,create_milestone_input +CreateMilestoneOutput,create_milestone_output +CreateMissionProfileRequest,create_mission_profile_request +CreateMitigationActionRequest,create_mitigation_action_request +CreateMitigationActionResponse,create_mitigation_action_response +CreateMobileDeviceAccessRuleRequest,create_mobile_device_access_rule_request +CreateMobileDeviceAccessRuleResponse,create_mobile_device_access_rule_response +CreateModelBiasJobDefinitionRequest,create_model_bias_job_definition_request +CreateModelBiasJobDefinitionResponse,create_model_bias_job_definition_response +CreateModelCardExportJobRequest,create_model_card_export_job_request +CreateModelCardExportJobResponse,create_model_card_export_job_response +CreateModelCardRequest,create_model_card_request +CreateModelCardResponse,create_model_card_response +CreateModelCustomizationJobRequest,create_model_customization_job_request +CreateModelCustomizationJobResponse,create_model_customization_job_response +CreateModelExplainabilityJobDefinitionRequest,create_model_explainability_job_definition_request +CreateModelExplainabilityJobDefinitionResponse,create_model_explainability_job_definition_response +CreateModelInput,create_model_input +CreateModelManifestRequest,create_model_manifest_request +CreateModelManifestResponse,create_model_manifest_response +CreateModelOutput,create_model_output +CreateModelPackageGroupInput,create_model_package_group_input +CreateModelPackageGroupOutput,create_model_package_group_output +CreateModelPackageInput,create_model_package_input +CreateModelPackageOutput,create_model_package_output +CreateModelQualityJobDefinitionRequest,create_model_quality_job_definition_request +CreateModelQualityJobDefinitionResponse,create_model_quality_job_definition_response +CreateModelRequest,create_model_request +CreateModelResponse,create_model_response +CreateModelVersionRequest,create_model_version_request +CreateModelVersionResult,create_model_version_result +CreateMonitorInput,create_monitor_input +CreateMonitorOutput,create_monitor_output +CreateMonitorRequest,create_monitor_request +CreateMonitorResponse,create_monitor_response +CreateMonitoringScheduleRequest,create_monitoring_schedule_request +CreateMonitoringScheduleResponse,create_monitoring_schedule_response +CreateMonitoringSubscriptionRequest,create_monitoring_subscription_request +CreateMonitoringSubscriptionResult,create_monitoring_subscription_result +CreateMountTargetRequest,create_mount_target_request +CreateMultiRegionAccessPointInput,create_multi_region_access_point_input +CreateMultiRegionAccessPointRequest,create_multi_region_access_point_request +CreateMultiRegionAccessPointResult,create_multi_region_access_point_result +CreateMulticastGroupRequest,create_multicast_group_request +CreateMulticastGroupResponse,create_multicast_group_response +CreateMultipartReadSetUploadRequest,create_multipart_read_set_upload_request +CreateMultipartReadSetUploadResponse,create_multipart_read_set_upload_response +CreateMultipartUploadOutput,create_multipart_upload_output +CreateMultipartUploadRequest,create_multipart_upload_request +CreateMultiplexProgramRequest,create_multiplex_program_request +CreateMultiplexProgramResponse,create_multiplex_program_response +CreateMultiplexRequest,create_multiplex_request +CreateMultiplexResponse,create_multiplex_response +CreateNFSFileShareInput,create_nfs_file_share_input +CreateNFSFileShareOutput,create_nfs_file_share_output +CreateNamedQueryInput,create_named_query_input +CreateNamedQueryOutput,create_named_query_output +CreateNamespaceRequest,create_namespace_request +CreateNamespaceResponse,create_namespace_response +CreateNatGatewayRequest,create_nat_gateway_request +CreateNatGatewayResult,create_nat_gateway_result +CreateNativeDeltaTable,create_native_delta_table +CreateNetworkAclEntryRequest,create_network_acl_entry_request +CreateNetworkAclRequest,create_network_acl_request +CreateNetworkAclResult,create_network_acl_result +CreateNetworkAnalyzerConfigurationRequest,create_network_analyzer_configuration_request +CreateNetworkAnalyzerConfigurationResponse,create_network_analyzer_configuration_response +CreateNetworkInput,create_network_input +CreateNetworkInsightsAccessScopeRequest,create_network_insights_access_scope_request +CreateNetworkInsightsAccessScopeResult,create_network_insights_access_scope_result +CreateNetworkInsightsPathRequest,create_network_insights_path_request +CreateNetworkInsightsPathResult,create_network_insights_path_result +CreateNetworkInterfacePermissionRequest,create_network_interface_permission_request +CreateNetworkInterfacePermissionResult,create_network_interface_permission_result +CreateNetworkInterfaceRequest,create_network_interface_request +CreateNetworkInterfaceResult,create_network_interface_result +CreateNetworkOutput,create_network_output +CreateNetworkProfileRequest,create_network_profile_request +CreateNetworkProfileResponse,create_network_profile_response +CreateNetworkProfileResult,create_network_profile_result +CreateNetworkRequest,create_network_request +CreateNetworkResponse,create_network_response +CreateNetworkSettingsRequest,create_network_settings_request +CreateNetworkSettingsResponse,create_network_settings_response +CreateNetworkSiteRequest,create_network_site_request +CreateNetworkSiteResponse,create_network_site_response +CreateNewVersion,create_new_version +CreateNodeFromTemplateJobRequest,create_node_from_template_job_request +CreateNodeFromTemplateJobResponse,create_node_from_template_job_response +CreateNodeInput,create_node_input +CreateNodeOutput,create_node_output +CreateNodegroupRequest,create_nodegroup_request +CreateNodegroupResponse,create_nodegroup_response +CreateNotebookInput,create_notebook_input +CreateNotebookInstanceInput,create_notebook_instance_input +CreateNotebookInstanceLifecycleConfigInput,create_notebook_instance_lifecycle_config_input +CreateNotebookInstanceLifecycleConfigOutput,create_notebook_instance_lifecycle_config_output +CreateNotebookInstanceOutput,create_notebook_instance_output +CreateNotebookOutput,create_notebook_output +CreateNotificationRequest,create_notification_request +CreateNotificationRuleRequest,create_notification_rule_request +CreateNotificationRuleResult,create_notification_rule_result +CreateNotificationSubscriptionRequest,create_notification_subscription_request +CreateNotificationSubscriptionResponse,create_notification_subscription_response +CreateOTAUpdateRequest,create_ota_update_request +CreateOTAUpdateResponse,create_ota_update_response +CreateObject,create_object +CreateObjectRequest,create_object_request +CreateObjectResponse,create_object_response +CreateObservabilityConfigurationRequest,create_observability_configuration_request +CreateObservabilityConfigurationResponse,create_observability_configuration_response +CreateOntapVolumeConfiguration,create_ontap_volume_configuration +CreateOpenIDConnectProviderRequest,create_open_id_connect_provider_request +CreateOpenIDConnectProviderResponse,create_open_id_connect_provider_response +CreateOpenZFSOriginSnapshotConfiguration,create_open_zfs_origin_snapshot_configuration +CreateOpenZFSVolumeConfiguration,create_open_zfs_volume_configuration +CreateOpsItemRequest,create_ops_item_request +CreateOpsItemResponse,create_ops_item_response +CreateOpsMetadataRequest,create_ops_metadata_request +CreateOpsMetadataResult,create_ops_metadata_result +CreateOptOutListRequest,create_opt_out_list_request +CreateOptOutListResult,create_opt_out_list_result +CreateOptionGroupMessage,create_option_group_message +CreateOptionGroupResult,create_option_group_result +CreateOrUpdateTagsType,create_or_update_tags_type +CreateOrderInput,create_order_input +CreateOrderOutput,create_order_output +CreateOrganizationRequest,create_organization_request +CreateOrganizationResponse,create_organization_response +CreateOrganizationalUnitRequest,create_organizational_unit_request +CreateOrganizationalUnitResponse,create_organizational_unit_response +CreateOriginAccessControlRequest,create_origin_access_control_request +CreateOriginAccessControlResult,create_origin_access_control_result +CreateOriginEndpointRequest,create_origin_endpoint_request +CreateOriginEndpointResponse,create_origin_endpoint_response +CreateOriginRequestPolicyRequest,create_origin_request_policy_request +CreateOriginRequestPolicyResult,create_origin_request_policy_result +CreateOutboundConnectionRequest,create_outbound_connection_request +CreateOutboundConnectionResponse,create_outbound_connection_response +CreateOutboundCrossClusterSearchConnectionRequest,create_outbound_cross_cluster_search_connection_request +CreateOutboundCrossClusterSearchConnectionResponse,create_outbound_cross_cluster_search_connection_response +CreateOutpostInput,create_outpost_input +CreateOutpostOutput,create_outpost_output +CreateOutpostResolverRequest,create_outpost_resolver_request +CreateOutpostResolverResponse,create_outpost_resolver_response +CreatePackageImportJobRequest,create_package_import_job_request +CreatePackageImportJobResponse,create_package_import_job_response +CreatePackageRequest,create_package_request +CreatePackageResponse,create_package_response +CreatePackageVersionRequest,create_package_version_request +CreatePackageVersionResponse,create_package_version_response +CreatePackagingConfigurationRequest,create_packaging_configuration_request +CreatePackagingConfigurationResponse,create_packaging_configuration_response +CreatePackagingGroupRequest,create_packaging_group_request +CreatePackagingGroupResponse,create_packaging_group_response +CreateParallelDataRequest,create_parallel_data_request +CreateParallelDataResponse,create_parallel_data_response +CreateParameterGroupRequest,create_parameter_group_request +CreateParameterGroupResponse,create_parameter_group_response +CreateParticipantConnectionRequest,create_participant_connection_request +CreateParticipantConnectionResponse,create_participant_connection_response +CreateParticipantRequest,create_participant_request +CreateParticipantResponse,create_participant_response +CreateParticipantTokenRequest,create_participant_token_request +CreateParticipantTokenResponse,create_participant_token_response +CreatePartitionIndexRequest,create_partition_index_request +CreatePartitionRequest,create_partition_request +CreatePartnerEventSourceRequest,create_partner_event_source_request +CreatePartnerEventSourceResponse,create_partner_event_source_response +CreatePartnerInputRequest,create_partner_input_request +CreatePartnerInputResponse,create_partner_input_response +CreatePatchBaselineRequest,create_patch_baseline_request +CreatePatchBaselineResult,create_patch_baseline_result +CreatePerformanceAnalysisReportRequest,create_performance_analysis_report_request +CreatePerformanceAnalysisReportResponse,create_performance_analysis_report_response +CreatePermissionGroupRequest,create_permission_group_request +CreatePermissionGroupResponse,create_permission_group_response +CreatePermissionRequest,create_permission_request +CreatePermissionResponse,create_permission_response +CreatePermissionSetRequest,create_permission_set_request +CreatePermissionSetResponse,create_permission_set_response +CreatePermissionVersionRequest,create_permission_version_request +CreatePermissionVersionResponse,create_permission_version_response +CreatePhoneNumberOrderRequest,create_phone_number_order_request +CreatePhoneNumberOrderResponse,create_phone_number_order_response +CreatePipeRequest,create_pipe_request +CreatePipeResponse,create_pipe_response +CreatePipelineInput,create_pipeline_input +CreatePipelineOutput,create_pipeline_output +CreatePipelineRequest,create_pipeline_request +CreatePipelineResponse,create_pipeline_response +CreatePlaceIndexRequest,create_place_index_request +CreatePlaceIndexResponse,create_place_index_response +CreatePlacementGroupRequest,create_placement_group_request +CreatePlacementGroupResult,create_placement_group_result +CreatePlacementRequest,create_placement_request +CreatePlatformApplicationInput,create_platform_application_input +CreatePlatformApplicationResponse,create_platform_application_response +CreatePlatformEndpointInput,create_platform_endpoint_input +CreatePlatformVersionRequest,create_platform_version_request +CreatePlatformVersionResult,create_platform_version_result +CreatePlayerSessionInput,create_player_session_input +CreatePlayerSessionOutput,create_player_session_output +CreatePlayerSessionsInput,create_player_sessions_input +CreatePlayerSessionsOutput,create_player_sessions_output +CreatePolicyInput,create_policy_input +CreatePolicyOutput,create_policy_output +CreatePolicyRequest,create_policy_request +CreatePolicyResponse,create_policy_response +CreatePolicyStoreInput,create_policy_store_input +CreatePolicyStoreOutput,create_policy_store_output +CreatePolicyTemplateInput,create_policy_template_input +CreatePolicyTemplateOutput,create_policy_template_output +CreatePolicyVersionRequest,create_policy_version_request +CreatePolicyVersionResponse,create_policy_version_response +CreatePoolRequest,create_pool_request +CreatePoolResult,create_pool_result +CreatePortalRequest,create_portal_request +CreatePortalResponse,create_portal_response +CreatePortfolioInput,create_portfolio_input +CreatePortfolioOutput,create_portfolio_output +CreatePortfolioShareInput,create_portfolio_share_input +CreatePortfolioShareOutput,create_portfolio_share_output +CreatePredictorBacktestExportJobRequest,create_predictor_backtest_export_job_request +CreatePredictorBacktestExportJobResponse,create_predictor_backtest_export_job_response +CreatePredictorRequest,create_predictor_request +CreatePredictorResponse,create_predictor_response +CreatePrefetchScheduleRequest,create_prefetch_schedule_request +CreatePrefetchScheduleResponse,create_prefetch_schedule_response +CreatePreparedStatementInput,create_prepared_statement_input +CreatePresetRequest,create_preset_request +CreatePresetResponse,create_preset_response +CreatePresignedDomainUrlRequest,create_presigned_domain_url_request +CreatePresignedDomainUrlResponse,create_presigned_domain_url_response +CreatePresignedNotebookInstanceUrlInput,create_presigned_notebook_instance_url_input +CreatePresignedNotebookInstanceUrlOutput,create_presigned_notebook_instance_url_output +CreatePresignedNotebookUrlRequest,create_presigned_notebook_url_request +CreatePresignedNotebookUrlResponse,create_presigned_notebook_url_response +CreatePricingPlanInput,create_pricing_plan_input +CreatePricingPlanOutput,create_pricing_plan_output +CreatePricingRuleInput,create_pricing_rule_input +CreatePricingRuleOutput,create_pricing_rule_output +CreatePrivateDnsNamespaceRequest,create_private_dns_namespace_request +CreatePrivateDnsNamespaceResponse,create_private_dns_namespace_response +CreatePrivateVirtualInterfaceRequest,create_private_virtual_interface_request +CreateProactiveJoin,create_proactive_join +CreateProcessingJobRequest,create_processing_job_request +CreateProcessingJobResponse,create_processing_job_response +CreateProductInput,create_product_input +CreateProductOutput,create_product_output +CreateProfileInput,create_profile_input +CreateProfileJobRequest,create_profile_job_request +CreateProfileJobResponse,create_profile_job_response +CreateProfileOutput,create_profile_output +CreateProfileRequest,create_profile_request +CreateProfileResponse,create_profile_response +CreateProfileShareInput,create_profile_share_input +CreateProfileShareOutput,create_profile_share_output +CreateProfilingGroupRequest,create_profiling_group_request +CreateProfilingGroupResponse,create_profiling_group_response +CreateProgramRequest,create_program_request +CreateProgramResponse,create_program_response +CreateProgressUpdateStreamRequest,create_progress_update_stream_request +CreateProjectInput,create_project_input +CreateProjectOutput,create_project_output +CreateProjectRequest,create_project_request +CreateProjectResponse,create_project_response +CreateProjectResult,create_project_result +CreateProjectVersionRequest,create_project_version_request +CreateProjectVersionResponse,create_project_version_response +CreatePromptRequest,create_prompt_request +CreatePromptResponse,create_prompt_response +CreateProposalInput,create_proposal_input +CreateProposalOutput,create_proposal_output +CreateProtectionGroupRequest,create_protection_group_request +CreateProtectionRequest,create_protection_request +CreateProtectionResponse,create_protection_response +CreateProvisionedModelThroughputRequest,create_provisioned_model_throughput_request +CreateProvisionedModelThroughputResponse,create_provisioned_model_throughput_response +CreateProvisionedProductPlanInput,create_provisioned_product_plan_input +CreateProvisionedProductPlanOutput,create_provisioned_product_plan_output +CreateProvisioningArtifactInput,create_provisioning_artifact_input +CreateProvisioningArtifactOutput,create_provisioning_artifact_output +CreateProvisioningClaimRequest,create_provisioning_claim_request +CreateProvisioningClaimResponse,create_provisioning_claim_response +CreateProvisioningTemplateRequest,create_provisioning_template_request +CreateProvisioningTemplateResponse,create_provisioning_template_response +CreateProvisioningTemplateVersionRequest,create_provisioning_template_version_request +CreateProvisioningTemplateVersionResponse,create_provisioning_template_version_response +CreateProxySessionRequest,create_proxy_session_request +CreateProxySessionResponse,create_proxy_session_response +CreatePublicDnsNamespaceRequest,create_public_dns_namespace_request +CreatePublicDnsNamespaceResponse,create_public_dns_namespace_response +CreatePublicIpv4PoolRequest,create_public_ipv4_pool_request +CreatePublicIpv4PoolResult,create_public_ipv4_pool_result +CreatePublicKeyRequest,create_public_key_request +CreatePublicKeyResult,create_public_key_result +CreatePublicVirtualInterfaceRequest,create_public_virtual_interface_request +CreatePublishingDestinationRequest,create_publishing_destination_request +CreatePublishingDestinationResponse,create_publishing_destination_response +CreatePullRequestApprovalRuleInput,create_pull_request_approval_rule_input +CreatePullRequestApprovalRuleOutput,create_pull_request_approval_rule_output +CreatePullRequestInput,create_pull_request_input +CreatePullRequestOutput,create_pull_request_output +CreatePullThroughCacheRuleRequest,create_pull_through_cache_rule_request +CreatePullThroughCacheRuleResponse,create_pull_through_cache_rule_response +CreatePushTemplateRequest,create_push_template_request +CreatePushTemplateResponse,create_push_template_response +CreateQualificationTypeRequest,create_qualification_type_request +CreateQualificationTypeResponse,create_qualification_type_response +CreateQuantumTaskRequest,create_quantum_task_request +CreateQuantumTaskResponse,create_quantum_task_response +CreateQueryLoggingConfigRequest,create_query_logging_config_request +CreateQueryLoggingConfigResponse,create_query_logging_config_response +CreateQuerySuggestionsBlockListRequest,create_query_suggestions_block_list_request +CreateQuerySuggestionsBlockListResponse,create_query_suggestions_block_list_response +CreateQueueRequest,create_queue_request +CreateQueueResponse,create_queue_response +CreateQueueResult,create_queue_result +CreateQuickConnectRequest,create_quick_connect_request +CreateQuickConnectResponse,create_quick_connect_response +CreateRateBasedRuleRequest,create_rate_based_rule_request +CreateRateBasedRuleResponse,create_rate_based_rule_response +CreateReadinessCheckRequest,create_readiness_check_request +CreateReadinessCheckResponse,create_readiness_check_response +CreateRealtimeEndpointInput,create_realtime_endpoint_input +CreateRealtimeEndpointOutput,create_realtime_endpoint_output +CreateRealtimeLogConfigRequest,create_realtime_log_config_request +CreateRealtimeLogConfigResult,create_realtime_log_config_result +CreateReceiptFilterRequest,create_receipt_filter_request +CreateReceiptRuleRequest,create_receipt_rule_request +CreateReceiptRuleSetRequest,create_receipt_rule_set_request +CreateRecipeJobRequest,create_recipe_job_request +CreateRecipeJobResponse,create_recipe_job_response +CreateRecipeRequest,create_recipe_request +CreateRecipeResponse,create_recipe_response +CreateRecommendationTemplateRequest,create_recommendation_template_request +CreateRecommendationTemplateResponse,create_recommendation_template_response +CreateRecommenderConfiguration,create_recommender_configuration +CreateRecommenderConfigurationRequest,create_recommender_configuration_request +CreateRecommenderConfigurationResponse,create_recommender_configuration_response +CreateRecommenderConfigurationShape,create_recommender_configuration_shape +CreateRecommenderRequest,create_recommender_request +CreateRecommenderResponse,create_recommender_response +CreateRecordingConfigurationRequest,create_recording_configuration_request +CreateRecordingConfigurationResponse,create_recording_configuration_response +CreateRecoveryGroupRequest,create_recovery_group_request +CreateRecoveryGroupResponse,create_recovery_group_response +CreateReferenceStoreRequest,create_reference_store_request +CreateReferenceStoreResponse,create_reference_store_response +CreateRefreshScheduleRequest,create_refresh_schedule_request +CreateRefreshScheduleResponse,create_refresh_schedule_response +CreateRegexMatchSetRequest,create_regex_match_set_request +CreateRegexMatchSetResponse,create_regex_match_set_response +CreateRegexPatternSetRequest,create_regex_pattern_set_request +CreateRegexPatternSetResponse,create_regex_pattern_set_response +CreateRegistryInput,create_registry_input +CreateRegistryRequest,create_registry_request +CreateRegistryResponse,create_registry_response +CreateRelatedItemRequest,create_related_item_request +CreateRelatedItemResponse,create_related_item_response +CreateRelationalDatabaseFromSnapshotRequest,create_relational_database_from_snapshot_request +CreateRelationalDatabaseFromSnapshotResult,create_relational_database_from_snapshot_result +CreateRelationalDatabaseRequest,create_relational_database_request +CreateRelationalDatabaseResult,create_relational_database_result +CreateRelationalDatabaseSnapshotRequest,create_relational_database_snapshot_request +CreateRelationalDatabaseSnapshotResult,create_relational_database_snapshot_result +CreateRemoteAccessSessionConfiguration,create_remote_access_session_configuration +CreateRemoteAccessSessionRequest,create_remote_access_session_request +CreateRemoteAccessSessionResult,create_remote_access_session_result +CreateReplaceRootVolumeTaskRequest,create_replace_root_volume_task_request +CreateReplaceRootVolumeTaskResult,create_replace_root_volume_task_result +CreateReplicaAction,create_replica_action +CreateReplicationConfigMessage,create_replication_config_message +CreateReplicationConfigResponse,create_replication_config_response +CreateReplicationConfigurationRequest,create_replication_configuration_request +CreateReplicationConfigurationTemplateRequest,create_replication_configuration_template_request +CreateReplicationGroupMemberAction,create_replication_group_member_action +CreateReplicationGroupMessage,create_replication_group_message +CreateReplicationGroupResult,create_replication_group_result +CreateReplicationInstanceMessage,create_replication_instance_message +CreateReplicationInstanceResponse,create_replication_instance_response +CreateReplicationJobRequest,create_replication_job_request +CreateReplicationJobResponse,create_replication_job_response +CreateReplicationSetInput,create_replication_set_input +CreateReplicationSetOutput,create_replication_set_output +CreateReplicationSubnetGroupMessage,create_replication_subnet_group_message +CreateReplicationSubnetGroupResponse,create_replication_subnet_group_response +CreateReplicationTaskMessage,create_replication_task_message +CreateReplicationTaskResponse,create_replication_task_response +CreateReportGroupInput,create_report_group_input +CreateReportGroupOutput,create_report_group_output +CreateReportPlanInput,create_report_plan_input +CreateReportPlanOutput,create_report_plan_output +CreateRepositoryInput,create_repository_input +CreateRepositoryOutput,create_repository_output +CreateRepositoryRequest,create_repository_request +CreateRepositoryResponse,create_repository_response +CreateRepositoryResult,create_repository_result +CreateRequestValidatorRequest,create_request_validator_request +CreateRequireCheckIn,create_require_check_in +CreateRescoreExecutionPlanRequest,create_rescore_execution_plan_request +CreateRescoreExecutionPlanResponse,create_rescore_execution_plan_response +CreateReservedInstancesListingRequest,create_reserved_instances_listing_request +CreateReservedInstancesListingResult,create_reserved_instances_listing_result +CreateResiliencyPolicyRequest,create_resiliency_policy_request +CreateResiliencyPolicyResponse,create_resiliency_policy_response +CreateResolverEndpointRequest,create_resolver_endpoint_request +CreateResolverEndpointResponse,create_resolver_endpoint_response +CreateResolverQueryLogConfigRequest,create_resolver_query_log_config_request +CreateResolverQueryLogConfigResponse,create_resolver_query_log_config_response +CreateResolverRequest,create_resolver_request +CreateResolverResponse,create_resolver_response +CreateResolverRuleRequest,create_resolver_rule_request +CreateResolverRuleResponse,create_resolver_rule_response +CreateResourceDataSyncRequest,create_resource_data_sync_request +CreateResourceDefinitionRequest,create_resource_definition_request +CreateResourceDefinitionResponse,create_resource_definition_response +CreateResourceDefinitionVersionRequest,create_resource_definition_version_request +CreateResourceDefinitionVersionResponse,create_resource_definition_version_response +CreateResourceGroupRequest,create_resource_group_request +CreateResourceGroupResponse,create_resource_group_response +CreateResourceInput,create_resource_input +CreateResourceOutput,create_resource_output +CreateResourcePolicyRequest,create_resource_policy_request +CreateResourcePolicyResponse,create_resource_policy_response +CreateResourcePolicyStatementRequest,create_resource_policy_statement_request +CreateResourcePolicyStatementResponse,create_resource_policy_statement_response +CreateResourceRequest,create_resource_request +CreateResourceResponse,create_resource_response +CreateResourceServerRequest,create_resource_server_request +CreateResourceServerResponse,create_resource_server_response +CreateResourceSetRequest,create_resource_set_request +CreateResourceSetResponse,create_resource_set_response +CreateResourceShareRequest,create_resource_share_request +CreateResourceShareResponse,create_resource_share_response +CreateResponseHeadersPolicyRequest,create_response_headers_policy_request +CreateResponseHeadersPolicyResult,create_response_headers_policy_result +CreateResponsePlanInput,create_response_plan_input +CreateResponsePlanOutput,create_response_plan_output +CreateRestApiRequest,create_rest_api_request +CreateRestoreImageTaskRequest,create_restore_image_task_request +CreateRestoreImageTaskResult,create_restore_image_task_result +CreateRetrainingSchedulerRequest,create_retraining_scheduler_request +CreateRetrainingSchedulerResponse,create_retraining_scheduler_response +CreateReturnShippingLabelRequest,create_return_shipping_label_request +CreateReturnShippingLabelResult,create_return_shipping_label_result +CreateReusableDelegationSetRequest,create_reusable_delegation_set_request +CreateReusableDelegationSetResponse,create_reusable_delegation_set_response +CreateRevisionRequest,create_revision_request +CreateRevisionResponse,create_revision_response +CreateRobotApplicationRequest,create_robot_application_request +CreateRobotApplicationResponse,create_robot_application_response +CreateRobotApplicationVersionRequest,create_robot_application_version_request +CreateRobotApplicationVersionResponse,create_robot_application_version_response +CreateRobotRequest,create_robot_request +CreateRobotResponse,create_robot_response +CreateRoleAliasRequest,create_role_alias_request +CreateRoleAliasResponse,create_role_alias_response +CreateRoleRequest,create_role_request +CreateRoleResponse,create_role_response +CreateRoomMembershipRequest,create_room_membership_request +CreateRoomMembershipResponse,create_room_membership_response +CreateRoomRequest,create_room_request +CreateRoomResponse,create_room_response +CreateRotationOverrideRequest,create_rotation_override_request +CreateRotationOverrideResult,create_rotation_override_result +CreateRotationRequest,create_rotation_request +CreateRotationResult,create_rotation_result +CreateRouteCalculatorRequest,create_route_calculator_request +CreateRouteCalculatorResponse,create_route_calculator_response +CreateRouteInput,create_route_input +CreateRouteOutput,create_route_output +CreateRouteRequest,create_route_request +CreateRouteResponse,create_route_response +CreateRouteResponseRequest,create_route_response_request +CreateRouteResponseResponse,create_route_response_response +CreateRouteResult,create_route_result +CreateRouteTableRequest,create_route_table_request +CreateRouteTableResult,create_route_table_result +CreateRoutingControlRequest,create_routing_control_request +CreateRoutingControlResponse,create_routing_control_response +CreateRoutingProfileRequest,create_routing_profile_request +CreateRoutingProfileResponse,create_routing_profile_response +CreateRowData,create_row_data +CreateRule,create_rule +CreateRuleGroupRequest,create_rule_group_request +CreateRuleGroupResponse,create_rule_group_response +CreateRuleGroupsNamespaceRequest,create_rule_groups_namespace_request +CreateRuleGroupsNamespaceResponse,create_rule_groups_namespace_response +CreateRuleInput,create_rule_input +CreateRuleOutput,create_rule_output +CreateRuleRequest,create_rule_request +CreateRuleResponse,create_rule_response +CreateRuleResult,create_rule_result +CreateRulesetRequest,create_ruleset_request +CreateRulesetResponse,create_ruleset_response +CreateRunGroupRequest,create_run_group_request +CreateRunGroupResponse,create_run_group_response +CreateS3DataAccessFromS3Bucket,create_s3_data_access_from_s3_bucket +CreateS3DataAccessFromS3BucketRequestDetails,create_s3_data_access_from_s3_bucket_request_details +CreateS3DataAccessFromS3BucketResponseDetails,create_s3_data_access_from_s3_bucket_response_details +CreateSAMLProviderRequest,create_saml_provider_request +CreateSAMLProviderResponse,create_saml_provider_response +CreateSMBFileShareInput,create_smb_file_share_input +CreateSMBFileShareOutput,create_smb_file_share_output +CreateSMSSandboxPhoneNumberInput,create_sms_sandbox_phone_number_input +CreateSafetyRuleRequest,create_safety_rule_request +CreateSafetyRuleResponse,create_safety_rule_response +CreateSampleFindingsRequest,create_sample_findings_request +CreateSamplingRuleRequest,create_sampling_rule_request +CreateSamplingRuleResult,create_sampling_rule_result +CreateSavingsPlanRequest,create_savings_plan_request +CreateSavingsPlanResponse,create_savings_plan_response +CreateSbomExportRequest,create_sbom_export_request +CreateSbomExportResponse,create_sbom_export_response +CreateScalingPlanRequest,create_scaling_plan_request +CreateScalingPlanResponse,create_scaling_plan_response +CreateScanRequest,create_scan_request +CreateScanResponse,create_scan_response +CreateSceneRequest,create_scene_request +CreateSceneResponse,create_scene_response +CreateScheduleGroupInput,create_schedule_group_input +CreateScheduleGroupOutput,create_schedule_group_output +CreateScheduleInput,create_schedule_input +CreateScheduleOutput,create_schedule_output +CreateScheduleRequest,create_schedule_request +CreateScheduleResponse,create_schedule_response +CreateScheduledActionMessage,create_scheduled_action_message +CreateScheduledAuditRequest,create_scheduled_audit_request +CreateScheduledAuditResponse,create_scheduled_audit_response +CreateScheduledQueryRequest,create_scheduled_query_request +CreateScheduledQueryResponse,create_scheduled_query_response +CreateSchedulingPolicyRequest,create_scheduling_policy_request +CreateSchedulingPolicyResponse,create_scheduling_policy_response +CreateSchemaInput,create_schema_input +CreateSchemaMappingInput,create_schema_mapping_input +CreateSchemaMappingOutput,create_schema_mapping_output +CreateSchemaRequest,create_schema_request +CreateSchemaResponse,create_schema_response +CreateScriptInput,create_script_input +CreateScriptOutput,create_script_output +CreateScriptRequest,create_script_request +CreateScriptResponse,create_script_response +CreateSecretRequest,create_secret_request +CreateSecretResponse,create_secret_response +CreateSecurityConfigRequest,create_security_config_request +CreateSecurityConfigResponse,create_security_config_response +CreateSecurityConfigurationInput,create_security_configuration_input +CreateSecurityConfigurationOutput,create_security_configuration_output +CreateSecurityConfigurationRequest,create_security_configuration_request +CreateSecurityConfigurationResponse,create_security_configuration_response +CreateSecurityGroupRequest,create_security_group_request +CreateSecurityGroupResult,create_security_group_result +CreateSecurityPolicyRequest,create_security_policy_request +CreateSecurityPolicyResponse,create_security_policy_response +CreateSecurityProfileRequest,create_security_profile_request +CreateSecurityProfileResponse,create_security_profile_response +CreateSegmentRequest,create_segment_request +CreateSegmentResponse,create_segment_response +CreateSequenceStoreRequest,create_sequence_store_request +CreateSequenceStoreResponse,create_sequence_store_response +CreateServerRequest,create_server_request +CreateServerResponse,create_server_response +CreateServiceActionInput,create_service_action_input +CreateServiceActionOutput,create_service_action_output +CreateServiceInput,create_service_input +CreateServiceInstanceInput,create_service_instance_input +CreateServiceInstanceOutput,create_service_instance_output +CreateServiceLinkedRoleRequest,create_service_linked_role_request +CreateServiceLinkedRoleResponse,create_service_linked_role_response +CreateServiceNetworkRequest,create_service_network_request +CreateServiceNetworkResponse,create_service_network_response +CreateServiceNetworkServiceAssociationRequest,create_service_network_service_association_request +CreateServiceNetworkServiceAssociationResponse,create_service_network_service_association_response +CreateServiceNetworkVpcAssociationRequest,create_service_network_vpc_association_request +CreateServiceNetworkVpcAssociationResponse,create_service_network_vpc_association_response +CreateServiceOutput,create_service_output +CreateServicePrincipalNameRequest,create_service_principal_name_request +CreateServiceProfileRequest,create_service_profile_request +CreateServiceProfileResponse,create_service_profile_response +CreateServiceRequest,create_service_request +CreateServiceResponse,create_service_response +CreateServiceSpecificCredentialRequest,create_service_specific_credential_request +CreateServiceSpecificCredentialResponse,create_service_specific_credential_response +CreateServiceSyncConfigInput,create_service_sync_config_input +CreateServiceSyncConfigOutput,create_service_sync_config_output +CreateServiceTemplateInput,create_service_template_input +CreateServiceTemplateOutput,create_service_template_output +CreateServiceTemplateVersionInput,create_service_template_version_input +CreateServiceTemplateVersionOutput,create_service_template_version_output +CreateSessionRequest,create_session_request +CreateSessionResponse,create_session_response +CreateShareRequest,create_share_request +CreateShareResponse,create_share_response +CreateSignalCatalogRequest,create_signal_catalog_request +CreateSignalCatalogResponse,create_signal_catalog_response +CreateSignalingChannelInput,create_signaling_channel_input +CreateSignalingChannelOutput,create_signaling_channel_output +CreateSimulationApplicationRequest,create_simulation_application_request +CreateSimulationApplicationResponse,create_simulation_application_response +CreateSimulationApplicationVersionRequest,create_simulation_application_version_request +CreateSimulationApplicationVersionResponse,create_simulation_application_version_response +CreateSimulationJobRequest,create_simulation_job_request +CreateSimulationJobResponse,create_simulation_job_response +CreateSinkInput,create_sink_input +CreateSinkOutput,create_sink_output +CreateSipMediaApplicationCallRequest,create_sip_media_application_call_request +CreateSipMediaApplicationCallResponse,create_sip_media_application_call_response +CreateSipMediaApplicationRequest,create_sip_media_application_request +CreateSipMediaApplicationResponse,create_sip_media_application_response +CreateSipRuleRequest,create_sip_rule_request +CreateSipRuleResponse,create_sip_rule_response +CreateSiteInput,create_site_input +CreateSiteOutput,create_site_output +CreateSiteRequest,create_site_request +CreateSiteResponse,create_site_response +CreateSiteToSiteVpnAttachmentRequest,create_site_to_site_vpn_attachment_request +CreateSiteToSiteVpnAttachmentResponse,create_site_to_site_vpn_attachment_response +CreateSizeConstraintSetRequest,create_size_constraint_set_request +CreateSizeConstraintSetResponse,create_size_constraint_set_response +CreateSkillGroupRequest,create_skill_group_request +CreateSkillGroupResponse,create_skill_group_response +CreateSlackChannelConfigurationRequest,create_slack_channel_configuration_request +CreateSlotRequest,create_slot_request +CreateSlotResponse,create_slot_response +CreateSlotTypeRequest,create_slot_type_request +CreateSlotTypeResponse,create_slot_type_response +CreateSlotTypeVersionRequest,create_slot_type_version_request +CreateSlotTypeVersionResponse,create_slot_type_version_response +CreateSmsTemplateRequest,create_sms_template_request +CreateSmsTemplateResponse,create_sms_template_response +CreateSnaplockConfiguration,create_snaplock_configuration +CreateSnapshotBeforeSchemaExtension,create_snapshot_before_schema_extension +CreateSnapshotBeforeUpdate,create_snapshot_before_update +CreateSnapshotCopyGrantMessage,create_snapshot_copy_grant_message +CreateSnapshotCopyGrantResult,create_snapshot_copy_grant_result +CreateSnapshotFromVolumeRecoveryPointInput,create_snapshot_from_volume_recovery_point_input +CreateSnapshotFromVolumeRecoveryPointOutput,create_snapshot_from_volume_recovery_point_output +CreateSnapshotInput,create_snapshot_input +CreateSnapshotMessage,create_snapshot_message +CreateSnapshotOutput,create_snapshot_output +CreateSnapshotRequest,create_snapshot_request +CreateSnapshotResponse,create_snapshot_response +CreateSnapshotResult,create_snapshot_result +CreateSnapshotScheduleMessage,create_snapshot_schedule_message +CreateSnapshotsRequest,create_snapshots_request +CreateSnapshotsResult,create_snapshots_result +CreateSoftwareUpdateJobRequest,create_software_update_job_request +CreateSoftwareUpdateJobResponse,create_software_update_job_response +CreateSolFunctionPackageInput,create_sol_function_package_input +CreateSolFunctionPackageOutput,create_sol_function_package_output +CreateSolNetworkInstanceInput,create_sol_network_instance_input +CreateSolNetworkInstanceOutput,create_sol_network_instance_output +CreateSolNetworkPackageInput,create_sol_network_package_input +CreateSolNetworkPackageOutput,create_sol_network_package_output +CreateSolutionRequest,create_solution_request +CreateSolutionResponse,create_solution_response +CreateSolutionVersionRequest,create_solution_version_request +CreateSolutionVersionResponse,create_solution_version_response +CreateSourceLocationRequest,create_source_location_request +CreateSourceLocationResponse,create_source_location_response +CreateSourceNetworkRequest,create_source_network_request +CreateSourceNetworkResponse,create_source_network_response +CreateSourceRepositoryBranchRequest,create_source_repository_branch_request +CreateSourceRepositoryBranchResponse,create_source_repository_branch_response +CreateSourceRepositoryRequest,create_source_repository_request +CreateSourceRepositoryResponse,create_source_repository_response +CreateSpaceRequest,create_space_request +CreateSpaceResponse,create_space_response +CreateSpotDatafeedSubscriptionRequest,create_spot_datafeed_subscription_request +CreateSpotDatafeedSubscriptionResult,create_spot_datafeed_subscription_result +CreateSqlInjectionMatchSetRequest,create_sql_injection_match_set_request +CreateSqlInjectionMatchSetResponse,create_sql_injection_match_set_response +CreateStackInput,create_stack_input +CreateStackInstancesInput,create_stack_instances_input +CreateStackInstancesOutput,create_stack_instances_output +CreateStackOutput,create_stack_output +CreateStackRequest,create_stack_request +CreateStackResult,create_stack_result +CreateStackSetInput,create_stack_set_input +CreateStackSetOutput,create_stack_set_output +CreateStageRequest,create_stage_request +CreateStageResponse,create_stage_response +CreateStageResult,create_stage_result +CreateStandbyWorkspacesRequest,create_standby_workspaces_request +CreateStandbyWorkspacesResult,create_standby_workspaces_result +CreateStateMachineAliasInput,create_state_machine_alias_input +CreateStateMachineAliasOutput,create_state_machine_alias_output +CreateStateMachineInput,create_state_machine_input +CreateStateMachineOutput,create_state_machine_output +CreateStorageLocationResultMessage,create_storage_location_result_message +CreateStorageVirtualMachineRequest,create_storage_virtual_machine_request +CreateStorageVirtualMachineResponse,create_storage_virtual_machine_response +CreateStoreImageTaskRequest,create_store_image_task_request +CreateStoreImageTaskResult,create_store_image_task_result +CreateStorediSCSIVolumeInput,create_storedi_scsi_volume_input +CreateStorediSCSIVolumeOutput,create_storedi_scsi_volume_output +CreateStreamInput,create_stream_input +CreateStreamKeyRequest,create_stream_key_request +CreateStreamKeyResponse,create_stream_key_response +CreateStreamOutput,create_stream_output +CreateStreamProcessorRequest,create_stream_processor_request +CreateStreamProcessorResponse,create_stream_processor_response +CreateStreamRequest,create_stream_request +CreateStreamResponse,create_stream_response +CreateStreamingDistributionRequest,create_streaming_distribution_request +CreateStreamingDistributionResult,create_streaming_distribution_result +CreateStreamingDistributionWithTagsRequest,create_streaming_distribution_with_tags_request +CreateStreamingDistributionWithTagsResult,create_streaming_distribution_with_tags_result +CreateStreamingImageRequest,create_streaming_image_request +CreateStreamingImageResponse,create_streaming_image_response +CreateStreamingSessionRequest,create_streaming_session_request +CreateStreamingSessionResponse,create_streaming_session_response +CreateStreamingSessionStreamRequest,create_streaming_session_stream_request +CreateStreamingSessionStreamResponse,create_streaming_session_stream_response +CreateStreamingURLRequest,create_streaming_url_request +CreateStreamingURLResult,create_streaming_url_result +CreateStudioComponentRequest,create_studio_component_request +CreateStudioComponentResponse,create_studio_component_response +CreateStudioInput,create_studio_input +CreateStudioLifecycleConfigRequest,create_studio_lifecycle_config_request +CreateStudioLifecycleConfigResponse,create_studio_lifecycle_config_response +CreateStudioOutput,create_studio_output +CreateStudioRequest,create_studio_request +CreateStudioResponse,create_studio_response +CreateStudioSessionMappingInput,create_studio_session_mapping_input +CreateSubnetCidrReservationRequest,create_subnet_cidr_reservation_request +CreateSubnetCidrReservationResult,create_subnet_cidr_reservation_result +CreateSubnetGroupRequest,create_subnet_group_request +CreateSubnetGroupResponse,create_subnet_group_response +CreateSubnetRequest,create_subnet_request +CreateSubnetResult,create_subnet_result +CreateSubscriberNotificationRequest,create_subscriber_notification_request +CreateSubscriberNotificationResponse,create_subscriber_notification_response +CreateSubscriberRequest,create_subscriber_request +CreateSubscriberResponse,create_subscriber_response +CreateSubscriptionDefinitionRequest,create_subscription_definition_request +CreateSubscriptionDefinitionResponse,create_subscription_definition_response +CreateSubscriptionDefinitionVersionRequest,create_subscription_definition_version_request +CreateSubscriptionDefinitionVersionResponse,create_subscription_definition_version_response +CreateSuiteDefinitionRequest,create_suite_definition_request +CreateSuiteDefinitionResponse,create_suite_definition_response +CreateSvmActiveDirectoryConfiguration,create_svm_active_directory_configuration +CreateSyncJobRequest,create_sync_job_request +CreateSyncJobResponse,create_sync_job_response +CreateSystemInstanceRequest,create_system_instance_request +CreateSystemInstanceResponse,create_system_instance_response +CreateSystemTemplateRequest,create_system_template_request +CreateSystemTemplateResponse,create_system_template_response +CreateTLSInspectionConfigurationRequest,create_tls_inspection_configuration_request +CreateTLSInspectionConfigurationResponse,create_tls_inspection_configuration_response +CreateTableDefaultPermissions,create_table_default_permissions +CreateTableInput,create_table_input +CreateTableOutput,create_table_output +CreateTableRequest,create_table_request +CreateTableResponse,create_table_response +CreateTagOptionInput,create_tag_option_input +CreateTagOptionOutput,create_tag_option_output +CreateTagsMessage,create_tags_message +CreateTagsRequest,create_tags_request +CreateTapePoolInput,create_tape_pool_input +CreateTapePoolOutput,create_tape_pool_output +CreateTapeWithBarcodeInput,create_tape_with_barcode_input +CreateTapeWithBarcodeOutput,create_tape_with_barcode_output +CreateTapesInput,create_tapes_input +CreateTapesOutput,create_tapes_output +CreateTargetGroupInput,create_target_group_input +CreateTargetGroupOutput,create_target_group_output +CreateTargetGroupRequest,create_target_group_request +CreateTargetGroupResponse,create_target_group_response +CreateTaskInput,create_task_input +CreateTaskOutput,create_task_output +CreateTaskRequest,create_task_request +CreateTaskResponse,create_task_response +CreateTaskSetRequest,create_task_set_request +CreateTaskSetResponse,create_task_set_response +CreateTaskTemplateRequest,create_task_template_request +CreateTaskTemplateResponse,create_task_template_response +CreateTemplateAliasRequest,create_template_alias_request +CreateTemplateAliasResponse,create_template_alias_response +CreateTemplateGroupAccessControlEntryRequest,create_template_group_access_control_entry_request +CreateTemplateMessageBody,create_template_message_body +CreateTemplateRequest,create_template_request +CreateTemplateResponse,create_template_response +CreateTemplateSyncConfigInput,create_template_sync_config_input +CreateTemplateSyncConfigOutput,create_template_sync_config_output +CreateTestGridProjectRequest,create_test_grid_project_request +CreateTestGridProjectResult,create_test_grid_project_result +CreateTestGridUrlRequest,create_test_grid_url_request +CreateTestGridUrlResult,create_test_grid_url_result +CreateTestSetDiscrepancyReportRequest,create_test_set_discrepancy_report_request +CreateTestSetDiscrepancyReportResponse,create_test_set_discrepancy_report_response +CreateThemeAliasRequest,create_theme_alias_request +CreateThemeAliasResponse,create_theme_alias_response +CreateThemeData,create_theme_data +CreateThemeRequest,create_theme_request +CreateThemeResponse,create_theme_response +CreateThesaurusRequest,create_thesaurus_request +CreateThesaurusResponse,create_thesaurus_response +CreateThingGroupRequest,create_thing_group_request +CreateThingGroupResponse,create_thing_group_response +CreateThingRequest,create_thing_request +CreateThingResponse,create_thing_response +CreateThingTypeRequest,create_thing_type_request +CreateThingTypeResponse,create_thing_type_response +CreateThreatIntelSetRequest,create_threat_intel_set_request +CreateThreatIntelSetResponse,create_threat_intel_set_response +CreateTieringInput,create_tiering_input +CreateTime,create_time +CreateTimelineEventInput,create_timeline_event_input +CreateTimelineEventOutput,create_timeline_event_output +CreateTimestamp,create_timestamp +CreateTokenRequest,create_token_request +CreateTokenResponse,create_token_response +CreateTopicInput,create_topic_input +CreateTopicRefreshScheduleRequest,create_topic_refresh_schedule_request +CreateTopicRefreshScheduleResponse,create_topic_refresh_schedule_response +CreateTopicRequest,create_topic_request +CreateTopicResponse,create_topic_response +CreateTopicRuleDestinationRequest,create_topic_rule_destination_request +CreateTopicRuleDestinationResponse,create_topic_rule_destination_response +CreateTopicRuleRequest,create_topic_rule_request +CreateTrackerRequest,create_tracker_request +CreateTrackerResponse,create_tracker_response +CreateTrafficDistributionGroupRequest,create_traffic_distribution_group_request +CreateTrafficDistributionGroupResponse,create_traffic_distribution_group_response +CreateTrafficMirrorFilterRequest,create_traffic_mirror_filter_request +CreateTrafficMirrorFilterResult,create_traffic_mirror_filter_result +CreateTrafficMirrorFilterRuleRequest,create_traffic_mirror_filter_rule_request +CreateTrafficMirrorFilterRuleResult,create_traffic_mirror_filter_rule_result +CreateTrafficMirrorSessionRequest,create_traffic_mirror_session_request +CreateTrafficMirrorSessionResult,create_traffic_mirror_session_result +CreateTrafficMirrorTargetRequest,create_traffic_mirror_target_request +CreateTrafficMirrorTargetResult,create_traffic_mirror_target_result +CreateTrafficPolicyInstanceRequest,create_traffic_policy_instance_request +CreateTrafficPolicyInstanceResponse,create_traffic_policy_instance_response +CreateTrafficPolicyRequest,create_traffic_policy_request +CreateTrafficPolicyResponse,create_traffic_policy_response +CreateTrafficPolicyVersionRequest,create_traffic_policy_version_request +CreateTrafficPolicyVersionResponse,create_traffic_policy_version_response +CreateTrailRequest,create_trail_request +CreateTrailResponse,create_trail_response +CreateTrainingJobRequest,create_training_job_request +CreateTrainingJobResponse,create_training_job_response +CreateTransformJobRequest,create_transform_job_request +CreateTransformJobResponse,create_transform_job_response +CreateTransitGatewayConnectPeerRequest,create_transit_gateway_connect_peer_request +CreateTransitGatewayConnectPeerResult,create_transit_gateway_connect_peer_result +CreateTransitGatewayConnectRequest,create_transit_gateway_connect_request +CreateTransitGatewayConnectRequestOptions,create_transit_gateway_connect_request_options +CreateTransitGatewayConnectResult,create_transit_gateway_connect_result +CreateTransitGatewayMulticastDomainRequest,create_transit_gateway_multicast_domain_request +CreateTransitGatewayMulticastDomainRequestOptions,create_transit_gateway_multicast_domain_request_options +CreateTransitGatewayMulticastDomainResult,create_transit_gateway_multicast_domain_result +CreateTransitGatewayPeeringAttachmentRequest,create_transit_gateway_peering_attachment_request +CreateTransitGatewayPeeringAttachmentRequestOptions,create_transit_gateway_peering_attachment_request_options +CreateTransitGatewayPeeringAttachmentResult,create_transit_gateway_peering_attachment_result +CreateTransitGatewayPeeringRequest,create_transit_gateway_peering_request +CreateTransitGatewayPeeringResponse,create_transit_gateway_peering_response +CreateTransitGatewayPolicyTableRequest,create_transit_gateway_policy_table_request +CreateTransitGatewayPolicyTableResult,create_transit_gateway_policy_table_result +CreateTransitGatewayPrefixListReferenceRequest,create_transit_gateway_prefix_list_reference_request +CreateTransitGatewayPrefixListReferenceResult,create_transit_gateway_prefix_list_reference_result +CreateTransitGatewayRequest,create_transit_gateway_request +CreateTransitGatewayResult,create_transit_gateway_result +CreateTransitGatewayRouteRequest,create_transit_gateway_route_request +CreateTransitGatewayRouteResult,create_transit_gateway_route_result +CreateTransitGatewayRouteTableAnnouncementRequest,create_transit_gateway_route_table_announcement_request +CreateTransitGatewayRouteTableAnnouncementResult,create_transit_gateway_route_table_announcement_result +CreateTransitGatewayRouteTableAttachmentRequest,create_transit_gateway_route_table_attachment_request +CreateTransitGatewayRouteTableAttachmentResponse,create_transit_gateway_route_table_attachment_response +CreateTransitGatewayRouteTableRequest,create_transit_gateway_route_table_request +CreateTransitGatewayRouteTableResult,create_transit_gateway_route_table_result +CreateTransitGatewayVpcAttachmentRequest,create_transit_gateway_vpc_attachment_request +CreateTransitGatewayVpcAttachmentRequestOptions,create_transit_gateway_vpc_attachment_request_options +CreateTransitGatewayVpcAttachmentResult,create_transit_gateway_vpc_attachment_result +CreateTransitVirtualInterfaceRequest,create_transit_virtual_interface_request +CreateTransitVirtualInterfaceResult,create_transit_virtual_interface_result +CreateTrialComponentRequest,create_trial_component_request +CreateTrialComponentResponse,create_trial_component_response +CreateTrialRequest,create_trial_request +CreateTrialResponse,create_trial_response +CreateTriggerRequest,create_trigger_request +CreateTriggerResponse,create_trigger_response +CreateTrustAnchorRequest,create_trust_anchor_request +CreateTrustRequest,create_trust_request +CreateTrustResult,create_trust_result +CreateTrustStoreRequest,create_trust_store_request +CreateTrustStoreResponse,create_trust_store_response +CreateTypeRequest,create_type_request +CreateTypeResponse,create_type_response +CreateTypedLinkFacetRequest,create_typed_link_facet_request +CreateUnreferencedMergeCommitInput,create_unreferenced_merge_commit_input +CreateUnreferencedMergeCommitOutput,create_unreferenced_merge_commit_output +CreateUpdatedImageRequest,create_updated_image_request +CreateUpdatedImageResult,create_updated_image_result +CreateUpdatedWorkspaceImageRequest,create_updated_workspace_image_request +CreateUpdatedWorkspaceImageResult,create_updated_workspace_image_result +CreateUploadRequest,create_upload_request +CreateUploadResult,create_upload_result +CreateUploadUrlRequest,create_upload_url_request +CreateUploadUrlResponse,create_upload_url_response +CreateUsageLimitMessage,create_usage_limit_message +CreateUsageLimitRequest,create_usage_limit_request +CreateUsageLimitResponse,create_usage_limit_response +CreateUsagePlanKeyRequest,create_usage_plan_key_request +CreateUsagePlanRequest,create_usage_plan_request +CreateUsageReportSubscriptionResult,create_usage_report_subscription_result +CreateUseCaseRequest,create_use_case_request +CreateUseCaseResponse,create_use_case_response +CreateUserAccessLoggingSettingsRequest,create_user_access_logging_settings_request +CreateUserAccessLoggingSettingsResponse,create_user_access_logging_settings_response +CreateUserDefinedFunctionRequest,create_user_defined_function_request +CreateUserGroupMessage,create_user_group_message +CreateUserHierarchyGroupRequest,create_user_hierarchy_group_request +CreateUserHierarchyGroupResponse,create_user_hierarchy_group_response +CreateUserImportJobRequest,create_user_import_job_request +CreateUserImportJobResponse,create_user_import_job_response +CreateUserMessage,create_user_message +CreateUserPoolClientRequest,create_user_pool_client_request +CreateUserPoolClientResponse,create_user_pool_client_response +CreateUserPoolDomainRequest,create_user_pool_domain_request +CreateUserPoolDomainResponse,create_user_pool_domain_response +CreateUserPoolRequest,create_user_pool_request +CreateUserPoolResponse,create_user_pool_response +CreateUserProfileRequest,create_user_profile_request +CreateUserProfileResponse,create_user_profile_response +CreateUserProfileResult,create_user_profile_result +CreateUserRequest,create_user_request +CreateUserResponse,create_user_response +CreateUserSettingsRequest,create_user_settings_request +CreateUserSettingsResponse,create_user_settings_response +CreateVPCAssociationAuthorizationRequest,create_vpc_association_authorization_request +CreateVPCAssociationAuthorizationResponse,create_vpc_association_authorization_response +CreateVPCConnectionRequest,create_vpc_connection_request +CreateVPCConnectionResponse,create_vpc_connection_response +CreateVPCEConfigurationRequest,create_vpce_configuration_request +CreateVPCEConfigurationResult,create_vpce_configuration_result +CreateVariableRequest,create_variable_request +CreateVariantStoreRequest,create_variant_store_request +CreateVariantStoreResponse,create_variant_store_response +CreateVaultInput,create_vault_input +CreateVaultOutput,create_vault_output +CreateVehicleError,create_vehicle_error +CreateVehicleRequest,create_vehicle_request +CreateVehicleRequestItem,create_vehicle_request_item +CreateVehicleResponse,create_vehicle_response +CreateVehicleResponseItem,create_vehicle_response_item +CreateVerifiedAccessEndpointEniOptions,create_verified_access_endpoint_eni_options +CreateVerifiedAccessEndpointLoadBalancerOptions,create_verified_access_endpoint_load_balancer_options +CreateVerifiedAccessEndpointRequest,create_verified_access_endpoint_request +CreateVerifiedAccessEndpointResult,create_verified_access_endpoint_result +CreateVerifiedAccessGroupRequest,create_verified_access_group_request +CreateVerifiedAccessGroupResult,create_verified_access_group_result +CreateVerifiedAccessInstanceRequest,create_verified_access_instance_request +CreateVerifiedAccessInstanceResult,create_verified_access_instance_result +CreateVerifiedAccessTrustProviderDeviceOptions,create_verified_access_trust_provider_device_options +CreateVerifiedAccessTrustProviderOidcOptions,create_verified_access_trust_provider_oidc_options +CreateVerifiedAccessTrustProviderRequest,create_verified_access_trust_provider_request +CreateVerifiedAccessTrustProviderResult,create_verified_access_trust_provider_result +CreateViewInput,create_view_input +CreateViewOutput,create_view_output +CreateViewRequest,create_view_request +CreateViewResponse,create_view_response +CreateViewVersionRequest,create_view_version_request +CreateViewVersionResponse,create_view_version_response +CreateVirtualClusterRequest,create_virtual_cluster_request +CreateVirtualClusterResponse,create_virtual_cluster_response +CreateVirtualGatewayInput,create_virtual_gateway_input +CreateVirtualGatewayOutput,create_virtual_gateway_output +CreateVirtualMFADeviceRequest,create_virtual_mfa_device_request +CreateVirtualMFADeviceResponse,create_virtual_mfa_device_response +CreateVirtualNodeInput,create_virtual_node_input +CreateVirtualNodeOutput,create_virtual_node_output +CreateVirtualRouterInput,create_virtual_router_input +CreateVirtualRouterOutput,create_virtual_router_output +CreateVirtualServiceInput,create_virtual_service_input +CreateVirtualServiceOutput,create_virtual_service_output +CreateVocabularyFilterRequest,create_vocabulary_filter_request +CreateVocabularyFilterResponse,create_vocabulary_filter_response +CreateVocabularyRequest,create_vocabulary_request +CreateVocabularyResponse,create_vocabulary_response +CreateVodSourceRequest,create_vod_source_request +CreateVodSourceResponse,create_vod_source_response +CreateVoiceConnectorGroupRequest,create_voice_connector_group_request +CreateVoiceConnectorGroupResponse,create_voice_connector_group_response +CreateVoiceConnectorRequest,create_voice_connector_request +CreateVoiceConnectorResponse,create_voice_connector_response +CreateVoiceProfileDomainRequest,create_voice_profile_domain_request +CreateVoiceProfileDomainResponse,create_voice_profile_domain_response +CreateVoiceProfileRequest,create_voice_profile_request +CreateVoiceProfileResponse,create_voice_profile_response +CreateVoiceTemplateRequest,create_voice_template_request +CreateVoiceTemplateResponse,create_voice_template_response +CreateVolumeFromBackupRequest,create_volume_from_backup_request +CreateVolumeFromBackupResponse,create_volume_from_backup_response +CreateVolumePermission,create_volume_permission +CreateVolumePermissionModifications,create_volume_permission_modifications +CreateVolumePermissions,create_volume_permissions +CreateVolumeRequest,create_volume_request +CreateVolumeResponse,create_volume_response +CreateVpcAttachmentRequest,create_vpc_attachment_request +CreateVpcAttachmentResponse,create_vpc_attachment_response +CreateVpcConnectionRequest,create_vpc_connection_request +CreateVpcConnectionResponse,create_vpc_connection_response +CreateVpcConnectorRequest,create_vpc_connector_request +CreateVpcConnectorResponse,create_vpc_connector_response +CreateVpcEndpointConnectionNotificationRequest,create_vpc_endpoint_connection_notification_request +CreateVpcEndpointConnectionNotificationResult,create_vpc_endpoint_connection_notification_result +CreateVpcEndpointDetail,create_vpc_endpoint_detail +CreateVpcEndpointRequest,create_vpc_endpoint_request +CreateVpcEndpointResponse,create_vpc_endpoint_response +CreateVpcEndpointResult,create_vpc_endpoint_result +CreateVpcEndpointServiceConfigurationRequest,create_vpc_endpoint_service_configuration_request +CreateVpcEndpointServiceConfigurationResult,create_vpc_endpoint_service_configuration_result +CreateVpcIngressConnectionRequest,create_vpc_ingress_connection_request +CreateVpcIngressConnectionResponse,create_vpc_ingress_connection_response +CreateVpcLinkRequest,create_vpc_link_request +CreateVpcLinkResponse,create_vpc_link_response +CreateVpcPeeringAuthorizationInput,create_vpc_peering_authorization_input +CreateVpcPeeringAuthorizationOutput,create_vpc_peering_authorization_output +CreateVpcPeeringConnectionInput,create_vpc_peering_connection_input +CreateVpcPeeringConnectionRequest,create_vpc_peering_connection_request +CreateVpcPeeringConnectionResult,create_vpc_peering_connection_result +CreateVpcRequest,create_vpc_request +CreateVpcResult,create_vpc_result +CreateVpnConnectionRequest,create_vpn_connection_request +CreateVpnConnectionResult,create_vpn_connection_result +CreateVpnConnectionRouteRequest,create_vpn_connection_route_request +CreateVpnGatewayRequest,create_vpn_gateway_request +CreateVpnGatewayResult,create_vpn_gateway_result +CreateWatchlistRequest,create_watchlist_request +CreateWatchlistResponse,create_watchlist_response +CreateWaveRequest,create_wave_request +CreateWebACLMigrationStackRequest,create_web_acl_migration_stack_request +CreateWebACLMigrationStackResponse,create_web_acl_migration_stack_response +CreateWebACLRequest,create_web_acl_request +CreateWebACLResponse,create_web_acl_response +CreateWebLoginTokenRequest,create_web_login_token_request +CreateWebLoginTokenResponse,create_web_login_token_response +CreateWebhookInput,create_webhook_input +CreateWebhookOutput,create_webhook_output +CreateWebhookRequest,create_webhook_request +CreateWebhookResult,create_webhook_result +CreateWhatIfAnalysisRequest,create_what_if_analysis_request +CreateWhatIfAnalysisResponse,create_what_if_analysis_response +CreateWhatIfForecastExportRequest,create_what_if_forecast_export_request +CreateWhatIfForecastExportResponse,create_what_if_forecast_export_response +CreateWhatIfForecastRequest,create_what_if_forecast_request +CreateWhatIfForecastResponse,create_what_if_forecast_response +CreateWirelessDeviceRequest,create_wireless_device_request +CreateWirelessDeviceResponse,create_wireless_device_response +CreateWirelessGatewayRequest,create_wireless_gateway_request +CreateWirelessGatewayResponse,create_wireless_gateway_response +CreateWirelessGatewayTaskDefinitionRequest,create_wireless_gateway_task_definition_request +CreateWirelessGatewayTaskDefinitionResponse,create_wireless_gateway_task_definition_response +CreateWirelessGatewayTaskRequest,create_wireless_gateway_task_request +CreateWirelessGatewayTaskResponse,create_wireless_gateway_task_response +CreateWorkGroupInput,create_work_group_input +CreateWorkerBlockRequest,create_worker_block_request +CreateWorkerConfigurationRequest,create_worker_configuration_request +CreateWorkerConfigurationResponse,create_worker_configuration_response +CreateWorkerFleetRequest,create_worker_fleet_request +CreateWorkerFleetResponse,create_worker_fleet_response +CreateWorkerRequest,create_worker_request +CreateWorkerResponse,create_worker_response +CreateWorkflowRequest,create_workflow_request +CreateWorkflowResponse,create_workflow_response +CreateWorkflowStepGroupRequest,create_workflow_step_group_request +CreateWorkflowStepGroupResponse,create_workflow_step_group_response +CreateWorkflowStepRequest,create_workflow_step_request +CreateWorkflowStepResponse,create_workflow_step_response +CreateWorkforceRequest,create_workforce_request +CreateWorkforceResponse,create_workforce_response +CreateWorkgroupRequest,create_workgroup_request +CreateWorkgroupResponse,create_workgroup_response +CreateWorkloadInput,create_workload_input +CreateWorkloadOutput,create_workload_output +CreateWorkloadShareInput,create_workload_share_input +CreateWorkloadShareOutput,create_workload_share_output +CreateWorkspaceApiKeyRequest,create_workspace_api_key_request +CreateWorkspaceApiKeyResponse,create_workspace_api_key_response +CreateWorkspaceBundleRequest,create_workspace_bundle_request +CreateWorkspaceBundleResult,create_workspace_bundle_result +CreateWorkspaceImageRequest,create_workspace_image_request +CreateWorkspaceImageResult,create_workspace_image_result +CreateWorkspaceRequest,create_workspace_request +CreateWorkspaceResponse,create_workspace_response +CreateWorkspacesRequest,create_workspaces_request +CreateWorkspacesResult,create_workspaces_result +CreateWorkteamRequest,create_workteam_request +CreateWorkteamResponse,create_workteam_response +CreateWorldExportJobRequest,create_world_export_job_request +CreateWorldExportJobResponse,create_world_export_job_response +CreateWorldGenerationJobRequest,create_world_generation_job_request +CreateWorldGenerationJobResponse,create_world_generation_job_response +CreateWorldTemplateRequest,create_world_template_request +CreateWorldTemplateResponse,create_world_template_response +CreateXMLClassifierRequest,create_xml_classifier_request +CreateXssMatchSetRequest,create_xss_match_set_request +CreateXssMatchSetResponse,create_xss_match_set_response +Created,created +CreatedAfter,created_after +CreatedArtifact,created_artifact +CreatedArtifactList,created_artifact_list +CreatedArtifactName,created_artifact_name +CreatedAt,created_at +CreatedAtEndTime,created_at_end_time +CreatedAtStartTime,created_at_start_time +CreatedBefore,created_before +CreatedButModifiedException,created_but_modified_exception +CreatedBy,created_by +CreatedByAccountId,created_by_account_id +CreatedByArn,created_by_arn +CreatedByIamUser,created_by_iam_user +CreatedByService,created_by_service +CreatedDate,created_date +CreatedDateTime,created_date_time +CreatedOn,created_on +CreatedRange,created_range +CreatedResourceArn,created_resource_arn +CreatedRulesetName,created_ruleset_name +CreatedTime,created_time +CreatedTimeStamp,created_time_stamp +CreatedTimestamp,created_timestamp +CreatedUsingAutoPredictor,created_using_auto_predictor +Creates,creates +CreationDate,creation_date +CreationDateTime,creation_date_time +CreationInfo,creation_info +CreationLimitExceededException,creation_limit_exceeded_exception +CreationPath,creation_path +CreationRequestDateTime,creation_request_date_time +CreationStatus,creation_status +CreationTime,creation_time +CreationTimeAfter,creation_time_after +CreationTimeBefore,creation_time_before +CreationTimestamp,creation_timestamp +CreationToken,creation_token +CreatorId,creator_id +CreatorRequestId,creator_request_id +Credential,credential +CredentialPair,credential_pair +CredentialProvider,credential_provider +CredentialReportExpiredException,credential_report_expired_exception +CredentialReportNotPresentException,credential_report_not_present_exception +CredentialReportNotReadyException,credential_report_not_ready_exception +CredentialSummary,credential_summary +CredentialType,credential_type +Credentials,credentials +CredentialsArn,credentials_arn +CredentialsParameter,credentials_parameter +CredentialsSecretName,credentials_secret_name +CredentialsToAddOrUpdate,credentials_to_add_or_update +CredentialsToRemove,credentials_to_remove +CreditSpecification,credit_specification +CreditSpecificationRequest,credit_specification_request +Criteria,criteria +CriteriaBlockForJob,criteria_block_for_job +CriteriaForJob,criteria_for_job +Criterion,criterion +CriterionAdditionalProperties,criterion_additional_properties +CriterionKey,criterion_key +Critical,critical +CriticalCount,critical_count +CriticalNonCompliantCount,critical_non_compliant_count +Criticality,criticality +CrlConfiguration,crl_configuration +CrlDetail,crl_detail +CrlDetailResponse,crl_detail_response +CronExpression,cron_expression +CronExpressionForRecurrence,cron_expression_for_recurrence +Crop,crop +CrossAccount,cross_account +CrossAccountAuthorization,cross_account_authorization +CrossAccountAuthorizations,cross_account_authorizations +CrossAccountClone,cross_account_clone +CrossAccountFilterOption,cross_account_filter_option +CrossAccountModelRegisterRoleArn,cross_account_model_register_role_arn +CrossChannelBehavior,cross_channel_behavior +CrossClusterSearch,cross_cluster_search +CrossClusterSearchConnection,cross_cluster_search_connection +CrossClusterSearchConnectionId,cross_cluster_search_connection_id +CrossClusterSearchConnectionProperties,cross_cluster_search_connection_properties +CrossClusterSearchConnections,cross_cluster_search_connections +CrossDataset,cross_dataset +CrossRealmTrustPrincipalPassword,cross_realm_trust_principal_password +CrossRegionCopy,cross_region_copy +CrossRegionCopyAction,cross_region_copy_action +CrossRegionCopyDeprecateRule,cross_region_copy_deprecate_rule +CrossRegionCopyRetainRule,cross_region_copy_retain_rule +CrossRegionCopyRule,cross_region_copy_rule +CrossRegionCopyRules,cross_region_copy_rules +CrossZoneLoadBalancing,cross_zone_load_balancing +CryptoProviders,crypto_providers +CryptogramVerificationArpcMethod1,cryptogram_verification_arpc_method1 +CryptogramVerificationArpcMethod2,cryptogram_verification_arpc_method2 +Csid,csid +CslgAtom,cslg_atom +Csr,csr +CsrExtensions,csr_extensions +Csv,csv +CsvClassifier,csv_classifier +CsvConfiguration,csv_configuration +CsvContentTypes,csv_content_types +CsvDelimiter,csv_delimiter +CsvFormatDescriptor,csv_format_descriptor +CsvNoSupValue,csv_no_sup_value +CsvNullValue,csv_null_value +CsvOptions,csv_options +CsvOutputOptions,csv_output_options +CsvReport,csv_report +CsvRowDelimiter,csv_row_delimiter +CttsVersion,ctts_version +CumulativeBytesMetered,cumulative_bytes_metered +CumulativeBytesScanned,cumulative_bytes_scanned +Currency,currency +CurrencyCode,currency_code +CurrencyDisplayFormatConfiguration,currency_display_format_configuration +CurrencySymbol,currency_symbol +Current,current +CurrentAction,current_action +CurrentActiveJob,current_active_job +CurrentActiveVersion,current_active_version +CurrentActiveVersionArn,current_active_version_arn +CurrentApplicationVersionId,current_application_version_id +CurrentApplyDate,current_apply_date +CurrentAverageCoverage,current_average_coverage +CurrentAverageHourlyOnDemandSpend,current_average_hourly_on_demand_spend +CurrentBackupRateInMegaBytesPerSecond,current_backup_rate_in_mega_bytes_per_second +CurrentBrokerSoftwareInfo,current_broker_software_info +CurrentCapacity,current_capacity +CurrentCoverage,current_coverage +CurrentDatabaseRevision,current_database_revision +CurrentDefaultVersion,current_default_version +CurrentDeliveryStreamVersionId,current_delivery_stream_version_id +CurrentExpiryYear,current_expiry_year +CurrentFirewallSubnetRouteTable,current_firewall_subnet_route_table +CurrentFleetState,current_fleet_state +CurrentGeneration,current_generation +CurrentInferenceUnits,current_inference_units +CurrentInstance,current_instance +CurrentInstanceBootMode,current_instance_boot_mode +CurrentInstanceCount,current_instance_count +CurrentInstances,current_instances +CurrentInternetGatewayRouteTable,current_internet_gateway_route_table +CurrentIpamScopeId,current_ipam_scope_id +CurrentLensVersion,current_lens_version +CurrentLsn,current_lsn +CurrentMaximumHourlyOnDemandSpend,current_maximum_hourly_on_demand_spend +CurrentMetric,current_metric +CurrentMetricData,current_metric_data +CurrentMetricResult,current_metric_result +CurrentMetricSortCriteria,current_metric_sort_criteria +CurrentMetrics,current_metrics +CurrentMinimumHourlyOnDemandSpend,current_minimum_hourly_on_demand_spend +CurrentNetworkingStatus,current_networking_status +CurrentOnDemandSpend,current_on_demand_spend +CurrentOperationStatus,current_operation_status +CurrentParallelism,current_parallelism +CurrentPassword,current_password +CurrentPerformanceRiskRatings,current_performance_risk_ratings +CurrentPhase,current_phase +CurrentPlayerSessionCount,current_player_session_count +CurrentPolicyDescription,current_policy_description +CurrentProfileVersion,current_profile_version +CurrentRateInMegaBytesPerSecond,current_rate_in_mega_bytes_per_second +CurrentRegionAvailability,current_region_availability +CurrentRestoreRateInMegaBytesPerSecond,current_restore_rate_in_mega_bytes_per_second +CurrentRevision,current_revision +CurrentRole,current_role +CurrentRouteTable,current_route_table +CurrentSamplingPercentage,current_sampling_percentage +CurrentScore,current_score +CurrentServerlessConfig,current_serverless_config +CurrentShardCount,current_shard_count +CurrentShardLevelMetrics,current_shard_level_metrics +CurrentSigningKeyLength,current_signing_key_length +CurrentSoftware,current_software +CurrentSpotFleetRequestState,current_spot_fleet_request_state +CurrentState,current_state +CurrentStatus,current_status +CurrentStepName,current_step_name +CurrentTaskExecutionArn,current_task_execution_arn +CurrentVersion,current_version +CurrentWeight,current_weight +CustSubscriptionId,cust_subscription_id +CustomAction,custom_action +CustomActionFilterOperation,custom_action_filter_operation +CustomActionId,custom_action_id +CustomActionNavigationOperation,custom_action_navigation_operation +CustomActionSetParametersOperation,custom_action_set_parameters_operation +CustomActionURLOperation,custom_action_url_operation +CustomActions,custom_actions +CustomAmi,custom_ami +CustomAmiId,custom_ami_id +CustomAmiList,custom_ami_list +CustomArtifactConfiguration,custom_artifact_configuration +CustomArtifactConfigurationDescription,custom_artifact_configuration_description +CustomArtifactsConfiguration,custom_artifacts_configuration +CustomArtifactsConfigurationDescription,custom_artifacts_configuration_description +CustomArtifactsConfigurationUpdate,custom_artifacts_configuration_update +CustomAttribute,custom_attribute +CustomAttributes,custom_attributes +CustomAuthConfig,custom_auth_config +CustomAuthCredentials,custom_auth_credentials +CustomAvailabilityZoneNotFoundFault,custom_availability_zone_not_found_fault +CustomCertificate,custom_certificate +CustomCname,custom_cname +CustomCnameAssociationFault,custom_cname_association_fault +CustomCode,custom_code +CustomCodeSigning,custom_code_signing +CustomColor,custom_color +CustomColors,custom_colors +CustomCondition,custom_condition +CustomConfig,custom_config +CustomConnector,custom_connector +CustomConnectorDestinationProperties,custom_connector_destination_properties +CustomConnectorProfileCredentials,custom_connector_profile_credentials +CustomConnectorProfileProperties,custom_connector_profile_properties +CustomConnectorSourceProperties,custom_connector_source_properties +CustomContentConfiguration,custom_content_configuration +CustomContentVisual,custom_content_visual +CustomCookbooksSource,custom_cookbooks_source +CustomDBEngineVersionAMI,custom_db_engine_version_ami +CustomDBEngineVersionAlreadyExistsFault,custom_db_engine_version_already_exists_fault +CustomDBEngineVersionManifest,custom_db_engine_version_manifest +CustomDBEngineVersionNotFoundFault,custom_db_engine_version_not_found_fault +CustomDBEngineVersionQuotaExceededFault,custom_db_engine_version_quota_exceeded_fault +CustomDNSServer,custom_dns_server +CustomDataIdentifierSummary,custom_data_identifier_summary +CustomDataIdentifiers,custom_data_identifiers +CustomDataIdentifiersDetections,custom_data_identifiers_detections +CustomDataIdentifiersResult,custom_data_identifiers_result +CustomDatatypeConfigured,custom_datatype_configured +CustomDatatypes,custom_datatypes +CustomDeliveryConfiguration,custom_delivery_configuration +CustomDetection,custom_detection +CustomDnsServers,custom_dns_servers +CustomDocumentEnrichmentConfiguration,custom_document_enrichment_configuration +CustomDomain,custom_domain +CustomDomainAssociationNotFoundFault,custom_domain_association_not_found_fault +CustomDomainAssociationsMessage,custom_domain_associations_message +CustomDomainCertExpiryTime,custom_domain_cert_expiry_time +CustomDomainCertificateArn,custom_domain_certificate_arn +CustomDomainCertificateExpiryDate,custom_domain_certificate_expiry_date +CustomDomainConfig,custom_domain_config +CustomDomainConfigType,custom_domain_config_type +CustomDomainName,custom_domain_name +CustomDomains,custom_domains +CustomEmailLambdaVersionConfigType,custom_email_lambda_version_config_type +CustomEmailSender,custom_email_sender +CustomEndpoint,custom_endpoint +CustomEndpointCertificateArn,custom_endpoint_certificate_arn +CustomEndpointEnabled,custom_endpoint_enabled +CustomEndpointType,custom_endpoint_type +CustomEndpoints,custom_endpoints +CustomEntityType,custom_entity_type +CustomEntityTypes,custom_entity_types +CustomEntityTypesNotFound,custom_entity_types_not_found +CustomEpoch,custom_epoch +CustomErrorResponse,custom_error_response +CustomErrorResponses,custom_error_responses +CustomEventData,custom_event_data +CustomEvents,custom_events +CustomExtension,custom_extension +CustomExtensions,custom_extensions +CustomFederationProviderUrl,custom_federation_provider_url +CustomFilterConfiguration,custom_filter_configuration +CustomFilterListConfiguration,custom_filter_list_configuration +CustomHTTPHeader,custom_http_header +CustomHeaders,custom_headers +CustomHeadersConfig,custom_headers_config +CustomHealthNotFound,custom_health_not_found +CustomIamInstanceProfile,custom_iam_instance_profile +CustomIconContent,custom_icon_content +CustomImage,custom_image +CustomImages,custom_images +CustomIndices,custom_indices +CustomIndicesInput,custom_indices_input +CustomInstanceProfileArn,custom_instance_profile_arn +CustomJson,custom_json +CustomKeyStoreHasCMKsException,custom_key_store_has_cmks_exception +CustomKeyStoreId,custom_key_store_id +CustomKeyStoreInvalidStateException,custom_key_store_invalid_state_exception +CustomKeyStoreName,custom_key_store_name +CustomKeyStoreNameInUseException,custom_key_store_name_in_use_exception +CustomKeyStoreNotFoundException,custom_key_store_not_found_exception +CustomKeyStoreType,custom_key_store_type +CustomKeyStores,custom_key_stores +CustomKeyStoresListEntry,custom_key_stores_list_entry +CustomKeys,custom_keys +CustomKnowledgeArticleTypeConfigurations,custom_knowledge_article_type_configurations +CustomLabel,custom_label +CustomLabelConfiguration,custom_label_configuration +CustomLabels,custom_labels +CustomLanguageCode,custom_language_code +CustomLibraries,custom_libraries +CustomLineItemBillingPeriodRange,custom_line_item_billing_period_range +CustomLineItemChargeDetails,custom_line_item_charge_details +CustomLineItemFlatChargeDetails,custom_line_item_flat_charge_details +CustomLineItemListElement,custom_line_item_list_element +CustomLineItemPercentageChargeDetails,custom_line_item_percentage_charge_details +CustomLineItemVersionListElement,custom_line_item_version_list_element +CustomLineItemVersions,custom_line_item_versions +CustomLineItems,custom_line_items +CustomLogSourceAttributes,custom_log_source_attributes +CustomLogSourceConfiguration,custom_log_source_configuration +CustomLogSourceCrawlerConfiguration,custom_log_source_crawler_configuration +CustomLogSourceProvider,custom_log_source_provider +CustomLogSourceResource,custom_log_source_resource +CustomMessage,custom_message +CustomMessageActivity,custom_message_activity +CustomMetadata,custom_metadata +CustomMetadataLimitExceededException,custom_metadata_limit_exceeded_exception +CustomModelSummary,custom_model_summary +CustomModelTrainingParameters,custom_model_training_parameters +CustomModelTransformParameters,custom_model_transform_parameters +CustomName,custom_name +CustomNarrative,custom_narrative +CustomNarrativeOptions,custom_narrative_options +CustomObjectIdentifier,custom_object_identifier +CustomOriginConfig,custom_origin_config +CustomParameterValues,custom_parameter_values +CustomPatterns,custom_patterns +CustomPayload,custom_payload +CustomPermissionsName,custom_permissions_name +CustomPlatformQuota,custom_platform_quota +CustomPlugin,custom_plugin +CustomPluginDescription,custom_plugin_description +CustomPluginFileDescription,custom_plugin_file_description +CustomPluginLocation,custom_plugin_location +CustomPluginLocationDescription,custom_plugin_location_description +CustomPluginRevisionSummary,custom_plugin_revision_summary +CustomPluginSummary,custom_plugin_summary +CustomPolicyDetails,custom_policy_details +CustomPrivateKey,custom_private_key +CustomRecipes,custom_recipes +CustomRedirectDomain,custom_redirect_domain +CustomRequestHandling,custom_request_handling +CustomResponse,custom_response +CustomResponseBodies,custom_response_bodies +CustomResponseBody,custom_response_body +CustomResponseBodyKey,custom_response_body_key +CustomRoleArn,custom_role_arn +CustomRoutingAccelerator,custom_routing_accelerator +CustomRoutingAcceleratorAttributes,custom_routing_accelerator_attributes +CustomRoutingDestinationConfiguration,custom_routing_destination_configuration +CustomRoutingDestinationDescription,custom_routing_destination_description +CustomRoutingEndpointConfiguration,custom_routing_endpoint_configuration +CustomRoutingEndpointDescription,custom_routing_endpoint_description +CustomRoutingEndpointGroup,custom_routing_endpoint_group +CustomRoutingListener,custom_routing_listener +CustomRule,custom_rule +CustomSMSLambdaVersionConfigType,custom_sms_lambda_version_config_type +CustomSMSSender,custom_sms_sender +CustomSchemaCountLimitExceededException,custom_schema_count_limit_exceeded_exception +CustomSeasonalityValue,custom_seasonality_value +CustomSecurityGroupId,custom_security_group_id +CustomSecurityGroupIds,custom_security_group_ids +CustomSql,custom_sql +CustomStepDetails,custom_step_details +CustomSuffix,custom_suffix +CustomTextContent,custom_text_content +CustomUserData,custom_user_data +CustomValue,custom_value +CustomValues,custom_values +CustomValuesConfiguration,custom_values_configuration +CustomVerificationEmailInvalidContentException,custom_verification_email_invalid_content_exception +CustomVerificationEmailTemplate,custom_verification_email_template +CustomVerificationEmailTemplateAlreadyExistsException,custom_verification_email_template_already_exists_exception +CustomVerificationEmailTemplateDoesNotExistException,custom_verification_email_template_does_not_exist_exception +CustomVerificationEmailTemplateMetadata,custom_verification_email_template_metadata +CustomVerificationEmailTemplateName,custom_verification_email_template_name +CustomVerificationEmailTemplates,custom_verification_email_templates +CustomVocabularyEntryId,custom_vocabulary_entry_id +CustomVocabularyExportSpecification,custom_vocabulary_export_specification +CustomVocabularyImportSpecification,custom_vocabulary_import_specification +CustomVocabularyItem,custom_vocabulary_item +CustomerAWSAccountId,customer_aws_account_id +CustomerAction,customer_action +CustomerAgentInfo,customer_agent_info +CustomerAgentlessCollectorInfo,customer_agentless_collector_info +CustomerAgreement,customer_agreement +CustomerArtifactPaths,customer_artifact_paths +CustomerAvailabilityZone,customer_availability_zone +CustomerAwsId,customer_aws_id +CustomerConnectorInfo,customer_connector_info +CustomerContentEncryptionConfiguration,customer_content_encryption_configuration +CustomerDnsIps,customer_dns_ips +CustomerGateway,customer_gateway +CustomerGatewayArn,customer_gateway_arn +CustomerGatewayArns,customer_gateway_arns +CustomerGatewayAssociation,customer_gateway_association +CustomerGatewayAssociations,customer_gateway_associations +CustomerGatewayConfiguration,customer_gateway_configuration +CustomerGatewayId,customer_gateway_id +CustomerGatewayIds,customer_gateway_ids +CustomerGateways,customer_gateways +CustomerIdentifier,customer_identifier +CustomerManagedChannelS3Storage,customer_managed_channel_s3_storage +CustomerManagedChannelS3StorageSummary,customer_managed_channel_s3_storage_summary +CustomerManagedDatastoreS3Storage,customer_managed_datastore_s3_storage +CustomerManagedDatastoreS3StorageSummary,customer_managed_datastore_s3_storage_summary +CustomerManagedKeyEnabled,customer_managed_key_enabled +CustomerManagedPolicyReference,customer_managed_policy_reference +CustomerManagedPolicyReferences,customer_managed_policy_references +CustomerManagedS3Storage,customer_managed_s3_storage +CustomerMasterKeySpec,customer_master_key_spec +CustomerMeCollectorInfo,customer_me_collector_info +CustomerMetadataProperties,customer_metadata_properties +CustomerMetadataPropertiesToRemove,customer_metadata_properties_to_remove +CustomerNodeEndpoint,customer_node_endpoint +CustomerNodeEndpointList,customer_node_endpoint_list +CustomerNotEntitledException,customer_not_entitled_exception +CustomerOutpostArn,customer_outpost_arn +CustomerOverride,customer_override +CustomerOverrideValidTill,customer_override_valid_till +CustomerOwnedIp,customer_owned_ip +CustomerOwnedIpEnabled,customer_owned_ip_enabled +CustomerOwnedIpv4Pool,customer_owned_ipv4_pool +CustomerProfiles,customer_profiles +CustomerProfilesDestinationProperties,customer_profiles_destination_properties +CustomerResultObject,customer_result_object +CustomerSpeakerId,customer_speaker_id +CustomerStorageMessage,customer_storage_message +CustomerUserName,customer_user_name +CustomizedCapacityMetricSpecification,customized_capacity_metric_specification +CustomizedLoadMetricSpecification,customized_load_metric_specification +CustomizedMetricSpecification,customized_metric_specification +CustomizedScalingMetricSpecification,customized_scaling_metric_specification +Cutoff,cutoff +CutoffBehavior,cutoff_behavior +Cvss,cvss +Cvss2,cvss2 +Cvss3,cvss3 +CvssScore,cvss_score +CvssScoreAdjustment,cvss_score_adjustment +CvssScoreDetails,cvss_score_details +CwLog,cw_log +CwLogEnabled,cw_log_enabled +CwLogGroup,cw_log_group +Cwes,cwes +DASHFragmentSelector,dash_fragment_selector +DASHStreamingSessionURL,dash_streaming_session_url +DASHTimestampRange,dash_timestamp_range +DBCluster,db_cluster +DBClusterAlreadyExistsFault,db_cluster_already_exists_fault +DBClusterArn,db_cluster_arn +DBClusterAutomatedBackup,db_cluster_automated_backup +DBClusterAutomatedBackupMessage,db_cluster_automated_backup_message +DBClusterAutomatedBackupNotFoundFault,db_cluster_automated_backup_not_found_fault +DBClusterAutomatedBackupQuotaExceededFault,db_cluster_automated_backup_quota_exceeded_fault +DBClusterAutomatedBackups,db_cluster_automated_backups +DBClusterAutomatedBackupsArn,db_cluster_automated_backups_arn +DBClusterBacktrack,db_cluster_backtrack +DBClusterBacktrackMessage,db_cluster_backtrack_message +DBClusterBacktrackNotFoundFault,db_cluster_backtrack_not_found_fault +DBClusterBacktracks,db_cluster_backtracks +DBClusterCapacityInfo,db_cluster_capacity_info +DBClusterEndpoint,db_cluster_endpoint +DBClusterEndpointAlreadyExistsFault,db_cluster_endpoint_already_exists_fault +DBClusterEndpointArn,db_cluster_endpoint_arn +DBClusterEndpointIdentifier,db_cluster_endpoint_identifier +DBClusterEndpointMessage,db_cluster_endpoint_message +DBClusterEndpointNotFoundFault,db_cluster_endpoint_not_found_fault +DBClusterEndpointQuotaExceededFault,db_cluster_endpoint_quota_exceeded_fault +DBClusterEndpointResourceIdentifier,db_cluster_endpoint_resource_identifier +DBClusterEndpoints,db_cluster_endpoints +DBClusterIdentifier,db_cluster_identifier +DBClusterIdentifiers,db_cluster_identifiers +DBClusterInstanceClass,db_cluster_instance_class +DBClusterMember,db_cluster_member +DBClusterMembers,db_cluster_members +DBClusterMessage,db_cluster_message +DBClusterNotFoundFault,db_cluster_not_found_fault +DBClusterOptionGroupMemberships,db_cluster_option_group_memberships +DBClusterOptionGroupName,db_cluster_option_group_name +DBClusterOptionGroupStatus,db_cluster_option_group_status +DBClusterParameterGroup,db_cluster_parameter_group +DBClusterParameterGroupArn,db_cluster_parameter_group_arn +DBClusterParameterGroupDetails,db_cluster_parameter_group_details +DBClusterParameterGroupName,db_cluster_parameter_group_name +DBClusterParameterGroupNameMessage,db_cluster_parameter_group_name_message +DBClusterParameterGroupNotFoundFault,db_cluster_parameter_group_not_found_fault +DBClusterParameterGroupStatus,db_cluster_parameter_group_status +DBClusterParameterGroups,db_cluster_parameter_groups +DBClusterParameterGroupsMessage,db_cluster_parameter_groups_message +DBClusterQuotaExceededFault,db_cluster_quota_exceeded_fault +DBClusterRole,db_cluster_role +DBClusterRoleAlreadyExistsFault,db_cluster_role_already_exists_fault +DBClusterRoleNotFoundFault,db_cluster_role_not_found_fault +DBClusterRoleQuotaExceededFault,db_cluster_role_quota_exceeded_fault +DBClusterSnapshot,db_cluster_snapshot +DBClusterSnapshotAlreadyExistsFault,db_cluster_snapshot_already_exists_fault +DBClusterSnapshotArn,db_cluster_snapshot_arn +DBClusterSnapshotAttribute,db_cluster_snapshot_attribute +DBClusterSnapshotAttributes,db_cluster_snapshot_attributes +DBClusterSnapshotAttributesResult,db_cluster_snapshot_attributes_result +DBClusterSnapshotIdentifier,db_cluster_snapshot_identifier +DBClusterSnapshotMessage,db_cluster_snapshot_message +DBClusterSnapshotNotFoundFault,db_cluster_snapshot_not_found_fault +DBClusterSnapshots,db_cluster_snapshots +DBClusters,db_clusters +DBEngineDescription,db_engine_description +DBEngineMediaType,db_engine_media_type +DBEngineVersion,db_engine_version +DBEngineVersionArn,db_engine_version_arn +DBEngineVersionDescription,db_engine_version_description +DBEngineVersionMessage,db_engine_version_message +DBEngineVersions,db_engine_versions +DBInstance,db_instance +DBInstanceAlreadyExistsFault,db_instance_already_exists_fault +DBInstanceArn,db_instance_arn +DBInstanceAutomatedBackup,db_instance_automated_backup +DBInstanceAutomatedBackupMessage,db_instance_automated_backup_message +DBInstanceAutomatedBackupNotFoundFault,db_instance_automated_backup_not_found_fault +DBInstanceAutomatedBackupQuotaExceededFault,db_instance_automated_backup_quota_exceeded_fault +DBInstanceAutomatedBackups,db_instance_automated_backups +DBInstanceAutomatedBackupsArn,db_instance_automated_backups_arn +DBInstanceAutomatedBackupsReplication,db_instance_automated_backups_replication +DBInstanceAutomatedBackupsReplications,db_instance_automated_backups_replications +DBInstanceClass,db_instance_class +DBInstanceCount,db_instance_count +DBInstanceIdentifier,db_instance_identifier +DBInstanceIdentifiers,db_instance_identifiers +DBInstanceMessage,db_instance_message +DBInstanceNotFoundFault,db_instance_not_found_fault +DBInstanceParameterGroupName,db_instance_parameter_group_name +DBInstanceRole,db_instance_role +DBInstanceRoleAlreadyExistsFault,db_instance_role_already_exists_fault +DBInstanceRoleNotFoundFault,db_instance_role_not_found_fault +DBInstanceRoleQuotaExceededFault,db_instance_role_quota_exceeded_fault +DBInstanceStatus,db_instance_status +DBInstanceStatusInfo,db_instance_status_info +DBInstances,db_instances +DBLogFileNotFoundFault,db_log_file_not_found_fault +DBName,db_name +DBParameterGroup,db_parameter_group +DBParameterGroupAlreadyExistsFault,db_parameter_group_already_exists_fault +DBParameterGroupArn,db_parameter_group_arn +DBParameterGroupDetails,db_parameter_group_details +DBParameterGroupFamily,db_parameter_group_family +DBParameterGroupName,db_parameter_group_name +DBParameterGroupNameMessage,db_parameter_group_name_message +DBParameterGroupNotFoundFault,db_parameter_group_not_found_fault +DBParameterGroupQuotaExceededFault,db_parameter_group_quota_exceeded_fault +DBParameterGroupStatus,db_parameter_group_status +DBParameterGroups,db_parameter_groups +DBParameterGroupsMessage,db_parameter_groups_message +DBPortNumber,db_port_number +DBProxies,db_proxies +DBProxy,db_proxy +DBProxyAlreadyExistsFault,db_proxy_already_exists_fault +DBProxyArn,db_proxy_arn +DBProxyEndpoint,db_proxy_endpoint +DBProxyEndpointAlreadyExistsFault,db_proxy_endpoint_already_exists_fault +DBProxyEndpointArn,db_proxy_endpoint_arn +DBProxyEndpointName,db_proxy_endpoint_name +DBProxyEndpointNotFoundFault,db_proxy_endpoint_not_found_fault +DBProxyEndpointQuotaExceededFault,db_proxy_endpoint_quota_exceeded_fault +DBProxyEndpoints,db_proxy_endpoints +DBProxyName,db_proxy_name +DBProxyNotFoundFault,db_proxy_not_found_fault +DBProxyQuotaExceededFault,db_proxy_quota_exceeded_fault +DBProxyTarget,db_proxy_target +DBProxyTargetAlreadyRegisteredFault,db_proxy_target_already_registered_fault +DBProxyTargetGroup,db_proxy_target_group +DBProxyTargetGroupNotFoundFault,db_proxy_target_group_not_found_fault +DBProxyTargetNotFoundFault,db_proxy_target_not_found_fault +DBProxyTargets,db_proxy_targets +DBSecurityGroup,db_security_group +DBSecurityGroupAlreadyExistsFault,db_security_group_already_exists_fault +DBSecurityGroupArn,db_security_group_arn +DBSecurityGroupDescription,db_security_group_description +DBSecurityGroupMembership,db_security_group_membership +DBSecurityGroupMemberships,db_security_group_memberships +DBSecurityGroupMessage,db_security_group_message +DBSecurityGroupName,db_security_group_name +DBSecurityGroupNotFoundFault,db_security_group_not_found_fault +DBSecurityGroupNotSupportedFault,db_security_group_not_supported_fault +DBSecurityGroupQuotaExceededFault,db_security_group_quota_exceeded_fault +DBSecurityGroups,db_security_groups +DBSnapshot,db_snapshot +DBSnapshotAlreadyExistsFault,db_snapshot_already_exists_fault +DBSnapshotArn,db_snapshot_arn +DBSnapshotAttribute,db_snapshot_attribute +DBSnapshotAttributes,db_snapshot_attributes +DBSnapshotAttributesResult,db_snapshot_attributes_result +DBSnapshotIdentifier,db_snapshot_identifier +DBSnapshotMessage,db_snapshot_message +DBSnapshotNotFoundFault,db_snapshot_not_found_fault +DBSnapshots,db_snapshots +DBSubnetGroup,db_subnet_group +DBSubnetGroupAlreadyExistsFault,db_subnet_group_already_exists_fault +DBSubnetGroupArn,db_subnet_group_arn +DBSubnetGroupDescription,db_subnet_group_description +DBSubnetGroupDoesNotCoverEnoughAZs,db_subnet_group_does_not_cover_enough_azs +DBSubnetGroupMessage,db_subnet_group_message +DBSubnetGroupName,db_subnet_group_name +DBSubnetGroupNotAllowedFault,db_subnet_group_not_allowed_fault +DBSubnetGroupNotFoundFault,db_subnet_group_not_found_fault +DBSubnetGroupQuotaExceededFault,db_subnet_group_quota_exceeded_fault +DBSubnetGroups,db_subnet_groups +DBSubnetQuotaExceededFault,db_subnet_quota_exceeded_fault +DBSystemId,db_system_id +DBUpgradeDependencyFailureFault,db_upgrade_dependency_failure_fault +DESIRED,desired +DICOMAccessionNumber,dicom_accession_number +DICOMImportJobProperties,dicom_import_job_properties +DICOMImportJobSummary,dicom_import_job_summary +DICOMNumberOfStudyRelatedInstances,dicom_number_of_study_related_instances +DICOMNumberOfStudyRelatedSeries,dicom_number_of_study_related_series +DICOMPatientBirthDate,dicom_patient_birth_date +DICOMPatientId,dicom_patient_id +DICOMPatientName,dicom_patient_name +DICOMPatientSex,dicom_patient_sex +DICOMStudyDate,dicom_study_date +DICOMStudyDateAndTime,dicom_study_date_and_time +DICOMStudyDescription,dicom_study_description +DICOMStudyId,dicom_study_id +DICOMStudyInstanceUID,dicom_study_instance_uid +DICOMStudyTime,dicom_study_time +DICOMTags,dicom_tags +DICOMUpdates,dicom_updates +DNIS,dnis +DNISEmergencyCallingConfiguration,dnis_emergency_calling_configuration +DNSKEYRecord,dnskey_record +DNSLogs,dns_logs +DNSLogsConfigurationResult,dns_logs_configuration_result +DNSName,dns_name +DNSSECNotFound,dnssec_not_found +DNSSECStatus,dnssec_status +DNSTarget,dns_target +DNSTargetResource,dns_target_resource +DPDTimeoutAction,dpd_timeout_action +DPDTimeoutSeconds,dpd_timeout_seconds +DPUHour,dpu_hour +DPUSeconds,dpu_seconds +DQResultsPublishingOptions,dq_results_publishing_options +DQStopJobOnFailureOptions,dq_stop_job_on_failure_options +DSRecord,ds_record +DTMFInputEvent,dtmf_input_event +DTMFSpecification,dtmf_specification +DagEdges,dag_edges +DagNodes,dag_nodes +DagProcessingLogs,dag_processing_logs +DagS3Path,dag_s3_path +Daily,daily +DailyAutomaticBackupStartTime,daily_automatic_backup_start_time +DailyCap,daily_cap +DailyCommitmentToPurchase,daily_commitment_to_purchase +DailySettings,daily_settings +DailyVolume,daily_volume +DailyVolumes,daily_volumes +DakCertificateMetadata,dak_certificate_metadata +Danger,danger +DangerForeground,danger_foreground +DashAdditionalManifest,dash_additional_manifest +DashConfiguration,dash_configuration +DashConfigurationForPut,dash_configuration_for_put +DashEncryption,dash_encryption +DashIsoEncryptionSettings,dash_iso_encryption_settings +DashIsoGroupSettings,dash_iso_group_settings +DashIsoImageBasedTrickPlaySettings,dash_iso_image_based_trick_play_settings +DashManifest,dash_manifest +DashManifestStyle,dash_manifest_style +DashManifests,dash_manifests +DashPackage,dash_package +DashPlaylistSettings,dash_playlist_settings +DashSignaledSystemIds,dash_signaled_system_ids +Dashboard,dashboard +DashboardArn,dashboard_arn +DashboardAttributes,dashboard_attributes +DashboardBody,dashboard_body +DashboardEnabled,dashboard_enabled +DashboardEntries,dashboard_entries +DashboardEntry,dashboard_entry +DashboardError,dashboard_error +DashboardId,dashboard_id +DashboardInvalidInputError,dashboard_invalid_input_error +DashboardName,dashboard_name +DashboardNamePrefix,dashboard_name_prefix +DashboardNames,dashboard_names +DashboardNotFoundError,dashboard_not_found_error +DashboardOptions,dashboard_options +DashboardPublishOptions,dashboard_publish_options +DashboardSearchFilter,dashboard_search_filter +DashboardSourceEntity,dashboard_source_entity +DashboardSourceTemplate,dashboard_source_template +DashboardSummary,dashboard_summary +DashboardSummaryList,dashboard_summary_list +DashboardValidationMessage,dashboard_validation_message +DashboardValidationMessages,dashboard_validation_messages +DashboardVersion,dashboard_version +DashboardVersionDefinition,dashboard_version_definition +DashboardVersionSummary,dashboard_version_summary +DashboardVersionSummaryList,dashboard_version_summary_list +DashboardVisual,dashboard_visual +DashboardVisualId,dashboard_visual_id +DashboardVisualPublishOptions,dashboard_visual_publish_options +Dashboards,dashboards +Data,data +DataAccessRoleArn,data_access_role_arn +DataAggregation,data_aggregation +DataAlreadyAcceptedException,data_already_accepted_exception +DataAlreadyExistsException,data_already_exists_exception +DataAnalysisEndTime,data_analysis_end_time +DataAnalysisStartTime,data_analysis_start_time +DataAttributes,data_attributes +DataBars,data_bars +DataBarsOptions,data_bars_options +DataCaptureConfig,data_capture_config +DataCaptureConfigSummary,data_capture_config_summary +DataCapturedDestinationS3Uri,data_captured_destination_s3_uri +DataCatalog,data_catalog +DataCatalogConfig,data_catalog_config +DataCatalogEncryptionSettings,data_catalog_encryption_settings +DataCatalogInputDefinition,data_catalog_input_definition +DataCatalogOutput,data_catalog_output +DataCatalogOutputs,data_catalog_outputs +DataCatalogSummary,data_catalog_summary +DataCatalogsSummary,data_catalogs_summary +DataCellsFilter,data_cells_filter +DataCellsFilterResource,data_cells_filter_resource +DataCellsFilters,data_cells_filters +DataChannel,data_channel +DataChannelConcatenationConfiguration,data_channel_concatenation_configuration +DataClassification,data_classification +DataClassificationDetails,data_classification_details +DataCollectionDetails,data_collection_details +DataColor,data_color +DataColorPalette,data_color_palette +DataCompressionType,data_compression_type +DataConfig,data_config +DataConfiguration,data_configuration +DataConnector,data_connector +DataDelayOffsetInMinutes,data_delay_offset_in_minutes +DataDestination,data_destination +DataDistributionType,data_distribution_type +DataDriven,data_driven +DataEncipherment,data_encipherment +DataEncryptionException,data_encryption_exception +DataEncryptionKeyId,data_encryption_key_id +DataEncryptionMetadata,data_encryption_metadata +DataEndTime,data_end_time +DataEndTimeBefore,data_end_time_before +DataEndpoint,data_endpoint +DataExists,data_exists +DataExplorationNotebookLocation,data_exploration_notebook_location +DataExport,data_export +DataFieldSeriesItem,data_field_series_item +DataFormat,data_format +DataFormatConversionConfiguration,data_format_conversion_configuration +DataFrequency,data_frequency +DataId,data_id +DataIngestionJobSummaries,data_ingestion_job_summaries +DataIngestionJobSummary,data_ingestion_job_summary +DataInputConfig,data_input_config +DataInputConfiguration,data_input_configuration +DataIntegrationArn,data_integration_arn +DataIntegrationAssociationArn,data_integration_association_arn +DataIntegrationAssociationSummary,data_integration_association_summary +DataIntegrationAssociations,data_integration_associations +DataIntegrationIdentifier,data_integration_identifier +DataIntegrationSummary,data_integration_summary +DataIntegrations,data_integrations +DataItem,data_item +DataItems,data_items +DataLabelOptions,data_label_options +DataLabelType,data_label_type +DataLabelTypes,data_label_types +DataLabels,data_labels +DataLakeAdmins,data_lake_admins +DataLakeAutoEnableNewAccountConfiguration,data_lake_auto_enable_new_account_configuration +DataLakeConfiguration,data_lake_configuration +DataLakeEncryptionConfiguration,data_lake_encryption_configuration +DataLakeException,data_lake_exception +DataLakeKmsKeyId,data_lake_kms_key_id +DataLakeLifecycleConfiguration,data_lake_lifecycle_configuration +DataLakeLifecycleExpiration,data_lake_lifecycle_expiration +DataLakeLifecycleTransition,data_lake_lifecycle_transition +DataLakePrincipal,data_lake_principal +DataLakePrincipalIdentifier,data_lake_principal_identifier +DataLakeReplicationConfiguration,data_lake_replication_configuration +DataLakeResource,data_lake_resource +DataLakeS3Uri,data_lake_s3_uri +DataLakeSettings,data_lake_settings +DataLakeSource,data_lake_source +DataLakeSourceStatus,data_lake_source_status +DataLakeUpdateException,data_lake_update_exception +DataLakeUpdateStatus,data_lake_update_status +DataLength,data_length +DataLocation,data_location +DataLocationResource,data_location_resource +DataLocationS3,data_location_s3 +DataManifestLocation,data_manifest_location +DataModel,data_model +DataModelConfiguration,data_model_configuration +DataModelS3Configuration,data_model_s3_configuration +DataNodeCount,data_node_count +DataOptions,data_options +DataOutputConfiguration,data_output_configuration +DataPTSControl,data_pts_control +DataPageSize,data_page_size +DataPath,data_path +DataPathColor,data_path_color +DataPathLabelType,data_path_label_type +DataPathList,data_path_list +DataPathOptions,data_path_options +DataPathSort,data_path_sort +DataPathValue,data_path_value +DataPipelineId,data_pipeline_id +DataPoint,data_point +DataPointDrillUpDownOption,data_point_drill_up_down_option +DataPointMenuLabelOption,data_point_menu_label_option +DataPointTooltipOption,data_point_tooltip_option +DataPoints,data_points +DataPolicyCount,data_policy_count +DataPreProcessingConfiguration,data_pre_processing_configuration +DataPreviewOptions,data_preview_options +DataPrivacy,data_privacy +DataProcessing,data_processing +DataProtectionPolicy,data_protection_policy +DataProvider,data_provider +DataProviderArn,data_provider_arn +DataProviderCreationTime,data_provider_creation_time +DataProviderDescriptor,data_provider_descriptor +DataProviderDescriptorDefinition,data_provider_descriptor_definition +DataProviderIdentifier,data_provider_identifier +DataProviderName,data_provider_name +DataProviders,data_providers +DataPullMode,data_pull_mode +DataQualityAppSpecification,data_quality_app_specification +DataQualityBaselineConfig,data_quality_baseline_config +DataQualityEvaluationRunAdditionalRunOptions,data_quality_evaluation_run_additional_run_options +DataQualityJobInput,data_quality_job_input +DataQualityJobOutputConfig,data_quality_job_output_config +DataQualityMetric,data_quality_metric +DataQualityMetricList,data_quality_metric_list +DataQualityResult,data_quality_result +DataQualityResultDescription,data_quality_result_description +DataQualityResultFilterCriteria,data_quality_result_filter_criteria +DataQualityRuleRecommendationRunDescription,data_quality_rule_recommendation_run_description +DataQualityRuleRecommendationRunFilter,data_quality_rule_recommendation_run_filter +DataQualityRuleResult,data_quality_rule_result +DataQualityRulesetEvaluationRunDescription,data_quality_ruleset_evaluation_run_description +DataQualityRulesetEvaluationRunFilter,data_quality_ruleset_evaluation_run_filter +DataQualityRulesetFilterCriteria,data_quality_ruleset_filter_criteria +DataQualityRulesetListDetails,data_quality_ruleset_list_details +DataQualitySummary,data_quality_summary +DataQualityTargetTable,data_quality_target_table +DataQueries,data_queries +DataQuery,data_query +DataRate,data_rate +DataRearrangement,data_rearrangement +DataReplicationCounterpart,data_replication_counterpart +DataReplicationError,data_replication_error +DataReplicationInfo,data_replication_info +DataReplicationInfoReplicatedDisk,data_replication_info_replicated_disk +DataReplicationInitiation,data_replication_initiation +DataReplicationInitiationStep,data_replication_initiation_step +DataReplicationMetadata,data_replication_metadata +DataReplicationMetadataOutput,data_replication_metadata_output +DataReplicationMode,data_replication_mode +DataReplicationPrimaryBrokerArn,data_replication_primary_broker_arn +DataReplicationRole,data_replication_role +DataRepositoryAssociation,data_repository_association +DataRepositoryAssociationIds,data_repository_association_ids +DataRepositoryAssociationNotFound,data_repository_association_not_found +DataRepositoryAssociations,data_repository_associations +DataRepositoryConfiguration,data_repository_configuration +DataRepositoryFailureDetails,data_repository_failure_details +DataRepositoryPath,data_repository_path +DataRepositorySubdirectories,data_repository_subdirectories +DataRepositoryTask,data_repository_task +DataRepositoryTaskEnded,data_repository_task_ended +DataRepositoryTaskExecuting,data_repository_task_executing +DataRepositoryTaskFailureDetails,data_repository_task_failure_details +DataRepositoryTaskFilter,data_repository_task_filter +DataRepositoryTaskNotFound,data_repository_task_not_found +DataRepositoryTaskStatus,data_repository_task_status +DataRepositoryTasks,data_repository_tasks +DataResource,data_resource +DataResources,data_resources +DataResponse,data_response +DataResponses,data_responses +DataRetentionChangeInHours,data_retention_change_in_hours +DataRetentionInHours,data_retention_in_hours +DataRetentionOptIn,data_retention_opt_in +DataRetentionSupport,data_retention_support +DataRetrievalPolicy,data_retrieval_policy +DataRetrievalRule,data_retrieval_rule +DataScannedBytes,data_scanned_bytes +DataScannedInBytes,data_scanned_in_bytes +DataSchema,data_schema +DataSchemaLocationS3,data_schema_location_s3 +DataSchemaUri,data_schema_uri +DataSecurityConfig,data_security_config +DataSet,data_set +DataSetArn,data_set_arn +DataSetArns,data_set_arns +DataSetConfiguration,data_set_configuration +DataSetConfigurations,data_set_configurations +DataSetEntry,data_set_entry +DataSetId,data_set_id +DataSetIdentifier,data_set_identifier +DataSetIdentifierDeclaration,data_set_identifier_declaration +DataSetIdentifierDeclarations,data_set_identifier_declarations +DataSetImportItem,data_set_import_item +DataSetImportSummary,data_set_import_summary +DataSetImportTask,data_set_import_task +DataSetName,data_set_name +DataSetParameterName,data_set_parameter_name +DataSetPlaceholder,data_set_placeholder +DataSetReference,data_set_reference +DataSetReferences,data_set_references +DataSetRefreshProperties,data_set_refresh_properties +DataSetSchema,data_set_schema +DataSetSearchFilter,data_set_search_filter +DataSetSummaries,data_set_summaries +DataSetSummary,data_set_summary +DataSetUsageConfiguration,data_set_usage_configuration +DataSets,data_sets +DataShare,data_share +DataShareArn,data_share_arn +DataShareAssociation,data_share_association +DataShareAssociations,data_share_associations +DataShares,data_shares +DataSharingPreference,data_sharing_preference +DataSharingPreferenceForUpdate,data_sharing_preference_for_update +DataSize,data_size +DataSizeInBytes,data_size_in_bytes +DataSnapshotTime,data_snapshot_time +DataSource,data_source +DataSourceArn,data_source_arn +DataSourceConfig,data_source_config +DataSourceConfiguration,data_source_configuration +DataSourceConfigurations,data_source_configurations +DataSourceConfigurationsResult,data_source_configurations_result +DataSourceCredentials,data_source_credentials +DataSourceErrorCode,data_source_error_code +DataSourceErrorInfo,data_source_error_info +DataSourceFieldName,data_source_field_name +DataSourceFreeTrial,data_source_free_trial +DataSourceGroup,data_source_group +DataSourceGroups,data_source_groups +DataSourceId,data_source_id +DataSourceIds,data_source_ids +DataSourceName,data_source_name +DataSourceParameters,data_source_parameters +DataSourceS3Configuration,data_source_s3_configuration +DataSourceSchema,data_source_schema +DataSourceSearchFilter,data_source_search_filter +DataSourceSummaries,data_source_summaries +DataSourceSummary,data_source_summary +DataSourceSyncJob,data_source_sync_job +DataSourceSyncJobId,data_source_sync_job_id +DataSourceSyncJobMetricTarget,data_source_sync_job_metric_target +DataSourceSyncJobMetrics,data_source_sync_job_metrics +DataSourceToIndexFieldMapping,data_source_to_index_field_mapping +DataSourceVpcConfiguration,data_source_vpc_configuration +DataSources,data_sources +DataSourcesFreeTrial,data_sources_free_trial +DataSpec,data_spec +DataSplitConfig,data_split_config +DataStartTime,data_start_time +DataStartTimeAfter,data_start_time_after +DataStorage,data_storage +DataStorageConfig,data_storage_config +DataTableColumns,data_table_columns +DataTableName,data_table_name +DataTiering,data_tiering +DataTieringEnabled,data_tiering_enabled +DataTraceEnabled,data_trace_enabled +DataTransfer,data_transfer +DataTransferApi,data_transfer_api +DataTransferProgress,data_transfer_progress +DataTransferProgressPercent,data_transfer_progress_percent +DataTransferProtection,data_transfer_protection +DataTransferSubscriberFeePercent,data_transfer_subscriber_fee_percent +DataTransferredInMegaBytes,data_transferred_in_mega_bytes +DataTransforms,data_transforms +DataType,data_type +DataTypeMapping,data_type_mapping +DataUnavailableException,data_unavailable_exception +DataUploadFrequency,data_upload_frequency +DataValidationMetrics,data_validation_metrics +DataValue,data_value +DataViewDestinationTypeParams,data_view_destination_type_params +DataViewErrorInfo,data_view_error_info +DataViewSummary,data_view_summary +DataVolumeKMSKeyId,data_volume_kms_key_id +DataWrites,data_writes +Database,database +DatabaseARN,database_arn +DatabaseARNUpdate,database_arn_update +DatabaseArn,database_arn +DatabaseConfigDetail,database_config_detail +DatabaseConfiguration,database_configuration +DatabaseConnectionException,database_connection_exception +DatabaseCredentials,database_credentials +DatabaseEdition,database_edition +DatabaseEngine,database_engine +DatabaseEngineType,database_engine_type +DatabaseHost,database_host +DatabaseId,database_id +DatabaseIdentifier,database_identifier +DatabaseIds,database_ids +DatabaseInformation,database_information +DatabaseInput,database_input +DatabaseInputDefinition,database_input_definition +DatabaseInstallationFilesS3BucketName,database_installation_files_s3_bucket_name +DatabaseInstallationFilesS3Prefix,database_installation_files_s3_prefix +DatabaseInstance,database_instance +DatabaseInstanceSoftwareDetailsResponse,database_instance_software_details_response +DatabaseIpAddress,database_ip_address +DatabaseLFTagPolicy,database_lf_tag_policy +DatabaseLFTagPolicyAndPermissions,database_lf_tag_policy_and_permissions +DatabaseList,database_list +DatabaseMode,database_mode +DatabaseName,database_name +DatabaseOptions,database_options +DatabaseOutput,database_output +DatabaseOutputMode,database_output_mode +DatabaseOutputs,database_outputs +DatabasePort,database_port +DatabasePreferences,database_preferences +DatabaseResource,database_resource +DatabaseResponse,database_response +DatabaseRevision,database_revision +DatabaseRevisionReleaseDate,database_revision_release_date +DatabaseShortInfoResponse,database_short_info_response +DatabaseSummary,database_summary +DatabaseTableName,database_table_name +DatabaseTableOutputOptions,database_table_output_options +DatabaseType,database_type +DatabaseUserName,database_user_name +DatabaseVersion,database_version +Databases,databases +DatabricksParameters,databricks_parameters +Datadog,datadog +DatadogConnectorProfileCredentials,datadog_connector_profile_credentials +DatadogConnectorProfileProperties,datadog_connector_profile_properties +DatadogSourceProperties,datadog_source_properties +DataflowDetail,dataflow_detail +DataflowEndpoint,dataflow_endpoint +DataflowEndpointConfig,dataflow_endpoint_config +DataflowEndpointGroupIdResponse,dataflow_endpoint_group_id_response +DataflowEndpointListItem,dataflow_endpoint_list_item +Datapoint,datapoint +Datapoints,datapoints +DatapointsToAlarm,datapoints_to_alarm +DatapointsToAlert,datapoints_to_alert +Dataset,dataset +DatasetAction,dataset_action +DatasetActionSummary,dataset_action_summary +DatasetArn,dataset_arn +DatasetArns,dataset_arns +DatasetAugmentedManifestsListItem,dataset_augmented_manifests_list_item +DatasetChanges,dataset_changes +DatasetContentDeliveryDestination,dataset_content_delivery_destination +DatasetContentDeliveryRule,dataset_content_delivery_rule +DatasetContentStatus,dataset_content_status +DatasetContentSummary,dataset_content_summary +DatasetContentVersionValue,dataset_content_version_value +DatasetCount,dataset_count +DatasetDefinition,dataset_definition +DatasetDeletedAfterRequestedSyncCount,dataset_deleted_after_requested_sync_count +DatasetDescription,dataset_description +DatasetDocumentClassifierInputDataConfig,dataset_document_classifier_input_data_config +DatasetEntityRecognizerAnnotations,dataset_entity_recognizer_annotations +DatasetEntityRecognizerDocuments,dataset_entity_recognizer_documents +DatasetEntityRecognizerEntityList,dataset_entity_recognizer_entity_list +DatasetEntityRecognizerInputDataConfig,dataset_entity_recognizer_input_data_config +DatasetEntries,dataset_entries +DatasetEntry,dataset_entry +DatasetExists,dataset_exists +DatasetExportJob,dataset_export_job +DatasetExportJobOutput,dataset_export_job_output +DatasetExportJobSummary,dataset_export_job_summary +DatasetFilter,dataset_filter +DatasetFormat,dataset_format +DatasetGroundTruthManifest,dataset_ground_truth_manifest +DatasetGroup,dataset_group +DatasetGroupArn,dataset_group_arn +DatasetGroupName,dataset_group_name +DatasetGroupSummary,dataset_group_summary +DatasetGroups,dataset_groups +DatasetId,dataset_id +DatasetImageStats,dataset_image_stats +DatasetImportJob,dataset_import_job +DatasetImportJobArn,dataset_import_job_arn +DatasetImportJobArns,dataset_import_job_arns +DatasetImportJobName,dataset_import_job_name +DatasetImportJobSummary,dataset_import_job_summary +DatasetImportJobs,dataset_import_jobs +DatasetInputDataConfig,dataset_input_data_config +DatasetLabelDescription,dataset_label_description +DatasetLabelDescriptions,dataset_label_descriptions +DatasetLabelStats,dataset_label_stats +DatasetMetadata,dataset_metadata +DatasetName,dataset_name +DatasetNameBeginsWith,dataset_name_begins_with +DatasetOwnerInfo,dataset_owner_info +DatasetParameter,dataset_parameter +DatasetParameters,dataset_parameters +DatasetProperties,dataset_properties +DatasetPropertiesList,dataset_properties_list +DatasetRowDateGranularity,dataset_row_date_granularity +DatasetS3Uri,dataset_s3_uri +DatasetSchema,dataset_schema +DatasetSchemaSummary,dataset_schema_summary +DatasetSource,dataset_source +DatasetStatisticsConfiguration,dataset_statistics_configuration +DatasetStats,dataset_stats +DatasetSummaries,dataset_summaries +DatasetSummary,dataset_summary +DatasetSyncCount,dataset_sync_count +DatasetTrigger,dataset_trigger +DatasetType,dataset_type +DatasetUpdateSummary,dataset_update_summary +Datasets,datasets +DatasourcePackageIngestDetail,datasource_package_ingest_detail +DatasourcePackageIngestHistory,datasource_package_ingest_history +DatasourcePackageIngestState,datasource_package_ingest_state +DatasourcePackageIngestStates,datasource_package_ingest_states +DatasourcePackageUsageInfo,datasource_package_usage_info +DatasourcePackages,datasource_packages +Datastore,datastore +DatastoreActivity,datastore_activity +DatastoreArn,datastore_arn +DatastoreEndpoint,datastore_endpoint +DatastoreFilter,datastore_filter +DatastoreId,datastore_id +DatastoreIotSiteWiseMultiLayerStorage,datastore_iot_site_wise_multi_layer_storage +DatastoreIotSiteWiseMultiLayerStorageSummary,datastore_iot_site_wise_multi_layer_storage_summary +DatastoreName,datastore_name +DatastorePartition,datastore_partition +DatastorePartitions,datastore_partitions +DatastoreProperties,datastore_properties +DatastorePropertiesList,datastore_properties_list +DatastoreStatistics,datastore_statistics +DatastoreStatus,datastore_status +DatastoreStorageSummary,datastore_storage_summary +DatastoreSummary,datastore_summary +DatastoreTypeVersion,datastore_type_version +Datatype,datatype +Date,date +DateAggregationFunction,date_aggregation_function +DateArrayOptions,date_array_options +DateAxisOptions,date_axis_options +DateColumnStatisticsData,date_column_statistics_data +DateCreated,date_created +DateDimensionField,date_dimension_field +DateEnabled,date_enabled +DateFieldFormat,date_field_format +DateFilter,date_filter +DateFormat,date_format +DateGranularity,date_granularity +DateImported,date_imported +DateInterval,date_interval +DateMeasureField,date_measure_field +DateModified,date_modified +DateNewProvisioningDataAvailable,date_new_provisioning_data_available +DateOptions,date_options +DatePartitionDelimiter,date_partition_delimiter +DatePartitionEnabled,date_partition_enabled +DatePartitionSequence,date_partition_sequence +DatePartitionTimezone,date_partition_timezone +DateProvisioned,date_provisioned +DateRange,date_range +DateRangeFilter,date_range_filter +DateRangeType,date_range_type +DateReference,date_reference +DateTime,date_time +DateTimeDatasetParameter,date_time_dataset_parameter +DateTimeDatasetParameterDefaultValues,date_time_dataset_parameter_default_values +DateTimeDefaultValues,date_time_default_values +DateTimeFormat,date_time_format +DateTimeFormatConfiguration,date_time_format_configuration +DateTimeHierarchy,date_time_hierarchy +DateTimeParameter,date_time_parameter +DateTimeParameterDeclaration,date_time_parameter_declaration +DateTimeParameters,date_time_parameters +DateTimePicker,date_time_picker +DateTimePickerControlDisplayOptions,date_time_picker_control_display_options +DateTimeRange,date_time_range +DateTimeStaticValues,date_time_static_values +DateTimeValueWhenUnsetConfiguration,date_time_value_when_unset_configuration +DateTimeValues,date_time_values +DateUpdated,date_updated +DateValue,date_value +Datetime,datetime +DatetimeFormat,datetime_format +DatetimeOptions,datetime_options +DatetimeRange,datetime_range +DatetimeTypeFieldName,datetime_type_field_name +Datum,datum +Day,day +DayOfMonth,day_of_month +DayOfTheWeek,day_of_the_week +DayOfWeek,day_of_week +Days,days +DaysAfterInitiation,days_after_initiation +DaysBeforeExpiry,days_before_expiry +DaysOfWeek,days_of_week +DbClusterIdentifier,db_cluster_identifier +DbClusterMembers,db_cluster_members +DbClusterOptionGroupMemberships,db_cluster_option_group_memberships +DbClusterOptionGroupName,db_cluster_option_group_name +DbClusterParameterGroup,db_cluster_parameter_group +DbClusterParameterGroupStatus,db_cluster_parameter_group_status +DbClusterResourceId,db_cluster_resource_id +DbClusterSnapshotAttributes,db_cluster_snapshot_attributes +DbClusterSnapshotIdentifier,db_cluster_snapshot_identifier +DbGroups,db_groups +DbInstanceArn,db_instance_arn +DbInstanceClass,db_instance_class +DbInstanceIdentifier,db_instance_identifier +DbInstancePort,db_instance_port +DbInstanceStatus,db_instance_status +DbName,db_name +DbParameterGroupName,db_parameter_group_name +DbParameterGroups,db_parameter_groups +DbPassword,db_password +DbSecurityGroupArn,db_security_group_arn +DbSecurityGroupDescription,db_security_group_description +DbSecurityGroupName,db_security_group_name +DbSecurityGroups,db_security_groups +DbSnapshotIdentifier,db_snapshot_identifier +DbSubnetGroup,db_subnet_group +DbSubnetGroupArn,db_subnet_group_arn +DbSubnetGroupDescription,db_subnet_group_description +DbSubnetGroupName,db_subnet_group_name +DbUser,db_user +DbiResourceId,dbi_resource_id +DcFilter,dc_filter +DdlArtifactsSchema,ddl_artifacts_schema +Ddls,ddls +DdsHandling,dds_handling +DdsXCoordinate,dds_x_coordinate +DdsYCoordinate,dds_y_coordinate +DeactivateAnomalyDetectorRequest,deactivate_anomaly_detector_request +DeactivateContactChannelRequest,deactivate_contact_channel_request +DeactivateDeviceIdentifierRequest,deactivate_device_identifier_request +DeactivateDeviceIdentifierResponse,deactivate_device_identifier_response +DeactivateEvaluationFormRequest,deactivate_evaluation_form_request +DeactivateEvaluationFormResponse,deactivate_evaluation_form_response +DeactivateEventSourceRequest,deactivate_event_source_request +DeactivateKeySigningKeyRequest,deactivate_key_signing_key_request +DeactivateKeySigningKeyResponse,deactivate_key_signing_key_response +DeactivateMFADeviceRequest,deactivate_mfa_device_request +DeactivatePipelineInput,deactivate_pipeline_input +DeactivateTypeInput,deactivate_type_input +DeactivateUserRequest,deactivate_user_request +DeactivatingLastSystemUserException,deactivating_last_system_user_exception +DeadLetterConfig,dead_letter_config +DeadLetterQueueUrl,dead_letter_queue_url +DeadLetterTargetArn,dead_letter_target_arn +Deadline,deadline +DeauthorizeConnectionRequest,deauthorize_connection_request +DeauthorizeConnectionResponse,deauthorize_connection_response +DeauthorizeDataShareMessage,deauthorize_data_share_message +DeblockFilter,deblock_filter +DebugHookConfig,debug_hook_config +DebugLogDeliveryAccounts,debug_log_delivery_accounts +DebugLogging,debug_logging +DebugRuleConfiguration,debug_rule_configuration +DebugRuleConfigurations,debug_rule_configurations +DebugRuleEvaluationStatus,debug_rule_evaluation_status +DebugRuleEvaluationStatuses,debug_rule_evaluation_statuses +DebugSession,debug_session +DecimalColumnStatisticsData,decimal_column_statistics_data +DecimalDatasetParameter,decimal_dataset_parameter +DecimalDatasetParameterDefaultValues,decimal_dataset_parameter_default_values +DecimalDefaultValues,decimal_default_values +DecimalNumber,decimal_number +DecimalParameter,decimal_parameter +DecimalParameterDeclaration,decimal_parameter_declaration +DecimalParameters,decimal_parameters +DecimalPlaces,decimal_places +DecimalPlacesConfiguration,decimal_places_configuration +DecimalSeparator,decimal_separator +DecimalStaticValues,decimal_static_values +DecimalValueWhenUnsetConfiguration,decimal_value_when_unset_configuration +DecimalValues,decimal_values +DecimalizationTable,decimalization_table +DecipherOnly,decipher_only +Decision,decision +DecisionTask,decision_task +DecisionTaskCompletedEventAttributes,decision_task_completed_event_attributes +DecisionTaskScheduledEventAttributes,decision_task_scheduled_event_attributes +DecisionTaskStartedEventAttributes,decision_task_started_event_attributes +DecisionTaskTimedOutEventAttributes,decision_task_timed_out_event_attributes +Declared,declared +DeclaredTransforms,declared_transforms +DeclineHandshakeRequest,decline_handshake_request +DeclineHandshakeResponse,decline_handshake_response +DeclineInvitationsRequest,decline_invitations_request +DeclineInvitationsResponse,decline_invitations_response +DecodeAuthorizationMessageRequest,decode_authorization_message_request +DecodeAuthorizationMessageResponse,decode_authorization_message_response +DecodeConfig,decode_config +DecodedMessage,decoded_message +DecoderManifestSummary,decoder_manifest_summary +DecoderManifestValidationException,decoder_manifest_validation_exception +DecommissionTimeout,decommission_timeout +DecreaseNodeGroupsInGlobalReplicationGroupMessage,decrease_node_groups_in_global_replication_group_message +DecreaseNodeGroupsInGlobalReplicationGroupResult,decrease_node_groups_in_global_replication_group_result +DecreaseReplicaCountMessage,decrease_replica_count_message +DecreaseReplicaCountResult,decrease_replica_count_result +DecreaseReplicationFactorRequest,decrease_replication_factor_request +DecreaseReplicationFactorResponse,decrease_replication_factor_response +DecreaseStreamRetentionPeriodInput,decrease_stream_retention_period_input +Decrypt,decrypt +DecryptDataInput,decrypt_data_input +DecryptDataOutput,decrypt_data_output +DecryptRequest,decrypt_request +DecryptResponse,decrypt_response +DecryptStepDetails,decrypt_step_details +Decryption,decryption +DecryptionAttributes,decryption_attributes +DecryptionFailure,decryption_failure +DecryptionMode,decryption_mode +DecryptionSettings,decryption_settings +DedicatedHostIds,dedicated_host_ids +DedicatedHostsSupported,dedicated_hosts_supported +DedicatedIp,dedicated_ip +DedicatedIpAutoWarmupEnabled,dedicated_ip_auto_warmup_enabled +DedicatedIpPool,dedicated_ip_pool +DedicatedIpPools,dedicated_ip_pools +DedicatedIps,dedicated_ips +DedicatedMaster,dedicated_master +DedicatedMasterCount,dedicated_master_count +DedicatedMasterEnabled,dedicated_master_enabled +DedicatedMasterType,dedicated_master_type +DedicatedTenancyManagementCidrRange,dedicated_tenancy_management_cidr_range +DedicatedTenancySupport,dedicated_tenancy_support +Default,default +DefaultAction,default_action +DefaultActions,default_actions +DefaultActivity,default_activity +DefaultAdmin,default_admin +DefaultAllocatedStorage,default_allocated_storage +DefaultArguments,default_arguments +DefaultAssociationRouteTable,default_association_route_table +DefaultAuthType,default_auth_type +DefaultAuthenticationMethod,default_authentication_method +DefaultAvailabilityZone,default_availability_zone +DefaultBaseline,default_baseline +DefaultBehavior,default_behavior +DefaultBranchCannotBeDeletedException,default_branch_cannot_be_deleted_exception +DefaultButtonConfiguration,default_button_configuration +DefaultCacheBehavior,default_cache_behavior +DefaultCapacityProviderStrategy,default_capacity_provider_strategy +DefaultCategoricalHyperParameterRange,default_categorical_hyper_parameter_range +DefaultCellWidth,default_cell_width +DefaultCertificateForNewLaunches,default_certificate_for_new_launches +DefaultCharacterSet,default_character_set +DefaultClientBrandingAttributes,default_client_branding_attributes +DefaultClusterParameters,default_cluster_parameters +DefaultCodeRepository,default_code_repository +DefaultCodeRepositoryContains,default_code_repository_contains +DefaultConditionalBranch,default_conditional_branch +DefaultConferenceProviderArn,default_conference_provider_arn +DefaultConfig,default_config +DefaultContent,default_content +DefaultContinuousHyperParameterRange,default_continuous_hyper_parameter_range +DefaultControlPanel,default_control_panel +DefaultCooldown,default_cooldown +DefaultCores,default_cores +DefaultDateColumnName,default_date_column_name +DefaultDetection,default_detection +DefaultDimensionValue,default_dimension_value +DefaultDocumentIdFormat,default_document_id_format +DefaultDomain,default_domain +DefaultEmailCustomizationTemplate,default_email_customization_template +DefaultEmailOption,default_email_option +DefaultEmailTags,default_email_tags +DefaultEncryptionKey,default_encryption_key +DefaultErrorDetails,default_error_details +DefaultExecutorDpuSize,default_executor_dpu_size +DefaultExpirationDays,default_expiration_days +DefaultExportDestination,default_export_destination +DefaultFieldValues,default_field_values +DefaultForAz,default_for_az +DefaultFormatting,default_formatting +DefaultFreeFormLayoutConfiguration,default_free_form_layout_configuration +DefaultGateway,default_gateway +DefaultGid,default_gid +DefaultGridLayoutConfiguration,default_grid_layout_configuration +DefaultHyperParameterRanges,default_hyper_parameter_ranges +DefaultIamRoleArn,default_iam_role_arn +DefaultImportClientBrandingAttributes,default_import_client_branding_attributes +DefaultInstanceName,default_instance_name +DefaultInstanceProfileArn,default_instance_profile_arn +DefaultInstanceWarmup,default_instance_warmup +DefaultIntegerHyperParameterRange,default_integer_hyper_parameter_range +DefaultInteractiveLayoutConfiguration,default_interactive_layout_configuration +DefaultLicense,default_license +DefaultList,default_list +DefaultLists,default_lists +DefaultLogLevel,default_log_level +DefaultMailDomain,default_mail_domain +DefaultMessage,default_message +DefaultMessageType,default_message_type +DefaultNamespace,default_namespace +DefaultNetworkCardIndex,default_network_card_index +DefaultNewSheetConfiguration,default_new_sheet_configuration +DefaultOnly,default_only +DefaultOptionRefId,default_option_ref_id +DefaultOs,default_os +DefaultOu,default_ou +DefaultOutboundQueueId,default_outbound_queue_id +DefaultPaginatedLayoutConfiguration,default_paginated_layout_configuration +DefaultPhoneNumber,default_phone_number +DefaultPort,default_port +DefaultPropagationRouteTable,default_propagation_route_table +DefaultPushNotificationMessage,default_push_notification_message +DefaultPushNotificationTemplate,default_push_notification_template +DefaultRecipes,default_recipes +DefaultRedirectURI,default_redirect_uri +DefaultResourceDiscoveryAssociationId,default_resource_discovery_association_id +DefaultResourceDiscoveryId,default_resource_discovery_id +DefaultResourceSpec,default_resource_spec +DefaultResult,default_result +DefaultRetention,default_retention +DefaultRootDeviceType,default_root_device_type +DefaultRootObject,default_root_object +DefaultRoute,default_route +DefaultRouteInput,default_route_input +DefaultRouteSettings,default_route_settings +DefaultRouteTableAssociation,default_route_table_association +DefaultRouteTablePropagation,default_route_table_propagation +DefaultRunProperties,default_run_properties +DefaultRuntimeContextDevice,default_runtime_context_device +DefaultRuntimeContextDeviceName,default_runtime_context_device_name +DefaultS3Location,default_s3_location +DefaultSectionBasedLayoutConfiguration,default_section_based_layout_configuration +DefaultSecurityGroupNames,default_security_group_names +DefaultSegmentDeliveryConfiguration,default_segment_delivery_configuration +DefaultSelection,default_selection +DefaultSenderId,default_sender_id +DefaultSeriesSettings,default_series_settings +DefaultServerSideEncryption,default_server_side_encryption +DefaultSessionExpiryMinutes,default_session_expiry_minutes +DefaultSizeInspectionLimit,default_size_inspection_limit +DefaultSpaceSettings,default_space_settings +DefaultSshKeyName,default_ssh_key_name +DefaultState,default_state +DefaultStorageClass,default_storage_class +DefaultSubnetId,default_subnet_id +DefaultSubscriptionStatus,default_subscription_status +DefaultSubstitutions,default_substitutions +DefaultTTL,default_ttl +DefaultTags,default_tags +DefaultTargetCapacityType,default_target_capacity_type +DefaultTargetInstance,default_target_instance +DefaultTemplateData,default_template_data +DefaultTheme,default_theme +DefaultThreadsPerCore,default_threads_per_core +DefaultUid,default_uid +DefaultUndefinedFault,default_undefined_fault +DefaultUserAssociatedToUserGroupFault,default_user_associated_to_user_group_fault +DefaultUserRequired,default_user_required +DefaultUserSettings,default_user_settings +DefaultVCpus,default_v_cpus +DefaultValue,default_value +DefaultValueColumn,default_value_column +DefaultValues,default_values +DefaultVersion,default_version +DefaultVersionId,default_version_id +DefaultVersionName,default_version_name +DefaultVersionNumber,default_version_number +DefaultVocabulary,default_vocabulary +DefaultVocabularyList,default_vocabulary_list +DefaultWatchlist,default_watchlist +DefaultWatchlistId,default_watchlist_id +DefaultWorkspaceCreationProperties,default_workspace_creation_properties +Defaults,defaults +DeferActivation,defer_activation +DeferMaintenance,defer_maintenance +DeferMaintenanceDuration,defer_maintenance_duration +DeferMaintenanceEndTime,defer_maintenance_end_time +DeferMaintenanceIdentifier,defer_maintenance_identifier +DeferMaintenanceStartTime,defer_maintenance_start_time +DeferredMaintenanceWindow,deferred_maintenance_window +DeferredMaintenanceWindows,deferred_maintenance_windows +DefineAnalysisSchemeRequest,define_analysis_scheme_request +DefineAnalysisSchemeResponse,define_analysis_scheme_response +DefineAuthChallenge,define_auth_challenge +DefineExpressionRequest,define_expression_request +DefineExpressionResponse,define_expression_response +DefineIndexFieldRequest,define_index_field_request +DefineIndexFieldResponse,define_index_field_response +DefineSegment,define_segment +DefineSuggesterRequest,define_suggester_request +DefineSuggesterResponse,define_suggester_response +Definition,definition +DefinitionArn,definition_arn +DefinitionDocument,definition_document +DefinitionInformation,definition_information +DefinitionName,definition_name +DefinitionTimestamp,definition_timestamp +DefinitionType,definition_type +Definitions,definitions +Degraded,degraded +Deinterlacer,deinterlacer +Delay,delay +DelaySeconds,delay_seconds +DelayUntilElbConnectionsDrained,delay_until_elb_connections_drained +Delegate,delegate +DelegatedAdmin,delegated_admin +DelegatedAdminAccount,delegated_admin_account +DelegatedAdminAccountId,delegated_admin_account_id +DelegatedAdminAccountLimitExceededException,delegated_admin_account_limit_exceeded_exception +DelegatedAdministrator,delegated_administrator +DelegatedAdministrators,delegated_administrators +DelegatedService,delegated_service +DelegatedServices,delegated_services +Delegates,delegates +Delegation,delegation +DelegationEnabledDate,delegation_enabled_date +DelegationMetadata,delegation_metadata +DelegationSet,delegation_set +DelegationSetAlreadyCreated,delegation_set_already_created +DelegationSetAlreadyReusable,delegation_set_already_reusable +DelegationSetId,delegation_set_id +DelegationSetInUse,delegation_set_in_use +DelegationSetNotAvailable,delegation_set_not_available +DelegationSetNotReusable,delegation_set_not_reusable +DelegationSets,delegation_sets +DelegationTime,delegation_time +Delete,delete +DeleteACLRequest,delete_acl_request +DeleteACLResponse,delete_acl_response +DeleteAcceleratorRequest,delete_accelerator_request +DeleteAccessControlConfigurationRequest,delete_access_control_configuration_request +DeleteAccessControlRuleRequest,delete_access_control_rule_request +DeleteAccessKeyRequest,delete_access_key_request +DeleteAccessLogSettingsRequest,delete_access_log_settings_request +DeleteAccessLogSubscriptionRequest,delete_access_log_subscription_request +DeleteAccessPointForObjectLambdaRequest,delete_access_point_for_object_lambda_request +DeleteAccessPointInput,delete_access_point_input +DeleteAccessPointPolicyForObjectLambdaRequest,delete_access_point_policy_for_object_lambda_request +DeleteAccessPointPolicyRequest,delete_access_point_policy_request +DeleteAccessPointRequest,delete_access_point_request +DeleteAccessPolicyRequest,delete_access_policy_request +DeleteAccessRequest,delete_access_request +DeleteAccessTokenRequest,delete_access_token_request +DeleteAccessorInput,delete_accessor_input +DeleteAccountAliasRequest,delete_account_alias_request +DeleteAccountAssignmentRequest,delete_account_assignment_request +DeleteAccountAssignmentResponse,delete_account_assignment_response +DeleteAccountAuditConfigurationRequest,delete_account_audit_configuration_request +DeleteAccountCustomizationRequest,delete_account_customization_request +DeleteAccountCustomizationResponse,delete_account_customization_response +DeleteAccountPolicyRequest,delete_account_policy_request +DeleteAccountRequest,delete_account_request +DeleteAccountSettingRequest,delete_account_setting_request +DeleteAccountSettingResponse,delete_account_setting_response +DeleteAccountSubscriptionRequest,delete_account_subscription_request +DeleteAccountSubscriptionResponse,delete_account_subscription_response +DeleteActionRequest,delete_action_request +DeleteActionResponse,delete_action_response +DeleteActionTargetRequest,delete_action_target_request +DeleteActionTargetResponse,delete_action_target_response +DeleteActivationRequest,delete_activation_request +DeleteActivityInput,delete_activity_input +DeleteAddonRequest,delete_addon_request +DeleteAddonResponse,delete_addon_response +DeleteAddressBookRequest,delete_address_book_request +DeleteAdmChannelRequest,delete_adm_channel_request +DeleteAdmChannelResponse,delete_adm_channel_response +DeleteAfterDays,delete_after_days +DeleteAfterUpload,delete_after_upload +DeleteAgentRequest,delete_agent_request +DeleteAggregationAuthorizationRequest,delete_aggregation_authorization_request +DeleteAgreementRequest,delete_agreement_request +DeleteAlarmModelRequest,delete_alarm_model_request +DeleteAlarmRequest,delete_alarm_request +DeleteAlarmResult,delete_alarm_result +DeleteAlarmsInput,delete_alarms_input +DeleteAlertManagerDefinitionRequest,delete_alert_manager_definition_request +DeleteAlertRequest,delete_alert_request +DeleteAlgorithmInput,delete_algorithm_input +DeleteAliasInput,delete_alias_input +DeleteAliasRequest,delete_alias_request +DeleteAll,delete_all +DeleteAllPolicyResources,delete_all_policy_resources +DeleteAllRevisions,delete_all_revisions +DeleteAllowListRequest,delete_allow_list_request +DeleteAlternateContactRequest,delete_alternate_contact_request +DeleteAnalysisRequest,delete_analysis_request +DeleteAnalysisResponse,delete_analysis_response +DeleteAnalysisSchemeRequest,delete_analysis_scheme_request +DeleteAnalysisSchemeResponse,delete_analysis_scheme_response +DeleteAnalysisTemplateInput,delete_analysis_template_input +DeleteAnalyzerRequest,delete_analyzer_request +DeleteAnnotationStoreRequest,delete_annotation_store_request +DeleteAnnotationStoreResponse,delete_annotation_store_response +DeleteAnnotationStoreVersionsRequest,delete_annotation_store_versions_request +DeleteAnnotationStoreVersionsResponse,delete_annotation_store_versions_response +DeleteAnomalyDetectorInput,delete_anomaly_detector_input +DeleteAnomalyDetectorRequest,delete_anomaly_detector_request +DeleteAnomalyMonitorRequest,delete_anomaly_monitor_request +DeleteAnomalySubscriptionRequest,delete_anomaly_subscription_request +DeleteApiCacheRequest,delete_api_cache_request +DeleteApiDestinationRequest,delete_api_destination_request +DeleteApiKeyRequest,delete_api_key_request +DeleteApiMappingRequest,delete_api_mapping_request +DeleteApiRequest,delete_api_request +DeleteApnsChannelRequest,delete_apns_channel_request +DeleteApnsChannelResponse,delete_apns_channel_response +DeleteApnsSandboxChannelRequest,delete_apns_sandbox_channel_request +DeleteApnsSandboxChannelResponse,delete_apns_sandbox_channel_response +DeleteApnsVoipChannelRequest,delete_apns_voip_channel_request +DeleteApnsVoipChannelResponse,delete_apns_voip_channel_response +DeleteApnsVoipSandboxChannelRequest,delete_apns_voip_sandbox_channel_request +DeleteApnsVoipSandboxChannelResponse,delete_apns_voip_sandbox_channel_response +DeleteAppAssessmentRequest,delete_app_assessment_request +DeleteAppAssessmentResponse,delete_app_assessment_response +DeleteAppAuthorizationRequest,delete_app_authorization_request +DeleteAppBlockBuilderRequest,delete_app_block_builder_request +DeleteAppBlockRequest,delete_app_block_request +DeleteAppBundleRequest,delete_app_bundle_request +DeleteAppImageConfigRequest,delete_app_image_config_request +DeleteAppInput,delete_app_input +DeleteAppInputSourceRequest,delete_app_input_source_request +DeleteAppInputSourceResponse,delete_app_input_source_response +DeleteAppInstanceAdminRequest,delete_app_instance_admin_request +DeleteAppInstanceBotRequest,delete_app_instance_bot_request +DeleteAppInstanceRequest,delete_app_instance_request +DeleteAppInstanceStreamingConfigurationsRequest,delete_app_instance_streaming_configurations_request +DeleteAppInstanceUserRequest,delete_app_instance_user_request +DeleteAppLaunchConfigurationRequest,delete_app_launch_configuration_request +DeleteAppMonitorRequest,delete_app_monitor_request +DeleteAppReplicationConfigurationRequest,delete_app_replication_configuration_request +DeleteAppRequest,delete_app_request +DeleteAppResponse,delete_app_response +DeleteAppResult,delete_app_result +DeleteAppValidationConfigurationRequest,delete_app_validation_configuration_request +DeleteAppVersionAppComponentRequest,delete_app_version_app_component_request +DeleteAppVersionAppComponentResponse,delete_app_version_app_component_response +DeleteAppVersionResourceRequest,delete_app_version_resource_request +DeleteAppVersionResourceResponse,delete_app_version_resource_response +DeleteApplicationCloudWatchLoggingOptionRequest,delete_application_cloud_watch_logging_option_request +DeleteApplicationCloudWatchLoggingOptionResponse,delete_application_cloud_watch_logging_option_response +DeleteApplicationFromEnvironmentRequest,delete_application_from_environment_request +DeleteApplicationInput,delete_application_input +DeleteApplicationInputProcessingConfigurationRequest,delete_application_input_processing_configuration_request +DeleteApplicationInputProcessingConfigurationResponse,delete_application_input_processing_configuration_response +DeleteApplicationMessage,delete_application_message +DeleteApplicationOutputRequest,delete_application_output_request +DeleteApplicationOutputResponse,delete_application_output_response +DeleteApplicationReferenceDataSourceRequest,delete_application_reference_data_source_request +DeleteApplicationReferenceDataSourceResponse,delete_application_reference_data_source_response +DeleteApplicationRequest,delete_application_request +DeleteApplicationResponse,delete_application_response +DeleteApplicationSnapshotRequest,delete_application_snapshot_request +DeleteApplicationVersionMessage,delete_application_version_message +DeleteApplicationVpcConfigurationRequest,delete_application_vpc_configuration_request +DeleteApplicationVpcConfigurationResponse,delete_application_vpc_configuration_response +DeleteApplicationsRequest,delete_applications_request +DeleteApprovalRuleTemplateInput,delete_approval_rule_template_input +DeleteApprovalRuleTemplateOutput,delete_approval_rule_template_output +DeleteAppsListRequest,delete_apps_list_request +DeleteArchiveInput,delete_archive_input +DeleteArchiveRequest,delete_archive_request +DeleteArchiveRuleRequest,delete_archive_rule_request +DeleteArguments,delete_arguments +DeleteArtifactRequest,delete_artifact_request +DeleteArtifactResponse,delete_artifact_response +DeleteAssessmentFrameworkRequest,delete_assessment_framework_request +DeleteAssessmentFrameworkShareRequest,delete_assessment_framework_share_request +DeleteAssessmentReportRequest,delete_assessment_report_request +DeleteAssessmentRequest,delete_assessment_request +DeleteAssessmentRunRequest,delete_assessment_run_request +DeleteAssessmentTargetRequest,delete_assessment_target_request +DeleteAssessmentTemplateRequest,delete_assessment_template_request +DeleteAssetModelRequest,delete_asset_model_request +DeleteAssetModelResponse,delete_asset_model_response +DeleteAssetRequest,delete_asset_request +DeleteAssetResponse,delete_asset_response +DeleteAssistantAssociationRequest,delete_assistant_association_request +DeleteAssistantRequest,delete_assistant_request +DeleteAssociatedConditionalForwarder,delete_associated_conditional_forwarder +DeleteAssociationRequest,delete_association_request +DeleteAssociationResponse,delete_association_response +DeleteAt,delete_at +DeleteAttachmentRequest,delete_attachment_request +DeleteAttachmentResponse,delete_attachment_response +DeleteAttendeeRequest,delete_attendee_request +DeleteAttributeGroupRequest,delete_attribute_group_request +DeleteAttributeGroupResponse,delete_attribute_group_response +DeleteAttributesRequest,delete_attributes_request +DeleteAttributesResponse,delete_attributes_response +DeleteAuditSuppressionRequest,delete_audit_suppression_request +DeleteAuthPolicyRequest,delete_auth_policy_request +DeleteAuthenticationProfileMessage,delete_authentication_profile_message +DeleteAuthenticationProfileResult,delete_authentication_profile_result +DeleteAuthorizerRequest,delete_authorizer_request +DeleteAutoScalingConfigurationRequest,delete_auto_scaling_configuration_request +DeleteAutoScalingConfigurationResponse,delete_auto_scaling_configuration_response +DeleteAutoScalingGroupType,delete_auto_scaling_group_type +DeleteAutoSnapshotRequest,delete_auto_snapshot_request +DeleteAutoSnapshotResult,delete_auto_snapshot_result +DeleteAutomatedBackups,delete_automated_backups +DeleteAutomaticTapeCreationPolicyInput,delete_automatic_tape_creation_policy_input +DeleteAutomaticTapeCreationPolicyOutput,delete_automatic_tape_creation_policy_output +DeleteAvailabilityConfigurationRequest,delete_availability_configuration_request +DeleteAwsLogSourceRequest,delete_aws_log_source_request +DeleteAwsLogSourceResponse,delete_aws_log_source_response +DeleteBGPPeerRequest,delete_bgp_peer_request +DeleteBGPPeerResponse,delete_bgp_peer_response +DeleteBackendAPIRequest,delete_backend_api_request +DeleteBackendAPIResponse,delete_backend_api_response +DeleteBackendAuthRequest,delete_backend_auth_request +DeleteBackendAuthResponse,delete_backend_auth_response +DeleteBackendEnvironmentRequest,delete_backend_environment_request +DeleteBackendEnvironmentResult,delete_backend_environment_result +DeleteBackendRequest,delete_backend_request +DeleteBackendResponse,delete_backend_response +DeleteBackendStorageRequest,delete_backend_storage_request +DeleteBackendStorageResponse,delete_backend_storage_response +DeleteBackupInput,delete_backup_input +DeleteBackupOutput,delete_backup_output +DeleteBackupPlanInput,delete_backup_plan_input +DeleteBackupPlanOutput,delete_backup_plan_output +DeleteBackupRequest,delete_backup_request +DeleteBackupResponse,delete_backup_response +DeleteBackupSelectionInput,delete_backup_selection_input +DeleteBackupVaultAccessPolicyInput,delete_backup_vault_access_policy_input +DeleteBackupVaultInput,delete_backup_vault_input +DeleteBackupVaultLockConfigurationInput,delete_backup_vault_lock_configuration_input +DeleteBackupVaultNotificationsInput,delete_backup_vault_notifications_input +DeleteBaiduChannelRequest,delete_baidu_channel_request +DeleteBaiduChannelResponse,delete_baidu_channel_response +DeleteBandwidthRateLimitInput,delete_bandwidth_rate_limit_input +DeleteBandwidthRateLimitOutput,delete_bandwidth_rate_limit_output +DeleteBasePathMappingRequest,delete_base_path_mapping_request +DeleteBatchImportJobRequest,delete_batch_import_job_request +DeleteBatchPredictionInput,delete_batch_prediction_input +DeleteBatchPredictionJobRequest,delete_batch_prediction_job_request +DeleteBatchPredictionOutput,delete_batch_prediction_output +DeleteBehavior,delete_behavior +DeleteBillingGroupInput,delete_billing_group_input +DeleteBillingGroupOutput,delete_billing_group_output +DeleteBillingGroupRequest,delete_billing_group_request +DeleteBlueGreenDeploymentRequest,delete_blue_green_deployment_request +DeleteBlueGreenDeploymentResponse,delete_blue_green_deployment_response +DeleteBlueprintRequest,delete_blueprint_request +DeleteBlueprintResponse,delete_blueprint_response +DeleteBotAliasRequest,delete_bot_alias_request +DeleteBotAliasResponse,delete_bot_alias_response +DeleteBotChannelAssociationRequest,delete_bot_channel_association_request +DeleteBotLocaleRequest,delete_bot_locale_request +DeleteBotLocaleResponse,delete_bot_locale_response +DeleteBotRequest,delete_bot_request +DeleteBotResponse,delete_bot_response +DeleteBotVersionRequest,delete_bot_version_request +DeleteBotVersionResponse,delete_bot_version_response +DeleteBranchInput,delete_branch_input +DeleteBranchOutput,delete_branch_output +DeleteBranchRequest,delete_branch_request +DeleteBranchResult,delete_branch_result +DeleteBridgeRequest,delete_bridge_request +DeleteBridgeResponse,delete_bridge_response +DeleteBrokerRequest,delete_broker_request +DeleteBrokerResponse,delete_broker_response +DeleteBrowserSettingsRequest,delete_browser_settings_request +DeleteBucketAccessKeyRequest,delete_bucket_access_key_request +DeleteBucketAccessKeyResult,delete_bucket_access_key_result +DeleteBucketAnalyticsConfigurationRequest,delete_bucket_analytics_configuration_request +DeleteBucketCorsRequest,delete_bucket_cors_request +DeleteBucketEncryptionRequest,delete_bucket_encryption_request +DeleteBucketIntelligentTieringConfigurationRequest,delete_bucket_intelligent_tiering_configuration_request +DeleteBucketInventoryConfigurationRequest,delete_bucket_inventory_configuration_request +DeleteBucketLifecycleConfigurationRequest,delete_bucket_lifecycle_configuration_request +DeleteBucketLifecycleRequest,delete_bucket_lifecycle_request +DeleteBucketMetricsConfigurationRequest,delete_bucket_metrics_configuration_request +DeleteBucketOwnershipControlsRequest,delete_bucket_ownership_controls_request +DeleteBucketPolicyRequest,delete_bucket_policy_request +DeleteBucketReplicationRequest,delete_bucket_replication_request +DeleteBucketRequest,delete_bucket_request +DeleteBucketResult,delete_bucket_result +DeleteBucketTaggingRequest,delete_bucket_tagging_request +DeleteBucketWebsiteRequest,delete_bucket_website_request +DeleteBudgetActionRequest,delete_budget_action_request +DeleteBudgetActionResponse,delete_budget_action_response +DeleteBudgetRequest,delete_budget_request +DeleteBuildBatchInput,delete_build_batch_input +DeleteBuildBatchOutput,delete_build_batch_output +DeleteBuildInput,delete_build_input +DeleteBusinessReportScheduleRequest,delete_business_report_schedule_request +DeleteByteMatchSetRequest,delete_byte_match_set_request +DeleteByteMatchSetResponse,delete_byte_match_set_response +DeleteCACertificateRequest,delete_ca_certificate_request +DeleteCacheClusterMessage,delete_cache_cluster_message +DeleteCacheClusterResult,delete_cache_cluster_result +DeleteCacheParameterGroupMessage,delete_cache_parameter_group_message +DeleteCachePolicyRequest,delete_cache_policy_request +DeleteCacheSecurityGroupMessage,delete_cache_security_group_message +DeleteCacheSubnetGroupMessage,delete_cache_subnet_group_message +DeleteCalculatedAttributeDefinitionRequest,delete_calculated_attribute_definition_request +DeleteCallAnalyticsCategoryRequest,delete_call_analytics_category_request +DeleteCallAnalyticsJobRequest,delete_call_analytics_job_request +DeleteCampaignRequest,delete_campaign_request +DeleteCampaignResponse,delete_campaign_response +DeleteCanaryRequest,delete_canary_request +DeleteCapacityProviderRequest,delete_capacity_provider_request +DeleteCapacityProviderResponse,delete_capacity_provider_response +DeleteCapacityReservationInput,delete_capacity_reservation_input +DeleteCarrierGatewayRequest,delete_carrier_gateway_request +DeleteCarrierGatewayResult,delete_carrier_gateway_result +DeleteCellRequest,delete_cell_request +DeleteCertificateAuthorityRequest,delete_certificate_authority_request +DeleteCertificateMessage,delete_certificate_message +DeleteCertificateRequest,delete_certificate_request +DeleteCertificateResponse,delete_certificate_response +DeleteCertificateResult,delete_certificate_result +DeleteChangeSetInput,delete_change_set_input +DeleteChannelBanRequest,delete_channel_ban_request +DeleteChannelFlowRequest,delete_channel_flow_request +DeleteChannelGroupRequest,delete_channel_group_request +DeleteChannelMembershipRequest,delete_channel_membership_request +DeleteChannelMessageRequest,delete_channel_message_request +DeleteChannelModeratorRequest,delete_channel_moderator_request +DeleteChannelPolicyRequest,delete_channel_policy_request +DeleteChannelRequest,delete_channel_request +DeleteChannelResponse,delete_channel_response +DeleteChapCredentialsInput,delete_chap_credentials_input +DeleteChapCredentialsOutput,delete_chap_credentials_output +DeleteCidrCollectionRequest,delete_cidr_collection_request +DeleteClassifierRequest,delete_classifier_request +DeleteClientBrandingRequest,delete_client_branding_request +DeleteClientCertificateRequest,delete_client_certificate_request +DeleteClientVpnEndpointRequest,delete_client_vpn_endpoint_request +DeleteClientVpnEndpointResult,delete_client_vpn_endpoint_result +DeleteClientVpnRouteRequest,delete_client_vpn_route_request +DeleteClientVpnRouteResult,delete_client_vpn_route_result +DeleteClonedVolumes,delete_cloned_volumes +DeleteCloudFrontOriginAccessIdentityRequest,delete_cloud_front_origin_access_identity_request +DeleteClusterInput,delete_cluster_input +DeleteClusterMessage,delete_cluster_message +DeleteClusterOutput,delete_cluster_output +DeleteClusterParameterGroupMessage,delete_cluster_parameter_group_message +DeleteClusterPolicyRequest,delete_cluster_policy_request +DeleteClusterRequest,delete_cluster_request +DeleteClusterResponse,delete_cluster_response +DeleteClusterResult,delete_cluster_result +DeleteClusterSecurityGroupMessage,delete_cluster_security_group_message +DeleteClusterSnapshotInput,delete_cluster_snapshot_input +DeleteClusterSnapshotMessage,delete_cluster_snapshot_message +DeleteClusterSnapshotOutput,delete_cluster_snapshot_output +DeleteClusterSnapshotResult,delete_cluster_snapshot_result +DeleteClusterSubnetGroupMessage,delete_cluster_subnet_group_message +DeleteCodeRepositoryInput,delete_code_repository_input +DeleteCodeSigningConfigRequest,delete_code_signing_config_request +DeleteCoipCidrRequest,delete_coip_cidr_request +DeleteCoipCidrResult,delete_coip_cidr_result +DeleteCoipPoolRequest,delete_coip_pool_request +DeleteCoipPoolResult,delete_coip_pool_result +DeleteCollaborationInput,delete_collaboration_input +DeleteCollectionDetail,delete_collection_detail +DeleteCollectionRequest,delete_collection_request +DeleteCollectionResponse,delete_collection_response +DeleteCollectorRequest,delete_collector_request +DeleteColumnStatisticsForPartitionRequest,delete_column_statistics_for_partition_request +DeleteColumnStatisticsForTableRequest,delete_column_statistics_for_table_request +DeleteCommentContentInput,delete_comment_content_input +DeleteCommentContentOutput,delete_comment_content_output +DeleteCommentRequest,delete_comment_request +DeleteComponentInput,delete_component_input +DeleteComponentOutput,delete_component_output +DeleteComponentRequest,delete_component_request +DeleteComponentResponse,delete_component_response +DeleteComponentTypeRequest,delete_component_type_request +DeleteComponentTypeResponse,delete_component_type_response +DeleteComputeEnvironmentRequest,delete_compute_environment_request +DeleteConditionalForwarderRequest,delete_conditional_forwarder_request +DeleteConferenceProviderRequest,delete_conference_provider_request +DeleteConfigRequest,delete_config_request +DeleteConfigRuleRequest,delete_config_rule_request +DeleteConfigurationAggregatorRequest,delete_configuration_aggregator_request +DeleteConfigurationProfileRequest,delete_configuration_profile_request +DeleteConfigurationRecorderRequest,delete_configuration_recorder_request +DeleteConfigurationRequest,delete_configuration_request +DeleteConfigurationResponse,delete_configuration_response +DeleteConfigurationSetEventDestinationRequest,delete_configuration_set_event_destination_request +DeleteConfigurationSetRequest,delete_configuration_set_request +DeleteConfigurationSetResult,delete_configuration_set_result +DeleteConfigurationSetTrackingOptionsRequest,delete_configuration_set_tracking_options_request +DeleteConfigurationTemplateMessage,delete_configuration_template_message +DeleteConfiguredTableAnalysisRuleInput,delete_configured_table_analysis_rule_input +DeleteConfiguredTableAssociationInput,delete_configured_table_association_input +DeleteConfiguredTableInput,delete_configured_table_input +DeleteConflictException,delete_conflict_exception +DeleteConformancePackRequest,delete_conformance_pack_request +DeleteConnectClientAddInRequest,delete_connect_client_add_in_request +DeleteConnectInstanceConfigRequest,delete_connect_instance_config_request +DeleteConnectPeerRequest,delete_connect_peer_request +DeleteConnectPeerResponse,delete_connect_peer_response +DeleteConnectionAliasRequest,delete_connection_alias_request +DeleteConnectionInput,delete_connection_input +DeleteConnectionMessage,delete_connection_message +DeleteConnectionRequest,delete_connection_request +DeleteConnectionResponse,delete_connection_response +DeleteConnectorDefinitionRequest,delete_connector_definition_request +DeleteConnectorProfileRequest,delete_connector_profile_request +DeleteConnectorRequest,delete_connector_request +DeleteConnectorResponse,delete_connector_response +DeleteConstraintInput,delete_constraint_input +DeleteContactChannelRequest,delete_contact_channel_request +DeleteContactEvaluationRequest,delete_contact_evaluation_request +DeleteContactFlowModuleRequest,delete_contact_flow_module_request +DeleteContactFlowRequest,delete_contact_flow_request +DeleteContactListRequest,delete_contact_list_request +DeleteContactMethodRequest,delete_contact_method_request +DeleteContactMethodResult,delete_contact_method_result +DeleteContactRequest,delete_contact_request +DeleteContainerImageRequest,delete_container_image_request +DeleteContainerInput,delete_container_input +DeleteContainerPolicyInput,delete_container_policy_input +DeleteContainerRecipeRequest,delete_container_recipe_request +DeleteContainerRecipeResponse,delete_container_recipe_response +DeleteContainerServiceRequest,delete_container_service_request +DeleteContentRequest,delete_content_request +DeleteContextRequest,delete_context_request +DeleteContextResponse,delete_context_response +DeleteContinuousDeploymentPolicyRequest,delete_continuous_deployment_policy_request +DeleteControlPanelRequest,delete_control_panel_request +DeleteControlRequest,delete_control_request +DeleteCoreDefinitionRequest,delete_core_definition_request +DeleteCoreDeviceRequest,delete_core_device_request +DeleteCoreNetworkPolicyVersionRequest,delete_core_network_policy_version_request +DeleteCoreNetworkPolicyVersionResponse,delete_core_network_policy_version_response +DeleteCoreNetworkRequest,delete_core_network_request +DeleteCoreNetworkResponse,delete_core_network_response +DeleteCorsConfigurationRequest,delete_cors_configuration_request +DeleteCorsPolicyInput,delete_cors_policy_input +DeleteCostCategoryDefinitionRequest,delete_cost_category_definition_request +DeleteCostCategoryDefinitionResponse,delete_cost_category_definition_response +DeleteCrawlerRequest,delete_crawler_request +DeleteCrossAccountAuthorizationRequest,delete_cross_account_authorization_request +DeleteCustomActionTypeInput,delete_custom_action_type_input +DeleteCustomDBEngineVersionMessage,delete_custom_db_engine_version_message +DeleteCustomDataIdentifierRequest,delete_custom_data_identifier_request +DeleteCustomDomainAssociationMessage,delete_custom_domain_association_message +DeleteCustomEntityTypeRequest,delete_custom_entity_type_request +DeleteCustomEntityTypeResponse,delete_custom_entity_type_response +DeleteCustomKeyStoreRequest,delete_custom_key_store_request +DeleteCustomLineItemInput,delete_custom_line_item_input +DeleteCustomLineItemOutput,delete_custom_line_item_output +DeleteCustomLogSourceRequest,delete_custom_log_source_request +DeleteCustomMetadataRequest,delete_custom_metadata_request +DeleteCustomMetricRequest,delete_custom_metric_request +DeleteCustomModelRequest,delete_custom_model_request +DeleteCustomPluginRequest,delete_custom_plugin_request +DeleteCustomPluginResponse,delete_custom_plugin_response +DeleteCustomRoutingAcceleratorRequest,delete_custom_routing_accelerator_request +DeleteCustomRoutingEndpointGroupRequest,delete_custom_routing_endpoint_group_request +DeleteCustomRoutingListenerRequest,delete_custom_routing_listener_request +DeleteCustomVerificationEmailTemplateRequest,delete_custom_verification_email_template_request +DeleteCustomVocabularyRequest,delete_custom_vocabulary_request +DeleteCustomVocabularyResponse,delete_custom_vocabulary_response +DeleteCustomerGatewayRequest,delete_customer_gateway_request +DeleteDBClusterAutomatedBackupMessage,delete_db_cluster_automated_backup_message +DeleteDBClusterAutomatedBackupResult,delete_db_cluster_automated_backup_result +DeleteDBClusterEndpointMessage,delete_db_cluster_endpoint_message +DeleteDBClusterEndpointOutput,delete_db_cluster_endpoint_output +DeleteDBClusterMessage,delete_db_cluster_message +DeleteDBClusterParameterGroupMessage,delete_db_cluster_parameter_group_message +DeleteDBClusterResult,delete_db_cluster_result +DeleteDBClusterSnapshotMessage,delete_db_cluster_snapshot_message +DeleteDBClusterSnapshotResult,delete_db_cluster_snapshot_result +DeleteDBInstanceAutomatedBackupMessage,delete_db_instance_automated_backup_message +DeleteDBInstanceAutomatedBackupResult,delete_db_instance_automated_backup_result +DeleteDBInstanceMessage,delete_db_instance_message +DeleteDBInstanceResult,delete_db_instance_result +DeleteDBParameterGroupMessage,delete_db_parameter_group_message +DeleteDBProxyEndpointRequest,delete_db_proxy_endpoint_request +DeleteDBProxyEndpointResponse,delete_db_proxy_endpoint_response +DeleteDBProxyRequest,delete_db_proxy_request +DeleteDBProxyResponse,delete_db_proxy_response +DeleteDBSecurityGroupMessage,delete_db_security_group_message +DeleteDBSnapshotMessage,delete_db_snapshot_message +DeleteDBSnapshotResult,delete_db_snapshot_result +DeleteDBSubnetGroupMessage,delete_db_subnet_group_message +DeleteDashboardRequest,delete_dashboard_request +DeleteDashboardResponse,delete_dashboard_response +DeleteDashboardsInput,delete_dashboards_input +DeleteDataCatalogInput,delete_data_catalog_input +DeleteDataCellsFilterRequest,delete_data_cells_filter_request +DeleteDataInFileSystem,delete_data_in_file_system +DeleteDataIntegrationRequest,delete_data_integration_request +DeleteDataLakeOrganizationConfigurationRequest,delete_data_lake_organization_configuration_request +DeleteDataLakeRequest,delete_data_lake_request +DeleteDataProtectionPolicyRequest,delete_data_protection_policy_request +DeleteDataProviderMessage,delete_data_provider_message +DeleteDataProviderResponse,delete_data_provider_response +DeleteDataQualityJobDefinitionRequest,delete_data_quality_job_definition_request +DeleteDataQualityRulesetRequest,delete_data_quality_ruleset_request +DeleteDataRepositoryAssociationRequest,delete_data_repository_association_request +DeleteDataRepositoryAssociationResponse,delete_data_repository_association_response +DeleteDataSetRefreshPropertiesRequest,delete_data_set_refresh_properties_request +DeleteDataSetRefreshPropertiesResponse,delete_data_set_refresh_properties_response +DeleteDataSetRequest,delete_data_set_request +DeleteDataSetResponse,delete_data_set_response +DeleteDataSourceInput,delete_data_source_input +DeleteDataSourceOutput,delete_data_source_output +DeleteDataSourceRequest,delete_data_source_request +DeleteDataSourceResponse,delete_data_source_response +DeleteDatabaseRequest,delete_database_request +DeleteDataflowEndpointGroupRequest,delete_dataflow_endpoint_group_request +DeleteDatasetContentRequest,delete_dataset_content_request +DeleteDatasetGroupRequest,delete_dataset_group_request +DeleteDatasetImportJobRequest,delete_dataset_import_job_request +DeleteDatasetRequest,delete_dataset_request +DeleteDatasetResponse,delete_dataset_response +DeleteDatastoreRequest,delete_datastore_request +DeleteDatastoreResponse,delete_datastore_response +DeleteDecoderManifestRequest,delete_decoder_manifest_request +DeleteDecoderManifestResponse,delete_decoder_manifest_response +DeleteDedicatedIpPoolRequest,delete_dedicated_ip_pool_request +DeleteDefaultMessageTypeRequest,delete_default_message_type_request +DeleteDefaultMessageTypeResult,delete_default_message_type_result +DeleteDefaultSenderIdRequest,delete_default_sender_id_request +DeleteDefaultSenderIdResult,delete_default_sender_id_result +DeleteDeliveryChannelRequest,delete_delivery_channel_request +DeleteDeliveryStreamInput,delete_delivery_stream_input +DeleteDeploymentConfigInput,delete_deployment_config_input +DeleteDeploymentGroupInput,delete_deployment_group_input +DeleteDeploymentGroupOutput,delete_deployment_group_output +DeleteDeploymentInput,delete_deployment_input +DeleteDeploymentOutput,delete_deployment_output +DeleteDeploymentRequest,delete_deployment_request +DeleteDeploymentStrategyRequest,delete_deployment_strategy_request +DeleteDestinationRequest,delete_destination_request +DeleteDetectorModelRequest,delete_detector_model_request +DeleteDetectorRequest,delete_detector_request +DeleteDetectorVersionRequest,delete_detector_version_request +DeleteDevEndpointRequest,delete_dev_endpoint_request +DeleteDevEnvironmentRequest,delete_dev_environment_request +DeleteDevEnvironmentResponse,delete_dev_environment_response +DeleteDeviceDefinitionRequest,delete_device_definition_request +DeleteDeviceFleetRequest,delete_device_fleet_request +DeleteDevicePoolRequest,delete_device_pool_request +DeleteDeviceProfileRequest,delete_device_profile_request +DeleteDeviceRequest,delete_device_request +DeleteDeviceResponse,delete_device_response +DeleteDeviceUsageDataRequest,delete_device_usage_data_request +DeleteDhcpOptionsRequest,delete_dhcp_options_request +DeleteDimensionRequest,delete_dimension_request +DeleteDirectConnectGatewayAssociationProposalRequest,delete_direct_connect_gateway_association_proposal_request +DeleteDirectConnectGatewayAssociationProposalResult,delete_direct_connect_gateway_association_proposal_result +DeleteDirectConnectGatewayAssociationRequest,delete_direct_connect_gateway_association_request +DeleteDirectConnectGatewayAssociationResult,delete_direct_connect_gateway_association_result +DeleteDirectConnectGatewayRequest,delete_direct_connect_gateway_request +DeleteDirectConnectGatewayResult,delete_direct_connect_gateway_result +DeleteDirectory,delete_directory +DeleteDirectoryConfigRequest,delete_directory_config_request +DeleteDirectoryRegistrationRequest,delete_directory_registration_request +DeleteDirectoryRequest,delete_directory_request +DeleteDirectoryResponse,delete_directory_response +DeleteDirectoryResult,delete_directory_result +DeleteDiscovererRequest,delete_discoverer_request +DeleteDiskRequest,delete_disk_request +DeleteDiskResult,delete_disk_result +DeleteDiskSnapshotRequest,delete_disk_snapshot_request +DeleteDiskSnapshotResult,delete_disk_snapshot_result +DeleteDistributionConfigurationRequest,delete_distribution_configuration_request +DeleteDistributionConfigurationResponse,delete_distribution_configuration_response +DeleteDistributionRequest,delete_distribution_request +DeleteDistributionResult,delete_distribution_result +DeleteDocumentClassifierRequest,delete_document_classifier_request +DeleteDocumentRequest,delete_document_request +DeleteDocumentVersionRequest,delete_document_version_request +DeleteDocumentationPartRequest,delete_documentation_part_request +DeleteDocumentationVersionRequest,delete_documentation_version_request +DeleteDomainAssociationRequest,delete_domain_association_request +DeleteDomainAssociationResult,delete_domain_association_result +DeleteDomainConfigurationRequest,delete_domain_configuration_request +DeleteDomainEntryRequest,delete_domain_entry_request +DeleteDomainEntryResult,delete_domain_entry_result +DeleteDomainNameRequest,delete_domain_name_request +DeleteDomainPermissionsPolicyRequest,delete_domain_permissions_policy_request +DeleteDomainPermissionsPolicyResult,delete_domain_permissions_policy_result +DeleteDomainRequest,delete_domain_request +DeleteDomainResponse,delete_domain_response +DeleteDomainResult,delete_domain_result +DeleteDynamicThingGroupRequest,delete_dynamic_thing_group_request +DeleteEarthObservationJobInput,delete_earth_observation_job_input +DeleteEdgeConfigurationInput,delete_edge_configuration_input +DeleteEdgeDeploymentPlanRequest,delete_edge_deployment_plan_request +DeleteEdgeDeploymentStageRequest,delete_edge_deployment_stage_request +DeleteEgressOnlyInternetGatewayRequest,delete_egress_only_internet_gateway_request +DeleteEgressOnlyInternetGatewayResult,delete_egress_only_internet_gateway_result +DeleteElasticIp,delete_elastic_ip +DeleteElasticsearchDomainRequest,delete_elasticsearch_domain_request +DeleteElasticsearchDomainResponse,delete_elasticsearch_domain_response +DeleteEmailChannelRequest,delete_email_channel_request +DeleteEmailChannelResponse,delete_email_channel_response +DeleteEmailIdentityPolicyRequest,delete_email_identity_policy_request +DeleteEmailIdentityRequest,delete_email_identity_request +DeleteEmailMonitoringConfigurationRequest,delete_email_monitoring_configuration_request +DeleteEmailTemplateRequest,delete_email_template_request +DeleteEmailTemplateResponse,delete_email_template_response +DeleteEndpointAccessMessage,delete_endpoint_access_message +DeleteEndpointAccessRequest,delete_endpoint_access_request +DeleteEndpointAccessResponse,delete_endpoint_access_response +DeleteEndpointConfigInput,delete_endpoint_config_input +DeleteEndpointGroupRequest,delete_endpoint_group_request +DeleteEndpointInput,delete_endpoint_input +DeleteEndpointMessage,delete_endpoint_message +DeleteEndpointRequest,delete_endpoint_request +DeleteEndpointResponse,delete_endpoint_response +DeleteEntitlementRequest,delete_entitlement_request +DeleteEntityRecognizerRequest,delete_entity_recognizer_request +DeleteEntityRequest,delete_entity_request +DeleteEntityResponse,delete_entity_response +DeleteEntityTypeRequest,delete_entity_type_request +DeleteEnvironmentAccountConnectionInput,delete_environment_account_connection_input +DeleteEnvironmentAccountConnectionOutput,delete_environment_account_connection_output +DeleteEnvironmentConfigurationMessage,delete_environment_configuration_message +DeleteEnvironmentInput,delete_environment_input +DeleteEnvironmentMembershipRequest,delete_environment_membership_request +DeleteEnvironmentOutput,delete_environment_output +DeleteEnvironmentRequest,delete_environment_request +DeleteEnvironmentResponse,delete_environment_response +DeleteEnvironmentTemplateInput,delete_environment_template_input +DeleteEnvironmentTemplateOutput,delete_environment_template_output +DeleteEnvironmentTemplateVersionInput,delete_environment_template_version_input +DeleteEnvironmentTemplateVersionOutput,delete_environment_template_version_output +DeleteEphemerisRequest,delete_ephemeris_request +DeleteEvaluationFormRequest,delete_evaluation_form_request +DeleteEvaluationInput,delete_evaluation_input +DeleteEvaluationOutput,delete_evaluation_output +DeleteEvaluationResultsRequest,delete_evaluation_results_request +DeleteEventActionRequest,delete_event_action_request +DeleteEventBusRequest,delete_event_bus_request +DeleteEventDataStoreRequest,delete_event_data_store_request +DeleteEventDestinationRequest,delete_event_destination_request +DeleteEventDestinationResult,delete_event_destination_result +DeleteEventIntegrationRequest,delete_event_integration_request +DeleteEventRequest,delete_event_request +DeleteEventSourceMappingRequest,delete_event_source_mapping_request +DeleteEventStreamRequest,delete_event_stream_request +DeleteEventStreamResponse,delete_event_stream_response +DeleteEventSubscriptionMessage,delete_event_subscription_message +DeleteEventSubscriptionResponse,delete_event_subscription_response +DeleteEventSubscriptionResult,delete_event_subscription_result +DeleteEventTrackerRequest,delete_event_tracker_request +DeleteEventTypeRequest,delete_event_type_request +DeleteEventsByEventTypeRequest,delete_events_by_event_type_request +DeleteEventsByEventTypeResult,delete_events_by_event_type_result +DeleteEventsConfigurationRequest,delete_events_configuration_request +DeleteExperienceRequest,delete_experience_request +DeleteExperimentRequest,delete_experiment_request +DeleteExperimentResponse,delete_experiment_response +DeleteExperimentTemplateRequest,delete_experiment_template_request +DeleteExperimentTemplateResponse,delete_experiment_template_response +DeleteExplainabilityExportRequest,delete_explainability_export_request +DeleteExplainabilityRequest,delete_explainability_request +DeleteExportRequest,delete_export_request +DeleteExportResponse,delete_export_response +DeleteExpressionRequest,delete_expression_request +DeleteExpressionResponse,delete_expression_response +DeleteExtensionAssociationRequest,delete_extension_association_request +DeleteExtensionRequest,delete_extension_request +DeleteExternalModelRequest,delete_external_model_request +DeleteFHIRDatastoreRequest,delete_fhir_datastore_request +DeleteFHIRDatastoreResponse,delete_fhir_datastore_response +DeleteFacesRequest,delete_faces_request +DeleteFacesResponse,delete_faces_response +DeleteFacetRequest,delete_facet_request +DeleteFaqRequest,delete_faq_request +DeleteFargateProfileRequest,delete_fargate_profile_request +DeleteFargateProfileResponse,delete_fargate_profile_response +DeleteFeatureGroupRequest,delete_feature_group_request +DeleteFeatureRequest,delete_feature_request +DeleteFieldLevelEncryptionConfigRequest,delete_field_level_encryption_config_request +DeleteFieldLevelEncryptionProfileRequest,delete_field_level_encryption_profile_request +DeleteFileCacheRequest,delete_file_cache_request +DeleteFileCacheResponse,delete_file_cache_response +DeleteFileEntry,delete_file_entry +DeleteFileInput,delete_file_input +DeleteFileOutput,delete_file_output +DeleteFileShareInput,delete_file_share_input +DeleteFileShareOutput,delete_file_share_output +DeleteFileSystemLustreConfiguration,delete_file_system_lustre_configuration +DeleteFileSystemLustreResponse,delete_file_system_lustre_response +DeleteFileSystemOpenZFSConfiguration,delete_file_system_open_zfs_configuration +DeleteFileSystemOpenZFSResponse,delete_file_system_open_zfs_response +DeleteFileSystemPolicyRequest,delete_file_system_policy_request +DeleteFileSystemRequest,delete_file_system_request +DeleteFileSystemResponse,delete_file_system_response +DeleteFileSystemWindowsConfiguration,delete_file_system_windows_configuration +DeleteFileSystemWindowsResponse,delete_file_system_windows_response +DeleteFilterRequest,delete_filter_request +DeleteFilterResponse,delete_filter_response +DeleteFindingAggregatorRequest,delete_finding_aggregator_request +DeleteFindingsFilterRequest,delete_findings_filter_request +DeleteFirewallDomainListRequest,delete_firewall_domain_list_request +DeleteFirewallDomainListResponse,delete_firewall_domain_list_response +DeleteFirewallManagerRuleGroupsRequest,delete_firewall_manager_rule_groups_request +DeleteFirewallManagerRuleGroupsResponse,delete_firewall_manager_rule_groups_response +DeleteFirewallPolicyRequest,delete_firewall_policy_request +DeleteFirewallPolicyResponse,delete_firewall_policy_response +DeleteFirewallRequest,delete_firewall_request +DeleteFirewallResponse,delete_firewall_response +DeleteFirewallRuleGroupRequest,delete_firewall_rule_group_request +DeleteFirewallRuleGroupResponse,delete_firewall_rule_group_response +DeleteFirewallRuleRequest,delete_firewall_rule_request +DeleteFirewallRuleResponse,delete_firewall_rule_response +DeleteFleetAdvisorDatabasesRequest,delete_fleet_advisor_databases_request +DeleteFleetAdvisorDatabasesResponse,delete_fleet_advisor_databases_response +DeleteFleetError,delete_fleet_error +DeleteFleetErrorItem,delete_fleet_error_item +DeleteFleetInput,delete_fleet_input +DeleteFleetLocationsInput,delete_fleet_locations_input +DeleteFleetLocationsOutput,delete_fleet_locations_output +DeleteFleetMetricRequest,delete_fleet_metric_request +DeleteFleetRequest,delete_fleet_request +DeleteFleetResponse,delete_fleet_response +DeleteFleetSuccessItem,delete_fleet_success_item +DeleteFleetsRequest,delete_fleets_request +DeleteFleetsResult,delete_fleets_result +DeleteFlowDefinitionRequest,delete_flow_definition_request +DeleteFlowLogsRequest,delete_flow_logs_request +DeleteFlowLogsResult,delete_flow_logs_result +DeleteFlowRequest,delete_flow_request +DeleteFlowResponse,delete_flow_response +DeleteFlowTemplateRequest,delete_flow_template_request +DeleteFlywheelRequest,delete_flywheel_request +DeleteFolderContentsRequest,delete_folder_contents_request +DeleteFolderMembershipRequest,delete_folder_membership_request +DeleteFolderMembershipResponse,delete_folder_membership_response +DeleteFolderRequest,delete_folder_request +DeleteFolderResponse,delete_folder_response +DeleteForecastExportJobRequest,delete_forecast_export_job_request +DeleteForecastRequest,delete_forecast_request +DeleteFormRequest,delete_form_request +DeleteFpgaImageRequest,delete_fpga_image_request +DeleteFpgaImageResult,delete_fpga_image_result +DeleteFrameworkInput,delete_framework_input +DeleteFraudsterRequest,delete_fraudster_request +DeleteFunctionCodeSigningConfigRequest,delete_function_code_signing_config_request +DeleteFunctionConcurrencyRequest,delete_function_concurrency_request +DeleteFunctionDefinitionRequest,delete_function_definition_request +DeleteFunctionEventInvokeConfigRequest,delete_function_event_invoke_config_request +DeleteFunctionRequest,delete_function_request +DeleteFunctionUrlConfigRequest,delete_function_url_config_request +DeleteFuotaTaskRequest,delete_fuota_task_request +DeleteGameRequest,delete_game_request +DeleteGameServerGroupInput,delete_game_server_group_input +DeleteGameServerGroupOutput,delete_game_server_group_output +DeleteGameSessionQueueInput,delete_game_session_queue_input +DeleteGatewayGroupRequest,delete_gateway_group_request +DeleteGatewayInput,delete_gateway_input +DeleteGatewayOutput,delete_gateway_output +DeleteGatewayRequest,delete_gateway_request +DeleteGatewayResponse,delete_gateway_response +DeleteGatewayResponseRequest,delete_gateway_response_request +DeleteGatewayRouteInput,delete_gateway_route_input +DeleteGatewayRouteOutput,delete_gateway_route_output +DeleteGcmChannelRequest,delete_gcm_channel_request +DeleteGcmChannelResponse,delete_gcm_channel_response +DeleteGeoMatchSetRequest,delete_geo_match_set_request +DeleteGeoMatchSetResponse,delete_geo_match_set_response +DeleteGeofenceCollectionRequest,delete_geofence_collection_request +DeleteGitHubAccountTokenInput,delete_git_hub_account_token_input +DeleteGitHubAccountTokenOutput,delete_git_hub_account_token_output +DeleteGlobalClusterMessage,delete_global_cluster_message +DeleteGlobalClusterResult,delete_global_cluster_result +DeleteGlobalNetworkRequest,delete_global_network_request +DeleteGlobalNetworkResponse,delete_global_network_response +DeleteGlobalReplicationGroupMessage,delete_global_replication_group_message +DeleteGlobalReplicationGroupResult,delete_global_replication_group_result +DeleteGlobalSecondaryIndexAction,delete_global_secondary_index_action +DeleteGrantRequest,delete_grant_request +DeleteGrantResponse,delete_grant_response +DeleteGraphRequest,delete_graph_request +DeleteGraphqlApiRequest,delete_graphql_api_request +DeleteGroupInput,delete_group_input +DeleteGroupMembershipRequest,delete_group_membership_request +DeleteGroupMembershipResponse,delete_group_membership_response +DeleteGroupOutput,delete_group_output +DeleteGroupPolicyRequest,delete_group_policy_request +DeleteGroupRequest,delete_group_request +DeleteGroupResponse,delete_group_response +DeleteHITRequest,delete_hit_request +DeleteHapgRequest,delete_hapg_request +DeleteHapgResponse,delete_hapg_response +DeleteHealthCheckRequest,delete_health_check_request +DeleteHostInput,delete_host_input +DeleteHostKeyRequest,delete_host_key_request +DeleteHostedConfigurationVersionRequest,delete_hosted_configuration_version_request +DeleteHostedZoneRequest,delete_hosted_zone_request +DeleteHostedZoneResponse,delete_hosted_zone_response +DeleteHoursOfOperationRequest,delete_hours_of_operation_request +DeleteHsmClientCertificateMessage,delete_hsm_client_certificate_message +DeleteHsmConfigurationMessage,delete_hsm_configuration_message +DeleteHsmRequest,delete_hsm_request +DeleteHsmResponse,delete_hsm_response +DeleteHubContentRequest,delete_hub_content_request +DeleteHubRequest,delete_hub_request +DeleteHumanLoopRequest,delete_human_loop_request +DeleteHumanTaskUiRequest,delete_human_task_ui_request +DeleteHypervisorInput,delete_hypervisor_input +DeleteHypervisorOutput,delete_hypervisor_output +DeleteIAMPolicyAssignmentRequest,delete_iam_policy_assignment_request +DeleteIAMPolicyAssignmentResponse,delete_iam_policy_assignment_response +DeleteIPSetRequest,delete_ip_set_request +DeleteIPSetResponse,delete_ip_set_response +DeleteIdentitiesInput,delete_identities_input +DeleteIdentitiesResponse,delete_identities_response +DeleteIdentityPolicyRequest,delete_identity_policy_request +DeleteIdentityPoolInput,delete_identity_pool_input +DeleteIdentityProviderRequest,delete_identity_provider_request +DeleteIdentityRequest,delete_identity_request +DeleteIdentitySourceInput,delete_identity_source_input +DeleteImageBuilderRequest,delete_image_builder_request +DeleteImageBuilderResult,delete_image_builder_result +DeleteImagePermissionsRequest,delete_image_permissions_request +DeleteImagePipelineRequest,delete_image_pipeline_request +DeleteImagePipelineResponse,delete_image_pipeline_response +DeleteImageRecipeRequest,delete_image_recipe_request +DeleteImageRecipeResponse,delete_image_recipe_response +DeleteImageRequest,delete_image_request +DeleteImageResponse,delete_image_response +DeleteImageResult,delete_image_result +DeleteImageSetRequest,delete_image_set_request +DeleteImageSetResponse,delete_image_set_response +DeleteImageVersionRequest,delete_image_version_request +DeleteImpersonationRoleRequest,delete_impersonation_role_request +DeleteImportRequest,delete_import_request +DeleteImportResponse,delete_import_response +DeleteImportedKeyMaterialRequest,delete_imported_key_material_request +DeleteInAppTemplateRequest,delete_in_app_template_request +DeleteInAppTemplateResponse,delete_in_app_template_response +DeleteInboundConnectionRequest,delete_inbound_connection_request +DeleteInboundConnectionResponse,delete_inbound_connection_response +DeleteInboundCrossClusterSearchConnectionRequest,delete_inbound_cross_cluster_search_connection_request +DeleteInboundCrossClusterSearchConnectionResponse,delete_inbound_cross_cluster_search_connection_response +DeleteIncidentRecordInput,delete_incident_record_input +DeleteIndexFieldRequest,delete_index_field_request +DeleteIndexFieldResponse,delete_index_field_response +DeleteIndexInput,delete_index_input +DeleteIndexOutput,delete_index_output +DeleteIndexRequest,delete_index_request +DeleteInferenceExperimentRequest,delete_inference_experiment_request +DeleteInferenceExperimentResponse,delete_inference_experiment_response +DeleteInferenceSchedulerRequest,delete_inference_scheduler_request +DeleteInfrastructureConfigurationRequest,delete_infrastructure_configuration_request +DeleteInfrastructureConfigurationResponse,delete_infrastructure_configuration_response +DeleteIngestionDestinationRequest,delete_ingestion_destination_request +DeleteIngestionRequest,delete_ingestion_request +DeleteInlinePolicyFromPermissionSetRequest,delete_inline_policy_from_permission_set_request +DeleteInputRequest,delete_input_request +DeleteInputSecurityGroupRequest,delete_input_security_group_request +DeleteInsightRequest,delete_insight_request +DeleteInsightResponse,delete_insight_response +DeleteInsightRulesInput,delete_insight_rules_input +DeleteInsightRulesOutput,delete_insight_rules_output +DeleteInstanceAccessControlAttributeConfigurationRequest,delete_instance_access_control_attribute_configuration_request +DeleteInstanceConnectEndpointRequest,delete_instance_connect_endpoint_request +DeleteInstanceConnectEndpointResult,delete_instance_connect_endpoint_result +DeleteInstanceEventWindowRequest,delete_instance_event_window_request +DeleteInstanceEventWindowResult,delete_instance_event_window_result +DeleteInstanceOnboardingJobRequest,delete_instance_onboarding_job_request +DeleteInstanceProfileMessage,delete_instance_profile_message +DeleteInstanceProfileRequest,delete_instance_profile_request +DeleteInstanceProfileResponse,delete_instance_profile_response +DeleteInstanceRequest,delete_instance_request +DeleteInstanceResult,delete_instance_result +DeleteInstanceSnapshotRequest,delete_instance_snapshot_request +DeleteInstanceSnapshotResult,delete_instance_snapshot_result +DeleteIntegrationAssociationRequest,delete_integration_association_request +DeleteIntegrationRequest,delete_integration_request +DeleteIntegrationResponse,delete_integration_response +DeleteIntegrationResponseRequest,delete_integration_response_request +DeleteIntentRequest,delete_intent_request +DeleteIntentVersionRequest,delete_intent_version_request +DeleteInterconnectRequest,delete_interconnect_request +DeleteInterconnectResponse,delete_interconnect_response +DeleteIntermediateSnaphots,delete_intermediate_snaphots +DeleteInternetGatewayRequest,delete_internet_gateway_request +DeleteInventoryRequest,delete_inventory_request +DeleteInventoryResult,delete_inventory_result +DeleteInvitationsRequest,delete_invitations_request +DeleteInvitationsResponse,delete_invitations_response +DeleteIpAccessSettingsRequest,delete_ip_access_settings_request +DeleteIpGroupRequest,delete_ip_group_request +DeleteIpamPoolRequest,delete_ipam_pool_request +DeleteIpamPoolResult,delete_ipam_pool_result +DeleteIpamRequest,delete_ipam_request +DeleteIpamResourceDiscoveryRequest,delete_ipam_resource_discovery_request +DeleteIpamResourceDiscoveryResult,delete_ipam_resource_discovery_result +DeleteIpamResult,delete_ipam_result +DeleteIpamScopeRequest,delete_ipam_scope_request +DeleteIpamScopeResult,delete_ipam_scope_result +DeleteItemInput,delete_item_input +DeleteItemOutput,delete_item_output +DeleteJobExecutionRequest,delete_job_execution_request +DeleteJobQueueRequest,delete_job_queue_request +DeleteJobRequest,delete_job_request +DeleteJobResponse,delete_job_response +DeleteJobResult,delete_job_result +DeleteJobTaggingRequest,delete_job_tagging_request +DeleteJobTemplateRequest,delete_job_template_request +DeleteJobTemplateResponse,delete_job_template_response +DeleteJourneyRequest,delete_journey_request +DeleteJourneyResponse,delete_journey_response +DeleteKeyGroupRequest,delete_key_group_request +DeleteKeyInDays,delete_key_in_days +DeleteKeyInput,delete_key_input +DeleteKeyOutput,delete_key_output +DeleteKeyPairRequest,delete_key_pair_request +DeleteKeyPairResult,delete_key_pair_result +DeleteKeyRequest,delete_key_request +DeleteKeySigningKeyRequest,delete_key_signing_key_request +DeleteKeySigningKeyResponse,delete_key_signing_key_response +DeleteKeyspaceRequest,delete_keyspace_request +DeleteKeywordRequest,delete_keyword_request +DeleteKeywordResult,delete_keyword_result +DeleteKnowledgeBaseRequest,delete_knowledge_base_request +DeleteKnownHostKeysRequest,delete_known_host_keys_request +DeleteKnownHostKeysResult,delete_known_host_keys_result +DeleteKxClusterRequest,delete_kx_cluster_request +DeleteKxDatabaseRequest,delete_kx_database_request +DeleteKxEnvironmentRequest,delete_kx_environment_request +DeleteKxUserRequest,delete_kx_user_request +DeleteLFTagRequest,delete_lf_tag_request +DeleteLabelGroupRequest,delete_label_group_request +DeleteLabelRequest,delete_label_request +DeleteLabelsRequest,delete_labels_request +DeleteLagRequest,delete_lag_request +DeleteLakeFormationOptInRequest,delete_lake_formation_opt_in_request +DeleteLambda,delete_lambda +DeleteLanguageModelRequest,delete_language_model_request +DeleteLaunchActionRequest,delete_launch_action_request +DeleteLaunchConfigurationTemplateRequest,delete_launch_configuration_template_request +DeleteLaunchProfileMemberRequest,delete_launch_profile_member_request +DeleteLaunchProfileRequest,delete_launch_profile_request +DeleteLaunchProfileResponse,delete_launch_profile_response +DeleteLaunchRequest,delete_launch_request +DeleteLaunchTemplateRequest,delete_launch_template_request +DeleteLaunchTemplateResult,delete_launch_template_result +DeleteLaunchTemplateVersionsRequest,delete_launch_template_versions_request +DeleteLaunchTemplateVersionsResponseErrorItem,delete_launch_template_versions_response_error_item +DeleteLaunchTemplateVersionsResponseSuccessItem,delete_launch_template_versions_response_success_item +DeleteLaunchTemplateVersionsResult,delete_launch_template_versions_result +DeleteLayerRequest,delete_layer_request +DeleteLayerVersionRequest,delete_layer_version_request +DeleteLedgerRequest,delete_ledger_request +DeleteLensInput,delete_lens_input +DeleteLensShareInput,delete_lens_share_input +DeleteLexiconInput,delete_lexicon_input +DeleteLicenseConfigurationRequest,delete_license_configuration_request +DeleteLicenseManagerReportGeneratorRequest,delete_license_manager_report_generator_request +DeleteLicenseRequest,delete_license_request +DeleteLicenseResponse,delete_license_response +DeleteLifecycleHookType,delete_lifecycle_hook_type +DeleteLifecyclePolicyInput,delete_lifecycle_policy_input +DeleteLifecyclePolicyRequest,delete_lifecycle_policy_request +DeleteLifecyclePolicyResponse,delete_lifecycle_policy_response +DeleteLinkInput,delete_link_input +DeleteLinkRequest,delete_link_request +DeleteLinkResponse,delete_link_response +DeleteListRequest,delete_list_request +DeleteListenerInput,delete_listener_input +DeleteListenerRequest,delete_listener_request +DeleteLiveSourceRequest,delete_live_source_request +DeleteLoadBalancerInput,delete_load_balancer_input +DeleteLoadBalancerListenerInput,delete_load_balancer_listener_input +DeleteLoadBalancerPolicyInput,delete_load_balancer_policy_input +DeleteLoadBalancerRequest,delete_load_balancer_request +DeleteLoadBalancerResult,delete_load_balancer_result +DeleteLoadBalancerTlsCertificateRequest,delete_load_balancer_tls_certificate_request +DeleteLoadBalancerTlsCertificateResult,delete_load_balancer_tls_certificate_result +DeleteLocalGatewayRouteRequest,delete_local_gateway_route_request +DeleteLocalGatewayRouteResult,delete_local_gateway_route_result +DeleteLocalGatewayRouteTableRequest,delete_local_gateway_route_table_request +DeleteLocalGatewayRouteTableResult,delete_local_gateway_route_table_result +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest,delete_local_gateway_route_table_virtual_interface_group_association_request +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult,delete_local_gateway_route_table_virtual_interface_group_association_result +DeleteLocalGatewayRouteTableVpcAssociationRequest,delete_local_gateway_route_table_vpc_association_request +DeleteLocalGatewayRouteTableVpcAssociationResult,delete_local_gateway_route_table_vpc_association_result +DeleteLocationInput,delete_location_input +DeleteLocationRequest,delete_location_request +DeleteLogGroupRequest,delete_log_group_request +DeleteLogPatternRequest,delete_log_pattern_request +DeleteLogStreamRequest,delete_log_stream_request +DeleteLogSubscriptionRequest,delete_log_subscription_request +DeleteLoggerDefinitionRequest,delete_logger_definition_request +DeleteLoggingConfigurationRequest,delete_logging_configuration_request +DeleteLoginProfileRequest,delete_login_profile_request +DeleteLunaClientRequest,delete_luna_client_request +DeleteLunaClientResponse,delete_luna_client_response +DeleteMLEndpointInput,delete_ml_endpoint_input +DeleteMLEndpointOutput,delete_ml_endpoint_output +DeleteMLModelInput,delete_ml_model_input +DeleteMLModelOutput,delete_ml_model_output +DeleteMLTransformRequest,delete_ml_transform_request +DeleteMLTransformResponse,delete_ml_transform_response +DeleteMailboxPermissionsRequest,delete_mailbox_permissions_request +DeleteMaintenanceWindowRequest,delete_maintenance_window_request +DeleteMaintenanceWindowResult,delete_maintenance_window_result +DeleteManagedEndpointRequest,delete_managed_endpoint_request +DeleteManagedEndpointResponse,delete_managed_endpoint_response +DeleteManagedPrefixListRequest,delete_managed_prefix_list_request +DeleteManagedPrefixListResult,delete_managed_prefix_list_result +DeleteMapRequest,delete_map_request +DeleteMarker,delete_marker +DeleteMarkerEntry,delete_marker_entry +DeleteMarkerReplication,delete_marker_replication +DeleteMarkerVersionId,delete_marker_version_id +DeleteMarkers,delete_markers +DeleteMatchingWorkflowInput,delete_matching_workflow_input +DeleteMatchingWorkflowOutput,delete_matching_workflow_output +DeleteMatchmakingConfigurationInput,delete_matchmaking_configuration_input +DeleteMatchmakingRuleSetInput,delete_matchmaking_rule_set_input +DeleteMediaCapturePipelineRequest,delete_media_capture_pipeline_request +DeleteMediaInsightsPipelineConfigurationRequest,delete_media_insights_pipeline_configuration_request +DeleteMediaPipelineKinesisVideoStreamPoolRequest,delete_media_pipeline_kinesis_video_stream_pool_request +DeleteMediaPipelineRequest,delete_media_pipeline_request +DeleteMedicalTranscriptionJobRequest,delete_medical_transcription_job_request +DeleteMedicalVocabularyRequest,delete_medical_vocabulary_request +DeleteMeetingRequest,delete_meeting_request +DeleteMemberInput,delete_member_input +DeleteMemberRequest,delete_member_request +DeleteMembersRequest,delete_members_request +DeleteMembersResponse,delete_members_response +DeleteMembershipInput,delete_membership_input +DeleteMeshInput,delete_mesh_input +DeleteMeshOutput,delete_mesh_output +DeleteMessageBatchRequest,delete_message_batch_request +DeleteMessageBatchRequestEntry,delete_message_batch_request_entry +DeleteMessageBatchResult,delete_message_batch_result +DeleteMessageBatchResultEntry,delete_message_batch_result_entry +DeleteMessageRequest,delete_message_request +DeleteMessageResponse,delete_message_response +DeleteMessagingStreamingConfigurationsRequest,delete_messaging_streaming_configurations_request +DeleteMethodRequest,delete_method_request +DeleteMethodResponseRequest,delete_method_response_request +DeleteMetricAttributionRequest,delete_metric_attribution_request +DeleteMetricFilterRequest,delete_metric_filter_request +DeleteMetricPolicyInput,delete_metric_policy_input +DeleteMetricStreamInput,delete_metric_stream_input +DeleteMigrationProjectMessage,delete_migration_project_message +DeleteMigrationProjectResponse,delete_migration_project_response +DeleteMigrationWorkflowRequest,delete_migration_workflow_request +DeleteMigrationWorkflowResponse,delete_migration_workflow_response +DeleteMissionProfileRequest,delete_mission_profile_request +DeleteMitigationActionRequest,delete_mitigation_action_request +DeleteMobileDeviceAccessOverrideRequest,delete_mobile_device_access_override_request +DeleteMobileDeviceAccessRuleRequest,delete_mobile_device_access_rule_request +DeleteModelBiasJobDefinitionRequest,delete_model_bias_job_definition_request +DeleteModelCardRequest,delete_model_card_request +DeleteModelExplainabilityJobDefinitionRequest,delete_model_explainability_job_definition_request +DeleteModelInput,delete_model_input +DeleteModelManifestRequest,delete_model_manifest_request +DeleteModelManifestResponse,delete_model_manifest_response +DeleteModelPackageGroupInput,delete_model_package_group_input +DeleteModelPackageGroupPolicyInput,delete_model_package_group_policy_input +DeleteModelPackageInput,delete_model_package_input +DeleteModelQualityJobDefinitionRequest,delete_model_quality_job_definition_request +DeleteModelRequest,delete_model_request +DeleteModelResponse,delete_model_response +DeleteModelVersionRequest,delete_model_version_request +DeleteMonitorInput,delete_monitor_input +DeleteMonitorRequest,delete_monitor_request +DeleteMonitoringScheduleRequest,delete_monitoring_schedule_request +DeleteMonitoringSubscriptionRequest,delete_monitoring_subscription_request +DeleteMountTargetRequest,delete_mount_target_request +DeleteMultiRegionAccessPointInput,delete_multi_region_access_point_input +DeleteMultiRegionAccessPointRequest,delete_multi_region_access_point_request +DeleteMultiRegionAccessPointResult,delete_multi_region_access_point_result +DeleteMulticastGroupRequest,delete_multicast_group_request +DeleteMultiplexProgramRequest,delete_multiplex_program_request +DeleteMultiplexProgramResponse,delete_multiplex_program_response +DeleteMultiplexRequest,delete_multiplex_request +DeleteMultiplexResponse,delete_multiplex_response +DeleteNamedQueryInput,delete_named_query_input +DeleteNamespaceRequest,delete_namespace_request +DeleteNamespaceResponse,delete_namespace_response +DeleteNatGatewayRequest,delete_nat_gateway_request +DeleteNatGatewayResult,delete_nat_gateway_result +DeleteNetworkAclEntryRequest,delete_network_acl_entry_request +DeleteNetworkAclRequest,delete_network_acl_request +DeleteNetworkAnalyzerConfigurationRequest,delete_network_analyzer_configuration_request +DeleteNetworkInsightsAccessScopeAnalysisRequest,delete_network_insights_access_scope_analysis_request +DeleteNetworkInsightsAccessScopeAnalysisResult,delete_network_insights_access_scope_analysis_result +DeleteNetworkInsightsAccessScopeRequest,delete_network_insights_access_scope_request +DeleteNetworkInsightsAccessScopeResult,delete_network_insights_access_scope_result +DeleteNetworkInsightsAnalysisRequest,delete_network_insights_analysis_request +DeleteNetworkInsightsAnalysisResult,delete_network_insights_analysis_result +DeleteNetworkInsightsPathRequest,delete_network_insights_path_request +DeleteNetworkInsightsPathResult,delete_network_insights_path_result +DeleteNetworkInterfacePermissionRequest,delete_network_interface_permission_request +DeleteNetworkInterfacePermissionResult,delete_network_interface_permission_result +DeleteNetworkInterfaceRequest,delete_network_interface_request +DeleteNetworkProfileRequest,delete_network_profile_request +DeleteNetworkRequest,delete_network_request +DeleteNetworkResponse,delete_network_response +DeleteNetworkSettingsRequest,delete_network_settings_request +DeleteNetworkSiteRequest,delete_network_site_request +DeleteNetworkSiteResponse,delete_network_site_response +DeleteNodeInput,delete_node_input +DeleteNodegroupRequest,delete_nodegroup_request +DeleteNodegroupResponse,delete_nodegroup_response +DeleteNotebookInput,delete_notebook_input +DeleteNotebookInstanceInput,delete_notebook_instance_input +DeleteNotebookInstanceLifecycleConfigInput,delete_notebook_instance_lifecycle_config_input +DeleteNotificationConfigurationType,delete_notification_configuration_type +DeleteNotificationRequest,delete_notification_request +DeleteNotificationRuleRequest,delete_notification_rule_request +DeleteNotificationRuleResult,delete_notification_rule_result +DeleteNotificationSubscriptionRequest,delete_notification_subscription_request +DeleteOTAUpdateRequest,delete_ota_update_request +DeleteObject,delete_object +DeleteObjectInput,delete_object_input +DeleteObjectOutput,delete_object_output +DeleteObjectRequest,delete_object_request +DeleteObjectTaggingOutput,delete_object_tagging_output +DeleteObjectTaggingRequest,delete_object_tagging_request +DeleteObjectsOnCancelRequest,delete_objects_on_cancel_request +DeleteObjectsOutput,delete_objects_output +DeleteObjectsRequest,delete_objects_request +DeleteObservabilityConfigurationRequest,delete_observability_configuration_request +DeleteObservabilityConfigurationResponse,delete_observability_configuration_response +DeleteOnTermination,delete_on_termination +DeleteOpenIDConnectProviderRequest,delete_open_id_connect_provider_request +DeleteOpsMetadataRequest,delete_ops_metadata_request +DeleteOptOutListRequest,delete_opt_out_list_request +DeleteOptOutListResult,delete_opt_out_list_result +DeleteOptedOutNumberRequest,delete_opted_out_number_request +DeleteOptedOutNumberResult,delete_opted_out_number_result +DeleteOption,delete_option +DeleteOptionGroupMessage,delete_option_group_message +DeleteOrganizationConfigRuleRequest,delete_organization_config_rule_request +DeleteOrganizationConformancePackRequest,delete_organization_conformance_pack_request +DeleteOrganizationRequest,delete_organization_request +DeleteOrganizationResponse,delete_organization_response +DeleteOrganizationalUnitRequest,delete_organizational_unit_request +DeleteOriginAccessControlRequest,delete_origin_access_control_request +DeleteOriginEndpointPolicyRequest,delete_origin_endpoint_policy_request +DeleteOriginEndpointRequest,delete_origin_endpoint_request +DeleteOriginRequestPolicyRequest,delete_origin_request_policy_request +DeleteOutboundConnectionRequest,delete_outbound_connection_request +DeleteOutboundConnectionResponse,delete_outbound_connection_response +DeleteOutboundCrossClusterSearchConnectionRequest,delete_outbound_cross_cluster_search_connection_request +DeleteOutboundCrossClusterSearchConnectionResponse,delete_outbound_cross_cluster_search_connection_response +DeleteOutcomeRequest,delete_outcome_request +DeleteOutpostInput,delete_outpost_input +DeleteOutpostResolverRequest,delete_outpost_resolver_request +DeleteOutpostResolverResponse,delete_outpost_resolver_response +DeletePackageRequest,delete_package_request +DeletePackageResponse,delete_package_response +DeletePackageResult,delete_package_result +DeletePackageVersionRequest,delete_package_version_request +DeletePackageVersionsRequest,delete_package_versions_request +DeletePackageVersionsResult,delete_package_versions_result +DeletePackagingConfigurationRequest,delete_packaging_configuration_request +DeletePackagingGroupRequest,delete_packaging_group_request +DeleteParallelDataRequest,delete_parallel_data_request +DeleteParallelDataResponse,delete_parallel_data_response +DeleteParameterGroupRequest,delete_parameter_group_request +DeleteParameterGroupResponse,delete_parameter_group_response +DeleteParameterRequest,delete_parameter_request +DeleteParametersRequest,delete_parameters_request +DeleteParametersResult,delete_parameters_result +DeletePartitionIndexRequest,delete_partition_index_request +DeletePartitionRequest,delete_partition_request +DeletePartnerEventSourceRequest,delete_partner_event_source_request +DeletePatchBaselineRequest,delete_patch_baseline_request +DeletePatchBaselineResult,delete_patch_baseline_result +DeletePeeringRequest,delete_peering_request +DeletePeeringResponse,delete_peering_response +DeletePendingAggregationRequestRequest,delete_pending_aggregation_request_request +DeletePendingTimestamp,delete_pending_timestamp +DeletePerformanceAnalysisReportRequest,delete_performance_analysis_report_request +DeletePermissionGroupRequest,delete_permission_group_request +DeletePermissionGroupResponse,delete_permission_group_response +DeletePermissionPolicyRequest,delete_permission_policy_request +DeletePermissionRequest,delete_permission_request +DeletePermissionResponse,delete_permission_response +DeletePermissionSetRequest,delete_permission_set_request +DeletePermissionVersionRequest,delete_permission_version_request +DeletePermissionVersionResponse,delete_permission_version_response +DeletePermissionsBoundaryFromPermissionSetRequest,delete_permissions_boundary_from_permission_set_request +DeletePhoneNumberRequest,delete_phone_number_request +DeletePipeRequest,delete_pipe_request +DeletePipeResponse,delete_pipe_response +DeletePipelineInput,delete_pipeline_input +DeletePipelineRequest,delete_pipeline_request +DeletePipelineResponse,delete_pipeline_response +DeletePlaceIndexRequest,delete_place_index_request +DeletePlacementGroupRequest,delete_placement_group_request +DeletePlacementRequest,delete_placement_request +DeletePlatformApplicationInput,delete_platform_application_input +DeletePlatformVersionRequest,delete_platform_version_request +DeletePlatformVersionResult,delete_platform_version_result +DeletePlaybackConfigurationRequest,delete_playback_configuration_request +DeletePlaybackKeyPairRequest,delete_playback_key_pair_request +DeletePolicyInput,delete_policy_input +DeletePolicyRequest,delete_policy_request +DeletePolicyStoreInput,delete_policy_store_input +DeletePolicyTemplateInput,delete_policy_template_input +DeletePolicyType,delete_policy_type +DeletePolicyVersionRequest,delete_policy_version_request +DeletePoolRequest,delete_pool_request +DeletePoolResult,delete_pool_result +DeletePortalRequest,delete_portal_request +DeletePortalResponse,delete_portal_response +DeletePortfolioInput,delete_portfolio_input +DeletePortfolioShareInput,delete_portfolio_share_input +DeletePortfolioShareOutput,delete_portfolio_share_output +DeletePredictorBacktestExportJobRequest,delete_predictor_backtest_export_job_request +DeletePredictorRequest,delete_predictor_request +DeletePrefetchScheduleRequest,delete_prefetch_schedule_request +DeletePreparedStatementInput,delete_prepared_statement_input +DeletePresetRequest,delete_preset_request +DeletePricingPlanInput,delete_pricing_plan_input +DeletePricingPlanOutput,delete_pricing_plan_output +DeletePricingRuleInput,delete_pricing_rule_input +DeletePricingRuleOutput,delete_pricing_rule_output +DeletePrincipalMappingRequest,delete_principal_mapping_request +DeletePriorVersions,delete_prior_versions +DeleteProductInput,delete_product_input +DeleteProfileInput,delete_profile_input +DeleteProfileKeyRequest,delete_profile_key_request +DeleteProfileKeyResponse,delete_profile_key_response +DeleteProfileObjectRequest,delete_profile_object_request +DeleteProfileObjectResponse,delete_profile_object_response +DeleteProfileObjectTypeRequest,delete_profile_object_type_request +DeleteProfileObjectTypeResponse,delete_profile_object_type_response +DeleteProfileRequest,delete_profile_request +DeleteProfileResponse,delete_profile_response +DeleteProfileShareInput,delete_profile_share_input +DeleteProfilingGroupRequest,delete_profiling_group_request +DeleteProgramRequest,delete_program_request +DeleteProgressUpdateStreamRequest,delete_progress_update_stream_request +DeleteProjectInput,delete_project_input +DeleteProjectPolicyRequest,delete_project_policy_request +DeleteProjectRequest,delete_project_request +DeleteProjectResponse,delete_project_response +DeleteProjectResult,delete_project_result +DeleteProjectVersionRequest,delete_project_version_request +DeleteProjectVersionResponse,delete_project_version_response +DeletePromptRequest,delete_prompt_request +DeleteProperties,delete_properties +DeletePropertygraphStatisticsOutput,delete_propertygraph_statistics_output +DeleteProtection,delete_protection +DeleteProtectionGroupRequest,delete_protection_group_request +DeleteProtectionRequest,delete_protection_request +DeleteProtocolsListRequest,delete_protocols_list_request +DeleteProvisionedConcurrencyConfigRequest,delete_provisioned_concurrency_config_request +DeleteProvisionedModelThroughputRequest,delete_provisioned_model_throughput_request +DeleteProvisionedProductPlanInput,delete_provisioned_product_plan_input +DeleteProvisioningArtifactInput,delete_provisioning_artifact_input +DeleteProvisioningTemplateRequest,delete_provisioning_template_request +DeleteProvisioningTemplateVersionRequest,delete_provisioning_template_version_request +DeleteProxySessionRequest,delete_proxy_session_request +DeletePublicAccessBlockRequest,delete_public_access_block_request +DeletePublicIpv4PoolRequest,delete_public_ipv4_pool_request +DeletePublicIpv4PoolResult,delete_public_ipv4_pool_result +DeletePublicKeyRequest,delete_public_key_request +DeletePublicKeys,delete_public_keys +DeletePublishingDestinationRequest,delete_publishing_destination_request +DeletePullRequestApprovalRuleInput,delete_pull_request_approval_rule_input +DeletePullRequestApprovalRuleOutput,delete_pull_request_approval_rule_output +DeletePullThroughCacheRuleRequest,delete_pull_through_cache_rule_request +DeletePullThroughCacheRuleResponse,delete_pull_through_cache_rule_response +DeletePushTemplateRequest,delete_push_template_request +DeletePushTemplateResponse,delete_push_template_response +DeleteQualificationTypeRequest,delete_qualification_type_request +DeleteQueryDefinitionRequest,delete_query_definition_request +DeleteQueryDefinitionResponse,delete_query_definition_response +DeleteQueryLoggingConfigRequest,delete_query_logging_config_request +DeleteQuerySuggestionsBlockListRequest,delete_query_suggestions_block_list_request +DeleteQueueRequest,delete_queue_request +DeleteQueuedMessagesRequest,delete_queued_messages_request +DeleteQueuedReservedInstancesError,delete_queued_reserved_instances_error +DeleteQueuedReservedInstancesRequest,delete_queued_reserved_instances_request +DeleteQueuedReservedInstancesResult,delete_queued_reserved_instances_result +DeleteQueuedSavingsPlanRequest,delete_queued_savings_plan_request +DeleteQuickConnectRequest,delete_quick_connect_request +DeleteRate,delete_rate +DeleteRateBasedRuleRequest,delete_rate_based_rule_request +DeleteRateBasedRuleResponse,delete_rate_based_rule_response +DeleteReadinessCheckRequest,delete_readiness_check_request +DeleteRealtimeEndpointInput,delete_realtime_endpoint_input +DeleteRealtimeEndpointOutput,delete_realtime_endpoint_output +DeleteRealtimeLogConfigRequest,delete_realtime_log_config_request +DeleteReceiptFilterRequest,delete_receipt_filter_request +DeleteReceiptRuleRequest,delete_receipt_rule_request +DeleteReceiptRuleSetRequest,delete_receipt_rule_set_request +DeleteRecipeVersionRequest,delete_recipe_version_request +DeleteRecipeVersionResponse,delete_recipe_version_response +DeleteRecommendationPreferencesRequest,delete_recommendation_preferences_request +DeleteRecommendationTemplateRequest,delete_recommendation_template_request +DeleteRecommendationTemplateResponse,delete_recommendation_template_response +DeleteRecommenderConfigurationRequest,delete_recommender_configuration_request +DeleteRecommenderConfigurationResponse,delete_recommender_configuration_response +DeleteRecommenderRequest,delete_recommender_request +DeleteRecordRequest,delete_record_request +DeleteRecordingConfigurationRequest,delete_recording_configuration_request +DeleteRecoveryGroupRequest,delete_recovery_group_request +DeleteRecoveryInstanceRequest,delete_recovery_instance_request +DeleteRecoveryPointInput,delete_recovery_point_input +DeleteReferenceRequest,delete_reference_request +DeleteReferenceStoreRequest,delete_reference_store_request +DeleteRefreshScheduleRequest,delete_refresh_schedule_request +DeleteRefreshScheduleResponse,delete_refresh_schedule_response +DeleteRegexMatchSetRequest,delete_regex_match_set_request +DeleteRegexMatchSetResponse,delete_regex_match_set_response +DeleteRegexPatternSetRequest,delete_regex_pattern_set_request +DeleteRegexPatternSetResponse,delete_regex_pattern_set_response +DeleteRegionAction,delete_region_action +DeleteRegistryInput,delete_registry_input +DeleteRegistryPolicyResponse,delete_registry_policy_response +DeleteRegistryRequest,delete_registry_request +DeleteRegistryResponse,delete_registry_response +DeleteRelationalDatabaseRequest,delete_relational_database_request +DeleteRelationalDatabaseResult,delete_relational_database_result +DeleteRelationalDatabaseSnapshotRequest,delete_relational_database_snapshot_request +DeleteRelationalDatabaseSnapshotResult,delete_relational_database_snapshot_result +DeleteRemediationConfigurationRequest,delete_remediation_configuration_request +DeleteRemediationExceptionsRequest,delete_remediation_exceptions_request +DeleteRemediationExceptionsResponse,delete_remediation_exceptions_response +DeleteRemoteAccessSessionRequest,delete_remote_access_session_request +DeleteReplacedRootVolume,delete_replaced_root_volume +DeleteReplicaAction,delete_replica_action +DeleteReplicationConfigMessage,delete_replication_config_message +DeleteReplicationConfigResponse,delete_replication_config_response +DeleteReplicationConfigurationRequest,delete_replication_configuration_request +DeleteReplicationConfigurationTemplateRequest,delete_replication_configuration_template_request +DeleteReplicationGroupMemberAction,delete_replication_group_member_action +DeleteReplicationGroupMessage,delete_replication_group_message +DeleteReplicationGroupResult,delete_replication_group_result +DeleteReplicationInstanceMessage,delete_replication_instance_message +DeleteReplicationInstanceResponse,delete_replication_instance_response +DeleteReplicationJobRequest,delete_replication_job_request +DeleteReplicationSetInput,delete_replication_set_input +DeleteReplicationSubnetGroupMessage,delete_replication_subnet_group_message +DeleteReplicationTaskAssessmentRunMessage,delete_replication_task_assessment_run_message +DeleteReplicationTaskAssessmentRunResponse,delete_replication_task_assessment_run_response +DeleteReplicationTaskMessage,delete_replication_task_message +DeleteReplicationTaskResponse,delete_replication_task_response +DeleteReportDefinitionRequest,delete_report_definition_request +DeleteReportDefinitionResponse,delete_report_definition_response +DeleteReportDefinitionResult,delete_report_definition_result +DeleteReportGroupInput,delete_report_group_input +DeleteReportInput,delete_report_input +DeleteReportPlanInput,delete_report_plan_input +DeleteRepositoryInput,delete_repository_input +DeleteRepositoryOutput,delete_repository_output +DeleteRepositoryPermissionsPolicyRequest,delete_repository_permissions_policy_request +DeleteRepositoryPermissionsPolicyResult,delete_repository_permissions_policy_result +DeleteRepositoryPolicyRequest,delete_repository_policy_request +DeleteRepositoryPolicyResponse,delete_repository_policy_response +DeleteRepositoryRequest,delete_repository_request +DeleteRepositoryResponse,delete_repository_response +DeleteRepositoryResult,delete_repository_result +DeleteRequest,delete_request +DeleteRequestValidatorRequest,delete_request_validator_request +DeleteRescoreExecutionPlanRequest,delete_rescore_execution_plan_request +DeleteReservationRequest,delete_reservation_request +DeleteReservationResponse,delete_reservation_response +DeleteResiliencyPolicyRequest,delete_resiliency_policy_request +DeleteResiliencyPolicyResponse,delete_resiliency_policy_response +DeleteResolverEndpointRequest,delete_resolver_endpoint_request +DeleteResolverEndpointResponse,delete_resolver_endpoint_response +DeleteResolverQueryLogConfigRequest,delete_resolver_query_log_config_request +DeleteResolverQueryLogConfigResponse,delete_resolver_query_log_config_response +DeleteResolverRequest,delete_resolver_request +DeleteResolverRuleRequest,delete_resolver_rule_request +DeleteResolverRuleResponse,delete_resolver_rule_response +DeleteResource,delete_resource +DeleteResourceConfigRequest,delete_resource_config_request +DeleteResourceDataSyncRequest,delete_resource_data_sync_request +DeleteResourceDefinitionRequest,delete_resource_definition_request +DeleteResourceInput,delete_resource_input +DeleteResourceOutput,delete_resource_output +DeleteResourcePermissionInput,delete_resource_permission_input +DeleteResourcePermissionOutput,delete_resource_permission_output +DeleteResourcePolicyInput,delete_resource_policy_input +DeleteResourcePolicyRequest,delete_resource_policy_request +DeleteResourcePolicyResponse,delete_resource_policy_response +DeleteResourcePolicyStatementRequest,delete_resource_policy_statement_request +DeleteResourcePolicyStatementResponse,delete_resource_policy_statement_response +DeleteResourceRequest,delete_resource_request +DeleteResourceServerRequest,delete_resource_server_request +DeleteResourceSetRequest,delete_resource_set_request +DeleteResourceShareRequest,delete_resource_share_request +DeleteResourceShareResponse,delete_resource_share_response +DeleteResourceTreeRequest,delete_resource_tree_request +DeleteResourcesByExternalIdInput,delete_resources_by_external_id_input +DeleteResponseHeadersPolicyRequest,delete_response_headers_policy_request +DeleteResponsePlanInput,delete_response_plan_input +DeleteRestApiRequest,delete_rest_api_request +DeleteRetentionConfigurationRequest,delete_retention_configuration_request +DeleteRetentionPolicyRequest,delete_retention_policy_request +DeleteRetrainingSchedulerRequest,delete_retraining_scheduler_request +DeleteReusableDelegationSetRequest,delete_reusable_delegation_set_request +DeleteRevisionRequest,delete_revision_request +DeleteRobotApplicationRequest,delete_robot_application_request +DeleteRobotRequest,delete_robot_request +DeleteRoleAliasRequest,delete_role_alias_request +DeleteRolePermissionsBoundaryRequest,delete_role_permissions_boundary_request +DeleteRolePolicyRequest,delete_role_policy_request +DeleteRoleRequest,delete_role_request +DeleteRoomMembershipRequest,delete_room_membership_request +DeleteRoomRequest,delete_room_request +DeleteRoomSkillParameterRequest,delete_room_skill_parameter_request +DeleteRotationOverrideRequest,delete_rotation_override_request +DeleteRotationRequest,delete_rotation_request +DeleteRouteCalculatorRequest,delete_route_calculator_request +DeleteRouteInput,delete_route_input +DeleteRouteOutput,delete_route_output +DeleteRouteRequest,delete_route_request +DeleteRouteRequestParameterRequest,delete_route_request_parameter_request +DeleteRouteResponse,delete_route_response +DeleteRouteResponseRequest,delete_route_response_request +DeleteRouteSettingsRequest,delete_route_settings_request +DeleteRouteTableRequest,delete_route_table_request +DeleteRoutingControlRequest,delete_routing_control_request +DeleteRoutingProfileRequest,delete_routing_profile_request +DeleteRuleGroupRequest,delete_rule_group_request +DeleteRuleGroupResponse,delete_rule_group_response +DeleteRuleGroupsNamespaceRequest,delete_rule_groups_namespace_request +DeleteRuleInput,delete_rule_input +DeleteRuleRequest,delete_rule_request +DeleteRuleResponse,delete_rule_response +DeleteRulesetRequest,delete_ruleset_request +DeleteRulesetResponse,delete_ruleset_response +DeleteRumMetricsDestinationRequest,delete_rum_metrics_destination_request +DeleteRunGroupRequest,delete_run_group_request +DeleteRunRequest,delete_run_request +DeleteSAMLProviderRequest,delete_saml_provider_request +DeleteSMSSandboxPhoneNumberInput,delete_sms_sandbox_phone_number_input +DeleteSSHPublicKeyRequest,delete_ssh_public_key_request +DeleteSafetyRuleRequest,delete_safety_rule_request +DeleteSamplingRuleRequest,delete_sampling_rule_request +DeleteSamplingRuleResult,delete_sampling_rule_result +DeleteScalingPlanRequest,delete_scaling_plan_request +DeleteScalingPolicyInput,delete_scaling_policy_input +DeleteScalingPolicyRequest,delete_scaling_policy_request +DeleteSceneRequest,delete_scene_request +DeleteScheduleGroupInput,delete_schedule_group_input +DeleteScheduleInput,delete_schedule_input +DeleteScheduleRequest,delete_schedule_request +DeleteScheduleResponse,delete_schedule_response +DeleteScheduledActionMessage,delete_scheduled_action_message +DeleteScheduledActionRequest,delete_scheduled_action_request +DeleteScheduledActionType,delete_scheduled_action_type +DeleteScheduledAuditRequest,delete_scheduled_audit_request +DeleteScheduledQueryRequest,delete_scheduled_query_request +DeleteSchedulingPolicyRequest,delete_scheduling_policy_request +DeleteSchemaInput,delete_schema_input +DeleteSchemaMappingInput,delete_schema_mapping_input +DeleteSchemaMappingOutput,delete_schema_mapping_output +DeleteSchemaRequest,delete_schema_request +DeleteSchemaResponse,delete_schema_response +DeleteSchemaVersionRequest,delete_schema_version_request +DeleteSchemaVersionsInput,delete_schema_versions_input +DeleteSchemaVersionsResponse,delete_schema_versions_response +DeleteScriptInput,delete_script_input +DeleteSecretRequest,delete_secret_request +DeleteSecretResponse,delete_secret_response +DeleteSecurityConfigRequest,delete_security_config_request +DeleteSecurityConfigurationInput,delete_security_configuration_input +DeleteSecurityConfigurationRequest,delete_security_configuration_request +DeleteSecurityGroupRequest,delete_security_group_request +DeleteSecurityPolicyRequest,delete_security_policy_request +DeleteSecurityProfileRequest,delete_security_profile_request +DeleteSegmentRequest,delete_segment_request +DeleteSegmentResponse,delete_segment_response +DeleteSequenceStoreRequest,delete_sequence_store_request +DeleteServerCertificateRequest,delete_server_certificate_request +DeleteServerRequest,delete_server_request +DeleteServiceActionInput,delete_service_action_input +DeleteServiceInput,delete_service_input +DeleteServiceLinkedRoleRequest,delete_service_linked_role_request +DeleteServiceLinkedRoleResponse,delete_service_linked_role_response +DeleteServiceNetworkRequest,delete_service_network_request +DeleteServiceNetworkServiceAssociationRequest,delete_service_network_service_association_request +DeleteServiceNetworkServiceAssociationResponse,delete_service_network_service_association_response +DeleteServiceNetworkVpcAssociationRequest,delete_service_network_vpc_association_request +DeleteServiceNetworkVpcAssociationResponse,delete_service_network_vpc_association_response +DeleteServiceOutput,delete_service_output +DeleteServicePrincipalNameRequest,delete_service_principal_name_request +DeleteServiceProfileRequest,delete_service_profile_request +DeleteServiceQuotaIncreaseRequestFromTemplateRequest,delete_service_quota_increase_request_from_template_request +DeleteServiceRequest,delete_service_request +DeleteServiceResponse,delete_service_response +DeleteServiceSpecificCredentialRequest,delete_service_specific_credential_request +DeleteServiceSyncConfigInput,delete_service_sync_config_input +DeleteServiceSyncConfigOutput,delete_service_sync_config_output +DeleteServiceTemplateInput,delete_service_template_input +DeleteServiceTemplateOutput,delete_service_template_output +DeleteServiceTemplateVersionInput,delete_service_template_version_input +DeleteServiceTemplateVersionOutput,delete_service_template_version_output +DeleteSessionRequest,delete_session_request +DeleteSessionResponse,delete_session_response +DeleteShareRequest,delete_share_request +DeleteShareResponse,delete_share_response +DeleteSignalCatalogRequest,delete_signal_catalog_request +DeleteSignalCatalogResponse,delete_signal_catalog_response +DeleteSignalingChannelInput,delete_signaling_channel_input +DeleteSigningCertificateRequest,delete_signing_certificate_request +DeleteSimulationApplicationRequest,delete_simulation_application_request +DeleteSimulationInput,delete_simulation_input +DeleteSinkInput,delete_sink_input +DeleteSipMediaApplicationRequest,delete_sip_media_application_request +DeleteSipRuleRequest,delete_sip_rule_request +DeleteSiteInput,delete_site_input +DeleteSiteRequest,delete_site_request +DeleteSiteResponse,delete_site_response +DeleteSizeConstraintSetRequest,delete_size_constraint_set_request +DeleteSizeConstraintSetResponse,delete_size_constraint_set_response +DeleteSkillAuthorizationRequest,delete_skill_authorization_request +DeleteSkillGroupRequest,delete_skill_group_request +DeleteSlackChannelConfigurationRequest,delete_slack_channel_configuration_request +DeleteSlackWorkspaceConfigurationRequest,delete_slack_workspace_configuration_request +DeleteSlotRequest,delete_slot_request +DeleteSlotTypeRequest,delete_slot_type_request +DeleteSlotTypeVersionRequest,delete_slot_type_version_request +DeleteSmsChannelRequest,delete_sms_channel_request +DeleteSmsChannelResponse,delete_sms_channel_response +DeleteSmsTemplateRequest,delete_sms_template_request +DeleteSmsTemplateResponse,delete_sms_template_response +DeleteSnapshotCopyGrantMessage,delete_snapshot_copy_grant_message +DeleteSnapshotMessage,delete_snapshot_message +DeleteSnapshotRequest,delete_snapshot_request +DeleteSnapshotResponse,delete_snapshot_response +DeleteSnapshotResult,delete_snapshot_result +DeleteSnapshotScheduleInput,delete_snapshot_schedule_input +DeleteSnapshotScheduleMessage,delete_snapshot_schedule_message +DeleteSnapshotScheduleOutput,delete_snapshot_schedule_output +DeleteSolFunctionPackageInput,delete_sol_function_package_input +DeleteSolNetworkInstanceInput,delete_sol_network_instance_input +DeleteSolNetworkPackageInput,delete_sol_network_package_input +DeleteSolutionRequest,delete_solution_request +DeleteSourceBundle,delete_source_bundle +DeleteSourceCredentialsInput,delete_source_credentials_input +DeleteSourceCredentialsOutput,delete_source_credentials_output +DeleteSourceFromS3,delete_source_from_s3 +DeleteSourceLocationRequest,delete_source_location_request +DeleteSourceNetworkRequest,delete_source_network_request +DeleteSourceRepositoryRequest,delete_source_repository_request +DeleteSourceRepositoryResponse,delete_source_repository_response +DeleteSourceServerRequest,delete_source_server_request +DeleteSpaceRequest,delete_space_request +DeleteSpaceResponse,delete_space_response +DeleteSparqlStatisticsOutput,delete_sparql_statistics_output +DeleteSpeakerRequest,delete_speaker_request +DeleteSpotDatafeedSubscriptionRequest,delete_spot_datafeed_subscription_request +DeleteSqlInjectionMatchSetRequest,delete_sql_injection_match_set_request +DeleteSqlInjectionMatchSetResponse,delete_sql_injection_match_set_response +DeleteSshPublicKeyRequest,delete_ssh_public_key_request +DeleteStackInput,delete_stack_input +DeleteStackInstancesInput,delete_stack_instances_input +DeleteStackInstancesOutput,delete_stack_instances_output +DeleteStackRequest,delete_stack_request +DeleteStackSetInput,delete_stack_set_input +DeleteStageRequest,delete_stage_request +DeleteStateMachineAliasInput,delete_state_machine_alias_input +DeleteStateMachineInput,delete_state_machine_input +DeleteStateMachineVersionInput,delete_state_machine_version_input +DeleteStatisticsValueMap,delete_statistics_value_map +DeleteStepDetails,delete_step_details +DeleteStorageConnectors,delete_storage_connectors +DeleteStorageLensConfigurationRequest,delete_storage_lens_configuration_request +DeleteStorageLensConfigurationTaggingRequest,delete_storage_lens_configuration_tagging_request +DeleteStorageVirtualMachineRequest,delete_storage_virtual_machine_request +DeleteStorageVirtualMachineResponse,delete_storage_virtual_machine_response +DeleteStoredQueryRequest,delete_stored_query_request +DeleteStreamInput,delete_stream_input +DeleteStreamKeyRequest,delete_stream_key_request +DeleteStreamProcessorRequest,delete_stream_processor_request +DeleteStreamRequest,delete_stream_request +DeleteStreamingDistributionRequest,delete_streaming_distribution_request +DeleteStreamingImageRequest,delete_streaming_image_request +DeleteStreamingImageResponse,delete_streaming_image_response +DeleteStreamingSessionRequest,delete_streaming_session_request +DeleteStreamingSessionResponse,delete_streaming_session_response +DeleteStudioComponentRequest,delete_studio_component_request +DeleteStudioComponentResponse,delete_studio_component_response +DeleteStudioInput,delete_studio_input +DeleteStudioLifecycleConfigRequest,delete_studio_lifecycle_config_request +DeleteStudioMemberRequest,delete_studio_member_request +DeleteStudioRequest,delete_studio_request +DeleteStudioResponse,delete_studio_response +DeleteStudioSessionMappingInput,delete_studio_session_mapping_input +DeleteSubnetCidrReservationRequest,delete_subnet_cidr_reservation_request +DeleteSubnetCidrReservationResult,delete_subnet_cidr_reservation_result +DeleteSubnetGroupRequest,delete_subnet_group_request +DeleteSubnetGroupResponse,delete_subnet_group_response +DeleteSubnetRequest,delete_subnet_request +DeleteSubscriberNotificationRequest,delete_subscriber_notification_request +DeleteSubscriberRequest,delete_subscriber_request +DeleteSubscriptionDefinitionRequest,delete_subscription_definition_request +DeleteSubscriptionFilterRequest,delete_subscription_filter_request +DeleteSuggesterRequest,delete_suggester_request +DeleteSuggesterResponse,delete_suggester_response +DeleteSuiteDefinitionRequest,delete_suite_definition_request +DeleteSuppressedDestinationRequest,delete_suppressed_destination_request +DeleteSyncJobRequest,delete_sync_job_request +DeleteSyncJobResponse,delete_sync_job_response +DeleteSystemInstanceRequest,delete_system_instance_request +DeleteSystemTemplateRequest,delete_system_template_request +DeleteTLSInspectionConfigurationRequest,delete_tls_inspection_configuration_request +DeleteTLSInspectionConfigurationResponse,delete_tls_inspection_configuration_response +DeleteTableInput,delete_table_input +DeleteTableOutput,delete_table_output +DeleteTableRequest,delete_table_request +DeleteTableVersionRequest,delete_table_version_request +DeleteTagOptionInput,delete_tag_option_input +DeleteTagsForDomainRequest,delete_tags_for_domain_request +DeleteTagsInput,delete_tags_input +DeleteTagsMessage,delete_tags_message +DeleteTagsOutput,delete_tags_output +DeleteTagsRequest,delete_tags_request +DeleteTagsType,delete_tags_type +DeleteTapeArchiveInput,delete_tape_archive_input +DeleteTapeArchiveOutput,delete_tape_archive_output +DeleteTapeInput,delete_tape_input +DeleteTapeOutput,delete_tape_output +DeleteTapePoolInput,delete_tape_pool_input +DeleteTapePoolOutput,delete_tape_pool_output +DeleteTarget,delete_target +DeleteTargetGroupInput,delete_target_group_input +DeleteTargetGroupRequest,delete_target_group_request +DeleteTargetGroupResponse,delete_target_group_response +DeleteTargetRequest,delete_target_request +DeleteTaskDefinitionsRequest,delete_task_definitions_request +DeleteTaskDefinitionsResponse,delete_task_definitions_response +DeleteTaskRequest,delete_task_request +DeleteTaskSetRequest,delete_task_set_request +DeleteTaskSetResponse,delete_task_set_response +DeleteTaskTemplateRequest,delete_task_template_request +DeleteTemplateAliasRequest,delete_template_alias_request +DeleteTemplateAliasResponse,delete_template_alias_response +DeleteTemplateGroupAccessControlEntryRequest,delete_template_group_access_control_entry_request +DeleteTemplateRequest,delete_template_request +DeleteTemplateResponse,delete_template_response +DeleteTemplateSyncConfigInput,delete_template_sync_config_input +DeleteTemplateSyncConfigOutput,delete_template_sync_config_output +DeleteTerminologyRequest,delete_terminology_request +DeleteTestGridProjectRequest,delete_test_grid_project_request +DeleteTestSetRequest,delete_test_set_request +DeleteTextMessageSpendLimitOverrideResult,delete_text_message_spend_limit_override_result +DeleteThemeAliasRequest,delete_theme_alias_request +DeleteThemeAliasResponse,delete_theme_alias_response +DeleteThemeRequest,delete_theme_request +DeleteThemeResponse,delete_theme_response +DeleteThesaurusRequest,delete_thesaurus_request +DeleteThingGroupRequest,delete_thing_group_request +DeleteThingRequest,delete_thing_request +DeleteThingShadowRequest,delete_thing_shadow_request +DeleteThingShadowResponse,delete_thing_shadow_response +DeleteThingTypeRequest,delete_thing_type_request +DeleteThreatIntelSetRequest,delete_threat_intel_set_request +DeleteTime,delete_time +DeleteTimeSeriesRequest,delete_time_series_request +DeleteTimelineEventInput,delete_timeline_event_input +DeleteTimestamp,delete_timestamp +DeleteTokenRequest,delete_token_request +DeleteTokenResponse,delete_token_response +DeleteTopicInput,delete_topic_input +DeleteTopicRefreshScheduleRequest,delete_topic_refresh_schedule_request +DeleteTopicRefreshScheduleResponse,delete_topic_refresh_schedule_response +DeleteTopicRequest,delete_topic_request +DeleteTopicResponse,delete_topic_response +DeleteTopicRuleDestinationRequest,delete_topic_rule_destination_request +DeleteTopicRuleRequest,delete_topic_rule_request +DeleteTrackerRequest,delete_tracker_request +DeleteTrafficDistributionGroupRequest,delete_traffic_distribution_group_request +DeleteTrafficMirrorFilterRequest,delete_traffic_mirror_filter_request +DeleteTrafficMirrorFilterResult,delete_traffic_mirror_filter_result +DeleteTrafficMirrorFilterRuleRequest,delete_traffic_mirror_filter_rule_request +DeleteTrafficMirrorFilterRuleResult,delete_traffic_mirror_filter_rule_result +DeleteTrafficMirrorSessionRequest,delete_traffic_mirror_session_request +DeleteTrafficMirrorSessionResult,delete_traffic_mirror_session_result +DeleteTrafficMirrorTargetRequest,delete_traffic_mirror_target_request +DeleteTrafficMirrorTargetResult,delete_traffic_mirror_target_result +DeleteTrafficPolicyInstanceRequest,delete_traffic_policy_instance_request +DeleteTrafficPolicyRequest,delete_traffic_policy_request +DeleteTrailRequest,delete_trail_request +DeleteTranscriptionJobRequest,delete_transcription_job_request +DeleteTransitGatewayConnectPeerRequest,delete_transit_gateway_connect_peer_request +DeleteTransitGatewayConnectPeerResult,delete_transit_gateway_connect_peer_result +DeleteTransitGatewayConnectRequest,delete_transit_gateway_connect_request +DeleteTransitGatewayConnectResult,delete_transit_gateway_connect_result +DeleteTransitGatewayMulticastDomainRequest,delete_transit_gateway_multicast_domain_request +DeleteTransitGatewayMulticastDomainResult,delete_transit_gateway_multicast_domain_result +DeleteTransitGatewayPeeringAttachmentRequest,delete_transit_gateway_peering_attachment_request +DeleteTransitGatewayPeeringAttachmentResult,delete_transit_gateway_peering_attachment_result +DeleteTransitGatewayPolicyTableRequest,delete_transit_gateway_policy_table_request +DeleteTransitGatewayPolicyTableResult,delete_transit_gateway_policy_table_result +DeleteTransitGatewayPrefixListReferenceRequest,delete_transit_gateway_prefix_list_reference_request +DeleteTransitGatewayPrefixListReferenceResult,delete_transit_gateway_prefix_list_reference_result +DeleteTransitGatewayRequest,delete_transit_gateway_request +DeleteTransitGatewayResult,delete_transit_gateway_result +DeleteTransitGatewayRouteRequest,delete_transit_gateway_route_request +DeleteTransitGatewayRouteResult,delete_transit_gateway_route_result +DeleteTransitGatewayRouteTableAnnouncementRequest,delete_transit_gateway_route_table_announcement_request +DeleteTransitGatewayRouteTableAnnouncementResult,delete_transit_gateway_route_table_announcement_result +DeleteTransitGatewayRouteTableRequest,delete_transit_gateway_route_table_request +DeleteTransitGatewayRouteTableResult,delete_transit_gateway_route_table_result +DeleteTransitGatewayVpcAttachmentRequest,delete_transit_gateway_vpc_attachment_request +DeleteTransitGatewayVpcAttachmentResult,delete_transit_gateway_vpc_attachment_result +DeleteTrialComponentRequest,delete_trial_component_request +DeleteTrialComponentResponse,delete_trial_component_response +DeleteTrialRequest,delete_trial_request +DeleteTrialResponse,delete_trial_response +DeleteTriggerRequest,delete_trigger_request +DeleteTriggerResponse,delete_trigger_response +DeleteTrustRequest,delete_trust_request +DeleteTrustResult,delete_trust_result +DeleteTrustStoreRequest,delete_trust_store_request +DeleteTypeRequest,delete_type_request +DeleteTypedLinkFacetRequest,delete_typed_link_facet_request +DeleteUnusedFMManagedResources,delete_unused_fm_managed_resources +DeleteUploadRequest,delete_upload_request +DeleteUsageLimitMessage,delete_usage_limit_message +DeleteUsageLimitRequest,delete_usage_limit_request +DeleteUsageLimitResponse,delete_usage_limit_response +DeleteUsagePlanKeyRequest,delete_usage_plan_key_request +DeleteUsagePlanRequest,delete_usage_plan_request +DeleteUseCaseRequest,delete_use_case_request +DeleteUserAccessLoggingSettingsRequest,delete_user_access_logging_settings_request +DeleteUserAttributesRequest,delete_user_attributes_request +DeleteUserByPrincipalIdRequest,delete_user_by_principal_id_request +DeleteUserByPrincipalIdResponse,delete_user_by_principal_id_response +DeleteUserDefinedFunctionRequest,delete_user_defined_function_request +DeleteUserEndpointsRequest,delete_user_endpoints_request +DeleteUserEndpointsResponse,delete_user_endpoints_response +DeleteUserGroupMessage,delete_user_group_message +DeleteUserHierarchyGroupRequest,delete_user_hierarchy_group_request +DeleteUserMessage,delete_user_message +DeleteUserPermissionsBoundaryRequest,delete_user_permissions_boundary_request +DeleteUserPolicyRequest,delete_user_policy_request +DeleteUserPoolClientRequest,delete_user_pool_client_request +DeleteUserPoolDomainRequest,delete_user_pool_domain_request +DeleteUserPoolRequest,delete_user_pool_request +DeleteUserProfileRequest,delete_user_profile_request +DeleteUserProfileResult,delete_user_profile_result +DeleteUserRequest,delete_user_request +DeleteUserResponse,delete_user_response +DeleteUserSettingsRequest,delete_user_settings_request +DeleteUtterancesRequest,delete_utterances_request +DeleteV2LoggingLevelRequest,delete_v2_logging_level_request +DeleteVPCAssociationAuthorizationRequest,delete_vpc_association_authorization_request +DeleteVPCConnectionRequest,delete_vpc_connection_request +DeleteVPCConnectionResponse,delete_vpc_connection_response +DeleteVPCEConfigurationRequest,delete_vpce_configuration_request +DeleteVariableRequest,delete_variable_request +DeleteVariantStoreRequest,delete_variant_store_request +DeleteVariantStoreResponse,delete_variant_store_response +DeleteVaultAccessPolicyInput,delete_vault_access_policy_input +DeleteVaultInput,delete_vault_input +DeleteVaultNotificationsInput,delete_vault_notifications_input +DeleteVcenterClientRequest,delete_vcenter_client_request +DeleteVectorEnrichmentJobInput,delete_vector_enrichment_job_input +DeleteVehicleRequest,delete_vehicle_request +DeleteVehicleResponse,delete_vehicle_response +DeleteVerifiedAccessEndpointRequest,delete_verified_access_endpoint_request +DeleteVerifiedAccessEndpointResult,delete_verified_access_endpoint_result +DeleteVerifiedAccessGroupRequest,delete_verified_access_group_request +DeleteVerifiedAccessGroupResult,delete_verified_access_group_result +DeleteVerifiedAccessInstanceRequest,delete_verified_access_instance_request +DeleteVerifiedAccessInstanceResult,delete_verified_access_instance_result +DeleteVerifiedAccessTrustProviderRequest,delete_verified_access_trust_provider_request +DeleteVerifiedAccessTrustProviderResult,delete_verified_access_trust_provider_result +DeleteVerifiedEmailAddressRequest,delete_verified_email_address_request +DeleteViewInput,delete_view_input +DeleteViewOutput,delete_view_output +DeleteViewRequest,delete_view_request +DeleteViewVersionRequest,delete_view_version_request +DeleteVirtualClusterRequest,delete_virtual_cluster_request +DeleteVirtualClusterResponse,delete_virtual_cluster_response +DeleteVirtualGatewayInput,delete_virtual_gateway_input +DeleteVirtualGatewayOutput,delete_virtual_gateway_output +DeleteVirtualInterfaceRequest,delete_virtual_interface_request +DeleteVirtualInterfaceResponse,delete_virtual_interface_response +DeleteVirtualMFADeviceRequest,delete_virtual_mfa_device_request +DeleteVirtualNodeInput,delete_virtual_node_input +DeleteVirtualNodeOutput,delete_virtual_node_output +DeleteVirtualRouterInput,delete_virtual_router_input +DeleteVirtualRouterOutput,delete_virtual_router_output +DeleteVirtualServiceInput,delete_virtual_service_input +DeleteVirtualServiceOutput,delete_virtual_service_output +DeleteVocabularyFilterRequest,delete_vocabulary_filter_request +DeleteVocabularyRequest,delete_vocabulary_request +DeleteVocabularyResponse,delete_vocabulary_response +DeleteVodSourceRequest,delete_vod_source_request +DeleteVoiceChannelRequest,delete_voice_channel_request +DeleteVoiceChannelResponse,delete_voice_channel_response +DeleteVoiceConnectorEmergencyCallingConfigurationRequest,delete_voice_connector_emergency_calling_configuration_request +DeleteVoiceConnectorGroupRequest,delete_voice_connector_group_request +DeleteVoiceConnectorOriginationRequest,delete_voice_connector_origination_request +DeleteVoiceConnectorProxyRequest,delete_voice_connector_proxy_request +DeleteVoiceConnectorRequest,delete_voice_connector_request +DeleteVoiceConnectorStreamingConfigurationRequest,delete_voice_connector_streaming_configuration_request +DeleteVoiceConnectorTerminationCredentialsRequest,delete_voice_connector_termination_credentials_request +DeleteVoiceConnectorTerminationRequest,delete_voice_connector_termination_request +DeleteVoiceMessageSpendLimitOverrideResult,delete_voice_message_spend_limit_override_result +DeleteVoiceProfileDomainRequest,delete_voice_profile_domain_request +DeleteVoiceProfileRequest,delete_voice_profile_request +DeleteVoiceTemplateRequest,delete_voice_template_request +DeleteVoiceTemplateResponse,delete_voice_template_response +DeleteVolumeInput,delete_volume_input +DeleteVolumeOntapConfiguration,delete_volume_ontap_configuration +DeleteVolumeOntapResponse,delete_volume_ontap_response +DeleteVolumeOpenZFSConfiguration,delete_volume_open_zfs_configuration +DeleteVolumeOutput,delete_volume_output +DeleteVolumeRequest,delete_volume_request +DeleteVolumeResponse,delete_volume_response +DeleteVolumes,delete_volumes +DeleteVpcConfig,delete_vpc_config +DeleteVpcConnectionRequest,delete_vpc_connection_request +DeleteVpcConnectionResponse,delete_vpc_connection_response +DeleteVpcConnectorRequest,delete_vpc_connector_request +DeleteVpcConnectorResponse,delete_vpc_connector_response +DeleteVpcEndpointConnectionNotificationsRequest,delete_vpc_endpoint_connection_notifications_request +DeleteVpcEndpointConnectionNotificationsResult,delete_vpc_endpoint_connection_notifications_result +DeleteVpcEndpointDetail,delete_vpc_endpoint_detail +DeleteVpcEndpointRequest,delete_vpc_endpoint_request +DeleteVpcEndpointResponse,delete_vpc_endpoint_response +DeleteVpcEndpointServiceConfigurationsRequest,delete_vpc_endpoint_service_configurations_request +DeleteVpcEndpointServiceConfigurationsResult,delete_vpc_endpoint_service_configurations_result +DeleteVpcEndpointsRequest,delete_vpc_endpoints_request +DeleteVpcEndpointsResult,delete_vpc_endpoints_result +DeleteVpcIngressConnectionRequest,delete_vpc_ingress_connection_request +DeleteVpcIngressConnectionResponse,delete_vpc_ingress_connection_response +DeleteVpcLinkRequest,delete_vpc_link_request +DeleteVpcPeeringAuthorizationInput,delete_vpc_peering_authorization_input +DeleteVpcPeeringConnectionInput,delete_vpc_peering_connection_input +DeleteVpcPeeringConnectionRequest,delete_vpc_peering_connection_request +DeleteVpcPeeringConnectionResult,delete_vpc_peering_connection_result +DeleteVpcRequest,delete_vpc_request +DeleteVpnConnectionRequest,delete_vpn_connection_request +DeleteVpnConnectionRouteRequest,delete_vpn_connection_route_request +DeleteVpnGatewayRequest,delete_vpn_gateway_request +DeleteWarmPoolType,delete_warm_pool_type +DeleteWatchlistRequest,delete_watchlist_request +DeleteWaveRequest,delete_wave_request +DeleteWebACLRequest,delete_web_acl_request +DeleteWebACLResponse,delete_web_acl_response +DeleteWebhookInput,delete_webhook_input +DeleteWebhookRequest,delete_webhook_request +DeleteWebhookResult,delete_webhook_result +DeleteWhatIfAnalysisRequest,delete_what_if_analysis_request +DeleteWhatIfForecastExportRequest,delete_what_if_forecast_export_request +DeleteWhatIfForecastRequest,delete_what_if_forecast_request +DeleteWirelessDeviceImportTaskRequest,delete_wireless_device_import_task_request +DeleteWirelessDeviceRequest,delete_wireless_device_request +DeleteWirelessGatewayRequest,delete_wireless_gateway_request +DeleteWirelessGatewayTaskDefinitionRequest,delete_wireless_gateway_task_definition_request +DeleteWirelessGatewayTaskRequest,delete_wireless_gateway_task_request +DeleteWorkGroupInput,delete_work_group_input +DeleteWorkerBlockRequest,delete_worker_block_request +DeleteWorkerFleetRequest,delete_worker_fleet_request +DeleteWorkerRequest,delete_worker_request +DeleteWorkflowRequest,delete_workflow_request +DeleteWorkflowResponse,delete_workflow_response +DeleteWorkflowStepGroupRequest,delete_workflow_step_group_request +DeleteWorkflowStepRequest,delete_workflow_step_request +DeleteWorkforceRequest,delete_workforce_request +DeleteWorkgroupRequest,delete_workgroup_request +DeleteWorkgroupResponse,delete_workgroup_response +DeleteWorkloadInput,delete_workload_input +DeleteWorkloadShareInput,delete_workload_share_input +DeleteWorkspaceApiKeyRequest,delete_workspace_api_key_request +DeleteWorkspaceApiKeyResponse,delete_workspace_api_key_response +DeleteWorkspaceBundleRequest,delete_workspace_bundle_request +DeleteWorkspaceImageRequest,delete_workspace_image_request +DeleteWorkspaceRequest,delete_workspace_request +DeleteWorkspaceResponse,delete_workspace_response +DeleteWorkteamRequest,delete_workteam_request +DeleteWorkteamResponse,delete_workteam_response +DeleteWorldTemplateRequest,delete_world_template_request +DeleteXssMatchSetRequest,delete_xss_match_set_request +DeleteXssMatchSetResponse,delete_xss_match_set_response +Deleted,deleted +DeletedAt,deleted_at +DeletedDate,deleted_date +DeletedFaces,deleted_faces +DeletedObject,deleted_object +DeletedParameters,deleted_parameters +DeletedSubnetCidrReservation,deleted_subnet_cidr_reservation +Deletes,deletes +DeletionConfig,deletion_config +DeletionDate,deletion_date +DeletionId,deletion_id +DeletionMessage,deletion_message +DeletionMode,deletion_mode +DeletionProtection,deletion_protection +DeletionProtectionEnabled,deletion_protection_enabled +DeletionStartTime,deletion_start_time +DeletionStatus,deletion_status +DeletionSummary,deletion_summary +DeletionTaskFailureReasonType,deletion_task_failure_reason_type +DeletionTaskId,deletion_task_id +DeletionTime,deletion_time +DeletionTimestamp,deletion_timestamp +DelimitedTextImportOptions,delimited_text_import_options +Delimiter,delimiter +DeliverConfigSnapshotRequest,deliver_config_snapshot_request +DeliverConfigSnapshotResponse,deliver_config_snapshot_response +DeliverCrossAccountRole,deliver_cross_account_role +DeliverLogsErrorMessage,deliver_logs_error_message +DeliverLogsPermissionArn,deliver_logs_permission_arn +DeliverLogsStatus,deliver_logs_status +DeliverabilityTestReport,deliverability_test_report +DeliverabilityTestReports,deliverability_test_reports +DeliverabilityTestStatus,deliverability_test_status +DeliveredTimestamp,delivered_timestamp +DeliveryAddress,delivery_address +DeliveryAttempts,delivery_attempts +DeliveryChannel,delivery_channel +DeliveryChannelName,delivery_channel_name +DeliveryChannelNames,delivery_channel_names +DeliveryChannelStatus,delivery_channel_status +DeliveryChannels,delivery_channels +DeliveryChannelsStatus,delivery_channels_status +DeliveryMedium,delivery_medium +DeliveryMethod,delivery_method +DeliveryOptions,delivery_options +DeliveryRestrictions,delivery_restrictions +DeliveryS3Bucket,delivery_s3_bucket +DeliveryS3KeyPrefix,delivery_s3_key_prefix +DeliveryS3Uri,delivery_s3_uri +DeliveryStartTimestamp,delivery_start_timestamp +DeliveryStatus,delivery_status +DeliveryStream,delivery_stream +DeliveryStreamARN,delivery_stream_arn +DeliveryStreamArn,delivery_stream_arn +DeliveryStreamDescription,delivery_stream_description +DeliveryStreamEncryptionConfiguration,delivery_stream_encryption_configuration +DeliveryStreamEncryptionConfigurationInput,delivery_stream_encryption_configuration_input +DeliveryStreamName,delivery_stream_name +DeliveryStreamNames,delivery_stream_names +DeliveryStreamStatus,delivery_stream_status +DeliveryStreamType,delivery_stream_type +DeliveryTime,delivery_time +DeliveryTimedOutCount,delivery_timed_out_count +DeliveryTopic,delivery_topic +DeliveryUri,delivery_uri +DeltaSyncConfig,delta_sync_config +DeltaTables,delta_tables +DeltaTarget,delta_target +DeltaTargets,delta_targets +DeltaTime,delta_time +DeltaTimeSessionWindowConfiguration,delta_time_session_window_configuration +DemodulationConfig,demodulation_config +Demographic,demographic +Denied,denied +DenoiseFilter,denoise_filter +DenyAllIgwTraffic,deny_all_igw_traffic +DenyAllTrafficToEndpoint,deny_all_traffic_to_endpoint +DenyCustomRoutingTrafficRequest,deny_custom_routing_traffic_request +DepartNow,depart_now +Department,department +DeparturePosition,departure_position +DeparturePositions,departure_positions +DepartureTime,departure_time +Dependencies,dependencies +DependencyAccessDeniedException,dependency_access_denied_exception +DependencyCopyPath,dependency_copy_path +DependencyException,dependency_exception +DependencyFailedException,dependency_failed_exception +DependencyFailureException,dependency_failure_exception +DependencyOriginPath,dependency_origin_path +DependencyRevision,dependency_revision +DependencyThrottleException,dependency_throttle_exception +DependencyTimeout,dependency_timeout +DependencyTimeoutException,dependency_timeout_exception +DependentEntities,dependent_entities +DependentEntity,dependent_entity +DependentJobName,dependent_job_name +DependentResourceIds,dependent_resource_ids +DependentService,dependent_service +DependentServiceFailureException,dependent_service_failure_exception +DependentServiceRequestThrottlingFault,dependent_service_request_throttling_fault +DependentServiceUnavailableFault,dependent_service_unavailable_fault +DependentServices,dependent_services +DependsOn,depends_on +Deploy,deploy +DeployAsApplicationConfiguration,deploy_as_application_configuration +DeployAsApplicationConfigurationDescription,deploy_as_application_configuration_description +DeployAsApplicationConfigurationUpdate,deploy_as_application_configuration_update +DeploySystemInstanceRequest,deploy_system_instance_request +DeploySystemInstanceResponse,deploy_system_instance_response +Deployed,deployed +DeployedImage,deployed_image +DeployedImages,deployed_images +DeployedStageName,deployed_stage_name +DeployedVersionSummary,deployed_version_summary +Deployment,deployment +DeploymentAction,deployment_action +DeploymentAlarms,deployment_alarms +DeploymentAlreadyCompletedException,deployment_already_completed_exception +DeploymentApplicationConfig,deployment_application_config +DeploymentArn,deployment_arn +DeploymentCanarySettings,deployment_canary_settings +DeploymentCircuitBreaker,deployment_circuit_breaker +DeploymentCommand,deployment_command +DeploymentComponentUpdatePolicy,deployment_component_update_policy +DeploymentConfig,deployment_config +DeploymentConfigAlreadyExistsException,deployment_config_already_exists_exception +DeploymentConfigDoesNotExistException,deployment_config_does_not_exist_exception +DeploymentConfigInUseException,deployment_config_in_use_exception +DeploymentConfigInfo,deployment_config_info +DeploymentConfigLimitExceededException,deployment_config_limit_exceeded_exception +DeploymentConfigNameRequiredException,deployment_config_name_required_exception +DeploymentConfiguration,deployment_configuration +DeploymentConfigurationValidationPolicy,deployment_configuration_validation_policy +DeploymentController,deployment_controller +DeploymentDoesNotExistException,deployment_does_not_exist_exception +DeploymentDurationInMinutes,deployment_duration_in_minutes +DeploymentEndTime,deployment_end_time +DeploymentEvent,deployment_event +DeploymentGroupAlreadyExistsException,deployment_group_already_exists_exception +DeploymentGroupDoesNotExistException,deployment_group_does_not_exist_exception +DeploymentGroupInfo,deployment_group_info +DeploymentGroupLimitExceededException,deployment_group_limit_exceeded_exception +DeploymentGroupNameRequiredException,deployment_group_name_required_exception +DeploymentId,deployment_id +DeploymentIdRequiredException,deployment_id_required_exception +DeploymentIds,deployment_ids +DeploymentInfo,deployment_info +DeploymentIoTJobConfiguration,deployment_io_t_job_configuration +DeploymentIsNotInReadyStateException,deployment_is_not_in_ready_state_exception +DeploymentJob,deployment_job +DeploymentLaunchConfig,deployment_launch_config +DeploymentLimitExceededException,deployment_limit_exceeded_exception +DeploymentMode,deployment_mode +DeploymentModel,deployment_model +DeploymentModels,deployment_models +DeploymentName,deployment_name +DeploymentNotStartedException,deployment_not_started_exception +DeploymentNumber,deployment_number +DeploymentOption,deployment_option +DeploymentOverview,deployment_overview +DeploymentPolicies,deployment_policies +DeploymentReadyOption,deployment_ready_option +DeploymentRecommendation,deployment_recommendation +DeploymentResult,deployment_result +DeploymentStage,deployment_stage +DeploymentStageStatusSummary,deployment_stage_status_summary +DeploymentStartTime,deployment_start_time +DeploymentState,deployment_state +DeploymentStatus,deployment_status +DeploymentStatusMessage,deployment_status_message +DeploymentStrategies,deployment_strategies +DeploymentStrategy,deployment_strategy +DeploymentStrategyId,deployment_strategy_id +DeploymentStyle,deployment_style +DeploymentSummary,deployment_summary +DeploymentTarget,deployment_target +DeploymentTargetDoesNotExistException,deployment_target_does_not_exist_exception +DeploymentTargetIdRequiredException,deployment_target_id_required_exception +DeploymentTargetListSizeExceededException,deployment_target_list_size_exceeded_exception +DeploymentTargets,deployment_targets +DeploymentTime,deployment_time +DeploymentType,deployment_type +Deployments,deployments +DeprecateActivityTypeInput,deprecate_activity_type_input +DeprecateAt,deprecate_at +DeprecateDomainInput,deprecate_domain_input +DeprecateFlowTemplateRequest,deprecate_flow_template_request +DeprecateRule,deprecate_rule +DeprecateSystemTemplateRequest,deprecate_system_template_request +DeprecateThingTypeRequest,deprecate_thing_type_request +DeprecateWorkflowTypeInput,deprecate_workflow_type_input +DeprecatedStatus,deprecated_status +DeprecationDate,deprecation_date +DeprecationTime,deprecation_time +DeprovisionByoipCidrRequest,deprovision_byoip_cidr_request +DeprovisionByoipCidrResponse,deprovision_byoip_cidr_response +DeprovisionByoipCidrResult,deprovision_byoip_cidr_result +DeprovisionIpamPoolCidrRequest,deprovision_ipam_pool_cidr_request +DeprovisionIpamPoolCidrResult,deprovision_ipam_pool_cidr_result +DeprovisionPublicIpv4PoolCidrRequest,deprovision_public_ipv4_pool_cidr_request +DeprovisionPublicIpv4PoolCidrResult,deprovision_public_ipv4_pool_cidr_result +DeprovisionedAddresses,deprovisioned_addresses +DeregisterAccountResponse,deregister_account_response +DeregisterAppInstanceUserEndpointRequest,deregister_app_instance_user_endpoint_request +DeregisterApplicationInput,deregister_application_input +DeregisterCertificateRequest,deregister_certificate_request +DeregisterClusterRequest,deregister_cluster_request +DeregisterClusterResponse,deregister_cluster_response +DeregisterComputeInput,deregister_compute_input +DeregisterContainerInstanceRequest,deregister_container_instance_request +DeregisterContainerInstanceResponse,deregister_container_instance_response +DeregisterDBProxyTargetsRequest,deregister_db_proxy_targets_request +DeregisterDelegatedAdministratorRequest,deregister_delegated_administrator_request +DeregisterDevicesRequest,deregister_devices_request +DeregisterEcsClusterRequest,deregister_ecs_cluster_request +DeregisterElasticIpRequest,deregister_elastic_ip_request +DeregisterEndPointsInput,deregister_end_points_input +DeregisterEndPointsOutput,deregister_end_points_output +DeregisterEventTopicRequest,deregister_event_topic_request +DeregisterFromWorkMailRequest,deregister_from_work_mail_request +DeregisterGameServerInput,deregister_game_server_input +DeregisterGatewayInstanceRequest,deregister_gateway_instance_request +DeregisterGatewayInstanceResponse,deregister_gateway_instance_response +DeregisterIdentityProviderRequest,deregister_identity_provider_request +DeregisterIdentityProviderResponse,deregister_identity_provider_response +DeregisterImageRequest,deregister_image_request +DeregisterInstanceEventNotificationAttributesRequest,deregister_instance_event_notification_attributes_request +DeregisterInstanceEventNotificationAttributesResult,deregister_instance_event_notification_attributes_result +DeregisterInstanceRequest,deregister_instance_request +DeregisterInstanceResponse,deregister_instance_response +DeregisterInstanceTagAttributeRequest,deregister_instance_tag_attribute_request +DeregisterJobDefinitionRequest,deregister_job_definition_request +DeregisterMailDomainRequest,deregister_mail_domain_request +DeregisterManagedInstanceRequest,deregister_managed_instance_request +DeregisterOnPremisesInstanceInput,deregister_on_premises_instance_input +DeregisterOrganizationAdminAccountRequest,deregister_organization_admin_account_request +DeregisterOrganizationDelegatedAdminRequest,deregister_organization_delegated_admin_request +DeregisterPackageVersionRequest,deregister_package_version_request +DeregisterPatchBaselineForPatchGroupRequest,deregister_patch_baseline_for_patch_group_request +DeregisterPatchBaselineForPatchGroupResult,deregister_patch_baseline_for_patch_group_result +DeregisterRdsDbInstanceRequest,deregister_rds_db_instance_request +DeregisterResourceRequest,deregister_resource_request +DeregisterRobotRequest,deregister_robot_request +DeregisterRobotResponse,deregister_robot_response +DeregisterScalableTargetRequest,deregister_scalable_target_request +DeregisterStreamConsumerInput,deregister_stream_consumer_input +DeregisterTargetFromMaintenanceWindowRequest,deregister_target_from_maintenance_window_request +DeregisterTargetFromMaintenanceWindowResult,deregister_target_from_maintenance_window_result +DeregisterTargetsInput,deregister_targets_input +DeregisterTargetsRequest,deregister_targets_request +DeregisterTargetsResponse,deregister_targets_response +DeregisterTaskDefinitionRequest,deregister_task_definition_request +DeregisterTaskDefinitionResponse,deregister_task_definition_response +DeregisterTaskFromMaintenanceWindowRequest,deregister_task_from_maintenance_window_request +DeregisterTaskFromMaintenanceWindowResult,deregister_task_from_maintenance_window_result +DeregisterTransitGatewayMulticastGroupMembersRequest,deregister_transit_gateway_multicast_group_members_request +DeregisterTransitGatewayMulticastGroupMembersResult,deregister_transit_gateway_multicast_group_members_result +DeregisterTransitGatewayMulticastGroupSourcesRequest,deregister_transit_gateway_multicast_group_sources_request +DeregisterTransitGatewayMulticastGroupSourcesResult,deregister_transit_gateway_multicast_group_sources_result +DeregisterTransitGatewayRequest,deregister_transit_gateway_request +DeregisterTransitGatewayResponse,deregister_transit_gateway_response +DeregisterTypeInput,deregister_type_input +DeregisterVolumeRequest,deregister_volume_request +DeregisterWebhookWithThirdPartyInput,deregister_webhook_with_third_party_input +DeregisterWirelessDeviceRequest,deregister_wireless_device_request +DeregisterWorkspaceDirectoryRequest,deregister_workspace_directory_request +DeregisteredMulticastGroupMembers,deregistered_multicast_group_members +DeregisteredMulticastGroupSources,deregistered_multicast_group_sources +DeregisteredNetworkInterfaceIds,deregistered_network_interface_ids +Deregistering,deregistering +DeregistrationPolicy,deregistration_policy +DeriveKey,derive_key +DerivedDataInputConfig,derived_data_input_config +DerivedInformation,derived_information +DescribeACLsRequest,describe_acls_request +DescribeACLsResponse,describe_acls_response +DescribeAcceleratorAttributesRequest,describe_accelerator_attributes_request +DescribeAcceleratorAttributesResponse,describe_accelerator_attributes_response +DescribeAcceleratorOfferingsRequest,describe_accelerator_offerings_request +DescribeAcceleratorOfferingsResponse,describe_accelerator_offerings_response +DescribeAcceleratorRequest,describe_accelerator_request +DescribeAcceleratorResponse,describe_accelerator_response +DescribeAcceleratorTypesResponse,describe_accelerator_types_response +DescribeAcceleratorsRequest,describe_accelerators_request +DescribeAcceleratorsResponse,describe_accelerators_response +DescribeAccessControlConfigurationRequest,describe_access_control_configuration_request +DescribeAccessControlConfigurationResponse,describe_access_control_configuration_response +DescribeAccessPointsInput,describe_access_points_input +DescribeAccessPointsOutput,describe_access_points_output +DescribeAccessPointsRequest,describe_access_points_request +DescribeAccessPointsResponse,describe_access_points_response +DescribeAccessPolicyRequest,describe_access_policy_request +DescribeAccessPolicyResponse,describe_access_policy_response +DescribeAccessRequest,describe_access_request +DescribeAccessResponse,describe_access_response +DescribeAccountAssignmentCreationStatusRequest,describe_account_assignment_creation_status_request +DescribeAccountAssignmentCreationStatusResponse,describe_account_assignment_creation_status_response +DescribeAccountAssignmentDeletionStatusRequest,describe_account_assignment_deletion_status_request +DescribeAccountAssignmentDeletionStatusResponse,describe_account_assignment_deletion_status_response +DescribeAccountAttributesMessage,describe_account_attributes_message +DescribeAccountAttributesRequest,describe_account_attributes_request +DescribeAccountAttributesResponse,describe_account_attributes_response +DescribeAccountAttributesResult,describe_account_attributes_result +DescribeAccountAuditConfigurationResponse,describe_account_audit_configuration_response +DescribeAccountConfigurationResponse,describe_account_configuration_response +DescribeAccountCustomizationRequest,describe_account_customization_request +DescribeAccountCustomizationResponse,describe_account_customization_response +DescribeAccountHealthResponse,describe_account_health_response +DescribeAccountLimitsAnswer,describe_account_limits_answer +DescribeAccountLimitsInput,describe_account_limits_input +DescribeAccountLimitsOutput,describe_account_limits_output +DescribeAccountLimitsRequest,describe_account_limits_request +DescribeAccountLimitsResult,describe_account_limits_result +DescribeAccountModificationsRequest,describe_account_modifications_request +DescribeAccountModificationsResult,describe_account_modifications_result +DescribeAccountOverviewRequest,describe_account_overview_request +DescribeAccountOverviewResponse,describe_account_overview_response +DescribeAccountPoliciesRequest,describe_account_policies_request +DescribeAccountPoliciesResponse,describe_account_policies_response +DescribeAccountPreferencesRequest,describe_account_preferences_request +DescribeAccountPreferencesResponse,describe_account_preferences_response +DescribeAccountRequest,describe_account_request +DescribeAccountResponse,describe_account_response +DescribeAccountResult,describe_account_result +DescribeAccountSettingsRequest,describe_account_settings_request +DescribeAccountSettingsResponse,describe_account_settings_response +DescribeAccountSubscriptionRequest,describe_account_subscription_request +DescribeAccountSubscriptionResponse,describe_account_subscription_response +DescribeActionRequest,describe_action_request +DescribeActionResponse,describe_action_response +DescribeActionTargetsRequest,describe_action_targets_request +DescribeActionTargetsResponse,describe_action_targets_response +DescribeActivationsFilter,describe_activations_filter +DescribeActivationsRequest,describe_activations_request +DescribeActivationsResult,describe_activations_result +DescribeActiveReceiptRuleSetResponse,describe_active_receipt_rule_set_response +DescribeActivitiesRequest,describe_activities_request +DescribeActivitiesResponse,describe_activities_response +DescribeActivityInput,describe_activity_input +DescribeActivityOutput,describe_activity_output +DescribeActivityTypeInput,describe_activity_type_input +DescribeAddonConfigurationRequest,describe_addon_configuration_request +DescribeAddonConfigurationResponse,describe_addon_configuration_response +DescribeAddonRequest,describe_addon_request +DescribeAddonResponse,describe_addon_response +DescribeAddonVersionsRequest,describe_addon_versions_request +DescribeAddonVersionsResponse,describe_addon_versions_response +DescribeAddressRequest,describe_address_request +DescribeAddressResult,describe_address_result +DescribeAddressTransfersRequest,describe_address_transfers_request +DescribeAddressTransfersResult,describe_address_transfers_result +DescribeAddressesAttributeRequest,describe_addresses_attribute_request +DescribeAddressesAttributeResult,describe_addresses_attribute_result +DescribeAddressesRequest,describe_addresses_request +DescribeAddressesResult,describe_addresses_result +DescribeAdjustmentTypesAnswer,describe_adjustment_types_answer +DescribeAffectedAccountsForOrganizationRequest,describe_affected_accounts_for_organization_request +DescribeAffectedAccountsForOrganizationResponse,describe_affected_accounts_for_organization_response +DescribeAffectedEntitiesForOrganizationRequest,describe_affected_entities_for_organization_request +DescribeAffectedEntitiesForOrganizationResponse,describe_affected_entities_for_organization_response +DescribeAffectedEntitiesRequest,describe_affected_entities_request +DescribeAffectedEntitiesResponse,describe_affected_entities_response +DescribeAgentRequest,describe_agent_request +DescribeAgentResponse,describe_agent_response +DescribeAgentStatusRequest,describe_agent_status_request +DescribeAgentStatusResponse,describe_agent_status_response +DescribeAgentVersionsRequest,describe_agent_versions_request +DescribeAgentVersionsResult,describe_agent_versions_result +DescribeAgentsRequest,describe_agents_request +DescribeAgentsResponse,describe_agents_response +DescribeAggregateComplianceByConfigRulesRequest,describe_aggregate_compliance_by_config_rules_request +DescribeAggregateComplianceByConfigRulesResponse,describe_aggregate_compliance_by_config_rules_response +DescribeAggregateComplianceByConformancePacksRequest,describe_aggregate_compliance_by_conformance_packs_request +DescribeAggregateComplianceByConformancePacksResponse,describe_aggregate_compliance_by_conformance_packs_response +DescribeAggregateIdFormatRequest,describe_aggregate_id_format_request +DescribeAggregateIdFormatResult,describe_aggregate_id_format_result +DescribeAggregationAuthorizationsRequest,describe_aggregation_authorizations_request +DescribeAggregationAuthorizationsResponse,describe_aggregation_authorizations_response +DescribeAgreementRequest,describe_agreement_request +DescribeAgreementResponse,describe_agreement_response +DescribeAlarmHistoryInput,describe_alarm_history_input +DescribeAlarmHistoryOutput,describe_alarm_history_output +DescribeAlarmModelRequest,describe_alarm_model_request +DescribeAlarmModelResponse,describe_alarm_model_response +DescribeAlarmRequest,describe_alarm_request +DescribeAlarmResponse,describe_alarm_response +DescribeAlarmsForMetricInput,describe_alarms_for_metric_input +DescribeAlarmsForMetricOutput,describe_alarms_for_metric_output +DescribeAlarmsInput,describe_alarms_input +DescribeAlarmsOutput,describe_alarms_output +DescribeAlertManagerDefinitionRequest,describe_alert_manager_definition_request +DescribeAlertManagerDefinitionResponse,describe_alert_manager_definition_response +DescribeAlertRequest,describe_alert_request +DescribeAlertResponse,describe_alert_response +DescribeAlgorithmInput,describe_algorithm_input +DescribeAlgorithmOutput,describe_algorithm_output +DescribeAlgorithmRequest,describe_algorithm_request +DescribeAlgorithmResponse,describe_algorithm_response +DescribeAliasInput,describe_alias_input +DescribeAliasOutput,describe_alias_output +DescribeAllManagedProductsRequest,describe_all_managed_products_request +DescribeAllManagedProductsResponse,describe_all_managed_products_response +DescribeAnalysisDefinitionRequest,describe_analysis_definition_request +DescribeAnalysisDefinitionResponse,describe_analysis_definition_response +DescribeAnalysisPermissionsRequest,describe_analysis_permissions_request +DescribeAnalysisPermissionsResponse,describe_analysis_permissions_response +DescribeAnalysisRequest,describe_analysis_request +DescribeAnalysisResponse,describe_analysis_response +DescribeAnalysisSchemesRequest,describe_analysis_schemes_request +DescribeAnalysisSchemesResponse,describe_analysis_schemes_response +DescribeAnomalyDetectionExecutionsRequest,describe_anomaly_detection_executions_request +DescribeAnomalyDetectionExecutionsResponse,describe_anomaly_detection_executions_response +DescribeAnomalyDetectorRequest,describe_anomaly_detector_request +DescribeAnomalyDetectorResponse,describe_anomaly_detector_response +DescribeAnomalyDetectorsInput,describe_anomaly_detectors_input +DescribeAnomalyDetectorsOutput,describe_anomaly_detectors_output +DescribeAnomalyRequest,describe_anomaly_request +DescribeAnomalyResponse,describe_anomaly_response +DescribeApiDestinationRequest,describe_api_destination_request +DescribeApiDestinationResponse,describe_api_destination_response +DescribeAppAssessmentRequest,describe_app_assessment_request +DescribeAppAssessmentResponse,describe_app_assessment_response +DescribeAppBlockBuilderAppBlockAssociationsRequest,describe_app_block_builder_app_block_associations_request +DescribeAppBlockBuilderAppBlockAssociationsResult,describe_app_block_builder_app_block_associations_result +DescribeAppBlockBuildersRequest,describe_app_block_builders_request +DescribeAppBlockBuildersResult,describe_app_block_builders_result +DescribeAppBlocksRequest,describe_app_blocks_request +DescribeAppBlocksResult,describe_app_blocks_result +DescribeAppImageConfigRequest,describe_app_image_config_request +DescribeAppImageConfigResponse,describe_app_image_config_response +DescribeAppInput,describe_app_input +DescribeAppInstanceAdminRequest,describe_app_instance_admin_request +DescribeAppInstanceAdminResponse,describe_app_instance_admin_response +DescribeAppInstanceBotRequest,describe_app_instance_bot_request +DescribeAppInstanceBotResponse,describe_app_instance_bot_response +DescribeAppInstanceRequest,describe_app_instance_request +DescribeAppInstanceResponse,describe_app_instance_response +DescribeAppInstanceUserEndpointRequest,describe_app_instance_user_endpoint_request +DescribeAppInstanceUserEndpointResponse,describe_app_instance_user_endpoint_response +DescribeAppInstanceUserRequest,describe_app_instance_user_request +DescribeAppInstanceUserResponse,describe_app_instance_user_response +DescribeAppOutput,describe_app_output +DescribeAppRequest,describe_app_request +DescribeAppResponse,describe_app_response +DescribeAppVersionAppComponentRequest,describe_app_version_app_component_request +DescribeAppVersionAppComponentResponse,describe_app_version_app_component_response +DescribeAppVersionRequest,describe_app_version_request +DescribeAppVersionResourceRequest,describe_app_version_resource_request +DescribeAppVersionResourceResponse,describe_app_version_resource_response +DescribeAppVersionResourcesResolutionStatusRequest,describe_app_version_resources_resolution_status_request +DescribeAppVersionResourcesResolutionStatusResponse,describe_app_version_resources_resolution_status_response +DescribeAppVersionResponse,describe_app_version_response +DescribeAppVersionTemplateRequest,describe_app_version_template_request +DescribeAppVersionTemplateResponse,describe_app_version_template_response +DescribeApplicableIndividualAssessmentsMessage,describe_applicable_individual_assessments_message +DescribeApplicableIndividualAssessmentsResponse,describe_applicable_individual_assessments_response +DescribeApplicationFleetAssociationsRequest,describe_application_fleet_associations_request +DescribeApplicationFleetAssociationsResult,describe_application_fleet_associations_result +DescribeApplicationInstanceDetailsRequest,describe_application_instance_details_request +DescribeApplicationInstanceDetailsResponse,describe_application_instance_details_response +DescribeApplicationInstanceRequest,describe_application_instance_request +DescribeApplicationInstanceResponse,describe_application_instance_response +DescribeApplicationRequest,describe_application_request +DescribeApplicationResponse,describe_application_response +DescribeApplicationSnapshotRequest,describe_application_snapshot_request +DescribeApplicationSnapshotResponse,describe_application_snapshot_response +DescribeApplicationStateRequest,describe_application_state_request +DescribeApplicationStateResult,describe_application_state_result +DescribeApplicationVersionRequest,describe_application_version_request +DescribeApplicationVersionResponse,describe_application_version_response +DescribeApplicationVersionsMessage,describe_application_versions_message +DescribeApplicationsMessage,describe_applications_message +DescribeApplicationsRequest,describe_applications_request +DescribeApplicationsResult,describe_applications_result +DescribeAppsRequest,describe_apps_request +DescribeAppsResult,describe_apps_result +DescribeArchiveRequest,describe_archive_request +DescribeArchiveResponse,describe_archive_response +DescribeArtifactRequest,describe_artifact_request +DescribeArtifactResponse,describe_artifact_response +DescribeAssessmentRunsRequest,describe_assessment_runs_request +DescribeAssessmentRunsResponse,describe_assessment_runs_response +DescribeAssessmentTargetsRequest,describe_assessment_targets_request +DescribeAssessmentTargetsResponse,describe_assessment_targets_response +DescribeAssessmentTemplatesRequest,describe_assessment_templates_request +DescribeAssessmentTemplatesResponse,describe_assessment_templates_response +DescribeAssetBundleExportJobRequest,describe_asset_bundle_export_job_request +DescribeAssetBundleExportJobResponse,describe_asset_bundle_export_job_response +DescribeAssetBundleImportJobRequest,describe_asset_bundle_import_job_request +DescribeAssetBundleImportJobResponse,describe_asset_bundle_import_job_response +DescribeAssetModelRequest,describe_asset_model_request +DescribeAssetModelResponse,describe_asset_model_response +DescribeAssetPropertyRequest,describe_asset_property_request +DescribeAssetPropertyResponse,describe_asset_property_response +DescribeAssetRequest,describe_asset_request +DescribeAssetResponse,describe_asset_response +DescribeAssociationExecutionTargetsRequest,describe_association_execution_targets_request +DescribeAssociationExecutionTargetsResult,describe_association_execution_targets_result +DescribeAssociationExecutionsRequest,describe_association_executions_request +DescribeAssociationExecutionsResult,describe_association_executions_result +DescribeAssociationRequest,describe_association_request +DescribeAssociationResult,describe_association_result +DescribeAttachmentLimitExceeded,describe_attachment_limit_exceeded +DescribeAttachmentRequest,describe_attachment_request +DescribeAttachmentResponse,describe_attachment_response +DescribeAttackRequest,describe_attack_request +DescribeAttackResponse,describe_attack_response +DescribeAttackStatisticsResponse,describe_attack_statistics_response +DescribeAuditFindingRequest,describe_audit_finding_request +DescribeAuditFindingResponse,describe_audit_finding_response +DescribeAuditMitigationActionsTaskRequest,describe_audit_mitigation_actions_task_request +DescribeAuditMitigationActionsTaskResponse,describe_audit_mitigation_actions_task_response +DescribeAuditStreamConfigurationRequest,describe_audit_stream_configuration_request +DescribeAuditStreamConfigurationResponse,describe_audit_stream_configuration_response +DescribeAuditSuppressionRequest,describe_audit_suppression_request +DescribeAuditSuppressionResponse,describe_audit_suppression_response +DescribeAuditTaskRequest,describe_audit_task_request +DescribeAuditTaskResponse,describe_audit_task_response +DescribeAuthenticationProfilesMessage,describe_authentication_profiles_message +DescribeAuthenticationProfilesResult,describe_authentication_profiles_result +DescribeAuthorizerRequest,describe_authorizer_request +DescribeAuthorizerResponse,describe_authorizer_response +DescribeAutoMLJobRequest,describe_auto_ml_job_request +DescribeAutoMLJobResponse,describe_auto_ml_job_response +DescribeAutoMLJobV2Request,describe_auto_ml_job_v2_request +DescribeAutoMLJobV2Response,describe_auto_ml_job_v2_response +DescribeAutoPredictorRequest,describe_auto_predictor_request +DescribeAutoPredictorResponse,describe_auto_predictor_response +DescribeAutoScalingConfigurationRequest,describe_auto_scaling_configuration_request +DescribeAutoScalingConfigurationResponse,describe_auto_scaling_configuration_response +DescribeAutoScalingInstancesType,describe_auto_scaling_instances_type +DescribeAutoScalingNotificationTypesAnswer,describe_auto_scaling_notification_types_answer +DescribeAutomationExecutionsRequest,describe_automation_executions_request +DescribeAutomationExecutionsResult,describe_automation_executions_result +DescribeAutomationStepExecutionsRequest,describe_automation_step_executions_request +DescribeAutomationStepExecutionsResult,describe_automation_step_executions_result +DescribeAvailabilityMonitorTestInput,describe_availability_monitor_test_input +DescribeAvailabilityMonitorTestOutput,describe_availability_monitor_test_output +DescribeAvailabilityOptionsRequest,describe_availability_options_request +DescribeAvailabilityOptionsResponse,describe_availability_options_response +DescribeAvailabilityZonesRequest,describe_availability_zones_request +DescribeAvailabilityZonesResult,describe_availability_zones_result +DescribeAvailablePatchesRequest,describe_available_patches_request +DescribeAvailablePatchesResult,describe_available_patches_result +DescribeAwsNetworkPerformanceMetricSubscriptionsRequest,describe_aws_network_performance_metric_subscriptions_request +DescribeAwsNetworkPerformanceMetricSubscriptionsResult,describe_aws_network_performance_metric_subscriptions_result +DescribeBackupInput,describe_backup_input +DescribeBackupJobInput,describe_backup_job_input +DescribeBackupJobOutput,describe_backup_job_output +DescribeBackupOutput,describe_backup_output +DescribeBackupPolicyRequest,describe_backup_policy_request +DescribeBackupVaultInput,describe_backup_vault_input +DescribeBackupVaultOutput,describe_backup_vault_output +DescribeBackupsRequest,describe_backups_request +DescribeBackupsResponse,describe_backups_response +DescribeBandwidthRateLimitInput,describe_bandwidth_rate_limit_input +DescribeBandwidthRateLimitOutput,describe_bandwidth_rate_limit_output +DescribeBandwidthRateLimitScheduleInput,describe_bandwidth_rate_limit_schedule_input +DescribeBandwidthRateLimitScheduleOutput,describe_bandwidth_rate_limit_schedule_output +DescribeBatchInferenceJobRequest,describe_batch_inference_job_request +DescribeBatchInferenceJobResponse,describe_batch_inference_job_response +DescribeBatchLoadTaskRequest,describe_batch_load_task_request +DescribeBatchLoadTaskResponse,describe_batch_load_task_response +DescribeBatchPredictionsInput,describe_batch_predictions_input +DescribeBatchPredictionsOutput,describe_batch_predictions_output +DescribeBatchSegmentJobRequest,describe_batch_segment_job_request +DescribeBatchSegmentJobResponse,describe_batch_segment_job_response +DescribeBillingGroupRequest,describe_billing_group_request +DescribeBillingGroupResponse,describe_billing_group_response +DescribeBlueGreenDeploymentsRequest,describe_blue_green_deployments_request +DescribeBlueGreenDeploymentsResponse,describe_blue_green_deployments_response +DescribeBotAliasRequest,describe_bot_alias_request +DescribeBotAliasResponse,describe_bot_alias_response +DescribeBotLocaleRequest,describe_bot_locale_request +DescribeBotLocaleResponse,describe_bot_locale_response +DescribeBotRecommendationRequest,describe_bot_recommendation_request +DescribeBotRecommendationResponse,describe_bot_recommendation_response +DescribeBotRequest,describe_bot_request +DescribeBotResponse,describe_bot_response +DescribeBotVersionRequest,describe_bot_version_request +DescribeBotVersionResponse,describe_bot_version_response +DescribeBridgeRequest,describe_bridge_request +DescribeBridgeResponse,describe_bridge_response +DescribeBrokerEngineTypesRequest,describe_broker_engine_types_request +DescribeBrokerEngineTypesResponse,describe_broker_engine_types_response +DescribeBrokerInstanceOptionsRequest,describe_broker_instance_options_request +DescribeBrokerInstanceOptionsResponse,describe_broker_instance_options_response +DescribeBrokerRequest,describe_broker_request +DescribeBrokerResponse,describe_broker_response +DescribeBucketsRequest,describe_buckets_request +DescribeBucketsResponse,describe_buckets_response +DescribeBudgetActionHistoriesRequest,describe_budget_action_histories_request +DescribeBudgetActionHistoriesResponse,describe_budget_action_histories_response +DescribeBudgetActionRequest,describe_budget_action_request +DescribeBudgetActionResponse,describe_budget_action_response +DescribeBudgetActionsForAccountRequest,describe_budget_actions_for_account_request +DescribeBudgetActionsForAccountResponse,describe_budget_actions_for_account_response +DescribeBudgetActionsForBudgetRequest,describe_budget_actions_for_budget_request +DescribeBudgetActionsForBudgetResponse,describe_budget_actions_for_budget_response +DescribeBudgetNotificationsForAccountRequest,describe_budget_notifications_for_account_request +DescribeBudgetNotificationsForAccountResponse,describe_budget_notifications_for_account_response +DescribeBudgetPerformanceHistoryRequest,describe_budget_performance_history_request +DescribeBudgetPerformanceHistoryResponse,describe_budget_performance_history_response +DescribeBudgetRequest,describe_budget_request +DescribeBudgetResponse,describe_budget_response +DescribeBudgetsRequest,describe_budgets_request +DescribeBudgetsResponse,describe_budgets_response +DescribeBuildInput,describe_build_input +DescribeBuildOutput,describe_build_output +DescribeBulkImportJobRequest,describe_bulk_import_job_request +DescribeBulkImportJobResponse,describe_bulk_import_job_response +DescribeBundleRequest,describe_bundle_request +DescribeBundleResult,describe_bundle_result +DescribeBundleTasksRequest,describe_bundle_tasks_request +DescribeBundleTasksResult,describe_bundle_tasks_result +DescribeByoipCidrsRequest,describe_byoip_cidrs_request +DescribeByoipCidrsResult,describe_byoip_cidrs_result +DescribeCACertificateRequest,describe_ca_certificate_request +DescribeCACertificateResponse,describe_ca_certificate_response +DescribeCacheClustersMessage,describe_cache_clusters_message +DescribeCacheEngineVersionsMessage,describe_cache_engine_versions_message +DescribeCacheInput,describe_cache_input +DescribeCacheOutput,describe_cache_output +DescribeCacheParameterGroupsMessage,describe_cache_parameter_groups_message +DescribeCacheParametersMessage,describe_cache_parameters_message +DescribeCacheSecurityGroupsMessage,describe_cache_security_groups_message +DescribeCacheSubnetGroupsMessage,describe_cache_subnet_groups_message +DescribeCachediSCSIVolumesInput,describe_cachedi_scsi_volumes_input +DescribeCachediSCSIVolumesOutput,describe_cachedi_scsi_volumes_output +DescribeCampaignRequest,describe_campaign_request +DescribeCampaignResponse,describe_campaign_response +DescribeCanariesLastRunRequest,describe_canaries_last_run_request +DescribeCanariesLastRunResponse,describe_canaries_last_run_response +DescribeCanariesRequest,describe_canaries_request +DescribeCanariesResponse,describe_canaries_response +DescribeCapacityProvidersRequest,describe_capacity_providers_request +DescribeCapacityProvidersResponse,describe_capacity_providers_response +DescribeCapacityReservationFleetsRequest,describe_capacity_reservation_fleets_request +DescribeCapacityReservationFleetsResult,describe_capacity_reservation_fleets_result +DescribeCapacityReservationsRequest,describe_capacity_reservations_request +DescribeCapacityReservationsResult,describe_capacity_reservations_result +DescribeCarrierGatewaysRequest,describe_carrier_gateways_request +DescribeCarrierGatewaysResult,describe_carrier_gateways_result +DescribeCasesRequest,describe_cases_request +DescribeCasesResponse,describe_cases_response +DescribeCertificateAuthorityAuditReportRequest,describe_certificate_authority_audit_report_request +DescribeCertificateAuthorityAuditReportResponse,describe_certificate_authority_audit_report_response +DescribeCertificateAuthorityRequest,describe_certificate_authority_request +DescribeCertificateAuthorityResponse,describe_certificate_authority_response +DescribeCertificateRequest,describe_certificate_request +DescribeCertificateResponse,describe_certificate_response +DescribeCertificateResult,describe_certificate_result +DescribeCertificatesMessage,describe_certificates_message +DescribeCertificatesResponse,describe_certificates_response +DescribeChangeSetHooksInput,describe_change_set_hooks_input +DescribeChangeSetHooksOutput,describe_change_set_hooks_output +DescribeChangeSetInput,describe_change_set_input +DescribeChangeSetOutput,describe_change_set_output +DescribeChangeSetRequest,describe_change_set_request +DescribeChangeSetResponse,describe_change_set_response +DescribeChannelBanRequest,describe_channel_ban_request +DescribeChannelBanResponse,describe_channel_ban_response +DescribeChannelFlowRequest,describe_channel_flow_request +DescribeChannelFlowResponse,describe_channel_flow_response +DescribeChannelMembershipForAppInstanceUserRequest,describe_channel_membership_for_app_instance_user_request +DescribeChannelMembershipForAppInstanceUserResponse,describe_channel_membership_for_app_instance_user_response +DescribeChannelMembershipRequest,describe_channel_membership_request +DescribeChannelMembershipResponse,describe_channel_membership_response +DescribeChannelModeratedByAppInstanceUserRequest,describe_channel_moderated_by_app_instance_user_request +DescribeChannelModeratedByAppInstanceUserResponse,describe_channel_moderated_by_app_instance_user_response +DescribeChannelModeratorRequest,describe_channel_moderator_request +DescribeChannelModeratorResponse,describe_channel_moderator_response +DescribeChannelRequest,describe_channel_request +DescribeChannelResponse,describe_channel_response +DescribeChapCredentialsInput,describe_chap_credentials_input +DescribeChapCredentialsOutput,describe_chap_credentials_output +DescribeClassicLinkInstancesRequest,describe_classic_link_instances_request +DescribeClassicLinkInstancesResult,describe_classic_link_instances_result +DescribeClassificationJobRequest,describe_classification_job_request +DescribeClassificationJobResponse,describe_classification_job_response +DescribeClientAuthenticationSettingsRequest,describe_client_authentication_settings_request +DescribeClientAuthenticationSettingsResult,describe_client_authentication_settings_result +DescribeClientBrandingRequest,describe_client_branding_request +DescribeClientBrandingResult,describe_client_branding_result +DescribeClientPropertiesRequest,describe_client_properties_request +DescribeClientPropertiesResult,describe_client_properties_result +DescribeClientVpnAuthorizationRulesRequest,describe_client_vpn_authorization_rules_request +DescribeClientVpnAuthorizationRulesResult,describe_client_vpn_authorization_rules_result +DescribeClientVpnConnectionsRequest,describe_client_vpn_connections_request +DescribeClientVpnConnectionsResult,describe_client_vpn_connections_result +DescribeClientVpnEndpointsRequest,describe_client_vpn_endpoints_request +DescribeClientVpnEndpointsResult,describe_client_vpn_endpoints_result +DescribeClientVpnRoutesRequest,describe_client_vpn_routes_request +DescribeClientVpnRoutesResult,describe_client_vpn_routes_result +DescribeClientVpnTargetNetworksRequest,describe_client_vpn_target_networks_request +DescribeClientVpnTargetNetworksResult,describe_client_vpn_target_networks_result +DescribeClusterDbRevisionsMessage,describe_cluster_db_revisions_message +DescribeClusterInput,describe_cluster_input +DescribeClusterOperationRequest,describe_cluster_operation_request +DescribeClusterOperationResponse,describe_cluster_operation_response +DescribeClusterOperationV2Request,describe_cluster_operation_v2_request +DescribeClusterOperationV2Response,describe_cluster_operation_v2_response +DescribeClusterOutput,describe_cluster_output +DescribeClusterParameterGroupsMessage,describe_cluster_parameter_groups_message +DescribeClusterParametersMessage,describe_cluster_parameters_message +DescribeClusterRequest,describe_cluster_request +DescribeClusterResponse,describe_cluster_response +DescribeClusterResult,describe_cluster_result +DescribeClusterSecurityGroupsMessage,describe_cluster_security_groups_message +DescribeClusterSnapshotsMessage,describe_cluster_snapshots_message +DescribeClusterSubnetGroupsMessage,describe_cluster_subnet_groups_message +DescribeClusterTracksMessage,describe_cluster_tracks_message +DescribeClusterV2Request,describe_cluster_v2_request +DescribeClusterV2Response,describe_cluster_v2_response +DescribeClusterVersionsMessage,describe_cluster_versions_message +DescribeClustersMessage,describe_clusters_message +DescribeClustersRequest,describe_clusters_request +DescribeClustersResponse,describe_clusters_response +DescribeCodeBindingRequest,describe_code_binding_request +DescribeCodeBindingResponse,describe_code_binding_response +DescribeCodeCoveragesInput,describe_code_coverages_input +DescribeCodeCoveragesOutput,describe_code_coverages_output +DescribeCodeRepositoryInput,describe_code_repository_input +DescribeCodeRepositoryOutput,describe_code_repository_output +DescribeCodeReviewRequest,describe_code_review_request +DescribeCodeReviewResponse,describe_code_review_response +DescribeCoipPoolsRequest,describe_coip_pools_request +DescribeCoipPoolsResult,describe_coip_pools_result +DescribeCollectionRequest,describe_collection_request +DescribeCollectionResponse,describe_collection_response +DescribeCommandsRequest,describe_commands_request +DescribeCommandsResult,describe_commands_result +DescribeCommentsRequest,describe_comments_request +DescribeCommentsResponse,describe_comments_response +DescribeCommunicationsRequest,describe_communications_request +DescribeCommunicationsResponse,describe_communications_response +DescribeCompanyNetworkConfigurationRequest,describe_company_network_configuration_request +DescribeCompanyNetworkConfigurationResponse,describe_company_network_configuration_response +DescribeCompilationJobRequest,describe_compilation_job_request +DescribeCompilationJobResponse,describe_compilation_job_response +DescribeComplianceByConfigRuleRequest,describe_compliance_by_config_rule_request +DescribeComplianceByConfigRuleResponse,describe_compliance_by_config_rule_response +DescribeComplianceByResourceRequest,describe_compliance_by_resource_request +DescribeComplianceByResourceResponse,describe_compliance_by_resource_response +DescribeComponentConfigurationRecommendationRequest,describe_component_configuration_recommendation_request +DescribeComponentConfigurationRecommendationResponse,describe_component_configuration_recommendation_response +DescribeComponentConfigurationRequest,describe_component_configuration_request +DescribeComponentConfigurationResponse,describe_component_configuration_response +DescribeComponentRequest,describe_component_request +DescribeComponentResponse,describe_component_response +DescribeComputeEnvironmentsRequest,describe_compute_environments_request +DescribeComputeEnvironmentsResponse,describe_compute_environments_response +DescribeComputeInput,describe_compute_input +DescribeComputeOutput,describe_compute_output +DescribeConditionalForwardersRequest,describe_conditional_forwarders_request +DescribeConditionalForwardersResult,describe_conditional_forwarders_result +DescribeConfigRuleEvaluationStatusRequest,describe_config_rule_evaluation_status_request +DescribeConfigRuleEvaluationStatusResponse,describe_config_rule_evaluation_status_response +DescribeConfigRulesFilters,describe_config_rules_filters +DescribeConfigRulesRequest,describe_config_rules_request +DescribeConfigRulesResponse,describe_config_rules_response +DescribeConfigurationAggregatorSourcesStatusRequest,describe_configuration_aggregator_sources_status_request +DescribeConfigurationAggregatorSourcesStatusResponse,describe_configuration_aggregator_sources_status_response +DescribeConfigurationAggregatorsRequest,describe_configuration_aggregators_request +DescribeConfigurationAggregatorsResponse,describe_configuration_aggregators_response +DescribeConfigurationOptionsMessage,describe_configuration_options_message +DescribeConfigurationRecorderStatusRequest,describe_configuration_recorder_status_request +DescribeConfigurationRecorderStatusResponse,describe_configuration_recorder_status_response +DescribeConfigurationRecordersRequest,describe_configuration_recorders_request +DescribeConfigurationRecordersResponse,describe_configuration_recorders_response +DescribeConfigurationRequest,describe_configuration_request +DescribeConfigurationResponse,describe_configuration_response +DescribeConfigurationRevisionRequest,describe_configuration_revision_request +DescribeConfigurationRevisionResponse,describe_configuration_revision_response +DescribeConfigurationSetRequest,describe_configuration_set_request +DescribeConfigurationSetResponse,describe_configuration_set_response +DescribeConfigurationSetsRequest,describe_configuration_sets_request +DescribeConfigurationSetsResult,describe_configuration_sets_result +DescribeConfigurationSettingsMessage,describe_configuration_settings_message +DescribeConfigurationsRequest,describe_configurations_request +DescribeConfigurationsResponse,describe_configurations_response +DescribeConformancePackComplianceRequest,describe_conformance_pack_compliance_request +DescribeConformancePackComplianceResponse,describe_conformance_pack_compliance_response +DescribeConformancePackStatusRequest,describe_conformance_pack_status_request +DescribeConformancePackStatusResponse,describe_conformance_pack_status_response +DescribeConformancePacksRequest,describe_conformance_packs_request +DescribeConformancePacksResponse,describe_conformance_packs_response +DescribeConnectClientAddInsRequest,describe_connect_client_add_ins_request +DescribeConnectClientAddInsResult,describe_connect_client_add_ins_result +DescribeConnectionAliasPermissionsRequest,describe_connection_alias_permissions_request +DescribeConnectionAliasPermissionsResult,describe_connection_alias_permissions_result +DescribeConnectionAliasesRequest,describe_connection_aliases_request +DescribeConnectionAliasesResult,describe_connection_aliases_result +DescribeConnectionLoaRequest,describe_connection_loa_request +DescribeConnectionLoaResponse,describe_connection_loa_response +DescribeConnectionRequest,describe_connection_request +DescribeConnectionResponse,describe_connection_response +DescribeConnectionsMessage,describe_connections_message +DescribeConnectionsOnInterconnectRequest,describe_connections_on_interconnect_request +DescribeConnectionsRequest,describe_connections_request +DescribeConnectionsResponse,describe_connections_response +DescribeConnectorEntityRequest,describe_connector_entity_request +DescribeConnectorEntityResponse,describe_connector_entity_response +DescribeConnectorProfilesRequest,describe_connector_profiles_request +DescribeConnectorProfilesResponse,describe_connector_profiles_response +DescribeConnectorRequest,describe_connector_request +DescribeConnectorResponse,describe_connector_response +DescribeConnectorsRequest,describe_connectors_request +DescribeConnectorsResponse,describe_connectors_response +DescribeConstraintInput,describe_constraint_input +DescribeConstraintOutput,describe_constraint_output +DescribeContactEvaluationRequest,describe_contact_evaluation_request +DescribeContactEvaluationResponse,describe_contact_evaluation_response +DescribeContactFlowModuleRequest,describe_contact_flow_module_request +DescribeContactFlowModuleResponse,describe_contact_flow_module_response +DescribeContactFlowRequest,describe_contact_flow_request +DescribeContactFlowResponse,describe_contact_flow_response +DescribeContactRequest,describe_contact_request +DescribeContactResponse,describe_contact_response +DescribeContainerInput,describe_container_input +DescribeContainerInstancesRequest,describe_container_instances_request +DescribeContainerInstancesResponse,describe_container_instances_response +DescribeContainerOutput,describe_container_output +DescribeContextRequest,describe_context_request +DescribeContextResponse,describe_context_response +DescribeContinuousBackupsInput,describe_continuous_backups_input +DescribeContinuousBackupsOutput,describe_continuous_backups_output +DescribeContinuousExportsRequest,describe_continuous_exports_request +DescribeContinuousExportsResponse,describe_continuous_exports_response +DescribeContributorInsightsInput,describe_contributor_insights_input +DescribeContributorInsightsOutput,describe_contributor_insights_output +DescribeControlPanelRequest,describe_control_panel_request +DescribeControlPanelResponse,describe_control_panel_response +DescribeConversionConfigurationMessage,describe_conversion_configuration_message +DescribeConversionConfigurationResponse,describe_conversion_configuration_response +DescribeConversionTasksRequest,describe_conversion_tasks_request +DescribeConversionTasksResult,describe_conversion_tasks_result +DescribeCopyJobInput,describe_copy_job_input +DescribeCopyJobOutput,describe_copy_job_output +DescribeCopyProductStatusInput,describe_copy_product_status_input +DescribeCopyProductStatusOutput,describe_copy_product_status_output +DescribeCostCategoryDefinitionRequest,describe_cost_category_definition_request +DescribeCostCategoryDefinitionResponse,describe_cost_category_definition_response +DescribeCreateAccountStatusRequest,describe_create_account_status_request +DescribeCreateAccountStatusResponse,describe_create_account_status_response +DescribeCreateCaseOptionsRequest,describe_create_case_options_request +DescribeCreateCaseOptionsResponse,describe_create_case_options_response +DescribeCrossAccountAccessRoleResponse,describe_cross_account_access_role_response +DescribeCustomDomainAssociationsMessage,describe_custom_domain_associations_message +DescribeCustomDomainsRequest,describe_custom_domains_request +DescribeCustomDomainsResponse,describe_custom_domains_response +DescribeCustomKeyStoresRequest,describe_custom_key_stores_request +DescribeCustomKeyStoresResponse,describe_custom_key_stores_response +DescribeCustomMetricRequest,describe_custom_metric_request +DescribeCustomMetricResponse,describe_custom_metric_response +DescribeCustomPluginRequest,describe_custom_plugin_request +DescribeCustomPluginResponse,describe_custom_plugin_response +DescribeCustomRoutingAcceleratorAttributesRequest,describe_custom_routing_accelerator_attributes_request +DescribeCustomRoutingAcceleratorAttributesResponse,describe_custom_routing_accelerator_attributes_response +DescribeCustomRoutingAcceleratorRequest,describe_custom_routing_accelerator_request +DescribeCustomRoutingAcceleratorResponse,describe_custom_routing_accelerator_response +DescribeCustomRoutingEndpointGroupRequest,describe_custom_routing_endpoint_group_request +DescribeCustomRoutingEndpointGroupResponse,describe_custom_routing_endpoint_group_response +DescribeCustomRoutingListenerRequest,describe_custom_routing_listener_request +DescribeCustomRoutingListenerResponse,describe_custom_routing_listener_response +DescribeCustomVocabularyMetadataRequest,describe_custom_vocabulary_metadata_request +DescribeCustomVocabularyMetadataResponse,describe_custom_vocabulary_metadata_response +DescribeCustomerGatewaysRequest,describe_customer_gateways_request +DescribeCustomerGatewaysResult,describe_customer_gateways_result +DescribeCustomerMetadataResponse,describe_customer_metadata_response +DescribeDBClusterAutomatedBackupsMessage,describe_db_cluster_automated_backups_message +DescribeDBClusterBacktracksMessage,describe_db_cluster_backtracks_message +DescribeDBClusterEndpointsMessage,describe_db_cluster_endpoints_message +DescribeDBClusterParameterGroupsMessage,describe_db_cluster_parameter_groups_message +DescribeDBClusterParametersMessage,describe_db_cluster_parameters_message +DescribeDBClusterSnapshotAttributesMessage,describe_db_cluster_snapshot_attributes_message +DescribeDBClusterSnapshotAttributesResult,describe_db_cluster_snapshot_attributes_result +DescribeDBClusterSnapshotsMessage,describe_db_cluster_snapshots_message +DescribeDBClustersMessage,describe_db_clusters_message +DescribeDBEngineVersionsMessage,describe_db_engine_versions_message +DescribeDBInstanceAutomatedBackupsMessage,describe_db_instance_automated_backups_message +DescribeDBInstancesMessage,describe_db_instances_message +DescribeDBLogFiles,describe_db_log_files +DescribeDBLogFilesDetails,describe_db_log_files_details +DescribeDBLogFilesMessage,describe_db_log_files_message +DescribeDBLogFilesResponse,describe_db_log_files_response +DescribeDBParameterGroupsMessage,describe_db_parameter_groups_message +DescribeDBParametersMessage,describe_db_parameters_message +DescribeDBProxiesRequest,describe_db_proxies_request +DescribeDBProxiesResponse,describe_db_proxies_response +DescribeDBProxyEndpointsRequest,describe_db_proxy_endpoints_request +DescribeDBProxyEndpointsResponse,describe_db_proxy_endpoints_response +DescribeDBProxyTargetGroupsRequest,describe_db_proxy_target_groups_request +DescribeDBProxyTargetGroupsResponse,describe_db_proxy_target_groups_response +DescribeDBProxyTargetsRequest,describe_db_proxy_targets_request +DescribeDBProxyTargetsResponse,describe_db_proxy_targets_response +DescribeDBSecurityGroupsMessage,describe_db_security_groups_message +DescribeDBSnapshotAttributesMessage,describe_db_snapshot_attributes_message +DescribeDBSnapshotAttributesResult,describe_db_snapshot_attributes_result +DescribeDBSnapshotsMessage,describe_db_snapshots_message +DescribeDBSubnetGroupsMessage,describe_db_subnet_groups_message +DescribeDRTAccessResponse,describe_drt_access_response +DescribeDashboardDefinitionRequest,describe_dashboard_definition_request +DescribeDashboardDefinitionResponse,describe_dashboard_definition_response +DescribeDashboardPermissionsRequest,describe_dashboard_permissions_request +DescribeDashboardPermissionsResponse,describe_dashboard_permissions_response +DescribeDashboardRequest,describe_dashboard_request +DescribeDashboardResponse,describe_dashboard_response +DescribeDashboardSnapshotJobRequest,describe_dashboard_snapshot_job_request +DescribeDashboardSnapshotJobResponse,describe_dashboard_snapshot_job_response +DescribeDashboardSnapshotJobResultRequest,describe_dashboard_snapshot_job_result_request +DescribeDashboardSnapshotJobResultResponse,describe_dashboard_snapshot_job_result_response +DescribeDataIngestionJobRequest,describe_data_ingestion_job_request +DescribeDataIngestionJobResponse,describe_data_ingestion_job_response +DescribeDataProvidersMessage,describe_data_providers_message +DescribeDataProvidersResponse,describe_data_providers_response +DescribeDataQualityJobDefinitionRequest,describe_data_quality_job_definition_request +DescribeDataQualityJobDefinitionResponse,describe_data_quality_job_definition_response +DescribeDataRepositoryAssociationsRequest,describe_data_repository_associations_request +DescribeDataRepositoryAssociationsResponse,describe_data_repository_associations_response +DescribeDataRepositoryTasksRequest,describe_data_repository_tasks_request +DescribeDataRepositoryTasksResponse,describe_data_repository_tasks_response +DescribeDataSetPermissionsRequest,describe_data_set_permissions_request +DescribeDataSetPermissionsResponse,describe_data_set_permissions_response +DescribeDataSetRefreshPropertiesRequest,describe_data_set_refresh_properties_request +DescribeDataSetRefreshPropertiesResponse,describe_data_set_refresh_properties_response +DescribeDataSetRequest,describe_data_set_request +DescribeDataSetResponse,describe_data_set_response +DescribeDataSharesForConsumerMessage,describe_data_shares_for_consumer_message +DescribeDataSharesForConsumerResult,describe_data_shares_for_consumer_result +DescribeDataSharesForProducerMessage,describe_data_shares_for_producer_message +DescribeDataSharesForProducerResult,describe_data_shares_for_producer_result +DescribeDataSharesMessage,describe_data_shares_message +DescribeDataSharesResult,describe_data_shares_result +DescribeDataSourcePermissionsRequest,describe_data_source_permissions_request +DescribeDataSourcePermissionsResponse,describe_data_source_permissions_response +DescribeDataSourceRequest,describe_data_source_request +DescribeDataSourceResponse,describe_data_source_response +DescribeDataSourcesInput,describe_data_sources_input +DescribeDataSourcesOutput,describe_data_sources_output +DescribeDatabaseRequest,describe_database_request +DescribeDatabaseResponse,describe_database_response +DescribeDatasetExportJobRequest,describe_dataset_export_job_request +DescribeDatasetExportJobResponse,describe_dataset_export_job_response +DescribeDatasetGroupRequest,describe_dataset_group_request +DescribeDatasetGroupResponse,describe_dataset_group_response +DescribeDatasetImportJobRequest,describe_dataset_import_job_request +DescribeDatasetImportJobResponse,describe_dataset_import_job_response +DescribeDatasetRequest,describe_dataset_request +DescribeDatasetResponse,describe_dataset_response +DescribeDatastoreRequest,describe_datastore_request +DescribeDatastoreResponse,describe_datastore_response +DescribeDefaultAuthorizerResponse,describe_default_authorizer_response +DescribeDefaultClusterParametersMessage,describe_default_cluster_parameters_message +DescribeDefaultClusterParametersResult,describe_default_cluster_parameters_result +DescribeDefaultEncryptionConfigurationResponse,describe_default_encryption_configuration_response +DescribeDefaultParametersRequest,describe_default_parameters_request +DescribeDefaultParametersResponse,describe_default_parameters_response +DescribeDeliveryChannelStatusRequest,describe_delivery_channel_status_request +DescribeDeliveryChannelStatusResponse,describe_delivery_channel_status_response +DescribeDeliveryChannelsRequest,describe_delivery_channels_request +DescribeDeliveryChannelsResponse,describe_delivery_channels_response +DescribeDeliveryStreamInput,describe_delivery_stream_input +DescribeDeliveryStreamOutput,describe_delivery_stream_output +DescribeDeploymentJobRequest,describe_deployment_job_request +DescribeDeploymentJobResponse,describe_deployment_job_response +DescribeDeploymentsRequest,describe_deployments_request +DescribeDeploymentsResult,describe_deployments_result +DescribeDestinationsRequest,describe_destinations_request +DescribeDestinationsResponse,describe_destinations_response +DescribeDetectMitigationActionsTaskRequest,describe_detect_mitigation_actions_task_request +DescribeDetectMitigationActionsTaskResponse,describe_detect_mitigation_actions_task_response +DescribeDetectorModelAnalysisRequest,describe_detector_model_analysis_request +DescribeDetectorModelAnalysisResponse,describe_detector_model_analysis_response +DescribeDetectorModelRequest,describe_detector_model_request +DescribeDetectorModelResponse,describe_detector_model_response +DescribeDetectorRequest,describe_detector_request +DescribeDetectorResponse,describe_detector_response +DescribeDetectorResult,describe_detector_result +DescribeDeviceEc2Input,describe_device_ec2_input +DescribeDeviceEc2Output,describe_device_ec2_output +DescribeDeviceFleetRequest,describe_device_fleet_request +DescribeDeviceFleetResponse,describe_device_fleet_response +DescribeDeviceInput,describe_device_input +DescribeDeviceJobRequest,describe_device_job_request +DescribeDeviceJobResponse,describe_device_job_response +DescribeDeviceOutput,describe_device_output +DescribeDevicePolicyConfigurationRequest,describe_device_policy_configuration_request +DescribeDevicePolicyConfigurationResponse,describe_device_policy_configuration_response +DescribeDeviceRequest,describe_device_request +DescribeDeviceResponse,describe_device_response +DescribeDhcpOptionsRequest,describe_dhcp_options_request +DescribeDhcpOptionsResult,describe_dhcp_options_result +DescribeDimensionKeysRequest,describe_dimension_keys_request +DescribeDimensionKeysResponse,describe_dimension_keys_response +DescribeDimensionRequest,describe_dimension_request +DescribeDimensionResponse,describe_dimension_response +DescribeDirectConnectGatewayAssociationProposalsRequest,describe_direct_connect_gateway_association_proposals_request +DescribeDirectConnectGatewayAssociationProposalsResult,describe_direct_connect_gateway_association_proposals_result +DescribeDirectConnectGatewayAssociationsRequest,describe_direct_connect_gateway_associations_request +DescribeDirectConnectGatewayAssociationsResult,describe_direct_connect_gateway_associations_result +DescribeDirectConnectGatewayAttachmentsRequest,describe_direct_connect_gateway_attachments_request +DescribeDirectConnectGatewayAttachmentsResult,describe_direct_connect_gateway_attachments_result +DescribeDirectConnectGatewaysRequest,describe_direct_connect_gateways_request +DescribeDirectConnectGatewaysResult,describe_direct_connect_gateways_result +DescribeDirectoriesRequest,describe_directories_request +DescribeDirectoriesResult,describe_directories_result +DescribeDirectoryConfigsRequest,describe_directory_configs_request +DescribeDirectoryConfigsResult,describe_directory_configs_result +DescribeDiscovererRequest,describe_discoverer_request +DescribeDiscovererResponse,describe_discoverer_response +DescribeDiscoveryJobRequest,describe_discovery_job_request +DescribeDiscoveryJobResponse,describe_discovery_job_response +DescribeDocumentClassificationJobRequest,describe_document_classification_job_request +DescribeDocumentClassificationJobResponse,describe_document_classification_job_response +DescribeDocumentClassifierRequest,describe_document_classifier_request +DescribeDocumentClassifierResponse,describe_document_classifier_response +DescribeDocumentPermissionRequest,describe_document_permission_request +DescribeDocumentPermissionResponse,describe_document_permission_response +DescribeDocumentRequest,describe_document_request +DescribeDocumentResult,describe_document_result +DescribeDocumentVersionsRequest,describe_document_versions_request +DescribeDocumentVersionsResponse,describe_document_versions_response +DescribeDomainAutoTunesRequest,describe_domain_auto_tunes_request +DescribeDomainAutoTunesResponse,describe_domain_auto_tunes_response +DescribeDomainChangeProgressRequest,describe_domain_change_progress_request +DescribeDomainChangeProgressResponse,describe_domain_change_progress_response +DescribeDomainConfigRequest,describe_domain_config_request +DescribeDomainConfigResponse,describe_domain_config_response +DescribeDomainConfigurationRequest,describe_domain_configuration_request +DescribeDomainConfigurationResponse,describe_domain_configuration_response +DescribeDomainControllersRequest,describe_domain_controllers_request +DescribeDomainControllersResult,describe_domain_controllers_result +DescribeDomainEndpointOptionsRequest,describe_domain_endpoint_options_request +DescribeDomainEndpointOptionsResponse,describe_domain_endpoint_options_response +DescribeDomainHealthRequest,describe_domain_health_request +DescribeDomainHealthResponse,describe_domain_health_response +DescribeDomainInput,describe_domain_input +DescribeDomainNodesRequest,describe_domain_nodes_request +DescribeDomainNodesResponse,describe_domain_nodes_response +DescribeDomainRequest,describe_domain_request +DescribeDomainResponse,describe_domain_response +DescribeDomainResult,describe_domain_result +DescribeDomainsRequest,describe_domains_request +DescribeDomainsResponse,describe_domains_response +DescribeDominantLanguageDetectionJobRequest,describe_dominant_language_detection_job_request +DescribeDominantLanguageDetectionJobResponse,describe_dominant_language_detection_job_response +DescribeDraftAppVersionResourcesImportStatusRequest,describe_draft_app_version_resources_import_status_request +DescribeDraftAppVersionResourcesImportStatusResponse,describe_draft_app_version_resources_import_status_response +DescribeDryRunProgressRequest,describe_dry_run_progress_request +DescribeDryRunProgressResponse,describe_dry_run_progress_response +DescribeEC2InstanceLimitsInput,describe_ec2_instance_limits_input +DescribeEC2InstanceLimitsOutput,describe_ec2_instance_limits_output +DescribeEcsClustersRequest,describe_ecs_clusters_request +DescribeEcsClustersResult,describe_ecs_clusters_result +DescribeEdgeConfigurationInput,describe_edge_configuration_input +DescribeEdgeConfigurationOutput,describe_edge_configuration_output +DescribeEdgeDeploymentPlanRequest,describe_edge_deployment_plan_request +DescribeEdgeDeploymentPlanResponse,describe_edge_deployment_plan_response +DescribeEdgePackagingJobRequest,describe_edge_packaging_job_request +DescribeEdgePackagingJobResponse,describe_edge_packaging_job_response +DescribeEffectiveInstanceAssociationsRequest,describe_effective_instance_associations_request +DescribeEffectiveInstanceAssociationsResult,describe_effective_instance_associations_result +DescribeEffectivePatchesForPatchBaselineRequest,describe_effective_patches_for_patch_baseline_request +DescribeEffectivePatchesForPatchBaselineResult,describe_effective_patches_for_patch_baseline_result +DescribeEffectivePolicyRequest,describe_effective_policy_request +DescribeEffectivePolicyResponse,describe_effective_policy_response +DescribeEgressOnlyInternetGatewaysRequest,describe_egress_only_internet_gateways_request +DescribeEgressOnlyInternetGatewaysResult,describe_egress_only_internet_gateways_result +DescribeElasticGpusRequest,describe_elastic_gpus_request +DescribeElasticGpusResult,describe_elastic_gpus_result +DescribeElasticIpsRequest,describe_elastic_ips_request +DescribeElasticIpsResult,describe_elastic_ips_result +DescribeElasticLoadBalancersRequest,describe_elastic_load_balancers_request +DescribeElasticLoadBalancersResult,describe_elastic_load_balancers_result +DescribeElasticsearchDomainConfigRequest,describe_elasticsearch_domain_config_request +DescribeElasticsearchDomainConfigResponse,describe_elasticsearch_domain_config_response +DescribeElasticsearchDomainRequest,describe_elasticsearch_domain_request +DescribeElasticsearchDomainResponse,describe_elasticsearch_domain_response +DescribeElasticsearchDomainsRequest,describe_elasticsearch_domains_request +DescribeElasticsearchDomainsResponse,describe_elasticsearch_domains_response +DescribeElasticsearchInstanceTypeLimitsRequest,describe_elasticsearch_instance_type_limits_request +DescribeElasticsearchInstanceTypeLimitsResponse,describe_elasticsearch_instance_type_limits_response +DescribeEmailMonitoringConfigurationRequest,describe_email_monitoring_configuration_request +DescribeEmailMonitoringConfigurationResponse,describe_email_monitoring_configuration_response +DescribeEmergencyContactSettingsResponse,describe_emergency_contact_settings_response +DescribeEndPointStateInput,describe_end_point_state_input +DescribeEndPointStateOutput,describe_end_point_state_output +DescribeEndpointAccessMessage,describe_endpoint_access_message +DescribeEndpointAuthorizationMessage,describe_endpoint_authorization_message +DescribeEndpointConfigInput,describe_endpoint_config_input +DescribeEndpointConfigOutput,describe_endpoint_config_output +DescribeEndpointGroupRequest,describe_endpoint_group_request +DescribeEndpointGroupResponse,describe_endpoint_group_response +DescribeEndpointInput,describe_endpoint_input +DescribeEndpointOutput,describe_endpoint_output +DescribeEndpointRequest,describe_endpoint_request +DescribeEndpointResponse,describe_endpoint_response +DescribeEndpointSettingsMessage,describe_endpoint_settings_message +DescribeEndpointSettingsResponse,describe_endpoint_settings_response +DescribeEndpointTypesMessage,describe_endpoint_types_message +DescribeEndpointTypesResponse,describe_endpoint_types_response +DescribeEndpointsMessage,describe_endpoints_message +DescribeEndpointsRequest,describe_endpoints_request +DescribeEndpointsResponse,describe_endpoints_response +DescribeEngagementRequest,describe_engagement_request +DescribeEngagementResult,describe_engagement_result +DescribeEngineDefaultClusterParametersMessage,describe_engine_default_cluster_parameters_message +DescribeEngineDefaultClusterParametersResult,describe_engine_default_cluster_parameters_result +DescribeEngineDefaultParametersMessage,describe_engine_default_parameters_message +DescribeEngineDefaultParametersResult,describe_engine_default_parameters_result +DescribeEngineVersionsMessage,describe_engine_versions_message +DescribeEngineVersionsRequest,describe_engine_versions_request +DescribeEngineVersionsResponse,describe_engine_versions_response +DescribeEntitiesDetectionJobRequest,describe_entities_detection_job_request +DescribeEntitiesDetectionJobResponse,describe_entities_detection_job_response +DescribeEntitiesDetectionV2JobRequest,describe_entities_detection_v2_job_request +DescribeEntitiesDetectionV2JobResponse,describe_entities_detection_v2_job_response +DescribeEntitlementsRequest,describe_entitlements_request +DescribeEntitlementsResult,describe_entitlements_result +DescribeEntityAggregatesForOrganizationRequest,describe_entity_aggregates_for_organization_request +DescribeEntityAggregatesForOrganizationResponse,describe_entity_aggregates_for_organization_response +DescribeEntityAggregatesRequest,describe_entity_aggregates_request +DescribeEntityAggregatesResponse,describe_entity_aggregates_response +DescribeEntityRecognizerRequest,describe_entity_recognizer_request +DescribeEntityRecognizerResponse,describe_entity_recognizer_response +DescribeEntityRequest,describe_entity_request +DescribeEntityResponse,describe_entity_response +DescribeEnvironmentHealthRequest,describe_environment_health_request +DescribeEnvironmentHealthResult,describe_environment_health_result +DescribeEnvironmentManagedActionHistoryRequest,describe_environment_managed_action_history_request +DescribeEnvironmentManagedActionHistoryResult,describe_environment_managed_action_history_result +DescribeEnvironmentManagedActionsRequest,describe_environment_managed_actions_request +DescribeEnvironmentManagedActionsResult,describe_environment_managed_actions_result +DescribeEnvironmentMembershipsRequest,describe_environment_memberships_request +DescribeEnvironmentMembershipsResult,describe_environment_memberships_result +DescribeEnvironmentResourcesMessage,describe_environment_resources_message +DescribeEnvironmentStatusRequest,describe_environment_status_request +DescribeEnvironmentStatusResult,describe_environment_status_result +DescribeEnvironmentsMessage,describe_environments_message +DescribeEnvironmentsRequest,describe_environments_request +DescribeEnvironmentsResult,describe_environments_result +DescribeEphemerisRequest,describe_ephemeris_request +DescribeEphemerisResponse,describe_ephemeris_response +DescribeEvaluationFormRequest,describe_evaluation_form_request +DescribeEvaluationFormResponse,describe_evaluation_form_response +DescribeEvaluationsInput,describe_evaluations_input +DescribeEvaluationsOutput,describe_evaluations_output +DescribeEventAggregatesRequest,describe_event_aggregates_request +DescribeEventAggregatesResponse,describe_event_aggregates_response +DescribeEventBusRequest,describe_event_bus_request +DescribeEventBusResponse,describe_event_bus_response +DescribeEventCategoriesMessage,describe_event_categories_message +DescribeEventCategoriesResponse,describe_event_categories_response +DescribeEventConfigurationsResponse,describe_event_configurations_response +DescribeEventDetailsForOrganizationRequest,describe_event_details_for_organization_request +DescribeEventDetailsForOrganizationResponse,describe_event_details_for_organization_response +DescribeEventDetailsRequest,describe_event_details_request +DescribeEventDetailsResponse,describe_event_details_response +DescribeEventSourceRequest,describe_event_source_request +DescribeEventSourceResponse,describe_event_source_response +DescribeEventSourcesConfigResponse,describe_event_sources_config_response +DescribeEventSubscriptionsMessage,describe_event_subscriptions_message +DescribeEventSubscriptionsResponse,describe_event_subscriptions_response +DescribeEventTopicsRequest,describe_event_topics_request +DescribeEventTopicsResult,describe_event_topics_result +DescribeEventTrackerRequest,describe_event_tracker_request +DescribeEventTrackerResponse,describe_event_tracker_response +DescribeEventTypesRequest,describe_event_types_request +DescribeEventTypesResponse,describe_event_types_response +DescribeEventsDetectionJobRequest,describe_events_detection_job_request +DescribeEventsDetectionJobResponse,describe_events_detection_job_response +DescribeEventsForOrganizationRequest,describe_events_for_organization_request +DescribeEventsForOrganizationResponse,describe_events_for_organization_response +DescribeEventsMessage,describe_events_message +DescribeEventsRequest,describe_events_request +DescribeEventsResponse,describe_events_response +DescribeExclusionsRequest,describe_exclusions_request +DescribeExclusionsResponse,describe_exclusions_response +DescribeExecutionInput,describe_execution_input +DescribeExecutionOutput,describe_execution_output +DescribeExecutionRequest,describe_execution_request +DescribeExecutionResponse,describe_execution_response +DescribeExperienceRequest,describe_experience_request +DescribeExperienceResponse,describe_experience_response +DescribeExperimentRequest,describe_experiment_request +DescribeExperimentResponse,describe_experiment_response +DescribeExplainabilityExportRequest,describe_explainability_export_request +DescribeExplainabilityExportResponse,describe_explainability_export_response +DescribeExplainabilityRequest,describe_explainability_request +DescribeExplainabilityResponse,describe_explainability_response +DescribeExportConfigurationsRequest,describe_export_configurations_request +DescribeExportConfigurationsResponse,describe_export_configurations_response +DescribeExportImageTasksRequest,describe_export_image_tasks_request +DescribeExportImageTasksResult,describe_export_image_tasks_result +DescribeExportInput,describe_export_input +DescribeExportOutput,describe_export_output +DescribeExportRequest,describe_export_request +DescribeExportResponse,describe_export_response +DescribeExportTasksMessage,describe_export_tasks_message +DescribeExportTasksRequest,describe_export_tasks_request +DescribeExportTasksResponse,describe_export_tasks_response +DescribeExportTasksResult,describe_export_tasks_result +DescribeExpressionsRequest,describe_expressions_request +DescribeExpressionsResponse,describe_expressions_response +DescribeExtensionPackAssociationsMessage,describe_extension_pack_associations_message +DescribeExtensionPackAssociationsResponse,describe_extension_pack_associations_response +DescribeFHIRDatastoreRequest,describe_fhir_datastore_request +DescribeFHIRDatastoreResponse,describe_fhir_datastore_response +DescribeFHIRExportJobRequest,describe_fhir_export_job_request +DescribeFHIRExportJobResponse,describe_fhir_export_job_response +DescribeFHIRImportJobRequest,describe_fhir_import_job_request +DescribeFHIRImportJobResponse,describe_fhir_import_job_response +DescribeFaqRequest,describe_faq_request +DescribeFaqResponse,describe_faq_response +DescribeFargateProfileRequest,describe_fargate_profile_request +DescribeFargateProfileResponse,describe_fargate_profile_response +DescribeFastLaunchImagesRequest,describe_fast_launch_images_request +DescribeFastLaunchImagesResult,describe_fast_launch_images_result +DescribeFastLaunchImagesSuccessItem,describe_fast_launch_images_success_item +DescribeFastSnapshotRestoreSuccessItem,describe_fast_snapshot_restore_success_item +DescribeFastSnapshotRestoresRequest,describe_fast_snapshot_restores_request +DescribeFastSnapshotRestoresResult,describe_fast_snapshot_restores_result +DescribeFeatureGroupRequest,describe_feature_group_request +DescribeFeatureGroupResponse,describe_feature_group_response +DescribeFeatureMetadataRequest,describe_feature_metadata_request +DescribeFeatureMetadataResponse,describe_feature_metadata_response +DescribeFeatureTransformationRequest,describe_feature_transformation_request +DescribeFeatureTransformationResponse,describe_feature_transformation_response +DescribeFeaturedResultsSetRequest,describe_featured_results_set_request +DescribeFeaturedResultsSetResponse,describe_featured_results_set_response +DescribeFeedbackRequest,describe_feedback_request +DescribeFeedbackResponse,describe_feedback_response +DescribeFileCachesRequest,describe_file_caches_request +DescribeFileCachesResponse,describe_file_caches_response +DescribeFileSystemAliasesRequest,describe_file_system_aliases_request +DescribeFileSystemAliasesResponse,describe_file_system_aliases_response +DescribeFileSystemAssociationsInput,describe_file_system_associations_input +DescribeFileSystemAssociationsOutput,describe_file_system_associations_output +DescribeFileSystemPolicyRequest,describe_file_system_policy_request +DescribeFileSystemsRequest,describe_file_systems_request +DescribeFileSystemsResponse,describe_file_systems_response +DescribeFilterRequest,describe_filter_request +DescribeFilterResponse,describe_filter_response +DescribeFindingsRequest,describe_findings_request +DescribeFindingsResponse,describe_findings_response +DescribeFirewallPolicyRequest,describe_firewall_policy_request +DescribeFirewallPolicyResponse,describe_firewall_policy_response +DescribeFirewallRequest,describe_firewall_request +DescribeFirewallResponse,describe_firewall_response +DescribeFleetAdvisorCollectorsRequest,describe_fleet_advisor_collectors_request +DescribeFleetAdvisorCollectorsResponse,describe_fleet_advisor_collectors_response +DescribeFleetAdvisorDatabasesRequest,describe_fleet_advisor_databases_request +DescribeFleetAdvisorDatabasesResponse,describe_fleet_advisor_databases_response +DescribeFleetAdvisorLsaAnalysisRequest,describe_fleet_advisor_lsa_analysis_request +DescribeFleetAdvisorLsaAnalysisResponse,describe_fleet_advisor_lsa_analysis_response +DescribeFleetAdvisorSchemaObjectSummaryRequest,describe_fleet_advisor_schema_object_summary_request +DescribeFleetAdvisorSchemaObjectSummaryResponse,describe_fleet_advisor_schema_object_summary_response +DescribeFleetAdvisorSchemasRequest,describe_fleet_advisor_schemas_request +DescribeFleetAdvisorSchemasResponse,describe_fleet_advisor_schemas_response +DescribeFleetAttributesInput,describe_fleet_attributes_input +DescribeFleetAttributesOutput,describe_fleet_attributes_output +DescribeFleetCapacityInput,describe_fleet_capacity_input +DescribeFleetCapacityOutput,describe_fleet_capacity_output +DescribeFleetError,describe_fleet_error +DescribeFleetEventsInput,describe_fleet_events_input +DescribeFleetEventsOutput,describe_fleet_events_output +DescribeFleetHistoryRequest,describe_fleet_history_request +DescribeFleetHistoryResult,describe_fleet_history_result +DescribeFleetInstancesRequest,describe_fleet_instances_request +DescribeFleetInstancesResult,describe_fleet_instances_result +DescribeFleetLocationAttributesInput,describe_fleet_location_attributes_input +DescribeFleetLocationAttributesOutput,describe_fleet_location_attributes_output +DescribeFleetLocationCapacityInput,describe_fleet_location_capacity_input +DescribeFleetLocationCapacityOutput,describe_fleet_location_capacity_output +DescribeFleetLocationUtilizationInput,describe_fleet_location_utilization_input +DescribeFleetLocationUtilizationOutput,describe_fleet_location_utilization_output +DescribeFleetMetadataRequest,describe_fleet_metadata_request +DescribeFleetMetadataResponse,describe_fleet_metadata_response +DescribeFleetMetricRequest,describe_fleet_metric_request +DescribeFleetMetricResponse,describe_fleet_metric_response +DescribeFleetPortSettingsInput,describe_fleet_port_settings_input +DescribeFleetPortSettingsOutput,describe_fleet_port_settings_output +DescribeFleetRequest,describe_fleet_request +DescribeFleetResponse,describe_fleet_response +DescribeFleetUtilizationInput,describe_fleet_utilization_input +DescribeFleetUtilizationOutput,describe_fleet_utilization_output +DescribeFleetsInstances,describe_fleets_instances +DescribeFleetsRequest,describe_fleets_request +DescribeFleetsResult,describe_fleets_result +DescribeFlowDefinitionRequest,describe_flow_definition_request +DescribeFlowDefinitionResponse,describe_flow_definition_response +DescribeFlowExecutionRecordsRequest,describe_flow_execution_records_request +DescribeFlowExecutionRecordsResponse,describe_flow_execution_records_response +DescribeFlowLogsRequest,describe_flow_logs_request +DescribeFlowLogsResult,describe_flow_logs_result +DescribeFlowRequest,describe_flow_request +DescribeFlowResponse,describe_flow_response +DescribeFlywheelIterationRequest,describe_flywheel_iteration_request +DescribeFlywheelIterationResponse,describe_flywheel_iteration_response +DescribeFlywheelRequest,describe_flywheel_request +DescribeFlywheelResponse,describe_flywheel_response +DescribeFolderContentsRequest,describe_folder_contents_request +DescribeFolderContentsResponse,describe_folder_contents_response +DescribeFolderPermissionsRequest,describe_folder_permissions_request +DescribeFolderPermissionsResponse,describe_folder_permissions_response +DescribeFolderRequest,describe_folder_request +DescribeFolderResolvedPermissionsRequest,describe_folder_resolved_permissions_request +DescribeFolderResolvedPermissionsResponse,describe_folder_resolved_permissions_response +DescribeFolderResponse,describe_folder_response +DescribeForecastExportJobRequest,describe_forecast_export_job_request +DescribeForecastExportJobResponse,describe_forecast_export_job_response +DescribeForecastRequest,describe_forecast_request +DescribeForecastResponse,describe_forecast_response +DescribeFpgaImageAttributeRequest,describe_fpga_image_attribute_request +DescribeFpgaImageAttributeResult,describe_fpga_image_attribute_result +DescribeFpgaImagesRequest,describe_fpga_images_request +DescribeFpgaImagesResult,describe_fpga_images_result +DescribeFrameworkInput,describe_framework_input +DescribeFrameworkOutput,describe_framework_output +DescribeFraudsterRegistrationJobRequest,describe_fraudster_registration_job_request +DescribeFraudsterRegistrationJobResponse,describe_fraudster_registration_job_response +DescribeFraudsterRequest,describe_fraudster_request +DescribeFraudsterResponse,describe_fraudster_response +DescribeFunctionRequest,describe_function_request +DescribeFunctionResult,describe_function_result +DescribeGameServerGroupInput,describe_game_server_group_input +DescribeGameServerGroupOutput,describe_game_server_group_output +DescribeGameServerInput,describe_game_server_input +DescribeGameServerInstancesInput,describe_game_server_instances_input +DescribeGameServerInstancesOutput,describe_game_server_instances_output +DescribeGameServerOutput,describe_game_server_output +DescribeGameSessionDetailsInput,describe_game_session_details_input +DescribeGameSessionDetailsOutput,describe_game_session_details_output +DescribeGameSessionPlacementInput,describe_game_session_placement_input +DescribeGameSessionPlacementOutput,describe_game_session_placement_output +DescribeGameSessionQueuesInput,describe_game_session_queues_input +DescribeGameSessionQueuesOutput,describe_game_session_queues_output +DescribeGameSessionsInput,describe_game_sessions_input +DescribeGameSessionsOutput,describe_game_sessions_output +DescribeGatewayCapabilityConfigurationRequest,describe_gateway_capability_configuration_request +DescribeGatewayCapabilityConfigurationResponse,describe_gateway_capability_configuration_response +DescribeGatewayInformationInput,describe_gateway_information_input +DescribeGatewayInformationOutput,describe_gateway_information_output +DescribeGatewayInstanceRequest,describe_gateway_instance_request +DescribeGatewayInstanceResponse,describe_gateway_instance_response +DescribeGatewayRequest,describe_gateway_request +DescribeGatewayResponse,describe_gateway_response +DescribeGatewayRouteInput,describe_gateway_route_input +DescribeGatewayRouteOutput,describe_gateway_route_output +DescribeGeofenceCollectionRequest,describe_geofence_collection_request +DescribeGeofenceCollectionResponse,describe_geofence_collection_response +DescribeGlobalClustersMessage,describe_global_clusters_message +DescribeGlobalNetworksRequest,describe_global_networks_request +DescribeGlobalNetworksResponse,describe_global_networks_response +DescribeGlobalReplicationGroupsMessage,describe_global_replication_groups_message +DescribeGlobalReplicationGroupsResult,describe_global_replication_groups_result +DescribeGlobalSettingsOutput,describe_global_settings_output +DescribeGlobalTableInput,describe_global_table_input +DescribeGlobalTableOutput,describe_global_table_output +DescribeGlobalTableSettingsInput,describe_global_table_settings_input +DescribeGlobalTableSettingsOutput,describe_global_table_settings_output +DescribeGroupMembershipRequest,describe_group_membership_request +DescribeGroupMembershipResponse,describe_group_membership_response +DescribeGroupRequest,describe_group_request +DescribeGroupResponse,describe_group_response +DescribeGroupsRequest,describe_groups_request +DescribeGroupsResponse,describe_groups_response +DescribeHandshakeRequest,describe_handshake_request +DescribeHandshakeResponse,describe_handshake_response +DescribeHapgRequest,describe_hapg_request +DescribeHapgResponse,describe_hapg_response +DescribeHarvestJobRequest,describe_harvest_job_request +DescribeHarvestJobResponse,describe_harvest_job_response +DescribeHealthServiceStatusForOrganizationResponse,describe_health_service_status_for_organization_response +DescribeHomeRegionControlsRequest,describe_home_region_controls_request +DescribeHomeRegionControlsResult,describe_home_region_controls_result +DescribeHostKeyRequest,describe_host_key_request +DescribeHostKeyResponse,describe_host_key_response +DescribeHostReservationOfferingsRequest,describe_host_reservation_offerings_request +DescribeHostReservationOfferingsResult,describe_host_reservation_offerings_result +DescribeHostReservationsRequest,describe_host_reservations_request +DescribeHostReservationsResult,describe_host_reservations_result +DescribeHostedConnectionsRequest,describe_hosted_connections_request +DescribeHostsRequest,describe_hosts_request +DescribeHostsResult,describe_hosts_result +DescribeHoursOfOperationRequest,describe_hours_of_operation_request +DescribeHoursOfOperationResponse,describe_hours_of_operation_response +DescribeHsmClientCertificatesMessage,describe_hsm_client_certificates_message +DescribeHsmConfigurationsMessage,describe_hsm_configurations_message +DescribeHsmRequest,describe_hsm_request +DescribeHsmResponse,describe_hsm_response +DescribeHubContentRequest,describe_hub_content_request +DescribeHubContentResponse,describe_hub_content_response +DescribeHubRequest,describe_hub_request +DescribeHubResponse,describe_hub_response +DescribeHumanLoopRequest,describe_human_loop_request +DescribeHumanLoopResponse,describe_human_loop_response +DescribeHumanTaskUiRequest,describe_human_task_ui_request +DescribeHumanTaskUiResponse,describe_human_task_ui_response +DescribeHyperParameterTuningJobRequest,describe_hyper_parameter_tuning_job_request +DescribeHyperParameterTuningJobResponse,describe_hyper_parameter_tuning_job_response +DescribeIAMPolicyAssignmentRequest,describe_iam_policy_assignment_request +DescribeIAMPolicyAssignmentResponse,describe_iam_policy_assignment_response +DescribeICD10CMInferenceJobRequest,describe_icd10_cm_inference_job_request +DescribeICD10CMInferenceJobResponse,describe_icd10_cm_inference_job_response +DescribeIamInstanceProfileAssociationsRequest,describe_iam_instance_profile_associations_request +DescribeIamInstanceProfileAssociationsResult,describe_iam_instance_profile_associations_result +DescribeIdFormatRequest,describe_id_format_request +DescribeIdFormatResult,describe_id_format_result +DescribeIdentityIdFormatRequest,describe_identity_id_format_request +DescribeIdentityIdFormatResult,describe_identity_id_format_result +DescribeIdentityInput,describe_identity_input +DescribeIdentityPoolInput,describe_identity_pool_input +DescribeIdentityPoolUsageRequest,describe_identity_pool_usage_request +DescribeIdentityPoolUsageResponse,describe_identity_pool_usage_response +DescribeIdentityProviderConfigRequest,describe_identity_provider_config_request +DescribeIdentityProviderConfigResponse,describe_identity_provider_config_response +DescribeIdentityProviderConfigurationRequest,describe_identity_provider_configuration_request +DescribeIdentityProviderConfigurationResponse,describe_identity_provider_configuration_response +DescribeIdentityProviderRequest,describe_identity_provider_request +DescribeIdentityProviderResponse,describe_identity_provider_response +DescribeIdentityUsageRequest,describe_identity_usage_request +DescribeIdentityUsageResponse,describe_identity_usage_response +DescribeImageAttributeRequest,describe_image_attribute_request +DescribeImageBuildersRequest,describe_image_builders_request +DescribeImageBuildersResult,describe_image_builders_result +DescribeImageGenerationConfigurationInput,describe_image_generation_configuration_input +DescribeImageGenerationConfigurationOutput,describe_image_generation_configuration_output +DescribeImagePermissionsRequest,describe_image_permissions_request +DescribeImagePermissionsResult,describe_image_permissions_result +DescribeImageReplicationStatusRequest,describe_image_replication_status_request +DescribeImageReplicationStatusResponse,describe_image_replication_status_response +DescribeImageRequest,describe_image_request +DescribeImageResponse,describe_image_response +DescribeImageScanFindingsRequest,describe_image_scan_findings_request +DescribeImageScanFindingsResponse,describe_image_scan_findings_response +DescribeImageTagsRequest,describe_image_tags_request +DescribeImageTagsResponse,describe_image_tags_response +DescribeImageVersionRequest,describe_image_version_request +DescribeImageVersionResponse,describe_image_version_response +DescribeImagesFilter,describe_images_filter +DescribeImagesRequest,describe_images_request +DescribeImagesResponse,describe_images_response +DescribeImagesResult,describe_images_result +DescribeImportImageTasksRequest,describe_import_image_tasks_request +DescribeImportImageTasksResult,describe_import_image_tasks_result +DescribeImportInput,describe_import_input +DescribeImportOutput,describe_import_output +DescribeImportRequest,describe_import_request +DescribeImportResponse,describe_import_response +DescribeImportSnapshotTasksRequest,describe_import_snapshot_tasks_request +DescribeImportSnapshotTasksResult,describe_import_snapshot_tasks_result +DescribeImportTasksRequest,describe_import_tasks_request +DescribeImportTasksResponse,describe_import_tasks_response +DescribeInboundConnectionsRequest,describe_inbound_connections_request +DescribeInboundConnectionsResponse,describe_inbound_connections_response +DescribeInboundCrossClusterSearchConnectionsRequest,describe_inbound_cross_cluster_search_connections_request +DescribeInboundCrossClusterSearchConnectionsResponse,describe_inbound_cross_cluster_search_connections_response +DescribeInboundDmarcSettingsRequest,describe_inbound_dmarc_settings_request +DescribeInboundDmarcSettingsResponse,describe_inbound_dmarc_settings_response +DescribeIndexFieldsRequest,describe_index_fields_request +DescribeIndexFieldsResponse,describe_index_fields_response +DescribeIndexRequest,describe_index_request +DescribeIndexResponse,describe_index_response +DescribeInferenceExperimentRequest,describe_inference_experiment_request +DescribeInferenceExperimentResponse,describe_inference_experiment_response +DescribeInferenceRecommendationsJobRequest,describe_inference_recommendations_job_request +DescribeInferenceRecommendationsJobResponse,describe_inference_recommendations_job_response +DescribeInferenceSchedulerRequest,describe_inference_scheduler_request +DescribeInferenceSchedulerResponse,describe_inference_scheduler_response +DescribeIngestionRequest,describe_ingestion_request +DescribeIngestionResponse,describe_ingestion_response +DescribeInputDeviceRequest,describe_input_device_request +DescribeInputDeviceResponse,describe_input_device_response +DescribeInputDeviceThumbnailRequest,describe_input_device_thumbnail_request +DescribeInputDeviceThumbnailResponse,describe_input_device_thumbnail_response +DescribeInputRequest,describe_input_request +DescribeInputResponse,describe_input_response +DescribeInputSecurityGroupRequest,describe_input_security_group_request +DescribeInputSecurityGroupResponse,describe_input_security_group_response +DescribeInsightRequest,describe_insight_request +DescribeInsightResponse,describe_insight_response +DescribeInsightRulesInput,describe_insight_rules_input +DescribeInsightRulesOutput,describe_insight_rules_output +DescribeInstanceAccessControlAttributeConfigurationRequest,describe_instance_access_control_attribute_configuration_request +DescribeInstanceAccessControlAttributeConfigurationResponse,describe_instance_access_control_attribute_configuration_response +DescribeInstanceAssociationsStatusRequest,describe_instance_associations_status_request +DescribeInstanceAssociationsStatusResult,describe_instance_associations_status_result +DescribeInstanceAttributeRequest,describe_instance_attribute_request +DescribeInstanceAttributeResponse,describe_instance_attribute_response +DescribeInstanceConnectEndpointsRequest,describe_instance_connect_endpoints_request +DescribeInstanceConnectEndpointsResult,describe_instance_connect_endpoints_result +DescribeInstanceCreditSpecificationsRequest,describe_instance_credit_specifications_request +DescribeInstanceCreditSpecificationsResult,describe_instance_credit_specifications_result +DescribeInstanceEventNotificationAttributesRequest,describe_instance_event_notification_attributes_request +DescribeInstanceEventNotificationAttributesResult,describe_instance_event_notification_attributes_result +DescribeInstanceEventWindowsRequest,describe_instance_event_windows_request +DescribeInstanceEventWindowsResult,describe_instance_event_windows_result +DescribeInstanceInformationRequest,describe_instance_information_request +DescribeInstanceInformationResult,describe_instance_information_result +DescribeInstancePatchStatesForPatchGroupRequest,describe_instance_patch_states_for_patch_group_request +DescribeInstancePatchStatesForPatchGroupResult,describe_instance_patch_states_for_patch_group_result +DescribeInstancePatchStatesRequest,describe_instance_patch_states_request +DescribeInstancePatchStatesResult,describe_instance_patch_states_result +DescribeInstancePatchesRequest,describe_instance_patches_request +DescribeInstancePatchesResult,describe_instance_patches_result +DescribeInstanceProfilesMessage,describe_instance_profiles_message +DescribeInstanceProfilesResponse,describe_instance_profiles_response +DescribeInstanceRefreshesAnswer,describe_instance_refreshes_answer +DescribeInstanceRefreshesType,describe_instance_refreshes_type +DescribeInstanceRequest,describe_instance_request +DescribeInstanceResponse,describe_instance_response +DescribeInstanceStatusRequest,describe_instance_status_request +DescribeInstanceStatusResult,describe_instance_status_result +DescribeInstanceStorageConfigRequest,describe_instance_storage_config_request +DescribeInstanceStorageConfigResponse,describe_instance_storage_config_response +DescribeInstanceTypeLimitsRequest,describe_instance_type_limits_request +DescribeInstanceTypeLimitsResponse,describe_instance_type_limits_response +DescribeInstanceTypeOfferingsRequest,describe_instance_type_offerings_request +DescribeInstanceTypeOfferingsResult,describe_instance_type_offerings_result +DescribeInstanceTypesRequest,describe_instance_types_request +DescribeInstanceTypesResult,describe_instance_types_result +DescribeInstancesHealthRequest,describe_instances_health_request +DescribeInstancesHealthResult,describe_instances_health_result +DescribeInstancesInput,describe_instances_input +DescribeInstancesOutput,describe_instances_output +DescribeInstancesRequest,describe_instances_request +DescribeInstancesResult,describe_instances_result +DescribeIntentRequest,describe_intent_request +DescribeIntentResponse,describe_intent_response +DescribeInterconnectLoaRequest,describe_interconnect_loa_request +DescribeInterconnectLoaResponse,describe_interconnect_loa_response +DescribeInterconnectsRequest,describe_interconnects_request +DescribeInternetGatewaysRequest,describe_internet_gateways_request +DescribeInternetGatewaysResult,describe_internet_gateways_result +DescribeInventoryDeletionsRequest,describe_inventory_deletions_request +DescribeInventoryDeletionsResult,describe_inventory_deletions_result +DescribeIpGroupsRequest,describe_ip_groups_request +DescribeIpGroupsResult,describe_ip_groups_result +DescribeIpRestrictionRequest,describe_ip_restriction_request +DescribeIpRestrictionResponse,describe_ip_restriction_response +DescribeIpamPoolsRequest,describe_ipam_pools_request +DescribeIpamPoolsResult,describe_ipam_pools_result +DescribeIpamResourceDiscoveriesRequest,describe_ipam_resource_discoveries_request +DescribeIpamResourceDiscoveriesResult,describe_ipam_resource_discoveries_result +DescribeIpamResourceDiscoveryAssociationsRequest,describe_ipam_resource_discovery_associations_request +DescribeIpamResourceDiscoveryAssociationsResult,describe_ipam_resource_discovery_associations_result +DescribeIpamScopesRequest,describe_ipam_scopes_request +DescribeIpamScopesResult,describe_ipam_scopes_result +DescribeIpamsRequest,describe_ipams_request +DescribeIpamsResult,describe_ipams_result +DescribeIpv6PoolsRequest,describe_ipv6_pools_request +DescribeIpv6PoolsResult,describe_ipv6_pools_result +DescribeJobDefinitionsRequest,describe_job_definitions_request +DescribeJobDefinitionsResponse,describe_job_definitions_response +DescribeJobExecutionRequest,describe_job_execution_request +DescribeJobExecutionResponse,describe_job_execution_response +DescribeJobFlowsInput,describe_job_flows_input +DescribeJobFlowsOutput,describe_job_flows_output +DescribeJobInput,describe_job_input +DescribeJobLogItemsRequest,describe_job_log_items_request +DescribeJobLogItemsResponse,describe_job_log_items_response +DescribeJobQueuesRequest,describe_job_queues_request +DescribeJobQueuesResponse,describe_job_queues_response +DescribeJobRequest,describe_job_request +DescribeJobResponse,describe_job_response +DescribeJobResult,describe_job_result +DescribeJobRunRequest,describe_job_run_request +DescribeJobRunResponse,describe_job_run_response +DescribeJobTemplateRequest,describe_job_template_request +DescribeJobTemplateResponse,describe_job_template_response +DescribeJobsRequest,describe_jobs_request +DescribeJobsRequestFilters,describe_jobs_request_filters +DescribeJobsResponse,describe_jobs_response +DescribeJournalKinesisStreamRequest,describe_journal_kinesis_stream_request +DescribeJournalKinesisStreamResponse,describe_journal_kinesis_stream_response +DescribeJournalS3ExportRequest,describe_journal_s3_export_request +DescribeJournalS3ExportResponse,describe_journal_s3_export_response +DescribeKeyPairsRequest,describe_key_pairs_request +DescribeKeyPairsResult,describe_key_pairs_result +DescribeKeyPhrasesDetectionJobRequest,describe_key_phrases_detection_job_request +DescribeKeyPhrasesDetectionJobResponse,describe_key_phrases_detection_job_response +DescribeKeyRequest,describe_key_request +DescribeKeyResponse,describe_key_response +DescribeKeywordsRequest,describe_keywords_request +DescribeKeywordsResult,describe_keywords_result +DescribeKinesisStreamingDestinationInput,describe_kinesis_streaming_destination_input +DescribeKinesisStreamingDestinationOutput,describe_kinesis_streaming_destination_output +DescribeLDAPSSettingsRequest,describe_ldaps_settings_request +DescribeLDAPSSettingsResult,describe_ldaps_settings_result +DescribeLabelGroupRequest,describe_label_group_request +DescribeLabelGroupResponse,describe_label_group_response +DescribeLabelRequest,describe_label_request +DescribeLabelResponse,describe_label_response +DescribeLabelingJobRequest,describe_labeling_job_request +DescribeLabelingJobResponse,describe_labeling_job_response +DescribeLagsRequest,describe_lags_request +DescribeLanguageModelRequest,describe_language_model_request +DescribeLanguageModelResponse,describe_language_model_response +DescribeLaunchConfigurationTemplatesRequest,describe_launch_configuration_templates_request +DescribeLaunchConfigurationTemplatesResponse,describe_launch_configuration_templates_response +DescribeLaunchTemplateVersionsRequest,describe_launch_template_versions_request +DescribeLaunchTemplateVersionsResult,describe_launch_template_versions_result +DescribeLaunchTemplatesRequest,describe_launch_templates_request +DescribeLaunchTemplatesResult,describe_launch_templates_result +DescribeLayersRequest,describe_layers_request +DescribeLayersResult,describe_layers_result +DescribeLedgerRequest,describe_ledger_request +DescribeLedgerResponse,describe_ledger_response +DescribeLifecycleConfigurationRequest,describe_lifecycle_configuration_request +DescribeLifecycleHookTypesAnswer,describe_lifecycle_hook_types_answer +DescribeLifecycleHooksAnswer,describe_lifecycle_hooks_answer +DescribeLifecycleHooksType,describe_lifecycle_hooks_type +DescribeLimitsOutput,describe_limits_output +DescribeLineageGroupRequest,describe_lineage_group_request +DescribeLineageGroupResponse,describe_lineage_group_response +DescribeListenerCertificatesInput,describe_listener_certificates_input +DescribeListenerCertificatesOutput,describe_listener_certificates_output +DescribeListenerRequest,describe_listener_request +DescribeListenerResponse,describe_listener_response +DescribeListenersInput,describe_listeners_input +DescribeListenersOutput,describe_listeners_output +DescribeLiveSourceRequest,describe_live_source_request +DescribeLiveSourceResponse,describe_live_source_response +DescribeLoaRequest,describe_loa_request +DescribeLoadBalancerAttributesInput,describe_load_balancer_attributes_input +DescribeLoadBalancerAttributesOutput,describe_load_balancer_attributes_output +DescribeLoadBalancerPoliciesInput,describe_load_balancer_policies_input +DescribeLoadBalancerPoliciesOutput,describe_load_balancer_policies_output +DescribeLoadBalancerPolicyTypesInput,describe_load_balancer_policy_types_input +DescribeLoadBalancerPolicyTypesOutput,describe_load_balancer_policy_types_output +DescribeLoadBalancerTargetGroupsRequest,describe_load_balancer_target_groups_request +DescribeLoadBalancerTargetGroupsResponse,describe_load_balancer_target_groups_response +DescribeLoadBalancersInput,describe_load_balancers_input +DescribeLoadBalancersOutput,describe_load_balancers_output +DescribeLoadBalancersRequest,describe_load_balancers_request +DescribeLoadBalancersResponse,describe_load_balancers_response +DescribeLoadBasedAutoScalingRequest,describe_load_based_auto_scaling_request +DescribeLoadBasedAutoScalingResult,describe_load_based_auto_scaling_result +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest,describe_local_gateway_route_table_virtual_interface_group_associations_request +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult,describe_local_gateway_route_table_virtual_interface_group_associations_result +DescribeLocalGatewayRouteTableVpcAssociationsRequest,describe_local_gateway_route_table_vpc_associations_request +DescribeLocalGatewayRouteTableVpcAssociationsResult,describe_local_gateway_route_table_vpc_associations_result +DescribeLocalGatewayRouteTablesRequest,describe_local_gateway_route_tables_request +DescribeLocalGatewayRouteTablesResult,describe_local_gateway_route_tables_result +DescribeLocalGatewayVirtualInterfaceGroupsRequest,describe_local_gateway_virtual_interface_groups_request +DescribeLocalGatewayVirtualInterfaceGroupsResult,describe_local_gateway_virtual_interface_groups_result +DescribeLocalGatewayVirtualInterfacesRequest,describe_local_gateway_virtual_interfaces_request +DescribeLocalGatewayVirtualInterfacesResult,describe_local_gateway_virtual_interfaces_result +DescribeLocalGatewaysRequest,describe_local_gateways_request +DescribeLocalGatewaysResult,describe_local_gateways_result +DescribeLocationAzureBlobRequest,describe_location_azure_blob_request +DescribeLocationAzureBlobResponse,describe_location_azure_blob_response +DescribeLocationEfsRequest,describe_location_efs_request +DescribeLocationEfsResponse,describe_location_efs_response +DescribeLocationFsxLustreRequest,describe_location_fsx_lustre_request +DescribeLocationFsxLustreResponse,describe_location_fsx_lustre_response +DescribeLocationFsxOntapRequest,describe_location_fsx_ontap_request +DescribeLocationFsxOntapResponse,describe_location_fsx_ontap_response +DescribeLocationFsxOpenZfsRequest,describe_location_fsx_open_zfs_request +DescribeLocationFsxOpenZfsResponse,describe_location_fsx_open_zfs_response +DescribeLocationFsxWindowsRequest,describe_location_fsx_windows_request +DescribeLocationFsxWindowsResponse,describe_location_fsx_windows_response +DescribeLocationHdfsRequest,describe_location_hdfs_request +DescribeLocationHdfsResponse,describe_location_hdfs_response +DescribeLocationNfsRequest,describe_location_nfs_request +DescribeLocationNfsResponse,describe_location_nfs_response +DescribeLocationObjectStorageRequest,describe_location_object_storage_request +DescribeLocationObjectStorageResponse,describe_location_object_storage_response +DescribeLocationS3Request,describe_location_s3_request +DescribeLocationS3Response,describe_location_s3_response +DescribeLocationSmbRequest,describe_location_smb_request +DescribeLocationSmbResponse,describe_location_smb_response +DescribeLogGroupsRequest,describe_log_groups_request +DescribeLogGroupsResponse,describe_log_groups_response +DescribeLogPatternRequest,describe_log_pattern_request +DescribeLogPatternResponse,describe_log_pattern_response +DescribeLogStreamsRequest,describe_log_streams_request +DescribeLogStreamsResponse,describe_log_streams_response +DescribeLoggingConfigurationRequest,describe_logging_configuration_request +DescribeLoggingConfigurationResponse,describe_logging_configuration_response +DescribeLoggingOptionsResponse,describe_logging_options_response +DescribeLoggingStatusMessage,describe_logging_status_message +DescribeLunaClientRequest,describe_luna_client_request +DescribeLunaClientResponse,describe_luna_client_response +DescribeMLModelsInput,describe_ml_models_input +DescribeMLModelsOutput,describe_ml_models_output +DescribeMailboxExportJobRequest,describe_mailbox_export_job_request +DescribeMailboxExportJobResponse,describe_mailbox_export_job_response +DescribeMaintenanceStartTimeInput,describe_maintenance_start_time_input +DescribeMaintenanceStartTimeOutput,describe_maintenance_start_time_output +DescribeMaintenanceWindowExecutionTaskInvocationsRequest,describe_maintenance_window_execution_task_invocations_request +DescribeMaintenanceWindowExecutionTaskInvocationsResult,describe_maintenance_window_execution_task_invocations_result +DescribeMaintenanceWindowExecutionTasksRequest,describe_maintenance_window_execution_tasks_request +DescribeMaintenanceWindowExecutionTasksResult,describe_maintenance_window_execution_tasks_result +DescribeMaintenanceWindowExecutionsRequest,describe_maintenance_window_executions_request +DescribeMaintenanceWindowExecutionsResult,describe_maintenance_window_executions_result +DescribeMaintenanceWindowScheduleRequest,describe_maintenance_window_schedule_request +DescribeMaintenanceWindowScheduleResult,describe_maintenance_window_schedule_result +DescribeMaintenanceWindowTargetsRequest,describe_maintenance_window_targets_request +DescribeMaintenanceWindowTargetsResult,describe_maintenance_window_targets_result +DescribeMaintenanceWindowTasksRequest,describe_maintenance_window_tasks_request +DescribeMaintenanceWindowTasksResult,describe_maintenance_window_tasks_result +DescribeMaintenanceWindowsForTargetRequest,describe_maintenance_windows_for_target_request +DescribeMaintenanceWindowsForTargetResult,describe_maintenance_windows_for_target_result +DescribeMaintenanceWindowsRequest,describe_maintenance_windows_request +DescribeMaintenanceWindowsResult,describe_maintenance_windows_result +DescribeMalwareScansRequest,describe_malware_scans_request +DescribeMalwareScansResponse,describe_malware_scans_response +DescribeManagedEndpointRequest,describe_managed_endpoint_request +DescribeManagedEndpointResponse,describe_managed_endpoint_response +DescribeManagedJobTemplateRequest,describe_managed_job_template_request +DescribeManagedJobTemplateResponse,describe_managed_job_template_response +DescribeManagedPrefixListsRequest,describe_managed_prefix_lists_request +DescribeManagedPrefixListsResult,describe_managed_prefix_lists_result +DescribeManagedProductsByVendorRequest,describe_managed_products_by_vendor_request +DescribeManagedProductsByVendorResponse,describe_managed_products_by_vendor_response +DescribeManagedRuleGroupRequest,describe_managed_rule_group_request +DescribeManagedRuleGroupResponse,describe_managed_rule_group_response +DescribeMapRequest,describe_map_request +DescribeMapResponse,describe_map_response +DescribeMapRunInput,describe_map_run_input +DescribeMapRunOutput,describe_map_run_output +DescribeMappedResourceConfigurationInput,describe_mapped_resource_configuration_input +DescribeMappedResourceConfigurationOutput,describe_mapped_resource_configuration_output +DescribeMatchmakingConfigurationsInput,describe_matchmaking_configurations_input +DescribeMatchmakingConfigurationsOutput,describe_matchmaking_configurations_output +DescribeMatchmakingInput,describe_matchmaking_input +DescribeMatchmakingOutput,describe_matchmaking_output +DescribeMatchmakingRuleSetsInput,describe_matchmaking_rule_sets_input +DescribeMatchmakingRuleSetsOutput,describe_matchmaking_rule_sets_output +DescribeMediaStorageConfigurationInput,describe_media_storage_configuration_input +DescribeMediaStorageConfigurationOutput,describe_media_storage_configuration_output +DescribeMergeConflictsInput,describe_merge_conflicts_input +DescribeMergeConflictsOutput,describe_merge_conflicts_output +DescribeMeshInput,describe_mesh_input +DescribeMeshOutput,describe_mesh_output +DescribeMetadataModelAssessmentsMessage,describe_metadata_model_assessments_message +DescribeMetadataModelAssessmentsResponse,describe_metadata_model_assessments_response +DescribeMetadataModelConversionsMessage,describe_metadata_model_conversions_message +DescribeMetadataModelConversionsResponse,describe_metadata_model_conversions_response +DescribeMetadataModelExportsAsScriptMessage,describe_metadata_model_exports_as_script_message +DescribeMetadataModelExportsAsScriptResponse,describe_metadata_model_exports_as_script_response +DescribeMetadataModelExportsToTargetMessage,describe_metadata_model_exports_to_target_message +DescribeMetadataModelExportsToTargetResponse,describe_metadata_model_exports_to_target_response +DescribeMetadataModelImportsMessage,describe_metadata_model_imports_message +DescribeMetadataModelImportsResponse,describe_metadata_model_imports_response +DescribeMetricAttributionRequest,describe_metric_attribution_request +DescribeMetricAttributionResponse,describe_metric_attribution_response +DescribeMetricCollectionTypesAnswer,describe_metric_collection_types_answer +DescribeMetricFiltersRequest,describe_metric_filters_request +DescribeMetricFiltersResponse,describe_metric_filters_response +DescribeMetricSetRequest,describe_metric_set_request +DescribeMetricSetResponse,describe_metric_set_response +DescribeMigrationProjectsMessage,describe_migration_projects_message +DescribeMigrationProjectsResponse,describe_migration_projects_response +DescribeMigrationTaskRequest,describe_migration_task_request +DescribeMigrationTaskResult,describe_migration_task_result +DescribeMitigationActionRequest,describe_mitigation_action_request +DescribeMitigationActionResponse,describe_mitigation_action_response +DescribeModelBiasJobDefinitionRequest,describe_model_bias_job_definition_request +DescribeModelBiasJobDefinitionResponse,describe_model_bias_job_definition_response +DescribeModelCardExportJobRequest,describe_model_card_export_job_request +DescribeModelCardExportJobResponse,describe_model_card_export_job_response +DescribeModelCardRequest,describe_model_card_request +DescribeModelCardResponse,describe_model_card_response +DescribeModelExplainabilityJobDefinitionRequest,describe_model_explainability_job_definition_request +DescribeModelExplainabilityJobDefinitionResponse,describe_model_explainability_job_definition_response +DescribeModelInput,describe_model_input +DescribeModelOutput,describe_model_output +DescribeModelPackageGroupInput,describe_model_package_group_input +DescribeModelPackageGroupOutput,describe_model_package_group_output +DescribeModelPackageInput,describe_model_package_input +DescribeModelPackageOutput,describe_model_package_output +DescribeModelPackagingJobRequest,describe_model_packaging_job_request +DescribeModelPackagingJobResponse,describe_model_packaging_job_response +DescribeModelQualityJobDefinitionRequest,describe_model_quality_job_definition_request +DescribeModelQualityJobDefinitionResponse,describe_model_quality_job_definition_response +DescribeModelRequest,describe_model_request +DescribeModelResponse,describe_model_response +DescribeModelVersionRequest,describe_model_version_request +DescribeModelVersionResponse,describe_model_version_response +DescribeModelVersionsRequest,describe_model_versions_request +DescribeModelVersionsResult,describe_model_versions_result +DescribeMonitorRequest,describe_monitor_request +DescribeMonitorResponse,describe_monitor_response +DescribeMonitoringScheduleRequest,describe_monitoring_schedule_request +DescribeMonitoringScheduleResponse,describe_monitoring_schedule_response +DescribeMountTargetSecurityGroupsRequest,describe_mount_target_security_groups_request +DescribeMountTargetSecurityGroupsResponse,describe_mount_target_security_groups_response +DescribeMountTargetsRequest,describe_mount_targets_request +DescribeMountTargetsResponse,describe_mount_targets_response +DescribeMovingAddressesRequest,describe_moving_addresses_request +DescribeMovingAddressesResult,describe_moving_addresses_result +DescribeMultiRegionAccessPointOperationRequest,describe_multi_region_access_point_operation_request +DescribeMultiRegionAccessPointOperationResult,describe_multi_region_access_point_operation_result +DescribeMultiplexProgramRequest,describe_multiplex_program_request +DescribeMultiplexProgramResponse,describe_multiplex_program_response +DescribeMultiplexRequest,describe_multiplex_request +DescribeMultiplexResponse,describe_multiplex_response +DescribeMyUserProfileResult,describe_my_user_profile_result +DescribeNFSFileSharesInput,describe_nfs_file_shares_input +DescribeNFSFileSharesOutput,describe_nfs_file_shares_output +DescribeNamespaceRequest,describe_namespace_request +DescribeNamespaceResponse,describe_namespace_response +DescribeNatGatewaysRequest,describe_nat_gateways_request +DescribeNatGatewaysResult,describe_nat_gateways_result +DescribeNetworkAclsRequest,describe_network_acls_request +DescribeNetworkAclsResult,describe_network_acls_result +DescribeNetworkInsightsAccessScopeAnalysesRequest,describe_network_insights_access_scope_analyses_request +DescribeNetworkInsightsAccessScopeAnalysesResult,describe_network_insights_access_scope_analyses_result +DescribeNetworkInsightsAccessScopesRequest,describe_network_insights_access_scopes_request +DescribeNetworkInsightsAccessScopesResult,describe_network_insights_access_scopes_result +DescribeNetworkInsightsAnalysesRequest,describe_network_insights_analyses_request +DescribeNetworkInsightsAnalysesResult,describe_network_insights_analyses_result +DescribeNetworkInsightsPathsRequest,describe_network_insights_paths_request +DescribeNetworkInsightsPathsResult,describe_network_insights_paths_result +DescribeNetworkInterfaceAttributeRequest,describe_network_interface_attribute_request +DescribeNetworkInterfaceAttributeResult,describe_network_interface_attribute_result +DescribeNetworkInterfacePermissionsRequest,describe_network_interface_permissions_request +DescribeNetworkInterfacePermissionsResult,describe_network_interface_permissions_result +DescribeNetworkInterfacesRequest,describe_network_interfaces_request +DescribeNetworkInterfacesResult,describe_network_interfaces_result +DescribeNodeAssociationStatusRequest,describe_node_association_status_request +DescribeNodeAssociationStatusResponse,describe_node_association_status_response +DescribeNodeConfigurationOptionsMessage,describe_node_configuration_options_message +DescribeNodeFromTemplateJobRequest,describe_node_from_template_job_request +DescribeNodeFromTemplateJobResponse,describe_node_from_template_job_response +DescribeNodeRequest,describe_node_request +DescribeNodeResponse,describe_node_response +DescribeNodegroupRequest,describe_nodegroup_request +DescribeNodegroupResponse,describe_nodegroup_response +DescribeNotebookExecutionInput,describe_notebook_execution_input +DescribeNotebookExecutionOutput,describe_notebook_execution_output +DescribeNotebookInstanceInput,describe_notebook_instance_input +DescribeNotebookInstanceLifecycleConfigInput,describe_notebook_instance_lifecycle_config_input +DescribeNotebookInstanceLifecycleConfigOutput,describe_notebook_instance_lifecycle_config_output +DescribeNotebookInstanceOutput,describe_notebook_instance_output +DescribeNotificationConfigurationInput,describe_notification_configuration_input +DescribeNotificationConfigurationOutput,describe_notification_configuration_output +DescribeNotificationConfigurationsAnswer,describe_notification_configurations_answer +DescribeNotificationConfigurationsType,describe_notification_configurations_type +DescribeNotificationRuleRequest,describe_notification_rule_request +DescribeNotificationRuleResult,describe_notification_rule_result +DescribeNotificationSubscriptionsRequest,describe_notification_subscriptions_request +DescribeNotificationSubscriptionsResponse,describe_notification_subscriptions_response +DescribeNotificationsForBudgetRequest,describe_notifications_for_budget_request +DescribeNotificationsForBudgetResponse,describe_notifications_for_budget_response +DescribeObjectRequest,describe_object_request +DescribeObjectResponse,describe_object_response +DescribeObjectsInput,describe_objects_input +DescribeObjectsOutput,describe_objects_output +DescribeObservabilityConfigurationRequest,describe_observability_configuration_request +DescribeObservabilityConfigurationResponse,describe_observability_configuration_response +DescribeObservationRequest,describe_observation_request +DescribeObservationResponse,describe_observation_response +DescribeOfferingRequest,describe_offering_request +DescribeOfferingResponse,describe_offering_response +DescribeOperatingSystemsResponse,describe_operating_systems_response +DescribeOpsItemsRequest,describe_ops_items_request +DescribeOpsItemsResponse,describe_ops_items_response +DescribeOptOutListsRequest,describe_opt_out_lists_request +DescribeOptOutListsResult,describe_opt_out_lists_result +DescribeOptedOutNumbersRequest,describe_opted_out_numbers_request +DescribeOptedOutNumbersResult,describe_opted_out_numbers_result +DescribeOptionGroupOptionsMessage,describe_option_group_options_message +DescribeOptionGroupsMessage,describe_option_groups_message +DescribeOrderableClusterOptionsMessage,describe_orderable_cluster_options_message +DescribeOrderableDBInstanceOptionsMessage,describe_orderable_db_instance_options_message +DescribeOrderableReplicationInstancesMessage,describe_orderable_replication_instances_message +DescribeOrderableReplicationInstancesResponse,describe_orderable_replication_instances_response +DescribeOrganizationConfigRuleStatusesRequest,describe_organization_config_rule_statuses_request +DescribeOrganizationConfigRuleStatusesResponse,describe_organization_config_rule_statuses_response +DescribeOrganizationConfigRulesRequest,describe_organization_config_rules_request +DescribeOrganizationConfigRulesResponse,describe_organization_config_rules_response +DescribeOrganizationConfigurationRequest,describe_organization_configuration_request +DescribeOrganizationConfigurationResponse,describe_organization_configuration_response +DescribeOrganizationConformancePackStatusesRequest,describe_organization_conformance_pack_statuses_request +DescribeOrganizationConformancePackStatusesResponse,describe_organization_conformance_pack_statuses_response +DescribeOrganizationConformancePacksRequest,describe_organization_conformance_packs_request +DescribeOrganizationConformancePacksResponse,describe_organization_conformance_packs_response +DescribeOrganizationHealthRequest,describe_organization_health_request +DescribeOrganizationHealthResponse,describe_organization_health_response +DescribeOrganizationOverviewRequest,describe_organization_overview_request +DescribeOrganizationOverviewResponse,describe_organization_overview_response +DescribeOrganizationRequest,describe_organization_request +DescribeOrganizationResourceCollectionHealthRequest,describe_organization_resource_collection_health_request +DescribeOrganizationResourceCollectionHealthResponse,describe_organization_resource_collection_health_response +DescribeOrganizationResponse,describe_organization_response +DescribeOrganizationalUnitRequest,describe_organizational_unit_request +DescribeOrganizationalUnitResponse,describe_organizational_unit_response +DescribeOrganizationsAccessInput,describe_organizations_access_input +DescribeOrganizationsAccessOutput,describe_organizations_access_output +DescribeOriginEndpointRequest,describe_origin_endpoint_request +DescribeOriginEndpointResponse,describe_origin_endpoint_response +DescribeOutboundConnectionsRequest,describe_outbound_connections_request +DescribeOutboundConnectionsResponse,describe_outbound_connections_response +DescribeOutboundCrossClusterSearchConnectionsRequest,describe_outbound_cross_cluster_search_connections_request +DescribeOutboundCrossClusterSearchConnectionsResponse,describe_outbound_cross_cluster_search_connections_response +DescribePHIDetectionJobRequest,describe_phi_detection_job_request +DescribePHIDetectionJobResponse,describe_phi_detection_job_response +DescribePackageImportJobRequest,describe_package_import_job_request +DescribePackageImportJobResponse,describe_package_import_job_response +DescribePackageRequest,describe_package_request +DescribePackageResponse,describe_package_response +DescribePackageResult,describe_package_result +DescribePackageVersionRequest,describe_package_version_request +DescribePackageVersionResponse,describe_package_version_response +DescribePackageVersionResult,describe_package_version_result +DescribePackagesFilter,describe_packages_filter +DescribePackagesRequest,describe_packages_request +DescribePackagesResponse,describe_packages_response +DescribePackagingConfigurationRequest,describe_packaging_configuration_request +DescribePackagingConfigurationResponse,describe_packaging_configuration_response +DescribePackagingGroupRequest,describe_packaging_group_request +DescribePackagingGroupResponse,describe_packaging_group_response +DescribePageRequest,describe_page_request +DescribePageResult,describe_page_result +DescribeParameterGroupsRequest,describe_parameter_groups_request +DescribeParameterGroupsResponse,describe_parameter_groups_response +DescribeParametersRequest,describe_parameters_request +DescribeParametersResponse,describe_parameters_response +DescribeParametersResult,describe_parameters_result +DescribePartnerEventSourceRequest,describe_partner_event_source_request +DescribePartnerEventSourceResponse,describe_partner_event_source_response +DescribePartnersInputMessage,describe_partners_input_message +DescribePartnersOutputMessage,describe_partners_output_message +DescribePatchBaselinesRequest,describe_patch_baselines_request +DescribePatchBaselinesResult,describe_patch_baselines_result +DescribePatchGroupStateRequest,describe_patch_group_state_request +DescribePatchGroupStateResult,describe_patch_group_state_result +DescribePatchGroupsRequest,describe_patch_groups_request +DescribePatchGroupsResult,describe_patch_groups_result +DescribePatchPropertiesRequest,describe_patch_properties_request +DescribePatchPropertiesResult,describe_patch_properties_result +DescribePendingAggregationRequestsRequest,describe_pending_aggregation_requests_request +DescribePendingAggregationRequestsResponse,describe_pending_aggregation_requests_response +DescribePendingMaintenanceActionsMessage,describe_pending_maintenance_actions_message +DescribePendingMaintenanceActionsResponse,describe_pending_maintenance_actions_response +DescribePermissionSetProvisioningStatusRequest,describe_permission_set_provisioning_status_request +DescribePermissionSetProvisioningStatusResponse,describe_permission_set_provisioning_status_response +DescribePermissionSetRequest,describe_permission_set_request +DescribePermissionSetResponse,describe_permission_set_response +DescribePermissionsRequest,describe_permissions_request +DescribePermissionsResult,describe_permissions_result +DescribePhoneNumberRequest,describe_phone_number_request +DescribePhoneNumberResponse,describe_phone_number_response +DescribePhoneNumbersRequest,describe_phone_numbers_request +DescribePhoneNumbersResult,describe_phone_numbers_result +DescribePiiEntitiesDetectionJobRequest,describe_pii_entities_detection_job_request +DescribePiiEntitiesDetectionJobResponse,describe_pii_entities_detection_job_response +DescribePipeRequest,describe_pipe_request +DescribePipeResponse,describe_pipe_response +DescribePipelineDefinitionForExecutionRequest,describe_pipeline_definition_for_execution_request +DescribePipelineDefinitionForExecutionResponse,describe_pipeline_definition_for_execution_response +DescribePipelineExecutionRequest,describe_pipeline_execution_request +DescribePipelineExecutionResponse,describe_pipeline_execution_response +DescribePipelineRequest,describe_pipeline_request +DescribePipelineResponse,describe_pipeline_response +DescribePipelinesInput,describe_pipelines_input +DescribePipelinesOutput,describe_pipelines_output +DescribePlaceIndexRequest,describe_place_index_request +DescribePlaceIndexResponse,describe_place_index_response +DescribePlacementGroupsRequest,describe_placement_groups_request +DescribePlacementGroupsResult,describe_placement_groups_result +DescribePlacementRequest,describe_placement_request +DescribePlacementResponse,describe_placement_response +DescribePlatformVersionRequest,describe_platform_version_request +DescribePlatformVersionResult,describe_platform_version_result +DescribePlayerSessionsInput,describe_player_sessions_input +DescribePlayerSessionsOutput,describe_player_sessions_output +DescribePoliciesType,describe_policies_type +DescribePolicyRequest,describe_policy_request +DescribePolicyResponse,describe_policy_response +DescribePoolsRequest,describe_pools_request +DescribePoolsResult,describe_pools_result +DescribePortalRequest,describe_portal_request +DescribePortalResponse,describe_portal_response +DescribePortfolioInput,describe_portfolio_input +DescribePortfolioOutput,describe_portfolio_output +DescribePortfolioShareStatusInput,describe_portfolio_share_status_input +DescribePortfolioShareStatusOutput,describe_portfolio_share_status_output +DescribePortfolioSharesInput,describe_portfolio_shares_input +DescribePortfolioSharesOutput,describe_portfolio_shares_output +DescribePredictorBacktestExportJobRequest,describe_predictor_backtest_export_job_request +DescribePredictorBacktestExportJobResponse,describe_predictor_backtest_export_job_response +DescribePredictorRequest,describe_predictor_request +DescribePredictorResponse,describe_predictor_response +DescribePrefixListsRequest,describe_prefix_lists_request +DescribePrefixListsResult,describe_prefix_lists_result +DescribePrincipalIdFormatRequest,describe_principal_id_format_request +DescribePrincipalIdFormatResult,describe_principal_id_format_result +DescribePrincipalMappingRequest,describe_principal_mapping_request +DescribePrincipalMappingResponse,describe_principal_mapping_response +DescribeProblemObservationsRequest,describe_problem_observations_request +DescribeProblemObservationsResponse,describe_problem_observations_response +DescribeProblemRequest,describe_problem_request +DescribeProblemResponse,describe_problem_response +DescribeProcessingJobRequest,describe_processing_job_request +DescribeProcessingJobResponse,describe_processing_job_response +DescribeProductAsAdminInput,describe_product_as_admin_input +DescribeProductAsAdminOutput,describe_product_as_admin_output +DescribeProductInput,describe_product_input +DescribeProductOutput,describe_product_output +DescribeProductViewInput,describe_product_view_input +DescribeProductViewOutput,describe_product_view_output +DescribeProductsRequest,describe_products_request +DescribeProductsResponse,describe_products_response +DescribeProfileRequest,describe_profile_request +DescribeProfileResponse,describe_profile_response +DescribeProfilingGroupRequest,describe_profiling_group_request +DescribeProfilingGroupResponse,describe_profiling_group_response +DescribeProgramRequest,describe_program_request +DescribeProgramResponse,describe_program_response +DescribeProjectInput,describe_project_input +DescribeProjectOutput,describe_project_output +DescribeProjectRequest,describe_project_request +DescribeProjectResponse,describe_project_response +DescribeProjectResult,describe_project_result +DescribeProjectVersionsRequest,describe_project_versions_request +DescribeProjectVersionsResponse,describe_project_versions_response +DescribeProjectsRequest,describe_projects_request +DescribeProjectsResponse,describe_projects_response +DescribePromptRequest,describe_prompt_request +DescribePromptResponse,describe_prompt_response +DescribeProtectedResourceInput,describe_protected_resource_input +DescribeProtectedResourceOutput,describe_protected_resource_output +DescribeProtectionGroupRequest,describe_protection_group_request +DescribeProtectionGroupResponse,describe_protection_group_response +DescribeProtectionRequest,describe_protection_request +DescribeProtectionResponse,describe_protection_response +DescribeProvisionedProductInput,describe_provisioned_product_input +DescribeProvisionedProductOutput,describe_provisioned_product_output +DescribeProvisionedProductPlanInput,describe_provisioned_product_plan_input +DescribeProvisionedProductPlanOutput,describe_provisioned_product_plan_output +DescribeProvisioningArtifactInput,describe_provisioning_artifact_input +DescribeProvisioningArtifactOutput,describe_provisioning_artifact_output +DescribeProvisioningParametersInput,describe_provisioning_parameters_input +DescribeProvisioningParametersOutput,describe_provisioning_parameters_output +DescribeProvisioningTemplateRequest,describe_provisioning_template_request +DescribeProvisioningTemplateResponse,describe_provisioning_template_response +DescribeProvisioningTemplateVersionRequest,describe_provisioning_template_version_request +DescribeProvisioningTemplateVersionResponse,describe_provisioning_template_version_response +DescribePublicIpv4PoolsRequest,describe_public_ipv4_pools_request +DescribePublicIpv4PoolsResult,describe_public_ipv4_pools_result +DescribePublisherInput,describe_publisher_input +DescribePublisherOutput,describe_publisher_output +DescribePublishingDestinationRequest,describe_publishing_destination_request +DescribePublishingDestinationResponse,describe_publishing_destination_response +DescribePullRequestEventsInput,describe_pull_request_events_input +DescribePullRequestEventsOutput,describe_pull_request_events_output +DescribePullThroughCacheRulesRequest,describe_pull_through_cache_rules_request +DescribePullThroughCacheRulesResponse,describe_pull_through_cache_rules_response +DescribeQueriesRequest,describe_queries_request +DescribeQueriesResponse,describe_queries_response +DescribeQueryDefinitionsRequest,describe_query_definitions_request +DescribeQueryDefinitionsResponse,describe_query_definitions_response +DescribeQueryRequest,describe_query_request +DescribeQueryResponse,describe_query_response +DescribeQuerySuggestionsBlockListRequest,describe_query_suggestions_block_list_request +DescribeQuerySuggestionsBlockListResponse,describe_query_suggestions_block_list_response +DescribeQuerySuggestionsConfigRequest,describe_query_suggestions_config_request +DescribeQuerySuggestionsConfigResponse,describe_query_suggestions_config_response +DescribeQueueRequest,describe_queue_request +DescribeQueueResponse,describe_queue_response +DescribeQuickConnectRequest,describe_quick_connect_request +DescribeQuickConnectResponse,describe_quick_connect_response +DescribeRaidArraysRequest,describe_raid_arrays_request +DescribeRaidArraysResult,describe_raid_arrays_result +DescribeRdsDbInstancesRequest,describe_rds_db_instances_request +DescribeRdsDbInstancesResult,describe_rds_db_instances_result +DescribeReceiptRuleRequest,describe_receipt_rule_request +DescribeReceiptRuleResponse,describe_receipt_rule_response +DescribeReceiptRuleSetRequest,describe_receipt_rule_set_request +DescribeReceiptRuleSetResponse,describe_receipt_rule_set_response +DescribeRecipeRequest,describe_recipe_request +DescribeRecipeResponse,describe_recipe_response +DescribeRecommendationExportJobsRequest,describe_recommendation_export_jobs_request +DescribeRecommendationExportJobsResponse,describe_recommendation_export_jobs_response +DescribeRecommendationFeedbackRequest,describe_recommendation_feedback_request +DescribeRecommendationFeedbackResponse,describe_recommendation_feedback_response +DescribeRecommendationLimitationsRequest,describe_recommendation_limitations_request +DescribeRecommendationLimitationsResponse,describe_recommendation_limitations_response +DescribeRecommendationsRequest,describe_recommendations_request +DescribeRecommendationsResponse,describe_recommendations_response +DescribeRecommenderRequest,describe_recommender_request +DescribeRecommenderResponse,describe_recommender_response +DescribeRecordInput,describe_record_input +DescribeRecordOutput,describe_record_output +DescribeRecoveryInstancesRequest,describe_recovery_instances_request +DescribeRecoveryInstancesRequestFilters,describe_recovery_instances_request_filters +DescribeRecoveryInstancesResponse,describe_recovery_instances_response +DescribeRecoveryPointInput,describe_recovery_point_input +DescribeRecoveryPointOutput,describe_recovery_point_output +DescribeRecoverySnapshotsRequest,describe_recovery_snapshots_request +DescribeRecoverySnapshotsRequestFilters,describe_recovery_snapshots_request_filters +DescribeRecoverySnapshotsResponse,describe_recovery_snapshots_response +DescribeRefreshScheduleRequest,describe_refresh_schedule_request +DescribeRefreshScheduleResponse,describe_refresh_schedule_response +DescribeRefreshSchemasStatusMessage,describe_refresh_schemas_status_message +DescribeRefreshSchemasStatusResponse,describe_refresh_schemas_status_response +DescribeRegionSettingsOutput,describe_region_settings_output +DescribeRegionsRequest,describe_regions_request +DescribeRegionsResult,describe_regions_result +DescribeRegistriesRequest,describe_registries_request +DescribeRegistriesResponse,describe_registries_response +DescribeRegistryRequest,describe_registry_request +DescribeRegistryResponse,describe_registry_response +DescribeReleaseLabelInput,describe_release_label_input +DescribeReleaseLabelOutput,describe_release_label_output +DescribeRemediationConfigurationsRequest,describe_remediation_configurations_request +DescribeRemediationConfigurationsResponse,describe_remediation_configurations_response +DescribeRemediationExceptionsRequest,describe_remediation_exceptions_request +DescribeRemediationExceptionsResponse,describe_remediation_exceptions_response +DescribeRemediationExecutionStatusRequest,describe_remediation_execution_status_request +DescribeRemediationExecutionStatusResponse,describe_remediation_execution_status_response +DescribeReplaceRootVolumeTasksRequest,describe_replace_root_volume_tasks_request +DescribeReplaceRootVolumeTasksResult,describe_replace_root_volume_tasks_result +DescribeReplayRequest,describe_replay_request +DescribeReplayResponse,describe_replay_response +DescribeReplicationConfigsMessage,describe_replication_configs_message +DescribeReplicationConfigsResponse,describe_replication_configs_response +DescribeReplicationConfigurationTemplatesRequest,describe_replication_configuration_templates_request +DescribeReplicationConfigurationTemplatesResponse,describe_replication_configuration_templates_response +DescribeReplicationConfigurationsRequest,describe_replication_configurations_request +DescribeReplicationConfigurationsResponse,describe_replication_configurations_response +DescribeReplicationGroupsMessage,describe_replication_groups_message +DescribeReplicationInstanceTaskLogsMessage,describe_replication_instance_task_logs_message +DescribeReplicationInstanceTaskLogsResponse,describe_replication_instance_task_logs_response +DescribeReplicationInstancesMessage,describe_replication_instances_message +DescribeReplicationInstancesResponse,describe_replication_instances_response +DescribeReplicationSubnetGroupsMessage,describe_replication_subnet_groups_message +DescribeReplicationSubnetGroupsResponse,describe_replication_subnet_groups_response +DescribeReplicationTableStatisticsMessage,describe_replication_table_statistics_message +DescribeReplicationTableStatisticsResponse,describe_replication_table_statistics_response +DescribeReplicationTaskAssessmentResultsMessage,describe_replication_task_assessment_results_message +DescribeReplicationTaskAssessmentResultsResponse,describe_replication_task_assessment_results_response +DescribeReplicationTaskAssessmentRunsMessage,describe_replication_task_assessment_runs_message +DescribeReplicationTaskAssessmentRunsResponse,describe_replication_task_assessment_runs_response +DescribeReplicationTaskIndividualAssessmentsMessage,describe_replication_task_individual_assessments_message +DescribeReplicationTaskIndividualAssessmentsResponse,describe_replication_task_individual_assessments_response +DescribeReplicationTasksMessage,describe_replication_tasks_message +DescribeReplicationTasksResponse,describe_replication_tasks_response +DescribeReplicationsMessage,describe_replications_message +DescribeReplicationsResponse,describe_replications_response +DescribeReportCreationOutput,describe_report_creation_output +DescribeReportDefinitionsRequest,describe_report_definitions_request +DescribeReportDefinitionsResponse,describe_report_definitions_response +DescribeReportJobInput,describe_report_job_input +DescribeReportJobOutput,describe_report_job_output +DescribeReportPlanInput,describe_report_plan_input +DescribeReportPlanOutput,describe_report_plan_output +DescribeRepositoriesRequest,describe_repositories_request +DescribeRepositoriesResponse,describe_repositories_response +DescribeRepositoryAssociationRequest,describe_repository_association_request +DescribeRepositoryAssociationResponse,describe_repository_association_response +DescribeRepositoryRequest,describe_repository_request +DescribeRepositoryResult,describe_repository_result +DescribeRescoreExecutionPlanRequest,describe_rescore_execution_plan_request +DescribeRescoreExecutionPlanResponse,describe_rescore_execution_plan_response +DescribeReservationRequest,describe_reservation_request +DescribeReservationResponse,describe_reservation_response +DescribeReservedCacheNodesMessage,describe_reserved_cache_nodes_message +DescribeReservedCacheNodesOfferingsMessage,describe_reserved_cache_nodes_offerings_message +DescribeReservedDBInstancesMessage,describe_reserved_db_instances_message +DescribeReservedDBInstancesOfferingsMessage,describe_reserved_db_instances_offerings_message +DescribeReservedElasticsearchInstanceOfferingsRequest,describe_reserved_elasticsearch_instance_offerings_request +DescribeReservedElasticsearchInstanceOfferingsResponse,describe_reserved_elasticsearch_instance_offerings_response +DescribeReservedElasticsearchInstancesRequest,describe_reserved_elasticsearch_instances_request +DescribeReservedElasticsearchInstancesResponse,describe_reserved_elasticsearch_instances_response +DescribeReservedInstanceOfferingsRequest,describe_reserved_instance_offerings_request +DescribeReservedInstanceOfferingsResponse,describe_reserved_instance_offerings_response +DescribeReservedInstancesListingsRequest,describe_reserved_instances_listings_request +DescribeReservedInstancesListingsResult,describe_reserved_instances_listings_result +DescribeReservedInstancesModificationsRequest,describe_reserved_instances_modifications_request +DescribeReservedInstancesModificationsResult,describe_reserved_instances_modifications_result +DescribeReservedInstancesOfferingsRequest,describe_reserved_instances_offerings_request +DescribeReservedInstancesOfferingsResult,describe_reserved_instances_offerings_result +DescribeReservedInstancesRequest,describe_reserved_instances_request +DescribeReservedInstancesResponse,describe_reserved_instances_response +DescribeReservedInstancesResult,describe_reserved_instances_result +DescribeReservedNodeExchangeStatusInputMessage,describe_reserved_node_exchange_status_input_message +DescribeReservedNodeExchangeStatusOutputMessage,describe_reserved_node_exchange_status_output_message +DescribeReservedNodeOfferingsMessage,describe_reserved_node_offerings_message +DescribeReservedNodesMessage,describe_reserved_nodes_message +DescribeReservedNodesOfferingsRequest,describe_reserved_nodes_offerings_request +DescribeReservedNodesOfferingsResponse,describe_reserved_nodes_offerings_response +DescribeReservedNodesRequest,describe_reserved_nodes_request +DescribeReservedNodesResponse,describe_reserved_nodes_response +DescribeResiliencyPolicyRequest,describe_resiliency_policy_request +DescribeResiliencyPolicyResponse,describe_resiliency_policy_response +DescribeResizeMessage,describe_resize_message +DescribeResourceCollectionHealthRequest,describe_resource_collection_health_request +DescribeResourceCollectionHealthResponse,describe_resource_collection_health_response +DescribeResourceGroupsRequest,describe_resource_groups_request +DescribeResourceGroupsResponse,describe_resource_groups_response +DescribeResourcePermissionsRequest,describe_resource_permissions_request +DescribeResourcePermissionsResponse,describe_resource_permissions_response +DescribeResourcePoliciesRequest,describe_resource_policies_request +DescribeResourcePoliciesResponse,describe_resource_policies_response +DescribeResourcePolicyRequest,describe_resource_policy_request +DescribeResourcePolicyResponse,describe_resource_policy_response +DescribeResourceRequest,describe_resource_request +DescribeResourceResponse,describe_resource_response +DescribeResourceServerRequest,describe_resource_server_request +DescribeResourceServerResponse,describe_resource_server_response +DescribeRestoreJobInput,describe_restore_job_input +DescribeRestoreJobOutput,describe_restore_job_output +DescribeRetentionConfigurationsRequest,describe_retention_configurations_request +DescribeRetentionConfigurationsResponse,describe_retention_configurations_response +DescribeRetrainingSchedulerRequest,describe_retraining_scheduler_request +DescribeRetrainingSchedulerResponse,describe_retraining_scheduler_response +DescribeReturnShippingLabelRequest,describe_return_shipping_label_request +DescribeReturnShippingLabelResult,describe_return_shipping_label_result +DescribeRiskConfigurationRequest,describe_risk_configuration_request +DescribeRiskConfigurationResponse,describe_risk_configuration_response +DescribeRobotApplicationRequest,describe_robot_application_request +DescribeRobotApplicationResponse,describe_robot_application_response +DescribeRobotRequest,describe_robot_request +DescribeRobotResponse,describe_robot_response +DescribeRoleAliasRequest,describe_role_alias_request +DescribeRoleAliasResponse,describe_role_alias_response +DescribeRootFoldersRequest,describe_root_folders_request +DescribeRootFoldersResponse,describe_root_folders_response +DescribeRouteCalculatorRequest,describe_route_calculator_request +DescribeRouteCalculatorResponse,describe_route_calculator_response +DescribeRouteInput,describe_route_input +DescribeRouteOutput,describe_route_output +DescribeRouteTablesRequest,describe_route_tables_request +DescribeRouteTablesResult,describe_route_tables_result +DescribeRouterConfigurationRequest,describe_router_configuration_request +DescribeRouterConfigurationResponse,describe_router_configuration_response +DescribeRoutingControlRequest,describe_routing_control_request +DescribeRoutingControlResponse,describe_routing_control_response +DescribeRoutingProfileRequest,describe_routing_profile_request +DescribeRoutingProfileResponse,describe_routing_profile_response +DescribeRuleGroupMetadataRequest,describe_rule_group_metadata_request +DescribeRuleGroupMetadataResponse,describe_rule_group_metadata_response +DescribeRuleGroupRequest,describe_rule_group_request +DescribeRuleGroupResponse,describe_rule_group_response +DescribeRuleGroupsNamespaceRequest,describe_rule_groups_namespace_request +DescribeRuleGroupsNamespaceResponse,describe_rule_groups_namespace_response +DescribeRuleRequest,describe_rule_request +DescribeRuleResponse,describe_rule_response +DescribeRulesInput,describe_rules_input +DescribeRulesOutput,describe_rules_output +DescribeRulesPackagesRequest,describe_rules_packages_request +DescribeRulesPackagesResponse,describe_rules_packages_response +DescribeRulesetRequest,describe_ruleset_request +DescribeRulesetResponse,describe_ruleset_response +DescribeRuntimeConfigurationInput,describe_runtime_configuration_input +DescribeRuntimeConfigurationOutput,describe_runtime_configuration_output +DescribeRuntimeVersionsRequest,describe_runtime_versions_request +DescribeRuntimeVersionsResponse,describe_runtime_versions_response +DescribeRxNormInferenceJobRequest,describe_rx_norm_inference_job_request +DescribeRxNormInferenceJobResponse,describe_rx_norm_inference_job_response +DescribeSMBFileSharesInput,describe_smb_file_shares_input +DescribeSMBFileSharesOutput,describe_smb_file_shares_output +DescribeSMBSettingsInput,describe_smb_settings_input +DescribeSMBSettingsOutput,describe_smb_settings_output +DescribeSNOMEDCTInferenceJobRequest,describe_snomedct_inference_job_request +DescribeSNOMEDCTInferenceJobResponse,describe_snomedct_inference_job_response +DescribeSSLPoliciesInput,describe_ssl_policies_input +DescribeSSLPoliciesOutput,describe_ssl_policies_output +DescribeSafetyRuleRequest,describe_safety_rule_request +DescribeSafetyRuleResponse,describe_safety_rule_response +DescribeSavingsPlanRatesRequest,describe_savings_plan_rates_request +DescribeSavingsPlanRatesResponse,describe_savings_plan_rates_response +DescribeSavingsPlansOfferingRatesRequest,describe_savings_plans_offering_rates_request +DescribeSavingsPlansOfferingRatesResponse,describe_savings_plans_offering_rates_response +DescribeSavingsPlansOfferingsRequest,describe_savings_plans_offerings_request +DescribeSavingsPlansOfferingsResponse,describe_savings_plans_offerings_response +DescribeSavingsPlansRequest,describe_savings_plans_request +DescribeSavingsPlansResponse,describe_savings_plans_response +DescribeScalableTargetsRequest,describe_scalable_targets_request +DescribeScalableTargetsResponse,describe_scalable_targets_response +DescribeScalingActivitiesRequest,describe_scaling_activities_request +DescribeScalingActivitiesResponse,describe_scaling_activities_response +DescribeScalingActivitiesType,describe_scaling_activities_type +DescribeScalingParametersRequest,describe_scaling_parameters_request +DescribeScalingParametersResponse,describe_scaling_parameters_response +DescribeScalingPlanResourcesRequest,describe_scaling_plan_resources_request +DescribeScalingPlanResourcesResponse,describe_scaling_plan_resources_response +DescribeScalingPlansRequest,describe_scaling_plans_request +DescribeScalingPlansResponse,describe_scaling_plans_response +DescribeScalingPoliciesInput,describe_scaling_policies_input +DescribeScalingPoliciesOutput,describe_scaling_policies_output +DescribeScalingPoliciesRequest,describe_scaling_policies_request +DescribeScalingPoliciesResponse,describe_scaling_policies_response +DescribeScheduleRequest,describe_schedule_request +DescribeScheduleResponse,describe_schedule_response +DescribeScheduledActionsMessage,describe_scheduled_actions_message +DescribeScheduledActionsRequest,describe_scheduled_actions_request +DescribeScheduledActionsResponse,describe_scheduled_actions_response +DescribeScheduledActionsType,describe_scheduled_actions_type +DescribeScheduledAuditRequest,describe_scheduled_audit_request +DescribeScheduledAuditResponse,describe_scheduled_audit_response +DescribeScheduledInstanceAvailabilityRequest,describe_scheduled_instance_availability_request +DescribeScheduledInstanceAvailabilityResult,describe_scheduled_instance_availability_result +DescribeScheduledInstancesRequest,describe_scheduled_instances_request +DescribeScheduledInstancesResult,describe_scheduled_instances_result +DescribeScheduledQueryRequest,describe_scheduled_query_request +DescribeScheduledQueryResponse,describe_scheduled_query_response +DescribeSchedulingPoliciesRequest,describe_scheduling_policies_request +DescribeSchedulingPoliciesResponse,describe_scheduling_policies_response +DescribeSchemaRequest,describe_schema_request +DescribeSchemaResponse,describe_schema_response +DescribeSchemasMessage,describe_schemas_message +DescribeSchemasResponse,describe_schemas_response +DescribeScriptInput,describe_script_input +DescribeScriptOutput,describe_script_output +DescribeSecretRequest,describe_secret_request +DescribeSecretResponse,describe_secret_response +DescribeSecurityConfigurationInput,describe_security_configuration_input +DescribeSecurityConfigurationOutput,describe_security_configuration_output +DescribeSecurityGroupReferencesRequest,describe_security_group_references_request +DescribeSecurityGroupReferencesResult,describe_security_group_references_result +DescribeSecurityGroupRulesRequest,describe_security_group_rules_request +DescribeSecurityGroupRulesResult,describe_security_group_rules_result +DescribeSecurityGroupsRequest,describe_security_groups_request +DescribeSecurityGroupsResult,describe_security_groups_result +DescribeSecurityPolicyRequest,describe_security_policy_request +DescribeSecurityPolicyResponse,describe_security_policy_response +DescribeSecurityProfileRequest,describe_security_profile_request +DescribeSecurityProfileResponse,describe_security_profile_response +DescribeSenderIdsRequest,describe_sender_ids_request +DescribeSenderIdsResult,describe_sender_ids_result +DescribeSentimentDetectionJobRequest,describe_sentiment_detection_job_request +DescribeSentimentDetectionJobResponse,describe_sentiment_detection_job_response +DescribeServerRequest,describe_server_request +DescribeServerResponse,describe_server_response +DescribeServersRequest,describe_servers_request +DescribeServersResponse,describe_servers_response +DescribeServiceAccessPoliciesRequest,describe_service_access_policies_request +DescribeServiceAccessPoliciesResponse,describe_service_access_policies_response +DescribeServiceActionExecutionParametersInput,describe_service_action_execution_parameters_input +DescribeServiceActionExecutionParametersOutput,describe_service_action_execution_parameters_output +DescribeServiceActionInput,describe_service_action_input +DescribeServiceActionOutput,describe_service_action_output +DescribeServiceErrorsRequest,describe_service_errors_request +DescribeServiceErrorsResult,describe_service_errors_result +DescribeServiceIntegrationResponse,describe_service_integration_response +DescribeServiceRequest,describe_service_request +DescribeServiceResponse,describe_service_response +DescribeServiceUpdatesMessage,describe_service_updates_message +DescribeServiceUpdatesRequest,describe_service_updates_request +DescribeServiceUpdatesResponse,describe_service_updates_response +DescribeServicesRequest,describe_services_request +DescribeServicesResponse,describe_services_response +DescribeSessionsRequest,describe_sessions_request +DescribeSessionsResponse,describe_sessions_response +DescribeSessionsResult,describe_sessions_result +DescribeSettingsRequest,describe_settings_request +DescribeSettingsResult,describe_settings_result +DescribeSeverityLevelsRequest,describe_severity_levels_request +DescribeSeverityLevelsResponse,describe_severity_levels_response +DescribeShardInterval,describe_shard_interval +DescribeSharedDirectoriesRequest,describe_shared_directories_request +DescribeSharedDirectoriesResult,describe_shared_directories_result +DescribeSignalingChannelInput,describe_signaling_channel_input +DescribeSignalingChannelOutput,describe_signaling_channel_output +DescribeSigningJobRequest,describe_signing_job_request +DescribeSigningJobResponse,describe_signing_job_response +DescribeSimulationApplicationRequest,describe_simulation_application_request +DescribeSimulationApplicationResponse,describe_simulation_application_response +DescribeSimulationInput,describe_simulation_input +DescribeSimulationJobBatchRequest,describe_simulation_job_batch_request +DescribeSimulationJobBatchResponse,describe_simulation_job_batch_response +DescribeSimulationJobRequest,describe_simulation_job_request +DescribeSimulationJobResponse,describe_simulation_job_response +DescribeSimulationOutput,describe_simulation_output +DescribeSlotRequest,describe_slot_request +DescribeSlotResponse,describe_slot_response +DescribeSlotTypeRequest,describe_slot_type_request +DescribeSlotTypeResponse,describe_slot_type_response +DescribeSnapshotAttributeRequest,describe_snapshot_attribute_request +DescribeSnapshotAttributeResult,describe_snapshot_attribute_result +DescribeSnapshotCopyGrantsMessage,describe_snapshot_copy_grants_message +DescribeSnapshotScheduleInput,describe_snapshot_schedule_input +DescribeSnapshotScheduleOutput,describe_snapshot_schedule_output +DescribeSnapshotSchedulesMessage,describe_snapshot_schedules_message +DescribeSnapshotSchedulesOutputMessage,describe_snapshot_schedules_output_message +DescribeSnapshotTierStatusRequest,describe_snapshot_tier_status_request +DescribeSnapshotTierStatusResult,describe_snapshot_tier_status_result +DescribeSnapshotsListMessage,describe_snapshots_list_message +DescribeSnapshotsMessage,describe_snapshots_message +DescribeSnapshotsRequest,describe_snapshots_request +DescribeSnapshotsResponse,describe_snapshots_response +DescribeSnapshotsResult,describe_snapshots_result +DescribeSolutionRequest,describe_solution_request +DescribeSolutionResponse,describe_solution_response +DescribeSolutionVersionRequest,describe_solution_version_request +DescribeSolutionVersionResponse,describe_solution_version_response +DescribeSourceLocationRequest,describe_source_location_request +DescribeSourceLocationResponse,describe_source_location_response +DescribeSourceNetworksRequest,describe_source_networks_request +DescribeSourceNetworksRequestFilters,describe_source_networks_request_filters +DescribeSourceNetworksResponse,describe_source_networks_response +DescribeSourceRegionsMessage,describe_source_regions_message +DescribeSourceServersRequest,describe_source_servers_request +DescribeSourceServersRequestFilters,describe_source_servers_request_filters +DescribeSourceServersResponse,describe_source_servers_response +DescribeSpaceRequest,describe_space_request +DescribeSpaceResponse,describe_space_response +DescribeSpeakerEnrollmentJobRequest,describe_speaker_enrollment_job_request +DescribeSpeakerEnrollmentJobResponse,describe_speaker_enrollment_job_response +DescribeSpeakerRequest,describe_speaker_request +DescribeSpeakerResponse,describe_speaker_response +DescribeSpendLimitsRequest,describe_spend_limits_request +DescribeSpendLimitsResult,describe_spend_limits_result +DescribeSpotDatafeedSubscriptionRequest,describe_spot_datafeed_subscription_request +DescribeSpotDatafeedSubscriptionResult,describe_spot_datafeed_subscription_result +DescribeSpotFleetInstancesRequest,describe_spot_fleet_instances_request +DescribeSpotFleetInstancesResponse,describe_spot_fleet_instances_response +DescribeSpotFleetRequestHistoryRequest,describe_spot_fleet_request_history_request +DescribeSpotFleetRequestHistoryResponse,describe_spot_fleet_request_history_response +DescribeSpotFleetRequestsRequest,describe_spot_fleet_requests_request +DescribeSpotFleetRequestsResponse,describe_spot_fleet_requests_response +DescribeSpotInstanceRequestsRequest,describe_spot_instance_requests_request +DescribeSpotInstanceRequestsResult,describe_spot_instance_requests_result +DescribeSpotPriceHistoryRequest,describe_spot_price_history_request +DescribeSpotPriceHistoryResult,describe_spot_price_history_result +DescribeStackDriftDetectionStatusInput,describe_stack_drift_detection_status_input +DescribeStackDriftDetectionStatusOutput,describe_stack_drift_detection_status_output +DescribeStackEventsInput,describe_stack_events_input +DescribeStackEventsOutput,describe_stack_events_output +DescribeStackInstanceInput,describe_stack_instance_input +DescribeStackInstanceOutput,describe_stack_instance_output +DescribeStackProvisioningParametersRequest,describe_stack_provisioning_parameters_request +DescribeStackProvisioningParametersResult,describe_stack_provisioning_parameters_result +DescribeStackResourceDriftsInput,describe_stack_resource_drifts_input +DescribeStackResourceDriftsOutput,describe_stack_resource_drifts_output +DescribeStackResourceInput,describe_stack_resource_input +DescribeStackResourceOutput,describe_stack_resource_output +DescribeStackResourcesInput,describe_stack_resources_input +DescribeStackResourcesOutput,describe_stack_resources_output +DescribeStackSetInput,describe_stack_set_input +DescribeStackSetOperationInput,describe_stack_set_operation_input +DescribeStackSetOperationOutput,describe_stack_set_operation_output +DescribeStackSetOutput,describe_stack_set_output +DescribeStackSummaryRequest,describe_stack_summary_request +DescribeStackSummaryResult,describe_stack_summary_result +DescribeStacksInput,describe_stacks_input +DescribeStacksOutput,describe_stacks_output +DescribeStacksRequest,describe_stacks_request +DescribeStacksResult,describe_stacks_result +DescribeStaleSecurityGroupsRequest,describe_stale_security_groups_request +DescribeStaleSecurityGroupsResult,describe_stale_security_groups_result +DescribeStandardsControlsRequest,describe_standards_controls_request +DescribeStandardsControlsResponse,describe_standards_controls_response +DescribeStandardsRequest,describe_standards_request +DescribeStandardsResponse,describe_standards_response +DescribeStateMachineAliasInput,describe_state_machine_alias_input +DescribeStateMachineAliasOutput,describe_state_machine_alias_output +DescribeStateMachineForExecutionInput,describe_state_machine_for_execution_input +DescribeStateMachineForExecutionOutput,describe_state_machine_for_execution_output +DescribeStateMachineInput,describe_state_machine_input +DescribeStateMachineOutput,describe_state_machine_output +DescribeStatementRequest,describe_statement_request +DescribeStatementResponse,describe_statement_response +DescribeStepInput,describe_step_input +DescribeStepOutput,describe_step_output +DescribeStorageConfigurationResponse,describe_storage_configuration_response +DescribeStorageSystemRequest,describe_storage_system_request +DescribeStorageSystemResourceMetricsRequest,describe_storage_system_resource_metrics_request +DescribeStorageSystemResourceMetricsResponse,describe_storage_system_resource_metrics_response +DescribeStorageSystemResourcesRequest,describe_storage_system_resources_request +DescribeStorageSystemResourcesResponse,describe_storage_system_resources_response +DescribeStorageSystemResponse,describe_storage_system_response +DescribeStorageVirtualMachinesRequest,describe_storage_virtual_machines_request +DescribeStorageVirtualMachinesResponse,describe_storage_virtual_machines_response +DescribeStoreImageTasksRequest,describe_store_image_tasks_request +DescribeStoreImageTasksResult,describe_store_image_tasks_result +DescribeStorediSCSIVolumesInput,describe_storedi_scsi_volumes_input +DescribeStorediSCSIVolumesOutput,describe_storedi_scsi_volumes_output +DescribeStreamConsumerInput,describe_stream_consumer_input +DescribeStreamConsumerOutput,describe_stream_consumer_output +DescribeStreamInput,describe_stream_input +DescribeStreamOutput,describe_stream_output +DescribeStreamProcessorRequest,describe_stream_processor_request +DescribeStreamProcessorResponse,describe_stream_processor_response +DescribeStreamRequest,describe_stream_request +DescribeStreamResponse,describe_stream_response +DescribeStreamSummaryInput,describe_stream_summary_input +DescribeStreamSummaryOutput,describe_stream_summary_output +DescribeStudioInput,describe_studio_input +DescribeStudioLifecycleConfigRequest,describe_studio_lifecycle_config_request +DescribeStudioLifecycleConfigResponse,describe_studio_lifecycle_config_response +DescribeStudioOutput,describe_studio_output +DescribeSubnetGroupsRequest,describe_subnet_groups_request +DescribeSubnetGroupsResponse,describe_subnet_groups_response +DescribeSubnetsRequest,describe_subnets_request +DescribeSubnetsResult,describe_subnets_result +DescribeSubscribedWorkteamRequest,describe_subscribed_workteam_request +DescribeSubscribedWorkteamResponse,describe_subscribed_workteam_response +DescribeSubscribersForNotificationRequest,describe_subscribers_for_notification_request +DescribeSubscribersForNotificationResponse,describe_subscribers_for_notification_response +DescribeSubscriptionFiltersRequest,describe_subscription_filters_request +DescribeSubscriptionFiltersResponse,describe_subscription_filters_response +DescribeSubscriptionResponse,describe_subscription_response +DescribeSuggestersRequest,describe_suggesters_request +DescribeSuggestersResponse,describe_suggesters_response +DescribeSupportedLanguagesRequest,describe_supported_languages_request +DescribeSupportedLanguagesResponse,describe_supported_languages_response +DescribeTLSInspectionConfigurationRequest,describe_tls_inspection_configuration_request +DescribeTLSInspectionConfigurationResponse,describe_tls_inspection_configuration_response +DescribeTableDataImportJobRequest,describe_table_data_import_job_request +DescribeTableDataImportJobResult,describe_table_data_import_job_result +DescribeTableInput,describe_table_input +DescribeTableOutput,describe_table_output +DescribeTableReplicaAutoScalingInput,describe_table_replica_auto_scaling_input +DescribeTableReplicaAutoScalingOutput,describe_table_replica_auto_scaling_output +DescribeTableRequest,describe_table_request +DescribeTableResponse,describe_table_response +DescribeTableRestoreStatusMessage,describe_table_restore_status_message +DescribeTableStatisticsMessage,describe_table_statistics_message +DescribeTableStatisticsResponse,describe_table_statistics_response +DescribeTagOptionInput,describe_tag_option_input +DescribeTagOptionOutput,describe_tag_option_output +DescribeTagsInput,describe_tags_input +DescribeTagsMessage,describe_tags_message +DescribeTagsOutput,describe_tags_output +DescribeTagsRequest,describe_tags_request +DescribeTagsResponse,describe_tags_response +DescribeTagsResult,describe_tags_result +DescribeTagsType,describe_tags_type +DescribeTapeArchivesInput,describe_tape_archives_input +DescribeTapeArchivesOutput,describe_tape_archives_output +DescribeTapeRecoveryPointsInput,describe_tape_recovery_points_input +DescribeTapeRecoveryPointsOutput,describe_tape_recovery_points_output +DescribeTapesInput,describe_tapes_input +DescribeTapesOutput,describe_tapes_output +DescribeTargetGroupAttributesInput,describe_target_group_attributes_input +DescribeTargetGroupAttributesOutput,describe_target_group_attributes_output +DescribeTargetGroupsInput,describe_target_groups_input +DescribeTargetGroupsOutput,describe_target_groups_output +DescribeTargetHealthInput,describe_target_health_input +DescribeTargetHealthOutput,describe_target_health_output +DescribeTargetedSentimentDetectionJobRequest,describe_targeted_sentiment_detection_job_request +DescribeTargetedSentimentDetectionJobResponse,describe_targeted_sentiment_detection_job_response +DescribeTaskDefinitionRequest,describe_task_definition_request +DescribeTaskDefinitionResponse,describe_task_definition_response +DescribeTaskExecutionRequest,describe_task_execution_request +DescribeTaskExecutionResponse,describe_task_execution_response +DescribeTaskInput,describe_task_input +DescribeTaskOutput,describe_task_output +DescribeTaskRequest,describe_task_request +DescribeTaskResponse,describe_task_response +DescribeTaskSetsRequest,describe_task_sets_request +DescribeTaskSetsResponse,describe_task_sets_response +DescribeTasksRequest,describe_tasks_request +DescribeTasksResponse,describe_tasks_response +DescribeTemplateAliasRequest,describe_template_alias_request +DescribeTemplateAliasResponse,describe_template_alias_response +DescribeTemplateDefinitionRequest,describe_template_definition_request +DescribeTemplateDefinitionResponse,describe_template_definition_response +DescribeTemplatePermissionsRequest,describe_template_permissions_request +DescribeTemplatePermissionsResponse,describe_template_permissions_response +DescribeTemplateRequest,describe_template_request +DescribeTemplateResponse,describe_template_response +DescribeTerminationPolicyTypesAnswer,describe_termination_policy_types_answer +DescribeTestCasesInput,describe_test_cases_input +DescribeTestCasesOutput,describe_test_cases_output +DescribeTestExecutionRequest,describe_test_execution_request +DescribeTestExecutionResponse,describe_test_execution_response +DescribeTestSetDiscrepancyReportRequest,describe_test_set_discrepancy_report_request +DescribeTestSetDiscrepancyReportResponse,describe_test_set_discrepancy_report_response +DescribeTestSetGenerationRequest,describe_test_set_generation_request +DescribeTestSetGenerationResponse,describe_test_set_generation_response +DescribeTestSetRequest,describe_test_set_request +DescribeTestSetResponse,describe_test_set_response +DescribeTextTranslationJobRequest,describe_text_translation_job_request +DescribeTextTranslationJobResponse,describe_text_translation_job_response +DescribeThemeAliasRequest,describe_theme_alias_request +DescribeThemeAliasResponse,describe_theme_alias_response +DescribeThemePermissionsRequest,describe_theme_permissions_request +DescribeThemePermissionsResponse,describe_theme_permissions_response +DescribeThemeRequest,describe_theme_request +DescribeThemeResponse,describe_theme_response +DescribeThesaurusRequest,describe_thesaurus_request +DescribeThesaurusResponse,describe_thesaurus_response +DescribeThingGroupRequest,describe_thing_group_request +DescribeThingGroupResponse,describe_thing_group_response +DescribeThingRegistrationTaskRequest,describe_thing_registration_task_request +DescribeThingRegistrationTaskResponse,describe_thing_registration_task_response +DescribeThingRequest,describe_thing_request +DescribeThingResponse,describe_thing_response +DescribeThingTypeRequest,describe_thing_type_request +DescribeThingTypeResponse,describe_thing_type_response +DescribeThumbnailsRequest,describe_thumbnails_request +DescribeThumbnailsResponse,describe_thumbnails_response +DescribeTimeBasedAutoScalingRequest,describe_time_based_auto_scaling_request +DescribeTimeBasedAutoScalingResult,describe_time_based_auto_scaling_result +DescribeTimeSeriesRequest,describe_time_series_request +DescribeTimeSeriesResponse,describe_time_series_response +DescribeTimeToLiveInput,describe_time_to_live_input +DescribeTimeToLiveOutput,describe_time_to_live_output +DescribeTopicPermissionsRequest,describe_topic_permissions_request +DescribeTopicPermissionsResponse,describe_topic_permissions_response +DescribeTopicRefreshRequest,describe_topic_refresh_request +DescribeTopicRefreshResponse,describe_topic_refresh_response +DescribeTopicRefreshScheduleRequest,describe_topic_refresh_schedule_request +DescribeTopicRefreshScheduleResponse,describe_topic_refresh_schedule_response +DescribeTopicRequest,describe_topic_request +DescribeTopicResponse,describe_topic_response +DescribeTopicsDetectionJobRequest,describe_topics_detection_job_request +DescribeTopicsDetectionJobResponse,describe_topics_detection_job_response +DescribeTrackerRequest,describe_tracker_request +DescribeTrackerResponse,describe_tracker_response +DescribeTrafficDistributionGroupRequest,describe_traffic_distribution_group_request +DescribeTrafficDistributionGroupResponse,describe_traffic_distribution_group_response +DescribeTrafficMirrorFiltersRequest,describe_traffic_mirror_filters_request +DescribeTrafficMirrorFiltersResult,describe_traffic_mirror_filters_result +DescribeTrafficMirrorSessionsRequest,describe_traffic_mirror_sessions_request +DescribeTrafficMirrorSessionsResult,describe_traffic_mirror_sessions_result +DescribeTrafficMirrorTargetsRequest,describe_traffic_mirror_targets_request +DescribeTrafficMirrorTargetsResult,describe_traffic_mirror_targets_result +DescribeTrafficSourcesRequest,describe_traffic_sources_request +DescribeTrafficSourcesResponse,describe_traffic_sources_response +DescribeTrailsRequest,describe_trails_request +DescribeTrailsResponse,describe_trails_response +DescribeTrainingJobRequest,describe_training_job_request +DescribeTrainingJobResponse,describe_training_job_response +DescribeTransactionRequest,describe_transaction_request +DescribeTransactionResponse,describe_transaction_response +DescribeTransformJobRequest,describe_transform_job_request +DescribeTransformJobResponse,describe_transform_job_response +DescribeTransitGatewayAttachmentsRequest,describe_transit_gateway_attachments_request +DescribeTransitGatewayAttachmentsResult,describe_transit_gateway_attachments_result +DescribeTransitGatewayConnectPeersRequest,describe_transit_gateway_connect_peers_request +DescribeTransitGatewayConnectPeersResult,describe_transit_gateway_connect_peers_result +DescribeTransitGatewayConnectsRequest,describe_transit_gateway_connects_request +DescribeTransitGatewayConnectsResult,describe_transit_gateway_connects_result +DescribeTransitGatewayMulticastDomainsRequest,describe_transit_gateway_multicast_domains_request +DescribeTransitGatewayMulticastDomainsResult,describe_transit_gateway_multicast_domains_result +DescribeTransitGatewayPeeringAttachmentsRequest,describe_transit_gateway_peering_attachments_request +DescribeTransitGatewayPeeringAttachmentsResult,describe_transit_gateway_peering_attachments_result +DescribeTransitGatewayPolicyTablesRequest,describe_transit_gateway_policy_tables_request +DescribeTransitGatewayPolicyTablesResult,describe_transit_gateway_policy_tables_result +DescribeTransitGatewayRouteTableAnnouncementsRequest,describe_transit_gateway_route_table_announcements_request +DescribeTransitGatewayRouteTableAnnouncementsResult,describe_transit_gateway_route_table_announcements_result +DescribeTransitGatewayRouteTablesRequest,describe_transit_gateway_route_tables_request +DescribeTransitGatewayRouteTablesResult,describe_transit_gateway_route_tables_result +DescribeTransitGatewayVpcAttachmentsRequest,describe_transit_gateway_vpc_attachments_request +DescribeTransitGatewayVpcAttachmentsResult,describe_transit_gateway_vpc_attachments_result +DescribeTransitGatewaysRequest,describe_transit_gateways_request +DescribeTransitGatewaysResult,describe_transit_gateways_result +DescribeTrialComponentRequest,describe_trial_component_request +DescribeTrialComponentResponse,describe_trial_component_response +DescribeTrialRequest,describe_trial_request +DescribeTrialResponse,describe_trial_response +DescribeTrunkInterfaceAssociationsRequest,describe_trunk_interface_associations_request +DescribeTrunkInterfaceAssociationsResult,describe_trunk_interface_associations_result +DescribeTrustedAdvisorCheckRefreshStatusesRequest,describe_trusted_advisor_check_refresh_statuses_request +DescribeTrustedAdvisorCheckRefreshStatusesResponse,describe_trusted_advisor_check_refresh_statuses_response +DescribeTrustedAdvisorCheckResultRequest,describe_trusted_advisor_check_result_request +DescribeTrustedAdvisorCheckResultResponse,describe_trusted_advisor_check_result_response +DescribeTrustedAdvisorCheckSummariesRequest,describe_trusted_advisor_check_summaries_request +DescribeTrustedAdvisorCheckSummariesResponse,describe_trusted_advisor_check_summaries_response +DescribeTrustedAdvisorChecksRequest,describe_trusted_advisor_checks_request +DescribeTrustedAdvisorChecksResponse,describe_trusted_advisor_checks_response +DescribeTrustsRequest,describe_trusts_request +DescribeTrustsResult,describe_trusts_result +DescribeTunnelRequest,describe_tunnel_request +DescribeTunnelResponse,describe_tunnel_response +DescribeTypeInput,describe_type_input +DescribeTypeOutput,describe_type_output +DescribeTypeRegistrationInput,describe_type_registration_input +DescribeTypeRegistrationOutput,describe_type_registration_output +DescribeUpdateActionsMessage,describe_update_actions_message +DescribeUpdateDirectoryRequest,describe_update_directory_request +DescribeUpdateDirectoryResult,describe_update_directory_result +DescribeUpdateRequest,describe_update_request +DescribeUpdateResponse,describe_update_response +DescribeUploadBufferInput,describe_upload_buffer_input +DescribeUploadBufferOutput,describe_upload_buffer_output +DescribeUsageLimitsMessage,describe_usage_limits_message +DescribeUsageReportSubscriptionsRequest,describe_usage_report_subscriptions_request +DescribeUsageReportSubscriptionsResult,describe_usage_report_subscriptions_result +DescribeUserGroupsMessage,describe_user_groups_message +DescribeUserGroupsResult,describe_user_groups_result +DescribeUserHierarchyGroupRequest,describe_user_hierarchy_group_request +DescribeUserHierarchyGroupResponse,describe_user_hierarchy_group_response +DescribeUserHierarchyStructureRequest,describe_user_hierarchy_structure_request +DescribeUserHierarchyStructureResponse,describe_user_hierarchy_structure_response +DescribeUserImportJobRequest,describe_user_import_job_request +DescribeUserImportJobResponse,describe_user_import_job_response +DescribeUserPoolClientRequest,describe_user_pool_client_request +DescribeUserPoolClientResponse,describe_user_pool_client_response +DescribeUserPoolDomainRequest,describe_user_pool_domain_request +DescribeUserPoolDomainResponse,describe_user_pool_domain_response +DescribeUserPoolRequest,describe_user_pool_request +DescribeUserPoolResponse,describe_user_pool_response +DescribeUserProfileRequest,describe_user_profile_request +DescribeUserProfileResponse,describe_user_profile_response +DescribeUserProfileResult,describe_user_profile_result +DescribeUserProfilesRequest,describe_user_profiles_request +DescribeUserProfilesResult,describe_user_profiles_result +DescribeUserRequest,describe_user_request +DescribeUserResponse,describe_user_response +DescribeUserStackAssociationsRequest,describe_user_stack_associations_request +DescribeUserStackAssociationsResult,describe_user_stack_associations_result +DescribeUsersMessage,describe_users_message +DescribeUsersRequest,describe_users_request +DescribeUsersResponse,describe_users_response +DescribeUsersResult,describe_users_result +DescribeVPCConnectionRequest,describe_vpc_connection_request +DescribeVPCConnectionResponse,describe_vpc_connection_response +DescribeVTLDevicesInput,describe_vtl_devices_input +DescribeVTLDevicesOutput,describe_vtl_devices_output +DescribeValidDBInstanceModificationsMessage,describe_valid_db_instance_modifications_message +DescribeValidDBInstanceModificationsResult,describe_valid_db_instance_modifications_result +DescribeVaultInput,describe_vault_input +DescribeVaultOutput,describe_vault_output +DescribeVcenterClientsRequest,describe_vcenter_clients_request +DescribeVcenterClientsResponse,describe_vcenter_clients_response +DescribeVerifiedAccessEndpointsRequest,describe_verified_access_endpoints_request +DescribeVerifiedAccessEndpointsResult,describe_verified_access_endpoints_result +DescribeVerifiedAccessGroupsRequest,describe_verified_access_groups_request +DescribeVerifiedAccessGroupsResult,describe_verified_access_groups_result +DescribeVerifiedAccessInstanceLoggingConfigurationsRequest,describe_verified_access_instance_logging_configurations_request +DescribeVerifiedAccessInstanceLoggingConfigurationsResult,describe_verified_access_instance_logging_configurations_result +DescribeVerifiedAccessInstancesRequest,describe_verified_access_instances_request +DescribeVerifiedAccessInstancesResult,describe_verified_access_instances_result +DescribeVerifiedAccessTrustProvidersRequest,describe_verified_access_trust_providers_request +DescribeVerifiedAccessTrustProvidersResult,describe_verified_access_trust_providers_result +DescribeViewRequest,describe_view_request +DescribeViewResponse,describe_view_response +DescribeVirtualClusterRequest,describe_virtual_cluster_request +DescribeVirtualClusterResponse,describe_virtual_cluster_response +DescribeVirtualGatewayInput,describe_virtual_gateway_input +DescribeVirtualGatewayOutput,describe_virtual_gateway_output +DescribeVirtualInterfacesRequest,describe_virtual_interfaces_request +DescribeVirtualNodeInput,describe_virtual_node_input +DescribeVirtualNodeOutput,describe_virtual_node_output +DescribeVirtualRouterInput,describe_virtual_router_input +DescribeVirtualRouterOutput,describe_virtual_router_output +DescribeVirtualServiceInput,describe_virtual_service_input +DescribeVirtualServiceOutput,describe_virtual_service_output +DescribeVocabularyRequest,describe_vocabulary_request +DescribeVocabularyResponse,describe_vocabulary_response +DescribeVodSourceRequest,describe_vod_source_request +DescribeVodSourceResponse,describe_vod_source_response +DescribeVoicesInput,describe_voices_input +DescribeVoicesOutput,describe_voices_output +DescribeVolumeAttributeRequest,describe_volume_attribute_request +DescribeVolumeAttributeResult,describe_volume_attribute_result +DescribeVolumeStatusRequest,describe_volume_status_request +DescribeVolumeStatusResult,describe_volume_status_result +DescribeVolumesModificationsRequest,describe_volumes_modifications_request +DescribeVolumesModificationsResult,describe_volumes_modifications_result +DescribeVolumesRequest,describe_volumes_request +DescribeVolumesResponse,describe_volumes_response +DescribeVolumesResult,describe_volumes_result +DescribeVpcAttributeRequest,describe_vpc_attribute_request +DescribeVpcAttributeResult,describe_vpc_attribute_result +DescribeVpcClassicLinkDnsSupportRequest,describe_vpc_classic_link_dns_support_request +DescribeVpcClassicLinkDnsSupportResult,describe_vpc_classic_link_dns_support_result +DescribeVpcClassicLinkRequest,describe_vpc_classic_link_request +DescribeVpcClassicLinkResult,describe_vpc_classic_link_result +DescribeVpcConnectionRequest,describe_vpc_connection_request +DescribeVpcConnectionResponse,describe_vpc_connection_response +DescribeVpcConnectorRequest,describe_vpc_connector_request +DescribeVpcConnectorResponse,describe_vpc_connector_response +DescribeVpcEndpointConnectionNotificationsRequest,describe_vpc_endpoint_connection_notifications_request +DescribeVpcEndpointConnectionNotificationsResult,describe_vpc_endpoint_connection_notifications_result +DescribeVpcEndpointConnectionsRequest,describe_vpc_endpoint_connections_request +DescribeVpcEndpointConnectionsResult,describe_vpc_endpoint_connections_result +DescribeVpcEndpointServiceConfigurationsRequest,describe_vpc_endpoint_service_configurations_request +DescribeVpcEndpointServiceConfigurationsResult,describe_vpc_endpoint_service_configurations_result +DescribeVpcEndpointServicePermissionsRequest,describe_vpc_endpoint_service_permissions_request +DescribeVpcEndpointServicePermissionsResult,describe_vpc_endpoint_service_permissions_result +DescribeVpcEndpointServicesRequest,describe_vpc_endpoint_services_request +DescribeVpcEndpointServicesResult,describe_vpc_endpoint_services_result +DescribeVpcEndpointsRequest,describe_vpc_endpoints_request +DescribeVpcEndpointsResponse,describe_vpc_endpoints_response +DescribeVpcEndpointsResult,describe_vpc_endpoints_result +DescribeVpcIngressConnectionRequest,describe_vpc_ingress_connection_request +DescribeVpcIngressConnectionResponse,describe_vpc_ingress_connection_response +DescribeVpcPeeringAuthorizationsOutput,describe_vpc_peering_authorizations_output +DescribeVpcPeeringConnectionsInput,describe_vpc_peering_connections_input +DescribeVpcPeeringConnectionsOutput,describe_vpc_peering_connections_output +DescribeVpcPeeringConnectionsRequest,describe_vpc_peering_connections_request +DescribeVpcPeeringConnectionsResult,describe_vpc_peering_connections_result +DescribeVpcsRequest,describe_vpcs_request +DescribeVpcsResult,describe_vpcs_result +DescribeVpnConnectionsRequest,describe_vpn_connections_request +DescribeVpnConnectionsResult,describe_vpn_connections_result +DescribeVpnGatewaysRequest,describe_vpn_gateways_request +DescribeVpnGatewaysResult,describe_vpn_gateways_result +DescribeWarmPoolAnswer,describe_warm_pool_answer +DescribeWarmPoolType,describe_warm_pool_type +DescribeWatchlistRequest,describe_watchlist_request +DescribeWatchlistResponse,describe_watchlist_response +DescribeWebsiteCertificateAuthorityRequest,describe_website_certificate_authority_request +DescribeWebsiteCertificateAuthorityResponse,describe_website_certificate_authority_response +DescribeWhatIfAnalysisRequest,describe_what_if_analysis_request +DescribeWhatIfAnalysisResponse,describe_what_if_analysis_response +DescribeWhatIfForecastExportRequest,describe_what_if_forecast_export_request +DescribeWhatIfForecastExportResponse,describe_what_if_forecast_export_response +DescribeWhatIfForecastRequest,describe_what_if_forecast_request +DescribeWhatIfForecastResponse,describe_what_if_forecast_response +DescribeWorkerConfigurationRequest,describe_worker_configuration_request +DescribeWorkerConfigurationResponse,describe_worker_configuration_response +DescribeWorkflowExecutionInput,describe_workflow_execution_input +DescribeWorkflowRequest,describe_workflow_request +DescribeWorkflowResponse,describe_workflow_response +DescribeWorkflowTypeInput,describe_workflow_type_input +DescribeWorkforceRequest,describe_workforce_request +DescribeWorkforceResponse,describe_workforce_response +DescribeWorkingStorageInput,describe_working_storage_input +DescribeWorkingStorageOutput,describe_working_storage_output +DescribeWorkloadRequest,describe_workload_request +DescribeWorkloadResponse,describe_workload_response +DescribeWorkspaceAuthenticationRequest,describe_workspace_authentication_request +DescribeWorkspaceAuthenticationResponse,describe_workspace_authentication_response +DescribeWorkspaceBundlesRequest,describe_workspace_bundles_request +DescribeWorkspaceBundlesResult,describe_workspace_bundles_result +DescribeWorkspaceConfigurationRequest,describe_workspace_configuration_request +DescribeWorkspaceConfigurationResponse,describe_workspace_configuration_response +DescribeWorkspaceDirectoriesRequest,describe_workspace_directories_request +DescribeWorkspaceDirectoriesResult,describe_workspace_directories_result +DescribeWorkspaceImagePermissionsRequest,describe_workspace_image_permissions_request +DescribeWorkspaceImagePermissionsResult,describe_workspace_image_permissions_result +DescribeWorkspaceImagesRequest,describe_workspace_images_request +DescribeWorkspaceImagesResult,describe_workspace_images_result +DescribeWorkspaceRequest,describe_workspace_request +DescribeWorkspaceResponse,describe_workspace_response +DescribeWorkspaceSnapshotsRequest,describe_workspace_snapshots_request +DescribeWorkspaceSnapshotsResult,describe_workspace_snapshots_result +DescribeWorkspacesConnectionStatusRequest,describe_workspaces_connection_status_request +DescribeWorkspacesConnectionStatusResult,describe_workspaces_connection_status_result +DescribeWorkspacesRequest,describe_workspaces_request +DescribeWorkspacesResult,describe_workspaces_result +DescribeWorkteamRequest,describe_workteam_request +DescribeWorkteamResponse,describe_workteam_response +DescribeWorldExportJobRequest,describe_world_export_job_request +DescribeWorldExportJobResponse,describe_world_export_job_response +DescribeWorldGenerationJobRequest,describe_world_generation_job_request +DescribeWorldGenerationJobResponse,describe_world_generation_job_response +DescribeWorldRequest,describe_world_request +DescribeWorldResponse,describe_world_response +DescribeWorldTemplateRequest,describe_world_template_request +DescribeWorldTemplateResponse,describe_world_template_response +DescribedAccess,described_access +DescribedAgreement,described_agreement +DescribedCertificate,described_certificate +DescribedConnector,described_connector +DescribedExecution,described_execution +DescribedHostKey,described_host_key +DescribedProfile,described_profile +DescribedSecurityPolicy,described_security_policy +DescribedServer,described_server +DescribedUser,described_user +DescribedWorkflow,described_workflow +Description,description +DescriptionPageUrl,description_page_url +DescriptionRegex,description_regex +DescriptionTooLongException,description_too_long_exception +DescriptiveMentionIndex,descriptive_mention_index +DescriptiveVideoServiceFlag,descriptive_video_service_flag +Deserializer,deserializer +Desired,desired +DesiredCapacity,desired_capacity +DesiredCapacityType,desired_capacity_type +DesiredConfiguration,desired_configuration +DesiredCount,desired_count +DesiredDataAccessRoleArn,desired_data_access_role_arn +DesiredDeliveryMediums,desired_delivery_mediums +DesiredInferenceUnits,desired_inference_units +DesiredInstanceCount,desired_instance_count +DesiredInstanceType,desired_instance_type +DesiredInstances,desired_instances +DesiredModelArn,desired_model_arn +DesiredModelVariants,desired_model_variants +DesiredNumber,desired_number +DesiredNumberOfDomainControllers,desired_number_of_domain_controllers +DesiredPartitionCount,desired_partition_count +DesiredPlayerSession,desired_player_session +DesiredPlayerSessions,desired_player_sessions +DesiredReplicationCount,desired_replication_count +DesiredServerlessConfig,desired_serverless_config +DesiredShardLevelMetrics,desired_shard_level_metrics +DesiredStartTime,desired_start_time +DesiredState,desired_state +DesiredValue,desired_value +DesiredWeight,desired_weight +DesiredWeightAndCapacity,desired_weight_and_capacity +DesiredWeightsAndCapacities,desired_weights_and_capacities +DeskPhoneNumber,desk_phone_number +Destination,destination +Destination608ChannelNumber,destination608_channel_number +Destination708ServiceNumber,destination708_service_number +DestinationAddress,destination_address +DestinationAddresses,destination_addresses +DestinationArn,destination_arn +DestinationBackup,destination_backup +DestinationBackupVaultArn,destination_backup_vault_arn +DestinationBranchName,destination_branch_name +DestinationBucketName,destination_bucket_name +DestinationCidr,destination_cidr +DestinationCidrBlock,destination_cidr_block +DestinationColumn,destination_column +DestinationCommit,destination_commit +DestinationConfig,destination_config +DestinationConfiguration,destination_configuration +DestinationConfigurationRequest,destination_configuration_request +DestinationConfigurations,destination_configurations +DestinationConnectorProperties,destination_connector_properties +DestinationCountryParameters,destination_country_parameters +DestinationDataSharing,destination_data_sharing +DestinationDataSharingType,destination_data_sharing_type +DestinationDescription,destination_description +DestinationDescriptions,destination_descriptions +DestinationDetails,destination_details +DestinationDomain,destination_domain +DestinationDomainInfo,destination_domain_info +DestinationEncryptionAlgorithm,destination_encryption_algorithm +DestinationEncryptionContext,destination_encryption_context +DestinationEnvironmentId,destination_environment_id +DestinationEnvironmentName,destination_environment_name +DestinationField,destination_field +DestinationFieldProperties,destination_field_properties +DestinationFileLocation,destination_file_location +DestinationFilters,destination_filters +DestinationFlowConfig,destination_flow_config +DestinationId,destination_id +DestinationIdentifier,destination_identifier +DestinationIdentity,destination_identity +DestinationImageDescription,destination_image_description +DestinationImageName,destination_image_name +DestinationInfo,destination_info +DestinationIp,destination_ip +DestinationIpV4,destination_ipv4 +DestinationIpV6,destination_ipv6 +DestinationIpamScopeId,destination_ipam_scope_id +DestinationIpv6CidrBlock,destination_ipv6_cidr_block +DestinationItemsLimit,destination_items_limit +DestinationKeyId,destination_key_id +DestinationLicenseContext,destination_license_context +DestinationList,destination_list +DestinationLocationArn,destination_location_arn +DestinationName,destination_name +DestinationNamePrefix,destination_name_prefix +DestinationNetworkInterfaceArns,destination_network_interface_arns +DestinationNotAllowedException,destination_not_allowed_exception +DestinationOptions,destination_options +DestinationOptionsRequest,destination_options_request +DestinationOptionsResponse,destination_options_response +DestinationOutpostArn,destination_outpost_arn +DestinationParameterName,destination_parameter_name +DestinationParameterValueConfiguration,destination_parameter_value_configuration +DestinationParentId,destination_parent_id +DestinationParentNotFoundException,destination_parent_not_found_exception +DestinationPath,destination_path +DestinationPhoneNumber,destination_phone_number +DestinationPoolName,destination_pool_name +DestinationPort,destination_port +DestinationPortMapping,destination_port_mapping +DestinationPortMappings,destination_port_mappings +DestinationPortRange,destination_port_range +DestinationPortRanges,destination_port_ranges +DestinationPorts,destination_ports +DestinationPosition,destination_position +DestinationPositions,destination_positions +DestinationPrefixListId,destination_prefix_list_id +DestinationPrefixLists,destination_prefix_lists +DestinationProjectArn,destination_project_arn +DestinationProperties,destination_properties +DestinationQueue,destination_queue +DestinationRecoveryPointArn,destination_recovery_point_arn +DestinationRefId,destination_ref_id +DestinationRegion,destination_region +DestinationS3Uri,destination_s3_uri +DestinationSchema,destination_schema +DestinationSchemaUpdate,destination_schema_update +DestinationSettings,destination_settings +DestinationSocketAddress,destination_socket_address +DestinationStatus,destination_status +DestinationStatusDescription,destination_status_description +DestinationStreamArn,destination_stream_arn +DestinationSummary,destination_summary +DestinationToCreate,destination_to_create +DestinationTrafficState,destination_traffic_state +DestinationType,destination_type +DestinationUser,destination_user +DestinationUserIdentifier,destination_user_identifier +DestinationVpc,destination_vpc +Destinations,destinations +DetachCertificateFromDistributionRequest,detach_certificate_from_distribution_request +DetachCertificateFromDistributionResult,detach_certificate_from_distribution_result +DetachClassicLinkVpcRequest,detach_classic_link_vpc_request +DetachClassicLinkVpcResult,detach_classic_link_vpc_result +DetachCustomerManagedPolicyReferenceFromPermissionSetRequest,detach_customer_managed_policy_reference_from_permission_set_request +DetachDiskRequest,detach_disk_request +DetachDiskResult,detach_disk_result +DetachElasticLoadBalancerRequest,detach_elastic_load_balancer_request +DetachFromIndex,detach_from_index +DetachFromIndexRequest,detach_from_index_request +DetachFromIndexResponse,detach_from_index_response +DetachGroupPolicyRequest,detach_group_policy_request +DetachInstancesAnswer,detach_instances_answer +DetachInstancesFromLoadBalancerRequest,detach_instances_from_load_balancer_request +DetachInstancesFromLoadBalancerResult,detach_instances_from_load_balancer_result +DetachInstancesQuery,detach_instances_query +DetachInternetGatewayRequest,detach_internet_gateway_request +DetachLoadBalancerFromSubnetsInput,detach_load_balancer_from_subnets_input +DetachLoadBalancerFromSubnetsOutput,detach_load_balancer_from_subnets_output +DetachLoadBalancerTargetGroupsType,detach_load_balancer_target_groups_type +DetachLoadBalancersType,detach_load_balancers_type +DetachManagedPolicyFromPermissionSetRequest,detach_managed_policy_from_permission_set_request +DetachNetworkInterfaceRequest,detach_network_interface_request +DetachObject,detach_object +DetachObjectRequest,detach_object_request +DetachObjectResponse,detach_object_response +DetachPolicy,detach_policy +DetachPolicyRequest,detach_policy_request +DetachPrincipalPolicyRequest,detach_principal_policy_request +DetachRolePolicyRequest,detach_role_policy_request +DetachSecurityProfileRequest,detach_security_profile_request +DetachStaticIpRequest,detach_static_ip_request +DetachStaticIpResult,detach_static_ip_result +DetachThingPrincipalRequest,detach_thing_principal_request +DetachTrafficSourcesType,detach_traffic_sources_type +DetachTypedLink,detach_typed_link +DetachTypedLinkRequest,detach_typed_link_request +DetachUserPolicyRequest,detach_user_policy_request +DetachVerifiedAccessTrustProviderRequest,detach_verified_access_trust_provider_request +DetachVerifiedAccessTrustProviderResult,detach_verified_access_trust_provider_result +DetachVolumeInput,detach_volume_input +DetachVolumeOutput,detach_volume_output +DetachVolumeRequest,detach_volume_request +DetachVpnGatewayRequest,detach_vpn_gateway_request +DetachedObjectIdentifier,detached_object_identifier +Detail,detail +DetailType,detail_type +DetailedError,detailed_error +DetailedErrorCode,detailed_error_code +DetailedErrorMessage,detailed_error_message +DetailedMetricsEnabled,detailed_metrics_enabled +DetailedResultsLocation,detailed_results_location +DetailedStatus,detailed_status +DetailedStatusCodesMetrics,detailed_status_codes_metrics +Details,details +DetailsMap,details_map +DetectAnomaliesRequest,detect_anomalies_request +DetectAnomaliesResponse,detect_anomalies_response +DetectAnomalyResult,detect_anomaly_result +DetectCustomLabelsRequest,detect_custom_labels_request +DetectCustomLabelsResponse,detect_custom_labels_response +DetectDocumentTextModelVersion,detect_document_text_model_version +DetectDocumentTextRequest,detect_document_text_request +DetectDocumentTextResponse,detect_document_text_response +DetectDominantLanguageRequest,detect_dominant_language_request +DetectDominantLanguageResponse,detect_dominant_language_response +DetectEntitiesRequest,detect_entities_request +DetectEntitiesResponse,detect_entities_response +DetectEntitiesV2Request,detect_entities_v2_request +DetectEntitiesV2Response,detect_entities_v2_response +DetectFacesRequest,detect_faces_request +DetectFacesResponse,detect_faces_response +DetectKeyPhrasesRequest,detect_key_phrases_request +DetectKeyPhrasesResponse,detect_key_phrases_response +DetectLabelsImageBackground,detect_labels_image_background +DetectLabelsImageForeground,detect_labels_image_foreground +DetectLabelsImageProperties,detect_labels_image_properties +DetectLabelsImagePropertiesSettings,detect_labels_image_properties_settings +DetectLabelsImageQuality,detect_labels_image_quality +DetectLabelsRequest,detect_labels_request +DetectLabelsResponse,detect_labels_response +DetectLabelsSettings,detect_labels_settings +DetectMetricSetConfigRequest,detect_metric_set_config_request +DetectMetricSetConfigResponse,detect_metric_set_config_response +DetectMitigationActionExecution,detect_mitigation_action_execution +DetectMitigationActionsTaskStatistics,detect_mitigation_actions_task_statistics +DetectMitigationActionsTaskSummary,detect_mitigation_actions_task_summary +DetectMitigationActionsTaskTarget,detect_mitigation_actions_task_target +DetectModerationLabelsRequest,detect_moderation_labels_request +DetectModerationLabelsResponse,detect_moderation_labels_response +DetectPHIRequest,detect_phi_request +DetectPHIResponse,detect_phi_response +DetectPiiEntitiesRequest,detect_pii_entities_request +DetectPiiEntitiesResponse,detect_pii_entities_response +DetectProtectiveEquipmentRequest,detect_protective_equipment_request +DetectProtectiveEquipmentResponse,detect_protective_equipment_response +DetectSchema,detect_schema +DetectSentimentRequest,detect_sentiment_request +DetectSentimentResponse,detect_sentiment_response +DetectStackDriftInput,detect_stack_drift_input +DetectStackDriftOutput,detect_stack_drift_output +DetectStackResourceDriftInput,detect_stack_resource_drift_input +DetectStackResourceDriftOutput,detect_stack_resource_drift_output +DetectStackSetDriftInput,detect_stack_set_drift_input +DetectStackSetDriftOutput,detect_stack_set_drift_output +DetectSyntaxRequest,detect_syntax_request +DetectSyntaxResponse,detect_syntax_response +DetectTargetedSentimentRequest,detect_targeted_sentiment_request +DetectTargetedSentimentResponse,detect_targeted_sentiment_response +DetectTextFilters,detect_text_filters +DetectTextRequest,detect_text_request +DetectTextResponse,detect_text_response +DetectedCsvFormatDescriptor,detected_csv_format_descriptor +DetectedDataDetails,detected_data_details +DetectedField,detected_field +DetectedFileFormatDescriptor,detected_file_format_descriptor +DetectedJsonFormatDescriptor,detected_json_format_descriptor +DetectedLanguageCode,detected_language_code +DetectedLanguageLowConfidenceException,detected_language_low_confidence_exception +DetectedMetricSetConfig,detected_metric_set_config +DetectedMetricSource,detected_metric_source +DetectedProperties,detected_properties +DetectedS3SourceConfig,detected_s3_source_config +DetectedSignature,detected_signature +DetectedSignatures,detected_signatures +DetectedText,detected_text +DetectedWorkload,detected_workload +Detection,detection +DetectionAttributes,detection_attributes +DetectionFilter,detection_filter +DetectionStatus,detection_status +DetectionStatusReason,detection_status_reason +Detections,detections +Detector,detector +DetectorAdditionalConfiguration,detector_additional_configuration +DetectorAdditionalConfigurationResult,detector_additional_configuration_result +DetectorDebugOption,detector_debug_option +DetectorFeatureConfiguration,detector_feature_configuration +DetectorFeatureConfigurationResult,detector_feature_configuration_result +DetectorId,detector_id +DetectorIds,detector_ids +DetectorModel,detector_model +DetectorModelConfiguration,detector_model_configuration +DetectorModelDefinition,detector_model_definition +DetectorModelSummary,detector_model_summary +DetectorModelVersionSummary,detector_model_version_summary +DetectorState,detector_state +DetectorStateDefinition,detector_state_definition +DetectorStateSummary,detector_state_summary +DetectorSummary,detector_summary +DetectorVersionSummary,detector_version_summary +DeterminingPolicyItem,determining_policy_item +DevAddr,dev_addr +DevEndpoint,dev_endpoint +DevEndpointCustomLibraries,dev_endpoint_custom_libraries +DevEndpointNames,dev_endpoint_names +DevEndpoints,dev_endpoints +DevEndpointsNotFound,dev_endpoints_not_found +DevEnvironmentAccessDetails,dev_environment_access_details +DevEnvironmentRepositorySummary,dev_environment_repository_summary +DevEnvironmentSessionConfiguration,dev_environment_session_configuration +DevEnvironmentSessionSummary,dev_environment_session_summary +DevEnvironmentSummary,dev_environment_summary +DevEui,dev_eui +DevEuiEventTopic,dev_eui_event_topic +DevStatusReqFreq,dev_status_req_freq +DeveloperInfo,developer_info +DeveloperName,developer_name +DeveloperOnlyAttribute,developer_only_attribute +DeveloperProviderName,developer_provider_name +DeveloperUserAlreadyRegisteredException,developer_user_already_registered_exception +DeveloperUserIdentifier,developer_user_identifier +DeveloperUserIdentifierList,developer_user_identifier_list +DevelopmentSchemaArn,development_schema_arn +Device,device +DeviceAggregatedStatus,device_aggregated_status +DeviceAggregatedStatusFilter,device_aggregated_status_filter +DeviceArn,device_arn +DeviceAttributes,device_attributes +DeviceCaCertificate,device_ca_certificate +DeviceCertificates,device_certificates +DeviceConfig,device_config +DeviceConfiguration,device_configuration +DeviceConfigurationType,device_configuration_type +DeviceConnectionStatus,device_connection_status +DeviceCreateDate,device_create_date +DeviceCreationFile,device_creation_file +DeviceCreationFileList,device_creation_file_list +DeviceData,device_data +DeviceDefinitionId,device_definition_id +DeviceDefinitionVersion,device_definition_version +DeviceDefinitionVersionArn,device_definition_version_arn +DeviceDefinitionVersionId,device_definition_version_id +DeviceDeploymentStatus,device_deployment_status +DeviceDeploymentStatusMessage,device_deployment_status_message +DeviceDeploymentSummaries,device_deployment_summaries +DeviceDeploymentSummary,device_deployment_summary +DeviceDescription,device_description +DeviceEvent,device_event +DeviceEvents,device_events +DeviceFilter,device_filter +DeviceFleetArn,device_fleet_arn +DeviceFleetName,device_fleet_name +DeviceFleetNameContains,device_fleet_name_contains +DeviceFleetSummaries,device_fleet_summaries +DeviceFleetSummary,device_fleet_summary +DeviceGroupKey,device_group_key +DeviceId,device_id +DeviceIdentifier,device_identifier +DeviceIds,device_ids +DeviceIndex,device_index +DeviceInstance,device_instance +DeviceJob,device_job +DeviceJobConfig,device_job_config +DeviceJobs,device_jobs +DeviceKey,device_key +DeviceLastAuthenticatedDate,device_last_authenticated_date +DeviceLastModifiedDate,device_last_modified_date +DeviceMethod,device_method +DeviceMethodParameters,device_method_parameters +DeviceMethodResponse,device_method_response +DeviceMethods,device_methods +DeviceMinutes,device_minutes +DeviceModel,device_model +DeviceModels,device_models +DeviceName,device_name +DeviceNameContains,device_name_contains +DeviceNames,device_names +DeviceNetworkProfileInfo,device_network_profile_info +DeviceNotRegisteredException,device_not_registered_exception +DeviceOfflineException,device_offline_exception +DeviceOnlyRememberedOnUserPrompt,device_only_remembered_on_user_prompt +DeviceOperatingSystem,device_operating_system +DeviceOperatingSystems,device_operating_systems +DeviceOptions,device_options +DevicePickupId,device_pickup_id +DevicePickupSnsTopicARN,device_pickup_sns_topic_arn +DevicePool,device_pool +DevicePoolCompatibilityResult,device_pool_compatibility_result +DevicePosition,device_position +DevicePositionUpdate,device_position_update +DevicePositionUpdates,device_position_updates +DevicePositions,device_positions +DeviceProfile,device_profile +DeviceProfileId,device_profile_id +DeviceProfileList,device_profile_list +DeviceProfileType,device_profile_type +DeviceQueueInfo,device_queue_info +DeviceRegistration,device_registration +DeviceRegistrationState,device_registration_state +DeviceRegistrationStateEventConfiguration,device_registration_state_event_configuration +DeviceRegistrationStateResourceTypeEventConfiguration,device_registration_state_resource_type_event_configuration +DeviceRegistryEnrichActivity,device_registry_enrich_activity +DeviceRememberedStatus,device_remembered_status +DeviceReportedStatus,device_reported_status +DeviceReportedTime,device_reported_time +DeviceRestrictions,device_restrictions +DeviceRetiredException,device_retired_exception +DeviceSecretVerifierConfig,device_secret_verifier_config +DeviceSecretVerifierConfigType,device_secret_verifier_config_type +DeviceSelectionConfig,device_selection_config +DeviceSelectionConfiguration,device_selection_configuration +DeviceSelectionResult,device_selection_result +DeviceSerialNumber,device_serial_number +DeviceSettingsSyncState,device_settings_sync_state +DeviceShadowEnrichActivity,device_shadow_enrich_activity +DeviceState,device_state +DeviceStats,device_stats +DeviceStatus,device_status +DeviceStatusDetail,device_status_detail +DeviceStatusDetails,device_status_details +DeviceStatusInfo,device_status_info +DeviceStreamLimitExceededException,device_stream_limit_exceeded_exception +DeviceSubsetType,device_subset_type +DeviceSummaries,device_summaries +DeviceSummary,device_summary +DeviceTemplate,device_template +DeviceToken,device_token +DeviceTrustProviderType,device_trust_provider_type +DeviceType,device_type +DeviceTypeAndroid,device_type_android +DeviceTypeChromeOs,device_type_chrome_os +DeviceTypeId,device_type_id +DeviceTypeIos,device_type_ios +DeviceTypeLinux,device_type_linux +DeviceTypeOsx,device_type_osx +DeviceTypeWeb,device_type_web +DeviceTypeWindows,device_type_windows +DeviceTypeZeroClient,device_type_zero_client +DeviceTypes,device_types +DeviceUnderTest,device_under_test +DeviceUpdateStatus,device_update_status +DeviceUsageType,device_usage_type +DeviceUserAgent,device_user_agent +DeviceUserAgents,device_user_agents +DeviceValidationDomain,device_validation_domain +DeviceiSCSIAttributes,devicei_scsi_attributes +Devices,devices +DhcpConfiguration,dhcp_configuration +DhcpConfigurations,dhcp_configurations +DhcpOptions,dhcp_options +DhcpOptionsId,dhcp_options_id +DhcpOptionsIds,dhcp_options_ids +DiagnosticCode,diagnostic_code +Diagnostics,diagnostics +DialRequest,dial_request +Dialnorm,dialnorm +DialogAction,dialog_action +DialogCodeHookInvocationSetting,dialog_code_hook_invocation_setting +DialogCodeHookSettings,dialog_code_hook_settings +DialogState,dialog_state +DialogueIntelligence,dialogue_intelligence +DictPageSizeLimit,dict_page_size_limit +DictionaryKeyThreshold,dictionary_key_threshold +Diff,diff +Difference,difference +DifferenceStatus,difference_status +DifferenceType,difference_type +Digest,digest +DigestAlgorithmMnemonic,digest_algorithm_mnemonic +DigestAlgorithmType,digest_algorithm_type +DigestTipAddress,digest_tip_address +DigestType,digest_type +DigestValue,digest_value +DigitalSignature,digital_signature +DigitalSignatureMethod,digital_signature_method +Dimension,dimension +DimensionConfigurations,dimension_configurations +DimensionContribution,dimension_contribution +DimensionContributionList,dimension_contribution_list +DimensionDetail,dimension_detail +DimensionField,dimension_field +DimensionFilter,dimension_filter +DimensionFilterList,dimension_filter_list +DimensionForeground,dimension_foreground +DimensionGroup,dimension_group +DimensionGroupDetail,dimension_group_detail +DimensionKey,dimension_key +DimensionKeyDescription,dimension_key_description +DimensionKeyDetail,dimension_key_detail +DimensionKeys,dimension_keys +DimensionList,dimension_list +DimensionMapping,dimension_mapping +DimensionMappings,dimension_mappings +DimensionName,dimension_name +DimensionNameValue,dimension_name_value +DimensionType,dimension_type +DimensionValue,dimension_value +DimensionValueAttributes,dimension_value_attributes +DimensionValueContribution,dimension_value_contribution +DimensionValueContributionList,dimension_value_contribution_list +DimensionValueList,dimension_value_list +DimensionValueSource,dimension_value_source +DimensionValueType,dimension_value_type +DimensionValues,dimension_values +DimensionValuesWithAttributes,dimension_values_with_attributes +DimensionalValueCount,dimensional_value_count +Dimensions,dimensions +DirectConnectClientException,direct_connect_client_exception +DirectConnectGateway,direct_connect_gateway +DirectConnectGatewayAssociation,direct_connect_gateway_association +DirectConnectGatewayAssociationProposal,direct_connect_gateway_association_proposal +DirectConnectGatewayAttachment,direct_connect_gateway_attachment +DirectConnectServerException,direct_connect_server_exception +DirectInternetAccess,direct_internet_access +DirectJDBCSource,direct_jdbc_source +DirectKafkaSource,direct_kafka_source +DirectKinesisSource,direct_kinesis_source +DirectMessageConfiguration,direct_message_configuration +DirectPathNoLog,direct_path_no_log +DirectPathParallelLoad,direct_path_parallel_load +DirectPutContent,direct_put_content +DirectSchemaChangePolicy,direct_schema_change_policy +Direction,direction +Directionality,directionality +Directories,directories +Directory,directory +DirectoryAlreadyExistsException,directory_already_exists_exception +DirectoryAlreadyInRegionException,directory_already_in_region_exception +DirectoryAlreadySharedException,directory_already_shared_exception +DirectoryArn,directory_arn +DirectoryConfig,directory_config +DirectoryConfigs,directory_configs +DirectoryConnectSettings,directory_connect_settings +DirectoryConnectSettingsDescription,directory_connect_settings_description +DirectoryDeletedException,directory_deleted_exception +DirectoryDescription,directory_description +DirectoryDescriptions,directory_descriptions +DirectoryDoesNotExistException,directory_does_not_exist_exception +DirectoryId,directory_id +DirectoryIds,directory_ids +DirectoryInDesiredStateException,directory_in_desired_state_exception +DirectoryInUseException,directory_in_use_exception +DirectoryInformation,directory_information +DirectoryLimitExceededException,directory_limit_exceeded_exception +DirectoryLimits,directory_limits +DirectoryMode,directory_mode +DirectoryName,directory_name +DirectoryNameConflictsWithFileNameException,directory_name_conflicts_with_file_name_exception +DirectoryNames,directory_names +DirectoryNotDisabledException,directory_not_disabled_exception +DirectoryNotEnabledException,directory_not_enabled_exception +DirectoryNotSharedException,directory_not_shared_exception +DirectoryPath,directory_path +DirectoryRegistration,directory_registration +DirectoryRegistrationArn,directory_registration_arn +DirectoryRegistrationSummary,directory_registration_summary +DirectoryRegistrations,directory_registrations +DirectoryServiceAuthentication,directory_service_authentication +DirectoryServiceAuthenticationFailedException,directory_service_authentication_failed_exception +DirectoryServiceAuthenticationRequest,directory_service_authentication_request +DirectoryStructure,directory_structure +DirectoryType,directory_type +DirectoryUnavailableException,directory_unavailable_exception +DirectoryUserId,directory_user_id +DirectoryVpcSettings,directory_vpc_settings +DirectoryVpcSettingsDescription,directory_vpc_settings_description +DisableAWSServiceAccessRequest,disable_aws_service_access_request +DisableActionConfiguration,disable_action_configuration +DisableAddOnRequest,disable_add_on_request +DisableAddOnResult,disable_add_on_result +DisableAddressTransferRequest,disable_address_transfer_request +DisableAddressTransferResult,disable_address_transfer_result +DisableAlarmActionRequest,disable_alarm_action_request +DisableAlarmActionsInput,disable_alarm_actions_input +DisableApiStop,disable_api_stop +DisableApiTermination,disable_api_termination +DisableApplicationLayerAutomaticResponseRequest,disable_application_layer_automatic_response_request +DisableAutomatedBackup,disable_automated_backup +DisableAwsNetworkPerformanceMetricSubscriptionRequest,disable_aws_network_performance_metric_subscription_request +DisableAwsNetworkPerformanceMetricSubscriptionResult,disable_aws_network_performance_metric_subscription_result +DisableClientAuthenticationRequest,disable_client_authentication_request +DisableControlInput,disable_control_input +DisableControlOutput,disable_control_output +DisableDelegatedAdminAccountRequest,disable_delegated_admin_account_request +DisableDelegatedAdminAccountResponse,disable_delegated_admin_account_response +DisableDirectoryRequest,disable_directory_request +DisableDirectoryResponse,disable_directory_response +DisableDomain,disable_domain +DisableDomainAutoRenewRequest,disable_domain_auto_renew_request +DisableDomainTransferLockRequest,disable_domain_transfer_lock_request +DisableDomainTransferLockResponse,disable_domain_transfer_lock_response +DisableDynamicScaling,disable_dynamic_scaling +DisableEbsEncryptionByDefaultRequest,disable_ebs_encryption_by_default_request +DisableEbsEncryptionByDefaultResult,disable_ebs_encryption_by_default_result +DisableEmailNotification,disable_email_notification +DisableEnhancedMonitoringInput,disable_enhanced_monitoring_input +DisableExecuteApiEndpoint,disable_execute_api_endpoint +DisableFastLaunchRequest,disable_fast_launch_request +DisableFastLaunchResult,disable_fast_launch_result +DisableFastSnapshotRestoreErrorItem,disable_fast_snapshot_restore_error_item +DisableFastSnapshotRestoreStateError,disable_fast_snapshot_restore_state_error +DisableFastSnapshotRestoreStateErrorItem,disable_fast_snapshot_restore_state_error_item +DisableFastSnapshotRestoreSuccessItem,disable_fast_snapshot_restore_success_item +DisableFastSnapshotRestoresRequest,disable_fast_snapshot_restores_request +DisableFastSnapshotRestoresResult,disable_fast_snapshot_restores_result +DisableGatewayInput,disable_gateway_input +DisableGatewayOutput,disable_gateway_output +DisableGlueTableCreation,disable_glue_table_creation +DisableHostedZoneDNSSECRequest,disable_hosted_zone_dnssec_request +DisableHostedZoneDNSSECResponse,disable_hosted_zone_dnssec_response +DisableImageBlockPublicAccessRequest,disable_image_block_public_access_request +DisableImageBlockPublicAccessResult,disable_image_block_public_access_result +DisableImageDeprecationRequest,disable_image_deprecation_request +DisableImageDeprecationResult,disable_image_deprecation_result +DisableImportFindingsForProductRequest,disable_import_findings_for_product_request +DisableIndexing,disable_indexing +DisableInsightRulesInput,disable_insight_rules_input +DisableInsightRulesOutput,disable_insight_rules_output +DisableIpamOrganizationAdminAccountRequest,disable_ipam_organization_admin_account_request +DisableIpamOrganizationAdminAccountResult,disable_ipam_organization_admin_account_result +DisableKeyRequest,disable_key_request +DisableKeyRotationRequest,disable_key_rotation_request +DisableLDAPSRequest,disable_ldaps_request +DisableLniAtDeviceIndex,disable_lni_at_device_index +DisableLocalGroups,disable_local_groups +DisableLogTypes,disable_log_types +DisableLoggingMessage,disable_logging_message +DisableMetricsCollectionQuery,disable_metrics_collection_query +DisableNetworking,disable_networking +DisableOrganizationAdminAccountRequest,disable_organization_admin_account_request +DisablePolicyTypeRequest,disable_policy_type_request +DisablePolicyTypeResponse,disable_policy_type_response +DisableProfiler,disable_profiler +DisableRadiusRequest,disable_radius_request +DisableRegionRequest,disable_region_request +DisableRemoteControl,disable_remote_control +DisableRequest,disable_request +DisableResponse,disable_response +DisableRollback,disable_rollback +DisableRuleRequest,disable_rule_request +DisableScaleIn,disable_scale_in +DisableSchemaValidation,disable_schema_validation +DisableSerialConsoleAccessRequest,disable_serial_console_access_request +DisableSerialConsoleAccessResult,disable_serial_console_access_result +DisableSnapshotCopyMessage,disable_snapshot_copy_message +DisableSnapshotCopyResult,disable_snapshot_copy_result +DisableSsl,disable_ssl +DisableSsoRequest,disable_sso_request +DisableStageTransitionInput,disable_stage_transition_input +DisableTemplateValidation,disable_template_validation +DisableTopicRuleRequest,disable_topic_rule_request +DisableTransitGatewayRouteTablePropagationRequest,disable_transit_gateway_route_table_propagation_request +DisableTransitGatewayRouteTablePropagationResult,disable_transit_gateway_route_table_propagation_result +DisableUseAsDirectQuerySource,disable_use_as_direct_query_source +DisableUseAsImportedSource,disable_use_as_imported_source +DisableUserRequest,disable_user_request +DisableUserResponse,disable_user_response +DisableValueTrimming,disable_value_trimming +DisableVgwRoutePropagationRequest,disable_vgw_route_propagation_request +DisableVpcClassicLinkDnsSupportRequest,disable_vpc_classic_link_dns_support_request +DisableVpcClassicLinkDnsSupportResult,disable_vpc_classic_link_dns_support_result +DisableVpcClassicLinkRequest,disable_vpc_classic_link_request +DisableVpcClassicLinkResult,disable_vpc_classic_link_result +Disabled,disabled +DisabledApiException,disabled_api_exception +DisabledDate,disabled_date +DisabledException,disabled_exception +DisabledOperationException,disabled_operation_exception +DisabledReason,disabled_reason +DisabledTime,disabled_time +DisablingTime,disabling_time +DisallowedCidrs,disallowed_cidrs +DisassociateAcceleratorTypes,disassociate_accelerator_types +DisassociateAccountsInput,disassociate_accounts_input +DisassociateAccountsOutput,disassociate_accounts_output +DisassociateAdditionalCodeRepositories,disassociate_additional_code_repositories +DisassociateAddressRequest,disassociate_address_request +DisassociateApiRequest,disassociate_api_request +DisassociateAppBlockBuilderAppBlockRequest,disassociate_app_block_builder_app_block_request +DisassociateApplicationFleetRequest,disassociate_application_fleet_request +DisassociateApplicationFromEntitlementRequest,disassociate_application_from_entitlement_request +DisassociateApplicationsRequest,disassociate_applications_request +DisassociateApprovalRuleTemplateFromRepositoryInput,disassociate_approval_rule_template_from_repository_input +DisassociateApprovedOriginRequest,disassociate_approved_origin_request +DisassociateAssessmentReportEvidenceFolderRequest,disassociate_assessment_report_evidence_folder_request +DisassociateAssetsRequest,disassociate_assets_request +DisassociateAttributeGroupRequest,disassociate_attribute_group_request +DisassociateAttributeGroupResponse,disassociate_attribute_group_response +DisassociateAwsAccountFromPartnerAccountRequest,disassociate_aws_account_from_partner_account_request +DisassociateBotRequest,disassociate_bot_request +DisassociateBrowserSettingsRequest,disassociate_browser_settings_request +DisassociateBudgetFromResourceInput,disassociate_budget_from_resource_input +DisassociateCertificateRequest,disassociate_certificate_request +DisassociateChannelFlowRequest,disassociate_channel_flow_request +DisassociateClientDeviceFromCoreDeviceEntry,disassociate_client_device_from_core_device_entry +DisassociateClientDeviceFromCoreDeviceErrorEntry,disassociate_client_device_from_core_device_error_entry +DisassociateClientVpnTargetNetworkRequest,disassociate_client_vpn_target_network_request +DisassociateClientVpnTargetNetworkResult,disassociate_client_vpn_target_network_result +DisassociateConfigurationItemsFromApplicationRequest,disassociate_configuration_items_from_application_request +DisassociateConnectPeerRequest,disassociate_connect_peer_request +DisassociateConnectPeerResponse,disassociate_connect_peer_response +DisassociateConnectionAliasRequest,disassociate_connection_alias_request +DisassociateConnectionFromLagRequest,disassociate_connection_from_lag_request +DisassociateConnectorRequest,disassociate_connector_request +DisassociateContactFromAddressBookRequest,disassociate_contact_from_address_book_request +DisassociateCreatedArtifactRequest,disassociate_created_artifact_request +DisassociateCustomDomainRequest,disassociate_custom_domain_request +DisassociateCustomDomainResponse,disassociate_custom_domain_response +DisassociateCustomerGatewayRequest,disassociate_customer_gateway_request +DisassociateCustomerGatewayResponse,disassociate_customer_gateway_response +DisassociateDRTLogBucketRequest,disassociate_drt_log_bucket_request +DisassociateDataShareConsumerMessage,disassociate_data_share_consumer_message +DisassociateDefaultCodeRepository,disassociate_default_code_repository +DisassociateDelegateFromResourceRequest,disassociate_delegate_from_resource_request +DisassociateDelegationSignerFromDomainRequest,disassociate_delegation_signer_from_domain_request +DisassociateDelegationSignerFromDomainResponse,disassociate_delegation_signer_from_domain_response +DisassociateDeviceFromPlacementRequest,disassociate_device_from_placement_request +DisassociateDeviceFromRoomRequest,disassociate_device_from_room_request +DisassociateDiscoveredResourceRequest,disassociate_discovered_resource_request +DisassociateDomainRequest,disassociate_domain_request +DisassociateElasticIpRequest,disassociate_elastic_ip_request +DisassociateEnclaveCertificateIamRoleRequest,disassociate_enclave_certificate_iam_role_request +DisassociateEnclaveCertificateIamRoleResult,disassociate_enclave_certificate_iam_role_result +DisassociateEntireAccount,disassociate_entire_account +DisassociateEntitiesFromExperienceRequest,disassociate_entities_from_experience_request +DisassociateEntitiesFromExperienceResponse,disassociate_entities_from_experience_response +DisassociateEnvironmentOperationsRoleMessage,disassociate_environment_operations_role_message +DisassociateExternalConnectionRequest,disassociate_external_connection_request +DisassociateExternalConnectionResult,disassociate_external_connection_result +DisassociateFacesRequest,disassociate_faces_request +DisassociateFacesResponse,disassociate_faces_response +DisassociateFileSystemAliasesRequest,disassociate_file_system_aliases_request +DisassociateFileSystemAliasesResponse,disassociate_file_system_aliases_response +DisassociateFileSystemInput,disassociate_file_system_input +DisassociateFileSystemOutput,disassociate_file_system_output +DisassociateFirewallRuleGroupRequest,disassociate_firewall_rule_group_request +DisassociateFirewallRuleGroupResponse,disassociate_firewall_rule_group_response +DisassociateFleetRequest,disassociate_fleet_request +DisassociateFraudsterRequest,disassociate_fraudster_request +DisassociateFraudsterResponse,disassociate_fraudster_response +DisassociateFromAdministratorAccountRequest,disassociate_from_administrator_account_request +DisassociateFromMasterAccountRequest,disassociate_from_master_account_request +DisassociateGatewayFromServerInput,disassociate_gateway_from_server_input +DisassociateGatewayFromServerOutput,disassociate_gateway_from_server_output +DisassociateGlobalReplicationGroupMessage,disassociate_global_replication_group_message +DisassociateGlobalReplicationGroupResult,disassociate_global_replication_group_result +DisassociateHealthCheckRequest,disassociate_health_check_request +DisassociateIamInstanceProfileRequest,disassociate_iam_instance_profile_request +DisassociateIamInstanceProfileResult,disassociate_iam_instance_profile_result +DisassociateIdentityProviderConfigRequest,disassociate_identity_provider_config_request +DisassociateIdentityProviderConfigResponse,disassociate_identity_provider_config_response +DisassociateInstanceEventWindowRequest,disassociate_instance_event_window_request +DisassociateInstanceEventWindowResult,disassociate_instance_event_window_result +DisassociateInstanceStorageConfigRequest,disassociate_instance_storage_config_request +DisassociateIpAccessSettingsRequest,disassociate_ip_access_settings_request +DisassociateIpGroupsRequest,disassociate_ip_groups_request +DisassociateIpamResourceDiscoveryRequest,disassociate_ipam_resource_discovery_request +DisassociateIpamResourceDiscoveryResult,disassociate_ipam_resource_discovery_result +DisassociateKmsKeyRequest,disassociate_kms_key_request +DisassociateLambdaFunctionRequest,disassociate_lambda_function_request +DisassociateLensesInput,disassociate_lenses_input +DisassociateLexBotRequest,disassociate_lex_bot_request +DisassociateLicenseRequest,disassociate_license_request +DisassociateLicenseResponse,disassociate_license_response +DisassociateLifecycleConfig,disassociate_lifecycle_config +DisassociateLinkRequest,disassociate_link_request +DisassociateLinkResponse,disassociate_link_response +DisassociateMacSecKeyRequest,disassociate_mac_sec_key_request +DisassociateMacSecKeyResponse,disassociate_mac_sec_key_response +DisassociateMemberAccountRequest,disassociate_member_account_request +DisassociateMemberFromGroupRequest,disassociate_member_from_group_request +DisassociateMemberRequest,disassociate_member_request +DisassociateMemberResponse,disassociate_member_response +DisassociateMembersRequest,disassociate_members_request +DisassociateMembersResponse,disassociate_members_response +DisassociateMembershipRequest,disassociate_membership_request +DisassociateMergedGraphqlApiRequest,disassociate_merged_graphql_api_request +DisassociateMergedGraphqlApiResponse,disassociate_merged_graphql_api_response +DisassociateMulticastGroupFromFuotaTaskRequest,disassociate_multicast_group_from_fuota_task_request +DisassociateNatGatewayAddressRequest,disassociate_nat_gateway_address_request +DisassociateNatGatewayAddressResult,disassociate_nat_gateway_address_result +DisassociateNetworkSettingsRequest,disassociate_network_settings_request +DisassociateNodeRequest,disassociate_node_request +DisassociateNodeResponse,disassociate_node_response +DisassociateOpsItemRelatedItemRequest,disassociate_ops_item_related_item_request +DisassociateOriginationIdentityRequest,disassociate_origination_identity_request +DisassociateOriginationIdentityResult,disassociate_origination_identity_result +DisassociatePersonasFromEntitiesRequest,disassociate_personas_from_entities_request +DisassociatePersonasFromEntitiesResponse,disassociate_personas_from_entities_response +DisassociatePhoneNumberContactFlowRequest,disassociate_phone_number_contact_flow_request +DisassociatePhoneNumberFromUserRequest,disassociate_phone_number_from_user_request +DisassociatePhoneNumbersFromVoiceConnectorGroupRequest,disassociate_phone_numbers_from_voice_connector_group_request +DisassociatePhoneNumbersFromVoiceConnectorGroupResponse,disassociate_phone_numbers_from_voice_connector_group_response +DisassociatePhoneNumbersFromVoiceConnectorRequest,disassociate_phone_numbers_from_voice_connector_request +DisassociatePhoneNumbersFromVoiceConnectorResponse,disassociate_phone_numbers_from_voice_connector_response +DisassociatePricingRulesInput,disassociate_pricing_rules_input +DisassociatePricingRulesOutput,disassociate_pricing_rules_output +DisassociatePrincipalFromPortfolioInput,disassociate_principal_from_portfolio_input +DisassociateProductFromPortfolioInput,disassociate_product_from_portfolio_input +DisassociateProfilesInput,disassociate_profiles_input +DisassociateQualificationFromWorkerRequest,disassociate_qualification_from_worker_request +DisassociateQueueQuickConnectsRequest,disassociate_queue_quick_connects_request +DisassociateRecoveryPointFromParentInput,disassociate_recovery_point_from_parent_input +DisassociateRecoveryPointInput,disassociate_recovery_point_input +DisassociateRepositoryRequest,disassociate_repository_request +DisassociateRepositoryResponse,disassociate_repository_response +DisassociateResolverEndpointIpAddressRequest,disassociate_resolver_endpoint_ip_address_request +DisassociateResolverEndpointIpAddressResponse,disassociate_resolver_endpoint_ip_address_response +DisassociateResolverQueryLogConfigRequest,disassociate_resolver_query_log_config_request +DisassociateResolverQueryLogConfigResponse,disassociate_resolver_query_log_config_response +DisassociateResolverRuleRequest,disassociate_resolver_rule_request +DisassociateResolverRuleResponse,disassociate_resolver_rule_response +DisassociateResourceRequest,disassociate_resource_request +DisassociateResourceResponse,disassociate_resource_response +DisassociateResourceResponseElement,disassociate_resource_response_element +DisassociateResourceSharePermissionRequest,disassociate_resource_share_permission_request +DisassociateResourceSharePermissionResponse,disassociate_resource_share_permission_response +DisassociateResourceShareRequest,disassociate_resource_share_request +DisassociateResourceShareResponse,disassociate_resource_share_response +DisassociateRoleFromGroupRequest,disassociate_role_from_group_request +DisassociateRoleFromGroupResponse,disassociate_role_from_group_response +DisassociateRouteTableRequest,disassociate_route_table_request +DisassociateRoutingProfileQueuesRequest,disassociate_routing_profile_queues_request +DisassociateS3ResourcesRequest,disassociate_s3_resources_request +DisassociateS3ResourcesResult,disassociate_s3_resources_result +DisassociateSchedule,disassociate_schedule +DisassociateSecurityKeyRequest,disassociate_security_key_request +DisassociateServiceActionFromProvisioningArtifactInput,disassociate_service_action_from_provisioning_artifact_input +DisassociateServiceRoleFromAccountResponse,disassociate_service_role_from_account_response +DisassociateSigninDelegateGroupsFromAccountRequest,disassociate_signin_delegate_groups_from_account_request +DisassociateSkillFromSkillGroupRequest,disassociate_skill_from_skill_group_request +DisassociateSkillFromUsersRequest,disassociate_skill_from_users_request +DisassociateSkillGroupFromRoomRequest,disassociate_skill_group_from_room_request +DisassociateSourceGraphqlApiRequest,disassociate_source_graphql_api_request +DisassociateSourceGraphqlApiResponse,disassociate_source_graphql_api_response +DisassociateSourceServersRequest,disassociate_source_servers_request +DisassociateSubnetCidrBlockRequest,disassociate_subnet_cidr_block_request +DisassociateSubnetCidrBlockResult,disassociate_subnet_cidr_block_result +DisassociateSubnetsRequest,disassociate_subnets_request +DisassociateSubnetsResponse,disassociate_subnets_response +DisassociateTagOptionFromResourceInput,disassociate_tag_option_from_resource_input +DisassociateTeamMemberRequest,disassociate_team_member_request +DisassociateThirdPartyFirewallRequest,disassociate_third_party_firewall_request +DisassociateThirdPartyFirewallResponse,disassociate_third_party_firewall_response +DisassociateTimeSeriesFromAssetPropertyRequest,disassociate_time_series_from_asset_property_request +DisassociateTrackerConsumerRequest,disassociate_tracker_consumer_request +DisassociateTrafficDistributionGroupUserRequest,disassociate_traffic_distribution_group_user_request +DisassociateTransitGatewayConnectPeerRequest,disassociate_transit_gateway_connect_peer_request +DisassociateTransitGatewayConnectPeerResponse,disassociate_transit_gateway_connect_peer_response +DisassociateTransitGatewayMulticastDomainRequest,disassociate_transit_gateway_multicast_domain_request +DisassociateTransitGatewayMulticastDomainResult,disassociate_transit_gateway_multicast_domain_result +DisassociateTransitGatewayPolicyTableRequest,disassociate_transit_gateway_policy_table_request +DisassociateTransitGatewayPolicyTableResult,disassociate_transit_gateway_policy_table_result +DisassociateTransitGatewayRouteTableRequest,disassociate_transit_gateway_route_table_request +DisassociateTransitGatewayRouteTableResult,disassociate_transit_gateway_route_table_result +DisassociateTrialComponentRequest,disassociate_trial_component_request +DisassociateTrialComponentResponse,disassociate_trial_component_response +DisassociateTrunkInterfaceRequest,disassociate_trunk_interface_request +DisassociateTrunkInterfaceResult,disassociate_trunk_interface_result +DisassociateTrustStoreRequest,disassociate_trust_store_request +DisassociateUserAccessLoggingSettingsRequest,disassociate_user_access_logging_settings_request +DisassociateUserFromPermissionGroupRequest,disassociate_user_from_permission_group_request +DisassociateUserFromPermissionGroupResponse,disassociate_user_from_permission_group_response +DisassociateUserRequest,disassociate_user_request +DisassociateUserResponse,disassociate_user_response +DisassociateUserSettingsRequest,disassociate_user_settings_request +DisassociateVPCFromHostedZoneRequest,disassociate_vpc_from_hosted_zone_request +DisassociateVPCFromHostedZoneResponse,disassociate_vpc_from_hosted_zone_response +DisassociateVehicleFleetRequest,disassociate_vehicle_fleet_request +DisassociateVpcCidrBlockRequest,disassociate_vpc_cidr_block_request +DisassociateVpcCidrBlockResult,disassociate_vpc_cidr_block_result +DisassociateWebACLRequest,disassociate_web_acl_request +DisassociateWebsiteAuthorizationProviderRequest,disassociate_website_authorization_provider_request +DisassociateWebsiteCertificateAuthorityRequest,disassociate_website_certificate_authority_request +DisassociateWhenNotFound,disassociate_when_not_found +DisassociateWirelessDeviceFromFuotaTaskRequest,disassociate_wireless_device_from_fuota_task_request +DisassociateWirelessDeviceFromMulticastGroupRequest,disassociate_wireless_device_from_multicast_group_request +DisassociateWirelessDeviceFromThingRequest,disassociate_wireless_device_from_thing_request +DisassociateWirelessGatewayFromCertificateRequest,disassociate_wireless_gateway_from_certificate_request +DisassociateWirelessGatewayFromThingRequest,disassociate_wireless_gateway_from_thing_request +DisassociatedAt,disassociated_at +DisassociatedFace,disassociated_face +DisassociatedFaces,disassociated_faces +DisassociationDate,disassociation_date +DiscardedFiles,discarded_files +DisconnectCustomKeyStoreRequest,disconnect_custom_key_store_request +DisconnectFailures,disconnect_failures +DisconnectFromServiceRequest,disconnect_from_service_request +DisconnectParticipantRequest,disconnect_participant_request +DisconnectPlayerRequest,disconnect_player_request +DisconnectPlayerResult,disconnect_player_result +DisconnectRecoveryInstanceRequest,disconnect_recovery_instance_request +DisconnectSourceServerRequest,disconnect_source_server_request +DisconnectSuccesses,disconnect_successes +DisconnectTimeoutInSeconds,disconnect_timeout_in_seconds +DisconnectTimestamp,disconnect_timestamp +DisconnectUserRequest,disconnect_user_request +DisconnectionEvent,disconnection_event +DiscontinuityMode,discontinuity_mode +DiscontinuityTags,discontinuity_tags +DiscoverDynamicCardVerificationCode,discover_dynamic_card_verification_code +DiscoverInputSchemaRequest,discover_input_schema_request +DiscoverInputSchemaResponse,discover_input_schema_response +DiscoverInstancesRequest,discover_instances_request +DiscoverInstancesResponse,discover_instances_response +DiscoverInstancesRevisionRequest,discover_instances_revision_request +DiscoverInstancesRevisionResponse,discover_instances_revision_response +DiscoverPollEndpointRequest,discover_poll_endpoint_request +DiscoverPollEndpointResponse,discover_poll_endpoint_response +DiscoveredResource,discovered_resource +DiscoveredResourceList,discovered_resource_list +DiscovererArn,discoverer_arn +DiscovererId,discoverer_id +DiscovererIdPrefix,discoverer_id_prefix +DiscovererSummary,discoverer_summary +Discoverers,discoverers +DiscoveryConfig,discovery_config +DiscoveryData,discovery_data +DiscoveryIntegrationStatus,discovery_integration_status +DiscoveryJobArn,discovery_job_arn +DiscoveryJobListEntry,discovery_job_list_entry +DiscoveryJobs,discovery_jobs +DiscoveryRegion,discovery_region +DiscoveryServerConfiguration,discovery_server_configuration +DiscoveryStatus,discovery_status +DiscoveryType,discovery_type +Disk,disk +DiskAllocationResource,disk_allocation_resource +DiskAllocationType,disk_allocation_type +DiskAttributeList,disk_attribute_list +DiskContainer,disk_container +DiskContainers,disk_containers +DiskId,disk_id +DiskIds,disk_ids +DiskImage,disk_image +DiskImageDescription,disk_image_description +DiskImageDetail,disk_image_detail +DiskImageFormat,disk_image_format +DiskImageSize,disk_image_size +DiskImageVolumeDescription,disk_image_volume_description +DiskImages,disk_images +DiskInfo,disk_info +DiskIopsConfiguration,disk_iops_configuration +DiskMap,disk_map +DiskNode,disk_node +DiskPath,disk_path +DiskReadBytesPerSecond,disk_read_bytes_per_second +DiskReadOpsPerSecond,disk_read_ops_per_second +DiskResourceUtilization,disk_resource_utilization +DiskSizeInBytes,disk_size_in_bytes +DiskSnapshot,disk_snapshot +DiskSnapshotInfo,disk_snapshot_info +DiskStatus,disk_status +DiskWriteBytesPerSecond,disk_write_bytes_per_second +DiskWriteOpsPerSecond,disk_write_ops_per_second +Disks,disks +DismissUserContactRequest,dismiss_user_contact_request +DisplayAs,display_as +DisplayAspectRatio,display_aspect_ratio +DisplayConfiguration,display_configuration +DisplayData,display_data +DisplayFormat,display_format +DisplayFormatOptions,display_format_options +DisplayFragmentNumber,display_fragment_number +DisplayFragmentTimestamp,display_fragment_timestamp +DisplayLabel,display_label +DisplayLanguageCode,display_language_code +DisplayMode,display_mode +DisplayName,display_name +DisplayNamePrefix,display_name_prefix +DisplayOptions,display_options +DisplayOrder,display_order +DisplayText,display_text +Displayable,displayable +DisposePackageVersionsRequest,dispose_package_versions_request +DisposePackageVersionsResult,dispose_package_versions_result +DisruptionCompliance,disruption_compliance +DissociateEntityFromThingRequest,dissociate_entity_from_thing_request +DissociatePackageRequest,dissociate_package_request +DissociatePackageResponse,dissociate_package_response +Distance,distance +DistanceUnit,distance_unit +DistinguishedNameQualifier,distinguished_name_qualifier +DistributeDataset,distribute_dataset +DistributeDatasetEntriesRequest,distribute_dataset_entries_request +Distribution,distribution +DistributionAlreadyExists,distribution_already_exists +DistributionBundle,distribution_bundle +DistributionConfig,distribution_config +DistributionConfigWithTags,distribution_config_with_tags +DistributionConfiguration,distribution_configuration +DistributionConfigurationSummary,distribution_configuration_summary +DistributionId,distribution_id +DistributionIdList,distribution_id_list +DistributionList,distribution_list +DistributionNotDisabled,distribution_not_disabled +DistributionSummary,distribution_summary +Distributions,distributions +Distributor,distributor +DistributorId,distributor_id +DistrictOrCounty,district_or_county +DkimAttributes,dkim_attributes +DkimEnabled,dkim_enabled +DkimPercentage,dkim_percentage +DkimSigningAttributes,dkim_signing_attributes +DkimStatus,dkim_status +DkimTokens,dkim_tokens +DkimVerificationStatus,dkim_verification_status +DlBucketSize,dl_bucket_size +DlClass,dl_class +DlDr,dl_dr +DlFreq,dl_freq +DlRate,dl_rate +DlRatePolicy,dl_rate_policy +DlqEventQueueArn,dlq_event_queue_arn +DmsTransferSettings,dms_transfer_settings +Dns,dns +DnsAddresses,dns_addresses +DnsConfig,dns_config +DnsConfigChange,dns_config_change +DnsDuplicateRuleGroupViolation,dns_duplicate_rule_group_violation +DnsEntries,dns_entries +DnsEntry,dns_entry +DnsIpAddr,dns_ip_addr +DnsIpAddresses,dns_ip_addresses +DnsIpAddrs,dns_ip_addrs +DnsIps,dns_ips +DnsLogs,dns_logs +DnsName,dns_name +DnsNameServers,dns_name_servers +DnsOptions,dns_options +DnsOptionsSpecification,dns_options_specification +DnsProperties,dns_properties +DnsRecord,dns_record +DnsRecordCreationState,dns_record_creation_state +DnsRecordIpType,dns_record_ip_type +DnsRecords,dns_records +DnsRequestAction,dns_request_action +DnsResolvers,dns_resolvers +DnsRuleGroupLimitExceededViolation,dns_rule_group_limit_exceeded_violation +DnsRuleGroupPriorityConflictViolation,dns_rule_group_priority_conflict_violation +DnsSearchDomains,dns_search_domains +DnsSec,dns_sec +DnsServers,dns_servers +DnsServersOptionsModifyStructure,dns_servers_options_modify_structure +DnsServiceDiscovery,dns_service_discovery +DnsSupport,dns_support +DnsTargetResource,dns_target_resource +DnssecKey,dnssec_key +DnssecKeys,dnssec_keys +DnssecLimitExceeded,dnssec_limit_exceeded +DnssecSigningAttributes,dnssec_signing_attributes +DocDbDataProviderSettings,doc_db_data_provider_settings +DocDbSettings,doc_db_settings +DocService,doc_service +DockerLabels,docker_labels +DockerSecurityOptions,docker_security_options +DockerVolumeConfiguration,docker_volume_configuration +DocsToInvestigate,docs_to_investigate +Document,document +DocumentAlreadyExists,document_already_exists +DocumentAttribute,document_attribute +DocumentAttributeCondition,document_attribute_condition +DocumentAttributeKey,document_attribute_key +DocumentAttributeTarget,document_attribute_target +DocumentAttributeValue,document_attribute_value +DocumentAttributeValueCountPair,document_attribute_value_count_pair +DocumentAttributeValueCountPairs,document_attribute_value_count_pairs +DocumentAttributeValueType,document_attribute_value_type +DocumentAttributes,document_attributes +DocumentClass,document_class +DocumentClassificationConfig,document_classification_config +DocumentClassificationJobFilter,document_classification_job_filter +DocumentClassificationJobProperties,document_classification_job_properties +DocumentClassificationJobPropertiesList,document_classification_job_properties_list +DocumentClassifierArn,document_classifier_arn +DocumentClassifierDocuments,document_classifier_documents +DocumentClassifierFilter,document_classifier_filter +DocumentClassifierInputDataConfig,document_classifier_input_data_config +DocumentClassifierName,document_classifier_name +DocumentClassifierOutputDataConfig,document_classifier_output_data_config +DocumentClassifierProperties,document_classifier_properties +DocumentClassifierPropertiesList,document_classifier_properties_list +DocumentClassifierSummariesList,document_classifier_summaries_list +DocumentClassifierSummary,document_classifier_summary +DocumentContentDeletion,document_content_deletion +DocumentDBEventSourceConfig,document_db_event_source_config +DocumentDataColumnName,document_data_column_name +DocumentDataFieldName,document_data_field_name +DocumentDefaultVersionDescription,document_default_version_description +DocumentDescription,document_description +DocumentExcerpt,document_excerpt +DocumentFilter,document_filter +DocumentFilterList,document_filter_list +DocumentFormat,document_format +DocumentGroup,document_group +DocumentGroups,document_groups +DocumentHash,document_hash +DocumentHashType,document_hash_type +DocumentId,document_id +DocumentIdColumnName,document_id_column_name +DocumentIdList,document_id_list +DocumentIdOptions,document_id_options +DocumentIdentifier,document_identifier +DocumentIdentifiers,document_identifiers +DocumentIndex,document_index +DocumentInfo,document_info +DocumentInfoList,document_info_list +DocumentKeyValuesFilter,document_key_values_filter +DocumentLabel,document_label +DocumentLibraryFieldMappings,document_library_field_mappings +DocumentLimitExceeded,document_limit_exceeded +DocumentLocation,document_location +DocumentLockedForCommentsException,document_locked_for_comments_exception +DocumentMetadata,document_metadata +DocumentMetadataConfiguration,document_metadata_configuration +DocumentMetadataConfigurationUpdates,document_metadata_configuration_updates +DocumentMetadataConfigurations,document_metadata_configurations +DocumentMetadataResponseInfo,document_metadata_response_info +DocumentName,document_name +DocumentPages,document_pages +DocumentParameter,document_parameter +DocumentPermissionLimit,document_permission_limit +DocumentReadAction,document_read_action +DocumentReadMode,document_read_mode +DocumentReaderConfig,document_reader_config +DocumentRelevanceConfiguration,document_relevance_configuration +DocumentRelevanceOverrideConfigurations,document_relevance_override_configurations +DocumentRequires,document_requires +DocumentReviewCommentSource,document_review_comment_source +DocumentReviewerResponseSource,document_reviewer_response_source +DocumentReviews,document_reviews +DocumentSchemaVersion,document_schema_version +DocumentServiceException,document_service_exception +DocumentServiceWarning,document_service_warning +DocumentSizeInBytes,document_size_in_bytes +DocumentStatus,document_status +DocumentStatusList,document_status_list +DocumentSuggesterOptions,document_suggester_options +DocumentText,document_text +DocumentTitle,document_title +DocumentTitleColumnName,document_title_column_name +DocumentTitleFieldName,document_title_field_name +DocumentTooLargeException,document_too_large_exception +DocumentType,document_type +DocumentTypeListItem,document_type_list_item +DocumentURI,document_uri +DocumentVersion,document_version +DocumentVersionInfo,document_version_info +DocumentVersionLimitExceeded,document_version_limit_exceeded +DocumentVersionMetadata,document_version_metadata +DocumentVersions,document_versions +DocumentationPart,documentation_part +DocumentationPartIds,documentation_part_ids +DocumentationPartLocation,documentation_part_location +DocumentationParts,documentation_parts +DocumentationUrl,documentation_url +DocumentationVersion,documentation_version +DocumentationVersions,documentation_versions +Documents,documents +DocumentsAdded,documents_added +DocumentsDeleted,documents_deleted +DocumentsFailed,documents_failed +DocumentsMetadataConfiguration,documents_metadata_configuration +DocumentsModified,documents_modified +DocumentsScanned,documents_scanned +DocumentsWithErrorsCount,documents_with_errors_count +DoesNotExistException,does_not_exist_exception +DolbyEDecode,dolby_e_decode +DolbyVision,dolby_vision +DolbyVision81Settings,dolby_vision81_settings +DolbyVisionLevel6Metadata,dolby_vision_level6_metadata +DolbyVisionMetadataXml,dolby_vision_metadata_xml +Dollars,dollars +Domain,domain +DomainARN,domain_arn +DomainAlreadyExistsFault,domain_already_exists_fault +DomainArn,domain_arn +DomainAssociation,domain_association +DomainAuthSecretArn,domain_auth_secret_arn +DomainCertificateArn,domain_certificate_arn +DomainConfig,domain_config +DomainConfiguration,domain_configuration +DomainConfigurationSummary,domain_configuration_summary +DomainController,domain_controller +DomainControllerId,domain_controller_id +DomainControllerIds,domain_controller_ids +DomainControllerLimitExceededException,domain_controller_limit_exceeded_exception +DomainControllers,domain_controllers +DomainCount,domain_count +DomainDeliverabilityCampaign,domain_deliverability_campaign +DomainDeliverabilityCampaigns,domain_deliverability_campaigns +DomainDeliverabilityTrackingOption,domain_deliverability_tracking_option +DomainDeprecatedFault,domain_deprecated_fault +DomainDescription,domain_description +DomainDescriptionType,domain_description_type +DomainDetail,domain_detail +DomainDetails,domain_details +DomainDnsIps,domain_dns_ips +DomainEndpoint,domain_endpoint +DomainEndpointOptions,domain_endpoint_options +DomainEndpointOptionsStatus,domain_endpoint_options_status +DomainEndpoints,domain_endpoints +DomainEntry,domain_entry +DomainEntryPoint,domain_entry_point +DomainExecutionRoleArn,domain_execution_role_arn +DomainFileUrl,domain_file_url +DomainFqdn,domain_fqdn +DomainIAMRoleName,domain_iam_role_name +DomainId,domain_id +DomainIdEquals,domain_id_equals +DomainInfo,domain_info +DomainInformation,domain_information +DomainInformationContainer,domain_information_container +DomainInfos,domain_infos +DomainIspPlacement,domain_isp_placement +DomainIspPlacements,domain_isp_placements +DomainJoinInfo,domain_join_info +DomainLimitExceeded,domain_limit_exceeded +DomainMembership,domain_membership +DomainMemberships,domain_memberships +DomainName,domain_name +DomainNameConfig,domain_name_config +DomainNameConfiguration,domain_name_configuration +DomainNameConfigurations,domain_name_configurations +DomainNameStatus,domain_name_status +DomainNameStatusMessage,domain_name_status_message +DomainNames,domain_names +DomainNodesStatus,domain_nodes_status +DomainNodesStatusList,domain_nodes_status_list +DomainNotFoundFault,domain_not_found_fault +DomainNotWhitelistedException,domain_not_whitelisted_exception +DomainOu,domain_ou +DomainPackageDetails,domain_package_details +DomainPackageDetailsList,domain_package_details_list +DomainPackageStatus,domain_package_status +DomainPrefix,domain_prefix +DomainPrice,domain_price +DomainSettings,domain_settings +DomainSettingsForUpdate,domain_settings_for_update +DomainSigningPrivateKey,domain_signing_private_key +DomainSigningSelector,domain_signing_selector +DomainState,domain_state +DomainStats,domain_stats +DomainStatus,domain_status +DomainStatusList,domain_status_list +DomainSuggestion,domain_suggestion +DomainSummaries,domain_summaries +DomainSummary,domain_summary +DomainTransferability,domain_transferability +DomainValidation,domain_validation +DomainValidationOption,domain_validation_option +DomainValidationOptions,domain_validation_options +DomainValidationRecord,domain_validation_record +Domains,domains +DominantColor,dominant_color +DominantColors,dominant_colors +DominantLanguage,dominant_language +DominantLanguageDetectionJobFilter,dominant_language_detection_job_filter +DominantLanguageDetectionJobProperties,dominant_language_detection_job_properties +DominantLanguageDetectionJobPropertiesList,dominant_language_detection_job_properties_list +DonutCenterOptions,donut_center_options +DonutOptions,donut_options +DoubleArrayOptions,double_array_options +DoubleColumnStatisticsData,double_column_statistics_data +DoubleOptions,double_options +DoubleRange,double_range +DoubleValue,double_value +DownScaling,down_scaling +DownlinkFrequency,downlink_frequency +DownlinkMode,downlink_mode +DownlinkQueueMessage,downlink_queue_message +DownlinkQueueMessagesList,downlink_queue_messages_list +DownloadDBLogFilePortionDetails,download_db_log_file_portion_details +DownloadDBLogFilePortionMessage,download_db_log_file_portion_message +DownloadDefaultKeyPairResult,download_default_key_pair_result +DownloadSpeed,download_speed +DownloadUri,download_uri +DownloadUrl,download_url +DownmixControl,downmix_control +DpdTimeoutAction,dpd_timeout_action +DpdTimeoutSeconds,dpd_timeout_seconds +DpuExecutionInMillis,dpu_execution_in_millis +DrMax,dr_max +DrMin,dr_min +DraftUploadOutOfSyncException,draft_upload_out_of_sync_exception +DrcLine,drc_line +DrcProfile,drc_profile +DrcRf,drc_rf +DriftCheckBaselines,drift_check_baselines +DriftCheckBias,drift_check_bias +DriftCheckExplainability,drift_check_explainability +DriftCheckModelDataQuality,drift_check_model_data_quality +DriftCheckModelQuality,drift_check_model_quality +DriftDetectionStatus,drift_detection_status +DriftInformation,drift_information +DriftStatus,drift_status +DriftedStackInstancesCount,drifted_stack_instances_count +DriftedStackResourceCount,drifted_stack_resource_count +DrillDownFilter,drill_down_filter +DrillDownFilters,drill_down_filters +DriveCacheType,drive_cache_type +Driver,driver +DriverOpts,driver_opts +DrmSystems,drm_systems +Drop,drop +DropDownControlDisplayOptions,drop_down_control_display_options +DropDuplicates,drop_duplicates +DropFields,drop_fields +DropFrameTimecode,drop_frame_timecode +DropNullFields,drop_null_fields +Dropdown,dropdown +Dropped,dropped +DryRun,dry_run +DryRunConfig,dry_run_config +DryRunId,dry_run_id +DryRunMode,dry_run_mode +DryRunOperation,dry_run_operation +DryRunOperationException,dry_run_operation_exception +DryRunProgressStatus,dry_run_progress_status +DryRunResults,dry_run_results +DryRunStatus,dry_run_status +DualStackDnsName,dual_stack_dns_name +DukptAttributes,dukpt_attributes +DukptDerivationAttributes,dukpt_derivation_attributes +DukptDerivationType,dukpt_derivation_type +DukptEncryptionAttributes,dukpt_encryption_attributes +DukptKeyDerivationType,dukpt_key_derivation_type +DukptKeyVariant,dukpt_key_variant +DuplicateAccessPointNameException,duplicate_access_point_name_exception +DuplicateAccountException,duplicate_account_exception +DuplicateCertificateException,duplicate_certificate_exception +DuplicateDocumentContent,duplicate_document_content +DuplicateDocumentVersionName,duplicate_document_version_name +DuplicateHandshakeException,duplicate_handshake_exception +DuplicateItemException,duplicate_item_exception +DuplicateListenerException,duplicate_listener_exception +DuplicateLoadBalancerNameException,duplicate_load_balancer_name_exception +DuplicateOperationId,duplicate_operation_id +DuplicateOrganizationalUnitException,duplicate_organizational_unit_exception +DuplicatePolicyAttachmentException,duplicate_policy_attachment_exception +DuplicatePolicyException,duplicate_policy_exception +DuplicatePolicyNameException,duplicate_policy_name_exception +DuplicateProviderException,duplicate_provider_exception +DuplicateRecordException,duplicate_record_exception +DuplicateRegistrationAction,duplicate_registration_action +DuplicateReportNameException,duplicate_report_name_exception +DuplicateRequest,duplicate_request +DuplicateRequestException,duplicate_request_exception +DuplicateResourceException,duplicate_resource_exception +DuplicateSSHPublicKeyException,duplicate_ssh_public_key_exception +DuplicateTagKeysException,duplicate_tag_keys_exception +DuplicateTargetGroupNameException,duplicate_target_group_name_exception +DuplicateTimestamps,duplicate_timestamps +DuplicateUserNameFault,duplicate_user_name_fault +DuplicatedAuditEventId,duplicated_audit_event_id +DuplicatedStopRequestException,duplicated_stop_request_exception +Duration,duration +DurationFrames,duration_frames +DurationHistogram,duration_histogram +DurationInMinutes,duration_in_minutes +DurationInMs,duration_in_ms +DurationInSeconds,duration_in_seconds +DurationInYears,duration_in_years +DurationMillis,duration_millis +DurationMinutes,duration_minutes +DurationMode,duration_mode +DurationRange,duration_range +DurationSMPTE,duration_smpte +DurationSeconds,duration_seconds +DurationSinceLastAccess,duration_since_last_access +DurationUnits,duration_units +DvbNitSettings,dvb_nit_settings +DvbSdtSettings,dvb_sdt_settings +DvbSubDestinationSettings,dvb_sub_destination_settings +DvbSubPids,dvb_sub_pids +DvbSubSourceSettings,dvb_sub_source_settings +DvbTdtSettings,dvb_tdt_settings +DvbTeletextPid,dvb_teletext_pid +DynamicCardVerificationCode,dynamic_card_verification_code +DynamicCardVerificationValue,dynamic_card_verification_value +DynamicConfiguration,dynamic_configuration +DynamicDefaultValue,dynamic_default_value +DynamicPartitioningConfiguration,dynamic_partitioning_configuration +DynamicRangeCompressionLine,dynamic_range_compression_line +DynamicRangeCompressionProfile,dynamic_range_compression_profile +DynamicRangeCompressionRf,dynamic_range_compression_rf +DynamicRangeControl,dynamic_range_control +DynamicRouting,dynamic_routing +DynamicScalingConfiguration,dynamic_scaling_configuration +DynamicScalingInSuspended,dynamic_scaling_in_suspended +DynamicScalingOutSuspended,dynamic_scaling_out_suspended +DynamicSubGop,dynamic_sub_gop +DynamicTransform,dynamic_transform +DynamicValue,dynamic_value +DynamicVariable,dynamic_variable +DynamicVariables,dynamic_variables +DynamoDB,dynamo_db +DynamoDBAction,dynamo_db_action +DynamoDBCatalogSource,dynamo_db_catalog_source +DynamoDBStreamParameters,dynamo_db_stream_parameters +DynamoDBTarget,dynamo_db_target +DynamoDBTargets,dynamo_db_targets +DynamoDBv2Action,dynamo_dbv2_action +DynamoDbSettings,dynamo_db_settings +DynamodbDataSourceConfig,dynamodb_data_source_config +Dynatrace,dynatrace +DynatraceConnectorProfileCredentials,dynatrace_connector_profile_credentials +DynatraceConnectorProfileProperties,dynatrace_connector_profile_properties +DynatraceSourceProperties,dynatrace_source_properties +E164PhoneNumber,e164_phone_number +E164PhoneNumbers,e164_phone_numbers +EBSEnabled,ebs_enabled +EBSFilter,ebs_filter +EBSOptions,ebs_options +EBSOptionsStatus,ebs_options_status +EBSResourceUtilization,ebs_resource_utilization +EBSStorageInfo,ebs_storage_info +EBSUtilizationMetric,ebs_utilization_metric +EC2AccessDeniedException,ec2_access_denied_exception +EC2AssociateRouteTableAction,ec2_associate_route_table_action +EC2Capacities,ec2_capacities +EC2Capacity,ec2_capacity +EC2CopyRouteTableAction,ec2_copy_route_table_action +EC2CreateRouteAction,ec2_create_route_action +EC2CreateRouteTableAction,ec2_create_route_table_action +EC2DeleteRouteAction,ec2_delete_route_action +EC2ErrorCode,ec2_error_code +EC2FamilyFilter,ec2_family_filter +EC2InboundPermissions,ec2_inbound_permissions +EC2InstanceCounts,ec2_instance_counts +EC2InstanceDetails,ec2_instance_details +EC2InstanceId,ec2_instance_id +EC2InstanceIdsToTerminate,ec2_instance_ids_to_terminate +EC2InstanceLimit,ec2_instance_limit +EC2InstanceLimits,ec2_instance_limits +EC2InstanceNotFoundException,ec2_instance_not_found_exception +EC2InstanceStateInvalidException,ec2_instance_state_invalid_exception +EC2InstanceType,ec2_instance_type +EC2InstanceTypeInvalidException,ec2_instance_type_invalid_exception +EC2InstanceUnavailableException,ec2_instance_unavailable_exception +EC2ReplaceRouteAction,ec2_replace_route_action +EC2ReplaceRouteTableAssociationAction,ec2_replace_route_table_association_action +EC2ResourceDetails,ec2_resource_details +EC2ResourceUtilization,ec2_resource_utilization +EC2SecurityGroup,ec2_security_group +EC2SecurityGroupId,ec2_security_group_id +EC2SecurityGroupName,ec2_security_group_name +EC2SecurityGroupOwnerId,ec2_security_group_owner_id +EC2SecurityGroups,ec2_security_groups +EC2Specification,ec2_specification +EC2TagFilter,ec2_tag_filter +EC2TagSet,ec2_tag_set +EC2ThrottledException,ec2_throttled_exception +EC2UnexpectedException,ec2_unexpected_exception +ECSService,ecs_service +ECSServiceMappingLimitExceededException,ecs_service_mapping_limit_exceeded_exception +ECSServiceProjectedMetric,ecs_service_projected_metric +ECSServiceProjectedUtilizationMetric,ecs_service_projected_utilization_metric +ECSServiceRecommendation,ecs_service_recommendation +ECSServiceRecommendationFilter,ecs_service_recommendation_filter +ECSServiceRecommendationOption,ecs_service_recommendation_option +ECSServiceRecommendedOptionProjectedMetric,ecs_service_recommended_option_projected_metric +ECSServiceUtilizationMetric,ecs_service_utilization_metric +ECSTarget,ecs_target +ECSTaskSet,ecs_task_set +EDNS0ClientSubnetIP,edns0_client_subnet_ip +EDNS0ClientSubnetMask,edns0_client_subnet_mask +EFSAuthorizationConfig,efs_authorization_config +EFSIOException,efsio_exception +EFSMountConnectivityException,efs_mount_connectivity_exception +EFSMountFailureException,efs_mount_failure_exception +EFSMountTimeoutException,efs_mount_timeout_exception +EFSVolumeConfiguration,efs_volume_configuration +EKSAnywhereVersion,eks_anywhere_version +EKSOnDeviceService,eks_on_device_service +EKSOnDeviceServiceConfiguration,eks_on_device_service_configuration +ELBInfo,elb_info +EMAIL,email +EMR,emr +EMRStepMetadata,emr_step_metadata +ENILimitReachedException,eni_limit_reached_exception +EQ,eq +ESInstanceDetails,es_instance_details +ETag,e_tag +Eac3AtmosSettings,eac3_atmos_settings +Eac3Settings,eac3_settings +EapMethod,eap_method +Earfcn,earfcn +EarliestBacktrackTime,earliest_backtrack_time +EarliestRestorableDateTime,earliest_restorable_date_time +EarliestRestorableTime,earliest_restorable_time +EarliestTime,earliest_time +EarthObservationJobErrorDetails,earth_observation_job_error_details +EarthObservationJobSummaries,earth_observation_job_summaries +East,east +Ebif,ebif +EbpAudioInterval,ebp_audio_interval +EbpLookaheadMs,ebp_lookahead_ms +EbpPlacement,ebp_placement +Ebs,ebs +EbsBlockDevice,ebs_block_device +EbsBlockDeviceConfig,ebs_block_device_config +EbsBlockDeviceConfigs,ebs_block_device_configs +EbsBlockDevices,ebs_block_devices +EbsCause,ebs_cause +EbsConfiguration,ebs_configuration +EbsEncryptionByDefault,ebs_encryption_by_default +EbsEvent,ebs_event +EbsInfo,ebs_info +EbsInstanceBlockDevice,ebs_instance_block_device +EbsInstanceBlockDeviceSpecification,ebs_instance_block_device_specification +EbsOptimized,ebs_optimized +EbsOptimizedAvailable,ebs_optimized_available +EbsOptimizedByDefault,ebs_optimized_by_default +EbsOptimizedInfo,ebs_optimized_info +EbsOptimizedSupport,ebs_optimized_support +EbsReadBytesPerSecond,ebs_read_bytes_per_second +EbsReadOpsPerSecond,ebs_read_ops_per_second +EbsRequestId,ebs_request_id +EbsResult,ebs_result +EbsRootVolumeSize,ebs_root_volume_size +EbsSnapshotConfiguration,ebs_snapshot_configuration +EbsSnapshotPreservation,ebs_snapshot_preservation +EbsStorageInfo,ebs_storage_info +EbsStorageOnly,ebs_storage_only +EbsVolume,ebs_volume +EbsVolumeDetails,ebs_volume_details +EbsVolumeScanDetails,ebs_volume_scan_details +EbsVolumes,ebs_volumes +EbsVolumesResult,ebs_volumes_result +EbsWriteBytesPerSecond,ebs_write_bytes_per_second +EbsWriteOpsPerSecond,ebs_write_ops_per_second +EbuTtDDestinationSettings,ebu_tt_d_destination_settings +Ec2AmiResource,ec2_ami_resource +Ec2AmiResources,ec2_ami_resources +Ec2AvailabilityZone,ec2_availability_zone +Ec2Config,ec2_config +Ec2Configuration,ec2_configuration +Ec2ImageId,ec2_image_id +Ec2ImagePropertiesNotSupportedFault,ec2_image_properties_not_supported_fault +Ec2InstanceAggregation,ec2_instance_aggregation +Ec2InstanceAggregationResponse,ec2_instance_aggregation_response +Ec2InstanceAttributes,ec2_instance_attributes +Ec2InstanceConnectEndpoint,ec2_instance_connect_endpoint +Ec2InstanceId,ec2_instance_id +Ec2InstanceIds,ec2_instance_ids +Ec2InstanceRegion,ec2_instance_region +Ec2KeyName,ec2_key_name +Ec2Metadata,ec2_metadata +Ec2RecommendationsExportPreferences,ec2_recommendations_export_preferences +Ec2RequestFailedException,ec2_request_failed_exception +Ec2SecurityGroupId,ec2_security_group_id +Ec2SecurityGroupName,ec2_security_group_name +Ec2SecurityGroupOwnerId,ec2_security_group_owner_id +Ec2SecurityGroups,ec2_security_groups +Ec2State,ec2_state +Ec2SubnetId,ec2_subnet_id +Ec2SubnetIds,ec2_subnet_ids +Ec2VolumeId,ec2_volume_id +EchoReduction,echo_reduction +EcmPid,ecm_pid +EcrConfiguration,ecr_configuration +EcrConfigurationState,ecr_configuration_state +EcrContainerImageMetadata,ecr_container_image_metadata +EcrRepositoryConfiguration,ecr_repository_configuration +EcrRepositoryMetadata,ecr_repository_metadata +EcrRescanDurationState,ecr_rescan_duration_state +EcsCluster,ecs_cluster +EcsClusterArn,ecs_cluster_arn +EcsClusterArns,ecs_cluster_arns +EcsClusterDetails,ecs_cluster_details +EcsClusterName,ecs_cluster_name +EcsClusters,ecs_clusters +EcsContainerInstanceArn,ecs_container_instance_arn +EcsContainerOverride,ecs_container_override +EcsEnvironmentFile,ecs_environment_file +EcsEnvironmentVariable,ecs_environment_variable +EcsEphemeralStorage,ecs_ephemeral_storage +EcsInferenceAcceleratorOverride,ecs_inference_accelerator_override +EcsParameters,ecs_parameters +EcsResourceRequirement,ecs_resource_requirement +EcsTaskDetails,ecs_task_details +EcsTaskOverride,ecs_task_override +EcsTaskParameters,ecs_task_parameters +Edge,edge +EdgeAgentStatus,edge_agent_status +EdgeConfig,edge_config +EdgeConfigs,edge_configs +EdgeDeployment,edge_deployment +EdgeDeploymentConfig,edge_deployment_config +EdgeDeploymentFailed,edge_deployment_failed +EdgeDeploymentFailedInStage,edge_deployment_failed_in_stage +EdgeDeploymentModelConfig,edge_deployment_model_config +EdgeDeploymentPending,edge_deployment_pending +EdgeDeploymentPendingInStage,edge_deployment_pending_in_stage +EdgeDeploymentPlanArn,edge_deployment_plan_arn +EdgeDeploymentPlanName,edge_deployment_plan_name +EdgeDeploymentPlanSummaries,edge_deployment_plan_summaries +EdgeDeploymentPlanSummary,edge_deployment_plan_summary +EdgeDeploymentStageStartTime,edge_deployment_stage_start_time +EdgeDeploymentStatus,edge_deployment_status +EdgeDeploymentStatusMessage,edge_deployment_status_message +EdgeDeploymentSuccess,edge_deployment_success +EdgeDeploymentSuccessInStage,edge_deployment_success_in_stage +EdgeLocation,edge_location +EdgeLocations,edge_locations +EdgeMetric,edge_metric +EdgeModel,edge_model +EdgeModelStat,edge_model_stat +EdgeModelSummary,edge_model_summary +EdgeOutputConfig,edge_output_config +EdgePackagingJobArn,edge_packaging_job_arn +EdgePackagingJobName,edge_packaging_job_name +EdgePackagingJobStatus,edge_packaging_job_status +EdgePackagingJobStatusMessage,edge_packaging_job_status_message +EdgePackagingJobSummaries,edge_packaging_job_summaries +EdgePackagingJobSummary,edge_packaging_job_summary +EdgePresetDeploymentOutput,edge_preset_deployment_output +EdgeRetentionInHours,edge_retention_in_hours +EdgeStatistics,edge_statistics +EdgeStructure,edge_structure +EdgeSummaryStatistics,edge_summary_statistics +EdgeType,edge_type +Edges,edges +EdiPartyName,edi_party_name +Edition,edition +EditorId,editor_id +EfaInfo,efa_info +EfaSupported,efa_supported +Effect,effect +EffectiveDate,effective_date +EffectiveDeployment,effective_deployment +EffectiveDeploymentStatusDetails,effective_deployment_status_details +EffectiveEnd,effective_end +EffectiveEngineVersion,effective_engine_version +EffectiveOn,effective_on +EffectivePatch,effective_patch +EffectivePatches,effective_patches +EffectivePermission,effective_permission +EffectivePolicy,effective_policy +EffectivePolicyNotFoundException,effective_policy_not_found_exception +EffectiveRecommendationPreferences,effective_recommendation_preferences +EffectiveStart,effective_start +EfsFileLocation,efs_file_location +EfsFileSystemConfiguration,efs_file_system_configuration +EfsFilesystemArn,efs_filesystem_arn +EfsStorageConfiguration,efs_storage_configuration +EfsVolumeConfiguration,efs_volume_configuration +Egress,egress +EgressAccessLogs,egress_access_logs +EgressBytes,egress_bytes +EgressCidrBlocks,egress_cidr_blocks +EgressConfiguration,egress_configuration +EgressDomain,egress_domain +EgressEndpoint,egress_endpoint +EgressEndpoints,egress_endpoints +EgressFilter,egress_filter +EgressFilterRules,egress_filter_rules +EgressGatewayBridge,egress_gateway_bridge +EgressIp,egress_ip +EgressOnlyInternetGateway,egress_only_internet_gateway +EgressOnlyInternetGatewayId,egress_only_internet_gateway_id +EgressOnlyInternetGatewayIds,egress_only_internet_gateway_ids +EgressOnlyInternetGateways,egress_only_internet_gateways +EgressPackets,egress_packets +EgressType,egress_type +Eirp,eirp +EksAttemptContainerDetail,eks_attempt_container_detail +EksAttemptDetail,eks_attempt_detail +EksClusterDetails,eks_cluster_details +EksConfiguration,eks_configuration +EksContainer,eks_container +EksContainerDetail,eks_container_detail +EksContainerEnvironmentVariable,eks_container_environment_variable +EksContainerOverride,eks_container_override +EksContainerResourceRequirements,eks_container_resource_requirements +EksContainerSecurityContext,eks_container_security_context +EksContainerVolumeMount,eks_container_volume_mount +EksEmptyDir,eks_empty_dir +EksHostPath,eks_host_path +EksInfo,eks_info +EksMetadata,eks_metadata +EksPodProperties,eks_pod_properties +EksPodPropertiesDetail,eks_pod_properties_detail +EksPodPropertiesOverride,eks_pod_properties_override +EksProperties,eks_properties +EksPropertiesDetail,eks_properties_detail +EksPropertiesOverride,eks_properties_override +EksSecret,eks_secret +EksSource,eks_source +EksSourceClusterNamespace,eks_source_cluster_namespace +EksVolume,eks_volume +ElapsedTimeInActiveSeconds,elapsed_time_in_active_seconds +ElapsedTimeInSeconds,elapsed_time_in_seconds +ElapsedTimeMillis,elapsed_time_millis +ElastiCacheInstanceDetails,elasti_cache_instance_details +ElasticBeanstalkServiceException,elastic_beanstalk_service_exception +ElasticChannelConfiguration,elastic_channel_configuration +ElasticGpuAssociation,elastic_gpu_association +ElasticGpuAssociationId,elastic_gpu_association_id +ElasticGpuAssociationState,elastic_gpu_association_state +ElasticGpuAssociationTime,elastic_gpu_association_time +ElasticGpuAssociations,elastic_gpu_associations +ElasticGpuHealth,elastic_gpu_health +ElasticGpuId,elastic_gpu_id +ElasticGpuIds,elastic_gpu_ids +ElasticGpuSet,elastic_gpu_set +ElasticGpuSpecification,elastic_gpu_specification +ElasticGpuSpecificationResponse,elastic_gpu_specification_response +ElasticGpuSpecificationSet,elastic_gpu_specification_set +ElasticGpuSpecifications,elastic_gpu_specifications +ElasticGpuState,elastic_gpu_state +ElasticGpuType,elastic_gpu_type +ElasticGpus,elastic_gpus +ElasticInferenceAccelerator,elastic_inference_accelerator +ElasticInferenceAcceleratorArn,elastic_inference_accelerator_arn +ElasticInferenceAcceleratorAssociation,elastic_inference_accelerator_association +ElasticInferenceAcceleratorAssociationId,elastic_inference_accelerator_association_id +ElasticInferenceAcceleratorAssociationState,elastic_inference_accelerator_association_state +ElasticInferenceAcceleratorAssociationTime,elastic_inference_accelerator_association_time +ElasticInferenceAcceleratorAssociations,elastic_inference_accelerator_associations +ElasticInferenceAcceleratorHealth,elastic_inference_accelerator_health +ElasticInferenceAcceleratorSet,elastic_inference_accelerator_set +ElasticInferenceAccelerators,elastic_inference_accelerators +ElasticIp,elastic_ip +ElasticIpStatus,elastic_ip_status +ElasticIps,elastic_ips +ElasticLoadBalancer,elastic_load_balancer +ElasticLoadBalancerListener,elastic_load_balancer_listener +ElasticLoadBalancerName,elastic_load_balancer_name +ElasticLoadBalancers,elastic_load_balancers +ElasticResizeNumberOfNodeOptions,elastic_resize_number_of_node_options +ElasticsearchAction,elasticsearch_action +ElasticsearchBufferingHints,elasticsearch_buffering_hints +ElasticsearchClusterConfig,elasticsearch_cluster_config +ElasticsearchClusterConfigStatus,elasticsearch_cluster_config_status +ElasticsearchDataSourceConfig,elasticsearch_data_source_config +ElasticsearchDestinationConfiguration,elasticsearch_destination_configuration +ElasticsearchDestinationDescription,elasticsearch_destination_description +ElasticsearchDestinationUpdate,elasticsearch_destination_update +ElasticsearchDomainConfig,elasticsearch_domain_config +ElasticsearchDomainStatus,elasticsearch_domain_status +ElasticsearchInstanceCount,elasticsearch_instance_count +ElasticsearchInstanceType,elasticsearch_instance_type +ElasticsearchInstanceTypes,elasticsearch_instance_types +ElasticsearchRetryOptions,elasticsearch_retry_options +ElasticsearchSettings,elasticsearch_settings +ElasticsearchVersion,elasticsearch_version +ElasticsearchVersionStatus,elasticsearch_version_status +ElasticsearchVersions,elasticsearch_versions +Element,element +ElementId,element_id +ElementName,element_name +ElementPath,element_path +ElementStatuses,element_statuses +ElementType,element_type +Elements,elements +Elevation,elevation +ElicitSubSlot,elicit_sub_slot +ElicitationCodeHookInvocationSetting,elicitation_code_hook_invocation_setting +EligibleForReplication,eligible_for_replication +Email,email +EmailAddress,email_address +EmailAddressInUseException,email_address_in_use_exception +EmailChannelRequest,email_channel_request +EmailChannelResponse,email_channel_response +EmailConfiguration,email_configuration +EmailConfigurationFailure,email_configuration_failure +EmailConfigurationType,email_configuration_type +EmailContent,email_content +EmailField,email_field +EmailForwardingEnabled,email_forwarding_enabled +EmailIdentities,email_identities +EmailIdentity,email_identity +EmailInsights,email_insights +EmailMessage,email_message +EmailMessageActivity,email_message_activity +EmailMessageByLink,email_message_by_link +EmailRecipients,email_recipients +EmailReference,email_reference +EmailSendingAccount,email_sending_account +EmailSettings,email_settings +EmailStatus,email_status +EmailSubject,email_subject +EmailSubjectByLink,email_subject_by_link +EmailTags,email_tags +EmailTemplate,email_template +EmailTemplateContent,email_template_content +EmailTemplateMetadata,email_template_metadata +EmailTemplateRequest,email_template_request +EmailTemplateResponse,email_template_response +EmailVerificationMessage,email_verification_message +EmailVerificationSubject,email_verification_subject +Emails,emails +EmbedHostDomains,embed_host_domains +EmbedUrl,embed_url +EmbeddedDestinationSettings,embedded_destination_settings +EmbeddedPlusScte20DestinationSettings,embedded_plus_scte20_destination_settings +EmbeddedSourceSettings,embedded_source_settings +EmbeddedTimecodeOverride,embedded_timecode_override +EmergencyCallingConfiguration,emergency_calling_configuration +EmergencyContact,emergency_contact +EmergencyContactList,emergency_contact_list +EmergencyPhoneNumber,emergency_phone_number +EmitConsumerLagMetrics,emit_consumer_lag_metrics +EmitInterval,emit_interval +Emotion,emotion +Emotions,emotions +EmptyAsNull,empty_as_null +EmptyBatchRequestException,empty_batch_request_exception +EmptyFillColor,empty_fill_color +EmptyUploadException,empty_upload_exception +EmptyVisual,empty_visual +EmrManagedMasterSecurityGroup,emr_managed_master_security_group +EmrManagedSlaveSecurityGroup,emr_managed_slave_security_group +EnaSrdEnabled,ena_srd_enabled +EnaSrdSpecification,ena_srd_specification +EnaSrdSupported,ena_srd_supported +EnaSrdUdpEnabled,ena_srd_udp_enabled +EnaSrdUdpSpecification,ena_srd_udp_specification +EnaSupport,ena_support +Enable,enable +EnableAWSServiceAccessRequest,enable_aws_service_access_request +EnableAcceleration,enable_acceleration +EnableAcceptEncodingBrotli,enable_accept_encoding_brotli +EnableAcceptEncodingGzip,enable_accept_encoding_gzip +EnableActionConfiguration,enable_action_configuration +EnableAddOnRequest,enable_add_on_request +EnableAddOnResult,enable_add_on_result +EnableAdditionalMetadata,enable_additional_metadata +EnableAddressTransferRequest,enable_address_transfer_request +EnableAddressTransferResult,enable_address_transfer_result +EnableAlarmActionRequest,enable_alarm_action_request +EnableAlarmActionsInput,enable_alarm_actions_input +EnableAllFeaturesResponse,enable_all_features_response +EnableAllOpsDataSources,enable_all_ops_data_sources +EnableAnswerMachineDetection,enable_answer_machine_detection +EnableApplicationLayerAutomaticResponseRequest,enable_application_layer_automatic_response_request +EnableAutoHealing,enable_auto_healing +EnableAwsNetworkPerformanceMetricSubscriptionRequest,enable_aws_network_performance_metric_subscription_request +EnableAwsNetworkPerformanceMetricSubscriptionResult,enable_aws_network_performance_metric_subscription_result +EnableCapture,enable_capture +EnableCaseSensitiveIdentifier,enable_case_sensitive_identifier +EnableChannelIdentification,enable_channel_identification +EnableClientAuthenticationRequest,enable_client_authentication_request +EnableCloudwatchLogsExports,enable_cloudwatch_logs_exports +EnableContinuousBackup,enable_continuous_backup +EnableControlInput,enable_control_input +EnableControlOutput,enable_control_output +EnableCrossAccountsDiscovery,enable_cross_accounts_discovery +EnableCustomerOwnedIp,enable_customer_owned_ip +EnableDate,enable_date +EnableDebugLogDelivery,enable_debug_log_delivery +EnableDefaultInternetAccess,enable_default_internet_access +EnableDefaultStandards,enable_default_standards +EnableDelegatedAdminAccountRequest,enable_delegated_admin_account_request +EnableDelegatedAdminAccountResponse,enable_delegated_admin_account_response +EnableDialOut,enable_dial_out +EnableDictionaryCompression,enable_dictionary_compression +EnableDirectoryRequest,enable_directory_request +EnableDirectoryResponse,enable_directory_response +EnableDns64,enable_dns64 +EnableDnsHostnames,enable_dns_hostnames +EnableDnsSupport,enable_dns_support +EnableDomainAutoRenewRequest,enable_domain_auto_renew_request +EnableDomainTransferLockRequest,enable_domain_transfer_lock_request +EnableDomainTransferLockResponse,enable_domain_transfer_lock_response +EnableDynamicFieldUpdate,enable_dynamic_field_update +EnableECSManagedTags,enable_ecs_managed_tags +EnableEbsEncryptionByDefaultRequest,enable_ebs_encryption_by_default_request +EnableEbsEncryptionByDefaultResult,enable_ebs_encryption_by_default_result +EnableEcsManagedTags,enable_ecs_managed_tags +EnableEnhancedMonitoringInput,enable_enhanced_monitoring_input +EnableExecuteCommand,enable_execute_command +EnableExplanations,enable_explanations +EnableFastLaunchRequest,enable_fast_launch_request +EnableFastLaunchResult,enable_fast_launch_result +EnableFastSnapshotRestoreErrorItem,enable_fast_snapshot_restore_error_item +EnableFastSnapshotRestoreStateError,enable_fast_snapshot_restore_state_error +EnableFastSnapshotRestoreStateErrorItem,enable_fast_snapshot_restore_state_error_item +EnableFastSnapshotRestoreSuccessItem,enable_fast_snapshot_restore_success_item +EnableFastSnapshotRestoresRequest,enable_fast_snapshot_restores_request +EnableFastSnapshotRestoresResult,enable_fast_snapshot_restores_result +EnableGlobalWriteForwarding,enable_global_write_forwarding +EnableHomogenousTablespace,enable_homogenous_tablespace +EnableHostedZoneDNSSECRequest,enable_hosted_zone_dnssec_request +EnableHostedZoneDNSSECResponse,enable_hosted_zone_dnssec_response +EnableHttpEndpoint,enable_http_endpoint +EnableHybrid,enable_hybrid +EnableIAMDatabaseAuthentication,enable_iam_database_authentication +EnableImageBlockPublicAccessRequest,enable_image_block_public_access_request +EnableImageBlockPublicAccessResult,enable_image_block_public_access_result +EnableImageDeprecationRequest,enable_image_deprecation_request +EnableImageDeprecationResult,enable_image_deprecation_result +EnableImportFindingsForProductRequest,enable_import_findings_for_product_request +EnableImportFindingsForProductResponse,enable_import_findings_for_product_response +EnableInsightRulesInput,enable_insight_rules_input +EnableInsightRulesOutput,enable_insight_rules_output +EnableIntegration,enable_integration +EnableInterContainerTrafficEncryption,enable_inter_container_traffic_encryption +EnableInternetAccess,enable_internet_access +EnableInteroperability,enable_interoperability +EnableIoTLoggingParams,enable_io_t_logging_params +EnableIotRoleAlias,enable_iot_role_alias +EnableIpamOrganizationAdminAccountRequest,enable_ipam_organization_admin_account_request +EnableIpamOrganizationAdminAccountResult,enable_ipam_organization_admin_account_result +EnableKeyRequest,enable_key_request +EnableKeyReuseOnNtTokenKeysetStorageFull,enable_key_reuse_on_nt_token_keyset_storage_full +EnableKeyRotationRequest,enable_key_rotation_request +EnableLDAPSRequest,enable_ldaps_request +EnableLniAtDeviceIndex,enable_lni_at_device_index +EnableLocalWriteForwarding,enable_local_write_forwarding +EnableLogFileValidation,enable_log_file_validation +EnableLogTypes,enable_log_types +EnableLoggingMessage,enable_logging_message +EnableMFADeviceRequest,enable_mfa_device_request +EnableMachineLearning,enable_machine_learning +EnableMacieRequest,enable_macie_request +EnableMagneticStoreWrites,enable_magnetic_store_writes +EnableMaintenanceMode,enable_maintenance_mode +EnableManagedSpotTraining,enable_managed_spot_training +EnableManifestOutput,enable_manifest_output +EnableMediaMetricLogs,enable_media_metric_logs +EnableMetricsCollectionQuery,enable_metrics_collection_query +EnableMinimumEncryptionConfiguration,enable_minimum_encryption_configuration +EnableNetworkAddressUsageMetrics,enable_network_address_usage_metrics +EnableNetworkIsolation,enable_network_isolation +EnableNonSecurity,enable_non_security +EnableOnlineStore,enable_online_store +EnableOrganizationAdminAccountRequest,enable_organization_admin_account_request +EnablePadding,enable_padding +EnablePartialResultsStabilization,enable_partial_results_stabilization +EnablePerformanceInsights,enable_performance_insights +EnablePolicyTypeRequest,enable_policy_type_request +EnablePolicyTypeResponse,enable_policy_type_response +EnablePrimaryIpv6,enable_primary_ipv6 +EnablePropagateAdditionalUserContextData,enable_propagate_additional_user_context_data +EnableRadiusRequest,enable_radius_request +EnableReachabilityAnalyzerOrganizationSharingRequest,enable_reachability_analyzer_organization_sharing_request +EnableReachabilityAnalyzerOrganizationSharingResult,enable_reachability_analyzer_organization_sharing_result +EnableRegexInPath,enable_regex_in_path +EnableRegionRequest,enable_region_request +EnableRequest,enable_request +EnableResourceNameDnsAAAARecord,enable_resource_name_dns_aaaa_record +EnableResourceNameDnsAAAARecordOnLaunch,enable_resource_name_dns_aaaa_record_on_launch +EnableResourceNameDnsARecord,enable_resource_name_dns_a_record +EnableResourceNameDnsARecordOnLaunch,enable_resource_name_dns_a_record_on_launch +EnableResponse,enable_response +EnableRuleRequest,enable_rule_request +EnableSIPLogs,enable_sip_logs +EnableSNI,enable_sni +EnableSSMAccess,enable_ssm_access +EnableSageMakerMetricsTimeSeries,enable_sage_maker_metrics_time_series +EnableSamplePath,enable_sample_path +EnableSecurityHubRequest,enable_security_hub_request +EnableSelfService,enable_self_service +EnableSerialConsoleAccessRequest,enable_serial_console_access_request +EnableSerialConsoleAccessResult,enable_serial_console_access_result +EnableSharingWithAwsOrganizationResponse,enable_sharing_with_aws_organization_response +EnableSimpleResponses,enable_simple_responses +EnableSipMediaApplicationMessageLogs,enable_sip_media_application_message_logs +EnableSnapshotCopyMessage,enable_snapshot_copy_message +EnableSnapshotCopyResult,enable_snapshot_copy_result +EnableSoftwareTokenMFAException,enable_software_token_mfa_exception +EnableSsl,enable_ssl +EnableSsoRequest,enable_sso_request +EnableStageTransitionInput,enable_stage_transition_input +EnableStatistics,enable_statistics +EnableTerminationProtection,enable_termination_protection +EnableTokenRevocation,enable_token_revocation +EnableTopicRuleRequest,enable_topic_rule_request +EnableTransitGatewayRouteTablePropagationRequest,enable_transit_gateway_route_table_propagation_request +EnableTransitGatewayRouteTablePropagationResult,enable_transit_gateway_route_table_propagation_result +EnableTunnelLifecycleControl,enable_tunnel_lifecycle_control +EnableUpdateCatalog,enable_update_catalog +EnableUserRequest,enable_user_request +EnableUserResponse,enable_user_response +EnableVgwRoutePropagationRequest,enable_vgw_route_propagation_request +EnableVisualization,enable_visualization +EnableVolumeIORequest,enable_volume_io_request +EnableVpcClassicLinkDnsSupportRequest,enable_vpc_classic_link_dns_support_request +EnableVpcClassicLinkDnsSupportResult,enable_vpc_classic_link_dns_support_result +EnableVpcClassicLinkRequest,enable_vpc_classic_link_request +EnableVpcClassicLinkResult,enable_vpc_classic_link_result +EnableWWWSubdomain,enable_www_subdomain +EnableWorkDocs,enable_work_docs +EnableXRay,enable_x_ray +Enabled,enabled +EnabledByDefault,enabled_by_default +EnabledByMotion,enabled_by_motion +EnabledCloudWatchLogsExports,enabled_cloud_watch_logs_exports +EnabledCloudwatchLogsExports,enabled_cloudwatch_logs_exports +EnabledControlSummary,enabled_control_summary +EnabledDate,enabled_date +EnabledInBroker,enabled_in_broker +EnabledMetric,enabled_metric +EnabledMetrics,enabled_metrics +EnabledProtocols,enabled_protocols +EnabledServicePrincipal,enabled_service_principal +EnabledServicePrincipals,enabled_service_principals +EnabledTime,enabled_time +EnablementType,enablement_type +EnablingTime,enabling_time +EncipherOnly,encipher_only +EnclaveOptions,enclave_options +EnclaveOptionsRequest,enclave_options_request +EncodedData,encoded_data +EncodedKey,encoded_key +EncodedMessage,encoded_message +EncoderProfile,encoder_profile +EncoderSettings,encoder_settings +Encoding,encoding +EncodingName,encoding_name +EncodingParameters,encoding_parameters +EncodingParametersRequest,encoding_parameters_request +EncodingType,encoding_type +Encrypt,encrypt +EncryptDataInput,encrypt_data_input +EncryptDataOutput,encrypt_data_output +EncryptRequest,encrypt_request +EncryptResponse,encrypt_response +Encrypted,encrypted +EncryptedDecryptionKey,encrypted_decryption_key +EncryptedKeyMaterial,encrypted_key_material +EncryptedPinBlock,encrypted_pin_block +EncryptedWithHSM,encrypted_with_hsm +Encryption,encryption +EncryptionAlgorithm,encryption_algorithm +EncryptionAlgorithmOptions,encryption_algorithm_options +EncryptionAlgorithms,encryption_algorithms +EncryptionAtRest,encryption_at_rest +EncryptionAtRestOptions,encryption_at_rest_options +EncryptionAtRestOptionsStatus,encryption_at_rest_options_status +EncryptionAttributes,encryption_attributes +EncryptionConfig,encryption_config +EncryptionConfiguration,encryption_configuration +EncryptionContext,encryption_context +EncryptionContextEquals,encryption_context_equals +EncryptionContextSubset,encryption_context_subset +EncryptionContractConfiguration,encryption_contract_configuration +EncryptionDescription,encryption_description +EncryptionDisabled,encryption_disabled +EncryptionEnabled,encryption_enabled +EncryptionEntities,encryption_entities +EncryptionEntity,encryption_entity +EncryptionFailure,encryption_failure +EncryptionInTransit,encryption_in_transit +EncryptionInTransitSupported,encryption_in_transit_supported +EncryptionInfo,encryption_info +EncryptionIntegrityChecksFailedException,encryption_integrity_checks_failed_exception +EncryptionKey,encryption_key +EncryptionKeyAccessDeniedException,encryption_key_access_denied_exception +EncryptionKeyArn,encryption_key_arn +EncryptionKeyCheckValue,encryption_key_check_value +EncryptionKeyDisabledException,encryption_key_disabled_exception +EncryptionKeyIdentifier,encryption_key_identifier +EncryptionKeyNotFoundException,encryption_key_not_found_exception +EncryptionKeyUnavailableException,encryption_key_unavailable_exception +EncryptionKmsKeyId,encryption_kms_key_id +EncryptionMethod,encryption_method +EncryptionMode,encryption_mode +EncryptionOption,encryption_option +EncryptionOptions,encryption_options +EncryptionPolicyCount,encryption_policy_count +EncryptionSetting,encryption_setting +EncryptionSpecification,encryption_specification +EncryptionStatus,encryption_status +EncryptionSupport,encryption_support +EncryptionType,encryption_type +End,end +EndBillingPeriod,end_billing_period +EndDate,end_date +EndDateTime,end_date_time +EndDateType,end_date_type +EndEventTime,end_event_time +EndFrameNumber,end_frame_number +EndHour,end_hour +EndHourOfDay,end_hour_of_day +EndLine,end_line +EndMarker,end_marker +EndMinuteOfHour,end_minute_of_hour +EndMode,end_mode +EndOfMeetingReminder,end_of_meeting_reminder +EndOffset,end_offset +EndOffsetChar,end_offset_char +EndOffsetMillis,end_offset_millis +EndPercentage,end_percentage +EndPoint,end_point +EndPoints,end_points +EndPosition,end_position +EndSession,end_session +EndSessionResult,end_session_result +EndTime,end_time +EndTimeExclusive,end_time_exclusive +EndTimeOffset,end_time_offset +EndTimeRange,end_time_range +EndTimecode,end_timecode +EndTimecodeSMPTE,end_timecode_smpte +EndTimestamp,end_timestamp +EndTimestampMillis,end_timestamp_millis +EndUrl,end_url +EndUserLicenseAgreement,end_user_license_agreement +EndUserOptedOut,end_user_opted_out +EndValue,end_value +EndWeekDay,end_week_day +EndedAt,ended_at +EndedTimestamp,ended_timestamp +EndingHashKey,ending_hash_key +EndingOffsets,ending_offsets +EndingSequenceNumber,ending_sequence_number +Endpoint,endpoint +EndpointAccess,endpoint_access +EndpointAccessList,endpoint_access_list +EndpointAlreadyExistsException,endpoint_already_exists_exception +EndpointAlreadyExistsFault,endpoint_already_exists_fault +EndpointArn,endpoint_arn +EndpointAttributes,endpoint_attributes +EndpointAuthorization,endpoint_authorization +EndpointAuthorizationAlreadyExistsFault,endpoint_authorization_already_exists_fault +EndpointAuthorizationList,endpoint_authorization_list +EndpointAuthorizationNotFoundFault,endpoint_authorization_not_found_fault +EndpointAuthorizationsPerClusterLimitExceededFault,endpoint_authorizations_per_cluster_limit_exceeded_fault +EndpointBatchItem,endpoint_batch_item +EndpointBatchRequest,endpoint_batch_request +EndpointConfigArn,endpoint_config_arn +EndpointConfigName,endpoint_config_name +EndpointConfigSummary,endpoint_config_summary +EndpointConfigs,endpoint_configs +EndpointConfiguration,endpoint_configuration +EndpointConfigurations,endpoint_configurations +EndpointCount,endpoint_count +EndpointCreateTime,endpoint_create_time +EndpointDemographic,endpoint_demographic +EndpointDescription,endpoint_description +EndpointDescriptions,endpoint_descriptions +EndpointDetails,endpoint_details +EndpointDisabledException,endpoint_disabled_exception +EndpointDomain,endpoint_domain +EndpointDomainPrefix,endpoint_domain_prefix +EndpointEventBus,endpoint_event_bus +EndpointFilter,endpoint_filter +EndpointGroup,endpoint_group +EndpointGroupAlreadyExistsException,endpoint_group_already_exists_exception +EndpointGroupArn,endpoint_group_arn +EndpointGroupNotFoundException,endpoint_group_not_found_exception +EndpointGroupRegion,endpoint_group_region +EndpointGroups,endpoint_groups +EndpointId,endpoint_id +EndpointIdentifier,endpoint_identifier +EndpointIdentifiers,endpoint_identifiers +EndpointIds,endpoint_ids +EndpointInfo,endpoint_info +EndpointInput,endpoint_input +EndpointInputConfiguration,endpoint_input_configuration +EndpointIpAddress,endpoint_ip_address +EndpointIpAddressRange,endpoint_ip_address_range +EndpointItemResponse,endpoint_item_response +EndpointLocation,endpoint_location +EndpointMessageResult,endpoint_message_result +EndpointMetadata,endpoint_metadata +EndpointMetrics,endpoint_metrics +EndpointName,endpoint_name +EndpointNetworkConfiguration,endpoint_network_configuration +EndpointNotFoundException,endpoint_not_found_exception +EndpointNotFoundFault,endpoint_not_found_fault +EndpointOutputConfiguration,endpoint_output_configuration +EndpointPerformance,endpoint_performance +EndpointPerformances,endpoint_performances +EndpointPort,endpoint_port +EndpointProperties,endpoint_properties +EndpointPropertiesList,endpoint_properties_list +EndpointPublicAccess,endpoint_public_access +EndpointReentryCap,endpoint_reentry_cap +EndpointReentryInterval,endpoint_reentry_interval +EndpointRequest,endpoint_request +EndpointResponse,endpoint_response +EndpointResult,endpoint_result +EndpointSendConfiguration,endpoint_send_configuration +EndpointSetting,endpoint_setting +EndpointSettings,endpoint_settings +EndpointState,endpoint_state +EndpointStatus,endpoint_status +EndpointSummary,endpoint_summary +EndpointTemporarilyUnavailableException,endpoint_temporarily_unavailable_exception +EndpointType,endpoint_type +EndpointTypes,endpoint_types +EndpointURL,endpoint_url +EndpointUri,endpoint_uri +EndpointUrl,endpoint_url +EndpointUser,endpoint_user +Endpoints,endpoints +EndpointsPerAuthorizationLimitExceededFault,endpoints_per_authorization_limit_exceeded_fault +EndpointsPerClusterLimitExceededFault,endpoints_per_cluster_limit_exceeded_fault +EndpointsResponse,endpoints_response +EndsWith,ends_with +EnforceConsumerDeletion,enforce_consumer_deletion +EnforceHTTPS,enforce_https +EnforceProvidedLabels,enforce_provided_labels +EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic,enforce_security_group_inbound_rules_on_private_link_traffic +EnforceWorkGroupConfiguration,enforce_work_group_configuration +Enforced,enforced +EnforcedLimit,enforced_limit +EnforcementInRecord,enforcement_in_record +EnforcementStatus,enforcement_status +Engagement,engagement +EngagementArn,engagement_arn +EngagementId,engagement_id +EngagementMetrics,engagement_metrics +Engagements,engagements +Engine,engine +EngineArn,engine_arn +EngineAttribute,engine_attribute +EngineAttributes,engine_attributes +EngineConfiguration,engine_configuration +EngineDefaults,engine_defaults +EngineDisplayName,engine_display_name +EngineEdition,engine_edition +EngineExecutionTimeInMillis,engine_execution_time_in_millis +EngineFamily,engine_family +EngineFullVersion,engine_full_version +EngineMode,engine_mode +EngineModel,engine_model +EngineName,engine_name +EngineNativeAuditFieldsIncluded,engine_native_audit_fields_included +EngineNotSupportedException,engine_not_supported_exception +EnginePatchVersion,engine_patch_version +EngineSecurityGroupId,engine_security_group_id +EngineTranscribeMedicalSettings,engine_transcribe_medical_settings +EngineTranscribeSettings,engine_transcribe_settings +EngineType,engine_type +EngineVersion,engine_version +EngineVersionInfo,engine_version_info +EngineVersions,engine_versions +EngineVersionsSummary,engine_versions_summary +EngineWorkflowResourceIdentifier,engine_workflow_resource_identifier +EnhancedImageScanFinding,enhanced_image_scan_finding +EnhancedMetrics,enhanced_metrics +EnhancedMonitoring,enhanced_monitoring +EnhancedMonitoringOutput,enhanced_monitoring_output +EnhancedMonitoringResourceArn,enhanced_monitoring_resource_arn +EnhancedVpcRouting,enhanced_vpc_routing +EniId,eni_id +EniIp,eni_ip +EniPrivateIpAddress,eni_private_ip_address +EnqueueTimestamp,enqueue_timestamp +Enrichment,enrichment +EnrichmentParameters,enrichment_parameters +Enroll,enroll +EnrollmentConfig,enrollment_config +EnrollmentFilter,enrollment_filter +EnrollmentFlags,enrollment_flags +EnrollmentFlagsV2,enrollment_flags_v2 +EnrollmentFlagsV3,enrollment_flags_v3 +EnrollmentFlagsV4,enrollment_flags_v4 +EnrollmentId,enrollment_id +EnrollmentJobFraudDetectionConfig,enrollment_job_fraud_detection_config +EnrollmentStatus,enrollment_status +EnsureNoBackupInProcess,ensure_no_backup_in_process +EnterStandbyAnswer,enter_standby_answer +EnterStandbyQuery,enter_standby_query +EnterpriseId,enterprise_id +Entities,entities +EntitiesDetectionJobFilter,entities_detection_job_filter +EntitiesDetectionJobProperties,entities_detection_job_properties +EntitiesDetectionJobPropertiesList,entities_detection_job_properties_list +EntitledApplication,entitled_application +EntitledApplications,entitled_applications +Entitlement,entitlement +EntitlementAlreadyExistsException,entitlement_already_exists_exception +EntitlementArn,entitlement_arn +EntitlementAttribute,entitlement_attribute +EntitlementData,entitlement_data +EntitlementName,entitlement_name +EntitlementNotAllowedException,entitlement_not_allowed_exception +EntitlementNotFoundException,entitlement_not_found_exception +EntitlementStatus,entitlement_status +EntitlementUsage,entitlement_usage +EntitlementUsages,entitlement_usages +EntitlementValue,entitlement_value +Entitlements,entitlements +EntitlementsAllowed,entitlements_allowed +Entity,entity +EntityAccountFilter,entity_account_filter +EntityAggregate,entity_aggregate +EntityAlreadyExistsException,entity_already_exists_exception +EntityAlreadyRegisteredException,entity_already_registered_exception +EntityArn,entity_arn +EntityConfiguration,entity_configuration +EntityDescription,entity_description +EntityDetails,entity_details +EntityDetailsList,entity_details_list +EntityDetectorConfiguration,entity_detector_configuration +EntityDisplayData,entity_display_data +EntityDoesNotExistException,entity_does_not_exist_exception +EntityFilter,entity_filter +EntityId,entity_id +EntityIdList,entity_id_list +EntityIdentifier,entity_identifier +EntityIds,entity_ids +EntityInfo,entity_info +EntityItem,entity_item +EntityLabel,entity_label +EntityList,entity_list +EntityName,entity_name +EntityNotExistsException,entity_not_exists_exception +EntityNotFoundException,entity_not_found_exception +EntityPath,entity_path +EntityPersonaConfiguration,entity_persona_configuration +EntityPropertyReference,entity_property_reference +EntityRecognitionConfig,entity_recognition_config +EntityRecognizerAnnotations,entity_recognizer_annotations +EntityRecognizerArn,entity_recognizer_arn +EntityRecognizerDocuments,entity_recognizer_documents +EntityRecognizerEntityList,entity_recognizer_entity_list +EntityRecognizerEvaluationMetrics,entity_recognizer_evaluation_metrics +EntityRecognizerFilter,entity_recognizer_filter +EntityRecognizerInputDataConfig,entity_recognizer_input_data_config +EntityRecognizerMetadata,entity_recognizer_metadata +EntityRecognizerMetadataEntityTypesListItem,entity_recognizer_metadata_entity_types_list_item +EntityRecognizerOutputDataConfig,entity_recognizer_output_data_config +EntityRecognizerProperties,entity_recognizer_properties +EntityRecognizerPropertiesList,entity_recognizer_properties_list +EntityRecognizerSummariesList,entity_recognizer_summaries_list +EntityRecognizerSummary,entity_recognizer_summary +EntitySelectorExpression,entity_selector_expression +EntityStateException,entity_state_exception +EntitySummary,entity_summary +EntitySummaryList,entity_summary_list +EntitySynonyms,entity_synonyms +EntityTags,entity_tags +EntityTemporarilyUnmodifiableException,entity_temporarily_unmodifiable_exception +EntityType,entity_type +EntityTypes,entity_types +EntityTypesEvaluationMetrics,entity_types_evaluation_metrics +EntityTypesListItem,entity_types_list_item +EntityTypesToDetect,entity_types_to_detect +Entries,entries +EntropyEncoding,entropy_encoding +Entry,entry +EntryCount,entry_count +EntryPoint,entry_point +EnumDefinition,enum_definition +EnumValues,enum_values +EnumerationValue,enumeration_value +Environment,environment +EnvironmentAccountConnection,environment_account_connection +EnvironmentAccountConnectionSummary,environment_account_connection_summary +EnvironmentArn,environment_arn +EnvironmentClass,environment_class +EnvironmentDescription,environment_description +EnvironmentDescriptionsMessage,environment_descriptions_message +EnvironmentError,environment_error +EnvironmentFile,environment_file +EnvironmentFiles,environment_files +EnvironmentId,environment_id +EnvironmentIdentifier,environment_identifier +EnvironmentIds,environment_ids +EnvironmentImage,environment_image +EnvironmentInfo,environment_info +EnvironmentInfoDescription,environment_info_description +EnvironmentInformation,environment_information +EnvironmentLanguage,environment_language +EnvironmentLifecycle,environment_lifecycle +EnvironmentLink,environment_link +EnvironmentLinks,environment_links +EnvironmentMember,environment_member +EnvironmentName,environment_name +EnvironmentNames,environment_names +EnvironmentParameter,environment_parameter +EnvironmentParameterRanges,environment_parameter_ranges +EnvironmentParameters,environment_parameters +EnvironmentPlatform,environment_platform +EnvironmentProperties,environment_properties +EnvironmentPropertyDescriptions,environment_property_descriptions +EnvironmentPropertyUpdates,environment_property_updates +EnvironmentQuota,environment_quota +EnvironmentResourceDescription,environment_resource_description +EnvironmentResourceDescriptionsMessage,environment_resource_descriptions_message +EnvironmentResources,environment_resources +EnvironmentResourcesDescription,environment_resources_description +EnvironmentResponse,environment_response +EnvironmentState,environment_state +EnvironmentSummary,environment_summary +EnvironmentSummaryList,environment_summary_list +EnvironmentTemplate,environment_template +EnvironmentTemplateFilter,environment_template_filter +EnvironmentTemplateSummary,environment_template_summary +EnvironmentTemplateVersion,environment_template_version +EnvironmentTemplateVersionSummary,environment_template_version_summary +EnvironmentTier,environment_tier +EnvironmentVariable,environment_variable +EnvironmentVariables,environment_variables +EnvironmentVpc,environment_vpc +EnvironmentVpcList,environment_vpc_list +Environments,environments +EoCloudCover,eo_cloud_cover +EoCloudCoverInput,eo_cloud_cover_input +EphemeralStorage,ephemeral_storage +EphemerisDescription,ephemeris_description +EphemerisIdResponse,ephemeris_id_response +EphemerisItem,ephemeris_item +EphemerisMetaData,ephemeris_meta_data +EpisodeId,episode_id +Epoch,epoch +EpochLockingSettings,epoch_locking_settings +Epss,epss +EpssDetails,epss_details +EpssScore,epss_score +Eq,eq +Equals,equals +EqualsTo,equals_to +EqualsValue,equals_value +Equation,equation +Equipment,equipment +EquipmentDetection,equipment_detection +EquipmentDetections,equipment_detections +Error,error +ErrorArguments,error_arguments +ErrorAttribute,error_attribute +ErrorCachingMinTTL,error_caching_min_ttl +ErrorCategory,error_category +ErrorCause,error_cause +ErrorClearTimeMsec,error_clear_time_msec +ErrorCode,error_code +ErrorCodeReason,error_code_reason +ErrorCount,error_count +ErrorData,error_data +ErrorDescription,error_description +ErrorDetail,error_detail +ErrorDetailList,error_detail_list +ErrorDetails,error_details +ErrorDocument,error_document +ErrorEntries,error_entries +ErrorHandlingConfig,error_handling_config +ErrorId,error_id +ErrorInfo,error_info +ErrorInformation,error_information +ErrorList,error_list +ErrorMessage,error_message +ErrorMetric,error_metric +ErrorMetrics,error_metrics +ErrorName,error_name +ErrorOutputPrefix,error_output_prefix +ErrorPercentage,error_percentage +ErrorReason,error_reason +ErrorReportConfiguration,error_report_configuration +ErrorReportLocation,error_report_location +ErrorResponse,error_response +ErrorRetryDuration,error_retry_duration +ErrorRootCause,error_root_cause +ErrorRootCauseEntity,error_root_cause_entity +ErrorRootCauseService,error_root_cause_service +ErrorRootCauses,error_root_causes +ErrorStatistics,error_statistics +ErrorString,error_string +ErrorTimestamp,error_timestamp +ErrorTopic,error_topic +ErrorType,error_type +ErrorValue,error_value +ErroredActions,errored_actions +Errors,errors +ErrorsListItem,errors_list_item +EsRateInPes,es_rate_in_pes +Esam,esam +EsamManifestConfirmConditionNotification,esam_manifest_confirm_condition_notification +EsamSettings,esam_settings +EsamSignalProcessingNotification,esam_signal_processing_notification +EscapeChar,escape_char +Escaper,escaper +Esps,esps +Essential,essential +Established,established +EstablishedMultiRegionAccessPointPolicy,established_multi_region_access_point_policy +EstimateByTime,estimate_by_time +EstimateTemplateCostInput,estimate_template_cost_input +EstimateTemplateCostOutput,estimate_template_cost_output +Estimated,estimated +EstimatedAverageCoverage,estimated_average_coverage +EstimatedAverageUtilization,estimated_average_utilization +EstimatedBreakEvenInMonths,estimated_break_even_in_months +EstimatedBytesToTransfer,estimated_bytes_to_transfer +EstimatedCompletionTime,estimated_completion_time +EstimatedCoverage,estimated_coverage +EstimatedDataToScanBytes,estimated_data_to_scan_bytes +EstimatedDiskUtilizationPercent,estimated_disk_utilization_percent +EstimatedEvaluationTimeRemainingInMinutes,estimated_evaluation_time_remaining_in_minutes +EstimatedFilesToDelete,estimated_files_to_delete +EstimatedFilesToTransfer,estimated_files_to_transfer +EstimatedInstanceWarmup,estimated_instance_warmup +EstimatedMonthlyCost,estimated_monthly_cost +EstimatedMonthlyOnDemandCost,estimated_monthly_on_demand_cost +EstimatedMonthlySavings,estimated_monthly_savings +EstimatedMonthlySavingsAmount,estimated_monthly_savings_amount +EstimatedMonthlySavingsPercentage,estimated_monthly_savings_percentage +EstimatedMonthlyStorageCost,estimated_monthly_storage_cost +EstimatedNewCommitmentUtilization,estimated_new_commitment_utilization +EstimatedNumberOfUsers,estimated_number_of_users +EstimatedOnDemandCost,estimated_on_demand_cost +EstimatedOnDemandCostWithCurrentCommitment,estimated_on_demand_cost_with_current_commitment +EstimatedProgress,estimated_progress +EstimatedROI,estimated_roi +EstimatedReservationCostForLookbackPeriod,estimated_reservation_cost_for_lookback_period +EstimatedResourceSize,estimated_resource_size +EstimatedSPCost,estimated_sp_cost +EstimatedSavingsAmount,estimated_savings_amount +EstimatedSavingsPercentage,estimated_savings_percentage +EstimatedSecondsToCompletion,estimated_seconds_to_completion +EstimatedTimeRemainingInMinutes,estimated_time_remaining_in_minutes +EstimatedTimeToCompletionInSeconds,estimated_time_to_completion_in_seconds +EstimatedTotalCost,estimated_total_cost +EstimatedTotalMonthlySavingsAmount,estimated_total_monthly_savings_amount +EstimatedUpdateTime,estimated_update_time +EstimatedWaitTime,estimated_wait_time +Etag,etag +Ethereum,ethereum +Ethernet0,ethernet0 +Ethernet0Status,ethernet0_status +Ethernet1,ethernet1 +Ethernet1Status,ethernet1_status +EthernetPayload,ethernet_payload +EthernetStatus,ethernet_status +EtvPlatformPid,etv_platform_pid +EtvSignalPid,etv_signal_pid +Euid,euid +Eula,eula +EulaAcceptance,eula_acceptance +EutranCid,eutran_cid +EvalActionName,eval_action_name +EvalDecision,eval_decision +EvalDecisionDetails,eval_decision_details +EvalResourceDecision,eval_resource_decision +EvalResourceName,eval_resource_name +EvaluateCodeErrorDetail,evaluate_code_error_detail +EvaluateCodeRequest,evaluate_code_request +EvaluateCodeResponse,evaluate_code_response +EvaluateDataQuality,evaluate_data_quality +EvaluateDataQualityMultiFrame,evaluate_data_quality_multi_frame +EvaluateExpressionInput,evaluate_expression_input +EvaluateExpressionOutput,evaluate_expression_output +EvaluateFeatureRequest,evaluate_feature_request +EvaluateFeatureResponse,evaluate_feature_response +EvaluateLowSampleCountPercentile,evaluate_low_sample_count_percentile +EvaluateMappingTemplateRequest,evaluate_mapping_template_request +EvaluateMappingTemplateResponse,evaluate_mapping_template_response +EvaluateOnExit,evaluate_on_exit +EvaluatePullRequestApprovalRulesInput,evaluate_pull_request_approval_rules_input +EvaluatePullRequestApprovalRulesOutput,evaluate_pull_request_approval_rules_output +EvaluateSessionRequest,evaluate_session_request +EvaluateSessionResponse,evaluate_session_response +EvaluateTargetHealth,evaluate_target_health +EvaluatedExternalModel,evaluated_external_model +EvaluatedMetrics,evaluated_metrics +EvaluatedModelArn,evaluated_model_arn +EvaluatedModelMetrics,evaluated_model_metrics +EvaluatedModelVersion,evaluated_model_version +EvaluatedRule,evaluated_rule +Evaluation,evaluation +EvaluationAnswerInput,evaluation_answer_input +EvaluationAnswerOutput,evaluation_answer_output +EvaluationArn,evaluation_arn +EvaluationContext,evaluation_context +EvaluationContextIdentifier,evaluation_context_identifier +EvaluationDataEndTime,evaluation_data_end_time +EvaluationDataSourceId,evaluation_data_source_id +EvaluationDataStartTime,evaluation_data_start_time +EvaluationEndTimestamp,evaluation_end_timestamp +EvaluationErrorItem,evaluation_error_item +EvaluationForm,evaluation_form +EvaluationFormArn,evaluation_form_arn +EvaluationFormContent,evaluation_form_content +EvaluationFormId,evaluation_form_id +EvaluationFormNumericQuestionOption,evaluation_form_numeric_question_option +EvaluationFormNumericQuestionProperties,evaluation_form_numeric_question_properties +EvaluationFormQuestion,evaluation_form_question +EvaluationFormScoringStrategy,evaluation_form_scoring_strategy +EvaluationFormSection,evaluation_form_section +EvaluationFormSingleSelectQuestionAutomation,evaluation_form_single_select_question_automation +EvaluationFormSingleSelectQuestionOption,evaluation_form_single_select_question_option +EvaluationFormSingleSelectQuestionProperties,evaluation_form_single_select_question_properties +EvaluationFormSummary,evaluation_form_summary +EvaluationFormSummaryList,evaluation_form_summary_list +EvaluationFormTitle,evaluation_form_title +EvaluationFormVersion,evaluation_form_version +EvaluationFormVersionSummary,evaluation_form_version_summary +EvaluationFormVersionSummaryList,evaluation_form_version_summary_list +EvaluationId,evaluation_id +EvaluationLimitExceeded,evaluation_limit_exceeded +EvaluationManifest,evaluation_manifest +EvaluationManifestS3Prefix,evaluation_manifest_s3_prefix +EvaluationMessage,evaluation_message +EvaluationMetadata,evaluation_metadata +EvaluationMetrics,evaluation_metrics +EvaluationMode,evaluation_mode +EvaluationModeConfiguration,evaluation_mode_configuration +EvaluationModes,evaluation_modes +EvaluationName,evaluation_name +EvaluationNote,evaluation_note +EvaluationParameters,evaluation_parameters +EvaluationPeriod,evaluation_period +EvaluationPeriods,evaluation_periods +EvaluationRequest,evaluation_request +EvaluationResult,evaluation_result +EvaluationResultIdentifier,evaluation_result_identifier +EvaluationResultQualifier,evaluation_result_qualifier +EvaluationResults,evaluation_results +EvaluationRule,evaluation_rule +EvaluationScore,evaluation_score +EvaluationStartDate,evaluation_start_date +EvaluationStartTimestamp,evaluation_start_timestamp +EvaluationState,evaluation_state +EvaluationStatus,evaluation_status +EvaluationSummary,evaluation_summary +EvaluationSummaryList,evaluation_summary_list +EvaluationTime,evaluation_time +EvaluationTimeout,evaluation_timeout +EvaluationType,evaluation_type +EvaluationWaitTime,evaluation_wait_time +Evaluations,evaluations +EvaluatorArn,evaluator_arn +Event,event +EventAccountFilter,event_account_filter +EventAction,event_action +EventActionArn,event_action_arn +EventActionEntry,event_action_entry +EventActionId,event_action_id +EventActions,event_actions +EventAggregate,event_aggregate +EventArn,event_arn +EventBatchingCondition,event_batching_condition +EventBridge,event_bridge +EventBridgeAction,event_bridge_action +EventBridgeActionDefinition,event_bridge_action_definition +EventBridgeBus,event_bridge_bus +EventBridgeConfiguration,event_bridge_configuration +EventBridgeDataSourceConfig,event_bridge_data_source_config +EventBridgeDestinationProperties,event_bridge_destination_properties +EventBridgeEnabled,event_bridge_enabled +EventBridgeEventBusParameters,event_bridge_event_bus_parameters +EventBridgeParameters,event_bridge_parameters +EventBridgeRuleName,event_bridge_rule_name +EventBus,event_bus +EventBusArn,event_bus_arn +EventBusName,event_bus_name +EventBuses,event_buses +EventCategories,event_categories +EventCategoriesList,event_categories_list +EventCategoriesMap,event_categories_map +EventCategoriesMapList,event_categories_map_list +EventCategoriesMessage,event_categories_message +EventCategory,event_category +EventCategoryGroup,event_category_group +EventCategoryGroupList,event_category_group_list +EventClass,event_class +EventCode,event_code +EventCondition,event_condition +EventConfigurationItem,event_configuration_item +EventConfigurationsList,event_configurations_list +EventContextData,event_context_data +EventContextDataType,event_context_data_type +EventCount,event_count +EventDataStore,event_data_store +EventDataStoreARNInvalidException,event_data_store_arn_invalid_exception +EventDataStoreAlreadyExistsException,event_data_store_already_exists_exception +EventDataStoreArn,event_data_store_arn +EventDataStoreHasOngoingImportException,event_data_store_has_ongoing_import_exception +EventDataStoreMaxLimitExceededException,event_data_store_max_limit_exceeded_exception +EventDataStoreNotFoundException,event_data_store_not_found_exception +EventDataStoreTerminationProtectedException,event_data_store_termination_protected_exception +EventDataStores,event_data_stores +EventDate,event_date +EventDescription,event_description +EventDescriptionsMessage,event_descriptions_message +EventDestination,event_destination +EventDestinationAlreadyExistsException,event_destination_already_exists_exception +EventDestinationDefinition,event_destination_definition +EventDestinationDoesNotExistException,event_destination_does_not_exist_exception +EventDestinationName,event_destination_name +EventDestinations,event_destinations +EventDetail,event_detail +EventDetails,event_details +EventDetailsErrorItem,event_details_error_item +EventDimensions,event_dimensions +EventDurationInSeconds,event_duration_in_seconds +EventEndTime,event_end_time +EventFeedback,event_feedback +EventFeedbackType,event_feedback_type +EventFilter,event_filter +EventFirstSeen,event_first_seen +EventId,event_id +EventIdMode,event_id_mode +EventIncludedData,event_included_data +EventInfo,event_info +EventInfoMap,event_info_map +EventInformation,event_information +EventIngestionUrl,event_ingestion_url +EventIntegration,event_integration +EventIntegrationArn,event_integration_arn +EventIntegrationAssociation,event_integration_association +EventIntegrationAssociationArn,event_integration_association_arn +EventIntegrationAssociationId,event_integration_association_id +EventIntegrationAssociations,event_integration_associations +EventIntegrationName,event_integration_name +EventIntegrations,event_integrations +EventItemResponse,event_item_response +EventLastReplayedTime,event_last_replayed_time +EventLastSeen,event_last_seen +EventList,event_list +EventLog,event_log +EventLogEntry,event_log_entry +EventName,event_name +EventNotificationItemConfigurations,event_notification_item_configurations +EventObject,event_object +EventOrchestration,event_orchestration +EventParameters,event_parameters +EventPattern,event_pattern +EventPayload,event_payload +EventPredictionSummary,event_prediction_summary +EventQueueArn,event_queue_arn +EventResource,event_resource +EventResourceARN,event_resource_arn +EventResourceName,event_resource_name +EventResourceType,event_resource_type +EventResponse,event_response +EventRisk,event_risk +EventRiskType,event_risk_type +EventSelector,event_selector +EventSelectors,event_selectors +EventSource,event_source +EventSourceArn,event_source_arn +EventSourceId,event_source_id +EventSourceMappingConfiguration,event_source_mapping_configuration +EventSourceMappings,event_source_mappings +EventSourceName,event_source_name +EventSourceToken,event_source_token +EventSources,event_sources +EventSourcesConfig,event_sources_config +EventStartCondition,event_start_condition +EventStartTime,event_start_time +EventStatus,event_status +EventStopBehavior,event_stop_behavior +EventStream,event_stream +EventStreamArn,event_stream_arn +EventStreamDestinationDetails,event_stream_destination_details +EventStreamName,event_stream_name +EventStreamSummary,event_stream_summary +EventSubType,event_sub_type +EventSubscription,event_subscription +EventSubscriptionArn,event_subscription_arn +EventSubscriptionQuotaExceededFault,event_subscription_quota_exceeded_fault +EventSubscriptionsList,event_subscriptions_list +EventSubscriptionsMessage,event_subscriptions_message +EventSummary,event_summary +EventTaggingEnabled,event_tagging_enabled +EventThreshold,event_threshold +EventTime,event_time +EventTimeFeatureName,event_time_feature_name +EventTimeRange,event_time_range +EventTopic,event_topic +EventTopics,event_topics +EventTracker,event_tracker +EventTrackerSummary,event_tracker_summary +EventTriggerDefinition,event_trigger_definition +EventTriggers,event_triggers +EventType,event_type +EventTypeFilter,event_type_filter +EventTypeId,event_type_id +EventTypeIds,event_type_ids +EventTypeName,event_type_name +EventTypeSummary,event_type_summary +EventTypes,event_types +EventVariableSummary,event_variable_summary +Events,events +EventsBatch,events_batch +EventsCompleted,events_completed +EventsConfiguration,events_configuration +EventsDetectionJobFilter,events_detection_job_filter +EventsDetectionJobProperties,events_detection_job_properties +EventsDetectionJobPropertiesList,events_detection_job_properties_list +EventsItemResponse,events_item_response +EventsMatched,events_matched +EventsMessage,events_message +EventsPollInterval,events_poll_interval +EventsRequest,events_request +EventsResponse,events_response +EventsScanned,events_scanned +Evidence,evidence +EvidenceFinderEnablement,evidence_finder_enablement +EvidenceInsights,evidence_insights +EwsAvailabilityProvider,ews_availability_provider +EwsEndpoint,ews_endpoint +EwsPassword,ews_password +EwsProvider,ews_provider +EwsUsername,ews_username +ExactCidrMatches,exact_cidr_matches +ExactFramerate,exact_framerate +ExactSettings,exact_settings +Example,example +ExampleError,example_error +ExasolParameters,exasol_parameters +ExceedsLimitException,exceeds_limit_exception +Excel,excel +ExcelOptions,excel_options +ExceptionCause,exception_cause +ExceptionDescription,exception_description +ExceptionName,exception_name +ExceptionResponse,exception_response +ExceptionType,exception_type +Exceptions,exceptions +ExcessCapacityTerminationPolicy,excess_capacity_termination_policy +ExchangeCodeForTokenRequest,exchange_code_for_token_request +ExchangeCodeForTokenRequestBody,exchange_code_for_token_request_body +ExchangeCodeForTokenResponse,exchange_code_for_token_response +ExchangeId,exchange_id +ExchangedReservedNode,exchanged_reserved_node +Exclude,exclude +ExcludeArchived,exclude_archived +ExcludeAttachmentFilePatterns,exclude_attachment_file_patterns +ExcludeBootVolume,exclude_boot_volume +ExcludeCharacters,exclude_characters +ExcludeColumnSchema,exclude_column_schema +ExcludeCompliantResources,exclude_compliant_resources +ExcludeDataVolumeIds,exclude_data_volume_ids +ExcludeDataVolumeTags,exclude_data_volume_tags +ExcludeDevicesDeployedInOtherStage,exclude_devices_deployed_in_other_stage +ExcludeFeaturesAttribute,exclude_features_attribute +ExcludeFilters,exclude_filters +ExcludeLowercase,exclude_lowercase +ExcludeManagementEventSources,exclude_management_event_sources +ExcludeMap,exclude_map +ExcludeMimeTypes,exclude_mime_types +ExcludeNumbers,exclude_numbers +ExcludePaths,exclude_paths +ExcludePeriodConfiguration,exclude_period_configuration +ExcludePunctuation,exclude_punctuation +ExcludeResourceTags,exclude_resource_tags +ExcludeRetainedVariantProperties,exclude_retained_variant_properties +ExcludeSharedDrives,exclude_shared_drives +ExcludeSpaces,exclude_spaces +ExcludeSpecifiedAccounts,exclude_specified_accounts +ExcludeSpecifiedOrganizationalUnits,exclude_specified_organizational_units +ExcludeUppercase,exclude_uppercase +ExcludeUserAccounts,exclude_user_accounts +ExcludeVerboseContent,exclude_verbose_content +ExcludedAccounts,excluded_accounts +ExcludedAttendeeIds,excluded_attendee_ids +ExcludedColumnNames,excluded_column_names +ExcludedCookies,excluded_cookies +ExcludedHeaders,excluded_headers +ExcludedInstanceTypes,excluded_instance_types +ExcludedMembers,excluded_members +ExcludedPages,excluded_pages +ExcludedRule,excluded_rule +ExcludedRules,excluded_rules +ExcludedTimeRanges,excluded_time_ranges +Excludes,excludes +Exclusion,exclusion +ExclusionByResourceTypes,exclusion_by_resource_types +ExclusionFileNamePatterns,exclusion_file_name_patterns +ExclusionFileTypePatterns,exclusion_file_type_patterns +ExclusionFolderNamePatterns,exclusion_folder_name_patterns +ExclusionPatterns,exclusion_patterns +ExclusionPreview,exclusion_preview +Exclusions,exclusions +ExclusiveEndBillingPeriod,exclusive_end_billing_period +ExclusiveEndTime,exclusive_end_time +ExclusiveStartApplicationName,exclusive_start_application_name +ExclusiveStartBackupArn,exclusive_start_backup_arn +ExclusiveStartDeliveryStreamName,exclusive_start_delivery_stream_name +ExclusiveStartDestinationId,exclusive_start_destination_id +ExclusiveStartGlobalTableName,exclusive_start_global_table_name +ExclusiveStartKey,exclusive_start_key +ExclusiveStartShardId,exclusive_start_shard_id +ExclusiveStartStreamArn,exclusive_start_stream_arn +ExclusiveStartStreamName,exclusive_start_stream_name +ExclusiveStartTableName,exclusive_start_table_name +ExclusiveStartTagKey,exclusive_start_tag_key +ExecArgs,exec_args +Executable,executable +ExecutableParameters,executable_parameters +ExecutablePath,executable_path +ExecutableSha256,executable_sha256 +ExecutableUsers,executable_users +ExecuteBudgetActionRequest,execute_budget_action_request +ExecuteBudgetActionResponse,execute_budget_action_response +ExecuteChangeSetInput,execute_change_set_input +ExecuteCommandConfiguration,execute_command_configuration +ExecuteCommandLogConfiguration,execute_command_log_configuration +ExecuteCommandRequest,execute_command_request +ExecuteCommandResponse,execute_command_response +ExecuteCommandSessionConfiguration,execute_command_session_configuration +ExecuteCoreNetworkChangeSetRequest,execute_core_network_change_set_request +ExecuteFastResetInput,execute_fast_reset_input +ExecuteFastResetOutput,execute_fast_reset_output +ExecuteGremlinExplainQueryInput,execute_gremlin_explain_query_input +ExecuteGremlinExplainQueryOutput,execute_gremlin_explain_query_output +ExecuteGremlinProfileQueryInput,execute_gremlin_profile_query_input +ExecuteGremlinProfileQueryOutput,execute_gremlin_profile_query_output +ExecuteGremlinQueryInput,execute_gremlin_query_input +ExecuteGremlinQueryOutput,execute_gremlin_query_output +ExecuteOpenCypherExplainQueryInput,execute_open_cypher_explain_query_input +ExecuteOpenCypherExplainQueryOutput,execute_open_cypher_explain_query_output +ExecuteOpenCypherQueryInput,execute_open_cypher_query_input +ExecuteOpenCypherQueryOutput,execute_open_cypher_query_output +ExecutePolicyType,execute_policy_type +ExecuteProvisionedProductPlanInput,execute_provisioned_product_plan_input +ExecuteProvisionedProductPlanOutput,execute_provisioned_product_plan_output +ExecuteProvisionedProductServiceActionInput,execute_provisioned_product_service_action_input +ExecuteProvisionedProductServiceActionOutput,execute_provisioned_product_service_action_output +ExecuteQueryRequest,execute_query_request +ExecuteQueryResponse,execute_query_response +ExecuteScheduledQueryRequest,execute_scheduled_query_request +ExecuteSqlRequest,execute_sql_request +ExecuteSqlResponse,execute_sql_response +ExecuteStatement,execute_statement +ExecuteStatementException,execute_statement_exception +ExecuteStatementInput,execute_statement_input +ExecuteStatementOutput,execute_statement_output +ExecuteStatementRequest,execute_statement_request +ExecuteStatementResponse,execute_statement_response +ExecuteStatementResult,execute_statement_result +ExecuteTimeout,execute_timeout +ExecuteToken,execute_token +ExecuteTransactionInput,execute_transaction_input +ExecuteTransactionOutput,execute_transaction_output +ExecutedBy,executed_by +ExecutedTime,executed_time +ExecutedVersion,executed_version +Execution,execution +ExecutionAbortedEventDetails,execution_aborted_event_details +ExecutionAlreadyExists,execution_already_exists +ExecutionClass,execution_class +ExecutionConfiguration,execution_configuration +ExecutionControls,execution_controls +ExecutionCount,execution_count +ExecutionDate,execution_date +ExecutionDetails,execution_details +ExecutionDoesNotExist,execution_does_not_exist +ExecutionElapsedTime,execution_elapsed_time +ExecutionEndDateTime,execution_end_date_time +ExecutionEndTime,execution_end_time +ExecutionEngine,execution_engine +ExecutionEngineConfig,execution_engine_config +ExecutionEngineId,execution_engine_id +ExecutionError,execution_error +ExecutionErrorDetails,execution_error_details +ExecutionFailedEventDetails,execution_failed_event_details +ExecutionId,execution_id +ExecutionLimitExceeded,execution_limit_exceeded +ExecutionList,execution_list +ExecutionListItem,execution_list_item +ExecutionMessage,execution_message +ExecutionMetrics,execution_metrics +ExecutionOrder,execution_order +ExecutionParameter,execution_parameter +ExecutionParameters,execution_parameters +ExecutionProperty,execution_property +ExecutionRecord,execution_record +ExecutionResult,execution_result +ExecutionResults,execution_results +ExecutionRole,execution_role +ExecutionRoleArn,execution_role_arn +ExecutionRoleIdentityConfig,execution_role_identity_config +ExecutionRoleName,execution_role_name +ExecutionStartDateTime,execution_start_date_time +ExecutionStartTime,execution_start_time +ExecutionStartedEventDetails,execution_started_event_details +ExecutionStatistics,execution_statistics +ExecutionStats,execution_stats +ExecutionStatus,execution_status +ExecutionStatusDetail,execution_status_detail +ExecutionStepResult,execution_step_result +ExecutionSucceededEventDetails,execution_succeeded_event_details +ExecutionSummary,execution_summary +ExecutionTime,execution_time +ExecutionTimeFilter,execution_time_filter +ExecutionTimeInMillis,execution_time_in_millis +ExecutionTimedOutEventDetails,execution_timed_out_event_details +ExecutionTimeout,execution_timeout +ExecutionTrigger,execution_trigger +ExecutionType,execution_type +Executions,executions +ExecutorConfiguration,executor_configuration +ExecutorId,executor_id +ExecutorSize,executor_size +ExecutorState,executor_state +ExecutorStateFilter,executor_state_filter +ExecutorType,executor_type +ExecutorsSummary,executors_summary +ExistingEnrollmentAction,existing_enrollment_action +ExistingHourlyCommitment,existing_hourly_commitment +ExistingObjectReplication,existing_object_replication +ExistingVersion,existing_version +Exists,exists +ExitCode,exit_code +ExitMessage,exit_message +ExitStandbyAnswer,exit_standby_answer +ExitStandbyQuery,exit_standby_query +Expected,expected +ExpectedAttributeValue,expected_attribute_value +ExpectedBucketOwner,expected_bucket_owner +ExpectedCompletionDate,expected_completion_date +ExpectedCompletionTimeMinutes,expected_completion_time_minutes +ExpectedFirewallEndpoint,expected_firewall_endpoint +ExpectedFirewallSubnetId,expected_firewall_subnet_id +ExpectedFirewallSubnetRoutes,expected_firewall_subnet_routes +ExpectedInternetGatewayRoutes,expected_internet_gateway_routes +ExpectedManifestBucketOwner,expected_manifest_bucket_owner +ExpectedNextSnapshotScheduleTime,expected_next_snapshot_schedule_time +ExpectedNextSnapshotScheduleTimeStatus,expected_next_snapshot_schedule_time_status +ExpectedPolicyDescription,expected_policy_description +ExpectedProperties,expected_properties +ExpectedResourceUtilization,expected_resource_utilization +ExpectedRoute,expected_route +ExpectedRouteTable,expected_route_table +ExpectedRoutes,expected_routes +ExpectedSourceBucketOwner,expected_source_bucket_owner +ExpectedValue,expected_value +ExpenseCurrency,expense_currency +ExpenseDetection,expense_detection +ExpenseDocument,expense_document +ExpenseDocuments,expense_documents +ExpenseField,expense_field +ExpenseGroupProperty,expense_group_property +ExpenseIndex,expense_index +ExpenseType,expense_type +ExperienceConfiguration,experience_configuration +ExperienceEndpoint,experience_endpoint +ExperienceEntitiesSummary,experience_entities_summary +ExperienceScore,experience_score +ExperiencesSummary,experiences_summary +Experiment,experiment +ExperimentAction,experiment_action +ExperimentActionState,experiment_action_state +ExperimentArn,experiment_arn +ExperimentCloudWatchLogsLogConfiguration,experiment_cloud_watch_logs_log_configuration +ExperimentConfig,experiment_config +ExperimentExecution,experiment_execution +ExperimentLogConfiguration,experiment_log_configuration +ExperimentName,experiment_name +ExperimentReport,experiment_report +ExperimentResultsData,experiment_results_data +ExperimentS3LogConfiguration,experiment_s3_log_configuration +ExperimentSchedule,experiment_schedule +ExperimentSource,experiment_source +ExperimentState,experiment_state +ExperimentStopCondition,experiment_stop_condition +ExperimentSummaries,experiment_summaries +ExperimentSummary,experiment_summary +ExperimentTarget,experiment_target +ExperimentTargetFilter,experiment_target_filter +ExperimentTemplate,experiment_template +ExperimentTemplateAction,experiment_template_action +ExperimentTemplateCloudWatchLogsLogConfiguration,experiment_template_cloud_watch_logs_log_configuration +ExperimentTemplateCloudWatchLogsLogConfigurationInput,experiment_template_cloud_watch_logs_log_configuration_input +ExperimentTemplateLogConfiguration,experiment_template_log_configuration +ExperimentTemplateS3LogConfiguration,experiment_template_s3_log_configuration +ExperimentTemplateS3LogConfigurationInput,experiment_template_s3_log_configuration_input +ExperimentTemplateStopCondition,experiment_template_stop_condition +ExperimentTemplateSummary,experiment_template_summary +ExperimentTemplateTarget,experiment_template_target +ExperimentTemplateTargetFilter,experiment_template_target_filter +ExperimentTemplateTargetInputFilter,experiment_template_target_input_filter +Expiration,expiration +ExpirationCriterion,expiration_criterion +ExpirationDate,expiration_date +ExpirationDays,expiration_days +ExpirationInDays,expiration_in_days +ExpirationModel,expiration_model +ExpirationSettings,expiration_settings +ExpirationTime,expiration_time +ExpirationTimeResponse,expiration_time_response +ExpirationTimestamp,expiration_timestamp +ExpireAt,expire_at +ExpirePasswords,expire_passwords +ExpireSessionRequest,expire_session_request +ExpireTime,expire_time +Expired,expired +ExpiredAt,expired_at +ExpiredCodeException,expired_code_exception +ExpiredException,expired_exception +ExpiredImportTokenException,expired_import_token_exception +ExpiredIteratorException,expired_iterator_exception +ExpiredNextTokenException,expired_next_token_exception +ExpiredObjectDeleteMarker,expired_object_delete_marker +ExpiredStreamException,expired_stream_exception +ExpiredTokenException,expired_token_exception +Expires,expires +ExpiresAfter,expires_after +ExpiresAt,expires_at +ExpiresIn,expires_in +ExpiresInSeconds,expires_in_seconds +ExpiringVersion,expiring_version +Expiry,expiry +ExpiryDateTime,expiry_date_time +ExpiryEvents,expiry_events +ExpiryEventsConfiguration,expiry_events_configuration +ExpiryMinutes,expiry_minutes +ExpiryTime,expiry_time +ExpiryTimestamp,expiry_timestamp +ExplainPredictor,explain_predictor +Explainabilities,explainabilities +Explainability,explainability +ExplainabilityArn,explainability_arn +ExplainabilityConfig,explainability_config +ExplainabilityExportArn,explainability_export_arn +ExplainabilityExportName,explainability_export_name +ExplainabilityExportSummary,explainability_export_summary +ExplainabilityExports,explainability_exports +ExplainabilityInfo,explainability_info +ExplainabilityName,explainability_name +ExplainabilitySummary,explainability_summary +ExplainerConfig,explainer_config +Explanation,explanation +ExplanationCode,explanation_code +Explanations,explanations +ExplicitAuthFlows,explicit_auth_flows +ExplicitDeny,explicit_deny +ExplicitHashKey,explicit_hash_key +ExplicitHierarchy,explicit_hierarchy +ExplicitIds,explicit_ids +ExploitAvailable,exploit_available +ExploitObserved,exploit_observed +ExploitabilityDetails,exploitability_details +ExponentialRolloutRate,exponential_rollout_rate +Export,export +ExportApiRequest,export_api_request +ExportApiResponse,export_api_response +ExportArn,export_arn +ExportArtifacts,export_artifacts +ExportAssetToSignedUrl,export_asset_to_signed_url +ExportAssetToSignedUrlRequestDetails,export_asset_to_signed_url_request_details +ExportAssetToSignedUrlResponseDetails,export_asset_to_signed_url_response_details +ExportAssetsToS3,export_assets_to_s3 +ExportAssetsToS3RequestDetails,export_assets_to_s3_request_details +ExportAssetsToS3ResponseDetails,export_assets_to_s3_response_details +ExportAttributeName,export_attribute_name +ExportAutoScalingGroupRecommendationsRequest,export_auto_scaling_group_recommendations_request +ExportAutoScalingGroupRecommendationsResponse,export_auto_scaling_group_recommendations_response +ExportBackupPlanTemplateInput,export_backup_plan_template_input +ExportBackupPlanTemplateOutput,export_backup_plan_template_output +ExportBundleRequest,export_bundle_request +ExportBundleResult,export_bundle_result +ExportCertificateRequest,export_certificate_request +ExportCertificateResponse,export_certificate_response +ExportClientVpnClientCertificateRevocationListRequest,export_client_vpn_client_certificate_revocation_list_request +ExportClientVpnClientCertificateRevocationListResult,export_client_vpn_client_certificate_revocation_list_result +ExportClientVpnClientConfigurationRequest,export_client_vpn_client_configuration_request +ExportClientVpnClientConfigurationResult,export_client_vpn_client_configuration_result +ExportComponentsRequest,export_components_request +ExportComponentsResponse,export_components_response +ExportConfigurationsResponse,export_configurations_response +ExportConflictException,export_conflict_exception +ExportCreationTime,export_creation_time +ExportDataSource,export_data_source +ExportDescription,export_description +ExportDestination,export_destination +ExportEBSVolumeRecommendationsRequest,export_ebs_volume_recommendations_request +ExportEBSVolumeRecommendationsResponse,export_ebs_volume_recommendations_response +ExportEC2InstanceRecommendationsRequest,export_ec2_instance_recommendations_request +ExportEC2InstanceRecommendationsResponse,export_ec2_instance_recommendations_response +ExportECSServiceRecommendationsRequest,export_ecs_service_recommendations_request +ExportECSServiceRecommendationsResponse,export_ecs_service_recommendations_response +ExportEarthObservationJobInput,export_earth_observation_job_input +ExportEarthObservationJobOutput,export_earth_observation_job_output +ExportErrorData,export_error_data +ExportErrorDetails,export_error_details +ExportErrorDetailsOutput,export_error_details_output +ExportFilter,export_filter +ExportFormat,export_format +ExportFormsRequest,export_forms_request +ExportFormsResponse,export_forms_response +ExportFromTime,export_from_time +ExportHiddenFieldsOption,export_hidden_fields_option +ExportId,export_id +ExportImageRequest,export_image_request +ExportImageResult,export_image_result +ExportImageTask,export_image_task +ExportImageTaskId,export_image_task_id +ExportImageTaskIds,export_image_task_ids +ExportImageTasks,export_image_tasks +ExportInfo,export_info +ExportJobProperties,export_job_properties +ExportJobPropertiesList,export_job_properties_list +ExportJobRequest,export_job_request +ExportJobResource,export_job_resource +ExportJobResponse,export_job_response +ExportJobSummary,export_job_summary +ExportJobs,export_jobs +ExportJobsResponse,export_jobs_response +ExportJournalToS3Request,export_journal_to_s3_request +ExportJournalToS3Response,export_journal_to_s3_response +ExportKeyIdentifier,export_key_identifier +ExportKeyInput,export_key_input +ExportKeyOutput,export_key_output +ExportLabelsTaskRunProperties,export_labels_task_run_properties +ExportLambdaFunctionRecommendationsRequest,export_lambda_function_recommendations_request +ExportLambdaFunctionRecommendationsResponse,export_lambda_function_recommendations_response +ExportLensInput,export_lens_input +ExportLensOutput,export_lens_output +ExportLicenseRecommendationsRequest,export_license_recommendations_request +ExportLicenseRecommendationsResponse,export_license_recommendations_response +ExportManifest,export_manifest +ExportMetadataModelAssessmentMessage,export_metadata_model_assessment_message +ExportMetadataModelAssessmentResponse,export_metadata_model_assessment_response +ExportMetadataModelAssessmentResultEntry,export_metadata_model_assessment_result_entry +ExportMetric,export_metric +ExportName,export_name +ExportNotFoundException,export_not_found_exception +ExportNotebookInput,export_notebook_input +ExportNotebookOutput,export_notebook_output +ExportOnly,export_only +ExportPath,export_path +ExportProjectRequest,export_project_request +ExportProjectResult,export_project_result +ExportReadSet,export_read_set +ExportReadSetDetail,export_read_set_detail +ExportReadSetFilter,export_read_set_filter +ExportReadSetJobDetail,export_read_set_job_detail +ExportResourceSpecification,export_resource_specification +ExportResponse,export_response +ExportResults,export_results +ExportRevisionToS3,export_revision_to_s3 +ExportRevisionsToS3,export_revisions_to_s3 +ExportRevisionsToS3RequestDetails,export_revisions_to_s3_request_details +ExportRevisionsToS3ResponseDetails,export_revisions_to_s3_response_details +ExportS3DataInput,export_s3_data_input +ExportSchemaRequest,export_schema_request +ExportSchemaResponse,export_schema_response +ExportServerEngineAttributeRequest,export_server_engine_attribute_request +ExportServerEngineAttributeResponse,export_server_engine_attribute_response +ExportServerSideEncryption,export_server_side_encryption +ExportSnapshotRecord,export_snapshot_record +ExportSnapshotRecordSourceInfo,export_snapshot_record_source_info +ExportSnapshotRequest,export_snapshot_request +ExportSnapshotResult,export_snapshot_result +ExportSortBy,export_sort_by +ExportSourceImages,export_source_images +ExportSourceNetworkCfnTemplateRequest,export_source_network_cfn_template_request +ExportSourceNetworkCfnTemplateResponse,export_source_network_cfn_template_response +ExportSourceType,export_source_type +ExportSqlDetails,export_sql_details +ExportStatistics,export_statistics +ExportStatus,export_status +ExportSummaries,export_summaries +ExportSummary,export_summary +ExportTableToPointInTimeInput,export_table_to_point_in_time_input +ExportTableToPointInTimeOutput,export_table_to_point_in_time_output +ExportTask,export_task +ExportTaskAlreadyExistsFault,export_task_already_exists_fault +ExportTaskError,export_task_error +ExportTaskExecutionInfo,export_task_execution_info +ExportTaskId,export_task_id +ExportTaskIdentifier,export_task_identifier +ExportTaskIds,export_task_ids +ExportTaskNotFoundFault,export_task_not_found_fault +ExportTaskS3Location,export_task_s3_location +ExportTaskS3LocationRequest,export_task_s3_location_request +ExportTaskStatus,export_task_status +ExportTaskSummary,export_task_summary +ExportTasks,export_tasks +ExportTasksMessage,export_tasks_message +ExportThemesRequest,export_themes_request +ExportThemesResponse,export_themes_response +ExportTime,export_time +ExportToCSVOption,export_to_csv_option +ExportToS3Task,export_to_s3_task +ExportToS3TaskSpecification,export_to_s3_task_specification +ExportToTime,export_to_time +ExportToken,export_token +ExportTr31KeyBlock,export_tr31_key_block +ExportTr34KeyBlock,export_tr34_key_block +ExportTransitGatewayRoutesRequest,export_transit_gateway_routes_request +ExportTransitGatewayRoutesResult,export_transit_gateway_routes_result +ExportType,export_type +ExportVectorEnrichmentJobInput,export_vector_enrichment_job_input +ExportVectorEnrichmentJobOutput,export_vector_enrichment_job_output +ExportVectorEnrichmentJobOutputConfig,export_vector_enrichment_job_output_config +ExportVersion,export_version +ExportViewType,export_view_type +ExportWithHiddenFieldsOption,export_with_hidden_fields_option +Exportable,exportable +ExportableKey,exportable_key +ExportableLogTypes,exportable_log_types +Exported,exported +ExportedEnvironmentVariable,exported_environment_variable +ExportedRecordsCount,exported_records_count +ExportingConfig,exporting_config +ExportingLocation,exporting_location +ExportingStackId,exporting_stack_id +Exports,exports +ExposeHeaders,expose_headers +Expression,expression +ExpressionAttributeNames,expression_attribute_names +ExpressionAttributeValues,expression_attribute_values +ExpressionName,expression_name +ExpressionNames,expression_names +ExpressionStatus,expression_status +ExpressionType,expression_type +ExpressionValue,expression_value +ExpressionVariable,expression_variable +Expressions,expressions +ExtendLicenseConsumptionRequest,extend_license_consumption_request +ExtendLicenseConsumptionResponse,extend_license_consumption_response +ExtendTransactionRequest,extend_transaction_request +ExtendedDataServices,extended_data_services +ExtendedKeyUsage,extended_key_usage +ExtendedKeyUsageObjectIdentifier,extended_key_usage_object_identifier +ExtendedKeyUsageType,extended_key_usage_type +ExtendedKeyUsages,extended_key_usages +ExtendedS3DestinationConfiguration,extended_s3_destination_configuration +ExtendedS3DestinationDescription,extended_s3_destination_description +ExtendedS3DestinationUpdate,extended_s3_destination_update +ExtendedStatistic,extended_statistic +ExtendedStatistics,extended_statistics +Extension,extension +ExtensionArn,extension_arn +ExtensionAssociation,extension_association +ExtensionAssociationId,extension_association_id +ExtensionAssociationSummary,extension_association_summary +ExtensionAssociations,extension_associations +ExtensionDetails,extension_details +ExtensionField,extension_field +ExtensionFields,extension_fields +ExtensionId,extension_id +ExtensionIdentifier,extension_identifier +ExtensionSummary,extension_summary +ExtensionVersion,extension_version +ExtensionVersionDetails,extension_version_details +ExtensionVersionNumber,extension_version_number +ExtensionVersions,extension_versions +Extensions,extensions +ExtensionsV2,extensions_v2 +ExtensionsV3,extensions_v3 +ExtensionsV4,extensions_v4 +ExternalAudioFileInput,external_audio_file_input +ExternalDataFilteringAllowList,external_data_filtering_allow_list +ExternalEvaluation,external_evaluation +ExternalEventsDetail,external_events_detail +ExternalId,external_id +ExternalIds,external_ids +ExternalImageId,external_image_id +ExternalLoginFederationProviderType,external_login_federation_provider_type +ExternalLoginFederationProviderUrl,external_login_federation_provider_url +ExternalLoginId,external_login_id +ExternalMeetingId,external_meeting_id +ExternalMetricStatus,external_metric_status +ExternalMetricsPreference,external_metrics_preference +ExternalModel,external_model +ExternalModelOutputs,external_model_outputs +ExternalModelSummary,external_model_summary +ExternalServiceException,external_service_exception +ExternalSourceSetting,external_source_setting +ExternalTableDefinition,external_table_definition +ExternalUrlConfig,external_url_config +ExternalUserId,external_user_id +ExternalUserIds,external_user_ids +ExternalWorkflowExecutionCancelRequestedEventAttributes,external_workflow_execution_cancel_requested_event_attributes +ExternalWorkflowExecutionSignaledEventAttributes,external_workflow_execution_signaled_event_attributes +ExtraArchivedLogDestIds,extra_archived_log_dest_ids +ExtraConnectionAttributes,extra_connection_attributes +ExtraHosts,extra_hosts +ExtraJarsS3Path,extra_jars_s3_path +ExtraParam,extra_param +ExtraParams,extra_params +ExtraPythonLibsS3Path,extra_python_libs_s3_path +ExtractDocId,extract_doc_id +ExtractedCharacters,extracted_characters +ExtractedCharactersListItem,extracted_characters_list_item +Extraction,extraction +Extractions,extractions +EyeDirection,eye_direction +EyeOpen,eye_open +Eyeglasses,eyeglasses +EyesOpen,eyes_open +F1,f1 +F1Score,f1_score +F4vSettings,f4v_settings +FCntStart,f_cnt_start +FIAuthKey,fi_auth_key +FIPSEnabled,fips_enabled +FMSPolicyUpdateFirewallCreationConfigAction,fms_policy_update_firewall_creation_config_action +FNwkSIntKey,f_nwk_s_int_key +FPort,f_port +FPorts,f_ports +FQDN,fqdn +FSxWindowsFileServerAuthorizationConfig,f_sx_windows_file_server_authorization_config +FSxWindowsFileServerVolumeConfiguration,f_sx_windows_file_server_volume_configuration +Fabric,fabric +Face,face +FaceAttributes,face_attributes +FaceCount,face_count +FaceDetail,face_detail +FaceDetails,face_details +FaceDetection,face_detection +FaceId,face_id +FaceIds,face_ids +FaceMatch,face_match +FaceMatchThreshold,face_match_threshold +FaceMatches,face_matches +FaceModelVersion,face_model_version +FaceModelVersions,face_model_versions +FaceOccluded,face_occluded +FaceRecord,face_record +FaceRecords,face_records +FaceSearch,face_search +FaceSearchSettings,face_search_settings +Facebook,facebook +Faces,faces +Facet,facet +FacetAlreadyExistsException,facet_already_exists_exception +FacetAttribute,facet_attribute +FacetAttributeDefinition,facet_attribute_definition +FacetAttributeReference,facet_attribute_reference +FacetAttributeUpdate,facet_attribute_update +FacetEnabled,facet_enabled +FacetFilter,facet_filter +FacetInUseException,facet_in_use_exception +FacetName,facet_name +FacetNames,facet_names +FacetNotFoundException,facet_not_found_exception +FacetResult,facet_result +FacetResults,facet_results +FacetStyle,facet_style +FacetValidationException,facet_validation_exception +Facetable,facetable +Facets,facets +FactoryPresetFreqsList,factory_preset_freqs_list +FactorySupport,factory_support +FadeIn,fade_in +FadeOut,fade_out +Fail,fail +FailOnWarnings,fail_on_warnings +FailStepMetadata,fail_step_metadata +FailTasksOnLobTruncation,fail_tasks_on_lob_truncation +FailWorkflowExecutionDecisionAttributes,fail_workflow_execution_decision_attributes +FailWorkflowExecutionFailedEventAttributes,fail_workflow_execution_failed_event_attributes +Failed,failed +FailedAccount,failed_account +FailedActions,failed_actions +FailedAssociatedResources,failed_associated_resources +FailedBatchItem,failed_batch_item +FailedBatches,failed_batches +FailedCampaignStateResponse,failed_campaign_state_response +FailedCapacityReservationFleetCancellationResult,failed_capacity_reservation_fleet_cancellation_result +FailedCount,failed_count +FailedCreateAssociation,failed_create_association +FailedCreateSimulationJobRequest,failed_create_simulation_job_request +FailedCreateStandbyWorkspacesRequest,failed_create_standby_workspaces_request +FailedCreateWorkspaceRequest,failed_create_workspace_request +FailedCustomVocabularyItem,failed_custom_vocabulary_item +FailedDeleteRemediationExceptionsBatch,failed_delete_remediation_exceptions_batch +FailedDependencyException,failed_dependency_exception +FailedDisassociatedResources,failed_disassociated_resources +FailedDocuments,failed_documents +FailedEntity,failed_entity +FailedEntityList,failed_entity_list +FailedEntries,failed_entries +FailedEntryCount,failed_entry_count +FailedEvaluations,failed_evaluations +FailedFindings,failed_findings +FailedFleetCancellations,failed_fleet_cancellations +FailedImportedDeviceCount,failed_imported_device_count +FailedItem,failed_item +FailedItemDetails,failed_item_details +FailedItems,failed_items +FailedLoginAttempts,failed_login_attempts +FailedMemberAccountEc2DeepInspectionStatusState,failed_member_account_ec2_deep_inspection_status_state +FailedNonRetryableError,failed_non_retryable_error +FailedPieces,failed_pieces +FailedPutCount,failed_put_count +FailedQueuedPurchaseDeletion,failed_queued_purchase_deletion +FailedQueuedPurchaseDeletions,failed_queued_purchase_deletions +FailedReason,failed_reason +FailedRecordCount,failed_record_count +FailedRecordsCount,failed_records_count +FailedRecordsS3Url,failed_records_s3_url +FailedRemediationBatch,failed_remediation_batch +FailedRemediationExceptionBatch,failed_remediation_exception_batch +FailedRequest,failed_request +FailedRequests,failed_requests +FailedResource,failed_resource +FailedResourceAccessException,failed_resource_access_exception +FailedResourcesMap,failed_resources_map +FailedS3Resource,failed_s3_resource +FailedScheduledActions,failed_scheduled_actions +FailedScheduledUpdateGroupActionRequest,failed_scheduled_update_group_action_request +FailedScheduledUpdateGroupActions,failed_scheduled_update_group_actions +FailedServiceActionAssociation,failed_service_action_association +FailedServiceActionAssociations,failed_service_action_associations +FailedStackInstancesCount,failed_stack_instances_count +FailedStandbyRequests,failed_standby_requests +FailedStatusDetails,failed_status_details +FailedSteps,failed_steps +FailedUsers,failed_users +FailedWorkspaceChangeRequest,failed_workspace_change_request +Failover,failover +FailoverCondition,failover_condition +FailoverConditionSettings,failover_condition_settings +FailoverConditions,failover_conditions +FailoverConfig,failover_config +FailoverCriteria,failover_criteria +FailoverDBClusterMessage,failover_db_cluster_message +FailoverDBClusterResult,failover_db_cluster_result +FailoverGlobalClusterMessage,failover_global_cluster_message +FailoverGlobalClusterResult,failover_global_cluster_result +FailoverGlobalReplicationGroupMessage,failover_global_replication_group_message +FailoverGlobalReplicationGroupResult,failover_global_replication_group_result +FailoverMode,failover_mode +FailoverShardRequest,failover_shard_request +FailoverShardResponse,failover_shard_response +FailoverState,failover_state +Failure,failure +FailureAction,failure_action +FailureByQueryException,failure_by_query_exception +FailureCause,failure_cause +FailureCode,failure_code +FailureCodes,failure_codes +FailureDescription,failure_description +FailureDetails,failure_details +FailureException,failure_exception +FailureHandlingPolicy,failure_handling_policy +FailureInfo,failure_info +FailureLocation,failure_location +FailureMessage,failure_message +FailureMessages,failure_messages +FailureMode,failure_mode +FailurePolicy,failure_policy +FailureReason,failure_reason +FailureReasons,failure_reasons +FailureRedirectionURL,failure_redirection_url +FailureResource,failure_resource +FailureRetentionPeriodInDays,failure_retention_period_in_days +FailureStage,failure_stage +FailureStrings,failure_strings +FailureSummary,failure_summary +FailureThreshold,failure_threshold +FailureTime,failure_time +FailureToleranceCount,failure_tolerance_count +FailureTolerancePercentage,failure_tolerance_percentage +FailureType,failure_type +FailureValues,failure_values +Failures,failures +FairsharePolicy,fairshare_policy +FallBackPhoneNumber,fall_back_phone_number +FallbackAction,fallback_action +FallbackBehavior,fallback_behavior +FallbackFont,fallback_font +FalseActivity,false_activity +FalseyCellValue,falsey_cell_value +FalseyCellValueSynonyms,falsey_cell_value_synonyms +Family,family +FamilyName,family_name +FaqIds,faq_ids +FaqStatistics,faq_statistics +FaqSummary,faq_summary +FaqSummaryItems,faq_summary_items +FargatePlatformConfiguration,fargate_platform_configuration +FargateProfile,fargate_profile +FargateProfileSelector,fargate_profile_selector +FastLaunchConfiguration,fast_launch_configuration +FastLaunchImages,fast_launch_images +FastLaunchLaunchTemplateSpecification,fast_launch_launch_template_specification +FastLaunchLaunchTemplateSpecificationRequest,fast_launch_launch_template_specification_request +FastLaunchLaunchTemplateSpecificationResponse,fast_launch_launch_template_specification_response +FastLaunchSnapshotConfiguration,fast_launch_snapshot_configuration +FastLaunchSnapshotConfigurationRequest,fast_launch_snapshot_configuration_request +FastLaunchSnapshotConfigurationResponse,fast_launch_snapshot_configuration_response +FastResetToken,fast_reset_token +FastRestoreRule,fast_restore_rule +FastRestored,fast_restored +FastSnapshotRestoreStateErrors,fast_snapshot_restore_state_errors +FastSnapshotRestores,fast_snapshot_restores +Fault,fault +FaultCode,fault_code +FaultCodes,fault_codes +FaultCount,fault_count +FaultCountHigh,fault_count_high +FaultCountLow,fault_count_low +FaultRootCause,fault_root_cause +FaultRootCauseEntity,fault_root_cause_entity +FaultRootCauseService,fault_root_cause_service +FaultRootCauses,fault_root_causes +FaultStatistics,fault_statistics +FaultTolerance,fault_tolerance +FavoritePages,favorite_pages +Fax,fax +Feature,feature +FeatureActivations,feature_activations +FeatureAdditions,feature_additions +FeatureConfigurations,feature_configurations +FeatureDefinition,feature_definition +FeatureDefinitions,feature_definitions +FeatureGroup,feature_group +FeatureGroupArn,feature_group_arn +FeatureGroupName,feature_group_name +FeatureGroupStatus,feature_group_status +FeatureGroupStatusEquals,feature_group_status_equals +FeatureGroupSummaries,feature_group_summaries +FeatureGroupSummary,feature_group_summary +FeatureHeaders,feature_headers +FeatureMetadata,feature_metadata +FeatureName,feature_name +FeatureNames,feature_names +FeatureNotAvailableException,feature_not_available_exception +FeatureParameter,feature_parameter +FeatureSet,feature_set +FeatureSpecificationS3Uri,feature_specification_s3_uri +FeatureStoreOutput,feature_store_output +FeatureSummary,feature_summary +FeatureTransformation,feature_transformation +FeatureType,feature_type +FeatureTypes,feature_types +FeatureValue,feature_value +FeaturedDocument,featured_document +FeaturedDocumentMissing,featured_document_missing +FeaturedDocumentWithMetadata,featured_document_with_metadata +FeaturedDocuments,featured_documents +FeaturedDocumentsMissing,featured_documents_missing +FeaturedDocumentsWithMetadata,featured_documents_with_metadata +FeaturedResultsConflictException,featured_results_conflict_exception +FeaturedResultsItem,featured_results_item +FeaturedResultsItems,featured_results_items +FeaturedResultsSet,featured_results_set +FeaturedResultsSetId,featured_results_set_id +FeaturedResultsSetIds,featured_results_set_ids +FeaturedResultsSetName,featured_results_set_name +FeaturedResultsSetSummary,featured_results_set_summary +FeaturedResultsSetSummaryItems,featured_results_set_summary_items +Features,features +FeaturesAttribute,features_attribute +Featurization,featurization +FeaturizationConfig,featurization_config +FeaturizationMethod,featurization_method +FeaturizationMethodName,featurization_method_name +FeaturizationMethodParameters,featurization_method_parameters +FeaturizationPipeline,featurization_pipeline +Featurizations,featurizations +Fec,fec +FecOutputSettings,fec_output_settings +FederatedAuthentication,federated_authentication +FederatedAuthenticationRequest,federated_authentication_request +FederatedDatabase,federated_database +FederatedResourceAlreadyExistsException,federated_resource_already_exists_exception +FederatedTable,federated_table +FederatedUser,federated_user +FederatedUserId,federated_user_id +FederationParameters,federation_parameters +FederationSourceErrorCode,federation_source_error_code +FederationSourceException,federation_source_exception +FederationSourceRetryableException,federation_source_retryable_exception +Feedback,feedback +FeedbackDate,feedback_date +FeedbackForwardingAddress,feedback_forwarding_address +FeedbackForwardingEmailAddress,feedback_forwarding_email_address +FeedbackForwardingEmailAddressIdentityArn,feedback_forwarding_email_address_identity_arn +FeedbackForwardingStatus,feedback_forwarding_status +FeedbackId,feedback_id +FeedbackToken,feedback_token +FeedbackURL,feedback_url +FeedbackValue,feedback_value +FetchOwner,fetch_owner +FetchPage,fetch_page +FetchPageRequest,fetch_page_request +FetchPageResult,fetch_page_result +FiberOpticCableType,fiber_optic_cable_type +Field,field +FieldBasedTooltip,field_based_tooltip +FieldConfig,field_config +FieldDataPathValues,field_data_path_values +FieldDelimiter,field_delimiter +FieldEncoding,field_encoding +FieldError,field_error +FieldFolder,field_folder +FieldFolders,field_folders +FieldGroup,field_group +FieldId,field_id +FieldIdentifier,field_identifier +FieldInfo,field_info +FieldInputConfig,field_input_config +FieldItem,field_item +FieldLabelType,field_label_type +FieldLevel,field_level +FieldLevelEncryption,field_level_encryption +FieldLevelEncryptionConfig,field_level_encryption_config +FieldLevelEncryptionConfigAlreadyExists,field_level_encryption_config_already_exists +FieldLevelEncryptionConfigInUse,field_level_encryption_config_in_use +FieldLevelEncryptionId,field_level_encryption_id +FieldLevelEncryptionList,field_level_encryption_list +FieldLevelEncryptionProfile,field_level_encryption_profile +FieldLevelEncryptionProfileAlreadyExists,field_level_encryption_profile_already_exists +FieldLevelEncryptionProfileConfig,field_level_encryption_profile_config +FieldLevelEncryptionProfileInUse,field_level_encryption_profile_in_use +FieldLevelEncryptionProfileList,field_level_encryption_profile_list +FieldLevelEncryptionProfileSizeExceeded,field_level_encryption_profile_size_exceeded +FieldLevelEncryptionProfileSummary,field_level_encryption_profile_summary +FieldLevelEncryptionSummary,field_level_encryption_summary +FieldLevelOptions,field_level_options +FieldList,field_list +FieldLogLevel,field_log_level +FieldMappings,field_mappings +FieldName,field_name +FieldNames,field_names +FieldOption,field_option +FieldOptionError,field_option_error +FieldOptions,field_options +FieldPatterns,field_patterns +FieldSelectors,field_selectors +FieldSeriesItem,field_series_item +FieldSort,field_sort +FieldSortOptions,field_sort_options +FieldSourceProfileIds,field_source_profile_ids +FieldStatistics,field_statistics +FieldStats,field_stats +FieldSummary,field_summary +FieldToMatch,field_to_match +FieldTooltipItem,field_tooltip_item +FieldTypeDetails,field_type_details +FieldValidationConfiguration,field_validation_configuration +FieldValidationMessage,field_validation_message +FieldValue,field_value +FieldWells,field_wells +Fields,fields +File,file +FileAccessAuditLogLevel,file_access_audit_log_level +FileAccessLog,file_access_log +FileBatchJobDefinition,file_batch_job_definition +FileBatchJobIdentifier,file_batch_job_identifier +FileCache,file_cache +FileCacheCreating,file_cache_creating +FileCacheDataRepositoryAssociation,file_cache_data_repository_association +FileCacheFailureDetails,file_cache_failure_details +FileCacheId,file_cache_id +FileCacheIds,file_cache_ids +FileCacheLustreConfiguration,file_cache_lustre_configuration +FileCacheLustreMetadataConfiguration,file_cache_lustre_metadata_configuration +FileCacheNFSConfiguration,file_cache_nfs_configuration +FileCacheNotFound,file_cache_not_found +FileCachePath,file_cache_path +FileCacheType,file_cache_type +FileCacheTypeVersion,file_cache_type_version +FileCaches,file_caches +FileCompression,file_compression +FileConfiguration,file_configuration +FileContentAndSourceFileSpecifiedException,file_content_and_source_file_specified_exception +FileContentRequiredException,file_content_required_exception +FileContentSizeLimitExceededException,file_content_size_limit_exceeded_exception +FileCount,file_count +FileDoesNotExistException,file_does_not_exist_exception +FileEntryRequiredException,file_entry_required_exception +FileFailures,file_failures +FileFieldMappings,file_field_mappings +FileFingerprintLines,file_fingerprint_lines +FileFormat,file_format +FileFormatConfiguration,file_format_configuration +FileFormatDescriptor,file_format_descriptor +FileFormats,file_formats +FileGroupSettings,file_group_settings +FileGroups,file_groups +FileHeaderInfo,file_header_info +FileInformation,file_information +FileInput,file_input +FileKey,file_key +FileKeyUpdate,file_key_update +FileLastWritten,file_last_written +FileLocation,file_location +FileMetadata,file_metadata +FileMode,file_mode +FileModeRequiredException,file_mode_required_exception +FileModes,file_modes +FileName,file_name +FileNameConflictsWithDirectoryNameException,file_name_conflicts_with_directory_name_exception +FileOffset,file_offset +FilePath,file_path +FilePathConflictsWithSubmodulePathException,file_path_conflicts_with_submodule_path_exception +FilePaths,file_paths +FileShareARN,file_share_arn +FileShareARNList,file_share_arn_list +FileShareAccessAuditLogLevel,file_share_access_audit_log_level +FileShareId,file_share_id +FileShareInfo,file_share_info +FileShareInfoList,file_share_info_list +FileShareName,file_share_name +FileShareStatus,file_share_status +FileShareType,file_share_type +FileSharesVisible,file_shares_visible +FileSize,file_size +FileSizeBytes,file_size_bytes +FileSizes,file_sizes +FileSource,file_source +FileSourceSettings,file_source_settings +FileSystem,file_system +FileSystemAccessMode,file_system_access_mode +FileSystemAccessRoleArn,file_system_access_role_arn +FileSystemAdministratorsGroup,file_system_administrators_group +FileSystemAlreadyExists,file_system_already_exists +FileSystemArn,file_system_arn +FileSystemAssociationARN,file_system_association_arn +FileSystemAssociationARNList,file_system_association_arn_list +FileSystemAssociationId,file_system_association_id +FileSystemAssociationInfo,file_system_association_info +FileSystemAssociationInfoList,file_system_association_info_list +FileSystemAssociationStatus,file_system_association_status +FileSystemAssociationStatusDetail,file_system_association_status_detail +FileSystemAssociationStatusDetails,file_system_association_status_details +FileSystemAssociationSummary,file_system_association_summary +FileSystemAssociationSummaryList,file_system_association_summary_list +FileSystemConfig,file_system_config +FileSystemConfigs,file_system_configs +FileSystemDataSource,file_system_data_source +FileSystemDescription,file_system_description +FileSystemEndpoint,file_system_endpoint +FileSystemEndpoints,file_system_endpoints +FileSystemFailureDetails,file_system_failure_details +FileSystemId,file_system_id +FileSystemIds,file_system_ids +FileSystemInUse,file_system_in_use +FileSystemLimitExceeded,file_system_limit_exceeded +FileSystemNotFound,file_system_not_found +FileSystemPath,file_system_path +FileSystemPolicyDescription,file_system_policy_description +FileSystemSize,file_system_size +FileSystemType,file_system_type +FileSystemTypeVersion,file_system_type_version +FileSystems,file_systems +FileTooLargeException,file_too_large_exception +FileTransferUploadStreams,file_transfer_upload_streams +FileUploadURL,file_upload_url +FileUploaderFieldConfig,file_uploader_field_config +FileValidationMessage,file_validation_message +FileVersion,file_version +FilecacheDuration,filecache_duration +FilenameContains,filename_contains +Files,files +FilesCompleted,files_completed +FilesDeleted,files_deleted +FilesLimit,files_limit +FilesSkipped,files_skipped +FilesTransferred,files_transferred +FilesVerified,files_verified +FilesystemId,filesystem_id +FillLineGap,fill_line_gap +FillMissingValues,fill_missing_values +FillPolicy,fill_policy +FillStyle,fill_style +FilledMapAggregatedFieldWells,filled_map_aggregated_field_wells +FilledMapConditionalFormatting,filled_map_conditional_formatting +FilledMapConditionalFormattingOption,filled_map_conditional_formatting_option +FilledMapConfiguration,filled_map_configuration +FilledMapFieldWells,filled_map_field_wells +FilledMapShapeConditionalFormatting,filled_map_shape_conditional_formatting +FilledMapSortConfiguration,filled_map_sort_configuration +FilledMapVisual,filled_map_visual +FilledPath,filled_path +FillerSlate,filler_slate +Filling,filling +FilmGrainSynthesis,film_grain_synthesis +Filter,filter +FilterActivity,filter_activity +FilterArn,filter_arn +FilterArns,filter_arns +FilterAtDestination,filter_at_destination +FilterAtSource,filter_at_source +FilterAttributeRanges,filter_attribute_ranges +FilterBBox,filter_b_box +FilterCategories,filter_categories +FilterClass,filter_class +FilterCondition,filter_condition +FilterConditionList,filter_condition_list +FilterConditions,filter_conditions +FilterConfiguration,filter_configuration +FilterControl,filter_control +FilterControlId,filter_control_id +FilterControls,filter_controls +FilterCountries,filter_countries +FilterCriteria,filter_criteria +FilterCriterion,filter_criterion +FilterDateTimePickerControl,filter_date_time_picker_control +FilterDefinition,filter_definition +FilterDescription,filter_description +FilterDropDownControl,filter_drop_down_control +FilterEnable,filter_enable +FilterExpression,filter_expression +FilterGroup,filter_group +FilterGroupId,filter_group_id +FilterGroups,filter_groups +FilterId,filter_id +FilterInArns,filter_in_arns +FilterKey,filter_key +FilterLimitExceededException,filter_limit_exceeded_exception +FilterList,filter_list +FilterListConfiguration,filter_list_configuration +FilterListControl,filter_list_control +FilterLogEventsRequest,filter_log_events_request +FilterLogEventsResponse,filter_log_events_response +FilterName,filter_name +FilterNames,filter_names +FilterOperation,filter_operation +FilterOperationSelectedFieldsConfiguration,filter_operation_selected_fields_configuration +FilterOperationTargetVisualsConfiguration,filter_operation_target_visuals_configuration +FilterOperator,filter_operator +FilterOption,filter_option +FilterPartialResults,filter_partial_results +FilterPolicyLimitExceededException,filter_policy_limit_exceeded_exception +FilterPortRange,filter_port_range +FilterPredicate,filter_predicate +FilterQuery,filter_query +FilterRelativeDateTimeControl,filter_relative_date_time_control +FilterRule,filter_rule +FilterRules,filter_rules +FilterScopeConfiguration,filter_scope_configuration +FilterSelectableValues,filter_selectable_values +FilterSettings,filter_settings +FilterSliderControl,filter_slider_control +FilterStrength,filter_strength +FilterString,filter_string +FilterSummary,filter_summary +FilterSynonyms,filter_synonyms +FilterTextAreaControl,filter_text_area_control +FilterTextFieldControl,filter_text_field_control +FilterType,filter_type +FilterTypedLink,filter_typed_link +FilterV2,filter_v2 +FilterValue,filter_value +FilterValues,filter_values +FilterVariable,filter_variable +FilteredLogEvent,filtered_log_event +FilteredStatus,filtered_status +Filters,filters +FinalActiveLearningModelArn,final_active_learning_model_arn +FinalAutoMLJobObjectiveMetric,final_auto_ml_job_objective_metric +FinalBackupId,final_backup_id +FinalBackupTags,final_backup_tags +FinalBakeTimeInMinutes,final_bake_time_in_minutes +FinalClusterSnapshotIdentifier,final_cluster_snapshot_identifier +FinalClusterSnapshotRetentionPeriod,final_cluster_snapshot_retention_period +FinalDBSnapshotIdentifier,final_db_snapshot_identifier +FinalHyperParameterTuningJobObjectiveMetric,final_hyper_parameter_tuning_job_objective_metric +FinalMetricDataList,final_metric_data_list +FinalRecipient,final_recipient +FinalSnapshotIdentifier,final_snapshot_identifier +FinalSnapshotName,final_snapshot_name +FinalizeCutoverRequest,finalize_cutover_request +FinalizeDeviceClaimRequest,finalize_device_claim_request +FinalizeDeviceClaimResponse,finalize_device_claim_response +Finalized,finalized +FinalizingOrganizationException,finalizing_organization_exception +FindMatchesMetrics,find_matches_metrics +FindMatchesParameters,find_matches_parameters +FindMatchesTaskRunProperties,find_matches_task_run_properties +Finding,finding +FindingAction,finding_action +FindingActor,finding_actor +FindingAggregationRegion,finding_aggregation_region +FindingAggregator,finding_aggregator +FindingAggregatorArn,finding_aggregator_arn +FindingAggregators,finding_aggregators +FindingComponents,finding_components +FindingCreated,finding_created +FindingCriteria,finding_criteria +FindingDetail,finding_detail +FindingDetailsError,finding_details_error +FindingFieldsUpdate,finding_fields_update +FindingFilter,finding_filter +FindingHistoryRecord,finding_history_record +FindingHistoryUpdate,finding_history_update +FindingHistoryUpdateSource,finding_history_update_source +FindingId,finding_id +FindingIdentifier,finding_identifier +FindingIdentifiers,finding_identifiers +FindingIds,finding_ids +FindingMetricsValuePerSeverity,finding_metrics_value_per_severity +FindingProviderFields,finding_provider_fields +FindingProviderFieldsConfidence,finding_provider_fields_confidence +FindingProviderFieldsCriticality,finding_provider_fields_criticality +FindingProviderFieldsRelatedFindingsId,finding_provider_fields_related_findings_id +FindingProviderFieldsRelatedFindingsProductArn,finding_provider_fields_related_findings_product_arn +FindingProviderFieldsSeverityLabel,finding_provider_fields_severity_label +FindingProviderFieldsSeverityOriginal,finding_provider_fields_severity_original +FindingProviderFieldsTypes,finding_provider_fields_types +FindingProviderSeverity,finding_provider_severity +FindingPublishingFrequency,finding_publishing_frequency +FindingReasonCodes,finding_reason_codes +FindingSource,finding_source +FindingSourceDetail,finding_source_detail +FindingStatisticTypes,finding_statistic_types +FindingStatistics,finding_statistics +FindingStatisticsSortCriteria,finding_statistics_sort_criteria +FindingSummary,finding_summary +FindingTypeAggregation,finding_type_aggregation +FindingTypeAggregationResponse,finding_type_aggregation_response +FindingTypes,finding_types +Findings,findings +FindingsCount,findings_count +FindingsFilterListItem,findings_filter_list_item +FindingsFound,findings_found +FindingsReportSummary,findings_report_summary +FineGrainedAuthorizationEnabled,fine_grained_authorization_enabled +Fingerprint,fingerprint +FinishTime,finish_time +FinishTimeMillis,finish_time_millis +FinishedAt,finished_at +FinishedTime,finished_time +FinishedWorldsSummary,finished_worlds_summary +Fips,fips +FipsDnsName,fips_dns_name +FipsEnabled,fips_enabled +Firehose,firehose +FirehoseAction,firehose_action +FirehoseArn,firehose_arn +FirehoseDestinationConfiguration,firehose_destination_configuration +FirehoseFailureFeedbackRoleArn,firehose_failure_feedback_role_arn +FirehoseLogDelivery,firehose_log_delivery +FirehoseLogDeliveryDescription,firehose_log_delivery_description +FirehoseStream,firehose_stream +FirehoseSuccessFeedbackRoleArn,firehose_success_feedback_role_arn +FirelensConfiguration,firelens_configuration +Firewall,firewall +FirewallArn,firewall_arn +FirewallConfig,firewall_config +FirewallConfigs,firewall_configs +FirewallCreationConfig,firewall_creation_config +FirewallDeploymentModel,firewall_deployment_model +FirewallDomainList,firewall_domain_list +FirewallDomainListId,firewall_domain_list_id +FirewallDomainListMetadata,firewall_domain_list_metadata +FirewallDomainLists,firewall_domain_lists +FirewallEndpoint,firewall_endpoint +FirewallFailOpen,firewall_fail_open +FirewallId,firewall_id +FirewallManagerRuleGroup,firewall_manager_rule_group +FirewallManagerStatement,firewall_manager_statement +FirewallMetadata,firewall_metadata +FirewallName,firewall_name +FirewallPolicies,firewall_policies +FirewallPolicy,firewall_policy +FirewallPolicyArn,firewall_policy_arn +FirewallPolicyChangeProtection,firewall_policy_change_protection +FirewallPolicyDetails,firewall_policy_details +FirewallPolicyId,firewall_policy_id +FirewallPolicyMetadata,firewall_policy_metadata +FirewallPolicyName,firewall_policy_name +FirewallPolicyResponse,firewall_policy_response +FirewallPolicyStatefulRuleGroupReferencesDetails,firewall_policy_stateful_rule_group_references_details +FirewallPolicyStatelessCustomActionsDetails,firewall_policy_stateless_custom_actions_details +FirewallPolicyStatelessRuleGroupReferencesDetails,firewall_policy_stateless_rule_group_references_details +FirewallPolicyStatus,firewall_policy_status +FirewallRule,firewall_rule +FirewallRuleGroup,firewall_rule_group +FirewallRuleGroupAssociation,firewall_rule_group_association +FirewallRuleGroupAssociationId,firewall_rule_group_association_id +FirewallRuleGroupAssociations,firewall_rule_group_associations +FirewallRuleGroupId,firewall_rule_group_id +FirewallRuleGroupMetadata,firewall_rule_group_metadata +FirewallRuleGroupPolicy,firewall_rule_group_policy +FirewallRuleGroups,firewall_rule_groups +FirewallRules,firewall_rules +FirewallStatefulRule,firewall_stateful_rule +FirewallStatelessRule,firewall_stateless_rule +FirewallStatus,firewall_status +FirewallSubnetId,firewall_subnet_id +FirewallSubnetIsOutOfScopeViolation,firewall_subnet_is_out_of_scope_violation +FirewallSubnetMissingVPCEndpointViolation,firewall_subnet_missing_vpc_endpoint_violation +FirewallSubnetRoutes,firewall_subnet_routes +Firewalls,firewalls +FirmwareUpdateImage,firmware_update_image +FirmwareUpdateRole,firmware_update_role +First,first +FirstAccessedTime,first_accessed_time +FirstActivatedTime,first_activated_time +FirstAddress,first_address +FirstBlockToken,first_block_token +FirstEvaluationStarted,first_evaluation_started +FirstExecutionFrom,first_execution_from +FirstName,first_name +FirstObservedAt,first_observed_at +FirstPage,first_page +FirstSchemaVersionNumber,first_schema_version_number +FirstSeen,first_seen +FirstSeenDateTime,first_seen_date_time +FirstSlotStartTime,first_slot_start_time +FirstSlotStartTimeRange,first_slot_start_time_range +FirstSnapshotId,first_snapshot_id +FixAvailable,fix_available +FixedAfd,fixed_afd +FixedGOP,fixed_gop +FixedInVersion,fixed_in_version +FixedModeScheduleActionStartSettings,fixed_mode_schedule_action_start_settings +FixedPrice,fixed_price +FixedRate,fixed_rate +FixedResponseAction,fixed_response_action +FixedResponseActionConfig,fixed_response_action_config +FixedResponseConfig,fixed_response_config +FlacSettings,flac_settings +Flag,flag +FlaggedResources,flagged_resources +Flags,flags +Flat,flat +FlatInvocations,flat_invocations +Fleet,fleet +FleetAdvisorLsaAnalysisResponse,fleet_advisor_lsa_analysis_response +FleetAdvisorSchemaObjectResponse,fleet_advisor_schema_object_response +FleetAdvisorSchemaObjects,fleet_advisor_schema_objects +FleetAdvisorSchemas,fleet_advisor_schemas +FleetArn,fleet_arn +FleetAttributes,fleet_attributes +FleetCapacity,fleet_capacity +FleetCapacityExceededException,fleet_capacity_exceeded_exception +FleetCapacityReservation,fleet_capacity_reservation +FleetCapacityReservations,fleet_capacity_reservations +FleetData,fleet_data +FleetError,fleet_error +FleetErrors,fleet_errors +FleetId,fleet_id +FleetIds,fleet_ids +FleetLaunchTemplateConfig,fleet_launch_template_config +FleetLaunchTemplateConfigRequest,fleet_launch_template_config_request +FleetLaunchTemplateOverrides,fleet_launch_template_overrides +FleetLaunchTemplateOverridesRequest,fleet_launch_template_overrides_request +FleetLaunchTemplateSpecification,fleet_launch_template_specification +FleetLaunchTemplateSpecificationRequest,fleet_launch_template_specification_request +FleetMetricNameAndArn,fleet_metric_name_and_arn +FleetName,fleet_name +FleetSpotCapacityRebalance,fleet_spot_capacity_rebalance +FleetSpotCapacityRebalanceRequest,fleet_spot_capacity_rebalance_request +FleetSpotMaintenanceStrategies,fleet_spot_maintenance_strategies +FleetSpotMaintenanceStrategiesRequest,fleet_spot_maintenance_strategies_request +FleetState,fleet_state +FleetStatus,fleet_status +FleetSummary,fleet_summary +FleetSummaryList,fleet_summary_list +FleetType,fleet_type +FleetUtilization,fleet_utilization +Fleets,fleets +FlexCacheEndpointType,flex_cache_endpoint_type +FlexMatchMode,flex_match_mode +FlexibleTimeWindow,flexible_time_window +FlickerAdaptiveQuantization,flicker_adaptive_quantization +FlickerAq,flicker_aq +FlinkApplicationConfiguration,flink_application_configuration +FlinkApplicationConfigurationDescription,flink_application_configuration_description +FlinkApplicationConfigurationUpdate,flink_application_configuration_update +FlinkRunConfiguration,flink_run_configuration +FlinkRunConfigurationDescription,flink_run_configuration_description +Flow,flow +FlowArn,flow_arn +FlowDefinition,flow_definition +FlowDefinitionArn,flow_definition_arn +FlowDefinitionName,flow_definition_name +FlowDefinitionOutputConfig,flow_definition_output_config +FlowDefinitionStatus,flow_definition_status +FlowDefinitionSummaries,flow_definition_summaries +FlowDefinitionSummary,flow_definition_summary +FlowExecutionMessage,flow_execution_message +FlowExecutionSummary,flow_execution_summary +FlowLog,flow_log +FlowLogId,flow_log_id +FlowLogIds,flow_log_ids +FlowLogStatus,flow_log_status +FlowLogs,flow_logs +FlowLogsConfigurationResult,flow_logs_configuration_result +FlowLogsEnabled,flow_logs_enabled +FlowLogsS3Bucket,flow_logs_s3_bucket +FlowLogsS3Prefix,flow_logs_s3_prefix +FlowName,flow_name +FlowOutput,flow_output +FlowSource,flow_source +FlowSourceArn,flow_source_arn +FlowTemplateDescription,flow_template_description +FlowTemplateFilter,flow_template_filter +FlowTemplateSummary,flow_template_summary +FlowVpcInterfaceAttachment,flow_vpc_interface_attachment +Flows,flows +FlushApiCacheRequest,flush_api_cache_request +FlushStageAuthorizersCacheRequest,flush_stage_authorizers_cache_request +FlushStageCacheRequest,flush_stage_cache_request +FlywheelArn,flywheel_arn +FlywheelFilter,flywheel_filter +FlywheelIterationFilter,flywheel_iteration_filter +FlywheelIterationId,flywheel_iteration_id +FlywheelIterationProperties,flywheel_iteration_properties +FlywheelIterationPropertiesList,flywheel_iteration_properties_list +FlywheelModelEvaluationMetrics,flywheel_model_evaluation_metrics +FlywheelName,flywheel_name +FlywheelProperties,flywheel_properties +FlywheelStatsS3Prefix,flywheel_stats_s3_prefix +FlywheelSummary,flywheel_summary +FlywheelSummaryList,flywheel_summary_list +Fmp4HlsSettings,fmp4_hls_settings +Fmt,fmt +Fmtp,fmtp +FmtpRequest,fmtp_request +Folder,folder +FolderConfiguration,folder_configuration +FolderConfigurations,folder_configurations +FolderContentSizeLimitExceededException,folder_content_size_limit_exceeded_exception +FolderDoesNotExistException,folder_does_not_exist_exception +FolderId,folder_id +FolderIds,folder_ids +FolderList,folder_list +FolderMember,folder_member +FolderMemberList,folder_member_list +FolderMetadata,folder_metadata +FolderPath,folder_path +FolderSearchFilter,folder_search_filter +FolderSummary,folder_summary +FolderSummaryList,folder_summary_list +FolderType,folder_type +Folders,folders +FollowInputIndex,follow_input_index +FollowModeScheduleActionStartSettings,follow_mode_schedule_action_start_settings +FollowPoint,follow_point +FollowUpPrompt,follow_up_prompt +Font,font +FontColor,font_color +FontConfiguration,font_configuration +FontDecoration,font_decoration +FontFamilies,font_families +FontFamily,font_family +FontOpacity,font_opacity +FontResolution,font_resolution +FontScript,font_script +FontSize,font_size +FontStack,font_stack +FontStyle,font_style +FontUnicodeRange,font_unicode_range +FontWeight,font_weight +FooterSections,footer_sections +ForbiddenException,forbidden_exception +Force,force +ForceAliasCreation,force_alias_creation +ForceAssociate,force_associate +ForceCreateJobs,force_create_jobs +ForceDelete,force_delete +ForceDeleteWithoutRecovery,force_delete_without_recovery +ForceDetach,force_detach +ForceFailover,force_failover +ForceFieldPictures,force_field_pictures +ForceIncludeRenditionSize,force_include_rendition_size +ForceIncludeRenditions,force_include_renditions +ForceLobLookup,force_lob_lookup +ForceMove,force_move +ForceOverwriteReplicaSecret,force_overwrite_replica_secret +ForcePlannedFailover,force_planned_failover +ForceTerminate,force_terminate +ForceTsVideoEbpOrder,force_ts_video_ebp_order +ForceUnsubscribeAll,force_unsubscribe_all +ForceUpdate,force_update +ForceUpgradeDate,force_upgrade_date +ForcedApplyDate,forced_apply_date +Forecast,forecast +ForecastArn,forecast_arn +ForecastComputation,forecast_computation +ForecastConfiguration,forecast_configuration +ForecastConfigurations,forecast_configurations +ForecastDataType,forecast_data_type +ForecastDimensions,forecast_dimensions +ForecastExportJobArn,forecast_export_job_arn +ForecastExportJobName,forecast_export_job_name +ForecastExportJobSummary,forecast_export_job_summary +ForecastExportJobs,forecast_export_jobs +ForecastFrequency,forecast_frequency +ForecastHorizon,forecast_horizon +ForecastName,forecast_name +ForecastProperties,forecast_properties +ForecastQuantiles,forecast_quantiles +ForecastResult,forecast_result +ForecastResultsByTime,forecast_results_by_time +ForecastScenario,forecast_scenario +ForecastStatistics,forecast_statistics +ForecastSummary,forecast_summary +ForecastType,forecast_type +ForecastTypes,forecast_types +ForecastedLifetime,forecasted_lifetime +ForecastedSpend,forecasted_spend +Forecasts,forecasts +Foreground,foreground +ForegroundColor,foreground_color +ForgetDeviceRequest,forget_device_request +ForgetSmartHomeAppliancesRequest,forget_smart_home_appliances_request +ForgotPassword,forgot_password +ForgotPasswordLink,forgot_password_link +ForgotPasswordRequest,forgot_password_request +ForgotPasswordResponse,forgot_password_response +Form,form +FormBindingElement,form_binding_element +FormButton,form_button +FormCTA,form_cta +FormDataTypeConfig,form_data_type_config +FormInputBindingPropertiesValue,form_input_binding_properties_value +FormInputBindingPropertiesValueProperties,form_input_binding_properties_value_properties +FormInputValueProperty,form_input_value_property +FormInputValuePropertyBindingProperties,form_input_value_property_binding_properties +FormStyle,form_style +FormSummary,form_summary +Formality,formality +Format,format +FormatConfig,format_config +FormatConfiguration,format_configuration +FormatOptions,format_options +FormatText,format_text +FormatType,format_type +FormatVersion,format_version +Formats,formats +Formatted,formatted +Forward,forward +ForwardAction,forward_action +ForwardActionConfig,forward_action_config +ForwardConfig,forward_config +ForwardPath,forward_path +ForwardPathComponents,forward_path_components +ForwardWhenContentTypeIsUnknown,forward_when_content_type_is_unknown +ForwardWhenQueryArgProfileIsUnknown,forward_when_query_arg_profile_is_unknown +ForwardedIP,forwarded_ip +ForwardedIPConfig,forwarded_ip_config +ForwardedValues,forwarded_values +ForwardingAddressId,forwarding_address_id +ForwardingConfig,forwarding_config +ForwardingEnabled,forwarding_enabled +FoundByItems,found_by_items +FoundByKeyValue,found_by_key_value +FoundationModelDetails,foundation_model_details +FoundationModelSummary,foundation_model_summary +FpgaDeviceInfo,fpga_device_info +FpgaDeviceMemoryInfo,fpga_device_memory_info +FpgaImage,fpga_image +FpgaImageAttribute,fpga_image_attribute +FpgaImageGlobalId,fpga_image_global_id +FpgaImageId,fpga_image_id +FpgaImageIds,fpga_image_ids +FpgaImageState,fpga_image_state +FpgaImages,fpga_images +FpgaInfo,fpga_info +Fpgas,fpgas +Fqdn,fqdn +FractionDigits,fraction_digits +Fragment,fragment +FragmentIntervalMS,fragment_interval_ms +FragmentLength,fragment_length +FragmentLengthControl,fragment_length_control +FragmentLengthInMilliseconds,fragment_length_in_milliseconds +FragmentNumber,fragment_number +FragmentSelector,fragment_selector +FragmentSelectorType,fragment_selector_type +FragmentSizeBytes,fragment_size_bytes +FragmentSizeInBytes,fragment_size_in_bytes +FragmentTime,fragment_time +Fragments,fragments +FrameCaptureCdnSettings,frame_capture_cdn_settings +FrameCaptureGroupSettings,frame_capture_group_settings +FrameCaptureHlsSettings,frame_capture_hls_settings +FrameCaptureOutputSettings,frame_capture_output_settings +FrameCaptureS3Settings,frame_capture_s3_settings +FrameCaptureSettings,frame_capture_settings +FrameHeight,frame_height +FrameMetric,frame_metric +FrameMetricDatum,frame_metric_datum +FrameOption,frame_option +FrameOptions,frame_options +FrameRate,frame_rate +FrameWidth,frame_width +Framerate,framerate +FramerateControl,framerate_control +FramerateConversionAlgorithm,framerate_conversion_algorithm +FramerateDenominator,framerate_denominator +FramerateNumerator,framerate_numerator +Framework,framework +FrameworkArn,framework_arn +FrameworkArns,framework_arns +FrameworkAttributes,framework_attributes +FrameworkConfiguration,framework_configuration +FrameworkControl,framework_control +FrameworkControls,framework_controls +FrameworkDescription,framework_description +FrameworkMetadata,framework_metadata +FrameworkName,framework_name +FrameworkStatus,framework_status +FrameworkTags,framework_tags +FrameworkVersion,framework_version +Frameworks,frameworks +FraudDetectionAction,fraud_detection_action +FraudDetectionConfig,fraud_detection_config +FraudDetectionConfiguration,fraud_detection_configuration +FraudDetectionResult,fraud_detection_result +FraudDetectionResultId,fraud_detection_result_id +FraudRiskDetails,fraud_risk_details +Fraudster,fraudster +FraudsterId,fraudster_id +FraudsterRegistrationJob,fraudster_registration_job +FraudsterRegistrationJobSummary,fraudster_registration_job_summary +FraudsterSimilarityThreshold,fraudster_similarity_threshold +FraudsterSummaries,fraudster_summaries +FraudsterSummary,fraudster_summary +FreeForm,free_form +FreeFormLayout,free_form_layout +FreeFormLayoutCanvasSizeOptions,free_form_layout_canvas_size_options +FreeFormLayoutConfiguration,free_form_layout_configuration +FreeFormLayoutElement,free_form_layout_element +FreeFormLayoutElementBackgroundStyle,free_form_layout_element_background_style +FreeFormLayoutElementBorderStyle,free_form_layout_element_border_style +FreeFormLayoutScreenCanvasSizeOptions,free_form_layout_screen_canvas_size_options +FreeFormSectionLayoutConfiguration,free_form_section_layout_configuration +FreeSpaceBox,free_space_box +FreeTier,free_tier +FreeTierConfig,free_tier_config +FreeTierEligible,free_tier_eligible +FreeTrialAccountInfo,free_trial_account_info +FreeTrialDaysRemaining,free_trial_days_remaining +FreeTrialFeatureConfigurationResult,free_trial_feature_configuration_result +FreeTrialInfo,free_trial_info +FreeTrialInfoError,free_trial_info_error +FreeUntil,free_until +Frequencies,frequencies +Frequency,frequency +FrequencyBandwidth,frequency_bandwidth +FreshStartDate,fresh_start_date +Freshness,freshness +Friday,friday +FriendlyDeviceName,friendly_device_name +FriendlyName,friendly_name +From,from +FromAddress,from_address +FromArn,from_arn +FromDate,from_date +FromDbClusterArn,from_db_cluster_arn +FromEmailAddress,from_email_address +FromEmailAddressIdentityArn,from_email_address_identity_arn +FromEmailAddressNotVerifiedException,from_email_address_not_verified_exception +FromFederationSource,from_federation_source +FromInclusive,from_inclusive +FromPath,from_path +FromPhoneNumber,from_phone_number +FromPort,from_port +FromTime,from_time +FromTimeStamp,from_time_stamp +FromType,from_type +FromValue,from_value +FsxAdminPassword,fsx_admin_password +FsxConfiguration,fsx_configuration +FsxFilesystemArn,fsx_filesystem_arn +FsxProtocol,fsx_protocol +FsxProtocolNfs,fsx_protocol_nfs +FsxProtocolSmb,fsx_protocol_smb +FsxStorageConfiguration,fsx_storage_configuration +FulfilledCapacity,fulfilled_capacity +FulfilledOnDemandCapacity,fulfilled_on_demand_capacity +FulfillmentActivity,fulfillment_activity +FulfillmentCodeHookSettings,fulfillment_code_hook_settings +FulfillmentStartResponseSpecification,fulfillment_start_response_specification +FulfillmentUpdateResponseSpecification,fulfillment_update_response_specification +FulfillmentUpdatesSpecification,fulfillment_updates_specification +FullDocument,full_document +FullLoadCondtnlChkFailedRows,full_load_condtnl_chk_failed_rows +FullLoadEndTime,full_load_end_time +FullLoadErrorPercentage,full_load_error_percentage +FullLoadErrorRows,full_load_error_rows +FullLoadFinishDate,full_load_finish_date +FullLoadProgressPercent,full_load_progress_percent +FullLoadReloaded,full_load_reloaded +FullLoadRows,full_load_rows +FullLoadStartDate,full_load_start_date +FullLoadStartTime,full_load_start_time +FullName,full_name +FullyQualifiedCNAME,fully_qualified_cname +FullyQualifiedDomainName,fully_qualified_domain_name +Function,function +FunctionARN,function_arn +FunctionAlreadyExists,function_already_exists +FunctionArn,function_arn +FunctionArns,function_arns +FunctionArtifactMeta,function_artifact_meta +FunctionAssociation,function_association +FunctionAssociations,function_associations +FunctionCode,function_code +FunctionCodeLocation,function_code_location +FunctionConfig,function_config +FunctionConfiguration,function_configuration +FunctionConfigurationEnvironment,function_configuration_environment +FunctionCount,function_count +FunctionDefaultConfig,function_default_config +FunctionDefaultExecutionConfig,function_default_execution_config +FunctionDefinitionId,function_definition_id +FunctionDefinitionVersion,function_definition_version +FunctionDefinitionVersionArn,function_definition_version_arn +FunctionDefinitionVersionId,function_definition_version_id +FunctionError,function_error +FunctionErrorMessage,function_error_message +FunctionEventInvokeConfig,function_event_invoke_config +FunctionEventInvokeConfigs,function_event_invoke_configs +FunctionExecutionConfig,function_execution_config +FunctionExecutionLogs,function_execution_logs +FunctionInUse,function_in_use +FunctionInput,function_input +FunctionList,function_list +FunctionMetadata,function_metadata +FunctionName,function_name +FunctionOutput,function_output +FunctionPayload,function_payload +FunctionRequest,function_request +FunctionResponse,function_response +FunctionResponseTypes,function_response_types +FunctionRunAsConfig,function_run_as_config +FunctionRuntimeOverride,function_runtime_override +FunctionSizeLimitExceeded,function_size_limit_exceeded +FunctionSummary,function_summary +FunctionUrl,function_url +FunctionUrlAuthType,function_url_auth_type +FunctionUrlConfig,function_url_config +FunctionUrlConfigs,function_url_configs +FunctionVersion,function_version +Functions,functions +FunnelChartAggregatedFieldWells,funnel_chart_aggregated_field_wells +FunnelChartConfiguration,funnel_chart_configuration +FunnelChartDataLabelOptions,funnel_chart_data_label_options +FunnelChartFieldWells,funnel_chart_field_wells +FunnelChartSortConfiguration,funnel_chart_sort_configuration +FunnelChartVisual,funnel_chart_visual +Fuota,fuota +FuotaDeviceStatus,fuota_device_status +FuotaTask,fuota_task +FuotaTaskId,fuota_task_id +FuotaTaskList,fuota_task_list +FuzzyMatching,fuzzy_matching +GATING,gating +GCM,gcm +GCMChannelRequest,gcm_channel_request +GCMChannelResponse,gcm_channel_response +GCMMessage,gcm_message +GE,ge +GPSCoordinates,gps_coordinates +GPSPoint,gps_point +GPSPointDimension,gps_point_dimension +GSTIN,gstin +GT,gt +Gain,gain +Game,game +GameConfiguration,game_configuration +GameConfigurationDetails,game_configuration_details +GameDetails,game_details +GameKey,game_key +GameLiftAwsAccountId,game_lift_aws_account_id +GameLiftServiceSdkEndpoint,game_lift_service_sdk_endpoint +GameLiftVpcId,game_lift_vpc_id +GameName,game_name +GameProperties,game_properties +GameProperty,game_property +GameSdkVersion,game_sdk_version +GameServer,game_server +GameServerData,game_server_data +GameServerGroup,game_server_group +GameServerGroupArn,game_server_group_arn +GameServerGroupAutoScalingPolicy,game_server_group_auto_scaling_policy +GameServerGroupName,game_server_group_name +GameServerGroups,game_server_groups +GameServerId,game_server_id +GameServerInstance,game_server_instance +GameServerInstances,game_server_instances +GameServerProtectionPolicy,game_server_protection_policy +GameServers,game_servers +GameSession,game_session +GameSessionActivationTimeoutSeconds,game_session_activation_timeout_seconds +GameSessionArn,game_session_arn +GameSessionConnectionInfo,game_session_connection_info +GameSessionData,game_session_data +GameSessionDetail,game_session_detail +GameSessionDetails,game_session_details +GameSessionFullException,game_session_full_exception +GameSessionId,game_session_id +GameSessionName,game_session_name +GameSessionPlacement,game_session_placement +GameSessionQueue,game_session_queue +GameSessionQueueArn,game_session_queue_arn +GameSessionQueueArns,game_session_queue_arns +GameSessionQueueDestination,game_session_queue_destination +GameSessionQueueName,game_session_queue_name +GameSessionQueues,game_session_queues +GameSessionRegion,game_session_region +GameSessions,game_sessions +GameSummary,game_summary +Games,games +Gateway,gateway +GatewayARN,gateway_arn +GatewayAdmins,gateway_admins +GatewayArn,gateway_arn +GatewayAssociationState,gateway_association_state +GatewayBridgeSource,gateway_bridge_source +GatewayCapabilitySummary,gateway_capability_summary +GatewayCapacity,gateway_capacity +GatewayDetails,gateway_details +GatewayDisplayName,gateway_display_name +GatewayEui,gateway_eui +GatewayEuiEventTopic,gateway_eui_event_topic +GatewayGroup,gateway_group +GatewayGroupArn,gateway_group_arn +GatewayGroupSummary,gateway_group_summary +GatewayGroups,gateway_groups +GatewayId,gateway_id +GatewayInfo,gateway_info +GatewayInstance,gateway_instance +GatewayInstanceArn,gateway_instance_arn +GatewayList,gateway_list +GatewayListItem,gateway_list_item +GatewayLoadBalancerArns,gateway_load_balancer_arns +GatewayLoadBalancerEndpointId,gateway_load_balancer_endpoint_id +GatewayMessages,gateway_messages +GatewayName,gateway_name +GatewayNetwork,gateway_network +GatewayNetworkInterfaces,gateway_network_interfaces +GatewayOperationalState,gateway_operational_state +GatewayPlatform,gateway_platform +GatewayRegion,gateway_region +GatewayResponse,gateway_response +GatewayResponses,gateway_responses +GatewayRouteData,gateway_route_data +GatewayRouteHostnameMatch,gateway_route_hostname_match +GatewayRouteHostnameRewrite,gateway_route_hostname_rewrite +GatewayRouteRef,gateway_route_ref +GatewayRouteSpec,gateway_route_spec +GatewayRouteStatus,gateway_route_status +GatewayRouteTarget,gateway_route_target +GatewayRouteVirtualService,gateway_route_virtual_service +GatewayState,gateway_state +GatewaySummary,gateway_summary +GatewayTimeoutException,gateway_timeout_exception +GatewayTimezone,gateway_timezone +GatewayType,gateway_type +Gateways,gateways +GatingControls,gating_controls +GatingRule,gating_rule +GatingRuleUpdate,gating_rule_update +GaugeChartArcConditionalFormatting,gauge_chart_arc_conditional_formatting +GaugeChartConditionalFormatting,gauge_chart_conditional_formatting +GaugeChartConditionalFormattingOption,gauge_chart_conditional_formatting_option +GaugeChartConfiguration,gauge_chart_configuration +GaugeChartFieldWells,gauge_chart_field_wells +GaugeChartOptions,gauge_chart_options +GaugeChartPrimaryValueConditionalFormatting,gauge_chart_primary_value_conditional_formatting +GaugeChartVisual,gauge_chart_visual +GcpMySQLSettings,gcp_my_sql_settings +GdgAttributes,gdg_attributes +GdgDetailAttributes,gdg_detail_attributes +GenAppKey,gen_app_key +Gender,gender +GenderString,gender_string +General,general +GeneralFlags,general_flags +GeneralFlagsV2,general_flags_v2 +GeneralFlagsV3,general_flags_v3 +GeneralFlagsV4,general_flags_v4 +GeneralLabels,general_labels +GeneralLabelsSettings,general_labels_settings +GeneralLogGroup,general_log_group +GeneralName,general_name +GeneralServiceException,general_service_exception +Generate,generate +GenerateAccessLogsRequest,generate_access_logs_request +GenerateAccessLogsResult,generate_access_logs_result +GenerateBackendAPIModelsRequest,generate_backend_api_models_request +GenerateBackendAPIModelsResponse,generate_backend_api_models_response +GenerateCandidateDefinitionsOnly,generate_candidate_definitions_only +GenerateCardValidationDataInput,generate_card_validation_data_input +GenerateCardValidationDataOutput,generate_card_validation_data_output +GenerateChangeSetRequest,generate_change_set_request +GenerateChangeSetResponse,generate_change_set_response +GenerateClientCertificateRequest,generate_client_certificate_request +GenerateCredentialReportResponse,generate_credential_report_response +GenerateDataKeyPairRequest,generate_data_key_pair_request +GenerateDataKeyPairResponse,generate_data_key_pair_response +GenerateDataKeyPairWithoutPlaintextRequest,generate_data_key_pair_without_plaintext_request +GenerateDataKeyPairWithoutPlaintextResponse,generate_data_key_pair_without_plaintext_response +GenerateDataKeyRequest,generate_data_key_request +GenerateDataKeyResponse,generate_data_key_response +GenerateDataKeyWithoutPlaintextRequest,generate_data_key_without_plaintext_request +GenerateDataKeyWithoutPlaintextResponse,generate_data_key_without_plaintext_response +GenerateDataSetRequest,generate_data_set_request +GenerateDataSetResult,generate_data_set_result +GenerateEmbedUrlForAnonymousUserRequest,generate_embed_url_for_anonymous_user_request +GenerateEmbedUrlForAnonymousUserResponse,generate_embed_url_for_anonymous_user_response +GenerateEmbedUrlForRegisteredUserRequest,generate_embed_url_for_registered_user_request +GenerateEmbedUrlForRegisteredUserResponse,generate_embed_url_for_registered_user_response +GenerateInferenceId,generate_inference_id +GenerateMacInput,generate_mac_input +GenerateMacOutput,generate_mac_output +GenerateMacRequest,generate_mac_request +GenerateMacResponse,generate_mac_response +GenerateMobileSdkReleaseUrlRequest,generate_mobile_sdk_release_url_request +GenerateMobileSdkReleaseUrlResponse,generate_mobile_sdk_release_url_response +GenerateOrganizationsAccessReportRequest,generate_organizations_access_report_request +GenerateOrganizationsAccessReportResponse,generate_organizations_access_report_response +GeneratePinDataInput,generate_pin_data_input +GeneratePinDataOutput,generate_pin_data_output +GenerateRandomRequest,generate_random_request +GenerateRandomResponse,generate_random_response +GenerateRecommendationsRequest,generate_recommendations_request +GenerateSecret,generate_secret +GenerateServiceLastAccessedDetailsRequest,generate_service_last_accessed_details_request +GenerateServiceLastAccessedDetailsResponse,generate_service_last_accessed_details_response +GenerateTemplateRequest,generate_template_request +GenerateTemplateResponse,generate_template_response +GeneratedBy,generated_by +GeneratedCodeJob,generated_code_job +GeneratedCodeJobDetails,generated_code_job_details +GeneratedCodeJobId,generated_code_job_id +GeneratedCodeJobs,generated_code_jobs +GeneratedFraudsterId,generated_fraudster_id +GeneratedManifestDescriptor,generated_manifest_descriptor +GeneratedManifestEncryption,generated_manifest_encryption +GeneratedPolicy,generated_policy +GeneratedPolicyProperties,generated_policy_properties +GeneratedPolicyResult,generated_policy_result +GeneratedPrefixLocation,generated_prefix_location +GeneratedRulesType,generated_rules_type +GeneratedSpeakerId,generated_speaker_id +GeneratedTime,generated_time +GenerationAttributes,generation_attributes +GenerationCompletionTime,generation_completion_time +GenerationExistsException,generation_exists_exception +GenerationKeyArn,generation_key_arn +GenerationKeyCheckValue,generation_key_check_value +GenerationKeyIdentifier,generation_key_identifier +GenerationQualifier,generation_qualifier +GenerationStartedTime,generation_started_time +GenerationStatus,generation_status +GenerationSummary,generation_summary +GenerationSummaryList,generation_summary_list +GenerationTimestamp,generation_timestamp +Generator,generator +GeneratorDetails,generator_details +GeneratorId,generator_id +GenericAttachment,generic_attachment +GenericKeywords,generic_keywords +GenericRevisionInfo,generic_revision_info +GeoJsonPayload,geo_json_payload +GeoLocation,geo_location +GeoLocationDetails,geo_location_details +GeoLocationDetailsList,geo_location_details_list +GeoMatchConstraint,geo_match_constraint +GeoMatchConstraints,geo_match_constraints +GeoMatchLevel,geo_match_level +GeoMatchParams,geo_match_params +GeoMatchSet,geo_match_set +GeoMatchSetId,geo_match_set_id +GeoMatchSetSummary,geo_match_set_summary +GeoMatchSetUpdate,geo_match_set_update +GeoMatchSets,geo_match_sets +GeoMatchStatement,geo_match_statement +GeoMosaicConfigInput,geo_mosaic_config_input +GeoRestriction,geo_restriction +GeoSpatialColumnGroup,geo_spatial_column_group +GeofenceGeometry,geofence_geometry +GeofenceId,geofence_id +GeofenceIds,geofence_ids +GeofenceProperties,geofence_properties +GeographicRole,geographic_role +GeolocationFormat,geolocation_format +Geometry,geometry +GeometryOffset,geometry_offset +Geospatial,geospatial +GeospatialCoordinateBounds,geospatial_coordinate_bounds +GeospatialHeatmapColorScale,geospatial_heatmap_color_scale +GeospatialHeatmapConfiguration,geospatial_heatmap_configuration +GeospatialHeatmapDataColor,geospatial_heatmap_data_color +GeospatialMapAggregatedFieldWells,geospatial_map_aggregated_field_wells +GeospatialMapConfiguration,geospatial_map_configuration +GeospatialMapFieldWells,geospatial_map_field_wells +GeospatialMapStyleOptions,geospatial_map_style_options +GeospatialMapVisual,geospatial_map_visual +GeospatialPointStyleOptions,geospatial_point_style_options +GeospatialWindowOptions,geospatial_window_options +GeranCid,geran_cid +Get,get +GetAWSDefaultServiceQuotaRequest,get_aws_default_service_quota_request +GetAWSDefaultServiceQuotaResponse,get_aws_default_service_quota_response +GetAWSOrganizationsAccessStatusOutput,get_aws_organizations_access_status_output +GetAccessControlEffectRequest,get_access_control_effect_request +GetAccessControlEffectResponse,get_access_control_effect_response +GetAccessKeyInfoRequest,get_access_key_info_request +GetAccessKeyInfoResponse,get_access_key_info_response +GetAccessKeyLastUsedRequest,get_access_key_last_used_request +GetAccessKeyLastUsedResponse,get_access_key_last_used_response +GetAccessLogSubscriptionRequest,get_access_log_subscription_request +GetAccessLogSubscriptionResponse,get_access_log_subscription_response +GetAccessPointConfigurationForObjectLambdaRequest,get_access_point_configuration_for_object_lambda_request +GetAccessPointConfigurationForObjectLambdaResult,get_access_point_configuration_for_object_lambda_result +GetAccessPointForObjectLambdaRequest,get_access_point_for_object_lambda_request +GetAccessPointForObjectLambdaResult,get_access_point_for_object_lambda_result +GetAccessPointPolicyForObjectLambdaRequest,get_access_point_policy_for_object_lambda_request +GetAccessPointPolicyForObjectLambdaResult,get_access_point_policy_for_object_lambda_result +GetAccessPointPolicyRequest,get_access_point_policy_request +GetAccessPointPolicyResult,get_access_point_policy_result +GetAccessPointPolicyStatusForObjectLambdaRequest,get_access_point_policy_status_for_object_lambda_request +GetAccessPointPolicyStatusForObjectLambdaResult,get_access_point_policy_status_for_object_lambda_result +GetAccessPointPolicyStatusRequest,get_access_point_policy_status_request +GetAccessPointPolicyStatusResult,get_access_point_policy_status_result +GetAccessPointRequest,get_access_point_request +GetAccessPointResult,get_access_point_result +GetAccessPolicyRequest,get_access_policy_request +GetAccessPolicyResponse,get_access_policy_response +GetAccessPreviewRequest,get_access_preview_request +GetAccessPreviewResponse,get_access_preview_response +GetAccessTokenRequest,get_access_token_request +GetAccessTokenResponse,get_access_token_response +GetAccessorInput,get_accessor_input +GetAccessorOutput,get_accessor_output +GetAccountAliasResult,get_account_alias_result +GetAccountAuthorizationDetailsRequest,get_account_authorization_details_request +GetAccountAuthorizationDetailsResponse,get_account_authorization_details_response +GetAccountBalanceResponse,get_account_balance_response +GetAccountConfigurationResponse,get_account_configuration_response +GetAccountLimitRequest,get_account_limit_request +GetAccountLimitResponse,get_account_limit_response +GetAccountPasswordPolicyResponse,get_account_password_policy_response +GetAccountRequest,get_account_request +GetAccountResponse,get_account_response +GetAccountSendingEnabledResponse,get_account_sending_enabled_response +GetAccountSettingsOutput,get_account_settings_output +GetAccountSettingsRequest,get_account_settings_request +GetAccountSettingsResponse,get_account_settings_response +GetAccountSettingsResult,get_account_settings_result +GetAccountStatusResponse,get_account_status_response +GetAccountSummaryResponse,get_account_summary_response +GetAccuracyMetricsRequest,get_accuracy_metrics_request +GetAccuracyMetricsResponse,get_accuracy_metrics_response +GetActionRequest,get_action_request +GetActionResponse,get_action_response +GetActionTypeInput,get_action_type_input +GetActionTypeOutput,get_action_type_output +GetActiveNamesRequest,get_active_names_request +GetActiveNamesResult,get_active_names_result +GetActivityTaskInput,get_activity_task_input +GetActivityTaskOutput,get_activity_task_output +GetAddressBookRequest,get_address_book_request +GetAddressBookResponse,get_address_book_response +GetAdmChannelRequest,get_adm_channel_request +GetAdmChannelResponse,get_adm_channel_response +GetAdminAccountResponse,get_admin_account_response +GetAdminScopeRequest,get_admin_scope_request +GetAdminScopeResponse,get_admin_scope_response +GetAdministratorAccountRequest,get_administrator_account_request +GetAdministratorAccountResponse,get_administrator_account_response +GetAgentConfigurationRequest,get_agent_configuration_request +GetAgentConfigurationResponse,get_agent_configuration_response +GetAggregateComplianceDetailsByConfigRuleRequest,get_aggregate_compliance_details_by_config_rule_request +GetAggregateComplianceDetailsByConfigRuleResponse,get_aggregate_compliance_details_by_config_rule_response +GetAggregateConfigRuleComplianceSummaryRequest,get_aggregate_config_rule_compliance_summary_request +GetAggregateConfigRuleComplianceSummaryResponse,get_aggregate_config_rule_compliance_summary_response +GetAggregateConformancePackComplianceSummaryRequest,get_aggregate_conformance_pack_compliance_summary_request +GetAggregateConformancePackComplianceSummaryResponse,get_aggregate_conformance_pack_compliance_summary_response +GetAggregateDiscoveredResourceCountsRequest,get_aggregate_discovered_resource_counts_request +GetAggregateDiscoveredResourceCountsResponse,get_aggregate_discovered_resource_counts_response +GetAggregateResourceConfigRequest,get_aggregate_resource_config_request +GetAggregateResourceConfigResponse,get_aggregate_resource_config_response +GetAlarmsRequest,get_alarms_request +GetAlarmsResult,get_alarms_result +GetAliasInput,get_alias_input +GetAliasOutput,get_alias_output +GetAliasRequest,get_alias_request +GetAllowListRequest,get_allow_list_request +GetAllowListResponse,get_allow_list_response +GetAlternateContactRequest,get_alternate_contact_request +GetAlternateContactResponse,get_alternate_contact_response +GetAnalysisTemplateInput,get_analysis_template_input +GetAnalysisTemplateOutput,get_analysis_template_output +GetAnalyzedResourceRequest,get_analyzed_resource_request +GetAnalyzedResourceResponse,get_analyzed_resource_response +GetAnalyzerRequest,get_analyzer_request +GetAnalyzerResponse,get_analyzer_response +GetAnnotationImportRequest,get_annotation_import_request +GetAnnotationImportResponse,get_annotation_import_response +GetAnnotationStoreRequest,get_annotation_store_request +GetAnnotationStoreResponse,get_annotation_store_response +GetAnnotationStoreVersionRequest,get_annotation_store_version_request +GetAnnotationStoreVersionResponse,get_annotation_store_version_response +GetAnomaliesRequest,get_anomalies_request +GetAnomaliesResponse,get_anomalies_response +GetAnomalyGroupRequest,get_anomaly_group_request +GetAnomalyGroupResponse,get_anomaly_group_response +GetAnomalyMonitorsRequest,get_anomaly_monitors_request +GetAnomalyMonitorsResponse,get_anomaly_monitors_response +GetAnomalySubscriptionsRequest,get_anomaly_subscriptions_request +GetAnomalySubscriptionsResponse,get_anomaly_subscriptions_response +GetAnswerInput,get_answer_input +GetAnswerOutput,get_answer_output +GetApiAssociationRequest,get_api_association_request +GetApiAssociationResponse,get_api_association_response +GetApiCacheRequest,get_api_cache_request +GetApiCacheResponse,get_api_cache_response +GetApiKeyRequest,get_api_key_request +GetApiKeysRequest,get_api_keys_request +GetApiMappingRequest,get_api_mapping_request +GetApiMappingResponse,get_api_mapping_response +GetApiMappingsRequest,get_api_mappings_request +GetApiMappingsResponse,get_api_mappings_response +GetApiRequest,get_api_request +GetApiResponse,get_api_response +GetApisRequest,get_apis_request +GetApisResponse,get_apis_response +GetApnsChannelRequest,get_apns_channel_request +GetApnsChannelResponse,get_apns_channel_response +GetApnsSandboxChannelRequest,get_apns_sandbox_channel_request +GetApnsSandboxChannelResponse,get_apns_sandbox_channel_response +GetApnsVoipChannelRequest,get_apns_voip_channel_request +GetApnsVoipChannelResponse,get_apns_voip_channel_response +GetApnsVoipSandboxChannelRequest,get_apns_voip_sandbox_channel_request +GetApnsVoipSandboxChannelResponse,get_apns_voip_sandbox_channel_response +GetAppAuthorizationRequest,get_app_authorization_request +GetAppAuthorizationResponse,get_app_authorization_response +GetAppBundleRequest,get_app_bundle_request +GetAppBundleResponse,get_app_bundle_response +GetAppInstanceRetentionSettingsRequest,get_app_instance_retention_settings_request +GetAppInstanceRetentionSettingsResponse,get_app_instance_retention_settings_response +GetAppInstanceStreamingConfigurationsRequest,get_app_instance_streaming_configurations_request +GetAppInstanceStreamingConfigurationsResponse,get_app_instance_streaming_configurations_response +GetAppLaunchConfigurationRequest,get_app_launch_configuration_request +GetAppLaunchConfigurationResponse,get_app_launch_configuration_response +GetAppMonitorDataRequest,get_app_monitor_data_request +GetAppMonitorDataResponse,get_app_monitor_data_response +GetAppMonitorRequest,get_app_monitor_request +GetAppMonitorResponse,get_app_monitor_response +GetAppReplicationConfigurationRequest,get_app_replication_configuration_request +GetAppReplicationConfigurationResponse,get_app_replication_configuration_response +GetAppRequest,get_app_request +GetAppResponse,get_app_response +GetAppResult,get_app_result +GetAppValidationConfigurationRequest,get_app_validation_configuration_request +GetAppValidationConfigurationResponse,get_app_validation_configuration_response +GetAppValidationOutputRequest,get_app_validation_output_request +GetAppValidationOutputResponse,get_app_validation_output_response +GetApplicationComponentDetailsRequest,get_application_component_details_request +GetApplicationComponentDetailsResponse,get_application_component_details_response +GetApplicationComponentStrategiesRequest,get_application_component_strategies_request +GetApplicationComponentStrategiesResponse,get_application_component_strategies_response +GetApplicationDateRangeKpiRequest,get_application_date_range_kpi_request +GetApplicationDateRangeKpiResponse,get_application_date_range_kpi_response +GetApplicationInput,get_application_input +GetApplicationOutput,get_application_output +GetApplicationPolicyRequest,get_application_policy_request +GetApplicationPolicyResponse,get_application_policy_response +GetApplicationRequest,get_application_request +GetApplicationResponse,get_application_response +GetApplicationRevisionInput,get_application_revision_input +GetApplicationRevisionOutput,get_application_revision_output +GetApplicationSettingsRequest,get_application_settings_request +GetApplicationSettingsResponse,get_application_settings_response +GetApplicationVersionRequest,get_application_version_request +GetApplicationVersionResponse,get_application_version_response +GetAppliedSchemaVersionRequest,get_applied_schema_version_request +GetAppliedSchemaVersionResponse,get_applied_schema_version_response +GetApprovalRuleTemplateInput,get_approval_rule_template_input +GetApprovalRuleTemplateOutput,get_approval_rule_template_output +GetAppsListRequest,get_apps_list_request +GetAppsListResponse,get_apps_list_response +GetAppsRequest,get_apps_request +GetAppsResponse,get_apps_response +GetArchitectureRecommendationsRequest,get_architecture_recommendations_request +GetArchitectureRecommendationsResponse,get_architecture_recommendations_response +GetArchiveRuleRequest,get_archive_rule_request +GetArchiveRuleResponse,get_archive_rule_response +GetArtifactUrlRequest,get_artifact_url_request +GetArtifactUrlResult,get_artifact_url_result +GetAssessmentFrameworkRequest,get_assessment_framework_request +GetAssessmentFrameworkResponse,get_assessment_framework_response +GetAssessmentReportRequest,get_assessment_report_request +GetAssessmentReportResponse,get_assessment_report_response +GetAssessmentReportUrlRequest,get_assessment_report_url_request +GetAssessmentReportUrlResponse,get_assessment_report_url_response +GetAssessmentRequest,get_assessment_request +GetAssessmentResponse,get_assessment_response +GetAssetPropertyAggregatesRequest,get_asset_property_aggregates_request +GetAssetPropertyAggregatesResponse,get_asset_property_aggregates_response +GetAssetPropertyValueHistoryRequest,get_asset_property_value_history_request +GetAssetPropertyValueHistoryResponse,get_asset_property_value_history_response +GetAssetPropertyValueRequest,get_asset_property_value_request +GetAssetPropertyValueResponse,get_asset_property_value_response +GetAssetRequest,get_asset_request +GetAssetResponse,get_asset_response +GetAssignmentRequest,get_assignment_request +GetAssignmentResponse,get_assignment_response +GetAssistantAssociationRequest,get_assistant_association_request +GetAssistantAssociationResponse,get_assistant_association_response +GetAssistantRequest,get_assistant_request +GetAssistantResponse,get_assistant_response +GetAssociatedEnclaveCertificateIamRolesRequest,get_associated_enclave_certificate_iam_roles_request +GetAssociatedEnclaveCertificateIamRolesResult,get_associated_enclave_certificate_iam_roles_result +GetAssociatedIpv6PoolCidrsRequest,get_associated_ipv6_pool_cidrs_request +GetAssociatedIpv6PoolCidrsResult,get_associated_ipv6_pool_cidrs_result +GetAssociatedResourceRequest,get_associated_resource_request +GetAssociatedResourceResponse,get_associated_resource_response +GetAssociatedRoleRequest,get_associated_role_request +GetAssociatedRoleResponse,get_associated_role_response +GetAssociationForServiceQuotaTemplateResponse,get_association_for_service_quota_template_response +GetAttachmentRequest,get_attachment_request +GetAttachmentResponse,get_attachment_response +GetAttendeeRequest,get_attendee_request +GetAttendeeResponse,get_attendee_response +GetAttributeGroupRequest,get_attribute_group_request +GetAttributeGroupResponse,get_attribute_group_response +GetAttributeValuesRequest,get_attribute_values_request +GetAttributeValuesResponse,get_attribute_values_response +GetAuthPolicyRequest,get_auth_policy_request +GetAuthPolicyResponse,get_auth_policy_response +GetAuthorizationTokenRequest,get_authorization_token_request +GetAuthorizationTokenResponse,get_authorization_token_response +GetAuthorizationTokenResult,get_authorization_token_result +GetAuthorizerRequest,get_authorizer_request +GetAuthorizerResponse,get_authorizer_response +GetAuthorizersRequest,get_authorizers_request +GetAuthorizersResponse,get_authorizers_response +GetAutoMergingPreviewRequest,get_auto_merging_preview_request +GetAutoMergingPreviewResponse,get_auto_merging_preview_response +GetAutoScalingGroupRecommendationsRequest,get_auto_scaling_group_recommendations_request +GetAutoScalingGroupRecommendationsResponse,get_auto_scaling_group_recommendations_response +GetAutoSnapshotsRequest,get_auto_snapshots_request +GetAutoSnapshotsResult,get_auto_snapshots_result +GetAutoTerminationPolicyInput,get_auto_termination_policy_input +GetAutoTerminationPolicyOutput,get_auto_termination_policy_output +GetAutomatedDiscoveryConfigurationResponse,get_automated_discovery_configuration_response +GetAutomationExecutionRequest,get_automation_execution_request +GetAutomationExecutionResult,get_automation_execution_result +GetAwsNetworkPerformanceDataRequest,get_aws_network_performance_data_request +GetAwsNetworkPerformanceDataResult,get_aws_network_performance_data_result +GetBackendAPIModelsRequest,get_backend_api_models_request +GetBackendAPIModelsResponse,get_backend_api_models_response +GetBackendAPIRequest,get_backend_api_request +GetBackendAPIResponse,get_backend_api_response +GetBackendAuthRequest,get_backend_auth_request +GetBackendAuthResponse,get_backend_auth_response +GetBackendEnvironmentRequest,get_backend_environment_request +GetBackendEnvironmentResult,get_backend_environment_result +GetBackendJobRequest,get_backend_job_request +GetBackendJobResponse,get_backend_job_response +GetBackendRequest,get_backend_request +GetBackendResponse,get_backend_response +GetBackendStorageRequest,get_backend_storage_request +GetBackendStorageResourceConfig,get_backend_storage_resource_config +GetBackendStorageResponse,get_backend_storage_response +GetBackupPlanFromJSONInput,get_backup_plan_from_json_input +GetBackupPlanFromJSONOutput,get_backup_plan_from_json_output +GetBackupPlanFromTemplateInput,get_backup_plan_from_template_input +GetBackupPlanFromTemplateOutput,get_backup_plan_from_template_output +GetBackupPlanInput,get_backup_plan_input +GetBackupPlanOutput,get_backup_plan_output +GetBackupSelectionInput,get_backup_selection_input +GetBackupSelectionOutput,get_backup_selection_output +GetBackupVaultAccessPolicyInput,get_backup_vault_access_policy_input +GetBackupVaultAccessPolicyOutput,get_backup_vault_access_policy_output +GetBackupVaultNotificationsInput,get_backup_vault_notifications_input +GetBackupVaultNotificationsOutput,get_backup_vault_notifications_output +GetBaiduChannelRequest,get_baidu_channel_request +GetBaiduChannelResponse,get_baidu_channel_response +GetBandwidthRateLimitScheduleInput,get_bandwidth_rate_limit_schedule_input +GetBandwidthRateLimitScheduleOutput,get_bandwidth_rate_limit_schedule_output +GetBasePathMappingRequest,get_base_path_mapping_request +GetBasePathMappingsRequest,get_base_path_mappings_request +GetBatchImportJobsRequest,get_batch_import_jobs_request +GetBatchImportJobsResult,get_batch_import_jobs_result +GetBatchJobExecutionRequest,get_batch_job_execution_request +GetBatchJobExecutionResponse,get_batch_job_execution_response +GetBatchPredictionInput,get_batch_prediction_input +GetBatchPredictionJobsRequest,get_batch_prediction_jobs_request +GetBatchPredictionJobsResult,get_batch_prediction_jobs_result +GetBatchPredictionOutput,get_batch_prediction_output +GetBehaviorModelTrainingSummariesRequest,get_behavior_model_training_summaries_request +GetBehaviorModelTrainingSummariesResponse,get_behavior_model_training_summaries_response +GetBlacklistReportsRequest,get_blacklist_reports_request +GetBlacklistReportsResponse,get_blacklist_reports_response +GetBlobInput,get_blob_input +GetBlobOutput,get_blob_output +GetBlockPublicAccessConfigurationOutput,get_block_public_access_configuration_output +GetBlockRequest,get_block_request +GetBlockResponse,get_block_response +GetBlueprintRequest,get_blueprint_request +GetBlueprintResponse,get_blueprint_response +GetBlueprintRunRequest,get_blueprint_run_request +GetBlueprintRunResponse,get_blueprint_run_response +GetBlueprintRunsRequest,get_blueprint_runs_request +GetBlueprintRunsResponse,get_blueprint_runs_response +GetBlueprintsRequest,get_blueprints_request +GetBlueprintsResult,get_blueprints_result +GetBootstrapBrokersRequest,get_bootstrap_brokers_request +GetBootstrapBrokersResponse,get_bootstrap_brokers_response +GetBotAliasRequest,get_bot_alias_request +GetBotAliasResponse,get_bot_alias_response +GetBotAliasesRequest,get_bot_aliases_request +GetBotAliasesResponse,get_bot_aliases_response +GetBotChannelAssociationRequest,get_bot_channel_association_request +GetBotChannelAssociationResponse,get_bot_channel_association_response +GetBotChannelAssociationsRequest,get_bot_channel_associations_request +GetBotChannelAssociationsResponse,get_bot_channel_associations_response +GetBotRequest,get_bot_request +GetBotResponse,get_bot_response +GetBotVersionsRequest,get_bot_versions_request +GetBotVersionsResponse,get_bot_versions_response +GetBotsRequest,get_bots_request +GetBotsResponse,get_bots_response +GetBranchInput,get_branch_input +GetBranchOutput,get_branch_output +GetBranchRequest,get_branch_request +GetBranchResult,get_branch_result +GetBrowserSettingsRequest,get_browser_settings_request +GetBrowserSettingsResponse,get_browser_settings_response +GetBucketAccelerateConfigurationOutput,get_bucket_accelerate_configuration_output +GetBucketAccelerateConfigurationRequest,get_bucket_accelerate_configuration_request +GetBucketAccessKeysRequest,get_bucket_access_keys_request +GetBucketAccessKeysResult,get_bucket_access_keys_result +GetBucketAclOutput,get_bucket_acl_output +GetBucketAclRequest,get_bucket_acl_request +GetBucketAnalyticsConfigurationOutput,get_bucket_analytics_configuration_output +GetBucketAnalyticsConfigurationRequest,get_bucket_analytics_configuration_request +GetBucketBundlesRequest,get_bucket_bundles_request +GetBucketBundlesResult,get_bucket_bundles_result +GetBucketCorsOutput,get_bucket_cors_output +GetBucketCorsRequest,get_bucket_cors_request +GetBucketEncryptionOutput,get_bucket_encryption_output +GetBucketEncryptionRequest,get_bucket_encryption_request +GetBucketIntelligentTieringConfigurationOutput,get_bucket_intelligent_tiering_configuration_output +GetBucketIntelligentTieringConfigurationRequest,get_bucket_intelligent_tiering_configuration_request +GetBucketInventoryConfigurationOutput,get_bucket_inventory_configuration_output +GetBucketInventoryConfigurationRequest,get_bucket_inventory_configuration_request +GetBucketLifecycleConfigurationOutput,get_bucket_lifecycle_configuration_output +GetBucketLifecycleConfigurationRequest,get_bucket_lifecycle_configuration_request +GetBucketLifecycleConfigurationResult,get_bucket_lifecycle_configuration_result +GetBucketLocationOutput,get_bucket_location_output +GetBucketLocationRequest,get_bucket_location_request +GetBucketLoggingOutput,get_bucket_logging_output +GetBucketLoggingRequest,get_bucket_logging_request +GetBucketMetricDataRequest,get_bucket_metric_data_request +GetBucketMetricDataResult,get_bucket_metric_data_result +GetBucketMetricsConfigurationOutput,get_bucket_metrics_configuration_output +GetBucketMetricsConfigurationRequest,get_bucket_metrics_configuration_request +GetBucketNotificationConfigurationRequest,get_bucket_notification_configuration_request +GetBucketOwnershipControlsOutput,get_bucket_ownership_controls_output +GetBucketOwnershipControlsRequest,get_bucket_ownership_controls_request +GetBucketPolicyOutput,get_bucket_policy_output +GetBucketPolicyRequest,get_bucket_policy_request +GetBucketPolicyResult,get_bucket_policy_result +GetBucketPolicyStatusOutput,get_bucket_policy_status_output +GetBucketPolicyStatusRequest,get_bucket_policy_status_request +GetBucketReplicationOutput,get_bucket_replication_output +GetBucketReplicationRequest,get_bucket_replication_request +GetBucketReplicationResult,get_bucket_replication_result +GetBucketRequest,get_bucket_request +GetBucketRequestPaymentOutput,get_bucket_request_payment_output +GetBucketRequestPaymentRequest,get_bucket_request_payment_request +GetBucketResult,get_bucket_result +GetBucketStatisticsRequest,get_bucket_statistics_request +GetBucketStatisticsResponse,get_bucket_statistics_response +GetBucketTaggingOutput,get_bucket_tagging_output +GetBucketTaggingRequest,get_bucket_tagging_request +GetBucketTaggingResult,get_bucket_tagging_result +GetBucketVersioningOutput,get_bucket_versioning_output +GetBucketVersioningRequest,get_bucket_versioning_request +GetBucketVersioningResult,get_bucket_versioning_result +GetBucketWebsiteOutput,get_bucket_website_output +GetBucketWebsiteRequest,get_bucket_website_request +GetBucketsAggregationRequest,get_buckets_aggregation_request +GetBucketsAggregationResponse,get_buckets_aggregation_response +GetBucketsRequest,get_buckets_request +GetBucketsResult,get_buckets_result +GetBuiltinIntentRequest,get_builtin_intent_request +GetBuiltinIntentResponse,get_builtin_intent_response +GetBuiltinIntentsRequest,get_builtin_intents_request +GetBuiltinIntentsResponse,get_builtin_intents_response +GetBuiltinSlotTypesRequest,get_builtin_slot_types_request +GetBuiltinSlotTypesResponse,get_builtin_slot_types_response +GetBulkDeploymentStatusRequest,get_bulk_deployment_status_request +GetBulkDeploymentStatusResponse,get_bulk_deployment_status_response +GetBulkPublishDetailsRequest,get_bulk_publish_details_request +GetBulkPublishDetailsResponse,get_bulk_publish_details_response +GetBundlesRequest,get_bundles_request +GetBundlesResult,get_bundles_result +GetByteMatchSetRequest,get_byte_match_set_request +GetByteMatchSetResponse,get_byte_match_set_response +GetCSVHeaderRequest,get_csv_header_request +GetCSVHeaderResponse,get_csv_header_response +GetCachePolicyConfigRequest,get_cache_policy_config_request +GetCachePolicyConfigResult,get_cache_policy_config_result +GetCachePolicyRequest,get_cache_policy_request +GetCachePolicyResult,get_cache_policy_result +GetCalculatedAttributeDefinitionRequest,get_calculated_attribute_definition_request +GetCalculatedAttributeDefinitionResponse,get_calculated_attribute_definition_response +GetCalculatedAttributeForProfileRequest,get_calculated_attribute_for_profile_request +GetCalculatedAttributeForProfileResponse,get_calculated_attribute_for_profile_response +GetCalculationExecutionCodeRequest,get_calculation_execution_code_request +GetCalculationExecutionCodeResponse,get_calculation_execution_code_response +GetCalculationExecutionRequest,get_calculation_execution_request +GetCalculationExecutionResponse,get_calculation_execution_response +GetCalculationExecutionStatusRequest,get_calculation_execution_status_request +GetCalculationExecutionStatusResponse,get_calculation_execution_status_response +GetCalendarStateRequest,get_calendar_state_request +GetCalendarStateResponse,get_calendar_state_response +GetCallAnalyticsCategoryRequest,get_call_analytics_category_request +GetCallAnalyticsCategoryResponse,get_call_analytics_category_response +GetCallAnalyticsJobRequest,get_call_analytics_job_request +GetCallAnalyticsJobResponse,get_call_analytics_job_response +GetCallerIdentityResponse,get_caller_identity_response +GetCampaignActivitiesRequest,get_campaign_activities_request +GetCampaignActivitiesResponse,get_campaign_activities_response +GetCampaignDateRangeKpiRequest,get_campaign_date_range_kpi_request +GetCampaignDateRangeKpiResponse,get_campaign_date_range_kpi_response +GetCampaignRequest,get_campaign_request +GetCampaignResponse,get_campaign_response +GetCampaignStateBatchRequest,get_campaign_state_batch_request +GetCampaignStateBatchResponse,get_campaign_state_batch_response +GetCampaignStateRequest,get_campaign_state_request +GetCampaignStateResponse,get_campaign_state_response +GetCampaignVersionRequest,get_campaign_version_request +GetCampaignVersionResponse,get_campaign_version_response +GetCampaignVersionsRequest,get_campaign_versions_request +GetCampaignVersionsResponse,get_campaign_versions_response +GetCampaignsRequest,get_campaigns_request +GetCampaignsResponse,get_campaigns_response +GetCanaryRequest,get_canary_request +GetCanaryResponse,get_canary_response +GetCanaryRunsRequest,get_canary_runs_request +GetCanaryRunsResponse,get_canary_runs_response +GetCapacityAssignmentConfigurationInput,get_capacity_assignment_configuration_input +GetCapacityAssignmentConfigurationOutput,get_capacity_assignment_configuration_output +GetCapacityReservationInput,get_capacity_reservation_input +GetCapacityReservationOutput,get_capacity_reservation_output +GetCapacityReservationUsageRequest,get_capacity_reservation_usage_request +GetCapacityReservationUsageResult,get_capacity_reservation_usage_result +GetCardinalityRequest,get_cardinality_request +GetCardinalityResponse,get_cardinality_response +GetCaseEventConfigurationRequest,get_case_event_configuration_request +GetCaseEventConfigurationResponse,get_case_event_configuration_response +GetCaseRequest,get_case_request +GetCaseResponse,get_case_response +GetCatalogImportStatusRequest,get_catalog_import_status_request +GetCatalogImportStatusResponse,get_catalog_import_status_response +GetCatalogItemInput,get_catalog_item_input +GetCatalogItemOutput,get_catalog_item_output +GetCelebrityInfoRequest,get_celebrity_info_request +GetCelebrityInfoResponse,get_celebrity_info_response +GetCelebrityRecognitionRequest,get_celebrity_recognition_request +GetCelebrityRecognitionResponse,get_celebrity_recognition_response +GetCellReadinessSummaryRequest,get_cell_readiness_summary_request +GetCellReadinessSummaryResponse,get_cell_readiness_summary_response +GetCellRequest,get_cell_request +GetCellResponse,get_cell_response +GetCertificateAuthorityCertificateRequest,get_certificate_authority_certificate_request +GetCertificateAuthorityCertificateResponse,get_certificate_authority_certificate_response +GetCertificateAuthorityCsrRequest,get_certificate_authority_csr_request +GetCertificateAuthorityCsrResponse,get_certificate_authority_csr_response +GetCertificateRequest,get_certificate_request +GetCertificateResponse,get_certificate_response +GetCertificatesRequest,get_certificates_request +GetCertificatesResult,get_certificates_result +GetChangeLogsRequest,get_change_logs_request +GetChangeLogsResponse,get_change_logs_response +GetChangeRequest,get_change_request +GetChangeResponse,get_change_response +GetChangeTokenResponse,get_change_token_response +GetChangeTokenStatusRequest,get_change_token_status_request +GetChangeTokenStatusResponse,get_change_token_status_response +GetChangesetRequest,get_changeset_request +GetChangesetResponse,get_changeset_response +GetChannelGroupRequest,get_channel_group_request +GetChannelGroupResponse,get_channel_group_response +GetChannelMembershipPreferencesRequest,get_channel_membership_preferences_request +GetChannelMembershipPreferencesResponse,get_channel_membership_preferences_response +GetChannelMessageRequest,get_channel_message_request +GetChannelMessageResponse,get_channel_message_response +GetChannelMessageStatusRequest,get_channel_message_status_request +GetChannelMessageStatusResponse,get_channel_message_status_response +GetChannelPolicyRequest,get_channel_policy_request +GetChannelPolicyResponse,get_channel_policy_response +GetChannelRequest,get_channel_request +GetChannelResponse,get_channel_response +GetChannelScheduleRequest,get_channel_schedule_request +GetChannelScheduleResponse,get_channel_schedule_response +GetChannelsRequest,get_channels_request +GetChannelsResponse,get_channels_response +GetCheckerIpRangesResponse,get_checker_ip_ranges_response +GetChunkInput,get_chunk_input +GetChunkOutput,get_chunk_output +GetClassificationExportConfigurationResponse,get_classification_export_configuration_response +GetClassificationScopeRequest,get_classification_scope_request +GetClassificationScopeResponse,get_classification_scope_response +GetClassifierRequest,get_classifier_request +GetClassifierResponse,get_classifier_response +GetClassifiersRequest,get_classifiers_request +GetClassifiersResponse,get_classifiers_response +GetClientCertificateRequest,get_client_certificate_request +GetClientCertificatesRequest,get_client_certificates_request +GetClipInput,get_clip_input +GetClipOutput,get_clip_output +GetCloudFormationStackRecordsRequest,get_cloud_formation_stack_records_request +GetCloudFormationStackRecordsResult,get_cloud_formation_stack_records_result +GetCloudFormationTemplateRequest,get_cloud_formation_template_request +GetCloudFormationTemplateResponse,get_cloud_formation_template_response +GetCloudFrontOriginAccessIdentityConfigRequest,get_cloud_front_origin_access_identity_config_request +GetCloudFrontOriginAccessIdentityConfigResult,get_cloud_front_origin_access_identity_config_result +GetCloudFrontOriginAccessIdentityRequest,get_cloud_front_origin_access_identity_request +GetCloudFrontOriginAccessIdentityResult,get_cloud_front_origin_access_identity_result +GetClusterCredentialsMessage,get_cluster_credentials_message +GetClusterCredentialsWithIAMMessage,get_cluster_credentials_with_iam_message +GetClusterInput,get_cluster_input +GetClusterOutput,get_cluster_output +GetClusterPolicyRequest,get_cluster_policy_request +GetClusterPolicyResponse,get_cluster_policy_response +GetClusterSessionCredentialsInput,get_cluster_session_credentials_input +GetClusterSessionCredentialsOutput,get_cluster_session_credentials_output +GetClusterSnapshotInput,get_cluster_snapshot_input +GetClusterSnapshotOutput,get_cluster_snapshot_output +GetCodeBindingSourceRequest,get_code_binding_source_request +GetCodeBindingSourceResponse,get_code_binding_source_response +GetCodeSigningConfigRequest,get_code_signing_config_request +GetCodeSigningConfigResponse,get_code_signing_config_response +GetCodegenJobRequest,get_codegen_job_request +GetCodegenJobResponse,get_codegen_job_response +GetCognitoEventsRequest,get_cognito_events_request +GetCognitoEventsResponse,get_cognito_events_response +GetCoipPoolUsageRequest,get_coip_pool_usage_request +GetCoipPoolUsageResult,get_coip_pool_usage_result +GetCollaborationAnalysisTemplateInput,get_collaboration_analysis_template_input +GetCollaborationAnalysisTemplateOutput,get_collaboration_analysis_template_output +GetCollaborationInput,get_collaboration_input +GetCollaborationOutput,get_collaboration_output +GetColumnStatisticsForPartitionRequest,get_column_statistics_for_partition_request +GetColumnStatisticsForPartitionResponse,get_column_statistics_for_partition_response +GetColumnStatisticsForTableRequest,get_column_statistics_for_table_request +GetColumnStatisticsForTableResponse,get_column_statistics_for_table_response +GetCommandInvocationRequest,get_command_invocation_request +GetCommandInvocationResult,get_command_invocation_result +GetCommentInput,get_comment_input +GetCommentOutput,get_comment_output +GetCommentReactionsInput,get_comment_reactions_input +GetCommentReactionsOutput,get_comment_reactions_output +GetCommentsForComparedCommitInput,get_comments_for_compared_commit_input +GetCommentsForComparedCommitOutput,get_comments_for_compared_commit_output +GetCommentsForPullRequestInput,get_comments_for_pull_request_input +GetCommentsForPullRequestOutput,get_comments_for_pull_request_output +GetCommitInput,get_commit_input +GetCommitOutput,get_commit_output +GetCompatibleElasticsearchVersionsRequest,get_compatible_elasticsearch_versions_request +GetCompatibleElasticsearchVersionsResponse,get_compatible_elasticsearch_versions_response +GetCompatibleKafkaVersionsRequest,get_compatible_kafka_versions_request +GetCompatibleKafkaVersionsResponse,get_compatible_kafka_versions_response +GetCompatibleVersionsRequest,get_compatible_versions_request +GetCompatibleVersionsResponse,get_compatible_versions_response +GetComplianceDetailRequest,get_compliance_detail_request +GetComplianceDetailResponse,get_compliance_detail_response +GetComplianceDetailsByConfigRuleRequest,get_compliance_details_by_config_rule_request +GetComplianceDetailsByConfigRuleResponse,get_compliance_details_by_config_rule_response +GetComplianceDetailsByResourceRequest,get_compliance_details_by_resource_request +GetComplianceDetailsByResourceResponse,get_compliance_details_by_resource_response +GetComplianceSummaryByConfigRuleResponse,get_compliance_summary_by_config_rule_response +GetComplianceSummaryByResourceTypeRequest,get_compliance_summary_by_resource_type_request +GetComplianceSummaryByResourceTypeResponse,get_compliance_summary_by_resource_type_response +GetComplianceSummaryInput,get_compliance_summary_input +GetComplianceSummaryOutput,get_compliance_summary_output +GetComponentInput,get_component_input +GetComponentOutput,get_component_output +GetComponentPolicyRequest,get_component_policy_request +GetComponentPolicyResponse,get_component_policy_response +GetComponentRequest,get_component_request +GetComponentResponse,get_component_response +GetComponentTypeRequest,get_component_type_request +GetComponentTypeResponse,get_component_type_response +GetComponentVersionArtifactRequest,get_component_version_artifact_request +GetComponentVersionArtifactResponse,get_component_version_artifact_response +GetComputeAccessInput,get_compute_access_input +GetComputeAccessOutput,get_compute_access_output +GetComputeAuthTokenInput,get_compute_auth_token_input +GetComputeAuthTokenOutput,get_compute_auth_token_output +GetConferencePreferenceResponse,get_conference_preference_response +GetConferenceProviderRequest,get_conference_provider_request +GetConferenceProviderResponse,get_conference_provider_response +GetConfigRequest,get_config_request +GetConfigResponse,get_config_response +GetConfigurationProfileRequest,get_configuration_profile_request +GetConfigurationRequest,get_configuration_request +GetConfigurationResponse,get_configuration_response +GetConfigurationSetEventDestinationsRequest,get_configuration_set_event_destinations_request +GetConfigurationSetEventDestinationsResponse,get_configuration_set_event_destinations_response +GetConfigurationSetRequest,get_configuration_set_request +GetConfigurationSetResponse,get_configuration_set_response +GetConfiguredTableAnalysisRuleInput,get_configured_table_analysis_rule_input +GetConfiguredTableAnalysisRuleOutput,get_configured_table_analysis_rule_output +GetConfiguredTableAssociationInput,get_configured_table_association_input +GetConfiguredTableAssociationOutput,get_configured_table_association_output +GetConfiguredTableInput,get_configured_table_input +GetConfiguredTableOutput,get_configured_table_output +GetConformancePackComplianceDetailsRequest,get_conformance_pack_compliance_details_request +GetConformancePackComplianceDetailsResponse,get_conformance_pack_compliance_details_response +GetConformancePackComplianceSummaryRequest,get_conformance_pack_compliance_summary_request +GetConformancePackComplianceSummaryResponse,get_conformance_pack_compliance_summary_response +GetConnectAttachmentRequest,get_connect_attachment_request +GetConnectAttachmentResponse,get_connect_attachment_response +GetConnectInstanceConfigRequest,get_connect_instance_config_request +GetConnectInstanceConfigResponse,get_connect_instance_config_response +GetConnectPeerAssociationsRequest,get_connect_peer_associations_request +GetConnectPeerAssociationsResponse,get_connect_peer_associations_response +GetConnectPeerRequest,get_connect_peer_request +GetConnectPeerResponse,get_connect_peer_response +GetConnectionInput,get_connection_input +GetConnectionOutput,get_connection_output +GetConnectionRequest,get_connection_request +GetConnectionResponse,get_connection_response +GetConnectionStatusRequest,get_connection_status_request +GetConnectionStatusResponse,get_connection_status_response +GetConnectionsFilter,get_connections_filter +GetConnectionsRequest,get_connections_request +GetConnectionsResponse,get_connections_response +GetConnectivityInfoRequest,get_connectivity_info_request +GetConnectivityInfoResponse,get_connectivity_info_response +GetConnectorDefinitionRequest,get_connector_definition_request +GetConnectorDefinitionResponse,get_connector_definition_response +GetConnectorDefinitionVersionRequest,get_connector_definition_version_request +GetConnectorDefinitionVersionResponse,get_connector_definition_version_response +GetConnectorRequest,get_connector_request +GetConnectorResponse,get_connector_response +GetConnectorsRequest,get_connectors_request +GetConnectorsResponse,get_connectors_response +GetConsoleOutputRequest,get_console_output_request +GetConsoleOutputResult,get_console_output_result +GetConsoleScreenshotRequest,get_console_screenshot_request +GetConsoleScreenshotResult,get_console_screenshot_result +GetConsolidatedReportInput,get_consolidated_report_input +GetConsolidatedReportOutput,get_consolidated_report_output +GetContactAttributesRequest,get_contact_attributes_request +GetContactAttributesResponse,get_contact_attributes_response +GetContactChannelRequest,get_contact_channel_request +GetContactChannelResult,get_contact_channel_result +GetContactInformationRequest,get_contact_information_request +GetContactInformationResponse,get_contact_information_response +GetContactListRequest,get_contact_list_request +GetContactListResponse,get_contact_list_response +GetContactMethodsRequest,get_contact_methods_request +GetContactMethodsResult,get_contact_methods_result +GetContactPolicyRequest,get_contact_policy_request +GetContactPolicyResult,get_contact_policy_result +GetContactReachabilityStatusRequest,get_contact_reachability_status_request +GetContactReachabilityStatusResponse,get_contact_reachability_status_response +GetContactRequest,get_contact_request +GetContactResponse,get_contact_response +GetContactResult,get_contact_result +GetContainerAPIMetadataResult,get_container_api_metadata_result +GetContainerImagesRequest,get_container_images_request +GetContainerImagesResult,get_container_images_result +GetContainerLogRequest,get_container_log_request +GetContainerLogResult,get_container_log_result +GetContainerPolicyInput,get_container_policy_input +GetContainerPolicyOutput,get_container_policy_output +GetContainerRecipePolicyRequest,get_container_recipe_policy_request +GetContainerRecipePolicyResponse,get_container_recipe_policy_response +GetContainerRecipeRequest,get_container_recipe_request +GetContainerRecipeResponse,get_container_recipe_response +GetContainerServiceDeploymentsRequest,get_container_service_deployments_request +GetContainerServiceDeploymentsResult,get_container_service_deployments_result +GetContainerServiceMetricDataRequest,get_container_service_metric_data_request +GetContainerServiceMetricDataResult,get_container_service_metric_data_result +GetContainerServicePowersResult,get_container_service_powers_result +GetContainerServicesRequest,get_container_services_request +GetContentModerationRequest,get_content_moderation_request +GetContentModerationRequestMetadata,get_content_moderation_request_metadata +GetContentModerationResponse,get_content_moderation_response +GetContentRequest,get_content_request +GetContentResponse,get_content_response +GetContentSummaryRequest,get_content_summary_request +GetContentSummaryResponse,get_content_summary_response +GetContextKeysForCustomPolicyRequest,get_context_keys_for_custom_policy_request +GetContextKeysForPolicyResponse,get_context_keys_for_policy_response +GetContextKeysForPrincipalPolicyRequest,get_context_keys_for_principal_policy_request +GetContinuousDeploymentPolicyConfigRequest,get_continuous_deployment_policy_config_request +GetContinuousDeploymentPolicyConfigResult,get_continuous_deployment_policy_config_result +GetContinuousDeploymentPolicyRequest,get_continuous_deployment_policy_request +GetContinuousDeploymentPolicyResult,get_continuous_deployment_policy_result +GetControlOperationInput,get_control_operation_input +GetControlOperationOutput,get_control_operation_output +GetControlRequest,get_control_request +GetControlResponse,get_control_response +GetCoreDefinitionRequest,get_core_definition_request +GetCoreDefinitionResponse,get_core_definition_response +GetCoreDefinitionVersionRequest,get_core_definition_version_request +GetCoreDefinitionVersionResponse,get_core_definition_version_response +GetCoreDeviceRequest,get_core_device_request +GetCoreDeviceResponse,get_core_device_response +GetCoreNetworkChangeEventsRequest,get_core_network_change_events_request +GetCoreNetworkChangeEventsResponse,get_core_network_change_events_response +GetCoreNetworkChangeSetRequest,get_core_network_change_set_request +GetCoreNetworkChangeSetResponse,get_core_network_change_set_response +GetCoreNetworkPolicyRequest,get_core_network_policy_request +GetCoreNetworkPolicyResponse,get_core_network_policy_response +GetCoreNetworkRequest,get_core_network_request +GetCoreNetworkResponse,get_core_network_response +GetCorsPolicyInput,get_cors_policy_input +GetCorsPolicyOutput,get_cors_policy_output +GetCostAndUsageRequest,get_cost_and_usage_request +GetCostAndUsageResponse,get_cost_and_usage_response +GetCostAndUsageWithResourcesRequest,get_cost_and_usage_with_resources_request +GetCostAndUsageWithResourcesResponse,get_cost_and_usage_with_resources_response +GetCostCategoriesRequest,get_cost_categories_request +GetCostCategoriesResponse,get_cost_categories_response +GetCostEstimateRequest,get_cost_estimate_request +GetCostEstimateResult,get_cost_estimate_result +GetCostEstimationRequest,get_cost_estimation_request +GetCostEstimationResponse,get_cost_estimation_response +GetCostForecastRequest,get_cost_forecast_request +GetCostForecastResponse,get_cost_forecast_response +GetCoverageStatisticsRequest,get_coverage_statistics_request +GetCoverageStatisticsResponse,get_coverage_statistics_response +GetCrawlerMetricsRequest,get_crawler_metrics_request +GetCrawlerMetricsResponse,get_crawler_metrics_response +GetCrawlerRequest,get_crawler_request +GetCrawlerResponse,get_crawler_response +GetCrawlersRequest,get_crawlers_request +GetCrawlersResponse,get_crawlers_response +GetCredentialReportResponse,get_credential_report_response +GetCredentialsForIdentityInput,get_credentials_for_identity_input +GetCredentialsForIdentityResponse,get_credentials_for_identity_response +GetCredentialsRequest,get_credentials_request +GetCredentialsResponse,get_credentials_response +GetCurrentMetricDataRequest,get_current_metric_data_request +GetCurrentMetricDataResponse,get_current_metric_data_response +GetCurrentUserDataRequest,get_current_user_data_request +GetCurrentUserDataResponse,get_current_user_data_response +GetCurrentUserRequest,get_current_user_request +GetCurrentUserResponse,get_current_user_response +GetCustomDataIdentifierRequest,get_custom_data_identifier_request +GetCustomDataIdentifierResponse,get_custom_data_identifier_response +GetCustomEntityTypeRequest,get_custom_entity_type_request +GetCustomEntityTypeResponse,get_custom_entity_type_response +GetCustomModelRequest,get_custom_model_request +GetCustomModelResponse,get_custom_model_response +GetCustomRulePolicyRequest,get_custom_rule_policy_request +GetCustomRulePolicyResponse,get_custom_rule_policy_response +GetCustomVerificationEmailTemplateRequest,get_custom_verification_email_template_request +GetCustomVerificationEmailTemplateResponse,get_custom_verification_email_template_response +GetCustomerGatewayAssociationsRequest,get_customer_gateway_associations_request +GetCustomerGatewayAssociationsResponse,get_customer_gateway_associations_response +GetDASHStreamingSessionURLInput,get_dash_streaming_session_url_input +GetDASHStreamingSessionURLOutput,get_dash_streaming_session_url_output +GetDICOMImportJobRequest,get_dicom_import_job_request +GetDICOMImportJobResponse,get_dicom_import_job_response +GetDNSSECRequest,get_dnssec_request +GetDNSSECResponse,get_dnssec_response +GetDashboardEmbedUrlRequest,get_dashboard_embed_url_request +GetDashboardEmbedUrlResponse,get_dashboard_embed_url_response +GetDashboardForJobRunRequest,get_dashboard_for_job_run_request +GetDashboardForJobRunResponse,get_dashboard_for_job_run_response +GetDashboardInput,get_dashboard_input +GetDashboardOutput,get_dashboard_output +GetDataCatalogEncryptionSettingsRequest,get_data_catalog_encryption_settings_request +GetDataCatalogEncryptionSettingsResponse,get_data_catalog_encryption_settings_response +GetDataCatalogInput,get_data_catalog_input +GetDataCatalogOutput,get_data_catalog_output +GetDataCellsFilterRequest,get_data_cells_filter_request +GetDataCellsFilterResponse,get_data_cells_filter_response +GetDataEndpointInput,get_data_endpoint_input +GetDataEndpointOutput,get_data_endpoint_output +GetDataIntegrationRequest,get_data_integration_request +GetDataIntegrationResponse,get_data_integration_response +GetDataLakeExceptionSubscriptionResponse,get_data_lake_exception_subscription_response +GetDataLakeOrganizationConfigurationResponse,get_data_lake_organization_configuration_response +GetDataLakeSettingsRequest,get_data_lake_settings_request +GetDataLakeSettingsResponse,get_data_lake_settings_response +GetDataLakeSourcesRequest,get_data_lake_sources_request +GetDataLakeSourcesResponse,get_data_lake_sources_response +GetDataProtectionPolicyInput,get_data_protection_policy_input +GetDataProtectionPolicyRequest,get_data_protection_policy_request +GetDataProtectionPolicyResponse,get_data_protection_policy_response +GetDataQualityMetricsRequest,get_data_quality_metrics_request +GetDataQualityMetricsResponse,get_data_quality_metrics_response +GetDataQualityResultRequest,get_data_quality_result_request +GetDataQualityResultResponse,get_data_quality_result_response +GetDataQualityRuleRecommendationRunRequest,get_data_quality_rule_recommendation_run_request +GetDataQualityRuleRecommendationRunResponse,get_data_quality_rule_recommendation_run_response +GetDataQualityRulesetEvaluationRunRequest,get_data_quality_ruleset_evaluation_run_request +GetDataQualityRulesetEvaluationRunResponse,get_data_quality_ruleset_evaluation_run_response +GetDataQualityRulesetRequest,get_data_quality_ruleset_request +GetDataQualityRulesetResponse,get_data_quality_ruleset_response +GetDataRetrievalPolicyInput,get_data_retrieval_policy_input +GetDataRetrievalPolicyOutput,get_data_retrieval_policy_output +GetDataSetDetailsRequest,get_data_set_details_request +GetDataSetDetailsResponse,get_data_set_details_response +GetDataSetImportTaskRequest,get_data_set_import_task_request +GetDataSetImportTaskResponse,get_data_set_import_task_response +GetDataSetRequest,get_data_set_request +GetDataSetResponse,get_data_set_response +GetDataSourceInput,get_data_source_input +GetDataSourceOutput,get_data_source_output +GetDataSourceRequest,get_data_source_request +GetDataSourceResponse,get_data_source_response +GetDataViewRequest,get_data_view_request +GetDataViewResponse,get_data_view_response +GetDatabaseInput,get_database_input +GetDatabaseOutput,get_database_output +GetDatabaseRequest,get_database_request +GetDatabaseResponse,get_database_response +GetDatabasesRequest,get_databases_request +GetDatabasesResponse,get_databases_response +GetDataflowEndpointGroupRequest,get_dataflow_endpoint_group_request +GetDataflowEndpointGroupResponse,get_dataflow_endpoint_group_response +GetDataflowGraphRequest,get_dataflow_graph_request +GetDataflowGraphResponse,get_dataflow_graph_response +GetDatasetContentRequest,get_dataset_content_request +GetDatasetContentResponse,get_dataset_content_response +GetDatasetRequest,get_dataset_request +GetDatasetResponse,get_dataset_response +GetDatastoreRequest,get_datastore_request +GetDatastoreResponse,get_datastore_response +GetDecoderManifestRequest,get_decoder_manifest_request +GetDecoderManifestResponse,get_decoder_manifest_response +GetDecryptedAPIKeyRequest,get_decrypted_api_key_request +GetDecryptedAPIKeyResponse,get_decrypted_api_key_response +GetDedicatedIpPoolRequest,get_dedicated_ip_pool_request +GetDedicatedIpPoolResponse,get_dedicated_ip_pool_response +GetDedicatedIpRequest,get_dedicated_ip_request +GetDedicatedIpResponse,get_dedicated_ip_response +GetDedicatedIpsRequest,get_dedicated_ips_request +GetDedicatedIpsResponse,get_dedicated_ips_response +GetDefaultCreditSpecificationRequest,get_default_credit_specification_request +GetDefaultCreditSpecificationResult,get_default_credit_specification_result +GetDefaultPatchBaselineRequest,get_default_patch_baseline_request +GetDefaultPatchBaselineResult,get_default_patch_baseline_result +GetDefaultRetentionPolicyRequest,get_default_retention_policy_request +GetDefaultRetentionPolicyResponse,get_default_retention_policy_response +GetDefaultViewOutput,get_default_view_output +GetDelegatedAdminAccountResponse,get_delegated_admin_account_response +GetDelegationsRequest,get_delegations_request +GetDelegationsResponse,get_delegations_response +GetDeleteEventsByEventTypeStatusRequest,get_delete_events_by_event_type_status_request +GetDeleteEventsByEventTypeStatusResult,get_delete_events_by_event_type_status_result +GetDeliverabilityDashboardOptionsResponse,get_deliverability_dashboard_options_response +GetDeliverabilityTestReportRequest,get_deliverability_test_report_request +GetDeliverabilityTestReportResponse,get_deliverability_test_report_response +GetDeployablePatchSnapshotForInstanceRequest,get_deployable_patch_snapshot_for_instance_request +GetDeployablePatchSnapshotForInstanceResult,get_deployable_patch_snapshot_for_instance_result +GetDeploymentConfigInput,get_deployment_config_input +GetDeploymentConfigOutput,get_deployment_config_output +GetDeploymentGroupInput,get_deployment_group_input +GetDeploymentGroupOutput,get_deployment_group_output +GetDeploymentInput,get_deployment_input +GetDeploymentInstanceInput,get_deployment_instance_input +GetDeploymentInstanceOutput,get_deployment_instance_output +GetDeploymentOutput,get_deployment_output +GetDeploymentRequest,get_deployment_request +GetDeploymentResponse,get_deployment_response +GetDeploymentStatusRequest,get_deployment_status_request +GetDeploymentStatusResponse,get_deployment_status_response +GetDeploymentStrategyRequest,get_deployment_strategy_request +GetDeploymentTargetInput,get_deployment_target_input +GetDeploymentTargetOutput,get_deployment_target_output +GetDeploymentsRequest,get_deployments_request +GetDeploymentsResponse,get_deployments_response +GetDeploymentsResult,get_deployments_result +GetDestinationRequest,get_destination_request +GetDestinationResponse,get_destination_response +GetDetectorModelAnalysisResultsRequest,get_detector_model_analysis_results_request +GetDetectorModelAnalysisResultsResponse,get_detector_model_analysis_results_response +GetDetectorRequest,get_detector_request +GetDetectorResponse,get_detector_response +GetDetectorVersionRequest,get_detector_version_request +GetDetectorVersionResult,get_detector_version_result +GetDetectorsRequest,get_detectors_request +GetDetectorsResult,get_detectors_result +GetDevEndpointRequest,get_dev_endpoint_request +GetDevEndpointResponse,get_dev_endpoint_response +GetDevEndpointsRequest,get_dev_endpoints_request +GetDevEndpointsResponse,get_dev_endpoints_response +GetDevEnvironmentRequest,get_dev_environment_request +GetDevEnvironmentResponse,get_dev_environment_response +GetDeviceDefinitionRequest,get_device_definition_request +GetDeviceDefinitionResponse,get_device_definition_response +GetDeviceDefinitionVersionRequest,get_device_definition_version_request +GetDeviceDefinitionVersionResponse,get_device_definition_version_response +GetDeviceFleetReportRequest,get_device_fleet_report_request +GetDeviceFleetReportResponse,get_device_fleet_report_response +GetDeviceIdentifierRequest,get_device_identifier_request +GetDeviceIdentifierResponse,get_device_identifier_response +GetDeviceInstanceRequest,get_device_instance_request +GetDeviceInstanceResult,get_device_instance_result +GetDeviceMethodsRequest,get_device_methods_request +GetDeviceMethodsResponse,get_device_methods_response +GetDevicePoolCompatibilityRequest,get_device_pool_compatibility_request +GetDevicePoolCompatibilityResult,get_device_pool_compatibility_result +GetDevicePoolRequest,get_device_pool_request +GetDevicePoolResult,get_device_pool_result +GetDevicePositionHistoryRequest,get_device_position_history_request +GetDevicePositionHistoryResponse,get_device_position_history_response +GetDevicePositionRequest,get_device_position_request +GetDevicePositionResponse,get_device_position_response +GetDeviceProfileRequest,get_device_profile_request +GetDeviceProfileResponse,get_device_profile_response +GetDeviceRegistrationRequest,get_device_registration_request +GetDeviceRegistrationResult,get_device_registration_result +GetDeviceRequest,get_device_request +GetDeviceResponse,get_device_response +GetDeviceResult,get_device_result +GetDevicesInPlacementRequest,get_devices_in_placement_request +GetDevicesInPlacementResponse,get_devices_in_placement_response +GetDevicesRequest,get_devices_request +GetDevicesResponse,get_devices_response +GetDifferencesInput,get_differences_input +GetDifferencesOutput,get_differences_output +GetDigestRequest,get_digest_request +GetDigestResponse,get_digest_response +GetDimensionKeyDetailsRequest,get_dimension_key_details_request +GetDimensionKeyDetailsResponse,get_dimension_key_details_response +GetDimensionValuesRequest,get_dimension_values_request +GetDimensionValuesResponse,get_dimension_values_response +GetDirectoryLimitsResult,get_directory_limits_result +GetDirectoryRegistrationRequest,get_directory_registration_request +GetDirectoryRegistrationResponse,get_directory_registration_response +GetDirectoryRequest,get_directory_request +GetDirectoryResponse,get_directory_response +GetDiscoveredResourceCountsRequest,get_discovered_resource_counts_request +GetDiscoveredResourceCountsResponse,get_discovered_resource_counts_response +GetDiscoveredSchemaRequest,get_discovered_schema_request +GetDiscoveredSchemaResponse,get_discovered_schema_response +GetDiscoverySummaryResponse,get_discovery_summary_response +GetDiskRequest,get_disk_request +GetDiskResult,get_disk_result +GetDiskSnapshotRequest,get_disk_snapshot_request +GetDiskSnapshotResult,get_disk_snapshot_result +GetDiskSnapshotsRequest,get_disk_snapshots_request +GetDiskSnapshotsResult,get_disk_snapshots_result +GetDisksRequest,get_disks_request +GetDisksResult,get_disks_result +GetDistributionBundlesResult,get_distribution_bundles_result +GetDistributionConfigRequest,get_distribution_config_request +GetDistributionConfigResult,get_distribution_config_result +GetDistributionConfigurationRequest,get_distribution_configuration_request +GetDistributionConfigurationResponse,get_distribution_configuration_response +GetDistributionLatestCacheResetRequest,get_distribution_latest_cache_reset_request +GetDistributionLatestCacheResetResult,get_distribution_latest_cache_reset_result +GetDistributionMetricDataRequest,get_distribution_metric_data_request +GetDistributionMetricDataResult,get_distribution_metric_data_result +GetDistributionRequest,get_distribution_request +GetDistributionResult,get_distribution_result +GetDistributionsRequest,get_distributions_request +GetDistributionsResult,get_distributions_result +GetDocumentAnalysisRequest,get_document_analysis_request +GetDocumentAnalysisResponse,get_document_analysis_response +GetDocumentPathRequest,get_document_path_request +GetDocumentPathResponse,get_document_path_response +GetDocumentRequest,get_document_request +GetDocumentResponse,get_document_response +GetDocumentResult,get_document_result +GetDocumentTextDetectionRequest,get_document_text_detection_request +GetDocumentTextDetectionResponse,get_document_text_detection_response +GetDocumentVersionRequest,get_document_version_request +GetDocumentVersionResponse,get_document_version_response +GetDocumentationPartRequest,get_documentation_part_request +GetDocumentationPartsRequest,get_documentation_parts_request +GetDocumentationVersionRequest,get_documentation_version_request +GetDocumentationVersionsRequest,get_documentation_versions_request +GetDomainAssociationRequest,get_domain_association_request +GetDomainAssociationResult,get_domain_association_result +GetDomainDeliverabilityCampaignRequest,get_domain_deliverability_campaign_request +GetDomainDeliverabilityCampaignResponse,get_domain_deliverability_campaign_response +GetDomainDetailRequest,get_domain_detail_request +GetDomainDetailResponse,get_domain_detail_response +GetDomainNameRequest,get_domain_name_request +GetDomainNameResponse,get_domain_name_response +GetDomainNamesRequest,get_domain_names_request +GetDomainNamesResponse,get_domain_names_response +GetDomainPermissionsPolicyRequest,get_domain_permissions_policy_request +GetDomainPermissionsPolicyResult,get_domain_permissions_policy_result +GetDomainRequest,get_domain_request +GetDomainResponse,get_domain_response +GetDomainResult,get_domain_result +GetDomainStatisticsReportRequest,get_domain_statistics_report_request +GetDomainStatisticsReportResponse,get_domain_statistics_report_response +GetDomainSuggestionsRequest,get_domain_suggestions_request +GetDomainSuggestionsResponse,get_domain_suggestions_response +GetDomainsRequest,get_domains_request +GetDomainsResult,get_domains_result +GetDownloadUrlForLayerRequest,get_download_url_for_layer_request +GetDownloadUrlForLayerResponse,get_download_url_for_layer_response +GetEBSVolumeRecommendationsRequest,get_ebs_volume_recommendations_request +GetEBSVolumeRecommendationsResponse,get_ebs_volume_recommendations_response +GetEC2InstanceRecommendationsRequest,get_ec2_instance_recommendations_request +GetEC2InstanceRecommendationsResponse,get_ec2_instance_recommendations_response +GetEC2RecommendationProjectedMetricsRequest,get_ec2_recommendation_projected_metrics_request +GetEC2RecommendationProjectedMetricsResponse,get_ec2_recommendation_projected_metrics_response +GetECSServiceRecommendationProjectedMetricsRequest,get_ecs_service_recommendation_projected_metrics_request +GetECSServiceRecommendationProjectedMetricsResponse,get_ecs_service_recommendation_projected_metrics_response +GetECSServiceRecommendationsRequest,get_ecs_service_recommendations_request +GetECSServiceRecommendationsResponse,get_ecs_service_recommendations_response +GetEarthObservationJobInput,get_earth_observation_job_input +GetEarthObservationJobOutput,get_earth_observation_job_output +GetEbsDefaultKmsKeyIdRequest,get_ebs_default_kms_key_id_request +GetEbsDefaultKmsKeyIdResult,get_ebs_default_kms_key_id_result +GetEbsEncryptionByDefaultRequest,get_ebs_encryption_by_default_request +GetEbsEncryptionByDefaultResult,get_ebs_encryption_by_default_result +GetEc2DeepInspectionConfigurationResponse,get_ec2_deep_inspection_configuration_response +GetEffectivePermissionsForPathRequest,get_effective_permissions_for_path_request +GetEffectivePermissionsForPathResponse,get_effective_permissions_for_path_response +GetEffectivePoliciesRequest,get_effective_policies_request +GetEffectivePoliciesResponse,get_effective_policies_response +GetEffectiveRecommendationPreferencesRequest,get_effective_recommendation_preferences_request +GetEffectiveRecommendationPreferencesResponse,get_effective_recommendation_preferences_response +GetEmailChannelRequest,get_email_channel_request +GetEmailChannelResponse,get_email_channel_response +GetEmailIdentityPoliciesRequest,get_email_identity_policies_request +GetEmailIdentityPoliciesResponse,get_email_identity_policies_response +GetEmailIdentityRequest,get_email_identity_request +GetEmailIdentityResponse,get_email_identity_response +GetEmailTemplateRequest,get_email_template_request +GetEmailTemplateResponse,get_email_template_response +GetEnabledStandardsRequest,get_enabled_standards_request +GetEnabledStandardsResponse,get_enabled_standards_response +GetEncryptionConfigResult,get_encryption_config_result +GetEncryptionConfigurationResponse,get_encryption_configuration_response +GetEncryptionKeyRequest,get_encryption_key_request +GetEncryptionKeyResponse,get_encryption_key_response +GetEndpointAccessRequest,get_endpoint_access_request +GetEndpointAccessResponse,get_endpoint_access_response +GetEndpointAttributesInput,get_endpoint_attributes_input +GetEndpointAttributesResponse,get_endpoint_attributes_response +GetEndpointRequest,get_endpoint_request +GetEndpointResponse,get_endpoint_response +GetEngineStatusOutput,get_engine_status_output +GetEnrollmentStatusResponse,get_enrollment_status_response +GetEnrollmentStatusesForOrganizationRequest,get_enrollment_statuses_for_organization_request +GetEnrollmentStatusesForOrganizationResponse,get_enrollment_statuses_for_organization_response +GetEntitiesRequest,get_entities_request +GetEntitiesResponse,get_entities_response +GetEntitlementsRequest,get_entitlements_request +GetEntitlementsResult,get_entitlements_result +GetEntityRequest,get_entity_request +GetEntityResponse,get_entity_response +GetEntityTypesRequest,get_entity_types_request +GetEntityTypesResult,get_entity_types_result +GetEnvironmentAccountConnectionInput,get_environment_account_connection_input +GetEnvironmentAccountConnectionOutput,get_environment_account_connection_output +GetEnvironmentInput,get_environment_input +GetEnvironmentOutput,get_environment_output +GetEnvironmentRequest,get_environment_request +GetEnvironmentResponse,get_environment_response +GetEnvironmentTemplateInput,get_environment_template_input +GetEnvironmentTemplateOutput,get_environment_template_output +GetEnvironmentTemplateVersionInput,get_environment_template_version_input +GetEnvironmentTemplateVersionOutput,get_environment_template_version_output +GetEulaRequest,get_eula_request +GetEulaResponse,get_eula_response +GetEvaluationInput,get_evaluation_input +GetEvaluationOutput,get_evaluation_output +GetEventActionRequest,get_event_action_request +GetEventActionResponse,get_event_action_response +GetEventConfigurationByResourceTypesResponse,get_event_configuration_by_resource_types_response +GetEventDataStoreRequest,get_event_data_store_request +GetEventDataStoreResponse,get_event_data_store_response +GetEventIntegrationRequest,get_event_integration_request +GetEventIntegrationResponse,get_event_integration_response +GetEventPredictionMetadataRequest,get_event_prediction_metadata_request +GetEventPredictionMetadataResult,get_event_prediction_metadata_result +GetEventPredictionRequest,get_event_prediction_request +GetEventPredictionResult,get_event_prediction_result +GetEventRequest,get_event_request +GetEventResult,get_event_result +GetEventSelectorsRequest,get_event_selectors_request +GetEventSelectorsResponse,get_event_selectors_response +GetEventSourceMappingRequest,get_event_source_mapping_request +GetEventStreamRequest,get_event_stream_request +GetEventStreamResponse,get_event_stream_response +GetEventTypesRequest,get_event_types_request +GetEventTypesResult,get_event_types_result +GetEventsConfigurationRequest,get_events_configuration_request +GetEventsConfigurationResponse,get_events_configuration_response +GetEvidenceByEvidenceFolderRequest,get_evidence_by_evidence_folder_request +GetEvidenceByEvidenceFolderResponse,get_evidence_by_evidence_folder_response +GetEvidenceFileUploadUrlRequest,get_evidence_file_upload_url_request +GetEvidenceFileUploadUrlResponse,get_evidence_file_upload_url_response +GetEvidenceFolderRequest,get_evidence_folder_request +GetEvidenceFolderResponse,get_evidence_folder_response +GetEvidenceFoldersByAssessmentControlRequest,get_evidence_folders_by_assessment_control_request +GetEvidenceFoldersByAssessmentControlResponse,get_evidence_folders_by_assessment_control_response +GetEvidenceFoldersByAssessmentRequest,get_evidence_folders_by_assessment_request +GetEvidenceFoldersByAssessmentResponse,get_evidence_folders_by_assessment_response +GetEvidenceRequest,get_evidence_request +GetEvidenceResponse,get_evidence_response +GetExclusionsPreviewRequest,get_exclusions_preview_request +GetExclusionsPreviewResponse,get_exclusions_preview_response +GetExecutionHistoryInput,get_execution_history_input +GetExecutionHistoryOutput,get_execution_history_output +GetExpenseAnalysisRequest,get_expense_analysis_request +GetExpenseAnalysisResponse,get_expense_analysis_response +GetExperimentRequest,get_experiment_request +GetExperimentResponse,get_experiment_response +GetExperimentResultsRequest,get_experiment_results_request +GetExperimentResultsResponse,get_experiment_results_response +GetExperimentTemplateRequest,get_experiment_template_request +GetExperimentTemplateResponse,get_experiment_template_response +GetExportJobRequest,get_export_job_request +GetExportJobResponse,get_export_job_response +GetExportJobsRequest,get_export_jobs_request +GetExportJobsResponse,get_export_jobs_response +GetExportRequest,get_export_request +GetExportResponse,get_export_response +GetExportSnapshotRecordsRequest,get_export_snapshot_records_request +GetExportSnapshotRecordsResult,get_export_snapshot_records_result +GetExtensionAssociationRequest,get_extension_association_request +GetExtensionRequest,get_extension_request +GetExtensionResult,get_extension_result +GetExtensionVersionRequest,get_extension_version_request +GetExtensionVersionResult,get_extension_version_result +GetExternalDataViewAccessDetailsRequest,get_external_data_view_access_details_request +GetExternalDataViewAccessDetailsResponse,get_external_data_view_access_details_response +GetExternalModelsRequest,get_external_models_request +GetExternalModelsResult,get_external_models_result +GetFaceDetectionRequest,get_face_detection_request +GetFaceDetectionResponse,get_face_detection_response +GetFaceLivenessSessionResultsRequest,get_face_liveness_session_results_request +GetFaceLivenessSessionResultsResponse,get_face_liveness_session_results_response +GetFaceSearchRequest,get_face_search_request +GetFaceSearchResponse,get_face_search_response +GetFacetRequest,get_facet_request +GetFacetResponse,get_facet_response +GetFailbackReplicationConfigurationRequest,get_failback_replication_configuration_request +GetFailbackReplicationConfigurationResponse,get_failback_replication_configuration_response +GetFeatureRequest,get_feature_request +GetFeatureResponse,get_feature_response +GetFederationTokenRequest,get_federation_token_request +GetFederationTokenResponse,get_federation_token_response +GetFeedbackRequest,get_feedback_request +GetFeedbackResponse,get_feedback_response +GetFieldLevelEncryptionConfigRequest,get_field_level_encryption_config_request +GetFieldLevelEncryptionConfigResult,get_field_level_encryption_config_result +GetFieldLevelEncryptionProfileConfigRequest,get_field_level_encryption_profile_config_request +GetFieldLevelEncryptionProfileConfigResult,get_field_level_encryption_profile_config_result +GetFieldLevelEncryptionProfileRequest,get_field_level_encryption_profile_request +GetFieldLevelEncryptionProfileResult,get_field_level_encryption_profile_result +GetFieldLevelEncryptionRequest,get_field_level_encryption_request +GetFieldLevelEncryptionResult,get_field_level_encryption_result +GetFieldResponse,get_field_response +GetFileInput,get_file_input +GetFileOutput,get_file_output +GetFileUploadURLRequest,get_file_upload_url_request +GetFileUploadURLResponse,get_file_upload_url_response +GetFilterRequest,get_filter_request +GetFilterResponse,get_filter_response +GetFindingAggregatorRequest,get_finding_aggregator_request +GetFindingAggregatorResponse,get_finding_aggregator_response +GetFindingHistoryRequest,get_finding_history_request +GetFindingHistoryResponse,get_finding_history_response +GetFindingRequest,get_finding_request +GetFindingResponse,get_finding_response +GetFindingStatisticsRequest,get_finding_statistics_request +GetFindingStatisticsResponse,get_finding_statistics_response +GetFindingsFilterRequest,get_findings_filter_request +GetFindingsFilterResponse,get_findings_filter_response +GetFindingsPublicationConfigurationResponse,get_findings_publication_configuration_response +GetFindingsReportAccountSummaryRequest,get_findings_report_account_summary_request +GetFindingsReportAccountSummaryResponse,get_findings_report_account_summary_response +GetFindingsReportStatusRequest,get_findings_report_status_request +GetFindingsReportStatusResponse,get_findings_report_status_response +GetFindingsRequest,get_findings_request +GetFindingsResponse,get_findings_response +GetFindingsStatisticsRequest,get_findings_statistics_request +GetFindingsStatisticsResponse,get_findings_statistics_response +GetFirewallConfigRequest,get_firewall_config_request +GetFirewallConfigResponse,get_firewall_config_response +GetFirewallDomainListRequest,get_firewall_domain_list_request +GetFirewallDomainListResponse,get_firewall_domain_list_response +GetFirewallRuleGroupAssociationRequest,get_firewall_rule_group_association_request +GetFirewallRuleGroupAssociationResponse,get_firewall_rule_group_association_response +GetFirewallRuleGroupPolicyRequest,get_firewall_rule_group_policy_request +GetFirewallRuleGroupPolicyResponse,get_firewall_rule_group_policy_response +GetFirewallRuleGroupRequest,get_firewall_rule_group_request +GetFirewallRuleGroupResponse,get_firewall_rule_group_response +GetFleetRequest,get_fleet_request +GetFleetResponse,get_fleet_response +GetFlowLogsIntegrationTemplateRequest,get_flow_logs_integration_template_request +GetFlowLogsIntegrationTemplateResult,get_flow_logs_integration_template_result +GetFlowTemplateRequest,get_flow_template_request +GetFlowTemplateResponse,get_flow_template_response +GetFlowTemplateRevisionsRequest,get_flow_template_revisions_request +GetFlowTemplateRevisionsResponse,get_flow_template_revisions_response +GetFolderInput,get_folder_input +GetFolderOutput,get_folder_output +GetFolderPathRequest,get_folder_path_request +GetFolderPathResponse,get_folder_path_response +GetFolderRequest,get_folder_request +GetFolderResponse,get_folder_response +GetFormRequest,get_form_request +GetFormResponse,get_form_response +GetFoundationModelRequest,get_foundation_model_request +GetFoundationModelResponse,get_foundation_model_response +GetFunctionCodeSigningConfigRequest,get_function_code_signing_config_request +GetFunctionCodeSigningConfigResponse,get_function_code_signing_config_response +GetFunctionConcurrencyRequest,get_function_concurrency_request +GetFunctionConcurrencyResponse,get_function_concurrency_response +GetFunctionConfigurationRequest,get_function_configuration_request +GetFunctionDefinitionRequest,get_function_definition_request +GetFunctionDefinitionResponse,get_function_definition_response +GetFunctionDefinitionVersionRequest,get_function_definition_version_request +GetFunctionDefinitionVersionResponse,get_function_definition_version_response +GetFunctionEventInvokeConfigRequest,get_function_event_invoke_config_request +GetFunctionRequest,get_function_request +GetFunctionResponse,get_function_response +GetFunctionResult,get_function_result +GetFunctionUrlConfigRequest,get_function_url_config_request +GetFunctionUrlConfigResponse,get_function_url_config_response +GetFuotaTaskRequest,get_fuota_task_request +GetFuotaTaskResponse,get_fuota_task_response +GetGameConfigurationRequest,get_game_configuration_request +GetGameConfigurationResult,get_game_configuration_result +GetGameRequest,get_game_request +GetGameResult,get_game_result +GetGameSessionLogUrlInput,get_game_session_log_url_input +GetGameSessionLogUrlOutput,get_game_session_log_url_output +GetGatewayGroupRequest,get_gateway_group_request +GetGatewayGroupResponse,get_gateway_group_response +GetGatewayInput,get_gateway_input +GetGatewayOutput,get_gateway_output +GetGatewayRequest,get_gateway_request +GetGatewayResponse,get_gateway_response +GetGatewayResponseRequest,get_gateway_response_request +GetGatewayResponsesRequest,get_gateway_responses_request +GetGcmChannelRequest,get_gcm_channel_request +GetGcmChannelResponse,get_gcm_channel_response +GetGeneratedCodeJobRequest,get_generated_code_job_request +GetGeneratedCodeJobResult,get_generated_code_job_result +GetGeneratedPolicyRequest,get_generated_policy_request +GetGeneratedPolicyResponse,get_generated_policy_response +GetGeoLocationRequest,get_geo_location_request +GetGeoLocationResponse,get_geo_location_response +GetGeoMatchSetRequest,get_geo_match_set_request +GetGeoMatchSetResponse,get_geo_match_set_response +GetGeofenceRequest,get_geofence_request +GetGeofenceResponse,get_geofence_response +GetGlobalSettingsResponse,get_global_settings_response +GetGrantRequest,get_grant_request +GetGrantResponse,get_grant_response +GetGraphqlApiRequest,get_graphql_api_request +GetGraphqlApiResponse,get_graphql_api_response +GetGremlinQueryStatusInput,get_gremlin_query_status_input +GetGremlinQueryStatusOutput,get_gremlin_query_status_output +GetGroupCertificateAuthorityRequest,get_group_certificate_authority_request +GetGroupCertificateAuthorityResponse,get_group_certificate_authority_response +GetGroupCertificateConfigurationRequest,get_group_certificate_configuration_request +GetGroupCertificateConfigurationResponse,get_group_certificate_configuration_response +GetGroupConfigurationInput,get_group_configuration_input +GetGroupConfigurationOutput,get_group_configuration_output +GetGroupIdRequest,get_group_id_request +GetGroupIdResponse,get_group_id_response +GetGroupInput,get_group_input +GetGroupMembershipIdRequest,get_group_membership_id_request +GetGroupMembershipIdResponse,get_group_membership_id_response +GetGroupOutput,get_group_output +GetGroupPolicyRequest,get_group_policy_request +GetGroupPolicyResponse,get_group_policy_response +GetGroupQueryInput,get_group_query_input +GetGroupQueryOutput,get_group_query_output +GetGroupRequest,get_group_request +GetGroupResponse,get_group_response +GetGroupResult,get_group_result +GetGroupVersionRequest,get_group_version_request +GetGroupVersionResponse,get_group_version_response +GetGroupsForCapacityReservationRequest,get_groups_for_capacity_reservation_request +GetGroupsForCapacityReservationResult,get_groups_for_capacity_reservation_result +GetGroupsRequest,get_groups_request +GetGroupsResult,get_groups_result +GetHITRequest,get_hit_request +GetHITResponse,get_hit_response +GetHLSStreamingSessionURLInput,get_hls_streaming_session_url_input +GetHLSStreamingSessionURLOutput,get_hls_streaming_session_url_output +GetHealthCheckCountResponse,get_health_check_count_response +GetHealthCheckLastFailureReasonRequest,get_health_check_last_failure_reason_request +GetHealthCheckLastFailureReasonResponse,get_health_check_last_failure_reason_response +GetHealthCheckRequest,get_health_check_request +GetHealthCheckResponse,get_health_check_response +GetHealthCheckStatusRequest,get_health_check_status_request +GetHealthCheckStatusResponse,get_health_check_status_response +GetHealthEventInput,get_health_event_input +GetHealthEventOutput,get_health_event_output +GetHlsManifestConfiguration,get_hls_manifest_configuration +GetHomeRegionResult,get_home_region_result +GetHostInput,get_host_input +GetHostOutput,get_host_output +GetHostReservationPurchasePreviewRequest,get_host_reservation_purchase_preview_request +GetHostReservationPurchasePreviewResult,get_host_reservation_purchase_preview_result +GetHostedConfigurationVersionRequest,get_hosted_configuration_version_request +GetHostedZoneCountResponse,get_hosted_zone_count_response +GetHostedZoneLimitRequest,get_hosted_zone_limit_request +GetHostedZoneLimitResponse,get_hosted_zone_limit_response +GetHostedZoneRequest,get_hosted_zone_request +GetHostedZoneResponse,get_hosted_zone_response +GetHostnameSuggestionRequest,get_hostname_suggestion_request +GetHostnameSuggestionResult,get_hostname_suggestion_result +GetHypervisorInput,get_hypervisor_input +GetHypervisorOutput,get_hypervisor_output +GetHypervisorPropertyMappingsInput,get_hypervisor_property_mappings_input +GetHypervisorPropertyMappingsOutput,get_hypervisor_property_mappings_output +GetIPSetRequest,get_ip_set_request +GetIPSetResponse,get_ip_set_response +GetIceServerConfigRequest,get_ice_server_config_request +GetIceServerConfigResponse,get_ice_server_config_response +GetIdInput,get_id_input +GetIdResponse,get_id_response +GetIdentityDkimAttributesRequest,get_identity_dkim_attributes_request +GetIdentityDkimAttributesResponse,get_identity_dkim_attributes_response +GetIdentityMailFromDomainAttributesRequest,get_identity_mail_from_domain_attributes_request +GetIdentityMailFromDomainAttributesResponse,get_identity_mail_from_domain_attributes_response +GetIdentityNotificationAttributesRequest,get_identity_notification_attributes_request +GetIdentityNotificationAttributesResponse,get_identity_notification_attributes_response +GetIdentityPoliciesRequest,get_identity_policies_request +GetIdentityPoliciesResponse,get_identity_policies_response +GetIdentityPoolConfigurationRequest,get_identity_pool_configuration_request +GetIdentityPoolConfigurationResponse,get_identity_pool_configuration_response +GetIdentityPoolRolesInput,get_identity_pool_roles_input +GetIdentityPoolRolesResponse,get_identity_pool_roles_response +GetIdentityProviderByIdentifierRequest,get_identity_provider_by_identifier_request +GetIdentityProviderByIdentifierResponse,get_identity_provider_by_identifier_response +GetIdentityProviderRequest,get_identity_provider_request +GetIdentityProviderResponse,get_identity_provider_response +GetIdentityResolutionJobRequest,get_identity_resolution_job_request +GetIdentityResolutionJobResponse,get_identity_resolution_job_response +GetIdentitySourceInput,get_identity_source_input +GetIdentitySourceOutput,get_identity_source_output +GetIdentityVerificationAttributesRequest,get_identity_verification_attributes_request +GetIdentityVerificationAttributesResponse,get_identity_verification_attributes_response +GetImageBlockPublicAccessStateRequest,get_image_block_public_access_state_request +GetImageBlockPublicAccessStateResult,get_image_block_public_access_state_result +GetImageFrameRequest,get_image_frame_request +GetImageFrameResponse,get_image_frame_response +GetImagePipelineRequest,get_image_pipeline_request +GetImagePipelineResponse,get_image_pipeline_response +GetImagePolicyRequest,get_image_policy_request +GetImagePolicyResponse,get_image_policy_response +GetImageRecipePolicyRequest,get_image_recipe_policy_request +GetImageRecipePolicyResponse,get_image_recipe_policy_response +GetImageRecipeRequest,get_image_recipe_request +GetImageRecipeResponse,get_image_recipe_response +GetImageRequest,get_image_request +GetImageResponse,get_image_response +GetImageSetMetadataRequest,get_image_set_metadata_request +GetImageSetMetadataResponse,get_image_set_metadata_response +GetImageSetRequest,get_image_set_request +GetImageSetResponse,get_image_set_response +GetImagesInput,get_images_input +GetImagesOutput,get_images_output +GetImpersonationRoleEffectRequest,get_impersonation_role_effect_request +GetImpersonationRoleEffectResponse,get_impersonation_role_effect_response +GetImpersonationRoleRequest,get_impersonation_role_request +GetImpersonationRoleResponse,get_impersonation_role_response +GetImportFileTaskRequest,get_import_file_task_request +GetImportFileTaskResponse,get_import_file_task_response +GetImportJobRequest,get_import_job_request +GetImportJobResponse,get_import_job_response +GetImportJobsRequest,get_import_jobs_request +GetImportJobsResponse,get_import_jobs_response +GetImportRequest,get_import_request +GetImportResponse,get_import_response +GetInAppMessagesRequest,get_in_app_messages_request +GetInAppMessagesResponse,get_in_app_messages_response +GetInAppTemplateRequest,get_in_app_template_request +GetInAppTemplateResponse,get_in_app_template_response +GetIncidentRecordInput,get_incident_record_input +GetIncidentRecordOutput,get_incident_record_output +GetIndexOutput,get_index_output +GetIndexingConfigurationResponse,get_indexing_configuration_response +GetInfrastructureConfigurationRequest,get_infrastructure_configuration_request +GetInfrastructureConfigurationResponse,get_infrastructure_configuration_response +GetIngestionDestinationRequest,get_ingestion_destination_request +GetIngestionDestinationResponse,get_ingestion_destination_response +GetIngestionRequest,get_ingestion_request +GetIngestionResponse,get_ingestion_response +GetInlinePolicyForPermissionSetRequest,get_inline_policy_for_permission_set_request +GetInlinePolicyForPermissionSetResponse,get_inline_policy_for_permission_set_response +GetInsightEventsRequest,get_insight_events_request +GetInsightEventsResult,get_insight_events_result +GetInsightImpactGraphRequest,get_insight_impact_graph_request +GetInsightImpactGraphResult,get_insight_impact_graph_result +GetInsightRequest,get_insight_request +GetInsightResult,get_insight_result +GetInsightResultsRequest,get_insight_results_request +GetInsightResultsResponse,get_insight_results_response +GetInsightRuleReportInput,get_insight_rule_report_input +GetInsightRuleReportOutput,get_insight_rule_report_output +GetInsightSelectorsRequest,get_insight_selectors_request +GetInsightSelectorsResponse,get_insight_selectors_response +GetInsightSummariesRequest,get_insight_summaries_request +GetInsightSummariesResult,get_insight_summaries_result +GetInsightsByAssessmentRequest,get_insights_by_assessment_request +GetInsightsByAssessmentResponse,get_insights_by_assessment_response +GetInsightsRequest,get_insights_request +GetInsightsResponse,get_insights_response +GetInstanceAccessDetailsRequest,get_instance_access_details_request +GetInstanceAccessDetailsResult,get_instance_access_details_result +GetInstanceAccessInput,get_instance_access_input +GetInstanceAccessOutput,get_instance_access_output +GetInstanceMetricDataRequest,get_instance_metric_data_request +GetInstanceMetricDataResult,get_instance_metric_data_result +GetInstanceOnboardingJobStatusRequest,get_instance_onboarding_job_status_request +GetInstanceOnboardingJobStatusResponse,get_instance_onboarding_job_status_response +GetInstancePortStatesRequest,get_instance_port_states_request +GetInstancePortStatesResult,get_instance_port_states_result +GetInstanceProfileRequest,get_instance_profile_request +GetInstanceProfileResponse,get_instance_profile_response +GetInstanceProfileResult,get_instance_profile_result +GetInstanceRequest,get_instance_request +GetInstanceResponse,get_instance_response +GetInstanceResult,get_instance_result +GetInstanceSnapshotRequest,get_instance_snapshot_request +GetInstanceSnapshotResult,get_instance_snapshot_result +GetInstanceSnapshotsRequest,get_instance_snapshots_request +GetInstanceSnapshotsResult,get_instance_snapshots_result +GetInstanceStateRequest,get_instance_state_request +GetInstanceStateResult,get_instance_state_result +GetInstanceTypesFromInstanceRequirementsRequest,get_instance_types_from_instance_requirements_request +GetInstanceTypesFromInstanceRequirementsResult,get_instance_types_from_instance_requirements_result +GetInstanceUefiDataRequest,get_instance_uefi_data_request +GetInstanceUefiDataResult,get_instance_uefi_data_result +GetInstancesHealthStatusRequest,get_instances_health_status_request +GetInstancesHealthStatusResponse,get_instances_health_status_response +GetInstancesRequest,get_instances_request +GetInstancesResult,get_instances_result +GetIntegrationRequest,get_integration_request +GetIntegrationResponse,get_integration_response +GetIntegrationResponseRequest,get_integration_response_request +GetIntegrationResponseResponse,get_integration_response_response +GetIntegrationResponsesRequest,get_integration_responses_request +GetIntegrationResponsesResponse,get_integration_responses_response +GetIntegrationResult,get_integration_result +GetIntegrationsRequest,get_integrations_request +GetIntegrationsResponse,get_integrations_response +GetIntentRequest,get_intent_request +GetIntentResponse,get_intent_response +GetIntentVersionsRequest,get_intent_versions_request +GetIntentVersionsResponse,get_intent_versions_response +GetIntentsRequest,get_intents_request +GetIntentsResponse,get_intents_response +GetInterpolatedAssetPropertyValuesRequest,get_interpolated_asset_property_values_request +GetInterpolatedAssetPropertyValuesResponse,get_interpolated_asset_property_values_response +GetIntrospectionSchemaRequest,get_introspection_schema_request +GetIntrospectionSchemaResponse,get_introspection_schema_response +GetInvalidationRequest,get_invalidation_request +GetInvalidationResult,get_invalidation_result +GetInventoryRequest,get_inventory_request +GetInventoryResult,get_inventory_result +GetInventorySchemaRequest,get_inventory_schema_request +GetInventorySchemaResult,get_inventory_schema_result +GetInvitationConfigurationResponse,get_invitation_configuration_response +GetInvitationsCountResponse,get_invitations_count_response +GetIpAccessSettingsRequest,get_ip_access_settings_request +GetIpAccessSettingsResponse,get_ip_access_settings_response +GetIpamAddressHistoryRequest,get_ipam_address_history_request +GetIpamAddressHistoryResult,get_ipam_address_history_result +GetIpamDiscoveredAccountsRequest,get_ipam_discovered_accounts_request +GetIpamDiscoveredAccountsResult,get_ipam_discovered_accounts_result +GetIpamDiscoveredResourceCidrsRequest,get_ipam_discovered_resource_cidrs_request +GetIpamDiscoveredResourceCidrsResult,get_ipam_discovered_resource_cidrs_result +GetIpamPoolAllocationsRequest,get_ipam_pool_allocations_request +GetIpamPoolAllocationsResult,get_ipam_pool_allocations_result +GetIpamPoolCidrsRequest,get_ipam_pool_cidrs_request +GetIpamPoolCidrsResult,get_ipam_pool_cidrs_result +GetIpamResourceCidrsRequest,get_ipam_resource_cidrs_request +GetIpamResourceCidrsResult,get_ipam_resource_cidrs_result +GetItemInput,get_item_input +GetItemOutput,get_item_output +GetJobBookmarkRequest,get_job_bookmark_request +GetJobBookmarkResponse,get_job_bookmark_response +GetJobDetailsInput,get_job_details_input +GetJobDetailsOutput,get_job_details_output +GetJobDocumentRequest,get_job_document_request +GetJobDocumentResponse,get_job_document_response +GetJobManifestRequest,get_job_manifest_request +GetJobManifestResult,get_job_manifest_result +GetJobOutputInput,get_job_output_input +GetJobOutputOutput,get_job_output_output +GetJobRequest,get_job_request +GetJobResponse,get_job_response +GetJobResult,get_job_result +GetJobRunRequest,get_job_run_request +GetJobRunResponse,get_job_run_response +GetJobRunsRequest,get_job_runs_request +GetJobRunsResponse,get_job_runs_response +GetJobTaggingRequest,get_job_tagging_request +GetJobTaggingResult,get_job_tagging_result +GetJobTemplateRequest,get_job_template_request +GetJobTemplateResponse,get_job_template_response +GetJobUnlockCodeRequest,get_job_unlock_code_request +GetJobUnlockCodeResult,get_job_unlock_code_result +GetJobsRequest,get_jobs_request +GetJobsResponse,get_jobs_response +GetJourneyDateRangeKpiRequest,get_journey_date_range_kpi_request +GetJourneyDateRangeKpiResponse,get_journey_date_range_kpi_response +GetJourneyExecutionActivityMetricsRequest,get_journey_execution_activity_metrics_request +GetJourneyExecutionActivityMetricsResponse,get_journey_execution_activity_metrics_response +GetJourneyExecutionMetricsRequest,get_journey_execution_metrics_request +GetJourneyExecutionMetricsResponse,get_journey_execution_metrics_response +GetJourneyRequest,get_journey_request +GetJourneyResponse,get_journey_response +GetJourneyRunExecutionActivityMetricsRequest,get_journey_run_execution_activity_metrics_request +GetJourneyRunExecutionActivityMetricsResponse,get_journey_run_execution_activity_metrics_response +GetJourneyRunExecutionMetricsRequest,get_journey_run_execution_metrics_request +GetJourneyRunExecutionMetricsResponse,get_journey_run_execution_metrics_response +GetJourneyRunsRequest,get_journey_runs_request +GetJourneyRunsResponse,get_journey_runs_response +GetKMSEncryptionKeyResult,get_kms_encryption_key_result +GetKeyGroupConfigRequest,get_key_group_config_request +GetKeyGroupConfigResult,get_key_group_config_result +GetKeyGroupRequest,get_key_group_request +GetKeyGroupResult,get_key_group_result +GetKeyInput,get_key_input +GetKeyOutput,get_key_output +GetKeyPairRequest,get_key_pair_request +GetKeyPairResult,get_key_pair_result +GetKeyPairsRequest,get_key_pairs_request +GetKeyPairsResult,get_key_pairs_result +GetKeyPolicyRequest,get_key_policy_request +GetKeyPolicyResponse,get_key_policy_response +GetKeyRotationStatusRequest,get_key_rotation_status_request +GetKeyRotationStatusResponse,get_key_rotation_status_response +GetKeyspaceRequest,get_keyspace_request +GetKeyspaceResponse,get_keyspace_response +GetKnowledgeBaseRequest,get_knowledge_base_request +GetKnowledgeBaseResponse,get_knowledge_base_response +GetKxChangesetRequest,get_kx_changeset_request +GetKxChangesetResponse,get_kx_changeset_response +GetKxClusterRequest,get_kx_cluster_request +GetKxClusterResponse,get_kx_cluster_response +GetKxConnectionStringRequest,get_kx_connection_string_request +GetKxConnectionStringResponse,get_kx_connection_string_response +GetKxDatabaseRequest,get_kx_database_request +GetKxDatabaseResponse,get_kx_database_response +GetKxEnvironmentRequest,get_kx_environment_request +GetKxEnvironmentResponse,get_kx_environment_response +GetKxUserRequest,get_kx_user_request +GetKxUserResponse,get_kx_user_response +GetLFTagRequest,get_lf_tag_request +GetLFTagResponse,get_lf_tag_response +GetLabelDetectionRequest,get_label_detection_request +GetLabelDetectionRequestMetadata,get_label_detection_request_metadata +GetLabelDetectionResponse,get_label_detection_response +GetLabelsRequest,get_labels_request +GetLabelsResult,get_labels_result +GetLambdaFunctionRecommendationsRequest,get_lambda_function_recommendations_request +GetLambdaFunctionRecommendationsResponse,get_lambda_function_recommendations_response +GetLatestAssessmentIdResponse,get_latest_assessment_id_response +GetLatestConfigurationRequest,get_latest_configuration_request +GetLatestConfigurationResponse,get_latest_configuration_response +GetLaunchConfigurationRequest,get_launch_configuration_request +GetLaunchProfileDetailsRequest,get_launch_profile_details_request +GetLaunchProfileDetailsResponse,get_launch_profile_details_response +GetLaunchProfileInitializationRequest,get_launch_profile_initialization_request +GetLaunchProfileInitializationResponse,get_launch_profile_initialization_response +GetLaunchProfileMemberRequest,get_launch_profile_member_request +GetLaunchProfileMemberResponse,get_launch_profile_member_response +GetLaunchProfileRequest,get_launch_profile_request +GetLaunchProfileResponse,get_launch_profile_response +GetLaunchRequest,get_launch_request +GetLaunchResponse,get_launch_response +GetLaunchTemplateDataRequest,get_launch_template_data_request +GetLaunchTemplateDataResult,get_launch_template_data_result +GetLayerVersionByArnRequest,get_layer_version_by_arn_request +GetLayerVersionPolicyRequest,get_layer_version_policy_request +GetLayerVersionPolicyResponse,get_layer_version_policy_response +GetLayerVersionRequest,get_layer_version_request +GetLayerVersionResponse,get_layer_version_response +GetLayoutRequest,get_layout_request +GetLayoutResponse,get_layout_response +GetLegalHoldInput,get_legal_hold_input +GetLegalHoldOutput,get_legal_hold_output +GetLendingAnalysisRequest,get_lending_analysis_request +GetLendingAnalysisResponse,get_lending_analysis_response +GetLendingAnalysisSummaryRequest,get_lending_analysis_summary_request +GetLendingAnalysisSummaryResponse,get_lending_analysis_summary_response +GetLensInput,get_lens_input +GetLensOutput,get_lens_output +GetLensReviewInput,get_lens_review_input +GetLensReviewOutput,get_lens_review_output +GetLensReviewReportInput,get_lens_review_report_input +GetLensReviewReportOutput,get_lens_review_report_output +GetLensVersionDifferenceInput,get_lens_version_difference_input +GetLensVersionDifferenceOutput,get_lens_version_difference_output +GetLexiconInput,get_lexicon_input +GetLexiconOutput,get_lexicon_output +GetLicenseConfigurationRequest,get_license_configuration_request +GetLicenseConfigurationResponse,get_license_configuration_response +GetLicenseConversionTaskRequest,get_license_conversion_task_request +GetLicenseConversionTaskResponse,get_license_conversion_task_response +GetLicenseManagerReportGeneratorRequest,get_license_manager_report_generator_request +GetLicenseManagerReportGeneratorResponse,get_license_manager_report_generator_response +GetLicenseRecommendationsRequest,get_license_recommendations_request +GetLicenseRecommendationsResponse,get_license_recommendations_response +GetLicenseRequest,get_license_request +GetLicenseResponse,get_license_response +GetLicenseUsageRequest,get_license_usage_request +GetLicenseUsageResponse,get_license_usage_response +GetLifecyclePoliciesRequest,get_lifecycle_policies_request +GetLifecyclePoliciesResponse,get_lifecycle_policies_response +GetLifecyclePolicyInput,get_lifecycle_policy_input +GetLifecyclePolicyOutput,get_lifecycle_policy_output +GetLifecyclePolicyPreviewRequest,get_lifecycle_policy_preview_request +GetLifecyclePolicyPreviewResponse,get_lifecycle_policy_preview_response +GetLifecyclePolicyRequest,get_lifecycle_policy_request +GetLifecyclePolicyResponse,get_lifecycle_policy_response +GetLineageGroupPolicyRequest,get_lineage_group_policy_request +GetLineageGroupPolicyResponse,get_lineage_group_policy_response +GetLinkAssociationsRequest,get_link_associations_request +GetLinkAssociationsResponse,get_link_associations_response +GetLinkAttributes,get_link_attributes +GetLinkAttributesRequest,get_link_attributes_request +GetLinkAttributesResponse,get_link_attributes_response +GetLinkInput,get_link_input +GetLinkOutput,get_link_output +GetLinksRequest,get_links_request +GetLinksResponse,get_links_response +GetListElementsRequest,get_list_elements_request +GetListElementsResult,get_list_elements_result +GetListenerRequest,get_listener_request +GetListenerResponse,get_listener_response +GetListsMetadataRequest,get_lists_metadata_request +GetListsMetadataResult,get_lists_metadata_result +GetLoadBalancerMetricDataRequest,get_load_balancer_metric_data_request +GetLoadBalancerMetricDataResult,get_load_balancer_metric_data_result +GetLoadBalancerRequest,get_load_balancer_request +GetLoadBalancerResult,get_load_balancer_result +GetLoadBalancerTlsCertificatesRequest,get_load_balancer_tls_certificates_request +GetLoadBalancerTlsCertificatesResult,get_load_balancer_tls_certificates_result +GetLoadBalancerTlsPoliciesRequest,get_load_balancer_tls_policies_request +GetLoadBalancerTlsPoliciesResult,get_load_balancer_tls_policies_result +GetLoadBalancersRequest,get_load_balancers_request +GetLoadBalancersResult,get_load_balancers_result +GetLoaderJobStatusInput,get_loader_job_status_input +GetLoaderJobStatusOutput,get_loader_job_status_output +GetLogDeliveryConfigurationRequest,get_log_delivery_configuration_request +GetLogDeliveryConfigurationResponse,get_log_delivery_configuration_response +GetLogEventsRequest,get_log_events_request +GetLogEventsResponse,get_log_events_response +GetLogGroupFieldsRequest,get_log_group_fields_request +GetLogGroupFieldsResponse,get_log_group_fields_response +GetLogLevelsByResourceTypesResponse,get_log_levels_by_resource_types_response +GetLogRecordRequest,get_log_record_request +GetLogRecordResponse,get_log_record_response +GetLoggerDefinitionRequest,get_logger_definition_request +GetLoggerDefinitionResponse,get_logger_definition_response +GetLoggerDefinitionVersionRequest,get_logger_definition_version_request +GetLoggerDefinitionVersionResponse,get_logger_definition_version_response +GetLoggingConfigurationRequest,get_logging_configuration_request +GetLoggingConfigurationResponse,get_logging_configuration_response +GetLoggingOptionsResponse,get_logging_options_response +GetLoginProfileRequest,get_login_profile_request +GetLoginProfileResponse,get_login_profile_response +GetLowLatencyHlsManifestConfiguration,get_low_latency_hls_manifest_configuration +GetMFADeviceRequest,get_mfa_device_request +GetMFADeviceResponse,get_mfa_device_response +GetMLDataProcessingJobInput,get_ml_data_processing_job_input +GetMLDataProcessingJobOutput,get_ml_data_processing_job_output +GetMLEndpointInput,get_ml_endpoint_input +GetMLEndpointOutput,get_ml_endpoint_output +GetMLModelInput,get_ml_model_input +GetMLModelOutput,get_ml_model_output +GetMLModelTrainingJobInput,get_ml_model_training_job_input +GetMLModelTrainingJobOutput,get_ml_model_training_job_output +GetMLModelTransformJobInput,get_ml_model_transform_job_input +GetMLModelTransformJobOutput,get_ml_model_transform_job_output +GetMLTaskRunRequest,get_ml_task_run_request +GetMLTaskRunResponse,get_ml_task_run_response +GetMLTaskRunsRequest,get_ml_task_runs_request +GetMLTaskRunsResponse,get_ml_task_runs_response +GetMLTransformRequest,get_ml_transform_request +GetMLTransformResponse,get_ml_transform_response +GetMLTransformsRequest,get_ml_transforms_request +GetMLTransformsResponse,get_ml_transforms_response +GetMacieSessionResponse,get_macie_session_response +GetMailDomainRequest,get_mail_domain_request +GetMailDomainResponse,get_mail_domain_response +GetMailboxDetailsRequest,get_mailbox_details_request +GetMailboxDetailsResponse,get_mailbox_details_response +GetMaintenanceWindowExecutionRequest,get_maintenance_window_execution_request +GetMaintenanceWindowExecutionResult,get_maintenance_window_execution_result +GetMaintenanceWindowExecutionTaskInvocationRequest,get_maintenance_window_execution_task_invocation_request +GetMaintenanceWindowExecutionTaskInvocationResult,get_maintenance_window_execution_task_invocation_result +GetMaintenanceWindowExecutionTaskRequest,get_maintenance_window_execution_task_request +GetMaintenanceWindowExecutionTaskResult,get_maintenance_window_execution_task_result +GetMaintenanceWindowRequest,get_maintenance_window_request +GetMaintenanceWindowResult,get_maintenance_window_result +GetMaintenanceWindowTaskRequest,get_maintenance_window_task_request +GetMaintenanceWindowTaskResult,get_maintenance_window_task_result +GetMalwareScanSettingsRequest,get_malware_scan_settings_request +GetMalwareScanSettingsResponse,get_malware_scan_settings_response +GetManagedEndpointSessionCredentialsRequest,get_managed_endpoint_session_credentials_request +GetManagedEndpointSessionCredentialsResponse,get_managed_endpoint_session_credentials_response +GetManagedPrefixListAssociationsRequest,get_managed_prefix_list_associations_request +GetManagedPrefixListAssociationsResult,get_managed_prefix_list_associations_result +GetManagedPrefixListEntriesRequest,get_managed_prefix_list_entries_request +GetManagedPrefixListEntriesResult,get_managed_prefix_list_entries_result +GetManagedResourceRequest,get_managed_resource_request +GetManagedResourceResponse,get_managed_resource_response +GetManagedRuleSetRequest,get_managed_rule_set_request +GetManagedRuleSetResponse,get_managed_rule_set_response +GetManagedScalingPolicyInput,get_managed_scaling_policy_input +GetManagedScalingPolicyOutput,get_managed_scaling_policy_output +GetMapGlyphsRequest,get_map_glyphs_request +GetMapGlyphsResponse,get_map_glyphs_response +GetMapSpritesRequest,get_map_sprites_request +GetMapSpritesResponse,get_map_sprites_response +GetMapStyleDescriptorRequest,get_map_style_descriptor_request +GetMapStyleDescriptorResponse,get_map_style_descriptor_response +GetMapTileRequest,get_map_tile_request +GetMapTileResponse,get_map_tile_response +GetMappingRequest,get_mapping_request +GetMappingResponse,get_mapping_response +GetMasterAccountRequest,get_master_account_request +GetMasterAccountResponse,get_master_account_response +GetMatchIdInput,get_match_id_input +GetMatchIdOutput,get_match_id_output +GetMatchesRequest,get_matches_request +GetMatchesResponse,get_matches_response +GetMatchingJobInput,get_matching_job_input +GetMatchingJobOutput,get_matching_job_output +GetMatchingWorkflowInput,get_matching_workflow_input +GetMatchingWorkflowOutput,get_matching_workflow_output +GetMediaCapturePipelineRequest,get_media_capture_pipeline_request +GetMediaCapturePipelineResponse,get_media_capture_pipeline_response +GetMediaForFragmentListInput,get_media_for_fragment_list_input +GetMediaForFragmentListOutput,get_media_for_fragment_list_output +GetMediaInput,get_media_input +GetMediaInsightsPipelineConfigurationRequest,get_media_insights_pipeline_configuration_request +GetMediaInsightsPipelineConfigurationResponse,get_media_insights_pipeline_configuration_response +GetMediaOutput,get_media_output +GetMediaPipelineKinesisVideoStreamPoolRequest,get_media_pipeline_kinesis_video_stream_pool_request +GetMediaPipelineKinesisVideoStreamPoolResponse,get_media_pipeline_kinesis_video_stream_pool_response +GetMediaPipelineRequest,get_media_pipeline_request +GetMediaPipelineResponse,get_media_pipeline_response +GetMedicalTranscriptionJobRequest,get_medical_transcription_job_request +GetMedicalTranscriptionJobResponse,get_medical_transcription_job_response +GetMedicalVocabularyRequest,get_medical_vocabulary_request +GetMedicalVocabularyResponse,get_medical_vocabulary_response +GetMeetingRequest,get_meeting_request +GetMeetingResponse,get_meeting_response +GetMemberDetectorsRequest,get_member_detectors_request +GetMemberDetectorsResponse,get_member_detectors_response +GetMemberInput,get_member_input +GetMemberOutput,get_member_output +GetMemberRequest,get_member_request +GetMemberResponse,get_member_response +GetMembersRequest,get_members_request +GetMembersResponse,get_members_response +GetMembershipInput,get_membership_input +GetMembershipOutput,get_membership_output +GetMergeCommitInput,get_merge_commit_input +GetMergeCommitOutput,get_merge_commit_output +GetMergeConflictsInput,get_merge_conflicts_input +GetMergeConflictsOutput,get_merge_conflicts_output +GetMergeOptionsInput,get_merge_options_input +GetMergeOptionsOutput,get_merge_options_output +GetMessageInsightsRequest,get_message_insights_request +GetMessageInsightsResponse,get_message_insights_response +GetMessagingSessionEndpointResponse,get_messaging_session_endpoint_response +GetMessagingStreamingConfigurationsRequest,get_messaging_streaming_configurations_request +GetMessagingStreamingConfigurationsResponse,get_messaging_streaming_configurations_response +GetMetadataRequest,get_metadata_request +GetMetadataResponse,get_metadata_response +GetMethodRequest,get_method_request +GetMethodResponseRequest,get_method_response_request +GetMetricDataInput,get_metric_data_input +GetMetricDataOutput,get_metric_data_output +GetMetricDataRequest,get_metric_data_request +GetMetricDataResponse,get_metric_data_response +GetMetricDataV2Request,get_metric_data_v2_request +GetMetricDataV2Response,get_metric_data_v2_response +GetMetricPolicyInput,get_metric_policy_input +GetMetricPolicyOutput,get_metric_policy_output +GetMetricStatisticsInput,get_metric_statistics_input +GetMetricStatisticsOutput,get_metric_statistics_output +GetMetricStreamInput,get_metric_stream_input +GetMetricStreamOutput,get_metric_stream_output +GetMetricWidgetImageInput,get_metric_widget_image_input +GetMetricWidgetImageOutput,get_metric_widget_image_output +GetMetricsSummaryRequest,get_metrics_summary_request +GetMetricsSummaryResponse,get_metrics_summary_response +GetMigrationRequest,get_migration_request +GetMigrationResponse,get_migration_response +GetMigrationWorkflowRequest,get_migration_workflow_request +GetMigrationWorkflowResponse,get_migration_workflow_response +GetMigrationWorkflowTemplateRequest,get_migration_workflow_template_request +GetMigrationWorkflowTemplateResponse,get_migration_workflow_template_response +GetMigrationsRequest,get_migrations_request +GetMigrationsResponse,get_migrations_response +GetMilestoneInput,get_milestone_input +GetMilestoneOutput,get_milestone_output +GetMinuteUsageRequest,get_minute_usage_request +GetMinuteUsageResponse,get_minute_usage_response +GetMissionProfileRequest,get_mission_profile_request +GetMissionProfileResponse,get_mission_profile_response +GetMobileDeviceAccessEffectRequest,get_mobile_device_access_effect_request +GetMobileDeviceAccessEffectResponse,get_mobile_device_access_effect_response +GetMobileDeviceAccessOverrideRequest,get_mobile_device_access_override_request +GetMobileDeviceAccessOverrideResponse,get_mobile_device_access_override_response +GetMobileSdkReleaseRequest,get_mobile_sdk_release_request +GetMobileSdkReleaseResponse,get_mobile_sdk_release_response +GetModelCustomizationJobRequest,get_model_customization_job_request +GetModelCustomizationJobResponse,get_model_customization_job_response +GetModelInvocationLoggingConfigurationResponse,get_model_invocation_logging_configuration_response +GetModelManifestRequest,get_model_manifest_request +GetModelManifestResponse,get_model_manifest_response +GetModelPackageGroupPolicyInput,get_model_package_group_policy_input +GetModelPackageGroupPolicyOutput,get_model_package_group_policy_output +GetModelRequest,get_model_request +GetModelResponse,get_model_response +GetModelTemplateRequest,get_model_template_request +GetModelTemplateResponse,get_model_template_response +GetModelVersionRequest,get_model_version_request +GetModelVersionResult,get_model_version_result +GetModelsRequest,get_models_request +GetModelsResponse,get_models_response +GetModelsResult,get_models_result +GetMonitorInput,get_monitor_input +GetMonitorOutput,get_monitor_output +GetMonitoringSubscriptionRequest,get_monitoring_subscription_request +GetMonitoringSubscriptionResult,get_monitoring_subscription_result +GetMultiRegionAccessPointPolicyRequest,get_multi_region_access_point_policy_request +GetMultiRegionAccessPointPolicyResult,get_multi_region_access_point_policy_result +GetMultiRegionAccessPointPolicyStatusRequest,get_multi_region_access_point_policy_status_request +GetMultiRegionAccessPointPolicyStatusResult,get_multi_region_access_point_policy_status_result +GetMultiRegionAccessPointRequest,get_multi_region_access_point_request +GetMultiRegionAccessPointResult,get_multi_region_access_point_result +GetMultiRegionAccessPointRoutesRequest,get_multi_region_access_point_routes_request +GetMultiRegionAccessPointRoutesResult,get_multi_region_access_point_routes_result +GetMulticastGroupRequest,get_multicast_group_request +GetMulticastGroupResponse,get_multicast_group_response +GetMulticastGroupSessionRequest,get_multicast_group_session_request +GetMulticastGroupSessionResponse,get_multicast_group_session_response +GetNamedQueryInput,get_named_query_input +GetNamedQueryOutput,get_named_query_output +GetNamespaceDeletionStatusResponse,get_namespace_deletion_status_response +GetNamespaceRequest,get_namespace_request +GetNamespaceResponse,get_namespace_response +GetNetworkAnalyzerConfigurationRequest,get_network_analyzer_configuration_request +GetNetworkAnalyzerConfigurationResponse,get_network_analyzer_configuration_response +GetNetworkInput,get_network_input +GetNetworkInsightsAccessScopeAnalysisFindingsRequest,get_network_insights_access_scope_analysis_findings_request +GetNetworkInsightsAccessScopeAnalysisFindingsResult,get_network_insights_access_scope_analysis_findings_result +GetNetworkInsightsAccessScopeContentRequest,get_network_insights_access_scope_content_request +GetNetworkInsightsAccessScopeContentResult,get_network_insights_access_scope_content_result +GetNetworkOutput,get_network_output +GetNetworkProfileRequest,get_network_profile_request +GetNetworkProfileResponse,get_network_profile_response +GetNetworkProfileResult,get_network_profile_result +GetNetworkRequest,get_network_request +GetNetworkResourceCountsRequest,get_network_resource_counts_request +GetNetworkResourceCountsResponse,get_network_resource_counts_response +GetNetworkResourceRelationshipsRequest,get_network_resource_relationships_request +GetNetworkResourceRelationshipsResponse,get_network_resource_relationships_response +GetNetworkResourceRequest,get_network_resource_request +GetNetworkResourceResponse,get_network_resource_response +GetNetworkResourcesRequest,get_network_resources_request +GetNetworkResourcesResponse,get_network_resources_response +GetNetworkResponse,get_network_response +GetNetworkRoutesRequest,get_network_routes_request +GetNetworkRoutesResponse,get_network_routes_response +GetNetworkSettingsRequest,get_network_settings_request +GetNetworkSettingsResponse,get_network_settings_response +GetNetworkSiteRequest,get_network_site_request +GetNetworkSiteResponse,get_network_site_response +GetNetworkTelemetryRequest,get_network_telemetry_request +GetNetworkTelemetryResponse,get_network_telemetry_response +GetNodeInput,get_node_input +GetNodeOutput,get_node_output +GetNotebookMetadataInput,get_notebook_metadata_input +GetNotebookMetadataOutput,get_notebook_metadata_output +GetNotificationChannelResponse,get_notification_channel_response +GetNotificationConfigurationRequest,get_notification_configuration_request +GetNotificationConfigurationResponse,get_notification_configuration_response +GetOTAUpdateRequest,get_ota_update_request +GetOTAUpdateResponse,get_ota_update_response +GetObjectAclOutput,get_object_acl_output +GetObjectAclRequest,get_object_acl_request +GetObjectAttributes,get_object_attributes +GetObjectAttributesOutput,get_object_attributes_output +GetObjectAttributesParts,get_object_attributes_parts +GetObjectAttributesRequest,get_object_attributes_request +GetObjectAttributesResponse,get_object_attributes_response +GetObjectInformation,get_object_information +GetObjectInformationRequest,get_object_information_request +GetObjectInformationResponse,get_object_information_response +GetObjectLegalHoldOutput,get_object_legal_hold_output +GetObjectLegalHoldRequest,get_object_legal_hold_request +GetObjectLockConfigurationOutput,get_object_lock_configuration_output +GetObjectLockConfigurationRequest,get_object_lock_configuration_request +GetObjectMetadataInput,get_object_metadata_input +GetObjectMetadataOutput,get_object_metadata_output +GetObjectOutput,get_object_output +GetObjectRequest,get_object_request +GetObjectResponse,get_object_response +GetObjectRetentionOutput,get_object_retention_output +GetObjectRetentionRequest,get_object_retention_request +GetObjectTaggingOutput,get_object_tagging_output +GetObjectTaggingRequest,get_object_tagging_request +GetObjectTorrentOutput,get_object_torrent_output +GetObjectTorrentRequest,get_object_torrent_request +GetOfferingStatusRequest,get_offering_status_request +GetOfferingStatusResult,get_offering_status_result +GetOnPremisesInstanceInput,get_on_premises_instance_input +GetOnPremisesInstanceOutput,get_on_premises_instance_output +GetOpenCypherQueryStatusInput,get_open_cypher_query_status_input +GetOpenCypherQueryStatusOutput,get_open_cypher_query_status_output +GetOpenIDConnectProviderRequest,get_open_id_connect_provider_request +GetOpenIDConnectProviderResponse,get_open_id_connect_provider_response +GetOpenIdTokenForDeveloperIdentityInput,get_open_id_token_for_developer_identity_input +GetOpenIdTokenForDeveloperIdentityResponse,get_open_id_token_for_developer_identity_response +GetOpenIdTokenInput,get_open_id_token_input +GetOpenIdTokenResponse,get_open_id_token_response +GetOperationDetailRequest,get_operation_detail_request +GetOperationDetailResponse,get_operation_detail_response +GetOperationInput,get_operation_input +GetOperationOutput,get_operation_output +GetOperationRequest,get_operation_request +GetOperationResponse,get_operation_response +GetOperationResult,get_operation_result +GetOperationsForResourceRequest,get_operations_for_resource_request +GetOperationsForResourceResult,get_operations_for_resource_result +GetOperationsRequest,get_operations_request +GetOperationsResult,get_operations_result +GetOpsItemRequest,get_ops_item_request +GetOpsItemResponse,get_ops_item_response +GetOpsMetadataRequest,get_ops_metadata_request +GetOpsMetadataResult,get_ops_metadata_result +GetOpsSummaryRequest,get_ops_summary_request +GetOpsSummaryResult,get_ops_summary_result +GetOrderInput,get_order_input +GetOrderOutput,get_order_output +GetOrderRequest,get_order_request +GetOrderResponse,get_order_response +GetOrganizationAdminAccountResponse,get_organization_admin_account_response +GetOrganizationConfigRuleDetailedStatusRequest,get_organization_config_rule_detailed_status_request +GetOrganizationConfigRuleDetailedStatusResponse,get_organization_config_rule_detailed_status_response +GetOrganizationConformancePackDetailedStatusRequest,get_organization_conformance_pack_detailed_status_request +GetOrganizationConformancePackDetailedStatusResponse,get_organization_conformance_pack_detailed_status_response +GetOrganizationCustomRulePolicyRequest,get_organization_custom_rule_policy_request +GetOrganizationCustomRulePolicyResponse,get_organization_custom_rule_policy_response +GetOrganizationsAccessReportRequest,get_organizations_access_report_request +GetOrganizationsAccessReportResponse,get_organizations_access_report_response +GetOriginAccessControlConfigRequest,get_origin_access_control_config_request +GetOriginAccessControlConfigResult,get_origin_access_control_config_result +GetOriginAccessControlRequest,get_origin_access_control_request +GetOriginAccessControlResult,get_origin_access_control_result +GetOriginEndpointPolicyRequest,get_origin_endpoint_policy_request +GetOriginEndpointPolicyResponse,get_origin_endpoint_policy_response +GetOriginEndpointRequest,get_origin_endpoint_request +GetOriginEndpointResponse,get_origin_endpoint_response +GetOriginRequestPolicyConfigRequest,get_origin_request_policy_config_request +GetOriginRequestPolicyConfigResult,get_origin_request_policy_config_result +GetOriginRequestPolicyRequest,get_origin_request_policy_request +GetOriginRequestPolicyResult,get_origin_request_policy_result +GetOutcomesRequest,get_outcomes_request +GetOutcomesResult,get_outcomes_result +GetOutpostInput,get_outpost_input +GetOutpostInstanceTypesInput,get_outpost_instance_types_input +GetOutpostInstanceTypesOutput,get_outpost_instance_types_output +GetOutpostOutput,get_outpost_output +GetOutpostResolverRequest,get_outpost_resolver_request +GetOutpostResolverResponse,get_outpost_resolver_response +GetPackageConfigurationResponse,get_package_configuration_response +GetPackageRequest,get_package_request +GetPackageResponse,get_package_response +GetPackageVersionAssetRequest,get_package_version_asset_request +GetPackageVersionAssetResult,get_package_version_asset_result +GetPackageVersionHistoryRequest,get_package_version_history_request +GetPackageVersionHistoryResponse,get_package_version_history_response +GetPackageVersionReadmeRequest,get_package_version_readme_request +GetPackageVersionReadmeResult,get_package_version_readme_result +GetPackageVersionRequest,get_package_version_request +GetPackageVersionResponse,get_package_version_response +GetParallelDataRequest,get_parallel_data_request +GetParallelDataResponse,get_parallel_data_response +GetParameterHistoryRequest,get_parameter_history_request +GetParameterHistoryResult,get_parameter_history_result +GetParameterRequest,get_parameter_request +GetParameterResult,get_parameter_result +GetParametersByPathRequest,get_parameters_by_path_request +GetParametersByPathResult,get_parameters_by_path_result +GetParametersForExportInput,get_parameters_for_export_input +GetParametersForExportOutput,get_parameters_for_export_output +GetParametersForImportInput,get_parameters_for_import_input +GetParametersForImportOutput,get_parameters_for_import_output +GetParametersForImportRequest,get_parameters_for_import_request +GetParametersForImportResponse,get_parameters_for_import_response +GetParametersRequest,get_parameters_request +GetParametersResult,get_parameters_result +GetParticipantRequest,get_participant_request +GetParticipantResponse,get_participant_response +GetPartitionIndexesRequest,get_partition_indexes_request +GetPartitionIndexesResponse,get_partition_indexes_response +GetPartitionRequest,get_partition_request +GetPartitionResponse,get_partition_response +GetPartitionsRequest,get_partitions_request +GetPartitionsResponse,get_partitions_response +GetPartnerAccountRequest,get_partner_account_request +GetPartnerAccountResponse,get_partner_account_response +GetPasswordDataRequest,get_password_data_request +GetPasswordDataResult,get_password_data_result +GetPatchBaselineForPatchGroupRequest,get_patch_baseline_for_patch_group_request +GetPatchBaselineForPatchGroupResult,get_patch_baseline_for_patch_group_result +GetPatchBaselineRequest,get_patch_baseline_request +GetPatchBaselineResult,get_patch_baseline_result +GetPendingJobExecutionsRequest,get_pending_job_executions_request +GetPendingJobExecutionsResponse,get_pending_job_executions_response +GetPercentilesRequest,get_percentiles_request +GetPercentilesResponse,get_percentiles_response +GetPerformanceAnalysisReportRequest,get_performance_analysis_report_request +GetPerformanceAnalysisReportResponse,get_performance_analysis_report_response +GetPermissionGroupRequest,get_permission_group_request +GetPermissionGroupResponse,get_permission_group_response +GetPermissionPolicyRequest,get_permission_policy_request +GetPermissionPolicyResponse,get_permission_policy_response +GetPermissionRequest,get_permission_request +GetPermissionResponse,get_permission_response +GetPermissionsBoundaryForPermissionSetRequest,get_permissions_boundary_for_permission_set_request +GetPermissionsBoundaryForPermissionSetResponse,get_permissions_boundary_for_permission_set_response +GetPersonTrackingRequest,get_person_tracking_request +GetPersonTrackingResponse,get_person_tracking_response +GetPersonalizedRankingRequest,get_personalized_ranking_request +GetPersonalizedRankingResponse,get_personalized_ranking_response +GetPhoneNumberOrderRequest,get_phone_number_order_request +GetPhoneNumberOrderResponse,get_phone_number_order_response +GetPhoneNumberRequest,get_phone_number_request +GetPhoneNumberResponse,get_phone_number_response +GetPhoneNumberSettingsResponse,get_phone_number_settings_response +GetPipelineBlueprintRequest,get_pipeline_blueprint_request +GetPipelineBlueprintResponse,get_pipeline_blueprint_response +GetPipelineChangeProgressRequest,get_pipeline_change_progress_request +GetPipelineChangeProgressResponse,get_pipeline_change_progress_response +GetPipelineDefinitionInput,get_pipeline_definition_input +GetPipelineDefinitionOutput,get_pipeline_definition_output +GetPipelineExecutionInput,get_pipeline_execution_input +GetPipelineExecutionOutput,get_pipeline_execution_output +GetPipelineInput,get_pipeline_input +GetPipelineOutput,get_pipeline_output +GetPipelineRequest,get_pipeline_request +GetPipelineResponse,get_pipeline_response +GetPipelineStateInput,get_pipeline_state_input +GetPipelineStateOutput,get_pipeline_state_output +GetPlaceRequest,get_place_request +GetPlaceResponse,get_place_response +GetPlanRequest,get_plan_request +GetPlanResponse,get_plan_response +GetPlatformApplicationAttributesInput,get_platform_application_attributes_input +GetPlatformApplicationAttributesResponse,get_platform_application_attributes_response +GetPlaybackConfigurationRequest,get_playback_configuration_request +GetPlaybackConfigurationResponse,get_playback_configuration_response +GetPlaybackKeyPairRequest,get_playback_key_pair_request +GetPlaybackKeyPairResponse,get_playback_key_pair_response +GetPlayerConnectionStatusRequest,get_player_connection_status_request +GetPlayerConnectionStatusResult,get_player_connection_status_result +GetPoliciesStatsResponse,get_policies_stats_response +GetPolicyInput,get_policy_input +GetPolicyOutput,get_policy_output +GetPolicyRequest,get_policy_request +GetPolicyResponse,get_policy_response +GetPolicyStoreInput,get_policy_store_input +GetPolicyStoreOutput,get_policy_store_output +GetPolicyTemplateInput,get_policy_template_input +GetPolicyTemplateOutput,get_policy_template_output +GetPolicyVersionRequest,get_policy_version_request +GetPolicyVersionResponse,get_policy_version_response +GetPortalRequest,get_portal_request +GetPortalResponse,get_portal_response +GetPortalServiceProviderMetadataRequest,get_portal_service_provider_metadata_request +GetPortalServiceProviderMetadataResponse,get_portal_service_provider_metadata_response +GetPortfolioPreferencesResponse,get_portfolio_preferences_response +GetPortfolioSummaryResponse,get_portfolio_summary_response +GetPositionConfigurationRequest,get_position_configuration_request +GetPositionConfigurationResponse,get_position_configuration_response +GetPositionEstimateRequest,get_position_estimate_request +GetPositionEstimateResponse,get_position_estimate_response +GetPositionRequest,get_position_request +GetPositionResponse,get_position_response +GetPredictiveScalingForecastAnswer,get_predictive_scaling_forecast_answer +GetPredictiveScalingForecastType,get_predictive_scaling_forecast_type +GetPrefetchScheduleRequest,get_prefetch_schedule_request +GetPrefetchScheduleResponse,get_prefetch_schedule_response +GetPreparedStatementInput,get_prepared_statement_input +GetPreparedStatementOutput,get_prepared_statement_output +GetPresetRequest,get_preset_request +GetPresetResponse,get_preset_response +GetPriceListFileUrlRequest,get_price_list_file_url_request +GetPriceListFileUrlResponse,get_price_list_file_url_response +GetPricingPlanResponse,get_pricing_plan_response +GetPrincipalTagAttributeMapInput,get_principal_tag_attribute_map_input +GetPrincipalTagAttributeMapResponse,get_principal_tag_attribute_map_response +GetProductsRequest,get_products_request +GetProductsResponse,get_products_response +GetProfileInput,get_profile_input +GetProfileObjectTypeRequest,get_profile_object_type_request +GetProfileObjectTypeResponse,get_profile_object_type_response +GetProfileObjectTypeTemplateRequest,get_profile_object_type_template_request +GetProfileObjectTypeTemplateResponse,get_profile_object_type_template_response +GetProfileOutput,get_profile_output +GetProfileRequest,get_profile_request +GetProfileResponse,get_profile_response +GetProfileTemplateOutput,get_profile_template_output +GetProgrammaticAccessCredentialsRequest,get_programmatic_access_credentials_request +GetProgrammaticAccessCredentialsResponse,get_programmatic_access_credentials_response +GetProjectRequest,get_project_request +GetProjectResponse,get_project_response +GetProjectResult,get_project_result +GetPromptFileRequest,get_prompt_file_request +GetPromptFileResponse,get_prompt_file_response +GetPropertyValueHistoryRequest,get_property_value_history_request +GetPropertyValueHistoryResponse,get_property_value_history_response +GetPropertyValueRequest,get_property_value_request +GetPropertyValueResponse,get_property_value_response +GetPropertygraphStatisticsOutput,get_propertygraph_statistics_output +GetPropertygraphStreamInput,get_propertygraph_stream_input +GetPropertygraphStreamOutput,get_propertygraph_stream_output +GetPropertygraphSummaryInput,get_propertygraph_summary_input +GetPropertygraphSummaryOutput,get_propertygraph_summary_output +GetProposalInput,get_proposal_input +GetProposalOutput,get_proposal_output +GetProtectedQueryInput,get_protected_query_input +GetProtectedQueryOutput,get_protected_query_output +GetProtectionStatusRequest,get_protection_status_request +GetProtectionStatusResponse,get_protection_status_response +GetProtocolsListRequest,get_protocols_list_request +GetProtocolsListResponse,get_protocols_list_response +GetProvisionedConcurrencyConfigRequest,get_provisioned_concurrency_config_request +GetProvisionedConcurrencyConfigResponse,get_provisioned_concurrency_config_response +GetProvisionedModelThroughputRequest,get_provisioned_model_throughput_request +GetProvisionedModelThroughputResponse,get_provisioned_model_throughput_response +GetProvisionedProductOutputsInput,get_provisioned_product_outputs_input +GetProvisionedProductOutputsOutput,get_provisioned_product_outputs_output +GetProxySessionRequest,get_proxy_session_request +GetProxySessionResponse,get_proxy_session_response +GetPublicAccessBlockOutput,get_public_access_block_output +GetPublicAccessBlockRequest,get_public_access_block_request +GetPublicKeyCertificateInput,get_public_key_certificate_input +GetPublicKeyCertificateOutput,get_public_key_certificate_output +GetPublicKeyConfigRequest,get_public_key_config_request +GetPublicKeyConfigResult,get_public_key_config_result +GetPublicKeyRequest,get_public_key_request +GetPublicKeyResponse,get_public_key_response +GetPublicKeyResult,get_public_key_result +GetPullRequestApprovalStatesInput,get_pull_request_approval_states_input +GetPullRequestApprovalStatesOutput,get_pull_request_approval_states_output +GetPullRequestInput,get_pull_request_input +GetPullRequestOutput,get_pull_request_output +GetPullRequestOverrideStateInput,get_pull_request_override_state_input +GetPullRequestOverrideStateOutput,get_pull_request_override_state_output +GetPushTemplateRequest,get_push_template_request +GetPushTemplateResponse,get_push_template_response +GetQualificationScoreRequest,get_qualification_score_request +GetQualificationScoreResponse,get_qualification_score_response +GetQualificationTypeRequest,get_qualification_type_request +GetQualificationTypeResponse,get_qualification_type_response +GetQuantumTaskRequest,get_quantum_task_request +GetQuantumTaskResponse,get_quantum_task_response +GetQueryExecutionInput,get_query_execution_input +GetQueryExecutionOutput,get_query_execution_output +GetQueryLoggingConfigRequest,get_query_logging_config_request +GetQueryLoggingConfigResponse,get_query_logging_config_response +GetQueryResultsInput,get_query_results_input +GetQueryResultsOutput,get_query_results_output +GetQueryResultsRequest,get_query_results_request +GetQueryResultsResponse,get_query_results_response +GetQueryRuntimeStatisticsInput,get_query_runtime_statistics_input +GetQueryRuntimeStatisticsOutput,get_query_runtime_statistics_output +GetQueryStateRequest,get_query_state_request +GetQueryStateResponse,get_query_state_response +GetQueryStatisticsRequest,get_query_statistics_request +GetQueryStatisticsResponse,get_query_statistics_response +GetQuerySuggestionsRequest,get_query_suggestions_request +GetQuerySuggestionsResponse,get_query_suggestions_response +GetQueueAttributesRequest,get_queue_attributes_request +GetQueueAttributesResult,get_queue_attributes_result +GetQueueRequest,get_queue_request +GetQueueResponse,get_queue_response +GetQueueUrlRequest,get_queue_url_request +GetQueueUrlResult,get_queue_url_result +GetRDFGraphSummaryInput,get_rdf_graph_summary_input +GetRDFGraphSummaryOutput,get_rdf_graph_summary_output +GetRandomPasswordRequest,get_random_password_request +GetRandomPasswordResponse,get_random_password_response +GetRasterDataCollectionInput,get_raster_data_collection_input +GetRasterDataCollectionOutput,get_raster_data_collection_output +GetRateBasedRuleManagedKeysRequest,get_rate_based_rule_managed_keys_request +GetRateBasedRuleManagedKeysResponse,get_rate_based_rule_managed_keys_response +GetRateBasedRuleRequest,get_rate_based_rule_request +GetRateBasedRuleResponse,get_rate_based_rule_response +GetRateBasedStatementManagedKeysRequest,get_rate_based_statement_managed_keys_request +GetRateBasedStatementManagedKeysResponse,get_rate_based_statement_managed_keys_response +GetRawMessageContentRequest,get_raw_message_content_request +GetRawMessageContentResponse,get_raw_message_content_response +GetReadSetActivationJobRequest,get_read_set_activation_job_request +GetReadSetActivationJobResponse,get_read_set_activation_job_response +GetReadSetExportJobRequest,get_read_set_export_job_request +GetReadSetExportJobResponse,get_read_set_export_job_response +GetReadSetImportJobRequest,get_read_set_import_job_request +GetReadSetImportJobResponse,get_read_set_import_job_response +GetReadSetMetadataRequest,get_read_set_metadata_request +GetReadSetMetadataResponse,get_read_set_metadata_response +GetReadSetRequest,get_read_set_request +GetReadSetResponse,get_read_set_response +GetReadinessCheckRequest,get_readiness_check_request +GetReadinessCheckResourceStatusRequest,get_readiness_check_resource_status_request +GetReadinessCheckResourceStatusResponse,get_readiness_check_resource_status_response +GetReadinessCheckResponse,get_readiness_check_response +GetReadinessCheckStatusRequest,get_readiness_check_status_request +GetReadinessCheckStatusResponse,get_readiness_check_status_response +GetRealtimeLogConfigRequest,get_realtime_log_config_request +GetRealtimeLogConfigResult,get_realtime_log_config_result +GetRecommendationError,get_recommendation_error +GetRecommendationPreferencesRequest,get_recommendation_preferences_request +GetRecommendationPreferencesResponse,get_recommendation_preferences_response +GetRecommendationReportDetailsRequest,get_recommendation_report_details_request +GetRecommendationReportDetailsResponse,get_recommendation_report_details_response +GetRecommendationSummariesRequest,get_recommendation_summaries_request +GetRecommendationSummariesResponse,get_recommendation_summaries_response +GetRecommendationsRequest,get_recommendations_request +GetRecommendationsResponse,get_recommendations_response +GetRecommenderConfigurationRequest,get_recommender_configuration_request +GetRecommenderConfigurationResponse,get_recommender_configuration_response +GetRecommenderConfigurationsRequest,get_recommender_configurations_request +GetRecommenderConfigurationsResponse,get_recommender_configurations_response +GetRecordRequest,get_record_request +GetRecordResponse,get_record_response +GetRecordingConfigurationRequest,get_recording_configuration_request +GetRecordingConfigurationResponse,get_recording_configuration_response +GetRecordsInput,get_records_input +GetRecordsOutput,get_records_output +GetRecoveryGroupReadinessSummaryRequest,get_recovery_group_readiness_summary_request +GetRecoveryGroupReadinessSummaryResponse,get_recovery_group_readiness_summary_response +GetRecoveryGroupRequest,get_recovery_group_request +GetRecoveryGroupResponse,get_recovery_group_response +GetRecoveryPointRequest,get_recovery_point_request +GetRecoveryPointResponse,get_recovery_point_response +GetRecoveryPointRestoreMetadataInput,get_recovery_point_restore_metadata_input +GetRecoveryPointRestoreMetadataOutput,get_recovery_point_restore_metadata_output +GetReferenceImportJobRequest,get_reference_import_job_request +GetReferenceImportJobResponse,get_reference_import_job_response +GetReferenceMetadataRequest,get_reference_metadata_request +GetReferenceMetadataResponse,get_reference_metadata_response +GetReferenceRequest,get_reference_request +GetReferenceResponse,get_reference_response +GetReferenceStoreRequest,get_reference_store_request +GetReferenceStoreResponse,get_reference_store_response +GetRegexMatchSetRequest,get_regex_match_set_request +GetRegexMatchSetResponse,get_regex_match_set_response +GetRegexPatternSetRequest,get_regex_pattern_set_request +GetRegexPatternSetResponse,get_regex_pattern_set_response +GetRegionOptStatusRequest,get_region_opt_status_request +GetRegionOptStatusResponse,get_region_opt_status_response +GetRegionsRequest,get_regions_request +GetRegionsResult,get_regions_result +GetRegisterAccountStatusResponse,get_register_account_status_response +GetRegistrationCodeResponse,get_registration_code_response +GetRegistryCatalogDataResponse,get_registry_catalog_data_response +GetRegistryInput,get_registry_input +GetRegistryPolicyResponse,get_registry_policy_response +GetRegistryResponse,get_registry_response +GetRegistryScanningConfigurationResponse,get_registry_scanning_configuration_response +GetRelationalDatabaseBlueprintsRequest,get_relational_database_blueprints_request +GetRelationalDatabaseBlueprintsResult,get_relational_database_blueprints_result +GetRelationalDatabaseBundlesRequest,get_relational_database_bundles_request +GetRelationalDatabaseBundlesResult,get_relational_database_bundles_result +GetRelationalDatabaseEventsRequest,get_relational_database_events_request +GetRelationalDatabaseEventsResult,get_relational_database_events_result +GetRelationalDatabaseLogEventsRequest,get_relational_database_log_events_request +GetRelationalDatabaseLogEventsResult,get_relational_database_log_events_result +GetRelationalDatabaseLogStreamsRequest,get_relational_database_log_streams_request +GetRelationalDatabaseLogStreamsResult,get_relational_database_log_streams_result +GetRelationalDatabaseMasterUserPasswordRequest,get_relational_database_master_user_password_request +GetRelationalDatabaseMasterUserPasswordResult,get_relational_database_master_user_password_result +GetRelationalDatabaseMetricDataRequest,get_relational_database_metric_data_request +GetRelationalDatabaseMetricDataResult,get_relational_database_metric_data_result +GetRelationalDatabaseParametersRequest,get_relational_database_parameters_request +GetRelationalDatabaseParametersResult,get_relational_database_parameters_result +GetRelationalDatabaseRequest,get_relational_database_request +GetRelationalDatabaseResult,get_relational_database_result +GetRelationalDatabaseSnapshotRequest,get_relational_database_snapshot_request +GetRelationalDatabaseSnapshotResult,get_relational_database_snapshot_result +GetRelationalDatabaseSnapshotsRequest,get_relational_database_snapshots_request +GetRelationalDatabaseSnapshotsResult,get_relational_database_snapshots_result +GetRelationalDatabasesRequest,get_relational_databases_request +GetRelationalDatabasesResult,get_relational_databases_result +GetRemainingFreeTrialDaysRequest,get_remaining_free_trial_days_request +GetRemainingFreeTrialDaysResponse,get_remaining_free_trial_days_response +GetRemoteAccessSessionRequest,get_remote_access_session_request +GetRemoteAccessSessionResult,get_remote_access_session_result +GetReplicationConfigurationRequest,get_replication_configuration_request +GetReplicationJobsRequest,get_replication_jobs_request +GetReplicationJobsResponse,get_replication_jobs_response +GetReplicationRunsRequest,get_replication_runs_request +GetReplicationRunsResponse,get_replication_runs_response +GetReplicationSetInput,get_replication_set_input +GetReplicationSetOutput,get_replication_set_output +GetReportDefinitionRequest,get_report_definition_request +GetReportDefinitionResult,get_report_definition_result +GetReportGroupTrendInput,get_report_group_trend_input +GetReportGroupTrendOutput,get_report_group_trend_output +GetRepositoryCatalogDataRequest,get_repository_catalog_data_request +GetRepositoryCatalogDataResponse,get_repository_catalog_data_response +GetRepositoryEndpointRequest,get_repository_endpoint_request +GetRepositoryEndpointResult,get_repository_endpoint_result +GetRepositoryInput,get_repository_input +GetRepositoryOutput,get_repository_output +GetRepositoryPermissionsPolicyRequest,get_repository_permissions_policy_request +GetRepositoryPermissionsPolicyResult,get_repository_permissions_policy_result +GetRepositoryPolicyRequest,get_repository_policy_request +GetRepositoryPolicyResponse,get_repository_policy_response +GetRepositorySyncStatusInput,get_repository_sync_status_input +GetRepositorySyncStatusOutput,get_repository_sync_status_output +GetRepositoryTriggersInput,get_repository_triggers_input +GetRepositoryTriggersOutput,get_repository_triggers_output +GetRequestMetadata,get_request_metadata +GetRequestValidatorRequest,get_request_validator_request +GetRequestValidatorsRequest,get_request_validators_request +GetRequestedServiceQuotaChangeRequest,get_requested_service_quota_change_request +GetRequestedServiceQuotaChangeResponse,get_requested_service_quota_change_response +GetReservationCoverageRequest,get_reservation_coverage_request +GetReservationCoverageResponse,get_reservation_coverage_response +GetReservationPurchaseRecommendationRequest,get_reservation_purchase_recommendation_request +GetReservationPurchaseRecommendationResponse,get_reservation_purchase_recommendation_response +GetReservationUtilizationRequest,get_reservation_utilization_request +GetReservationUtilizationResponse,get_reservation_utilization_response +GetReservedInstancesExchangeQuoteRequest,get_reserved_instances_exchange_quote_request +GetReservedInstancesExchangeQuoteResult,get_reserved_instances_exchange_quote_result +GetReservedNodeExchangeConfigurationOptionsInputMessage,get_reserved_node_exchange_configuration_options_input_message +GetReservedNodeExchangeConfigurationOptionsOutputMessage,get_reserved_node_exchange_configuration_options_output_message +GetReservedNodeExchangeOfferingsInputMessage,get_reserved_node_exchange_offerings_input_message +GetReservedNodeExchangeOfferingsOutputMessage,get_reserved_node_exchange_offerings_output_message +GetResolverConfigRequest,get_resolver_config_request +GetResolverConfigResponse,get_resolver_config_response +GetResolverDnssecConfigRequest,get_resolver_dnssec_config_request +GetResolverDnssecConfigResponse,get_resolver_dnssec_config_response +GetResolverEndpointRequest,get_resolver_endpoint_request +GetResolverEndpointResponse,get_resolver_endpoint_response +GetResolverQueryLogConfigAssociationRequest,get_resolver_query_log_config_association_request +GetResolverQueryLogConfigAssociationResponse,get_resolver_query_log_config_association_response +GetResolverQueryLogConfigPolicyRequest,get_resolver_query_log_config_policy_request +GetResolverQueryLogConfigPolicyResponse,get_resolver_query_log_config_policy_response +GetResolverQueryLogConfigRequest,get_resolver_query_log_config_request +GetResolverQueryLogConfigResponse,get_resolver_query_log_config_response +GetResolverRequest,get_resolver_request +GetResolverResponse,get_resolver_response +GetResolverRuleAssociationRequest,get_resolver_rule_association_request +GetResolverRuleAssociationResponse,get_resolver_rule_association_response +GetResolverRulePolicyRequest,get_resolver_rule_policy_request +GetResolverRulePolicyResponse,get_resolver_rule_policy_response +GetResolverRuleRequest,get_resolver_rule_request +GetResolverRuleResponse,get_resolver_rule_response +GetResourceCollectionRequest,get_resource_collection_request +GetResourceCollectionResponse,get_resource_collection_response +GetResourceConfigHistoryRequest,get_resource_config_history_request +GetResourceConfigHistoryResponse,get_resource_config_history_response +GetResourceDefinitionRequest,get_resource_definition_request +GetResourceDefinitionResponse,get_resource_definition_response +GetResourceDefinitionVersionRequest,get_resource_definition_version_request +GetResourceDefinitionVersionResponse,get_resource_definition_version_response +GetResourceEvaluationSummaryRequest,get_resource_evaluation_summary_request +GetResourceEvaluationSummaryResponse,get_resource_evaluation_summary_response +GetResourceEventConfigurationRequest,get_resource_event_configuration_request +GetResourceEventConfigurationResponse,get_resource_event_configuration_response +GetResourceInput,get_resource_input +GetResourceLFTagsRequest,get_resource_lf_tags_request +GetResourceLFTagsResponse,get_resource_lf_tags_response +GetResourceLogLevelRequest,get_resource_log_level_request +GetResourceLogLevelResponse,get_resource_log_level_response +GetResourceMetadataRequest,get_resource_metadata_request +GetResourceMetadataResponse,get_resource_metadata_response +GetResourceMetricsRequest,get_resource_metrics_request +GetResourceMetricsResponse,get_resource_metrics_response +GetResourceOutput,get_resource_output +GetResourcePermissionInput,get_resource_permission_input +GetResourcePermissionOutput,get_resource_permission_output +GetResourcePoliciesInput,get_resource_policies_input +GetResourcePoliciesOutput,get_resource_policies_output +GetResourcePoliciesRequest,get_resource_policies_request +GetResourcePoliciesResponse,get_resource_policies_response +GetResourcePoliciesResponseEntry,get_resource_policies_response_entry +GetResourcePoliciesResponseList,get_resource_policies_response_list +GetResourcePolicyInput,get_resource_policy_input +GetResourcePolicyOutput,get_resource_policy_output +GetResourcePolicyRequest,get_resource_policy_request +GetResourcePolicyResponse,get_resource_policy_response +GetResourcePositionRequest,get_resource_position_request +GetResourcePositionResponse,get_resource_position_response +GetResourceProfileRequest,get_resource_profile_request +GetResourceProfileResponse,get_resource_profile_response +GetResourceRequest,get_resource_request +GetResourceRequestStatusInput,get_resource_request_status_input +GetResourceRequestStatusOutput,get_resource_request_status_output +GetResourceSetRequest,get_resource_set_request +GetResourceSetResponse,get_resource_set_response +GetResourceShareAssociationsRequest,get_resource_share_associations_request +GetResourceShareAssociationsResponse,get_resource_share_associations_response +GetResourceShareInvitationsRequest,get_resource_share_invitations_request +GetResourceShareInvitationsResponse,get_resource_share_invitations_response +GetResourceSharesRequest,get_resource_shares_request +GetResourceSharesResponse,get_resource_shares_response +GetResourcesInput,get_resources_input +GetResourcesOutput,get_resources_output +GetResourcesRequest,get_resources_request +GetResourcesResponse,get_resources_response +GetResourcesSummaryOutput,get_resources_summary_output +GetResponseHeadersPolicyConfigRequest,get_response_headers_policy_config_request +GetResponseHeadersPolicyConfigResult,get_response_headers_policy_config_result +GetResponseHeadersPolicyRequest,get_response_headers_policy_request +GetResponseHeadersPolicyResult,get_response_headers_policy_result +GetResponsePlanInput,get_response_plan_input +GetResponsePlanOutput,get_response_plan_output +GetRestApiRequest,get_rest_api_request +GetRestApisRequest,get_rest_apis_request +GetRetainedMessageRequest,get_retained_message_request +GetRetainedMessageResponse,get_retained_message_response +GetRetentionSettingsRequest,get_retention_settings_request +GetRetentionSettingsResponse,get_retention_settings_response +GetReusableDelegationSetLimitRequest,get_reusable_delegation_set_limit_request +GetReusableDelegationSetLimitResponse,get_reusable_delegation_set_limit_response +GetReusableDelegationSetRequest,get_reusable_delegation_set_request +GetReusableDelegationSetResponse,get_reusable_delegation_set_response +GetRevealConfigurationResponse,get_reveal_configuration_response +GetRevisionRequest,get_revision_request +GetRevisionResponse,get_revision_response +GetRevocationStatusRequest,get_revocation_status_request +GetRevocationStatusResponse,get_revocation_status_response +GetRightsizingRecommendationRequest,get_rightsizing_recommendation_request +GetRightsizingRecommendationResponse,get_rightsizing_recommendation_response +GetRoleCredentialsRequest,get_role_credentials_request +GetRoleCredentialsResponse,get_role_credentials_response +GetRolePolicyRequest,get_role_policy_request +GetRolePolicyResponse,get_role_policy_response +GetRoleRequest,get_role_request +GetRoleResponse,get_role_response +GetRoomRequest,get_room_request +GetRoomResponse,get_room_response +GetRoomSkillParameterRequest,get_room_skill_parameter_request +GetRoomSkillParameterResponse,get_room_skill_parameter_response +GetRotationOverrideRequest,get_rotation_override_request +GetRotationOverrideResult,get_rotation_override_result +GetRotationRequest,get_rotation_request +GetRotationResult,get_rotation_result +GetRouteAnalysisRequest,get_route_analysis_request +GetRouteAnalysisResponse,get_route_analysis_response +GetRouteRequest,get_route_request +GetRouteResponse,get_route_response +GetRouteResponseRequest,get_route_response_request +GetRouteResponseResponse,get_route_response_response +GetRouteResponsesRequest,get_route_responses_request +GetRouteResponsesResponse,get_route_responses_response +GetRouteResult,get_route_result +GetRoutesRequest,get_routes_request +GetRoutesResponse,get_routes_response +GetRoutingControlStateRequest,get_routing_control_state_request +GetRoutingControlStateResponse,get_routing_control_state_response +GetRuleGroupRequest,get_rule_group_request +GetRuleGroupResponse,get_rule_group_response +GetRuleRequest,get_rule_request +GetRuleResponse,get_rule_response +GetRulesRequest,get_rules_request +GetRulesResult,get_rules_result +GetRunGroupRequest,get_run_group_request +GetRunGroupResponse,get_run_group_response +GetRunRequest,get_run_request +GetRunResponse,get_run_response +GetRunResult,get_run_result +GetRunTaskRequest,get_run_task_request +GetRunTaskResponse,get_run_task_response +GetRuntimeManagementConfigRequest,get_runtime_management_config_request +GetRuntimeManagementConfigResponse,get_runtime_management_config_response +GetSAMLProviderRequest,get_saml_provider_request +GetSAMLProviderResponse,get_saml_provider_response +GetSMSAttributesInput,get_sms_attributes_input +GetSMSAttributesResponse,get_sms_attributes_response +GetSMSSandboxAccountStatusResult,get_sms_sandbox_account_status_result +GetSSHPublicKeyRequest,get_ssh_public_key_request +GetSSHPublicKeyResponse,get_ssh_public_key_response +GetSagemakerServicecatalogPortfolioStatusOutput,get_sagemaker_servicecatalog_portfolio_status_output +GetSampleDataRequest,get_sample_data_request +GetSampleDataResponse,get_sample_data_response +GetSampledRequestsRequest,get_sampled_requests_request +GetSampledRequestsResponse,get_sampled_requests_response +GetSamplingRulesRequest,get_sampling_rules_request +GetSamplingRulesResult,get_sampling_rules_result +GetSamplingStatisticSummariesRequest,get_sampling_statistic_summaries_request +GetSamplingStatisticSummariesResult,get_sampling_statistic_summaries_result +GetSamplingTargetsRequest,get_sampling_targets_request +GetSamplingTargetsResult,get_sampling_targets_result +GetSatelliteRequest,get_satellite_request +GetSatelliteResponse,get_satellite_response +GetSavingsPlanPurchaseRecommendationDetailsRequest,get_savings_plan_purchase_recommendation_details_request +GetSavingsPlanPurchaseRecommendationDetailsResponse,get_savings_plan_purchase_recommendation_details_response +GetSavingsPlansCoverageRequest,get_savings_plans_coverage_request +GetSavingsPlansCoverageResponse,get_savings_plans_coverage_response +GetSavingsPlansPurchaseRecommendationRequest,get_savings_plans_purchase_recommendation_request +GetSavingsPlansPurchaseRecommendationResponse,get_savings_plans_purchase_recommendation_response +GetSavingsPlansUtilizationDetailsRequest,get_savings_plans_utilization_details_request +GetSavingsPlansUtilizationDetailsResponse,get_savings_plans_utilization_details_response +GetSavingsPlansUtilizationRequest,get_savings_plans_utilization_request +GetSavingsPlansUtilizationResponse,get_savings_plans_utilization_response +GetSbomExportRequest,get_sbom_export_request +GetSbomExportResponse,get_sbom_export_response +GetScalingConfigurationRecommendationRequest,get_scaling_configuration_recommendation_request +GetScalingConfigurationRecommendationResponse,get_scaling_configuration_recommendation_response +GetScalingPlanResourceForecastDataRequest,get_scaling_plan_resource_forecast_data_request +GetScalingPlanResourceForecastDataResponse,get_scaling_plan_resource_forecast_data_response +GetScanRequest,get_scan_request +GetScanResponse,get_scan_response +GetSceneRequest,get_scene_request +GetSceneResponse,get_scene_response +GetScheduleGroupInput,get_schedule_group_input +GetScheduleGroupOutput,get_schedule_group_output +GetScheduleInput,get_schedule_input +GetScheduleOutput,get_schedule_output +GetSchemaAnalysisRuleInput,get_schema_analysis_rule_input +GetSchemaAnalysisRuleOutput,get_schema_analysis_rule_output +GetSchemaAsJsonRequest,get_schema_as_json_request +GetSchemaAsJsonResponse,get_schema_as_json_response +GetSchemaByDefinitionInput,get_schema_by_definition_input +GetSchemaByDefinitionResponse,get_schema_by_definition_response +GetSchemaCreationStatusRequest,get_schema_creation_status_request +GetSchemaCreationStatusResponse,get_schema_creation_status_response +GetSchemaInput,get_schema_input +GetSchemaMappingInput,get_schema_mapping_input +GetSchemaMappingOutput,get_schema_mapping_output +GetSchemaOutput,get_schema_output +GetSchemaResponse,get_schema_response +GetSchemaVersionInput,get_schema_version_input +GetSchemaVersionResponse,get_schema_version_response +GetSchemaVersionsDiffInput,get_schema_versions_diff_input +GetSchemaVersionsDiffResponse,get_schema_versions_diff_response +GetScreenDataRequest,get_screen_data_request +GetScreenDataResult,get_screen_data_result +GetSdkRequest,get_sdk_request +GetSdkTypeRequest,get_sdk_type_request +GetSdkTypesRequest,get_sdk_types_request +GetSearchSuggestionsRequest,get_search_suggestions_request +GetSearchSuggestionsResponse,get_search_suggestions_response +GetSecretValueRequest,get_secret_value_request +GetSecretValueResponse,get_secret_value_response +GetSecurityConfigRequest,get_security_config_request +GetSecurityConfigResponse,get_security_config_response +GetSecurityConfigurationRequest,get_security_configuration_request +GetSecurityConfigurationResponse,get_security_configuration_response +GetSecurityConfigurationsRequest,get_security_configurations_request +GetSecurityConfigurationsResponse,get_security_configurations_response +GetSecurityPolicyRequest,get_security_policy_request +GetSecurityPolicyResponse,get_security_policy_response +GetSegmentDetectionRequest,get_segment_detection_request +GetSegmentDetectionResponse,get_segment_detection_response +GetSegmentExportJobsRequest,get_segment_export_jobs_request +GetSegmentExportJobsResponse,get_segment_export_jobs_response +GetSegmentImportJobsRequest,get_segment_import_jobs_request +GetSegmentImportJobsResponse,get_segment_import_jobs_response +GetSegmentRequest,get_segment_request +GetSegmentResponse,get_segment_response +GetSegmentVersionRequest,get_segment_version_request +GetSegmentVersionResponse,get_segment_version_response +GetSegmentVersionsRequest,get_segment_versions_request +GetSegmentVersionsResponse,get_segment_versions_response +GetSegmentsRequest,get_segments_request +GetSegmentsResponse,get_segments_response +GetSendQuotaResponse,get_send_quota_response +GetSendStatisticsResponse,get_send_statistics_response +GetSensitiveDataOccurrencesAvailabilityRequest,get_sensitive_data_occurrences_availability_request +GetSensitiveDataOccurrencesAvailabilityResponse,get_sensitive_data_occurrences_availability_response +GetSensitiveDataOccurrencesRequest,get_sensitive_data_occurrences_request +GetSensitiveDataOccurrencesResponse,get_sensitive_data_occurrences_response +GetSensitivityInspectionTemplateRequest,get_sensitivity_inspection_template_request +GetSensitivityInspectionTemplateResponse,get_sensitivity_inspection_template_response +GetSequenceStoreRequest,get_sequence_store_request +GetSequenceStoreResponse,get_sequence_store_response +GetSerialConsoleAccessStatusRequest,get_serial_console_access_status_request +GetSerialConsoleAccessStatusResult,get_serial_console_access_status_result +GetServerCertificateRequest,get_server_certificate_request +GetServerCertificateResponse,get_server_certificate_response +GetServerDetailsRequest,get_server_details_request +GetServerDetailsResponse,get_server_details_response +GetServerStrategiesRequest,get_server_strategies_request +GetServerStrategiesResponse,get_server_strategies_response +GetServersRequest,get_servers_request +GetServersResponse,get_servers_response +GetServiceEndpointRequest,get_service_endpoint_request +GetServiceEndpointResponse,get_service_endpoint_response +GetServiceGraphRequest,get_service_graph_request +GetServiceGraphResult,get_service_graph_result +GetServiceInput,get_service_input +GetServiceInstanceInput,get_service_instance_input +GetServiceInstanceOutput,get_service_instance_output +GetServiceInstanceSyncStatusInput,get_service_instance_sync_status_input +GetServiceInstanceSyncStatusOutput,get_service_instance_sync_status_output +GetServiceLastAccessedDetailsRequest,get_service_last_accessed_details_request +GetServiceLastAccessedDetailsResponse,get_service_last_accessed_details_response +GetServiceLastAccessedDetailsWithEntitiesRequest,get_service_last_accessed_details_with_entities_request +GetServiceLastAccessedDetailsWithEntitiesResponse,get_service_last_accessed_details_with_entities_response +GetServiceLinkedRoleDeletionStatusRequest,get_service_linked_role_deletion_status_request +GetServiceLinkedRoleDeletionStatusResponse,get_service_linked_role_deletion_status_response +GetServiceNetworkRequest,get_service_network_request +GetServiceNetworkResponse,get_service_network_response +GetServiceNetworkServiceAssociationRequest,get_service_network_service_association_request +GetServiceNetworkServiceAssociationResponse,get_service_network_service_association_response +GetServiceNetworkVpcAssociationRequest,get_service_network_vpc_association_request +GetServiceNetworkVpcAssociationResponse,get_service_network_vpc_association_response +GetServiceOutput,get_service_output +GetServicePrincipalNameRequest,get_service_principal_name_request +GetServicePrincipalNameResponse,get_service_principal_name_response +GetServiceProfileRequest,get_service_profile_request +GetServiceProfileResponse,get_service_profile_response +GetServiceQuotaIncreaseRequestFromTemplateRequest,get_service_quota_increase_request_from_template_request +GetServiceQuotaIncreaseRequestFromTemplateResponse,get_service_quota_increase_request_from_template_response +GetServiceQuotaRequest,get_service_quota_request +GetServiceQuotaResponse,get_service_quota_response +GetServiceRequest,get_service_request +GetServiceResponse,get_service_response +GetServiceRoleForAccountResponse,get_service_role_for_account_response +GetServiceSettingRequest,get_service_setting_request +GetServiceSettingResult,get_service_setting_result +GetServiceSettingsResponse,get_service_settings_response +GetServiceSyncBlockerSummaryInput,get_service_sync_blocker_summary_input +GetServiceSyncBlockerSummaryOutput,get_service_sync_blocker_summary_output +GetServiceSyncConfigInput,get_service_sync_config_input +GetServiceSyncConfigOutput,get_service_sync_config_output +GetServiceTemplateInput,get_service_template_input +GetServiceTemplateOutput,get_service_template_output +GetServiceTemplateVersionInput,get_service_template_version_input +GetServiceTemplateVersionOutput,get_service_template_version_output +GetServicesInScopeResponse,get_services_in_scope_response +GetSessionEmbedUrlRequest,get_session_embed_url_request +GetSessionEmbedUrlResponse,get_session_embed_url_response +GetSessionRequest,get_session_request +GetSessionResponse,get_session_response +GetSessionStatusRequest,get_session_status_request +GetSessionStatusResponse,get_session_status_response +GetSessionTokenRequest,get_session_token_request +GetSessionTokenResponse,get_session_token_response +GetSettingsRequest,get_settings_request +GetSettingsResponse,get_settings_response +GetShardIteratorInput,get_shard_iterator_input +GetShardIteratorOutput,get_shard_iterator_output +GetShareRequest,get_share_request +GetShareResponse,get_share_response +GetSignalCatalogRequest,get_signal_catalog_request +GetSignalCatalogResponse,get_signal_catalog_response +GetSignalingChannelEndpointInput,get_signaling_channel_endpoint_input +GetSignalingChannelEndpointOutput,get_signaling_channel_endpoint_output +GetSignedBluinsightsUrlResponse,get_signed_bluinsights_url_response +GetSigningCertificateRequest,get_signing_certificate_request +GetSigningCertificateResponse,get_signing_certificate_response +GetSigningPlatformRequest,get_signing_platform_request +GetSigningPlatformResponse,get_signing_platform_response +GetSigningProfileRequest,get_signing_profile_request +GetSigningProfileResponse,get_signing_profile_response +GetSimilarProfilesRequest,get_similar_profiles_request +GetSimilarProfilesResponse,get_similar_profiles_response +GetSinkInput,get_sink_input +GetSinkOutput,get_sink_output +GetSinkPolicyInput,get_sink_policy_input +GetSinkPolicyOutput,get_sink_policy_output +GetSipMediaApplicationAlexaSkillConfigurationRequest,get_sip_media_application_alexa_skill_configuration_request +GetSipMediaApplicationAlexaSkillConfigurationResponse,get_sip_media_application_alexa_skill_configuration_response +GetSipMediaApplicationLoggingConfigurationRequest,get_sip_media_application_logging_configuration_request +GetSipMediaApplicationLoggingConfigurationResponse,get_sip_media_application_logging_configuration_response +GetSipMediaApplicationRequest,get_sip_media_application_request +GetSipMediaApplicationResponse,get_sip_media_application_response +GetSipRuleRequest,get_sip_rule_request +GetSipRuleResponse,get_sip_rule_response +GetSiteAddressInput,get_site_address_input +GetSiteAddressOutput,get_site_address_output +GetSiteInput,get_site_input +GetSiteOutput,get_site_output +GetSiteRequest,get_site_request +GetSiteResponse,get_site_response +GetSiteToSiteVpnAttachmentRequest,get_site_to_site_vpn_attachment_request +GetSiteToSiteVpnAttachmentResponse,get_site_to_site_vpn_attachment_response +GetSitesRequest,get_sites_request +GetSitesResponse,get_sites_response +GetSizeConstraintSetRequest,get_size_constraint_set_request +GetSizeConstraintSetResponse,get_size_constraint_set_response +GetSkillGroupRequest,get_skill_group_request +GetSkillGroupResponse,get_skill_group_response +GetSlotTypeRequest,get_slot_type_request +GetSlotTypeResponse,get_slot_type_response +GetSlotTypeVersionsRequest,get_slot_type_versions_request +GetSlotTypeVersionsResponse,get_slot_type_versions_response +GetSlotTypesRequest,get_slot_types_request +GetSlotTypesResponse,get_slot_types_response +GetSmsChannelRequest,get_sms_channel_request +GetSmsChannelResponse,get_sms_channel_response +GetSmsTemplateRequest,get_sms_template_request +GetSmsTemplateResponse,get_sms_template_response +GetSnapshotBlockRequest,get_snapshot_block_request +GetSnapshotBlockResponse,get_snapshot_block_response +GetSnapshotLimitsRequest,get_snapshot_limits_request +GetSnapshotLimitsResult,get_snapshot_limits_result +GetSnapshotRequest,get_snapshot_request +GetSnapshotResponse,get_snapshot_response +GetSnapshotResult,get_snapshot_result +GetSnapshotsRequest,get_snapshots_request +GetSnapshotsResponse,get_snapshots_response +GetSnowballUsageResult,get_snowball_usage_result +GetSoftwareUpdatesRequest,get_software_updates_request +GetSoftwareUpdatesResult,get_software_updates_result +GetSolFunctionInstanceInput,get_sol_function_instance_input +GetSolFunctionInstanceMetadata,get_sol_function_instance_metadata +GetSolFunctionInstanceOutput,get_sol_function_instance_output +GetSolFunctionPackageContentInput,get_sol_function_package_content_input +GetSolFunctionPackageContentOutput,get_sol_function_package_content_output +GetSolFunctionPackageDescriptorInput,get_sol_function_package_descriptor_input +GetSolFunctionPackageDescriptorOutput,get_sol_function_package_descriptor_output +GetSolFunctionPackageInput,get_sol_function_package_input +GetSolFunctionPackageMetadata,get_sol_function_package_metadata +GetSolFunctionPackageOutput,get_sol_function_package_output +GetSolInstantiatedVnfInfo,get_sol_instantiated_vnf_info +GetSolNetworkInstanceInput,get_sol_network_instance_input +GetSolNetworkInstanceMetadata,get_sol_network_instance_metadata +GetSolNetworkInstanceOutput,get_sol_network_instance_output +GetSolNetworkOperationInput,get_sol_network_operation_input +GetSolNetworkOperationMetadata,get_sol_network_operation_metadata +GetSolNetworkOperationOutput,get_sol_network_operation_output +GetSolNetworkOperationTaskDetails,get_sol_network_operation_task_details +GetSolNetworkPackageContentInput,get_sol_network_package_content_input +GetSolNetworkPackageContentOutput,get_sol_network_package_content_output +GetSolNetworkPackageDescriptorInput,get_sol_network_package_descriptor_input +GetSolNetworkPackageDescriptorOutput,get_sol_network_package_descriptor_output +GetSolNetworkPackageInput,get_sol_network_package_input +GetSolNetworkPackageMetadata,get_sol_network_package_metadata +GetSolNetworkPackageOutput,get_sol_network_package_output +GetSolVnfInfo,get_sol_vnf_info +GetSolVnfcResourceInfo,get_sol_vnfc_resource_info +GetSolVnfcResourceInfoMetadata,get_sol_vnfc_resource_info_metadata +GetSolutionMetricsRequest,get_solution_metrics_request +GetSolutionMetricsResponse,get_solution_metrics_response +GetSourceApiAssociationRequest,get_source_api_association_request +GetSourceApiAssociationResponse,get_source_api_association_response +GetSourceRepositoryCloneUrlsRequest,get_source_repository_clone_urls_request +GetSourceRepositoryCloneUrlsResponse,get_source_repository_clone_urls_response +GetSourceRepositoryRequest,get_source_repository_request +GetSourceRepositoryResponse,get_source_repository_response +GetSpaceRequest,get_space_request +GetSpaceResponse,get_space_response +GetSparqlStatisticsOutput,get_sparql_statistics_output +GetSparqlStreamInput,get_sparql_stream_input +GetSparqlStreamOutput,get_sparql_stream_output +GetSpeakerSearchTaskRequest,get_speaker_search_task_request +GetSpeakerSearchTaskResponse,get_speaker_search_task_response +GetSpeechSynthesisTaskInput,get_speech_synthesis_task_input +GetSpeechSynthesisTaskOutput,get_speech_synthesis_task_output +GetSpotPlacementScoresRequest,get_spot_placement_scores_request +GetSpotPlacementScoresResult,get_spot_placement_scores_result +GetSqlInjectionMatchSetRequest,get_sql_injection_match_set_request +GetSqlInjectionMatchSetResponse,get_sql_injection_match_set_response +GetStackPolicyInput,get_stack_policy_input +GetStackPolicyOutput,get_stack_policy_output +GetStageDeploymentRequest,get_stage_deployment_request +GetStageDeploymentResult,get_stage_deployment_result +GetStageRequest,get_stage_request +GetStageResponse,get_stage_response +GetStageResult,get_stage_result +GetStageSessionRequest,get_stage_session_request +GetStageSessionResponse,get_stage_session_response +GetStagesRequest,get_stages_request +GetStagesResponse,get_stages_response +GetStatementRequest,get_statement_request +GetStatementResponse,get_statement_response +GetStatementResultRequest,get_statement_result_request +GetStatementResultResponse,get_statement_result_response +GetStaticIpRequest,get_static_ip_request +GetStaticIpResult,get_static_ip_result +GetStaticIpsRequest,get_static_ips_request +GetStaticIpsResult,get_static_ips_result +GetStatisticsRequest,get_statistics_request +GetStatisticsResponse,get_statistics_response +GetStorageLensConfigurationRequest,get_storage_lens_configuration_request +GetStorageLensConfigurationResult,get_storage_lens_configuration_result +GetStorageLensConfigurationTaggingRequest,get_storage_lens_configuration_tagging_request +GetStorageLensConfigurationTaggingResult,get_storage_lens_configuration_tagging_result +GetStoredQueryRequest,get_stored_query_request +GetStoredQueryResponse,get_stored_query_response +GetStreamKeyRequest,get_stream_key_request +GetStreamKeyResponse,get_stream_key_response +GetStreamRequest,get_stream_request +GetStreamResponse,get_stream_response +GetStreamSessionRequest,get_stream_session_request +GetStreamSessionResponse,get_stream_session_response +GetStreamingDistributionConfigRequest,get_streaming_distribution_config_request +GetStreamingDistributionConfigResult,get_streaming_distribution_config_result +GetStreamingDistributionRequest,get_streaming_distribution_request +GetStreamingDistributionResult,get_streaming_distribution_result +GetStreamingImageRequest,get_streaming_image_request +GetStreamingImageResponse,get_streaming_image_response +GetStreamingSessionBackupRequest,get_streaming_session_backup_request +GetStreamingSessionBackupResponse,get_streaming_session_backup_response +GetStreamingSessionRequest,get_streaming_session_request +GetStreamingSessionResponse,get_streaming_session_response +GetStreamingSessionStreamRequest,get_streaming_session_stream_request +GetStreamingSessionStreamResponse,get_streaming_session_stream_response +GetStudioComponentRequest,get_studio_component_request +GetStudioComponentResponse,get_studio_component_response +GetStudioMemberRequest,get_studio_member_request +GetStudioMemberResponse,get_studio_member_response +GetStudioRequest,get_studio_request +GetStudioResponse,get_studio_response +GetStudioSessionMappingInput,get_studio_session_mapping_input +GetStudioSessionMappingOutput,get_studio_session_mapping_output +GetSubnetCidrReservationsRequest,get_subnet_cidr_reservations_request +GetSubnetCidrReservationsResult,get_subnet_cidr_reservations_result +GetSubscriberRequest,get_subscriber_request +GetSubscriberResponse,get_subscriber_response +GetSubscriptionAttributesInput,get_subscription_attributes_input +GetSubscriptionAttributesResponse,get_subscription_attributes_response +GetSubscriptionDefinitionRequest,get_subscription_definition_request +GetSubscriptionDefinitionResponse,get_subscription_definition_response +GetSubscriptionDefinitionVersionRequest,get_subscription_definition_version_request +GetSubscriptionDefinitionVersionResponse,get_subscription_definition_version_response +GetSubscriptionRequest,get_subscription_request +GetSubscriptionResponse,get_subscription_response +GetSubscriptionStateResponse,get_subscription_state_response +GetSuiteDefinitionRequest,get_suite_definition_request +GetSuiteDefinitionResponse,get_suite_definition_response +GetSuiteRequest,get_suite_request +GetSuiteResult,get_suite_result +GetSuiteRunReportRequest,get_suite_run_report_request +GetSuiteRunReportResponse,get_suite_run_report_response +GetSuiteRunRequest,get_suite_run_request +GetSuiteRunResponse,get_suite_run_response +GetSupportedResourceTypesOutput,get_supported_resource_types_output +GetSuppressedDestinationRequest,get_suppressed_destination_request +GetSuppressedDestinationResponse,get_suppressed_destination_response +GetSyncJobRequest,get_sync_job_request +GetSyncJobResponse,get_sync_job_response +GetSystemInstanceRequest,get_system_instance_request +GetSystemInstanceResponse,get_system_instance_response +GetSystemTemplateRequest,get_system_template_request +GetSystemTemplateResponse,get_system_template_response +GetSystemTemplateRevisionsRequest,get_system_template_revisions_request +GetSystemTemplateRevisionsResponse,get_system_template_revisions_response +GetTableMetadataInput,get_table_metadata_input +GetTableMetadataOutput,get_table_metadata_output +GetTableObjectsRequest,get_table_objects_request +GetTableObjectsResponse,get_table_objects_response +GetTableRequest,get_table_request +GetTableResponse,get_table_response +GetTableRestoreStatusRequest,get_table_restore_status_request +GetTableRestoreStatusResponse,get_table_restore_status_response +GetTableVersionRequest,get_table_version_request +GetTableVersionResponse,get_table_version_response +GetTableVersionsRequest,get_table_versions_request +GetTableVersionsResponse,get_table_versions_response +GetTablesRequest,get_tables_request +GetTablesResponse,get_tables_response +GetTagKeysInput,get_tag_keys_input +GetTagKeysOutput,get_tag_keys_output +GetTagValuesInput,get_tag_values_input +GetTagValuesOutput,get_tag_values_output +GetTagsInput,get_tags_input +GetTagsOutput,get_tags_output +GetTagsRequest,get_tags_request +GetTagsResponse,get_tags_response +GetTargetGroupRequest,get_target_group_request +GetTargetGroupResponse,get_target_group_response +GetTargetResourceTypeRequest,get_target_resource_type_request +GetTargetResourceTypeResponse,get_target_resource_type_response +GetTaskProtectionRequest,get_task_protection_request +GetTaskProtectionResponse,get_task_protection_response +GetTaskTemplateRequest,get_task_template_request +GetTaskTemplateResponse,get_task_template_response +GetTelemetryMetadataRequest,get_telemetry_metadata_request +GetTelemetryMetadataResponse,get_telemetry_metadata_response +GetTemplateGroupAccessControlEntryRequest,get_template_group_access_control_entry_request +GetTemplateGroupAccessControlEntryResponse,get_template_group_access_control_entry_response +GetTemplateInput,get_template_input +GetTemplateOutput,get_template_output +GetTemplateRequest,get_template_request +GetTemplateResponse,get_template_response +GetTemplateStepGroupRequest,get_template_step_group_request +GetTemplateStepGroupResponse,get_template_step_group_response +GetTemplateStepRequest,get_template_step_request +GetTemplateStepResponse,get_template_step_response +GetTemplateSummaryInput,get_template_summary_input +GetTemplateSummaryOutput,get_template_summary_output +GetTemplateSyncConfigInput,get_template_sync_config_input +GetTemplateSyncConfigOutput,get_template_sync_config_output +GetTemplateSyncStatusInput,get_template_sync_status_input +GetTemplateSyncStatusOutput,get_template_sync_status_output +GetTemporaryGluePartitionCredentialsRequest,get_temporary_glue_partition_credentials_request +GetTemporaryGluePartitionCredentialsResponse,get_temporary_glue_partition_credentials_response +GetTemporaryGlueTableCredentialsRequest,get_temporary_glue_table_credentials_request +GetTemporaryGlueTableCredentialsResponse,get_temporary_glue_table_credentials_response +GetTerminologyRequest,get_terminology_request +GetTerminologyResponse,get_terminology_response +GetTestExecutionArtifactsUrlRequest,get_test_execution_artifacts_url_request +GetTestExecutionArtifactsUrlResponse,get_test_execution_artifacts_url_response +GetTestGridProjectRequest,get_test_grid_project_request +GetTestGridProjectResult,get_test_grid_project_result +GetTestGridSessionRequest,get_test_grid_session_request +GetTestGridSessionResult,get_test_grid_session_result +GetTestRequest,get_test_request +GetTestResult,get_test_result +GetTextDetectionRequest,get_text_detection_request +GetTextDetectionResponse,get_text_detection_response +GetThemeRequest,get_theme_request +GetThemeResponse,get_theme_response +GetThingRuntimeConfigurationRequest,get_thing_runtime_configuration_request +GetThingRuntimeConfigurationResponse,get_thing_runtime_configuration_response +GetThingShadowRequest,get_thing_shadow_request +GetThingShadowResponse,get_thing_shadow_response +GetThirdPartyFirewallAssociationStatusRequest,get_third_party_firewall_association_status_request +GetThirdPartyFirewallAssociationStatusResponse,get_third_party_firewall_association_status_response +GetThirdPartyJobDetailsInput,get_third_party_job_details_input +GetThirdPartyJobDetailsOutput,get_third_party_job_details_output +GetThreatIntelSetRequest,get_threat_intel_set_request +GetThreatIntelSetResponse,get_threat_intel_set_response +GetTileInput,get_tile_input +GetTileOutput,get_tile_output +GetTimeSeriesServiceStatisticsRequest,get_time_series_service_statistics_request +GetTimeSeriesServiceStatisticsResult,get_time_series_service_statistics_result +GetTimelineEventInput,get_timeline_event_input +GetTimelineEventOutput,get_timeline_event_output +GetTokenBalanceInput,get_token_balance_input +GetTokenBalanceOutput,get_token_balance_output +GetTokenRequest,get_token_request +GetTokenResponse,get_token_response +GetTopicAttributesInput,get_topic_attributes_input +GetTopicAttributesResponse,get_topic_attributes_response +GetTopicRuleDestinationRequest,get_topic_rule_destination_request +GetTopicRuleDestinationResponse,get_topic_rule_destination_response +GetTopicRuleRequest,get_topic_rule_request +GetTopicRuleResponse,get_topic_rule_response +GetTraceGraphRequest,get_trace_graph_request +GetTraceGraphResult,get_trace_graph_result +GetTraceSummariesRequest,get_trace_summaries_request +GetTraceSummariesResult,get_trace_summaries_result +GetTrafficDistributionRequest,get_traffic_distribution_request +GetTrafficDistributionResponse,get_traffic_distribution_response +GetTrafficPolicyInstanceCountResponse,get_traffic_policy_instance_count_response +GetTrafficPolicyInstanceRequest,get_traffic_policy_instance_request +GetTrafficPolicyInstanceResponse,get_traffic_policy_instance_response +GetTrafficPolicyRequest,get_traffic_policy_request +GetTrafficPolicyResponse,get_traffic_policy_response +GetTrailRequest,get_trail_request +GetTrailResponse,get_trail_response +GetTrailStatusRequest,get_trail_status_request +GetTrailStatusResponse,get_trail_status_response +GetTransactionInput,get_transaction_input +GetTransactionOutput,get_transaction_output +GetTranscriptRequest,get_transcript_request +GetTranscriptResponse,get_transcript_response +GetTranscriptionJobRequest,get_transcription_job_request +GetTranscriptionJobResponse,get_transcription_job_response +GetTransitGatewayAttachmentPropagationsRequest,get_transit_gateway_attachment_propagations_request +GetTransitGatewayAttachmentPropagationsResult,get_transit_gateway_attachment_propagations_result +GetTransitGatewayConnectPeerAssociationsRequest,get_transit_gateway_connect_peer_associations_request +GetTransitGatewayConnectPeerAssociationsResponse,get_transit_gateway_connect_peer_associations_response +GetTransitGatewayMulticastDomainAssociationsRequest,get_transit_gateway_multicast_domain_associations_request +GetTransitGatewayMulticastDomainAssociationsResult,get_transit_gateway_multicast_domain_associations_result +GetTransitGatewayPeeringRequest,get_transit_gateway_peering_request +GetTransitGatewayPeeringResponse,get_transit_gateway_peering_response +GetTransitGatewayPolicyTableAssociationsRequest,get_transit_gateway_policy_table_associations_request +GetTransitGatewayPolicyTableAssociationsResult,get_transit_gateway_policy_table_associations_result +GetTransitGatewayPolicyTableEntriesRequest,get_transit_gateway_policy_table_entries_request +GetTransitGatewayPolicyTableEntriesResult,get_transit_gateway_policy_table_entries_result +GetTransitGatewayPrefixListReferencesRequest,get_transit_gateway_prefix_list_references_request +GetTransitGatewayPrefixListReferencesResult,get_transit_gateway_prefix_list_references_result +GetTransitGatewayRegistrationsRequest,get_transit_gateway_registrations_request +GetTransitGatewayRegistrationsResponse,get_transit_gateway_registrations_response +GetTransitGatewayRouteTableAssociationsRequest,get_transit_gateway_route_table_associations_request +GetTransitGatewayRouteTableAssociationsResult,get_transit_gateway_route_table_associations_result +GetTransitGatewayRouteTableAttachmentRequest,get_transit_gateway_route_table_attachment_request +GetTransitGatewayRouteTableAttachmentResponse,get_transit_gateway_route_table_attachment_response +GetTransitGatewayRouteTablePropagationsRequest,get_transit_gateway_route_table_propagations_request +GetTransitGatewayRouteTablePropagationsResult,get_transit_gateway_route_table_propagations_result +GetTriggerRequest,get_trigger_request +GetTriggerResponse,get_trigger_response +GetTriggersRequest,get_triggers_request +GetTriggersResponse,get_triggers_response +GetTrustStoreCertificateRequest,get_trust_store_certificate_request +GetTrustStoreCertificateResponse,get_trust_store_certificate_response +GetTrustStoreRequest,get_trust_store_request +GetTrustStoreResponse,get_trust_store_response +GetTypeRequest,get_type_request +GetTypeResponse,get_type_response +GetTypedLinkFacetInformationRequest,get_typed_link_facet_information_request +GetTypedLinkFacetInformationResponse,get_typed_link_facet_information_response +GetUICustomizationRequest,get_ui_customization_request +GetUICustomizationResponse,get_ui_customization_response +GetUnfilteredPartitionMetadataRequest,get_unfiltered_partition_metadata_request +GetUnfilteredPartitionMetadataResponse,get_unfiltered_partition_metadata_response +GetUnfilteredPartitionsMetadataRequest,get_unfiltered_partitions_metadata_request +GetUnfilteredPartitionsMetadataResponse,get_unfiltered_partitions_metadata_response +GetUnfilteredTableMetadataRequest,get_unfiltered_table_metadata_request +GetUnfilteredTableMetadataResponse,get_unfiltered_table_metadata_response +GetUpgradeHistoryRequest,get_upgrade_history_request +GetUpgradeHistoryResponse,get_upgrade_history_response +GetUpgradeStatusRequest,get_upgrade_status_request +GetUpgradeStatusResponse,get_upgrade_status_response +GetUploadRequest,get_upload_request +GetUploadResult,get_upload_result +GetUploadStatusRequest,get_upload_status_request +GetUploadStatusResponse,get_upload_status_response +GetUsageForecastRequest,get_usage_forecast_request +GetUsageForecastResponse,get_usage_forecast_response +GetUsageLimitRequest,get_usage_limit_request +GetUsageLimitResponse,get_usage_limit_response +GetUsagePlanKeyRequest,get_usage_plan_key_request +GetUsagePlanKeysRequest,get_usage_plan_keys_request +GetUsagePlanRequest,get_usage_plan_request +GetUsagePlansRequest,get_usage_plans_request +GetUsageRequest,get_usage_request +GetUsageStatisticsRequest,get_usage_statistics_request +GetUsageStatisticsResponse,get_usage_statistics_response +GetUsageTotalsRequest,get_usage_totals_request +GetUsageTotalsResponse,get_usage_totals_response +GetUserAccessLoggingSettingsRequest,get_user_access_logging_settings_request +GetUserAccessLoggingSettingsResponse,get_user_access_logging_settings_response +GetUserAttributeVerificationCodeRequest,get_user_attribute_verification_code_request +GetUserAttributeVerificationCodeResponse,get_user_attribute_verification_code_response +GetUserDefinedFunctionRequest,get_user_defined_function_request +GetUserDefinedFunctionResponse,get_user_defined_function_response +GetUserDefinedFunctionsRequest,get_user_defined_functions_request +GetUserDefinedFunctionsResponse,get_user_defined_functions_response +GetUserDetailsRequest,get_user_details_request +GetUserDetailsResponse,get_user_details_response +GetUserEndpointsRequest,get_user_endpoints_request +GetUserEndpointsResponse,get_user_endpoints_response +GetUserIdRequest,get_user_id_request +GetUserIdResponse,get_user_id_response +GetUserPolicyRequest,get_user_policy_request +GetUserPolicyResponse,get_user_policy_response +GetUserPoolMfaConfigRequest,get_user_pool_mfa_config_request +GetUserPoolMfaConfigResponse,get_user_pool_mfa_config_response +GetUserRequest,get_user_request +GetUserResponse,get_user_response +GetUserSettingsRequest,get_user_settings_request +GetUserSettingsResponse,get_user_settings_response +GetUtterancesViewRequest,get_utterances_view_request +GetUtterancesViewResponse,get_utterances_view_response +GetV2LoggingOptionsResponse,get_v2_logging_options_response +GetVPCEConfigurationRequest,get_vpce_configuration_request +GetVPCEConfigurationResult,get_vpce_configuration_result +GetVariablesRequest,get_variables_request +GetVariablesResult,get_variables_result +GetVariantImportRequest,get_variant_import_request +GetVariantImportResponse,get_variant_import_response +GetVariantStoreRequest,get_variant_store_request +GetVariantStoreResponse,get_variant_store_response +GetVaultAccessPolicyInput,get_vault_access_policy_input +GetVaultAccessPolicyOutput,get_vault_access_policy_output +GetVaultLockInput,get_vault_lock_input +GetVaultLockOutput,get_vault_lock_output +GetVaultNotificationsInput,get_vault_notifications_input +GetVaultNotificationsOutput,get_vault_notifications_output +GetVectorEnrichmentJobInput,get_vector_enrichment_job_input +GetVectorEnrichmentJobOutput,get_vector_enrichment_job_output +GetVehicleRequest,get_vehicle_request +GetVehicleResponse,get_vehicle_response +GetVehicleStatusRequest,get_vehicle_status_request +GetVehicleStatusResponse,get_vehicle_status_response +GetVerifiedAccessEndpointPolicyRequest,get_verified_access_endpoint_policy_request +GetVerifiedAccessEndpointPolicyResult,get_verified_access_endpoint_policy_result +GetVerifiedAccessGroupPolicyRequest,get_verified_access_group_policy_request +GetVerifiedAccessGroupPolicyResult,get_verified_access_group_policy_result +GetViewInput,get_view_input +GetViewOutput,get_view_output +GetViolationDetailsRequest,get_violation_details_request +GetViolationDetailsResponse,get_violation_details_response +GetVirtualMachineInput,get_virtual_machine_input +GetVirtualMachineOutput,get_virtual_machine_output +GetVocabularyFilterRequest,get_vocabulary_filter_request +GetVocabularyFilterResponse,get_vocabulary_filter_response +GetVocabularyRequest,get_vocabulary_request +GetVocabularyResponse,get_vocabulary_response +GetVoiceChannelRequest,get_voice_channel_request +GetVoiceChannelResponse,get_voice_channel_response +GetVoiceConnectorEmergencyCallingConfigurationRequest,get_voice_connector_emergency_calling_configuration_request +GetVoiceConnectorEmergencyCallingConfigurationResponse,get_voice_connector_emergency_calling_configuration_response +GetVoiceConnectorGroupRequest,get_voice_connector_group_request +GetVoiceConnectorGroupResponse,get_voice_connector_group_response +GetVoiceConnectorLoggingConfigurationRequest,get_voice_connector_logging_configuration_request +GetVoiceConnectorLoggingConfigurationResponse,get_voice_connector_logging_configuration_response +GetVoiceConnectorOriginationRequest,get_voice_connector_origination_request +GetVoiceConnectorOriginationResponse,get_voice_connector_origination_response +GetVoiceConnectorProxyRequest,get_voice_connector_proxy_request +GetVoiceConnectorProxyResponse,get_voice_connector_proxy_response +GetVoiceConnectorRequest,get_voice_connector_request +GetVoiceConnectorResponse,get_voice_connector_response +GetVoiceConnectorStreamingConfigurationRequest,get_voice_connector_streaming_configuration_request +GetVoiceConnectorStreamingConfigurationResponse,get_voice_connector_streaming_configuration_response +GetVoiceConnectorTerminationHealthRequest,get_voice_connector_termination_health_request +GetVoiceConnectorTerminationHealthResponse,get_voice_connector_termination_health_response +GetVoiceConnectorTerminationRequest,get_voice_connector_termination_request +GetVoiceConnectorTerminationResponse,get_voice_connector_termination_response +GetVoiceProfileDomainRequest,get_voice_profile_domain_request +GetVoiceProfileDomainResponse,get_voice_profile_domain_response +GetVoiceProfileRequest,get_voice_profile_request +GetVoiceProfileResponse,get_voice_profile_response +GetVoiceTemplateRequest,get_voice_template_request +GetVoiceTemplateResponse,get_voice_template_response +GetVoiceToneAnalysisTaskRequest,get_voice_tone_analysis_task_request +GetVoiceToneAnalysisTaskResponse,get_voice_tone_analysis_task_response +GetVpcAttachmentRequest,get_vpc_attachment_request +GetVpcAttachmentResponse,get_vpc_attachment_response +GetVpcLinkRequest,get_vpc_link_request +GetVpcLinkResponse,get_vpc_link_response +GetVpcLinksRequest,get_vpc_links_request +GetVpcLinksResponse,get_vpc_links_response +GetVpnConnectionDeviceSampleConfigurationRequest,get_vpn_connection_device_sample_configuration_request +GetVpnConnectionDeviceSampleConfigurationResult,get_vpn_connection_device_sample_configuration_result +GetVpnConnectionDeviceTypesRequest,get_vpn_connection_device_types_request +GetVpnConnectionDeviceTypesResult,get_vpn_connection_device_types_result +GetVpnTunnelReplacementStatusRequest,get_vpn_tunnel_replacement_status_request +GetVpnTunnelReplacementStatusResult,get_vpn_tunnel_replacement_status_result +GetWebACLForResourceRequest,get_web_acl_for_resource_request +GetWebACLForResourceResponse,get_web_acl_for_resource_response +GetWebACLRequest,get_web_acl_request +GetWebACLResponse,get_web_acl_response +GetWebhookRequest,get_webhook_request +GetWebhookResult,get_webhook_result +GetWirelessDeviceImportTaskRequest,get_wireless_device_import_task_request +GetWirelessDeviceImportTaskResponse,get_wireless_device_import_task_response +GetWirelessDeviceRequest,get_wireless_device_request +GetWirelessDeviceResponse,get_wireless_device_response +GetWirelessDeviceStatisticsRequest,get_wireless_device_statistics_request +GetWirelessDeviceStatisticsResponse,get_wireless_device_statistics_response +GetWirelessGatewayCertificateRequest,get_wireless_gateway_certificate_request +GetWirelessGatewayCertificateResponse,get_wireless_gateway_certificate_response +GetWirelessGatewayFirmwareInformationRequest,get_wireless_gateway_firmware_information_request +GetWirelessGatewayFirmwareInformationResponse,get_wireless_gateway_firmware_information_response +GetWirelessGatewayRequest,get_wireless_gateway_request +GetWirelessGatewayResponse,get_wireless_gateway_response +GetWirelessGatewayStatisticsRequest,get_wireless_gateway_statistics_request +GetWirelessGatewayStatisticsResponse,get_wireless_gateway_statistics_response +GetWirelessGatewayTaskDefinitionRequest,get_wireless_gateway_task_definition_request +GetWirelessGatewayTaskDefinitionResponse,get_wireless_gateway_task_definition_response +GetWirelessGatewayTaskRequest,get_wireless_gateway_task_request +GetWirelessGatewayTaskResponse,get_wireless_gateway_task_response +GetWorkGroupInput,get_work_group_input +GetWorkGroupOutput,get_work_group_output +GetWorkUnitResultsRequest,get_work_unit_results_request +GetWorkUnitResultsResponse,get_work_unit_results_response +GetWorkUnitsRequest,get_work_units_request +GetWorkUnitsResponse,get_work_units_response +GetWorkerFleetRequest,get_worker_fleet_request +GetWorkerFleetResponse,get_worker_fleet_response +GetWorkerRequest,get_worker_request +GetWorkerResponse,get_worker_response +GetWorkflowExecutionHistoryInput,get_workflow_execution_history_input +GetWorkflowExecutionRequest,get_workflow_execution_request +GetWorkflowExecutionResponse,get_workflow_execution_response +GetWorkflowRequest,get_workflow_request +GetWorkflowResponse,get_workflow_response +GetWorkflowRunPropertiesRequest,get_workflow_run_properties_request +GetWorkflowRunPropertiesResponse,get_workflow_run_properties_response +GetWorkflowRunRequest,get_workflow_run_request +GetWorkflowRunResponse,get_workflow_run_response +GetWorkflowRunsRequest,get_workflow_runs_request +GetWorkflowRunsResponse,get_workflow_runs_response +GetWorkflowStepExecutionRequest,get_workflow_step_execution_request +GetWorkflowStepExecutionResponse,get_workflow_step_execution_response +GetWorkflowStepGroupRequest,get_workflow_step_group_request +GetWorkflowStepGroupResponse,get_workflow_step_group_response +GetWorkflowStepRequest,get_workflow_step_request +GetWorkflowStepResponse,get_workflow_step_response +GetWorkflowStepsRequest,get_workflow_steps_request +GetWorkflowStepsResponse,get_workflow_steps_response +GetWorkgroupRequest,get_workgroup_request +GetWorkgroupResponse,get_workgroup_response +GetWorkingLocationRequest,get_working_location_request +GetWorkingLocationResponse,get_working_location_response +GetWorkloadInput,get_workload_input +GetWorkloadOutput,get_workload_output +GetWorkspaceRequest,get_workspace_request +GetWorkspaceResponse,get_workspace_response +GetWorldTemplateBodyRequest,get_world_template_body_request +GetWorldTemplateBodyResponse,get_world_template_body_response +GetXssMatchSetRequest,get_xss_match_set_request +GetXssMatchSetResponse,get_xss_match_set_response +Gid,gid +GitCloneDepth,git_clone_depth +GitConfig,git_config +GitConfigForUpdate,git_config_for_update +GitHubAccountTokenDoesNotExistException,git_hub_account_token_does_not_exist_exception +GitHubAccountTokenNameRequiredException,git_hub_account_token_name_required_exception +GitHubCodeDestination,git_hub_code_destination +GitHubCommitConfigurationFieldMappings,git_hub_commit_configuration_field_mappings +GitHubConfiguration,git_hub_configuration +GitHubDocumentCrawlProperties,git_hub_document_crawl_properties +GitHubEnterpriseServer,git_hub_enterprise_server +GitHubIssueAttachmentConfigurationFieldMappings,git_hub_issue_attachment_configuration_field_mappings +GitHubIssueCommentConfigurationFieldMappings,git_hub_issue_comment_configuration_field_mappings +GitHubIssueDocumentConfigurationFieldMappings,git_hub_issue_document_configuration_field_mappings +GitHubLocation,git_hub_location +GitHubPullRequestCommentConfigurationFieldMappings,git_hub_pull_request_comment_configuration_field_mappings +GitHubPullRequestDocumentAttachmentConfigurationFieldMappings,git_hub_pull_request_document_attachment_configuration_field_mappings +GitHubPullRequestDocumentConfigurationFieldMappings,git_hub_pull_request_document_configuration_field_mappings +GitHubRepositoryConfigurationFieldMappings,git_hub_repository_configuration_field_mappings +GitSubmodulesConfig,git_submodules_config +GivenName,given_name +GlacierJobDescription,glacier_job_description +GlacierJobParameters,glacier_job_parameters +GlacierJobTier,glacier_job_tier +Global,global +GlobalCluster,global_cluster +GlobalClusterAlreadyExistsFault,global_cluster_already_exists_fault +GlobalClusterArn,global_cluster_arn +GlobalClusterIdentifier,global_cluster_identifier +GlobalClusterMember,global_cluster_member +GlobalClusterMembers,global_cluster_members +GlobalClusterNotFoundFault,global_cluster_not_found_fault +GlobalClusterQuotaExceededFault,global_cluster_quota_exceeded_fault +GlobalClusterResourceId,global_cluster_resource_id +GlobalClusters,global_clusters +GlobalClustersMessage,global_clusters_message +GlobalConfiguration,global_configuration +GlobalEndpointTokenVersion,global_endpoint_token_version +GlobalFilters,global_filters +GlobalIdentity,global_identity +GlobalNetwork,global_network +GlobalNetworkArn,global_network_arn +GlobalNetworkId,global_network_id +GlobalNetworkIds,global_network_ids +GlobalNetworks,global_networks +GlobalNodeGroup,global_node_group +GlobalNodeGroupId,global_node_group_id +GlobalNodeGroups,global_node_groups +GlobalNodeGroupsToRemove,global_node_groups_to_remove +GlobalNodeGroupsToRetain,global_node_groups_to_retain +GlobalQuota,global_quota +GlobalReplicationGroup,global_replication_group +GlobalReplicationGroupAlreadyExistsFault,global_replication_group_already_exists_fault +GlobalReplicationGroupDescription,global_replication_group_description +GlobalReplicationGroupId,global_replication_group_id +GlobalReplicationGroupIdSuffix,global_replication_group_id_suffix +GlobalReplicationGroupInfo,global_replication_group_info +GlobalReplicationGroupMember,global_replication_group_member +GlobalReplicationGroupMemberRole,global_replication_group_member_role +GlobalReplicationGroupNotFoundFault,global_replication_group_not_found_fault +GlobalReplicationGroups,global_replication_groups +GlobalSecondaryIndex,global_secondary_index +GlobalSecondaryIndexAutoScalingUpdate,global_secondary_index_auto_scaling_update +GlobalSecondaryIndexDescription,global_secondary_index_description +GlobalSecondaryIndexInfo,global_secondary_index_info +GlobalSecondaryIndexOverride,global_secondary_index_override +GlobalSecondaryIndexUpdate,global_secondary_index_update +GlobalSecondaryIndexUpdates,global_secondary_index_updates +GlobalSecondaryIndexes,global_secondary_indexes +GlobalSettings,global_settings +GlobalSignOutRequest,global_sign_out_request +GlobalTable,global_table +GlobalTableAlreadyExistsException,global_table_already_exists_exception +GlobalTableArn,global_table_arn +GlobalTableBillingMode,global_table_billing_mode +GlobalTableBorderOptions,global_table_border_options +GlobalTableDescription,global_table_description +GlobalTableGlobalSecondaryIndexSettingsUpdate,global_table_global_secondary_index_settings_update +GlobalTableName,global_table_name +GlobalTableNotFoundException,global_table_not_found_exception +GlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate,global_table_provisioned_write_capacity_auto_scaling_settings_update +GlobalTableProvisionedWriteCapacityUnits,global_table_provisioned_write_capacity_units +GlobalTableStatus,global_table_status +GlobalTableVersion,global_table_version +GlobalTables,global_tables +GlobalTimeout,global_timeout +GlobalWriteForwardingRequested,global_write_forwarding_requested +GlobalWriteForwardingStatus,global_write_forwarding_status +GlueCatalogGeneration,glue_catalog_generation +GlueConfiguration,glue_configuration +GlueConnectionName,glue_connection_name +GlueDataCatalogConfig,glue_data_catalog_config +GlueDataCatalogConfiguration,glue_data_catalog_configuration +GlueDataCatalogConfigurationDescription,glue_data_catalog_configuration_description +GlueDataCatalogConfigurationUpdate,glue_data_catalog_configuration_update +GlueEncryptionException,glue_encryption_exception +GlueIps,glue_ips +GluePolicy,glue_policy +GlueSchema,glue_schema +GlueStudioSchemaColumn,glue_studio_schema_column +GlueTable,glue_table +GlueTableReference,glue_table_reference +GlueVersion,glue_version +Gnss,gnss +GoneException,gone_exception +Google,google +GoogleAnalytics,google_analytics +GoogleAnalyticsConnectorProfileCredentials,google_analytics_connector_profile_credentials +GoogleAnalyticsMetadata,google_analytics_metadata +GoogleAnalyticsSourceProperties,google_analytics_source_properties +GoogleDriveConfiguration,google_drive_configuration +GopBReference,gop_b_reference +GopClosedCadence,gop_closed_cadence +GopNumBFrames,gop_num_b_frames +GopSize,gop_size +GopSizeUnits,gop_size_units +GovCloudAccountId,gov_cloud_account_id +GovernedCatalogSource,governed_catalog_source +GovernedCatalogTarget,governed_catalog_target +Gpu,gpu +GpuDeviceInfo,gpu_device_info +GpuDeviceMemoryInfo,gpu_device_memory_info +GpuInfo,gpu_info +Gpus,gpus +Gradient,gradient +GradientColor,gradient_color +GradientOffset,gradient_offset +GradientStop,gradient_stop +GrammarSlotTypeSetting,grammar_slot_type_setting +GrammarSlotTypeSource,grammar_slot_type_source +Grant,grant +GrantAccessRequest,grant_access_request +GrantAccessResult,grant_access_result +GrantArn,grant_arn +GrantArns,grant_arns +GrantConstraints,grant_constraints +GrantEntitlementRequest,grant_entitlement_request +GrantFlowEntitlements420Exception,grant_flow_entitlements420_exception +GrantFlowEntitlementsRequest,grant_flow_entitlements_request +GrantFlowEntitlementsResponse,grant_flow_entitlements_response +GrantFullControl,grant_full_control +GrantId,grant_id +GrantLinkPermissions,grant_link_permissions +GrantListEntry,grant_list_entry +GrantName,grant_name +GrantPermissions,grant_permissions +GrantPermissionsRequest,grant_permissions_request +GrantPoweruserPrivileges,grant_poweruser_privileges +GrantRead,grant_read +GrantReadACP,grant_read_acp +GrantStatus,grant_status +GrantTime,grant_time +GrantToken,grant_token +GrantTokens,grant_tokens +GrantWrite,grant_write +GrantWriteACP,grant_write_acp +GrantedLicense,granted_license +GrantedOperations,granted_operations +Grantee,grantee +GranteeId,grantee_id +GranteePrincipal,grantee_principal +GranteePrincipalArn,grantee_principal_arn +GranteeType,grantee_type +Grantor,grantor +Grants,grants +Granularities,granularities +Granularity,granularity +Graph,graph +GraphArn,graph_arn +GraphArns,graph_arns +GraphList,graph_list +GraphQLRenderConfig,graph_ql_render_config +GraphQLSchemaException,graph_ql_schema_exception +GraphqlApi,graphql_api +GreKey,gre_key +GreaterThan,greater_than +GreaterThanOrEqual,greater_than_or_equal +GreaterThanOrEquals,greater_than_or_equals +Green,green +GreenFleetProvisioningOption,green_fleet_provisioning_option +GreenPrimaryX,green_primary_x +GreenPrimaryY,green_primary_y +Greengrass,greengrass +GreengrassConfiguration,greengrass_configuration +GreengrassOutputDetails,greengrass_output_details +GreengrassV2,greengrass_v2 +GremlinQueryStatus,gremlin_query_status +GremlinQueryStatusAttributes,gremlin_query_status_attributes +Grid,grid +GridLayout,grid_layout +GridLayoutCanvasSizeOptions,grid_layout_canvas_size_options +GridLayoutConfiguration,grid_layout_configuration +GridLayoutElement,grid_layout_element +GridLayoutScreenCanvasSizeOptions,grid_layout_screen_canvas_size_options +GridLineVisibility,grid_line_visibility +GridViewConfiguration,grid_view_configuration +GrokClassifier,grok_classifier +GrokPattern,grok_pattern +GroundStationData,ground_station_data +GroundTruth,ground_truth +GroundTruthManifest,ground_truth_manifest +GroundTruthS3Input,ground_truth_s3_input +Group,group +GroupARN,group_arn +GroupArn,group_arn +GroupAttributeField,group_attribute_field +GroupBy,group_by +GroupByAttribute,group_by_attribute +GroupByAttributeValue,group_by_attribute_value +GroupByKey,group_by_key +GroupCertificateAuthorities,group_certificate_authorities +GroupCertificateAuthorityArn,group_certificate_authority_arn +GroupCertificateAuthorityId,group_certificate_authority_id +GroupCertificateAuthorityProperties,group_certificate_authority_properties +GroupConfiguration,group_configuration +GroupConfigurationItem,group_configuration_item +GroupConfigurationParameter,group_configuration_parameter +GroupCount,group_count +GroupDefinition,group_definition +GroupDefinitions,group_definitions +GroupDesc,group_desc +GroupDetail,group_detail +GroupDetailList,group_detail_list +GroupDisplayName,group_display_name +GroupExistsException,group_exists_exception +GroupFiles,group_files +GroupFilter,group_filter +GroupId,group_id +GroupIdentifier,group_identifier +GroupIdentifiers,group_identifiers +GroupIdentity,group_identity +GroupIds,group_ids +GroupInformation,group_information +GroupIpAddress,group_ip_address +GroupLabelOptions,group_label_options +GroupLifecycleEventsDesiredStatus,group_lifecycle_events_desired_status +GroupLifecycleEventsStatus,group_lifecycle_events_status +GroupLifecycleEventsStatusMessage,group_lifecycle_events_status_message +GroupList,group_list +GroupMember,group_member +GroupMemberList,group_member_list +GroupMembers,group_members +GroupMembership,group_membership +GroupMembershipExistenceResult,group_membership_existence_result +GroupMemberships,group_memberships +GroupMetadata,group_metadata +GroupName,group_name +GroupNameAndArn,group_name_and_arn +GroupNameColumn,group_name_column +GroupNamePrefix,group_name_prefix +GroupNames,group_names +GroupOrderingIdSummaries,group_ordering_id_summaries +GroupOrderingIdSummary,group_ordering_id_summary +GroupOwner,group_owner +GroupOwnerId,group_owner_id +GroupOwnerSetting,group_owner_setting +GroupPermission,group_permission +GroupPolicyList,group_policy_list +GroupProperties,group_properties +GroupQuery,group_query +GroupResourcesInput,group_resources_input +GroupResourcesOutput,group_resources_output +GroupResult,group_result +GroupScore,group_score +GroupSearchFilter,group_search_filter +GroupSecurityIdentifier,group_security_identifier +GroupSize,group_size +GroupSource,group_source +GroupSummary,group_summary +GroupType,group_type +GroupVersion,group_version +GroupVersionId,group_version_id +GroupedBys,grouped_bys +GroupedResourceCount,grouped_resource_count +GroupedResourceCounts,grouped_resource_counts +GroupingAttributeNames,grouping_attribute_names +GroupingSeparator,grouping_separator +GroupingType,grouping_type +Groupings,groupings +Groups,groups +GroupsSummaries,groups_summaries +GrowthFactor,growth_factor +GrowthRate,growth_rate +GrowthRateComputation,growth_rate_computation +GrowthType,growth_type +GrpcCode,grpc_code +GrpcGatewayRoute,grpc_gateway_route +GrpcGatewayRouteAction,grpc_gateway_route_action +GrpcGatewayRouteMatch,grpc_gateway_route_match +GrpcGatewayRouteMetadata,grpc_gateway_route_metadata +GrpcGatewayRouteRewrite,grpc_gateway_route_rewrite +GrpcRetryPolicy,grpc_retry_policy +GrpcRoute,grpc_route +GrpcRouteAction,grpc_route_action +GrpcRouteMatch,grpc_route_match +GrpcRouteMetadata,grpc_route_metadata +GrpcTimeout,grpc_timeout +Gsm,gsm +GsmLocalId,gsm_local_id +GsmNmr,gsm_nmr +GsmNmrObj,gsm_nmr_obj +GsmObj,gsm_obj +GsmTimingAdvance,gsm_timing_advance +Gt,gt +Gte,gte +GuardDutyFindingId,guard_duty_finding_id +GuardianAttributes,guardian_attributes +GuardianOptions,guardian_options +GuessMIMETypeEnabled,guess_mime_type_enabled +GuestRoleArn,guest_role_arn +Guidance,guidance +Gutter,gutter +GutterSpacing,gutter_spacing +GutterStyle,gutter_style +GutterVisibility,gutter_visibility +H264ColorSpaceSettings,h264_color_space_settings +H264FilterSettings,h264_filter_settings +H264QvbrSettings,h264_qvbr_settings +H264Settings,h264_settings +H265ColorSpaceSettings,h265_color_space_settings +H265FilterSettings,h265_filter_settings +H265PackagingType,h265_packaging_type +H265QvbrSettings,h265_qvbr_settings +H265Settings,h265_settings +HECAcknowledgmentTimeoutInSeconds,hec_acknowledgment_timeout_in_seconds +HECEndpoint,hec_endpoint +HECEndpointType,hec_endpoint_type +HECToken,hec_token +HIT,hit +HITGroupId,hit_group_id +HITId,hit_id +HITLayoutId,hit_layout_id +HITLayoutParameter,hit_layout_parameter +HITLayoutParameters,hit_layout_parameters +HITReviewPolicy,hit_review_policy +HITReviewReport,hit_review_report +HITReviewStatus,hit_review_status +HITStatus,hit_status +HITTypeId,hit_type_id +HITs,hits +HLSFragmentSelector,hls_fragment_selector +HLSStreamingSessionURL,hls_streaming_session_url +HLSTimestampRange,hls_timestamp_range +HPOConfig,hpo_config +HPOObjective,hpo_objective +HPOResourceConfig,hpo_resource_config +HTTPCode4XXCount,http_code4_xx_count +HTTPCode5XXCount,http_code5_xx_count +HTTPHeader,http_header +HTTPMethod,http_method +HTTPPort,http_port +HTTPRequest,http_request +HTTPSPort,https_port +HTTPVersion,http_version +HadoopJarStep,hadoop_jar_step +HadoopJarStepConfig,hadoop_jar_step_config +HadoopStepConfig,hadoop_step_config +HadoopVersion,hadoop_version +HammingLoss,hamming_loss +HandOffTime,hand_off_time +Handler,handler +HandlerFailureException,handler_failure_exception +HandlerInternalFailureException,handler_internal_failure_exception +Handshake,handshake +HandshakeAlreadyInStateException,handshake_already_in_state_exception +HandshakeConstraintViolationException,handshake_constraint_violation_exception +HandshakeFilter,handshake_filter +HandshakeId,handshake_id +HandshakeNotFoundException,handshake_not_found_exception +HandshakeParty,handshake_party +HandshakeResource,handshake_resource +Handshakes,handshakes +HapgArn,hapg_arn +HapgList,hapg_list +HapgSerial,hapg_serial +HardExpiry,hard_expiry +HardLimit,hard_limit +HarvestJob,harvest_job +HarvestJobs,harvest_jobs +HasAdditionalSubjectAlternativeNames,has_additional_subject_alternative_names +HasAssociatedService,has_associated_service +HasCredential,has_credential +HasCustomEventSelectors,has_custom_event_selectors +HasDefaultPath,has_default_path +HasError,has_error +HasErrors,has_errors +HasFault,has_fault +HasFcmServiceCredentials,has_fcm_service_credentials +HasInsightSelectors,has_insight_selectors +HasMoreApplications,has_more_applications +HasMoreDeliveryStreams,has_more_delivery_streams +HasMoreDestinations,has_more_destinations +HasMoreShards,has_more_shards +HasMoreStreams,has_more_streams +HasMoreTags,has_more_tags +HasResultSet,has_result_set +HasThrottle,has_throttle +HasTokenKey,has_token_key +Hash,hash +HashAlgorithm,hash_algorithm +HashAlgorithmOptions,hash_algorithm_options +HashKeyRange,hash_key_range +HashType,hash_type +HbbtvCompliance,hbbtv_compliance +HdDeviceSettings,hd_device_settings +HdbVersion,hdb_version +HdfsNameNode,hdfs_name_node +Hdr10Metadata,hdr10_metadata +Hdr10Plus,hdr10_plus +Hdr10Settings,hdr10_settings +HdrToSdrToneMapper,hdr_to_sdr_tone_mapper +HeadBucketRequest,head_bucket_request +HeadObjectOutput,head_object_output +HeadObjectRequest,head_object_request +Header,header +HeaderBehavior,header_behavior +HeaderConfig,header_config +HeaderFooterSectionConfiguration,header_footer_section_configuration +HeaderList,header_list +HeaderMatch,header_match +HeaderMatchPattern,header_match_pattern +HeaderName,header_name +HeaderObject,header_object +HeaderOrder,header_order +HeaderParameters,header_parameters +HeaderRow,header_row +HeaderSections,header_sections +HeaderStyle,header_style +HeaderValue,header_value +HeaderValues,header_values +Headers,headers +HeadersConfig,headers_config +HeadersInBounceNotificationsEnabled,headers_in_bounce_notifications_enabled +HeadersInComplaintNotificationsEnabled,headers_in_complaint_notifications_enabled +HeadersInDeliveryNotificationsEnabled,headers_in_delivery_notifications_enabled +HeadersToInclude,headers_to_include +Health,health +HealthCheck,health_check +HealthCheckAlreadyExists,health_check_already_exists +HealthCheckArn,health_check_arn +HealthCheckConfig,health_check_config +HealthCheckConfiguration,health_check_configuration +HealthCheckCount,health_check_count +HealthCheckCustomConfig,health_check_custom_config +HealthCheckEnabled,health_check_enabled +HealthCheckGracePeriod,health_check_grace_period +HealthCheckGracePeriodSeconds,health_check_grace_period_seconds +HealthCheckId,health_check_id +HealthCheckIds,health_check_ids +HealthCheckInUse,health_check_in_use +HealthCheckIntervalSeconds,health_check_interval_seconds +HealthCheckObservation,health_check_observation +HealthCheckObservations,health_check_observations +HealthCheckPath,health_check_path +HealthCheckPolicy,health_check_policy +HealthCheckPort,health_check_port +HealthCheckProtocol,health_check_protocol +HealthCheckTimeoutSeconds,health_check_timeout_seconds +HealthCheckType,health_check_type +HealthCheckVersion,health_check_version +HealthCheckVersionMismatch,health_check_version_mismatch +HealthChecks,health_checks +HealthEvent,health_event +HealthEventArn,health_event_arn +HealthEventDescription,health_event_description +HealthEventTypeCategory,health_event_type_category +HealthEventTypeCode,health_event_type_code +HealthEvents,health_events +HealthEventsConfig,health_events_config +HealthReason,health_reason +HealthScoreThreshold,health_score_threshold +HealthService,health_service +HealthState,health_state +HealthStatus,health_status +HealthThreshold,health_threshold +HealthUnavailableException,health_unavailable_exception +HealthUrl,health_url +HealthyThreshold,healthy_threshold +HealthyThresholdCount,healthy_threshold_count +HeartbeatEnable,heartbeat_enable +HeartbeatEvent,heartbeat_event +HeartbeatFrequency,heartbeat_frequency +HeartbeatSchema,heartbeat_schema +HeartbeatTimeout,heartbeat_timeout +HeatMapAggregatedFieldWells,heat_map_aggregated_field_wells +HeatMapColumnItemsLimitConfiguration,heat_map_column_items_limit_configuration +HeatMapColumnSort,heat_map_column_sort +HeatMapConfiguration,heat_map_configuration +HeatMapFieldWells,heat_map_field_wells +HeatMapRowItemsLimitConfiguration,heat_map_row_items_limit_configuration +HeatMapRowSort,heat_map_row_sort +HeatMapSortConfiguration,heat_map_sort_configuration +HeatMapVisual,heat_map_visual +HeatmapColor,heatmap_color +HeatmapConfiguration,heatmap_configuration +Height,height +HeightInPx,height_in_px +HeightPixels,height_pixels +HeightTrim,height_trim +HelpfulResource,helpful_resource +HelpfulResourceDisplayText,helpful_resource_display_text +HelpfulResourceUrl,helpful_resource_url +Heterogeneous,heterogeneous +HexCode,hex_code +HexFontColor,hex_font_color +Hibernate,hibernate +HibernationOptions,hibernation_options +HibernationOptionsRequest,hibernation_options_request +HibernationSupported,hibernation_supported +HiddenColumns,hidden_columns +HiddenFromGlobalAddressList,hidden_from_global_address_list +HideDisabled,hide_disabled +HidePassword,hide_password +HierarchicalAccessControlList,hierarchical_access_control_list +HierarchicalPrincipal,hierarchical_principal +HierarchyGroup,hierarchy_group +HierarchyGroupArn,hierarchy_group_arn +HierarchyGroupCondition,hierarchy_group_condition +HierarchyGroupId,hierarchy_group_id +HierarchyGroupMatchType,hierarchy_group_match_type +HierarchyGroupSummary,hierarchy_group_summary +HierarchyGroupSummaryReference,hierarchy_group_summary_reference +HierarchyId,hierarchy_id +HierarchyLevel,hierarchy_level +HierarchyLevelLimitExceededException,hierarchy_level_limit_exceeded_exception +HierarchyLevelUpdate,hierarchy_level_update +HierarchyPath,hierarchy_path +HierarchyPathReference,hierarchy_path_reference +HierarchyStructure,hierarchy_structure +HierarchyStructureUpdate,hierarchy_structure_update +HierarchyTypeMismatchException,hierarchy_type_mismatch_exception +High,high +HighAction,high_action +HighAvailabilityConfig,high_availability_config +HighCount,high_count +HighestSeverityThreatDetails,highest_severity_threat_details +Highlight,highlight +HighlightColor,highlight_color +HighlightEnabled,highlight_enabled +Highlighted,highlighted +Highlights,highlights +HistogramAggregatedFieldWells,histogram_aggregated_field_wells +HistogramBinOptions,histogram_bin_options +HistogramConfiguration,histogram_configuration +HistogramEntry,histogram_entry +HistogramFieldWells,histogram_field_wells +HistogramVisual,histogram_visual +HistoricalDataPathList,historical_data_path_list +HistoricalMetric,historical_metric +HistoricalMetricData,historical_metric_data +HistoricalMetricResult,historical_metric_result +HistoricalMetrics,historical_metrics +HistoricalOptions,historical_options +History,history +HistoryData,history_data +HistoryEvent,history_event +HistoryEventExecutionDataDetails,history_event_execution_data_details +HistoryItemType,history_item_type +HistoryRecord,history_record +HistoryRecordEntry,history_record_entry +HistoryRecords,history_records +HistorySummary,history_summary +Hit,hit +Hits,hits +Hive,hive +HiveCompatiblePartitions,hive_compatible_partitions +HiveJsonSerDe,hive_json_ser_de +HlsAdditionalManifest,hls_additional_manifest +HlsAkamaiSettings,hls_akamai_settings +HlsBasicPutSettings,hls_basic_put_settings +HlsCaptionLanguageMapping,hls_caption_language_mapping +HlsCdnSettings,hls_cdn_settings +HlsConfiguration,hls_configuration +HlsContentProtection,hls_content_protection +HlsEncryption,hls_encryption +HlsEncryptionSettings,hls_encryption_settings +HlsGroupSettings,hls_group_settings +HlsId3SegmentTagging,hls_id3_segment_tagging +HlsId3SegmentTaggingScheduleActionSettings,hls_id3_segment_tagging_schedule_action_settings +HlsId3SegmentTaggingSettings,hls_id3_segment_tagging_settings +HlsImageBasedTrickPlaySettings,hls_image_based_trick_play_settings +HlsIngest,hls_ingest +HlsInputSettings,hls_input_settings +HlsManifest,hls_manifest +HlsManifestCreateOrUpdateParameters,hls_manifest_create_or_update_parameters +HlsManifests,hls_manifests +HlsMediaStoreSettings,hls_media_store_settings +HlsOutputSettings,hls_output_settings +HlsPackage,hls_package +HlsPlaylistSettings,hls_playlist_settings +HlsRenditionGroupSettings,hls_rendition_group_settings +HlsS3Settings,hls_s3_settings +HlsSettings,hls_settings +HlsSignaledSystemIds,hls_signaled_system_ids +HlsTimedMetadataScheduleActionSettings,hls_timed_metadata_schedule_action_settings +HlsTimedMetadataSettings,hls_timed_metadata_settings +HlsWebdavSettings,hls_webdav_settings +Holdout,holdout +HoldoutActivity,holdout_activity +HoldoutPercent,holdout_percent +HolidayConfig,holiday_config +HolidayConfigAttributes,holiday_config_attributes +HomeDirectory,home_directory +HomeDirectoryMapEntry,home_directory_map_entry +HomeDirectoryMappings,home_directory_mappings +HomeDirectoryType,home_directory_type +HomeEfsFileSystem,home_efs_file_system +HomeEfsFileSystemId,home_efs_file_system_id +HomeEfsFileSystemKmsKeyId,home_efs_file_system_kms_key_id +HomeEfsFileSystemUid,home_efs_file_system_uid +HomePageUrl,home_page_url +HomePhoneNumber,home_phone_number +HomeRegion,home_region +HomeRegionControl,home_region_control +HomeRegionControls,home_region_controls +HomeRegionNotSetException,home_region_not_set_exception +HomeRegions,home_regions +Homogeneous,homogeneous +Honeycode,honeycode +HoneycodeConnectorProfileCredentials,honeycode_connector_profile_credentials +HoneycodeDestinationProperties,honeycode_destination_properties +HoneycodeMetadata,honeycode_metadata +HonorCooldown,honor_cooldown +HonorificPrefix,honorific_prefix +HonorificSuffix,honorific_suffix +Hook,hook +HookConfiguration,hook_configuration +HookFailureMode,hook_failure_mode +HookInvocationCount,hook_invocation_count +HookInvocationPoint,hook_invocation_point +HookParameters,hook_parameters +HookStatus,hook_status +HookStatusReason,hook_status_reason +HookType,hook_type +Hooks,hooks +HopDestination,hop_destination +HopDestinations,hop_destinations +Horizontal,horizontal +HorizontalAccuracy,horizontal_accuracy +HorizontalAlign,horizontal_align +HorizontalLayoutConfiguration,horizontal_layout_configuration +HorizontalOffset,horizontal_offset +HorizontalPosition,horizontal_position +HorizontalTextAlignment,horizontal_text_alignment +Horovod,horovod +Host,host +HostAddress,host_address +HostArn,host_arn +HostArnFilter,host_arn_filter +HostEntry,host_entry +HostEnvironment,host_environment +HostEnvironmentId,host_environment_id +HostHeaderConditionConfig,host_header_condition_config +HostHeaderConfig,host_header_config +HostId,host_id +HostIdFilter,host_id_filter +HostIdSet,host_id_set +HostIds,host_ids +HostInstance,host_instance +HostInstanceType,host_instance_type +HostIp,host_ip +HostKey,host_key +HostKeyAttributes,host_key_attributes +HostKeyBody,host_key_body +HostKeyFingerprint,host_key_fingerprint +HostKeyId,host_key_id +HostKeys,host_keys +HostMaintenance,host_maintenance +HostName,host_name +HostNetwork,host_network +HostOffering,host_offering +HostPath,host_path +HostPort,host_port +HostProperties,host_properties +HostRecovery,host_recovery +HostReservation,host_reservation +HostReservationId,host_reservation_id +HostReservationIdSet,host_reservation_id_set +HostReservationSet,host_reservation_set +HostResourceGroupArn,host_resource_group_arn +HostRole,host_role +HostUrl,host_url +HostVPCId,host_vpc_id +HostVolumeProperties,host_volume_properties +HostedConfigurationVersion,hosted_configuration_version +HostedConfigurationVersionSummary,hosted_configuration_version_summary +HostedConfigurationVersions,hosted_configuration_versions +HostedZone,hosted_zone +HostedZoneAlreadyExists,hosted_zone_already_exists +HostedZoneArn,hosted_zone_arn +HostedZoneConfig,hosted_zone_config +HostedZoneCount,hosted_zone_count +HostedZoneId,hosted_zone_id +HostedZoneIdMarker,hosted_zone_id_marker +HostedZoneLimit,hosted_zone_limit +HostedZoneNotEmpty,hosted_zone_not_empty +HostedZoneNotFound,hosted_zone_not_found +HostedZoneNotPrivate,hosted_zone_not_private +HostedZoneOwner,hosted_zone_owner +HostedZonePartiallyDelegated,hosted_zone_partially_delegated +HostedZoneSummaries,hosted_zone_summaries +HostedZoneSummary,hosted_zone_summary +HostedZones,hosted_zones +Hostname,hostname +HostnameTheme,hostname_theme +HostnameType,hostname_type +Hosts,hosts +Hour,hour +HourOfDay,hour_of_day +HourlyCommitmentToPurchase,hourly_commitment_to_purchase +HourlyOnDemandRate,hourly_on_demand_rate +HourlyPrice,hourly_price +Hours,hours +HoursOfOperation,hours_of_operation +HoursOfOperationArn,hours_of_operation_arn +HoursOfOperationConfig,hours_of_operation_config +HoursOfOperationId,hours_of_operation_id +HoursOfOperationSearchCriteria,hours_of_operation_search_criteria +HoursOfOperationSearchFilter,hours_of_operation_search_filter +HoursOfOperationSummary,hours_of_operation_summary +HoursOfOperationSummaryList,hours_of_operation_summary_list +HoursOfOperationTimeSlice,hours_of_operation_time_slice +HoursOfOperations,hours_of_operations +HrAllowed,hr_allowed +HrdBufferFinalFillPercentage,hrd_buffer_final_fill_percentage +HrdBufferInitialFillPercentage,hrd_buffer_initial_fill_percentage +HrdBufferSize,hrd_buffer_size +Href,href +Hsm,hsm +HsmArn,hsm_arn +HsmCertificate,hsm_certificate +HsmClientCertificate,hsm_client_certificate +HsmClientCertificateAlreadyExistsFault,hsm_client_certificate_already_exists_fault +HsmClientCertificateIdentifier,hsm_client_certificate_identifier +HsmClientCertificateMessage,hsm_client_certificate_message +HsmClientCertificateNotFoundFault,hsm_client_certificate_not_found_fault +HsmClientCertificatePublicKey,hsm_client_certificate_public_key +HsmClientCertificateQuotaExceededFault,hsm_client_certificate_quota_exceeded_fault +HsmClientCertificates,hsm_client_certificates +HsmConfiguration,hsm_configuration +HsmConfigurationAlreadyExistsFault,hsm_configuration_already_exists_fault +HsmConfigurationIdentifier,hsm_configuration_identifier +HsmConfigurationMessage,hsm_configuration_message +HsmConfigurationNotFoundFault,hsm_configuration_not_found_fault +HsmConfigurationQuotaExceededFault,hsm_configuration_quota_exceeded_fault +HsmConfigurations,hsm_configurations +HsmId,hsm_id +HsmIpAddress,hsm_ip_address +HsmList,hsm_list +HsmPartitionName,hsm_partition_name +HsmPartitionPassword,hsm_partition_password +HsmSerialNumber,hsm_serial_number +HsmServerPublicCertificate,hsm_server_public_certificate +HsmStatus,hsm_status +HsmType,hsm_type +Hsms,hsms +HsmsLastActionFailed,hsms_last_action_failed +HsmsPendingDeletion,hsms_pending_deletion +HsmsPendingRegistration,hsms_pending_registration +HsrOperationMode,hsr_operation_mode +HsrReplicationMode,hsr_replication_mode +HsrTier,hsr_tier +Html,html +HtmlBody,html_body +HtmlMotionGraphicsSettings,html_motion_graphics_settings +HtmlPart,html_part +Http,http +HttpAction,http_action +HttpActionHeader,http_action_header +HttpAuthorization,http_authorization +HttpCode,http_code +HttpConfiguration,http_configuration +HttpContext,http_context +HttpDataSourceConfig,http_data_source_config +HttpEndpoint,http_endpoint +HttpEndpointBufferingHints,http_endpoint_buffering_hints +HttpEndpointCommonAttribute,http_endpoint_common_attribute +HttpEndpointConfiguration,http_endpoint_configuration +HttpEndpointDescription,http_endpoint_description +HttpEndpointDestinationConfiguration,http_endpoint_destination_configuration +HttpEndpointDestinationDescription,http_endpoint_destination_description +HttpEndpointDestinationUpdate,http_endpoint_destination_update +HttpEndpointEnabled,http_endpoint_enabled +HttpEndpointRequestConfiguration,http_endpoint_request_configuration +HttpEndpointRetryOptions,http_endpoint_retry_options +HttpErrorCodeReturnedEquals,http_error_code_returned_equals +HttpExpiresDate,http_expires_date +HttpFailureFeedbackRoleArn,http_failure_feedback_role_arn +HttpGatewayRoute,http_gateway_route +HttpGatewayRouteAction,http_gateway_route_action +HttpGatewayRouteHeader,http_gateway_route_header +HttpGatewayRouteMatch,http_gateway_route_match +HttpGatewayRoutePathRewrite,http_gateway_route_path_rewrite +HttpGatewayRoutePrefixRewrite,http_gateway_route_prefix_rewrite +HttpGatewayRouteRewrite,http_gateway_route_rewrite +HttpHeader,http_header +HttpHeaderConditionConfig,http_header_condition_config +HttpHeaderConfig,http_header_config +HttpHeaderName,http_header_name +HttpHeaders,http_headers +HttpInputs,http_inputs +HttpInstanceSummary,http_instance_summary +HttpMatch,http_match +HttpMethod,http_method +HttpName,http_name +HttpNamespaceChange,http_namespace_change +HttpPackageConfiguration,http_package_configuration +HttpPackageConfigurations,http_package_configurations +HttpParameters,http_parameters +HttpPathMatch,http_path_match +HttpPort,http_port +HttpProperties,http_properties +HttpProtocolIpv6,http_protocol_ipv6 +HttpPutResponseHopLimit,http_put_response_hop_limit +HttpQueryParameter,http_query_parameter +HttpRedirectCode,http_redirect_code +HttpRequestMethodConditionConfig,http_request_method_condition_config +HttpRequestMethodConfig,http_request_method_config +HttpRetryPolicy,http_retry_policy +HttpRoute,http_route +HttpRouteAction,http_route_action +HttpRouteHeader,http_route_header +HttpRouteMatch,http_route_match +HttpStatus,http_status +HttpSuccessFeedbackRoleArn,http_success_feedback_role_arn +HttpTimeout,http_timeout +HttpTokens,http_tokens +HttpTransferMode,http_transfer_mode +HttpURL,http_url +HttpUrlDestinationConfiguration,http_url_destination_configuration +HttpUrlDestinationProperties,http_url_destination_properties +HttpUrlDestinationSummary,http_url_destination_summary +HttpVersion,http_version +HttpsInputs,https_inputs +HttpsNotificationConfiguration,https_notification_configuration +HttpsPort,https_port +HubArn,hub_arn +HubContentArn,hub_content_arn +HubContentDependencies,hub_content_dependencies +HubContentDependency,hub_content_dependency +HubContentDescription,hub_content_description +HubContentDisplayName,hub_content_display_name +HubContentDocument,hub_content_document +HubContentInfo,hub_content_info +HubContentMarkdown,hub_content_markdown +HubContentName,hub_content_name +HubContentSearchKeywords,hub_content_search_keywords +HubContentStatus,hub_content_status +HubContentSummaries,hub_content_summaries +HubContentType,hub_content_type +HubContentVersion,hub_content_version +HubDescription,hub_description +HubDeviceArn,hub_device_arn +HubDisplayName,hub_display_name +HubInfo,hub_info +HubName,hub_name +HubS3StorageConfig,hub_s3_storage_config +HubSearchKeywords,hub_search_keywords +HubStatus,hub_status +HubSummaries,hub_summaries +HudiTarget,hudi_target +HudiTargets,hudi_targets +Hue,hue +HumanLabeled,human_labeled +HumanLoopActivationConditions,human_loop_activation_conditions +HumanLoopActivationConditionsConfig,human_loop_activation_conditions_config +HumanLoopActivationConditionsEvaluationResults,human_loop_activation_conditions_evaluation_results +HumanLoopActivationConfig,human_loop_activation_config +HumanLoopActivationOutput,human_loop_activation_output +HumanLoopActivationReasons,human_loop_activation_reasons +HumanLoopArn,human_loop_arn +HumanLoopConfig,human_loop_config +HumanLoopDataAttributes,human_loop_data_attributes +HumanLoopInput,human_loop_input +HumanLoopName,human_loop_name +HumanLoopOutput,human_loop_output +HumanLoopQuotaExceededException,human_loop_quota_exceeded_exception +HumanLoopRequestSource,human_loop_request_source +HumanLoopStatus,human_loop_status +HumanLoopSummaries,human_loop_summaries +HumanLoopSummary,human_loop_summary +HumanTaskConfig,human_task_config +HumanTaskUiArn,human_task_ui_arn +HumanTaskUiName,human_task_ui_name +HumanTaskUiStatus,human_task_ui_status +HumanTaskUiSummaries,human_task_ui_summaries +HumanTaskUiSummary,human_task_ui_summary +HwAddress,hw_address +HybridAccessEnabled,hybrid_access_enabled +HybridJobQueueInfo,hybrid_job_queue_info +HyperParameterAlgorithmSpecification,hyper_parameter_algorithm_specification +HyperParameterRanges,hyper_parameter_ranges +HyperParameterSpecification,hyper_parameter_specification +HyperParameterTrainingJobDefinition,hyper_parameter_training_job_definition +HyperParameterTrainingJobSummary,hyper_parameter_training_job_summary +HyperParameterTuningEndTime,hyper_parameter_tuning_end_time +HyperParameterTuningInstanceConfig,hyper_parameter_tuning_instance_config +HyperParameterTuningJob,hyper_parameter_tuning_job +HyperParameterTuningJobArn,hyper_parameter_tuning_job_arn +HyperParameterTuningJobCompletionDetails,hyper_parameter_tuning_job_completion_details +HyperParameterTuningJobConfig,hyper_parameter_tuning_job_config +HyperParameterTuningJobConsumedResources,hyper_parameter_tuning_job_consumed_resources +HyperParameterTuningJobName,hyper_parameter_tuning_job_name +HyperParameterTuningJobObjective,hyper_parameter_tuning_job_objective +HyperParameterTuningJobSearchEntity,hyper_parameter_tuning_job_search_entity +HyperParameterTuningJobStatus,hyper_parameter_tuning_job_status +HyperParameterTuningJobStrategyConfig,hyper_parameter_tuning_job_strategy_config +HyperParameterTuningJobSummaries,hyper_parameter_tuning_job_summaries +HyperParameterTuningJobSummary,hyper_parameter_tuning_job_summary +HyperParameterTuningJobWarmStartConfig,hyper_parameter_tuning_job_warm_start_config +HyperParameterTuningResourceConfig,hyper_parameter_tuning_resource_config +HyperParameters,hyper_parameters +HyperbandStrategyConfig,hyperband_strategy_config +Hypervisor,hypervisor +HypervisorArn,hypervisor_arn +HypervisorDetails,hypervisor_details +HypervisorId,hypervisor_id +Hypervisors,hypervisors +IAMAuth,iam_auth +IAMCertificateId,iam_certificate_id +IAMDatabaseAuthenticationEnabled,iam_database_authentication_enabled +IAMIdentityCenterInstanceArn,iam_identity_center_instance_arn +IAMPolicyAssignment,iam_policy_assignment +IAMPolicyAssignmentSummary,iam_policy_assignment_summary +IAMPolicyAssignments,iam_policy_assignments +IAMRoleARN,iam_role_arn +IAMRoleIdentity,iam_role_identity +IAMRoleName,iam_role_name +IAMUser,iam_user +IAMUserIdentity,iam_user_identity +IBMDb2Settings,ibm_db2_settings +ICD10CMAttribute,icd10_cm_attribute +ICD10CMConcept,icd10_cm_concept +ICD10CMConcepts,icd10_cm_concepts +ICD10CMEntity,icd10_cm_entity +ICD10CMTrait,icd10_cm_trait +ICPRecordalStatus,icp_recordal_status +ID,id +IDLE,idle +IDPCommunicationErrorException,idp_communication_error_exception +IDPRejectedClaimException,idp_rejected_claim_exception +IFrameOnlyManifest,i_frame_only_manifest +IFrameOnlyPlaylists,i_frame_only_playlists +IKEVersions,ike_versions +IKEVersionsListValue,ike_versions_list_value +IKEVersionsRequestListValue,ike_versions_request_list_value +IND,ind +INDTaxDocuments,ind_tax_documents +IOOptimizedNextAllowedModificationTime,io_optimized_next_allowed_modification_time +IOPS,iops +IOS,ios +IOUsage,io_usage +IOWait,io_wait +IP,ip +IPAddress,ip_address +IPAddressBasedRemoteInfo,ip_address_based_remote_info +IPAddressType,ip_address_type +IPAddressVersion,ip_address_version +IPDialIn,ip_dial_in +IPRange,ip_range +IPRanges,ip_ranges +IPSet,ip_set +IPSetDescriptor,ip_set_descriptor +IPSetDescriptors,ip_set_descriptors +IPSetForwardedIPConfig,ip_set_forwarded_ip_config +IPSetId,ip_set_id +IPSetMetadata,ip_set_metadata +IPSetReference,ip_set_reference +IPSetReferenceStatement,ip_set_reference_statement +IPSetReferences,ip_set_references +IPSetSummary,ip_set_summary +IPSetUpdate,ip_set_update +IPSets,ip_sets +IPV4Range,ipv4_range +IPV6Range,ipv6_range +IPv6Address,ipv6_address +IRQ,irq +Iam,iam +IamActionDefinition,iam_action_definition +IamArn,iam_arn +IamArnRequiredException,iam_arn_required_exception +IamAuthEnabled,iam_auth_enabled +IamCertificateId,iam_certificate_id +IamDatabaseAuthenticationEnabled,iam_database_authentication_enabled +IamFleetRole,iam_fleet_role +IamIdentity,iam_identity +IamInstanceProfile,iam_instance_profile +IamInstanceProfileArn,iam_instance_profile_arn +IamInstanceProfileAssociation,iam_instance_profile_association +IamInstanceProfileAssociations,iam_instance_profile_associations +IamInstanceProfileSpecification,iam_instance_profile_specification +IamRegistrationResponse,iam_registration_response +IamResources,iam_resources +IamRole,iam_role +IamRoleArn,iam_role_arn +IamRoleConfiguration,iam_role_configuration +IamRoleId,iam_role_id +IamRoleMissingPermissionsFault,iam_role_missing_permissions_fault +IamRoleName,iam_role_name +IamRoleNotFoundFault,iam_role_not_found_fault +IamRoles,iam_roles +IamSessionArnAlreadyRegisteredException,iam_session_arn_already_registered_exception +IamUser,iam_user +IamUserAccessToBilling,iam_user_access_to_billing +IamUserArn,iam_user_arn +IamUserArnAlreadyRegisteredException,iam_user_arn_already_registered_exception +IamUserArnRequiredException,iam_user_arn_required_exception +IamUserArns,iam_user_arns +IanaProtocolNumber,iana_protocol_number +IatTtL,iat_ttl +Ibm3624NaturalPin,ibm3624_natural_pin +Ibm3624PinFromOffset,ibm3624_pin_from_offset +Ibm3624PinOffset,ibm3624_pin_offset +Ibm3624PinVerification,ibm3624_pin_verification +Ibm3624RandomPin,ibm3624_random_pin +IceServer,ice_server +IceServerList,ice_server_list +IcebergInput,iceberg_input +IcebergTarget,iceberg_target +IcebergTargets,iceberg_targets +IcmpTypeCode,icmp_type_code +Icon,icon +IconDisplayOption,icon_display_option +IconOptions,icon_options +IconReference,icon_reference +IconS3Location,icon_s3_location +IconSet,icon_set +IconSetType,icon_set_type +IconURL,icon_url +IconUrl,icon_url +Id,id +Id3,id3 +Id3Insertion,id3_insertion +Id3Insertions,id3_insertions +IdAttributeName,id_attribute_name +IdFormat,id_format +IdToken,id_token +IdTokenValidity,id_token_validity +Ide,ide +IdeConfiguration,ide_configuration +IdempotencyException,idempotency_exception +IdempotencyParameterMismatchException,idempotency_parameter_mismatch_exception +IdempotencyToken,idempotency_token +IdempotentParameterMismatch,idempotent_parameter_mismatch +IdempotentParameterMismatchException,idempotent_parameter_mismatch_exception +IdentificationExpirationDate,identification_expiration_date +IdentificationHints,identification_hints +IdentificationIssuingOrg,identification_issuing_org +IdentificationNumber,identification_number +IdentifiedLanguageScore,identified_language_score +IdentifiedUserName,identified_user_name +Identifier,identifier +IdentifierPath,identifier_path +IdentifierType,identifier_type +Identifiers,identifiers +IdentifyLanguage,identify_language +IdentifyMultipleLanguages,identify_multiple_languages +Identities,identities +Identity,identity +IdentityAttributeName,identity_attribute_name +IdentityAttributeOrder,identity_attribute_order +IdentityAttributeValues,identity_attribute_values +IdentityDescription,identity_description +IdentityDkimAttributes,identity_dkim_attributes +IdentityDocument,identity_document +IdentityDocumentField,identity_document_field +IdentityDocumentFields,identity_document_fields +IdentityDocuments,identity_documents +IdentityId,identity_id +IdentityIdsToDelete,identity_ids_to_delete +IdentityInfo,identity_info +IdentityMailFromDomainAttributes,identity_mail_from_domain_attributes +IdentityManagementType,identity_management_type +IdentityName,identity_name +IdentityNotificationAttributes,identity_notification_attributes +IdentityPool,identity_pool +IdentityPoolConfigs,identity_pool_configs +IdentityPoolId,identity_pool_id +IdentityPoolName,identity_pool_name +IdentityPoolShortDescription,identity_pool_short_description +IdentityPoolTags,identity_pool_tags +IdentityPoolUsage,identity_pool_usage +IdentityPoolUsages,identity_pool_usages +IdentityPools,identity_pools +IdentityProvider,identity_provider +IdentityProviderConfig,identity_provider_config +IdentityProviderConfigResponse,identity_provider_config_response +IdentityProviderConfiguration,identity_provider_configuration +IdentityProviderDetails,identity_provider_details +IdentityProviderName,identity_provider_name +IdentityProviderOAuthSetting,identity_provider_o_auth_setting +IdentityProviderOAuthSettings,identity_provider_o_auth_settings +IdentityProviderSamlMetadata,identity_provider_saml_metadata +IdentityProviderSummaries,identity_provider_summaries +IdentityProviderSummary,identity_provider_summary +IdentityProviderType,identity_provider_type +IdentityResolutionJob,identity_resolution_job +IdentityResolutionJobsList,identity_resolution_jobs_list +IdentitySource,identity_source +IdentitySourceDetails,identity_source_details +IdentitySourceFilter,identity_source_filter +IdentitySourceItem,identity_source_item +IdentitySourceItemDetails,identity_source_item_details +IdentityStore,identity_store +IdentityStoreId,identity_store_id +IdentityType,identity_type +IdentityTypeNotSupportedException,identity_type_not_supported_exception +IdentityUsage,identity_usage +IdentityValidationExpression,identity_validation_expression +IdentityVerificationAttributes,identity_verification_attributes +Idle,idle +IdleClientTimeout,idle_client_timeout +IdleDisconnectTimeoutInSeconds,idle_disconnect_timeout_in_seconds +IdleSinceDateTime,idle_since_date_time +IdleTTL,idle_ttl +IdleTimeBetweenReadsInMs,idle_time_between_reads_in_ms +IdleTimeout,idle_timeout +IdleTimeoutSeconds,idle_timeout_seconds +IdnLangCode,idn_lang_code +Idp,idp +IdpAuthUrl,idp_auth_url +IdpIdentifier,idp_identifier +IdpIdentifiers,idp_identifiers +IdpLambdaArn,idp_lambda_arn +IdpRelayStateParameterName,idp_relay_state_parameter_name +Ids,ids +IfMatch,if_match +IfModifiedSince,if_modified_since +IfNoneMatch,if_none_match +IfUnmodifiedSince,if_unmodified_since +Igmpv2Support,igmpv2_support +IgnoreCoordinates,ignore_coordinates +IgnoreErrors,ignore_errors +IgnoreHeaderRows,ignore_header_rows +IgnoreMetricsTime,ignore_metrics_time +IgnorePollAlarmFailure,ignore_poll_alarm_failure +IgnorePublicAcls,ignore_public_acls +IgnoreUnsupportedType,ignore_unsupported_type +IkeVersions,ike_versions +IllegalActionException,illegal_action_exception +IllegalArgumentException,illegal_argument_exception +IllegalBlueprintStateException,illegal_blueprint_state_exception +IllegalDelete,illegal_delete +IllegalFieldLevelEncryptionConfigAssociationWithCacheBehavior,illegal_field_level_encryption_config_association_with_cache_behavior +IllegalOriginAccessConfiguration,illegal_origin_access_configuration +IllegalSessionStateException,illegal_session_state_exception +IllegalStatusException,illegal_status_exception +IllegalUpdate,illegal_update +IllegalUserStateException,illegal_user_state_exception +IllegalWorkflowStateException,illegal_workflow_state_exception +Image,image +ImageAggregation,image_aggregation +ImageAlreadyExistsException,image_already_exists_exception +ImageArn,image_arn +ImageAssets,image_assets +ImageAttribute,image_attribute +ImageBasedTrickPlay,image_based_trick_play +ImageBasedTrickPlaySettings,image_based_trick_play_settings +ImageBlockPublicAccessState,image_block_public_access_state +ImageBuilder,image_builder +ImageBuilderErrors,image_builder_errors +ImageBuilderName,image_builder_name +ImageBuilderStateChangeReason,image_builder_state_change_reason +ImageBuilderSupported,image_builder_supported +ImageBuilders,image_builders +ImageClassificationJobConfig,image_classification_job_config +ImageConfig,image_config +ImageConfigError,image_config_error +ImageConfigResponse,image_config_response +ImageConfiguration,image_configuration +ImageConfigurationInput,image_configuration_input +ImageContent,image_content +ImageData,image_data +ImageDescription,image_description +ImageDetail,image_detail +ImageDigest,image_digest +ImageDigestDoesNotMatchException,image_digest_does_not_match_exception +ImageDiskContainer,image_disk_container +ImageErrors,image_errors +ImageFailure,image_failure +ImageFile,image_file +ImageFrameInformation,image_frame_information +ImageGenerationConfiguration,image_generation_configuration +ImageGenerationDestinationConfig,image_generation_destination_config +ImageIconUrl,image_icon_url +ImageId,image_id +ImageIdentifier,image_identifier +ImageIds,image_ids +ImageInserter,image_inserter +ImageInserterInput,image_inserter_input +ImageLayerAggregation,image_layer_aggregation +ImageLayerAggregationResponse,image_layer_aggregation_response +ImageLocation,image_location +ImageMask,image_mask +ImageName,image_name +ImageNotFoundException,image_not_found_exception +ImageOwnerAlias,image_owner_alias +ImagePackage,image_package +ImagePermission,image_permission +ImagePermissions,image_permissions +ImagePipeline,image_pipeline +ImagePipelineAggregation,image_pipeline_aggregation +ImagePrefix,image_prefix +ImageProperties,image_properties +ImagePublishedAt,image_published_at +ImagePullCredentialsType,image_pull_credentials_type +ImageQuality,image_quality +ImageRecipe,image_recipe +ImageRecipeSummary,image_recipe_summary +ImageRecycleBinInfo,image_recycle_bin_info +ImageReplicationStatus,image_replication_status +ImageRepository,image_repository +ImageRepositoryType,image_repository_type +ImageResponseCard,image_response_card +ImageScaling,image_scaling +ImageScanFinding,image_scan_finding +ImageScanFindingAggregation,image_scan_finding_aggregation +ImageScanFindings,image_scan_findings +ImageScanFindingsFilter,image_scan_findings_filter +ImageScanFindingsSummary,image_scan_findings_summary +ImageScanState,image_scan_state +ImageScanStatus,image_scan_status +ImageScanStatuses,image_scan_statuses +ImageScanningConfiguration,image_scanning_configuration +ImageSelectorType,image_selector_type +ImageSetProperties,image_set_properties +ImageSetWorkflowStatus,image_set_workflow_status +ImageSetsMetadataSummary,image_sets_metadata_summary +ImageSmallIconUrl,image_small_icon_url +ImageSource,image_source +ImageSourceBands,image_source_bands +ImageState,image_state +ImageStateChangeReason,image_state_change_reason +ImageStats,image_stats +ImageStatus,image_status +ImageSummary,image_summary +ImageTagAlreadyExistsException,image_tag_already_exists_exception +ImageTagDetail,image_tag_detail +ImageTagMutability,image_tag_mutability +ImageTags,image_tags +ImageTestsConfiguration,image_tests_configuration +ImageTooLargeException,image_too_large_exception +ImageType,image_type +ImageUri,image_uri +ImageUrl,image_url +ImageVersion,image_version +ImageVersionArn,image_version_arn +ImageVersionNumber,image_version_number +ImageVersionStatus,image_version_status +ImageVersions,image_versions +ImageX,image_x +ImageY,image_y +Images,images +ImdsSupport,imds_support +ImmediateModeScheduleActionStartSettings,immediate_mode_schedule_action_start_settings +ImmunityTime,immunity_time +ImmunityTimeProperty,immunity_time_property +Impact,impact +ImpactEndTime,impact_end_time +ImpactLevel,impact_level +ImpactStartTime,impact_start_time +ImpactType,impact_type +ImpactedLocation,impacted_location +ImpactedLocations,impacted_locations +ImpairedSince,impaired_since +ImpersonationMatchedRule,impersonation_matched_rule +ImpersonationRole,impersonation_role +ImpersonationRoleId,impersonation_role_id +ImpersonationRoleIds,impersonation_role_ids +ImpersonationRule,impersonation_rule +ImpersonationRuleId,impersonation_rule_id +ImplicitDeny,implicit_deny +ImportApiKeysRequest,import_api_keys_request +ImportApiRequest,import_api_request +ImportApiResponse,import_api_response +ImportAppCatalogRequest,import_app_catalog_request +ImportApplicationUsageRequest,import_application_usage_request +ImportApplicationUsageResult,import_application_usage_result +ImportArn,import_arn +ImportAsProvisionedProductInput,import_as_provisioned_product_input +ImportAsProvisionedProductOutput,import_as_provisioned_product_output +ImportAssetFromApiGatewayApi,import_asset_from_api_gateway_api +ImportAssetFromApiGatewayApiRequestDetails,import_asset_from_api_gateway_api_request_details +ImportAssetFromApiGatewayApiResponseDetails,import_asset_from_api_gateway_api_response_details +ImportAssetFromSignedUrl,import_asset_from_signed_url +ImportAssetFromSignedUrlJobErrorDetails,import_asset_from_signed_url_job_error_details +ImportAssetFromSignedUrlRequestDetails,import_asset_from_signed_url_request_details +ImportAssetFromSignedUrlResponseDetails,import_asset_from_signed_url_response_details +ImportAssetsFromLakeFormationTagPolicy,import_assets_from_lake_formation_tag_policy +ImportAssetsFromLakeFormationTagPolicyRequestDetails,import_assets_from_lake_formation_tag_policy_request_details +ImportAssetsFromLakeFormationTagPolicyResponseDetails,import_assets_from_lake_formation_tag_policy_response_details +ImportAssetsFromRedshiftDataShares,import_assets_from_redshift_data_shares +ImportAssetsFromRedshiftDataSharesRequestDetails,import_assets_from_redshift_data_shares_request_details +ImportAssetsFromRedshiftDataSharesResponseDetails,import_assets_from_redshift_data_shares_response_details +ImportAssetsFromS3,import_assets_from_s3 +ImportAssetsFromS3JobErrorDetails,import_assets_from_s3_job_error_details +ImportAssetsFromS3RequestDetails,import_assets_from_s3_request_details +ImportAssetsFromS3ResponseDetails,import_assets_from_s3_response_details +ImportBackendAuthRequest,import_backend_auth_request +ImportBackendAuthResponse,import_backend_auth_response +ImportBackendStorageRequest,import_backend_storage_request +ImportBackendStorageResponse,import_backend_storage_response +ImportCatalogToGlueRequest,import_catalog_to_glue_request +ImportCertificateAuthorityCertificateRequest,import_certificate_authority_certificate_request +ImportCertificateMessage,import_certificate_message +ImportCertificateRequest,import_certificate_request +ImportCertificateResponse,import_certificate_response +ImportClientBrandingRequest,import_client_branding_request +ImportClientBrandingResult,import_client_branding_result +ImportClientVpnClientCertificateRevocationListRequest,import_client_vpn_client_certificate_revocation_list_request +ImportClientVpnClientCertificateRevocationListResult,import_client_vpn_client_certificate_revocation_list_result +ImportCompleted,import_completed +ImportComponentRequest,import_component_request +ImportComponentResponse,import_component_response +ImportConflictException,import_conflict_exception +ImportCrlRequest,import_crl_request +ImportDataSource,import_data_source +ImportDataSourceConfig,import_data_source_config +ImportDatasetRequest,import_dataset_request +ImportDatasetResponse,import_dataset_response +ImportDecoderManifestRequest,import_decoder_manifest_request +ImportDecoderManifestResponse,import_decoder_manifest_response +ImportDefinition,import_definition +ImportDestination,import_destination +ImportDestinationType,import_destination_type +ImportDocumentationPartsRequest,import_documentation_parts_request +ImportErrorData,import_error_data +ImportFailureListItem,import_failure_list_item +ImportFileTaskInformation,import_file_task_information +ImportFilter,import_filter +ImportFindingsError,import_findings_error +ImportFirewallDomainsRequest,import_firewall_domains_request +ImportFirewallDomainsResponse,import_firewall_domains_response +ImportGameConfigurationRequest,import_game_configuration_request +ImportGameConfigurationResult,import_game_configuration_result +ImportGameConfigurationSource,import_game_configuration_source +ImportHostKeyRequest,import_host_key_request +ImportHostKeyResponse,import_host_key_response +ImportHubContentRequest,import_hub_content_request +ImportHubContentResponse,import_hub_content_response +ImportHypervisorConfigurationInput,import_hypervisor_configuration_input +ImportHypervisorConfigurationOutput,import_hypervisor_configuration_output +ImportId,import_id +ImportImageLicenseConfigurationRequest,import_image_license_configuration_request +ImportImageLicenseConfigurationResponse,import_image_license_configuration_response +ImportImageRequest,import_image_request +ImportImageResult,import_image_result +ImportImageTask,import_image_task +ImportImageTasks,import_image_tasks +ImportInfo,import_info +ImportInstance,import_instance +ImportInstanceLaunchSpecification,import_instance_launch_specification +ImportInstanceRequest,import_instance_request +ImportInstanceResult,import_instance_result +ImportInstanceTaskDetails,import_instance_task_details +ImportInstanceVolumeDetailItem,import_instance_volume_detail_item +ImportJobEndTime,import_job_end_time +ImportJobProperties,import_job_properties +ImportJobPropertiesList,import_job_properties_list +ImportJobRequest,import_job_request +ImportJobResource,import_job_resource +ImportJobResponse,import_job_response +ImportJobStartTime,import_job_start_time +ImportJobSubmitter,import_job_submitter +ImportJobSummary,import_job_summary +ImportJobs,import_jobs +ImportJobsResponse,import_jobs_response +ImportKeyInput,import_key_input +ImportKeyMaterialRequest,import_key_material_request +ImportKeyOutput,import_key_output +ImportKeyPairRequest,import_key_pair_request +ImportKeyPairResult,import_key_pair_result +ImportLabelsTaskRunProperties,import_labels_task_run_properties +ImportLensInput,import_lens_input +ImportLensOutput,import_lens_output +ImportManifestUrl,import_manifest_url +ImportMigrationTaskRequest,import_migration_task_request +ImportMode,import_mode +ImportModelRequest,import_model_request +ImportModelResponse,import_model_response +ImportModelVersionRequest,import_model_version_request +ImportModelVersionResponse,import_model_version_response +ImportNotFoundException,import_not_found_exception +ImportNotebookInput,import_notebook_input +ImportNotebookOutput,import_notebook_output +ImportOptions,import_options +ImportPath,import_path +ImportPlaybackKeyPairRequest,import_playback_key_pair_request +ImportPlaybackKeyPairResponse,import_playback_key_pair_response +ImportReadSetFilter,import_read_set_filter +ImportReadSetJobItem,import_read_set_job_item +ImportReadSetSourceItem,import_read_set_source_item +ImportReferenceFilter,import_reference_filter +ImportReferenceJobItem,import_reference_job_item +ImportReferenceSourceItem,import_reference_source_item +ImportResourceSpecification,import_resource_specification +ImportResourcesToDraftAppVersionRequest,import_resources_to_draft_app_version_request +ImportResourcesToDraftAppVersionResponse,import_resources_to_draft_app_version_response +ImportRestApiRequest,import_rest_api_request +ImportSignalCatalogRequest,import_signal_catalog_request +ImportSignalCatalogResponse,import_signal_catalog_response +ImportSnapshotRequest,import_snapshot_request +ImportSnapshotResult,import_snapshot_result +ImportSnapshotTask,import_snapshot_task +ImportSnapshotTasks,import_snapshot_tasks +ImportSortBy,import_sort_by +ImportSource,import_source +ImportSourceCredentialsInput,import_source_credentials_input +ImportSourceCredentialsOutput,import_source_credentials_output +ImportSshPublicKeyRequest,import_ssh_public_key_request +ImportSshPublicKeyResponse,import_ssh_public_key_response +ImportStacksToStackSetInput,import_stacks_to_stack_set_input +ImportStacksToStackSetOutput,import_stacks_to_stack_set_output +ImportStatistics,import_statistics +ImportStatus,import_status +ImportSummary,import_summary +ImportSummaryList,import_summary_list +ImportTableDescription,import_table_description +ImportTableInput,import_table_input +ImportTableOutput,import_table_output +ImportTablesCompleted,import_tables_completed +ImportTablesInProgress,import_tables_in_progress +ImportTablesNotStarted,import_tables_not_started +ImportTask,import_task +ImportTaskError,import_task_error +ImportTaskFilter,import_task_filter +ImportTaskId,import_task_id +ImportTaskIds,import_task_ids +ImportTaskSummary,import_task_summary +ImportTaskSummaryApplications,import_task_summary_applications +ImportTaskSummaryServers,import_task_summary_servers +ImportTaskSummaryWaves,import_task_summary_waves +ImportTerminologyRequest,import_terminology_request +ImportTerminologyResponse,import_terminology_response +ImportTime,import_time +ImportToken,import_token +ImportTr31KeyBlock,import_tr31_key_block +ImportTr34KeyBlock,import_tr34_key_block +ImportVmImageRequest,import_vm_image_request +ImportVmImageResponse,import_vm_image_response +ImportVolume,import_volume +ImportVolumeRequest,import_volume_request +ImportVolumeResult,import_volume_result +ImportVolumeTaskDetails,import_volume_task_details +ImportWorkspaceImageRequest,import_workspace_image_request +ImportWorkspaceImageResult,import_workspace_image_result +Importance,importance +Imported,imported +ImportedAt,imported_at +ImportedBy,imported_by +ImportedDataSize,imported_data_size +ImportedDataSizeInBytes,imported_data_size_in_bytes +ImportedFileChunkSize,imported_file_chunk_size +ImportedItemCount,imported_item_count +ImportedRecordCount,imported_record_count +ImportedSidewalkDevice,imported_sidewalk_device +ImportedUsers,imported_users +ImportedWirelessDevice,imported_wireless_device +ImportedWirelessDeviceList,imported_wireless_device_list +Imports,imports +ImportsListItem,imports_list_item +ImprovementPlan,improvement_plan +ImprovementPlanUrl,improvement_plan_url +ImprovementPlans,improvement_plans +ImprovementStatus,improvement_status +ImprovementSummaries,improvement_summaries +ImprovementSummary,improvement_summary +ImputedPath,imputed_path +ImscDestinationSettings,imsc_destination_settings +InAppCampaignSchedule,in_app_campaign_schedule +InAppMessage,in_app_message +InAppMessageBodyConfig,in_app_message_body_config +InAppMessageButton,in_app_message_button +InAppMessageCampaign,in_app_message_campaign +InAppMessageCampaigns,in_app_message_campaigns +InAppMessageContent,in_app_message_content +InAppMessageHeaderConfig,in_app_message_header_config +InAppMessagesResponse,in_app_messages_response +InAppStreamNames,in_app_stream_names +InAppTemplate,in_app_template +InAppTemplateRequest,in_app_template_request +InAppTemplateResponse,in_app_template_response +InCluster,in_cluster +InProgress,in_progress +InProgressInvalidationBatches,in_progress_invalidation_batches +InProgressStackInstancesCount,in_progress_stack_instances_count +InProgressTableRestoreQuotaExceededFault,in_progress_table_restore_quota_exceeded_fault +InSyncStackInstancesCount,in_sync_stack_instances_count +InTransitEncryption,in_transit_encryption +InUse,in_use +InUseBy,in_use_by +InaccessibleEncryptionDateTime,inaccessible_encryption_date_time +InaccessibleKmsKeyDateTime,inaccessible_kms_key_date_time +InactiveDate,inactive_date +InactiveEventDataStoreException,inactive_event_data_store_exception +InactiveQueryException,inactive_query_exception +InboundCall,inbound_call +InboundCalling,inbound_calling +InboundCallsEnabled,inbound_calls_enabled +InboundConnection,inbound_connection +InboundConnectionStatus,inbound_connection_status +InboundCrossClusterSearchConnection,inbound_cross_cluster_search_connection +InboundCrossClusterSearchConnectionStatus,inbound_cross_cluster_search_connection_status +InboundHeader,inbound_header +InboundMMS,inbound_mms +InboundPermissionAuthorizations,inbound_permission_authorizations +InboundPermissionRevocations,inbound_permission_revocations +InboundPermissions,inbound_permissions +InboundSMS,inbound_sms +InboundShipment,inbound_shipment +InboxCount,inbox_count +InboxPercentage,inbox_percentage +InboxPlacementTrackingOption,inbox_placement_tracking_option +InboxRawCount,inbox_raw_count +IncidentId,incident_id +IncidentRecord,incident_record +IncidentRecordSource,incident_record_source +IncidentRecordSummary,incident_record_summary +IncidentTemplate,incident_template +Include,include +IncludeAdditionalDetails,include_additional_details +IncludeAdditionalLanguageCodes,include_additional_language_codes +IncludeAll,include_all +IncludeAllDependencies,include_all_dependencies +IncludeAllInstances,include_all_instances +IncludeAllLinksToEachParent,include_all_links_to_each_parent +IncludeAllTagsOfInstance,include_all_tags_of_instance +IncludeAttachmentFilePatterns,include_attachment_file_patterns +IncludeBlueprint,include_blueprint +IncludeBody,include_body +IncludeChannelId,include_channel_id +IncludeChildPaths,include_child_paths +IncludeComplianceDetails,include_compliance_details +IncludeControlDetails,include_control_details +IncludeCookies,include_cookies +IncludeCredit,include_credit +IncludeCustomMetadata,include_custom_metadata +IncludeDeleted,include_deleted +IncludeDeletedGroups,include_deleted_groups +IncludeDeletedRecords,include_deleted_records +IncludeDeprecated,include_deprecated +IncludeDiscount,include_discount +IncludeDvbSubtitles,include_dvb_subtitles +IncludeEdges,include_edges +IncludeEncoderConfigurationInSegments,include_encoder_configuration_in_segments +IncludeExecutionData,include_execution_data +IncludeExtensions,include_extensions +IncludeFec,include_fec +IncludeFillerNalUnits,include_filler_nal_units +IncludeFilterTypes,include_filter_types +IncludeFilters,include_filters +IncludeFutureRegions,include_future_regions +IncludeGlobalServiceEvents,include_global_service_events +IncludeGraph,include_graph +IncludeHeaders,include_headers +IncludeHidden,include_hidden +IncludeIframeOnlyStream,include_iframe_only_stream +IncludeIframeOnlyStreams,include_iframe_only_streams +IncludeIndirectActivities,include_indirect_activities +IncludeInferenceResponseIn,include_inference_response_in +IncludeLegGeometry,include_leg_geometry +IncludeLinkedAccounts,include_linked_accounts +IncludeLinkedAccountsMetrics,include_linked_accounts_metrics +IncludeManagementEvents,include_management_events +IncludeMap,include_map +IncludeMarketplace,include_marketplace +IncludeMaximum,include_maximum +IncludeMetrics,include_metrics +IncludeMinimum,include_minimum +IncludeNestedStacks,include_nested_stacks +IncludeNotScaledActivities,include_not_scaled_activities +IncludeNullAndEmpty,include_null_and_empty +IncludeNullValue,include_null_value +IncludeOnly,include_only +IncludeOpForFullLoad,include_op_for_full_load +IncludeOtherSubscription,include_other_subscription +IncludeParameterSpec,include_parameter_spec +IncludePartitionValue,include_partition_value +IncludePlannedDeletion,include_planned_deletion +IncludeProvisioningArtifactParameters,include_provisioning_artifact_parameters +IncludePublic,include_public +IncludePublicKey,include_public_key +IncludeQueriesWithoutUserInformation,include_queries_without_user_information +IncludeQuerySpellCheckSuggestions,include_query_spell_check_suggestions +IncludeRecurring,include_recurring +IncludeRefund,include_refund +IncludeRelated,include_related +IncludeReturnPath,include_return_path +IncludeShared,include_shared +IncludeSharedResources,include_shared_resources +IncludeSpace,include_space +IncludeSpaces,include_spaces +IncludeStatus,include_status +IncludeSubdomains,include_subdomains +IncludeSubscription,include_subscription +IncludeSupport,include_support +IncludeSymmetricAlgorithms,include_symmetric_algorithms +IncludeTableAlterOperations,include_table_alter_operations +IncludeTax,include_tax +IncludeTransactionDetails,include_transaction_details +IncludeTrustContext,include_trust_context +IncludeUpfront,include_upfront +IncludedAllocatedStorage,included_allocated_storage +IncludedCookies,included_cookies +IncludedDeletedBackTo,included_deleted_back_to +IncludedHeaders,included_headers +IncludedObjectVersions,included_object_versions +IncludedPages,included_pages +IncludedPaths,included_paths +IncludedProperties,included_properties +IncludedProperty,included_property +IncludedStates,included_states +IncludedStatistics,included_statistics +Includes,includes +InclusionFileNamePatterns,inclusion_file_name_patterns +InclusionFileTypePatterns,inclusion_file_type_patterns +InclusionFilters,inclusion_filters +InclusionFolderNamePatterns,inclusion_folder_name_patterns +InclusionPatterns,inclusion_patterns +InclusionPrefixes,inclusion_prefixes +InclusionProtectionFilters,inclusion_protection_filters +InclusionProtectionGroupFilters,inclusion_protection_group_filters +Inclusive,inclusive +InclusiveStartBillingPeriod,inclusive_start_billing_period +InclusiveStartTime,inclusive_start_time +IncomingDukptAttributes,incoming_dukpt_attributes +IncomingEncryptionAttributes,incoming_encryption_attributes +IncomingKeyIdentifier,incoming_key_identifier +IncomingTranslationAttributes,incoming_translation_attributes +IncompatibilityMessage,incompatibility_message +IncompatibleImageException,incompatible_image_exception +IncompatibleOrderableOptions,incompatible_orderable_options +IncompatibleParameterError,incompatible_parameter_error +IncompatiblePolicyException,incompatible_policy_exception +IncompatibleProtocolsException,incompatible_protocols_exception +IncompatibleRegionForMultiAZ,incompatible_region_for_multi_az +IncompatibleSchemaException,incompatible_schema_exception +IncompatibleSettingsException,incompatible_settings_exception +IncompatibleVersion,incompatible_version +IncompatibleVersionException,incompatible_version_exception +IncompleteSegmentBehavior,incomplete_segment_behavior +InconsistentQuantities,inconsistent_quantities +IncorrectCidrStateException,incorrect_cidr_state_exception +IncorrectFileSystemLifeCycleState,incorrect_file_system_life_cycle_state +IncorrectKeyException,incorrect_key_exception +IncorrectKeyMaterialException,incorrect_key_material_exception +IncorrectMountTargetState,incorrect_mount_target_state +IncorrectTrustAnchorException,incorrect_trust_anchor_exception +IncreaseNodeGroupsInGlobalReplicationGroupMessage,increase_node_groups_in_global_replication_group_message +IncreaseNodeGroupsInGlobalReplicationGroupResult,increase_node_groups_in_global_replication_group_result +IncreaseReplicaCountMessage,increase_replica_count_message +IncreaseReplicaCountResult,increase_replica_count_result +IncreaseReplicationFactorRequest,increase_replication_factor_request +IncreaseReplicationFactorResponse,increase_replication_factor_response +IncreaseStreamRetentionPeriodInput,increase_stream_retention_period_input +IncreaseVolumeSize,increase_volume_size +IncrementalExportSpecification,incremental_export_specification +IncrementalPullConfig,incremental_pull_config +IncrementalRefresh,incremental_refresh +IncrementalRunConfig,incremental_run_config +Index,index +IndexArn,index_arn +IndexAttachment,index_attachment +IndexAttachments,index_attachments +IndexConfigurationSummary,index_configuration_summary +IndexConfigurationSummaryItems,index_configuration_summary_items +IndexDocument,index_document +IndexDocumentSuffix,index_document_suffix +IndexDocumentsRequest,index_documents_request +IndexDocumentsResponse,index_documents_response +IndexFacesModelVersion,index_faces_model_version +IndexFacesRequest,index_faces_request +IndexFacesResponse,index_faces_response +IndexField,index_field +IndexFieldName,index_field_name +IndexFieldStatus,index_field_status +IndexFieldType,index_field_type +IndexFields,index_fields +IndexId,index_id +IndexNSegments,index_n_segments +IndexName,index_name +IndexNotFoundException,index_not_found_exception +IndexNotReadyException,index_not_ready_exception +IndexReference,index_reference +IndexRotationPeriod,index_rotation_period +IndexSizeBytes,index_size_bytes +IndexSlowLogs,index_slow_logs +IndexStatistics,index_statistics +IndexStatus,index_status +IndexedAttributeMissingException,indexed_attribute_missing_exception +IndexedAttributes,indexed_attributes +IndexedQuestionAnswersCount,indexed_question_answers_count +IndexedTextBytes,indexed_text_bytes +IndexedTextDocumentsCount,indexed_text_documents_count +Indexes,indexes +IndexingFilter,indexing_filter +IndividualAssessmentCompletedCount,individual_assessment_completed_count +IndividualAssessmentCount,individual_assessment_count +IndividualAssessmentName,individual_assessment_name +IndividualAssessmentNames,individual_assessment_names +Industry,industry +IndustryType,industry_type +InferICD10CMRequest,infer_icd10_cm_request +InferICD10CMResponse,infer_icd10_cm_response +InferRxNormRequest,infer_rx_norm_request +InferRxNormResponse,infer_rx_norm_response +InferSNOMEDCTRequest,infer_snomedct_request +InferSNOMEDCTResponse,infer_snomedct_response +InferenceAccelerator,inference_accelerator +InferenceAcceleratorInfo,inference_accelerator_info +InferenceAcceleratorOverride,inference_accelerator_override +InferenceAcceleratorOverrides,inference_accelerator_overrides +InferenceAccelerators,inference_accelerators +InferenceAttribute,inference_attribute +InferenceBenchmark,inference_benchmark +InferenceConfig,inference_config +InferenceContainerDefinitions,inference_container_definitions +InferenceContainers,inference_containers +InferenceDataImportStrategy,inference_data_import_strategy +InferenceDeviceInfo,inference_device_info +InferenceDeviceMemoryInfo,inference_device_memory_info +InferenceEventSummaries,inference_event_summaries +InferenceEventSummary,inference_event_summary +InferenceExecutionConfig,inference_execution_config +InferenceExecutionSummaries,inference_execution_summaries +InferenceExecutionSummary,inference_execution_summary +InferenceExperimentArn,inference_experiment_arn +InferenceExperimentDataStorageConfig,inference_experiment_data_storage_config +InferenceExperimentSchedule,inference_experiment_schedule +InferenceExperimentSummary,inference_experiment_summary +InferenceExperiments,inference_experiments +InferenceId,inference_id +InferenceImage,inference_image +InferenceInputConfiguration,inference_input_configuration +InferenceInputNameConfiguration,inference_input_name_configuration +InferenceMetrics,inference_metrics +InferenceOutputConfiguration,inference_output_configuration +InferenceRecommendation,inference_recommendation +InferenceRecommendations,inference_recommendations +InferenceRecommendationsJob,inference_recommendations_job +InferenceRecommendationsJobName,inference_recommendations_job_name +InferenceRecommendationsJobStep,inference_recommendations_job_step +InferenceRecommendationsJobs,inference_recommendations_jobs +InferenceS3InputConfiguration,inference_s3_input_configuration +InferenceS3OutputConfiguration,inference_s3_output_configuration +InferenceSchedulerArn,inference_scheduler_arn +InferenceSchedulerName,inference_scheduler_name +InferenceSchedulerNameBeginsWith,inference_scheduler_name_begins_with +InferenceSchedulerSummaries,inference_scheduler_summaries +InferenceSchedulerSummary,inference_scheduler_summary +InferenceSpecification,inference_specification +InferenceSpecificationName,inference_specification_name +Inferred,inferred +InferredWorkloadSaving,inferred_workload_saving +Info,info +InfoIconLabelOptions,info_icon_label_options +InfoIconText,info_icon_text +InfoType,info_type +InforNexus,infor_nexus +InforNexusConnectorProfileCredentials,infor_nexus_connector_profile_credentials +InforNexusConnectorProfileProperties,infor_nexus_connector_profile_properties +InforNexusSourceProperties,infor_nexus_source_properties +InformationalCount,informational_count +InfrastructureClass,infrastructure_class +InfrastructureConfig,infrastructure_config +InfrastructureConfiguration,infrastructure_configuration +InfrastructureConfigurationSummary,infrastructure_configuration_summary +InfrastructureType,infrastructure_type +IngestConfiguration,ingest_configuration +IngestEndpoint,ingest_endpoint +IngestEndpointId,ingest_endpoint_id +IngestEndpointUrls,ingest_endpoint_urls +IngestEndpoints,ingest_endpoints +IngestIp,ingest_ip +IngestPort,ingest_port +IngestedDataSize,ingested_data_size +IngestedEventStatistics,ingested_event_statistics +IngestedEventsDetail,ingested_events_detail +IngestedEventsTimeWindow,ingested_events_time_window +IngestedFilesSummary,ingested_files_summary +IngestedNumberOfFiles,ingested_number_of_files +Ingestion,ingestion +IngestionArn,ingestion_arn +IngestionDestination,ingestion_destination +IngestionDestinationSummary,ingestion_destination_summary +IngestionId,ingestion_id +IngestionInputConfiguration,ingestion_input_configuration +IngestionJobId,ingestion_job_id +IngestionProcess,ingestion_process +IngestionS3InputConfiguration,ingestion_s3_input_configuration +IngestionSizeInBytes,ingestion_size_in_bytes +IngestionStatus,ingestion_status +IngestionSummary,ingestion_summary +IngestionTimeInSeconds,ingestion_time_in_seconds +IngestionType,ingestion_type +Ingestions,ingestions +Ingress,ingress +IngressAccessLogs,ingress_access_logs +IngressBytes,ingress_bytes +IngressConfiguration,ingress_configuration +IngressFilterRules,ingress_filter_rules +IngressGatewayBridge,ingress_gateway_bridge +IngressPackets,ingress_packets +IngressPortMappings,ingress_port_mappings +IngressRouteTable,ingress_route_table +IngressVpcConfiguration,ingress_vpc_configuration +InheritedValue,inherited_value +InitProcessEnabled,init_process_enabled +InitQuery,init_query +InitialActiveLearningModelArn,initial_active_learning_model_arn +InitialAudioGain,initial_audio_gain +InitialCapacityConfig,initial_capacity_config +InitialClusterSize,initial_cluster_size +InitialConfigurationToken,initial_configuration_token +InitialContactId,initial_contact_id +InitialDashboardId,initial_dashboard_id +InitialDashboardVisualId,initial_dashboard_visual_id +InitialFileLocation,initial_file_location +InitialInstanceCount,initial_instance_count +InitialMessage,initial_message +InitialNumberOfUsers,initial_number_of_users +InitialPath,initial_path +InitialPosition,initial_position +InitialResponseSetting,initial_response_setting +InitialSamplingPercentage,initial_sampling_percentage +InitialTopicId,initial_topic_id +InitialVariantWeight,initial_variant_weight +InitialVersion,initial_version +InitializationConfiguration,initialization_configuration +InitializationVector,initialization_vector +InitializationVectorInManifest,initialization_vector_in_manifest +InitializeClusterRequest,initialize_cluster_request +InitializeClusterResponse,initialize_cluster_response +InitializedImportedDeviceCount,initialized_imported_device_count +Initials,initials +InitiateAuthRequest,initiate_auth_request +InitiateAuthResponse,initiate_auth_response +InitiateDeletionTimestamp,initiate_deletion_timestamp +InitiateDeviceClaimRequest,initiate_device_claim_request +InitiateDeviceClaimResponse,initiate_device_claim_response +InitiateDocumentVersionUploadRequest,initiate_document_version_upload_request +InitiateDocumentVersionUploadResponse,initiate_document_version_upload_response +InitiateJobInput,initiate_job_input +InitiateJobOutput,initiate_job_output +InitiateLayerUploadRequest,initiate_layer_upload_request +InitiateLayerUploadResponse,initiate_layer_upload_response +InitiateMultipartUploadInput,initiate_multipart_upload_input +InitiateMultipartUploadOutput,initiate_multipart_upload_output +InitiateVaultLockInput,initiate_vault_lock_input +InitiateVaultLockOutput,initiate_vault_lock_output +Initiated,initiated +InitiatedBy,initiated_by +InitiationMethod,initiation_method +InitiationTimestamp,initiation_timestamp +Initiator,initiator +InitiatorName,initiator_name +Initiators,initiators +InlineArchiveRule,inline_archive_rule +InlineChunk,inline_chunk +InlineChunkChecksum,inline_chunk_checksum +InlineChunkChecksumAlgorithm,inline_chunk_checksum_algorithm +InlineChunkLength,inline_chunk_length +InlineConfigurations,inline_configurations +InlineCustomDocumentEnrichmentConfiguration,inline_custom_document_enrichment_configuration +InlineDataSchema,inline_data_schema +InlinePolicy,inline_policy +InnerHorizontal,inner_horizontal +InnerVertical,inner_vertical +Input,input +InputArtifact,input_artifact +InputArtifacts,input_artifacts +InputArtifactsToRemove,input_artifacts_to_remove +InputAttachment,input_attachment +InputAttachmentName,input_attachment_name +InputAttachmentNameReference,input_attachment_name_reference +InputAttachments,input_attachments +InputAttributes,input_attributes +InputBucket,input_bucket +InputBytes,input_bytes +InputCaptions,input_captions +InputChannel,input_channel +InputChannelLevel,input_channel_level +InputChannelLevels,input_channel_levels +InputChannels,input_channels +InputChannelsFineTune,input_channels_fine_tune +InputClass,input_class +InputClipping,input_clipping +InputClippingSettings,input_clipping_settings +InputClippings,input_clippings +InputColumn,input_column +InputColumns,input_columns +InputCompressionType,input_compression_type +InputConfig,input_config +InputConfigInput,input_config_input +InputConfigOutput,input_config_output +InputConfiguration,input_configuration +InputConfigurationRequest,input_configuration_request +InputConfigurations,input_configurations +InputContent,input_content +InputContext,input_context +InputDataConfig,input_data_config +InputDataLocationS3,input_data_location_s3 +InputDecryptionSettings,input_decryption_settings +InputDefinition,input_definition +InputDescription,input_description +InputDescriptions,input_descriptions +InputDestination,input_destination +InputDestinationRequest,input_destination_request +InputDestinationVpc,input_destination_vpc +InputDeviceConfigurableSettings,input_device_configurable_settings +InputDeviceHdSettings,input_device_hd_settings +InputDeviceId,input_device_id +InputDeviceMediaConnectConfigurableSettings,input_device_media_connect_configurable_settings +InputDeviceMediaConnectSettings,input_device_media_connect_settings +InputDeviceNetworkSettings,input_device_network_settings +InputDeviceRequest,input_device_request +InputDeviceSettings,input_device_settings +InputDeviceSummary,input_device_summary +InputDeviceTransfers,input_device_transfers +InputDeviceUhdSettings,input_device_uhd_settings +InputDevices,input_devices +InputDocumentsCount,input_documents_count +InputEndAction,input_end_action +InputFileConfig,input_file_config +InputFileLocation,input_file_location +InputFileUri,input_file_uri +InputFilter,input_filter +InputFormat,input_format +InputFormatConfiguration,input_format_configuration +InputFormatOptions,input_format_options +InputId,input_id +InputIdentifier,input_identifier +InputIds,input_ids +InputIp,input_ip +InputKey,input_key +InputLambdaProcessor,input_lambda_processor +InputLambdaProcessorDescription,input_lambda_processor_description +InputLambdaProcessorUpdate,input_lambda_processor_update +InputLocation,input_location +InputLogEvent,input_log_event +InputLossAction,input_loss_action +InputLossBehavior,input_loss_behavior +InputLossFailoverSettings,input_loss_failover_settings +InputLossImageColor,input_loss_image_color +InputLossImageSlate,input_loss_image_slate +InputLossImageType,input_loss_image_type +InputLossSettings,input_loss_settings +InputLossThresholdMsec,input_loss_threshold_msec +InputMode,input_mode +InputName,input_name +InputOrigin,input_origin +InputParallelism,input_parallelism +InputParallelismUpdate,input_parallelism_update +InputParameters,input_parameters +InputPartnerIds,input_partner_ids +InputPath,input_path +InputPathsMap,input_paths_map +InputPort,input_port +InputPreference,input_preference +InputPrepareScheduleActionSettings,input_prepare_schedule_action_settings +InputPrepareScheduleActions,input_prepare_schedule_actions +InputPrepareSettings,input_prepare_settings +InputProcessingConfiguration,input_processing_configuration +InputProcessingConfigurationDescription,input_processing_configuration_description +InputProcessingConfigurationUpdate,input_processing_configuration_update +InputRecordTables,input_record_tables +InputRows,input_rows +InputS3Object,input_s3_object +InputS3Path,input_s3_path +InputScanType,input_scan_type +InputSchema,input_schema +InputSchemaUpdate,input_schema_update +InputSecurityGroup,input_security_group +InputSecurityGroupId,input_security_group_id +InputSecurityGroupIds,input_security_group_ids +InputSecurityGroups,input_security_groups +InputSerialization,input_serialization +InputSessionStateSpecification,input_session_state_specification +InputSettings,input_settings +InputSource,input_source +InputSourceRequest,input_source_request +InputSourceType,input_source_type +InputSpecification,input_specification +InputStartingPosition,input_starting_position +InputStartingPositionConfiguration,input_starting_position_configuration +InputStorageLocation,input_storage_location +InputSummary,input_summary +InputSwitchScheduleActionSettings,input_switch_schedule_action_settings +InputSwitchSettings,input_switch_settings +InputTemplate,input_template +InputTimeZoneOffset,input_time_zone_offset +InputTimecodeSource,input_timecode_source +InputTransformer,input_transformer +InputType,input_type +InputUpdate,input_update +InputUpdates,input_updates +InputVideoGenerator,input_video_generator +InputVpcRequest,input_vpc_request +InputWhitelistRule,input_whitelist_rule +InputWhitelistRuleCidr,input_whitelist_rule_cidr +Inputs,inputs +InsecureSsl,insecure_ssl +InsertHeaders,insert_headers +InsertableImage,insertable_image +InsertableImages,insertable_images +InsertionMode,insertion_mode +Inserts,inserts +InsideCidrBlocks,inside_cidr_blocks +Insight,insight +InsightArn,insight_arn +InsightArns,insight_arns +InsightConfiguration,insight_configuration +InsightData,insight_data +InsightEvent,insight_event +InsightEvents,insight_events +InsightFeedback,insight_feedback +InsightHealth,insight_health +InsightId,insight_id +InsightImpactGraphEdge,insight_impact_graph_edge +InsightImpactGraphService,insight_impact_graph_service +InsightNotEnabledException,insight_not_enabled_exception +InsightResultValue,insight_result_value +InsightResults,insight_results +InsightRule,insight_rule +InsightRuleContributor,insight_rule_contributor +InsightRuleContributorDatapoint,insight_rule_contributor_datapoint +InsightRuleMetricDatapoint,insight_rule_metric_datapoint +InsightRules,insight_rules +InsightSelector,insight_selector +InsightSelectors,insight_selectors +InsightSummaries,insight_summaries +InsightSummary,insight_summary +InsightTimeRange,insight_time_range +InsightType,insight_type +InsightVisual,insight_visual +Insights,insights +InsightsByAssessment,insights_by_assessment +InsightsConfiguration,insights_configuration +InsightsEnabled,insights_enabled +InsightsEvent,insights_event +InsightsTarget,insights_target +InspectionLevel,inspection_level +InspectorScoreDetails,inspector_score_details +InspectorServiceAttributes,inspector_service_attributes +InstallOverrideList,install_override_list +InstallToRemoteAccessSessionRequest,install_to_remote_access_session_request +InstallToRemoteAccessSessionResult,install_to_remote_access_session_result +InstallUpdatesOnBoot,install_updates_on_boot +InstalledComponent,installed_component +InstalledCount,installed_count +InstalledOtherCount,installed_other_count +InstalledPendingReboot,installed_pending_reboot +InstalledPendingRebootCount,installed_pending_reboot_count +InstalledRejectedCount,installed_rejected_count +InstalledTime,installed_time +Instance,instance +InstanceAccess,instance_access +InstanceAccessControlAttributeConfiguration,instance_access_control_attribute_configuration +InstanceAccessDetails,instance_access_details +InstanceAccessUrl,instance_access_url +InstanceAggregatedAssociationOverview,instance_aggregated_association_overview +InstanceAlias,instance_alias +InstanceArn,instance_arn +InstanceAssociation,instance_association +InstanceAssociationOutputLocation,instance_association_output_location +InstanceAssociationOutputUrl,instance_association_output_url +InstanceAssociationStatusAggregatedCount,instance_association_status_aggregated_count +InstanceAssociationStatusInfo,instance_association_status_info +InstanceAssociationStatusInfos,instance_association_status_infos +InstanceAttribute,instance_attribute +InstanceBlockDeviceMapping,instance_block_device_mapping +InstanceBlockDeviceMappingSpecification,instance_block_device_mapping_specification +InstanceCapacity,instance_capacity +InstanceClass,instance_class +InstanceCollectionType,instance_collection_type +InstanceConfig,instance_config +InstanceConfigs,instance_configs +InstanceConfiguration,instance_configuration +InstanceConnectEndpoint,instance_connect_endpoint +InstanceConnectEndpointArn,instance_connect_endpoint_arn +InstanceConnectEndpointId,instance_connect_endpoint_id +InstanceConnectEndpointIds,instance_connect_endpoint_ids +InstanceConnectEndpoints,instance_connect_endpoints +InstanceCount,instance_count +InstanceCountLimits,instance_count_limits +InstanceCounts,instance_counts +InstanceCreateTime,instance_create_time +InstanceCredentials,instance_credentials +InstanceCreditSpecification,instance_credit_specification +InstanceCreditSpecificationRequest,instance_credit_specification_request +InstanceCreditSpecifications,instance_credit_specifications +InstanceDefinition,instance_definition +InstanceDefinitions,instance_definitions +InstanceDetails,instance_details +InstanceDoesNotExistException,instance_does_not_exist_exception +InstanceEntry,instance_entry +InstanceEventId,instance_event_id +InstanceEventWindow,instance_event_window +InstanceEventWindowAssociationRequest,instance_event_window_association_request +InstanceEventWindowAssociationTarget,instance_event_window_association_target +InstanceEventWindowDisassociationRequest,instance_event_window_disassociation_request +InstanceEventWindowId,instance_event_window_id +InstanceEventWindowIds,instance_event_window_ids +InstanceEventWindowState,instance_event_window_state +InstanceEventWindowStateChange,instance_event_window_state_change +InstanceEventWindowTimeRange,instance_event_window_time_range +InstanceEventWindowTimeRangeRequest,instance_event_window_time_range_request +InstanceEventWindows,instance_event_windows +InstanceExportDetails,instance_export_details +InstanceFamilies,instance_families +InstanceFamily,instance_family +InstanceFamilyCreditSpecification,instance_family_credit_specification +InstanceFamilyId,instance_family_id +InstanceFleet,instance_fleet +InstanceFleetConfig,instance_fleet_config +InstanceFleetId,instance_fleet_id +InstanceFleetModifyConfig,instance_fleet_modify_config +InstanceFleetProvisioningSpecifications,instance_fleet_provisioning_specifications +InstanceFleetResizingSpecifications,instance_fleet_resizing_specifications +InstanceFleetStateChangeReason,instance_fleet_state_change_reason +InstanceFleetStatus,instance_fleet_status +InstanceFleetTimeline,instance_fleet_timeline +InstanceFleetType,instance_fleet_type +InstanceFleets,instance_fleets +InstanceGenerations,instance_generations +InstanceGroup,instance_group +InstanceGroupConfig,instance_group_config +InstanceGroupDetail,instance_group_detail +InstanceGroupId,instance_group_id +InstanceGroupIds,instance_group_ids +InstanceGroupModifyConfig,instance_group_modify_config +InstanceGroupName,instance_group_name +InstanceGroupNames,instance_group_names +InstanceGroupStateChangeReason,instance_group_state_change_reason +InstanceGroupStatus,instance_group_status +InstanceGroupTimeline,instance_group_timeline +InstanceGroupType,instance_group_type +InstanceGroupTypes,instance_group_types +InstanceGroups,instance_groups +InstanceHardware,instance_hardware +InstanceHealth,instance_health +InstanceHealthCheckResult,instance_health_check_result +InstanceHealthList,instance_health_list +InstanceHealthSummary,instance_health_summary +InstanceID,instance_id +InstanceId,instance_id +InstanceIdDetail,instance_id_detail +InstanceIdFilter,instance_id_filter +InstanceIdRequiredException,instance_id_required_exception +InstanceIdSet,instance_id_set +InstanceIdentifier,instance_identifier +InstanceIdentity,instance_identity +InstanceIds,instance_ids +InstanceInfo,instance_info +InstanceInformation,instance_information +InstanceInformationFilter,instance_information_filter +InstanceInformationFilterList,instance_information_filter_list +InstanceInformationList,instance_information_list +InstanceInformationStringFilter,instance_information_string_filter +InstanceInitiatedShutdownBehavior,instance_initiated_shutdown_behavior +InstanceInterruptionBehavior,instance_interruption_behavior +InstanceIpv4Prefix,instance_ipv4_prefix +InstanceIpv6Address,instance_ipv6_address +InstanceIpv6AddressRequest,instance_ipv6_address_request +InstanceIpv6Prefix,instance_ipv6_prefix +InstanceLifecycle,instance_lifecycle +InstanceLimit,instance_limit +InstanceLimitExceededException,instance_limit_exceeded_exception +InstanceLimits,instance_limits +InstanceMaintenanceOptions,instance_maintenance_options +InstanceMaintenanceOptionsRequest,instance_maintenance_options_request +InstanceMarketOptions,instance_market_options +InstanceMarketOptionsRequest,instance_market_options_request +InstanceMatchCriteria,instance_match_criteria +InstanceMemory,instance_memory +InstanceMessages,instance_messages +InstanceMetadata,instance_metadata +InstanceMetadataOptions,instance_metadata_options +InstanceMetadataOptionsRequest,instance_metadata_options_request +InstanceMetadataOptionsResponse,instance_metadata_options_response +InstanceMetadataServiceConfiguration,instance_metadata_service_configuration +InstanceMetadataTags,instance_metadata_tags +InstanceMonitoring,instance_monitoring +InstanceMonitorings,instance_monitorings +InstanceName,instance_name +InstanceNameAlreadyRegisteredException,instance_name_already_registered_exception +InstanceNameRequiredException,instance_name_required_exception +InstanceNetworkInterface,instance_network_interface +InstanceNetworkInterfaceAssociation,instance_network_interface_association +InstanceNetworkInterfaceAttachment,instance_network_interface_attachment +InstanceNetworkInterfaceSpecification,instance_network_interface_specification +InstanceNetworking,instance_networking +InstanceNotFound,instance_not_found +InstanceNotRegisteredException,instance_not_registered_exception +InstanceOSUser,instance_os_user +InstanceOnboardingJobStatus,instance_onboarding_job_status +InstanceOwnerId,instance_owner_id +InstancePatchState,instance_patch_state +InstancePatchStateFilter,instance_patch_state_filter +InstancePatchStates,instance_patch_states +InstancePlatform,instance_platform +InstancePoolsToUseCount,instance_pools_to_use_count +InstancePort,instance_port +InstancePortInfo,instance_port_info +InstancePortState,instance_port_state +InstancePrivateIpAddress,instance_private_ip_address +InstanceProfile,instance_profile +InstanceProfileArn,instance_profile_arn +InstanceProfileCreationTime,instance_profile_creation_time +InstanceProfileId,instance_profile_id +InstanceProfileIdentifier,instance_profile_identifier +InstanceProfileList,instance_profile_list +InstanceProfileName,instance_profile_name +InstanceProfiles,instance_profiles +InstanceProperty,instance_property +InstanceProtocol,instance_protocol +InstanceQuotaExceededFault,instance_quota_exceeded_fault +InstanceRecommendation,instance_recommendation +InstanceRecommendationOption,instance_recommendation_option +InstanceRefresh,instance_refresh +InstanceRefreshId,instance_refresh_id +InstanceRefreshIds,instance_refresh_ids +InstanceRefreshInProgressFault,instance_refresh_in_progress_fault +InstanceRefreshLivePoolProgress,instance_refresh_live_pool_progress +InstanceRefreshProgressDetails,instance_refresh_progress_details +InstanceRefreshWarmPoolProgress,instance_refresh_warm_pool_progress +InstanceRefreshes,instance_refreshes +InstanceRequestCount,instance_request_count +InstanceRequirements,instance_requirements +InstanceRequirementsRequest,instance_requirements_request +InstanceRequirementsWithMetadata,instance_requirements_with_metadata +InstanceRequirementsWithMetadataRequest,instance_requirements_with_metadata_request +InstanceResizePolicy,instance_resize_policy +InstanceReusePolicy,instance_reuse_policy +InstanceRole,instance_role +InstanceRoleArn,instance_role_arn +InstanceRunningCount,instance_running_count +InstanceSize,instance_size +InstanceSizingType,instance_sizing_type +InstanceSnapshot,instance_snapshot +InstanceSnapshotInfo,instance_snapshot_info +InstanceSpecification,instance_specification +InstanceState,instance_state +InstanceStateChange,instance_state_change +InstanceStateChangeReason,instance_state_change_reason +InstanceStates,instance_states +InstanceStatus,instance_status +InstanceStatusDetails,instance_status_details +InstanceStatusEvent,instance_status_event +InstanceStatusReason,instance_status_reason +InstanceStatusSummary,instance_status_summary +InstanceStatuses,instance_statuses +InstanceStorageConfig,instance_storage_config +InstanceStorageInfo,instance_storage_info +InstanceStorageSupported,instance_storage_supported +InstanceSummaries,instance_summaries +InstanceSummary,instance_summary +InstanceSummaryList,instance_summary_list +InstanceTagAttribute,instance_tag_attribute +InstanceTagKeys,instance_tag_keys +InstanceTagNotificationAttribute,instance_tag_notification_attribute +InstanceTags,instance_tags +InstanceTarget,instance_target +InstanceTenancy,instance_tenancy +InstanceTerminationTimeout,instance_termination_timeout +InstanceTimeline,instance_timeline +InstanceType,instance_type +InstanceTypeConfig,instance_type_config +InstanceTypeConfigs,instance_type_configs +InstanceTypeDetails,instance_type_details +InstanceTypeInfo,instance_type_info +InstanceTypeInfoFromInstanceRequirements,instance_type_info_from_instance_requirements +InstanceTypeItem,instance_type_item +InstanceTypeOffering,instance_type_offering +InstanceTypeOfferings,instance_type_offerings +InstanceTypeSpecification,instance_type_specification +InstanceTypeSpecifications,instance_type_specifications +InstanceTypes,instance_types +InstanceUsage,instance_usage +InstanceUsages,instance_usages +InstanceUserSummaries,instance_user_summaries +InstanceUserSummary,instance_user_summary +InstanceVcpu,instance_vcpu +InstanceWarmup,instance_warmup +Instances,instances +InstancesCount,instances_count +InstancesDistribution,instances_distribution +InstancesHealth,instances_health +InstancesRevision,instances_revision +InstancesToProtect,instances_to_protect +InstancesToTerminate,instances_to_terminate +InstancesToUpdate,instances_to_update +InstancesToUpdateOnRollback,instances_to_update_on_rollback +InstancesWithCriticalNonCompliantPatches,instances_with_critical_non_compliant_patches +InstancesWithFailedPatches,instances_with_failed_patches +InstancesWithInstalledOtherPatches,instances_with_installed_other_patches +InstancesWithInstalledPatches,instances_with_installed_patches +InstancesWithInstalledPendingRebootPatches,instances_with_installed_pending_reboot_patches +InstancesWithInstalledRejectedPatches,instances_with_installed_rejected_patches +InstancesWithMissingPatches,instances_with_missing_patches +InstancesWithNotApplicablePatches,instances_with_not_applicable_patches +InstancesWithOtherNonCompliantPatches,instances_with_other_non_compliant_patches +InstancesWithSecurityNonCompliantPatches,instances_with_security_non_compliant_patches +InstancesWithUnreportedNotApplicablePatches,instances_with_unreported_not_applicable_patches +InstantBooking,instant_booking +InstantiateSolNetworkInstanceInput,instantiate_sol_network_instance_input +InstantiateSolNetworkInstanceOutput,instantiate_sol_network_instance_output +Instructions,instructions +InsufficientAvailableIPsInSubnetFault,insufficient_available_ips_in_subnet_fault +InsufficientCacheClusterCapacityFault,insufficient_cache_cluster_capacity_fault +InsufficientCapabilitiesException,insufficient_capabilities_exception +InsufficientCapacityException,insufficient_capacity_exception +InsufficientCloudWatchLogsResourcePolicy,insufficient_cloud_watch_logs_resource_policy +InsufficientClusterCapacityFault,insufficient_cluster_capacity_fault +InsufficientDBClusterCapacityFault,insufficient_db_cluster_capacity_fault +InsufficientDBInstanceCapacityFault,insufficient_db_instance_capacity_fault +InsufficientDataActions,insufficient_data_actions +InsufficientDataHealthStatus,insufficient_data_health_status +InsufficientDeliveryPolicyException,insufficient_delivery_policy_exception +InsufficientDependencyServiceAccessPermissionException,insufficient_dependency_service_access_permission_exception +InsufficientEncryptionPolicyException,insufficient_encryption_policy_exception +InsufficientPermissionsException,insufficient_permissions_exception +InsufficientPrivilegesException,insufficient_privileges_exception +InsufficientResourceCapacityFault,insufficient_resource_capacity_fault +InsufficientS3BucketPolicyException,insufficient_s3_bucket_policy_exception +InsufficientS3BucketPolicyFault,insufficient_s3_bucket_policy_fault +InsufficientSensorData,insufficient_sensor_data +InsufficientSnsTopicPolicyException,insufficient_sns_topic_policy_exception +InsufficientStorageClusterCapacityFault,insufficient_storage_cluster_capacity_fault +InsufficientThroughputCapacity,insufficient_throughput_capacity +IntArrayOptions,int_array_options +IntOptions,int_options +IntValueMax,int_value_max +IntValueMin,int_value_min +IntegerDatasetParameter,integer_dataset_parameter +IntegerDatasetParameterDefaultValues,integer_dataset_parameter_default_values +IntegerDefaultValues,integer_default_values +IntegerHyperParameterRange,integer_hyper_parameter_range +IntegerParameter,integer_parameter +IntegerParameterDeclaration,integer_parameter_declaration +IntegerParameterRange,integer_parameter_range +IntegerParameterRangeSpecification,integer_parameter_range_specification +IntegerParameterRanges,integer_parameter_ranges +IntegerParameters,integer_parameters +IntegerRange,integer_range +IntegerStaticValues,integer_static_values +IntegerValue,integer_value +IntegerValueWhenUnsetConfiguration,integer_value_when_unset_configuration +IntegerValues,integer_values +IntegrateServices,integrate_services +Integration,integration +IntegrationArn,integration_arn +IntegrationAssociationArn,integration_association_arn +IntegrationAssociationId,integration_association_id +IntegrationAssociationSummary,integration_association_summary +IntegrationAssociationSummaryList,integration_association_summary_list +IntegrationConfig,integration_config +IntegrationId,integration_id +IntegrationMethod,integration_method +IntegrationResponse,integration_response +IntegrationResponseId,integration_response_id +IntegrationResponseKey,integration_response_key +IntegrationResponseSelectionExpression,integration_response_selection_expression +IntegrationResultS3DestinationArn,integration_result_s3_destination_arn +IntegrationSubtype,integration_subtype +IntegrationType,integration_type +IntegrationTypes,integration_types +IntegrationUri,integration_uri +Integrations,integrations +IntelligentTieringAndOperator,intelligent_tiering_and_operator +IntelligentTieringConfiguration,intelligent_tiering_configuration +IntelligentTieringConfigurationList,intelligent_tiering_configuration_list +IntelligentTieringFilter,intelligent_tiering_filter +IntendedUse,intended_use +Intent,intent +IntentClassificationTestResultItem,intent_classification_test_result_item +IntentClassificationTestResultItemCounts,intent_classification_test_result_item_counts +IntentClassificationTestResults,intent_classification_test_results +IntentClosingSetting,intent_closing_setting +IntentConfidence,intent_confidence +IntentConfirmationSetting,intent_confirmation_setting +IntentFilter,intent_filter +IntentLevelSlotResolutionTestResultItem,intent_level_slot_resolution_test_result_item +IntentLevelSlotResolutionTestResults,intent_level_slot_resolution_test_results +IntentMetadata,intent_metadata +IntentOverride,intent_override +IntentResultEvent,intent_result_event +IntentSortBy,intent_sort_by +IntentStatistics,intent_statistics +IntentSummary,intent_summary +InterMetricImpactDetails,inter_metric_impact_details +InterMetricImpactList,inter_metric_impact_list +Interactive,interactive +InteractiveLayoutConfiguration,interactive_layout_configuration +Intercluster,intercluster +Interconnect,interconnect +Interconnects,interconnects +Interface,interface +InterfaceAssociation,interface_association +InterfaceAssociations,interface_associations +InterfacePermission,interface_permission +InterfaceProtocol,interface_protocol +InterfaceRequest,interface_request +InterfaceType,interface_type +InterlaceMode,interlace_mode +Interlaced,interlaced +InternalDependencyException,internal_dependency_exception +InternalError,internal_error +InternalErrorException,internal_error_exception +InternalException,internal_exception +InternalFailure,internal_failure +InternalFailureException,internal_failure_exception +InternalServerError,internal_server_error +InternalServerErrorException,internal_server_error_exception +InternalServerException,internal_server_exception +InternalServiceError,internal_service_error +InternalServiceErrorException,internal_service_error_exception +InternalServiceException,internal_service_exception +InternalServiceFault,internal_service_fault +InternalStreamFailure,internal_stream_failure +InternalUserDatabaseEnabled,internal_user_database_enabled +InternetGateway,internet_gateway +InternetGatewayAttachment,internet_gateway_attachment +InternetGatewayId,internet_gateway_id +InternetGatewayIds,internet_gateway_ids +InternetGatewayRoutes,internet_gateway_routes +InternetGateways,internet_gateways +InternetHealth,internet_health +InternetKeyExchangeVersion,internet_key_exchange_version +InternetMeasurementsLogDelivery,internet_measurements_log_delivery +InteroperabilityEnabled,interoperability_enabled +Interpolated,interpolated +InterpolatedAssetPropertyValue,interpolated_asset_property_value +InterpolationParameters,interpolation_parameters +InterpolationValue,interpolation_value +Interpretation,interpretation +InterruptionFilter,interruption_filter +Interval,interval +IntervalCadence,interval_cadence +IntervalEndTime,interval_end_time +IntervalInSeconds,interval_in_seconds +IntervalStartTime,interval_start_time +IntervalUnit,interval_unit +IntraDcPrecision,intra_dc_precision +InvalidACLStateFault,invalid_acl_state_fault +InvalidARNFault,invalid_arn_fault +InvalidAccessException,invalid_access_exception +InvalidAccountStatusException,invalid_account_status_exception +InvalidActionDeclarationException,invalid_action_declaration_exception +InvalidActivation,invalid_activation +InvalidActivationId,invalid_activation_id +InvalidActorArnException,invalid_actor_arn_exception +InvalidAddressException,invalid_address_exception +InvalidAggregationException,invalid_aggregation_exception +InvalidAggregatorException,invalid_aggregator_exception +InvalidAlarmConfigException,invalid_alarm_config_exception +InvalidAliasNameException,invalid_alias_name_exception +InvalidAllowedPatternException,invalid_allowed_pattern_exception +InvalidApplicationConfigurationException,invalid_application_configuration_exception +InvalidApplicationNameException,invalid_application_name_exception +InvalidApprovalRuleContentException,invalid_approval_rule_content_exception +InvalidApprovalRuleNameException,invalid_approval_rule_name_exception +InvalidApprovalRuleTemplateContentException,invalid_approval_rule_template_content_exception +InvalidApprovalRuleTemplateDescriptionException,invalid_approval_rule_template_description_exception +InvalidApprovalRuleTemplateNameException,invalid_approval_rule_template_name_exception +InvalidApprovalStateException,invalid_approval_state_exception +InvalidApprovalTokenException,invalid_approval_token_exception +InvalidArgsException,invalid_args_exception +InvalidArgument,invalid_argument +InvalidArgumentException,invalid_argument_exception +InvalidArn,invalid_arn +InvalidArnException,invalid_arn_exception +InvalidAssociation,invalid_association +InvalidAssociationVersion,invalid_association_version +InvalidAttachmentException,invalid_attachment_exception +InvalidAuthenticationCodeException,invalid_authentication_code_exception +InvalidAuthenticationProfileRequestFault,invalid_authentication_profile_request_fault +InvalidAuthorArnException,invalid_author_arn_exception +InvalidAuthorizationMessageException,invalid_authorization_message_exception +InvalidAuthorizationStateFault,invalid_authorization_state_fault +InvalidAutoRollbackConfigException,invalid_auto_rollback_config_exception +InvalidAutoScalingGroupException,invalid_auto_scaling_group_exception +InvalidAutomationExecutionParametersException,invalid_automation_execution_parameters_exception +InvalidAutomationSignalException,invalid_automation_signal_exception +InvalidAutomationStatusUpdateException,invalid_automation_status_update_exception +InvalidBatchEntryIdException,invalid_batch_entry_id_exception +InvalidBlobIdException,invalid_blob_id_exception +InvalidBlockerDeclarationException,invalid_blocker_declaration_exception +InvalidBlueGreenDeploymentConfigurationException,invalid_blue_green_deployment_configuration_exception +InvalidBlueGreenDeploymentStateFault,invalid_blue_green_deployment_state_fault +InvalidBranchNameException,invalid_branch_name_exception +InvalidBucketNameFilterException,invalid_bucket_name_filter_exception +InvalidCacheClusterStateFault,invalid_cache_cluster_state_fault +InvalidCacheParameterGroupStateFault,invalid_cache_parameter_group_state_fault +InvalidCacheSecurityGroupStateFault,invalid_cache_security_group_state_fault +InvalidCampaignStateException,invalid_campaign_state_exception +InvalidCertificateAuthorityException,invalid_certificate_authority_exception +InvalidCertificateException,invalid_certificate_exception +InvalidCertificateFault,invalid_certificate_fault +InvalidChangeBatch,invalid_change_batch +InvalidChangeSetStatusException,invalid_change_set_status_exception +InvalidChannelARN,invalid_channel_arn +InvalidCiphertextException,invalid_ciphertext_exception +InvalidClientAuthStatusException,invalid_client_auth_status_exception +InvalidClientException,invalid_client_exception +InvalidClientMetadataException,invalid_client_metadata_exception +InvalidClientRequestTokenException,invalid_client_request_token_exception +InvalidClientTokenException,invalid_client_token_exception +InvalidCloudWatchDestinationException,invalid_cloud_watch_destination_exception +InvalidCloudWatchLogsLogGroupArnException,invalid_cloud_watch_logs_log_group_arn_exception +InvalidCloudWatchLogsRoleArnException,invalid_cloud_watch_logs_role_arn_exception +InvalidClusterParameterGroupStateFault,invalid_cluster_parameter_group_state_fault +InvalidClusterSecurityGroupStateFault,invalid_cluster_security_group_state_fault +InvalidClusterSnapshotScheduleStateFault,invalid_cluster_snapshot_schedule_state_fault +InvalidClusterSnapshotStateFault,invalid_cluster_snapshot_state_fault +InvalidClusterStateFault,invalid_cluster_state_fault +InvalidClusterSubnetGroupStateFault,invalid_cluster_subnet_group_state_fault +InvalidClusterSubnetStateFault,invalid_cluster_subnet_state_fault +InvalidClusterTrackFault,invalid_cluster_track_fault +InvalidCodeSignatureException,invalid_code_signature_exception +InvalidCodecPrivateDataException,invalid_codec_private_data_exception +InvalidCommentIdException,invalid_comment_id_exception +InvalidCommentOperationException,invalid_comment_operation_exception +InvalidCommitException,invalid_commit_exception +InvalidCommitIdException,invalid_commit_id_exception +InvalidComputePlatformException,invalid_compute_platform_exception +InvalidConfigurationDetail,invalid_configuration_detail +InvalidConfigurationException,invalid_configuration_exception +InvalidConfigurationRecorderNameException,invalid_configuration_recorder_name_exception +InvalidConfigurationRequestException,invalid_configuration_request_exception +InvalidConfigurationSetException,invalid_configuration_set_exception +InvalidConflictDetailLevelException,invalid_conflict_detail_level_exception +InvalidConflictResolutionException,invalid_conflict_resolution_exception +InvalidConflictResolutionStrategyException,invalid_conflict_resolution_strategy_exception +InvalidContactFlowException,invalid_contact_flow_exception +InvalidContactFlowModuleException,invalid_contact_flow_module_exception +InvalidContentLocation,invalid_content_location +InvalidContinuationTokenException,invalid_continuation_token_exception +InvalidCredentialsException,invalid_credentials_exception +InvalidCrossAccountRoleException,invalid_cross_account_role_exception +InvalidCustomDBEngineVersionStateFault,invalid_custom_db_engine_version_state_fault +InvalidCustomSesConfigurationException,invalid_custom_ses_configuration_exception +InvalidCustomerIdentifierException,invalid_customer_identifier_exception +InvalidDBClusterAutomatedBackupStateFault,invalid_db_cluster_automated_backup_state_fault +InvalidDBClusterCapacityFault,invalid_db_cluster_capacity_fault +InvalidDBClusterEndpointStateFault,invalid_db_cluster_endpoint_state_fault +InvalidDBClusterSnapshotStateFault,invalid_db_cluster_snapshot_state_fault +InvalidDBClusterStateFault,invalid_db_cluster_state_fault +InvalidDBInstanceAutomatedBackupStateFault,invalid_db_instance_automated_backup_state_fault +InvalidDBInstanceStateFault,invalid_db_instance_state_fault +InvalidDBParameterGroupStateFault,invalid_db_parameter_group_state_fault +InvalidDBProxyEndpointStateFault,invalid_db_proxy_endpoint_state_fault +InvalidDBProxyStateFault,invalid_db_proxy_state_fault +InvalidDBSecurityGroupStateFault,invalid_db_security_group_state_fault +InvalidDBSnapshotStateFault,invalid_db_snapshot_state_fault +InvalidDBSubnetGroupFault,invalid_db_subnet_group_fault +InvalidDBSubnetGroupStateFault,invalid_db_subnet_group_state_fault +InvalidDBSubnetStateFault,invalid_db_subnet_state_fault +InvalidDataRepositoryType,invalid_data_repository_type +InvalidDataShareFault,invalid_data_share_fault +InvalidDateEntries,invalid_date_entries +InvalidDateRangeException,invalid_date_range_exception +InvalidDefaultRootObject,invalid_default_root_object +InvalidDefinition,invalid_definition +InvalidDeleteInventoryParametersException,invalid_delete_inventory_parameters_exception +InvalidDeletionIdException,invalid_deletion_id_exception +InvalidDeletionParameterException,invalid_deletion_parameter_exception +InvalidDeliveryChannelNameException,invalid_delivery_channel_name_exception +InvalidDeliveryOptionsException,invalid_delivery_options_exception +InvalidDeployedStateFilterException,invalid_deployed_state_filter_exception +InvalidDeploymentConfigNameException,invalid_deployment_config_name_exception +InvalidDeploymentGroupNameException,invalid_deployment_group_name_exception +InvalidDeploymentIdException,invalid_deployment_id_exception +InvalidDeploymentInstanceTypeException,invalid_deployment_instance_type_exception +InvalidDeploymentStatusException,invalid_deployment_status_exception +InvalidDeploymentStyleException,invalid_deployment_style_exception +InvalidDeploymentTargetIdException,invalid_deployment_target_id_exception +InvalidDeploymentWaitTypeException,invalid_deployment_wait_type_exception +InvalidDescriptionException,invalid_description_exception +InvalidDestinationCommitSpecifierException,invalid_destination_commit_specifier_exception +InvalidDestinationKmsKey,invalid_destination_kms_key +InvalidDeviceException,invalid_device_exception +InvalidDocument,invalid_document +InvalidDocumentContent,invalid_document_content +InvalidDocumentOperation,invalid_document_operation +InvalidDocumentSchemaVersion,invalid_document_schema_version +InvalidDocumentType,invalid_document_type +InvalidDocumentVersion,invalid_document_version +InvalidDomainName,invalid_domain_name +InvalidDomainNameForOriginAccessControl,invalid_domain_name_for_origin_access_control +InvalidDomainValidationOptionsException,invalid_domain_validation_options_exception +InvalidEC2TagCombinationException,invalid_ec2_tag_combination_exception +InvalidEC2TagException,invalid_ec2_tag_exception +InvalidECSServiceException,invalid_ecs_service_exception +InvalidElasticIpFault,invalid_elastic_ip_fault +InvalidEmailException,invalid_email_exception +InvalidEmailRoleAccessPolicyException,invalid_email_role_access_policy_exception +InvalidEncodingException,invalid_encoding_exception +InvalidEndPointException,invalid_end_point_exception +InvalidEndpointException,invalid_endpoint_exception +InvalidEndpointRegionException,invalid_endpoint_region_exception +InvalidEndpointStateFault,invalid_endpoint_state_fault +InvalidErrorCode,invalid_error_code +InvalidEventCategoryException,invalid_event_category_exception +InvalidEventDataStoreCategoryException,invalid_event_data_store_category_exception +InvalidEventDataStoreStatusException,invalid_event_data_store_status_exception +InvalidEventPatternException,invalid_event_pattern_exception +InvalidEventSelectorsException,invalid_event_selectors_exception +InvalidEventSubscriptionStateFault,invalid_event_subscription_state_fault +InvalidExecutionInput,invalid_execution_input +InvalidExportOnlyFault,invalid_export_only_fault +InvalidExportPath,invalid_export_path +InvalidExportSourceStateFault,invalid_export_source_state_fault +InvalidExportTaskStateFault,invalid_export_task_state_fault +InvalidExportTimeException,invalid_export_time_exception +InvalidExpressionException,invalid_expression_exception +InvalidExternalIdException,invalid_external_id_exception +InvalidFacetUpdateException,invalid_facet_update_exception +InvalidFallbackBehavior,invalid_fallback_behavior +InvalidFileExistsBehaviorException,invalid_file_exists_behavior_exception +InvalidFileLocationException,invalid_file_location_exception +InvalidFileModeException,invalid_file_mode_exception +InvalidFilePositionException,invalid_file_position_exception +InvalidFilter,invalid_filter +InvalidFilterException,invalid_filter_exception +InvalidFilterOption,invalid_filter_option +InvalidFilterValue,invalid_filter_value +InvalidFirehoseDestinationException,invalid_firehose_destination_exception +InvalidFleetStatusException,invalid_fleet_status_exception +InvalidFormatFault,invalid_format_fault +InvalidForwardCookies,invalid_forward_cookies +InvalidFunctionAssociation,invalid_function_association +InvalidGameSessionStatusException,invalid_game_session_status_exception +InvalidGatewayRequestException,invalid_gateway_request_exception +InvalidGeoRestrictionParameter,invalid_geo_restriction_parameter +InvalidGitHubAccountTokenException,invalid_git_hub_account_token_exception +InvalidGitHubAccountTokenNameException,invalid_git_hub_account_token_name_exception +InvalidGlobalClusterStateFault,invalid_global_cluster_state_fault +InvalidGlobalReplicationGroupStateFault,invalid_global_replication_group_state_fault +InvalidGrantException,invalid_grant_exception +InvalidGrantIdException,invalid_grant_id_exception +InvalidGrantTokenException,invalid_grant_token_exception +InvalidHandshakeTransitionException,invalid_handshake_transition_exception +InvalidHeadersForS3Origin,invalid_headers_for_s3_origin +InvalidHomeRegionException,invalid_home_region_exception +InvalidHsmClientCertificateStateFault,invalid_hsm_client_certificate_state_fault +InvalidHsmConfigurationStateFault,invalid_hsm_configuration_state_fault +InvalidIamSessionArnException,invalid_iam_session_arn_exception +InvalidIamUserArnException,invalid_iam_user_arn_exception +InvalidIdentityPoolConfigurationException,invalid_identity_pool_configuration_exception +InvalidIdentityTokenException,invalid_identity_token_exception +InvalidIfMatchVersion,invalid_if_match_version +InvalidIgnoreApplicationStopFailuresValueException,invalid_ignore_application_stop_failures_value_exception +InvalidImageFormatException,invalid_image_format_exception +InvalidImportPath,invalid_import_path +InvalidImportSourceException,invalid_import_source_exception +InvalidImportTokenException,invalid_import_token_exception +InvalidInput,invalid_input +InvalidInputCombinationException,invalid_input_combination_exception +InvalidInputException,invalid_input_exception +InvalidInputRecords,invalid_input_records +InvalidInsightSelectorsException,invalid_insight_selectors_exception +InvalidInstanceId,invalid_instance_id +InvalidInstanceInformationFilterValue,invalid_instance_information_filter_value +InvalidInstanceNameException,invalid_instance_name_exception +InvalidInstanceStatusException,invalid_instance_status_exception +InvalidInstanceTypeException,invalid_instance_type_exception +InvalidInventoryGroupException,invalid_inventory_group_exception +InvalidInventoryItemContextException,invalid_inventory_item_context_exception +InvalidInventoryRequestException,invalid_inventory_request_exception +InvalidItemContentException,invalid_item_content_exception +InvalidJobException,invalid_job_exception +InvalidJobIdException,invalid_job_id_exception +InvalidJobStateException,invalid_job_state_exception +InvalidKMSArn,invalid_kms_arn +InvalidKMSKeyException,invalid_kms_key_exception +InvalidKMSKeyFault,invalid_kms_key_fault +InvalidKMSResourceException,invalid_kms_resource_exception +InvalidKeyId,invalid_key_id +InvalidKeyPrefixFilterException,invalid_key_prefix_filter_exception +InvalidKeySigningKeyName,invalid_key_signing_key_name +InvalidKeySigningKeyStatus,invalid_key_signing_key_status +InvalidKeyUsageException,invalid_key_usage_exception +InvalidKmsKeyIdException,invalid_kms_key_id_exception +InvalidLDAPSStatusException,invalid_ldaps_status_exception +InvalidLabels,invalid_labels +InvalidLambdaFunctionAssociation,invalid_lambda_function_association +InvalidLambdaFunctionException,invalid_lambda_function_exception +InvalidLambdaFunctionOutputException,invalid_lambda_function_output_exception +InvalidLambdaResponseException,invalid_lambda_response_exception +InvalidLayerException,invalid_layer_exception +InvalidLayerPartException,invalid_layer_part_exception +InvalidLexiconException,invalid_lexicon_exception +InvalidLifecycleEventHookExecutionIdException,invalid_lifecycle_event_hook_execution_id_exception +InvalidLifecycleEventHookExecutionStatusException,invalid_lifecycle_event_hook_execution_status_exception +InvalidLimitException,invalid_limit_exception +InvalidLoadBalancerActionException,invalid_load_balancer_action_exception +InvalidLoadBalancerInfoException,invalid_load_balancer_info_exception +InvalidLocationCode,invalid_location_code +InvalidLoggingConfiguration,invalid_logging_configuration +InvalidLookupAttributesException,invalid_lookup_attributes_exception +InvalidMarkerException,invalid_marker_exception +InvalidMaxConflictFilesException,invalid_max_conflict_files_exception +InvalidMaxMergeHunksException,invalid_max_merge_hunks_exception +InvalidMaxResultsException,invalid_max_results_exception +InvalidMediaFrameException,invalid_media_frame_exception +InvalidMergeOptionException,invalid_merge_option_exception +InvalidMinimumHealthyHostValueException,invalid_minimum_healthy_host_value_exception +InvalidMinimumProtocolVersion,invalid_minimum_protocol_version +InvalidName,invalid_name +InvalidNamespaceFault,invalid_namespace_fault +InvalidNetworkInterface,invalid_network_interface +InvalidNetworkSettings,invalid_network_settings +InvalidNextToken,invalid_next_token +InvalidNextTokenException,invalid_next_token_exception +InvalidNodeException,invalid_node_exception +InvalidNodeStateFault,invalid_node_state_fault +InvalidNonceException,invalid_nonce_exception +InvalidNotificationConfig,invalid_notification_config +InvalidNumericDataException,invalid_numeric_data_exception +InvalidOAuthFlowException,invalid_o_auth_flow_exception +InvalidObjectState,invalid_object_state +InvalidOnPremisesTagCombinationException,invalid_on_premises_tag_combination_exception +InvalidOperationException,invalid_operation_exception +InvalidOperationFault,invalid_operation_fault +InvalidOptionException,invalid_option_exception +InvalidOptionGroupStateFault,invalid_option_group_state_fault +InvalidOrderException,invalid_order_exception +InvalidOrigin,invalid_origin +InvalidOriginAccessControl,invalid_origin_access_control +InvalidOriginAccessIdentity,invalid_origin_access_identity +InvalidOriginKeepaliveTimeout,invalid_origin_keepalive_timeout +InvalidOriginReadTimeout,invalid_origin_read_timeout +InvalidOutput,invalid_output +InvalidOverrideStatusException,invalid_override_status_exception +InvalidPaginationException,invalid_pagination_exception +InvalidPaginationToken,invalid_pagination_token +InvalidPaginationTokenException,invalid_pagination_token_exception +InvalidParameter,invalid_parameter +InvalidParameterCombinationException,invalid_parameter_combination_exception +InvalidParameterDetail,invalid_parameter_detail +InvalidParameterException,invalid_parameter_exception +InvalidParameterGroupStateFault,invalid_parameter_group_state_fault +InvalidParameterValueException,invalid_parameter_value_exception +InvalidParameterValuesException,invalid_parameter_values_exception +InvalidParameters,invalid_parameters +InvalidParametersException,invalid_parameters_exception +InvalidParentCommitIdException,invalid_parent_commit_id_exception +InvalidPasswordException,invalid_password_exception +InvalidPathException,invalid_path_exception +InvalidPerUnitStorageThroughput,invalid_per_unit_storage_throughput +InvalidPermissionType,invalid_permission_type +InvalidPolicyAttributeException,invalid_policy_attribute_exception +InvalidPolicyDocument,invalid_policy_document +InvalidPolicyException,invalid_policy_exception +InvalidPolicyRevisionIdException,invalid_policy_revision_id_exception +InvalidPolicyTypeException,invalid_policy_type_exception +InvalidPortRangeException,invalid_port_range_exception +InvalidProductCodeException,invalid_product_code_exception +InvalidProtocolSettings,invalid_protocol_settings +InvalidPublicKeyException,invalid_public_key_exception +InvalidPublicKeyVersionException,invalid_public_key_version_exception +InvalidPullRequestEventTypeException,invalid_pull_request_event_type_exception +InvalidPullRequestIdException,invalid_pull_request_id_exception +InvalidPullRequestStatusException,invalid_pull_request_status_exception +InvalidPullRequestStatusUpdateException,invalid_pull_request_status_update_exception +InvalidQueryException,invalid_query_exception +InvalidQueryStatementException,invalid_query_statement_exception +InvalidQueryStatusException,invalid_query_status_exception +InvalidQueryStringParameters,invalid_query_string_parameters +InvalidReactionUserArnException,invalid_reaction_user_arn_exception +InvalidReactionValueException,invalid_reaction_value_exception +InvalidRecordCount,invalid_record_count +InvalidRecordingGroupException,invalid_recording_group_exception +InvalidReferenceNameException,invalid_reference_name_exception +InvalidRegion,invalid_region +InvalidRegionException,invalid_region_exception +InvalidRegistrationStatusException,invalid_registration_status_exception +InvalidRelativeFileVersionEnumException,invalid_relative_file_version_enum_exception +InvalidRelativePath,invalid_relative_path +InvalidRenderingParameterException,invalid_rendering_parameter_exception +InvalidReplacementContentException,invalid_replacement_content_exception +InvalidReplacementTypeException,invalid_replacement_type_exception +InvalidReplicationGroupStateFault,invalid_replication_group_state_fault +InvalidRepositoryDescriptionException,invalid_repository_description_exception +InvalidRepositoryNameException,invalid_repository_name_exception +InvalidRepositoryTriggerBranchNameException,invalid_repository_trigger_branch_name_exception +InvalidRepositoryTriggerCustomDataException,invalid_repository_trigger_custom_data_exception +InvalidRepositoryTriggerDestinationArnException,invalid_repository_trigger_destination_arn_exception +InvalidRepositoryTriggerEventsException,invalid_repository_trigger_events_exception +InvalidRepositoryTriggerNameException,invalid_repository_trigger_name_exception +InvalidRepositoryTriggerRegionException,invalid_repository_trigger_region_exception +InvalidRequestContentException,invalid_request_content_exception +InvalidRequestDetail,invalid_request_detail +InvalidRequestException,invalid_request_exception +InvalidRequiredProtocol,invalid_required_protocol +InvalidReservedNodeStateFault,invalid_reserved_node_state_fault +InvalidResourceArnException,invalid_resource_arn_exception +InvalidResourceException,invalid_resource_exception +InvalidResourceFormatException,invalid_resource_format_exception +InvalidResourcePolicyException,invalid_resource_policy_exception +InvalidResourceStateException,invalid_resource_state_exception +InvalidResourceStateFault,invalid_resource_state_fault +InvalidResourceTypeException,invalid_resource_type_exception +InvalidResponseCode,invalid_response_code +InvalidResponseException,invalid_response_exception +InvalidRestoreFault,invalid_restore_fault +InvalidRestoreTimeException,invalid_restore_time_exception +InvalidResultAttributeException,invalid_result_attribute_exception +InvalidResultTokenException,invalid_result_token_exception +InvalidRetentionPeriodFault,invalid_retention_period_fault +InvalidRevisionException,invalid_revision_exception +InvalidRevisionIdException,invalid_revision_id_exception +InvalidRole,invalid_role +InvalidRoleException,invalid_role_exception +InvalidRouteTableId,invalid_route_table_id +InvalidRuleContentSha256Exception,invalid_rule_content_sha256_exception +InvalidRuleException,invalid_rule_exception +InvalidRuntimeException,invalid_runtime_exception +InvalidS3BucketException,invalid_s3_bucket_exception +InvalidS3BucketFault,invalid_s3_bucket_fault +InvalidS3BucketNameException,invalid_s3_bucket_name_exception +InvalidS3BucketNameFault,invalid_s3_bucket_name_fault +InvalidS3ConfigurationException,invalid_s3_configuration_exception +InvalidS3KeyException,invalid_s3_key_exception +InvalidS3KeyPrefixException,invalid_s3_key_prefix_exception +InvalidS3KeyPrefixFault,invalid_s3_key_prefix_fault +InvalidS3KmsKeyArnException,invalid_s3_kms_key_arn_exception +InvalidS3ObjectException,invalid_s3_object_exception +InvalidS3PrefixException,invalid_s3_prefix_exception +InvalidSNSDestinationException,invalid_sns_destination_exception +InvalidSNSTopicARNException,invalid_sns_topic_arn_exception +InvalidSampleRateException,invalid_sample_rate_exception +InvalidSchedule,invalid_schedule +InvalidScheduleFault,invalid_schedule_fault +InvalidScheduledActionFault,invalid_scheduled_action_fault +InvalidSchemaDocException,invalid_schema_doc_exception +InvalidSchemeException,invalid_scheme_exception +InvalidScopeException,invalid_scope_exception +InvalidSecretsManagerResourceException,invalid_secrets_manager_resource_exception +InvalidSecurityException,invalid_security_exception +InvalidSecurityGroupException,invalid_security_group_exception +InvalidSecurityGroupIDException,invalid_security_group_id_exception +InvalidSecurityGroupId,invalid_security_group_id +InvalidSensorData,invalid_sensor_data +InvalidSequenceTokenException,invalid_sequence_token_exception +InvalidServiceLinkedRoleStateException,invalid_service_linked_role_state_exception +InvalidServiceRoleException,invalid_service_role_exception +InvalidSessionException,invalid_session_exception +InvalidSignal,invalid_signal +InvalidSignalDecoder,invalid_signal_decoder +InvalidSignalsException,invalid_signals_exception +InvalidSigningStatus,invalid_signing_status +InvalidSmsRoleAccessPolicyException,invalid_sms_role_access_policy_exception +InvalidSmsRoleTrustRelationshipException,invalid_sms_role_trust_relationship_exception +InvalidSnapshotCopyGrantStateFault,invalid_snapshot_copy_grant_state_fault +InvalidSnapshotStateFault,invalid_snapshot_state_fault +InvalidSnsTopicArnException,invalid_sns_topic_arn_exception +InvalidSnsTopicException,invalid_sns_topic_exception +InvalidSnsTopicNameException,invalid_sns_topic_name_exception +InvalidSortByException,invalid_sort_by_exception +InvalidSortOrderException,invalid_sort_order_exception +InvalidSourceCommitSpecifierException,invalid_source_commit_specifier_exception +InvalidSourceException,invalid_source_exception +InvalidSourceKmsKey,invalid_source_kms_key +InvalidSsmlException,invalid_ssml_exception +InvalidStageDeclarationException,invalid_stage_declaration_exception +InvalidStateException,invalid_state_exception +InvalidStateTransitionException,invalid_state_transition_exception +InvalidStructureException,invalid_structure_exception +InvalidSubnet,invalid_subnet +InvalidSubnetException,invalid_subnet_exception +InvalidSubnetIDException,invalid_subnet_id_exception +InvalidSubnetId,invalid_subnet_id +InvalidSubscriptionStateFault,invalid_subscription_state_fault +InvalidSystemTagUsageException,invalid_system_tag_usage_exception +InvalidTTLOrder,invalid_ttl_order +InvalidTableRestoreArgumentFault,invalid_table_restore_argument_fault +InvalidTag,invalid_tag +InvalidTagException,invalid_tag_exception +InvalidTagFault,invalid_tag_fault +InvalidTagFilterException,invalid_tag_filter_exception +InvalidTagKeysListException,invalid_tag_keys_list_exception +InvalidTagParameterException,invalid_tag_parameter_exception +InvalidTagging,invalid_tagging +InvalidTaggingRequestException,invalid_tagging_request_exception +InvalidTagsException,invalid_tags_exception +InvalidTagsMapException,invalid_tags_map_exception +InvalidTagsToAddException,invalid_tags_to_add_exception +InvalidTarget,invalid_target +InvalidTargetBranchException,invalid_target_branch_exception +InvalidTargetException,invalid_target_exception +InvalidTargetFilterNameException,invalid_target_filter_name_exception +InvalidTargetGroupPairException,invalid_target_group_pair_exception +InvalidTargetInstancesException,invalid_target_instances_exception +InvalidTargetMaps,invalid_target_maps +InvalidTargetsException,invalid_targets_exception +InvalidTaskIdException,invalid_task_id_exception +InvalidTemplateException,invalid_template_exception +InvalidTimeRangeException,invalid_time_range_exception +InvalidTitleException,invalid_title_exception +InvalidToken,invalid_token +InvalidTokenException,invalid_token_exception +InvalidTracingConfiguration,invalid_tracing_configuration +InvalidTrackingOptionsException,invalid_tracking_options_exception +InvalidTrafficPolicyDocument,invalid_traffic_policy_document +InvalidTrafficRoutingConfigurationException,invalid_traffic_routing_configuration_exception +InvalidTrailNameException,invalid_trail_name_exception +InvalidTriggerConfigException,invalid_trigger_config_exception +InvalidTypeException,invalid_type_exception +InvalidTypeNameException,invalid_type_name_exception +InvalidUpdate,invalid_update +InvalidUpdateOutdatedInstancesOnlyValueException,invalid_update_outdated_instances_only_value_exception +InvalidUsageAllocationsException,invalid_usage_allocations_exception +InvalidUsageDimensionException,invalid_usage_dimension_exception +InvalidUsageLimitFault,invalid_usage_limit_fault +InvalidUserGroupStateFault,invalid_user_group_state_fault +InvalidUserList,invalid_user_list +InvalidUserPoolConfigurationException,invalid_user_pool_configuration_exception +InvalidUserStateFault,invalid_user_state_fault +InvalidUserStatusException,invalid_user_status_exception +InvalidUserTypeException,invalid_user_type_exception +InvalidVPCId,invalid_vpc_id +InvalidVPCNetworkStateFault,invalid_vpc_network_state_fault +InvalidValues,invalid_values +InvalidVersionNumberException,invalid_version_number_exception +InvalidViewerCertificate,invalid_viewer_certificate +InvalidWebACLId,invalid_web_acl_id +InvalidWebhookAuthenticationParametersException,invalid_webhook_authentication_parameters_exception +InvalidWebhookFilterPatternException,invalid_webhook_filter_pattern_exception +InvalidZipFileException,invalid_zip_file_exception +InvalidateProjectCacheInput,invalidate_project_cache_input +Invalidation,invalidation +InvalidationBatch,invalidation_batch +InvalidationList,invalidation_list +InvalidationSummary,invalidation_summary +InventoryAggregator,inventory_aggregator +InventoryConfiguration,inventory_configuration +InventoryConfigurationList,inventory_configuration_list +InventoryData,inventory_data +InventoryDeletionStatusItem,inventory_deletion_status_item +InventoryDeletionSummary,inventory_deletion_summary +InventoryDeletionSummaryItem,inventory_deletion_summary_item +InventoryDeletions,inventory_deletions +InventoryDestination,inventory_destination +InventoryEncryption,inventory_encryption +InventoryFilter,inventory_filter +InventoryGroup,inventory_group +InventoryItem,inventory_item +InventoryItemAttribute,inventory_item_attribute +InventoryItemSchema,inventory_item_schema +InventoryResultEntity,inventory_result_entity +InventoryResultItem,inventory_result_item +InventoryRetrievalJobDescription,inventory_retrieval_job_description +InventoryRetrievalJobInput,inventory_retrieval_job_input +InventoryRetrievalParameters,inventory_retrieval_parameters +InventoryS3BucketDestination,inventory_s3_bucket_destination +InventorySchedule,inventory_schedule +InventorySizeInBytes,inventory_size_in_bytes +Inverse,inverse +Inverted,inverted +InvisibleFieldInfo,invisible_field_info +InvisibleFields,invisible_fields +Invitation,invitation +InvitationId,invitation_id +InvitationType,invitation_type +Invitations,invitations +InvitationsCount,invitations_count +Invite,invite +InviteAccountToOrganizationRequest,invite_account_to_organization_request +InviteAccountToOrganizationResponse,invite_account_to_organization_response +InviteAction,invite_action +InviteId,invite_id +InviteMembersRequest,invite_members_request +InviteMembersResponse,invite_members_response +InviteMessageTemplate,invite_message_template +InviteUsersRequest,invite_users_request +InviteUsersResponse,invite_users_response +InvitedAt,invited_at +InvitedBy,invited_by +InvitedOn,invited_on +InvitedTime,invited_time +InviteePrincipalId,invitee_principal_id +Invites,invites +InvocationCondition,invocation_condition +InvocationEndTime,invocation_end_time +InvocationEndpoint,invocation_endpoint +InvocationHttpParameters,invocation_http_parameters +InvocationId,invocation_id +InvocationPhrase,invocation_phrase +InvocationPoint,invocation_point +InvocationRateLimitPerSecond,invocation_rate_limit_per_second +InvocationRequest,invocation_request +InvocationResponse,invocation_response +InvocationRole,invocation_role +InvocationStartTime,invocation_start_time +InvocationTime,invocation_time +InvocationTimeoutSeconds,invocation_timeout_seconds +InvocationType,invocation_type +InvocationsMaxRetries,invocations_max_retries +InvocationsPerInstance,invocations_per_instance +InvocationsTimeoutInSeconds,invocations_timeout_in_seconds +InvoiceId,invoice_id +InvokeArgs,invoke_args +InvokeAsyncRequest,invoke_async_request +InvokeAsyncResponse,invoke_async_response +InvokeDeviceMethodRequest,invoke_device_method_request +InvokeDeviceMethodResponse,invoke_device_method_response +InvokeEndpointAsyncInput,invoke_endpoint_async_input +InvokeEndpointAsyncOutput,invoke_endpoint_async_output +InvokeEndpointInput,invoke_endpoint_input +InvokeEndpointOutput,invoke_endpoint_output +InvokeEndpointWithResponseStreamInput,invoke_endpoint_with_response_stream_input +InvokeEndpointWithResponseStreamOutput,invoke_endpoint_with_response_stream_output +InvokeMode,invoke_mode +InvokeModelRequest,invoke_model_request +InvokeModelResponse,invoke_model_response +InvokeModelWithResponseStreamRequest,invoke_model_with_response_stream_request +InvokeModelWithResponseStreamResponse,invoke_model_with_response_stream_response +InvokeResponseStreamUpdate,invoke_response_stream_update +InvokeScreenAutomationRequest,invoke_screen_automation_request +InvokeScreenAutomationResult,invoke_screen_automation_result +InvokeWithResponseStreamCompleteEvent,invoke_with_response_stream_complete_event +InvokeWithResponseStreamRequest,invoke_with_response_stream_request +InvokeWithResponseStreamResponse,invoke_with_response_stream_response +InvokedBy,invoked_by +InvokedIntentSample,invoked_intent_sample +InvokedProductionVariant,invoked_production_variant +IoPerformance,io_performance +IoTJobAbortConfig,io_t_job_abort_config +IoTJobAbortCriteria,io_t_job_abort_criteria +IoTJobExecutionsRolloutConfig,io_t_job_executions_rollout_config +IoTJobExponentialRolloutRate,io_t_job_exponential_rollout_rate +IoTJobRateIncreaseCriteria,io_t_job_rate_increase_criteria +IoTJobTimeoutConfig,io_t_job_timeout_config +IonBinary,ion_binary +IonText,ion_text +Iops,iops +IopsOther,iops_other +IopsRead,iops_read +IopsToStorageRatio,iops_to_storage_ratio +IopsTotal,iops_total +IopsWrite,iops_write +IosClientBrandingAttributes,ios_client_branding_attributes +IosImportClientBrandingAttributes,ios_import_client_branding_attributes +IotAnalyticsAction,iot_analytics_action +IotCertificateId,iot_certificate_id +IotEventsAction,iot_events_action +IotEventsDestinationConfiguration,iot_events_destination_configuration +IotEventsInputIdentifier,iot_events_input_identifier +IotJobArn,iot_job_arn +IotJobId,iot_job_id +IotRoleAlias,iot_role_alias +IotSiteWiseAction,iot_site_wise_action +IotSiteWiseAssetModelPropertyIdentifier,iot_site_wise_asset_model_property_identifier +IotSiteWiseCustomerManagedDatastoreS3Storage,iot_site_wise_customer_managed_datastore_s3_storage +IotSiteWiseCustomerManagedDatastoreS3StorageSummary,iot_site_wise_customer_managed_datastore_s3_storage_summary +IotSiteWiseInputIdentifier,iot_site_wise_input_identifier +IotThingName,iot_thing_name +IotTopicPublishAction,iot_topic_publish_action +Ip,ip +IpAccessSettings,ip_access_settings +IpAccessSettingsSummary,ip_access_settings_summary +IpAddress,ip_address +IpAddressCount,ip_address_count +IpAddressDetails,ip_address_details +IpAddressFamily,ip_address_family +IpAddressInUse,ip_address_in_use +IpAddressRequest,ip_address_request +IpAddressResponse,ip_address_response +IpAddressType,ip_address_type +IpAddressUpdate,ip_address_update +IpAddressV4,ip_address_v4 +IpAddresses,ip_addresses +IpCity,ip_city +IpCountry,ip_country +IpDiscovery,ip_discovery +IpFamily,ip_family +IpFilter,ip_filter +IpGeoLocation,ip_geo_location +IpId,ip_id +IpOrganizationDetails,ip_organization_details +IpOwner,ip_owner +IpOwnerId,ip_owner_id +IpPermission,ip_permission +IpPermissions,ip_permissions +IpPermissionsEgress,ip_permissions_egress +IpProtocol,ip_protocol +IpRange,ip_range +IpRanges,ip_ranges +IpRestrictionRuleMap,ip_restriction_rule_map +IpRoute,ip_route +IpRouteInfo,ip_route_info +IpRouteLimitExceededException,ip_route_limit_exceeded_exception +IpRouteStatusMsg,ip_route_status_msg +IpRouteStatusReason,ip_route_status_reason +IpRoutes,ip_routes +IpRoutesInfo,ip_routes_info +IpRule,ip_rule +IpRuleItem,ip_rule_item +IpScheme,ip_scheme +IpSet,ip_set +IpSetId,ip_set_id +IpSetIds,ip_set_ids +IpSets,ip_sets +IpUsage,ip_usage +IpV4Addresses,ipv4_addresses +IpV4Cidr,ipv4_cidr +IpV4CidrBlock,ipv4_cidr_block +IpV6Address,ipv6_address +IpV6Addresses,ipv6_addresses +IpV6Cidr,ipv6_cidr +Ipam,ipam +IpamAddressHistoryRecord,ipam_address_history_record +IpamArn,ipam_arn +IpamCidrAuthorizationContext,ipam_cidr_authorization_context +IpamDiscoveredAccount,ipam_discovered_account +IpamDiscoveredAccounts,ipam_discovered_accounts +IpamDiscoveredResourceCidr,ipam_discovered_resource_cidr +IpamDiscoveredResourceCidrs,ipam_discovered_resource_cidrs +IpamDiscoveryFailureReason,ipam_discovery_failure_reason +IpamId,ipam_id +IpamIds,ipam_ids +IpamOperatingRegion,ipam_operating_region +IpamPool,ipam_pool +IpamPoolAllocation,ipam_pool_allocation +IpamPoolAllocationId,ipam_pool_allocation_id +IpamPoolAllocations,ipam_pool_allocations +IpamPoolArn,ipam_pool_arn +IpamPoolCidr,ipam_pool_cidr +IpamPoolCidrFailureReason,ipam_pool_cidr_failure_reason +IpamPoolCidrId,ipam_pool_cidr_id +IpamPoolCidrs,ipam_pool_cidrs +IpamPoolId,ipam_pool_id +IpamPoolIds,ipam_pool_ids +IpamPoolOwner,ipam_pool_owner +IpamPools,ipam_pools +IpamRegion,ipam_region +IpamResourceCidr,ipam_resource_cidr +IpamResourceCidrs,ipam_resource_cidrs +IpamResourceDiscoveries,ipam_resource_discoveries +IpamResourceDiscovery,ipam_resource_discovery +IpamResourceDiscoveryArn,ipam_resource_discovery_arn +IpamResourceDiscoveryAssociation,ipam_resource_discovery_association +IpamResourceDiscoveryAssociationArn,ipam_resource_discovery_association_arn +IpamResourceDiscoveryAssociationId,ipam_resource_discovery_association_id +IpamResourceDiscoveryAssociationIds,ipam_resource_discovery_association_ids +IpamResourceDiscoveryAssociations,ipam_resource_discovery_associations +IpamResourceDiscoveryId,ipam_resource_discovery_id +IpamResourceDiscoveryIds,ipam_resource_discovery_ids +IpamResourceDiscoveryRegion,ipam_resource_discovery_region +IpamResourceTag,ipam_resource_tag +IpamScope,ipam_scope +IpamScopeArn,ipam_scope_arn +IpamScopeId,ipam_scope_id +IpamScopeIds,ipam_scope_ids +IpamScopeType,ipam_scope_type +IpamScopes,ipam_scopes +Ipams,ipams +IpcMode,ipc_mode +Ips,ips +Ipv4,ipv4 +Ipv4Address,ipv4_address +Ipv4AddressesPerInterface,ipv4_addresses_per_interface +Ipv4IpamPoolId,ipv4_ipam_pool_id +Ipv4NetmaskLength,ipv4_netmask_length +Ipv4Prefix,ipv4_prefix +Ipv4PrefixCount,ipv4_prefix_count +Ipv4PrefixSpecification,ipv4_prefix_specification +Ipv4PrefixSpecificationRequest,ipv4_prefix_specification_request +Ipv4PrefixSpecificationResponse,ipv4_prefix_specification_response +Ipv4Prefixes,ipv4_prefixes +Ipv6,ipv6 +Ipv6Address,ipv6_address +Ipv6AddressCount,ipv6_address_count +Ipv6Addresses,ipv6_addresses +Ipv6AddressesPerInterface,ipv6_addresses_per_interface +Ipv6Cidr,ipv6_cidr +Ipv6CidrAssociation,ipv6_cidr_association +Ipv6CidrAssociations,ipv6_cidr_associations +Ipv6CidrBlock,ipv6_cidr_block +Ipv6CidrBlockAssociation,ipv6_cidr_block_association +Ipv6CidrBlockAssociationSet,ipv6_cidr_block_association_set +Ipv6CidrBlockNetworkBorderGroup,ipv6_cidr_block_network_border_group +Ipv6CidrBlockSet,ipv6_cidr_block_set +Ipv6CidrBlockState,ipv6_cidr_block_state +Ipv6IpamPoolId,ipv6_ipam_pool_id +Ipv6Native,ipv6_native +Ipv6NetmaskLength,ipv6_netmask_length +Ipv6Pool,ipv6_pool +Ipv6Pools,ipv6_pools +Ipv6Prefix,ipv6_prefix +Ipv6PrefixCount,ipv6_prefix_count +Ipv6PrefixSpecification,ipv6_prefix_specification +Ipv6PrefixSpecificationRequest,ipv6_prefix_specification_request +Ipv6PrefixSpecificationResponse,ipv6_prefix_specification_response +Ipv6Prefixes,ipv6_prefixes +Ipv6Range,ipv6_range +Ipv6Ranges,ipv6_ranges +Ipv6Support,ipv6_support +Ipv6Supported,ipv6_supported +IrreversibleInstanceRefreshFault,irreversible_instance_refresh_fault +Is64BitsOnly,is64_bits_only +IsActivated,is_activated +IsAdvancedManagedRuleSet,is_advanced_managed_rule_set +IsAlexaForBusinessEnabled,is_alexa_for_business_enabled +IsAnomalous,is_anomalous +IsAnomaly,is_anomaly +IsApplicable,is_applicable +IsArchived,is_archived +IsAttachable,is_attachable +IsAuthorizedInput,is_authorized_input +IsAuthorizedOutput,is_authorized_output +IsAuthorizedWithTokenInput,is_authorized_with_token_input +IsAuthorizedWithTokenOutput,is_authorized_with_token_output +IsAutoPredictor,is_auto_predictor +IsBatchStatement,is_batch_statement +IsBinaryFile,is_binary_file +IsCaller,is_caller +IsClusterWriter,is_cluster_writer +IsCollection,is_collection +IsCritical,is_critical +IsDataLossAllowed,is_data_loss_allowed +IsDataPartial,is_data_partial +IsDefault,is_default +IsDefaultAction,is_default_action +IsDefaultConfiguration,is_default_configuration +IsDefaultVersion,is_default_version +IsEgress,is_egress +IsEmpty,is_empty +IsEnabled,is_enabled +IsEncrypted,is_encrypted +IsEnd,is_end +IsEssential,is_essential +IsGlobal,is_global +IsIPV6Enabled,is_ipv6_enabled +IsImmutable,is_immutable +IsInSandbox,is_in_sandbox +IsIncludedInTopic,is_included_in_topic +IsIndirectActivity,is_indirect_activity +IsLatest,is_latest +IsLatestPatch,is_latest_patch +IsLatestVersion,is_latest_version +IsLocalTime,is_local_time +IsLogging,is_logging +IsLoggingEnabled,is_logging_enabled +IsLongTermPricingAutoRenew,is_long_term_pricing_auto_renew +IsMajorVersion,is_major_version +IsMajorVersionUpgrade,is_major_version_upgrade +IsMaster,is_master +IsMemberInGroupsRequest,is_member_in_groups_request +IsMemberInGroupsResponse,is_member_in_groups_response +IsMfaDeleteEnabled,is_mfa_delete_enabled +IsMiddlebox,is_middlebox +IsModifiable,is_modifiable +IsMultiRegionTrail,is_multi_region_trail +IsNegOne,is_neg_one +IsNewProvisioningAvailable,is_new_provisioning_available +IsNoEcho,is_no_echo +IsNullString,is_null_string +IsOptional,is_optional +IsOrganizationTrail,is_organization_trail +IsOwned,is_owned +IsParent,is_parent +IsPartial,is_partial +IsPaused,is_paused +IsPermanentRestore,is_permanent_restore +IsPrimary,is_primary +IsPrimaryIpv6,is_primary_ipv6 +IsPublic,is_public +IsPubliclyAccessible,is_publicly_accessible +IsRegisteredWithLakeFormation,is_registered_with_lake_formation +IsRequestable,is_requestable +IsRequired,is_required +IsRestoreInProgress,is_restore_in_progress +IsRestricted,is_restricted +IsReviewOwnerUpdateAcknowledged,is_review_owner_update_acknowledged +IsRouteTableUsedInDifferentAZ,is_route_table_used_in_different_az +IsSuccess,is_success +IsTerminal,is_terminal +IsTestDomain,is_test_domain +IsTruncated,is_truncated +IsTunable,is_tunable +IsUnique,is_unique +IsUnstructured,is_unstructured +IsValidExchange,is_valid_exchange +IsValueSecret,is_value_secret +IsVerifiedAuthor,is_verified_author +IsVersioningSupported,is_versioning_supported +IsVpcPeeredResult,is_vpc_peered_result +IsWifiEnabled,is_wifi_enabled +IsWriter,is_writer +Iscsi,iscsi +Iso2CountryCode,iso2_country_code +IsoCountryCode,iso_country_code +IsolationMode,isolation_mode +Isp,isp +IspName,isp_name +IspPlacement,isp_placement +IspPlacements,isp_placements +Issue,issue +IssueCertificateRequest,issue_certificate_request +IssueCertificateResponse,issue_certificate_response +IssueDetected,issue_detected +IssueDetectionConfiguration,issue_detection_configuration +IssueFieldMappings,issue_field_mappings +IssueInfoMap,issue_info_map +IssueSubEntityFilter,issue_sub_entity_filter +IssueType,issue_type +IssuedAt,issued_at +Issuer,issuer +IssuerCertificateIdentifier,issuer_certificate_identifier +IssuerDetails,issuer_details +Issues,issues +IssuesDetected,issues_detected +IssuingAccount,issuing_account +Item,item +ItemClassFilter,item_class_filter +ItemCollectionKey,item_collection_key +ItemCollectionMetrics,item_collection_metrics +ItemCollectionSizeLimitExceededException,item_collection_size_limit_exceeded_exception +ItemContentHash,item_content_hash +ItemContentMismatchException,item_content_mismatch_exception +ItemCount,item_count +ItemIdentifier,item_identifier +ItemIdentifierAttributeName,item_identifier_attribute_name +ItemResponse,item_response +ItemSizeLimitExceededException,item_size_limit_exceeded_exception +ItemSource,item_source +ItemStatus,item_status +ItemizedMetricStats,itemized_metric_stats +ItemizedMetricStatsList,itemized_metric_stats_list +Items,items +ItemsLimit,items_limit +ItemsLimitConfiguration,items_limit_configuration +IvInManifest,iv_in_manifest +IvSource,iv_source +JA3Fingerprint,ja3_fingerprint +JDBCConnectorOptions,jdbc_connector_options +JDBCConnectorSource,jdbc_connector_source +JDBCConnectorTarget,jdbc_connector_target +JSON,json +JSONInput,json_input +JSONMappingParameters,json_mapping_parameters +JSONOutput,json_output +JSONString,json_string +JWTConfiguration,jwt_configuration +JamSyncTime,jam_sync_time +JapaneseTokenizationDictionary,japanese_tokenization_dictionary +Jar,jar +Jdbc,jdbc +JdbcTarget,jdbc_target +JdbcTargets,jdbc_targets +JiraAccountUrl,jira_account_url +JiraConfiguration,jira_configuration +JiraParameters,jira_parameters +JmxExporter,jmx_exporter +JmxExporterInfo,jmx_exporter_info +Job,job +JobAlbumArt,job_album_art +JobArn,job_arn +JobBookmark,job_bookmark +JobBookmarkEntry,job_bookmark_entry +JobBookmarkKeys,job_bookmark_keys +JobBookmarkKeysSortOrder,job_bookmark_keys_sort_order +JobBookmarksEncryption,job_bookmarks_encryption +JobBookmarksEncryptionMode,job_bookmarks_encryption_mode +JobCheckpointConfig,job_checkpoint_config +JobCommand,job_command +JobCompletionDate,job_completion_date +JobCompletionReportURI,job_completion_report_uri +JobConfig,job_config +JobConfiguration,job_configuration +JobCreationDate,job_creation_date +JobData,job_data +JobDefinition,job_definition +JobDefinitionArn,job_definition_arn +JobDefinitionName,job_definition_name +JobDefinitionSummaries,job_definition_summaries +JobDependency,job_dependency +JobDescription,job_description +JobDescriptor,job_descriptor +JobDetail,job_detail +JobDetails,job_details +JobDriver,job_driver +JobDurationInSeconds,job_duration_in_seconds +JobEndTime,job_end_time +JobEntry,job_entry +JobError,job_error +JobEventDetails,job_event_details +JobExecution,job_execution +JobExecutionSettings,job_execution_settings +JobExecutionState,job_execution_state +JobExecutionStatusDetails,job_execution_status_details +JobExecutionSummary,job_execution_summary +JobExecutionSummaryForJob,job_execution_summary_for_job +JobExecutionSummaryForThing,job_execution_summary_for_thing +JobExecutionsRetryConfig,job_executions_retry_config +JobExecutionsRolloutConfig,job_executions_rollout_config +JobExpirationTime,job_expiration_time +JobFailure,job_failure +JobFailureLogURI,job_failure_log_uri +JobFilter,job_filter +JobFlowDetail,job_flow_detail +JobFlowExecutionStatusDetail,job_flow_execution_status_detail +JobFlowId,job_flow_id +JobFlowIds,job_flow_ids +JobFlowInstancesConfig,job_flow_instances_config +JobFlowInstancesDetail,job_flow_instances_detail +JobFlowRole,job_flow_role +JobFlowStates,job_flow_states +JobFlows,job_flows +JobId,job_id +JobIds,job_ids +JobInput,job_input +JobList,job_list +JobListDescriptor,job_list_descriptor +JobListEntries,job_list_entries +JobListEntry,job_list_entry +JobLog,job_log +JobLogEventData,job_log_event_data +JobLogInfo,job_log_info +JobLogs,job_logs +JobManifest,job_manifest +JobManifestGeneratorFilter,job_manifest_generator_filter +JobManifestLocation,job_manifest_location +JobManifestSpec,job_manifest_spec +JobMessages,job_messages +JobMetadata,job_metadata +JobMetrics,job_metrics +JobName,job_name +JobNameContains,job_name_contains +JobNames,job_names +JobNodeDetails,job_node_details +JobNotFoundException,job_not_found_exception +JobOperation,job_operation +JobOutput,job_output +JobOutputDataConfig,job_output_data_config +JobOutputPath,job_output_path +JobParameters,job_parameters +JobPercentComplete,job_percent_complete +JobPlanDescription,job_plan_description +JobPostLaunchActionsLaunchStatus,job_post_launch_actions_launch_status +JobProcessDetails,job_process_details +JobProgress,job_progress +JobProgressSummary,job_progress_summary +JobQueueDetail,job_queue_detail +JobReferenceCode,job_reference_code +JobReferenceCodeContains,job_reference_code_contains +JobReport,job_report +JobResource,job_resource +JobResourceTags,job_resource_tags +JobResources,job_resources +JobRun,job_run +JobRunId,job_run_id +JobRunIds,job_run_ids +JobRunState,job_run_state +JobRunSummary,job_run_summary +JobRuns,job_runs +JobSample,job_sample +JobSchedule,job_schedule +JobScheduleFrequency,job_schedule_frequency +JobScopeTerm,job_scope_term +JobScopingBlock,job_scoping_block +JobSettings,job_settings +JobStartTime,job_start_time +JobState,job_state +JobStatesToNotify,job_states_to_notify +JobStats,job_stats +JobStatus,job_status +JobStatusDetails,job_status_details +JobStatusException,job_status_exception +JobStatuses,job_statuses +JobStoppingCondition,job_stopping_condition +JobSuccessLogURI,job_success_log_uri +JobSummaries,job_summaries +JobSummary,job_summary +JobTag,job_tag +JobTags,job_tags +JobTemplate,job_template +JobTemplateData,job_template_data +JobTemplateSettings,job_template_settings +JobTemplateSummary,job_template_summary +JobTemplates,job_templates +JobTimeout,job_timeout +JobTimers,job_timers +JobTitle,job_title +JobType,job_type +JobUpdate,job_update +JobWatermark,job_watermark +JobWorkerExecutorConfiguration,job_worker_executor_configuration +Jobs,jobs +JobsNotFound,jobs_not_found +Join,join +JoinColumn,join_column +JoinDomainInput,join_domain_input +JoinDomainOutput,join_domain_output +JoinEui,join_eui +JoinEuiFilters,join_eui_filters +JoinEventConfiguration,join_event_configuration +JoinInstruction,join_instruction +JoinKeyProperties,join_key_properties +JoinResourceTypeEventConfiguration,join_resource_type_event_configuration +JoinSource,join_source +JoinStorageSessionInput,join_storage_session_input +JoinToken,join_token +JoinType,join_type +JoinedMethod,joined_method +JoinedTimestamp,joined_timestamp +JournalKinesisStreamDescription,journal_kinesis_stream_description +JournalS3ExportDescription,journal_s3_export_description +JournalS3Exports,journal_s3_exports +JourneyActivityId,journey_activity_id +JourneyChannelSettings,journey_channel_settings +JourneyCustomMessage,journey_custom_message +JourneyDateRangeKpiResponse,journey_date_range_kpi_response +JourneyEmailMessage,journey_email_message +JourneyExecutionActivityMetricsResponse,journey_execution_activity_metrics_response +JourneyExecutionMetricsResponse,journey_execution_metrics_response +JourneyId,journey_id +JourneyLimits,journey_limits +JourneyPushMessage,journey_push_message +JourneyResponse,journey_response +JourneyRunExecutionActivityMetricsResponse,journey_run_execution_activity_metrics_response +JourneyRunExecutionMetricsResponse,journey_run_execution_metrics_response +JourneyRunResponse,journey_run_response +JourneyRunsResponse,journey_runs_response +JourneySMSMessage,journey_sms_message +JourneySchedule,journey_schedule +JourneyStateRequest,journey_state_request +JourneyTimeframeCap,journey_timeframe_cap +JourneysResponse,journeys_response +Json,json +JsonBody,json_body +JsonClassifier,json_classifier +JsonContentTypes,json_content_types +JsonFormatDescriptor,json_format_descriptor +JsonFormatRef,json_format_ref +JsonMatchPattern,json_match_pattern +JsonOptions,json_options +JsonPath,json_path +JsonTokenTypeConfiguration,json_token_type_configuration +JunctionPath,junction_path +JupyterServerAppSettings,jupyter_server_app_settings +JwksUri,jwks_uri +JwtConfiguration,jwt_configuration +JwtTokenTypeConfiguration,jwt_token_type_configuration +KBId,kb_id +KGKeyPairIds,kg_key_pair_ids +KMSAccessDeniedException,kms_access_denied_exception +KMSAccessDeniedFault,kms_access_denied_fault +KMSArn,kms_arn +KMSContext,kms_context +KMSDisabledException,kms_disabled_exception +KMSDisabledFault,kms_disabled_fault +KMSEncrypted,kms_encrypted +KMSEncryptionConfig,kms_encryption_config +KMSEncryptionContext,kms_encryption_context +KMSFault,kms_fault +KMSInternalException,kms_internal_exception +KMSInvalidKeyUsageException,kms_invalid_key_usage_exception +KMSInvalidMacException,kms_invalid_mac_exception +KMSInvalidSignatureException,kms_invalid_signature_exception +KMSInvalidStateException,kms_invalid_state_exception +KMSInvalidStateFault,kms_invalid_state_fault +KMSKey,kms_key +KMSKeyArn,kms_key_arn +KMSKeyDetails,kms_key_details +KMSKeyID,kms_key_id +KMSKeyId,kms_key_id +KMSKeyNotAccessibleFault,kms_key_not_accessible_fault +KMSMasterKeyArn,kms_master_key_arn +KMSMasterKeyID,kms_master_key_id +KMSMasterKeyId,kms_master_key_id +KMSNotFoundException,kms_not_found_exception +KMSNotFoundFault,kms_not_found_fault +KMSOptInRequired,kms_opt_in_required +KMSRequestFailedException,kms_request_failed_exception +KMSServerSideEncryption,kms_server_side_encryption +KMSServerSideEncryptionIntegration,kms_server_side_encryption_integration +KMSServerSideEncryptionIntegrationConfig,kms_server_side_encryption_integration_config +KMSThrottlingException,kms_throttling_exception +KMSThrottlingFault,kms_throttling_fault +KPIActualValueConditionalFormatting,kpi_actual_value_conditional_formatting +KPIComparisonValueConditionalFormatting,kpi_comparison_value_conditional_formatting +KPIConditionalFormatting,kpi_conditional_formatting +KPIConditionalFormattingOption,kpi_conditional_formatting_option +KPIConfiguration,kpi_configuration +KPIFieldWells,kpi_field_wells +KPIOptions,kpi_options +KPIPrimaryValueConditionalFormatting,kpi_primary_value_conditional_formatting +KPIProgressBarConditionalFormatting,kpi_progress_bar_conditional_formatting +KPISortConfiguration,kpi_sort_configuration +KPISparklineOptions,kpi_sparkline_options +KPIVisual,kpi_visual +KPIVisualLayoutOptions,kpi_visual_layout_options +KPIVisualStandardLayout,kpi_visual_standard_layout +KVSStreamStartSelector,kvs_stream_start_selector +KafkaAction,kafka_action +KafkaActionHeader,kafka_action_header +KafkaBrokerNodeId,kafka_broker_node_id +KafkaCluster,kafka_cluster +KafkaClusterClientAuthentication,kafka_cluster_client_authentication +KafkaClusterClientAuthenticationDescription,kafka_cluster_client_authentication_description +KafkaClusterDescription,kafka_cluster_description +KafkaClusterEncryptionInTransit,kafka_cluster_encryption_in_transit +KafkaClusterEncryptionInTransitDescription,kafka_cluster_encryption_in_transit_description +KafkaSettings,kafka_settings +KafkaStreamingSourceOptions,kafka_streaming_source_options +KafkaVersion,kafka_version +KafkaVersions,kafka_versions +KantarLicenseId,kantar_license_id +KantarServerUrl,kantar_server_url +KantarWatermark,kantar_watermark +KantarWatermarkSettings,kantar_watermark_settings +KbNumber,kb_number +KdcAdminPassword,kdc_admin_password +KeepAlivePeriodInSeconds,keep_alive_period_in_seconds +KeepJobFlowAliveWhenNoSteps,keep_job_flow_alive_when_no_steps +KeepSegments,keep_segments +KendraConfiguration,kendra_configuration +KerberosAttributes,kerberos_attributes +KerberosKeytab,kerberos_keytab +KerberosKrb5Conf,kerberos_krb5_conf +KerberosPrincipal,kerberos_principal +Kernel,kernel +KernelCapabilities,kernel_capabilities +KernelGatewayAppSettings,kernel_gateway_app_settings +KernelGatewayImageConfig,kernel_gateway_image_config +KernelId,kernel_id +KernelSpec,kernel_spec +KernelSpecs,kernel_specs +Key,key +KeyARN,key_arn +KeyAgreement,key_agreement +KeyAlgorithm,key_algorithm +KeyArn,key_arn +KeyAttributes,key_attributes +KeyBlockFormat,key_block_format +KeyCertSign,key_cert_sign +KeyCertificate,key_certificate +KeyCertificateChain,key_certificate_chain +KeyCheckValue,key_check_value +KeyCheckValueAlgorithm,key_check_value_algorithm +KeyClass,key_class +KeyConditionExpression,key_condition_expression +KeyConditions,key_conditions +KeyCount,key_count +KeyDetection,key_detection +KeyEncipherment,key_encipherment +KeyEncryptionAlgorithm,key_encryption_algorithm +KeyFingerprint,key_fingerprint +KeyFormat,key_format +KeyFormatVersions,key_format_versions +KeyGroup,key_group +KeyGroupAlreadyExists,key_group_already_exists +KeyGroupConfig,key_group_config +KeyGroupId,key_group_id +KeyGroupList,key_group_list +KeyGroupSummary,key_group_summary +KeyId,key_id +KeyIdentifier,key_identifier +KeyLabels,key_labels +KeyLength,key_length +KeyListEntry,key_list_entry +KeyLocation,key_location +KeyManagementServiceArn,key_management_service_arn +KeyManager,key_manager +KeyMarker,key_marker +KeyMaterial,key_material +KeyMaterialType,key_material_type +KeyMd5,key_md5 +KeyMetadata,key_metadata +KeyModesOfUse,key_modes_of_use +KeyName,key_name +KeyNames,key_names +KeyOrigin,key_origin +KeyPair,key_pair +KeyPairId,key_pair_id +KeyPairIds,key_pair_ids +KeyPairInfo,key_pair_info +KeyPairMismatchException,key_pair_mismatch_exception +KeyPairSpec,key_pair_spec +KeyPairs,key_pairs +KeyPath,key_path +KeyPattern,key_pattern +KeyPhrase,key_phrase +KeyPhrases,key_phrases +KeyPhrasesDetectionJobFilter,key_phrases_detection_job_filter +KeyPhrasesDetectionJobProperties,key_phrases_detection_job_properties +KeyPhrasesDetectionJobPropertiesList,key_phrases_detection_job_properties_list +KeyPrefix,key_prefix +KeyPrefixEquals,key_prefix_equals +KeyPrefixes,key_prefixes +KeyProviderServer,key_provider_server +KeyProviderSettings,key_provider_settings +KeyRange,key_range +KeyRotationEnabled,key_rotation_enabled +KeyRotationIntervalSeconds,key_rotation_interval_seconds +KeyRotationStatus,key_rotation_status +KeySchema,key_schema +KeySchemaElement,key_schema_element +KeySerialNumber,key_serial_number +KeySigningKey,key_signing_key +KeySigningKeyAlreadyExists,key_signing_key_already_exists +KeySigningKeyInParentDSRecord,key_signing_key_in_parent_ds_record +KeySigningKeyInUse,key_signing_key_in_use +KeySigningKeyWithActiveStatusNotFound,key_signing_key_with_active_status_not_found +KeySigningKeys,key_signing_keys +KeySpec,key_spec +KeyState,key_state +KeyStatus,key_status +KeyStoragePolicy,key_storage_policy +KeyStorageSecurityStandard,key_storage_security_standard +KeyStorePassword,key_store_password +KeySummary,key_summary +KeyTag,key_tag +KeyType,key_type +KeyUnavailableException,key_unavailable_exception +KeyUsage,key_usage +KeyUsageFlags,key_usage_flags +KeyUsageProperty,key_usage_property +KeyUsagePropertyFlags,key_usage_property_flags +KeyUsages,key_usages +KeyValue,key_value +KeyValuePair,key_value_pair +KeyValuesPair,key_values_pair +KeyframesMaxDist,keyframes_max_dist +Keys,keys +KeysAndAttributes,keys_and_attributes +KeysToDelete,keys_to_delete +KeysWithNoncompliantValues,keys_with_noncompliant_values +KeyspaceSummary,keyspace_summary +Keyword,keyword +KeywordAction,keyword_action +KeywordFilter,keyword_filter +KeywordInformation,keyword_information +KeywordMatchConfiguration,keyword_match_configuration +KeywordMessage,keyword_message +Keywords,keywords +KinesisAction,kinesis_action +KinesisConfiguration,kinesis_configuration +KinesisDataFirehose,kinesis_data_firehose +KinesisDataStream,kinesis_data_stream +KinesisDataStreamDestination,kinesis_data_stream_destination +KinesisDataStreamDestinations,kinesis_data_stream_destinations +KinesisDataStreamSinkConfiguration,kinesis_data_stream_sink_configuration +KinesisFirehoseConfig,kinesis_firehose_config +KinesisFirehoseDestination,kinesis_firehose_destination +KinesisFirehoseDestinationDetails,kinesis_firehose_destination_details +KinesisFirehoseDetails,kinesis_firehose_details +KinesisFirehoseInput,kinesis_firehose_input +KinesisFirehoseInputDescription,kinesis_firehose_input_description +KinesisFirehoseInputUpdate,kinesis_firehose_input_update +KinesisFirehoseOutput,kinesis_firehose_output +KinesisFirehoseOutputDescription,kinesis_firehose_output_description +KinesisFirehoseOutputUpdate,kinesis_firehose_output_update +KinesisParameters,kinesis_parameters +KinesisSettings,kinesis_settings +KinesisStreamARN,kinesis_stream_arn +KinesisStreamConfig,kinesis_stream_config +KinesisStreamName,kinesis_stream_name +KinesisStreamParameters,kinesis_stream_parameters +KinesisStreamSourceConfiguration,kinesis_stream_source_configuration +KinesisStreamSourceDescription,kinesis_stream_source_description +KinesisStreamingDestinationInput,kinesis_streaming_destination_input +KinesisStreamingDestinationOutput,kinesis_streaming_destination_output +KinesisStreamingSourceOptions,kinesis_streaming_source_options +KinesisStreamsInput,kinesis_streams_input +KinesisStreamsInputDescription,kinesis_streams_input_description +KinesisStreamsInputUpdate,kinesis_streams_input_update +KinesisStreamsOutput,kinesis_streams_output +KinesisStreamsOutputDescription,kinesis_streams_output_description +KinesisStreamsOutputUpdate,kinesis_streams_output_update +KinesisVideoStream,kinesis_video_stream +KinesisVideoStreamConfig,kinesis_video_stream_config +KinesisVideoStreamConfiguration,kinesis_video_stream_configuration +KinesisVideoStreamConfigurationUpdate,kinesis_video_stream_configuration_update +KinesisVideoStreamPoolConfiguration,kinesis_video_stream_pool_configuration +KinesisVideoStreamPoolSummary,kinesis_video_stream_pool_summary +KinesisVideoStreamPools,kinesis_video_stream_pools +KinesisVideoStreamRecordingSourceRuntimeConfiguration,kinesis_video_stream_recording_source_runtime_configuration +KinesisVideoStreamSourceRuntimeConfiguration,kinesis_video_stream_source_runtime_configuration +KinesisVideoStreamSourceTaskConfiguration,kinesis_video_stream_source_task_configuration +KinesisVideoStreamStartSelector,kinesis_video_stream_start_selector +Klv,klv +KlvBehavior,klv_behavior +KlvDataPids,klv_data_pids +KlvMetadata,klv_metadata +KmsArn,kms_arn +KmsDataKeyReusePeriodSeconds,kms_data_key_reuse_period_seconds +KmsEncryptionConfig,kms_encryption_config +KmsEncryptionContext,kms_encryption_context +KmsException,kms_exception +KmsGrantConfiguration,kms_grant_configuration +KmsGrantConstraints,kms_grant_constraints +KmsKey,kms_key +KmsKeyARN,kms_key_arn +KmsKeyArn,kms_key_arn +KmsKeyConfiguration,kms_key_configuration +KmsKeyDisabledException,kms_key_disabled_exception +KmsKeyId,kms_key_id +KmsKeyIdentifier,kms_key_identifier +KmsKeyIds,kms_key_ids +KmsKeyNotFoundException,kms_key_not_found_exception +KmsKeyProviderUri,kms_key_provider_uri +KmsKeyRegion,kms_key_region +KmsKeyToGrant,kms_key_to_grant +KmsKeyValidationException,kms_key_validation_exception +KmsKeysToGrant,kms_keys_to_grant +KmsMasterKeyArn,kms_master_key_arn +KmsMasterKeyId,kms_master_key_id +KnowledgeArticleConfiguration,knowledge_article_configuration +KnowledgeBaseAssociationData,knowledge_base_association_data +KnowledgeBaseData,knowledge_base_data +KnowledgeBaseSummary,knowledge_base_summary +KnownFraudsterRisk,known_fraudster_risk +KnownGender,known_gender +KpiName,kpi_name +KpiResult,kpi_result +Kubernetes,kubernetes +KubernetesApiCallAction,kubernetes_api_call_action +KubernetesAuditLogsConfiguration,kubernetes_audit_logs_configuration +KubernetesAuditLogsConfigurationResult,kubernetes_audit_logs_configuration_result +KubernetesConfiguration,kubernetes_configuration +KubernetesConfigurationResult,kubernetes_configuration_result +KubernetesDataSourceFreeTrial,kubernetes_data_source_free_trial +KubernetesDetails,kubernetes_details +KubernetesNetworkConfigRequest,kubernetes_network_config_request +KubernetesNetworkConfigResponse,kubernetes_network_config_response +KubernetesUserDetails,kubernetes_user_details +KubernetesVersion,kubernetes_version +KubernetesWorkloadDetails,kubernetes_workload_details +KxCacheStorageConfiguration,kx_cache_storage_configuration +KxChangesetListEntry,kx_changeset_list_entry +KxCluster,kx_cluster +KxCommandLineArgument,kx_command_line_argument +KxDatabaseCacheConfiguration,kx_database_cache_configuration +KxDatabaseConfiguration,kx_database_configuration +KxDatabaseListEntry,kx_database_list_entry +KxDeploymentConfiguration,kx_deployment_configuration +KxEnvironment,kx_environment +KxNode,kx_node +KxSavedownStorageConfiguration,kx_savedown_storage_configuration +KxUser,kx_user +L6Metadata,l6_metadata +L6Mode,l6_mode +LBCookieStickinessPolicies,lb_cookie_stickiness_policies +LBCookieStickinessPolicy,lb_cookie_stickiness_policy +LDAPSSettingInfo,ldaps_setting_info +LDAPSSettingsInfo,ldaps_settings_info +LDAPSStatus,ldaps_status +LDAPSStatusReason,ldaps_status_reason +LE,le +LFResourceDetails,lf_resource_details +LFTag,lf_tag +LFTagError,lf_tag_error +LFTagKeyResource,lf_tag_key_resource +LFTagOnDatabase,lf_tag_on_database +LFTagPair,lf_tag_pair +LFTagPolicy,lf_tag_policy +LFTagPolicyDetails,lf_tag_policy_details +LFTagPolicyResource,lf_tag_policy_resource +LFTags,lf_tags +LFTagsOnColumns,lf_tags_on_columns +LFTagsOnTable,lf_tags_on_table +LT,lt +Label,label +LabelAlias,label_alias +LabelAttribute,label_attribute +LabelAttributeName,label_attribute_name +LabelCategory,label_category +LabelCategoryConfigS3Uri,label_category_config_s3_uri +LabelCategoryExclusionFilters,label_category_exclusion_filters +LabelCategoryInclusionFilters,label_category_inclusion_filters +LabelColor,label_color +LabelConfiguration,label_configuration +LabelContent,label_content +LabelCount,label_count +LabelCounters,label_counters +LabelCountersForWorkteam,label_counters_for_workteam +LabelDelimiter,label_delimiter +LabelDetection,label_detection +LabelDetectionSettings,label_detection_settings +LabelExclusionFilters,label_exclusion_filters +LabelFontConfiguration,label_font_configuration +LabelGroupArn,label_group_arn +LabelGroupName,label_group_name +LabelGroupNameBeginsWith,label_group_name_begins_with +LabelGroupSummaries,label_group_summaries +LabelGroupSummary,label_group_summary +LabelHeaders,label_headers +LabelId,label_id +LabelInclusionFilters,label_inclusion_filters +LabelIndex,label_index +LabelMatchStatement,label_match_statement +LabelModelVersion,label_model_version +LabelName,label_name +LabelNameCondition,label_name_condition +LabelNamespace,label_namespace +LabelOptions,label_options +LabelParameterVersionRequest,label_parameter_version_request +LabelParameterVersionResult,label_parameter_version_result +LabelSchema,label_schema +LabelStats,label_stats +LabelSummaries,label_summaries +LabelSummary,label_summary +LabelTemplate,label_template +LabelVisibility,label_visibility +Labeled,labeled +LabeledEntries,labeled_entries +LabelingJobAlgorithmSpecificationArn,labeling_job_algorithm_specification_arn +LabelingJobAlgorithmsConfig,labeling_job_algorithms_config +LabelingJobArn,labeling_job_arn +LabelingJobDataAttributes,labeling_job_data_attributes +LabelingJobDataSource,labeling_job_data_source +LabelingJobForWorkteamSummary,labeling_job_for_workteam_summary +LabelingJobInputConfig,labeling_job_input_config +LabelingJobName,labeling_job_name +LabelingJobOutput,labeling_job_output +LabelingJobOutputConfig,labeling_job_output_config +LabelingJobResourceConfig,labeling_job_resource_config +LabelingJobS3DataSource,labeling_job_s3_data_source +LabelingJobSnsDataSource,labeling_job_sns_data_source +LabelingJobStatus,labeling_job_status +LabelingJobStoppingConditions,labeling_job_stopping_conditions +LabelingJobSummary,labeling_job_summary +LabelingJobSummaryList,labeling_job_summary_list +LabelingSetGenerationTaskRunProperties,labeling_set_generation_task_run_properties +Labels,labels +LabelsInputConfiguration,labels_input_configuration +LabelsS3InputConfiguration,labels_s3_input_configuration +Lac,lac +Lag,lag +Lags,lags +LakeFormationConfiguration,lake_formation_configuration +LakeFormationDataPermissionAsset,lake_formation_data_permission_asset +LakeFormationDataPermissionDetails,lake_formation_data_permission_details +LakeFormationDataPermissionType,lake_formation_data_permission_type +LakeFormationOptInsInfo,lake_formation_opt_ins_info +LakeFormationOptInsInfoList,lake_formation_opt_ins_info_list +Lambda,lambda +LambdaAction,lambda_action +LambdaActivity,lambda_activity +LambdaArn,lambda_arn +LambdaAuthorizerConfig,lambda_authorizer_config +LambdaAvailabilityProvider,lambda_availability_provider +LambdaCodeHook,lambda_code_hook +LambdaConfig,lambda_config +LambdaConfigType,lambda_config_type +LambdaConfiguration,lambda_configuration +LambdaConflictHandlerConfig,lambda_conflict_handler_config +LambdaConnectorProvisioningConfig,lambda_connector_provisioning_config +LambdaContainerParams,lambda_container_params +LambdaDataSourceConfig,lambda_data_source_config +LambdaDetails,lambda_details +LambdaDeviceMount,lambda_device_mount +LambdaEndpoint,lambda_endpoint +LambdaEndpointConfig,lambda_endpoint_config +LambdaEndpointInput,lambda_endpoint_input +LambdaEndpointSummary,lambda_endpoint_summary +LambdaEventSource,lambda_event_source +LambdaExecutionParameters,lambda_execution_parameters +LambdaExecutorConfiguration,lambda_executor_configuration +LambdaFunction,lambda_function +LambdaFunctionARN,lambda_function_arn +LambdaFunctionAggregation,lambda_function_aggregation +LambdaFunctionAggregationResponse,lambda_function_aggregation_response +LambdaFunctionArn,lambda_function_arn +LambdaFunctionAssociation,lambda_function_association +LambdaFunctionAssociations,lambda_function_associations +LambdaFunctionCompletedEventAttributes,lambda_function_completed_event_attributes +LambdaFunctionConfiguration,lambda_function_configuration +LambdaFunctionConfigurations,lambda_function_configurations +LambdaFunctionFailedEventAttributes,lambda_function_failed_event_attributes +LambdaFunctionFailedEventDetails,lambda_function_failed_event_details +LambdaFunctionInfo,lambda_function_info +LambdaFunctionMemoryProjectedMetric,lambda_function_memory_projected_metric +LambdaFunctionMemoryRecommendationOption,lambda_function_memory_recommendation_option +LambdaFunctionMetadata,lambda_function_metadata +LambdaFunctionName,lambda_function_name +LambdaFunctionParameters,lambda_function_parameters +LambdaFunctionRecipeSource,lambda_function_recipe_source +LambdaFunctionRecommendation,lambda_function_recommendation +LambdaFunctionRecommendationFilter,lambda_function_recommendation_filter +LambdaFunctionScheduleFailedEventDetails,lambda_function_schedule_failed_event_details +LambdaFunctionScheduledEventAttributes,lambda_function_scheduled_event_attributes +LambdaFunctionScheduledEventDetails,lambda_function_scheduled_event_details +LambdaFunctionSinkConfiguration,lambda_function_sink_configuration +LambdaFunctionStartFailedEventDetails,lambda_function_start_failed_event_details +LambdaFunctionStartedEventAttributes,lambda_function_started_event_attributes +LambdaFunctionSucceededEventDetails,lambda_function_succeeded_event_details +LambdaFunctionTimedOutEventAttributes,lambda_function_timed_out_event_attributes +LambdaFunctionTimedOutEventDetails,lambda_function_timed_out_event_details +LambdaFunctionUtilizationMetric,lambda_function_utilization_metric +LambdaFunctions,lambda_functions +LambdaInvoke,lambda_invoke +LambdaInvokeOperation,lambda_invoke_operation +LambdaLayerAggregation,lambda_layer_aggregation +LambdaLayerAggregationResponse,lambda_layer_aggregation_response +LambdaLinuxProcessParams,lambda_linux_process_params +LambdaOutput,lambda_output +LambdaOutputDescription,lambda_output_description +LambdaOutputUpdate,lambda_output_update +LambdaProvider,lambda_provider +LambdaResource,lambda_resource +LambdaResources,lambda_resources +LambdaStepMetadata,lambda_step_metadata +LambdaTarget,lambda_target +LambdaThrottledException,lambda_throttled_exception +LambdaVersion,lambda_version +LambdaVolumeMount,lambda_volume_mount +LambdaVpcConfig,lambda_vpc_config +Landmark,landmark +Landmarks,landmarks +LandsatCloudCoverLand,landsat_cloud_cover_land +LandsatCloudCoverLandInput,landsat_cloud_cover_land_input +Lang,lang +Language,language +LanguageCode,language_code +LanguageCodeControl,language_code_control +LanguageCodeItem,language_code_item +LanguageCodes,language_codes +LanguageDescription,language_description +LanguageIdSettings,language_id_settings +LanguageIdentification,language_identification +LanguageModel,language_model +LanguageModelName,language_model_name +LanguageName,language_name +LanguageNotSupportedException,language_not_supported_exception +LanguageOptions,language_options +LanguageSelectionPolicy,language_selection_policy +LanguageWithScore,language_with_score +Languages,languages +LargeTimestampGaps,large_timestamp_gaps +Last,last +LastAccessTime,last_access_time +LastAccessedAt,last_accessed_at +LastAccessedDate,last_accessed_date +LastAccessedEntity,last_accessed_entity +LastAccessedRegion,last_accessed_region +LastAccessedTime,last_accessed_time +LastActivatedBy,last_activated_by +LastActivatedTime,last_activated_time +LastActiveAt,last_active_at +LastActiveDefinition,last_active_definition +LastAddress,last_address +LastAllocation,last_allocation +LastAnalyzedTime,last_analyzed_time +LastAssociationExecutionDate,last_association_execution_date +LastAttemptDate,last_attempt_date +LastAttemptedDiscoveryTime,last_attempted_discovery_time +LastAttemptedExecutionTime,last_attempted_execution_time +LastAuditTimestamp,last_audit_timestamp +LastAuthenticated,last_authenticated +LastAuthenticatedEntity,last_authenticated_entity +LastAuthenticatedRegion,last_authenticated_region +LastAuthenticatedTime,last_authenticated_time +LastAuthorizedTime,last_authorized_time +LastAutoAdjustTime,last_auto_adjust_time +LastBackupDate,last_backup_date +LastBackupTime,last_backup_time +LastBatchTransformJob,last_batch_transform_job +LastBusinessReport,last_business_report +LastChangedDate,last_changed_date +LastCheckTimestamp,last_check_timestamp +LastCheckedTimestamp,last_checked_timestamp +LastClaimTime,last_claim_time +LastClearTime,last_clear_time +LastCollectedTime,last_collected_time +LastCommitId,last_commit_id +LastConnectionTime,last_connection_time +LastCrawl,last_crawl +LastCrawlInfo,last_crawl_info +LastDataReceived,last_data_received +LastDeactivatedTime,last_deactivated_time +LastDebugLogDeliveryStatus,last_debug_log_delivery_status +LastDebugLogDeliveryStatusReason,last_debug_log_delivery_status_reason +LastDebugLogDeliveryTime,last_debug_log_delivery_time +LastDecreaseDateTime,last_decrease_date_time +LastDeliveryChannelDeleteFailedException,last_delivery_channel_delete_failed_exception +LastDeliveryEvent,last_delivery_event +LastDeploymentConfig,last_deployment_config +LastDeploymentInfo,last_deployment_info +LastDeploymentStatusMessage,last_deployment_status_message +LastDriftCheckTimestamp,last_drift_check_timestamp +LastEditedTimestamp,last_edited_timestamp +LastEngagementEvent,last_engagement_event +LastError,last_error +LastErrorCode,last_error_code +LastErrorMessage,last_error_message +LastEvaluatedBackupArn,last_evaluated_backup_arn +LastEvaluatedDate,last_evaluated_date +LastEvaluatedGlobalTableName,last_evaluated_global_table_name +LastEvaluatedKey,last_evaluated_key +LastEvaluatedShardId,last_evaluated_shard_id +LastEvaluatedStreamArn,last_evaluated_stream_arn +LastEvaluatedTableName,last_evaluated_table_name +LastEvaluatedTime,last_evaluated_time +LastEvaluationState,last_evaluation_state +LastEvaluationTime,last_evaluation_time +LastExecutionDate,last_execution_date +LastExecutionTime,last_execution_time +LastFailedEvaluationTime,last_failed_evaluation_time +LastFailedInvocationTime,last_failed_invocation_time +LastFailureMessage,last_failure_message +LastFailureTime,last_failure_time +LastFrameClippingBehavior,last_frame_clipping_behavior +LastFreshStart,last_fresh_start +LastGeneratedReportDate,last_generated_report_date +LastHealthCheckTime,last_health_check_time +LastHealthCheckTimestamp,last_health_check_timestamp +LastIncreaseDateTime,last_increase_date_time +LastIngestStateChange,last_ingest_state_change +LastInventoryDate,last_inventory_date +LastKeyGenerationTimestamp,last_key_generation_timestamp +LastKnownUserConnectionTimestamp,last_known_user_connection_timestamp +LastLaunchedTime,last_launched_time +LastMaintenanceApplied,last_maintenance_applied +LastMessageTimestamp,last_message_timestamp +LastModificationDate,last_modification_date +LastModificationTime,last_modification_time +LastModified,last_modified +LastModifiedAfter,last_modified_after +LastModifiedAt,last_modified_at +LastModifiedBefore,last_modified_before +LastModifiedBy,last_modified_by +LastModifiedDate,last_modified_date +LastModifiedDateCondition,last_modified_date_condition +LastModifiedDateTime,last_modified_date_time +LastModifiedOn,last_modified_on +LastModifiedTime,last_modified_time +LastModifiedTimeAfter,last_modified_time_after +LastModifiedTimeBefore,last_modified_time_before +LastModifiedTimestamp,last_modified_timestamp +LastModifiedUser,last_modified_user +LastMonitoringExecutionSummary,last_monitoring_execution_summary +LastName,last_name +LastNoRebootInstallOperationTime,last_no_reboot_install_operation_time +LastObservedAt,last_observed_at +LastOperationId,last_operation_id +LastPingDateTime,last_ping_date_time +LastProcessingResult,last_processing_result +LastProvisioningRecordId,last_provisioning_record_id +LastPublishedTime,last_published_time +LastRecordId,last_record_id +LastRecorderStatus,last_recorder_status +LastRecurrenceTime,last_recurrence_time +LastRefreshDate,last_refresh_date +LastReplicatedTimestamp,last_replicated_timestamp +LastReportGenerationExecutionError,last_report_generation_execution_error +LastReportGenerationTime,last_report_generation_time +LastReportedAt,last_reported_at +LastRequestedDateTime,last_requested_date_time +LastRestoreTime,last_restore_time +LastRotatedDate,last_rotated_date +LastRuleModification,last_rule_modification +LastRun,last_run +LastRunDetails,last_run_details +LastRunErrorStatus,last_run_error_status +LastRunFailureReason,last_run_failure_reason +LastRunStatus,last_run_status +LastRunSummary,last_run_summary +LastRunTime,last_run_time +LastRuntimeSeconds,last_runtime_seconds +LastSeen,last_seen +LastSeenDateTime,last_seen_date_time +LastSeenTime,last_seen_time +LastServiceErrorId,last_service_error_id +LastSoftwareUpdate,last_software_update +LastStarted,last_started +LastStateChangeAt,last_state_change_at +LastStateChangeReason,last_state_change_reason +LastStatus,last_status +LastStatusChange,last_status_change +LastStatusCheckDate,last_status_check_date +LastStatusMessage,last_status_message +LastStatusUpdateTime,last_status_update_time +LastStopped,last_stopped +LastSuccessfulAllocationTime,last_successful_allocation_time +LastSuccessfulAssociationExecutionDate,last_successful_association_execution_date +LastSuccessfulDeliveryTime,last_successful_delivery_time +LastSuccessfulDiscoveryTime,last_successful_discovery_time +LastSuccessfulEvaluationTime,last_successful_evaluation_time +LastSuccessfulExecutionDate,last_successful_execution_date +LastSuccessfulExecutionTime,last_successful_execution_time +LastSuccessfulInvocationTime,last_successful_invocation_time +LastSuccessfulMetadataSyncTime,last_successful_metadata_sync_time +LastSuccessfulProvisioningRecordId,last_successful_provisioning_record_id +LastSuccessfulSyncProvisioningArtifactId,last_successful_sync_provisioning_artifact_id +LastSuccessfulSyncTime,last_successful_sync_time +LastSuccessfullyAppliedConfigurations,last_successfully_applied_configurations +LastSuccessfullyAppliedConfigurationsVersion,last_successfully_applied_configurations_version +LastSuggestionsBuildTime,last_suggestions_build_time +LastSync,last_sync +LastSyncCount,last_sync_count +LastSyncStatus,last_sync_status +LastSyncStatusMessage,last_sync_status_message +LastSyncTime,last_sync_time +LastTieringOperationStatus,last_tiering_operation_status +LastTieringOperationStatusDetail,last_tiering_operation_status_detail +LastTieringProgress,last_tiering_progress +LastTieringStartTime,last_tiering_start_time +LastUpdate,last_update +LastUpdateAssociationDate,last_update_association_date +LastUpdateCompletedTime,last_update_completed_time +LastUpdateDate,last_update_date +LastUpdateDateTime,last_update_date_time +LastUpdateRequestedTime,last_update_requested_time +LastUpdateStatus,last_update_status +LastUpdateStatusReason,last_update_status_reason +LastUpdateStatusReasonCode,last_update_status_reason_code +LastUpdateTime,last_update_time +LastUpdateTimestamp,last_update_timestamp +LastUpdateToPayPerRequestDateTime,last_update_to_pay_per_request_date_time +LastUpdated,last_updated +LastUpdatedAt,last_updated_at +LastUpdatedBy,last_updated_by +LastUpdatedDate,last_updated_date +LastUpdatedDateTime,last_updated_date_time +LastUpdatedTime,last_updated_time +LastUpdatedTimeStamp,last_updated_time_stamp +LastUpdatedTimestamp,last_updated_timestamp +LastUplinkReceivedAt,last_uplink_received_at +LastUploaderStatus,last_uploader_status +LastUsedDate,last_used_date +LastUserActivityTimestamp,last_user_activity_timestamp +LastVPCAssociation,last_vpc_association +LastWritten,last_written +Lat,lat +LatLonOptions,lat_lon_options +LateDataRule,late_data_rule +LateDataRuleConfiguration,late_data_rule_configuration +Latency,latency +LatencyInMilliseconds,latency_in_milliseconds +LatencyInMs,latency_in_ms +LatencyMs,latency_ms +LatencyOther,latency_other +LatencyRead,latency_read +LatencyWrite,latency_write +Latest,latest +LatestAlternateSoftware,latest_alternate_software +LatestCloudWatchLogsDeliveryError,latest_cloud_watch_logs_delivery_error +LatestCloudWatchLogsDeliveryTime,latest_cloud_watch_logs_delivery_time +LatestDeliveryAttemptSucceeded,latest_delivery_attempt_succeeded +LatestDeliveryAttemptTime,latest_delivery_attempt_time +LatestDeliveryError,latest_delivery_error +LatestDeliveryTime,latest_delivery_time +LatestDeviceJob,latest_device_job +LatestDigestDeliveryError,latest_digest_delivery_error +LatestDigestDeliveryTime,latest_digest_delivery_time +LatestFlywheelIteration,latest_flywheel_iteration +LatestHeartbeat,latest_heartbeat +LatestHeartbeatAfter,latest_heartbeat_after +LatestInference,latest_inference +LatestInferenceResult,latest_inference_result +LatestIngestionAttemptEventID,latest_ingestion_attempt_event_id +LatestIngestionAttemptTime,latest_ingestion_attempt_time +LatestIngestionErrorCode,latest_ingestion_error_code +LatestIngestionSuccessEventID,latest_ingestion_success_event_id +LatestIngestionSuccessTime,latest_ingestion_success_time +LatestLensVersion,latest_lens_version +LatestMatchingVersion,latest_matching_version +LatestMetadataSyncStatus,latest_metadata_sync_status +LatestMetadataSyncStatusMessage,latest_metadata_sync_status_message +LatestNotificationAttemptSucceeded,latest_notification_attempt_succeeded +LatestNotificationAttemptTime,latest_notification_attempt_time +LatestNotificationError,latest_notification_error +LatestNotificationTime,latest_notification_time +LatestOnly,latest_only +LatestProfileVersion,latest_profile_version +LatestPublicVersion,latest_public_version +LatestRestorableDateTime,latest_restorable_date_time +LatestRestorableTime,latest_restorable_time +LatestRevision,latest_revision +LatestSampleTime,latest_sample_time +LatestScheduledRetrainingAvailableDataInDays,latest_scheduled_retraining_available_data_in_days +LatestScheduledRetrainingFailedReason,latest_scheduled_retraining_failed_reason +LatestScheduledRetrainingModelVersion,latest_scheduled_retraining_model_version +LatestScheduledRetrainingStartTime,latest_scheduled_retraining_start_time +LatestScheduledRetrainingStatus,latest_scheduled_retraining_status +LatestSchemaVersion,latest_schema_version +LatestSoftware,latest_software +LatestStreamArn,latest_stream_arn +LatestStreamLabel,latest_stream_label +LatestTime,latest_time +LatestUpdateAttemptAt,latest_update_attempt_at +LatestUpdateAttemptAuxiliaryDataLocation,latest_update_attempt_auxiliary_data_location +LatestUpdateAttemptStatus,latest_update_attempt_status +LatestUsageTimestamp,latest_usage_timestamp +LatestVersion,latest_version +LatestVersionArn,latest_version_arn +LatestVersionCreatedAt,latest_version_created_at +LatestVersionId,latest_version_id +LatestVersionMetadata,latest_version_metadata +LatestVersionName,latest_version_name +LatestVersionNumber,latest_version_number +LatestVersionSize,latest_version_size +LatestVersionStatus,latest_version_status +Latitude,latitude +Launch,launch +LaunchAction,launch_action +LaunchActionParameter,launch_action_parameter +LaunchActionRun,launch_action_run +LaunchActionsRequestFilters,launch_actions_request_filters +LaunchActionsStatus,launch_actions_status +LaunchAppRequest,launch_app_request +LaunchCommands,launch_commands +LaunchConfig,launch_config +LaunchConfiguration,launch_configuration +LaunchConfigurationARN,launch_configuration_arn +LaunchConfigurationName,launch_configuration_name +LaunchConfigurationNameType,launch_configuration_name_type +LaunchConfigurationNames,launch_configuration_names +LaunchConfigurationNamesType,launch_configuration_names_type +LaunchConfigurationTemplate,launch_configuration_template +LaunchConfigurations,launch_configurations +LaunchConfigurationsType,launch_configurations_type +LaunchDate,launch_date +LaunchDetails,launch_details +LaunchExecution,launch_execution +LaunchGroup,launch_group +LaunchGroupConfig,launch_group_config +LaunchOverrides,launch_overrides +LaunchParameters,launch_parameters +LaunchPath,launch_path +LaunchPathSummaries,launch_path_summaries +LaunchPathSummary,launch_path_summary +LaunchPaths,launch_paths +LaunchPermission,launch_permission +LaunchPermissionConfiguration,launch_permission_configuration +LaunchPermissionModifications,launch_permission_modifications +LaunchPermissions,launch_permissions +LaunchProfile,launch_profile +LaunchProfileInitialization,launch_profile_initialization +LaunchProfileInitializationActiveDirectory,launch_profile_initialization_active_directory +LaunchProfileInitializationScript,launch_profile_initialization_script +LaunchProfileMembership,launch_profile_membership +LaunchRoleArn,launch_role_arn +LaunchSpecification,launch_specification +LaunchSpecifications,launch_specifications +LaunchTemplate,launch_template +LaunchTemplateAndOverrides,launch_template_and_overrides +LaunchTemplateAndOverridesResponse,launch_template_and_overrides_response +LaunchTemplateBlockDeviceMapping,launch_template_block_device_mapping +LaunchTemplateBlockDeviceMappingRequest,launch_template_block_device_mapping_request +LaunchTemplateCapacityReservationSpecificationRequest,launch_template_capacity_reservation_specification_request +LaunchTemplateCapacityReservationSpecificationResponse,launch_template_capacity_reservation_specification_response +LaunchTemplateConfig,launch_template_config +LaunchTemplateConfigs,launch_template_configs +LaunchTemplateConfiguration,launch_template_configuration +LaunchTemplateCpuOptions,launch_template_cpu_options +LaunchTemplateCpuOptionsRequest,launch_template_cpu_options_request +LaunchTemplateData,launch_template_data +LaunchTemplateDiskConf,launch_template_disk_conf +LaunchTemplateEbsBlockDevice,launch_template_ebs_block_device +LaunchTemplateEbsBlockDeviceRequest,launch_template_ebs_block_device_request +LaunchTemplateElasticInferenceAccelerator,launch_template_elastic_inference_accelerator +LaunchTemplateElasticInferenceAcceleratorResponse,launch_template_elastic_inference_accelerator_response +LaunchTemplateEnclaveOptions,launch_template_enclave_options +LaunchTemplateEnclaveOptionsRequest,launch_template_enclave_options_request +LaunchTemplateHibernationOptions,launch_template_hibernation_options +LaunchTemplateHibernationOptionsRequest,launch_template_hibernation_options_request +LaunchTemplateIamInstanceProfileSpecification,launch_template_iam_instance_profile_specification +LaunchTemplateIamInstanceProfileSpecificationRequest,launch_template_iam_instance_profile_specification_request +LaunchTemplateId,launch_template_id +LaunchTemplateIds,launch_template_ids +LaunchTemplateInstanceMaintenanceOptions,launch_template_instance_maintenance_options +LaunchTemplateInstanceMaintenanceOptionsRequest,launch_template_instance_maintenance_options_request +LaunchTemplateInstanceMarketOptions,launch_template_instance_market_options +LaunchTemplateInstanceMarketOptionsRequest,launch_template_instance_market_options_request +LaunchTemplateInstanceMetadataOptions,launch_template_instance_metadata_options +LaunchTemplateInstanceMetadataOptionsRequest,launch_template_instance_metadata_options_request +LaunchTemplateInstanceNetworkInterfaceSpecification,launch_template_instance_network_interface_specification +LaunchTemplateInstanceNetworkInterfaceSpecificationRequest,launch_template_instance_network_interface_specification_request +LaunchTemplateLicenseConfiguration,launch_template_license_configuration +LaunchTemplateLicenseConfigurationRequest,launch_template_license_configuration_request +LaunchTemplateName,launch_template_name +LaunchTemplateNames,launch_template_names +LaunchTemplateOverrides,launch_template_overrides +LaunchTemplatePlacement,launch_template_placement +LaunchTemplatePlacementRequest,launch_template_placement_request +LaunchTemplatePrivateDnsNameOptions,launch_template_private_dns_name_options +LaunchTemplatePrivateDnsNameOptionsRequest,launch_template_private_dns_name_options_request +LaunchTemplateSpecification,launch_template_specification +LaunchTemplateSpotMarketOptions,launch_template_spot_market_options +LaunchTemplateSpotMarketOptionsRequest,launch_template_spot_market_options_request +LaunchTemplateTagSpecification,launch_template_tag_specification +LaunchTemplateTagSpecificationRequest,launch_template_tag_specification_request +LaunchTemplateVersion,launch_template_version +LaunchTemplateVersions,launch_template_versions +LaunchTemplates,launch_templates +LaunchTemplatesMonitoring,launch_templates_monitoring +LaunchTemplatesMonitoringRequest,launch_templates_monitoring_request +LaunchTime,launch_time +LaunchType,launch_type +LaunchedAt,launched_at +LaunchedAvailabilityZone,launched_availability_zone +LaunchedInstance,launched_instance +Layer,layer +LayerAlreadyExistsException,layer_already_exists_exception +LayerArn,layer_arn +LayerFailure,layer_failure +LayerId,layer_id +LayerIds,layer_ids +LayerInaccessibleException,layer_inaccessible_exception +LayerName,layer_name +LayerPartTooSmallException,layer_part_too_small_exception +LayerVersionArn,layer_version_arn +LayerVersionContentInput,layer_version_content_input +LayerVersionContentOutput,layer_version_content_output +LayerVersions,layer_versions +LayerVersionsListItem,layer_versions_list_item +Layers,layers +LayersCount,layers_count +LayersListItem,layers_list_item +LayersNotFoundException,layers_not_found_exception +Layout,layout +LayoutConfiguration,layout_configuration +LayoutSections,layout_sections +LayoutSummary,layout_summary +Layouts,layouts +LbCookieStickinessPolicies,lb_cookie_stickiness_policies +LcmOperationInfo,lcm_operation_info +LdPreloadValue,ld_preload_value +LdapServerMetadata,ldap_server_metadata +LdapServerMetadataInput,ldap_server_metadata_input +LdapServerMetadataOutput,ldap_server_metadata_output +LdifContent,ldif_content +LeaseExpirationTime,lease_expiration_time +LeaseId,lease_id +LedgerEncryptionDescription,ledger_encryption_description +LedgerName,ledger_name +LedgerSummary,ledger_summary +Ledgers,ledgers +Left,left +LeftJoinKeyProperties,left_join_key_properties +LeftOffset,left_offset +LeftOperand,left_operand +Leg,leg +LegGeometry,leg_geometry +LegalHold,legal_hold +LegalHoldArn,legal_hold_arn +LegalHoldId,legal_hold_id +LegalHolds,legal_holds +Legend,legend +LegendOptions,legend_options +Legs,legs +LendingDetection,lending_detection +LendingDocument,lending_document +LendingField,lending_field +LendingFields,lending_fields +LendingResult,lending_result +LendingSummary,lending_summary +Length,length +Lens,lens +LensAlias,lens_alias +LensAliases,lens_aliases +LensArn,lens_arn +LensJSON,lens_json +LensMetric,lens_metric +LensName,lens_name +LensNamePrefix,lens_name_prefix +LensNotes,lens_notes +LensReview,lens_review +LensReviewReport,lens_review_report +LensReviewSummaries,lens_review_summaries +LensReviewSummary,lens_review_summary +LensShareSummaries,lens_share_summaries +LensShareSummary,lens_share_summary +LensStatus,lens_status +LensSummaries,lens_summaries +LensSummary,lens_summary +LensType,lens_type +LensUpgradeSummary,lens_upgrade_summary +LensVersion,lens_version +Lenses,lenses +LensesAppliedCount,lenses_applied_count +LessThan,less_than +LessThanOrEqual,less_than_or_equal +LessThanOrEquals,less_than_or_equals +Level,level +LevelFive,level_five +LevelFour,level_four +LevelId,level_id +LevelOne,level_one +LevelThree,level_three +LevelTwo,level_two +Lex,lex +LexBot,lex_bot +LexBotAliasArn,lex_bot_alias_arn +LexBotConfig,lex_bot_config +LexBots,lex_bots +LexConfiguration,lex_configuration +LexRegion,lex_region +LexTranscriptFilter,lex_transcript_filter +LexV2Bot,lex_v2_bot +LexVersion,lex_version +LexemesCount,lexemes_count +Lexicon,lexicon +LexiconArn,lexicon_arn +LexiconAttributes,lexicon_attributes +LexiconDescription,lexicon_description +LexiconNames,lexicon_names +LexiconNotFoundException,lexicon_not_found_exception +LexiconSizeExceededException,lexicon_size_exceeded_exception +Lexicons,lexicons +LfeControl,lfe_control +LfeFilter,lfe_filter +LibraryPath,library_path +License,license +LicenseAcquisitionUrl,license_acquisition_url +LicenseArn,license_arn +LicenseArns,license_arns +LicenseBody,license_body +LicenseConfiguration,license_configuration +LicenseConfigurationArn,license_configuration_arn +LicenseConfigurationArns,license_configuration_arns +LicenseConfigurationAssociation,license_configuration_association +LicenseConfigurationAssociations,license_configuration_associations +LicenseConfigurationId,license_configuration_id +LicenseConfigurationRequest,license_configuration_request +LicenseConfigurationStatus,license_configuration_status +LicenseConfigurationUsage,license_configuration_usage +LicenseConfigurationUsageList,license_configuration_usage_list +LicenseConfigurations,license_configurations +LicenseConsumptionToken,license_consumption_token +LicenseConversionContext,license_conversion_context +LicenseConversionTask,license_conversion_task +LicenseConversionTaskId,license_conversion_task_id +LicenseConversionTasks,license_conversion_tasks +LicenseConversionTime,license_conversion_time +LicenseCount,license_count +LicenseCountHardLimit,license_count_hard_limit +LicenseCountingType,license_counting_type +LicenseInfo,license_info +LicenseManagerReportGeneratorArn,license_manager_report_generator_arn +LicenseManagerResourceShareArn,license_manager_resource_share_arn +LicenseMetadata,license_metadata +LicenseModel,license_model +LicenseName,license_name +LicenseOperationFailure,license_operation_failure +LicenseOperationFailureList,license_operation_failure_list +LicenseRecommendation,license_recommendation +LicenseRecommendationFilter,license_recommendation_filter +LicenseRecommendationOption,license_recommendation_option +LicenseRules,license_rules +LicenseServiceConfiguration,license_service_configuration +LicenseSet,license_set +LicenseSpecification,license_specification +LicenseSpecifications,license_specifications +LicenseType,license_type +LicenseUrl,license_url +LicenseUsage,license_usage +LicenseUsageException,license_usage_exception +Licenses,licenses +Licensing,licensing +LifeCycle,life_cycle +LifeCycleLastCutover,life_cycle_last_cutover +LifeCycleLastCutoverFinalized,life_cycle_last_cutover_finalized +LifeCycleLastCutoverInitiated,life_cycle_last_cutover_initiated +LifeCycleLastCutoverReverted,life_cycle_last_cutover_reverted +LifeCycleLastLaunch,life_cycle_last_launch +LifeCycleLastLaunchInitiated,life_cycle_last_launch_initiated +LifeCycleLastTest,life_cycle_last_test +LifeCycleLastTestFinalized,life_cycle_last_test_finalized +LifeCycleLastTestInitiated,life_cycle_last_test_initiated +LifeCycleLastTestReverted,life_cycle_last_test_reverted +LifeCycleState,life_cycle_state +LifeCycleStatus,life_cycle_status +LifeCycleStatusFilter,life_cycle_status_filter +Lifecycle,lifecycle +LifecycleActionResult,lifecycle_action_result +LifecycleActionToken,lifecycle_action_token +LifecycleConfigArn,lifecycle_config_arn +LifecycleConfigArns,lifecycle_config_arns +LifecycleConfigName,lifecycle_config_name +LifecycleConfiguration,lifecycle_configuration +LifecycleConfigurationDescription,lifecycle_configuration_description +LifecycleEvent,lifecycle_event +LifecycleEventAlreadyCompletedException,lifecycle_event_already_completed_exception +LifecycleEventConfiguration,lifecycle_event_configuration +LifecycleExpiration,lifecycle_expiration +LifecycleHook,lifecycle_hook +LifecycleHookLimitExceededException,lifecycle_hook_limit_exceeded_exception +LifecycleHookName,lifecycle_hook_name +LifecycleHookNames,lifecycle_hook_names +LifecycleHookSpecification,lifecycle_hook_specification +LifecycleHookSpecificationList,lifecycle_hook_specification_list +LifecycleHookTypes,lifecycle_hook_types +LifecycleHooks,lifecycle_hooks +LifecyclePolicies,lifecycle_policies +LifecyclePolicy,lifecycle_policy +LifecyclePolicyNotFoundException,lifecycle_policy_not_found_exception +LifecyclePolicyPreviewFilter,lifecycle_policy_preview_filter +LifecyclePolicyPreviewInProgressException,lifecycle_policy_preview_in_progress_exception +LifecyclePolicyPreviewNotFoundException,lifecycle_policy_preview_not_found_exception +LifecyclePolicyPreviewResult,lifecycle_policy_preview_result +LifecyclePolicyPreviewSummary,lifecycle_policy_preview_summary +LifecyclePolicyRuleAction,lifecycle_policy_rule_action +LifecyclePolicySummary,lifecycle_policy_summary +LifecyclePolicyText,lifecycle_policy_text +LifecycleRule,lifecycle_rule +LifecycleRuleAndOperator,lifecycle_rule_and_operator +LifecycleRuleFilter,lifecycle_rule_filter +LifecycleState,lifecycle_state +LifecycleTransition,lifecycle_transition +LifecycleTransitionReason,lifecycle_transition_reason +LifetimeInSeconds,lifetime_in_seconds +LightsailDistribution,lightsail_distribution +Limit,limit +LimitCode,limit_code +LimitExceeded,limit_exceeded +LimitExceededException,limit_exceeded_exception +LimitExceededFault,limit_exceeded_fault +LimitName,limit_name +LimitPrice,limit_price +LimitType,limit_type +LimitValue,limit_value +LimitValues,limit_values +Limitation,limitation +Limitations,limitations +Limits,limits +LimitsByRole,limits_by_role +LimitsExceeded,limits_exceeded +LimitsExceededException,limits_exceeded_exception +Line,line +LineChartAggregatedFieldWells,line_chart_aggregated_field_wells +LineChartConfiguration,line_chart_configuration +LineChartDefaultSeriesSettings,line_chart_default_series_settings +LineChartFieldWells,line_chart_field_wells +LineChartLineStyleSettings,line_chart_line_style_settings +LineChartMarkerStyleSettings,line_chart_marker_style_settings +LineChartSeriesSettings,line_chart_series_settings +LineChartSortConfiguration,line_chart_sort_configuration +LineChartVisual,line_chart_visual +LineDataLabels,line_data_labels +LineInterpolation,line_interpolation +LineItem,line_item +LineItemAssetInformation,line_item_asset_information +LineItemCountsByStatus,line_item_counts_by_status +LineItemExpenseFields,line_item_expense_fields +LineItemFields,line_item_fields +LineItemFilter,line_item_filter +LineItemFilters,line_item_filters +LineItemGroup,line_item_group +LineItemGroupIndex,line_item_group_index +LineItemGroups,line_item_groups +LineItemId,line_item_id +LineItemRequest,line_item_request +LineItems,line_items +LineNumber,line_number +LineRange,line_range +LineRanges,line_ranges +LineSeriesAxisDisplayOptions,line_series_axis_display_options +LineString,line_string +LineStyle,line_style +LineStyleSettings,line_style_settings +LineTime,line_time +LineValues,line_values +LineVisibility,line_visibility +LineWidth,line_width +Lineage,lineage +LineageConfiguration,lineage_configuration +LineageGroupArn,lineage_group_arn +LineageGroupName,lineage_group_name +LineageGroupSummaries,lineage_group_summaries +LineageGroupSummary,lineage_group_summary +LineageObject,lineage_object +LineageType,lineage_type +LineageTypes,lineage_types +Linear,linear +LinearStepSize,linear_step_size +Link,link +LinkArn,link_arn +LinkAssociation,link_association +LinkAssociationState,link_association_state +LinkAssociations,link_associations +LinkAttributeAction,link_attribute_action +LinkAttributeUpdate,link_attribute_update +LinkConfiguration,link_configuration +LinkId,link_id +LinkIds,link_ids +LinkName,link_name +LinkNameAlreadyInUseException,link_name_already_in_use_exception +LinkSharingConfiguration,link_sharing_configuration +LinkSpecifiers,link_specifiers +LinkToDataSetColumn,link_to_data_set_column +LinkedAccount,linked_account +LinkedAccountIds,linked_account_ids +LinkedAccountName,linked_account_name +LinkedAccounts,linked_accounts +LinkedService,linked_service +Links,links +LinuxParameters,linux_parameters +LinuxSubscriptionsDiscovery,linux_subscriptions_discovery +LinuxSubscriptionsDiscoverySettings,linux_subscriptions_discovery_settings +List,list +ListAPIKeysRequest,list_api_keys_request +ListAPIKeysResponse,list_api_keys_response +ListAWSDefaultServiceQuotasRequest,list_aws_default_service_quotas_request +ListAWSDefaultServiceQuotasResponse,list_aws_default_service_quotas_response +ListAWSServiceAccessForOrganizationRequest,list_aws_service_access_for_organization_request +ListAWSServiceAccessForOrganizationResponse,list_aws_service_access_for_organization_response +ListAcceleratorsRequest,list_accelerators_request +ListAcceleratorsResponse,list_accelerators_response +ListAcceptedPortfolioSharesInput,list_accepted_portfolio_shares_input +ListAcceptedPortfolioSharesOutput,list_accepted_portfolio_shares_output +ListAccessControlConfigurationsRequest,list_access_control_configurations_request +ListAccessControlConfigurationsResponse,list_access_control_configurations_response +ListAccessControlRulesRequest,list_access_control_rules_request +ListAccessControlRulesResponse,list_access_control_rules_response +ListAccessKeysRequest,list_access_keys_request +ListAccessKeysResponse,list_access_keys_response +ListAccessLogSubscriptionsRequest,list_access_log_subscriptions_request +ListAccessLogSubscriptionsResponse,list_access_log_subscriptions_response +ListAccessPointsForObjectLambdaRequest,list_access_points_for_object_lambda_request +ListAccessPointsForObjectLambdaResult,list_access_points_for_object_lambda_result +ListAccessPointsRequest,list_access_points_request +ListAccessPointsResult,list_access_points_result +ListAccessPoliciesRequest,list_access_policies_request +ListAccessPoliciesResponse,list_access_policies_response +ListAccessPreviewFindingsRequest,list_access_preview_findings_request +ListAccessPreviewFindingsResponse,list_access_preview_findings_response +ListAccessPreviewsRequest,list_access_previews_request +ListAccessPreviewsResponse,list_access_previews_response +ListAccessTokensRequest,list_access_tokens_request +ListAccessTokensResponse,list_access_tokens_response +ListAccessesRequest,list_accesses_request +ListAccessesResponse,list_accesses_response +ListAccessorsInput,list_accessors_input +ListAccessorsOutput,list_accessors_output +ListAccountAliasesRequest,list_account_aliases_request +ListAccountAliasesResponse,list_account_aliases_response +ListAccountAssignmentCreationStatusRequest,list_account_assignment_creation_status_request +ListAccountAssignmentCreationStatusResponse,list_account_assignment_creation_status_response +ListAccountAssignmentDeletionStatusRequest,list_account_assignment_deletion_status_request +ListAccountAssignmentDeletionStatusResponse,list_account_assignment_deletion_status_response +ListAccountAssignmentsRequest,list_account_assignments_request +ListAccountAssignmentsResponse,list_account_assignments_response +ListAccountAssociationsFilter,list_account_associations_filter +ListAccountAssociationsInput,list_account_associations_input +ListAccountAssociationsOutput,list_account_associations_output +ListAccountIntegrationsRequest,list_account_integrations_request +ListAccountIntegrationsResponse,list_account_integrations_response +ListAccountPermissionsRequest,list_account_permissions_request +ListAccountPermissionsResponse,list_account_permissions_response +ListAccountRolesRequest,list_account_roles_request +ListAccountRolesResponse,list_account_roles_response +ListAccountSettingsRequest,list_account_settings_request +ListAccountSettingsResponse,list_account_settings_response +ListAccountsForParentRequest,list_accounts_for_parent_request +ListAccountsForParentResponse,list_accounts_for_parent_response +ListAccountsForProvisionedPermissionSetRequest,list_accounts_for_provisioned_permission_set_request +ListAccountsForProvisionedPermissionSetResponse,list_accounts_for_provisioned_permission_set_response +ListAccountsRequest,list_accounts_request +ListAccountsResponse,list_accounts_response +ListActionExecutionsInput,list_action_executions_input +ListActionExecutionsOutput,list_action_executions_output +ListActionTypesInput,list_action_types_input +ListActionTypesOutput,list_action_types_output +ListActionsRequest,list_actions_request +ListActionsResponse,list_actions_response +ListActivatedRulesInRuleGroupRequest,list_activated_rules_in_rule_group_request +ListActivatedRulesInRuleGroupResponse,list_activated_rules_in_rule_group_response +ListActiveViolationsRequest,list_active_violations_request +ListActiveViolationsResponse,list_active_violations_response +ListActivitiesInput,list_activities_input +ListActivitiesOutput,list_activities_output +ListActivityTypesInput,list_activity_types_input +ListAddonsRequest,list_addons_request +ListAddonsResponse,list_addons_response +ListAdminAccountsForOrganizationRequest,list_admin_accounts_for_organization_request +ListAdminAccountsForOrganizationResponse,list_admin_accounts_for_organization_response +ListAdminsManagingAccountRequest,list_admins_managing_account_request +ListAdminsManagingAccountResponse,list_admins_managing_account_response +ListAgentStatusRequest,list_agent_status_request +ListAgentStatusResponse,list_agent_status_response +ListAgentsRequest,list_agents_request +ListAgentsResponse,list_agents_response +ListAggregateDiscoveredResourcesRequest,list_aggregate_discovered_resources_request +ListAggregateDiscoveredResourcesResponse,list_aggregate_discovered_resources_response +ListAggregatedUtterancesRequest,list_aggregated_utterances_request +ListAggregatedUtterancesResponse,list_aggregated_utterances_response +ListAgreementsRequest,list_agreements_request +ListAgreementsResponse,list_agreements_response +ListAlarmModelVersionsRequest,list_alarm_model_versions_request +ListAlarmModelVersionsResponse,list_alarm_model_versions_response +ListAlarmModelsRequest,list_alarm_models_request +ListAlarmModelsResponse,list_alarm_models_response +ListAlarmRecommendationsRequest,list_alarm_recommendations_request +ListAlarmRecommendationsResponse,list_alarm_recommendations_response +ListAlarmsRequest,list_alarms_request +ListAlarmsResponse,list_alarms_response +ListAlertsRequest,list_alerts_request +ListAlertsResponse,list_alerts_response +ListAlgorithmsInput,list_algorithms_input +ListAlgorithmsOutput,list_algorithms_output +ListAliasesInput,list_aliases_input +ListAliasesOutput,list_aliases_output +ListAliasesRequest,list_aliases_request +ListAliasesResponse,list_aliases_response +ListAllowListsRequest,list_allow_lists_request +ListAllowListsResponse,list_allow_lists_response +ListAllowedNodeTypeModificationsMessage,list_allowed_node_type_modifications_message +ListAllowedNodeTypeUpdatesRequest,list_allowed_node_type_updates_request +ListAllowedNodeTypeUpdatesResponse,list_allowed_node_type_updates_response +ListAnalysesRequest,list_analyses_request +ListAnalysesResponse,list_analyses_response +ListAnalysisTemplatesInput,list_analysis_templates_input +ListAnalysisTemplatesOutput,list_analysis_templates_output +ListAnalyzedResourcesRequest,list_analyzed_resources_request +ListAnalyzedResourcesResponse,list_analyzed_resources_response +ListAnalyzersRequest,list_analyzers_request +ListAnalyzersResponse,list_analyzers_response +ListAnnotationImportJobsFilter,list_annotation_import_jobs_filter +ListAnnotationImportJobsRequest,list_annotation_import_jobs_request +ListAnnotationImportJobsResponse,list_annotation_import_jobs_response +ListAnnotationStoreVersionsFilter,list_annotation_store_versions_filter +ListAnnotationStoreVersionsRequest,list_annotation_store_versions_request +ListAnnotationStoreVersionsResponse,list_annotation_store_versions_response +ListAnnotationStoresFilter,list_annotation_stores_filter +ListAnnotationStoresRequest,list_annotation_stores_request +ListAnnotationStoresResponse,list_annotation_stores_response +ListAnomaliesForInsightFilters,list_anomalies_for_insight_filters +ListAnomaliesForInsightRequest,list_anomalies_for_insight_request +ListAnomaliesForInsightResponse,list_anomalies_for_insight_response +ListAnomalousLogGroupsRequest,list_anomalous_log_groups_request +ListAnomalousLogGroupsResponse,list_anomalous_log_groups_response +ListAnomalyDetectorsRequest,list_anomaly_detectors_request +ListAnomalyDetectorsResponse,list_anomaly_detectors_response +ListAnomalyGroupRelatedMetricsRequest,list_anomaly_group_related_metrics_request +ListAnomalyGroupRelatedMetricsResponse,list_anomaly_group_related_metrics_response +ListAnomalyGroupSummariesRequest,list_anomaly_group_summaries_request +ListAnomalyGroupSummariesResponse,list_anomaly_group_summaries_response +ListAnomalyGroupTimeSeriesRequest,list_anomaly_group_time_series_request +ListAnomalyGroupTimeSeriesResponse,list_anomaly_group_time_series_response +ListAnswersInput,list_answers_input +ListAnswersOutput,list_answers_output +ListApiDestinationsRequest,list_api_destinations_request +ListApiDestinationsResponse,list_api_destinations_response +ListApiKeysRequest,list_api_keys_request +ListApiKeysResponse,list_api_keys_response +ListAppAssessmentComplianceDriftsRequest,list_app_assessment_compliance_drifts_request +ListAppAssessmentComplianceDriftsResponse,list_app_assessment_compliance_drifts_response +ListAppAssessmentsRequest,list_app_assessments_request +ListAppAssessmentsResponse,list_app_assessments_response +ListAppAuthorizationsRequest,list_app_authorizations_request +ListAppAuthorizationsResponse,list_app_authorizations_response +ListAppBundlesRequest,list_app_bundles_request +ListAppBundlesResponse,list_app_bundles_response +ListAppComponentCompliancesRequest,list_app_component_compliances_request +ListAppComponentCompliancesResponse,list_app_component_compliances_response +ListAppComponentRecommendationsRequest,list_app_component_recommendations_request +ListAppComponentRecommendationsResponse,list_app_component_recommendations_response +ListAppImageConfigsRequest,list_app_image_configs_request +ListAppImageConfigsResponse,list_app_image_configs_response +ListAppInputSourcesRequest,list_app_input_sources_request +ListAppInputSourcesResponse,list_app_input_sources_response +ListAppInstanceAdminsRequest,list_app_instance_admins_request +ListAppInstanceAdminsResponse,list_app_instance_admins_response +ListAppInstanceBotsRequest,list_app_instance_bots_request +ListAppInstanceBotsResponse,list_app_instance_bots_response +ListAppInstanceUserEndpointsRequest,list_app_instance_user_endpoints_request +ListAppInstanceUserEndpointsResponse,list_app_instance_user_endpoints_response +ListAppInstanceUsersRequest,list_app_instance_users_request +ListAppInstanceUsersResponse,list_app_instance_users_response +ListAppInstancesRequest,list_app_instances_request +ListAppInstancesResponse,list_app_instances_response +ListAppMonitorsRequest,list_app_monitors_request +ListAppMonitorsResponse,list_app_monitors_response +ListAppVersionAppComponentsRequest,list_app_version_app_components_request +ListAppVersionAppComponentsResponse,list_app_version_app_components_response +ListAppVersionResourceMappingsRequest,list_app_version_resource_mappings_request +ListAppVersionResourceMappingsResponse,list_app_version_resource_mappings_response +ListAppVersionResourcesRequest,list_app_version_resources_request +ListAppVersionResourcesResponse,list_app_version_resources_response +ListAppVersionsRequest,list_app_versions_request +ListAppVersionsResponse,list_app_versions_response +ListApplicationComponentsRequest,list_application_components_request +ListApplicationComponentsResponse,list_application_components_response +ListApplicationDPUSizesInput,list_application_dpu_sizes_input +ListApplicationDPUSizesOutput,list_application_dpu_sizes_output +ListApplicationDependenciesRequest,list_application_dependencies_request +ListApplicationDependenciesResponse,list_application_dependencies_response +ListApplicationInstanceDependenciesRequest,list_application_instance_dependencies_request +ListApplicationInstanceDependenciesResponse,list_application_instance_dependencies_response +ListApplicationInstanceNodeInstancesRequest,list_application_instance_node_instances_request +ListApplicationInstanceNodeInstancesResponse,list_application_instance_node_instances_response +ListApplicationInstancesRequest,list_application_instances_request +ListApplicationInstancesResponse,list_application_instances_response +ListApplicationRevisionsInput,list_application_revisions_input +ListApplicationRevisionsOutput,list_application_revisions_output +ListApplicationSnapshotsRequest,list_application_snapshots_request +ListApplicationSnapshotsResponse,list_application_snapshots_response +ListApplicationStatesRequest,list_application_states_request +ListApplicationStatesResult,list_application_states_result +ListApplicationVersionsRequest,list_application_versions_request +ListApplicationVersionsResponse,list_application_versions_response +ListApplicationsInput,list_applications_input +ListApplicationsOutput,list_applications_output +ListApplicationsRequest,list_applications_request +ListApplicationsRequestFilters,list_applications_request_filters +ListApplicationsResponse,list_applications_response +ListAppliedSchemaArnsRequest,list_applied_schema_arns_request +ListAppliedSchemaArnsResponse,list_applied_schema_arns_response +ListApprovalRuleTemplatesInput,list_approval_rule_templates_input +ListApprovalRuleTemplatesOutput,list_approval_rule_templates_output +ListApprovedOriginsRequest,list_approved_origins_request +ListApprovedOriginsResponse,list_approved_origins_response +ListAppsInput,list_apps_input +ListAppsListsRequest,list_apps_lists_request +ListAppsListsResponse,list_apps_lists_response +ListAppsOutput,list_apps_output +ListAppsRequest,list_apps_request +ListAppsResponse,list_apps_response +ListAppsResult,list_apps_result +ListArchiveRulesRequest,list_archive_rules_request +ListArchiveRulesResponse,list_archive_rules_response +ListArchivesRequest,list_archives_request +ListArchivesResponse,list_archives_response +ListArn,list_arn +ListArtifactsRequest,list_artifacts_request +ListArtifactsResponse,list_artifacts_response +ListArtifactsResult,list_artifacts_result +ListAssessmentControlInsightsByControlDomainRequest,list_assessment_control_insights_by_control_domain_request +ListAssessmentControlInsightsByControlDomainResponse,list_assessment_control_insights_by_control_domain_response +ListAssessmentFrameworkShareRequestsRequest,list_assessment_framework_share_requests_request +ListAssessmentFrameworkShareRequestsResponse,list_assessment_framework_share_requests_response +ListAssessmentFrameworksRequest,list_assessment_frameworks_request +ListAssessmentFrameworksResponse,list_assessment_frameworks_response +ListAssessmentReportsRequest,list_assessment_reports_request +ListAssessmentReportsResponse,list_assessment_reports_response +ListAssessmentRunAgentsRequest,list_assessment_run_agents_request +ListAssessmentRunAgentsResponse,list_assessment_run_agents_response +ListAssessmentRunsRequest,list_assessment_runs_request +ListAssessmentRunsResponse,list_assessment_runs_response +ListAssessmentTargetsRequest,list_assessment_targets_request +ListAssessmentTargetsResponse,list_assessment_targets_response +ListAssessmentTemplatesRequest,list_assessment_templates_request +ListAssessmentTemplatesResponse,list_assessment_templates_response +ListAssessmentsRequest,list_assessments_request +ListAssessmentsResponse,list_assessments_response +ListAssetBundleExportJobsRequest,list_asset_bundle_export_jobs_request +ListAssetBundleExportJobsResponse,list_asset_bundle_export_jobs_response +ListAssetBundleImportJobsRequest,list_asset_bundle_import_jobs_request +ListAssetBundleImportJobsResponse,list_asset_bundle_import_jobs_response +ListAssetModelPropertiesRequest,list_asset_model_properties_request +ListAssetModelPropertiesResponse,list_asset_model_properties_response +ListAssetModelsRequest,list_asset_models_request +ListAssetModelsResponse,list_asset_models_response +ListAssetPropertiesRequest,list_asset_properties_request +ListAssetPropertiesResponse,list_asset_properties_response +ListAssetRelationshipsRequest,list_asset_relationships_request +ListAssetRelationshipsResponse,list_asset_relationships_response +ListAssetsInput,list_assets_input +ListAssetsOutput,list_assets_output +ListAssetsRequest,list_assets_request +ListAssetsResponse,list_assets_response +ListAssignmentsForHITRequest,list_assignments_for_hit_request +ListAssignmentsForHITResponse,list_assignments_for_hit_response +ListAssistantAssociationsRequest,list_assistant_associations_request +ListAssistantAssociationsResponse,list_assistant_associations_response +ListAssistantsRequest,list_assistants_request +ListAssistantsResponse,list_assistants_response +ListAssociatedApprovalRuleTemplatesForRepositoryInput,list_associated_approval_rule_templates_for_repository_input +ListAssociatedApprovalRuleTemplatesForRepositoryOutput,list_associated_approval_rule_templates_for_repository_output +ListAssociatedAssetsRequest,list_associated_assets_request +ListAssociatedAssetsResponse,list_associated_assets_response +ListAssociatedAttributeGroupsRequest,list_associated_attribute_groups_request +ListAssociatedAttributeGroupsResponse,list_associated_attribute_groups_response +ListAssociatedFleetsRequest,list_associated_fleets_request +ListAssociatedFleetsResult,list_associated_fleets_result +ListAssociatedGroupsRequest,list_associated_groups_request +ListAssociatedGroupsResponse,list_associated_groups_response +ListAssociatedResourcesRequest,list_associated_resources_request +ListAssociatedResourcesResponse,list_associated_resources_response +ListAssociatedRoute53HealthChecksRequest,list_associated_route53_health_checks_request +ListAssociatedRoute53HealthChecksResponse,list_associated_route53_health_checks_response +ListAssociatedStacksRequest,list_associated_stacks_request +ListAssociatedStacksResult,list_associated_stacks_result +ListAssociationVersionsRequest,list_association_versions_request +ListAssociationVersionsResult,list_association_versions_result +ListAssociationsForLicenseConfigurationRequest,list_associations_for_license_configuration_request +ListAssociationsForLicenseConfigurationResponse,list_associations_for_license_configuration_response +ListAssociationsRequest,list_associations_request +ListAssociationsResponse,list_associations_response +ListAssociationsResult,list_associations_result +ListAttachedGroupPoliciesRequest,list_attached_group_policies_request +ListAttachedGroupPoliciesResponse,list_attached_group_policies_response +ListAttachedIndices,list_attached_indices +ListAttachedIndicesRequest,list_attached_indices_request +ListAttachedIndicesResponse,list_attached_indices_response +ListAttachedLinksInput,list_attached_links_input +ListAttachedLinksItem,list_attached_links_item +ListAttachedLinksOutput,list_attached_links_output +ListAttachedPoliciesRequest,list_attached_policies_request +ListAttachedPoliciesResponse,list_attached_policies_response +ListAttachedRolePoliciesRequest,list_attached_role_policies_request +ListAttachedRolePoliciesResponse,list_attached_role_policies_response +ListAttachedUserPoliciesRequest,list_attached_user_policies_request +ListAttachedUserPoliciesResponse,list_attached_user_policies_response +ListAttachmentsRequest,list_attachments_request +ListAttachmentsResponse,list_attachments_response +ListAttacksRequest,list_attacks_request +ListAttacksResponse,list_attacks_response +ListAttendeeTagsRequest,list_attendee_tags_request +ListAttendeeTagsResponse,list_attendee_tags_response +ListAttendeesRequest,list_attendees_request +ListAttendeesResponse,list_attendees_response +ListAttributeGroupsForApplicationRequest,list_attribute_groups_for_application_request +ListAttributeGroupsForApplicationResponse,list_attribute_groups_for_application_response +ListAttributeGroupsRequest,list_attribute_groups_request +ListAttributeGroupsResponse,list_attribute_groups_response +ListAttributesRequest,list_attributes_request +ListAttributesResponse,list_attributes_response +ListAuditFindingsRequest,list_audit_findings_request +ListAuditFindingsResponse,list_audit_findings_response +ListAuditMitigationActionsExecutionsRequest,list_audit_mitigation_actions_executions_request +ListAuditMitigationActionsExecutionsResponse,list_audit_mitigation_actions_executions_response +ListAuditMitigationActionsTasksRequest,list_audit_mitigation_actions_tasks_request +ListAuditMitigationActionsTasksResponse,list_audit_mitigation_actions_tasks_response +ListAuditSuppressionsRequest,list_audit_suppressions_request +ListAuditSuppressionsResponse,list_audit_suppressions_response +ListAuditTasksRequest,list_audit_tasks_request +ListAuditTasksResponse,list_audit_tasks_response +ListAuthorizersRequest,list_authorizers_request +ListAuthorizersResponse,list_authorizers_response +ListAutoMLJobsRequest,list_auto_ml_jobs_request +ListAutoMLJobsResponse,list_auto_ml_jobs_response +ListAutoScalingConfigurationsRequest,list_auto_scaling_configurations_request +ListAutoScalingConfigurationsResponse,list_auto_scaling_configurations_response +ListAutomaticTapeCreationPoliciesInput,list_automatic_tape_creation_policies_input +ListAutomaticTapeCreationPoliciesOutput,list_automatic_tape_creation_policies_output +ListAutomationRulesRequest,list_automation_rules_request +ListAutomationRulesResponse,list_automation_rules_response +ListAvailabilityConfigurationsRequest,list_availability_configurations_request +ListAvailabilityConfigurationsResponse,list_availability_configurations_response +ListAvailableManagedRuleGroupVersionsRequest,list_available_managed_rule_group_versions_request +ListAvailableManagedRuleGroupVersionsResponse,list_available_managed_rule_group_versions_response +ListAvailableManagedRuleGroupsRequest,list_available_managed_rule_groups_request +ListAvailableManagedRuleGroupsResponse,list_available_managed_rule_groups_response +ListAvailableManagementCidrRangesRequest,list_available_management_cidr_ranges_request +ListAvailableManagementCidrRangesResult,list_available_management_cidr_ranges_result +ListAvailableResourceDimensionsRequest,list_available_resource_dimensions_request +ListAvailableResourceDimensionsResponse,list_available_resource_dimensions_response +ListAvailableResourceMetricsRequest,list_available_resource_metrics_request +ListAvailableResourceMetricsResponse,list_available_resource_metrics_response +ListAvailableSolutionStacksResultMessage,list_available_solution_stacks_result_message +ListAvailableVoiceConnectorRegionsResponse,list_available_voice_connector_regions_response +ListAvailableZonesResponse,list_available_zones_response +ListBackendEnvironmentsRequest,list_backend_environments_request +ListBackendEnvironmentsResult,list_backend_environments_result +ListBackendJobsRequest,list_backend_jobs_request +ListBackendJobsResponse,list_backend_jobs_response +ListBackupJobsInput,list_backup_jobs_input +ListBackupJobsOutput,list_backup_jobs_output +ListBackupPlanTemplatesInput,list_backup_plan_templates_input +ListBackupPlanTemplatesOutput,list_backup_plan_templates_output +ListBackupPlanVersionsInput,list_backup_plan_versions_input +ListBackupPlanVersionsOutput,list_backup_plan_versions_output +ListBackupPlansInput,list_backup_plans_input +ListBackupPlansOutput,list_backup_plans_output +ListBackupSelectionsInput,list_backup_selections_input +ListBackupSelectionsOutput,list_backup_selections_output +ListBackupVaultsInput,list_backup_vaults_input +ListBackupVaultsOutput,list_backup_vaults_output +ListBackupsInput,list_backups_input +ListBackupsOutput,list_backups_output +ListBatchInferenceJobsRequest,list_batch_inference_jobs_request +ListBatchInferenceJobsResponse,list_batch_inference_jobs_response +ListBatchJobDefinitionsRequest,list_batch_job_definitions_request +ListBatchJobDefinitionsResponse,list_batch_job_definitions_response +ListBatchJobExecutionsRequest,list_batch_job_executions_request +ListBatchJobExecutionsResponse,list_batch_job_executions_response +ListBatchLoadTasksRequest,list_batch_load_tasks_request +ListBatchLoadTasksResponse,list_batch_load_tasks_response +ListBatchSegmentJobsRequest,list_batch_segment_jobs_request +ListBatchSegmentJobsResponse,list_batch_segment_jobs_response +ListBillingGroupAccountGrouping,list_billing_group_account_grouping +ListBillingGroupCostReportsFilter,list_billing_group_cost_reports_filter +ListBillingGroupCostReportsInput,list_billing_group_cost_reports_input +ListBillingGroupCostReportsOutput,list_billing_group_cost_reports_output +ListBillingGroupsFilter,list_billing_groups_filter +ListBillingGroupsInput,list_billing_groups_input +ListBillingGroupsOutput,list_billing_groups_output +ListBillingGroupsRequest,list_billing_groups_request +ListBillingGroupsResponse,list_billing_groups_response +ListBlueprintsRequest,list_blueprints_request +ListBlueprintsResponse,list_blueprints_response +ListBonusPaymentsRequest,list_bonus_payments_request +ListBonusPaymentsResponse,list_bonus_payments_response +ListBootstrapActionsInput,list_bootstrap_actions_input +ListBootstrapActionsOutput,list_bootstrap_actions_output +ListBotAliasesRequest,list_bot_aliases_request +ListBotAliasesResponse,list_bot_aliases_response +ListBotLocalesRequest,list_bot_locales_request +ListBotLocalesResponse,list_bot_locales_response +ListBotRecommendationsRequest,list_bot_recommendations_request +ListBotRecommendationsResponse,list_bot_recommendations_response +ListBotVersionsRequest,list_bot_versions_request +ListBotVersionsResponse,list_bot_versions_response +ListBotsRequest,list_bots_request +ListBotsResponse,list_bots_response +ListBranchesInput,list_branches_input +ListBranchesOutput,list_branches_output +ListBranchesRequest,list_branches_request +ListBranchesResult,list_branches_result +ListBridgesRequest,list_bridges_request +ListBridgesResponse,list_bridges_response +ListBrokersRequest,list_brokers_request +ListBrokersResponse,list_brokers_response +ListBrowserSettingsRequest,list_browser_settings_request +ListBrowserSettingsResponse,list_browser_settings_response +ListBucketAnalyticsConfigurationsOutput,list_bucket_analytics_configurations_output +ListBucketAnalyticsConfigurationsRequest,list_bucket_analytics_configurations_request +ListBucketIntelligentTieringConfigurationsOutput,list_bucket_intelligent_tiering_configurations_output +ListBucketIntelligentTieringConfigurationsRequest,list_bucket_intelligent_tiering_configurations_request +ListBucketInventoryConfigurationsOutput,list_bucket_inventory_configurations_output +ListBucketInventoryConfigurationsRequest,list_bucket_inventory_configurations_request +ListBucketMetricsConfigurationsOutput,list_bucket_metrics_configurations_output +ListBucketMetricsConfigurationsRequest,list_bucket_metrics_configurations_request +ListBucketsOutput,list_buckets_output +ListBudgetsForResourceInput,list_budgets_for_resource_input +ListBudgetsForResourceOutput,list_budgets_for_resource_output +ListBuildBatchesForProjectInput,list_build_batches_for_project_input +ListBuildBatchesForProjectOutput,list_build_batches_for_project_output +ListBuildBatchesInput,list_build_batches_input +ListBuildBatchesOutput,list_build_batches_output +ListBuildsForProjectInput,list_builds_for_project_input +ListBuildsForProjectOutput,list_builds_for_project_output +ListBuildsInput,list_builds_input +ListBuildsOutput,list_builds_output +ListBuiltInIntentsRequest,list_built_in_intents_request +ListBuiltInIntentsResponse,list_built_in_intents_response +ListBuiltInSlotTypesRequest,list_built_in_slot_types_request +ListBuiltInSlotTypesResponse,list_built_in_slot_types_response +ListBulkDeploymentDetailedReportsRequest,list_bulk_deployment_detailed_reports_request +ListBulkDeploymentDetailedReportsResponse,list_bulk_deployment_detailed_reports_response +ListBulkDeploymentsRequest,list_bulk_deployments_request +ListBulkDeploymentsResponse,list_bulk_deployments_response +ListBulkImportJobsRequest,list_bulk_import_jobs_request +ListBulkImportJobsResponse,list_bulk_import_jobs_response +ListBundlesRequest,list_bundles_request +ListBundlesResult,list_bundles_result +ListBusinessReportSchedulesRequest,list_business_report_schedules_request +ListBusinessReportSchedulesResponse,list_business_report_schedules_response +ListBy,list_by +ListByoipCidrsRequest,list_byoip_cidrs_request +ListByoipCidrsResponse,list_byoip_cidrs_response +ListByteMatchSetsRequest,list_byte_match_sets_request +ListByteMatchSetsResponse,list_byte_match_sets_response +ListCACertificatesRequest,list_ca_certificates_request +ListCACertificatesResponse,list_ca_certificates_response +ListCachePoliciesRequest,list_cache_policies_request +ListCachePoliciesResult,list_cache_policies_result +ListCalculatedAttributeDefinitionItem,list_calculated_attribute_definition_item +ListCalculatedAttributeDefinitionsRequest,list_calculated_attribute_definitions_request +ListCalculatedAttributeDefinitionsResponse,list_calculated_attribute_definitions_response +ListCalculatedAttributeForProfileItem,list_calculated_attribute_for_profile_item +ListCalculatedAttributesForProfileRequest,list_calculated_attributes_for_profile_request +ListCalculatedAttributesForProfileResponse,list_calculated_attributes_for_profile_response +ListCalculationExecutionsRequest,list_calculation_executions_request +ListCalculationExecutionsResponse,list_calculation_executions_response +ListCallAnalyticsCategoriesRequest,list_call_analytics_categories_request +ListCallAnalyticsCategoriesResponse,list_call_analytics_categories_response +ListCallAnalyticsJobsRequest,list_call_analytics_jobs_request +ListCallAnalyticsJobsResponse,list_call_analytics_jobs_response +ListCampaignsRequest,list_campaigns_request +ListCampaignsResponse,list_campaigns_response +ListCandidatesForAutoMLJobRequest,list_candidates_for_auto_ml_job_request +ListCandidatesForAutoMLJobResponse,list_candidates_for_auto_ml_job_response +ListCapacityReservationsInput,list_capacity_reservations_input +ListCapacityReservationsOutput,list_capacity_reservations_output +ListCasesForContactRequest,list_cases_for_contact_request +ListCasesForContactResponse,list_cases_for_contact_response +ListCatalogItemsInput,list_catalog_items_input +ListCatalogItemsOutput,list_catalog_items_output +ListCellsRequest,list_cells_request +ListCellsResponse,list_cells_response +ListCertificateAuthoritiesRequest,list_certificate_authorities_request +ListCertificateAuthoritiesResponse,list_certificate_authorities_response +ListCertificatesByCARequest,list_certificates_by_ca_request +ListCertificatesByCAResponse,list_certificates_by_ca_response +ListCertificatesRequest,list_certificates_request +ListCertificatesResponse,list_certificates_response +ListCertificatesResult,list_certificates_result +ListChangeSetsInput,list_change_sets_input +ListChangeSetsOutput,list_change_sets_output +ListChangeSetsRequest,list_change_sets_request +ListChangeSetsResponse,list_change_sets_response +ListChangedBlocksRequest,list_changed_blocks_request +ListChangedBlocksResponse,list_changed_blocks_response +ListChangesetsRequest,list_changesets_request +ListChangesetsResponse,list_changesets_response +ListChannelBansRequest,list_channel_bans_request +ListChannelBansResponse,list_channel_bans_response +ListChannelFlowsRequest,list_channel_flows_request +ListChannelFlowsResponse,list_channel_flows_response +ListChannelGroupsRequest,list_channel_groups_request +ListChannelGroupsResponse,list_channel_groups_response +ListChannelMembershipsForAppInstanceUserRequest,list_channel_memberships_for_app_instance_user_request +ListChannelMembershipsForAppInstanceUserResponse,list_channel_memberships_for_app_instance_user_response +ListChannelMembershipsRequest,list_channel_memberships_request +ListChannelMembershipsResponse,list_channel_memberships_response +ListChannelMessagesRequest,list_channel_messages_request +ListChannelMessagesResponse,list_channel_messages_response +ListChannelModeratorsRequest,list_channel_moderators_request +ListChannelModeratorsResponse,list_channel_moderators_response +ListChannelsAssociatedWithChannelFlowRequest,list_channels_associated_with_channel_flow_request +ListChannelsAssociatedWithChannelFlowResponse,list_channels_associated_with_channel_flow_response +ListChannelsModeratedByAppInstanceUserRequest,list_channels_moderated_by_app_instance_user_request +ListChannelsModeratedByAppInstanceUserResponse,list_channels_moderated_by_app_instance_user_response +ListChannelsRequest,list_channels_request +ListChannelsResponse,list_channels_response +ListCheckDetailsInput,list_check_details_input +ListCheckDetailsOutput,list_check_details_output +ListCheckSummariesInput,list_check_summaries_input +ListCheckSummariesOutput,list_check_summaries_output +ListChildrenRequest,list_children_request +ListChildrenResponse,list_children_response +ListChunksInput,list_chunks_input +ListChunksOutput,list_chunks_output +ListCidrBlocksRequest,list_cidr_blocks_request +ListCidrBlocksResponse,list_cidr_blocks_response +ListCidrCollectionsRequest,list_cidr_collections_request +ListCidrCollectionsResponse,list_cidr_collections_response +ListCidrLocationsRequest,list_cidr_locations_request +ListCidrLocationsResponse,list_cidr_locations_response +ListClassificationJobsRequest,list_classification_jobs_request +ListClassificationJobsResponse,list_classification_jobs_response +ListClassificationScopesRequest,list_classification_scopes_request +ListClassificationScopesResponse,list_classification_scopes_response +ListClientDevicesAssociatedWithCoreDeviceRequest,list_client_devices_associated_with_core_device_request +ListClientDevicesAssociatedWithCoreDeviceResponse,list_client_devices_associated_with_core_device_response +ListClientVpcConnectionsRequest,list_client_vpc_connections_request +ListClientVpcConnectionsResponse,list_client_vpc_connections_response +ListClosedWorkflowExecutionsInput,list_closed_workflow_executions_input +ListCloudFrontOriginAccessIdentitiesRequest,list_cloud_front_origin_access_identities_request +ListCloudFrontOriginAccessIdentitiesResult,list_cloud_front_origin_access_identities_result +ListClusterJobsRequest,list_cluster_jobs_request +ListClusterJobsResult,list_cluster_jobs_result +ListClusterOperationsRequest,list_cluster_operations_request +ListClusterOperationsResponse,list_cluster_operations_response +ListClusterOperationsV2Request,list_cluster_operations_v2_request +ListClusterOperationsV2Response,list_cluster_operations_v2_response +ListClusterSnapshotsInput,list_cluster_snapshots_input +ListClusterSnapshotsOutput,list_cluster_snapshots_output +ListClustersInput,list_clusters_input +ListClustersOutput,list_clusters_output +ListClustersRequest,list_clusters_request +ListClustersResponse,list_clusters_response +ListClustersResult,list_clusters_result +ListClustersV2Request,list_clusters_v2_request +ListClustersV2Response,list_clusters_v2_response +ListCodeRepositoriesInput,list_code_repositories_input +ListCodeRepositoriesOutput,list_code_repositories_output +ListCodeReviewsRequest,list_code_reviews_request +ListCodeReviewsResponse,list_code_reviews_response +ListCodeSigningConfigsRequest,list_code_signing_configs_request +ListCodeSigningConfigsResponse,list_code_signing_configs_response +ListCodegenJobsRequest,list_codegen_jobs_request +ListCodegenJobsResponse,list_codegen_jobs_response +ListCollaborationAnalysisTemplatesInput,list_collaboration_analysis_templates_input +ListCollaborationAnalysisTemplatesOutput,list_collaboration_analysis_templates_output +ListCollaborationsInput,list_collaborations_input +ListCollaborationsOutput,list_collaborations_output +ListCollectionsRequest,list_collections_request +ListCollectionsResponse,list_collections_response +ListCollectorsRequest,list_collectors_request +ListCollectorsResponse,list_collectors_response +ListCommandInvocationsRequest,list_command_invocations_request +ListCommandInvocationsResult,list_command_invocations_result +ListCommandsRequest,list_commands_request +ListCommandsResult,list_commands_result +ListCompatibleImagesRequest,list_compatible_images_request +ListCompatibleImagesResult,list_compatible_images_result +ListCompilationJobsRequest,list_compilation_jobs_request +ListCompilationJobsResponse,list_compilation_jobs_response +ListComplianceItemsRequest,list_compliance_items_request +ListComplianceItemsResult,list_compliance_items_result +ListComplianceStatusRequest,list_compliance_status_request +ListComplianceStatusResponse,list_compliance_status_response +ListComplianceSummariesRequest,list_compliance_summaries_request +ListComplianceSummariesResult,list_compliance_summaries_result +ListComponentBuildVersionsRequest,list_component_build_versions_request +ListComponentBuildVersionsResponse,list_component_build_versions_response +ListComponentOutputsInput,list_component_outputs_input +ListComponentOutputsOutput,list_component_outputs_output +ListComponentProvisionedResourcesInput,list_component_provisioned_resources_input +ListComponentProvisionedResourcesOutput,list_component_provisioned_resources_output +ListComponentTypesRequest,list_component_types_request +ListComponentTypesResponse,list_component_types_response +ListComponentVersionsRequest,list_component_versions_request +ListComponentVersionsResponse,list_component_versions_response +ListComponentsInput,list_components_input +ListComponentsOutput,list_components_output +ListComponentsRequest,list_components_request +ListComponentsResponse,list_components_response +ListComputeInput,list_compute_input +ListComputeOutput,list_compute_output +ListConferenceProvidersRequest,list_conference_providers_request +ListConferenceProvidersResponse,list_conference_providers_response +ListConfigsRequest,list_configs_request +ListConfigsResponse,list_configs_response +ListConfigurationHistoryRequest,list_configuration_history_request +ListConfigurationHistoryResponse,list_configuration_history_response +ListConfigurationProfilesRequest,list_configuration_profiles_request +ListConfigurationRevisionsRequest,list_configuration_revisions_request +ListConfigurationRevisionsResponse,list_configuration_revisions_response +ListConfigurationSetsRequest,list_configuration_sets_request +ListConfigurationSetsResponse,list_configuration_sets_response +ListConfigurationsRequest,list_configurations_request +ListConfigurationsResponse,list_configurations_response +ListConfiguredTableAssociationsInput,list_configured_table_associations_input +ListConfiguredTableAssociationsOutput,list_configured_table_associations_output +ListConfiguredTablesInput,list_configured_tables_input +ListConfiguredTablesOutput,list_configured_tables_output +ListConflictingAliasesRequest,list_conflicting_aliases_request +ListConflictingAliasesResult,list_conflicting_aliases_result +ListConformancePackComplianceScoresRequest,list_conformance_pack_compliance_scores_request +ListConformancePackComplianceScoresResponse,list_conformance_pack_compliance_scores_response +ListConnectPeersRequest,list_connect_peers_request +ListConnectPeersResponse,list_connect_peers_response +ListConnectionsInput,list_connections_input +ListConnectionsOutput,list_connections_output +ListConnectionsRequest,list_connections_request +ListConnectionsResponse,list_connections_response +ListConnectorDefinitionVersionsRequest,list_connector_definition_versions_request +ListConnectorDefinitionVersionsResponse,list_connector_definition_versions_response +ListConnectorDefinitionsRequest,list_connector_definitions_request +ListConnectorDefinitionsResponse,list_connector_definitions_response +ListConnectorEntitiesRequest,list_connector_entities_request +ListConnectorEntitiesResponse,list_connector_entities_response +ListConnectorsRequest,list_connectors_request +ListConnectorsResponse,list_connectors_response +ListConstraintsForPortfolioInput,list_constraints_for_portfolio_input +ListConstraintsForPortfolioOutput,list_constraints_for_portfolio_output +ListContactChannelsRequest,list_contact_channels_request +ListContactChannelsResult,list_contact_channels_result +ListContactEvaluationsRequest,list_contact_evaluations_request +ListContactEvaluationsResponse,list_contact_evaluations_response +ListContactFlowModulesRequest,list_contact_flow_modules_request +ListContactFlowModulesResponse,list_contact_flow_modules_response +ListContactFlowsRequest,list_contact_flows_request +ListContactFlowsResponse,list_contact_flows_response +ListContactListsRequest,list_contact_lists_request +ListContactListsResponse,list_contact_lists_response +ListContactReferencesRequest,list_contact_references_request +ListContactReferencesResponse,list_contact_references_response +ListContactsFilter,list_contacts_filter +ListContactsRequest,list_contacts_request +ListContactsResponse,list_contacts_response +ListContactsResult,list_contacts_result +ListContainerInstancesRequest,list_container_instances_request +ListContainerInstancesResponse,list_container_instances_response +ListContainerRecipesRequest,list_container_recipes_request +ListContainerRecipesResponse,list_container_recipes_response +ListContainersInput,list_containers_input +ListContainersOutput,list_containers_output +ListContentsRequest,list_contents_request +ListContentsResponse,list_contents_response +ListContextsRequest,list_contexts_request +ListContextsResponse,list_contexts_response +ListContinuousDeploymentPoliciesRequest,list_continuous_deployment_policies_request +ListContinuousDeploymentPoliciesResult,list_continuous_deployment_policies_result +ListContributorInsightsInput,list_contributor_insights_input +ListContributorInsightsOutput,list_contributor_insights_output +ListControlDisplayOptions,list_control_display_options +ListControlDomainInsightsByAssessmentRequest,list_control_domain_insights_by_assessment_request +ListControlDomainInsightsByAssessmentResponse,list_control_domain_insights_by_assessment_response +ListControlDomainInsightsRequest,list_control_domain_insights_request +ListControlDomainInsightsResponse,list_control_domain_insights_response +ListControlInsightsByControlDomainRequest,list_control_insights_by_control_domain_request +ListControlInsightsByControlDomainResponse,list_control_insights_by_control_domain_response +ListControlPanelsRequest,list_control_panels_request +ListControlPanelsResponse,list_control_panels_response +ListControlSearchOptions,list_control_search_options +ListControlSelectAllOptions,list_control_select_all_options +ListControlsRequest,list_controls_request +ListControlsResponse,list_controls_response +ListCopyJobsInput,list_copy_jobs_input +ListCopyJobsOutput,list_copy_jobs_output +ListCoreDefinitionVersionsRequest,list_core_definition_versions_request +ListCoreDefinitionVersionsResponse,list_core_definition_versions_response +ListCoreDefinitionsRequest,list_core_definitions_request +ListCoreDefinitionsResponse,list_core_definitions_response +ListCoreDevicesRequest,list_core_devices_request +ListCoreDevicesResponse,list_core_devices_response +ListCoreNetworkPolicyVersionsRequest,list_core_network_policy_versions_request +ListCoreNetworkPolicyVersionsResponse,list_core_network_policy_versions_response +ListCoreNetworksRequest,list_core_networks_request +ListCoreNetworksResponse,list_core_networks_response +ListCostAllocationTagsRequest,list_cost_allocation_tags_request +ListCostAllocationTagsResponse,list_cost_allocation_tags_response +ListCostCategoryDefinitionsRequest,list_cost_category_definitions_request +ListCostCategoryDefinitionsResponse,list_cost_category_definitions_response +ListCoverageRequest,list_coverage_request +ListCoverageResponse,list_coverage_response +ListCoverageStatisticsRequest,list_coverage_statistics_request +ListCoverageStatisticsResponse,list_coverage_statistics_response +ListCrawlersRequest,list_crawlers_request +ListCrawlersResponse,list_crawlers_response +ListCrawlsRequest,list_crawls_request +ListCrawlsResponse,list_crawls_response +ListCreateAccountStatusRequest,list_create_account_status_request +ListCreateAccountStatusResponse,list_create_account_status_response +ListCreatedArtifactsRequest,list_created_artifacts_request +ListCreatedArtifactsResult,list_created_artifacts_result +ListCrlsResponse,list_crls_response +ListCrossAccountAuthorizationsRequest,list_cross_account_authorizations_request +ListCrossAccountAuthorizationsResponse,list_cross_account_authorizations_response +ListCuratedEnvironmentImagesOutput,list_curated_environment_images_output +ListCustomDataIdentifiersRequest,list_custom_data_identifiers_request +ListCustomDataIdentifiersResponse,list_custom_data_identifiers_response +ListCustomEntityTypesRequest,list_custom_entity_types_request +ListCustomEntityTypesResponse,list_custom_entity_types_response +ListCustomLineItemChargeDetails,list_custom_line_item_charge_details +ListCustomLineItemFlatChargeDetails,list_custom_line_item_flat_charge_details +ListCustomLineItemPercentageChargeDetails,list_custom_line_item_percentage_charge_details +ListCustomLineItemVersionsBillingPeriodRangeFilter,list_custom_line_item_versions_billing_period_range_filter +ListCustomLineItemVersionsFilter,list_custom_line_item_versions_filter +ListCustomLineItemVersionsInput,list_custom_line_item_versions_input +ListCustomLineItemVersionsOutput,list_custom_line_item_versions_output +ListCustomLineItemsFilter,list_custom_line_items_filter +ListCustomLineItemsInput,list_custom_line_items_input +ListCustomLineItemsOutput,list_custom_line_items_output +ListCustomMetricsRequest,list_custom_metrics_request +ListCustomMetricsResponse,list_custom_metrics_response +ListCustomModelsRequest,list_custom_models_request +ListCustomModelsResponse,list_custom_models_response +ListCustomPluginsRequest,list_custom_plugins_request +ListCustomPluginsResponse,list_custom_plugins_response +ListCustomRoutingAcceleratorsRequest,list_custom_routing_accelerators_request +ListCustomRoutingAcceleratorsResponse,list_custom_routing_accelerators_response +ListCustomRoutingEndpointGroupsRequest,list_custom_routing_endpoint_groups_request +ListCustomRoutingEndpointGroupsResponse,list_custom_routing_endpoint_groups_response +ListCustomRoutingListenersRequest,list_custom_routing_listeners_request +ListCustomRoutingListenersResponse,list_custom_routing_listeners_response +ListCustomRoutingPortMappingsByDestinationRequest,list_custom_routing_port_mappings_by_destination_request +ListCustomRoutingPortMappingsByDestinationResponse,list_custom_routing_port_mappings_by_destination_response +ListCustomRoutingPortMappingsRequest,list_custom_routing_port_mappings_request +ListCustomRoutingPortMappingsResponse,list_custom_routing_port_mappings_response +ListCustomVerificationEmailTemplatesRequest,list_custom_verification_email_templates_request +ListCustomVerificationEmailTemplatesResponse,list_custom_verification_email_templates_response +ListCustomVocabularyItemsRequest,list_custom_vocabulary_items_request +ListCustomVocabularyItemsResponse,list_custom_vocabulary_items_response +ListCustomerManagedPolicyReferencesInPermissionSetRequest,list_customer_managed_policy_references_in_permission_set_request +ListCustomerManagedPolicyReferencesInPermissionSetResponse,list_customer_managed_policy_references_in_permission_set_response +ListDICOMImportJobsRequest,list_dicom_import_jobs_request +ListDICOMImportJobsResponse,list_dicom_import_jobs_response +ListDashboardVersionsRequest,list_dashboard_versions_request +ListDashboardVersionsResponse,list_dashboard_versions_response +ListDashboardsInput,list_dashboards_input +ListDashboardsOutput,list_dashboards_output +ListDashboardsRequest,list_dashboards_request +ListDashboardsResponse,list_dashboards_response +ListDataCatalogsInput,list_data_catalogs_input +ListDataCatalogsOutput,list_data_catalogs_output +ListDataCellsFilterRequest,list_data_cells_filter_request +ListDataCellsFilterResponse,list_data_cells_filter_response +ListDataIngestionJobsRequest,list_data_ingestion_jobs_request +ListDataIngestionJobsResponse,list_data_ingestion_jobs_response +ListDataIntegrationAssociationsRequest,list_data_integration_associations_request +ListDataIntegrationAssociationsResponse,list_data_integration_associations_response +ListDataIntegrationsRequest,list_data_integrations_request +ListDataIntegrationsResponse,list_data_integrations_response +ListDataLakeExceptionsRequest,list_data_lake_exceptions_request +ListDataLakeExceptionsResponse,list_data_lake_exceptions_response +ListDataLakesRequest,list_data_lakes_request +ListDataLakesResponse,list_data_lakes_response +ListDataQualityJobDefinitionsRequest,list_data_quality_job_definitions_request +ListDataQualityJobDefinitionsResponse,list_data_quality_job_definitions_response +ListDataQualityResultsRequest,list_data_quality_results_request +ListDataQualityResultsResponse,list_data_quality_results_response +ListDataQualityRuleRecommendationRunsRequest,list_data_quality_rule_recommendation_runs_request +ListDataQualityRuleRecommendationRunsResponse,list_data_quality_rule_recommendation_runs_response +ListDataQualityRulesetEvaluationRunsRequest,list_data_quality_ruleset_evaluation_runs_request +ListDataQualityRulesetEvaluationRunsResponse,list_data_quality_ruleset_evaluation_runs_response +ListDataQualityRulesetsRequest,list_data_quality_rulesets_request +ListDataQualityRulesetsResponse,list_data_quality_rulesets_response +ListDataSetImportHistoryRequest,list_data_set_import_history_request +ListDataSetImportHistoryResponse,list_data_set_import_history_response +ListDataSetRevisionsRequest,list_data_set_revisions_request +ListDataSetRevisionsResponse,list_data_set_revisions_response +ListDataSetsRequest,list_data_sets_request +ListDataSetsResponse,list_data_sets_response +ListDataSourceSyncJobsRequest,list_data_source_sync_jobs_request +ListDataSourceSyncJobsResponse,list_data_source_sync_jobs_response +ListDataSourcesRequest,list_data_sources_request +ListDataSourcesResponse,list_data_sources_response +ListDataViewsRequest,list_data_views_request +ListDataViewsResponse,list_data_views_response +ListDatabasesInput,list_databases_input +ListDatabasesOutput,list_databases_output +ListDatabasesRequest,list_databases_request +ListDatabasesResponse,list_databases_response +ListDataflowEndpointGroupsRequest,list_dataflow_endpoint_groups_request +ListDataflowEndpointGroupsResponse,list_dataflow_endpoint_groups_response +ListDatasetContentsRequest,list_dataset_contents_request +ListDatasetContentsResponse,list_dataset_contents_response +ListDatasetEntriesRequest,list_dataset_entries_request +ListDatasetEntriesResponse,list_dataset_entries_response +ListDatasetExportJobsRequest,list_dataset_export_jobs_request +ListDatasetExportJobsResponse,list_dataset_export_jobs_response +ListDatasetGroupsRequest,list_dataset_groups_request +ListDatasetGroupsResponse,list_dataset_groups_response +ListDatasetImportJobsRequest,list_dataset_import_jobs_request +ListDatasetImportJobsResponse,list_dataset_import_jobs_response +ListDatasetLabelsRequest,list_dataset_labels_request +ListDatasetLabelsResponse,list_dataset_labels_response +ListDatasetsRequest,list_datasets_request +ListDatasetsResponse,list_datasets_response +ListDatasourcePackagesRequest,list_datasource_packages_request +ListDatasourcePackagesResponse,list_datasource_packages_response +ListDatastoresRequest,list_datastores_request +ListDatastoresResponse,list_datastores_response +ListDeadLetterSourceQueuesRequest,list_dead_letter_source_queues_request +ListDeadLetterSourceQueuesResult,list_dead_letter_source_queues_result +ListDecoderManifestNetworkInterfacesRequest,list_decoder_manifest_network_interfaces_request +ListDecoderManifestNetworkInterfacesResponse,list_decoder_manifest_network_interfaces_response +ListDecoderManifestSignalsRequest,list_decoder_manifest_signals_request +ListDecoderManifestSignalsResponse,list_decoder_manifest_signals_response +ListDecoderManifestsRequest,list_decoder_manifests_request +ListDecoderManifestsResponse,list_decoder_manifests_response +ListDedicatedIpPoolsRequest,list_dedicated_ip_pools_request +ListDedicatedIpPoolsResponse,list_dedicated_ip_pools_response +ListDefaultVocabulariesRequest,list_default_vocabularies_request +ListDefaultVocabulariesResponse,list_default_vocabularies_response +ListDelegatedAdminAccountsRequest,list_delegated_admin_accounts_request +ListDelegatedAdminAccountsResponse,list_delegated_admin_accounts_response +ListDelegatedAdministratorsRequest,list_delegated_administrators_request +ListDelegatedAdministratorsResponse,list_delegated_administrators_response +ListDelegatedServicesForAccountRequest,list_delegated_services_for_account_request +ListDelegatedServicesForAccountResponse,list_delegated_services_for_account_response +ListDeliverabilityTestReportsRequest,list_deliverability_test_reports_request +ListDeliverabilityTestReportsResponse,list_deliverability_test_reports_response +ListDeliveryStreamsInput,list_delivery_streams_input +ListDeliveryStreamsOutput,list_delivery_streams_output +ListDeploymentConfigsInput,list_deployment_configs_input +ListDeploymentConfigsOutput,list_deployment_configs_output +ListDeploymentGroupsInput,list_deployment_groups_input +ListDeploymentGroupsOutput,list_deployment_groups_output +ListDeploymentInstancesInput,list_deployment_instances_input +ListDeploymentInstancesOutput,list_deployment_instances_output +ListDeploymentJobsRequest,list_deployment_jobs_request +ListDeploymentJobsResponse,list_deployment_jobs_response +ListDeploymentStrategiesRequest,list_deployment_strategies_request +ListDeploymentTargetsInput,list_deployment_targets_input +ListDeploymentTargetsOutput,list_deployment_targets_output +ListDeploymentsInput,list_deployments_input +ListDeploymentsOutput,list_deployments_output +ListDeploymentsRequest,list_deployments_request +ListDeploymentsResponse,list_deployments_response +ListDestinationsRequest,list_destinations_request +ListDestinationsResponse,list_destinations_response +ListDetectMitigationActionsExecutionsRequest,list_detect_mitigation_actions_executions_request +ListDetectMitigationActionsExecutionsResponse,list_detect_mitigation_actions_executions_response +ListDetectMitigationActionsTasksRequest,list_detect_mitigation_actions_tasks_request +ListDetectMitigationActionsTasksResponse,list_detect_mitigation_actions_tasks_response +ListDetectorModelVersionsRequest,list_detector_model_versions_request +ListDetectorModelVersionsResponse,list_detector_model_versions_response +ListDetectorModelsRequest,list_detector_models_request +ListDetectorModelsResponse,list_detector_models_response +ListDetectorsRequest,list_detectors_request +ListDetectorsResponse,list_detectors_response +ListDevEndpointsRequest,list_dev_endpoints_request +ListDevEndpointsResponse,list_dev_endpoints_response +ListDevEnvironmentSessionsRequest,list_dev_environment_sessions_request +ListDevEnvironmentSessionsResponse,list_dev_environment_sessions_response +ListDevEnvironmentsRequest,list_dev_environments_request +ListDevEnvironmentsResponse,list_dev_environments_response +ListDevelopmentSchemaArnsRequest,list_development_schema_arns_request +ListDevelopmentSchemaArnsResponse,list_development_schema_arns_response +ListDeviceDefinitionVersionsRequest,list_device_definition_versions_request +ListDeviceDefinitionVersionsResponse,list_device_definition_versions_response +ListDeviceDefinitionsRequest,list_device_definitions_request +ListDeviceDefinitionsResponse,list_device_definitions_response +ListDeviceEventsRequest,list_device_events_request +ListDeviceEventsResponse,list_device_events_response +ListDeviceFleetsRequest,list_device_fleets_request +ListDeviceFleetsResponse,list_device_fleets_response +ListDeviceIdentifiersRequest,list_device_identifiers_request +ListDeviceIdentifiersResponse,list_device_identifiers_response +ListDeviceInstancesRequest,list_device_instances_request +ListDeviceInstancesResult,list_device_instances_result +ListDevicePoolsRequest,list_device_pools_request +ListDevicePoolsResult,list_device_pools_result +ListDevicePositionsRequest,list_device_positions_request +ListDevicePositionsResponse,list_device_positions_response +ListDevicePositionsResponseEntry,list_device_positions_response_entry +ListDeviceProfilesRequest,list_device_profiles_request +ListDeviceProfilesResponse,list_device_profiles_response +ListDeviceResourcesInput,list_device_resources_input +ListDeviceResourcesOutput,list_device_resources_output +ListDevicesForWirelessDeviceImportTaskRequest,list_devices_for_wireless_device_import_task_request +ListDevicesForWirelessDeviceImportTaskResponse,list_devices_for_wireless_device_import_task_response +ListDevicesInput,list_devices_input +ListDevicesJobsRequest,list_devices_jobs_request +ListDevicesJobsResponse,list_devices_jobs_response +ListDevicesOutput,list_devices_output +ListDevicesRequest,list_devices_request +ListDevicesResponse,list_devices_response +ListDevicesResult,list_devices_result +ListDimensionsRequest,list_dimensions_request +ListDimensionsResponse,list_dimensions_response +ListDirectoriesRequest,list_directories_request +ListDirectoriesResponse,list_directories_response +ListDirectoryRegistrationsRequest,list_directory_registrations_request +ListDirectoryRegistrationsResponse,list_directory_registrations_response +ListDiscoveredResourcesRequest,list_discovered_resources_request +ListDiscoveredResourcesResponse,list_discovered_resources_response +ListDiscoveredResourcesResult,list_discovered_resources_result +ListDiscoverersRequest,list_discoverers_request +ListDiscoverersResponse,list_discoverers_response +ListDiscoveryJobsRequest,list_discovery_jobs_request +ListDiscoveryJobsResponse,list_discovery_jobs_response +ListDistributedGrantsRequest,list_distributed_grants_request +ListDistributedGrantsResponse,list_distributed_grants_response +ListDistributionConfigurationsRequest,list_distribution_configurations_request +ListDistributionConfigurationsResponse,list_distribution_configurations_response +ListDistributionsByCachePolicyIdRequest,list_distributions_by_cache_policy_id_request +ListDistributionsByCachePolicyIdResult,list_distributions_by_cache_policy_id_result +ListDistributionsByKeyGroupRequest,list_distributions_by_key_group_request +ListDistributionsByKeyGroupResult,list_distributions_by_key_group_result +ListDistributionsByOriginRequestPolicyIdRequest,list_distributions_by_origin_request_policy_id_request +ListDistributionsByOriginRequestPolicyIdResult,list_distributions_by_origin_request_policy_id_result +ListDistributionsByRealtimeLogConfigRequest,list_distributions_by_realtime_log_config_request +ListDistributionsByRealtimeLogConfigResult,list_distributions_by_realtime_log_config_result +ListDistributionsByResponseHeadersPolicyIdRequest,list_distributions_by_response_headers_policy_id_request +ListDistributionsByResponseHeadersPolicyIdResult,list_distributions_by_response_headers_policy_id_result +ListDistributionsByWebACLIdRequest,list_distributions_by_web_acl_id_request +ListDistributionsByWebACLIdResult,list_distributions_by_web_acl_id_result +ListDistributionsRequest,list_distributions_request +ListDistributionsResult,list_distributions_result +ListDocumentClassificationJobsRequest,list_document_classification_jobs_request +ListDocumentClassificationJobsResponse,list_document_classification_jobs_response +ListDocumentClassifierSummariesRequest,list_document_classifier_summaries_request +ListDocumentClassifierSummariesResponse,list_document_classifier_summaries_response +ListDocumentClassifiersRequest,list_document_classifiers_request +ListDocumentClassifiersResponse,list_document_classifiers_response +ListDocumentMetadataHistoryRequest,list_document_metadata_history_request +ListDocumentMetadataHistoryResponse,list_document_metadata_history_response +ListDocumentVersionsRequest,list_document_versions_request +ListDocumentVersionsResult,list_document_versions_result +ListDocumentsRequest,list_documents_request +ListDocumentsResult,list_documents_result +ListDomainAssociationsRequest,list_domain_associations_request +ListDomainAssociationsResult,list_domain_associations_result +ListDomainConfigurationsRequest,list_domain_configurations_request +ListDomainConfigurationsResponse,list_domain_configurations_response +ListDomainDeliverabilityCampaignsRequest,list_domain_deliverability_campaigns_request +ListDomainDeliverabilityCampaignsResponse,list_domain_deliverability_campaigns_response +ListDomainItem,list_domain_item +ListDomainNamesRequest,list_domain_names_request +ListDomainNamesResponse,list_domain_names_response +ListDomainsForPackageRequest,list_domains_for_package_request +ListDomainsForPackageResponse,list_domains_for_package_response +ListDomainsInput,list_domains_input +ListDomainsRequest,list_domains_request +ListDomainsResponse,list_domains_response +ListDomainsResult,list_domains_result +ListDominantLanguageDetectionJobsRequest,list_dominant_language_detection_jobs_request +ListDominantLanguageDetectionJobsResponse,list_dominant_language_detection_jobs_response +ListEarthObservationJobInput,list_earth_observation_job_input +ListEarthObservationJobOutput,list_earth_observation_job_output +ListEarthObservationJobOutputConfig,list_earth_observation_job_output_config +ListEdgeAgentConfigurationsEdgeConfig,list_edge_agent_configurations_edge_config +ListEdgeAgentConfigurationsInput,list_edge_agent_configurations_input +ListEdgeAgentConfigurationsOutput,list_edge_agent_configurations_output +ListEdgeDeploymentPlansRequest,list_edge_deployment_plans_request +ListEdgeDeploymentPlansResponse,list_edge_deployment_plans_response +ListEdgePackagingJobsRequest,list_edge_packaging_jobs_request +ListEdgePackagingJobsResponse,list_edge_packaging_jobs_response +ListEffectiveDeploymentsRequest,list_effective_deployments_request +ListEffectiveDeploymentsResponse,list_effective_deployments_response +ListElasticsearchInstanceTypesRequest,list_elasticsearch_instance_types_request +ListElasticsearchInstanceTypesResponse,list_elasticsearch_instance_types_response +ListElasticsearchVersionsRequest,list_elasticsearch_versions_request +ListElasticsearchVersionsResponse,list_elasticsearch_versions_response +ListEmailIdentitiesRequest,list_email_identities_request +ListEmailIdentitiesResponse,list_email_identities_response +ListEmailTemplatesRequest,list_email_templates_request +ListEmailTemplatesResponse,list_email_templates_response +ListEnabledControlsInput,list_enabled_controls_input +ListEnabledControlsOutput,list_enabled_controls_output +ListEnabledProductsForImportRequest,list_enabled_products_for_import_request +ListEnabledProductsForImportResponse,list_enabled_products_for_import_response +ListEndpointAccessRequest,list_endpoint_access_request +ListEndpointAccessResponse,list_endpoint_access_response +ListEndpointConfigsInput,list_endpoint_configs_input +ListEndpointConfigsOutput,list_endpoint_configs_output +ListEndpointGroupsRequest,list_endpoint_groups_request +ListEndpointGroupsResponse,list_endpoint_groups_response +ListEndpointsByPlatformApplicationInput,list_endpoints_by_platform_application_input +ListEndpointsByPlatformApplicationResponse,list_endpoints_by_platform_application_response +ListEndpointsInput,list_endpoints_input +ListEndpointsOutput,list_endpoints_output +ListEndpointsRequest,list_endpoints_request +ListEndpointsResponse,list_endpoints_response +ListEndpointsResult,list_endpoints_result +ListEngagementsRequest,list_engagements_request +ListEngagementsResult,list_engagements_result +ListEngineVersionsInput,list_engine_versions_input +ListEngineVersionsOutput,list_engine_versions_output +ListEngineVersionsRequest,list_engine_versions_request +ListEngineVersionsResponse,list_engine_versions_response +ListEntitiesDetectionJobsRequest,list_entities_detection_jobs_request +ListEntitiesDetectionJobsResponse,list_entities_detection_jobs_response +ListEntitiesDetectionV2JobsRequest,list_entities_detection_v2_jobs_request +ListEntitiesDetectionV2JobsResponse,list_entities_detection_v2_jobs_response +ListEntitiesForPolicyRequest,list_entities_for_policy_request +ListEntitiesForPolicyResponse,list_entities_for_policy_response +ListEntitiesRequest,list_entities_request +ListEntitiesResponse,list_entities_response +ListEntitledApplicationsRequest,list_entitled_applications_request +ListEntitledApplicationsResult,list_entitled_applications_result +ListEntitlementsRequest,list_entitlements_request +ListEntitlementsResponse,list_entitlements_response +ListEntityPersonasRequest,list_entity_personas_request +ListEntityPersonasResponse,list_entity_personas_response +ListEntityRecognizerSummariesRequest,list_entity_recognizer_summaries_request +ListEntityRecognizerSummariesResponse,list_entity_recognizer_summaries_response +ListEntityRecognizersRequest,list_entity_recognizers_request +ListEntityRecognizersResponse,list_entity_recognizers_response +ListEnvironmentAccountConnectionsInput,list_environment_account_connections_input +ListEnvironmentAccountConnectionsOutput,list_environment_account_connections_output +ListEnvironmentOutputsInput,list_environment_outputs_input +ListEnvironmentOutputsOutput,list_environment_outputs_output +ListEnvironmentProvisionedResourcesInput,list_environment_provisioned_resources_input +ListEnvironmentProvisionedResourcesOutput,list_environment_provisioned_resources_output +ListEnvironmentTemplateVersionsInput,list_environment_template_versions_input +ListEnvironmentTemplateVersionsOutput,list_environment_template_versions_output +ListEnvironmentTemplatesInput,list_environment_templates_input +ListEnvironmentTemplatesOutput,list_environment_templates_output +ListEnvironmentVpcsRequest,list_environment_vpcs_request +ListEnvironmentVpcsResponse,list_environment_vpcs_response +ListEnvironmentsInput,list_environments_input +ListEnvironmentsOutput,list_environments_output +ListEnvironmentsRequest,list_environments_request +ListEnvironmentsResponse,list_environments_response +ListEnvironmentsResult,list_environments_result +ListEphemeridesRequest,list_ephemerides_request +ListEphemeridesResponse,list_ephemerides_response +ListEulaAcceptancesRequest,list_eula_acceptances_request +ListEulaAcceptancesResponse,list_eula_acceptances_response +ListEulasRequest,list_eulas_request +ListEulasResponse,list_eulas_response +ListEvaluationFormVersionsRequest,list_evaluation_form_versions_request +ListEvaluationFormVersionsResponse,list_evaluation_form_versions_response +ListEvaluationFormsRequest,list_evaluation_forms_request +ListEvaluationFormsResponse,list_evaluation_forms_response +ListEventActionsRequest,list_event_actions_request +ListEventActionsResponse,list_event_actions_response +ListEventBusesRequest,list_event_buses_request +ListEventBusesResponse,list_event_buses_response +ListEventConfigurationsRequest,list_event_configurations_request +ListEventConfigurationsResponse,list_event_configurations_response +ListEventDataStoresRequest,list_event_data_stores_request +ListEventDataStoresResponse,list_event_data_stores_response +ListEventIntegrationAssociationsRequest,list_event_integration_associations_request +ListEventIntegrationAssociationsResponse,list_event_integration_associations_response +ListEventIntegrationsRequest,list_event_integrations_request +ListEventIntegrationsResponse,list_event_integrations_response +ListEventLogsRequest,list_event_logs_request +ListEventLogsResponse,list_event_logs_response +ListEventPredictionsRequest,list_event_predictions_request +ListEventPredictionsResult,list_event_predictions_result +ListEventSourceMappingsRequest,list_event_source_mappings_request +ListEventSourceMappingsResponse,list_event_source_mappings_response +ListEventSourcesRequest,list_event_sources_request +ListEventSourcesResponse,list_event_sources_response +ListEventStreamsRequest,list_event_streams_request +ListEventStreamsResponse,list_event_streams_response +ListEventSubscriptionsRequest,list_event_subscriptions_request +ListEventSubscriptionsResponse,list_event_subscriptions_response +ListEventTrackersRequest,list_event_trackers_request +ListEventTrackersResponse,list_event_trackers_response +ListEventTypesFilter,list_event_types_filter +ListEventTypesRequest,list_event_types_request +ListEventTypesResult,list_event_types_result +ListEventsDetectionJobsRequest,list_events_detection_jobs_request +ListEventsDetectionJobsResponse,list_events_detection_jobs_response +ListEventsFilters,list_events_filters +ListEventsRequest,list_events_request +ListEventsResponse,list_events_response +ListExclusionsRequest,list_exclusions_request +ListExclusionsResponse,list_exclusions_response +ListExecutionsInput,list_executions_input +ListExecutionsOutput,list_executions_output +ListExecutionsRequest,list_executions_request +ListExecutionsResponse,list_executions_response +ListExecutorsRequest,list_executors_request +ListExecutorsResponse,list_executors_response +ListExperienceEntitiesRequest,list_experience_entities_request +ListExperienceEntitiesResponse,list_experience_entities_response +ListExperiencesRequest,list_experiences_request +ListExperiencesResponse,list_experiences_response +ListExperimentTemplatesRequest,list_experiment_templates_request +ListExperimentTemplatesResponse,list_experiment_templates_response +ListExperimentsRequest,list_experiments_request +ListExperimentsResponse,list_experiments_response +ListExplainabilitiesRequest,list_explainabilities_request +ListExplainabilitiesResponse,list_explainabilities_response +ListExplainabilityExportsRequest,list_explainability_exports_request +ListExplainabilityExportsResponse,list_explainability_exports_response +ListExportErrorsRequest,list_export_errors_request +ListExportErrorsResponse,list_export_errors_response +ListExportJobsRequest,list_export_jobs_request +ListExportJobsResponse,list_export_jobs_response +ListExportsInput,list_exports_input +ListExportsOutput,list_exports_output +ListExportsRequest,list_exports_request +ListExportsRequestFilters,list_exports_request_filters +ListExportsResponse,list_exports_response +ListExtensibleSourceServersRequest,list_extensible_source_servers_request +ListExtensibleSourceServersResponse,list_extensible_source_servers_response +ListExtensionAssociationsRequest,list_extension_associations_request +ListExtensionVersionsRequest,list_extension_versions_request +ListExtensionVersionsResult,list_extension_versions_result +ListExtensionsRequest,list_extensions_request +ListExtensionsResult,list_extensions_result +ListFHIRDatastoresRequest,list_fhir_datastores_request +ListFHIRDatastoresResponse,list_fhir_datastores_response +ListFHIRExportJobsRequest,list_fhir_export_jobs_request +ListFHIRExportJobsResponse,list_fhir_export_jobs_response +ListFHIRImportJobsRequest,list_fhir_import_jobs_request +ListFHIRImportJobsResponse,list_fhir_import_jobs_response +ListFacesRequest,list_faces_request +ListFacesResponse,list_faces_response +ListFacetAttributesRequest,list_facet_attributes_request +ListFacetAttributesResponse,list_facet_attributes_response +ListFacetNamesRequest,list_facet_names_request +ListFacetNamesResponse,list_facet_names_response +ListFailuresForLicenseConfigurationOperationsRequest,list_failures_for_license_configuration_operations_request +ListFailuresForLicenseConfigurationOperationsResponse,list_failures_for_license_configuration_operations_response +ListFaqsRequest,list_faqs_request +ListFaqsResponse,list_faqs_response +ListFargateProfilesRequest,list_fargate_profiles_request +ListFargateProfilesResponse,list_fargate_profiles_response +ListFeatureGroupsRequest,list_feature_groups_request +ListFeatureGroupsResponse,list_feature_groups_response +ListFeaturedResultsSetsRequest,list_featured_results_sets_request +ListFeaturedResultsSetsResponse,list_featured_results_sets_response +ListFeaturesRequest,list_features_request +ListFeaturesResponse,list_features_response +ListFieldLevelEncryptionConfigsRequest,list_field_level_encryption_configs_request +ListFieldLevelEncryptionConfigsResult,list_field_level_encryption_configs_result +ListFieldLevelEncryptionProfilesRequest,list_field_level_encryption_profiles_request +ListFieldLevelEncryptionProfilesResult,list_field_level_encryption_profiles_result +ListFieldOptionsRequest,list_field_options_request +ListFieldOptionsResponse,list_field_options_response +ListFieldsRequest,list_fields_request +ListFieldsResponse,list_fields_response +ListFileCommitHistoryRequest,list_file_commit_history_request +ListFileCommitHistoryResponse,list_file_commit_history_response +ListFileSharesInput,list_file_shares_input +ListFileSharesOutput,list_file_shares_output +ListFileSystemAssociationsInput,list_file_system_associations_input +ListFileSystemAssociationsOutput,list_file_system_associations_output +ListFiltersRequest,list_filters_request +ListFiltersResponse,list_filters_response +ListFindingAggregationsRequest,list_finding_aggregations_request +ListFindingAggregationsResponse,list_finding_aggregations_response +ListFindingAggregatorsRequest,list_finding_aggregators_request +ListFindingAggregatorsResponse,list_finding_aggregators_response +ListFindingsFiltersRequest,list_findings_filters_request +ListFindingsFiltersResponse,list_findings_filters_response +ListFindingsMetricsRequest,list_findings_metrics_request +ListFindingsMetricsResponse,list_findings_metrics_response +ListFindingsReportsRequest,list_findings_reports_request +ListFindingsReportsResponse,list_findings_reports_response +ListFindingsRequest,list_findings_request +ListFindingsResponse,list_findings_response +ListFirewallConfigsRequest,list_firewall_configs_request +ListFirewallConfigsResponse,list_firewall_configs_response +ListFirewallDomainListsRequest,list_firewall_domain_lists_request +ListFirewallDomainListsResponse,list_firewall_domain_lists_response +ListFirewallDomainsRequest,list_firewall_domains_request +ListFirewallDomainsResponse,list_firewall_domains_response +ListFirewallPoliciesRequest,list_firewall_policies_request +ListFirewallPoliciesResponse,list_firewall_policies_response +ListFirewallRuleGroupAssociationsRequest,list_firewall_rule_group_associations_request +ListFirewallRuleGroupAssociationsResponse,list_firewall_rule_group_associations_response +ListFirewallRuleGroupsRequest,list_firewall_rule_groups_request +ListFirewallRuleGroupsResponse,list_firewall_rule_groups_response +ListFirewallRulesRequest,list_firewall_rules_request +ListFirewallRulesResponse,list_firewall_rules_response +ListFirewallsRequest,list_firewalls_request +ListFirewallsResponse,list_firewalls_response +ListFleetMetricsRequest,list_fleet_metrics_request +ListFleetMetricsResponse,list_fleet_metrics_response +ListFleetsForVehicleRequest,list_fleets_for_vehicle_request +ListFleetsForVehicleResponse,list_fleets_for_vehicle_response +ListFleetsInput,list_fleets_input +ListFleetsOutput,list_fleets_output +ListFleetsRequest,list_fleets_request +ListFleetsResponse,list_fleets_response +ListFlowDefinitionsRequest,list_flow_definitions_request +ListFlowDefinitionsResponse,list_flow_definitions_response +ListFlowExecutionMessagesRequest,list_flow_execution_messages_request +ListFlowExecutionMessagesResponse,list_flow_execution_messages_response +ListFlowsRequest,list_flows_request +ListFlowsResponse,list_flows_response +ListFlywheelIterationHistoryRequest,list_flywheel_iteration_history_request +ListFlywheelIterationHistoryResponse,list_flywheel_iteration_history_response +ListFlywheelsRequest,list_flywheels_request +ListFlywheelsResponse,list_flywheels_response +ListFolderMembersRequest,list_folder_members_request +ListFolderMembersResponse,list_folder_members_response +ListFoldersRequest,list_folders_request +ListFoldersResponse,list_folders_response +ListForecastExportJobsRequest,list_forecast_export_jobs_request +ListForecastExportJobsResponse,list_forecast_export_jobs_response +ListForecastsRequest,list_forecasts_request +ListForecastsResponse,list_forecasts_response +ListFormsRequest,list_forms_request +ListFormsResponse,list_forms_response +ListFoundationModelsRequest,list_foundation_models_request +ListFoundationModelsResponse,list_foundation_models_response +ListFragmentsInput,list_fragments_input +ListFragmentsOutput,list_fragments_output +ListFrameworksInput,list_frameworks_input +ListFrameworksOutput,list_frameworks_output +ListFraudsterRegistrationJobsRequest,list_fraudster_registration_jobs_request +ListFraudsterRegistrationJobsResponse,list_fraudster_registration_jobs_response +ListFraudstersRequest,list_fraudsters_request +ListFraudstersResponse,list_fraudsters_response +ListFunctionDefinitionVersionsRequest,list_function_definition_versions_request +ListFunctionDefinitionVersionsResponse,list_function_definition_versions_response +ListFunctionDefinitionsRequest,list_function_definitions_request +ListFunctionDefinitionsResponse,list_function_definitions_response +ListFunctionEventInvokeConfigsRequest,list_function_event_invoke_configs_request +ListFunctionEventInvokeConfigsResponse,list_function_event_invoke_configs_response +ListFunctionUrlConfigsRequest,list_function_url_configs_request +ListFunctionUrlConfigsResponse,list_function_url_configs_response +ListFunctionsByCodeSigningConfigRequest,list_functions_by_code_signing_config_request +ListFunctionsByCodeSigningConfigResponse,list_functions_by_code_signing_config_response +ListFunctionsRequest,list_functions_request +ListFunctionsResponse,list_functions_response +ListFunctionsResult,list_functions_result +ListFuotaTasksRequest,list_fuota_tasks_request +ListFuotaTasksResponse,list_fuota_tasks_response +ListGameServerGroupsInput,list_game_server_groups_input +ListGameServerGroupsOutput,list_game_server_groups_output +ListGameServersInput,list_game_servers_input +ListGameServersOutput,list_game_servers_output +ListGamesRequest,list_games_request +ListGamesResult,list_games_result +ListGatewayGroupsRequest,list_gateway_groups_request +ListGatewayGroupsResponse,list_gateway_groups_response +ListGatewayInstancesRequest,list_gateway_instances_request +ListGatewayInstancesResponse,list_gateway_instances_response +ListGatewayRoutesInput,list_gateway_routes_input +ListGatewayRoutesOutput,list_gateway_routes_output +ListGatewaysInput,list_gateways_input +ListGatewaysOutput,list_gateways_output +ListGatewaysRequest,list_gateways_request +ListGatewaysResponse,list_gateways_response +ListGeneratedCodeJobsRequest,list_generated_code_jobs_request +ListGeneratedCodeJobsResult,list_generated_code_jobs_result +ListGeoLocationsRequest,list_geo_locations_request +ListGeoLocationsResponse,list_geo_locations_response +ListGeoMatchSetsRequest,list_geo_match_sets_request +ListGeoMatchSetsResponse,list_geo_match_sets_response +ListGeofenceCollectionsRequest,list_geofence_collections_request +ListGeofenceCollectionsResponse,list_geofence_collections_response +ListGeofenceCollectionsResponseEntry,list_geofence_collections_response_entry +ListGeofenceResponseEntry,list_geofence_response_entry +ListGeofencesRequest,list_geofences_request +ListGeofencesResponse,list_geofences_response +ListGitHubAccountTokenNamesInput,list_git_hub_account_token_names_input +ListGitHubAccountTokenNamesOutput,list_git_hub_account_token_names_output +ListGlobalTablesInput,list_global_tables_input +ListGlobalTablesOutput,list_global_tables_output +ListGrantsRequest,list_grants_request +ListGrantsResponse,list_grants_response +ListGraphqlApisRequest,list_graphql_apis_request +ListGraphqlApisResponse,list_graphql_apis_response +ListGraphsRequest,list_graphs_request +ListGraphsResponse,list_graphs_response +ListGremlinQueriesInput,list_gremlin_queries_input +ListGremlinQueriesOutput,list_gremlin_queries_output +ListGroundStationsRequest,list_ground_stations_request +ListGroundStationsResponse,list_ground_stations_response +ListGroupCertificateAuthoritiesRequest,list_group_certificate_authorities_request +ListGroupCertificateAuthoritiesResponse,list_group_certificate_authorities_response +ListGroupMembersRequest,list_group_members_request +ListGroupMembersResponse,list_group_members_response +ListGroupMembershipsForMemberRequest,list_group_memberships_for_member_request +ListGroupMembershipsForMemberResponse,list_group_memberships_for_member_response +ListGroupMembershipsRequest,list_group_memberships_request +ListGroupMembershipsResponse,list_group_memberships_response +ListGroupPoliciesRequest,list_group_policies_request +ListGroupPoliciesResponse,list_group_policies_response +ListGroupResourcesInput,list_group_resources_input +ListGroupResourcesItem,list_group_resources_item +ListGroupResourcesOutput,list_group_resources_output +ListGroupResourcesRequest,list_group_resources_request +ListGroupResourcesResponse,list_group_resources_response +ListGroupVersionsRequest,list_group_versions_request +ListGroupVersionsResponse,list_group_versions_response +ListGroupsFilters,list_groups_filters +ListGroupsForEntityFilters,list_groups_for_entity_filters +ListGroupsForEntityRequest,list_groups_for_entity_request +ListGroupsForEntityResponse,list_groups_for_entity_response +ListGroupsForUserRequest,list_groups_for_user_request +ListGroupsForUserResponse,list_groups_for_user_response +ListGroupsInput,list_groups_input +ListGroupsOlderThanOrderingIdRequest,list_groups_older_than_ordering_id_request +ListGroupsOlderThanOrderingIdResponse,list_groups_older_than_ordering_id_response +ListGroupsOutput,list_groups_output +ListGroupsRequest,list_groups_request +ListGroupsResponse,list_groups_response +ListHITsForQualificationTypeRequest,list_hits_for_qualification_type_request +ListHITsForQualificationTypeResponse,list_hits_for_qualification_type_response +ListHITsRequest,list_hits_request +ListHITsResponse,list_hits_response +ListHandshakesForAccountRequest,list_handshakes_for_account_request +ListHandshakesForAccountResponse,list_handshakes_for_account_response +ListHandshakesForOrganizationRequest,list_handshakes_for_organization_request +ListHandshakesForOrganizationResponse,list_handshakes_for_organization_response +ListHapgsRequest,list_hapgs_request +ListHapgsResponse,list_hapgs_response +ListHarvestJobsRequest,list_harvest_jobs_request +ListHarvestJobsResponse,list_harvest_jobs_response +ListHealthChecksRequest,list_health_checks_request +ListHealthChecksResponse,list_health_checks_response +ListHealthEventsInput,list_health_events_input +ListHealthEventsOutput,list_health_events_output +ListHlsManifestConfiguration,list_hls_manifest_configuration +ListHostKeysRequest,list_host_keys_request +ListHostKeysResponse,list_host_keys_response +ListHostedConfigurationVersionsRequest,list_hosted_configuration_versions_request +ListHostedZonesByNameRequest,list_hosted_zones_by_name_request +ListHostedZonesByNameResponse,list_hosted_zones_by_name_response +ListHostedZonesByVPCRequest,list_hosted_zones_by_vpc_request +ListHostedZonesByVPCResponse,list_hosted_zones_by_vpc_response +ListHostedZonesRequest,list_hosted_zones_request +ListHostedZonesResponse,list_hosted_zones_response +ListHostsInput,list_hosts_input +ListHostsOutput,list_hosts_output +ListHoursOfOperationsRequest,list_hours_of_operations_request +ListHoursOfOperationsResponse,list_hours_of_operations_response +ListHsmsRequest,list_hsms_request +ListHsmsResponse,list_hsms_response +ListHubContentVersionsRequest,list_hub_content_versions_request +ListHubContentVersionsResponse,list_hub_content_versions_response +ListHubContentsRequest,list_hub_contents_request +ListHubContentsResponse,list_hub_contents_response +ListHubsRequest,list_hubs_request +ListHubsResponse,list_hubs_response +ListHumanLoopsRequest,list_human_loops_request +ListHumanLoopsResponse,list_human_loops_response +ListHumanTaskUisRequest,list_human_task_uis_request +ListHumanTaskUisResponse,list_human_task_uis_response +ListHyperParameterTuningJobsRequest,list_hyper_parameter_tuning_jobs_request +ListHyperParameterTuningJobsResponse,list_hyper_parameter_tuning_jobs_response +ListHypervisorsInput,list_hypervisors_input +ListHypervisorsOutput,list_hypervisors_output +ListIAMPolicyAssignmentsForUserRequest,list_iam_policy_assignments_for_user_request +ListIAMPolicyAssignmentsForUserResponse,list_iam_policy_assignments_for_user_response +ListIAMPolicyAssignmentsRequest,list_iam_policy_assignments_request +ListIAMPolicyAssignmentsResponse,list_iam_policy_assignments_response +ListICD10CMInferenceJobsRequest,list_icd10_cm_inference_jobs_request +ListICD10CMInferenceJobsResponse,list_icd10_cm_inference_jobs_response +ListIPSetsRequest,list_ip_sets_request +ListIPSetsResponse,list_ip_sets_response +ListId,list_id +ListIdentitiesInput,list_identities_input +ListIdentitiesRequest,list_identities_request +ListIdentitiesResponse,list_identities_response +ListIdentityPoliciesRequest,list_identity_policies_request +ListIdentityPoliciesResponse,list_identity_policies_response +ListIdentityPoolUsageRequest,list_identity_pool_usage_request +ListIdentityPoolUsageResponse,list_identity_pool_usage_response +ListIdentityPoolsInput,list_identity_pools_input +ListIdentityPoolsResponse,list_identity_pools_response +ListIdentityProviderConfigsRequest,list_identity_provider_configs_request +ListIdentityProviderConfigsResponse,list_identity_provider_configs_response +ListIdentityProvidersRequest,list_identity_providers_request +ListIdentityProvidersResponse,list_identity_providers_response +ListIdentityResolutionJobsRequest,list_identity_resolution_jobs_request +ListIdentityResolutionJobsResponse,list_identity_resolution_jobs_response +ListIdentitySourcesInput,list_identity_sources_input +ListIdentitySourcesOutput,list_identity_sources_output +ListImageBuildVersionsRequest,list_image_build_versions_request +ListImageBuildVersionsResponse,list_image_build_versions_response +ListImagePackagesRequest,list_image_packages_request +ListImagePackagesResponse,list_image_packages_response +ListImagePipelineImagesRequest,list_image_pipeline_images_request +ListImagePipelineImagesResponse,list_image_pipeline_images_response +ListImagePipelinesRequest,list_image_pipelines_request +ListImagePipelinesResponse,list_image_pipelines_response +ListImageRecipesRequest,list_image_recipes_request +ListImageRecipesResponse,list_image_recipes_response +ListImageScanFindingAggregationsRequest,list_image_scan_finding_aggregations_request +ListImageScanFindingAggregationsResponse,list_image_scan_finding_aggregations_response +ListImageScanFindingsRequest,list_image_scan_findings_request +ListImageScanFindingsResponse,list_image_scan_findings_response +ListImageSetVersionsRequest,list_image_set_versions_request +ListImageSetVersionsResponse,list_image_set_versions_response +ListImageVersionsRequest,list_image_versions_request +ListImageVersionsResponse,list_image_versions_response +ListImagesFilter,list_images_filter +ListImagesInRecycleBinRequest,list_images_in_recycle_bin_request +ListImagesInRecycleBinResult,list_images_in_recycle_bin_result +ListImagesRequest,list_images_request +ListImagesResponse,list_images_response +ListImpersonationRolesRequest,list_impersonation_roles_request +ListImpersonationRolesResponse,list_impersonation_roles_response +ListImportErrorsRequest,list_import_errors_request +ListImportErrorsResponse,list_import_errors_response +ListImportFailuresRequest,list_import_failures_request +ListImportFailuresResponse,list_import_failures_response +ListImportFileTaskRequest,list_import_file_task_request +ListImportFileTaskResponse,list_import_file_task_response +ListImportJobsRequest,list_import_jobs_request +ListImportJobsResponse,list_import_jobs_response +ListImportsInput,list_imports_input +ListImportsOutput,list_imports_output +ListImportsRequest,list_imports_request +ListImportsRequestFilters,list_imports_request_filters +ListImportsResponse,list_imports_response +ListIncidentRecordsInput,list_incident_records_input +ListIncidentRecordsOutput,list_incident_records_output +ListIncomingTypedLinks,list_incoming_typed_links +ListIncomingTypedLinksRequest,list_incoming_typed_links_request +ListIncomingTypedLinksResponse,list_incoming_typed_links_response +ListIndex,list_index +ListIndexRequest,list_index_request +ListIndexResponse,list_index_response +ListIndexesInput,list_indexes_input +ListIndexesOutput,list_indexes_output +ListIndicesRequest,list_indices_request +ListIndicesResponse,list_indices_response +ListInferenceEventsRequest,list_inference_events_request +ListInferenceEventsResponse,list_inference_events_response +ListInferenceExecutionsRequest,list_inference_executions_request +ListInferenceExecutionsResponse,list_inference_executions_response +ListInferenceExperimentsRequest,list_inference_experiments_request +ListInferenceExperimentsResponse,list_inference_experiments_response +ListInferenceRecommendationsJobStepsRequest,list_inference_recommendations_job_steps_request +ListInferenceRecommendationsJobStepsResponse,list_inference_recommendations_job_steps_response +ListInferenceRecommendationsJobsRequest,list_inference_recommendations_jobs_request +ListInferenceRecommendationsJobsResponse,list_inference_recommendations_jobs_response +ListInferenceSchedulersRequest,list_inference_schedulers_request +ListInferenceSchedulersResponse,list_inference_schedulers_response +ListInfrastructureConfigurationsRequest,list_infrastructure_configurations_request +ListInfrastructureConfigurationsResponse,list_infrastructure_configurations_response +ListIngestionDestinationsRequest,list_ingestion_destinations_request +ListIngestionDestinationsResponse,list_ingestion_destinations_response +ListIngestionsRequest,list_ingestions_request +ListIngestionsResponse,list_ingestions_response +ListInputDeviceTransfersRequest,list_input_device_transfers_request +ListInputDeviceTransfersResponse,list_input_device_transfers_response +ListInputDevicesRequest,list_input_devices_request +ListInputDevicesResponse,list_input_devices_response +ListInputRoutingsRequest,list_input_routings_request +ListInputRoutingsResponse,list_input_routings_response +ListInputSecurityGroupsRequest,list_input_security_groups_request +ListInputSecurityGroupsResponse,list_input_security_groups_response +ListInputsRequest,list_inputs_request +ListInputsResponse,list_inputs_response +ListInsightsAnyStatusFilter,list_insights_any_status_filter +ListInsightsClosedStatusFilter,list_insights_closed_status_filter +ListInsightsOngoingStatusFilter,list_insights_ongoing_status_filter +ListInsightsRequest,list_insights_request +ListInsightsResponse,list_insights_response +ListInsightsStatusFilter,list_insights_status_filter +ListInstalledComponentsRequest,list_installed_components_request +ListInstalledComponentsResponse,list_installed_components_response +ListInstanceAttributesRequest,list_instance_attributes_request +ListInstanceAttributesResponse,list_instance_attributes_response +ListInstanceFleetsInput,list_instance_fleets_input +ListInstanceFleetsOutput,list_instance_fleets_output +ListInstanceGroupsInput,list_instance_groups_input +ListInstanceGroupsOutput,list_instance_groups_output +ListInstanceProfileTagsRequest,list_instance_profile_tags_request +ListInstanceProfileTagsResponse,list_instance_profile_tags_response +ListInstanceProfilesForRoleRequest,list_instance_profiles_for_role_request +ListInstanceProfilesForRoleResponse,list_instance_profiles_for_role_response +ListInstanceProfilesRequest,list_instance_profiles_request +ListInstanceProfilesResponse,list_instance_profiles_response +ListInstanceProfilesResult,list_instance_profiles_result +ListInstanceStorageConfigsRequest,list_instance_storage_configs_request +ListInstanceStorageConfigsResponse,list_instance_storage_configs_response +ListInstanceTypeDetailsRequest,list_instance_type_details_request +ListInstanceTypeDetailsResponse,list_instance_type_details_response +ListInstancesInput,list_instances_input +ListInstancesOutput,list_instances_output +ListInstancesRequest,list_instances_request +ListInstancesResponse,list_instances_response +ListIntegrationAssociationsRequest,list_integration_associations_request +ListIntegrationAssociationsResponse,list_integration_associations_response +ListIntegrationItem,list_integration_item +ListIntegrationsRequest,list_integrations_request +ListIntegrationsResponse,list_integrations_response +ListIntentMetricsRequest,list_intent_metrics_request +ListIntentMetricsResponse,list_intent_metrics_response +ListIntentPathsRequest,list_intent_paths_request +ListIntentPathsResponse,list_intent_paths_response +ListIntentStageMetricsRequest,list_intent_stage_metrics_request +ListIntentStageMetricsResponse,list_intent_stage_metrics_response +ListIntentsRequest,list_intents_request +ListIntentsResponse,list_intents_response +ListInvalidationsRequest,list_invalidations_request +ListInvalidationsResult,list_invalidations_result +ListInventoryEntriesRequest,list_inventory_entries_request +ListInventoryEntriesResult,list_inventory_entries_result +ListInvitationsInput,list_invitations_input +ListInvitationsOutput,list_invitations_output +ListInvitationsRequest,list_invitations_request +ListInvitationsResponse,list_invitations_response +ListIpAccessSettingsRequest,list_ip_access_settings_request +ListIpAccessSettingsResponse,list_ip_access_settings_response +ListIpRoutesRequest,list_ip_routes_request +ListIpRoutesResult,list_ip_routes_result +ListItemsRequest,list_items_request +ListItemsResponse,list_items_response +ListJobExecutionsForJobRequest,list_job_executions_for_job_request +ListJobExecutionsForJobResponse,list_job_executions_for_job_response +ListJobExecutionsForThingRequest,list_job_executions_for_thing_request +ListJobExecutionsForThingResponse,list_job_executions_for_thing_response +ListJobRunsRequest,list_job_runs_request +ListJobRunsResponse,list_job_runs_response +ListJobTemplatesRequest,list_job_templates_request +ListJobTemplatesResponse,list_job_templates_response +ListJobsByPipelineRequest,list_jobs_by_pipeline_request +ListJobsByPipelineResponse,list_jobs_by_pipeline_response +ListJobsByStatusRequest,list_jobs_by_status_request +ListJobsByStatusResponse,list_jobs_by_status_response +ListJobsFilterCriteria,list_jobs_filter_criteria +ListJobsFilterTerm,list_jobs_filter_term +ListJobsInput,list_jobs_input +ListJobsOutput,list_jobs_output +ListJobsRequest,list_jobs_request +ListJobsResponse,list_jobs_response +ListJobsResult,list_jobs_result +ListJobsSortCriteria,list_jobs_sort_criteria +ListJournalKinesisStreamsForLedgerRequest,list_journal_kinesis_streams_for_ledger_request +ListJournalKinesisStreamsForLedgerResponse,list_journal_kinesis_streams_for_ledger_response +ListJournalS3ExportsForLedgerRequest,list_journal_s3_exports_for_ledger_request +ListJournalS3ExportsForLedgerResponse,list_journal_s3_exports_for_ledger_response +ListJournalS3ExportsRequest,list_journal_s3_exports_request +ListJournalS3ExportsResponse,list_journal_s3_exports_response +ListJourneysRequest,list_journeys_request +ListJourneysResponse,list_journeys_response +ListKafkaVersionsRequest,list_kafka_versions_request +ListKafkaVersionsResponse,list_kafka_versions_response +ListKeyGroupsRequest,list_key_groups_request +ListKeyGroupsResult,list_key_groups_result +ListKeyPhrasesDetectionJobsRequest,list_key_phrases_detection_jobs_request +ListKeyPhrasesDetectionJobsResponse,list_key_phrases_detection_jobs_response +ListKeyPoliciesRequest,list_key_policies_request +ListKeyPoliciesResponse,list_key_policies_response +ListKeysInput,list_keys_input +ListKeysOutput,list_keys_output +ListKeysRequest,list_keys_request +ListKeysResponse,list_keys_response +ListKeysResponseEntry,list_keys_response_entry +ListKeyspacesRequest,list_keyspaces_request +ListKeyspacesResponse,list_keyspaces_response +ListKeywordsForDataSourceRequest,list_keywords_for_data_source_request +ListKeywordsForDataSourceResponse,list_keywords_for_data_source_response +ListKnowledgeBasesRequest,list_knowledge_bases_request +ListKnowledgeBasesResponse,list_knowledge_bases_response +ListKxChangesetsRequest,list_kx_changesets_request +ListKxChangesetsResponse,list_kx_changesets_response +ListKxClusterNodesRequest,list_kx_cluster_nodes_request +ListKxClusterNodesResponse,list_kx_cluster_nodes_response +ListKxClustersRequest,list_kx_clusters_request +ListKxClustersResponse,list_kx_clusters_response +ListKxDatabasesRequest,list_kx_databases_request +ListKxDatabasesResponse,list_kx_databases_response +ListKxEnvironmentsRequest,list_kx_environments_request +ListKxEnvironmentsResponse,list_kx_environments_response +ListKxUsersRequest,list_kx_users_request +ListKxUsersResponse,list_kx_users_response +ListLFTagsRequest,list_lf_tags_request +ListLFTagsResponse,list_lf_tags_response +ListLabelGroupsRequest,list_label_groups_request +ListLabelGroupsResponse,list_label_groups_response +ListLabelingJobsForWorkteamRequest,list_labeling_jobs_for_workteam_request +ListLabelingJobsForWorkteamResponse,list_labeling_jobs_for_workteam_response +ListLabelingJobsRequest,list_labeling_jobs_request +ListLabelingJobsResponse,list_labeling_jobs_response +ListLabelsRequest,list_labels_request +ListLabelsResponse,list_labels_response +ListLakeFormationOptInsRequest,list_lake_formation_opt_ins_request +ListLakeFormationOptInsResponse,list_lake_formation_opt_ins_response +ListLambdaFunctionsRequest,list_lambda_functions_request +ListLambdaFunctionsResponse,list_lambda_functions_response +ListLanguageModelsRequest,list_language_models_request +ListLanguageModelsResponse,list_language_models_response +ListLanguagesRequest,list_languages_request +ListLanguagesResponse,list_languages_response +ListLaunchActionsRequest,list_launch_actions_request +ListLaunchActionsResponse,list_launch_actions_response +ListLaunchPathsInput,list_launch_paths_input +ListLaunchPathsOutput,list_launch_paths_output +ListLaunchProfileMembersRequest,list_launch_profile_members_request +ListLaunchProfileMembersResponse,list_launch_profile_members_response +ListLaunchProfilesRequest,list_launch_profiles_request +ListLaunchProfilesResponse,list_launch_profiles_response +ListLaunchesRequest,list_launches_request +ListLaunchesResponse,list_launches_response +ListLayerVersionsRequest,list_layer_versions_request +ListLayerVersionsResponse,list_layer_versions_response +ListLayersRequest,list_layers_request +ListLayersResponse,list_layers_response +ListLayoutsRequest,list_layouts_request +ListLayoutsResponse,list_layouts_response +ListLedgersRequest,list_ledgers_request +ListLedgersResponse,list_ledgers_response +ListLegalHoldsInput,list_legal_holds_input +ListLegalHoldsOutput,list_legal_holds_output +ListLensReviewImprovementsInput,list_lens_review_improvements_input +ListLensReviewImprovementsOutput,list_lens_review_improvements_output +ListLensReviewsInput,list_lens_reviews_input +ListLensReviewsOutput,list_lens_reviews_output +ListLensSharesInput,list_lens_shares_input +ListLensSharesOutput,list_lens_shares_output +ListLensesInput,list_lenses_input +ListLensesOutput,list_lenses_output +ListLexBotsRequest,list_lex_bots_request +ListLexBotsResponse,list_lex_bots_response +ListLexiconsInput,list_lexicons_input +ListLexiconsOutput,list_lexicons_output +ListLicenseConfigurationsRequest,list_license_configurations_request +ListLicenseConfigurationsResponse,list_license_configurations_response +ListLicenseConversionTasksRequest,list_license_conversion_tasks_request +ListLicenseConversionTasksResponse,list_license_conversion_tasks_response +ListLicenseManagerReportGeneratorsRequest,list_license_manager_report_generators_request +ListLicenseManagerReportGeneratorsResponse,list_license_manager_report_generators_response +ListLicenseSpecificationsForResourceRequest,list_license_specifications_for_resource_request +ListLicenseSpecificationsForResourceResponse,list_license_specifications_for_resource_response +ListLicenseVersionsRequest,list_license_versions_request +ListLicenseVersionsResponse,list_license_versions_response +ListLicensesRequest,list_licenses_request +ListLicensesResponse,list_licenses_response +ListLineageGroupsRequest,list_lineage_groups_request +ListLineageGroupsResponse,list_lineage_groups_response +ListLinksInput,list_links_input +ListLinksItem,list_links_item +ListLinksOutput,list_links_output +ListLinuxSubscriptionInstancesRequest,list_linux_subscription_instances_request +ListLinuxSubscriptionInstancesResponse,list_linux_subscription_instances_response +ListLinuxSubscriptionsRequest,list_linux_subscriptions_request +ListLinuxSubscriptionsResponse,list_linux_subscriptions_response +ListListenersRequest,list_listeners_request +ListListenersResponse,list_listeners_response +ListLiveSourcesRequest,list_live_sources_request +ListLiveSourcesResponse,list_live_sources_response +ListLoaderJobsInput,list_loader_jobs_input +ListLoaderJobsOutput,list_loader_jobs_output +ListLocalDisksInput,list_local_disks_input +ListLocalDisksOutput,list_local_disks_output +ListLocationsInput,list_locations_input +ListLocationsOutput,list_locations_output +ListLocationsRequest,list_locations_request +ListLocationsResponse,list_locations_response +ListLogPatternSetsRequest,list_log_pattern_sets_request +ListLogPatternSetsResponse,list_log_pattern_sets_response +ListLogPatternsRequest,list_log_patterns_request +ListLogPatternsResponse,list_log_patterns_response +ListLogSourcesRequest,list_log_sources_request +ListLogSourcesResponse,list_log_sources_response +ListLogSubscriptionsRequest,list_log_subscriptions_request +ListLogSubscriptionsResult,list_log_subscriptions_result +ListLoggerDefinitionVersionsRequest,list_logger_definition_versions_request +ListLoggerDefinitionVersionsResponse,list_logger_definition_versions_response +ListLoggerDefinitionsRequest,list_logger_definitions_request +ListLoggerDefinitionsResponse,list_logger_definitions_response +ListLoggingConfigurationsRequest,list_logging_configurations_request +ListLoggingConfigurationsResponse,list_logging_configurations_response +ListLongTermPricingRequest,list_long_term_pricing_request +ListLongTermPricingResult,list_long_term_pricing_result +ListLowLatencyHlsManifestConfiguration,list_low_latency_hls_manifest_configuration +ListLunaClientsRequest,list_luna_clients_request +ListLunaClientsResponse,list_luna_clients_response +ListMFADeviceTagsRequest,list_mfa_device_tags_request +ListMFADeviceTagsResponse,list_mfa_device_tags_response +ListMFADevicesRequest,list_mfa_devices_request +ListMFADevicesResponse,list_mfa_devices_response +ListMLDataProcessingJobsInput,list_ml_data_processing_jobs_input +ListMLDataProcessingJobsOutput,list_ml_data_processing_jobs_output +ListMLEndpointsInput,list_ml_endpoints_input +ListMLEndpointsOutput,list_ml_endpoints_output +ListMLModelTrainingJobsInput,list_ml_model_training_jobs_input +ListMLModelTrainingJobsOutput,list_ml_model_training_jobs_output +ListMLModelTransformJobsInput,list_ml_model_transform_jobs_input +ListMLModelTransformJobsOutput,list_ml_model_transform_jobs_output +ListMLTransformsRequest,list_ml_transforms_request +ListMLTransformsResponse,list_ml_transforms_response +ListMailDomainsRequest,list_mail_domains_request +ListMailDomainsResponse,list_mail_domains_response +ListMailboxExportJobsRequest,list_mailbox_export_jobs_request +ListMailboxExportJobsResponse,list_mailbox_export_jobs_response +ListMailboxPermissionsRequest,list_mailbox_permissions_request +ListMailboxPermissionsResponse,list_mailbox_permissions_response +ListManagedAccountsRequest,list_managed_accounts_request +ListManagedAccountsResponse,list_managed_accounts_response +ListManagedDataIdentifiersRequest,list_managed_data_identifiers_request +ListManagedDataIdentifiersResponse,list_managed_data_identifiers_response +ListManagedEndpointsRequest,list_managed_endpoints_request +ListManagedEndpointsResponse,list_managed_endpoints_response +ListManagedInsightRulesInput,list_managed_insight_rules_input +ListManagedInsightRulesOutput,list_managed_insight_rules_output +ListManagedJobTemplatesRequest,list_managed_job_templates_request +ListManagedJobTemplatesResponse,list_managed_job_templates_response +ListManagedPoliciesInPermissionSetRequest,list_managed_policies_in_permission_set_request +ListManagedPoliciesInPermissionSetResponse,list_managed_policies_in_permission_set_response +ListManagedResourcesRequest,list_managed_resources_request +ListManagedResourcesResponse,list_managed_resources_response +ListManagedRuleSetsRequest,list_managed_rule_sets_request +ListManagedRuleSetsResponse,list_managed_rule_sets_response +ListManagedSchemaArnsRequest,list_managed_schema_arns_request +ListManagedSchemaArnsResponse,list_managed_schema_arns_response +ListManagementOptions,list_management_options +ListMapRunsInput,list_map_runs_input +ListMapRunsOutput,list_map_runs_output +ListMapsRequest,list_maps_request +ListMapsResponse,list_maps_response +ListMapsResponseEntry,list_maps_response_entry +ListMatchingJobsInput,list_matching_jobs_input +ListMatchingJobsOutput,list_matching_jobs_output +ListMatchingWorkflowsInput,list_matching_workflows_input +ListMatchingWorkflowsOutput,list_matching_workflows_output +ListMediaCapturePipelinesRequest,list_media_capture_pipelines_request +ListMediaCapturePipelinesResponse,list_media_capture_pipelines_response +ListMediaInsightsPipelineConfigurationsRequest,list_media_insights_pipeline_configurations_request +ListMediaInsightsPipelineConfigurationsResponse,list_media_insights_pipeline_configurations_response +ListMediaPipelineKinesisVideoStreamPoolsRequest,list_media_pipeline_kinesis_video_stream_pools_request +ListMediaPipelineKinesisVideoStreamPoolsResponse,list_media_pipeline_kinesis_video_stream_pools_response +ListMediaPipelinesRequest,list_media_pipelines_request +ListMediaPipelinesResponse,list_media_pipelines_response +ListMedicalTranscriptionJobsRequest,list_medical_transcription_jobs_request +ListMedicalTranscriptionJobsResponse,list_medical_transcription_jobs_response +ListMedicalVocabulariesRequest,list_medical_vocabularies_request +ListMedicalVocabulariesResponse,list_medical_vocabularies_response +ListMeetingTagsRequest,list_meeting_tags_request +ListMeetingTagsResponse,list_meeting_tags_response +ListMeetingsRequest,list_meetings_request +ListMeetingsResponse,list_meetings_response +ListMemberAccountsRequest,list_member_accounts_request +ListMemberAccountsResponse,list_member_accounts_response +ListMemberAccountsResult,list_member_accounts_result +ListMembersInput,list_members_input +ListMembersOutput,list_members_output +ListMembersRequest,list_members_request +ListMembersResponse,list_members_response +ListMembershipsInput,list_memberships_input +ListMembershipsOutput,list_memberships_output +ListMeshesInput,list_meshes_input +ListMeshesOutput,list_meshes_output +ListMessageMoveTasksRequest,list_message_move_tasks_request +ListMessageMoveTasksResult,list_message_move_tasks_result +ListMessageMoveTasksResultEntry,list_message_move_tasks_result_entry +ListMetricAttributionMetricsRequest,list_metric_attribution_metrics_request +ListMetricAttributionMetricsResponse,list_metric_attribution_metrics_response +ListMetricAttributionsRequest,list_metric_attributions_request +ListMetricAttributionsResponse,list_metric_attributions_response +ListMetricSetsRequest,list_metric_sets_request +ListMetricSetsResponse,list_metric_sets_response +ListMetricStreamsInput,list_metric_streams_input +ListMetricStreamsOutput,list_metric_streams_output +ListMetricValuesRequest,list_metric_values_request +ListMetricValuesResponse,list_metric_values_response +ListMetricsInput,list_metrics_input +ListMetricsOutput,list_metrics_output +ListMigrationTasksRequest,list_migration_tasks_request +ListMigrationTasksResult,list_migration_tasks_result +ListMigrationWorkflowTemplatesRequest,list_migration_workflow_templates_request +ListMigrationWorkflowTemplatesResponse,list_migration_workflow_templates_response +ListMigrationWorkflowsRequest,list_migration_workflows_request +ListMigrationWorkflowsResponse,list_migration_workflows_response +ListMilestonesInput,list_milestones_input +ListMilestonesOutput,list_milestones_output +ListMissionProfilesRequest,list_mission_profiles_request +ListMissionProfilesResponse,list_mission_profiles_response +ListMitigationActionsRequest,list_mitigation_actions_request +ListMitigationActionsResponse,list_mitigation_actions_response +ListMobileDeviceAccessOverridesRequest,list_mobile_device_access_overrides_request +ListMobileDeviceAccessOverridesResponse,list_mobile_device_access_overrides_response +ListMobileDeviceAccessRulesRequest,list_mobile_device_access_rules_request +ListMobileDeviceAccessRulesResponse,list_mobile_device_access_rules_response +ListMobileSdkReleasesRequest,list_mobile_sdk_releases_request +ListMobileSdkReleasesResponse,list_mobile_sdk_releases_response +ListModelBiasJobDefinitionsRequest,list_model_bias_job_definitions_request +ListModelBiasJobDefinitionsResponse,list_model_bias_job_definitions_response +ListModelCardExportJobsRequest,list_model_card_export_jobs_request +ListModelCardExportJobsResponse,list_model_card_export_jobs_response +ListModelCardVersionsRequest,list_model_card_versions_request +ListModelCardVersionsResponse,list_model_card_versions_response +ListModelCardsRequest,list_model_cards_request +ListModelCardsResponse,list_model_cards_response +ListModelCustomizationJobsRequest,list_model_customization_jobs_request +ListModelCustomizationJobsResponse,list_model_customization_jobs_response +ListModelExplainabilityJobDefinitionsRequest,list_model_explainability_job_definitions_request +ListModelExplainabilityJobDefinitionsResponse,list_model_explainability_job_definitions_response +ListModelManifestNodesRequest,list_model_manifest_nodes_request +ListModelManifestNodesResponse,list_model_manifest_nodes_response +ListModelManifestsRequest,list_model_manifests_request +ListModelManifestsResponse,list_model_manifests_response +ListModelMetadataRequest,list_model_metadata_request +ListModelMetadataResponse,list_model_metadata_response +ListModelPackageGroupsInput,list_model_package_groups_input +ListModelPackageGroupsOutput,list_model_package_groups_output +ListModelPackagesInput,list_model_packages_input +ListModelPackagesOutput,list_model_packages_output +ListModelPackagingJobsRequest,list_model_packaging_jobs_request +ListModelPackagingJobsResponse,list_model_packaging_jobs_response +ListModelQualityJobDefinitionsRequest,list_model_quality_job_definitions_request +ListModelQualityJobDefinitionsResponse,list_model_quality_job_definitions_response +ListModelVersionsRequest,list_model_versions_request +ListModelVersionsResponse,list_model_versions_response +ListModelsInput,list_models_input +ListModelsOutput,list_models_output +ListModelsRequest,list_models_request +ListModelsResponse,list_models_response +ListMonitorEvaluationsRequest,list_monitor_evaluations_request +ListMonitorEvaluationsResponse,list_monitor_evaluations_response +ListMonitoredResourcesFilters,list_monitored_resources_filters +ListMonitoredResourcesRequest,list_monitored_resources_request +ListMonitoredResourcesResponse,list_monitored_resources_response +ListMonitoringAlertHistoryRequest,list_monitoring_alert_history_request +ListMonitoringAlertHistoryResponse,list_monitoring_alert_history_response +ListMonitoringAlertsRequest,list_monitoring_alerts_request +ListMonitoringAlertsResponse,list_monitoring_alerts_response +ListMonitoringExecutionsRequest,list_monitoring_executions_request +ListMonitoringExecutionsResponse,list_monitoring_executions_response +ListMonitoringSchedulesRequest,list_monitoring_schedules_request +ListMonitoringSchedulesResponse,list_monitoring_schedules_response +ListMonitorsInput,list_monitors_input +ListMonitorsOutput,list_monitors_output +ListMonitorsRequest,list_monitors_request +ListMonitorsResponse,list_monitors_response +ListMultiRegionAccessPointsRequest,list_multi_region_access_points_request +ListMultiRegionAccessPointsResult,list_multi_region_access_points_result +ListMulticastGroupsByFuotaTaskRequest,list_multicast_groups_by_fuota_task_request +ListMulticastGroupsByFuotaTaskResponse,list_multicast_groups_by_fuota_task_response +ListMulticastGroupsRequest,list_multicast_groups_request +ListMulticastGroupsResponse,list_multicast_groups_response +ListMultipartReadSetUploadsRequest,list_multipart_read_set_uploads_request +ListMultipartReadSetUploadsResponse,list_multipart_read_set_uploads_response +ListMultipartUploadsInput,list_multipart_uploads_input +ListMultipartUploadsOutput,list_multipart_uploads_output +ListMultipartUploadsRequest,list_multipart_uploads_request +ListMultiplexProgramsRequest,list_multiplex_programs_request +ListMultiplexProgramsResponse,list_multiplex_programs_response +ListMultiplexesRequest,list_multiplexes_request +ListMultiplexesResponse,list_multiplexes_response +ListName,list_name +ListNamedQueriesInput,list_named_queries_input +ListNamedQueriesOutput,list_named_queries_output +ListNamedShadowsForThingRequest,list_named_shadows_for_thing_request +ListNamedShadowsForThingResponse,list_named_shadows_for_thing_response +ListNamespacesRequest,list_namespaces_request +ListNamespacesResponse,list_namespaces_response +ListNetworkAnalyzerConfigurationsRequest,list_network_analyzer_configurations_request +ListNetworkAnalyzerConfigurationsResponse,list_network_analyzer_configurations_response +ListNetworkProfilesRequest,list_network_profiles_request +ListNetworkProfilesResult,list_network_profiles_result +ListNetworkResourcesRequest,list_network_resources_request +ListNetworkResourcesResponse,list_network_resources_response +ListNetworkSettingsRequest,list_network_settings_request +ListNetworkSettingsResponse,list_network_settings_response +ListNetworkSitesRequest,list_network_sites_request +ListNetworkSitesResponse,list_network_sites_response +ListNetworksInput,list_networks_input +ListNetworksOutput,list_networks_output +ListNetworksRequest,list_networks_request +ListNetworksResponse,list_networks_response +ListNodeFromTemplateJobsRequest,list_node_from_template_jobs_request +ListNodeFromTemplateJobsResponse,list_node_from_template_jobs_response +ListNodegroupsRequest,list_nodegroups_request +ListNodegroupsResponse,list_nodegroups_response +ListNodesInput,list_nodes_input +ListNodesOutput,list_nodes_output +ListNodesRequest,list_nodes_request +ListNodesResponse,list_nodes_response +ListNotebookExecutionsInput,list_notebook_executions_input +ListNotebookExecutionsOutput,list_notebook_executions_output +ListNotebookInstanceLifecycleConfigsInput,list_notebook_instance_lifecycle_configs_input +ListNotebookInstanceLifecycleConfigsOutput,list_notebook_instance_lifecycle_configs_output +ListNotebookInstancesInput,list_notebook_instances_input +ListNotebookInstancesOutput,list_notebook_instances_output +ListNotebookMetadataInput,list_notebook_metadata_input +ListNotebookMetadataOutput,list_notebook_metadata_output +ListNotebookSessionsRequest,list_notebook_sessions_request +ListNotebookSessionsResponse,list_notebook_sessions_response +ListNotificationChannelsRequest,list_notification_channels_request +ListNotificationChannelsResponse,list_notification_channels_response +ListNotificationRulesFilter,list_notification_rules_filter +ListNotificationRulesRequest,list_notification_rules_request +ListNotificationRulesResult,list_notification_rules_result +ListNotificationsInput,list_notifications_input +ListNotificationsOutput,list_notifications_output +ListNotificationsRequest,list_notifications_request +ListNotificationsResponse,list_notifications_response +ListOTAUpdatesRequest,list_ota_updates_request +ListOTAUpdatesResponse,list_ota_updates_response +ListObjectAttributes,list_object_attributes +ListObjectAttributesRequest,list_object_attributes_request +ListObjectAttributesResponse,list_object_attributes_response +ListObjectChildren,list_object_children +ListObjectChildrenRequest,list_object_children_request +ListObjectChildrenResponse,list_object_children_response +ListObjectParentPaths,list_object_parent_paths +ListObjectParentPathsRequest,list_object_parent_paths_request +ListObjectParentPathsResponse,list_object_parent_paths_response +ListObjectParents,list_object_parents +ListObjectParentsRequest,list_object_parents_request +ListObjectParentsResponse,list_object_parents_response +ListObjectPolicies,list_object_policies +ListObjectPoliciesRequest,list_object_policies_request +ListObjectPoliciesResponse,list_object_policies_response +ListObjectVersionsOutput,list_object_versions_output +ListObjectVersionsRequest,list_object_versions_request +ListObjectsInput,list_objects_input +ListObjectsOutput,list_objects_output +ListObjectsRequest,list_objects_request +ListObjectsV2Output,list_objects_v2_output +ListObjectsV2Request,list_objects_v2_request +ListObservabilityConfigurationsRequest,list_observability_configurations_request +ListObservabilityConfigurationsResponse,list_observability_configurations_response +ListOfTags,list_of_tags +ListOfferingPromotionsRequest,list_offering_promotions_request +ListOfferingPromotionsResult,list_offering_promotions_result +ListOfferingTransactionsRequest,list_offering_transactions_request +ListOfferingTransactionsResult,list_offering_transactions_result +ListOfferingsRequest,list_offerings_request +ListOfferingsResponse,list_offerings_response +ListOfferingsResult,list_offerings_result +ListOnPremisesInstancesInput,list_on_premises_instances_input +ListOnPremisesInstancesOutput,list_on_premises_instances_output +ListOpenCypherQueriesInput,list_open_cypher_queries_input +ListOpenCypherQueriesOutput,list_open_cypher_queries_output +ListOpenIDConnectProviderTagsRequest,list_open_id_connect_provider_tags_request +ListOpenIDConnectProviderTagsResponse,list_open_id_connect_provider_tags_response +ListOpenIDConnectProvidersResponse,list_open_id_connect_providers_response +ListOpenWorkflowExecutionsInput,list_open_workflow_executions_input +ListOperationsInput,list_operations_input +ListOperationsOutput,list_operations_output +ListOperationsRequest,list_operations_request +ListOperationsResponse,list_operations_response +ListOpsItemEventsRequest,list_ops_item_events_request +ListOpsItemEventsResponse,list_ops_item_events_response +ListOpsItemRelatedItemsRequest,list_ops_item_related_items_request +ListOpsItemRelatedItemsResponse,list_ops_item_related_items_response +ListOpsMetadataRequest,list_ops_metadata_request +ListOpsMetadataResult,list_ops_metadata_result +ListOrdersInput,list_orders_input +ListOrdersOutput,list_orders_output +ListOrdersRequest,list_orders_request +ListOrdersResponse,list_orders_response +ListOrganizationAdminAccountsRequest,list_organization_admin_accounts_request +ListOrganizationAdminAccountsResponse,list_organization_admin_accounts_response +ListOrganizationInsightsRequest,list_organization_insights_request +ListOrganizationInsightsResponse,list_organization_insights_response +ListOrganizationPortfolioAccessInput,list_organization_portfolio_access_input +ListOrganizationPortfolioAccessOutput,list_organization_portfolio_access_output +ListOrganizationServiceAccessStatusRequest,list_organization_service_access_status_request +ListOrganizationServiceAccessStatusResponse,list_organization_service_access_status_response +ListOrganizationalUnitsForParentRequest,list_organizational_units_for_parent_request +ListOrganizationalUnitsForParentResponse,list_organizational_units_for_parent_response +ListOrganizationsRequest,list_organizations_request +ListOrganizationsResponse,list_organizations_response +ListOriginAccessControlsRequest,list_origin_access_controls_request +ListOriginAccessControlsResult,list_origin_access_controls_result +ListOriginEndpointsRequest,list_origin_endpoints_request +ListOriginEndpointsResponse,list_origin_endpoints_response +ListOriginRequestPoliciesRequest,list_origin_request_policies_request +ListOriginRequestPoliciesResult,list_origin_request_policies_result +ListOriginationNumbersRequest,list_origination_numbers_request +ListOriginationNumbersResult,list_origination_numbers_result +ListOutgoingCertificatesRequest,list_outgoing_certificates_request +ListOutgoingCertificatesResponse,list_outgoing_certificates_response +ListOutgoingTypedLinks,list_outgoing_typed_links +ListOutgoingTypedLinksRequest,list_outgoing_typed_links_request +ListOutgoingTypedLinksResponse,list_outgoing_typed_links_response +ListOutpostResolversRequest,list_outpost_resolvers_request +ListOutpostResolversResponse,list_outpost_resolvers_response +ListOutpostsInput,list_outposts_input +ListOutpostsOutput,list_outposts_output +ListOutpostsWithS3Request,list_outposts_with_s3_request +ListOutpostsWithS3Result,list_outposts_with_s3_result +ListPHIDetectionJobsRequest,list_phi_detection_jobs_request +ListPHIDetectionJobsResponse,list_phi_detection_jobs_response +ListPackageImportJobsRequest,list_package_import_jobs_request +ListPackageImportJobsResponse,list_package_import_jobs_response +ListPackageVersionAssetsRequest,list_package_version_assets_request +ListPackageVersionAssetsResult,list_package_version_assets_result +ListPackageVersionDependenciesRequest,list_package_version_dependencies_request +ListPackageVersionDependenciesResult,list_package_version_dependencies_result +ListPackageVersionsRequest,list_package_versions_request +ListPackageVersionsResponse,list_package_versions_response +ListPackageVersionsResult,list_package_versions_result +ListPackagesForDomainRequest,list_packages_for_domain_request +ListPackagesForDomainResponse,list_packages_for_domain_response +ListPackagesRequest,list_packages_request +ListPackagesResponse,list_packages_response +ListPackagesResult,list_packages_result +ListPackagingConfigurationsRequest,list_packaging_configurations_request +ListPackagingConfigurationsResponse,list_packaging_configurations_response +ListPackagingGroupsRequest,list_packaging_groups_request +ListPackagingGroupsResponse,list_packaging_groups_response +ListPageReceiptsRequest,list_page_receipts_request +ListPageReceiptsResult,list_page_receipts_result +ListPageResolutionsRequest,list_page_resolutions_request +ListPageResolutionsResult,list_page_resolutions_result +ListPagesByContactRequest,list_pages_by_contact_request +ListPagesByContactResult,list_pages_by_contact_result +ListPagesByEngagementRequest,list_pages_by_engagement_request +ListPagesByEngagementResult,list_pages_by_engagement_result +ListParallelDataRequest,list_parallel_data_request +ListParallelDataResponse,list_parallel_data_response +ListParentsRequest,list_parents_request +ListParentsResponse,list_parents_response +ListParticipantEventsRequest,list_participant_events_request +ListParticipantEventsResponse,list_participant_events_response +ListParticipantsRequest,list_participants_request +ListParticipantsResponse,list_participants_response +ListPartnerAccountsRequest,list_partner_accounts_request +ListPartnerAccountsResponse,list_partner_accounts_response +ListPartnerEventSourceAccountsRequest,list_partner_event_source_accounts_request +ListPartnerEventSourceAccountsResponse,list_partner_event_source_accounts_response +ListPartnerEventSourcesRequest,list_partner_event_sources_request +ListPartnerEventSourcesResponse,list_partner_event_sources_response +ListPartsInput,list_parts_input +ListPartsOutput,list_parts_output +ListPartsRequest,list_parts_request +ListPeeringsRequest,list_peerings_request +ListPeeringsResponse,list_peerings_response +ListPendingInvitationResourcesRequest,list_pending_invitation_resources_request +ListPendingInvitationResourcesResponse,list_pending_invitation_resources_response +ListPerformanceAnalysisReportsRequest,list_performance_analysis_reports_request +ListPerformanceAnalysisReportsResponse,list_performance_analysis_reports_response +ListPermissionAssociationsRequest,list_permission_associations_request +ListPermissionAssociationsResponse,list_permission_associations_response +ListPermissionGroupsByUserRequest,list_permission_groups_by_user_request +ListPermissionGroupsByUserResponse,list_permission_groups_by_user_response +ListPermissionGroupsRequest,list_permission_groups_request +ListPermissionGroupsResponse,list_permission_groups_response +ListPermissionSetProvisioningStatusRequest,list_permission_set_provisioning_status_request +ListPermissionSetProvisioningStatusResponse,list_permission_set_provisioning_status_response +ListPermissionSetsProvisionedToAccountRequest,list_permission_sets_provisioned_to_account_request +ListPermissionSetsProvisionedToAccountResponse,list_permission_sets_provisioned_to_account_response +ListPermissionSetsRequest,list_permission_sets_request +ListPermissionSetsResponse,list_permission_sets_response +ListPermissionVersionsRequest,list_permission_versions_request +ListPermissionVersionsResponse,list_permission_versions_response +ListPermissionsRequest,list_permissions_request +ListPermissionsResponse,list_permissions_response +ListPhoneNumberOrdersRequest,list_phone_number_orders_request +ListPhoneNumberOrdersResponse,list_phone_number_orders_response +ListPhoneNumbersOptedOutInput,list_phone_numbers_opted_out_input +ListPhoneNumbersOptedOutResponse,list_phone_numbers_opted_out_response +ListPhoneNumbersRequest,list_phone_numbers_request +ListPhoneNumbersResponse,list_phone_numbers_response +ListPhoneNumbersSummary,list_phone_numbers_summary +ListPhoneNumbersSummaryList,list_phone_numbers_summary_list +ListPhoneNumbersV2Request,list_phone_numbers_v2_request +ListPhoneNumbersV2Response,list_phone_numbers_v2_response +ListPickupLocationsRequest,list_pickup_locations_request +ListPickupLocationsResult,list_pickup_locations_result +ListPiiEntitiesDetectionJobsRequest,list_pii_entities_detection_jobs_request +ListPiiEntitiesDetectionJobsResponse,list_pii_entities_detection_jobs_response +ListPipelineBlueprintsResponse,list_pipeline_blueprints_response +ListPipelineExecutionStepsRequest,list_pipeline_execution_steps_request +ListPipelineExecutionStepsResponse,list_pipeline_execution_steps_response +ListPipelineExecutionsInput,list_pipeline_executions_input +ListPipelineExecutionsOutput,list_pipeline_executions_output +ListPipelineExecutionsRequest,list_pipeline_executions_request +ListPipelineExecutionsResponse,list_pipeline_executions_response +ListPipelineParametersForExecutionRequest,list_pipeline_parameters_for_execution_request +ListPipelineParametersForExecutionResponse,list_pipeline_parameters_for_execution_response +ListPipelinesInput,list_pipelines_input +ListPipelinesOutput,list_pipelines_output +ListPipelinesRequest,list_pipelines_request +ListPipelinesResponse,list_pipelines_response +ListPipesRequest,list_pipes_request +ListPipesResponse,list_pipes_response +ListPlaceIndexesRequest,list_place_indexes_request +ListPlaceIndexesResponse,list_place_indexes_response +ListPlaceIndexesResponseEntry,list_place_indexes_response_entry +ListPlacementsRequest,list_placements_request +ListPlacementsResponse,list_placements_response +ListPlatformApplicationsInput,list_platform_applications_input +ListPlatformApplicationsResponse,list_platform_applications_response +ListPlatformBranchesRequest,list_platform_branches_request +ListPlatformBranchesResult,list_platform_branches_result +ListPlatformVersionsRequest,list_platform_versions_request +ListPlatformVersionsResult,list_platform_versions_result +ListPlaybackConfigurationsRequest,list_playback_configurations_request +ListPlaybackConfigurationsResponse,list_playback_configurations_response +ListPlaybackKeyPairsRequest,list_playback_key_pairs_request +ListPlaybackKeyPairsResponse,list_playback_key_pairs_response +ListPluginsRequest,list_plugins_request +ListPluginsResponse,list_plugins_response +ListPoliciesForTargetRequest,list_policies_for_target_request +ListPoliciesForTargetResponse,list_policies_for_target_response +ListPoliciesGrantingServiceAccessEntry,list_policies_granting_service_access_entry +ListPoliciesGrantingServiceAccessRequest,list_policies_granting_service_access_request +ListPoliciesGrantingServiceAccessResponse,list_policies_granting_service_access_response +ListPoliciesInput,list_policies_input +ListPoliciesOutput,list_policies_output +ListPoliciesRequest,list_policies_request +ListPoliciesResponse,list_policies_response +ListPolicyAttachments,list_policy_attachments +ListPolicyAttachmentsRequest,list_policy_attachments_request +ListPolicyAttachmentsResponse,list_policy_attachments_response +ListPolicyGenerationsRequest,list_policy_generations_request +ListPolicyGenerationsResponse,list_policy_generations_response +ListPolicyPrincipalsRequest,list_policy_principals_request +ListPolicyPrincipalsResponse,list_policy_principals_response +ListPolicyStoresInput,list_policy_stores_input +ListPolicyStoresOutput,list_policy_stores_output +ListPolicyTagsRequest,list_policy_tags_request +ListPolicyTagsResponse,list_policy_tags_response +ListPolicyTemplatesInput,list_policy_templates_input +ListPolicyTemplatesOutput,list_policy_templates_output +ListPolicyVersionsRequest,list_policy_versions_request +ListPolicyVersionsResponse,list_policy_versions_response +ListPoolOriginationIdentitiesRequest,list_pool_origination_identities_request +ListPoolOriginationIdentitiesResult,list_pool_origination_identities_result +ListPortalsRequest,list_portals_request +ListPortalsResponse,list_portals_response +ListPortfolioAccessInput,list_portfolio_access_input +ListPortfolioAccessOutput,list_portfolio_access_output +ListPortfoliosForProductInput,list_portfolios_for_product_input +ListPortfoliosForProductOutput,list_portfolios_for_product_output +ListPortfoliosInput,list_portfolios_input +ListPortfoliosOutput,list_portfolios_output +ListPositionConfigurationsRequest,list_position_configurations_request +ListPositionConfigurationsResponse,list_position_configurations_response +ListPredictorBacktestExportJobsRequest,list_predictor_backtest_export_jobs_request +ListPredictorBacktestExportJobsResponse,list_predictor_backtest_export_jobs_response +ListPredictorsRequest,list_predictors_request +ListPredictorsResponse,list_predictors_response +ListPrefetchSchedulesRequest,list_prefetch_schedules_request +ListPrefetchSchedulesResponse,list_prefetch_schedules_response +ListPreparedStatementsInput,list_prepared_statements_input +ListPreparedStatementsOutput,list_prepared_statements_output +ListPresetsRequest,list_presets_request +ListPresetsResponse,list_presets_response +ListPreviewRotationShiftsRequest,list_preview_rotation_shifts_request +ListPreviewRotationShiftsResult,list_preview_rotation_shifts_result +ListPriceListsRequest,list_price_lists_request +ListPriceListsResponse,list_price_lists_response +ListPricesRequest,list_prices_request +ListPricesResponse,list_prices_response +ListPricingPlansAssociatedWithPricingRuleInput,list_pricing_plans_associated_with_pricing_rule_input +ListPricingPlansAssociatedWithPricingRuleOutput,list_pricing_plans_associated_with_pricing_rule_output +ListPricingPlansFilter,list_pricing_plans_filter +ListPricingPlansInput,list_pricing_plans_input +ListPricingPlansOutput,list_pricing_plans_output +ListPricingRulesAssociatedToPricingPlanInput,list_pricing_rules_associated_to_pricing_plan_input +ListPricingRulesAssociatedToPricingPlanOutput,list_pricing_rules_associated_to_pricing_plan_output +ListPricingRulesFilter,list_pricing_rules_filter +ListPricingRulesInput,list_pricing_rules_input +ListPricingRulesOutput,list_pricing_rules_output +ListPrincipalPoliciesRequest,list_principal_policies_request +ListPrincipalPoliciesResponse,list_principal_policies_response +ListPrincipalThingsRequest,list_principal_things_request +ListPrincipalThingsResponse,list_principal_things_response +ListPrincipalsForPortfolioInput,list_principals_for_portfolio_input +ListPrincipalsForPortfolioOutput,list_principals_for_portfolio_output +ListPrincipalsRequest,list_principals_request +ListPrincipalsResponse,list_principals_response +ListProblemsRequest,list_problems_request +ListProblemsResponse,list_problems_response +ListProcessingJobsRequest,list_processing_jobs_request +ListProcessingJobsResponse,list_processing_jobs_response +ListProductSubscriptionsRequest,list_product_subscriptions_request +ListProductSubscriptionsResponse,list_product_subscriptions_response +ListProfileNotificationsInput,list_profile_notifications_input +ListProfileNotificationsOutput,list_profile_notifications_output +ListProfileObjectTypeItem,list_profile_object_type_item +ListProfileObjectTypeTemplateItem,list_profile_object_type_template_item +ListProfileObjectTypeTemplatesRequest,list_profile_object_type_templates_request +ListProfileObjectTypeTemplatesResponse,list_profile_object_type_templates_response +ListProfileObjectTypesRequest,list_profile_object_types_request +ListProfileObjectTypesResponse,list_profile_object_types_response +ListProfileObjectsItem,list_profile_objects_item +ListProfileObjectsRequest,list_profile_objects_request +ListProfileObjectsResponse,list_profile_objects_response +ListProfilePermissionsRequest,list_profile_permissions_request +ListProfilePermissionsResponse,list_profile_permissions_response +ListProfileSharesInput,list_profile_shares_input +ListProfileSharesOutput,list_profile_shares_output +ListProfileTimesRequest,list_profile_times_request +ListProfileTimesResponse,list_profile_times_response +ListProfilesInput,list_profiles_input +ListProfilesOutput,list_profiles_output +ListProfilesRequest,list_profiles_request +ListProfilesResponse,list_profiles_response +ListProfilingGroupsRequest,list_profiling_groups_request +ListProfilingGroupsResponse,list_profiling_groups_response +ListProgressUpdateStreamsRequest,list_progress_update_streams_request +ListProgressUpdateStreamsResult,list_progress_update_streams_result +ListProjectAssetsRequest,list_project_assets_request +ListProjectAssetsResponse,list_project_assets_response +ListProjectPoliciesRequest,list_project_policies_request +ListProjectPoliciesResponse,list_project_policies_response +ListProjectsInput,list_projects_input +ListProjectsOutput,list_projects_output +ListProjectsRequest,list_projects_request +ListProjectsResponse,list_projects_response +ListProjectsResult,list_projects_result +ListPromptsRequest,list_prompts_request +ListPromptsResponse,list_prompts_response +ListProposalVotesInput,list_proposal_votes_input +ListProposalVotesOutput,list_proposal_votes_output +ListProposalsInput,list_proposals_input +ListProposalsOutput,list_proposals_output +ListProtectedQueriesInput,list_protected_queries_input +ListProtectedQueriesOutput,list_protected_queries_output +ListProtectedResourcesByBackupVaultInput,list_protected_resources_by_backup_vault_input +ListProtectedResourcesByBackupVaultOutput,list_protected_resources_by_backup_vault_output +ListProtectedResourcesInput,list_protected_resources_input +ListProtectedResourcesOutput,list_protected_resources_output +ListProtectionGroupsRequest,list_protection_groups_request +ListProtectionGroupsResponse,list_protection_groups_response +ListProtectionsRequest,list_protections_request +ListProtectionsResponse,list_protections_response +ListProtocolsListsRequest,list_protocols_lists_request +ListProtocolsListsResponse,list_protocols_lists_response +ListProvisionedCapacityInput,list_provisioned_capacity_input +ListProvisionedCapacityOutput,list_provisioned_capacity_output +ListProvisionedConcurrencyConfigsRequest,list_provisioned_concurrency_configs_request +ListProvisionedConcurrencyConfigsResponse,list_provisioned_concurrency_configs_response +ListProvisionedModelThroughputsRequest,list_provisioned_model_throughputs_request +ListProvisionedModelThroughputsResponse,list_provisioned_model_throughputs_response +ListProvisionedProductPlansInput,list_provisioned_product_plans_input +ListProvisionedProductPlansOutput,list_provisioned_product_plans_output +ListProvisioningArtifactsForServiceActionInput,list_provisioning_artifacts_for_service_action_input +ListProvisioningArtifactsForServiceActionOutput,list_provisioning_artifacts_for_service_action_output +ListProvisioningArtifactsInput,list_provisioning_artifacts_input +ListProvisioningArtifactsOutput,list_provisioning_artifacts_output +ListProvisioningTemplateVersionsRequest,list_provisioning_template_versions_request +ListProvisioningTemplateVersionsResponse,list_provisioning_template_versions_response +ListProvisioningTemplatesRequest,list_provisioning_templates_request +ListProvisioningTemplatesResponse,list_provisioning_templates_response +ListProxySessionsRequest,list_proxy_sessions_request +ListProxySessionsResponse,list_proxy_sessions_response +ListPublicKeysRequest,list_public_keys_request +ListPublicKeysResponse,list_public_keys_response +ListPublicKeysResult,list_public_keys_result +ListPublishedSchemaArnsRequest,list_published_schema_arns_request +ListPublishedSchemaArnsResponse,list_published_schema_arns_response +ListPublishingDestinationsRequest,list_publishing_destinations_request +ListPublishingDestinationsResponse,list_publishing_destinations_response +ListPullRequestsInput,list_pull_requests_input +ListPullRequestsOutput,list_pull_requests_output +ListQualificationRequestsRequest,list_qualification_requests_request +ListQualificationRequestsResponse,list_qualification_requests_response +ListQualificationTypesRequest,list_qualification_types_request +ListQualificationTypesResponse,list_qualification_types_response +ListQueriesRequest,list_queries_request +ListQueriesResponse,list_queries_response +ListQueryExecutionsInput,list_query_executions_input +ListQueryExecutionsOutput,list_query_executions_output +ListQueryLoggingConfigsRequest,list_query_logging_configs_request +ListQueryLoggingConfigsResponse,list_query_logging_configs_response +ListQuerySuggestionsBlockListsRequest,list_query_suggestions_block_lists_request +ListQuerySuggestionsBlockListsResponse,list_query_suggestions_block_lists_response +ListQueueQuickConnectsRequest,list_queue_quick_connects_request +ListQueueQuickConnectsResponse,list_queue_quick_connects_response +ListQueueTagsRequest,list_queue_tags_request +ListQueueTagsResult,list_queue_tags_result +ListQueuedMessagesRequest,list_queued_messages_request +ListQueuedMessagesResponse,list_queued_messages_response +ListQueuesRequest,list_queues_request +ListQueuesResponse,list_queues_response +ListQueuesResult,list_queues_result +ListQuickConnectsRequest,list_quick_connects_request +ListQuickConnectsResponse,list_quick_connects_response +ListRasterDataCollectionsInput,list_raster_data_collections_input +ListRasterDataCollectionsOutput,list_raster_data_collections_output +ListRateBasedRulesRequest,list_rate_based_rules_request +ListRateBasedRulesResponse,list_rate_based_rules_response +ListReadSetActivationJobsRequest,list_read_set_activation_jobs_request +ListReadSetActivationJobsResponse,list_read_set_activation_jobs_response +ListReadSetExportJobsRequest,list_read_set_export_jobs_request +ListReadSetExportJobsResponse,list_read_set_export_jobs_response +ListReadSetImportJobsRequest,list_read_set_import_jobs_request +ListReadSetImportJobsResponse,list_read_set_import_jobs_response +ListReadSetUploadPartsRequest,list_read_set_upload_parts_request +ListReadSetUploadPartsResponse,list_read_set_upload_parts_response +ListReadSetsRequest,list_read_sets_request +ListReadSetsResponse,list_read_sets_response +ListReadinessChecksRequest,list_readiness_checks_request +ListReadinessChecksResponse,list_readiness_checks_response +ListRealtimeContactAnalysisSegmentsRequest,list_realtime_contact_analysis_segments_request +ListRealtimeContactAnalysisSegmentsResponse,list_realtime_contact_analysis_segments_response +ListRealtimeLogConfigsRequest,list_realtime_log_configs_request +ListRealtimeLogConfigsResult,list_realtime_log_configs_result +ListReceiptFiltersResponse,list_receipt_filters_response +ListReceiptRuleSetsRequest,list_receipt_rule_sets_request +ListReceiptRuleSetsResponse,list_receipt_rule_sets_response +ListReceivedGrantsForOrganizationRequest,list_received_grants_for_organization_request +ListReceivedGrantsForOrganizationResponse,list_received_grants_for_organization_response +ListReceivedGrantsRequest,list_received_grants_request +ListReceivedGrantsResponse,list_received_grants_response +ListReceivedLicensesForOrganizationRequest,list_received_licenses_for_organization_request +ListReceivedLicensesForOrganizationResponse,list_received_licenses_for_organization_response +ListReceivedLicensesRequest,list_received_licenses_request +ListReceivedLicensesResponse,list_received_licenses_response +ListRecipeVersionsRequest,list_recipe_versions_request +ListRecipeVersionsResponse,list_recipe_versions_response +ListRecipesRequest,list_recipes_request +ListRecipesResponse,list_recipes_response +ListRecommendationFeedbackRequest,list_recommendation_feedback_request +ListRecommendationFeedbackResponse,list_recommendation_feedback_response +ListRecommendationTemplatesRequest,list_recommendation_templates_request +ListRecommendationTemplatesResponse,list_recommendation_templates_response +ListRecommendationsRequest,list_recommendations_request +ListRecommendationsResponse,list_recommendations_response +ListRecommendedIntentsRequest,list_recommended_intents_request +ListRecommendedIntentsResponse,list_recommended_intents_response +ListRecommenderConfigurationsResponse,list_recommender_configurations_response +ListRecommendersRequest,list_recommenders_request +ListRecommendersResponse,list_recommenders_response +ListRecordHistoryInput,list_record_history_input +ListRecordHistoryOutput,list_record_history_output +ListRecordHistorySearchFilter,list_record_history_search_filter +ListRecordingConfigurationsRequest,list_recording_configurations_request +ListRecordingConfigurationsResponse,list_recording_configurations_response +ListRecordsRequest,list_records_request +ListRecordsResponse,list_records_response +ListRecoveryGroupsRequest,list_recovery_groups_request +ListRecoveryGroupsResponse,list_recovery_groups_response +ListRecoveryPointsByBackupVaultInput,list_recovery_points_by_backup_vault_input +ListRecoveryPointsByBackupVaultOutput,list_recovery_points_by_backup_vault_output +ListRecoveryPointsByLegalHoldInput,list_recovery_points_by_legal_hold_input +ListRecoveryPointsByLegalHoldOutput,list_recovery_points_by_legal_hold_output +ListRecoveryPointsByResourceInput,list_recovery_points_by_resource_input +ListRecoveryPointsByResourceOutput,list_recovery_points_by_resource_output +ListRecoveryPointsRequest,list_recovery_points_request +ListRecoveryPointsResponse,list_recovery_points_response +ListReferenceImportJobsRequest,list_reference_import_jobs_request +ListReferenceImportJobsResponse,list_reference_import_jobs_response +ListReferenceStoresRequest,list_reference_stores_request +ListReferenceStoresResponse,list_reference_stores_response +ListReferencesRequest,list_references_request +ListReferencesResponse,list_references_response +ListRefreshSchedulesRequest,list_refresh_schedules_request +ListRefreshSchedulesResponse,list_refresh_schedules_response +ListRegexMatchSetsRequest,list_regex_match_sets_request +ListRegexMatchSetsResponse,list_regex_match_sets_response +ListRegexPatternSetsRequest,list_regex_pattern_sets_request +ListRegexPatternSetsResponse,list_regex_pattern_sets_response +ListRegionalBucketsRequest,list_regional_buckets_request +ListRegionalBucketsResult,list_regional_buckets_result +ListRegionsRequest,list_regions_request +ListRegionsResponse,list_regions_response +ListRegistriesInput,list_registries_input +ListRegistriesRequest,list_registries_request +ListRegistriesResponse,list_registries_response +ListRelatedItemsInput,list_related_items_input +ListRelatedItemsOutput,list_related_items_output +ListRelatedResourcesForAuditFindingRequest,list_related_resources_for_audit_finding_request +ListRelatedResourcesForAuditFindingResponse,list_related_resources_for_audit_finding_response +ListReleaseLabelsInput,list_release_labels_input +ListReleaseLabelsOutput,list_release_labels_output +ListRemoteAccessSessionsRequest,list_remote_access_sessions_request +ListRemoteAccessSessionsResult,list_remote_access_sessions_result +ListReplacePermissionAssociationsWorkRequest,list_replace_permission_associations_work_request +ListReplacePermissionAssociationsWorkResponse,list_replace_permission_associations_work_response +ListReplaysRequest,list_replays_request +ListReplaysResponse,list_replays_response +ListReplicationSetsInput,list_replication_sets_input +ListReplicationSetsOutput,list_replication_sets_output +ListReportDefinitionsRequest,list_report_definitions_request +ListReportDefinitionsResult,list_report_definitions_result +ListReportGroupsInput,list_report_groups_input +ListReportGroupsOutput,list_report_groups_output +ListReportJobsInput,list_report_jobs_input +ListReportJobsOutput,list_report_jobs_output +ListReportPlansInput,list_report_plans_input +ListReportPlansOutput,list_report_plans_output +ListReportsForReportGroupInput,list_reports_for_report_group_input +ListReportsForReportGroupOutput,list_reports_for_report_group_output +ListReportsInput,list_reports_input +ListReportsOutput,list_reports_output +ListRepositoriesForApprovalRuleTemplateInput,list_repositories_for_approval_rule_template_input +ListRepositoriesForApprovalRuleTemplateOutput,list_repositories_for_approval_rule_template_output +ListRepositoriesInDomainRequest,list_repositories_in_domain_request +ListRepositoriesInDomainResult,list_repositories_in_domain_result +ListRepositoriesInput,list_repositories_input +ListRepositoriesOutput,list_repositories_output +ListRepositoriesRequest,list_repositories_request +ListRepositoriesResult,list_repositories_result +ListRepositoryAssociationsRequest,list_repository_associations_request +ListRepositoryAssociationsResponse,list_repository_associations_response +ListRepositorySyncDefinitionsInput,list_repository_sync_definitions_input +ListRepositorySyncDefinitionsOutput,list_repository_sync_definitions_output +ListRequest,list_request +ListRequestedServiceQuotaChangeHistoryByQuotaRequest,list_requested_service_quota_change_history_by_quota_request +ListRequestedServiceQuotaChangeHistoryByQuotaResponse,list_requested_service_quota_change_history_by_quota_response +ListRequestedServiceQuotaChangeHistoryRequest,list_requested_service_quota_change_history_request +ListRequestedServiceQuotaChangeHistoryResponse,list_requested_service_quota_change_history_response +ListRescoreExecutionPlansRequest,list_rescore_execution_plans_request +ListRescoreExecutionPlansResponse,list_rescore_execution_plans_response +ListReservationsRequest,list_reservations_request +ListReservationsResponse,list_reservations_response +ListResiliencyPoliciesRequest,list_resiliency_policies_request +ListResiliencyPoliciesResponse,list_resiliency_policies_response +ListResolverConfigsRequest,list_resolver_configs_request +ListResolverConfigsResponse,list_resolver_configs_response +ListResolverDnssecConfigsRequest,list_resolver_dnssec_configs_request +ListResolverDnssecConfigsResponse,list_resolver_dnssec_configs_response +ListResolverEndpointIpAddressesRequest,list_resolver_endpoint_ip_addresses_request +ListResolverEndpointIpAddressesResponse,list_resolver_endpoint_ip_addresses_response +ListResolverEndpointsRequest,list_resolver_endpoints_request +ListResolverEndpointsResponse,list_resolver_endpoints_response +ListResolverQueryLogConfigAssociationsRequest,list_resolver_query_log_config_associations_request +ListResolverQueryLogConfigAssociationsResponse,list_resolver_query_log_config_associations_response +ListResolverQueryLogConfigsRequest,list_resolver_query_log_configs_request +ListResolverQueryLogConfigsResponse,list_resolver_query_log_configs_response +ListResolverRuleAssociationsRequest,list_resolver_rule_associations_request +ListResolverRuleAssociationsResponse,list_resolver_rule_associations_response +ListResolverRulesRequest,list_resolver_rules_request +ListResolverRulesResponse,list_resolver_rules_response +ListResolversByFunctionRequest,list_resolvers_by_function_request +ListResolversByFunctionResponse,list_resolvers_by_function_response +ListResolversRequest,list_resolvers_request +ListResolversResponse,list_resolvers_response +ListResourceCatalogsRequest,list_resource_catalogs_request +ListResourceCatalogsResponse,list_resource_catalogs_response +ListResourceComplianceSummariesRequest,list_resource_compliance_summaries_request +ListResourceComplianceSummariesResult,list_resource_compliance_summaries_result +ListResourceDataSyncRequest,list_resource_data_sync_request +ListResourceDataSyncResult,list_resource_data_sync_result +ListResourceDefinitionVersionsRequest,list_resource_definition_versions_request +ListResourceDefinitionVersionsResponse,list_resource_definition_versions_response +ListResourceDefinitionsRequest,list_resource_definitions_request +ListResourceDefinitionsResponse,list_resource_definitions_response +ListResourceDelegatesRequest,list_resource_delegates_request +ListResourceDelegatesResponse,list_resource_delegates_response +ListResourceEvaluationsRequest,list_resource_evaluations_request +ListResourceEvaluationsResponse,list_resource_evaluations_response +ListResourceInventoryRequest,list_resource_inventory_request +ListResourceInventoryResponse,list_resource_inventory_response +ListResourcePoliciesRequest,list_resource_policies_request +ListResourcePoliciesResult,list_resource_policies_result +ListResourceProfileArtifactsRequest,list_resource_profile_artifacts_request +ListResourceProfileArtifactsResponse,list_resource_profile_artifacts_response +ListResourceProfileDetectionsRequest,list_resource_profile_detections_request +ListResourceProfileDetectionsResponse,list_resource_profile_detections_response +ListResourceRecordSetsRequest,list_resource_record_sets_request +ListResourceRecordSetsResponse,list_resource_record_sets_response +ListResourceRequestsInput,list_resource_requests_input +ListResourceRequestsOutput,list_resource_requests_output +ListResourceServersRequest,list_resource_servers_request +ListResourceServersResponse,list_resource_servers_response +ListResourceSetResourcesRequest,list_resource_set_resources_request +ListResourceSetResourcesResponse,list_resource_set_resources_response +ListResourceSetsRequest,list_resource_sets_request +ListResourceSetsResponse,list_resource_sets_response +ListResourceSharePermissionsRequest,list_resource_share_permissions_request +ListResourceSharePermissionsResponse,list_resource_share_permissions_response +ListResourceTagsRequest,list_resource_tags_request +ListResourceTagsResponse,list_resource_tags_response +ListResourceTypesRequest,list_resource_types_request +ListResourceTypesResponse,list_resource_types_response +ListResourcesAssociatedToCustomLineItemFilter,list_resources_associated_to_custom_line_item_filter +ListResourcesAssociatedToCustomLineItemInput,list_resources_associated_to_custom_line_item_input +ListResourcesAssociatedToCustomLineItemOutput,list_resources_associated_to_custom_line_item_output +ListResourcesAssociatedToCustomLineItemResponseElement,list_resources_associated_to_custom_line_item_response_element +ListResourcesFilters,list_resources_filters +ListResourcesForTagOptionInput,list_resources_for_tag_option_input +ListResourcesForTagOptionOutput,list_resources_for_tag_option_output +ListResourcesForWebACLRequest,list_resources_for_web_acl_request +ListResourcesForWebACLResponse,list_resources_for_web_acl_response +ListResourcesInProtectionGroupRequest,list_resources_in_protection_group_request +ListResourcesInProtectionGroupResponse,list_resources_in_protection_group_response +ListResourcesInput,list_resources_input +ListResourcesOutput,list_resources_output +ListResourcesRequest,list_resources_request +ListResourcesResponse,list_resources_response +ListResourcesResult,list_resources_result +ListResponseHeadersPoliciesRequest,list_response_headers_policies_request +ListResponseHeadersPoliciesResult,list_response_headers_policies_result +ListResponsePlansInput,list_response_plans_input +ListResponsePlansOutput,list_response_plans_output +ListRestoreJobsInput,list_restore_jobs_input +ListRestoreJobsOutput,list_restore_jobs_output +ListRetainedMessagesRequest,list_retained_messages_request +ListRetainedMessagesResponse,list_retained_messages_response +ListRetirableGrantsRequest,list_retirable_grants_request +ListRetrainingSchedulersRequest,list_retraining_schedulers_request +ListRetrainingSchedulersResponse,list_retraining_schedulers_response +ListReusableDelegationSetsRequest,list_reusable_delegation_sets_request +ListReusableDelegationSetsResponse,list_reusable_delegation_sets_response +ListReviewPolicyResultsForHITRequest,list_review_policy_results_for_hit_request +ListReviewPolicyResultsForHITResponse,list_review_policy_results_for_hit_response +ListReviewableHITsRequest,list_reviewable_hits_request +ListReviewableHITsResponse,list_reviewable_hits_response +ListRevisionAssetsRequest,list_revision_assets_request +ListRevisionAssetsResponse,list_revision_assets_response +ListRobotApplicationsRequest,list_robot_applications_request +ListRobotApplicationsResponse,list_robot_applications_response +ListRobotsRequest,list_robots_request +ListRobotsResponse,list_robots_response +ListRoleAliasesRequest,list_role_aliases_request +ListRoleAliasesResponse,list_role_aliases_response +ListRolePoliciesRequest,list_role_policies_request +ListRolePoliciesResponse,list_role_policies_response +ListRoleTagsRequest,list_role_tags_request +ListRoleTagsResponse,list_role_tags_response +ListRolesRequest,list_roles_request +ListRolesResponse,list_roles_response +ListRoomMembershipsRequest,list_room_memberships_request +ListRoomMembershipsResponse,list_room_memberships_response +ListRoomsRequest,list_rooms_request +ListRoomsResponse,list_rooms_response +ListRootsRequest,list_roots_request +ListRootsResponse,list_roots_response +ListRotationOverridesRequest,list_rotation_overrides_request +ListRotationOverridesResult,list_rotation_overrides_result +ListRotationShiftsRequest,list_rotation_shifts_request +ListRotationShiftsResult,list_rotation_shifts_result +ListRotationsRequest,list_rotations_request +ListRotationsResult,list_rotations_result +ListRouteCalculatorsRequest,list_route_calculators_request +ListRouteCalculatorsResponse,list_route_calculators_response +ListRouteCalculatorsResponseEntry,list_route_calculators_response_entry +ListRoutesInput,list_routes_input +ListRoutesOutput,list_routes_output +ListRoutesRequest,list_routes_request +ListRoutesResponse,list_routes_response +ListRoutingControlsRequest,list_routing_controls_request +ListRoutingControlsResponse,list_routing_controls_response +ListRoutingProfileQueuesRequest,list_routing_profile_queues_request +ListRoutingProfileQueuesResponse,list_routing_profile_queues_response +ListRoutingProfilesRequest,list_routing_profiles_request +ListRoutingProfilesResponse,list_routing_profiles_response +ListRuleBasedMatchesRequest,list_rule_based_matches_request +ListRuleBasedMatchesResponse,list_rule_based_matches_response +ListRuleGroupsNamespacesRequest,list_rule_groups_namespaces_request +ListRuleGroupsNamespacesResponse,list_rule_groups_namespaces_response +ListRuleGroupsRequest,list_rule_groups_request +ListRuleGroupsResponse,list_rule_groups_response +ListRuleNamesByTargetRequest,list_rule_names_by_target_request +ListRuleNamesByTargetResponse,list_rule_names_by_target_response +ListRulesOutput,list_rules_output +ListRulesPackagesRequest,list_rules_packages_request +ListRulesPackagesResponse,list_rules_packages_response +ListRulesRequest,list_rules_request +ListRulesResponse,list_rules_response +ListRulesetsRequest,list_rulesets_request +ListRulesetsResponse,list_rulesets_response +ListRumMetricsDestinationsRequest,list_rum_metrics_destinations_request +ListRumMetricsDestinationsResponse,list_rum_metrics_destinations_response +ListRunGroupsRequest,list_run_groups_request +ListRunGroupsResponse,list_run_groups_response +ListRunTasksRequest,list_run_tasks_request +ListRunTasksResponse,list_run_tasks_response +ListRunsRequest,list_runs_request +ListRunsResponse,list_runs_response +ListRunsResult,list_runs_result +ListRxNormInferenceJobsRequest,list_rx_norm_inference_jobs_request +ListRxNormInferenceJobsResponse,list_rx_norm_inference_jobs_response +ListS3BucketsRequest,list_s3_buckets_request +ListS3BucketsResponse,list_s3_buckets_response +ListS3ResourcesRequest,list_s3_resources_request +ListS3ResourcesResult,list_s3_resources_result +ListSAMLProviderTagsRequest,list_saml_provider_tags_request +ListSAMLProviderTagsResponse,list_saml_provider_tags_response +ListSAMLProvidersResponse,list_saml_providers_response +ListSMSSandboxPhoneNumbersInput,list_sms_sandbox_phone_numbers_input +ListSMSSandboxPhoneNumbersResult,list_sms_sandbox_phone_numbers_result +ListSNOMEDCTInferenceJobsRequest,list_snomedct_inference_jobs_request +ListSNOMEDCTInferenceJobsResponse,list_snomedct_inference_jobs_response +ListSSHPublicKeysRequest,list_ssh_public_keys_request +ListSSHPublicKeysResponse,list_ssh_public_keys_response +ListSafetyRulesRequest,list_safety_rules_request +ListSafetyRulesResponse,list_safety_rules_response +ListSamplesRequest,list_samples_request +ListSamplesResult,list_samples_result +ListSatellitesRequest,list_satellites_request +ListSatellitesResponse,list_satellites_response +ListSavingsPlansPurchaseRecommendationGenerationRequest,list_savings_plans_purchase_recommendation_generation_request +ListSavingsPlansPurchaseRecommendationGenerationResponse,list_savings_plans_purchase_recommendation_generation_response +ListScansRequest,list_scans_request +ListScansResponse,list_scans_response +ListScenesRequest,list_scenes_request +ListScenesResponse,list_scenes_response +ListScheduleGroupsInput,list_schedule_groups_input +ListScheduleGroupsOutput,list_schedule_groups_output +ListScheduledActionsRequest,list_scheduled_actions_request +ListScheduledActionsResponse,list_scheduled_actions_response +ListScheduledAuditsRequest,list_scheduled_audits_request +ListScheduledAuditsResponse,list_scheduled_audits_response +ListScheduledQueriesRequest,list_scheduled_queries_request +ListScheduledQueriesResponse,list_scheduled_queries_response +ListSchedulesInput,list_schedules_input +ListSchedulesOutput,list_schedules_output +ListSchedulesRequest,list_schedules_request +ListSchedulesResponse,list_schedules_response +ListSchedulingPoliciesRequest,list_scheduling_policies_request +ListSchedulingPoliciesResponse,list_scheduling_policies_response +ListSchemaExtensionsRequest,list_schema_extensions_request +ListSchemaExtensionsResult,list_schema_extensions_result +ListSchemaMappingsInput,list_schema_mappings_input +ListSchemaMappingsOutput,list_schema_mappings_output +ListSchemaVersionsInput,list_schema_versions_input +ListSchemaVersionsRequest,list_schema_versions_request +ListSchemaVersionsResponse,list_schema_versions_response +ListSchemasInput,list_schemas_input +ListSchemasOutput,list_schemas_output +ListSchemasRequest,list_schemas_request +ListSchemasResponse,list_schemas_response +ListScramSecretsRequest,list_scram_secrets_request +ListScramSecretsResponse,list_scram_secrets_response +ListScriptsInput,list_scripts_input +ListScriptsOutput,list_scripts_output +ListSecretVersionIdsRequest,list_secret_version_ids_request +ListSecretVersionIdsResponse,list_secret_version_ids_response +ListSecretsRequest,list_secrets_request +ListSecretsResponse,list_secrets_response +ListSecurityConfigsRequest,list_security_configs_request +ListSecurityConfigsResponse,list_security_configs_response +ListSecurityConfigurationsInput,list_security_configurations_input +ListSecurityConfigurationsOutput,list_security_configurations_output +ListSecurityControlDefinitionsRequest,list_security_control_definitions_request +ListSecurityControlDefinitionsResponse,list_security_control_definitions_response +ListSecurityKeysRequest,list_security_keys_request +ListSecurityKeysResponse,list_security_keys_response +ListSecurityPoliciesRequest,list_security_policies_request +ListSecurityPoliciesResponse,list_security_policies_response +ListSecurityProfileApplicationsRequest,list_security_profile_applications_request +ListSecurityProfileApplicationsResponse,list_security_profile_applications_response +ListSecurityProfilePermissionsRequest,list_security_profile_permissions_request +ListSecurityProfilePermissionsResponse,list_security_profile_permissions_response +ListSecurityProfilesForTargetRequest,list_security_profiles_for_target_request +ListSecurityProfilesForTargetResponse,list_security_profiles_for_target_response +ListSecurityProfilesRequest,list_security_profiles_request +ListSecurityProfilesResponse,list_security_profiles_response +ListSegmentReferencesRequest,list_segment_references_request +ListSegmentReferencesResponse,list_segment_references_response +ListSegmentsRequest,list_segments_request +ListSegmentsResponse,list_segments_response +ListSensitivityInspectionTemplatesRequest,list_sensitivity_inspection_templates_request +ListSensitivityInspectionTemplatesResponse,list_sensitivity_inspection_templates_response +ListSensorStatisticsRequest,list_sensor_statistics_request +ListSensorStatisticsResponse,list_sensor_statistics_response +ListSentimentDetectionJobsRequest,list_sentiment_detection_jobs_request +ListSentimentDetectionJobsResponse,list_sentiment_detection_jobs_response +ListSequenceStoresRequest,list_sequence_stores_request +ListSequenceStoresResponse,list_sequence_stores_response +ListServerCertificateTagsRequest,list_server_certificate_tags_request +ListServerCertificateTagsResponse,list_server_certificate_tags_response +ListServerCertificatesRequest,list_server_certificates_request +ListServerCertificatesResponse,list_server_certificates_response +ListServerNeighborsRequest,list_server_neighbors_request +ListServerNeighborsResponse,list_server_neighbors_response +ListServersRequest,list_servers_request +ListServersResponse,list_servers_response +ListServiceActionsForProvisioningArtifactInput,list_service_actions_for_provisioning_artifact_input +ListServiceActionsForProvisioningArtifactOutput,list_service_actions_for_provisioning_artifact_output +ListServiceActionsInput,list_service_actions_input +ListServiceActionsOutput,list_service_actions_output +ListServiceInstanceOutputsInput,list_service_instance_outputs_input +ListServiceInstanceOutputsOutput,list_service_instance_outputs_output +ListServiceInstanceProvisionedResourcesInput,list_service_instance_provisioned_resources_input +ListServiceInstanceProvisionedResourcesOutput,list_service_instance_provisioned_resources_output +ListServiceInstancesFilter,list_service_instances_filter +ListServiceInstancesInput,list_service_instances_input +ListServiceInstancesOutput,list_service_instances_output +ListServiceNetworkServiceAssociationsRequest,list_service_network_service_associations_request +ListServiceNetworkServiceAssociationsResponse,list_service_network_service_associations_response +ListServiceNetworkVpcAssociationsRequest,list_service_network_vpc_associations_request +ListServiceNetworkVpcAssociationsResponse,list_service_network_vpc_associations_response +ListServiceNetworksRequest,list_service_networks_request +ListServiceNetworksResponse,list_service_networks_response +ListServicePipelineOutputsInput,list_service_pipeline_outputs_input +ListServicePipelineOutputsOutput,list_service_pipeline_outputs_output +ListServicePipelineProvisionedResourcesInput,list_service_pipeline_provisioned_resources_input +ListServicePipelineProvisionedResourcesOutput,list_service_pipeline_provisioned_resources_output +ListServicePrincipalNamesRequest,list_service_principal_names_request +ListServicePrincipalNamesResponse,list_service_principal_names_response +ListServiceProfilesRequest,list_service_profiles_request +ListServiceProfilesResponse,list_service_profiles_response +ListServiceQuotaIncreaseRequestsInTemplateRequest,list_service_quota_increase_requests_in_template_request +ListServiceQuotaIncreaseRequestsInTemplateResponse,list_service_quota_increase_requests_in_template_response +ListServiceQuotasRequest,list_service_quotas_request +ListServiceQuotasResponse,list_service_quotas_response +ListServiceSpecificCredentialsRequest,list_service_specific_credentials_request +ListServiceSpecificCredentialsResponse,list_service_specific_credentials_response +ListServiceTemplateVersionsInput,list_service_template_versions_input +ListServiceTemplateVersionsOutput,list_service_template_versions_output +ListServiceTemplatesInput,list_service_templates_input +ListServiceTemplatesOutput,list_service_templates_output +ListServiceVersionsRequest,list_service_versions_request +ListServiceVersionsResult,list_service_versions_result +ListServicesByNamespaceRequest,list_services_by_namespace_request +ListServicesByNamespaceResponse,list_services_by_namespace_response +ListServicesForAutoScalingConfigurationRequest,list_services_for_auto_scaling_configuration_request +ListServicesForAutoScalingConfigurationResponse,list_services_for_auto_scaling_configuration_response +ListServicesInput,list_services_input +ListServicesOutput,list_services_output +ListServicesRequest,list_services_request +ListServicesResponse,list_services_response +ListSessionAnalyticsDataRequest,list_session_analytics_data_request +ListSessionAnalyticsDataResponse,list_session_analytics_data_response +ListSessionMetricsRequest,list_session_metrics_request +ListSessionMetricsResponse,list_session_metrics_response +ListSessionsRequest,list_sessions_request +ListSessionsResponse,list_sessions_response +ListShardsInput,list_shards_input +ListShardsOutput,list_shards_output +ListShareInvitationsInput,list_share_invitations_input +ListShareInvitationsOutput,list_share_invitations_output +ListSharedEndpointsRequest,list_shared_endpoints_request +ListSharedEndpointsResult,list_shared_endpoints_result +ListSharedProjectsInput,list_shared_projects_input +ListSharedProjectsOutput,list_shared_projects_output +ListSharedReportGroupsInput,list_shared_report_groups_input +ListSharedReportGroupsOutput,list_shared_report_groups_output +ListSharesRequest,list_shares_request +ListSharesResponse,list_shares_response +ListSignalCatalogNodesRequest,list_signal_catalog_nodes_request +ListSignalCatalogNodesResponse,list_signal_catalog_nodes_response +ListSignalCatalogsRequest,list_signal_catalogs_request +ListSignalCatalogsResponse,list_signal_catalogs_response +ListSignalingChannelsInput,list_signaling_channels_input +ListSignalingChannelsOutput,list_signaling_channels_output +ListSigningCertificatesRequest,list_signing_certificates_request +ListSigningCertificatesResponse,list_signing_certificates_response +ListSigningJobsRequest,list_signing_jobs_request +ListSigningJobsResponse,list_signing_jobs_response +ListSigningPlatformsRequest,list_signing_platforms_request +ListSigningPlatformsResponse,list_signing_platforms_response +ListSigningProfilesRequest,list_signing_profiles_request +ListSigningProfilesResponse,list_signing_profiles_response +ListSimulationApplicationsRequest,list_simulation_applications_request +ListSimulationApplicationsResponse,list_simulation_applications_response +ListSimulationJobBatchesRequest,list_simulation_job_batches_request +ListSimulationJobBatchesResponse,list_simulation_job_batches_response +ListSimulationJobsRequest,list_simulation_jobs_request +ListSimulationJobsResponse,list_simulation_jobs_response +ListSimulationsInput,list_simulations_input +ListSimulationsOutput,list_simulations_output +ListSinksInput,list_sinks_input +ListSinksItem,list_sinks_item +ListSinksOutput,list_sinks_output +ListSipMediaApplicationsRequest,list_sip_media_applications_request +ListSipMediaApplicationsResponse,list_sip_media_applications_response +ListSipRulesRequest,list_sip_rules_request +ListSipRulesResponse,list_sip_rules_response +ListSitesInput,list_sites_input +ListSitesOutput,list_sites_output +ListSitesRequest,list_sites_request +ListSitesResponse,list_sites_response +ListSizeConstraintSetsRequest,list_size_constraint_sets_request +ListSizeConstraintSetsResponse,list_size_constraint_sets_response +ListSkillsRequest,list_skills_request +ListSkillsResponse,list_skills_response +ListSkillsStoreCategoriesRequest,list_skills_store_categories_request +ListSkillsStoreCategoriesResponse,list_skills_store_categories_response +ListSkillsStoreSkillsByCategoryRequest,list_skills_store_skills_by_category_request +ListSkillsStoreSkillsByCategoryResponse,list_skills_store_skills_by_category_response +ListSlackChannelConfigurationsRequest,list_slack_channel_configurations_request +ListSlackChannelConfigurationsResult,list_slack_channel_configurations_result +ListSlackWorkspaceConfigurationsRequest,list_slack_workspace_configurations_request +ListSlackWorkspaceConfigurationsResult,list_slack_workspace_configurations_result +ListSlotTypesRequest,list_slot_types_request +ListSlotTypesResponse,list_slot_types_response +ListSlotsRequest,list_slots_request +ListSlotsResponse,list_slots_response +ListSmartHomeAppliancesRequest,list_smart_home_appliances_request +ListSmartHomeAppliancesResponse,list_smart_home_appliances_response +ListSnapshotBlocksRequest,list_snapshot_blocks_request +ListSnapshotBlocksResponse,list_snapshot_blocks_response +ListSnapshotsInRecycleBinRequest,list_snapshots_in_recycle_bin_request +ListSnapshotsInRecycleBinResult,list_snapshots_in_recycle_bin_result +ListSnapshotsRequest,list_snapshots_request +ListSnapshotsResponse,list_snapshots_response +ListSnapshotsResult,list_snapshots_result +ListSolFunctionInstanceInfo,list_sol_function_instance_info +ListSolFunctionInstanceMetadata,list_sol_function_instance_metadata +ListSolFunctionInstancesInput,list_sol_function_instances_input +ListSolFunctionInstancesOutput,list_sol_function_instances_output +ListSolFunctionPackageInfo,list_sol_function_package_info +ListSolFunctionPackageMetadata,list_sol_function_package_metadata +ListSolFunctionPackagesInput,list_sol_function_packages_input +ListSolFunctionPackagesOutput,list_sol_function_packages_output +ListSolNetworkInstanceInfo,list_sol_network_instance_info +ListSolNetworkInstanceMetadata,list_sol_network_instance_metadata +ListSolNetworkInstancesInput,list_sol_network_instances_input +ListSolNetworkInstancesOutput,list_sol_network_instances_output +ListSolNetworkOperationsInfo,list_sol_network_operations_info +ListSolNetworkOperationsInput,list_sol_network_operations_input +ListSolNetworkOperationsMetadata,list_sol_network_operations_metadata +ListSolNetworkOperationsOutput,list_sol_network_operations_output +ListSolNetworkPackageInfo,list_sol_network_package_info +ListSolNetworkPackageMetadata,list_sol_network_package_metadata +ListSolNetworkPackagesInput,list_sol_network_packages_input +ListSolNetworkPackagesOutput,list_sol_network_packages_output +ListSolutionVersionsRequest,list_solution_versions_request +ListSolutionVersionsResponse,list_solution_versions_response +ListSolutionsRequest,list_solutions_request +ListSolutionsResponse,list_solutions_response +ListSopRecommendationsRequest,list_sop_recommendations_request +ListSopRecommendationsResponse,list_sop_recommendations_response +ListSourceApiAssociationsRequest,list_source_api_associations_request +ListSourceApiAssociationsResponse,list_source_api_associations_response +ListSourceCredentialsOutput,list_source_credentials_output +ListSourceLocationsRequest,list_source_locations_request +ListSourceLocationsResponse,list_source_locations_response +ListSourceRepositoriesItem,list_source_repositories_item +ListSourceRepositoriesRequest,list_source_repositories_request +ListSourceRepositoriesResponse,list_source_repositories_response +ListSourceRepositoryBranchesItem,list_source_repository_branches_item +ListSourceRepositoryBranchesRequest,list_source_repository_branches_request +ListSourceRepositoryBranchesResponse,list_source_repository_branches_response +ListSourceServerActionsRequest,list_source_server_actions_request +ListSourceServerActionsResponse,list_source_server_actions_response +ListSpacesRequest,list_spaces_request +ListSpacesResponse,list_spaces_response +ListSpeakerEnrollmentJobsRequest,list_speaker_enrollment_jobs_request +ListSpeakerEnrollmentJobsResponse,list_speaker_enrollment_jobs_response +ListSpeakersRequest,list_speakers_request +ListSpeakersResponse,list_speakers_response +ListSpeechSynthesisTasksInput,list_speech_synthesis_tasks_input +ListSpeechSynthesisTasksOutput,list_speech_synthesis_tasks_output +ListSqlInjectionMatchSetsRequest,list_sql_injection_match_sets_request +ListSqlInjectionMatchSetsResponse,list_sql_injection_match_sets_response +ListStackInstanceResourceDriftsInput,list_stack_instance_resource_drifts_input +ListStackInstanceResourceDriftsOutput,list_stack_instance_resource_drifts_output +ListStackInstancesForProvisionedProductInput,list_stack_instances_for_provisioned_product_input +ListStackInstancesForProvisionedProductOutput,list_stack_instances_for_provisioned_product_output +ListStackInstancesInput,list_stack_instances_input +ListStackInstancesOutput,list_stack_instances_output +ListStackResourcesInput,list_stack_resources_input +ListStackResourcesOutput,list_stack_resources_output +ListStackSetOperationResultsInput,list_stack_set_operation_results_input +ListStackSetOperationResultsOutput,list_stack_set_operation_results_output +ListStackSetOperationsInput,list_stack_set_operations_input +ListStackSetOperationsOutput,list_stack_set_operations_output +ListStackSetsInput,list_stack_sets_input +ListStackSetsOutput,list_stack_sets_output +ListStacksInput,list_stacks_input +ListStacksOutput,list_stacks_output +ListStageDeploymentsRequest,list_stage_deployments_request +ListStageDeploymentsResult,list_stage_deployments_result +ListStageDevicesRequest,list_stage_devices_request +ListStageDevicesResponse,list_stage_devices_response +ListStageSessionsRequest,list_stage_sessions_request +ListStageSessionsResponse,list_stage_sessions_response +ListStagesRequest,list_stages_request +ListStagesResponse,list_stages_response +ListStagesResult,list_stages_result +ListStagingAccountsRequest,list_staging_accounts_request +ListStagingAccountsResponse,list_staging_accounts_response +ListStandardsControlAssociationsRequest,list_standards_control_associations_request +ListStandardsControlAssociationsResponse,list_standards_control_associations_response +ListStateMachineAliasesInput,list_state_machine_aliases_input +ListStateMachineAliasesOutput,list_state_machine_aliases_output +ListStateMachineVersionsInput,list_state_machine_versions_input +ListStateMachineVersionsOutput,list_state_machine_versions_output +ListStateMachinesInput,list_state_machines_input +ListStateMachinesOutput,list_state_machines_output +ListStatementsRequest,list_statements_request +ListStatementsResponse,list_statements_response +ListStepsInput,list_steps_input +ListStepsOutput,list_steps_output +ListStorageLensConfigurationEntry,list_storage_lens_configuration_entry +ListStorageLensConfigurationsRequest,list_storage_lens_configurations_request +ListStorageLensConfigurationsResult,list_storage_lens_configurations_result +ListStorageSystemsRequest,list_storage_systems_request +ListStorageSystemsResponse,list_storage_systems_response +ListStoredQueriesRequest,list_stored_queries_request +ListStoredQueriesResponse,list_stored_queries_response +ListStreamConsumersInput,list_stream_consumers_input +ListStreamConsumersOutput,list_stream_consumers_output +ListStreamKeysRequest,list_stream_keys_request +ListStreamKeysResponse,list_stream_keys_response +ListStreamProcessorsRequest,list_stream_processors_request +ListStreamProcessorsResponse,list_stream_processors_response +ListStreamSessionsRequest,list_stream_sessions_request +ListStreamSessionsResponse,list_stream_sessions_response +ListStreamingDistributionsRequest,list_streaming_distributions_request +ListStreamingDistributionsResult,list_streaming_distributions_result +ListStreamingImagesRequest,list_streaming_images_request +ListStreamingImagesResponse,list_streaming_images_response +ListStreamingSessionBackupsRequest,list_streaming_session_backups_request +ListStreamingSessionBackupsResponse,list_streaming_session_backups_response +ListStreamingSessionsRequest,list_streaming_sessions_request +ListStreamingSessionsResponse,list_streaming_sessions_response +ListStreamsInput,list_streams_input +ListStreamsOutput,list_streams_output +ListStreamsRequest,list_streams_request +ListStreamsResponse,list_streams_response +ListStudioComponentsRequest,list_studio_components_request +ListStudioComponentsResponse,list_studio_components_response +ListStudioLifecycleConfigsRequest,list_studio_lifecycle_configs_request +ListStudioLifecycleConfigsResponse,list_studio_lifecycle_configs_response +ListStudioMembersRequest,list_studio_members_request +ListStudioMembersResponse,list_studio_members_response +ListStudioSessionMappingsInput,list_studio_session_mappings_input +ListStudioSessionMappingsOutput,list_studio_session_mappings_output +ListStudiosInput,list_studios_input +ListStudiosOutput,list_studios_output +ListStudiosRequest,list_studios_request +ListStudiosResponse,list_studios_response +ListSubChannelsRequest,list_sub_channels_request +ListSubChannelsResponse,list_sub_channels_response +ListSubjectsResponse,list_subjects_response +ListSubscribedRuleGroupsRequest,list_subscribed_rule_groups_request +ListSubscribedRuleGroupsResponse,list_subscribed_rule_groups_response +ListSubscribedWorkteamsRequest,list_subscribed_workteams_request +ListSubscribedWorkteamsResponse,list_subscribed_workteams_response +ListSubscribersRequest,list_subscribers_request +ListSubscribersResponse,list_subscribers_response +ListSubscriptionDefinitionVersionsRequest,list_subscription_definition_versions_request +ListSubscriptionDefinitionVersionsResponse,list_subscription_definition_versions_response +ListSubscriptionDefinitionsRequest,list_subscription_definitions_request +ListSubscriptionDefinitionsResponse,list_subscription_definitions_response +ListSubscriptionsByTopicInput,list_subscriptions_by_topic_input +ListSubscriptionsByTopicResponse,list_subscriptions_by_topic_response +ListSubscriptionsInput,list_subscriptions_input +ListSubscriptionsResponse,list_subscriptions_response +ListSuggestedResiliencyPoliciesRequest,list_suggested_resiliency_policies_request +ListSuggestedResiliencyPoliciesResponse,list_suggested_resiliency_policies_response +ListSuiteDefinitionsRequest,list_suite_definitions_request +ListSuiteDefinitionsResponse,list_suite_definitions_response +ListSuiteRunsRequest,list_suite_runs_request +ListSuiteRunsResponse,list_suite_runs_response +ListSuitesRequest,list_suites_request +ListSuitesResult,list_suites_result +ListSupportedCharacterSets,list_supported_character_sets +ListSupportedInstanceTypesInput,list_supported_instance_types_input +ListSupportedInstanceTypesOutput,list_supported_instance_types_output +ListSupportedPhoneNumberCountriesRequest,list_supported_phone_number_countries_request +ListSupportedPhoneNumberCountriesResponse,list_supported_phone_number_countries_response +ListSupportedResourceTypesInput,list_supported_resource_types_input +ListSupportedResourceTypesOutput,list_supported_resource_types_output +ListSupportedTimezones,list_supported_timezones +ListSuppressedDestinationsRequest,list_suppressed_destinations_request +ListSuppressedDestinationsResponse,list_suppressed_destinations_response +ListSyncJobsRequest,list_sync_jobs_request +ListSyncJobsResponse,list_sync_jobs_response +ListSyncResourcesRequest,list_sync_resources_request +ListSyncResourcesResponse,list_sync_resources_response +ListTLSInspectionConfigurationsRequest,list_tls_inspection_configurations_request +ListTLSInspectionConfigurationsResponse,list_tls_inspection_configurations_response +ListTableColumnsRequest,list_table_columns_request +ListTableColumnsResult,list_table_columns_result +ListTableMetadataInput,list_table_metadata_input +ListTableMetadataOutput,list_table_metadata_output +ListTableRestoreStatusRequest,list_table_restore_status_request +ListTableRestoreStatusResponse,list_table_restore_status_response +ListTableRowsRequest,list_table_rows_request +ListTableRowsResult,list_table_rows_result +ListTableStorageOptimizersRequest,list_table_storage_optimizers_request +ListTableStorageOptimizersResponse,list_table_storage_optimizers_response +ListTablesInput,list_tables_input +ListTablesOutput,list_tables_output +ListTablesRequest,list_tables_request +ListTablesResponse,list_tables_response +ListTablesResult,list_tables_result +ListTagOptionsFilters,list_tag_options_filters +ListTagOptionsInput,list_tag_options_input +ListTagOptionsOutput,list_tag_options_output +ListTags,list_tags +ListTagsForCertificateRequest,list_tags_for_certificate_request +ListTagsForCertificateResponse,list_tags_for_certificate_response +ListTagsForDeliveryStreamInput,list_tags_for_delivery_stream_input +ListTagsForDeliveryStreamOutput,list_tags_for_delivery_stream_output +ListTagsForDomainRequest,list_tags_for_domain_request +ListTagsForDomainResponse,list_tags_for_domain_response +ListTagsForProjectRequest,list_tags_for_project_request +ListTagsForProjectResult,list_tags_for_project_result +ListTagsForResourceInput,list_tags_for_resource_input +ListTagsForResourceMessage,list_tags_for_resource_message +ListTagsForResourceOutput,list_tags_for_resource_output +ListTagsForResourceRequest,list_tags_for_resource_request +ListTagsForResourceResponse,list_tags_for_resource_response +ListTagsForResourceResult,list_tags_for_resource_result +ListTagsForResourcesRequest,list_tags_for_resources_request +ListTagsForResourcesResponse,list_tags_for_resources_response +ListTagsForStreamInput,list_tags_for_stream_input +ListTagsForStreamOutput,list_tags_for_stream_output +ListTagsForVaultInput,list_tags_for_vault_input +ListTagsForVaultOutput,list_tags_for_vault_output +ListTagsInput,list_tags_input +ListTagsLogGroupRequest,list_tags_log_group_request +ListTagsLogGroupResponse,list_tags_log_group_response +ListTagsOfResourceInput,list_tags_of_resource_input +ListTagsOfResourceOutput,list_tags_of_resource_output +ListTagsOutput,list_tags_output +ListTagsRequest,list_tags_request +ListTagsResponse,list_tags_response +ListTagsResult,list_tags_result +ListTapePoolsInput,list_tape_pools_input +ListTapePoolsOutput,list_tape_pools_output +ListTapesInput,list_tapes_input +ListTapesOutput,list_tapes_output +ListTargetGroupsRequest,list_target_groups_request +ListTargetGroupsResponse,list_target_groups_response +ListTargetResourceTypesRequest,list_target_resource_types_request +ListTargetResourceTypesResponse,list_target_resource_types_response +ListTargetedSentimentDetectionJobsRequest,list_targeted_sentiment_detection_jobs_request +ListTargetedSentimentDetectionJobsResponse,list_targeted_sentiment_detection_jobs_response +ListTargetsByRuleRequest,list_targets_by_rule_request +ListTargetsByRuleResponse,list_targets_by_rule_response +ListTargetsFilter,list_targets_filter +ListTargetsForPolicyRequest,list_targets_for_policy_request +ListTargetsForPolicyResponse,list_targets_for_policy_response +ListTargetsForSecurityProfileRequest,list_targets_for_security_profile_request +ListTargetsForSecurityProfileResponse,list_targets_for_security_profile_response +ListTargetsRequest,list_targets_request +ListTargetsResponse,list_targets_response +ListTargetsResult,list_targets_result +ListTaskDefinitionFamiliesRequest,list_task_definition_families_request +ListTaskDefinitionFamiliesResponse,list_task_definition_families_response +ListTaskDefinitionsRequest,list_task_definitions_request +ListTaskDefinitionsResponse,list_task_definitions_response +ListTaskExecutionsRequest,list_task_executions_request +ListTaskExecutionsResponse,list_task_executions_response +ListTaskTemplatesRequest,list_task_templates_request +ListTaskTemplatesResponse,list_task_templates_response +ListTasksInput,list_tasks_input +ListTasksOutput,list_tasks_output +ListTasksRequest,list_tasks_request +ListTasksResponse,list_tasks_response +ListTeamMembersRequest,list_team_members_request +ListTeamMembersResult,list_team_members_result +ListTemplateActionsRequest,list_template_actions_request +ListTemplateActionsResponse,list_template_actions_response +ListTemplateAliasesRequest,list_template_aliases_request +ListTemplateAliasesResponse,list_template_aliases_response +ListTemplateGroupAccessControlEntriesRequest,list_template_group_access_control_entries_request +ListTemplateGroupAccessControlEntriesResponse,list_template_group_access_control_entries_response +ListTemplateStepGroupsRequest,list_template_step_groups_request +ListTemplateStepGroupsResponse,list_template_step_groups_response +ListTemplateStepsRequest,list_template_steps_request +ListTemplateStepsResponse,list_template_steps_response +ListTemplateVersionsRequest,list_template_versions_request +ListTemplateVersionsResponse,list_template_versions_response +ListTemplatesRequest,list_templates_request +ListTemplatesResponse,list_templates_response +ListTerminologiesRequest,list_terminologies_request +ListTerminologiesResponse,list_terminologies_response +ListTestExecutionResultItemsRequest,list_test_execution_result_items_request +ListTestExecutionResultItemsResponse,list_test_execution_result_items_response +ListTestExecutionsRequest,list_test_executions_request +ListTestExecutionsResponse,list_test_executions_response +ListTestGridProjectsRequest,list_test_grid_projects_request +ListTestGridProjectsResult,list_test_grid_projects_result +ListTestGridSessionActionsRequest,list_test_grid_session_actions_request +ListTestGridSessionActionsResult,list_test_grid_session_actions_result +ListTestGridSessionArtifactsRequest,list_test_grid_session_artifacts_request +ListTestGridSessionArtifactsResult,list_test_grid_session_artifacts_result +ListTestGridSessionsRequest,list_test_grid_sessions_request +ListTestGridSessionsResult,list_test_grid_sessions_result +ListTestRecommendationsRequest,list_test_recommendations_request +ListTestRecommendationsResponse,list_test_recommendations_response +ListTestSetRecordsRequest,list_test_set_records_request +ListTestSetRecordsResponse,list_test_set_records_response +ListTestSetsRequest,list_test_sets_request +ListTestSetsResponse,list_test_sets_response +ListTestsRequest,list_tests_request +ListTestsResult,list_tests_result +ListTextTranslationJobsRequest,list_text_translation_jobs_request +ListTextTranslationJobsResponse,list_text_translation_jobs_response +ListThemeAliasesRequest,list_theme_aliases_request +ListThemeAliasesResponse,list_theme_aliases_response +ListThemeVersionsRequest,list_theme_versions_request +ListThemeVersionsResponse,list_theme_versions_response +ListThemesRequest,list_themes_request +ListThemesResponse,list_themes_response +ListThesauriRequest,list_thesauri_request +ListThesauriResponse,list_thesauri_response +ListThingGroupsForThingRequest,list_thing_groups_for_thing_request +ListThingGroupsForThingResponse,list_thing_groups_for_thing_response +ListThingGroupsRequest,list_thing_groups_request +ListThingGroupsResponse,list_thing_groups_response +ListThingPrincipalsRequest,list_thing_principals_request +ListThingPrincipalsResponse,list_thing_principals_response +ListThingRegistrationTaskReportsRequest,list_thing_registration_task_reports_request +ListThingRegistrationTaskReportsResponse,list_thing_registration_task_reports_response +ListThingRegistrationTasksRequest,list_thing_registration_tasks_request +ListThingRegistrationTasksResponse,list_thing_registration_tasks_response +ListThingTypesRequest,list_thing_types_request +ListThingTypesResponse,list_thing_types_response +ListThingsInBillingGroupRequest,list_things_in_billing_group_request +ListThingsInBillingGroupResponse,list_things_in_billing_group_response +ListThingsInThingGroupRequest,list_things_in_thing_group_request +ListThingsInThingGroupResponse,list_things_in_thing_group_response +ListThingsRequest,list_things_request +ListThingsResponse,list_things_response +ListThirdPartyFirewallFirewallPoliciesRequest,list_third_party_firewall_firewall_policies_request +ListThirdPartyFirewallFirewallPoliciesResponse,list_third_party_firewall_firewall_policies_response +ListThreatIntelSetsRequest,list_threat_intel_sets_request +ListThreatIntelSetsResponse,list_threat_intel_sets_response +ListTimeSeriesRequest,list_time_series_request +ListTimeSeriesResponse,list_time_series_response +ListTimelineEventsInput,list_timeline_events_input +ListTimelineEventsOutput,list_timeline_events_output +ListTokenBalancesInput,list_token_balances_input +ListTokenBalancesOutput,list_token_balances_output +ListTokensRequest,list_tokens_request +ListTokensResponse,list_tokens_response +ListTopicRefreshSchedulesRequest,list_topic_refresh_schedules_request +ListTopicRefreshSchedulesResponse,list_topic_refresh_schedules_response +ListTopicRuleDestinationsRequest,list_topic_rule_destinations_request +ListTopicRuleDestinationsResponse,list_topic_rule_destinations_response +ListTopicRulesRequest,list_topic_rules_request +ListTopicRulesResponse,list_topic_rules_response +ListTopicsDetectionJobsRequest,list_topics_detection_jobs_request +ListTopicsDetectionJobsResponse,list_topics_detection_jobs_response +ListTopicsInput,list_topics_input +ListTopicsRequest,list_topics_request +ListTopicsResponse,list_topics_response +ListTrackerConsumersRequest,list_tracker_consumers_request +ListTrackerConsumersResponse,list_tracker_consumers_response +ListTrackersRequest,list_trackers_request +ListTrackersResponse,list_trackers_response +ListTrackersResponseEntry,list_trackers_response_entry +ListTrafficDistributionGroupUsersRequest,list_traffic_distribution_group_users_request +ListTrafficDistributionGroupUsersResponse,list_traffic_distribution_group_users_response +ListTrafficDistributionGroupsRequest,list_traffic_distribution_groups_request +ListTrafficDistributionGroupsResponse,list_traffic_distribution_groups_response +ListTrafficPoliciesRequest,list_traffic_policies_request +ListTrafficPoliciesResponse,list_traffic_policies_response +ListTrafficPolicyInstancesByHostedZoneRequest,list_traffic_policy_instances_by_hosted_zone_request +ListTrafficPolicyInstancesByHostedZoneResponse,list_traffic_policy_instances_by_hosted_zone_response +ListTrafficPolicyInstancesByPolicyRequest,list_traffic_policy_instances_by_policy_request +ListTrafficPolicyInstancesByPolicyResponse,list_traffic_policy_instances_by_policy_response +ListTrafficPolicyInstancesRequest,list_traffic_policy_instances_request +ListTrafficPolicyInstancesResponse,list_traffic_policy_instances_response +ListTrafficPolicyVersionsRequest,list_traffic_policy_versions_request +ListTrafficPolicyVersionsResponse,list_traffic_policy_versions_response +ListTrailsRequest,list_trails_request +ListTrailsResponse,list_trails_response +ListTrainingJobsForHyperParameterTuningJobRequest,list_training_jobs_for_hyper_parameter_tuning_job_request +ListTrainingJobsForHyperParameterTuningJobResponse,list_training_jobs_for_hyper_parameter_tuning_job_response +ListTrainingJobsRequest,list_training_jobs_request +ListTrainingJobsResponse,list_training_jobs_response +ListTransactionEventsInput,list_transaction_events_input +ListTransactionEventsOutput,list_transaction_events_output +ListTransactionsInput,list_transactions_input +ListTransactionsOutput,list_transactions_output +ListTransactionsRequest,list_transactions_request +ListTransactionsResponse,list_transactions_response +ListTransactionsSort,list_transactions_sort +ListTranscriptionJobsRequest,list_transcription_jobs_request +ListTranscriptionJobsResponse,list_transcription_jobs_response +ListTransformJobsRequest,list_transform_jobs_request +ListTransformJobsResponse,list_transform_jobs_response +ListTrialComponentsRequest,list_trial_components_request +ListTrialComponentsResponse,list_trial_components_response +ListTrialsRequest,list_trials_request +ListTrialsResponse,list_trials_response +ListTriggersRequest,list_triggers_request +ListTriggersResponse,list_triggers_response +ListTrustAnchorsResponse,list_trust_anchors_response +ListTrustStoreCertificatesRequest,list_trust_store_certificates_request +ListTrustStoreCertificatesResponse,list_trust_store_certificates_response +ListTrustStoresRequest,list_trust_stores_request +ListTrustStoresResponse,list_trust_stores_response +ListTunnelsRequest,list_tunnels_request +ListTunnelsResponse,list_tunnels_response +ListType,list_type +ListTypeRegistrationsInput,list_type_registrations_input +ListTypeRegistrationsOutput,list_type_registrations_output +ListTypeVersionsInput,list_type_versions_input +ListTypeVersionsOutput,list_type_versions_output +ListTypedLinkFacetAttributesRequest,list_typed_link_facet_attributes_request +ListTypedLinkFacetAttributesResponse,list_typed_link_facet_attributes_response +ListTypedLinkFacetNamesRequest,list_typed_link_facet_names_request +ListTypedLinkFacetNamesResponse,list_typed_link_facet_names_response +ListTypesByAssociationRequest,list_types_by_association_request +ListTypesByAssociationResponse,list_types_by_association_response +ListTypesInput,list_types_input +ListTypesOutput,list_types_output +ListTypesRequest,list_types_request +ListTypesResponse,list_types_response +ListUniqueProblemsRequest,list_unique_problems_request +ListUniqueProblemsResult,list_unique_problems_result +ListUnsupportedAppVersionResourcesRequest,list_unsupported_app_version_resources_request +ListUnsupportedAppVersionResourcesResponse,list_unsupported_app_version_resources_response +ListUpdateToken,list_update_token +ListUpdatesRequest,list_updates_request +ListUpdatesResponse,list_updates_response +ListUploadsRequest,list_uploads_request +ListUploadsResult,list_uploads_result +ListUsageForLicenseConfigurationRequest,list_usage_for_license_configuration_request +ListUsageForLicenseConfigurationResponse,list_usage_for_license_configuration_response +ListUsageLimitsRequest,list_usage_limits_request +ListUsageLimitsResponse,list_usage_limits_response +ListUsageTotalsRequest,list_usage_totals_request +ListUsageTotalsResponse,list_usage_totals_response +ListUseCasesRequest,list_use_cases_request +ListUseCasesResponse,list_use_cases_response +ListUserAccessLoggingSettingsRequest,list_user_access_logging_settings_request +ListUserAccessLoggingSettingsResponse,list_user_access_logging_settings_response +ListUserAssociationsRequest,list_user_associations_request +ListUserAssociationsResponse,list_user_associations_response +ListUserGroupsRequest,list_user_groups_request +ListUserGroupsResponse,list_user_groups_response +ListUserHierarchyGroupsRequest,list_user_hierarchy_groups_request +ListUserHierarchyGroupsResponse,list_user_hierarchy_groups_response +ListUserImportJobsRequest,list_user_import_jobs_request +ListUserImportJobsResponse,list_user_import_jobs_response +ListUserPoliciesRequest,list_user_policies_request +ListUserPoliciesResponse,list_user_policies_response +ListUserPoolClientsRequest,list_user_pool_clients_request +ListUserPoolClientsResponse,list_user_pool_clients_response +ListUserPoolsRequest,list_user_pools_request +ListUserPoolsResponse,list_user_pools_response +ListUserProfilesRequest,list_user_profiles_request +ListUserProfilesResponse,list_user_profiles_response +ListUserProfilesResult,list_user_profiles_result +ListUserSettingsRequest,list_user_settings_request +ListUserSettingsResponse,list_user_settings_response +ListUserTagsRequest,list_user_tags_request +ListUserTagsResponse,list_user_tags_response +ListUsersByPermissionGroupRequest,list_users_by_permission_group_request +ListUsersByPermissionGroupResponse,list_users_by_permission_group_response +ListUsersFilters,list_users_filters +ListUsersInGroupRequest,list_users_in_group_request +ListUsersInGroupResponse,list_users_in_group_response +ListUsersRequest,list_users_request +ListUsersResponse,list_users_response +ListUtteranceAnalyticsDataRequest,list_utterance_analytics_data_request +ListUtteranceAnalyticsDataResponse,list_utterance_analytics_data_response +ListUtteranceMetricsRequest,list_utterance_metrics_request +ListUtteranceMetricsResponse,list_utterance_metrics_response +ListV2LoggingLevelsRequest,list_v2_logging_levels_request +ListV2LoggingLevelsResponse,list_v2_logging_levels_response +ListVPCAssociationAuthorizationsRequest,list_vpc_association_authorizations_request +ListVPCAssociationAuthorizationsResponse,list_vpc_association_authorizations_response +ListVPCConnectionsRequest,list_vpc_connections_request +ListVPCConnectionsResponse,list_vpc_connections_response +ListVPCEConfigurationsRequest,list_vpce_configurations_request +ListVPCEConfigurationsResult,list_vpce_configurations_result +ListVariantImportJobsFilter,list_variant_import_jobs_filter +ListVariantImportJobsRequest,list_variant_import_jobs_request +ListVariantImportJobsResponse,list_variant_import_jobs_response +ListVariantStoresFilter,list_variant_stores_filter +ListVariantStoresRequest,list_variant_stores_request +ListVariantStoresResponse,list_variant_stores_response +ListVaultsInput,list_vaults_input +ListVaultsOutput,list_vaults_output +ListVectorEnrichmentJobInput,list_vector_enrichment_job_input +ListVectorEnrichmentJobOutput,list_vector_enrichment_job_output +ListVectorEnrichmentJobOutputConfig,list_vector_enrichment_job_output_config +ListVehiclesInFleetRequest,list_vehicles_in_fleet_request +ListVehiclesInFleetResponse,list_vehicles_in_fleet_response +ListVehiclesRequest,list_vehicles_request +ListVehiclesResponse,list_vehicles_response +ListVerifiedEmailAddressesResponse,list_verified_email_addresses_response +ListVersionsByFunctionRequest,list_versions_by_function_request +ListVersionsByFunctionResponse,list_versions_by_function_response +ListVersionsRequest,list_versions_request +ListVersionsResponse,list_versions_response +ListViewVersionsRequest,list_view_versions_request +ListViewVersionsResponse,list_view_versions_response +ListViewsInput,list_views_input +ListViewsOutput,list_views_output +ListViewsRequest,list_views_request +ListViewsResponse,list_views_response +ListViolationEventsRequest,list_violation_events_request +ListViolationEventsResponse,list_violation_events_response +ListVirtualClustersRequest,list_virtual_clusters_request +ListVirtualClustersResponse,list_virtual_clusters_response +ListVirtualGatewaysInput,list_virtual_gateways_input +ListVirtualGatewaysOutput,list_virtual_gateways_output +ListVirtualInterfaceTestHistoryRequest,list_virtual_interface_test_history_request +ListVirtualInterfaceTestHistoryResponse,list_virtual_interface_test_history_response +ListVirtualMFADevicesRequest,list_virtual_mfa_devices_request +ListVirtualMFADevicesResponse,list_virtual_mfa_devices_response +ListVirtualMachinesInput,list_virtual_machines_input +ListVirtualMachinesOutput,list_virtual_machines_output +ListVirtualNodesInput,list_virtual_nodes_input +ListVirtualNodesOutput,list_virtual_nodes_output +ListVirtualRoutersInput,list_virtual_routers_input +ListVirtualRoutersOutput,list_virtual_routers_output +ListVirtualServicesInput,list_virtual_services_input +ListVirtualServicesOutput,list_virtual_services_output +ListVocabulariesRequest,list_vocabularies_request +ListVocabulariesResponse,list_vocabularies_response +ListVocabularyFiltersRequest,list_vocabulary_filters_request +ListVocabularyFiltersResponse,list_vocabulary_filters_response +ListVodSourcesRequest,list_vod_sources_request +ListVodSourcesResponse,list_vod_sources_response +ListVoiceConnectorGroupsRequest,list_voice_connector_groups_request +ListVoiceConnectorGroupsResponse,list_voice_connector_groups_response +ListVoiceConnectorTerminationCredentialsRequest,list_voice_connector_termination_credentials_request +ListVoiceConnectorTerminationCredentialsResponse,list_voice_connector_termination_credentials_response +ListVoiceConnectorsRequest,list_voice_connectors_request +ListVoiceConnectorsResponse,list_voice_connectors_response +ListVoiceProfileDomainsRequest,list_voice_profile_domains_request +ListVoiceProfileDomainsResponse,list_voice_profile_domains_response +ListVoiceProfilesRequest,list_voice_profiles_request +ListVoiceProfilesResponse,list_voice_profiles_response +ListVolumeInitiatorsInput,list_volume_initiators_input +ListVolumeInitiatorsOutput,list_volume_initiators_output +ListVolumeRecoveryPointsInput,list_volume_recovery_points_input +ListVolumeRecoveryPointsOutput,list_volume_recovery_points_output +ListVolumesInput,list_volumes_input +ListVolumesOutput,list_volumes_output +ListVpcConnectionsRequest,list_vpc_connections_request +ListVpcConnectionsResponse,list_vpc_connections_response +ListVpcConnectorsRequest,list_vpc_connectors_request +ListVpcConnectorsResponse,list_vpc_connectors_response +ListVpcEndpointAccessRequest,list_vpc_endpoint_access_request +ListVpcEndpointAccessResponse,list_vpc_endpoint_access_response +ListVpcEndpointsForDomainRequest,list_vpc_endpoints_for_domain_request +ListVpcEndpointsForDomainResponse,list_vpc_endpoints_for_domain_response +ListVpcEndpointsRequest,list_vpc_endpoints_request +ListVpcEndpointsResponse,list_vpc_endpoints_response +ListVpcIngressConnectionsFilter,list_vpc_ingress_connections_filter +ListVpcIngressConnectionsRequest,list_vpc_ingress_connections_request +ListVpcIngressConnectionsResponse,list_vpc_ingress_connections_response +ListWatchlistsRequest,list_watchlists_request +ListWatchlistsResponse,list_watchlists_response +ListWavesRequest,list_waves_request +ListWavesRequestFilters,list_waves_request_filters +ListWavesResponse,list_waves_response +ListWebACLsRequest,list_web_acls_request +ListWebACLsResponse,list_web_acls_response +ListWebhookItem,list_webhook_item +ListWebhooksInput,list_webhooks_input +ListWebhooksOutput,list_webhooks_output +ListWebhooksRequest,list_webhooks_request +ListWebhooksResult,list_webhooks_result +ListWebsiteAuthorizationProvidersRequest,list_website_authorization_providers_request +ListWebsiteAuthorizationProvidersResponse,list_website_authorization_providers_response +ListWebsiteCertificateAuthoritiesRequest,list_website_certificate_authorities_request +ListWebsiteCertificateAuthoritiesResponse,list_website_certificate_authorities_response +ListWhatIfAnalysesRequest,list_what_if_analyses_request +ListWhatIfAnalysesResponse,list_what_if_analyses_response +ListWhatIfForecastExportsRequest,list_what_if_forecast_exports_request +ListWhatIfForecastExportsResponse,list_what_if_forecast_exports_response +ListWhatIfForecastsRequest,list_what_if_forecasts_request +ListWhatIfForecastsResponse,list_what_if_forecasts_response +ListWirelessDeviceImportTasksRequest,list_wireless_device_import_tasks_request +ListWirelessDeviceImportTasksResponse,list_wireless_device_import_tasks_response +ListWirelessDevicesRequest,list_wireless_devices_request +ListWirelessDevicesResponse,list_wireless_devices_response +ListWirelessGatewayTaskDefinitionsRequest,list_wireless_gateway_task_definitions_request +ListWirelessGatewayTaskDefinitionsResponse,list_wireless_gateway_task_definitions_response +ListWirelessGatewaysRequest,list_wireless_gateways_request +ListWirelessGatewaysResponse,list_wireless_gateways_response +ListWorkGroupsInput,list_work_groups_input +ListWorkGroupsOutput,list_work_groups_output +ListWorkerBlocksRequest,list_worker_blocks_request +ListWorkerBlocksResponse,list_worker_blocks_response +ListWorkerConfigurationsRequest,list_worker_configurations_request +ListWorkerConfigurationsResponse,list_worker_configurations_response +ListWorkerFleetsRequest,list_worker_fleets_request +ListWorkerFleetsResponse,list_worker_fleets_response +ListWorkersRequest,list_workers_request +ListWorkersResponse,list_workers_response +ListWorkersWithQualificationTypeRequest,list_workers_with_qualification_type_request +ListWorkersWithQualificationTypeResponse,list_workers_with_qualification_type_response +ListWorkflowExecutionsRequest,list_workflow_executions_request +ListWorkflowExecutionsResponse,list_workflow_executions_response +ListWorkflowStepExecutionsRequest,list_workflow_step_executions_request +ListWorkflowStepExecutionsResponse,list_workflow_step_executions_response +ListWorkflowStepGroupsRequest,list_workflow_step_groups_request +ListWorkflowStepGroupsResponse,list_workflow_step_groups_response +ListWorkflowStepsRequest,list_workflow_steps_request +ListWorkflowStepsResponse,list_workflow_steps_response +ListWorkflowTypesInput,list_workflow_types_input +ListWorkflowsItem,list_workflows_item +ListWorkflowsRequest,list_workflows_request +ListWorkflowsResponse,list_workflows_response +ListWorkforcesRequest,list_workforces_request +ListWorkforcesResponse,list_workforces_response +ListWorkgroupsRequest,list_workgroups_request +ListWorkgroupsResponse,list_workgroups_response +ListWorkloadSharesInput,list_workload_shares_input +ListWorkloadSharesOutput,list_workload_shares_output +ListWorkloadsInput,list_workloads_input +ListWorkloadsOutput,list_workloads_output +ListWorkloadsRequest,list_workloads_request +ListWorkloadsResponse,list_workloads_response +ListWorkspacesRequest,list_workspaces_request +ListWorkspacesResponse,list_workspaces_response +ListWorkteamsRequest,list_workteams_request +ListWorkteamsResponse,list_workteams_response +ListWorldExportJobsRequest,list_world_export_jobs_request +ListWorldExportJobsResponse,list_world_export_jobs_response +ListWorldGenerationJobsRequest,list_world_generation_jobs_request +ListWorldGenerationJobsResponse,list_world_generation_jobs_response +ListWorldTemplatesRequest,list_world_templates_request +ListWorldTemplatesResponse,list_world_templates_response +ListWorldsRequest,list_worlds_request +ListWorldsResponse,list_worlds_response +ListXssMatchSetsRequest,list_xss_match_sets_request +ListXssMatchSetsResponse,list_xss_match_sets_response +ListZonalShiftsRequest,list_zonal_shifts_request +ListZonalShiftsResponse,list_zonal_shifts_response +ListedAccess,listed_access +ListedAgreement,listed_agreement +ListedBridge,listed_bridge +ListedCertificate,listed_certificate +ListedConnector,listed_connector +ListedEntitlement,listed_entitlement +ListedExecution,listed_execution +ListedFlow,listed_flow +ListedGateway,listed_gateway +ListedGatewayInstance,listed_gateway_instance +ListedHostKey,listed_host_key +ListedProfile,listed_profile +ListedServer,listed_server +ListedUser,listed_user +ListedWorkflow,listed_workflow +Listener,listener +ListenerAddress,listener_address +ListenerArn,listener_arn +ListenerArns,listener_arns +ListenerDescription,listener_description +ListenerDescriptions,listener_descriptions +ListenerEndpoint,listener_endpoint +ListenerNotFoundException,listener_not_found_exception +ListenerPort,listener_port +ListenerSummary,listener_summary +ListenerTls,listener_tls +ListenerTlsAcmCertificate,listener_tls_acm_certificate +ListenerTlsFileCertificate,listener_tls_file_certificate +ListenerTlsSdsCertificate,listener_tls_sds_certificate +ListenerTlsValidationContext,listener_tls_validation_context +Listeners,listeners +ListingId,listing_id +ListingTime,listing_time +LiteralArrayOptions,literal_array_options +LiteralOptions,literal_options +LiveConnectorRTMPConfiguration,live_connector_rtmp_configuration +LiveConnectorSinkConfiguration,live_connector_sink_configuration +LiveConnectorSourceConfiguration,live_connector_source_configuration +LivePoolProgress,live_pool_progress +LivePreRollConfiguration,live_pre_roll_configuration +LiveSimulationState,live_simulation_state +LiveSource,live_source +LiveSourceName,live_source_name +LivenessOutputConfig,liveness_output_config +LoRaWAN,lo_ra_wan +LoRaWANConnectionStatusEventNotificationConfigurations,lo_ra_wan_connection_status_event_notification_configurations +LoRaWANConnectionStatusResourceTypeEventConfiguration,lo_ra_wan_connection_status_resource_type_event_configuration +LoRaWANDevice,lo_ra_wan_device +LoRaWANDeviceMetadata,lo_ra_wan_device_metadata +LoRaWANDeviceProfile,lo_ra_wan_device_profile +LoRaWANFuotaTask,lo_ra_wan_fuota_task +LoRaWANFuotaTaskGetInfo,lo_ra_wan_fuota_task_get_info +LoRaWANGateway,lo_ra_wan_gateway +LoRaWANGatewayCurrentVersion,lo_ra_wan_gateway_current_version +LoRaWANGatewayMetadata,lo_ra_wan_gateway_metadata +LoRaWANGatewayVersion,lo_ra_wan_gateway_version +LoRaWANGetServiceProfileInfo,lo_ra_wan_get_service_profile_info +LoRaWANJoinEventNotificationConfigurations,lo_ra_wan_join_event_notification_configurations +LoRaWANJoinResourceTypeEventConfiguration,lo_ra_wan_join_resource_type_event_configuration +LoRaWANListDevice,lo_ra_wan_list_device +LoRaWANMulticast,lo_ra_wan_multicast +LoRaWANMulticastGet,lo_ra_wan_multicast_get +LoRaWANMulticastMetadata,lo_ra_wan_multicast_metadata +LoRaWANMulticastSession,lo_ra_wan_multicast_session +LoRaWANNetworkServerCertificateId,lo_ra_wan_network_server_certificate_id +LoRaWANSendDataToDevice,lo_ra_wan_send_data_to_device +LoRaWANServiceProfile,lo_ra_wan_service_profile +LoRaWANStartFuotaTask,lo_ra_wan_start_fuota_task +LoRaWANUpdateDevice,lo_ra_wan_update_device +LoRaWANUpdateGatewayTaskCreate,lo_ra_wan_update_gateway_task_create +LoRaWANUpdateGatewayTaskEntry,lo_ra_wan_update_gateway_task_entry +LoRoCenterMixLevel,lo_ro_center_mix_level +LoRoSurroundMixLevel,lo_ro_surround_mix_level +Loa,loa +LoadAverage,load_average +LoadBalancer,load_balancer +LoadBalancerAddress,load_balancer_address +LoadBalancerAddresses,load_balancer_addresses +LoadBalancerArn,load_balancer_arn +LoadBalancerArns,load_balancer_arns +LoadBalancerAttribute,load_balancer_attribute +LoadBalancerAttributeNotFoundException,load_balancer_attribute_not_found_exception +LoadBalancerAttributes,load_balancer_attributes +LoadBalancerDescription,load_balancer_description +LoadBalancerDescriptions,load_balancer_descriptions +LoadBalancerInfo,load_balancer_info +LoadBalancerListenerPort,load_balancer_listener_port +LoadBalancerName,load_balancer_name +LoadBalancerNames,load_balancer_names +LoadBalancerNotFoundException,load_balancer_not_found_exception +LoadBalancerOptions,load_balancer_options +LoadBalancerPort,load_balancer_port +LoadBalancerPorts,load_balancer_ports +LoadBalancerState,load_balancer_state +LoadBalancerTarget,load_balancer_target +LoadBalancerTargetGroup,load_balancer_target_group +LoadBalancerTargetGroupARN,load_balancer_target_group_arn +LoadBalancerTargetGroupState,load_balancer_target_group_state +LoadBalancerTargetGroups,load_balancer_target_groups +LoadBalancerTargetPort,load_balancer_target_port +LoadBalancerTlsCertificate,load_balancer_tls_certificate +LoadBalancerTlsCertificateDnsRecordCreationState,load_balancer_tls_certificate_dns_record_creation_state +LoadBalancerTlsCertificateDomainValidationOption,load_balancer_tls_certificate_domain_validation_option +LoadBalancerTlsCertificateDomainValidationRecord,load_balancer_tls_certificate_domain_validation_record +LoadBalancerTlsCertificateRenewalSummary,load_balancer_tls_certificate_renewal_summary +LoadBalancerTlsCertificateSummary,load_balancer_tls_certificate_summary +LoadBalancerTlsPolicy,load_balancer_tls_policy +LoadBalancerType,load_balancer_type +LoadBalancers,load_balancers +LoadBalancersConfig,load_balancers_config +LoadBasedAutoScalingConfiguration,load_based_auto_scaling_configuration +LoadBasedAutoScalingConfigurations,load_based_auto_scaling_configurations +LoadDryRunConfig,load_dry_run_config +LoadForecast,load_forecast +LoadPermission,load_permission +LoadPermissionModifications,load_permission_modifications +LoadPermissionRequest,load_permission_request +LoadPermissions,load_permissions +LoadSampleData,load_sample_data +LoadThreshold,load_threshold +LoadTimeout,load_timeout +LoadUrlAccessDeniedException,load_url_access_denied_exception +LoaderIdResult,loader_id_result +LoadingAnimation,loading_animation +LocalAddress,local_address +LocalBgpAsn,local_bgp_asn +LocalCollectorS3Access,local_collector_s3_access +LocalConsolePassword,local_console_password +LocalDeviceResourceData,local_device_resource_data +LocalDirectoryPath,local_directory_path +LocalDomainInfo,local_domain_info +LocalGateway,local_gateway +LocalGatewayId,local_gateway_id +LocalGatewayIds,local_gateway_ids +LocalGatewayRoute,local_gateway_route +LocalGatewayRouteTable,local_gateway_route_table +LocalGatewayRouteTableArn,local_gateway_route_table_arn +LocalGatewayRouteTableId,local_gateway_route_table_id +LocalGatewayRouteTableIds,local_gateway_route_table_ids +LocalGatewayRouteTableVirtualInterfaceGroupAssociation,local_gateway_route_table_virtual_interface_group_association +LocalGatewayRouteTableVirtualInterfaceGroupAssociationId,local_gateway_route_table_virtual_interface_group_association_id +LocalGatewayRouteTableVirtualInterfaceGroupAssociationIds,local_gateway_route_table_virtual_interface_group_association_ids +LocalGatewayRouteTableVirtualInterfaceGroupAssociations,local_gateway_route_table_virtual_interface_group_associations +LocalGatewayRouteTableVpcAssociation,local_gateway_route_table_vpc_association +LocalGatewayRouteTableVpcAssociationId,local_gateway_route_table_vpc_association_id +LocalGatewayRouteTableVpcAssociationIds,local_gateway_route_table_vpc_association_ids +LocalGatewayRouteTableVpcAssociations,local_gateway_route_table_vpc_associations +LocalGatewayRouteTables,local_gateway_route_tables +LocalGatewayVirtualInterface,local_gateway_virtual_interface +LocalGatewayVirtualInterfaceGroup,local_gateway_virtual_interface_group +LocalGatewayVirtualInterfaceGroupId,local_gateway_virtual_interface_group_id +LocalGatewayVirtualInterfaceGroupIds,local_gateway_virtual_interface_group_ids +LocalGatewayVirtualInterfaceGroups,local_gateway_virtual_interface_groups +LocalGatewayVirtualInterfaceId,local_gateway_virtual_interface_id +LocalGatewayVirtualInterfaceIds,local_gateway_virtual_interface_ids +LocalGatewayVirtualInterfaces,local_gateway_virtual_interfaces +LocalGateways,local_gateways +LocalHealthEventsConfig,local_health_events_config +LocalIpDetails,local_ip_details +LocalIpv4NetworkCidr,local_ipv4_network_cidr +LocalIpv6NetworkCidr,local_ipv6_network_cidr +LocalMountPath,local_mount_path +LocalNavigationConfiguration,local_navigation_configuration +LocalPath,local_path +LocalPortDetails,local_port_details +LocalProfileId,local_profile_id +LocalSecondaryIndex,local_secondary_index +LocalSecondaryIndexDescription,local_secondary_index_description +LocalSecondaryIndexInfo,local_secondary_index_info +LocalSecondaryIndexOverride,local_secondary_index_override +LocalSecondaryIndexes,local_secondary_indexes +LocalSizeConfig,local_size_config +LocalStorage,local_storage +LocalStorageTypes,local_storage_types +LocalTarget,local_target +LocalTime,local_time +LocalVolumeResourceData,local_volume_resource_data +LocalWriteForwardingStatus,local_write_forwarding_status +Locale,locale +LocaleCode,locale_code +LocaleId,locale_id +LocaleValue,locale_value +LocaleValues,locale_values +Locality,locality +Location,location +LocationARN,location_arn +LocationAction,location_action +LocationArn,location_arn +LocationAttributes,location_attributes +LocationConfiguration,location_configuration +LocationConstraint,location_constraint +LocationFilter,location_filter +LocationListEntry,location_list_entry +LocationModel,location_model +LocationName,location_name +LocationOrder,location_order +LocationState,location_state +LocationStates,location_states +LocationSummary,location_summary +LocationTimestamp,location_timestamp +LocationType,location_type +LocationUri,location_uri +Locations,locations +LockConfiguration,lock_configuration +LockDate,lock_date +LockEndTime,lock_end_time +LockRuleRequest,lock_rule_request +LockRuleResponse,lock_rule_response +LockState,lock_state +LockToken,lock_token +Locked,locked +LockedSubscriptionException,locked_subscription_exception +LockoutPreventedException,lockout_prevented_exception +LockoutPreventionException,lockout_prevention_exception +LogAnomalyClass,log_anomaly_class +LogAnomalyClasses,log_anomaly_classes +LogAnomalyShowcase,log_anomaly_showcase +LogAnomalyShowcases,log_anomaly_showcases +LogAnomalyToken,log_anomaly_token +LogAnomalyType,log_anomaly_type +LogBucket,log_bucket +LogBucketList,log_bucket_list +LogConfig,log_config +LogConfiguration,log_configuration +LogConfigurationForChannel,log_configuration_for_channel +LogConfigurationType,log_configuration_type +LogConfigurations,log_configurations +LogDelivery,log_delivery +LogDeliveryBucket,log_delivery_bucket +LogDeliveryConfiguration,log_delivery_configuration +LogDeliveryConfigurationRequest,log_delivery_configuration_request +LogDeliveryConfigurationType,log_delivery_configuration_type +LogDeliveryConfigurations,log_delivery_configurations +LogDeliveryDescription,log_delivery_description +LogDeliveryStatus,log_delivery_status +LogDestination,log_destination +LogDestinationConfig,log_destination_config +LogDestinationConfigs,log_destination_configs +LogDestinationPermissionException,log_destination_permission_exception +LogDestinationType,log_destination_type +LogDriver,log_driver +LogEnabled,log_enabled +LogEncryptionKmsKeyId,log_encryption_kms_key_id +LogEvent,log_event +LogEventId,log_event_id +LogEventTimestamp,log_event_timestamp +LogExports,log_exports +LogFile,log_file +LogFileData,log_file_data +LogFileName,log_file_name +LogFilePath,log_file_path +LogFilePrefix,log_file_prefix +LogFileValidationEnabled,log_file_validation_enabled +LogFilter,log_filter +LogFormat,log_format +LogGroup,log_group +LogGroupArn,log_group_arn +LogGroupField,log_group_field +LogGroupName,log_group_name +LogGroupSummary,log_group_summary +LogLevel,log_level +LogLevelUpdate,log_level_update +LogOddsMetric,log_odds_metric +LogOptions,log_options +LogOutputFormat,log_output_format +LogPaths,log_paths +LogPattern,log_pattern +LogPatternSets,log_pattern_sets +LogPatterns,log_patterns +LogPublishingConfiguration,log_publishing_configuration +LogPublishingOption,log_publishing_option +LogPublishingOptions,log_publishing_options +LogPublishingOptionsStatus,log_publishing_options_status +LogResult,log_result +LogRoleArn,log_role_arn +LogSettingsRequest,log_settings_request +LogSettingsResponse,log_settings_response +LogSetup,log_setup +LogSource,log_source +LogStream,log_stream +LogStreamARN,log_stream_arn +LogStreamARNUpdate,log_stream_arn_update +LogStreamArn,log_stream_arn +LogStreamName,log_stream_name +LogStreams,log_streams +LogSubscription,log_subscription +LogSubscriptions,log_subscriptions +LogTarget,log_target +LogTargetConfiguration,log_target_configuration +LogText,log_text +LogType,log_type +LogTypes,log_types +LogTypesToDisable,log_types_to_disable +LogTypesToEnable,log_types_to_enable +LogUploadEnabled,log_upload_enabled +LogUri,log_uri +LogUrl,log_url +LogVersion,log_version +Logarithmic,logarithmic +Logger,logger +LoggerDefinitionId,logger_definition_id +LoggerDefinitionVersion,logger_definition_version +LoggerDefinitionVersionArn,logger_definition_version_arn +LoggerDefinitionVersionId,logger_definition_version_id +Loggers,loggers +Logging,logging +LoggingConfig,logging_config +LoggingConfiguration,logging_configuration +LoggingConfigurationInput,logging_configuration_input +LoggingConfigurationMetadata,logging_configuration_metadata +LoggingConfigurationStatus,logging_configuration_status +LoggingConfigurationSummary,logging_configuration_summary +LoggingConfigurations,logging_configurations +LoggingEnabled,logging_enabled +LoggingFilter,logging_filter +LoggingInfo,logging_info +LoggingLevel,logging_level +LoggingOptions,logging_options +LoggingOptionsPayload,logging_options_payload +LoggingRole,logging_role +LoggingStatus,logging_status +Logical,logical +LogicalCapacityUsed,logical_capacity_used +LogicalIdHierarchy,logical_id_hierarchy +LogicalOperator,logical_operator +LogicalResourceId,logical_resource_id +LogicalResourceIds,logical_resource_ids +LogicalTable,logical_table +LogicalTableMap,logical_table_map +LogicalTableSource,logical_table_source +LogicalUsed,logical_used +LoginAttribute,login_attribute +LoginAttributes,login_attributes +LoginAuthConfig,login_auth_config +LoginAuthConfigReqObj,login_auth_config_req_obj +LoginMessage,login_message +LoginPath,login_path +LoginProfile,login_profile +LoginWithAmazon,login_with_amazon +Logins,logins +LoginsToRemove,logins_to_remove +Logo,logo +Logo2x,logo2x +Logo2xUrl,logo2x_url +Logo3x,logo3x +Logo3xUrl,logo3x_url +LogoUrl,logo_url +LogoutEndpoint,logout_endpoint +LogoutRequest,logout_request +LogoutURLs,logout_urls +LogoutUserRequest,logout_user_request +Logref,logref +Logs,logs +LogsAnomalyDetection,logs_anomaly_detection +LogsAnomalyDetectionIntegration,logs_anomaly_detection_integration +LogsAnomalyDetectionIntegrationConfig,logs_anomaly_detection_integration_config +LogsConfig,logs_config +LogsLocation,logs_location +LogsStorageLocation,logs_storage_location +LogsSummary,logs_summary +Lon,lon +LongColumnStatisticsData,long_column_statistics_data +LongDescription,long_description +LongFormatText,long_format_text +LongRangeType,long_range_type +LongTermPricingEndDate,long_term_pricing_end_date +LongTermPricingEntries,long_term_pricing_entries +LongTermPricingId,long_term_pricing_id +LongTermPricingIds,long_term_pricing_ids +LongTermPricingListEntry,long_term_pricing_list_entry +LongTermPricingStartDate,long_term_pricing_start_date +LongTermPricingStatus,long_term_pricing_status +LongTermPricingType,long_term_pricing_type +LongValue,long_value +LongestPrefixMatches,longest_prefix_matches +Longitude,longitude +LookAheadRateControl,look_ahead_rate_control +LookBackAvailablePeriods,look_back_available_periods +LookBackPeriod,look_back_period +LookbackPeriodInDays,lookback_period_in_days +LookbackWindow,lookback_window +LookoutMetrics,lookout_metrics +LookupAttribute,lookup_attribute +LookupAttributes,lookup_attributes +LookupDeveloperIdentityInput,lookup_developer_identity_input +LookupDeveloperIdentityResponse,lookup_developer_identity_response +LookupEventsRequest,lookup_events_request +LookupEventsResponse,lookup_events_response +LookupPolicy,lookup_policy +LookupPolicyRequest,lookup_policy_request +LookupPolicyResponse,lookup_policy_response +LoopDetectedException,loop_detected_exception +LossValue,loss_value +LoudnessLogging,loudness_logging +Low,low +LowAction,low_action +LowCount,low_count +LowLatencyHlsManifests,low_latency_hls_manifests +LowerBound,lower_bound +LowerBoundary,lower_boundary +LsaAnalysisId,lsa_analysis_id +Lt,lt +LtRtCenterMixLevel,lt_rt_center_mix_level +LtRtSurroundMixLevel,lt_rt_surround_mix_level +Lte,lte +LteLocalId,lte_local_id +LteNmr,lte_nmr +LteNmrObj,lte_nmr_obj +LteObj,lte_obj +LteTimingAdvance,lte_timing_advance +LunCount,lun_count +LunNumber,lun_number +LustreConfiguration,lustre_configuration +LustreFileSystemConfiguration,lustre_file_system_configuration +LustreLogConfiguration,lustre_log_configuration +LustreLogCreateConfiguration,lustre_log_create_configuration +LustreResponse,lustre_response +LustreRootSquashConfiguration,lustre_root_squash_configuration +M2tsScte35Esam,m2ts_scte35_esam +M2tsSettings,m2ts_settings +M3u8Settings,m3u8_settings +MAPE,mape +MASE,mase +MAXIMUM,maximum +MD5,md5 +MD5OfBody,md5_of_body +MD5OfMessageAttributes,md5_of_message_attributes +MD5OfMessageBody,md5_of_message_body +MD5OfMessageSystemAttributes,md5_of_message_system_attributes +MFA,mfa +MFADelete,mfa_delete +MFADevice,mfa_device +MFADevices,mfa_devices +MFAMethodNotFoundException,mfa_method_not_found_exception +MFAMode,mfa_mode +MFAOptionType,mfa_option_type +MFAOptions,mfa_options +MINIMUM,minimum +MLFramework,ml_framework +MLModel,ml_model +MLModelId,ml_model_id +MLModelName,ml_model_name +MLModelType,ml_model_type +MLResourceNotFoundException,ml_resource_not_found_exception +MLTransform,ml_transform +MLTransformNotReadyException,ml_transform_not_ready_exception +MLUserDataEncryption,ml_user_data_encryption +MSKClusterARN,msk_cluster_arn +MSKSourceConfiguration,msk_source_configuration +MSKSourceDescription,msk_source_description +Mac,mac +MacAddress,mac_address +MacAddressList,mac_address_list +MacAlgorithm,mac_algorithm +MacAlgorithmDukpt,mac_algorithm_dukpt +MacAlgorithmEmv,mac_algorithm_emv +MacAlgorithms,mac_algorithms +MacLength,mac_length +MacSecKey,mac_sec_key +MacValid,mac_valid +MacVersion,mac_version +MachineLabeled,machine_labeled +MachineLearningDetectionConfig,machine_learning_detection_config +MachineType,machine_type +MagneticDuration,magnetic_duration +MagneticStore,magnetic_store +MagneticStoreRejectedDataLocation,magnetic_store_rejected_data_location +MagneticStoreRetentionPeriodInDays,magnetic_store_retention_period_in_days +MagneticStoreWriteProperties,magnetic_store_write_properties +MailDomainInUseException,mail_domain_in_use_exception +MailDomainNotFoundException,mail_domain_not_found_exception +MailDomainStateException,mail_domain_state_exception +MailDomainSummary,mail_domain_summary +MailDomains,mail_domains +MailFromAttributes,mail_from_attributes +MailFromDomain,mail_from_domain +MailFromDomainAttributes,mail_from_domain_attributes +MailFromDomainNotVerifiedException,mail_from_domain_not_verified_exception +MailFromDomainStatus,mail_from_domain_status +MailType,mail_type +MailboxDeprovisionedDate,mailbox_deprovisioned_date +MailboxExportJob,mailbox_export_job +MailboxProvisionedDate,mailbox_provisioned_date +MailboxQuota,mailbox_quota +MailboxSize,mailbox_size +MailingAddress,mailing_address +Main,main +MainClass,main_class +MainProfileId,main_profile_id +Maintainer,maintainer +Maintenance,maintenance +MaintenanceAutoAppliedAfter,maintenance_auto_applied_after +MaintenanceCreateSettings,maintenance_create_settings +MaintenanceDay,maintenance_day +MaintenanceDeadline,maintenance_deadline +MaintenanceDetails,maintenance_details +MaintenanceOperationsInProgress,maintenance_operations_in_progress +MaintenanceOptions,maintenance_options +MaintenanceSchedule,maintenance_schedule +MaintenanceScheduledDate,maintenance_scheduled_date +MaintenanceSchedules,maintenance_schedules +MaintenanceStartHour,maintenance_start_hour +MaintenanceStartTime,maintenance_start_time +MaintenanceStatus,maintenance_status +MaintenanceStrategies,maintenance_strategies +MaintenanceTrack,maintenance_track +MaintenanceTrackName,maintenance_track_name +MaintenanceTracks,maintenance_tracks +MaintenanceUpdateSettings,maintenance_update_settings +MaintenanceWindow,maintenance_window +MaintenanceWindowAutomationParameters,maintenance_window_automation_parameters +MaintenanceWindowExecution,maintenance_window_execution +MaintenanceWindowExecutionTaskIdentity,maintenance_window_execution_task_identity +MaintenanceWindowExecutionTaskInvocationIdentity,maintenance_window_execution_task_invocation_identity +MaintenanceWindowFilter,maintenance_window_filter +MaintenanceWindowIdentity,maintenance_window_identity +MaintenanceWindowIdentityForTarget,maintenance_window_identity_for_target +MaintenanceWindowLambdaParameters,maintenance_window_lambda_parameters +MaintenanceWindowRunCommandParameters,maintenance_window_run_command_parameters +MaintenanceWindowStartTime,maintenance_window_start_time +MaintenanceWindowStepFunctionsParameters,maintenance_window_step_functions_parameters +MaintenanceWindowTarget,maintenance_window_target +MaintenanceWindowTask,maintenance_window_task +MaintenanceWindowTaskInvocationParameters,maintenance_window_task_invocation_parameters +MaintenanceWindowTaskParameterValueExpression,maintenance_window_task_parameter_value_expression +MajorEngineVersion,major_engine_version +MajorKeyDerivationMode,major_key_derivation_mode +MajorRevision,major_revision +MajorVersion,major_version +Make,make +MalformedArnException,malformed_arn_exception +MalformedCSRException,malformed_csr_exception +MalformedCertificateException,malformed_certificate_exception +MalformedPolicyDocumentException,malformed_policy_document_exception +MalformedPolicyException,malformed_policy_exception +MalformedPolicyTemplateException,malformed_policy_template_exception +MalformedQueryException,malformed_query_exception +Malware,malware +MalwareName,malware_name +MalwarePath,malware_path +MalwareProtection,malware_protection +MalwareProtectionConfiguration,malware_protection_configuration +MalwareProtectionConfigurationResult,malware_protection_configuration_result +MalwareProtectionDataSourceFreeTrial,malware_protection_data_source_free_trial +MalwareState,malware_state +MalwareType,malware_type +ManageBerkshelf,manage_berkshelf +ManageMasterUserPassword,manage_master_user_password +ManagePropertygraphStatisticsInput,manage_propertygraph_statistics_input +ManagePropertygraphStatisticsOutput,manage_propertygraph_statistics_output +ManageSparqlStatisticsInput,manage_sparql_statistics_input +ManageSparqlStatisticsOutput,manage_sparql_statistics_output +ManagedAccount,managed_account +ManagedAction,managed_action +ManagedActionHistoryItem,managed_action_history_item +ManagedActionHistoryItems,managed_action_history_items +ManagedActionInvalidStateException,managed_action_invalid_state_exception +ManagedActions,managed_actions +ManagedAgent,managed_agent +ManagedAgentStateChange,managed_agent_state_change +ManagedBy,managed_by +ManagedByFirewallManager,managed_by_firewall_manager +ManagedDataIdentifierSummary,managed_data_identifier_summary +ManagedExecution,managed_execution +ManagedJobTemplateSummary,managed_job_template_summary +ManagedKeys,managed_keys +ManagedKeysIPV4,managed_keys_ipv4 +ManagedKeysIPV6,managed_keys_ipv6 +ManagedOwnerName,managed_owner_name +ManagedPersistenceMonitoringConfiguration,managed_persistence_monitoring_configuration +ManagedPolicyArn,managed_policy_arn +ManagedPolicyDetail,managed_policy_detail +ManagedPrefixList,managed_prefix_list +ManagedProductDescriptor,managed_product_descriptor +ManagedProducts,managed_products +ManagedResourceSummary,managed_resource_summary +ManagedResourceSummaryList,managed_resource_summary_list +ManagedRule,managed_rule +ManagedRuleDescription,managed_rule_description +ManagedRuleException,managed_rule_exception +ManagedRuleGroupConfig,managed_rule_group_config +ManagedRuleGroupConfigs,managed_rule_group_configs +ManagedRuleGroupStatement,managed_rule_group_statement +ManagedRuleGroupSummary,managed_rule_group_summary +ManagedRuleGroupVersion,managed_rule_group_version +ManagedRuleGroups,managed_rule_groups +ManagedRuleSet,managed_rule_set +ManagedRuleSetName,managed_rule_set_name +ManagedRuleSetSummary,managed_rule_set_summary +ManagedRuleSetVersion,managed_rule_set_version +ManagedRuleSets,managed_rule_sets +ManagedRuleState,managed_rule_state +ManagedRules,managed_rules +ManagedScaling,managed_scaling +ManagedScalingPolicy,managed_scaling_policy +ManagedServiceData,managed_service_data +ManagedStreamingKafkaParameters,managed_streaming_kafka_parameters +ManagedType,managed_type +ManagedbyFirewallManager,managedby_firewall_manager +Management,management +ManagementCidrRangeConstraint,management_cidr_range_constraint +ManagementCidrRanges,management_cidr_ranges +ManagementState,management_state +ManagementType,management_type +ManagesVpcEndpoints,manages_vpc_endpoints +Mandatory,mandatory +Manifest,manifest +ManifestCompression,manifest_compression +ManifestConfirmConditionNotification,manifest_confirm_condition_notification +ManifestDurationFormat,manifest_duration_format +ManifestEncoding,manifest_encoding +ManifestEncryption,manifest_encryption +ManifestEndpointPrefix,manifest_endpoint_prefix +ManifestFileLocation,manifest_file_location +ManifestFilePath,manifest_file_path +ManifestFormat,manifest_format +ManifestGenerator,manifest_generator +ManifestKey,manifest_key +ManifestLayout,manifest_layout +ManifestMetadataSignaling,manifest_metadata_signaling +ManifestName,manifest_name +ManifestNameModifier,manifest_name_modifier +ManifestOutputLocation,manifest_output_location +ManifestOverridesPayload,manifest_overrides_payload +ManifestPayload,manifest_payload +ManifestPrefix,manifest_prefix +ManifestPrefixLocation,manifest_prefix_location +ManifestProcessingRules,manifest_processing_rules +ManifestS3Uri,manifest_s3_uri +ManifestSummary,manifest_summary +ManifestURI,manifest_uri +ManifestWindowSeconds,manifest_window_seconds +Manual,manual +ManualEvidence,manual_evidence +ManualMergeRequiredException,manual_merge_required_exception +ManualSnapshotRemainingDays,manual_snapshot_remaining_days +ManualSnapshotRetentionPeriod,manual_snapshot_retention_period +ManualSnapshotsCurrentCount,manual_snapshots_current_count +ManualSnapshotsLimit,manual_snapshots_limit +ManualSnapshotsLimitReached,manual_snapshots_limit_reached +Manufacturer,manufacturer +ManufacturerHardwareCertificate,manufacturer_hardware_certificate +ManufacturerName,manufacturer_name +MapArn,map_arn +MapBooleanAsBoolean,map_boolean_as_boolean +MapConfiguration,map_configuration +MapConfigurationUpdate,map_configuration_update +MapCustomerOwnedIpOnLaunch,map_customer_owned_ip_on_launch +MapEntries,map_entries +MapEquals,map_equals +MapFilter,map_filter +MapIterationEventDetails,map_iteration_event_details +MapJsonbAsClob,map_jsonb_as_clob +MapLongVarcharAs,map_long_varchar_as +MapMatchingConfig,map_matching_config +MapName,map_name +MapPublicIpOnLaunch,map_public_ip_on_launch +MapRunExecutionCounts,map_run_execution_counts +MapRunFailedEventDetails,map_run_failed_event_details +MapRunItemCounts,map_run_item_counts +MapRunListItem,map_run_list_item +MapRunStartedEventDetails,map_run_started_event_details +MapStateStartedEventDetails,map_state_started_event_details +MapStyleOptions,map_style_options +MapZoomMode,map_zoom_mode +MappedDataSetParameter,mapped_data_set_parameter +MappedDataSetParameters,mapped_data_set_parameters +MappedResourceConfigurationList,mapped_resource_configuration_list +MappedResourceConfigurationListItem,mapped_resource_configuration_list_item +Mapping,mapping +MappingEntry,mapping_entry +MappingParameters,mapping_parameters +MappingRule,mapping_rule +Mappings,mappings +Margin,margin +MarginPercentage,margin_percentage +MarginStyle,margin_style +MariaDbDataProviderSettings,maria_db_data_provider_settings +MariaDbParameters,maria_db_parameters +MarkAsArchivedRequest,mark_as_archived_request +MarkLatest,mark_latest +Marker,marker +MarkerColor,marker_color +MarkerRecordedEventAttributes,marker_recorded_event_attributes +MarkerShape,marker_shape +MarkerSize,marker_size +MarkerStyleSettings,marker_style_settings +MarkerVisibility,marker_visibility +Market,market +MarketType,market_type +Marketo,marketo +MarketoConnectorProfileCredentials,marketo_connector_profile_credentials +MarketoConnectorProfileProperties,marketo_connector_profile_properties +MarketoDestinationProperties,marketo_destination_properties +MarketoSourceProperties,marketo_source_properties +Marketplace,marketplace +MarketplaceCommerceAnalyticsException,marketplace_commerce_analytics_exception +MarketplaceDescription,marketplace_description +MarketplaceInformation,marketplace_information +MarketplaceOnboardingStatus,marketplace_onboarding_status +MarketplaceTitle,marketplace_title +MarketplaceUrl,marketplace_url +MarksNotSupportedForFormatException,marks_not_supported_for_format_exception +Mask,mask +MaskCharacter,mask_character +MaskMode,mask_mode +MaskValue,mask_value +Masks,masks +Master,master +MasterAccountArn,master_account_arn +MasterAccountEmail,master_account_email +MasterAccountId,master_account_id +MasterArn,master_arn +MasterBackendRole,master_backend_role +MasterCannotLeaveOrganizationException,master_cannot_leave_organization_exception +MasterEligibleNodeCount,master_eligible_node_count +MasterId,master_id +MasterInstanceId,master_instance_id +MasterInstanceSecurityGroupId,master_instance_security_group_id +MasterInstanceType,master_instance_type +MasterNode,master_node +MasterPublicDnsName,master_public_dns_name +MasterRegion,master_region +MasterUserARN,master_user_arn +MasterUserArn,master_user_arn +MasterUserName,master_user_name +MasterUserOptions,master_user_options +MasterUserPassword,master_user_password +MasterUserSecret,master_user_secret +MasterUserSecretKmsKeyId,master_user_secret_kms_key_id +MasterUsername,master_username +MasteringMonitorNits,mastering_monitor_nits +Match,match +MatchAllValue,match_all_value +MatchAttributes,match_attributes +MatchConfidence,match_confidence +MatchCriteria,match_criteria +MatchGenerationDate,match_generation_date +MatchId,match_id +MatchIds,match_ids +MatchItem,match_item +MatchOperator,match_operator +MatchOption,match_option +MatchOptions,match_options +MatchPaths,match_paths +MatchPattern,match_pattern +MatchPredicates,match_predicates +MatchRange,match_range +MatchScope,match_scope +MatchType,match_type +MatchedCategories,matched_categories +MatchedDetails,matched_details +MatchedEventTime,matched_event_time +MatchedPlayerSession,matched_player_session +MatchedPlayerSessions,matched_player_sessions +MatchedRules,matched_rules +MatchedStatements,matched_statements +MatchedUser,matched_user +Matcher,matcher +Matches,matches +Matching,matching +MatchingAttributesList,matching_attributes_list +MatchingBucket,matching_bucket +MatchingEventTypes,matching_event_types +MatchingRequest,matching_request +MatchingResource,matching_resource +MatchingResponse,matching_response +MatchingRule,matching_rule +MatchingRules,matching_rules +MatchingWorkflowSummary,matching_workflow_summary +MatchmakerData,matchmaker_data +MatchmakingConfiguration,matchmaking_configuration +MatchmakingRuleSet,matchmaking_rule_set +MatchmakingTicket,matchmaking_ticket +MathActivity,math_activity +MavenReference,maven_reference +MavenReferenceDescription,maven_reference_description +Max,max +Max24HourSend,max24_hour_send +MaxAbrBitrate,max_abr_bitrate +MaxActiveResourcesExceededException,max_active_resources_exceeded_exception +MaxAge,max_age +MaxAgeInDays,max_age_in_days +MaxAgeInMinutes,max_age_in_minutes +MaxAgeRule,max_age_rule +MaxAgeSeconds,max_age_seconds +MaxAggregationInterval,max_aggregation_interval +MaxAllocatedStorage,max_allocated_storage +MaxAllowedRuleLevelForMatching,max_allowed_rule_level_for_matching +MaxAllowedRuleLevelForMerging,max_allowed_rule_level_for_merging +MaxAllowedSignature,max_allowed_signature +MaxAlternatives,max_alternatives +MaxAncDataSize,max_anc_data_size +MaxAssignments,max_assignments +MaxAttempts,max_attempts +MaxAutoMLJobRuntimeInSeconds,max_auto_ml_job_runtime_in_seconds +MaxAverageBitrate,max_average_bitrate +MaxBand,max_band +MaxBitrate,max_bitrate +MaxCandidates,max_candidates +MaxCapacity,max_capacity +MaxCapacityBreachBehavior,max_capacity_breach_behavior +MaxCapacityBuffer,max_capacity_buffer +MaxCapacityUnits,max_capacity_units +MaxCaptures,max_captures +MaxCityNetworksToMonitor,max_city_networks_to_monitor +MaxCll,max_cll +MaxConcurrency,max_concurrency +MaxConcurrentCount,max_concurrent_count +MaxConcurrentDpus,max_concurrent_dpus +MaxConcurrentGameSessionActivations,max_concurrent_game_session_activations +MaxConcurrentInvocationsPerInstance,max_concurrent_invocations_per_instance +MaxConcurrentPercentage,max_concurrent_percentage +MaxConcurrentQueriesException,max_concurrent_queries_exception +MaxConcurrentRuns,max_concurrent_runs +MaxConcurrentSessions,max_concurrent_sessions +MaxConcurrentTaskCount,max_concurrent_task_count +MaxConcurrentTransforms,max_concurrent_transforms +MaxConnections,max_connections +MaxConnectionsPercent,max_connections_percent +MaxContacts,max_contacts +MaxContentLightLevel,max_content_light_level +MaxContentSizePerPageInMegaBytes,max_content_size_per_page_in_mega_bytes +MaxContributorCount,max_contributor_count +MaxContributorValue,max_contributor_value +MaxCount,max_count +MaxCountRule,max_count_rule +MaxCpuUtilizationPercentage,max_cpu_utilization_percentage +MaxDatapoints,max_datapoints +MaxDepth,max_depth +MaxDocumentSizeExceeded,max_document_size_exceeded +MaxDominantColors,max_dominant_colors +MaxDrainDurationSeconds,max_drain_duration_seconds +MaxDuration,max_duration +MaxDurationInSeconds,max_duration_in_seconds +MaxDurationSeconds,max_duration_seconds +MaxDutyCycle,max_duty_cycle +MaxEirp,max_eirp +MaxEntries,max_entries +MaxErrors,max_errors +MaxExpirationTime,max_expiration_time +MaxFaces,max_faces +MaxFall,max_fall +MaxFetchRecordsPerShard,max_fetch_records_per_shard +MaxFetchTimeInMs,max_fetch_time_in_ms +MaxFileSize,max_file_size +MaxFiles,max_files +MaxFilesInBand,max_files_in_band +MaxFrameAverageLightLevel,max_frame_average_light_level +MaxFrameRate,max_frame_rate +MaxGroupPreparedCapacity,max_group_prepared_capacity +MaxHeight,max_height +MaxHumanLabeledObjectCount,max_human_labeled_object_count +MaxIdleConnectionsPercent,max_idle_connections_percent +MaxImpact,max_impact +MaxInferenceUnits,max_inference_units +MaxInstanceCount,max_instance_count +MaxInstanceLifetime,max_instance_lifetime +MaxInvocations,max_invocations +MaxInvocationsPerMinute,max_invocations_per_minute +MaxIopsPerDbInstance,max_iops_per_db_instance +MaxIopsPerGib,max_iops_per_gib +MaxItems,max_items +MaxKBytesPerRead,max_k_bytes_per_read +MaxKeys,max_keys +MaxLabels,max_labels +MaxLatency,max_latency +MaxLength,max_length +MaxLexemeLengthExceededException,max_lexeme_length_exceeded_exception +MaxLexiconsNumberExceededException,max_lexicons_number_exceeded_exception +MaxLimit,max_limit +MaxLinksPerPage,max_links_per_page +MaxLocalMediaSizeInMB,max_local_media_size_in_mb +MaxLuminance,max_luminance +MaxManifestFragmentResults,max_manifest_fragment_results +MaxMediaPlaylistFragmentResults,max_media_playlist_fragment_results +MaxMembers,max_members +MaxMemoryUtilizationPercentage,max_memory_utilization_percentage +MaxModelVersion,max_model_version +MaxModels,max_models +MaxNumberOfAutoScalingGroups,max_number_of_auto_scaling_groups +MaxNumberOfConfigRulesExceededException,max_number_of_config_rules_exceeded_exception +MaxNumberOfConfigurationRecordersExceededException,max_number_of_configuration_recorders_exceeded_exception +MaxNumberOfConformancePacksExceededException,max_number_of_conformance_packs_exceeded_exception +MaxNumberOfDeliveryChannelsExceededException,max_number_of_delivery_channels_exceeded_exception +MaxNumberOfLaunchConfigurations,max_number_of_launch_configurations +MaxNumberOfMessages,max_number_of_messages +MaxNumberOfMessagesPerSecond,max_number_of_messages_per_second +MaxNumberOfOrganizationConfigRulesExceededException,max_number_of_organization_config_rules_exceeded_exception +MaxNumberOfOrganizationConformancePacksExceededException,max_number_of_organization_conformance_packs_exceeded_exception +MaxNumberOfRetentionConfigurationsExceededException,max_number_of_retention_configurations_exceeded_exception +MaxNumberOfTests,max_number_of_tests +MaxNumberOfTrainingJobs,max_number_of_training_jobs +MaxNumberOfTrainingJobsNotImproving,max_number_of_training_jobs_not_improving +MaxOffsetsPerTrigger,max_offsets_per_trigger +MaxOutputFiles,max_output_files +MaxOutputs,max_outputs +MaxP95Performance,max_p95_performance +MaxPaddingBytes,max_padding_bytes +MaxParallelExecutionSteps,max_parallel_execution_steps +MaxParallelLaunches,max_parallel_launches +MaxParallelOfTests,max_parallel_of_tests +MaxParallelTrainingJobs,max_parallel_training_jobs +MaxParts,max_parts +MaxPasswordAge,max_password_age +MaxPayloadInMB,max_payload_in_mb +MaxPcrInterval,max_pcr_interval +MaxPercentageOfInputDatasetLabeled,max_percentage_of_input_dataset_labeled +MaxPixelThreshold,max_pixel_threshold +MaxPrice,max_price +MaxPricePerMinute,max_price_per_minute +MaxProtectionGroups,max_protection_groups +MaxQueryResults,max_query_results +MaxRange,max_range +MaxRecordCount,max_record_count +MaxRecordPerRead,max_record_per_read +MaxRecords,max_records +MaxRenditions,max_renditions +MaxResource,max_resource +MaxResults,max_results +MaxRetentionDays,max_retention_days +MaxRetries,max_retries +MaxRetryCount,max_retry_count +MaxRetryIntervalMs,max_retry_interval_ms +MaxRows,max_rows +MaxRuntimeInSeconds,max_runtime_in_seconds +MaxRuntimePerTrainingJobInSeconds,max_runtime_per_training_job_in_seconds +MaxSchemaVersion,max_schema_version +MaxScore,max_score +MaxSelectedChoices,max_selected_choices +MaxSendRate,max_send_rate +MaxSessionDuration,max_session_duration +MaxSize,max_size +MaxSlotDurationInHours,max_slot_duration_in_hours +MaxSlotsByChannel,max_slots_by_channel +MaxSpeakerLabels,max_speaker_labels +MaxStorageSize,max_storage_size +MaxStorageThroughputPerDbInstance,max_storage_throughput_per_db_instance +MaxStorageThroughputPerIops,max_storage_throughput_per_iops +MaxStorageUtilizationPercentage,max_storage_utilization_percentage +MaxSuggestionsCount,max_suggestions_count +MaxSwap,max_swap +MaxSyncBuffer,max_sync_buffer +MaxTTL,max_ttl +MaxTermDurationInDays,max_term_duration_in_days +MaxTimeToLiveInMinutes,max_time_to_live_in_minutes +MaxTimestampGapInDays,max_timestamp_gap_in_days +MaxTotalPrice,max_total_price +MaxUnits,max_units +MaxUploads,max_uploads +MaxUrlsPerMinuteCrawlRate,max_urls_per_minute_crawl_rate +MaxUserDurationInSeconds,max_user_duration_in_seconds +MaxUsers,max_users +MaxValue,max_value +MaxVersion,max_version +MaxVideoBitsPerSecond,max_video_bits_per_second +MaxVisibleColumns,max_visible_columns +MaxVisibleRows,max_visible_rows +MaxVolumeLimit,max_volume_limit +MaxWaitTimeInSeconds,max_wait_time_in_seconds +MaxWidth,max_width +MaxWorkers,max_workers +Maximum,maximum +MaximumAllowedResources,maximum_allowed_resources +MaximumAutomaticAttempts,maximum_automatic_attempts +MaximumBandwidthInMbps,maximum_bandwidth_in_mbps +MaximumBatchSize,maximum_batch_size +MaximumBatchingWindowInSeconds,maximum_batching_window_in_seconds +MaximumBitrate,maximum_bitrate +MaximumBranchesExceededException,maximum_branches_exceeded_exception +MaximumCapacityUnits,maximum_capacity_units +MaximumConcurrency,maximum_concurrency +MaximumConflictResolutionEntriesExceededException,maximum_conflict_resolution_entries_exceeded_exception +MaximumCoreCapacityUnits,maximum_core_capacity_units +MaximumDuration,maximum_duration +MaximumEfaInterfaces,maximum_efa_interfaces +MaximumEventAgeInSeconds,maximum_event_age_in_seconds +MaximumExecutionFrequency,maximum_execution_frequency +MaximumExecutionTimeoutInSeconds,maximum_execution_timeout_in_seconds +MaximumFileContentToLoadExceededException,maximum_file_content_to_load_exceeded_exception +MaximumFileEntriesExceededException,maximum_file_entries_exceeded_exception +MaximumFramerate,maximum_framerate +MaximumIndividualPlayerLatencyMilliseconds,maximum_individual_player_latency_milliseconds +MaximumInstanceCount,maximum_instance_count +MaximumIops,maximum_iops +MaximumItemsToCompareExceededException,maximum_items_to_compare_exceeded_exception +MaximumLabelType,maximum_label_type +MaximumLength,maximum_length +MaximumMinimum,maximum_minimum +MaximumMinimumComputation,maximum_minimum_computation +MaximumNetworkCards,maximum_network_cards +MaximumNetworkInterfaces,maximum_network_interfaces +MaximumNormalizedUnitsUsedPerHour,maximum_normalized_units_used_per_hour +MaximumNumberOfApprovalsExceededException,maximum_number_of_approvals_exceeded_exception +MaximumNumberOfInstancesUsedPerHour,maximum_number_of_instances_used_per_hour +MaximumNumberOfTrailsExceededException,maximum_number_of_trails_exceeded_exception +MaximumOnDemandCapacityUnits,maximum_on_demand_capacity_units +MaximumOpenPullRequestsExceededException,maximum_open_pull_requests_exceeded_exception +MaximumPartitionCount,maximum_partition_count +MaximumPercent,maximum_percent +MaximumPlayerSessionCount,maximum_player_session_count +MaximumRGBTolerance,maximum_rgb_tolerance +MaximumRecordAgeInSeconds,maximum_record_age_in_seconds +MaximumReplicationCount,maximum_replication_count +MaximumRepositoryNamesExceededException,maximum_repository_names_exceeded_exception +MaximumRepositoryTriggersExceededException,maximum_repository_triggers_exceeded_exception +MaximumResultReturnedException,maximum_result_returned_exception +MaximumRetention,maximum_retention +MaximumRetryAttempts,maximum_retry_attempts +MaximumRuleTemplatesAssociatedWithRepositoryException,maximum_rule_templates_associated_with_repository_exception +MaximumStringLength,maximum_string_length +MaximumSubChannels,maximum_sub_channels +MaximumSupportedWeightLbs,maximum_supported_weight_lbs +MaximumTTL,maximum_ttl +MaximumThroughputInMBps,maximum_throughput_in_m_bps +MaximumTraversalDepth,maximum_traversal_depth +MaximumUnits,maximum_units +MaximumValue,maximum_value +MaximumVideoBufferDelayMilliseconds,maximum_video_buffer_delay_milliseconds +MaximumWindowInMinutes,maximum_window_in_minutes +MaximumYUV,maximum_yuv +McGroupId,mc_group_id +Mcc,mcc +MccXml,mcc_xml +Md5Hash,md5_hash +MdnResponse,mdn_response +MdnSigningAlgorithm,mdn_signing_algorithm +MeanTimeToRecoverInMilliseconds,mean_time_to_recover_in_milliseconds +MeanValue,mean_value +Measure,measure +MeasureAggregationFunction,measure_aggregation_function +MeasureDataLabelStyle,measure_data_label_style +MeasureField,measure_field +MeasureFieldId,measure_field_id +MeasureForeground,measure_foreground +MeasureLabelVisibility,measure_label_visibility +MeasureLatency,measure_latency +MeasureName,measure_name +MeasureNameColumn,measure_name_column +MeasureValue,measure_value +MeasureValueType,measure_value_type +MeasureValues,measure_values +Measurement,measurement +MeasurementProcessingConfig,measurement_processing_config +Media,media +MediaCapturePipeline,media_capture_pipeline +MediaCapturePipelineSourceConfiguration,media_capture_pipeline_source_configuration +MediaCapturePipelineSummary,media_capture_pipeline_summary +MediaCapturePipelines,media_capture_pipelines +MediaConcatenationPipeline,media_concatenation_pipeline +MediaConcurrencies,media_concurrencies +MediaConcurrency,media_concurrency +MediaConnectFlow,media_connect_flow +MediaConnectFlowRequest,media_connect_flow_request +MediaConnectFlows,media_connect_flows +MediaConnectSettings,media_connect_settings +MediaEncoding,media_encoding +MediaFileUri,media_file_uri +MediaFormat,media_format +MediaInsightsConfiguration,media_insights_configuration +MediaInsightsPipeline,media_insights_pipeline +MediaInsightsPipelineConfiguration,media_insights_pipeline_configuration +MediaInsightsPipelineConfigurationArn,media_insights_pipeline_configuration_arn +MediaInsightsPipelineConfigurationElement,media_insights_pipeline_configuration_element +MediaInsightsPipelineConfigurationId,media_insights_pipeline_configuration_id +MediaInsightsPipelineConfigurationName,media_insights_pipeline_configuration_name +MediaInsightsPipelineConfigurationSummary,media_insights_pipeline_configuration_summary +MediaInsightsPipelineConfigurations,media_insights_pipeline_configurations +MediaInsightsPipelineElementStatus,media_insights_pipeline_element_status +MediaInsightsRuntimeMetadata,media_insights_runtime_metadata +MediaLiveConnectorPipeline,media_live_connector_pipeline +MediaLiveInputArn,media_live_input_arn +MediaPackageGroupSettings,media_package_group_settings +MediaPackageOutputDestinationSettings,media_package_output_destination_settings +MediaPackageOutputSettings,media_package_output_settings +MediaPackageSettings,media_package_settings +MediaPipeline,media_pipeline +MediaPipelineArn,media_pipeline_arn +MediaPipelineId,media_pipeline_id +MediaPipelineSummary,media_pipeline_summary +MediaPipelines,media_pipelines +MediaPlacement,media_placement +MediaRegion,media_region +MediaSampleRate,media_sample_rate +MediaSampleRateHertz,media_sample_rate_hertz +MediaSourceConfig,media_source_config +MediaStorageConfiguration,media_storage_configuration +MediaStoreStorageClass,media_store_storage_class +MediaStream,media_stream +MediaStreamAttributes,media_stream_attributes +MediaStreamAttributesRequest,media_stream_attributes_request +MediaStreamId,media_stream_id +MediaStreamName,media_stream_name +MediaStreamOutputConfiguration,media_stream_output_configuration +MediaStreamOutputConfigurationRequest,media_stream_output_configuration_request +MediaStreamOutputConfigurations,media_stream_output_configurations +MediaStreamPipeline,media_stream_pipeline +MediaStreamSink,media_stream_sink +MediaStreamSource,media_stream_source +MediaStreamSourceConfiguration,media_stream_source_configuration +MediaStreamSourceConfigurationRequest,media_stream_source_configuration_request +MediaStreamSourceConfigurations,media_stream_source_configurations +MediaStreamType,media_stream_type +MediaStreams,media_streams +MediaType,media_type +MediaUriSecretArn,media_uri_secret_arn +MediaUriType,media_uri_type +MediaUrl,media_url +MediaconnectSettings,mediaconnect_settings +MedialiveInputArns,medialive_input_arns +MedianRuntimeSeconds,median_runtime_seconds +MedicalAlternative,medical_alternative +MedicalEntity,medical_entity +MedicalItem,medical_item +MedicalResult,medical_result +MedicalTranscript,medical_transcript +MedicalTranscriptEvent,medical_transcript_event +MedicalTranscriptionJob,medical_transcription_job +MedicalTranscriptionJobName,medical_transcription_job_name +MedicalTranscriptionJobSummaries,medical_transcription_job_summaries +MedicalTranscriptionJobSummary,medical_transcription_job_summary +MedicalTranscriptionSetting,medical_transcription_setting +MediumAction,medium_action +MediumChangerType,medium_changer_type +MediumCount,medium_count +Meeting,meeting +MeetingArn,meeting_arn +MeetingEvents,meeting_events +MeetingEventsConcatenationConfiguration,meeting_events_concatenation_configuration +MeetingFeatures,meeting_features +MeetingFeaturesConfiguration,meeting_features_configuration +MeetingHostId,meeting_host_id +MeetingId,meeting_id +MeetingNotificationConfiguration,meeting_notification_configuration +MeetingRoomConfiguration,meeting_room_configuration +MeetingSetting,meeting_setting +Meetings,meetings +Member,member +MemberAccount,member_account +MemberAccountEc2DeepInspectionStatus,member_account_ec2_deep_inspection_status +MemberAccountEc2DeepInspectionStatusState,member_account_ec2_deep_inspection_status_state +MemberAccountId,member_account_id +MemberAccountIds,member_account_ids +MemberAccountLimitReached,member_account_limit_reached +MemberAccountRuleStatus,member_account_rule_status +MemberAccountStatus,member_account_status +MemberAccounts,member_accounts +MemberAdditionalConfiguration,member_additional_configuration +MemberAdditionalConfigurationResult,member_additional_configuration_result +MemberArn,member_arn +MemberArns,member_arns +MemberClusters,member_clusters +MemberClustersOutpostArns,member_clusters_outpost_arns +MemberConfiguration,member_configuration +MemberDataSourceConfiguration,member_data_source_configuration +MemberDataSourceConfigurations,member_data_source_configurations +MemberDatasources,member_datasources +MemberDefinition,member_definition +MemberDefinitions,member_definitions +MemberDetail,member_detail +MemberDetails,member_details +MemberError,member_error +MemberFabricAttributes,member_fabric_attributes +MemberFabricConfiguration,member_fabric_configuration +MemberFabricLogPublishingConfiguration,member_fabric_log_publishing_configuration +MemberFeaturesConfiguration,member_features_configuration +MemberFeaturesConfigurationResult,member_features_configuration_result +MemberFrameworkAttributes,member_framework_attributes +MemberFrameworkConfiguration,member_framework_configuration +MemberGroup,member_group +MemberGroups,member_groups +MemberId,member_id +MemberIdArnPair,member_id_arn_pair +MemberLogPublishingConfiguration,member_log_publishing_configuration +MemberName,member_name +MemberOfServiceLinkedResourceGroup,member_of_service_linked_resource_group +MemberSpecification,member_specification +MemberStatus,member_status +MemberSummary,member_summary +MemberType,member_type +MemberUser,member_user +MemberUsers,member_users +Members,members +Membership,membership +MembershipCount,membership_count +MembershipDatasources,membership_datasources +MembershipExists,membership_exists +MembershipId,membership_id +MembershipItem,membership_item +MembershipItemList,membership_item_list +MembershipProtectedQueryResultConfiguration,membership_protected_query_result_configuration +MembershipSummary,membership_summary +Memory,memory +MemoryDuration,memory_duration +MemoryGB,memory_gb +MemoryGiBPerVCpu,memory_gib_per_v_cpu +MemoryGiBPerVCpuRequest,memory_gib_per_v_cpu_request +MemoryInMB,memory_in_mb +MemoryInfo,memory_info +MemoryLimitExceededException,memory_limit_exceeded_exception +MemoryMiB,memory_mib +MemoryMiBRequest,memory_mib_request +MemoryRegions,memory_regions +MemoryReservation,memory_reservation +MemorySize,memory_size +MemorySizeConfiguration,memory_size_configuration +MemorySizeInMB,memory_size_in_mb +MemoryStore,memory_store +MemoryStoreRetentionPeriodInHours,memory_store_retention_period_in_hours +MemoryThreshold,memory_threshold +MemoryUtilization,memory_utilization +MentionSentiment,mention_sentiment +Mentions,mentions +Merge,merge +MergeAction,merge_action +MergeBaseCommit,merge_base_commit +MergeBranchesByFastForwardInput,merge_branches_by_fast_forward_input +MergeBranchesByFastForwardOutput,merge_branches_by_fast_forward_output +MergeBranchesBySquashInput,merge_branches_by_squash_input +MergeBranchesBySquashOutput,merge_branches_by_squash_output +MergeBranchesByThreeWayInput,merge_branches_by_three_way_input +MergeBranchesByThreeWayOutput,merge_branches_by_three_way_output +MergeClause,merge_clause +MergeDeveloperIdentitiesInput,merge_developer_identities_input +MergeDeveloperIdentitiesResponse,merge_developer_identities_response +MergeHunk,merge_hunk +MergeHunkDetail,merge_hunk_detail +MergeMetadata,merge_metadata +MergeOperations,merge_operations +MergeOptionRequiredException,merge_option_required_exception +MergePolicy,merge_policy +MergeProfilesRequest,merge_profiles_request +MergeProfilesResponse,merge_profiles_response +MergePullRequestByFastForwardInput,merge_pull_request_by_fast_forward_input +MergePullRequestByFastForwardOutput,merge_pull_request_by_fast_forward_output +MergePullRequestBySquashInput,merge_pull_request_by_squash_input +MergePullRequestBySquashOutput,merge_pull_request_by_squash_output +MergePullRequestByThreeWayInput,merge_pull_request_by_three_way_input +MergePullRequestByThreeWayOutput,merge_pull_request_by_three_way_output +MergeShardsInput,merge_shards_input +MergeStrategy,merge_strategy +MergeWhenMatched,merge_when_matched +MergeWhenNotMatched,merge_when_not_matched +MergedDatasetNames,merged_dataset_names +MeshData,mesh_data +MeshRef,mesh_ref +MeshServiceDiscovery,mesh_service_discovery +MeshSpec,mesh_spec +MeshStatus,mesh_status +Message,message +MessageAction,message_action +MessageActivity,message_activity +MessageAttributeNames,message_attribute_names +MessageAttributeValue,message_attribute_value +MessageAttributes,message_attributes +MessageBody,message_body +MessageBodyTextType,message_body_text_type +MessageConfig,message_config +MessageConfiguration,message_configuration +MessageData,message_data +MessageDeduplicationId,message_deduplication_id +MessageDeliveryStatus,message_delivery_status +MessageDeliveryStatusEventConfiguration,message_delivery_status_event_configuration +MessageDeliveryStatusResourceTypeEventConfiguration,message_delivery_status_resource_type_event_configuration +MessageDetail,message_detail +MessageDsn,message_dsn +MessageFieldMappings,message_field_mappings +MessageFormat,message_format +MessageFrozen,message_frozen +MessageGroup,message_group +MessageGroupId,message_group_id +MessageId,message_id +MessageInsightsDataSource,message_insights_data_source +MessageInsightsFilters,message_insights_filters +MessageMaxBytes,message_max_bytes +MessageMetadata,message_metadata +MessagePayload,message_payload +MessagePrefix,message_prefix +MessageRejected,message_rejected +MessageRequest,message_request +MessageResponse,message_response +MessageResult,message_result +MessageReviewHandler,message_review_handler +MessageStructure,message_structure +MessageSubject,message_subject +MessageSystemAttributeValue,message_system_attribute_value +MessageSystemAttributes,message_system_attributes +MessageTag,message_tag +MessageTemplateType,message_template_type +MessageText,message_text +MessageTtlSeconds,message_ttl_seconds +MessageType,message_type +MessageTypes,message_types +Messages,messages +MessagesPerSecond,messages_per_second +MessagingSessionEndpoint,messaging_session_endpoint +MetaData,meta_data +MetaDataKey,meta_data_key +MetaDataValue,meta_data_value +Metadata,metadata +Metadata3,metadata3 +Metadata4,metadata4 +Metadata5,metadata5 +Metadata6,metadata6 +Metadata7,metadata7 +Metadata8,metadata8 +MetadataBlob,metadata_blob +MetadataBlobChecksum,metadata_blob_checksum +MetadataBlobChecksumAlgorithm,metadata_blob_checksum_algorithm +MetadataBlobLength,metadata_blob_length +MetadataCatalogConfig,metadata_catalog_config +MetadataCatalogDetail,metadata_catalog_detail +MetadataConfiguration,metadata_configuration +MetadataContent,metadata_content +MetadataControl,metadata_control +MetadataDestination,metadata_destination +MetadataDirective,metadata_directive +MetadataEntry,metadata_entry +MetadataException,metadata_exception +MetadataInfo,metadata_info +MetadataInfoMap,metadata_info_map +MetadataKey,metadata_key +MetadataKeyValue,metadata_key_value +MetadataKeyValuePair,metadata_key_value_pair +MetadataList,metadata_list +MetadataOperation,metadata_operation +MetadataOptions,metadata_options +MetadataProperties,metadata_properties +MetadataString,metadata_string +MetadataToUpdate,metadata_to_update +MetadataValue,metadata_value +MeterUsageRequest,meter_usage_request +MeterUsageResult,meter_usage_result +MeteredLinesOfCodeCount,metered_lines_of_code_count +MeteringMode,metering_mode +MeteringProfileCount,metering_profile_count +MeteringRecordId,metering_record_id +Method,method +MethodName,method_name +MethodNotAllowedException,method_not_allowed_exception +MethodResponse,method_response +MethodSetting,method_setting +MethodSettings,method_settings +MethodSnapshot,method_snapshot +Methods,methods +Metric,metric +MetricAggregationType,metric_aggregation_type +MetricAlarm,metric_alarm +MetricAlarms,metric_alarms +MetricAttribute,metric_attribute +MetricAttribution,metric_attribution +MetricAttributionOutput,metric_attribution_output +MetricAttributionSummary,metric_attribution_summary +MetricCollectionType,metric_collection_type +MetricComparison,metric_comparison +MetricComparisonComputation,metric_comparison_computation +MetricData,metric_data +MetricDataError,metric_data_error +MetricDataPoint,metric_data_point +MetricDataQueries,metric_data_queries +MetricDataQuery,metric_data_query +MetricDataResult,metric_data_result +MetricDataResults,metric_data_results +MetricDataSummary,metric_data_summary +MetricDataV2,metric_data_v2 +MetricDatapoint,metric_datapoint +MetricDatapoints,metric_datapoints +MetricDatum,metric_datum +MetricDefinition,metric_definition +MetricDefinitionConfig,metric_definition_config +MetricDefinitionId,metric_definition_id +MetricDefinitionIds,metric_definition_ids +MetricDefinitionRequest,metric_definition_request +MetricDefinitions,metric_definitions +MetricDescription,metric_description +MetricDestinationSummary,metric_destination_summary +MetricDimension,metric_dimension +MetricDimensionGroups,metric_dimension_groups +MetricDimensions,metric_dimensions +MetricDisplayName,metric_display_name +MetricFilter,metric_filter +MetricFilterKey,metric_filter_key +MetricFilterMatchRecord,metric_filter_match_record +MetricFilterV2,metric_filter_v2 +MetricFilterValues,metric_filter_values +MetricFilters,metric_filters +MetricGoal,metric_goal +MetricGoalConfig,metric_goal_config +MetricGranularityType,metric_granularity_type +MetricGroups,metric_groups +MetricHeaderCellStyle,metric_header_cell_style +MetricIndex,metric_index +MetricInfo,metric_info +MetricIntervalLowerBound,metric_interval_lower_bound +MetricIntervalUpperBound,metric_interval_upper_bound +MetricKeyDataPoints,metric_key_data_points +MetricLevelImpact,metric_level_impact +MetricLevelImpactList,metric_level_impact_list +MetricList,metric_list +MetricMathAnomalyDetector,metric_math_anomaly_detector +MetricMonitor,metric_monitor +MetricMonitorConfig,metric_monitor_config +MetricName,metric_name +MetricNames,metric_names +MetricNamespace,metric_namespace +MetricPlacement,metric_placement +MetricPoint,metric_point +MetricPoints,metric_points +MetricPolicy,metric_policy +MetricPolicyRule,metric_policy_rule +MetricPolicyRules,metric_policy_rules +MetricProcessingConfig,metric_processing_config +MetricQueries,metric_queries +MetricQuery,metric_query +MetricResult,metric_result +MetricResultV2,metric_result_v2 +MetricResults,metric_results +MetricSetArn,metric_set_arn +MetricSetDataQualityMetric,metric_set_data_quality_metric +MetricSetDataQualityMetricList,metric_set_data_quality_metric_list +MetricSetDescription,metric_set_description +MetricSetDimensionFilter,metric_set_dimension_filter +MetricSetFrequency,metric_set_frequency +MetricSetName,metric_set_name +MetricSetSummary,metric_set_summary +MetricSetSummaryList,metric_set_summary_list +MetricSource,metric_source +MetricSpecification,metric_specification +MetricSpecifications,metric_specifications +MetricStat,metric_stat +MetricStatisticRecommendation,metric_statistic_recommendation +MetricStreamEntry,metric_stream_entry +MetricStreamFilter,metric_stream_filter +MetricStreamStatisticsConfiguration,metric_stream_statistics_configuration +MetricStreamStatisticsMetric,metric_stream_statistics_metric +MetricTimezone,metric_timezone +MetricToRetain,metric_to_retain +MetricTransformation,metric_transformation +MetricType,metric_type +MetricTypes,metric_types +MetricV2,metric_v2 +MetricValue,metric_value +MetricValueList,metric_value_list +MetricWidget,metric_widget +MetricWidgetImage,metric_widget_image +MetricWindow,metric_window +Metrics,metrics +MetricsAnalyzed,metrics_analyzed +MetricsAndOperator,metrics_and_operator +MetricsConfiguration,metrics_configuration +MetricsConfigurationList,metrics_configuration_list +MetricsDataSource,metrics_data_source +MetricsEnabled,metrics_enabled +MetricsLevel,metrics_level +MetricsLevelUpdate,metrics_level_update +MetricsOverLookbackPeriod,metrics_over_lookback_period +MetricsSource,metrics_source +MetricsSummary,metrics_summary +Metro,metro +Mfa,mfa +MfaAuthenticated,mfa_authenticated +MfaConfiguration,mfa_configuration +MfaEmail,mfa_email +MfaTypes,mfa_types +MicroF1Score,micro_f1_score +MicroPrecision,micro_precision +MicroRecall,micro_recall +MicrosoftSQLServerCatalogSource,microsoft_sql_server_catalog_source +MicrosoftSQLServerCatalogTarget,microsoft_sql_server_catalog_target +MicrosoftSQLServerSettings,microsoft_sql_server_settings +MicrosoftSqlServerDataProviderSettings,microsoft_sql_server_data_provider_settings +MiddleName,middle_name +MigrateWorkspaceRequest,migrate_workspace_request +MigrateWorkspaceResult,migrate_workspace_result +MigrationAdmin,migration_admin +MigrationAlert,migration_alert +MigrationErrorReason,migration_error_reason +MigrationErrorType,migration_error_type +MigrationProject,migration_project +MigrationProjectArn,migration_project_arn +MigrationProjectCreationTime,migration_project_creation_time +MigrationProjectIdentifier,migration_project_identifier +MigrationProjectName,migration_project_name +MigrationProjects,migration_projects +MigrationSummary,migration_summary +MigrationTask,migration_task +MigrationTaskName,migration_task_name +MigrationTaskSummary,migration_task_summary +MigrationTaskSummaryList,migration_task_summary_list +MigrationType,migration_type +MigrationWorkflowSummary,migration_workflow_summary +Milestone,milestone +MilestoneName,milestone_name +MilestoneNumber,milestone_number +MilestoneSummaries,milestone_summaries +MilestoneSummary,milestone_summary +MillisBehindLatest,millis_behind_latest +MimeType,mime_type +Min,min +MinAbrBitrate,min_abr_bitrate +MinAdjustmentMagnitude,min_adjustment_magnitude +MinAdjustmentStep,min_adjustment_step +MinAllocatedStorage,min_allocated_storage +MinAllowedConfidenceScoreForMerging,min_allowed_confidence_score_for_merging +MinBottomRenditionSize,min_bottom_rendition_size +MinBoundingBoxHeight,min_bounding_box_height +MinBoundingBoxWidth,min_bounding_box_width +MinBufferTime,min_buffer_time +MinBufferTimeSeconds,min_buffer_time_seconds +MinCapacity,min_capacity +MinCapacityUnits,min_capacity_units +MinConfidence,min_confidence +MinCount,min_count +MinCoveragePercentage,min_coverage_percentage +MinDuration,min_duration +MinEbpInterval,min_ebp_interval +MinFinalSegmentLength,min_final_segment_length +MinGwDiversity,min_gw_diversity +MinHealthyPercentage,min_healthy_percentage +MinIInterval,min_i_interval +MinInferenceUnits,min_inference_units +MinInvocationsPerMinute,min_invocations_per_minute +MinIopsPerDbInstance,min_iops_per_db_instance +MinIopsPerGib,min_iops_per_gib +MinLatency,min_latency +MinLength,min_length +MinLuminance,min_luminance +MinMax,min_max +MinMaxGradient,min_max_gradient +MinModelVersion,min_model_version +MinPartitions,min_partitions +MinPauseBetweenCheckpoints,min_pause_between_checkpoints +MinPauseBetweenCheckpointsUpdate,min_pause_between_checkpoints_update +MinRange,min_range +MinResource,min_resource +MinRetentionDays,min_retention_days +MinSegmentConfidence,min_segment_confidence +MinSegmentLength,min_segment_length +MinSelectedChoices,min_selected_choices +MinSize,min_size +MinSlotDurationInHours,min_slot_duration_in_hours +MinStorageBytesPercentage,min_storage_bytes_percentage +MinStorageSize,min_storage_size +MinStorageThroughputPerDbInstance,min_storage_throughput_per_db_instance +MinStorageThroughputPerIops,min_storage_throughput_per_iops +MinTTL,min_ttl +MinTargetCapacity,min_target_capacity +MinTermDurationInDays,min_term_duration_in_days +MinTopRenditionSize,min_top_rendition_size +MinTrafficImpact,min_traffic_impact +MinUnits,min_units +MinUpdatePeriodSeconds,min_update_period_seconds +MinValue,min_value +MinVersion,min_version +MinVideoBitsPerSecond,min_video_bits_per_second +MinWorkers,min_workers +MinimalKeyLength,minimal_key_length +Minimum,minimum +MinimumBitrate,minimum_bitrate +MinimumCapacityUnits,minimum_capacity_units +MinimumCompressionSize,minimum_compression_size +MinimumEngineVersion,minimum_engine_version +MinimumEngineVersionPerAllowedValue,minimum_engine_version_per_allowed_value +MinimumGranularity,minimum_granularity +MinimumHealthyHosts,minimum_healthy_hosts +MinimumHealthyPercent,minimum_healthy_percent +MinimumInstanceCount,minimum_instance_count +MinimumInstanceMetadataServiceVersion,minimum_instance_metadata_service_version +MinimumLabelType,minimum_label_type +MinimumLength,minimum_length +MinimumMembershipPercentage,minimum_membership_percentage +MinimumNormalizedUnitsUsedPerHour,minimum_normalized_units_used_per_hour +MinimumNumTapes,minimum_num_tapes +MinimumNumberOfInstancesUsedPerHour,minimum_number_of_instances_used_per_hour +MinimumNumberOfQueryingUsers,minimum_number_of_querying_users +MinimumPasswordLength,minimum_password_length +MinimumProtocolVersion,minimum_protocol_version +MinimumQueryCount,minimum_query_count +MinimumRGBTolerance,minimum_rgb_tolerance +MinimumRequiredMinorEngineVersion,minimum_required_minor_engine_version +MinimumRetention,minimum_retention +MinimumUnits,minimum_units +MinimumValue,minimum_value +MinimumYUV,minimum_yuv +MinorRevision,minor_revision +MinorVersion,minor_version +MinuteOfHour,minute_of_hour +Minutes,minutes +MissingAuthenticationToken,missing_authentication_token +MissingBlueprints,missing_blueprints +MissingBody,missing_body +MissingCodecPrivateDataException,missing_codec_private_data_exception +MissingCompleteSensorData,missing_complete_sensor_data +MissingComponent,missing_component +MissingContextValues,missing_context_values +MissingCount,missing_count +MissingDataConfiguration,missing_data_configuration +MissingDataConfigurations,missing_data_configurations +MissingDateVisibility,missing_date_visibility +MissingFileCacheConfiguration,missing_file_cache_configuration +MissingFileSystemConfiguration,missing_file_system_configuration +MissingMeta,missing_meta +MissingOnRds,missing_on_rds +MissingParameterException,missing_parameter_exception +MissingParameterValueException,missing_parameter_value_exception +MissingPercentage,missing_percentage +MissingRenderingAttributeException,missing_rendering_attribute_exception +MissingRequiredParameter,missing_required_parameter +MissingRequiredParameterException,missing_required_parameter_exception +MissingSensorData,missing_sensor_data +MissingValues,missing_values +MissingVersionException,missing_version_exception +MissingVolumeConfiguration,missing_volume_configuration +MissingWorkflows,missing_workflows +MissionProfileIdResponse,mission_profile_id_response +MissionProfileListItem,mission_profile_list_item +Mitigation,mitigation +MitigationAction,mitigation_action +MitigationActionIdentifier,mitigation_action_identifier +MitigationActionParams,mitigation_action_params +MitigationName,mitigation_name +Mitigations,mitigations +Mixed,mixed +MixedInstancesPolicy,mixed_instances_policy +MixedMeasureMapping,mixed_measure_mapping +MixedMeasureMappings,mixed_measure_mappings +MlConfigDefinition,ml_config_definition +MlResourceDefinition,ml_resource_definition +MlUserDataEncryption,ml_user_data_encryption +MlUserDataEncryptionMode,ml_user_data_encryption_mode +Mnc,mnc +Mobile,mobile +MobileDeviceAccessMatchedRule,mobile_device_access_matched_rule +MobileDeviceAccessOverride,mobile_device_access_override +MobileDeviceAccessRule,mobile_device_access_rule +MobileDeviceAccessRuleId,mobile_device_access_rule_id +MobilePhoneNumber,mobile_phone_number +MobileSdkRelease,mobile_sdk_release +Mode,mode +ModeBlock,mode_block +Model,model +ModelApprovalStatus,model_approval_status +ModelArn,model_arn +ModelArtifact,model_artifact +ModelArtifacts,model_artifacts +ModelBiasAppSpecification,model_bias_app_specification +ModelBiasBaselineConfig,model_bias_baseline_config +ModelBiasJobInput,model_bias_job_input +ModelBiasJobOutputConfig,model_bias_job_output_config +ModelCacheSetting,model_cache_setting +ModelCard,model_card +ModelCardArn,model_card_arn +ModelCardExportArtifacts,model_card_export_artifacts +ModelCardExportJobArn,model_card_export_job_arn +ModelCardExportJobName,model_card_export_job_name +ModelCardExportJobNameContains,model_card_export_job_name_contains +ModelCardExportJobSummaries,model_card_export_job_summaries +ModelCardExportJobSummary,model_card_export_job_summary +ModelCardExportOutputConfig,model_card_export_output_config +ModelCardName,model_card_name +ModelCardProcessingStatus,model_card_processing_status +ModelCardSecurityConfig,model_card_security_config +ModelCardStatus,model_card_status +ModelCardSummaries,model_card_summaries +ModelCardSummary,model_card_summary +ModelCardVersion,model_card_version +ModelCardVersionSummary,model_card_version_summary +ModelCardVersionSummaryList,model_card_version_summary_list +ModelClientConfig,model_client_config +ModelConfigs,model_configs +ModelConfiguration,model_configuration +ModelCustomizationJobSummary,model_customization_job_summary +ModelDashboardEndpoint,model_dashboard_endpoint +ModelDashboardIndicator,model_dashboard_indicator +ModelDashboardIndicatorAction,model_dashboard_indicator_action +ModelDashboardModel,model_dashboard_model +ModelDashboardModelCard,model_dashboard_model_card +ModelDashboardMonitoringSchedule,model_dashboard_monitoring_schedule +ModelDataDownloadTimeoutInSeconds,model_data_download_timeout_in_seconds +ModelDataQuality,model_data_quality +ModelDataSource,model_data_source +ModelDataUrl,model_data_url +ModelDeployConfig,model_deploy_config +ModelDeployResult,model_deploy_result +ModelDescription,model_description +ModelDigests,model_digests +ModelEndpointDataBlob,model_endpoint_data_blob +ModelError,model_error +ModelErrorException,model_error_exception +ModelExplainabilityAppSpecification,model_explainability_app_specification +ModelExplainabilityBaselineConfig,model_explainability_baseline_config +ModelExplainabilityJobInput,model_explainability_job_input +ModelExplainabilityJobOutputConfig,model_explainability_job_output_config +ModelHandle,model_handle +ModelId,model_id +ModelInfrastructureConfig,model_infrastructure_config +ModelInput,model_input +ModelInputConfiguration,model_input_configuration +ModelInsights,model_insights +ModelIntrospectionSchema,model_introspection_schema +ModelKmsKeyId,model_kms_key_id +ModelLatency,model_latency +ModelLatencyThreshold,model_latency_threshold +ModelLatencyThresholds,model_latency_thresholds +ModelManifestSummary,model_manifest_summary +ModelMetadata,model_metadata +ModelMetadataFilter,model_metadata_filter +ModelMetadataSearchExpression,model_metadata_search_expression +ModelMetadataSummaries,model_metadata_summaries +ModelMetadataSummary,model_metadata_summary +ModelMetrics,model_metrics +ModelName,model_name +ModelNameBeginsWith,model_name_begins_with +ModelNameContains,model_name_contains +ModelNameEquals,model_name_equals +ModelNotReadyException,model_not_ready_exception +ModelOutputConfiguration,model_output_configuration +ModelPackage,model_package +ModelPackageArn,model_package_arn +ModelPackageArnList,model_package_arn_list +ModelPackageContainerDefinition,model_package_container_definition +ModelPackageDescription,model_package_description +ModelPackageGroup,model_package_group +ModelPackageGroupArn,model_package_group_arn +ModelPackageGroupDescription,model_package_group_description +ModelPackageGroupName,model_package_group_name +ModelPackageGroupStatus,model_package_group_status +ModelPackageGroupSummary,model_package_group_summary +ModelPackageGroupSummaryList,model_package_group_summary_list +ModelPackageName,model_package_name +ModelPackageStatus,model_package_status +ModelPackageStatusDetails,model_package_status_details +ModelPackageStatusItem,model_package_status_item +ModelPackageSummaries,model_package_summaries +ModelPackageSummary,model_package_summary +ModelPackageSummaryList,model_package_summary_list +ModelPackageType,model_package_type +ModelPackageValidationProfile,model_package_validation_profile +ModelPackageValidationSpecification,model_package_validation_specification +ModelPackageVersion,model_package_version +ModelPackageVersionArn,model_package_version_arn +ModelPackageVersionArnEquals,model_package_version_arn_equals +ModelPackagingConfiguration,model_packaging_configuration +ModelPackagingDescription,model_packaging_description +ModelPackagingJobDescription,model_packaging_job_description +ModelPackagingJobMetadata,model_packaging_job_metadata +ModelPackagingJobs,model_packaging_jobs +ModelPackagingMethod,model_packaging_method +ModelPackagingOutputDetails,model_packaging_output_details +ModelPerformance,model_performance +ModelPolicy,model_policy +ModelQuality,model_quality +ModelQualityAppSpecification,model_quality_app_specification +ModelQualityBaselineConfig,model_quality_baseline_config +ModelQualityJobInput,model_quality_job_input +ModelQualityJobOutputConfig,model_quality_job_output_config +ModelRegisterSettings,model_register_settings +ModelScores,model_scores +ModelSelectionExpression,model_selection_expression +ModelSettings,model_settings +ModelSetupTime,model_setup_time +ModelSignature,model_signature +ModelStats,model_stats +ModelStatus,model_status +ModelStepMetadata,model_step_metadata +ModelStreamError,model_stream_error +ModelStreamErrorException,model_stream_error_exception +ModelSummaries,model_summaries +ModelSummary,model_summary +ModelTimeoutException,model_timeout_exception +ModelType,model_type +ModelVariantActions,model_variant_actions +ModelVariantConfig,model_variant_config +ModelVariantConfigSummary,model_variant_config_summary +ModelVariants,model_variants +ModelVersion,model_version +ModelVersionActivatedAt,model_version_activated_at +ModelVersionArn,model_version_arn +ModelVersionDetail,model_version_detail +ModelVersionEvaluation,model_version_evaluation +ModelVersionSummaries,model_version_summaries +ModelVersionSummary,model_version_summary +Models,models +ModerationLabel,moderation_label +ModerationLabels,moderation_labels +ModerationModelVersion,moderation_model_version +Moderator,moderator +ModeratorArns,moderator_arns +ModificationResults,modification_results +ModificationState,modification_state +ModificationStates,modification_states +ModificationTime,modification_time +Modifications,modifications +ModifiedAfter,modified_after +ModifiedAt,modified_at +ModifiedBefore,modified_before +ModifiedDate,modified_date +ModifiedRange,modified_range +ModifiedSinceConstraint,modified_since_constraint +ModifiedTimeAfter,modified_time_after +ModifiedTimeBefore,modified_time_before +ModifiedTimestamp,modified_timestamp +ModifierPercentage,modifier_percentage +ModifyAccountRequest,modify_account_request +ModifyActivityStreamRequest,modify_activity_stream_request +ModifyActivityStreamResponse,modify_activity_stream_response +ModifyAddressAttributeRequest,modify_address_attribute_request +ModifyAddressAttributeResult,modify_address_attribute_result +ModifyAquaInputMessage,modify_aqua_input_message +ModifyAquaOutputMessage,modify_aqua_output_message +ModifyAuthenticationProfileMessage,modify_authentication_profile_message +ModifyAuthenticationProfileResult,modify_authentication_profile_result +ModifyAvailabilityZoneGroupRequest,modify_availability_zone_group_request +ModifyAvailabilityZoneGroupResult,modify_availability_zone_group_result +ModifyBackupAttributesRequest,modify_backup_attributes_request +ModifyBackupAttributesResponse,modify_backup_attributes_response +ModifyCacheClusterMessage,modify_cache_cluster_message +ModifyCacheClusterResult,modify_cache_cluster_result +ModifyCacheParameterGroupMessage,modify_cache_parameter_group_message +ModifyCacheSubnetGroupMessage,modify_cache_subnet_group_message +ModifyCacheSubnetGroupResult,modify_cache_subnet_group_result +ModifyCapacityReservationFleetRequest,modify_capacity_reservation_fleet_request +ModifyCapacityReservationFleetResult,modify_capacity_reservation_fleet_result +ModifyCapacityReservationRequest,modify_capacity_reservation_request +ModifyCapacityReservationResult,modify_capacity_reservation_result +ModifyCertificateBasedAuthPropertiesRequest,modify_certificate_based_auth_properties_request +ModifyCertificatesMessage,modify_certificates_message +ModifyCertificatesResult,modify_certificates_result +ModifyClientPropertiesRequest,modify_client_properties_request +ModifyClientVpnEndpointRequest,modify_client_vpn_endpoint_request +ModifyClientVpnEndpointResult,modify_client_vpn_endpoint_result +ModifyClusterDbRevisionMessage,modify_cluster_db_revision_message +ModifyClusterDbRevisionResult,modify_cluster_db_revision_result +ModifyClusterIamRolesMessage,modify_cluster_iam_roles_message +ModifyClusterIamRolesResult,modify_cluster_iam_roles_result +ModifyClusterInput,modify_cluster_input +ModifyClusterMaintenanceMessage,modify_cluster_maintenance_message +ModifyClusterMaintenanceResult,modify_cluster_maintenance_result +ModifyClusterMessage,modify_cluster_message +ModifyClusterOutput,modify_cluster_output +ModifyClusterParameterGroupMessage,modify_cluster_parameter_group_message +ModifyClusterRequest,modify_cluster_request +ModifyClusterResponse,modify_cluster_response +ModifyClusterResult,modify_cluster_result +ModifyClusterSnapshotMessage,modify_cluster_snapshot_message +ModifyClusterSnapshotResult,modify_cluster_snapshot_result +ModifyClusterSnapshotScheduleMessage,modify_cluster_snapshot_schedule_message +ModifyClusterSubnetGroupMessage,modify_cluster_subnet_group_message +ModifyClusterSubnetGroupResult,modify_cluster_subnet_group_result +ModifyConversionConfigurationMessage,modify_conversion_configuration_message +ModifyConversionConfigurationResponse,modify_conversion_configuration_response +ModifyCurrentDBClusterCapacityMessage,modify_current_db_cluster_capacity_message +ModifyCustomDBEngineVersionMessage,modify_custom_db_engine_version_message +ModifyCustomDomainAssociationMessage,modify_custom_domain_association_message +ModifyCustomDomainAssociationResult,modify_custom_domain_association_result +ModifyDBClusterEndpointMessage,modify_db_cluster_endpoint_message +ModifyDBClusterEndpointOutput,modify_db_cluster_endpoint_output +ModifyDBClusterMessage,modify_db_cluster_message +ModifyDBClusterParameterGroupMessage,modify_db_cluster_parameter_group_message +ModifyDBClusterResult,modify_db_cluster_result +ModifyDBClusterSnapshotAttributeMessage,modify_db_cluster_snapshot_attribute_message +ModifyDBClusterSnapshotAttributeResult,modify_db_cluster_snapshot_attribute_result +ModifyDBInstanceMessage,modify_db_instance_message +ModifyDBInstanceResult,modify_db_instance_result +ModifyDBParameterGroupMessage,modify_db_parameter_group_message +ModifyDBProxyEndpointRequest,modify_db_proxy_endpoint_request +ModifyDBProxyEndpointResponse,modify_db_proxy_endpoint_response +ModifyDBProxyRequest,modify_db_proxy_request +ModifyDBProxyResponse,modify_db_proxy_response +ModifyDBProxyTargetGroupRequest,modify_db_proxy_target_group_request +ModifyDBProxyTargetGroupResponse,modify_db_proxy_target_group_response +ModifyDBSnapshotAttributeMessage,modify_db_snapshot_attribute_message +ModifyDBSnapshotAttributeResult,modify_db_snapshot_attribute_result +ModifyDBSnapshotMessage,modify_db_snapshot_message +ModifyDBSnapshotResult,modify_db_snapshot_result +ModifyDBSubnetGroupMessage,modify_db_subnet_group_message +ModifyDBSubnetGroupResult,modify_db_subnet_group_result +ModifyDataProviderMessage,modify_data_provider_message +ModifyDataProviderResponse,modify_data_provider_response +ModifyDefaultCreditSpecificationRequest,modify_default_credit_specification_request +ModifyDefaultCreditSpecificationResult,modify_default_credit_specification_result +ModifyDocumentPermissionRequest,modify_document_permission_request +ModifyEbsDefaultKmsKeyIdRequest,modify_ebs_default_kms_key_id_request +ModifyEbsDefaultKmsKeyIdResult,modify_ebs_default_kms_key_id_result +ModifyEndpointAccessMessage,modify_endpoint_access_message +ModifyEndpointMessage,modify_endpoint_message +ModifyEndpointResponse,modify_endpoint_response +ModifyEventSubscriptionMessage,modify_event_subscription_message +ModifyEventSubscriptionResponse,modify_event_subscription_response +ModifyEventSubscriptionResult,modify_event_subscription_result +ModifyFleetRequest,modify_fleet_request +ModifyFleetResult,modify_fleet_result +ModifyFpgaImageAttributeRequest,modify_fpga_image_attribute_request +ModifyFpgaImageAttributeResult,modify_fpga_image_attribute_result +ModifyGlobalClusterMessage,modify_global_cluster_message +ModifyGlobalClusterResult,modify_global_cluster_result +ModifyGlobalReplicationGroupMessage,modify_global_replication_group_message +ModifyGlobalReplicationGroupResult,modify_global_replication_group_result +ModifyHapgRequest,modify_hapg_request +ModifyHapgResponse,modify_hapg_response +ModifyHostsRequest,modify_hosts_request +ModifyHostsResult,modify_hosts_result +ModifyHsmRequest,modify_hsm_request +ModifyHsmResponse,modify_hsm_response +ModifyIdFormatRequest,modify_id_format_request +ModifyIdentityIdFormatRequest,modify_identity_id_format_request +ModifyImageAttributeRequest,modify_image_attribute_request +ModifyInstanceAttributeRequest,modify_instance_attribute_request +ModifyInstanceCapacityReservationAttributesRequest,modify_instance_capacity_reservation_attributes_request +ModifyInstanceCapacityReservationAttributesResult,modify_instance_capacity_reservation_attributes_result +ModifyInstanceCreditSpecificationRequest,modify_instance_credit_specification_request +ModifyInstanceCreditSpecificationResult,modify_instance_credit_specification_result +ModifyInstanceEventStartTimeRequest,modify_instance_event_start_time_request +ModifyInstanceEventStartTimeResult,modify_instance_event_start_time_result +ModifyInstanceEventWindowRequest,modify_instance_event_window_request +ModifyInstanceEventWindowResult,modify_instance_event_window_result +ModifyInstanceFleetInput,modify_instance_fleet_input +ModifyInstanceGroupsInput,modify_instance_groups_input +ModifyInstanceMaintenanceOptionsRequest,modify_instance_maintenance_options_request +ModifyInstanceMaintenanceOptionsResult,modify_instance_maintenance_options_result +ModifyInstanceMetadataOptionsRequest,modify_instance_metadata_options_request +ModifyInstanceMetadataOptionsResult,modify_instance_metadata_options_result +ModifyInstancePlacementRequest,modify_instance_placement_request +ModifyInstancePlacementResult,modify_instance_placement_result +ModifyInstanceProfileMessage,modify_instance_profile_message +ModifyInstanceProfileResponse,modify_instance_profile_response +ModifyIpamPoolRequest,modify_ipam_pool_request +ModifyIpamPoolResult,modify_ipam_pool_result +ModifyIpamRequest,modify_ipam_request +ModifyIpamResourceCidrRequest,modify_ipam_resource_cidr_request +ModifyIpamResourceCidrResult,modify_ipam_resource_cidr_result +ModifyIpamResourceDiscoveryRequest,modify_ipam_resource_discovery_request +ModifyIpamResourceDiscoveryResult,modify_ipam_resource_discovery_result +ModifyIpamResult,modify_ipam_result +ModifyIpamScopeRequest,modify_ipam_scope_request +ModifyIpamScopeResult,modify_ipam_scope_result +ModifyLaunchTemplateRequest,modify_launch_template_request +ModifyLaunchTemplateResult,modify_launch_template_result +ModifyListenerInput,modify_listener_input +ModifyListenerOutput,modify_listener_output +ModifyLoadBalancerAttributesInput,modify_load_balancer_attributes_input +ModifyLoadBalancerAttributesOutput,modify_load_balancer_attributes_output +ModifyLocalGatewayRouteRequest,modify_local_gateway_route_request +ModifyLocalGatewayRouteResult,modify_local_gateway_route_result +ModifyLunaClientRequest,modify_luna_client_request +ModifyLunaClientResponse,modify_luna_client_response +ModifyManagedPrefixListRequest,modify_managed_prefix_list_request +ModifyManagedPrefixListResult,modify_managed_prefix_list_result +ModifyMigrationProjectMessage,modify_migration_project_message +ModifyMigrationProjectResponse,modify_migration_project_response +ModifyMountTargetSecurityGroupsRequest,modify_mount_target_security_groups_request +ModifyNetworkInterfaceAttributeRequest,modify_network_interface_attribute_request +ModifyOptionGroupMessage,modify_option_group_message +ModifyOptionGroupResult,modify_option_group_result +ModifyPrivateDnsNameOptionsRequest,modify_private_dns_name_options_request +ModifyPrivateDnsNameOptionsResult,modify_private_dns_name_options_result +ModifyRecommendationDetail,modify_recommendation_detail +ModifyReplicationConfigMessage,modify_replication_config_message +ModifyReplicationConfigResponse,modify_replication_config_response +ModifyReplicationGroupMessage,modify_replication_group_message +ModifyReplicationGroupResult,modify_replication_group_result +ModifyReplicationGroupShardConfigurationMessage,modify_replication_group_shard_configuration_message +ModifyReplicationGroupShardConfigurationResult,modify_replication_group_shard_configuration_result +ModifyReplicationInstanceMessage,modify_replication_instance_message +ModifyReplicationInstanceResponse,modify_replication_instance_response +ModifyReplicationSubnetGroupMessage,modify_replication_subnet_group_message +ModifyReplicationSubnetGroupResponse,modify_replication_subnet_group_response +ModifyReplicationTaskMessage,modify_replication_task_message +ModifyReplicationTaskResponse,modify_replication_task_response +ModifyReportDefinitionRequest,modify_report_definition_request +ModifyReservedInstancesRequest,modify_reserved_instances_request +ModifyReservedInstancesResult,modify_reserved_instances_result +ModifyRuleInput,modify_rule_input +ModifyRuleOutput,modify_rule_output +ModifySamlPropertiesRequest,modify_saml_properties_request +ModifyScheduledActionMessage,modify_scheduled_action_message +ModifySecurityGroupRulesRequest,modify_security_group_rules_request +ModifySecurityGroupRulesResult,modify_security_group_rules_result +ModifySelfservicePermissionsRequest,modify_selfservice_permissions_request +ModifySnapshotAttributeRequest,modify_snapshot_attribute_request +ModifySnapshotCopyRetentionPeriodMessage,modify_snapshot_copy_retention_period_message +ModifySnapshotCopyRetentionPeriodResult,modify_snapshot_copy_retention_period_result +ModifySnapshotScheduleMessage,modify_snapshot_schedule_message +ModifySnapshotTierRequest,modify_snapshot_tier_request +ModifySnapshotTierResult,modify_snapshot_tier_result +ModifySpotFleetRequestRequest,modify_spot_fleet_request_request +ModifySpotFleetRequestResponse,modify_spot_fleet_request_response +ModifyStatus,modify_status +ModifySubnetAttributeRequest,modify_subnet_attribute_request +ModifyTargetGroupAttributesInput,modify_target_group_attributes_input +ModifyTargetGroupAttributesOutput,modify_target_group_attributes_output +ModifyTargetGroupInput,modify_target_group_input +ModifyTargetGroupOutput,modify_target_group_output +ModifyTrafficMirrorFilterNetworkServicesRequest,modify_traffic_mirror_filter_network_services_request +ModifyTrafficMirrorFilterNetworkServicesResult,modify_traffic_mirror_filter_network_services_result +ModifyTrafficMirrorFilterRuleRequest,modify_traffic_mirror_filter_rule_request +ModifyTrafficMirrorFilterRuleResult,modify_traffic_mirror_filter_rule_result +ModifyTrafficMirrorSessionRequest,modify_traffic_mirror_session_request +ModifyTrafficMirrorSessionResult,modify_traffic_mirror_session_result +ModifyTransitGatewayOptions,modify_transit_gateway_options +ModifyTransitGatewayPrefixListReferenceRequest,modify_transit_gateway_prefix_list_reference_request +ModifyTransitGatewayPrefixListReferenceResult,modify_transit_gateway_prefix_list_reference_result +ModifyTransitGatewayRequest,modify_transit_gateway_request +ModifyTransitGatewayResult,modify_transit_gateway_result +ModifyTransitGatewayVpcAttachmentRequest,modify_transit_gateway_vpc_attachment_request +ModifyTransitGatewayVpcAttachmentRequestOptions,modify_transit_gateway_vpc_attachment_request_options +ModifyTransitGatewayVpcAttachmentResult,modify_transit_gateway_vpc_attachment_result +ModifyUsageLimitMessage,modify_usage_limit_message +ModifyUserGroupMessage,modify_user_group_message +ModifyUserMessage,modify_user_message +ModifyVerifiedAccessEndpointEniOptions,modify_verified_access_endpoint_eni_options +ModifyVerifiedAccessEndpointLoadBalancerOptions,modify_verified_access_endpoint_load_balancer_options +ModifyVerifiedAccessEndpointPolicyRequest,modify_verified_access_endpoint_policy_request +ModifyVerifiedAccessEndpointPolicyResult,modify_verified_access_endpoint_policy_result +ModifyVerifiedAccessEndpointRequest,modify_verified_access_endpoint_request +ModifyVerifiedAccessEndpointResult,modify_verified_access_endpoint_result +ModifyVerifiedAccessGroupPolicyRequest,modify_verified_access_group_policy_request +ModifyVerifiedAccessGroupPolicyResult,modify_verified_access_group_policy_result +ModifyVerifiedAccessGroupRequest,modify_verified_access_group_request +ModifyVerifiedAccessGroupResult,modify_verified_access_group_result +ModifyVerifiedAccessInstanceLoggingConfigurationRequest,modify_verified_access_instance_logging_configuration_request +ModifyVerifiedAccessInstanceLoggingConfigurationResult,modify_verified_access_instance_logging_configuration_result +ModifyVerifiedAccessInstanceRequest,modify_verified_access_instance_request +ModifyVerifiedAccessInstanceResult,modify_verified_access_instance_result +ModifyVerifiedAccessTrustProviderOidcOptions,modify_verified_access_trust_provider_oidc_options +ModifyVerifiedAccessTrustProviderRequest,modify_verified_access_trust_provider_request +ModifyVerifiedAccessTrustProviderResult,modify_verified_access_trust_provider_result +ModifyVolumeAttributeRequest,modify_volume_attribute_request +ModifyVolumeRequest,modify_volume_request +ModifyVolumeResult,modify_volume_result +ModifyVpcAttributeRequest,modify_vpc_attribute_request +ModifyVpcEndpointConnectionNotificationRequest,modify_vpc_endpoint_connection_notification_request +ModifyVpcEndpointConnectionNotificationResult,modify_vpc_endpoint_connection_notification_result +ModifyVpcEndpointRequest,modify_vpc_endpoint_request +ModifyVpcEndpointResult,modify_vpc_endpoint_result +ModifyVpcEndpointServiceConfigurationRequest,modify_vpc_endpoint_service_configuration_request +ModifyVpcEndpointServiceConfigurationResult,modify_vpc_endpoint_service_configuration_result +ModifyVpcEndpointServicePayerResponsibilityRequest,modify_vpc_endpoint_service_payer_responsibility_request +ModifyVpcEndpointServicePayerResponsibilityResult,modify_vpc_endpoint_service_payer_responsibility_result +ModifyVpcEndpointServicePermissionsRequest,modify_vpc_endpoint_service_permissions_request +ModifyVpcEndpointServicePermissionsResult,modify_vpc_endpoint_service_permissions_result +ModifyVpcPeeringConnectionOptionsRequest,modify_vpc_peering_connection_options_request +ModifyVpcPeeringConnectionOptionsResult,modify_vpc_peering_connection_options_result +ModifyVpcTenancyRequest,modify_vpc_tenancy_request +ModifyVpcTenancyResult,modify_vpc_tenancy_result +ModifyVpnConnectionOptionsRequest,modify_vpn_connection_options_request +ModifyVpnConnectionOptionsResult,modify_vpn_connection_options_result +ModifyVpnConnectionRequest,modify_vpn_connection_request +ModifyVpnConnectionResult,modify_vpn_connection_result +ModifyVpnTunnelCertificateRequest,modify_vpn_tunnel_certificate_request +ModifyVpnTunnelCertificateResult,modify_vpn_tunnel_certificate_result +ModifyVpnTunnelOptionsRequest,modify_vpn_tunnel_options_request +ModifyVpnTunnelOptionsResult,modify_vpn_tunnel_options_result +ModifyVpnTunnelOptionsSpecification,modify_vpn_tunnel_options_specification +ModifyWorkspaceAccessPropertiesRequest,modify_workspace_access_properties_request +ModifyWorkspaceCreationPropertiesRequest,modify_workspace_creation_properties_request +ModifyWorkspacePropertiesRequest,modify_workspace_properties_request +ModifyWorkspaceStateRequest,modify_workspace_state_request +ModifyingProcess,modifying_process +ModuleFilePath,module_file_path +ModuleInfo,module_info +ModuleLoggingConfiguration,module_logging_configuration +ModuleLoggingConfigurationInput,module_logging_configuration_input +ModuleName,module_name +ModuleSha256,module_sha256 +Monday,monday +MonetaryAmount,monetary_amount +MongoDBTarget,mongo_db_target +MongoDBTargets,mongo_db_targets +MongoDbDataProviderSettings,mongo_db_data_provider_settings +MongoDbSettings,mongo_db_settings +Monitor,monitor +MonitorArn,monitor_arn +MonitorArnList,monitor_arn_list +MonitorConfig,monitor_config +MonitorContactRequest,monitor_contact_request +MonitorContactResponse,monitor_contact_response +MonitorDataSource,monitor_data_source +MonitorDimension,monitor_dimension +MonitorErrorDetails,monitor_error_details +MonitorInfo,monitor_info +MonitorInstancesRequest,monitor_instances_request +MonitorInstancesResult,monitor_instances_result +MonitorName,monitor_name +MonitorSpecification,monitor_specification +MonitorStatus,monitor_status +MonitorSummary,monitor_summary +MonitorType,monitor_type +Monitored,monitored +MonitoredResourceARN,monitored_resource_arn +MonitoredResourceIdentifier,monitored_resource_identifier +MonitoredResourceIdentifiers,monitored_resource_identifiers +MonitoredResourceInfo,monitored_resource_info +MonitoredResourceName,monitored_resource_name +Monitoring,monitoring +MonitoringAlertActions,monitoring_alert_actions +MonitoringAlertHistory,monitoring_alert_history +MonitoringAlertHistorySummary,monitoring_alert_history_summary +MonitoringAlertName,monitoring_alert_name +MonitoringAlertSummaries,monitoring_alert_summaries +MonitoringAlertSummary,monitoring_alert_summary +MonitoringAppSpecification,monitoring_app_specification +MonitoringBaselineConfig,monitoring_baseline_config +MonitoringClusterConfig,monitoring_cluster_config +MonitoringConfiguration,monitoring_configuration +MonitoringConfigurationDescription,monitoring_configuration_description +MonitoringConfigurationUpdate,monitoring_configuration_update +MonitoringConstraintsResource,monitoring_constraints_resource +MonitoringCsvDatasetFormat,monitoring_csv_dataset_format +MonitoringDatasetFormat,monitoring_dataset_format +MonitoringExecutionStatus,monitoring_execution_status +MonitoringExecutionSummaries,monitoring_execution_summaries +MonitoringExecutionSummary,monitoring_execution_summary +MonitoringGroundTruthS3Input,monitoring_ground_truth_s3_input +MonitoringInput,monitoring_input +MonitoringInputs,monitoring_inputs +MonitoringInterval,monitoring_interval +MonitoringJobDefinition,monitoring_job_definition +MonitoringJobDefinitionArn,monitoring_job_definition_arn +MonitoringJobDefinitionName,monitoring_job_definition_name +MonitoringJobDefinitionSummary,monitoring_job_definition_summary +MonitoringJsonDatasetFormat,monitoring_json_dataset_format +MonitoringNetworkConfig,monitoring_network_config +MonitoringOutput,monitoring_output +MonitoringOutputConfig,monitoring_output_config +MonitoringOutputs,monitoring_outputs +MonitoringResources,monitoring_resources +MonitoringRoleArn,monitoring_role_arn +MonitoringS3Output,monitoring_s3_output +MonitoringSchedule,monitoring_schedule +MonitoringScheduleArn,monitoring_schedule_arn +MonitoringScheduleConfig,monitoring_schedule_config +MonitoringScheduleName,monitoring_schedule_name +MonitoringScheduleStatus,monitoring_schedule_status +MonitoringScheduleSummaries,monitoring_schedule_summaries +MonitoringScheduleSummary,monitoring_schedule_summary +MonitoringSchedules,monitoring_schedules +MonitoringStatisticsResource,monitoring_statistics_resource +MonitoringStoppingCondition,monitoring_stopping_condition +MonitoringSubscription,monitoring_subscription +MonitoringSubscriptionAlreadyExists,monitoring_subscription_already_exists +MonitoringTimeInMinutes,monitoring_time_in_minutes +MonitoringType,monitoring_type +MonitoringTypeEquals,monitoring_type_equals +Monitors,monitors +MonotonicValues,monotonic_values +Monotonicity,monotonicity +Month,month +MonthlyCost,monthly_cost +MonthlyLeasingPrice,monthly_leasing_price +MonthlyLimit,monthly_limit +MonthlySchedule,monthly_schedule +MonthlySetting,monthly_setting +MonthlySettings,monthly_settings +MonthlyTransfer,monthly_transfer +MoovPlacement,moov_placement +MostRecent,most_recent +MotionGraphicsActivateScheduleActionSettings,motion_graphics_activate_schedule_action_settings +MotionGraphicsConfiguration,motion_graphics_configuration +MotionGraphicsImageActivateSettings,motion_graphics_image_activate_settings +MotionGraphicsImageDeactivateSettings,motion_graphics_image_deactivate_settings +MotionGraphicsInsertion,motion_graphics_insertion +MotionGraphicsSettings,motion_graphics_settings +MotionImageInserter,motion_image_inserter +MotionImageInsertionFramerate,motion_image_insertion_framerate +MotionImageInsertionOffset,motion_image_insertion_offset +MountName,mount_name +MountOptions,mount_options +MountPath,mount_path +MountPoint,mount_point +MountPoints,mount_points +MountSource,mount_source +MountTarget,mount_target +MountTargetConflict,mount_target_conflict +MountTargetDescription,mount_target_description +MountTargetId,mount_target_id +MountTargetNotFound,mount_target_not_found +MountTargets,mount_targets +MouthOpen,mouth_open +MovSettings,mov_settings +MoveAccountRequest,move_account_request +MoveAddressToVpcRequest,move_address_to_vpc_request +MoveAddressToVpcResult,move_address_to_vpc_result +MoveByoipCidrToIpamRequest,move_byoip_cidr_to_ipam_request +MoveByoipCidrToIpamResult,move_byoip_cidr_to_ipam_result +MoveReplicationTaskMessage,move_replication_task_message +MoveReplicationTaskResponse,move_replication_task_response +MoveStatus,move_status +MoveToColdStorageAfterDays,move_to_cold_storage_after_days +MoveToColdStorageAt,move_to_cold_storage_at +MoveToVersionId,move_to_version_id +MoverSize,mover_size +MovingAddressStatus,moving_address_status +MovingAddressStatuses,moving_address_statuses +Mp2Settings,mp2_settings +Mp3Settings,mp3_settings +Mp4MajorBrand,mp4_major_brand +Mp4Settings,mp4_settings +MpdLocation,mpd_location +MpdManifestBandwidthType,mpd_manifest_bandwidth_type +MpdProfile,mpd_profile +MpdSettings,mpd_settings +Mpeg2FilterSettings,mpeg2_filter_settings +Mpeg2FourCCControl,mpeg2_four_cc_control +Mpeg2Settings,mpeg2_settings +MqttContext,mqtt_context +MqttHeaders,mqtt_headers +Mrap,mrap +MsSmoothAdditionalManifest,ms_smooth_additional_manifest +MsSmoothEncryptionSettings,ms_smooth_encryption_settings +MsSmoothGroupSettings,ms_smooth_group_settings +MsSmoothOutputSettings,ms_smooth_output_settings +MsrcNumber,msrc_number +MsrcSeverity,msrc_severity +MssEncryption,mss_encryption +MssManifest,mss_manifest +MssManifests,mss_manifests +MssPackage,mss_package +Mtime,mtime +MultiAZ,multi_az +MultiAZCapable,multi_az_capable +MultiAZEnabled,multi_az_enabled +MultiAZWithStandbyEnabled,multi_az_with_standby_enabled +MultiAttachEnabled,multi_attach_enabled +MultiAz,multi_az +MultiCondition,multi_condition +MultiConditionalBranch,multi_conditional_branch +MultiConditionalSplitActivity,multi_conditional_split_activity +MultiLayerStorage,multi_layer_storage +MultiLine,multi_line +MultiLineStartPattern,multi_line_start_pattern +MultiMeasureAttributeMapping,multi_measure_attribute_mapping +MultiMeasureAttributeMappings,multi_measure_attribute_mappings +MultiMeasureMappings,multi_measure_mappings +MultiModelConfig,multi_model_config +MultiPolygonGeometryInput,multi_polygon_geometry_input +MultiRegion,multi_region +MultiRegionAccessPointDetails,multi_region_access_point_details +MultiRegionAccessPointPolicyDocument,multi_region_access_point_policy_document +MultiRegionAccessPointRegionalResponse,multi_region_access_point_regional_response +MultiRegionAccessPointReport,multi_region_access_point_report +MultiRegionAccessPointRoute,multi_region_access_point_route +MultiRegionAccessPointsAsyncResponse,multi_region_access_points_async_response +MultiRegionConfiguration,multi_region_configuration +MultiRegionEnabled,multi_region_enabled +MultiRegionKey,multi_region_key +MultiRegionKeyType,multi_region_key_type +MultiValueAnswer,multi_value_answer +Multicast,multicast +MulticastDeviceStatus,multicast_device_status +MulticastDomainAssociations,multicast_domain_associations +MulticastFrameInfo,multicast_frame_info +MulticastGroup,multicast_group +MulticastGroupByFuotaTask,multicast_group_by_fuota_task +MulticastGroupId,multicast_group_id +MulticastGroupList,multicast_group_list +MulticastGroups,multicast_groups +MulticastGroupsToAdd,multicast_groups_to_add +MulticastGroupsToRemove,multicast_groups_to_remove +MulticastIp,multicast_ip +MulticastSupport,multicast_support +MulticastWirelessMetadata,multicast_wireless_metadata +Multiline,multiline +MultipartReadSetUploadListItem,multipart_read_set_upload_list_item +MultipartUpload,multipart_upload +MultipartUploadId,multipart_upload_id +MultipleConflictResolutionEntriesException,multiple_conflict_resolution_entries_exception +MultipleIamArnsProvidedException,multiple_iam_arns_provided_exception +MultipleOperatingModes,multiple_operating_modes +MultipleRepositoriesInPullRequestException,multiple_repositories_in_pull_request_exception +MultipleValuesSetting,multiple_values_setting +Multiplex,multiplex +MultiplexGroupSettings,multiplex_group_settings +MultiplexId,multiplex_id +MultiplexIds,multiplex_ids +MultiplexMediaConnectOutputDestinationSettings,multiplex_media_connect_output_destination_settings +MultiplexOutputDestination,multiplex_output_destination +MultiplexOutputSettings,multiplex_output_settings +MultiplexProgram,multiplex_program +MultiplexProgramChannelDestinationSettings,multiplex_program_channel_destination_settings +MultiplexProgramPacketIdentifiersMap,multiplex_program_packet_identifiers_map +MultiplexProgramPipelineDetail,multiplex_program_pipeline_detail +MultiplexProgramServiceDescriptor,multiplex_program_service_descriptor +MultiplexProgramSettings,multiplex_program_settings +MultiplexProgramSummary,multiplex_program_summary +MultiplexPrograms,multiplex_programs +MultiplexSettings,multiplex_settings +MultiplexSettingsSummary,multiplex_settings_summary +MultiplexStatmuxVideoSettings,multiplex_statmux_video_settings +MultiplexSummary,multiplex_summary +MultiplexVideoSettings,multiplex_video_settings +Multiplexes,multiplexes +Municipality,municipality +MustBeOwnedByCaller,must_be_owned_by_caller +MustBeRequestable,must_be_requestable +Mustache,mustache +Mutable,mutable +MutableClusterInfo,mutable_cluster_info +MutationActionSetStateParameter,mutation_action_set_state_parameter +MutationProtection,mutation_protection +MutualAuthentication,mutual_authentication +MutualTlsAuthentication,mutual_tls_authentication +MutualTlsAuthenticationInput,mutual_tls_authentication_input +MutuallyExclusiveParameters,mutually_exclusive_parameters +MuxType,mux_type +MxfSettings,mxf_settings +MxfXavcProfileSettings,mxf_xavc_profile_settings +MySQLCatalogSource,my_sql_catalog_source +MySQLCatalogTarget,my_sql_catalog_target +MySQLSettings,my_sql_settings +MySqlDataProviderSettings,my_sql_data_provider_settings +MySqlParameters,my_sql_parameters +N,n +NE,ne +NFS,nfs +NFSDataRepositoryConfiguration,nfs_data_repository_configuration +NFSFileShareDefaults,nfs_file_share_defaults +NFSFileShareInfo,nfs_file_share_info +NFSFileShareInfoList,nfs_file_share_info_list +NFSOnDeviceService,nfs_on_device_service +NFSOnDeviceServiceConfiguration,nfs_on_device_service_configuration +NLBResource,nlb_resource +NS,ns +Name,name +NameAlreadyExistsException,name_already_exists_exception +NameAssigner,name_assigner +NameAvailabilityException,name_availability_exception +NameContains,name_contains +NameFilter,name_filter +NameInUseException,name_in_use_exception +NameLengthExceededException,name_length_exceeded_exception +NameModifier,name_modifier +NameNodes,name_nodes +NamePrefix,name_prefix +NamePrefixUpdate,name_prefix_update +NameQualifier,name_qualifier +NameServers,name_servers +NameServersUpdateState,name_servers_update_state +NameStartsWith,name_starts_with +NameTag,name_tag +NameUpdate,name_update +NameValuePair,name_value_pair +NamedEntities,named_entities +NamedEntityDefinition,named_entity_definition +NamedEntityDefinitionMetric,named_entity_definition_metric +NamedQueries,named_queries +NamedQuery,named_query +NamedQueryId,named_query_id +NamedQueryIds,named_query_ids +Names,names +Nameserver,nameserver +Nameservers,nameservers +Namespace,namespace +NamespaceAlreadyExists,namespace_already_exists +NamespaceError,namespace_error +NamespaceFilter,namespace_filter +NamespaceId,namespace_id +NamespaceInfoV2,namespace_info_v2 +NamespaceName,namespace_name +NamespaceNotFound,namespace_not_found +NamespaceNotFoundException,namespace_not_found_exception +NamespacePid,namespace_pid +NamespaceProperties,namespace_properties +NamespaceSummary,namespace_summary +NamespaceType,namespace_type +Namespaces,namespaces +Narrative,narrative +NatGateway,nat_gateway +NatGatewayAddress,nat_gateway_address +NatGatewayAddresses,nat_gateway_addresses +NatGatewayId,nat_gateway_id +NatGatewayIds,nat_gateway_ids +NatGateways,nat_gateways +NativeClientId,native_client_id +NavigationOperation,navigation_operation +NcharCharacterSetName,nchar_character_set_name +NearestModelName,nearest_model_name +Negate,negate +Negated,negated +Negative,negative +NegativeColor,negative_color +NegativeFormat,negative_format +NegativeValueConfiguration,negative_value_configuration +NeighborConnectionDetail,neighbor_connection_detail +Neighborhood,neighborhood +NeoVpcConfig,neo_vpc_config +NeptuneSettings,neptune_settings +Neq,neq +NestedFilters,nested_filters +NestedPropertyName,nested_property_name +NestingLevel,nesting_level +NetAppONTAPCluster,net_app_ontap_cluster +NetAppONTAPClusters,net_app_ontap_clusters +NetAppONTAPSVM,net_app_ontapsvm +NetAppONTAPSVMs,net_app_ontapsvms +NetAppONTAPVolume,net_app_ontap_volume +NetAppONTAPVolumes,net_app_ontap_volumes +NetBiosName,net_bios_name +NetIdFilters,net_id_filters +NetRISavings,net_ri_savings +NetSavings,net_savings +NetmaskLength,netmask_length +Network,network +NetworkACLEntry,network_acl_entry +NetworkAccessConfiguration,network_access_configuration +NetworkAcl,network_acl +NetworkAclAssociation,network_acl_association +NetworkAclAssociationId,network_acl_association_id +NetworkAclEntry,network_acl_entry +NetworkAclId,network_acl_id +NetworkAclIds,network_acl_ids +NetworkAcls,network_acls +NetworkAnalyzerConfigurationList,network_analyzer_configuration_list +NetworkAnalyzerConfigurations,network_analyzer_configurations +NetworkArtifactMeta,network_artifact_meta +NetworkBandwidthGbps,network_bandwidth_gbps +NetworkBandwidthGbpsRequest,network_bandwidth_gbps_request +NetworkBinding,network_binding +NetworkBorderGroup,network_border_group +NetworkCardIndex,network_card_index +NetworkCardInfo,network_card_info +NetworkCards,network_cards +NetworkConfig,network_config +NetworkConfiguration,network_configuration +NetworkConnectionAction,network_connection_action +NetworkDestinationDomain,network_destination_domain +NetworkDestinationIpV4,network_destination_ipv4 +NetworkDestinationIpV6,network_destination_ipv6 +NetworkDestinationPort,network_destination_port +NetworkDirection,network_direction +NetworkEndBlackout,network_end_blackout +NetworkEndBlackoutImage,network_end_blackout_image +NetworkEthereumAttributes,network_ethereum_attributes +NetworkEventType,network_event_type +NetworkFabricAttributes,network_fabric_attributes +NetworkFabricConfiguration,network_fabric_configuration +NetworkFabricType,network_fabric_type +NetworkFailureException,network_failure_exception +NetworkFirewallBlackHoleRouteDetectedViolation,network_firewall_black_hole_route_detected_violation +NetworkFirewallInternetTrafficNotInspectedViolation,network_firewall_internet_traffic_not_inspected_violation +NetworkFirewallInvalidRouteConfigurationViolation,network_firewall_invalid_route_configuration_violation +NetworkFirewallMissingExpectedRTViolation,network_firewall_missing_expected_rt_violation +NetworkFirewallMissingExpectedRoutesViolation,network_firewall_missing_expected_routes_violation +NetworkFirewallMissingFirewallViolation,network_firewall_missing_firewall_violation +NetworkFirewallMissingSubnetViolation,network_firewall_missing_subnet_violation +NetworkFirewallPolicy,network_firewall_policy +NetworkFirewallPolicyDescription,network_firewall_policy_description +NetworkFirewallPolicyModifiedViolation,network_firewall_policy_modified_violation +NetworkFirewallStatefulRuleGroupOverride,network_firewall_stateful_rule_group_override +NetworkFirewallUnexpectedFirewallRoutesViolation,network_firewall_unexpected_firewall_routes_violation +NetworkFirewallUnexpectedGatewayRoutesViolation,network_firewall_unexpected_gateway_routes_violation +NetworkFrameworkAttributes,network_framework_attributes +NetworkFrameworkConfiguration,network_framework_configuration +NetworkHeader,network_header +NetworkId,network_id +NetworkImpairment,network_impairment +NetworkInBytesPerSecond,network_in_bytes_per_second +NetworkInfo,network_info +NetworkInputSettings,network_input_settings +NetworkInsightsAccessScope,network_insights_access_scope +NetworkInsightsAccessScopeAnalyses,network_insights_access_scope_analyses +NetworkInsightsAccessScopeAnalysis,network_insights_access_scope_analysis +NetworkInsightsAccessScopeAnalysisArn,network_insights_access_scope_analysis_arn +NetworkInsightsAccessScopeAnalysisId,network_insights_access_scope_analysis_id +NetworkInsightsAccessScopeAnalysisIds,network_insights_access_scope_analysis_ids +NetworkInsightsAccessScopeArn,network_insights_access_scope_arn +NetworkInsightsAccessScopeContent,network_insights_access_scope_content +NetworkInsightsAccessScopeId,network_insights_access_scope_id +NetworkInsightsAccessScopeIds,network_insights_access_scope_ids +NetworkInsightsAccessScopes,network_insights_access_scopes +NetworkInsightsAnalyses,network_insights_analyses +NetworkInsightsAnalysis,network_insights_analysis +NetworkInsightsAnalysisArn,network_insights_analysis_arn +NetworkInsightsAnalysisId,network_insights_analysis_id +NetworkInsightsAnalysisIds,network_insights_analysis_ids +NetworkInsightsPath,network_insights_path +NetworkInsightsPathArn,network_insights_path_arn +NetworkInsightsPathId,network_insights_path_id +NetworkInsightsPathIds,network_insights_path_ids +NetworkInsightsPaths,network_insights_paths +NetworkInterface,network_interface +NetworkInterfaceAssociation,network_interface_association +NetworkInterfaceAttachment,network_interface_attachment +NetworkInterfaceAttachmentChanges,network_interface_attachment_changes +NetworkInterfaceCount,network_interface_count +NetworkInterfaceCountRequest,network_interface_count_request +NetworkInterfaceDeviceIndex,network_interface_device_index +NetworkInterfaceId,network_interface_id +NetworkInterfaceIds,network_interface_ids +NetworkInterfaceIpv6Address,network_interface_ipv6_address +NetworkInterfaceLimitExceeded,network_interface_limit_exceeded +NetworkInterfaceOptions,network_interface_options +NetworkInterfaceOwnerId,network_interface_owner_id +NetworkInterfacePermission,network_interface_permission +NetworkInterfacePermissionId,network_interface_permission_id +NetworkInterfacePermissionIds,network_interface_permission_ids +NetworkInterfacePermissionState,network_interface_permission_state +NetworkInterfacePermissions,network_interface_permissions +NetworkInterfacePort,network_interface_port +NetworkInterfacePrivateIpAddress,network_interface_private_ip_address +NetworkInterfaceSet,network_interface_set +NetworkInterfaceType,network_interface_type +NetworkInterfaces,network_interfaces +NetworkLoadBalancerArn,network_load_balancer_arn +NetworkLoadBalancerArns,network_load_balancer_arns +NetworkMode,network_mode +NetworkName,network_name +NetworkOrigin,network_origin +NetworkOutBytesPerSecond,network_out_bytes_per_second +NetworkOutput,network_output +NetworkPacketsInPerSecond,network_packets_in_per_second +NetworkPacketsOutPerSecond,network_packets_out_per_second +NetworkPath,network_path +NetworkPathComponent,network_path_component +NetworkPathComponentDetails,network_path_component_details +NetworkPathFound,network_path_found +NetworkPayload,network_payload +NetworkPerformance,network_performance +NetworkPlatform,network_platform +NetworkPolicyCount,network_policy_count +NetworkProfile,network_profile +NetworkProfileArn,network_profile_arn +NetworkProfileData,network_profile_data +NetworkProfileInfo,network_profile_info +NetworkProfileName,network_profile_name +NetworkProfiles,network_profiles +NetworkProtocol,network_protocol +NetworkReachabilityDetails,network_reachability_details +NetworkResource,network_resource +NetworkResourceCount,network_resource_count +NetworkResourceCounts,network_resource_counts +NetworkResourceDefinition,network_resource_definition +NetworkResourceSummary,network_resource_summary +NetworkResourceUtilization,network_resource_utilization +NetworkResources,network_resources +NetworkRoute,network_route +NetworkRouteDestination,network_route_destination +NetworkRoutes,network_routes +NetworkServices,network_services +NetworkSettings,network_settings +NetworkSettingsSummary,network_settings_summary +NetworkSite,network_site +NetworkSource,network_source +NetworkSourceDomain,network_source_domain +NetworkSourceIpV4,network_source_ipv4 +NetworkSourceIpV6,network_source_ipv6 +NetworkSourceMac,network_source_mac +NetworkSourcePort,network_source_port +NetworkStatus,network_status +NetworkSummary,network_summary +NetworkTelemetry,network_telemetry +NetworkType,network_type +NetworkTypeNotSupported,network_type_not_supported +NetworkingConfiguration,networking_configuration +Networks,networks +Neutral,neutral +NeverAggregateInFilter,never_aggregate_in_filter +NeverExpires,never_expires +NewAction,new_action +NewAssertionRule,new_assertion_rule +NewAssociationId,new_association_id +NewAvailabilityZones,new_availability_zones +NewBGPPeer,new_bgp_peer +NewBudget,new_budget +NewClusterIdentifier,new_cluster_identifier +NewColumnName,new_column_name +NewColumnType,new_column_type +NewComponentName,new_component_name +NewContactIds,new_contact_ids +NewCustomKeyStoreName,new_custom_key_store_name +NewCustomVocabularyItem,new_custom_vocabulary_item +NewDBClusterIdentifier,new_db_cluster_identifier +NewDBInstanceIdentifier,new_db_instance_identifier +NewDBProxyEndpointName,new_db_proxy_endpoint_name +NewDBProxyName,new_db_proxy_name +NewDefaultValues,new_default_values +NewDeviceMetadata,new_device_metadata +NewDeviceMetadataType,new_device_metadata_type +NewDhcpConfiguration,new_dhcp_configuration +NewGameSessionProtectionPolicy,new_game_session_protection_policy +NewGameSessionsPerCreator,new_game_sessions_per_creator +NewGatingRule,new_gating_rule +NewGlobalClusterIdentifier,new_global_cluster_identifier +NewGroupName,new_group_name +NewImage,new_image +NewInThisVersionBulletPoints,new_in_this_version_bullet_points +NewInstancesProtectedFromScaleIn,new_instances_protected_from_scale_in +NewLaunchProfileMember,new_launch_profile_member +NewMembers,new_members +NewName,new_name +NewNotification,new_notification +NewObjectMetadata,new_object_metadata +NewObjectTagging,new_object_tagging +NewParameterName,new_parameter_name +NewPassword,new_password +NewPath,new_path +NewPrivateVirtualInterface,new_private_virtual_interface +NewPrivateVirtualInterfaceAllocation,new_private_virtual_interface_allocation +NewPublicVirtualInterface,new_public_virtual_interface +NewPublicVirtualInterfaceAllocation,new_public_virtual_interface_allocation +NewReplicaCount,new_replica_count +NewReplicationFactor,new_replication_factor +NewServerCertificateName,new_server_certificate_name +NewStartingHashKey,new_starting_hash_key +NewStudioMember,new_studio_member +NewSubscriber,new_subscriber +NewSupportedProducts,new_supported_products +NewTableName,new_table_name +NewTransitVirtualInterface,new_transit_virtual_interface +NewTransitVirtualInterfaceAllocation,new_transit_virtual_interface_allocation +NewUserName,new_user_name +NewValue,new_value +NewValues,new_values +NewVersion,new_version +NewerNoncurrentVersions,newer_noncurrent_versions +NexGuardFileMarkerSettings,nex_guard_file_marker_settings +NexguardFileMarkerSettings,nexguard_file_marker_settings +NextActivity,next_activity +NextContinentCode,next_continent_code +NextContinuationToken,next_continuation_token +NextCountryCode,next_country_code +NextDNSName,next_dns_name +NextExecutionTime,next_execution_time +NextHostedZoneId,next_hosted_zone_id +NextInvocationTime,next_invocation_time +NextInvocations,next_invocations +NextKeyMarker,next_key_marker +NextLockToken,next_lock_token +NextMaintenanceWindowStartTime,next_maintenance_window_start_time +NextMarker,next_marker +NextPageMarker,next_page_marker +NextPageToken,next_page_token +NextPartNumberMarker,next_part_number_marker +NextPassword,next_password +NextPollConfigurationToken,next_poll_configuration_token +NextPollIntervalInSeconds,next_poll_interval_in_seconds +NextRecordIdentifier,next_record_identifier +NextRecordName,next_record_name +NextRecordType,next_record_type +NextRefreshTime,next_refresh_time +NextRotationDate,next_rotation_date +NextScheduledRetrainingStartDate,next_scheduled_retraining_start_date +NextSchemaVersion,next_schema_version +NextShardIterator,next_shard_iterator +NextSigningKeyLength,next_signing_key_length +NextSlotStartTime,next_slot_start_time +NextStatus,next_status +NextStep,next_step +NextSubdivisionCode,next_subdivision_code +NextToken,next_token +NextTransitionTime,next_transition_time +NextUpdateAvailabilityDate,next_update_availability_date +NextUpdateAvailabilityTime,next_update_availability_time +NextUpdateSeconds,next_update_seconds +NextUploadIdMarker,next_upload_id_marker +NextVersionIdMarker,next_version_id_marker +NextWebACLLockToken,next_web_acl_lock_token +Nfs,nfs +NfsExported,nfs_exported +NfsExportedVolumes,nfs_exported_volumes +NfsExports,nfs_exports +NfsMountOptions,nfs_mount_options +Nice,nice +NickName,nick_name +NielsenCBET,nielsen_cbet +NielsenCbetSettings,nielsen_cbet_settings +NielsenConfiguration,nielsen_configuration +NielsenDistributionType,nielsen_distribution_type +NielsenId3,nielsen_id3 +NielsenId3Behavior,nielsen_id3_behavior +NielsenNaesIiNw,nielsen_naes_ii_nw +NielsenNaesIiNwSettings,nielsen_naes_ii_nw_settings +NielsenNonLinearWatermark,nielsen_non_linear_watermark +NielsenNonLinearWatermarkSettings,nielsen_non_linear_watermark_settings +NielsenPcmToId3Tagging,nielsen_pcm_to_id3_tagging +NielsenWatermarksSettings,nielsen_watermarks_settings +NitInterval,nit_interval +NitroEnclavesSupport,nitro_enclaves_support +NitroTpmInfo,nitro_tpm_info +NitroTpmSupport,nitro_tpm_support +NlbArn,nlb_arn +NlbName,nlb_name +NoActionEmail,no_action_email +NoAssociatedRoleException,no_associated_role_exception +NoAvailableCertificateException,no_available_certificate_exception +NoAvailableConfigurationRecorderException,no_available_configuration_recorder_exception +NoAvailableDeliveryChannelException,no_available_delivery_channel_exception +NoAvailableOrganizationException,no_available_organization_exception +NoChangeException,no_change_exception +NoConnectorsAvailableException,no_connectors_available_exception +NoData,no_data +NoDataRetentionException,no_data_retention_exception +NoDatabaseMigrationPreference,no_database_migration_preference +NoDevice,no_device +NoEcho,no_echo +NoEncryptionConfig,no_encryption_config +NoEntitlementsAllowedException,no_entitlements_allowed_exception +NoExpiry,no_expiry +NoFreeAddressesInSubnet,no_free_addresses_in_subnet +NoHexPrefix,no_hex_prefix +NoManagementAccountSLRExistsException,no_management_account_slr_exists_exception +NoManagementPreference,no_management_preference +NoOperationFault,no_operation_fault +NoPasswordRequired,no_password_required +NoReboot,no_reboot +NoRegionalBlackoutFlag,no_regional_blackout_flag +NoRestrictions,no_restrictions +NoRunningConfigurationRecorderException,no_running_configuration_recorder_exception +NoScheduleException,no_schedule_exception +NoSecurityExtension,no_security_extension +NoSquashNids,no_squash_nids +NoSuchBucketException,no_such_bucket_exception +NoSuchCachePolicy,no_such_cache_policy +NoSuchChange,no_such_change +NoSuchCidrCollectionException,no_such_cidr_collection_exception +NoSuchCidrLocationException,no_such_cidr_location_exception +NoSuchCloudFrontOriginAccessIdentity,no_such_cloud_front_origin_access_identity +NoSuchCloudWatchLogsLogGroup,no_such_cloud_watch_logs_log_group +NoSuchConfigRuleException,no_such_config_rule_exception +NoSuchConfigRuleInConformancePackException,no_such_config_rule_in_conformance_pack_exception +NoSuchConfigurationAggregatorException,no_such_configuration_aggregator_exception +NoSuchConfigurationRecorderException,no_such_configuration_recorder_exception +NoSuchConformancePackException,no_such_conformance_pack_exception +NoSuchContinuousDeploymentPolicy,no_such_continuous_deployment_policy +NoSuchDelegationSet,no_such_delegation_set +NoSuchDeliveryChannelException,no_such_delivery_channel_exception +NoSuchDistribution,no_such_distribution +NoSuchEntityException,no_such_entity_exception +NoSuchFieldLevelEncryptionConfig,no_such_field_level_encryption_config +NoSuchFieldLevelEncryptionProfile,no_such_field_level_encryption_profile +NoSuchFunctionExists,no_such_function_exists +NoSuchGeoLocation,no_such_geo_location +NoSuchHealthCheck,no_such_health_check +NoSuchHostedZone,no_such_hosted_zone +NoSuchInvalidation,no_such_invalidation +NoSuchKeySigningKey,no_such_key_signing_key +NoSuchMonitoringSubscription,no_such_monitoring_subscription +NoSuchOrganizationConfigRuleException,no_such_organization_config_rule_exception +NoSuchOrganizationConformancePackException,no_such_organization_conformance_pack_exception +NoSuchOrigin,no_such_origin +NoSuchOriginAccessControl,no_such_origin_access_control +NoSuchOriginRequestPolicy,no_such_origin_request_policy +NoSuchPublicAccessBlockConfiguration,no_such_public_access_block_configuration +NoSuchPublicKey,no_such_public_key +NoSuchQueryLoggingConfig,no_such_query_logging_config +NoSuchRealtimeLogConfig,no_such_realtime_log_config +NoSuchRemediationConfigurationException,no_such_remediation_configuration_exception +NoSuchRemediationExceptionException,no_such_remediation_exception_exception +NoSuchResource,no_such_resource +NoSuchResourceException,no_such_resource_exception +NoSuchResponseHeadersPolicy,no_such_response_headers_policy +NoSuchRetentionConfigurationException,no_such_retention_configuration_exception +NoSuchStreamingDistribution,no_such_streaming_distribution +NoSuchTrafficPolicy,no_such_traffic_policy +NoSuchTrafficPolicyInstance,no_such_traffic_policy_instance +NoUpdateAvailableException,no_update_available_exception +NoVoteCount,no_vote_count +Node,node +NodeARN,node_arn +NodeAssociationStatus,node_association_status +NodeAssociationStatusToken,node_association_status_token +NodeConfiguration,node_configuration +NodeConfigurationOption,node_configuration_option +NodeConfigurationOptionList,node_configuration_option_list +NodeConfigurationOptionsFilter,node_configuration_options_filter +NodeConfigurationOptionsMessage,node_configuration_options_message +NodeCount,node_count +NodeCounts,node_counts +NodeCreateTime,node_create_time +NodeDeletionDate,node_deletion_date +NodeDescription,node_description +NodeDetails,node_details +NodeEthereumAttributes,node_ethereum_attributes +NodeExporter,node_exporter +NodeExporterInfo,node_exporter_info +NodeFabricAttributes,node_fabric_attributes +NodeFabricLogPublishingConfiguration,node_fabric_log_publishing_configuration +NodeFrameworkAttributes,node_framework_attributes +NodeFromTemplateJob,node_from_template_job +NodeFromTemplateJobs,node_from_template_jobs +NodeGroup,node_group +NodeGroupConfiguration,node_group_configuration +NodeGroupCount,node_group_count +NodeGroupId,node_group_id +NodeGroupMember,node_group_member +NodeGroupMemberUpdateStatus,node_group_member_update_status +NodeGroupMembers,node_group_members +NodeGroupNotFoundFault,node_group_not_found_fault +NodeGroupUpdateStatus,node_group_update_status +NodeGroups,node_groups +NodeGroupsPerReplicationGroupQuotaExceededFault,node_groups_per_replication_group_quota_exceeded_fault +NodeGroupsToRemove,node_groups_to_remove +NodeGroupsToRetain,node_groups_to_retain +NodeId,node_id +NodeIds,node_ids +NodeIdsToReboot,node_ids_to_reboot +NodeIdsToRemove,node_ids_to_remove +NodeInfo,node_info +NodeInfoList,node_info_list +NodeInputPort,node_input_port +NodeInstance,node_instance +NodeInstanceId,node_instance_id +NodeInstances,node_instances +NodeInterface,node_interface +NodeLogPublishingConfiguration,node_log_publishing_configuration +NodeName,node_name +NodeNotFoundFault,node_not_found_fault +NodeOutputPort,node_output_port +NodeOverrides,node_overrides +NodeProperties,node_properties +NodePropertiesSummary,node_properties_summary +NodePropertyOverride,node_property_override +NodeQuotaForClusterExceededFault,node_quota_for_cluster_exceeded_fault +NodeQuotaForCustomerExceededFault,node_quota_for_customer_exceeded_fault +NodeRangeProperty,node_range_property +NodeRole,node_role +NodeSignal,node_signal +NodeSignals,node_signals +NodeSnapshot,node_snapshot +NodeSnapshots,node_snapshots +NodeStatus,node_status +NodeStructure,node_structure +NodeSummary,node_summary +NodeToNodeEncryptionOptions,node_to_node_encryption_options +NodeToNodeEncryptionOptionsStatus,node_to_node_encryption_options_status +NodeType,node_type +NodeTypeSpecificValue,node_type_specific_value +NodeTypeSpecificValues,node_type_specific_values +NodeUpdateEndDate,node_update_end_date +NodeUpdateInitiatedBy,node_update_initiated_by +NodeUpdateInitiatedDate,node_update_initiated_date +NodeUpdateStartDate,node_update_start_date +NodeUpdateStatus,node_update_status +NodeUpdateStatusModifiedDate,node_update_status_modified_date +Nodegroup,nodegroup +NodegroupHealth,nodegroup_health +NodegroupResources,nodegroup_resources +NodegroupScalingConfig,nodegroup_scaling_config +NodegroupUpdateConfig,nodegroup_update_config +Nodes,nodes +NodesUpdated,nodes_updated +NoiseReducer,noise_reducer +NoiseReducerFilterSettings,noise_reducer_filter_settings +NoiseReducerSpatialFilterSettings,noise_reducer_spatial_filter_settings +NoiseReducerTemporalFilterSettings,noise_reducer_temporal_filter_settings +NonAdditive,non_additive +NonAwsRegions,non_aws_regions +NonCompliantConformancePackCount,non_compliant_conformance_pack_count +NonCompliantCount,non_compliant_count +NonCompliantCriticalCount,non_compliant_critical_count +NonCompliantHighCount,non_compliant_high_count +NonCompliantInformationalCount,non_compliant_informational_count +NonCompliantLowCount,non_compliant_low_count +NonCompliantMediumCount,non_compliant_medium_count +NonCompliantResource,non_compliant_resource +NonCompliantResourceCount,non_compliant_resource_count +NonCompliantResources,non_compliant_resources +NonCompliantRuleCount,non_compliant_rule_count +NonCompliantSummary,non_compliant_summary +NonCompliantUnspecifiedCount,non_compliant_unspecified_count +NonDeletedNetworkInterfaceIds,non_deleted_network_interface_ids +NonKeyAttributes,non_key_attributes +NonOverridableArguments,non_overridable_arguments +NonRepudiation,non_repudiation +NonRetryableError,non_retryable_error +NonTalkTimeFilter,non_talk_time_filter +Nonce,nonce +NoncompliantKeys,noncompliant_keys +NoncurrentDays,noncurrent_days +NoncurrentVersionExpiration,noncurrent_version_expiration +NoncurrentVersionExpirationInDays,noncurrent_version_expiration_in_days +NoncurrentVersionTransition,noncurrent_version_transition +NoncurrentVersionTransitions,noncurrent_version_transitions +None,none +Normal,normal +Normalized,normalized +NormalizedInstanceHours,normalized_instance_hours +NormalizedValue,normalized_value +North,north +Not,not +NotAcceptableException,not_acceptable_exception +NotActions,not_actions +NotAfter,not_after +NotAfterDate,not_after_date +NotAllowedAggregations,not_allowed_aggregations +NotApplicable,not_applicable +NotApplicableCount,not_applicable_count +NotApplicableEnabled,not_applicable_enabled +NotAuthorizedException,not_authorized_exception +NotBefore,not_before +NotBeforeDate,not_before_date +NotBeforeDeadline,not_before_deadline +NotConfiguredException,not_configured_exception +NotDeviceModels,not_device_models +NotDeviceOperatingSystems,not_device_operating_systems +NotDeviceTypes,not_device_types +NotDeviceUserAgents,not_device_user_agents +NotEligibleException,not_eligible_exception +NotEndsWith,not_ends_with +NotEquals,not_equals +NotFilter,not_filter +NotFoundException,not_found_exception +NotImpersonationRoleIds,not_impersonation_role_ids +NotIndexException,not_index_exception +NotIpRanges,not_ip_ranges +NotLatestPipelineExecutionException,not_latest_pipeline_execution_exception +NotNodeException,not_node_exception +NotOrganizationManagementAccountException,not_organization_management_account_exception +NotOrganizationMasterAccountException,not_organization_master_account_exception +NotPolicyException,not_policy_exception +NotReadableInputStreamException,not_readable_input_stream_exception +NotResources,not_resources +NotScaledReason,not_scaled_reason +NotScaledReasons,not_scaled_reasons +NotServiceResourceError,not_service_resource_error +NotStabilizedException,not_stabilized_exception +NotStartsWith,not_starts_with +NotStatement,not_statement +NotSupportedOperationException,not_supported_operation_exception +NotTargetUsers,not_target_users +NotUpdatableException,not_updatable_exception +NotUserIds,not_user_ids +Note,note +NoteText,note_text +NoteUpdate,note_update +NoteUpdatedAt,note_updated_at +NoteUpdatedBy,note_updated_by +NotebookExecution,notebook_execution +NotebookExecutionId,notebook_execution_id +NotebookExecutionName,notebook_execution_name +NotebookExecutionSummary,notebook_execution_summary +NotebookExecutions,notebook_executions +NotebookId,notebook_id +NotebookInstanceArn,notebook_instance_arn +NotebookInstanceLifecycleConfigArn,notebook_instance_lifecycle_config_arn +NotebookInstanceLifecycleConfigName,notebook_instance_lifecycle_config_name +NotebookInstanceLifecycleConfigNameContains,notebook_instance_lifecycle_config_name_contains +NotebookInstanceLifecycleConfigSummary,notebook_instance_lifecycle_config_summary +NotebookInstanceLifecycleConfigs,notebook_instance_lifecycle_configs +NotebookInstanceLifecycleHook,notebook_instance_lifecycle_hook +NotebookInstanceName,notebook_instance_name +NotebookInstanceSecurityGroupId,notebook_instance_security_group_id +NotebookInstanceStatus,notebook_instance_status +NotebookInstanceSummary,notebook_instance_summary +NotebookInstances,notebook_instances +NotebookMetadata,notebook_metadata +NotebookMetadataList,notebook_metadata_list +NotebookOutputOption,notebook_output_option +NotebookParams,notebook_params +NotebookS3Location,notebook_s3_location +NotebookS3LocationForOutput,notebook_s3_location_for_output +NotebookS3LocationFromInput,notebook_s3_location_from_input +NotebookSessionSummary,notebook_session_summary +NotebookSessionsList,notebook_sessions_list +NotebookUrl,notebook_url +NotebookVersion,notebook_version +Notes,notes +Notification,notification +NotificationARNs,notification_arns +NotificationAction,notification_action +NotificationArn,notification_arn +NotificationArns,notification_arns +NotificationAttributes,notification_attributes +NotificationChannel,notification_channel +NotificationChannelConfig,notification_channel_config +NotificationConfig,notification_config +NotificationConfiguration,notification_configuration +NotificationConfigurationFilter,notification_configuration_filter +NotificationConfigurations,notification_configurations +NotificationContext,notification_context +NotificationDestinationConfig,notification_destination_config +NotificationEmail,notification_email +NotificationEvents,notification_events +NotificationFilterConfig,notification_filter_config +NotificationId,notification_id +NotificationMetadata,notification_metadata +NotificationOptions,notification_options +NotificationPolicy,notification_policy +NotificationProperty,notification_property +NotificationRecipientType,notification_recipient_type +NotificationRuleSummary,notification_rule_summary +NotificationRules,notification_rules +NotificationSetting,notification_setting +NotificationSettingDetail,notification_setting_detail +NotificationSettingKey,notification_setting_key +NotificationSpecification,notification_specification +NotificationState,notification_state +NotificationSummaries,notification_summaries +NotificationSummary,notification_summary +NotificationTarget,notification_target +NotificationTargetARN,notification_target_arn +NotificationTargetActions,notification_target_actions +NotificationTopicArn,notification_topic_arn +NotificationTopicStatus,notification_topic_status +NotificationType,notification_type +NotificationTypes,notification_types +NotificationWithSubscribers,notification_with_subscribers +Notifications,notifications +NotificationsConfiguration,notifications_configuration +NotificationsEnabled,notifications_enabled +NotificationsWithSubscribers,notifications_with_subscribers +Notify,notify +NotifyAll,notify_all +NotifyAppValidationOutputRequest,notify_app_validation_output_request +NotifyApplicationStateRequest,notify_application_state_request +NotifyCollaborators,notify_collaborators +NotifyConfiguration,notify_configuration +NotifyConfigurationType,notify_configuration_type +NotifyDelayAfter,notify_delay_after +NotifyEmailType,notify_email_type +NotifyMigrationTaskStateRequest,notify_migration_task_state_request +NotifyObjectCompleteInput,notify_object_complete_input +NotifyObjectCompleteOutput,notify_object_complete_output +NotifyProvisionProductEngineWorkflowResultInput,notify_provision_product_engine_workflow_result_input +NotifyRecommendationsReceivedError,notify_recommendations_received_error +NotifyRecommendationsReceivedRequest,notify_recommendations_received_request +NotifyRecommendationsReceivedResponse,notify_recommendations_received_response +NotifyResourceDeploymentStatusChangeInput,notify_resource_deployment_status_change_input +NotifyTerminateProvisionedProductEngineWorkflowResultInput,notify_terminate_provisioned_product_engine_workflow_result_input +NotifyUpdateProvisionedProductEngineWorkflowResultInput,notify_update_provisioned_product_engine_workflow_result_input +NotifyWhenUploadedInput,notify_when_uploaded_input +NotifyWhenUploadedOutput,notify_when_uploaded_output +NotifyWorkersFailureCode,notify_workers_failure_code +NotifyWorkersFailureMessage,notify_workers_failure_message +NotifyWorkersFailureStatus,notify_workers_failure_status +NotifyWorkersFailureStatuses,notify_workers_failure_statuses +NotifyWorkersRequest,notify_workers_request +NotifyWorkersResponse,notify_workers_response +NrCapable,nr_capable +Ntp,ntp +NtpPayload,ntp_payload +NtpServerName,ntp_server_name +NtpServers,ntp_servers +NtpStatus,ntp_status +NullCheckBoxList,null_check_box_list +NullOption,null_option +NullPacketBitrate,null_packet_bitrate +NullString,null_string +NullTextList,null_text_list +NullValue,null_value +NullValueColor,null_value_color +NullValueField,null_value_field +NullValueFormatConfiguration,null_value_format_configuration +Nullable,nullable +NumCacheClusters,num_cache_clusters +NumCacheNodes,num_cache_nodes +NumFalseNegatives,num_false_negatives +NumFalsePositives,num_false_positives +NumItemsEvaluated,num_items_evaluated +NumNodeGroups,num_node_groups +NumPartitions,num_partitions +NumRecords,num_records +NumRefFrames,num_ref_frames +NumReplicasPerShard,num_replicas_per_shard +NumResults,num_results +NumRetries,num_retries +NumShards,num_shards +NumTapesToCreate,num_tapes_to_create +NumTimeSeries,num_time_series +NumTrueNegatives,num_true_negatives +NumTruePositives,num_true_positives +Number,number +NumberAttributeConstraints,number_attribute_constraints +NumberAttributeConstraintsType,number_attribute_constraints_type +NumberBFramesBetweenReferenceFrames,number_b_frames_between_reference_frames +NumberCapabilities,number_capabilities +NumberDatatypeScale,number_datatype_scale +NumberDisplayFormatConfiguration,number_display_format_configuration +NumberFilter,number_filter +NumberFormatConfiguration,number_format_configuration +NumberOfAdditionalAssignments,number_of_additional_assignments +NumberOfArchives,number_of_archives +NumberOfAssignmentsAvailable,number_of_assignments_available +NumberOfAssignmentsCompleted,number_of_assignments_completed +NumberOfAssignmentsPending,number_of_assignments_pending +NumberOfAssociatedQueues,number_of_associated_queues +NumberOfAssociatedUsers,number_of_associated_users +NumberOfAssociations,number_of_associations +NumberOfAutoScalingGroups,number_of_auto_scaling_groups +NumberOfBacktestWindows,number_of_backtest_windows +NumberOfBrokerNodes,number_of_broker_nodes +NumberOfBuckets,number_of_buckets +NumberOfBytes,number_of_bytes +NumberOfCategory,number_of_category +NumberOfChannels,number_of_channels +NumberOfChildJobs,number_of_child_jobs +NumberOfControls,number_of_controls +NumberOfDatabases,number_of_databases +NumberOfDecreasesToday,number_of_decreases_today +NumberOfDevicesInGroup,number_of_devices_in_group +NumberOfDevicesRequested,number_of_devices_requested +NumberOfDisks,number_of_disks +NumberOfDistinctValues,number_of_distinct_values +NumberOfDocuments,number_of_documents +NumberOfFalses,number_of_falses +NumberOfFiles,number_of_files +NumberOfFrameworks,number_of_frameworks +NumberOfHumanWorkersPerDataObject,number_of_human_workers_per_data_object +NumberOfLabels,number_of_labels +NumberOfLargeTimestampGaps,number_of_large_timestamp_gaps +NumberOfLaunchConfigurations,number_of_launch_configurations +NumberOfLines,number_of_lines +NumberOfLogLinesOccurrences,number_of_log_lines_occurrences +NumberOfLogLinesScanned,number_of_log_lines_scanned +NumberOfMatchesFound,number_of_matches_found +NumberOfMatchesInSample,number_of_matches_in_sample +NumberOfMergesDone,number_of_merges_done +NumberOfMountTargets,number_of_mount_targets +NumberOfNodes,number_of_nodes +NumberOfNodesPerClusterLimitExceededFault,number_of_nodes_per_cluster_limit_exceeded_fault +NumberOfNodesQuotaExceededFault,number_of_nodes_quota_exceeded_fault +NumberOfNulls,number_of_nulls +NumberOfObjects,number_of_objects +NumberOfOnCalls,number_of_on_calls +NumberOfProfilesInSample,number_of_profiles_in_sample +NumberOfProfilesReviewed,number_of_profiles_reviewed +NumberOfProfilesWillBeMerged,number_of_profiles_will_be_merged +NumberOfRecoveryPoints,number_of_recovery_points +NumberOfRuleGroupsAlreadyAssociated,number_of_rule_groups_already_associated +NumberOfRuleTemplatesExceededException,number_of_rule_templates_exceeded_exception +NumberOfRules,number_of_rules +NumberOfRulesExceededException,number_of_rules_exceeded_exception +NumberOfSamples,number_of_samples +NumberOfSchemas,number_of_schemas +NumberOfServicesAccessible,number_of_services_accessible +NumberOfServicesNotAccessed,number_of_services_not_accessed +NumberOfShards,number_of_shards +NumberOfSteps,number_of_steps +NumberOfTasksFailed,number_of_tasks_failed +NumberOfTasksSucceeded,number_of_tasks_succeeded +NumberOfTestDocuments,number_of_test_documents +NumberOfTopics,number_of_topics +NumberOfTrainMentions,number_of_train_mentions +NumberOfTrainedDocuments,number_of_trained_documents +NumberOfTrainingJobsObjectiveNotImproving,number_of_training_jobs_objective_not_improving +NumberOfTrues,number_of_trues +NumberOfVersions,number_of_versions +NumberOfWorkers,number_of_workers +NumberReference,number_reference +NumberReferenceFrames,number_reference_frames +NumberScale,number_scale +NumberSelectionBehavior,number_selection_behavior +NumberType,number_type +NumberValidateRequest,number_validate_request +NumberValidateResponse,number_validate_response +NumericAxisOptions,numeric_axis_options +NumericEqualityDrillDownFilter,numeric_equality_drill_down_filter +NumericEqualityFilter,numeric_equality_filter +NumericFormatConfiguration,numeric_format_configuration +NumericOperator,numeric_operator +NumericQuestionPropertyValueAutomation,numeric_question_property_value_automation +NumericRangeFilter,numeric_range_filter +NumericRangeFilterValue,numeric_range_filter_value +NumericSeparatorConfiguration,numeric_separator_configuration +NumericalAggregationFunction,numerical_aggregation_function +NumericalDimensionField,numerical_dimension_field +NumericalMeasureField,numerical_measure_field +NvmeSupport,nvme_support +NwkGeoLoc,nwk_geo_loc +NwkKey,nwk_key +NwkSEncKey,nwk_s_enc_key +NwkSKey,nwk_s_key +OAuth,o_auth +OAuth2Credentials,o_auth2_credentials +OAuth2CustomParameter,o_auth2_custom_parameter +OAuth2Defaults,o_auth2_defaults +OAuth2Properties,o_auth2_properties +OAuthCredentials,o_auth_credentials +OAuthGrantType,o_auth_grant_type +OAuthHttpParameters,o_auth_http_parameters +OAuthParameters,o_auth_parameters +OAuthProperties,o_auth_properties +OAuthProviderException,o_auth_provider_exception +OAuthScopes,o_auth_scopes +OCSPUrl,ocsp_url +OEMEphemeris,oem_ephemeris +OFIMetricDataPoint,ofi_metric_data_point +OFIModelPerformance,ofi_model_performance +OFITrainingMetricsValue,ofi_training_metrics_value +OID,oid +OIDC,oidc +OId,o_id +OKActions,ok_actions +OS,os +OSInfo,os_info +OSRelease,os_release +OSReleaseLabel,os_release_label +OSUpdateSettings,os_update_settings +OSVersion,os_version +OTAJobConfig,ota_job_config +OTAUpdateFile,ota_update_file +OTAUpdateInfo,ota_update_info +OTAUpdateSummary,ota_update_summary +OU,ou +Oauth2Credential,oauth2_credential +ObdInterface,obd_interface +ObdSignal,obd_signal +ObfuscationSetting,obfuscation_setting +Object,object +ObjectACL,object_acl +ObjectAlreadyDetachedException,object_already_detached_exception +ObjectArn,object_arn +ObjectAttributeAction,object_attribute_action +ObjectAttributeActionType,object_attribute_action_type +ObjectAttributeKey,object_attribute_key +ObjectAttributeList,object_attribute_list +ObjectAttributeRange,object_attribute_range +ObjectAttributeUpdate,object_attribute_update +ObjectAttributeUpdateValue,object_attribute_update_value +ObjectAttributes,object_attributes +ObjectChecksum,object_checksum +ObjectChecksumAlgorithm,object_checksum_algorithm +ObjectConfiguration,object_configuration +ObjectCount,object_count +ObjectCountByEncryptionType,object_count_by_encryption_type +ObjectEncryptionType,object_encryption_type +ObjectFilter,object_filter +ObjectGroup,object_group +ObjectGroupName,object_group_name +ObjectIdentifier,object_identifier +ObjectIdentifierAndLinkNameTuple,object_identifier_and_link_name_tuple +ObjectIdentifiers,object_identifiers +ObjectKey,object_key +ObjectKeyPrefix,object_key_prefix +ObjectLambdaAccessPoint,object_lambda_access_point +ObjectLambdaAccessPointAlias,object_lambda_access_point_alias +ObjectLambdaAccessPointArn,object_lambda_access_point_arn +ObjectLambdaAccessPointList,object_lambda_access_point_list +ObjectLambdaConfiguration,object_lambda_configuration +ObjectLambdaTransformationConfiguration,object_lambda_transformation_configuration +ObjectLevelStatistics,object_level_statistics +ObjectList,object_list +ObjectLockConfiguration,object_lock_configuration +ObjectLockEnabled,object_lock_enabled +ObjectLockEnabledForBucket,object_lock_enabled_for_bucket +ObjectLockLegalHold,object_lock_legal_hold +ObjectLockLegalHoldStatus,object_lock_legal_hold_status +ObjectLockMode,object_lock_mode +ObjectLockRetainUntilDate,object_lock_retain_until_date +ObjectLockRetention,object_lock_retention +ObjectLockRule,object_lock_rule +ObjectName,object_name +ObjectNotDetachedException,object_not_detached_exception +ObjectNotFoundException,object_not_found_exception +ObjectOwnership,object_ownership +ObjectPart,object_part +ObjectParts,object_parts +ObjectReference,object_reference +ObjectReplicationStatuses,object_replication_statuses +ObjectSize,object_size +ObjectSizeGreaterThan,object_size_greater_than +ObjectSizeLessThan,object_size_less_than +ObjectTags,object_tags +ObjectToken,object_token +ObjectType,object_type +ObjectTypeField,object_type_field +ObjectTypeKey,object_type_key +ObjectTypeName,object_type_name +ObjectTypeNames,object_type_names +ObjectTypes,object_types +ObjectURL,object_url +ObjectVersion,object_version +ObjectVersionId,object_version_id +ObjectVersionIds,object_version_ids +ObjectVersionUpdate,object_version_update +ObjectiveStatus,objective_status +ObjectiveStatusCounters,objective_status_counters +Objects,objects +ObjectsTransferred,objects_transferred +ObservabilityConfiguration,observability_configuration +ObservabilityConfigurationArn,observability_configuration_arn +ObservabilityConfigurationName,observability_configuration_name +ObservabilityConfigurationRevision,observability_configuration_revision +ObservabilityConfigurationSummary,observability_configuration_summary +ObservabilityConfigurationSummaryList,observability_configuration_summary_list +ObservabilityEnabled,observability_enabled +Observation,observation +ObservationId,observation_id +ObservationList,observation_list +OccConflictException,occ_conflict_exception +OccurredAt,occurred_at +OccurrenceCount,occurrence_count +OccurrenceDaySet,occurrence_day_set +OccurrenceDays,occurrence_days +OccurrenceRelativeToEnd,occurrence_relative_to_end +OccurrenceUnit,occurrence_unit +Occurrences,occurrences +OcrLanguage,ocr_language +OcspConfiguration,ocsp_configuration +OcspCustomCname,ocsp_custom_cname +OcuLimitExceededException,ocu_limit_exceeded_exception +OffCondition,off_condition +OffPeakWindow,off_peak_window +OffPeakWindowOptions,off_peak_window_options +OffPeakWindowOptionsStatus,off_peak_window_options_status +Offering,offering +OfferingArn,offering_arn +OfferingClass,offering_class +OfferingDescription,offering_description +OfferingId,offering_id +OfferingPromotion,offering_promotion +OfferingSet,offering_set +OfferingStatus,offering_status +OfferingTransaction,offering_transaction +OfferingType,offering_type +Offerings,offerings +Office,office +OfflineDeviceCount,offline_device_count +OfflineEncrypted,offline_encrypted +OfflineStoreConfig,offline_store_config +OfflineStoreStatus,offline_store_status +OfflineStoreStatusEquals,offline_store_status_equals +Offset,offset +OffsetMillis,offset_millis +OffsetRange,offset_range +OffsetRanges,offset_ranges +OidcConfig,oidc_config +OidcConfigForResponse,oidc_config_for_response +OidcIdentityProviderConfig,oidc_identity_provider_config +OidcIdentityProviderConfigRequest,oidc_identity_provider_config_request +OidcMemberDefinition,oidc_member_definition +OidcOptions,oidc_options +Ok,ok +OkActions,ok_actions +OkCount,ok_count +OldAction,old_action +OldImage,old_image +OldKmsKeyId,old_kms_key_id +OldNotification,old_notification +OldPassword,old_password +OldSubscriber,old_subscriber +OldValue,old_value +OnClause,on_clause +OnCreate,on_create +OnDemandAllocationStrategy,on_demand_allocation_strategy +OnDemandBaseCapacity,on_demand_base_capacity +OnDemandCapacityReservationOptions,on_demand_capacity_reservation_options +OnDemandCost,on_demand_cost +OnDemandCostEquivalent,on_demand_cost_equivalent +OnDemandCostOfRIHoursUsed,on_demand_cost_of_ri_hours_used +OnDemandFulfilledCapacity,on_demand_fulfilled_capacity +OnDemandHours,on_demand_hours +OnDemandHoursInLookbackPeriod,on_demand_hours_in_lookback_period +OnDemandMaxPricePercentageOverLowestPrice,on_demand_max_price_percentage_over_lowest_price +OnDemandMaxTotalPrice,on_demand_max_total_price +OnDemandNormalizedUnits,on_demand_normalized_units +OnDemandOptions,on_demand_options +OnDemandOptionsRequest,on_demand_options_request +OnDemandPercentageAboveBaseCapacity,on_demand_percentage_above_base_capacity +OnDemandProvisioningSpecification,on_demand_provisioning_specification +OnDemandResizeSpecification,on_demand_resize_specification +OnDemandResizingSpecification,on_demand_resizing_specification +OnDemandSpecification,on_demand_specification +OnDemandStreamCount,on_demand_stream_count +OnDemandStreamCountLimit,on_demand_stream_count_limit +OnDemandTargetCapacity,on_demand_target_capacity +OnDeviceServiceConfiguration,on_device_service_configuration +OnEnterLifecycle,on_enter_lifecycle +OnExceptionSteps,on_exception_steps +OnExitLifecycle,on_exit_lifecycle +OnFailure,on_failure +OnHoldBalance,on_hold_balance +OnInputLifecycle,on_input_lifecycle +OnPartialBatchItemFailure,on_partial_batch_item_failure +OnPartialUpload,on_partial_upload +OnPremConfig,on_prem_config +OnPremiseConfiguration,on_premise_configuration +OnPremisesTagSet,on_premises_tag_set +OnStackFailure,on_stack_failure +OnStart,on_start +OnSuccess,on_success +OnUnauthenticatedRequest,on_unauthenticated_request +OnUpload,on_upload +OnboardedImportedDeviceCount,onboarded_imported_device_count +OnboardingStatus,onboarding_status +OnboardingStatusReason,onboarding_status_reason +OneClickIdDelay,one_click_id_delay +OneClickPinDelay,one_click_pin_delay +OneDriveConfiguration,one_drive_configuration +OneDriveUserList,one_drive_user_list +OneDriveUserS3Path,one_drive_user_s3_path +OneDriveUsers,one_drive_users +OneTimePassword,one_time_password +Ongoing,ongoing +Online,online +OnlineAbConfig,online_ab_config +OnlineAbDefinition,online_ab_definition +OnlineStoreConfig,online_store_config +OnlineStoreConfigUpdate,online_store_config_update +OnlineStoreSecurityConfig,online_store_security_config +OnlineStoreTotalSizeBytes,online_store_total_size_bytes +OnlyAssociated,only_associated +OnlyAttached,only_attached +OnlyAvailable,only_available +OntapConfiguration,ontap_configuration +OntapFileSystemConfiguration,ontap_file_system_configuration +OntapResponse,ontap_response +OntapVolumeConfiguration,ontap_volume_configuration +OntapVolumeType,ontap_volume_type +Op,op +Opacity,opacity +OpenDate,open_date +OpenHours,open_hours +OpenHoursRule,open_hours_rule +OpenIDAuthTTL,open_id_auth_ttl +OpenIDClientId,open_id_client_id +OpenIDConnectConfig,open_id_connect_config +OpenIDConnectProviderArn,open_id_connect_provider_arn +OpenIDConnectProviderList,open_id_connect_provider_list +OpenIDConnectProviderListEntry,open_id_connect_provider_list_entry +OpenIDIatTTL,open_id_iat_ttl +OpenIDIssueURL,open_id_issue_url +OpenIDProviderName,open_id_provider_name +OpenIdConnectConfig,open_id_connect_config +OpenIdConnectProviderARNs,open_id_connect_provider_arns +OpenInstancePublicPortsRequest,open_instance_public_ports_request +OpenInstancePublicPortsResult,open_instance_public_ports_result +OpenMonitoring,open_monitoring +OpenMonitoringInfo,open_monitoring_info +OpenPortRange,open_port_range +OpenProactiveInsights,open_proactive_insights +OpenReactiveInsights,open_reactive_insights +OpenSearchAction,open_search_action +OpenSearchServiceDataSourceConfig,open_search_service_data_source_config +OpenShardCount,open_shard_count +OpenTableFormatInput,open_table_format_input +OpenTime,open_time +OpenTransactionWindow,open_transaction_window +OpenTunnelRequest,open_tunnel_request +OpenTunnelResponse,open_tunnel_response +OpenXJsonSerDe,open_x_json_ser_de +OpenZFSClientConfiguration,open_zfs_client_configuration +OpenZFSConfiguration,open_zfs_configuration +OpenZFSCreateRootVolumeConfiguration,open_zfs_create_root_volume_configuration +OpenZFSFileSystemConfiguration,open_zfs_file_system_configuration +OpenZFSNfsExport,open_zfs_nfs_export +OpenZFSOriginSnapshotConfiguration,open_zfs_origin_snapshot_configuration +OpenZFSResponse,open_zfs_response +OpenZFSUserOrGroupQuota,open_zfs_user_or_group_quota +OpenZFSVolumeConfiguration,open_zfs_volume_configuration +OpenedBy,opened_by +OperandFieldName,operand_field_name +Operands,operands +OperatingAddress,operating_address +OperatingAddressCity,operating_address_city +OperatingAddressCityFilter,operating_address_city_filter +OperatingAddressCountryCode,operating_address_country_code +OperatingAddressCountryCodeFilter,operating_address_country_code_filter +OperatingAddressStateOrRegion,operating_address_state_or_region +OperatingAddressStateOrRegionFilter,operating_address_state_or_region_filter +OperatingRegions,operating_regions +OperatingSystem,operating_system +OperatingSystemConfigurationManager,operating_system_configuration_manager +OperatingSystemName,operating_system_name +OperatingSystemVersion,operating_system_version +OperatingSystems,operating_systems +Operation,operation +OperationAbortedException,operation_aborted_exception +OperationArn,operation_arn +OperationDisabledException,operation_disabled_exception +OperationEndTime,operation_end_time +OperationFailureException,operation_failure_exception +OperationFilter,operation_filter +OperationId,operation_id +OperationIdAlreadyExistsException,operation_id_already_exists_exception +OperationIds,operation_ids +OperationInProgressException,operation_in_progress_exception +OperationLimitExceeded,operation_limit_exceeded +OperationName,operation_name +OperationNotFound,operation_not_found +OperationNotFoundException,operation_not_found_exception +OperationNotPermittedException,operation_not_permitted_exception +OperationNotPermittedFault,operation_not_permitted_fault +OperationNotSupportedException,operation_not_supported_exception +OperationPreferences,operation_preferences +OperationRequestedBy,operation_requested_by +OperationResultFilter,operation_result_filter +OperationStartTime,operation_start_time +OperationState,operation_state +OperationStatus,operation_status +OperationStatusCheckFailedException,operation_status_check_failed_exception +OperationStatusFilter,operation_status_filter +OperationStatuses,operation_statuses +OperationSteps,operation_steps +OperationSummary,operation_summary +OperationSummaryList,operation_summary_list +OperationTimeoutException,operation_timeout_exception +OperationType,operation_type +OperationalData,operational_data +OperationalDataToDelete,operational_data_to_delete +Operations,operations +OperationsRole,operations_role +Operator,operator +OplocksEnabled,oplocks_enabled +OpsAggregator,ops_aggregator +OpsCenter,ops_center +OpsCenterEnabled,ops_center_enabled +OpsCenterIntegration,ops_center_integration +OpsCenterIntegrationConfig,ops_center_integration_config +OpsEntity,ops_entity +OpsEntityItem,ops_entity_item +OpsFilter,ops_filter +OpsItem,ops_item +OpsItemAccessDeniedException,ops_item_access_denied_exception +OpsItemAlreadyExistsException,ops_item_already_exists_exception +OpsItemArn,ops_item_arn +OpsItemDataValue,ops_item_data_value +OpsItemEventFilter,ops_item_event_filter +OpsItemEventSummary,ops_item_event_summary +OpsItemFilter,ops_item_filter +OpsItemFilters,ops_item_filters +OpsItemId,ops_item_id +OpsItemIdentity,ops_item_identity +OpsItemInvalidParameterException,ops_item_invalid_parameter_exception +OpsItemLimitExceededException,ops_item_limit_exceeded_exception +OpsItemNotFoundException,ops_item_not_found_exception +OpsItemNotification,ops_item_notification +OpsItemRelatedItemAlreadyExistsException,ops_item_related_item_already_exists_exception +OpsItemRelatedItemAssociationNotFoundException,ops_item_related_item_association_not_found_exception +OpsItemRelatedItemSummary,ops_item_related_item_summary +OpsItemRelatedItemsFilter,ops_item_related_items_filter +OpsItemSNSTopicArn,ops_item_sns_topic_arn +OpsItemSummaries,ops_item_summaries +OpsItemSummary,ops_item_summary +OpsItemType,ops_item_type +OpsMetadata,ops_metadata +OpsMetadataAlreadyExistsException,ops_metadata_already_exists_exception +OpsMetadataArn,ops_metadata_arn +OpsMetadataFilter,ops_metadata_filter +OpsMetadataInvalidArgumentException,ops_metadata_invalid_argument_exception +OpsMetadataKeyLimitExceededException,ops_metadata_key_limit_exceeded_exception +OpsMetadataLimitExceededException,ops_metadata_limit_exceeded_exception +OpsMetadataList,ops_metadata_list +OpsMetadataNotFoundException,ops_metadata_not_found_exception +OpsMetadataTooManyUpdatesException,ops_metadata_too_many_updates_exception +OpsResultAttribute,ops_result_attribute +OptIn,opt_in +OptInPhoneNumberInput,opt_in_phone_number_input +OptInRequiredException,opt_in_required_exception +OptInStatus,opt_in_status +OptInType,opt_in_type +OptOut,opt_out +OptOutListArn,opt_out_list_arn +OptOutListInformation,opt_out_list_information +OptOutListName,opt_out_list_name +OptOutListNames,opt_out_list_names +OptOutLists,opt_out_lists +OptOutSpeakerRequest,opt_out_speaker_request +OptOutSpeakerResponse,opt_out_speaker_response +OptedOutException,opted_out_exception +OptedOutFilter,opted_out_filter +OptedOutNumber,opted_out_number +OptedOutNumberInformation,opted_out_number_information +OptedOutNumbers,opted_out_numbers +OptedOutTimestamp,opted_out_timestamp +OpticalStandard,optical_standard +OptimisticLockException,optimistic_lock_exception +OptimizationMetric,optimization_metric +OptimizationObjective,optimization_objective +OptimizationStatus,optimization_status +OptimizeForEndUserLocation,optimize_for_end_user_location +OptimizePerformance,optimize_performance +OptimizedSharedDelivery,optimized_shared_delivery +OptimizedViewPortWidth,optimized_view_port_width +OptimizingTime,optimizing_time +Option,option +OptionConfiguration,option_configuration +OptionDescription,option_description +OptionGroup,option_group +OptionGroupAlreadyExistsFault,option_group_already_exists_fault +OptionGroupArn,option_group_arn +OptionGroupDescription,option_group_description +OptionGroupMembership,option_group_membership +OptionGroupMemberships,option_group_memberships +OptionGroupName,option_group_name +OptionGroupNotFoundFault,option_group_not_found_fault +OptionGroupOption,option_group_option +OptionGroupOptionSetting,option_group_option_setting +OptionGroupOptionSettings,option_group_option_settings +OptionGroupOptionVersions,option_group_option_versions +OptionGroupOptions,option_group_options +OptionGroupOptionsMessage,option_group_options_message +OptionGroupQuotaExceededFault,option_group_quota_exceeded_fault +OptionGroups,option_groups +OptionGroupsList,option_groups_list +OptionName,option_name +OptionRefId,option_ref_id +OptionRestrictionRegex,option_restriction_regex +OptionSetting,option_setting +OptionSettings,option_settings +OptionSpecification,option_specification +OptionStatus,option_status +OptionVersion,option_version +OptionalDeployment,optional_deployment +OptionalFields,optional_fields +OptionalObjectAttributes,optional_object_attributes +OptionalParameters,optional_parameters +Options,options +OptionsConflictsWith,options_conflicts_with +OptionsDependedOn,options_depended_on +OptionsToInclude,options_to_include +OptionsToRemove,options_to_remove +OpusSettings,opus_settings +Or,or +OrAllFilters,or_all_filters +OrConditions,or_conditions +OrStatement,or_statement +OracleDataProviderSettings,oracle_data_provider_settings +OracleParameters,oracle_parameters +OraclePathPrefix,oracle_path_prefix +OracleSQLCatalogSource,oracle_sql_catalog_source +OracleSQLCatalogTarget,oracle_sql_catalog_target +OracleSettings,oracle_settings +OrcSerDe,orc_ser_de +Order,order +OrderBy,order_by +OrderByElement,order_by_element +OrderFulfilledDate,order_fulfilled_date +OrderId,order_id +OrderSubmissionDate,order_submission_date +OrderSummary,order_summary +OrderType,order_type +OrderableClusterOption,orderable_cluster_option +OrderableClusterOptions,orderable_cluster_options +OrderableClusterOptionsMessage,orderable_cluster_options_message +OrderableDBInstanceOption,orderable_db_instance_option +OrderableDBInstanceOptions,orderable_db_instance_options +OrderableDBInstanceOptionsMessage,orderable_db_instance_options_message +OrderableReplicationInstance,orderable_replication_instance +OrderableReplicationInstances,orderable_replication_instances +OrderedBy,ordered_by +OrderedIndexedAttributeList,ordered_indexed_attribute_list +OrderedPhoneNumber,ordered_phone_number +OrderedPhoneNumbers,ordered_phone_numbers +OrderedRemediationActions,ordered_remediation_actions +OrderedResourceDefinition,ordered_resource_definition +OrderingId,ordering_id +OrderingServiceEndpoint,ordering_service_endpoint +OrderingTimestamp,ordering_timestamp +Orders,orders +Org,org +Organization,organization +OrganizationAccessDeniedException,organization_access_denied_exception +OrganizationAdditionalConfiguration,organization_additional_configuration +OrganizationAdditionalConfigurationResult,organization_additional_configuration_result +OrganizationAffectedEntitiesErrorItem,organization_affected_entities_error_item +OrganizationAggregationSource,organization_aggregation_source +OrganizationAllFeaturesNotEnabledException,organization_all_features_not_enabled_exception +OrganizationArn,organization_arn +OrganizationArns,organization_arns +OrganizationAwsServiceAccessStatus,organization_aws_service_access_status +OrganizationConfigRule,organization_config_rule +OrganizationConfigRuleArn,organization_config_rule_arn +OrganizationConfigRuleDetailedStatus,organization_config_rule_detailed_status +OrganizationConfigRuleName,organization_config_rule_name +OrganizationConfigRuleNames,organization_config_rule_names +OrganizationConfigRuleStatus,organization_config_rule_status +OrganizationConfigRuleStatuses,organization_config_rule_statuses +OrganizationConfigRuleTriggerTypes,organization_config_rule_trigger_types +OrganizationConfigRules,organization_config_rules +OrganizationConfiguration,organization_configuration +OrganizationConformancePack,organization_conformance_pack +OrganizationConformancePackArn,organization_conformance_pack_arn +OrganizationConformancePackDetailedStatus,organization_conformance_pack_detailed_status +OrganizationConformancePackDetailedStatuses,organization_conformance_pack_detailed_statuses +OrganizationConformancePackName,organization_conformance_pack_name +OrganizationConformancePackNames,organization_conformance_pack_names +OrganizationConformancePackStatus,organization_conformance_pack_status +OrganizationConformancePackStatuses,organization_conformance_pack_statuses +OrganizationConformancePackTemplateValidationException,organization_conformance_pack_template_validation_exception +OrganizationConformancePacks,organization_conformance_packs +OrganizationCustomPolicyRuleMetadata,organization_custom_policy_rule_metadata +OrganizationCustomPolicyRuleMetadataNoPolicy,organization_custom_policy_rule_metadata_no_policy +OrganizationCustomRuleMetadata,organization_custom_rule_metadata +OrganizationDataSourceConfigurations,organization_data_source_configurations +OrganizationDataSourceConfigurationsResult,organization_data_source_configurations_result +OrganizationEbsVolumes,organization_ebs_volumes +OrganizationEbsVolumesResult,organization_ebs_volumes_result +OrganizationEnabled,organization_enabled +OrganizationEntityAggregate,organization_entity_aggregate +OrganizationEvent,organization_event +OrganizationEventDetails,organization_event_details +OrganizationEventDetailsErrorItem,organization_event_details_error_item +OrganizationEventFilter,organization_event_filter +OrganizationFeatureConfiguration,organization_feature_configuration +OrganizationFeatureConfigurationResult,organization_feature_configuration_result +OrganizationId,organization_id +OrganizationIntegration,organization_integration +OrganizationKubernetesAuditLogsConfiguration,organization_kubernetes_audit_logs_configuration +OrganizationKubernetesAuditLogsConfigurationResult,organization_kubernetes_audit_logs_configuration_result +OrganizationKubernetesConfiguration,organization_kubernetes_configuration +OrganizationKubernetesConfigurationResult,organization_kubernetes_configuration_result +OrganizationMalwareProtectionConfiguration,organization_malware_protection_configuration +OrganizationMalwareProtectionConfigurationResult,organization_malware_protection_configuration_result +OrganizationManagedRuleMetadata,organization_managed_rule_metadata +OrganizationName,organization_name +OrganizationNode,organization_node +OrganizationNodeType,organization_node_type +OrganizationNodeValue,organization_node_value +OrganizationNodes,organization_nodes +OrganizationNotEmptyException,organization_not_empty_exception +OrganizationNotFoundException,organization_not_found_exception +OrganizationNotInAllFeaturesModeException,organization_not_in_all_features_mode_exception +OrganizationParentId,organization_parent_id +OrganizationResourceCollectionType,organization_resource_collection_type +OrganizationResourceDetailedStatusFilters,organization_resource_detailed_status_filters +OrganizationResourceId,organization_resource_id +OrganizationRuleStatus,organization_rule_status +OrganizationS3LogsConfiguration,organization_s3_logs_configuration +OrganizationS3LogsConfigurationResult,organization_s3_logs_configuration_result +OrganizationScanEc2InstanceWithFindings,organization_scan_ec2_instance_with_findings +OrganizationScanEc2InstanceWithFindingsResult,organization_scan_ec2_instance_with_findings_result +OrganizationSharingStatus,organization_sharing_status +OrganizationSourceType,organization_source_type +OrganizationStateException,organization_state_exception +OrganizationStatus,organization_status +OrganizationSummaries,organization_summaries +OrganizationSummary,organization_summary +OrganizationUnits,organization_units +OrganizationalUnit,organizational_unit +OrganizationalUnitArn,organizational_unit_arn +OrganizationalUnitArns,organizational_unit_arns +OrganizationalUnitDistinguishedName,organizational_unit_distinguished_name +OrganizationalUnitDistinguishedNames,organizational_unit_distinguished_names +OrganizationalUnitId,organizational_unit_id +OrganizationalUnitIds,organizational_unit_ids +OrganizationalUnitNotEmptyException,organizational_unit_not_empty_exception +OrganizationalUnitNotFoundException,organizational_unit_not_found_exception +OrganizationalUnitScope,organizational_unit_scope +OrganizationalUnits,organizational_units +OrganizationsDecisionDetail,organizations_decision_detail +OrganizationsException,organizations_exception +OrganizationsNotInUseException,organizations_not_in_use_exception +OrganizationsPolicyId,organizations_policy_id +Orientation,orientation +OrientationCorrection,orientation_correction +Origin,origin +OriginAccessControl,origin_access_control +OriginAccessControlAlreadyExists,origin_access_control_already_exists +OriginAccessControlConfig,origin_access_control_config +OriginAccessControlId,origin_access_control_id +OriginAccessControlInUse,origin_access_control_in_use +OriginAccessControlList,origin_access_control_list +OriginAccessControlOriginType,origin_access_control_origin_type +OriginAccessControlSummary,origin_access_control_summary +OriginAccessIdentity,origin_access_identity +OriginApprovalRuleTemplate,origin_approval_rule_template +OriginCustomHeader,origin_custom_header +OriginDetails,origin_details +OriginEndpoint,origin_endpoint +OriginEndpointId,origin_endpoint_id +OriginEndpointListConfiguration,origin_endpoint_list_configuration +OriginEndpointName,origin_endpoint_name +OriginEndpoints,origin_endpoints +OriginGroup,origin_group +OriginGroupFailoverCriteria,origin_group_failover_criteria +OriginGroupMember,origin_group_member +OriginGroupMembers,origin_group_members +OriginGroups,origin_groups +OriginId,origin_id +OriginKeepaliveTimeout,origin_keepalive_timeout +OriginManifestType,origin_manifest_type +OriginOverride,origin_override +OriginPath,origin_path +OriginProtocolPolicy,origin_protocol_policy +OriginReadTimeout,origin_read_timeout +OriginRequestPolicy,origin_request_policy +OriginRequestPolicyAlreadyExists,origin_request_policy_already_exists +OriginRequestPolicyConfig,origin_request_policy_config +OriginRequestPolicyCookiesConfig,origin_request_policy_cookies_config +OriginRequestPolicyHeadersConfig,origin_request_policy_headers_config +OriginRequestPolicyId,origin_request_policy_id +OriginRequestPolicyInUse,origin_request_policy_in_use +OriginRequestPolicyList,origin_request_policy_list +OriginRequestPolicyQueryStringsConfig,origin_request_policy_query_strings_config +OriginRequestPolicySummary,origin_request_policy_summary +OriginShield,origin_shield +OriginShieldRegion,origin_shield_region +OriginSnapshot,origin_snapshot +OriginSslProtocols,origin_ssl_protocols +Original,original +OriginalCountryCodeIso2,original_country_code_iso2 +OriginalIops,original_iops +OriginalMessage,original_message +OriginalMessageId,original_message_id +OriginalMultiAttachEnabled,original_multi_attach_enabled +OriginalName,original_name +OriginalParent,original_parent +OriginalPhoneNumber,original_phone_number +OriginalRuleSetName,original_rule_set_name +OriginalSchema,original_schema +OriginalScore,original_score +OriginalSize,original_size +OriginalSnapshotCreateTime,original_snapshot_create_time +OriginalSourceFileSystemArn,original_source_file_system_arn +OriginalStatusCode,original_status_code +OriginalTextCharacters,original_text_characters +OriginalThroughput,original_throughput +OriginalTypeArn,original_type_arn +OriginalTypeName,original_type_name +OriginalVolumeType,original_volume_type +Origination,origination +OriginationIdentities,origination_identities +OriginationIdentity,origination_identity +OriginationIdentityArn,origination_identity_arn +OriginationIdentityMetadata,origination_identity_metadata +OriginationNumber,origination_number +OriginationPhoneNumber,origination_phone_number +OriginationRoute,origination_route +Origins,origins +Os,os +OsArchitecture,os_architecture +OsType,os_type +OsVersion,os_version +OtaaV1_0_x,otaa_v1_0_x +OtaaV1_1,otaa_v1_1 +Other,other +OtherCategories,other_categories +OtherCount,other_count +OtherMetadataValueList,other_metadata_value_list +OtherMetadataValueListItem,other_metadata_value_list_item +OtherName,other_name +OtherNonCompliantCount,other_non_compliant_count +OtherPolicies,other_policies +Otp,otp +OutOfCapacityException,out_of_capacity_exception +OutPutS3Location,out_put_s3_location +OutboundCall,outbound_call +OutboundCallConfig,outbound_call_config +OutboundCallerConfig,outbound_caller_config +OutboundCallerIdName,outbound_caller_id_name +OutboundCallerIdNumberId,outbound_caller_id_number_id +OutboundCalling,outbound_calling +OutboundCallsEnabled,outbound_calls_enabled +OutboundConnection,outbound_connection +OutboundConnectionStatus,outbound_connection_status +OutboundContactNotPermittedException,outbound_contact_not_permitted_exception +OutboundCrossClusterSearchConnection,outbound_cross_cluster_search_connection +OutboundCrossClusterSearchConnectionStatus,outbound_cross_cluster_search_connection_status +OutboundEventsHTTPSEndpoint,outbound_events_https_endpoint +OutboundFlowId,outbound_flow_id +OutboundHeader,outbound_header +OutboundHostName,outbound_host_name +OutboundIp,outbound_ip +OutboundMMS,outbound_mms +OutboundSMS,outbound_sms +OutboundShipment,outbound_shipment +Outcome,outcome +OutgoingCertificate,outgoing_certificate +OutgoingDukptAttributes,outgoing_dukpt_attributes +OutgoingEncryptionAttributes,outgoing_encryption_attributes +OutgoingKeyIdentifier,outgoing_key_identifier +OutgoingTranslationAttributes,outgoing_translation_attributes +OutlierDetection,outlier_detection +OutlierVisibility,outlier_visibility +OutlineColor,outline_color +OutlineSize,outline_size +Outpost,outpost +OutpostArn,outpost_arn +OutpostCapable,outpost_capable +OutpostConfigRequest,outpost_config_request +OutpostConfigResponse,outpost_config_response +OutpostId,outpost_id +OutpostIdentifier,outpost_identifier +OutpostIdentifierFilter,outpost_identifier_filter +OutpostMode,outpost_mode +OutpostOfflineException,outpost_offline_exception +OutpostResolver,outpost_resolver +OutpostResolvers,outpost_resolvers +Outposts,outposts +OutpostsId,outposts_id +Output,output +OutputArn,output_arn +OutputArtifact,output_artifact +OutputArtifacts,output_artifacts +OutputArtifactsToRemove,output_artifacts_to_remove +OutputAttribute,output_attribute +OutputBand,output_band +OutputBands,output_bands +OutputBucket,output_bucket +OutputBucketName,output_bucket_name +OutputBytes,output_bytes +OutputChannel,output_channel +OutputChannelMapping,output_channel_mapping +OutputChannels,output_channels +OutputColumn,output_column +OutputColumnName,output_column_name +OutputColumns,output_columns +OutputCompression,output_compression +OutputConfig,output_config +OutputConfigInput,output_config_input +OutputContext,output_context +OutputDataConfig,output_data_config +OutputDataType,output_data_type +OutputDatasetS3Uri,output_dataset_s3_uri +OutputDescription,output_description +OutputDescriptions,output_descriptions +OutputDestination,output_destination +OutputDestinationSettings,output_destination_settings +OutputDetail,output_detail +OutputDetails,output_details +OutputEncryptionKMSKeyId,output_encryption_kms_key_id +OutputFileUriValue,output_file_uri_value +OutputFilter,output_filter +OutputFormat,output_format +OutputFormatConfiguration,output_format_configuration +OutputFormatOptions,output_format_options +OutputGroup,output_group +OutputGroupDetail,output_group_detail +OutputGroupDetails,output_group_details +OutputGroupSettings,output_group_settings +OutputGroups,output_groups +OutputId,output_id +OutputKey,output_key +OutputKeyPrefix,output_key_prefix +OutputKeys,output_keys +OutputLocation,output_location +OutputLocationRef,output_location_ref +OutputLocationType,output_location_type +OutputLockingMode,output_locking_mode +OutputLockingSettings,output_locking_settings +OutputLogEvent,output_log_event +OutputName,output_name +OutputNotebookFormat,output_notebook_format +OutputNotebookS3Location,output_notebook_s3_location +OutputNotebookS3LocationForOutput,output_notebook_s3_location_for_output +OutputNotebookS3LocationFromInput,output_notebook_s3_location_from_input +OutputNotebookURI,output_notebook_uri +OutputPackageName,output_package_name +OutputPackageVersion,output_package_version +OutputParameter,output_parameter +OutputParameters,output_parameters +OutputRectangle,output_rectangle +OutputReservedInstancesWillExpireAt,output_reserved_instances_will_expire_at +OutputResolution,output_resolution +OutputResolutionResamplingInput,output_resolution_resampling_input +OutputResolutionStackInput,output_resolution_stack_input +OutputResources,output_resources +OutputRows,output_rows +OutputS3BucketName,output_s3_bucket_name +OutputS3KeyPrefix,output_s3_key_prefix +OutputS3Location,output_s3_location +OutputS3Object,output_s3_object +OutputS3Path,output_s3_path +OutputS3Region,output_s3_region +OutputS3Uri,output_s3_uri +OutputSchemaVersion,output_schema_version +OutputSchemas,output_schemas +OutputSdt,output_sdt +OutputSelection,output_selection +OutputSerialization,output_serialization +OutputSettings,output_settings +OutputSource,output_source +OutputSourceId,output_source_id +OutputSourceType,output_source_type +OutputStage,output_stage +OutputStartIndex,output_start_index +OutputTimingSource,output_timing_source +OutputType,output_type +OutputUpdate,output_update +OutputUpdates,output_updates +OutputUri,output_uri +OutputUrl,output_url +OutputValue,output_value +OutputVariablesSizeExceededException,output_variables_size_exceeded_exception +Outputs,outputs +OutsideIpAddress,outside_ip_address +OutsideIpAddressType,outside_ip_address_type +OutstandingVoteCount,outstanding_vote_count +Overage,overage +OverallBestTrainingJob,overall_best_training_job +OverallPlacement,overall_placement +OverallSeverity,overall_severity +OverallTestResultItem,overall_test_result_item +OverallTestResults,overall_test_results +OverallVolume,overall_volume +OverflowColumnHeaderVisibility,overflow_column_header_visibility +Overlap,overlap +OverlapStatus,overlap_status +Overridden,overridden +OverriddenAction,overridden_action +OverriddenContactIds,overridden_contact_ids +OverriddenParameters,overridden_parameters +Override,override +OverrideAction,override_action +OverrideAlreadySetException,override_already_set_exception +OverrideArtifactName,override_artifact_name +OverrideButtonConfiguration,override_button_configuration +OverrideDatasetParameterOperation,override_dataset_parameter_operation +OverrideOptions,override_options +OverrideParameters,override_parameters +OverridePullRequestApprovalRulesInput,override_pull_request_approval_rules_input +OverrideRejection,override_rejection +OverrideStatusRequiredException,override_status_required_exception +Overrides,overrides +OversizeHandling,oversize_handling +OversizedConfigurationItemException,oversized_configuration_item_exception +Overview,overview +Overwrite,overwrite +OverwriteExisting,overwrite_existing +OverwriteExtensionPack,overwrite_extension_pack +OverwriteMode,overwrite_mode +Owner,owner +OwnerAccount,owner_account +OwnerAccountId,owner_account_id +OwnerAlias,owner_alias +OwnerDirectoryDescription,owner_directory_description +OwnerDirectoryId,owner_directory_id +OwnerFilter,owner_filter +OwnerGid,owner_gid +OwnerId,owner_id +OwnerIdentifier,owner_identifier +OwnerIds,owner_ids +OwnerInformation,owner_information +OwnerName,owner_name +OwnerSetting,owner_setting +OwnerType,owner_type +OwnerUid,owner_uid +Owners,owners +OwnershipControls,ownership_controls +OwnershipControlsRule,ownership_controls_rule +OwnershipType,ownership_type +OwnershipVerificationCertificateArn,ownership_verification_certificate_arn +OwnershipVerificationStatus,ownership_verification_status +OwningAccount,owning_account +OwningAccountId,owning_account_id +OwningAccounts,owning_accounts +OwningService,owning_service +P10,p10 +P50,p50 +P75,p75 +P85,p85 +P90,p90 +P95,p95 +P95Metrics,p95_metrics +P99,p99 +P999,p999 +PENDING,pending +PIIDetection,pii_detection +PITPolicyRule,pit_policy_rule +PSTNDialIn,pstn_dial_in +PSTNEnabled,pstn_enabled +PUSH,push +PackageAggregation,package_aggregation +PackageAggregationResponse,package_aggregation_response +PackageArn,package_arn +PackageDependency,package_dependency +PackageDescription,package_description +PackageDetails,package_details +PackageDetailsList,package_details_list +PackageFilter,package_filter +PackageID,package_id +PackageId,package_id +PackageImportJob,package_import_job +PackageImportJobInputConfig,package_import_job_input_config +PackageImportJobOutput,package_import_job_output +PackageImportJobOutputConfig,package_import_job_output_config +PackageImportJobs,package_import_jobs +PackageListItem,package_list_item +PackageManager,package_manager +PackageName,package_name +PackageObject,package_object +PackageObjects,package_objects +PackageOriginConfiguration,package_origin_configuration +PackageOriginRestrictions,package_origin_restrictions +PackagePatchVersion,package_patch_version +PackageSource,package_source +PackageStatus,package_status +PackageSummary,package_summary +PackageType,package_type +PackageVersion,package_version +PackageVersionDescription,package_version_description +PackageVersionError,package_version_error +PackageVersionHistory,package_version_history +PackageVersionHistoryList,package_version_history_list +PackageVersionInputConfig,package_version_input_config +PackageVersionOrigin,package_version_origin +PackageVersionOutputConfig,package_version_output_config +PackageVersionSummary,package_version_summary +PackageVulnerabilityDetails,package_vulnerability_details +Packages,packages +Packaging,packaging +PackagingConfiguration,packaging_configuration +PackagingConfigurationId,packaging_configuration_id +PackagingConfigurations,packaging_configurations +PackagingGroup,packaging_group +PackagingGroupId,packaging_group_id +PackagingGroups,packaging_groups +PackagingType,packaging_type +PackedPolicySize,packed_policy_size +PackedPolicyTooLargeException,packed_policy_too_large_exception +PacketField,packet_field +PacketHeaderStatement,packet_header_statement +PacketHeaderStatementRequest,packet_header_statement_request +PacketIdentifiersMap,packet_identifiers_map +PacketLength,packet_length +PacketsPerSecond,packets_per_second +PadVideo,pad_video +Padding,padding +PaddingControl,padding_control +PaddingPolicy,padding_policy +PaddingTolerance,padding_tolerance +PaddingType,padding_type +Page,page +PageArn,page_arn +PageBreakConfiguration,page_break_configuration +PageClassification,page_classification +PageConfiguration,page_configuration +PageFieldMappings,page_field_mappings +PageId,page_id +PageNumber,page_number +PageResolutions,page_resolutions +PageSize,page_size +PageSizeBytes,page_size_bytes +PageToken,page_token +PageType,page_type +PageTypes,page_types +PagerDutyConfiguration,pager_duty_configuration +PagerDutyIncidentConfiguration,pager_duty_incident_configuration +PagerDutyIncidentDetail,pager_duty_incident_detail +Pages,pages +PaginatedLayoutConfiguration,paginated_layout_configuration +PaginatedReportOptions,paginated_report_options +PaginationConfiguration,pagination_configuration +PaginationToken,pagination_token +PaginationTokenExpiredException,pagination_token_expired_exception +PanSequenceNumber,pan_sequence_number +PanelConfiguration,panel_configuration +PanelTitleOptions,panel_title_options +PaperCanvasSizeOptions,paper_canvas_size_options +PaperMargin,paper_margin +PaperOrientation,paper_orientation +PaperSize,paper_size +Par,par +ParControl,par_control +ParDenominator,par_denominator +ParNumerator,par_numerator +ParallelAsmReadThreads,parallel_asm_read_threads +ParallelDataConfig,parallel_data_config +ParallelDataDataLocation,parallel_data_data_location +ParallelDataNames,parallel_data_names +ParallelDataProperties,parallel_data_properties +ParallelDataPropertiesList,parallel_data_properties_list +ParallelLoadThreads,parallel_load_threads +Parallelism,parallelism +ParallelismConfiguration,parallelism_configuration +ParallelismConfigurationDescription,parallelism_configuration_description +ParallelismConfigurationUpdate,parallelism_configuration_update +ParallelismPerKPU,parallelism_per_kpu +ParallelismPerKPUUpdate,parallelism_per_kpu_update +ParallelismUpdate,parallelism_update +ParallelizationFactor,parallelization_factor +Param,param +Parameter,parameter +ParameterAdditions,parameter_additions +ParameterAlreadyExists,parameter_already_exists +ParameterApplyErrorDescription,parameter_apply_error_description +ParameterApplyStatus,parameter_apply_status +ParameterAttribute,parameter_attribute +ParameterConstraints,parameter_constraints +ParameterControl,parameter_control +ParameterControlId,parameter_control_id +ParameterControls,parameter_controls +ParameterDateTimePickerControl,parameter_date_time_picker_control +ParameterDeclaration,parameter_declaration +ParameterDeclarations,parameter_declarations +ParameterDefinition,parameter_definition +ParameterDefinitions,parameter_definitions +ParameterDropDownControl,parameter_drop_down_control +ParameterFilters,parameter_filters +ParameterGroup,parameter_group +ParameterGroupAlreadyExistsFault,parameter_group_already_exists_fault +ParameterGroupFamily,parameter_group_family +ParameterGroupName,parameter_group_name +ParameterGroupNames,parameter_group_names +ParameterGroupNotFoundFault,parameter_group_not_found_fault +ParameterGroupQuotaExceededFault,parameter_group_quota_exceeded_fault +ParameterGroupStatus,parameter_group_status +ParameterGroups,parameter_groups +ParameterHistory,parameter_history +ParameterInlinePolicy,parameter_inline_policy +ParameterKey,parameter_key +ParameterLimitExceeded,parameter_limit_exceeded +ParameterListControl,parameter_list_control +ParameterMapEntry,parameter_map_entry +ParameterMapping,parameter_mapping +ParameterMaxVersionLimitExceeded,parameter_max_version_limit_exceeded +ParameterMetadata,parameter_metadata +ParameterName,parameter_name +ParameterNameValue,parameter_name_value +ParameterNameValues,parameter_name_values +ParameterNames,parameter_names +ParameterNotFound,parameter_not_found +ParameterObject,parameter_object +ParameterOverrides,parameter_overrides +ParameterPatternMismatchException,parameter_pattern_mismatch_exception +ParameterRange,parameter_range +ParameterRanges,parameter_ranges +ParameterRemovals,parameter_removals +ParameterSelectableValues,parameter_selectable_values +ParameterSliderControl,parameter_slider_control +ParameterSpec,parameter_spec +ParameterStringFilter,parameter_string_filter +ParameterTextAreaControl,parameter_text_area_control +ParameterTextFieldControl,parameter_text_field_control +ParameterType,parameter_type +ParameterValue,parameter_value +ParameterValueConfigurations,parameter_value_configurations +ParameterValueType,parameter_value_type +ParameterValues,parameter_values +ParameterVersion,parameter_version +ParameterVersionLabelLimitExceeded,parameter_version_label_limit_exceeded +ParameterVersionNotFound,parameter_version_not_found +ParameterizedStatement,parameterized_statement +Parameters,parameters +ParametersFilter,parameters_filter +ParametersInCacheKeyAndForwardedToOrigin,parameters_in_cache_key_and_forwarded_to_origin +ParametersToDelete,parameters_to_delete +ParametersToRemove,parameters_to_remove +ParametersValidTo,parameters_valid_to +ParametersValidUntilTimestamp,parameters_valid_until_timestamp +ParametricCloudWatchMonitoringConfiguration,parametric_cloud_watch_monitoring_configuration +ParametricConfigurationOverrides,parametric_configuration_overrides +ParametricMonitoringConfiguration,parametric_monitoring_configuration +ParametricS3MonitoringConfiguration,parametric_s3_monitoring_configuration +Pardot,pardot +PardotConnectorProfileCredentials,pardot_connector_profile_credentials +PardotConnectorProfileProperties,pardot_connector_profile_properties +PardotSourceProperties,pardot_source_properties +Parent,parent +ParentArn,parent_arn +ParentAutomationExecutionId,parent_automation_execution_id +ParentBotNetwork,parent_bot_network +ParentChangeSetId,parent_change_set_id +ParentCommitDoesNotExistException,parent_commit_does_not_exist_exception +ParentCommitIdOutdatedException,parent_commit_id_outdated_exception +ParentCommitIdRequiredException,parent_commit_id_required_exception +ParentComponent,parent_component +ParentEntityUpdateRequest,parent_entity_update_request +ParentFolderArn,parent_folder_arn +ParentFolderId,parent_folder_id +ParentGroupId,parent_group_id +ParentHandshakeId,parent_handshake_id +ParentHyperParameterTuningJob,parent_hyper_parameter_tuning_job +ParentHyperParameterTuningJobs,parent_hyper_parameter_tuning_jobs +ParentId,parent_id +ParentJobId,parent_job_id +ParentLinks,parent_links +ParentName,parent_name +ParentNotFoundException,parent_not_found_exception +ParentPid,parent_pid +ParentReadinessScopes,parent_readiness_scopes +ParentRecoveryPointArn,parent_recovery_point_arn +ParentReference,parent_reference +ParentSavingsPlanOffering,parent_savings_plan_offering +ParentShardId,parent_shard_id +ParentShards,parent_shards +ParentSnapshotId,parent_snapshot_id +ParentUuid,parent_uuid +ParentVolumeId,parent_volume_id +ParentZoneId,parent_zone_id +ParentZoneName,parent_zone_name +Parents,parents +ParentsOfAlarmName,parents_of_alarm_name +Parquet,parquet +ParquetConfiguration,parquet_configuration +ParquetSerDe,parquet_ser_de +ParquetTimestampInMillisecond,parquet_timestamp_in_millisecond +ParquetVersion,parquet_version +ParseFailures,parse_failures +ParsedInputRecords,parsed_input_records +ParsingException,parsing_exception +Part,part +PartListElement,part_list_element +PartNumber,part_number +PartNumberMarker,part_number_marker +PartOfSpeech,part_of_speech +PartOfSpeechTag,part_of_speech_tag +PartSizeInBytes,part_size_in_bytes +PartialFailure,partial_failure +PartialFailureMessage,partial_failure_message +PartialFailureReasons,partial_failure_reasons +PartialMatch,partial_match +PartialMatches,partial_matches +PartialResultsStability,partial_results_stability +Participant,participant +ParticipantCredentials,participant_credentials +ParticipantDetails,participant_details +ParticipantDetailsToAdd,participant_details_to_add +ParticipantId,participant_id +ParticipantPhoneNumbers,participant_phone_numbers +ParticipantRole,participant_role +ParticipantSummary,participant_summary +ParticipantTimerConfigList,participant_timer_config_list +ParticipantTimerConfiguration,participant_timer_configuration +ParticipantToken,participant_token +ParticipantTokenConfiguration,participant_token_configuration +ParticipantTokenCredentials,participant_token_credentials +Participants,participants +ParticipatingGateways,participating_gateways +ParticipatingResource,participating_resource +ParticipatingServer,participating_server +Parties,parties +Partition,partition +PartitionBy,partition_by +PartitionColumn,partition_column +PartitionColumns,partition_columns +PartitionCount,partition_count +PartitionEndDate,partition_end_date +PartitionError,partition_error +PartitionIncludeSchemaTable,partition_include_schema_table +PartitionIndex,partition_index +PartitionIndexDescriptor,partition_index_descriptor +PartitionIndexDescriptorList,partition_index_descriptor_list +PartitionIndexes,partition_indexes +PartitionInput,partition_input +PartitionInputList,partition_input_list +PartitionKey,partition_key +PartitionKeyPath,partition_key_path +PartitionKeys,partition_keys +PartitionLoadFrequency,partition_load_frequency +PartitionNumber,partition_number +PartitionObjects,partition_objects +PartitionPredicate,partition_predicate +PartitionSerialList,partition_serial_list +PartitionStartDate,partition_start_date +PartitionValueList,partition_value_list +PartitionValues,partition_values +Partitions,partitions +PartitionsToDelete,partitions_to_delete +PartitionsToGet,partitions_to_get +PartnerAccountId,partner_account_id +PartnerEventSource,partner_event_source +PartnerEventSourceAccount,partner_event_source_account +PartnerEventSourceAccounts,partner_event_source_accounts +PartnerEventSources,partner_event_sources +PartnerIntegrationInfo,partner_integration_info +PartnerIntegrationInfoList,partner_integration_info_list +PartnerIntegrationInputMessage,partner_integration_input_message +PartnerIntegrationOutputMessage,partner_integration_output_message +PartnerName,partner_name +PartnerNotFoundFault,partner_not_found_fault +PartnerProfileId,partner_profile_id +PartnerType,partner_type +PartnerWatermarking,partner_watermarking +Parts,parts +PartsCount,parts_count +PartyName,party_name +PartyType,party_type +PartyTypeString,party_type_string +PassThroughSettings,pass_through_settings +PassiveIp,passive_ip +Passphrase,passphrase +PassthroughBehavior,passthrough_behavior +PassthroughControl,passthrough_control +Password,password +PasswordCount,password_count +PasswordData,password_data +PasswordField,password_field +PasswordLastUsed,password_last_used +PasswordLength,password_length +PasswordParam,password_param +PasswordPolicy,password_policy +PasswordPolicyType,password_policy_type +PasswordPolicyViolationException,password_policy_violation_exception +PasswordResetRequired,password_reset_required +PasswordResetRequiredException,password_reset_required_exception +PasswordReusePrevention,password_reuse_prevention +PasswordVerifier,password_verifier +Passwords,passwords +PatInterval,pat_interval +Patch,patch +PatchBaselineId,patch_baseline_id +PatchBaselineIdentity,patch_baseline_identity +PatchComplianceData,patch_compliance_data +PatchDocument,patch_document +PatchFilter,patch_filter +PatchFilterGroup,patch_filter_group +PatchFilters,patch_filters +PatchGroup,patch_group +PatchGroupPatchBaselineMapping,patch_group_patch_baseline_mapping +PatchGroups,patch_groups +PatchLevel,patch_level +PatchOperation,patch_operation +PatchOrchestratorFilter,patch_orchestrator_filter +PatchRule,patch_rule +PatchRuleGroup,patch_rule_group +PatchRules,patch_rules +PatchSet,patch_set +PatchSource,patch_source +PatchStatus,patch_status +PatchSummary,patch_summary +PatchVersion,patch_version +Patches,patches +Path,path +PathComponent,path_component +PathDoesNotExistException,path_does_not_exist_exception +PathFilter,path_filter +PathFormat,path_format +PathId,path_id +PathLoss,path_loss +PathMatch,path_match +PathName,path_name +PathOptions,path_options +PathParameterValues,path_parameter_values +PathPattern,path_pattern +PathPatternConditionConfig,path_pattern_condition_config +PathPatternConfig,path_pattern_config +PathPrefix,path_prefix +PathRequestFilter,path_request_filter +PathRequiredException,path_required_exception +PathResourceToId,path_resource_to_id +PathStatement,path_statement +PathStatementRequest,path_statement_request +PathToObjectIdentifiers,path_to_object_identifiers +PathToObjectIdentifiersList,path_to_object_identifiers_list +Paths,paths +Pattern,pattern +PatternName,pattern_name +PatternSetName,pattern_set_name +PatternTypeLimits,pattern_type_limits +Patterns,patterns +PauseCampaignRequest,pause_campaign_request +PauseCluster,pause_cluster +PauseClusterMessage,pause_cluster_message +PauseClusterResult,pause_cluster_result +PauseReplicationRequest,pause_replication_request +PauseServiceRequest,pause_service_request +PauseServiceResponse,pause_service_response +PauseStateScheduleActionSettings,pause_state_schedule_action_settings +PauseStateSettings,pause_state_settings +Payer,payer +PayerResponsibility,payer_responsibility +Payload,payload +PayloadConfig,payload_config +PayloadData,payload_data +PayloadFormatVersion,payload_format_version +PayloadPart,payload_part +PayloadTooLargeException,payload_too_large_exception +PayloadType,payload_type +PaymentDue,payment_due +PaymentOption,payment_option +PaymentTerm,payment_term +Pci,pci +PciId,pci_id +PcrControl,pcr_control +PcrPeriod,pcr_period +PcrPid,pcr_pid +PdfReport,pdf_report +PeakBandwidthInGbps,peak_bandwidth_in_gbps +PeakCalculation,peak_calculation +PeakRequestsPerSecond,peak_requests_per_second +PeerAccountId,peer_account_id +PeerAddress,peer_address +PeerAsn,peer_asn +PeerBgpAsn,peer_bgp_asn +PeerCoreNetworkId,peer_core_network_id +PeerEndpoint,peer_endpoint +PeerEventEndpoint,peer_event_endpoint +PeerLogs,peer_logs +PeerOwnerId,peer_owner_id +PeerRegion,peer_region +PeerTransitGatewayId,peer_transit_gateway_id +PeerVpcAwsAccountId,peer_vpc_aws_account_id +PeerVpcId,peer_vpc_id +PeerVpcResult,peer_vpc_result +Peering,peering +PeeringAttachmentId,peering_attachment_id +PeeringAttachmentStatus,peering_attachment_status +PeeringConnectionOptions,peering_connection_options +PeeringConnectionOptionsRequest,peering_connection_options_request +PeeringId,peering_id +PeeringOptions,peering_options +PeeringStatus,peering_status +PeeringTgwInfo,peering_tgw_info +PeeringType,peering_type +Peerings,peerings +PemEncodedCertificate,pem_encoded_certificate +Pending,pending +PendingActions,pending_actions +PendingAggregationRequest,pending_aggregation_request +PendingAggregationRequests,pending_aggregation_requests +PendingAuthenticationStrategy,pending_authentication_strategy +PendingCapacity,pending_capacity +PendingChange,pending_change +PendingChanges,pending_changes +PendingCloudWatchLogsExports,pending_cloud_watch_logs_exports +PendingCloudwatchLogsExports,pending_cloudwatch_logs_exports +PendingCreateStandbyWorkspacesRequest,pending_create_standby_workspaces_request +PendingDataReplicationMetadata,pending_data_replication_metadata +PendingDataReplicationMode,pending_data_replication_mode +PendingDeletion,pending_deletion +PendingDeletionWindowInDays,pending_deletion_window_in_days +PendingDeploymentSummary,pending_deployment_summary +PendingEngineVersion,pending_engine_version +PendingExpirationSubscribedDomains,pending_expiration_subscribed_domains +PendingHostInstanceType,pending_host_instance_type +PendingHuman,pending_human +PendingImportedDeviceCount,pending_imported_device_count +PendingLdapServerMetadata,pending_ldap_server_metadata +PendingLogDeliveryConfiguration,pending_log_delivery_configuration +PendingLogs,pending_logs +PendingMaintenance,pending_maintenance +PendingMaintenanceAction,pending_maintenance_action +PendingMaintenanceActionDetails,pending_maintenance_action_details +PendingMaintenanceActions,pending_maintenance_actions +PendingMaintenanceActionsMessage,pending_maintenance_actions_message +PendingModifiedRelationalDatabaseValues,pending_modified_relational_database_values +PendingModifiedServiceUpdate,pending_modified_service_update +PendingModifiedValues,pending_modified_values +PendingProductionVariantSummary,pending_production_variant_summary +PendingProperties,pending_properties +PendingRequests,pending_requests +PendingResource,pending_resource +PendingReviewVersion,pending_review_version +PendingSecurityGroups,pending_security_groups +PendingStandbyRequests,pending_standby_requests +PendingTaskCount,pending_task_count +PendingUpdates,pending_updates +PendingVerification,pending_verification +PendingWindowInDays,pending_window_in_days +PerHourPartition,per_hour_partition +PerObjectStatus,per_object_status +PerUnitStorageThroughput,per_unit_storage_throughput +PercentComplete,percent_complete +PercentDone,percent_done +PercentEnabled,percent_enabled +PercentOfClientLocationImpacted,percent_of_client_location_impacted +PercentOfGraphUtilization,percent_of_graph_utilization +PercentOfGraphUtilizationUpdatedTime,percent_of_graph_utilization_updated_time +PercentOfTotalTrafficImpacted,percent_of_total_traffic_impacted +PercentPair,percent_pair +PercentProgress,percent_progress +PercentRange,percent_range +PercentTraffic,percent_traffic +PercentVisibleRange,percent_visible_range +Percentage,percentage +PercentageComplete,percentage_complete +PercentageCompleteOnRollback,percentage_complete_on_rollback +PercentageDisplayFormatConfiguration,percentage_display_format_configuration +PercentageValue,percentage_value +Percentile,percentile +PercentileAggregation,percentile_aggregation +PercentileValue,percentile_value +PerformAutoML,perform_auto_ml +PerformCheckOnly,perform_check_only +PerformHPO,perform_hpo +Performance,performance +PerformanceInsightsEnabled,performance_insights_enabled +PerformanceInsightsKMSKeyId,performance_insights_kms_key_id +PerformanceInsightsKmsKeyId,performance_insights_kms_key_id +PerformanceInsightsMetric,performance_insights_metric +PerformanceInsightsMetricDimensionGroup,performance_insights_metric_dimension_group +PerformanceInsightsMetricQuery,performance_insights_metric_query +PerformanceInsightsMetrics,performance_insights_metrics +PerformanceInsightsMetricsDetail,performance_insights_metrics_detail +PerformanceInsightsReferenceComparisonValues,performance_insights_reference_comparison_values +PerformanceInsightsReferenceData,performance_insights_reference_data +PerformanceInsightsReferenceMetric,performance_insights_reference_metric +PerformanceInsightsReferenceScalar,performance_insights_reference_scalar +PerformanceInsightsRetentionPeriod,performance_insights_retention_period +PerformanceInsightsStat,performance_insights_stat +PerformanceLocalHealthEventsConfig,performance_local_health_events_config +PerformanceMeasurement,performance_measurement +PerformanceMetrics,performance_metrics +PerformanceMode,performance_mode +PerformanceScoreThreshold,performance_score_threshold +Period,period +PeriodAlignment,period_alignment +PeriodInSeconds,period_in_seconds +PeriodOverPeriod,period_over_period +PeriodOverPeriodComputation,period_over_period_computation +PeriodSize,period_size +PeriodTimeGranularity,period_time_granularity +PeriodToDate,period_to_date +PeriodToDateComputation,period_to_date_computation +PeriodTriggers,period_triggers +PeriodType,period_type +PeriodUnit,period_unit +PeriodValue,period_value +PeriodsBackward,periods_backward +PeriodsForward,periods_forward +Permanent,permanent +PermanentDeletionTimeInDays,permanent_deletion_time_in_days +PermanentRestore,permanent_restore +Permission,permission +PermissionAlreadyExistsException,permission_already_exists_exception +PermissionConfiguration,permission_configuration +PermissionEntry,permission_entry +PermissionGroup,permission_group +PermissionGroupByUser,permission_group_by_user +PermissionGroupParams,permission_group_params +PermissionInfo,permission_info +PermissionLimitExceededException,permission_limit_exceeded_exception +PermissionModel,permission_model +PermissionPolicy,permission_policy +PermissionSet,permission_set +PermissionSetArn,permission_set_arn +PermissionSetProvisioningStatus,permission_set_provisioning_status +PermissionSetProvisioningStatusMetadata,permission_set_provisioning_status_metadata +PermissionSets,permission_sets +PermissionSetsProvisioningStatus,permission_sets_provisioning_status +PermissionState,permission_state +PermissionType,permission_type +PermissionTypeMismatchException,permission_type_mismatch_exception +PermissionValues,permission_values +PermissionVersionsLimitExceededException,permission_versions_limit_exceeded_exception +Permissions,permissions +PermissionsBoundary,permissions_boundary +PermissionsBoundaryArn,permissions_boundary_arn +PermissionsBoundaryDecisionDetail,permissions_boundary_decision_detail +PermissionsBoundaryPolicyInputList,permissions_boundary_policy_input_list +PermissionsBoundaryType,permissions_boundary_type +PermissionsBoundaryUsageCount,permissions_boundary_usage_count +PermissionsMode,permissions_mode +PermissionsWithGrantOption,permissions_with_grant_option +PermittedFileTypes,permitted_file_types +PermittedPublicSecurityGroupRuleRanges,permitted_public_security_group_rule_ranges +Persistence,persistence +Persistent,persistent +PersistentChat,persistent_chat +PersistentStorage,persistent_storage +PersistentStorageConfiguration,persistent_storage_configuration +Person,person +PersonDetail,person_detail +PersonDetection,person_detection +PersonMatch,person_match +Persona,persona +PersonalEmailAddress,personal_email_address +PersonalPIN,personal_pin +PersonalizationThresholdSeconds,personalization_threshold_seconds +Personas,personas +PersonasSummary,personas_summary +Persons,persons +PersonsIndeterminate,persons_indeterminate +PersonsWithRequiredEquipment,persons_with_required_equipment +PersonsWithoutRequiredEquipment,persons_without_required_equipment +Phase,phase +Phase1DHGroupNumbers,phase1_dh_group_numbers +Phase1DHGroupNumbersListValue,phase1_dh_group_numbers_list_value +Phase1DHGroupNumbersRequestListValue,phase1_dh_group_numbers_request_list_value +Phase1DhGroupNumbers,phase1_dh_group_numbers +Phase1EncryptionAlgorithms,phase1_encryption_algorithms +Phase1EncryptionAlgorithmsListValue,phase1_encryption_algorithms_list_value +Phase1EncryptionAlgorithmsRequestListValue,phase1_encryption_algorithms_request_list_value +Phase1IntegrityAlgorithms,phase1_integrity_algorithms +Phase1IntegrityAlgorithmsListValue,phase1_integrity_algorithms_list_value +Phase1IntegrityAlgorithmsRequestListValue,phase1_integrity_algorithms_request_list_value +Phase1LifetimeSeconds,phase1_lifetime_seconds +Phase2DHGroupNumbers,phase2_dh_group_numbers +Phase2DHGroupNumbersListValue,phase2_dh_group_numbers_list_value +Phase2DHGroupNumbersRequestListValue,phase2_dh_group_numbers_request_list_value +Phase2DhGroupNumbers,phase2_dh_group_numbers +Phase2EncryptionAlgorithms,phase2_encryption_algorithms +Phase2EncryptionAlgorithmsListValue,phase2_encryption_algorithms_list_value +Phase2EncryptionAlgorithmsRequestListValue,phase2_encryption_algorithms_request_list_value +Phase2IntegrityAlgorithms,phase2_integrity_algorithms +Phase2IntegrityAlgorithmsListValue,phase2_integrity_algorithms_list_value +Phase2IntegrityAlgorithmsRequestListValue,phase2_integrity_algorithms_request_list_value +Phase2LifetimeSeconds,phase2_lifetime_seconds +PhaseContext,phase_context +PhaseControl,phase_control +Phases,phases +PhoneConfig,phone_config +PhoneNumber,phone_number +PhoneNumberArn,phone_number_arn +PhoneNumberAssociation,phone_number_association +PhoneNumberCapabilities,phone_number_capabilities +PhoneNumberCountries,phone_number_countries +PhoneNumberCountry,phone_number_country +PhoneNumberCountryCode,phone_number_country_code +PhoneNumberCountryCodes,phone_number_country_codes +PhoneNumberDescription,phone_number_description +PhoneNumberError,phone_number_error +PhoneNumberErrors,phone_number_errors +PhoneNumberField,phone_number_field +PhoneNumberFields,phone_number_fields +PhoneNumberFilter,phone_number_filter +PhoneNumberId,phone_number_id +PhoneNumberIds,phone_number_ids +PhoneNumberInformation,phone_number_information +PhoneNumberOrder,phone_number_order +PhoneNumberOrderId,phone_number_order_id +PhoneNumberOrders,phone_number_orders +PhoneNumberPoolCountries,phone_number_pool_countries +PhoneNumberPrefix,phone_number_prefix +PhoneNumberQuickConnectConfig,phone_number_quick_connect_config +PhoneNumberStatus,phone_number_status +PhoneNumberSummary,phone_number_summary +PhoneNumberSummaryList,phone_number_summary_list +PhoneNumberType,phone_number_type +PhoneNumberTypes,phone_number_types +PhoneNumberValidateRequest,phone_number_validate_request +PhoneNumberValidateResponse,phone_number_validate_response +PhoneNumbers,phone_numbers +PhoneType,phone_type +PhoneTypeCode,phone_type_code +Phrases,phrases +PhysicalConnectionRequirements,physical_connection_requirements +PhysicalId,physical_id +PhysicalNetworkInterface,physical_network_interface +PhysicalResource,physical_resource +PhysicalResourceId,physical_resource_id +PhysicalResourceIdContext,physical_resource_id_context +PhysicalResourceIdContextKeyValuePair,physical_resource_id_context_key_value_pair +PhysicalTableId,physical_table_id +PhysicalTableMap,physical_table_map +PickupDetails,pickup_details +Pid,pid +PidMode,pid_mode +Pids,pids +PieChartAggregatedFieldWells,pie_chart_aggregated_field_wells +PieChartConfiguration,pie_chart_configuration +PieChartFieldWells,pie_chart_field_wells +PieChartSortConfiguration,pie_chart_sort_configuration +PieChartVisual,pie_chart_visual +PiiEntitiesDetectionJobFilter,pii_entities_detection_job_filter +PiiEntitiesDetectionJobProperties,pii_entities_detection_job_properties +PiiEntitiesDetectionJobPropertiesList,pii_entities_detection_job_properties_list +PiiEntity,pii_entity +PiiEntityTypes,pii_entity_types +PiiOutputDataConfig,pii_output_data_config +PiiType,pii_type +PillarDifference,pillar_difference +PillarDifferences,pillar_differences +PillarId,pillar_id +PillarMetric,pillar_metric +PillarName,pillar_name +PillarNotes,pillar_notes +PillarPriorities,pillar_priorities +PillarReviewSummaries,pillar_review_summaries +PillarReviewSummary,pillar_review_summary +Pillars,pillars +PilotPower,pilot_power +PinBlock,pin_block +PinBlockFormat,pin_block_format +PinData,pin_data +PinDataLength,pin_data_length +PinOffset,pin_offset +PinValidationData,pin_validation_data +PinValidationDataPadCharacter,pin_validation_data_pad_character +PinVerificationKeyIndex,pin_verification_key_index +PingResponse,ping_response +PingSlotDr,ping_slot_dr +PingSlotFreq,ping_slot_freq +PingSlotPeriod,ping_slot_period +PingStatus,ping_status +Pinned,pinned +PinnedFieldOptions,pinned_field_options +PinnedLeftFields,pinned_left_fields +PinpointDestination,pinpoint_destination +Pipe,pipe +PipeEnrichmentHttpParameters,pipe_enrichment_http_parameters +PipeEnrichmentParameters,pipe_enrichment_parameters +PipeSourceActiveMQBrokerParameters,pipe_source_active_mq_broker_parameters +PipeSourceDynamoDBStreamParameters,pipe_source_dynamo_db_stream_parameters +PipeSourceKinesisStreamParameters,pipe_source_kinesis_stream_parameters +PipeSourceManagedStreamingKafkaParameters,pipe_source_managed_streaming_kafka_parameters +PipeSourceParameters,pipe_source_parameters +PipeSourceRabbitMQBrokerParameters,pipe_source_rabbit_mq_broker_parameters +PipeSourceSelfManagedKafkaParameters,pipe_source_self_managed_kafka_parameters +PipeSourceSqsQueueParameters,pipe_source_sqs_queue_parameters +PipeTargetBatchJobParameters,pipe_target_batch_job_parameters +PipeTargetCloudWatchLogsParameters,pipe_target_cloud_watch_logs_parameters +PipeTargetEcsTaskParameters,pipe_target_ecs_task_parameters +PipeTargetEventBridgeEventBusParameters,pipe_target_event_bridge_event_bus_parameters +PipeTargetHttpParameters,pipe_target_http_parameters +PipeTargetKinesisStreamParameters,pipe_target_kinesis_stream_parameters +PipeTargetLambdaFunctionParameters,pipe_target_lambda_function_parameters +PipeTargetParameters,pipe_target_parameters +PipeTargetRedshiftDataParameters,pipe_target_redshift_data_parameters +PipeTargetSageMakerPipelineParameters,pipe_target_sage_maker_pipeline_parameters +PipeTargetSqsQueueParameters,pipe_target_sqs_queue_parameters +PipeTargetStateMachineParameters,pipe_target_state_machine_parameters +Pipeline,pipeline +PipelineActivity,pipeline_activity +PipelineArn,pipeline_arn +PipelineBlueprint,pipeline_blueprint +PipelineBlueprintSummary,pipeline_blueprint_summary +PipelineConfig,pipeline_config +PipelineConfigurationBody,pipeline_configuration_body +PipelineContext,pipeline_context +PipelineDeclaration,pipeline_declaration +PipelineDefinition,pipeline_definition +PipelineDefinitionS3Location,pipeline_definition_s3_location +PipelineDeletedException,pipeline_deleted_exception +PipelineDescription,pipeline_description +PipelineDetail,pipeline_detail +PipelineDetails,pipeline_details +PipelineDisplayName,pipeline_display_name +PipelineExecution,pipeline_execution +PipelineExecutionArn,pipeline_execution_arn +PipelineExecutionDescription,pipeline_execution_description +PipelineExecutionDisplayName,pipeline_execution_display_name +PipelineExecutionFailureReason,pipeline_execution_failure_reason +PipelineExecutionNotFoundException,pipeline_execution_not_found_exception +PipelineExecutionNotStoppableException,pipeline_execution_not_stoppable_exception +PipelineExecutionStatus,pipeline_execution_status +PipelineExecutionStep,pipeline_execution_step +PipelineExecutionStepMetadata,pipeline_execution_step_metadata +PipelineExecutionSteps,pipeline_execution_steps +PipelineExecutionSummaries,pipeline_execution_summaries +PipelineExecutionSummary,pipeline_execution_summary +PipelineExperimentConfig,pipeline_experiment_config +PipelineId,pipeline_id +PipelineIdName,pipeline_id_name +PipelineInfo,pipeline_info +PipelineLockingSettings,pipeline_locking_settings +PipelineMetadata,pipeline_metadata +PipelineName,pipeline_name +PipelineNameInUseException,pipeline_name_in_use_exception +PipelineNamePrefix,pipeline_name_prefix +PipelineNotFoundException,pipeline_not_found_exception +PipelineObject,pipeline_object +PipelineOutputConfig,pipeline_output_config +PipelineParameterList,pipeline_parameter_list +PipelineParameters,pipeline_parameters +PipelinePauseStateSettings,pipeline_pause_state_settings +PipelineStatus,pipeline_status +PipelineStatusReason,pipeline_status_reason +PipelineSummaries,pipeline_summaries +PipelineSummary,pipeline_summary +PipelineVersionNotFoundException,pipeline_version_not_found_exception +Pipelines,pipelines +PipelinesRunningCount,pipelines_running_count +Pipes,pipes +Pitch,pitch +PivotFieldSortOptions,pivot_field_sort_options +PivotTableAggregatedFieldWells,pivot_table_aggregated_field_wells +PivotTableCellConditionalFormatting,pivot_table_cell_conditional_formatting +PivotTableConditionalFormatting,pivot_table_conditional_formatting +PivotTableConditionalFormattingOption,pivot_table_conditional_formatting_option +PivotTableConditionalFormattingScope,pivot_table_conditional_formatting_scope +PivotTableConfiguration,pivot_table_configuration +PivotTableDataPathOption,pivot_table_data_path_option +PivotTableFieldCollapseStateOption,pivot_table_field_collapse_state_option +PivotTableFieldCollapseStateTarget,pivot_table_field_collapse_state_target +PivotTableFieldOption,pivot_table_field_option +PivotTableFieldOptions,pivot_table_field_options +PivotTableFieldSubtotalOptions,pivot_table_field_subtotal_options +PivotTableFieldWells,pivot_table_field_wells +PivotTableOptions,pivot_table_options +PivotTablePaginatedReportOptions,pivot_table_paginated_report_options +PivotTableRowsLabelOptions,pivot_table_rows_label_options +PivotTableSortBy,pivot_table_sort_by +PivotTableSortConfiguration,pivot_table_sort_configuration +PivotTableTotalOptions,pivot_table_total_options +PivotTableVisual,pivot_table_visual +PivotTotalOptions,pivot_total_options +PixelAnomaly,pixel_anomaly +PixelPercent,pixel_percent +Place,place +PlaceGeometry,place_geometry +PlaceId,place_id +PlacedPlayerSession,placed_player_session +PlacedPlayerSessions,placed_player_sessions +Placeholder,placeholder +PlaceholderOptions,placeholder_options +Placement,placement +PlacementArn,placement_arn +PlacementConstraint,placement_constraint +PlacementConstraints,placement_constraints +PlacementDescription,placement_description +PlacementGroup,placement_group +PlacementGroupArn,placement_group_arn +PlacementGroupConfig,placement_group_config +PlacementGroupConfigs,placement_group_configs +PlacementGroupInfo,placement_group_info +PlacementGroups,placement_groups +PlacementId,placement_id +PlacementResponse,placement_response +PlacementStatistics,placement_statistics +PlacementStrategies,placement_strategies +PlacementStrategy,placement_strategy +PlacementSummary,placement_summary +PlacementTemplate,placement_template +PlacementTenancy,placement_tenancy +PlacementType,placement_type +PlainText,plain_text +PlainTextMessage,plain_text_message +PlainTextMessageType,plain_text_message_type +Plaintext,plaintext +Plan,plan +PlanId,plan_id +PlanName,plan_name +PlanType,plan_type +PlannedBudgetLimits,planned_budget_limits +PlannedEndTime,planned_end_time +PlannedStartTime,planned_start_time +PlanningStatistics,planning_statistics +PlanningTimeMillis,planning_time_millis +Platform,platform +PlatformApplication,platform_application +PlatformApplicationArn,platform_application_arn +PlatformApplicationDisabledException,platform_application_disabled_exception +PlatformApplications,platform_applications +PlatformArn,platform_arn +PlatformBranchLifecycleState,platform_branch_lifecycle_state +PlatformBranchName,platform_branch_name +PlatformBranchSummary,platform_branch_summary +PlatformBranchSummaryList,platform_branch_summary_list +PlatformCategory,platform_category +PlatformCommand,platform_command +PlatformDefinitionBundle,platform_definition_bundle +PlatformDescription,platform_description +PlatformDetails,platform_details +PlatformDevice,platform_device +PlatformDifferences,platform_differences +PlatformFilter,platform_filter +PlatformFramework,platform_framework +PlatformIdentifier,platform_identifier +PlatformInput,platform_input +PlatformLifecycleState,platform_lifecycle_state +PlatformName,platform_name +PlatformNotSupportedException,platform_not_supported_exception +PlatformOwner,platform_owner +PlatformProgrammingLanguage,platform_programming_language +PlatformScriptKey,platform_script_key +PlatformSoftwareVersion,platform_software_version +PlatformStatus,platform_status +PlatformSummary,platform_summary +PlatformSummaryList,platform_summary_list +PlatformTaskDefinitionIncompatibilityException,platform_task_definition_incompatibility_exception +PlatformType,platform_type +PlatformTypes,platform_types +PlatformUnknownException,platform_unknown_exception +PlatformVersion,platform_version +PlatformVersionStillReferencedException,platform_version_still_referenced_exception +Platforms,platforms +PlayReadyDrm,play_ready_drm +Playback,playback +PlaybackCompletionEvent,playback_completion_event +PlaybackConfiguration,playback_configuration +PlaybackConfigurationArn,playback_configuration_arn +PlaybackConfigurationName,playback_configuration_name +PlaybackDeviceCompatibility,playback_device_compatibility +PlaybackEndpointPrefix,playback_endpoint_prefix +PlaybackInterruptionEvent,playback_interruption_event +PlaybackKeyPair,playback_key_pair +PlaybackKeyPairSummary,playback_key_pair_summary +PlaybackMode,playback_mode +PlaybackUrl,playback_url +Player,player +PlayerAttributes,player_attributes +PlayerData,player_data +PlayerDataMap,player_data_map +PlayerId,player_id +PlayerIds,player_ids +PlayerLatencies,player_latencies +PlayerLatency,player_latency +PlayerLatencyPolicies,player_latency_policies +PlayerLatencyPolicy,player_latency_policy +PlayerSession,player_session +PlayerSessionCreationPolicy,player_session_creation_policy +PlayerSessionId,player_session_id +PlayerSessionStatusFilter,player_session_status_filter +PlayerSessions,player_sessions +Players,players +Playlist,playlist +PlaylistType,playlist_type +PlaylistWindowSeconds,playlist_window_seconds +Playlists,playlists +Plugin,plugin +PluginDescription,plugin_description +PluginName,plugin_name +PluginSummary,plugin_summary +PluginsS3ObjectVersion,plugins_s3_object_version +PluginsS3Path,plugins_s3_path +PmtInterval,pmt_interval +PmtPid,pmt_pid +PnOffset,pn_offset +PoAttributes,po_attributes +PoDetailAttributes,po_detail_attributes +Point,point +PointInTimeRecovery,point_in_time_recovery +PointInTimeRecoveryDescription,point_in_time_recovery_description +PointInTimeRecoveryEnabled,point_in_time_recovery_enabled +PointInTimeRecoverySpecification,point_in_time_recovery_specification +PointInTimeRecoveryStatus,point_in_time_recovery_status +PointInTimeRecoverySummary,point_in_time_recovery_summary +PointInTimeRecoveryUnavailableException,point_in_time_recovery_unavailable_exception +PointInTimeRestoreNotEnabledFault,point_in_time_restore_not_enabled_fault +PointOfInterest,point_of_interest +PointStyleOptions,point_style_options +PointsOfInterest,points_of_interest +PoisEndpoint,pois_endpoint +Policies,policies +PoliciesGrantingServiceAccess,policies_granting_service_access +PoliciesLimitExceededException,policies_limit_exceeded_exception +PoliciesType,policies_type +Policy,policy +PolicyARN,policy_arn +PolicyARNType,policy_arn_type +PolicyArn,policy_arn +PolicyArns,policy_arns +PolicyAttachment,policy_attachment +PolicyAttribute,policy_attribute +PolicyAttributeDescription,policy_attribute_description +PolicyAttributeDescriptions,policy_attribute_descriptions +PolicyAttributeTypeDescription,policy_attribute_type_description +PolicyAttributeTypeDescriptions,policy_attribute_type_descriptions +PolicyAttributes,policy_attributes +PolicyChangesInProgressException,policy_changes_in_progress_exception +PolicyComplianceDetail,policy_compliance_detail +PolicyComplianceStatus,policy_compliance_status +PolicyComplianceStatusList,policy_compliance_status_list +PolicyContent,policy_content +PolicyCountLimitExceededException,policy_count_limit_exceeded_exception +PolicyDescription,policy_description +PolicyDescriptions,policy_descriptions +PolicyDescriptorType,policy_descriptor_type +PolicyDetail,policy_detail +PolicyDetails,policy_details +PolicyDocument,policy_document +PolicyDurationSeconds,policy_duration_seconds +PolicyEnabled,policy_enabled +PolicyEnforcedException,policy_enforced_exception +PolicyErrorException,policy_error_exception +PolicyErrors,policy_errors +PolicyEvaluationException,policy_evaluation_exception +PolicyExistsCondition,policy_exists_condition +PolicyFilter,policy_filter +PolicyGeneration,policy_generation +PolicyGenerationDetails,policy_generation_details +PolicyGrantingServiceAccess,policy_granting_service_access +PolicyGroup,policy_group +PolicyGroups,policy_groups +PolicyHash,policy_hash +PolicyHashCondition,policy_hash_condition +PolicyId,policy_id +PolicyIds,policy_ids +PolicyInJson,policy_in_json +PolicyInUseException,policy_in_use_exception +PolicyInformation,policy_information +PolicyInputList,policy_input_list +PolicyItem,policy_item +PolicyLengthExceededException,policy_length_exceeded_exception +PolicyLevels,policy_levels +PolicyList,policy_list +PolicyName,policy_name +PolicyNames,policy_names +PolicyNotAttachableException,policy_not_attachable_exception +PolicyNotAttachedException,policy_not_attached_exception +PolicyNotFound,policy_not_found +PolicyNotFoundException,policy_not_found_exception +PolicyOption,policy_option +PolicyOwner,policy_owner +PolicyParameter,policy_parameter +PolicyPeriodInMinutes,policy_period_in_minutes +PolicyQualifierId,policy_qualifier_id +PolicyQualifierInfo,policy_qualifier_info +PolicyQualifiers,policy_qualifiers +PolicyReference,policy_reference +PolicyReferenceName,policy_reference_name +PolicyRevisionId,policy_revision_id +PolicyRole,policy_role +PolicyRoles,policy_roles +PolicyRule,policy_rule +PolicyRuleNumber,policy_rule_number +PolicyRuntime,policy_runtime +PolicySchema,policy_schema +PolicySizeLimitExceededException,policy_size_limit_exceeded_exception +PolicySourceArn,policy_source_arn +PolicyStatus,policy_status +PolicyStoreItem,policy_store_item +PolicySummary,policy_summary +PolicyTargetSummary,policy_target_summary +PolicyTemplateItem,policy_template_item +PolicyText,policy_text +PolicyToPath,policy_to_path +PolicyToPathList,policy_to_path_list +PolicyType,policy_type +PolicyTypeAlreadyEnabledException,policy_type_already_enabled_exception +PolicyTypeDescription,policy_type_description +PolicyTypeDescriptions,policy_type_descriptions +PolicyTypeName,policy_type_name +PolicyTypeNames,policy_type_names +PolicyTypeNotAvailableForOrganizationException,policy_type_not_available_for_organization_exception +PolicyTypeNotEnabledException,policy_type_not_enabled_exception +PolicyTypeNotFoundException,policy_type_not_found_exception +PolicyTypeScope,policy_type_scope +PolicyTypeSummary,policy_type_summary +PolicyTypes,policy_types +PolicyUpdateToken,policy_update_token +PolicyUsageFilter,policy_usage_filter +PolicyUser,policy_user +PolicyUsers,policy_users +PolicyValidationPassed,policy_validation_passed +PolicyVariables,policy_variables +PolicyVersion,policy_version +PolicyVersionId,policy_version_id +PolicyVersionIdentifier,policy_version_identifier +PolicyVersionList,policy_version_list +PoliticalView,political_view +PollForActivityTaskInput,poll_for_activity_task_input +PollForDecisionTaskInput,poll_for_decision_task_input +PollForJobsInput,poll_for_jobs_input +PollForJobsOutput,poll_for_jobs_output +PollForTaskInput,poll_for_task_input +PollForTaskOutput,poll_for_task_output +PollForThirdPartyJobsInput,poll_for_third_party_jobs_input +PollForThirdPartyJobsOutput,poll_for_third_party_jobs_output +PollTimeoutMs,poll_timeout_ms +PollingTime,polling_time +Polygon,polygon +PolygonGeometryInput,polygon_geometry_input +PoolARN,pool_arn +PoolARNs,pool_arns +PoolAddressRange,pool_address_range +PoolAddressRanges,pool_address_ranges +PoolArn,pool_arn +PoolCidrBlock,pool_cidr_block +PoolCidrBlocks,pool_cidr_blocks +PoolCidrs,pool_cidrs +PoolCount,pool_count +PoolDepth,pool_depth +PoolEntryDate,pool_entry_date +PoolFilter,pool_filter +PoolId,pool_id +PoolIds,pool_ids +PoolInfo,pool_info +PoolInformation,pool_information +PoolInfos,pool_infos +PoolName,pool_name +PoolOriginationIdentitiesFilter,pool_origination_identities_filter +PoolSize,pool_size +PoolState,pool_state +PoolStatus,pool_status +PoolTagSpecifications,pool_tag_specifications +Pools,pools +PopulationSize,population_size +Port,port +PortForwardingConfig,port_forwarding_config +PortInfo,port_info +PortMapping,port_mapping +PortMappings,port_mappings +PortName,port_name +PortNumber,port_number +PortOverride,port_override +PortOverrides,port_overrides +PortProbeAction,port_probe_action +PortProbeDetail,port_probe_detail +PortProbeDetails,port_probe_details +PortRange,port_range +PortRangeFilter,port_range_filter +PortRangeFromTo,port_range_from_to +PortRanges,port_ranges +PortRequired,port_required +PortSet,port_set +PortSets,port_sets +Portal,portal +PortalResource,portal_resource +PortalStatus,portal_status +PortalSummary,portal_summary +PortfolioDetail,portfolio_detail +PortfolioDetails,portfolio_details +PortfolioId,portfolio_id +PortfolioShareDetail,portfolio_share_detail +PortfolioShareDetails,portfolio_share_details +PortfolioShareToken,portfolio_share_token +PortfolioShareType,portfolio_share_type +Pose,pose +Position,position +PositionConfigurationItem,position_configuration_item +PositionConfigurationList,position_configuration_list +PositionFiltering,position_filtering +PositionProperties,position_properties +PositionSolverConfigurations,position_solver_configurations +PositionSolverDetails,position_solver_details +PositionalAccuracy,positional_accuracy +PositionalConstraint,positional_constraint +Positioning,positioning +Positive,positive +PositiveColor,positive_color +PosixPermissions,posix_permissions +PosixProfile,posix_profile +PosixUser,posix_user +PossibleRemediationAction,possible_remediation_action +PossibleRemediationActions,possible_remediation_actions +PossibleSecurityGroupRemediationActions,possible_security_group_remediation_actions +PostAction,post_action +PostAgentProfileRequest,post_agent_profile_request +PostAnalyticsProcessorSourceUri,post_analytics_processor_source_uri +PostAuthentication,post_authentication +PostAuthenticationLoginBanner,post_authentication_login_banner +PostCallAnalyticsSettings,post_call_analytics_settings +PostCommentForComparedCommitInput,post_comment_for_compared_commit_input +PostCommentForComparedCommitOutput,post_comment_for_compared_commit_output +PostCommentForPullRequestInput,post_comment_for_pull_request_input +PostCommentForPullRequestOutput,post_comment_for_pull_request_output +PostCommentReplyInput,post_comment_reply_input +PostCommentReplyOutput,post_comment_reply_output +PostConfirmation,post_confirmation +PostContentRequest,post_content_request +PostContentResponse,post_content_response +PostDialogCodeHookInvocationSpecification,post_dialog_code_hook_invocation_specification +PostExtractionHookConfiguration,post_extraction_hook_configuration +PostFilterSharpenStrength,post_filter_sharpen_strength +PostFilterSharpening,post_filter_sharpening +PostFulfillmentStatusSpecification,post_fulfillment_status_specification +PostLaunchActions,post_launch_actions +PostLaunchActionsStatus,post_launch_actions_status +PostProcessFirewallManagerRuleGroups,post_process_firewall_manager_rule_groups +PostSetupScriptDetails,post_setup_script_details +PostTemporalSharpening,post_temporal_sharpening +PostTemporalSharpeningStrength,post_temporal_sharpening_strength +PostTextRequest,post_text_request +PostTextResponse,post_text_response +PostToConnectionRequest,post_to_connection_request +PostTrainingConstraints,post_training_constraints +PostTrainingReport,post_training_report +PostalCode,postal_code +PostgreSQLCatalogSource,postgre_sql_catalog_source +PostgreSQLCatalogTarget,postgre_sql_catalog_target +PostgreSQLSettings,postgre_sql_settings +PostgreSqlDataProviderSettings,postgre_sql_data_provider_settings +PostgreSqlParameters,postgre_sql_parameters +PostureComplianceStatuses,posture_compliance_statuses +PotentialMatches,potential_matches +PowerConnector,power_connector +PowerDrawKva,power_draw_kva +PowerFeedDrop,power_feed_drop +PowerKva,power_kva +PowerPhase,power_phase +PrAllowed,pr_allowed +PreAction,pre_action +PreAuthentication,pre_authentication +PreAuthenticationLoginBanner,pre_authentication_login_banner +PreCoPassword,pre_co_password +PreExtractionHookConfiguration,pre_extraction_hook_configuration +PreHumanTaskLambdaArn,pre_human_task_lambda_arn +PreProcessFirewallManagerRuleGroups,pre_process_firewall_manager_rule_groups +PreSharedKey,pre_shared_key +PreSignUp,pre_sign_up +PreSignedLogUrl,pre_signed_log_url +PreSignedUrl,pre_signed_url +PreTokenGeneration,pre_token_generation +PreTrainingConstraints,pre_training_constraints +PreTrainingReport,pre_training_report +Precedence,precedence +Precision,precision +PrecisionRecallTradeoff,precision_recall_tradeoff +PreconditionFailed,precondition_failed +PreconditionFailedException,precondition_failed_exception +PreconditionNotMetException,precondition_not_met_exception +PreconditionsFailedException,preconditions_failed_exception +Predecessor,predecessor +PredecessorRuns,predecessor_runs +PredecessorsIncluded,predecessors_included +Predefined,predefined +PredefinedHierarchy,predefined_hierarchy +PredefinedIndices,predefined_indices +PredefinedLoadMetricSpecification,predefined_load_metric_specification +PredefinedLoadMetricType,predefined_load_metric_type +PredefinedMetricPairSpecification,predefined_metric_pair_specification +PredefinedMetricSpecification,predefined_metric_specification +PredefinedMetricType,predefined_metric_type +PredefinedScalingMetricSpecification,predefined_scaling_metric_specification +PredefinedScalingMetricType,predefined_scaling_metric_type +Predicate,predicate +PredicateList,predicate_list +Predicates,predicates +PredictEndpoint,predict_endpoint +PredictInput,predict_input +PredictOutput,predict_output +PredictedCapacity,predicted_capacity +PredictedIntent,predicted_intent +PredictedItem,predicted_item +Prediction,prediction +PredictionExplanations,prediction_explanations +PredictionInterval,prediction_interval +PredictionIntervalLevel,prediction_interval_level +PredictionIntervalLowerBound,prediction_interval_lower_bound +PredictionIntervalUpperBound,prediction_interval_upper_bound +PredictionTimeRange,prediction_time_range +Predictions,predictions +PredictiveDialerConfig,predictive_dialer_config +PredictiveScalingConfiguration,predictive_scaling_configuration +PredictiveScalingCustomizedCapacityMetric,predictive_scaling_customized_capacity_metric +PredictiveScalingCustomizedLoadMetric,predictive_scaling_customized_load_metric +PredictiveScalingCustomizedScalingMetric,predictive_scaling_customized_scaling_metric +PredictiveScalingMaxCapacityBehavior,predictive_scaling_max_capacity_behavior +PredictiveScalingMaxCapacityBuffer,predictive_scaling_max_capacity_buffer +PredictiveScalingMetricSpecification,predictive_scaling_metric_specification +PredictiveScalingMode,predictive_scaling_mode +PredictiveScalingPredefinedLoadMetric,predictive_scaling_predefined_load_metric +PredictiveScalingPredefinedMetricPair,predictive_scaling_predefined_metric_pair +PredictiveScalingPredefinedScalingMetric,predictive_scaling_predefined_scaling_metric +PredictorArn,predictor_arn +PredictorBacktestExportJobArn,predictor_backtest_export_job_arn +PredictorBacktestExportJobName,predictor_backtest_export_job_name +PredictorBacktestExportJobSummary,predictor_backtest_export_job_summary +PredictorBacktestExportJobs,predictor_backtest_export_jobs +PredictorBaseline,predictor_baseline +PredictorEvaluationResults,predictor_evaluation_results +PredictorEvent,predictor_event +PredictorExecution,predictor_execution +PredictorExecutionDetails,predictor_execution_details +PredictorExecutions,predictor_executions +PredictorMonitorEvaluation,predictor_monitor_evaluation +PredictorMonitorEvaluations,predictor_monitor_evaluations +PredictorName,predictor_name +PredictorNotMountedException,predictor_not_mounted_exception +PredictorSummary,predictor_summary +Predictors,predictors +PrefectureOrDistrict,prefecture_or_district +Preference,preference +Preferences,preferences +Preferred,preferred +PreferredAuthenticationMethod,preferred_authentication_method +PreferredAvailabilityZone,preferred_availability_zone +PreferredAvailabilityZones,preferred_availability_zones +PreferredBackupWindow,preferred_backup_window +PreferredCacheClusterAZs,preferred_cache_cluster_azs +PreferredChannelPipeline,preferred_channel_pipeline +PreferredFileServerIp,preferred_file_server_ip +PreferredInstanceType,preferred_instance_type +PreferredLanguage,preferred_language +PreferredMaintenanceWindow,preferred_maintenance_window +PreferredMfa,preferred_mfa +PreferredMfaSetting,preferred_mfa_setting +PreferredOutpostArn,preferred_outpost_arn +PreferredOutpostArns,preferred_outpost_arns +PreferredProtocol,preferred_protocol +PreferredSubnetId,preferred_subnet_id +PrefetchConsumption,prefetch_consumption +PrefetchRetrieval,prefetch_retrieval +PrefetchSchedule,prefetch_schedule +Prefix,prefix +PrefixConfig,prefix_config +PrefixForAllResources,prefix_for_all_resources +PrefixLevel,prefix_level +PrefixLevelStorageMetrics,prefix_level_storage_metrics +PrefixList,prefix_list +PrefixListArn,prefix_list_arn +PrefixListAssociation,prefix_list_association +PrefixListAssociations,prefix_list_associations +PrefixListEntry,prefix_list_entry +PrefixListId,prefix_list_id +PrefixListIds,prefix_list_ids +PrefixListName,prefix_list_name +PrefixListOwnerId,prefix_list_owner_id +PrefixLists,prefix_lists +PrefixesCompleted,prefixes_completed +PrefixesFound,prefixes_found +Preload,preload +PreloadDataConfig,preload_data_config +PreloadDataType,preload_data_type +PrepareDuration,prepare_duration +PrepareQueryRequest,prepare_query_request +PrepareQueryResponse,prepare_query_response +PrepareStatus,prepare_status +PreparedStatement,prepared_statement +PreparedStatementNames,prepared_statement_names +PreparedStatementSummary,prepared_statement_summary +PreparedStatements,prepared_statements +PresenterOnlyConfiguration,presenter_only_configuration +PresenterPosition,presenter_position +PreserveClientIp,preserve_client_ip +PreserveDeletedFiles,preserve_deleted_files +PreserveDevices,preserve_devices +PreserveExistingData,preserve_existing_data +PreserveTransactions,preserve_transactions +PreservedExistingData,preserved_existing_data +Preset,preset +PresetDeploymentConfig,preset_deployment_config +PresetDeploymentOutput,preset_deployment_output +PresetDeploymentType,preset_deployment_type +PresetId,preset_id +PresetSettings,preset_settings +PresetSpeke20Audio,preset_speke20_audio +PresetSpeke20Video,preset_speke20_video +PresetWatermark,preset_watermark +PresetWatermarkId,preset_watermark_id +Presets,presets +PresignedUrl,presigned_url +PresignedUrlConfig,presigned_url_config +PrestoParameters,presto_parameters +PreventUserExistenceErrors,prevent_user_existence_errors +Preview,preview +PreviewAgentsRequest,preview_agents_request +PreviewAgentsResponse,preview_agents_response +PreviewGenerationInProgressException,preview_generation_in_progress_exception +PreviewNextCidr,preview_next_cidr +PreviewOverride,preview_override +PreviousActiveModelVersion,previous_active_model_version +PreviousActiveModelVersionArn,previous_active_model_version_arn +PreviousActiveVersion,previous_active_version +PreviousActiveVersionArn,previous_active_version_arn +PreviousAppsList,previous_apps_list +PreviousContactId,previous_contact_id +PreviousEarthObservationJobArn,previous_earth_observation_job_arn +PreviousFleetState,previous_fleet_state +PreviousInvocationTime,previous_invocation_time +PreviousLineItemId,previous_line_item_id +PreviousModelVersionActivatedAt,previous_model_version_activated_at +PreviousOrderId,previous_order_id +PreviousPassword,previous_password +PreviousProtocolsList,previous_protocols_list +PreviousRunId,previous_run_id +PreviousSlotEndTime,previous_slot_end_time +PreviousSpotFleetRequestState,previous_spot_fleet_request_state +PreviousState,previous_state +PreviousStatus,previous_status +PreviousValue,previous_value +PreviousValues,previous_values +PreviousVersion,previous_version +Price,price +PriceClass,price_class +PriceList,price_list +PriceListArn,price_list_arn +PriceLists,price_lists +PricePerUnit,price_per_unit +PriceSchedule,price_schedule +PriceScheduleSpecification,price_schedule_specification +PriceSchedules,price_schedules +PriceUnits,price_units +PriceWithCurrency,price_with_currency +Prices,prices +PricingDetail,pricing_detail +PricingDetails,pricing_details +PricingPlan,pricing_plan +PricingPlanArn,pricing_plan_arn +PricingPlanArns,pricing_plan_arns +PricingPlanDataSource,pricing_plan_data_source +PricingPlanListElement,pricing_plan_list_element +PricingPlans,pricing_plans +PricingRuleArn,pricing_rule_arn +PricingRuleArns,pricing_rule_arns +PricingRuleListElement,pricing_rule_list_element +PricingRules,pricing_rules +Primary,primary +PrimaryAccountId,primary_account_id +PrimaryAccountNumber,primary_account_number +PrimaryAvailabilityZone,primary_availability_zone +PrimaryBackground,primary_background +PrimaryBtn,primary_btn +PrimaryClusterId,primary_cluster_id +PrimaryContainer,primary_container +PrimaryDistributionId,primary_distribution_id +PrimaryEmail,primary_email +PrimaryEmailPrefix,primary_email_prefix +PrimaryEndpoint,primary_endpoint +PrimaryForeground,primary_foreground +PrimaryHost,primary_host +PrimaryIpv6,primary_ipv6 +PrimaryKey,primary_key +PrimaryKeyColumnName,primary_key_column_name +PrimaryKeys,primary_keys +PrimaryMeetingId,primary_meeting_id +PrimaryMetricName,primary_metric_name +PrimaryOutpostArn,primary_outpost_arn +PrimaryProvisionedNumber,primary_provisioned_number +PrimaryRegion,primary_region +PrimaryReplicationGroupId,primary_replication_group_id +PrimarySource,primary_source +PrimaryStatus,primary_status +PrimaryValue,primary_value +PrimaryValueDisplayType,primary_value_display_type +PrimaryValueFontConfiguration,primary_value_font_configuration +PrimaryWorkspaceId,primary_workspace_id +PrimaryYAxisDisplayOptions,primary_y_axis_display_options +PrimaryYAxisLabelOptions,primary_y_axis_label_options +Principal,principal +PrincipalARN,principal_arn +PrincipalArn,principal_arn +PrincipalId,principal_id +PrincipalIdFormat,principal_id_format +PrincipalList,principal_list +PrincipalName,principal_name +PrincipalOrgID,principal_org_id +PrincipalOrgIDs,principal_org_ids +PrincipalPermissions,principal_permissions +PrincipalResourcePermissions,principal_resource_permissions +PrincipalTags,principal_tags +PrincipalType,principal_type +Principals,principals +PriorModelMetrics,prior_model_metrics +PriorRequestNotComplete,prior_request_not_complete +PrioritizeBusinessGoals,prioritize_business_goals +PrioritizedRiskCounts,prioritized_risk_counts +Priority,priority +PriorityConfiguration,priority_configuration +PriorityInUseException,priority_in_use_exception +PriorityOrder,priority_order +Privacy,privacy +PrivacyPolicy,privacy_policy +PrivacyProtectAdminContact,privacy_protect_admin_contact +PrivacyProtectRegistrantContact,privacy_protect_registrant_contact +PrivacyProtectTechContact,privacy_protect_tech_contact +PrivateAddress,private_address +PrivateChannelFilter,private_channel_filter +PrivateConnectionProvisioningState,private_connection_provisioning_state +PrivateDefaultScopeId,private_default_scope_id +PrivateDns,private_dns +PrivateDnsDetails,private_dns_details +PrivateDnsEnabled,private_dns_enabled +PrivateDnsHostnameType,private_dns_hostname_type +PrivateDnsHostnameTypeOnLaunch,private_dns_hostname_type_on_launch +PrivateDnsName,private_dns_name +PrivateDnsNameConfiguration,private_dns_name_configuration +PrivateDnsNameOptions,private_dns_name_options +PrivateDnsNameOptionsOnLaunch,private_dns_name_options_on_launch +PrivateDnsNameOptionsRequest,private_dns_name_options_request +PrivateDnsNameOptionsResponse,private_dns_name_options_response +PrivateDnsNameVerificationState,private_dns_name_verification_state +PrivateDnsNames,private_dns_names +PrivateDnsNamespaceChange,private_dns_namespace_change +PrivateDnsNamespaceProperties,private_dns_namespace_properties +PrivateDnsNamespacePropertiesChange,private_dns_namespace_properties_change +PrivateDnsOnlyForInboundResolverEndpoint,private_dns_only_for_inbound_resolver_endpoint +PrivateDnsPropertiesMutable,private_dns_properties_mutable +PrivateDnsPropertiesMutableChange,private_dns_properties_mutable_change +PrivateIPAddress,private_ip_address +PrivateIPv4Address,private_ipv4_address +PrivateIp,private_ip +PrivateIpAddress,private_ip_address +PrivateIpAddressConfigs,private_ip_address_configs +PrivateIpAddressCount,private_ip_address_count +PrivateIpAddressDetails,private_ip_address_details +PrivateIpAddressSpecification,private_ip_address_specification +PrivateIpAddresses,private_ip_addresses +PrivateKey,private_key +PrivateKeyAttributes,private_key_attributes +PrivateKeyAttributesV2,private_key_attributes_v2 +PrivateKeyAttributesV3,private_key_attributes_v3 +PrivateKeyAttributesV4,private_key_attributes_v4 +PrivateKeyCiphertextBlob,private_key_ciphertext_blob +PrivateKeyFlags,private_key_flags +PrivateKeyFlagsV2,private_key_flags_v2 +PrivateKeyFlagsV3,private_key_flags_v3 +PrivateKeyFlagsV4,private_key_flags_v4 +PrivateKeyPlaintext,private_key_plaintext +PrivateKeys,private_keys +PrivateLinkConfig,private_link_config +PrivateLinkEndpoint,private_link_endpoint +PrivateMetadataPid,private_metadata_pid +PrivateRegistryAccess,private_registry_access +PrivateRegistryAccessRequest,private_registry_access_request +PrivateSkillIds,private_skill_ids +PrivateTypeException,private_type_exception +PrivateZone,private_zone +Privileged,privileged +PrivilegedDelete,privileged_delete +PrivilegedMode,privileged_mode +ProactiveAnomalies,proactive_anomalies +ProactiveAnomaly,proactive_anomaly +ProactiveAnomalySummary,proactive_anomaly_summary +ProactiveEngagementStatus,proactive_engagement_status +ProactiveInsight,proactive_insight +ProactiveInsightSummary,proactive_insight_summary +ProactiveInsights,proactive_insights +ProactiveJoin,proactive_join +ProactiveOrganizationInsightSummary,proactive_organization_insight_summary +Prob,prob +ProbabilityAttribute,probability_attribute +ProbabilityIndex,probability_index +ProbabilityThresholdAttribute,probability_threshold_attribute +Problem,problem +ProblemDetail,problem_detail +ProblemDetails,problem_details +ProblemId,problem_id +ProblemList,problem_list +ProblemType,problem_type +Problems,problems +Process,process +ProcessDetails,process_details +ProcessLaunchedAt,process_launched_at +ProcessName,process_name +ProcessParentPid,process_parent_pid +ProcessPath,process_path +ProcessPid,process_pid +ProcessTerminatedAt,process_terminated_at +ProcessType,process_type +ProcessedAutomationRules,processed_automation_rules +ProcessedClusters,processed_clusters +ProcessedFindings,processed_findings +ProcessedInputRecords,processed_input_records +ProcessedItemCount,processed_item_count +ProcessedRecordsCount,processed_records_count +ProcessedSizeBytes,processed_size_bytes +ProcessedUpdateAction,processed_update_action +ProcessedUpdateActions,processed_update_actions +Processes,processes +ProcessesType,processes_type +Processing,processing +ProcessingClusterConfig,processing_cluster_config +ProcessingConfiguration,processing_configuration +ProcessingEndTime,processing_end_time +ProcessingFeatureStoreOutput,processing_feature_store_output +ProcessingInput,processing_input +ProcessingInputs,processing_inputs +ProcessingJob,processing_job +ProcessingJobArn,processing_job_arn +ProcessingJobName,processing_job_name +ProcessingJobStatus,processing_job_status +ProcessingJobStepMetadata,processing_job_step_metadata +ProcessingJobSummaries,processing_job_summaries +ProcessingJobSummary,processing_job_summary +ProcessingOutput,processing_output +ProcessingOutputConfig,processing_output_config +ProcessingResources,processing_resources +ProcessingResult,processing_result +ProcessingS3Input,processing_s3_input +ProcessingS3Output,processing_s3_output +ProcessingStartTime,processing_start_time +ProcessingStatus,processing_status +ProcessingStatusInfo,processing_status_info +ProcessingStoppingCondition,processing_stopping_condition +ProcessingTimeMilliseconds,processing_time_milliseconds +Processor,processor +ProcessorConfiguration,processor_configuration +ProcessorFeature,processor_feature +ProcessorFeatures,processor_features +ProcessorInfo,processor_info +ProcessorParameter,processor_parameter +Processors,processors +ProducerArn,producer_arn +ProducerTimestamp,producer_timestamp +Product,product +ProductARN,product_arn +ProductArn,product_arn +ProductCode,product_code +ProductCodeId,product_code_id +ProductCodeType,product_code_type +ProductCodes,product_codes +ProductDescription,product_description +ProductDescriptions,product_descriptions +ProductFamily,product_family +ProductFields,product_fields +ProductId,product_id +ProductInformation,product_information +ProductInformationFilter,product_information_filter +ProductInformationFilterComparator,product_information_filter_comparator +ProductInformationFilterList,product_information_filter_list +ProductInformationFilterName,product_information_filter_name +ProductInformationFilterValue,product_information_filter_value +ProductInformationList,product_information_list +ProductLink,product_link +ProductListingIds,product_listing_ids +ProductName,product_name +ProductSKU,product_sku +ProductSource,product_source +ProductSubscriptionArn,product_subscription_arn +ProductSubscriptionResourcePolicy,product_subscription_resource_policy +ProductSubscriptions,product_subscriptions +ProductTitle,product_title +ProductType,product_type +ProductUserSummaries,product_user_summaries +ProductUserSummary,product_user_summary +ProductViewAggregationValue,product_view_aggregation_value +ProductViewAggregations,product_view_aggregations +ProductViewDetail,product_view_detail +ProductViewDetails,product_view_details +ProductViewSummaries,product_view_summaries +ProductViewSummary,product_view_summary +ProductionAccessEnabled,production_access_enabled +ProductionAccessNotGrantedException,production_access_not_granted_exception +ProductionBranch,production_branch +ProductionVariant,production_variant +ProductionVariantCoreDumpConfig,production_variant_core_dump_config +ProductionVariantServerlessConfig,production_variant_serverless_config +ProductionVariantServerlessUpdateConfig,production_variant_serverless_update_config +ProductionVariantStatus,production_variant_status +ProductionVariantSummary,production_variant_summary +ProductionVariants,production_variants +Products,products +Profanity,profanity +Profile,profile +ProfileArn,profile_arn +ProfileArns,profile_arns +ProfileChoice,profile_choice +ProfileColumns,profile_columns +ProfileConfiguration,profile_configuration +ProfileCount,profile_count +ProfileData,profile_data +ProfileDescription,profile_description +ProfileDetail,profile_detail +ProfileDetailResponse,profile_detail_response +ProfileId,profile_id +ProfileIds,profile_ids +ProfileIdsToBeMerged,profile_ids_to_be_merged +ProfileName,profile_name +ProfileNamePrefix,profile_name_prefix +ProfileNotificationSummary,profile_notification_summary +ProfileObjectUniqueKey,profile_object_unique_key +ProfileOwnerType,profile_owner_type +ProfileQuestion,profile_question +ProfileQuestionUpdate,profile_question_update +ProfileQuestions,profile_questions +ProfileShareSummaries,profile_share_summaries +ProfileShareSummary,profile_share_summary +ProfileSummaries,profile_summaries +ProfileSummary,profile_summary +ProfileTemplate,profile_template +ProfileTemplateChoice,profile_template_choice +ProfileTemplateQuestion,profile_template_question +ProfileTime,profile_time +ProfileType,profile_type +ProfileUrl,profile_url +ProfileVersion,profile_version +ProfilerConfig,profiler_config +ProfilerConfigForUpdate,profiler_config_for_update +ProfilerRuleConfiguration,profiler_rule_configuration +ProfilerRuleConfigurations,profiler_rule_configurations +ProfilerRuleEvaluationStatus,profiler_rule_evaluation_status +ProfilerRuleEvaluationStatuses,profiler_rule_evaluation_statuses +Profiles,profiles +ProfilingGroupDescription,profiling_group_description +ProfilingIntervalInMilliseconds,profiling_interval_in_milliseconds +ProfilingParameters,profiling_parameters +ProfilingStatus,profiling_status +ProformaCost,proforma_cost +ProgramCount,program_count +ProgramDateTime,program_date_time +ProgramDateTimeClock,program_date_time_clock +ProgramDateTimeIntervalSeconds,program_date_time_interval_seconds +ProgramDateTimePeriod,program_date_time_period +ProgramId,program_id +ProgramName,program_name +ProgramNum,program_num +ProgramNumber,program_number +ProgramSelection,program_selection +ProgrammingLang,programming_lang +ProgrammingLanguages,programming_languages +Progress,progress +ProgressBar,progress_bar +ProgressBarOptions,progress_bar_options +ProgressCounters,progress_counters +ProgressDetail,progress_detail +ProgressDetails,progress_details +ProgressDetailsOnRollback,progress_details_on_rollback +ProgressEvent,progress_event +ProgressInMegaBytes,progress_in_mega_bytes +ProgressPercent,progress_percent +ProgressPercentage,progress_percentage +ProgressReport,progress_report +ProgressStatus,progress_status +ProgressSummary,progress_summary +ProgressUpdateStream,progress_update_stream +ProgressUpdateStreamName,progress_update_stream_name +ProgressUpdateStreamSummary,progress_update_stream_summary +ProgressUpdateStreamSummaryList,progress_update_stream_summary_list +Progressing,progressing +ProgressingJobsCount,progressing_jobs_count +ProgressiveDialerConfig,progressive_dialer_config +ProgressiveWriteHlsManifest,progressive_write_hls_manifest +ProhibitedStateException,prohibited_state_exception +Project,project +ProjectAlreadyExistsException,project_already_exists_exception +ProjectAppConfigResource,project_app_config_resource +ProjectAppConfigResourceConfig,project_app_config_resource_config +ProjectArn,project_arn +ProjectArtifacts,project_artifacts +ProjectBadge,project_badge +ProjectBuildBatchConfig,project_build_batch_config +ProjectCache,project_cache +ProjectConfigurationException,project_configuration_exception +ProjectCreationFailedException,project_creation_failed_exception +ProjectDataDelivery,project_data_delivery +ProjectDataDeliveryConfig,project_data_delivery_config +ProjectDescription,project_description +ProjectDescriptions,project_descriptions +ProjectDetails,project_details +ProjectEnvironment,project_environment +ProjectFieldMappings,project_field_mappings +ProjectFileSystemLocation,project_file_system_location +ProjectId,project_id +ProjectInformation,project_information +ProjectListFilter,project_list_filter +ProjectMetadata,project_metadata +ProjectName,project_name +ProjectNames,project_names +ProjectNotFoundException,project_not_found_exception +ProjectOperation,project_operation +ProjectPolicies,project_policies +ProjectPolicy,project_policy +ProjectResource,project_resource +ProjectSource,project_source +ProjectSourceVersion,project_source_version +ProjectStatus,project_status +ProjectSummary,project_summary +ProjectSummaryList,project_summary_list +ProjectVersionArn,project_version_arn +ProjectVersionDescription,project_version_description +ProjectVersionDescriptions,project_version_descriptions +ProjectedColumns,projected_columns +ProjectedInbox,projected_inbox +ProjectedMetric,projected_metric +ProjectedSpam,projected_spam +ProjectedVolume,projected_volume +Projection,projection +ProjectionExpression,projection_expression +ProjectionType,projection_type +Projects,projects +Prometheus,prometheus +PrometheusInfo,prometheus_info +PromoteMode,promote_mode +PromotePermissionCreatedFromPolicyRequest,promote_permission_created_from_policy_request +PromotePermissionCreatedFromPolicyResponse,promote_permission_created_from_policy_response +PromoteReadReplicaDBClusterMessage,promote_read_replica_db_cluster_message +PromoteReadReplicaDBClusterResult,promote_read_replica_db_cluster_result +PromoteReadReplicaMessage,promote_read_replica_message +PromoteReadReplicaResult,promote_read_replica_result +PromoteRequest,promote_request +PromoteResourceShareCreatedFromPolicyRequest,promote_resource_share_created_from_policy_request +PromoteResourceShareCreatedFromPolicyResponse,promote_resource_share_created_from_policy_response +PromoteResponse,promote_response +Promotion,promotion +PromotionTier,promotion_tier +PromotionalMessagesPerSecond,promotional_messages_per_second +Prompt,prompt +PromptARN,prompt_arn +PromptAttemptSpecification,prompt_attempt_specification +PromptId,prompt_id +PromptPresignedUrl,prompt_presigned_url +PromptSearchCriteria,prompt_search_criteria +PromptSearchFilter,prompt_search_filter +PromptSpecification,prompt_specification +PromptSummary,prompt_summary +PromptSummaryList,prompt_summary_list +Prompts,prompts +Proof,proof +PropagateAtLaunch,propagate_at_launch +PropagateTags,propagate_tags +PropagatingVgw,propagating_vgw +PropagatingVgwSet,propagating_vgw_set +PropagatingVgwSetDetails,propagating_vgw_set_details +PropagatingVgws,propagating_vgws +Propagation,propagation +PropagationDefaultRouteTableId,propagation_default_route_table_id +Properties,properties +PropertiesToDelete,properties_to_delete +PropertiesToRemove,properties_to_remove +Property,property +PropertyDefinitionRequest,property_definition_request +PropertyDefinitionResponse,property_definition_response +PropertyDifference,property_difference +PropertyDifferences,property_differences +PropertyFilter,property_filter +PropertyFilters,property_filters +PropertyGroup,property_group +PropertyGroupDescriptions,property_group_descriptions +PropertyGroupId,property_group_id +PropertyGroupRequest,property_group_request +PropertyGroupResponse,property_group_response +PropertyGroups,property_groups +PropertyLatestValue,property_latest_value +PropertyList,property_list +PropertyMap,property_map +PropertyName,property_name +PropertyNameHint,property_name_hint +PropertyNameQuery,property_name_query +PropertyNameSuggestion,property_name_suggestion +PropertyNameSuggestions,property_name_suggestions +PropertyNotification,property_notification +PropertyPath,property_path +PropertyPredicate,property_predicate +PropertyRequest,property_request +PropertyResponse,property_response +PropertyRole,property_role +PropertyType,property_type +PropertyUsage,property_usage +PropertyValidationException,property_validation_exception +PropertyValidationExceptionProperty,property_validation_exception_property +PropertyValue,property_value +PropertyValueEntry,property_value_entry +PropertyValueHistory,property_value_history +PropertygraphData,propertygraph_data +PropertygraphRecord,propertygraph_record +PropertygraphSummary,propertygraph_summary +PropertygraphSummaryValueMap,propertygraph_summary_value_map +Proposal,proposal +ProposalActions,proposal_actions +ProposalDurationInHours,proposal_duration_in_hours +ProposalId,proposal_id +ProposalSummary,proposal_summary +ProposalVotes,proposal_votes +Proposals,proposals +Proposed,proposed +ProposedByMemberId,proposed_by_member_id +ProposedByMemberName,proposed_by_member_name +ProposedConfiguration,proposed_configuration +ProposedMultiRegionAccessPointPolicy,proposed_multi_region_access_point_policy +ProposedPassword,proposed_password +ProposedSegmentChange,proposed_segment_change +ProprietaryAuthenticationData,proprietary_authentication_data +ProresSettings,prores_settings +ProtectedFromScaleIn,protected_from_scale_in +ProtectedQuery,protected_query +ProtectedQueryError,protected_query_error +ProtectedQueryResult,protected_query_result +ProtectedQueryResultConfiguration,protected_query_result_configuration +ProtectedQueryS3Output,protected_query_s3_output +ProtectedQueryS3OutputConfiguration,protected_query_s3_output_configuration +ProtectedQuerySQLParameters,protected_query_sql_parameters +ProtectedQuerySingleMemberOutput,protected_query_single_member_output +ProtectedQueryStatistics,protected_query_statistics +ProtectedQuerySummary,protected_query_summary +ProtectedResource,protected_resource +ProtectedResourceTypeLimits,protected_resource_type_limits +ProtectedTask,protected_task +Protection,protection +ProtectionArn,protection_arn +ProtectionGroup,protection_group +ProtectionGroupArbitraryPatternLimits,protection_group_arbitrary_pattern_limits +ProtectionGroupArn,protection_group_arn +ProtectionGroupId,protection_group_id +ProtectionGroupIds,protection_group_ids +ProtectionGroupLimits,protection_group_limits +ProtectionGroupPatternTypeLimits,protection_group_pattern_type_limits +ProtectionGroups,protection_groups +ProtectionId,protection_id +ProtectionLimits,protection_limits +ProtectionNames,protection_names +ProtectionPolicy,protection_policy +Protections,protections +ProtectiveEquipmentBodyPart,protective_equipment_body_part +ProtectiveEquipmentModelVersion,protective_equipment_model_version +ProtectiveEquipmentPerson,protective_equipment_person +ProtectiveEquipmentSummarizationAttributes,protective_equipment_summarization_attributes +ProtectiveEquipmentSummary,protective_equipment_summary +Protocol,protocol +ProtocolDetails,protocol_details +ProtocolType,protocol_type +ProtocolVersion,protocol_version +Protocols,protocols +ProtocolsList,protocols_list +ProtocolsListArn,protocols_list_arn +ProtocolsListData,protocols_list_data +ProtocolsListDataSummary,protocols_list_data_summary +ProtocolsLists,protocols_lists +ProvideAnomalyFeedbackRequest,provide_anomaly_feedback_request +ProvideAnomalyFeedbackResponse,provide_anomaly_feedback_response +ProvidedContext,provided_context +ProvidedContexts,provided_contexts +Provider,provider +ProviderArn,provider_arn +ProviderAttributeName,provider_attribute_name +ProviderAttributeValue,provider_attribute_value +ProviderCalendarId,provider_calendar_id +ProviderDescription,provider_description +ProviderDetails,provider_details +ProviderEndpoint,provider_endpoint +ProviderId,provider_id +ProviderName,provider_name +ProviderType,provider_type +ProviderTypeFilter,provider_type_filter +ProviderTypes,provider_types +ProviderUserIdentifierType,provider_user_identifier_type +Providers,providers +Province,province +ProvisionByoipCidrRequest,provision_byoip_cidr_request +ProvisionByoipCidrResponse,provision_byoip_cidr_response +ProvisionByoipCidrResult,provision_byoip_cidr_result +ProvisionData,provision_data +ProvisionDeviceRequest,provision_device_request +ProvisionDeviceResponse,provision_device_response +ProvisionIpamPoolCidrRequest,provision_ipam_pool_cidr_request +ProvisionIpamPoolCidrResult,provision_ipam_pool_cidr_result +ProvisionPermissionSetRequest,provision_permission_set_request +ProvisionPermissionSetRequestId,provision_permission_set_request_id +ProvisionPermissionSetResponse,provision_permission_set_response +ProvisionProductId,provision_product_id +ProvisionProductInput,provision_product_input +ProvisionProductName,provision_product_name +ProvisionProductOutput,provision_product_output +ProvisionPublicIpv4PoolCidrRequest,provision_public_ipv4_pool_cidr_request +ProvisionPublicIpv4PoolCidrResult,provision_public_ipv4_pool_cidr_result +ProvisionState,provision_state +ProvisionTime,provision_time +ProvisionToken,provision_token +ProvisionalConfiguration,provisional_configuration +Provisioned,provisioned +ProvisionedBandwidth,provisioned_bandwidth +ProvisionedCapacity,provisioned_capacity +ProvisionedCapacityDescription,provisioned_capacity_description +ProvisionedCapacityList,provisioned_capacity_list +ProvisionedCapacityUnits,provisioned_capacity_units +ProvisionedCapacityUpdate,provisioned_capacity_update +ProvisionedConcurrency,provisioned_concurrency +ProvisionedConcurrencyConfigListItem,provisioned_concurrency_config_list_item +ProvisionedConcurrencyConfigNotFoundException,provisioned_concurrency_config_not_found_exception +ProvisionedConcurrencyConfigs,provisioned_concurrency_configs +ProvisionedConcurrentExecutions,provisioned_concurrent_executions +ProvisionedIops,provisioned_iops +ProvisionedIopsNotAvailableInAZFault,provisioned_iops_not_available_in_az_fault +ProvisionedModelSummary,provisioned_model_summary +ProvisionedOnDemandCapacity,provisioned_on_demand_capacity +ProvisionedProductAttribute,provisioned_product_attribute +ProvisionedProductDetail,provisioned_product_detail +ProvisionedProductId,provisioned_product_id +ProvisionedProductName,provisioned_product_name +ProvisionedProductPlanDetails,provisioned_product_plan_details +ProvisionedProductPlanSummary,provisioned_product_plan_summary +ProvisionedProductPlans,provisioned_product_plans +ProvisionedProductProperties,provisioned_product_properties +ProvisionedProductStatusMessage,provisioned_product_status_message +ProvisionedProductType,provisioned_product_type +ProvisionedProducts,provisioned_products +ProvisionedReadCapacityAutoScalingSettings,provisioned_read_capacity_auto_scaling_settings +ProvisionedReadCapacityAutoScalingSettingsUpdate,provisioned_read_capacity_auto_scaling_settings_update +ProvisionedReadCapacityAutoScalingUpdate,provisioned_read_capacity_auto_scaling_update +ProvisionedReadCapacityUnits,provisioned_read_capacity_units +ProvisionedRequest,provisioned_request +ProvisionedResource,provisioned_resource +ProvisionedSpotCapacity,provisioned_spot_capacity +ProvisionedStorageThroughput,provisioned_storage_throughput +ProvisionedThroughput,provisioned_throughput +ProvisionedThroughputDescription,provisioned_throughput_description +ProvisionedThroughputExceededException,provisioned_throughput_exceeded_exception +ProvisionedThroughputInMibps,provisioned_throughput_in_mibps +ProvisionedThroughputOverride,provisioned_throughput_override +ProvisionedWriteCapacityAutoScalingSettings,provisioned_write_capacity_auto_scaling_settings +ProvisionedWriteCapacityAutoScalingSettingsUpdate,provisioned_write_capacity_auto_scaling_settings_update +ProvisionedWriteCapacityAutoScalingUpdate,provisioned_write_capacity_auto_scaling_update +ProvisionedWriteCapacityUnits,provisioned_write_capacity_units +ProvisioningArtifact,provisioning_artifact +ProvisioningArtifactDetail,provisioning_artifact_detail +ProvisioningArtifactDetails,provisioning_artifact_details +ProvisioningArtifactId,provisioning_artifact_id +ProvisioningArtifactMetadata,provisioning_artifact_metadata +ProvisioningArtifactName,provisioning_artifact_name +ProvisioningArtifactOutput,provisioning_artifact_output +ProvisioningArtifactOutputKeys,provisioning_artifact_output_keys +ProvisioningArtifactOutputs,provisioning_artifact_outputs +ProvisioningArtifactParameter,provisioning_artifact_parameter +ProvisioningArtifactParameters,provisioning_artifact_parameters +ProvisioningArtifactPreferences,provisioning_artifact_preferences +ProvisioningArtifactProperties,provisioning_artifact_properties +ProvisioningArtifactSummaries,provisioning_artifact_summaries +ProvisioningArtifactSummary,provisioning_artifact_summary +ProvisioningArtifactView,provisioning_artifact_view +ProvisioningArtifactViews,provisioning_artifact_views +ProvisioningArtifacts,provisioning_artifacts +ProvisioningHook,provisioning_hook +ProvisioningParameter,provisioning_parameter +ProvisioningParameters,provisioning_parameters +ProvisioningPreferences,provisioning_preferences +ProvisioningStatus,provisioning_status +ProvisioningTemplateSummary,provisioning_template_summary +ProvisioningTemplateVersionSummary,provisioning_template_version_summary +ProvisioningType,provisioning_type +Proximity,proximity +ProximityEventConfiguration,proximity_event_configuration +ProximityResourceTypeEventConfiguration,proximity_resource_type_event_configuration +Proxy,proxy +ProxyConfiguration,proxy_configuration +ProxyConfigurationProperties,proxy_configuration_properties +ProxyPhoneNumber,proxy_phone_number +ProxySession,proxy_session +ProxySessionId,proxy_session_id +ProxySessions,proxy_sessions +ProxyType,proxy_type +ProxyUrl,proxy_url +PsAttributes,ps_attributes +PsDetailAttributes,ps_detail_attributes +Psc,psc +PseudoTerminal,pseudo_terminal +Pseudonym,pseudonym +PsiControl,psi_control +PtrRecord,ptr_record +PtrRecordUpdate,ptr_record_update +PtrUpdateStatus,ptr_update_status +PtsOffset,pts_offset +PtsOffsetHandlingForBFrames,pts_offset_handling_for_b_frames +PtsOffsetMode,pts_offset_mode +Public,public +PublicAccess,public_access +PublicAccessBlock,public_access_block +PublicAccessBlockConfiguration,public_access_block_configuration +PublicAccessBlockEnabled,public_access_block_enabled +PublicAddress,public_address +PublicAddressAllocationIds,public_address_allocation_ids +PublicBaseImageReleasedDate,public_base_image_released_date +PublicChannelFilter,public_channel_filter +PublicContent,public_content +PublicDefaultScopeId,public_default_scope_id +PublicDns,public_dns +PublicDnsName,public_dns_name +PublicDnsNamespaceChange,public_dns_namespace_change +PublicDnsNamespaceProperties,public_dns_namespace_properties +PublicDnsNamespacePropertiesChange,public_dns_namespace_properties_change +PublicDnsPropertiesMutable,public_dns_properties_mutable +PublicDnsPropertiesMutableChange,public_dns_properties_mutable_change +PublicEndpoint,public_endpoint +PublicIPAddress,public_ip_address +PublicIp,public_ip +PublicIpAddress,public_ip_address +PublicIpSource,public_ip_source +PublicIps,public_ips +PublicIpv4Pool,public_ipv4_pool +PublicIpv4PoolRange,public_ipv4_pool_range +PublicIpv4Pools,public_ipv4_pools +PublicKey,public_key +PublicKeyAlreadyExists,public_key_already_exists +PublicKeyCertificate,public_key_certificate +PublicKeyConfig,public_key_config +PublicKeyId,public_key_id +PublicKeyInUse,public_key_in_use +PublicKeyList,public_key_list +PublicKeyMaterial,public_key_material +PublicKeyRotationTimestamp,public_key_rotation_timestamp +PublicKeySummary,public_key_summary +PublicKeyVersion,public_key_version +PublicKeys,public_keys +PublicPolicyException,public_policy_exception +PublicSharingEnabled,public_sharing_enabled +PublicSubject,public_subject +PublicTypeArn,public_type_arn +PublicVersionNumber,public_version_number +PublicWorkforceTaskPrice,public_workforce_task_price +PublicZoneVPCAssociation,public_zone_vpc_association +Publication,publication +Publications,publications +PubliclyAccessible,publicly_accessible +PubliclyAdvertisable,publicly_advertisable +Publish,publish +PublishAppVersionRequest,publish_app_version_request +PublishAppVersionResponse,publish_app_version_response +PublishBatchInput,publish_batch_input +PublishBatchRequestEntries,publish_batch_request_entries +PublishBatchRequestEntry,publish_batch_request_entry +PublishBatchResponse,publish_batch_response +PublishBatchResultEntry,publish_batch_result_entry +PublishCloudWatchMetricsEnabled,publish_cloud_watch_metrics_enabled +PublishFindingToSnsParams,publish_finding_to_sns_params +PublishFunctionRequest,publish_function_request +PublishFunctionResult,publish_function_result +PublishInput,publish_input +PublishLayerVersionRequest,publish_layer_version_request +PublishLayerVersionResponse,publish_layer_version_response +PublishMetricAction,publish_metric_action +PublishMetricsInput,publish_metrics_input +PublishPackageVersionRequest,publish_package_version_request +PublishPackageVersionResult,publish_package_version_result +PublishRecipeRequest,publish_recipe_request +PublishRecipeResponse,publish_recipe_response +PublishRequest,publish_request +PublishResponse,publish_response +PublishSchemaRequest,publish_schema_request +PublishSchemaResponse,publish_schema_response +PublishStateMachineVersionInput,publish_state_machine_version_input +PublishStateMachineVersionOutput,publish_state_machine_version_output +PublishStatus,publish_status +PublishTimestamp,publish_timestamp +PublishTypeInput,publish_type_input +PublishTypeOutput,publish_type_output +PublishVersionRequest,publish_version_request +PublishedBy,published_by +PublishedDate,published_date +PublishedSchemaArn,published_schema_arn +PublishedVersionNumber,published_version_number +PublishedVersions,published_versions +PublisherId,publisher_id +PublisherIdentity,publisher_identity +PublisherName,publisher_name +PublisherProfile,publisher_profile +PublisherStatus,publisher_status +PublishingFailureStartTimestamp,publishing_failure_start_timestamp +PublishingOptions,publishing_options +PullRequest,pull_request +PullRequestAlreadyClosedException,pull_request_already_closed_exception +PullRequestApprovalRulesNotSatisfiedException,pull_request_approval_rules_not_satisfied_exception +PullRequestCannotBeApprovedByAuthorException,pull_request_cannot_be_approved_by_author_exception +PullRequestCreatedEventMetadata,pull_request_created_event_metadata +PullRequestDoesNotExistException,pull_request_does_not_exist_exception +PullRequestEvent,pull_request_event +PullRequestId,pull_request_id +PullRequestIdRequiredException,pull_request_id_required_exception +PullRequestMergedStateChangedEventMetadata,pull_request_merged_state_changed_event_metadata +PullRequestSourceReferenceUpdatedEventMetadata,pull_request_source_reference_updated_event_metadata +PullRequestStatusChangedEventMetadata,pull_request_status_changed_event_metadata +PullRequestStatusRequiredException,pull_request_status_required_exception +PullRequestTarget,pull_request_target +PullThroughCacheRule,pull_through_cache_rule +PullThroughCacheRuleAlreadyExistsException,pull_through_cache_rule_already_exists_exception +PullThroughCacheRuleNotFoundException,pull_through_cache_rule_not_found_exception +Purchase,purchase +PurchaseHostReservationRequest,purchase_host_reservation_request +PurchaseHostReservationResult,purchase_host_reservation_result +PurchaseOfferingRequest,purchase_offering_request +PurchaseOfferingResponse,purchase_offering_response +PurchaseOfferingResult,purchase_offering_result +PurchaseProvisionedCapacityInput,purchase_provisioned_capacity_input +PurchaseProvisionedCapacityOutput,purchase_provisioned_capacity_output +PurchaseRequest,purchase_request +PurchaseRequests,purchase_requests +PurchaseReservedCacheNodesOfferingMessage,purchase_reserved_cache_nodes_offering_message +PurchaseReservedCacheNodesOfferingResult,purchase_reserved_cache_nodes_offering_result +PurchaseReservedDBInstancesOfferingMessage,purchase_reserved_db_instances_offering_message +PurchaseReservedDBInstancesOfferingResult,purchase_reserved_db_instances_offering_result +PurchaseReservedElasticsearchInstanceOfferingRequest,purchase_reserved_elasticsearch_instance_offering_request +PurchaseReservedElasticsearchInstanceOfferingResponse,purchase_reserved_elasticsearch_instance_offering_response +PurchaseReservedInstanceOfferingRequest,purchase_reserved_instance_offering_request +PurchaseReservedInstanceOfferingResponse,purchase_reserved_instance_offering_response +PurchaseReservedInstancesOfferingRequest,purchase_reserved_instances_offering_request +PurchaseReservedInstancesOfferingResult,purchase_reserved_instances_offering_result +PurchaseReservedNodeOfferingMessage,purchase_reserved_node_offering_message +PurchaseReservedNodeOfferingResult,purchase_reserved_node_offering_result +PurchaseReservedNodesOfferingRequest,purchase_reserved_nodes_offering_request +PurchaseReservedNodesOfferingResponse,purchase_reserved_nodes_offering_response +PurchaseScheduledInstancesRequest,purchase_scheduled_instances_request +PurchaseScheduledInstancesResult,purchase_scheduled_instances_result +PurchaseTime,purchase_time +PurchaseToken,purchase_token +PurchasedAt,purchased_at +PurchasedHours,purchased_hours +PurchasedUnits,purchased_units +PurgeQueueRequest,purge_queue_request +PushDomainRequest,push_domain_request +PushMessageActivity,push_message_activity +PushNotification,push_notification +PushNotificationConfiguration,push_notification_configuration +PushNotificationPreferences,push_notification_preferences +PushNotificationTemplateRequest,push_notification_template_request +PushNotificationTemplateResponse,push_notification_template_response +PushNotifications,push_notifications +PushSync,push_sync +PushTemplate,push_template +Put,put +PutAccessControlRuleRequest,put_access_control_rule_request +PutAccessPointConfigurationForObjectLambdaRequest,put_access_point_configuration_for_object_lambda_request +PutAccessPointPolicyForObjectLambdaRequest,put_access_point_policy_for_object_lambda_request +PutAccessPointPolicyRequest,put_access_point_policy_request +PutAccountAliasRequest,put_account_alias_request +PutAccountConfigurationRequest,put_account_configuration_request +PutAccountDedicatedIpWarmupAttributesRequest,put_account_dedicated_ip_warmup_attributes_request +PutAccountDetailsRequest,put_account_details_request +PutAccountPolicyRequest,put_account_policy_request +PutAccountPolicyResponse,put_account_policy_response +PutAccountPreferencesRequest,put_account_preferences_request +PutAccountPreferencesResponse,put_account_preferences_response +PutAccountSendingAttributesRequest,put_account_sending_attributes_request +PutAccountSettingDefaultRequest,put_account_setting_default_request +PutAccountSettingDefaultResponse,put_account_setting_default_response +PutAccountSettingRequest,put_account_setting_request +PutAccountSettingResponse,put_account_setting_response +PutAccountSuppressionAttributesRequest,put_account_suppression_attributes_request +PutAccountVdmAttributesRequest,put_account_vdm_attributes_request +PutActionRevisionInput,put_action_revision_input +PutActionRevisionOutput,put_action_revision_output +PutAdminAccountRequest,put_admin_account_request +PutAggregationAuthorizationRequest,put_aggregation_authorization_request +PutAggregationAuthorizationResponse,put_aggregation_authorization_response +PutAlarmRequest,put_alarm_request +PutAlarmResult,put_alarm_result +PutAlertManagerDefinitionRequest,put_alert_manager_definition_request +PutAlertManagerDefinitionResponse,put_alert_manager_definition_response +PutAlternateContactRequest,put_alternate_contact_request +PutAnomalyDetectorInput,put_anomaly_detector_input +PutAppInstanceRetentionSettingsRequest,put_app_instance_retention_settings_request +PutAppInstanceRetentionSettingsResponse,put_app_instance_retention_settings_response +PutAppInstanceStreamingConfigurationsRequest,put_app_instance_streaming_configurations_request +PutAppInstanceStreamingConfigurationsResponse,put_app_instance_streaming_configurations_response +PutAppInstanceUserExpirationSettingsRequest,put_app_instance_user_expiration_settings_request +PutAppInstanceUserExpirationSettingsResponse,put_app_instance_user_expiration_settings_response +PutAppLaunchConfigurationRequest,put_app_launch_configuration_request +PutAppReplicationConfigurationRequest,put_app_replication_configuration_request +PutAppValidationConfigurationRequest,put_app_validation_configuration_request +PutApplicationPolicyRequest,put_application_policy_request +PutApplicationPolicyResponse,put_application_policy_response +PutApprovalResultInput,put_approval_result_input +PutApprovalResultOutput,put_approval_result_output +PutAppsListRequest,put_apps_list_request +PutAppsListResponse,put_apps_list_response +PutAssetPropertyValueEntry,put_asset_property_value_entry +PutAttributesRequest,put_attributes_request +PutAttributesResponse,put_attributes_response +PutAuditEventsRequest,put_audit_events_request +PutAuditEventsResponse,put_audit_events_response +PutAuthPolicyRequest,put_auth_policy_request +PutAuthPolicyResponse,put_auth_policy_response +PutAutoScalingPolicyInput,put_auto_scaling_policy_input +PutAutoScalingPolicyOutput,put_auto_scaling_policy_output +PutAutoTerminationPolicyInput,put_auto_termination_policy_input +PutBackupPolicyRequest,put_backup_policy_request +PutBackupVaultAccessPolicyInput,put_backup_vault_access_policy_input +PutBackupVaultLockConfigurationInput,put_backup_vault_lock_configuration_input +PutBackupVaultNotificationsInput,put_backup_vault_notifications_input +PutBandwidthRateLimitScheduleInput,put_bandwidth_rate_limit_schedule_input +PutBandwidthRateLimitScheduleOutput,put_bandwidth_rate_limit_schedule_output +PutBlockPublicAccessConfigurationInput,put_block_public_access_configuration_input +PutBotAliasRequest,put_bot_alias_request +PutBotAliasResponse,put_bot_alias_response +PutBotRequest,put_bot_request +PutBotResponse,put_bot_response +PutBucketAccelerateConfigurationRequest,put_bucket_accelerate_configuration_request +PutBucketAclRequest,put_bucket_acl_request +PutBucketAnalyticsConfigurationRequest,put_bucket_analytics_configuration_request +PutBucketCorsRequest,put_bucket_cors_request +PutBucketEncryptionRequest,put_bucket_encryption_request +PutBucketIntelligentTieringConfigurationRequest,put_bucket_intelligent_tiering_configuration_request +PutBucketInventoryConfigurationRequest,put_bucket_inventory_configuration_request +PutBucketLifecycleConfigurationRequest,put_bucket_lifecycle_configuration_request +PutBucketLoggingRequest,put_bucket_logging_request +PutBucketMetricsConfigurationRequest,put_bucket_metrics_configuration_request +PutBucketNotificationConfigurationRequest,put_bucket_notification_configuration_request +PutBucketOwnershipControlsRequest,put_bucket_ownership_controls_request +PutBucketPolicyRequest,put_bucket_policy_request +PutBucketReplicationRequest,put_bucket_replication_request +PutBucketRequestPaymentRequest,put_bucket_request_payment_request +PutBucketTaggingRequest,put_bucket_tagging_request +PutBucketVersioningRequest,put_bucket_versioning_request +PutBucketWebsiteRequest,put_bucket_website_request +PutCapacityAssignmentConfigurationInput,put_capacity_assignment_configuration_input +PutCaseEventConfigurationRequest,put_case_event_configuration_request +PutChannelExpirationSettingsRequest,put_channel_expiration_settings_request +PutChannelExpirationSettingsResponse,put_channel_expiration_settings_response +PutChannelMembershipPreferencesRequest,put_channel_membership_preferences_request +PutChannelMembershipPreferencesResponse,put_channel_membership_preferences_response +PutChannelPolicyRequest,put_channel_policy_request +PutChunkInput,put_chunk_input +PutChunkOutput,put_chunk_output +PutClassificationExportConfigurationRequest,put_classification_export_configuration_request +PutClassificationExportConfigurationResponse,put_classification_export_configuration_response +PutClusterCapacityProvidersRequest,put_cluster_capacity_providers_request +PutClusterCapacityProvidersResponse,put_cluster_capacity_providers_response +PutClusterPolicyRequest,put_cluster_policy_request +PutClusterPolicyResponse,put_cluster_policy_response +PutCodeBindingRequest,put_code_binding_request +PutCodeBindingResponse,put_code_binding_response +PutCommentReactionInput,put_comment_reaction_input +PutComplianceItemsRequest,put_compliance_items_request +PutComponentPolicyRequest,put_component_policy_request +PutComponentPolicyResponse,put_component_policy_response +PutCompositeAlarmInput,put_composite_alarm_input +PutConferencePreferenceRequest,put_conference_preference_request +PutConfigRuleRequest,put_config_rule_request +PutConfigurationAggregatorRequest,put_configuration_aggregator_request +PutConfigurationAggregatorResponse,put_configuration_aggregator_response +PutConfigurationRecorderRequest,put_configuration_recorder_request +PutConfigurationRequest,put_configuration_request +PutConfigurationSetDeliveryOptionsRequest,put_configuration_set_delivery_options_request +PutConfigurationSetReputationOptionsRequest,put_configuration_set_reputation_options_request +PutConfigurationSetSendingOptionsRequest,put_configuration_set_sending_options_request +PutConfigurationSetSuppressionOptionsRequest,put_configuration_set_suppression_options_request +PutConfigurationSetTrackingOptionsRequest,put_configuration_set_tracking_options_request +PutConfigurationSetVdmOptionsRequest,put_configuration_set_vdm_options_request +PutConformancePackRequest,put_conformance_pack_request +PutConformancePackResponse,put_conformance_pack_response +PutContactInformationRequest,put_contact_information_request +PutContactPolicyRequest,put_contact_policy_request +PutContainerPolicyInput,put_container_policy_input +PutContainerRecipePolicyRequest,put_container_recipe_policy_request +PutContainerRecipePolicyResponse,put_container_recipe_policy_response +PutCoreNetworkPolicyRequest,put_core_network_policy_request +PutCoreNetworkPolicyResponse,put_core_network_policy_response +PutCorsPolicyInput,put_cors_policy_input +PutDashboardInput,put_dashboard_input +PutDashboardOutput,put_dashboard_output +PutDataCatalogEncryptionSettingsRequest,put_data_catalog_encryption_settings_request +PutDataLakeSettingsRequest,put_data_lake_settings_request +PutDataProtectionPolicyInput,put_data_protection_policy_input +PutDataProtectionPolicyRequest,put_data_protection_policy_request +PutDataProtectionPolicyResponse,put_data_protection_policy_response +PutDataSetRefreshPropertiesRequest,put_data_set_refresh_properties_request +PutDataSetRefreshPropertiesResponse,put_data_set_refresh_properties_response +PutDedicatedIpInPoolRequest,put_dedicated_ip_in_pool_request +PutDedicatedIpPoolScalingAttributesRequest,put_dedicated_ip_pool_scaling_attributes_request +PutDedicatedIpWarmupAttributesRequest,put_dedicated_ip_warmup_attributes_request +PutDefaultEncryptionConfigurationRequest,put_default_encryption_configuration_request +PutDefaultEncryptionConfigurationResponse,put_default_encryption_configuration_response +PutDeliverabilityDashboardOptionRequest,put_deliverability_dashboard_option_request +PutDeliveryChannelRequest,put_delivery_channel_request +PutDestinationPolicyRequest,put_destination_policy_request +PutDestinationRequest,put_destination_request +PutDestinationResponse,put_destination_response +PutDetectorRequest,put_detector_request +PutDialRequestBatchRequest,put_dial_request_batch_request +PutDialRequestBatchResponse,put_dial_request_batch_response +PutDomainPermissionsPolicyRequest,put_domain_permissions_policy_request +PutDomainPermissionsPolicyResult,put_domain_permissions_policy_result +PutDraftAppVersionTemplateRequest,put_draft_app_version_template_request +PutDraftAppVersionTemplateResponse,put_draft_app_version_template_response +PutEmailIdentityConfigurationSetAttributesRequest,put_email_identity_configuration_set_attributes_request +PutEmailIdentityDkimAttributesRequest,put_email_identity_dkim_attributes_request +PutEmailIdentityDkimSigningAttributesRequest,put_email_identity_dkim_signing_attributes_request +PutEmailIdentityDkimSigningAttributesResponse,put_email_identity_dkim_signing_attributes_response +PutEmailIdentityFeedbackAttributesRequest,put_email_identity_feedback_attributes_request +PutEmailIdentityMailFromAttributesRequest,put_email_identity_mail_from_attributes_request +PutEmailMonitoringConfigurationRequest,put_email_monitoring_configuration_request +PutEncryptionConfigRequest,put_encryption_config_request +PutEncryptionConfigResult,put_encryption_config_result +PutEncryptionConfigurationRequest,put_encryption_configuration_request +PutEncryptionConfigurationResponse,put_encryption_configuration_response +PutEntityTypeRequest,put_entity_type_request +PutEvaluationsRequest,put_evaluations_request +PutEvaluationsResponse,put_evaluations_response +PutEventSelectorsRequest,put_event_selectors_request +PutEventSelectorsResponse,put_event_selectors_response +PutEventStreamRequest,put_event_stream_request +PutEventStreamResponse,put_event_stream_response +PutEventTypeRequest,put_event_type_request +PutEventsConfigurationRequest,put_events_configuration_request +PutEventsConfigurationResponse,put_events_configuration_response +PutEventsRequest,put_events_request +PutEventsRequestEntry,put_events_request_entry +PutEventsResponse,put_events_response +PutEventsResultEntry,put_events_result_entry +PutExternalEvaluationRequest,put_external_evaluation_request +PutExternalModelRequest,put_external_model_request +PutFeedbackRequest,put_feedback_request +PutFileEntry,put_file_entry +PutFileEntryConflictException,put_file_entry_conflict_exception +PutFileInput,put_file_input +PutFileOutput,put_file_output +PutFileSystemPolicyRequest,put_file_system_policy_request +PutFindingsPublicationConfigurationRequest,put_findings_publication_configuration_request +PutFirewallRuleGroupPolicyRequest,put_firewall_rule_group_policy_request +PutFirewallRuleGroupPolicyResponse,put_firewall_rule_group_policy_response +PutFunctionCodeSigningConfigRequest,put_function_code_signing_config_request +PutFunctionCodeSigningConfigResponse,put_function_code_signing_config_response +PutFunctionConcurrencyRequest,put_function_concurrency_request +PutFunctionEventInvokeConfigRequest,put_function_event_invoke_config_request +PutGatewayResponseRequest,put_gateway_response_request +PutGeofenceRequest,put_geofence_request +PutGeofenceResponse,put_geofence_response +PutGroupConfigurationInput,put_group_configuration_input +PutGroupPolicyRequest,put_group_policy_request +PutHypervisorPropertyMappingsInput,put_hypervisor_property_mappings_input +PutHypervisorPropertyMappingsOutput,put_hypervisor_property_mappings_output +PutIdentityPolicyRequest,put_identity_policy_request +PutImagePolicyRequest,put_image_policy_request +PutImagePolicyResponse,put_image_policy_response +PutImageRecipePolicyRequest,put_image_recipe_policy_request +PutImageRecipePolicyResponse,put_image_recipe_policy_response +PutImageRequest,put_image_request +PutImageResponse,put_image_response +PutImageScanningConfigurationRequest,put_image_scanning_configuration_request +PutImageScanningConfigurationResponse,put_image_scanning_configuration_response +PutImageTagMutabilityRequest,put_image_tag_mutability_request +PutImageTagMutabilityResponse,put_image_tag_mutability_response +PutInboundDmarcSettingsRequest,put_inbound_dmarc_settings_request +PutInlinePolicyToPermissionSetRequest,put_inline_policy_to_permission_set_request +PutInsightRuleInput,put_insight_rule_input +PutInsightSelectorsRequest,put_insight_selectors_request +PutInsightSelectorsResponse,put_insight_selectors_response +PutInstancePublicPortsRequest,put_instance_public_ports_request +PutInstancePublicPortsResult,put_instance_public_ports_result +PutIntegrationRequest,put_integration_request +PutIntegrationResponse,put_integration_response +PutIntegrationResponseRequest,put_integration_response_request +PutIntentRequest,put_intent_request +PutIntentResponse,put_intent_response +PutInventoryRequest,put_inventory_request +PutInventoryResult,put_inventory_result +PutInvitationConfigurationRequest,put_invitation_configuration_request +PutItemInput,put_item_input +PutItemOutput,put_item_output +PutItemsRequest,put_items_request +PutJobFailureResultInput,put_job_failure_result_input +PutJobSuccessResultInput,put_job_success_result_input +PutJobTaggingRequest,put_job_tagging_request +PutKMSEncryptionKeyRequest,put_kms_encryption_key_request +PutKeyPolicyRequest,put_key_policy_request +PutKeywordRequest,put_keyword_request +PutKeywordResult,put_keyword_result +PutLabelRequest,put_label_request +PutLaunchActionRequest,put_launch_action_request +PutLaunchActionResponse,put_launch_action_response +PutLaunchProfileMembersRequest,put_launch_profile_members_request +PutLexiconInput,put_lexicon_input +PutLifecycleConfigurationRequest,put_lifecycle_configuration_request +PutLifecycleEventHookExecutionStatusInput,put_lifecycle_event_hook_execution_status_input +PutLifecycleEventHookExecutionStatusOutput,put_lifecycle_event_hook_execution_status_output +PutLifecycleHookType,put_lifecycle_hook_type +PutLifecyclePolicyInput,put_lifecycle_policy_input +PutLifecyclePolicyRequest,put_lifecycle_policy_request +PutLifecyclePolicyResponse,put_lifecycle_policy_response +PutLogEventsRequest,put_log_events_request +PutLogEventsResponse,put_log_events_response +PutLoggingConfigurationRequest,put_logging_configuration_request +PutLoggingConfigurationResponse,put_logging_configuration_response +PutLoggingOptionsRequest,put_logging_options_request +PutMailboxPermissionsRequest,put_mailbox_permissions_request +PutMaintenanceStartTimeInput,put_maintenance_start_time_input +PutMaintenanceStartTimeOutput,put_maintenance_start_time_output +PutManagedInsightRulesInput,put_managed_insight_rules_input +PutManagedInsightRulesOutput,put_managed_insight_rules_output +PutManagedRuleSetVersionsRequest,put_managed_rule_set_versions_request +PutManagedRuleSetVersionsResponse,put_managed_rule_set_versions_response +PutManagedScalingPolicyInput,put_managed_scaling_policy_input +PutMessagingStreamingConfigurationsRequest,put_messaging_streaming_configurations_request +PutMessagingStreamingConfigurationsResponse,put_messaging_streaming_configurations_response +PutMetadataFlagBody,put_metadata_flag_body +PutMetadataFlagRequest,put_metadata_flag_request +PutMetadataRequest,put_metadata_request +PutMethodRequest,put_method_request +PutMethodResponseRequest,put_method_response_request +PutMetricAlarmInput,put_metric_alarm_input +PutMetricDataInput,put_metric_data_input +PutMetricFilterRequest,put_metric_filter_request +PutMetricPolicyInput,put_metric_policy_input +PutMetricStreamInput,put_metric_stream_input +PutMetricStreamOutput,put_metric_stream_output +PutMobileDeviceAccessOverrideRequest,put_mobile_device_access_override_request +PutModelInvocationLoggingConfigurationRequest,put_model_invocation_logging_configuration_request +PutModelPackageGroupPolicyInput,put_model_package_group_policy_input +PutModelPackageGroupPolicyOutput,put_model_package_group_policy_output +PutMultiRegionAccessPointPolicyInput,put_multi_region_access_point_policy_input +PutMultiRegionAccessPointPolicyRequest,put_multi_region_access_point_policy_request +PutMultiRegionAccessPointPolicyResult,put_multi_region_access_point_policy_result +PutNotificationChannelRequest,put_notification_channel_request +PutNotificationConfigurationType,put_notification_configuration_type +PutNotificationSettingsRequest,put_notification_settings_request +PutNotificationSettingsResponse,put_notification_settings_response +PutObjectAclOutput,put_object_acl_output +PutObjectAclRequest,put_object_acl_request +PutObjectInput,put_object_input +PutObjectLegalHoldOutput,put_object_legal_hold_output +PutObjectLegalHoldRequest,put_object_legal_hold_request +PutObjectLockConfigurationOutput,put_object_lock_configuration_output +PutObjectLockConfigurationRequest,put_object_lock_configuration_request +PutObjectOutput,put_object_output +PutObjectRequest,put_object_request +PutObjectResponse,put_object_response +PutObjectRetentionOutput,put_object_retention_output +PutObjectRetentionRequest,put_object_retention_request +PutObjectTaggingOutput,put_object_tagging_output +PutObjectTaggingRequest,put_object_tagging_request +PutOptedOutNumberRequest,put_opted_out_number_request +PutOptedOutNumberResult,put_opted_out_number_result +PutOrganizationConfigRuleRequest,put_organization_config_rule_request +PutOrganizationConfigRuleResponse,put_organization_config_rule_response +PutOrganizationConformancePackRequest,put_organization_conformance_pack_request +PutOrganizationConformancePackResponse,put_organization_conformance_pack_response +PutOriginEndpointPolicyRequest,put_origin_endpoint_policy_request +PutOutcomeRequest,put_outcome_request +PutPackageOriginConfigurationRequest,put_package_origin_configuration_request +PutPackageOriginConfigurationResult,put_package_origin_configuration_result +PutParameterRequest,put_parameter_request +PutParameterResult,put_parameter_result +PutPartnerEventsRequest,put_partner_events_request +PutPartnerEventsRequestEntry,put_partner_events_request_entry +PutPartnerEventsResponse,put_partner_events_response +PutPartnerEventsResultEntry,put_partner_events_result_entry +PutPermissionPolicyRequest,put_permission_policy_request +PutPermissionRequest,put_permission_request +PutPermissionResponse,put_permission_response +PutPermissionsBoundaryToPermissionSetRequest,put_permissions_boundary_to_permission_set_request +PutPipelineDefinitionInput,put_pipeline_definition_input +PutPipelineDefinitionOutput,put_pipeline_definition_output +PutPlaybackConfigurationRequest,put_playback_configuration_request +PutPlaybackConfigurationResponse,put_playback_configuration_response +PutPolicyRequest,put_policy_request +PutPolicyResponse,put_policy_response +PutPortfolioPreferencesRequest,put_portfolio_preferences_request +PutPositionConfigurationRequest,put_position_configuration_request +PutPrincipalMappingRequest,put_principal_mapping_request +PutProfileObjectRequest,put_profile_object_request +PutProfileObjectResponse,put_profile_object_response +PutProfileObjectTypeRequest,put_profile_object_type_request +PutProfileObjectTypeResponse,put_profile_object_type_response +PutProjectEventsRequest,put_project_events_request +PutProjectEventsResponse,put_project_events_response +PutProjectEventsResultEntry,put_project_events_result_entry +PutProjectPolicyRequest,put_project_policy_request +PutProjectPolicyResponse,put_project_policy_response +PutProtocolsListRequest,put_protocols_list_request +PutProtocolsListResponse,put_protocols_list_response +PutProvisionedConcurrencyConfigRequest,put_provisioned_concurrency_config_request +PutProvisionedConcurrencyConfigResponse,put_provisioned_concurrency_config_response +PutPublicAccessBlockRequest,put_public_access_block_request +PutQueryDefinitionRequest,put_query_definition_request +PutQueryDefinitionResponse,put_query_definition_response +PutRawMessageContentRequest,put_raw_message_content_request +PutRecommendationFeedbackRequest,put_recommendation_feedback_request +PutRecommendationPreferencesRequest,put_recommendation_preferences_request +PutRecordBatchInput,put_record_batch_input +PutRecordBatchOutput,put_record_batch_output +PutRecordBatchResponseEntry,put_record_batch_response_entry +PutRecordInput,put_record_input +PutRecordOutput,put_record_output +PutRecordRequest,put_record_request +PutRecordsInput,put_records_input +PutRecordsOutput,put_records_output +PutRecordsRequestEntry,put_records_request_entry +PutRecordsResultEntry,put_records_result_entry +PutRegistryCatalogDataRequest,put_registry_catalog_data_request +PutRegistryCatalogDataResponse,put_registry_catalog_data_response +PutRegistryPolicyRequest,put_registry_policy_request +PutRegistryPolicyResponse,put_registry_policy_response +PutRegistryScanningConfigurationRequest,put_registry_scanning_configuration_request +PutRegistryScanningConfigurationResponse,put_registry_scanning_configuration_response +PutRemediationConfigurationsRequest,put_remediation_configurations_request +PutRemediationConfigurationsResponse,put_remediation_configurations_response +PutRemediationExceptionsRequest,put_remediation_exceptions_request +PutRemediationExceptionsResponse,put_remediation_exceptions_response +PutReplicationConfigurationRequest,put_replication_configuration_request +PutReplicationConfigurationResponse,put_replication_configuration_response +PutReportDefinitionRequest,put_report_definition_request +PutReportDefinitionResult,put_report_definition_result +PutRepositoryCatalogDataRequest,put_repository_catalog_data_request +PutRepositoryCatalogDataResponse,put_repository_catalog_data_response +PutRepositoryPermissionsPolicyRequest,put_repository_permissions_policy_request +PutRepositoryPermissionsPolicyResult,put_repository_permissions_policy_result +PutRepositoryTriggersInput,put_repository_triggers_input +PutRepositoryTriggersOutput,put_repository_triggers_output +PutRequest,put_request +PutResolverQueryLogConfigPolicyRequest,put_resolver_query_log_config_policy_request +PutResolverQueryLogConfigPolicyResponse,put_resolver_query_log_config_policy_response +PutResolverRulePolicyRequest,put_resolver_rule_policy_request +PutResolverRulePolicyResponse,put_resolver_rule_policy_response +PutResourceAttributesRequest,put_resource_attributes_request +PutResourceConfigRequest,put_resource_config_request +PutResourceLogLevelRequest,put_resource_log_level_request +PutResourcePermissionInput,put_resource_permission_input +PutResourcePermissionOutput,put_resource_permission_output +PutResourcePolicyInput,put_resource_policy_input +PutResourcePolicyOutput,put_resource_policy_output +PutResourcePolicyRequest,put_resource_policy_request +PutResourcePolicyResponse,put_resource_policy_response +PutResourcePolicyResult,put_resource_policy_result +PutResourceSetRequest,put_resource_set_request +PutResourceSetResponse,put_resource_set_response +PutRestApiRequest,put_rest_api_request +PutRetentionConfigurationRequest,put_retention_configuration_request +PutRetentionConfigurationResponse,put_retention_configuration_response +PutRetentionPolicyRequest,put_retention_policy_request +PutRetentionSettingsRequest,put_retention_settings_request +PutRetentionSettingsResponse,put_retention_settings_response +PutRolePermissionsBoundaryRequest,put_role_permissions_boundary_request +PutRolePolicyRequest,put_role_policy_request +PutRoomSkillParameterRequest,put_room_skill_parameter_request +PutRuleGroupsNamespaceRequest,put_rule_groups_namespace_request +PutRuleGroupsNamespaceResponse,put_rule_groups_namespace_response +PutRuleRequest,put_rule_request +PutRuleResponse,put_rule_response +PutRumEventsRequest,put_rum_events_request +PutRumMetricsDestinationRequest,put_rum_metrics_destination_request +PutRuntimeManagementConfigRequest,put_runtime_management_config_request +PutRuntimeManagementConfigResponse,put_runtime_management_config_response +PutScalingPolicyInput,put_scaling_policy_input +PutScalingPolicyOutput,put_scaling_policy_output +PutScalingPolicyRequest,put_scaling_policy_request +PutScalingPolicyResponse,put_scaling_policy_response +PutScalingPolicyType,put_scaling_policy_type +PutScheduledActionRequest,put_scheduled_action_request +PutScheduledUpdateGroupActionType,put_scheduled_update_group_action_type +PutSchemaFromJsonRequest,put_schema_from_json_request +PutSchemaFromJsonResponse,put_schema_from_json_response +PutSchemaInput,put_schema_input +PutSchemaOutput,put_schema_output +PutSchemaVersionMetadataInput,put_schema_version_metadata_input +PutSchemaVersionMetadataResponse,put_schema_version_metadata_response +PutSecretValueRequest,put_secret_value_request +PutSecretValueResponse,put_secret_value_response +PutServiceQuotaIncreaseRequestIntoTemplateRequest,put_service_quota_increase_request_into_template_request +PutServiceQuotaIncreaseRequestIntoTemplateResponse,put_service_quota_increase_request_into_template_response +PutSessionRequest,put_session_request +PutSessionResponse,put_session_response +PutSigningProfileRequest,put_signing_profile_request +PutSigningProfileResponse,put_signing_profile_response +PutSinkPolicyInput,put_sink_policy_input +PutSinkPolicyOutput,put_sink_policy_output +PutSipMediaApplicationAlexaSkillConfigurationRequest,put_sip_media_application_alexa_skill_configuration_request +PutSipMediaApplicationAlexaSkillConfigurationResponse,put_sip_media_application_alexa_skill_configuration_response +PutSipMediaApplicationLoggingConfigurationRequest,put_sip_media_application_logging_configuration_request +PutSipMediaApplicationLoggingConfigurationResponse,put_sip_media_application_logging_configuration_response +PutSkillAuthorizationRequest,put_skill_authorization_request +PutSlotTypeRequest,put_slot_type_request +PutSlotTypeResponse,put_slot_type_response +PutSnapshotBlockRequest,put_snapshot_block_request +PutSnapshotBlockResponse,put_snapshot_block_response +PutSolFunctionPackageContentInput,put_sol_function_package_content_input +PutSolFunctionPackageContentMetadata,put_sol_function_package_content_metadata +PutSolFunctionPackageContentOutput,put_sol_function_package_content_output +PutSolNetworkPackageContentInput,put_sol_network_package_content_input +PutSolNetworkPackageContentMetadata,put_sol_network_package_content_metadata +PutSolNetworkPackageContentOutput,put_sol_network_package_content_output +PutSourceServerActionRequest,put_source_server_action_request +PutStorageConfigurationRequest,put_storage_configuration_request +PutStorageConfigurationResponse,put_storage_configuration_response +PutStorageLensConfigurationRequest,put_storage_lens_configuration_request +PutStorageLensConfigurationTaggingRequest,put_storage_lens_configuration_tagging_request +PutStoredQueryRequest,put_stored_query_request +PutStoredQueryResponse,put_stored_query_response +PutStudioMembersRequest,put_studio_members_request +PutSubscriptionFilterRequest,put_subscription_filter_request +PutSuppressedDestinationRequest,put_suppressed_destination_request +PutTargetsRequest,put_targets_request +PutTargetsResponse,put_targets_response +PutTargetsResultEntry,put_targets_result_entry +PutTelemetryRecordsRequest,put_telemetry_records_request +PutTemplateActionRequest,put_template_action_request +PutThirdPartyJobFailureResultInput,put_third_party_job_failure_result_input +PutThirdPartyJobSuccessResultInput,put_third_party_job_success_result_input +PutTraceSegmentsRequest,put_trace_segments_request +PutTraceSegmentsResult,put_trace_segments_result +PutUserPermissionsBoundaryRequest,put_user_permissions_boundary_request +PutUserPolicyRequest,put_user_policy_request +PutUserStatusRequest,put_user_status_request +PutUsersRequest,put_users_request +PutVerificationStateOnViolationRequest,put_verification_state_on_violation_request +PutVoiceConnectorEmergencyCallingConfigurationRequest,put_voice_connector_emergency_calling_configuration_request +PutVoiceConnectorEmergencyCallingConfigurationResponse,put_voice_connector_emergency_calling_configuration_response +PutVoiceConnectorLoggingConfigurationRequest,put_voice_connector_logging_configuration_request +PutVoiceConnectorLoggingConfigurationResponse,put_voice_connector_logging_configuration_response +PutVoiceConnectorOriginationRequest,put_voice_connector_origination_request +PutVoiceConnectorOriginationResponse,put_voice_connector_origination_response +PutVoiceConnectorProxyRequest,put_voice_connector_proxy_request +PutVoiceConnectorProxyResponse,put_voice_connector_proxy_response +PutVoiceConnectorStreamingConfigurationRequest,put_voice_connector_streaming_configuration_request +PutVoiceConnectorStreamingConfigurationResponse,put_voice_connector_streaming_configuration_response +PutVoiceConnectorTerminationCredentialsRequest,put_voice_connector_termination_credentials_request +PutVoiceConnectorTerminationRequest,put_voice_connector_termination_request +PutVoiceConnectorTerminationResponse,put_voice_connector_termination_response +PutWarmPoolType,put_warm_pool_type +PutWebhookInput,put_webhook_input +PutWebhookOutput,put_webhook_output +PutWorkflowRunPropertiesRequest,put_workflow_run_properties_request +Pwd,pwd +PythonScript,python_script +PythonVersion,python_version +QRCodePNG,qr_code_png +QSearchBar,q_search_bar +QopConfiguration,qop_configuration +Qualification,qualification +QualificationRequest,qualification_request +QualificationRequestId,qualification_request_id +QualificationRequests,qualification_requests +QualificationRequirement,qualification_requirement +QualificationRequirements,qualification_requirements +QualificationStatus,qualification_status +QualificationType,qualification_type +QualificationTypeId,qualification_type_id +QualificationTypeStatus,qualification_type_status +QualificationTypes,qualification_types +Qualifications,qualifications +Qualifier,qualifier +Quality,quality +QualityCheck,quality_check +QualityCheckStepMetadata,quality_check_step_metadata +QualityFilter,quality_filter +QualityLevel,quality_level +QualityTuningLevel,quality_tuning_level +Quantile,quantile +Quantity,quantity +QuantumTaskQueueInfo,quantum_task_queue_info +QuantumTaskSummary,quantum_task_summary +Queries,queries +QueriesConfig,queries_config +Query,query +QueryAlias,query_alias +QueryArg,query_arg +QueryArgProfile,query_arg_profile +QueryArgProfileConfig,query_arg_profile_config +QueryArgProfileEmpty,query_arg_profile_empty +QueryArgProfiles,query_arg_profiles +QueryArgument,query_argument +QueryArn,query_arn +QueryAsOfTime,query_as_of_time +QueryAssistantRequest,query_assistant_request +QueryAssistantResponse,query_assistant_response +QueryCapacityUnits,query_capacity_units +QueryCompileError,query_compile_error +QueryCompileErrorLocation,query_compile_error_location +QueryDefinition,query_definition +QueryEndDate,query_end_date +QueryError,query_error +QueryErrors,query_errors +QueryEvalStats,query_eval_stats +QueryExecution,query_execution +QueryExecutionContext,query_execution_context +QueryExecutionException,query_execution_exception +QueryExecutionId,query_execution_id +QueryExecutionIds,query_execution_ids +QueryExecutionStatistics,query_execution_statistics +QueryExecutionStatus,query_execution_status +QueryExecutions,query_executions +QueryFilter,query_filter +QueryFilters,query_filters +QueryForecastRequest,query_forecast_request +QueryForecastResponse,query_forecast_response +QueryId,query_id +QueryIdNotFoundException,query_id_not_found_exception +QueryIdentifiersEnclosingOption,query_identifiers_enclosing_option +QueryInfo,query_info +QueryInput,query_input +QueryLanguageVersion,query_language_version +QueryLimitExceededException,query_limit_exceeded_exception +QueryLimitException,query_limit_exception +QueryLineageRequest,query_lineage_request +QueryLineageResponse,query_lineage_response +QueryLogLookBackWindowInDays,query_log_look_back_window_in_days +QueryLoggingConfig,query_logging_config +QueryLoggingConfigAlreadyExists,query_logging_config_already_exists +QueryLoggingConfigs,query_logging_configs +QueryName,query_name +QueryObjectsInput,query_objects_input +QueryObjectsOutput,query_objects_output +QueryOutput,query_output +QueryParameterMatch,query_parameter_match +QueryParameters,query_parameters +QueryPlanningContext,query_planning_context +QueryPlanningTimeInMillis,query_planning_time_in_millis +QueryQueueTimeInMillis,query_queue_time_in_millis +QueryRecommendationTriggerData,query_recommendation_trigger_data +QueryRequest,query_request +QueryResponse,query_response +QueryResult,query_result +QueryResultItem,query_result_item +QueryResultRows,query_result_rows +QueryResultTypeFilter,query_result_type_filter +QueryRuntimeStatistics,query_runtime_statistics +QueryRuntimeStatisticsRows,query_runtime_statistics_rows +QueryRuntimeStatisticsTimeline,query_runtime_statistics_timeline +QuerySchemaVersionMetadataInput,query_schema_version_metadata_input +QuerySchemaVersionMetadataResponse,query_schema_version_metadata_response +QueryScopes,query_scopes +QuerySingleAlwaysOnNode,query_single_always_on_node +QueryStage,query_stage +QueryStagePlan,query_stage_plan +QueryStagePlanNode,query_stage_plan_node +QueryStartDate,query_start_date +QueryStatement,query_statement +QueryStatistics,query_statistics +QueryStatisticsForDescribeQuery,query_statistics_for_describe_query +QueryStatus,query_status +QueryString,query_string +QueryStringBehavior,query_string_behavior +QueryStringCacheKeys,query_string_cache_keys +QueryStringConditionConfig,query_string_condition_config +QueryStringConfig,query_string_config +QueryStringKeyValuePair,query_string_key_value_pair +QueryStringNames,query_string_names +QueryStringObject,query_string_object +QueryStringParameters,query_string_parameters +QueryStrings,query_strings +QueryStringsConfig,query_strings_config +QuerySubmissionTime,query_submission_time +QuerySuggestionsBlockListSummary,query_suggestions_block_list_summary +QuerySuggestionsId,query_suggestions_id +QueryTableRowsRequest,query_table_rows_request +QueryTableRowsResult,query_table_rows_result +QueryText,query_text +QueryTexts,query_texts +QueryTimeoutException,query_timeout_exception +QueryTooLargeException,query_too_large_exception +QueryWhatIfForecastRequest,query_what_if_forecast_request +QueryWhatIfForecastResponse,query_what_if_forecast_response +Question,question +QuestionChoices,question_choices +QuestionDescription,question_description +QuestionDifference,question_difference +QuestionDifferences,question_differences +QuestionId,question_id +QuestionIdentifier,question_identifier +QuestionMetric,question_metric +QuestionPriority,question_priority +QuestionTitle,question_title +QuestionType,question_type +QuestionTypeProperties,question_type_properties +Questions,questions +Queue,queue +QueueArn,queue_arn +QueueConfig,queue_config +QueueConfigs,queue_configs +QueueConfiguration,queue_configuration +QueueConfigurations,queue_configurations +QueueId,queue_id +QueueInfo,queue_info +QueueName,queue_name +QueueNamePrefix,queue_name_prefix +QueueOwnerAWSAccountId,queue_owner_aws_account_id +QueueQuickConnectConfig,queue_quick_connect_config +QueueReference,queue_reference +QueueReferences,queue_references +QueueSearchCriteria,queue_search_criteria +QueueSearchFilter,queue_search_filter +QueueSummary,queue_summary +QueueSummaryList,queue_summary_list +QueueTimeMillis,queue_time_millis +QueueTransition,queue_transition +QueueTransitions,queue_transitions +QueueType,queue_type +QueueTypeCondition,queue_type_condition +QueueTypes,queue_types +QueueUrl,queue_url +QueueUrls,queue_urls +QueuedIngestion,queued_ingestion +Queues,queues +QuickConnect,quick_connect +QuickConnectARN,quick_connect_arn +QuickConnectConfig,quick_connect_config +QuickConnectId,quick_connect_id +QuickConnectIds,quick_connect_ids +QuickConnectSearchCriteria,quick_connect_search_criteria +QuickConnectSearchFilter,quick_connect_search_filter +QuickConnectSummary,quick_connect_summary +QuickConnectSummaryList,quick_connect_summary_list +QuickConnectType,quick_connect_type +QuickConnectTypes,quick_connect_types +QuickConnects,quick_connects +QuickSightConsole,quick_sight_console +QuickSightUserNotFoundException,quick_sight_user_not_found_exception +Quiet,quiet +QuietTime,quiet_time +QuipConfiguration,quip_configuration +Quota,quota +QuotaAppliedAtLevel,quota_applied_at_level +QuotaArn,quota_arn +QuotaCode,quota_code +QuotaContext,quota_context +QuotaContextInfo,quota_context_info +QuotaExceededException,quota_exceeded_exception +QuotaName,quota_name +QuotaPeriod,quota_period +QuotaRequestedAtLevel,quota_requested_at_level +QuotaSettings,quota_settings +Quotas,quotas +QuoteChar,quote_char +QuoteCharacter,quote_character +QuoteEscapeCharacter,quote_escape_character +QuoteFields,quote_fields +QuoteSymbol,quote_symbol +QvbrQualityLevel,qvbr_quality_level +QvbrQualityLevelFineTune,qvbr_quality_level_fine_tune +QvbrSettings,qvbr_settings +R53HostedZoneDeletionState,r53_hosted_zone_deletion_state +R53Resource,r53_resource +R53ResourceRecord,r53_resource_record +RDFGraphSummary,rdf_graph_summary +RDFGraphSummaryValueMap,rdf_graph_summary_value_map +RDSData,rds_data +RDSDataSpec,rds_data_spec +RDSDatabase,rds_database +RDSDatabaseCredentials,rds_database_credentials +RDSInstanceDetails,rds_instance_details +RDSMetadata,rds_metadata +RDSSourceConfig,rds_source_config +RICostForUnusedHours,ri_cost_for_unused_hours +RMSE,rmse +RSessionAppSettings,r_session_app_settings +RStudioConnectUrl,r_studio_connect_url +RStudioPackageManagerUrl,r_studio_package_manager_url +RStudioServerProAppSettings,r_studio_server_pro_app_settings +RStudioServerProDomainSettings,r_studio_server_pro_domain_settings +RStudioServerProDomainSettingsForUpdate,r_studio_server_pro_domain_settings_for_update +RTMPConfiguration,rtmp_configuration +RaAllowed,ra_allowed +RabbitMQBrokerParameters,rabbit_mq_broker_parameters +RackElevation,rack_elevation +RackId,rack_id +RackPhysicalProperties,rack_physical_properties +RadarChartAggregatedFieldWells,radar_chart_aggregated_field_wells +RadarChartAreaStyleSettings,radar_chart_area_style_settings +RadarChartConfiguration,radar_chart_configuration +RadarChartFieldWells,radar_chart_field_wells +RadarChartSeriesSettings,radar_chart_series_settings +RadarChartSortConfiguration,radar_chart_sort_configuration +RadarChartVisual,radar_chart_visual +Radios,radios +Radius,radius +RadiusPort,radius_port +RadiusRetries,radius_retries +RadiusServers,radius_servers +RadiusSettings,radius_settings +RadiusStatus,radius_status +RadiusTimeout,radius_timeout +RaidArray,raid_array +RaidArrayId,raid_array_id +RaidArrayIds,raid_array_ids +RaidArrays,raid_arrays +RaidLevel,raid_level +RamDiskId,ram_disk_id +Ramdisk,ramdisk +RamdiskId,ramdisk_id +RandomNonce,random_nonce +RandomPassword,random_password +RandomSeed,random_seed +RandomSplit,random_split +RandomSplitActivity,random_split_activity +RandomSplitEntry,random_split_entry +Range,range +RangeConstant,range_constant +RangeEndsLabelType,range_ends_label_type +RangeInBytes,range_in_bytes +RangeInKilometers,range_in_kilometers +RangeMaximum,range_maximum +RangeMaximumValue,range_maximum_value +RangeMinimum,range_minimum +RangeMinimumValue,range_minimum_value +RangeNotSatisfiableException,range_not_satisfiable_exception +RangedConnectionDetails,ranged_connection_details +RangedSocketAddress,ranged_socket_address +RangesOnIndexedValues,ranges_on_indexed_values +Rank,rank +RankOrder,rank_order +RasterDataCollectionArn,raster_data_collection_arn +RasterDataCollectionMetadata,raster_data_collection_metadata +RasterDataCollectionName,raster_data_collection_name +RasterDataCollectionQuery,raster_data_collection_query +RasterDataCollectionQueryInput,raster_data_collection_query_input +RasterDataCollectionQueryOutput,raster_data_collection_query_output +RasterDataCollectionQueryWithBandFilterInput,raster_data_collection_query_with_band_filter_input +RasterDataCollectionSummaries,raster_data_collection_summaries +RateBasedRule,rate_based_rule +RateBasedStatement,rate_based_statement +RateBasedStatementCustomKey,rate_based_statement_custom_key +RateBasedStatementManagedKeysIPSet,rate_based_statement_managed_keys_ip_set +RateControlMode,rate_control_mode +RateExceededException,rate_exceeded_exception +RateIncreaseCriteria,rate_increase_criteria +RateKey,rate_key +RateLimit,rate_limit +RateLimitCookie,rate_limit_cookie +RateLimitExceededException,rate_limit_exceeded_exception +RateLimitHeader,rate_limit_header +RateLimitLabelNamespace,rate_limit_label_namespace +RateLimitQueryArgument,rate_limit_query_argument +RateLimitQueryString,rate_limit_query_string +RateLimitUriPath,rate_limit_uri_path +RateMode,rate_mode +Rating,rating +Raw,raw +RawContent,raw_content +RawEmail,raw_email +RawFormat,raw_format +RawInputRecords,raw_input_records +RawMessage,raw_message +RawMessageContent,raw_message_content +RawMetricData,raw_metric_data +RawSecretAccessKey,raw_secret_access_key +RawSettings,raw_settings +RawString,raw_string +RblName,rbl_name +RdsConfiguration,rds_configuration +RdsDbClusterSnapshotConfiguration,rds_db_cluster_snapshot_configuration +RdsDbInstance,rds_db_instance +RdsDbInstanceArn,rds_db_instance_arn +RdsDbInstanceArns,rds_db_instance_arns +RdsDbInstanceDetails,rds_db_instance_details +RdsDbInstances,rds_db_instances +RdsDbSnapshotConfiguration,rds_db_snapshot_configuration +RdsDbUserDetails,rds_db_user_details +RdsEngine,rds_engine +RdsEventCategories,rds_event_categories +RdsEventMessage,rds_event_message +RdsHttpEndpointConfig,rds_http_endpoint_config +RdsLoginAttemptAction,rds_login_attempt_action +RdsParameters,rds_parameters +RdsRecommendation,rds_recommendation +RdsRequirements,rds_requirements +RdsResourceId,rds_resource_id +ReEncryptDataInput,re_encrypt_data_input +ReEncryptDataOutput,re_encrypt_data_output +ReEncryptRequest,re_encrypt_request +ReEncryptResponse,re_encrypt_response +ReactStartCodegenJobData,react_start_codegen_job_data +ReactionForComment,reaction_for_comment +ReactionLimitExceededException,reaction_limit_exceeded_exception +ReactionValueFormats,reaction_value_formats +ReactionValueRequiredException,reaction_value_required_exception +Reactions,reactions +ReactiveAnomalies,reactive_anomalies +ReactiveAnomaly,reactive_anomaly +ReactiveAnomalySummary,reactive_anomaly_summary +ReactiveInsight,reactive_insight +ReactiveInsightSummary,reactive_insight_summary +ReactiveInsights,reactive_insights +ReactiveOrganizationInsightSummary,reactive_organization_insight_summary +Read,read +ReadAccessPrincipalArns,read_access_principal_arns +ReadAheadBlocks,read_ahead_blocks +ReadAttributes,read_attributes +ReadBackupOnly,read_backup_only +ReadCapacityUnits,read_capacity_units +ReadDeleteRate,read_delete_rate +ReadEndpoint,read_endpoint +ReadIOs,read_ios +ReadJobRequest,read_job_request +ReadJobResponse,read_job_response +ReadMarkerTimestamp,read_marker_timestamp +ReadOnly,read_only +ReadOnlyAdmins,read_only_admins +ReadOnlyFieldInfo,read_only_field_info +ReadOnlyFields,read_only_fields +ReadOnlyViolationException,read_only_violation_exception +ReadOptions,read_options +ReadPipelineRequest,read_pipeline_request +ReadPipelineResponse,read_pipeline_response +ReadPresetRequest,read_preset_request +ReadPresetResponse,read_preset_response +ReadRate,read_rate +ReadRatePercent,read_rate_percent +ReadReplicaCapable,read_replica_capable +ReadReplicaDBClusterIdentifiers,read_replica_db_cluster_identifiers +ReadReplicaDBInstanceIdentifiers,read_replica_db_instance_identifiers +ReadReplicaIdentifiers,read_replica_identifiers +ReadReplicaSourceDBClusterIdentifier,read_replica_source_db_cluster_identifier +ReadReplicaSourceDBInstanceIdentifier,read_replica_source_db_instance_identifier +ReadSetBatchError,read_set_batch_error +ReadSetFiles,read_set_files +ReadSetFilter,read_set_filter +ReadSetListItem,read_set_list_item +ReadSetUploadPartListFilter,read_set_upload_part_list_filter +ReadSetUploadPartListItem,read_set_upload_part_list_item +ReadTableSpaceName,read_table_space_name +ReadTime,read_time +ReadTimestamp,read_timestamp +ReadWriteType,read_write_type +ReaderEndpoint,reader_endpoint +ReaderGroup,reader_group +Readers,readers +Readiness,readiness +ReadinessCheckArn,readiness_check_arn +ReadinessCheckName,readiness_check_name +ReadinessCheckOutput,readiness_check_output +ReadinessCheckSummary,readiness_check_summary +ReadinessChecks,readiness_checks +ReadinessScopes,readiness_scopes +ReadmeBody,readme_body +ReadmeUrl,readme_url +ReadonlyRootFilesystem,readonly_root_filesystem +Ready,ready +ReadyDateTime,ready_date_time +RealTimeAlertConfiguration,real_time_alert_configuration +RealTimeAlertRule,real_time_alert_rule +RealTimeInferenceConfig,real_time_inference_config +RealTimeInferenceRecommendation,real_time_inference_recommendation +RealTimeInferenceRecommendations,real_time_inference_recommendations +RealizedSavings,realized_savings +Realm,realm +RealtimeContactAnalysisSegment,realtime_contact_analysis_segment +RealtimeEndpointInfo,realtime_endpoint_info +RealtimeLogConfig,realtime_log_config +RealtimeLogConfigAlreadyExists,realtime_log_config_already_exists +RealtimeLogConfigArn,realtime_log_config_arn +RealtimeLogConfigInUse,realtime_log_config_in_use +RealtimeLogConfigName,realtime_log_config_name +RealtimeLogConfigOwnerMismatch,realtime_log_config_owner_mismatch +RealtimeLogConfigs,realtime_log_configs +RealtimeMetricsSubscriptionConfig,realtime_metrics_subscription_config +RealtimeMetricsSubscriptionStatus,realtime_metrics_subscription_status +Reason,reason +ReasonCode,reason_code +ReasonCodeSummary,reason_code_summary +ReasonCodes,reason_codes +ReasonContext,reason_context +ReasonForNewProvisioningData,reason_for_new_provisioning_data +ReasonMessage,reason_message +Reasons,reasons +RebalanceSlotsInGlobalReplicationGroupMessage,rebalance_slots_in_global_replication_group_message +RebalanceSlotsInGlobalReplicationGroupResult,rebalance_slots_in_global_replication_group_result +RebootBrokerRequest,reboot_broker_request +RebootBrokerResponse,reboot_broker_response +RebootCacheClusterMessage,reboot_cache_cluster_message +RebootCacheClusterResult,reboot_cache_cluster_result +RebootClusterMessage,reboot_cluster_message +RebootClusterResult,reboot_cluster_result +RebootDBClusterMessage,reboot_db_cluster_message +RebootDBClusterResult,reboot_db_cluster_result +RebootDBInstanceMessage,reboot_db_instance_message +RebootDBInstanceResult,reboot_db_instance_result +RebootInputDeviceRequest,reboot_input_device_request +RebootInstanceRequest,reboot_instance_request +RebootInstanceResult,reboot_instance_result +RebootInstancesRequest,reboot_instances_request +RebootNodeRequest,reboot_node_request +RebootNodeResponse,reboot_node_response +RebootOption,reboot_option +RebootRelationalDatabaseRequest,reboot_relational_database_request +RebootRelationalDatabaseResult,reboot_relational_database_result +RebootReplicationInstanceMessage,reboot_replication_instance_message +RebootReplicationInstanceResponse,reboot_replication_instance_response +RebootRequest,reboot_request +RebootWorkspaceRequests,reboot_workspace_requests +RebootWorkspacesRequest,reboot_workspaces_request +RebootWorkspacesResult,reboot_workspaces_result +Rebooting,rebooting +RebuildEnvironmentMessage,rebuild_environment_message +RebuildRequest,rebuild_request +RebuildSnapshots,rebuild_snapshots +RebuildWorkspace,rebuild_workspace +RebuildWorkspaceRequests,rebuild_workspace_requests +RebuildWorkspacesRequest,rebuild_workspaces_request +RebuildWorkspacesResult,rebuild_workspaces_result +Rec601Settings,rec601_settings +Rec709Settings,rec709_settings +Recall,recall +Receipt,receipt +ReceiptAction,receipt_action +ReceiptFilter,receipt_filter +ReceiptHandle,receipt_handle +ReceiptInfo,receipt_info +ReceiptIpFilter,receipt_ip_filter +ReceiptRule,receipt_rule +ReceiptRuleSetMetadata,receipt_rule_set_metadata +ReceiptTime,receipt_time +ReceiptType,receipt_type +Receipts,receipts +ReceiveMessageRequest,receive_message_request +ReceiveMessageResult,receive_message_result +ReceiveRequestAttemptId,receive_request_attempt_id +ReceivedAt,received_at +ReceivedEventAgeHistogram,received_event_age_histogram +ReceivedMetadata,received_metadata +ReceivedStatus,received_status +ReceivedStatusReason,received_status_reason +ReceivedTime,received_time +Recency,recency +RecencyDimension,recency_dimension +RecencyType,recency_type +RecentCaseCommunications,recent_case_communications +RecentlyActive,recently_active +RecentlyFailedRuns,recently_failed_runs +Recipe,recipe +RecipeAction,recipe_action +RecipeArn,recipe_arn +RecipeName,recipe_name +RecipeReference,recipe_reference +RecipeStep,recipe_step +RecipeSummary,recipe_summary +RecipeUri,recipe_uri +RecipeVersion,recipe_version +RecipeVersionErrorDetail,recipe_version_error_detail +RecipeVersions,recipe_versions +Recipes,recipes +Recipient,recipient +RecipientArn,recipient_arn +RecipientDetail,recipient_detail +RecipientDsnFields,recipient_dsn_fields +RecipientId,recipient_id +RecipientInfo,recipient_info +RecipientParticipantId,recipient_participant_id +Recipients,recipients +RecognizeCelebritiesRequest,recognize_celebrities_request +RecognizeCelebritiesResponse,recognize_celebrities_response +RecognizeTextRequest,recognize_text_request +RecognizeTextResponse,recognize_text_response +RecognizeUtteranceRequest,recognize_utterance_request +RecognizeUtteranceResponse,recognize_utterance_response +RecognizedBotMember,recognized_bot_member +RecognizerMetadata,recognizer_metadata +RecognizerName,recognizer_name +Recommendation,recommendation +RecommendationCategory,recommendation_category +RecommendationData,recommendation_data +RecommendationDescription,recommendation_description +RecommendationDetailData,recommendation_detail_data +RecommendationDetailHourlyMetrics,recommendation_detail_hourly_metrics +RecommendationDetailId,recommendation_detail_id +RecommendationDetails,recommendation_details +RecommendationDisruptionCompliance,recommendation_disruption_compliance +RecommendationExportJob,recommendation_export_job +RecommendationFeedback,recommendation_feedback +RecommendationFeedbackSummaries,recommendation_feedback_summaries +RecommendationFeedbackSummary,recommendation_feedback_summary +RecommendationId,recommendation_id +RecommendationIds,recommendation_ids +RecommendationItem,recommendation_item +RecommendationJobCompiledOutputConfig,recommendation_job_compiled_output_config +RecommendationJobContainerConfig,recommendation_job_container_config +RecommendationJobInferenceBenchmark,recommendation_job_inference_benchmark +RecommendationJobInputConfig,recommendation_job_input_config +RecommendationJobOutputConfig,recommendation_job_output_config +RecommendationJobPayloadConfig,recommendation_job_payload_config +RecommendationJobResourceLimit,recommendation_job_resource_limit +RecommendationJobStoppingConditions,recommendation_job_stopping_conditions +RecommendationJobVpcConfig,recommendation_job_vpc_config +RecommendationMetrics,recommendation_metrics +RecommendationPreferences,recommendation_preferences +RecommendationPreferencesDetail,recommendation_preferences_detail +RecommendationProviderIdType,recommendation_provider_id_type +RecommendationProviderRoleArn,recommendation_provider_role_arn +RecommendationProviderUri,recommendation_provider_uri +RecommendationRelatedAnomaly,recommendation_related_anomaly +RecommendationRelatedAnomalyResource,recommendation_related_anomaly_resource +RecommendationRelatedAnomalySourceDetail,recommendation_related_anomaly_source_detail +RecommendationRelatedCloudWatchMetricsSourceDetail,recommendation_related_cloud_watch_metrics_source_detail +RecommendationRelatedEvent,recommendation_related_event +RecommendationRelatedEventResource,recommendation_related_event_resource +RecommendationReportDetails,recommendation_report_details +RecommendationRunId,recommendation_run_id +RecommendationSet,recommendation_set +RecommendationSettings,recommendation_settings +RecommendationSource,recommendation_source +RecommendationStatus,recommendation_status +RecommendationSummaries,recommendation_summaries +RecommendationSummary,recommendation_summary +RecommendationTarget,recommendation_target +RecommendationTemplate,recommendation_template +RecommendationText,recommendation_text +RecommendationTransformerUri,recommendation_transformer_uri +RecommendationTrigger,recommendation_trigger +RecommendationType,recommendation_type +Recommendations,recommendations +RecommendationsDisplayName,recommendations_display_name +RecommendationsPerMessage,recommendations_per_message +RecommendedIntentSummary,recommended_intent_summary +RecommendedNormalizedUnitsToPurchase,recommended_normalized_units_to_purchase +RecommendedNumberOfInstancesToPurchase,recommended_number_of_instances_to_purchase +RecommendedOptionProjectedMetric,recommended_option_projected_metric +RecommendedRuleset,recommended_ruleset +RecommendedVersion,recommended_version +Recommender,recommender +RecommenderConfig,recommender_config +RecommenderConfigurationResponse,recommender_configuration_response +RecommenderId,recommender_id +RecommenderSummary,recommender_summary +RecommenderUpdateSummary,recommender_update_summary +ReconfigurationType,reconfiguration_type +ReconnectEnabled,reconnect_enabled +Record,record +RecordActivityTaskHeartbeatInput,record_activity_task_heartbeat_input +RecordColumn,record_column +RecordColumnDelimiter,record_column_delimiter +RecordColumnUpdates,record_column_updates +RecordColumns,record_columns +RecordData,record_data +RecordDelimiter,record_delimiter +RecordDetail,record_detail +RecordDetails,record_details +RecordEncoding,record_encoding +RecordEncodingUpdate,record_encoding_update +RecordError,record_error +RecordErrors,record_errors +RecordFormat,record_format +RecordFormatType,record_format_type +RecordFormatUpdate,record_format_update +RecordHandlerProgressInput,record_handler_progress_input +RecordId,record_id +RecordIdentifierFeatureName,record_identifier_feature_name +RecordIdentifierValueAsString,record_identifier_value_as_string +RecordIdentifiersValueAsString,record_identifiers_value_as_string +RecordIndex,record_index +RecordIngestionFailures,record_ingestion_failures +RecordLength,record_length +RecordLifecycleActionHeartbeatType,record_lifecycle_action_heartbeat_type +RecordMarkerDecisionAttributes,record_marker_decision_attributes +RecordMarkerFailedEventAttributes,record_marker_failed_event_attributes +RecordName,record_name +RecordOutput,record_output +RecordOutputs,record_outputs +RecordPatch,record_patch +RecordPatches,record_patches +RecordPollingLimit,record_polling_limit +RecordPreprocessorSourceUri,record_preprocessor_source_uri +RecordRowDelimiter,record_row_delimiter +RecordRowPath,record_row_path +RecordSetId,record_set_id +RecordSizeKiB,record_size_kib +RecordState,record_state +RecordTag,record_tag +RecordTags,record_tags +RecordType,record_type +RecordVersion,record_version +RecordWrapperType,record_wrapper_type +RecordedAt,recorded_at +RecorderConfig,recorder_config +RecorderStatus,recorder_status +RecordingConfiguration,recording_configuration +RecordingConfigurationSummary,recording_configuration_summary +RecordingFileFormat,recording_file_format +RecordingGroup,recording_group +RecordingStrategy,recording_strategy +RecordingStreamConfiguration,recording_stream_configuration +Records,records +RecordsEvent,records_event +RecordsIngested,records_ingested +RecordsProcessed,records_processed +RecoveryCheckpoint,recovery_checkpoint +RecoveryGroupArn,recovery_group_arn +RecoveryGroupName,recovery_group_name +RecoveryGroupOutput,recovery_group_output +RecoveryGroups,recovery_groups +RecoveryInstance,recovery_instance +RecoveryInstanceDataReplicationError,recovery_instance_data_replication_error +RecoveryInstanceDataReplicationInfo,recovery_instance_data_replication_info +RecoveryInstanceDataReplicationInfoReplicatedDisk,recovery_instance_data_replication_info_replicated_disk +RecoveryInstanceDataReplicationInitiation,recovery_instance_data_replication_initiation +RecoveryInstanceDataReplicationInitiationStep,recovery_instance_data_replication_initiation_step +RecoveryInstanceDisk,recovery_instance_disk +RecoveryInstanceFailback,recovery_instance_failback +RecoveryInstanceProperties,recovery_instance_properties +RecoveryLifeCycle,recovery_life_cycle +RecoveryMechanisms,recovery_mechanisms +RecoveryOptionType,recovery_option_type +RecoveryPoint,recovery_point +RecoveryPointArn,recovery_point_arn +RecoveryPointByBackupVault,recovery_point_by_backup_vault +RecoveryPointByResource,recovery_point_by_resource +RecoveryPointCreator,recovery_point_creator +RecoveryPointMember,recovery_point_member +RecoveryPointSelection,recovery_point_selection +RecoveryPointTags,recovery_point_tags +RecoveryPoints,recovery_points +RecoverySnapshot,recovery_snapshot +RecoveryWindow,recovery_window +RecoveryWindowInDays,recovery_window_in_days +RecrawlBehavior,recrawl_behavior +RecrawlPolicy,recrawl_policy +Rectangle,rectangle +Recurrence,recurrence +RecurrenceInHours,recurrence_in_hours +RecurrenceMultiplier,recurrence_multiplier +RecurrenceSettings,recurrence_settings +RecurringCharge,recurring_charge +RecurringChargeAmount,recurring_charge_amount +RecurringChargeFrequency,recurring_charge_frequency +RecurringCharges,recurring_charges +RecurringCount,recurring_count +RecurringStandardMonthlyCost,recurring_standard_monthly_cost +Recurse,recurse +Recursive,recursive +RecursiveDeleteOption,recursive_delete_option +RecursiveInvocationException,recursive_invocation_exception +RecycleBinEnterTime,recycle_bin_enter_time +RecycleBinExitTime,recycle_bin_exit_time +RecycleBinFolderId,recycle_bin_folder_id +Red,red +RedPrimaryX,red_primary_x +RedPrimaryY,red_primary_y +RedactChannelMessageRequest,redact_channel_message_request +RedactChannelMessageResponse,redact_channel_message_response +RedactConversationMessageRequest,redact_conversation_message_request +RedactRoomMessageRequest,redact_room_message_request +Redacted,redacted +RedactedEwsAvailabilityProvider,redacted_ews_availability_provider +RedactedFields,redacted_fields +RedactedMediaFileUri,redacted_media_file_uri +RedactedTranscriptFileUri,redacted_transcript_file_uri +RedactionConfig,redaction_config +RedactionOutput,redaction_output +RedactionType,redaction_type +Redirect,redirect +RedirectActionConfig,redirect_action_config +RedirectAllRequestsTo,redirect_all_requests_to +RedirectConfig,redirect_config +RedirectException,redirect_exception +RedirectLocation,redirect_location +RedirectSignInURIs,redirect_sign_in_uris +RedirectSignOutURIs,redirect_sign_out_uris +RedirectURL,redirect_url +RedisSettings,redis_settings +Redshift,redshift +RedshiftConnectorProfileCredentials,redshift_connector_profile_credentials +RedshiftConnectorProfileProperties,redshift_connector_profile_properties +RedshiftDataParameters,redshift_data_parameters +RedshiftDataProviderSettings,redshift_data_provider_settings +RedshiftDataShareAsset,redshift_data_share_asset +RedshiftDataShareAssetSourceEntry,redshift_data_share_asset_source_entry +RedshiftDataSpec,redshift_data_spec +RedshiftDatabase,redshift_database +RedshiftDatabaseCredentials,redshift_database_credentials +RedshiftDatasetDefinition,redshift_dataset_definition +RedshiftDestinationConfiguration,redshift_destination_configuration +RedshiftDestinationDescription,redshift_destination_description +RedshiftDestinationProperties,redshift_destination_properties +RedshiftDestinationUpdate,redshift_destination_update +RedshiftInstanceDetails,redshift_instance_details +RedshiftMetadata,redshift_metadata +RedshiftParameters,redshift_parameters +RedshiftPid,redshift_pid +RedshiftQueryId,redshift_query_id +RedshiftRetryOptions,redshift_retry_options +RedshiftSettings,redshift_settings +RedshiftSource,redshift_source +RedshiftSourceConfig,redshift_source_config +RedshiftTarget,redshift_target +RedshiftTmpDir,redshift_tmp_dir +RedundancyPercent,redundancy_percent +RedundantManifest,redundant_manifest +ReenrollAllCertificateHolders,reenroll_all_certificate_holders +RefId,ref_id +RefResource,ref_resource +Reference,reference +ReferenceActionName,reference_action_name +ReferenceArn,reference_arn +ReferenceData,reference_data +ReferenceDataSource,reference_data_source +ReferenceDataSourceDescription,reference_data_source_description +ReferenceDataSourceDescriptions,reference_data_source_descriptions +ReferenceDataSourceUpdate,reference_data_source_update +ReferenceDataSourceUpdates,reference_data_source_updates +ReferenceDataSources,reference_data_sources +ReferenceDoesNotExistException,reference_does_not_exist_exception +ReferenceFiles,reference_files +ReferenceFilter,reference_filter +ReferenceId,reference_id +ReferenceImage,reference_image +ReferenceLine,reference_line +ReferenceLineCustomLabelConfiguration,reference_line_custom_label_configuration +ReferenceLineDataConfiguration,reference_line_data_configuration +ReferenceLineDynamicDataConfiguration,reference_line_dynamic_data_configuration +ReferenceLineLabelConfiguration,reference_line_label_configuration +ReferenceLineStaticDataConfiguration,reference_line_static_data_configuration +ReferenceLineStyleConfiguration,reference_line_style_configuration +ReferenceLineValueLabelConfiguration,reference_line_value_label_configuration +ReferenceLines,reference_lines +ReferenceListItem,reference_list_item +ReferenceMetric,reference_metric +ReferenceNameRequiredException,reference_name_required_exception +ReferencePath,reference_path +ReferencePredictorArn,reference_predictor_arn +ReferencePredictorSummary,reference_predictor_summary +ReferenceRoleARN,reference_role_arn +ReferenceRoleARNUpdate,reference_role_arn_update +ReferenceScalar,reference_scalar +ReferenceSchema,reference_schema +ReferenceSchemaUpdate,reference_schema_update +ReferenceSets,reference_sets +ReferenceStoreDetail,reference_store_detail +ReferenceStoreFilter,reference_store_filter +ReferenceSummaryList,reference_summary_list +ReferenceTypeNotSupportedException,reference_type_not_supported_exception +ReferenceTypes,reference_types +ReferenceUrls,reference_urls +ReferencedBy,referenced_by +ReferencedByResources,referenced_by_resources +ReferencedGroupId,referenced_group_id +ReferencedGroupInfo,referenced_group_info +ReferencedImageDetail,referenced_image_detail +ReferencedImagesNotFoundException,referenced_images_not_found_exception +ReferencedSecurityGroup,referenced_security_group +References,references +ReferencingVpcId,referencing_vpc_id +ReferrerPolicy,referrer_policy +Refresh,refresh +RefreshArn,refresh_arn +RefreshCacheInput,refresh_cache_input +RefreshCacheOutput,refresh_cache_output +RefreshClosedReports,refresh_closed_reports +RefreshConfiguration,refresh_configuration +RefreshDetails,refresh_details +RefreshFrequency,refresh_frequency +RefreshId,refresh_id +RefreshOnDay,refresh_on_day +RefreshOnSegmentUpdate,refresh_on_segment_update +RefreshPreferences,refresh_preferences +RefreshSchedule,refresh_schedule +RefreshSchedules,refresh_schedules +RefreshSchemasMessage,refresh_schemas_message +RefreshSchemasResponse,refresh_schemas_response +RefreshSchemasStatus,refresh_schemas_status +RefreshStatisticsIdMap,refresh_statistics_id_map +RefreshStatus,refresh_status +RefreshToken,refresh_token +RefreshTokenExpiration,refresh_token_expiration +RefreshTokenRequest,refresh_token_request +RefreshTokenRequestBody,refresh_token_request_body +RefreshTokenResponse,refresh_token_response +RefreshTokenValidity,refresh_token_validity +RefreshTrustedAdvisorCheckRequest,refresh_trusted_advisor_check_request +RefreshTrustedAdvisorCheckResponse,refresh_trusted_advisor_check_response +RefreshType,refresh_type +RefreshedAt,refreshed_at +RegParamsRevision,reg_params_revision +RegenerateSecurityTokenRequest,regenerate_security_token_request +RegenerateSecurityTokenResponse,regenerate_security_token_response +Regex,regex +RegexMatchSet,regex_match_set +RegexMatchSetId,regex_match_set_id +RegexMatchSetSummary,regex_match_set_summary +RegexMatchSetUpdate,regex_match_set_update +RegexMatchSets,regex_match_sets +RegexMatchStatement,regex_match_statement +RegexMatchTuple,regex_match_tuple +RegexMatchTuples,regex_match_tuples +RegexPatternSet,regex_pattern_set +RegexPatternSetId,regex_pattern_set_id +RegexPatternSetReferenceStatement,regex_pattern_set_reference_statement +RegexPatternSetSummary,regex_pattern_set_summary +RegexPatternSetUpdate,regex_pattern_set_update +RegexPatternSets,regex_pattern_sets +RegexPatternString,regex_pattern_string +RegexPatternStrings,regex_pattern_strings +RegexString,regex_string +Region,region +RegionCode,region_code +RegionConcurrencyType,region_concurrency_type +RegionDescription,region_description +RegionDisabledException,region_disabled_exception +RegionFilters,region_filters +RegionIdentifier,region_identifier +RegionInfo,region_info +RegionLimitExceededException,region_limit_exceeded_exception +RegionLinkingMode,region_linking_mode +RegionMapInputValue,region_map_input_value +RegionName,region_name +RegionNames,region_names +RegionOfInterest,region_of_interest +RegionOptStatus,region_opt_status +RegionOptStatusContains,region_opt_status_contains +RegionOrder,region_order +RegionReport,region_report +RegionScope,region_scope +RegionType,region_type +RegionalBucket,regional_bucket +RegionalBucketList,regional_bucket_list +RegionalConfiguration,regional_configuration +RegionalConfigurations,regional_configurations +Regions,regions +RegionsDescription,regions_description +RegionsInfo,regions_info +RegionsOfInterest,regions_of_interest +RegionsOfInterestForUpdate,regions_of_interest_for_update +RegisterAVSDeviceRequest,register_avs_device_request +RegisterAVSDeviceResponse,register_avs_device_response +RegisterAccountRequest,register_account_request +RegisterAccountResponse,register_account_response +RegisterActivityTypeInput,register_activity_type_input +RegisterAgentRequest,register_agent_request +RegisterAgentResponse,register_agent_response +RegisterAppInstanceUserEndpointRequest,register_app_instance_user_endpoint_request +RegisterAppInstanceUserEndpointResponse,register_app_instance_user_endpoint_response +RegisterApplicationInput,register_application_input +RegisterApplicationOutput,register_application_output +RegisterApplicationRevisionInput,register_application_revision_input +RegisterCACertificateRequest,register_ca_certificate_request +RegisterCACertificateResponse,register_ca_certificate_response +RegisterCertificateRequest,register_certificate_request +RegisterCertificateResponse,register_certificate_response +RegisterCertificateResult,register_certificate_result +RegisterCertificateWithoutCARequest,register_certificate_without_ca_request +RegisterCertificateWithoutCAResponse,register_certificate_without_ca_response +RegisterClientRequest,register_client_request +RegisterClientResponse,register_client_response +RegisterClusterRequest,register_cluster_request +RegisterClusterResponse,register_cluster_response +RegisterComputeInput,register_compute_input +RegisterComputeOutput,register_compute_output +RegisterConnectorRequest,register_connector_request +RegisterConnectorResponse,register_connector_response +RegisterContainerImageRequest,register_container_image_request +RegisterContainerImageResult,register_container_image_result +RegisterContainerInstanceRequest,register_container_instance_request +RegisterContainerInstanceResponse,register_container_instance_response +RegisterCrossAccountAccessRoleRequest,register_cross_account_access_role_request +RegisterDBProxyTargetsRequest,register_db_proxy_targets_request +RegisterDBProxyTargetsResponse,register_db_proxy_targets_response +RegisterDataLakeDelegatedAdministratorRequest,register_data_lake_delegated_administrator_request +RegisterDefaultPatchBaselineRequest,register_default_patch_baseline_request +RegisterDefaultPatchBaselineResult,register_default_patch_baseline_result +RegisterDelegatedAdministratorRequest,register_delegated_administrator_request +RegisterDeviceRequest,register_device_request +RegisterDeviceResponse,register_device_response +RegisterDevicesRequest,register_devices_request +RegisterDomainInput,register_domain_input +RegisterDomainRequest,register_domain_request +RegisterDomainResponse,register_domain_response +RegisterEcsClusterRequest,register_ecs_cluster_request +RegisterEcsClusterResult,register_ecs_cluster_result +RegisterElasticIpRequest,register_elastic_ip_request +RegisterElasticIpResult,register_elastic_ip_result +RegisterEndPointsInput,register_end_points_input +RegisterEndPointsOutput,register_end_points_output +RegisterEndpoints,register_endpoints +RegisterEventTopicRequest,register_event_topic_request +RegisterGameServerInput,register_game_server_input +RegisterGameServerOutput,register_game_server_output +RegisterIdentityProviderRequest,register_identity_provider_request +RegisterIdentityProviderResponse,register_identity_provider_response +RegisterImageRequest,register_image_request +RegisterImageResult,register_image_result +RegisterInstanceEventNotificationAttributesRequest,register_instance_event_notification_attributes_request +RegisterInstanceEventNotificationAttributesResult,register_instance_event_notification_attributes_result +RegisterInstanceRequest,register_instance_request +RegisterInstanceResponse,register_instance_response +RegisterInstanceResult,register_instance_result +RegisterInstanceTagAttributeRequest,register_instance_tag_attribute_request +RegisterJobDefinitionRequest,register_job_definition_request +RegisterJobDefinitionResponse,register_job_definition_response +RegisterMailDomainRequest,register_mail_domain_request +RegisterModel,register_model +RegisterModelStepMetadata,register_model_step_metadata +RegisterNewBaseline,register_new_baseline +RegisterOnPremisesInstanceInput,register_on_premises_instance_input +RegisterOrganizationAdminAccountRequest,register_organization_admin_account_request +RegisterOrganizationAdminAccountResponse,register_organization_admin_account_response +RegisterOrganizationDelegatedAdminRequest,register_organization_delegated_admin_request +RegisterPackageVersionRequest,register_package_version_request +RegisterPatchBaselineForPatchGroupRequest,register_patch_baseline_for_patch_group_request +RegisterPatchBaselineForPatchGroupResult,register_patch_baseline_for_patch_group_result +RegisterPublisherInput,register_publisher_input +RegisterPublisherOutput,register_publisher_output +RegisterRdsDbInstanceRequest,register_rds_db_instance_request +RegisterResourceRequest,register_resource_request +RegisterRobotRequest,register_robot_request +RegisterRobotResponse,register_robot_response +RegisterScalableTargetRequest,register_scalable_target_request +RegisterScalableTargetResponse,register_scalable_target_response +RegisterSchemaVersionInput,register_schema_version_input +RegisterSchemaVersionResponse,register_schema_version_response +RegisterSlackWorkspaceForOrganizationRequest,register_slack_workspace_for_organization_request +RegisterSlackWorkspaceForOrganizationResult,register_slack_workspace_for_organization_result +RegisterStreamConsumerInput,register_stream_consumer_input +RegisterStreamConsumerOutput,register_stream_consumer_output +RegisterTargetWithMaintenanceWindowRequest,register_target_with_maintenance_window_request +RegisterTargetWithMaintenanceWindowResult,register_target_with_maintenance_window_result +RegisterTargetsInput,register_targets_input +RegisterTargetsRequest,register_targets_request +RegisterTargetsResponse,register_targets_response +RegisterTaskDefinitionRequest,register_task_definition_request +RegisterTaskDefinitionResponse,register_task_definition_response +RegisterTaskWithMaintenanceWindowRequest,register_task_with_maintenance_window_request +RegisterTaskWithMaintenanceWindowResult,register_task_with_maintenance_window_result +RegisterThingRequest,register_thing_request +RegisterThingResponse,register_thing_response +RegisterToWorkMailRequest,register_to_work_mail_request +RegisterTransitGatewayMulticastGroupMembersRequest,register_transit_gateway_multicast_group_members_request +RegisterTransitGatewayMulticastGroupMembersResult,register_transit_gateway_multicast_group_members_result +RegisterTransitGatewayMulticastGroupSourcesRequest,register_transit_gateway_multicast_group_sources_request +RegisterTransitGatewayMulticastGroupSourcesResult,register_transit_gateway_multicast_group_sources_result +RegisterTransitGatewayRequest,register_transit_gateway_request +RegisterTransitGatewayResponse,register_transit_gateway_response +RegisterTypeInput,register_type_input +RegisterTypeOutput,register_type_output +RegisterUsageRequest,register_usage_request +RegisterUsageResult,register_usage_result +RegisterUserRequest,register_user_request +RegisterUserResponse,register_user_response +RegisterVolumeRequest,register_volume_request +RegisterVolumeResult,register_volume_result +RegisterWebhookWithThirdPartyInput,register_webhook_with_third_party_input +RegisterWorkflowTypeInput,register_workflow_type_input +RegisterWorkspaceDirectoryRequest,register_workspace_directory_request +Registered,registered +RegisteredAt,registered_at +RegisteredBy,registered_by +RegisteredContainerInstancesCount,registered_container_instances_count +RegisteredDate,registered_date +RegisteredDateTime,registered_date_time +RegisteredDeviceCount,registered_device_count +RegisteredDomainDelegationInfo,registered_domain_delegation_info +RegisteredGatewayArn,registered_gateway_arn +RegisteredId,registered_id +RegisteredMulticastGroupMembers,registered_multicast_group_members +RegisteredMulticastGroupSources,registered_multicast_group_sources +RegisteredNetworkInterfaceIds,registered_network_interface_ids +RegisteredOn,registered_on +RegisteredTime,registered_time +RegisteredUserConsoleFeatureConfigurations,registered_user_console_feature_configurations +RegisteredUserDashboardEmbeddingConfiguration,registered_user_dashboard_embedding_configuration +RegisteredUserDashboardFeatureConfigurations,registered_user_dashboard_feature_configurations +RegisteredUserDashboardVisualEmbeddingConfiguration,registered_user_dashboard_visual_embedding_configuration +RegisteredUserEmbeddingExperienceConfiguration,registered_user_embedding_experience_configuration +RegisteredUserQSearchBarEmbeddingConfiguration,registered_user_q_search_bar_embedding_configuration +RegisteredUserQuickSightConsoleEmbeddingConfiguration,registered_user_quick_sight_console_embedding_configuration +Registering,registering +RegistrantContact,registrant_contact +RegistrantPrivacy,registrant_privacy +RegistrarName,registrar_name +RegistrarUrl,registrar_url +RegistrationCode,registration_code +RegistrationCodeValidationException,registration_code_validation_exception +RegistrationConfig,registration_config +RegistrationDate,registration_date +RegistrationId,registration_id +RegistrationLimit,registration_limit +RegistrationMetadata,registration_metadata +RegistrationMetadataItem,registration_metadata_item +RegistrationOutput,registration_output +RegistrationPagePath,registration_page_path +RegistrationPrice,registration_price +RegistrationStatusFilter,registration_status_filter +RegistrationTime,registration_time +RegistrationToken,registration_token +RegistrationTokenList,registration_token_list +RegistrationZone,registration_zone +RegistrationsCount,registrations_count +Registries,registries +Registry,registry +RegistryAlias,registry_alias +RegistryArn,registry_arn +RegistryCatalogData,registry_catalog_data +RegistryCredential,registry_credential +RegistryDomainId,registry_domain_id +RegistryId,registry_id +RegistryListItem,registry_list_item +RegistryName,registry_name +RegistryNamePrefix,registry_name_prefix +RegistryNotFoundException,registry_not_found_exception +RegistryPolicyNotFoundException,registry_policy_not_found_exception +RegistryScanningConfiguration,registry_scanning_configuration +RegistryScanningRule,registry_scanning_rule +RegistrySummary,registry_summary +RegularExpressionList,regular_expression_list +RehydrationType,rehydration_type +ReimportApiRequest,reimport_api_request +ReimportApiResponse,reimport_api_response +RejectAssignmentRequest,reject_assignment_request +RejectAttachmentRequest,reject_attachment_request +RejectAttachmentResponse,reject_attachment_response +RejectCertificateTransferRequest,reject_certificate_transfer_request +RejectClientVpcConnectionRequest,reject_client_vpc_connection_request +RejectDataShareMessage,reject_data_share_message +RejectDomainTransferFromAnotherAwsAccountRequest,reject_domain_transfer_from_another_aws_account_request +RejectDomainTransferFromAnotherAwsAccountResponse,reject_domain_transfer_from_another_aws_account_response +RejectEnvironmentAccountConnectionInput,reject_environment_account_connection_input +RejectEnvironmentAccountConnectionOutput,reject_environment_account_connection_output +RejectGrantRequest,reject_grant_request +RejectGrantResponse,reject_grant_response +RejectInboundConnectionRequest,reject_inbound_connection_request +RejectInboundConnectionResponse,reject_inbound_connection_response +RejectInboundCrossClusterSearchConnectionRequest,reject_inbound_cross_cluster_search_connection_request +RejectInboundCrossClusterSearchConnectionResponse,reject_inbound_cross_cluster_search_connection_response +RejectInputDeviceTransferRequest,reject_input_device_transfer_request +RejectInvitationInput,reject_invitation_input +RejectInvitationRequest,reject_invitation_request +RejectPortfolioShareInput,reject_portfolio_share_input +RejectQualificationRequestRequest,reject_qualification_request_request +RejectResourceShareInvitationRequest,reject_resource_share_invitation_request +RejectResourceShareInvitationResponse,reject_resource_share_invitation_response +RejectSharedDirectoryRequest,reject_shared_directory_request +RejectSharedDirectoryResult,reject_shared_directory_result +RejectSkillRequest,reject_skill_request +RejectTransitGatewayMulticastDomainAssociationsRequest,reject_transit_gateway_multicast_domain_associations_request +RejectTransitGatewayMulticastDomainAssociationsResult,reject_transit_gateway_multicast_domain_associations_result +RejectTransitGatewayPeeringAttachmentRequest,reject_transit_gateway_peering_attachment_request +RejectTransitGatewayPeeringAttachmentResult,reject_transit_gateway_peering_attachment_result +RejectTransitGatewayVpcAttachmentRequest,reject_transit_gateway_vpc_attachment_request +RejectTransitGatewayVpcAttachmentResult,reject_transit_gateway_vpc_attachment_result +RejectVpcEndpointConnectionsRequest,reject_vpc_endpoint_connections_request +RejectVpcEndpointConnectionsResult,reject_vpc_endpoint_connections_result +RejectVpcPeeringConnectionRequest,reject_vpc_peering_connection_request +RejectVpcPeeringConnectionResult,reject_vpc_peering_connection_result +RejectedLogEventsInfo,rejected_log_events_info +RejectedPatches,rejected_patches +RejectedPatchesAction,rejected_patches_action +RejectedRecord,rejected_record +RejectedRecords,rejected_records +RejectedRecordsException,rejected_records_exception +RejectionTime,rejection_time +Rejects,rejects +RekeyFuzzPercentage,rekey_fuzz_percentage +RekeyMarginTimeSeconds,rekey_margin_time_seconds +RelatedAnomalies,related_anomalies +RelatedColumnName,related_column_name +RelatedContactId,related_contact_id +RelatedDeployments,related_deployments +RelatedEvents,related_events +RelatedFinding,related_finding +RelatedFindings,related_findings +RelatedFindingsId,related_findings_id +RelatedFindingsProductArn,related_findings_product_arn +RelatedItem,related_item +RelatedItemEventIncludedData,related_item_event_included_data +RelatedObservations,related_observations +RelatedOpsItem,related_ops_item +RelatedOpsItems,related_ops_items +RelatedRequirements,related_requirements +RelatedResource,related_resource +RelatedResourceArns,related_resource_arns +RelatedVulnerabilities,related_vulnerabilities +RelatedWorkspaceProperties,related_workspace_properties +RelatedWorkspaces,related_workspaces +RelationType,relation_type +RelationalCatalogSource,relational_catalog_source +RelationalDatabase,relational_database +RelationalDatabaseBlueprint,relational_database_blueprint +RelationalDatabaseBundle,relational_database_bundle +RelationalDatabaseDataSourceConfig,relational_database_data_source_config +RelationalDatabaseEndpoint,relational_database_endpoint +RelationalDatabaseEvent,relational_database_event +RelationalDatabaseHardware,relational_database_hardware +RelationalDatabaseParameter,relational_database_parameter +RelationalDatabaseSnapshot,relational_database_snapshot +RelationalTable,relational_table +Relationship,relationship +RelationshipScore,relationship_score +RelationshipStatus,relationship_status +RelationshipType,relationship_type +RelationshipTypeFilter,relationship_type_filter +RelationshipValue,relationship_value +Relationships,relationships +RelationshipsListItem,relationships_list_item +Relative,relative +RelativeAggregationDuration,relative_aggregation_duration +RelativeDateFilter,relative_date_filter +RelativeDateFilterFunction,relative_date_filter_function +RelativeDateTime,relative_date_time +RelativeDateTimeControlDisplayOptions,relative_date_time_control_display_options +RelativeDateType,relative_date_type +RelativeDateValue,relative_date_value +RelativeDatesFilter,relative_dates_filter +RelativePath,relative_path +RelativePosition,relative_position +RelativeProgram,relative_program +RelativeTimeRange,relative_time_range +RelayState,relay_state +RelayStateParameterName,relay_state_parameter_name +Release,release +ReleaseAddressRequest,release_address_request +ReleaseAfterMinutes,release_after_minutes +ReleaseAgentPath,release_agent_path +ReleaseConfiguration,release_configuration +ReleaseDate,release_date +ReleaseFileSystemNfsV3LocksRequest,release_file_system_nfs_v3_locks_request +ReleaseFileSystemNfsV3LocksResponse,release_file_system_nfs_v3_locks_response +ReleaseHostsRequest,release_hosts_request +ReleaseHostsResult,release_hosts_result +ReleaseIpamPoolAllocationRequest,release_ipam_pool_allocation_request +ReleaseIpamPoolAllocationResult,release_ipam_pool_allocation_result +ReleaseLabel,release_label +ReleaseLabelFilter,release_label_filter +ReleaseLabels,release_labels +ReleaseNotes,release_notes +ReleasePhoneNumberRequest,release_phone_number_request +ReleasePhoneNumberResult,release_phone_number_result +ReleaseStaticIpRequest,release_static_ip_request +ReleaseStaticIpResult,release_static_ip_result +ReleaseStatus,release_status +ReleaseSummaries,release_summaries +ReleaseSummary,release_summary +ReleaseTime,release_time +ReleaseVersion,release_version +ReleasedCapacity,released_capacity +Relevance,relevance +RelevanceFeedback,relevance_feedback +RelevanceFeedbackItems,relevance_feedback_items +RelevanceValue,relevance_value +ReloadOption,reload_option +ReloadReplicationTablesMessage,reload_replication_tables_message +ReloadReplicationTablesResponse,reload_replication_tables_response +ReloadTablesMessage,reload_tables_message +ReloadTablesResponse,reload_tables_response +RemainingCount,remaining_count +RemainingLife,remaining_life +RemainingTotalValue,remaining_total_value +RemainingUpfrontValue,remaining_upfront_value +Remarks,remarks +Remediation,remediation +RemediationAction,remediation_action +RemediationActionType,remediation_action_type +RemediationActionWithOrder,remediation_action_with_order +RemediationConfiguration,remediation_configuration +RemediationConfigurations,remediation_configurations +RemediationEnabled,remediation_enabled +RemediationException,remediation_exception +RemediationExceptionResourceKey,remediation_exception_resource_key +RemediationExceptions,remediation_exceptions +RemediationExecutionStatus,remediation_execution_status +RemediationExecutionStatuses,remediation_execution_statuses +RemediationExecutionStep,remediation_execution_step +RemediationInProgressException,remediation_in_progress_exception +RemediationParameterValue,remediation_parameter_value +RemediationRecommendation,remediation_recommendation +RemediationResult,remediation_result +RemediationUrl,remediation_url +ReminderAtMinutes,reminder_at_minutes +ReminderType,reminder_type +RemixSettings,remix_settings +Remote,remote +RemoteAccessConfig,remote_access_config +RemoteAccessSession,remote_access_session +RemoteAccountDetails,remote_account_details +RemoteAdministrationEndpoint,remote_administration_endpoint +RemoteDirectoryPath,remote_directory_path +RemoteDomainInfo,remote_domain_info +RemoteDomainName,remote_domain_name +RemoteDomainNames,remote_domain_names +RemoteId,remote_id +RemoteIpDetails,remote_ip_details +RemoteIpv4NetworkCidr,remote_ipv4_network_cidr +RemoteIpv6NetworkCidr,remote_ipv6_network_cidr +RemoteManagement,remote_management +RemoteMta,remote_mta +RemotePortDetails,remote_port_details +RemoteSourceCodeAnalysisServerInfo,remote_source_code_analysis_server_info +RemoteSources,remote_sources +Removals,removals +Remove,remove +RemoveAccountFromOrganizationRequest,remove_account_from_organization_request +RemoveAclConfiguration,remove_acl_configuration +RemoveAction,remove_action +RemoveAllBackendsRequest,remove_all_backends_request +RemoveAllBackendsResponse,remove_all_backends_response +RemoveAllPermissions,remove_all_permissions +RemoveAllResourcePermissionsRequest,remove_all_resource_permissions_request +RemoveAllocationResourceTags,remove_allocation_resource_tags +RemoveAllowedPrincipals,remove_allowed_principals +RemoveApplicationInstanceRequest,remove_application_instance_request +RemoveAttributesActivity,remove_attributes_activity +RemoveAttributesFromFindingsRequest,remove_attributes_from_findings_request +RemoveAttributesFromFindingsResponse,remove_attributes_from_findings_response +RemoveAttributesRequest,remove_attributes_request +RemoveAttributesResponse,remove_attributes_response +RemoveAutoScalingPolicyInput,remove_auto_scaling_policy_input +RemoveAutoTerminationPolicyInput,remove_auto_termination_policy_input +RemoveAvailabilityZonesInput,remove_availability_zones_input +RemoveAvailabilityZonesOutput,remove_availability_zones_output +RemoveBackendConfigRequest,remove_backend_config_request +RemoveBackendConfigResponse,remove_backend_config_response +RemoveBridgeOutputRequest,remove_bridge_output_request +RemoveBridgeOutputResponse,remove_bridge_output_response +RemoveBridgeSourceRequest,remove_bridge_source_request +RemoveBridgeSourceResponse,remove_bridge_source_response +RemoveBytesScannedCutoffPerQuery,remove_bytes_scanned_cutoff_per_query +RemoveClientIDFromOpenIDConnectProviderRequest,remove_client_id_from_open_id_connect_provider_request +RemoveCustomRoutingEndpointsRequest,remove_custom_routing_endpoints_request +RemoveCustomerContentEncryptionConfiguration,remove_customer_content_encryption_configuration +RemoveCustomerOverride,remove_customer_override +RemoveDraftAppVersionResourceMappingsRequest,remove_draft_app_version_resource_mappings_request +RemoveDraftAppVersionResourceMappingsResponse,remove_draft_app_version_resource_mappings_response +RemoveEncryptionConfiguration,remove_encryption_configuration +RemoveEndDate,remove_end_date +RemoveEndpointsRequest,remove_endpoints_request +RemoveEntries,remove_entries +RemoveExpectedBucketOwner,remove_expected_bucket_owner +RemoveFacetFromObject,remove_facet_from_object +RemoveFacetFromObjectRequest,remove_facet_from_object_request +RemoveFields,remove_fields +RemoveFlowMediaStreamRequest,remove_flow_media_stream_request +RemoveFlowMediaStreamResponse,remove_flow_media_stream_response +RemoveFlowOutputRequest,remove_flow_output_request +RemoveFlowOutputResponse,remove_flow_output_response +RemoveFlowSourceRequest,remove_flow_source_request +RemoveFlowSourceResponse,remove_flow_source_response +RemoveFlowVpcInterfaceRequest,remove_flow_vpc_interface_request +RemoveFlowVpcInterfaceResponse,remove_flow_vpc_interface_response +RemoveFromGlobalClusterMessage,remove_from_global_cluster_message +RemoveFromGlobalClusterResult,remove_from_global_cluster_result +RemoveFromVersionId,remove_from_version_id +RemoveGatewayLoadBalancerArns,remove_gateway_load_balancer_arns +RemoveHeadersConfig,remove_headers_config +RemoveIamRoles,remove_iam_roles +RemoveInvalidCertificateFromPersonalStore,remove_invalid_certificate_from_personal_store +RemoveIpRoutesRequest,remove_ip_routes_request +RemoveIpamOperatingRegion,remove_ipam_operating_region +RemoveKnowledgeBaseTemplateUriRequest,remove_knowledge_base_template_uri_request +RemoveLFTagsFromResourceRequest,remove_lf_tags_from_resource_request +RemoveLFTagsFromResourceResponse,remove_lf_tags_from_resource_response +RemoveLayerVersionPermissionRequest,remove_layer_version_permission_request +RemoveLicenseSpecifications,remove_license_specifications +RemoveListenerCertificatesInput,remove_listener_certificates_input +RemoveManagedScalingPolicyInput,remove_managed_scaling_policy_input +RemoveNetworkLoadBalancerArns,remove_network_load_balancer_arns +RemoveNetworkServices,remove_network_services +RemoveNotificationChannelRequest,remove_notification_channel_request +RemoveNotificationChannelResponse,remove_notification_channel_response +RemoveOperatingRegions,remove_operating_regions +RemoveOutputLocation,remove_output_location +RemovePermissionInput,remove_permission_input +RemovePermissionRequest,remove_permission_request +RemovePermissionResponse,remove_permission_response +RemovePrefixListEntry,remove_prefix_list_entry +RemovePrivateDnsName,remove_private_dns_name +RemoveProfilePermissionRequest,remove_profile_permission_request +RemoveProfilePermissionResponse,remove_profile_permission_response +RemoveQuotes,remove_quotes +RemoveRegionRequest,remove_region_request +RemoveRegionsFromReplicationRequest,remove_regions_from_replication_request +RemoveRegionsFromReplicationResponse,remove_regions_from_replication_response +RemoveReplicaRegions,remove_replica_regions +RemoveResourcePermissionRequest,remove_resource_permission_request +RemoveRoleFromDBClusterMessage,remove_role_from_db_cluster_message +RemoveRoleFromDBInstanceMessage,remove_role_from_db_instance_message +RemoveRoleFromInstanceProfileRequest,remove_role_from_instance_profile_request +RemoveRouteTableIds,remove_route_table_ids +RemoveSNSTopic,remove_sns_topic +RemoveSchemaVersionMetadataInput,remove_schema_version_metadata_input +RemoveSchemaVersionMetadataResponse,remove_schema_version_metadata_response +RemoveSecurityGroupIds,remove_security_group_ids +RemoveSourceIdentifierFromSubscriptionMessage,remove_source_identifier_from_subscription_message +RemoveSourceIdentifierFromSubscriptionResult,remove_source_identifier_from_subscription_result +RemoveSourceServerActionRequest,remove_source_server_action_request +RemoveStorageSystemRequest,remove_storage_system_request +RemoveSubnetArns,remove_subnet_arns +RemoveSubnetIds,remove_subnet_ids +RemoveSubnets,remove_subnets +RemoveSupportedIpAddressTypes,remove_supported_ip_address_types +RemoveTagKeys,remove_tag_keys +RemoveTags,remove_tags +RemoveTagsFromCertificateRequest,remove_tags_from_certificate_request +RemoveTagsFromOnPremisesInstancesInput,remove_tags_from_on_premises_instances_input +RemoveTagsFromResourceInput,remove_tags_from_resource_input +RemoveTagsFromResourceMessage,remove_tags_from_resource_message +RemoveTagsFromResourceOutput,remove_tags_from_resource_output +RemoveTagsFromResourceRequest,remove_tags_from_resource_request +RemoveTagsFromResourceResponse,remove_tags_from_resource_response +RemoveTagsFromStreamInput,remove_tags_from_stream_input +RemoveTagsFromVaultInput,remove_tags_from_vault_input +RemoveTagsInput,remove_tags_input +RemoveTagsRequest,remove_tags_request +RemoveTargetsRequest,remove_targets_request +RemoveTargetsResponse,remove_targets_response +RemoveTargetsResultEntry,remove_targets_result_entry +RemoveTemplateActionRequest,remove_template_action_request +RemoveThingFromBillingGroupRequest,remove_thing_from_billing_group_request +RemoveThingFromThingGroupRequest,remove_thing_from_thing_group_request +RemoveTransitGatewayCidrBlocks,remove_transit_gateway_cidr_blocks +RemoveUserFromGroupRequest,remove_user_from_group_request +RemoveUserGroups,remove_user_groups +RemoveWorkloadRequest,remove_workload_request +RemovedLabels,removed_labels +RenameColumnOperation,rename_column_operation +RenameField,rename_field +RenderUiTemplateRequest,render_ui_template_request +RenderUiTemplateResponse,render_ui_template_response +RenderableTask,renderable_task +RenderedContent,rendered_content +RenderedTemplate,rendered_template +RenderingConfiguration,rendering_configuration +RenderingEngine,rendering_engine +RenderingError,rendering_error +RenderingRules,rendering_rules +RenditionConfiguration,rendition_configuration +RenditionGroupId,rendition_group_id +RenditionLanguageCode,rendition_language_code +RenditionName,rendition_name +RenewCertificateRequest,renew_certificate_request +RenewDomainRequest,renew_domain_request +RenewDomainResponse,renew_domain_response +RenewOfferingRequest,renew_offering_request +RenewOfferingResult,renew_offering_result +RenewType,renew_type +RenewalCount,renewal_count +RenewalEligibility,renewal_eligibility +RenewalPeriod,renewal_period +RenewalPrice,renewal_price +RenewalSettings,renewal_settings +RenewalStatus,renewal_status +RenewalStatusReason,renewal_status_reason +RenewalSummary,renewal_summary +RenewalType,renewal_type +ReorderReceiptRuleSetRequest,reorder_receipt_rule_set_request +RepInterval,rep_interval +RepeatAt,repeat_at +RepeatExtXKey,repeat_ext_x_key +RepeatFrameMsec,repeat_frame_msec +RepeatPps,repeat_pps +Replace,replace +ReplaceAllLabels,replace_all_labels +ReplaceChars,replace_chars +ReplaceContentEntry,replace_content_entry +ReplaceDefaultPolicyVersionParams,replace_default_policy_version_params +ReplaceIamInstanceProfileAssociationRequest,replace_iam_instance_profile_association_request +ReplaceIamInstanceProfileAssociationResult,replace_iam_instance_profile_association_result +ReplaceInvalidChars,replace_invalid_chars +ReplaceKeyPrefixWith,replace_key_prefix_with +ReplaceKeyWith,replace_key_with +ReplaceNetworkAclAssociationRequest,replace_network_acl_association_request +ReplaceNetworkAclAssociationResult,replace_network_acl_association_result +ReplaceNetworkAclEntryRequest,replace_network_acl_entry_request +ReplacePathPrefix,replace_path_prefix +ReplacePermissionAssociationsRequest,replace_permission_associations_request +ReplacePermissionAssociationsResponse,replace_permission_associations_response +ReplacePermissionAssociationsWork,replace_permission_associations_work +ReplaceRootVolumeTask,replace_root_volume_task +ReplaceRootVolumeTaskId,replace_root_volume_task_id +ReplaceRootVolumeTaskIds,replace_root_volume_task_ids +ReplaceRootVolumeTasks,replace_root_volume_tasks +ReplaceRouteRequest,replace_route_request +ReplaceRouteTableAssociationRequest,replace_route_table_association_request +ReplaceRouteTableAssociationResult,replace_route_table_association_result +ReplaceTopicRuleRequest,replace_topic_rule_request +ReplaceTransitGatewayRouteRequest,replace_transit_gateway_route_request +ReplaceTransitGatewayRouteResult,replace_transit_gateway_route_result +ReplaceUnhealthyInstances,replace_unhealthy_instances +ReplaceVpnTunnelRequest,replace_vpn_tunnel_request +ReplaceVpnTunnelResult,replace_vpn_tunnel_result +Replacement,replacement +ReplacementContentRequiredException,replacement_content_required_exception +ReplacementEmailContent,replacement_email_content +ReplacementJob,replacement_job +ReplacementStrategy,replacement_strategy +ReplacementTags,replacement_tags +ReplacementTemplate,replacement_template +ReplacementTemplateData,replacement_template_data +ReplacementTypeRequiredException,replacement_type_required_exception +Replay,replay +ReplayArn,replay_arn +ReplayDestination,replay_destination +ReplayEndTime,replay_end_time +ReplayName,replay_name +ReplayStartTime,replay_start_time +ReplayWindowSize,replay_window_size +Replays,replays +Replica,replica +ReplicaAlias,replica_alias +ReplicaAlreadyExistsException,replica_already_exists_exception +ReplicaAutoScalingDescription,replica_auto_scaling_description +ReplicaAutoScalingUpdate,replica_auto_scaling_update +ReplicaAvailabilityZones,replica_availability_zones +ReplicaBillingModeSummary,replica_billing_mode_summary +ReplicaConfiguration,replica_configuration +ReplicaConfigurationRequest,replica_configuration_request +ReplicaCount,replica_count +ReplicaDescription,replica_description +ReplicaGlobalSecondaryIndex,replica_global_secondary_index +ReplicaGlobalSecondaryIndexAutoScalingDescription,replica_global_secondary_index_auto_scaling_description +ReplicaGlobalSecondaryIndexAutoScalingUpdate,replica_global_secondary_index_auto_scaling_update +ReplicaGlobalSecondaryIndexDescription,replica_global_secondary_index_description +ReplicaGlobalSecondaryIndexSettings,replica_global_secondary_index_settings +ReplicaGlobalSecondaryIndexSettingsDescription,replica_global_secondary_index_settings_description +ReplicaGlobalSecondaryIndexSettingsUpdate,replica_global_secondary_index_settings_update +ReplicaGlobalSecondaryIndexUpdates,replica_global_secondary_index_updates +ReplicaInaccessibleDateTime,replica_inaccessible_date_time +ReplicaKeyMetadata,replica_key_metadata +ReplicaKeys,replica_keys +ReplicaKmsKeyID,replica_kms_key_id +ReplicaMode,replica_mode +ReplicaModifications,replica_modifications +ReplicaNotFoundException,replica_not_found_exception +ReplicaOutpostArns,replica_outpost_arns +ReplicaPolicy,replica_policy +ReplicaProvisionedReadCapacityAutoScalingSettings,replica_provisioned_read_capacity_auto_scaling_settings +ReplicaProvisionedReadCapacityAutoScalingSettingsUpdate,replica_provisioned_read_capacity_auto_scaling_settings_update +ReplicaProvisionedReadCapacityAutoScalingUpdate,replica_provisioned_read_capacity_auto_scaling_update +ReplicaProvisionedReadCapacityUnits,replica_provisioned_read_capacity_units +ReplicaProvisionedWriteCapacityAutoScalingSettings,replica_provisioned_write_capacity_auto_scaling_settings +ReplicaProvisionedWriteCapacityUnits,replica_provisioned_write_capacity_units +ReplicaRegion,replica_region +ReplicaRegionType,replica_region_type +ReplicaSettings,replica_settings +ReplicaSettingsDescription,replica_settings_description +ReplicaSettingsUpdate,replica_settings_update +ReplicaStatus,replica_status +ReplicaStatusDescription,replica_status_description +ReplicaStatusPercentProgress,replica_status_percent_progress +ReplicaTableClass,replica_table_class +ReplicaTableClassSummary,replica_table_class_summary +ReplicaTags,replica_tags +ReplicaUpdate,replica_update +ReplicaUpdates,replica_updates +Replicas,replicas +ReplicasPerNodeGroup,replicas_per_node_group +ReplicasToRemove,replicas_to_remove +ReplicateInstanceRequest,replicate_instance_request +ReplicateInstanceResponse,replicate_instance_response +ReplicateKeyRequest,replicate_key_request +ReplicateKeyResponse,replicate_key_response +ReplicateSecretToRegionsRequest,replicate_secret_to_regions_request +ReplicateSecretToRegionsResponse,replicate_secret_to_regions_response +ReplicateShardCollections,replicate_shard_collections +ReplicateTo,replicate_to +ReplicatingFrom,replicating_from +ReplicatingTo,replicating_to +Replication,replication +ReplicationConfig,replication_config +ReplicationConfigArn,replication_config_arn +ReplicationConfigCreateTime,replication_config_create_time +ReplicationConfigIdentifier,replication_config_identifier +ReplicationConfigUpdateTime,replication_config_update_time +ReplicationConfigs,replication_configs +ReplicationConfiguration,replication_configuration +ReplicationConfigurationDescription,replication_configuration_description +ReplicationConfigurationReplicatedDisk,replication_configuration_replicated_disk +ReplicationConfigurationTemplate,replication_configuration_template +ReplicationCreateTime,replication_create_time +ReplicationDestination,replication_destination +ReplicationDetails,replication_details +ReplicationFactor,replication_factor +ReplicationGroup,replication_group +ReplicationGroupAlreadyExistsFault,replication_group_already_exists_fault +ReplicationGroupAlreadyUnderMigrationFault,replication_group_already_under_migration_fault +ReplicationGroupCreateTime,replication_group_create_time +ReplicationGroupDescription,replication_group_description +ReplicationGroupId,replication_group_id +ReplicationGroupIds,replication_group_ids +ReplicationGroupLogDeliveryEnabled,replication_group_log_delivery_enabled +ReplicationGroupMessage,replication_group_message +ReplicationGroupNotFoundFault,replication_group_not_found_fault +ReplicationGroupNotUnderMigrationFault,replication_group_not_under_migration_fault +ReplicationGroupPendingModifiedValues,replication_group_pending_modified_values +ReplicationGroupRegion,replication_group_region +ReplicationGroupUpdate,replication_group_update +ReplicationGroups,replication_groups +ReplicationInstance,replication_instance +ReplicationInstanceArn,replication_instance_arn +ReplicationInstanceClass,replication_instance_class +ReplicationInstanceEngineMinimumVersion,replication_instance_engine_minimum_version +ReplicationInstanceIdentifier,replication_instance_identifier +ReplicationInstanceIpv6Addresses,replication_instance_ipv6_addresses +ReplicationInstancePrivateIpAddress,replication_instance_private_ip_address +ReplicationInstancePrivateIpAddresses,replication_instance_private_ip_addresses +ReplicationInstancePublicIpAddress,replication_instance_public_ip_address +ReplicationInstancePublicIpAddresses,replication_instance_public_ip_addresses +ReplicationInstanceStatus,replication_instance_status +ReplicationInstanceTaskLog,replication_instance_task_log +ReplicationInstanceTaskLogSize,replication_instance_task_log_size +ReplicationInstanceTaskLogs,replication_instance_task_logs +ReplicationInstances,replication_instances +ReplicationJob,replication_job +ReplicationJobAlreadyExistsException,replication_job_already_exists_exception +ReplicationJobNotFoundException,replication_job_not_found_exception +ReplicationLastStopTime,replication_last_stop_time +ReplicationNotFound,replication_not_found +ReplicationPendingModifiedValues,replication_pending_modified_values +ReplicationRule,replication_rule +ReplicationRuleAndOperator,replication_rule_and_operator +ReplicationRuleFilter,replication_rule_filter +ReplicationRun,replication_run +ReplicationRunLimitExceededException,replication_run_limit_exceeded_exception +ReplicationRunStageDetails,replication_run_stage_details +ReplicationScope,replication_scope +ReplicationSet,replication_set +ReplicationSettings,replication_settings +ReplicationSourceIdentifier,replication_source_identifier +ReplicationSpecification,replication_specification +ReplicationStats,replication_stats +ReplicationStatus,replication_status +ReplicationStatusType,replication_status_type +ReplicationSubnetGroup,replication_subnet_group +ReplicationSubnetGroupDescription,replication_subnet_group_description +ReplicationSubnetGroupDoesNotCoverEnoughAZs,replication_subnet_group_does_not_cover_enough_azs +ReplicationSubnetGroupId,replication_subnet_group_id +ReplicationSubnetGroupIdentifier,replication_subnet_group_identifier +ReplicationSubnetGroups,replication_subnet_groups +ReplicationTableStatistics,replication_table_statistics +ReplicationTask,replication_task +ReplicationTaskArn,replication_task_arn +ReplicationTaskAssessmentResult,replication_task_assessment_result +ReplicationTaskAssessmentResults,replication_task_assessment_results +ReplicationTaskAssessmentRun,replication_task_assessment_run +ReplicationTaskAssessmentRunArn,replication_task_assessment_run_arn +ReplicationTaskAssessmentRunCreationDate,replication_task_assessment_run_creation_date +ReplicationTaskAssessmentRunProgress,replication_task_assessment_run_progress +ReplicationTaskAssessmentRuns,replication_task_assessment_runs +ReplicationTaskCreationDate,replication_task_creation_date +ReplicationTaskIdentifier,replication_task_identifier +ReplicationTaskIndividualAssessment,replication_task_individual_assessment +ReplicationTaskIndividualAssessmentArn,replication_task_individual_assessment_arn +ReplicationTaskIndividualAssessmentStartDate,replication_task_individual_assessment_start_date +ReplicationTaskIndividualAssessments,replication_task_individual_assessments +ReplicationTaskLastAssessmentDate,replication_task_last_assessment_date +ReplicationTaskName,replication_task_name +ReplicationTaskSettings,replication_task_settings +ReplicationTaskStartDate,replication_task_start_date +ReplicationTaskStats,replication_task_stats +ReplicationTasks,replication_tasks +ReplicationTime,replication_time +ReplicationTimeValue,replication_time_value +ReplicationType,replication_type +ReplicationUpdateTime,replication_update_time +ReplicationUser,replication_user +Replications,replications +ReplyTo,reply_to +ReplyToAddresses,reply_to_addresses +ReplyToEmailAddress,reply_to_email_address +RepoPrefixLocation,repo_prefix_location +RepoUpgradeOnBoot,repo_upgrade_on_boot +Report,report +ReportConfiguration,report_configuration +ReportContext,report_context +ReportCreatorAccount,report_creator_account +ReportDefinition,report_definition +ReportDefinitions,report_definitions +ReportDeliveryChannel,report_delivery_channel +ReportDestination,report_destination +ReportDestinationS3,report_destination_s3 +ReportDevStatusBattery,report_dev_status_battery +ReportDevStatusMargin,report_dev_status_margin +ReportExportConfig,report_export_config +ReportFilter,report_filter +ReportFormat,report_format +ReportFrequency,report_frequency +ReportGenerated,report_generated +ReportGenerationLimitExceededException,report_generation_limit_exceeded_exception +ReportGenerator,report_generator +ReportGeneratorName,report_generator_name +ReportGenerators,report_generators +ReportGroup,report_group +ReportGroupTrendStats,report_group_trend_stats +ReportId,report_id +ReportInstanceStatusRequest,report_instance_status_request +ReportJob,report_job +ReportJobId,report_job_id +ReportJobs,report_jobs +ReportLevel,report_level +ReportLimitReachedException,report_limit_reached_exception +ReportName,report_name +ReportOverride,report_override +ReportOverrides,report_overrides +ReportPlan,report_plan +ReportPlanArn,report_plan_arn +ReportPlanDescription,report_plan_description +ReportPlanName,report_plan_name +ReportPlanTags,report_plan_tags +ReportPlans,report_plans +ReportResult,report_result +ReportS3Configuration,report_s3_configuration +ReportScope,report_scope +ReportSetting,report_setting +ReportTaskProgressInput,report_task_progress_input +ReportTaskProgressOutput,report_task_progress_output +ReportTaskRunnerHeartbeatInput,report_task_runner_heartbeat_input +ReportTaskRunnerHeartbeatOutput,report_task_runner_heartbeat_output +ReportTemplate,report_template +ReportType,report_type +ReportUri,report_uri +ReportVersioning,report_versioning +ReportWithRawData,report_with_raw_data +ReportedAgentVersion,reported_agent_version +ReportedName,reported_name +ReportedOs,reported_os +ReportedRuntimeContextState,reported_runtime_context_state +ReportedVersion,reported_version +ReportingMta,reporting_mta +Repository,repository +RepositoryAccessMode,repository_access_mode +RepositoryAggregation,repository_aggregation +RepositoryAggregationResponse,repository_aggregation_response +RepositoryAlreadyExistsException,repository_already_exists_exception +RepositoryAnalysis,repository_analysis +RepositoryAssociation,repository_association +RepositoryAssociationArn,repository_association_arn +RepositoryAssociationSummaries,repository_association_summaries +RepositoryAssociationSummary,repository_association_summary +RepositoryAuthConfig,repository_auth_config +RepositoryBranch,repository_branch +RepositoryBranchInput,repository_branch_input +RepositoryCatalogData,repository_catalog_data +RepositoryCatalogDataInput,repository_catalog_data_input +RepositoryCatalogDataNotFoundException,repository_catalog_data_not_found_exception +RepositoryCredentials,repository_credentials +RepositoryCredentialsProviderArn,repository_credentials_provider_arn +RepositoryDescription,repository_description +RepositoryDoesNotExistException,repository_does_not_exist_exception +RepositoryExternalConnectionInfo,repository_external_connection_info +RepositoryFilter,repository_filter +RepositoryHead,repository_head +RepositoryHeadSourceCodeType,repository_head_source_code_type +RepositoryInput,repository_input +RepositoryLimitExceededException,repository_limit_exceeded_exception +RepositoryMetadata,repository_metadata +RepositoryName,repository_name +RepositoryNameExistsException,repository_name_exists_exception +RepositoryNameIdPair,repository_name_id_pair +RepositoryNameRequiredException,repository_name_required_exception +RepositoryNames,repository_names +RepositoryNamesRequiredException,repository_names_required_exception +RepositoryNotAssociatedWithPullRequestException,repository_not_associated_with_pull_request_exception +RepositoryNotEmptyException,repository_not_empty_exception +RepositoryNotFoundException,repository_not_found_exception +RepositoryOwner,repository_owner +RepositoryPolicyNotFoundException,repository_policy_not_found_exception +RepositoryPolicyText,repository_policy_text +RepositoryScanningConfiguration,repository_scanning_configuration +RepositoryScanningConfigurationFailure,repository_scanning_configuration_failure +RepositorySummary,repository_summary +RepositorySyncAttempt,repository_sync_attempt +RepositorySyncDefinition,repository_sync_definition +RepositorySyncEvent,repository_sync_event +RepositoryTrigger,repository_trigger +RepositoryTriggerBranchNameListRequiredException,repository_trigger_branch_name_list_required_exception +RepositoryTriggerDestinationArnRequiredException,repository_trigger_destination_arn_required_exception +RepositoryTriggerEventsListRequiredException,repository_trigger_events_list_required_exception +RepositoryTriggerExecutionFailure,repository_trigger_execution_failure +RepositoryTriggerNameRequiredException,repository_trigger_name_required_exception +RepositoryTriggersListRequiredException,repository_triggers_list_required_exception +RepositoryType,repository_type +RepositoryUrl,repository_url +ReprocessingSummary,reprocessing_summary +RepublishAction,republish_action +ReputationMetricsEnabled,reputation_metrics_enabled +ReputationOptions,reputation_options +Request,request +RequestAlreadyInProgressException,request_already_in_progress_exception +RequestAlreadyProcessedException,request_already_processed_exception +RequestBody,request_body +RequestBodyAssociatedResourceTypeConfig,request_body_associated_resource_type_config +RequestCancelActivityTaskDecisionAttributes,request_cancel_activity_task_decision_attributes +RequestCancelActivityTaskFailedEventAttributes,request_cancel_activity_task_failed_event_attributes +RequestCancelExternalWorkflowExecutionDecisionAttributes,request_cancel_external_workflow_execution_decision_attributes +RequestCancelExternalWorkflowExecutionFailedEventAttributes,request_cancel_external_workflow_execution_failed_event_attributes +RequestCancelExternalWorkflowExecutionInitiatedEventAttributes,request_cancel_external_workflow_execution_initiated_event_attributes +RequestCancelWorkflowExecutionInput,request_cancel_workflow_execution_input +RequestCertificateRequest,request_certificate_request +RequestCertificateResponse,request_certificate_response +RequestChangedException,request_changed_exception +RequestCharacters,request_characters +RequestCharged,request_charged +RequestCompletionTime,request_completion_time +RequestConfiguration,request_configuration +RequestCount,request_count +RequestDetailedStatus,request_detailed_status +RequestDetails,request_details +RequestEntityTooLargeException,request_entity_too_large_exception +RequestEntry,request_entry +RequestEnvironmentInfoMessage,request_environment_info_message +RequestError,request_error +RequestFailedException,request_failed_exception +RequestFilterPortRange,request_filter_port_range +RequestHeaders,request_headers +RequestHeadersInserted,request_headers_inserted +RequestID,request_id +RequestId,request_id +RequestIdentifier,request_identifier +RequestImpactStatistics,request_impact_statistics +RequestInProgressException,request_in_progress_exception +RequestInspection,request_inspection +RequestInspectionACFP,request_inspection_acfp +RequestInterval,request_interval +RequestIpamResourceTag,request_ipam_resource_tag +RequestItems,request_items +RequestLaunchTemplateData,request_launch_template_data +RequestLimitExceeded,request_limit_exceeded +RequestLimitExceededException,request_limit_exceeded_exception +RequestMetadata,request_metadata +RequestModels,request_models +RequestOrigin,request_origin +RequestOutputItem,request_output_item +RequestParameterKey,request_parameter_key +RequestParameters,request_parameters +RequestPayer,request_payer +RequestPaymentConfiguration,request_payment_configuration +RequestPhoneNumberRequest,request_phone_number_request +RequestPhoneNumberResult,request_phone_number_result +RequestProgress,request_progress +RequestResponses,request_responses +RequestRoute,request_route +RequestServiceQuotaIncreaseRequest,request_service_quota_increase_request +RequestServiceQuotaIncreaseResponse,request_service_quota_increase_response +RequestSource,request_source +RequestSpotFleetRequest,request_spot_fleet_request +RequestSpotFleetResponse,request_spot_fleet_response +RequestSpotInstancesRequest,request_spot_instances_request +RequestSpotInstancesResult,request_spot_instances_result +RequestSpotLaunchSpecification,request_spot_launch_specification +RequestStatus,request_status +RequestStatusMessage,request_status_message +RequestTTLSeconds,request_ttl_seconds +RequestTemplates,request_templates +RequestThrottledException,request_throttled_exception +RequestTime,request_time +RequestTimeoutException,request_timeout_exception +RequestTimeoutSeconds,request_timeout_seconds +RequestToken,request_token +RequestTokenARN,request_token_arn +RequestTokenNotFoundException,request_token_not_found_exception +RequestTooLargeException,request_too_large_exception +RequestType,request_type +RequestUploadCredentialsInput,request_upload_credentials_input +RequestUploadCredentialsOutput,request_upload_credentials_output +RequestUri,request_uri +RequestValidator,request_validator +RequestValidators,request_validators +Requested,requested +RequestedAmiVersion,requested_ami_version +RequestedColumns,requested_columns +RequestedDateTime,requested_date_time +RequestedDimensions,requested_dimensions +RequestedDocumentAttributes,requested_document_attributes +RequestedEc2AvailabilityZones,requested_ec2_availability_zones +RequestedEc2SubnetIds,requested_ec2_subnet_ids +RequestedEntityTooLargeException,requested_entity_too_large_exception +RequestedInstanceCount,requested_instance_count +RequestedJobStatus,requested_job_status +RequestedProvisionedConcurrentExecutions,requested_provisioned_concurrent_executions +RequestedQuota,requested_quota +RequestedQuotas,requested_quotas +RequestedRangeNotSatisfiableException,requested_range_not_satisfiable_exception +RequestedServiceQuotaChange,requested_service_quota_change +RequestedTime,requested_time +RequestedTimestamp,requested_timestamp +RequestedValue,requested_value +Requester,requester +RequesterAccountId,requester_account_id +RequesterAnnotation,requester_annotation +RequesterAwsRegion,requester_aws_region +RequesterCharged,requester_charged +RequesterFeedback,requester_feedback +RequesterId,requester_id +RequesterManaged,requester_managed +RequesterPays,requester_pays +RequesterPaysEnabled,requester_pays_enabled +RequesterPeeringConnectionOptions,requester_peering_connection_options +RequesterTgwInfo,requester_tgw_info +RequesterVpcInfo,requester_vpc_info +Requests,requests +RequestsPerSecond,requests_per_second +RequireAlternateSignatureAlgorithm,require_alternate_signature_algorithm +RequireAuthorizationForCacheControl,require_authorization_for_cache_control +RequireCheckIn,require_check_in +RequireCommonName,require_common_name +RequireDirectoryPath,require_directory_path +RequireDnsAsCn,require_dns_as_cn +RequireEachIncludedType,require_each_included_type +RequireEmail,require_email +RequireEncryption,require_encryption +RequireHibernateSupport,require_hibernate_support +RequireLowercase,require_lowercase +RequireLowercaseCharacters,require_lowercase_characters +RequireNumbers,require_numbers +RequirePin,require_pin +RequireSameKeyRenewal,require_same_key_renewal +RequireSymbols,require_symbols +RequireTLS,require_tls +RequireType,require_type +RequireUppercase,require_uppercase +RequireUppercaseCharacters,require_uppercase_characters +Required,required +RequiredActivatedType,required_activated_type +RequiredActivatedTypes,required_activated_types +RequiredBehavior,required_behavior +RequiredCapabilities,required_capabilities +RequiredEquipmentTypes,required_equipment_types +RequiredField,required_field +RequiredFieldInfo,required_field_info +RequiredFields,required_fields +RequiredMinimumPollIntervalInSeconds,required_minimum_poll_interval_in_seconds +RequiredParameters,required_parameters +RequiredSignUpAttributes,required_sign_up_attributes +RequiredTenancy,required_tenancy +RequiredToPreview,required_to_preview +Requirement,requirement +RequirementsS3ObjectVersion,requirements_s3_object_version +RequirementsS3Path,requirements_s3_path +RequirementsToTarget,requirements_to_target +Requires,requires +RequiresAutoMinorEngineVersionUpgrade,requires_auto_minor_engine_version_upgrade +RequiresCompatibilities,requires_compatibilities +RequiresIndexDocuments,requires_index_documents +RequiresRecreation,requires_recreation +ResamplingConfigInput,resampling_config_input +RescoreCapacityUnits,rescore_capacity_units +RescoreExecutionPlanId,rescore_execution_plan_id +RescoreExecutionPlanSummary,rescore_execution_plan_summary +RescoreId,rescore_id +RescoreRequest,rescore_request +RescoreResult,rescore_result +RescoreResultItem,rescore_result_item +Reseller,reseller +ResendConfirmationCodeRequest,resend_confirmation_code_request +ResendConfirmationCodeResponse,resend_confirmation_code_response +ResendContactReachabilityEmailRequest,resend_contact_reachability_email_request +ResendContactReachabilityEmailResponse,resend_contact_reachability_email_response +ResendOperationAuthorizationRequest,resend_operation_authorization_request +ResendValidationEmailRequest,resend_validation_email_request +Reservation,reservation +ReservationARN,reservation_arn +ReservationAggregates,reservation_aggregates +ReservationArn,reservation_arn +ReservationCoverageGroup,reservation_coverage_group +ReservationCoveredHoursInLookbackPeriod,reservation_covered_hours_in_lookback_period +ReservationFleetInstanceSpecification,reservation_fleet_instance_specification +ReservationId,reservation_id +ReservationName,reservation_name +ReservationPlan,reservation_plan +ReservationPlanSettings,reservation_plan_settings +ReservationPurchaseRecommendation,reservation_purchase_recommendation +ReservationPurchaseRecommendationDetail,reservation_purchase_recommendation_detail +ReservationPurchaseRecommendationMetadata,reservation_purchase_recommendation_metadata +ReservationPurchaseRecommendationSummary,reservation_purchase_recommendation_summary +ReservationResourceSpecification,reservation_resource_specification +ReservationState,reservation_state +ReservationType,reservation_type +ReservationUtilizationGroup,reservation_utilization_group +ReservationValue,reservation_value +Reservations,reservations +ReserveContactRequest,reserve_contact_request +ReserveRange,reserve_range +Reserved,reserved +ReservedBitrate,reserved_bitrate +ReservedCacheNode,reserved_cache_node +ReservedCacheNodeAlreadyExistsFault,reserved_cache_node_already_exists_fault +ReservedCacheNodeId,reserved_cache_node_id +ReservedCacheNodeMessage,reserved_cache_node_message +ReservedCacheNodeNotFoundFault,reserved_cache_node_not_found_fault +ReservedCacheNodeQuotaExceededFault,reserved_cache_node_quota_exceeded_fault +ReservedCacheNodes,reserved_cache_nodes +ReservedCacheNodesOffering,reserved_cache_nodes_offering +ReservedCacheNodesOfferingId,reserved_cache_nodes_offering_id +ReservedCacheNodesOfferingMessage,reserved_cache_nodes_offering_message +ReservedCacheNodesOfferingNotFoundFault,reserved_cache_nodes_offering_not_found_fault +ReservedCacheNodesOfferings,reserved_cache_nodes_offerings +ReservedConcurrentExecutions,reserved_concurrent_executions +ReservedDBInstance,reserved_db_instance +ReservedDBInstanceAlreadyExistsFault,reserved_db_instance_already_exists_fault +ReservedDBInstanceArn,reserved_db_instance_arn +ReservedDBInstanceId,reserved_db_instance_id +ReservedDBInstanceMessage,reserved_db_instance_message +ReservedDBInstanceNotFoundFault,reserved_db_instance_not_found_fault +ReservedDBInstanceQuotaExceededFault,reserved_db_instance_quota_exceeded_fault +ReservedDBInstances,reserved_db_instances +ReservedDBInstancesOffering,reserved_db_instances_offering +ReservedDBInstancesOfferingId,reserved_db_instances_offering_id +ReservedDBInstancesOfferingMessage,reserved_db_instances_offering_message +ReservedDBInstancesOfferingNotFoundFault,reserved_db_instances_offering_not_found_fault +ReservedDBInstancesOfferings,reserved_db_instances_offerings +ReservedElasticsearchInstance,reserved_elasticsearch_instance +ReservedElasticsearchInstanceId,reserved_elasticsearch_instance_id +ReservedElasticsearchInstanceOffering,reserved_elasticsearch_instance_offering +ReservedElasticsearchInstanceOfferingId,reserved_elasticsearch_instance_offering_id +ReservedElasticsearchInstanceOfferings,reserved_elasticsearch_instance_offerings +ReservedElasticsearchInstances,reserved_elasticsearch_instances +ReservedHours,reserved_hours +ReservedInstance,reserved_instance +ReservedInstanceId,reserved_instance_id +ReservedInstanceIds,reserved_instance_ids +ReservedInstanceLimitPrice,reserved_instance_limit_price +ReservedInstanceOffering,reserved_instance_offering +ReservedInstanceOfferingId,reserved_instance_offering_id +ReservedInstanceOfferings,reserved_instance_offerings +ReservedInstanceOptions,reserved_instance_options +ReservedInstanceReservationValue,reserved_instance_reservation_value +ReservedInstanceValueRollup,reserved_instance_value_rollup +ReservedInstanceValueSet,reserved_instance_value_set +ReservedInstances,reserved_instances +ReservedInstancesConfiguration,reserved_instances_configuration +ReservedInstancesId,reserved_instances_id +ReservedInstancesIds,reserved_instances_ids +ReservedInstancesListing,reserved_instances_listing +ReservedInstancesListingId,reserved_instances_listing_id +ReservedInstancesListings,reserved_instances_listings +ReservedInstancesModification,reserved_instances_modification +ReservedInstancesModificationId,reserved_instances_modification_id +ReservedInstancesModificationIds,reserved_instances_modification_ids +ReservedInstancesModificationResult,reserved_instances_modification_result +ReservedInstancesModifications,reserved_instances_modifications +ReservedInstancesOffering,reserved_instances_offering +ReservedInstancesOfferingId,reserved_instances_offering_id +ReservedInstancesOfferingIds,reserved_instances_offering_ids +ReservedInstancesOfferings,reserved_instances_offerings +ReservedNameException,reserved_name_exception +ReservedNode,reserved_node +ReservedNodeAlreadyExistsFault,reserved_node_already_exists_fault +ReservedNodeAlreadyMigratedFault,reserved_node_already_migrated_fault +ReservedNodeConfigurationOption,reserved_node_configuration_option +ReservedNodeConfigurationOptionList,reserved_node_configuration_option_list +ReservedNodeExchangeNotFoundFault,reserved_node_exchange_not_found_fault +ReservedNodeExchangeRequestId,reserved_node_exchange_request_id +ReservedNodeExchangeStatus,reserved_node_exchange_status +ReservedNodeExchangeStatusDetails,reserved_node_exchange_status_details +ReservedNodeId,reserved_node_id +ReservedNodeNotFoundFault,reserved_node_not_found_fault +ReservedNodeOffering,reserved_node_offering +ReservedNodeOfferingId,reserved_node_offering_id +ReservedNodeOfferingNotFoundFault,reserved_node_offering_not_found_fault +ReservedNodeOfferingType,reserved_node_offering_type +ReservedNodeOfferings,reserved_node_offerings +ReservedNodeOfferingsMessage,reserved_node_offerings_message +ReservedNodeQuotaExceededFault,reserved_node_quota_exceeded_fault +ReservedNodes,reserved_nodes +ReservedNodesMessage,reserved_nodes_message +ReservedNodesOffering,reserved_nodes_offering +ReservedNodesOfferingId,reserved_nodes_offering_id +ReservedNodesOfferingNotFoundFault,reserved_nodes_offering_not_found_fault +ReservedNodesOfferings,reserved_nodes_offerings +ReservedNormalizedUnits,reserved_normalized_units +ReservedSlots,reserved_slots +ReservedStreamCapacity,reserved_stream_capacity +ReservoirQuota,reservoir_quota +ReservoirQuotaTTL,reservoir_quota_ttl +ReservoirSize,reservoir_size +ResetActionConfiguration,reset_action_configuration +ResetAddressAttributeRequest,reset_address_attribute_request +ResetAddressAttributeResult,reset_address_attribute_result +ResetAlarmActionRequest,reset_alarm_action_request +ResetAllParameters,reset_all_parameters +ResetAuthorizersCacheRequest,reset_authorizers_cache_request +ResetCacheInput,reset_cache_input +ResetCacheOutput,reset_cache_output +ResetCacheParameterGroupMessage,reset_cache_parameter_group_message +ResetClusterParameterGroupMessage,reset_cluster_parameter_group_message +ResetConnectorMetadataCacheRequest,reset_connector_metadata_cache_request +ResetDBClusterParameterGroupMessage,reset_db_cluster_parameter_group_message +ResetDBParameterGroupMessage,reset_db_parameter_group_message +ResetDeploymentsRequest,reset_deployments_request +ResetDeploymentsResponse,reset_deployments_response +ResetDisabled,reset_disabled +ResetDistributionCacheRequest,reset_distribution_cache_request +ResetDistributionCacheResult,reset_distribution_cache_result +ResetEbsDefaultKmsKeyIdRequest,reset_ebs_default_kms_key_id_request +ResetEbsDefaultKmsKeyIdResult,reset_ebs_default_kms_key_id_result +ResetElements,reset_elements +ResetEncryptionKeyRequest,reset_encryption_key_request +ResetFpgaImageAttributeRequest,reset_fpga_image_attribute_request +ResetFpgaImageAttributeResult,reset_fpga_image_attribute_result +ResetImageAttributeRequest,reset_image_attribute_request +ResetInstanceAttributeRequest,reset_instance_attribute_request +ResetJobBookmarkRequest,reset_job_bookmark_request +ResetJobBookmarkResponse,reset_job_bookmark_response +ResetNetworkInterfaceAttributeRequest,reset_network_interface_attribute_request +ResetNotificationSettingsRequest,reset_notification_settings_request +ResetNotificationSettingsResponse,reset_notification_settings_response +ResetOrderNumber,reset_order_number +ResetParameterGroupRequest,reset_parameter_group_request +ResetParameterGroupResponse,reset_parameter_group_response +ResetPasswordRequest,reset_password_request +ResetPersonalPINRequest,reset_personal_pin_request +ResetPersonalPINResponse,reset_personal_pin_response +ResetPolicy,reset_policy +ResetResourceLogLevelRequest,reset_resource_log_level_request +ResetServiceSettingRequest,reset_service_setting_request +ResetServiceSettingResult,reset_service_setting_result +ResetServiceSpecificCredentialRequest,reset_service_specific_credential_request +ResetServiceSpecificCredentialResponse,reset_service_specific_credential_response +ResetSnapshotAttributeRequest,reset_snapshot_attribute_request +ResetTimerAction,reset_timer_action +ResetUserPasswordRequest,reset_user_password_request +ResetUserPasswordResponse,reset_user_password_response +Resharding,resharding +ReshardingConfiguration,resharding_configuration +ReshardingStatus,resharding_status +Resilience,resilience +ResiliencyPolicy,resiliency_policy +ResiliencyScore,resiliency_score +ResizeCluster,resize_cluster +ResizeClusterMessage,resize_cluster_message +ResizeClusterResult,resize_cluster_result +ResizeInfo,resize_info +ResizeNotFoundFault,resize_not_found_fault +ResizeOption,resize_option +ResizeProgressMessage,resize_progress_message +ResizeSpecifications,resize_specifications +ResizeType,resize_type +Resolution,resolution +ResolutionContact,resolution_contact +ResolutionMethod,resolution_method +ResolutionStrategy,resolution_strategy +ResolutionTechniques,resolution_techniques +ResolutionTime,resolution_time +ResolveAlias,resolve_alias +ResolveAliasInput,resolve_alias_input +ResolveAliasOutput,resolve_alias_output +ResolveAppVersionResourcesRequest,resolve_app_version_resources_request +ResolveAppVersionResourcesResponse,resolve_app_version_resources_response +ResolveCaseRequest,resolve_case_request +ResolveCaseResponse,resolve_case_response +ResolveComponentCandidatesRequest,resolve_component_candidates_request +ResolveComponentCandidatesResponse,resolve_component_candidates_response +ResolveCustomerRequest,resolve_customer_request +ResolveCustomerResult,resolve_customer_result +ResolveRoomRequest,resolve_room_request +ResolveRoomResponse,resolve_room_response +Resolved,resolved +ResolvedArtifact,resolved_artifact +ResolvedAttributes,resolved_attributes +ResolvedCIDRCount,resolved_cidr_count +ResolvedComponentVersion,resolved_component_version +ResolvedImage,resolved_image +ResolvedImageUri,resolved_image_uri +ResolvedOutputS3Uri,resolved_output_s3_uri +ResolvedTargets,resolved_targets +ResolvedValue,resolved_value +Resolver,resolver +ResolverConfig,resolver_config +ResolverConfigs,resolver_configs +ResolverDNSSECConfig,resolver_dnssec_config +ResolverDnssecConfig,resolver_dnssec_config +ResolverDnssecConfigs,resolver_dnssec_configs +ResolverEndpoint,resolver_endpoint +ResolverEndpointId,resolver_endpoint_id +ResolverEndpointType,resolver_endpoint_type +ResolverEndpoints,resolver_endpoints +ResolverIP,resolver_ip +ResolverQueryLogConfig,resolver_query_log_config +ResolverQueryLogConfigAssociation,resolver_query_log_config_association +ResolverQueryLogConfigAssociationId,resolver_query_log_config_association_id +ResolverQueryLogConfigAssociations,resolver_query_log_config_associations +ResolverQueryLogConfigId,resolver_query_log_config_id +ResolverQueryLogConfigPolicy,resolver_query_log_config_policy +ResolverQueryLogConfigs,resolver_query_log_configs +ResolverRule,resolver_rule +ResolverRuleAssociation,resolver_rule_association +ResolverRuleAssociationId,resolver_rule_association_id +ResolverRuleAssociations,resolver_rule_associations +ResolverRuleConfig,resolver_rule_config +ResolverRuleId,resolver_rule_id +ResolverRulePolicy,resolver_rule_policy +ResolverRules,resolver_rules +Resource,resource +ResourceARN,resource_arn +ResourceARNDetail,resource_arn_detail +ResourceARNList,resource_arn_list +ResourceARNNotValidException,resource_arn_not_valid_exception +ResourceARNUpdate,resource_arn_update +ResourceARNs,resource_arns +ResourceAccessPolicies,resource_access_policies +ResourceAccessPolicy,resource_access_policy +ResourceAccessRoleArn,resource_access_role_arn +ResourceAction,resource_action +ResourceAlreadyCheckedOutException,resource_already_checked_out_exception +ResourceAlreadyExistException,resource_already_exist_exception +ResourceAlreadyExistsException,resource_already_exists_exception +ResourceAlreadyExistsFault,resource_already_exists_fault +ResourceArn,resource_arn +ResourceArnList,resource_arn_list +ResourceArnNotFoundException,resource_arn_not_found_exception +ResourceArnRequiredException,resource_arn_required_exception +ResourceArns,resource_arns +ResourceAssociatedException,resource_associated_exception +ResourceAttribute,resource_attribute +ResourceAttributeList,resource_attribute_list +ResourceAwsEc2InstanceIamInstanceProfileArn,resource_aws_ec2_instance_iam_instance_profile_arn +ResourceAwsEc2InstanceImageId,resource_aws_ec2_instance_image_id +ResourceAwsEc2InstanceIpV4Addresses,resource_aws_ec2_instance_ipv4_addresses +ResourceAwsEc2InstanceIpV6Addresses,resource_aws_ec2_instance_ipv6_addresses +ResourceAwsEc2InstanceKeyName,resource_aws_ec2_instance_key_name +ResourceAwsEc2InstanceLaunchedAt,resource_aws_ec2_instance_launched_at +ResourceAwsEc2InstanceSubnetId,resource_aws_ec2_instance_subnet_id +ResourceAwsEc2InstanceType,resource_aws_ec2_instance_type +ResourceAwsEc2InstanceVpcId,resource_aws_ec2_instance_vpc_id +ResourceAwsIamAccessKeyCreatedAt,resource_aws_iam_access_key_created_at +ResourceAwsIamAccessKeyPrincipalName,resource_aws_iam_access_key_principal_name +ResourceAwsIamAccessKeyStatus,resource_aws_iam_access_key_status +ResourceAwsIamAccessKeyUserName,resource_aws_iam_access_key_user_name +ResourceAwsIamUserUserName,resource_aws_iam_user_user_name +ResourceAwsS3BucketOwnerId,resource_aws_s3_bucket_owner_id +ResourceAwsS3BucketOwnerName,resource_aws_s3_bucket_owner_name +ResourceBudgetEstimate,resource_budget_estimate +ResourceCatalog,resource_catalog +ResourceCatalogArn,resource_catalog_arn +ResourceCatalogName,resource_catalog_name +ResourceCatalogs,resource_catalogs +ResourceChange,resource_change +ResourceChangeDetail,resource_change_detail +ResourceChanges,resource_changes +ResourceCidr,resource_cidr +ResourceCollection,resource_collection +ResourceCollectionFilter,resource_collection_filter +ResourceCollectionType,resource_collection_type +ResourceComplianceStatus,resource_compliance_status +ResourceComplianceSummaryItem,resource_compliance_summary_item +ResourceComplianceSummaryItems,resource_compliance_summary_items +ResourceConcurrentModificationException,resource_concurrent_modification_exception +ResourceConfig,resource_config +ResourceConfigForUpdate,resource_config_for_update +ResourceConfiguration,resource_configuration +ResourceConfigurationSchemaType,resource_configuration_schema_type +ResourceConflict,resource_conflict +ResourceConflictException,resource_conflict_exception +ResourceContainerImageId,resource_container_image_id +ResourceContainerImageName,resource_container_image_name +ResourceContainerLaunchedAt,resource_container_launched_at +ResourceContainerName,resource_container_name +ResourceContentionFault,resource_contention_fault +ResourceCount,resource_count +ResourceCountByStatus,resource_count_by_status +ResourceCountFilters,resource_count_filters +ResourceCountsSummary,resource_counts_summary +ResourceCreationFailedException,resource_creation_failed_exception +ResourceCreationLimitPolicy,resource_creation_limit_policy +ResourceDataContainer,resource_data_container +ResourceDataSyncAlreadyExistsException,resource_data_sync_already_exists_exception +ResourceDataSyncAwsOrganizationsSource,resource_data_sync_aws_organizations_source +ResourceDataSyncConflictException,resource_data_sync_conflict_exception +ResourceDataSyncCountExceededException,resource_data_sync_count_exceeded_exception +ResourceDataSyncDestinationDataSharing,resource_data_sync_destination_data_sharing +ResourceDataSyncInvalidConfigurationException,resource_data_sync_invalid_configuration_exception +ResourceDataSyncItem,resource_data_sync_item +ResourceDataSyncItems,resource_data_sync_items +ResourceDataSyncNotFoundException,resource_data_sync_not_found_exception +ResourceDataSyncOrganizationalUnit,resource_data_sync_organizational_unit +ResourceDataSyncS3Destination,resource_data_sync_s3_destination +ResourceDataSyncSource,resource_data_sync_source +ResourceDataSyncSourceWithState,resource_data_sync_source_with_state +ResourceDefinitionId,resource_definition_id +ResourceDefinitionVersion,resource_definition_version +ResourceDefinitionVersionArn,resource_definition_version_arn +ResourceDefinitionVersionId,resource_definition_version_id +ResourceDependencyException,resource_dependency_exception +ResourceDescription,resource_description +ResourceDescriptions,resource_descriptions +ResourceDetail,resource_detail +ResourceDetails,resource_details +ResourceDetailsOther,resource_details_other +ResourceDiscoveryAssociationCount,resource_discovery_association_count +ResourceDiscoveryStatus,resource_discovery_status +ResourceDoesNotSupportTagging,resource_does_not_support_tagging +ResourceDownloadOwnerSetting,resource_download_owner_setting +ResourceEndpoint,resource_endpoint +ResourceEndpointList,resource_endpoint_list +ResourceEndpointListItem,resource_endpoint_list_item +ResourceError,resource_error +ResourceErrorsDetails,resource_errors_details +ResourceEvaluation,resource_evaluation +ResourceEvaluationFilters,resource_evaluation_filters +ResourceEvaluationId,resource_evaluation_id +ResourceEvaluations,resource_evaluations +ResourceExistsException,resource_exists_exception +ResourceFilter,resource_filter +ResourceFilterCriteria,resource_filter_criteria +ResourceFilters,resource_filters +ResourceGroup,resource_group +ResourceGroupName,resource_group_name +ResourceGroupTag,resource_group_tag +ResourceHandlingOption,resource_handling_option +ResourceHours,resource_hours +ResourceId,resource_id +ResourceIdList,resource_id_list +ResourceIdOverrideConfiguration,resource_id_override_configuration +ResourceIdPreference,resource_id_preference +ResourceIdScope,resource_id_scope +ResourceIdType,resource_id_type +ResourceIdentifier,resource_identifier +ResourceIdentifierSummaries,resource_identifier_summaries +ResourceIdentifierSummary,resource_identifier_summary +ResourceIdentifiers,resource_identifiers +ResourceIds,resource_ids +ResourceInUse,resource_in_use +ResourceInUseException,resource_in_use_exception +ResourceInUseFault,resource_in_use_fault +ResourceInfo,resource_info +ResourceInfoList,resource_info_list +ResourceIntegrations,resource_integrations +ResourceInventory,resource_inventory +ResourceInventoryList,resource_inventory_list +ResourceKey,resource_key +ResourceKeys,resource_keys +ResourceLabel,resource_label +ResourceLifecycleConfig,resource_lifecycle_config +ResourceLimit,resource_limit +ResourceLimitExceeded,resource_limit_exceeded +ResourceLimitExceededException,resource_limit_exceeded_exception +ResourceLimits,resource_limits +ResourceList,resource_list +ResourceLocation,resource_location +ResourceLocations,resource_locations +ResourceLockedException,resource_locked_exception +ResourceMapFilter,resource_map_filter +ResourceMapping,resource_mapping +ResourceMetadata,resource_metadata +ResourceMetrics,resource_metrics +ResourceModel,resource_model +ResourceName,resource_name +ResourceNotAvailableException,resource_not_available_exception +ResourceNotDiscoveredException,resource_not_discovered_exception +ResourceNotFound,resource_not_found +ResourceNotFoundException,resource_not_found_exception +ResourceNotFoundFault,resource_not_found_fault +ResourceNotReadyException,resource_not_ready_exception +ResourceNotSupportedException,resource_not_supported_exception +ResourceNumberLimitExceededException,resource_number_limit_exceeded_exception +ResourceOverlapStatus,resource_overlap_status +ResourceOwner,resource_owner +ResourceOwnerCheckException,resource_owner_check_exception +ResourceOwnerId,resource_owner_id +ResourceOwningAccountId,resource_owning_account_id +ResourcePartition,resource_partition +ResourcePath,resource_path +ResourcePathComponent,resource_path_component +ResourcePendingMaintenanceActions,resource_pending_maintenance_actions +ResourcePermission,resource_permission +ResourcePolicies,resource_policies +ResourcePolicy,resource_policy +ResourcePolicyConflictException,resource_policy_conflict_exception +ResourcePolicyInvalidParameterException,resource_policy_invalid_parameter_exception +ResourcePolicyLimitExceededException,resource_policy_limit_exceeded_exception +ResourcePolicyNotFoundException,resource_policy_not_found_exception +ResourcePolicyNotValidException,resource_policy_not_valid_exception +ResourcePolicySummary,resource_policy_summary +ResourcePreconditionNotMetException,resource_precondition_not_met_exception +ResourceProfileArtifact,resource_profile_artifact +ResourcePropagationDelayException,resource_propagation_delay_exception +ResourceProperties,resource_properties +ResourceProperty,resource_property +ResourceProvisionedThroughputExceededException,resource_provisioned_throughput_exceeded_exception +ResourceQuery,resource_query +ResourceQuota,resource_quota +ResourceQuotaExceededException,resource_quota_exceeded_exception +ResourceQuotaExceededFault,resource_quota_exceeded_fault +ResourceQuotas,resource_quotas +ResourceReceivingAccess,resource_receiving_access +ResourceRecord,resource_record +ResourceRecordSet,resource_record_set +ResourceRecordSetCount,resource_record_set_count +ResourceRecordSets,resource_record_sets +ResourceRecords,resource_records +ResourceReference,resource_reference +ResourceRegion,resource_region +ResourceRegistrationFailureException,resource_registration_failure_exception +ResourceRequestStatusFilter,resource_request_status_filter +ResourceRequestStatusSummaries,resource_request_status_summaries +ResourceRequirement,resource_requirement +ResourceRequirements,resource_requirements +ResourceResult,resource_result +ResourceRetainedBillableTimeInSeconds,resource_retained_billable_time_in_seconds +ResourceRole,resource_role +ResourceScanMetadata,resource_scan_metadata +ResourceServer,resource_server +ResourceServerScopeType,resource_server_scope_type +ResourceServerType,resource_server_type +ResourceServers,resource_servers +ResourceSet,resource_set +ResourceSetArn,resource_set_arn +ResourceSetIdentifier,resource_set_identifier +ResourceSetIds,resource_set_ids +ResourceSetName,resource_set_name +ResourceSetOutput,resource_set_output +ResourceSetStatus,resource_set_status +ResourceSetSummary,resource_set_summary +ResourceSetType,resource_set_type +ResourceSets,resource_sets +ResourceShare,resource_share +ResourceShareAssociation,resource_share_association +ResourceShareInvitation,resource_share_invitation +ResourceShareInvitationAlreadyAcceptedException,resource_share_invitation_already_accepted_exception +ResourceShareInvitationAlreadyRejectedException,resource_share_invitation_already_rejected_exception +ResourceShareInvitationArnNotFoundException,resource_share_invitation_arn_not_found_exception +ResourceShareInvitationExpiredException,resource_share_invitation_expired_exception +ResourceShareLimitExceededException,resource_share_limit_exceeded_exception +ResourceSharePermissionDetail,resource_share_permission_detail +ResourceSharePermissionSummary,resource_share_permission_summary +ResourceShareType,resource_share_type +ResourceSpec,resource_spec +ResourceSpecificResult,resource_specific_result +ResourceSpecificResults,resource_specific_results +ResourceSpecification,resource_specification +ResourceState,resource_state +ResourceStatement,resource_statement +ResourceStatementRequest,resource_statement_request +ResourceStatistics,resource_statistics +ResourceStatus,resource_status +ResourceStatusReason,resource_status_reason +ResourceStringFilter,resource_string_filter +ResourceSummary,resource_summary +ResourceSyncAttempt,resource_sync_attempt +ResourceSyncEvent,resource_sync_event +ResourceTag,resource_tag +ResourceTagKey,resource_tag_key +ResourceTagKeys,resource_tag_keys +ResourceTagList,resource_tag_list +ResourceTagMapping,resource_tag_mapping +ResourceTagMappingList,resource_tag_mapping_list +ResourceTagSet,resource_tag_set +ResourceTagSets,resource_tag_sets +ResourceTagValue,resource_tag_value +ResourceTags,resource_tags +ResourceTagsDescriptionMessage,resource_tags_description_message +ResourceTagsSearchCriteria,resource_tags_search_criteria +ResourceTargetDefinition,resource_target_definition +ResourceTargetDetails,resource_target_details +ResourceToImport,resource_to_import +ResourceType,resource_type +ResourceTypeFilters,resource_type_filters +ResourceTypeList,resource_type_list +ResourceTypeManagementPreference,resource_type_management_preference +ResourceTypeNotFound,resource_type_not_found +ResourceTypeNotSupportedException,resource_type_not_supported_exception +ResourceTypeOptInPreference,resource_type_opt_in_preference +ResourceTypes,resource_types +ResourceTypesScope,resource_types_scope +ResourceUnavailableException,resource_unavailable_exception +ResourceUri,resource_uri +ResourceUris,resource_uris +ResourceUtilization,resource_utilization +ResourceValidationException,resource_validation_exception +ResourceValue,resource_value +ResourceViolation,resource_violation +ResourceViolations,resource_violations +Resources,resources +ResourcesAffected,resources_affected +ResourcesPerPage,resources_per_page +ResourcesSupported,resources_supported +ResourcesToAdd,resources_to_add +ResourcesToImport,resources_to_import +ResourcesToRemove,resources_to_remove +ResourcesToSkip,resources_to_skip +ResourcesVpcConfig,resources_vpc_config +RespondActivityTaskCanceledInput,respond_activity_task_canceled_input +RespondActivityTaskCompletedInput,respond_activity_task_completed_input +RespondActivityTaskFailedInput,respond_activity_task_failed_input +RespondDecisionTaskCompletedInput,respond_decision_task_completed_input +RespondToAfd,respond_to_afd +RespondToAuthChallengeRequest,respond_to_auth_challenge_request +RespondToAuthChallengeResponse,respond_to_auth_challenge_response +RespondsTo,responds_to +Response,response +ResponseAction,response_action +ResponseCacheControl,response_cache_control +ResponseCard,response_card +ResponseCode,response_code +ResponseCodeSent,response_code_sent +ResponseContentDisposition,response_content_disposition +ResponseContentEncoding,response_content_encoding +ResponseContentLanguage,response_content_language +ResponseContentType,response_content_type +ResponseDetails,response_details +ResponseError,response_error +ResponseExpires,response_expires +ResponseFinishDateTime,response_finish_date_time +ResponseHeaders,response_headers +ResponseHeadersPolicy,response_headers_policy +ResponseHeadersPolicyAccessControlAllowHeaders,response_headers_policy_access_control_allow_headers +ResponseHeadersPolicyAccessControlAllowMethods,response_headers_policy_access_control_allow_methods +ResponseHeadersPolicyAccessControlAllowOrigins,response_headers_policy_access_control_allow_origins +ResponseHeadersPolicyAccessControlExposeHeaders,response_headers_policy_access_control_expose_headers +ResponseHeadersPolicyAlreadyExists,response_headers_policy_already_exists +ResponseHeadersPolicyConfig,response_headers_policy_config +ResponseHeadersPolicyContentSecurityPolicy,response_headers_policy_content_security_policy +ResponseHeadersPolicyContentTypeOptions,response_headers_policy_content_type_options +ResponseHeadersPolicyCorsConfig,response_headers_policy_cors_config +ResponseHeadersPolicyCustomHeader,response_headers_policy_custom_header +ResponseHeadersPolicyCustomHeadersConfig,response_headers_policy_custom_headers_config +ResponseHeadersPolicyFrameOptions,response_headers_policy_frame_options +ResponseHeadersPolicyId,response_headers_policy_id +ResponseHeadersPolicyInUse,response_headers_policy_in_use +ResponseHeadersPolicyList,response_headers_policy_list +ResponseHeadersPolicyReferrerPolicy,response_headers_policy_referrer_policy +ResponseHeadersPolicyRemoveHeader,response_headers_policy_remove_header +ResponseHeadersPolicyRemoveHeadersConfig,response_headers_policy_remove_headers_config +ResponseHeadersPolicySecurityHeadersConfig,response_headers_policy_security_headers_config +ResponseHeadersPolicyServerTimingHeadersConfig,response_headers_policy_server_timing_headers_config +ResponseHeadersPolicyStrictTransportSecurity,response_headers_policy_strict_transport_security +ResponseHeadersPolicySummary,response_headers_policy_summary +ResponseHeadersPolicyXSSProtection,response_headers_policy_xss_protection +ResponseInspection,response_inspection +ResponseInspectionBodyContains,response_inspection_body_contains +ResponseInspectionHeader,response_inspection_header +ResponseInspectionJson,response_inspection_json +ResponseInspectionStatusCode,response_inspection_status_code +ResponseItem,response_item +ResponseLaunchTemplateData,response_launch_template_data +ResponseMessage,response_message +ResponseModels,response_models +ResponseOutputItem,response_output_item +ResponsePagePath,response_page_path +ResponseParameters,response_parameters +ResponsePartitionKey,response_partition_key +ResponsePlanSummary,response_plan_summary +ResponseResourceMetric,response_resource_metric +ResponseResourceMetricKey,response_resource_metric_key +ResponseSignalPreroll,response_signal_preroll +ResponseSpecification,response_specification +ResponseStartDateTime,response_start_date_time +ResponseStreamContentType,response_stream_content_type +ResponseTemplates,response_templates +ResponseTime,response_time +ResponseTimeHistogram,response_time_histogram +ResponseTimeRootCause,response_time_root_cause +ResponseTimeRootCauseEntity,response_time_root_cause_entity +ResponseTimeRootCauseService,response_time_root_cause_service +ResponseTimeRootCauses,response_time_root_causes +Responses,responses +RestApi,rest_api +RestApis,rest_apis +RestartAppServerMessage,restart_app_server_message +RestartDelay,restart_delay +RestartSimulationJobRequest,restart_simulation_job_request +RestartWorkspace,restart_workspace +RestorableByUserIds,restorable_by_user_ids +RestorableNodeTypes,restorable_node_types +RestorableUntil,restorable_until +RestorationPrice,restoration_price +Restore,restore +RestoreAddressToClassicRequest,restore_address_to_classic_request +RestoreAddressToClassicResult,restore_address_to_classic_result +RestoreAnalysisRequest,restore_analysis_request +RestoreAnalysisResponse,restore_analysis_response +RestoreBackupRequest,restore_backup_request +RestoreBackupResponse,restore_backup_response +RestoreCertificateAuthorityRequest,restore_certificate_authority_request +RestoreClusterFromSnapshotInput,restore_cluster_from_snapshot_input +RestoreClusterFromSnapshotOutput,restore_cluster_from_snapshot_output +RestoreCoreNetworkPolicyVersionRequest,restore_core_network_policy_version_request +RestoreCoreNetworkPolicyVersionResponse,restore_core_network_policy_version_response +RestoreDBClusterFromS3Message,restore_db_cluster_from_s3_message +RestoreDBClusterFromS3Result,restore_db_cluster_from_s3_result +RestoreDBClusterFromSnapshotMessage,restore_db_cluster_from_snapshot_message +RestoreDBClusterFromSnapshotResult,restore_db_cluster_from_snapshot_result +RestoreDBClusterToPointInTimeMessage,restore_db_cluster_to_point_in_time_message +RestoreDBClusterToPointInTimeResult,restore_db_cluster_to_point_in_time_result +RestoreDBInstanceFromDBSnapshotMessage,restore_db_instance_from_db_snapshot_message +RestoreDBInstanceFromDBSnapshotResult,restore_db_instance_from_db_snapshot_result +RestoreDBInstanceFromS3Message,restore_db_instance_from_s3_message +RestoreDBInstanceFromS3Result,restore_db_instance_from_s3_result +RestoreDBInstanceToPointInTimeMessage,restore_db_instance_to_point_in_time_message +RestoreDBInstanceToPointInTimeResult,restore_db_instance_to_point_in_time_result +RestoreDateTime,restore_date_time +RestoreDocumentVersionsRequest,restore_document_versions_request +RestoreDomainAccessRequest,restore_domain_access_request +RestoreDuration,restore_duration +RestoreEventDataStoreRequest,restore_event_data_store_request +RestoreEventDataStoreResponse,restore_event_data_store_response +RestoreExpiryDate,restore_expiry_date +RestoreExpiryTime,restore_expiry_time +RestoreFromClusterSnapshotMessage,restore_from_cluster_snapshot_message +RestoreFromClusterSnapshotResult,restore_from_cluster_snapshot_result +RestoreFromRecoveryPointRequest,restore_from_recovery_point_request +RestoreFromRecoveryPointResponse,restore_from_recovery_point_response +RestoreFromSnapshotRequest,restore_from_snapshot_request +RestoreFromSnapshotResponse,restore_from_snapshot_response +RestoreImageFromRecycleBinRequest,restore_image_from_recycle_bin_request +RestoreImageFromRecycleBinResult,restore_image_from_recycle_bin_result +RestoreInProgress,restore_in_progress +RestoreJobId,restore_job_id +RestoreJobs,restore_jobs +RestoreJobsListMember,restore_jobs_list_member +RestoreKeyInput,restore_key_input +RestoreKeyOutput,restore_key_output +RestoreManagedPrefixListVersionRequest,restore_managed_prefix_list_version_request +RestoreManagedPrefixListVersionResult,restore_managed_prefix_list_version_result +RestoreMetadata,restore_metadata +RestoreObjectOutput,restore_object_output +RestoreObjectRequest,restore_object_request +RestoreOutputPath,restore_output_path +RestorePhoneNumberRequest,restore_phone_number_request +RestorePhoneNumberResponse,restore_phone_number_response +RestoreRequest,restore_request +RestoreSecretRequest,restore_secret_request +RestoreSecretResponse,restore_secret_response +RestoreServerRequest,restore_server_request +RestoreServerResponse,restore_server_response +RestoreSnapshotFromRecycleBinRequest,restore_snapshot_from_recycle_bin_request +RestoreSnapshotFromRecycleBinResult,restore_snapshot_from_recycle_bin_result +RestoreSnapshotTierRequest,restore_snapshot_tier_request +RestoreSnapshotTierResult,restore_snapshot_tier_result +RestoreSnapshots,restore_snapshots +RestoreStartTime,restore_start_time +RestoreStatus,restore_status +RestoreSummary,restore_summary +RestoreTableFromBackupInput,restore_table_from_backup_input +RestoreTableFromBackupOutput,restore_table_from_backup_output +RestoreTableFromClusterSnapshotMessage,restore_table_from_cluster_snapshot_message +RestoreTableFromClusterSnapshotResult,restore_table_from_cluster_snapshot_result +RestoreTableFromSnapshotRequest,restore_table_from_snapshot_request +RestoreTableFromSnapshotResponse,restore_table_from_snapshot_response +RestoreTableRequest,restore_table_request +RestoreTableResponse,restore_table_response +RestoreTableToPointInTimeInput,restore_table_to_point_in_time_input +RestoreTableToPointInTimeOutput,restore_table_to_point_in_time_output +RestoreTime,restore_time +RestoreToSnapshot,restore_to_snapshot +RestoreToTime,restore_to_time +RestoreType,restore_type +RestoreVolumeFromSnapshotRequest,restore_volume_from_snapshot_request +RestoreVolumeFromSnapshotResponse,restore_volume_from_snapshot_response +RestoreWindow,restore_window +RestoreWorkspaceRequest,restore_workspace_request +RestrictPublicBuckets,restrict_public_buckets +RestrictedPackageName,restricted_package_name +RestrictedSourceFileException,restricted_source_file_exception +RestrictionType,restriction_type +Restrictions,restrictions +Result,result +ResultAttribute,result_attribute +ResultAttributes,result_attributes +ResultBBox,result_b_box +ResultByTime,result_by_time +ResultCode,result_code +ResultConfiguration,result_configuration +ResultConfigurationUpdates,result_configuration_updates +ResultData,result_data +ResultEncryptionMode,result_encryption_mode +ResultErrorEntry,result_error_entry +ResultField,result_field +ResultFrame,result_frame +ResultId,result_id +ResultIds,result_ids +ResultItems,result_items +ResultKmsKeyArn,result_kms_key_arn +ResultList,result_list +ResultLocationBucket,result_location_bucket +ResultLocationFolder,result_location_folder +ResultRecordedTime,result_recorded_time +ResultReuseByAgeConfiguration,result_reuse_by_age_configuration +ResultReuseConfiguration,result_reuse_configuration +ResultReuseInformation,result_reuse_information +ResultRow,result_row +ResultRowValue,result_row_value +ResultRows,result_rows +ResultS3Uri,result_s3_uri +ResultSet,result_set +ResultSetMetadata,result_set_metadata +ResultSetOptions,result_set_options +ResultSize,result_size +ResultStream,result_stream +ResultToken,result_token +ResultType,result_type +ResultValues,result_values +Results,results +ResultsByTime,results_by_time +ResultsCount,results_count +ResultsNotFound,results_not_found +ResultsPublishingEnabled,results_publishing_enabled +ResultsS3Prefix,results_s3_prefix +ResumableUntil,resumable_until +ResumeActions,resume_actions +ResumeBatchLoadTaskRequest,resume_batch_load_task_request +ResumeCampaignRequest,resume_campaign_request +ResumeCluster,resume_cluster +ResumeClusterMessage,resume_cluster_message +ResumeClusterResult,resume_cluster_result +ResumeContactRecordingRequest,resume_contact_recording_request +ResumeFullAutomationModeMinutes,resume_full_automation_mode_minutes +ResumeFullAutomationModeTime,resume_full_automation_mode_time +ResumeGameServerGroupInput,resume_game_server_group_input +ResumeGameServerGroupOutput,resume_game_server_group_output +ResumeReplicationRequest,resume_replication_request +ResumeResourceRequest,resume_resource_request +ResumeServiceRequest,resume_service_request +ResumeServiceResponse,resume_service_response +ResumeSessionRequest,resume_session_request +ResumeSessionResponse,resume_session_response +ResumeWorkflowRunRequest,resume_workflow_run_request +ResumeWorkflowRunResponse,resume_workflow_run_response +ResyncMFADeviceRequest,resync_mfa_device_request +RetainAllVariantProperties,retain_all_variant_properties +RetainDeploymentConfig,retain_deployment_config +RetainExceptOnCreate,retain_except_on_create +RetainPhysicalResources,retain_physical_resources +RetainPrimaryCluster,retain_primary_cluster +RetainPrimaryReplicationGroup,retain_primary_replication_group +RetainRecordInDays,retain_record_in_days +RetainRecordUntil,retain_record_until +RetainResources,retain_resources +RetainRule,retain_rule +RetainStacks,retain_stacks +RetainStacksOnAccountRemoval,retain_stacks_on_account_removal +RetainUntilDate,retain_until_date +RetainedMessageSummary,retained_message_summary +Retention,retention +RetentionArchiveTier,retention_archive_tier +RetentionConfiguration,retention_configuration +RetentionConfigurationName,retention_configuration_name +RetentionConfigurationNames,retention_configuration_names +RetentionConfigurations,retention_configurations +RetentionDays,retention_days +RetentionLockTimeInDays,retention_lock_time_in_days +RetentionLockType,retention_lock_type +RetentionPeriod,retention_period +RetentionPeriodHours,retention_period_hours +RetentionPeriodInDays,retention_period_in_days +RetentionPeriodUnit,retention_period_unit +RetentionPeriodValue,retention_period_value +RetentionPolicy,retention_policy +RetentionProperties,retention_properties +RetentionSettings,retention_settings +RetentionStartDate,retention_start_date +RetireGrantRequest,retire_grant_request +RetiringPrincipal,retiring_principal +RetrainingAvailableDataInDays,retraining_available_data_in_days +RetrainingFrequency,retraining_frequency +RetrainingSchedulerStatus,retraining_scheduler_status +RetrainingSchedulerSummaries,retraining_scheduler_summaries +RetrainingSchedulerSummary,retraining_scheduler_summary +RetrainingStartDate,retraining_start_date +Retries,retries +Retrieval,retrieval +RetrievalByteRange,retrieval_byte_range +RetrievalRoleArn,retrieval_role_arn +RetrieveAZs,retrieve_azs +RetrieveActions,retrieve_actions +RetrieveDomainAuthCodeRequest,retrieve_domain_auth_code_request +RetrieveDomainAuthCodeResponse,retrieve_domain_auth_code_response +RetrieveEnvironmentInfoMessage,retrieve_environment_info_message +RetrieveEnvironmentInfoResultMessage,retrieve_environment_info_result_message +RetrieveFilePaths,retrieve_file_paths +RetrieveRequest,retrieve_request +RetrieveResult,retrieve_result +RetrieveResultItem,retrieve_result_item +RetrieveResults,retrieve_results +RetrieveTapeArchiveInput,retrieve_tape_archive_input +RetrieveTapeArchiveOutput,retrieve_tape_archive_output +RetrieveTapeRecoveryPointInput,retrieve_tape_recovery_point_input +RetrieveTapeRecoveryPointOutput,retrieve_tape_recovery_point_output +RetrievedTo,retrieved_to +RetryAfter,retry_after +RetryAfterSeconds,retry_after_seconds +RetryAttemptSeconds,retry_attempt_seconds +RetryAttempts,retry_attempts +RetryBuildBatchInput,retry_build_batch_input +RetryBuildBatchOutput,retry_build_batch_output +RetryBuildInput,retry_build_input +RetryBuildOutput,retry_build_output +RetryCount,retry_count +RetryCriteria,retry_criteria +RetryDataReplicationRequest,retry_data_replication_request +RetryDelayInSeconds,retry_delay_in_seconds +RetryInterval,retry_interval +RetryIntervalInMinutes,retry_interval_in_minutes +RetryIntervalMs,retry_interval_ms +RetryOptions,retry_options +RetryPipelineExecutionRequest,retry_pipeline_execution_request +RetryPipelineExecutionResponse,retry_pipeline_execution_response +RetryPolicy,retry_policy +RetryPolicyConfiguration,retry_policy_configuration +RetryPolicyExecution,retry_policy_execution +RetryStageExecutionInput,retry_stage_execution_input +RetryStageExecutionOutput,retry_stage_execution_output +RetryStrategy,retry_strategy +RetryWorkflowStepRequest,retry_workflow_step_request +RetryWorkflowStepResponse,retry_workflow_step_response +Retryable,retryable +RetryableConflictException,retryable_conflict_exception +RetryableError,retryable_error +RetryableException,retryable_exception +Return,return +ReturnCode,return_code +ReturnConnectionPasswordEncrypted,return_connection_password_encrypted +ReturnConsumedCapacity,return_consumed_capacity +ReturnData,return_data +ReturnEnabled,return_enabled +ReturnInformation,return_information +ReturnItemCollectionMetrics,return_item_collection_metrics +ReturnPath,return_path +ReturnPathArn,return_path_arn +ReturnPathComponents,return_path_components +ReturnShippingLabelAlreadyExistsException,return_shipping_label_already_exists_exception +ReturnShippingLabelURI,return_shipping_label_uri +ReturnSize,return_size +ReturnSubscriptionArn,return_subscription_arn +ReturnValue,return_value +ReturnValues,return_values +ReturnValuesOnConditionCheckFailure,return_values_on_condition_check_failure +ReusableDelegationSetLimit,reusable_delegation_set_limit +ReuseOnScaleIn,reuse_on_scale_in +ReusedByJob,reused_by_job +ReusedPreviousResult,reused_previous_result +RevealConfiguration,reveal_configuration +ReverseGeocodingConfig,reverse_geocoding_config +ReverseOrder,reverse_order +ReverseReplicationRequest,reverse_replication_request +ReverseReplicationResponse,reverse_replication_response +Revert,revert +ReviewActionDetail,review_action_detail +ReviewActions,review_actions +ReviewDetails,review_details +ReviewInformation,review_information +ReviewOwner,review_owner +ReviewPolicy,review_policy +ReviewReport,review_report +ReviewRestrictionDate,review_restriction_date +ReviewResultDetail,review_result_detail +ReviewResults,review_results +ReviewStatus,review_status +ReviewedTime,reviewed_time +Reviewer,reviewer +ReviewerResponse,reviewer_response +Reviews,reviews +Revision,revision +RevisionDestination,revision_destination +RevisionDestinationEntry,revision_destination_entry +RevisionDestinations,revision_destinations +RevisionDoesNotExistException,revision_does_not_exist_exception +RevisionEntry,revision_entry +RevisionId,revision_id +RevisionIdRequiredException,revision_id_required_exception +RevisionInfo,revision_info +RevisionLocation,revision_location +RevisionNotCurrentException,revision_not_current_exception +RevisionPublished,revision_published +RevisionRequiredException,revision_required_exception +RevisionTarget,revision_target +RevisionTargets,revision_targets +Revisions,revisions +RevocationComment,revocation_comment +RevocationConfiguration,revocation_configuration +RevocationReason,revocation_reason +RevokeAllGroups,revoke_all_groups +RevokeCacheSecurityGroupIngressMessage,revoke_cache_security_group_ingress_message +RevokeCacheSecurityGroupIngressResult,revoke_cache_security_group_ingress_result +RevokeCertificateRequest,revoke_certificate_request +RevokeClientVpnIngressRequest,revoke_client_vpn_ingress_request +RevokeClientVpnIngressResult,revoke_client_vpn_ingress_result +RevokeClusterSecurityGroupIngressMessage,revoke_cluster_security_group_ingress_message +RevokeClusterSecurityGroupIngressResult,revoke_cluster_security_group_ingress_result +RevokeDBSecurityGroupIngressMessage,revoke_db_security_group_ingress_message +RevokeDBSecurityGroupIngressResult,revoke_db_security_group_ingress_result +RevokeDomainAccessRequest,revoke_domain_access_request +RevokeEndpointAccessMessage,revoke_endpoint_access_message +RevokeFlowEntitlementRequest,revoke_flow_entitlement_request +RevokeFlowEntitlementResponse,revoke_flow_entitlement_response +RevokeGrantRequest,revoke_grant_request +RevokeInvitationRequest,revoke_invitation_request +RevokeIpRulesRequest,revoke_ip_rules_request +RevokeLinkPermissions,revoke_link_permissions +RevokePermissions,revoke_permissions +RevokePermissionsRequest,revoke_permissions_request +RevokeRevisionRequest,revoke_revision_request +RevokeRevisionResponse,revoke_revision_response +RevokeSecurityGroupEgressRequest,revoke_security_group_egress_request +RevokeSecurityGroupEgressResult,revoke_security_group_egress_result +RevokeSecurityGroupIngressRequest,revoke_security_group_ingress_request +RevokeSecurityGroupIngressResult,revoke_security_group_ingress_result +RevokeSignatureRequest,revoke_signature_request +RevokeSigningProfileRequest,revoke_signing_profile_request +RevokeSnapshotAccessMessage,revoke_snapshot_access_message +RevokeSnapshotAccessResult,revoke_snapshot_access_result +RevokeTokenRequest,revoke_token_request +RevokeVpcEndpointAccessRequest,revoke_vpc_endpoint_access_request +Revoked,revoked +RevokedAt,revoked_at +Reward,reward +RfRegion,rf_region +Rfc4180,rfc4180 +Rfc822Name,rfc822_name +RichText,rich_text +Right,right +RightJoinKeyProperties,right_join_key_properties +RightOperand,right_operand +RightsizingRecommendation,rightsizing_recommendation +RightsizingRecommendationConfiguration,rightsizing_recommendation_configuration +RightsizingRecommendationMetadata,rightsizing_recommendation_metadata +RightsizingRecommendationSummary,rightsizing_recommendation_summary +RightsizingRecommendations,rightsizing_recommendations +RightsizingType,rightsizing_type +Risk,risk +RiskConfiguration,risk_configuration +RiskConfigurationType,risk_configuration_type +RiskCounts,risk_counts +RiskDecision,risk_decision +RiskDetails,risk_details +RiskExceptionConfiguration,risk_exception_configuration +RiskExceptionConfigurationType,risk_exception_configuration_type +RiskLevel,risk_level +RiskRating,risk_rating +RiskScore,risk_score +RiskThreshold,risk_threshold +Robot,robot +RobotApplicationConfig,robot_application_config +RobotApplicationSummary,robot_application_summary +RobotDeployment,robot_deployment +RobotSoftwareSuite,robot_software_suite +Role,role +RoleARN,role_arn +RoleARNUpdate,role_arn_update +RoleAliasDescription,role_alias_description +RoleArn,role_arn +RoleArns,role_arns +RoleBase,role_base +RoleCredentials,role_credentials +RoleDetail,role_detail +RoleDetailList,role_detail_list +RoleId,role_id +RoleInfo,role_info +RoleLastUsed,role_last_used +RoleLevel,role_level +RoleMapping,role_mapping +RoleMappings,role_mappings +RoleName,role_name +RolePolicyList,role_policy_list +RoleRequiredException,role_required_exception +RoleSearchMatching,role_search_matching +RoleSearchSubtree,role_search_subtree +RoleSessionName,role_session_name +RoleStatus,role_status +RoleUsageList,role_usage_list +RoleUsageType,role_usage_type +RoleValues,role_values +Roles,roles +RolesKey,roles_key +Roll,roll +Rollback,rollback +RollbackApplicationRequest,rollback_application_request +RollbackApplicationResponse,rollback_application_response +RollbackConfiguration,rollback_configuration +RollbackDetails,rollback_details +RollbackErrorMessage,rollback_error_message +RollbackErrors,rollback_errors +RollbackFailureReason,rollback_failure_reason +RollbackInfo,rollback_info +RollbackInstanceRefreshAnswer,rollback_instance_refresh_answer +RollbackInstanceRefreshType,rollback_instance_refresh_type +RollbackMaximumBatchSize,rollback_maximum_batch_size +RollbackOnDisable,rollback_on_disable +RollbackReason,rollback_reason +RollbackStackInput,rollback_stack_input +RollbackStackOutput,rollback_stack_output +RollbackStartTime,rollback_start_time +RollbackTransactionRequest,rollback_transaction_request +RollbackTransactionResponse,rollback_transaction_response +RollbackTrigger,rollback_trigger +RollbackTriggers,rollback_triggers +RollingDate,rolling_date +RollingDateConfiguration,rolling_date_configuration +RollingUpdatePolicy,rolling_update_policy +RolloverInterval,rollover_interval +Room,room +RoomArn,room_arn +RoomData,room_data +RoomFilters,room_filters +RoomId,room_id +RoomMembership,room_membership +RoomMemberships,room_memberships +RoomName,room_name +RoomRetentionSettings,room_retention_settings +RoomSkillParameter,room_skill_parameter +RoomSkillParameters,room_skill_parameters +RoomSummary,room_summary +RoomUtilizationMetricsEnabled,room_utilization_metrics_enabled +Rooms,rooms +Root,root +RootAccess,root_access +RootCause,root_cause +RootCauseException,root_cause_exception +RootCauseServiceId,root_cause_service_id +RootCauseServiceRequestImpactStatistics,root_cause_service_request_impact_statistics +RootCauses,root_causes +RootCertificatePublicKey,root_certificate_public_key +RootChangeSetId,root_change_set_id +RootDeviceName,root_device_name +RootDeviceType,root_device_type +RootDeviceVolumeId,root_device_volume_id +RootDirectory,root_directory +RootFolderId,root_folder_id +RootId,root_id +RootNotFoundException,root_not_found_exception +RootSquash,root_squash +RootSquashConfiguration,root_squash_configuration +RootStorage,root_storage +RootVolumeConfiguration,root_volume_configuration +RootVolumeEncryptionEnabled,root_volume_encryption_enabled +RootVolumeId,root_volume_id +RootVolumeSecurityStyle,root_volume_security_style +RootVolumeSizeGib,root_volume_size_gib +Roots,roots +Rotate,rotate +RotateChannelCredentialsRequest,rotate_channel_credentials_request +RotateChannelCredentialsResponse,rotate_channel_credentials_response +RotateEncryptionKeyMessage,rotate_encryption_key_message +RotateEncryptionKeyResult,rotate_encryption_key_result +RotateImmediately,rotate_immediately +RotateIngestEndpointCredentialsRequest,rotate_ingest_endpoint_credentials_request +RotateIngestEndpointCredentialsResponse,rotate_ingest_endpoint_credentials_response +RotateMasterUserPassword,rotate_master_user_password +RotateSecretRequest,rotate_secret_request +RotateSecretResponse,rotate_secret_response +RotateTunnelAccessTokenRequest,rotate_tunnel_access_token_request +RotateTunnelAccessTokenResponse,rotate_tunnel_access_token_response +Rotation,rotation +RotationAngle,rotation_angle +RotationArn,rotation_arn +RotationEnabled,rotation_enabled +RotationId,rotation_id +RotationIds,rotation_ids +RotationLambdaARN,rotation_lambda_arn +RotationLambdaArn,rotation_lambda_arn +RotationNamePrefix,rotation_name_prefix +RotationOccurredWithinFrequency,rotation_occurred_within_frequency +RotationOverride,rotation_override +RotationOverrideId,rotation_override_id +RotationOverrides,rotation_overrides +RotationRules,rotation_rules +RotationRulesType,rotation_rules_type +RotationShift,rotation_shift +RotationShifts,rotation_shifts +RotationStartTime,rotation_start_time +Rotations,rotations +RoundTripTime,round_trip_time +Route,route +RouteAnalysis,route_analysis +RouteAnalysisCompletion,route_analysis_completion +RouteAnalysisEndpointOptions,route_analysis_endpoint_options +RouteAnalysisEndpointOptionsSpecification,route_analysis_endpoint_options_specification +RouteAnalysisId,route_analysis_id +RouteAnalysisPath,route_analysis_path +RouteBBox,route_b_box +RouteCount,route_count +RouteData,route_data +RouteFilterPrefix,route_filter_prefix +RouteHasOutOfScopeEndpointViolation,route_has_out_of_scope_endpoint_violation +RouteId,route_id +RouteIdentifier,route_identifier +RouteKey,route_key +RouteMatrix,route_matrix +RouteMatrixEntry,route_matrix_entry +RouteMatrixEntryError,route_matrix_entry_error +RouteOrigin,route_origin +RouteRef,route_ref +RouteResponse,route_response +RouteResponseId,route_response_id +RouteResponseKey,route_response_key +RouteResponseSelectionExpression,route_response_selection_expression +RouteSelectionExpression,route_selection_expression +RouteSet,route_set +RouteSetDetails,route_set_details +RouteSettings,route_settings +RouteSpec,route_spec +RouteStatus,route_status +RouteSummary,route_summary +RouteSummaryList,route_summary_list +RouteTable,route_table +RouteTableArn,route_table_arn +RouteTableAssociation,route_table_association +RouteTableAssociationId,route_table_association_id +RouteTableAssociationState,route_table_association_state +RouteTableId,route_table_id +RouteTableIdentifier,route_table_identifier +RouteTableIds,route_table_ids +RouteTableRoute,route_table_route +RouteTableTimestamp,route_table_timestamp +RouteTableType,route_table_type +RouteTables,route_tables +RouteType,route_type +RouteUpdates,route_updates +RoutedResource,routed_resource +RouterType,router_type +Routes,routes +RoutingConfig,routing_config +RoutingConfigurationListItem,routing_configuration_list_item +RoutingControl,routing_control +RoutingControlArn,routing_control_arn +RoutingControlCount,routing_control_count +RoutingControlName,routing_control_name +RoutingControlState,routing_control_state +RoutingControls,routing_controls +RoutingPolicy,routing_policy +RoutingProfile,routing_profile +RoutingProfileArn,routing_profile_arn +RoutingProfileId,routing_profile_id +RoutingProfileQueueConfig,routing_profile_queue_config +RoutingProfileQueueConfigSummary,routing_profile_queue_config_summary +RoutingProfileQueueConfigSummaryList,routing_profile_queue_config_summary_list +RoutingProfileQueueReference,routing_profile_queue_reference +RoutingProfileReference,routing_profile_reference +RoutingProfileSearchCriteria,routing_profile_search_criteria +RoutingProfileSearchFilter,routing_profile_search_filter +RoutingProfileSummary,routing_profile_summary +RoutingProfileSummaryList,routing_profile_summary_list +RoutingProfiles,routing_profiles +RoutingRule,routing_rule +RoutingRules,routing_rules +RoutingStrategy,routing_strategy +RoutingStrategyType,routing_strategy_type +Row,row +RowAlternateColorOptions,row_alternate_color_options +RowAlternateColors,row_alternate_colors +RowColumnInfo,row_column_info +RowFieldNamesStyle,row_field_names_style +RowFilter,row_filter +RowFilterExpression,row_filter_expression +RowGroupLength,row_group_length +RowHeaderStyle,row_header_style +RowIndex,row_index +RowIndexStride,row_index_stride +RowInfo,row_info +RowLabelOptions,row_label_options +RowLength,row_length +RowLevelPermissionDataSet,row_level_permission_data_set +RowLevelPermissionTagConfiguration,row_level_permission_tag_configuration +RowLevelPermissionTagConfigurationApplied,row_level_permission_tag_configuration_applied +RowLevelPermissionTagKeys,row_level_permission_tag_keys +RowLevelPermissionTagRule,row_level_permission_tag_rule +RowLevelPermissionTags,row_level_permission_tags +RowRange,row_range +RowSort,row_sort +RowSpan,row_span +RowSubtotalOptions,row_subtotal_options +RowTag,row_tag +RowTotalOptions,row_total_options +RowValue,row_value +Rows,rows +RowsDropped,rows_dropped +RowsIngested,rows_ingested +RowsLabelOptions,rows_label_options +RowsLayout,rows_layout +RpcProtection,rpc_protection +RsaPublicKey,rsa_public_key +RsaPublicKeyFingerprint,rsa_public_key_fingerprint +Rscp,rscp +Rsrp,rsrp +Rsrq,rsrq +Rss,rss +Rssi,rssi +RtmpCaptionInfoDestinationSettings,rtmp_caption_info_destination_settings +RtmpGroupSettings,rtmp_group_settings +RtmpOutputSettings,rtmp_output_settings +Rule,rule +RuleARN,rule_arn +RuleAction,rule_action +RuleActionOverride,rule_action_override +RuleActionOverrides,rule_action_overrides +RuleArn,rule_arn +RuleArns,rule_arns +RuleBasedMatching,rule_based_matching +RuleBasedMatchingRequest,rule_based_matching_request +RuleBasedMatchingResponse,rule_based_matching_response +RuleBasedProperties,rule_based_properties +RuleCondition,rule_condition +RuleConfig,rule_config +RuleConfigurationName,rule_configuration_name +RuleCount,rule_count +RuleDefinition,rule_definition +RuleDescription,rule_description +RuleDetail,rule_detail +RuleDoesNotExistException,rule_does_not_exist_exception +RuleEvaluation,rule_evaluation +RuleEvaluationJobArn,rule_evaluation_job_arn +RuleEvaluationStatus,rule_evaluation_status +RuleEvaluatorImage,rule_evaluator_image +RuleGroup,rule_group +RuleGroupArn,rule_group_arn +RuleGroupDetails,rule_group_details +RuleGroupId,rule_group_id +RuleGroupMetadata,rule_group_metadata +RuleGroupName,rule_group_name +RuleGroupReferenceStatement,rule_group_reference_statement +RuleGroupResponse,rule_group_response +RuleGroupRuleName,rule_group_rule_name +RuleGroupRuleOptionsPair,rule_group_rule_options_pair +RuleGroupRuleOptionsPairs,rule_group_rule_options_pairs +RuleGroupSource,rule_group_source +RuleGroupSourceCustomActionsDetails,rule_group_source_custom_actions_details +RuleGroupSourceListDetails,rule_group_source_list_details +RuleGroupSourceStatefulRulesDetails,rule_group_source_stateful_rules_details +RuleGroupSourceStatefulRulesHeaderDetails,rule_group_source_stateful_rules_header_details +RuleGroupSourceStatefulRulesOptionsDetails,rule_group_source_stateful_rules_options_details +RuleGroupSourceStatelessRuleDefinition,rule_group_source_stateless_rule_definition +RuleGroupSourceStatelessRuleMatchAttributes,rule_group_source_stateless_rule_match_attributes +RuleGroupSourceStatelessRuleMatchAttributesDestinationPorts,rule_group_source_stateless_rule_match_attributes_destination_ports +RuleGroupSourceStatelessRuleMatchAttributesDestinations,rule_group_source_stateless_rule_match_attributes_destinations +RuleGroupSourceStatelessRuleMatchAttributesSourcePorts,rule_group_source_stateless_rule_match_attributes_source_ports +RuleGroupSourceStatelessRuleMatchAttributesSources,rule_group_source_stateless_rule_match_attributes_sources +RuleGroupSourceStatelessRuleMatchAttributesTcpFlags,rule_group_source_stateless_rule_match_attributes_tcp_flags +RuleGroupSourceStatelessRulesAndCustomActionsDetails,rule_group_source_stateless_rules_and_custom_actions_details +RuleGroupSourceStatelessRulesDetails,rule_group_source_stateless_rules_details +RuleGroupStatus,rule_group_status +RuleGroupSummary,rule_group_summary +RuleGroupType,rule_group_type +RuleGroupTypePair,rule_group_type_pair +RuleGroupTypePairs,rule_group_type_pairs +RuleGroupUpdate,rule_group_update +RuleGroupVariables,rule_group_variables +RuleGroupVariablesIpSetsDetails,rule_group_variables_ip_sets_details +RuleGroupVariablesPortSetsDetails,rule_group_variables_port_sets_details +RuleGroups,rule_groups +RuleGroupsNamespaceDescription,rule_groups_namespace_description +RuleGroupsNamespaceStatus,rule_groups_namespace_status +RuleGroupsNamespaceSummary,rule_groups_namespace_summary +RuleId,rule_id +RuleIdentifier,rule_identifier +RuleLabels,rule_labels +RuleLevel,rule_level +RuleLimitExceededException,rule_limit_exceeded_exception +RuleMetadata,rule_metadata +RuleMetricName,rule_metric_name +RuleName,rule_name +RuleNameWithinRuleGroup,rule_name_within_rule_group +RuleNames,rule_names +RuleNotFoundException,rule_not_found_exception +RuleNumber,rule_number +RuleOption,rule_option +RuleOptions,rule_options +RuleOrder,rule_order +RuleParameters,rule_parameters +RulePriorities,rule_priorities +RulePriorityPair,rule_priority_pair +RuleResult,rule_result +RuleResults,rule_results +RuleSet,rule_set +RuleSetArn,rule_set_arn +RuleSetBody,rule_set_body +RuleSetDoesNotExistException,rule_set_does_not_exist_exception +RuleSetName,rule_set_name +RuleSets,rule_sets +RuleState,rule_state +RuleStatus,rule_status +RuleSummary,rule_summary +RuleSummaryList,rule_summary_list +RuleTags,rule_tags +RuleTriggerEventSource,rule_trigger_event_source +RuleType,rule_type +RuleUpdate,rule_update +RuleUpdateFailure,rule_update_failure +RuleUpdateSuccess,rule_update_success +RuleVariables,rule_variables +RuleVersion,rule_version +RuleWithinRuleGroup,rule_within_rule_group +Rules,rules +RulesConfiguration,rules_configuration +RulesConfigurationType,rules_configuration_type +RulesList,rules_list +RulesPackage,rules_package +RulesSource,rules_source +RulesSourceList,rules_source_list +RulesString,rules_string +Ruleset,ruleset +RulesetArn,ruleset_arn +RulesetEvaluationRunId,ruleset_evaluation_run_id +RulesetItem,ruleset_item +RulesetName,ruleset_name +RulesetNames,ruleset_names +Rulesets,rulesets +RumEvent,rum_event +RumEvents,rum_events +Run,run +RunAs,run_as +RunBackTestMode,run_back_test_mode +RunCommand,run_command +RunCommandParameters,run_command_parameters +RunCommandTarget,run_command_target +RunCommandTargets,run_command_targets +RunConfig,run_config +RunConfiguration,run_configuration +RunConfigurationDescription,run_configuration_description +RunConfigurationUpdate,run_configuration_update +RunFleetAdvisorLsaAnalysisResponse,run_fleet_advisor_lsa_analysis_response +RunGroupListItem,run_group_list_item +RunId,run_id +RunInstancesMonitoringEnabled,run_instances_monitoring_enabled +RunInstancesRequest,run_instances_request +RunJobFlowInput,run_job_flow_input +RunJobFlowOutput,run_job_flow_output +RunListItem,run_list_item +RunName,run_name +RunPipelineActivityRequest,run_pipeline_activity_request +RunPipelineActivityResponse,run_pipeline_activity_response +RunProperties,run_properties +RunScheduledInstancesRequest,run_scheduled_instances_request +RunScheduledInstancesResult,run_scheduled_instances_result +RunStatementRequest,run_statement_request +RunStatementResponse,run_statement_response +RunStatus,run_status +RunTaskRequest,run_task_request +RunTaskResponse,run_task_response +Runbook,runbook +Runbooks,runbooks +RuncBinaryPath,runc_binary_path +Running,running +RunningActions,running_actions +RunningAmiVersion,running_ami_version +RunningBridgeCount,running_bridge_count +RunningInstanceCount,running_instance_count +RunningMode,running_mode +RunningModeAutoStopTimeoutInMinutes,running_mode_auto_stop_timeout_in_minutes +RunningSetup,running_setup +RunningTasksCount,running_tasks_count +Runs,runs +Runtime,runtime +RuntimeConfiguration,runtime_configuration +RuntimeContext,runtime_context +RuntimeContextName,runtime_context_name +RuntimeContextStates,runtime_context_states +RuntimeDetails,runtime_details +RuntimeEnvironment,runtime_environment +RuntimeEnvironmentSecrets,runtime_environment_secrets +RuntimeEnvironmentVariables,runtime_environment_variables +RuntimeHintDetails,runtime_hint_details +RuntimeHintValue,runtime_hint_value +RuntimeHints,runtime_hints +RuntimeInSeconds,runtime_in_seconds +RuntimePlatform,runtime_platform +RuntimeRoleArn,runtime_role_arn +RuntimeVersion,runtime_version +RuntimeVersionArn,runtime_version_arn +RuntimeVersionConfig,runtime_version_config +RuntimeVersionError,runtime_version_error +RuntimeVersions,runtime_versions +RxDataRate2,rx_data_rate2 +RxDelay1,rx_delay1 +RxDrOffset1,rx_dr_offset1 +RxFreq2,rx_freq2 +RxLevel,rx_level +RxNormAttribute,rx_norm_attribute +RxNormConcept,rx_norm_concept +RxNormConcepts,rx_norm_concepts +RxNormEntity,rx_norm_entity +RxNormTrait,rx_norm_trait +S,s +S3,s3 +S3AccessControlList,s3_access_control_list +S3AccessControlPolicy,s3_access_control_policy +S3AccessDeniedFault,s3_access_denied_fault +S3AccessPointAlias,s3_access_point_alias +S3AccessPointArn,s3_access_point_arn +S3AccessPointConfiguration,s3_access_point_configuration +S3AclOption,s3_acl_option +S3Action,s3_action +S3ApplicationCodeLocationDescription,s3_application_code_location_description +S3ArtifactLocation,s3_artifact_location +S3ArtifactPath,s3_artifact_path +S3BackupConfiguration,s3_backup_configuration +S3BackupDescription,s3_backup_description +S3BackupMode,s3_backup_mode +S3BackupUpdate,s3_backup_update +S3Bucket,s3_bucket +S3BucketAccessRoleArn,s3_bucket_access_role_arn +S3BucketAclGrantConfiguration,s3_bucket_acl_grant_configuration +S3BucketArn,s3_bucket_arn +S3BucketConfiguration,s3_bucket_configuration +S3BucketCriteriaForJob,s3_bucket_criteria_for_job +S3BucketDefinitionForJob,s3_bucket_definition_for_job +S3BucketDestination,s3_bucket_destination +S3BucketDetail,s3_bucket_detail +S3BucketDetails,s3_bucket_details +S3BucketDoesNotExistException,s3_bucket_does_not_exist_exception +S3BucketFolder,s3_bucket_folder +S3BucketInfo,s3_bucket_info +S3BucketLogDestination,s3_bucket_log_destination +S3BucketName,s3_bucket_name +S3BucketOwner,s3_bucket_owner +S3BucketPath,s3_bucket_path +S3BucketPrefix,s3_bucket_prefix +S3BucketRegion,s3_bucket_region +S3BucketRepository,s3_bucket_repository +S3BucketRoleArn,s3_bucket_role_arn +S3BucketSinkConfiguration,s3_bucket_sink_configuration +S3BucketSource,s3_bucket_source +S3BucketTranscriptSource,s3_bucket_transcript_source +S3CanonicalUserId,s3_canonical_user_id +S3CatalogDeltaSource,s3_catalog_delta_source +S3CatalogHudiSource,s3_catalog_hudi_source +S3CatalogSource,s3_catalog_source +S3CatalogTarget,s3_catalog_target +S3ClassificationScope,s3_classification_scope +S3ClassificationScopeExclusion,s3_classification_scope_exclusion +S3ClassificationScopeExclusionUpdate,s3_classification_scope_exclusion_update +S3ClassificationScopeUpdate,s3_classification_scope_update +S3CompressionType,s3_compression_type +S3Config,s3_config +S3Configuration,s3_configuration +S3ContentBaseLocation,s3_content_base_location +S3ContentBaseLocationDescription,s3_content_base_location_description +S3ContentBaseLocationUpdate,s3_content_base_location_update +S3ContentLocation,s3_content_location +S3ContentLocationDescription,s3_content_location_description +S3ContentLocationUpdate,s3_content_location_update +S3CopyObjectOperation,s3_copy_object_operation +S3CsvSource,s3_csv_source +S3Data,s3_data +S3DataAccessAsset,s3_data_access_asset +S3DataAccessAssetSourceEntry,s3_data_access_asset_source_entry +S3DataConfig,s3_data_config +S3DataDistributionType,s3_data_distribution_type +S3DataRepositoryConfiguration,s3_data_repository_configuration +S3DataSize,s3_data_size +S3DataSource,s3_data_source +S3DataSourceConfiguration,s3_data_source_configuration +S3DataSpec,s3_data_spec +S3DataType,s3_data_type +S3DataUrl,s3_data_url +S3DeleteObjectTagging,s3_delete_object_tagging +S3DeltaCatalogTarget,s3_delta_catalog_target +S3DeltaDirectTarget,s3_delta_direct_target +S3DeltaSource,s3_delta_source +S3Destination,s3_destination +S3DestinationAccessControl,s3_destination_access_control +S3DestinationConfig,s3_destination_config +S3DestinationConfiguration,s3_destination_configuration +S3DestinationDescription,s3_destination_description +S3DestinationProperties,s3_destination_properties +S3DestinationSettings,s3_destination_settings +S3DestinationUpdate,s3_destination_update +S3Destinations,s3_destinations +S3DirectSourceAdditionalOptions,s3_direct_source_additional_options +S3DirectTarget,s3_direct_target +S3Encryption,s3_encryption +S3EncryptionConfig,s3_encryption_config +S3EncryptionConfiguration,s3_encryption_configuration +S3EncryptionEnabled,s3_encryption_enabled +S3EncryptionMode,s3_encryption_mode +S3EncryptionSettings,s3_encryption_settings +S3EventName,s3_event_name +S3Exception,s3_exception +S3ExportArtifacts,s3_export_artifacts +S3ExportConfiguration,s3_export_configuration +S3ExportLocation,s3_export_location +S3Exporting,s3_exporting +S3ExportingConfig,s3_exporting_config +S3ExportingLocation,s3_exporting_location +S3FailurePath,s3_failure_path +S3FileLocation,s3_file_location +S3GeneratedManifestDescriptor,s3_generated_manifest_descriptor +S3GlueParquetTarget,s3_glue_parquet_target +S3Grant,s3_grant +S3Grantee,s3_grantee +S3HudiCatalogTarget,s3_hudi_catalog_target +S3HudiDirectTarget,s3_hudi_direct_target +S3HudiSource,s3_hudi_source +S3ImportSource,s3_import_source +S3IngestionRoleArn,s3_ingestion_role_arn +S3InitiateRestoreObject,s3_initiate_restore_object +S3InitiateRestoreObjectOperation,s3_initiate_restore_object_operation +S3Input,s3_input +S3InputConfiguration,s3_input_configuration +S3InputDefinition,s3_input_definition +S3InputFileLocation,s3_input_file_location +S3InputFormatConfig,s3_input_format_config +S3InputMode,s3_input_mode +S3Inputs,s3_inputs +S3JobDefinition,s3_job_definition +S3JobManifestGenerator,s3_job_manifest_generator +S3JsonSource,s3_json_source +S3Key,s3_key +S3KeyFilter,s3_key_filter +S3KeyName,s3_key_name +S3KeyOutput,s3_key_output +S3KeyPrefix,s3_key_prefix +S3Keys,s3_keys +S3KmsKeyId,s3_kms_key_id +S3Location,s3_location +S3LocationDescription,s3_location_description +S3LocationNotInServiceRegionException,s3_location_not_in_service_region_exception +S3LocationUri,s3_location_uri +S3LogDelivery,s3_log_delivery +S3LogDeliveryDescription,s3_log_delivery_description +S3LogUrl,s3_log_url +S3Logs,s3_logs +S3LogsConfig,s3_logs_config +S3LogsConfiguration,s3_logs_configuration +S3LogsConfigurationResult,s3_logs_configuration_result +S3MachineLearningModelResourceData,s3_machine_learning_model_resource_data +S3ManifestOutputLocation,s3_manifest_output_location +S3ModelArtifacts,s3_model_artifacts +S3ModelDataSource,s3_model_data_source +S3MonitoringConfiguration,s3_monitoring_configuration +S3Object,s3_object +S3ObjectAcl,s3_object_acl +S3ObjectKey,s3_object_key +S3ObjectLockLegalHold,s3_object_lock_legal_hold +S3ObjectMetadata,s3_object_metadata +S3ObjectOwner,s3_object_owner +S3ObjectSource,s3_object_source +S3ObjectTag,s3_object_tag +S3ObjectTags,s3_object_tags +S3ObjectUrl,s3_object_url +S3ObjectVersion,s3_object_version +S3OnDeviceService,s3_on_device_service +S3OnDeviceServiceConfiguration,s3_on_device_service_configuration +S3Options,s3_options +S3Origin,s3_origin +S3OriginConfig,s3_origin_config +S3Output,s3_output +S3OutputConfiguration,s3_output_configuration +S3OutputFormatConfig,s3_output_format_config +S3OutputLocation,s3_output_location +S3OutputPath,s3_output_path +S3OutputUri,s3_output_uri +S3OutputUrl,s3_output_url +S3Parameters,s3_parameters +S3ParquetSource,s3_parquet_source +S3Path,s3_path +S3PathforGroupMembers,s3_pathfor_group_members +S3Prefix,s3_prefix +S3PublicAccessBlockConfiguration,s3_public_access_block_configuration +S3PutObjectAcl,s3_put_object_acl +S3PutObjectCopy,s3_put_object_copy +S3PutObjectLegalHold,s3_put_object_legal_hold +S3PutObjectRetention,s3_put_object_retention +S3PutObjectTagging,s3_put_object_tagging +S3RecordingConfig,s3_recording_config +S3RecordingDetails,s3_recording_details +S3RecordingSinkConfiguration,s3_recording_sink_configuration +S3RecordingSinkRuntimeConfiguration,s3_recording_sink_runtime_configuration +S3Reference,s3_reference +S3ReferenceDataSource,s3_reference_data_source +S3ReferenceDataSourceDescription,s3_reference_data_source_description +S3ReferenceDataSourceUpdate,s3_reference_data_source_update +S3Region,s3_region +S3ReplicateObject,s3_replicate_object +S3ReportExportConfig,s3_report_export_config +S3ReportLocation,s3_report_location +S3Repository,s3_repository +S3RepositoryDetails,s3_repository_details +S3Resource,s3_resource +S3ResourceClassification,s3_resource_classification +S3ResourceClassificationUpdate,s3_resource_classification_update +S3ResourceNotFoundFault,s3_resource_not_found_fault +S3Resources,s3_resources +S3Results,s3_results +S3ResultsPath,s3_results_path +S3Retention,s3_retention +S3SetObjectAclOperation,s3_set_object_acl_operation +S3SetObjectLegalHoldOperation,s3_set_object_legal_hold_operation +S3SetObjectRetentionOperation,s3_set_object_retention_operation +S3SetObjectTaggingOperation,s3_set_object_tagging_operation +S3Settings,s3_settings +S3SignedObject,s3_signed_object +S3SnapshotAsset,s3_snapshot_asset +S3Source,s3_source +S3SourceAdditionalOptions,s3_source_additional_options +S3SourceConfig,s3_source_config +S3SourceProperties,s3_source_properties +S3SseAlgorithm,s3_sse_algorithm +S3SseKmsKeyId,s3_sse_kms_key_id +S3StagingLocation,s3_staging_location +S3Storage,s3_storage +S3StorageClass,s3_storage_class +S3StorageConfig,s3_storage_config +S3SubscriptionRequiredException,s3_subscription_required_exception +S3TableOutputOptions,s3_table_output_options +S3Tag,s3_tag +S3Target,s3_target +S3Targets,s3_targets +S3Update,s3_update +S3UploadMode,s3_upload_mode +S3Uri,s3_uri +S3Url,s3_url +S3UrlPrefix,s3_url_prefix +S3UrlSignerRole,s3_url_signer_role +S3Version,s3_version +S3WordsList,s3_words_list +S3objectKey,s3object_key +SAMLAssertion,saml_assertion +SAMLIdp,saml_idp +SAMLMetadataDocument,saml_metadata_document +SAMLOptions,saml_options +SAMLOptionsInput,saml_options_input +SAMLOptionsOutput,saml_options_output +SAMLProviderArn,saml_provider_arn +SAMLProviderList,saml_provider_list +SAMLProviderListEntry,saml_provider_list_entry +SAPOData,sapo_data +SAPODataConnectorProfileCredentials,sapo_data_connector_profile_credentials +SAPODataConnectorProfileProperties,sapo_data_connector_profile_properties +SAPODataDestinationProperties,sapo_data_destination_properties +SAPODataPaginationConfig,sapo_data_pagination_config +SAPODataParallelismConfig,sapo_data_parallelism_config +SAPODataSourceProperties,sapo_data_source_properties +SCApplicationAttributes,sc_application_attributes +SDM,sdm +SHA256TreeHash,sha256_tree_hash +SL,sl +SLRDeploymentStatus,slr_deployment_status +SMB,smb +SMBACLEnabled,smbacl_enabled +SMBFileShareInfo,smb_file_share_info +SMBFileShareInfoList,smb_file_share_info_list +SMBGuestPasswordSet,smb_guest_password_set +SMBLocalGroups,smb_local_groups +SMBSecurityStrategy,smb_security_strategy +SMS,sms +SMSChannelRequest,sms_channel_request +SMSChannelResponse,sms_channel_response +SMSConfiguration,sms_configuration +SMSMessage,sms_message +SMSMessageActivity,sms_message_activity +SMSMfaSettings,sms_mfa_settings +SMSMfaSettingsType,sms_mfa_settings_type +SMSSandboxPhoneNumber,sms_sandbox_phone_number +SMSTemplate,sms_template +SMSTemplateRequest,sms_template_request +SMSTemplateResponse,sms_template_response +SNOMEDCTAttribute,snomedct_attribute +SNOMEDCTConcept,snomedct_concept +SNOMEDCTConcepts,snomedct_concepts +SNOMEDCTDetails,snomedct_details +SNOMEDCTEntity,snomedct_entity +SNOMEDCTTrait,snomedct_trait +SNSAction,sns_action +SNSConfiguration,sns_configuration +SNSDestination,sns_destination +SNSInvalidTopicFault,sns_invalid_topic_fault +SNSNoAuthorizationFault,sns_no_authorization_fault +SNSTopic,sns_topic +SNSTopicArn,sns_topic_arn +SNSTopicArnNotFoundFault,sns_topic_arn_not_found_fault +SNSTopicPublishAction,sns_topic_publish_action +SNwkSIntKey,s_nwk_s_int_key +SOA,soa +SOAChange,soa_change +SQLPort,sql_port +SS,ss +SSEAlgorithm,sse_algorithm +SSEAwsKmsKeyId,sse_aws_kms_key_id +SSECustomerAlgorithm,sse_customer_algorithm +SSECustomerKey,sse_customer_key +SSECustomerKeyMD5,sse_customer_key_md5 +SSEDescription,sse_description +SSEKMS,ssekms +SSEKMSEncryption,ssekms_encryption +SSEKMSEncryptionContext,ssekms_encryption_context +SSEKMSKeyId,ssekms_key_id +SSES3,sses3 +SSESpecification,sse_specification +SSESpecificationOverride,sse_specification_override +SSEType,sse_type +SSHPublicKey,ssh_public_key +SSHPublicKeyBody,ssh_public_key_body +SSHPublicKeyId,ssh_public_key_id +SSHPublicKeyMetadata,ssh_public_key_metadata +SSHPublicKeys,ssh_public_keys +SSLCertificateId,ssl_certificate_id +SSLPolicyNotFoundException,ssl_policy_not_found_exception +SSLSupportMethod,ssl_support_method +SSMLMessage,ssml_message +SSMLMessageType,ssml_message_type +SSMOutput,ssm_output +SSMValidationParameters,ssm_validation_parameters +SSOIdentity,sso_identity +SaaSConfiguration,saa_s_configuration +Safe,safe +SafeguardPolicy,safeguard_policy +SafetyRuleArn,safety_rule_arn +SafetyRules,safety_rules +SafetyRulesToOverride,safety_rules_to_override +SageMakerImageArn,sage_maker_image_arn +SageMakerImageVersionAliases,sage_maker_image_version_aliases +SageMakerImageVersionArn,sage_maker_image_version_arn +SageMakerJobArn,sage_maker_job_arn +SageMakerMachineLearningModelResourceData,sage_maker_machine_learning_model_resource_data +SageMakerPipelineParameter,sage_maker_pipeline_parameter +SageMakerPipelineParameters,sage_maker_pipeline_parameters +Salesforce,salesforce +SalesforceAction,salesforce_action +SalesforceChatterFeedConfiguration,salesforce_chatter_feed_configuration +SalesforceConfiguration,salesforce_configuration +SalesforceConnectorProfileCredentials,salesforce_connector_profile_credentials +SalesforceConnectorProfileProperties,salesforce_connector_profile_properties +SalesforceCustomKnowledgeArticleTypeConfiguration,salesforce_custom_knowledge_article_type_configuration +SalesforceDestinationProperties,salesforce_destination_properties +SalesforceKnowledgeArticleConfiguration,salesforce_knowledge_article_configuration +SalesforceMetadata,salesforce_metadata +SalesforceSourceProperties,salesforce_source_properties +SalesforceStandardKnowledgeArticleTypeConfiguration,salesforce_standard_knowledge_article_type_configuration +SalesforceStandardObjectAttachmentConfiguration,salesforce_standard_object_attachment_configuration +SalesforceStandardObjectConfiguration,salesforce_standard_object_configuration +Salt,salt +SameFileContentException,same_file_content_exception +SamePathRequestException,same_path_request_exception +SameSheetTargetVisualConfiguration,same_sheet_target_visual_configuration +SamlAuthentication,saml_authentication +SamlConfigCount,saml_config_count +SamlConfigOptions,saml_config_options +SamlConfiguration,saml_configuration +SamlProperties,saml_properties +SamlProviderARNs,saml_provider_arns +SamlProviderArn,saml_provider_arn +Sample,sample +SampleAdaptiveOffsetFilterMode,sample_adaptive_offset_filter_mode +SampleChannelDataRequest,sample_channel_data_request +SampleChannelDataResponse,sample_channel_data_response +SampleCount,sample_count +SampleDataS3SourceConfig,sample_data_s3_source_config +SampleFraction,sample_fraction +SamplePath,sample_path +SamplePayloadUrl,sample_payload_url +SampleQuery,sample_query +SampleRange,sample_range +SampleRangeConversion,sample_range_conversion +SampleRate,sample_rate +SampleRows,sample_rows +SampleSize,sample_size +SampleTime,sample_time +SampleTimestamp,sample_timestamp +SampleUtterance,sample_utterance +SampleUtterances,sample_utterances +SampleValue,sample_value +SampleWeightAttributeName,sample_weight_attribute_name +SampledCount,sampled_count +SampledEndTime,sampled_end_time +SampledHTTPRequest,sampled_http_request +SampledRequests,sampled_requests +SampledRequestsEnabled,sampled_requests_enabled +SampledStartTime,sampled_start_time +Sampling,sampling +SamplingDeviceCount,sampling_device_count +SamplingInterval,sampling_interval +SamplingPercentage,sampling_percentage +SamplingRate,sampling_rate +SamplingRule,sampling_rule +SamplingRuleRecord,sampling_rule_record +SamplingRuleRecords,sampling_rule_records +SamplingRuleUpdate,sampling_rule_update +SamplingStatisticSummaries,sampling_statistic_summaries +SamplingStatisticSummary,sampling_statistic_summary +SamplingStatisticsDocument,sampling_statistics_document +SamplingStatisticsDocuments,sampling_statistics_documents +SamplingStrategy,sampling_strategy +SamplingTargetDocument,sampling_target_document +SamplingTargetDocuments,sampling_target_documents +SanRequireDirectoryGuid,san_require_directory_guid +SanRequireDns,san_require_dns +SanRequireDomainDns,san_require_domain_dns +SanRequireEmail,san_require_email +SanRequireSpn,san_require_spn +SanRequireUpn,san_require_upn +SanitizationWarning,sanitization_warning +SankeyDiagramAggregatedFieldWells,sankey_diagram_aggregated_field_wells +SankeyDiagramChartConfiguration,sankey_diagram_chart_configuration +SankeyDiagramFieldWells,sankey_diagram_field_wells +SankeyDiagramSortConfiguration,sankey_diagram_sort_configuration +SankeyDiagramVisual,sankey_diagram_visual +SapHostname,sap_hostname +SapInstanceNumber,sap_instance_number +SapKernelVersion,sap_kernel_version +SasConfiguration,sas_configuration +Sasl,sasl +SaslMechanism,sasl_mechanism +SaslPassword,sasl_password +SaslUsername,sasl_username +SatelliteListItem,satellite_list_item +Saturation,saturation +Saturday,saturday +Savings,savings +SavingsCurrencyCode,savings_currency_code +SavingsOpportunity,savings_opportunity +SavingsPercentage,savings_percentage +SavingsPlan,savings_plan +SavingsPlanArn,savings_plan_arn +SavingsPlanFilter,savings_plan_filter +SavingsPlanOffering,savings_plan_offering +SavingsPlanOfferingFilterElement,savings_plan_offering_filter_element +SavingsPlanOfferingProperty,savings_plan_offering_property +SavingsPlanOfferingRate,savings_plan_offering_rate +SavingsPlanOfferingRateFilterElement,savings_plan_offering_rate_filter_element +SavingsPlanOfferingRateProperty,savings_plan_offering_rate_property +SavingsPlanRate,savings_plan_rate +SavingsPlanRateFilter,savings_plan_rate_filter +SavingsPlanRateProperty,savings_plan_rate_property +SavingsPlansAmortizedCommitment,savings_plans_amortized_commitment +SavingsPlansCoverage,savings_plans_coverage +SavingsPlansCoverageData,savings_plans_coverage_data +SavingsPlansCoverages,savings_plans_coverages +SavingsPlansCoveredHoursInLookbackPeriod,savings_plans_covered_hours_in_lookback_period +SavingsPlansDetails,savings_plans_details +SavingsPlansPurchaseRecommendation,savings_plans_purchase_recommendation +SavingsPlansPurchaseRecommendationDetail,savings_plans_purchase_recommendation_detail +SavingsPlansPurchaseRecommendationDetails,savings_plans_purchase_recommendation_details +SavingsPlansPurchaseRecommendationMetadata,savings_plans_purchase_recommendation_metadata +SavingsPlansPurchaseRecommendationSummary,savings_plans_purchase_recommendation_summary +SavingsPlansSavings,savings_plans_savings +SavingsPlansType,savings_plans_type +SavingsPlansUtilization,savings_plans_utilization +SavingsPlansUtilizationAggregates,savings_plans_utilization_aggregates +SavingsPlansUtilizationByTime,savings_plans_utilization_by_time +SavingsPlansUtilizationDetail,savings_plans_utilization_detail +SavingsPlansUtilizationDetails,savings_plans_utilization_details +SavingsPlansUtilizationsByTime,savings_plans_utilizations_by_time +ScalaCode,scala_code +ScalableDimension,scalable_dimension +ScalableTarget,scalable_target +ScalableTargetARN,scalable_target_arn +ScalableTargetAction,scalable_target_action +ScalableTargets,scalable_targets +ScalarCrlRequest,scalar_crl_request +ScalarProfileRequest,scalar_profile_request +ScalarSubjectRequest,scalar_subject_request +ScalarTrustAnchorRequest,scalar_trust_anchor_request +ScalarType,scalar_type +ScalarValue,scalar_value +Scale,scale +ScaleDownBehavior,scale_down_behavior +ScaleDownModifications,scale_down_modifications +ScaleDownNodeTypes,scale_down_node_types +ScaleInCooldown,scale_in_cooldown +ScaleInPolicy,scale_in_policy +ScaleInPolicyDescription,scale_in_policy_description +ScaleInPolicyUpdate,scale_in_policy_update +ScaleInProtectedInstances,scale_in_protected_instances +ScaleOutCooldown,scale_out_cooldown +ScaleOutPolicy,scale_out_policy +ScaleOutPolicyDescription,scale_out_policy_description +ScaleOutPolicyUpdate,scale_out_policy_update +ScaleUpModifications,scale_up_modifications +ScaleUpNodeTypes,scale_up_node_types +ScalingAction,scaling_action +ScalingActivities,scaling_activities +ScalingActivity,scaling_activity +ScalingActivityInProgressFault,scaling_activity_in_progress_fault +ScalingAdjustment,scaling_adjustment +ScalingAdjustmentType,scaling_adjustment_type +ScalingBehavior,scaling_behavior +ScalingConfig,scaling_config +ScalingConfiguration,scaling_configuration +ScalingConfigurationInfo,scaling_configuration_info +ScalingConstraints,scaling_constraints +ScalingInstruction,scaling_instruction +ScalingInstructions,scaling_instructions +ScalingMode,scaling_mode +ScalingParameters,scaling_parameters +ScalingParametersStatus,scaling_parameters_status +ScalingPlan,scaling_plan +ScalingPlanName,scaling_plan_name +ScalingPlanNames,scaling_plan_names +ScalingPlanResource,scaling_plan_resource +ScalingPlanResources,scaling_plan_resources +ScalingPlanVersion,scaling_plan_version +ScalingPlans,scaling_plans +ScalingPolicies,scaling_policies +ScalingPolicy,scaling_policy +ScalingPolicyMetric,scaling_policy_metric +ScalingPolicyObjective,scaling_policy_objective +ScalingPolicyUpdate,scaling_policy_update +ScalingPolicyUpdateBehavior,scaling_policy_update_behavior +ScalingProcessQuery,scaling_process_query +ScalingProcesses,scaling_processes +ScalingRule,scaling_rule +ScalingStatusCode,scaling_status_code +ScalingStatusMessage,scaling_status_message +ScalingTrigger,scaling_trigger +ScalingType,scaling_type +Scan,scan +ScanAll,scan_all +ScanBy,scan_by +ScanCompletedAt,scan_completed_at +ScanCondition,scan_condition +ScanConditionPair,scan_condition_pair +ScanDetections,scan_detections +ScanDirection,scan_direction +ScanEc2InstanceWithFindings,scan_ec2_instance_with_findings +ScanEc2InstanceWithFindingsResult,scan_ec2_instance_with_findings_result +ScanEnabled,scan_enabled +ScanEndTime,scan_end_time +ScanFilePath,scan_file_path +ScanFilter,scan_filter +ScanId,scan_id +ScanIndexForward,scan_index_forward +ScanInput,scan_input +ScanMode,scan_mode +ScanNameWithFindingNum,scan_name_with_finding_num +ScanNotFoundException,scan_not_found_exception +ScanOnPush,scan_on_push +ScanOutput,scan_output +ScanProvisionedProductsInput,scan_provisioned_products_input +ScanProvisionedProductsOutput,scan_provisioned_products_output +ScanRange,scan_range +ScanResourceCriteria,scan_resource_criteria +ScanResult,scan_result +ScanResultDetails,scan_result_details +ScanStartTime,scan_start_time +ScanStartedAt,scan_started_at +ScanStatus,scan_status +ScanSummary,scan_summary +ScanThreatName,scan_threat_name +ScanType,scan_type +ScanTypeConversionMode,scan_type_conversion_mode +ScannedCount,scanned_count +ScannedItemCount,scanned_item_count +ScannedVolumeDetails,scanned_volume_details +ScanningRepositoryFilter,scanning_repository_filter +Scans,scans +ScatterPlotCategoricallyAggregatedFieldWells,scatter_plot_categorically_aggregated_field_wells +ScatterPlotConfiguration,scatter_plot_configuration +ScatterPlotFieldWells,scatter_plot_field_wells +ScatterPlotUnaggregatedFieldWells,scatter_plot_unaggregated_field_wells +ScatterPlotVisual,scatter_plot_visual +SccDestinationSettings,scc_destination_settings +SccXml,scc_xml +Scenario,scenario +SceneChangeDetect,scene_change_detect +SceneError,scene_error +SceneSummary,scene_summary +Schedule,schedule +ScheduleAction,schedule_action +ScheduleActionSettings,schedule_action_settings +ScheduleActionStartSettings,schedule_action_start_settings +ScheduleActions,schedule_actions +ScheduleActivityTaskDecisionAttributes,schedule_activity_task_decision_attributes +ScheduleActivityTaskFailedEventAttributes,schedule_activity_task_failed_event_attributes +ScheduleAdBreak,schedule_ad_break +ScheduleAdBreaks,schedule_ad_breaks +ScheduleArn,schedule_arn +ScheduleAssociationState,schedule_association_state +ScheduleAt,schedule_at +ScheduleConfig,schedule_config +ScheduleConfiguration,schedule_configuration +ScheduleDefinitionTypeUnsupportedFault,schedule_definition_type_unsupported_fault +ScheduleDefinitions,schedule_definitions +ScheduleDescription,schedule_description +ScheduleEndTime,schedule_end_time +ScheduleEntry,schedule_entry +ScheduleEntryType,schedule_entry_type +ScheduleExpression,schedule_expression +ScheduleExpressionTimezone,schedule_expression_timezone +ScheduleFrequency,schedule_frequency +ScheduleGroupArn,schedule_group_arn +ScheduleGroupSummary,schedule_group_summary +ScheduleGroups,schedule_groups +ScheduleId,schedule_id +ScheduleIdentifier,schedule_identifier +ScheduleKeyDeletionRequest,schedule_key_deletion_request +ScheduleKeyDeletionResponse,schedule_key_deletion_response +ScheduleLambdaFunctionDecisionAttributes,schedule_lambda_function_decision_attributes +ScheduleLambdaFunctionFailedEventAttributes,schedule_lambda_function_failed_event_attributes +ScheduleName,schedule_name +ScheduleOffset,schedule_offset +ScheduleRefreshOnEntity,schedule_refresh_on_entity +ScheduleRunConfiguration,schedule_run_configuration +ScheduleRunRequest,schedule_run_request +ScheduleRunResult,schedule_run_result +ScheduleRunTest,schedule_run_test +ScheduleStartTime,schedule_start_time +ScheduleSummary,schedule_summary +ScheduleTimezone,schedule_timezone +Scheduled,scheduled +ScheduledAction,scheduled_action +ScheduledActionARN,scheduled_action_arn +ScheduledActionAlreadyExistsFault,scheduled_action_already_exists_fault +ScheduledActionBufferTime,scheduled_action_buffer_time +ScheduledActionDescription,scheduled_action_description +ScheduledActionFilter,scheduled_action_filter +ScheduledActionName,scheduled_action_name +ScheduledActionNames,scheduled_action_names +ScheduledActionNotFoundFault,scheduled_action_not_found_fault +ScheduledActionQuotaExceededFault,scheduled_action_quota_exceeded_fault +ScheduledActionType,scheduled_action_type +ScheduledActionTypeUnsupportedFault,scheduled_action_type_unsupported_fault +ScheduledActions,scheduled_actions +ScheduledActionsMessage,scheduled_actions_message +ScheduledActionsType,scheduled_actions_type +ScheduledAuditMetadata,scheduled_audit_metadata +ScheduledAutoTuneDetails,scheduled_auto_tune_details +ScheduledBy,scheduled_by +ScheduledEndTime,scheduled_end_time +ScheduledInstance,scheduled_instance +ScheduledInstanceAvailability,scheduled_instance_availability +ScheduledInstanceAvailabilitySet,scheduled_instance_availability_set +ScheduledInstanceId,scheduled_instance_id +ScheduledInstanceIds,scheduled_instance_ids +ScheduledInstanceRecurrence,scheduled_instance_recurrence +ScheduledInstanceRecurrenceRequest,scheduled_instance_recurrence_request +ScheduledInstanceSet,scheduled_instance_set +ScheduledInstancesBlockDeviceMapping,scheduled_instances_block_device_mapping +ScheduledInstancesEbs,scheduled_instances_ebs +ScheduledInstancesIamInstanceProfile,scheduled_instances_iam_instance_profile +ScheduledInstancesIpv6Address,scheduled_instances_ipv6_address +ScheduledInstancesLaunchSpecification,scheduled_instances_launch_specification +ScheduledInstancesMonitoring,scheduled_instances_monitoring +ScheduledInstancesNetworkInterface,scheduled_instances_network_interface +ScheduledInstancesPlacement,scheduled_instances_placement +ScheduledInstancesPrivateIpAddressConfig,scheduled_instances_private_ip_address_config +ScheduledJobRollout,scheduled_job_rollout +ScheduledQueries,scheduled_queries +ScheduledQuery,scheduled_query +ScheduledQueryArn,scheduled_query_arn +ScheduledQueryDescription,scheduled_query_description +ScheduledQueryExecutionRoleArn,scheduled_query_execution_role_arn +ScheduledQueryRunSummary,scheduled_query_run_summary +ScheduledScalingSuspended,scheduled_scaling_suspended +ScheduledSplit,scheduled_split +ScheduledSplitConfig,scheduled_split_config +ScheduledSplitsLaunchConfig,scheduled_splits_launch_config +ScheduledSplitsLaunchDefinition,scheduled_splits_launch_definition +ScheduledStart,scheduled_start +ScheduledStartTime,scheduled_start_time +ScheduledStartTimeMillis,scheduled_start_time_millis +ScheduledTime,scheduled_time +ScheduledTimeAfter,scheduled_time_after +ScheduledTimeBefore,scheduled_time_before +ScheduledTimestamp,scheduled_timestamp +ScheduledTriggerProperties,scheduled_trigger_properties +ScheduledUpdateGroupAction,scheduled_update_group_action +ScheduledUpdateGroupActionRequest,scheduled_update_group_action_request +ScheduledUpdateGroupActions,scheduled_update_group_actions +ScheduledWindowExecution,scheduled_window_execution +ScheduledWindowExecutions,scheduled_window_executions +SchedulerLogs,scheduler_logs +SchedulerNotRunningException,scheduler_not_running_exception +SchedulerRunningException,scheduler_running_exception +SchedulerTransitioningException,scheduler_transitioning_exception +Schedulers,schedulers +Schedules,schedules +SchedulingBufferTime,scheduling_buffer_time +SchedulingConfig,scheduling_config +SchedulingPolicyDetail,scheduling_policy_detail +SchedulingPolicyListingDetail,scheduling_policy_listing_detail +SchedulingStrategy,scheduling_strategy +Schema,schema +SchemaAlreadyExistsException,schema_already_exists_exception +SchemaAlreadyPublishedException,schema_already_published_exception +SchemaArn,schema_arn +SchemaArns,schema_arns +SchemaAttribute,schema_attribute +SchemaAttributeType,schema_attribute_type +SchemaAttributes,schema_attributes +SchemaChangePolicy,schema_change_policy +SchemaCheckpoint,schema_checkpoint +SchemaColumn,schema_column +SchemaConfiguration,schema_configuration +SchemaConversionApplicationAttributes,schema_conversion_application_attributes +SchemaConversionRequest,schema_conversion_request +SchemaDefinition,schema_definition +SchemaDeleteOption,schema_delete_option +SchemaDiffType,schema_diff_type +SchemaError,schema_error +SchemaExtensionId,schema_extension_id +SchemaExtensionInfo,schema_extension_info +SchemaExtensionStatus,schema_extension_status +SchemaExtensionStatusReason,schema_extension_status_reason +SchemaExtensionsInfo,schema_extensions_info +SchemaFacet,schema_facet +SchemaFacets,schema_facets +SchemaHandlerPackage,schema_handler_package +SchemaId,schema_id +SchemaInputAttribute,schema_input_attribute +SchemaListItem,schema_list_item +SchemaMappingSummary,schema_mapping_summary +SchemaName,schema_name +SchemaNamePrefix,schema_name_prefix +SchemaPattern,schema_pattern +SchemaReference,schema_reference +SchemaResponse,schema_response +SchemaS3Location,schema_s3_location +SchemaShortInfoResponse,schema_short_info_response +SchemaStatus,schema_status +SchemaSummary,schema_summary +SchemaUnion,schema_union +SchemaVersion,schema_version +SchemaVersionErrorItem,schema_version_error_item +SchemaVersionErrors,schema_version_errors +SchemaVersionId,schema_version_id +SchemaVersionListItem,schema_version_list_item +SchemaVersionNumber,schema_version_number +SchemaVersionStatus,schema_version_status +SchemaVersionSummary,schema_version_summary +SchemaVersions,schema_versions +Schemas,schemas +Scheme,scheme +Scope,scope +ScopeConfiguration,scope_configuration +ScopeCount,scope_count +ScopeDescription,scope_description +ScopeDoesNotExistException,scope_does_not_exist_exception +ScopeDownStatement,scope_down_statement +ScopeName,scope_name +Scopes,scopes +Scoping,scoping +Score,score +ScoreAttributes,score_attributes +ScoreConfidence,score_confidence +ScoreDetails,score_details +ScoreThreshold,score_threshold +ScoreThresholdLastUpdatedAt,score_threshold_last_updated_at +Scores,scores +ScoringStrategy,scoring_strategy +ScpActionDefinition,scp_action_definition +Scram,scram +ScreenCanvasSizeOptions,screen_canvas_size_options +ScreenDataUrl,screen_data_url +ScreenSharingUrl,screen_sharing_url +ScreenViewingUrl,screen_viewing_url +ScreenshotName,screenshot_name +Script,script +ScriptArn,script_arn +ScriptBatchJobDefinition,script_batch_job_definition +ScriptBatchJobIdentifier,script_batch_job_identifier +ScriptBootstrapAction,script_bootstrap_action +ScriptBootstrapActionConfig,script_bootstrap_action_config +ScriptDetails,script_details +ScriptId,script_id +ScriptLocation,script_location +ScriptModeConfig,script_mode_config +ScriptParameterKeyValue,script_parameter_key_value +ScriptPath,script_path +ScriptS3Location,script_s3_location +Scripts,scripts +ScrollBarOptions,scroll_bar_options +ScrollStatus,scroll_status +ScrollbarOptions,scrollbar_options +Scte,scte +Scte20Detection,scte20_detection +Scte20PlusEmbeddedDestinationSettings,scte20_plus_embedded_destination_settings +Scte20SourceSettings,scte20_source_settings +Scte27DestinationSettings,scte27_destination_settings +Scte27Pids,scte27_pids +Scte27SourceSettings,scte27_source_settings +Scte35Behavior,scte35_behavior +Scte35Control,scte35_control +Scte35DeliveryRestrictions,scte35_delivery_restrictions +Scte35Descriptor,scte35_descriptor +Scte35DescriptorSettings,scte35_descriptor_settings +Scte35Descriptors,scte35_descriptors +Scte35Esam,scte35_esam +Scte35EsamPid,scte35_esam_pid +Scte35InputScheduleActionSettings,scte35_input_schedule_action_settings +Scte35InputSettings,scte35_input_settings +Scte35Pid,scte35_pid +Scte35PrerollPullupMilliseconds,scte35_preroll_pullup_milliseconds +Scte35ReturnToNetworkScheduleActionSettings,scte35_return_to_network_schedule_action_settings +Scte35ReturnToNetworkSettings,scte35_return_to_network_settings +Scte35SegmentationDescriptor,scte35_segmentation_descriptor +Scte35Source,scte35_source +Scte35SpliceInsert,scte35_splice_insert +Scte35SpliceInsertScheduleActionSettings,scte35_splice_insert_schedule_action_settings +Scte35SpliceInsertSettings,scte35_splice_insert_settings +Scte35TimeSignalApos,scte35_time_signal_apos +Scte35TimeSignalScheduleActionSettings,scte35_time_signal_schedule_action_settings +Scte35TimeSignalSettings,scte35_time_signal_settings +ScteFilter,scte_filter +ScteHls,scte_hls +ScteMarkersSource,scte_markers_source +SdkConfigurationProperty,sdk_configuration_property +SdkName,sdk_name +SdkResponse,sdk_response +SdkType,sdk_type +SdkTypes,sdk_types +SdrReferenceWhiteLevel,sdr_reference_white_level +SdtInterval,sdt_interval +Search,search +SearchAddressBooksRequest,search_address_books_request +SearchAddressBooksResponse,search_address_books_response +SearchAnalysesRequest,search_analyses_request +SearchAnalysesResponse,search_analyses_response +SearchAssociatedTranscriptsRequest,search_associated_transcripts_request +SearchAssociatedTranscriptsResponse,search_associated_transcripts_response +SearchAvailablePhoneNumbersRequest,search_available_phone_numbers_request +SearchAvailablePhoneNumbersResponse,search_available_phone_numbers_response +SearchCasesRequest,search_cases_request +SearchCasesResponse,search_cases_response +SearchCasesResponseItem,search_cases_response_item +SearchChannelsRequest,search_channels_request +SearchChannelsResponse,search_channels_response +SearchCollectionTypes,search_collection_types +SearchContactsRequest,search_contacts_request +SearchContactsResponse,search_contacts_response +SearchContentRequest,search_content_request +SearchContentResponse,search_content_response +SearchCriteria,search_criteria +SearchDashboardsRequest,search_dashboards_request +SearchDashboardsResponse,search_dashboards_response +SearchDataSetsRequest,search_data_sets_request +SearchDataSetsResponse,search_data_sets_response +SearchDataSourcesRequest,search_data_sources_request +SearchDataSourcesResponse,search_data_sources_response +SearchDatabasesByLFTagsRequest,search_databases_by_lf_tags_request +SearchDatabasesByLFTagsResponse,search_databases_by_lf_tags_response +SearchDevicesFilter,search_devices_filter +SearchDevicesRequest,search_devices_request +SearchDevicesResponse,search_devices_response +SearchEnabled,search_enabled +SearchEntitiesRequest,search_entities_request +SearchEntitiesResponse,search_entities_response +SearchException,search_exception +SearchExpression,search_expression +SearchFacesByImageRequest,search_faces_by_image_request +SearchFacesByImageResponse,search_faces_by_image_response +SearchFacesRequest,search_faces_request +SearchFacesResponse,search_faces_response +SearchField,search_field +SearchFilter,search_filter +SearchFlowExecutionsRequest,search_flow_executions_request +SearchFlowExecutionsResponse,search_flow_executions_response +SearchFlowTemplatesRequest,search_flow_templates_request +SearchFlowTemplatesResponse,search_flow_templates_response +SearchFoldersRequest,search_folders_request +SearchFoldersResponse,search_folders_response +SearchForPositionResult,search_for_position_result +SearchForSuggestionsResult,search_for_suggestions_result +SearchForTextResult,search_for_text_result +SearchGameSessionsInput,search_game_sessions_input +SearchGameSessionsOutput,search_game_sessions_output +SearchGroupsRequest,search_groups_request +SearchGroupsResponse,search_groups_response +SearchHoursOfOperationsRequest,search_hours_of_operations_request +SearchHoursOfOperationsResponse,search_hours_of_operations_response +SearchImageSetsRequest,search_image_sets_request +SearchImageSetsResponse,search_image_sets_response +SearchIndexRequest,search_index_request +SearchIndexResponse,search_index_response +SearchInput,search_input +SearchInsightsFilters,search_insights_filters +SearchInsightsRequest,search_insights_request +SearchInsightsResponse,search_insights_response +SearchInstanceCount,search_instance_count +SearchInstanceType,search_instance_type +SearchJobsFilter,search_jobs_filter +SearchJobsRequest,search_jobs_request +SearchJobsResponse,search_jobs_response +SearchKey,search_key +SearchLocalGatewayRoutesRequest,search_local_gateway_routes_request +SearchLocalGatewayRoutesResult,search_local_gateway_routes_result +SearchNetworkProfilesRequest,search_network_profiles_request +SearchNetworkProfilesResponse,search_network_profiles_response +SearchOptions,search_options +SearchOrganizationInsightsFilters,search_organization_insights_filters +SearchOrganizationInsightsRequest,search_organization_insights_request +SearchOrganizationInsightsResponse,search_organization_insights_response +SearchOutput,search_output +SearchPartitionCount,search_partition_count +SearchPlaceIndexForPositionRequest,search_place_index_for_position_request +SearchPlaceIndexForPositionResponse,search_place_index_for_position_response +SearchPlaceIndexForPositionSummary,search_place_index_for_position_summary +SearchPlaceIndexForSuggestionsRequest,search_place_index_for_suggestions_request +SearchPlaceIndexForSuggestionsResponse,search_place_index_for_suggestions_response +SearchPlaceIndexForSuggestionsSummary,search_place_index_for_suggestions_summary +SearchPlaceIndexForTextRequest,search_place_index_for_text_request +SearchPlaceIndexForTextResponse,search_place_index_for_text_response +SearchPlaceIndexForTextSummary,search_place_index_for_text_summary +SearchPrincipalType,search_principal_type +SearchProductsAsAdminInput,search_products_as_admin_input +SearchProductsAsAdminOutput,search_products_as_admin_output +SearchProductsInput,search_products_input +SearchProductsOutput,search_products_output +SearchProfilesRequest,search_profiles_request +SearchProfilesResponse,search_profiles_response +SearchPromptsRequest,search_prompts_request +SearchPromptsResponse,search_prompts_response +SearchProvisionedProductsInput,search_provisioned_products_input +SearchProvisionedProductsOutput,search_provisioned_products_output +SearchQuantumTasksFilter,search_quantum_tasks_filter +SearchQuantumTasksRequest,search_quantum_tasks_request +SearchQuantumTasksResponse,search_quantum_tasks_response +SearchQuery,search_query +SearchQueuesRequest,search_queues_request +SearchQueuesResponse,search_queues_response +SearchQuickConnectsRequest,search_quick_connects_request +SearchQuickConnectsResponse,search_quick_connects_response +SearchRasterDataCollectionInput,search_raster_data_collection_input +SearchRasterDataCollectionOutput,search_raster_data_collection_output +SearchRecord,search_record +SearchRelatedItemsRequest,search_related_items_request +SearchRelatedItemsResponse,search_related_items_response +SearchRelatedItemsResponseItem,search_related_items_response_item +SearchRequest,search_request +SearchResourceTagsRequest,search_resource_tags_request +SearchResourceTagsResponse,search_resource_tags_response +SearchResourcesBucketCriteria,search_resources_bucket_criteria +SearchResourcesCriteria,search_resources_criteria +SearchResourcesCriteriaBlock,search_resources_criteria_block +SearchResourcesInput,search_resources_input +SearchResourcesOutput,search_resources_output +SearchResourcesRequest,search_resources_request +SearchResourcesResponse,search_resources_response +SearchResourcesSimpleCriterion,search_resources_simple_criterion +SearchResourcesSortCriteria,search_resources_sort_criteria +SearchResourcesTagCriterion,search_resources_tag_criterion +SearchResourcesTagCriterionPair,search_resources_tag_criterion_pair +SearchResponse,search_response +SearchRoomsRequest,search_rooms_request +SearchRoomsResponse,search_rooms_response +SearchRoutingProfilesRequest,search_routing_profiles_request +SearchRoutingProfilesResponse,search_routing_profiles_response +SearchSchemaSummary,search_schema_summary +SearchSchemaVersionSummary,search_schema_version_summary +SearchSchemasRequest,search_schemas_request +SearchSchemasResponse,search_schemas_response +SearchSecurityProfilesRequest,search_security_profiles_request +SearchSecurityProfilesResponse,search_security_profiles_response +SearchService,search_service +SearchSessionsRequest,search_sessions_request +SearchSessionsResponse,search_sessions_response +SearchSkillGroupsRequest,search_skill_groups_request +SearchSkillGroupsResponse,search_skill_groups_response +SearchSlowLogs,search_slow_logs +SearchSortResult,search_sort_result +SearchStatus,search_status +SearchString,search_string +SearchSystemInstancesRequest,search_system_instances_request +SearchSystemInstancesResponse,search_system_instances_response +SearchSystemTemplatesRequest,search_system_templates_request +SearchSystemTemplatesResponse,search_system_templates_response +SearchTablesByLFTagsRequest,search_tables_by_lf_tags_request +SearchTablesByLFTagsResponse,search_tables_by_lf_tags_response +SearchTablesRequest,search_tables_request +SearchTablesResponse,search_tables_response +SearchText,search_text +SearchThingsRequest,search_things_request +SearchThingsResponse,search_things_response +SearchTransitGatewayMulticastGroupsRequest,search_transit_gateway_multicast_groups_request +SearchTransitGatewayMulticastGroupsResult,search_transit_gateway_multicast_groups_result +SearchTransitGatewayRoutesRequest,search_transit_gateway_routes_request +SearchTransitGatewayRoutesResult,search_transit_gateway_routes_result +SearchUsersByImageRequest,search_users_by_image_request +SearchUsersByImageResponse,search_users_by_image_response +SearchUsersRequest,search_users_request +SearchUsersResponse,search_users_response +SearchValue,search_value +SearchVocabulariesRequest,search_vocabularies_request +SearchVocabulariesResponse,search_vocabularies_response +SearchVulnerabilitiesFilterCriteria,search_vulnerabilities_filter_criteria +SearchVulnerabilitiesRequest,search_vulnerabilities_request +SearchVulnerabilitiesResponse,search_vulnerabilities_response +Searchable,searchable +SearchedFace,searched_face +SearchedFaceBoundingBox,searched_face_bounding_box +SearchedFaceConfidence,searched_face_confidence +SearchedFaceDetails,searched_face_details +SearchedFaceId,searched_face_id +SearchedLogStream,searched_log_stream +SearchedUser,searched_user +Seasonality,seasonality +SecondBlockToken,second_block_token +SecondSchemaVersionNumber,second_schema_version_number +SecondSnapshotId,second_snapshot_id +Secondary,secondary +SecondaryAllocationIds,secondary_allocation_ids +SecondaryArtifacts,secondary_artifacts +SecondaryAvailabilityZone,secondary_availability_zone +SecondaryBackground,secondary_background +SecondaryBtn,secondary_btn +SecondaryEmail,secondary_email +SecondaryForeground,secondary_foreground +SecondaryGids,secondary_gids +SecondaryInputId,secondary_input_id +SecondaryPrivateIpAddressCount,secondary_private_ip_address_count +SecondaryPrivateIpAddresses,secondary_private_ip_addresses +SecondaryStatus,secondary_status +SecondaryStatusTransition,secondary_status_transition +SecondaryStatusTransitions,secondary_status_transitions +SecondaryValue,secondary_value +SecondaryValueFontConfiguration,secondary_value_font_configuration +SecondaryValueOptions,secondary_value_options +SecondaryYAxisDisplayOptions,secondary_y_axis_display_options +SecondaryYAxisLabelOptions,secondary_y_axis_label_options +SecondsBeforeTimeout,seconds_before_timeout +SecondsUntilAutoPause,seconds_until_auto_pause +Secret,secret +SecretAccessKey,secret_access_key +SecretArn,secret_arn +SecretArnList,secret_arn_list +SecretBinary,secret_binary +SecretCode,secret_code +SecretHash,secret_hash +SecretId,secret_id +SecretKey,secret_key +SecretList,secret_list +SecretListEntry,secret_list_entry +SecretManagerArn,secret_manager_arn +SecretOptions,secret_options +SecretStatus,secret_status +SecretString,secret_string +SecretStringKey,secret_string_key +SecretToAuthenticateInitiator,secret_to_authenticate_initiator +SecretToAuthenticateTarget,secret_to_authenticate_target +SecretToken,secret_token +SecretVersionsListEntry,secret_versions_list_entry +SecretVersionsToStages,secret_versions_to_stages +Secrets,secrets +SecretsManagerAccessRoleArn,secrets_manager_access_role_arn +SecretsManagerAccessTokenConfiguration,secrets_manager_access_token_configuration +SecretsManagerArn,secrets_manager_arn +SecretsManagerOracleAsmAccessRoleArn,secrets_manager_oracle_asm_access_role_arn +SecretsManagerOracleAsmSecretId,secrets_manager_oracle_asm_secret_id +SecretsManagerSecretConfiguration,secrets_manager_secret_configuration +SecretsManagerSecretId,secrets_manager_secret_id +SecretsManagerSecretResourceData,secrets_manager_secret_resource_data +SecretsManagerSecurityDbEncryptionAccessRoleArn,secrets_manager_security_db_encryption_access_role_arn +SecretsManagerSecurityDbEncryptionSecretId,secrets_manager_security_db_encryption_secret_id +SecretsRoleArn,secrets_role_arn +Section,section +SectionAfterPageBreak,section_after_page_break +SectionBased,section_based +SectionBasedLayout,section_based_layout +SectionBasedLayoutCanvasSizeOptions,section_based_layout_canvas_size_options +SectionBasedLayoutConfiguration,section_based_layout_configuration +SectionBasedLayoutPaperCanvasSizeOptions,section_based_layout_paper_canvas_size_options +SectionId,section_id +SectionLayoutConfiguration,section_layout_configuration +SectionModification,section_modification +SectionPageBreakConfiguration,section_page_break_configuration +SectionStyle,section_style +SectionalElement,sectional_element +Sections,sections +Secure,secure +SecurityConfig,security_config +SecurityConfigDetail,security_config_detail +SecurityConfigStats,security_config_stats +SecurityConfigSummary,security_config_summary +SecurityConfiguration,security_configuration +SecurityConfigurationSummary,security_configuration_summary +SecurityConfigurations,security_configurations +SecurityContext,security_context +SecurityControl,security_control +SecurityControlArn,security_control_arn +SecurityControlDefinition,security_control_definition +SecurityControlDefinitions,security_control_definitions +SecurityControlId,security_control_id +SecurityControlIds,security_control_ids +SecurityControlStatus,security_control_status +SecurityControls,security_controls +SecurityDbEncryption,security_db_encryption +SecurityDbEncryptionName,security_db_encryption_name +SecurityDescriptorCopyFlags,security_descriptor_copy_flags +SecurityDetails,security_details +SecurityGroup,security_group +SecurityGroupArns,security_group_arns +SecurityGroupId,security_group_id +SecurityGroupIdForDomainBoundary,security_group_id_for_domain_boundary +SecurityGroupIdList,security_group_id_list +SecurityGroupIdSet,security_group_id_set +SecurityGroupIdUpdates,security_group_id_updates +SecurityGroupIdentifier,security_group_identifier +SecurityGroupIds,security_group_ids +SecurityGroupLimitExceeded,security_group_limit_exceeded +SecurityGroupMembership,security_group_membership +SecurityGroupNotFound,security_group_not_found +SecurityGroupReference,security_group_reference +SecurityGroupReferenceSet,security_group_reference_set +SecurityGroupRemediationAction,security_group_remediation_action +SecurityGroupRule,security_group_rule +SecurityGroupRuleDescription,security_group_rule_description +SecurityGroupRuleDescriptions,security_group_rule_descriptions +SecurityGroupRuleId,security_group_rule_id +SecurityGroupRuleIds,security_group_rule_ids +SecurityGroupRuleRequest,security_group_rule_request +SecurityGroupRuleUpdate,security_group_rule_update +SecurityGroupRules,security_group_rules +SecurityGroupSet,security_group_set +SecurityGroups,security_groups +SecurityHeadersConfig,security_headers_config +SecurityHubConfiguration,security_hub_configuration +SecurityKey,security_key +SecurityKeys,security_keys +SecurityNonCompliantCount,security_non_compliant_count +SecurityPolicy,security_policy +SecurityPolicyDetail,security_policy_detail +SecurityPolicyName,security_policy_name +SecurityPolicyNames,security_policy_names +SecurityPolicyStats,security_policy_stats +SecurityPolicySummary,security_policy_summary +SecurityProfile,security_profile +SecurityProfileArn,security_profile_arn +SecurityProfileId,security_profile_id +SecurityProfileIdentifier,security_profile_identifier +SecurityProfileIds,security_profile_ids +SecurityProfileName,security_profile_name +SecurityProfileSearchCriteria,security_profile_search_criteria +SecurityProfileSearchSummary,security_profile_search_summary +SecurityProfileSummary,security_profile_summary +SecurityProfileSummaryList,security_profile_summary_list +SecurityProfileTarget,security_profile_target +SecurityProfileTargetMapping,security_profile_target_mapping +SecurityProfiles,security_profiles +SecurityProfilesSearchFilter,security_profiles_search_filter +SecurityProtocol,security_protocol +SecurityServicePolicyData,security_service_policy_data +SecurityServiceType,security_service_type +SecurityStyle,security_style +SecurityToken,security_token +SecurityType,security_type +Seed,seed +SeedUrlConfiguration,seed_url_configuration +SeedUrls,seed_urls +Segment,segment +SegmentBehaviors,segment_behaviors +SegmentCondition,segment_condition +SegmentControl,segment_control +SegmentDeliveryConfiguration,segment_delivery_configuration +SegmentDeliveryConfigurations,segment_delivery_configurations +SegmentDemographics,segment_demographics +SegmentDetection,segment_detection +SegmentDimensions,segment_dimensions +SegmentDuration,segment_duration +SegmentDurationSeconds,segment_duration_seconds +SegmentGroup,segment_group +SegmentGroupList,segment_group_list +SegmentGroups,segment_groups +SegmentId,segment_id +SegmentImportResource,segment_import_resource +SegmentLength,segment_length +SegmentLengthControl,segment_length_control +SegmentLocation,segment_location +SegmentModifier,segment_modifier +SegmentName,segment_name +SegmentNum,segment_num +SegmentNumber,segment_number +SegmentOverride,segment_override +SegmentPrefix,segment_prefix +SegmentReference,segment_reference +SegmentResponse,segment_response +SegmentStartCondition,segment_start_condition +SegmentTemplateFormat,segment_template_format +SegmentType,segment_type +SegmentTypeInfo,segment_type_info +SegmentTypes,segment_types +SegmentVersion,segment_version +SegmentationCancelIndicator,segmentation_cancel_indicator +SegmentationDescriptor,segmentation_descriptor +SegmentationDescriptorScte35DescriptorSettings,segmentation_descriptor_scte35_descriptor_settings +SegmentationDescriptors,segmentation_descriptors +SegmentationDuration,segmentation_duration +SegmentationEventId,segmentation_event_id +SegmentationMarkers,segmentation_markers +SegmentationMode,segmentation_mode +SegmentationStyle,segmentation_style +SegmentationTime,segmentation_time +SegmentationTypeId,segmentation_type_id +SegmentationUpid,segmentation_upid +SegmentationUpidType,segmentation_upid_type +Segments,segments +SegmentsExpected,segments_expected +SegmentsPerSubdirectory,segments_per_subdirectory +SegmentsReceivedCount,segments_received_count +SegmentsRejectedCount,segments_rejected_count +SegmentsResponse,segments_response +SegmentsSentCount,segments_sent_count +SegmentsSpilloverCount,segments_spillover_count +Select,select +SelectAggregateResourceConfigRequest,select_aggregate_resource_config_request +SelectAggregateResourceConfigResponse,select_aggregate_resource_config_response +SelectAllOptions,select_all_options +SelectAllValueOptions,select_all_value_options +SelectAttributesActivity,select_attributes_activity +SelectColumn,select_column +SelectFields,select_fields +SelectFromCollection,select_from_collection +SelectObjectContentOutput,select_object_content_output +SelectObjectContentRequest,select_object_content_request +SelectParameters,select_parameters +SelectResourceConfigRequest,select_resource_config_request +SelectResourceConfigResponse,select_resource_config_response +SelectSqlQuery,select_sql_query +SelectableValues,selectable_values +SelectedBinType,selected_bin_type +SelectedBorderStyle,selected_border_style +SelectedChoiceIds,selected_choice_ids +SelectedChoices,selected_choices +SelectedColumns,selected_columns +SelectedEngineVersion,selected_engine_version +SelectedFieldOptions,selected_field_options +SelectedFields,selected_fields +SelectedFieldsConfiguration,selected_fields_configuration +SelectedOutputs,selected_outputs +SelectedPointStyle,selected_point_style +SelectedSegmentTypes,selected_segment_types +SelectedSheets,selected_sheets +SelectedSheetsFilterScopeConfiguration,selected_sheets_filter_scope_configuration +SelectedStep,selected_step +SelectedSteps,selected_steps +SelectedTooltipType,selected_tooltip_type +SelectedVideoStreams,selected_video_streams +SelectionCriteria,selection_criteria +SelectionId,selection_id +SelectionName,selection_name +SelectionRules,selection_rules +SelectionScope,selection_scope +SelectionStatus,selection_status +SelectiveAuth,selective_auth +SelectiveExecutionConfig,selective_execution_config +SelectiveExecutionResult,selective_execution_result +Selector,selector +SelectorSettings,selector_settings +SelectorType,selector_type +Selectors,selectors +SelfManageResources,self_manage_resources +SelfManagedActiveDirectoryAttributes,self_managed_active_directory_attributes +SelfManagedActiveDirectoryConfiguration,self_managed_active_directory_configuration +SelfManagedActiveDirectoryConfigurationUpdates,self_managed_active_directory_configuration_updates +SelfManagedEventSource,self_managed_event_source +SelfManagedKafkaAccessConfigurationVpc,self_managed_kafka_access_configuration_vpc +SelfManagedKafkaEventSourceConfig,self_managed_kafka_event_source_config +SelfManagedKafkaParameters,self_managed_kafka_parameters +SelfManagedOptOutsEnabled,self_managed_opt_outs_enabled +SelfServicePortal,self_service_portal +SelfServicePortalUrl,self_service_portal_url +SelfServiceSAMLProviderArn,self_service_saml_provider_arn +SelfServiceSamlProviderArn,self_service_saml_provider_arn +SelfUserProfile,self_user_profile +SelfservicePermissions,selfservice_permissions +SellerName,seller_name +SemanticEntityType,semantic_entity_type +SemanticType,semantic_type +SemanticVersion,semantic_version +SemtechGnss,semtech_gnss +SemtechGnssConfiguration,semtech_gnss_configuration +SemtechGnssDetail,semtech_gnss_detail +SendActivationCodeRequest,send_activation_code_request +SendAlexaOfferToMasterRequest,send_alexa_offer_to_master_request +SendAlexaOfferToMasterResponse,send_alexa_offer_to_master_response +SendAnnouncementRequest,send_announcement_request +SendAnnouncementResponse,send_announcement_response +SendApiAssetRequest,send_api_asset_request +SendApiAssetResponse,send_api_asset_response +SendAutomationSignalRequest,send_automation_signal_request +SendBonusRequest,send_bonus_request +SendBounceRequest,send_bounce_request +SendBounceResponse,send_bounce_response +SendBulkEmailRequest,send_bulk_email_request +SendBulkEmailResponse,send_bulk_email_response +SendBulkTemplatedEmailRequest,send_bulk_templated_email_request +SendBulkTemplatedEmailResponse,send_bulk_templated_email_response +SendChannelMessageRequest,send_channel_message_request +SendChannelMessageResponse,send_channel_message_response +SendCommandRequest,send_command_request +SendCommandResult,send_command_result +SendContactMethodVerificationRequest,send_contact_method_verification_request +SendContactMethodVerificationResult,send_contact_method_verification_result +SendCustomVerificationEmailRequest,send_custom_verification_email_request +SendCustomVerificationEmailResponse,send_custom_verification_email_response +SendDataPoint,send_data_point +SendDataPoints,send_data_points +SendDataToMulticastGroupRequest,send_data_to_multicast_group_request +SendDataToMulticastGroupResponse,send_data_to_multicast_group_response +SendDataToWirelessDeviceRequest,send_data_to_wireless_device_request +SendDataToWirelessDeviceResponse,send_data_to_wireless_device_response +SendDelayMs,send_delay_ms +SendDiagnosticInterruptRequest,send_diagnostic_interrupt_request +SendEmail,send_email +SendEmailNotification,send_email_notification +SendEmailRequest,send_email_request +SendEmailResponse,send_email_response +SendEventRequest,send_event_request +SendEventResponse,send_event_response +SendFilePaths,send_file_paths +SendHeartbeatRequest,send_heartbeat_request +SendInvitationRequest,send_invitation_request +SendMessageBatchRequest,send_message_batch_request +SendMessageBatchRequestEntry,send_message_batch_request_entry +SendMessageBatchResult,send_message_batch_result +SendMessageBatchResultEntry,send_message_batch_result_entry +SendMessageRequest,send_message_request +SendMessageResponse,send_message_response +SendMessageResult,send_message_result +SendMessagesRequest,send_messages_request +SendMessagesResponse,send_messages_response +SendNotification,send_notification +SendNotificationAction,send_notification_action +SendNotificationActionDefinition,send_notification_action_definition +SendOTPMessageRequest,send_otp_message_request +SendOTPMessageRequestParameters,send_otp_message_request_parameters +SendOTPMessageResponse,send_otp_message_response +SendPipelineExecutionStepFailureRequest,send_pipeline_execution_step_failure_request +SendPipelineExecutionStepFailureResponse,send_pipeline_execution_step_failure_response +SendPipelineExecutionStepSuccessRequest,send_pipeline_execution_step_success_request +SendPipelineExecutionStepSuccessResponse,send_pipeline_execution_step_success_response +SendProjectSessionActionRequest,send_project_session_action_request +SendProjectSessionActionResponse,send_project_session_action_response +SendQuota,send_quota +SendRawEmailRequest,send_raw_email_request +SendRawEmailResponse,send_raw_email_response +SendSSHPublicKeyRequest,send_ssh_public_key_request +SendSSHPublicKeyResponse,send_ssh_public_key_response +SendSerialConsoleSSHPublicKeyRequest,send_serial_console_ssh_public_key_request +SendSerialConsoleSSHPublicKeyResponse,send_serial_console_ssh_public_key_response +SendTaskFailureInput,send_task_failure_input +SendTaskHeartbeatInput,send_task_heartbeat_input +SendTaskSuccessInput,send_task_success_input +SendTemplatedEmailRequest,send_templated_email_request +SendTemplatedEmailResponse,send_templated_email_response +SendTestEventNotificationRequest,send_test_event_notification_request +SendTextMessageRequest,send_text_message_request +SendTextMessageResult,send_text_message_result +SendUsersMessageRequest,send_users_message_request +SendUsersMessageResponse,send_users_message_response +SendUsersMessagesRequest,send_users_messages_request +SendUsersMessagesResponse,send_users_messages_response +SendVoiceMessageRequest,send_voice_message_request +SendVoiceMessageResponse,send_voice_message_response +SendVoiceMessageResult,send_voice_message_result +SendWorkflowStepStateRequest,send_workflow_step_state_request +Sender,sender +SenderClientId,sender_client_id +SenderControlPort,sender_control_port +SenderFault,sender_fault +SenderId,sender_id +SenderIdAndCountry,sender_id_and_country +SenderIdArn,sender_id_arn +SenderIdFilter,sender_id_filter +SenderIdInformation,sender_id_information +SenderIds,sender_ids +SenderIpAddress,sender_ip_address +SendingEnabled,sending_enabled +SendingIps,sending_ips +SendingOptions,sending_options +SendingPausedException,sending_paused_exception +SendingPoolName,sending_pool_name +SendingSchedule,sending_schedule +Sensitive,sensitive +SensitiveData,sensitive_data +SensitiveDataDetections,sensitive_data_detections +SensitiveDataItem,sensitive_data_item +SensitiveDataResult,sensitive_data_result +SensitivityAggregations,sensitivity_aggregations +SensitivityInspectionTemplateExcludes,sensitivity_inspection_template_excludes +SensitivityInspectionTemplateIncludes,sensitivity_inspection_template_includes +SensitivityInspectionTemplatesEntry,sensitivity_inspection_templates_entry +SensitivityLevel,sensitivity_level +SensitivityThreshold,sensitivity_threshold +Sensor,sensor +SensorName,sensor_name +SensorStatisticsSummaries,sensor_statistics_summaries +SensorStatisticsSummary,sensor_statistics_summary +SensorsWithShortDateRange,sensors_with_short_date_range +SentLast24Hours,sent_last24_hours +SentTime,sent_time +Sentiment,sentiment +SentimentAnalysisSettings,sentiment_analysis_settings +SentimentConfiguration,sentiment_configuration +SentimentDetectionJobFilter,sentiment_detection_job_filter +SentimentDetectionJobProperties,sentiment_detection_job_properties +SentimentDetectionJobPropertiesList,sentiment_detection_job_properties_list +SentimentFilter,sentiment_filter +SentimentResponse,sentiment_response +SentimentScore,sentiment_score +SentimentType,sentiment_type +Sentiments,sentiments +Separator,separator +SeparatorConfiguration,separator_configuration +Seq,seq +Sequence,sequence +SequenceInformation,sequence_information +SequenceNumber,sequence_number +SequenceNumberForOrdering,sequence_number_for_ordering +SequenceNumberRange,sequence_number_range +SequenceStoreDetail,sequence_store_detail +SequenceStoreFilter,sequence_store_filter +SerDeInfo,ser_de_info +Serde,serde +SerdeInfo,serde_info +Serial,serial +SerialConsoleAccessDisabledException,serial_console_access_disabled_exception +SerialConsoleAccessEnabled,serial_console_access_enabled +SerialConsoleSessionLimitExceededException,serial_console_session_limit_exceeded_exception +SerialConsoleSessionUnavailableException,serial_console_session_unavailable_exception +SerialNumber,serial_number +SerialPort,serial_port +SerializationLibrary,serialization_library +Serializer,serializer +Series,series +SeriesItem,series_item +ServeSignature,serve_signature +Server,server +ServerArn,server_arn +ServerCannotBeReplicatedException,server_cannot_be_replicated_exception +ServerCertLastUpdated,server_cert_last_updated +ServerCertUri,server_cert_uri +ServerCertificate,server_certificate +ServerCertificateArn,server_certificate_arn +ServerCertificateConfiguration,server_certificate_configuration +ServerCertificateConfigurations,server_certificate_configurations +ServerCertificateId,server_certificate_id +ServerCertificateMetadata,server_certificate_metadata +ServerCertificateMetadataList,server_certificate_metadata_list +ServerCertificateName,server_certificate_name +ServerCertificateScope,server_certificate_scope +ServerCertificateSummary,server_certificate_summary +ServerCertificates,server_certificates +ServerConfiguration,server_configuration +ServerDetail,server_detail +ServerEndpoint,server_endpoint +ServerError,server_error +ServerEvent,server_event +ServerEvents,server_events +ServerException,server_exception +ServerGroup,server_group +ServerGroupLaunchConfiguration,server_group_launch_configuration +ServerGroupReplicationConfiguration,server_group_replication_configuration +ServerGroupValidationConfiguration,server_group_validation_configuration +ServerHostname,server_hostname +ServerId,server_id +ServerInternalErrorException,server_internal_error_exception +ServerInternalException,server_internal_exception +ServerLaunchConfiguration,server_launch_configuration +ServerLaunchParameters,server_launch_parameters +ServerLaunchPath,server_launch_path +ServerName,server_name +ServerNameToVerify,server_name_to_verify +ServerOsType,server_os_type +ServerPath,server_path +ServerPort,server_port +ServerProcess,server_process +ServerProcesses,server_processes +ServerProperties,server_properties +ServerProtocol,server_protocol +ServerPublicKey,server_public_key +ServerReplicationConfiguration,server_replication_configuration +ServerReplicationParameters,server_replication_parameters +ServerRootCaCertificate,server_root_ca_certificate +ServerSdkVersion,server_sdk_version +ServerShortInfoResponse,server_short_info_response +ServerShutdownException,server_shutdown_exception +ServerSideEncryption,server_side_encryption +ServerSideEncryptionByDefault,server_side_encryption_by_default +ServerSideEncryptionConfiguration,server_side_encryption_configuration +ServerSideEncryptionKmsKeyId,server_side_encryption_kms_key_id +ServerSideEncryptionRule,server_side_encryption_rule +ServerSideEncryptionUpdateDetails,server_side_encryption_update_details +ServerSideKmsKeyId,server_side_kms_key_id +ServerSideTokenCheck,server_side_token_check +ServerStatusSummary,server_status_summary +ServerStrategy,server_strategy +ServerSummary,server_summary +ServerTimestamp,server_timestamp +ServerTimezone,server_timezone +ServerTimingHeadersConfig,server_timing_headers_config +ServerTrust,server_trust +ServerTunnelAddress,server_tunnel_address +ServerUrl,server_url +ServerValidation,server_validation +ServerValidationConfiguration,server_validation_configuration +ServerValidationOutput,server_validation_output +Serverless,serverless +ServerlessClientAuthentication,serverless_client_authentication +ServerlessConfig,serverless_config +ServerlessRequest,serverless_request +ServerlessSasl,serverless_sasl +ServerlessUpdateConfig,serverless_update_config +ServerlessV2ScalingConfiguration,serverless_v2_scaling_configuration +ServerlessV2ScalingConfigurationInfo,serverless_v2_scaling_configuration_info +Servers,servers +Service,service +ServiceAccessRoleArn,service_access_role_arn +ServiceAccessSecurityGroup,service_access_security_group +ServiceAccountCredentials,service_account_credentials +ServiceAccountException,service_account_exception +ServiceAccountPassword,service_account_password +ServiceAccountUsername,service_account_username +ServiceActionAssociation,service_action_association +ServiceActionAssociations,service_action_associations +ServiceActionDetail,service_action_detail +ServiceActionId,service_action_id +ServiceActionParameters,service_action_parameters +ServiceActionSummaries,service_action_summaries +ServiceActionSummary,service_action_summary +ServiceAdditionalInfo,service_additional_info +ServiceAlreadyExists,service_already_exists +ServiceArn,service_arn +ServiceArnList,service_arn_list +ServiceCatalogConfiguration,service_catalog_configuration +ServiceCatalogProvisionedProductDetails,service_catalog_provisioned_product_details +ServiceCatalogProvisioningDetails,service_catalog_provisioning_details +ServiceCatalogProvisioningUpdateDetails,service_catalog_provisioning_update_details +ServiceChange,service_change +ServiceCode,service_code +ServiceCollection,service_collection +ServiceConfiguration,service_configuration +ServiceConfigurations,service_configurations +ServiceConnectClientAlias,service_connect_client_alias +ServiceConnectConfiguration,service_connect_configuration +ServiceConnectService,service_connect_service +ServiceConnectServiceResource,service_connect_service_resource +ServiceCount,service_count +ServiceDescriptor,service_descriptor +ServiceDetail,service_detail +ServiceDetails,service_details +ServiceEndpoint,service_endpoint +ServiceError,service_error +ServiceErrorId,service_error_id +ServiceErrorIds,service_error_ids +ServiceErrors,service_errors +ServiceEvent,service_event +ServiceException,service_exception +ServiceExecutionRole,service_execution_role +ServiceExecutionRoleUpdate,service_execution_role_update +ServiceFailureException,service_failure_exception +ServiceFault,service_fault +ServiceFilter,service_filter +ServiceForecastStatistics,service_forecast_statistics +ServiceGraphEndTime,service_graph_end_time +ServiceGraphStartTime,service_graph_start_time +ServiceHealth,service_health +ServiceId,service_id +ServiceIdentifier,service_identifier +ServiceIds,service_ids +ServiceInfo,service_info +ServiceInsightHealth,service_insight_health +ServiceInstance,service_instance +ServiceInstanceState,service_instance_state +ServiceInstanceSummary,service_instance_summary +ServiceIntegration,service_integration +ServiceIntegrationConfig,service_integration_config +ServiceInternalErrorException,service_internal_error_exception +ServiceInternalException,service_internal_exception +ServiceJson,service_json +ServiceLastAccessed,service_last_accessed +ServiceLimit,service_limit +ServiceLimitExceeded,service_limit_exceeded +ServiceLimitExceededException,service_limit_exceeded_exception +ServiceLinkedRoleARN,service_linked_role_arn +ServiceLinkedRoleFailure,service_linked_role_failure +ServiceLinkedRoleLockClientException,service_linked_role_lock_client_exception +ServiceLinkedRoleNotFoundFault,service_linked_role_not_found_fault +ServiceLocation,service_location +ServiceMetadata,service_metadata +ServiceName,service_name +ServiceNameAndResourceType,service_name_and_resource_type +ServiceNames,service_names +ServiceNamespace,service_namespace +ServiceNamespaces,service_namespaces +ServiceNetworkServiceAssociationSummary,service_network_service_association_summary +ServiceNetworkSummary,service_network_summary +ServiceNetworkVpcAssociationSummary,service_network_vpc_association_summary +ServiceNotActiveException,service_not_active_exception +ServiceNotFound,service_not_found +ServiceNotFoundException,service_not_found_exception +ServiceNotSupportedException,service_not_supported_exception +ServiceNow,service_now +ServiceNowBuildVersion,service_now_build_version +ServiceNowConfiguration,service_now_configuration +ServiceNowConnectorProfileCredentials,service_now_connector_profile_credentials +ServiceNowConnectorProfileProperties,service_now_connector_profile_properties +ServiceNowKnowledgeArticleConfiguration,service_now_knowledge_article_configuration +ServiceNowParameters,service_now_parameters +ServiceNowServiceCatalogConfiguration,service_now_service_catalog_configuration +ServiceNowSourceProperties,service_now_source_properties +ServiceObservabilityConfiguration,service_observability_configuration +ServicePack,service_pack +ServicePassword,service_password +ServicePermissionId,service_permission_id +ServicePipeline,service_pipeline +ServicePipelineState,service_pipeline_state +ServicePrincipal,service_principal +ServicePrincipalName,service_principal_name +ServicePrincipalNameSummary,service_principal_name_summary +ServicePrincipalNames,service_principal_names +ServiceProcessingTimeInMillis,service_processing_time_in_millis +ServiceProfile,service_profile +ServiceProfileId,service_profile_id +ServiceProfileList,service_profile_list +ServiceProviderName,service_provider_name +ServiceProviderSamlMetadata,service_provider_saml_metadata +ServiceQuota,service_quota +ServiceQuotaExceededException,service_quota_exceeded_exception +ServiceQuotaIncreaseRequestInTemplate,service_quota_increase_request_in_template +ServiceQuotaIncreaseRequestInTemplateList,service_quota_increase_request_in_template_list +ServiceQuotaTemplateAssociationStatus,service_quota_template_association_status +ServiceQuotaTemplateNotInUseException,service_quota_template_not_in_use_exception +ServiceRegistries,service_registries +ServiceRegistry,service_registry +ServiceResourceCost,service_resource_cost +ServiceRole,service_role +ServiceRoleArn,service_role_arn +ServiceSetting,service_setting +ServiceSettingNotFound,service_setting_not_found +ServiceSize,service_size +ServiceSoftwareOptions,service_software_options +ServiceSpecificCredential,service_specific_credential +ServiceSpecificCredentialId,service_specific_credential_id +ServiceSpecificCredentialMetadata,service_specific_credential_metadata +ServiceSpecificCredentials,service_specific_credentials +ServiceSpecification,service_specification +ServiceState,service_state +ServiceStatistics,service_statistics +ServiceSummary,service_summary +ServiceSummaryList,service_summary_list +ServiceSummaryStatistics,service_summary_statistics +ServiceSyncBlockerSummary,service_sync_blocker_summary +ServiceSyncConfig,service_sync_config +ServiceTemplate,service_template +ServiceTemplateSummary,service_template_summary +ServiceTemplateVersion,service_template_version +ServiceTemplateVersionSummary,service_template_version_summary +ServiceTemporarilyUnavailableException,service_temporarily_unavailable_exception +ServiceType,service_type +ServiceTypeDetail,service_type_detail +ServiceUnavailable,service_unavailable +ServiceUnavailableError,service_unavailable_error +ServiceUnavailableException,service_unavailable_exception +ServiceUpdate,service_update +ServiceUpdateDescription,service_update_description +ServiceUpdateEndDate,service_update_end_date +ServiceUpdateName,service_update_name +ServiceUpdateNameToApply,service_update_name_to_apply +ServiceUpdateNotFoundFault,service_update_not_found_fault +ServiceUpdateRecommendedApplyByDate,service_update_recommended_apply_by_date +ServiceUpdateReleaseDate,service_update_release_date +ServiceUpdateRequest,service_update_request +ServiceUpdateSeverity,service_update_severity +ServiceUpdateStatus,service_update_status +ServiceUpdateTimeRange,service_update_time_range +ServiceUpdateType,service_update_type +ServiceUpdates,service_updates +ServiceUpdatesMessage,service_updates_message +ServiceUrl,service_url +ServiceUserName,service_user_name +ServiceVersion,service_version +ServiceVersions,service_versions +Services,services +ServicesLastAccessed,services_last_accessed +Session,session +SessionAlreadyExistsException,session_already_exists_exception +SessionArn,session_arn +SessionCap,session_cap +SessionCommand,session_command +SessionConfiguration,session_configuration +SessionContext,session_context +SessionContextAttributes,session_context_attributes +SessionCookieName,session_cookie_name +SessionData,session_data +SessionDataSortBy,session_data_sort_by +SessionDuration,session_duration +SessionExpirationDurationInSeconds,session_expiration_duration_in_seconds +SessionExpiredException,session_expired_exception +SessionFilter,session_filter +SessionId,session_id +SessionIdleTimeoutInMinutes,session_idle_timeout_in_minutes +SessionInitializationEndpointPrefix,session_initialization_endpoint_prefix +SessionIntegrationConfiguration,session_integration_configuration +SessionIssuer,session_issuer +SessionKeyAmex,session_key_amex +SessionKeyDerivationAttributes,session_key_derivation_attributes +SessionKeyDerivationMode,session_key_derivation_mode +SessionKeyDerivationValue,session_key_derivation_value +SessionKeyEmv2000,session_key_emv2000 +SessionKeyEmvCommon,session_key_emv_common +SessionKeyMastercard,session_key_mastercard +SessionKeyVisa,session_key_visa +SessionKeys,session_keys +SessionKeysAbpV1_0_x,session_keys_abp_v1_0_x +SessionKeysAbpV1_1,session_keys_abp_v1_1 +SessionLifetimeInMinutes,session_lifetime_in_minutes +SessionLifetimeInMinutesInvalidException,session_lifetime_in_minutes_invalid_exception +SessionManagerOutputUrl,session_manager_output_url +SessionMapping,session_mapping +SessionMappingDetail,session_mapping_detail +SessionMappingSummary,session_mapping_summary +SessionMappings,session_mappings +SessionName,session_name +SessionNameOrId,session_name_or_id +SessionNotFoundException,session_not_found_exception +SessionNumber,session_number +SessionPinningFilters,session_pinning_filters +SessionPolicyArn,session_policy_arn +SessionSampleRate,session_sample_rate +SessionScriptS3Location,session_script_s3_location +SessionSpecification,session_specification +SessionStartTime,session_start_time +SessionState,session_state +SessionStatistics,session_statistics +SessionStatus,session_status +SessionStickinessConfig,session_stickiness_config +SessionSummary,session_summary +SessionTag,session_tag +SessionTags,session_tags +SessionTimeout,session_timeout +SessionTimeoutHours,session_timeout_hours +SessionTimeoutMinutes,session_timeout_minutes +SessionToken,session_token +Sessions,sessions +Set,set +SetActiveReceiptRuleSetRequest,set_active_receipt_rule_set_request +SetAlarmStateInput,set_alarm_state_input +SetAsDefault,set_as_default +SetCognitoEventsRequest,set_cognito_events_request +SetDataCaptureChanges,set_data_capture_changes +SetDataRetrievalPolicyInput,set_data_retrieval_policy_input +SetDefaultAuthorizerRequest,set_default_authorizer_request +SetDefaultAuthorizerResponse,set_default_authorizer_response +SetDefaultMessageTypeRequest,set_default_message_type_request +SetDefaultMessageTypeResult,set_default_message_type_result +SetDefaultPermissionVersionRequest,set_default_permission_version_request +SetDefaultPermissionVersionResponse,set_default_permission_version_response +SetDefaultPolicyVersionRequest,set_default_policy_version_request +SetDefaultSenderIdRequest,set_default_sender_id_request +SetDefaultSenderIdResult,set_default_sender_id_result +SetDesiredCapacityType,set_desired_capacity_type +SetDimension,set_dimension +SetEndpointAttributesInput,set_endpoint_attributes_input +SetFileModeEntry,set_file_mode_entry +SetGatewayBridgeSourceRequest,set_gateway_bridge_source_request +SetId,set_id +SetIdentifier,set_identifier +SetIdentityDkimEnabledRequest,set_identity_dkim_enabled_request +SetIdentityFeedbackForwardingEnabledRequest,set_identity_feedback_forwarding_enabled_request +SetIdentityHeadersInNotificationsEnabledRequest,set_identity_headers_in_notifications_enabled_request +SetIdentityMailFromDomainRequest,set_identity_mail_from_domain_request +SetIdentityNotificationTopicRequest,set_identity_notification_topic_request +SetIdentityPoolConfigurationRequest,set_identity_pool_configuration_request +SetIdentityPoolConfigurationResponse,set_identity_pool_configuration_response +SetIdentityPoolRolesInput,set_identity_pool_roles_input +SetInstanceHealthQuery,set_instance_health_query +SetInstanceProtectionQuery,set_instance_protection_query +SetIpAddressTypeInput,set_ip_address_type_input +SetIpAddressTypeOutput,set_ip_address_type_output +SetIpAddressTypeRequest,set_ip_address_type_request +SetIpAddressTypeResult,set_ip_address_type_result +SetLoadBalancerListenerSSLCertificateInput,set_load_balancer_listener_ssl_certificate_input +SetLoadBalancerPoliciesForBackendServerInput,set_load_balancer_policies_for_backend_server_input +SetLoadBalancerPoliciesOfListenerInput,set_load_balancer_policies_of_listener_input +SetLoadBasedAutoScalingRequest,set_load_based_auto_scaling_request +SetLocalConsolePasswordInput,set_local_console_password_input +SetLocalConsolePasswordOutput,set_local_console_password_output +SetLogDeliveryConfigurationRequest,set_log_delivery_configuration_request +SetLogDeliveryConfigurationResponse,set_log_delivery_configuration_response +SetLoggingOptionsRequest,set_logging_options_request +SetName,set_name +SetParameterValueConfiguration,set_parameter_value_configuration +SetParametersOperation,set_parameters_operation +SetPermissionRequest,set_permission_request +SetPlatformApplicationAttributesInput,set_platform_application_attributes_input +SetPrincipalTagAttributeMapInput,set_principal_tag_attribute_map_input +SetPrincipalTagAttributeMapResponse,set_principal_tag_attribute_map_response +SetQueueAttributesRequest,set_queue_attributes_request +SetReceiptRulePositionRequest,set_receipt_rule_position_request +SetRepositoryPolicyRequest,set_repository_policy_request +SetRepositoryPolicyResponse,set_repository_policy_response +SetResourceAccessForBucketRequest,set_resource_access_for_bucket_request +SetResourceAccessForBucketResult,set_resource_access_for_bucket_result +SetRiskConfigurationRequest,set_risk_configuration_request +SetRiskConfigurationResponse,set_risk_configuration_response +SetRulePrioritiesInput,set_rule_priorities_input +SetRulePrioritiesOutput,set_rule_priorities_output +SetSMBGuestPasswordInput,set_smb_guest_password_input +SetSMBGuestPasswordOutput,set_smb_guest_password_output +SetSMSAttributesInput,set_sms_attributes_input +SetSecurityGroupsInput,set_security_groups_input +SetSecurityGroupsOutput,set_security_groups_output +SetSecurityTokenServicePreferencesRequest,set_security_token_service_preferences_request +SetSourceRequest,set_source_request +SetStackPolicyInput,set_stack_policy_input +SetStatOption,set_stat_option +SetStatusInput,set_status_input +SetSubnetsInput,set_subnets_input +SetSubnetsOutput,set_subnets_output +SetSubscriptionAttributesInput,set_subscription_attributes_input +SetTagsForResourceRequest,set_tags_for_resource_request +SetTaskStatusInput,set_task_status_input +SetTerminationProtectionInput,set_termination_protection_input +SetTextMessageSpendLimitOverrideRequest,set_text_message_spend_limit_override_request +SetTextMessageSpendLimitOverrideResult,set_text_message_spend_limit_override_result +SetTimeBasedAutoScalingRequest,set_time_based_auto_scaling_request +SetTimerAction,set_timer_action +SetTopicAttributesInput,set_topic_attributes_input +SetTypeConfigurationInput,set_type_configuration_input +SetTypeConfigurationOutput,set_type_configuration_output +SetTypeDefaultVersionInput,set_type_default_version_input +SetUICustomizationRequest,set_ui_customization_request +SetUICustomizationResponse,set_ui_customization_response +SetUserMFAPreferenceRequest,set_user_mfa_preference_request +SetUserPoolMfaConfigRequest,set_user_pool_mfa_config_request +SetUserPoolMfaConfigResponse,set_user_pool_mfa_config_response +SetUserSettingsRequest,set_user_settings_request +SetV2LoggingLevelRequest,set_v2_logging_level_request +SetV2LoggingOptionsRequest,set_v2_logging_options_request +SetVariableAction,set_variable_action +SetVaultAccessPolicyInput,set_vault_access_policy_input +SetVaultNotificationsInput,set_vault_notifications_input +SetVisibleToAllUsersInput,set_visible_to_all_users_input +SetVoiceMessageSpendLimitOverrideRequest,set_voice_message_spend_limit_override_request +SetVoiceMessageSpendLimitOverrideResult,set_voice_message_spend_limit_override_result +Setting,setting +SettingDescription,setting_description +SettingEntries,setting_entries +SettingEntry,setting_entry +SettingId,setting_id +SettingName,setting_name +SettingValue,setting_value +Settings,settings +SettingsForUpdate,settings_for_update +SettingsGroup,settings_group +Setup,setup +SetupFailed,setup_failed +SetupModeDisabled,setup_mode_disabled +SetupScriptDetails,setup_script_details +Severe,severe +Severities,severities +Severity,severity +SeverityCounts,severity_counts +SeverityLabel,severity_label +SeverityLevel,severity_level +SeverityNormalized,severity_normalized +SeverityProduct,severity_product +SeverityRating,severity_rating +SeveritySummary,severity_summary +SeverityUpdate,severity_update +SftpAuthenticationMethods,sftp_authentication_methods +SftpConfig,sftp_config +SftpConnectorConfig,sftp_connector_config +Sha1,sha1 +ShadowColor,shadow_color +ShadowModeConfig,shadow_mode_config +ShadowModelVariantConfig,shadow_model_variant_config +ShadowModelVariantName,shadow_model_variant_name +ShadowModelVariants,shadow_model_variants +ShadowOpacity,shadow_opacity +ShadowProductionVariants,shadow_production_variants +ShadowXOffset,shadow_x_offset +ShadowYOffset,shadow_y_offset +ShapBaseline,shap_baseline +ShapBaselineConfig,shap_baseline_config +ShapBaselineUri,shap_baseline_uri +ShapConfig,shap_config +Shape,shape +ShapeConditionalFormat,shape_conditional_format +Shard,shard +ShardConfiguration,shard_configuration +ShardConfigurationRequest,shard_configuration_request +ShardCount,shard_count +ShardDetail,shard_detail +ShardFilter,shard_filter +ShardId,shard_id +ShardIterator,shard_iterator +ShardIteratorType,shard_iterator_type +ShardLevelMetrics,shard_level_metrics +ShardLimit,shard_limit +ShardName,shard_name +ShardNotFoundFault,shard_not_found_fault +ShardToMerge,shard_to_merge +ShardToSplit,shard_to_split +Shards,shards +ShardsPerClusterQuotaExceededFault,shards_per_cluster_quota_exceeded_fault +ShareAttributes,share_attributes +ShareDetails,share_details +ShareDirectoryRequest,share_directory_request +ShareDirectoryResult,share_directory_result +ShareError,share_error +ShareErrors,share_errors +ShareId,share_id +ShareInvitation,share_invitation +ShareInvitationAction,share_invitation_action +ShareInvitationId,share_invitation_id +ShareInvitationSummaries,share_invitation_summaries +ShareInvitationSummary,share_invitation_summary +ShareLimitExceededException,share_limit_exceeded_exception +ShareMethod,share_method +ShareNotes,share_notes +SharePointConfiguration,share_point_configuration +SharePointVersion,share_point_version +SharePrincipal,share_principal +SharePrincipals,share_principals +ShareResourceType,share_resource_type +ShareResult,share_result +ShareResults,share_results +ShareRule,share_rule +ShareRules,share_rules +ShareStatus,share_status +ShareTagOptions,share_tag_options +ShareTarget,share_target +SharedAccountId,shared_account_id +SharedAwsAccountIds,shared_aws_account_ids +SharedBy,shared_by +SharedDirectories,shared_directories +SharedDirectory,shared_directory +SharedDirectoryId,shared_directory_id +SharedDirectoryIds,shared_directory_ids +SharedDocumentVersion,shared_document_version +SharedFileSystemConfiguration,shared_file_system_configuration +SharedImagePermissions,shared_image_permissions +SharedImagePermissionsList,shared_image_permissions_list +SharedMemorySize,shared_memory_size +SharedRoutesEnabled,shared_routes_enabled +SharedSecret,shared_secret +SharedSegments,shared_segments +SharedSnapshotQuotaExceededFault,shared_snapshot_quota_exceeded_fault +SharedWith,shared_with +SharedWithPrefix,shared_with_prefix +SharingModel,sharing_model +SharingSettings,sharing_settings +Sharpening,sharpening +Sharpness,sharpness +Sheet,sheet +SheetContentType,sheet_content_type +SheetControlInfoIconLabelOptions,sheet_control_info_icon_label_options +SheetControlLayout,sheet_control_layout +SheetControlLayoutConfiguration,sheet_control_layout_configuration +SheetControlLayouts,sheet_control_layouts +SheetControlsOption,sheet_controls_option +SheetDefinition,sheet_definition +SheetElementConfigurationOverrides,sheet_element_configuration_overrides +SheetElementRenderingRule,sheet_element_rendering_rule +SheetId,sheet_id +SheetIndexes,sheet_indexes +SheetLayoutElementMaximizationOption,sheet_layout_element_maximization_option +SheetNames,sheet_names +SheetSelections,sheet_selections +SheetStyle,sheet_style +SheetTextBox,sheet_text_box +SheetTextBoxId,sheet_text_box_id +SheetVisualScopingConfiguration,sheet_visual_scoping_configuration +SheetVisualScopingConfigurations,sheet_visual_scoping_configurations +Sheets,sheets +ShellHistoryFilePath,shell_history_file_path +ShellVersion,shell_version +ShiftCoverages,shift_coverages +ShiftDetails,shift_details +Shipment,shipment +ShipmentCarrier,shipment_carrier +ShipmentInformation,shipment_information +ShipmentState,shipment_state +ShipmentTrackingNumber,shipment_tracking_number +ShippingAddress,shipping_address +ShippingDetails,shipping_details +ShippingOption,shipping_option +ShortCode,short_code +ShortDescription,short_description +ShortFormatText,short_format_text +ShortName,short_name +Shortened,shortened +Shortname,shortname +ShotFilter,shot_filter +ShotSegment,shot_segment +ShouldDecrementDesiredCapacity,should_decrement_desired_capacity +ShouldRespectGracePeriod,should_respect_grace_period +Show,show +ShowAlternatives,show_alternatives +ShowAssignedLFTags,show_assigned_lf_tags +ShowCacheClustersNotInReplicationGroups,show_cache_clusters_not_in_replication_groups +ShowCacheNodeInfo,show_cache_node_info +ShowDetail,show_detail +ShowMemberInfo,show_member_info +ShowNodeGroupConfig,show_node_group_config +ShowNodeLevelUpdateStatus,show_node_level_update_status +ShowShardDetails,show_shard_details +ShowSpeakerLabel,show_speaker_label +ShowSpeakerLabels,show_speaker_labels +ShrinkPolicy,shrink_policy +ShuffleConfig,shuffle_config +Shutdown,shutdown +ShutdownEventConfiguration,shutdown_event_configuration +ShutdownGatewayInput,shutdown_gateway_input +ShutdownGatewayOutput,shutdown_gateway_output +ShuttingDown,shutting_down +Sid,sid +SideSpecificBorder,side_specific_border +Sidewalk,sidewalk +SidewalkAccountInfo,sidewalk_account_info +SidewalkAccountInfoWithFingerprint,sidewalk_account_info_with_fingerprint +SidewalkCreateWirelessDevice,sidewalk_create_wireless_device +SidewalkDevice,sidewalk_device +SidewalkDeviceMetadata,sidewalk_device_metadata +SidewalkEventNotificationConfigurations,sidewalk_event_notification_configurations +SidewalkGetDeviceProfile,sidewalk_get_device_profile +SidewalkGetStartImportInfo,sidewalk_get_start_import_info +SidewalkId,sidewalk_id +SidewalkListDevice,sidewalk_list_device +SidewalkManufacturingSn,sidewalk_manufacturing_sn +SidewalkResourceTypeEventConfiguration,sidewalk_resource_type_event_configuration +SidewalkSendDataToDevice,sidewalk_send_data_to_device +SidewalkSingleStartImportInfo,sidewalk_single_start_import_info +SidewalkStartImportInfo,sidewalk_start_import_info +SidewalkUpdateAccount,sidewalk_update_account +SidewalkUpdateImportInfo,sidewalk_update_import_info +SigKeyCrc,sig_key_crc +SigV4Authorization,sigv4_authorization +Sign,sign +SignInConfig,sign_in_config +SignInDistribution,sign_in_distribution +SignInMethod,sign_in_method +SignInUrl,sign_in_url +SignInWithApple,sign_in_with_apple +SignKey,sign_key +SignOutUserRequest,sign_out_user_request +SignPayloadRequest,sign_payload_request +SignPayloadResponse,sign_payload_response +SignRequest,sign_request +SignResponse,sign_response +SignUpRequest,sign_up_request +SignUpResponse,sign_up_response +Signal,signal +SignalApplicationInstanceNodeInstancesRequest,signal_application_instance_node_instances_request +SignalApplicationInstanceNodeInstancesResponse,signal_application_instance_node_instances_response +SignalCatalogSummary,signal_catalog_summary +SignalDecoder,signal_decoder +SignalExternalWorkflowExecutionDecisionAttributes,signal_external_workflow_execution_decision_attributes +SignalExternalWorkflowExecutionFailedEventAttributes,signal_external_workflow_execution_failed_event_attributes +SignalExternalWorkflowExecutionInitiatedEventAttributes,signal_external_workflow_execution_initiated_event_attributes +SignalInformation,signal_information +SignalProcessingNotification,signal_processing_notification +SignalResourceInput,signal_resource_input +SignalType,signal_type +SignalWorkflowExecutionInput,signal_workflow_execution_input +SignalingUrl,signaling_url +Signature,signature +SignatureAlgorithm,signature_algorithm +SignatureDetection,signature_detection +SignatureDetections,signature_detections +SignatureValid,signature_valid +SignatureValidityPeriod,signature_validity_period +Signed,signed +SignedCert,signed_cert +SignedHeaders,signed_headers +SignedObject,signed_object +SignedToken,signed_token +SignedUrl,signed_url +SignedUrlExpiresAt,signed_url_expires_at +Signer,signer +SigninDelegateGroup,signin_delegate_group +SigninDelegateGroups,signin_delegate_groups +SigningAlg,signing_alg +SigningAlgorithm,signing_algorithm +SigningAlgorithmMnemonic,signing_algorithm_mnemonic +SigningAlgorithmType,signing_algorithm_type +SigningAlgorithms,signing_algorithms +SigningAttributes,signing_attributes +SigningAttributesOrigin,signing_attributes_origin +SigningBehavior,signing_behavior +SigningCertificate,signing_certificate +SigningConfiguration,signing_configuration +SigningConfigurationOverrides,signing_configuration_overrides +SigningEnabled,signing_enabled +SigningImageFormat,signing_image_format +SigningJob,signing_job +SigningJobArn,signing_job_arn +SigningJobRevocationRecord,signing_job_revocation_record +SigningKeyAlgorithm,signing_key_algorithm +SigningKeyCertificate,signing_key_certificate +SigningKeyCertificateChain,signing_key_certificate_chain +SigningMaterial,signing_material +SigningPlatform,signing_platform +SigningPlatformOverrides,signing_platform_overrides +SigningProfile,signing_profile +SigningProfileParameter,signing_profile_parameter +SigningProfileRevocationRecord,signing_profile_revocation_record +SigningProfileVersionArn,signing_profile_version_arn +SigningProfileVersionArns,signing_profile_version_arns +SigningProtocol,signing_protocol +SignupResponse,signup_response +SilentPush,silent_push +Similarity,similarity +SimilarityThreshold,similarity_threshold +Simple,simple +SimpleAddress,simple_address +SimpleAttributeAggregation,simple_attribute_aggregation +SimpleClusterMarker,simple_cluster_marker +SimpleCondition,simple_condition +SimpleCriterionForJob,simple_criterion_for_job +SimpleEmail,simple_email +SimpleEmailPart,simple_email_part +SimpleNumericalAggregation,simple_numerical_aggregation +SimpleRule,simple_rule +SimpleRuleEvaluation,simple_rule_evaluation +SimpleScalingPolicyConfiguration,simple_scaling_policy_configuration +SimpleScopeTerm,simple_scope_term +SimpleUser,simple_user +SimplifiedApplication,simplified_application +SimplifiedColor,simplified_color +SimulateCustomPolicyRequest,simulate_custom_policy_request +SimulatePolicyResponse,simulate_policy_response +SimulatePrincipalPolicyRequest,simulate_principal_policy_request +SimulateReservedQueue,simulate_reserved_queue +Simulation,simulation +SimulationAppEndpointInfo,simulation_app_endpoint_info +SimulationAppMetadata,simulation_app_metadata +SimulationAppPortMapping,simulation_app_port_mapping +SimulationApplicationConfig,simulation_application_config +SimulationApplicationSummary,simulation_application_summary +SimulationClock,simulation_clock +SimulationJob,simulation_job +SimulationJobBatchSummary,simulation_job_batch_summary +SimulationJobRequest,simulation_job_request +SimulationJobSummary,simulation_job_summary +SimulationMetadata,simulation_metadata +SimulationSoftwareSuite,simulation_software_suite +Simulations,simulations +SinceCrawlDate,since_crawl_date +SingleAvailabilityZone,single_availability_zone +SingleHeader,single_header +SingleHeaderConfig,single_header_config +SingleInstanceHealth,single_instance_health +SingleInstanceType,single_instance_type +SingleMasterChannelEndpointConfiguration,single_master_channel_endpoint_configuration +SingleMasterConfiguration,single_master_configuration +SingleMetricAnomalyDetector,single_metric_anomaly_detector +SingleMetricVisibility,single_metric_visibility +SingleQueryArgument,single_query_argument +SingleSelectOptions,single_select_options +SingleSelectQuestionRuleCategoryAutomation,single_select_question_rule_category_automation +SingleSignOnManagedApplicationInstanceId,single_sign_on_managed_application_instance_id +SingleSignOnUserIdentifier,single_sign_on_user_identifier +SingleSignOnUserValue,single_sign_on_user_value +SingleWeightConfig,single_weight_config +Singular,singular +SingularConnectorProfileCredentials,singular_connector_profile_credentials +SingularConstant,singular_constant +SingularSourceProperties,singular_source_properties +SinkArn,sink_arn +SinkId,sink_id +SinkIdentifier,sink_identifier +SinkType,sink_type +Sinks,sinks +SipAddress,sip_address +SipAddresses,sip_addresses +SipHeaders,sip_headers +SipMediaApplication,sip_media_application +SipMediaApplicationAlexaSkillConfiguration,sip_media_application_alexa_skill_configuration +SipMediaApplicationArn,sip_media_application_arn +SipMediaApplicationCall,sip_media_application_call +SipMediaApplicationEndpoint,sip_media_application_endpoint +SipMediaApplicationId,sip_media_application_id +SipMediaApplicationLoggingConfiguration,sip_media_application_logging_configuration +SipMediaApplications,sip_media_applications +SipRule,sip_rule +SipRuleId,sip_rule_id +SipRuleTargetApplication,sip_rule_target_application +SipRules,sip_rules +Site,site +SiteArn,site_arn +SiteBaseUrl,site_base_url +SiteId,site_id +SiteIds,site_ids +SiteMaps,site_maps +SiteMapsConfiguration,site_maps_configuration +SitePlan,site_plan +SiteToSiteVpnAttachment,site_to_site_vpn_attachment +SiteUrl,site_url +Sites,sites +Size,size +SizeBytes,size_bytes +SizeClassified,size_classified +SizeConstraint,size_constraint +SizeConstraintSet,size_constraint_set +SizeConstraintSetId,size_constraint_set_id +SizeConstraintSetSummary,size_constraint_set_summary +SizeConstraintSetUpdate,size_constraint_set_update +SizeConstraintSets,size_constraint_sets +SizeConstraintStatement,size_constraint_statement +SizeConstraints,size_constraints +SizeEstimateRangeGB,size_estimate_range_gb +SizeFlexEligible,size_flex_eligible +SizeInBytes,size_in_bytes +SizeInGB,size_in_gb +SizeInMBs,size_in_mbs +SizeInMegabytes,size_in_megabytes +SizeInMiB,size_in_mib +SizeLabelOptions,size_label_options +SizeOnDisk,size_on_disk +SizePercent,size_percent +SizeRange,size_range +SizeUnit,size_unit +Sizes,sizes +SizingOptions,sizing_options +SizingPolicy,sizing_policy +SkewedColumnNames,skewed_column_names +SkewedColumnValueLocationMaps,skewed_column_value_location_maps +SkewedColumnValues,skewed_column_values +SkewedInfo,skewed_info +SkillDetails,skill_details +SkillGroup,skill_group +SkillGroupArn,skill_group_arn +SkillGroupData,skill_group_data +SkillGroupName,skill_group_name +SkillGroups,skill_groups +SkillId,skill_id +SkillName,skill_name +SkillNotLinkedException,skill_not_linked_exception +SkillSummaries,skill_summaries +SkillSummary,skill_summary +SkillType,skill_type +SkillTypes,skill_types +SkillsStoreSkill,skills_store_skill +SkillsStoreSkills,skills_store_skills +SkipArchive,skip_archive +SkipCheck,skip_check +SkipDestinationValidation,skip_destination_validation +SkipFinalBackup,skip_final_backup +SkipFinalClusterSnapshot,skip_final_cluster_snapshot +SkipFinalSnapshot,skip_final_snapshot +SkipFirst,skip_first +SkipMatching,skip_matching +SkipModelValidation,skip_model_validation +SkipTunnelReplacement,skip_tunnel_replacement +SkipUnavailable,skip_unavailable +SkipWaitTimeForInstanceTerminationInput,skip_wait_time_for_instance_termination_input +Skipped,skipped +SkippedIPRangeList,skipped_ip_range_list +SkippedRecordCount,skipped_record_count +SkippedTermCount,skipped_term_count +SkippedUsers,skipped_users +SkippedVolumeDetails,skipped_volume_details +Sku,sku +SlaMet,sla_met +Slack,slack +SlackChannelConfiguration,slack_channel_configuration +SlackConfiguration,slack_configuration +SlackConnectorProfileCredentials,slack_connector_profile_credentials +SlackConnectorProfileProperties,slack_connector_profile_properties +SlackEntityList,slack_entity_list +SlackMetadata,slack_metadata +SlackSourceProperties,slack_source_properties +SlackWorkspaceConfiguration,slack_workspace_configuration +Slate,slate +SlateAdUrl,slate_ad_url +SlateSource,slate_source +SlaveInstanceType,slave_instance_type +Slices,slices +Slider,slider +SliderControlDisplayOptions,slider_control_display_options +Slot,slot +SlotCaptureSetting,slot_capture_setting +SlotDateTimeRangeRequest,slot_date_time_range_request +SlotDefaultValue,slot_default_value +SlotDefaultValueSpec,slot_default_value_spec +SlotDefaultValueSpecification,slot_default_value_specification +SlotDurationInHours,slot_duration_in_hours +SlotFilter,slot_filter +SlotMigration,slot_migration +SlotName,slot_name +SlotNotAvailableException,slot_not_available_exception +SlotPriority,slot_priority +SlotResolutionTestResultItem,slot_resolution_test_result_item +SlotResolutionTestResultItemCounts,slot_resolution_test_result_item_counts +SlotSortBy,slot_sort_by +SlotStartTimeRange,slot_start_time_range +SlotStartTimeRangeRequest,slot_start_time_range_request +SlotSuggestions,slot_suggestions +SlotSummary,slot_summary +SlotTypeConfiguration,slot_type_configuration +SlotTypeFilter,slot_type_filter +SlotTypeMetadata,slot_type_metadata +SlotTypeRegexConfiguration,slot_type_regex_configuration +SlotTypeSortBy,slot_type_sort_by +SlotTypeStatistics,slot_type_statistics +SlotTypeSummary,slot_type_summary +SlotTypeValue,slot_type_value +SlotValue,slot_value +SlotValueElicitationSetting,slot_value_elicitation_setting +SlotValueOverride,slot_value_override +SlotValueRegexFilter,slot_value_regex_filter +SlotValueSelectionSetting,slot_value_selection_setting +Slots,slots +SlowDownException,slow_down_exception +SlowPal,slow_pal +SmallImageIconUrl,small_image_icon_url +SmallMultiples,small_multiples +SmallMultiplesAxisProperties,small_multiples_axis_properties +SmallMultiplesLimitConfiguration,small_multiples_limit_configuration +SmallMultiplesOptions,small_multiples_options +SmallMultiplesSort,small_multiples_sort +SmartHomeAppliance,smart_home_appliance +SmartHomeAppliances,smart_home_appliances +Smb,smb +SmbMountOptions,smb_mount_options +Smile,smile +SmoothStreaming,smooth_streaming +SmoothingLatency,smoothing_latency +Smpte2038DataPreference,smpte2038_data_preference +SmpteTtDestinationSettings,smpte_tt_destination_settings +SmsAuthenticationMessage,sms_authentication_message +SmsConfiguration,sms_configuration +SmsConfigurationFailure,sms_configuration_failure +SmsConfigurationType,sms_configuration_type +SmsMessage,sms_message +SmsMfaConfigType,sms_mfa_config_type +SmsMfaConfiguration,sms_mfa_configuration +SmsSettings,sms_settings +SmsVerificationMessage,sms_verification_message +SmtpReplyCode,smtp_reply_code +SnapShotTimeFilter,snap_shot_time_filter +SnapStart,snap_start +SnapStartException,snap_start_exception +SnapStartNotReadyException,snap_start_not_ready_exception +SnapStartResponse,snap_start_response +SnapStartTimeoutException,snap_start_timeout_exception +SnaplockConfiguration,snaplock_configuration +SnaplockRetentionPeriod,snaplock_retention_period +SnaplockType,snaplock_type +SnappedDeparturePositions,snapped_departure_positions +SnappedDestinationPositions,snapped_destination_positions +Snapshot,snapshot +SnapshotARN,snapshot_arn +SnapshotAlreadyExistsFault,snapshot_already_exists_fault +SnapshotAnonymousUser,snapshot_anonymous_user +SnapshotAnonymousUserRedacted,snapshot_anonymous_user_redacted +SnapshotArn,snapshot_arn +SnapshotArns,snapshot_arns +SnapshotCapacityUsed,snapshot_capacity_used +SnapshotClusterIdentifier,snapshot_cluster_identifier +SnapshotConfiguration,snapshot_configuration +SnapshotCopyAlreadyDisabledFault,snapshot_copy_already_disabled_fault +SnapshotCopyAlreadyEnabledFault,snapshot_copy_already_enabled_fault +SnapshotCopyDisabledFault,snapshot_copy_disabled_fault +SnapshotCopyGrant,snapshot_copy_grant +SnapshotCopyGrantAlreadyExistsFault,snapshot_copy_grant_already_exists_fault +SnapshotCopyGrantMessage,snapshot_copy_grant_message +SnapshotCopyGrantName,snapshot_copy_grant_name +SnapshotCopyGrantNotFoundFault,snapshot_copy_grant_not_found_fault +SnapshotCopyGrantQuotaExceededFault,snapshot_copy_grant_quota_exceeded_fault +SnapshotCopyGrants,snapshot_copy_grants +SnapshotCreateTime,snapshot_create_time +SnapshotCreationTime,snapshot_creation_time +SnapshotCreationTimestamp,snapshot_creation_timestamp +SnapshotDatabaseTime,snapshot_database_time +SnapshotDescription,snapshot_description +SnapshotDestinationConfiguration,snapshot_destination_configuration +SnapshotDetail,snapshot_detail +SnapshotDetails,snapshot_details +SnapshotDiskContainer,snapshot_disk_container +SnapshotDownloadUrl,snapshot_download_url +SnapshotErrorMessage,snapshot_error_message +SnapshotFeatureNotSupportedFault,snapshot_feature_not_supported_fault +SnapshotFile,snapshot_file +SnapshotFileGroup,snapshot_file_group +SnapshotFileSheetSelection,snapshot_file_sheet_selection +SnapshotFilter,snapshot_filter +SnapshotId,snapshot_id +SnapshotIdentifier,snapshot_identifier +SnapshotIdentifierList,snapshot_identifier_list +SnapshotIds,snapshot_ids +SnapshotInfo,snapshot_info +SnapshotJobErrorInfo,snapshot_job_error_info +SnapshotJobId,snapshot_job_id +SnapshotJobResult,snapshot_job_result +SnapshotJobResultErrorInfo,snapshot_job_result_error_info +SnapshotJobResultFileGroup,snapshot_job_result_file_group +SnapshotJobS3Result,snapshot_job_s3_result +SnapshotLimitExceededException,snapshot_limit_exceeded_exception +SnapshotLimits,snapshot_limits +SnapshotMessage,snapshot_message +SnapshotName,snapshot_name +SnapshotNotFound,snapshot_not_found +SnapshotNotFoundFault,snapshot_not_found_fault +SnapshotOptions,snapshot_options +SnapshotOptionsStatus,snapshot_options_status +SnapshotOwner,snapshot_owner +SnapshotPolicy,snapshot_policy +SnapshotQuotaExceededFault,snapshot_quota_exceeded_fault +SnapshotRecycleBinInfo,snapshot_recycle_bin_info +SnapshotRetentionLimit,snapshot_retention_limit +SnapshotRetentionStartTime,snapshot_retention_start_time +SnapshotS3DestinationConfiguration,snapshot_s3_destination_configuration +SnapshotS3Location,snapshot_s3_location +SnapshotSchedule,snapshot_schedule +SnapshotScheduleAlreadyExistsFault,snapshot_schedule_already_exists_fault +SnapshotScheduleIdentifier,snapshot_schedule_identifier +SnapshotScheduleNotFoundFault,snapshot_schedule_not_found_fault +SnapshotScheduleQuotaExceededFault,snapshot_schedule_quota_exceeded_fault +SnapshotScheduleState,snapshot_schedule_state +SnapshotScheduleUpdateInProgressFault,snapshot_schedule_update_in_progress_fault +SnapshotSchedules,snapshot_schedules +SnapshotSizeInMegaBytes,snapshot_size_in_mega_bytes +SnapshotSortingEntity,snapshot_sorting_entity +SnapshotSource,snapshot_source +SnapshotStatus,snapshot_status +SnapshotSummaries,snapshot_summaries +SnapshotSummary,snapshot_summary +SnapshotTarget,snapshot_target +SnapshotTaskDetail,snapshot_task_detail +SnapshotTierStatus,snapshot_tier_status +SnapshotTierStatuses,snapshot_tier_statuses +SnapshotTime,snapshot_time +SnapshotType,snapshot_type +SnapshotUserConfiguration,snapshot_user_configuration +SnapshotUserConfigurationRedacted,snapshot_user_configuration_redacted +SnapshotVersion,snapshot_version +SnapshotWindow,snapshot_window +Snapshots,snapshots +SnapshotsData,snapshots_data +SnapshotsDataHeader,snapshots_data_header +SnapshotsEnabled,snapshots_enabled +SnapshotsEnabledUpdate,snapshots_enabled_update +SnapshottingClusterId,snapshotting_cluster_id +SnoozeActionConfiguration,snooze_action_configuration +SnoozeAlarmActionRequest,snooze_alarm_action_request +SnowballAmiId,snowball_ami_id +SnowballCapacityPreference,snowball_capacity_preference +SnowballId,snowball_id +SnowballLimit,snowball_limit +SnowballType,snowball_type +SnowballsInUse,snowballs_in_use +SnowconeDeviceConfiguration,snowcone_device_configuration +Snowflake,snowflake +SnowflakeConnectorProfileCredentials,snowflake_connector_profile_credentials +SnowflakeConnectorProfileProperties,snowflake_connector_profile_properties +SnowflakeDestinationProperties,snowflake_destination_properties +SnowflakeMetadata,snowflake_metadata +SnowflakeNodeData,snowflake_node_data +SnowflakeParameters,snowflake_parameters +SnowflakeSource,snowflake_source +SnowflakeTarget,snowflake_target +Snr,snr +Sns,sns +SnsAction,sns_action +SnsCallerArn,sns_caller_arn +SnsChannelConfig,sns_channel_config +SnsConfiguration,sns_configuration +SnsDataSource,sns_data_source +SnsDestination,sns_destination +SnsFormat,sns_format +SnsRegion,sns_region +SnsRoleName,sns_role_name +SnsTopic,sns_topic +SnsTopicARN,sns_topic_arn +SnsTopicArn,sns_topic_arn +SnsTopicConfiguration,sns_topic_configuration +SnsTopicName,sns_topic_name +SnsTopicSinkConfiguration,sns_topic_sink_configuration +SnsTopicStatus,sns_topic_status +SocialProviderSettings,social_provider_settings +SocketAddress,socket_address +SocketPath,socket_path +Sockets,sockets +SoftIRQ,soft_irq +SoftLimit,soft_limit +Softness,softness +Software,software +SoftwareDetails,software_details +SoftwareInformation,software_information +SoftwarePackage,software_package +SoftwareToUpdate,software_to_update +SoftwareTokenMFANotFoundException,software_token_mfa_not_found_exception +SoftwareTokenMfaConfigType,software_token_mfa_config_type +SoftwareTokenMfaConfiguration,software_token_mfa_configuration +SoftwareTokenMfaSettings,software_token_mfa_settings +SoftwareTokenMfaSettingsType,software_token_mfa_settings_type +SoftwareUpdateOptions,software_update_options +SoftwareUpdateOptionsStatus,software_update_options_status +SoftwareUpdatesEndDate,software_updates_end_date +SoftwareVersion,software_version +Solid,solid +Solution,solution +SolutionConfig,solution_config +SolutionStackDescription,solution_stack_description +SolutionStackDetails,solution_stack_details +SolutionStackName,solution_stack_name +SolutionStacks,solution_stacks +SolutionSummary,solution_summary +SolutionVersion,solution_version +SolutionVersionSummary,solution_version_summary +SolveTimestamp,solve_timestamp +SolverProvider,solver_provider +SolverType,solver_type +SolverVersion,solver_version +Solvers,solvers +SopRecommendation,sop_recommendation +Sort,sort +SortAscending,sort_ascending +SortBy,sort_by +SortByMetric,sort_by_metric +SortColumns,sort_columns +SortCondition,sort_condition +SortConfiguration,sort_configuration +SortCriteria,sort_criteria +SortCriterion,sort_criterion +SortDefinition,sort_definition +SortDirection,sort_direction +SortEnabled,sort_enabled +SortExpression,sort_expression +SortIconVisibility,sort_icon_visibility +SortKey,sort_key +SortOrder,sort_order +SortPaths,sort_paths +SortProperty,sort_property +Sortable,sortable +SortingConfiguration,sorting_configuration +SortingEntities,sorting_entities +Sound,sound +Source,source +Source608ChannelNumber,source608_channel_number +Source608TrackNumber,source608_track_number +SourceARN,source_arn +SourceAccessConfiguration,source_access_configuration +SourceAccessConfigurations,source_access_configurations +SourceAccount,source_account +SourceAccountId,source_account_id +SourceAddress,source_address +SourceAddresses,source_addresses +SourceAlgorithm,source_algorithm +SourceAlgorithmSpecification,source_algorithm_specification +SourceAlgorithms,source_algorithms +SourceAnalysis,source_analysis +SourceAncillaryChannelNumber,source_ancillary_channel_number +SourceAndDestinationAreSameException,source_and_destination_are_same_exception +SourceApiAssociation,source_api_association +SourceApiAssociationConfig,source_api_association_config +SourceApiAssociationSummary,source_api_association_summary +SourceApplicationName,source_application_name +SourceApplicationUrl,source_application_url +SourceArn,source_arn +SourceArnPrefix,source_arn_prefix +SourceAuth,source_auth +SourceBackup,source_backup +SourceBackupArn,source_backup_arn +SourceBackupId,source_backup_id +SourceBackupRegion,source_backup_region +SourceBackupUnavailable,source_backup_unavailable +SourceBackupVaultArn,source_backup_vault_arn +SourceBackupVaultName,source_backup_vault_name +SourceBranchName,source_branch_name +SourceBucket,source_bucket +SourceBucketArn,source_bucket_arn +SourceBuildInformation,source_build_information +SourceBundle,source_bundle +SourceBundleDeletionException,source_bundle_deletion_exception +SourceCacheNodeId,source_cache_node_id +SourceCidrBlock,source_cidr_block +SourceCloudProperties,source_cloud_properties +SourceCluster,source_cluster +SourceClusterInfo,source_cluster_info +SourceClusterNotSupportedFault,source_cluster_not_supported_fault +SourceCode,source_code +SourceCodeArchiveUrl,source_code_archive_url +SourceCodeArtifactsObjectKey,source_code_artifacts_object_key +SourceCodeRepository,source_code_repository +SourceCodeType,source_code_type +SourceCodeUrl,source_code_url +SourceCodeVersion,source_code_version +SourceColumn,source_column +SourceCommit,source_commit +SourceConfig,source_config +SourceConfiguration,source_configuration +SourceConnection,source_connection +SourceConnectionDetail,source_connection_detail +SourceConnectionParameters,source_connection_parameters +SourceConnectorProperties,source_connector_properties +SourceConnectorType,source_connector_type +SourceContactId,source_contact_id +SourceContainer,source_container +SourceControlDetails,source_control_details +SourceControls,source_controls +SourceCredentialsInfo,source_credentials_info +SourceCustomDbEngineVersionIdentifier,source_custom_db_engine_version_identifier +SourceDBClusterIdentifier,source_db_cluster_identifier +SourceDBClusterParameterGroupIdentifier,source_db_cluster_parameter_group_identifier +SourceDBClusterSnapshotArn,source_db_cluster_snapshot_arn +SourceDBClusterSnapshotIdentifier,source_db_cluster_snapshot_identifier +SourceDBInstanceArn,source_db_instance_arn +SourceDBInstanceAutomatedBackupsArn,source_db_instance_automated_backups_arn +SourceDBInstanceIdentifier,source_db_instance_identifier +SourceDBParameterGroupIdentifier,source_db_parameter_group_identifier +SourceDBSnapshotIdentifier,source_db_snapshot_identifier +SourceDataColumnProperties,source_data_column_properties +SourceDataProviderDescriptors,source_data_provider_descriptors +SourceDatabaseName,source_database_name +SourceDatabaseNotSupportedFault,source_database_not_supported_fault +SourceDatasetArn,source_dataset_arn +SourceDbClusterResourceId,source_db_cluster_resource_id +SourceDbSnapshotIdentifier,source_db_snapshot_identifier +SourceDbiResourceId,source_dbi_resource_id +SourceDescription,source_description +SourceDestCheck,source_dest_check +SourceDetail,source_detail +SourceDetails,source_details +SourceDirectory,source_directory +SourceDocument,source_document +SourceDocuments,source_documents +SourceDocumentsS3Uri,source_documents_s3_uri +SourceDomain,source_domain +SourceDomainInfo,source_domain_info +SourceEncryptionAlgorithm,source_encryption_algorithm +SourceEncryptionContext,source_encryption_context +SourceEndBehavior,source_end_behavior +SourceEndpointArn,source_endpoint_arn +SourceEngine,source_engine +SourceEngineName,source_engine_name +SourceEngineVersion,source_engine_version +SourceEntity,source_entity +SourceEntityArn,source_entity_arn +SourceEnvironmentId,source_environment_id +SourceEnvironmentName,source_environment_name +SourceFailoverConfig,source_failover_config +SourceField,source_field +SourceFieldProperties,source_field_properties +SourceFields,source_fields +SourceFile,source_file +SourceFileLocation,source_file_location +SourceFileOrContentRequiredException,source_file_or_content_required_exception +SourceFileSpecifier,source_file_specifier +SourceFileSystemArn,source_file_system_arn +SourceFileSystemId,source_file_system_id +SourceFileSystemRegion,source_file_system_region +SourceFiles,source_files +SourceFilterId,source_filter_id +SourceFlowConfig,source_flow_config +SourceFpgaImageId,source_fpga_image_id +SourceGroup,source_group +SourceId,source_id +SourceIdType,source_id_type +SourceIdentifier,source_identifier +SourceIdentity,source_identity +SourceIds,source_ids +SourceIdsList,source_ids_list +SourceImage,source_image +SourceImageFace,source_image_face +SourceImageId,source_image_id +SourceImageName,source_image_name +SourceImageOrientationCorrection,source_image_orientation_correction +SourceIp,source_ip +SourceIpConditionConfig,source_ip_condition_config +SourceIpConfig,source_ip_config +SourceIpV4,source_ipv4 +SourceIpV6,source_ipv6 +SourceIpamPoolId,source_ipam_pool_id +SourceIps,source_ips +SourceItemsLimit,source_items_limit +SourceKeyId,source_key_id +SourceKeyword,source_keyword +SourceLanguageCode,source_language_code +SourceLastUpdatedTimestampFormat,source_last_updated_timestamp_format +SourceLayerArn,source_layer_arn +SourceLayerHash,source_layer_hash +SourceLicenseContext,source_license_context +SourceListenerAddress,source_listener_address +SourceListenerPort,source_listener_port +SourceLocation,source_location +SourceLocationArn,source_location_arn +SourceLocationName,source_location_name +SourceMac,source_mac +SourceMember,source_member +SourceMetadata,source_metadata +SourceModelArn,source_model_arn +SourceModelVariantName,source_model_variant_name +SourceModelVersionArn,source_model_version_arn +SourceName,source_name +SourceNetwork,source_network +SourceNetworkData,source_network_data +SourceNetworkInterfaceArns,source_network_interface_arns +SourceNotFoundFault,source_not_found_fault +SourceObject,source_object +SourceObjectReference,source_object_reference +SourceOptionGroup,source_option_group +SourceOptionGroupIdentifier,source_option_group_identifier +SourceParameterName,source_parameter_name +SourceParameters,source_parameters +SourceParentId,source_parent_id +SourceParentNotFoundException,source_parent_not_found_exception +SourcePath,source_path +SourcePhoneNumber,source_phone_number +SourcePipelineExecutionArn,source_pipeline_execution_arn +SourcePolicyId,source_policy_id +SourcePolicyType,source_policy_type +SourcePort,source_port +SourcePortRange,source_port_range +SourcePortRanges,source_port_ranges +SourcePortfolioId,source_portfolio_id +SourcePorts,source_ports +SourcePrefix,source_prefix +SourcePrefixLists,source_prefix_lists +SourcePriority,source_priority +SourceProductArn,source_product_arn +SourceProjectArn,source_project_arn +SourceProjectVersionArn,source_project_version_arn +SourceProperties,source_properties +SourceProvisioningArtifactIdentifiers,source_provisioning_artifact_identifiers +SourceQueue,source_queue +SourceRecoveryPointArn,source_recovery_point_arn +SourceRefContains,source_ref_contains +SourceRegion,source_region +SourceRegionMessage,source_region_message +SourceRegions,source_regions +SourceRepository,source_repository +SourceReservedNode,source_reserved_node +SourceReservedNodeCount,source_reserved_node_count +SourceReservedNodeId,source_reserved_node_id +SourceReservedNodeType,source_reserved_node_type +SourceResourceArn,source_resource_arn +SourceResourceName,source_resource_name +SourceResourceType,source_resource_type +SourceResult,source_result +SourceRevision,source_revision +SourceRoleArn,source_role_arn +SourceS3Location,source_s3_location +SourceS3Path,source_s3_path +SourceSchema,source_schema +SourceSchemaName,source_schema_name +SourceSecurityGroup,source_security_group +SourceSecurityGroupName,source_security_group_name +SourceSecurityGroupOwnerId,source_security_group_owner_id +SourceSegments,source_segments +SourceSelectionCriteria,source_selection_criteria +SourceServer,source_server +SourceServerActionDocument,source_server_action_document +SourceServerActionsRequestFilters,source_server_actions_request_filters +SourceSettings,source_settings +SourceSheetControlId,source_sheet_control_id +SourceSnapshotClusterIdentifier,source_snapshot_cluster_identifier +SourceSnapshotId,source_snapshot_id +SourceSnapshotIdentifier,source_snapshot_identifier +SourceSnapshotIds,source_snapshot_ids +SourceSnapshotName,source_snapshot_name +SourceStackId,source_stack_id +SourceTable,source_table +SourceTableArn,source_table_arn +SourceTableDetails,source_table_details +SourceTableFeatureDetails,source_table_feature_details +SourceTableName,source_table_name +SourceTemplate,source_template +SourceText,source_text +SourceType,source_type +SourceTypes,source_types +SourceURI,source_uri +SourceUpdateToken,source_update_token +SourceUri,source_uri +SourceUrl,source_url +SourceUser,source_user +SourceUserIdentifier,source_user_identifier +SourceVersion,source_version +SourceVolume,source_volume +SourceVolumeARN,source_volume_arn +SourceVpc,source_vpc +SourceWatermarkStatus,source_watermark_status +SourceWorkspaceId,source_workspace_id +Sources,sources +South,south +Space,space +SpaceArn,space_arn +SpaceConfiguration,space_configuration +SpaceDetails,space_details +SpaceFieldMappings,space_field_mappings +SpaceName,space_name +SpaceNameContains,space_name_contains +SpaceNameEquals,space_name_equals +SpaceSettings,space_settings +SpaceSummary,space_summary +Spaces,spaces +Spacing,spacing +SpamCount,spam_count +SpamPercentage,spam_percentage +SpamRawCount,spam_raw_count +Span,span +SparkConnectorSource,spark_connector_source +SparkConnectorTarget,spark_connector_target +SparkParameters,spark_parameters +SparkProperties,spark_properties +SparkSQL,spark_sql +SparkSqlJobDriver,spark_sql_job_driver +SparkSubmit,spark_submit +SparkSubmitJobDriver,spark_submit_job_driver +Sparkline,sparkline +SparqlData,sparql_data +SparqlRecord,sparql_record +SparseTrackType,sparse_track_type +SpatialAdaptiveQuantization,spatial_adaptive_quantization +SpatialAq,spatial_aq +SpatialDataOptionToGeoJsonFunctionName,spatial_data_option_to_geo_json_function_name +SpatialFilterSettings,spatial_filter_settings +SpawnRate,spawn_rate +SpdxLicenseId,spdx_license_id +Speaker,speaker +SpeakerEnrollmentJob,speaker_enrollment_job +SpeakerEnrollmentJobSummary,speaker_enrollment_job_summary +SpeakerId,speaker_id +SpeakerSearchDetails,speaker_search_details +SpeakerSearchResult,speaker_search_result +SpeakerSearchStatus,speaker_search_status +SpeakerSearchTask,speaker_search_task +SpeakerSearchTaskId,speaker_search_task_id +SpeakerSearchTaskStatus,speaker_search_task_status +SpeakerSummaries,speaker_summaries +SpeakerSummary,speaker_summary +Spec,spec +SpecialFeature,special_feature +SpecialValue,special_value +Specialty,specialty +SpecifedOrder,specifed_order +Specification,specification +Specifications,specifications +SpecifiedImage,specified_image +SpectrumConfig,spectrum_config +SpeechMarkTypes,speech_mark_types +SpeechThreshold,speech_threshold +Speed,speed +SpekeKeyProvider,speke_key_provider +SpekeKeyProviderCmaf,speke_key_provider_cmaf +SpellCorrectedQueries,spell_corrected_queries +SpellCorrectedQuery,spell_corrected_query +SpellCorrectionConfiguration,spell_correction_configuration +Spend,spend +SpendCoveredBySavingsPlans,spend_covered_by_savings_plans +SpendLimit,spend_limit +SpendLimits,spend_limits +SpfPercentage,spf_percentage +Spigot,spigot +SpliceEventId,splice_event_id +SpliceInsertMessage,splice_insert_message +Split,split +SplitChargeRules,split_charge_rules +SplitDocument,split_document +SplitDocuments,split_documents +SplitFields,split_fields +SplitShardInput,split_shard_input +SplitTunnel,split_tunnel +SplitType,split_type +SplunkDestinationConfiguration,splunk_destination_configuration +SplunkDestinationDescription,splunk_destination_description +SplunkDestinationUpdate,splunk_destination_update +SplunkRetryOptions,splunk_retry_options +SpotAllocationStrategy,spot_allocation_strategy +SpotCapacityRebalance,spot_capacity_rebalance +SpotDatafeedSubscription,spot_datafeed_subscription +SpotFleetLaunchSpecification,spot_fleet_launch_specification +SpotFleetMonitoring,spot_fleet_monitoring +SpotFleetRequestConfig,spot_fleet_request_config +SpotFleetRequestConfigData,spot_fleet_request_config_data +SpotFleetRequestConfigs,spot_fleet_request_configs +SpotFleetRequestId,spot_fleet_request_id +SpotFleetRequestIds,spot_fleet_request_ids +SpotFleetRequestState,spot_fleet_request_state +SpotFleetTagSpecification,spot_fleet_tag_specification +SpotInstancePools,spot_instance_pools +SpotInstanceRequest,spot_instance_request +SpotInstanceRequestId,spot_instance_request_id +SpotInstanceRequestIds,spot_instance_request_ids +SpotInstanceRequests,spot_instance_requests +SpotInstanceStateFault,spot_instance_state_fault +SpotInstanceStatus,spot_instance_status +SpotInstanceType,spot_instance_type +SpotMaintenanceStrategies,spot_maintenance_strategies +SpotMarketOptions,spot_market_options +SpotMaxPrice,spot_max_price +SpotMaxPricePercentageOverLowestPrice,spot_max_price_percentage_over_lowest_price +SpotMaxTotalPrice,spot_max_total_price +SpotOptions,spot_options +SpotOptionsRequest,spot_options_request +SpotPlacement,spot_placement +SpotPlacementScore,spot_placement_score +SpotPlacementScores,spot_placement_scores +SpotPrice,spot_price +SpotPriceHistory,spot_price_history +SpotProvisioningSpecification,spot_provisioning_specification +SpotResizeSpecification,spot_resize_specification +SpotResizingSpecification,spot_resizing_specification +SpotSpecification,spot_specification +SpotTargetCapacity,spot_target_capacity +SpreadDomain,spread_domain +SpreadLevel,spread_level +Sql,sql +SqlAlias,sql_alias +SqlAliases,sql_aliases +SqlApplicationConfiguration,sql_application_configuration +SqlApplicationConfigurationDescription,sql_application_configuration_description +SqlApplicationConfigurationUpdate,sql_application_configuration_update +SqlConfiguration,sql_configuration +SqlEndpointPath,sql_endpoint_path +SqlInjectionMatchSet,sql_injection_match_set +SqlInjectionMatchSetId,sql_injection_match_set_id +SqlInjectionMatchSetSummary,sql_injection_match_set_summary +SqlInjectionMatchSetUpdate,sql_injection_match_set_update +SqlInjectionMatchSets,sql_injection_match_sets +SqlInjectionMatchTuple,sql_injection_match_tuple +SqlInjectionMatchTuples,sql_injection_match_tuples +SqlParameter,sql_parameter +SqlParseException,sql_parse_exception +SqlQuery,sql_query +SqlQueryDatasetAction,sql_query_dataset_action +SqlRunConfiguration,sql_run_configuration +SqlRunConfigurations,sql_run_configurations +SqlServerParameters,sql_server_parameters +SqlStatementResult,sql_statement_result +SqlType,sql_type +SqliMatchStatement,sqli_match_statement +Sqls,sqls +SqsAction,sqs_action +SqsFailureFeedbackRoleArn,sqs_failure_feedback_role_arn +SqsParameters,sqs_parameters +SqsQueueArn,sqs_queue_arn +SqsQueueConfiguration,sqs_queue_configuration +SqsQueueParameters,sqs_queue_parameters +SqsQueueSinkConfiguration,sqs_queue_sink_configuration +SqsQueueUrl,sqs_queue_url +SqsSuccessFeedbackRoleArn,sqs_success_feedback_role_arn +Squash,squash +SriovNetSupport,sriov_net_support +SrtDestinationSettings,srt_destination_settings +SseAwsKmsKeyId,sse_aws_kms_key_id +SseConfig,sse_config +SseConfiguration,sse_configuration +SseDescription,sse_description +SseKmsEncryptedObjects,sse_kms_encrypted_objects +SseSpecification,sse_specification +SseType,sse_type +SshCiphers,ssh_ciphers +SshHostDsaKeyFingerprint,ssh_host_dsa_key_fingerprint +SshHostRsaKeyFingerprint,ssh_host_rsa_key_fingerprint +SshKexs,ssh_kexs +SshKey,ssh_key +SshKeyLastUpdated,ssh_key_last_updated +SshKeyName,ssh_key_name +SshMacs,ssh_macs +SshPublicKey,ssh_public_key +SshPublicKeyBody,ssh_public_key_body +SshPublicKeyCount,ssh_public_key_count +SshPublicKeyId,ssh_public_key_id +SshPublicKeys,ssh_public_keys +SshUsername,ssh_username +Ssid,ssid +Ssl,ssl +SslCaCertificateArn,ssl_ca_certificate_arn +SslCertificateId,ssl_certificate_id +SslCertificateS3Path,ssl_certificate_s3_path +SslClientCertificateArn,ssl_client_certificate_arn +SslClientKeyArn,ssl_client_key_arn +SslClientKeyPassword,ssl_client_key_password +SslConfiguration,ssl_configuration +SslEndpointIdentificationAlgorithm,ssl_endpoint_identification_algorithm +SslMode,ssl_mode +SslPolicies,ssl_policies +SslPolicy,ssl_policy +SslProperties,ssl_properties +SslProtocols,ssl_protocols +SslSecurityProtocol,ssl_security_protocol +SslSupportMethod,ssl_support_method +SsmActionDefinition,ssm_action_definition +SsmAutomation,ssm_automation +SsmControls,ssm_controls +SsmDocument,ssm_document +SsmOpsItemId,ssm_ops_item_id +SsmParameterStoreParameter,ssm_parameter_store_parameter +Ssml,ssml +SsmlList,ssml_list +SsmlMarksNotSupportedForTextTypeException,ssml_marks_not_supported_for_text_type_exception +SsoEnabled,sso_enabled +Stable,stable +Stack,stack +StackArn,stack_arn +StackConfigInput,stack_config_input +StackConfigurationManager,stack_configuration_manager +StackDriftDetectionId,stack_drift_detection_id +StackDriftInformation,stack_drift_information +StackDriftInformationSummary,stack_drift_information_summary +StackDriftStatus,stack_drift_status +StackError,stack_error +StackErrors,stack_errors +StackEvent,stack_event +StackEvents,stack_events +StackId,stack_id +StackIds,stack_ids +StackIdsUrl,stack_ids_url +StackInstance,stack_instance +StackInstanceAccount,stack_instance_account +StackInstanceComprehensiveStatus,stack_instance_comprehensive_status +StackInstanceFilter,stack_instance_filter +StackInstanceNotFoundException,stack_instance_not_found_exception +StackInstanceRegion,stack_instance_region +StackInstanceResourceDriftStatuses,stack_instance_resource_drift_statuses +StackInstanceResourceDriftsSummary,stack_instance_resource_drifts_summary +StackInstanceStatus,stack_instance_status +StackInstanceSummary,stack_instance_summary +StackInstances,stack_instances +StackName,stack_name +StackNames,stack_names +StackNotFoundException,stack_not_found_exception +StackPolicyBody,stack_policy_body +StackPolicyDuringUpdateBody,stack_policy_during_update_body +StackPolicyDuringUpdateURL,stack_policy_during_update_url +StackPolicyURL,stack_policy_url +StackResource,stack_resource +StackResourceDetail,stack_resource_detail +StackResourceDrift,stack_resource_drift +StackResourceDriftInformation,stack_resource_drift_information +StackResourceDriftInformationSummary,stack_resource_drift_information_summary +StackResourceDriftStatus,stack_resource_drift_status +StackResourceDriftStatusFilters,stack_resource_drift_status_filters +StackResourceDrifts,stack_resource_drifts +StackResourceSummaries,stack_resource_summaries +StackResourceSummary,stack_resource_summary +StackResources,stack_resources +StackSet,stack_set +StackSetARN,stack_set_arn +StackSetAccounts,stack_set_accounts +StackSetDriftDetectionDetails,stack_set_drift_detection_details +StackSetFailureToleranceCount,stack_set_failure_tolerance_count +StackSetFailureTolerancePercentage,stack_set_failure_tolerance_percentage +StackSetId,stack_set_id +StackSetMaxConcurrencyCount,stack_set_max_concurrency_count +StackSetMaxConcurrencyPercentage,stack_set_max_concurrency_percentage +StackSetName,stack_set_name +StackSetNotEmptyException,stack_set_not_empty_exception +StackSetNotFoundException,stack_set_not_found_exception +StackSetOperation,stack_set_operation +StackSetOperationPreferences,stack_set_operation_preferences +StackSetOperationResultSummary,stack_set_operation_result_summary +StackSetOperationStatusDetails,stack_set_operation_status_details +StackSetOperationSummary,stack_set_operation_summary +StackSetOperationType,stack_set_operation_type +StackSetRegions,stack_set_regions +StackSetSummary,stack_set_summary +StackStatus,stack_status +StackStatusFilter,stack_status_filter +StackStatusReason,stack_status_reason +StackSummaries,stack_summaries +StackSummary,stack_summary +Stacks,stacks +Stage,stage +StageContext,stage_context +StageDeclaration,stage_declaration +StageDeployment,stage_deployment +StageDeploymentDetails,stage_deployment_details +StageDeploymentSummary,stage_deployment_summary +StageDeployments,stage_deployments +StageDetails,stage_details +StageExecution,stage_execution +StageId,stage_id +StageIndex,stage_index +StageKey,stage_key +StageLastUpdatedDateTime,stage_last_updated_date_time +StageName,stage_name +StageNotFoundException,stage_not_found_exception +StageNotRetryableException,stage_not_retryable_exception +StageReason,stage_reason +StageSession,stage_session +StageSessionSummary,stage_session_summary +StageState,stage_state +StageStatus,stage_status +StageSummary,stage_summary +StageVariableOverrides,stage_variable_overrides +StageVariables,stage_variables +Stages,stages +StagesAvailable,stages_available +Staging,staging +StagingArea,staging_area +StagingDistributionDnsNames,staging_distribution_dns_names +StagingDistributionId,staging_distribution_id +StagingDistributionInUse,staging_distribution_in_use +StagingSourceServer,staging_source_server +StagingTable,staging_table +Stairs,stairs +StaleIpPermission,stale_ip_permission +StaleIpPermissions,stale_ip_permissions +StaleIpPermissionsEgress,stale_ip_permissions_egress +StaleRequestException,stale_request_exception +StaleSecurityGroup,stale_security_group +StaleSecurityGroupSet,stale_security_group_set +StaleTagException,stale_tag_exception +StandByAvailabilityZoneCount,stand_by_availability_zone_count +Standard,standard +StandardErrorContent,standard_error_content +StandardErrorUrl,standard_error_url +StandardHlsSettings,standard_hls_settings +StandardIdentifiers,standard_identifiers +StandardKnowledgeArticleTypeConfiguration,standard_knowledge_article_type_configuration +StandardLayout,standard_layout +StandardMessages,standard_messages +StandardMetricName,standard_metric_name +StandardObjectAttachmentConfiguration,standard_object_attachment_configuration +StandardObjectConfigurations,standard_object_configurations +StandardOutputContent,standard_output_content +StandardOutputUrl,standard_output_url +Standards,standards +StandardsArn,standards_arn +StandardsControl,standards_control +StandardsControlArn,standards_control_arn +StandardsControlArns,standards_control_arns +StandardsControlAssociationDetail,standards_control_association_detail +StandardsControlAssociationDetails,standards_control_association_details +StandardsControlAssociationId,standards_control_association_id +StandardsControlAssociationIds,standards_control_association_ids +StandardsControlAssociationSummaries,standards_control_association_summaries +StandardsControlAssociationSummary,standards_control_association_summary +StandardsControlAssociationUpdate,standards_control_association_update +StandardsControlAssociationUpdates,standards_control_association_updates +StandardsControlDescription,standards_control_description +StandardsControlTitle,standards_control_title +StandardsId,standards_id +StandardsInput,standards_input +StandardsManagedBy,standards_managed_by +StandardsStatus,standards_status +StandardsStatusReason,standards_status_reason +StandardsSubscription,standards_subscription +StandardsSubscriptionArn,standards_subscription_arn +StandardsSubscriptionArns,standards_subscription_arns +StandardsSubscriptionRequest,standards_subscription_request +StandardsSubscriptionRequests,standards_subscription_requests +StandardsSubscriptions,standards_subscriptions +StandbyDelayTime,standby_delay_time +StandbyInstances,standby_instances +StandbyWorkspace,standby_workspace +StandbyWorkspaceRequest,standby_workspace_request +StandbyWorkspaces,standby_workspaces +Start,start +StartAccessLoggingInput,start_access_logging_input +StartActivity,start_activity +StartActivityStreamRequest,start_activity_stream_request +StartActivityStreamResponse,start_activity_stream_response +StartAfter,start_after +StartAfterDateTime,start_after_date_time +StartAngle,start_angle +StartAnnotationImportRequest,start_annotation_import_request +StartAnnotationImportResponse,start_annotation_import_response +StartAppAssessmentRequest,start_app_assessment_request +StartAppAssessmentResponse,start_app_assessment_response +StartAppBlockBuilderRequest,start_app_block_builder_request +StartAppBlockBuilderResult,start_app_block_builder_result +StartAppInput,start_app_input +StartAppOutput,start_app_output +StartAppReplicationRequest,start_app_replication_request +StartApplicationRefreshInput,start_application_refresh_input +StartApplicationRefreshOutput,start_application_refresh_output +StartApplicationRequest,start_application_request +StartArns,start_arns +StartAssessmentFrameworkShareRequest,start_assessment_framework_share_request +StartAssessmentFrameworkShareResponse,start_assessment_framework_share_response +StartAssessmentRequest,start_assessment_request +StartAssessmentResponse,start_assessment_response +StartAssessmentRunRequest,start_assessment_run_request +StartAssessmentRunResponse,start_assessment_run_response +StartAssetBundleExportJobRequest,start_asset_bundle_export_job_request +StartAssetBundleExportJobResponse,start_asset_bundle_export_job_response +StartAssetBundleImportJobRequest,start_asset_bundle_import_job_request +StartAssetBundleImportJobResponse,start_asset_bundle_import_job_response +StartAssociationsOnceRequest,start_associations_once_request +StartAt,start_at +StartAttachmentUploadRequest,start_attachment_upload_request +StartAttachmentUploadResponse,start_attachment_upload_response +StartAuditMitigationActionsTaskRequest,start_audit_mitigation_actions_task_request +StartAuditMitigationActionsTaskResponse,start_audit_mitigation_actions_task_response +StartAutomationExecutionRequest,start_automation_execution_request +StartAutomationExecutionResult,start_automation_execution_result +StartAvailabilityMonitorTestInput,start_availability_monitor_test_input +StartAvailabilityMonitorTestOutput,start_availability_monitor_test_output +StartBackupJobInput,start_backup_job_input +StartBackupJobOutput,start_backup_job_output +StartBatchJobRequest,start_batch_job_request +StartBatchJobResponse,start_batch_job_response +StartBgpFailoverTestRequest,start_bgp_failover_test_request +StartBgpFailoverTestResponse,start_bgp_failover_test_response +StartBillingPeriod,start_billing_period +StartBlueprintRunRequest,start_blueprint_run_request +StartBlueprintRunResponse,start_blueprint_run_response +StartBotRecommendationRequest,start_bot_recommendation_request +StartBotRecommendationResponse,start_bot_recommendation_response +StartBuildBatchInput,start_build_batch_input +StartBuildBatchOutput,start_build_batch_output +StartBuildInput,start_build_input +StartBuildOutput,start_build_output +StartBulkAssociateWirelessDeviceWithMulticastGroupRequest,start_bulk_associate_wireless_device_with_multicast_group_request +StartBulkDeploymentRequest,start_bulk_deployment_request +StartBulkDeploymentResponse,start_bulk_deployment_response +StartBulkDisassociateWirelessDeviceFromMulticastGroupRequest,start_bulk_disassociate_wireless_device_from_multicast_group_request +StartBy,start_by +StartCalculationExecutionRequest,start_calculation_execution_request +StartCalculationExecutionResponse,start_calculation_execution_response +StartCallAnalyticsJobRequest,start_call_analytics_job_request +StartCallAnalyticsJobResponse,start_call_analytics_job_response +StartCallAnalyticsStreamTranscriptionRequest,start_call_analytics_stream_transcription_request +StartCallAnalyticsStreamTranscriptionResponse,start_call_analytics_stream_transcription_response +StartCampaignRequest,start_campaign_request +StartCanaryRequest,start_canary_request +StartCelebrityRecognitionRequest,start_celebrity_recognition_request +StartCelebrityRecognitionResponse,start_celebrity_recognition_response +StartChangeRequestExecutionRequest,start_change_request_execution_request +StartChangeRequestExecutionResult,start_change_request_execution_result +StartChangeSetRequest,start_change_set_request +StartChangeSetResponse,start_change_set_response +StartChannelRequest,start_channel_request +StartChannelResponse,start_channel_response +StartChatContactRequest,start_chat_contact_request +StartChatContactResponse,start_chat_contact_response +StartChildWorkflowExecutionDecisionAttributes,start_child_workflow_execution_decision_attributes +StartChildWorkflowExecutionFailedEventAttributes,start_child_workflow_execution_failed_event_attributes +StartChildWorkflowExecutionInitiatedEventAttributes,start_child_workflow_execution_initiated_event_attributes +StartClockInput,start_clock_input +StartCodegenJobData,start_codegen_job_data +StartCodegenJobRequest,start_codegen_job_request +StartCodegenJobResponse,start_codegen_job_response +StartColumn,start_column +StartColumnIndex,start_column_index +StartCommand,start_command +StartCondition,start_condition +StartConfigRulesEvaluationRequest,start_config_rules_evaluation_request +StartConfigurationRecorderRequest,start_configuration_recorder_request +StartConfigurationSessionRequest,start_configuration_session_request +StartConfigurationSessionResponse,start_configuration_session_response +StartConnectionRequest,start_connection_request +StartConnectionResponse,start_connection_response +StartContactEvaluationRequest,start_contact_evaluation_request +StartContactEvaluationResponse,start_contact_evaluation_response +StartContactRecordingRequest,start_contact_recording_request +StartContactStreamingRequest,start_contact_streaming_request +StartContactStreamingResponse,start_contact_streaming_response +StartContentModerationRequest,start_content_moderation_request +StartContentModerationResponse,start_content_moderation_response +StartContentUploadRequest,start_content_upload_request +StartContentUploadResponse,start_content_upload_response +StartContinentCode,start_continent_code +StartContinuousExportResponse,start_continuous_export_response +StartConversationRequest,start_conversation_request +StartConversationResponse,start_conversation_response +StartCopyJobInput,start_copy_job_input +StartCopyJobOutput,start_copy_job_output +StartCostEstimationRequest,start_cost_estimation_request +StartCountryCode,start_country_code +StartCrawlerRequest,start_crawler_request +StartCrawlerScheduleRequest,start_crawler_schedule_request +StartCutoverRequest,start_cutover_request +StartCutoverResponse,start_cutover_response +StartDBClusterMessage,start_db_cluster_message +StartDBClusterResult,start_db_cluster_result +StartDBInstanceAutomatedBackupsReplicationMessage,start_db_instance_automated_backups_replication_message +StartDBInstanceAutomatedBackupsReplicationResult,start_db_instance_automated_backups_replication_result +StartDBInstanceMessage,start_db_instance_message +StartDBInstanceResult,start_db_instance_result +StartDICOMImportJobRequest,start_dicom_import_job_request +StartDICOMImportJobResponse,start_dicom_import_job_response +StartDashboardSnapshotJobRequest,start_dashboard_snapshot_job_request +StartDashboardSnapshotJobResponse,start_dashboard_snapshot_job_response +StartDataCollectionByAgentIdsRequest,start_data_collection_by_agent_ids_request +StartDataCollectionByAgentIdsResponse,start_data_collection_by_agent_ids_response +StartDataIngestionJobRequest,start_data_ingestion_job_request +StartDataIngestionJobResponse,start_data_ingestion_job_response +StartDataQualityRuleRecommendationRunRequest,start_data_quality_rule_recommendation_run_request +StartDataQualityRuleRecommendationRunResponse,start_data_quality_rule_recommendation_run_response +StartDataQualityRulesetEvaluationRunRequest,start_data_quality_ruleset_evaluation_run_request +StartDataQualityRulesetEvaluationRunResponse,start_data_quality_ruleset_evaluation_run_response +StartDataSourceSyncJobRequest,start_data_source_sync_job_request +StartDataSourceSyncJobResponse,start_data_source_sync_job_response +StartDate,start_date +StartDateTime,start_date_time +StartDeliveryStreamEncryptionInput,start_delivery_stream_encryption_input +StartDeploymentRequest,start_deployment_request +StartDeploymentResponse,start_deployment_response +StartDeploymentResult,start_deployment_result +StartDetectMitigationActionsTaskRequest,start_detect_mitigation_actions_task_request +StartDetectMitigationActionsTaskResponse,start_detect_mitigation_actions_task_response +StartDetectorModelAnalysisRequest,start_detector_model_analysis_request +StartDetectorModelAnalysisResponse,start_detector_model_analysis_response +StartDevEnvironmentRequest,start_dev_environment_request +StartDevEnvironmentResponse,start_dev_environment_response +StartDevEnvironmentSessionRequest,start_dev_environment_session_request +StartDevEnvironmentSessionResponse,start_dev_environment_session_response +StartDeviceAuthorizationRequest,start_device_authorization_request +StartDeviceAuthorizationResponse,start_device_authorization_response +StartDeviceSyncRequest,start_device_sync_request +StartDiscovererRequest,start_discoverer_request +StartDiscovererResponse,start_discoverer_response +StartDiscoveryJobRequest,start_discovery_job_request +StartDiscoveryJobResponse,start_discovery_job_response +StartDocumentAnalysisRequest,start_document_analysis_request +StartDocumentAnalysisResponse,start_document_analysis_response +StartDocumentClassificationJobRequest,start_document_classification_job_request +StartDocumentClassificationJobResponse,start_document_classification_job_response +StartDocumentTextDetectionRequest,start_document_text_detection_request +StartDocumentTextDetectionResponse,start_document_text_detection_response +StartDominantLanguageDetectionJobRequest,start_dominant_language_detection_job_request +StartDominantLanguageDetectionJobResponse,start_dominant_language_detection_job_response +StartEarthObservationJobInput,start_earth_observation_job_input +StartEarthObservationJobOutput,start_earth_observation_job_output +StartEdgeConfigurationUpdateInput,start_edge_configuration_update_input +StartEdgeConfigurationUpdateOutput,start_edge_configuration_update_output +StartEdgeDeploymentStageRequest,start_edge_deployment_stage_request +StartElasticsearchServiceSoftwareUpdateRequest,start_elasticsearch_service_software_update_request +StartElasticsearchServiceSoftwareUpdateResponse,start_elasticsearch_service_software_update_response +StartEngagementRequest,start_engagement_request +StartEngagementResult,start_engagement_result +StartEntitiesDetectionJobRequest,start_entities_detection_job_request +StartEntitiesDetectionJobResponse,start_entities_detection_job_response +StartEntitiesDetectionV2JobRequest,start_entities_detection_v2_job_request +StartEntitiesDetectionV2JobResponse,start_entities_detection_v2_job_response +StartError,start_error +StartEventDataStoreIngestionRequest,start_event_data_store_ingestion_request +StartEventTime,start_event_time +StartEventsDetectionJobRequest,start_events_detection_job_request +StartEventsDetectionJobResponse,start_events_detection_job_response +StartExecutionInput,start_execution_input +StartExecutionOutput,start_execution_output +StartExpenseAnalysisRequest,start_expense_analysis_request +StartExpenseAnalysisResponse,start_expense_analysis_response +StartExperimentRequest,start_experiment_request +StartExperimentResponse,start_experiment_response +StartExportLabelsTaskRunRequest,start_export_labels_task_run_request +StartExportLabelsTaskRunResponse,start_export_labels_task_run_response +StartExportRequest,start_export_request +StartExportResponse,start_export_response +StartExportTaskMessage,start_export_task_message +StartExportTaskRequest,start_export_task_request +StartExportTaskResponse,start_export_task_response +StartExtensionPackAssociationMessage,start_extension_pack_association_message +StartExtensionPackAssociationResponse,start_extension_pack_association_response +StartFHIRExportJobRequest,start_fhir_export_job_request +StartFHIRExportJobResponse,start_fhir_export_job_response +StartFHIRImportJobRequest,start_fhir_import_job_request +StartFHIRImportJobResponse,start_fhir_import_job_response +StartFaceDetectionRequest,start_face_detection_request +StartFaceDetectionResponse,start_face_detection_response +StartFaceSearchRequest,start_face_search_request +StartFaceSearchResponse,start_face_search_response +StartFailbackLaunchRequest,start_failback_launch_request +StartFailbackLaunchResponse,start_failback_launch_response +StartFailed,start_failed +StartFileTransferRequest,start_file_transfer_request +StartFileTransferResponse,start_file_transfer_response +StartFleetActionsInput,start_fleet_actions_input +StartFleetActionsOutput,start_fleet_actions_output +StartFleetRequest,start_fleet_request +StartFlowRequest,start_flow_request +StartFlowResponse,start_flow_response +StartFlywheelIterationRequest,start_flywheel_iteration_request +StartFlywheelIterationResponse,start_flywheel_iteration_response +StartFrameNumber,start_frame_number +StartFraudsterRegistrationJobRequest,start_fraudster_registration_job_request +StartFraudsterRegistrationJobResponse,start_fraudster_registration_job_response +StartFromRow,start_from_row +StartFuotaTaskRequest,start_fuota_task_request +StartGUISessionRequest,start_gui_session_request +StartGUISessionResult,start_gui_session_result +StartGameSessionPlacementInput,start_game_session_placement_input +StartGameSessionPlacementOutput,start_game_session_placement_output +StartGatewayInput,start_gateway_input +StartGatewayOutput,start_gateway_output +StartGeneratedCodeJobRequest,start_generated_code_job_request +StartGeneratedCodeJobResult,start_generated_code_job_result +StartHour,start_hour +StartHourOfDay,start_hour_of_day +StartHumanLoopRequest,start_human_loop_request +StartHumanLoopResponse,start_human_loop_response +StartICD10CMInferenceJobRequest,start_icd10_cm_inference_job_request +StartICD10CMInferenceJobResponse,start_icd10_cm_inference_job_response +StartImageBuilderRequest,start_image_builder_request +StartImageBuilderResult,start_image_builder_result +StartImagePipelineExecutionRequest,start_image_pipeline_execution_request +StartImagePipelineExecutionResponse,start_image_pipeline_execution_response +StartImageScanRequest,start_image_scan_request +StartImageScanResponse,start_image_scan_response +StartImportFileTaskRequest,start_import_file_task_request +StartImportFileTaskResponse,start_import_file_task_response +StartImportLabelsTaskRunRequest,start_import_labels_task_run_request +StartImportLabelsTaskRunResponse,start_import_labels_task_run_response +StartImportRequest,start_import_request +StartImportResponse,start_import_response +StartImportTaskRequest,start_import_task_request +StartImportTaskResponse,start_import_task_response +StartIncidentInput,start_incident_input +StartIncidentOutput,start_incident_output +StartInferenceExperimentRequest,start_inference_experiment_request +StartInferenceExperimentResponse,start_inference_experiment_response +StartInferenceSchedulerRequest,start_inference_scheduler_request +StartInferenceSchedulerResponse,start_inference_scheduler_response +StartIngestion,start_ingestion +StartIngestionRequest,start_ingestion_request +StartInputDeviceMaintenanceWindowRequest,start_input_device_maintenance_window_request +StartInputDeviceRequest,start_input_device_request +StartInstanceOnboardingJobRequest,start_instance_onboarding_job_request +StartInstanceOnboardingJobResponse,start_instance_onboarding_job_response +StartInstanceRefreshAnswer,start_instance_refresh_answer +StartInstanceRefreshType,start_instance_refresh_type +StartInstanceRequest,start_instance_request +StartInstanceResult,start_instance_result +StartInstancesRequest,start_instances_request +StartInstancesResult,start_instances_result +StartJobRequest,start_job_request +StartJobResult,start_job_result +StartJobRunRequest,start_job_run_request +StartJobRunResponse,start_job_run_response +StartKeyPhrasesDetectionJobRequest,start_key_phrases_detection_job_request +StartKeyPhrasesDetectionJobResponse,start_key_phrases_detection_job_response +StartKeyUsageInput,start_key_usage_input +StartKeyUsageOutput,start_key_usage_output +StartLabelDetectionRequest,start_label_detection_request +StartLabelDetectionResponse,start_label_detection_response +StartLambdaFunctionFailedEventAttributes,start_lambda_function_failed_event_attributes +StartLaunchRequest,start_launch_request +StartLaunchResponse,start_launch_response +StartLendingAnalysisRequest,start_lending_analysis_request +StartLendingAnalysisResponse,start_lending_analysis_response +StartLifecyclePolicyPreviewRequest,start_lifecycle_policy_preview_request +StartLifecyclePolicyPreviewResponse,start_lifecycle_policy_preview_response +StartLine,start_line +StartLoaderJobInput,start_loader_job_input +StartLoaderJobOutput,start_loader_job_output +StartLoggingRequest,start_logging_request +StartLoggingTime,start_logging_time +StartMLDataProcessingJobInput,start_ml_data_processing_job_input +StartMLDataProcessingJobOutput,start_ml_data_processing_job_output +StartMLEvaluationTaskRunRequest,start_ml_evaluation_task_run_request +StartMLEvaluationTaskRunResponse,start_ml_evaluation_task_run_response +StartMLLabelingSetGenerationTaskRunRequest,start_ml_labeling_set_generation_task_run_request +StartMLLabelingSetGenerationTaskRunResponse,start_ml_labeling_set_generation_task_run_response +StartMLModelTrainingJobInput,start_ml_model_training_job_input +StartMLModelTrainingJobOutput,start_ml_model_training_job_output +StartMLModelTransformJobInput,start_ml_model_transform_job_input +StartMLModelTransformJobOutput,start_ml_model_transform_job_output +StartMailboxExportJobRequest,start_mailbox_export_job_request +StartMailboxExportJobResponse,start_mailbox_export_job_response +StartMaintenanceRequest,start_maintenance_request +StartMaintenanceResponse,start_maintenance_response +StartMalwareScanRequest,start_malware_scan_request +StartMalwareScanResponse,start_malware_scan_response +StartMatchBackfillInput,start_match_backfill_input +StartMatchBackfillOutput,start_match_backfill_output +StartMatchingJobInput,start_matching_job_input +StartMatchingJobOutput,start_matching_job_output +StartMatchmakingInput,start_matchmaking_input +StartMatchmakingOutput,start_matchmaking_output +StartMedicalStreamTranscriptionRequest,start_medical_stream_transcription_request +StartMedicalStreamTranscriptionResponse,start_medical_stream_transcription_response +StartMedicalTranscriptionJobRequest,start_medical_transcription_job_request +StartMedicalTranscriptionJobResponse,start_medical_transcription_job_response +StartMeetingTranscriptionRequest,start_meeting_transcription_request +StartMessageMoveTaskRequest,start_message_move_task_request +StartMessageMoveTaskResult,start_message_move_task_result +StartMetadataModelAssessmentMessage,start_metadata_model_assessment_message +StartMetadataModelAssessmentResponse,start_metadata_model_assessment_response +StartMetadataModelConversionMessage,start_metadata_model_conversion_message +StartMetadataModelConversionResponse,start_metadata_model_conversion_response +StartMetadataModelExportAsScriptMessage,start_metadata_model_export_as_script_message +StartMetadataModelExportAsScriptResponse,start_metadata_model_export_as_script_response +StartMetadataModelExportToTargetMessage,start_metadata_model_export_to_target_message +StartMetadataModelExportToTargetResponse,start_metadata_model_export_to_target_response +StartMetadataModelImportMessage,start_metadata_model_import_message +StartMetadataModelImportResponse,start_metadata_model_import_response +StartMetricStreamsInput,start_metric_streams_input +StartMigrationMessage,start_migration_message +StartMigrationRequest,start_migration_request +StartMigrationResponse,start_migration_response +StartMigrationWorkflowRequest,start_migration_workflow_request +StartMigrationWorkflowResponse,start_migration_workflow_response +StartMinuteOfHour,start_minute_of_hour +StartMode,start_mode +StartModelPackagingJobRequest,start_model_packaging_job_request +StartModelPackagingJobResponse,start_model_packaging_job_response +StartModelRequest,start_model_request +StartModelResponse,start_model_response +StartMonitoringMemberRequest,start_monitoring_member_request +StartMonitoringMembersRequest,start_monitoring_members_request +StartMonitoringMembersResponse,start_monitoring_members_response +StartMonitoringScheduleRequest,start_monitoring_schedule_request +StartMulticastGroupSessionRequest,start_multicast_group_session_request +StartMultiplexRequest,start_multiplex_request +StartMultiplexResponse,start_multiplex_response +StartNetworkInsightsAccessScopeAnalysisRequest,start_network_insights_access_scope_analysis_request +StartNetworkInsightsAccessScopeAnalysisResult,start_network_insights_access_scope_analysis_result +StartNetworkInsightsAnalysisRequest,start_network_insights_analysis_request +StartNetworkInsightsAnalysisResult,start_network_insights_analysis_result +StartNetworkResourceUpdateRequest,start_network_resource_update_request +StartNetworkResourceUpdateResponse,start_network_resource_update_response +StartNextPendingJobExecutionRequest,start_next_pending_job_execution_request +StartNextPendingJobExecutionResponse,start_next_pending_job_execution_response +StartNotebookExecutionInput,start_notebook_execution_input +StartNotebookExecutionOutput,start_notebook_execution_output +StartNotebookInstanceInput,start_notebook_instance_input +StartObjectInput,start_object_input +StartObjectOutput,start_object_output +StartOnCreation,start_on_creation +StartOnDemandAppReplicationRequest,start_on_demand_app_replication_request +StartOnDemandAuditTaskRequest,start_on_demand_audit_task_request +StartOnDemandAuditTaskResponse,start_on_demand_audit_task_response +StartOnDemandReplicationRunRequest,start_on_demand_replication_run_request +StartOnDemandReplicationRunResponse,start_on_demand_replication_run_response +StartOrganizationServiceAccessUpdateRequest,start_organization_service_access_update_request +StartOrganizationServiceAccessUpdateResponse,start_organization_service_access_update_response +StartOutboundVoiceContactRequest,start_outbound_voice_contact_request +StartOutboundVoiceContactResponse,start_outbound_voice_contact_response +StartPHIDetectionJobRequest,start_phi_detection_job_request +StartPHIDetectionJobResponse,start_phi_detection_job_response +StartPercentage,start_percentage +StartPeriod,start_period +StartPersonTrackingRequest,start_person_tracking_request +StartPersonTrackingResponse,start_person_tracking_response +StartPiiEntitiesDetectionJobRequest,start_pii_entities_detection_job_request +StartPiiEntitiesDetectionJobResponse,start_pii_entities_detection_job_response +StartPipeRequest,start_pipe_request +StartPipeResponse,start_pipe_response +StartPipelineExecutionInput,start_pipeline_execution_input +StartPipelineExecutionOutput,start_pipeline_execution_output +StartPipelineExecutionRequest,start_pipeline_execution_request +StartPipelineExecutionResponse,start_pipeline_execution_response +StartPipelineReprocessingRequest,start_pipeline_reprocessing_request +StartPipelineReprocessingResponse,start_pipeline_reprocessing_response +StartPipelineRequest,start_pipeline_request +StartPipelineResponse,start_pipeline_response +StartPolicyGenerationRequest,start_policy_generation_request +StartPolicyGenerationResponse,start_policy_generation_response +StartPosition,start_position +StartProductSubscriptionRequest,start_product_subscription_request +StartProductSubscriptionResponse,start_product_subscription_response +StartProjectSessionRequest,start_project_session_request +StartProjectSessionResponse,start_project_session_response +StartProjectVersionRequest,start_project_version_request +StartProjectVersionResponse,start_project_version_response +StartProtectedQueryInput,start_protected_query_input +StartProtectedQueryOutput,start_protected_query_output +StartQueryExecutionInput,start_query_execution_input +StartQueryExecutionOutput,start_query_execution_output +StartQueryPlanningRequest,start_query_planning_request +StartQueryPlanningResponse,start_query_planning_response +StartQueryRequest,start_query_request +StartQueryResponse,start_query_response +StartReadSetActivationJobRequest,start_read_set_activation_job_request +StartReadSetActivationJobResponse,start_read_set_activation_job_response +StartReadSetActivationJobSourceItem,start_read_set_activation_job_source_item +StartReadSetExportJobRequest,start_read_set_export_job_request +StartReadSetExportJobResponse,start_read_set_export_job_response +StartReadSetImportJobRequest,start_read_set_import_job_request +StartReadSetImportJobResponse,start_read_set_import_job_response +StartReadSetImportJobSourceItem,start_read_set_import_job_source_item +StartRecommendationReportGenerationRequest,start_recommendation_report_generation_request +StartRecommendationReportGenerationResponse,start_recommendation_report_generation_response +StartRecommendationsRequest,start_recommendations_request +StartRecommendationsRequestEntry,start_recommendations_request_entry +StartRecommenderRequest,start_recommender_request +StartRecommenderResponse,start_recommender_response +StartRecordIdentifier,start_record_identifier +StartRecordName,start_record_name +StartRecordType,start_record_type +StartRecoveryRequest,start_recovery_request +StartRecoveryRequestSourceServer,start_recovery_request_source_server +StartRecoveryResponse,start_recovery_response +StartReferenceImportJobRequest,start_reference_import_job_request +StartReferenceImportJobResponse,start_reference_import_job_response +StartReferenceImportJobSourceItem,start_reference_import_job_source_item +StartRelationalDatabaseRequest,start_relational_database_request +StartRelationalDatabaseResult,start_relational_database_result +StartRemediationExecutionRequest,start_remediation_execution_request +StartRemediationExecutionResponse,start_remediation_execution_response +StartReplayRequest,start_replay_request +StartReplayResponse,start_replay_response +StartReplicationMessage,start_replication_message +StartReplicationRequest,start_replication_request +StartReplicationResponse,start_replication_response +StartReplicationTaskAssessmentMessage,start_replication_task_assessment_message +StartReplicationTaskAssessmentResponse,start_replication_task_assessment_response +StartReplicationTaskAssessmentRunMessage,start_replication_task_assessment_run_message +StartReplicationTaskAssessmentRunResponse,start_replication_task_assessment_run_response +StartReplicationTaskMessage,start_replication_task_message +StartReplicationTaskResponse,start_replication_task_response +StartReplicationTaskType,start_replication_task_type +StartReplicationType,start_replication_type +StartReportCreationInput,start_report_creation_input +StartReportJobInput,start_report_job_input +StartReportJobOutput,start_report_job_output +StartRequest,start_request +StartResourceEvaluationRequest,start_resource_evaluation_request +StartResourceEvaluationResponse,start_resource_evaluation_response +StartResourceScanRequest,start_resource_scan_request +StartRestoreJobInput,start_restore_job_input +StartRestoreJobOutput,start_restore_job_output +StartRetrainingSchedulerRequest,start_retraining_scheduler_request +StartRetrainingSchedulerResponse,start_retraining_scheduler_response +StartRouteAnalysisRequest,start_route_analysis_request +StartRouteAnalysisResponse,start_route_analysis_response +StartRowIndex,start_row_index +StartRunRequest,start_run_request +StartRunResponse,start_run_response +StartRxNormInferenceJobRequest,start_rx_norm_inference_job_request +StartRxNormInferenceJobResponse,start_rx_norm_inference_job_response +StartSNOMEDCTInferenceJobRequest,start_snomedct_inference_job_request +StartSNOMEDCTInferenceJobResponse,start_snomedct_inference_job_response +StartSavingsPlansPurchaseRecommendationGenerationResponse,start_savings_plans_purchase_recommendation_generation_response +StartSchemaCreationRequest,start_schema_creation_request +StartSchemaCreationResponse,start_schema_creation_response +StartSchemaExtensionRequest,start_schema_extension_request +StartSchemaExtensionResult,start_schema_extension_result +StartSchemaMergeRequest,start_schema_merge_request +StartSchemaMergeResponse,start_schema_merge_response +StartSegmentDetectionFilters,start_segment_detection_filters +StartSegmentDetectionRequest,start_segment_detection_request +StartSegmentDetectionResponse,start_segment_detection_response +StartSelector,start_selector +StartSelectorType,start_selector_type +StartSentimentDetectionJobRequest,start_sentiment_detection_job_request +StartSentimentDetectionJobResponse,start_sentiment_detection_job_response +StartServerRequest,start_server_request +StartServiceSoftwareUpdateRequest,start_service_software_update_request +StartServiceSoftwareUpdateResponse,start_service_software_update_response +StartSession,start_session +StartSessionRequest,start_session_request +StartSessionResponse,start_session_response +StartSessionResult,start_session_result +StartShotDetectionFilter,start_shot_detection_filter +StartSigningJobParameter,start_signing_job_parameter +StartSigningJobRequest,start_signing_job_request +StartSigningJobResponse,start_signing_job_response +StartSimulationInput,start_simulation_input +StartSimulationJobBatchRequest,start_simulation_job_batch_request +StartSimulationJobBatchResponse,start_simulation_job_batch_response +StartSimulationOutput,start_simulation_output +StartSingleWirelessDeviceImportTaskRequest,start_single_wireless_device_import_task_request +StartSingleWirelessDeviceImportTaskResponse,start_single_wireless_device_import_task_response +StartSmartHomeApplianceDiscoveryRequest,start_smart_home_appliance_discovery_request +StartSnapshotRequest,start_snapshot_request +StartSnapshotResponse,start_snapshot_response +StartSourceNetworkRecoveryRequest,start_source_network_recovery_request +StartSourceNetworkRecoveryRequestNetworkEntry,start_source_network_recovery_request_network_entry +StartSourceNetworkRecoveryResponse,start_source_network_recovery_response +StartSourceNetworkReplicationRequest,start_source_network_replication_request +StartSourceNetworkReplicationResponse,start_source_network_replication_response +StartSpeakerEnrollmentJobRequest,start_speaker_enrollment_job_request +StartSpeakerEnrollmentJobResponse,start_speaker_enrollment_job_response +StartSpeakerSearchTaskRequest,start_speaker_search_task_request +StartSpeakerSearchTaskResponse,start_speaker_search_task_response +StartSpeechSynthesisTaskInput,start_speech_synthesis_task_input +StartSpeechSynthesisTaskOutput,start_speech_synthesis_task_output +StartStackRequest,start_stack_request +StartStageDeploymentRequest,start_stage_deployment_request +StartStageDeploymentResult,start_stage_deployment_result +StartStreamEncryptionInput,start_stream_encryption_input +StartStreamProcessorRequest,start_stream_processor_request +StartStreamProcessorResponse,start_stream_processor_response +StartStreamTranscriptionRequest,start_stream_transcription_request +StartStreamTranscriptionResponse,start_stream_transcription_response +StartStreamingSessionRequest,start_streaming_session_request +StartStreamingSessionResponse,start_streaming_session_response +StartStudioSSOConfigurationRepairRequest,start_studio_sso_configuration_repair_request +StartStudioSSOConfigurationRepairResponse,start_studio_sso_configuration_repair_response +StartSubdivisionCode,start_subdivision_code +StartSuiteRunRequest,start_suite_run_request +StartSuiteRunResponse,start_suite_run_response +StartSupportDataExportRequest,start_support_data_export_request +StartSupportDataExportResult,start_support_data_export_result +StartSyncExecutionInput,start_sync_execution_input +StartSyncExecutionOutput,start_sync_execution_output +StartTableDataImportJobRequest,start_table_data_import_job_request +StartTableDataImportJobResult,start_table_data_import_job_result +StartTargetedSentimentDetectionJobRequest,start_targeted_sentiment_detection_job_request +StartTargetedSentimentDetectionJobResponse,start_targeted_sentiment_detection_job_response +StartTaskContactRequest,start_task_contact_request +StartTaskContactResponse,start_task_contact_response +StartTaskExecutionRequest,start_task_execution_request +StartTaskExecutionResponse,start_task_execution_response +StartTaskRequest,start_task_request +StartTaskResponse,start_task_response +StartTechnicalCueDetectionFilter,start_technical_cue_detection_filter +StartTestExecutionRequest,start_test_execution_request +StartTestExecutionResponse,start_test_execution_response +StartTestRequest,start_test_request +StartTestResponse,start_test_response +StartTestSetGenerationRequest,start_test_set_generation_request +StartTestSetGenerationResponse,start_test_set_generation_response +StartTextDetectionFilters,start_text_detection_filters +StartTextDetectionRequest,start_text_detection_request +StartTextDetectionResponse,start_text_detection_response +StartTextTranslationJobRequest,start_text_translation_job_request +StartTextTranslationJobResponse,start_text_translation_job_response +StartThingRegistrationTaskRequest,start_thing_registration_task_request +StartThingRegistrationTaskResponse,start_thing_registration_task_response +StartTime,start_time +StartTimeFilter,start_time_filter +StartTimeInclusive,start_time_inclusive +StartTimeMillis,start_time_millis +StartTimeOffset,start_time_offset +StartTimeRange,start_time_range +StartTimecode,start_timecode +StartTimecodeSMPTE,start_timecode_smpte +StartTimeout,start_timeout +StartTimerDecisionAttributes,start_timer_decision_attributes +StartTimerFailedEventAttributes,start_timer_failed_event_attributes +StartTimestamp,start_timestamp +StartTimestampMillis,start_timestamp_millis +StartTopicsDetectionJobRequest,start_topics_detection_job_request +StartTopicsDetectionJobResponse,start_topics_detection_job_response +StartTransaction,start_transaction +StartTransactionRequest,start_transaction_request +StartTransactionResponse,start_transaction_response +StartTransactionResult,start_transaction_result +StartTranscriptionJobRequest,start_transcription_job_request +StartTranscriptionJobResponse,start_transcription_job_response +StartTriggerRequest,start_trigger_request +StartTriggerResponse,start_trigger_response +StartUrl,start_url +StartUserAccessTasksRequest,start_user_access_tasks_request +StartUserAccessTasksResponse,start_user_access_tasks_response +StartUserImportJobRequest,start_user_import_job_request +StartUserImportJobResponse,start_user_import_job_response +StartValue,start_value +StartVariantImportRequest,start_variant_import_request +StartVariantImportResponse,start_variant_import_response +StartVectorEnrichmentJobInput,start_vector_enrichment_job_input +StartVectorEnrichmentJobOutput,start_vector_enrichment_job_output +StartViewerSessionRevocationRequest,start_viewer_session_revocation_request +StartVirtualMachinesMetadataSyncInput,start_virtual_machines_metadata_sync_input +StartVirtualMachinesMetadataSyncOutput,start_virtual_machines_metadata_sync_output +StartVoiceToneAnalysisTaskRequest,start_voice_tone_analysis_task_request +StartVoiceToneAnalysisTaskResponse,start_voice_tone_analysis_task_response +StartVpcEndpointServicePrivateDnsVerificationRequest,start_vpc_endpoint_service_private_dns_verification_request +StartVpcEndpointServicePrivateDnsVerificationResult,start_vpc_endpoint_service_private_dns_verification_result +StartWeekDay,start_week_day +StartWindowMinutes,start_window_minutes +StartWirelessDeviceImportTaskRequest,start_wireless_device_import_task_request +StartWirelessDeviceImportTaskResponse,start_wireless_device_import_task_response +StartWorkflowExecutionInput,start_workflow_execution_input +StartWorkflowRunRequest,start_workflow_run_request +StartWorkflowRunResponse,start_workflow_run_response +StartWorkspaceRequests,start_workspace_requests +StartWorkspacesRequest,start_workspaces_request +StartWorkspacesResult,start_workspaces_result +StartZonalShiftRequest,start_zonal_shift_request +Started,started +StartedAfter,started_after +StartedAt,started_at +StartedBefore,started_before +StartedBy,started_by +StartedOn,started_on +StartedTimestamp,started_timestamp +StartingAt,starting_at +StartingBlockIndex,starting_block_index +StartingEventBatchCondition,starting_event_batch_condition +StartingHashKey,starting_hash_key +StartingInstances,starting_instances +StartingObjectName,starting_object_name +StartingObjectPrefix,starting_object_prefix +StartingOffsets,starting_offsets +StartingPosition,starting_position +StartingPositionTimestamp,starting_position_timestamp +StartingSequenceNumber,starting_sequence_number +StartingTimestamp,starting_timestamp +StartoverWindowSeconds,startover_window_seconds +StartsWith,starts_with +StartupAction,startup_action +StartupScriptS3ObjectVersion,startup_script_s3_object_version +StartupScriptS3Path,startup_script_s3_path +Stat,stat +State,state +StateChangeConfiguration,state_change_configuration +StateChangeReason,state_change_reason +StateDB,state_db +StateDescription,state_description +StateEnteredEventDetails,state_entered_event_details +StateEquals,state_equals +StateExitedEventDetails,state_exited_event_details +StateFilter,state_filter +StateInfo,state_info +StateLastUpdatedDateTime,state_last_updated_date_time +StateMachineAliasListItem,state_machine_alias_list_item +StateMachineAlreadyExists,state_machine_already_exists +StateMachineArn,state_machine_arn +StateMachineDeleting,state_machine_deleting +StateMachineDoesNotExist,state_machine_does_not_exist +StateMachineLimitExceeded,state_machine_limit_exceeded +StateMachineListItem,state_machine_list_item +StateMachineTypeNotSupported,state_machine_type_not_supported +StateMachineVersionListItem,state_machine_version_list_item +StateMessage,state_message +StateOrProvince,state_or_province +StateOrRegion,state_or_region +StatePersistence,state_persistence +StatePersistenceConfigurations,state_persistence_configurations +StatePersistenceEnabled,state_persistence_enabled +StateReason,state_reason +StateReasonCode,state_reason_code +StateReasonData,state_reason_data +StateStartTimestamp,state_start_timestamp +StateTransitionReason,state_transition_reason +StateTransitionTime,state_transition_time +StateTransitionedTimestamp,state_transitioned_timestamp +StateUpdatedTimestamp,state_updated_timestamp +StateValue,state_value +StatefulDefaultActions,stateful_default_actions +StatefulEngineOptions,stateful_engine_options +StatefulRule,stateful_rule +StatefulRuleGroup,stateful_rule_group +StatefulRuleGroupOverride,stateful_rule_group_override +StatefulRuleGroupReference,stateful_rule_group_reference +StatefulRuleGroupReferences,stateful_rule_group_references +StatefulRuleGroups,stateful_rule_groups +StatefulRuleOptions,stateful_rule_options +StatefulRules,stateful_rules +StatelessCustomActionDefinition,stateless_custom_action_definition +StatelessCustomActions,stateless_custom_actions +StatelessCustomPublishMetricAction,stateless_custom_publish_metric_action +StatelessCustomPublishMetricActionDimension,stateless_custom_publish_metric_action_dimension +StatelessDefaultActions,stateless_default_actions +StatelessFragmentDefaultActions,stateless_fragment_default_actions +StatelessRule,stateless_rule +StatelessRuleGroup,stateless_rule_group +StatelessRuleGroupReference,stateless_rule_group_reference +StatelessRuleGroupReferences,stateless_rule_group_references +StatelessRuleGroups,stateless_rule_groups +StatelessRules,stateless_rules +StatelessRulesAndCustomActions,stateless_rules_and_custom_actions +Statement,statement +StatementData,statement_data +StatementId,statement_id +StatementName,statement_name +StatementOutput,statement_output +StatementOutputData,statement_output_data +StatementTimeoutException,statement_timeout_exception +StatementType,statement_type +Statements,statements +States,states +StatesArn,states_arn +StatesExecutionArn,states_execution_arn +StatesInput,states_input +StatesStatus,states_status +StaticColumn,static_column +StaticConfiguration,static_configuration +StaticHyperParameters,static_hyper_parameters +StaticImageActivateScheduleActionSettings,static_image_activate_schedule_action_settings +StaticImageActivateSettings,static_image_activate_settings +StaticImageDeactivateScheduleActionSettings,static_image_deactivate_schedule_action_settings +StaticImageDeactivateSettings,static_image_deactivate_settings +StaticIp,static_ip +StaticIpConnectionInfo,static_ip_connection_info +StaticKeyProvider,static_key_provider +StaticKeySettings,static_key_settings +StaticKeyValue,static_key_value +StaticMembers,static_members +StaticPolicyDefinition,static_policy_definition +StaticPolicyDefinitionDetail,static_policy_definition_detail +StaticPolicyDefinitionItem,static_policy_definition_item +StaticRoutesOnly,static_routes_only +StaticSourcesSupport,static_sources_support +StaticValue,static_value +StaticValues,static_values +Station,station +Statistic,statistic +StatisticOverride,statistic_override +StatisticSet,statistic_set +StatisticValues,statistic_values +StatisticalThreshold,statistical_threshold +Statistics,statistics +StatisticsConfiguration,statistics_configuration +StatisticsConfigurations,statistics_configurations +StatisticsData,statistics_data +StatisticsNotAvailableException,statistics_not_available_exception +StatisticsNotReadyYetException,statistics_not_ready_yet_exception +StatisticsResource,statistics_resource +StatisticsSummary,statistics_summary +StatisticsType,statistics_type +StatmuxSettings,statmux_settings +Stats,stats +StatsAtAnomaly,stats_at_anomaly +StatsAtBaseline,stats_at_baseline +StatsEvent,stats_event +Status,status +Status2xx,status2xx +Status3xx,status3xx +Status4xx,status4xx +Status5xx,status5xx +StatusArn,status_arn +StatusChangeDate,status_change_date +StatusCode,status_code +StatusCodes,status_codes +StatusDescription,status_description +StatusDetail,status_detail +StatusDetailFilters,status_detail_filters +StatusDetails,status_details +StatusEquals,status_equals +StatusFilter,status_filter +StatusFlag,status_flag +StatusInformation,status_information +StatusInfos,status_infos +StatusLastUpdatedDateTime,status_last_updated_date_time +StatusList,status_list +StatusMessage,status_message +StatusMessageCode,status_message_code +StatusName,status_name +StatusReason,status_reason +StatusReasonCode,status_reason_code +StatusReasons,status_reasons +StatusReport,status_report +StatusStartTime,status_start_time +StatusStartTimestamp,status_start_timestamp +StatusType,status_type +StatusUpdateInterval,status_update_interval +StatusUpdateReason,status_update_reason +Statuses,statuses +StdDev,std_dev +StdErrorS3Uri,std_error_s3_uri +StdEvent,std_event +StdOutS3Uri,std_out_s3_uri +Stddev,stddev +StemmingDictionary,stemming_dictionary +Step,step +StepAdjustment,step_adjustment +StepAdjustments,step_adjustments +StepAutomationConfiguration,step_automation_configuration +StepCancellationOption,step_cancellation_option +StepConcurrencyLevel,step_concurrency_level +StepConfig,step_config +StepCount,step_count +StepDescription,step_description +StepDetail,step_detail +StepDetails,step_details +StepDisplayName,step_display_name +StepExecution,step_execution +StepExecutionFilter,step_execution_filter +StepExecutionId,step_execution_id +StepExecutionStatusDetail,step_execution_status_detail +StepExecutions,step_executions +StepExecutionsTruncated,step_executions_truncated +StepFunctionStateMachineParameters,step_function_state_machine_parameters +StepFunctions,step_functions +StepFunctionsAction,step_functions_action +StepId,step_id +StepIds,step_ids +StepIndex,step_index +StepInfo,step_info +StepName,step_name +StepOutput,step_output +StepScalingPolicyConfiguration,step_scaling_policy_configuration +StepSize,step_size +StepStateChangeReason,step_state_change_reason +StepStates,step_states +StepStatus,step_status +StepSummary,step_summary +StepTimeline,step_timeline +StepType,step_type +Steps,steps +StepsCompleted,steps_completed +StepsList,steps_list +StereoDownmix,stereo_downmix +StillContainsLinksException,still_contains_links_exception +StillEstimating,still_estimating +StillWaitingResponseSpecification,still_waiting_response_specification +StopAccessLoggingInput,stop_access_logging_input +StopAction,stop_action +StopActivityStreamRequest,stop_activity_stream_request +StopActivityStreamResponse,stop_activity_stream_response +StopAppBlockBuilderRequest,stop_app_block_builder_request +StopAppBlockBuilderResult,stop_app_block_builder_result +StopAppInput,stop_app_input +StopAppReplicationRequest,stop_app_replication_request +StopApplicationRequest,stop_application_request +StopAssessmentRequest,stop_assessment_request +StopAssessmentRunRequest,stop_assessment_run_request +StopAutoMLJobRequest,stop_auto_ml_job_request +StopAutomationExecutionRequest,stop_automation_execution_request +StopBackupJobInput,stop_backup_job_input +StopBgpFailoverTestRequest,stop_bgp_failover_test_request +StopBgpFailoverTestResponse,stop_bgp_failover_test_response +StopBotRecommendationRequest,stop_bot_recommendation_request +StopBotRecommendationResponse,stop_bot_recommendation_response +StopBuildBatchInput,stop_build_batch_input +StopBuildBatchOutput,stop_build_batch_output +StopBuildInput,stop_build_input +StopBuildOutput,stop_build_output +StopBulkDeploymentRequest,stop_bulk_deployment_request +StopCalculationExecutionRequest,stop_calculation_execution_request +StopCalculationExecutionResponse,stop_calculation_execution_response +StopCampaignRequest,stop_campaign_request +StopCanaryRequest,stop_canary_request +StopChannelRequest,stop_channel_request +StopChannelResponse,stop_channel_response +StopClockInput,stop_clock_input +StopCompilationJobRequest,stop_compilation_job_request +StopConfigurationRecorderRequest,stop_configuration_recorder_request +StopContactRecordingRequest,stop_contact_recording_request +StopContactRequest,stop_contact_request +StopContactStreamingRequest,stop_contact_streaming_request +StopContinuousExportRequest,stop_continuous_export_request +StopContinuousExportResponse,stop_continuous_export_response +StopCrawlerRequest,stop_crawler_request +StopCrawlerScheduleRequest,stop_crawler_schedule_request +StopDBClusterMessage,stop_db_cluster_message +StopDBClusterResult,stop_db_cluster_result +StopDBInstanceAutomatedBackupsReplicationMessage,stop_db_instance_automated_backups_replication_message +StopDBInstanceAutomatedBackupsReplicationResult,stop_db_instance_automated_backups_replication_result +StopDBInstanceMessage,stop_db_instance_message +StopDBInstanceResult,stop_db_instance_result +StopDataCollectionByAgentIdsRequest,stop_data_collection_by_agent_ids_request +StopDataCollectionByAgentIdsResponse,stop_data_collection_by_agent_ids_response +StopDataSourceSyncJobRequest,stop_data_source_sync_job_request +StopDate,stop_date +StopDeliveryStreamEncryptionInput,stop_delivery_stream_encryption_input +StopDeploymentInput,stop_deployment_input +StopDeploymentOutput,stop_deployment_output +StopDeploymentRequest,stop_deployment_request +StopDevEnvironmentRequest,stop_dev_environment_request +StopDevEnvironmentResponse,stop_dev_environment_response +StopDevEnvironmentSessionRequest,stop_dev_environment_session_request +StopDevEnvironmentSessionResponse,stop_dev_environment_session_response +StopDiscovererRequest,stop_discoverer_request +StopDiscovererResponse,stop_discoverer_response +StopDiscoveryJobRequest,stop_discovery_job_request +StopDominantLanguageDetectionJobRequest,stop_dominant_language_detection_job_request +StopDominantLanguageDetectionJobResponse,stop_dominant_language_detection_job_response +StopEarthObservationJobInput,stop_earth_observation_job_input +StopEdgeDeploymentStageRequest,stop_edge_deployment_stage_request +StopEdgePackagingJobRequest,stop_edge_packaging_job_request +StopEngagementRequest,stop_engagement_request +StopEntitiesDetectionJobRequest,stop_entities_detection_job_request +StopEntitiesDetectionJobResponse,stop_entities_detection_job_response +StopEntitiesDetectionV2JobRequest,stop_entities_detection_v2_job_request +StopEntitiesDetectionV2JobResponse,stop_entities_detection_v2_job_response +StopEventDataStoreIngestionRequest,stop_event_data_store_ingestion_request +StopEventsDetectionJobRequest,stop_events_detection_job_request +StopEventsDetectionJobResponse,stop_events_detection_job_response +StopExecutionInput,stop_execution_input +StopExecutionOutput,stop_execution_output +StopExecutionTrigger,stop_execution_trigger +StopExperimentRequest,stop_experiment_request +StopExperimentResponse,stop_experiment_response +StopFailbackRequest,stop_failback_request +StopFailed,stop_failed +StopFleetActionsInput,stop_fleet_actions_input +StopFleetActionsOutput,stop_fleet_actions_output +StopFleetRequest,stop_fleet_request +StopFlowRequest,stop_flow_request +StopFlowResponse,stop_flow_response +StopGUISessionRequest,stop_gui_session_request +StopGUISessionResult,stop_gui_session_result +StopGameSessionPlacementInput,stop_game_session_placement_input +StopGameSessionPlacementOutput,stop_game_session_placement_output +StopHumanLoopRequest,stop_human_loop_request +StopHyperParameterTuningJobRequest,stop_hyper_parameter_tuning_job_request +StopICD10CMInferenceJobRequest,stop_icd10_cm_inference_job_request +StopICD10CMInferenceJobResponse,stop_icd10_cm_inference_job_response +StopImageBuilderRequest,stop_image_builder_request +StopImageBuilderResult,stop_image_builder_result +StopImportRequest,stop_import_request +StopImportResponse,stop_import_response +StopInferenceExperimentRequest,stop_inference_experiment_request +StopInferenceExperimentResponse,stop_inference_experiment_response +StopInferenceRecommendationsJobRequest,stop_inference_recommendations_job_request +StopInferenceSchedulerRequest,stop_inference_scheduler_request +StopInferenceSchedulerResponse,stop_inference_scheduler_response +StopIngestionRequest,stop_ingestion_request +StopInputDeviceRequest,stop_input_device_request +StopInstanceOnIdleRequest,stop_instance_on_idle_request +StopInstanceRequest,stop_instance_request +StopInstanceResult,stop_instance_result +StopInstancesRequest,stop_instances_request +StopInstancesResult,stop_instances_result +StopJobOnFailureOptions,stop_job_on_failure_options +StopJobOnFailureTiming,stop_job_on_failure_timing +StopJobRequest,stop_job_request +StopJobResult,stop_job_result +StopJobRunRequest,stop_job_run_request +StopJobRunResponse,stop_job_run_response +StopKeyPhrasesDetectionJobRequest,stop_key_phrases_detection_job_request +StopKeyPhrasesDetectionJobResponse,stop_key_phrases_detection_job_response +StopKeyUsageInput,stop_key_usage_input +StopKeyUsageOutput,stop_key_usage_output +StopLabelingJobRequest,stop_labeling_job_request +StopLaunchRequest,stop_launch_request +StopLaunchResponse,stop_launch_response +StopLoggingRequest,stop_logging_request +StopLoggingTime,stop_logging_time +StopMatchmakingInput,stop_matchmaking_input +StopMeetingTranscriptionRequest,stop_meeting_transcription_request +StopMetricStreamsInput,stop_metric_streams_input +StopMigrationWorkflowRequest,stop_migration_workflow_request +StopMigrationWorkflowResponse,stop_migration_workflow_response +StopModelCustomizationJobRequest,stop_model_customization_job_request +StopModelRequest,stop_model_request +StopModelResponse,stop_model_response +StopMonitoringMembersRequest,stop_monitoring_members_request +StopMonitoringMembersResponse,stop_monitoring_members_response +StopMonitoringScheduleRequest,stop_monitoring_schedule_request +StopMultiplexRequest,stop_multiplex_request +StopMultiplexResponse,stop_multiplex_response +StopNotebookExecutionInput,stop_notebook_execution_input +StopNotebookInstanceInput,stop_notebook_instance_input +StopPHIDetectionJobRequest,stop_phi_detection_job_request +StopPHIDetectionJobResponse,stop_phi_detection_job_response +StopPiiEntitiesDetectionJobRequest,stop_pii_entities_detection_job_request +StopPiiEntitiesDetectionJobResponse,stop_pii_entities_detection_job_response +StopPipeRequest,stop_pipe_request +StopPipeResponse,stop_pipe_response +StopPipelineExecutionInput,stop_pipeline_execution_input +StopPipelineExecutionOutput,stop_pipeline_execution_output +StopPipelineExecutionRequest,stop_pipeline_execution_request +StopPipelineExecutionResponse,stop_pipeline_execution_response +StopPipelineRequest,stop_pipeline_request +StopPipelineResponse,stop_pipeline_response +StopProcessingJobRequest,stop_processing_job_request +StopProductSubscriptionRequest,stop_product_subscription_request +StopProductSubscriptionResponse,stop_product_subscription_response +StopProjectVersionRequest,stop_project_version_request +StopProjectVersionResponse,stop_project_version_response +StopQueryExecutionInput,stop_query_execution_input +StopQueryRequest,stop_query_request +StopQueryResponse,stop_query_response +StopReason,stop_reason +StopRecommenderRequest,stop_recommender_request +StopRecommenderResponse,stop_recommender_response +StopRelationalDatabaseRequest,stop_relational_database_request +StopRelationalDatabaseResult,stop_relational_database_result +StopRemoteAccessSessionRequest,stop_remote_access_session_request +StopRemoteAccessSessionResult,stop_remote_access_session_result +StopReplicationMessage,stop_replication_message +StopReplicationRequest,stop_replication_request +StopReplicationResponse,stop_replication_response +StopReplicationTaskMessage,stop_replication_task_message +StopReplicationTaskResponse,stop_replication_task_response +StopReplicationToReplicaRequest,stop_replication_to_replica_request +StopReplicationToReplicaResponse,stop_replication_to_replica_response +StopRequest,stop_request +StopResourceRequest,stop_resource_request +StopRetrainingSchedulerRequest,stop_retraining_scheduler_request +StopRetrainingSchedulerResponse,stop_retraining_scheduler_response +StopRunRequest,stop_run_request +StopRunResult,stop_run_result +StopRxNormInferenceJobRequest,stop_rx_norm_inference_job_request +StopRxNormInferenceJobResponse,stop_rx_norm_inference_job_response +StopSNOMEDCTInferenceJobRequest,stop_snomedct_inference_job_request +StopSNOMEDCTInferenceJobResponse,stop_snomedct_inference_job_response +StopSelector,stop_selector +StopSentimentDetectionJobRequest,stop_sentiment_detection_job_request +StopSentimentDetectionJobResponse,stop_sentiment_detection_job_response +StopServerRequest,stop_server_request +StopSessionRequest,stop_session_request +StopSessionResponse,stop_session_response +StopSimulationInput,stop_simulation_input +StopSolutionVersionCreationRequest,stop_solution_version_creation_request +StopSourceNetworkReplicationRequest,stop_source_network_replication_request +StopSourceNetworkReplicationResponse,stop_source_network_replication_response +StopSpeakerSearchTaskRequest,stop_speaker_search_task_request +StopStackRequest,stop_stack_request +StopStackSetOperationInput,stop_stack_set_operation_input +StopStreamEncryptionInput,stop_stream_encryption_input +StopStreamProcessorRequest,stop_stream_processor_request +StopStreamRequest,stop_stream_request +StopStreamingSessionRequest,stop_streaming_session_request +StopStreamingSessionResponse,stop_streaming_session_response +StopSuiteRunRequest,stop_suite_run_request +StopTargetedSentimentDetectionJobRequest,stop_targeted_sentiment_detection_job_request +StopTargetedSentimentDetectionJobResponse,stop_targeted_sentiment_detection_job_response +StopTaskRequest,stop_task_request +StopTaskResponse,stop_task_response +StopTextTranslationJobRequest,stop_text_translation_job_request +StopTextTranslationJobResponse,stop_text_translation_job_response +StopThingRegistrationTaskRequest,stop_thing_registration_task_request +StopTime,stop_time +StopTimecode,stop_timecode +StopTimeout,stop_timeout +StopTimestamp,stop_timestamp +StopTrainingDocumentClassifierRequest,stop_training_document_classifier_request +StopTrainingEntityRecognizerRequest,stop_training_entity_recognizer_request +StopTrainingJobRequest,stop_training_job_request +StopTransformJobRequest,stop_transform_job_request +StopTriggerRequest,stop_trigger_request +StopTriggerResponse,stop_trigger_response +StopUserImportJobRequest,stop_user_import_job_request +StopUserImportJobResponse,stop_user_import_job_response +StopVectorEnrichmentJobInput,stop_vector_enrichment_job_input +StopVoiceToneAnalysisTaskRequest,stop_voice_tone_analysis_task_request +StopWorkflowRunRequest,stop_workflow_run_request +StopWorkspaceRequests,stop_workspace_requests +StopWorkspacesRequest,stop_workspaces_request +StopWorkspacesResult,stop_workspaces_result +Stopped,stopped +StoppedActions,stopped_actions +StoppedSince,stopped_since +Stopping,stopping +StoppingCondition,stopping_condition +StoppingConditions,stopping_conditions +StoppingInstances,stopping_instances +Stops,stops +Stopwords,stopwords +Storage,storage +StorageAllocatedInBytes,storage_allocated_in_bytes +StorageCapacity,storage_capacity +StorageCapacityQuotaGiB,storage_capacity_quota_gib +StorageCapacityReservationGiB,storage_capacity_reservation_gib +StorageCapacityUnits,storage_capacity_units +StorageClass,storage_class +StorageClassAnalysis,storage_class_analysis +StorageClassAnalysisDataExport,storage_class_analysis_data_export +StorageConfig,storage_config +StorageConfigs,storage_configs +StorageConfiguration,storage_configuration +StorageConnector,storage_connector +StorageConnectors,storage_connectors +StorageDescriptor,storage_descriptor +StorageEfficiencyEnabled,storage_efficiency_enabled +StorageEncrypted,storage_encrypted +StorageGB,storage_gb +StorageGatewayError,storage_gateway_error +StorageInfo,storage_info +StorageIops,storage_iops +StorageJobId,storage_job_id +StorageLensArn,storage_lens_arn +StorageLensAwsOrg,storage_lens_aws_org +StorageLensConfiguration,storage_lens_configuration +StorageLensConfigurationList,storage_lens_configuration_list +StorageLensDataExport,storage_lens_data_export +StorageLensDataExportEncryption,storage_lens_data_export_encryption +StorageLensTag,storage_lens_tag +StorageLimit,storage_limit +StorageLimitExceededException,storage_limit_exceeded_exception +StorageLimitWillExceedException,storage_limit_will_exceed_exception +StorageLocation,storage_location +StorageMetrics,storage_metrics +StorageMode,storage_mode +StorageOptimizer,storage_optimizer +StorageOptimizerConfig,storage_optimizer_config +StorageOptimizerList,storage_optimizer_list +StorageOptimizerType,storage_optimizer_type +StorageQuotaExceededFault,storage_quota_exceeded_fault +StorageResolution,storage_resolution +StorageRule,storage_rule +StorageRuleType,storage_rule_type +StorageSize,storage_size +StorageSubTypeName,storage_sub_type_name +StorageSystemArn,storage_system_arn +StorageSystemListEntry,storage_system_list_entry +StorageSystems,storage_systems +StorageThroughput,storage_throughput +StorageThroughputToIopsRatio,storage_throughput_to_iops_ratio +StorageTier,storage_tier +StorageType,storage_type +StorageTypeLimit,storage_type_limit +StorageTypeLimits,storage_type_limits +StorageTypeName,storage_type_name +StorageTypeNotAvailableFault,storage_type_not_available_fault +StorageTypeNotSupportedFault,storage_type_not_supported_fault +StorageTypes,storage_types +StorageUnit,storage_unit +StorageUtilizedInBytes,storage_utilized_in_bytes +StorageVirtualMachine,storage_virtual_machine +StorageVirtualMachineArn,storage_virtual_machine_arn +StorageVirtualMachineFilter,storage_virtual_machine_filter +StorageVirtualMachineId,storage_virtual_machine_id +StorageVirtualMachineIds,storage_virtual_machine_ids +StorageVirtualMachineNotFound,storage_virtual_machine_not_found +StorageVirtualMachineRoot,storage_virtual_machine_root +StorageVirtualMachines,storage_virtual_machines +StorageVolumeType,storage_volume_type +StoreImageTaskResult,store_image_task_result +StoreImageTaskResults,store_image_task_results +StoreTaskFailureReason,store_task_failure_reason +StoreTaskState,store_task_state +StoredAsSubDirectories,stored_as_sub_directories +StoredQuery,stored_query +StoredQueryMetadata,stored_query_metadata +StorediSCSIVolume,storedi_scsi_volume +StorediSCSIVolumes,storedi_scsi_volumes +Strategy,strategy +StrategyConfig,strategy_config +StrategyOnFullSize,strategy_on_full_size +StrategyOption,strategy_option +StrategySummary,strategy_summary +Stream,stream +StreamARN,stream_arn +StreamArn,stream_arn +StreamChannelDefinition,stream_channel_definition +StreamConfiguration,stream_configuration +StreamConfigurationCreate,stream_configuration_create +StreamConfigurationSessionBackup,stream_configuration_session_backup +StreamConfigurationSessionStorage,stream_configuration_session_storage +StreamCreationTimestamp,stream_creation_timestamp +StreamDescription,stream_description +StreamDescriptionSummary,stream_description_summary +StreamEdgeConfigurationNotFoundException,stream_edge_configuration_not_found_exception +StreamEnabled,stream_enabled +StreamEncryption,stream_encryption +StreamEvent,stream_event +StreamExceptionPolicy,stream_exception_policy +StreamFile,stream_file +StreamFilters,stream_filters +StreamId,stream_id +StreamInfResolution,stream_inf_resolution +StreamInfo,stream_info +StreamInfoList,stream_info_list +StreamJournalToKinesisRequest,stream_journal_to_kinesis_request +StreamJournalToKinesisResponse,stream_journal_to_kinesis_response +StreamKey,stream_key +StreamKeySummary,stream_key_summary +StreamLabel,stream_label +StreamManifestBehavior,stream_manifest_behavior +StreamMode,stream_mode +StreamModeDetails,stream_mode_details +StreamName,stream_name +StreamNameCondition,stream_name_condition +StreamNames,stream_names +StreamOrder,stream_order +StreamProcessingStartSelector,stream_processing_start_selector +StreamProcessingStopSelector,stream_processing_stop_selector +StreamProcessor,stream_processor +StreamProcessorArn,stream_processor_arn +StreamProcessorDataSharingPreference,stream_processor_data_sharing_preference +StreamProcessorInput,stream_processor_input +StreamProcessorNotificationChannel,stream_processor_notification_channel +StreamProcessorOutput,stream_processor_output +StreamProcessorSettings,stream_processor_settings +StreamProcessorSettingsForUpdate,stream_processor_settings_for_update +StreamProcessors,stream_processors +StreamRecord,stream_record +StreamRecordsNotFoundException,stream_records_not_found_exception +StreamSelection,stream_selection +StreamSession,stream_session +StreamSessionSummary,stream_session_summary +StreamSpecification,stream_specification +StreamStatus,stream_status +StreamSummaries,stream_summaries +StreamSummary,stream_summary +StreamType,stream_type +StreamUnavailable,stream_unavailable +StreamUrl,stream_url +StreamView,stream_view +StreamViewType,stream_view_type +StreamingConfiguration,streaming_configuration +StreamingConfigurations,streaming_configurations +StreamingDataPreviewOptions,streaming_data_preview_options +StreamingDistribution,streaming_distribution +StreamingDistributionAlreadyExists,streaming_distribution_already_exists +StreamingDistributionConfig,streaming_distribution_config +StreamingDistributionConfigWithTags,streaming_distribution_config_with_tags +StreamingDistributionList,streaming_distribution_list +StreamingDistributionNotDisabled,streaming_distribution_not_disabled +StreamingDistributionSummary,streaming_distribution_summary +StreamingEndpointArn,streaming_endpoint_arn +StreamingExperienceSettings,streaming_experience_settings +StreamingId,streaming_id +StreamingImage,streaming_image +StreamingImageEncryptionConfiguration,streaming_image_encryption_configuration +StreamingLoggingConfig,streaming_logging_config +StreamingNotificationTarget,streaming_notification_target +StreamingNotificationTargets,streaming_notification_targets +StreamingOptions,streaming_options +StreamingSession,streaming_session +StreamingSessionBackup,streaming_session_backup +StreamingSessionStorageRoot,streaming_session_storage_root +StreamingSessionStream,streaming_session_stream +StreamingStatus,streaming_status +StreamingURL,streaming_url +Streams,streams +Street,street +Street1,street1 +Street2,street2 +Street3,street3 +StreetAddress,street_address +StreetInfo,street_info +StreetNumber,street_number +Strength,strength +StrictTransportSecurity,strict_transport_security +StringAttributeConstraints,string_attribute_constraints +StringAttributeConstraintsType,string_attribute_constraints_type +StringColumnStatisticsData,string_column_statistics_data +StringCondition,string_condition +StringDatasetParameter,string_dataset_parameter +StringDatasetParameterDefaultValues,string_dataset_parameter_default_values +StringDefaultValues,string_default_values +StringEquals,string_equals +StringFilter,string_filter +StringFormatConfiguration,string_format_configuration +StringLike,string_like +StringListValue,string_list_value +StringListValues,string_list_values +StringNotEquals,string_not_equals +StringNotLike,string_not_like +StringParameter,string_parameter +StringParameterDeclaration,string_parameter_declaration +StringParameters,string_parameters +StringReference,string_reference +StringStaticValues,string_static_values +StringValue,string_value +StringValueList,string_value_list +StringValueWhenUnsetConfiguration,string_value_when_unset_configuration +StringValues,string_values +StripeSizeBytes,stripe_size_bytes +StrongKeyProtectionRequired,strong_key_protection_required +StructValue,struct_value +StructuredLogDestinations,structured_log_destinations +Studio,studio +StudioArn,studio_arn +StudioComponent,studio_component +StudioComponentInitializationScript,studio_component_initialization_script +StudioComponentSummary,studio_component_summary +StudioEncryptionConfiguration,studio_encryption_configuration +StudioId,studio_id +StudioLifecycleConfigAppType,studio_lifecycle_config_app_type +StudioLifecycleConfigArn,studio_lifecycle_config_arn +StudioLifecycleConfigContent,studio_lifecycle_config_content +StudioLifecycleConfigDetails,studio_lifecycle_config_details +StudioLifecycleConfigName,studio_lifecycle_config_name +StudioLifecycleConfigs,studio_lifecycle_configs +StudioMembership,studio_membership +StudioSummary,studio_summary +Studios,studios +Style,style +StyleConfiguration,style_configuration +StyleControl,style_control +StyleOptions,style_options +StylePassthrough,style_passthrough +StyleTargets,style_targets +SubBands,sub_bands +SubChannelId,sub_channel_id +SubChannelSummary,sub_channel_summary +SubChannels,sub_channels +SubDomain,sub_domain +SubDomainSetting,sub_domain_setting +SubErrorCode,sub_error_code +SubErrorCodeReason,sub_error_code_reason +SubExpressions,sub_expressions +SubJobMetadata,sub_job_metadata +SubModule,sub_module +SubRegion,sub_region +SubResourceSummary,sub_resource_summary +SubResources,sub_resources +SubSegmentNum,sub_segment_num +SubSegmentsExpected,sub_segments_expected +SubSlotSetting,sub_slot_setting +SubSlotTypeComposition,sub_slot_type_composition +SubSlotValueElicitationSetting,sub_slot_value_elicitation_setting +SubStages,sub_stages +SubStatementData,sub_statement_data +SubStatements,sub_statements +SubType,sub_type +SubTypeCountLimitExceededException,sub_type_count_limit_exceeded_exception +SubTypeName,sub_type_name +Subdirectory,subdirectory +Subdivision,subdivision +SubdivisionCode,subdivision_code +SubdivisionName,subdivision_name +SubgopLength,subgop_length +Subject,subject +SubjectAlternativeNameMatchers,subject_alternative_name_matchers +SubjectAlternativeNameSummaries,subject_alternative_name_summaries +SubjectAlternativeNames,subject_alternative_names +SubjectDetail,subject_detail +SubjectDetailResponse,subject_detail_response +SubjectFromWebIdentityToken,subject_from_web_identity_token +SubjectId,subject_id +SubjectInformationAccess,subject_information_access +SubjectKey,subject_key +SubjectNameFlags,subject_name_flags +SubjectNameFlagsV2,subject_name_flags_v2 +SubjectNameFlagsV3,subject_name_flags_v3 +SubjectNameFlagsV4,subject_name_flags_v4 +SubjectPart,subject_part +SubjectStructure,subject_structure +SubjectSummary,subject_summary +SubjectType,subject_type +SubmissionDateTime,submission_date_time +SubmitAttachmentStateChangesRequest,submit_attachment_state_changes_request +SubmitAttachmentStateChangesResponse,submit_attachment_state_changes_response +SubmitContactEvaluationRequest,submit_contact_evaluation_request +SubmitContactEvaluationResponse,submit_contact_evaluation_response +SubmitContainerStateChangeRequest,submit_container_state_change_request +SubmitContainerStateChangeResponse,submit_container_state_change_response +SubmitFeedbackRequest,submit_feedback_request +SubmitJobRequest,submit_job_request +SubmitJobResponse,submit_job_response +SubmitMultiRegionAccessPointRoutesRequest,submit_multi_region_access_point_routes_request +SubmitTaskStateChangeRequest,submit_task_state_change_request +SubmitTaskStateChangeResponse,submit_task_state_change_response +SubmitTime,submit_time +SubmitTimeAfter,submit_time_after +SubmitTimeBefore,submit_time_before +SubmitTimeMillis,submit_time_millis +SubmittedAfter,submitted_after +SubmittedAfterTime,submitted_after_time +SubmittedAt,submitted_at +SubmittedBefore,submitted_before +SubmittedBeforeTime,submitted_before_time +SubmittedDate,submitted_date +SubmittedJobsCount,submitted_jobs_count +SubmittedSince,submitted_since +SubmittedTime,submitted_time +Subnet,subnet +SubnetAlreadyInUse,subnet_already_in_use +SubnetArn,subnet_arn +SubnetArns,subnet_arns +SubnetAssociation,subnet_association +SubnetAvailabilityZone,subnet_availability_zone +SubnetAvailabilityZoneId,subnet_availability_zone_id +SubnetChangeProtection,subnet_change_protection +SubnetCidrBlockState,subnet_cidr_block_state +SubnetCidrReservation,subnet_cidr_reservation +SubnetCidrReservationId,subnet_cidr_reservation_id +SubnetConfiguration,subnet_configuration +SubnetConfigurations,subnet_configurations +SubnetGroup,subnet_group +SubnetGroupAlreadyExistsFault,subnet_group_already_exists_fault +SubnetGroupIdentifier,subnet_group_identifier +SubnetGroupInUseFault,subnet_group_in_use_fault +SubnetGroupName,subnet_group_name +SubnetGroupNames,subnet_group_names +SubnetGroupNotFoundFault,subnet_group_not_found_fault +SubnetGroupQuotaExceededFault,subnet_group_quota_exceeded_fault +SubnetGroupStatus,subnet_group_status +SubnetGroups,subnet_groups +SubnetIPAddressLimitReachedException,subnet_ip_address_limit_reached_exception +SubnetId,subnet_id +SubnetIdList,subnet_id_list +SubnetIdUpdates,subnet_id_updates +SubnetIdentifier,subnet_identifier +SubnetIds,subnet_ids +SubnetInUse,subnet_in_use +SubnetIpv4CidrReservations,subnet_ipv4_cidr_reservations +SubnetIpv6CidrBlockAssociation,subnet_ipv6_cidr_block_association +SubnetIpv6CidrReservations,subnet_ipv6_cidr_reservations +SubnetMapping,subnet_mapping +SubnetMappings,subnet_mappings +SubnetMask,subnet_mask +SubnetNotAllowedFault,subnet_not_allowed_fault +SubnetNotFound,subnet_not_found +SubnetNotFoundException,subnet_not_found_exception +SubnetOfMatches,subnet_of_matches +SubnetOutpost,subnet_outpost +SubnetOutpostArn,subnet_outpost_arn +SubnetQuotaExceededFault,subnet_quota_exceeded_fault +SubnetRouteTable,subnet_route_table +SubnetStatus,subnet_status +Subnets,subnets +SubscribeInput,subscribe_input +SubscribePattern,subscribe_pattern +SubscribeRequest,subscribe_request +SubscribeResponse,subscribe_response +SubscribeResult,subscribe_result +SubscribeToDatasetRequest,subscribe_to_dataset_request +SubscribeToEventRequest,subscribe_to_event_request +SubscribeToShardEvent,subscribe_to_shard_event +SubscribeToShardInput,subscribe_to_shard_input +SubscribeToShardOutput,subscribe_to_shard_output +SubscribedAt,subscribed_at +SubscribedDomain,subscribed_domain +SubscribedDomains,subscribed_domains +SubscribedRuleGroupSummary,subscribed_rule_group_summary +SubscribedWorkteam,subscribed_workteam +SubscribedWorkteams,subscribed_workteams +Subscriber,subscriber +SubscriberResource,subscriber_resource +Subscribers,subscribers +Subscription,subscription +SubscriptionAlreadyExistFault,subscription_already_exist_fault +SubscriptionArn,subscription_arn +SubscriptionArnList,subscription_arn_list +SubscriptionCategoryNotFoundFault,subscription_category_not_found_fault +SubscriptionCreatedDateTime,subscription_created_date_time +SubscriptionCreationTime,subscription_creation_time +SubscriptionDefinitionId,subscription_definition_id +SubscriptionDefinitionVersion,subscription_definition_version +SubscriptionDefinitionVersionArn,subscription_definition_version_arn +SubscriptionDefinitionVersionId,subscription_definition_version_id +SubscriptionEndDate,subscription_end_date +SubscriptionErrors,subscription_errors +SubscriptionEventIdNotFoundFault,subscription_event_id_not_found_fault +SubscriptionExpiryDate,subscription_expiry_date +SubscriptionFilter,subscription_filter +SubscriptionId,subscription_id +SubscriptionLimitExceededException,subscription_limit_exceeded_exception +SubscriptionLimits,subscription_limits +SubscriptionName,subscription_name +SubscriptionNotFoundFault,subscription_not_found_fault +SubscriptionSeverityNotFoundFault,subscription_severity_not_found_fault +SubscriptionStartDate,subscription_start_date +SubscriptionState,subscription_state +SubscriptionStatus,subscription_status +SubscriptionType,subscription_type +Subscriptions,subscriptions +SubstatementType,substatement_type +SubstitutionMap,substitution_map +Substitutions,substitutions +Substring,substring +SubsystemId,subsystem_id +SubsystemVendorId,subsystem_vendor_id +Subtitle,subtitle +SubtitleFileUris,subtitle_file_uris +Subtitles,subtitles +SubtitlesOutput,subtitles_output +SubtitlingType,subtitling_type +SubtotalOptions,subtotal_options +Subtype,subtype +Succeeded,succeeded +SucceededActions,succeeded_actions +SucceededCount,succeeded_count +Success,success +SuccessCodes,success_codes +SuccessCount,success_count +SuccessForeground,success_foreground +SuccessRedirectionURL,success_redirection_url +SuccessResponseHandlingConfig,success_response_handling_config +SuccessRetentionPeriodInDays,success_retention_period_in_days +SuccessSteps,success_steps +SuccessStrings,success_strings +SuccessTopic,success_topic +SuccessValues,success_values +Successes,successes +Successful,successful +SuccessfulCampaignStateResponse,successful_campaign_state_response +SuccessfulEndpointCount,successful_endpoint_count +SuccessfulFleetCancellations,successful_fleet_cancellations +SuccessfulFleetDeletions,successful_fleet_deletions +SuccessfulFleetRequests,successful_fleet_requests +SuccessfulInstanceCreditSpecificationItem,successful_instance_credit_specification_item +SuccessfulInstanceCreditSpecifications,successful_instance_credit_specifications +SuccessfulLoginAttempts,successful_login_attempts +SuccessfulPackageVersionInfo,successful_package_version_info +SuccessfulQueuedPurchaseDeletion,successful_queued_purchase_deletion +SuccessfulQueuedPurchaseDeletions,successful_queued_purchase_deletions +SuccessfulRequest,successful_request +SuccessfulResponse,successful_response +SuccessfulShares,successful_shares +SuccessfulSubmissions,successful_submissions +SuccessfullyAssociatedResources,successfully_associated_resources +SuccessfullyDeletedLaunchTemplateVersions,successfully_deleted_launch_template_versions +SuccessfullyDisassociatedResources,successfully_disassociated_resources +Suffix,suffix +SuggestModel,suggest_model +SuggestRequest,suggest_request +SuggestResponse,suggest_response +SuggestStatus,suggest_status +Suggestable,suggestable +SuggestableConfig,suggestable_config +SuggestableConfigList,suggestable_config_list +SuggestedAccounts,suggested_accounts +SuggestedFix,suggested_fix +SuggestedPresentationDelaySeconds,suggested_presentation_delay_seconds +SuggestedQueryText,suggested_query_text +Suggester,suggester +SuggesterName,suggester_name +SuggesterNames,suggester_names +SuggesterStatus,suggester_status +Suggesters,suggesters +Suggestion,suggestion +SuggestionAttributes,suggestion_attributes +SuggestionCount,suggestion_count +SuggestionHighlight,suggestion_highlight +SuggestionMatch,suggestion_match +SuggestionQuery,suggestion_query +SuggestionTextWithHighlights,suggestion_text_with_highlights +SuggestionTypes,suggestion_types +SuggestionValue,suggestion_value +Suggestions,suggestions +SuggestionsList,suggestions_list +Suite,suite +SuiteDefinitionConfiguration,suite_definition_configuration +SuiteDefinitionInformation,suite_definition_information +SuiteRunConfiguration,suite_run_configuration +SuiteRunInformation,suite_run_information +Sum,sum +SumByAccount,sum_by_account +SumByDataSource,sum_by_data_source +SumByFeature,sum_by_feature +SumByResource,sum_by_resource +Summaries,summaries +SummarizationAttributes,summarization_attributes +SummarizedAttackVector,summarized_attack_vector +SummarizedCounter,summarized_counter +Summary,summary +SummaryFields,summary_fields +SummaryItems,summary_items +SummaryList,summary_list +SummaryMap,summary_map +SummaryStatistics,summary_statistics +Sunday,sunday +Sunglasses,sunglasses +SupernetOfMatches,supernet_of_matches +SupersededTemplates,superseded_templates +SuperuserParameters,superuser_parameters +SupplementalCategories,supplemental_categories +SupplementalImps,supplemental_imps +SupplementalSettings,supplemental_settings +SupplementaryFeature,supplementary_feature +SupplementaryFeatures,supplementary_features +SupportDescription,support_description +SupportEmail,support_email +SupportLevel,support_level +SupportLink,support_link +SupportLowFramerateInputs,support_low_framerate_inputs +SupportUrl,support_url +Supported,supported +SupportedActivityStreamModes,supported_activity_stream_modes +SupportedAddonList,supported_addon_list +SupportedArchitectures,supported_architectures +SupportedBootModes,supported_boot_modes +SupportedCACertificateIdentifiers,supported_ca_certificate_identifiers +SupportedCharacterSets,supported_character_sets +SupportedCompressionTypes,supported_compression_types +SupportedContentTypes,supported_content_types +SupportedDPUSizes,supported_dpu_sizes +SupportedDeploymentModes,supported_deployment_modes +SupportedEndpointType,supported_endpoint_type +SupportedEndpointTypes,supported_endpoint_types +SupportedEngineModes,supported_engine_modes +SupportedEngineVersions,supported_engine_versions +SupportedEngines,supported_engines +SupportedFeatureNames,supported_feature_names +SupportedFeatures,supported_features +SupportedFieldTypeDetails,supported_field_type_details +SupportedFilters,supported_filters +SupportedGatewayCapacities,supported_gateway_capacities +SupportedHardwareType,supported_hardware_type +SupportedHour,supported_hour +SupportedHyperParameters,supported_hyper_parameters +SupportedIdentityProviders,supported_identity_providers +SupportedInputModes,supported_input_modes +SupportedInstanceType,supported_instance_type +SupportedInstanceTypes,supported_instance_types +SupportedIpAddressTypes,supported_ip_address_types +SupportedLanguage,supported_language +SupportedLicenses,supported_licenses +SupportedLoadBalancerTypes,supported_load_balancer_types +SupportedLoginProviders,supported_login_providers +SupportedMajorVersions,supported_major_versions +SupportedMessagingContentTypes,supported_messaging_content_types +SupportedNcharCharacterSets,supported_nchar_character_sets +SupportedNetworkTypes,supported_network_types +SupportedOperation,supported_operation +SupportedOperations,supported_operations +SupportedPermissionTypes,supported_permission_types +SupportedPhoneNumberTypes,supported_phone_number_types +SupportedPlatform,supported_platform +SupportedPlatforms,supported_platforms +SupportedProductConfig,supported_product_config +SupportedProducts,supported_products +SupportedRealtimeInferenceInstanceTypes,supported_realtime_inference_instance_types +SupportedResourceType,supported_resource_type +SupportedResponseMIMETypes,supported_response_mime_types +SupportedRootDeviceTypes,supported_root_device_types +SupportedStorage,supported_storage +SupportedStorageFilter,supported_storage_filter +SupportedStrategies,supported_strategies +SupportedTierList,supported_tier_list +SupportedTimezones,supported_timezones +SupportedTrainingInstanceTypes,supported_training_instance_types +SupportedTransformInstanceTypes,supported_transform_instance_types +SupportedTuningJobObjectiveMetrics,supported_tuning_job_objective_metrics +SupportedUplinkGbps,supported_uplink_gbps +SupportedUsageClasses,supported_usage_classes +SupportedVersions,supported_versions +SupportedVirtualizationTypes,supported_virtualization_types +SupportingAccessPoint,supporting_access_point +SupportingInsights,supporting_insights +Supports32BitFCnt,supports32_bit_f_cnt +SupportsBabelfish,supports_babelfish +SupportsCDC,supports_cdc +SupportsCertificateRotationWithoutRestart,supports_certificate_rotation_without_restart +SupportsClassB,supports_class_b +SupportsClassC,supports_class_c +SupportsClusters,supports_clusters +SupportsDBInstanceAutomatedBackupsReplication,supports_db_instance_automated_backups_replication +SupportsDistributedTraining,supports_distributed_training +SupportsEnhancedMonitoring,supports_enhanced_monitoring +SupportsGlobalDatabases,supports_global_databases +SupportsIAMDatabaseAuthentication,supports_iam_database_authentication +SupportsIops,supports_iops +SupportsJoin,supports_join +SupportsKerberosAuthentication,supports_kerberos_authentication +SupportsLinking,supports_linking +SupportsLocalWriteForwarding,supports_local_write_forwarding +SupportsLogExportsToCloudwatchLogs,supports_log_exports_to_cloudwatch_logs +SupportsOptionVersionDowngrade,supports_option_version_downgrade +SupportsParallelQuery,supports_parallel_query +SupportsPerformanceInsights,supports_performance_insights +SupportsReadReplica,supports_read_replica +SupportsStorageAutoscaling,supports_storage_autoscaling +SupportsStorageEncryption,supports_storage_encryption +SupportsStorageThroughput,supports_storage_throughput +SuppressDataIdentifier,suppress_data_identifier +SuppressedDestination,suppressed_destination +SuppressedDestinationAttributes,suppressed_destination_attributes +SuppressedDestinationSummaries,suppressed_destination_summaries +SuppressedDestinationSummary,suppressed_destination_summary +SuppressedLinesOfCodeCount,suppressed_lines_of_code_count +SuppressedReasons,suppressed_reasons +SuppressionAttributes,suppression_attributes +SuppressionListDestination,suppression_list_destination +SuppressionListImportAction,suppression_list_import_action +SuppressionOptions,suppression_options +Surname,surname +SurroundExMode,surround_ex_mode +SurroundMode,surround_mode +SurroundTrim,surround_trim +SuspendActions,suspend_actions +SuspendContactRecordingRequest,suspend_contact_recording_request +SuspendGameServerGroupInput,suspend_game_server_group_input +SuspendGameServerGroupOutput,suspend_game_server_group_output +SuspendedActions,suspended_actions +SuspendedCause,suspended_cause +SuspendedDate,suspended_date +SuspendedProcess,suspended_process +SuspendedProcesses,suspended_processes +SuspendedState,suspended_state +SuspensionReason,suspension_reason +SustainedClockSpeedInGhz,sustained_clock_speed_in_ghz +SvmActiveDirectoryConfiguration,svm_active_directory_configuration +SvmAdminPassword,svm_admin_password +SvmEndpoint,svm_endpoint +SvmEndpoints,svm_endpoints +SvmName,svm_name +SvmUuid,svm_uuid +SwapEnvironmentCNAMEsMessage,swap_environment_cnames_message +Swappiness,swappiness +SwitchRunningMode,switch_running_mode +Switchover,switchover +SwitchoverBlueGreenDeploymentRequest,switchover_blue_green_deployment_request +SwitchoverBlueGreenDeploymentResponse,switchover_blue_green_deployment_response +SwitchoverDetail,switchover_detail +SwitchoverDetails,switchover_details +SwitchoverGlobalClusterMessage,switchover_global_cluster_message +SwitchoverGlobalClusterResult,switchover_global_cluster_result +SwitchoverReadReplicaMessage,switchover_read_replica_message +SwitchoverReadReplicaResult,switchover_read_replica_result +SwitchoverTimeout,switchover_timeout +SybaseSettings,sybase_settings +Symbol,symbol +SymbolicLink,symbolic_link +SymmetricEncryptionAttributes,symmetric_encryption_attributes +SyncBlocker,sync_blocker +SyncBlockerContext,sync_blocker_context +SyncCompliance,sync_compliance +SyncConfig,sync_config +SyncCount,sync_count +SyncCreatedTime,sync_created_time +SyncDeploymentJobRequest,sync_deployment_job_request +SyncDeploymentJobResponse,sync_deployment_job_response +SyncFormat,sync_format +SyncJobStatus,sync_job_status +SyncJobSummary,sync_job_summary +SyncLastModifiedTime,sync_last_modified_time +SyncName,sync_name +SyncResourceRequest,sync_resource_request +SyncResourceResponse,sync_resource_response +SyncResourceStatus,sync_resource_status +SyncResourceSummary,sync_resource_summary +SyncSessionToken,sync_session_token +SyncSessionsCount,sync_sessions_count +SyncShadow,sync_shadow +SyncSource,sync_source +SyncState,sync_state +SyncStates,sync_states +SyncStatus,sync_status +SyncThreshold,sync_threshold +SyncType,sync_type +SynchronizationStatus,synchronization_status +SynonymRuleCount,synonym_rule_count +Synonyms,synonyms +Syntax,syntax +SyntaxToken,syntax_token +SyntaxTokens,syntax_tokens +SynthesisTask,synthesis_task +SynthesisTaskNotFoundException,synthesis_task_not_found_exception +SynthesisTasks,synthesis_tasks +SynthesizeSpeechInput,synthesize_speech_input +SynthesizeSpeechOutput,synthesize_speech_output +SyslogIp,syslog_ip +System,system +SystemControl,system_control +SystemControls,system_controls +SystemEvent,system_event +SystemId,system_id +SystemIds,system_ids +SystemInfo,system_info +SystemInstanceDescription,system_instance_description +SystemInstanceFilter,system_instance_filter +SystemInstanceSummary,system_instance_summary +SystemResourceLimits,system_resource_limits +SystemStatus,system_status +SystemSuggestedValue,system_suggested_value +SystemTemplateDescription,system_template_description +SystemTemplateFilter,system_template_filter +SystemTemplateSummary,system_template_summary +SystemType,system_type +SystemsManagerAgent,systems_manager_agent +TCPFlagField,tcp_flag_field +TCPFlags,tcp_flags +TERMINATING,terminating +TFIMetricDataPoint,tfi_metric_data_point +TFIModelPerformance,tfi_model_performance +TFITrainingMetricsValue,tfi_training_metrics_value +TGWOnDeviceService,tgw_on_device_service +TGWOnDeviceServiceConfiguration,tgw_on_device_service_configuration +TLDRulesViolation,tld_rules_violation +TLEData,tle_data +TLEEphemeris,tle_ephemeris +TLSEnabled,tls_enabled +TLSInspectionConfiguration,tls_inspection_configuration +TLSInspectionConfigurationArn,tls_inspection_configuration_arn +TLSInspectionConfigurationId,tls_inspection_configuration_id +TLSInspectionConfigurationMetadata,tls_inspection_configuration_metadata +TLSInspectionConfigurationName,tls_inspection_configuration_name +TLSInspectionConfigurationResponse,tls_inspection_configuration_response +TLSInspectionConfigurationStatus,tls_inspection_configuration_status +TLSInspectionConfigurations,tls_inspection_configurations +TLSSecurityPolicy,tls_security_policy +TTL,ttl +Table,table +TableAggregatedFieldWells,table_aggregated_field_wells +TableAlreadyExistsException,table_already_exists_exception +TableArn,table_arn +TableAutoScalingDescription,table_auto_scaling_description +TableBorderOptions,table_border_options +TableCatalogId,table_catalog_id +TableCell,table_cell +TableCellConditionalFormatting,table_cell_conditional_formatting +TableCellImageScalingConfiguration,table_cell_image_scaling_configuration +TableCellImageSizingConfiguration,table_cell_image_sizing_configuration +TableCellStyle,table_cell_style +TableClass,table_class +TableClassOverride,table_class_override +TableClassSummary,table_class_summary +TableColumn,table_column +TableConditionalFormatting,table_conditional_formatting +TableConditionalFormattingOption,table_conditional_formatting_option +TableConfiguration,table_configuration +TableCount,table_count +TableCreationDateTime,table_creation_date_time +TableCreationParameters,table_creation_parameters +TableData,table_data +TableDataImportJobMetadata,table_data_import_job_metadata +TableDescription,table_description +TableError,table_error +TableExcerpt,table_excerpt +TableFieldCustomIconContent,table_field_custom_icon_content +TableFieldCustomTextContent,table_field_custom_text_content +TableFieldImageConfiguration,table_field_image_configuration +TableFieldLinkConfiguration,table_field_link_configuration +TableFieldLinkContentConfiguration,table_field_link_content_configuration +TableFieldOption,table_field_option +TableFieldOptions,table_field_options +TableFieldURLConfiguration,table_field_url_configuration +TableFieldWells,table_field_wells +TableFormat,table_format +TableId,table_id +TableIdentifier,table_identifier +TableInUseException,table_in_use_exception +TableInlineVisualization,table_inline_visualization +TableInlineVisualizations,table_inline_visualizations +TableInput,table_input +TableLFTagPolicy,table_lf_tag_policy +TableLFTagPolicyAndPermissions,table_lf_tag_policy_and_permissions +TableLimitExceededFault,table_limit_exceeded_fault +TableList,table_list +TableLocation,table_location +TableMappings,table_mappings +TableMaxReadCapacityUnits,table_max_read_capacity_units +TableMaxWriteCapacityUnits,table_max_write_capacity_units +TableMember,table_member +TableMetadata,table_metadata +TableMetadataList,table_metadata_list +TableName,table_name +TableNameUpdate,table_name_update +TableNames,table_names +TableNotFoundException,table_not_found_exception +TableObject,table_object +TableOptions,table_options +TablePaginatedReportOptions,table_paginated_report_options +TablePattern,table_pattern +TablePinnedFieldOptions,table_pinned_field_options +TablePrefix,table_prefix +TableResource,table_resource +TableRestoreNotFoundFault,table_restore_not_found_fault +TableRestoreRequestId,table_restore_request_id +TableRestoreStatus,table_restore_status +TableRestoreStatusDetails,table_restore_status_details +TableRestoreStatusMessage,table_restore_status_message +TableRow,table_row +TableRowConditionalFormatting,table_row_conditional_formatting +TableSchema,table_schema +TableSideBorderOptions,table_side_border_options +TableSizeBytes,table_size_bytes +TableSortConfiguration,table_sort_configuration +TableState,table_state +TableStatistics,table_statistics +TableStatus,table_status +TableStyleTarget,table_style_target +TableSummary,table_summary +TableToReload,table_to_reload +TableType,table_type +TableUnaggregatedFieldWells,table_unaggregated_field_wells +TableVersion,table_version +TableVersionError,table_version_error +TableVersions,table_versions +TableVisual,table_visual +TableWildcard,table_wildcard +TableWithColumns,table_with_columns +TableWithColumnsResource,table_with_columns_resource +Tables,tables +TablesCreated,tables_created +TablesDeleted,tables_deleted +TablesErrored,tables_errored +TablesLoaded,tables_loaded +TablesLoading,tables_loading +TablesQueued,tables_queued +TablesToDelete,tables_to_delete +TablesToReload,tables_to_reload +TablesUpdated,tables_updated +TabularConditions,tabular_conditions +TabularJobConfig,tabular_job_config +TabularResolvedAttributes,tabular_resolved_attributes +Tac,tac +Tag,tag +TagAttendeeRequest,tag_attendee_request +TagCertificateAuthorityRequest,tag_certificate_authority_request +TagCollection,tag_collection +TagCollectionFilter,tag_collection_filter +TagColumnOperation,tag_column_operation +TagCondition,tag_condition +TagCostEstimationResourceCollectionFilter,tag_cost_estimation_resource_collection_filter +TagCount,tag_count +TagCriterionForJob,tag_criterion_for_job +TagCriterionPairForJob,tag_criterion_pair_for_job +TagDeliveryStreamInput,tag_delivery_stream_input +TagDescription,tag_description +TagDescriptions,tag_descriptions +TagException,tag_exception +TagFilter,tag_filter +TagFilters,tag_filters +TagHealth,tag_health +TagInfoForResource,tag_info_for_resource +TagInput,tag_input +TagInstanceProfileRequest,tag_instance_profile_request +TagKey,tag_key +TagKeyFilters,tag_key_filters +TagKeyList,tag_key_list +TagKeyOnly,tag_key_only +TagKeyScope,tag_key_scope +TagKeys,tag_keys +TagKeysListRequiredException,tag_keys_list_required_exception +TagLimitExceededException,tag_limit_exceeded_exception +TagLimitExceededFault,tag_limit_exceeded_fault +TagList,tag_list +TagListEntry,tag_list_entry +TagListMessage,tag_list_message +TagLogGroupRequest,tag_log_group_request +TagMFADeviceRequest,tag_mfa_device_request +TagMeetingRequest,tag_meeting_request +TagMultiValueDelimiter,tag_multi_value_delimiter +TagNames,tag_names +TagNotFoundFault,tag_not_found_fault +TagOpenIDConnectProviderRequest,tag_open_id_connect_provider_request +TagOperationException,tag_operation_exception +TagOptionDetail,tag_option_detail +TagOptionDetails,tag_option_details +TagOptionId,tag_option_id +TagOptionNotMigratedException,tag_option_not_migrated_exception +TagOptionSummary,tag_option_summary +TagOptions,tag_options +TagOutput,tag_output +TagPolicyException,tag_policy_exception +TagPolicyRequest,tag_policy_request +TagPolicyViolationException,tag_policy_violation_exception +TagProjectRequest,tag_project_request +TagProjectResult,tag_project_result +TagQueryConfiguration,tag_query_configuration +TagQueueRequest,tag_queue_request +TagQuotaPerResourceExceeded,tag_quota_per_resource_exceeded +TagRef,tag_ref +TagRequiredException,tag_required_exception +TagResourceInput,tag_resource_input +TagResourceOutput,tag_resource_output +TagResourceRequest,tag_resource_request +TagResourceResponse,tag_resource_response +TagResourceResult,tag_resource_result +TagResourcesInput,tag_resources_input +TagResourcesOutput,tag_resources_output +TagRestrictedResources,tag_restricted_resources +TagRoleRequest,tag_role_request +TagRuleConfigurations,tag_rule_configurations +TagRules,tag_rules +TagSAMLProviderRequest,tag_saml_provider_request +TagScopeTerm,tag_scope_term +TagSearchCondition,tag_search_condition +TagServerCertificateRequest,tag_server_certificate_request +TagSet,tag_set +TagSetListLimitExceededException,tag_set_list_limit_exceeded_exception +TagSpecification,tag_specification +TagSpecifications,tag_specifications +TagStepDetails,tag_step_details +TagStreamInput,tag_stream_input +TagUserRequest,tag_user_request +TagValue,tag_value +TagValuePair,tag_value_pair +TagValueScope,tag_value_scope +TagValues,tag_values +TagValuesToAdd,tag_values_to_add +TagValuesToDelete,tag_values_to_delete +TaggedDatabase,tagged_database +TaggedResource,tagged_resource +TaggedResourceListMessage,tagged_resource_list_message +TaggedResources,tagged_resources +TaggedTable,tagged_table +Tagging,tagging +TaggingDirective,tagging_directive +TaggingFailedException,tagging_failed_exception +Tags,tags +TagsAlreadyExistException,tags_already_exist_exception +TagsLimitExceededException,tags_limit_exceeded_exception +TagsList,tags_list +TagsMapRequiredException,tags_map_required_exception +TagsModel,tags_model +TagsPerPage,tags_per_page +TagsPerResourceExceededLimitException,tags_per_resource_exceeded_limit_exception +TagsToAdd,tags_to_add +TagsToDelete,tags_to_delete +TagsToRemove,tags_to_remove +TagsToUpdate,tags_to_update +TagsType,tags_type +Taint,taint +Tape,tape +TapeARN,tape_arn +TapeARNs,tape_arns +TapeArchive,tape_archive +TapeArchives,tape_archives +TapeBarcode,tape_barcode +TapeBarcodePrefix,tape_barcode_prefix +TapeCreatedDate,tape_created_date +TapeDriveType,tape_drive_type +TapeInfo,tape_info +TapeInfos,tape_infos +TapeRecoveryPointInfo,tape_recovery_point_info +TapeRecoveryPointInfos,tape_recovery_point_infos +TapeRecoveryPointTime,tape_recovery_point_time +TapeSizeInBytes,tape_size_in_bytes +TapeStatus,tape_status +TapeUsedInBytes,tape_used_in_bytes +Tapes,tapes +Target,target +TargetARN,target_arn +TargetAccounts,target_accounts +TargetAction,target_action +TargetActionType,target_action_type +TargetAddress,target_address +TargetApplications,target_applications +TargetArn,target_arn +TargetAttributeName,target_attribute_name +TargetBackupVault,target_backup_vault +TargetBackupVaultName,target_backup_vault_name +TargetBands,target_bands +TargetBrokerEBSVolumeInfo,target_broker_ebs_volume_info +TargetBucket,target_bucket +TargetCapacity,target_capacity +TargetCapacitySpecification,target_capacity_specification +TargetCapacitySpecificationRequest,target_capacity_specification_request +TargetCapacityUnitType,target_capacity_unit_type +TargetClusterArn,target_cluster_arn +TargetClusterInfo,target_cluster_info +TargetClusterType,target_cluster_type +TargetColumn,target_column +TargetConfiguration,target_configuration +TargetConfigurationRequest,target_configuration_request +TargetConfigurationValueRollup,target_configuration_value_rollup +TargetConfigurationValueSet,target_configuration_value_set +TargetConfigurations,target_configurations +TargetContainerHostname,target_container_hostname +TargetContainerRepository,target_container_repository +TargetControls,target_controls +TargetCount,target_count +TargetCpuUtilizationPerCore,target_cpu_utilization_per_core +TargetCustomAvailabilityZone,target_custom_availability_zone +TargetCustomerId,target_customer_id +TargetDBClusterParameterGroupDescription,target_db_cluster_parameter_group_description +TargetDBClusterParameterGroupIdentifier,target_db_cluster_parameter_group_identifier +TargetDBClusterParameterGroupName,target_db_cluster_parameter_group_name +TargetDBClusterSnapshotIdentifier,target_db_cluster_snapshot_identifier +TargetDBInstanceIdentifier,target_db_instance_identifier +TargetDBParameterGroupDescription,target_db_parameter_group_description +TargetDBParameterGroupIdentifier,target_db_parameter_group_identifier +TargetDBParameterGroupName,target_db_parameter_group_name +TargetDBSnapshotIdentifier,target_db_snapshot_identifier +TargetDataProviderDescriptors,target_data_provider_descriptors +TargetDatabase,target_database +TargetDatabaseName,target_database_name +TargetDbClusterIdentifier,target_db_cluster_identifier +TargetDbType,target_db_type +TargetDescription,target_description +TargetDestination,target_destination +TargetDetails,target_details +TargetDevice,target_device +TargetDistributionId,target_distribution_id +TargetDocumentAttributeKey,target_document_attribute_key +TargetDocumentAttributeValue,target_document_attribute_value +TargetDocumentAttributeValueDeletion,target_document_attribute_value_deletion +TargetDpus,target_dpus +TargetDurationCompatibilityMode,target_duration_compatibility_mode +TargetEncryptionType,target_encryption_type +TargetEndpointArn,target_endpoint_arn +TargetEngineName,target_engine_name +TargetEngineVersion,target_engine_version +TargetEnvironment,target_environment +TargetEnvironmentName,target_environment_name +TargetEventTypes,target_event_types +TargetFacetName,target_facet_name +TargetFailure,target_failure +TargetFileSystemValues,target_file_system_values +TargetGrant,target_grant +TargetGrants,target_grants +TargetGroup,target_group +TargetGroupARNs,target_group_arns +TargetGroupArn,target_group_arn +TargetGroupArns,target_group_arns +TargetGroupAssociationLimitException,target_group_association_limit_exception +TargetGroupAttribute,target_group_attribute +TargetGroupConfig,target_group_config +TargetGroupInfo,target_group_info +TargetGroupName,target_group_name +TargetGroupNotFoundException,target_group_not_found_exception +TargetGroupPairInfo,target_group_pair_info +TargetGroupStickinessConfig,target_group_stickiness_config +TargetGroupSummary,target_group_summary +TargetGroupTuple,target_group_tuple +TargetGroups,target_groups +TargetGroupsConfig,target_groups_config +TargetHealth,target_health +TargetHealthDescription,target_health_description +TargetHealthDescriptions,target_health_descriptions +TargetId,target_id +TargetIdFilters,target_id_filters +TargetIdType,target_id_type +TargetIds,target_ids +TargetImage,target_image +TargetImageOrientationCorrection,target_image_orientation_correction +TargetInUseException,target_in_use_exception +TargetInstance,target_instance +TargetInstanceType,target_instance_type +TargetInstances,target_instances +TargetIops,target_iops +TargetIps,target_ips +TargetKafkaVersion,target_kafka_version +TargetKeyId,target_key_id +TargetKeyPrefix,target_key_prefix +TargetLabelColumn,target_label_column +TargetLanguageCode,target_language_code +TargetLanguageCodes,target_language_codes +TargetLensVersion,target_lens_version +TargetLkfs,target_lkfs +TargetLocation,target_location +TargetLocationAlarmConfiguration,target_location_alarm_configuration +TargetLocationMaxConcurrency,target_location_max_concurrency +TargetLocationMaxErrors,target_location_max_errors +TargetLocations,target_locations +TargetMaps,target_maps +TargetMeasureName,target_measure_name +TargetMember,target_member +TargetMembershipsPerSubChannel,target_memberships_per_sub_channel +TargetModel,target_model +TargetMonitorNits,target_monitor_nits +TargetMultiAttachEnabled,target_multi_attach_enabled +TargetMultiMeasureAttributeName,target_multi_measure_attribute_name +TargetMultiMeasureName,target_multi_measure_name +TargetName,target_name +TargetNetwork,target_network +TargetNetworkCidr,target_network_cidr +TargetNetworkId,target_network_id +TargetNodeType,target_node_type +TargetNotConnected,target_not_connected +TargetNotConnectedException,target_not_connected_exception +TargetNotFoundException,target_not_found_exception +TargetNumberOfBrokerNodes,target_number_of_broker_nodes +TargetNumberOfNodes,target_number_of_nodes +TargetObjectReference,target_object_reference +TargetObjectiveMetricValue,target_objective_metric_value +TargetOnDemandCapacity,target_on_demand_capacity +TargetOnDeviceService,target_on_device_service +TargetOnDeviceServices,target_on_device_services +TargetOptionGroupDescription,target_option_group_description +TargetOptionGroupIdentifier,target_option_group_identifier +TargetOriginId,target_origin_id +TargetParameter,target_parameter +TargetParameterName,target_parameter_name +TargetParameters,target_parameters +TargetPath,target_path +TargetPer,target_per +TargetPlatform,target_platform +TargetPrefix,target_prefix +TargetProcess,target_process +TargetProductId,target_product_id +TargetProductName,target_product_name +TargetReference,target_reference +TargetRegion,target_region +TargetReplicationInstanceArn,target_replication_instance_arn +TargetRequiredException,target_required_exception +TargetReservationValue,target_reservation_value +TargetReservedNodeCount,target_reserved_node_count +TargetReservedNodeOffering,target_reserved_node_offering +TargetReservedNodeOfferingId,target_reserved_node_offering_id +TargetReservedNodeType,target_reserved_node_type +TargetResource,target_resource +TargetResourceCount,target_resource_count +TargetResourceType,target_resource_type +TargetResourceTypeParameter,target_resource_type_parameter +TargetResourceTypeSummary,target_resource_type_summary +TargetRole,target_role +TargetRouteTableId,target_route_table_id +TargetSamplingRate,target_sampling_rate +TargetSchemaName,target_schema_name +TargetShardCount,target_shard_count +TargetSheetId,target_sheet_id +TargetSize,target_size +TargetSnapshotIdentifier,target_snapshot_identifier +TargetSnapshotName,target_snapshot_name +TargetSnapshotValues,target_snapshot_values +TargetSpotCapacity,target_spot_capacity +TargetStatus,target_status +TargetStores,target_stores +TargetString,target_string +TargetSubnet,target_subnet +TargetSummary,target_summary +TargetTable,target_table +TargetTableName,target_table_name +TargetTags,target_tags +TargetText,target_text +TargetThroughput,target_throughput +TargetTrackingConfiguration,target_tracking_configuration +TargetTrackingConfigurations,target_tracking_configurations +TargetTrackingMetric,target_tracking_metric +TargetTrackingMetricDataQuery,target_tracking_metric_data_query +TargetTrackingMetricDimension,target_tracking_metric_dimension +TargetTrackingMetricStat,target_tracking_metric_stat +TargetTrackingScalingPolicyConfiguration,target_tracking_scaling_policy_configuration +TargetType,target_type +TargetTypes,target_types +TargetUser,target_user +TargetUsers,target_users +TargetValue,target_value +TargetValues,target_values +TargetVariant,target_variant +TargetVersion,target_version +TargetVersions,target_versions +TargetViolationReason,target_violation_reason +TargetViolationReasons,target_violation_reasons +TargetVisualOptions,target_visual_options +TargetVisuals,target_visuals +TargetVisualsConfiguration,target_visuals_configuration +TargetVolumeType,target_volume_type +TargetVolumeValues,target_volume_values +TargetVpcSubnetId,target_vpc_subnet_id +TargetWorkspaceId,target_workspace_id +TargetedMessages,targeted_messages +TargetedSentimentDetectionJobFilter,targeted_sentiment_detection_job_filter +TargetedSentimentDetectionJobProperties,targeted_sentiment_detection_job_properties +TargetedSentimentDetectionJobPropertiesList,targeted_sentiment_detection_job_properties_list +TargetedSentimentEntity,targeted_sentiment_entity +TargetedSentimentMention,targeted_sentiment_mention +Targets,targets +TargetsRequiredException,targets_required_exception +Task,task +TaskAction,task_action +TaskActionDefinition,task_action_definition +TaskAlreadyExistsException,task_already_exists_exception +TaskArn,task_arn +TaskAvailabilityLifetimeInSeconds,task_availability_lifetime_in_seconds +TaskConfig,task_config +TaskCount,task_count +TaskCreatedAt,task_created_at +TaskCredentials,task_credentials +TaskData,task_data +TaskDefinition,task_definition +TaskDefinitionArn,task_definition_arn +TaskDefinitionPlacementConstraint,task_definition_placement_constraint +TaskDefinitionType,task_definition_type +TaskDefinitions,task_definitions +TaskDescription,task_description +TaskDetails,task_details +TaskDoesNotExist,task_does_not_exist +TaskEndTime,task_end_time +TaskError,task_error +TaskExecutionArn,task_execution_arn +TaskExecutionId,task_execution_id +TaskExecutionListEntry,task_execution_list_entry +TaskExecutionResultDetail,task_execution_result_detail +TaskExecutions,task_executions +TaskFailedEventDetails,task_failed_event_details +TaskFieldMappings,task_field_mappings +TaskFilter,task_filter +TaskHandle,task_handle +TaskId,task_id +TaskIds,task_ids +TaskInvocationParameters,task_invocation_parameters +TaskKeywords,task_keywords +TaskList,task_list +TaskListEntry,task_list_entry +TaskListItem,task_list_item +TaskLogs,task_logs +TaskNotFoundException,task_not_found_exception +TaskObject,task_object +TaskOverride,task_override +TaskParameters,task_parameters +TaskProperties,task_properties +TaskQueueing,task_queueing +TaskReportConfig,task_report_config +TaskRoleArn,task_role_arn +TaskRun,task_run +TaskRunFilterCriteria,task_run_filter_criteria +TaskRunId,task_run_id +TaskRunProperties,task_run_properties +TaskRunSecurityConfigurationName,task_run_security_configuration_name +TaskRunSortCriteria,task_run_sort_criteria +TaskRunType,task_run_type +TaskRuns,task_runs +TaskSchedule,task_schedule +TaskScheduledEventDetails,task_scheduled_event_details +TaskSet,task_set +TaskSetNotFoundException,task_set_not_found_exception +TaskStartFailedEventDetails,task_start_failed_event_details +TaskStartTime,task_start_time +TaskStartedEventDetails,task_started_event_details +TaskState,task_state +TaskStatistics,task_statistics +TaskStatisticsForAuditCheck,task_statistics_for_audit_check +TaskStatus,task_status +TaskStatusReason,task_status_reason +TaskSubmitFailedEventDetails,task_submit_failed_event_details +TaskSubmittedEventDetails,task_submitted_event_details +TaskSucceededEventDetails,task_succeeded_event_details +TaskSummary,task_summary +TaskTemplateConstraints,task_template_constraints +TaskTemplateDefaultFieldValue,task_template_default_field_value +TaskTemplateDefaults,task_template_defaults +TaskTemplateField,task_template_field +TaskTemplateFieldIdentifier,task_template_field_identifier +TaskTemplateId,task_template_id +TaskTemplateMetadata,task_template_metadata +TaskTemplates,task_templates +TaskTimeLimitInSeconds,task_time_limit_in_seconds +TaskTimedOut,task_timed_out +TaskTimedOutEventDetails,task_timed_out_event_details +TaskTitle,task_title +TaskType,task_type +Tasks,tasks +TaxDocuments,tax_documents +TcpFlags,tcp_flags +TcpRoute,tcp_route +TcpRouteAction,tcp_route_action +TcpRouteMatch,tcp_route_match +TcpTimeout,tcp_timeout +Tcs,tcs +TdeCredentialArn,tde_credential_arn +TdeCredentialPassword,tde_credential_password +Tdscdma,tdscdma +TdscdmaLocalId,tdscdma_local_id +TdscdmaNmr,tdscdma_nmr +TdscdmaNmrObj,tdscdma_nmr_obj +TdscdmaObj,tdscdma_obj +TdscdmaTimingAdvance,tdscdma_timing_advance +TdtInterval,tdt_interval +Team,team +TeamId,team_id +TeamMember,team_member +TeamMemberAlreadyAssociatedException,team_member_already_associated_exception +TeamMemberNotFoundException,team_member_not_found_exception +TechContact,tech_contact +TechPrivacy,tech_privacy +TechnicalCueFilter,technical_cue_filter +TechnicalCueSegment,technical_cue_segment +Telecine,telecine +Telemetries,telemetries +Telemetry,telemetry +TelemetryConfiguration,telemetry_configuration +TelemetryConfigurationUpdate,telemetry_configuration_update +TelemetryMetadata,telemetry_metadata +TelemetryRecord,telemetry_record +TelemetryRecords,telemetry_records +Telephone,telephone +Telephony,telephony +TelephonyConfig,telephony_config +TelephonySettings,telephony_settings +TeletextDestinationSettings,teletext_destination_settings +TeletextGridControl,teletext_grid_control +TeletextSourceSettings,teletext_source_settings +TeletextSpacing,teletext_spacing +TempDir,temp_dir +TempDirectory,temp_directory +TemperatureUnit,temperature_unit +Template,template +TemplateActionDocument,template_action_document +TemplateActionsRequestFilters,template_actions_request_filters +TemplateActiveVersionRequest,template_active_version_request +TemplateAlias,template_alias +TemplateAliasList,template_alias_list +TemplateArn,template_arn +TemplateBody,template_body +TemplateConfiguration,template_configuration +TemplateContent,template_content +TemplateCreateMessageBody,template_create_message_body +TemplateData,template_data +TemplateDescription,template_description +TemplateDoesNotExistException,template_does_not_exist_exception +TemplateError,template_error +TemplateId,template_id +TemplateInput,template_input +TemplateLinkedPolicyDefinition,template_linked_policy_definition +TemplateLinkedPolicyDefinitionDetail,template_linked_policy_definition_detail +TemplateLinkedPolicyDefinitionItem,template_linked_policy_definition_item +TemplateLocation,template_location +TemplateMetadata,template_metadata +TemplateName,template_name +TemplateParameter,template_parameter +TemplateParameterConfiguration,template_parameter_configuration +TemplateParameters,template_parameters +TemplateQuestions,template_questions +TemplateResponse,template_response +TemplateRevision,template_revision +TemplateS3Uri,template_s3_uri +TemplateSSMDocumentDetails,template_ssm_document_details +TemplateSelectionExpression,template_selection_expression +TemplateSourceAnalysis,template_source_analysis +TemplateSourceEntity,template_source_entity +TemplateSourceTemplate,template_source_template +TemplateStage,template_stage +TemplateStepGroupSummary,template_step_group_summary +TemplateStepSummary,template_step_summary +TemplateSubject,template_subject +TemplateSummary,template_summary +TemplateSummaryConfig,template_summary_config +TemplateSummaryList,template_summary_list +TemplateSyncConfig,template_sync_config +TemplateType,template_type +TemplateURL,template_url +TemplateUrl,template_url +TemplateV2,template_v2 +TemplateV3,template_v3 +TemplateV4,template_v4 +TemplateVersion,template_version +TemplateVersionDefinition,template_version_definition +TemplateVersionNumber,template_version_number +TemplateVersionResponse,template_version_response +TemplateVersionSummary,template_version_summary +TemplateVersionSummaryList,template_version_summary_list +TemplateVersionsResponse,template_versions_response +TemplatedPathList,templated_path_list +Templates,templates +TemplatesMetadata,templates_metadata +TemplatesNotAvailableInRegionException,templates_not_available_in_region_exception +TemplatesResponse,templates_response +TemporalAdaptiveQuantization,temporal_adaptive_quantization +TemporalAq,temporal_aq +TemporalFilterSettings,temporal_filter_settings +TemporalIds,temporal_ids +TemporalStatisticsConfigInput,temporal_statistics_config_input +TemporaryCredential,temporary_credential +TemporaryPassword,temporary_password +TemporaryPasswordValidityDays,temporary_password_validity_days +TemporaryRestoreDays,temporary_restore_days +Tenancy,tenancy +Tenant,tenant +TenantDomain,tenant_domain +TenantId,tenant_id +TenantIds,tenant_ids +TensorBoardAppSettings,tensor_board_app_settings +TensorBoardOutputConfig,tensor_board_output_config +TenthFractionsOfACent,tenth_fractions_of_a_cent +TeradataParameters,teradata_parameters +Term,term +TermCount,term_count +TermEndDate,term_end_date +TermInYears,term_in_years +TermStartDate,term_start_date +TerminalRoutingStrategyException,terminal_routing_strategy_exception +TerminalStateException,terminal_state_exception +TerminateAppRequest,terminate_app_request +TerminateCaptions,terminate_captions +TerminateClientVpnConnectionsRequest,terminate_client_vpn_connections_request +TerminateClientVpnConnectionsResult,terminate_client_vpn_connections_result +TerminateConnectionStatus,terminate_connection_status +TerminateEnvByForce,terminate_env_by_force +TerminateEnvironmentMessage,terminate_environment_message +TerminateInstanceInAutoScalingGroupType,terminate_instance_in_auto_scaling_group_type +TerminateInstances,terminate_instances +TerminateInstancesRequest,terminate_instances_request +TerminateInstancesResult,terminate_instances_result +TerminateInstancesWithExpiration,terminate_instances_with_expiration +TerminateJobFlowsInput,terminate_job_flows_input +TerminateJobRequest,terminate_job_request +TerminateProvisionedProductInput,terminate_provisioned_product_input +TerminateProvisionedProductOutput,terminate_provisioned_product_output +TerminateRecommendationDetail,terminate_recommendation_detail +TerminateRecoveryInstancesRequest,terminate_recovery_instances_request +TerminateRecoveryInstancesResponse,terminate_recovery_instances_response +TerminateRequest,terminate_request +TerminateResources,terminate_resources +TerminateSessionRequest,terminate_session_request +TerminateSessionResponse,terminate_session_response +TerminateSolNetworkInstanceInput,terminate_sol_network_instance_input +TerminateSolNetworkInstanceOutput,terminate_sol_network_instance_output +TerminateTargetInstancesRequest,terminate_target_instances_request +TerminateTargetInstancesResponse,terminate_target_instances_response +TerminateToken,terminate_token +TerminateWorkflowExecutionInput,terminate_workflow_execution_input +TerminateWorkspaceRequests,terminate_workspace_requests +TerminateWorkspacesRequest,terminate_workspaces_request +TerminateWorkspacesResult,terminate_workspaces_result +Terminated,terminated +TerminatedAt,terminated_at +Terminating,terminating +TerminatingInstances,terminating_instances +Termination,termination +TerminationDate,termination_date +TerminationDateTime,termination_date_time +TerminationDelay,termination_delay +TerminationHealth,termination_health +TerminationPolicies,termination_policies +TerminationPolicyTypes,termination_policy_types +TerminationProtected,termination_protected +TerminationProtectionEnabled,termination_protection_enabled +TerminationTime,termination_time +TerminationWaitInSeconds,termination_wait_in_seconds +TerminologyData,terminology_data +TerminologyDataFormat,terminology_data_format +TerminologyDataLocation,terminology_data_location +TerminologyNames,terminology_names +TerminologyProperties,terminology_properties +TerminologyPropertiesList,terminology_properties_list +Terms,terms +TermsAggregation,terms_aggregation +TerraformSource,terraform_source +Test,test +TestAlarmRequest,test_alarm_request +TestAlarmResult,test_alarm_result +TestAuthorizationRequest,test_authorization_request +TestAuthorizationResponse,test_authorization_response +TestAvailabilityConfigurationRequest,test_availability_configuration_request +TestAvailabilityConfigurationResponse,test_availability_configuration_response +TestCase,test_case +TestCaseFilter,test_case_filter +TestCaseRun,test_case_run +TestCaseScenario,test_case_scenario +TestConnectionMessage,test_connection_message +TestConnectionRequest,test_connection_request +TestConnectionResponse,test_connection_response +TestCustomDataIdentifierRequest,test_custom_data_identifier_request +TestCustomDataIdentifierResponse,test_custom_data_identifier_response +TestDNSAnswerRequest,test_dns_answer_request +TestDNSAnswerResponse,test_dns_answer_response +TestDurationInSeconds,test_duration_in_seconds +TestEventPatternRequest,test_event_pattern_request +TestEventPatternResponse,test_event_pattern_response +TestEventType,test_event_type +TestExecutionResultFilterBy,test_execution_result_filter_by +TestExecutionResultItems,test_execution_result_items +TestExecutionSortBy,test_execution_sort_by +TestExecutionSummary,test_execution_summary +TestExecutionTarget,test_execution_target +TestFailoverMessage,test_failover_message +TestFailoverNotAvailableFault,test_failover_not_available_fault +TestFailoverResult,test_failover_result +TestFunctionFailed,test_function_failed +TestFunctionRequest,test_function_request +TestFunctionResult,test_function_result +TestGridProject,test_grid_project +TestGridSession,test_grid_session +TestGridSessionAction,test_grid_session_action +TestGridSessionArtifact,test_grid_session_artifact +TestGridVpcConfig,test_grid_vpc_config +TestHypervisorConfigurationInput,test_hypervisor_configuration_input +TestIdentityProviderRequest,test_identity_provider_request +TestIdentityProviderResponse,test_identity_provider_response +TestInvokeAuthorizerRequest,test_invoke_authorizer_request +TestInvokeAuthorizerResponse,test_invoke_authorizer_response +TestInvokeMethodRequest,test_invoke_method_request +TestInvokeMethodResponse,test_invoke_method_response +TestMetricFilterRequest,test_metric_filter_request +TestMetricFilterResponse,test_metric_filter_response +TestMigrationMessage,test_migration_message +TestMigrationResponse,test_migration_response +TestMode,test_mode +TestPassed,test_passed +TestPhoneNumber,test_phone_number +TestRecommendation,test_recommendation +TestRenderEmailTemplateRequest,test_render_email_template_request +TestRenderEmailTemplateResponse,test_render_email_template_response +TestRenderTemplateRequest,test_render_template_request +TestRenderTemplateResponse,test_render_template_response +TestReportSummary,test_report_summary +TestRepositoryTriggersInput,test_repository_triggers_input +TestRepositoryTriggersOutput,test_repository_triggers_output +TestResult,test_result +TestRoleRequest,test_role_request +TestRoleResponse,test_role_response +TestS3Uri,test_s3_uri +TestSegmentPatternRequest,test_segment_pattern_request +TestSegmentPatternResponse,test_segment_pattern_response +TestSetDiscrepancyErrors,test_set_discrepancy_errors +TestSetDiscrepancyReportBotAliasTarget,test_set_discrepancy_report_bot_alias_target +TestSetDiscrepancyReportResourceTarget,test_set_discrepancy_report_resource_target +TestSetExportSpecification,test_set_export_specification +TestSetGenerationDataSource,test_set_generation_data_source +TestSetImportInputLocation,test_set_import_input_location +TestSetImportResourceSpecification,test_set_import_resource_specification +TestSetIntentDiscrepancyItem,test_set_intent_discrepancy_item +TestSetSlotDiscrepancyItem,test_set_slot_discrepancy_item +TestSetSortBy,test_set_sort_by +TestSetStorageLocation,test_set_storage_location +TestSetSummary,test_set_summary +TestSetTurnRecord,test_set_turn_record +TestSetTurnResult,test_set_turn_result +TestTypeInput,test_type_input +TestTypeOutput,test_type_output +TestWindowEnd,test_window_end +TestWindowStart,test_window_start +TestWindowSummary,test_window_summary +TestWindows,test_windows +TestWirelessDeviceRequest,test_wireless_device_request +TestWirelessDeviceResponse,test_wireless_device_response +TestingData,testing_data +TestingDataResult,testing_data_result +Text,text +TextArea,text_area +TextAreaControlDisplayOptions,text_area_control_display_options +TextArrayOptions,text_array_options +TextBody,text_body +TextBoxes,text_boxes +TextClassificationJobConfig,text_classification_job_config +TextColor,text_color +TextConditionalFormat,text_conditional_format +TextConfig,text_config +TextContent,text_content +TextContentUpdate,text_content_update +TextControlPlaceholderOptions,text_control_placeholder_options +TextDetection,text_detection +TextDetectionResult,text_detection_result +TextDetections,text_detections +TextDocumentStatistics,text_document_statistics +TextField,text_field +TextFieldControlDisplayOptions,text_field_control_display_options +TextFormat,text_format +TextInputEvent,text_input_event +TextInputSpecification,text_input_specification +TextLengthExceededException,text_length_exceeded_exception +TextList,text_list +TextLocales,text_locales +TextLogDestination,text_log_destination +TextLogSetting,text_log_setting +TextModelVersion,text_model_version +TextOptions,text_options +TextPart,text_part +TextPlain,text_plain +TextQualifier,text_qualifier +TextResponseEvent,text_response_event +TextSizeLimitExceededException,text_size_limit_exceeded_exception +TextTransformation,text_transformation +TextTransformations,text_transformations +TextTranslationJobFilter,text_translation_job_filter +TextTranslationJobProperties,text_translation_job_properties +TextTranslationJobPropertiesList,text_translation_job_properties_list +TextType,text_type +TextWithHighlights,text_with_highlights +TextWithHighlightsValue,text_with_highlights_value +TextWrap,text_wrap +Theme,theme +ThemeAlias,theme_alias +ThemeAliasList,theme_alias_list +ThemeArn,theme_arn +ThemeConfiguration,theme_configuration +ThemeError,theme_error +ThemeId,theme_id +ThemeSummary,theme_summary +ThemeSummaryList,theme_summary_list +ThemeValue,theme_value +ThemeValues,theme_values +ThemeVersion,theme_version +ThemeVersionNumber,theme_version_number +ThemeVersionSummary,theme_version_summary +ThemeVersionSummaryList,theme_version_summary_list +Themes,themes +ThesaurusSummary,thesaurus_summary +ThesaurusSummaryItems,thesaurus_summary_items +Thickness,thickness +Thing,thing +ThingArn,thing_arn +ThingAttribute,thing_attribute +ThingConnectivity,thing_connectivity +ThingDocument,thing_document +ThingGroupDocument,thing_group_document +ThingGroupIndexingConfiguration,thing_group_indexing_configuration +ThingGroupMetadata,thing_group_metadata +ThingGroupProperties,thing_group_properties +ThingIndexingConfiguration,thing_indexing_configuration +ThingName,thing_name +ThingTypeDefinition,thing_type_definition +ThingTypeMetadata,thing_type_metadata +ThingTypeProperties,thing_type_properties +ThirdPartyFirewall,third_party_firewall +ThirdPartyFirewallFirewallPolicies,third_party_firewall_firewall_policies +ThirdPartyFirewallFirewallPolicy,third_party_firewall_firewall_policy +ThirdPartyFirewallMissingExpectedRouteTableViolation,third_party_firewall_missing_expected_route_table_violation +ThirdPartyFirewallMissingFirewallViolation,third_party_firewall_missing_firewall_violation +ThirdPartyFirewallMissingSubnetViolation,third_party_firewall_missing_subnet_violation +ThirdPartyFirewallPolicy,third_party_firewall_policy +ThirdPartyFirewallStatus,third_party_firewall_status +ThirdPartyJob,third_party_job +ThirdPartyJobData,third_party_job_data +ThirdPartyJobDetails,third_party_job_details +ThirdPartySourceRepository,third_party_source_repository +ThousandSeparatorOptions,thousand_separator_options +ThousandsSeparator,thousands_separator +ThreadFieldMappings,thread_field_mappings +ThreadId,thread_id +ThreadsPerCore,threads_per_core +Threat,threat +ThreatDetectedByName,threat_detected_by_name +ThreatIntelIndicator,threat_intel_indicator +ThreatIntelIndicatorCategory,threat_intel_indicator_category +ThreatIntelIndicatorLastObservedAt,threat_intel_indicator_last_observed_at +ThreatIntelIndicatorSource,threat_intel_indicator_source +ThreatIntelIndicatorSourceUrl,threat_intel_indicator_source_url +ThreatIntelIndicatorType,threat_intel_indicator_type +ThreatIntelIndicatorValue,threat_intel_indicator_value +ThreatIntelIndicators,threat_intel_indicators +ThreatIntelSetId,threat_intel_set_id +ThreatIntelSetIds,threat_intel_set_ids +ThreatIntelligenceDetail,threat_intelligence_detail +ThreatIntelligenceDetails,threat_intelligence_details +ThreatListName,threat_list_name +ThreatName,threat_name +ThreatNames,threat_names +Threats,threats +ThreatsDetectedItemCount,threats_detected_item_count +Threshold,threshold +ThresholdComparator,threshold_comparator +ThresholdCount,threshold_count +ThresholdExpression,threshold_expression +ThresholdFraction,threshold_fraction +ThresholdMetricId,threshold_metric_id +ThresholdPercentage,threshold_percentage +ThresholdType,threshold_type +ThresholdV2,threshold_v2 +ThresholdValue,threshold_value +ThresholdsWaitTime,thresholds_wait_time +ThrottleCount,throttle_count +ThrottleSettings,throttle_settings +ThrottledClientException,throttled_client_exception +ThrottledException,throttled_exception +ThrottlingBurstLimit,throttling_burst_limit +ThrottlingException,throttling_exception +ThrottlingRateLimit,throttling_rate_limit +ThroughResources,through_resources +ThroughResourcesStatement,through_resources_statement +ThroughResourcesStatementRequest,through_resources_statement_request +Throughput,throughput +ThroughputCapacity,throughput_capacity +ThroughputLimitExceeded,throughput_limit_exceeded +ThroughputMode,throughput_mode +ThroughputOther,throughput_other +ThroughputRead,throughput_read +ThroughputTotal,throughput_total +ThroughputWrite,throughput_write +ThrowOnDuplicate,throw_on_duplicate +Thumbnail,thumbnail +ThumbnailConfig,thumbnail_config +ThumbnailConfiguration,thumbnail_configuration +ThumbnailDetail,thumbnail_detail +ThumbnailDetails,thumbnail_details +ThumbnailEncryption,thumbnail_encryption +ThumbnailHeight,thumbnail_height +ThumbnailInterval,thumbnail_interval +ThumbnailPattern,thumbnail_pattern +ThumbnailType,thumbnail_type +ThumbnailWidth,thumbnail_width +Thumbnails,thumbnails +Thumbprint,thumbprint +ThumbprintList,thumbprint_list +Thursday,thursday +TicServerUrl,tic_server_url +TickLabelOptions,tick_label_options +TicketId,ticket_id +TicketIds,ticket_ids +TicketList,ticket_list +Tier,tier +Tiering,tiering +TieringPolicy,tiering_policy +TieringStartTime,tiering_start_time +Tierings,tierings +Tile,tile +TileAspectRatio,tile_aspect_ratio +TileCount,tile_count +TileHeight,tile_height +TileLayout,tile_layout +TileLayoutStyle,tile_layout_style +TileOrder,tile_order +TilePosition,tile_position +TileStyle,tile_style +TileWidth,tile_width +Tiles,tiles +Time,time +TimeAlignmentBoundary,time_alignment_boundary +TimeBasedAutoScalingConfiguration,time_based_auto_scaling_configuration +TimeBasedAutoScalingConfigurations,time_based_auto_scaling_configurations +TimeBasedCanary,time_based_canary +TimeBasedCollectionScheme,time_based_collection_scheme +TimeBasedForecastProperties,time_based_forecast_properties +TimeBasedLinear,time_based_linear +TimeColumn,time_column +TimeCommitmentInSeconds,time_commitment_in_seconds +TimeCreated,time_created +TimeDelaySeconds,time_delay_seconds +TimeDelta,time_delta +TimeDeltaUnits,time_delta_units +TimeEqualityFilter,time_equality_filter +TimeFormat,time_format +TimeGranularity,time_granularity +TimeInNanos,time_in_nanos +TimeLeftSeconds,time_left_seconds +TimeLimitExceededException,time_limit_exceeded_exception +TimeLoggingStarted,time_logging_started +TimeLoggingStopped,time_logging_stopped +TimeOfDay,time_of_day +TimeOfTheDay,time_of_the_day +TimeOffset,time_offset +TimePeriod,time_period +TimePointGranularity,time_point_granularity +TimeRange,time_range +TimeRangeDrillDownFilter,time_range_drill_down_filter +TimeRangeFilter,time_range_filter +TimeRangeFilterInput,time_range_filter_input +TimeRangeFilterOutput,time_range_filter_output +TimeRangeFilterValue,time_range_filter_value +TimeRangeLowerBound,time_range_lower_bound +TimeRangeType,time_range_type +TimeRangeUpperBound,time_range_upper_bound +TimeRangeValue,time_range_value +TimeRanges,time_ranges +TimeSeries,time_series +TimeSeriesCondition,time_series_condition +TimeSeriesConditions,time_series_conditions +TimeSeriesConfig,time_series_config +TimeSeriesDataPoint,time_series_data_point +TimeSeriesFeedback,time_series_feedback +TimeSeriesForecastingJobConfig,time_series_forecasting_job_config +TimeSeriesForecastingSettings,time_series_forecasting_settings +TimeSeriesGranularity,time_series_granularity +TimeSeriesId,time_series_id +TimeSeriesIdentifiers,time_series_identifiers +TimeSeriesList,time_series_list +TimeSeriesMeasureValueColumnInfo,time_series_measure_value_column_info +TimeSeriesReplacementsDataSource,time_series_replacements_data_source +TimeSeriesSelector,time_series_selector +TimeSeriesServiceStatistics,time_series_service_statistics +TimeSeriesSummaries,time_series_summaries +TimeSeriesSummary,time_series_summary +TimeSeriesTransformation,time_series_transformation +TimeSeriesTransformations,time_series_transformations +TimeSeriesValue,time_series_value +TimeSignalMessage,time_signal_message +TimeSpan,time_span +TimeStamp,time_stamp +TimeToLive,time_to_live +TimeToLiveDescription,time_to_live_description +TimeToLiveInSeconds,time_to_live_in_seconds +TimeToLiveSpecification,time_to_live_specification +TimeToLiveStatus,time_to_live_status +TimeUnit,time_unit +TimeWindow,time_window +TimeZone,time_zone +TimeZoneId,time_zone_id +Timecode,timecode +TimecodeBurnin,timecode_burnin +TimecodeBurninSettings,timecode_burnin_settings +TimecodeConfig,timecode_config +TimecodeInsertion,timecode_insertion +TimecodeSource,timecode_source +TimecodeStart,timecode_start +TimedMetadata,timed_metadata +TimedMetadataBehavior,timed_metadata_behavior +TimedMetadataBoxVersion,timed_metadata_box_version +TimedMetadataId3Frame,timed_metadata_id3_frame +TimedMetadataId3Period,timed_metadata_id3_period +TimedMetadataInsertion,timed_metadata_insertion +TimedMetadataPid,timed_metadata_pid +TimedMetadataSchemeIdUri,timed_metadata_scheme_id_uri +TimedMetadataValue,timed_metadata_value +TimedOutSteps,timed_out_steps +TimeframeCap,timeframe_cap +Timeline,timeline +TimelineEvent,timeline_event +Timeout,timeout +TimeoutAction,timeout_action +TimeoutActions,timeout_actions +TimeoutConfig,timeout_config +TimeoutCount,timeout_count +TimeoutDurationMinutes,timeout_duration_minutes +TimeoutInMillis,timeout_in_millis +TimeoutInMinutes,timeout_in_minutes +TimeoutInSeconds,timeout_in_seconds +TimeoutSeconds,timeout_seconds +Timer,timer +TimerCanceledEventAttributes,timer_canceled_event_attributes +TimerDefinition,timer_definition +TimerFiredEventAttributes,timer_fired_event_attributes +TimerStartedEventAttributes,timer_started_event_attributes +TimerType,timer_type +TimerValue,timer_value +Timers,timers +Times,times +Timestamp,timestamp +TimestampAttributeName,timestamp_attribute_name +TimestampColumn,timestamp_column +TimestampColumnName,timestamp_column_name +TimestampDeltaMilliseconds,timestamp_delta_milliseconds +TimestampForCollection,timestamp_for_collection +TimestampFormat,timestamp_format +TimestampFormats,timestamp_formats +TimestampList,timestamp_list +TimestampMetricValuePair,timestamp_metric_value_pair +TimestampMetricValuePairList,timestamp_metric_value_pair_list +TimestampOffset,timestamp_offset +TimestampOffsetMode,timestamp_offset_mode +TimestampOutOfBoundsException,timestamp_out_of_bounds_exception +TimestampPartition,timestamp_partition +TimestampRange,timestamp_range +TimestampRanges,timestamp_ranges +TimestampStructure,timestamp_structure +TimestampValue,timestamp_value +Timestamps,timestamps +TimestreamAction,timestream_action +TimestreamConfig,timestream_config +TimestreamConfiguration,timestream_configuration +TimestreamDestination,timestream_destination +TimestreamDimension,timestream_dimension +TimestreamRegistrationResponse,timestream_registration_response +TimestreamResources,timestream_resources +TimestreamSettings,timestream_settings +TimestreamTimestamp,timestream_timestamp +Timezone,timezone +TimezoneEstimationMethods,timezone_estimation_methods +TimezoneName,timezone_name +TimezoneOffset,timezone_offset +TimezonesCompletedCount,timezones_completed_count +TimezonesTotalCount,timezones_total_count +Timing,timing +TimingInformation,timing_information +TipOfSourceReferenceIsDifferentException,tip_of_source_reference_is_different_exception +TipsDivergenceExceededException,tips_divergence_exceeded_exception +Title,title +TitleAggregation,title_aggregation +TitleAggregationResponse,title_aggregation_response +TitleOptions,title_options +TitleOverride,title_override +TitleRequiredException,title_required_exception +Tld,tld +TlogAccessMode,tlog_access_mode +Tls,tls +TlsCertificate,tls_certificate +TlsCertificateData,tls_certificate_data +TlsCiphers,tls_ciphers +TlsConfig,tls_config +TlsConfigInput,tls_config_input +TlsContext,tls_context +TlsPolicy,tls_policy +TlsSessionResumptionMode,tls_session_resumption_mode +TlsValidationContext,tls_validation_context +TlsValidationContextAcmTrust,tls_validation_context_acm_trust +TlsValidationContextFileTrust,tls_validation_context_file_trust +TlsValidationContextSdsTrust,tls_validation_context_sds_trust +TmpDirIAMRole,tmp_dir_iam_role +Tmpfs,tmpfs +To,to +ToAddresses,to_addresses +ToDate,to_date +ToDbClusterArn,to_db_cluster_arn +ToExclusive,to_exclusive +ToKey,to_key +ToPhoneNumber,to_phone_number +ToPort,to_port +ToTime,to_time +ToTimeStamp,to_time_stamp +ToType,to_type +ToggleButtonsVisibility,toggle_buttons_visibility +Token,token +TokenAlreadyExistsException,token_already_exists_exception +TokenBalance,token_balance +TokenCode,token_code +TokenData,token_data +TokenDomains,token_domains +TokenDuration,token_duration +TokenEndpoint,token_endpoint +TokenFilter,token_filter +TokenId,token_id +TokenIdentifier,token_identifier +TokenIds,token_ids +TokenKey,token_key +TokenKeyId,token_key_id +TokenProperties,token_properties +TokenType,token_type +TokenValidityUnits,token_validity_units +TokenValidityUnitsType,token_validity_units_type +TokenValue,token_value +TokenizedBody,tokenized_body +TokenizedTitle,tokenized_title +Tokens,tokens +TollFreePrefix,toll_free_prefix +TooLongCSPInResponseHeadersPolicy,too_long_csp_in_response_headers_policy +TooManyAccessPointsException,too_many_access_points_exception +TooManyActionsException,too_many_actions_exception +TooManyApplicationVersionsException,too_many_application_versions_exception +TooManyApplicationsException,too_many_applications_exception +TooManyBucketsException,too_many_buckets_exception +TooManyCacheBehaviors,too_many_cache_behaviors +TooManyCachePolicies,too_many_cache_policies +TooManyCertificates,too_many_certificates +TooManyCertificatesException,too_many_certificates_exception +TooManyCloudFrontOriginAccessIdentities,too_many_cloud_front_origin_access_identities +TooManyConfigurationTemplatesException,too_many_configuration_templates_exception +TooManyContinuousDeploymentPolicies,too_many_continuous_deployment_policies +TooManyCookieNamesInWhiteList,too_many_cookie_names_in_white_list +TooManyCookiesInCachePolicy,too_many_cookies_in_cache_policy +TooManyCookiesInOriginRequestPolicy,too_many_cookies_in_origin_request_policy +TooManyCustomHeadersInResponseHeadersPolicy,too_many_custom_headers_in_response_headers_policy +TooManyDistributionCNAMEs,too_many_distribution_cnames +TooManyDistributions,too_many_distributions +TooManyDistributionsAssociatedToCachePolicy,too_many_distributions_associated_to_cache_policy +TooManyDistributionsAssociatedToFieldLevelEncryptionConfig,too_many_distributions_associated_to_field_level_encryption_config +TooManyDistributionsAssociatedToKeyGroup,too_many_distributions_associated_to_key_group +TooManyDistributionsAssociatedToOriginAccessControl,too_many_distributions_associated_to_origin_access_control +TooManyDistributionsAssociatedToOriginRequestPolicy,too_many_distributions_associated_to_origin_request_policy +TooManyDistributionsAssociatedToResponseHeadersPolicy,too_many_distributions_associated_to_response_headers_policy +TooManyDistributionsWithFunctionAssociations,too_many_distributions_with_function_associations +TooManyDistributionsWithLambdaAssociations,too_many_distributions_with_lambda_associations +TooManyDistributionsWithSingleFunctionARN,too_many_distributions_with_single_function_arn +TooManyEntriesInBatchRequestException,too_many_entries_in_batch_request_exception +TooManyEnvironmentsException,too_many_environments_exception +TooManyFailedAttemptsException,too_many_failed_attempts_exception +TooManyFieldLevelEncryptionConfigs,too_many_field_level_encryption_configs +TooManyFieldLevelEncryptionContentTypeProfiles,too_many_field_level_encryption_content_type_profiles +TooManyFieldLevelEncryptionEncryptionEntities,too_many_field_level_encryption_encryption_entities +TooManyFieldLevelEncryptionFieldPatterns,too_many_field_level_encryption_field_patterns +TooManyFieldLevelEncryptionProfiles,too_many_field_level_encryption_profiles +TooManyFieldLevelEncryptionQueryArgProfiles,too_many_field_level_encryption_query_arg_profiles +TooManyFunctionAssociations,too_many_function_associations +TooManyFunctions,too_many_functions +TooManyHeadersInCachePolicy,too_many_headers_in_cache_policy +TooManyHeadersInForwardedValues,too_many_headers_in_forwarded_values +TooManyHeadersInOriginRequestPolicy,too_many_headers_in_origin_request_policy +TooManyHealthChecks,too_many_health_checks +TooManyHostedZones,too_many_hosted_zones +TooManyInvalidationsInProgress,too_many_invalidations_in_progress +TooManyKeyGroups,too_many_key_groups +TooManyKeyGroupsAssociatedToDistribution,too_many_key_groups_associated_to_distribution +TooManyKeySigningKeys,too_many_key_signing_keys +TooManyLabelsException,too_many_labels_exception +TooManyLambdaFunctionAssociations,too_many_lambda_function_associations +TooManyListenersException,too_many_listeners_exception +TooManyLoadBalancersException,too_many_load_balancers_exception +TooManyOriginAccessControls,too_many_origin_access_controls +TooManyOriginCustomHeaders,too_many_origin_custom_headers +TooManyOriginGroupsPerDistribution,too_many_origin_groups_per_distribution +TooManyOriginRequestPolicies,too_many_origin_request_policies +TooManyOrigins,too_many_origins +TooManyPlatformsException,too_many_platforms_exception +TooManyPoliciesException,too_many_policies_exception +TooManyPublicKeys,too_many_public_keys +TooManyPublicKeysInKeyGroup,too_many_public_keys_in_key_group +TooManyQueryStringParameters,too_many_query_string_parameters +TooManyQueryStringsInCachePolicy,too_many_query_strings_in_cache_policy +TooManyQueryStringsInOriginRequestPolicy,too_many_query_strings_in_origin_request_policy +TooManyRealtimeLogConfigs,too_many_realtime_log_configs +TooManyRegistrationsForTargetIdException,too_many_registrations_for_target_id_exception +TooManyRemoveHeadersInResponseHeadersPolicy,too_many_remove_headers_in_response_headers_policy +TooManyRequests,too_many_requests +TooManyRequestsException,too_many_requests_exception +TooManyResponseHeadersPolicies,too_many_response_headers_policies +TooManyRulesException,too_many_rules_exception +TooManyStreamingDistributionCNAMEs,too_many_streaming_distribution_cnames +TooManyStreamingDistributions,too_many_streaming_distributions +TooManySubscriptionsException,too_many_subscriptions_exception +TooManyTagKeysException,too_many_tag_keys_exception +TooManyTags,too_many_tags +TooManyTagsException,too_many_tags_exception +TooManyTagsFault,too_many_tags_fault +TooManyTargetGroupsException,too_many_target_groups_exception +TooManyTargetsException,too_many_targets_exception +TooManyTrafficPolicies,too_many_traffic_policies +TooManyTrafficPolicyInstances,too_many_traffic_policy_instances +TooManyTrafficPolicyVersionsForCurrentPolicy,too_many_traffic_policy_versions_for_current_policy +TooManyTrustedSigners,too_many_trusted_signers +TooManyUniqueTargetGroupsPerLoadBalancerException,too_many_unique_target_groups_per_load_balancer_exception +TooManyUpdates,too_many_updates +TooManyVPCAssociationAuthorizations,too_many_vpc_association_authorizations +Tool,tool +Toolchain,toolchain +ToolchainSource,toolchain_source +ToolsVersion,tools_version +Tooltip,tooltip +TooltipFields,tooltip_fields +TooltipItem,tooltip_item +TooltipOptions,tooltip_options +TooltipTitleType,tooltip_title_type +TooltipVisibility,tooltip_visibility +Top,top +TopAnomalousServices,top_anomalous_services +TopAnswer,top_answer +TopBottomFilter,top_bottom_filter +TopBottomMovers,top_bottom_movers +TopBottomMoversComputation,top_bottom_movers_computation +TopBottomRanked,top_bottom_ranked +TopBottomRankedComputation,top_bottom_ranked_computation +TopContributors,top_contributors +TopOffset,top_offset +TopResources,top_resources +Topic,topic +TopicARN,topic_arn +TopicArn,topic_arn +TopicCalculatedField,topic_calculated_field +TopicCategoryFilter,topic_category_filter +TopicCategoryFilterConstant,topic_category_filter_constant +TopicColumn,topic_column +TopicConfiguration,topic_configuration +TopicConfigurations,topic_configurations +TopicDateRangeFilter,topic_date_range_filter +TopicDefaultPreferences,topic_default_preferences +TopicDetails,topic_details +TopicFilter,topic_filter +TopicId,topic_id +TopicLimitExceededException,topic_limit_exceeded_exception +TopicName,topic_name +TopicNamedEntity,topic_named_entity +TopicNames,topic_names +TopicNumericEqualityFilter,topic_numeric_equality_filter +TopicNumericRangeFilter,topic_numeric_range_filter +TopicPreference,topic_preference +TopicPreferences,topic_preferences +TopicRangeFilterConstant,topic_range_filter_constant +TopicRefreshDetails,topic_refresh_details +TopicRefreshSchedule,topic_refresh_schedule +TopicRefreshScheduleSummary,topic_refresh_schedule_summary +TopicRelativeDateFilter,topic_relative_date_filter +TopicRule,topic_rule +TopicRuleDestination,topic_rule_destination +TopicRuleDestinationConfiguration,topic_rule_destination_configuration +TopicRuleDestinationSummary,topic_rule_destination_summary +TopicRuleListItem,topic_rule_list_item +TopicRulePayload,topic_rule_payload +TopicScheduleType,topic_schedule_type +TopicSingularFilterConstant,topic_singular_filter_constant +TopicStatus,topic_status +TopicSummary,topic_summary +Topics,topics +TopicsDetectionJobFilter,topics_detection_job_filter +TopicsDetectionJobProperties,topics_detection_job_properties +TopicsDetectionJobPropertiesList,topics_detection_job_properties_list +TopicsSummaries,topics_summaries +Topk,topk +ToscaOverride,tosca_override +Total,total +TotalActions,total_actions +TotalActualHours,total_actual_hours +TotalActualSpend,total_actual_spend +TotalActualUnits,total_actual_units +TotalAddressCount,total_address_count +TotalAggregation,total_aggregation +TotalAggregationComputation,total_aggregation_computation +TotalAmortizedCommitment,total_amortized_commitment +TotalAmortizedFee,total_amortized_fee +TotalAuthenticatedEntities,total_authenticated_entities +TotalAvailableAddressCount,total_available_address_count +TotalBackupSizeInMegaBytes,total_backup_size_in_mega_bytes +TotalBarLabel,total_bar_label +TotalBytes,total_bytes +TotalCap,total_cap +TotalCapacity,total_capacity +TotalCapacityProvisioned,total_capacity_provisioned +TotalCapacityUsed,total_capacity_used +TotalCellStyle,total_cell_style +TotalCodeSize,total_code_size +TotalCommitment,total_commitment +TotalCost,total_cost +TotalCount,total_count +TotalDataInMegaBytes,total_data_in_mega_bytes +TotalDiscoveredResources,total_discovered_resources +TotalDuration,total_duration +TotalEndpointCount,total_endpoint_count +TotalEntries,total_entries +TotalEstimatedMonthlySavingsAmount,total_estimated_monthly_savings_amount +TotalEstimatedMonthlySavingsPercentage,total_estimated_monthly_savings_percentage +TotalExecutionTimeInMillis,total_execution_time_in_millis +TotalExpectedSpend,total_expected_spend +TotalExtractedDataInGB,total_extracted_data_in_gb +TotalFailures,total_failures +TotalFilteredCount,total_filtered_count +TotalFpgaMemoryInMiB,total_fpga_memory_in_mib +TotalFulfilledCapacity,total_fulfilled_capacity +TotalGb,total_gb +TotalGpuMemoryInMiB,total_gpu_memory_in_mib +TotalHourlyPrice,total_hourly_price +TotalImpact,total_impact +TotalImpactFilter,total_impact_filter +TotalImpactPercentage,total_impact_percentage +TotalInferenceMemoryInMiB,total_inference_memory_in_mib +TotalInstanceCount,total_instance_count +TotalLabeled,total_labeled +TotalLabels,total_labels +TotalLocalStorageGB,total_local_storage_gb +TotalLocalStorageGBRequest,total_local_storage_gb_request +TotalLogicalCapacityUsed,total_logical_capacity_used +TotalNodes,total_nodes +TotalNumRows,total_num_rows +TotalNumberOfDuplicateTimestamps,total_number_of_duplicate_timestamps +TotalNumberOfFiles,total_number_of_files +TotalNumberOfInvalidValues,total_number_of_invalid_values +TotalNumberOfMissingValues,total_number_of_missing_values +TotalNumberOfResults,total_number_of_results +TotalNumberOfRows,total_number_of_rows +TotalNumberOfStages,total_number_of_stages +TotalNumberOfTasks,total_number_of_tasks +TotalNumberOfUnsupportedTimestamps,total_number_of_unsupported_timestamps +TotalNumberOfUsers,total_number_of_users +TotalObjects,total_objects +TotalOptions,total_options +TotalPartsCount,total_parts_count +TotalPercentageArea,total_percentage_area +TotalPieces,total_pieces +TotalPolicyCount,total_policy_count +TotalPotentialRISavings,total_potential_ri_savings +TotalProcessed,total_processed +TotalProvisionedStorageInMegaBytes,total_provisioned_storage_in_mega_bytes +TotalRecommendationCount,total_recommendation_count +TotalRecordCount,total_record_count +TotalResizeDataInMegaBytes,total_resize_data_in_mega_bytes +TotalResourceUtilization,total_resource_utilization +TotalResources,total_resources +TotalResponseTime,total_response_time +TotalResultsCount,total_results_count +TotalRowsInDataset,total_rows_in_dataset +TotalRuleCount,total_rule_count +TotalRunningHours,total_running_hours +TotalRunningHoursInLookbackPeriod,total_running_hours_in_lookback_period +TotalRunningNormalizedUnits,total_running_normalized_units +TotalScheduledInstanceHours,total_scheduled_instance_hours +TotalSegments,total_segments +TotalShards,total_shards +TotalSize,total_size +TotalSizeInGB,total_size_in_gb +TotalSizeLimitExceededException,total_size_limit_exceeded_exception +TotalSnapshotCapacityUsed,total_snapshot_capacity_used +TotalStackInstancesCount,total_stack_instances_count +TotalSteps,total_steps +TotalStorageCapacityInMegaBytes,total_storage_capacity_in_mega_bytes +TotalSuggestionsCount,total_suggestions_count +TotalTargetCapacity,total_target_capacity +TotalUnAssignedShards,total_un_assigned_shards +TotalUpfrontPrice,total_upfront_price +TotalVCpus,total_v_cpus +TotalsVisibility,totals_visibility +ToxicityCategories,toxicity_categories +ToxicityDetection,toxicity_detection +ToxicityDetectionSettings,toxicity_detection_settings +TpmSupport,tpm_support +Trace,trace +TraceConfiguration,trace_configuration +TraceContent,trace_content +TraceHeader,trace_header +TraceId,trace_id +TraceIds,trace_ids +TraceOutput,trace_output +TraceSegmentDocuments,trace_segment_documents +TraceSummaries,trace_summaries +TraceSummary,trace_summary +TraceUser,trace_user +Traceback,traceback +Traces,traces +TracesProcessedCount,traces_processed_count +TracingConfig,tracing_config +TracingConfigResponse,tracing_config_response +TracingConfiguration,tracing_configuration +TracingEnabled,tracing_enabled +Track,track +TrackData,track_data +TrackListMessage,track_list_message +TrackNumber,track_number +TrackSourceSettings,track_source_settings +TrackedActionLastAccessed,tracked_action_last_accessed +TrackedActionsLastAccessed,tracked_actions_last_accessed +TrackedClusterId,tracked_cluster_id +TrackedIsps,tracked_isps +TrackerArn,tracker_arn +TrackerName,tracker_name +TrackingConfig,tracking_config +TrackingInformation,tracking_information +TrackingNumber,tracking_number +TrackingOptions,tracking_options +TrackingOptionsAlreadyExistsException,tracking_options_already_exists_exception +TrackingOptionsDoesNotExistException,tracking_options_does_not_exist_exception +Tracks,tracks +TrafficConfig,traffic_config +TrafficDialPercentage,traffic_dial_percentage +TrafficDirection,traffic_direction +TrafficDistributionGroup,traffic_distribution_group +TrafficDistributionGroupId,traffic_distribution_group_id +TrafficDistributionGroupSummary,traffic_distribution_group_summary +TrafficDistributionGroupSummaryList,traffic_distribution_group_summary_list +TrafficDistributionGroupUserSummary,traffic_distribution_group_user_summary +TrafficDistributionGroupUserSummaryList,traffic_distribution_group_user_summary_list +TrafficMirrorFilter,traffic_mirror_filter +TrafficMirrorFilterId,traffic_mirror_filter_id +TrafficMirrorFilterIds,traffic_mirror_filter_ids +TrafficMirrorFilterRule,traffic_mirror_filter_rule +TrafficMirrorFilterRuleId,traffic_mirror_filter_rule_id +TrafficMirrorFilters,traffic_mirror_filters +TrafficMirrorPortRange,traffic_mirror_port_range +TrafficMirrorPortRangeRequest,traffic_mirror_port_range_request +TrafficMirrorSession,traffic_mirror_session +TrafficMirrorSessionId,traffic_mirror_session_id +TrafficMirrorSessionIds,traffic_mirror_session_ids +TrafficMirrorSessions,traffic_mirror_sessions +TrafficMirrorTarget,traffic_mirror_target +TrafficMirrorTargetId,traffic_mirror_target_id +TrafficMirrorTargetIds,traffic_mirror_target_ids +TrafficMirrorTargets,traffic_mirror_targets +TrafficPattern,traffic_pattern +TrafficPercentageToMonitor,traffic_percentage_to_monitor +TrafficPolicies,traffic_policies +TrafficPolicy,traffic_policy +TrafficPolicyAlreadyExists,traffic_policy_already_exists +TrafficPolicyCount,traffic_policy_count +TrafficPolicyId,traffic_policy_id +TrafficPolicyIdMarker,traffic_policy_id_marker +TrafficPolicyInUse,traffic_policy_in_use +TrafficPolicyInstance,traffic_policy_instance +TrafficPolicyInstanceAlreadyExists,traffic_policy_instance_already_exists +TrafficPolicyInstanceCount,traffic_policy_instance_count +TrafficPolicyInstanceId,traffic_policy_instance_id +TrafficPolicyInstanceNameMarker,traffic_policy_instance_name_marker +TrafficPolicyInstanceTypeMarker,traffic_policy_instance_type_marker +TrafficPolicyInstances,traffic_policy_instances +TrafficPolicySummaries,traffic_policy_summaries +TrafficPolicySummary,traffic_policy_summary +TrafficPolicyType,traffic_policy_type +TrafficPolicyVersion,traffic_policy_version +TrafficPolicyVersionMarker,traffic_policy_version_marker +TrafficRoute,traffic_route +TrafficRoutingConfig,traffic_routing_config +TrafficRoutingConfiguration,traffic_routing_configuration +TrafficSource,traffic_source +TrafficSourceIdentifier,traffic_source_identifier +TrafficSourceState,traffic_source_state +TrafficSourceType,traffic_source_type +TrafficSources,traffic_sources +TrafficType,traffic_type +Trail,trail +TrailARN,trail_arn +TrailAlreadyExistsException,trail_already_exists_exception +TrailArn,trail_arn +TrailInfo,trail_info +TrailName,trail_name +TrailNotFoundException,trail_not_found_exception +TrailNotProvidedException,trail_not_provided_exception +TrailProperties,trail_properties +Trails,trails +TrainedModelArn,trained_model_arn +TrainedModelMetrics,trained_model_metrics +TrainingChannels,training_channels +TrainingData,training_data +TrainingDataConfig,training_data_config +TrainingDataEndTime,training_data_end_time +TrainingDataResult,training_data_result +TrainingDataSchema,training_data_schema +TrainingDataSourceId,training_data_source_id +TrainingDataStartTime,training_data_start_time +TrainingEndTime,training_end_time +TrainingEndTimestamp,training_end_timestamp +TrainingExecutionEndTime,training_execution_end_time +TrainingExecutionStartTime,training_execution_start_time +TrainingImage,training_image +TrainingImageConfig,training_image_config +TrainingImageDigest,training_image_digest +TrainingInputMode,training_input_mode +TrainingJob,training_job +TrainingJobArn,training_job_arn +TrainingJobDefinition,training_job_definition +TrainingJobDefinitionName,training_job_definition_name +TrainingJobDefinitions,training_job_definitions +TrainingJobEarlyStoppingType,training_job_early_stopping_type +TrainingJobName,training_job_name +TrainingJobStatus,training_job_status +TrainingJobStatusCounters,training_job_status_counters +TrainingJobStepMetadata,training_job_step_metadata +TrainingJobSummaries,training_job_summaries +TrainingJobSummary,training_job_summary +TrainingMetrics,training_metrics +TrainingMetricsV2,training_metrics_v2 +TrainingParameters,training_parameters +TrainingRepositoryAccessMode,training_repository_access_mode +TrainingRepositoryAuthConfig,training_repository_auth_config +TrainingRepositoryCredentialsProviderArn,training_repository_credentials_provider_arn +TrainingResult,training_result +TrainingResultV2,training_result_v2 +TrainingSpecification,training_specification +TrainingStartTime,training_start_time +TrainingTimeInSeconds,training_time_in_seconds +Trait,trait +TraitDiffRule,trait_diff_rule +Traits,traits +TransactGetItem,transact_get_item +TransactGetItemsInput,transact_get_items_input +TransactGetItemsOutput,transact_get_items_output +TransactItems,transact_items +TransactStatements,transact_statements +TransactWriteItem,transact_write_item +TransactWriteItemsInput,transact_write_items_input +TransactWriteItemsOutput,transact_write_items_output +Transaction,transaction +TransactionCanceledException,transaction_canceled_exception +TransactionCommitInProgressException,transaction_commit_in_progress_exception +TransactionCommittedException,transaction_committed_exception +TransactionConflictException,transaction_conflict_exception +TransactionData,transaction_data +TransactionDescription,transaction_description +TransactionEndTime,transaction_end_time +TransactionEvent,transaction_event +TransactionId,transaction_id +TransactionInProgressException,transaction_in_progress_exception +TransactionOutputItem,transaction_output_item +TransactionStartTime,transaction_start_time +TransactionStatus,transaction_status +TransactionType,transaction_type +TransactionalMessagesPerSecond,transactional_messages_per_second +Transactions,transactions +TranscodeProfileName,transcode_profile_name +Transcript,transcript +TranscriptEvent,transcript_event +TranscriptFileUri,transcript_file_uri +TranscriptFilter,transcript_filter +TranscriptFilterType,transcript_filter_type +TranscriptResultStream,transcript_result_stream +TranscriptSourceSetting,transcript_source_setting +TranscriptionConfiguration,transcription_configuration +TranscriptionJob,transcription_job +TranscriptionJobName,transcription_job_name +TranscriptionJobStatus,transcription_job_status +TranscriptionJobSummaries,transcription_job_summaries +TranscriptionJobSummary,transcription_job_summary +TranscriptionMessages,transcription_messages +TranscriptionMessagesConcatenationConfiguration,transcription_messages_concatenation_configuration +TransferAccountId,transfer_account_id +TransferAlreadyCompletedException,transfer_already_completed_exception +TransferCertificateRequest,transfer_certificate_request +TransferCertificateResponse,transfer_certificate_response +TransferConflictException,transfer_conflict_exception +TransferContactRequest,transfer_contact_request +TransferContactResponse,transfer_contact_response +TransferData,transfer_data +TransferDomainRequest,transfer_domain_request +TransferDomainResponse,transfer_domain_response +TransferDomainToAnotherAwsAccountRequest,transfer_domain_to_another_aws_account_request +TransferDomainToAnotherAwsAccountResponse,transfer_domain_to_another_aws_account_response +TransferDuration,transfer_duration +TransferId,transfer_id +TransferInputDeviceRequest,transfer_input_device_request +TransferLock,transfer_lock +TransferMessage,transfer_message +TransferMode,transfer_mode +TransferOfferAcceptedTimestamp,transfer_offer_accepted_timestamp +TransferOfferExpirationTimestamp,transfer_offer_expiration_timestamp +TransferOption,transfer_option +TransferPrice,transfer_price +TransferStatus,transfer_status +TransferType,transfer_type +Transferability,transferability +Transferable,transferable +Transferred,transferred +TransferringInputDeviceSummary,transferring_input_device_summary +Transform,transform +TransformConfigParameter,transform_config_parameter +TransformDataSource,transform_data_source +TransformEncryption,transform_encryption +TransformEndTime,transform_end_time +TransformFilterCriteria,transform_filter_criteria +TransformId,transform_id +TransformIds,transform_ids +TransformInput,transform_input +TransformJob,transform_job +TransformJobArn,transform_job_arn +TransformJobDefinition,transform_job_definition +TransformJobName,transform_job_name +TransformJobStatus,transform_job_status +TransformJobStepMetadata,transform_job_step_metadata +TransformJobSummaries,transform_job_summaries +TransformJobSummary,transform_job_summary +TransformName,transform_name +TransformOutput,transform_output +TransformParameters,transform_parameters +TransformProcessingConfig,transform_processing_config +TransformResources,transform_resources +TransformS3DataSource,transform_s3_data_source +TransformSchema,transform_schema +TransformSortCriteria,transform_sort_criteria +TransformStartTime,transform_start_time +TransformType,transform_type +TransformationConfigurations,transformation_configurations +TransformationRules,transformation_rules +TransformationTool,transformation_tool +Transformations,transformations +Transforms,transforms +TransitEncryption,transit_encryption +TransitEncryptionEnabled,transit_encryption_enabled +TransitEncryptionMode,transit_encryption_mode +TransitEncryptionPort,transit_encryption_port +TransitGateway,transit_gateway +TransitGatewayAddress,transit_gateway_address +TransitGatewayArn,transit_gateway_arn +TransitGatewayArns,transit_gateway_arns +TransitGatewayAsn,transit_gateway_asn +TransitGatewayAssociation,transit_gateway_association +TransitGatewayAttachment,transit_gateway_attachment +TransitGatewayAttachmentArn,transit_gateway_attachment_arn +TransitGatewayAttachmentAssociation,transit_gateway_attachment_association +TransitGatewayAttachmentBgpConfiguration,transit_gateway_attachment_bgp_configuration +TransitGatewayAttachmentId,transit_gateway_attachment_id +TransitGatewayAttachmentIds,transit_gateway_attachment_ids +TransitGatewayAttachmentPropagation,transit_gateway_attachment_propagation +TransitGatewayAttachmentPropagations,transit_gateway_attachment_propagations +TransitGatewayAttachments,transit_gateway_attachments +TransitGatewayCidrBlocks,transit_gateway_cidr_blocks +TransitGatewayConfiguration,transit_gateway_configuration +TransitGatewayConnect,transit_gateway_connect +TransitGatewayConnectOptions,transit_gateway_connect_options +TransitGatewayConnectPeer,transit_gateway_connect_peer +TransitGatewayConnectPeerArn,transit_gateway_connect_peer_arn +TransitGatewayConnectPeerArns,transit_gateway_connect_peer_arns +TransitGatewayConnectPeerAssociation,transit_gateway_connect_peer_association +TransitGatewayConnectPeerAssociations,transit_gateway_connect_peer_associations +TransitGatewayConnectPeerConfiguration,transit_gateway_connect_peer_configuration +TransitGatewayConnectPeerId,transit_gateway_connect_peer_id +TransitGatewayConnectPeerIds,transit_gateway_connect_peer_ids +TransitGatewayConnectPeers,transit_gateway_connect_peers +TransitGatewayConnectRequestBgpOptions,transit_gateway_connect_request_bgp_options +TransitGatewayConnects,transit_gateway_connects +TransitGatewayId,transit_gateway_id +TransitGatewayIds,transit_gateway_ids +TransitGatewayMulticastDeregisteredGroupMembers,transit_gateway_multicast_deregistered_group_members +TransitGatewayMulticastDeregisteredGroupSources,transit_gateway_multicast_deregistered_group_sources +TransitGatewayMulticastDomain,transit_gateway_multicast_domain +TransitGatewayMulticastDomainArn,transit_gateway_multicast_domain_arn +TransitGatewayMulticastDomainAssociation,transit_gateway_multicast_domain_association +TransitGatewayMulticastDomainAssociations,transit_gateway_multicast_domain_associations +TransitGatewayMulticastDomainId,transit_gateway_multicast_domain_id +TransitGatewayMulticastDomainIds,transit_gateway_multicast_domain_ids +TransitGatewayMulticastDomainOptions,transit_gateway_multicast_domain_options +TransitGatewayMulticastDomains,transit_gateway_multicast_domains +TransitGatewayMulticastGroup,transit_gateway_multicast_group +TransitGatewayMulticastRegisteredGroupMembers,transit_gateway_multicast_registered_group_members +TransitGatewayMulticastRegisteredGroupSources,transit_gateway_multicast_registered_group_sources +TransitGatewayOptions,transit_gateway_options +TransitGatewayOwnerId,transit_gateway_owner_id +TransitGatewayPeering,transit_gateway_peering +TransitGatewayPeeringAttachment,transit_gateway_peering_attachment +TransitGatewayPeeringAttachmentId,transit_gateway_peering_attachment_id +TransitGatewayPeeringAttachmentOptions,transit_gateway_peering_attachment_options +TransitGatewayPeeringAttachments,transit_gateway_peering_attachments +TransitGatewayPolicyRule,transit_gateway_policy_rule +TransitGatewayPolicyRuleMetaData,transit_gateway_policy_rule_meta_data +TransitGatewayPolicyTable,transit_gateway_policy_table +TransitGatewayPolicyTableAssociation,transit_gateway_policy_table_association +TransitGatewayPolicyTableEntries,transit_gateway_policy_table_entries +TransitGatewayPolicyTableEntry,transit_gateway_policy_table_entry +TransitGatewayPolicyTableId,transit_gateway_policy_table_id +TransitGatewayPolicyTableIds,transit_gateway_policy_table_ids +TransitGatewayPolicyTables,transit_gateway_policy_tables +TransitGatewayPrefixListAttachment,transit_gateway_prefix_list_attachment +TransitGatewayPrefixListReference,transit_gateway_prefix_list_reference +TransitGatewayPrefixListReferences,transit_gateway_prefix_list_references +TransitGatewayPropagation,transit_gateway_propagation +TransitGatewayRegistration,transit_gateway_registration +TransitGatewayRegistrationStateReason,transit_gateway_registration_state_reason +TransitGatewayRegistrations,transit_gateway_registrations +TransitGatewayRequestOptions,transit_gateway_request_options +TransitGatewayRoute,transit_gateway_route +TransitGatewayRouteAttachment,transit_gateway_route_attachment +TransitGatewayRouteTable,transit_gateway_route_table +TransitGatewayRouteTableAnnouncement,transit_gateway_route_table_announcement +TransitGatewayRouteTableAnnouncementId,transit_gateway_route_table_announcement_id +TransitGatewayRouteTableAnnouncementIds,transit_gateway_route_table_announcement_ids +TransitGatewayRouteTableAnnouncements,transit_gateway_route_table_announcements +TransitGatewayRouteTableArn,transit_gateway_route_table_arn +TransitGatewayRouteTableAssociation,transit_gateway_route_table_association +TransitGatewayRouteTableAttachment,transit_gateway_route_table_attachment +TransitGatewayRouteTableId,transit_gateway_route_table_id +TransitGatewayRouteTableIds,transit_gateway_route_table_ids +TransitGatewayRouteTablePropagation,transit_gateway_route_table_propagation +TransitGatewayRouteTablePropagations,transit_gateway_route_table_propagations +TransitGatewayRouteTableRoute,transit_gateway_route_table_route +TransitGatewayRouteTables,transit_gateway_route_tables +TransitGatewayVpcAttachment,transit_gateway_vpc_attachment +TransitGatewayVpcAttachmentOptions,transit_gateway_vpc_attachment_options +TransitGatewayVpcAttachments,transit_gateway_vpc_attachments +TransitGateways,transit_gateways +Transition,transition +TransitionEvent,transition_event +TransitionState,transition_state +TransitionToIA,transition_to_ia +TransitionToPrimaryStorageClass,transition_to_primary_storage_class +Transitions,transitions +TransitiveTagKeys,transitive_tag_keys +TranslateDocumentRequest,translate_document_request +TranslateDocumentResponse,translate_document_response +TranslatePinDataInput,translate_pin_data_input +TranslatePinDataOutput,translate_pin_data_output +TranslateTextRequest,translate_text_request +TranslateTextResponse,translate_text_response +TranslatedDocument,translated_document +TranslatedDocumentsCount,translated_documents_count +TranslatedText,translated_text +TranslationPinDataIsoFormat034,translation_pin_data_iso_format034 +TranslationSettings,translation_settings +TransmissionInterval,transmission_interval +TransmitMode,transmit_mode +Transport,transport +TransportAttachmentId,transport_attachment_id +TransportProtocol,transport_protocol +TransportStreamBitrate,transport_stream_bitrate +TransportStreamId,transport_stream_id +TransportStreamReservedBitrate,transport_stream_reserved_bitrate +TransportTransitGatewayAttachmentId,transport_transit_gateway_attachment_id +TravelMode,travel_mode +TreatMissingData,treat_missing_data +TreatUndefinedSpecifiedValues,treat_undefined_specified_values +TreatUnrecognizedResourceTypesAsWarnings,treat_unrecognized_resource_types_as_warnings +Treatment,treatment +TreatmentConfig,treatment_config +TreatmentDescription,treatment_description +TreatmentId,treatment_id +TreatmentName,treatment_name +TreatmentOption,treatment_option +TreatmentResource,treatment_resource +TreeMapAggregatedFieldWells,tree_map_aggregated_field_wells +TreeMapConfiguration,tree_map_configuration +TreeMapFieldWells,tree_map_field_wells +TreeMapGroupItemsLimitConfiguration,tree_map_group_items_limit_configuration +TreeMapSort,tree_map_sort +TreeMapSortConfiguration,tree_map_sort_configuration +TreeMapVisual,tree_map_visual +TrendArrowOptions,trend_arrow_options +TrendArrows,trend_arrows +TrendGroupSort,trend_group_sort +TrendGroups,trend_groups +Trendmicro,trendmicro +TrendmicroConnectorProfileCredentials,trendmicro_connector_profile_credentials +TrendmicroSourceProperties,trendmicro_source_properties +Trial,trial +TrialArn,trial_arn +TrialComponent,trial_component +TrialComponentArn,trial_component_arn +TrialComponentArtifact,trial_component_artifact +TrialComponentDisplayName,trial_component_display_name +TrialComponentMetricSummary,trial_component_metric_summary +TrialComponentName,trial_component_name +TrialComponentSimpleSummary,trial_component_simple_summary +TrialComponentSource,trial_component_source +TrialComponentSourceDetail,trial_component_source_detail +TrialComponentStatus,trial_component_status +TrialComponentSummaries,trial_component_summaries +TrialComponentSummary,trial_component_summary +TrialMinutes,trial_minutes +TrialName,trial_name +TrialSource,trial_source +TrialSummaries,trial_summaries +TrialSummary,trial_summary +Trigger,trigger +TriggerConfig,trigger_config +TriggerDetails,trigger_details +TriggerEventSource,trigger_event_source +TriggerFindingId,trigger_finding_id +TriggerName,trigger_name +TriggerNames,trigger_names +TriggerNodeDetails,trigger_node_details +TriggerProperties,trigger_properties +TriggerTargetsLimitExceededException,trigger_targets_limit_exceeded_exception +TriggerTime,trigger_time +TriggerType,trigger_type +TriggerUpdate,trigger_update +TriggerValue,trigger_value +TriggeredAlarms,triggered_alarms +TriggeredBy,triggered_by +TriggeringDataset,triggering_dataset +Triggers,triggers +TriggersNotFound,triggers_not_found +TrimBlanks,trim_blanks +TrimSpaceInChar,trim_space_in_char +TrimWhiteSpace,trim_white_space +TrimmedDataAccessException,trimmed_data_access_exception +TruckDimensions,truck_dimensions +TruckModeOptions,truck_mode_options +TruckWeight,truck_weight +TrueActivity,true_activity +TruePeakLimiterThreshold,true_peak_limiter_threshold +TruncateColumns,truncate_columns +Truncated,truncated +TrunkInterfaceAssociation,trunk_interface_association +TrunkInterfaceId,trunk_interface_id +Trust,trust +TrustAnchor,trust_anchor +TrustAnchorCertificate,trust_anchor_certificate +TrustAnchorDetail,trust_anchor_detail +TrustAnchorDetailResponse,trust_anchor_detail_response +TrustAnchors,trust_anchors +TrustDirection,trust_direction +TrustId,trust_id +TrustIds,trust_ids +TrustPassword,trust_password +TrustProviderType,trust_provider_type +TrustState,trust_state +TrustStateReason,trust_state_reason +TrustStore,trust_store +TrustStoreSummary,trust_store_summary +TrustType,trust_type +TrustedAdvisorCategorySpecificSummary,trusted_advisor_category_specific_summary +TrustedAdvisorCheckDescription,trusted_advisor_check_description +TrustedAdvisorCheckRefreshStatus,trusted_advisor_check_refresh_status +TrustedAdvisorCheckResult,trusted_advisor_check_result +TrustedAdvisorCheckSummary,trusted_advisor_check_summary +TrustedAdvisorCostOptimizingSummary,trusted_advisor_cost_optimizing_summary +TrustedAdvisorIntegrationStatus,trusted_advisor_integration_status +TrustedAdvisorResourceDetail,trusted_advisor_resource_detail +TrustedAdvisorResourcesSummary,trusted_advisor_resources_summary +TrustedCertificatePublicKey,trusted_certificate_public_key +TrustedHostKeys,trusted_host_keys +TrustedKeyGroupDoesNotExist,trusted_key_group_does_not_exist +TrustedKeyGroups,trusted_key_groups +TrustedResourceOwners,trusted_resource_owners +TrustedSignerDoesNotExist,trusted_signer_does_not_exist +TrustedSigners,trusted_signers +Trusts,trusts +TruststoreUri,truststore_uri +TruststoreVersion,truststore_version +TruststoreWarnings,truststore_warnings +TruthyCellValue,truthy_cell_value +TruthyCellValueSynonyms,truthy_cell_value_synonyms +TsEncryptionMethod,ts_encryption_method +TsFileMode,ts_file_mode +TsIncludeDvbSubtitles,ts_include_dvb_subtitles +TsUseAudioRenditionGroup,ts_use_audio_rendition_group +TsvOptions,tsv_options +TsvStoreOptions,tsv_store_options +TsvVersionOptions,tsv_version_options +Ttl,ttl +TtlDuration,ttl_duration +TtmlDestinationSettings,ttml_destination_settings +Tuesday,tuesday +TumblingWindow,tumbling_window +TumblingWindowInSeconds,tumbling_window_in_seconds +TunedHPOParams,tuned_hpo_params +TunedHyperParameters,tuned_hyper_parameters +TuningDataS3Uri,tuning_data_s3_uri +TuningJob,tuning_job +TuningJobArn,tuning_job_arn +TuningJobCompletionCriteria,tuning_job_completion_criteria +TuningJobCompletionDetails,tuning_job_completion_details +TuningJobName,tuning_job_name +TuningJobStepMetaData,tuning_job_step_meta_data +TuningObjective,tuning_objective +Tunnel,tunnel +TunnelInsideCidr,tunnel_inside_cidr +TunnelInsideIpVersion,tunnel_inside_ip_version +TunnelInsideIpv6Cidr,tunnel_inside_ipv6_cidr +TunnelOption,tunnel_option +TunnelOptions,tunnel_options +TunnelSummary,tunnel_summary +TurkErrorCode,turk_error_code +TurnControlUrl,turn_control_url +TurnSpecification,turn_specification +TwitterParameters,twitter_parameters +TwoWayChannelArn,two_way_channel_arn +TwoWayEnabled,two_way_enabled +Type,type +TypeAlreadyExistsFault,type_already_exists_fault +TypeArn,type_arn +TypeConfigurationAlias,type_configuration_alias +TypeConfigurationArn,type_configuration_arn +TypeConfigurationDetails,type_configuration_details +TypeConfigurationIdentifier,type_configuration_identifier +TypeConfigurationIdentifiers,type_configuration_identifiers +TypeConfigurationNotFoundException,type_configuration_not_found_exception +TypeConfigurationVersionId,type_configuration_version_id +TypeConfigurations,type_configurations +TypeDeprecatedFault,type_deprecated_fault +TypeFilters,type_filters +TypeHierarchy,type_hierarchy +TypeId,type_id +TypeIdentifier,type_identifier +TypeName,type_name +TypeNameAlias,type_name_alias +TypeNamePrefix,type_name_prefix +TypeNotFoundException,type_not_found_exception +TypeParameters,type_parameters +TypeSummaries,type_summaries +TypeSummary,type_summary +TypeTestsStatus,type_tests_status +TypeTestsStatusDescription,type_tests_status_description +TypeVersionArn,type_version_arn +TypeVersionId,type_version_id +TypeVersionSummaries,type_version_summaries +TypeVersionSummary,type_version_summary +TypedAttributeValueRange,typed_attribute_value_range +TypedLinkAttributeDefinition,typed_link_attribute_definition +TypedLinkAttributeRange,typed_link_attribute_range +TypedLinkFacet,typed_link_facet +TypedLinkFacetAttributeUpdate,typed_link_facet_attribute_update +TypedLinkName,typed_link_name +TypedLinkSchemaAndFacetName,typed_link_schema_and_facet_name +TypedLinkSpecifier,typed_link_specifier +TypedLinkSpecifiers,typed_link_specifiers +Types,types +Typography,typography +UIColorPalette,ui_color_palette +UICustomization,ui_customization +UICustomizationType,ui_customization_type +URI,uri +URL,url +URLOperation,url_operation +URLPath,url_path +URLStyling,url_styling +URLTarget,url_target +URLTemplate,url_template +USD,usd +UUID,uuid +Uarfcn,uarfcn +Uarfcndl,uarfcndl +UdpContainerSettings,udp_container_settings +UdpGroupSettings,udp_group_settings +UdpOutputSettings,udp_output_settings +UefiData,uefi_data +UhdDeviceSettings,uhd_device_settings +UiConfig,ui_config +UiTemplate,ui_template +UiTemplateInfo,ui_template_info +UiTemplateS3Uri,ui_template_s3_uri +Uid,uid +UlBucketSize,ul_bucket_size +UlRate,ul_rate +UlRatePolicy,ul_rate_policy +Ulimit,ulimit +Ulimits,ulimits +UnAuthenticated,un_authenticated +UnModifiedSinceConstraint,un_modified_since_constraint +UnableToDetectSchemaException,unable_to_detect_schema_exception +UnaggregatedField,unaggregated_field +UnapplyCustomPermissions,unapply_custom_permissions +UnarchiveApplicationRequest,unarchive_application_request +UnarchiveFindingsRequest,unarchive_findings_request +UnarchiveWaveRequest,unarchive_wave_request +UnassignInstanceRequest,unassign_instance_request +UnassignIpv6AddressesRequest,unassign_ipv6_addresses_request +UnassignIpv6AddressesResult,unassign_ipv6_addresses_result +UnassignPrivateIpAddressesRequest,unassign_private_ip_addresses_request +UnassignPrivateNatGatewayAddressRequest,unassign_private_nat_gateway_address_request +UnassignPrivateNatGatewayAddressResult,unassign_private_nat_gateway_address_result +UnassignVolumeRequest,unassign_volume_request +UnassignedIpv6Addresses,unassigned_ipv6_addresses +UnassignedIpv6Prefixes,unassigned_ipv6_prefixes +Unassigning,unassigning +Unauthenticated,unauthenticated +UnauthenticatedException,unauthenticated_exception +UnauthenticatedLogin,unauthenticated_login +UnauthorizedCacheControlHeaderStrategy,unauthorized_cache_control_header_strategy +UnauthorizedClientException,unauthorized_client_exception +UnauthorizedException,unauthorized_exception +UnauthorizedOperation,unauthorized_operation +UnauthorizedOperationException,unauthorized_operation_exception +UnauthorizedPartnerIntegrationFault,unauthorized_partner_integration_fault +UnauthorizedResourceAccessException,unauthorized_resource_access_exception +UnavailablePriorities,unavailable_priorities +UncertaintyRange,uncertainty_range +UnclaimDeviceRequest,unclaim_device_request +UnclaimDeviceResponse,unclaim_device_response +Undeploy,undeploy +UndeploySystemInstanceRequest,undeploy_system_instance_request +UndeploySystemInstanceResponse,undeploy_system_instance_response +UndeprecateActivityTypeInput,undeprecate_activity_type_input +UndeprecateDomainInput,undeprecate_domain_input +UndeprecateWorkflowTypeInput,undeprecate_workflow_type_input +UnderlayIpAddress,underlay_ip_address +UndetectedDocumentTypes,undetected_document_types +UndetectedSignature,undetected_signature +UndetectedSignatures,undetected_signatures +UndoRedoDisabled,undo_redo_disabled +UnexpectedLambdaException,unexpected_lambda_exception +UnfilteredPartition,unfiltered_partition +UnfilteredPartitions,unfiltered_partitions +UngroupResourcesInput,ungroup_resources_input +UngroupResourcesOutput,ungroup_resources_output +UnhealthySince,unhealthy_since +UnhealthyThreshold,unhealthy_threshold +UnhealthyThresholdCount,unhealthy_threshold_count +UnicodeIcon,unicode_icon +UniformBorder,uniform_border +UniformResourceIdentifier,uniform_resource_identifier +UnindexedFace,unindexed_face +UnindexedFaces,unindexed_faces +UninitializedAccountException,uninitialized_account_exception +Union,union +UnionType,union_type +UniqueAccountIdentifier,unique_account_identifier +UniqueAttribute,unique_attribute +UniqueContributors,unique_contributors +UniqueId,unique_id +UniqueKey,unique_key +UniqueProblem,unique_problem +UniqueProgramId,unique_program_id +UniqueRequestToken,unique_request_token +UniqueTag,unique_tag +UniqueTagResourceIdentifier,unique_tag_resource_identifier +UniqueThreatNameCount,unique_threat_name_count +UniqueTicPerAudioTrack,unique_tic_per_audio_track +UniqueValues,unique_values +UniqueValuesComputation,unique_values_computation +Unit,unit +UnitCost,unit_cost +UnitLabel,unit_label +UnitNumber,unit_number +UnitScaler,unit_scaler +UnitType,unit_type +Units,units +Unknown,unknown +UnknownHostCount,unknown_host_count +UnknownIpPermissions,unknown_ip_permissions +UnknownMonitorException,unknown_monitor_exception +UnknownResourceException,unknown_resource_exception +UnknownResourceFault,unknown_resource_fault +UnknownSnapshotCopyRegionFault,unknown_snapshot_copy_region_fault +UnknownSubscriptionException,unknown_subscription_exception +UnlabelParameterVersionRequest,unlabel_parameter_version_request +UnlabelParameterVersionResult,unlabel_parameter_version_result +Unlabeled,unlabeled +UnlinkDeveloperIdentityInput,unlink_developer_identity_input +UnlinkIdentityInput,unlink_identity_input +UnlockCode,unlock_code +UnlockDelay,unlock_delay +UnlockDelayUnit,unlock_delay_unit +UnlockDelayValue,unlock_delay_value +UnlockRuleRequest,unlock_rule_request +UnlockRuleResponse,unlock_rule_response +UnmappedAttribute,unmapped_attribute +UnmappedAttributes,unmapped_attributes +UnmatchedFaces,unmatched_faces +UnmatchedPolicyPermissionException,unmatched_policy_permission_exception +UnmodifiableEntityException,unmodifiable_entity_exception +UnmonitorInstancesRequest,unmonitor_instances_request +UnmonitorInstancesResult,unmonitor_instances_result +UnpeerVpcResult,unpeer_vpc_result +UnpredictableNumber,unpredictable_number +UnprocessableEntityException,unprocessable_entity_exception +UnprocessedAccount,unprocessed_account +UnprocessedAccounts,unprocessed_accounts +UnprocessedAssociationUpdates,unprocessed_association_updates +UnprocessedAssociations,unprocessed_associations +UnprocessedAutomationRule,unprocessed_automation_rule +UnprocessedAutomationRules,unprocessed_automation_rules +UnprocessedCluster,unprocessed_cluster +UnprocessedClusters,unprocessed_clusters +UnprocessedDataSources,unprocessed_data_sources +UnprocessedDataSourcesResult,unprocessed_data_sources_result +UnprocessedFindings,unprocessed_findings +UnprocessedGraph,unprocessed_graph +UnprocessedGraphs,unprocessed_graphs +UnprocessedIdentifiers,unprocessed_identifiers +UnprocessedIdentityId,unprocessed_identity_id +UnprocessedIdentityIds,unprocessed_identity_ids +UnprocessedIds,unprocessed_ids +UnprocessedItems,unprocessed_items +UnprocessedKeys,unprocessed_keys +UnprocessedNamedQueryId,unprocessed_named_query_id +UnprocessedNamedQueryIds,unprocessed_named_query_ids +UnprocessedPreparedStatementName,unprocessed_prepared_statement_name +UnprocessedPreparedStatementNames,unprocessed_prepared_statement_names +UnprocessedQueryExecutionId,unprocessed_query_execution_id +UnprocessedQueryExecutionIds,unprocessed_query_execution_ids +UnprocessedRecords,unprocessed_records +UnprocessedResourceIdentifiers,unprocessed_resource_identifiers +UnprocessedScramSecret,unprocessed_scram_secret +UnprocessedScramSecrets,unprocessed_scram_secrets +UnprocessedSecurityControl,unprocessed_security_control +UnprocessedStandardsControlAssociation,unprocessed_standards_control_association +UnprocessedStandardsControlAssociationUpdate,unprocessed_standards_control_association_update +UnprocessedStatistics,unprocessed_statistics +UnprocessedTraceIds,unprocessed_trace_ids +UnprocessedTraceSegment,unprocessed_trace_segment +UnprocessedTraceSegments,unprocessed_trace_segments +UnprocessedTypeConfigurations,unprocessed_type_configurations +UnprocessedUpdateAction,unprocessed_update_action +UnprocessedUpdateActions,unprocessed_update_actions +UnrealizedSavings,unrealized_savings +UnrecognizedClientException,unrecognized_client_exception +UnrecognizedFaces,unrecognized_faces +UnrecognizedPublicKeyEncodingException,unrecognized_public_key_encoding_exception +UnrecognizedResourceTypes,unrecognized_resource_types +UnregisterConnectorRequest,unregister_connector_request +UnregisteredSeiTimecode,unregistered_sei_timecode +UnreportedNotApplicableCount,unreported_not_applicable_count +UnreservedConcurrentExecutions,unreserved_concurrent_executions +UnresolvableUsageUnitException,unresolvable_usage_unit_exception +UnscaledValue,unscaled_value +UnsearchedFace,unsearched_face +UnsearchedFaces,unsearched_faces +UnshareApplicationRequest,unshare_application_request +UnshareDirectoryRequest,unshare_directory_request +UnshareDirectoryResult,unshare_directory_result +UnshareInterval,unshare_interval +UnshareIntervalUnit,unshare_interval_unit +UnshareTarget,unshare_target +UnspecifiedCount,unspecified_count +UnsubscribeAll,unsubscribe_all +UnsubscribeFromDatasetRequest,unsubscribe_from_dataset_request +UnsubscribeFromEventRequest,unsubscribe_from_event_request +UnsubscribeInput,unsubscribe_input +UnsubscribeRequest,unsubscribe_request +UnsubscribeResult,unsubscribe_result +Unsuccessful,unsuccessful +UnsuccessfulFaceAssociation,unsuccessful_face_association +UnsuccessfulFaceAssociations,unsuccessful_face_associations +UnsuccessfulFaceDeletion,unsuccessful_face_deletion +UnsuccessfulFaceDeletions,unsuccessful_face_deletions +UnsuccessfulFaceDisassociation,unsuccessful_face_disassociation +UnsuccessfulFaceDisassociations,unsuccessful_face_disassociations +UnsuccessfulFleetDeletions,unsuccessful_fleet_deletions +UnsuccessfulFleetRequests,unsuccessful_fleet_requests +UnsuccessfulInstanceCreditSpecificationItem,unsuccessful_instance_credit_specification_item +UnsuccessfulInstanceCreditSpecificationItemError,unsuccessful_instance_credit_specification_item_error +UnsuccessfulInstanceCreditSpecifications,unsuccessful_instance_credit_specifications +UnsuccessfulItem,unsuccessful_item +UnsuccessfulItemError,unsuccessful_item_error +UnsuccessfullyDeletedLaunchTemplateVersions,unsuccessfully_deleted_launch_template_versions +UnsupportedAPIEndpointException,unsupported_api_endpoint_exception +UnsupportedActionException,unsupported_action_exception +UnsupportedActionForDeploymentTypeException,unsupported_action_for_deployment_type_exception +UnsupportedAddressException,unsupported_address_exception +UnsupportedAvailabilityZone,unsupported_availability_zone +UnsupportedAvailabilityZoneException,unsupported_availability_zone_exception +UnsupportedCalendarException,unsupported_calendar_exception +UnsupportedCommandException,unsupported_command_exception +UnsupportedDigitalSignatureMethodException,unsupported_digital_signature_method_exception +UnsupportedDisplayLanguageCodeException,unsupported_display_language_code_exception +UnsupportedDocumentEncodingException,unsupported_document_encoding_exception +UnsupportedDocumentException,unsupported_document_exception +UnsupportedFeatureException,unsupported_feature_exception +UnsupportedFeatureRequiredException,unsupported_feature_required_exception +UnsupportedGrantTypeException,unsupported_grant_type_exception +UnsupportedIdentityProviderException,unsupported_identity_provider_exception +UnsupportedImageTypeException,unsupported_image_type_exception +UnsupportedIndexTypeException,unsupported_index_type_exception +UnsupportedInventoryItemContextException,unsupported_inventory_item_context_exception +UnsupportedInventorySchemaVersionException,unsupported_inventory_schema_version_exception +UnsupportedLanguageException,unsupported_language_exception +UnsupportedLanguagePairException,unsupported_language_pair_exception +UnsupportedLocale,unsupported_locale +UnsupportedMediaTypeException,unsupported_media_type_exception +UnsupportedNetworkConfigurationException,unsupported_network_configuration_exception +UnsupportedOperatingSystem,unsupported_operating_system +UnsupportedOperation,unsupported_operation +UnsupportedOperationException,unsupported_operation_exception +UnsupportedOperationFault,unsupported_operation_fault +UnsupportedOptionFault,unsupported_option_fault +UnsupportedParameterType,unsupported_parameter_type +UnsupportedPlatformType,unsupported_platform_type +UnsupportedPlsAlphabetException,unsupported_pls_alphabet_exception +UnsupportedPlsLanguageException,unsupported_pls_language_exception +UnsupportedPricingPlanException,unsupported_pricing_plan_exception +UnsupportedProtocolException,unsupported_protocol_exception +UnsupportedRegionException,unsupported_region_exception +UnsupportedResource,unsupported_resource +UnsupportedSettingsException,unsupported_settings_exception +UnsupportedStreamMediaTypeException,unsupported_stream_media_type_exception +UnsupportedTLD,unsupported_tld +UnsupportedTimestamps,unsupported_timestamps +UnsupportedTokenTypeException,unsupported_token_type_exception +UnsupportedUpstreamRegistryException,unsupported_upstream_registry_exception +UnsupportedUserEditionException,unsupported_user_edition_exception +UnsupportedUserStateException,unsupported_user_state_exception +UnsupportedWorkspaceConfigurationException,unsupported_workspace_configuration_exception +UntagAttendeeRequest,untag_attendee_request +UntagCertificateAuthorityRequest,untag_certificate_authority_request +UntagColumnOperation,untag_column_operation +UntagDeliveryStreamInput,untag_delivery_stream_input +UntagInput,untag_input +UntagInstanceProfileRequest,untag_instance_profile_request +UntagLogGroupRequest,untag_log_group_request +UntagMFADeviceRequest,untag_mfa_device_request +UntagMeetingRequest,untag_meeting_request +UntagOpenIDConnectProviderRequest,untag_open_id_connect_provider_request +UntagOutput,untag_output +UntagPolicyRequest,untag_policy_request +UntagProjectRequest,untag_project_request +UntagQueueRequest,untag_queue_request +UntagResourceInput,untag_resource_input +UntagResourceOutput,untag_resource_output +UntagResourceRequest,untag_resource_request +UntagResourceResponse,untag_resource_response +UntagResourceResult,untag_resource_result +UntagResourcesInput,untag_resources_input +UntagResourcesOutput,untag_resources_output +UntagRoleRequest,untag_role_request +UntagSAMLProviderRequest,untag_saml_provider_request +UntagServerCertificateRequest,untag_server_certificate_request +UntagStreamInput,untag_stream_input +UntagUserRequest,untag_user_request +UntrustedArtifactOnDeployment,untrusted_artifact_on_deployment +UnusedAccountValidityDays,unused_account_validity_days +UnusedCommitment,unused_commitment +UnusedHours,unused_hours +UnusedUnits,unused_units +Unwrap,unwrap +UpScaling,up_scaling +Update,update +UpdateACLRequest,update_acl_request +UpdateACLResponse,update_acl_response +UpdateAbpV1_0_x,update_abp_v1_0_x +UpdateAbpV1_1,update_abp_v1_1 +UpdateAcceleratorAttributesRequest,update_accelerator_attributes_request +UpdateAcceleratorAttributesResponse,update_accelerator_attributes_response +UpdateAcceleratorRequest,update_accelerator_request +UpdateAcceleratorResponse,update_accelerator_response +UpdateAccessControlConfigurationRequest,update_access_control_configuration_request +UpdateAccessKeyRequest,update_access_key_request +UpdateAccessLogSubscriptionRequest,update_access_log_subscription_request +UpdateAccessLogSubscriptionResponse,update_access_log_subscription_response +UpdateAccessPolicyRequest,update_access_policy_request +UpdateAccessPolicyResponse,update_access_policy_response +UpdateAccessRequest,update_access_request +UpdateAccessResponse,update_access_response +UpdateAccountAuditConfigurationRequest,update_account_audit_configuration_request +UpdateAccountConfigurationRequest,update_account_configuration_request +UpdateAccountConfigurationResponse,update_account_configuration_response +UpdateAccountCustomizationRequest,update_account_customization_request +UpdateAccountCustomizationResponse,update_account_customization_response +UpdateAccountPasswordPolicyRequest,update_account_password_policy_request +UpdateAccountRequest,update_account_request +UpdateAccountResponse,update_account_response +UpdateAccountSendingEnabledRequest,update_account_sending_enabled_request +UpdateAccountSettingsInput,update_account_settings_input +UpdateAccountSettingsOutput,update_account_settings_output +UpdateAccountSettingsRequest,update_account_settings_request +UpdateAccountSettingsResponse,update_account_settings_response +UpdateAction,update_action +UpdateActionAvailableDate,update_action_available_date +UpdateActionRequest,update_action_request +UpdateActionResponse,update_action_response +UpdateActionResultsMessage,update_action_results_message +UpdateActionStatus,update_action_status +UpdateActionStatusModifiedDate,update_action_status_modified_date +UpdateActionTargetRequest,update_action_target_request +UpdateActionTypeInput,update_action_type_input +UpdateActions,update_actions +UpdateActionsMessage,update_actions_message +UpdateActiveModelVersionRequest,update_active_model_version_request +UpdateActiveModelVersionResponse,update_active_model_version_response +UpdateActivities,update_activities +UpdateAddonRequest,update_addon_request +UpdateAddonResponse,update_addon_response +UpdateAddress,update_address +UpdateAddressBookRequest,update_address_book_request +UpdateAdmChannelRequest,update_adm_channel_request +UpdateAdmChannelResponse,update_adm_channel_response +UpdateAgentLogLevel,update_agent_log_level +UpdateAgentRequest,update_agent_request +UpdateAgentStatusRequest,update_agent_status_request +UpdateAgentStatusResponse,update_agent_status_response +UpdateAgreementRequest,update_agreement_request +UpdateAgreementResponse,update_agreement_response +UpdateAlarmModelRequest,update_alarm_model_request +UpdateAlarmModelResponse,update_alarm_model_response +UpdateAlertRequest,update_alert_request +UpdateAlertResponse,update_alert_response +UpdateAliasInput,update_alias_input +UpdateAliasOutput,update_alias_output +UpdateAliasRequest,update_alias_request +UpdateAllowListRequest,update_allow_list_request +UpdateAllowListResponse,update_allow_list_response +UpdateAnalysisPermissionsRequest,update_analysis_permissions_request +UpdateAnalysisPermissionsResponse,update_analysis_permissions_response +UpdateAnalysisRequest,update_analysis_request +UpdateAnalysisResponse,update_analysis_response +UpdateAnalysisTemplateInput,update_analysis_template_input +UpdateAnalysisTemplateOutput,update_analysis_template_output +UpdateAnnotationStoreRequest,update_annotation_store_request +UpdateAnnotationStoreResponse,update_annotation_store_response +UpdateAnnotationStoreVersionRequest,update_annotation_store_version_request +UpdateAnnotationStoreVersionResponse,update_annotation_store_version_response +UpdateAnomalyDetectorRequest,update_anomaly_detector_request +UpdateAnomalyDetectorResponse,update_anomaly_detector_response +UpdateAnomalyMonitorRequest,update_anomaly_monitor_request +UpdateAnomalyMonitorResponse,update_anomaly_monitor_response +UpdateAnomalySubscriptionRequest,update_anomaly_subscription_request +UpdateAnomalySubscriptionResponse,update_anomaly_subscription_response +UpdateAnswerInput,update_answer_input +UpdateAnswerOutput,update_answer_output +UpdateApiCacheRequest,update_api_cache_request +UpdateApiCacheResponse,update_api_cache_response +UpdateApiDestinationRequest,update_api_destination_request +UpdateApiDestinationResponse,update_api_destination_response +UpdateApiKeyRequest,update_api_key_request +UpdateApiKeyResponse,update_api_key_response +UpdateApiMappingRequest,update_api_mapping_request +UpdateApiMappingResponse,update_api_mapping_response +UpdateApiRequest,update_api_request +UpdateApiResponse,update_api_response +UpdateApnsChannelRequest,update_apns_channel_request +UpdateApnsChannelResponse,update_apns_channel_response +UpdateApnsSandboxChannelRequest,update_apns_sandbox_channel_request +UpdateApnsSandboxChannelResponse,update_apns_sandbox_channel_response +UpdateApnsVoipChannelRequest,update_apns_voip_channel_request +UpdateApnsVoipChannelResponse,update_apns_voip_channel_response +UpdateApnsVoipSandboxChannelRequest,update_apns_voip_sandbox_channel_request +UpdateApnsVoipSandboxChannelResponse,update_apns_voip_sandbox_channel_response +UpdateAppAuthorizationRequest,update_app_authorization_request +UpdateAppAuthorizationResponse,update_app_authorization_response +UpdateAppBlockBuilderRequest,update_app_block_builder_request +UpdateAppBlockBuilderResult,update_app_block_builder_result +UpdateAppImageConfigRequest,update_app_image_config_request +UpdateAppImageConfigResponse,update_app_image_config_response +UpdateAppInstanceBotRequest,update_app_instance_bot_request +UpdateAppInstanceBotResponse,update_app_instance_bot_response +UpdateAppInstanceRequest,update_app_instance_request +UpdateAppInstanceResponse,update_app_instance_response +UpdateAppInstanceUserEndpointRequest,update_app_instance_user_endpoint_request +UpdateAppInstanceUserEndpointResponse,update_app_instance_user_endpoint_response +UpdateAppInstanceUserRequest,update_app_instance_user_request +UpdateAppInstanceUserResponse,update_app_instance_user_response +UpdateAppMonitorRequest,update_app_monitor_request +UpdateAppRequest,update_app_request +UpdateAppResponse,update_app_response +UpdateAppResult,update_app_result +UpdateAppVersionAppComponentRequest,update_app_version_app_component_request +UpdateAppVersionAppComponentResponse,update_app_version_app_component_response +UpdateAppVersionRequest,update_app_version_request +UpdateAppVersionResourceRequest,update_app_version_resource_request +UpdateAppVersionResourceResponse,update_app_version_resource_response +UpdateAppVersionResponse,update_app_version_response +UpdateApplicationComponentConfigRequest,update_application_component_config_request +UpdateApplicationInput,update_application_input +UpdateApplicationLayerAutomaticResponseRequest,update_application_layer_automatic_response_request +UpdateApplicationMaintenanceConfigurationRequest,update_application_maintenance_configuration_request +UpdateApplicationMaintenanceConfigurationResponse,update_application_maintenance_configuration_response +UpdateApplicationMessage,update_application_message +UpdateApplicationRequest,update_application_request +UpdateApplicationResourceLifecycleMessage,update_application_resource_lifecycle_message +UpdateApplicationResponse,update_application_response +UpdateApplicationResult,update_application_result +UpdateApplicationSettingsInput,update_application_settings_input +UpdateApplicationSettingsOutput,update_application_settings_output +UpdateApplicationSettingsRequest,update_application_settings_request +UpdateApplicationSettingsResponse,update_application_settings_response +UpdateApplicationVersionMessage,update_application_version_message +UpdateApprovalRuleTemplateContentInput,update_approval_rule_template_content_input +UpdateApprovalRuleTemplateContentOutput,update_approval_rule_template_content_output +UpdateApprovalRuleTemplateDescriptionInput,update_approval_rule_template_description_input +UpdateApprovalRuleTemplateDescriptionOutput,update_approval_rule_template_description_output +UpdateApprovalRuleTemplateNameInput,update_approval_rule_template_name_input +UpdateApprovalRuleTemplateNameOutput,update_approval_rule_template_name_output +UpdateArchiveRequest,update_archive_request +UpdateArchiveResponse,update_archive_response +UpdateArchiveRuleRequest,update_archive_rule_request +UpdateArtifactRequest,update_artifact_request +UpdateArtifactResponse,update_artifact_response +UpdateAssessmentControlRequest,update_assessment_control_request +UpdateAssessmentControlResponse,update_assessment_control_response +UpdateAssessmentControlSetStatusRequest,update_assessment_control_set_status_request +UpdateAssessmentControlSetStatusResponse,update_assessment_control_set_status_response +UpdateAssessmentFrameworkControlSet,update_assessment_framework_control_set +UpdateAssessmentFrameworkRequest,update_assessment_framework_request +UpdateAssessmentFrameworkResponse,update_assessment_framework_response +UpdateAssessmentFrameworkShareRequest,update_assessment_framework_share_request +UpdateAssessmentFrameworkShareResponse,update_assessment_framework_share_response +UpdateAssessmentRequest,update_assessment_request +UpdateAssessmentResponse,update_assessment_response +UpdateAssessmentStatusRequest,update_assessment_status_request +UpdateAssessmentStatusResponse,update_assessment_status_response +UpdateAssessmentTargetRequest,update_assessment_target_request +UpdateAssetModelRequest,update_asset_model_request +UpdateAssetModelResponse,update_asset_model_response +UpdateAssetPropertyRequest,update_asset_property_request +UpdateAssetRequest,update_asset_request +UpdateAssetResponse,update_asset_response +UpdateAssociationRequest,update_association_request +UpdateAssociationResult,update_association_result +UpdateAssociationStatusRequest,update_association_status_request +UpdateAssociationStatusResult,update_association_status_result +UpdateAssumeRolePolicyRequest,update_assume_role_policy_request +UpdateAttendeeCapabilitiesRequest,update_attendee_capabilities_request +UpdateAttendeeCapabilitiesResponse,update_attendee_capabilities_response +UpdateAttributeGroupRequest,update_attribute_group_request +UpdateAttributeGroupResponse,update_attribute_group_response +UpdateAttributesRequest,update_attributes_request +UpdateAuditStreamConfigurationRequest,update_audit_stream_configuration_request +UpdateAuditSuppressionRequest,update_audit_suppression_request +UpdateAuthEventFeedbackRequest,update_auth_event_feedback_request +UpdateAuthorizerRequest,update_authorizer_request +UpdateAuthorizerResponse,update_authorizer_response +UpdateAutoScalingGroupType,update_auto_scaling_group_type +UpdateAutomatedDiscoveryConfigurationRequest,update_automated_discovery_configuration_request +UpdateAutomaticTapeCreationPolicyInput,update_automatic_tape_creation_policy_input +UpdateAutomaticTapeCreationPolicyOutput,update_automatic_tape_creation_policy_output +UpdateAutomationRulesRequestItem,update_automation_rules_request_item +UpdateAutomationRulesRequestItems,update_automation_rules_request_items +UpdateAvailabilityConfigurationRequest,update_availability_configuration_request +UpdateAvailabilityOptionsRequest,update_availability_options_request +UpdateAvailabilityOptionsResponse,update_availability_options_response +UpdateAvailable,update_available +UpdateBackendAPIRequest,update_backend_api_request +UpdateBackendAPIResponse,update_backend_api_response +UpdateBackendAuthForgotPasswordConfig,update_backend_auth_forgot_password_config +UpdateBackendAuthIdentityPoolConfig,update_backend_auth_identity_pool_config +UpdateBackendAuthMFAConfig,update_backend_auth_mfa_config +UpdateBackendAuthOAuthConfig,update_backend_auth_o_auth_config +UpdateBackendAuthPasswordPolicyConfig,update_backend_auth_password_policy_config +UpdateBackendAuthRequest,update_backend_auth_request +UpdateBackendAuthResourceConfig,update_backend_auth_resource_config +UpdateBackendAuthResponse,update_backend_auth_response +UpdateBackendAuthUserPoolConfig,update_backend_auth_user_pool_config +UpdateBackendAuthVerificationMessageConfig,update_backend_auth_verification_message_config +UpdateBackendConfigRequest,update_backend_config_request +UpdateBackendConfigResponse,update_backend_config_response +UpdateBackendJobRequest,update_backend_job_request +UpdateBackendJobResponse,update_backend_job_response +UpdateBackendStorageRequest,update_backend_storage_request +UpdateBackendStorageResourceConfig,update_backend_storage_resource_config +UpdateBackendStorageResponse,update_backend_storage_response +UpdateBackupPlanInput,update_backup_plan_input +UpdateBackupPlanOutput,update_backup_plan_output +UpdateBaiduChannelRequest,update_baidu_channel_request +UpdateBaiduChannelResponse,update_baidu_channel_response +UpdateBandwidthRateLimitInput,update_bandwidth_rate_limit_input +UpdateBandwidthRateLimitOutput,update_bandwidth_rate_limit_output +UpdateBandwidthRateLimitScheduleInput,update_bandwidth_rate_limit_schedule_input +UpdateBandwidthRateLimitScheduleOutput,update_bandwidth_rate_limit_schedule_output +UpdateBasePathMappingRequest,update_base_path_mapping_request +UpdateBatchPredictionInput,update_batch_prediction_input +UpdateBatchPredictionOutput,update_batch_prediction_output +UpdateBehavior,update_behavior +UpdateBillingGroupAccountGrouping,update_billing_group_account_grouping +UpdateBillingGroupInput,update_billing_group_input +UpdateBillingGroupOutput,update_billing_group_output +UpdateBillingGroupRequest,update_billing_group_request +UpdateBillingGroupResponse,update_billing_group_response +UpdateBlueprintRequest,update_blueprint_request +UpdateBlueprintResponse,update_blueprint_response +UpdateBotAliasRequest,update_bot_alias_request +UpdateBotAliasResponse,update_bot_alias_response +UpdateBotLocaleRequest,update_bot_locale_request +UpdateBotLocaleResponse,update_bot_locale_response +UpdateBotRecommendationRequest,update_bot_recommendation_request +UpdateBotRecommendationResponse,update_bot_recommendation_response +UpdateBotRequest,update_bot_request +UpdateBotResponse,update_bot_response +UpdateBranchRequest,update_branch_request +UpdateBranchResult,update_branch_result +UpdateBridgeFlowSourceRequest,update_bridge_flow_source_request +UpdateBridgeNetworkOutputRequest,update_bridge_network_output_request +UpdateBridgeNetworkSourceRequest,update_bridge_network_source_request +UpdateBridgeOutputRequest,update_bridge_output_request +UpdateBridgeOutputResponse,update_bridge_output_response +UpdateBridgeRequest,update_bridge_request +UpdateBridgeResponse,update_bridge_response +UpdateBridgeSourceRequest,update_bridge_source_request +UpdateBridgeSourceResponse,update_bridge_source_response +UpdateBridgeStateRequest,update_bridge_state_request +UpdateBridgeStateResponse,update_bridge_state_response +UpdateBrokerCountRequest,update_broker_count_request +UpdateBrokerCountResponse,update_broker_count_response +UpdateBrokerRequest,update_broker_request +UpdateBrokerResponse,update_broker_response +UpdateBrokerStorageRequest,update_broker_storage_request +UpdateBrokerStorageResponse,update_broker_storage_response +UpdateBrokerTypeRequest,update_broker_type_request +UpdateBrokerTypeResponse,update_broker_type_response +UpdateBrowserSettingsRequest,update_browser_settings_request +UpdateBrowserSettingsResponse,update_browser_settings_response +UpdateBucketBundleRequest,update_bucket_bundle_request +UpdateBucketBundleResult,update_bucket_bundle_result +UpdateBucketRequest,update_bucket_request +UpdateBucketResult,update_bucket_result +UpdateBudgetActionRequest,update_budget_action_request +UpdateBudgetActionResponse,update_budget_action_response +UpdateBudgetRequest,update_budget_request +UpdateBuildInput,update_build_input +UpdateBuildOutput,update_build_output +UpdateBusinessReportScheduleRequest,update_business_report_schedule_request +UpdateByteMatchSetRequest,update_byte_match_set_request +UpdateByteMatchSetResponse,update_byte_match_set_response +UpdateCACertificateParams,update_ca_certificate_params +UpdateCACertificateRequest,update_ca_certificate_request +UpdateCachePolicyRequest,update_cache_policy_request +UpdateCachePolicyResult,update_cache_policy_result +UpdateCalculatedAttributeDefinitionRequest,update_calculated_attribute_definition_request +UpdateCalculatedAttributeDefinitionResponse,update_calculated_attribute_definition_response +UpdateCallAnalyticsCategoryRequest,update_call_analytics_category_request +UpdateCallAnalyticsCategoryResponse,update_call_analytics_category_response +UpdateCampaignDialerConfigRequest,update_campaign_dialer_config_request +UpdateCampaignNameRequest,update_campaign_name_request +UpdateCampaignOutboundCallConfigRequest,update_campaign_outbound_call_config_request +UpdateCampaignRequest,update_campaign_request +UpdateCampaignResponse,update_campaign_response +UpdateCanaryRequest,update_canary_request +UpdateCapacityProviderRequest,update_capacity_provider_request +UpdateCapacityProviderResponse,update_capacity_provider_response +UpdateCapacityReservationInput,update_capacity_reservation_input +UpdateCaseRequest,update_case_request +UpdateCellRequest,update_cell_request +UpdateCellResponse,update_cell_response +UpdateCertificateAuthorityRequest,update_certificate_authority_request +UpdateCertificateOptionsRequest,update_certificate_options_request +UpdateCertificateRequest,update_certificate_request +UpdateCertificateResponse,update_certificate_response +UpdateChangesetRequest,update_changeset_request +UpdateChangesetResponse,update_changeset_response +UpdateChannelClassRequest,update_channel_class_request +UpdateChannelClassResponse,update_channel_class_response +UpdateChannelFlowRequest,update_channel_flow_request +UpdateChannelFlowResponse,update_channel_flow_response +UpdateChannelGroupRequest,update_channel_group_request +UpdateChannelGroupResponse,update_channel_group_response +UpdateChannelMessageRequest,update_channel_message_request +UpdateChannelMessageResponse,update_channel_message_response +UpdateChannelReadMarkerRequest,update_channel_read_marker_request +UpdateChannelReadMarkerResponse,update_channel_read_marker_response +UpdateChannelRequest,update_channel_request +UpdateChannelResponse,update_channel_response +UpdateChapCredentialsInput,update_chap_credentials_input +UpdateChapCredentialsOutput,update_chap_credentials_output +UpdateClassificationJobRequest,update_classification_job_request +UpdateClassificationScopeRequest,update_classification_scope_request +UpdateClassifierRequest,update_classifier_request +UpdateClientCertificateRequest,update_client_certificate_request +UpdateCloudFormationCollectionFilter,update_cloud_formation_collection_filter +UpdateCloudFrontOriginAccessIdentityRequest,update_cloud_front_origin_access_identity_request +UpdateCloudFrontOriginAccessIdentityResult,update_cloud_front_origin_access_identity_result +UpdateClusterConfigRequest,update_cluster_config_request +UpdateClusterConfigResponse,update_cluster_config_response +UpdateClusterConfigurationRequest,update_cluster_configuration_request +UpdateClusterConfigurationResponse,update_cluster_configuration_response +UpdateClusterInput,update_cluster_input +UpdateClusterKafkaVersionRequest,update_cluster_kafka_version_request +UpdateClusterKafkaVersionResponse,update_cluster_kafka_version_response +UpdateClusterOutput,update_cluster_output +UpdateClusterRequest,update_cluster_request +UpdateClusterResponse,update_cluster_response +UpdateClusterSettingsRequest,update_cluster_settings_request +UpdateClusterSettingsResponse,update_cluster_settings_response +UpdateClusterVersionRequest,update_cluster_version_request +UpdateClusterVersionResponse,update_cluster_version_response +UpdateCodeRepositoryInput,update_code_repository_input +UpdateCodeRepositoryOutput,update_code_repository_output +UpdateCodeSigningConfigRequest,update_code_signing_config_request +UpdateCodeSigningConfigResponse,update_code_signing_config_response +UpdateCognitoUserPoolConfiguration,update_cognito_user_pool_configuration +UpdateCollaborationInput,update_collaboration_input +UpdateCollaborationOutput,update_collaboration_output +UpdateCollectionDetail,update_collection_detail +UpdateCollectionRequest,update_collection_request +UpdateCollectionResponse,update_collection_response +UpdateColumnStatisticsForPartitionRequest,update_column_statistics_for_partition_request +UpdateColumnStatisticsForPartitionResponse,update_column_statistics_for_partition_response +UpdateColumnStatisticsForTableRequest,update_column_statistics_for_table_request +UpdateColumnStatisticsForTableResponse,update_column_statistics_for_table_response +UpdateCommentInput,update_comment_input +UpdateCommentOutput,update_comment_output +UpdateCompanyNetworkConfigurationRequest,update_company_network_configuration_request +UpdateComponentConfigurationRequest,update_component_configuration_request +UpdateComponentData,update_component_data +UpdateComponentInput,update_component_input +UpdateComponentOutput,update_component_output +UpdateComponentRequest,update_component_request +UpdateComponentResponse,update_component_response +UpdateComponentTypeRequest,update_component_type_request +UpdateComponentTypeResponse,update_component_type_response +UpdateComputeEnvironmentRequest,update_compute_environment_request +UpdateComputeEnvironmentResponse,update_compute_environment_response +UpdateConditionalForwarderRequest,update_conditional_forwarder_request +UpdateConferenceProviderRequest,update_conference_provider_request +UpdateConfigRequest,update_config_request +UpdateConfigurationProfileRequest,update_configuration_profile_request +UpdateConfigurationRequest,update_configuration_request +UpdateConfigurationResponse,update_configuration_response +UpdateConfigurationSetEventDestinationRequest,update_configuration_set_event_destination_request +UpdateConfigurationSetReputationMetricsEnabledRequest,update_configuration_set_reputation_metrics_enabled_request +UpdateConfigurationSetSendingEnabledRequest,update_configuration_set_sending_enabled_request +UpdateConfigurationSetTrackingOptionsRequest,update_configuration_set_tracking_options_request +UpdateConfigurationTemplateMessage,update_configuration_template_message +UpdateConfiguredTableAnalysisRuleInput,update_configured_table_analysis_rule_input +UpdateConfiguredTableAnalysisRuleOutput,update_configured_table_analysis_rule_output +UpdateConfiguredTableAssociationInput,update_configured_table_association_input +UpdateConfiguredTableAssociationOutput,update_configured_table_association_output +UpdateConfiguredTableInput,update_configured_table_input +UpdateConfiguredTableOutput,update_configured_table_output +UpdateConnectClientAddInRequest,update_connect_client_add_in_request +UpdateConnectionAliasPermissionRequest,update_connection_alias_permission_request +UpdateConnectionApiKeyAuthRequestParameters,update_connection_api_key_auth_request_parameters +UpdateConnectionAuthRequestParameters,update_connection_auth_request_parameters +UpdateConnectionBasicAuthRequestParameters,update_connection_basic_auth_request_parameters +UpdateConnectionOAuthClientRequestParameters,update_connection_o_auth_client_request_parameters +UpdateConnectionOAuthRequestParameters,update_connection_o_auth_request_parameters +UpdateConnectionRequest,update_connection_request +UpdateConnectionResponse,update_connection_response +UpdateConnectivityInfoRequest,update_connectivity_info_request +UpdateConnectivityInfoResponse,update_connectivity_info_response +UpdateConnectivityRequest,update_connectivity_request +UpdateConnectivityResponse,update_connectivity_response +UpdateConnectorDefinitionRequest,update_connector_definition_request +UpdateConnectorProfileRequest,update_connector_profile_request +UpdateConnectorProfileResponse,update_connector_profile_response +UpdateConnectorRegistrationRequest,update_connector_registration_request +UpdateConnectorRegistrationResponse,update_connector_registration_response +UpdateConnectorRequest,update_connector_request +UpdateConnectorResponse,update_connector_response +UpdateConstraintInput,update_constraint_input +UpdateConstraintOutput,update_constraint_output +UpdateContactAttributesRequest,update_contact_attributes_request +UpdateContactChannelRequest,update_contact_channel_request +UpdateContactEvaluationRequest,update_contact_evaluation_request +UpdateContactEvaluationResponse,update_contact_evaluation_response +UpdateContactFlowContentRequest,update_contact_flow_content_request +UpdateContactFlowMetadataRequest,update_contact_flow_metadata_request +UpdateContactFlowModuleContentRequest,update_contact_flow_module_content_request +UpdateContactFlowModuleMetadataRequest,update_contact_flow_module_metadata_request +UpdateContactFlowNameRequest,update_contact_flow_name_request +UpdateContactListRequest,update_contact_list_request +UpdateContactRequest,update_contact_request +UpdateContactScheduleRequest,update_contact_schedule_request +UpdateContainerAgentRequest,update_container_agent_request +UpdateContainerAgentResponse,update_container_agent_response +UpdateContainerInstancesStateRequest,update_container_instances_state_request +UpdateContainerInstancesStateResponse,update_container_instances_state_response +UpdateContainerServiceRequest,update_container_service_request +UpdateContainerServiceResult,update_container_service_result +UpdateContentRequest,update_content_request +UpdateContentResponse,update_content_response +UpdateContextRequest,update_context_request +UpdateContextResponse,update_context_response +UpdateContinuousBackupsInput,update_continuous_backups_input +UpdateContinuousBackupsOutput,update_continuous_backups_output +UpdateContinuousDeploymentPolicyRequest,update_continuous_deployment_policy_request +UpdateContinuousDeploymentPolicyResult,update_continuous_deployment_policy_result +UpdateContributorInsightsInput,update_contributor_insights_input +UpdateContributorInsightsOutput,update_contributor_insights_output +UpdateControlPanelRequest,update_control_panel_request +UpdateControlPanelResponse,update_control_panel_response +UpdateControlRequest,update_control_request +UpdateControlResponse,update_control_response +UpdateCoreDefinitionRequest,update_core_definition_request +UpdateCoreNetworkRequest,update_core_network_request +UpdateCoreNetworkResponse,update_core_network_response +UpdateCostAllocationTagsStatusError,update_cost_allocation_tags_status_error +UpdateCostAllocationTagsStatusRequest,update_cost_allocation_tags_status_request +UpdateCostAllocationTagsStatusResponse,update_cost_allocation_tags_status_response +UpdateCostCategoryDefinitionRequest,update_cost_category_definition_request +UpdateCostCategoryDefinitionResponse,update_cost_category_definition_response +UpdateCount,update_count +UpdateCrawlerRequest,update_crawler_request +UpdateCrawlerScheduleRequest,update_crawler_schedule_request +UpdateCrlRequest,update_crl_request +UpdateCsvClassifierRequest,update_csv_classifier_request +UpdateCustomKeyStoreRequest,update_custom_key_store_request +UpdateCustomLineItemChargeDetails,update_custom_line_item_charge_details +UpdateCustomLineItemFlatChargeDetails,update_custom_line_item_flat_charge_details +UpdateCustomLineItemInput,update_custom_line_item_input +UpdateCustomLineItemOutput,update_custom_line_item_output +UpdateCustomLineItemPercentageChargeDetails,update_custom_line_item_percentage_charge_details +UpdateCustomMetricRequest,update_custom_metric_request +UpdateCustomMetricResponse,update_custom_metric_response +UpdateCustomRoutingAcceleratorAttributesRequest,update_custom_routing_accelerator_attributes_request +UpdateCustomRoutingAcceleratorAttributesResponse,update_custom_routing_accelerator_attributes_response +UpdateCustomRoutingAcceleratorRequest,update_custom_routing_accelerator_request +UpdateCustomRoutingAcceleratorResponse,update_custom_routing_accelerator_response +UpdateCustomRoutingListenerRequest,update_custom_routing_listener_request +UpdateCustomRoutingListenerResponse,update_custom_routing_listener_response +UpdateCustomVerificationEmailTemplateRequest,update_custom_verification_email_template_request +UpdateDashboardPermissionsRequest,update_dashboard_permissions_request +UpdateDashboardPermissionsResponse,update_dashboard_permissions_response +UpdateDashboardPublishedVersionRequest,update_dashboard_published_version_request +UpdateDashboardPublishedVersionResponse,update_dashboard_published_version_response +UpdateDashboardRequest,update_dashboard_request +UpdateDashboardResponse,update_dashboard_response +UpdateDataCatalogInput,update_data_catalog_input +UpdateDataCellsFilterRequest,update_data_cells_filter_request +UpdateDataIntegrationRequest,update_data_integration_request +UpdateDataLakeExceptionSubscriptionRequest,update_data_lake_exception_subscription_request +UpdateDataLakeRequest,update_data_lake_request +UpdateDataLakeResponse,update_data_lake_response +UpdateDataQualityRulesetRequest,update_data_quality_ruleset_request +UpdateDataQualityRulesetResponse,update_data_quality_ruleset_response +UpdateDataRepositoryAssociationRequest,update_data_repository_association_request +UpdateDataRepositoryAssociationResponse,update_data_repository_association_response +UpdateDataRetentionInput,update_data_retention_input +UpdateDataRole,update_data_role +UpdateDataSecurityConfig,update_data_security_config +UpdateDataSetPermissionsRequest,update_data_set_permissions_request +UpdateDataSetPermissionsResponse,update_data_set_permissions_response +UpdateDataSetRequest,update_data_set_request +UpdateDataSetResponse,update_data_set_response +UpdateDataSource,update_data_source +UpdateDataSourceInput,update_data_source_input +UpdateDataSourceOutput,update_data_source_output +UpdateDataSourcePermissionsRequest,update_data_source_permissions_request +UpdateDataSourcePermissionsResponse,update_data_source_permissions_response +UpdateDataSourceRequest,update_data_source_request +UpdateDataSourceResponse,update_data_source_response +UpdateDatabaseRequest,update_database_request +UpdateDatabaseResponse,update_database_response +UpdateDatasetEntriesRequest,update_dataset_entries_request +UpdateDatasetEntriesResponse,update_dataset_entries_response +UpdateDatasetGroupRequest,update_dataset_group_request +UpdateDatasetRequest,update_dataset_request +UpdateDatasetResponse,update_dataset_response +UpdateDatasourcePackagesRequest,update_datasource_packages_request +UpdateDatastoreRequest,update_datastore_request +UpdateDate,update_date +UpdateDateTime,update_date_time +UpdateDecoderManifestRequest,update_decoder_manifest_request +UpdateDecoderManifestResponse,update_decoder_manifest_response +UpdateDefaultAutoScalingConfigurationRequest,update_default_auto_scaling_configuration_request +UpdateDefaultAutoScalingConfigurationResponse,update_default_auto_scaling_configuration_response +UpdateDefaultBranchInput,update_default_branch_input +UpdateDefaultMailDomainRequest,update_default_mail_domain_request +UpdateDeletionProtectionInput,update_deletion_protection_input +UpdateDeploymentGroupInput,update_deployment_group_input +UpdateDeploymentGroupOutput,update_deployment_group_output +UpdateDeploymentRequest,update_deployment_request +UpdateDeploymentResponse,update_deployment_response +UpdateDeploymentStrategyRequest,update_deployment_strategy_request +UpdateDestinationInput,update_destination_input +UpdateDestinationRequest,update_destination_request +UpdateDestinationResponse,update_destination_response +UpdateDetectorModelRequest,update_detector_model_request +UpdateDetectorModelResponse,update_detector_model_response +UpdateDetectorRequest,update_detector_request +UpdateDetectorVersionMetadataRequest,update_detector_version_metadata_request +UpdateDetectorVersionRequest,update_detector_version_request +UpdateDetectorVersionStatusRequest,update_detector_version_status_request +UpdateDevEndpointRequest,update_dev_endpoint_request +UpdateDevEnvironmentRequest,update_dev_environment_request +UpdateDevEnvironmentResponse,update_dev_environment_response +UpdateDeviceCertificateParams,update_device_certificate_params +UpdateDeviceDefinitionRequest,update_device_definition_request +UpdateDeviceFleetRequest,update_device_fleet_request +UpdateDeviceInstanceRequest,update_device_instance_request +UpdateDeviceInstanceResult,update_device_instance_result +UpdateDeviceMetadataRequest,update_device_metadata_request +UpdateDeviceMetadataResponse,update_device_metadata_response +UpdateDevicePolicyConfigurationRequest,update_device_policy_configuration_request +UpdateDevicePoolRequest,update_device_pool_request +UpdateDevicePoolResult,update_device_pool_result +UpdateDeviceRequest,update_device_request +UpdateDeviceResponse,update_device_response +UpdateDeviceStateRequest,update_device_state_request +UpdateDeviceStatusRequest,update_device_status_request +UpdateDevicesRequest,update_devices_request +UpdateDimensionRequest,update_dimension_request +UpdateDimensionResponse,update_dimension_response +UpdateDirectConnectGatewayAssociationRequest,update_direct_connect_gateway_association_request +UpdateDirectConnectGatewayAssociationResult,update_direct_connect_gateway_association_result +UpdateDirectConnectGatewayRequest,update_direct_connect_gateway_request +UpdateDirectConnectGatewayResponse,update_direct_connect_gateway_response +UpdateDirectoryConfigRequest,update_directory_config_request +UpdateDirectoryConfigResult,update_directory_config_result +UpdateDirectorySetupRequest,update_directory_setup_request +UpdateDiscovererRequest,update_discoverer_request +UpdateDiscovererResponse,update_discoverer_response +UpdateDiscoveryJobRequest,update_discovery_job_request +UpdateDistributionBundleRequest,update_distribution_bundle_request +UpdateDistributionBundleResult,update_distribution_bundle_result +UpdateDistributionConfigurationRequest,update_distribution_configuration_request +UpdateDistributionConfigurationResponse,update_distribution_configuration_response +UpdateDistributionRequest,update_distribution_request +UpdateDistributionResult,update_distribution_result +UpdateDistributionWithStagingConfigRequest,update_distribution_with_staging_config_request +UpdateDistributionWithStagingConfigResult,update_distribution_with_staging_config_result +UpdateDocumentDefaultVersionRequest,update_document_default_version_request +UpdateDocumentDefaultVersionResult,update_document_default_version_result +UpdateDocumentMetadataRequest,update_document_metadata_request +UpdateDocumentRequest,update_document_request +UpdateDocumentResult,update_document_result +UpdateDocumentVersionRequest,update_document_version_request +UpdateDocumentationPartRequest,update_documentation_part_request +UpdateDocumentationVersionRequest,update_documentation_version_request +UpdateDomainAssociationRequest,update_domain_association_request +UpdateDomainAssociationResult,update_domain_association_result +UpdateDomainConfigRequest,update_domain_config_request +UpdateDomainConfigResponse,update_domain_config_response +UpdateDomainConfigurationRequest,update_domain_configuration_request +UpdateDomainConfigurationResponse,update_domain_configuration_response +UpdateDomainContactPrivacyRequest,update_domain_contact_privacy_request +UpdateDomainContactPrivacyResponse,update_domain_contact_privacy_response +UpdateDomainContactRequest,update_domain_contact_request +UpdateDomainContactResponse,update_domain_contact_response +UpdateDomainEndpointOptionsRequest,update_domain_endpoint_options_request +UpdateDomainEndpointOptionsResponse,update_domain_endpoint_options_response +UpdateDomainEntryRequest,update_domain_entry_request +UpdateDomainEntryResult,update_domain_entry_result +UpdateDomainMetadataRequest,update_domain_metadata_request +UpdateDomainNameRequest,update_domain_name_request +UpdateDomainNameResponse,update_domain_name_response +UpdateDomainNameserversRequest,update_domain_nameservers_request +UpdateDomainNameserversResponse,update_domain_nameservers_response +UpdateDomainRequest,update_domain_request +UpdateDomainResponse,update_domain_response +UpdateDynamicThingGroupRequest,update_dynamic_thing_group_request +UpdateDynamicThingGroupResponse,update_dynamic_thing_group_response +UpdateEc2DeepInspectionConfigurationRequest,update_ec2_deep_inspection_configuration_request +UpdateEc2DeepInspectionConfigurationResponse,update_ec2_deep_inspection_configuration_response +UpdateEgressGatewayBridgeRequest,update_egress_gateway_bridge_request +UpdateElasticIpRequest,update_elastic_ip_request +UpdateElasticsearchDomainConfigRequest,update_elasticsearch_domain_config_request +UpdateElasticsearchDomainConfigResponse,update_elasticsearch_domain_config_response +UpdateEmailChannelRequest,update_email_channel_request +UpdateEmailChannelResponse,update_email_channel_response +UpdateEmailIdentityPolicyRequest,update_email_identity_policy_request +UpdateEmailTemplateRequest,update_email_template_request +UpdateEmailTemplateResponse,update_email_template_response +UpdateEmergencyContactSettingsRequest,update_emergency_contact_settings_request +UpdateEncryption,update_encryption +UpdateEncryptionKeyRequest,update_encryption_key_request +UpdateEndOfMeetingReminder,update_end_of_meeting_reminder +UpdateEndpointAccessRequest,update_endpoint_access_request +UpdateEndpointAccessResponse,update_endpoint_access_response +UpdateEndpointGroupRequest,update_endpoint_group_request +UpdateEndpointGroupResponse,update_endpoint_group_response +UpdateEndpointInput,update_endpoint_input +UpdateEndpointOutput,update_endpoint_output +UpdateEndpointRequest,update_endpoint_request +UpdateEndpointResponse,update_endpoint_response +UpdateEndpointWeightsAndCapacitiesInput,update_endpoint_weights_and_capacities_input +UpdateEndpointWeightsAndCapacitiesOutput,update_endpoint_weights_and_capacities_output +UpdateEndpointsBatchRequest,update_endpoints_batch_request +UpdateEndpointsBatchResponse,update_endpoints_batch_response +UpdateEnrollmentStatusRequest,update_enrollment_status_request +UpdateEnrollmentStatusResponse,update_enrollment_status_response +UpdateEntitlementRequest,update_entitlement_request +UpdateEntitlementResult,update_entitlement_result +UpdateEntityRequest,update_entity_request +UpdateEntityResponse,update_entity_response +UpdateEnvironmentAccountConnectionInput,update_environment_account_connection_input +UpdateEnvironmentAccountConnectionOutput,update_environment_account_connection_output +UpdateEnvironmentInput,update_environment_input +UpdateEnvironmentMembershipRequest,update_environment_membership_request +UpdateEnvironmentMembershipResult,update_environment_membership_result +UpdateEnvironmentMessage,update_environment_message +UpdateEnvironmentOutput,update_environment_output +UpdateEnvironmentRequest,update_environment_request +UpdateEnvironmentResponse,update_environment_response +UpdateEnvironmentTemplateInput,update_environment_template_input +UpdateEnvironmentTemplateOutput,update_environment_template_output +UpdateEnvironmentTemplateVersionInput,update_environment_template_version_input +UpdateEnvironmentTemplateVersionOutput,update_environment_template_version_output +UpdateEphemerisRequest,update_ephemeris_request +UpdateError,update_error +UpdateEtlLibraries,update_etl_libraries +UpdateEvaluationFormRequest,update_evaluation_form_request +UpdateEvaluationFormResponse,update_evaluation_form_response +UpdateEvaluationInput,update_evaluation_input +UpdateEvaluationOutput,update_evaluation_output +UpdateEventActionRequest,update_event_action_request +UpdateEventActionResponse,update_event_action_response +UpdateEventConfigurationByResourceTypesRequest,update_event_configuration_by_resource_types_request +UpdateEventConfigurationsRequest,update_event_configurations_request +UpdateEventDataStoreRequest,update_event_data_store_request +UpdateEventDataStoreResponse,update_event_data_store_response +UpdateEventDestinationRequest,update_event_destination_request +UpdateEventDestinationResult,update_event_destination_result +UpdateEventIntegrationRequest,update_event_integration_request +UpdateEventLabelRequest,update_event_label_request +UpdateEventSourceMappingRequest,update_event_source_mapping_request +UpdateEventSourcesConfigRequest,update_event_sources_config_request +UpdateExperienceRequest,update_experience_request +UpdateExperimentRequest,update_experiment_request +UpdateExperimentResponse,update_experiment_response +UpdateExperimentTemplateActionInputItem,update_experiment_template_action_input_item +UpdateExperimentTemplateLogConfigurationInput,update_experiment_template_log_configuration_input +UpdateExperimentTemplateRequest,update_experiment_template_request +UpdateExperimentTemplateResponse,update_experiment_template_response +UpdateExperimentTemplateStopConditionInput,update_experiment_template_stop_condition_input +UpdateExperimentTemplateTargetInput,update_experiment_template_target_input +UpdateExpirationForHITRequest,update_expiration_for_hit_request +UpdateExportRequest,update_export_request +UpdateExportResponse,update_export_response +UpdateExpression,update_expression +UpdateExtensionAssociationRequest,update_extension_association_request +UpdateExtensionRequest,update_extension_request +UpdateFPorts,update_f_ports +UpdateFacetRequest,update_facet_request +UpdateFailbackReplicationConfigurationRequest,update_failback_replication_configuration_request +UpdateFailoverConfig,update_failover_config +UpdateFeatureGroupRequest,update_feature_group_request +UpdateFeatureGroupResponse,update_feature_group_response +UpdateFeatureMetadataRequest,update_feature_metadata_request +UpdateFeatureRequest,update_feature_request +UpdateFeatureResponse,update_feature_response +UpdateFeaturedResultsSetRequest,update_featured_results_set_request +UpdateFeaturedResultsSetResponse,update_featured_results_set_response +UpdateFieldLevelEncryptionConfigRequest,update_field_level_encryption_config_request +UpdateFieldLevelEncryptionConfigResult,update_field_level_encryption_config_result +UpdateFieldLevelEncryptionProfileRequest,update_field_level_encryption_profile_request +UpdateFieldLevelEncryptionProfileResult,update_field_level_encryption_profile_result +UpdateFieldRequest,update_field_request +UpdateFileCacheLustreConfiguration,update_file_cache_lustre_configuration +UpdateFileCacheRequest,update_file_cache_request +UpdateFileCacheResponse,update_file_cache_response +UpdateFileSystemAssociationInput,update_file_system_association_input +UpdateFileSystemAssociationOutput,update_file_system_association_output +UpdateFileSystemLustreConfiguration,update_file_system_lustre_configuration +UpdateFileSystemOntapConfiguration,update_file_system_ontap_configuration +UpdateFileSystemOpenZFSConfiguration,update_file_system_open_zfs_configuration +UpdateFileSystemRequest,update_file_system_request +UpdateFileSystemResponse,update_file_system_response +UpdateFileSystemWindowsConfiguration,update_file_system_windows_configuration +UpdateFilterRequest,update_filter_request +UpdateFilterResponse,update_filter_response +UpdateFindingAggregatorRequest,update_finding_aggregator_request +UpdateFindingAggregatorResponse,update_finding_aggregator_response +UpdateFindingsFeedbackRequest,update_findings_feedback_request +UpdateFindingsFilterRequest,update_findings_filter_request +UpdateFindingsFilterResponse,update_findings_filter_response +UpdateFindingsRequest,update_findings_request +UpdateFirewallConfigRequest,update_firewall_config_request +UpdateFirewallConfigResponse,update_firewall_config_response +UpdateFirewallDeleteProtectionRequest,update_firewall_delete_protection_request +UpdateFirewallDeleteProtectionResponse,update_firewall_delete_protection_response +UpdateFirewallDescriptionRequest,update_firewall_description_request +UpdateFirewallDescriptionResponse,update_firewall_description_response +UpdateFirewallDomainsRequest,update_firewall_domains_request +UpdateFirewallDomainsResponse,update_firewall_domains_response +UpdateFirewallEncryptionConfigurationRequest,update_firewall_encryption_configuration_request +UpdateFirewallEncryptionConfigurationResponse,update_firewall_encryption_configuration_response +UpdateFirewallPolicyChangeProtectionRequest,update_firewall_policy_change_protection_request +UpdateFirewallPolicyChangeProtectionResponse,update_firewall_policy_change_protection_response +UpdateFirewallPolicyRequest,update_firewall_policy_request +UpdateFirewallPolicyResponse,update_firewall_policy_response +UpdateFirewallRuleGroupAssociationRequest,update_firewall_rule_group_association_request +UpdateFirewallRuleGroupAssociationResponse,update_firewall_rule_group_association_response +UpdateFirewallRuleRequest,update_firewall_rule_request +UpdateFirewallRuleResponse,update_firewall_rule_response +UpdateFleetAttributesInput,update_fleet_attributes_input +UpdateFleetAttributesOutput,update_fleet_attributes_output +UpdateFleetCapacityInput,update_fleet_capacity_input +UpdateFleetCapacityOutput,update_fleet_capacity_output +UpdateFleetMetadataRequest,update_fleet_metadata_request +UpdateFleetMetricRequest,update_fleet_metric_request +UpdateFleetPortSettingsInput,update_fleet_port_settings_input +UpdateFleetPortSettingsOutput,update_fleet_port_settings_output +UpdateFleetRequest,update_fleet_request +UpdateFleetResponse,update_fleet_response +UpdateFleetResult,update_fleet_result +UpdateFlowEntitlementRequest,update_flow_entitlement_request +UpdateFlowEntitlementResponse,update_flow_entitlement_response +UpdateFlowMediaStreamRequest,update_flow_media_stream_request +UpdateFlowMediaStreamResponse,update_flow_media_stream_response +UpdateFlowOutputRequest,update_flow_output_request +UpdateFlowOutputResponse,update_flow_output_response +UpdateFlowRequest,update_flow_request +UpdateFlowResponse,update_flow_response +UpdateFlowSourceRequest,update_flow_source_request +UpdateFlowSourceResponse,update_flow_source_response +UpdateFlowTemplateRequest,update_flow_template_request +UpdateFlowTemplateResponse,update_flow_template_response +UpdateFlywheelRequest,update_flywheel_request +UpdateFlywheelResponse,update_flywheel_response +UpdateFolderPermissionsRequest,update_folder_permissions_request +UpdateFolderPermissionsResponse,update_folder_permissions_response +UpdateFolderRequest,update_folder_request +UpdateFolderResponse,update_folder_response +UpdateFormData,update_form_data +UpdateFormRequest,update_form_request +UpdateFormResponse,update_form_response +UpdateFrameworkInput,update_framework_input +UpdateFrameworkOutput,update_framework_output +UpdateFreeTierConfig,update_free_tier_config +UpdateFunctionCodeRequest,update_function_code_request +UpdateFunctionConfigurationRequest,update_function_configuration_request +UpdateFunctionDefinitionRequest,update_function_definition_request +UpdateFunctionEventInvokeConfigRequest,update_function_event_invoke_config_request +UpdateFunctionRequest,update_function_request +UpdateFunctionResponse,update_function_response +UpdateFunctionResult,update_function_result +UpdateFunctionUrlConfigRequest,update_function_url_config_request +UpdateFunctionUrlConfigResponse,update_function_url_config_response +UpdateFuotaTaskRequest,update_fuota_task_request +UpdateGameConfigurationRequest,update_game_configuration_request +UpdateGameConfigurationResult,update_game_configuration_result +UpdateGameRequest,update_game_request +UpdateGameResult,update_game_result +UpdateGameServerGroupInput,update_game_server_group_input +UpdateGameServerGroupOutput,update_game_server_group_output +UpdateGameServerInput,update_game_server_input +UpdateGameServerOutput,update_game_server_output +UpdateGameSessionInput,update_game_session_input +UpdateGameSessionOutput,update_game_session_output +UpdateGameSessionQueueInput,update_game_session_queue_input +UpdateGameSessionQueueOutput,update_game_session_queue_output +UpdateGatewayBridgeSourceRequest,update_gateway_bridge_source_request +UpdateGatewayCapabilityConfigurationRequest,update_gateway_capability_configuration_request +UpdateGatewayCapabilityConfigurationResponse,update_gateway_capability_configuration_response +UpdateGatewayGroupRequest,update_gateway_group_request +UpdateGatewayInformationInput,update_gateway_information_input +UpdateGatewayInformationOutput,update_gateway_information_output +UpdateGatewayInstanceRequest,update_gateway_instance_request +UpdateGatewayInstanceResponse,update_gateway_instance_response +UpdateGatewayRequest,update_gateway_request +UpdateGatewayResponseRequest,update_gateway_response_request +UpdateGatewayRouteInput,update_gateway_route_input +UpdateGatewayRouteOutput,update_gateway_route_output +UpdateGatewaySoftwareNowInput,update_gateway_software_now_input +UpdateGatewaySoftwareNowOutput,update_gateway_software_now_output +UpdateGcmChannelRequest,update_gcm_channel_request +UpdateGcmChannelResponse,update_gcm_channel_response +UpdateGeoMatchSetRequest,update_geo_match_set_request +UpdateGeoMatchSetResponse,update_geo_match_set_response +UpdateGeofenceCollectionRequest,update_geofence_collection_request +UpdateGeofenceCollectionResponse,update_geofence_collection_response +UpdateGlobalNetworkRequest,update_global_network_request +UpdateGlobalNetworkResponse,update_global_network_response +UpdateGlobalSecondaryIndexAction,update_global_secondary_index_action +UpdateGlobalSettingsInput,update_global_settings_input +UpdateGlobalSettingsRequest,update_global_settings_request +UpdateGlobalTableInput,update_global_table_input +UpdateGlobalTableOutput,update_global_table_output +UpdateGlobalTableSettingsInput,update_global_table_settings_input +UpdateGlobalTableSettingsOutput,update_global_table_settings_output +UpdateGraphqlApiRequest,update_graphql_api_request +UpdateGraphqlApiResponse,update_graphql_api_response +UpdateGrokClassifierRequest,update_grok_classifier_request +UpdateGroupCertificateConfigurationRequest,update_group_certificate_configuration_request +UpdateGroupCertificateConfigurationResponse,update_group_certificate_configuration_response +UpdateGroupInput,update_group_input +UpdateGroupOutput,update_group_output +UpdateGroupQueryInput,update_group_query_input +UpdateGroupQueryOutput,update_group_query_output +UpdateGroupRequest,update_group_request +UpdateGroupResponse,update_group_response +UpdateGroupResult,update_group_result +UpdateHITReviewStatusRequest,update_hit_review_status_request +UpdateHITTypeOfHITRequest,update_hit_type_of_hit_request +UpdateHealthCheckRequest,update_health_check_request +UpdateHealthCheckResponse,update_health_check_response +UpdateHostInput,update_host_input +UpdateHostKeyRequest,update_host_key_request +UpdateHostKeyResponse,update_host_key_response +UpdateHostedZoneCommentRequest,update_hosted_zone_comment_request +UpdateHostedZoneCommentResponse,update_hosted_zone_comment_response +UpdateHoursOfOperationRequest,update_hours_of_operation_request +UpdateHttpNamespaceRequest,update_http_namespace_request +UpdateHttpNamespaceResponse,update_http_namespace_response +UpdateHubRequest,update_hub_request +UpdateHubResponse,update_hub_response +UpdateHypervisorInput,update_hypervisor_input +UpdateHypervisorOutput,update_hypervisor_output +UpdateIAMPolicyAssignmentRequest,update_iam_policy_assignment_request +UpdateIAMPolicyAssignmentResponse,update_iam_policy_assignment_response +UpdateIPSetRequest,update_ip_set_request +UpdateIPSetResponse,update_ip_set_response +UpdateIdentityProviderConfigurationRequest,update_identity_provider_configuration_request +UpdateIdentityProviderRequest,update_identity_provider_request +UpdateIdentityProviderResponse,update_identity_provider_response +UpdateIdentityProviderSettingsRequest,update_identity_provider_settings_request +UpdateIdentityProviderSettingsResponse,update_identity_provider_settings_response +UpdateIdentitySourceInput,update_identity_source_input +UpdateIdentitySourceOutput,update_identity_source_output +UpdateImageGenerationConfigurationInput,update_image_generation_configuration_input +UpdateImagePermissionsRequest,update_image_permissions_request +UpdateImagePipelineRequest,update_image_pipeline_request +UpdateImagePipelineResponse,update_image_pipeline_response +UpdateImageRequest,update_image_request +UpdateImageResponse,update_image_response +UpdateImageSetMetadataRequest,update_image_set_metadata_request +UpdateImageSetMetadataResponse,update_image_set_metadata_response +UpdateImageVersionRequest,update_image_version_request +UpdateImageVersionResponse,update_image_version_response +UpdateImpersonationRoleRequest,update_impersonation_role_request +UpdateInAppTemplateRequest,update_in_app_template_request +UpdateInAppTemplateResponse,update_in_app_template_response +UpdateInProgressException,update_in_progress_exception +UpdateIncidentRecordInput,update_incident_record_input +UpdateIndexRequest,update_index_request +UpdateIndexTypeInput,update_index_type_input +UpdateIndexTypeOutput,update_index_type_output +UpdateIndexingConfigurationRequest,update_indexing_configuration_request +UpdateInferenceExperimentRequest,update_inference_experiment_request +UpdateInferenceExperimentResponse,update_inference_experiment_response +UpdateInferenceSchedulerRequest,update_inference_scheduler_request +UpdateInfoEntry,update_info_entry +UpdateInfrastructureConfigurationRequest,update_infrastructure_configuration_request +UpdateInfrastructureConfigurationResponse,update_infrastructure_configuration_response +UpdateIngestionDestinationRequest,update_ingestion_destination_request +UpdateIngestionDestinationResponse,update_ingestion_destination_response +UpdateIngressGatewayBridgeRequest,update_ingress_gateway_bridge_request +UpdateInputDeviceRequest,update_input_device_request +UpdateInputDeviceResponse,update_input_device_response +UpdateInputRequest,update_input_request +UpdateInputResponse,update_input_response +UpdateInputSecurityGroupRequest,update_input_security_group_request +UpdateInputSecurityGroupResponse,update_input_security_group_response +UpdateInsightRequest,update_insight_request +UpdateInstanceAccessControlAttributeConfigurationRequest,update_instance_access_control_attribute_configuration_request +UpdateInstanceAttributeRequest,update_instance_attribute_request +UpdateInstanceCustomHealthStatusRequest,update_instance_custom_health_status_request +UpdateInstanceMetadataOptionsRequest,update_instance_metadata_options_request +UpdateInstanceMetadataOptionsResult,update_instance_metadata_options_result +UpdateInstanceProfileRequest,update_instance_profile_request +UpdateInstanceProfileResult,update_instance_profile_result +UpdateInstanceRequest,update_instance_request +UpdateInstanceStorageConfigRequest,update_instance_storage_config_request +UpdateInstantBooking,update_instant_booking +UpdateInstruction,update_instruction +UpdateIntegrationRequest,update_integration_request +UpdateIntegrationResponseRequest,update_integration_response_request +UpdateIntegrationResponseResponse,update_integration_response_response +UpdateIntegrationResult,update_integration_result +UpdateIntentRequest,update_intent_request +UpdateIntentResponse,update_intent_response +UpdateIpAccessSettingsRequest,update_ip_access_settings_request +UpdateIpAccessSettingsResponse,update_ip_access_settings_response +UpdateIpAddress,update_ip_address +UpdateIpAddresses,update_ip_addresses +UpdateIpRestrictionRequest,update_ip_restriction_request +UpdateIpRestrictionResponse,update_ip_restriction_response +UpdateItemInput,update_item_input +UpdateItemOutput,update_item_output +UpdateJobExecutionRequest,update_job_execution_request +UpdateJobExecutionResponse,update_job_execution_response +UpdateJobFromSourceControlRequest,update_job_from_source_control_request +UpdateJobFromSourceControlResponse,update_job_from_source_control_response +UpdateJobPriorityRequest,update_job_priority_request +UpdateJobPriorityResult,update_job_priority_result +UpdateJobQueueRequest,update_job_queue_request +UpdateJobQueueResponse,update_job_queue_response +UpdateJobRequest,update_job_request +UpdateJobResponse,update_job_response +UpdateJobShipmentStateRequest,update_job_shipment_state_request +UpdateJobStatusRequest,update_job_status_request +UpdateJobStatusResult,update_job_status_result +UpdateJobTemplateRequest,update_job_template_request +UpdateJobTemplateResponse,update_job_template_response +UpdateJourneyRequest,update_journey_request +UpdateJourneyResponse,update_journey_response +UpdateJourneyStateRequest,update_journey_state_request +UpdateJourneyStateResponse,update_journey_state_response +UpdateJsonClassifierRequest,update_json_classifier_request +UpdateKeyDescriptionRequest,update_key_description_request +UpdateKeyGroupRequest,update_key_group_request +UpdateKeyGroupResult,update_key_group_result +UpdateKeyRequest,update_key_request +UpdateKeyResponse,update_key_response +UpdateKnowledgeBaseTemplateUriRequest,update_knowledge_base_template_uri_request +UpdateKnowledgeBaseTemplateUriResponse,update_knowledge_base_template_uri_response +UpdateKxClusterDatabasesRequest,update_kx_cluster_databases_request +UpdateKxDatabaseRequest,update_kx_database_request +UpdateKxDatabaseResponse,update_kx_database_response +UpdateKxEnvironmentNetworkRequest,update_kx_environment_network_request +UpdateKxEnvironmentNetworkResponse,update_kx_environment_network_response +UpdateKxEnvironmentRequest,update_kx_environment_request +UpdateKxEnvironmentResponse,update_kx_environment_response +UpdateKxUserRequest,update_kx_user_request +UpdateKxUserResponse,update_kx_user_response +UpdateLFTagRequest,update_lf_tag_request +UpdateLabelGroupRequest,update_label_group_request +UpdateLabelsPayload,update_labels_payload +UpdateLagRequest,update_lag_request +UpdateLaunchConfigurationRequest,update_launch_configuration_request +UpdateLaunchConfigurationTemplateRequest,update_launch_configuration_template_request +UpdateLaunchConfigurationTemplateResponse,update_launch_configuration_template_response +UpdateLaunchProfileMemberRequest,update_launch_profile_member_request +UpdateLaunchProfileMemberResponse,update_launch_profile_member_response +UpdateLaunchProfileRequest,update_launch_profile_request +UpdateLaunchProfileResponse,update_launch_profile_response +UpdateLaunchRequest,update_launch_request +UpdateLaunchResponse,update_launch_response +UpdateLayerRequest,update_layer_request +UpdateLayoutRequest,update_layout_request +UpdateLedgerPermissionsModeRequest,update_ledger_permissions_mode_request +UpdateLedgerPermissionsModeResponse,update_ledger_permissions_mode_response +UpdateLedgerRequest,update_ledger_request +UpdateLedgerResponse,update_ledger_response +UpdateLensReviewInput,update_lens_review_input +UpdateLensReviewOutput,update_lens_review_output +UpdateLicenseConfigurationRequest,update_license_configuration_request +UpdateLicenseManagerReportGeneratorRequest,update_license_manager_report_generator_request +UpdateLicenseSpecificationsForResourceRequest,update_license_specifications_for_resource_request +UpdateLifecyclePolicyRequest,update_lifecycle_policy_request +UpdateLinkAttributes,update_link_attributes +UpdateLinkAttributesRequest,update_link_attributes_request +UpdateLinkInput,update_link_input +UpdateLinkOutput,update_link_output +UpdateLinkRequest,update_link_request +UpdateLinkResponse,update_link_response +UpdateListRequest,update_list_request +UpdateListenerRequest,update_listener_request +UpdateListenerResponse,update_listener_response +UpdateLiveSourceRequest,update_live_source_request +UpdateLiveSourceResponse,update_live_source_response +UpdateLoadBalancerAttributeRequest,update_load_balancer_attribute_request +UpdateLoadBalancerAttributeResult,update_load_balancer_attribute_result +UpdateLocationAzureBlobRequest,update_location_azure_blob_request +UpdateLocationHdfsRequest,update_location_hdfs_request +UpdateLocationNfsRequest,update_location_nfs_request +UpdateLocationObjectStorageRequest,update_location_object_storage_request +UpdateLocationSmbRequest,update_location_smb_request +UpdateLogLevelsByResourceTypesRequest,update_log_levels_by_resource_types_request +UpdateLogPatternRequest,update_log_pattern_request +UpdateLogPatternResponse,update_log_pattern_response +UpdateLoggerDefinitionRequest,update_logger_definition_request +UpdateLoggingConfigurationRequest,update_logging_configuration_request +UpdateLoggingConfigurationResponse,update_logging_configuration_response +UpdateLoginProfileRequest,update_login_profile_request +UpdateLongTermPricingRequest,update_long_term_pricing_request +UpdateMLModelInput,update_ml_model_input +UpdateMLModelOutput,update_ml_model_output +UpdateMLTransformRequest,update_ml_transform_request +UpdateMLTransformResponse,update_ml_transform_response +UpdateMacieSessionRequest,update_macie_session_request +UpdateMailboxQuotaRequest,update_mailbox_quota_request +UpdateMaintenance,update_maintenance +UpdateMaintenanceStartTimeInput,update_maintenance_start_time_input +UpdateMaintenanceStartTimeOutput,update_maintenance_start_time_output +UpdateMaintenanceWindowRequest,update_maintenance_window_request +UpdateMaintenanceWindowResult,update_maintenance_window_result +UpdateMaintenanceWindowTargetRequest,update_maintenance_window_target_request +UpdateMaintenanceWindowTargetResult,update_maintenance_window_target_result +UpdateMaintenanceWindowTaskRequest,update_maintenance_window_task_request +UpdateMaintenanceWindowTaskResult,update_maintenance_window_task_result +UpdateMalwareScanSettingsRequest,update_malware_scan_settings_request +UpdateManagedInstanceRoleRequest,update_managed_instance_role_request +UpdateManagedRuleSetVersionExpiryDateRequest,update_managed_rule_set_version_expiry_date_request +UpdateManagedRuleSetVersionExpiryDateResponse,update_managed_rule_set_version_expiry_date_response +UpdateMapRequest,update_map_request +UpdateMapResponse,update_map_response +UpdateMapRunInput,update_map_run_input +UpdateMatchingWorkflowInput,update_matching_workflow_input +UpdateMatchingWorkflowOutput,update_matching_workflow_output +UpdateMatchmakingConfigurationInput,update_matchmaking_configuration_input +UpdateMatchmakingConfigurationOutput,update_matchmaking_configuration_output +UpdateMediaInsightsPipelineConfigurationRequest,update_media_insights_pipeline_configuration_request +UpdateMediaInsightsPipelineConfigurationResponse,update_media_insights_pipeline_configuration_response +UpdateMediaInsightsPipelineStatusRequest,update_media_insights_pipeline_status_request +UpdateMediaPipelineKinesisVideoStreamPoolRequest,update_media_pipeline_kinesis_video_stream_pool_request +UpdateMediaPipelineKinesisVideoStreamPoolResponse,update_media_pipeline_kinesis_video_stream_pool_response +UpdateMediaStorageConfigurationInput,update_media_storage_configuration_input +UpdateMedicalVocabularyRequest,update_medical_vocabulary_request +UpdateMedicalVocabularyResponse,update_medical_vocabulary_response +UpdateMeetingRoomConfiguration,update_meeting_room_configuration +UpdateMemberDetectorsRequest,update_member_detectors_request +UpdateMemberDetectorsResponse,update_member_detectors_response +UpdateMemberInput,update_member_input +UpdateMemberSessionRequest,update_member_session_request +UpdateMembershipInput,update_membership_input +UpdateMembershipOutput,update_membership_output +UpdateMeshInput,update_mesh_input +UpdateMeshOutput,update_mesh_output +UpdateMethodRequest,update_method_request +UpdateMethodResponseRequest,update_method_response_request +UpdateMetricAttributionRequest,update_metric_attribution_request +UpdateMetricAttributionResponse,update_metric_attribution_response +UpdateMetricSetRequest,update_metric_set_request +UpdateMetricSetResponse,update_metric_set_response +UpdateMigrationWorkflowRequest,update_migration_workflow_request +UpdateMigrationWorkflowResponse,update_migration_workflow_response +UpdateMissionProfileRequest,update_mission_profile_request +UpdateMitigationActionRequest,update_mitigation_action_request +UpdateMitigationActionResponse,update_mitigation_action_response +UpdateMobileDeviceAccessRuleRequest,update_mobile_device_access_rule_request +UpdateModelCardRequest,update_model_card_request +UpdateModelCardResponse,update_model_card_response +UpdateModelManifestRequest,update_model_manifest_request +UpdateModelManifestResponse,update_model_manifest_response +UpdateModelPackageInput,update_model_package_input +UpdateModelPackageOutput,update_model_package_output +UpdateModelRequest,update_model_request +UpdateModelResponse,update_model_response +UpdateModelVersionRequest,update_model_version_request +UpdateModelVersionResult,update_model_version_result +UpdateModelVersionStatusRequest,update_model_version_status_request +UpdateMonitorInput,update_monitor_input +UpdateMonitorOutput,update_monitor_output +UpdateMonitoringAlertRequest,update_monitoring_alert_request +UpdateMonitoringAlertResponse,update_monitoring_alert_response +UpdateMonitoringRequest,update_monitoring_request +UpdateMonitoringResponse,update_monitoring_response +UpdateMonitoringScheduleRequest,update_monitoring_schedule_request +UpdateMonitoringScheduleResponse,update_monitoring_schedule_response +UpdateMulticastGroupRequest,update_multicast_group_request +UpdateMultiplexProgramRequest,update_multiplex_program_request +UpdateMultiplexProgramResponse,update_multiplex_program_response +UpdateMultiplexRequest,update_multiplex_request +UpdateMultiplexResponse,update_multiplex_response +UpdateMyUserProfileRequest,update_my_user_profile_request +UpdateNFSFileShareInput,update_nfs_file_share_input +UpdateNFSFileShareOutput,update_nfs_file_share_output +UpdateNamedQueryInput,update_named_query_input +UpdateNamespaceRequest,update_namespace_request +UpdateNamespaceResponse,update_namespace_response +UpdateNetworkAnalyzerConfigurationRequest,update_network_analyzer_configuration_request +UpdateNetworkConfigurationInput,update_network_configuration_input +UpdateNetworkProfileRequest,update_network_profile_request +UpdateNetworkProfileResult,update_network_profile_result +UpdateNetworkResourceMetadataRequest,update_network_resource_metadata_request +UpdateNetworkResourceMetadataResponse,update_network_resource_metadata_response +UpdateNetworkSettingsRequest,update_network_settings_request +UpdateNetworkSettingsResponse,update_network_settings_response +UpdateNetworkSitePlanRequest,update_network_site_plan_request +UpdateNetworkSiteRequest,update_network_site_request +UpdateNetworkSiteResponse,update_network_site_response +UpdateNodeInput,update_node_input +UpdateNodegroupConfigRequest,update_nodegroup_config_request +UpdateNodegroupConfigResponse,update_nodegroup_config_response +UpdateNodegroupVersionRequest,update_nodegroup_version_request +UpdateNodegroupVersionResponse,update_nodegroup_version_response +UpdateNotebookInput,update_notebook_input +UpdateNotebookInstanceInput,update_notebook_instance_input +UpdateNotebookInstanceLifecycleConfigInput,update_notebook_instance_lifecycle_config_input +UpdateNotebookMetadataInput,update_notebook_metadata_input +UpdateNotificationConfigurationInput,update_notification_configuration_input +UpdateNotificationRequest,update_notification_request +UpdateNotificationRuleRequest,update_notification_rule_request +UpdateNotificationSettingsRequest,update_notification_settings_request +UpdateNumberOfDomainControllersRequest,update_number_of_domain_controllers_request +UpdateObjectAttributes,update_object_attributes +UpdateObjectAttributesRequest,update_object_attributes_request +UpdateObjectAttributesResponse,update_object_attributes_response +UpdateOntapVolumeConfiguration,update_ontap_volume_configuration +UpdateOpenIDConnectProviderThumbprintRequest,update_open_id_connect_provider_thumbprint_request +UpdateOpenZFSVolumeConfiguration,update_open_zfs_volume_configuration +UpdateOpsItemRequest,update_ops_item_request +UpdateOpsMetadataRequest,update_ops_metadata_request +UpdateOpsMetadataResult,update_ops_metadata_result +UpdateOrgEc2DeepInspectionConfigurationRequest,update_org_ec2_deep_inspection_configuration_request +UpdateOrganizationConfigurationRequest,update_organization_configuration_request +UpdateOrganizationConfigurationResponse,update_organization_configuration_response +UpdateOrganizationalUnitRequest,update_organizational_unit_request +UpdateOrganizationalUnitResponse,update_organizational_unit_response +UpdateOriginAccessControlRequest,update_origin_access_control_request +UpdateOriginAccessControlResult,update_origin_access_control_result +UpdateOriginEndpointRequest,update_origin_endpoint_request +UpdateOriginEndpointResponse,update_origin_endpoint_response +UpdateOriginRequestPolicyRequest,update_origin_request_policy_request +UpdateOriginRequestPolicyResult,update_origin_request_policy_result +UpdateOutpostInput,update_outpost_input +UpdateOutpostOutput,update_outpost_output +UpdateOutpostResolverRequest,update_outpost_resolver_request +UpdateOutpostResolverResponse,update_outpost_resolver_response +UpdatePackageConfigurationRequest,update_package_configuration_request +UpdatePackageRequest,update_package_request +UpdatePackageResponse,update_package_response +UpdatePackageVersionRequest,update_package_version_request +UpdatePackageVersionsStatusRequest,update_package_versions_status_request +UpdatePackageVersionsStatusResult,update_package_versions_status_result +UpdatePackagingGroupRequest,update_packaging_group_request +UpdatePackagingGroupResponse,update_packaging_group_response +UpdateParallelDataRequest,update_parallel_data_request +UpdateParallelDataResponse,update_parallel_data_response +UpdateParam,update_param +UpdateParameterGroupRequest,update_parameter_group_request +UpdateParameterGroupResponse,update_parameter_group_response +UpdateParticipantRoleConfigRequest,update_participant_role_config_request +UpdatePartitionRequest,update_partition_request +UpdatePartnerAccountRequest,update_partner_account_request +UpdatePartnerStatusInputMessage,update_partner_status_input_message +UpdatePatchBaselineRequest,update_patch_baseline_request +UpdatePatchBaselineResult,update_patch_baseline_result +UpdatePermissionGroupRequest,update_permission_group_request +UpdatePermissionGroupResponse,update_permission_group_response +UpdatePermissionSetRequest,update_permission_set_request +UpdatePermissionsRequest,update_permissions_request +UpdatePermissionsResponse,update_permissions_response +UpdatePhoneNumberRequest,update_phone_number_request +UpdatePhoneNumberRequestItem,update_phone_number_request_item +UpdatePhoneNumberRequestItems,update_phone_number_request_items +UpdatePhoneNumberResponse,update_phone_number_response +UpdatePhoneNumberResult,update_phone_number_result +UpdatePhoneNumberSettingsRequest,update_phone_number_settings_request +UpdatePipeRequest,update_pipe_request +UpdatePipeResponse,update_pipe_response +UpdatePipeSourceActiveMQBrokerParameters,update_pipe_source_active_mq_broker_parameters +UpdatePipeSourceDynamoDBStreamParameters,update_pipe_source_dynamo_db_stream_parameters +UpdatePipeSourceKinesisStreamParameters,update_pipe_source_kinesis_stream_parameters +UpdatePipeSourceManagedStreamingKafkaParameters,update_pipe_source_managed_streaming_kafka_parameters +UpdatePipeSourceParameters,update_pipe_source_parameters +UpdatePipeSourceRabbitMQBrokerParameters,update_pipe_source_rabbit_mq_broker_parameters +UpdatePipeSourceSelfManagedKafkaParameters,update_pipe_source_self_managed_kafka_parameters +UpdatePipeSourceSqsQueueParameters,update_pipe_source_sqs_queue_parameters +UpdatePipelineExecutionRequest,update_pipeline_execution_request +UpdatePipelineExecutionResponse,update_pipeline_execution_response +UpdatePipelineInput,update_pipeline_input +UpdatePipelineNotificationsRequest,update_pipeline_notifications_request +UpdatePipelineNotificationsResponse,update_pipeline_notifications_response +UpdatePipelineOutput,update_pipeline_output +UpdatePipelineRequest,update_pipeline_request +UpdatePipelineResponse,update_pipeline_response +UpdatePipelineStatusRequest,update_pipeline_status_request +UpdatePipelineStatusResponse,update_pipeline_status_response +UpdatePlaceIndexRequest,update_place_index_request +UpdatePlaceIndexResponse,update_place_index_response +UpdatePlacementRequest,update_placement_request +UpdatePolicy,update_policy +UpdatePolicyInput,update_policy_input +UpdatePolicyOutput,update_policy_output +UpdatePolicyRequest,update_policy_request +UpdatePolicyResponse,update_policy_response +UpdatePolicyStoreInput,update_policy_store_input +UpdatePolicyStoreOutput,update_policy_store_output +UpdatePolicyTemplateInput,update_policy_template_input +UpdatePolicyTemplateOutput,update_policy_template_output +UpdatePoolRequest,update_pool_request +UpdatePoolResult,update_pool_result +UpdatePortalRequest,update_portal_request +UpdatePortalResponse,update_portal_response +UpdatePortfolioInput,update_portfolio_input +UpdatePortfolioOutput,update_portfolio_output +UpdatePortfolioShareInput,update_portfolio_share_input +UpdatePortfolioShareOutput,update_portfolio_share_output +UpdatePositionRequest,update_position_request +UpdatePreparedStatementInput,update_prepared_statement_input +UpdatePresetRequest,update_preset_request +UpdatePresetResponse,update_preset_response +UpdatePricingPlanInput,update_pricing_plan_input +UpdatePricingPlanOutput,update_pricing_plan_output +UpdatePricingPlanRequest,update_pricing_plan_request +UpdatePricingPlanResponse,update_pricing_plan_response +UpdatePricingRuleInput,update_pricing_rule_input +UpdatePricingRuleOutput,update_pricing_rule_output +UpdatePrimaryEmailAddressRequest,update_primary_email_address_request +UpdatePrimaryRegionRequest,update_primary_region_request +UpdatePrivateDnsNamespaceRequest,update_private_dns_namespace_request +UpdatePrivateDnsNamespaceResponse,update_private_dns_namespace_response +UpdateProactiveJoin,update_proactive_join +UpdateProblemRequest,update_problem_request +UpdateProductInput,update_product_input +UpdateProductOutput,update_product_output +UpdateProfileInput,update_profile_input +UpdateProfileJobRequest,update_profile_job_request +UpdateProfileJobResponse,update_profile_job_response +UpdateProfileOutput,update_profile_output +UpdateProfileRequest,update_profile_request +UpdateProfileResponse,update_profile_response +UpdateProfilingGroupRequest,update_profiling_group_request +UpdateProfilingGroupResponse,update_profiling_group_response +UpdateProgramRequest,update_program_request +UpdateProgramResponse,update_program_response +UpdateProgramScheduleConfiguration,update_program_schedule_configuration +UpdateProgramTransition,update_program_transition +UpdateProjectDataDeliveryRequest,update_project_data_delivery_request +UpdateProjectDataDeliveryResponse,update_project_data_delivery_response +UpdateProjectInput,update_project_input +UpdateProjectOutput,update_project_output +UpdateProjectRequest,update_project_request +UpdateProjectResponse,update_project_response +UpdateProjectResult,update_project_result +UpdateProjectVisibilityInput,update_project_visibility_input +UpdateProjectVisibilityOutput,update_project_visibility_output +UpdatePromptRequest,update_prompt_request +UpdatePromptResponse,update_prompt_response +UpdateProtectedQueryInput,update_protected_query_input +UpdateProtectedQueryOutput,update_protected_query_output +UpdateProtectionGroupRequest,update_protection_group_request +UpdateProvisionedModelThroughputRequest,update_provisioned_model_throughput_request +UpdateProvisionedProductInput,update_provisioned_product_input +UpdateProvisionedProductOutput,update_provisioned_product_output +UpdateProvisionedProductPropertiesInput,update_provisioned_product_properties_input +UpdateProvisionedProductPropertiesOutput,update_provisioned_product_properties_output +UpdateProvisioningArtifactInput,update_provisioning_artifact_input +UpdateProvisioningArtifactOutput,update_provisioning_artifact_output +UpdateProvisioningParameter,update_provisioning_parameter +UpdateProvisioningPreferences,update_provisioning_preferences +UpdateProvisioningTemplateRequest,update_provisioning_template_request +UpdateProxySessionRequest,update_proxy_session_request +UpdateProxySessionResponse,update_proxy_session_response +UpdatePublicDnsNamespaceRequest,update_public_dns_namespace_request +UpdatePublicDnsNamespaceResponse,update_public_dns_namespace_response +UpdatePublicKeyRequest,update_public_key_request +UpdatePublicKeyResult,update_public_key_result +UpdatePublicSharingSettingsRequest,update_public_sharing_settings_request +UpdatePublicSharingSettingsResponse,update_public_sharing_settings_response +UpdatePublishingDestinationRequest,update_publishing_destination_request +UpdatePullRequestApprovalRuleContentInput,update_pull_request_approval_rule_content_input +UpdatePullRequestApprovalRuleContentOutput,update_pull_request_approval_rule_content_output +UpdatePullRequestApprovalStateInput,update_pull_request_approval_state_input +UpdatePullRequestDescriptionInput,update_pull_request_description_input +UpdatePullRequestDescriptionOutput,update_pull_request_description_output +UpdatePullRequestStatusInput,update_pull_request_status_input +UpdatePullRequestStatusOutput,update_pull_request_status_output +UpdatePullRequestTitleInput,update_pull_request_title_input +UpdatePullRequestTitleOutput,update_pull_request_title_output +UpdatePushTemplateRequest,update_push_template_request +UpdatePushTemplateResponse,update_push_template_response +UpdateQualificationTypeRequest,update_qualification_type_request +UpdateQualificationTypeResponse,update_qualification_type_response +UpdateQuerySuggestionsBlockListRequest,update_query_suggestions_block_list_request +UpdateQuerySuggestionsConfigRequest,update_query_suggestions_config_request +UpdateQueueHoursOfOperationRequest,update_queue_hours_of_operation_request +UpdateQueueMaxContactsRequest,update_queue_max_contacts_request +UpdateQueueNameRequest,update_queue_name_request +UpdateQueueOutboundCallerConfigRequest,update_queue_outbound_caller_config_request +UpdateQueueRequest,update_queue_request +UpdateQueueResponse,update_queue_response +UpdateQueueStatusRequest,update_queue_status_request +UpdateQuickConnectConfigRequest,update_quick_connect_config_request +UpdateQuickConnectNameRequest,update_quick_connect_name_request +UpdateRadiusRequest,update_radius_request +UpdateRateBasedRuleRequest,update_rate_based_rule_request +UpdateRateBasedRuleResponse,update_rate_based_rule_response +UpdateRdsDbInstanceRequest,update_rds_db_instance_request +UpdateReadinessCheckRequest,update_readiness_check_request +UpdateReadinessCheckResponse,update_readiness_check_response +UpdateRealtimeLogConfigRequest,update_realtime_log_config_request +UpdateRealtimeLogConfigResult,update_realtime_log_config_result +UpdateReceiptRuleRequest,update_receipt_rule_request +UpdateRecipeJobRequest,update_recipe_job_request +UpdateRecipeJobResponse,update_recipe_job_response +UpdateRecipeRequest,update_recipe_request +UpdateRecipeResponse,update_recipe_response +UpdateRecommendationStatusItem,update_recommendation_status_item +UpdateRecommendationStatusRequestEntry,update_recommendation_status_request_entry +UpdateRecommenderConfiguration,update_recommender_configuration +UpdateRecommenderConfigurationRequest,update_recommender_configuration_request +UpdateRecommenderConfigurationResponse,update_recommender_configuration_response +UpdateRecommenderConfigurationShape,update_recommender_configuration_shape +UpdateRecommenderRequest,update_recommender_request +UpdateRecommenderResponse,update_recommender_response +UpdateRecordsRequest,update_records_request +UpdateRecordsResponse,update_records_response +UpdateRecoveryGroupRequest,update_recovery_group_request +UpdateRecoveryGroupResponse,update_recovery_group_response +UpdateRecoveryPointLifecycleInput,update_recovery_point_lifecycle_input +UpdateRecoveryPointLifecycleOutput,update_recovery_point_lifecycle_output +UpdateRefreshScheduleRequest,update_refresh_schedule_request +UpdateRefreshScheduleResponse,update_refresh_schedule_response +UpdateRegexMatchSetRequest,update_regex_match_set_request +UpdateRegexMatchSetResponse,update_regex_match_set_response +UpdateRegexPatternSetRequest,update_regex_pattern_set_request +UpdateRegexPatternSetResponse,update_regex_pattern_set_response +UpdateRegionSettingsInput,update_region_settings_input +UpdateRegistryInput,update_registry_input +UpdateRegistryRequest,update_registry_request +UpdateRegistryResponse,update_registry_response +UpdateRelatedItemsInput,update_related_items_input +UpdateRelationalDatabaseParametersRequest,update_relational_database_parameters_request +UpdateRelationalDatabaseParametersResult,update_relational_database_parameters_result +UpdateRelationalDatabaseRequest,update_relational_database_request +UpdateRelationalDatabaseResult,update_relational_database_result +UpdateReplicationConfigurationRequest,update_replication_configuration_request +UpdateReplicationConfigurationTemplateRequest,update_replication_configuration_template_request +UpdateReplicationGroupMemberAction,update_replication_group_member_action +UpdateReplicationJobRequest,update_replication_job_request +UpdateReplicationSetInput,update_replication_set_input +UpdateReportDefinitionRequest,update_report_definition_request +UpdateReportDefinitionResult,update_report_definition_result +UpdateReportGroupInput,update_report_group_input +UpdateReportGroupOutput,update_report_group_output +UpdateReportPlanInput,update_report_plan_input +UpdateReportPlanOutput,update_report_plan_output +UpdateRepositoryDescriptionInput,update_repository_description_input +UpdateRepositoryNameInput,update_repository_name_input +UpdateRepositoryRequest,update_repository_request +UpdateRepositoryResult,update_repository_result +UpdateRequestValidatorRequest,update_request_validator_request +UpdateRequireCheckIn,update_require_check_in +UpdateRescoreExecutionPlanRequest,update_rescore_execution_plan_request +UpdateReservationRequest,update_reservation_request +UpdateReservationResponse,update_reservation_response +UpdateResiliencyPolicyRequest,update_resiliency_policy_request +UpdateResiliencyPolicyResponse,update_resiliency_policy_response +UpdateResolverConfigRequest,update_resolver_config_request +UpdateResolverConfigResponse,update_resolver_config_response +UpdateResolverDnssecConfigRequest,update_resolver_dnssec_config_request +UpdateResolverDnssecConfigResponse,update_resolver_dnssec_config_response +UpdateResolverEndpointRequest,update_resolver_endpoint_request +UpdateResolverEndpointResponse,update_resolver_endpoint_response +UpdateResolverRequest,update_resolver_request +UpdateResolverResponse,update_resolver_response +UpdateResolverRuleRequest,update_resolver_rule_request +UpdateResolverRuleResponse,update_resolver_rule_response +UpdateResourceCollectionFilter,update_resource_collection_filter +UpdateResourceCollectionRequest,update_resource_collection_request +UpdateResourceDataSyncRequest,update_resource_data_sync_request +UpdateResourceDefinitionRequest,update_resource_definition_request +UpdateResourceEventConfigurationRequest,update_resource_event_configuration_request +UpdateResourceInput,update_resource_input +UpdateResourceOutput,update_resource_output +UpdateResourcePolicyRequest,update_resource_policy_request +UpdateResourcePolicyResponse,update_resource_policy_response +UpdateResourcePositionRequest,update_resource_position_request +UpdateResourceProfileDetectionsRequest,update_resource_profile_detections_request +UpdateResourceProfileRequest,update_resource_profile_request +UpdateResourceRequest,update_resource_request +UpdateResourceServerRequest,update_resource_server_request +UpdateResourceServerResponse,update_resource_server_response +UpdateResourceSetRequest,update_resource_set_request +UpdateResourceSetResponse,update_resource_set_response +UpdateResourceShareRequest,update_resource_share_request +UpdateResourceShareResponse,update_resource_share_response +UpdateResponseHeadersPolicyRequest,update_response_headers_policy_request +UpdateResponseHeadersPolicyResult,update_response_headers_policy_result +UpdateResponsePlanInput,update_response_plan_input +UpdateRestApiRequest,update_rest_api_request +UpdateResult,update_result +UpdateRetrainingSchedulerRequest,update_retraining_scheduler_request +UpdateRevealConfigurationRequest,update_reveal_configuration_request +UpdateRevealConfigurationResponse,update_reveal_configuration_response +UpdateRevisionRequest,update_revision_request +UpdateRevisionResponse,update_revision_response +UpdateRobotApplicationRequest,update_robot_application_request +UpdateRobotApplicationResponse,update_robot_application_response +UpdateRoleAliasRequest,update_role_alias_request +UpdateRoleAliasResponse,update_role_alias_response +UpdateRoleDescriptionRequest,update_role_description_request +UpdateRoleDescriptionResponse,update_role_description_response +UpdateRoleRequest,update_role_request +UpdateRoomMembershipRequest,update_room_membership_request +UpdateRoomMembershipResponse,update_room_membership_response +UpdateRoomRequest,update_room_request +UpdateRoomResponse,update_room_response +UpdateRotationRequest,update_rotation_request +UpdateRouteCalculatorRequest,update_route_calculator_request +UpdateRouteCalculatorResponse,update_route_calculator_response +UpdateRouteInput,update_route_input +UpdateRouteOutput,update_route_output +UpdateRouteRequest,update_route_request +UpdateRouteResponse,update_route_response +UpdateRouteResponseRequest,update_route_response_request +UpdateRouteResponseResponse,update_route_response_response +UpdateRouteResult,update_route_result +UpdateRoutingControlRequest,update_routing_control_request +UpdateRoutingControlResponse,update_routing_control_response +UpdateRoutingControlStateEntries,update_routing_control_state_entries +UpdateRoutingControlStateEntry,update_routing_control_state_entry +UpdateRoutingControlStateRequest,update_routing_control_state_request +UpdateRoutingControlStatesRequest,update_routing_control_states_request +UpdateRoutingProfileAgentAvailabilityTimerRequest,update_routing_profile_agent_availability_timer_request +UpdateRoutingProfileConcurrencyRequest,update_routing_profile_concurrency_request +UpdateRoutingProfileDefaultOutboundQueueRequest,update_routing_profile_default_outbound_queue_request +UpdateRoutingProfileNameRequest,update_routing_profile_name_request +UpdateRoutingProfileQueuesRequest,update_routing_profile_queues_request +UpdateRowData,update_row_data +UpdateRuleGroupRequest,update_rule_group_request +UpdateRuleGroupResponse,update_rule_group_response +UpdateRuleMetadataRequest,update_rule_metadata_request +UpdateRuleRequest,update_rule_request +UpdateRuleResponse,update_rule_response +UpdateRuleVersionRequest,update_rule_version_request +UpdateRuleVersionResult,update_rule_version_result +UpdateRulesOfIpGroupRequest,update_rules_of_ip_group_request +UpdateRulesetRequest,update_ruleset_request +UpdateRulesetResponse,update_ruleset_response +UpdateRumMetricDefinitionRequest,update_rum_metric_definition_request +UpdateRunGroupRequest,update_run_group_request +UpdateRuntimeConfigurationInput,update_runtime_configuration_input +UpdateRuntimeConfigurationOutput,update_runtime_configuration_output +UpdateRuntimeOn,update_runtime_on +UpdateS3ResourcesRequest,update_s3_resources_request +UpdateS3ResourcesResult,update_s3_resources_result +UpdateSAMLProviderRequest,update_saml_provider_request +UpdateSAMLProviderResponse,update_saml_provider_response +UpdateSMBFileShareInput,update_smb_file_share_input +UpdateSMBFileShareOutput,update_smb_file_share_output +UpdateSMBFileShareVisibilityInput,update_smb_file_share_visibility_input +UpdateSMBFileShareVisibilityOutput,update_smb_file_share_visibility_output +UpdateSMBLocalGroupsInput,update_smb_local_groups_input +UpdateSMBLocalGroupsOutput,update_smb_local_groups_output +UpdateSMBSecurityStrategyInput,update_smb_security_strategy_input +UpdateSMBSecurityStrategyOutput,update_smb_security_strategy_output +UpdateSSHPublicKeyRequest,update_ssh_public_key_request +UpdateSafetyRuleRequest,update_safety_rule_request +UpdateSafetyRuleResponse,update_safety_rule_response +UpdateSamplingRuleRequest,update_sampling_rule_request +UpdateSamplingRuleResult,update_sampling_rule_result +UpdateScalingParametersRequest,update_scaling_parameters_request +UpdateScalingParametersResponse,update_scaling_parameters_response +UpdateScalingPlanRequest,update_scaling_plan_request +UpdateSceneRequest,update_scene_request +UpdateSceneResponse,update_scene_response +UpdateScheduleInput,update_schedule_input +UpdateScheduleOutput,update_schedule_output +UpdateScheduleRequest,update_schedule_request +UpdateScheduleResponse,update_schedule_response +UpdateScheduledActionRequest,update_scheduled_action_request +UpdateScheduledActionResponse,update_scheduled_action_response +UpdateScheduledAuditRequest,update_scheduled_audit_request +UpdateScheduledAuditResponse,update_scheduled_audit_response +UpdateScheduledQueryRequest,update_scheduled_query_request +UpdateSchedulingPolicyRequest,update_scheduling_policy_request +UpdateSchemaInput,update_schema_input +UpdateSchemaRequest,update_schema_request +UpdateSchemaResponse,update_schema_response +UpdateScriptInput,update_script_input +UpdateScriptOutput,update_script_output +UpdateSecretRequest,update_secret_request +UpdateSecretResponse,update_secret_response +UpdateSecretVersionStageRequest,update_secret_version_stage_request +UpdateSecretVersionStageResponse,update_secret_version_stage_response +UpdateSecurityConfigRequest,update_security_config_request +UpdateSecurityConfigResponse,update_security_config_response +UpdateSecurityGroupForDirectoryControllers,update_security_group_for_directory_controllers +UpdateSecurityGroupRuleDescriptionsEgressRequest,update_security_group_rule_descriptions_egress_request +UpdateSecurityGroupRuleDescriptionsEgressResult,update_security_group_rule_descriptions_egress_result +UpdateSecurityGroupRuleDescriptionsIngressRequest,update_security_group_rule_descriptions_ingress_request +UpdateSecurityGroupRuleDescriptionsIngressResult,update_security_group_rule_descriptions_ingress_result +UpdateSecurityHubConfigurationRequest,update_security_hub_configuration_request +UpdateSecurityPolicyRequest,update_security_policy_request +UpdateSecurityPolicyResponse,update_security_policy_response +UpdateSecurityProfileRequest,update_security_profile_request +UpdateSecurityProfileResponse,update_security_profile_response +UpdateSecurityRequest,update_security_request +UpdateSecurityResponse,update_security_response +UpdateSegmentRequest,update_segment_request +UpdateSegmentResponse,update_segment_response +UpdateSensitivityInspectionTemplateRequest,update_sensitivity_inspection_template_request +UpdateServerCertificateRequest,update_server_certificate_request +UpdateServerConfigRequest,update_server_config_request +UpdateServerEngineAttributesRequest,update_server_engine_attributes_request +UpdateServerEngineAttributesResponse,update_server_engine_attributes_response +UpdateServerRequest,update_server_request +UpdateServerResponse,update_server_response +UpdateServiceAccessPoliciesRequest,update_service_access_policies_request +UpdateServiceAccessPoliciesResponse,update_service_access_policies_response +UpdateServiceActionInput,update_service_action_input +UpdateServiceActionOutput,update_service_action_output +UpdateServiceInput,update_service_input +UpdateServiceInstanceInput,update_service_instance_input +UpdateServiceInstanceOutput,update_service_instance_output +UpdateServiceIntegrationConfig,update_service_integration_config +UpdateServiceIntegrationRequest,update_service_integration_request +UpdateServiceNetworkRequest,update_service_network_request +UpdateServiceNetworkResponse,update_service_network_response +UpdateServiceNetworkVpcAssociationRequest,update_service_network_vpc_association_request +UpdateServiceNetworkVpcAssociationResponse,update_service_network_vpc_association_response +UpdateServiceOutput,update_service_output +UpdateServicePipelineInput,update_service_pipeline_input +UpdateServicePipelineOutput,update_service_pipeline_output +UpdateServicePrimaryTaskSetRequest,update_service_primary_task_set_request +UpdateServicePrimaryTaskSetResponse,update_service_primary_task_set_response +UpdateServiceRequest,update_service_request +UpdateServiceResponse,update_service_response +UpdateServiceSettingRequest,update_service_setting_request +UpdateServiceSettingsRequest,update_service_settings_request +UpdateServiceSettingsResponse,update_service_settings_response +UpdateServiceSpecificCredentialRequest,update_service_specific_credential_request +UpdateServiceSyncBlockerInput,update_service_sync_blocker_input +UpdateServiceSyncBlockerOutput,update_service_sync_blocker_output +UpdateServiceSyncConfigInput,update_service_sync_config_input +UpdateServiceSyncConfigOutput,update_service_sync_config_output +UpdateServiceTemplateInput,update_service_template_input +UpdateServiceTemplateOutput,update_service_template_output +UpdateServiceTemplateVersionInput,update_service_template_version_input +UpdateServiceTemplateVersionOutput,update_service_template_version_output +UpdateSettings,update_settings +UpdateSettingsRequest,update_settings_request +UpdateSettingsResponse,update_settings_response +UpdateSettingsResult,update_settings_result +UpdateShardCountInput,update_shard_count_input +UpdateShardCountOutput,update_shard_count_output +UpdateShareInvitationInput,update_share_invitation_input +UpdateShareInvitationOutput,update_share_invitation_output +UpdateSignalCatalogRequest,update_signal_catalog_request +UpdateSignalCatalogResponse,update_signal_catalog_response +UpdateSignalingChannelInput,update_signaling_channel_input +UpdateSignature,update_signature +UpdateSigningCertificateRequest,update_signing_certificate_request +UpdateSimulationApplicationRequest,update_simulation_application_request +UpdateSimulationApplicationResponse,update_simulation_application_response +UpdateSipMediaApplicationCallRequest,update_sip_media_application_call_request +UpdateSipMediaApplicationCallResponse,update_sip_media_application_call_response +UpdateSipMediaApplicationRequest,update_sip_media_application_request +UpdateSipMediaApplicationResponse,update_sip_media_application_response +UpdateSipRuleRequest,update_sip_rule_request +UpdateSipRuleResponse,update_sip_rule_response +UpdateSiteAddressInput,update_site_address_input +UpdateSiteAddressOutput,update_site_address_output +UpdateSiteInput,update_site_input +UpdateSiteOutput,update_site_output +UpdateSiteRackPhysicalPropertiesInput,update_site_rack_physical_properties_input +UpdateSiteRackPhysicalPropertiesOutput,update_site_rack_physical_properties_output +UpdateSiteRequest,update_site_request +UpdateSiteResponse,update_site_response +UpdateSizeConstraintSetRequest,update_size_constraint_set_request +UpdateSizeConstraintSetResponse,update_size_constraint_set_response +UpdateSkillGroupRequest,update_skill_group_request +UpdateSlackChannelConfigurationRequest,update_slack_channel_configuration_request +UpdateSlackChannelConfigurationResult,update_slack_channel_configuration_result +UpdateSlotRequest,update_slot_request +UpdateSlotResponse,update_slot_response +UpdateSlotTypeRequest,update_slot_type_request +UpdateSlotTypeResponse,update_slot_type_response +UpdateSmsChannelRequest,update_sms_channel_request +UpdateSmsChannelResponse,update_sms_channel_response +UpdateSmsTemplateRequest,update_sms_template_request +UpdateSmsTemplateResponse,update_sms_template_response +UpdateSnaplockConfiguration,update_snaplock_configuration +UpdateSnapshotRequest,update_snapshot_request +UpdateSnapshotResponse,update_snapshot_response +UpdateSnapshotResult,update_snapshot_result +UpdateSnapshotScheduleInput,update_snapshot_schedule_input +UpdateSnapshotScheduleOutput,update_snapshot_schedule_output +UpdateSolFunctionPackageInput,update_sol_function_package_input +UpdateSolFunctionPackageOutput,update_sol_function_package_output +UpdateSolNetworkInstanceInput,update_sol_network_instance_input +UpdateSolNetworkInstanceOutput,update_sol_network_instance_output +UpdateSolNetworkModify,update_sol_network_modify +UpdateSolNetworkPackageInput,update_sol_network_package_input +UpdateSolNetworkPackageOutput,update_sol_network_package_output +UpdateSource,update_source +UpdateSourceApiAssociationRequest,update_source_api_association_request +UpdateSourceApiAssociationResponse,update_source_api_association_response +UpdateSourceControlFromJobRequest,update_source_control_from_job_request +UpdateSourceControlFromJobResponse,update_source_control_from_job_response +UpdateSourceLocationRequest,update_source_location_request +UpdateSourceLocationResponse,update_source_location_response +UpdateSourceServerReplicationTypeRequest,update_source_server_replication_type_request +UpdateSpaceRequest,update_space_request +UpdateSpaceResponse,update_space_response +UpdateSqlInjectionMatchSetRequest,update_sql_injection_match_set_request +UpdateSqlInjectionMatchSetResponse,update_sql_injection_match_set_response +UpdateStackInput,update_stack_input +UpdateStackInstancesInput,update_stack_instances_input +UpdateStackInstancesOutput,update_stack_instances_output +UpdateStackOutput,update_stack_output +UpdateStackRequest,update_stack_request +UpdateStackResult,update_stack_result +UpdateStackSetInput,update_stack_set_input +UpdateStackSetOutput,update_stack_set_output +UpdateStageRequest,update_stage_request +UpdateStageResponse,update_stage_response +UpdateStageResult,update_stage_result +UpdateStandardsControlRequest,update_standards_control_request +UpdateStateMachineAliasInput,update_state_machine_alias_input +UpdateStateMachineAliasOutput,update_state_machine_alias_output +UpdateStateMachineInput,update_state_machine_input +UpdateStateMachineOutput,update_state_machine_output +UpdateStaticPolicyDefinition,update_static_policy_definition +UpdateStatus,update_status +UpdateStorageRequest,update_storage_request +UpdateStorageResponse,update_storage_response +UpdateStorageSystemRequest,update_storage_system_request +UpdateStorageVirtualMachineRequest,update_storage_virtual_machine_request +UpdateStorageVirtualMachineResponse,update_storage_virtual_machine_response +UpdateStreamInput,update_stream_input +UpdateStreamModeInput,update_stream_mode_input +UpdateStreamProcessorRequest,update_stream_processor_request +UpdateStreamRequest,update_stream_request +UpdateStreamResponse,update_stream_response +UpdateStreamingDistributionRequest,update_streaming_distribution_request +UpdateStreamingDistributionResult,update_streaming_distribution_result +UpdateStreamingImageRequest,update_streaming_image_request +UpdateStreamingImageResponse,update_streaming_image_response +UpdateStudioComponentRequest,update_studio_component_request +UpdateStudioComponentResponse,update_studio_component_response +UpdateStudioInput,update_studio_input +UpdateStudioRequest,update_studio_request +UpdateStudioResponse,update_studio_response +UpdateStudioSessionMappingInput,update_studio_session_mapping_input +UpdateSubnetChangeProtectionRequest,update_subnet_change_protection_request +UpdateSubnetChangeProtectionResponse,update_subnet_change_protection_response +UpdateSubnetGroupRequest,update_subnet_group_request +UpdateSubnetGroupResponse,update_subnet_group_response +UpdateSubscriberNotificationRequest,update_subscriber_notification_request +UpdateSubscriberNotificationResponse,update_subscriber_notification_response +UpdateSubscriberRequest,update_subscriber_request +UpdateSubscriberResponse,update_subscriber_response +UpdateSubscriptionDefinitionRequest,update_subscription_definition_request +UpdateSubscriptionRequest,update_subscription_request +UpdateSubscriptionsToEventBridgeMessage,update_subscriptions_to_event_bridge_message +UpdateSubscriptionsToEventBridgeResponse,update_subscriptions_to_event_bridge_response +UpdateSuiteDefinitionRequest,update_suite_definition_request +UpdateSuiteDefinitionResponse,update_suite_definition_response +UpdateSvmActiveDirectoryConfiguration,update_svm_active_directory_configuration +UpdateSystemTemplateRequest,update_system_template_request +UpdateSystemTemplateResponse,update_system_template_response +UpdateTLSInspectionConfigurationRequest,update_tls_inspection_configuration_request +UpdateTLSInspectionConfigurationResponse,update_tls_inspection_configuration_response +UpdateTableInput,update_table_input +UpdateTableObjectsRequest,update_table_objects_request +UpdateTableOutput,update_table_output +UpdateTableReplicaAutoScalingInput,update_table_replica_auto_scaling_input +UpdateTableReplicaAutoScalingOutput,update_table_replica_auto_scaling_output +UpdateTableRequest,update_table_request +UpdateTableResponse,update_table_response +UpdateTableStorageOptimizerRequest,update_table_storage_optimizer_request +UpdateTableStorageOptimizerResponse,update_table_storage_optimizer_response +UpdateTagCollectionFilter,update_tag_collection_filter +UpdateTagOptionInput,update_tag_option_input +UpdateTagOptionOutput,update_tag_option_output +UpdateTagsForDomainRequest,update_tags_for_domain_request +UpdateTagsForResourceMessage,update_tags_for_resource_message +UpdateTaintsPayload,update_taints_payload +UpdateTarget,update_target +UpdateTargetGroupRequest,update_target_group_request +UpdateTargetGroupResponse,update_target_group_response +UpdateTargets,update_targets +UpdateTargetsArchitecture,update_targets_architecture +UpdateTargetsOperatingSystem,update_targets_operating_system +UpdateTaskExecutionRequest,update_task_execution_request +UpdateTaskProtectionRequest,update_task_protection_request +UpdateTaskProtectionResponse,update_task_protection_response +UpdateTaskRequest,update_task_request +UpdateTaskSetRequest,update_task_set_request +UpdateTaskSetResponse,update_task_set_response +UpdateTaskTemplateRequest,update_task_template_request +UpdateTaskTemplateResponse,update_task_template_response +UpdateTeamMemberRequest,update_team_member_request +UpdateTeamMemberResult,update_team_member_result +UpdateTemplateActiveVersionRequest,update_template_active_version_request +UpdateTemplateActiveVersionResponse,update_template_active_version_response +UpdateTemplateAliasRequest,update_template_alias_request +UpdateTemplateAliasResponse,update_template_alias_response +UpdateTemplateGroupAccessControlEntryRequest,update_template_group_access_control_entry_request +UpdateTemplatePermissionsRequest,update_template_permissions_request +UpdateTemplatePermissionsResponse,update_template_permissions_response +UpdateTemplateRequest,update_template_request +UpdateTemplateResponse,update_template_response +UpdateTemplateSyncConfigInput,update_template_sync_config_input +UpdateTemplateSyncConfigOutput,update_template_sync_config_output +UpdateTerminationProtectionInput,update_termination_protection_input +UpdateTerminationProtectionOutput,update_termination_protection_output +UpdateTestGridProjectRequest,update_test_grid_project_request +UpdateTestGridProjectResult,update_test_grid_project_result +UpdateTestSetRequest,update_test_set_request +UpdateTestSetResponse,update_test_set_response +UpdateThemeAliasRequest,update_theme_alias_request +UpdateThemeAliasResponse,update_theme_alias_response +UpdateThemeData,update_theme_data +UpdateThemePermissionsRequest,update_theme_permissions_request +UpdateThemePermissionsResponse,update_theme_permissions_response +UpdateThemeRequest,update_theme_request +UpdateThemeResponse,update_theme_response +UpdateThesaurusRequest,update_thesaurus_request +UpdateThingGroupRequest,update_thing_group_request +UpdateThingGroupResponse,update_thing_group_response +UpdateThingGroupsForThingRequest,update_thing_groups_for_thing_request +UpdateThingRequest,update_thing_request +UpdateThingRuntimeConfigurationRequest,update_thing_runtime_configuration_request +UpdateThingShadowRequest,update_thing_shadow_request +UpdateThingShadowResponse,update_thing_shadow_response +UpdateThreatIntelSetRequest,update_threat_intel_set_request +UpdateTieringInput,update_tiering_input +UpdateTime,update_time +UpdateTimeToLiveInput,update_time_to_live_input +UpdateTimeToLiveOutput,update_time_to_live_output +UpdateTimelineEventInput,update_timeline_event_input +UpdateToken,update_token +UpdateTopicPermissionsRequest,update_topic_permissions_request +UpdateTopicPermissionsResponse,update_topic_permissions_response +UpdateTopicRefreshScheduleRequest,update_topic_refresh_schedule_request +UpdateTopicRefreshScheduleResponse,update_topic_refresh_schedule_response +UpdateTopicRequest,update_topic_request +UpdateTopicResponse,update_topic_response +UpdateTopicRuleDestinationRequest,update_topic_rule_destination_request +UpdateTrackerRequest,update_tracker_request +UpdateTrackerResponse,update_tracker_response +UpdateTrafficDistributionRequest,update_traffic_distribution_request +UpdateTrafficPolicyCommentRequest,update_traffic_policy_comment_request +UpdateTrafficPolicyCommentResponse,update_traffic_policy_comment_response +UpdateTrafficPolicyInstanceRequest,update_traffic_policy_instance_request +UpdateTrafficPolicyInstanceResponse,update_traffic_policy_instance_response +UpdateTrailRequest,update_trail_request +UpdateTrailResponse,update_trail_response +UpdateTrainingJobRequest,update_training_job_request +UpdateTrainingJobResponse,update_training_job_response +UpdateTrialComponentRequest,update_trial_component_request +UpdateTrialComponentResponse,update_trial_component_response +UpdateTrialRequest,update_trial_request +UpdateTrialResponse,update_trial_response +UpdateTriggerRequest,update_trigger_request +UpdateTriggerResponse,update_trigger_response +UpdateTrustAnchorRequest,update_trust_anchor_request +UpdateTrustRequest,update_trust_request +UpdateTrustResult,update_trust_result +UpdateTrustStoreRequest,update_trust_store_request +UpdateTrustStoreResponse,update_trust_store_response +UpdateType,update_type +UpdateTypeRequest,update_type_request +UpdateTypeResponse,update_type_response +UpdateTypedLinkFacetRequest,update_typed_link_facet_request +UpdateUploadRequest,update_upload_request +UpdateUploadResult,update_upload_result +UpdateUsageLimitRequest,update_usage_limit_request +UpdateUsageLimitResponse,update_usage_limit_response +UpdateUsagePlanRequest,update_usage_plan_request +UpdateUsageRequest,update_usage_request +UpdateUserAccessLoggingSettingsRequest,update_user_access_logging_settings_request +UpdateUserAccessLoggingSettingsResponse,update_user_access_logging_settings_response +UpdateUserAttributesRequest,update_user_attributes_request +UpdateUserAttributesResponse,update_user_attributes_response +UpdateUserDefinedFunctionRequest,update_user_defined_function_request +UpdateUserHierarchyGroupNameRequest,update_user_hierarchy_group_name_request +UpdateUserHierarchyRequest,update_user_hierarchy_request +UpdateUserHierarchyStructureRequest,update_user_hierarchy_structure_request +UpdateUserIdentityInfoRequest,update_user_identity_info_request +UpdateUserPhoneConfigRequest,update_user_phone_config_request +UpdateUserPoolClientRequest,update_user_pool_client_request +UpdateUserPoolClientResponse,update_user_pool_client_response +UpdateUserPoolDomainRequest,update_user_pool_domain_request +UpdateUserPoolDomainResponse,update_user_pool_domain_response +UpdateUserPoolRequest,update_user_pool_request +UpdateUserProfileRequest,update_user_profile_request +UpdateUserProfileResponse,update_user_profile_response +UpdateUserProfileResult,update_user_profile_result +UpdateUserRequest,update_user_request +UpdateUserRequestItem,update_user_request_item +UpdateUserRequestItems,update_user_request_items +UpdateUserResponse,update_user_response +UpdateUserRoutingProfileRequest,update_user_routing_profile_request +UpdateUserSecurityProfilesRequest,update_user_security_profiles_request +UpdateUserSettingsRequest,update_user_settings_request +UpdateUserSettingsResponse,update_user_settings_response +UpdateVPCConnectionRequest,update_vpc_connection_request +UpdateVPCConnectionResponse,update_vpc_connection_response +UpdateVPCEConfigurationRequest,update_vpce_configuration_request +UpdateVPCEConfigurationResult,update_vpce_configuration_result +UpdateVTLDeviceTypeInput,update_vtl_device_type_input +UpdateVTLDeviceTypeOutput,update_vtl_device_type_output +UpdateValue,update_value +UpdateVariableRequest,update_variable_request +UpdateVariantStoreRequest,update_variant_store_request +UpdateVariantStoreResponse,update_variant_store_response +UpdateVehicleError,update_vehicle_error +UpdateVehicleRequest,update_vehicle_request +UpdateVehicleRequestItem,update_vehicle_request_item +UpdateVehicleResponse,update_vehicle_response +UpdateVehicleResponseItem,update_vehicle_response_item +UpdateVersion,update_version +UpdateViewContentRequest,update_view_content_request +UpdateViewContentResponse,update_view_content_response +UpdateViewInput,update_view_input +UpdateViewMetadataRequest,update_view_metadata_request +UpdateViewOutput,update_view_output +UpdateVirtualGatewayInput,update_virtual_gateway_input +UpdateVirtualGatewayOutput,update_virtual_gateway_output +UpdateVirtualInterfaceAttributesRequest,update_virtual_interface_attributes_request +UpdateVirtualNodeInput,update_virtual_node_input +UpdateVirtualNodeOutput,update_virtual_node_output +UpdateVirtualRouterInput,update_virtual_router_input +UpdateVirtualRouterOutput,update_virtual_router_output +UpdateVirtualServiceInput,update_virtual_service_input +UpdateVirtualServiceOutput,update_virtual_service_output +UpdateVocabularyFilterRequest,update_vocabulary_filter_request +UpdateVocabularyFilterResponse,update_vocabulary_filter_response +UpdateVocabularyRequest,update_vocabulary_request +UpdateVocabularyResponse,update_vocabulary_response +UpdateVodSourceRequest,update_vod_source_request +UpdateVodSourceResponse,update_vod_source_response +UpdateVoiceChannelRequest,update_voice_channel_request +UpdateVoiceChannelResponse,update_voice_channel_response +UpdateVoiceConnectorGroupRequest,update_voice_connector_group_request +UpdateVoiceConnectorGroupResponse,update_voice_connector_group_response +UpdateVoiceConnectorRequest,update_voice_connector_request +UpdateVoiceConnectorResponse,update_voice_connector_response +UpdateVoiceProfileDomainRequest,update_voice_profile_domain_request +UpdateVoiceProfileDomainResponse,update_voice_profile_domain_response +UpdateVoiceProfileRequest,update_voice_profile_request +UpdateVoiceProfileResponse,update_voice_profile_response +UpdateVoiceTemplateRequest,update_voice_template_request +UpdateVoiceTemplateResponse,update_voice_template_response +UpdateVolumeRequest,update_volume_request +UpdateVolumeResponse,update_volume_response +UpdateVpcAttachmentRequest,update_vpc_attachment_request +UpdateVpcAttachmentResponse,update_vpc_attachment_response +UpdateVpcEndpointDetail,update_vpc_endpoint_detail +UpdateVpcEndpointRequest,update_vpc_endpoint_request +UpdateVpcEndpointResponse,update_vpc_endpoint_response +UpdateVpcIngressConnectionRequest,update_vpc_ingress_connection_request +UpdateVpcIngressConnectionResponse,update_vpc_ingress_connection_response +UpdateVpcLinkRequest,update_vpc_link_request +UpdateVpcLinkResponse,update_vpc_link_response +UpdateWatchlistRequest,update_watchlist_request +UpdateWatchlistResponse,update_watchlist_response +UpdateWaveRequest,update_wave_request +UpdateWebACLRequest,update_web_acl_request +UpdateWebACLResponse,update_web_acl_response +UpdateWebhookInput,update_webhook_input +UpdateWebhookOutput,update_webhook_output +UpdateWebhookRequest,update_webhook_request +UpdateWebhookResult,update_webhook_result +UpdateWirelessDeviceImportTaskRequest,update_wireless_device_import_task_request +UpdateWirelessDeviceRequest,update_wireless_device_request +UpdateWirelessGatewayRequest,update_wireless_gateway_request +UpdateWirelessGatewayTaskCreate,update_wireless_gateway_task_create +UpdateWirelessGatewayTaskEntry,update_wireless_gateway_task_entry +UpdateWorkGroupInput,update_work_group_input +UpdateWorkerFleetRequest,update_worker_fleet_request +UpdateWorkerFleetResponse,update_worker_fleet_response +UpdateWorkerRequest,update_worker_request +UpdateWorkerResponse,update_worker_response +UpdateWorkflowRequest,update_workflow_request +UpdateWorkflowResponse,update_workflow_response +UpdateWorkflowStepGroupRequest,update_workflow_step_group_request +UpdateWorkflowStepGroupResponse,update_workflow_step_group_response +UpdateWorkflowStepRequest,update_workflow_step_request +UpdateWorkflowStepResponse,update_workflow_step_response +UpdateWorkforceRequest,update_workforce_request +UpdateWorkforceResponse,update_workforce_response +UpdateWorkgroupRequest,update_workgroup_request +UpdateWorkgroupResponse,update_workgroup_response +UpdateWorkloadInput,update_workload_input +UpdateWorkloadOutput,update_workload_output +UpdateWorkloadRequest,update_workload_request +UpdateWorkloadResponse,update_workload_response +UpdateWorkloadShareInput,update_workload_share_input +UpdateWorkloadShareOutput,update_workload_share_output +UpdateWorkspaceAliasRequest,update_workspace_alias_request +UpdateWorkspaceAuthenticationRequest,update_workspace_authentication_request +UpdateWorkspaceAuthenticationResponse,update_workspace_authentication_response +UpdateWorkspaceBundleRequest,update_workspace_bundle_request +UpdateWorkspaceConfigurationRequest,update_workspace_configuration_request +UpdateWorkspaceImagePermissionRequest,update_workspace_image_permission_request +UpdateWorkspaceRequest,update_workspace_request +UpdateWorkspaceResponse,update_workspace_response +UpdateWorkteamRequest,update_workteam_request +UpdateWorkteamResponse,update_workteam_response +UpdateWorldTemplateRequest,update_world_template_request +UpdateWorldTemplateResponse,update_world_template_response +UpdateXMLClassifierRequest,update_xml_classifier_request +UpdateXssMatchSetRequest,update_xss_match_set_request +UpdateXssMatchSetResponse,update_xss_match_set_response +UpdateZonalShiftRequest,update_zonal_shift_request +UpdatedAt,updated_at +UpdatedBy,updated_by +UpdatedDate,updated_date +UpdatedField,updated_field +UpdatedLatestPatchVersion,updated_latest_patch_version +UpdatedReason,updated_reason +UpdatedTime,updated_time +UpdatedTimestamp,updated_timestamp +UpdatedToken,updated_token +UpdaterRequestId,updater_request_id +Updates,updates +UpdatesURI,updates_uri +UpfrontCost,upfront_cost +UpfrontPrice,upfront_price +UpgradeAppliedSchemaRequest,upgrade_applied_schema_request +UpgradeAppliedSchemaResponse,upgrade_applied_schema_response +UpgradeAvailability,upgrade_availability +UpgradeDependencyFailureFault,upgrade_dependency_failure_fault +UpgradeDomainRequest,upgrade_domain_request +UpgradeDomainResponse,upgrade_domain_response +UpgradeElasticsearchDomainRequest,upgrade_elasticsearch_domain_request +UpgradeElasticsearchDomainResponse,upgrade_elasticsearch_domain_response +UpgradeHistories,upgrade_histories +UpgradeHistory,upgrade_history +UpgradeId,upgrade_id +UpgradeLensReviewInput,upgrade_lens_review_input +UpgradeName,upgrade_name +UpgradeProcessing,upgrade_processing +UpgradeProfileVersionInput,upgrade_profile_version_input +UpgradePublishedSchemaRequest,upgrade_published_schema_request +UpgradePublishedSchemaResponse,upgrade_published_schema_response +UpgradeStatus,upgrade_status +UpgradeStep,upgrade_step +UpgradeStepItem,upgrade_step_item +UpgradeStepStatus,upgrade_step_status +UpgradeTarget,upgrade_target +UpgradedSchemaArn,upgraded_schema_arn +UplinkCount,uplink_count +UplinkEchoConfig,uplink_echo_config +UplinkGbps,uplink_gbps +UplinkSpectrumConfig,uplink_spectrum_config +Upload,upload +UploadArchiveInput,upload_archive_input +UploadAvailability,upload_availability +UploadBufferAllocatedInBytes,upload_buffer_allocated_in_bytes +UploadBufferUsedInBytes,upload_buffer_used_in_bytes +UploadConfiguration,upload_configuration +UploadCredentials,upload_credentials +UploadDate,upload_date +UploadDocumentsRequest,upload_documents_request +UploadDocumentsResponse,upload_documents_response +UploadEnd,upload_end +UploadEntityDefinitionsRequest,upload_entity_definitions_request +UploadEntityDefinitionsResponse,upload_entity_definitions_response +UploadId,upload_id +UploadIdMarker,upload_id_marker +UploadLayerPartRequest,upload_layer_part_request +UploadLayerPartResponse,upload_layer_part_response +UploadListElement,upload_list_element +UploadMetadata,upload_metadata +UploadMultipartPartInput,upload_multipart_part_input +UploadMultipartPartOutput,upload_multipart_part_output +UploadNotFoundException,upload_not_found_exception +UploadPartCopyOutput,upload_part_copy_output +UploadPartCopyRequest,upload_part_copy_request +UploadPartOutput,upload_part_output +UploadPartRequest,upload_part_request +UploadPolicy,upload_policy +UploadPolicySignature,upload_policy_signature +UploadReadSetPartRequest,upload_read_set_part_request +UploadReadSetPartResponse,upload_read_set_part_response +UploadSSHPublicKeyRequest,upload_ssh_public_key_request +UploadSSHPublicKeyResponse,upload_ssh_public_key_response +UploadServerCertificateRequest,upload_server_certificate_request +UploadServerCertificateResponse,upload_server_certificate_response +UploadSettings,upload_settings +UploadSigningCertificateRequest,upload_signing_certificate_request +UploadSigningCertificateResponse,upload_signing_certificate_response +UploadSize,upload_size +UploadSpeed,upload_speed +UploadStart,upload_start +UploadType,upload_type +UploadUrl,upload_url +UploaderConfig,uploader_config +UploaderStatus,uploader_status +Uploads,uploads +UploadsList,uploads_list +UpperBound,upper_bound +UpperBoundary,upper_boundary +Upsert,upsert +UpsertKeys,upsert_keys +UpsertRedshiftOptions,upsert_redshift_options +UpsertRedshiftTargetOptions,upsert_redshift_target_options +UpsertRowData,upsert_row_data +UpsertRowsResult,upsert_rows_result +Upsolver,upsolver +UpsolverDestinationProperties,upsolver_destination_properties +UpsolverS3OutputFormatConfig,upsolver_s3_output_format_config +UpstreamRepository,upstream_repository +UpstreamRepositoryInfo,upstream_repository_info +Uri,uri +UriEndpoint,uri_endpoint +UriPath,uri_path +UriPathRoute,uri_path_route +UriPathRouteInput,uri_path_route_input +Uris,uris +Url,url +UrlEndpoint,url_endpoint +UrlEndpointConfig,url_endpoint_config +UrlEndpointInput,url_endpoint_input +UrlEndpointSummary,url_endpoint_summary +UrlExclusionPatterns,url_exclusion_patterns +UrlExpiry,url_expiry +UrlInclusionPatterns,url_inclusion_patterns +UrlPath,url_path +UrlReference,url_reference +UrlType,url_type +Urls,urls +Usage,usage +UsageAccountResult,usage_account_result +UsageAllocation,usage_allocation +UsageAllocations,usage_allocations +UsageByAccount,usage_by_account +UsageCriteria,usage_criteria +UsageDataSourceResult,usage_data_source_result +UsageDimension,usage_dimension +UsageFeatureResult,usage_feature_result +UsageFlags,usage_flags +UsageInstruction,usage_instruction +UsageInstructions,usage_instructions +UsageLimit,usage_limit +UsageLimitAlreadyExistsFault,usage_limit_already_exists_fault +UsageLimitId,usage_limit_id +UsageLimitList,usage_limit_list +UsageLimitNotFoundFault,usage_limit_not_found_fault +UsageLimits,usage_limits +UsageMetric,usage_metric +UsageMetricBasis,usage_metric_basis +UsageMode,usage_mode +UsageOperation,usage_operation +UsageOperationUpdateTime,usage_operation_update_time +UsagePlan,usage_plan +UsagePlanKey,usage_plan_key +UsagePlanKeys,usage_plan_keys +UsagePlans,usage_plans +UsagePrice,usage_price +UsageQuantity,usage_quantity +UsageRecord,usage_record +UsageRecordResult,usage_record_result +UsageRecords,usage_records +UsageReportSubscription,usage_report_subscription +UsageReportSubscriptions,usage_report_subscriptions +UsageResourceResult,usage_resource_result +UsageStartTimestamp,usage_start_timestamp +UsageStatisticType,usage_statistic_type +UsageStatistics,usage_statistics +UsageStatisticsFilter,usage_statistics_filter +UsageStatisticsSortBy,usage_statistics_sort_by +UsageStopTimestamp,usage_stop_timestamp +UsageStrategy,usage_strategy +UsageTotal,usage_total +UsageType,usage_type +UsbDeviceFilterStrings,usb_device_filter_strings +Use2DSolver,use2_d_solver +UseAlternateFolderForOnline,use_alternate_folder_for_online +UseAmortized,use_amortized +UseAudioRenditionGroup,use_audio_rendition_group +UseAwsOwnedKey,use_aws_owned_key +UseAwsProvidedLatestImage,use_aws_provided_latest_image +UseBFile,use_b_file +UseBcpFullLoad,use_bcp_full_load +UseBlankCellFormat,use_blank_cell_format +UseBlended,use_blended +UseCase,use_case +UseCaseArn,use_case_arn +UseCaseDescription,use_case_description +UseCaseId,use_case_id +UseCaseSummaryList,use_case_summary_list +UseCaseType,use_case_type +UseChangeLog,use_change_log +UseCsvNoSupValue,use_csv_no_sup_value +UseCustomCookbooks,use_custom_cookbooks +UseDefaultIfPreferenceUnavailable,use_default_if_preference_unavailable +UseDefaultProcessorFeatures,use_default_processor_features +UseDefaults,use_defaults +UseDirectPathFullLoad,use_direct_path_full_load +UseEarliestTimeOnPointInTimeUnavailable,use_earliest_time_on_point_in_time_unavailable +UseEbsOptimizedInstances,use_ebs_optimized_instances +UseExistingClientSecret,use_existing_client_secret +UseGeolocationForTimeZone,use_geolocation_for_time_zone +UseGrouping,use_grouping +UseLakeFormationCredentials,use_lake_formation_credentials +UseLatestRestorableTime,use_latest_restorable_time +UseLegacyProvider,use_legacy_provider +UseLogit,use_logit +UseLogminerReader,use_logminer_reader +UseLongIds,use_long_ids +UseLongIdsAggregated,use_long_ids_aggregated +UseMiddleboxes,use_middleboxes +UseNewMappingType,use_new_mapping_type +UseOffPeakWindow,use_off_peak_window +UseOpsworksSecurityGroups,use_opsworks_security_groups +UseOrdering,use_ordering +UsePathPrefix,use_path_prefix +UsePreviousTemplate,use_previous_template +UsePreviousValue,use_previous_value +UsePrimaryBackgroundColor,use_primary_background_color +UseSameUsername,use_same_username +UseServiceLinkedRole,use_service_linked_role +UseStageCache,use_stage_cache +UseTaskStartTimeForFullLoadTimestamp,use_task_start_time_for_full_load_timestamp +UseThirdPartyBackupDevice,use_third_party_backup_device +UseUpdateLookUp,use_update_look_up +Used,used +UsedCommitment,used_commitment +UsedInstanceCount,used_instance_count +User,user +UserAccessLoggingSettings,user_access_logging_settings +UserAccessLoggingSettingsSummary,user_access_logging_settings_summary +UserAccessResultItem,user_access_result_item +UserAccessTaskItem,user_access_task_item +UserAccessUrl,user_access_url +UserActivities,user_activities +UserAgent,user_agent +UserAlreadyExistsFault,user_already_exists_fault +UserAndGroupQuotas,user_and_group_quotas +UserArn,user_arn +UserArnSession,user_arn_session +UserAttributeNames,user_attribute_names +UserAttributeUpdateSettings,user_attribute_update_settings +UserAttributeUpdateSettingsType,user_attribute_update_settings_type +UserAttributes,user_attributes +UserAuthConfig,user_auth_config +UserAuthConfigInfo,user_auth_config_info +UserBase,user_base +UserBucket,user_bucket +UserBucketDetails,user_bucket_details +UserByPermissionGroup,user_by_permission_group +UserCode,user_code +UserConfig,user_config +UserConfiguration,user_configuration +UserConfirmationNecessary,user_confirmation_necessary +UserConfirmed,user_confirmed +UserContext,user_context +UserContextData,user_context_data +UserContextDataType,user_context_data_type +UserContextPolicy,user_context_policy +UserCount,user_count +UserCreateDate,user_create_date +UserData,user_data +UserDataFilters,user_data_filters +UserDataList,user_data_list +UserDataShared,user_data_shared +UserDataValidationParameters,user_data_validation_parameters +UserDefined,user_defined +UserDefinedFields,user_defined_fields +UserDefinedFunction,user_defined_function +UserDefinedFunctionInput,user_defined_function_input +UserDefinedFunctions,user_defined_functions +UserDetail,user_detail +UserDetailList,user_detail_list +UserDetails,user_details +UserDoesNotExistException,user_does_not_exist_exception +UserEmail,user_email +UserEmailList,user_email_list +UserEnabledAsLocalAdministrator,user_enabled_as_local_administrator +UserError,user_error +UserErrorException,user_error_exception +UserErrors,user_errors +UserFeedback,user_feedback +UserGroup,user_group +UserGroupAlreadyExistsFault,user_group_already_exists_fault +UserGroupId,user_group_id +UserGroupIds,user_group_ids +UserGroupIdsToAdd,user_group_ids_to_add +UserGroupIdsToRemove,user_group_ids_to_remove +UserGroupNotFoundFault,user_group_not_found_fault +UserGroupPendingChanges,user_group_pending_changes +UserGroupQuotaExceededFault,user_group_quota_exceeded_fault +UserGroupResolutionConfiguration,user_group_resolution_configuration +UserGroupResolutionMode,user_group_resolution_mode +UserGroups,user_groups +UserGroupsUpdateStatus,user_groups_update_status +UserHierarchyGroupSummaryList,user_hierarchy_group_summary_list +UserHierarchyGroups,user_hierarchy_groups +UserId,user_id +UserIdGroupPair,user_id_group_pair +UserIdGroupPairs,user_id_group_pairs +UserIdList,user_id_list +UserIdentity,user_identity +UserIdentityConfiguration,user_identity_configuration +UserIdentityInfo,user_identity_info +UserIdentityInfoLite,user_identity_info_lite +UserIdentityRoot,user_identity_root +UserIds,user_ids +UserIdsToAdd,user_ids_to_add +UserIdsToRemove,user_ids_to_remove +UserImportInProgressException,user_import_in_progress_exception +UserImportJob,user_import_job +UserImportJobType,user_import_job_type +UserImportJobs,user_import_jobs +UserInfo,user_info +UserInfoEndpoint,user_info_endpoint +UserInteractionRequired,user_interaction_required +UserInvitationStatus,user_invitation_status +UserInvitationUrl,user_invitation_url +UserLambdaValidationException,user_lambda_validation_exception +UserLastModifiedDate,user_last_modified_date +UserList,user_list +UserMFASettingList,user_mfa_setting_list +UserMatch,user_match +UserMatchThreshold,user_match_threshold +UserMatches,user_matches +UserMetadata,user_metadata +UserMigration,user_migration +UserName,user_name +UserNameAttributeField,user_name_attribute_field +UserNameColumn,user_name_column +UserNames,user_names +UserNamesToAdd,user_names_to_add +UserNamesToRemove,user_names_to_remove +UserNotConfirmedException,user_not_confirmed_exception +UserNotFoundException,user_not_found_exception +UserNotFoundFault,user_not_found_fault +UserPassword,user_password +UserPausedDetails,user_paused_details +UserPendingChanges,user_pending_changes +UserPhoneConfig,user_phone_config +UserPolicyList,user_policy_list +UserPool,user_pool +UserPoolAddOnNotEnabledException,user_pool_add_on_not_enabled_exception +UserPoolAddOns,user_pool_add_ons +UserPoolAddOnsType,user_pool_add_ons_type +UserPoolArn,user_pool_arn +UserPoolClient,user_pool_client +UserPoolClientDescription,user_pool_client_description +UserPoolClientId,user_pool_client_id +UserPoolClientType,user_pool_client_type +UserPoolClients,user_pool_clients +UserPoolConfig,user_pool_config +UserPoolConfigs,user_pool_configs +UserPoolDescriptionType,user_pool_description_type +UserPoolDomain,user_pool_domain +UserPoolId,user_pool_id +UserPoolName,user_pool_name +UserPoolPolicyType,user_pool_policy_type +UserPoolTaggingException,user_pool_tagging_exception +UserPoolTags,user_pool_tags +UserPoolType,user_pool_type +UserPools,user_pools +UserProfile,user_profile +UserProfileAlreadyExistsException,user_profile_already_exists_exception +UserProfileArn,user_profile_arn +UserProfileDetails,user_profile_details +UserProfileName,user_profile_name +UserProfileNameContains,user_profile_name_contains +UserProfileNameEquals,user_profile_name_equals +UserProfileNotFoundException,user_profile_not_found_exception +UserProfileSummary,user_profile_summary +UserProfiles,user_profiles +UserProperty,user_property +UserQuickConnectConfig,user_quick_connect_config +UserQuotaExceededFault,user_quota_exceeded_fault +UserReference,user_reference +UserRegistrationStatus,user_registration_status +UserRole,user_role +UserRoleName,user_role_name +UserRules,user_rules +UserSearchCriteria,user_search_criteria +UserSearchFilter,user_search_filter +UserSearchMatching,user_search_matching +UserSearchSubtree,user_search_subtree +UserSearchSummary,user_search_summary +UserSecretId,user_secret_id +UserSetting,user_setting +UserSettings,user_settings +UserSettingsSummary,user_settings_summary +UserStackAssociation,user_stack_association +UserStackAssociationError,user_stack_association_error +UserStackAssociations,user_stack_associations +UserStatus,user_status +UserStorage,user_storage +UserStorageMetadata,user_storage_metadata +UserSub,user_sub +UserSummary,user_summary +UserSummaryList,user_summary_list +UserTags,user_tags +UserTokenConfiguration,user_token_configuration +UserTokenConfigurations,user_token_configurations +UserTrustProviderType,user_trust_provider_type +UserTurnInputSpecification,user_turn_input_specification +UserTurnIntentOutput,user_turn_intent_output +UserTurnOutputSpecification,user_turn_output_specification +UserTurnResult,user_turn_result +UserTurnSlotOutput,user_turn_slot_output +UserTurnSpecification,user_turn_specification +UserType,user_type +UserVolumeEncryptionEnabled,user_volume_encryption_enabled +UserVolumeSizeGib,user_volume_size_gib +Username,username +UsernameAttributes,username_attributes +UsernameConfiguration,username_configuration +UsernameConfigurationType,username_configuration_type +UsernameExistsException,username_exists_exception +UsernameField,username_field +UsernamePassword,username_password +UsernamePrefix,username_prefix +Usernames,usernames +Users,users +UsersPerStep,users_per_step +UtcTiming,utc_timing +UtcTimingUri,utc_timing_uri +Utilization,utilization +UtilizationByTime,utilization_by_time +UtilizationMetric,utilization_metric +UtilizationPercentage,utilization_percentage +UtilizationPercentageInUnits,utilization_percentage_in_units +UtilizationStatus,utilization_status +UtilizationsByTime,utilizations_by_time +UtilizedCIDRCount,utilized_cidr_count +UtranCid,utran_cid +UtteranceAggregationDuration,utterance_aggregation_duration +UtteranceAudioInputSpecification,utterance_audio_input_specification +UtteranceBotResponse,utterance_bot_response +UtteranceData,utterance_data +UtteranceDataSortBy,utterance_data_sort_by +UtteranceEvent,utterance_event +UtteranceId,utterance_id +UtteranceInputSpecification,utterance_input_specification +UtteranceLevelTestResultItem,utterance_level_test_result_item +UtteranceLevelTestResults,utterance_level_test_results +UtteranceList,utterance_list +UtteranceSpecification,utterance_specification +Uuid,uuid +VCPU,vcpu +VCpuCount,v_cpu_count +VCpuCountRange,v_cpu_count_range +VCpuCountRangeRequest,v_cpu_count_range_request +VCpuCountRequest,v_cpu_count_request +VCpuInfo,v_cpu_info +VOICE,voice +VPC,vpc +VPCAssociationAuthorizationNotFound,vpc_association_authorization_not_found +VPCAssociationNotFound,vpc_association_not_found +VPCConfig,vpc_config +VPCConfigResponse,vpc_config_response +VPCConnection,vpc_connection +VPCConnectionId,vpc_connection_id +VPCConnectionSummaries,vpc_connection_summaries +VPCConnectionSummary,vpc_connection_summary +VPCConnections,vpc_connections +VPCDerivedInfo,vpc_derived_info +VPCDerivedInfoStatus,vpc_derived_info_status +VPCEConfiguration,vpce_configuration +VPCEndpoint,vpc_endpoint +VPCEndpointDNSName,vpc_endpoint_dns_name +VPCId,vpc_id +VPCOptions,vpc_options +VPCRegion,vpc_region +VPCSettings,vpc_settings +VPCZoneIdentifier,vpc_zone_identifier +VPCs,vpcs +VTLDevice,vtl_device +VTLDeviceARN,vtl_device_arn +VTLDeviceARNs,vtl_device_arns +VTLDeviceProductIdentifier,vtl_device_product_identifier +VTLDeviceType,vtl_device_type +VTLDeviceVendor,vtl_device_vendor +VTLDevices,vtl_devices +Valid,valid +ValidCores,valid_cores +ValidDBInstanceModificationsMessage,valid_db_instance_modifications_message +ValidForInMinutes,valid_for_in_minutes +ValidFrom,valid_from +ValidFromDate,valid_from_date +ValidNextSteps,valid_next_steps +ValidProcessorFeatures,valid_processor_features +ValidStorageOptions,valid_storage_options +ValidThreadsPerCore,valid_threads_per_core +ValidTill,valid_till +ValidTo,valid_to +ValidToDate,valid_to_date +ValidUntil,valid_until +ValidUpgradeTarget,valid_upgrade_target +ValidUserList,valid_user_list +ValidateAssessmentReportIntegrityRequest,validate_assessment_report_integrity_request +ValidateAssessmentReportIntegrityResponse,validate_assessment_report_integrity_response +ValidateConfigurationRequest,validate_configuration_request +ValidateConfigurationSettingsMessage,validate_configuration_settings_message +ValidateE911AddressRequest,validate_e911_address_request +ValidateE911AddressResponse,validate_e911_address_response +ValidateMatchmakingRuleSetInput,validate_matchmaking_rule_set_input +ValidateMatchmakingRuleSetOutput,validate_matchmaking_rule_set_output +ValidateOnly,validate_only +ValidatePipelineDefinitionInput,validate_pipeline_definition_input +ValidatePipelineDefinitionOutput,validate_pipeline_definition_output +ValidatePipelineRequest,validate_pipeline_request +ValidatePipelineResponse,validate_pipeline_response +ValidatePolicyFinding,validate_policy_finding +ValidatePolicyRequest,validate_policy_request +ValidatePolicyResponse,validate_policy_response +ValidateResourcePolicyRequest,validate_resource_policy_request +ValidateResourcePolicyResponse,validate_resource_policy_response +ValidateSecurityProfileBehaviorsRequest,validate_security_profile_behaviors_request +ValidateSecurityProfileBehaviorsResponse,validate_security_profile_behaviors_response +ValidateSolFunctionPackageContentInput,validate_sol_function_package_content_input +ValidateSolFunctionPackageContentMetadata,validate_sol_function_package_content_metadata +ValidateSolFunctionPackageContentOutput,validate_sol_function_package_content_output +ValidateSolNetworkPackageContentInput,validate_sol_network_package_content_input +ValidateSolNetworkPackageContentMetadata,validate_sol_network_package_content_metadata +ValidateSolNetworkPackageContentOutput,validate_sol_network_package_content_output +ValidateTemplateInput,validate_template_input +ValidateTemplateOutput,validate_template_output +Validation,validation +ValidationConfiguration,validation_configuration +ValidationConfigurations,validation_configurations +ValidationData,validation_data +ValidationDataConfig,validation_data_config +ValidationDataLength,validation_data_length +ValidationDomain,validation_domain +ValidationEmails,validation_emails +ValidationError,validation_error +ValidationErrors,validation_errors +ValidationErrorsEntry,validation_errors_entry +ValidationException,validation_exception +ValidationExceptionErrorArgument,validation_exception_error_argument +ValidationExceptionField,validation_exception_field +ValidationExceptionType,validation_exception_type +ValidationFailedRecords,validation_failed_records +ValidationFailure,validation_failure +ValidationFailureReason,validation_failure_reason +ValidationFailures,validation_failures +ValidationFraction,validation_fraction +ValidationIssue,validation_issue +ValidationMessage,validation_message +ValidationMethod,validation_method +ValidationMode,validation_mode +ValidationOutput,validation_output +ValidationPendingRecords,validation_pending_records +ValidationProfiles,validation_profiles +ValidationResult,validation_result +ValidationRole,validation_role +ValidationRule,validation_rule +ValidationSettings,validation_settings +ValidationSpecification,validation_specification +ValidationState,validation_state +ValidationStateDetails,validation_state_details +ValidationStatus,validation_status +ValidationStatuses,validation_statuses +ValidationSuspendedRecords,validation_suspended_records +ValidationWarning,validation_warning +Validator,validator +ValidatorMetric,validator_metric +ValidatorTypes,validator_types +Validators,validators +Validity,validity +ValidityEndTime,validity_end_time +ValidityNotBefore,validity_not_before +ValidityPeriod,validity_period +ValidityStartTime,validity_start_time +Value,value +ValueAsString,value_as_string +ValueAsStringList,value_as_string_list +ValueAxis,value_axis +ValueCellStyle,value_cell_style +ValueDetection,value_detection +ValueDetections,value_detections +ValueForMultipleValues,value_for_multiple_values +ValueFrom,value_from +ValueHint,value_hint +ValueHolder,value_holder +ValueImportanceMap,value_importance_map +ValueInIA,value_in_ia +ValueInMilliseconds,value_in_milliseconds +ValueInStandard,value_in_standard +ValueKey,value_key +ValueLabelConfiguration,value_label_configuration +ValueLabelOptions,value_label_options +ValueList,value_list +ValueMapping,value_mapping +ValueMappings,value_mappings +ValueOptions,value_options +ValueType,value_type +ValueWhenUnset,value_when_unset +ValueWhenUnsetOption,value_when_unset_option +ValueWithServiceIds,value_with_service_ids +Values,values +ValuesMap,values_map +ValuesToAdd,values_to_add +ValuesToRemove,values_to_remove +VarCharValue,var_char_value +Variable,variable +VariableDefinition,variable_definition +VariableEntry,variable_entry +VariableImpactExplanation,variable_impact_explanation +VariableImportanceMetrics,variable_importance_metrics +VariableTags,variable_tags +VariableValue,variable_value +Variables,variables +Variant,variant +VariantImportItemDetail,variant_import_item_detail +VariantImportItemSource,variant_import_item_source +VariantImportJobItem,variant_import_job_item +VariantName,variant_name +VariantProperty,variant_property +VariantPropertyType,variant_property_type +VariantStatus,variant_status +VariantStoreItem,variant_store_item +Variation,variation +VariationConfig,variation_config +VaultARN,vault_arn +VaultAccessPolicy,vault_access_policy +VaultList,vault_list +VaultLockPolicy,vault_lock_policy +VaultName,vault_name +VaultNames,vault_names +VaultNotificationConfig,vault_notification_config +VaultState,vault_state +VaultType,vault_type +VbrQuality,vbr_quality +Vc3Class,vc3_class +Vc3Settings,vc3_settings +VcenterBasedRemoteInfo,vcenter_based_remote_info +VcenterClient,vcenter_client +VcfOptions,vcf_options +VchipAction,vchip_action +Vcpu,vcpu +VdmAttributes,vdm_attributes +VdmEnabled,vdm_enabled +VdmOptions,vdm_options +VectorConfig,vector_config +VectorCounters,vector_counters +VectorEnrichmentJobErrorDetails,vector_enrichment_job_error_details +VectorEnrichmentJobExportErrorDetails,vector_enrichment_job_export_error_details +VectorEnrichmentJobInputConfig,vector_enrichment_job_input_config +VectorEnrichmentJobS3Data,vector_enrichment_job_s3_data +VectorEnrichmentJobSummaries,vector_enrichment_job_summaries +VectorType,vector_type +Veeva,veeva +VeevaConnectorProfileCredentials,veeva_connector_profile_credentials +VeevaConnectorProfileProperties,veeva_connector_profile_properties +VeevaSourceProperties,veeva_source_properties +VehicleStatus,vehicle_status +VehicleSummary,vehicle_summary +Vendor,vendor +VendorCreatedAt,vendor_created_at +VendorGuidance,vendor_guidance +VendorId,vendor_id +VendorName,vendor_name +VendorProperties,vendor_properties +VendorSeverity,vendor_severity +VendorUpdatedAt,vendor_updated_at +Verb,verb +Verbose,verbose +VerificationAttributes,verification_attributes +VerificationException,verification_exception +VerificationFailedException,verification_failed_exception +VerificationKeyArn,verification_key_arn +VerificationKeyCheckValue,verification_key_check_value +VerificationKeyIdentifier,verification_key_identifier +VerificationMessage,verification_message +VerificationMessageTemplate,verification_message_template +VerificationMessageTemplateType,verification_message_template_type +VerificationResponse,verification_response +VerificationState,verification_state +VerificationStatus,verification_status +VerificationToken,verification_token +VerificationValue,verification_value +Verified,verified +VerifiedAccessEndpoint,verified_access_endpoint +VerifiedAccessEndpointEniOptions,verified_access_endpoint_eni_options +VerifiedAccessEndpointId,verified_access_endpoint_id +VerifiedAccessEndpointIds,verified_access_endpoint_ids +VerifiedAccessEndpointLoadBalancerOptions,verified_access_endpoint_load_balancer_options +VerifiedAccessEndpointStatus,verified_access_endpoint_status +VerifiedAccessEndpoints,verified_access_endpoints +VerifiedAccessGroup,verified_access_group +VerifiedAccessGroupArn,verified_access_group_arn +VerifiedAccessGroupId,verified_access_group_id +VerifiedAccessGroupIds,verified_access_group_ids +VerifiedAccessGroups,verified_access_groups +VerifiedAccessInstance,verified_access_instance +VerifiedAccessInstanceId,verified_access_instance_id +VerifiedAccessInstanceIds,verified_access_instance_ids +VerifiedAccessInstanceLoggingConfiguration,verified_access_instance_logging_configuration +VerifiedAccessInstances,verified_access_instances +VerifiedAccessLogCloudWatchLogsDestination,verified_access_log_cloud_watch_logs_destination +VerifiedAccessLogCloudWatchLogsDestinationOptions,verified_access_log_cloud_watch_logs_destination_options +VerifiedAccessLogDeliveryStatus,verified_access_log_delivery_status +VerifiedAccessLogKinesisDataFirehoseDestination,verified_access_log_kinesis_data_firehose_destination +VerifiedAccessLogKinesisDataFirehoseDestinationOptions,verified_access_log_kinesis_data_firehose_destination_options +VerifiedAccessLogOptions,verified_access_log_options +VerifiedAccessLogS3Destination,verified_access_log_s3_destination +VerifiedAccessLogS3DestinationOptions,verified_access_log_s3_destination_options +VerifiedAccessLogs,verified_access_logs +VerifiedAccessSseSpecificationRequest,verified_access_sse_specification_request +VerifiedAccessSseSpecificationResponse,verified_access_sse_specification_response +VerifiedAccessTrustProvider,verified_access_trust_provider +VerifiedAccessTrustProviderCondensed,verified_access_trust_provider_condensed +VerifiedAccessTrustProviderId,verified_access_trust_provider_id +VerifiedAccessTrustProviderIds,verified_access_trust_provider_ids +VerifiedAccessTrustProviders,verified_access_trust_providers +VerifiedAuthorUrl,verified_author_url +VerifiedEmailAddresses,verified_email_addresses +VerifiedForSendingStatus,verified_for_sending_status +Verify,verify +VerifyAuthChallengeResponse,verify_auth_challenge_response +VerifyAuthRequestCryptogramInput,verify_auth_request_cryptogram_input +VerifyAuthRequestCryptogramOutput,verify_auth_request_cryptogram_output +VerifyCardValidationDataInput,verify_card_validation_data_input +VerifyCardValidationDataOutput,verify_card_validation_data_output +VerifyDomainDkimRequest,verify_domain_dkim_request +VerifyDomainDkimResponse,verify_domain_dkim_response +VerifyDomainIdentityRequest,verify_domain_identity_request +VerifyDomainIdentityResponse,verify_domain_identity_response +VerifyDuration,verify_duration +VerifyEmailAddressRequest,verify_email_address_request +VerifyEmailIdentityRequest,verify_email_identity_request +VerifyMacInput,verify_mac_input +VerifyMacOutput,verify_mac_output +VerifyMacRequest,verify_mac_request +VerifyMacResponse,verify_mac_response +VerifyMode,verify_mode +VerifyOTPMessageRequest,verify_otp_message_request +VerifyOTPMessageRequestParameters,verify_otp_message_request_parameters +VerifyOTPMessageResponse,verify_otp_message_response +VerifyPinDataInput,verify_pin_data_input +VerifyPinDataOutput,verify_pin_data_output +VerifyRequest,verify_request +VerifyResponse,verify_response +VerifySMSSandboxPhoneNumberInput,verify_sms_sandbox_phone_number_input +VerifySessionResponse,verify_session_response +VerifySoftwareTokenRequest,verify_software_token_request +VerifySoftwareTokenResponse,verify_software_token_response +VerifyStatus,verify_status +VerifyTrustRequest,verify_trust_request +VerifyTrustResult,verify_trust_result +VerifyUserAttributeRequest,verify_user_attribute_request +Version,version +VersionArn,version_arn +VersionBump,version_bump +VersionConflictException,version_conflict_exception +VersionControlInfo,version_control_info +VersionCount,version_count +VersionCreatedDate,version_created_date +VersionDate,version_date +VersionDeleteError,version_delete_error +VersionDescription,version_description +VersionDifferences,version_differences +VersionId,version_id +VersionIdMarker,version_id_marker +VersionIds,version_ids +VersionIdsToStages,version_ids_to_stages +VersionInfo,version_info +VersionInformation,version_information +VersionLabel,version_label +VersionLabels,version_labels +VersionLifecycleConfig,version_lifecycle_config +VersionMismatchException,version_mismatch_exception +VersionName,version_name +VersionNames,version_names +VersionNumber,version_number +VersionStage,version_stage +VersionStages,version_stages +VersionStatus,version_status +VersionSummary,version_summary +VersionToExpire,version_to_expire +VersionToPublish,version_to_publish +VersionUpdateByJobsConfig,version_update_by_jobs_config +VersioningConfiguration,versioning_configuration +VersioningSupported,versioning_supported +Versions,versions +VersionsLimitExceededException,versions_limit_exceeded_exception +VersionsToPublish,versions_to_publish +Vertex,vertex +VerticalAccuracy,vertical_accuracy +VerticalAlign,vertical_align +VerticalLayoutConfiguration,vertical_layout_configuration +VerticalOffset,vertical_offset +VerticalOverflowVisibility,vertical_overflow_visibility +VerticalPosition,vertical_position +VerticalTextAlignment,vertical_text_alignment +Vertices,vertices +VgwTelemetry,vgw_telemetry +Video,video +VideoArtifactsConfiguration,video_artifacts_configuration +VideoAttribute,video_attribute +VideoBlackFailoverSettings,video_black_failover_settings +VideoBlackSettings,video_black_settings +VideoBlackThresholdMsec,video_black_threshold_msec +VideoCodecSettings,video_codec_settings +VideoCompositionOffsets,video_composition_offsets +VideoConcatenationConfiguration,video_concatenation_configuration +VideoConfiguration,video_configuration +VideoContentSourceUrl,video_content_source_url +VideoDescription,video_description +VideoDescriptionName,video_description_name +VideoDescriptions,video_descriptions +VideoDetail,video_detail +VideoDetails,video_details +VideoFormat,video_format +VideoGenerator,video_generator +VideoMetadata,video_metadata +VideoParameters,video_parameters +VideoPid,video_pid +VideoPreprocessor,video_preprocessor +VideoPreprocessors,video_preprocessors +VideoQuality,video_quality +VideoSelector,video_selector +VideoSelectorColorSpaceSettings,video_selector_color_space_settings +VideoSelectorPid,video_selector_pid +VideoSelectorProgramId,video_selector_program_id +VideoSelectorSettings,video_selector_settings +VideoSettings,video_settings +VideoTooLargeException,video_too_large_exception +View,view +ViewArn,view_arn +ViewArns,view_arns +ViewBillingRequest,view_billing_request +ViewBillingResponse,view_billing_response +ViewContent,view_content +ViewContentSha256,view_content_sha256 +ViewExpandedText,view_expanded_text +ViewFrame,view_frame +ViewId,view_id +ViewInputContent,view_input_content +ViewName,view_name +ViewOffNadir,view_off_nadir +ViewOffNadirInput,view_off_nadir_input +ViewOriginalText,view_original_text +ViewSummary,view_summary +ViewSunAzimuth,view_sun_azimuth +ViewSunAzimuthInput,view_sun_azimuth_input +ViewSunElevation,view_sun_elevation +ViewSunElevationInput,view_sun_elevation_input +ViewToken,view_token +ViewVersion,view_version +ViewVersionSummary,view_version_summary +ViewVersionSummaryList,view_version_summary_list +ViewerCertificate,viewer_certificate +ViewerProtocolPolicy,viewer_protocol_policy +Views,views +ViewsSummaryList,views_summary_list +ViolatedEntities,violated_entities +ViolatingRoute,violating_route +ViolatingRoutes,violating_routes +ViolatingSecurityGroups,violating_security_groups +ViolationDetail,violation_detail +ViolationEvent,violation_event +ViolationEventAdditionalInfo,violation_event_additional_info +ViolationEventOccurrenceRange,violation_event_occurrence_range +ViolationReason,violation_reason +ViolationReport,violation_report +ViolationTarget,violation_target +ViolationTargetDescription,violation_target_description +ViolatorCount,violator_count +Violators,violators +VirtualCluster,virtual_cluster +VirtualGateway,virtual_gateway +VirtualGatewayBackendDefaults,virtual_gateway_backend_defaults +VirtualGatewayClientPolicy,virtual_gateway_client_policy +VirtualGatewayClientPolicyTls,virtual_gateway_client_policy_tls +VirtualGatewayData,virtual_gateway_data +VirtualGatewayFileAccessLog,virtual_gateway_file_access_log +VirtualGatewayGrpcConnectionPool,virtual_gateway_grpc_connection_pool +VirtualGatewayHealthCheckPolicy,virtual_gateway_health_check_policy +VirtualGatewayHttp2ConnectionPool,virtual_gateway_http2_connection_pool +VirtualGatewayHttpConnectionPool,virtual_gateway_http_connection_pool +VirtualGatewayListener,virtual_gateway_listener +VirtualGatewayListenerTls,virtual_gateway_listener_tls +VirtualGatewayListenerTlsAcmCertificate,virtual_gateway_listener_tls_acm_certificate +VirtualGatewayListenerTlsFileCertificate,virtual_gateway_listener_tls_file_certificate +VirtualGatewayListenerTlsSdsCertificate,virtual_gateway_listener_tls_sds_certificate +VirtualGatewayListenerTlsValidationContext,virtual_gateway_listener_tls_validation_context +VirtualGatewayLogging,virtual_gateway_logging +VirtualGatewayPortMapping,virtual_gateway_port_mapping +VirtualGatewayRef,virtual_gateway_ref +VirtualGatewaySpec,virtual_gateway_spec +VirtualGatewayStatus,virtual_gateway_status +VirtualGatewayTlsValidationContext,virtual_gateway_tls_validation_context +VirtualGatewayTlsValidationContextAcmTrust,virtual_gateway_tls_validation_context_acm_trust +VirtualGatewayTlsValidationContextFileTrust,virtual_gateway_tls_validation_context_file_trust +VirtualGatewayTlsValidationContextSdsTrust,virtual_gateway_tls_validation_context_sds_trust +VirtualGateways,virtual_gateways +VirtualHost,virtual_host +VirtualInterface,virtual_interface +VirtualInterfaceTestHistory,virtual_interface_test_history +VirtualInterfaces,virtual_interfaces +VirtualMFADevice,virtual_mfa_device +VirtualMFADeviceName,virtual_mfa_device_name +VirtualMFADevices,virtual_mfa_devices +VirtualMachine,virtual_machine +VirtualMachineDetails,virtual_machine_details +VirtualMachines,virtual_machines +VirtualName,virtual_name +VirtualNetworkId,virtual_network_id +VirtualNodeData,virtual_node_data +VirtualNodeGrpcConnectionPool,virtual_node_grpc_connection_pool +VirtualNodeHttp2ConnectionPool,virtual_node_http2_connection_pool +VirtualNodeHttpConnectionPool,virtual_node_http_connection_pool +VirtualNodeRef,virtual_node_ref +VirtualNodeServiceProvider,virtual_node_service_provider +VirtualNodeSpec,virtual_node_spec +VirtualNodeStatus,virtual_node_status +VirtualNodeTcpConnectionPool,virtual_node_tcp_connection_pool +VirtualObject,virtual_object +VirtualRouterData,virtual_router_data +VirtualRouterListener,virtual_router_listener +VirtualRouterRef,virtual_router_ref +VirtualRouterServiceProvider,virtual_router_service_provider +VirtualRouterSpec,virtual_router_spec +VirtualRouterStatus,virtual_router_status +VirtualServiceBackend,virtual_service_backend +VirtualServiceData,virtual_service_data +VirtualServiceRef,virtual_service_ref +VirtualServiceSpec,virtual_service_spec +VirtualServiceStatus,virtual_service_status +VirtualizationType,virtualization_type +VirtualizationTypes,virtualization_types +VisaPin,visa_pin +VisaPinVerification,visa_pin_verification +VisaPinVerificationValue,visa_pin_verification_value +Visibility,visibility +VisibilityConfig,visibility_config +VisibilityState,visibility_state +VisibilityTimeout,visibility_timeout +VisibleRange,visible_range +VisibleRangeOptions,visible_range_options +VisibleToAllUsers,visible_to_all_users +VisitorId,visitor_id +Visual,visual +VisualAxisSortOption,visual_axis_sort_option +VisualCustomAction,visual_custom_action +VisualCustomActionOperation,visual_custom_action_operation +VisualId,visual_id +VisualIds,visual_ids +VisualLayoutOptions,visual_layout_options +VisualMenuOption,visual_menu_option +VisualPalette,visual_palette +VisualPublishOptions,visual_publish_options +VisualReference,visual_reference +VisualReferenceInput,visual_reference_input +VisualReferenceOutput,visual_reference_output +VisualSubtitleLabelOptions,visual_subtitle_label_options +VisualTitleLabelOptions,visual_title_label_options +Visuals,visuals +Vlan,vlan +VlanId,vlan_id +VmServer,vm_server +VmServerAddress,vm_server_address +VmwareCategory,vmware_category +VmwareTag,vmware_tag +VmwareTagDescription,vmware_tag_description +VmwareTagName,vmware_tag_name +VmwareTags,vmware_tags +VmwareToAwsTagMapping,vmware_to_aws_tag_mapping +VmwareToAwsTagMappings,vmware_to_aws_tag_mappings +Vocabularies,vocabularies +Vocabulary,vocabulary +VocabularyArn,vocabulary_arn +VocabularyFileUri,vocabulary_file_uri +VocabularyFilterFileUri,vocabulary_filter_file_uri +VocabularyFilterInfo,vocabulary_filter_info +VocabularyFilterMatch,vocabulary_filter_match +VocabularyFilterMethod,vocabulary_filter_method +VocabularyFilterName,vocabulary_filter_name +VocabularyFilterNames,vocabulary_filter_names +VocabularyFilters,vocabulary_filters +VocabularyId,vocabulary_id +VocabularyInfo,vocabulary_info +VocabularyName,vocabulary_name +VocabularyNames,vocabulary_names +VocabularyState,vocabulary_state +VocabularySummary,vocabulary_summary +VocabularySummaryList,vocabulary_summary_list +VodSource,vod_source +VodSourceName,vod_source_name +Voice,voice +VoiceAnalyticsProcessorConfiguration,voice_analytics_processor_configuration +VoiceChannelRequest,voice_channel_request +VoiceChannelResponse,voice_channel_response +VoiceConnector,voice_connector +VoiceConnectorArn,voice_connector_arn +VoiceConnectorGroup,voice_connector_group +VoiceConnectorGroupArn,voice_connector_group_arn +VoiceConnectorGroupId,voice_connector_group_id +VoiceConnectorGroups,voice_connector_groups +VoiceConnectorId,voice_connector_id +VoiceConnectorItem,voice_connector_item +VoiceConnectorItems,voice_connector_items +VoiceConnectorRegions,voice_connector_regions +VoiceConnectorSettings,voice_connector_settings +VoiceConnectors,voice_connectors +VoiceEnhancementSinkConfiguration,voice_enhancement_sink_configuration +VoiceId,voice_id +VoiceMessage,voice_message +VoiceMessageContent,voice_message_content +VoiceProfile,voice_profile +VoiceProfileArn,voice_profile_arn +VoiceProfileDomain,voice_profile_domain +VoiceProfileDomainArn,voice_profile_domain_arn +VoiceProfileDomainId,voice_profile_domain_id +VoiceProfileDomainSummary,voice_profile_domain_summary +VoiceProfileDomains,voice_profile_domains +VoiceProfileId,voice_profile_id +VoiceProfileSummary,voice_profile_summary +VoiceProfiles,voice_profiles +VoiceRecordingConfiguration,voice_recording_configuration +VoiceRecordingTrack,voice_recording_track +VoiceSettings,voice_settings +VoiceSpoofingRisk,voice_spoofing_risk +VoiceTemplate,voice_template +VoiceTemplateRequest,voice_template_request +VoiceTemplateResponse,voice_template_response +VoiceToneAnalysisStatus,voice_tone_analysis_status +VoiceToneAnalysisTask,voice_tone_analysis_task +VoiceToneAnalysisTaskId,voice_tone_analysis_task_id +VoiceToneAnalysisTaskStatus,voice_tone_analysis_task_status +VoiceprintGenerationStatus,voiceprint_generation_status +Voices,voices +VoipDeviceToken,voip_device_token +Volume,volume +VolumeARN,volume_arn +VolumeARNs,volume_arns +VolumeAppendModeEnabled,volume_append_mode_enabled +VolumeArn,volume_arn +VolumeAttachment,volume_attachment +VolumeAttachmentStatus,volume_attachment_status +VolumeConfiguration,volume_configuration +VolumeConfigurations,volume_configurations +VolumeDetail,volume_detail +VolumeDiskId,volume_disk_id +VolumeEncryptionKey,volume_encryption_key +VolumeFilter,volume_filter +VolumeFrom,volume_from +VolumeId,volume_id +VolumeIds,volume_ids +VolumeInfo,volume_info +VolumeInfos,volume_infos +VolumeKmsKeyId,volume_kms_key_id +VolumeModification,volume_modification +VolumeMount,volume_mount +VolumeMounts,volume_mounts +VolumeName,volume_name +VolumeNotFound,volume_not_found +VolumePath,volume_path +VolumeProgress,volume_progress +VolumeRecommendation,volume_recommendation +VolumeRecommendationOption,volume_recommendation_option +VolumeRecoveryPointInfo,volume_recovery_point_info +VolumeRecoveryPointInfos,volume_recovery_point_infos +VolumeRecoveryPointTime,volume_recovery_point_time +VolumeScanStatus,volume_scan_status +VolumeSize,volume_size +VolumeSizeGB,volume_size_gb +VolumeSizeInBytes,volume_size_in_bytes +VolumeSizeInGB,volume_size_in_gb +VolumeSpecification,volume_specification +VolumeStatistics,volume_statistics +VolumeStatus,volume_status +VolumeStatusAction,volume_status_action +VolumeStatusAttachmentStatus,volume_status_attachment_status +VolumeStatusDetails,volume_status_details +VolumeStatusEvent,volume_status_event +VolumeStatusInfo,volume_status_info +VolumeStatusItem,volume_status_item +VolumeStatuses,volume_statuses +VolumeThroughput,volume_throughput +VolumeType,volume_type +VolumeUsageByDatasourcePackage,volume_usage_by_datasource_package +VolumeUsageInBytes,volume_usage_in_bytes +VolumeUsageUpdateTime,volume_usage_update_time +VolumeUsageUpdatedTime,volume_usage_updated_time +VolumeUsedInBytes,volume_used_in_bytes +VolumeiSCSIAttributes,volumei_scsi_attributes +Volumes,volumes +VolumesFrom,volumes_from +VolumesModifications,volumes_modifications +VolumesPerInstance,volumes_per_instance +VorbisSettings,vorbis_settings +Vote,vote +VoteOnProposalInput,vote_on_proposal_input +VoteSummary,vote_summary +VoterMemberId,voter_member_id +VotingPolicy,voting_policy +Vp8Settings,vp8_settings +Vp9Settings,vp9_settings +Vpc,vpc +VpcArn,vpc_arn +VpcAttachment,vpc_attachment +VpcAttachments,vpc_attachments +VpcCidrBlockAssociation,vpc_cidr_block_association +VpcCidrBlockState,vpc_cidr_block_state +VpcClassicLink,vpc_classic_link +VpcConfig,vpc_config +VpcConfigInput,vpc_config_input +VpcConfigOutput,vpc_config_output +VpcConfigRequest,vpc_config_request +VpcConfigResponse,vpc_config_response +VpcConfigs,vpc_configs +VpcConfiguration,vpc_configuration +VpcConfigurationDescription,vpc_configuration_description +VpcConfigurationDescriptions,vpc_configuration_descriptions +VpcConfigurationId,vpc_configuration_id +VpcConfigurationUpdate,vpc_configuration_update +VpcConfigurationUpdates,vpc_configuration_updates +VpcConfigurations,vpc_configurations +VpcConnection,vpc_connection +VpcConnectionArn,vpc_connection_arn +VpcConnectionInfo,vpc_connection_info +VpcConnectionInfoServerless,vpc_connection_info_serverless +VpcConnectionProperties,vpc_connection_properties +VpcConnections,vpc_connections +VpcConnectivity,vpc_connectivity +VpcConnectivityClientAuthentication,vpc_connectivity_client_authentication +VpcConnectivityIam,vpc_connectivity_iam +VpcConnectivitySasl,vpc_connectivity_sasl +VpcConnectivityScram,vpc_connectivity_scram +VpcConnectivityTls,vpc_connectivity_tls +VpcConnector,vpc_connector +VpcConnectorArn,vpc_connector_arn +VpcConnectorName,vpc_connector_name +VpcConnectorRevision,vpc_connector_revision +VpcConnectors,vpc_connectors +VpcDNSTarget,vpc_dns_target +VpcDNSTargets,vpc_dns_targets +VpcDescription,vpc_description +VpcDestinationConfiguration,vpc_destination_configuration +VpcDestinationProperties,vpc_destination_properties +VpcDestinationSummary,vpc_destination_summary +VpcEndpoint,vpc_endpoint +VpcEndpointConnection,vpc_endpoint_connection +VpcEndpointConnectionId,vpc_endpoint_connection_id +VpcEndpointConnections,vpc_endpoint_connections +VpcEndpointDetail,vpc_endpoint_detail +VpcEndpointError,vpc_endpoint_error +VpcEndpointErrorDetail,vpc_endpoint_error_detail +VpcEndpointErrors,vpc_endpoint_errors +VpcEndpointFilters,vpc_endpoint_filters +VpcEndpointId,vpc_endpoint_id +VpcEndpointIds,vpc_endpoint_ids +VpcEndpointOwner,vpc_endpoint_owner +VpcEndpointPolicySupported,vpc_endpoint_policy_supported +VpcEndpointService,vpc_endpoint_service +VpcEndpointServiceName,vpc_endpoint_service_name +VpcEndpointState,vpc_endpoint_state +VpcEndpointSummary,vpc_endpoint_summary +VpcEndpointSummaryList,vpc_endpoint_summary_list +VpcEndpointType,vpc_endpoint_type +VpcEndpoints,vpc_endpoints +VpcId,vpc_id +VpcIds,vpc_ids +VpcInfoCidrBlockSetDetails,vpc_info_cidr_block_set_details +VpcInfoIpv6CidrBlockSetDetails,vpc_info_ipv6_cidr_block_set_details +VpcInfoPeeringOptionsDetails,vpc_info_peering_options_details +VpcInformation,vpc_information +VpcIngressConnection,vpc_ingress_connection +VpcIngressConnectionArn,vpc_ingress_connection_arn +VpcIngressConnectionName,vpc_ingress_connection_name +VpcIngressConnectionSummary,vpc_ingress_connection_summary +VpcIngressConnectionSummaryList,vpc_ingress_connection_summary_list +VpcInterface,vpc_interface +VpcInterfaceAttachment,vpc_interface_attachment +VpcInterfaceName,vpc_interface_name +VpcInterfaceRequest,vpc_interface_request +VpcInterfaces,vpc_interfaces +VpcIpv6CidrBlockAssociation,vpc_ipv6_cidr_block_association +VpcLink,vpc_link +VpcLinkId,vpc_link_id +VpcLinkStatus,vpc_link_status +VpcLinkStatusMessage,vpc_link_status_message +VpcLinkVersion,vpc_link_version +VpcLinks,vpc_links +VpcName,vpc_name +VpcOnly,vpc_only +VpcOptions,vpc_options +VpcOutputSettings,vpc_output_settings +VpcOutputSettingsDescription,vpc_output_settings_description +VpcOwnerId,vpc_owner_id +VpcPeeringAuthorization,vpc_peering_authorization +VpcPeeringAuthorizations,vpc_peering_authorizations +VpcPeeringConnection,vpc_peering_connection +VpcPeeringConnectionId,vpc_peering_connection_id +VpcPeeringConnectionIds,vpc_peering_connection_ids +VpcPeeringConnectionOptionsDescription,vpc_peering_connection_options_description +VpcPeeringConnectionStateReason,vpc_peering_connection_state_reason +VpcPeeringConnectionStatus,vpc_peering_connection_status +VpcPeeringConnectionVpcInfo,vpc_peering_connection_vpc_info +VpcPeeringConnections,vpc_peering_connections +VpcSecurityGroupId,vpc_security_group_id +VpcSecurityGroupIds,vpc_security_group_ids +VpcSecurityGroupMembership,vpc_security_group_membership +VpcSecurityGroupMemberships,vpc_security_group_memberships +VpcSecurityGroups,vpc_security_groups +VpcSettings,vpc_settings +VpcSubnetIds,vpc_subnet_ids +VpcSubnets,vpc_subnets +VpceId,vpce_id +Vpcs,vpcs +VpnConnection,vpn_connection +VpnConnectionArn,vpn_connection_arn +VpnConnectionDeviceSampleConfiguration,vpn_connection_device_sample_configuration +VpnConnectionDeviceType,vpn_connection_device_type +VpnConnectionDeviceTypeId,vpn_connection_device_type_id +VpnConnectionDeviceTypes,vpn_connection_device_types +VpnConnectionId,vpn_connection_id +VpnConnectionIds,vpn_connection_ids +VpnConnectionOptions,vpn_connection_options +VpnConnectionOptionsSpecification,vpn_connection_options_specification +VpnConnections,vpn_connections +VpnEcmpSupport,vpn_ecmp_support +VpnGateway,vpn_gateway +VpnGatewayId,vpn_gateway_id +VpnGatewayIds,vpn_gateway_ids +VpnGateways,vpn_gateways +VpnPort,vpn_port +VpnProtocol,vpn_protocol +VpnStaticRoute,vpn_static_route +VpnTunnelLogOptions,vpn_tunnel_log_options +VpnTunnelLogOptionsSpecification,vpn_tunnel_log_options_specification +VpnTunnelOptionsSpecification,vpn_tunnel_options_specification +VpnTunnelOutsideIpAddress,vpn_tunnel_outside_ip_address +VsamAttributes,vsam_attributes +VsamDetailAttributes,vsam_detail_attributes +Vulnerabilities,vulnerabilities +Vulnerability,vulnerability +VulnerabilityCodeVulnerabilities,vulnerability_code_vulnerabilities +VulnerabilityIdAggregation,vulnerability_id_aggregation +VulnerabilityVendor,vulnerability_vendor +VulnerablePackage,vulnerable_package +VulnerablePackages,vulnerable_packages +WAFAssociatedItemException,waf_associated_item_exception +WAFBadRequestException,waf_bad_request_exception +WAFConfigurationWarningException,waf_configuration_warning_exception +WAFDisallowedNameException,waf_disallowed_name_exception +WAFDuplicateItemException,waf_duplicate_item_exception +WAFEntityMigrationException,waf_entity_migration_exception +WAFExpiredManagedRuleGroupVersionException,waf_expired_managed_rule_group_version_exception +WAFInternalErrorException,waf_internal_error_exception +WAFInvalidOperationException,waf_invalid_operation_exception +WAFInvalidParameterException,waf_invalid_parameter_exception +WAFInvalidPermissionPolicyException,waf_invalid_permission_policy_exception +WAFInvalidRegexPatternException,waf_invalid_regex_pattern_exception +WAFInvalidResourceException,waf_invalid_resource_exception +WAFLimitsExceededException,waf_limits_exceeded_exception +WAFLogDestinationPermissionIssueException,waf_log_destination_permission_issue_exception +WAFNonEmptyEntityException,waf_non_empty_entity_exception +WAFNonexistentContainerException,waf_nonexistent_container_exception +WAFNonexistentItemException,waf_nonexistent_item_exception +WAFOptimisticLockException,waf_optimistic_lock_exception +WAFReferencedItemException,waf_referenced_item_exception +WAFServiceLinkedRoleErrorException,waf_service_linked_role_error_exception +WAFStaleDataException,waf_stale_data_exception +WAFSubscriptionNotFoundException,waf_subscription_not_found_exception +WAFTagOperationException,waf_tag_operation_exception +WAFTagOperationInternalErrorException,waf_tag_operation_internal_error_exception +WAFUnavailableEntityException,waf_unavailable_entity_exception +WAFUnsupportedAggregateKeyTypeException,waf_unsupported_aggregate_key_type_exception +WAPE,wape +WafAction,waf_action +WafExcludedRule,waf_excluded_rule +WafOverrideAction,waf_override_action +WafWebAclArn,waf_web_acl_arn +Wait,wait +WaitActivity,wait_activity +WaitAndContinueSpecification,wait_and_continue_specification +WaitFor,wait_for +WaitForQuietTime,wait_for_quiet_time +WaitIntervalInSeconds,wait_interval_in_seconds +WaitMinutes,wait_minutes +WaitPeriodMs,wait_period_ms +WaitTime,wait_time +WaitTimeSeconds,wait_time_seconds +WaitUntil,wait_until +WaitingActions,waiting_actions +WaitingOnIngestion,waiting_on_ingestion +WakeUp,wake_up +WakeWord,wake_word +Warehouse,warehouse +WarmCount,warm_count +WarmEnabled,warm_enabled +WarmNodeCount,warm_node_count +WarmPoolConfiguration,warm_pool_configuration +WarmPoolProgress,warm_pool_progress +WarmPoolSize,warm_pool_size +WarmPoolStatus,warm_pool_status +WarmPoolStatusEquals,warm_pool_status_equals +WarmStartConfig,warm_start_config +WarmStartType,warm_start_type +WarmType,warm_type +WarmupPercentage,warmup_percentage +WarmupStatus,warmup_status +WarnCode,warn_code +WarnMessage,warn_message +Warning,warning +WarningForeground,warning_foreground +WarningGroup,warning_group +WarningMessage,warning_message +Warnings,warnings +WarningsListItem,warnings_list_item +Watchlist,watchlist +WatchlistDetails,watchlist_details +WatchlistId,watchlist_id +WatchlistIds,watchlist_ids +WatchlistSummaries,watchlist_summaries +WatchlistSummary,watchlist_summary +WaterfallChartAggregatedFieldWells,waterfall_chart_aggregated_field_wells +WaterfallChartConfiguration,waterfall_chart_configuration +WaterfallChartFieldWells,waterfall_chart_field_wells +WaterfallChartOptions,waterfall_chart_options +WaterfallChartSortConfiguration,waterfall_chart_sort_configuration +WaterfallVisual,waterfall_visual +Watermarks,watermarks +WavSettings,wav_settings +Wave,wave +WaveAggregatedStatus,wave_aggregated_status +WaypointPositions,waypoint_positions +Wcdma,wcdma +WcdmaLocalId,wcdma_local_id +WcdmaNmr,wcdma_nmr +WcdmaNmrObj,wcdma_nmr_obj +WcdmaObj,wcdma_obj +Web,web +WebACL,web_acl +WebACLArn,web_acl_arn +WebACLId,web_acl_id +WebACLLockToken,web_acl_lock_token +WebACLName,web_acl_name +WebACLSummary,web_acl_summary +WebACLUpdate,web_acl_update +WebACLs,web_acls +WebAclArn,web_acl_arn +WebAclId,web_acl_id +WebClientId,web_client_id +WebCollectorGrantedRoleBasedAccess,web_collector_granted_role_based_access +WebCollectorS3Access,web_collector_s3_access +WebCrawlerConfiguration,web_crawler_configuration +WebCrawlerMode,web_crawler_mode +WebDeliveryAllowedFlag,web_delivery_allowed_flag +WebIdentityToken,web_identity_token +WebLinkFieldMappings,web_link_field_mappings +WebServerHostname,web_server_hostname +WebSocketEndpoint,web_socket_endpoint +WebToken,web_token +WebUrl,web_url +Webhook,webhook +WebhookAuthConfiguration,webhook_auth_configuration +WebhookDefinition,webhook_definition +WebhookFilter,webhook_filter +WebhookFilterRule,webhook_filter_rule +WebserverAccessMode,webserver_access_mode +WebserverLogs,webserver_logs +WebserverUrl,webserver_url +WebsiteAuthorizationProviderSummary,website_authorization_provider_summary +WebsiteAuthorizationProviders,website_authorization_providers +WebsiteCaId,website_ca_id +WebsiteCaSummary,website_ca_summary +WebsiteCertificateAuthorities,website_certificate_authorities +WebsiteConfiguration,website_configuration +WebsiteRedirectLocation,website_redirect_location +WebsiteURL,website_url +WebsiteUrl,website_url +Websocket,websocket +WebvttDestinationSettings,webvtt_destination_settings +WebvttHlsSourceSettings,webvtt_hls_source_settings +Wednesday,wednesday +WeeklyAutoScalingSchedule,weekly_auto_scaling_schedule +WeeklyMaintenanceStartTime,weekly_maintenance_start_time +WeeklyMaintenanceWindowStart,weekly_maintenance_window_start +WeeklySchedule,weekly_schedule +WeeklySetting,weekly_setting +WeeklySettings,weekly_settings +WeeklyStartTime,weekly_start_time +Weight,weight +WeightLbs,weight_lbs +WeightSort,weight_sort +WeightedCapacity,weighted_capacity +WeightedQuantileLoss,weighted_quantile_loss +WeightedQuantileLosses,weighted_quantile_losses +WeightedTarget,weighted_target +WeightedTargetGroup,weighted_target_group +WelcomeIntent,welcome_intent +West,west +WhatIfAnalyses,what_if_analyses +WhatIfAnalysisArn,what_if_analysis_arn +WhatIfAnalysisName,what_if_analysis_name +WhatIfAnalysisSummary,what_if_analysis_summary +WhatIfForecastArn,what_if_forecast_arn +WhatIfForecastArns,what_if_forecast_arns +WhatIfForecastExportArn,what_if_forecast_export_arn +WhatIfForecastExportName,what_if_forecast_export_name +WhatIfForecastExportSummary,what_if_forecast_export_summary +WhatIfForecastExports,what_if_forecast_exports +WhatIfForecastName,what_if_forecast_name +WhatIfForecastSummary,what_if_forecast_summary +WhatIfForecasts,what_if_forecasts +WhatIfPointScenario,what_if_point_scenario +WhatIfRangeScenario,what_if_range_scenario +WhitePointX,white_point_x +WhitePointY,white_point_y +Whitelist,whitelist +WhitelistCidr,whitelist_cidr +WhitelistRules,whitelist_rules +WhitelistedNames,whitelisted_names +WhoIsServer,who_is_server +WiFiAccessPoint,wi_fi_access_point +WiFiAccessPoints,wi_fi_access_points +Width,width +WidthInPx,width_in_px +WidthPixels,width_pixels +WikiFieldMappings,wiki_field_mappings +WindowEndDatetime,window_end_datetime +WindowExecutionId,window_execution_id +WindowExecutionTaskIdentities,window_execution_task_identities +WindowExecutionTaskInvocationIdentities,window_execution_task_invocation_identities +WindowExecutions,window_executions +WindowId,window_id +WindowIdentities,window_identities +WindowOptions,window_options +WindowSize,window_size +WindowStartDatetime,window_start_datetime +WindowStartTime,window_start_time +WindowSummary,window_summary +WindowTargetId,window_target_id +WindowTaskId,window_task_id +WindowsAuditLogConfiguration,windows_audit_log_configuration +WindowsAuditLogCreateConfiguration,windows_audit_log_create_configuration +WindowsConfiguration,windows_configuration +WindowsFileSystemConfiguration,windows_file_system_configuration +WindowsResponse,windows_response +WirelessConnection,wireless_connection +WirelessDeviceEventLogOption,wireless_device_event_log_option +WirelessDeviceEventTopic,wireless_device_event_topic +WirelessDeviceFrameInfo,wireless_device_frame_info +WirelessDeviceId,wireless_device_id +WirelessDeviceIdEventTopic,wireless_device_id_event_topic +WirelessDeviceImportTask,wireless_device_import_task +WirelessDeviceImportTaskList,wireless_device_import_task_list +WirelessDeviceList,wireless_device_list +WirelessDeviceLogOption,wireless_device_log_option +WirelessDeviceLogOptions,wireless_device_log_options +WirelessDeviceStatistics,wireless_device_statistics +WirelessDeviceType,wireless_device_type +WirelessDevices,wireless_devices +WirelessDevicesToAdd,wireless_devices_to_add +WirelessDevicesToRemove,wireless_devices_to_remove +WirelessGatewayEventLogOption,wireless_gateway_event_log_option +WirelessGatewayEventTopic,wireless_gateway_event_topic +WirelessGatewayId,wireless_gateway_id +WirelessGatewayIdEventTopic,wireless_gateway_id_event_topic +WirelessGatewayList,wireless_gateway_list +WirelessGatewayLogOption,wireless_gateway_log_option +WirelessGatewayLogOptions,wireless_gateway_log_options +WirelessGatewayStatistics,wireless_gateway_statistics +WirelessGatewayTaskDefinitionId,wireless_gateway_task_definition_id +WirelessGateways,wireless_gateways +WirelessGatewaysToAdd,wireless_gateways_to_add +WirelessGatewaysToRemove,wireless_gateways_to_remove +WirelessMetadata,wireless_metadata +WisdomInfo,wisdom_info +WithDecryption,with_decryption +WithEvent,with_event +WithFederation,with_federation +WithHeader,with_header +WithdrawByoipCidrRequest,withdraw_byoip_cidr_request +WithdrawByoipCidrResponse,withdraw_byoip_cidr_response +WithdrawByoipCidrResult,withdraw_byoip_cidr_result +WithoutSettings,without_settings +WordCasing,word_casing +WordCloudAggregatedFieldWells,word_cloud_aggregated_field_wells +WordCloudChartConfiguration,word_cloud_chart_configuration +WordCloudFieldWells,word_cloud_field_wells +WordCloudOptions,word_cloud_options +WordCloudSortConfiguration,word_cloud_sort_configuration +WordCloudVisual,word_cloud_visual +WordFilter,word_filter +WordOrientation,word_orientation +WordPadding,word_padding +WordScaling,word_scaling +Words,words +WorkDocsConfiguration,work_docs_configuration +WorkGroup,work_group +WorkGroupConfiguration,work_group_configuration +WorkGroupConfigurationUpdates,work_group_configuration_updates +WorkGroupName,work_group_name +WorkGroupNames,work_group_names +WorkGroupSummary,work_group_summary +WorkGroups,work_groups +WorkLogFieldMappings,work_log_field_mappings +WorkRequesterAccountId,work_requester_account_id +WorkUnitId,work_unit_id +WorkUnitIdMax,work_unit_id_max +WorkUnitIdMin,work_unit_id_min +WorkUnitRange,work_unit_range +WorkUnitRanges,work_unit_ranges +WorkUnitToken,work_unit_token +WorkUnitsExecutedCount,work_units_executed_count +WorkUnitsGeneratedCount,work_units_generated_count +WorkUnitsNotReadyYetException,work_units_not_ready_yet_exception +Worker,worker +WorkerBlock,worker_block +WorkerBlocks,worker_blocks +WorkerConfiguration,worker_configuration +WorkerConfigurationDescription,worker_configuration_description +WorkerConfigurationRevisionDescription,worker_configuration_revision_description +WorkerConfigurationRevisionSummary,worker_configuration_revision_summary +WorkerConfigurationSummary,worker_configuration_summary +WorkerFleet,worker_fleet +WorkerId,worker_id +WorkerIds,worker_ids +WorkerLogDelivery,worker_log_delivery +WorkerLogDeliveryDescription,worker_log_delivery_description +WorkerLogs,worker_logs +WorkerResourceConfig,worker_resource_config +WorkerType,worker_type +WorkerTypeSpecification,worker_type_specification +WorkerTypeSpecificationInput,worker_type_specification_input +Workflow,workflow +WorkflowAttributes,workflow_attributes +WorkflowDetail,workflow_detail +WorkflowDetails,workflow_details +WorkflowExecution,workflow_execution +WorkflowExecutionAlreadyStartedFault,workflow_execution_already_started_fault +WorkflowExecutionCancelRequestedEventAttributes,workflow_execution_cancel_requested_event_attributes +WorkflowExecutionCanceledEventAttributes,workflow_execution_canceled_event_attributes +WorkflowExecutionCompletedEventAttributes,workflow_execution_completed_event_attributes +WorkflowExecutionConfiguration,workflow_execution_configuration +WorkflowExecutionContinuedAsNewEventAttributes,workflow_execution_continued_as_new_event_attributes +WorkflowExecutionCount,workflow_execution_count +WorkflowExecutionDetail,workflow_execution_detail +WorkflowExecutionFailedEventAttributes,workflow_execution_failed_event_attributes +WorkflowExecutionFilter,workflow_execution_filter +WorkflowExecutionInfo,workflow_execution_info +WorkflowExecutionInfos,workflow_execution_infos +WorkflowExecutionMetadata,workflow_execution_metadata +WorkflowExecutionOpenCounts,workflow_execution_open_counts +WorkflowExecutionSignaledEventAttributes,workflow_execution_signaled_event_attributes +WorkflowExecutionStartedEventAttributes,workflow_execution_started_event_attributes +WorkflowExecutionTerminatedEventAttributes,workflow_execution_terminated_event_attributes +WorkflowExecutionTimedOutEventAttributes,workflow_execution_timed_out_event_attributes +WorkflowGraph,workflow_graph +WorkflowId,workflow_id +WorkflowListItem,workflow_list_item +WorkflowMetrics,workflow_metrics +WorkflowName,workflow_name +WorkflowParameter,workflow_parameter +WorkflowRun,workflow_run +WorkflowRunId,workflow_run_id +WorkflowRunProperties,workflow_run_properties +WorkflowRunStatistics,workflow_run_statistics +WorkflowState,workflow_state +WorkflowStatus,workflow_status +WorkflowStep,workflow_step +WorkflowStepAutomationConfiguration,workflow_step_automation_configuration +WorkflowStepGroupSummary,workflow_step_group_summary +WorkflowStepItem,workflow_step_item +WorkflowStepMetadata,workflow_step_metadata +WorkflowStepOutput,workflow_step_output +WorkflowStepSummary,workflow_step_summary +WorkflowToken,workflow_token +WorkflowType,workflow_type +WorkflowTypeConfiguration,workflow_type_configuration +WorkflowTypeDetail,workflow_type_detail +WorkflowTypeFilter,workflow_type_filter +WorkflowTypeInfo,workflow_type_info +WorkflowTypeInfos,workflow_type_infos +WorkflowUpdate,workflow_update +Workflows,workflows +Workforce,workforce +WorkforceArn,workforce_arn +WorkforceName,workforce_name +WorkforceVpcConfig,workforce_vpc_config +WorkforceVpcConfigRequest,workforce_vpc_config_request +WorkforceVpcConfigResponse,workforce_vpc_config_response +Workforces,workforces +Workgroup,workgroup +WorkgroupName,workgroup_name +WorkingDirectory,working_directory +WorkingStorageAllocatedInBytes,working_storage_allocated_in_bytes +WorkingStorageUsedInBytes,working_storage_used_in_bytes +Workload,workload +WorkloadArn,workload_arn +WorkloadConfiguration,workload_configuration +WorkloadDiscoveryConfig,workload_discovery_config +WorkloadId,workload_id +WorkloadList,workload_list +WorkloadName,workload_name +WorkloadNamePrefix,workload_name_prefix +WorkloadProfile,workload_profile +WorkloadRemarks,workload_remarks +WorkloadResourceDefinition,workload_resource_definition +WorkloadShare,workload_share +WorkloadShareSummaries,workload_share_summaries +WorkloadShareSummary,workload_share_summary +WorkloadSummaries,workload_summaries +WorkloadSummary,workload_summary +WorkloadType,workload_type +WorkmailAction,workmail_action +Workspace,workspace +WorkspaceAccessProperties,workspace_access_properties +WorkspaceBundle,workspace_bundle +WorkspaceConnectionStatus,workspace_connection_status +WorkspaceCreationProperties,workspace_creation_properties +WorkspaceDescription,workspace_description +WorkspaceDirectory,workspace_directory +WorkspaceId,workspace_id +WorkspaceIds,workspace_ids +WorkspaceImage,workspace_image +WorkspaceProperties,workspace_properties +WorkspaceRequest,workspace_request +WorkspaceSecurityGroupId,workspace_security_group_id +WorkspaceSettings,workspace_settings +WorkspaceState,workspace_state +WorkspaceStatus,workspace_status +WorkspaceSummary,workspace_summary +Workspaces,workspaces +WorkspacesConnectionStatus,workspaces_connection_status +WorkspacesDefaultRoleNotFoundException,workspaces_default_role_not_found_exception +WorkspacesIpGroup,workspaces_ip_group +Workteam,workteam +WorkteamArn,workteam_arn +WorkteamName,workteam_name +Workteams,workteams +WorldConfig,world_config +WorldCount,world_count +WorldExportJobSummary,world_export_job_summary +WorldFailure,world_failure +WorldGenerationJobSummary,world_generation_job_summary +WorldSummary,world_summary +Worm,worm +Wrap,wrap +WrappedKey,wrapped_key +WrappedKeyBlock,wrapped_key_block +WrappedKeyMaterialFormat,wrapped_key_material_format +WrappingAlgorithm,wrapping_algorithm +WrappingKeyAlgorithm,wrapping_key_algorithm +WrappingKeyArn,wrapping_key_arn +WrappingKeyCertificate,wrapping_key_certificate +WrappingKeyCertificateChain,wrapping_key_certificate_chain +WrappingKeyIdentifier,wrapping_key_identifier +WrappingKeySpec,wrapping_key_spec +Write,write +WriteAccessPrincipalArns,write_access_principal_arns +WriteApplicationSettingsRequest,write_application_settings_request +WriteAttributes,write_attributes +WriteBufferSize,write_buffer_size +WriteCampaignRequest,write_campaign_request +WriteCapacityUnits,write_capacity_units +WriteDashManifest,write_dash_manifest +WriteEventStream,write_event_stream +WriteGetObjectResponseRequest,write_get_object_response_request +WriteHeader,write_header +WriteHlsManifest,write_hls_manifest +WriteIOs,write_ios +WriteJourneyRequest,write_journey_request +WriteManifest,write_manifest +WriteMp4PackagingType,write_mp4_packaging_type +WriteOperation,write_operation +WriteOperations,write_operations +WriteRecordsRequest,write_records_request +WriteRecordsResponse,write_records_response +WriteRequest,write_request +WriteSegmentRequest,write_segment_request +WriteSegmentTimelineInRepresentation,write_segment_timeline_in_representation +WriteTreatmentResource,write_treatment_resource +WriterVersion,writer_version +X,x +XAttributeName,x_attribute_name +XAxis,x_axis +XAxisDisplayOptions,x_axis_display_options +XAxisLabelOptions,x_axis_label_options +XAxisLocation,x_axis_location +XMLClassifier,xml_classifier +XPosition,x_position +XRayErrorPercent,x_ray_error_percent +XRayFaultPercent,x_ray_fault_percent +XRayNodeName,x_ray_node_name +XRayNodeType,x_ray_node_type +XRayRequestAverageLatency,x_ray_request_average_latency +XRayRequestCount,x_ray_request_count +XRayThrottlePercent,x_ray_throttle_percent +XSSProtection,xss_protection +Xavc4kIntraCbgProfileSettings,xavc4k_intra_cbg_profile_settings +Xavc4kIntraVbrProfileSettings,xavc4k_intra_vbr_profile_settings +Xavc4kProfileSettings,xavc4k_profile_settings +XavcClass,xavc_class +XavcHdIntraCbgProfileSettings,xavc_hd_intra_cbg_profile_settings +XavcHdProfileSettings,xavc_hd_profile_settings +XavcProfileSettings,xavc_profile_settings +XavcSettings,xavc_settings +XksKeyAlreadyInUseException,xks_key_already_in_use_exception +XksKeyConfiguration,xks_key_configuration +XksKeyConfigurationType,xks_key_configuration_type +XksKeyId,xks_key_id +XksKeyInvalidConfigurationException,xks_key_invalid_configuration_exception +XksKeyNotFoundException,xks_key_not_found_exception +XksProxyAuthenticationCredential,xks_proxy_authentication_credential +XksProxyAuthenticationCredentialType,xks_proxy_authentication_credential_type +XksProxyConfiguration,xks_proxy_configuration +XksProxyConfigurationType,xks_proxy_configuration_type +XksProxyConnectivity,xks_proxy_connectivity +XksProxyIncorrectAuthenticationCredentialException,xks_proxy_incorrect_authentication_credential_exception +XksProxyInvalidConfigurationException,xks_proxy_invalid_configuration_exception +XksProxyInvalidResponseException,xks_proxy_invalid_response_exception +XksProxyUriEndpoint,xks_proxy_uri_endpoint +XksProxyUriEndpointInUseException,xks_proxy_uri_endpoint_in_use_exception +XksProxyUriInUseException,xks_proxy_uri_in_use_exception +XksProxyUriPath,xks_proxy_uri_path +XksProxyUriUnreachableException,xks_proxy_uri_unreachable_exception +XksProxyVpcEndpointServiceInUseException,xks_proxy_vpc_endpoint_service_in_use_exception +XksProxyVpcEndpointServiceInvalidConfigurationException,xks_proxy_vpc_endpoint_service_invalid_configuration_exception +XksProxyVpcEndpointServiceName,xks_proxy_vpc_endpoint_service_name +XksProxyVpcEndpointServiceNotFoundException,xks_proxy_vpc_endpoint_service_not_found_exception +XrayEnabled,xray_enabled +XssMatchSet,xss_match_set +XssMatchSetId,xss_match_set_id +XssMatchSetSummary,xss_match_set_summary +XssMatchSetUpdate,xss_match_set_update +XssMatchSets,xss_match_sets +XssMatchStatement,xss_match_statement +XssMatchTuple,xss_match_tuple +XssMatchTuples,xss_match_tuples +Y,y +YAttributeName,y_attribute_name +YAxis,y_axis +YAxisDisplayOptions,y_axis_display_options +YAxisLabelOptions,y_axis_label_options +YAxisLocation,y_axis_location +YPosition,y_position +YarnEndpointAddress,yarn_endpoint_address +Yaw,yaw +Years,years +YesVoteCount,yes_vote_count +Z,z +Zendesk,zendesk +ZendeskConnectorProfileCredentials,zendesk_connector_profile_credentials +ZendeskConnectorProfileProperties,zendesk_connector_profile_properties +ZendeskDestinationProperties,zendesk_destination_properties +ZendeskMetadata,zendesk_metadata +ZendeskSourceProperties,zendesk_source_properties +ZeppelinApplicationConfiguration,zeppelin_application_configuration +ZeppelinApplicationConfigurationDescription,zeppelin_application_configuration_description +ZeppelinApplicationConfigurationUpdate,zeppelin_application_configuration_update +ZeppelinMonitoringConfiguration,zeppelin_monitoring_configuration +ZeppelinMonitoringConfigurationDescription,zeppelin_monitoring_configuration_description +ZeppelinMonitoringConfigurationUpdate,zeppelin_monitoring_configuration_update +ZeppelinRemoteSparkInterpreterPort,zeppelin_remote_spark_interpreter_port +ZipCode,zip_code +ZipFile,zip_file +ZipFileContent,zip_file_content +ZipFileContentUpdate,zip_file_content_update +ZonalShift,zonal_shift +ZonalShiftInResource,zonal_shift_in_resource +ZonalShiftSummary,zonal_shift_summary +ZonalStatisticsConfigInput,zonal_statistics_config_input +Zone,zone +ZoneAwarenessConfig,zone_awareness_config +ZoneAwarenessEnabled,zone_awareness_enabled +ZoneId,zone_id +ZoneIdentity,zone_identity +ZoneIds,zone_ids +ZoneName,zone_name +ZoneNames,zone_names +ZoneS3Path,zone_s3_path +ZoneS3PathKmsKeyId,zone_s3_path_kms_key_id +ZoneStatus,zone_status +ZoneType,zone_type +ZookeeperConnectString,zookeeper_connect_string +ZookeeperConnectStringTls,zookeeper_connect_string_tls +ZookeeperId,zookeeper_id +ZookeeperNodeInfo,zookeeper_node_info +ZookeeperVersion,zookeeper_version +abandon,abandon +abilities,abilities +ableToUpdateBundle,able_to_update_bundle +abortConfig,abort_config +abortCriteriaList,abort_criteria_list +abortStatement,abort_statement +aborted,aborted +aboutText,about_text +absolutePath,absolute_path +acceleratorHealth,accelerator_health +acceleratorId,accelerator_id +acceleratorIds,accelerator_ids +acceleratorSet,accelerator_set +acceleratorType,accelerator_type +acceleratorTypeName,accelerator_type_name +acceleratorTypeOfferings,accelerator_type_offerings +acceleratorTypes,accelerator_types +accelerators,accelerators +accept,accept +acceptDate,accept_date +acceptRanges,accept_ranges +acceptedAt,accepted_at +acceptedBy,accepted_by +acceptedFileTypes,accepted_file_types +acceptedMediaTypes,accepted_media_types +acceptedQueryCount,accepted_query_count +accepteeId,acceptee_id +accepts,accepts +access,access +accessControlList,access_control_list +accessDetails,access_details +accessDirection,access_direction +accessFrom,access_from +accessKey,access_key +accessKeyId,access_key_id +accessKeys,access_keys +accessLevel,access_level +accessLog,access_log +accessLogConfig,access_log_config +accessLogSettings,access_log_settings +accessLogSubscriptionIdentifier,access_log_subscription_identifier +accessPoint,access_point +accessPointAccount,access_point_account +accessPointArn,access_point_arn +accessPointId,access_point_id +accessPointPolicy,access_point_policy +accessPoints,access_points +accessPolicy,access_policy +accessPolicyArn,access_policy_arn +accessPolicyCreationDate,access_policy_creation_date +accessPolicyDetail,access_policy_detail +accessPolicyId,access_policy_id +accessPolicyIdentity,access_policy_identity +accessPolicyLastUpdateDate,access_policy_last_update_date +accessPolicyPermission,access_policy_permission +accessPolicyResource,access_policy_resource +accessPolicySummaries,access_policy_summaries +accessPreview,access_preview +accessPreviewId,access_preview_id +accessPreviews,access_previews +accessRole,access_role +accessRules,access_rules +accessToken,access_token +accessTokenId,access_token_id +accessType,access_type +accessTypes,access_types +account,account +accountAccessType,account_access_type +accountAggregation,account_aggregation +accountAlias,account_alias +accountEnrollmentStatuses,account_enrollment_statuses +accountID,account_id +accountId,account_id +accountIdentifiers,account_identifiers +accountIds,account_ids +accountLevelBpaSync,account_level_bpa_sync +accountLevelPermissions,account_level_permissions +accountList,account_list +accountName,account_name +accountPolicies,account_policies +accountPolicy,account_policy +accountSettings,account_settings +accountSettingsDetail,account_settings_detail +accountStatus,account_status +accountType,account_type +accounts,accounts +accountsCleanup,accounts_cleanup +accountsWithProvisionedRestoreAccess,accounts_with_provisioned_restore_access +accountsWithRestoreAccess,accounts_with_restore_access +achievableRpoInSecs,achievable_rpo_in_secs +achievableRtoInSecs,achievable_rto_in_secs +acknowledgeActionConfiguration,acknowledge_action_configuration +acknowledgeActionRequests,acknowledge_action_requests +acknowledgeFlow,acknowledge_flow +acknowledgment,acknowledgment +acknowledgmentStatus,acknowledgment_status +action,action +actionArn,action_arn +actionCode,action_code +actionConfiguration,action_configuration +actionConfigurationProperties,action_configuration_properties +actionExecutionDetails,action_execution_details +actionExecutionId,action_execution_id +actionGroup,action_group +actionID,action_id +actionIDs,action_ids +actionId,action_id +actionIdentifiers,action_identifiers +actionIds,action_ids +actionName,action_name +actionOnTimeout,action_on_timeout +actionOwnerFilter,action_owner_filter +actionParams,action_params +actionPlanInstructions,action_plan_instructions +actionPlanTitle,action_plan_title +actionRevision,action_revision +actionStates,action_states +actionStatus,action_status +actionTaken,action_taken +actionType,action_type +actionTypeId,action_type_id +actionTypes,action_types +actionVersion,action_version +actions,actions +actionsDefinition,actions_definition +actionsExecuted,actions_executed +actionsExecutions,actions_executions +actionsFailed,actions_failed +actionsSkipped,actions_skipped +activateCaseSensitiveIdentifier,activate_case_sensitive_identifier +activateDeepInspection,activate_deep_inspection +activationCode,activation_code +activationExpiry,activation_expiry +activationId,activation_id +activationJobs,activation_jobs +active,active +activeAgentlessCollectors,active_agentless_collectors +activeAgents,active_agents +activeAssessmentsCount,active_assessments_count +activeConnectors,active_connectors +activeContexts,active_contexts +activeDirectory,active_directory +activeDirectoryUser,active_directory_user +activeExperimentCount,active_experiment_count +activeFromTimestamp,active_from_timestamp +activeJobId,active_job_id +activeLaunchCount,active_launch_count +activeMeCollectors,active_me_collectors +activeNames,active_names +activeServicesCount,active_services_count +activeSessionId,active_session_id +activeUntilTimestamp,active_until_timestamp +activeViolations,active_violations +activities,activities +activityArn,activity_arn +activityFailedEventDetails,activity_failed_event_details +activityId,activity_id +activityScheduleFailedEventDetails,activity_schedule_failed_event_details +activityScheduledEventDetails,activity_scheduled_event_details +activityStartedEventDetails,activity_started_event_details +activitySucceededEventDetails,activity_succeeded_event_details +activityTaskCancelRequestedEventAttributes,activity_task_cancel_requested_event_attributes +activityTaskCanceledEventAttributes,activity_task_canceled_event_attributes +activityTaskCompletedEventAttributes,activity_task_completed_event_attributes +activityTaskFailedEventAttributes,activity_task_failed_event_attributes +activityTaskScheduledEventAttributes,activity_task_scheduled_event_attributes +activityTaskStartedEventAttributes,activity_task_started_event_attributes +activityTaskTimedOutEventAttributes,activity_task_timed_out_event_attributes +activityTimedOutEventDetails,activity_timed_out_event_details +activityType,activity_type +actor,actor +actorArn,actor_arn +actualAgentPrompt,actual_agent_prompt +actualCapacity,actual_capacity +actualElicitedSlot,actual_elicited_slot +actualIncrementalBackupSizeInMegaBytes,actual_incremental_backup_size_in_mega_bytes +actualIntent,actual_intent +actualOutput,actual_output +actualReferenceId,actual_reference_id +actualValue,actual_value +add,add +addAllowedPrefixesToDirectConnectGateway,add_allowed_prefixes_to_direct_connect_gateway +addAttributes,add_attributes +addColumns,add_columns +addGroupOwner,add_group_owner +addMetrics,add_metrics +addOnRequest,add_on_request +addOnType,add_on_type +addOns,add_ons +addOrUpdateLabels,add_or_update_labels +addOrUpdateTaints,add_or_update_taints +addOrUpdateVariations,add_or_update_variations +addSecurityGroupIds,add_security_group_ids +addSubnetIds,add_subnet_ids +addThingsToThingGroupParams,add_things_to_thing_group_params +addedToServiceDateTime,added_to_service_date_time +additionalAllowedHeaders,additional_allowed_headers +additionalAttributeNames,additional_attribute_names +additionalAuthenticationProviders,additional_authentication_providers +additionalContext,additional_context +additionalData,additional_data +additionalDeploymentStatusInfo,additional_deployment_status_info +additionalEncryptionContext,additional_encryption_context +additionalExposedHeaders,additional_exposed_headers +additionalFixedProperties,additional_fixed_properties +additionalInfo,additional_info +additionalInstanceConfiguration,additional_instance_configuration +additionalMessage,additional_message +additionalMetricsToRetain,additional_metrics_to_retain +additionalMetricsToRetainV2,additional_metrics_to_retain_v2 +additionalOccurrences,additional_occurrences +additionalParameters,additional_parameters +additionalParamsForNs,additional_params_for_ns +additionalTransientProperties,additional_transient_properties +addon,addon +addonArn,addon_arn +addonName,addon_name +addonVersion,addon_version +addonVersions,addon_versions +addons,addons +address,address +addressFamily,address_family +adds,adds +adjustedCvss,adjusted_cvss +adjustments,adjustments +admin,admin +adminAccountId,admin_account_id +adminAccounts,admin_accounts +adminRoleArn,admin_role_arn +adminUserName,admin_user_name +adminUserPassword,admin_user_password +adminUsername,admin_username +administrator,administrator +administratorAccount,administrator_account +administratorAccountId,administrator_account_id +adr,adr +adsApplicationConfigurationId,ads_application_configuration_id +adsApplicationConfigurationName,ads_application_configuration_name +adsApplicationName,ads_application_name +advancedRecognitionSetting,advanced_recognition_setting +affectedAccounts,affected_accounts +affectedImages,affected_images +affectedInstances,affected_instances +afterBlob,after_blob +afterBlobId,after_blob_id +afterCommitId,after_commit_id +afterCommitSpecifier,after_commit_specifier +afterPath,after_path +afterTime,after_time +agent,agent +agentConnected,agent_connected +agentCpuCores,agent_cpu_cores +agentDetails,agent_details +agentHash,agent_hash +agentHealth,agent_health +agentHealthCode,agent_health_code +agentHealthCodes,agent_health_codes +agentHealthDetails,agent_health_details +agentHealths,agent_healths +agentId,agent_id +agentIds,agent_ids +agentLastSeenByServiceDateTime,agent_last_seen_by_service_date_time +agentNetworkInfoList,agent_network_info_list +agentOrchestrationConfig,agent_orchestration_config +agentParameters,agent_parameters +agentPreviews,agent_previews +agentProfile,agent_profile +agentPrompt,agent_prompt +agentStatus,agent_status +agentSummary,agent_summary +agentTurn,agent_turn +agentType,agent_type +agentUpdateStatus,agent_update_status +agentVersion,agent_version +agentlessCollectorSummary,agentless_collector_summary +agents,agents +agentsConfigurationStatus,agents_configuration_status +agentsInfo,agents_info +agentsTruncated,agents_truncated +aggregateColumns,aggregate_columns +aggregateField,aggregate_field +aggregateStatus,aggregate_status +aggregateTypes,aggregate_types +aggregateValue,aggregate_value +aggregatedUtterancesSummaries,aggregated_utterances_summaries +aggregatedValues,aggregated_values +aggregatedVariablesImpactExplanations,aggregated_variables_impact_explanations +aggregatedVariablesImportance,aggregated_variables_importance +aggregatedVariablesImportanceMetrics,aggregated_variables_importance_metrics +aggregationConfig,aggregation_config +aggregationDuration,aggregation_duration +aggregationField,aggregation_field +aggregationLastRefreshedDateTime,aggregation_last_refreshed_date_time +aggregationRequest,aggregation_request +aggregationType,aggregation_type +aggregationWindowEndTime,aggregation_window_end_time +aggregationWindowStartTime,aggregation_window_start_time +agreementName,agreement_name +agreements,agreements +alarm,alarm +alarmActions,alarm_actions +alarmCapabilities,alarm_capabilities +alarmConfiguration,alarm_configuration +alarmEventActions,alarm_event_actions +alarmModelArn,alarm_model_arn +alarmModelDescription,alarm_model_description +alarmModelName,alarm_model_name +alarmModelSummaries,alarm_model_summaries +alarmModelVersion,alarm_model_version +alarmModelVersionSummaries,alarm_model_version_summaries +alarmName,alarm_name +alarmNames,alarm_names +alarmNotification,alarm_notification +alarmRecommendations,alarm_recommendations +alarmRoleArn,alarm_role_arn +alarmRule,alarm_rule +alarmState,alarm_state +alarmSummaries,alarm_summaries +alarms,alarms +alertManagerDefinition,alert_manager_definition +alertTargetArn,alert_target_arn +alertTargets,alert_targets +alerts,alerts +algorithm,algorithm +algorithmArn,algorithm_arn +algorithmHyperParameterRanges,algorithm_hyper_parameter_ranges +algorithmHyperParameters,algorithm_hyper_parameters +algorithmImage,algorithm_image +algorithmSpecification,algorithm_specification +alias,alias +aliasPrefix,alias_prefix +aliases,aliases +alignment,alignment +all,all +allColumns,all_columns +allMatchesCount,all_matches_count +allMatchesSum,all_matches_sum +allRegions,all_regions +allSupported,all_supported +allocationStrategy,allocation_strategy +allowAudioInput,allow_audio_input +allowAuthorizerOverride,allow_authorizer_override +allowAutoRegistration,allow_auto_registration +allowCleartext,allow_cleartext +allowConstraintErrors,allow_constraint_errors +allowDTMFInput,allow_dtmf_input +allowDuplicates,allow_duplicates +allowExternalPrincipals,allow_external_principals +allowFleet,allow_fleet +allowImageBuilder,allow_image_builder +allowInterrupt,allow_interrupt +allowJoinsOnColumnsWithDifferentNames,allow_joins_on_columns_with_different_names +allowListIds,allow_list_ids +allowLists,allow_lists +allowMultipleValues,allow_multiple_values +allowOrganizationMemberAccount,allow_organization_member_account +allowOverwrite,allow_overwrite +allowPublicOverrides,allow_public_overrides +allowed,allowed +allowedAccounts,allowed_accounts +allowedAnalyses,allowed_analyses +allowedAnalysisProviders,allowed_analysis_providers +allowedColumns,allowed_columns +allowedHTTPMethods,allowed_http_methods +allowedInputTypes,allowed_input_types +allowedJoinOperators,allowed_join_operators +allowedOrganizations,allowed_organizations +allowedPrefixesToDirectConnectGateway,allowed_prefixes_to_direct_connect_gateway +allowedValues,allowed_values +allowlist,allowlist +allowsHostedConnections,allows_hosted_connections +allowsPublicReadAccess,allows_public_read_access +allowsPublicWriteAccess,allows_public_write_access +allowsUnencryptedObjectUploads,allows_unencrypted_object_uploads +alreadyImplemented,already_implemented +alternateKeys,alternate_keys +alternativeDomainNames,alternative_domain_names +alternativeIntents,alternative_intents +amazonAddress,amazon_address +amazonSideAsn,amazon_side_asn +ami,ami +amiDistributionConfiguration,ami_distribution_configuration +amiId,ami_id +amiLaunchIndex,ami_launch_index +amiTags,ami_tags +amiType,ami_type +amis,amis +amount,amount +amznErrorType,amzn_error_type +analysisCompleteTime,analysis_complete_time +analysisId,analysis_id +analysisMethod,analysis_method +analysisParameters,analysis_parameters +analysisResults,analysis_results +analysisRule,analysis_rule +analysisRulePolicy,analysis_rule_policy +analysisRuleType,analysis_rule_type +analysisRuleTypes,analysis_rule_types +analysisStatus,analysis_status +analysisTemplate,analysis_template +analysisTemplateArn,analysis_template_arn +analysisTemplateArns,analysis_template_arns +analysisTemplateIdentifier,analysis_template_identifier +analysisTemplateSummaries,analysis_template_summaries +analysisType,analysis_type +analyzedAt,analyzed_at +analyzedResources,analyzed_resources +analyzer,analyzer +analyzerArn,analyzer_arn +analyzerName,analyzer_name +analyzers,analyzers +anchor,anchor +and,and +androidPaths,android_paths +annotationFields,annotation_fields +annotationImportJobs,annotation_import_jobs +annotationStoreVersions,annotation_store_versions +annotationStores,annotation_stores +annotationType,annotation_type +anomalies,anomalies +anomalyInstanceId,anomaly_instance_id +answerMachineDetectionConfig,answer_machine_detection_config +antennaUplinkConfigArn,antenna_uplink_config_arn +antiPatternReportS3Object,anti_pattern_report_s3_object +antipatternReportResultList,antipattern_report_result_list +antipatternReportS3Object,antipattern_report_s3_object +antipatternReportStatus,antipattern_report_status +antipatternReportStatusMessage,antipattern_report_status_message +apacheKafkaCluster,apache_kafka_cluster +api,api +apiAccess,api_access +apiAccessPrincipalArn,api_access_principal_arn +apiAssociation,api_association +apiCache,api_cache +apiCachingBehavior,api_caching_behavior +apiCallDateTime,api_call_date_time +apiCallDetails,api_call_details +apiConfiguration,api_configuration +apiId,api_id +apiKey,api_key +apiKeyRequired,api_key_required +apiKeySource,api_key_source +apiKeyVersion,api_key_version +apiKeys,api_keys +apiMode,api_mode +apiSecretKey,api_secret_key +apiServiceName,api_service_name +apiStages,api_stages +apiSummary,api_summary +apiToken,api_token +apiType,api_type +apiVersion,api_version +app,app +appArn,app_arn +appAuthorization,app_authorization +appAuthorizationArn,app_authorization_arn +appAuthorizationIdentifier,app_authorization_identifier +appAuthorizationSummary,app_authorization_summary +appAuthorizationSummaryList,app_authorization_summary_list +appBundle,app_bundle +appBundleArn,app_bundle_arn +appBundleIdentifier,app_bundle_identifier +appBundleSummaryList,app_bundle_summary_list +appCategory,app_category +appComponent,app_component +appComponentName,app_component_name +appComponentNames,app_component_names +appComponents,app_components +appConfigResource,app_config_resource +appId,app_id +appIdClientRegex,app_id_client_regex +appIds,app_ids +appInputSource,app_input_source +appInputSources,app_input_sources +appIntegrationArn,app_integration_arn +appPackagesCleanup,app_packages_cleanup +appProtocol,app_protocol +appRegistryAppName,app_registry_app_name +appRegistryAppNames,app_registry_app_names +appSpecContent,app_spec_content +appSummaries,app_summaries +appSummary,app_summary +appTemplateBody,app_template_body +appType,app_type +appUnitError,app_unit_error +appUnitErrorCategory,app_unit_error_category +appUpload,app_upload +appValidationConfigurations,app_validation_configurations +appValidationOutput,app_validation_output +appValidationStrategy,app_validation_strategy +appVersion,app_version +appVersions,app_versions +application,application +applicationAggregatedStatus,application_aggregated_status +applicationArn,application_arn +applicationCallBackURL,application_call_back_url +applicationComponentCriteria,application_component_criteria +applicationComponentDetail,application_component_detail +applicationComponentId,application_component_id +applicationComponentInfos,application_component_infos +applicationComponentStrategies,application_component_strategies +applicationComponentStrategySummary,application_component_strategy_summary +applicationConfiguration,application_configuration +applicationConfigurationId,application_configuration_id +applicationCreationDate,application_creation_date +applicationDescription,application_description +applicationHostUrl,application_host_url +applicationID,application_id +applicationIDs,application_ids +applicationId,application_id +applicationImportFailure,application_import_failure +applicationImportSuccess,application_import_success +applicationKey,application_key +applicationLastUpdateDate,application_last_update_date +applicationMode,application_mode +applicationName,application_name +applicationNames,application_names +applicationPermissions,application_permissions +applicationPort,application_port +applicationPreferences,application_preferences +applicationServicePath,application_service_path +applicationState,application_state +applicationSummaries,application_summaries +applicationType,application_type +applicationUrl,application_url +applicationVersion,application_version +applicationVersions,application_versions +applications,applications +applicationsCount,applications_count +applicationsInfo,applications_info +appliedRulePriority,applied_rule_priority +appliedScanFilters,applied_scan_filters +appliedStatus,applied_status +appliedWeights,applied_weights +applyDuringMaintenanceWindow,apply_during_maintenance_window +applyImmediately,apply_immediately +applyMethod,apply_method +applyNormalization,apply_normalization +applyType,apply_type +approvalRule,approval_rule +approvalRuleContent,approval_rule_content +approvalRuleEventMetadata,approval_rule_event_metadata +approvalRuleId,approval_rule_id +approvalRuleName,approval_rule_name +approvalRuleOverriddenEventMetadata,approval_rule_overridden_event_metadata +approvalRuleTemplate,approval_rule_template +approvalRuleTemplateContent,approval_rule_template_content +approvalRuleTemplateDescription,approval_rule_template_description +approvalRuleTemplateId,approval_rule_template_id +approvalRuleTemplateName,approval_rule_template_name +approvalRuleTemplateNames,approval_rule_template_names +approvalRules,approval_rules +approvalRulesNotSatisfied,approval_rules_not_satisfied +approvalRulesSatisfied,approval_rules_satisfied +approvalState,approval_state +approvalStateChangedEventMetadata,approval_state_changed_event_metadata +approvalStatus,approval_status +approvals,approvals +approved,approved +approvedAt,approved_at +approximateNumberOfObjectsToProcess,approximate_number_of_objects_to_process +approximateSecondsBeforeTimedOut,approximate_seconds_before_timed_out +apps,apps +appsyncDomainName,appsync_domain_name +arch,arch +architecture,architecture +architectures,architectures +archiveDescription,archive_description +archiveId,archive_id +archiveRule,archive_rule +archiveRules,archive_rules +archiveSize,archive_size +archived,archived +args,args +arguments,arguments +arn,arn +arns,arns +arrayBaseColumnType,array_base_column_type +arrayJobId,array_job_id +arrayProperties,array_properties +artifactCredentials,artifact_credentials +artifactFileName,artifact_file_name +artifactId,artifact_id +artifactIdentifier,artifact_identifier +artifactMediaType,artifact_media_type +artifactName,artifact_name +artifactRevisions,artifact_revisions +artifactStore,artifact_store +artifactStores,artifact_stores +artifactUrl,artifact_url +artifacts,artifacts +artifactsOverride,artifacts_override +artifactsUrl,artifacts_url +asOfTimestamp,as_of_timestamp +ascendingOrder,ascending_order +asi,asi +asn,asn +asnOrg,asn_org +assertionAttributes,assertion_attributes +assessment,assessment +assessmentArn,assessment_arn +assessmentControlsCountByNoncompliantEvidence,assessment_controls_count_by_noncompliant_evidence +assessmentDescription,assessment_description +assessmentFrameworkShareRequest,assessment_framework_share_request +assessmentFrameworkShareRequests,assessment_framework_share_requests +assessmentId,assessment_id +assessmentMetadata,assessment_metadata +assessmentName,assessment_name +assessmentReport,assessment_report +assessmentReportEvidenceCount,assessment_report_evidence_count +assessmentReportId,assessment_report_id +assessmentReportSelection,assessment_report_selection +assessmentReportSelectionCount,assessment_report_selection_count +assessmentReports,assessment_reports +assessmentReportsDestination,assessment_reports_destination +assessmentRunAgents,assessment_run_agents +assessmentRunArn,assessment_run_arn +assessmentRunArns,assessment_run_arns +assessmentRunArnsTruncated,assessment_run_arns_truncated +assessmentRunCount,assessment_run_count +assessmentRunName,assessment_run_name +assessmentRuns,assessment_runs +assessmentSchedule,assessment_schedule +assessmentStatus,assessment_status +assessmentSummaries,assessment_summaries +assessmentSummary,assessment_summary +assessmentTargetArn,assessment_target_arn +assessmentTargetArns,assessment_target_arns +assessmentTargetName,assessment_target_name +assessmentTargetNamePattern,assessment_target_name_pattern +assessmentTargets,assessment_targets +assessmentTemplateArn,assessment_template_arn +assessmentTemplateArns,assessment_template_arns +assessmentTemplateName,assessment_template_name +assessmentTemplates,assessment_templates +asset,asset +assetArn,asset_arn +assetAttributes,asset_attributes +assetCompositeModelId,asset_composite_model_id +assetCompositeModels,asset_composite_models +assetContent,asset_content +assetCreationDate,asset_creation_date +assetDescription,asset_description +assetHierarchies,asset_hierarchies +assetId,asset_id +assetIds,asset_ids +assetLastUpdateDate,asset_last_update_date +assetModelArn,asset_model_arn +assetModelCompositeModelId,asset_model_composite_model_id +assetModelCompositeModels,asset_model_composite_models +assetModelCreationDate,asset_model_creation_date +assetModelDescription,asset_model_description +assetModelHierarchies,asset_model_hierarchies +assetModelId,asset_model_id +assetModelLastUpdateDate,asset_model_last_update_date +assetModelName,asset_model_name +assetModelProperties,asset_model_properties +assetModelPropertySummaries,asset_model_property_summaries +assetModelStatus,asset_model_status +assetModelSummaries,asset_model_summaries +assetName,asset_name +assetProperties,asset_properties +assetProperty,asset_property +assetPropertySummaries,asset_property_summaries +assetPropertyValue,asset_property_value +assetPropertyValueHistory,asset_property_value_history +assetRelationshipSummaries,asset_relationship_summaries +assetSHA256,asset_sha256 +assetSizeBytes,asset_size_bytes +assetStatus,asset_status +assetSummaries,asset_summaries +assetType,asset_type +assets,assets +assignPublicIp,assign_public_ip +assignedLabel,assigned_label +assignedValue,assigned_value +assistant,assistant +assistantArn,assistant_arn +assistantAssociation,assistant_association +assistantAssociationArn,assistant_association_arn +assistantAssociationId,assistant_association_id +assistantAssociationSummaries,assistant_association_summaries +assistantId,assistant_id +assistantSummaries,assistant_summaries +associateDefaultSecurityGroup,associate_default_security_group +associatePublicIpAddress,associate_public_ip_address +associatedApplications,associated_applications +associatedAt,associated_at +associatedClientDevices,associated_client_devices +associatedEntity,associated_entity +associatedFields,associated_fields +associatedGateway,associated_gateway +associatedGatewayId,associated_gateway_id +associatedGatewayOwnerAccount,associated_gateway_owner_account +associatedIntentName,associated_intent_name +associatedOn,associated_on +associatedPortalArns,associated_portal_arns +associatedRepositoryNames,associated_repository_names +associatedResourceCount,associated_resource_count +associatedResources,associated_resources +associatedS3Resources,associated_s3_resources +associatedServerId,associated_server_id +associatedServerIds,associated_server_ids +associatedSlotName,associated_slot_name +associatedTranscripts,associated_transcripts +associatedTranscriptsPassword,associated_transcripts_password +associatedTranscriptsUrl,associated_transcripts_url +associatedWithJob,associated_with_job +association,association +associationArn,association_arn +associationBehavior,association_behavior +associationData,association_data +associationId,association_id +associationState,association_state +associationStatus,association_status +associationTime,association_time +associationTimestamp,association_timestamp +associationType,association_type +assumedRole,assumed_role +atBlockchainInstant,at_blockchain_instant +atRestEncryptionEnabled,at_rest_encryption_enabled +ati,ati +atigData,atig_data +atodr,atodr +attachTime,attach_time +attachedDiskMapping,attached_disk_mapping +attachedObjectIdentifier,attached_object_identifier +attachedResource,attached_resource +attachedTo,attached_to +attachment,attachment +attachmentArn,attachment_arn +attachmentId,attachment_id +attachmentLinkUrl,attachment_link_url +attachmentNetworkAclConfiguration,attachment_network_acl_configuration +attachmentSet,attachment_set +attachmentSetId,attachment_set_id +attachmentState,attachment_state +attachmentType,attachment_type +attachments,attachments +attachmentsStatus,attachments_status +attemptDurationSeconds,attempt_duration_seconds +attemptId,attempt_id +attempts,attempts +attribute,attribute +attributeGroup,attribute_group +attributeGroupArn,attribute_group_arn +attributeGroups,attribute_groups +attributeGroupsDetails,attribute_groups_details +attributeKeys,attribute_keys +attributeMap,attribute_map +attributeMatchingModel,attribute_matching_model +attributeName,attribute_name +attributePartition,attribute_partition +attributePayload,attribute_payload +attributeResults,attribute_results +attributeUpdateMode,attribute_update_mode +attributeValue,attribute_value +attributes,attributes +auc,auc +audio,audio +audioAndDTMFInputSpecification,audio_and_dtmf_input_specification +audioChunk,audio_chunk +audioFileS3Location,audio_file_s3_location +audioInput,audio_input +audioLogSettings,audio_log_settings +audioRecognitionStrategy,audio_recognition_strategy +audioSpecification,audio_specification +audioStream,audio_stream +audioVoiceDurationMillis,audio_voice_duration_millis +auditCheckConfigurations,audit_check_configurations +auditCheckToActionsMapping,audit_check_to_actions_mapping +auditCheckToReasonCodeFilter,audit_check_to_reason_code_filter +auditDetails,audit_details +auditEvents,audit_events +auditNotificationTargetConfigurations,audit_notification_target_configurations +auditResults,audit_results +auditTaskId,audit_task_id +auth,auth +authCode,auth_code +authCodeUrl,auth_code_url +authCodeUrls,auth_code_urls +authDecision,auth_decision +authDefinition,auth_definition +authInfo,auth_info +authInfos,auth_infos +authKey,auth_key +authParameters,auth_parameters +authRequest,auth_request +authResults,auth_results +authTTL,auth_ttl +authType,auth_type +authUrl,auth_url +authentication,authentication +authenticationConfig,authentication_config +authenticationConfiguration,authentication_configuration +authenticationMethod,authentication_method +authenticationProviders,authentication_providers +authenticationType,authentication_type +author,author +authorArn,author_arn +authorName,author_name +authorization,authorization +authorizationApiKeyName,authorization_api_key_name +authorizationApiKeyValue,authorization_api_key_value +authorizationConfig,authorization_config +authorizationData,authorization_data +authorizationEndpoint,authorization_endpoint +authorizationScopes,authorization_scopes +authorizationToken,authorization_token +authorizationType,authorization_type +authorized,authorized +authorizerArn,authorizer_arn +authorizerConfig,authorizer_config +authorizerCredentials,authorizer_credentials +authorizerDescription,authorizer_description +authorizerFunctionArn,authorizer_function_arn +authorizerId,authorizer_id +authorizerName,authorizer_name +authorizerResultTtlInSeconds,authorizer_result_ttl_in_seconds +authorizerUri,authorizer_uri +authorizers,authorizers +autoBranchCreationConfig,auto_branch_creation_config +autoBranchCreationPatterns,auto_branch_creation_patterns +autoCompute,auto_compute +autoEnable,auto_enable +autoEnableNewAccount,auto_enable_new_account +autoGenerateForms,auto_generate_forms +autoLaunch,auto_launch +autoMLConfig,auto_ml_config +autoMLResult,auto_ml_result +autoMountStatus,auto_mount_status +autoMounting,auto_mounting +autoRegistrationStatus,auto_registration_status +autoReplicateNewDisks,auto_replicate_new_disks +autoResolve,auto_resolve +autoRollbackConfiguration,auto_rollback_configuration +autoRollbackEnabled,auto_rollback_enabled +autoScaling,auto_scaling +autoScalingConfiguration,auto_scaling_configuration +autoScalingGroup,auto_scaling_group +autoScalingGroupArn,auto_scaling_group_arn +autoScalingGroupArns,auto_scaling_group_arns +autoScalingGroupName,auto_scaling_group_name +autoScalingGroupProvider,auto_scaling_group_provider +autoScalingGroupRecommendations,auto_scaling_group_recommendations +autoScalingGroups,auto_scaling_groups +autoScalingMetric,auto_scaling_metric +autoSnapshotAddOnRequest,auto_snapshot_add_on_request +autoSnapshots,auto_snapshots +autoStartConfiguration,auto_start_configuration +autoStopConfiguration,auto_stop_configuration +autoSubDomainCreationPatterns,auto_sub_domain_creation_patterns +autoSubDomainIAMRole,auto_sub_domain_iam_role +autoUpdate,auto_update +autoUpdateOutdatedInstancesDeploymentIds,auto_update_outdated_instances_deployment_ids +autoUpdateOutdatedInstancesRootDeploymentId,auto_update_outdated_instances_root_deployment_id +automatedDiscoveryFreeTrialStartDate,automated_discovery_free_trial_start_date +automaticRenewal,automatic_renewal +automaticStopTimeMinutes,automatic_stop_time_minutes +automaticTerminationMode,automatic_termination_mode +automationExecutions,automation_executions +autoprovision,autoprovision +autotrack,autotrack +auxiliaryApps,auxiliary_apps +availability,availability +availabilityZone,availability_zone +availabilityZoneId,availability_zone_id +availabilityZoneIds,availability_zone_ids +availabilityZones,availability_zones +available,available +availableMacSecPortSpeeds,available_mac_sec_port_speeds +availablePlatforms,available_platforms +availablePortSpeeds,available_port_speeds +availableProviders,available_providers +avcLevel,avc_level +avcProfile,avc_profile +average,average +awayFrom,away_from +awsAccount,aws_account +awsAccountId,aws_account_id +awsAccountIds,aws_account_ids +awsAccountName,aws_account_name +awsAccountNumber,aws_account_number +awsAccounts,aws_accounts +awsDevice,aws_device +awsDeviceV2,aws_device_v2 +awsEc2Instance,aws_ec2_instance +awsEcrContainerImage,aws_ecr_container_image +awsGroundStationAgentEndpoint,aws_ground_station_agent_endpoint +awsIamConfig,aws_iam_config +awsInstanceID,aws_instance_id +awsIotJobArn,aws_iot_job_arn +awsIotJobId,aws_iot_job_id +awsIotSqlVersion,aws_iot_sql_version +awsJobAbortConfig,aws_job_abort_config +awsJobExecutionsRolloutConfig,aws_job_executions_rollout_config +awsJobPresignedUrlConfig,aws_job_presigned_url_config +awsJobTimeoutConfig,aws_job_timeout_config +awsLambdaFunction,aws_lambda_function +awsLogicalDeviceId,aws_logical_device_id +awsOrganization,aws_organization +awsRegion,aws_region +awsSecretStoreArn,aws_secret_store_arn +awsService,aws_service +awsServices,aws_services +awsSignerJobId,aws_signer_job_id +awsSso,aws_sso +awsvpcConfiguration,awsvpc_configuration +azMode,az_mode +backendDefaults,backend_defaults +backendEnvironment,backend_environment +backendEnvironmentArn,backend_environment_arn +backendEnvironments,backend_environments +backends,backends +backfillStatus,backfill_status +backloggedStorageBytes,backlogged_storage_bytes +backupId,backup_id +backupMode,backup_mode +backupProgressInMegaBytes,backup_progress_in_mega_bytes +backupRetentionEnabled,backup_retention_enabled +badge,badge +badgeEnabled,badge_enabled +badgeRequestUrl,badge_request_url +balance,balance +bandwidth,bandwidth +bandwidthAllocation,bandwidth_allocation +bandwidthThrottling,bandwidth_throttling +base,base +baseCapacity,base_capacity +baseCommitId,base_commit_id +baseConfigurationItems,base_configuration_items +baseEjectionDuration,base_ejection_duration +baseModelArn,base_model_arn +baseModelArnEquals,base_model_arn_equals +baseModelIdentifier,base_model_identifier +baseModelName,base_model_name +basePath,base_path +baseProcessingInstanceType,base_processing_instance_type +baseProcessingInstanceVolumeSizeInGB,base_processing_instance_volume_size_in_gb +baseProcessingJob,base_processing_job +baseRatePerMinute,base_rate_per_minute +baseScore,base_score +baseStat,base_stat +baseTableTTL,base_table_ttl +basic,basic +basicAuthCredentials,basic_auth_credentials +batch,batch +batchDeleteDetectorErrorEntries,batch_delete_detector_error_entries +batchImports,batch_imports +batchInferenceJob,batch_inference_job +batchInferenceJobArn,batch_inference_job_arn +batchInferenceJobConfig,batch_inference_job_config +batchInferenceJobs,batch_inference_jobs +batchItemId,batch_item_id +batchJobDefinitions,batch_job_definitions +batchJobExecutions,batch_job_executions +batchJobIdentifier,batch_job_identifier +batchMode,batch_mode +batchPolicy,batch_policy +batchPredictions,batch_predictions +batchPutMessageErrorEntries,batch_put_message_error_entries +batchReportMode,batch_report_mode +batchSegmentJob,batch_segment_job +batchSegmentJobArn,batch_segment_job_arn +batchSegmentJobs,batch_segment_jobs +batchSize,batch_size +batchUpdateDetectorErrorEntries,batch_update_detector_error_entries +beforeBlob,before_blob +beforeBlobId,before_blob_id +beforeCommitId,before_commit_id +beforeCommitSpecifier,before_commit_specifier +beforePath,before_path +beforeTime,before_time +begin,begin +beginDate,begin_date +beginInclusive,begin_inclusive +beginOffsetInclusive,begin_offset_inclusive +behavior,behavior +behaviorCriteriaType,behavior_criteria_type +behaviorName,behavior_name +behaviors,behaviors +behindMajor,behind_major +behindMinor,behind_minor +belongsToFieldOnRelatedModel,belongs_to_field_on_related_model +bestRecipeArn,best_recipe_arn +bgpPeerId,bgp_peer_id +bgpPeerState,bgp_peer_state +bgpPeers,bgp_peers +bgpStatus,bgp_status +bidPercentage,bid_percentage +billableDuration,billable_duration +billableEntityCount,billable_entity_count +billedDurationInMilliseconds,billed_duration_in_milliseconds +billedMemoryUsedInMB,billed_memory_used_in_mb +billedResourceUtilization,billed_resource_utilization +billingDetails,billing_details +billingGroupArn,billing_group_arn +billingGroupDescription,billing_group_description +billingGroupId,billing_group_id +billingGroupMetadata,billing_group_metadata +billingGroupName,billing_group_name +billingGroupProperties,billing_group_properties +billingGroups,billing_groups +billingMethod,billing_method +billingMinutes,billing_minutes +binBy,bin_by +binKeys,bin_keys +binaryMediaTypes,binary_media_types +bindIP,bind_ip +bindingEvent,binding_event +bindingProperties,binding_properties +bindings,bindings +bitMaskLength,bit_mask_length +bitRightShift,bit_right_shift +blackListedAgents,black_listed_agents +blackListedConnectors,black_listed_connectors +blobId,blob_id +blockDeviceMappings,block_device_mappings +blockHash,block_hash +blockNumber,block_number +blockPublicAccess,block_public_access +blockPublicAcls,block_public_acls +blockPublicPolicy,block_public_policy +blockers,blockers +blocklist,blocklist +blocksize,blocksize +blueGreenDeploymentConfiguration,blue_green_deployment_configuration +blueprintId,blueprint_id +blueprintName,blueprint_name +blueprints,blueprints +bluetooth,bluetooth +body,body +booleanValue,boolean_value +bootMode,boot_mode +bootstrapServers,bootstrap_servers +botAlias,bot_alias +botAliasHistoryEvents,bot_alias_history_events +botAliasId,bot_alias_id +botAliasLocaleSettings,bot_alias_locale_settings +botAliasName,bot_alias_name +botAliasStatus,bot_alias_status +botAliasSummaries,bot_alias_summaries +botAliasTarget,bot_alias_target +botChannelAssociations,bot_channel_associations +botConfiguration,bot_configuration +botExportSpecification,bot_export_specification +botId,bot_id +botImportSpecification,bot_import_specification +botLocaleExportPassword,bot_locale_export_password +botLocaleExportSpecification,bot_locale_export_specification +botLocaleExportUrl,bot_locale_export_url +botLocaleHistoryEvents,bot_locale_history_events +botLocaleImportSpecification,bot_locale_import_specification +botLocaleStatus,bot_locale_status +botLocaleSummaries,bot_locale_summaries +botMemberAliasId,bot_member_alias_id +botMemberAliasName,bot_member_alias_name +botMemberId,bot_member_id +botMemberName,bot_member_name +botMemberVersion,bot_member_version +botMembers,bot_members +botName,bot_name +botRecommendationId,bot_recommendation_id +botRecommendationResults,bot_recommendation_results +botRecommendationStatus,bot_recommendation_status +botRecommendationSummaries,bot_recommendation_summaries +botResponseAudioVoiceId,bot_response_audio_voice_id +botResponses,bot_responses +botStatus,bot_status +botSummaries,bot_summaries +botTags,bot_tags +botType,bot_type +botVersion,bot_version +botVersionLocaleSpecification,bot_version_locale_specification +botVersionSummaries,bot_version_summaries +botVersions,bot_versions +bots,bots +bpaImpactsLightsail,bpa_impacts_lightsail +branch,branch +branchArn,branch_arn +branchCoveragePercentage,branch_coverage_percentage +branchFilter,branch_filter +branchName,branch_name +branches,branches +branchesCovered,branches_covered +branchesMissed,branches_missed +breachAction,breach_action +breakingChanges,breaking_changes +browserPolicy,browser_policy +browserSettings,browser_settings +browserSettingsArn,browser_settings_arn +browserType,browser_type +bucket,bucket +bucketAclGrants,bucket_acl_grants +bucketArn,bucket_arn +bucketCount,bucket_count +bucketCountByEffectivePermission,bucket_count_by_effective_permission +bucketCountByEncryptionType,bucket_count_by_encryption_type +bucketCountByObjectEncryptionRequirement,bucket_count_by_object_encryption_requirement +bucketCountBySharedAccessType,bucket_count_by_shared_access_type +bucketCreatedAt,bucket_created_at +bucketCriteria,bucket_criteria +bucketDefinitions,bucket_definitions +bucketKey,bucket_key +bucketLevelPermissions,bucket_level_permissions +bucketName,bucket_name +bucketNames,bucket_names +bucketOwner,bucket_owner +bucketOwnerAccess,bucket_owner_access +bucketPolicy,bucket_policy +bucketPrefix,bucket_prefix +bucketPublicAccessBlock,bucket_public_access_block +bucketStatisticsBySensitivity,bucket_statistics_by_sensitivity +buckets,buckets +bucketsAggregationType,buckets_aggregation_type +build,build +buildBatch,build_batch +buildBatchArn,build_batch_arn +buildBatchConfig,build_batch_config +buildBatchConfigOverride,build_batch_config_override +buildBatchNumber,build_batch_number +buildBatchStatus,build_batch_status +buildBatches,build_batches +buildBatchesNotFound,build_batches_not_found +buildComplete,build_complete +buildGroups,build_groups +buildNumber,build_number +buildSpec,build_spec +buildStatus,build_status +buildStatusConfig,build_status_config +buildStatusConfigOverride,build_status_config_override +buildTimeoutInMinutes,build_timeout_in_minutes +buildTimeoutInMinutesOverride,build_timeout_in_minutes_override +buildType,build_type +builds,builds +buildsDeleted,builds_deleted +buildsNotDeleted,builds_not_deleted +buildsNotFound,builds_not_found +buildspec,buildspec +buildspecOverride,buildspec_override +builtInIntentSummaries,built_in_intent_summaries +builtInSlotTypeSummaries,built_in_slot_type_summaries +bundleId,bundle_id +bundleInformation,bundle_information +bundleList,bundle_list +bundleNames,bundle_names +bundleType,bundle_type +bundles,bundles +burstLimit,burst_limit +businessGoals,business_goals +businessUnitId,business_unit_id +buttons,buttons +byCustomizationType,by_customization_type +byInferenceType,by_inference_type +byName,by_name +byOutputModality,by_output_modality +byProvider,by_provider +byteBuffer,byte_buffer +byteLength,byte_length +bytes,bytes +bytesProcessed,bytes_processed +bytesReceived,bytes_received +bytesScanned,bytes_scanned +bytesSent,bytes_sent +bytesWritten,bytes_written +caCertificate,ca_certificate +caCertificateId,ca_certificate_id +caCertificateIdentifier,ca_certificate_identifier +caCertificatePem,ca_certificate_pem +cache,cache +cacheAtStartup,cache_at_startup +cacheBehaviorSettings,cache_behavior_settings +cacheBehaviors,cache_behaviors +cacheClusterEnabled,cache_cluster_enabled +cacheClusterSize,cache_cluster_size +cacheClusterStatus,cache_cluster_status +cacheConfigurations,cache_configurations +cacheDataEncrypted,cache_data_encrypted +cacheKeyParameters,cache_key_parameters +cacheNamespace,cache_namespace +cacheOverride,cache_override +cacheStorageConfigurations,cache_storage_configurations +cacheTtlInSeconds,cache_ttl_in_seconds +cacheType,cache_type +cachedHTTPMethods,cached_http_methods +cachingConfig,caching_config +cachingEnabled,caching_enabled +cachingKeys,caching_keys +cak,cak +callbackOverrides,callback_overrides +callerReactions,caller_reactions +campaign,campaign +campaignArn,campaign_arn +campaignConfig,campaign_config +campaignId,campaign_id +campaignIds,campaign_ids +campaignName,campaign_name +campaignSummaries,campaign_summaries +campaignSummaryList,campaign_summary_list +campaigns,campaigns +canDbcFiles,can_dbc_files +canInterface,can_interface +canRetry,can_retry +canSignal,can_signal +canUnlinkAssociatedModel,can_unlink_associated_model +canUpdateImage,can_update_image +canUseAsDestination,can_use_as_destination +canUseAsSource,can_use_as_source +canaryInterval,canary_interval +canaryPercentage,canary_percentage +canarySettings,canary_settings +cancel,cancel +cancelActive,cancel_active +cancelRequested,cancel_requested +cancelTimerDecisionAttributes,cancel_timer_decision_attributes +cancelTimerFailedEventAttributes,cancel_timer_failed_event_attributes +cancelWorkflowExecutionDecisionAttributes,cancel_workflow_execution_decision_attributes +cancelWorkflowExecutionFailedEventAttributes,cancel_workflow_execution_failed_event_attributes +canceled,canceled +canceledChecks,canceled_checks +canceledFindingsCount,canceled_findings_count +cancellationStatus,cancellation_status +cancelled,cancelled +cannedAcl,canned_acl +capabilities,capabilities +capabilityArn,capability_arn +capabilityArns,capability_arns +capabilityConfiguration,capability_configuration +capabilityList,capability_list +capabilityNamespace,capability_namespace +capabilitySyncStatus,capability_sync_status +capacity,capacity +capacityConfiguration,capacity_configuration +capacityId,capacity_id +capacityLimits,capacity_limits +capacityProvider,capacity_provider +capacityProviderArn,capacity_provider_arn +capacityProviderName,capacity_provider_name +capacityProviderStrategy,capacity_provider_strategy +capacityProviders,capacity_providers +capacitySpecification,capacity_specification +capacitySpecificationOverride,capacity_specification_override +capacityType,capacity_type +captureConditional,capture_conditional +captureNextStep,capture_next_step +captureResponse,capture_response +cardinality,cardinality +carrier,carrier +caseArn,case_arn +caseData,case_data +caseId,case_id +caseIdList,case_id_list +caseSensitive,case_sensitive +cases,cases +catalogData,catalog_data +catalogType,catalog_type +categoricalHyperParameterRanges,categorical_hyper_parameter_ranges +categories,categories +categoriesWithMostFindings,categories_with_most_findings +category,category +categoryCode,category_code +categoryName,category_name +categorySpecificSummary,category_specific_summary +cause,cause +causedBy,caused_by +causedByEventId,caused_by_event_id +ccEmailAddresses,cc_email_addresses +cellReference,cell_reference +cells,cells +cellsToCreate,cells_to_create +cellsToUpdate,cells_to_update +centerFrequency,center_frequency +certKey,cert_key +certificate,certificate +certificateAlternativeNames,certificate_alternative_names +certificateArn,certificate_arn +certificateAuthority,certificate_authority +certificateAuthorityArn,certificate_authority_arn +certificateAuthorityArns,certificate_authority_arns +certificateBody,certificate_body +certificateChain,certificate_chain +certificateData,certificate_data +certificateDescription,certificate_description +certificateDetail,certificate_detail +certificateDomainName,certificate_domain_name +certificateHashes,certificate_hashes +certificateId,certificate_id +certificateList,certificate_list +certificateMode,certificate_mode +certificateName,certificate_name +certificateOverride,certificate_override +certificatePathOnDevice,certificate_path_on_device +certificatePem,certificate_pem +certificatePrivateKey,certificate_private_key +certificateSigningRequest,certificate_signing_request +certificateStatuses,certificate_statuses +certificateUploadDate,certificate_upload_date +certificateVerificationDNSRecord,certificate_verification_dns_record +certificates,certificates +certificatesToAdd,certificates_to_add +certificatesToDelete,certificates_to_delete +cfnStackName,cfn_stack_name +change,change +changeDescription,change_description +changeIdentifier,change_identifier +changeLogs,change_logs +changeRequests,change_requests +changeType,change_type +changesetArn,changeset_arn +changesetFormat,changeset_format +changesetId,changeset_id +changesets,changesets +channel,channel +channelArn,channel_arn +channelId,channel_id +channelMessages,channel_messages +channelName,channel_name +channelRoleArn,channel_role_arn +channelStorage,channel_storage +channelSummaries,channel_summaries +channels,channels +chatChannel,chat_channel +checkCompliant,check_compliant +checkId,check_id +checkIds,check_ids +checkName,check_name +checkRunStatus,check_run_status +checkpointConfig,checkpoint_config +checkpointLabel,checkpoint_label +checkpointLabelFilter,checkpoint_label_filter +checks,checks +checksum,checksum +childAssetId,child_asset_id +childAssetModelId,child_asset_model_id +childConnectionTags,child_connection_tags +childDirected,child_directed +childPolicy,child_policy +childWorkflowExecutionCanceledEventAttributes,child_workflow_execution_canceled_event_attributes +childWorkflowExecutionCompletedEventAttributes,child_workflow_execution_completed_event_attributes +childWorkflowExecutionFailedEventAttributes,child_workflow_execution_failed_event_attributes +childWorkflowExecutionStartedEventAttributes,child_workflow_execution_started_event_attributes +childWorkflowExecutionTerminatedEventAttributes,child_workflow_execution_terminated_event_attributes +childWorkflowExecutionTimedOutEventAttributes,child_workflow_execution_timed_out_event_attributes +children,children +chop,chop +chronologicalOrder,chronological_order +cidr,cidr +cidrBlock,cidr_block +cidrListAliases,cidr_list_aliases +cidrs,cidrs +ciphers,ciphers +ciphertext,ciphertext +cisaData,cisa_data +city,city +ckn,ckn +claims,claims +clarificationPrompt,clarification_prompt +className,class_name +classes,classes +classifiableObjectCount,classifiable_object_count +classifiableSizeInBytes,classifiable_size_in_bytes +classification,classification +classificationDetails,classification_details +classificationError,classification_error +classificationResultStatus,classification_result_status +classificationScopeId,classification_scope_id +classificationScopes,classification_scopes +classificationType,classification_type +classificationTypeUpdate,classification_type_update +clean,clean +clear,clear +clearMaxDevices,clear_max_devices +clearResiliencyPolicyArn,clear_resiliency_policy_arn +clearTimer,clear_timer +clientAliases,client_aliases +clientCertificateId,client_certificate_id +clientCredentialsArn,client_credentials_arn +clientId,client_id +clientIdIssuedAt,client_id_issued_at +clientIds,client_ids +clientMode,client_mode +clientName,client_name +clientNumber,client_number +clientPolicy,client_policy +clientProperties,client_properties +clientRequestToken,client_request_token +clientSecret,client_secret +clientSecretExpiresAt,client_secret_expires_at +clientSideTimestamps,client_side_timestamps +clientStatus,client_status +clientTimestampMillis,client_timestamp_millis +clientToken,client_token +clientType,client_type +clipboardMode,clipboard_mode +clock,clock +cloneFrom,clone_from +cloneUrlHttp,clone_url_http +cloneUrlSsh,clone_url_ssh +closeStatus,close_status +closeStatusFilter,close_status_filter +closeTimeFilter,close_time_filter +closeTimestamp,close_timestamp +closedFindings,closed_findings +closingResponse,closing_response +cloudFormationStackRecords,cloud_formation_stack_records +cloudFormationTarget,cloud_formation_target +cloudMetricEnabled,cloud_metric_enabled +cloudTrailArn,cloud_trail_arn +cloudTrailDetails,cloud_trail_details +cloudTrailProperties,cloud_trail_properties +cloudWatch,cloud_watch +cloudWatchConfig,cloud_watch_config +cloudWatchEncryptionEnabled,cloud_watch_encryption_enabled +cloudWatchLogDelivery,cloud_watch_log_delivery +cloudWatchLogGroupArn,cloud_watch_log_group_arn +cloudWatchLogGroupName,cloud_watch_log_group_name +cloudWatchLoggingConfiguration,cloud_watch_logging_configuration +cloudWatchLogs,cloud_watch_logs +cloudWatchLogsArn,cloud_watch_logs_arn +cloudWatchLogsConfiguration,cloud_watch_logs_configuration +cloudWatchLogsLogGroup,cloud_watch_logs_log_group +cloudWatchLogsRoleArn,cloud_watch_logs_role_arn +cloudWatchMonitoringConfiguration,cloud_watch_monitoring_configuration +cloudwatchAlarm,cloudwatch_alarm +cloudwatchLogUrl,cloudwatch_log_url +cloudwatchLogs,cloudwatch_logs +cloudwatchMetric,cloudwatch_metric +cloudwatchRoleArn,cloudwatch_role_arn +cluster,cluster +clusterArn,cluster_arn +clusterArns,cluster_arns +clusterCreationTime,cluster_creation_time +clusterDescription,cluster_description +clusterEndpoint,cluster_endpoint +clusterIdentifier,cluster_identifier +clusterLogging,cluster_logging +clusterName,cluster_name +clusterSecurityGroupId,cluster_security_group_id +clusterType,cluster_type +clusterVersion,cluster_version +clusteringKeys,clustering_keys +clusters,clusters +code,code +codeArtifactId,code_artifact_id +codeCommit,code_commit +codeCoverageSummary,code_coverage_summary +codeCoverages,code_coverages +codeErrors,code_errors +codeHook,code_hook +codeHookInterfaceVersion,code_hook_interface_version +codeHookSpecification,code_hook_specification +codeSha256,code_sha256 +codeSigning,code_signing +codeSnippet,code_snippet +codeSnippetResults,code_snippet_results +codeVulnerabilityDetails,code_vulnerability_details +codeVulnerabilityDetectorName,code_vulnerability_detector_name +codeVulnerabilityDetectorTags,code_vulnerability_detector_tags +codeVulnerabilityFilePath,code_vulnerability_file_path +codebuildRoleArn,codebuild_role_arn +codec,codec +codegenJobToCreate,codegen_job_to_create +cognitoIdentityPoolId,cognito_identity_pool_id +collaboration,collaboration +collaborationAnalysisTemplate,collaboration_analysis_template +collaborationAnalysisTemplateSummaries,collaboration_analysis_template_summaries +collaborationAnalysisTemplates,collaboration_analysis_templates +collaborationArn,collaboration_arn +collaborationCreatorAccountId,collaboration_creator_account_id +collaborationCreatorDisplayName,collaboration_creator_display_name +collaborationId,collaboration_id +collaborationIdentifier,collaboration_identifier +collaborationList,collaboration_list +collaborationName,collaboration_name +collectionBindingProperties,collection_binding_properties +collectionDetails,collection_details +collectionEndpoint,collection_endpoint +collectionErrorDetails,collection_error_details +collectionFilters,collection_filters +collectionProperties,collection_properties +collectionScheme,collection_scheme +collectionStatus,collection_status +collectionSummaries,collection_summaries +collectorHealth,collector_health +collectorId,collector_id +collectorVersion,collector_version +column,column +columnCount,column_count +columnDefault,column_default +columnDescription,column_description +columnDescriptions,column_descriptions +columnIds,column_ids +columnIndex,column_index +columnMap,column_map +columnMetadata,column_metadata +columnName,column_name +columnNames,column_names +columns,columns +combineArtifacts,combine_artifacts +command,command +commandLineArguments,command_line_arguments +comment,comment +commentBody,comment_body +commentId,comment_id +comments,comments +commentsForComparedCommitData,comments_for_compared_commit_data +commentsForPullRequestData,comments_for_pull_request_data +commit,commit +commitId,commit_id +commitIds,commit_ids +commitMessage,commit_message +commitNum,commit_num +commitSpecifier,commit_specifier +commitTime,commit_time +commitTimestampInMillis,commit_timestamp_in_millis +commitment,commitment +commitmentConfiguration,commitment_configuration +commitmentDuration,commitment_duration +commitmentExpirationTime,commitment_expiration_time +commitmentInformation,commitment_information +commitmentLength,commitment_length +commits,commits +committer,committer +commonName,common_name +communicationBody,communication_body +communicationTypes,communication_types +communications,communications +company,company +comparator,comparator +comparison,comparison +comparisonOperator,comparison_operator +compatibilities,compatibilities +compatible,compatible +compatibleDevices,compatible_devices +compatibleEnvironmentTemplates,compatible_environment_templates +compatibleNamespaceVersion,compatible_namespace_version +complete,complete +completeTime,complete_time +completeWorkflowExecutionDecisionAttributes,complete_workflow_execution_decision_attributes +completeWorkflowExecutionFailedEventAttributes,complete_workflow_execution_failed_event_attributes +completed,completed +completedAt,completed_at +completedJobs,completed_jobs +completedOn,completed_on +completedSteps,completed_steps +completedTime,completed_time +completionStatus,completion_status +completionTime,completion_time +completionTimeRange,completion_time_range +compliance,compliance +complianceCheck,compliance_check +complianceDrifts,compliance_drifts +complianceStatus,compliance_status +complianceType,compliance_type +compliantChecks,compliant_checks +compliantEvidenceCount,compliant_evidence_count +component,component +componentArn,component_arn +componentBuildVersionArn,component_build_version_arn +componentCandidates,component_candidates +componentCompliances,component_compliances +componentDependencies,component_dependencies +componentId,component_id +componentLambdaParameters,component_lambda_parameters +componentName,component_name +componentPlatforms,component_platforms +componentRecommendations,component_recommendations +componentRoleArn,component_role_arn +componentState,component_state +componentStatuses,component_statuses +componentSummaryList,component_summary_list +componentToCreate,component_to_create +componentType,component_type +componentTypeId,component_type_id +componentTypeName,component_type_name +componentTypeSummaries,component_type_summaries +componentUpdatePolicy,component_update_policy +componentUpdates,component_updates +componentVersion,component_version +componentVersionArn,component_version_arn +componentVersionList,component_version_list +componentVersions,component_versions +components,components +compositeModel,composite_model +compositeSlotTypeSetting,composite_slot_type_setting +compressed,compressed +compression,compression +compressionType,compression_type +compute,compute +computeEnvironment,compute_environment +computeEnvironmentArn,compute_environment_arn +computeEnvironmentName,compute_environment_name +computeEnvironmentOrder,compute_environment_order +computeEnvironments,compute_environments +computeLocation,compute_location +computePlatform,compute_platform +computeReservation,compute_reservation +computeResources,compute_resources +computeType,compute_type +computeTypeOverride,compute_type_override +computeTypesAllowed,compute_types_allowed +computedDesiredCount,computed_desired_count +computerAttributes,computer_attributes +concat,concat +conclusionStatement,conclusion_statement +concurrentBuildLimit,concurrent_build_limit +concurrentDeploymentPercentage,concurrent_deployment_percentage +condition,condition +conditionLanguageVersion,condition_language_version +conditional,conditional +conditionalBranches,conditional_branches +confidence,confidence +confidenceLevel,confidence_level +config,config +configArn,config_arn +configData,config_data +configDetails,config_details +configFileName,config_file_name +configHistoryDeliveryInfo,config_history_delivery_info +configId,config_id +configList,config_list +configParameters,config_parameters +configRecommendations,config_recommendations +configSnapshotDeliveryInfo,config_snapshot_delivery_info +configSnapshotDeliveryProperties,config_snapshot_delivery_properties +configSnapshotId,config_snapshot_id +configStreamDeliveryInfo,config_stream_delivery_info +configType,config_type +configVersion,config_version +configuration,configuration +configurationId,configuration_id +configurationIds,configuration_ids +configurationItemCaptureTime,configuration_item_capture_time +configurationItemMD5Hash,configuration_item_md5_hash +configurationItemStatus,configuration_item_status +configurationItems,configuration_items +configurationOptions,configuration_options +configurationOverrides,configuration_overrides +configurationProfileId,configuration_profile_id +configurationProperties,configuration_properties +configurationSchema,configuration_schema +configurationStateId,configuration_state_id +configurationStatus,configuration_status +configurationSummary,configuration_summary +configurationType,configuration_type +configurationUpdate,configuration_update +configurationUrl,configuration_url +configurationValidationPolicy,configuration_validation_policy +configurationValues,configuration_values +configurations,configurations +configurationsDownloadUrl,configurations_download_url +configureOnly,configure_only +configureScript,configure_script +configureScriptType,configure_script_type +configured,configured +configuredBy,configured_by +configuredTable,configured_table +configuredTableArn,configured_table_arn +configuredTableAssociation,configured_table_association +configuredTableAssociationIdentifier,configured_table_association_identifier +configuredTableAssociationSummaries,configured_table_association_summaries +configuredTableId,configured_table_id +configuredTableIdentifier,configured_table_identifier +configuredTableSummaries,configured_table_summaries +confirmationConditional,confirmation_conditional +confirmationNextStep,confirmation_next_step +confirmationPrompt,confirmation_prompt +confirmationResponse,confirmation_response +confirmationState,confirmation_state +confirmationStatus,confirmation_status +confirmationToken,confirmation_token +confirmationUrl,confirmation_url +conflictDetailLevel,conflict_detail_level +conflictDetection,conflict_detection +conflictHandler,conflict_handler +conflictMetadata,conflict_metadata +conflictMetadataList,conflict_metadata_list +conflictResolution,conflict_resolution +conflictResolutionStrategy,conflict_resolution_strategy +conflicts,conflicts +connectContactFlowId,connect_contact_flow_id +connectInstanceConfig,connect_instance_config +connectInstanceId,connect_instance_id +connectInstanceOnboardingJobStatus,connect_instance_onboarding_job_status +connectQueueId,connect_queue_id +connectSourcePhoneNumber,connect_source_phone_number +connected,connected +connectedToSystemTime,connected_to_system_time +connectionArn,connection_arn +connectionId,connection_id +connectionMode,connection_mode +connectionName,connection_name +connectionPool,connection_pool +connectionState,connection_state +connectionType,connection_type +connections,connections +connectionsBandwidth,connections_bandwidth +connectionsCount,connections_count +connectivity,connectivity +connectivityAt,connectivity_at +connectivityInfo,connectivity_info +connectorArn,connector_arn +connectorConfig,connector_config +connectorConfiguration,connector_configuration +connectorConfigurations,connector_configurations +connectorDescription,connector_description +connectorEntityFields,connector_entity_fields +connectorEntityMap,connector_entity_map +connectorEntityName,connector_entity_name +connectorId,connector_id +connectorLabel,connector_label +connectorList,connector_list +connectorMetadata,connector_metadata +connectorModes,connector_modes +connectorName,connector_name +connectorNamePrefix,connector_name_prefix +connectorOperator,connector_operator +connectorOwner,connector_owner +connectorProfileArn,connector_profile_arn +connectorProfileConfig,connector_profile_config +connectorProfileCredentials,connector_profile_credentials +connectorProfileDetails,connector_profile_details +connectorProfileName,connector_profile_name +connectorProfileNames,connector_profile_names +connectorProfileProperties,connector_profile_properties +connectorProvisioningConfig,connector_provisioning_config +connectorProvisioningType,connector_provisioning_type +connectorRuntimeSettings,connector_runtime_settings +connectorState,connector_state +connectorSummary,connector_summary +connectorSuppliedValueOptions,connector_supplied_value_options +connectorSuppliedValues,connector_supplied_values +connectorType,connector_type +connectorTypes,connector_types +connectorVersion,connector_version +connectors,connectors +consecutiveDatapointsToAlarm,consecutive_datapoints_to_alarm +consecutiveDatapointsToClear,consecutive_datapoints_to_clear +consoleUrl,console_url +constraints,constraints +contactArn,contact_arn +contactEndpoint,contact_endpoint +contactId,contact_id +contactList,contact_list +contactMethods,contact_methods +contactPostPassDurationSeconds,contact_post_pass_duration_seconds +contactPrePassDurationSeconds,contact_pre_pass_duration_seconds +contactProtocols,contact_protocols +contactStatus,contact_status +container,container +containerAction,container_action +containerArn,container_arn +containerConfigurations,container_configurations +containerDefinitions,container_definitions +containerDistributionConfiguration,container_distribution_configuration +containerImage,container_image +containerImages,container_images +containerInstance,container_instance +containerInstanceArn,container_instance_arn +containerInstanceArns,container_instance_arns +containerInstances,container_instances +containerLogRotationConfiguration,container_log_rotation_configuration +containerName,container_name +containerOrchestrationType,container_orchestration_type +containerOverrides,container_overrides +containerParams,container_params +containerPath,container_path +containerPort,container_port +containerPortRange,container_port_range +containerProperties,container_properties +containerProvider,container_provider +containerProviderId,container_provider_id +containerProviderType,container_provider_type +containerRecipe,container_recipe +containerRecipeArn,container_recipe_arn +containerRecipeSummaryList,container_recipe_summary_list +containerRecommendations,container_recommendations +containerService,container_service +containerServiceName,container_service_name +containerServices,container_services +containerTags,container_tags +containerType,container_type +containers,containers +contains,contains +containsDataFromDeletedResources,contains_data_from_deleted_resources +content,content +contentArn,content_arn +contentConflict,content_conflict +contentDeliveryRules,content_delivery_rules +contentDisposition,content_disposition +contentEncoding,content_encoding +contentExpression,content_expression +contentHandling,content_handling +contentId,content_id +contentLength,content_length +contentLocation,content_location +contentRange,content_range +contentReference,content_reference +contentSummaries,content_summaries +contentSummary,content_summary +contentType,content_type +contents,contents +context,context +contextAttributes,context_attributes +contextRowId,context_row_id +contexts,contexts +continentCode,continent_code +continuationToken,continuation_token +continueAfterTimeout,continue_after_timeout +continueAsNewWorkflowExecutionDecisionAttributes,continue_as_new_workflow_execution_decision_attributes +continueAsNewWorkflowExecutionFailedEventAttributes,continue_as_new_workflow_execution_failed_event_attributes +continueResponse,continue_response +continuedExecutionRunId,continued_execution_run_id +continuous,continuous +continuousHyperParameterRanges,continuous_hyper_parameter_ranges +contractAddress,contract_address +control,control +controlDomainId,control_domain_id +controlDomainInsights,control_domain_insights +controlId,control_id +controlIdentifier,control_identifier +controlInsightsByAssessment,control_insights_by_assessment +controlInsightsMetadata,control_insights_metadata +controlMappingSources,control_mapping_sources +controlMetadataList,control_metadata_list +controlName,control_name +controlOperation,control_operation +controlPlaneInstanceType,control_plane_instance_type +controlPlanePlacement,control_plane_placement +controlSet,control_set +controlSetId,control_set_id +controlSetName,control_set_name +controlSets,control_sets +controlSetsCount,control_sets_count +controlSources,control_sources +controlStatus,control_status +controlTreatmentName,control_treatment_name +controlType,control_type +controls,controls +controlsCount,controls_count +controlsCountByNoncompliantEvidence,controls_count_by_noncompliant_evidence +conversationDurationSeconds,conversation_duration_seconds +conversationEndState,conversation_end_state +conversationEndTime,conversation_end_time +conversationId,conversation_id +conversationLevelResult,conversation_level_result +conversationLevelTestResults,conversation_level_test_results +conversationLevelTestResultsFilterBy,conversation_level_test_results_filter_by +conversationLogSettings,conversation_log_settings +conversationLogs,conversation_logs +conversationLogsDataSource,conversation_logs_data_source +conversationMode,conversation_mode +conversationStartTime,conversation_start_time +conversionProperties,conversion_properties +conversionServerID,conversion_server_id +cookieSynchronizationConfiguration,cookie_synchronization_configuration +cookiesAllowList,cookies_allow_list +copyAllowed,copy_allowed +copyImageSetInformation,copy_image_set_information +copyPrivateIp,copy_private_ip +copyTags,copy_tags +coreCount,core_count +coreDeviceExecutionStatus,core_device_execution_status +coreDeviceThingName,core_device_thing_name +coreDevices,core_devices +coreVersion,core_version +cores,cores +correlationData,correlation_data +cors,cors +cost,cost +costEstimates,cost_estimates +costOptimizing,cost_optimizing +count,count +counters,counters +countersToAggregate,counters_to_aggregate +country,country +countryCode,country_code +counts,counts +countsByGroup,counts_by_group +coveredResources,covered_resources +cpiSecretKey,cpi_secret_key +cpiUserId,cpi_user_id +cpiUserPassword,cpi_user_password +cpiUsername,cpi_username +cpu,cpu +cpuArchitecture,cpu_architecture +cpuCount,cpu_count +cpuOptions,cpu_options +cpuPerformanceMetricBasis,cpu_performance_metric_basis +cpuUtilizationPercentage,cpu_utilization_percentage +cpuVendorArchitectures,cpu_vendor_architectures +cpus,cpus +cr,cr +crawlerArn,crawler_arn +crawlerConfiguration,crawler_configuration +createCollectionDetail,create_collection_detail +createDate,create_date +createDelegationRequest,create_delegation_request +createDelegationRequests,create_delegation_requests +createPublicIP,create_public_ip +createSimulationJobRequests,create_simulation_job_requests +createStatus,create_status +createTime,create_time +createTimeRange,create_time_range +createTimestamp,create_timestamp +createVersion,create_version +createVpcEndpointDetail,create_vpc_endpoint_detail +created,created +createdAfter,created_after +createdAt,created_at +createdAtAfter,created_at_after +createdAtBefore,created_at_before +createdBefore,created_before +createdBy,created_by +createdCount,created_count +createdDate,created_date +createdOn,created_on +createdReason,created_reason +createdRequestCount,created_request_count +createdRequests,created_requests +createdRows,created_rows +createdTime,created_time +createdTimeStamp,created_time_stamp +createdTimestamp,created_timestamp +creationDate,creation_date +creationDateTime,creation_date_time +creationTime,creation_time +creationTimeAfter,creation_time_after +creationTimeBefore,creation_time_before +creationTimeInMillis,creation_time_in_millis +creationTimeRange,creation_time_range +creationTimestamp,creation_timestamp +creationType,creation_type +creator,creator +creatorAccountId,creator_account_id +creatorDisplayName,creator_display_name +creatorId,creator_id +creatorMemberAbilities,creator_member_abilities +credential,credential +credentialDurationSeconds,credential_duration_seconds +credentialProvider,credential_provider +credentialSpecs,credential_specs +credentialType,credential_type +credentials,credentials +credentialsArn,credentials_arn +credentialsMap,credentials_map +credentialsParameter,credentials_parameter +criteria,criteria +criteriaList,criteria_list +criterion,criterion +critical,critical +crl,crl +crlArn,crl_arn +crlData,crl_data +crlId,crl_id +crls,crls +crossAccountRoleArns,cross_account_role_arns +csv,csv +csvIndexToVariableMap,csv_index_to_variable_map +csvInputTemplate,csv_input_template +cta,cta +cumulativeGasUsed,cumulative_gas_used +currencies,currencies +currency,currency +currencyCode,currency_code +current,current +currentApplicationVersion,current_application_version +currentApplyDate,current_apply_date +currentAttemptCount,current_attempt_count +currentBackupRateInMegaBytesPerSecond,current_backup_rate_in_mega_bytes_per_second +currentBuildSummary,current_build_summary +currentConfiguration,current_configuration +currentDeployment,current_deployment +currentDeploymentGroupName,current_deployment_group_name +currentEphemeris,current_ephemeris +currentInstanceGpuInfo,current_instance_gpu_info +currentInstanceType,current_instance_type +currentLabel,current_label +currentLicenseConfiguration,current_license_configuration +currentMemorySize,current_memory_size +currentPerformanceRisk,current_performance_risk +currentPerformanceRiskRatings,current_performance_risk_ratings +currentPhase,current_phase +currentPlan,current_plan +currentPricingPlan,current_pricing_plan +currentProgress,current_progress +currentRevision,current_revision +currentRevisionId,current_revision_id +currentRpoInSecs,current_rpo_in_secs +currentRtoInSecs,current_rto_in_secs +currentServiceConfiguration,current_service_configuration +currentVersion,current_version +cursor,cursor +custom,custom +customAuthConfigs,custom_auth_configs +customAuthenticationType,custom_authentication_type +customCodeSigning,custom_code_signing +customControlsCount,custom_controls_count +customDNSConfiguration,custom_dns_configuration +customDNSServerIP,custom_dns_server_ip +customDNSServerName,custom_dns_server_name +customData,custom_data +customDataIdentifierId,custom_data_identifier_id +customDataIdentifierIds,custom_data_identifier_ids +customDataIdentifiers,custom_data_identifiers +customDomainName,custom_domain_name +customDomains,custom_domains +customFields,custom_fields +customHeaders,custom_headers +customImageName,custom_image_name +customModelArn,custom_model_arn +customModelKmsKeyId,custom_model_kms_key_id +customModelName,custom_model_name +customModelTags,custom_model_tags +customModelTrainingParameters,custom_model_training_parameters +customModelTransformParameters,custom_model_transform_parameters +customPayload,custom_payload +customPlugin,custom_plugin +customPluginArn,custom_plugin_arn +customPluginState,custom_plugin_state +customPlugins,custom_plugins +customProperties,custom_properties +customRules,custom_rules +customVocabularyExportSpecification,custom_vocabulary_export_specification +customVocabularyImportSpecification,custom_vocabulary_import_specification +customVocabularyItemList,custom_vocabulary_item_list +customVocabularyItems,custom_vocabulary_items +customVocabularyStatus,custom_vocabulary_status +customerAccountId,customer_account_id +customerAction,customer_action +customerAddress,customer_address +customerArtifactPaths,customer_artifact_paths +customerDefinedValues,customer_defined_values +customerId,customer_id +customerManaged,customer_managed +customerManagedKey,customer_managed_key +customerManagedKeyArn,customer_managed_key_arn +customerManagedKeyIdentifier,customer_managed_key_identifier +customerManagedS3,customer_managed_s3 +customerManagedS3Storage,customer_managed_s3_storage +customerRouterConfig,customer_router_config +customerVersion,customer_version +customizationsSupported,customizations_supported +cvss,cvss +cvss2,cvss2 +cvss3,cvss3 +cvssSource,cvss_source +cwes,cwes +dailyReportsOnly,daily_reports_only +dailySchedule,daily_schedule +dashboardArn,dashboard_arn +dashboardCreationDate,dashboard_creation_date +dashboardDefinition,dashboard_definition +dashboardDescription,dashboard_description +dashboardEndpoint,dashboard_endpoint +dashboardId,dashboard_id +dashboardLastUpdateDate,dashboard_last_update_date +dashboardName,dashboard_name +dashboardSummaries,dashboard_summaries +dashboardValidationMessages,dashboard_validation_messages +data,data +dataAccessRoleArn,data_access_role_arn +dataApiRoleArn,data_api_role_arn +dataBundles,data_bundles +dataCharacterEncoding,data_character_encoding +dataCollected,data_collected +dataCollectionDetails,data_collection_details +dataCollectionStatus,data_collection_status +dataDelivery,data_delivery +dataDestinationConfigs,data_destination_configs +dataEncryptionMetadata,data_encryption_metadata +dataExtraDimensions,data_extra_dimensions +dataFormat,data_format +dataItems,data_items +dataLakeArn,data_lake_arn +dataLakeSources,data_lake_sources +dataLakes,data_lakes +dataLocation,data_location +dataLocationConstraint,data_location_constraint +dataPlaneRouting,data_plane_routing +dataPrivacy,data_privacy +dataProcessingJobId,data_processing_job_id +dataProtectionStatus,data_protection_status +dataPullEndTime,data_pull_end_time +dataPullMode,data_pull_mode +dataPullStartTime,data_pull_start_time +dataReplicationError,data_replication_error +dataReplicationInfo,data_replication_info +dataReplicationInitiation,data_replication_initiation +dataReplicationState,data_replication_state +dataSet,data_set +dataSetImportTasks,data_set_import_tasks +dataSetName,data_set_name +dataSetOrg,data_set_org +dataSetPublicationDate,data_set_publication_date +dataSetRequestId,data_set_request_id +dataSetType,data_set_type +dataSets,data_sets +dataSize,data_size +dataSource,data_source +dataSourceArn,data_source_arn +dataSourceConfig,data_source_config +dataSourceName,data_source_name +dataSourceNames,data_source_names +dataSourceType,data_source_type +dataSourceUrl,data_source_url +dataSources,data_sources +dataTimestamp,data_timestamp +dataTraceEnabled,data_trace_enabled +dataTransferApi,data_transfer_api +dataTransferApis,data_transfer_apis +dataType,data_type +dataTypeName,data_type_name +dataTypeSpec,data_type_spec +dataTypeValue,data_type_value +dataURI,data_uri +dataValidationMetrics,data_validation_metrics +dataViewArn,data_view_arn +dataViewId,data_view_id +dataViews,data_views +database,database +databaseArn,database_arn +databaseConfigDetail,database_config_detail +databaseManagementPreference,database_management_preference +databaseMigrationPreference,database_migration_preference +databaseName,database_name +databasePreferences,database_preferences +databaseUrl,database_url +databases,databases +datacenterName,datacenter_name +dataflowDestinationRegion,dataflow_destination_region +dataflowEdges,dataflow_edges +dataflowEndpointGroupArn,dataflow_endpoint_group_arn +dataflowEndpointGroupId,dataflow_endpoint_group_id +dataflowEndpointGroupList,dataflow_endpoint_group_list +dataflowEndpointName,dataflow_endpoint_name +dataflowEndpointRegion,dataflow_endpoint_region +dataflowId,dataflow_id +dataflowList,dataflow_list +dataflowSourceRegion,dataflow_source_region +datakey,datakey +datapointsCollectionPercentage,datapoints_collection_percentage +datapointsToAlarm,datapoints_to_alarm +dataset,dataset +datasetArn,dataset_arn +datasetContentSummaries,dataset_content_summaries +datasetContentVersionValue,dataset_content_version_value +datasetDescription,dataset_description +datasetExportJob,dataset_export_job +datasetExportJobArn,dataset_export_job_arn +datasetExportJobs,dataset_export_jobs +datasetGroup,dataset_group +datasetGroupArn,dataset_group_arn +datasetGroups,dataset_groups +datasetId,dataset_id +datasetImportJob,dataset_import_job +datasetImportJobArn,dataset_import_job_arn +datasetImportJobs,dataset_import_jobs +datasetName,dataset_name +datasetOrg,dataset_org +datasetPermissions,dataset_permissions +datasetSummaries,dataset_summaries +datasetTitle,dataset_title +datasetType,dataset_type +datasets,datasets +datastore,datastore +datastoreArn,datastore_arn +datastoreId,datastore_id +datastoreName,datastore_name +datastorePartitions,datastore_partitions +datastoreProperties,datastore_properties +datastoreStatus,datastore_status +datastoreStorage,datastore_storage +datastoreSummaries,datastore_summaries +datasyncErrorCode,datasync_error_code +date,date +dateAdded,date_added +dateCreated,date_created +dateDue,date_due +dateLastRun,date_last_run +dateNextRun,date_next_run +dateRangeFilter,date_range_filter +dateUpdated,date_updated +datesWithoutSupport,dates_without_support +datetimeTypeFieldName,datetime_type_field_name +dayOfMonth,day_of_month +dayOfWeek,day_of_week +days,days +dbClusterIdentifier,db_cluster_identifier +dbClusterOrInstanceArn,db_cluster_or_instance_arn +dbConnectionId,db_connection_id +dbEngineVersion,db_engine_version +dbName,db_name +dbPassword,db_password +dbPath,db_path +dbPaths,db_paths +dbUser,db_user +debugSession,debug_session +debugSessionEnabled,debug_session_enabled +decimalReturnType,decimal_return_type +decision,decision +decisionTaskCompletedEventAttributes,decision_task_completed_event_attributes +decisionTaskCompletedEventId,decision_task_completed_event_id +decisionTaskScheduledEventAttributes,decision_task_scheduled_event_attributes +decisionTaskStartedEventAttributes,decision_task_started_event_attributes +decisionTaskTimedOutEventAttributes,decision_task_timed_out_event_attributes +decisionType,decision_type +decisions,decisions +declinationConditional,declination_conditional +declinationNextStep,declination_next_step +declinationResponse,declination_response +decodeConfig,decode_config +decoderManifestArn,decoder_manifest_arn +decryptionError,decryption_error +dedicatedServiceAccountId,dedicated_service_account_id +dedupeString,dedupe_string +deepLink,deep_link +defaultAction,default_action +defaultAssessmentReportsDestination,default_assessment_reports_destination +defaultAttributes,default_attributes +defaultAuthorizerName,default_authorizer_name +defaultBranch,default_branch +defaultBranchName,default_branch_name +defaultCacheBehavior,default_cache_behavior +defaultCapacityProviderStrategy,default_capacity_provider_strategy +defaultChecked,default_checked +defaultChildPolicy,default_child_policy +defaultClientId,default_client_id +defaultCountryCode,default_country_code +defaultDevices,default_devices +defaultDisplayVersion,default_display_version +defaultDomain,default_domain +defaultExecutionStartToCloseTimeout,default_execution_start_to_close_timeout +defaultExportDestination,default_export_destination +defaultFormat,default_format +defaultGateway,default_gateway +defaultHyperParameterRanges,default_hyper_parameter_ranges +defaultHyperParameters,default_hyper_parameters +defaultIamRoleArn,default_iam_role_arn +defaultJobTimeoutMinutes,default_job_timeout_minutes +defaultLambdaRole,default_lambda_role +defaultLargeStagingDiskType,default_large_staging_disk_type +defaultLayout,default_layout +defaultLogLevel,default_log_level +defaultParameters,default_parameters +defaultPrefix,default_prefix +defaultProcessOwners,default_process_owners +defaultRegistryAlias,default_registry_alias +defaultResourceConfig,default_resource_config +defaultResponse,default_response +defaultResultConfiguration,default_result_configuration +defaultServerSideEncryption,default_server_side_encryption +defaultTTL,default_ttl +defaultTargetHostname,default_target_hostname +defaultTaskHeartbeatTimeout,default_task_heartbeat_timeout +defaultTaskList,default_task_list +defaultTaskPriority,default_task_priority +defaultTaskScheduleToCloseTimeout,default_task_schedule_to_close_timeout +defaultTaskScheduleToStartTimeout,default_task_schedule_to_start_timeout +defaultTaskStartToCloseTimeout,default_task_start_to_close_timeout +defaultTimeToLive,default_time_to_live +defaultValue,default_value +defaultValueList,default_value_list +defaultValueSpec,default_value_spec +defaultValueSpecification,default_value_specification +defaultVariation,default_variation +defaultVersion,default_version +defaultVersionId,default_version_id +defaultVersionName,default_version_name +definedIn,defined_in +definition,definition +definitionContent,definition_content +definitionUri,definition_uri +definitionZip,definition_zip +delayInSeconds,delay_in_seconds +delegatedAdmin,delegated_admin +delegatedAdminAccount,delegated_admin_account +delegatedAdminAccountId,delegated_admin_account_id +delegatedAdminAccounts,delegated_admin_accounts +delegationId,delegation_id +delegationIds,delegation_ids +delegations,delegations +delete,delete +deleteAdditionalMetricsToRetain,delete_additional_metrics_to_retain +deleteAlertTargets,delete_alert_targets +deleteAuditHistory,delete_audit_history +deleteBehaviors,delete_behaviors +deleteCollectionDetail,delete_collection_detail +deleteFiles,delete_files +deleteOnTermination,delete_on_termination +deletePipelineProvisioningRepository,delete_pipeline_provisioning_repository +deleteReports,delete_reports +deleteResources,delete_resources +deleteScheduledAudits,delete_scheduled_audits +deleteStack,delete_stack +deleteStream,delete_stream +deleteVpcEndpointDetail,delete_vpc_endpoint_detail +deleted,deleted +deletedAt,deleted_at +deletedBranch,deleted_branch +deletedPackage,deleted_package +deletedResources,deleted_resources +deletes,deletes +deletionCharacter,deletion_character +deletionProtected,deletion_protected +delimitedTextOptions,delimited_text_options +delimiter,delimiter +deliveryChannelName,delivery_channel_name +deliveryFrequency,delivery_frequency +deliveryStream,delivery_stream +deliveryStreamName,delivery_stream_name +deltaSyncConfig,delta_sync_config +deltaSyncTableName,delta_sync_table_name +deltaSyncTableTTL,delta_sync_table_ttl +deltaTime,delta_time +deltaTimeSessionWindowConfiguration,delta_time_session_window_configuration +demodulationConfig,demodulation_config +denied,denied +deniesUnencryptedObjectUploads,denies_unencrypted_object_uploads +denyListedAgentlessCollectors,deny_listed_agentless_collectors +denyListedMeCollectors,deny_listed_me_collectors +dependencies,dependencies +dependencyType,dependency_type +dependsOn,depends_on +dependsOnAlarms,depends_on_alarms +deployAsNew,deploy_as_new +deployed,deployed +deployedVersion,deployed_version +deployment,deployment +deploymentApplicationConfigs,deployment_application_configs +deploymentArtifacts,deployment_artifacts +deploymentCircuitBreaker,deployment_circuit_breaker +deploymentConfig,deployment_config +deploymentConfigId,deployment_config_id +deploymentConfigInfo,deployment_config_info +deploymentConfigName,deployment_config_name +deploymentConfigsList,deployment_configs_list +deploymentConfiguration,deployment_configuration +deploymentController,deployment_controller +deploymentDetail,deployment_detail +deploymentFinishTime,deployment_finish_time +deploymentGroupId,deployment_group_id +deploymentGroupInfo,deployment_group_info +deploymentGroupName,deployment_group_name +deploymentGroupNames,deployment_group_names +deploymentGroups,deployment_groups +deploymentGroupsInfo,deployment_groups_info +deploymentId,deployment_id +deploymentIds,deployment_ids +deploymentInfo,deployment_info +deploymentJobs,deployment_jobs +deploymentName,deployment_name +deploymentOption,deployment_option +deploymentOverview,deployment_overview +deploymentPolicies,deployment_policies +deploymentReadyOption,deployment_ready_option +deploymentStartTime,deployment_start_time +deploymentStatus,deployment_status +deploymentStatusMessage,deployment_status_message +deploymentStatusMessages,deployment_status_messages +deploymentStrategy,deployment_strategy +deploymentStyle,deployment_style +deploymentTarget,deployment_target +deploymentTargetType,deployment_target_type +deploymentTargets,deployment_targets +deploymentType,deployment_type +deploymentWaitType,deployment_wait_type +deployments,deployments +deploymentsInfo,deployments_info +deprecateExistingEntities,deprecate_existing_entities +deprecated,deprecated +deprecationDate,deprecation_date +deprecationMessage,deprecation_message +deregisterTime,deregister_time +deregisteredAt,deregistered_at +deregistrationPolicy,deregistration_policy +descending,descending +description,description +descriptions,descriptions +descriptiveText,descriptive_text +desiredCapacity,desired_capacity +desiredChange,desired_change +desiredCount,desired_count +desiredModelArn,desired_model_arn +desiredModelId,desired_model_id +desiredModelUnits,desired_model_units +desiredProvisionedModelName,desired_provisioned_model_name +desiredSize,desired_size +desiredState,desired_state +desiredStatus,desired_status +desiredvCpus,desiredv_cpus +destination,destination +destinationAccessToken,destination_access_token +destinationAccount,destination_account +destinationArn,destination_arn +destinationBranch,destination_branch +destinationCommit,destination_commit +destinationCommitId,destination_commit_id +destinationCommitSpecifier,destination_commit_specifier +destinationConfig,destination_config +destinationConfiguration,destination_configuration +destinationConnectionState,destination_connection_state +destinationConnectorLabel,destination_connector_label +destinationConnectorProperties,destination_connector_properties +destinationConnectorType,destination_connector_type +destinationField,destination_field +destinationFlowConfigList,destination_flow_config_list +destinationImageSet,destination_image_set +destinationImageSetProperties,destination_image_set_properties +destinationInfo,destination_info +destinationName,destination_name +destinationOptions,destination_options +destinationPackageVersions,destination_package_versions +destinationPath,destination_path +destinationPort,destination_port +destinationPrefix,destination_prefix +destinationProperties,destination_properties +destinationReference,destination_reference +destinationRegion,destination_region +destinationRepository,destination_repository +destinationS3BucketName,destination_s3_bucket_name +destinationS3Location,destination_s3_location +destinationS3Prefix,destination_s3_prefix +destinationServerId,destination_server_id +destinationSummaries,destination_summaries +destinationTableId,destination_table_id +destinationType,destination_type +destinationTypeParams,destination_type_params +destinationTypeProperties,destination_type_properties +destinations,destinations +detachedObjectIdentifier,detached_object_identifier +detail,detail +detailedMessage,detailed_message +detailedResultsLocation,detailed_results_location +details,details +detailsMap,details_map +detectSentiment,detect_sentiment +detectionPlatforms,detection_platforms +detections,detections +detector,detector +detectorDebugOptions,detector_debug_options +detectorId,detector_id +detectorModel,detector_model +detectorModelArn,detector_model_arn +detectorModelConfiguration,detector_model_configuration +detectorModelDefinition,detector_model_definition +detectorModelDescription,detector_model_description +detectorModelName,detector_model_name +detectorModelSummaries,detector_model_summaries +detectorModelVersion,detector_model_version +detectorModelVersionSummaries,detector_model_version_summaries +detectorName,detector_name +detectorSummaries,detector_summaries +detectorTags,detector_tags +detectorVersion,detector_version +detectorVersionId,detector_version_id +detectorVersionStatus,detector_version_status +detectorVersionSummaries,detector_version_summaries +detectors,detectors +determiningPolicies,determining_policies +devEnvironmentId,dev_environment_id +device,device +deviceArn,device_arn +deviceCapabilities,device_capabilities +deviceCapacities,device_capacities +deviceCertificateArn,device_certificate_arn +deviceCertificateId,device_certificate_id +deviceCode,device_code +deviceConfig,device_config +deviceDefender,device_defender +deviceDefenderIndexingMode,device_defender_indexing_mode +deviceHostPaths,device_host_paths +deviceId,device_id +deviceIdentifier,device_identifier +deviceIdentifierArn,device_identifier_arn +deviceIdentifiers,device_identifiers +deviceInstance,device_instance +deviceInstances,device_instances +deviceMinutes,device_minutes +deviceName,device_name +deviceParameters,device_parameters +devicePermissionRoleArn,device_permission_role_arn +devicePool,device_pool +devicePoolArn,device_pool_arn +devicePools,device_pools +deviceQueueInfo,device_queue_info +deviceRegistryEnrich,device_registry_enrich +deviceRoleArn,device_role_arn +deviceSelectionConfiguration,device_selection_configuration +deviceSelectionResult,device_selection_result +deviceShadowEnrich,device_shadow_enrich +deviceState,device_state +deviceStatus,device_status +deviceTemplateName,device_template_name +deviceTemplates,device_templates +deviceType,device_type +deviceUdid,device_udid +devices,devices +dfeQueryEngine,dfe_query_engine +diagnostics,diagnostics +diagnosticsMode,diagnostics_mode +dialRequests,dial_requests +dialerConfig,dialer_config +dialingCapacity,dialing_capacity +dialogAction,dialog_action +dialogActionType,dialog_action_type +dialogCodeHook,dialog_code_hook +dialogState,dialog_state +diffType,diff_type +differences,differences +digest,digest +dimensionColumns,dimension_columns +dimensionName,dimension_name +dimensionNames,dimension_names +dimensionValueOperator,dimension_value_operator +dimensions,dimensions +directConnectGateway,direct_connect_gateway +directConnectGatewayAssociation,direct_connect_gateway_association +directConnectGatewayAssociationProposal,direct_connect_gateway_association_proposal +directConnectGatewayAssociationProposals,direct_connect_gateway_association_proposals +directConnectGatewayAssociations,direct_connect_gateway_associations +directConnectGatewayAttachments,direct_connect_gateway_attachments +directConnectGatewayId,direct_connect_gateway_id +directConnectGatewayName,direct_connect_gateway_name +directConnectGatewayOwnerAccount,direct_connect_gateway_owner_account +directConnectGatewayState,direct_connect_gateway_state +directConnectGateways,direct_connect_gateways +direction,direction +directory,directory +directoryId,directory_id +directoryName,directory_name +directoryType,directory_type +disableActionConfiguration,disable_action_configuration +disableActionRequests,disable_action_requests +disableAllLogs,disable_all_logs +disableBackupRetention,disable_backup_retention +disableEmailNotification,disable_email_notification +disableExecuteApiEndpoint,disable_execute_api_endpoint +disableNetworking,disable_networking +disablePlayback,disable_playback +disableSSO,disable_sso +disabledAt,disabled_at +disabledOnInitialization,disabled_on_initialization +disabledReason,disabled_reason +disassociatedAt,disassociated_at +disassociatedDataStorage,disassociated_data_storage +disassociatedRepositoryNames,disassociated_repository_names +disconnectAfterInSeconds,disconnect_after_in_seconds +disconnectReason,disconnect_reason +disconnectTimeoutInMinutes,disconnect_timeout_in_minutes +discoveredIntentCount,discovered_intent_count +discoveredSlotTypeCount,discovered_slot_type_count +discoveryArn,discovery_arn +discoveryData,discovery_data +discoveryName,discovery_name +discoveryUrl,discovery_url +disk,disk +diskImageFormat,disk_image_format +diskName,disk_name +diskPath,disk_path +diskSize,disk_size +diskSizeInGb,disk_size_in_gb +diskSnapshot,disk_snapshot +diskSnapshotInfo,disk_snapshot_info +diskSnapshotName,disk_snapshot_name +diskSnapshots,disk_snapshots +disks,disks +display,display +displayAs,display_as +displayId,display_id +displayName,display_name +displayValue,display_value +disruptionScore,disruption_score +distinctOutgoingEdgeLabels,distinct_outgoing_edge_labels +distinctUsers,distinct_users +distribution,distribution +distributionConfiguration,distribution_configuration +distributionConfigurationArn,distribution_configuration_arn +distributionConfigurationSummaryList,distribution_configuration_summary_list +distributionDomainName,distribution_domain_name +distributionHostedZoneId,distribution_hosted_zone_id +distributionName,distribution_name +distributions,distributions +dns,dns +dnsEntry,dns_entry +dnsIpAddresses,dns_ip_addresses +dnsName,dns_name +dnsPolicy,dns_policy +dnsRecord,dns_record +dnsRecordCreationState,dns_record_creation_state +dnsSearchDomains,dns_search_domains +dnsServers,dns_servers +dnsStatus,dns_status +dockerLabels,docker_labels +dockerSecurityOptions,docker_security_options +dockerURI,docker_uri +dockerVersion,docker_version +dockerVolumeConfiguration,docker_volume_configuration +dockerfileTemplateData,dockerfile_template_data +dockerfileTemplateUri,dockerfile_template_uri +docs,docs +document,document +documentIdentifier,document_identifier +documentName,document_name +documentParameters,document_parameters +documentSource,document_source +documentType,document_type +documentVersion,document_version +documentation,documentation +documentationPartId,documentation_part_id +documentationVersion,documentation_version +documents,documents +domain,domain +domainArn,domain_arn +domainAssociation,domain_association +domainAssociationArn,domain_association_arn +domainAssociations,domain_associations +domainConfigurationArn,domain_configuration_arn +domainConfigurationName,domain_configuration_name +domainConfigurationStatus,domain_configuration_status +domainConfigurations,domain_configurations +domainDetails,domain_details +domainEntries,domain_entries +domainEntry,domain_entry +domainEntryPoint,domain_entry_point +domainId,domain_id +domainInfo,domain_info +domainInfos,domain_infos +domainName,domain_name +domainNameConfig,domain_name_config +domainNameConfigs,domain_name_configs +domainNameStatus,domain_name_status +domainNameStatusMessage,domain_name_status_message +domainOwner,domain_owner +domainStatus,domain_status +domainType,domain_type +domainValidationOptions,domain_validation_options +domainValidationRecords,domain_validation_records +domains,domains +doubleValue,double_value +downlinkBandwidthBits,downlink_bandwidth_bits +downlinkDelayMs,downlink_delay_ms +downlinkJitterMs,downlink_jitter_ms +downlinkLossPercent,downlink_loss_percent +downloadAllowed,download_allowed +downloadArtifactsUrl,download_artifacts_url +downloadConditionFile,download_condition_file +downloadUrl,download_url +driftStatus,drift_status +driftType,drift_type +driver,driver +driverOpts,driver_opts +drop,drop +dryRun,dry_run +dtcRequestIntervalSeconds,dtc_request_interval_seconds +dtmfSpecification,dtmf_specification +duration,duration +durationExpression,duration_expression +durationInMinutes,duration_in_minutes +durationInNanoSeconds,duration_in_nano_seconds +durationInSeconds,duration_in_seconds +durationRange,duration_range +durationSeconds,duration_seconds +durations,durations +dynamicParameters,dynamic_parameters +dynamoDB,dynamo_db +dynamoDBv2,dynamo_dbv2 +dynamodb,dynamodb +dynamodbConfig,dynamodb_config +eTag,e_tag +earlierTime,earlier_time +earliestRestorableTimestamp,earliest_restorable_timestamp +ebs,ebs +ebsEncryption,ebs_encryption +ebsEncryptionKeyArn,ebs_encryption_key_arn +ebsSnapshots,ebs_snapshots +ebsVolumeID,ebs_volume_id +ec2,ec2 +ec2Configuration,ec2_configuration +ec2ImageId,ec2_image_id +ec2InstanceFamily,ec2_instance_family +ec2InstanceID,ec2_instance_id +ec2InstanceId,ec2_instance_id +ec2InstanceImageId,ec2_instance_image_id +ec2InstanceState,ec2_instance_state +ec2InstanceSubnetId,ec2_instance_subnet_id +ec2InstanceTags,ec2_instance_tags +ec2InstanceType,ec2_instance_type +ec2InstanceTypes,ec2_instance_types +ec2InstanceVpcId,ec2_instance_vpc_id +ec2KeyName,ec2_key_name +ec2KeyPair,ec2_key_pair +ec2LaunchTemplateID,ec2_launch_template_id +ec2ScanStatus,ec2_scan_status +ec2SecurityGroupIds,ec2_security_group_ids +ec2SshKey,ec2_ssh_key +ec2SubnetIds,ec2_subnet_ids +ec2TagFilters,ec2_tag_filters +ec2TagSet,ec2_tag_set +ec2TagSetList,ec2_tag_set_list +ecr,ecr +ecrConfiguration,ecr_configuration +ecrImage,ecr_image +ecrImageArchitecture,ecr_image_architecture +ecrImageHash,ecr_image_hash +ecrImagePullerRole,ecr_image_puller_role +ecrImagePushedAt,ecr_image_pushed_at +ecrImageRegistry,ecr_image_registry +ecrImageRepositoryName,ecr_image_repository_name +ecrImageTags,ecr_image_tags +ecrRepository,ecr_repository +ecrRepositoryName,ecr_repository_name +ecrRepositoryPrefix,ecr_repository_prefix +ecrRepositoryPrefixes,ecr_repository_prefixes +ecsClusterArn,ecs_cluster_arn +ecsServiceRecommendations,ecs_service_recommendations +ecsServices,ecs_services +ecsTarget,ecs_target +edgeLabels,edge_labels +edgeProperties,edge_properties +edgeStructures,edge_structures +editContent,edit_content +editor,editor +effect,effect +effectiveDateTime,effective_date_time +effectiveDeployments,effective_deployments +effectiveGasPrice,effective_gas_price +effectiveOn,effective_on +effectivePermission,effective_permission +effectivePolicies,effective_policies +effectiveRecommendationPreferences,effective_recommendation_preferences +effectiveSettings,effective_settings +effectiveTime,effective_time +efsVolumeConfiguration,efs_volume_configuration +egressAddress,egress_address +egressFilter,egress_filter +eksAttempts,eks_attempts +eksClusterArn,eks_cluster_arn +eksConfiguration,eks_configuration +eksProperties,eks_properties +eksPropertiesOverride,eks_properties_override +eksSourceClusterNamespace,eks_source_cluster_namespace +eksSourceName,eks_source_name +eksSourceNames,eks_source_names +eksSources,eks_sources +elapsed,elapsed +elapsedReplicationDuration,elapsed_replication_duration +elapsedTimeInSeconds,elapsed_time_in_seconds +elasticsearch,elasticsearch +elasticsearchConfig,elasticsearch_config +elbInfoList,elb_info_list +element,element +elements,elements +elevation,elevation +elevationReference,elevation_reference +elevationUnit,elevation_unit +elicitationCodeHook,elicitation_code_hook +eligibleToRenew,eligible_to_renew +else,else +email,email +emailAddress,email_address +emailConfigurations,email_configurations +embed,embed +embeddingDataDeliveryEnabled,embedding_data_delivery_enabled +emoji,emoji +emptyDir,empty_dir +enable,enable +enableActionConfiguration,enable_action_configuration +enableActionRequests,enable_action_requests +enableAnswerMachineDetection,enable_answer_machine_detection +enableAutoBranchCreation,enable_auto_branch_creation +enableAutoBuild,enable_auto_build +enableAutoSubDomain,enable_auto_sub_domain +enableBackupRetention,enable_backup_retention +enableBasicAuth,enable_basic_auth +enableBranchAutoBuild,enable_branch_auto_build +enableBranchAutoDeletion,enable_branch_auto_deletion +enableCachingForHttp,enable_caching_for_http +enableCodeHookInvocation,enable_code_hook_invocation +enableDynamicFieldUpdate,enable_dynamic_field_update +enableECSManagedTags,enable_ecs_managed_tags +enableExecuteCommand,enable_execute_command +enableIoTLoggingParams,enable_io_t_logging_params +enableManagedSpotTraining,enable_managed_spot_training +enableMapAutoTagging,enable_map_auto_tagging +enableModelImprovements,enable_model_improvements +enableNotification,enable_notification +enableObjectVersioning,enable_object_versioning +enableOnPublicIp,enable_on_public_ip +enablePerformanceMode,enable_performance_mode +enablePullRequestPreview,enable_pull_request_preview +enableSiteLink,enable_site_link +enabled,enabled +enabledControls,enabled_controls +enablementStatus,enablement_status +encodedInputTranscript,encoded_input_transcript +encodedMessage,encoded_message +encoder,encoder +encoding,encoding +encodings,encodings +encrypted,encrypted +encryptionAlgorithm,encryption_algorithm +encryptionAlgorithmOptions,encryption_algorithm_options +encryptionConfig,encryption_config +encryptionConfiguration,encryption_configuration +encryptionContextEquals,encryption_context_equals +encryptionContextSubset,encryption_context_subset +encryptionDisabled,encryption_disabled +encryptionKey,encryption_key +encryptionKeyArn,encryption_key_arn +encryptionKeyOverride,encryption_key_override +encryptionMode,encryption_mode +encryptionSetting,encryption_setting +encryptionSpecification,encryption_specification +encryptionSpecificationOverride,encryption_specification_override +encryptionStatus,encryption_status +encryptionType,encryption_type +end,end +endAt,end_at +endBehavior,end_behavior +endCharOffset,end_char_offset +endCharacter,end_character +endDate,end_date +endDateTime,end_date_time +endInclusive,end_inclusive +endLine,end_line +endOffsetExclusive,end_offset_exclusive +endTime,end_time +endTimeAfter,end_time_after +endTimeBefore,end_time_before +endTimeInSeconds,end_time_in_seconds +endTimeOffsetInNanos,end_time_offset_in_nanos +endTimeoutMs,end_timeout_ms +endTimes,end_times +endToEndResult,end_to_end_result +endToEndResultCounts,end_to_end_result_counts +ended,ended +endedAt,ended_at +endedTime,ended_time +endpoint,endpoint +endpointAddress,endpoint_address +endpointArn,endpoint_arn +endpointConfig,endpoint_config +endpointConfiguration,endpoint_configuration +endpointCreateTime,endpoint_create_time +endpointDetails,endpoint_details +endpointIdentifier,endpoint_identifier +endpointName,endpoint_name +endpointPrivateAccess,endpoint_private_access +endpointPublicAccess,endpoint_public_access +endpointStatus,endpoint_status +endpointType,endpoint_type +endpoints,endpoints +endpointsDetails,endpoints_details +enforce,enforce +engagements,engagements +engine,engine +engineDescription,engine_description +engineType,engine_type +engineVersion,engine_version +engineVersionDescription,engine_version_description +engineVersions,engine_versions +enhancedFindings,enhanced_findings +enhancedImageMetadataEnabled,enhanced_image_metadata_enabled +enhancedInfrastructureMetrics,enhanced_infrastructure_metrics +enhancedVpcRouting,enhanced_vpc_routing +entities,entities +entitiesPath,entities_path +entity,entity +entityAggregates,entity_aggregates +entityArn,entity_arn +entityArns,entity_arns +entityId,entity_id +entityIdKey,entity_id_key +entityName,entity_name +entityOverrides,entity_overrides +entityPropertyReference,entity_property_reference +entitySummaries,entity_summaries +entityType,entity_type +entityTypes,entity_types +entityUrl,entity_url +entityUrlTemplate,entity_url_template +entityValue,entity_value +entityValues,entity_values +entries,entries +entry,entry +entryId,entry_id +entryName,entry_name +entryPoint,entry_point +entryPointArguments,entry_point_arguments +enumerationValues,enumeration_values +enums,enums +env,env +environment,environment +environmentAccountConnection,environment_account_connection +environmentAccountConnectionId,environment_account_connection_id +environmentAccountConnections,environment_account_connections +environmentAccountId,environment_account_id +environmentArn,environment_arn +environmentFiles,environment_files +environmentId,environment_id +environmentIds,environment_ids +environmentName,environment_name +environmentTemplate,environment_template +environmentTemplateVersion,environment_template_version +environmentTemplates,environment_templates +environmentTypeOverride,environment_type_override +environmentUrl,environment_url +environmentVariables,environment_variables +environmentVariablesOverride,environment_variables_override +environments,environments +ephemeralStorage,ephemeral_storage +ephemerides,ephemerides +ephemeris,ephemeris +ephemerisData,ephemeris_data +ephemerisId,ephemeris_id +epoch,epoch +epss,epss +epssScore,epss_score +eq,eq +eqExactMatch,eq_exact_match +error,error +errorAction,error_action +errorCategory,error_category +errorCode,error_code +errorData,error_data +errorDateTime,error_date_time +errorDescription,error_description +errorDetails,error_details +errorEntries,error_entries +errorHandlingConfig,error_handling_config +errorId,error_id +errorInfo,error_info +errorInformation,error_information +errorMessage,error_message +errorName,error_name +errorReason,error_reason +errorReportLocation,error_report_location +errorStack,error_stack +errorStackTrace,error_stack_trace +errorTimestamp,error_timestamp +errorType,error_type +errorTypes,error_types +error_description,error_description +errored,errored +errors,errors +errorsAndFailedEntriesZip,errors_and_failed_entries_zip +errorsPerPage,errors_per_page +escape,escape +escapeQuotes,escape_quotes +essential,essential +estimatedCost,estimated_cost +estimatedCostTier,estimated_cost_tier +estimatedMinutesRemaining,estimated_minutes_remaining +estimatedMonthlyCost,estimated_monthly_cost +estimatedMonthlySavings,estimated_monthly_savings +estimatedOn,estimated_on +estimatedPercentMonthlySavings,estimated_percent_monthly_savings +estimatedSecondsToCompletion,estimated_seconds_to_completion +estimatedSizeInBytes,estimated_size_in_bytes +estimatedTimeRemainingSeconds,estimated_time_remaining_seconds +etaDateTime,eta_date_time +etag,etag +eula,eula +eulaAcceptanceId,eula_acceptance_id +eulaAcceptances,eula_acceptances +eulaId,eula_id +eulaIds,eula_ids +eulas,eulas +evaluateExpressions,evaluate_expressions +evaluateOnExit,evaluate_on_exit +evaluated,evaluated +evaluatedExpression,evaluated_expression +evaluatedExternalModels,evaluated_external_models +evaluatedModelVersions,evaluated_model_versions +evaluation,evaluation +evaluationContext,evaluation_context +evaluationMethod,evaluation_method +evaluationOrder,evaluation_order +evaluationPeriods,evaluation_periods +evaluationResult,evaluation_result +evaluationRules,evaluation_rules +evaluationScore,evaluation_score +evaluationStrategy,evaluation_strategy +evaluations,evaluations +event,event +eventAggregates,event_aggregates +eventArn,event_arn +eventArns,event_arns +eventAttributionSource,event_attribution_source +eventBridge,event_bridge +eventBridgeConfig,event_bridge_config +eventBridgeEnabled,event_bridge_enabled +eventBusArn,event_bus_arn +eventCategories,event_categories +eventCategory,event_category +eventClasses,event_classes +eventConfigurations,event_configurations +eventCount,event_count +eventData,event_data +eventDataChecksum,event_data_checksum +eventDataSizeInBytes,event_data_size_in_bytes +eventDataStoreArn,event_data_store_arn +eventDate,event_date +eventDescription,event_description +eventID,event_id +eventId,event_id +eventIngestion,event_ingestion +eventList,event_list +eventMessage,event_message +eventMetadata,event_metadata +eventName,event_name +eventNumber,event_number +eventOrchestration,event_orchestration +eventPattern,event_pattern +eventPredictionSummaries,event_prediction_summaries +eventPublishers,event_publishers +eventReason,event_reason +eventReferences,event_references +eventResourceData,event_resource_data +eventResults,event_results +eventScopeCode,event_scope_code +eventSource,event_source +eventSources,event_sources +eventStatusCodes,event_status_codes +eventSubscriptions,event_subscriptions +eventSummaries,event_summaries +eventTime,event_time +eventTimestamp,event_timestamp +eventTracker,event_tracker +eventTrackerArn,event_tracker_arn +eventTrackers,event_trackers +eventType,event_type +eventTypeCategories,event_type_categories +eventTypeCategory,event_type_category +eventTypeCode,event_type_code +eventTypeCodes,event_type_codes +eventTypeName,event_type_name +eventTypes,event_types +eventUpdatedTime,event_updated_time +eventValue,event_value +eventValueThreshold,event_value_threshold +eventVariableName,event_variable_name +eventVariableNames,event_variable_names +eventVariables,event_variables +eventVersion,event_version +events,events +eventsDeletionStatus,events_deletion_status +evidence,evidence +evidenceAwsAccountId,evidence_aws_account_id +evidenceAwsServiceSourceCount,evidence_aws_service_source_count +evidenceByType,evidence_by_type +evidenceByTypeComplianceCheckCount,evidence_by_type_compliance_check_count +evidenceByTypeComplianceCheckIssuesCount,evidence_by_type_compliance_check_issues_count +evidenceByTypeConfigurationDataCount,evidence_by_type_configuration_data_count +evidenceByTypeManualCount,evidence_by_type_manual_count +evidenceByTypeUserActivityCount,evidence_by_type_user_activity_count +evidenceCount,evidence_count +evidenceDetail,evidence_detail +evidenceFileName,evidence_file_name +evidenceFinderEnabled,evidence_finder_enabled +evidenceFinderEnablement,evidence_finder_enablement +evidenceFolder,evidence_folder +evidenceFolderId,evidence_folder_id +evidenceFolders,evidence_folders +evidenceId,evidence_id +evidenceIds,evidence_ids +evidenceInsights,evidence_insights +evidenceResourcesIncludedCount,evidence_resources_included_count +evidenceRule,evidence_rule +evidenceSources,evidence_sources +evidences,evidences +exact,exact +example,example +exampleReference,example_reference +exception,exception +exceptionMessage,exception_message +exceptionName,exception_name +exceptionTimeToLive,exception_time_to_live +exceptions,exceptions +excerpt,excerpt +excludeAppPackagesFromCleanup,exclude_app_packages_from_cleanup +excludeMatchedPattern,exclude_matched_pattern +excludeProperties,exclude_properties +excludeReason,exclude_reason +excludeVerboseContent,exclude_verbose_content +excluded,excluded +excludedDatasetColumns,excluded_dataset_columns +excludedInstanceTypes,excluded_instance_types +excludes,excludes +exclusionArns,exclusion_arns +exclusionByResourceTypes,exclusion_by_resource_types +exclusionPreviews,exclusion_previews +exclusions,exclusions +execArgs,exec_args +executeCommandConfiguration,execute_command_configuration +executeCommandSessionConfiguration,execute_command_session_configuration +execution,execution +executionAbortedEventDetails,execution_aborted_event_details +executionArn,execution_arn +executionConfiguration,execution_configuration +executionContext,execution_context +executionCounts,execution_counts +executionDetails,execution_details +executionEndDate,execution_end_date +executionFailedEventDetails,execution_failed_event_details +executionFilter,execution_filter +executionID,execution_id +executionId,execution_id +executionIds,execution_ids +executionInfo,execution_info +executionInfos,execution_infos +executionMessage,execution_message +executionNamePrefix,execution_name_prefix +executionNumber,execution_number +executionResult,execution_result +executionRole,execution_role +executionRoleArn,execution_role_arn +executionStartDate,execution_start_date +executionStartToCloseTimeout,execution_start_to_close_timeout +executionStartedEventDetails,execution_started_event_details +executionState,execution_state +executionStatus,execution_status +executionStoppedAt,execution_stopped_at +executionSucceededEventDetails,execution_succeeded_event_details +executionSummaries,execution_summaries +executionTimedOutEventDetails,execution_timed_out_event_details +executionTimeoutMinutes,execution_timeout_minutes +executionTimeoutSeconds,execution_timeout_seconds +executionUrlTemplate,execution_url_template +executions,executions +executor,executor +existingAllowedPrefixesToDirectConnectGateway,existing_allowed_prefixes_to_direct_connect_gateway +existingFindingId,existing_finding_id +existingFindingStatus,existing_finding_status +existingImageName,existing_image_name +existingRuleContentSha256,existing_rule_content_sha256 +exists,exists +exitBehavior,exit_behavior +exitCode,exit_code +expected,expected +expectedAgentPrompt,expected_agent_prompt +expectedComplianceStatus,expected_compliance_status +expectedFingerprint,expected_fingerprint +expectedOutput,expected_output +expectedReferenceId,expected_reference_id +expectedRevisionId,expected_revision_id +expectedRpoDescription,expected_rpo_description +expectedRpoInSecs,expected_rpo_in_secs +expectedRtoDescription,expected_rto_description +expectedRtoInSecs,expected_rto_in_secs +expectedSequenceToken,expected_sequence_token +expectedStatus,expected_status +expectedTimestamp,expected_timestamp +expectedValue,expected_value +expectedVersion,expected_version +experiment,experiment +experimentCount,experiment_count +experimentTemplate,experiment_template +experimentTemplateId,experiment_template_id +experimentTemplates,experiment_templates +experiments,experiments +expiration,expiration +expirationDate,expiration_date +expirationInSeconds,expiration_in_seconds +expirationTime,expiration_time +expired,expired +expiredLogEventEndIndex,expired_log_event_end_index +expires,expires +expiresAt,expires_at +expiresIn,expires_in +expiresInMinutes,expires_in_minutes +expiresInSec,expires_in_sec +expiresInSeconds,expires_in_seconds +expiresOn,expires_on +expiresTime,expires_time +expiringImageTotalCount,expiring_image_total_count +expiryTime,expiry_time +explainMode,explain_mode +explicitDeny,explicit_deny +exploitAvailable,exploit_available +exploitObserved,exploit_observed +exploitabilityDetails,exploitability_details +exponentialRate,exponential_rate +export,export +exportBucketArn,export_bucket_arn +exportConfig,export_config +exportConfigType,export_config_type +exportDataFormat,export_data_format +exportID,export_id +exportIDs,export_ids +exportId,export_id +exportIds,export_ids +exportJobs,export_jobs +exportRequestTime,export_request_time +exportSnapshotRecords,export_snapshot_records +exportStatus,export_status +exportSummaries,export_summaries +exportTask,export_task +exportTasks,export_tasks +exportType,export_type +exportedEnvironmentVariables,exported_environment_variables +exportsInfo,exports_info +expr,expr +expression,expression +expressionString,expression_string +expressionWithValues,expression_with_values +exprs,exprs +extendedKeyUsage,extended_key_usage +extendsFrom,extends_from +extension,extension +external,external +externalConnection,external_connection +externalConnectionName,external_connection_name +externalConnections,external_connections +externalEventsDetail,external_events_detail +externalExecutionId,external_execution_id +externalExecutionSummary,external_execution_summary +externalExecutionUrl,external_execution_url +externalId,external_id +externalIdProperty,external_id_property +externalInitiatedEventId,external_initiated_event_id +externalLocation,external_location +externalMetricStatus,external_metric_status +externalMetricsPreference,external_metrics_preference +externalModel,external_model +externalModelEndpointDataBlobs,external_model_endpoint_data_blobs +externalModelEndpoints,external_model_endpoints +externalModelOutputs,external_model_outputs +externalModels,external_models +externalParameters,external_parameters +externalSourceSetting,external_source_setting +externalWorkflowExecution,external_workflow_execution +externalWorkflowExecutionCancelRequestedEventAttributes,external_workflow_execution_cancel_requested_event_attributes +externalWorkflowExecutionSignaledEventAttributes,external_workflow_execution_signaled_event_attributes +extraDataPackageArn,extra_data_package_arn +extraHosts,extra_hosts +extractedValues,extracted_values +facet,facet +facets,facets +fact,fact +factor,factor +facts,facts +failOnError,fail_on_error +failOnFirstDestinationError,fail_on_first_destination_error +failOnWarnings,fail_on_warnings +failWhenMissing,fail_when_missing +failWorkflowExecutionDecisionAttributes,fail_workflow_execution_decision_attributes +failWorkflowExecutionFailedEventAttributes,fail_workflow_execution_failed_event_attributes +failback,failback +failbackClientID,failback_client_id +failbackClientLastSeenByServiceDateTime,failback_client_last_seen_by_service_date_time +failbackInitiationTime,failback_initiation_time +failbackJobID,failback_job_id +failbackLaunchType,failback_launch_type +failbackToOriginalServer,failback_to_original_server +failed,failed +failedAccountIds,failed_account_ids +failedAccounts,failed_accounts +failedAt,failed_at +failedBatchItems,failed_batch_items +failedChecks,failed_checks +failedEntries,failed_entries +failedEventCount,failed_event_count +failedExecutions,failed_executions +failedFindings,failed_findings +failedFindingsCount,failed_findings_count +failedItem,failed_item +failedItems,failed_items +failedRecordsCount,failed_records_count +failedRequestCount,failed_request_count +failedRequests,failed_requests +failedS3Resources,failed_s3_resources +failedSet,failed_set +failedTasks,failed_tasks +failedVersions,failed_versions +failedWorldCount,failed_world_count +failure,failure +failureBehavior,failure_behavior +failureCause,failure_cause +failureCode,failure_code +failureConditional,failure_conditional +failureCount,failure_count +failureDetails,failure_details +failureHandlingPolicy,failure_handling_policy +failureMessage,failure_message +failureNextStep,failure_next_step +failureReason,failure_reason +failureReasons,failure_reasons +failureResource,failure_resource +failureResponse,failure_response +failureSummary,failure_summary +failureThresholdPercentage,failure_threshold_percentage +failureType,failure_type +failures,failures +fairsharePolicy,fairshare_policy +fallbackLocation,fallback_location +fallbackResult,fallback_result +families,families +family,family +familyPrefix,family_prefix +fargatePlatformConfiguration,fargate_platform_configuration +fargateProfile,fargate_profile +fargateProfileArn,fargate_profile_arn +fargateProfileName,fargate_profile_name +fargateProfileNames,fargate_profile_names +fastLaunchConfigurations,fast_launch_configurations +feature,feature +featureCount,feature_count +featureName,feature_name +featureSet,feature_set +featureTransformation,feature_transformation +featureTransformationArn,feature_transformation_arn +featureTransformationParameters,feature_transformation_parameters +featureVariations,feature_variations +features,features +federatedUser,federated_user +federationMode,federation_mode +federationParameters,federation_parameters +federationProviderName,federation_provider_name +federationURN,federation_urn +fetchSubmodules,fetch_submodules +field,field +fieldArn,field_arn +fieldId,field_id +fieldLengthRange,field_length_range +fieldLevelMessages,field_level_messages +fieldList,field_list +fieldLogLevel,field_log_level +fieldName,field_name +fieldType,field_type +fieldValueRange,field_value_range +fields,fields +fieldsToExport,fields_to_export +file,file +fileContent,file_content +fileDescription,file_description +fileExistsBehavior,file_exists_behavior +fileFormat,file_format +fileFormatConfiguration,file_format_configuration +fileFormatType,file_format_type +fileId,file_id +fileKey,file_key +fileLevelMessages,file_level_messages +fileLocation,file_location +fileMap,file_map +fileMd5,file_md5 +fileMode,file_mode +fileModeConflict,file_mode_conflict +fileModes,file_modes +fileName,file_name +filePassword,file_password +filePath,file_path +filePaths,file_paths +filePosition,file_position +fileSize,file_size +fileSizes,file_sizes +fileSystemId,file_system_id +fileSystemLocations,file_system_locations +fileSystemPolicy,file_system_policy +fileSystemType,file_system_type +fileType,file_type +fileUploadUrls,file_upload_urls +fileUploaderConfig,file_uploader_config +fileVersion,file_version +filename,filename +files,files +filesAdded,files_added +filesDeleted,files_deleted +filesUpdated,files_updated +filter,filter +filterArn,filter_arn +filterBy,filter_by +filterByName,filter_by_name +filterByPublished,filter_by_published +filterByRecordingConfigurationArn,filter_by_recording_configuration_arn +filterByState,filter_by_state +filterByUserId,filter_by_user_id +filterCriteria,filter_criteria +filterExpression,filter_expression +filterFormula,filter_formula +filterGroups,filter_groups +filterName,filter_name +filterNamePrefix,filter_name_prefix +filterOperators,filter_operators +filterPattern,filter_pattern +filterQuery,filter_query +filterType,filter_type +filterValue,filter_value +filterValues,filter_values +filters,filters +finalCaseStatus,final_case_status +finalRelationalDatabaseSnapshotName,final_relational_database_snapshot_name +finalSnapshotName,final_snapshot_name +finalSnapshotRetentionPeriod,final_snapshot_retention_period +finalized,finalized +finding,finding +findingArn,finding_arn +findingArns,finding_arns +findingCounts,finding_counts +findingCriteria,finding_criteria +findingDetails,finding_details +findingId,finding_id +findingIdentifiers,finding_identifiers +findingIds,finding_ids +findingNumber,finding_number +findingPublishingFrequency,finding_publishing_frequency +findingReasonCodes,finding_reason_codes +findingSeverityCounts,finding_severity_counts +findingStatus,finding_status +findingTime,finding_time +findingType,finding_type +findingTypes,finding_types +findings,findings +findingsFilterListItems,findings_filter_list_items +findingsMetrics,findings_metrics +findingsReportSummaries,findings_report_summaries +fingerprint,fingerprint +fingerprintSHA1,fingerprint_sha1 +fingerprintSHA256,fingerprint_sha256 +finishedAt,finished_at +finishedCount,finished_count +finishedWorldsSummary,finished_worlds_summary +firehose,firehose +firelensConfiguration,firelens_configuration +firstBoot,first_boot +firstByteDateTime,first_byte_date_time +firstEnabledAt,first_enabled_at +firstEventTimestamp,first_event_timestamp +firstExecutionFrom,first_execution_from +firstJoinTime,first_join_time +firstName,first_name +firstObservedAt,first_observed_at +firstSeen,first_seen +firstUsedTime,first_used_time +firstUtteredDate,first_uttered_date +fixAvailable,fix_available +fixedInVersion,fixed_in_version +flaggedResources,flagged_resources +flatten,flatten +fleet,fleet +fleetArn,fleet_arn +fleetDetails,fleet_details +fleetId,fleet_id +fleetInstanceId,fleet_instance_id +fleetMetrics,fleet_metrics +fleetName,fleet_name +fleetSummaries,fleet_summaries +fleetType,fleet_type +fleets,fleets +floorplanCount,floorplan_count +flowActionsRoleArn,flow_actions_role_arn +flowArn,flow_arn +flowErrorDeactivationThreshold,flow_error_deactivation_threshold +flowExecutionId,flow_execution_id +flowExecutions,flow_executions +flowName,flow_name +flowStatus,flow_status +flowStatusMessage,flow_status_message +flowTemplateId,flow_template_id +flows,flows +folderPath,folder_path +followUpPrompt,follow_up_prompt +force,force +forceCanceled,force_canceled +forceDelete,force_delete +forceDeleteAWSJob,force_delete_aws_job +forceDeleteAddOns,force_delete_add_ons +forceNewDeployment,force_new_deployment +forceStop,force_stop +forceStopAppReplication,force_stop_app_replication +forceTerminateApp,force_terminate_app +forceUefi,force_uefi +forceUpdate,force_update +form,form +formActionType,form_action_type +formFactor,form_factor +formToCreate,form_to_create +format,format +formatOptions,format_options +formatParams,format_params +formatRecordsAs,format_records_as +formatToHeader,format_to_header +formattedRecords,formatted_records +formattedValue,formatted_value +formattedValues,formatted_values +formula,formula +forwardedCookies,forwarded_cookies +forwardedHeaders,forwarded_headers +forwardedQueryStrings,forwarded_query_strings +forwardingConfig,forwarding_config +found,found +foundationModelArn,foundation_model_arn +foundationModelArnEquals,foundation_model_arn_equals +fpr,fpr +fqdn,fqdn +fqdnForActionFramework,fqdn_for_action_framework +fragmentsFilePath,fragments_file_path +frameAddress,frame_address +frameMetric,frame_metric +frameMetricData,frame_metric_data +frameMetrics,frame_metrics +frameName,frame_name +framework,framework +frameworkDescription,framework_description +frameworkId,framework_id +frameworkMetadataList,framework_metadata_list +frameworkName,framework_name +frameworkType,framework_type +freeTrialConsumed,free_trial_consumed +freeTrialExpiration,free_trial_expiration +freeTrialInfo,free_trial_info +freeTrialStartDate,free_trial_start_date +frequency,frequency +frequencyInSeconds,frequency_in_seconds +friendlyName,friendly_name +from,from +fromAttachedDisks,from_attached_disks +fromBlockchainInstant,from_blockchain_instant +fromBlueprintId,from_blueprint_id +fromBundleId,from_bundle_id +fromDate,from_date +fromDateTime,from_date_time +fromDiskArn,from_disk_arn +fromDiskInfo,from_disk_info +fromDiskName,from_disk_name +fromInstanceArn,from_instance_arn +fromInstanceName,from_instance_name +fromPermissionArn,from_permission_arn +fromPermissionVersion,from_permission_version +fromPort,from_port +fromRelationalDatabaseArn,from_relational_database_arn +fromRelationalDatabaseBlueprintId,from_relational_database_blueprint_id +fromRelationalDatabaseBundleId,from_relational_database_bundle_id +fromRelationalDatabaseName,from_relational_database_name +fromResourceArn,from_resource_arn +fromResourceName,from_resource_name +fsxWindowsFileServerVolumeConfiguration,fsx_windows_file_server_volume_configuration +fulfillmentActivity,fulfillment_activity +fulfillmentCodeHook,fulfillment_code_hook +fulfillmentState,fulfillment_state +fulfillmentUpdatesSpecification,fulfillment_updates_specification +fullString,full_string +fullyQualifiedName,fully_qualified_name +function,function +functionAlias,function_alias +functionArn,function_arn +functionArns,function_arns +functionConfiguration,function_configuration +functionId,function_id +functionInstances,function_instances +functionName,function_name +functionNames,function_names +functionPackages,function_packages +functionTags,function_tags +functionVersion,function_version +functions,functions +gasUsed,gas_used +gatewayArn,gateway_arn +gatewayCapabilitySummaries,gateway_capability_summaries +gatewayId,gateway_id +gatewayName,gateway_name +gatewayPlatform,gateway_platform +gatewayRoute,gateway_route +gatewayRouteName,gateway_route_name +gatewayRoutes,gateway_routes +gatewaySummaries,gateway_summaries +gbInUse,gb_in_use +gbPerMonthAllocated,gb_per_month_allocated +generateDistinctId,generate_distinct_id +generatedFields,generated_fields +generatedFrom,generated_from +generatedId,generated_id +generatedPolicies,generated_policies +generatedPolicyResult,generated_policy_result +generatedSceneMetadata,generated_scene_metadata +generationDataSource,generation_data_source +generationId,generation_id +generationJob,generation_job +generatorId,generator_id +genericAttachments,generic_attachments +genericDataSchema,generic_data_schema +genericRevisionInfo,generic_revision_info +getObject,get_object +getTokenBalanceInputs,get_token_balance_inputs +gitCloneDepth,git_clone_depth +gitCloneDepthOverride,git_clone_depth_override +gitHub,git_hub +gitHubAccountName,git_hub_account_name +gitHubLocation,git_hub_location +gitSubmodulesConfig,git_submodules_config +gitSubmodulesConfigOverride,git_submodules_config_override +global,global +glueConfiguration,glue_configuration +glueDataCatalog,glue_data_catalog +gps,gps +gpuCount,gpu_count +gpuIds,gpu_ids +gpuMemorySizeInMiB,gpu_memory_size_in_mib +gpuUnitLimit,gpu_unit_limit +gpus,gpus +grafanaVersion,grafana_version +grafanaVersions,grafana_versions +grammarSlotTypeSetting,grammar_slot_type_setting +grantType,grant_type +grantee,grantee +granteePrincipal,grantee_principal +grants,grants +graphSummary,graph_summary +graphqlApi,graphql_api +graphqlApis,graphql_apis +greenFleetProvisioningOption,green_fleet_provisioning_option +greenGrassGroupId,green_grass_group_id +greengrass,greengrass +greengrassDeploymentId,greengrass_deployment_id +greengrassGroupId,greengrass_group_id +greengrassGroupName,greengrass_group_name +greengrassGroupVersionId,greengrass_group_version_id +greengrassV2,greengrass_v2 +gremlin,gremlin +gremlinQuery,gremlin_query +groundStation,ground_station +groundStationId,ground_station_id +groundStationList,ground_station_list +groundStationName,ground_station_name +groundStations,ground_stations +group,group +groupArn,group_arn +groupAttribute,group_attribute +groupBy,group_by +groupByKeys,group_by_keys +groupDesc,group_desc +groupId,group_id +groupIdFilter,group_id_filter +groupKey,group_key +groupName,group_name +groupNumber,group_number +groupType,group_type +groupWeights,group_weights +groups,groups +groupsClaim,groups_claim +groupsPrefix,groups_prefix +grpcRetryEvents,grpc_retry_events +grpcRoute,grpc_route +gt,gt +gte,gte +haArchitecture,ha_architecture +hardLimit,hard_limit +hardware,hardware +hardwareId,hardware_id +hasChildEntities,has_child_entities +hasErrorEvent,has_error_event +hasFlaggedResources,has_flagged_resources +hasHeaderRow,has_header_row +hasLogicalRedundancy,has_logical_redundancy +hasMoreErrors,has_more_errors +hasMoreResults,has_more_results +hasNestedEntities,has_nested_entities +hasTransmissionEcu,has_transmission_ecu +hashAlgorithm,hash_algorithm +hashAlgorithmOptions,hash_algorithm_options +hashKeyField,hash_key_field +hashKeyType,hash_key_type +hashKeyValue,hash_key_value +hashed,hashed +hashes,hashes +headCommitId,head_commit_id +header,header +headerMatches,header_matches +headerName,header_name +headerValue,header_value +headers,headers +headersAllowList,headers_allow_list +headersToInclude,headers_to_include +health,health +healthCheck,health_check +healthCheckGracePeriodSeconds,health_check_grace_period_seconds +healthCheckIntervalSeconds,health_check_interval_seconds +healthCheckPath,health_check_path +healthCheckTimeoutSeconds,health_check_timeout_seconds +healthReasons,health_reasons +healthServiceAccessStatusForOrganization,health_service_access_status_for_organization +healthStatus,health_status +healthyAgentlessCollectors,healthy_agentless_collectors +healthyAgents,healthy_agents +healthyConnectors,healthy_connectors +healthyMeCollectors,healthy_me_collectors +healthyThreshold,healthy_threshold +healthyThresholdCount,healthy_threshold_count +heapSize,heap_size +heartbeatInSeconds,heartbeat_in_seconds +heartbeatTimeout,heartbeat_timeout +height,height +helmChart,helm_chart +hierarchies,hierarchies +hierarchyId,hierarchy_id +hierarchyInfo,hierarchy_info +high,high +highAvailabilityConfig,high_availability_config +highlight,highlight +highlights,highlights +historyFilter,history_filter +hit,hit +hitCount,hit_count +hits,hits +homePage,home_page +homeRegion,home_region +hook,hook +hooksNotCleanedUp,hooks_not_cleaned_up +horizontalGap,horizontal_gap +host,host +hostAddress,host_address +hostKeys,host_keys +hostName,host_name +hostNetwork,host_network +hostPath,host_path +hostPort,host_port +hostPortRange,host_port_range +hostPrefix,host_prefix +hostedZoneId,hosted_zone_id +hostname,hostname +hpoConfig,hpo_config +hpoJob,hpo_job +hpoObjective,hpo_objective +hpoResourceConfig,hpo_resource_config +http,http +http2Route,http2_route +httpApiKeyAuth,http_api_key_auth +httpConfig,http_config +httpContext,http_context +httpEndpoint,http_endpoint +httpMethod,http_method +httpProtocolIpv6,http_protocol_ipv6 +httpPutResponseHopLimit,http_put_response_hop_limit +httpRetryEvents,http_retry_events +httpRoute,http_route +httpTokens,http_tokens +httpUrlConfiguration,http_url_configuration +httpUrlProperties,http_url_properties +httpUrlSummary,http_url_summary +https,https +httpsRedirectionEnabled,https_redirection_enabled +hunkContent,hunk_content +hyperParameters,hyper_parameters +hyperlinkName,hyperlink_name +iam,iam +iamArn,iam_arn +iamId,iam_id +iamInstanceProfileArn,iam_instance_profile_arn +iamInstanceProfileName,iam_instance_profile_name +iamRegistrationResponse,iam_registration_response +iamResources,iam_resources +iamRole,iam_role +iamRoleArn,iam_role_arn +iamRoles,iam_roles +iamServiceRoleArn,iam_service_role_arn +iamSessionArn,iam_session_arn +iamUser,iam_user +iamUserArn,iam_user_arn +iatTTL,iat_ttl +iccid,iccid +icmpTypeCode,icmp_type_code +iconUrl,icon_url +id,id +idFieldNames,id_field_names +idRef,id_ref +idToken,id_token +idempotencyToken,idempotency_token +identifer,identifer +identificationHints,identification_hints +identifier,identifier +identifiers,identifiers +identity,identity +identityId,identity_id +identityProvider,identity_provider +identityProviderArn,identity_provider_arn +identityProviderConfig,identity_provider_config +identityProviderConfigArn,identity_provider_config_arn +identityProviderConfigName,identity_provider_config_name +identityProviderConfigs,identity_provider_configs +identityProviderDetails,identity_provider_details +identityProviderName,identity_provider_name +identityProviderType,identity_provider_type +identityProviders,identity_providers +identitySource,identity_source +identitySourceId,identity_source_id +identitySources,identity_sources +identityStoreId,identity_store_id +identityToken,identity_token +identityType,identity_type +identityValidationExpression,identity_validation_expression +ides,ides +idle,idle +idleDisconnectTimeoutInMinutes,idle_disconnect_timeout_in_minutes +idleSessionTTLInSeconds,idle_session_ttl_in_seconds +idleTimeoutMinutes,idle_timeout_minutes +idpMetadata,idp_metadata +ids,ids +ignoreApplicationStopFailures,ignore_application_stop_failures +ignoreEmptyRows,ignore_empty_rows +ignoreFailure,ignore_failure +ignoreFilterField,ignore_filter_field +ignoreJobChecks,ignore_job_checks +ignorePollAlarmFailure,ignore_poll_alarm_failure +ignorePublicAcls,ignore_public_acls +ignoreQualField,ignore_qual_field +ignoreWords,ignore_words +image,image +imageAggregation,image_aggregation +imageArn,image_arn +imageBuildVersionArn,image_build_version_arn +imageConfiguration,image_configuration +imageDataDeliveryEnabled,image_data_delivery_enabled +imageDetail,image_detail +imageDetails,image_details +imageDigest,image_digest +imageFrameBlob,image_frame_blob +imageFrameId,image_frame_id +imageFrameInformation,image_frame_information +imageHash,image_hash +imageId,image_id +imageIdOverride,image_id_override +imageIds,image_ids +imageKubernetesVersion,image_kubernetes_version +imageManifest,image_manifest +imageManifestMediaType,image_manifest_media_type +imageOsVersionOverride,image_os_version_override +imageOverride,image_override +imagePackageList,image_package_list +imagePermissions,image_permissions +imagePipeline,image_pipeline +imagePipelineAggregation,image_pipeline_aggregation +imagePipelineArn,image_pipeline_arn +imagePipelineList,image_pipeline_list +imagePullCredentialsType,image_pull_credentials_type +imagePullCredentialsTypeOverride,image_pull_credentials_type_override +imagePullPolicy,image_pull_policy +imagePushedAt,image_pushed_at +imageRecipe,image_recipe +imageRecipeArn,image_recipe_arn +imageRecipeSummaryList,image_recipe_summary_list +imageResponseCard,image_response_card +imageScanCompletedAt,image_scan_completed_at +imageScanFindings,image_scan_findings +imageScanFindingsSummary,image_scan_findings_summary +imageScanStatus,image_scan_status +imageScanningConfiguration,image_scanning_configuration +imageScanningEnabled,image_scanning_enabled +imageSetArn,image_set_arn +imageSetId,image_set_id +imageSetMetadataBlob,image_set_metadata_blob +imageSetPropertiesList,image_set_properties_list +imageSetState,image_set_state +imageSetWorkflowStatus,image_set_workflow_status +imageSetsMetadataSummaries,image_sets_metadata_summaries +imageSha,image_sha +imageShas,image_shas +imageSizeInBytes,image_size_in_bytes +imageSource,image_source +imageSummaryList,image_summary_list +imageTag,image_tag +imageTagDetails,image_tag_details +imageTagMutability,image_tag_mutability +imageTags,image_tags +imageTestsConfiguration,image_tests_configuration +imageTestsEnabled,image_tests_enabled +imageType,image_type +imageUri,image_uri +imageUris,image_uris +imageUrl,image_url +imageVersionArn,image_version_arn +imageVersionList,image_version_list +images,images +impact,impact +implementedBy,implemented_by +implicitDeny,implicit_deny +importCompletionTime,import_completion_time +importConfig,import_config +importDeletedTime,import_deleted_time +importID,import_id +importIDs,import_ids +importId,import_id +importInputLocation,import_input_location +importJobs,import_jobs +importMode,import_mode +importName,import_name +importOptions,import_options +importRequestTime,import_request_time +importStatus,import_status +importStrategy,import_strategy +importSummaries,import_summaries +importTask,import_task +importTaskId,import_task_id +importTaskIds,import_task_ids +importType,import_type +importUrl,import_url +importedAppId,imported_app_id +importedResourceId,imported_resource_id +importedResourceName,imported_resource_name +importedResourceType,imported_resource_type +importedValue,imported_value +impression,impression +imsi,imsi +in,in +inProgress,in_progress +inProgressChecks,in_progress_checks +inProgressJobs,in_progress_jobs +inProgressTimeoutInMinutes,in_progress_timeout_in_minutes +inReplyTo,in_reply_to +inUseResourceCount,in_use_resource_count +inactivityTimeoutMinutes,inactivity_timeout_minutes +inboundExecution,inbound_execution +inboundTransitionState,inbound_transition_state +incidentRecord,incident_record +incidentRecordArn,incident_record_arn +incidentRecordSource,incident_record_source +incidentRecordSummaries,incident_record_summaries +incidentTags,incident_tags +incidentTemplate,incident_template +incidentTemplateDedupeString,incident_template_dedupe_string +incidentTemplateImpact,incident_template_impact +incidentTemplateNotificationTargets,incident_template_notification_targets +incidentTemplateSummary,incident_template_summary +incidentTemplateTags,incident_template_tags +incidentTemplateTitle,incident_template_title +include,include +includeAllVersions,include_all_versions +includeAvailabilityZones,include_availability_zones +includeCanceled,include_canceled +includeCertificateDetails,include_certificate_details +includeCommunications,include_communications +includeConnectedResources,include_connected_resources +includeContent,include_content +includeDefaultKeyPair,include_default_key_pair +includeDeletedRecords,include_deleted_records +includeDeletedResources,include_deleted_resources +includeDeprecated,include_deprecated +includeDescription,include_description +includeDirectives,include_directives +includeExecutionData,include_execution_data +includeFromUpstream,include_from_upstream +includeGlobalResourceTypes,include_global_resource_types +includeInactive,include_inactive +includeJobDocument,include_job_document +includeJobExecutionState,include_job_execution_state +includeLinkedAccounts,include_linked_accounts +includeMemberAccounts,include_member_accounts +includeOnlyActiveViolations,include_only_active_violations +includeOnlyStatuses,include_only_statuses +includeQueuedLoads,include_queued_loads +includeRelationalDatabaseAvailabilityZones,include_relational_database_availability_zones +includeRenditions,include_renditions +includeResolvedCases,include_resolved_cases +includeResourcePlaceholders,include_resource_placeholders +includeResultMetadata,include_result_metadata +includeServiceLevelTemplate,include_service_level_template +includeShadowTrails,include_shadow_trails +includeSourceFiles,include_source_files +includeStatistics,include_statistics +includeSuppressedAlerts,include_suppressed_alerts +includeValue,include_value +includeValues,include_values +includeWaiting,include_waiting +included,included +includedData,included_data +includes,includes +inclusionStatus,inclusion_status +incompatibilityMessages,incompatibility_messages +incompatibleDevices,incompatible_devices +inconclusiveEvidenceCount,inconclusive_evidence_count +incrementFactor,increment_factor +incrementalPullConfig,incremental_pull_config +incrementalRunConfig,incremental_run_config +incrementalRunType,incremental_run_type +index,index +indexName,index_name +indexNames,index_names +indexOps,index_ops +indexStatus,index_status +indicatorOfCompromise,indicator_of_compromise +inferenceAcceleratorOverrides,inference_accelerator_overrides +inferenceAccelerators,inference_accelerators +inferenceTypesSupported,inference_types_supported +inferredWorkloadSavings,inferred_workload_savings +inferredWorkloadTypes,inferred_workload_types +info,info +infrastructureConfiguration,infrastructure_configuration +infrastructureConfigurationArn,infrastructure_configuration_arn +infrastructureConfigurationSummaryList,infrastructure_configuration_summary_list +ingestConfiguration,ingest_configuration +ingestEndpoint,ingest_endpoint +ingestedEventStatistics,ingested_event_statistics +ingestedEventsDetail,ingested_events_detail +ingestedEventsTimeWindow,ingested_events_time_window +ingestion,ingestion +ingestionArn,ingestion_arn +ingestionDestination,ingestion_destination +ingestionDestinationIdentifier,ingestion_destination_identifier +ingestionDestinations,ingestion_destinations +ingestionIdentifier,ingestion_identifier +ingestionMode,ingestion_mode +ingestionTime,ingestion_time +ingestionType,ingestion_type +ingestions,ingestions +ingressAddress,ingress_address +ingressPortOverride,ingress_port_override +inheritedProperties,inherited_properties +initProcessEnabled,init_process_enabled +initQueryFile,init_query_file +initialCapacity,initial_capacity +initialCaseStatus,initial_case_status +initialResponse,initial_response +initialResponseSetting,initial_response_setting +initialRevision,initial_revision +initialRun,initial_run +initialState,initial_state +initialStateName,initial_state_name +initializationConfiguration,initialization_configuration +initializationScript,initialization_script +initializationScripts,initialization_scripts +initiated,initiated +initiatedBy,initiated_by +initiatedEventId,initiated_event_id +initiator,initiator +inlineDocument,inline_document +inlineRecipe,inline_recipe +inlineSourceMap,inline_source_map +input,input +inputArn,input_arn +inputArtifactDetails,input_artifact_details +inputArtifacts,input_artifacts +inputCharacter,input_character +inputConfiguration,input_configuration +inputContexts,input_contexts +inputDataConfig,input_data_config +inputDataS3Location,input_data_s3_location +inputDefinition,input_definition +inputDescription,input_description +inputDetails,input_details +inputFileBucket,input_file_bucket +inputFileKey,input_file_key +inputIdentifier,input_identifier +inputList,input_list +inputModalities,input_modalities +inputMode,input_mode +inputName,input_name +inputParameters,input_parameters +inputPath,input_path +inputPayloadEncodingType,input_payload_encoding_type +inputProperty,input_property +inputPropertyValue,input_property_value +inputRecords,input_records +inputS3Bucket,input_s3_bucket +inputS3Key,input_s3_key +inputS3Uri,input_s3_uri +inputSourceARN,input_source_arn +inputSourceConfig,input_source_config +inputStream,input_stream +inputSummaries,input_summaries +inputText,input_text +inputToken,input_token +inputTranscript,input_transcript +inputType,input_type +inputVariables,input_variables +inputs,inputs +insecureIngest,insecure_ingest +insecureSkipVerification,insecure_skip_verification +insecureSsl,insecure_ssl +insecureSslOverride,insecure_ssl_override +insights,insights +inspectorScore,inspector_score +inspectorScoreDetails,inspector_score_details +installState,install_state +installedComponents,installed_components +installedVersion,installed_version +installingVersion,installing_version +instance,instance +instanceArn,instance_arn +instanceArns,instance_arns +instanceConfig,instance_config +instanceConfiguration,instance_configuration +instanceCount,instance_count +instanceGpuInfo,instance_gpu_info +instanceHealth,instance_health +instanceHealthReason,instance_health_reason +instanceHealthSummary,instance_health_summary +instanceId,instance_id +instanceIdFilter,instance_id_filter +instanceIdentity,instance_identity +instanceIdentityDocument,instance_identity_document +instanceIdentityDocumentSignature,instance_identity_document_signature +instanceIds,instance_ids +instanceInfo,instance_info +instanceInfos,instance_infos +instanceLabel,instance_label +instanceMetadataOptions,instance_metadata_options +instanceName,instance_name +instanceNames,instance_names +instancePort,instance_port +instanceProfile,instance_profile +instanceProfileName,instance_profile_name +instanceProfiles,instance_profiles +instanceProperties,instance_properties +instanceRecommendations,instance_recommendations +instanceRole,instance_role +instanceSnapshot,instance_snapshot +instanceSnapshotInfo,instance_snapshot_info +instanceSnapshotName,instance_snapshot_name +instanceSnapshots,instance_snapshots +instanceState,instance_state +instanceStatusFilter,instance_status_filter +instanceSummary,instance_summary +instanceTags,instance_tags +instanceTarget,instance_target +instanceTerminationWaitTimeStarted,instance_termination_wait_time_started +instanceType,instance_type +instanceTypeFilter,instance_type_filter +instanceTypes,instance_types +instanceUrl,instance_url +instanceWarmupPeriod,instance_warmup_period +instances,instances +instancesList,instances_list +instancesSummary,instances_summary +instantiatedVnfInfo,instantiated_vnf_info +instantiationState,instantiation_state +integerHyperParameterRanges,integer_hyper_parameter_ranges +integerValue,integer_value +integrationConfiguration,integration_configuration +integrationHttpMethod,integration_http_method +integrationResponses,integration_responses +integrations,integrations +intendedForQualification,intended_for_qualification +intent,intent +intentClassificationResults,intent_classification_results +intentClassificationTestResults,intent_classification_test_results +intentClosingSetting,intent_closing_setting +intentConfirmationSetting,intent_confirmation_setting +intentCount,intent_count +intentDiscrepancies,intent_discrepancies +intentId,intent_id +intentLevel,intent_level +intentLevelSlotResolutionTestResults,intent_level_slot_resolution_test_results +intentMatchResult,intent_match_result +intentMatchResultCounts,intent_match_result_counts +intentName,intent_name +intentPath,intent_path +intentSignature,intent_signature +intentState,intent_state +intentSummaries,intent_summaries +intentVersion,intent_version +intents,intents +intentsCount,intents_count +interactionMode,interaction_mode +interactive,interactive +interconnectId,interconnect_id +interconnectName,interconnect_name +interconnectState,interconnect_state +interconnects,interconnects +interfaceId,interface_id +interfaceName,interface_name +interiorCountPerFloorplan,interior_count_per_floorplan +interleaved,interleaved +intermediateBucketName,intermediate_bucket_name +internal,internal +internalDeviceName,internal_device_name +interpolatedAssetPropertyValues,interpolated_asset_property_values +interpolation,interpolation +interpolationType,interpolation_type +interpretations,interpretations +interpretedValue,interpreted_value +interval,interval +intervalInSeconds,interval_in_seconds +intervalMillis,interval_millis +intervalSeconds,interval_seconds +intervalWindowInSeconds,interval_window_in_seconds +invalidExecutions,invalid_executions +invalidNetworkInterfaces,invalid_network_interfaces +invalidNodes,invalid_nodes +invalidReason,invalid_reason +invalidSignals,invalid_signals +invert,invert +invitationId,invitation_id +invitationTimestamp,invitation_timestamp +invitations,invitations +invitationsCount,invitations_count +invitedAt,invited_at +invocationLabel,invocation_label +invokeModelEndpointRoleArn,invoke_model_endpoint_role_arn +invokedBy,invoked_by +invokedIntentSamples,invoked_intent_samples +invoker,invoker +invokerRoleName,invoker_role_name +iops,iops +iosPaths,ios_paths +iotAnalytics,iot_analytics +iotEvents,iot_events +iotEventsDestinationConfiguration,iot_events_destination_configuration +iotEventsInputIdentifier,iot_events_input_identifier +iotJobArn,iot_job_arn +iotJobConfiguration,iot_job_configuration +iotJobId,iot_job_id +iotSiteWise,iot_site_wise +iotSiteWiseAssetModelPropertyIdentifier,iot_site_wise_asset_model_property_identifier +iotSiteWiseInputIdentifier,iot_site_wise_input_identifier +iotSiteWiseMultiLayerStorage,iot_site_wise_multi_layer_storage +iotTopicPublish,iot_topic_publish +ipAccessSettings,ip_access_settings +ipAccessSettingsArn,ip_access_settings_arn +ipAddress,ip_address +ipAddressAssignment,ip_address_assignment +ipAddressBasedRemoteInfoList,ip_address_based_remote_info_list +ipAddressConfigurationTimeStamp,ip_address_configuration_time_stamp +ipAddressDetails,ip_address_details +ipAddressType,ip_address_type +ipAddressV4,ip_address_v4 +ipCity,ip_city +ipCountry,ip_country +ipFamily,ip_family +ipGeoLocation,ip_geo_location +ipGroupIds,ip_group_ids +ipOwner,ip_owner +ipPreference,ip_preference +ipRange,ip_range +ipRule,ip_rule +ipRules,ip_rules +ipV4Addresses,ipv4_addresses +ipV6Addresses,ipv6_addresses +ipcMode,ipc_mode +ips,ips +ipv4Address,ipv4_address +ipv4Addresses,ipv4_addresses +ipv6Address,ipv6_address +ipv6Addresses,ipv6_addresses +ipv6Cidrs,ipv6_cidrs +isAbstract,is_abstract +isActive,is_active +isAlias,is_alias +isAlreadyVerified,is_already_verified +isApiKeyAuthSupported,is_api_key_auth_supported +isArchived,is_archived +isArray,is_array +isAttached,is_attached +isAuthenticated,is_authenticated +isAutoIncrement,is_auto_increment +isAwsOrgEnabled,is_aws_org_enabled +isBasicAuthSupported,is_basic_auth_supported +isBigEndian,is_big_endian +isBinaryFile,is_binary_file +isBootDisk,is_boot_disk +isCancelled,is_cancelled +isCaseSensitive,is_case_sensitive +isComplete,is_complete +isConcurrent,is_concurrent +isConflict,is_conflict +isCreatable,is_creatable +isCurrency,is_currency +isCustomAuthSupported,is_custom_auth_supported +isDefault,is_default +isDefaultVersion,is_default_version +isDefaultedOnCreate,is_defaulted_on_create +isDefinedInJob,is_defined_in_job +isDeprecated,is_deprecated +isDisabled,is_disabled +isDrill,is_drill +isEnabled,is_enabled +isEncrypted,is_encrypted +isEngineDefault,is_engine_default +isExternalId,is_external_id +isFinal,is_final +isFromAutoSnapshot,is_from_auto_snapshot +isHasManyIndex,is_has_many_index +isImported,is_imported +isInherited,is_inherited +isJoinTable,is_join_table +isLastOp,is_last_op +isLatestForTarget,is_latest_for_target +isLongDurationTest,is_long_duration_test +isMainNode,is_main_node +isMerged,is_merged +isModifiable,is_modifiable +isMonitoredByJob,is_monitored_by_job +isMove,is_move +isNative,is_native +isNonModelSupported,is_non_model_supported +isNullable,is_nullable +isOAuth2Supported,is_o_auth2_supported +isOptedOut,is_opted_out +isPeered,is_peered +isPreferred,is_preferred +isPrimary,is_primary +isPrimaryKey,is_primary_key +isPrivateLinkEnabled,is_private_link_enabled +isPrivateLinkEndpointUrlRequired,is_private_link_endpoint_url_required +isPublic,is_public +isQueryable,is_queryable +isRecursive,is_recursive +isRedshiftServerless,is_redshift_serverless +isRelationshipSupported,is_relationship_supported +isRequired,is_required +isRequiredInEntity,is_required_in_entity +isReservedMinutesCustomer,is_reserved_minutes_customer +isResourceTypeDefault,is_resource_type_default +isResumable,is_resumable +isRetrievable,is_retrievable +isRevoked,is_revoked +isRoot,is_root +isSandboxEnvironment,is_sandbox_environment +isSchemaInitialized,is_schema_initialized +isSemVer,is_sem_ver +isSensitiveField,is_sensitive_field +isServiceLimited,is_service_limited +isSigned,is_signed +isSingleton,is_singleton +isStaticIp,is_static_ip +isStoredExternally,is_stored_externally +isSuppressed,is_suppressed +isSystemDisk,is_system_disk +isTerminal,is_terminal +isTerminated,is_terminated +isTimeSeries,is_time_series +isTimestampFieldForIncrementalQueries,is_timestamp_field_for_incremental_queries +isTruncated,is_truncated +isTunable,is_tunable +isUpdatable,is_updatable +isUpsertable,is_upsertable +isValid,is_valid +isolationMode,isolation_mode +isp,isp +issueCode,issue_code +issueType,issue_type +issuedAt,issued_at +issuer,issuer +issuerCA,issuer_ca +issuerCertificateIdentifier,issuer_certificate_identifier +issuerCertificateSerialNumber,issuer_certificate_serial_number +issuerCertificateSubject,issuer_certificate_subject +issuerId,issuer_id +issuerUrl,issuer_url +issues,issues +issuesEnabled,issues_enabled +issuingAccount,issuing_account +item,item +itemAttribute,item_attribute +itemCount,item_count +itemCounts,item_counts +itemExplorationConfig,item_exploration_config +itemId,item_id +itemList,item_list +items,items +iteratorType,iterator_type +job,job +jobArn,job_arn +jobConfiguration,job_configuration +jobCreationDate,job_creation_date +jobDefinition,job_definition +jobDefinitionArn,job_definition_arn +jobDefinitionName,job_definition_name +jobDefinitions,job_definitions +jobDetails,job_details +jobDocument,job_document +jobDriver,job_driver +jobError,job_error +jobExecutionSummary,job_execution_summary +jobExecutionTimeoutMinutes,job_execution_timeout_minutes +jobExecutionsRetryConfig,job_executions_retry_config +jobExecutionsRolloutConfig,job_executions_rollout_config +jobExpiresAt,job_expires_at +jobID,job_id +jobIDs,job_ids +jobId,job_id +jobIdentifier,job_identifier +jobIds,job_ids +jobImminentExpirationHealthEventArn,job_imminent_expiration_health_event_arn +jobInput,job_input +jobInvoker,job_invoker +jobLastUpdateDate,job_last_update_date +jobMetadata,job_metadata +jobName,job_name +jobOutput,job_output +jobOutputPath,job_output_path +jobOwner,job_owner +jobParameters,job_parameters +jobParams,job_params +jobPausedAt,job_paused_at +jobPort,job_port +jobProcessDetails,job_process_details +jobProperties,job_properties +jobQueue,job_queue +jobQueueArn,job_queue_arn +jobQueueName,job_queue_name +jobQueues,job_queues +jobReason,job_reason +jobRoleArn,job_role_arn +jobRun,job_run +jobRunId,job_run_id +jobRuns,job_runs +jobStatus,job_status +jobSummaries,job_summaries +jobSummary,job_summary +jobSummaryList,job_summary_list +jobTags,job_tags +jobTemplate,job_template +jobTemplateArn,job_template_arn +jobTemplateData,job_template_data +jobTemplateId,job_template_id +jobTemplateParameters,job_template_parameters +jobTemplates,job_templates +jobTimeout,job_timeout +jobTimeoutMinutes,job_timeout_minutes +jobToken,job_token +jobType,job_type +jobUser,job_user +jobWorkerExecutorConfiguration,job_worker_executor_configuration +jobs,jobs +joinColumns,join_columns +joinRequired,join_required +jsonConfiguration,json_configuration +jsonInputTemplate,json_input_template +jsonKeyToVariableMap,json_key_to_variable_map +jsonPath,json_path +jumboFrameCapable,jumbo_frame_capable +jwtToken,jwt_token +kafka,kafka +kafkaCluster,kafka_cluster +kafkaClusterClientAuthentication,kafka_cluster_client_authentication +kafkaClusterEncryptionInTransit,kafka_cluster_encryption_in_transit +kafkaConnectVersion,kafka_connect_version +keepEmptyFolders,keep_empty_folders +kendraConfiguration,kendra_configuration +kendraIndex,kendra_index +kernelVersion,kernel_version +key,key +keyAlgorithm,key_algorithm +keyArn,key_arn +keyId,key_id +keyName,key_name +keyPair,key_pair +keyPairName,key_pair_name +keyPairs,key_pairs +keyPolicies,key_policies +keyPrefix,key_prefix +keyRole,key_role +keyTemplate,key_template +keyType,key_type +keyTypes,key_types +keyUsage,key_usage +keyValue,key_value +keyspaceName,keyspace_name +keyspaces,keyspaces +keyword,keyword +keywordInputType,keyword_input_type +keywordValue,keyword_value +keywords,keywords +kind,kind +kinesis,kinesis +kinesisStreamArn,kinesis_stream_arn +kmsArn,kms_arn +kmsEncryptionKeyArn,kms_encryption_key_arn +kmsError,kms_error +kmsKey,kms_key +kmsKeyArn,kms_key_arn +kmsKeyId,kms_key_id +kmsKeyIdentifier,kms_key_identifier +kmsManaged,kms_managed +kmsMasterKeyId,kms_master_key_id +knowledgeBase,knowledge_base +knowledgeBaseArn,knowledge_base_arn +knowledgeBaseId,knowledge_base_id +knowledgeBaseSummaries,knowledge_base_summaries +knowledgeBaseType,knowledge_base_type +knownDependencyCount,known_dependency_count +kubernetesNamespace,kubernetes_namespace +kubernetesNetworkConfig,kubernetes_network_config +kubernetesVersion,kubernetes_version +kxChangesets,kx_changesets +kxClusterSummaries,kx_cluster_summaries +kxDatabases,kx_databases +labMode,lab_mode +label,label +labelDecorator,label_decorator +labelMapper,label_mapper +labelSchema,label_schema +labelTimestamp,label_timestamp +labels,labels +lagDuration,lag_duration +lagId,lag_id +lagName,lag_name +lagState,lag_state +lags,lags +lambda,lambda +lambdaARN,lambda_arn +lambdaAction,lambda_action +lambdaArn,lambda_arn +lambdaAuthorizerConfig,lambda_authorizer_config +lambdaCode,lambda_code +lambdaCodeHook,lambda_code_hook +lambdaConfig,lambda_config +lambdaConflictHandlerArn,lambda_conflict_handler_arn +lambdaConflictHandlerConfig,lambda_conflict_handler_config +lambdaEventStructureVersion,lambda_event_structure_version +lambdaExecutorConfiguration,lambda_executor_configuration +lambdaFunction,lambda_function +lambdaFunctionArn,lambda_function_arn +lambdaFunctionCompletedEventAttributes,lambda_function_completed_event_attributes +lambdaFunctionExecutionRoleArn,lambda_function_execution_role_arn +lambdaFunctionFailedEventAttributes,lambda_function_failed_event_attributes +lambdaFunctionFailedEventDetails,lambda_function_failed_event_details +lambdaFunctionInfo,lambda_function_info +lambdaFunctionLastModifiedAt,lambda_function_last_modified_at +lambdaFunctionLayers,lambda_function_layers +lambdaFunctionName,lambda_function_name +lambdaFunctionRecommendations,lambda_function_recommendations +lambdaFunctionRuntime,lambda_function_runtime +lambdaFunctionScheduleFailedEventDetails,lambda_function_schedule_failed_event_details +lambdaFunctionScheduledEventAttributes,lambda_function_scheduled_event_attributes +lambdaFunctionScheduledEventDetails,lambda_function_scheduled_event_details +lambdaFunctionStartFailedEventDetails,lambda_function_start_failed_event_details +lambdaFunctionStartedEventAttributes,lambda_function_started_event_attributes +lambdaFunctionSucceededEventDetails,lambda_function_succeeded_event_details +lambdaFunctionTags,lambda_function_tags +lambdaFunctionTimedOutEventAttributes,lambda_function_timed_out_event_attributes +lambdaFunctionTimedOutEventDetails,lambda_function_timed_out_event_details +lambdaName,lambda_name +lambdaRole,lambda_role +lambdaTags,lambda_tags +lambdaTarget,lambda_target +language,language +languageAvailability,language_availability +languages,languages +largeDataDeliveryS3Config,large_data_delivery_s3_config +largeVolumeConf,large_volume_conf +lastAccess,last_access +lastActivityDate,last_activity_date +lastActivityTimeStamp,last_activity_time_stamp +lastAnalyzedTimestamp,last_analyzed_timestamp +lastAppComplianceEvaluationTime,last_app_compliance_evaluation_time +lastAssessmentRunArn,last_assessment_run_arn +lastAttemptTime,last_attempt_time +lastAttemptedDeployment,last_attempted_deployment +lastAttemptedDeploymentId,last_attempted_deployment_id +lastAutomatedDiscoveryTime,last_automated_discovery_time +lastBuildSubmittedDateTime,last_build_submitted_date_time +lastByteReceived,last_byte_received +lastChangedAt,last_changed_at +lastChangedBy,last_changed_by +lastClientRequestToken,last_client_request_token +lastCompletedChangesetId,last_completed_changeset_id +lastContentModificationTime,last_content_modification_time +lastCutover,last_cutover +lastDeployTime,last_deploy_time +lastDeploymentAttemptedAt,last_deployment_attempted_at +lastDeploymentJob,last_deployment_job +lastDeploymentStatus,last_deployment_status +lastDeploymentSucceededAt,last_deployment_succeeded_at +lastDeploymentTime,last_deployment_time +lastDisabledTime,last_disabled_time +lastDriftEvaluationTime,last_drift_evaluation_time +lastEnabledTime,last_enabled_time +lastErrorCode,last_error_code +lastErrorMessage,last_error_message +lastEvaluatedAt,last_evaluated_at +lastEventId,last_event_id +lastEventTimestamp,last_event_timestamp +lastHealthPingTime,last_health_ping_time +lastHeartbeatTime,last_heartbeat_time +lastIngestionTime,last_ingestion_time +lastInstallationSource,last_installation_source +lastJobId,last_job_id +lastJobRunTime,last_job_run_time +lastKnownExploitAt,last_known_exploit_at +lastLaunch,last_launch +lastLaunchResult,last_launch_result +lastLoginTime,last_login_time +lastMessageArrivalTime,last_message_arrival_time +lastModelRefreshDate,last_model_refresh_date +lastModificationTime,last_modification_time +lastModified,last_modified +lastModifiedAt,last_modified_at +lastModifiedBy,last_modified_by +lastModifiedDate,last_modified_date +lastModifiedDateTime,last_modified_date_time +lastModifiedOn,last_modified_on +lastModifiedSecret,last_modified_secret +lastModifiedTime,last_modified_time +lastModifiedTimestamp,last_modified_timestamp +lastModifiedUser,last_modified_user +lastName,last_name +lastObservedAt,last_observed_at +lastReachedOutAt,last_reached_out_at +lastRecordedPullTime,last_recorded_pull_time +lastRecovery,last_recovery +lastRecoveryResult,last_recovery_result +lastReferencedTime,last_referenced_time +lastRefreshTimestamp,last_refresh_timestamp +lastReportedTimestamp,last_reported_timestamp +lastResiliencyScoreEvaluationTime,last_resiliency_score_evaluation_time +lastResourceAnalyzed,last_resource_analyzed +lastResourceAnalyzedAt,last_resource_analyzed_at +lastRunErrorStatus,last_run_error_status +lastRunExecutionDetails,last_run_execution_details +lastRunMetadataCatalogDetails,last_run_metadata_catalog_details +lastRunTime,last_run_time +lastScannedAt,last_scanned_at +lastSeen,last_seen +lastSeenAt,last_seen_at +lastSeenByServiceDateTime,last_seen_by_service_date_time +lastSeenDatetime,last_seen_datetime +lastSnapshotDateTime,last_snapshot_date_time +lastStartTime,last_start_time +lastStartedAt,last_started_at +lastStatisticsComputationTime,last_statistics_computation_time +lastStatus,last_status +lastStatusChange,last_status_change +lastStatusChangeDate,last_status_change_date +lastStatusChangeTime,last_status_change_time +lastStatusChangeTimestamp,last_status_change_timestamp +lastStatusUpdateTimestamp,last_status_update_timestamp +lastStopTime,last_stop_time +lastSucceededDeploymentId,last_succeeded_deployment_id +lastSuccessfulComponentDeploymentIds,last_successful_component_deployment_ids +lastSuccessfulDeployment,last_successful_deployment +lastSuccessfulEnvironmentDeploymentId,last_successful_environment_deployment_id +lastSuccessfulMergeDate,last_successful_merge_date +lastSuccessfulServicePipelineDeploymentId,last_successful_service_pipeline_deployment_id +lastSuccessfulTime,last_successful_time +lastSyncedAt,last_synced_at +lastTest,last_test +lastTriggered,last_triggered +lastTrxTimestampInMillis,last_trx_timestamp_in_millis +lastUpdateDate,last_update_date +lastUpdateDateTime,last_update_date_time +lastUpdateTime,last_update_time +lastUpdateToPayPerRequestTimestamp,last_update_to_pay_per_request_timestamp +lastUpdated,last_updated +lastUpdatedAt,last_updated_at +lastUpdatedBy,last_updated_by +lastUpdatedDataTime,last_updated_data_time +lastUpdatedDate,last_updated_date +lastUpdatedDateTime,last_updated_date_time +lastUpdatedOn,last_updated_on +lastUpdatedTime,last_updated_time +lastUpdatedTimes,last_updated_times +lastUpdatedTimestamp,last_updated_timestamp +lastUsed,last_used +lastUsedDate,last_used_date +lastUsedIntent,last_used_intent +lastUsedTime,last_used_time +lastUtteredDate,last_uttered_date +lastValidByteReceived,last_valid_byte_received +lastViolationTime,last_violation_time +lastViolationValue,last_violation_value +lat,lat +lateDataRules,late_data_rules +latency,latency +latencyMode,latency_mode +laterTime,later_time +latestActivityTaskTimestamp,latest_activity_task_timestamp +latestAgentOrchestratedAt,latest_agent_orchestrated_at +latestAgentProfileReportedAt,latest_agent_profile_reported_at +latestAggregatedProfile,latest_aggregated_profile +latestAmiId,latest_ami_id +latestBlockers,latest_blockers +latestBotVersion,latest_bot_version +latestCampaignUpdate,latest_campaign_update +latestCancelRequestedEventId,latest_cancel_requested_event_id +latestDatasetUpdate,latest_dataset_update +latestDate,latest_date +latestDescription,latest_description +latestExecution,latest_execution +latestExecutionContext,latest_execution_context +latestLaunchTime,latest_launch_time +latestRecommenderUpdate,latest_recommender_update +latestReplicationTime,latest_replication_time +latestRestorableTime,latest_restorable_time +latestRevision,latest_revision +latestSolutionVersion,latest_solution_version +latestSuccessfulSync,latest_successful_sync +latestSync,latest_sync +latestValidationTime,latest_validation_time +latestVersion,latest_version +latestVersionId,latest_version_id +latitude,latitude +launch,launch +launchActionsStatus,launch_actions_status +launchConfig,launch_config +launchConfigurationStatus,launch_configuration_status +launchConfigurationTemplate,launch_configuration_template +launchConfigurationTemplateID,launch_configuration_template_id +launchConfigurationTemplateIDs,launch_configuration_template_ids +launchCount,launch_count +launchDetails,launch_details +launchDisposition,launch_disposition +launchFile,launch_file +launchOrder,launch_order +launchPermission,launch_permission +launchProfile,launch_profile +launchProfileId,launch_profile_id +launchProfileInitialization,launch_profile_initialization +launchProfileProtocolVersion,launch_profile_protocol_version +launchProfileProtocolVersions,launch_profile_protocol_versions +launchProfiles,launch_profiles +launchPurpose,launch_purpose +launchStatus,launch_status +launchStatusMessage,launch_status_message +launchTemplate,launch_template +launchTemplateConfigurations,launch_template_configurations +launchTemplateId,launch_template_id +launchTemplateName,launch_template_name +launchTemplateVersion,launch_template_version +launchTime,launch_time +launchType,launch_type +launchedAt,launched_at +launchedEc2InstanceID,launched_ec2_instance_id +launchedInstance,launched_instance +launchedVpcID,launched_vpc_id +launches,launches +layerArn,layer_arn +layerArns,layer_arns +layerAvailability,layer_availability +layerDigest,layer_digest +layerDigests,layer_digests +layerHash,layer_hash +layerHashes,layer_hashes +layerPartBlob,layer_part_blob +layerSize,layer_size +layers,layers +layoutArn,layout_arn +layoutConfiguration,layout_configuration +layoutId,layout_id +layouts,layouts +lcmOpInfo,lcm_op_info +lcmOperationType,lcm_operation_type +learnMoreLink,learn_more_link +leastRecentEvent,least_recent_event +length,length +level,level +lexTranscriptFilter,lex_transcript_filter +licenseConfigurationArns,license_configuration_arns +licenseCostReduction,license_cost_reduction +licenseEdition,license_edition +licenseExpiration,license_expiration +licenseModel,license_model +licenseName,license_name +licenseRecommendationOptions,license_recommendation_options +licenseRecommendations,license_recommendations +licenseType,license_type +licenseUrl,license_url +licenseVersion,license_version +licenses,licenses +licensing,licensing +lifeCycle,life_cycle +lifeCycleStates,life_cycle_states +lifecycle,lifecycle +lifecycleConfiguration,lifecycle_configuration +lifecycleEventHookExecutionId,lifecycle_event_hook_execution_id +lifecycleEventName,lifecycle_event_name +lifecycleEvents,lifecycle_events +lifecyclePolicyText,lifecycle_policy_text +lifecycleState,lifecycle_state +lifecycleStateDetails,lifecycle_state_details +lifecycleStatusCodes,lifecycle_status_codes +limit,limit +limitCode,limit_code +limits,limits +line,line +lineCoveragePercentage,line_coverage_percentage +lineNumber,line_number +lineRange,line_range +lineRanges,line_ranges +lineSep,line_sep +linearInterval,linear_interval +linearPercentage,linear_percentage +linesCovered,lines_covered +linesMissed,lines_missed +link,link +linkOutUri,link_out_uri +linkedToGitHub,linked_to_git_hub +links,links +linux,linux +linuxMountPoint,linux_mount_point +linuxParameters,linux_parameters +linuxProcessParams,linux_process_params +listAntipatternSeveritySummary,list_antipattern_severity_summary +listApplicationComponentStatusSummary,list_application_component_status_summary +listApplicationComponentStrategySummary,list_application_component_strategy_summary +listApplicationComponentSummary,list_application_component_summary +listColumns,list_columns +listServerStatusSummary,list_server_status_summary +listServerStrategySummary,list_server_strategy_summary +listServerSummary,list_server_summary +listSuppressedAlerts,list_suppressed_alerts +listSuppressedFindings,list_suppressed_findings +listValue,list_value +listenerArns,listener_arns +listenerIdentifier,listener_identifier +listenerPorts,listener_ports +listeners,listeners +lists,lists +loa,loa +loaContent,loa_content +loaContentType,loa_content_type +loaIssueTime,loa_issue_time +loadBalancer,load_balancer +loadBalancerArn,load_balancer_arn +loadBalancerDnsName,load_balancer_dns_name +loadBalancerInfo,load_balancer_info +loadBalancerName,load_balancer_name +loadBalancers,load_balancers +loadId,load_id +loadIds,load_ids +localPath,local_path +localTraits,local_traits +locale,locale +localeId,locale_id +localeName,locale_name +location,location +locationCode,location_code +locationName,location_name +locationStatus,location_status +locationType,location_type +locations,locations +lockId,lock_id +log,log +logConfig,log_config +logConfiguration,log_configuration +logContext,log_context +logDateTime,log_date_time +logDelivery,log_delivery +logDriver,log_driver +logEventMessages,log_event_messages +logEvents,log_events +logExports,log_exports +logGroup,log_group +logGroupArn,log_group_arn +logGroupFields,log_group_fields +logGroupIdentifier,log_group_identifier +logGroupIdentifiers,log_group_identifiers +logGroupName,log_group_name +logGroupNamePattern,log_group_name_pattern +logGroupNamePrefix,log_group_name_prefix +logGroupNames,log_group_names +logGroups,log_groups +logLevel,log_level +logOddsImpact,log_odds_impact +logOddsMetrics,log_odds_metrics +logPrefix,log_prefix +logRecord,log_record +logRecordPointer,log_record_pointer +logResult,log_result +logSchemaVersion,log_schema_version +logSettings,log_settings +logStream,log_stream +logStreamName,log_stream_name +logStreamNamePrefix,log_stream_name_prefix +logStreamNames,log_stream_names +logStreams,log_streams +logTail,log_tail +logTarget,log_target +logTargetConfigurations,log_target_configurations +logType,log_type +logTypes,log_types +logUri,log_uri +logUrl,log_url +logging,logging +loggingConfig,logging_config +loggingConfiguration,logging_configuration +loggingConfigurationIdentifier,logging_configuration_identifier +loggingConfigurationIdentifiers,logging_configuration_identifiers +loggingConfigurations,logging_configurations +loggingLevel,logging_level +loggingOptions,logging_options +loggingOptionsPayload,logging_options_payload +logicalId,logical_id +logicalResourceId,logical_resource_id +logicalStackName,logical_stack_name +logicalStackNames,logical_stack_names +login,login +loginValidityDuration,login_validity_duration +logo,logo +logoImageBlob,logo_image_blob +logoURL,logo_url +logoUrl,logo_url +logonLanguage,logon_language +logs,logs +logsConfig,logs_config +logsConfigOverride,logs_config_override +lon,lon +longReturnType,long_return_type +longValue,long_value +longitude,longitude +lookBackPeriodInDays,look_back_period_in_days +lookbackPeriodInDays,lookback_period_in_days +low,low +lowerBoundValue,lower_bound_value +lowerBoundValues,lower_bound_values +lowerInclusive,lower_inclusive +lt,lt +lte,lte +macAddress,mac_address +macSecCapable,mac_sec_capable +macSecKeys,mac_sec_keys +main,main +mainNode,main_node +maintenanceWindows,maintenance_windows +majorVersion,major_version +majorVersionNumber,major_version_number +managedAgentName,managed_agent_name +managedAgents,managed_agents +managedCredentialsAction,managed_credentials_action +managedCredentialsStatus,managed_credentials_status +managedDataIdentifierIds,managed_data_identifier_ids +managedDataIdentifierSelector,managed_data_identifier_selector +managedDeviceArn,managed_device_arn +managedDeviceId,managed_device_id +managedFields,managed_fields +managedJobTemplates,managed_job_templates +managedPersistenceMonitoringConfiguration,managed_persistence_monitoring_configuration +managedPolicyArns,managed_policy_arns +managedScaling,managed_scaling +managedTerminationProtection,managed_termination_protection +managementAccountId,management_account_id +managementPreference,management_preference +manifest,manifest +manualEvidence,manual_evidence +manualEvidenceCount,manual_evidence_count +manufacturer,manufacturer +mapAutoTaggingMpeID,map_auto_tagging_mpe_id +mapIterationAbortedEventDetails,map_iteration_aborted_event_details +mapIterationFailedEventDetails,map_iteration_failed_event_details +mapIterationStartedEventDetails,map_iteration_started_event_details +mapIterationSucceededEventDetails,map_iteration_succeeded_event_details +mapRunArn,map_run_arn +mapRunFailedEventDetails,map_run_failed_event_details +mapRunStartedEventDetails,map_run_started_event_details +mapRuns,map_runs +mapStateStartedEventDetails,map_state_started_event_details +mapValue,map_value +mappedInputFields,mapped_input_fields +mappingType,mapping_type +marker,marker +markerName,marker_name +markerRecordedEventAttributes,marker_recorded_event_attributes +marketplaceCertified,marketplace_certified +marketplaceInformation,marketplace_information +master,master +masterAccount,master_account +masterAccountId,master_account_id +masterDatabaseName,master_database_name +masterEndpoint,master_endpoint +masterUserPassword,master_user_password +masterUsername,master_username +match,match +matchCount,match_count +matchEquals,match_equals +matchIDs,match_ids +matchId,match_id +matchKey,match_key +matchResult,match_result +matched,matched +matchedDevicesCount,matched_devices_count +matcher,matcher +matches,matches +matchingBucket,matching_bucket +matchingKeys,matching_keys +matchingResources,matching_resources +math,math +max,max +maxAccountLimitReached,max_account_limit_reached +maxAge,max_age +maxAttempts,max_attempts +maxBackupsToRetain,max_backups_to_retain +maxBatchSize,max_batch_size +maxBuckets,max_buckets +maxConcurrency,max_concurrency +maxConflictFiles,max_conflict_files +maxConnections,max_connections +maxCpus,max_cpus +maxDepth,max_depth +maxDevices,max_devices +maxDuration,max_duration +maxEjectionPercent,max_ejection_percent +maxFileCount,max_file_count +maxFilesToKeep,max_files_to_keep +maxGpus,max_gpus +maxHPONumberOfTrainingJobs,max_hpo_number_of_training_jobs +maxHPOParallelTrainingJobs,max_hpo_parallel_training_jobs +maxIdleTimeInSeconds,max_idle_time_in_seconds +maxIndexingCapacityInOCU,max_indexing_capacity_in_ocu +maxInstancesCount,max_instances_count +maxItems,max_items +maxJobDurationInSeconds,max_job_duration_in_seconds +maxJobTimeoutMinutes,max_job_timeout_minutes +maxLength,max_length +maxLengthMs,max_length_ms +maxLifetimeTimeoutMinutes,max_lifetime_timeout_minutes +maxLineCoveragePercentage,max_line_coverage_percentage +maxMergeHunks,max_merge_hunks +maxMessages,max_messages +maxNodeCount,max_node_count +maxNumberOfTrainingJobs,max_number_of_training_jobs +maxPageSize,max_page_size +maxParallelLaunches,max_parallel_launches +maxParallelTrainingJobs,max_parallel_training_jobs +maxParallelism,max_parallelism +maxPendingRequests,max_pending_requests +maxQueueSize,max_queue_size +maxRequests,max_requests +maxResult,max_result +maxResults,max_results +maxRetries,max_retries +maxRuns,max_runs +maxRuntimeInSeconds,max_runtime_in_seconds +maxSampleCount,max_sample_count +maxSearchCapacityInOCU,max_search_capacity_in_ocu +maxSeconds,max_seconds +maxServerErrors,max_server_errors +maxSessionLengthInMinutes,max_session_length_in_minutes +maxSize,max_size +maxSizeInMB,max_size_in_mb +maxSlots,max_slots +maxStoppedSessionLengthInMinutes,max_stopped_session_length_in_minutes +maxSwap,max_swap +maxUnavailable,max_unavailable +maxUnavailablePercentage,max_unavailable_percentage +maxValue,max_value +maxVersions,max_versions +maxWorkerCount,max_worker_count +maximum,maximum +maximumBuildsAllowed,maximum_builds_allowed +maximumCapacity,maximum_capacity +maximumCount,maximum_count +maximumElevation,maximum_elevation +maximumMatchDistance,maximum_match_distance +maximumMessageLength,maximum_message_length +maximumMessageRatePerSecond,maximum_message_rate_per_second +maximumPageSize,maximum_page_size +maximumPerMinute,maximum_per_minute +maximumPercent,maximum_percent +maximumScalingStepSize,maximum_scaling_step_size +maximumTTL,maximum_ttl +maxvCpus,maxv_cpus +mcuCount,mcu_count +md5,md5 +md5sum,md5_sum +meCollectorSummary,me_collector_summary +mean,mean +meanTimeToClose,mean_time_to_close +measurement,measurement +mediaType,media_type +medium,medium +member,member +memberAbilities,member_abilities +memberAccountId,member_account_id +memberAccounts,member_accounts +memberAccountsEnrolled,member_accounts_enrolled +memberFileExtensions,member_file_extensions +memberStatus,member_status +memberSummaries,member_summaries +members,members +membership,membership +membershipArn,membership_arn +membershipId,membership_id +membershipIdentifier,membership_identifier +membershipStatus,membership_status +membershipSummaries,membership_summaries +memberships,memberships +memory,memory +memoryGBHour,memory_gb_hour +memoryInfo,memory_info +memoryReservation,memory_reservation +memorySize,memory_size +memorySizeConfiguration,memory_size_configuration +memorySizeInKB,memory_size_in_kb +memorySizeRecommendationOptions,memory_size_recommendation_options +merge,merge +mergeBase,merge_base +mergeCommitId,merge_commit_id +mergeHunks,merge_hunks +mergeMetadata,merge_metadata +mergeOperations,merge_operations +mergeOption,merge_option +mergeOptions,merge_options +mergeStrategy,merge_strategy +mergeType,merge_type +mergeable,mergeable +mergedApiArn,merged_api_arn +mergedApiExecutionRoleArn,merged_api_execution_role_arn +mergedApiId,merged_api_id +mergedApiIdentifier,merged_api_identifier +mergedBy,merged_by +mergedCommitId,merged_commit_id +mesh,mesh +meshName,mesh_name +meshOwner,mesh_owner +meshes,meshes +message,message +messageContent,message_content +messageExpiry,message_expiry +messageFormat,message_format +messageGroups,message_groups +messageId,message_id +messageReviewHandler,message_review_handler +messageReviewHandlerUri,message_review_handler_uri +messageSelectionStrategy,message_selection_strategy +messageType,message_type +messageVersion,message_version +messages,messages +meta,meta +metaStoreManagerRoleArn,meta_store_manager_role_arn +metadata,metadata +metadataCatalogConfig,metadata_catalog_config +metadataCatalogDetails,metadata_catalog_details +metadataKey,metadata_key +metadataOptions,metadata_options +metered,metered +method,method +methodIntegration,method_integration +methodName,method_name +methodResponses,method_responses +methodSettings,method_settings +metric,metric +metricArn,metric_arn +metricAttribution,metric_attribution +metricAttributionArn,metric_attribution_arn +metricAttributions,metric_attributions +metricData,metric_data +metricDataPoints,metric_data_points +metricDatumList,metric_datum_list +metricDefinition,metric_definition +metricDimension,metric_dimension +metricFilterCount,metric_filter_count +metricFilters,metric_filters +metricGoals,metric_goals +metricMonitors,metric_monitors +metricName,metric_name +metricNames,metric_names +metricNamespace,metric_namespace +metricRegex,metric_regex +metricRuleRoleArn,metric_rule_role_arn +metricTarget,metric_target +metricTimestamp,metric_timestamp +metricTransformations,metric_transformations +metricType,metric_type +metricUnit,metric_unit +metricValue,metric_value +metrics,metrics +metricsConfiguration,metrics_configuration +metricsEnabled,metrics_enabled +metricsOutputConfig,metrics_output_config +metricsResults,metrics_results +metricsSource,metrics_source +metricsSummary,metrics_summary +mfaAuthenticated,mfa_authenticated +migrationEffort,migration_effort +migrationId,migration_id +migrationStatus,migration_status +migrationStatusEquals,migration_status_equals +migrationStrategy,migration_strategy +migrationSummaries,migration_summaries +migrationTimestamp,migration_timestamp +migrationWorkflowSummary,migration_workflow_summary +millisUntilNextRefreshable,millis_until_next_refreshable +mimeType,mime_type +min,min +minLineCoveragePercentage,min_line_coverage_percentage +minNodeCount,min_node_count +minNumberOfExecutedThings,min_number_of_executed_things +minPower,min_power +minProvisionedTPS,min_provisioned_tps +minRecommendationRequestsPerSecond,min_recommendation_requests_per_second +minSeconds,min_seconds +minSize,min_size +minValue,min_value +minWorkerCount,min_worker_count +minimum,minimum +minimumCompressionSize,minimum_compression_size +minimumCount,minimum_count +minimumHealthyHosts,minimum_healthy_hosts +minimumHealthyPercent,minimum_healthy_percent +minimumLinks,minimum_links +minimumSamplingIntervalMs,minimum_sampling_interval_ms +minimumScalingStepSize,minimum_scaling_step_size +minimumTTL,minimum_ttl +minimumTriggerIntervalMs,minimum_trigger_interval_ms +minimumViableContactDurationSeconds,minimum_viable_contact_duration_seconds +minorVersion,minor_version +minvCpus,minv_cpus +missedCount,missed_count +missing,missing +missingContextValues,missing_context_values +missionProfileArn,mission_profile_arn +missionProfileId,mission_profile_id +missionProfileList,mission_profile_list +mixed,mixed +mixin,mixin +mlDetectionConfig,ml_detection_config +mlModelTrainingJobId,ml_model_training_job_id +mlModelTransformJobId,ml_model_transform_job_id +mlModels,ml_models +modality,modality +mode,mode +model,model +modelArn,model_arn +modelArnEquals,model_arn_equals +modelCustomizationJobSummaries,model_customization_job_summaries +modelDetails,model_details +modelEndpoint,model_endpoint +modelEndpointStatus,model_endpoint_status +modelId,model_id +modelIdentifier,model_identifier +modelKmsKeyArn,model_kms_key_arn +modelManifestArn,model_manifest_arn +modelMetrics,model_metrics +modelName,model_name +modelPerformance,model_performance +modelScores,model_scores +modelSource,model_source +modelStatus,model_status +modelSummaries,model_summaries +modelTransformJob,model_transform_job +modelTransformOutputS3Location,model_transform_output_s3_location +modelType,model_type +modelUnits,model_units +modelVariables,model_variables +modelVersion,model_version +modelVersionDetails,model_version_details +modelVersionNumber,model_version_number +modelVersions,model_versions +models,models +modernizeInfrastructureWithCloudNativeTechnologies,modernize_infrastructure_with_cloud_native_technologies +modes,modes +modified,modified +modifiedAt,modified_at +modifiedCount,modified_count +modifiedTimestamp,modified_timestamp +modifyVnfInfoData,modify_vnf_info_data +module,module +monitoredResourceInfo,monitored_resource_info +monitoredResourceName,monitored_resource_name +monitoringConfiguration,monitoring_configuration +month,month +monthlySchedule,monthly_schedule +monthlyTransfer,monthly_transfer +moreApplicationResource,more_application_resource +moreInfo,more_info +moreServerAssociationExists,more_server_association_exists +mostRecentEvent,most_recent_event +mostRecentExecutionMessage,most_recent_execution_message +mostRecentExecutionStatus,most_recent_execution_status +mostRecentExecutionTime,most_recent_execution_time +mountOptions,mount_options +mountPath,mount_path +mountPoint,mount_point +mountPoints,mount_points +mountROSysfs,mount_ro_sysfs +mqttContext,mqtt_context +mqttTopic,mqtt_topic +mtu,mtu +multiLayerStorage,multi_layer_storage +multiNodeJobId,multi_node_job_id +multiTurnConversation,multi_turn_conversation +multiValueHeaders,multi_value_headers +multipleValuesSetting,multiple_values_setting +mustSucceedForCutover,must_succeed_for_cutover +mutationsFilePath,mutations_file_path +mutualTlsAuthentication,mutual_tls_authentication +name,name +nameContains,name_contains +namePattern,name_pattern +namePrefixFilter,name_prefix_filter +nameQuery,name_query +nameServersUpdateState,name_servers_update_state +namedShadowIndexingMode,named_shadow_indexing_mode +namedShadowNames,named_shadow_names +names,names +namespace,namespace +namespaceArn,namespace_arn +namespaceId,namespace_id +namespaceName,namespace_name +namespaceType,namespace_type +namespaceVersion,namespace_version +namespaces,namespaces +needsReplacements,needs_replacements +negative,negative +neighborConfigurationIds,neighbor_configuration_ids +neighbors,neighbors +neptuneIamRoleArn,neptune_iam_role_arn +neq,neq +nestedType,nested_type +netMask,net_mask +netmask,netmask +network,network +networkAccessControl,network_access_control +networkArn,network_arn +networkBindings,network_bindings +networkConfiguration,network_configuration +networkFileDefinitions,network_file_definitions +networkFindings,network_findings +networkInfoList,network_info_list +networkInstances,network_instances +networkInterface,network_interface +networkInterfaceId,network_interface_id +networkInterfaces,network_interfaces +networkInterfacesToAdd,network_interfaces_to_add +networkInterfacesToRemove,network_interfaces_to_remove +networkInterfacesToUpdate,network_interfaces_to_update +networkMode,network_mode +networkName,network_name +networkOperations,network_operations +networkOrigin,network_origin +networkPackages,network_packages +networkPath,network_path +networkProfile,network_profile +networkProfileArn,network_profile_arn +networkProfiles,network_profiles +networkProtocol,network_protocol +networkReachabilityDetails,network_reachability_details +networkResource,network_resource +networkResourceArn,network_resource_arn +networkResources,network_resources +networkSettings,network_settings +networkSettingsArn,network_settings_arn +networkSite,network_site +networkSiteArn,network_site_arn +networkSiteName,network_site_name +networkSites,network_sites +networking,networking +networks,networks +neutral,neutral +newApplicationName,new_application_name +newApprovalRuleTemplateName,new_approval_rule_template_name +newAutoRegistrationStatus,new_auto_registration_status +newBGPPeer,new_bgp_peer +newDeploymentGroupName,new_deployment_group_name +newDirectConnectGatewayName,new_direct_connect_gateway_name +newDiskName,new_disk_name +newExecutionRunId,new_execution_run_id +newFindings,new_findings +newImageDescription,new_image_description +newImageDisplayName,new_image_display_name +newImageName,new_image_name +newImageTags,new_image_tags +newName,new_name +newPrivateVirtualInterface,new_private_virtual_interface +newPrivateVirtualInterfaceAllocation,new_private_virtual_interface_allocation +newPublicVirtualInterface,new_public_virtual_interface +newPublicVirtualInterfaceAllocation,new_public_virtual_interface_allocation +newRevision,new_revision +newRuleContent,new_rule_content +newStatus,new_status +newTableName,new_table_name +newTransitVirtualInterface,new_transit_virtual_interface +newTransitVirtualInterfaceAllocation,new_transit_virtual_interface_allocation +newValue,new_value +next,next +nextAttemptDateTime,next_attempt_date_time +nextBackwardToken,next_backward_token +nextDeliveryTime,next_delivery_time +nextDeployment,next_deployment +nextForwardToken,next_forward_token +nextIndex,next_index +nextMarker,next_marker +nextPageCount,next_page_count +nextPageToken,next_page_token +nextPeriod,next_period +nextRefreshTime,next_refresh_time +nextReplicationRunStartTime,next_replication_run_start_time +nextSequenceToken,next_sequence_token +nextSnapshotTimeOfDay,next_snapshot_time_of_day +nextState,next_state +nextStep,next_step +nextToken,next_token +nfc,nfc +nluConfidence,nlu_confidence +nluIntentConfidence,nlu_intent_confidence +nluIntentConfidenceThreshold,nlu_intent_confidence_threshold +nniPartnerType,nni_partner_type +noDevice,no_device +noEcho,no_echo +noInlineDocumentSupport,no_inline_document_support +noOfSrvCompleted,no_of_srv_completed +noOfSrvFailed,no_of_srv_failed +nodeCount,node_count +nodeCounts,node_counts +nodeDetails,node_details +nodeGroup,node_group +nodeId,node_id +nodeIndex,node_index +nodeLabels,node_labels +nodeName,node_name +nodeOverrides,node_overrides +nodeProperties,node_properties +nodePropertyOverrides,node_property_overrides +nodeRangeProperties,node_range_properties +nodeRole,node_role +nodeStructures,node_structures +nodeSummaries,node_summaries +nodeType,node_type +nodegroup,nodegroup +nodegroupArn,nodegroup_arn +nodegroupName,nodegroup_name +nodegroups,nodegroups +nodes,nodes +nodesToAdd,nodes_to_add +nodesToRemove,nodes_to_remove +nodesToUpdate,nodes_to_update +nonCompliantChecks,non_compliant_checks +nonCompliantResource,non_compliant_resource +nonCompliantResourcesCount,non_compliant_resources_count +nonModels,non_models +nonce,nonce +noncompliantEvidenceCount,noncompliant_evidence_count +noradSatelliteID,norad_satellite_id +notAfter,not_after +notBefore,not_before +notClassified,not_classified +notFoundIdentifierIds,not_found_identifier_ids +notSensitive,not_sensitive +notShared,not_shared +notValidAfter,not_valid_after +notValidBefore,not_valid_before +note,note +notification,notification +notificationActions,notification_actions +notificationConfiguration,notification_configuration +notificationContext,notification_context +notificationDestinations,notification_destinations +notificationEnabled,notification_enabled +notificationEndpoint,notification_endpoint +notificationLambdaArn,notification_lambda_arn +notificationSenderEmail,notification_sender_email +notificationSettingKeys,notification_setting_keys +notificationSettings,notification_settings +notificationTargets,notification_targets +notificationTriggers,notification_triggers +notifications,notifications +notifyOnAddCorrespondenceToCase,notify_on_add_correspondence_to_case +notifyOnCaseSeverity,notify_on_case_severity +notifyOnCreateOrReopenCase,notify_on_create_or_reopen_case +notifyOnResolveCase,notify_on_resolve_case +nsDescription,ns_description +nsInstanceDescription,ns_instance_description +nsInstanceId,ns_instance_id +nsInstanceName,ns_instance_name +nsLcmOpOccId,ns_lcm_op_occ_id +nsName,ns_name +nsState,ns_state +nsd,nsd +nsdContent,nsd_content +nsdDesigner,nsd_designer +nsdId,nsd_id +nsdInfoId,nsd_info_id +nsdInvariantId,nsd_invariant_id +nsdName,nsd_name +nsdOnboardingState,nsd_onboarding_state +nsdOperationalState,nsd_operational_state +nsdUsageState,nsd_usage_state +nsdVersion,nsd_version +nullable,nullable +numBytes,num_bytes +numChangesets,num_changesets +numClasses,num_classes +numDistinctPredicates,num_distinct_predicates +numDistinctSubjects,num_distinct_subjects +numEdgeLabels,num_edge_labels +numEdgeProperties,num_edge_properties +numEdges,num_edges +numFiles,num_files +numNodeLabels,num_node_labels +numNodeProperties,num_node_properties +numNodes,num_nodes +numOfReports,num_of_reports +numParallelProcesses,num_parallel_processes +numQuads,num_quads +numResults,num_results +numTurns,num_turns +numValues,num_values +numVersions,num_versions +number,number +numberOfApplicationComponents,number_of_application_components +numberOfAssociatedServices,number_of_associated_services +numberOfAssociatedVPCs,number_of_associated_vpcs +numberOfCanceledThings,number_of_canceled_things +numberOfConflicts,number_of_conflicts +numberOfConnections,number_of_connections +numberOfCores,number_of_cores +numberOfDays,number_of_days +numberOfEvents,number_of_events +numberOfFailedThings,number_of_failed_things +numberOfInProgressThings,number_of_in_progress_things +numberOfInvocations,number_of_invocations +numberOfMemberAccountsOptedIn,number_of_member_accounts_opted_in +numberOfNotifiedThings,number_of_notified_things +numberOfQueuedThings,number_of_queued_things +numberOfRecentAmisToKeep,number_of_recent_amis_to_keep +numberOfRecordsFailed,number_of_records_failed +numberOfRecordsSuccess,number_of_records_success +numberOfRecordsUpdated,number_of_records_updated +numberOfRejectedThings,number_of_rejected_things +numberOfRemovedThings,number_of_removed_things +numberOfRetries,number_of_retries +numberOfRevisions,number_of_revisions +numberOfRuns,number_of_runs +numberOfSucceededThings,number_of_succeeded_things +numberOfTimedOutThings,number_of_timed_out_things +numberOfTransactions,number_of_transactions +numberOfTurns,number_of_turns +numbers,numbers +numericSeverity,numeric_severity +oAuth2Credentials,o_auth2_credentials +oAuth2Defaults,o_auth2_defaults +oAuth2GrantType,o_auth2_grant_type +oAuth2Properties,o_auth2_properties +oAuthCredentials,o_auth_credentials +oAuthProperties,o_auth_properties +oAuthRequest,o_auth_request +oAuthScopes,o_auth_scopes +oauth2,oauth2 +oauth2CustomProperties,oauth2_custom_properties +oauth2GrantTypesSupported,oauth2_grant_types_supported +oauthScopes,oauth_scopes +oauthToken,oauth_token +obdInterface,obd_interface +obdSignal,obd_signal +obdStandard,obd_standard +obfuscate,obfuscate +obfuscationSetting,obfuscation_setting +obfuscationSettingType,obfuscation_setting_type +object,object +objectCount,object_count +objectCountByEncryptionType,object_count_by_encryption_type +objectFields,object_fields +objectId,object_id +objectIds,object_ids +objectKey,object_key +objectName,object_name +objectPath,object_path +objectPrefixes,object_prefixes +objectType,object_type +objectTypeConflict,object_type_conflict +objectTypeName,object_type_name +objectTypes,object_types +objectVersion,object_version +objectVersioning,object_versioning +objectiveSensitivity,objective_sensitivity +objects,objects +occurrences,occurrences +occurrencesThreshold,occurrences_threshold +oemData,oem_data +offering,offering +offeringClass,offering_class +offeringId,offering_id +offeringIds,offering_ids +offeringPromotionId,offering_promotion_id +offeringPromotions,offering_promotions +offeringStatus,offering_status +offeringTransaction,offering_transaction +offeringTransactions,offering_transactions +offerings,offerings +offset,offset +offsetInNanos,offset_in_nanos +offsetRange,offset_range +offsetRanges,offset_ranges +offsetSeconds,offset_seconds +ofi,ofi +oidc,oidc +oldApprovalRuleTemplateName,old_approval_rule_template_name +oldName,old_name +oldestDate,oldest_date +onEnter,on_enter +onExit,on_exit +onExitCode,on_exit_code +onFailure,on_failure +onInput,on_input +onPremisesInstanceTagFilters,on_premises_instance_tag_filters +onPremisesTagSet,on_premises_tag_set +onPremisesTagSetList,on_premises_tag_set_list +onReason,on_reason +onStatusReason,on_status_reason +onboardingState,onboarding_state +oneTime,one_time +onlineAbConfig,online_ab_config +onlineAbDefinition,online_ab_definition +onlyActiveViolationsIncluded,only_active_violations_included +onlyAssociated,only_associated +op,op +opNum,op_num +openActivityTasks,open_activity_tasks +openChildWorkflowExecutions,open_child_workflow_executions +openCounts,open_counts +openCypherQuery,open_cypher_query +openDecisionTasks,open_decision_tasks +openFindings,open_findings +openIDConnectConfig,open_id_connect_config +openIdIssuer,open_id_issuer +openLambdaFunctions,open_lambda_functions +openPortRange,open_port_range +openSearch,open_search +openSearchServiceConfig,open_search_service_config +openTimers,open_timers +opencypher,opencypher +operand,operand +operandType,operand_type +operatingSystem,operating_system +operatingSystemFamily,operating_system_family +operatingSystems,operating_systems +operation,operation +operationDetails,operation_details +operationId,operation_id +operationIdentifier,operation_identifier +operationName,operation_name +operationState,operation_state +operationSucceeded,operation_succeeded +operationType,operation_type +operationalState,operational_state +operations,operations +operator,operator +optimizationObjective,optimization_objective +optimizationType,optimization_type +optimizedStagingDiskType,optimized_staging_disk_type +option,option +optional,optional +options,options +or,or +order,order +orderArn,order_arn +orderBy,order_by +orderByTime,order_by_time +orderedResources,ordered_resources +orders,orders +org,org +orgPackagePaths,org_package_paths +organizationArns,organization_arns +organizationEntityAccountFilters,organization_entity_account_filters +organizationEntityAggregates,organization_entity_aggregates +organizationEntityFilters,organization_entity_filters +organizationEventDetailFilters,organization_event_detail_filters +organizationId,organization_id +organizationRoleName,organization_role_name +organizationalUnitArns,organizational_unit_arns +organizationalUnitDistinguishedName,organizational_unit_distinguished_name +organizationalUnits,organizational_units +orientation,orientation +origin,origin +originAccountID,origin_account_id +originApprovalRuleTemplate,origin_approval_rule_template +originAvailabilityZone,origin_availability_zone +originConfiguration,origin_configuration +originEnvironment,origin_environment +originPublicDNS,origin_public_dns +originRegion,origin_region +originType,origin_type +originalDiskPath,original_disk_path +originalMessage,original_message +originalStatusCode,original_status_code +originalValue,original_value +originatingRequestId,originating_request_id +orphanedResources,orphaned_resources +os,os +osByol,os_byol +osDriver,os_driver +osInfo,os_info +osType,os_type +osVersion,os_version +otaUpdateArn,ota_update_arn +otaUpdateFiles,ota_update_files +otaUpdateId,ota_update_id +otaUpdateInfo,ota_update_info +otaUpdateStatus,ota_update_status +otaUpdates,ota_updates +outboundCallConfig,outbound_call_config +outcomes,outcomes +outdatedInstancesStrategy,outdated_instances_strategy +outerPadding,outer_padding +outgoingCertificates,outgoing_certificates +outlierDetection,outlier_detection +outpostArns,outpost_arns +outpostConfig,outpost_config +output,output +outputArtifactDetails,output_artifact_details +outputArtifacts,output_artifacts +outputConfiguration,output_configuration +outputConstraints,output_constraints +outputContexts,output_contexts +outputDataConfig,output_data_config +outputDetails,output_details +outputFileUriValue,output_file_uri_value +outputFormat,output_format +outputLocation,output_location +outputModalities,output_modalities +outputModelArn,output_model_arn +outputModelKmsKeyArn,output_model_kms_key_arn +outputModelName,output_model_name +outputNode,output_node +outputPath,output_path +outputResources,output_resources +outputS3Bucket,output_s3_bucket +outputS3BucketName,output_s3_bucket_name +outputS3Directory,output_s3_directory +outputS3KeyPrefix,output_s3_key_prefix +outputS3Path,output_s3_path +outputS3Uri,output_s3_uri +outputSourceConfig,output_source_config +outputToken,output_token +outputType,output_type +outputUri,output_uri +outputVariableName,output_variable_name +outputVariables,output_variables +outputs,outputs +overallStatus,overall_status +overallTestResults,overall_test_results +overridden,overridden +overrideAlarmConfiguration,override_alarm_configuration +overrideAllowedPrefixesToDirectConnectGateway,override_allowed_prefixes_to_direct_connect_gateway +overrideArtifactName,override_artifact_name +overrideDynamicGroups,override_dynamic_groups +overrideFormat,override_format +overrideLinkOutUri,override_link_out_uri +overrideStatus,override_status +overrider,overrider +overrides,overrides +ownedBy,owned_by +owner,owner +ownerAccount,owner_account +ownerArn,owner_arn +ownerContact,owner_contact +ownerFilter,owner_filter +ownerId,owner_id +ownerIdentifier,owner_identifier +ownerInfo,owner_info +owners,owners +ownershipVerificationCertificateArn,ownership_verification_certificate_arn +owningAccountId,owning_account_id +package,package +packageArn,package_arn +packageCleanup,package_cleanup +packageContent,package_content +packageFormat,package_format +packageManager,package_manager +packageName,package_name +packageNames,package_names +packagePaths,package_paths +packagePrefix,package_prefix +packageSummaries,package_summaries +packageType,package_type +packageVersion,package_version +packageVersionArn,package_version_arn +packageVersionRevision,package_version_revision +packageVersionSummaries,package_version_summaries +packageVulnerabilityDetails,package_vulnerability_details +packages,packages +packaging,packaging +packetsDropped,packets_dropped +page,page +pageNumber,page_number +pageSize,page_size +pageToken,page_token +pagerDutyIncidentConfiguration,pager_duty_incident_configuration +pages,pages +paginated,paginated +paginationConfig,pagination_config +parallelRun,parallel_run +parallelism,parallelism +parallelismConfig,parallelism_config +parameter,parameter +parameterApplyStatus,parameter_apply_status +parameterConfiguration,parameter_configuration +parameterKey,parameter_key +parameterName,parameter_name +parameterObjects,parameter_objects +parameterSets,parameter_sets +parameterTemplate,parameter_template +parameterType,parameter_type +parameterValue,parameter_value +parameterValues,parameter_values +parameters,parameters +params,params +parent,parent +parentAssetId,parent_asset_id +parentBotNetworks,parent_bot_networks +parentCommitId,parent_commit_id +parentConnectionId,parent_connection_id +parentEntityId,parent_entity_id +parentEntityUpdate,parent_entity_update +parentGroup,parent_group +parentGroupName,parent_group_name +parentGroupNames,parent_group_names +parentId,parent_id +parentIdentifier,parent_identifier +parentImage,parent_image +parentInitiatedEventId,parent_initiated_event_id +parentIntentSignature,parent_intent_signature +parentResourceName,parent_resource_name +parentSlotTypeSignature,parent_slot_type_signature +parentTargetArn,parent_target_arn +parentWorkflowExecution,parent_workflow_execution +parents,parents +parquetConfiguration,parquet_configuration +parserConfiguration,parser_configuration +parsingResultUrl,parsing_result_url +partFirstByte,part_first_byte +partLastByte,part_last_byte +partNumber,part_number +partSize,part_size +partSource,part_source +partial,partial +participant,participant +participantId,participant_id +participantToken,participant_token +participantTokenConfigurations,participant_token_configurations +participantTokens,participant_tokens +participants,participants +participatingResourceID,participating_resource_id +participatingResources,participating_resources +participatingServers,participating_servers +partition,partition +partitionColumns,partition_columns +partitionKey,partition_key +partitionKeys,partition_keys +partitionRegistrationOutput,partition_registration_output +partitions,partitions +partner,partner +partnerName,partner_name +parts,parts +passed,passed +passthroughBehavior,passthrough_behavior +password,password +passwordData,password_data +passwordVersion,password_version +pasteAllowed,paste_allowed +patchOperations,patch_operations +path,path +pathFormat,path_format +pathMatch,path_match +pathPart,path_part +pathPrefixHierarchy,path_prefix_hierarchy +pathWithQueryString,path_with_query_string +pattern,pattern +payload,payload +payloadField,payload_field +payloadFormat,payload_format +payloadFormatIndicator,payload_format_indicator +payloadSize,payload_size +payloadUrl,payload_url +payloadVersion,payload_version +payloads,payloads +paymentOption,payment_option +paymentOptions,payment_options +pemEncodedCertificate,pem_encoded_certificate +pending,pending +pendingCount,pending_count +pendingMaintenance,pending_maintenance +pendingMaintenanceActions,pending_maintenance_actions +pendingModifiedValues,pending_modified_values +pendingPlan,pending_plan +pendingPricingPlan,pending_pricing_plan +pendingRequestCount,pending_request_count +pendingRequests,pending_requests +pendingTasksCount,pending_tasks_count +perRequest,per_request +perRetryTimeout,per_retry_timeout +percent,percent +percentComplete,percent_complete +percentDone,percent_done +percentPromotedItems,percent_promoted_items +percentTraffic,percent_traffic +percentageAdjust,percentage_adjust +percentageComplete,percentage_complete +percentageProgress,percentage_progress +percentiles,percentiles +percents,percents +performAutoML,perform_auto_ml +performHPO,perform_hpo +performanceRisk,performance_risk +period,period +periodInSeconds,period_in_seconds +periodMs,period_ms +permission,permission +permissionArn,permission_arn +permissionArns,permission_arns +permissionConfiguration,permission_configuration +permissionGroup,permission_group +permissionGroupId,permission_group_id +permissionGroupParams,permission_group_params +permissionGroups,permission_groups +permissionModel,permission_model +permissionStatus,permission_status +permissionType,permission_type +permissionVersion,permission_version +permissions,permissions +persistentAppUI,persistent_app_ui +persistentStorage,persistent_storage +persona,persona +personalizedRanking,personalized_ranking +phaseStatus,phase_status +phaseType,phase_type +phases,phases +phoneNumber,phone_number +phoneNumbers,phone_numbers +phrase,phrase +physicalConnectorType,physical_connector_type +physicalNetworkInterfaceId,physical_network_interface_id +physicalNetworkInterfaces,physical_network_interfaces +physicalResource,physical_resource +physicalResourceId,physical_resource_id +physicalResources,physical_resources +pid,pid +pidMode,pid_mode +pidRequestIntervalSeconds,pid_request_interval_seconds +pidResponseLength,pid_response_length +pinned,pinned +pipeline,pipeline +pipelineActivities,pipeline_activities +pipelineActivity,pipeline_activity +pipelineArn,pipeline_arn +pipelineCodebuildRoleArn,pipeline_codebuild_role_arn +pipelineConfig,pipeline_config +pipelineConfigurationTimeStamp,pipeline_configuration_time_stamp +pipelineContext,pipeline_context +pipelineDescriptionList,pipeline_description_list +pipelineExecution,pipeline_execution +pipelineExecutionId,pipeline_execution_id +pipelineExecutionStartCondition,pipeline_execution_start_condition +pipelineExecutionSummaries,pipeline_execution_summaries +pipelineId,pipeline_id +pipelineIdList,pipeline_id_list +pipelineIds,pipeline_ids +pipelineInfoList,pipeline_info_list +pipelineName,pipeline_name +pipelineObjects,pipeline_objects +pipelineProvisioning,pipeline_provisioning +pipelineProvisioningRepository,pipeline_provisioning_repository +pipelineServiceRoleArn,pipeline_service_role_arn +pipelineSummaries,pipeline_summaries +pipelineType,pipeline_type +pipelineVersion,pipeline_version +pipelines,pipelines +pitPolicy,pit_policy +placeholder,placeholder +placement,placement +placementConstraints,placement_constraints +placementGroup,placement_group +placementName,placement_name +placementStrategy,placement_strategy +placementTemplate,placement_template +placements,placements +plainTextMessage,plain_text_message +planDescription,plan_description +planType,plan_type +planTypes,plan_types +platform,platform +platformCapabilities,platform_capabilities +platformDevices,platform_devices +platformDifferences,platform_differences +platformDisplayName,platform_display_name +platformFamily,platform_family +platformId,platform_id +platformOverride,platform_override +platformVersion,platform_version +platformVersions,platform_versions +platforms,platforms +playbackUrl,playback_url +pluginId,plugin_id +plugins,plugins +podExecutionRoleArn,pod_execution_role_arn +podName,pod_name +podProperties,pod_properties +pointInTimeRecovery,point_in_time_recovery +pointInTimeRecoveryOverride,point_in_time_recovery_override +pointInTimeSnapshotDateTime,point_in_time_snapshot_date_time +polarization,polarization +policies,policies +policy,policy +policyArn,policy_arn +policyDescription,policy_description +policyDetails,policy_details +policyDocument,policy_document +policyDocuments,policy_documents +policyGenerationDetails,policy_generation_details +policyGenerations,policy_generations +policyId,policy_id +policyName,policy_name +policyNamesToAdd,policy_names_to_add +policyNamesToSkip,policy_names_to_skip +policyRevision,policy_revision +policySizeBytes,policy_size_bytes +policyStatementsTemplate,policy_statements_template +policyStoreId,policy_store_id +policyStores,policy_stores +policyTemplate,policy_template +policyTemplateId,policy_template_id +policyTemplates,policy_templates +policyText,policy_text +policyType,policy_type +policyVersion,policy_version +policyVersionId,policy_version_id +policyVersionIdentifier,policy_version_identifier +policyVersions,policy_versions +pollingAccounts,polling_accounts +pollingDisabledAt,polling_disabled_at +pollingServicePrincipals,polling_service_principals +port,port +portEncryptionStatus,port_encryption_status +portForwardingConfig,port_forwarding_config +portInfo,port_info +portInfoSource,port_info_source +portInformationNeeded,port_information_needed +portInfos,port_infos +portMapping,port_mapping +portMappings,port_mappings +portName,port_name +portNumber,port_number +portRange,port_range +portStates,port_states +portal,portal +portalArn,portal_arn +portalAuthMode,portal_auth_mode +portalClientId,portal_client_id +portalContactEmail,portal_contact_email +portalCreationDate,portal_creation_date +portalDescription,portal_description +portalEndpoint,portal_endpoint +portalId,portal_id +portalLastUpdateDate,portal_last_update_date +portalLogoImage,portal_logo_image +portalLogoImageFile,portal_logo_image_file +portalLogoImageLocation,portal_logo_image_location +portalName,portal_name +portalStartUrl,portal_start_url +portalStatus,portal_status +portalSummaries,portal_summaries +portals,portals +ports,ports +position,position +positive,positive +posixUser,posix_user +postCodeHookSpecification,post_code_hook_specification +postDirectional,post_directional +postFulfillmentStatusSpecification,post_fulfillment_status_specification +postLaunchActions,post_launch_actions +postLaunchActionsLaunchStatusList,post_launch_actions_launch_status_list +postLaunchActionsStatus,post_launch_actions_status +postLaunchEnabled,post_launch_enabled +postLaunchFile,post_launch_file +postPassEndTime,post_pass_end_time +postTriggerCollectionDuration,post_trigger_collection_duration +postalCode,postal_code +postalCodePlus4,postal_code_plus4 +postedDate,posted_date +power,power +powerId,power_id +powers,powers +preDirectional,pre_directional +preLaunchFile,pre_launch_file +prePassStartTime,pre_pass_start_time +preProvisioningHook,pre_provisioning_hook +preSignedUrl,pre_signed_url +precision,precision +predicate,predicate +predicateCount,predicate_count +predicates,predicates +predictedLabel,predicted_label +predictedScores,predicted_scores +predictedValue,predicted_value +predictionExplanations,prediction_explanations +predictionTimeRange,prediction_time_range +predictionTimestamp,prediction_timestamp +preferences,preferences +preferredBackupWindow,preferred_backup_window +preferredMaintenanceWindow,preferred_maintenance_window +preferredRegion,preferred_region +prefix,prefix +prefixConfig,prefix_config +prefixFormat,prefix_format +prefixListIds,prefix_list_ids +prefixType,prefix_type +prerequisite,prerequisite +preserve,preserve +preserveNulls,preserve_nulls +preserveSourceDataTyping,preserve_source_data_typing +preset,preset +presignedUrlConfig,presigned_url_config +previewAgentsArn,preview_agents_arn +previewResults,preview_results +previewStatus,preview_status +previewToken,preview_token +previous,previous +previousDataProcessingJobId,previous_data_processing_job_id +previousEventId,previous_event_id +previousModelTrainingJobId,previous_model_training_job_id +previousOwnedBy,previous_owned_by +previousRevision,previous_revision +previousStartedEventId,previous_started_event_id +price,price +pricingMode,pricing_mode +pricingTier,pricing_tier +pricingUnit,pricing_unit +primaryArtifact,primary_artifact +primaryDevice,primary_device +primaryEmail,primary_email +primaryKey,primary_key +primaryKeyColumns,primary_key_columns +primaryKeys,primary_keys +primaryRegistryAlias,primary_registry_alias +primaryTaskSet,primary_task_set +principal,principal +principalArn,principal_arn +principalEntityType,principal_entity_type +principalId,principal_id +principalSubscriber,principal_subscriber +principals,principals +printAllowed,print_allowed +priorBuildSummaryList,prior_build_summary_list +prioritizeBusinessGoals,prioritize_business_goals +priority,priority +privateConnectionProvisioningState,private_connection_provisioning_state +privateDnsName,private_dns_name +privateDomainName,private_domain_name +privateIpAddress,private_ip_address +privateIpAddresses,private_ip_addresses +privateIpv4Address,private_ipv4_address +privateKey,private_key +privateKeyBase64,private_key_base64 +privateLinkServiceName,private_link_service_name +privateRegistryAccess,private_registry_access +privateRepository,private_repository +privileged,privileged +privilegedMode,privileged_mode +privilegedModeOverride,privileged_mode_override +problems,problems +processBehavior,process_behavior +processedDataS3Location,processed_data_s3_location +processedRecordsCount,processed_records_count +processingConfig,processing_config +processingConfiguration,processing_configuration +processingInstanceType,processing_instance_type +processingInstanceVolumeSizeInGB,processing_instance_volume_size_in_gb +processingJob,processing_job +processingTargets,processing_targets +processingTimeOutInSeconds,processing_time_out_in_seconds +prodTrafficRoute,prod_traffic_route +productCode,product_code +productId,product_id +productType,product_type +productTypes,product_types +productUrl,product_url +productionBranch,production_branch +products,products +profile,profile +profileArn,profile_arn +profileEndTime,profile_end_time +profileId,profile_id +profileName,profile_name +profileOwner,profile_owner +profileProperties,profile_properties +profileStartTime,profile_start_time +profileTimes,profile_times +profileToken,profile_token +profileUpdatedAt,profile_updated_at +profileVersion,profile_version +profileVersionArn,profile_version_arn +profiles,profiles +profilingEnabled,profiling_enabled +profilingGroup,profiling_group +profilingGroupName,profiling_group_name +profilingGroupNames,profiling_group_names +profilingGroups,profiling_groups +profilingStatus,profiling_status +progress,progress +progressDetail,progress_detail +progressInMegaBytes,progress_in_mega_bytes +progressPercentage,progress_percentage +progressStatus,progress_status +project,project +projectArn,project_arn +projectCreationDate,project_creation_date +projectDescription,project_description +projectId,project_id +projectInformation,project_information +projectLastUpdateDate,project_last_update_date +projectName,project_name +projectRole,project_role +projectSummaries,project_summaries +projectTemplateId,project_template_id +projectVisibility,project_visibility +projectedMetrics,projected_metrics +projectedUtilizationMetrics,projected_utilization_metrics +projects,projects +projectsNotFound,projects_not_found +prometheusEndpoint,prometheus_endpoint +promotionName,promotion_name +promotions,promotions +prompt,prompt +promptAttemptsSpecification,prompt_attempts_specification +promptSpecification,prompt_specification +propagateTags,propagate_tags +properties,properties +propertiesFileContent,properties_file_content +property,property +propertyAlias,property_alias +propertyDefinitions,property_definitions +propertyFilters,property_filters +propertyGroupName,property_group_name +propertyGroupUpdates,property_group_updates +propertyGroups,property_groups +propertyId,property_id +propertyName,property_name +propertyNames,property_names +propertyNotificationState,property_notification_state +propertyReference,property_reference +propertyUnit,property_unit +propertyUpdates,property_updates +propertyValue,property_value +propertyValues,property_values +proposalId,proposal_id +proposalState,proposal_state +protectedQueries,protected_queries +protectedQuery,protected_query +protectedQueryIdentifier,protected_query_identifier +protectedTasks,protected_tasks +protectionEnabled,protection_enabled +protocol,protocol +protocolDefinition,protocol_definition +protocolName,protocol_name +protocolPolicy,protocol_policy +protocolVersion,protocol_version +protocols,protocols +protonServiceRoleArn,proton_service_role_arn +provider,provider +providerARNs,provider_arns +providerArn,provider_arn +providerIdentity,provider_identity +providerName,provider_name +providers,providers +provisionedCapacity,provisioned_capacity +provisionedModelArn,provisioned_model_arn +provisionedModelId,provisioned_model_id +provisionedModelName,provisioned_model_name +provisionedModelSummaries,provisioned_model_summaries +provisionedResources,provisioned_resources +provisioning,provisioning +provisioningEngine,provisioning_engine +provisioningRepository,provisioning_repository +provisioningRoleArn,provisioning_role_arn +proxyConfiguration,proxy_configuration +proxyEndpoint,proxy_endpoint +pseudoTerminal,pseudo_terminal +publicAccess,public_access +publicAccessBlock,public_access_block +publicAccessCidrs,public_access_cidrs +publicDnsName,public_dns_name +publicDomainNames,public_domain_names +publicEndpoint,public_endpoint +publicIp,public_ip +publicIpAddress,public_ip_address +publicIpAddresses,public_ip_addresses +publicKey,public_key +publicKeyBase64,public_key_base64 +publicKeyMaterial,public_key_material +publicPorts,public_ports +publicProjectAlias,public_project_alias +publiclyAccessible,publicly_accessible +publiclyAccessibleCount,publicly_accessible_count +publiclyReadable,publicly_readable +publiclyWritable,publicly_writable +publish,publish +publishAttributionMetricsToS3,publish_attribution_metrics_to_s3 +publishClassificationFindings,publish_classification_findings +publishFindingToSnsParams,publish_finding_to_sns_params +publishPolicyFindings,publish_policy_findings +published,published +publishedTime,published_time +publisher,publisher +publishers,publishers +pullRequest,pull_request +pullRequestCreatedEventMetadata,pull_request_created_event_metadata +pullRequestEnvironmentName,pull_request_environment_name +pullRequestEventType,pull_request_event_type +pullRequestEvents,pull_request_events +pullRequestId,pull_request_id +pullRequestIds,pull_request_ids +pullRequestMergedStateChangedEventMetadata,pull_request_merged_state_changed_event_metadata +pullRequestSourceReferenceUpdatedEventMetadata,pull_request_source_reference_updated_event_metadata +pullRequestStatus,pull_request_status +pullRequestStatusChangedEventMetadata,pull_request_status_changed_event_metadata +pullRequestTargets,pull_request_targets +pullStartedAt,pull_started_at +pullStoppedAt,pull_stopped_at +pullThroughCacheRules,pull_through_cache_rules +purchaseTime,purchase_time +purchasingOption,purchasing_option +pushedAt,pushed_at +putAssetPropertyValueEntries,put_asset_property_value_entries +putFailuresCount,put_failures_count +putFiles,put_files +putItem,put_item +qos,qos +qualificationReportDownloadUrl,qualification_report_download_url +qualities,qualities +quality,quality +quantity,quantity +quantumTaskArn,quantum_task_arn +quantumTasks,quantum_tasks +queries,queries +queriesFilePath,queries_file_path +query,query +queryAction,query_action +queryCompileError,query_compile_error +queryDefinitionId,query_definition_id +queryDefinitionNamePrefix,query_definition_name_prefix +queryDefinitions,query_definitions +queryEvalStats,query_eval_stats +queryFilterString,query_filter_string +queryFilterStringEnabled,query_filter_string_enabled +queryId,query_id +queryLogStatus,query_log_status +queryOptions,query_options +queryParam,query_param +queryParameters,query_parameters +queryParser,query_parser +queryStatement,query_statement +queryString,query_string +queryStringsAllowList,query_strings_allow_list +queryText,query_text +queryVersion,query_version +queryable,queryable +queue,queue +queueInfo,queue_info +queuePolicy,queue_policy +queuePriority,queue_priority +queueRequest,queue_request +queueSize,queue_size +queueUrl,queue_url +queueUrls,queue_urls +queuedAt,queued_at +queuedJobs,queued_jobs +queuedTimeoutInMinutes,queued_timeout_in_minutes +queuedTimeoutInMinutesOverride,queued_timeout_in_minutes_override +quota,quota +quotaCode,quota_code +quotaName,quota_name +quotaValue,quota_value +quote,quote +quoteAll,quote_all +r53HostedZoneDeletionState,r53_hosted_zone_deletion_state +radio,radio +radios,radios +ramBytes,ram_bytes +ramPerformanceMetricBasis,ram_performance_metric_basis +ramResourceShareRegion,ram_resource_share_region +ramSizeInGb,ram_size_in_gb +randomizationSalt,randomization_salt +range,range +rangeKeyField,range_key_field +rangeKeyType,range_key_type +rangeKeyValue,range_key_value +rank,rank +rate,rate +rateIncreaseCriteria,rate_increase_criteria +rateLimit,rate_limit +rawData,raw_data +rawError,raw_error +rawValue,raw_value +rdsHttpEndpointConfig,rds_http_endpoint_config +reaction,reaction +reactionCounts,reaction_counts +reactionUserArn,reaction_user_arn +reactionUsers,reaction_users +reactionValue,reaction_value +reactionsForComment,reactions_for_comment +reactionsFromDeletedUsersCount,reactions_from_deleted_users_count +readCapacityUnits,read_capacity_units +readOnly,read_only +readOnlyRootFilesystem,read_only_root_filesystem +readOptions,read_options +readSetId,read_set_id +readSets,read_sets +readme,readme +readonlyAccessAccounts,readonly_access_accounts +readonlyRootFilesystem,readonly_root_filesystem +reason,reason +reasonCode,reason_code +reasonCodeSummaries,reason_code_summaries +reasonForNonCompliance,reason_for_non_compliance +reasonForNonComplianceCode,reason_for_non_compliance_code +reasons,reasons +rebootAfterUse,reboot_after_use +receiverAccountId,receiver_account_id +receiverArn,receiver_arn +recentCommunications,recent_communications +recentIntentSummaryView,recent_intent_summary_view +recipe,recipe +recipeArn,recipe_arn +recipeList,recipe_list +recipeOutputFormat,recipe_output_format +recipeProvider,recipe_provider +recipeType,recipe_type +recipes,recipes +recipients,recipients +recognizedBotMember,recognized_bot_member +recommendation,recommendation +recommendationCompliance,recommendation_compliance +recommendationExportJobs,recommendation_export_jobs +recommendationId,recommendation_id +recommendationIds,recommendation_ids +recommendationOptions,recommendation_options +recommendationPreferenceNames,recommendation_preference_names +recommendationPreferences,recommendation_preferences +recommendationPreferencesDetails,recommendation_preferences_details +recommendationReportDetails,recommendation_report_details +recommendationResourceType,recommendation_resource_type +recommendationSet,recommendation_set +recommendationSourceArn,recommendation_source_arn +recommendationSourceType,recommendation_source_type +recommendationSources,recommendation_sources +recommendationStatus,recommendation_status +recommendationSummaries,recommendation_summaries +recommendationTemplate,recommendation_template +recommendationTemplateArn,recommendation_template_arn +recommendationTemplates,recommendation_templates +recommendationTypes,recommendation_types +recommendations,recommendations +recommended,recommended +recommendedActions,recommended_actions +recommendedCpuUnits,recommended_cpu_units +recommendedInstanceType,recommended_instance_type +recommendedMemorySize,recommended_memory_size +recommendedMinorVersion,recommended_minor_version +recommendedOptionProjectedMetrics,recommended_option_projected_metrics +recommendedVersion,recommended_version +recommender,recommender +recommenderArn,recommender_arn +recommenderConfig,recommender_config +recommenders,recommenders +record,record +recordAllRosTopics,record_all_ros_topics +recordFormat,record_format +recordIndex,record_index +recordLength,record_length +recordMarkerDecisionAttributes,record_marker_decision_attributes +recordMarkerFailedEventAttributes,record_marker_failed_event_attributes +recordNumber,record_number +recording,recording +recordingConfiguration,recording_configuration +recordingConfigurationArn,recording_configuration_arn +recordingConfigurations,recording_configurations +recordingGroup,recording_group +recordingMode,recording_mode +recordingReconnectWindowSeconds,recording_reconnect_window_seconds +recordingStrategy,recording_strategy +records,records +recordsMatched,records_matched +recordsNotProcessed,records_not_processed +recordsProcessed,records_processed +recordsScanned,records_scanned +recoveryInstanceID,recovery_instance_id +recoveryInstanceIDs,recovery_instance_ids +recoveryInstanceId,recovery_instance_id +recoveryInstanceProperties,recovery_instance_properties +recoveryPoint,recovery_point +recoveryPointCreateTime,recovery_point_create_time +recoveryPointId,recovery_point_id +recoveryPoints,recovery_points +recoverySnapshotID,recovery_snapshot_id +recurringCharges,recurring_charges +recurringPaymentAmount,recurring_payment_amount +recursive,recursive +redirectUri,redirect_uri +reduceOperationalOverheadWithManagedServices,reduce_operational_overhead_with_managed_services +ref,ref +refValue,ref_value +reference,reference +referenceArn,reference_arn +referenceId,reference_id +referenceStoreId,reference_store_id +referenceStores,reference_stores +referenceType,reference_type +referenceURLs,reference_urls +referenceUrls,reference_urls +referencedBy,referenced_by +referencedTables,referenced_tables +references,references +refreshAfterInSeconds,refresh_after_in_seconds +refreshToken,refresh_token +refreshTokenBody,refresh_token_body +regex,regex +regexConfiguration,regex_configuration +regexFilter,regex_filter +region,region +regionFilter,region_filter +regionList,region_list +regionMap,region_map +regionName,region_name +regionalCertificateArn,regional_certificate_arn +regionalCertificateName,regional_certificate_name +regionalDomainName,regional_domain_name +regionalHostedZoneId,regional_hosted_zone_id +regions,regions +registerAccountStatus,register_account_status +registerTime,register_time +registeredAt,registered_at +registeredBy,registered_by +registeredContainerInstancesCount,registered_container_instances_count +registeredDomainDelegationInfo,registered_domain_delegation_info +registeredResources,registered_resources +registeredTime,registered_time +registeredTimeStamp,registered_time_stamp +registrationCode,registration_code +registrationConfig,registration_config +registrationStatus,registration_status +registries,registries +registry,registry +registryArn,registry_arn +registryCatalogData,registry_catalog_data +registryCredential,registry_credential +registryCredentialOverride,registry_credential_override +registryId,registry_id +registryIds,registry_ids +registryLogin,registry_login +registryScanningConfiguration,registry_scanning_configuration +registryUri,registry_uri +rejectDate,reject_date +rejectReason,reject_reason +rejectedLogEventsInfo,rejected_log_events_info +rejectionStatement,rejection_statement +rel,rel +relatedDeployments,related_deployments +relatedEvents,related_events +relatedItemArn,related_item_arn +relatedItemData,related_item_data +relatedItemId,related_item_id +relatedItems,related_items +relatedItemsUpdate,related_items_update +relatedJoinFieldName,related_join_field_name +relatedJoinTableName,related_join_table_name +relatedModelFields,related_model_fields +relatedModelName,related_model_name +relatedResources,related_resources +relatedVulnerabilities,related_vulnerabilities +relationalDatabase,relational_database +relationalDatabaseAvailabilityZones,relational_database_availability_zones +relationalDatabaseBlueprintId,relational_database_blueprint_id +relationalDatabaseBundleId,relational_database_bundle_id +relationalDatabaseConfig,relational_database_config +relationalDatabaseEvents,relational_database_events +relationalDatabaseName,relational_database_name +relationalDatabaseSnapshot,relational_database_snapshot +relationalDatabaseSnapshotName,relational_database_snapshot_name +relationalDatabaseSnapshots,relational_database_snapshots +relationalDatabaseSourceType,relational_database_source_type +relationalDatabases,relational_databases +relationship,relationship +relationshipName,relationship_name +relationshipStatus,relationship_status +relationshipType,relationship_type +relationshipValue,relationship_value +relationships,relationships +relativeAggregationDuration,relative_aggregation_duration +relativeFileVersion,relative_file_version +relativeImpact,relative_impact +relativePath,relative_path +release,release +releaseLabel,release_label +releaseVersion,release_version +relevanceLevel,relevance_level +relevanceScore,relevance_score +remaining,remaining +remainingResources,remaining_resources +remediation,remediation +remoteAccess,remote_access +remoteAccessAllowed,remote_access_allowed +remoteAccessEnabled,remote_access_enabled +remoteAccessSecurityGroup,remote_access_security_group +remoteAccessSession,remote_access_session +remoteAccessSessionArn,remote_access_session_arn +remoteAccessSessions,remote_access_sessions +remoteDebugEnabled,remote_debug_enabled +remoteModelTransformJob,remote_model_transform_job +remoteParticipantId,remote_participant_id +remoteRecordAppArn,remote_record_app_arn +remoteRecordEnabled,remote_record_enabled +remoteSourceCodeAnalysisServerConfigurationTimestamp,remote_source_code_analysis_server_configuration_timestamp +remoteSourceCodeAnalysisServerInfo,remote_source_code_analysis_server_info +removableAttributes,removable_attributes +removeAllowedPrefixesToDirectConnectGateway,remove_allowed_prefixes_to_direct_connect_gateway +removeAttributes,remove_attributes +removeAuthorizerConfig,remove_authorizer_config +removeAutoRegistration,remove_auto_registration +removeLabels,remove_labels +removeMetrics,remove_metrics +removeNetworkAccessConfiguration,remove_network_access_configuration +removeOverrideLinkOutUri,remove_override_link_out_uri +removePreProvisioningHook,remove_pre_provisioning_hook +removeSecurityGroupIds,remove_security_group_ids +removeSegment,remove_segment +removeSubnetIds,remove_subnet_ids +removeTaints,remove_taints +removeThingType,remove_thing_type +removeVariations,remove_variations +removeVpcConfiguration,remove_vpc_configuration +renderConfig,render_config +renderTypeDeclarations,render_type_declarations +rendererType,renderer_type +renderingConfiguration,rendering_configuration +renderingEngine,rendering_engine +renditionConfiguration,rendition_configuration +renditionSelection,rendition_selection +renditions,renditions +renewalStatus,renewal_status +renewalStatusReason,renewal_status_reason +renewalSummary,renewal_summary +replace,replace +replaceContents,replace_contents +replaceDefaultPolicyVersionParams,replace_default_policy_version_params +replacePermissionAssociationsWork,replace_permission_associations_work +replacePermissionAssociationsWorks,replace_permission_associations_works +replacementOrderArn,replacement_order_arn +replacementType,replacement_type +replicated,replicated +replicatedDisks,replicated_disks +replicatedExternally,replicated_externally +replicatedStorageBytes,replicated_storage_bytes +replicationAccounts,replication_accounts +replicationConfiguration,replication_configuration +replicationConfigurationStatus,replication_configuration_status +replicationConfigurationTemplateID,replication_configuration_template_id +replicationConfigurationTemplateIDs,replication_configuration_template_ids +replicationDetails,replication_details +replicationDirection,replication_direction +replicationJob,replication_job +replicationJobId,replication_job_id +replicationJobList,replication_job_list +replicationJobTerminated,replication_job_terminated +replicationRegions,replication_regions +replicationRunId,replication_run_id +replicationRunList,replication_run_list +replicationServerInstanceType,replication_server_instance_type +replicationServersSecurityGroupsIDs,replication_servers_security_groups_ids +replicationSet,replication_set +replicationSetArns,replication_set_arns +replicationSpecification,replication_specification +replicationStartedDateTime,replication_started_date_time +replicationStatus,replication_status +replicationStatusDetails,replication_status_details +replicationStatusMessage,replication_status_message +replicationStatuses,replication_statuses +replicationStrategy,replication_strategy +replicationType,replication_type +replicationTypes,replication_types +reportARN,report_arn +reportArn,report_arn +reportArns,report_arns +reportBuildBatchStatusOverride,report_build_batch_status_override +reportBuildStatus,report_build_status +reportBuildStatusOverride,report_build_status_override +reportDefinitions,report_definitions +reportDescription,report_description +reportFileFormat,report_file_format +reportFormat,report_format +reportFrequency,report_frequency +reportGroup,report_group +reportGroupArn,report_group_arn +reportGroupArns,report_group_arns +reportGroups,report_groups +reportGroupsNotFound,report_groups_not_found +reportId,report_id +reportName,report_name +reportNames,report_names +reportSummaries,report_summaries +reportType,report_type +reports,reports +reportsNotFound,reports_not_found +repositories,repositories +repositoriesNotFound,repositories_not_found +repository,repository +repositoryArn,repository_arn +repositoryCloneMethod,repository_clone_method +repositoryConnectionArn,repository_connection_arn +repositoryCount,repository_count +repositoryCredentials,repository_credentials +repositoryDescription,repository_description +repositoryEndpoint,repository_endpoint +repositoryFilters,repository_filters +repositoryId,repository_id +repositoryMetadata,repository_metadata +repositoryName,repository_name +repositoryNames,repository_names +repositoryPolicy,repository_policy +repositoryPrefix,repository_prefix +repositoryProvider,repository_provider +repositoryUri,repository_uri +reprocessingId,reprocessing_id +reprocessingSummaries,reprocessing_summaries +republish,republish +request,request +requestAttributes,request_attributes +requestCancelActivityTaskDecisionAttributes,request_cancel_activity_task_decision_attributes +requestCancelActivityTaskFailedEventAttributes,request_cancel_activity_task_failed_event_attributes +requestCancelExternalWorkflowExecutionDecisionAttributes,request_cancel_external_workflow_execution_decision_attributes +requestCancelExternalWorkflowExecutionFailedEventAttributes,request_cancel_external_workflow_execution_failed_event_attributes +requestCancelExternalWorkflowExecutionInitiatedEventAttributes,request_cancel_external_workflow_execution_initiated_event_attributes +requestCompression,request_compression +requestContentType,request_content_type +requestEntries,request_entries +requestEventStream,request_event_stream +requestFailureReason,request_failure_reason +requestHeaders,request_headers +requestId,request_id +requestMACSec,request_mac_sec +requestMappingTemplate,request_mapping_template +requestMessageId,request_message_id +requestMethod,request_method +requestModels,request_models +requestParameters,request_parameters +requestPayload,request_payload +requestTemplates,request_templates +requestTime,request_time +requestType,request_type +requestValidatorId,request_validator_id +requestedAllowedPrefixesToDirectConnectGateway,requested_allowed_prefixes_to_direct_connect_gateway +requestedAt,requested_at +requestedBy,requested_by +requestedEndTime,requested_end_time +requestedOn,requested_on +requestedStartTime,requested_start_time +requests,requests +requireAuthorizationForCacheControl,require_authorization_for_cache_control +requireInstanceProperties,require_instance_properties +required,required +requiredClaims,required_claims +requiredFields,required_fields +requiredProperties,required_properties +requiresAttributes,requires_attributes +requiresCompatibilities,requires_compatibilities +requiresConfiguration,requires_configuration +rescanDuration,rescan_duration +rescanDurationState,rescan_duration_state +rescannedStorageBytes,rescanned_storage_bytes +reservedCpuCores,reserved_cpu_cores +reservedInstanceOptions,reserved_instance_options +reset,reset +resetActionConfiguration,reset_action_configuration +resetActionRequests,reset_action_requests +resetTimer,reset_timer +resiliencyPolicies,resiliency_policies +resiliencyScore,resiliency_score +resolution,resolution +resolutionId,resolution_id +resolutionSteps,resolution_steps +resolutionStrategy,resolution_strategy +resolutionTechniques,resolution_techniques +resolutionType,resolution_type +resolveConflicts,resolve_conflicts +resolvedAt,resolved_at +resolvedComponentVersions,resolved_component_versions +resolvedConfiguration,resolved_configuration +resolvedImageDigest,resolved_image_digest +resolvedReason,resolved_reason +resolvedSourceVersion,resolved_source_version +resolvedTime,resolved_time +resolvedValues,resolved_values +resolver,resolver +resolverArn,resolver_arn +resolvers,resolvers +resource,resource +resourceARN,resource_arn +resourceAccessRole,resource_access_role +resourceArn,resource_arn +resourceArns,resource_arns +resourceConfiguration,resource_configuration +resourceCount,resource_count +resourceCounts,resource_counts +resourceCreationTime,resource_creation_time +resourceDefinitions,resource_definitions +resourceDeletionTime,resource_deletion_time +resourceDetails,resource_details +resourceDigests,resource_digests +resourceErrors,resource_errors +resourceErrorsDetails,resource_errors_details +resourceFilterCriteria,resource_filter_criteria +resourceGroup,resource_group +resourceGroupArn,resource_group_arn +resourceGroupArns,resource_group_arns +resourceGroupName,resource_group_name +resourceGroupNames,resource_group_names +resourceGroupTags,resource_group_tags +resourceGroups,resource_groups +resourceId,resource_id +resourceIdentifier,resource_identifier +resourceIdentifiers,resource_identifiers +resourceIds,resource_ids +resourceKeys,resource_keys +resourceLinks,resource_links +resourceLogEvents,resource_log_events +resourceMappings,resource_mappings +resourceMetadata,resource_metadata +resourceMethods,resource_methods +resourceName,resource_name +resourceNames,resource_names +resourceOwner,resource_owner +resourceOwnerAccount,resource_owner_account +resourcePolicies,resource_policies +resourcePolicy,resource_policy +resourcePrefix,resource_prefix +resourceRecord,resource_record +resourceRegionScope,resource_region_scope +resourceRequirements,resource_requirements +resourceShare,resource_share +resourceShareArn,resource_share_arn +resourceShareArns,resource_share_arns +resourceShareAssociations,resource_share_associations +resourceShareInvitation,resource_share_invitation +resourceShareInvitationArn,resource_share_invitation_arn +resourceShareInvitationArns,resource_share_invitation_arns +resourceShareInvitations,resource_share_invitations +resourceShareName,resource_share_name +resourceShareStatus,resource_share_status +resourceShares,resource_shares +resourceSpecification,resource_specification +resourceState,resource_state +resourceStatus,resource_status +resourceSubType,resource_sub_type +resourceTags,resource_tags +resourceType,resource_type +resourceTypes,resource_types +resources,resources +resourcesAffected,resources_affected +resourcesBudgetEstimate,resources_budget_estimate +resourcesFlagged,resources_flagged +resourcesIgnored,resources_ignored +resourcesIncluded,resources_included +resourcesProcessed,resources_processed +resourcesReceivingAccess,resources_receiving_access +resourcesSummary,resources_summary +resourcesSuppressed,resources_suppressed +resourcesVpcConfig,resources_vpc_config +response,response +responseCard,response_card +responseContentType,response_content_type +responseEventStream,response_event_stream +responseMappingTemplate,response_mapping_template +responseModels,response_models +responseParameters,response_parameters +responsePayload,response_payload +responsePlanArn,response_plan_arn +responsePlanSummaries,response_plan_summaries +responseStreamingSupported,response_streaming_supported +responseTemplates,response_templates +responseTopic,response_topic +responseType,response_type +responses,responses +restApiId,rest_api_id +restoreDate,restore_date +restoreTime,restore_time +restoreTimestamp,restore_timestamp +restoredTableARN,restored_table_arn +restrictPublicBuckets,restrict_public_buckets +restrictions,restrictions +result,result +resultCode,result_code +resultConfiguration,result_configuration +resultCounts,result_counts +resultFilterBy,result_filter_by +resultFormat,result_format +resultFrame,result_frame +resultId,result_id +resultList,result_list +resultSetMetadata,result_set_metadata +resultSetOptions,result_set_options +resultStat,result_stat +resultStats,result_stats +resultStatus,result_status +resultTypeFilter,result_type_filter +results,results +resultsByTime,results_by_time +resultsData,results_data +resultsWritten,results_written +retain,retain +retainedTopics,retained_topics +retentionDuration,retention_duration +retentionInDays,retention_in_days +retentionMode,retention_mode +retentionPeriod,retention_period +retiringPrincipal,retiring_principal +retries,retries +retryAfter,retry_after +retryAfterSeconds,retry_after_seconds +retryAttempt,retry_attempt +retryMode,retry_mode +retryPolicy,retry_policy +retryPolicyConfiguration,retry_policy_configuration +retryPolicyExecution,retry_policy_execution +retryStrategy,retry_strategy +retryType,retry_type +retryable,retryable +return,return +returnCode,return_code +returnInformation,return_information +returnReason,return_reason +returnValue,return_value +reverseOrder,reverse_order +reversedDirectionSourceServerArn,reversed_direction_source_server_arn +reverted,reverted +revision,revision +revisionChangeId,revision_change_id +revisionChangeIdentifier,revision_change_identifier +revisionChildren,revision_children +revisionDag,revision_dag +revisionId,revision_id +revisionInfo,revision_info +revisionLocation,revision_location +revisionNumber,revision_number +revisionSummary,revision_summary +revisionType,revision_type +revisionUrl,revision_url +revisionUrlTemplate,revision_url_template +revisions,revisions +revocationEffectiveFrom,revocation_effective_from +revocationReason,revocation_reason +revocationRecord,revocation_record +revocationSupported,revocation_supported +revokedAt,revoked_at +revokedBy,revoked_by +revokedEntities,revoked_entities +rewrite,rewrite +rid,rid +risk,risk +riskScore,risk_score +robot,robot +robotApplicationNames,robot_application_names +robotApplicationSummaries,robot_application_summaries +robotApplications,robot_applications +robotDeploymentSummary,robot_deployment_summary +robotDeploymentTimeoutInSeconds,robot_deployment_timeout_in_seconds +robotSoftwareSuite,robot_software_suite +robots,robots +role,role +roleARN,role_arn +roleAlias,role_alias +roleAliasArn,role_alias_arn +roleAliasDescription,role_alias_description +roleAliases,role_aliases +roleArn,role_arn +roleArnForLogging,role_arn_for_logging +roleArns,role_arns +roleCredentials,role_credentials +roleList,role_list +roleName,role_name +roleNameArn,role_name_arn +roleType,role_type +roleValues,role_values +roles,roles +rollDisposition,roll_disposition +rollback,rollback +rollbackDeploymentId,rollback_deployment_id +rollbackInfo,rollback_info +rollbackMessage,rollback_message +rollbackStatus,rollback_status +rollbackTriggeringDeploymentId,rollback_triggering_deployment_id +rollingBackTrxCount,rolling_back_trx_count +rollingBackTrxEarliestStartTime,rolling_back_trx_earliest_start_time +rolloutState,rollout_state +rolloutStateReason,rollout_state_reason +roomIdentifier,room_identifier +rooms,rooms +root,root +rootDeviceName,root_device_name +rootDirectory,root_directory +rootGroup,root_group +rootResourceId,root_resource_id +rootToParentThingGroups,root_to_parent_thing_groups +rootVolume,root_volume +rootVolumeName,root_volume_name +rotateMasterUserPassword,rotate_master_user_password +rotateSecret,rotate_secret +rotationSize,rotation_size +routableCIDRSpace,routable_cidr_space +route,route +routeFilterPrefixes,route_filter_prefixes +routeName,route_name +routedResources,routed_resources +router,router +routerTypeIdentifier,router_type_identifier +routes,routes +routingConfiguration,routing_configuration +row,row +rowData,row_data +rowId,row_id +rowIds,row_ids +rowIdsNotFound,row_ids_not_found +rowNumber,row_number +rows,rows +rowsToCreate,rows_to_create +rowsToUpdate,rows_to_update +rowsToUpsert,rows_to_upsert +rpoDescription,rpo_description +rpoInSecs,rpo_in_secs +rpoReferenceId,rpo_reference_id +rtoDescription,rto_description +rtoInSecs,rto_in_secs +rtoReferenceId,rto_reference_id +rule,rule +ruleAction,rule_action +ruleArn,rule_arn +ruleBasedProperties,rule_based_properties +ruleConfiguration,rule_configuration +ruleContentSha256,rule_content_sha256 +ruleDesc,rule_desc +ruleDetails,rule_details +ruleDisabled,rule_disabled +ruleEvaluation,rule_evaluation +ruleExecutionMode,rule_execution_mode +ruleGroupsNamespace,rule_groups_namespace +ruleGroupsNamespaces,rule_groups_namespaces +ruleID,rule_id +ruleId,rule_id +ruleIdentifier,rule_identifier +ruleName,rule_name +ruleNames,rule_names +ruleNumber,rule_number +ruleResults,rule_results +ruleVersion,rule_version +rules,rules +rulesPackageArn,rules_package_arn +rulesPackageArns,rules_package_arns +rulesPackages,rules_packages +run,run +runAsGroup,run_as_group +runAsNonRoot,run_as_non_root +runAsUser,run_as_user +runContext,run_context +runEnvironment,run_environment +runGroupId,run_group_id +runId,run_id +runLeftNormalization,run_left_normalization +runOnce,run_once +runOrder,run_order +runTimeAssessmentStatus,run_time_assessment_status +runWith,run_with +running,running +runningCount,running_count +runningQueryCount,running_query_count +runningTasksCount,running_tasks_count +runs,runs +runtime,runtime +runtimeConfiguration,runtime_configuration +runtimeHintValues,runtime_hint_values +runtimeHints,runtime_hints +runtimeId,runtime_id +runtimePlatform,runtime_platform +runtimeRoleArn,runtime_role_arn +runtimeStatus,runtime_status +runtimeStatusMessage,runtime_status_message +runtimeVersion,runtime_version +runtimes,runtimes +s3,s3 +s3Bucket,s3_bucket +s3BucketArn,s3_bucket_arn +s3BucketName,s3_bucket_name +s3BucketOwner,s3_bucket_owner +s3BucketRegion,s3_bucket_region +s3BucketSource,s3_bucket_source +s3BucketTranscriptSource,s3_bucket_transcript_source +s3Config,s3_config +s3Configuration,s3_configuration +s3DataDestination,s3_data_destination +s3DataSource,s3_data_source +s3DeepLink,s3_deep_link +s3Destination,s3_destination +s3DestinationConfig,s3_destination_config +s3DestinationConfiguration,s3_destination_configuration +s3DestinationExportFileFormat,s3_destination_export_file_format +s3DestinationExportFileFormatOptions,s3_destination_export_file_format_options +s3DestinationUrl,s3_destination_url +s3EncryptionEnabled,s3_encryption_enabled +s3Etags,s3_etags +s3ExportConfiguration,s3_export_configuration +s3InputFileType,s3_input_file_type +s3InputFormatConfig,s3_input_format_config +s3JobDefinition,s3_job_definition +s3Key,s3_key +s3KeyPrefix,s3_key_prefix +s3Keys,s3_keys +s3KmsKeyArn,s3_kms_key_arn +s3Location,s3_location +s3LogBucket,s3_log_bucket +s3Logs,s3_logs +s3LogsArn,s3_logs_arn +s3Managed,s3_managed +s3MonitoringConfiguration,s3_monitoring_configuration +s3Object,s3_object +s3ObjectKey,s3_object_key +s3ObjectVersion,s3_object_version +s3OutputEncryptionKMSKey,s3_output_encryption_kms_key +s3OutputFormatConfig,s3_output_format_config +s3OutputKeyPrefix,s3_output_key_prefix +s3Path,s3_path +s3Paths,s3_paths +s3Prefix,s3_prefix +s3Reference,s3_reference +s3RelativePath,s3_relative_path +s3ResourceArn,s3_resource_arn +s3ResourcePath,s3_resource_path +s3Resources,s3_resources +s3ResourcesUpdate,s3_resources_update +s3StateFileUrl,s3_state_file_url +s3Uri,s3_uri +s3Url,s3_url +s3WordsList,s3_words_list +s3bucketForAnalysisData,s3bucket_for_analysis_data +s3bucketForReportData,s3bucket_for_report_data +s3key,s3_key +s3location,s3_location +sageMakerStudioDomainUrl,sage_maker_studio_domain_url +sagemakerIamRoleArn,sagemaker_iam_role_arn +salesforce,salesforce +saml,saml +samlConfiguration,saml_configuration +samlConfigurationStatus,saml_configuration_status +samlMetadataDocument,saml_metadata_document +samlMetadataURL,saml_metadata_url +samlOptions,saml_options +sample,sample +sampleCount,sample_count +sampleFailureReason,sample_failure_reason +sampleId,sample_id +sampleRate,sample_rate +sampleText,sample_text +sampleUtterances,sample_utterances +sampleUtterancesCount,sample_utterances_count +sampleValue,sample_value +samples,samples +samplingPercentage,sampling_percentage +samplingRate,sampling_rate +satelliteArn,satellite_arn +satelliteId,satellite_id +satellites,satellites +savedownStorageConfiguration,savedown_storage_configuration +savingsOpportunity,savings_opportunity +savingsOpportunityPercentage,savings_opportunity_percentage +savingsPlanArn,savings_plan_arn +savingsPlanArns,savings_plan_arns +savingsPlanId,savings_plan_id +savingsPlanIds,savings_plan_ids +savingsPlanOffering,savings_plan_offering +savingsPlanOfferingId,savings_plan_offering_id +savingsPlanOfferingIds,savings_plan_offering_ids +savingsPlanPaymentOptions,savings_plan_payment_options +savingsPlanType,savings_plan_type +savingsPlanTypes,savings_plan_types +savingsPlans,savings_plans +scalarFunctions,scalar_functions +scale,scale +scaleInCooldownSeconds,scale_in_cooldown_seconds +scaleInPolicy,scale_in_policy +scaleOutCooldownSeconds,scale_out_cooldown_seconds +scaleOutPolicy,scale_out_policy +scaling,scaling +scalingConfig,scaling_config +scanAll,scan_all +scanFrequency,scan_frequency +scanName,scan_name +scanNameArn,scan_name_arn +scanOnPush,scan_on_push +scanRate,scan_rate +scanState,scan_state +scanStatus,scan_status +scanStatusCode,scan_status_code +scanStatusReason,scan_status_reason +scanType,scan_type +scanningConfiguration,scanning_configuration +scanningConfigurations,scanning_configurations +scansWithMostOpenCriticalFindings,scans_with_most_open_critical_findings +scansWithMostOpenFindings,scans_with_most_open_findings +sceneId,scene_id +sceneMetadata,scene_metadata +sceneSummaries,scene_summaries +schedule,schedule +scheduleActivityTaskDecisionAttributes,schedule_activity_task_decision_attributes +scheduleActivityTaskFailedEventAttributes,schedule_activity_task_failed_event_attributes +scheduleEndTime,schedule_end_time +scheduleExpression,schedule_expression +scheduleFrequency,schedule_frequency +scheduleLambdaFunctionDecisionAttributes,schedule_lambda_function_decision_attributes +scheduleLambdaFunctionFailedEventAttributes,schedule_lambda_function_failed_event_attributes +scheduleOffset,schedule_offset +scheduleStartTime,schedule_start_time +scheduleTime,schedule_time +scheduleToCloseTimeout,schedule_to_close_timeout +scheduleToStartTimeout,schedule_to_start_timeout +scheduledAuditArn,scheduled_audit_arn +scheduledAuditName,scheduled_audit_name +scheduledAudits,scheduled_audits +scheduledBefore,scheduled_before +scheduledEventId,scheduled_event_id +scheduledJobRollouts,scheduled_job_rollouts +scheduledOnOrAfter,scheduled_on_or_after +scheduledSplitsConfig,scheduled_splits_config +scheduledSplitsDefinition,scheduled_splits_definition +scheduledStartTime,scheduled_start_time +schedulingConfig,scheduling_config +schedulingPolicies,scheduling_policies +schedulingPolicyArn,scheduling_policy_arn +schedulingPriority,scheduling_priority +schedulingPriorityOverride,scheduling_priority_override +schedulingStrategy,scheduling_strategy +schema,schema +schemaArn,schema_arn +schemaDefinition,schema_definition +schemaList,schema_list +schemaName,schema_name +schemaStorageConfig,schema_storage_config +schemaSummaries,schema_summaries +schemaType,schema_type +schemaVersion,schema_version +schemas,schemas +scheme,scheme +scope,scope +scopes,scopes +scoping,scoping +score,score +scoreDetails,score_details +scoreSource,score_source +scores,scores +scoringVector,scoring_vector +screenAutomationId,screen_automation_id +screenId,screen_id +screenshots,screenshots +script,script +scriptLocation,script_location +scriptLocationS3Bucket,script_location_s3_bucket +scriptLocationS3Key,script_location_s3_key +scriptModeConfig,script_mode_config +scriptName,script_name +scriptOutputLocation,script_output_location +scriptParameters,script_parameters +scriptType,script_type +sdkType,sdk_type +searchCriteria,search_criteria +searchExpression,search_expression +searchOrder,search_order +searchResults,search_results +searchTerm,search_term +searchableAttributes,searchable_attributes +searchedCompletely,searched_completely +searchedLogStreams,searched_log_streams +secondaryArtifacts,secondary_artifacts +secondaryArtifactsOverride,secondary_artifacts_override +secondaryAvailabilityZone,secondary_availability_zone +secondarySourceVersions,secondary_source_versions +secondarySources,secondary_sources +secondarySourcesOverride,secondary_sources_override +secondarySourcesVersionOverride,secondary_sources_version_override +seconds,seconds +secondsToLive,seconds_to_live +secret,secret +secretARN,secret_arn +secretAccessKey,secret_access_key +secretArn,secret_arn +secretId,secret_id +secretKey,secret_key +secretName,secret_name +secretOptions,secret_options +secretPolicy,secret_policy +secrets,secrets +secretsManagerKey,secrets_manager_key +sectionalElements,sectional_elements +sections,sections +secureInitializationRoleArn,secure_initialization_role_arn +securityConfigDetail,security_config_detail +securityConfigSummaries,security_config_summaries +securityContext,security_context +securityDetails,security_details +securityGroup,security_group +securityGroupIds,security_group_ids +securityGroups,security_groups +securityHubConfiguration,security_hub_configuration +securityPolicy,security_policy +securityPolicyDetail,security_policy_detail +securityPolicySummaries,security_policy_summaries +securityProfileArn,security_profile_arn +securityProfileDescription,security_profile_description +securityProfileIdentifier,security_profile_identifier +securityProfileIdentifiers,security_profile_identifiers +securityProfileName,security_profile_name +securityProfileTargetArn,security_profile_target_arn +securityProfileTargetMappings,security_profile_target_mappings +securityProfileTargets,security_profile_targets +seed,seed +seedReplicationTime,seed_replication_time +seedTime,seed_time +seenAt,seen_at +segment,segment +segmentOverrides,segment_overrides +segments,segments +selectAttributes,select_attributes +selectedProperties,selected_properties +selectedTestList,selected_test_list +selectionMode,selection_mode +selectionPattern,selection_pattern +selector,selector +selectors,selectors +seleniumProperties,selenium_properties +semanticVersion,semantic_version +senderAccountId,sender_account_id +senderId,sender_id +sensitive,sensitive +sensitiveData,sensitive_data +sensitiveDataOccurrences,sensitive_data_occurrences +sensitivityInspectionTemplateId,sensitivity_inspection_template_id +sensitivityInspectionTemplates,sensitivity_inspection_templates +sensitivityScore,sensitivity_score +sensitivityScoreOverridden,sensitivity_score_overridden +sensitivityScoreOverride,sensitivity_score_override +sentAt,sent_at +sentiment,sentiment +sentimentAnalysisSettings,sentiment_analysis_settings +sentimentLabel,sentiment_label +sentimentResponse,sentiment_response +sentimentScore,sentiment_score +sep,sep +separator,separator +sequenceInformation,sequence_information +sequenceStoreId,sequence_store_id +sequenceStores,sequence_stores +sequenceToken,sequence_token +serial,serial +serialNumber,serial_number +serializer,serializer +server,server +serverCatalogStatus,server_catalog_status +serverCertificateArn,server_certificate_arn +serverCertificateArns,server_certificate_arns +serverCertificateStatus,server_certificate_status +serverCertificateStatusDetail,server_certificate_status_detail +serverCertificates,server_certificates +serverCriteria,server_criteria +serverDetail,server_detail +serverError,server_error +serverErrorCategory,server_error_category +serverGroupId,server_group_id +serverGroupLaunchConfigurations,server_group_launch_configurations +serverGroupReplicationConfigurations,server_group_replication_configurations +serverGroupValidationConfigurations,server_group_validation_configurations +serverGroups,server_groups +serverId,server_id +serverImportFailure,server_import_failure +serverImportSuccess,server_import_success +serverInfos,server_infos +serverLaunchConfigurations,server_launch_configurations +serverList,server_list +serverName,server_name +serverReplicationConfigurations,server_replication_configurations +serverReplicationParameters,server_replication_parameters +serverSideEncryption,server_side_encryption +serverSideEncryptionConfiguration,server_side_encryption_configuration +serverStrategies,server_strategies +serverType,server_type +serverUrl,server_url +serverValidationConfigurations,server_validation_configurations +serverValidationOutput,server_validation_output +serverValidationStrategy,server_validation_strategy +servers,servers +serversCount,servers_count +serversMappedToApplications,servers_mapped_to_applications +serversMappedtoTags,servers_mappedto_tags +service,service +serviceAccountName,service_account_name +serviceAccountRoleArn,service_account_role_arn +serviceArn,service_arn +serviceArns,service_arns +serviceAttributes,service_attributes +serviceCode,service_code +serviceCodeList,service_code_list +serviceCodes,service_codes +serviceConnectConfiguration,service_connect_configuration +serviceConnectDefaults,service_connect_defaults +serviceConnectEndpoint,service_connect_endpoint +serviceConnectResources,service_connect_resources +serviceDiscovery,service_discovery +serviceDnsName,service_dns_name +serviceExecutionRoleArn,service_execution_role_arn +serviceId,service_id +serviceIdentifier,service_identifier +serviceInstance,service_instance +serviceInstanceName,service_instance_name +serviceInstances,service_instances +serviceIpv4Cidr,service_ipv4_cidr +serviceIpv6Cidr,service_ipv6_cidr +serviceLimit,service_limit +serviceLinkedRoleArn,service_linked_role_arn +serviceManagedS3,service_managed_s3 +serviceMetadata,service_metadata +serviceMode,service_mode +serviceName,service_name +serviceNetworkArn,service_network_arn +serviceNetworkId,service_network_id +serviceNetworkIdentifier,service_network_identifier +serviceNetworkName,service_network_name +serviceNetworkServiceAssociationIdentifier,service_network_service_association_identifier +serviceNetworkVpcAssociationIdentifier,service_network_vpc_association_identifier +serviceProviderSamlMetadata,service_provider_saml_metadata +serviceRecommendationOptions,service_recommendation_options +serviceRegistries,service_registries +serviceRole,service_role +serviceRoleArn,service_role_arn +serviceRoleOverride,service_role_override +serviceSpec,service_spec +serviceSyncBlocker,service_sync_blocker +serviceSyncBlockerSummary,service_sync_blocker_summary +serviceSyncConfig,service_sync_config +serviceTemplate,service_template +serviceTemplateVersion,service_template_version +serviceTemplates,service_templates +serviceType,service_type +services,services +session,session +sessionArn,session_arn +sessionAttributes,session_attributes +sessionBackup,session_backup +sessionConfiguration,session_configuration +sessionContext,session_context +sessionDurationInMinutes,session_duration_in_minutes +sessionEnabled,session_enabled +sessionExpirationTime,session_expiration_time +sessionId,session_id +sessionIds,session_ids +sessionIssuer,session_issuer +sessionPersistenceMode,session_persistence_mode +sessionPolicy,session_policy +sessionState,session_state +sessionStorage,session_storage +sessionSummaries,session_summaries +sessionTarget,session_target +sessionTimeout,session_timeout +sessionToken,session_token +sessionType,session_type +sessions,sessions +set,set +setAsActive,set_as_active +setAsDefault,set_as_default +setDefaultVersion,set_default_version +setFileModes,set_file_modes +setTimer,set_timer +setVariable,set_variable +setting,setting +settings,settings +severities,severities +severity,severity +severityCode,severity_code +severityCounts,severity_counts +severityLevels,severity_levels +sha,sha +sha256,sha256 +sha256sum,sha256_sum +shadow,shadow +shadowName,shadow_name +shape,shape +shapeId,shape_id +shardCapacity,shard_capacity +shardCount,shard_count +share,share +shareDecaySeconds,share_decay_seconds +shareDistribution,share_distribution +shareId,share_id +shareIdentifier,share_identifier +shareName,share_name +shareUrl,share_url +sharedAccess,shared_access +sharedAccountId,shared_account_id +sharedMemorySize,shared_memory_size +sharedVia,shared_via +shares,shares +shippingAddress,shipping_address +shippingLabel,shipping_label +shortCode,short_code +shots,shots +shouldOverwrite,should_overwrite +shouldProfile,should_profile +showThumbnails,show_thumbnails +shutdownAgentlessCollectors,shutdown_agentless_collectors +shutdownAgents,shutdown_agents +shutdownConnectors,shutdown_connectors +shutdownMeCollectors,shutdown_me_collectors +sid,sid +signalCatalogArn,signal_catalog_arn +signalDecoders,signal_decoders +signalDecodersToAdd,signal_decoders_to_add +signalDecodersToRemove,signal_decoders_to_remove +signalDecodersToUpdate,signal_decoders_to_update +signalExternalWorkflowExecutionDecisionAttributes,signal_external_workflow_execution_decision_attributes +signalExternalWorkflowExecutionFailedEventAttributes,signal_external_workflow_execution_failed_event_attributes +signalExternalWorkflowExecutionInitiatedEventAttributes,signal_external_workflow_execution_initiated_event_attributes +signalName,signal_name +signalsMap,signals_map +signalsToCollect,signals_to_collect +signature,signature +signatureAlgorithm,signature_algorithm +signatureContains,signature_contains +signatureCount,signature_count +signatureDateTime,signature_date_time +signatureExpiresAfter,signature_expires_after +signatureExpiresAt,signature_expires_at +signatureExpiresBefore,signature_expires_before +signatureInfo,signature_info +signatureKeyId,signature_key_id +signatureMap,signature_map +signatureR,signature_r +signatureS,signature_s +signatureTimestamp,signature_timestamp +signatureV,signature_v +signatureValid,signature_valid +signatureValidityPeriod,signature_validity_period +signedBiUrl,signed_bi_url +signedConnectionString,signed_connection_string +signedObject,signed_object +signingConfiguration,signing_configuration +signingDisabled,signing_disabled +signingImageFormat,signing_image_format +signingMaterial,signing_material +signingParameters,signing_parameters +signingProfileName,signing_profile_name +signingProfileParameter,signing_profile_parameter +signingRegion,signing_region +signingServiceName,signing_service_name +sigv4,sigv4 +silent,silent +simpleCriterion,simple_criterion +simpleRule,simple_rule +simpleRuleEvaluation,simple_rule_evaluation +simpleScopeTerm,simple_scope_term +simulationApplicationNames,simulation_application_names +simulationApplicationSummaries,simulation_application_summaries +simulationApplications,simulation_applications +simulationJobBatchSummaries,simulation_job_batch_summaries +simulationJobSummaries,simulation_job_summaries +simulationSoftwareSuite,simulation_software_suite +simulationTimeMillis,simulation_time_millis +simulationUnitLimit,simulation_unit_limit +since,since +site,site +siteLinkEnabled,site_link_enabled +sites,sites +size,size +sizeClassified,size_classified +sizeInBytes,size_in_bytes +sizeInBytesCompressed,size_in_bytes_compressed +sizeInGb,size_in_gb +sizeInGiB,size_in_gib +sizeInMiB,size_in_mib +sizeLimit,size_limit +skipAppResign,skip_app_resign +skipFinalSnapshot,skip_final_snapshot +skipResourceInUseCheck,skip_resource_in_use_check +skipped,skipped +skippedEntries,skipped_entries +skippedFindingsCount,skipped_findings_count +slackChannelConfigurations,slack_channel_configurations +slackWorkspaceConfigurations,slack_workspace_configurations +slotCaptureSetting,slot_capture_setting +slotConstraint,slot_constraint +slotDiscrepancies,slot_discrepancies +slotElicitationStyle,slot_elicitation_style +slotHints,slot_hints +slotId,slot_id +slotMatchResult,slot_match_result +slotMatchResultCounts,slot_match_result_counts +slotName,slot_name +slotPriorities,slot_priorities +slotResolutionResults,slot_resolution_results +slotSpecifications,slot_specifications +slotSummaries,slot_summaries +slotToElicit,slot_to_elicit +slotType,slot_type +slotTypeCategory,slot_type_category +slotTypeConfigurations,slot_type_configurations +slotTypeId,slot_type_id +slotTypeName,slot_type_name +slotTypeSignature,slot_type_signature +slotTypeSummaries,slot_type_summaries +slotTypeValues,slot_type_values +slotTypeVersion,slot_type_version +slotTypes,slot_types +slotTypesCount,slot_types_count +slots,slots +slotsFilledInSession,slots_filled_in_session +smallVolumeConf,small_volume_conf +smallVolumeMaxSize,small_volume_max_size +smsConfigurations,sms_configurations +snapshot,snapshot +snapshotArn,snapshot_arn +snapshotConfiguration,snapshot_configuration +snapshotCreateTime,snapshot_create_time +snapshotCreationTime,snapshot_creation_time +snapshotID,snapshot_id +snapshotId,snapshot_id +snapshotName,snapshot_name +snapshotRemainingDays,snapshot_remaining_days +snapshotRetentionPeriod,snapshot_retention_period +snapshotRetentionStartTime,snapshot_retention_start_time +snapshotTimeOfDay,snapshot_time_of_day +snapshots,snapshots +snoozeActionConfiguration,snooze_action_configuration +snoozeActionRequests,snooze_action_requests +snoozeDuration,snooze_duration +sns,sns +snsPublishStatusCode,sns_publish_status_code +snsTopic,sns_topic +snsTopicARN,sns_topic_arn +snsTopicArn,sns_topic_arn +socketAddress,socket_address +softLimit,soft_limit +software,software +solution,solution +solutionArn,solution_arn +solutionConfig,solution_config +solutionVersion,solution_version +solutionVersionArn,solution_version_arn +solutionVersions,solution_versions +solutions,solutions +sopRecommendations,sop_recommendations +sort,sort +sortBy,sort_by +sortByAttribute,sort_by_attribute +sortByOrder,sort_by_order +sortColumns,sort_columns +sortCriteria,sort_criteria +sortOrder,sort_order +sorts,sorts +source,source +source1,source1 +source2,source2 +sourceAccessToken,source_access_token +sourceAccount,source_account +sourceAccountID,source_account_id +sourceApiArn,source_api_arn +sourceApiAssociation,source_api_association +sourceApiAssociationConfig,source_api_association_config +sourceApiAssociationStatus,source_api_association_status +sourceApiAssociationStatusDetail,source_api_association_status_detail +sourceApiAssociationSummaries,source_api_association_summaries +sourceApiId,source_api_id +sourceApiIdentifier,source_api_identifier +sourceArn,source_arn +sourceArns,source_arns +sourceAuthOverride,source_auth_override +sourceBotVersion,source_bot_version +sourceBranch,source_branch +sourceCloudProperties,source_cloud_properties +sourceCode,source_code +sourceCodeList,source_code_list +sourceCodeRepositories,source_code_repositories +sourceCodeRepository,source_code_repository +sourceCommit,source_commit +sourceCommitId,source_commit_id +sourceCommitSpecifier,source_commit_specifier +sourceConfiguration,source_configuration +sourceConnectionState,source_connection_state +sourceConnectorLabel,source_connector_label +sourceConnectorProperties,source_connector_properties +sourceConnectorType,source_connector_type +sourceContainer,source_container +sourceCredentialsInfos,source_credentials_infos +sourceData,source_data +sourceDatabaseName,source_database_name +sourceDescription,source_description +sourceDiskName,source_disk_name +sourceFields,source_fields +sourceFile,source_file +sourceFileType,source_file_type +sourceFiles,source_files +sourceFlowConfig,source_flow_config +sourceFrequency,source_frequency +sourceId,source_id +sourceIdentifier,source_identifier +sourceImageSet,source_image_set +sourceImageSetId,source_image_set_id +sourceImageSetProperties,source_image_set_properties +sourceInfo,source_info +sourceInstanceName,source_instance_name +sourceIpAddress,source_ip_address +sourceKeyspaceName,source_keyspace_name +sourceKeyword,source_keyword +sourceLambdaLayerArn,source_lambda_layer_arn +sourceLayerHash,source_layer_hash +sourceLocationOverride,source_location_override +sourceName,source_name +sourceNetwork,source_network +sourceNetworkID,source_network_id +sourceNetworkIDs,source_network_ids +sourceNetworks,source_networks +sourceParams,source_params +sourcePath,source_path +sourcePipelineArn,source_pipeline_arn +sourcePipelineName,source_pipeline_name +sourceProperties,source_properties +sourceReference,source_reference +sourceRegion,source_region +sourceRelationalDatabaseName,source_relational_database_name +sourceRepository,source_repository +sourceRepositoryName,source_repository_name +sourceResourceName,source_resource_name +sourceRevisions,source_revisions +sourceS3DirectoryPath,source_s3_directory_path +sourceS3Location,source_s3_location +sourceS3Object,source_s3_object +sourceSchemaName,source_schema_name +sourceSecurityGroups,source_security_groups +sourceServer,source_server +sourceServerArn,source_server_arn +sourceServerID,source_server_id +sourceServerIDs,source_server_ids +sourceServerId,source_server_id +sourceServerTags,source_server_tags +sourceServers,source_servers +sourceSetUpOption,source_set_up_option +sourceSnapshotName,source_snapshot_name +sourceStatuses,source_statuses +sourceTableName,source_table_name +sourceType,source_type +sourceTypeOverride,source_type_override +sourceUrl,source_url +sourceVersion,source_version +sourceVolume,source_volume +sourceVpc,source_vpc +sourceVpcID,source_vpc_id +sources,sources +spaceName,space_name +span,span +sparkSqlJobDriver,spark_sql_job_driver +sparkSqlParameters,spark_sql_parameters +sparkSubmitJobDriver,spark_submit_job_driver +sparkSubmitParameters,spark_submit_parameters +sparql,sparql +spec,spec +spectrumConfig,spectrum_config +speechTranscriptionResult,speech_transcription_result +speechTranscriptionResultCounts,speech_transcription_result_counts +speedOfMigration,speed_of_migration +sphere,sphere +spoolingMode,spooling_mode +spotIamFleetRole,spot_iam_fleet_role +sql,sql +sqlParameters,sql_parameters +sqlQuery,sql_query +sqlStatementResults,sql_statement_results +sqlStatements,sql_statements +sqs,sqs +srcCodeOrDbAnalysisStatus,src_code_or_db_analysis_status +sseConfig,sse_config +sseKmsKeyId,sse_kms_key_id +sshKeyName,ssh_key_name +sshPublicKey,ssh_public_key +ssmAgentDiscoveryDatetime,ssm_agent_discovery_datetime +ssmDocument,ssm_document +ssmDocumentName,ssm_document_name +ssmDocumentType,ssm_document_type +ssmDocuments,ssm_documents +ssmOutput,ssm_output +ssmValidationParameters,ssm_validation_parameters +ssmlMessage,ssml_message +ssoApplicationId,sso_application_id +ssoClientId,sso_client_id +ssoIdentity,sso_identity +stabilityStatus,stability_status +stabilityStatusAt,stability_status_at +stackId,stack_id +stackName,stack_name +stackParameters,stack_parameters +stackSetName,stack_set_name +stage,stage +stageArn,stage_arn +stageDescription,stage_description +stageDetails,stage_details +stageKeys,stage_keys +stageName,stage_name +stageProgress,stage_progress +stageSession,stage_session +stageSessions,stage_sessions +stageStates,stage_states +stageVariableOverrides,stage_variable_overrides +stageVariables,stage_variables +stages,stages +stagingAccountID,staging_account_id +stagingAccountIDs,staging_account_ids +stagingArea,staging_area +stagingAreaSubnetId,staging_area_subnet_id +stagingAreaTags,staging_area_tags +stagingAvailabilityZone,staging_availability_zone +stagingDiskType,staging_disk_type +stagingSourceServerArn,staging_source_server_arn +standardControlsCount,standard_controls_count +standardDeviation,standard_deviation +start,start +startAfter,start_after +startAt,start_at +startAtPreviousStartedEvent,start_at_previous_started_event +startBit,start_bit +startByte,start_byte +startCharOffset,start_char_offset +startChildWorkflowExecutionDecisionAttributes,start_child_workflow_execution_decision_attributes +startChildWorkflowExecutionFailedEventAttributes,start_child_workflow_execution_failed_event_attributes +startChildWorkflowExecutionInitiatedEventAttributes,start_child_workflow_execution_initiated_event_attributes +startColumn,start_column +startDate,start_date +startDateTime,start_date_time +startFromHead,start_from_head +startInclusive,start_inclusive +startLambdaFunctionFailedEventAttributes,start_lambda_function_failed_event_attributes +startLine,start_line +startOn,start_on +startPeriod,start_period +startResponse,start_response +startSigningJobParameter,start_signing_job_parameter +startTime,start_time +startTimeFilter,start_time_filter +startTimeInSeconds,start_time_in_seconds +startTimeOffsetInNanos,start_time_offset_in_nanos +startTimeRange,start_time_range +startTimeout,start_timeout +startTimeoutMs,start_timeout_ms +startTimerDecisionAttributes,start_timer_decision_attributes +startTimerFailedEventAttributes,start_timer_failed_event_attributes +startTimes,start_times +startTimestamp,start_timestamp +startToCloseTimeout,start_to_close_timeout +startToFireTimeout,start_to_fire_timeout +startToken,start_token +startUrl,start_url +started,started +startedAfter,started_after +startedAt,started_at +startedBefore,started_before +startedBy,started_by +startedEventId,started_event_id +startedFromBackupId,started_from_backup_id +startedOn,started_on +startedTime,started_time +startingToken,starting_token +stat,stat +state,state +stateChangeConfiguration,state_change_configuration +stateChangeError,state_change_error +stateChangeTimeRange,state_change_time_range +stateChangedAt,state_changed_at +stateChanges,state_changes +stateDescription,state_description +stateDetail,state_detail +stateDetails,state_details +stateEnteredEventDetails,state_entered_event_details +stateExitedEventDetails,state_exited_event_details +stateMachineAliasArn,state_machine_alias_arn +stateMachineAliases,state_machine_aliases +stateMachineArn,state_machine_arn +stateMachineName,state_machine_name +stateMachineVersionArn,state_machine_version_arn +stateMachineVersions,state_machine_versions +stateMachines,state_machines +stateName,state_name +stateOrProvince,state_or_province +stateReason,state_reason +stateValue,state_value +statement,statement +statementId,statement_id +states,states +staticColumns,static_columns +staticIp,static_ip +staticIpName,static_ip_name +staticIps,static_ips +statistic,statistic +statisticalThreshold,statistical_threshold +statistics,statistics +statisticsId,statistics_id +stats,stats +status,status +statusChangeTime,status_change_time +statusChangedAt,status_changed_at +statusCode,status_code +statusCodes,status_codes +statusCounts,status_counts +statusDetail,status_detail +statusDetails,status_details +statusEquals,status_equals +statusFilter,status_filter +statusList,status_list +statusMessage,status_message +statusReason,status_reason +statusReportS3Bucket,status_report_s3_bucket +statusReportS3Key,status_report_s3_key +statusSummary,status_summary +statusTimeoutInSeconds,status_timeout_in_seconds +statusType,status_type +statusUpdateDateTime,status_update_date_time +statuscode,statuscode +statuses,statuses +stdDeviation,std_deviation +stddev,stddev +step,step +stepActionType,step_action_type +stepAutomationConfiguration,step_automation_configuration +stepExecutionId,step_execution_id +stepFunctions,step_functions +stepGroupId,step_group_id +stepId,step_id +stepName,step_name +stepTarget,step_target +stepTargets,step_targets +stepTimeoutInMinutes,step_timeout_in_minutes +steps,steps +stillWaitingResponse,still_waiting_response +stmt,stmt +stopAction,stop_action +stopAt,stop_at +stopCode,stop_code +stopConditions,stop_conditions +stopDate,stop_date +stopInstanceOnIdleRequest,stop_instance_on_idle_request +stopTime,stop_time +stopTimeout,stop_timeout +stopTrigger,stop_trigger +stopped,stopped +stoppedAt,stopped_at +stoppedBy,stopped_by +stoppedReason,stopped_reason +stoppingAt,stopping_at +stoppingCondition,stopping_condition +storage,storage +storageCapacity,storage_capacity +storageClass,storage_class +storageCompressionFormat,storage_compression_format +storageConfigurations,storage_configurations +storageGBHour,storage_gb_hour +storageLocation,storage_location +storagePerMonthInGb,storage_per_month_in_gb +storageType,storage_type +storeArn,store_arn +storeFormat,store_format +storeId,store_id +storeName,store_name +storeOptions,store_options +storeSizeBytes,store_size_bytes +storedBytes,stored_bytes +strValues,str_values +strategy,strategy +strategyOption,strategy_option +stream,stream +streamArn,stream_arn +streamConfiguration,stream_configuration +streamId,stream_id +streamInfo,stream_info +streamKey,stream_key +streamKeys,stream_keys +streamName,stream_name +streamOutputToCloudWatch,stream_output_to_cloud_watch +streamSession,stream_session +streamSessions,stream_sessions +streamUI,stream_ui +streamUrl,stream_url +streamVersion,stream_version +streamingImage,streaming_image +streamingImageId,streaming_image_id +streamingImageIds,streaming_image_ids +streamingImages,streaming_images +streamingSessionBackup,streaming_session_backup +streamingSessionBackups,streaming_session_backups +streams,streams +streamsKmsKey,streams_kms_key +streamsKmsRole,streams_kms_role +street1,street1 +street2,street2 +street3,street3 +streetInfo,street_info +streetName,street_name +streetNumber,street_number +streetSuffix,street_suffix +string,string +stringSetValue,string_set_value +stringValue,string_value +stringValues,string_values +strings,strings +structurallyExclusive,structurally_exclusive +studio,studio +studioComponent,studio_component +studioComponentId,studio_component_id +studioComponentIds,studio_component_ids +studioComponentName,studio_component_name +studioComponentSummaries,studio_component_summaries +studioComponents,studio_components +studioEncryptionConfiguration,studio_encryption_configuration +studioId,studio_id +studioName,studio_name +studioUrl,studio_url +studios,studios +style,style +subDomainSetting,sub_domain_setting +subDomainSettings,sub_domain_settings +subDomains,sub_domains +subFolders,sub_folders +subModules,sub_modules +subResourceId,sub_resource_id +subSlotHints,sub_slot_hints +subSlotSetting,sub_slot_setting +subSlotToElicit,sub_slot_to_elicit +subSlots,sub_slots +subTitle,sub_title +subdirectory,subdirectory +subject,subject +subjectAlternativeNames,subject_alternative_names +subjectArn,subject_arn +subjectId,subject_id +subjectStructures,subject_structures +subjects,subjects +submit,submit +submitTime,submit_time +submittedAt,submitted_at +submittedBy,submitted_by +submitter,submitter +subnet,subnet +subnetId,subnet_id +subnetIds,subnet_ids +subnets,subnets +subqueries,subqueries +subscribedAt,subscribed_at +subscriber,subscriber +subscriberArn,subscriber_arn +subscriberDescription,subscriber_description +subscriberEndpoint,subscriber_endpoint +subscriberId,subscriber_id +subscriberIdentity,subscriber_identity +subscriberName,subscriber_name +subscriberStatus,subscriber_status +subscribers,subscribers +subscriptionFilters,subscription_filters +subscriptionProtocol,subscription_protocol +subscriptionType,subscription_type +subscriptions,subscriptions +subscriptionsFilePath,subscriptions_file_path +subtitle,subtitle +subtype,subtype +succeeded,succeeded +succeededFindingsCount,succeeded_findings_count +succeededWorldCount,succeeded_world_count +succeededWorlds,succeeded_worlds +success,success +successCodes,success_codes +successConditional,success_conditional +successCount,success_count +successEntries,success_entries +successNextStep,success_next_step +successResponse,success_response +successResponseHandlingConfig,success_response_handling_config +successful,successful +successfulEntries,successful_entries +successfulExecutions,successful_executions +successfulRequests,successful_requests +successfulSet,successful_set +successfulVersions,successful_versions +suffix,suffix +suggest,suggest +suggestedChanges,suggested_changes +suggestedFixes,suggested_fixes +suggester,suggester +suggestion,suggestion +suggestions,suggestions +suite,suite +suiteDefinitionArn,suite_definition_arn +suiteDefinitionConfiguration,suite_definition_configuration +suiteDefinitionId,suite_definition_id +suiteDefinitionInformationList,suite_definition_information_list +suiteDefinitionName,suite_definition_name +suiteDefinitionVersion,suite_definition_version +suiteRunArn,suite_run_arn +suiteRunConfiguration,suite_run_configuration +suiteRunId,suite_run_id +suiteRunsList,suite_runs_list +suites,suites +sum,sum +sumOfSquares,sum_of_squares +summaries,summaries +summary,summary +summaryList,summary_list +superuserParameters,superuser_parameters +supplementaryConfiguration,supplementary_configuration +suppliedData,supplied_data +supportCode,support_code +supportedApiVersions,supported_api_versions +supportedAppCategories,supported_app_categories +supportedComponentSources,supported_component_sources +supportedDataTransferApis,supported_data_transfer_apis +supportedDataTransferTypes,supported_data_transfer_types +supportedDateFormat,supported_date_format +supportedDestinationConnectors,supported_destination_connectors +supportedFieldTypeDetails,supported_field_type_details +supportedFormats,supported_formats +supportedHours,supported_hours +supportedLanguages,supported_languages +supportedLocales,supported_locales +supportedOperators,supported_operators +supportedOsVersions,supported_os_versions +supportedPlatforms,supported_platforms +supportedRegions,supported_regions +supportedSchedulingFrequencies,supported_scheduling_frequencies +supportedTriggerTypes,supported_trigger_types +supportedValues,supported_values +supportedVersion,supported_version +supportedWriteOperations,supported_write_operations +supportsNitroInstances,supports_nitro_instances +suppressAlerts,suppress_alerts +suppressDataIdentifiers,suppress_data_identifiers +suppressIndefinitely,suppress_indefinitely +suppressNextMessage,suppress_next_message +suppressed,suppressed +suppressedAlertsIncluded,suppressed_alerts_included +suppressedNonCompliantResourcesCount,suppressed_non_compliant_resources_count +suppressions,suppressions +swappiness,swappiness +symbolicLinks,symbolic_links +syncConfig,sync_config +syncDefinitions,sync_definitions +syncFromResources,sync_from_resources +syncJobSummaries,sync_job_summaries +syncResources,sync_resources +syncRole,sync_role +syncSource,sync_source +syncType,sync_type +syncWithPublicNamespace,sync_with_public_namespace +synonyms,synonyms +systemControls,system_controls +systemEvent,system_event +systemEvidenceCount,system_evidence_count +systemInfo,system_info +systemInitializationScripts,system_initialization_scripts +systemInstanceId,system_instance_id +systemMessage,system_message +systemResourceLimits,system_resource_limits +systemsManagerAgent,systems_manager_agent +tableArn,table_arn +tableColumnId,table_column_id +tableColumnName,table_column_name +tableColumns,table_columns +tableId,table_id +tableName,table_name +tablePrefix,table_prefix +tableReference,table_reference +tableRegistrationOutput,table_registration_output +tableRestoreRequestId,table_restore_request_id +tableRestoreStatus,table_restore_status +tableRestoreStatuses,table_restore_statuses +tables,tables +tabularConditions,tabular_conditions +tabularPropertyValues,tabular_property_values +tabularSchemaConfig,tabular_schema_config +tag,tag +tagCriterion,tag_criterion +tagFilter,tag_filter +tagFilters,tag_filters +tagKey,tag_key +tagKeyComparisonType,tag_key_comparison_type +tagKeys,tag_keys +tagList,tag_list +tagQueryConfiguration,tag_query_configuration +tagScopeTerm,tag_scope_term +tagStatus,tag_status +tagValue,tag_value +tagValueComparisonType,tag_value_comparison_type +tagValues,tag_values +tags,tags +tagsOverride,tags_override +taints,taints +target,target +targetAccount,target_account +targetAccountId,target_account_id +targetAccountIds,target_account_ids +targetAction,target_action +targetArn,target_arn +targetArns,target_arns +targetAwsAccount,target_aws_account +targetBitrate,target_bitrate +targetBranch,target_branch +targetCapacity,target_capacity +targetCheckNames,target_check_names +targetComponentName,target_component_name +targetComponentTypeId,target_component_type_id +targetDatabaseEngine,target_database_engine +targetDatabaseName,target_database_name +targetDestination,target_destination +targetEirp,target_eirp +targetEntityId,target_entity_id +targetFileSize,target_file_size +targetFilters,target_filters +targetFramerate,target_framerate +targetFrames,target_frames +targetFramesIndex,target_frames_index +targetGroup,target_group +targetGroupArn,target_group_arn +targetGroupArns,target_group_arns +targetGroupIdentifier,target_group_identifier +targetGroupInfoList,target_group_info_list +targetGroupPairInfoList,target_group_pair_info_list +targetGroupType,target_group_type +targetGroups,target_groups +targetId,target_id +targetIdentifier,target_identifier +targetIds,target_ids +targetInstanceID,target_instance_id +targetInstanceTypeRightSizingMethod,target_instance_type_right_sizing_method +targetInstances,target_instances +targetIntervalSeconds,target_interval_seconds +targetKeyspaceName,target_keyspace_name +targetName,target_name +targetNodes,target_nodes +targetPipeline,target_pipeline +targetRegion,target_region +targetRepository,target_repository +targetResolution,target_resolution +targetResource,target_resource +targetResourceCount,target_resource_count +targetResourceCreatedAt,target_resource_created_at +targetResourceType,target_resource_type +targetResourceTypes,target_resource_types +targetRevision,target_revision +targetRoleArn,target_role_arn +targetSchemaName,target_schema_name +targetSelection,target_selection +targetSnapshotName,target_snapshot_name +targetState,target_state +targetStatus,target_status +targetTableName,target_table_name +targetType,target_type +targetUrl,target_url +targetVersion,target_version +targetVersionWeight,target_version_weight +targetVpc,target_vpc +targets,targets +task,task +taskArn,task_arn +taskArns,task_arns +taskContext,task_context +taskCredentials,task_credentials +taskDefinition,task_definition +taskDefinitionArn,task_definition_arn +taskDefinitionArns,task_definition_arns +taskDefinitions,task_definitions +taskEndTime,task_end_time +taskError,task_error +taskErrorDetails,task_error_details +taskFailedEventDetails,task_failed_event_details +taskId,task_id +taskIdList,task_id_list +taskIds,task_ids +taskInfos,task_infos +taskList,task_list +taskListScheduleToStartTimeout,task_list_schedule_to_start_timeout +taskName,task_name +taskObject,task_object +taskPriority,task_priority +taskProperties,task_properties +taskRoleArn,task_role_arn +taskScheduledEventDetails,task_scheduled_event_details +taskSet,task_set +taskSetArn,task_set_arn +taskSetLabel,task_set_label +taskSets,task_sets +taskSetsInfo,task_sets_info +taskStartFailedEventDetails,task_start_failed_event_details +taskStartTime,task_start_time +taskStartToCloseTimeout,task_start_to_close_timeout +taskStartedEventDetails,task_started_event_details +taskStatistics,task_statistics +taskStatus,task_status +taskSubmitFailedEventDetails,task_submit_failed_event_details +taskSubmittedEventDetails,task_submitted_event_details +taskSucceededEventDetails,task_succeeded_event_details +taskSummary,task_summary +taskTimedOutEventDetails,task_timed_out_event_details +taskToken,task_token +taskType,task_type +taskingDocument,tasking_document +taskrunnerId,taskrunner_id +tasks,tasks +tcpRetryEvents,tcp_retry_events +tcpRoute,tcp_route +teamId,team_id +teamMembers,team_members +teamName,team_name +telemetryEndpoint,telemetry_endpoint +telemetryMetadata,telemetry_metadata +template,template +templateArn,template_arn +templateBody,template_body +templateFile,template_file +templateFormat,template_format +templateId,template_id +templateLocation,template_location +templateMajorVersion,template_major_version +templateMinorVersion,template_minor_version +templateName,template_name +templateStepGroupSummary,template_step_group_summary +templateStepSummaryList,template_step_summary_list +templateSummaries,template_summaries +templateSummary,template_summary +templateSyncConfig,template_sync_config +templateType,template_type +templateUri,template_uri +templateVersion,template_version +templateVersions,template_versions +templates,templates +templatesLocation,templates_location +temporaryPassword,temporary_password +tenancy,tenancy +tenant,tenant +tenantDisplayName,tenant_display_name +tenantId,tenant_id +tenantIdentifier,tenant_identifier +termDurationInSeconds,term_duration_in_seconds +termLength,term_length +terminate,terminate +terminateAt,terminate_at +terminateBlueInstancesOnDeploymentSuccess,terminate_blue_instances_on_deployment_success +terminateInstanceOnFailure,terminate_instance_on_failure +terminateJobsOnUpdate,terminate_jobs_on_update +terminationWaitTimeInMinutes,termination_wait_time_in_minutes +termsAggregation,terms_aggregation +terraformSource,terraform_source +terraformSourceName,terraform_source_name +terraformSourceNames,terraform_source_names +terraformSources,terraform_sources +test,test +testArtifactsUrl,test_artifacts_url +testBotAliasTags,test_bot_alias_tags +testCaseDefinitionId,test_case_definition_id +testCaseDefinitionName,test_case_definition_name +testCaseRunId,test_case_run_id +testCaseScenarioId,test_case_scenario_id +testCaseScenarioType,test_case_scenario_type +testCases,test_cases +testConfigUrl,test_config_url +testDurationInMinutes,test_duration_in_minutes +testExecutionId,test_execution_id +testExecutionModality,test_execution_modality +testExecutionResults,test_execution_results +testExecutionStatus,test_execution_status +testExecutions,test_executions +testGridProject,test_grid_project +testGridProjects,test_grid_projects +testGridSession,test_grid_session +testGridSessions,test_grid_sessions +testId,test_id +testPackageArn,test_package_arn +testRawDataPath,test_raw_data_path +testRecommendations,test_recommendations +testResult,test_result +testScenarios,test_scenarios +testSetDiscrepancyRawOutputUrl,test_set_discrepancy_raw_output_url +testSetDiscrepancyReportId,test_set_discrepancy_report_id +testSetDiscrepancyReportStatus,test_set_discrepancy_report_status +testSetDiscrepancyTopErrors,test_set_discrepancy_top_errors +testSetExportSpecification,test_set_export_specification +testSetGenerationId,test_set_generation_id +testSetGenerationStatus,test_set_generation_status +testSetId,test_set_id +testSetImportResourceSpecification,test_set_import_resource_specification +testSetName,test_set_name +testSetRecords,test_set_records +testSetTags,test_set_tags +testSets,test_sets +testSpecArn,test_spec_arn +testSummary,test_summary +testTrafficRoute,test_traffic_route +testType,test_type +testingInformation,testing_information +tests,tests +text,text +textDataDeliveryEnabled,text_data_delivery_enabled +textInput,text_input +textInputSpecification,text_input_specification +textLogSettings,text_log_settings +textResponse,text_response +tfi,tfi +tgwStatus,tgw_status +theme,theme +themeToCreate,theme_to_create +then,then +thingArn,thing_arn +thingConnectivityIndexingMode,thing_connectivity_indexing_mode +thingGroupArn,thing_group_arn +thingGroupDescription,thing_group_description +thingGroupId,thing_group_id +thingGroupIndexingConfiguration,thing_group_indexing_configuration +thingGroupIndexingMode,thing_group_indexing_mode +thingGroupMetadata,thing_group_metadata +thingGroupName,thing_group_name +thingGroupNames,thing_group_names +thingGroupProperties,thing_group_properties +thingGroups,thing_groups +thingGroupsToAdd,thing_groups_to_add +thingGroupsToRemove,thing_groups_to_remove +thingId,thing_id +thingIndexingConfiguration,thing_indexing_configuration +thingIndexingMode,thing_indexing_mode +thingName,thing_name +thingTypeArn,thing_type_arn +thingTypeDescription,thing_type_description +thingTypeId,thing_type_id +thingTypeMetadata,thing_type_metadata +thingTypeName,thing_type_name +thingTypeProperties,thing_type_properties +thingTypes,thing_types +things,things +thirdPartyConfigurationUrl,third_party_configuration_url +threadStates,thread_states +threadsPerCore,threads_per_core +threshold,threshold +thresholdBreachValue,threshold_breach_value +thresholdPercent,threshold_percent +thresholdPercentage,threshold_percentage +thresholdValue,threshold_value +throttle,throttle +throttleSettings,throttle_settings +throttling,throttling +throttlingBurstLimit,throttling_burst_limit +throttlingRateLimit,throttling_rate_limit +throughput,throughput +throughputInfo,throughput_info +throughputMode,throughput_mode +thumbnailConfiguration,thumbnail_configuration +thumbnailUrl,thumbnail_url +thumbprint,thumbprint +tier,tier +time,time +timeBasedCanary,time_based_canary +timeBasedLinear,time_based_linear +timeCreated,time_created +timeDimension,time_dimension +timeExpression,time_expression +timeInMillis,time_in_millis +timeInSeconds,time_in_seconds +timeOfCreation,time_of_creation +timeOfEvent,time_of_event +timeOrdering,time_ordering +timePeriod,time_period +timeRange,time_range +timeSeriesArn,time_series_arn +timeSeriesCreationDate,time_series_creation_date +timeSeriesId,time_series_id +timeSeriesLastUpdateDate,time_series_last_update_date +timeSeriesType,time_series_type +timeToLive,time_to_live +timeToLiveInSeconds,time_to_live_in_seconds +timeValue,time_value +timedOut,timed_out +timems,timems +timeout,timeout +timeoutConditional,timeout_conditional +timeoutConfig,timeout_config +timeoutInMillis,timeout_in_millis +timeoutInMins,timeout_in_mins +timeoutInMinutes,timeout_in_minutes +timeoutInMinutesOverride,timeout_in_minutes_override +timeoutInSeconds,timeout_in_seconds +timeoutMillis,timeout_millis +timeoutMinutes,timeout_minutes +timeoutNextStep,timeout_next_step +timeoutResponse,timeout_response +timeoutSeconds,timeout_seconds +timeoutType,timeout_type +timerCanceledEventAttributes,timer_canceled_event_attributes +timerFiredEventAttributes,timer_fired_event_attributes +timerId,timer_id +timerName,timer_name +timerStartedEventAttributes,timer_started_event_attributes +timers,timers +timestamp,timestamp +timestampFormat,timestamp_format +timestampPartition,timestamp_partition +timestamps,timestamps +timestream,timestream +timestreamDatabaseArn,timestream_database_arn +timestreamDatabaseName,timestream_database_name +timestreamRegistrationResponse,timestream_registration_response +timestreamResources,timestream_resources +timestreamTableArn,timestream_table_arn +timestreamTableName,timestream_table_name +timezone,timezone +tip,tip +title,title +titles,titles +tleData,tle_data +tleLine1,tle_line1 +tleLine2,tle_line2 +tls,tls +tlsCertificateSummaries,tls_certificate_summaries +tlsCertificates,tls_certificates +tlsConfig,tls_config +tlsContext,tls_context +tlsPolicies,tls_policies +tlsPolicyName,tls_policy_name +tmpfs,tmpfs +to,to +toBlockchainInstant,to_blockchain_instant +toDate,to_date +toDateTime,to_date_time +toPermissionArn,to_permission_arn +toPermissionVersion,to_permission_version +toPort,to_port +token,token +tokenBalances,token_balances +tokenEndpoint,token_endpoint +tokenExpirationTime,token_expiration_time +tokenFilter,token_filter +tokenId,token_id +tokenIdentifier,token_identifier +tokenKeyName,token_key_name +tokenName,token_name +tokenNameList,token_name_list +tokenSignature,token_signature +tokenSigningPublicKeys,token_signing_public_keys +tokenType,token_type +tokenUrl,token_url +tokenUrlCustomProperties,token_url_custom_properties +tokenUrls,token_urls +tokenValue,token_value +toleratedFailureCount,tolerated_failure_count +toleratedFailurePercentage,tolerated_failure_percentage +tooNewLogEventStartIndex,too_new_log_event_start_index +tooOldLogEventEndIndex,too_old_log_event_end_index +toolName,tool_name +toolchain,toolchain +tools,tools +topMatches,top_matches +topPanel,top_panel +topic,topic +topicArn,topic_arn +topicIntegrationArn,topic_integration_arn +topicPattern,topic_pattern +topicPolicy,topic_policy +topicRuleDestination,topic_rule_destination +topicRulePayload,topic_rule_payload +topologyFilter,topology_filter +total,total +totalActuators,total_actuators +totalAgentlessCollectors,total_agentless_collectors +totalAgents,total_agents +totalApplications,total_applications +totalAssessmentControlsCount,total_assessment_controls_count +totalAttributes,total_attributes +totalBackupSizeInMegaBytes,total_backup_size_in_mega_bytes +totalBaseCount,total_base_count +totalBranches,total_branches +totalBytesClassified,total_bytes_classified +totalChecks,total_checks +totalConnectors,total_connectors +totalControlsCount,total_controls_count +totalCount,total_count +totalCounts,total_counts +totalDataInMegaBytes,total_data_in_mega_bytes +totalDetections,total_detections +totalDetectionsSuppressed,total_detections_suppressed +totalDiscoveredResources,total_discovered_resources +totalDurationInMillis,total_duration_in_millis +totalEdgePropertyValues,total_edge_property_values +totalEvidence,total_evidence +totalExecutionDurationSeconds,total_execution_duration_seconds +totalFailureCount,total_failure_count +totalFindingsCount,total_findings_count +totalItemsClassified,total_items_classified +totalItemsSensitive,total_items_sensitive +totalItemsSkipped,total_items_skipped +totalItemsSkippedInvalidEncryption,total_items_skipped_invalid_encryption +totalItemsSkippedInvalidKms,total_items_skipped_invalid_kms +totalItemsSkippedPermissionDenied,total_items_skipped_permission_denied +totalJobs,total_jobs +totalMeCollectors,total_me_collectors +totalNoOfSrv,total_no_of_srv +totalNodePropertyValues,total_node_property_values +totalNodes,total_nodes +totalNumberOfFindings,total_number_of_findings +totalNumberOfJobs,total_number_of_jobs +totalParts,total_parts +totalReadCount,total_read_count +totalRecords,total_records +totalRecordsCount,total_records_count +totalRecordsProcessed,total_records_processed +totalReservedMinuteAllocation,total_reserved_minute_allocation +totalResourceUtilization,total_resource_utilization +totalResources,total_resources +totalResourcesCount,total_resources_count +totalResultCount,total_result_count +totalResults,total_results +totalScheduledMinutes,total_scheduled_minutes +totalSensors,total_sensors +totalServerGroups,total_server_groups +totalServers,total_servers +totalSizeInBytes,total_size_in_bytes +totalSizeInMegaBytes,total_size_in_mega_bytes +totalSourceServers,total_source_servers +totalStepCount,total_step_count +totalSteps,total_steps +totalStepsFailed,total_steps_failed +totalStepsSkipped,total_steps_skipped +totalStepsSucceeded,total_steps_succeeded +totalStorageBytes,total_storage_bytes +totals,totals +tpr,tpr +traceHeader,trace_header +tracingConfiguration,tracing_configuration +tracingEnabled,tracing_enabled +trackerName,tracker_name +trackingConfigArn,tracking_config_arn +trackingId,tracking_id +trackingInformation,tracking_information +trackingNamespaceName,tracking_namespace_name +trackingNamespaceVersion,tracking_namespace_version +trackingNumber,tracking_number +trafficGroupArn,traffic_group_arn +trafficRoutingConfig,traffic_routing_config +trafficWeight,traffic_weight +trailList,trail_list +trailNameList,trail_name_list +trailProperties,trail_properties +trails,trails +trainModelS3Location,train_model_s3_location +trainingDataCollectionStartDate,training_data_collection_start_date +trainingDataConfig,training_data_config +trainingDataSchema,training_data_schema +trainingDataSource,training_data_source +trainingEntryPointScript,training_entry_point_script +trainingHours,training_hours +trainingInputMode,training_input_mode +trainingInstanceType,training_instance_type +trainingInstanceVolumeSizeInGB,training_instance_volume_size_in_gb +trainingJobName,training_job_name +trainingLoss,training_loss +trainingMetrics,training_metrics +trainingMetricsV2,training_metrics_v2 +trainingMode,training_mode +trainingResult,training_result +trainingResultV2,training_result_v2 +trainingTimeOutInSeconds,training_time_out_in_seconds +trait,trait +traits,traits +tranformationToolInstallationLink,tranformation_tool_installation_link +transaction,transaction +transactionFee,transaction_fee +transactionHash,transaction_hash +transactionId,transaction_id +transactionIndex,transaction_index +transactionStatus,transaction_status +transactionTimestamp,transaction_timestamp +transactions,transactions +transcript,transcript +transcriptFilter,transcript_filter +transcriptFormat,transcript_format +transcriptSourceSetting,transcript_source_setting +transferData,transfer_data +transferDate,transfer_date +transferMessage,transfer_message +transferPerMonthInGb,transfer_per_month_in_gb +transferredCertificateArn,transferred_certificate_arn +transferredTo,transferred_to +transform,transform +transformEntryPointScript,transform_entry_point_script +transformationTool,transformation_tool +transitEncryption,transit_encryption +transitEncryptionEnabled,transit_encryption_enabled +transitEncryptionPort,transit_encryption_port +transitGatewayConfiguration,transit_gateway_configuration +transitGatewayID,transit_gateway_id +transitionEvents,transition_events +transitionType,transition_type +transitions,transitions +transmitDisabled,transmit_disabled +transportProtocol,transport_protocol +traversalDirection,traversal_direction +traversalType,traversal_type +treatMissingData,treat_missing_data +treatmentName,treatment_name +treatmentNames,treatment_names +treatmentWeights,treatment_weights +treatments,treatments +treeId,tree_id +trendField,trend_field +trialMinutes,trial_minutes +trigger,trigger +triggerArn,trigger_arn +triggerConfig,trigger_config +triggerConfigurations,trigger_configurations +triggerDetail,trigger_detail +triggerDetails,trigger_details +triggerEvents,trigger_events +triggerMode,trigger_mode +triggerName,trigger_name +triggerProperties,trigger_properties +triggerTargetArn,trigger_target_arn +triggerType,trigger_type +triggers,triggers +troubleshootingText,troubleshooting_text +truncated,truncated +truncatedEvents,truncated_events +trust,trust +trustAnchor,trust_anchor +trustAnchorArn,trust_anchor_arn +trustAnchorId,trust_anchor_id +trustAnchors,trust_anchors +trustPolicy,trust_policy +trustStore,trust_store +trustStoreArn,trust_store_arn +trustStores,trust_stores +truststoreUri,truststore_uri +truststoreVersion,truststore_version +truststoreWarnings,truststore_warnings +ttl,ttl +ttps,ttps +tumbling,tumbling +tunedHPOParams,tuned_hpo_params +tunnel,tunnel +tunnelArn,tunnel_arn +tunnelId,tunnel_id +tunnelSummaries,tunnel_summaries +turnNumber,turn_number +turnResult,turn_result +turnSpecification,turn_specification +turnsToLive,turns_to_live +type,type +typeFilter,type_filter +typeHint,type_hint +typeInfo,type_info +typeInfos,type_infos +typeName,type_name +types,types +typesFilePath,types_file_path +udid,udid +uid,uid +ulimits,ulimits +unauthorizedCacheControlHeaderStrategy,unauthorized_cache_control_header_strategy +uncertaintyRange,uncertainty_range +unclassifiableObjectCount,unclassifiable_object_count +unclassifiableObjectSizeInBytes,unclassifiable_object_size_in_bytes +undoDeprecate,undo_deprecate +unencrypted,unencrypted +unfinished,unfinished +unhealthyAgentlessCollectors,unhealthy_agentless_collectors +unhealthyAgents,unhealthy_agents +unhealthyConnectors,unhealthy_connectors +unhealthyMeCollectors,unhealthy_me_collectors +unhealthyThreshold,unhealthy_threshold +unhealthyThresholdCount,unhealthy_threshold_count +unicode,unicode +uninstallAfterBuild,uninstall_after_build +uniqueId,unique_id +uniqueProblems,unique_problems +unit,unit +unitLabel,unit_label +unitOfMeasure,unit_of_measure +units,units +unknown,unknown +unknownAgentlessCollectors,unknown_agentless_collectors +unknownAgents,unknown_agents +unknownConnectors,unknown_connectors +unknownMeCollectors,unknown_me_collectors +unlabeledEventsTreatment,unlabeled_events_treatment +unlimited,unlimited +unmanagedvCpus,unmanagedv_cpus +unmask,unmask +unmetered,unmetered +unmeteredDevices,unmetered_devices +unmeteredRemoteAccessDevices,unmetered_remote_access_devices +unprocessedAccounts,unprocessed_accounts +unprocessedEndTimes,unprocessed_end_times +unprocessedJobs,unprocessed_jobs +unprocessedResourceKeys,unprocessed_resource_keys +unprocessedWorlds,unprocessed_worlds +unsetDefaultVersion,unset_default_version +unsuccessful,unsuccessful +unsupportedResourceStatus,unsupported_resource_status +unsupportedResources,unsupported_resources +unvalidatedJSON,unvalidated_json +upToDate,up_to_date +upcomingMinutesScheduled,upcoming_minutes_scheduled +updatableAttributes,updatable_attributes +update,update +updateCACertificateParams,update_ca_certificate_params +updateCollectionDetail,update_collection_detail +updateConfig,update_config +updateConfiguration,update_configuration +updateDate,update_date +updateDateTime,update_date_time +updateDeviceCertificateParams,update_device_certificate_params +updateId,update_id +updateIds,update_ids +updateImageSetMetadataUpdates,update_image_set_metadata_updates +updateInstructionBatch,update_instruction_batch +updateMode,update_mode +updateOutdatedInstancesOnly,update_outdated_instances_only +updatePolicy,update_policy +updateReason,update_reason +updateResponse,update_response +updateResults,update_results +updateSingleCardinalityProperties,update_single_cardinality_properties +updateStatus,update_status +updateStatusReason,update_status_reason +updateTime,update_time +updateTimestamp,update_timestamp +updateToLatestImageVersion,update_to_latest_image_version +updateType,update_type +updated,updated +updatedAt,updated_at +updatedBy,updated_by +updatedByChangesetId,updated_by_changeset_id +updatedComponent,updated_component +updatedDate,updated_date +updatedForm,updated_form +updatedTheme,updated_theme +updatedTime,updated_time +updatesChangesetId,updates_changeset_id +upfrontPaymentAmount,upfront_payment_amount +uplinkBandwidthBits,uplink_bandwidth_bits +uplinkDelayMs,uplink_delay_ms +uplinkJitterMs,uplink_jitter_ms +uplinkLossPercent,uplink_loss_percent +upload,upload +uploadAllowed,upload_allowed +uploadBehavior,upload_behavior +uploadConfigurations,upload_configurations +uploadId,upload_id +uploadSequenceToken,upload_sequence_token +uploadStatus,upload_status +uploadUrl,upload_url +uploads,uploads +upperBoundValue,upper_bound_value +upperBoundValues,upper_bound_values +upperInclusive,upper_inclusive +upsertAction,upsert_action +upstream,upstream +upstreamRegistryUrl,upstream_registry_url +upstreams,upstreams +uri,uri +uris,uris +url,url +urlExpiry,url_expiry +urls,urls +usage,usage +usageCost,usage_cost +usageLimit,usage_limit +usageLimitArn,usage_limit_arn +usageLimitId,usage_limit_id +usageLimits,usage_limits +usagePlanId,usage_plan_id +usageState,usage_state +usageText,usage_text +usageTotals,usage_totals +usageType,usage_type +usageTypes,usage_types +useBase64,use_base64 +useCallerCredentials,use_caller_credentials +useDedicatedReplicationServer,use_dedicated_replication_server +useDefaultApplications,use_default_applications +useDefaultTools,use_default_tools +useDefaultUploadConfigurations,use_default_upload_configurations +useEventVariables,use_event_variables +useExtendedIds,use_extended_ids +useFipsEndpoint,use_fips_endpoint +useLatestRestorableAutoSnapshot,use_latest_restorable_auto_snapshot +useLatestRestorableTime,use_latest_restorable_time +useOnly,use_only +usePrefixAttributeValue,use_prefix_attribute_value +usePrivateIP,use_private_ip +usePrivateLinkForMetadataAndAuthorization,use_private_link_for_metadata_and_authorization +useStageCache,use_stage_cache +used,used +user,user +userAccessLoggingSettings,user_access_logging_settings +userAccessLoggingSettingsArn,user_access_logging_settings_arn +userAccessResultsList,user_access_results_list +userAccessTasksList,user_access_tasks_list +userAgent,user_agent +userArn,user_arn +userAttribute,user_attribute +userAttributes,user_attributes +userAttributesForFindings,user_attributes_for_findings +userCode,user_code +userData,user_data +userDataOverride,user_data_override +userDataValidationParameters,user_data_validation_parameters +userFeedback,user_feedback +userFirstName,user_first_name +userFullName,user_full_name +userGroups,user_groups +userId,user_id +userIdentity,user_identity +userIds,user_ids +userInitializationScripts,user_initialization_scripts +userLastName,user_last_name +userLoginName,user_login_name +userName,user_name +userPausedDetails,user_paused_details +userPoolArn,user_pool_arn +userPoolConfig,user_pool_config +userPoolId,user_pool_id +userProfiles,user_profiles +userProperties,user_properties +userProvidedEdgeIds,user_provided_edge_ids +userProvidedID,user_provided_id +userRole,user_role +userRoleArn,user_role_arn +userRules,user_rules +userSettings,user_settings +userSettingsArn,user_settings_arn +userStatus,user_status +userTurn,user_turn +userType,user_type +username,username +usernameClaim,username_claim +usernamePrefix,username_prefix +users,users +utilizationMetrics,utilization_metrics +utterance,utterance +utteranceFirstRecordedInAggregationDuration,utterance_first_recorded_in_aggregation_duration +utteranceInput,utterance_input +utteranceLastRecordedInAggregationDuration,utterance_last_recorded_in_aggregation_duration +utteranceLevelTestResults,utterance_level_test_results +utteranceRequestId,utterance_request_id +utteranceString,utterance_string +utteranceTimestamp,utterance_timestamp +utteranceUnderstood,utterance_understood +utterances,utterances +uuid,uuid +v1,v1 +v1BotLocale,v1_bot_locale +v1BotName,v1_bot_name +v1BotNameContains,v1_bot_name_contains +v1BotVersion,v1_bot_version +v2BotId,v2_bot_id +v2BotName,v2_bot_name +v2BotRole,v2_bot_role +vCPUHour,v_cpu_hour +valid,valid +validTimeRange,valid_time_range +validZones,valid_zones +validatePolicyResourceType,validate_policy_resource_type +validateRequestBody,validate_request_body +validateRequestParameters,validate_request_parameters +validatedDependencyRevisions,validated_dependency_revisions +validatedNamespaceVersion,validated_namespace_version +validation,validation +validationCertificateArn,validation_certificate_arn +validationDataConfig,validation_data_config +validationErrors,validation_errors +validationId,validation_id +validationLoss,validation_loss +validationMessage,validation_message +validationMetrics,validation_metrics +validationOutputList,validation_output_list +validationResults,validation_results +validationSettings,validation_settings +validationStatus,validation_status +validationWarnings,validation_warnings +validations,validations +validators,validators +validity,validity +value,value +valueElicitationPrompt,value_elicitation_prompt +valueElicitationPromptSpecification,value_elicitation_prompt_specification +valueElicitationSetting,value_elicitation_setting +valueFrom,value_from +valueKey,value_key +valueMappings,value_mappings +valueRegexPattern,value_regex_pattern +valueSelectionSetting,value_selection_setting +valueSelectionStrategy,value_selection_strategy +valueSet,value_set +valueString,value_string +valueType,value_type +values,values +variableEntries,variable_entries +variableImpactExplanations,variable_impact_explanations +variableImportance,variable_importance +variableImportanceMetrics,variable_importance_metrics +variableName,variable_name +variableNames,variable_names +variableType,variable_type +variables,variables +variance,variance +variantImportJobs,variant_import_jobs +variantStores,variant_stores +variantValues,variant_values +variants,variants +variation,variation +variations,variations +vaultName,vault_name +vaultNotificationConfig,vault_notification_config +vcenterBasedRemoteInfoList,vcenter_based_remote_info_list +vcenterClientID,vcenter_client_id +vcenterConfigurationTimeStamp,vcenter_configuration_time_stamp +vcenterUUID,vcenter_uuid +vcpus,vcpus +vehicleName,vehicle_name +vehicleSummaries,vehicle_summaries +vehicles,vehicles +vendor,vendor +vendorAdditionalFixedProperties,vendor_additional_fixed_properties +vendorAdditionalTransientProperties,vendor_additional_transient_properties +vendorCreatedAt,vendor_created_at +vendorGuidance,vendor_guidance +vendorGuidanceMessage,vendor_guidance_message +vendorProperties,vendor_properties +vendorSeverity,vendor_severity +vendorUpdatedAt,vendor_updated_at +vendorWorkerId,vendor_worker_id +vendorWorkerIpAddress,vendor_worker_ip_address +verificationCertificate,verification_certificate +verificationState,verification_state +verificationStateDescription,verification_state_description +verificationUri,verification_uri +verificationUriComplete,verification_uri_complete +verified,verified +version,version +versionArn,version_arn +versionCode,version_code +versionControl,version_control +versionControlConfigurationTimeStamp,version_control_configuration_time_stamp +versionControlInfoList,version_control_info_list +versionControlType,version_control_type +versionDescription,version_description +versionId,version_id +versionInfo,version_info +versionName,version_name +versionNumber,version_number +versionOptions,version_options +versionOrAlias,version_or_alias +versionQualifier,version_qualifier +versionRequirement,version_requirement +versionRequirements,version_requirements +versionRevision,version_revision +versionRevisions,version_revisions +versionSizeBytes,version_size_bytes +versionStatus,version_status +versionUpdateByJobsConfig,version_update_by_jobs_config +versioned,versioned +versioning,versioning +versioningConfiguration,versioning_configuration +versions,versions +verticalGap,vertical_gap +veryLow,very_low +video,video +videoCapture,video_capture +videoEndpoint,video_endpoint +videoHeight,video_height +videoWidth,video_width +viewerCount,viewer_count +viewerId,viewer_id +viewerSessionVersionsLessThanOrEqualTo,viewer_session_versions_less_than_or_equal_to +viewerSessions,viewer_sessions +violationEventAdditionalInfo,violation_event_additional_info +violationEventOccurrenceRange,violation_event_occurrence_range +violationEventTime,violation_event_time +violationEventType,violation_event_type +violationEvents,violation_events +violationId,violation_id +violationIds,violation_ids +violationStartTime,violation_start_time +virtualCluster,virtual_cluster +virtualClusterId,virtual_cluster_id +virtualClusterIdentifier,virtual_cluster_identifier +virtualClusters,virtual_clusters +virtualGateway,virtual_gateway +virtualGatewayId,virtual_gateway_id +virtualGatewayName,virtual_gateway_name +virtualGatewayOwnerAccount,virtual_gateway_owner_account +virtualGatewayRegion,virtual_gateway_region +virtualGatewayState,virtual_gateway_state +virtualGateways,virtual_gateways +virtualInterface,virtual_interface +virtualInterfaceId,virtual_interface_id +virtualInterfaceName,virtual_interface_name +virtualInterfaceOwnerAccount,virtual_interface_owner_account +virtualInterfaceRegion,virtual_interface_region +virtualInterfaceState,virtual_interface_state +virtualInterfaceTest,virtual_interface_test +virtualInterfaceTestHistory,virtual_interface_test_history +virtualInterfaceType,virtual_interface_type +virtualInterfaces,virtual_interfaces +virtualName,virtual_name +virtualNode,virtual_node +virtualNodeName,virtual_node_name +virtualNodes,virtual_nodes +virtualRouter,virtual_router +virtualRouterName,virtual_router_name +virtualRouters,virtual_routers +virtualService,virtual_service +virtualServiceName,virtual_service_name +virtualServices,virtual_services +visibility,visibility +vlan,vlan +vmId,vm_id +vmImportTaskId,vm_import_task_id +vmManagerId,vm_manager_id +vmManagerName,vm_manager_name +vmManagerType,vm_manager_type +vmName,vm_name +vmPath,vm_path +vmServer,vm_server +vmServerAddress,vm_server_address +vmServerAddressList,vm_server_address_list +vmWareUuid,vm_ware_uuid +vnfConfigurableProperties,vnf_configurable_properties +vnfInstanceId,vnf_instance_id +vnfPkgId,vnf_pkg_id +vnfPkgIds,vnf_pkg_ids +vnfPkgName,vnf_pkg_name +vnfProductName,vnf_product_name +vnfProvider,vnf_provider +vnfState,vnf_state +vnfcResourceInfo,vnfc_resource_info +vnfd,vnfd +vnfdId,vnfd_id +vnfdVersion,vnfd_version +voiceId,voice_id +voiceSettings,voice_settings +volumeArn,volume_arn +volumeArns,volume_arns +volumeBaselineIOPS,volume_baseline_iops +volumeBaselineThroughput,volume_baseline_throughput +volumeBurstIOPS,volume_burst_iops +volumeBurstThroughput,volume_burst_throughput +volumeConfiguration,volume_configuration +volumeEncryptionKMSKey,volume_encryption_kms_key +volumeId,volume_id +volumeMounts,volume_mounts +volumeRecommendationOptions,volume_recommendation_options +volumeRecommendations,volume_recommendations +volumeRetentionMode,volume_retention_mode +volumeSize,volume_size +volumeSizeInGB,volume_size_in_gb +volumeSizeInGb,volume_size_in_gb +volumeToConversionMap,volume_to_conversion_map +volumeToVolumeSize,volume_to_volume_size +volumeType,volume_type +volumes,volumes +volumesFrom,volumes_from +voutIndex,vout_index +vpc,vpc +vpcConfig,vpc_config +vpcConfiguration,vpc_configuration +vpcDestinationSummary,vpc_destination_summary +vpcEndpoint,vpc_endpoint +vpcEndpointDetails,vpc_endpoint_details +vpcEndpointErrorDetails,vpc_endpoint_error_details +vpcEndpointFilters,vpc_endpoint_filters +vpcEndpointId,vpc_endpoint_id +vpcEndpointIds,vpc_endpoint_ids +vpcEndpointSummaries,vpc_endpoint_summaries +vpcEndpoints,vpc_endpoints +vpcID,vpc_id +vpcId,vpc_id +vpcIdentifier,vpc_identifier +vpcLinkId,vpc_link_id +vpcProperties,vpc_properties +vpcSecurityGroupId,vpc_security_group_id +vpcSecurityGroupIds,vpc_security_group_ids +vpcSecurityGroups,vpc_security_groups +vpceConfiguration,vpce_configuration +vpceConfigurationArns,vpce_configuration_arns +vpceConfigurationDescription,vpce_configuration_description +vpceConfigurationName,vpce_configuration_name +vpceConfigurations,vpce_configurations +vpceIds,vpce_ids +vpceServiceName,vpce_service_name +vss,vss +vulnerabilities,vulnerabilities +vulnerability,vulnerability +vulnerabilityId,vulnerability_id +vulnerabilityIdAggregation,vulnerability_id_aggregation +vulnerabilityIds,vulnerability_ids +vulnerabilitySource,vulnerability_source +vulnerabilitySourceUpdatedAt,vulnerability_source_updated_at +vulnerablePackages,vulnerable_packages +wafWebAclArn,waf_web_acl_arn +waitAndContinueSpecification,wait_and_continue_specification +waitTimeInMinutes,wait_time_in_minutes +waitTimeSeconds,wait_time_seconds +waited,waited +waitingForDataCollectionChecks,waiting_for_data_collection_checks +waitingResponse,waiting_response +warehouse,warehouse +warned,warned +warnings,warnings +waveAggregatedStatus,wave_aggregated_status +waveID,wave_id +waveIDs,wave_ids +waves,waves +wavesCount,waves_count +webAclArn,web_acl_arn +webUrl,web_url +webhook,webhook +webhookArn,webhook_arn +webhookId,webhook_id +webhookName,webhook_name +webhookUrl,webhook_url +webhooks,webhooks +weeklySchedule,weekly_schedule +weight,weight +weightFactor,weight_factor +weightedTargets,weighted_targets +weights,weights +welcomeMessages,welcome_messages +width,width +wifi,wifi +window,window +windows,windows +windowsMountDrive,windows_mount_drive +windowsUser,windows_user +witnessedAt,witnessed_at +workIds,work_ids +workbookCursor,workbook_cursor +workbookId,workbook_id +workerConfiguration,worker_configuration +workerConfigurationArn,worker_configuration_arn +workerConfigurations,worker_configurations +workerCount,worker_count +workerFleets,worker_fleets +workerGroup,worker_group +workerLogDelivery,worker_log_delivery +workerName,worker_name +workerTypeSpecifications,worker_type_specifications +workers,workers +workflowArn,workflow_arn +workflowBucket,workflow_bucket +workflowBuildVersionArn,workflow_build_version_arn +workflowExecution,workflow_execution +workflowExecutionCancelRequestedEventAttributes,workflow_execution_cancel_requested_event_attributes +workflowExecutionCanceledEventAttributes,workflow_execution_canceled_event_attributes +workflowExecutionCompletedEventAttributes,workflow_execution_completed_event_attributes +workflowExecutionContinuedAsNewEventAttributes,workflow_execution_continued_as_new_event_attributes +workflowExecutionFailedEventAttributes,workflow_execution_failed_event_attributes +workflowExecutionId,workflow_execution_id +workflowExecutionRetentionPeriodInDays,workflow_execution_retention_period_in_days +workflowExecutionSignaledEventAttributes,workflow_execution_signaled_event_attributes +workflowExecutionStartedEventAttributes,workflow_execution_started_event_attributes +workflowExecutionTerminatedEventAttributes,workflow_execution_terminated_event_attributes +workflowExecutionTimedOutEventAttributes,workflow_execution_timed_out_event_attributes +workflowExecutions,workflow_executions +workflowId,workflow_id +workflowInputs,workflow_inputs +workflowName,workflow_name +workflowStepAutomationConfiguration,workflow_step_automation_configuration +workflowStepGroupsSummary,workflow_step_groups_summary +workflowStepsSummary,workflow_steps_summary +workflowSummaries,workflow_summaries +workflowType,workflow_type +workflowTypeVersion,workflow_type_version +workgroup,workgroup +workgroupArn,workgroup_arn +workgroupId,workgroup_id +workgroupName,workgroup_name +workgroups,workgroups +workingDirectory,working_directory +workspace,workspace +workspaceDataSources,workspace_data_sources +workspaceDescription,workspace_description +workspaceId,workspace_id +workspaceName,workspace_name +workspaceNotificationDestinations,workspace_notification_destinations +workspaceOrganizationalUnits,workspace_organizational_units +workspaceRoleArn,workspace_role_arn +workspaceSummaries,workspace_summaries +workspaces,workspaces +world,world +worldConfigs,world_configs +worldCount,world_count +worldDescriptionBody,world_description_body +worldExportJobSummaries,world_export_job_summaries +worldGenerationJobSummaries,world_generation_job_summaries +worldSummaries,world_summaries +worldTags,world_tags +worlds,worlds +writeCapacityUnits,write_capacity_units +writeOperationType,write_operation_type +x,x +x509CertificateData,x509_certificate_data +x509Subject,x509_subject +xAmzErrorType,x_amz_error_type +xmlNamespace,xml_namespace +xrayEnabled,xray_enabled +xsltTemplateName,xslt_template_name +xsltTemplateNameForMacSec,xslt_template_name_for_mac_sec +y,y +year,year +z,z +zipUploadUrl,zip_upload_url +zonalShiftId,zonal_shift_id +zonalShifts,zonal_shifts +zoneName,zone_name diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt index bb31a55d262..7c3acff6ab2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt @@ -11,7 +11,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.util.toPascalCase -import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext @@ -60,7 +59,7 @@ class ScopeMacroGenerator( }; """ } - val crateName = codegenContext.moduleName.toSnakeCase() + val crateName = codegenContext.moduleUseName() // If we have a second operation we can perform further checks val otherOperationName: String? = operations.toList().getOrNull(1)?.let { From 0f9080658dae6660a34bb303dbff45c8dcac5ca4 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 10 Oct 2023 10:04:21 -0700 Subject: [PATCH 164/331] Remove `CaptureSmithyConnectionWrapper` (#3045) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-http/src/connection.rs | 56 +------------- .../src/client/http/connection_poisoning.rs | 73 ++++++++++++------- .../src/client/http/hyper_014.rs | 3 +- 3 files changed, 50 insertions(+), 82 deletions(-) diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs index 38c5fdf38f9..99ae574232b 100644 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ b/rust-runtime/aws-smithy-http/src/connection.rs @@ -7,7 +7,7 @@ use std::fmt::{Debug, Formatter}; use std::net::SocketAddr; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; /// Metadata that tracks the state of an active connection. #[derive(Clone)] @@ -51,57 +51,3 @@ impl Debug for ConnectionMetadata { .finish() } } - -type LoaderFn = dyn Fn() -> Option + Send + Sync; - -/// State for a middleware that will monitor and manage connections. -#[allow(missing_debug_implementations)] -#[derive(Clone, Default)] -pub struct CaptureSmithyConnection { - loader: Arc>>>, -} - -impl CaptureSmithyConnection { - /// Create a new connection monitor. - pub fn new() -> Self { - Self { - loader: Default::default(), - } - } - - /// Set the retriever that will capture the `hyper` connection. - pub fn set_connection_retriever(&self, f: F) - where - F: Fn() -> Option + Send + Sync + 'static, - { - *self.loader.lock().unwrap() = Some(Box::new(f)); - } - - /// Get the associated connection metadata. - pub fn get(&self) -> Option { - match self.loader.lock().unwrap().as_ref() { - Some(loader) => loader(), - None => { - tracing::debug!("no loader was set on the CaptureSmithyConnection"); - None - } - } - } -} - -#[cfg(test)] -mod test { - use crate::connection::{CaptureSmithyConnection, ConnectionMetadata}; - - #[test] - #[allow(clippy::redundant_clone)] - fn retrieve_connection_metadata() { - let retriever = CaptureSmithyConnection::new(); - let retriever_clone = retriever.clone(); - assert!(retriever.get().is_none()); - retriever.set_connection_retriever(|| Some(ConnectionMetadata::new(true, None, || {}))); - - assert!(retriever.get().is_some()); - assert!(retriever_clone.get().is_some()); - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index d15d8230a05..438a94752de 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; +use aws_smithy_http::connection::ConnectionMetadata; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, @@ -14,6 +14,7 @@ use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryConfig}; use std::fmt; +use std::sync::{Arc, Mutex}; use tracing::{debug, error}; /// An interceptor for poisoning connections in response to certain events. @@ -52,11 +53,11 @@ impl Interceptor for ConnectionPoisoningInterceptor { _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let capture_smithy_connection = CaptureSmithyConnectionWrapper::new(); + let capture_smithy_connection = CaptureSmithyConnection::new(); context .request_mut() .extensions_mut() - .insert(capture_smithy_connection.clone_inner()); + .insert(capture_smithy_connection.clone()); cfg.interceptor_state().store_put(capture_smithy_connection); Ok(()) @@ -72,7 +73,7 @@ impl Interceptor for ConnectionPoisoningInterceptor { .load::() .map(RetryConfig::reconnect_mode) .unwrap_or(ReconnectMode::ReconnectOnTransientError); - let captured_connection = cfg.load::().cloned(); + let captured_connection = cfg.load::().cloned(); let retry_classifiers = runtime_components .retry_classifiers() .ok_or("retry classifiers are required for connection poisoning to work")?; @@ -101,46 +102,66 @@ impl Interceptor for ConnectionPoisoningInterceptor { } } -// TODO(enableNewSmithyRuntimeCleanup): A storable wrapper won't be needed anymore once we absorb aws_smithy_http into the new runtime crate. -/// A wrapper around CaptureSmithyConnection that implements `Storable` so that it can be added to the `ConfigBag`. +type LoaderFn = dyn Fn() -> Option + Send + Sync; + +/// State for a middleware that will monitor and manage connections. +#[allow(missing_debug_implementations)] #[derive(Clone, Default)] -pub struct CaptureSmithyConnectionWrapper { - inner: CaptureSmithyConnection, +pub struct CaptureSmithyConnection { + loader: Arc>>>, } -impl CaptureSmithyConnectionWrapper { - /// Creates a new `CaptureSmithyConnectionWrapper`. +impl CaptureSmithyConnection { + /// Create a new connection monitor. pub fn new() -> Self { Self { - inner: CaptureSmithyConnection::new(), + loader: Default::default(), } } - /// Returns a reference to the inner `CaptureSmithyConnection`. - pub fn clone_inner(&self) -> CaptureSmithyConnection { - self.inner.clone() + /// Set the retriever that will capture the `hyper` connection. + pub fn set_connection_retriever(&self, f: F) + where + F: Fn() -> Option + Send + Sync + 'static, + { + *self.loader.lock().unwrap() = Some(Box::new(f)); } - /// Returns the captured connection metadata, if any. + /// Get the associated connection metadata. pub fn get(&self) -> Option { - self.inner.get() + match self.loader.lock().unwrap().as_ref() { + Some(loader) => loader(), + None => { + tracing::debug!("no loader was set on the CaptureSmithyConnection"); + None + } + } } +} - /// Sets the connection retriever function. - pub fn set_connection_retriever(&self, f: F) - where - F: Fn() -> Option + Send + Sync + 'static, - { - self.inner.set_connection_retriever(f) +impl fmt::Debug for CaptureSmithyConnection { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "CaptureSmithyConnection") } } -impl Storable for CaptureSmithyConnectionWrapper { +impl Storable for CaptureSmithyConnection { type Storer = StoreReplace; } -impl fmt::Debug for CaptureSmithyConnectionWrapper { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "CaptureSmithyConnectionWrapper") +#[cfg(test)] +mod test { + use super::*; + + #[test] + #[allow(clippy::redundant_clone)] + fn retrieve_connection_metadata() { + let retriever = CaptureSmithyConnection::new(); + let retriever_clone = retriever.clone(); + assert!(retriever.get().is_none()); + retriever.set_connection_retriever(|| Some(ConnectionMetadata::new(true, None, || {}))); + + assert!(retriever.get().is_some()); + assert!(retriever_clone.get().is_some()); } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 6ddfc8b962b..7d737352a99 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::client::http::connection_poisoning::CaptureSmithyConnection; use aws_smithy_async::future::timeout::TimedOutError; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_http::body::SdkBody; -use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; +use aws_smithy_http::connection::ConnectionMetadata; use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::http::{ From d1ad9373782c04b396cb96d01743641b3c56c166 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 10 Oct 2023 10:58:43 -0700 Subject: [PATCH 165/331] Remove commented test (#3051) Tests have been added to other locations for the functionality being tested by this commented out code. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../s3/tests/config-override.rs | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index 5c1b08eee38..653313e2387 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -67,39 +67,3 @@ async fn operation_overrides_dual_stack() { "https://test-bucket.s3.dualstack.us-west-2.amazonaws.com/?list-type=2" ); } - -// TODO(enableNewSmithyRuntimeCleanup): Comment in the following test once Handle is no longer -// accessed in ServiceRuntimePlugin::config. Currently, a credentials cache created for a single -// operation invocation is not picked up by an identity resolver. -/* -#[tokio::test] -async fn operation_overrides_credentials_provider() { - let (captured_request, client) = test_client(); - let _ = client - .list_objects_v2() - .bucket("test-bucket") - .customize() - .config_override(aws_sdk_s3::config::Config::builder().credentials_provider(Credentials::new( - "test", - "test", - Some("test".into()), - Some(std::time::UNIX_EPOCH + std::time::Duration::from_secs(1669257290 + 3600)), - "test", - ))) - .send() - .await; - - let request = captured_request.expect_request(); - let actual_auth = - std::str::from_utf8(request.headers().get("authorization").unwrap().as_bytes()).unwrap(); - // signature would be f98cc3911dfba0daabf4343152f456bff9ecd3888a3068a1346d26949cb8f9e5 - // if we used `Credentials::for_tests()` - let expected_sig = "Signature=d7e7be63efc37c5bab5eda121999cd1c9a95efdde0cc1ce7c1b8761051cc3cbd"; - assert!( - actual_auth.contains(expected_sig), - "authorization header signature did not match expected signature: expected {} but not found in {}", - expected_sig, - actual_auth, - ); -} -*/ From 96a9f8441e1a6622c36d2b7a4d4155b303e0db59 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Tue, 10 Oct 2023 14:07:23 -0500 Subject: [PATCH 166/331] implement user-configurable retry classifiers (#2977) [Read the RFC here](https://github.com/awslabs/smithy-rs/pull/3018) ## Motivation and Context #2417 ## Description Exactly what it says on the tin. I have a related RFC to publish that goes into more depth. ## Testing I wrote an integration test that ensures a custom retry classifier can be set and is called. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 20 ++ .../src/http_credential_provider.rs | 46 ++- .../aws-config/src/imds/client.rs | 52 ++- .../invalid_config/test-case.json | 2 +- .../retry_on_error/test-case.json | 2 +- aws/rust-runtime/aws-runtime/src/retries.rs | 2 +- .../retries/{classifier.rs => classifiers.rs} | 139 ++++---- .../src/http_request/canonical_request.rs | 3 +- .../smithy/rustsdk/InvocationIdDecorator.kt | 2 +- .../rustsdk/RecursionDetectionDecorator.kt | 2 +- .../rustsdk/RetryClassifierDecorator.kt | 40 +-- .../RetryInformationHeaderDecorator.kt | 4 +- .../smithy/rustsdk/UserAgentDecorator.kt | 2 +- .../apigateway/ApiGatewayDecorator.kt | 2 +- .../customize/glacier/GlacierDecorator.kt | 2 +- .../kms/tests/retryable_errors.rs | 19 +- aws/sdk/integration-tests/s3/Cargo.toml | 2 +- .../three-retries_and-then-success.json | 4 +- .../tests/retry-classifier-customization.rs | 135 ++++++++ .../ConnectionPoisoningConfigCustomization.kt | 2 +- .../RetryClassifierConfigCustomization.kt | 297 ++++++++++++++++++ .../customize/RequiredCustomizations.kt | 12 +- .../ClientRuntimeTypesReExportGenerator.kt | 6 +- .../generators/OperationCustomization.kt | 24 +- .../OperationRuntimePluginGenerator.kt | 19 +- .../ServiceRuntimePluginGenerator.kt | 31 +- .../client/FluentClientGenerator.kt | 12 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 4 +- .../config/ServiceConfigGeneratorTest.kt | 7 +- .../protocol/ProtocolTestGeneratorTest.kt | 2 +- .../src/client/retries.rs | 106 ++----- .../src/client/retries/classifiers.rs | 267 ++++++++++++++++ .../src/client/runtime_components.rs | 58 +++- .../src/client/runtime_plugin.rs | 4 +- .../src/client/http/connection_poisoning.rs | 16 +- .../src/client/orchestrator/operation.rs | 17 +- .../aws-smithy-runtime/src/client/retries.rs | 2 +- .../retries/{classifier.rs => classifiers.rs} | 172 ++++++---- .../src/client/retries/strategy.rs | 5 - .../client/retries/strategy/fixed_delay.rs | 105 ------- .../src/client/retries/strategy/standard.rs | 101 +++--- .../tests/reconnect_on_transient_error.rs | 45 +-- rust-runtime/aws-smithy-types/src/retry.rs | 11 + 43 files changed, 1190 insertions(+), 615 deletions(-) rename aws/rust-runtime/aws-runtime/src/retries/{classifier.rs => classifiers.rs} (62%) create mode 100644 aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs rename rust-runtime/aws-smithy-runtime/src/client/retries/{classifier.rs => classifiers.rs} (56%) delete mode 100644 rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 84bd2a26d54..8eb793b8067 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -303,3 +303,23 @@ message = "Our algorithm for converting identifiers to `snake_case` has been upd references = ["smithy-rs#3037", "aws-sdk-rust#756"] meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "all" } author = "rcoh" + +[[smithy-rs]] +message = """ +Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. + +For more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050). +""" +references = ["smithy-rs#2417", "smithy-rs#3018"] +meta = { "breaking" = true, "tada" = true, "bug" = false, "target" = "client" } +author = "Velfi" + +[[aws-sdk-rust]] +message = """ +Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. + +For more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050). +""" +references = ["smithy-rs#2417", "smithy-rs#3018"] +meta = { "breaking" = true, "tada" = true, "bug" = false } +author = "Velfi" diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index 0a39adf7b91..c3f69208f21 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -15,18 +15,19 @@ use aws_credential_types::Credentials; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; -use aws_smithy_runtime::client::retries::classifier::{ - HttpStatusCodeClassifier, SmithyErrorClassifier, +use aws_smithy_runtime::client::retries::classifiers::{ + HttpStatusCodeClassifier, TransientErrorClassifier, }; use aws_smithy_runtime_api::client::http::HttpConnectorSettings; use aws_smithy_runtime_api::client::interceptors::context::{Error, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{ HttpResponse, OrchestratorError, SensitiveOutput, }; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryClassifiers, RetryReason}; +use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; +use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; use aws_smithy_types::config_bag::Layer; -use aws_smithy_types::retry::{ErrorKind, RetryConfig}; +use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use http::header::{ACCEPT, AUTHORIZATION}; use http::{HeaderValue, Response}; @@ -88,18 +89,6 @@ impl Builder { ) -> HttpCredentialProvider { let provider_config = self.provider_config.unwrap_or_default(); - // The following errors are retryable: - // - Socket errors - // - Networking timeouts - // - 5xx errors - // - Non-parseable 200 responses. - let retry_classifiers = RetryClassifiers::new() - .with_classifier(HttpCredentialRetryClassifier) - // Socket errors and network timeouts - .with_classifier(SmithyErrorClassifier::::new()) - // 5xx errors - .with_classifier(HttpStatusCodeClassifier::default()); - let mut builder = Operation::builder() .service_name("HttpCredentialProvider") .operation_name("LoadCredentials") @@ -123,7 +112,16 @@ impl Builder { if let Some(sleep_impl) = provider_config.sleep_impl() { builder = builder .standard_retry(&RetryConfig::standard()) - .retry_classifiers(retry_classifiers) + // The following errors are retryable: + // - Socket errors + // - Networking timeouts + // - 5xx errors + // - Non-parseable 200 responses. + .retry_classifier(HttpCredentialRetryClassifier) + // Socket errors and network timeouts + .retry_classifier(TransientErrorClassifier::::new()) + // 5xx errors + .retry_classifier(HttpStatusCodeClassifier::default()) .sleep_impl(sleep_impl); } else { builder = builder.no_retry(); @@ -192,11 +190,11 @@ impl ClassifyRetry for HttpCredentialRetryClassifier { "HttpCredentialRetryClassifier" } - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - let output_or_error = ctx.output_or_error()?; + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + let output_or_error = ctx.output_or_error(); let error = match output_or_error { - Ok(_) => return None, - Err(err) => err, + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, }; // Retry non-parseable 200 responses @@ -206,11 +204,11 @@ impl ClassifyRetry for HttpCredentialRetryClassifier { .zip(ctx.response().map(HttpResponse::status)) { if matches!(err, CredentialsError::Unhandled { .. }) && status.is_success() { - return Some(RetryReason::Error(ErrorKind::ServerError)); + return RetryAction::server_error(); } } - None + RetryAction::NoActionIndicated } } @@ -308,7 +306,7 @@ mod test { } #[tokio::test] - async fn explicit_error_not_retriable() { + async fn explicit_error_not_retryable() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( Request::builder() .uri(Uri::from_static("http://localhost:1234/some-creds")) diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index be93a1fe437..67054a67f44 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -21,15 +21,15 @@ use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; use aws_smithy_runtime_api::client::endpoint::{EndpointResolver, EndpointResolverParams}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::{ - Future, HttpResponse, OrchestratorError, SensitiveOutput, +use aws_smithy_runtime_api::client::orchestrator::{Future, OrchestratorError, SensitiveOutput}; +use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, SharedRetryClassifier, }; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryClassifiers, RetryReason}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; use aws_smithy_types::config_bag::{FrozenLayer, Layer}; use aws_smithy_types::endpoint::Endpoint; -use aws_smithy_types::retry::{ErrorKind, RetryConfig}; +use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::os_shim_internal::Env; use http::Uri; @@ -250,9 +250,7 @@ impl ImdsCommonRuntimePlugin { .with_http_client(config.http_client()) .with_endpoint_resolver(Some(endpoint_resolver)) .with_interceptor(UserAgentInterceptor::new()) - .with_retry_classifiers(Some( - RetryClassifiers::new().with_classifier(ImdsResponseRetryClassifier), - )) + .with_retry_classifier(SharedRetryClassifier::new(ImdsResponseRetryClassifier)) .with_retry_strategy(Some(StandardRetryStrategy::new(retry_config))) .with_time_source(Some(config.time_source())) .with_sleep_impl(config.sleep_impl()), @@ -548,32 +546,26 @@ impl EndpointResolver for ImdsEndpointResolver { #[derive(Clone, Debug)] struct ImdsResponseRetryClassifier; -impl ImdsResponseRetryClassifier { - fn classify(response: &HttpResponse) -> Option { - let status = response.status(); - match status { - _ if status.is_server_error() => Some(RetryReason::Error(ErrorKind::ServerError)), - // 401 indicates that the token has expired, this is retryable - _ if status.as_u16() == 401 => Some(RetryReason::Error(ErrorKind::ServerError)), - // This catch-all includes successful responses that fail to parse. These should not be retried. - _ => None, - } - } -} - impl ClassifyRetry for ImdsResponseRetryClassifier { fn name(&self) -> &'static str { "ImdsResponseRetryClassifier" } - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { if let Some(response) = ctx.response() { - Self::classify(response) + let status = response.status(); + match status { + _ if status.is_server_error() => RetryAction::server_error(), + // 401 indicates that the token has expired, this is retryable + _ if status.as_u16() == 401 => RetryAction::server_error(), + // This catch-all includes successful responses that fail to parse. These should not be retried. + _ => RetryAction::NoActionIndicated, + } } else { // Don't retry timeouts for IMDS, or else it will take ~30 seconds for the default // credentials provider chain to fail to provide credentials. // Also don't retry non-responses. - None + RetryAction::NoActionIndicated } } } @@ -596,7 +588,7 @@ pub(crate) mod test { use aws_smithy_runtime_api::client::orchestrator::{ HttpRequest, HttpResponse, OrchestratorError, }; - use aws_smithy_runtime_api::client::retries::ClassifyRetry; + use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; use http::header::USER_AGENT; @@ -915,21 +907,27 @@ pub(crate) mod test { http_client.assert_requests_match(&[]); } - /// Successful responses should classify as `RetryKind::Unnecessary` + /// The classifier should return `None` when classifying a successful response. #[test] fn successful_response_properly_classified() { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Ok(Output::doesnt_matter())); ctx.set_response(imds_response("").map(|_| SdkBody::empty())); let classifier = ImdsResponseRetryClassifier; - assert_eq!(None, classifier.classify_retry(&ctx)); + assert_eq!( + RetryAction::NoActionIndicated, + classifier.classify_retry(&ctx) + ); // Emulate a failure to parse the response body (using an io error since it's easy to construct in a test) let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::connector(ConnectorError::io( io::Error::new(io::ErrorKind::BrokenPipe, "fail to parse").into(), )))); - assert_eq!(None, classifier.classify_retry(&ctx)); + assert_eq!( + RetryAction::NoActionIndicated, + classifier.classify_retry(&ctx) + ); } // since tokens are sent as headers, the tokens need to be valid header values diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json b/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json index 7e15f5fdd48..21bce59c31c 100644 --- a/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json @@ -1,5 +1,5 @@ { - "name": "empty-config", + "name": "invalid-config", "docs": "config was invalid", "result": { "ErrorContains": "could not parse profile file" diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json b/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json index 4119ccfb5e7..c92373f783b 100644 --- a/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json @@ -1,5 +1,5 @@ { - "name": "e2e-assume-role", + "name": "retry-on-error", "docs": "end to end successful role assumption", "result": { "Ok": { diff --git a/aws/rust-runtime/aws-runtime/src/retries.rs b/aws/rust-runtime/aws-runtime/src/retries.rs index ed12aa9cde6..acefc98028f 100644 --- a/aws/rust-runtime/aws-runtime/src/retries.rs +++ b/aws/rust-runtime/aws-runtime/src/retries.rs @@ -4,4 +4,4 @@ */ /// Classifiers that can inspect a response and determine if it should be retried. -pub mod classifier; +pub mod classifiers; diff --git a/aws/rust-runtime/aws-runtime/src/retries/classifier.rs b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs similarity index 62% rename from aws/rust-runtime/aws-runtime/src/retries/classifier.rs rename to aws/rust-runtime/aws-runtime/src/retries/classifiers.rs index d73cdf4212a..7dcb4f9a86a 100644 --- a/aws/rust-runtime/aws-runtime/src/retries/classifier.rs +++ b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs @@ -6,7 +6,9 @@ use aws_smithy_http::http::HttpHeaders; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, RetryClassifierPriority, RetryReason, +}; use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_smithy_types::retry::ErrorKind; use std::error::Error as StdError; @@ -52,88 +54,74 @@ impl ClassifyRetry for AwsErrorCodeClassifier where E: StdError + ProvideErrorMetadata + Send + Sync + 'static, { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - let error = ctx - .output_or_error()? - .err() - .and_then(OrchestratorError::as_operation_error)? - .downcast_ref::()?; - - if let Some(error_code) = error.code() { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + let retry_after = ctx + .response() + .and_then(|res| res.http_headers().get("x-amz-retry-after")) + .and_then(|header| header.to_str().ok()) + .and_then(|header| header.parse::().ok()) + .map(std::time::Duration::from_millis); + + let error_code = OrchestratorError::as_operation_error(error) + .and_then(|err| err.downcast_ref::()) + .and_then(|err| err.code()); + + if let Some(error_code) = error_code { if THROTTLING_ERRORS.contains(&error_code) { - return Some(RetryReason::Error(ErrorKind::ThrottlingError)); - } else if TRANSIENT_ERRORS.contains(&error_code) { - return Some(RetryReason::Error(ErrorKind::TransientError)); + return RetryAction::RetryIndicated(RetryReason::RetryableError { + kind: ErrorKind::ThrottlingError, + retry_after, + }); + } + if TRANSIENT_ERRORS.contains(&error_code) { + return RetryAction::RetryIndicated(RetryReason::RetryableError { + kind: ErrorKind::TransientError, + retry_after, + }); } }; - None + debug_assert!( + retry_after.is_none(), + "retry_after should be None if the error wasn't an identifiable AWS error" + ); + + RetryAction::NoActionIndicated } fn name(&self) -> &'static str { "AWS Error Code" } -} - -/// A retry classifier that checks for `x-amz-retry-after` headers. If one is found, a -/// [`RetryReason::Explicit`] is returned containing the duration to wait before retrying. -#[derive(Debug, Default)] -pub struct AmzRetryAfterHeaderClassifier; -impl AmzRetryAfterHeaderClassifier { - /// Create a new `AmzRetryAfterHeaderClassifier`. - pub fn new() -> Self { - Self - } -} - -impl ClassifyRetry for AmzRetryAfterHeaderClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - ctx.response() - .and_then(|res| res.http_headers().get("x-amz-retry-after")) - .and_then(|header| header.to_str().ok()) - .and_then(|header| header.parse::().ok()) - .map(|retry_after_delay| { - RetryReason::Explicit(std::time::Duration::from_millis(retry_after_delay)) - }) - } - - fn name(&self) -> &'static str { - "'Retry After' Header" + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::with_lower_priority_than( + RetryClassifierPriority::modeled_as_retryable_classifier(), + ) } } #[cfg(test)] mod test { - use super::*; + use crate::retries::classifiers::AwsErrorCodeClassifier; use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input}; + use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_smithy_types::error::ErrorMetadata; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; + use aws_smithy_types::retry::ErrorKind; use std::fmt; use std::time::Duration; - #[derive(Debug)] - struct UnmodeledError; - - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - - impl std::error::Error for UnmodeledError {} - - impl ProvideErrorKind for UnmodeledError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - None - } - } - #[derive(Debug)] struct CodedError { metadata: ErrorMetadata, @@ -169,19 +157,13 @@ mod test { CodedError::new("Throttling"), )))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::ThrottlingError)) - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error()); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( CodedError::new("RequestTimeout"), )))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)) - ) + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error()) } #[test] @@ -194,15 +176,13 @@ mod test { ctx.set_response(test_response); ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::ThrottlingError)) - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error()); } #[test] fn test_retry_after_header() { - let policy = AmzRetryAfterHeaderClassifier; + let policy = AwsErrorCodeClassifier::::new(); + let err = aws_smithy_types::Error::builder().code("SlowDown").build(); let res = http::Response::builder() .header("x-amz-retry-after", "5000") .body("retry later") @@ -210,13 +190,14 @@ mod test { .map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(res); - ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( - UnmodeledError, - )))); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); assert_eq!( policy.classify_retry(&ctx), - Some(RetryReason::Explicit(Duration::from_millis(5000))), + RetryAction::retryable_error_with_explicit_delay( + ErrorKind::ThrottlingError, + Duration::from_secs(5) + ) ); } } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index eb9724666c8..10d23338f89 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -926,6 +926,7 @@ mod tests { ); } + #[allow(clippy::ptr_arg)] // The proptest macro requires this arg to be a Vec instead of a slice. fn valid_input(input: &Vec) -> bool { [ "content-length".to_owned(), @@ -933,7 +934,7 @@ mod tests { "host".to_owned(), ] .iter() - .all(|element| !input.contains(&element)) + .all(|element| !input.contains(element)) } proptest! { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt index 797203039f9..def448bd55d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt @@ -45,7 +45,7 @@ private class InvocationIdRuntimePluginCustomization( override fun section(section: ServiceRuntimePluginSection): Writable = writable { if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { - section.registerInterceptor(codegenContext.runtimeConfig, this) { + section.registerInterceptor(this) { rustTemplate("#{InvocationIdInterceptor}::new()", *codegenScope) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt index bb7d13625cb..5809d8b4b39 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt @@ -29,7 +29,7 @@ private class RecursionDetectionRuntimePluginCustomization( ) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { - section.registerInterceptor(codegenContext.runtimeConfig, this) { + section.registerInterceptor(this) { rust( "#T::new()", AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt index 12fec399682..6b3c0185e34 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCus import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType class RetryClassifierDecorator : ClientCodegenDecorator { override val name: String = "RetryPolicy" @@ -28,39 +27,20 @@ class RetryClassifierDecorator : ClientCodegenDecorator { class OperationRetryClassifiersFeature( codegenContext: ClientCodegenContext, - operation: OperationShape, + val operation: OperationShape, ) : OperationCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) - private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) - private val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) - private val codegenScope = arrayOf( - // Classifiers - "SmithyErrorClassifier" to smithyRuntime.resolve("client::retries::classifier::SmithyErrorClassifier"), - "AmzRetryAfterHeaderClassifier" to awsRuntime.resolve("retries::classifier::AmzRetryAfterHeaderClassifier"), - "ModeledAsRetryableClassifier" to smithyRuntime.resolve("client::retries::classifier::ModeledAsRetryableClassifier"), - "AwsErrorCodeClassifier" to awsRuntime.resolve("retries::classifier::AwsErrorCodeClassifier"), - "HttpStatusCodeClassifier" to smithyRuntime.resolve("client::retries::classifier::HttpStatusCodeClassifier"), - // Other Types - "ClassifyRetry" to smithyRuntimeApi.resolve("client::retries::ClassifyRetry"), - "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "OperationError" to codegenContext.symbolProvider.symbolForOperationError(operation), - "OrchestratorError" to smithyRuntimeApi.resolve("client::orchestrator::OrchestratorError"), - "RetryReason" to smithyRuntimeApi.resolve("client::retries::RetryReason"), - ) + private val symbolProvider = codegenContext.symbolProvider override fun section(section: OperationSection) = when (section) { - is OperationSection.RetryClassifier -> writable { - rustTemplate( - """ - .with_classifier(#{SmithyErrorClassifier}::<#{OperationError}>::new()) - .with_classifier(#{AmzRetryAfterHeaderClassifier}) - .with_classifier(#{ModeledAsRetryableClassifier}::<#{OperationError}>::new()) - .with_classifier(#{AwsErrorCodeClassifier}::<#{OperationError}>::new()) - .with_classifier(#{HttpStatusCodeClassifier}::default()) - """, - *codegenScope, - ) + is OperationSection.RetryClassifiers -> writable { + section.registerRetryClassifier(this) { + rustTemplate( + "#{AwsErrorCodeClassifier}::<#{OperationError}>::new()", + "AwsErrorCodeClassifier" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve("retries::classifiers::AwsErrorCodeClassifier"), + "OperationError" to symbolProvider.symbolForOperationError(operation), + ) + } } else -> emptySection diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt index 1d9f949e450..2a354327f60 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt @@ -32,7 +32,7 @@ private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodege override fun section(section: ServiceRuntimePluginSection): Writable = writable { if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { // Track the latency between client and server. - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust( "#T::new()", awsRuntime.resolve("service_clock_skew::ServiceClockSkewInterceptor"), @@ -40,7 +40,7 @@ private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodege } // Add request metadata to outgoing requests. Sets a header. - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust("#T::new()", awsRuntime.resolve("request_info::RequestInfoInterceptor")) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index 2619b224fcc..058acab9cce 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -91,7 +91,7 @@ class UserAgentDecorator : ClientCodegenDecorator { override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust("#T::new()", awsRuntime.resolve("user_agent::UserAgentInterceptor")) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt index c58fb0c20af..9c64a26d8ad 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt @@ -31,7 +31,7 @@ private class ApiGatewayAcceptHeaderInterceptorCustomization(private val codegen ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { - section.registerInterceptor(codegenContext.runtimeConfig, this) { + section.registerInterceptor(this) { rustTemplate( "#{Interceptor}::default()", "Interceptor" to RuntimeType.forInlineDependency( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt index 847eef9eac7..713280ceaac 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt @@ -87,7 +87,7 @@ private class GlacierApiVersionCustomization(private val codegenContext: ClientC override fun section(section: ServiceRuntimePluginSection): Writable = writable { if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { val apiVersion = codegenContext.serviceShape.version - section.registerInterceptor(codegenContext.runtimeConfig, this) { + section.registerInterceptor(this) { rustTemplate( "#{Interceptor}::new(${apiVersion.dq()})", "Interceptor" to inlineModule(codegenContext.runtimeConfig).resolve("GlacierApiVersionInterceptor"), diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index 1b932e4be4c..5e603d28275 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -4,14 +4,13 @@ */ use aws_credential_types::Credentials; -use aws_runtime::retries::classifier::AwsErrorCodeClassifier; +use aws_runtime::retries::classifiers::AwsErrorCodeClassifier; use aws_sdk_kms as kms; use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::http::test_util::infallible_client_fn; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; -use aws_smithy_types::retry::ErrorKind; +use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; use bytes::Bytes; use kms::operation::create_alias::CreateAliasError; @@ -50,11 +49,8 @@ async fn errors_are_retryable() { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let err = err.into_service_error(); ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); - let retry_kind = classifier.classify_retry(&ctx); - assert_eq!( - Some(RetryReason::Error(ErrorKind::ThrottlingError)), - retry_kind - ); + let retry_action = classifier.classify_retry(&ctx); + assert_eq!(RetryAction::throttling_error(), retry_action); } #[tokio::test] @@ -72,9 +68,6 @@ async fn unmodeled_errors_are_retryable() { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let err = err.into_service_error(); ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); - let retry_kind = classifier.classify_retry(&ctx); - assert_eq!( - Some(RetryReason::Error(ErrorKind::ThrottlingError)), - retry_kind - ); + let retry_action = classifier.classify_retry(&ctx); + assert_eq!(RetryAction::throttling_error(), retry_action); } diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 1cf92d5d216..97c70e29de7 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -31,7 +31,7 @@ aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1" bytes-utils = "0.1.2" -fastrand = "2.0.0" +fastrand = "2.0.1" futures-util = { version = "0.3.16", default-features = false } hdrhistogram = "7.5.2" http = "0.2.3" diff --git a/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json index 2903739925a..141ded94ec3 100644 --- a/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json +++ b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json @@ -84,7 +84,7 @@ "action": { "Data": { "data": { - "Utf8": "\n \"\n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n\"" + "Utf8": "\n \n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n" }, "direction": "Response" } @@ -183,7 +183,7 @@ "action": { "Data": { "data": { - "Utf8": "\n \"\n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n\"" + "Utf8": "\n \n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n" }, "direction": "Response" } diff --git a/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs new file mode 100644 index 00000000000..15af1103694 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs @@ -0,0 +1,135 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_s3::config::interceptors::InterceptorContext; +use aws_sdk_s3::config::retry::{ClassifyRetry, RetryAction, RetryConfig}; +use aws_sdk_s3::config::SharedAsyncSleep; +use aws_smithy_async::rt::sleep::TokioSleep; +use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use std::sync::{Arc, Mutex}; + +#[derive(Debug, Clone)] +struct CustomizationTestClassifier { + counter: Arc>, +} + +impl CustomizationTestClassifier { + pub fn new() -> Self { + Self { + counter: Arc::new(Mutex::new(0u8)), + } + } + + pub fn counter(&self) -> u8 { + *self.counter.lock().unwrap() + } +} + +impl ClassifyRetry for CustomizationTestClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + *self.counter.lock().unwrap() += 1; + + // Interceptors may call this classifier before a response is received. If a response was received, + // ensure that it has the expected status code. + if let Some(res) = ctx.response() { + assert_eq!( + res.status(), + 500, + "expected a 500 response from test connection" + ); + } + + RetryAction::RetryForbidden + } + + fn name(&self) -> &'static str { + "Custom Retry Classifier" + } +} + +fn req() -> http::Request { + http::Request::builder() + .body(SdkBody::from("request body")) + .unwrap() +} + +fn ok() -> http::Response { + http::Response::builder() + .status(200) + .body(SdkBody::from("Hello!")) + .unwrap() +} + +fn err() -> http::Response { + http::Response::builder() + .status(500) + .body(SdkBody::from("This was an error")) + .unwrap() +} + +#[tokio::test] +async fn test_retry_classifier_customization_for_service() { + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + ]); + + let customization_test_classifier = CustomizationTestClassifier::new(); + + let config = aws_sdk_s3::Config::builder() + .with_test_defaults() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .http_client(http_client) + .retry_config(RetryConfig::standard()) + .retry_classifier(customization_test_classifier.clone()) + .build(); + + let client = aws_sdk_s3::Client::from_conf(config); + let _ = client + .get_object() + .bucket("bucket") + .key("key") + .send() + .await + .expect_err("fails without attempting a retry"); + + // ensure our custom retry classifier was called at least once. + assert_ne!(customization_test_classifier.counter(), 0); +} + +#[tokio::test] +async fn test_retry_classifier_customization_for_operation() { + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + ]); + + let customization_test_classifier = CustomizationTestClassifier::new(); + + let config = aws_sdk_s3::Config::builder() + .with_test_defaults() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .http_client(http_client) + .retry_config(RetryConfig::standard()) + .build(); + + let client = aws_sdk_s3::Client::from_conf(config); + let _ = client + .get_object() + .bucket("bucket") + .key("key") + .customize() + .config_override( + aws_sdk_s3::config::Config::builder() + .retry_classifier(customization_test_classifier.clone()), + ) + .send() + .await + .expect_err("fails without attempting a retry"); + + // ensure our custom retry classifier was called at least once. + assert_ne!(customization_test_classifier.counter(), 0); +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt index d8a9b6818bd..5f1688037e2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt @@ -23,7 +23,7 @@ class ConnectionPoisoningRuntimePluginCustomization( is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { // This interceptor assumes that a compatible Connector is set. Otherwise, connection poisoning // won't work and an error message will be logged. - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust( "#T::new()", smithyRuntime(runtimeConfig).resolve("client::http::connection_poisoning::ConnectionPoisoningInterceptor"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt new file mode 100644 index 00000000000..8b23e4efbac --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt @@ -0,0 +1,297 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +class RetryClassifierConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { + private val runtimeConfig = codegenContext.runtimeConfig + private val moduleUseName = codegenContext.moduleUseName() + + private val retries = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries") + private val classifiers = retries.resolve("classifiers") + private val codegenScope = arrayOf( + "ClassifyRetry" to classifiers.resolve("ClassifyRetry"), + "RetryStrategy" to retries.resolve("RetryStrategy"), + "SharedRetryClassifier" to classifiers.resolve("SharedRetryClassifier"), + "RetryClassifierPriority" to classifiers.resolve("RetryClassifierPriority"), + ) + + override fun section(section: ServiceConfig) = + writable { + when (section) { + ServiceConfig.ConfigImpl -> rustTemplate( + """ + /// Returns retry classifiers currently registered by the user. + pub fn retry_classifiers(&self) -> impl Iterator + '_ { + self.runtime_components.retry_classifiers() + } + """, + *codegenScope, + ) + + ServiceConfig.BuilderImpl -> + rustTemplate( + """ + /// Add type implementing [`ClassifyRetry`](#{ClassifyRetry}) that will be used by the + /// [`RetryStrategy`](#{RetryStrategy}) to determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its [priority](#{RetryClassifierPriority}). + /// + /// ## Examples + /// ```no_run + /// ## ##[cfg(test)] + /// ## mod tests { + /// ## ##[test] + /// ## fn example() { + /// use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + /// use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + /// use aws_smithy_runtime_api::client::retries::classifiers::{ + /// ClassifyRetry, RetryAction, RetryClassifierPriority, + /// }; + /// use aws_smithy_types::error::metadata::ProvideErrorMetadata; + /// use aws_smithy_types::retry::ErrorKind; + /// use std::error::Error as StdError; + /// use std::marker::PhantomData; + /// use $moduleUseName::config::Config; + /// ## struct SomeOperationError {} + /// + /// const RETRYABLE_ERROR_CODES: &[&str] = [ + /// // List error codes to be retried here... + /// ]; + /// + /// // When classifying at an operation's error type, classifiers require a generic parameter. + /// // When classifying the HTTP response alone, no generic is needed. + /// ##[derive(Debug, Default)] + /// pub struct ErrorCodeClassifier { + /// _inner: PhantomData, + /// } + /// + /// impl ExampleErrorCodeClassifier { + /// pub fn new() -> Self { + /// Self { + /// _inner: PhantomData, + /// } + /// } + /// } + /// + /// impl ClassifyRetry for ExampleErrorCodeClassifier + /// where + /// // Adding a trait bound for ProvideErrorMetadata allows us to inspect the error code. + /// E: StdError + ProvideErrorMetadata + Send + Sync + 'static, + /// { + /// fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + /// // Check for a result + /// let output_or_error = ctx.output_or_error(); + /// // Check for an error + /// let error = match output_or_error { + /// Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + /// Some(Err(err)) => err, + /// }; + /// + /// // Downcast the generic error and extract the code + /// let error_code = OrchestratorError::as_operation_error(error) + /// .and_then(|err| err.downcast_ref::()) + /// .and_then(|err| err.code()); + /// + /// // If this error's code is in our list, return an action that tells the RetryStrategy to retry this request. + /// if let Some(error_code) = error_code { + /// if RETRYABLE_ERROR_CODES.contains(&error_code) { + /// return RetryAction::transient_error(); + /// } + /// } + /// + /// // Otherwise, return that no action is indicated i.e. that this classifier doesn't require a retry. + /// // Another classifier may still classify this response as retryable. + /// RetryAction::NoActionIndicated + /// } + /// + /// fn name(&self) -> &'static str { "Example Error Code Classifier" } + /// } + /// + /// let config = Config::builder() + /// .retry_classifier(ExampleErrorCodeClassifier::::new()) + /// .build(); + /// ## } + /// ## } + /// ``` + pub fn retry_classifier(mut self, retry_classifier: impl #{ClassifyRetry} + 'static) -> Self { + self.push_retry_classifier(#{SharedRetryClassifier}::new(retry_classifier)); + self + } + + /// Add a [`SharedRetryClassifier`](#{SharedRetryClassifier}) that will be used by the + /// [`RetryStrategy`](#{RetryStrategy}) to determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its priority. + /// + /// ## Examples + /// ```no_run + /// ## ##[cfg(test)] + /// ## mod tests { + /// ## ##[test] + /// ## fn example() { + /// use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + /// use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + /// use aws_smithy_runtime_api::client::retries::classifiers::{ + /// ClassifyRetry, RetryAction, RetryClassifierPriority, + /// }; + /// use aws_smithy_types::error::metadata::ProvideErrorMetadata; + /// use aws_smithy_types::retry::ErrorKind; + /// use std::error::Error as StdError; + /// use std::marker::PhantomData; + /// use $moduleUseName::config::{Builder, Config}; + /// ## struct SomeOperationError {} + /// + /// const RETRYABLE_ERROR_CODES: &[&str] = [ + /// // List error codes to be retried here... + /// ]; + /// fn set_example_error_code_classifier(builder: &mut Builder) { + /// // When classifying at an operation's error type, classifiers require a generic parameter. + /// // When classifying the HTTP response alone, no generic is needed. + /// ##[derive(Debug, Default)] + /// pub struct ExampleErrorCodeClassifier { + /// _inner: PhantomData, + /// } + /// + /// impl ExampleErrorCodeClassifier { + /// pub fn new() -> Self { + /// Self { + /// _inner: PhantomData, + /// } + /// } + /// } + /// + /// impl ClassifyRetry for ExampleErrorCodeClassifier + /// where + /// // Adding a trait bound for ProvideErrorMetadata allows us to inspect the error code. + /// E: StdError + ProvideErrorMetadata + Send + Sync + 'static, + /// { + /// fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + /// // Check for a result + /// let output_or_error = ctx.output_or_error(); + /// // Check for an error + /// let error = match output_or_error { + /// Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + /// Some(Err(err)) => err, + /// }; + /// + /// // Downcast the generic error and extract the code + /// let error_code = OrchestratorError::as_operation_error(error) + /// .and_then(|err| err.downcast_ref::()) + /// .and_then(|err| err.code()); + /// + /// // If this error's code is in our list, return an action that tells the RetryStrategy to retry this request. + /// if let Some(error_code) = error_code { + /// if RETRYABLE_ERROR_CODES.contains(&error_code) { + /// return RetryAction::transient_error(); + /// } + /// } + /// + /// // Otherwise, return that no action is indicated i.e. that this classifier doesn't require a retry. + /// // Another classifier may still classify this response as retryable. + /// RetryAction::NoActionIndicated + /// } + /// + /// fn name(&self) -> &'static str { "Example Error Code Classifier" } + /// } + /// + /// builder.push_retry_classifier(ExampleErrorCodeClassifier::::new()) + /// } + /// + /// let mut builder = Config::builder(); + /// set_example_error_code_classifier(&mut builder); + /// let config = builder.build(); + /// ## } + /// ## } + /// ``` + pub fn push_retry_classifier(&mut self, retry_classifier: #{SharedRetryClassifier}) -> &mut Self { + self.runtime_components.push_retry_classifier(retry_classifier); + self + } + + /// Set [`SharedRetryClassifier`](#{SharedRetryClassifier})s for the builder, replacing any that + /// were previously set. + pub fn set_retry_classifiers(&mut self, retry_classifiers: impl IntoIterator) -> &mut Self { + self.runtime_components.set_retry_classifiers(retry_classifiers.into_iter()); + self + } + """, + *codegenScope, + ) + + else -> emptySection + } + } +} + +class RetryClassifierServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { + private val runtimeConfig = codegenContext.runtimeConfig + private val retries = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries") + + override fun section(section: ServiceRuntimePluginSection): Writable = writable { + when (section) { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { + section.registerRetryClassifier(this) { + rustTemplate( + "#{HttpStatusCodeClassifier}::default()", + "HttpStatusCodeClassifier" to retries.resolve("classifiers::HttpStatusCodeClassifier"), + ) + } + } + + else -> emptySection + } + } +} + +class RetryClassifierOperationCustomization( + codegenContext: ClientCodegenContext, + val operation: OperationShape, +) : OperationCustomization() { + private val runtimeConfig = codegenContext.runtimeConfig + private val symbolProvider = codegenContext.symbolProvider + + override fun section(section: OperationSection): Writable = writable { + val classifiers = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries::classifiers") + + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "TransientErrorClassifier" to classifiers.resolve("TransientErrorClassifier"), + "ModeledAsRetryableClassifier" to classifiers.resolve("ModeledAsRetryableClassifier"), + "OperationError" to symbolProvider.symbolForOperationError(operation), + ) + + when (section) { + is OperationSection.RetryClassifiers -> { + section.registerRetryClassifier(this) { + rustTemplate( + "#{TransientErrorClassifier}::<#{OperationError}>::new()", + *codegenScope, + ) + } + section.registerRetryClassifier(this) { + rustTemplate( + "#{ModeledAsRetryableClassifier}::<#{OperationError}>::new()", + *codegenScope, + ) + } + } + else -> emptySection + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index e2f780ddd8f..a1f11cf4a26 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -16,6 +16,9 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.Metadata import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyReExportCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierOperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.TimeSourceCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization @@ -48,7 +51,8 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations + MetadataCustomization(codegenContext, operation) + IdempotencyTokenGenerator(codegenContext, operation) + - HttpChecksumRequiredGenerator(codegenContext, operation) + HttpChecksumRequiredGenerator(codegenContext, operation) + + RetryClassifierOperationCustomization(codegenContext, operation) override fun configCustomizations( codegenContext: ClientCodegenContext, @@ -56,7 +60,8 @@ class RequiredCustomizations : ClientCodegenDecorator { ): List = baseCustomizations + ResiliencyConfigCustomization(codegenContext) + InterceptorConfigCustomization(codegenContext) + - TimeSourceCustomization(codegenContext) + TimeSourceCustomization(codegenContext) + + RetryClassifierConfigCustomization(codegenContext) override fun libRsCustomizations( codegenContext: ClientCodegenContext, @@ -111,5 +116,6 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations: List, ): List = baseCustomizations + ResiliencyServiceRuntimePluginCustomization(codegenContext) + - ConnectionPoisoningRuntimePluginCustomization(codegenContext) + ConnectionPoisoningRuntimePluginCustomization(codegenContext) + + RetryClassifierServiceRuntimePluginCustomization(codegenContext) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index b7151f67279..8177430bde2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -60,11 +60,11 @@ class ClientRuntimeTypesReExportGenerator( rustTemplate( """ pub use #{ClassifyRetry}; - pub use #{RetryReason}; + pub use #{RetryAction}; pub use #{ShouldAttempt}; """, - "ClassifyRetry" to smithyRuntimeApi.resolve("client::retries::ClassifyRetry"), - "RetryReason" to smithyRuntimeApi.resolve("client::retries::RetryReason"), + "ClassifyRetry" to smithyRuntimeApi.resolve("client::retries::classifiers::ClassifyRetry"), + "RetryAction" to smithyRuntimeApi.resolve("client::retries::classifiers::RetryAction"), "ShouldAttempt" to smithyRuntimeApi.resolve("client::retries::ShouldAttempt"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index 48bfc758951..db534910ef5 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -78,21 +78,6 @@ sealed class OperationSection(name: String) : Section(name) { } } - /** - * Hook for adding retry classifiers to an operation's `RetryClassifiers` bundle. - * - * Should emit 1+ lines of code that look like the following: - * ```rust - * .with_classifier(AwsErrorCodeClassifier::new()) - * .with_classifier(HttpStatusCodeClassifier::new()) - * ``` - */ - data class RetryClassifier( - override val customizations: List, - val configBagName: String, - val operationShape: OperationShape, - ) : OperationSection("RetryClassifier") - /** * Hook for adding supporting types for operation-specific runtime plugins. * Examples include various operation-specific types (retry classifiers, config bag types, etc.) @@ -118,6 +103,15 @@ sealed class OperationSection(name: String) : Section(name) { writer.rustTemplate(".with_operation_plugin(#{plugin})", "plugin" to plugin) } } + + data class RetryClassifiers( + override val customizations: List, + val operationShape: OperationShape, + ) : OperationSection("RetryClassifiers") { + fun registerRetryClassifier(writer: RustWriter, classifier: Writable) { + writer.rustTemplate(".with_retry_classifier(#{classifier})", "classifier" to classifier) + } + } } abstract class OperationCustomization : NamedCustomization() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index fc011307b28..6782d2d8dcd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -40,6 +40,7 @@ class OperationRuntimePluginGenerator( "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "Cow" to RuntimeType.Cow, "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), + "IntoShared" to runtimeApi.resolve("shared::IntoShared"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RetryClassifiers" to runtimeApi.resolve("client::retries::RetryClassifiers"), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig), @@ -77,15 +78,11 @@ class OperationRuntimePluginGenerator( } fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { - // Retry classifiers are operation-specific because they need to downcast operation-specific error types. - let retry_classifiers = #{RetryClassifiers}::new() - #{retry_classifier_customizations}; - #{Cow}::Owned( #{RuntimeComponentsBuilder}::new(${operationShape.id.name.dq()}) - .with_retry_classifiers(#{Some}(retry_classifiers)) #{auth_options} #{interceptors} + #{retry_classifiers} ) } } @@ -105,12 +102,6 @@ class OperationRuntimePluginGenerator( ), ) }, - "retry_classifier_customizations" to writable { - writeCustomizations( - customizations, - OperationSection.RetryClassifier(customizations, "cfg", operationShape), - ) - }, "runtime_plugin_supporting_types" to writable { writeCustomizations( customizations, @@ -123,6 +114,12 @@ class OperationRuntimePluginGenerator( OperationSection.AdditionalInterceptors(customizations, operationShape), ) }, + "retry_classifiers" to writable { + writeCustomizations( + customizations, + OperationSection.RetryClassifiers(customizations, operationShape), + ) + }, ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index 921d16a3e58..dccbd924af9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization @@ -40,31 +39,20 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { data class RegisterRuntimeComponents(val serviceConfigName: String) : ServiceRuntimePluginSection("RegisterRuntimeComponents") { /** Generates the code to register an interceptor */ - fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { - writer.rustTemplate( - """ - runtime_components.push_interceptor(#{interceptor}); - """, - "interceptor" to interceptor, - ) + fun registerInterceptor(writer: RustWriter, interceptor: Writable) { + writer.rust("runtime_components.push_interceptor(#T);", interceptor) } fun registerAuthScheme(writer: RustWriter, authScheme: Writable) { - writer.rustTemplate( - """ - runtime_components.push_auth_scheme(#{auth_scheme}); - """, - "auth_scheme" to authScheme, - ) + writer.rust("runtime_components.push_auth_scheme(#T);", authScheme) } fun registerIdentityResolver(writer: RustWriter, identityResolver: Writable) { - writer.rustTemplate( - """ - runtime_components.push_identity_resolver(#{identity_resolver}); - """, - "identity_resolver" to identityResolver, - ) + writer.rust("runtime_components.push_identity_resolver(#T);", identityResolver) + } + + fun registerRetryClassifier(writer: RustWriter, classifier: Writable) { + writer.rust("runtime_components.push_retry_classifier(#T);", classifier) } } } @@ -84,8 +72,9 @@ class ServiceRuntimePluginGenerator( "Arc" to RuntimeType.Arc, "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), "Cow" to RuntimeType.Cow, - "Layer" to smithyTypes.resolve("config_bag::Layer"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), + "IntoShared" to runtimeApi.resolve("shared::IntoShared"), + "Layer" to smithyTypes.resolve("config_bag::Layer"), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), "RuntimePlugin" to RuntimeType.runtimePlugin(rc), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index c1d9dbae028..9166ccd5986 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -134,12 +134,14 @@ class FluentClientGenerator( /// If you experience this panic, it can be fixed by setting the `sleep_impl`, or by disabling /// retries and timeouts. pub fn from_conf(conf: crate::Config) -> Self { - let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); - let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); + let has_retry_config = conf.retry_config().map(#{RetryConfig}::has_retry).unwrap_or_default(); + let has_timeout_config = conf.timeout_config().map(#{TimeoutConfig}::has_timeouts).unwrap_or_default(); let sleep_impl = conf.sleep_impl(); - if (retry_config.has_retry() || timeout_config.has_timeouts()) && sleep_impl.is_none() { - panic!("An async sleep implementation is required for retries or timeouts to work. \ - Set the `sleep_impl` on the Config passed into this function to fix this panic."); + if (has_retry_config || has_timeout_config) && sleep_impl.is_none() { + panic!( + "An async sleep implementation is required for retries or timeouts to work. \ + Set the `sleep_impl` on the Config passed into this function to fix this panic." + ); } Self { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 6772f463af2..f167d357677 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -201,9 +201,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { cfg.push_shared_layer(client_config_layer.clone()); let retry_classifiers_component = #{RuntimeComponentsBuilder}::new("retry_classifier") - .with_retry_classifiers(#{Some}( - #{RetryClassifiers}::new().with_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError)), - )); + .with_retry_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError)); // Emulate the merging of runtime components from runtime plugins that the orchestrator does let runtime_components = #{RuntimeComponentsBuilder}::for_tests() diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index ae8adb702b1..c92c44db7c5 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -7,8 +7,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.config import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule @@ -82,9 +80,8 @@ internal class ServiceConfigGeneratorTest { model.lookup("com.example#ResourceService").needsIdempotencyToken(model) shouldBe true } - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generate customizations as specified`(smithyRuntimeModeStr: String) { + @Test + fun `generate customizations as specified`() { class ServiceCustomizer(private val codegenContext: ClientCodegenContext) : NamedCustomization() { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index 066c25b8fdc..af1dbd11c57 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -34,7 +34,7 @@ private class TestServiceRuntimePluginCustomization( override fun section(section: ServiceRuntimePluginSection): Writable = writable { if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { val rc = context.runtimeConfig - section.registerInterceptor(rc, this) { + section.registerInterceptor(this) { rustTemplate( """ { diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs index 0fd61b5771b..e3616e42b36 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs @@ -8,13 +8,20 @@ //! This code defines when and how failed requests should be retried. It also defines the behavior //! used to limit the rate that requests are sent. +pub mod classifiers; + +use crate::box_error::BoxError; use crate::client::interceptors::context::InterceptorContext; +use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use std::fmt::Debug; +use std::fmt; +use std::sync::Arc; use std::time::Duration; -use tracing::trace; +use crate::impl_shared_conversions; pub use aws_smithy_types::retry::ErrorKind; +#[cfg(feature = "test-util")] +pub use test_util::AlwaysRetry; #[derive(Debug, Clone, PartialEq, Eq)] /// An answer to the question "should I make a request attempt?" @@ -38,13 +45,15 @@ impl ShouldAttempt { } } +impl_shared_conversions!(convert SharedRetryStrategy from RetryStrategy using SharedRetryStrategy::new); + /// Decider for whether or not to attempt a request, and when. /// /// The orchestrator consults the retry strategy every time before making a request. /// This includes the initial request, and any retry attempts thereafter. The /// orchestrator will retry indefinitely (until success) if the retry strategy /// always returns `ShouldAttempt::Yes` from `should_attempt_retry`. -pub trait RetryStrategy: Send + Sync + Debug { +pub trait RetryStrategy: Send + Sync + fmt::Debug { /// Decides if the initial attempt should be made. fn should_attempt_initial_request( &self, @@ -98,78 +107,6 @@ impl RetryStrategy for SharedRetryStrategy { } } -impl_shared_conversions!(convert SharedRetryStrategy from RetryStrategy using SharedRetryStrategy::new); - -/// Classification result from [`ClassifyRetry`]. -#[non_exhaustive] -#[derive(Clone, Eq, PartialEq, Debug)] -pub enum RetryReason { - /// There was an unexpected error, and this is the kind of error so that it can be properly retried. - Error(ErrorKind), - /// The server explicitly told us to back off by this amount of time. - Explicit(Duration), -} - -/// Classifies what kind of retry is needed for a given an [`InterceptorContext`]. -pub trait ClassifyRetry: Send + Sync + Debug { - /// Run this classifier against an error to determine if it should be retried. Returns - /// `Some(RetryKind)` if the error should be retried; Otherwise returns `None`. - fn classify_retry(&self, ctx: &InterceptorContext) -> Option; - - /// The name that this classifier should report for debugging purposes. - fn name(&self) -> &'static str; -} - -/// Classifies an error into a [`RetryReason`]. -#[derive(Clone, Debug)] -pub struct RetryClassifiers { - inner: Vec>, -} - -impl RetryClassifiers { - /// Creates a new [`RetryClassifiers`]. - pub fn new() -> Self { - Self { - // It's always expected that at least one classifier will be defined, - // so we eagerly allocate for it. - inner: Vec::with_capacity(1), - } - } - - /// Adds a classifier to this collection. - pub fn with_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { - self.inner.push(Arc::new(retry_classifier)); - self - } - - // TODO(https://github.com/awslabs/smithy-rs/issues/2632) make a map function so users can front-run or second-guess the classifier's decision - // pub fn map_classifiers(mut self, fun: Fn() -> RetryClassifiers) -} - -impl ClassifyRetry for RetryClassifiers { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - // return the first non-None result - self.inner.iter().find_map(|cr| { - let maybe_reason = cr.classify_retry(ctx); - - match maybe_reason.as_ref() { - Some(reason) => trace!( - "\"{}\" classifier classified error as {:?}", - cr.name(), - reason - ), - None => trace!("\"{}\" classifier ignored the error", cr.name()), - }; - - maybe_reason - }) - } - - fn name(&self) -> &'static str { - "Collection of Classifiers" - } -} - /// A type to track the number of requests sent by the orchestrator for a given operation. /// /// `RequestAttempts` is added to the `ConfigBag` by the orchestrator, @@ -209,20 +146,20 @@ impl Storable for RequestAttempts { #[cfg(feature = "test-util")] mod test_util { - use super::{ClassifyRetry, ErrorKind, RetryReason}; + use super::ErrorKind; use crate::client::interceptors::context::InterceptorContext; - use tracing::trace; + use crate::client::retries::classifiers::{ClassifyRetry, RetryAction}; /// A retry classifier for testing purposes. This classifier always returns - /// `Some(RetryReason::Error(ErrorKind))` where `ErrorKind` is the value provided when creating + /// `Some(RetryAction::Error(ErrorKind))` where `ErrorKind` is the value provided when creating /// this classifier. #[derive(Debug)] pub struct AlwaysRetry(pub ErrorKind); impl ClassifyRetry for AlwaysRetry { - fn classify_retry(&self, error: &InterceptorContext) -> Option { - trace!("Retrying error {:?} as an {:?}", error, self.0); - Some(RetryReason::Error(self.0)) + fn classify_retry(&self, error: &InterceptorContext) -> RetryAction { + tracing::debug!("Retrying error {:?} as an {:?}", error, self.0); + RetryAction::retryable_error(self.0) } fn name(&self) -> &'static str { @@ -230,10 +167,3 @@ mod test_util { } } } - -use crate::box_error::BoxError; -use crate::client::runtime_components::RuntimeComponents; -use crate::impl_shared_conversions; -use std::sync::Arc; -#[cfg(feature = "test-util")] -pub use test_util::AlwaysRetry; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs new file mode 100644 index 00000000000..549b855956c --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs @@ -0,0 +1,267 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Classifier for determining if a retry is necessary and related code. + +use crate::client::interceptors::context::InterceptorContext; +use crate::impl_shared_conversions; +use aws_smithy_types::retry::ErrorKind; +use std::fmt; +use std::sync::Arc; +use std::time::Duration; + +/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`]. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug, Default)] +pub enum RetryAction { + /// When a classifier can't run or has no opinion, this action is returned. + /// + /// For example, if a classifier requires a parsed response and response parsing failed, + /// this action is returned. If all classifiers return this action, no retry should be + /// attempted. + #[default] + NoActionIndicated, + /// When a classifier runs and thinks a response should be retried, this action is returned. + RetryIndicated(RetryReason), + /// When a classifier runs and decides a response must not be retried, this action is returned. + /// + /// This action stops retry classification immediately, skipping any following classifiers. + RetryForbidden, +} + +impl fmt::Display for RetryAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::NoActionIndicated => write!(f, "no action indicated"), + Self::RetryForbidden => write!(f, "retry forbidden"), + Self::RetryIndicated(reason) => write!(f, "retry {reason}"), + } + } +} + +impl RetryAction { + /// Create a new `RetryAction` indicating that a retry is necessary. + pub fn retryable_error(kind: ErrorKind) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: None, + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary after an explicit delay. + pub fn retryable_error_with_explicit_delay(kind: ErrorKind, retry_after: Duration) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: Some(retry_after), + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a transient error. + pub fn transient_error() -> Self { + Self::retryable_error(ErrorKind::TransientError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a throttling error. + pub fn throttling_error() -> Self { + Self::retryable_error(ErrorKind::ThrottlingError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a server error. + pub fn server_error() -> Self { + Self::retryable_error(ErrorKind::ServerError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a client error. + pub fn client_error() -> Self { + Self::retryable_error(ErrorKind::ClientError) + } +} + +/// The reason for a retry. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum RetryReason { + /// When an error is received that should be retried, this reason is returned. + RetryableError { + /// The kind of error. + kind: ErrorKind, + /// A server may tells us to retry only after a specific time has elapsed. + retry_after: Option, + }, +} + +impl fmt::Display for RetryReason { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::RetryableError { kind, retry_after } => { + let after = retry_after + .map(|d| format!(" after {d:?}")) + .unwrap_or_default(); + write!(f, "{kind} error{after}") + } + } + } +} + +/// The priority of a retry classifier. Classifiers with a higher priority will run before +/// classifiers with a lower priority. Classifiers with equal priorities make no guarantees +/// about which will run first. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct RetryClassifierPriority { + inner: Inner, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Inner { + // The default priority for the `HttpStatusCodeClassifier`. + HttpStatusCodeClassifier, + // The default priority for the `ModeledAsRetryableClassifier`. + ModeledAsRetryableClassifier, + // The default priority for the `TransientErrorClassifier`. + TransientErrorClassifier, + // The priority of some other classifier. + Other(i8), +} + +impl PartialOrd for RetryClassifierPriority { + fn partial_cmp(&self, other: &Self) -> Option { + Some(other.as_i8().cmp(&self.as_i8())) + } +} + +impl Ord for RetryClassifierPriority { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + other.as_i8().cmp(&self.as_i8()) + } +} + +impl RetryClassifierPriority { + /// Create a new `RetryClassifierPriority` with the default priority for the `HttpStatusCodeClassifier`. + pub fn http_status_code_classifier() -> Self { + Self { + inner: Inner::HttpStatusCodeClassifier, + } + } + + /// Create a new `RetryClassifierPriority` with the default priority for the `ModeledAsRetryableClassifier`. + pub fn modeled_as_retryable_classifier() -> Self { + Self { + inner: Inner::ModeledAsRetryableClassifier, + } + } + + /// Create a new `RetryClassifierPriority` with the default priority for the `TransientErrorClassifier`. + pub fn transient_error_classifier() -> Self { + Self { + inner: Inner::TransientErrorClassifier, + } + } + + /// Create a new `RetryClassifierPriority` with lower priority than the given priority. + pub fn with_lower_priority_than(other: Self) -> Self { + Self { + inner: Inner::Other(other.as_i8() + 1), + } + } + + /// Create a new `RetryClassifierPriority` with higher priority than the given priority. + pub fn with_higher_priority_than(other: Self) -> Self { + Self { + inner: Inner::Other(other.as_i8() - 1), + } + } + + fn as_i8(&self) -> i8 { + match self.inner { + Inner::HttpStatusCodeClassifier => 0, + Inner::ModeledAsRetryableClassifier => 10, + Inner::TransientErrorClassifier => 20, + Inner::Other(i) => i, + } + } +} + +impl Default for RetryClassifierPriority { + fn default() -> Self { + Self { + inner: Inner::Other(0), + } + } +} + +/// Classifies what kind of retry is needed for a given [`InterceptorContext`]. +pub trait ClassifyRetry: Send + Sync + fmt::Debug { + /// Run this classifier on the [`InterceptorContext`] to determine if the previous request + /// should be retried. Returns a [`RetryAction`]. + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction; + + /// The name of this retry classifier. + /// + /// Used for debugging purposes. + fn name(&self) -> &'static str; + + /// The priority of this retry classifier. Classifiers with a higher priority will override the + /// results of classifiers with a lower priority. Classifiers with equal priorities make no + /// guarantees about which will override the other. + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::default() + } +} + +impl_shared_conversions!(convert SharedRetryClassifier from ClassifyRetry using SharedRetryClassifier::new); + +#[derive(Debug, Clone)] +/// Retry classifier used by the retry strategy to classify responses as retryable or not. +pub struct SharedRetryClassifier(Arc); + +impl SharedRetryClassifier { + /// Given a [`ClassifyRetry`] trait object, create a new `SharedRetryClassifier`. + pub fn new(retry_classifier: impl ClassifyRetry + 'static) -> Self { + Self(Arc::new(retry_classifier)) + } +} + +impl ClassifyRetry for SharedRetryClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + self.0.classify_retry(ctx) + } + + fn name(&self) -> &'static str { + self.0.name() + } + + fn priority(&self) -> RetryClassifierPriority { + self.0.priority() + } +} + +#[cfg(test)] +mod tests { + use super::RetryClassifierPriority; + + #[test] + fn test_classifier_lower_priority_than() { + let classifier_a = RetryClassifierPriority::default(); + let classifier_b = RetryClassifierPriority::with_lower_priority_than(classifier_a); + let classifier_c = RetryClassifierPriority::with_lower_priority_than(classifier_b); + + let mut list = vec![classifier_b, classifier_a, classifier_c]; + list.sort(); + + assert_eq!(vec![classifier_c, classifier_b, classifier_a], list); + } + + #[test] + fn test_classifier_higher_priority_than() { + let classifier_c = RetryClassifierPriority::default(); + let classifier_b = RetryClassifierPriority::with_higher_priority_than(classifier_c); + let classifier_a = RetryClassifierPriority::with_higher_priority_than(classifier_b); + + let mut list = vec![classifier_b, classifier_c, classifier_a]; + list.sort(); + + assert_eq!(vec![classifier_c, classifier_b, classifier_a], list); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 0f12d407a52..9d262738d19 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -21,7 +21,8 @@ use crate::client::identity::{ ConfiguredIdentityResolver, IdentityResolver, SharedIdentityResolver, }; use crate::client::interceptors::{Interceptor, SharedInterceptor}; -use crate::client::retries::{RetryClassifiers, RetryStrategy, SharedRetryStrategy}; +use crate::client::retries::classifiers::{ClassifyRetry, SharedRetryClassifier}; +use crate::client::retries::{RetryStrategy, SharedRetryStrategy}; use crate::shared::IntoShared; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; @@ -200,7 +201,7 @@ declare_runtime_components! { interceptors: Vec, - retry_classifiers: Option, + retry_classifiers: Vec, #[required] retry_strategy: Option, @@ -245,9 +246,9 @@ impl RuntimeComponents { self.interceptors.iter().map(|s| s.value.clone()) } - /// Returns the retry classifiers. - pub fn retry_classifiers(&self) -> Option<&RetryClassifiers> { - self.retry_classifiers.as_ref().map(|s| &s.value) + /// Returns an iterator over the retry classifiers. + pub fn retry_classifiers(&self) -> impl Iterator + '_ { + self.retry_classifiers.iter().map(|s| s.value.clone()) } /// Returns the retry strategy. @@ -424,22 +425,46 @@ impl RuntimeComponentsBuilder { } /// Returns the retry classifiers. - pub fn retry_classifiers(&self) -> Option<&RetryClassifiers> { - self.retry_classifiers.as_ref().map(|s| &s.value) + pub fn retry_classifiers(&self) -> impl Iterator + '_ { + self.retry_classifiers.iter().map(|s| s.value.clone()) } - /// Sets the retry classifiers. - pub fn set_retry_classifiers( + /// Adds all the given retry_classifiers. + pub fn extend_retry_classifiers( &mut self, - retry_classifiers: Option, + retry_classifiers: impl Iterator, ) -> &mut Self { - self.retry_classifiers = retry_classifiers.map(|s| Tracked::new(self.builder_name, s)); + self.retry_classifiers + .extend(retry_classifiers.map(|s| Tracked::new(self.builder_name, s))); self } - /// Sets the retry classifiers. - pub fn with_retry_classifiers(mut self, retry_classifiers: Option) -> Self { - self.retry_classifiers = retry_classifiers.map(|s| Tracked::new(self.builder_name, s)); + /// Adds an retry_classifier. + pub fn push_retry_classifier( + &mut self, + retry_classifier: impl ClassifyRetry + 'static, + ) -> &mut Self { + self.retry_classifiers.push(Tracked::new( + self.builder_name, + retry_classifier.into_shared(), + )); + self + } + + /// Adds an retry_classifier. + pub fn with_retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { + self.push_retry_classifier(retry_classifier); + self + } + + /// Directly sets the retry_classifiers and clears out any that were previously pushed. + pub fn set_retry_classifiers( + &mut self, + retry_classifiers: impl Iterator, + ) -> &mut Self { + self.retry_classifiers.clear(); + self.retry_classifiers + .extend(retry_classifiers.map(|s| Tracked::new(self.builder_name, s))); self } @@ -633,7 +658,6 @@ impl RuntimeComponentsBuilder { .with_endpoint_resolver(Some(FakeEndpointResolver)) .with_http_client(Some(FakeClient)) .with_identity_resolver(AuthSchemeId::new("fake"), FakeIdentityResolver) - .with_retry_classifiers(Some(RetryClassifiers::new())) .with_retry_strategy(Some(FakeRetryStrategy)) .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep))) .with_time_source(Some(SharedTimeSource::new(FakeTimeSource))) @@ -654,7 +678,7 @@ impl fmt::Display for BuildError { /// A trait for retrieving a shared identity resolver. /// -/// This trait exists so that [`AuthScheme::identity_resolver`](crate::client::auth::AuthScheme::identity_resolver) +/// This trait exists so that [`AuthScheme::identity_resolver`] /// can have access to configured identity resolvers without having access to all the runtime components. pub trait GetIdentityResolver: Send + Sync { /// Returns the requested identity resolver if it is set. @@ -672,7 +696,7 @@ impl GetIdentityResolver for RuntimeComponents { #[cfg(all(test, feature = "test-util"))] mod tests { - use super::*; + use super::{BuildError, RuntimeComponentsBuilder, Tracked}; #[test] #[allow(unreachable_pub)] diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 56596a60871..4260b6af816 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -9,7 +9,7 @@ //! This can include: //! - Registering interceptors //! - Registering auth schemes -//! - Adding entries to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) for orchestration +//! - Adding entries to the [`ConfigBag`] for orchestration //! - Setting runtime components //! //! Runtime plugins are divided into service/operation "levels", with service runtime plugins @@ -77,7 +77,7 @@ pub trait RuntimePlugin: Debug + Send + Sync { DEFAULT_ORDER } - /// Optionally returns additional config that should be added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). + /// Optionally returns additional config that should be added to the [`ConfigBag`]. /// /// As a best practice, a frozen layer should be stored on the runtime plugin instance as /// a member, and then cloned upon return since that clone is cheap. Constructing a new diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index 438a94752de..99f8e67591a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -3,16 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::client::retries::classifiers::run_classifiers_on_ctx; use aws_smithy_http::connection::ConnectionMetadata; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryConfig}; +use aws_smithy_types::retry::{ReconnectMode, RetryConfig}; use std::fmt; use std::sync::{Arc, Mutex}; use tracing::{debug, error}; @@ -74,14 +75,9 @@ impl Interceptor for ConnectionPoisoningInterceptor { .map(RetryConfig::reconnect_mode) .unwrap_or(ReconnectMode::ReconnectOnTransientError); let captured_connection = cfg.load::().cloned(); - let retry_classifiers = runtime_components - .retry_classifiers() - .ok_or("retry classifiers are required for connection poisoning to work")?; - - let error_is_transient = retry_classifiers - .classify_retry(context.inner()) - .map(|reason| reason == RetryReason::Error(ErrorKind::TransientError)) - .unwrap_or_default(); + let retry_classifier_result = + run_classifiers_on_ctx(runtime_components.retry_classifiers(), context.inner()); + let error_is_transient = retry_classifier_result == RetryAction::transient_error(); let connection_poisoning_is_enabled = reconnect_mode == ReconnectMode::ReconnectOnTransientError; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index 9c4e71237c9..cbc560402fc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -24,7 +24,8 @@ use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output use aws_smithy_runtime_api::client::interceptors::Interceptor; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError}; -use aws_smithy_runtime_api::client::retries::{RetryClassifiers, SharedRetryStrategy}; +use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; +use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{ RuntimePlugin, RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin, @@ -206,15 +207,15 @@ impl OperationBuilder { self } - pub fn no_retry(mut self) -> Self { + pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { self.runtime_components - .set_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))); + .push_retry_classifier(retry_classifier); self } - pub fn retry_classifiers(mut self, retry_classifiers: RetryClassifiers) -> Self { + pub fn no_retry(mut self) -> Self { self.runtime_components - .set_retry_classifiers(Some(retry_classifiers)); + .set_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))); self } @@ -383,7 +384,7 @@ impl OperationBuilder { mod tests { use super::*; use crate::client::http::test_util::{capture_request, ReplayEvent, StaticReplayClient}; - use crate::client::retries::classifier::HttpStatusCodeClassifier; + use crate::client::retries::classifiers::HttpStatusCodeClassifier; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; @@ -459,10 +460,8 @@ mod tests { .http_client(connector.clone()) .endpoint_url("http://localhost:1234") .no_auth() - .retry_classifiers( - RetryClassifiers::new().with_classifier(HttpStatusCodeClassifier::default()), - ) .standard_retry(&RetryConfig::standard()) + .retry_classifier(HttpStatusCodeClassifier::default()) .timeout_config(TimeoutConfig::disabled()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .serializer(|input: String| { diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries.rs b/rust-runtime/aws-smithy-runtime/src/client/retries.rs index 8ea71ebb5ed..46bc4332c6c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries.rs @@ -4,7 +4,7 @@ */ /// Smithy retry classifiers. -pub mod classifier; +pub mod classifiers; /// Smithy retry strategies. pub mod strategy; diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs similarity index 56% rename from rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs rename to rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs index 254cb636d5a..a1abd092c96 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs @@ -4,8 +4,10 @@ */ use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; +use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, RetryClassifierPriority, SharedRetryClassifier, +}; +use aws_smithy_types::retry::ProvideErrorKind; use std::borrow::Cow; use std::error::Error as StdError; use std::marker::PhantomData; @@ -23,76 +25,100 @@ impl ModeledAsRetryableClassifier { _inner: PhantomData, } } + + /// Return the priority of this retry classifier. + pub fn priority() -> RetryClassifierPriority { + RetryClassifierPriority::modeled_as_retryable_classifier() + } } impl ClassifyRetry for ModeledAsRetryableClassifier where E: StdError + ProvideErrorKind + Send + Sync + 'static, { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { // Check for a result - let output_or_error = ctx.output_or_error()?; + let output_or_error = ctx.output_or_error(); // Check for an error let error = match output_or_error { - Ok(_) => return None, - Err(err) => err, + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, }; // Check that the error is an operation error - let error = error.as_operation_error()?; - // Downcast the error - let error = error.downcast_ref::()?; - // Check if the error is retryable - error.retryable_error_kind().map(RetryReason::Error) + error + .as_operation_error() + // Downcast the error + .and_then(|err| err.downcast_ref::()) + // Check if the error is retryable + .and_then(|err| err.retryable_error_kind().map(RetryAction::retryable_error)) + .unwrap_or_default() } fn name(&self) -> &'static str { "Errors Modeled As Retryable" } + + fn priority(&self) -> RetryClassifierPriority { + Self::priority() + } } /// Classifies response, timeout, and connector errors as retryable or not. #[derive(Debug, Default)] -pub struct SmithyErrorClassifier { +pub struct TransientErrorClassifier { _inner: PhantomData, } -impl SmithyErrorClassifier { - /// Create a new `SmithyErrorClassifier` +impl TransientErrorClassifier { + /// Create a new `TransientErrorClassifier` pub fn new() -> Self { Self { _inner: PhantomData, } } + + /// Return the priority of this retry classifier. + pub fn priority() -> RetryClassifierPriority { + RetryClassifierPriority::transient_error_classifier() + } } -impl ClassifyRetry for SmithyErrorClassifier +impl ClassifyRetry for TransientErrorClassifier where E: StdError + Send + Sync + 'static, { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - let output_or_error = ctx.output_or_error()?; + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); // Check for an error let error = match output_or_error { - Ok(_) => return None, - Err(err) => err, + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, }; if error.is_response_error() || error.is_timeout_error() { - Some(RetryReason::Error(ErrorKind::TransientError)) + RetryAction::transient_error() } else if let Some(error) = error.as_connector_error() { if error.is_timeout() || error.is_io() { - Some(RetryReason::Error(ErrorKind::TransientError)) + RetryAction::transient_error() } else { - error.as_other().map(RetryReason::Error) + error + .as_other() + .map(RetryAction::retryable_error) + .unwrap_or_default() } } else { - None + RetryAction::NoActionIndicated } } fn name(&self) -> &'static str { "Retryable Smithy Errors" } + + fn priority(&self) -> RetryClassifierPriority { + Self::priority() + } } const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; @@ -119,45 +145,87 @@ impl HttpStatusCodeClassifier { retryable_status_codes: retryable_status_codes.into(), } } + + /// Return the priority of this retry classifier. + pub fn priority() -> RetryClassifierPriority { + RetryClassifierPriority::http_status_code_classifier() + } } impl ClassifyRetry for HttpStatusCodeClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - ctx.response() + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + let is_retryable = ctx + .response() .map(|res| res.status().as_u16()) .map(|status| self.retryable_status_codes.contains(&status)) - .unwrap_or_default() - .then_some(RetryReason::Error(ErrorKind::TransientError)) + .unwrap_or_default(); + + if is_retryable { + RetryAction::transient_error() + } else { + RetryAction::NoActionIndicated + } } fn name(&self) -> &'static str { "HTTP Status Code" } + + fn priority(&self) -> RetryClassifierPriority { + Self::priority() + } } -// Generic smithy clients would have something like this: -// pub fn default_retry_classifiers() -> RetryClassifiers { -// RetryClassifiers::new() -// .with_classifier(SmithyErrorClassifier::new()) -// .with_classifier(ModeledAsRetryableClassifier::new()) -// .with_classifier(HttpStatusCodeClassifier::new()) -// } -// This ordering is different than the default AWS ordering because the old generic client classifier -// was the same. +/// Given an iterator of retry classifiers and an interceptor context, run retry classifiers on the +/// context. Each classifier is passed the classification result from the previous classifier (the +/// 'root' classifier is passed `None`.) +pub fn run_classifiers_on_ctx( + classifiers: impl Iterator, + ctx: &InterceptorContext, +) -> RetryAction { + // By default, don't retry + let mut result = RetryAction::NoActionIndicated; + + for classifier in classifiers { + let new_result = classifier.classify_retry(ctx); + + // If the result is `NoActionIndicated`, continue to the next classifier + // without overriding any previously-set result. + if new_result == RetryAction::NoActionIndicated { + continue; + } + + // Otherwise, set the result to the new result. + tracing::trace!( + "Classifier '{}' set the result of classification to '{}'", + classifier.name(), + new_result + ); + result = new_result; + + // If the result is `RetryForbidden`, stop running classifiers. + if result == RetryAction::RetryForbidden { + tracing::trace!("retry classification ending early because a `RetryAction::RetryForbidden` was emitted",); + break; + } + } + + result +} #[cfg(test)] mod test { - use crate::client::retries::classifier::{ + use crate::client::retries::classifiers::{ HttpStatusCodeClassifier, ModeledAsRetryableClassifier, }; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; - use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; + use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; use std::fmt; - use super::SmithyErrorClassifier; + use super::TransientErrorClassifier; #[derive(Debug, PartialEq, Eq, Clone)] struct UnmodeledError; @@ -180,10 +248,7 @@ mod test { .map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(res); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)) - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error()); } #[test] @@ -196,7 +261,7 @@ mod test { .map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_response(res); - assert_eq!(policy.classify_retry(&ctx), None); + assert_eq!(policy.classify_retry(&ctx), RetryAction::NoActionIndicated); } #[test] @@ -229,35 +294,26 @@ mod test { RetryableError, )))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::ClientError)), - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::client_error(),); } #[test] fn classify_response_error() { - let policy = SmithyErrorClassifier::::new(); + let policy = TransientErrorClassifier::::new(); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::response( "I am a response error".into(), ))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)), - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error(),); } #[test] fn test_timeout_error() { - let policy = SmithyErrorClassifier::::new(); + let policy = TransientErrorClassifier::::new(); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::timeout( "I am a timeout error".into(), ))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)), - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error(),); } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs index c441aa4816e..05c039f63dc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs @@ -8,8 +8,3 @@ pub(crate) mod standard; pub use never::NeverRetryStrategy; pub use standard::StandardRetryStrategy; - -#[cfg(feature = "test-util")] -mod fixed_delay; -#[cfg(feature = "test-util")] -pub use fixed_delay::FixedDelayRetryStrategy; diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs deleted file mode 100644 index 886b7a61b22..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RequestAttempts, RetryReason, RetryStrategy, ShouldAttempt, -}; -use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; -use aws_smithy_types::config_bag::ConfigBag; -use std::time::Duration; - -/// A retry policy used in tests. This relies on an error classifier already present in the config bag. -/// If a server response is retryable, it will be retried after a fixed delay. -#[derive(Debug, Clone)] -pub struct FixedDelayRetryStrategy { - fixed_delay: Duration, - max_attempts: u32, -} - -impl FixedDelayRetryStrategy { - /// Create a new retry policy with a fixed delay. - pub fn new(fixed_delay: Duration) -> Self { - Self { - fixed_delay, - max_attempts: 4, - } - } - - /// Create a new retry policy with a one second delay. - pub fn one_second_delay() -> Self { - Self::new(Duration::from_secs(1)) - } -} - -impl RetryStrategy for FixedDelayRetryStrategy { - fn should_attempt_initial_request( - &self, - _runtime_components: &RuntimeComponents, - _cfg: &ConfigBag, - ) -> Result { - Ok(ShouldAttempt::Yes) - } - - fn should_attempt_retry( - &self, - ctx: &InterceptorContext, - runtime_components: &RuntimeComponents, - cfg: &ConfigBag, - ) -> Result { - // Look a the result. If it's OK then we're done; No retry required. Otherwise, we need to inspect it - let output_or_error = ctx.output_or_error().expect( - "This must never be called without reaching the point where the result exists.", - ); - if output_or_error.is_ok() { - tracing::trace!("request succeeded, no retry necessary"); - return Ok(ShouldAttempt::No); - } - - // Check if we're out of attempts - let request_attempts = cfg - .load::() - .expect("at least one request attempt is made before any retry is attempted"); - if request_attempts.attempts() >= self.max_attempts { - tracing::trace!( - attempts = request_attempts.attempts(), - max_attempts = self.max_attempts, - "not retrying because we are out of attempts" - ); - return Ok(ShouldAttempt::No); - } - - let retry_classifiers = runtime_components - .retry_classifiers() - .expect("a retry classifier is set"); - let retry_reason = retry_classifiers.classify_retry(ctx); - - let backoff = match retry_reason { - Some(RetryReason::Explicit(_)) => self.fixed_delay, - Some(RetryReason::Error(_)) => self.fixed_delay, - Some(_) => { - unreachable!("RetryReason is non-exhaustive. Therefore, we need to cover this unreachable case.") - } - None => { - tracing::trace!( - attempts = request_attempts.attempts(), - max_attempts = self.max_attempts, - "encountered unretryable error" - ); - return Ok(ShouldAttempt::No); - } - }; - - tracing::debug!( - "attempt {} failed with {:?}; retrying after {:?}", - request_attempts.attempts(), - retry_reason, - backoff - ); - - Ok(ShouldAttempt::YesAfterDelay(backoff)) - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index ee32a6a63da..70efea493ab 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::client::retries::classifiers::run_classifiers_on_ctx; use crate::client::retries::client_rate_limiter::{ClientRateLimiter, RequestReason}; use crate::client::retries::strategy::standard::ReleaseResult::{ APermitWasReleased, NoPermitWasReleased, @@ -10,9 +11,8 @@ use crate::client::retries::strategy::standard::ReleaseResult::{ use crate::client::retries::token_bucket::TokenBucket; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RequestAttempts, RetryReason, RetryStrategy, ShouldAttempt, -}; +use aws_smithy_runtime_api::client::retries::classifiers::{RetryAction, RetryReason}; +use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::retry::{ErrorKind, RetryConfig}; @@ -102,7 +102,7 @@ impl StandardRetryStrategy { &self, runtime_components: &RuntimeComponents, cfg: &ConfigBag, - retry_reason: Option<&RetryReason>, + retry_reason: &RetryAction, ) -> Result { let request_attempts = cfg .load::() @@ -111,14 +111,20 @@ impl StandardRetryStrategy { let token_bucket = cfg.load::(); match retry_reason { - Some(RetryReason::Explicit(backoff)) => Ok(*backoff), - Some(RetryReason::Error(kind)) => { + RetryAction::RetryIndicated(RetryReason::RetryableError { kind, retry_after }) => { update_rate_limiter_if_exists( runtime_components, cfg, *kind == ErrorKind::ThrottlingError, ); - if let Some(delay) = check_rate_limiter_for_delay(runtime_components, cfg, *kind) { + + if let Some(delay) = *retry_after { + let delay = delay.min(self.max_backoff); + debug!("explicit request from server to delay {delay:?} before retrying"); + Ok(delay) + } else if let Some(delay) = + check_rate_limiter_for_delay(runtime_components, cfg, *kind) + { let delay = delay.min(self.max_backoff); debug!("rate limiter has requested a {delay:?} delay before retrying"); Ok(delay) @@ -145,8 +151,7 @@ impl StandardRetryStrategy { Ok(Duration::from_secs_f64(backoff).min(self.max_backoff)) } } - Some(_) => unreachable!("RetryReason is non-exhaustive"), - None => { + RetryAction::RetryForbidden | RetryAction::NoActionIndicated => { update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, @@ -155,6 +160,7 @@ impl StandardRetryStrategy { ); Err(ShouldAttempt::No) } + _ => unreachable!("RetryAction is non-exhaustive"), } } } @@ -242,22 +248,19 @@ impl RetryStrategy for StandardRetryStrategy { return Ok(ShouldAttempt::No); } - // Run the classifiers against the context to determine if we should retry - let retry_classifiers = runtime_components - .retry_classifiers() - .ok_or("retry classifiers are required by the retry configuration")?; - let retry_reason = retry_classifiers.classify_retry(ctx); + // Run the classifier against the context to determine if we should retry + let retry_classifiers = runtime_components.retry_classifiers(); + let classifier_result = run_classifiers_on_ctx(retry_classifiers, ctx); // Calculate the appropriate backoff time. - let backoff = match self.calculate_backoff(runtime_components, cfg, retry_reason.as_ref()) { + let backoff = match self.calculate_backoff(runtime_components, cfg, &classifier_result) { Ok(value) => value, // In some cases, backoff calculation will decide that we shouldn't retry at all. Err(value) => return Ok(value), }; debug!( "attempt #{request_attempts} failed with {:?}; retrying after {:?}", - retry_reason.expect("the match statement above ensures this is not None"), - backoff, + classifier_result, backoff, ); Ok(ShouldAttempt::YesAfterDelay(backoff)) @@ -316,9 +319,10 @@ fn get_seconds_since_unix_epoch(runtime_components: &RuntimeComponents) -> f64 { mod tests { use super::*; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; - use aws_smithy_runtime_api::client::retries::{ - AlwaysRetry, ClassifyRetry, RetryClassifiers, RetryReason, RetryStrategy, + use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, SharedRetryClassifier, }; + use aws_smithy_runtime_api::client::retries::{AlwaysRetry, RetryStrategy}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; @@ -350,9 +354,7 @@ mod tests { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); let rc = RuntimeComponentsBuilder::for_tests() - .with_retry_classifiers(Some( - RetryClassifiers::new().with_classifier(AlwaysRetry(error_kind)), - )) + .with_retry_classifier(SharedRetryClassifier::new(AlwaysRetry(error_kind))) .build() .unwrap(); let mut layer = Layer::new("test"); @@ -429,31 +431,35 @@ mod tests { #[derive(Debug)] struct PresetReasonRetryClassifier { - retry_reasons: Mutex>, + retry_actions: Mutex>, } #[cfg(feature = "test-util")] impl PresetReasonRetryClassifier { - fn new(mut retry_reasons: Vec) -> Self { + fn new(mut retry_reasons: Vec) -> Self { // We'll pop the retry_reasons in reverse order so we reverse the list to fix that. retry_reasons.reverse(); Self { - retry_reasons: Mutex::new(retry_reasons), + retry_actions: Mutex::new(retry_reasons), } } } impl ClassifyRetry for PresetReasonRetryClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - if ctx.output_or_error().map(|it| it.is_ok()).unwrap_or(false) { - return None; - } - - let mut retry_reasons = self.retry_reasons.lock().unwrap(); - if retry_reasons.len() == 1 { - Some(retry_reasons.first().unwrap().clone()) + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + _ => (), + }; + + let mut retry_actions = self.retry_actions.lock().unwrap(); + if retry_actions.len() == 1 { + retry_actions.first().unwrap().clone() } else { - retry_reasons.pop() + retry_actions.pop().unwrap() } } @@ -464,12 +470,11 @@ mod tests { #[cfg(feature = "test-util")] fn setup_test( - retry_reasons: Vec, + retry_reasons: Vec, ) -> (ConfigBag, RuntimeComponents, InterceptorContext) { let rc = RuntimeComponentsBuilder::for_tests() - .with_retry_classifiers(Some( - RetryClassifiers::new() - .with_classifier(PresetReasonRetryClassifier::new(retry_reasons)), + .with_retry_classifier(SharedRetryClassifier::new( + PresetReasonRetryClassifier::new(retry_reasons), )) .build() .unwrap(); @@ -484,7 +489,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn eventual_success() { - let (mut cfg, rc, mut ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, mut ctx) = setup_test(vec![RetryAction::server_error()]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5); @@ -514,7 +519,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_more_attempts() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(3); @@ -542,7 +547,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_quota() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5); @@ -565,8 +570,11 @@ mod tests { #[test] fn quota_replenishes_on_success() { let (mut cfg, rc, mut ctx) = setup_test(vec![ - RetryReason::Error(ErrorKind::TransientError), - RetryReason::Explicit(Duration::from_secs(1)), + RetryAction::transient_error(), + RetryAction::retryable_error_with_explicit_delay( + ErrorKind::TransientError, + Duration::from_secs(1), + ), ]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) @@ -599,8 +607,7 @@ mod tests { #[test] fn quota_replenishes_on_first_try_success() { const PERMIT_COUNT: usize = 20; - let (mut cfg, rc, mut ctx) = - setup_test(vec![RetryReason::Error(ErrorKind::TransientError)]); + let (mut cfg, rc, mut ctx) = setup_test(vec![RetryAction::transient_error()]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(u32::MAX); @@ -650,7 +657,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn backoff_timing() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5); @@ -690,7 +697,7 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn max_backoff_time() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); + let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); let strategy = StandardRetryStrategy::default() .with_base(|| 1.0) .with_max_attempts(5) diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs index bf1d8220d9d..2057690cc11 100644 --- a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -9,10 +9,9 @@ feature = "connector-hyper-0-14-x", ))] -use ::aws_smithy_runtime::client::retries::classifier::{ - HttpStatusCodeClassifier, SmithyErrorClassifier, +use ::aws_smithy_runtime::client::retries::classifiers::{ + HttpStatusCodeClassifier, TransientErrorClassifier, }; -use ::aws_smithy_runtime_api::client::retries::RetryClassifiers; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_http::body::{BoxBody, SdkBody}; use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; @@ -24,7 +23,7 @@ use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime::{ev, match_events}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig}; use aws_smithy_types::timeout::TimeoutConfig; use hyper::client::Builder as HyperBuilder; @@ -58,22 +57,32 @@ impl std::error::Error for OperationError {} struct TestRetryClassifier; impl ClassifyRetry for TestRetryClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { tracing::info!("classifying retry for {ctx:?}"); - let classification = ctx.output_or_error().unwrap().err().and_then(|err| { - if let Some(err) = err.as_operation_error() { - tracing::info!("its an operation error: {err:?}"); - let err = err.downcast_ref::().unwrap(); - Some(RetryReason::Error(err.0)) + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + let action = if let Some(err) = error.as_operation_error() { + tracing::info!("its an operation error: {err:?}"); + let err = err.downcast_ref::().unwrap(); + RetryAction::retryable_error(err.0) + } else { + tracing::info!("its something else... using other classifiers"); + let action = TransientErrorClassifier::::new().classify_retry(ctx); + if action == RetryAction::NoActionIndicated { + HttpStatusCodeClassifier::default().classify_retry(ctx) } else { - tracing::info!("its something else... using other classifiers"); - SmithyErrorClassifier::::new() - .classify_retry(ctx) - .or_else(|| HttpStatusCodeClassifier::default().classify_retry(ctx)) + action } - }); - tracing::info!("classified as {classification:?}"); - classification + }; + + tracing::info!("classified as {action:?}"); + action } fn name(&self) -> &'static str { @@ -132,7 +141,7 @@ async fn wire_level_test( .build(), ) .standard_retry(&RetryConfig::standard().with_reconnect_mode(reconnect_mode)) - .retry_classifiers(RetryClassifiers::new().with_classifier(TestRetryClassifier)) + .retry_classifier(TestRetryClassifier) .sleep_impl(TokioSleep::new()) .with_connection_poisoning() .serializer({ diff --git a/rust-runtime/aws-smithy-types/src/retry.rs b/rust-runtime/aws-smithy-types/src/retry.rs index a2866b84c10..911a37ca3a8 100644 --- a/rust-runtime/aws-smithy-types/src/retry.rs +++ b/rust-runtime/aws-smithy-types/src/retry.rs @@ -41,6 +41,17 @@ pub enum ErrorKind { ClientError, } +impl fmt::Display for ErrorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::TransientError => write!(f, "transient error"), + Self::ThrottlingError => write!(f, "throttling error"), + Self::ServerError => write!(f, "server error"), + Self::ClientError => write!(f, "client error"), + } + } +} + /// Trait that provides an `ErrorKind` and an error code. pub trait ProvideErrorKind { /// Returns the `ErrorKind` when the error is modeled as retryable From e06a57d3360a1261703131556d823b868191782a Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Tue, 10 Oct 2023 16:24:23 -0500 Subject: [PATCH 167/331] add retry classifier customization RFC (#3018) add SUMMARY link to new RFC ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- design/src/SUMMARY.md | 1 + .../rfc0038_retry_classifier_customization.md | 429 ++++++++++++++++++ 2 files changed, 430 insertions(+) create mode 100644 design/src/rfcs/rfc0038_retry_classifier_customization.md diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index ebee4dece1c..bc46926208a 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -64,6 +64,7 @@ - [RFC-0035: Collection Defaults](./rfcs/rfc0035_collection_defaults.md) - [RFC-0036: HTTP Dependency Exposure](./rfcs/rfc0036_http_dep_elimination.md) - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md) + - [RFC-0038: User-configurable retry classification](./rfcs/rfc0038_retry_classifier_customization.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/rfcs/rfc0038_retry_classifier_customization.md b/design/src/rfcs/rfc0038_retry_classifier_customization.md new file mode 100644 index 00000000000..ecbbbd3ad52 --- /dev/null +++ b/design/src/rfcs/rfc0038_retry_classifier_customization.md @@ -0,0 +1,429 @@ +# RFC: User-configurable retry classification + +> Status: Implemented +> +> Applies to: client + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + +This RFC defines the user experience and implementation of user-configurable +retry classification. Custom retry classifiers enable users to change what +responses are retried while still allowing them to rely on defaults set by SDK +authors when desired. +## Terminology + +- **Smithy Service**: An HTTP service, whose API is modeled with the [Smithy + IDL](https://www.smithy.io). +- **Smithy Client**: An HTTP client generated by smithy-rs from a `.smithy` + model file. +- **AWS SDK**: A **smithy client** that's specifically configured to work with + an AWS service. +- **Operation**: A modeled interaction with a service, defining the proper input + and expected output shapes, as well as important metadata related to request + construction. "Sending" an operation implies sending one or more HTTP requests + to a **Smithy service**, and then receiving an output or error in response. +- **Orchestrator**: The client code which manages the request/response pipeline. + The orchestrator is responsible for: + - Constructing, serializing, and sending requests. + - Receiving, deserializing, and (optionally) retrying requests. + - Running interceptors *(not covered in this RFC)* and handling errors. +- **Runtime Component**: A part of the orchestrator responsible for a specific + function. Runtime components are used by the orchestrator itself, may depend + on specific configuration, and must not be changed by interceptors. Examples + include the endpoint resolver, retry strategy, and request signer. +- **Runtime Plugin**: Code responsible for setting and **runtime components** + and related configuration. Runtime plugins defined by codegen are responsible + for setting default configuration and altering the behavior of **Smithy + clients** including the **AWS SDKs**. + +## How the orchestrator should model retries + +A **Retry Strategy** is the process by which the orchestrator determines when +and how to retry failed requests. Only one retry strategy may be set at any +given time. During its operation, the retry strategy relies on a series of +**Retry Classifiers** to determine if and how a failed request should be +retried. Retry classifiers each have a **Retry Classifier Priority** so that +regardless of whether they are set during config or operation construction, +they'll always run in a consistent order. + +Classifiers are each run in turn by the retry strategy: + +```rust,ignore +pub fn run_classifiers_on_ctx( + classifiers: impl Iterator, + ctx: &InterceptorContext, +) -> RetryAction { + // By default, don't retry + let mut result = RetryAction::NoActionIndicated; + + for classifier in classifiers { + let new_result = classifier.classify_retry(ctx); + + // If the result is `NoActionIndicated`, continue to the next classifier + // without overriding any previously-set result. + if new_result == RetryAction::NoActionIndicated { + continue; + } + + // Otherwise, set the result to the new result. + tracing::trace!( + "Classifier '{}' set the result of classification to '{}'", + classifier.name(), + new_result + ); + result = new_result; + + // If the result is `RetryForbidden`, stop running classifiers. + if result == RetryAction::RetryForbidden { + tracing::trace!("retry classification ending early because a `RetryAction::RetryForbidden` was emitted",); + break; + } + } + + result +} +``` + +*NOTE: User-defined retry strategies are responsible for calling `run_classifiers_on_ctx`.* + +Lower-priority classifiers run first, but the retry actions they return may be +overridden by higher-priority classifiers. Classification stops immediately if +any classifier returns `RetryAction::RetryForbidden`. + +## The user experience if this RFC is implemented + +In the current version of the SDK, users are unable to configure retry +classification, except by defining a custom retry strategy. Once this RFC is +implemented, users will be able to define and set their own classifiers. + +### Defining a custom classifier + +```rust,ignore +#[derive(Debug)] +struct CustomRetryClassifier; + +impl ClassifyRetry for CustomRetryClassifier { + fn classify_retry( + &self, + ctx: &InterceptorContext, + ) -> Option { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + // Typically, when the response is OK or unset + // then `RetryAction::NoActionIndicated` is returned. + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + todo!("inspect the error to determine if a retry attempt should be made.") + } + + fn name(&self) -> &'static str { "my custom retry classifier" } + + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::default() + } +} +``` + +#### Choosing a retry classifier priority + +Sticking with the default priority is often the best choice. Classifiers should +restrict the number of cases they can handle in order to avoid having to compete +with other classifiers. When two classifiers would classify a response in two +different ways, the priority system gives us the ability to decide which +classifier should be respected. + +Internally, priority is implemented with a simple numeric system. In order to +give the smithy-rs team the flexibility to make future changes, this numeric +system is private and inaccessible to users. Instead, users may set the priority +of classifiers relative to one another with the `with_lower_priority_than` and +`with_higher_priority_than` methods: + +```rust,ignore +impl RetryClassifierPriority { + /// Create a new `RetryClassifierPriority` with lower priority than the given priority. + pub fn with_lower_priority_than(other: Self) -> Self { ... } + + /// Create a new `RetryClassifierPriority` with higher priority than the given priority. + pub fn with_higher_priority_than(other: Self) -> Self { ... } +} +``` + +For example, if it was important for our `CustomRetryClassifier` in the previous +example to run *before* the default `HttpStatusCodeClassifier`, a user would +define the `CustomRetryClassifier` priority like this: + +```rust,ignore +impl ClassifyRetry for CustomRetryClassifier { + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::run_before(RetryClassifierPriority::http_status_code_classifier()) + } +} +``` + +The priorities of the three default retry classifiers +(`HttpStatusCodeClassifier`, `ModeledAsRetryableClassifier`, and +`TransientErrorClassifier`) are all public for this purpose. Users may **ONLY** +set a retry priority relative to an existing retry priority. + + +#### `RetryAction` and `RetryReason` + +Retry classifiers communicate to the retry strategy by emitting `RetryAction`s: + +```rust,ignore +/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`]. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug, Default)] +pub enum RetryAction { + /// When a classifier can't run or has no opinion, this action is returned. + /// + /// For example, if a classifier requires a parsed response and response parsing failed, + /// this action is returned. If all classifiers return this action, no retry should be + /// attempted. + #[default] + NoActionIndicated, + /// When a classifier runs and thinks a response should be retried, this action is returned. + RetryIndicated(RetryReason), + /// When a classifier runs and decides a response must not be retried, this action is returned. + /// + /// This action stops retry classification immediately, skipping any following classifiers. + RetryForbidden, +} +``` + +When a retry is indicated by a classifier, the action will contain a `RetryReason`: + +```rust,ignore +/// The reason for a retry. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum RetryReason { + /// When an error is received that should be retried, this reason is returned. + RetryableError { + /// The kind of error. + kind: ErrorKind, + /// A server may tell us to retry only after a specific time has elapsed. + retry_after: Option, + }, +} +``` + +*NOTE: `RetryReason` currently only has a single variant, but it's defined as an `enum` for [forward compatibility] purposes.* + +`RetryAction`'s `impl` defines several convenience methods: + +```rust,ignore +impl RetryAction { + /// Create a new `RetryAction` indicating that a retry is necessary. + pub fn retryable_error(kind: ErrorKind) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: None, + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary after an explicit delay. + pub fn retryable_error_with_explicit_delay(kind: ErrorKind, retry_after: Duration) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: Some(retry_after), + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a transient error. + pub fn transient_error() -> Self { + Self::retryable_error(ErrorKind::TransientError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a throttling error. + pub fn throttling_error() -> Self { + Self::retryable_error(ErrorKind::ThrottlingError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a server error. + pub fn server_error() -> Self { + Self::retryable_error(ErrorKind::ServerError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a client error. + pub fn client_error() -> Self { + Self::retryable_error(ErrorKind::ClientError) + } +} +``` + +### Setting classifiers + +The interface for setting classifiers is very similar to the interface of +settings interceptors: + +```rust,ignore +// All service configs support these setters. Operations support a nearly identical API. +impl ServiceConfigBuilder { + /// Add type implementing ClassifyRetry that will be used by the RetryStrategy + /// to determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its priority. + pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { + self.push_retry_classifier(SharedRetryClassifier::new(retry_classifier)); + self + } + + /// Add a SharedRetryClassifier that will be used by the RetryStrategy to + /// determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its priority. + pub fn push_retry_classifier(&mut self, retry_classifier: SharedRetryClassifier) -> &mut Self { + self.runtime_components.push_retry_classifier(retry_classifier); + self + } + + /// Set SharedRetryClassifiers for the builder, replacing any that were + /// previously set. + pub fn set_retry_classifiers(&mut self, retry_classifiers: impl IntoIterator) -> &mut Self { + self.runtime_components.set_retry_classifiers(retry_classifiers.into_iter()); + self + } +} +``` + +### Default classifiers + +Smithy clients have three classifiers enabled by default: + +- `ModeledAsRetryableClassifier`: Checks for errors that are marked as retryable + in the smithy model. If one is encountered, returns + `RetryAction::RetryIndicated`. Requires a parsed response. +- `TransientErrorClassifier`: Checks for timeout, IO, and connector errors. If + one is encountered, returns `RetryAction::RetryIndicated`. Requires a parsed + response. +- `HttpStatusCodeClassifier`: Checks the HTTP response's status code. By + default, this classifies `500`, `502`, `503`, and `504` errors as + `RetryAction::RetryIndicated`. The list of retryable status codes may be + customized when creating this classifier with the + `HttpStatusCodeClassifier::new_from_codes` method. + +AWS clients enable the three smithy classifiers as well as one more by default: + +- `AwsErrorCodeClassifier`: Checks for errors with AWS error codes marking them + as either transient or throttling errors. If one is encountered, returns + `RetryAction::RetryIndicated`. Requires a parsed response. This classifier + will also check the HTTP response for an `x-amz-retry-after` header. If one is + set, then the returned `RetryAction` will include the explicit delay. + +The priority order of these classifiers is as follows: + +1. *(highest priority)* `TransientErrorClassifier` +2. `ModeledAsRetryableClassifier` +3. `AwsErrorCodeClassifier` +4. *(lowest priority)* `HttpStatusCodeClassifier` + +The priority order of the default classifiers is not configurable. However, it's +possible to wrap a default classifier in a newtype and set your desired priority +when implementing the `ClassifyRetry` trait, delegating the `classify_retry` and +`name` fields to the inner classifier. + +#### Disable default classifiers + +Disabling the default classifiers is possible, but not easy. They are set at +different points during config and operation construction, and must be unset at +each of those places. A far simpler solution is to implement your own classifier +that has the highest priority. + +Still, if completely removing the other classifiers is desired, use the +`set_retry_classifiers` method on the config to replace the config-level +defaults and then set a config override on the operation that does the same. + +## How to actually implement this RFC + +In order to implement this feature, we must: +- Update the current retry classification system so that individual classifiers + as well as collections of classifiers can be easily composed together. +- Create two new configuration mechanisms for users that allow them to customize + retry classification at the service level and at the operation level. +- Update retry classifiers so that they may 'short-circuit' the chain, ending + retry classification immediately. + +### The `RetryClassifier` trait + +```rust,ignore +/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`]. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum RetryAction { + /// When an error is received that should be retried, this action is returned. + Retry(ErrorKind), + /// When the server tells us to retry after a specific time has elapsed, this action is returned. + RetryAfter(Duration), + /// When a response should not be retried, this action is returned. + NoRetry, +} + +/// Classifies what kind of retry is needed for a given [`InterceptorContext`]. +pub trait ClassifyRetry: Send + Sync + fmt::Debug { + /// Run this classifier on the [`InterceptorContext`] to determine if the previous request + /// should be retried. If the classifier makes a decision, `Some(RetryAction)` is returned. + /// Classifiers may also return `None`, signifying that they have no opinion of whether or + /// not a request should be retried. + fn classify_retry( + &self, + ctx: &InterceptorContext, + preceding_action: Option, + ) -> Option; + + /// The name of this retry classifier. + /// + /// Used for debugging purposes. + fn name(&self) -> &'static str; + + /// The priority of this retry classifier. Classifiers with a higher priority will run before + /// classifiers with a lower priority. Classifiers with equal priorities make no guarantees + /// about which will run first. + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::default() + } +} +``` + +### Resolving the correct order of multiple retry classifiers + +Because each classifier has a defined priority, and because +`RetryClassifierPriority` implements `PartialOrd` and `Ord`, the standard +library's [sort] method may be used to correctly arrange classifiers. The +`RuntimeComponents` struct is responsible for storing classifiers, so it's also +responsible for sorting them whenever a new classifier is added. Thus, when a +retry strategy fetches the list of classifiers, they'll already be in the +expected order. + +## Questions and answers + +- **Q:** Should retry classifiers be fallible? + - **A:** I think no, because of the added complexity. If we make them fallible + then we'll have to decide what happens when classifiers fail. Do we skip + them or does classification end? The retry strategy is responsible for + calling the classifiers, so it be responsible for deciding how to handle a + classifier error. I don't foresee a use case where an error returned by a + classifier would be interpreted either by classifiers following the failed + classifier or the retry strategy. + +## Changes checklist + +- [x] Add retry classifiers field and setters to `RuntimeComponents` and `RuntimeComponentsBuilder`. + - [x] Add unit tests ensuring that classifier priority is respected by `RuntimeComponents::retry_classifiers`, especially when multiple layers of config are in play. +- [x] Add codegen customization allowing users to set retry classifiers on service configs. +- [x] Add codegen for setting default classifiers at the service level. + - [x] Add integration tests for setting classifiers at the service level. +- [x] Add codegen for settings default classifiers that require knowledge of operation error types at the operation level. + - [x] Add integration tests for setting classifiers at the operation level. +- [x] Implement retry classifier priority. + - [x] Add unit tests for retry classifier priority. +- [x] Update existing tests that would fail for lack of a retry classifier. + + + +[sort]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.sort +[forward compatibility]: https://en.wikipedia.org/wiki/Forward_compatibility From af8474aadd71c2114586953b24b7c9aee3832978 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 11 Oct 2023 12:26:50 -0400 Subject: [PATCH 168/331] Ignore more tests (#3057) These tests are flaky for some reason ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-client/src/conns.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rust-runtime/aws-smithy-client/src/conns.rs b/rust-runtime/aws-smithy-client/src/conns.rs index a1514dfa285..bdbc08eb1c5 100644 --- a/rust-runtime/aws-smithy-client/src/conns.rs +++ b/rust-runtime/aws-smithy-client/src/conns.rs @@ -185,6 +185,7 @@ mod custom_tls_tests { } #[tokio::test] + #[ignore] async fn test_native_tls_connector_can_make_http_requests() { let conn = Adapter::builder().build(native_tls()); let conn = DynConnector::new(conn); @@ -194,6 +195,7 @@ mod custom_tls_tests { } #[tokio::test] + #[ignore] async fn test_native_tls_connector_can_make_https_requests() { let conn = Adapter::builder().build(native_tls()); let conn = DynConnector::new(conn); From 3b6f8867f6698b8572acafa5cf0fb49ca1aa68a5 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 11 Oct 2023 11:13:06 -0700 Subject: [PATCH 169/331] New-type all the orchestrator futures (#3055) This PR replaces the `Future` type-alias that was pointing to `NowOrLater` with a new-type for each trait that returns a future. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 ++++ .../aws-config/src/imds/client.rs | 12 ++-- .../aws-config/src/imds/client/token.rs | 12 ++-- aws/rust-runtime/aws-runtime/src/identity.rs | 12 ++-- .../aws-smithy-runtime-api/src/client.rs | 62 +++++++++++++++++++ .../src/client/endpoint.rs | 11 +++- .../aws-smithy-runtime-api/src/client/http.rs | 55 +--------------- .../src/client/identity.rs | 15 +++-- .../src/client/identity/http.rs | 11 ++-- .../src/client/orchestrator.rs | 13 ---- .../src/client/runtime_components.rs | 10 ++- .../src/client/identity/no_auth.rs | 7 +-- .../src/client/orchestrator/auth.rs | 8 +-- .../src/client/orchestrator/endpoints.rs | 14 +++-- 14 files changed, 136 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8eb793b8067..072b0737457 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -323,3 +323,15 @@ For more information, see the [guide](https://github.com/awslabs/smithy-rs/discu references = ["smithy-rs#2417", "smithy-rs#3018"] meta = { "breaking" = true, "tada" = true, "bug" = false } author = "Velfi" + +[[aws-sdk-rust]] +message = "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively." +references = ["smithy-rs#3055"] +meta = { "breaking" = true, "tada" = true, "bug" = true } +author = "jdisanti" + +[[smithy-rs]] +message = "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively." +references = ["smithy-rs#3055"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 67054a67f44..6d46692f75f 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -19,9 +19,11 @@ use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; -use aws_smithy_runtime_api::client::endpoint::{EndpointResolver, EndpointResolverParams}; +use aws_smithy_runtime_api::client::endpoint::{ + EndpointFuture, EndpointResolver, EndpointResolverParams, +}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::{Future, OrchestratorError, SensitiveOutput}; +use aws_smithy_runtime_api::client::orchestrator::{OrchestratorError, SensitiveOutput}; use aws_smithy_runtime_api::client::retries::classifiers::{ ClassifyRetry, RetryAction, SharedRetryClassifier, }; @@ -522,15 +524,15 @@ struct ImdsEndpointResolver { } impl EndpointResolver for ImdsEndpointResolver { - fn resolve_endpoint(&self, _: &EndpointResolverParams) -> Future { + fn resolve_endpoint(&self, _: &EndpointResolverParams) -> EndpointFuture { let this = self.clone(); - Future::new(Box::pin(async move { + EndpointFuture::new(async move { this.endpoint_source .endpoint(this.mode_override) .await .map(|uri| Endpoint::builder().url(uri.to_string()).build()) .map_err(|err| err.into()) - })) + }) } } diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index ec3ffe406d6..0d6e309da83 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -25,11 +25,9 @@ use aws_smithy_runtime_api::client::auth::{ AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, }; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolver, SharedIdentityResolver, -}; -use aws_smithy_runtime_api::client::orchestrator::{ - Future, HttpRequest, HttpResponse, OrchestratorError, + Identity, IdentityFuture, IdentityResolver, SharedIdentityResolver, }; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::runtime_components::{ GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, }; @@ -194,9 +192,9 @@ fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result Future { + fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { let this = self.clone(); - Future::new(Box::pin(async move { + IdentityFuture::new(async move { let preloaded_token = this .inner .cache @@ -217,7 +215,7 @@ impl IdentityResolver for TokenResolver { let expiry = token.expiry; Ok(Identity::new(token, Some(expiry))) - })) + }) } } diff --git a/aws/rust-runtime/aws-runtime/src/identity.rs b/aws/rust-runtime/aws-runtime/src/identity.rs index 84e20d2afe6..1d42e13b3a8 100644 --- a/aws/rust-runtime/aws-runtime/src/identity.rs +++ b/aws/rust-runtime/aws-runtime/src/identity.rs @@ -6,9 +6,7 @@ /// Credentials-based identity support. pub mod credentials { use aws_credential_types::cache::SharedCredentialsCache; - use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver}; - use aws_smithy_runtime_api::client::orchestrator::Future; + use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, IdentityResolver}; use aws_smithy_types::config_bag::ConfigBag; /// Smithy identity resolver for AWS credentials. @@ -25,13 +23,13 @@ pub mod credentials { } impl IdentityResolver for CredentialsIdentityResolver { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { + fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { let cache = self.credentials_cache.clone(); - Future::new(Box::pin(async move { + IdentityFuture::new(async move { let credentials = cache.as_ref().provide_cached_credentials().await?; let expiration = credentials.expiry(); - Result::<_, BoxError>::Ok(Identity::new(credentials, expiration)) - })) + Ok(Identity::new(credentials, expiration)) + }) } } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index 2afc2546c56..08539a50ddd 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -3,6 +3,68 @@ * SPDX-License-Identifier: Apache-2.0 */ +macro_rules! new_type_future { + ( + doc = $type_docs:literal, + pub struct $future_name:ident<$output:ty, $err:ty>, + ) => { + pin_project_lite::pin_project! { + #[allow(clippy::type_complexity)] + #[doc = $type_docs] + pub struct $future_name { + #[pin] + inner: aws_smithy_async::future::now_or_later::NowOrLater< + Result<$output, $err>, + aws_smithy_async::future::BoxFuture<$output, $err> + >, + } + } + + impl $future_name { + #[doc = concat!("Create a new `", stringify!($future_name), "` with the given future.")] + pub fn new(future: F) -> Self + where + F: std::future::Future> + Send + 'static, + { + Self { + inner: aws_smithy_async::future::now_or_later::NowOrLater::new(Box::pin(future)), + } + } + + #[doc = concat!(" + Create a new `", stringify!($future_name), "` with the given boxed future. + + Use this if you already have a boxed future to avoid double boxing it. + ")] + pub fn new_boxed( + future: std::pin::Pin< + Box> + Send>, + >, + ) -> Self { + Self { + inner: aws_smithy_async::future::now_or_later::NowOrLater::new(future), + } + } + + #[doc = concat!("Create a `", stringify!($future_name), "` that is immediately ready with the given result.")] + pub fn ready(result: Result<$output, $err>) -> Self { + Self { + inner: aws_smithy_async::future::now_or_later::NowOrLater::ready(result), + } + } + } + + impl std::future::Future for $future_name { + type Output = Result<$output, $err>; + + fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll { + let this = self.project(); + this.inner.poll(cx) + } + } + }; +} + pub mod dns; pub mod endpoint; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index 0037b9eb19b..3e885019e68 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -5,7 +5,7 @@ //! APIs needed to configure endpoint resolution for clients. -use crate::client::orchestrator::Future; +use crate::box_error::BoxError; use crate::impl_shared_conversions; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; @@ -13,6 +13,11 @@ use aws_smithy_types::type_erasure::TypeErasedBox; use std::fmt; use std::sync::Arc; +new_type_future! { + doc = "Future for [`EndpointResolver::resolve_endpoint`].", + pub struct EndpointFuture, +} + /// Parameters originating from the Smithy endpoint ruleset required for endpoint resolution. /// /// The actual endpoint parameters are code generated from the Smithy model, and thus, @@ -40,7 +45,7 @@ impl Storable for EndpointResolverParams { /// Configurable endpoint resolver implementation. pub trait EndpointResolver: Send + Sync + fmt::Debug { /// Asynchronously resolves an endpoint to use from the given endpoint parameters. - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future; + fn resolve_endpoint(&self, params: &EndpointResolverParams) -> EndpointFuture; } /// Shared endpoint resolver. @@ -57,7 +62,7 @@ impl SharedEndpointResolver { } impl EndpointResolver for SharedEndpointResolver { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { + fn resolve_endpoint(&self, params: &EndpointResolverParams) -> EndpointFuture { self.0.resolve_endpoint(params) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index b5031a3f7d3..f3098b7204f 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -56,63 +56,14 @@ pub mod response; use crate::client::orchestrator::{HttpRequest, HttpResponse}; use crate::client::runtime_components::RuntimeComponents; use crate::impl_shared_conversions; -use aws_smithy_async::future::now_or_later::NowOrLater; use aws_smithy_http::result::ConnectorError; -use pin_project_lite::pin_project; use std::fmt; -use std::future::Future as StdFuture; -use std::pin::Pin; use std::sync::Arc; -use std::task::Poll; use std::time::Duration; -type BoxFuture = aws_smithy_async::future::BoxFuture; - -pin_project! { - /// Future for [`HttpConnector::call`]. - pub struct HttpConnectorFuture { - #[pin] - inner: NowOrLater, BoxFuture>, - } -} - -impl HttpConnectorFuture { - /// Create a new `HttpConnectorFuture` with the given future. - pub fn new(future: F) -> Self - where - F: StdFuture> + Send + 'static, - { - Self { - inner: NowOrLater::new(Box::pin(future)), - } - } - - /// Create a new `HttpConnectorFuture` with the given boxed future. - /// - /// Use this if you already have a boxed future to avoid double boxing it. - pub fn new_boxed( - future: Pin> + Send>>, - ) -> Self { - Self { - inner: NowOrLater::new(future), - } - } - - /// Create a `HttpConnectorFuture` that is immediately ready with the given result. - pub fn ready(result: Result) -> Self { - Self { - inner: NowOrLater::ready(result), - } - } -} - -impl StdFuture for HttpConnectorFuture { - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll { - let this = self.project(); - this.inner.poll(cx) - } +new_type_future! { + doc = "Future for [`HttpConnector::call`].", + pub struct HttpConnectorFuture, } /// Trait with a `call` function that asynchronously converts a request into a response. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index ee115487c11..f3dcb9c2154 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::box_error::BoxError; use crate::client::auth::AuthSchemeId; -use crate::client::orchestrator::Future; use crate::impl_shared_conversions; use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; @@ -16,20 +16,25 @@ use std::time::SystemTime; #[cfg(feature = "http-auth")] pub mod http; +new_type_future! { + doc = "Future for [`IdentityResolver::resolve_identity`].", + pub struct IdentityFuture, +} + /// Resolver for identities. /// /// Every [`AuthScheme`](crate::client::auth::AuthScheme) has one or more compatible /// identity resolvers, which are selected from runtime components by the auth scheme /// implementation itself. /// -/// The identity resolver must return a [`Future`] with the resolved identity, or an error +/// The identity resolver must return an [`IdentityFuture`] with the resolved identity, or an error /// if resolution failed. There is no optionality for identity resolvers. The identity either /// resolves successfully, or it fails. The orchestrator will choose exactly one auth scheme /// to use, and thus, its chosen identity resolver is the only identity resolver that runs. -/// There is no fallback to other auth schemes in the absense of an identity. +/// There is no fallback to other auth schemes in the absence of an identity. pub trait IdentityResolver: Send + Sync + Debug { /// Asynchronously resolves an identity for a request using the given config. - fn resolve_identity(&self, config_bag: &ConfigBag) -> Future; + fn resolve_identity(&self, config_bag: &ConfigBag) -> IdentityFuture; } /// Container for a shared identity resolver. @@ -44,7 +49,7 @@ impl SharedIdentityResolver { } impl IdentityResolver for SharedIdentityResolver { - fn resolve_identity(&self, config_bag: &ConfigBag) -> Future { + fn resolve_identity(&self, config_bag: &ConfigBag) -> IdentityFuture { self.0.resolve_identity(config_bag) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs index 878943c545a..bf8204d9606 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs @@ -5,8 +5,7 @@ //! Identity types for HTTP auth -use crate::client::identity::{Identity, IdentityResolver}; -use crate::client::orchestrator::Future; +use crate::client::identity::{Identity, IdentityFuture, IdentityResolver}; use aws_smithy_types::config_bag::ConfigBag; use std::fmt::Debug; use std::sync::Arc; @@ -65,8 +64,8 @@ impl From for Token { } impl IdentityResolver for Token { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new(self.clone(), self.0.expiration))) + fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } @@ -124,7 +123,7 @@ impl Login { } impl IdentityResolver for Login { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new(self.clone(), self.0.expiration))) + fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 328117648c9..bcafca33154 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -20,7 +20,6 @@ use crate::box_error::BoxError; use crate::client::interceptors::context::phase::Phase; use crate::client::interceptors::context::Error; use crate::client::interceptors::InterceptorError; -use aws_smithy_async::future::now_or_later::NowOrLater; use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::{ConnectorError, SdkError}; use aws_smithy_types::config_bag::{Storable, StoreReplace}; @@ -34,18 +33,6 @@ pub type HttpRequest = http::Request; /// Type alias for the HTTP response type that the orchestrator uses. pub type HttpResponse = http::Response; -/// Type alias for boxed futures that are returned from several traits since async trait functions are not stable yet (as of 2023-07-21). -/// -/// See [the Rust blog](https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html) for -/// more information on async functions in traits. -pub type BoxFuture = aws_smithy_async::future::BoxFuture; - -/// Type alias for futures that are returned from several traits since async trait functions are not stable yet (as of 2023-07-21). -/// -/// See [the Rust blog](https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html) for -/// more information on async functions in traits. -pub type Future = NowOrLater, BoxFuture>; - /// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. /// /// This enum gets placed into the `ConfigBag` to change the orchestrator behavior. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 9d262738d19..c70162ea4c6 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -548,11 +548,9 @@ impl RuntimeComponentsBuilder { /// Creates a runtime components builder with all the required components filled in with fake (panicking) implementations. #[cfg(feature = "test-util")] pub fn for_tests() -> Self { - use crate::client::endpoint::EndpointResolverParams; - use crate::client::identity::Identity; - use crate::client::orchestrator::Future; + use crate::client::endpoint::{EndpointFuture, EndpointResolverParams}; + use crate::client::identity::IdentityFuture; use aws_smithy_types::config_bag::ConfigBag; - use aws_smithy_types::endpoint::Endpoint; #[derive(Debug)] struct FakeAuthSchemeOptionResolver; @@ -581,7 +579,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeEndpointResolver; impl EndpointResolver for FakeEndpointResolver { - fn resolve_endpoint(&self, _: &EndpointResolverParams) -> Future { + fn resolve_endpoint(&self, _: &EndpointResolverParams) -> EndpointFuture { unreachable!("fake endpoint resolver must be overridden for this test") } } @@ -608,7 +606,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeIdentityResolver; impl IdentityResolver for FakeIdentityResolver { - fn resolve_identity(&self, _: &ConfigBag) -> Future { + fn resolve_identity(&self, _: &ConfigBag) -> IdentityFuture { unreachable!("fake identity resolver must be overridden for this test") } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs index 01121eab909..8a6ec5ab0dc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs @@ -3,8 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver}; -use aws_smithy_runtime_api::client::orchestrator::Future; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, IdentityResolver}; use aws_smithy_types::config_bag::ConfigBag; /// Identity for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. @@ -30,7 +29,7 @@ impl NoAuthIdentityResolver { } impl IdentityResolver for NoAuthIdentityResolver { - fn resolve_identity(&self, _: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) + fn resolve_identity(&self, _: &ConfigBag) -> IdentityFuture { + IdentityFuture::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index bbc6001aafd..56f6dab0dc4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -145,10 +145,10 @@ mod tests { SharedAuthSchemeOptionResolver, Signer, }; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolver, SharedIdentityResolver, + Identity, IdentityFuture, IdentityResolver, SharedIdentityResolver, }; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; - use aws_smithy_runtime_api::client::orchestrator::{Future, HttpRequest}; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::{ GetIdentityResolver, RuntimeComponentsBuilder, }; @@ -160,8 +160,8 @@ mod tests { #[derive(Debug)] struct TestIdentityResolver; impl IdentityResolver for TestIdentityResolver { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new("doesntmatter", None))) + fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index ffb3ac92123..7afd3c41660 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -9,9 +9,11 @@ use aws_smithy_http::endpoint::{ SharedEndpointResolver, }; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::endpoint::{EndpointResolver, EndpointResolverParams}; +use aws_smithy_runtime_api::client::endpoint::{ + EndpointFuture, EndpointResolver, EndpointResolverParams, +}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::{Future, HttpRequest}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; @@ -44,8 +46,8 @@ impl StaticUriEndpointResolver { } impl EndpointResolver for StaticUriEndpointResolver { - fn resolve_endpoint(&self, _params: &EndpointResolverParams) -> Future { - Future::ready(Ok(Endpoint::builder() + fn resolve_endpoint(&self, _params: &EndpointResolverParams) -> EndpointFuture { + EndpointFuture::ready(Ok(Endpoint::builder() .url(self.endpoint.to_string()) .build())) } @@ -99,7 +101,7 @@ impl EndpointResolver for DefaultEndpointResolver where Params: Debug + Send + Sync + 'static, { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { + fn resolve_endpoint(&self, params: &EndpointResolverParams) -> EndpointFuture { let ep = match params.get::() { Some(params) => self.inner.resolve_endpoint(params).map_err(Box::new), None => Err(Box::new(ResolveEndpointError::message( @@ -107,7 +109,7 @@ where ))), } .map_err(|e| e as _); - Future::ready(ep) + EndpointFuture::ready(ep) } } From 5a2dbd43020801c21b532654896addc4d2bf256f Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Wed, 11 Oct 2023 14:41:05 -0500 Subject: [PATCH 170/331] fix various small issues (#3056) This fixes some pre-commit issues and updates the gradle builds to fix a deprecated thing where I was sure it wouldn't break anything. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci-tls.yml | 118 +++++++++--------- aws/SDK_CHANGELOG.next.json | 2 +- .../OperationInputTestGeneratorTests.kt | 6 +- aws/sdk/build.gradle.kts | 12 +- build.gradle.kts | 2 +- .../customizations/ClientDocsGenerator.kt | 2 +- .../smithy/endpoint/EndpointsDecorator.kt | 2 +- .../generators/EndpointParamsGenerator.kt | 4 +- .../generators/EndpointResolverGenerator.kt | 2 +- .../protocol/RequestSerializerGenerator.kt | 1 - .../core/smithy/generators/UnionGenerator.kt | 1 - .../codegen/core/smithy/protocols/Ec2Query.kt | 2 +- .../protocols/parse/JsonParserGenerator.kt | 4 +- .../smithy/generators/ServerRootGenerator.kt | 2 +- ...rnTraitEscapedSpecialCharsValidatorTest.kt | 20 +-- 15 files changed, 89 insertions(+), 91 deletions(-) diff --git a/.github/workflows/ci-tls.yml b/.github/workflows/ci-tls.yml index 324b23383c3..8c70d2b2e87 100644 --- a/.github/workflows/ci-tls.yml +++ b/.github/workflows/ci-tls.yml @@ -20,62 +20,62 @@ jobs: name: Verify TLS configuration runs-on: ubuntu-latest steps: - - name: Install packages - shell: bash - run: | - sudo apt-get update - sudo apt-get -y install gcc make python3-pip nginx git ruby openjdk-17-jre pkg-config libssl-dev faketime - pip3 install certbuilder crlbuilder - - name: Stop nginx - run: sudo systemctl stop nginx - - name: Checkout smithy-rs - uses: actions/checkout@v3 - with: - path: ./smithy-rs - - name: Checkout trytls - uses: actions/checkout@v3 - with: - repository: ouspg/trytls - path: ./trytls - - name: Checkout badtls - uses: actions/checkout@v3 - with: - repository: wbond/badtls.io - path: ./badtls.io - - name: Checkout badssl - uses: actions/checkout@v3 - with: - repository: chromium/badssl.com - path: ./badssl.com - - name: Install Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ env.rust_version }} - - name: Build badssl.com - shell: bash - working-directory: badssl.com - env: - DOCKER_BUILDKIT: 1 - run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badssl - - name: Build SDK - working-directory: smithy-rs - run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso - - name: Build trytls - shell: bash - working-directory: trytls - run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-trytls - - name: Build badtls.io - working-directory: badtls.io - shell: bash - run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badtls - - name: Update TLS configuration - shell: bash - run: smithy-rs/tools/ci-scripts/configure-tls/update-certs - - name: Build TLS stub - working-directory: smithy-rs/tools/ci-resources/tls-stub - shell: bash - run: cargo build - - name: Test TLS configuration - working-directory: smithy-rs/tools - shell: bash - run: trytls https target/debug/stub + - name: Install packages + shell: bash + run: | + sudo apt-get update + sudo apt-get -y install gcc make python3-pip nginx git ruby openjdk-17-jre pkg-config libssl-dev faketime + pip3 install certbuilder crlbuilder + - name: Stop nginx + run: sudo systemctl stop nginx + - name: Checkout smithy-rs + uses: actions/checkout@v3 + with: + path: ./smithy-rs + - name: Checkout trytls + uses: actions/checkout@v3 + with: + repository: ouspg/trytls + path: ./trytls + - name: Checkout badtls + uses: actions/checkout@v3 + with: + repository: wbond/badtls.io + path: ./badtls.io + - name: Checkout badssl + uses: actions/checkout@v3 + with: + repository: chromium/badssl.com + path: ./badssl.com + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.rust_version }} + - name: Build badssl.com + shell: bash + working-directory: badssl.com + env: + DOCKER_BUILDKIT: 1 + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badssl + - name: Build SDK + working-directory: smithy-rs + run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso + - name: Build trytls + shell: bash + working-directory: trytls + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-trytls + - name: Build badtls.io + working-directory: badtls.io + shell: bash + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badtls + - name: Update TLS configuration + shell: bash + run: smithy-rs/tools/ci-scripts/configure-tls/update-certs + - name: Build TLS stub + working-directory: smithy-rs/tools/ci-resources/tls-stub + shell: bash + run: cargo build + - name: Test TLS configuration + working-directory: smithy-rs/tools + shell: bash + run: trytls https target/debug/stub diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 38225d8bc40..496c4aaa7e8 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -775,4 +775,4 @@ } ], "aws-sdk-model": [] -} \ No newline at end of file +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt index 2fde9a6866c..91c7f6be91a 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt @@ -21,15 +21,15 @@ class OperationInputTestGeneratorTests { val operationModel = """ $prefix namespace operations - + operation Ping {} """.trimIndent() val serviceModel = """ $prefix namespace service - + use operations#Ping - + service MyService { operations: [Ping] } diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 9a2037642d8..0ea9ab01fbd 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -19,7 +19,7 @@ plugins { } configure { - smithyBuildConfigs = files(buildDir.resolve("smithy-build.json")) + smithyBuildConfigs = files(layout.buildDirectory.file("smithy-build.json")) allowUnknownTraits = true } @@ -144,7 +144,7 @@ tasks.register("generateSmithyBuild") { inputs.property("servicelist", awsServices.services.toString()) inputs.property("eventStreamAllowList", eventStreamAllowList) inputs.dir(projectDir.resolve("aws-models")) - outputs.file(buildDir.resolve("smithy-build.json")) + outputs.file(layout.buildDirectory.file("smithy-build.json")) doFirst { buildDir.resolve("smithy-build.json").writeText(generateSmithyBuild(awsServices)) @@ -186,7 +186,7 @@ tasks.register("relocateServices") { } } } - inputs.dir("$buildDir/smithyprojections/sdk/") + inputs.dir(layout.buildDirectory.dir("smithyprojections/sdk/")) outputs.dir(sdkOutputDir) } @@ -406,7 +406,7 @@ tasks.register("generateVersionManifest") { "--examples-revision", properties.get("aws.sdk.examples.revision") ?: "missing", ).apply { - val previousReleaseManifestPath = getPreviousReleaseVersionManifestPath()?.let { manifestPath -> + getPreviousReleaseVersionManifestPath()?.let { manifestPath -> add("--previous-release-versions") add(manifestPath) } @@ -414,7 +414,7 @@ tasks.register("generateVersionManifest") { } tasks["smithyBuildJar"].apply { - inputs.file(buildDir.resolve("smithy-build.json")) + inputs.file(layout.buildDirectory.file("smithy-build.json")) inputs.dir(projectDir.resolve("aws-models")) dependsOn("generateSmithyBuild") dependsOn("generateCargoWorkspace") @@ -455,5 +455,5 @@ tasks.register("deleteSdk") { } tasks["clean"].dependsOn("deleteSdk") tasks["clean"].doFirst { - delete(buildDir.resolve("smithy-build.json")) + delete(layout.buildDirectory.file("smithy-build.json")) } diff --git a/build.gradle.kts b/build.gradle.kts index 2a4758345fe..7439d73b146 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,7 +29,7 @@ allprojects.forEach { it.the().apply { toolVersion = "0.8.8" - reportsDirectory.set(file("$buildDir/jacoco-reports")) + reportsDirectory.set(layout.buildDirectory.dir("jacoco-reports")) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt index 22dd4e9919c..6c55a4e682d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt @@ -29,7 +29,7 @@ class ClientDocsGenerator(private val codegenContext: ClientCodegenContext) : Li private fun crateLayout(): Writable = writable { - val serviceName = codegenContext.serviceShape?.getTrait()?.value ?: "the service" + val serviceName = codegenContext.serviceShape.getTrait()?.value ?: "the service" containerDocs( """ The entry point for most customers will be [`Client`], which exposes one method for each API diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index c726a625980..c5579771dbe 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -107,7 +107,7 @@ class EndpointsDecorator : ClientCodegenDecorator { override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val generator = EndpointTypesGenerator.fromContext(codegenContext) rustCrate.withModule(ClientRustModule.Config.endpoint) { - withInlineModule(endpointTestsModule(codegenContext), rustCrate.moduleDocProvider) { + withInlineModule(endpointTestsModule(), rustCrate.moduleDocProvider) { generator.testGenerator()(this) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt index 2984cc62557..57a8f31de85 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt @@ -40,9 +40,9 @@ import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.orNull // internals contains the actual resolver function -fun endpointImplModule(codegenContext: ClientCodegenContext) = RustModule.private("internals", parent = ClientRustModule.Config.endpoint) +fun endpointImplModule() = RustModule.private("internals", parent = ClientRustModule.Config.endpoint) -fun endpointTestsModule(codegenContext: ClientCodegenContext) = RustModule.new( +fun endpointTestsModule() = RustModule.new( "test", visibility = Visibility.PRIVATE, parent = ClientRustModule.Config.endpoint, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index e461f71b300..2009f82b4bd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -207,7 +207,7 @@ internal class EndpointResolverGenerator( endpointRuleSet: EndpointRuleSet, fnsUsed: List, ): RuntimeType { - return RuntimeType.forInlineFun("resolve_endpoint", endpointImplModule(codegenContext)) { + return RuntimeType.forInlineFun("resolve_endpoint", endpointImplModule()) { Attribute(allow(allowLintsForResolver)).render(this) rustTemplate( """ diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index 690ad5b40fb..a1e7b71e61d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -36,7 +36,6 @@ class RequestSerializerGenerator( private val codegenScope by lazy { val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) val interceptorContext = runtimeApi.resolve("client::interceptors::context") - val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) arrayOf( *preludeScope, "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt index 3f7927d7281..93bea4c0101 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt @@ -109,7 +109,6 @@ open class UnionGenerator( private fun renderImplBlock(unionSymbol: Symbol) { writer.rustBlock("impl ${unionSymbol.name}") { sortedMembers.forEach { member -> - val memberSymbol = symbolProvider.toSymbol(member) val funcNamePart = member.memberName.toSnakeCase() val variantName = symbolProvider.toMemberName(member) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt index 215865f4cb5..11424033a41 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt @@ -59,7 +59,7 @@ class Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol { } override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType = - ProtocolFunctions.crossOperationFn("parse_event_stream_error_metadata") { fnName -> + ProtocolFunctions.crossOperationFn("parse_event_stream_error_metadata") { rustBlockTemplate( "pub fn parse_event_stream_error_metadata(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt index 3b05b076942..0e3f531971f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt @@ -287,7 +287,7 @@ class JsonParserGenerator( is BooleanShape -> rustTemplate("#{expect_bool_or_null}(tokens.next())?", *codegenScope) is NumberShape -> deserializeNumber(target) is BlobShape -> deserializeBlob(memberShape) - is TimestampShape -> deserializeTimestamp(target, memberShape) + is TimestampShape -> deserializeTimestamp(memberShape) is CollectionShape -> deserializeCollection(target) is MapShape -> deserializeMap(target) is StructureShape -> deserializeStruct(target) @@ -361,7 +361,7 @@ class JsonParserGenerator( } } - private fun RustWriter.deserializeTimestamp(shape: TimestampShape, member: MemberShape) { + private fun RustWriter.deserializeTimestamp(member: MemberShape) { val timestampFormat = httpBindingResolver.timestampFormat( member, HttpLocation.DOCUMENT, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt index e300d248b17..fbf938265e2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt @@ -106,7 +106,7 @@ open class ServerRootGenerator( //! #### Plugins //! //! The [`$serviceName::builder_with_plugins`] method, returning [`$builderName`], - //! accepts a plugin marked with [`HttpMarker`](aws_smithy_http_server::plugin::HttpMarker) and a + //! accepts a plugin marked with [`HttpMarker`](aws_smithy_http_server::plugin::HttpMarker) and a //! plugin marked with [`ModelMarker`](aws_smithy_http_server::plugin::ModelMarker). //! Plugins allow you to build middleware which is aware of the operation it is being applied to. //! diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt index 042aba71595..fdb0cc72b48 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt @@ -20,7 +20,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("\t") string MyString """.asSmithyModel(smithyVersion = "2") @@ -41,7 +41,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("[.\n\\r]+") string MyString """.asSmithyModel(smithyVersion = "2") @@ -62,16 +62,16 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("\b") string MyString - + @pattern("^\n$") string MyString2 - + @pattern("^[\n]+$") string MyString3 - + @pattern("^[\r\t]$") string MyString4 """.asSmithyModel(smithyVersion = "2") @@ -85,10 +85,10 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("\t") string MyString - + structure MyStructure { @pattern("\b") field: String @@ -109,10 +109,10 @@ class PatternTraitEscapedSpecialCharsValidatorTest { @pattern("\\t") string MyString - + @pattern("[.\\n\\r]+") string MyString2 - + @pattern("\\b\\f\\n\\r\\t") string MyString3 From 1297c8c7d3d382ac8c65dad9a2502c56b3311150 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 12 Oct 2023 11:40:50 -0500 Subject: [PATCH 171/331] Avoid a real connection in unit test (#3063) ## Motivation and Context Fixes a flaky test that misbehaves as follows: ``` ---- tests_1::test_specifying_credentials_provider_only_at_operation_level_should_work stdout ---- thread 'tests_1::test_specifying_credentials_provider_only_at_operation_level_should_work' panicked at 'success: DispatchFailure(DispatchFailure { source: ConnectorError { kind: Io, sour ce: hyper::Error(Connect, ConnectError("tcp connect error", Os { code: 110, kind: TimedOut, message: "Connection timed out" })), connection: Unknown } })', smithy-test9200972819374912606/src /lib.rs:105:14 ``` ## Description Because the fix is meant for the release branch, it uses a `TestConnection` rather than a `StaticReplayClient`, which is available only in the `main` branch. Code needs to be upgraded when the PR is back-ported to the `main` branch. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../rustsdk/CredentialCacheConfigTest.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt index cb2f679fb3c..405e38102ef 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.core.rustlang.Attribute +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel @@ -61,8 +62,12 @@ internal class CredentialCacheConfigTest { "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), "RuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::runtime_plugin::RuntimePlugin"), + "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) .resolve("cache::SharedCredentialsCache"), + "TestConnection" to CargoDependency.smithyClient(runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("test_connection::TestConnection"), ) rustCrate.testModule { unitTest( @@ -138,7 +143,18 @@ internal class CredentialCacheConfigTest { // per https://github.com/awslabs/aws-sdk-rust/issues/901 rustTemplate( """ - let client_config = crate::config::Config::builder().build(); + let connector = #{TestConnection}::new(vec![( + http::Request::builder() + .body(#{SdkBody}::from("request body")) + .unwrap(), + http::Response::builder() + .status(200) + .body(#{SdkBody}::from("response")) + .unwrap(), + )]); + let client_config = crate::config::Config::builder() + .http_connector(connector.clone()) + .build(); let client = crate::client::Client::from_conf(client_config); let credentials = #{Credentials}::new( From 98dadc01081461ecb2269dbedadc58c2a8a3e185 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 12 Oct 2023 14:05:05 -0400 Subject: [PATCH 172/331] Make updates to default value behavior (#3064) ## Motivation and Context Several bugs in our default implementation where uncovered ## Description - Documents and Timestamps both don't match the 0-value semantics, so in those cases, also use an explicit value ## Testing Unit test updated ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../rust/codegen/core/smithy/SymbolVisitor.kt | 12 ++++++++---- .../smithy/generators/BuilderGeneratorTest.kt | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt index ec83941c8f5..9deff45ccc6 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt @@ -269,10 +269,14 @@ open class SymbolVisitor( override fun memberShape(shape: MemberShape): Symbol { val target = model.expectShape(shape.target) val defaultValue = shape.getMemberTrait(model, DefaultTrait::class.java).orNull()?.let { trait -> - when (val value = trait.toNode()) { - Node.from(""), Node.from(0), Node.from(false), Node.arrayNode(), Node.objectNode() -> Default.RustDefault - Node.nullNode() -> Default.NoDefault - else -> Default.NonZeroDefault(value) + if (target.isDocumentShape || target.isTimestampShape) { + Default.NonZeroDefault(trait.toNode()) + } else { + when (val value = trait.toNode()) { + Node.from(""), Node.from(0), Node.from(false), Node.arrayNode(), Node.objectNode() -> Default.RustDefault + Node.nullNode() -> Default.NoDefault + else -> Default.NonZeroDefault(value) + } } } ?: Default.NoDefault // Handle boxing first, so we end up with Option>, not Box>. diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index 2220a6f10f6..b38aa586e78 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -177,12 +177,26 @@ internal class BuilderGeneratorTest { @default(true) @required defaultDocument: Document + + @default([]) + @required + listDocument: Document + + @default(0) + zero_timestamp: Timestamp + + @default(1) + one_timestamp: Timestamp + + @default("abc") + blob_abc: Blob } list StringList { member: String } @default(1) integer OneDefault + """.asSmithyModel(smithyVersion = "2.0") val provider = testSymbolProvider( @@ -207,6 +221,10 @@ internal class BuilderGeneratorTest { assert_eq!(s.an_actually_required_field(), 5); assert_eq!(s.no_default(), None); assert_eq!(s.default_document().as_bool().unwrap(), true); + assert_eq!(s.list_document().as_array().expect("empty list"), &[]); + assert_eq!(std::str::from_utf8(s.blob_abc().as_ref()).expect("invalid blob"), "abc"); + assert_eq!(s.zero_timestamp().secs(), 0); + assert_eq!(s.one_timestamp().secs(), 1); """, "Struct" to provider.toSymbol(shape), ) From 8439f2ae43e02b93f4aecd42a48673c1490b919a Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 12 Oct 2023 16:49:26 -0500 Subject: [PATCH 173/331] Move `aws_smithy_http::operation::error::BuildError` into `aws-smithy-types` (#3032) ## Motivation and Context Takes care of the first part of https://github.com/awslabs/smithy-rs/issues/3054 (the remaining part is denoted as `TODO(runtimeCratesVersioningCleanup)` and until that's done the issue will not be closed). ## Description This PR moves from `aws-smithy-http::operation::error::{BuildError, SerializationError}` to `aws-smithy-types::error::operation::{BuildError, SerializationError}`. Within the origin crate, we leave "breadcrumbs" (i.e. reexports) for existing customers of the items above so they are not broken by the move. The breadcrumps will be removed by the part two of the issue. As part of the move, `aws_smithy_http::endpoint::EndpointPrefix::new` now returns its `crate::endpoint::error::InvalidEndpointError` instead of `crate::operation::error::BuildError` for two reasons: - `BuildError` is now in a stable crate and for an `InvalidUri` variant to be created, it needed to take a `http::uri::InvalidUri` from a unstable crate, which we cannot expose in public API. - The new error is more closely related to the endpoint business. ## Testing Relied on the tests in CI. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 8 +++++ .../EndpointTraitBindingGenerator.kt | 10 +++---- .../generators/EndpointTraitBindingsTest.kt | 10 +++---- rust-runtime/aws-smithy-http/src/endpoint.rs | 21 +++++++------- .../aws-smithy-http/src/endpoint/error.rs | 25 +++++++++++----- rust-runtime/aws-smithy-http/src/operation.rs | 7 ++++- rust-runtime/aws-smithy-types/src/error.rs | 1 + .../src/error/operation.rs} | 29 ++----------------- 8 files changed, 52 insertions(+), 59 deletions(-) rename rust-runtime/{aws-smithy-http/src/operation/error.rs => aws-smithy-types/src/error/operation.rs} (84%) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 072b0737457..c6be15ef79c 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -335,3 +335,11 @@ message = "The future return types on traits `EndpointResolver` and `IdentityRes references = ["smithy-rs#3055"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = """ +[`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html). +""" +references = ["smithy-rs#3032"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt index 41e76cc498a..fe373a13bb4 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt @@ -16,7 +16,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider -import software.amazon.smithy.rust.codegen.core.smithy.generators.OperationBuildError import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -72,18 +71,17 @@ class EndpointTraitBindings( rust("let $field = &$input.$field;") } if (generateValidation) { + val errorString = "$field was unset or empty but must be set as part of the endpoint prefix" val contents = """ if $field.is_empty() { - return Err(#{invalidFieldError:W}.into()) + return Err(#{InvalidEndpointError}::failed_to_construct_uri("$errorString").into()); } """ rustTemplate( contents, - "invalidFieldError" to OperationBuildError(runtimeConfig).invalidField( - field, - "$field was unset or empty but must be set as part of the endpoint prefix", - ), + "InvalidEndpointError" to RuntimeType.smithyHttp(runtimeConfig) + .resolve("endpoint::error::InvalidEndpointError"), ) } "${label.content} = $field" diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index 3d1dcd009d7..a6f699dae06 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -16,10 +16,9 @@ import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel @@ -70,10 +69,9 @@ internal class EndpointTraitBindingsTest { """, ) implBlock(symbolProvider.toSymbol(model.lookup("test#GetStatusInput"))) { - rustBlock( - "fn endpoint_prefix(&self) -> std::result::Result<#T::endpoint::EndpointPrefix, #T>", - RuntimeType.smithyHttp(TestRuntimeConfig), - TestRuntimeConfig.operationBuildError(), + rustBlockTemplate( + "fn endpoint_prefix(&self) -> std::result::Result<#{endpoint}::EndpointPrefix, #{endpoint}::error::InvalidEndpointError>", + "endpoint" to RuntimeType.smithyHttp(TestRuntimeConfig).resolve("endpoint"), ) { endpointBindingGenerator.render(this, "self") } diff --git a/rust-runtime/aws-smithy-http/src/endpoint.rs b/rust-runtime/aws-smithy-http/src/endpoint.rs index 84962397878..03759cc5313 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint.rs @@ -6,7 +6,6 @@ //! Code for resolving an endpoint (URI) that a request should be sent to use crate::endpoint::error::InvalidEndpointError; -use crate::operation::error::BuildError; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use http::uri::{Authority, Uri}; use std::borrow::Cow; @@ -104,15 +103,13 @@ impl ResolveEndpoint for Endpoint { pub struct EndpointPrefix(String); impl EndpointPrefix { /// Create a new endpoint prefix from an `impl Into`. If the prefix argument is invalid, - /// a [`BuildError`] will be returned. - pub fn new(prefix: impl Into) -> StdResult { + /// a [`InvalidEndpointError`] will be returned. + pub fn new(prefix: impl Into) -> StdResult { let prefix = prefix.into(); match Authority::from_str(&prefix) { Ok(_) => Ok(EndpointPrefix(prefix)), - Err(err) => Err(BuildError::invalid_uri( - prefix, - "invalid prefix".into(), - err, + Err(err) => Err(InvalidEndpointError::failed_to_construct_authority( + prefix, err, )), } } @@ -142,11 +139,13 @@ pub fn apply_endpoint( .map(|auth| auth.as_str()) .unwrap_or(""); let authority = if !prefix.is_empty() { - Authority::from_str(&format!("{}{}", prefix, authority)) + Cow::Owned(format!("{}{}", prefix, authority)) } else { - Authority::from_str(authority) - } - .map_err(InvalidEndpointError::failed_to_construct_authority)?; + Cow::Borrowed(authority) + }; + let authority = Authority::from_str(&authority).map_err(|err| { + InvalidEndpointError::failed_to_construct_authority(authority.into_owned(), err) + })?; let scheme = *endpoint .scheme() .as_ref() diff --git a/rust-runtime/aws-smithy-http/src/endpoint/error.rs b/rust-runtime/aws-smithy-http/src/endpoint/error.rs index bab0f93ac66..eeb703523c1 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint/error.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint/error.rs @@ -54,6 +54,7 @@ impl Error for ResolveEndpointError { pub(super) enum InvalidEndpointErrorKind { EndpointMustHaveScheme, FailedToConstructAuthority { + authority: String, source: Box, }, FailedToConstructUri { @@ -69,23 +70,28 @@ pub struct InvalidEndpointError { } impl InvalidEndpointError { - pub(super) fn endpoint_must_have_scheme() -> Self { + /// Construct a build error for a missing scheme + pub fn endpoint_must_have_scheme() -> Self { Self { kind: InvalidEndpointErrorKind::EndpointMustHaveScheme, } } - pub(super) fn failed_to_construct_authority( + /// Construct a build error for an invalid authority + pub fn failed_to_construct_authority( + authority: impl Into, source: impl Into>, ) -> Self { Self { kind: InvalidEndpointErrorKind::FailedToConstructAuthority { + authority: authority.into(), source: source.into(), }, } } - pub(super) fn failed_to_construct_uri( + /// Construct a build error for an invalid URI + pub fn failed_to_construct_uri( source: impl Into>, ) -> Self { Self { @@ -105,11 +111,11 @@ impl From for InvalidEndpointError { impl fmt::Display for InvalidEndpointError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use InvalidEndpointErrorKind as ErrorKind; - match self.kind { + match &self.kind { ErrorKind::EndpointMustHaveScheme => write!(f, "endpoint must contain a valid scheme"), - ErrorKind::FailedToConstructAuthority { .. } => write!( + ErrorKind::FailedToConstructAuthority { authority, source: _ } => write!( f, - "endpoint must contain a valid authority when combined with endpoint prefix" + "endpoint must contain a valid authority when combined with endpoint prefix: {authority}" ), ErrorKind::FailedToConstructUri { .. } => write!(f, "failed to construct URI"), } @@ -120,8 +126,11 @@ impl Error for InvalidEndpointError { fn source(&self) -> Option<&(dyn Error + 'static)> { use InvalidEndpointErrorKind as ErrorKind; match &self.kind { - ErrorKind::FailedToConstructUri { source } - | ErrorKind::FailedToConstructAuthority { source } => Some(source.as_ref()), + ErrorKind::FailedToConstructUri { source } => Some(source.as_ref()), + ErrorKind::FailedToConstructAuthority { + authority: _, + source, + } => Some(source.as_ref()), ErrorKind::EndpointMustHaveScheme => None, } } diff --git a/rust-runtime/aws-smithy-http/src/operation.rs b/rust-runtime/aws-smithy-http/src/operation.rs index d31997c85ea..0fed557b79b 100644 --- a/rust-runtime/aws-smithy-http/src/operation.rs +++ b/rust-runtime/aws-smithy-http/src/operation.rs @@ -9,7 +9,12 @@ use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::borrow::Cow; -pub mod error; +//TODO(runtimeCratesVersioningCleanup): Re-point those who use the following reexport to +// directly depend on `aws_smithy_types` and remove the reexport below. +/// Errors for operations +pub mod error { + pub use aws_smithy_types::error::operation::{BuildError, SerializationError}; +} /// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called. #[derive(Clone, Debug)] diff --git a/rust-runtime/aws-smithy-types/src/error.rs b/rust-runtime/aws-smithy-types/src/error.rs index b83d6ffe077..96a48441e0d 100644 --- a/rust-runtime/aws-smithy-types/src/error.rs +++ b/rust-runtime/aws-smithy-types/src/error.rs @@ -9,6 +9,7 @@ use std::fmt; pub mod display; pub mod metadata; +pub mod operation; mod unhandled; pub use metadata::ErrorMetadata; diff --git a/rust-runtime/aws-smithy-http/src/operation/error.rs b/rust-runtime/aws-smithy-types/src/error/operation.rs similarity index 84% rename from rust-runtime/aws-smithy-http/src/operation/error.rs rename to rust-runtime/aws-smithy-types/src/error/operation.rs index 5b2024396f2..5b61f1acfe5 100644 --- a/rust-runtime/aws-smithy-http/src/operation/error.rs +++ b/rust-runtime/aws-smithy-types/src/error/operation.rs @@ -5,9 +5,7 @@ //! Errors for operations -use aws_smithy_types::date_time::DateTimeFormatError; -use http::uri::InvalidUri; -use std::borrow::Cow; +use crate::date_time::DateTimeFormatError; use std::error::Error; use std::fmt::{Display, Formatter}; @@ -80,15 +78,6 @@ enum BuildErrorKind { /// The serializer could not serialize the input SerializationError(SerializationError), - /// The serializer did not produce a valid URI - /// - /// This typically indicates that a field contained invalid characters. - InvalidUri { - uri: String, - message: Cow<'static, str>, - source: InvalidUri, - }, - /// An error occurred request construction Other(Box), } @@ -104,16 +93,6 @@ pub struct BuildError { } impl BuildError { - pub(crate) fn invalid_uri(uri: String, message: Cow<'static, str>, source: InvalidUri) -> Self { - Self { - kind: BuildErrorKind::InvalidUri { - uri, - message, - source, - }, - } - } - /// Construct a build error for a missing field pub fn missing_field(field: &'static str, details: &'static str) -> Self { Self { @@ -121,7 +100,7 @@ impl BuildError { } } - /// Construct a build error for a missing field + /// Construct a build error for an invalid field pub fn invalid_field(field: &'static str, details: impl Into) -> Self { Self { kind: BuildErrorKind::InvalidField { @@ -165,9 +144,6 @@ impl Display for BuildError { BuildErrorKind::SerializationError(_) => { write!(f, "failed to serialize input") } - BuildErrorKind::InvalidUri { uri, message, .. } => { - write!(f, "generated URI `{uri}` was not a valid URI: {message}") - } BuildErrorKind::Other(_) => { write!(f, "error during request construction") } @@ -180,7 +156,6 @@ impl Error for BuildError { match &self.kind { BuildErrorKind::SerializationError(source) => Some(source as _), BuildErrorKind::Other(source) => Some(source.as_ref()), - BuildErrorKind::InvalidUri { source, .. } => Some(source as _), BuildErrorKind::InvalidField { .. } | BuildErrorKind::MissingField { .. } => None, } } From d293d1f762a7e0bc252ac03570c2c58669bf9cc5 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 13 Oct 2023 09:56:50 -0700 Subject: [PATCH 174/331] Add lifetimes to async traits that take args by reference (#3061) This PR adds lifetimes to the `IdentityResolver`, `DnsResolver` (renamed to `ResolveDns`), and `EndpointResolver` traits so that lifetime gymnastics aren't needed when implementing those traits. For example, `IdentityResolver::resolve_identity` takes `&ConfigBag` as an argument, which means you have to pull things out of the ConfigBag outside of any returned async block in order for the compiler to be satisfied. This change removes that consideration and makes implementing these traits a lot easier. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 +++++ .../aws-config/external-types.toml | 2 +- aws/rust-runtime/aws-config/src/ecs.rs | 20 ++++---- .../aws-config/src/imds/client.rs | 7 ++- .../aws-config/src/imds/client/token.rs | 16 +++--- .../aws-inlineable/src/endpoint_discovery.rs | 4 +- aws/rust-runtime/aws-runtime/src/identity.rs | 2 +- .../aws-smithy-async/src/future/mod.rs | 2 +- .../aws-smithy-runtime-api/src/client.rs | 42 +++++++++++++--- .../aws-smithy-runtime-api/src/client/dns.rs | 50 +++++-------------- .../src/client/endpoint.rs | 8 +-- .../aws-smithy-runtime-api/src/client/http.rs | 4 +- .../src/client/identity.rs | 8 +-- .../src/client/identity/http.rs | 4 +- .../src/client/runtime_components.rs | 4 +- .../aws-smithy-runtime/src/client/dns.rs | 7 +-- .../src/client/http/test_util/wire.rs | 2 +- .../src/client/identity/no_auth.rs | 2 +- .../src/client/orchestrator/auth.rs | 2 +- .../src/client/orchestrator/endpoints.rs | 4 +- 20 files changed, 106 insertions(+), 96 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c6be15ef79c..8d6525eb8e6 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -343,3 +343,15 @@ message = """ references = ["smithy-rs#3032"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "ysaito1001" + +[[aws-sdk-rust]] +message = "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits." +references = ["smithy-rs#3061"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "Lifetimes have been added to the `EndpointResolver` trait." +references = ["smithy-rs#3061"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index 450f0b5c9d0..95ccecc43ec 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -16,7 +16,7 @@ allowed_external_types = [ "aws_smithy_http::endpoint", "aws_smithy_http::endpoint::error::InvalidEndpointError", "aws_smithy_http::result::SdkError", - "aws_smithy_runtime_api::client::dns::DnsResolver", + "aws_smithy_runtime_api::client::dns::ResolveDns", "aws_smithy_runtime_api::client::dns::SharedDnsResolver", "aws_smithy_runtime_api::client::http::HttpClient", "aws_smithy_runtime_api::client::http::SharedHttpClient", diff --git a/aws/rust-runtime/aws-config/src/ecs.rs b/aws/rust-runtime/aws-config/src/ecs.rs index ef63015e692..e8c709bf6d4 100644 --- a/aws/rust-runtime/aws-config/src/ecs.rs +++ b/aws/rust-runtime/aws-config/src/ecs.rs @@ -50,7 +50,7 @@ use crate::http_credential_provider::HttpCredentialProvider; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; use aws_smithy_http::endpoint::apply_endpoint; -use aws_smithy_runtime_api::client::dns::{DnsResolver, ResolveDnsError, SharedDnsResolver}; +use aws_smithy_runtime_api::client::dns::{ResolveDns, ResolveDnsError, SharedDnsResolver}; use aws_smithy_runtime_api::client::http::HttpConnectorSettings; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; @@ -272,9 +272,9 @@ impl Builder { /// Override the DNS resolver used to validate URIs /// - /// URIs must refer to loopback addresses. The [`DnsResolver`](aws_smithy_runtime_api::client::dns::DnsResolver) - /// is used to retrieve IP addresses for a given domain. - pub fn dns(mut self, dns: impl DnsResolver + 'static) -> Self { + /// URIs must refer to loopback addresses. The [`ResolveDns`](aws_smithy_runtime_api::client::dns::ResolveDns) + /// implementation is used to retrieve IP addresses for a given domain. + pub fn dns(mut self, dns: impl ResolveDns + 'static) -> Self { self.dns = Some(dns.into_shared()); self } @@ -399,7 +399,7 @@ async fn validate_full_uri( Ok(addr) => addr.is_loopback(), Err(_domain_name) => { let dns = dns.ok_or(InvalidFullUriErrorKind::NoDnsResolver)?; - dns.resolve_dns(host.to_owned()) + dns.resolve_dns(host) .await .map_err(|err| InvalidFullUriErrorKind::DnsLookupFailed(ResolveDnsError::new(err)))? .iter() @@ -751,16 +751,16 @@ mod test { } } - impl DnsResolver for TestDns { - fn resolve_dns(&self, name: String) -> DnsFuture { - DnsFuture::ready(Ok(self.addrs.get(&name).unwrap_or(&self.fallback).clone())) + impl ResolveDns for TestDns { + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> { + DnsFuture::ready(Ok(self.addrs.get(name).unwrap_or(&self.fallback).clone())) } } #[derive(Debug)] struct NeverDns; - impl DnsResolver for NeverDns { - fn resolve_dns(&self, _name: String) -> DnsFuture { + impl ResolveDns for NeverDns { + fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> { DnsFuture::new(async { Never::new().await; unreachable!() diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 6d46692f75f..e4529929a45 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -524,11 +524,10 @@ struct ImdsEndpointResolver { } impl EndpointResolver for ImdsEndpointResolver { - fn resolve_endpoint(&self, _: &EndpointResolverParams) -> EndpointFuture { - let this = self.clone(); + fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> { EndpointFuture::new(async move { - this.endpoint_source - .endpoint(this.mode_override) + self.endpoint_source + .endpoint(self.mode_override.clone()) .await .map(|uri| Endpoint::builder().url(uri.to_string()).build()) .map_err(|err| err.into()) diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index 0d6e309da83..f7e7f38e742 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -192,23 +192,19 @@ fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result IdentityFuture { - let this = self.clone(); - IdentityFuture::new(async move { - let preloaded_token = this + fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { + IdentityFuture::new(async { + let preloaded_token = self .inner .cache - .yield_or_clear_if_expired(this.inner.time_source.now()) + .yield_or_clear_if_expired(self.inner.time_source.now()) .await; let token = match preloaded_token { Some(token) => Ok(token), None => { - this.inner + self.inner .cache - .get_or_load(|| { - let this = this.clone(); - async move { this.get_token().await } - }) + .get_or_load(|| async { self.get_token().await }) .await } }?; diff --git a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs index 298899e71bf..7e80f9ab222 100644 --- a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs +++ b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs @@ -20,7 +20,9 @@ use tokio::sync::oneshot::{Receiver, Sender}; /// Endpoint reloader #[must_use] pub struct ReloadEndpoint { - loader: Box BoxFuture<(Endpoint, SystemTime), ResolveEndpointError> + Send + Sync>, + loader: Box< + dyn Fn() -> BoxFuture<'static, (Endpoint, SystemTime), ResolveEndpointError> + Send + Sync, + >, endpoint: Arc>>, error: Arc>>, rx: Receiver<()>, diff --git a/aws/rust-runtime/aws-runtime/src/identity.rs b/aws/rust-runtime/aws-runtime/src/identity.rs index 1d42e13b3a8..fe79d17ef9b 100644 --- a/aws/rust-runtime/aws-runtime/src/identity.rs +++ b/aws/rust-runtime/aws-runtime/src/identity.rs @@ -23,7 +23,7 @@ pub mod credentials { } impl IdentityResolver for CredentialsIdentityResolver { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { let cache = self.credentials_cache.clone(); IdentityFuture::new(async move { let credentials = cache.as_ref().provide_cached_credentials().await?; diff --git a/rust-runtime/aws-smithy-async/src/future/mod.rs b/rust-runtime/aws-smithy-async/src/future/mod.rs index d60fc46c772..2fe1afa38ec 100644 --- a/rust-runtime/aws-smithy-async/src/future/mod.rs +++ b/rust-runtime/aws-smithy-async/src/future/mod.rs @@ -15,4 +15,4 @@ pub mod rendezvous; pub mod timeout; /// A boxed future that outputs a `Result`. -pub type BoxFuture = Pin> + Send>>; +pub type BoxFuture<'a, T, E> = Pin> + Send + 'a>>; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index 08539a50ddd..e5151b84d6b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -3,28 +3,54 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Declares a new-type for a future that is returned from an async trait (prior to stable async trait). +/// +/// To declare a future with a static lifetime: +/// ```ignore +/// new_type_future! { +/// doc = "some rustdoc for the future's struct", +/// pub struct NameOfFuture<'static, OutputType, ErrorType>; +/// } +/// ``` +/// +/// To declare a future with a non-static lifetime: +/// ```ignore +/// new_type_future! { +/// doc = "some rustdoc for the future's struct", +/// pub struct NameOfFuture<'a, OutputType, ErrorType>; +/// } +/// ``` macro_rules! new_type_future { ( - doc = $type_docs:literal, - pub struct $future_name:ident<$output:ty, $err:ty>, + #[doc = $type_docs:literal] + pub struct $future_name:ident<'static, $output:ty, $err:ty>; ) => { + new_type_future!(@internal, $type_docs, $future_name, $output, $err, 'static,); + }; + ( + #[doc = $type_docs:literal] + pub struct $future_name:ident<$lifetime:lifetime, $output:ty, $err:ty>; + ) => { + new_type_future!(@internal, $type_docs, $future_name, $output, $err, $lifetime, <$lifetime>); + }; + (@internal, $type_docs:literal, $future_name:ident, $output:ty, $err:ty, $lifetime:lifetime, $($decl_lifetime:tt)*) => { pin_project_lite::pin_project! { #[allow(clippy::type_complexity)] #[doc = $type_docs] - pub struct $future_name { + pub struct $future_name$($decl_lifetime)* { #[pin] inner: aws_smithy_async::future::now_or_later::NowOrLater< Result<$output, $err>, - aws_smithy_async::future::BoxFuture<$output, $err> + aws_smithy_async::future::BoxFuture<$lifetime, $output, $err> >, } } - impl $future_name { + impl$($decl_lifetime)* $future_name$($decl_lifetime)* { #[doc = concat!("Create a new `", stringify!($future_name), "` with the given future.")] pub fn new(future: F) -> Self where - F: std::future::Future> + Send + 'static, + F: std::future::Future> + Send + $lifetime, { Self { inner: aws_smithy_async::future::now_or_later::NowOrLater::new(Box::pin(future)), @@ -38,7 +64,7 @@ macro_rules! new_type_future { ")] pub fn new_boxed( future: std::pin::Pin< - Box> + Send>, + Box> + Send + $lifetime>, >, ) -> Self { Self { @@ -54,7 +80,7 @@ macro_rules! new_type_future { } } - impl std::future::Future for $future_name { + impl$($decl_lifetime)* std::future::Future for $future_name$($decl_lifetime)* { type Output = Result<$output, $err>; fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll { diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs b/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs index f7dbadec60d..41706e73370 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs @@ -7,14 +7,10 @@ use crate::box_error::BoxError; use crate::impl_shared_conversions; -use aws_smithy_async::future::now_or_later::NowOrLater; use std::error::Error as StdError; use std::fmt; -use std::future::Future; use std::net::IpAddr; -use std::pin::Pin; use std::sync::Arc; -use std::task::{Context, Poll}; /// Error that occurs when failing to perform a DNS lookup. #[derive(Debug)] @@ -43,57 +39,35 @@ impl StdError for ResolveDnsError { } } -type BoxFuture = aws_smithy_async::future::BoxFuture; - -/// New-type for the future returned by the [`DnsResolver`] trait. -pub struct DnsFuture(NowOrLater, ResolveDnsError>, BoxFuture>>); -impl DnsFuture { - /// Create a new `DnsFuture` - pub fn new( - future: impl Future, ResolveDnsError>> + Send + 'static, - ) -> Self { - Self(NowOrLater::new(Box::pin(future))) - } - - /// Create a `DnsFuture` that is immediately ready - pub fn ready(result: Result, ResolveDnsError>) -> Self { - Self(NowOrLater::ready(result)) - } -} -impl Future for DnsFuture { - type Output = Result, ResolveDnsError>; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let mut this = self.as_mut(); - let inner = Pin::new(&mut this.0); - Future::poll(inner, cx) - } +new_type_future! { + #[doc = "New-type for the future returned by the [`ResolveDns`] trait."] + pub struct DnsFuture<'a, Vec, ResolveDnsError>; } /// Trait for resolving domain names -pub trait DnsResolver: fmt::Debug + Send + Sync { +pub trait ResolveDns: fmt::Debug + Send + Sync { /// Asynchronously resolve the given domain name - fn resolve_dns(&self, name: String) -> DnsFuture; + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a>; } -/// Shared DNS resolver +/// Shared instance of [`ResolveDns`]. #[derive(Clone, Debug)] -pub struct SharedDnsResolver(Arc); +pub struct SharedDnsResolver(Arc); impl SharedDnsResolver { /// Create a new `SharedDnsResolver`. - pub fn new(resolver: impl DnsResolver + 'static) -> Self { + pub fn new(resolver: impl ResolveDns + 'static) -> Self { Self(Arc::new(resolver)) } } -impl DnsResolver for SharedDnsResolver { - fn resolve_dns(&self, name: String) -> DnsFuture { +impl ResolveDns for SharedDnsResolver { + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> { self.0.resolve_dns(name) } } -impl_shared_conversions!(convert SharedDnsResolver from DnsResolver using SharedDnsResolver::new); +impl_shared_conversions!(convert SharedDnsResolver from ResolveDns using SharedDnsResolver::new); #[cfg(test)] mod tests { @@ -102,6 +76,6 @@ mod tests { #[test] fn check_send() { fn is_send() {} - is_send::(); + is_send::>(); } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index 3e885019e68..0790c164886 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -14,8 +14,8 @@ use std::fmt; use std::sync::Arc; new_type_future! { - doc = "Future for [`EndpointResolver::resolve_endpoint`].", - pub struct EndpointFuture, + #[doc = "Future for [`EndpointResolver::resolve_endpoint`]."] + pub struct EndpointFuture<'a, Endpoint, BoxError>; } /// Parameters originating from the Smithy endpoint ruleset required for endpoint resolution. @@ -45,7 +45,7 @@ impl Storable for EndpointResolverParams { /// Configurable endpoint resolver implementation. pub trait EndpointResolver: Send + Sync + fmt::Debug { /// Asynchronously resolves an endpoint to use from the given endpoint parameters. - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> EndpointFuture; + fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a>; } /// Shared endpoint resolver. @@ -62,7 +62,7 @@ impl SharedEndpointResolver { } impl EndpointResolver for SharedEndpointResolver { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> EndpointFuture { + fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> { self.0.resolve_endpoint(params) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index f3098b7204f..f271540f11a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -62,8 +62,8 @@ use std::sync::Arc; use std::time::Duration; new_type_future! { - doc = "Future for [`HttpConnector::call`].", - pub struct HttpConnectorFuture, + #[doc = "Future for [`HttpConnector::call`]."] + pub struct HttpConnectorFuture<'static, HttpResponse, ConnectorError>; } /// Trait with a `call` function that asynchronously converts a request into a response. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index f3dcb9c2154..6bc990d57df 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -17,8 +17,8 @@ use std::time::SystemTime; pub mod http; new_type_future! { - doc = "Future for [`IdentityResolver::resolve_identity`].", - pub struct IdentityFuture, + #[doc = "Future for [`IdentityResolver::resolve_identity`]."] + pub struct IdentityFuture<'a, Identity, BoxError>; } /// Resolver for identities. @@ -34,7 +34,7 @@ new_type_future! { /// There is no fallback to other auth schemes in the absence of an identity. pub trait IdentityResolver: Send + Sync + Debug { /// Asynchronously resolves an identity for a request using the given config. - fn resolve_identity(&self, config_bag: &ConfigBag) -> IdentityFuture; + fn resolve_identity<'a>(&'a self, config_bag: &'a ConfigBag) -> IdentityFuture<'a>; } /// Container for a shared identity resolver. @@ -49,7 +49,7 @@ impl SharedIdentityResolver { } impl IdentityResolver for SharedIdentityResolver { - fn resolve_identity(&self, config_bag: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, config_bag: &'a ConfigBag) -> IdentityFuture<'a> { self.0.resolve_identity(config_bag) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs index bf8204d9606..1aca87a4a54 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs @@ -64,7 +64,7 @@ impl From for Token { } impl IdentityResolver for Token { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } @@ -123,7 +123,7 @@ impl Login { } impl IdentityResolver for Login { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index c70162ea4c6..47c5ad5487e 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -579,7 +579,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeEndpointResolver; impl EndpointResolver for FakeEndpointResolver { - fn resolve_endpoint(&self, _: &EndpointResolverParams) -> EndpointFuture { + fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> { unreachable!("fake endpoint resolver must be overridden for this test") } } @@ -606,7 +606,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeIdentityResolver; impl IdentityResolver for FakeIdentityResolver { - fn resolve_identity(&self, _: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, _: &'a ConfigBag) -> IdentityFuture<'a> { unreachable!("fake identity resolver must be overridden for this test") } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/dns.rs b/rust-runtime/aws-smithy-runtime/src/client/dns.rs index 3a311ccd988..cb776eac3c7 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/dns.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/dns.rs @@ -7,7 +7,7 @@ #[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] mod tokio { - use aws_smithy_runtime_api::client::dns::{DnsFuture, DnsResolver, ResolveDnsError}; + use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError}; use std::io::{Error as IoError, ErrorKind as IoErrorKind}; use std::net::ToSocketAddrs; @@ -25,8 +25,9 @@ mod tokio { } } - impl DnsResolver for TokioDnsResolver { - fn resolve_dns(&self, name: String) -> DnsFuture { + impl ResolveDns for TokioDnsResolver { + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> { + let name = name.to_string(); DnsFuture::new(async move { let result = tokio::task::spawn_blocking(move || (name, 0).to_socket_addrs()).await; match result { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs index f5dd76e8db4..4165c0237d5 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs @@ -333,7 +333,7 @@ pub struct LoggingDnsResolver { impl Service for LoggingDnsResolver { type Response = Once; type Error = Infallible; - type Future = BoxFuture; + type Future = BoxFuture<'static, Self::Response, Self::Error>; fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs index 8a6ec5ab0dc..3e72d6bd317 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs @@ -29,7 +29,7 @@ impl NoAuthIdentityResolver { } impl IdentityResolver for NoAuthIdentityResolver { - fn resolve_identity(&self, _: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, _: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 56f6dab0dc4..831e68c019e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -160,7 +160,7 @@ mod tests { #[derive(Debug)] struct TestIdentityResolver; impl IdentityResolver for TestIdentityResolver { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> IdentityFuture { + fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 7afd3c41660..2efbe331db3 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -46,7 +46,7 @@ impl StaticUriEndpointResolver { } impl EndpointResolver for StaticUriEndpointResolver { - fn resolve_endpoint(&self, _params: &EndpointResolverParams) -> EndpointFuture { + fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> { EndpointFuture::ready(Ok(Endpoint::builder() .url(self.endpoint.to_string()) .build())) @@ -101,7 +101,7 @@ impl EndpointResolver for DefaultEndpointResolver where Params: Debug + Send + Sync + 'static, { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> EndpointFuture { + fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> { let ep = match params.get::() { Some(params) => self.inner.resolve_endpoint(params).map_err(Box::new), None => Err(Box::new(ResolveEndpointError::message( From d6a1befb3a388a844e74d82245c90045aed39673 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 13 Oct 2023 12:02:34 -0500 Subject: [PATCH 175/331] Fix vulnerability report from `cargo audit` (#3066) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context With `cargo-audit` v0.18.2, it reports the following vulnerabilities when run against generated SDKs. ``` $ pwd /aws/sdk/build/aws-sdk $ cargo generate-lockfile && cargo audit ... Scanning Cargo.lock for vulnerabilities (339 crate dependencies) Crate: atty Version: 0.2.14 Warning: unsound Title: Potential unaligned read Date: 2021-07-04 ID: RUSTSEC-2021-0145 URL: https://rustsec.org/advisories/RUSTSEC-2021-0145 Dependency tree: atty 0.2.14 ├── env_logger 0.9.3 │ └── aws-credential-types 0.56.1 | ... |___ criterion 0.4.0 ``` Both of the latest `env_logger` and `criterion` removed their dependencies on `atty`. This PR, therefore, updates a version of `env_logger` and that of `criterion` within the `smithy-rs` codebase. ## Testing Ran the above repro steps against SDKs generated from this branch. No vulnerabilities detected. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-credential-types/Cargo.toml | 2 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 2 +- aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml | 2 +- aws/sdk/integration-tests/dynamodb/Cargo.toml | 2 +- .../amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt | 2 +- rust-runtime/aws-smithy-types/Cargo.toml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index 073aede5e72..ac5886fa73d 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -25,7 +25,7 @@ aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = # used to test compatibility async-trait = "0.1.51" -env_logger = "0.9.0" +env_logger = "0.10.0" tokio = { version = "1.23.1", features = ["full", "test-util", "rt"] } tracing-test = "0.2.4" diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index 3ceb13b2fd1..d358e566203 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -40,7 +40,7 @@ zeroize = { version = "^1", optional = true } aws-credential-types = { path = "../aws-credential-types", features = ["test-util", "hardcoded-credentials"] } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client", "test-util"] } bytes = "1" -criterion = "0.4" +criterion = "0.5" hex-literal = "0.4.1" httparse = "1.8" libfuzzer-sys = "0.4.6" diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml index e4b6af798a4..e5190ecb92e 100644 --- a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml +++ b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml @@ -10,7 +10,7 @@ aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "wiremock"] } -criterion = { version = "0.4", features = ["async_tokio"] } +criterion = { version = "0.5", features = ["async_tokio"] } http = "0.2.3" middleware-s3 = { version = "0.28", package = "aws-sdk-s3", features = ["test-util"] } middleware-smithy-client = { version = "0.55.3", package = "aws-smithy-client", features = ["test-util", "rustls"] } diff --git a/aws/sdk/integration-tests/dynamodb/Cargo.toml b/aws/sdk/integration-tests/dynamodb/Cargo.toml index 2a9d1725af9..68585bee90e 100644 --- a/aws/sdk/integration-tests/dynamodb/Cargo.toml +++ b/aws/sdk/integration-tests/dynamodb/Cargo.toml @@ -24,7 +24,7 @@ aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-ap aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types", features = ["test-util"]} aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1.0.0" -criterion = { version = "0.4.0" } +criterion = { version = "0.5.0" } futures-util = { version = "0.3.16", default-features = false } http = "0.2.0" serde_json = "1.0.0" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index aa5d3f51690..85bfc185930 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -245,7 +245,7 @@ data class CargoDependency( val Approx: CargoDependency = CargoDependency("approx", CratesIo("0.5.1"), DependencyScope.Dev) val AsyncStd: CargoDependency = CargoDependency("async-std", CratesIo("1.12.0"), DependencyScope.Dev) val AsyncStream: CargoDependency = CargoDependency("async-stream", CratesIo("0.3.0"), DependencyScope.Dev) - val Criterion: CargoDependency = CargoDependency("criterion", CratesIo("0.4.0"), DependencyScope.Dev) + val Criterion: CargoDependency = CargoDependency("criterion", CratesIo("0.5.0"), DependencyScope.Dev) val FuturesCore: CargoDependency = CargoDependency("futures-core", CratesIo("0.3.25"), DependencyScope.Dev) val FuturesUtil: CargoDependency = CargoDependency("futures-util", CratesIo("0.3.25"), DependencyScope.Dev, defaultFeatures = false) diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index ba4d59bb822..5a975278a9d 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -25,7 +25,7 @@ time = { version = "0.3.4", features = ["parsing"] } [dev-dependencies] base64 = "0.13.0" ciborium = { version = "0.2.1" } -criterion = "0.4" +criterion = "0.5" lazy_static = "1.4" proptest = "1" rand = "0.8.4" From 63ce3f951ea9631d47edaf4d3005be1993bfaa43 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 13 Oct 2023 11:49:54 -0700 Subject: [PATCH 176/331] Rename orchestrator traits to be verbs (#3065) This PR makes the orchestrator traits more idiomatic by making them verbs. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 25 ++++++++++++++- .../aws-config/src/imds/client.rs | 4 +-- .../aws-config/src/imds/client/token.rs | 10 +++--- .../src/apigateway_interceptors.rs | 4 +-- .../src/glacier_interceptors.rs | 8 ++--- .../src/http_request_checksum.rs | 4 +-- .../src/http_response_checksum.rs | 4 +-- .../src/presigning_interceptors.rs | 4 +-- .../src/route53_resource_id_preprocessor.rs | 4 +-- .../aws-runtime/src/auth/sigv4.rs | 6 ++-- .../aws-runtime/src/auth/sigv4a.rs | 6 ++-- aws/rust-runtime/aws-runtime/src/identity.rs | 4 +-- .../aws-runtime/src/invocation_id.rs | 6 ++-- .../aws-runtime/src/recursion_detection.rs | 4 +-- .../aws-runtime/src/request_info.rs | 6 ++-- .../aws-runtime/src/service_clock_skew.rs | 4 +-- .../aws-runtime/src/user_agent.rs | 6 ++-- .../s3/tests/interceptors.rs | 4 +-- .../s3/tests/request_information_headers.rs | 4 +-- .../customizations/HttpAuthDecorator.kt | 10 +++--- .../InterceptorConfigCustomization.kt | 10 +++--- .../EndpointParamsInterceptorGenerator.kt | 4 +-- .../ClientRuntimeTypesReExportGenerator.kt | 4 +-- .../client/CustomizableOperationGenerator.kt | 7 ++-- .../protocol/ProtocolTestGenerator.kt | 4 +-- .../protocol/RequestSerializerGenerator.kt | 4 +-- .../protocol/ResponseDeserializerGenerator.kt | 4 +-- .../MetadataCustomizationTest.kt | 4 +-- .../smithy/endpoint/EndpointsDecoratorTest.kt | 4 +-- .../generators/EndpointTraitBindingsTest.kt | 4 +-- .../protocol/ProtocolTestGeneratorTest.kt | 8 ++--- .../rust/codegen/core/smithy/RuntimeType.kt | 4 +-- design/src/client/identity_and_auth.md | 6 ++-- .../aws-smithy-runtime-api/src/client/auth.rs | 24 ++++++++------ .../src/client/auth/static_resolver.rs | 6 ++-- .../src/client/endpoint.rs | 15 +++++---- .../src/client/identity.rs | 15 +++++---- .../src/client/identity/http.rs | 6 ++-- .../src/client/interceptors.rs | 15 +++++---- .../src/client/runtime_components.rs | 32 +++++++++---------- .../src/client/ser_de.rs | 30 ++++++++++------- .../src/client/auth/http.rs | 18 +++++------ .../src/client/auth/no_auth.rs | 6 ++-- .../src/client/http/connection_poisoning.rs | 4 +-- .../src/client/identity/no_auth.rs | 4 +-- .../src/client/interceptors.rs | 14 ++++---- .../src/client/orchestrator.rs | 16 +++++----- .../src/client/orchestrator/auth.rs | 18 +++++------ .../src/client/orchestrator/endpoints.rs | 12 +++---- .../src/client/orchestrator/operation.rs | 10 +++--- .../src/client/test_util/deserializer.rs | 4 +-- .../src/client/test_util/serializer.rs | 6 ++-- .../src/client_http_checksum_required.rs | 4 +-- .../src/client_idempotency_token.rs | 4 +-- .../inlineable/src/http_checksum_required.rs | 2 +- 55 files changed, 251 insertions(+), 208 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8d6525eb8e6..b71e9a7820f 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -327,7 +327,7 @@ author = "Velfi" [[aws-sdk-rust]] message = "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively." references = ["smithy-rs#3055"] -meta = { "breaking" = true, "tada" = true, "bug" = true } +meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" [[smithy-rs]] @@ -355,3 +355,26 @@ message = "Lifetimes have been added to the `EndpointResolver` trait." references = ["smithy-rs#3061"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[aws-sdk-rust]] +message = """Several traits have been renamed from noun form to verb form to be more idiomatic: +- `EndpointResolver` -> `ResolveEndpoint` +- `Interceptor` -> `Intercept` +""" +references = ["smithy-rs#3065"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = """Several traits have been renamed from noun form to verb form to be more idiomatic: +- `AuthSchemeOptionResolver` -> `ResolveAuthSchemeOptions` +- `EndpointResolver` -> `ResolveEndpoint` +- `IdentityResolver` -> `ResolveIdentity` +- `Signer` -> `Sign` +- `RequestSerializer` -> `SerializeRequest` +- `ResponseDeserializer` -> `DeserializeResponse` +- `Interceptor` -> `Intercept` +""" +references = ["smithy-rs#3065"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index e4529929a45..3b3513f627c 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -20,7 +20,7 @@ use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; use aws_smithy_runtime_api::client::endpoint::{ - EndpointFuture, EndpointResolver, EndpointResolverParams, + EndpointFuture, EndpointResolverParams, ResolveEndpoint, }; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::{OrchestratorError, SensitiveOutput}; @@ -523,7 +523,7 @@ struct ImdsEndpointResolver { mode_override: Option, } -impl EndpointResolver for ImdsEndpointResolver { +impl ResolveEndpoint for ImdsEndpointResolver { fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> { EndpointFuture::new(async move { self.endpoint_source diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index f7e7f38e742..f0effea41c7 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -22,10 +22,10 @@ use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ - AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, }; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityFuture, IdentityResolver, SharedIdentityResolver, + Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver, }; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::runtime_components::{ @@ -191,7 +191,7 @@ fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::new(async { let preloaded_token = self @@ -240,7 +240,7 @@ impl AuthScheme for TokenAuthScheme { identity_resolvers.identity_resolver(IMDS_TOKEN_AUTH_SCHEME) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -248,7 +248,7 @@ impl AuthScheme for TokenAuthScheme { #[derive(Debug)] struct TokenSigner; -impl Signer for TokenSigner { +impl Sign for TokenSigner { fn sign_http_request( &self, request: &mut HttpRequest, diff --git a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs index 7dc1a687df4..c7eaad04c1a 100644 --- a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs @@ -7,7 +7,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use http::header::ACCEPT; @@ -17,7 +17,7 @@ use http::HeaderValue; #[derive(Debug, Default)] pub(crate) struct AcceptHeaderInterceptor; -impl Interceptor for AcceptHeaderInterceptor { +impl Intercept for AcceptHeaderInterceptor { fn name(&self) -> &'static str { "AcceptHeaderInterceptor" } diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 80cac6842d4..486815dede9 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -14,7 +14,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::orchestrator::LoadedRequestBody; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; @@ -65,7 +65,7 @@ impl GlacierAccountIdAutofillInterceptor { } } -impl Interceptor +impl Intercept for GlacierAccountIdAutofillInterceptor { fn name(&self) -> &'static str { @@ -100,7 +100,7 @@ impl GlacierApiVersionInterceptor { } } -impl Interceptor for GlacierApiVersionInterceptor { +impl Intercept for GlacierApiVersionInterceptor { fn name(&self) -> &'static str { "GlacierApiVersionInterceptor" } @@ -123,7 +123,7 @@ impl Interceptor for GlacierApiVersionInterceptor { #[derive(Debug, Default)] pub(crate) struct GlacierTreeHashHeaderInterceptor; -impl Interceptor for GlacierTreeHashHeaderInterceptor { +impl Intercept for GlacierTreeHashHeaderInterceptor { fn name(&self) -> &'static str { "GlacierTreeHashHeaderInterceptor" } diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index c6ce150e5bc..e7ad6b2c619 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -18,7 +18,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Input, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; @@ -75,7 +75,7 @@ impl RequestChecksumInterceptor { } } -impl Interceptor for RequestChecksumInterceptor +impl Intercept for RequestChecksumInterceptor where AP: Fn(&Input) -> Result, BoxError> + Send + Sync, { diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index 729eb97c4c2..a53213b6478 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -13,7 +13,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeDeserializationInterceptorContextMut, BeforeSerializationInterceptorContextRef, Input, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; @@ -52,7 +52,7 @@ impl ResponseChecksumInterceptor { } } -impl Interceptor for ResponseChecksumInterceptor +impl Intercept for ResponseChecksumInterceptor where VE: Fn(&Input) -> bool + Send + Sync, { diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs index a981abf0b1d..481a8d9cab4 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs @@ -19,7 +19,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::{ - disable_interceptor, Interceptor, SharedInterceptor, + disable_interceptor, Intercept, SharedInterceptor, }; use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::{ @@ -46,7 +46,7 @@ impl SigV4PresigningInterceptor { } } -impl Interceptor for SigV4PresigningInterceptor { +impl Intercept for SigV4PresigningInterceptor { fn name(&self) -> &'static str { "SigV4PresigningInterceptor" } diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs index 32fad6b160a..a1045139702 100644 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs +++ b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs @@ -7,7 +7,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::fmt; @@ -67,7 +67,7 @@ where } } -impl Interceptor for Route53ResourceIdInterceptor +impl Intercept for Route53ResourceIdInterceptor where G: for<'a> Fn(&'a mut T) -> &'a mut Option + Send + Sync, T: fmt::Debug + Send + Sync + 'static, diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index 16abeb95cc7..b6233621150 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -14,7 +14,7 @@ use aws_sigv4::http_request::{ use aws_sigv4::sign::v4; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, }; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -56,7 +56,7 @@ impl AuthScheme for SigV4AuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -142,7 +142,7 @@ impl SigV4Signer { } } -impl Signer for SigV4Signer { +impl Sign for SigV4Signer { fn sign_http_request( &self, request: &mut HttpRequest, diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs index daa6f3d42d7..a0f22780aae 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs @@ -11,7 +11,7 @@ use aws_sigv4::http_request::{sign, SignableBody, SignableRequest, SigningSettin use aws_sigv4::sign::v4a; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, }; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -53,7 +53,7 @@ impl AuthScheme for SigV4aAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -156,7 +156,7 @@ fn extract_endpoint_auth_scheme_signing_region_set( } } -impl Signer for SigV4aSigner { +impl Sign for SigV4aSigner { fn sign_http_request( &self, request: &mut HttpRequest, diff --git a/aws/rust-runtime/aws-runtime/src/identity.rs b/aws/rust-runtime/aws-runtime/src/identity.rs index fe79d17ef9b..d919a7d8a1b 100644 --- a/aws/rust-runtime/aws-runtime/src/identity.rs +++ b/aws/rust-runtime/aws-runtime/src/identity.rs @@ -6,7 +6,7 @@ /// Credentials-based identity support. pub mod credentials { use aws_credential_types::cache::SharedCredentialsCache; - use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, IdentityResolver}; + use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; use aws_smithy_types::config_bag::ConfigBag; /// Smithy identity resolver for AWS credentials. @@ -22,7 +22,7 @@ pub mod credentials { } } - impl IdentityResolver for CredentialsIdentityResolver { + impl ResolveIdentity for CredentialsIdentityResolver { fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { let cache = self.credentials_cache.clone(); IdentityFuture::new(async move { diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 7a8b47feb06..5f86517aa2f 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -5,7 +5,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use fastrand::Rng; @@ -92,7 +92,7 @@ impl InvocationIdInterceptor { } } -impl Interceptor for InvocationIdInterceptor { +impl Intercept for InvocationIdInterceptor { fn name(&self) -> &'static str { "InvocationIdInterceptor" } @@ -217,7 +217,7 @@ mod tests { use aws_smithy_runtime_api::client::interceptors::context::{ BeforeTransmitInterceptorContextMut, Input, InterceptorContext, }; - use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::ConfigBag; use http::HeaderValue; diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index 368843a865d..95de2a2b7b0 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -5,7 +5,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_types::os_shim_internal::Env; @@ -39,7 +39,7 @@ impl RecursionDetectionInterceptor { } } -impl Interceptor for RecursionDetectionInterceptor { +impl Intercept for RecursionDetectionInterceptor { fn name(&self) -> &'static str { "RecursionDetectionInterceptor" } diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index 04825141b3c..e0b4c912b14 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -7,7 +7,7 @@ use crate::service_clock_skew::ServiceClockSkew; use aws_smithy_async::time::TimeSource; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::retries::RequestAttempts; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; @@ -91,7 +91,7 @@ impl RequestInfoInterceptor { } } -impl Interceptor for RequestInfoInterceptor { +impl Intercept for RequestInfoInterceptor { fn name(&self) -> &'static str { "RequestInfoInterceptor" } @@ -182,7 +182,7 @@ mod tests { use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::Input; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; diff --git a/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs index a919f37cad1..16f138edb1f 100644 --- a/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs +++ b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs @@ -5,7 +5,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeDeserializationInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::date_time::Format; @@ -64,7 +64,7 @@ fn extract_time_sent_from_response( DateTime::from_str(date_header, Format::HttpDate).map_err(Into::into) } -impl Interceptor for ServiceClockSkewInterceptor { +impl Intercept for ServiceClockSkewInterceptor { fn name(&self) -> &'static str { "ServiceClockSkewInterceptor" } diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 1b6c3699809..5ef5e5ababc 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -6,7 +6,7 @@ use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_types::app_name::AppName; @@ -71,7 +71,7 @@ fn header_values( )) } -impl Interceptor for UserAgentInterceptor { +impl Intercept for UserAgentInterceptor { fn name(&self) -> &'static str { "UserAgentInterceptor" } @@ -115,7 +115,7 @@ mod tests { use super::*; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; - use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::error::display::DisplayErrorContext; diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs index 7263b6d200b..edae30719da 100644 --- a/aws/sdk/integration-tests/s3/tests/interceptors.rs +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -8,7 +8,7 @@ use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; use aws_smithy_runtime::client::http::test_util::capture_request; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::header::USER_AGENT; @@ -24,7 +24,7 @@ async fn interceptor_priority() { #[derive(Debug)] struct TestInterceptor(&'static str); - impl Interceptor for TestInterceptor { + impl Intercept for TestInterceptor { fn name(&self) -> &'static str { "TestInterceptor" } diff --git a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs index ab0e8d651d5..c0203093773 100644 --- a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -10,7 +10,7 @@ use aws_sdk_s3::config::interceptors::FinalizerInterceptorContextRef; use aws_sdk_s3::config::retry::RetryConfig; use aws_sdk_s3::config::timeout::TimeoutConfig; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::config::{Interceptor, SharedAsyncSleep}; +use aws_sdk_s3::config::{Intercept, SharedAsyncSleep}; use aws_sdk_s3::Client; use aws_smithy_async::test_util::InstantSleep; use aws_smithy_async::test_util::ManualTimeSource; @@ -36,7 +36,7 @@ async fn three_retries_and_then_success() { struct TimeInterceptor { time_source: ManualTimeSource, } - impl Interceptor for TimeInterceptor { + impl Intercept for TimeInterceptor { fn name(&self) -> &'static str { "TimeInterceptor" } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index 375a87a2e61..4f73d1d3767 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -48,7 +48,7 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> "HTTP_BASIC_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BASIC_AUTH_SCHEME_ID"), "HTTP_BEARER_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BEARER_AUTH_SCHEME_ID"), "HTTP_DIGEST_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_DIGEST_AUTH_SCHEME_ID"), - "IdentityResolver" to smithyRuntimeApi.resolve("client::identity::IdentityResolver"), + "ResolveIdentity" to smithyRuntimeApi.resolve("client::identity::ResolveIdentity"), "Login" to smithyRuntimeApi.resolve("client::identity::http::Login"), "SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"), "SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"), @@ -231,7 +231,7 @@ private class HttpAuthConfigCustomization( } /// Sets an API key resolver will be used for authentication. - pub fn api_key_resolver(mut self, api_key_resolver: impl #{IdentityResolver} + 'static) -> Self { + pub fn api_key_resolver(mut self, api_key_resolver: impl #{ResolveIdentity} + 'static) -> Self { self.runtime_components.push_identity_resolver( #{HTTP_API_KEY_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(api_key_resolver) @@ -251,7 +251,7 @@ private class HttpAuthConfigCustomization( } /// Sets a bearer token provider that will be used for HTTP bearer auth. - pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{IdentityResolver} + 'static) -> Self { + pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{ResolveIdentity} + 'static) -> Self { self.runtime_components.push_identity_resolver( #{HTTP_BEARER_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(bearer_token_resolver) @@ -271,7 +271,7 @@ private class HttpAuthConfigCustomization( } /// Sets a login resolver that will be used for HTTP basic auth. - pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{IdentityResolver} + 'static) -> Self { + pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self { self.runtime_components.push_identity_resolver( #{HTTP_BASIC_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(basic_auth_resolver) @@ -291,7 +291,7 @@ private class HttpAuthConfigCustomization( } /// Sets a login resolver that will be used for HTTP digest auth. - pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{IdentityResolver} + 'static) -> Self { + pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self { self.runtime_components.push_identity_resolver( #{HTTP_DIGEST_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(digest_auth_resolver) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index fd9c947a8c1..e6d48030f12 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -17,7 +17,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( - "Interceptor" to RuntimeType.interceptor(runtimeConfig), + "Intercept" to RuntimeType.intercept(runtimeConfig), "SharedInterceptor" to RuntimeType.sharedInterceptor(runtimeConfig), ) @@ -37,7 +37,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con ServiceConfig.BuilderImpl -> rustTemplate( """ - /// Add an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. + /// Add an [interceptor](#{Intercept}) that runs at specific stages of the request execution pipeline. /// /// Interceptors targeted at a certain stage are executed according to the pre-defined priority. /// The SDK provides a default set of interceptors. An interceptor configured by this method @@ -61,7 +61,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// /// ##[derive(Debug)] /// pub struct UriModifierInterceptor; - /// impl Interceptor for UriModifierInterceptor { + /// impl Intercept for UriModifierInterceptor { /// fn modify_before_signing( /// &self, /// context: &mut InterceptorContext, @@ -81,7 +81,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// ## } /// ## } /// ``` - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + 'static) -> Self { + pub fn interceptor(mut self, interceptor: impl #{Intercept} + 'static) -> Self { self.push_interceptor(#{SharedInterceptor}::new(interceptor)); self } @@ -111,7 +111,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// fn modify_request_uri(builder: &mut Builder) { /// ##[derive(Debug)] /// pub struct UriModifierInterceptor; - /// impl Interceptor for UriModifierInterceptor { + /// impl Intercept for UriModifierInterceptor { /// fn modify_before_signing( /// &self, /// context: &mut InterceptorContext, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index e7114433b4a..17e47c6570d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -54,7 +54,7 @@ class EndpointParamsInterceptorGenerator( "EndpointResolverParams" to runtimeApi.resolve("client::endpoint::EndpointResolverParams"), "HttpRequest" to orchestrator.resolve("HttpRequest"), "HttpResponse" to orchestrator.resolve("HttpResponse"), - "Interceptor" to RuntimeType.interceptor(rc), + "Intercept" to RuntimeType.intercept(rc), "InterceptorContext" to RuntimeType.interceptorContext(rc), "BeforeSerializationInterceptorContextRef" to RuntimeType.beforeSerializationInterceptorContextRef(rc), "Input" to interceptors.resolve("context::Input"), @@ -74,7 +74,7 @@ class EndpointParamsInterceptorGenerator( ##[derive(Debug)] struct $interceptorName; - impl #{Interceptor} for $interceptorName { + impl #{Intercept} for $interceptorName { fn name(&self) -> &'static str { ${interceptorName.dq()} } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 8177430bde2..09b6bd5fec9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -23,12 +23,12 @@ class ClientRuntimeTypesReExportGenerator( rustTemplate( """ pub use #{ConfigBag}; - pub use #{Interceptor}; + pub use #{Intercept}; pub use #{RuntimeComponents}; pub use #{SharedInterceptor}; """, "ConfigBag" to RuntimeType.configBag(rc), - "Interceptor" to RuntimeType.interceptor(rc), + "Intercept" to RuntimeType.intercept(rc), "RuntimeComponents" to RuntimeType.runtimeComponents(rc), "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 42c92d73029..2d1a086035f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -38,8 +38,7 @@ class CustomizableOperationGenerator( .resolve("client::orchestrator::HttpRequest"), "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), - "Interceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::interceptors::Interceptor"), + "Intercept" to RuntimeType.intercept(runtimeConfig), "MapRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) .resolve("client::interceptors::MapRequestInterceptor"), "MutateRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) @@ -85,13 +84,13 @@ class CustomizableOperationGenerator( } } - /// Adds an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. + /// Adds an [interceptor](#{Intercept}) that runs at specific stages of the request execution pipeline. /// /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`, /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood). /// The order in which those user-specified operation interceptors are invoked should not be relied upon /// as it is an implementation detail. - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + 'static) -> Self { + pub fn interceptor(mut self, interceptor: impl #{Intercept} + 'static) -> Self { self.interceptors.push(#{SharedInterceptor}::new(interceptor)); self } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 4a4f810789c..ee9315fa206 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -338,7 +338,7 @@ class DefaultProtocolTestGenerator( ) rustTemplate( """ - use #{ResponseDeserializer}; + use #{DeserializeResponse}; use #{RuntimePlugin}; let op = #{Operation}::new(); @@ -356,7 +356,7 @@ class DefaultProtocolTestGenerator( "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), - "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), + "DeserializeResponse" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::DeserializeResponse"), "RuntimePlugin" to RT.runtimePlugin(rc), "SdkBody" to RT.sdkBody(rc), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index a1e7b71e61d..b4c1284f7de 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -47,7 +47,7 @@ class RequestSerializerGenerator( "HttpRequestBuilder" to RuntimeType.HttpRequestBuilder, "Input" to interceptorContext.resolve("Input"), "operation" to RuntimeType.operationModule(codegenContext.runtimeConfig), - "RequestSerializer" to runtimeApi.resolve("client::ser_de::RequestSerializer"), + "SerializeRequest" to runtimeApi.resolve("client::ser_de::SerializeRequest"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), "HeaderSerializationSettings" to RuntimeType.forInlineDependency( InlineDependency.serializationSettings( @@ -66,7 +66,7 @@ class RequestSerializerGenerator( """ ##[derive(Debug)] struct $serializerName; - impl #{RequestSerializer} for $serializerName { + impl #{SerializeRequest} for $serializerName { ##[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)] fn serialize_input(&self, input: #{Input}, _cfg: &mut #{ConfigBag}) -> #{Result}<#{HttpRequest}, #{BoxError}> { let input = input.downcast::<#{ConcreteInput}>().expect("correct type"); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index 6a04bb0c4a9..84c5debffcb 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -44,7 +44,7 @@ class ResponseDeserializerGenerator( "Output" to interceptorContext.resolve("Output"), "OutputOrError" to interceptorContext.resolve("OutputOrError"), "OrchestratorError" to orchestrator.resolve("OrchestratorError"), - "ResponseDeserializer" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::ser_de::ResponseDeserializer"), + "DeserializeResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::ser_de::DeserializeResponse"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), "debug_span" to RuntimeType.Tracing.resolve("debug_span"), @@ -61,7 +61,7 @@ class ResponseDeserializerGenerator( """ ##[derive(Debug)] struct ${operationName}ResponseDeserializer; - impl #{ResponseDeserializer} for ${operationName}ResponseDeserializer { + impl #{DeserializeResponse} for ${operationName}ResponseDeserializer { #{deserialize_streaming} fn deserialize_nonstreaming(&self, response: &#{HttpResponse}) -> #{OutputOrError} { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index e959dd333a1..4bdb87dbdd1 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -40,7 +40,7 @@ class MetadataCustomizationTest { "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), "BoxError" to RuntimeType.boxError(runtimeConfig), "ConfigBag" to RuntimeType.configBag(runtimeConfig), - "Interceptor" to RuntimeType.interceptor(runtimeConfig), + "Intercept" to RuntimeType.intercept(runtimeConfig), "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), "capture_request" to RuntimeType.captureRequest(runtimeConfig), "RuntimeComponents" to RuntimeType.smithyRuntimeApi(runtimeConfig) @@ -57,7 +57,7 @@ class MetadataCustomizationTest { ::std::sync::Mutex<#{Option}<::std::sync::mpsc::Sender<(String, String)>>>, ); - impl #{Interceptor} for ExtractMetadataInterceptor { + impl #{Intercept} for ExtractMetadataInterceptor { fn name(&self) -> &'static str { "ExtractMetadataInterceptor" } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index d57272b1490..3ba4256577c 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -150,14 +150,14 @@ class EndpointsDecoratorTest { use std::time::Duration; use $moduleName::{ config::endpoint::Params, config::interceptors::BeforeTransmitInterceptorContextRef, - config::Interceptor, config::SharedAsyncSleep, Client, Config, + config::Intercept, config::SharedAsyncSleep, Client, Config, }; ##[derive(Clone, Debug, Default)] struct TestInterceptor { called: Arc, } - impl Interceptor for TestInterceptor { + impl Intercept for TestInterceptor { fn name(&self) -> &'static str { "TestInterceptor" } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index a6f699dae06..be5d38a0164 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -168,7 +168,7 @@ internal class EndpointTraitBindingsTest { use std::sync::{Arc, Mutex}; use $moduleName::{ config::interceptors::BeforeTransmitInterceptorContextRef, - config::Interceptor, + config::Intercept, error::DisplayErrorContext, {Client, Config}, }; @@ -178,7 +178,7 @@ internal class EndpointTraitBindingsTest { called: Arc, last_endpoint_prefix: Arc>>, } - impl Interceptor for TestInterceptor { + impl Intercept for TestInterceptor { fn name(&self) -> &'static str { "TestInterceptor" } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index af1dbd11c57..2841ad493fb 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -40,7 +40,7 @@ private class TestServiceRuntimePluginCustomization( { ##[derive(::std::fmt::Debug)] struct TestInterceptor; - impl #{Interceptor} for TestInterceptor { + impl #{Intercept} for TestInterceptor { fn name(&self) -> &'static str { "TestInterceptor" } @@ -71,7 +71,7 @@ private class TestServiceRuntimePluginCustomization( "BeforeTransmitInterceptorContextMut" to RT.beforeTransmitInterceptorContextMut(rc), "BoxError" to RT.boxError(rc), "ConfigBag" to RT.configBag(rc), - "Interceptor" to RT.interceptor(rc), + "Intercept" to RT.intercept(rc), "RuntimeComponents" to RT.runtimeComponents(rc), "SdkBody" to RT.sdkBody(rc), ) @@ -92,7 +92,7 @@ private class TestOperationCustomization( // Override the default response deserializer with our fake output ##[derive(::std::fmt::Debug)] struct TestDeser; - impl #{ResponseDeserializer} for TestDeser { + impl #{DeserializeResponse} for TestDeser { fn deserialize_nonstreaming( &self, _response: &#{HttpResponse}, @@ -114,7 +114,7 @@ private class TestOperationCustomization( "HttpResponse" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), "OrchestratorError" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::OrchestratorError"), "Output" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Output"), - "ResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::ResponseDeserializer"), + "DeserializeResponse" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::DeserializeResponse"), ) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index b3560584373..d583a7d163b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -357,8 +357,8 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun boxError(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("box_error::BoxError") - fun interceptor(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::Interceptor") + fun intercept(runtimeConfig: RuntimeConfig): RuntimeType = + smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::Intercept") fun interceptorContext(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::InterceptorContext") diff --git a/design/src/client/identity_and_auth.md b/design/src/client/identity_and_auth.md index d58efa19322..f7c69b6fd1e 100644 --- a/design/src/client/identity_and_auth.md +++ b/design/src/client/identity_and_auth.md @@ -44,7 +44,7 @@ First, let's establish the aspects of auth that can be configured from the model - **IdentityResolver:** resolves an identity for use in authentication. There can be multiple identity resolvers that need to be selected from. - **Signer:** a signing implementation that signs a HTTP request. - - **AuthSchemeOptionResolver:** resolves a list of auth scheme options for a given operation and its inputs. + - **ResolveAuthSchemeOptions:** resolves a list of auth scheme options for a given operation and its inputs. As it is undocumented (at time of writing), this document assumes that the code generator creates one service-level runtime plugin, and an operation-level runtime plugin per operation, hence @@ -61,7 +61,7 @@ At a high-level, the process of resolving an identity and signing a request look 1. Retrieve the `AuthSchemeOptionResolverParams` from the config bag. The `AuthSchemeOptionResolverParams` allow client config and operation inputs to play a role in which auth scheme option is selected. -2. Retrieve the `AuthSchemeOptionResolver` from the config bag, and use it to resolve the auth scheme options available +2. Retrieve the `ResolveAuthSchemeOptions` impl from the config bag, and use it to resolve the auth scheme options available with the `AuthSchemeOptionResolverParams`. The returned auth scheme options are in priority order. 3. Retrieve the `IdentityResolvers` list from the config bag. 4. For each auth scheme option: @@ -91,7 +91,7 @@ pub struct AuthSchemeId { scheme_id: &'static str, } -pub trait AuthSchemeOptionResolver: Send + Sync + Debug { +pub trait ResolveAuthSchemeOptions: Send + Sync + Debug { fn resolve_auth_scheme_options<'a>( &'a self, params: &AuthSchemeOptionResolverParams, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index d5e02b6da50..e6bb9c34405 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -80,6 +80,9 @@ impl Storable for AuthSchemeOptionResolverParams { type Storer = StoreReplace; } +#[deprecated(note = "Renamed to ResolveAuthSchemeOptions.")] +pub use ResolveAuthSchemeOptions as AuthSchemeOptionResolver; + /// Resolver for auth scheme options. /// /// The orchestrator needs to select an auth scheme to sign requests with, and potentially @@ -93,7 +96,7 @@ impl Storable for AuthSchemeOptionResolverParams { /// [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver), /// or it can be a complex code generated resolver that incorporates parameters from both /// the model and the resolved endpoint. -pub trait AuthSchemeOptionResolver: Send + Sync + fmt::Debug { +pub trait ResolveAuthSchemeOptions: Send + Sync + fmt::Debug { /// Returns a list of available auth scheme options to choose from. fn resolve_auth_scheme_options( &self, @@ -103,16 +106,16 @@ pub trait AuthSchemeOptionResolver: Send + Sync + fmt::Debug { /// A shared auth scheme option resolver. #[derive(Clone, Debug)] -pub struct SharedAuthSchemeOptionResolver(Arc); +pub struct SharedAuthSchemeOptionResolver(Arc); impl SharedAuthSchemeOptionResolver { /// Creates a new [`SharedAuthSchemeOptionResolver`]. - pub fn new(auth_scheme_option_resolver: impl AuthSchemeOptionResolver + 'static) -> Self { + pub fn new(auth_scheme_option_resolver: impl ResolveAuthSchemeOptions + 'static) -> Self { Self(Arc::new(auth_scheme_option_resolver)) } } -impl AuthSchemeOptionResolver for SharedAuthSchemeOptionResolver { +impl ResolveAuthSchemeOptions for SharedAuthSchemeOptionResolver { fn resolve_auth_scheme_options( &self, params: &AuthSchemeOptionResolverParams, @@ -123,7 +126,7 @@ impl AuthSchemeOptionResolver for SharedAuthSchemeOptionResolver { impl_shared_conversions!( convert SharedAuthSchemeOptionResolver - from AuthSchemeOptionResolver + from ResolveAuthSchemeOptions using SharedAuthSchemeOptionResolver::new ); @@ -135,7 +138,7 @@ pub trait AuthScheme: Send + Sync + fmt::Debug { /// Returns the unique identifier associated with this auth scheme. /// /// This identifier is used to refer to this auth scheme from the - /// [`AuthSchemeOptionResolver`], and is also associated with + /// [`ResolveAuthSchemeOptions`], and is also associated with /// identity resolvers in the config. fn scheme_id(&self) -> AuthSchemeId; @@ -153,7 +156,7 @@ pub trait AuthScheme: Send + Sync + fmt::Debug { ) -> Option; /// Returns the signing implementation for this auth scheme. - fn signer(&self) -> &dyn Signer; + fn signer(&self) -> &dyn Sign; } /// Container for a shared auth scheme implementation. @@ -179,15 +182,18 @@ impl AuthScheme for SharedAuthScheme { self.0.identity_resolver(identity_resolvers) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { self.0.signer() } } impl_shared_conversions!(convert SharedAuthScheme from AuthScheme using SharedAuthScheme::new); +#[deprecated(note = "Renamed to Sign.")] +pub use Sign as Signer; + /// Signing implementation for an auth scheme. -pub trait Signer: Send + Sync + fmt::Debug { +pub trait Sign: Send + Sync + fmt::Debug { /// Sign the given request with the given identity, components, and config. /// /// If the provided identity is incompatible with this signer, an error must be returned. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs index 23781e25457..46ee35aad48 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs @@ -4,10 +4,10 @@ */ use crate::box_error::BoxError; -use crate::client::auth::{AuthSchemeId, AuthSchemeOptionResolver, AuthSchemeOptionResolverParams}; +use crate::client::auth::{AuthSchemeId, AuthSchemeOptionResolverParams, ResolveAuthSchemeOptions}; use std::borrow::Cow; -/// New-type around a `Vec` that implements `AuthSchemeOptionResolver`. +/// New-type around a `Vec` that implements `ResolveAuthSchemeOptions`. #[derive(Debug)] pub struct StaticAuthSchemeOptionResolver { auth_scheme_options: Vec, @@ -22,7 +22,7 @@ impl StaticAuthSchemeOptionResolver { } } -impl AuthSchemeOptionResolver for StaticAuthSchemeOptionResolver { +impl ResolveAuthSchemeOptions for StaticAuthSchemeOptionResolver { fn resolve_auth_scheme_options( &self, _params: &AuthSchemeOptionResolverParams, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index 0790c164886..8c138075fa0 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -42,29 +42,32 @@ impl Storable for EndpointResolverParams { type Storer = StoreReplace; } +#[deprecated(note = "Renamed to ResolveEndpoint.")] +pub use ResolveEndpoint as EndpointResolver; + /// Configurable endpoint resolver implementation. -pub trait EndpointResolver: Send + Sync + fmt::Debug { +pub trait ResolveEndpoint: Send + Sync + fmt::Debug { /// Asynchronously resolves an endpoint to use from the given endpoint parameters. fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a>; } /// Shared endpoint resolver. /// -/// This is a simple shared ownership wrapper type for the [`EndpointResolver`] trait. +/// This is a simple shared ownership wrapper type for the [`ResolveEndpoint`] trait. #[derive(Clone, Debug)] -pub struct SharedEndpointResolver(Arc); +pub struct SharedEndpointResolver(Arc); impl SharedEndpointResolver { /// Creates a new [`SharedEndpointResolver`]. - pub fn new(endpoint_resolver: impl EndpointResolver + 'static) -> Self { + pub fn new(endpoint_resolver: impl ResolveEndpoint + 'static) -> Self { Self(Arc::new(endpoint_resolver)) } } -impl EndpointResolver for SharedEndpointResolver { +impl ResolveEndpoint for SharedEndpointResolver { fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> { self.0.resolve_endpoint(params) } } -impl_shared_conversions!(convert SharedEndpointResolver from EndpointResolver using SharedEndpointResolver::new); +impl_shared_conversions!(convert SharedEndpointResolver from ResolveEndpoint using SharedEndpointResolver::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index 6bc990d57df..828c15202c6 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -21,6 +21,9 @@ new_type_future! { pub struct IdentityFuture<'a, Identity, BoxError>; } +#[deprecated(note = "Renamed to ResolveIdentity.")] +pub use ResolveIdentity as IdentityResolver; + /// Resolver for identities. /// /// Every [`AuthScheme`](crate::client::auth::AuthScheme) has one or more compatible @@ -32,29 +35,29 @@ new_type_future! { /// resolves successfully, or it fails. The orchestrator will choose exactly one auth scheme /// to use, and thus, its chosen identity resolver is the only identity resolver that runs. /// There is no fallback to other auth schemes in the absence of an identity. -pub trait IdentityResolver: Send + Sync + Debug { +pub trait ResolveIdentity: Send + Sync + Debug { /// Asynchronously resolves an identity for a request using the given config. fn resolve_identity<'a>(&'a self, config_bag: &'a ConfigBag) -> IdentityFuture<'a>; } /// Container for a shared identity resolver. #[derive(Clone, Debug)] -pub struct SharedIdentityResolver(Arc); +pub struct SharedIdentityResolver(Arc); impl SharedIdentityResolver { /// Creates a new [`SharedIdentityResolver`] from the given resolver. - pub fn new(resolver: impl IdentityResolver + 'static) -> Self { + pub fn new(resolver: impl ResolveIdentity + 'static) -> Self { Self(Arc::new(resolver)) } } -impl IdentityResolver for SharedIdentityResolver { +impl ResolveIdentity for SharedIdentityResolver { fn resolve_identity<'a>(&'a self, config_bag: &'a ConfigBag) -> IdentityFuture<'a> { self.0.resolve_identity(config_bag) } } -impl_shared_conversions!(convert SharedIdentityResolver from IdentityResolver using SharedIdentityResolver::new); +impl_shared_conversions!(convert SharedIdentityResolver from ResolveIdentity using SharedIdentityResolver::new); /// An identity resolver paired with an auth scheme ID that it resolves for. #[derive(Clone, Debug)] @@ -89,7 +92,7 @@ impl ConfiguredIdentityResolver { /// An identity that can be used for authentication. /// /// The [`Identity`] is a container for any arbitrary identity data that may be used -/// by a [`Signer`](crate::client::auth::Signer) implementation. Under the hood, it +/// by a [`Sign`](crate::client::auth::Sign) implementation. Under the hood, it /// has an `Arc`, and it is the responsibility of the signer to downcast /// to the appropriate data type using the `data()` function. /// diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs index 1aca87a4a54..6f82e6e6ff5 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs @@ -5,7 +5,7 @@ //! Identity types for HTTP auth -use crate::client::identity::{Identity, IdentityFuture, IdentityResolver}; +use crate::client::identity::{Identity, IdentityFuture, ResolveIdentity}; use aws_smithy_types::config_bag::ConfigBag; use std::fmt::Debug; use std::sync::Arc; @@ -63,7 +63,7 @@ impl From for Token { } } -impl IdentityResolver for Token { +impl ResolveIdentity for Token { fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } @@ -122,7 +122,7 @@ impl Login { } } -impl IdentityResolver for Login { +impl ResolveIdentity for Login { fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 9a26fbb4062..2dc05f7bcf2 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -54,6 +54,9 @@ macro_rules! interceptor_trait_fn { }; } +#[deprecated(note = "Renamed to Intercept.")] +pub use Intercept as Interceptor; + /// An interceptor allows injecting code into the SDK ’s request execution pipeline. /// /// ## Terminology: @@ -64,7 +67,7 @@ macro_rules! interceptor_trait_fn { /// of the SDK ’s request execution pipeline. Hooks are either "read" hooks, which make it possible /// to read in-flight request or response messages, or "read/write" hooks, which make it possible /// to modify in-flight request or output messages. -pub trait Interceptor: fmt::Debug + Send + Sync { +pub trait Intercept: fmt::Debug + Send + Sync { /// The name of this interceptor, used in error messages for debugging. fn name(&self) -> &'static str; @@ -589,7 +592,7 @@ pub trait Interceptor: fmt::Debug + Send + Sync { /// Interceptor wrapper that may be shared #[derive(Clone)] pub struct SharedInterceptor { - interceptor: Arc, + interceptor: Arc, check_enabled: Arc bool + Send + Sync>, } @@ -603,7 +606,7 @@ impl fmt::Debug for SharedInterceptor { impl SharedInterceptor { /// Create a new `SharedInterceptor` from `Interceptor`. - pub fn new(interceptor: T) -> Self { + pub fn new(interceptor: T) -> Self { Self { interceptor: Arc::new(interceptor), check_enabled: Arc::new(|conf: &ConfigBag| { @@ -618,7 +621,7 @@ impl SharedInterceptor { } } -impl Interceptor for SharedInterceptor { +impl Intercept for SharedInterceptor { fn name(&self) -> &'static str { self.interceptor.name() } @@ -812,7 +815,7 @@ impl Interceptor for SharedInterceptor { } } -impl_shared_conversions!(convert SharedInterceptor from Interceptor using SharedInterceptor::new); +impl_shared_conversions!(convert SharedInterceptor from Intercept using SharedInterceptor::new); /// Generalized interceptor disabling interface /// @@ -833,7 +836,7 @@ where } /// Disable an interceptor with a given cause -pub fn disable_interceptor(cause: &'static str) -> DisableInterceptor { +pub fn disable_interceptor(cause: &'static str) -> DisableInterceptor { DisableInterceptor { _t: PhantomData::default(), cause, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 47c5ad5487e..e7e6ddf55ec 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -12,15 +12,15 @@ //! [`RuntimeComponents`](RuntimeComponents). use crate::client::auth::{ - AuthScheme, AuthSchemeId, AuthSchemeOptionResolver, SharedAuthScheme, + AuthScheme, AuthSchemeId, ResolveAuthSchemeOptions, SharedAuthScheme, SharedAuthSchemeOptionResolver, }; -use crate::client::endpoint::{EndpointResolver, SharedEndpointResolver}; +use crate::client::endpoint::{ResolveEndpoint, SharedEndpointResolver}; use crate::client::http::{HttpClient, SharedHttpClient}; use crate::client::identity::{ - ConfiguredIdentityResolver, IdentityResolver, SharedIdentityResolver, + ConfiguredIdentityResolver, ResolveIdentity, SharedIdentityResolver, }; -use crate::client::interceptors::{Interceptor, SharedInterceptor}; +use crate::client::interceptors::{Intercept, SharedInterceptor}; use crate::client::retries::classifiers::{ClassifyRetry, SharedRetryClassifier}; use crate::client::retries::{RetryStrategy, SharedRetryStrategy}; use crate::shared::IntoShared; @@ -278,7 +278,7 @@ impl RuntimeComponentsBuilder { /// Sets the auth scheme option resolver. pub fn set_auth_scheme_option_resolver( &mut self, - auth_scheme_option_resolver: Option, + auth_scheme_option_resolver: Option, ) -> &mut Self { self.auth_scheme_option_resolver = auth_scheme_option_resolver.map(|r| Tracked::new(self.builder_name, r.into_shared())); @@ -288,7 +288,7 @@ impl RuntimeComponentsBuilder { /// Sets the auth scheme option resolver. pub fn with_auth_scheme_option_resolver( mut self, - auth_scheme_option_resolver: Option, + auth_scheme_option_resolver: Option, ) -> Self { self.set_auth_scheme_option_resolver(auth_scheme_option_resolver); self @@ -319,7 +319,7 @@ impl RuntimeComponentsBuilder { /// Sets the endpoint resolver. pub fn set_endpoint_resolver( &mut self, - endpoint_resolver: Option, + endpoint_resolver: Option, ) -> &mut Self { self.endpoint_resolver = endpoint_resolver.map(|s| Tracked::new(self.builder_name, s.into_shared())); @@ -329,7 +329,7 @@ impl RuntimeComponentsBuilder { /// Sets the endpoint resolver. pub fn with_endpoint_resolver( mut self, - endpoint_resolver: Option, + endpoint_resolver: Option, ) -> Self { self.set_endpoint_resolver(endpoint_resolver); self @@ -357,7 +357,7 @@ impl RuntimeComponentsBuilder { pub fn push_identity_resolver( &mut self, scheme_id: AuthSchemeId, - identity_resolver: impl IdentityResolver + 'static, + identity_resolver: impl ResolveIdentity + 'static, ) -> &mut Self { self.identity_resolvers.push(Tracked::new( self.builder_name, @@ -370,7 +370,7 @@ impl RuntimeComponentsBuilder { pub fn with_identity_resolver( mut self, scheme_id: AuthSchemeId, - identity_resolver: impl IdentityResolver + 'static, + identity_resolver: impl ResolveIdentity + 'static, ) -> Self { self.push_identity_resolver(scheme_id, identity_resolver); self @@ -392,14 +392,14 @@ impl RuntimeComponentsBuilder { } /// Adds an interceptor. - pub fn push_interceptor(&mut self, interceptor: impl Interceptor + 'static) -> &mut Self { + pub fn push_interceptor(&mut self, interceptor: impl Intercept + 'static) -> &mut Self { self.interceptors .push(Tracked::new(self.builder_name, interceptor.into_shared())); self } /// Adds an interceptor. - pub fn with_interceptor(mut self, interceptor: impl Interceptor + 'static) -> Self { + pub fn with_interceptor(mut self, interceptor: impl Intercept + 'static) -> Self { self.push_interceptor(interceptor); self } @@ -554,7 +554,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeAuthSchemeOptionResolver; - impl AuthSchemeOptionResolver for FakeAuthSchemeOptionResolver { + impl ResolveAuthSchemeOptions for FakeAuthSchemeOptionResolver { fn resolve_auth_scheme_options( &self, _: &crate::client::auth::AuthSchemeOptionResolverParams, @@ -578,7 +578,7 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeEndpointResolver; - impl EndpointResolver for FakeEndpointResolver { + impl ResolveEndpoint for FakeEndpointResolver { fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> { unreachable!("fake endpoint resolver must be overridden for this test") } @@ -598,14 +598,14 @@ impl RuntimeComponentsBuilder { None } - fn signer(&self) -> &dyn crate::client::auth::Signer { + fn signer(&self) -> &dyn crate::client::auth::Sign { unreachable!("fake http auth scheme must be overridden for this test") } } #[derive(Debug)] struct FakeIdentityResolver; - impl IdentityResolver for FakeIdentityResolver { + impl ResolveIdentity for FakeIdentityResolver { fn resolve_identity<'a>(&'a self, _: &'a ConfigBag) -> IdentityFuture<'a> { unreachable!("fake identity resolver must be overridden for this test") } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs index 027b33a5fce..913113c4669 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs @@ -13,8 +13,11 @@ use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; use std::sync::Arc; +#[deprecated(note = "Renamed to SerializeRequest.")] +pub use SerializeRequest as RequestSerializer; + /// Serialization implementation that converts an [`Input`] into an [`HttpRequest`]. -pub trait RequestSerializer: Send + Sync + fmt::Debug { +pub trait SerializeRequest: Send + Sync + fmt::Debug { /// Serializes the input into an HTTP request. /// /// The type of the [`Input`] must be known ahead of time by the request serializer @@ -28,18 +31,18 @@ pub trait RequestSerializer: Send + Sync + fmt::Debug { /// A shared request serializer. /// -/// This is a simple shared ownership wrapper type for the [`RequestSerializer`] trait. +/// This is a simple shared ownership wrapper type for the [`SerializeRequest`] trait. #[derive(Clone, Debug)] -pub struct SharedRequestSerializer(Arc); +pub struct SharedRequestSerializer(Arc); impl SharedRequestSerializer { /// Creates a new shared request serializer. - pub fn new(serializer: impl RequestSerializer + 'static) -> Self { + pub fn new(serializer: impl SerializeRequest + 'static) -> Self { Self(Arc::new(serializer)) } } -impl RequestSerializer for SharedRequestSerializer { +impl SerializeRequest for SharedRequestSerializer { fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result { self.0.serialize_input(input, cfg) } @@ -49,10 +52,13 @@ impl Storable for SharedRequestSerializer { type Storer = StoreReplace; } -impl_shared_conversions!(convert SharedRequestSerializer from RequestSerializer using SharedRequestSerializer::new); +impl_shared_conversions!(convert SharedRequestSerializer from SerializeRequest using SharedRequestSerializer::new); + +#[deprecated(note = "Renamed to DeserializeResponse.")] +pub use DeserializeResponse as ResponseDeserializer; /// Deserialization implementation that converts an [`HttpResponse`] into an [`Output`] or [`Error`]. -pub trait ResponseDeserializer: Send + Sync + fmt::Debug { +pub trait DeserializeResponse: Send + Sync + fmt::Debug { /// For streaming requests, deserializes the response headers. /// /// The orchestrator will call `deserialize_streaming` first, and if it returns `None`, @@ -76,18 +82,18 @@ pub trait ResponseDeserializer: Send + Sync + fmt::Debug { /// Shared response deserializer. /// -/// This is a simple shared ownership wrapper type for the [`ResponseDeserializer`] trait. +/// This is a simple shared ownership wrapper type for the [`DeserializeResponse`] trait. #[derive(Debug)] -pub struct SharedResponseDeserializer(Arc); +pub struct SharedResponseDeserializer(Arc); impl SharedResponseDeserializer { /// Creates a new [`SharedResponseDeserializer`]. - pub fn new(serializer: impl ResponseDeserializer + 'static) -> Self { + pub fn new(serializer: impl DeserializeResponse + 'static) -> Self { Self(Arc::new(serializer)) } } -impl ResponseDeserializer for SharedResponseDeserializer { +impl DeserializeResponse for SharedResponseDeserializer { fn deserialize_nonstreaming( &self, response: &HttpResponse, @@ -107,4 +113,4 @@ impl Storable for SharedResponseDeserializer { type Storer = StoreReplace; } -impl_shared_conversions!(convert SharedResponseDeserializer from ResponseDeserializer using SharedResponseDeserializer::new); +impl_shared_conversions!(convert SharedResponseDeserializer from DeserializeResponse using SharedResponseDeserializer::new); diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 1e0efcd1c43..516c2e980a8 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -12,7 +12,7 @@ use aws_smithy_runtime_api::client::auth::http::{ HTTP_DIGEST_AUTH_SCHEME_ID, }; use aws_smithy_runtime_api::client::auth::{ - AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Signer, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, }; use aws_smithy_runtime_api::client::identity::http::{Login, Token}; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; @@ -67,7 +67,7 @@ impl AuthScheme for ApiKeyAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -79,7 +79,7 @@ struct ApiKeySigner { name: String, } -impl Signer for ApiKeySigner { +impl Sign for ApiKeySigner { fn sign_http_request( &self, request: &mut HttpRequest, @@ -138,7 +138,7 @@ impl AuthScheme for BasicAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -146,7 +146,7 @@ impl AuthScheme for BasicAuthScheme { #[derive(Debug, Default)] struct BasicAuthSigner; -impl Signer for BasicAuthSigner { +impl Sign for BasicAuthSigner { fn sign_http_request( &self, request: &mut HttpRequest, @@ -197,7 +197,7 @@ impl AuthScheme for BearerAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -205,7 +205,7 @@ impl AuthScheme for BearerAuthScheme { #[derive(Debug, Default)] struct BearerAuthSigner; -impl Signer for BearerAuthSigner { +impl Sign for BearerAuthSigner { fn sign_http_request( &self, request: &mut HttpRequest, @@ -254,7 +254,7 @@ impl AuthScheme for DigestAuthScheme { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -262,7 +262,7 @@ impl AuthScheme for DigestAuthScheme { #[derive(Debug, Default)] struct DigestAuthSigner; -impl Signer for DigestAuthSigner { +impl Sign for DigestAuthSigner { fn sign_http_request( &self, _request: &mut HttpRequest, diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs index f201cff5850..195bbd75c86 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs @@ -8,7 +8,7 @@ use crate::client::identity::no_auth::NoAuthIdentityResolver; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, SharedAuthScheme, Signer, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, SharedAuthScheme, Sign, }; use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -80,7 +80,7 @@ impl NoAuthScheme { #[derive(Debug, Default)] struct NoAuthSigner; -impl Signer for NoAuthSigner { +impl Sign for NoAuthSigner { fn sign_http_request( &self, _request: &mut HttpRequest, @@ -105,7 +105,7 @@ impl AuthScheme for NoAuthScheme { identity_resolvers.identity_resolver(NO_AUTH_SCHEME_ID) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index 99f8e67591a..3fa41fe3230 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -9,7 +9,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; @@ -43,7 +43,7 @@ impl ConnectionPoisoningInterceptor { } } -impl Interceptor for ConnectionPoisoningInterceptor { +impl Intercept for ConnectionPoisoningInterceptor { fn name(&self) -> &'static str { "ConnectionPoisoningInterceptor" } diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs index 3e72d6bd317..0d4a7f4a6ba 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, IdentityResolver}; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; use aws_smithy_types::config_bag::ConfigBag; /// Identity for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. @@ -28,7 +28,7 @@ impl NoAuthIdentityResolver { } } -impl IdentityResolver for NoAuthIdentityResolver { +impl ResolveIdentity for NoAuthIdentityResolver { fn resolve_identity<'a>(&'a self, _: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) } diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index 8dff23fcce8..0457f591225 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -13,7 +13,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ Error, Input, InterceptorContext, Output, }; use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorError, SharedInterceptor, + Intercept, InterceptorError, SharedInterceptor, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -271,7 +271,7 @@ where /// [`DisableInterceptor`](aws_smithy_runtime_api::client::interceptors::DisableInterceptor) struct ConditionallyEnabledInterceptor(SharedInterceptor); impl ConditionallyEnabledInterceptor { - fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { + fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Intercept> { if self.0.enabled(cfg) { Some(&self.0) } else { @@ -302,7 +302,7 @@ impl MapRequestInterceptor { } } -impl Interceptor for MapRequestInterceptor +impl Intercept for MapRequestInterceptor where F: Fn(HttpRequest) -> Result + Send + Sync + 'static, E: StdError + Send + Sync + 'static, @@ -344,7 +344,7 @@ impl MutateRequestInterceptor { } } -impl Interceptor for MutateRequestInterceptor +impl Intercept for MutateRequestInterceptor where F: Fn(&mut HttpRequest) + Send + Sync + 'static, { @@ -373,7 +373,7 @@ mod tests { BeforeTransmitInterceptorContextRef, Input, InterceptorContext, }; use aws_smithy_runtime_api::client::interceptors::{ - disable_interceptor, Interceptor, SharedInterceptor, + disable_interceptor, Intercept, SharedInterceptor, }; use aws_smithy_runtime_api::client::runtime_components::{ RuntimeComponents, RuntimeComponentsBuilder, @@ -382,7 +382,7 @@ mod tests { #[derive(Debug)] struct TestInterceptor; - impl Interceptor for TestInterceptor { + impl Intercept for TestInterceptor { fn name(&self) -> &'static str { "TestInterceptor" } @@ -392,7 +392,7 @@ mod tests { fn test_disable_interceptors() { #[derive(Debug)] struct PanicInterceptor; - impl Interceptor for PanicInterceptor { + impl Intercept for PanicInterceptor { fn name(&self) -> &'static str { "PanicInterceptor" } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 576eab5cf34..4be08b292ce 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -27,7 +27,7 @@ use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, Sh use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins; use aws_smithy_runtime_api::client::ser_de::{ - RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, + DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer, }; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::timeout::TimeoutConfig; @@ -464,7 +464,7 @@ mod tests { BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, }; - use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; + use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; @@ -564,7 +564,7 @@ mod tests { (__private $interceptor:ident, $ctx:ty, $expected:expr, $($rc_arg:tt)*) => { #[derive(Debug)] struct FailingInterceptorA; - impl Interceptor for FailingInterceptorA { + impl Intercept for FailingInterceptorA { fn name(&self) -> &'static str { "FailingInterceptorA" } fn $interceptor( @@ -580,7 +580,7 @@ mod tests { #[derive(Debug)] struct FailingInterceptorB; - impl Interceptor for FailingInterceptorB { + impl Intercept for FailingInterceptorB { fn name(&self) -> &'static str { "FailingInterceptorB" } fn $interceptor( @@ -596,7 +596,7 @@ mod tests { #[derive(Debug)] struct FailingInterceptorC; - impl Interceptor for FailingInterceptorC { + impl Intercept for FailingInterceptorC { fn name(&self) -> &'static str { "FailingInterceptorC" } fn $interceptor( @@ -877,7 +877,7 @@ mod tests { (__private $origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr, $($rc_arg:tt)*) => { #[derive(Debug)] struct OriginInterceptor; - impl Interceptor for OriginInterceptor { + impl Intercept for OriginInterceptor { fn name(&self) -> &'static str { "OriginInterceptor" } fn $origin_interceptor( @@ -893,7 +893,7 @@ mod tests { #[derive(Debug)] struct DestinationInterceptor; - impl Interceptor for DestinationInterceptor { + impl Intercept for DestinationInterceptor { fn name(&self) -> &'static str { "DestinationInterceptor" } fn $destination_interceptor( @@ -1211,7 +1211,7 @@ mod tests { inner: Arc, } - impl Interceptor for TestInterceptor { + impl Intercept for TestInterceptor { fn name(&self) -> &'static str { "TestInterceptor" } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 831e68c019e..3575f659808 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -6,10 +6,10 @@ use crate::client::auth::no_auth::NO_AUTH_SCHEME_ID; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOptionResolver, - AuthSchemeOptionResolverParams, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOptionResolverParams, + ResolveAuthSchemeOptions, }; -use aws_smithy_runtime_api::client::identity::IdentityResolver; +use aws_smithy_runtime_api::client::identity::ResolveIdentity; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; @@ -142,10 +142,10 @@ mod tests { use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ AuthScheme, AuthSchemeId, AuthSchemeOptionResolverParams, SharedAuthScheme, - SharedAuthSchemeOptionResolver, Signer, + SharedAuthSchemeOptionResolver, Sign, }; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityFuture, IdentityResolver, SharedIdentityResolver, + Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver, }; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -159,7 +159,7 @@ mod tests { async fn basic_case() { #[derive(Debug)] struct TestIdentityResolver; - impl IdentityResolver for TestIdentityResolver { + impl ResolveIdentity for TestIdentityResolver { fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) } @@ -168,7 +168,7 @@ mod tests { #[derive(Debug)] struct TestSigner; - impl Signer for TestSigner { + impl Sign for TestSigner { fn sign_http_request( &self, request: &mut HttpRequest, @@ -202,7 +202,7 @@ mod tests { identity_resolvers.identity_resolver(self.scheme_id()) } - fn signer(&self) -> &dyn Signer { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -261,7 +261,7 @@ mod tests { fn config_with_identity( scheme_id: AuthSchemeId, - identity: impl IdentityResolver + 'static, + identity: impl ResolveIdentity + 'static, ) -> (RuntimeComponents, ConfigBag) { let runtime_components = RuntimeComponentsBuilder::for_tests() .with_auth_scheme(SharedAuthScheme::new(BasicAuthScheme::new())) diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 2efbe331db3..5fd1b2bae7a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -5,12 +5,12 @@ use aws_smithy_http::endpoint::error::ResolveEndpointError; use aws_smithy_http::endpoint::{ - apply_endpoint as apply_endpoint_to_request_uri, EndpointPrefix, ResolveEndpoint, + apply_endpoint as apply_endpoint_to_request_uri, EndpointPrefix, ResolveEndpoint as _, SharedEndpointResolver, }; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::endpoint::{ - EndpointFuture, EndpointResolver, EndpointResolverParams, + EndpointFuture, EndpointResolverParams, ResolveEndpoint, }; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; @@ -45,7 +45,7 @@ impl StaticUriEndpointResolver { } } -impl EndpointResolver for StaticUriEndpointResolver { +impl ResolveEndpoint for StaticUriEndpointResolver { fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> { EndpointFuture::ready(Ok(Endpoint::builder() .url(self.endpoint.to_string()) @@ -70,9 +70,9 @@ impl From for EndpointResolverParams { } } -/// Default implementation of [`EndpointResolver`]. +/// Default implementation of [`ResolveEndpoint`]. /// -/// This default endpoint resolver implements the `EndpointResolver` trait by +/// This default endpoint resolver implements the `ResolveEndpoint` trait by /// converting the type-erased [`EndpointResolverParams`] into the concrete /// endpoint params for the service. It then delegates endpoint resolution /// to an underlying resolver that is aware of the concrete type. @@ -97,7 +97,7 @@ impl DefaultEndpointResolver { } } -impl EndpointResolver for DefaultEndpointResolver +impl ResolveEndpoint for DefaultEndpointResolver where Params: Debug + Send + Sync + 'static, { diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index cbc560402fc..a90674ab433 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -21,7 +21,7 @@ use aws_smithy_runtime_api::client::endpoint::{EndpointResolverParams, SharedEnd use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::client::identity::SharedIdentityResolver; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output}; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError}; use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; @@ -31,7 +31,7 @@ use aws_smithy_runtime_api::client::runtime_plugin::{ RuntimePlugin, RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin, }; use aws_smithy_runtime_api::client::ser_de::{ - RequestSerializer, ResponseDeserializer, SharedRequestSerializer, SharedResponseDeserializer, + DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer, }; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, Layer}; @@ -53,7 +53,7 @@ impl FnSerializer { } } } -impl RequestSerializer for FnSerializer +impl SerializeRequest for FnSerializer where F: Fn(I) -> Result + Send + Sync, I: fmt::Debug + Send + Sync + 'static, @@ -81,7 +81,7 @@ impl FnDeserializer { } } } -impl ResponseDeserializer for FnDeserializer +impl DeserializeResponse for FnDeserializer where F: Fn(&HttpResponse) -> Result> + Send + Sync, O: fmt::Debug + Send + Sync + 'static, @@ -261,7 +261,7 @@ impl OperationBuilder { self } - pub fn interceptor(mut self, interceptor: impl Interceptor + 'static) -> Self { + pub fn interceptor(mut self, interceptor: impl Intercept + 'static) -> Self { self.runtime_components.push_interceptor(interceptor); self } diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs index 4e83052d43c..547fc253193 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs @@ -6,7 +6,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{Error, Output}; use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedResponseDeserializer}; +use aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer}; use aws_smithy_types::config_bag::{FrozenLayer, Layer}; use std::sync::Mutex; @@ -32,7 +32,7 @@ impl CannedResponseDeserializer { } } -impl ResponseDeserializer for CannedResponseDeserializer { +impl DeserializeResponse for CannedResponseDeserializer { fn deserialize_nonstreaming( &self, _response: &HttpResponse, diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs index 573eea52935..b6cf8e737ff 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs @@ -7,11 +7,11 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::Input; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_runtime_api::client::ser_de::{RequestSerializer, SharedRequestSerializer}; +use aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer}; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use std::sync::Mutex; -/// Test [`RequestSerializer`] that returns a canned request. +/// Test [`SerializeRequest`] that returns a canned request. #[derive(Default, Debug)] pub struct CannedRequestSerializer { inner: Mutex>>, @@ -40,7 +40,7 @@ impl CannedRequestSerializer { } } -impl RequestSerializer for CannedRequestSerializer { +impl SerializeRequest for CannedRequestSerializer { fn serialize_input( &self, _input: Input, diff --git a/rust-runtime/inlineable/src/client_http_checksum_required.rs b/rust-runtime/inlineable/src/client_http_checksum_required.rs index 05de9601f8b..9336bd78898 100644 --- a/rust-runtime/inlineable/src/client_http_checksum_required.rs +++ b/rust-runtime/inlineable/src/client_http_checksum_required.rs @@ -5,7 +5,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; +use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; use aws_smithy_runtime_api::client::runtime_components::{ RuntimeComponents, RuntimeComponentsBuilder, }; @@ -41,7 +41,7 @@ impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { #[derive(Debug)] struct HttpChecksumRequiredInterceptor; -impl Interceptor for HttpChecksumRequiredInterceptor { +impl Intercept for HttpChecksumRequiredInterceptor { fn name(&self) -> &'static str { "HttpChecksumRequiredInterceptor" } diff --git a/rust-runtime/inlineable/src/client_idempotency_token.rs b/rust-runtime/inlineable/src/client_idempotency_token.rs index 31768d68e86..6d857471f75 100644 --- a/rust-runtime/inlineable/src/client_idempotency_token.rs +++ b/rust-runtime/inlineable/src/client_idempotency_token.rs @@ -8,7 +8,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, Input, }; -use aws_smithy_runtime_api::client::interceptors::{Interceptor, SharedInterceptor}; +use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; use aws_smithy_runtime_api::client::runtime_components::{ RuntimeComponents, RuntimeComponentsBuilder, }; @@ -55,7 +55,7 @@ impl fmt::Debug for IdempotencyTokenInterceptor { } } -impl Interceptor for IdempotencyTokenInterceptor +impl Intercept for IdempotencyTokenInterceptor where S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync, { diff --git a/rust-runtime/inlineable/src/http_checksum_required.rs b/rust-runtime/inlineable/src/http_checksum_required.rs index 636016a3fc1..bf0d17dc0db 100644 --- a/rust-runtime/inlineable/src/http_checksum_required.rs +++ b/rust-runtime/inlineable/src/http_checksum_required.rs @@ -25,7 +25,7 @@ impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { #[derive(Debug)] struct HttpChecksumRequiredInterceptor; -impl Interceptor for HttpChecksumRequiredInterceptor { +impl Intercept for HttpChecksumRequiredInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, From 684605ae4e6b180055d3640ddc435575d4b0973e Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 13 Oct 2023 20:57:14 -0400 Subject: [PATCH 177/331] Http updates (#3059) ## Motivation and Context - [ ] Upgrade guidance - [x] changelog To allow seamless adoption of the incoming `http` crate, we're updating our client crates to use an intermediate type. ## Description Update _client_ code to use `HttpRequest`. Some internal code still uses `http::Request` but those usages are limited. ## Testing CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 14 +- .../src/http_credential_provider.rs | 6 +- .../aws-config/src/imds/client.rs | 19 ++- .../aws-config/src/imds/client/token.rs | 4 +- .../aws-config/src/sts/assume_role.rs | 12 +- .../aws-inlineable/external-types.toml | 1 + .../src/glacier_interceptors.rs | 44 +++-- .../src/http_request_checksum.rs | 34 ++-- .../src/http_response_checksum.rs | 2 +- .../aws-inlineable/src/presigning.rs | 42 ++--- aws/rust-runtime/aws-runtime/src/auth.rs | 25 ++- .../aws-runtime/src/auth/sigv4.rs | 15 +- .../aws-runtime/src/auth/sigv4a.rs | 15 +- .../aws-runtime/src/invocation_id.rs | 26 +-- .../aws-runtime/src/recursion_detection.rs | 10 +- .../aws-runtime/src/request_info.rs | 6 +- .../aws-runtime/src/user_agent.rs | 6 +- .../smithy/rustsdk/AwsPresigningDecorator.kt | 2 +- .../rustsdk/EndpointsCredentialsTest.kt | 4 +- .../dynamodb/tests/movies.rs | 4 +- .../retries-with-client-rate-limiting.rs | 4 +- .../glacier/tests/custom-headers.rs | 4 +- .../kms/tests/integration.rs | 2 +- .../polly/tests/presigning.rs | 7 +- .../qldbsession/tests/integration.rs | 2 + .../integration-tests/s3/tests/checksums.rs | 13 +- .../s3/tests/customizable-operation.rs | 2 +- .../integration-tests/s3/tests/endpoints.rs | 22 +-- .../s3/tests/ignore-invalid-xml-body-root.rs | 4 +- .../s3/tests/interceptors.rs | 6 +- .../s3/tests/naughty-string-metadata.rs | 9 +- .../s3/tests/normalize-uri-path.rs | 4 +- .../integration-tests/s3/tests/presigning.rs | 33 ++-- .../query-strings-are-correctly-encoded.rs | 6 +- .../s3/tests/recursion-detection.rs | 3 +- .../integration-tests/s3/tests/signing-it.rs | 2 + .../integration-tests/s3control/Cargo.toml | 4 + .../integration-tests/webassembly/src/http.rs | 2 +- .../protocol/ProtocolTestGenerator.kt | 58 +------ .../protocol/RequestSerializerGenerator.kt | 2 +- .../protocol/ProtocolTestGeneratorTest.kt | 2 +- .../smithy/rust/codegen/core/util/Strings.kt | 2 +- .../protocol/ServerProtocolTestGenerator.kt | 8 +- design/src/rfcs/rfc0037_http_wrapper.md | 4 +- examples/pokemon-service-common/src/lib.rs | 2 + .../tests/plugins_execution_order.rs | 2 +- .../src/body/calculate.rs | 2 +- rust-runtime/aws-smithy-checksums/src/http.rs | Bin 8035 -> 7314 bytes rust-runtime/aws-smithy-checksums/src/lib.rs | 10 +- .../aws-smithy-http/src/query_writer.rs | 6 + .../aws-smithy-protocol-test/Cargo.toml | 1 + .../aws-smithy-protocol-test/src/lib.rs | 157 ++++++++++-------- .../src/client/http/request.rs | 100 ++++++++--- .../src/client/interceptors/context.rs | 54 +++--- .../src/client/orchestrator.rs | 2 +- .../src/client/runtime_plugin.rs | 8 +- .../src/client/auth/http.rs | 42 +++-- .../src/client/http/connection_poisoning.rs | 3 +- .../src/client/http/hyper_014.rs | 28 +--- .../src/client/http/test_util/dvr.rs | 30 +++- .../src/client/http/test_util/dvr/replay.rs | 8 +- .../src/client/http/test_util/infallible.rs | 2 +- .../src/client/http/test_util/never.rs | 8 +- .../src/client/http/test_util/replay.rs | 20 ++- .../src/client/orchestrator.rs | 8 +- .../src/client/orchestrator/auth.rs | 9 +- .../src/client/orchestrator/endpoints.rs | 68 ++++++-- .../src/client/orchestrator/operation.rs | 14 +- .../tests/reconnect_on_transient_error.rs | 2 + .../src/client_http_checksum_required.rs | 13 +- ...check-aws-sdk-standalone-integration-tests | 2 +- tools/ci-scripts/check-rust-runtimes | 3 + 72 files changed, 602 insertions(+), 498 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b71e9a7820f..120add9bb88 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -64,7 +64,7 @@ Support for Smithy IDLv2 nullability is now enabled by default. You can maintain For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929). """ references = ["smithy-rs#2916", "smithy-rs#1767"] -meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client"} +meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } author = "Velfi" [[aws-sdk-rust]] @@ -378,3 +378,15 @@ message = """Several traits have been renamed from noun form to verb form to be references = ["smithy-rs#3065"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = "**This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3067)**. A summary is below.

The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`." +references = ["smithy-rs#3059"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" + +[[aws-sdk-rust]] +message = "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`." +references = ["smithy-rs#3059"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index c3f69208f21..e6dc79bd247 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -135,7 +135,11 @@ impl Builder { if let Some(auth) = input.auth { http_req = http_req.header(AUTHORIZATION, auth); } - Ok(http_req.body(SdkBody::empty()).expect("valid request")) + Ok(http_req + .body(SdkBody::empty()) + .expect("valid request") + .try_into() + .unwrap()) }) .deserializer(move |response| parse_response(provider_name, response)) .build(); diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 3b3513f627c..e63908da3a1 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -23,7 +23,9 @@ use aws_smithy_runtime_api::client::endpoint::{ EndpointFuture, EndpointResolverParams, ResolveEndpoint, }; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::{OrchestratorError, SensitiveOutput}; +use aws_smithy_runtime_api::client::orchestrator::{ + HttpRequest, OrchestratorError, SensitiveOutput, +}; use aws_smithy_runtime_api::client::retries::classifiers::{ ClassifyRetry, RetryAction, SharedRetryClassifier, }; @@ -435,10 +437,13 @@ impl Builder { )) .with_connection_poisoning() .serializer(|path| { - Ok(http::Request::builder() - .uri(path) - .body(SdkBody::empty()) - .expect("valid request")) + Ok(HttpRequest::try_from( + http::Request::builder() + .uri(path) + .body(SdkBody::empty()) + .expect("valid request"), + ) + .unwrap()) }) .deserializer(|response| { if response.status().is_success() { @@ -626,6 +631,8 @@ pub(crate) mod test { .method("PUT") .body(SdkBody::empty()) .unwrap() + .try_into() + .unwrap() } pub(crate) fn token_response(ttl: u32, token: &'static str) -> HttpResponse { @@ -643,6 +650,8 @@ pub(crate) mod test { .header("x-aws-ec2-metadata-token", token) .body(SdkBody::empty()) .unwrap() + .try_into() + .unwrap() } pub(crate) fn imds_response(body: &'static str) -> HttpResponse { diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index f0effea41c7..f5b609b9413 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -137,7 +137,9 @@ impl TokenResolver { .uri(Uri::from_static("/latest/api/token")) .header(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS, token_ttl.as_secs()) .body(SdkBody::empty()) - .expect("valid HTTP request")) + .expect("valid HTTP request") + .try_into() + .unwrap()) }) .deserializer({ let time_source = time_source.clone(); diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index b6b61ba714b..84c60c9a963 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -383,7 +383,7 @@ mod test { let req = request.expect_request(); let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap(); assert!(str_body.contains("1234567"), "{}", str_body); - assert_eq!(req.uri(), "https://sts.us-east-1.amazonaws.com"); + assert_eq!(req.uri(), "https://sts.us-east-1.amazonaws.com/"); } #[tokio::test] @@ -411,7 +411,7 @@ mod test { .await; let _ = dbg!(provider.provide_credentials().await); let req = request.expect_request(); - assert_eq!(req.uri(), "https://sts.us-west-2.amazonaws.com"); + assert_eq!(req.uri(), "https://sts.us-west-2.amazonaws.com/"); } /// Test that `build()` where no provider is passed still works @@ -442,13 +442,7 @@ mod test { .await; let _ = provider.provide_credentials().await; let req = request.expect_request(); - let auth_header = req - .headers() - .get(AUTHORIZATION) - .unwrap() - .to_str() - .unwrap() - .to_string(); + let auth_header = req.headers().get(AUTHORIZATION).unwrap().to_string(); let expect = "Credential=123-key/20090213/us-west-17/sts/aws4_request"; assert!( auth_header.contains(expect), diff --git a/aws/rust-runtime/aws-inlineable/external-types.toml b/aws/rust-runtime/aws-inlineable/external-types.toml index 0d2b9f397ca..62904a6e4c4 100644 --- a/aws/rust-runtime/aws-inlineable/external-types.toml +++ b/aws/rust-runtime/aws-inlineable/external-types.toml @@ -1,6 +1,7 @@ allowed_external_types = [ "aws_credential_types::provider::ProvideCredentials", "aws_smithy_http::*", + "aws_smithy_runtime_api::*", "http::error::Error", "http::header::map::HeaderMap", diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 486815dede9..7cb27aaa1b6 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -6,24 +6,25 @@ // This code is referenced in generated code, so the compiler doesn't realize it is used. #![allow(dead_code)] +use std::fmt; +use std::marker::PhantomData; + +use bytes::Bytes; +use http::header::HeaderValue; +use ring::digest::{Context, Digest, SHA256}; + use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::Intercept; -use aws_smithy_runtime_api::client::orchestrator::LoadedRequestBody; + +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, LoadedRequestBody}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; -use bytes::Bytes; -use http::header::{HeaderName, HeaderValue}; -use http::Request; -use ring::digest::{Context, Digest, SHA256}; -use std::fmt; -use std::marker::PhantomData; /// The default account ID when none is set on an input const DEFAULT_ACCOUNT_ID: &str = "-"; @@ -182,23 +183,19 @@ impl Intercept for GlacierTreeHashHeaderInterceptor { /// /// See for more information. fn add_checksum_treehash( - request: &mut Request, + request: &mut HttpRequest, body: &Bytes, ) -> Result { let (full_body, hashes) = compute_hashes(body, MEGABYTE)?; let tree_hash = hex::encode(compute_hash_tree(hashes)); let complete_hash = hex::encode(full_body); if !request.headers().contains_key(TREE_HASH_HEADER) { - request.headers_mut().insert( - HeaderName::from_static(TREE_HASH_HEADER), - tree_hash.parse().expect("hash must be valid header"), - ); + request.headers_mut().insert(TREE_HASH_HEADER, tree_hash); } if !request.headers().contains_key(X_AMZ_CONTENT_SHA256) { - request.headers_mut().insert( - HeaderName::from_static(X_AMZ_CONTENT_SHA256), - complete_hash.parse().expect("hash must be valid header"), - ); + request + .headers_mut() + .insert(X_AMZ_CONTENT_SHA256, complete_hash.clone()); } Ok(complete_hash) } @@ -251,10 +248,11 @@ fn compute_hash_tree(mut hashes: Vec) -> Digest { #[cfg(test)] mod account_id_autofill_tests { - use super::*; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use super::*; + #[test] fn autofill_account_id() { #[derive(Debug)] @@ -290,16 +288,17 @@ mod account_id_autofill_tests { #[cfg(test)] mod api_version_tests { - use super::*; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use super::*; + #[test] fn api_version_interceptor() { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); let mut context = InterceptorContext::new(Input::doesnt_matter()); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); let mut context = BeforeTransmitInterceptorContextMut::from(&mut context); let interceptor = GlacierApiVersionInterceptor::new("some-version"); @@ -393,10 +392,7 @@ mod treehash_checksum_tests { } let test_data = Bytes::from(test_data); - let mut http_req = http::Request::builder() - .uri("http://example.com/hello") - .body(SdkBody::taken()) // the body isn't used by add_checksum_treehash - .unwrap(); + let mut http_req = HttpRequest::empty(); add_checksum_treehash(&mut http_req, &test_data).expect("should succeed"); // hash value verified with AWS CLI diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index e7ad6b2c619..3dc9cd449dd 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -19,6 +19,8 @@ use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Input, }; use aws_smithy_runtime_api::client::interceptors::Intercept; + +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; @@ -121,7 +123,7 @@ where } fn add_checksum_for_request_body( - request: &mut http::request::Request, + request: &mut HttpRequest, checksum_algorithm: ChecksumAlgorithm, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { @@ -151,7 +153,7 @@ fn add_checksum_for_request_body( } fn wrap_streaming_request_body_in_checksum_calculating_body( - request: &mut http::request::Request, + request: &mut HttpRequest, checksum_algorithm: ChecksumAlgorithm, ) -> Result<(), BuildError> { let original_body_size = request @@ -185,8 +187,7 @@ fn wrap_streaming_request_body_in_checksum_calculating_body( headers.insert( http::header::HeaderName::from_static("x-amz-trailer"), - // Convert into a `HeaderName` and then into a `HeaderValue` - http::header::HeaderName::from(checksum_algorithm).into(), + checksum_algorithm.into_impl().header_name(), ); headers.insert( @@ -215,6 +216,7 @@ mod tests { use aws_smithy_checksums::ChecksumAlgorithm; use aws_smithy_http::body::SdkBody; use aws_smithy_http::byte_stream::ByteStream; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_types::base64; use bytes::BytesMut; use http_body::Body; @@ -224,8 +226,10 @@ mod tests { async fn test_checksum_body_is_retryable() { let input_text = "Hello world"; let chunk_len_hex = format!("{:X}", input_text.len()); - let mut request = http::Request::builder() + let mut request: HttpRequest = http::Request::builder() .body(SdkBody::retryable(move || SdkBody::from(input_text))) + .unwrap() + .try_into() .unwrap(); // ensure original SdkBody is retryable @@ -265,17 +269,15 @@ mod tests { } let crc32c_checksum = crc32c_checksum.finalize(); - let mut request = http::Request::builder() - .body( - ByteStream::read_from() - .path(&file) - .buffer_size(1024) - .build() - .await - .unwrap() - .into_inner(), - ) - .unwrap(); + let mut request = HttpRequest::new( + ByteStream::read_from() + .path(&file) + .buffer_size(1024) + .build() + .await + .unwrap() + .into_inner(), + ); // ensure original SdkBody is retryable assert!(request.body().try_clone().is_some()); diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index a53213b6478..e9663b1deca 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -155,7 +155,7 @@ pub(crate) fn check_headers_for_precalculated_checksum( "CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER only contains valid checksum algorithm names", ); if let Some(precalculated_checksum) = - headers.get(http::HeaderName::from(checksum_algorithm)) + headers.get(checksum_algorithm.into_impl().header_name()) { let base64_encoded_precalculated_checksum = precalculated_checksum .to_str() diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index f2fa01c2c5a..b4569ce3407 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -12,6 +12,8 @@ //! //! Only operations that support presigning have the `presigned()` method on them. +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use std::fmt; use std::time::{Duration, SystemTime}; @@ -168,62 +170,46 @@ impl PresigningConfigBuilder { /// /// **This struct has conversion convenience functions:** /// -/// - [`PresignedRequest::to_http_request`][Self::to_http_request] returns an [`http::Request`](https://docs.rs/http/0.2.6/http/request/struct.Request.html) +/// - [`PresignedRequest::to_http_02x_request`][Self::to_http_02x_request] returns an [`http::Request`](https://docs.rs/http/0.2.6/http/request/struct.Request.html) /// - [`PresignedRequest::into`](#impl-From) returns an [`http::request::Builder`](https://docs.rs/http/0.2.6/http/request/struct.Builder.html) #[non_exhaustive] -pub struct PresignedRequest(http::Request<()>); +pub struct PresignedRequest(HttpRequest); impl PresignedRequest { #[allow(dead_code)] - pub(crate) fn new(inner: http::Request<()>) -> Self { + pub(crate) fn new(inner: HttpRequest) -> Self { Self(inner) } /// Returns the HTTP request method. - pub fn method(&self) -> &http::Method { + pub fn method(&self) -> &str { self.0.method() } /// Returns the HTTP request URI. - pub fn uri(&self) -> &http::Uri { + pub fn uri(&self) -> &str { self.0.uri() } /// Returns any HTTP headers that need to go along with the request, except for `Host`, /// which should be sent based on the endpoint in the URI by the HTTP client rather than /// added directly. - pub fn headers(&self) -> &http::HeaderMap { - self.0.headers() + pub fn headers(&self) -> impl Iterator { + self.0.headers().iter() } /// Given a body, convert this `PresignedRequest` into an `http::Request` - pub fn to_http_request(self, body: B) -> Result, http::Error> { - let builder: http::request::Builder = self.into(); - - builder.body(body) + pub fn to_http_02x_request(self, body: B) -> Result, BoxError> { + Ok(self.0.into_http02x()?.map(|_req| body)) } } impl fmt::Debug for PresignedRequest { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("PresignedRequest") - .field("method", self.method()) - .field("uri", self.uri()) - .field("headers", self.headers()) + .field("method", &self.method()) + .field("uri", &self.uri()) + .field("headers", self.0.headers()) .finish() } } - -impl From for http::request::Builder { - fn from(req: PresignedRequest) -> Self { - let mut builder = http::request::Builder::new() - .uri(req.uri()) - .method(req.method()); - - if let Some(headers) = builder.headers_mut() { - *headers = req.headers().clone(); - } - - builder - } -} diff --git a/aws/rust-runtime/aws-runtime/src/auth.rs b/aws/rust-runtime/aws-runtime/src/auth.rs index 74577888fa8..6b1ecef2bf0 100644 --- a/aws/rust-runtime/aws-runtime/src/auth.rs +++ b/aws/rust-runtime/aws-runtime/src/auth.rs @@ -5,10 +5,12 @@ use aws_sigv4::http_request::{ PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableBody, SignatureLocation, - SigningSettings, UriPathNormalizationMode, + SigningInstructions, SigningSettings, UriPathNormalizationMode, }; +use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; use aws_smithy_runtime_api::client::identity::Identity; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::Document; use aws_types::region::{Region, SigningRegion, SigningRegionSet}; @@ -196,3 +198,24 @@ fn extract_field_from_endpoint_config<'a>( .and_then(Document::as_object) .and_then(|config| config.get(field_name)) } + +fn apply_signing_instructions( + instructions: SigningInstructions, + request: &mut HttpRequest, +) -> Result<(), BoxError> { + let (new_headers, new_query) = instructions.into_parts(); + for header in new_headers.into_iter() { + let mut value = http::HeaderValue::from_str(header.value()).unwrap(); + value.set_sensitive(header.sensitive()); + request.headers_mut().insert(header.name(), value); + } + + if !new_query.is_empty() { + let mut query = aws_smithy_http::query_writer::QueryWriter::new_from_string(request.uri())?; + for (name, value) in new_query { + query.insert(name, &value); + } + request.set_uri(query.build_uri())?; + } + Ok(()) +} diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index b6233621150..4c6b7d6bec5 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::auth; use crate::auth::{ extract_endpoint_auth_scheme_signing_name, extract_endpoint_auth_scheme_signing_region, SigV4OperationSigningConfig, SigV4SigningError, @@ -182,15 +183,9 @@ impl Sign for SigV4Signer { }); let signable_request = SignableRequest::new( - request.method().as_str(), - request.uri().to_string(), - request.headers().iter().map(|(k, v)| { - ( - k.as_str(), - // use from_utf8 instead of to_str because we _do_ allow non-ascii header values - std::str::from_utf8(v.as_bytes()).expect("only utf-8 headers are signable"), - ) - }), + request.method(), + request.uri(), + request.headers().iter(), signable_body, )?; sign(signable_request, &SigningParams::V4(signing_params))? @@ -218,7 +213,7 @@ impl Sign for SigV4Signer { .expect("failed to send deferred signer"); } } - signing_instructions.apply_to_request(request); + auth::apply_signing_instructions(signing_instructions, request)?; Ok(()) } } diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs index a0f22780aae..e5fd8794740 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs @@ -4,7 +4,8 @@ */ use crate::auth::{ - extract_endpoint_auth_scheme_signing_name, SigV4OperationSigningConfig, SigV4SigningError, + apply_signing_instructions, extract_endpoint_auth_scheme_signing_name, + SigV4OperationSigningConfig, SigV4SigningError, }; use aws_credential_types::Credentials; use aws_sigv4::http_request::{sign, SignableBody, SignableRequest, SigningSettings}; @@ -196,22 +197,16 @@ impl Sign for SigV4aSigner { }); let signable_request = SignableRequest::new( - request.method().as_str(), + request.method(), request.uri().to_string(), - request.headers().iter().map(|(k, v)| { - ( - k.as_str(), - // use from_utf8 instead of to_str because we _do_ allow non-ascii header values - std::str::from_utf8(v.as_bytes()).expect("only utf-8 headers are signable"), - ) - }), + request.headers().iter(), signable_body, )?; sign(signable_request, &signing_params.into())? } .into_parts(); - signing_instructions.apply_to_request(request); + apply_signing_instructions(signing_instructions, request)?; Ok(()) } } diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 5f86517aa2f..b64a621a15f 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -3,16 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +use std::fmt::Debug; +use std::sync::{Arc, Mutex}; + +use fastrand::Rng; +use http::{HeaderName, HeaderValue}; + use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use fastrand::Rng; -use http::{HeaderName, HeaderValue}; -use std::fmt::Debug; -use std::sync::{Arc, Mutex}; - #[cfg(feature = "test-util")] pub use test_util::{NoInvocationIdGenerator, PredefinedInvocationIdGenerator}; @@ -151,9 +152,10 @@ impl Storable for InvocationId { #[cfg(feature = "test-util")] mod test_util { - use super::*; use std::sync::{Arc, Mutex}; + use super::*; + impl InvocationId { /// Create a new invocation ID from a `&'static str`. pub fn new_from_str(uuid: &'static str) -> Self { @@ -212,20 +214,20 @@ mod test_util { #[cfg(test)] mod tests { - use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeTransmitInterceptorContextMut, Input, InterceptorContext, }; use aws_smithy_runtime_api::client::interceptors::Intercept; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::ConfigBag; - use http::HeaderValue; + + use super::*; fn expect_header<'a>( context: &'a BeforeTransmitInterceptorContextMut<'_>, header_name: &str, - ) -> &'a HeaderValue { + ) -> &'a str { context.request().headers().get(header_name).unwrap() } @@ -234,7 +236,7 @@ mod tests { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); @@ -262,7 +264,7 @@ mod tests { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index 95de2a2b7b0..b37ad2f5d12 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -154,7 +154,11 @@ mod tests { for (name, value) in test_case.request_headers_before() { request = request.header(name, value); } - let request = request.body(SdkBody::empty()).expect("must be valid"); + let request = request + .body(SdkBody::empty()) + .expect("must be valid") + .try_into() + .unwrap(); let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); context.set_request(request); @@ -167,9 +171,9 @@ mod tests { .modify_before_signing(&mut ctx, &rc, &mut config) .expect("interceptor must succeed"); let mutated_request = context.request().expect("request is set"); - for name in mutated_request.headers().keys() { + for (name, _) in mutated_request.headers() { assert_eq!( - mutated_request.headers().get_all(name).iter().count(), + mutated_request.headers().get_all(name).count(), 1, "No duplicated headers" ) diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index e0b4c912b14..1a2e066b49e 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -179,10 +179,10 @@ impl TryFrom for HeaderValue { mod tests { use super::RequestInfoInterceptor; use crate::request_info::RequestPairs; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::Input; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::interceptors::Intercept; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; @@ -198,8 +198,6 @@ mod tests { .headers() .get(header_name) .unwrap() - .to_str() - .unwrap() } #[test] @@ -207,7 +205,7 @@ mod tests { let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); let mut layer = Layer::new("test"); layer.store_put(RetryConfig::standard()); diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 5ef5e5ababc..bf4564acecb 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -113,9 +113,9 @@ impl Intercept for UserAgentInterceptor { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::interceptors::Intercept; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::error::display::DisplayErrorContext; @@ -127,14 +127,12 @@ mod tests { .headers() .get(header_name) .unwrap() - .to_str() - .unwrap() } fn context() -> InterceptorContext { let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); let _ = context.take_input(); context.enter_before_transmit_phase(); context diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index b8502f0d350..c870ebe5bfa 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -185,7 +185,7 @@ class AwsPresignedFluentBuilderMethod( }) })?; let request = context.take_request().expect("request set before transmit"); - Ok(#{PresignedRequest}::new(request.map(|_| ()))) + Ok(#{PresignedRequest}::new(request)) """, *codegenScope, "Operation" to codegenContext.symbolProvider.toSymbol(section.operationShape), diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt index 19ad56d1169..21494c8d58c 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt @@ -93,7 +93,7 @@ class EndpointsCredentialsTest { let client = $moduleName::Client::from_conf(conf); let _ = client.default_auth().send().await; let req = rcvr.expect_request(); - let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap(); + let auth_header = req.headers().get("AUTHORIZATION").unwrap(); assert!(auth_header.contains("/us-west-2/foobaz/aws4_request"), "{}", auth_header); """, "capture_request" to RuntimeType.captureRequest(context.runtimeConfig), @@ -116,7 +116,7 @@ class EndpointsCredentialsTest { let client = $moduleName::Client::from_conf(conf); let _ = dbg!(client.custom_auth().send().await); let req = rcvr.expect_request(); - let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap(); + let auth_header = req.headers().get("AUTHORIZATION").unwrap(); assert!(auth_header.contains("/region-custom-auth/name-custom-auth/aws4_request"), "{}", auth_header); """, "capture_request" to RuntimeType.captureRequest(context.runtimeConfig), diff --git a/aws/sdk/integration-tests/dynamodb/tests/movies.rs b/aws/sdk/integration-tests/dynamodb/tests/movies.rs index 981562c05a5..28801001065 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/movies.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/movies.rs @@ -14,7 +14,7 @@ use dynamodb::types::{ ScalarAttributeType, TableStatus, }; use dynamodb::Client; -use http::header::{HeaderName, AUTHORIZATION}; +use http::header::AUTHORIZATION; use http::Uri; use serde_json::Value; use std::collections::HashMap; @@ -187,7 +187,7 @@ async fn movies_it() { ] ); - http_client.assert_requests_match(&[AUTHORIZATION, HeaderName::from_static("x-amz-date")]); + http_client.assert_requests_match(&[AUTHORIZATION.as_str(), "x-amz-date"]); } /// Test connection for the movies IT diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index 3e95a87c35d..225bbabebdd 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -10,10 +10,10 @@ use aws_smithy_async::time::SharedTimeSource; use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_runtime::client::retries::RetryPartition; -use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use std::time::{Duration, SystemTime}; -fn req() -> HttpRequest { +fn req() -> http::Request { http::Request::builder() .body(SdkBody::from("request body")) .unwrap() diff --git a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs index c2cd3384ec3..52194567cc5 100644 --- a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs +++ b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs @@ -58,8 +58,8 @@ async fn autofill_account_id() { .await; let req = handler.expect_request(); assert_eq!( - "/-/vaults/vault/multipart-uploads/some%2Fupload%2Fid", - req.uri().path() + "https://glacier.us-east-1.amazonaws.com/-/vaults/vault/multipart-uploads/some%2Fupload%2Fid", + req.uri() ); } diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index 96c862c0e60..624dfd9d396 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -166,5 +166,5 @@ async fn generate_random_keystore_not_found() { inner.request_id(), Some("bfe81a0a-9a08-4e71-9910-cdb5ab6ea3b6") ); - http_client.assert_requests_match(&[AUTHORIZATION]); + http_client.assert_requests_match(&[AUTHORIZATION.as_str()]); } diff --git a/aws/sdk/integration-tests/polly/tests/presigning.rs b/aws/sdk/integration-tests/polly/tests/presigning.rs index 845192f1471..f6841b932ae 100644 --- a/aws/sdk/integration-tests/polly/tests/presigning.rs +++ b/aws/sdk/integration-tests/polly/tests/presigning.rs @@ -32,13 +32,14 @@ async fn test_presigning() { .await .expect("success"); - let pq = presigned.uri().path_and_query().unwrap(); + let uri = presigned.uri().parse::().unwrap(); + let pq = uri.path_and_query().unwrap(); let path = pq.path(); let query = pq.query().unwrap(); let mut query_params: Vec<&str> = query.split('&').collect(); query_params.sort(); - assert_eq!("GET", presigned.method().as_str()); + assert_eq!("GET", presigned.method()); assert_eq!("/v1/speech", path); assert_eq!( &[ @@ -55,5 +56,5 @@ async fn test_presigning() { ][..], &query_params ); - assert!(presigned.headers().is_empty()); + assert_eq!(presigned.headers().count(), 0); } diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 0c167712d75..61f0a7e5395 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_sdk_qldbsession::config::{Config, Credentials, Region}; use aws_sdk_qldbsession::types::StartSessionRequest; use aws_sdk_qldbsession::Client; diff --git a/aws/sdk/integration-tests/s3/tests/checksums.rs b/aws/sdk/integration-tests/s3/tests/checksums.rs index b6ea28fef58..b7b3d5be8a3 100644 --- a/aws/sdk/integration-tests/s3/tests/checksums.rs +++ b/aws/sdk/integration-tests/s3/tests/checksums.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; @@ -94,10 +96,7 @@ async fn test_checksum_on_streaming_response( .await .unwrap(); - http_client.assert_requests_match(&[ - http::header::HeaderName::from_static("x-amz-checksum-mode"), - AUTHORIZATION, - ]); + http_client.assert_requests_match(&["x-amz-checksum-mode", AUTHORIZATION.as_str()]); res } @@ -197,7 +196,7 @@ async fn test_checksum_on_streaming_request<'a>( .await .unwrap(); - let req = rcvr.expect_request(); + let mut req = rcvr.expect_request(); let headers = req.headers(); let x_amz_content_sha256 = headers @@ -244,10 +243,10 @@ async fn test_checksum_on_streaming_request<'a>( content_length, "content-length was expected to be {} but was {} instead", expected_encoded_content_length, - content_length.to_str().unwrap() + content_length ); - let body = collect_body_into_string(req.into_body()).await; + let body = collect_body_into_string(req.take_body()).await; // When sending a streaming body with a checksum, the trailers are included as part of the body content assert_eq!(body.as_str(), expected_aws_chunked_encoded_body,); } diff --git a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs index dd838e7efb3..0c19fbf9038 100644 --- a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs +++ b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs @@ -42,5 +42,5 @@ async fn test_s3_ops_are_customizable() { .unwrap() .to_owned(); - assert_eq!("test-value", test_header.to_str().unwrap(),); + assert_eq!("test-value", test_header); } diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index e38269154dd..3e9eb79b06c 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::Builder; use aws_sdk_s3::config::{Credentials, Region}; @@ -75,7 +77,6 @@ async fn multi_region_access_points() { "https://mfzwi23gnjvgw.mrap.accesspoint.s3-global.amazonaws.com/blah?x-id=GetObject" ); let auth_header = captured_request.headers().get("AUTHORIZATION").unwrap(); - let auth_header = auth_header.to_str().unwrap(); // Verifies that the sigv4a signing algorithm was used, that the signing scope doesn't include a region, and that the x-amz-region-set header was signed. let expected_start = "AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20090213/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature="; @@ -101,7 +102,6 @@ async fn s3_object_lambda() { let captured_request = captured_request.expect_request(); assert_eq!(captured_request.uri().to_string(), "https://myolap-123412341234.s3-object-lambda.us-east-100.amazonaws.com/s3.txt?x-id=GetObject"); let auth_header = captured_request.headers().get("AUTHORIZATION").unwrap(); - let auth_header = auth_header.to_str().unwrap(); // verifies that both the signing scope (s3-object-lambda) has been set as well as the ARN region // us-east-100 let expected_start = @@ -138,14 +138,16 @@ async fn s3_object_lambda_no_cross_region() { #[tokio::test] async fn write_get_object_response() { let (req, client) = test_client(|b| b); - let _write = client - .write_get_object_response() - .request_route("req-route") - .request_token("token") - .status_code(200) - .body(vec![1, 2, 3].into()) - .send() - .await; + let _write = dbg!( + client + .write_get_object_response() + .request_route("req-route") + .request_token("token") + .status_code(200) + .body(vec![1, 2, 3].into()) + .send() + .await + ); let captured_request = req.expect_request(); assert_eq!( diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index c9bd3749a37..3b8034a6739 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, types::ObjectAttributes, Client}; @@ -58,5 +60,5 @@ async fn ignore_invalid_xml_body_root() { .await .unwrap(); - http_client.assert_requests_match(&[AUTHORIZATION]); + http_client.assert_requests_match(&[AUTHORIZATION.as_str()]); } diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs index edae30719da..b8e1e07c499 100644 --- a/aws/sdk/integration-tests/s3/tests/interceptors.rs +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -81,7 +81,7 @@ async fn interceptor_priority() { .expect_err("no fake response set"); let request = rx.expect_request(); - assert_eq!("value2", request.headers()["test-header"]); + assert_eq!("value2", request.headers().get("test-header").unwrap()); } #[tokio::test] @@ -112,6 +112,6 @@ async fn set_test_user_agent_through_request_mutation() { .expect_err("no fake response set"); let request = rx.expect_request(); - assert_eq!("test", request.headers()[USER_AGENT]); - assert_eq!("test", request.headers()["x-amz-user-agent"]); + assert_eq!("test", request.headers().get(USER_AGENT).unwrap()); + assert_eq!("test", request.headers().get("x-amz-user-agent").unwrap()); } diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 8f439627634..3b6bd970029 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, primitives::ByteStream, Client}; @@ -88,12 +90,9 @@ async fn test_s3_signer_with_naughty_string_metadata() { let snapshot_signature = "Signature=a5115604df66219874a9e5a8eab4c9f7a28c992ab2d918037a285756c019f3b2"; assert!( - auth_header - .to_str() - .unwrap() - .contains(snapshot_signature), + auth_header .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", - auth_header.to_str().unwrap(), + auth_header, snapshot_signature ); } diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index a044a3e9214..11ee0f7b092 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -37,8 +37,8 @@ async fn test_operation_should_not_normalize_uri_path() { let actual_auth = std::str::from_utf8(request.headers().get("authorization").unwrap().as_bytes()).unwrap(); - let actual_uri = request.uri().path(); - let expected_uri = "/a/.././b.txt"; + let actual_uri = request.uri(); + let expected_uri = "https://test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1.s3.us-east-1.amazonaws.com/a/.././b.txt?x-id=PutObject"; assert_eq!(actual_uri, expected_uri); let expected_sig = "Signature=2ac540538c84dc2616d92fb51d4fc6146ccd9ccc1ee85f518a1a686c5ef97b86"; diff --git a/aws/sdk/integration-tests/s3/tests/presigning.rs b/aws/sdk/integration-tests/s3/tests/presigning.rs index 33d51926426..768dd563bb5 100644 --- a/aws/sdk/integration-tests/s3/tests/presigning.rs +++ b/aws/sdk/integration-tests/s3/tests/presigning.rs @@ -4,10 +4,12 @@ */ use aws_sdk_s3 as s3; +use std::collections::HashMap; + use futures_util::future::FutureExt; use futures_util::Future; use http::header::{CONTENT_LENGTH, CONTENT_TYPE}; -use http::{HeaderMap, HeaderValue}; +use http::Uri; use s3::config::{Credentials, Region}; use s3::operation::get_object::builders::GetObjectFluentBuilder; use s3::operation::head_object::builders::HeadObjectFluentBuilder; @@ -71,8 +73,9 @@ where async fn test_presigning() { let presigned = presign(|client| client.get_object().bucket("test-bucket").key("test-key")).await; + let uri = presigned.uri().parse::().unwrap(); - let pq = presigned.uri().path_and_query().unwrap(); + let pq = uri.path_and_query().unwrap(); let path = pq.path(); let query = pq.query().unwrap(); let mut query_params: Vec<&str> = query.split('&').collect(); @@ -80,9 +83,9 @@ async fn test_presigning() { pretty_assertions::assert_eq!( "test-bucket.s3.us-east-1.amazonaws.com", - presigned.uri().authority().unwrap() + uri.authority().unwrap() ); - assert_eq!("GET", presigned.method().as_str()); + assert_eq!("GET", presigned.method()); assert_eq!("/test-key", path); pretty_assertions::assert_eq!( &[ @@ -97,7 +100,7 @@ async fn test_presigning() { ][..], &query_params ); - assert!(presigned.headers().is_empty()); + assert_eq!(presigned.headers().count(), 0); } #[tokio::test] @@ -111,8 +114,9 @@ async fn test_presigning_with_payload_headers() { .content_type("application/x-test") }) .await; + let uri = presigned.uri().parse::().unwrap(); - let pq = presigned.uri().path_and_query().unwrap(); + let pq = uri.path_and_query().unwrap(); let path = pq.path(); let query = pq.query().unwrap(); let mut query_params: Vec<&str> = query.split('&').collect(); @@ -120,9 +124,9 @@ async fn test_presigning_with_payload_headers() { pretty_assertions::assert_eq!( "test-bucket.s3.us-east-1.amazonaws.com", - presigned.uri().authority().unwrap() + uri.authority().unwrap() ); - assert_eq!("PUT", presigned.method().as_str()); + assert_eq!("PUT", presigned.method()); assert_eq!("/test-key", path); pretty_assertions::assert_eq!( &[ @@ -137,11 +141,14 @@ async fn test_presigning_with_payload_headers() { ][..], &query_params ); + let headers = presigned.headers().collect::>(); - let mut expected_headers = HeaderMap::new(); - expected_headers.insert(CONTENT_LENGTH, HeaderValue::from_static("12345")); - expected_headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/x-test")); - assert_eq!(&expected_headers, presigned.headers()); + assert_eq!( + headers.get(CONTENT_TYPE.as_str()), + Some(&"application/x-test") + ); + assert_eq!(headers.get(CONTENT_LENGTH.as_str()), Some(&"12345")); + assert_eq!(headers.len(), 2); } #[tokio::test] @@ -182,7 +189,7 @@ async fn test_presigning_object_lambda() { async fn test_presigned_head_object() { let presigned = presign(|client| client.head_object().bucket("bucket").key("key")).await; - assert_eq!("HEAD", presigned.method().as_str()); + assert_eq!("HEAD", presigned.method()); pretty_assertions::assert_eq!( "https://bucket.s3.us-east-1.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=6b97012e70d5ee3528b5591e0e90c0f45e0fa303506f854eff50ff922751a193&X-Amz-Security-Token=notarealsessiontoken", presigned.uri().to_string(), diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 55c68f61557..528f9f1bbdf 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::{Client, Config}; @@ -45,11 +47,9 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { "Signature=9a931d20606f93fa4e5553602866a9b5ccac2cd42b54ae5a4b17e4614fb443ce"; assert!( auth_header - .to_str() - .unwrap() .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", - auth_header.to_str().unwrap(), + auth_header, snapshot_signature ); } diff --git a/aws/sdk/integration-tests/s3/tests/recursion-detection.rs b/aws/sdk/integration-tests/s3/tests/recursion-detection.rs index 5bd7b265229..adcd13a20c3 100644 --- a/aws/sdk/integration-tests/s3/tests/recursion-detection.rs +++ b/aws/sdk/integration-tests/s3/tests/recursion-detection.rs @@ -8,7 +8,6 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; use aws_smithy_runtime::client::http::test_util::capture_request; -use http::HeaderValue; #[tokio::test] async fn recursion_detection_applied() { @@ -27,6 +26,6 @@ async fn recursion_detection_applied() { .expect_request() .headers() .get("x-amzn-trace-id"), - Some(&HeaderValue::from_static("traceid")) + Some("traceid") ); } diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index 22dcf7c3d9a..d690e31cf3f 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::{Client, Config}; diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index bd1923c1419..cf1fd7f23b4 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -27,3 +27,7 @@ http = "0.2.0" serde_json = "1.0.0" tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } + +[[test]] +name = "signing-it" +required-features = ["test-util"] diff --git a/aws/sdk/integration-tests/webassembly/src/http.rs b/aws/sdk/integration-tests/webassembly/src/http.rs index ce4cb246eb4..b13f4bf2b05 100644 --- a/aws/sdk/integration-tests/webassembly/src/http.rs +++ b/aws/sdk/integration-tests/webassembly/src/http.rs @@ -45,7 +45,7 @@ impl WasmHttpConnector { impl HttpConnector for WasmHttpConnector { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { println!("Adapter: sending request..."); - let res = make_request(request).unwrap(); + let res = make_request(request.into_http02x().unwrap()).unwrap(); println!("{:?}", res); HttpConnectorFuture::new(async move { Ok(res) }) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index ee9315fa206..c1ec854befd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -11,7 +11,6 @@ import software.amazon.smithy.model.shapes.DoubleShape import software.amazon.smithy.model.shapes.FloatShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StructureShape -import software.amazon.smithy.model.traits.EndpointTrait import software.amazon.smithy.model.traits.ErrorTrait import software.amazon.smithy.protocoltests.traits.AppliesTo import software.amazon.smithy.protocoltests.traits.HttpMessageTestCase @@ -22,7 +21,6 @@ import software.amazon.smithy.protocoltests.traits.HttpResponseTestsTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator -import software.amazon.smithy.rust.codegen.client.smithy.generators.EndpointTraitBindings import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -96,6 +94,7 @@ class DefaultProtocolTestGenerator( private val codegenScope = arrayOf( "SmithyHttp" to RT.smithyHttp(rc), "AssertEq" to RT.PrettyAssertions.resolve("assert_eq!"), + "Uri" to RT.Http.resolve("Uri"), ) sealed class TestCase { @@ -204,10 +203,12 @@ class DefaultProtocolTestGenerator( } } } ?: writable { } + // support test cases that set the host value, e.g: https://github.com/smithy-lang/smithy/blob/be68f3bbdfe5bf50a104b387094d40c8069f16b1/smithy-aws-protocol-tests/model/restJson1/endpoint-paths.smithy#L19 + val host = "https://${httpRequestTestCase.host.orNull() ?: "example.com"}".dq() rustTemplate( """ let (http_client, request_receiver) = #{capture_request}(None); - let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_resolver("https://example.com"); + let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_resolver($host); #{customParams} """, @@ -226,54 +227,6 @@ class DefaultProtocolTestGenerator( rust("let _ = dbg!(result);") rust("""let http_request = request_receiver.expect_request();""") - with(httpRequestTestCase) { - // Override the endpoint for tests that set a `host`, for example: - // https://github.com/awslabs/smithy/blob/be68f3bbdfe5bf50a104b387094d40c8069f16b1/smithy-aws-protocol-tests/model/restJson1/endpoint-paths.smithy#L19 - host.orNull()?.also { host -> - val withScheme = "http://$host" - val bindings = operationShape.getTrait(EndpointTrait::class.java).map { epTrait -> - EndpointTraitBindings( - codegenContext.model, - codegenContext.symbolProvider, - codegenContext.runtimeConfig, - operationShape, - epTrait, - ) - }.orNull() - when (bindings) { - null -> rust("let endpoint_prefix = None;") - else -> { - withBlock("let input = ", ";") { - instantiator.render(this@renderHttpRequestTestCase, inputShape, httpRequestTestCase.params) - } - withBlock("let endpoint_prefix = Some({", "}.unwrap());") { - bindings.render(this, "input", generateValidation = false) - } - } - } - rustTemplate( - """ - let mut http_request = http_request; - let ep = #{SmithyHttp}::endpoint::Endpoint::mutable(${withScheme.dq()}).expect("valid endpoint"); - ep.set_endpoint(http_request.uri_mut(), endpoint_prefix.as_ref()).expect("valid endpoint"); - """, - *codegenScope, - ) - } - rustTemplate( - """ - #{AssertEq}(http_request.method(), ${method.dq()}); - #{AssertEq}(http_request.uri().path(), ${uri.dq()}); - """, - *codegenScope, - ) - resolvedHost.orNull()?.also { host -> - rustTemplate( - """#{AssertEq}(http_request.uri().host().expect("host should be set"), ${host.dq()});""", - *codegenScope, - ) - } - } checkQueryParams(this, httpRequestTestCase.queryParams) checkForbidQueryParams(this, httpRequestTestCase.forbidQueryParams) checkRequiredQueryParams(this, httpRequestTestCase.requireQueryParams) @@ -354,7 +307,8 @@ class DefaultProtocolTestGenerator( }); """, "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), - "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), + "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc) + .resolve("client::ser_de::SharedResponseDeserializer"), "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), "DeserializeResponse" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::DeserializeResponse"), "RuntimePlugin" to RT.runtimePlugin(rc), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index b4c1284f7de..dc2b287b507 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -76,7 +76,7 @@ class RequestSerializerGenerator( }; let body = #{generate_body}; #{add_content_length} - #{Ok}(request_builder.body(body).expect("valid request")) + #{Ok}(request_builder.body(body).expect("valid request").try_into().unwrap()) } } """, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index 2841ad493fb..a9714a8a987 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -55,7 +55,7 @@ private class TestServiceRuntimePluginCustomization( let mut fake_req = ::http::Request::builder() $fakeRequestBuilder .body(#{SdkBody}::from($fakeRequestBody)) - .expect("valid request"); + .expect("valid request").try_into().unwrap(); ::std::mem::swap( context.request_mut(), &mut fake_req, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt index 8f5e504b1af..244eace3613 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt @@ -18,10 +18,10 @@ fun String.doubleQuote(): String = */ fun String.dq(): String = this.doubleQuote() +private val completeWords: List = listOf("ipv4", "ipv6", "sigv4", "mib", "gib", "kib", "ttl") private fun String.splitOnWordBoundaries(): List { val out = mutableListOf() // These are whole words but cased differently, e.g. `IPv4`, `MiB`, `GiB`, `TtL` - val completeWords = listOf("ipv4", "ipv6", "sigv4", "mib", "gib", "kib", "ttl") var currentWord = "" // emit the current word and update from the next character diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index d78df801121..c1831aac7bc 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -561,9 +561,9 @@ class ServerProtocolTestGenerator( private fun checkResponse(rustWriter: RustWriter, testCase: HttpResponseTestCase) { checkStatusCode(rustWriter, testCase.code) - checkHeaders(rustWriter, "&http_response.headers()", testCase.headers) - checkForbidHeaders(rustWriter, "&http_response.headers()", testCase.forbidHeaders) - checkRequiredHeaders(rustWriter, "&http_response.headers()", testCase.requireHeaders) + checkHeaders(rustWriter, "http_response.headers()", testCase.headers) + checkForbidHeaders(rustWriter, "http_response.headers()", testCase.forbidHeaders) + checkRequiredHeaders(rustWriter, "http_response.headers()", testCase.requireHeaders) // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to @@ -579,7 +579,7 @@ class ServerProtocolTestGenerator( private fun checkResponse(rustWriter: RustWriter, testCase: HttpMalformedResponseDefinition) { checkStatusCode(rustWriter, testCase.code) - checkHeaders(rustWriter, "&http_response.headers()", testCase.headers) + checkHeaders(rustWriter, "http_response.headers()", testCase.headers) // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to diff --git a/design/src/rfcs/rfc0037_http_wrapper.md b/design/src/rfcs/rfc0037_http_wrapper.md index 58aa68c55fe..6c1e1ac14c3 100644 --- a/design/src/rfcs/rfc0037_http_wrapper.md +++ b/design/src/rfcs/rfc0037_http_wrapper.md @@ -59,7 +59,7 @@ All header insertion methods accept `impl AsHeaderComponent`. This allows us to advantage of zero-cost usage of `'static str`. We will seal this trait to prevent external usage. We will have separate implementation for: - `&'static str` - `String` -- http03x::HeaderName +- http02x::HeaderName #### Additional Functionality Our wrapper type will add the following additional functionality: @@ -100,7 +100,7 @@ This also enables supporting request extensions for different downstream provide ### Future Work -Currently, the only way to construct `Request` is from a compatible type (e.g. `http03x::Request`) +Currently, the only way to construct `Request` is from a compatible type (e.g. `http02x::Request`) Changes checklist ----------------- diff --git a/examples/pokemon-service-common/src/lib.rs b/examples/pokemon-service-common/src/lib.rs index be15b071176..c4c8bc4e752 100644 --- a/examples/pokemon-service-common/src/lib.rs +++ b/examples/pokemon-service-common/src/lib.rs @@ -332,6 +332,8 @@ pub async fn stream_pokemon_radio( http::Request::builder() .uri(radio_stream_url) .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(), ) .await diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index 9981540cb85..bf09387d375 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -43,7 +43,7 @@ async fn plugin_layers_are_executed_in_registration_order() { rcvr.expect_request() }; - app.call(request).await.unwrap(); + app.call(request.into_http02x().unwrap()).await.unwrap(); let output_guard = output.lock().unwrap(); assert_eq!(output_guard.deref(), &vec!["first", "second"]); diff --git a/rust-runtime/aws-smithy-checksums/src/body/calculate.rs b/rust-runtime/aws-smithy-checksums/src/body/calculate.rs index 746ee04cd39..2ac3f09896a 100644 --- a/rust-runtime/aws-smithy-checksums/src/body/calculate.rs +++ b/rust-runtime/aws-smithy-checksums/src/body/calculate.rs @@ -145,7 +145,7 @@ mod tests { .expect("checksum generation was without error") .expect("trailers were set"); let checksum_trailer = trailers - .get(&CRC_32_HEADER_NAME) + .get(CRC_32_HEADER_NAME) .expect("trailers contain crc32 checksum"); let checksum_trailer = header_value_as_checksum_string(checksum_trailer); diff --git a/rust-runtime/aws-smithy-checksums/src/http.rs b/rust-runtime/aws-smithy-checksums/src/http.rs index 648e120110d84ea6b74bb0411ab95a331b62d7dc..fbccd246f49b7c9b688b7777ba27b78aef18d622 100644 GIT binary patch delta 415 zcmaECH_39shRJq}Qj;SYRoKH4b4pWdttYOMn|Rx1vK1?jFqZ-l1baBf8=0EL`#Ji$ z>Tpf&V^o$?D=sNguvJj1&`r#((oN1tP0lVZ&DBjVN;Wo9vYtGVQFt;ZFRy}?0zQSw zN|Sw=6l8EHDb7eVRGPekNr@e*VDft=@yYDWogy#|$@zIDsd**3xhbYfn-4SBvGAy= z7ndZKWF{*BowwPWLz-!GJ{KpGCbFn#^#~T~Pd$>BfxCViJH+cfD!sO#T zYA6Ox{>~#0lu(}R$g7Adk;5wklyE~8e84LQHb#w4Sq+E9zAmOHwq^)uPv#OdoxDaM SY;u=?+~hlJ)?p( zSxzd>NHhfM*Je^8&r3l4My6&!6SA2)jfrzXa(-S(YF>$MZi=ar=4KA&IuWn}qkUMXpq`QW5g%T>$8m6=Ti z4wDT9gzFX3@{5oo8RD0;JOxmK(SRk9_{5y_{G!Z~j9e>t`gDW|X)5U2DFmnHq#*@F zZemGth61K`BqiYRs)wdQxM5aS&Y;w&U~8w~j59EGz`g+)00OWKgKkDLk|8Lm8Wtu% zW9lJB;4;TI#S~ Result { + Ok(Self::new(&Uri::try_from(uri)?)) + } + /// Creates a new `QueryWriter` based off the given `uri`. pub fn new(uri: &Uri) -> Self { let new_path_and_query = uri diff --git a/rust-runtime/aws-smithy-protocol-test/Cargo.toml b/rust-runtime/aws-smithy-protocol-test/Cargo.toml index 8d67abb2a57..e32a2434b79 100644 --- a/rust-runtime/aws-smithy-protocol-test/Cargo.toml +++ b/rust-runtime/aws-smithy-protocol-test/Cargo.toml @@ -16,6 +16,7 @@ regex = "1.5" roxmltree = "0.14.1" serde_json = "1" thiserror = "1.0.40" +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client"] } [package.metadata.docs.rs] diff --git a/rust-runtime/aws-smithy-protocol-test/src/lib.rs b/rust-runtime/aws-smithy-protocol-test/src/lib.rs index 111a8afa2f8..e1b2f6adfc9 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/lib.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/lib.rs @@ -13,9 +13,12 @@ mod urlencoded; mod xml; +use crate::sealed::GetNormalizedHeader; use crate::xml::try_xml_equivalent; use assert_json_diff::assert_json_eq_no_panic; -use http::{header::HeaderMap, Request, Uri}; +use aws_smithy_runtime_api::client::http::request::Headers; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use http::{HeaderMap, Uri}; use pretty_assertions::Comparison; use std::collections::HashSet; use std::fmt::{self, Debug}; @@ -122,18 +125,18 @@ impl<'a> QueryParam<'a> { } } -fn extract_params(uri: &Uri) -> HashSet<&str> { - uri.query().unwrap_or_default().split('&').collect() +fn extract_params(uri: &str) -> HashSet<&str> { + let query = uri.rsplit_once('?').map(|s| s.1).unwrap_or_default(); + query.split('&').collect() } #[track_caller] -pub fn assert_uris_match(left: &Uri, right: &Uri) { +pub fn assert_uris_match(left: impl AsRef, right: impl AsRef) { + let left = left.as_ref(); + let right = right.as_ref(); if left == right { return; } - assert_eq!(left.authority(), right.authority()); - assert_eq!(left.scheme(), right.scheme()); - assert_eq!(left.path(), right.path()); assert_eq!( extract_params(left), extract_params(right), @@ -141,10 +144,15 @@ pub fn assert_uris_match(left: &Uri, right: &Uri) { left, right ); + let left: Uri = left.parse().expect("left is not a valid URI"); + let right: Uri = right.parse().expect("left is not a valid URI"); + assert_eq!(left.authority(), right.authority()); + assert_eq!(left.scheme(), right.scheme()); + assert_eq!(left.path(), right.path()); } -pub fn validate_query_string( - request: &Request, +pub fn validate_query_string( + request: &HttpRequest, expected_params: &[&str], ) -> Result<(), ProtocolTestFailure> { let actual_params = extract_params(request.uri()); @@ -159,8 +167,8 @@ pub fn validate_query_string( Ok(()) } -pub fn forbid_query_params( - request: &Request, +pub fn forbid_query_params( + request: &HttpRequest, forbid_params: &[&str], ) -> Result<(), ProtocolTestFailure> { let actual_params: HashSet> = extract_params(request.uri()) @@ -186,8 +194,8 @@ pub fn forbid_query_params( Ok(()) } -pub fn require_query_params( - request: &Request, +pub fn require_query_params( + request: &HttpRequest, require_keys: &[&str], ) -> Result<(), ProtocolTestFailure> { let actual_keys: HashSet<&str> = extract_params(request.uri()) @@ -204,14 +212,46 @@ pub fn require_query_params( Ok(()) } +mod sealed { + pub trait GetNormalizedHeader { + fn get_header(&self, key: &str) -> Option; + } +} + +impl<'a> GetNormalizedHeader for &'a Headers { + fn get_header(&self, key: &str) -> Option { + if !self.contains_key(key) { + None + } else { + Some(self.get_all(key).collect::>().join(", ")) + } + } +} + +impl<'a> GetNormalizedHeader for &'a HeaderMap { + fn get_header(&self, key: &str) -> Option { + if !self.contains_key(key) { + None + } else { + Some( + self.get_all(key) + .iter() + .map(|value| std::str::from_utf8(value.as_bytes()).expect("invalid utf-8")) + .collect::>() + .join(", "), + ) + } + } +} + pub fn validate_headers<'a>( - actual_headers: &HeaderMap, + actual_headers: impl GetNormalizedHeader, expected_headers: impl IntoIterator + 'a, impl AsRef + 'a)>, ) -> Result<(), ProtocolTestFailure> { for (key, expected_value) in expected_headers { let key = key.as_ref(); let expected_value = expected_value.as_ref(); - match normalized_header(actual_headers, key) { + match actual_headers.get_header(key) { None => { return Err(ProtocolTestFailure::MissingHeader { expected: key.to_string(), @@ -230,28 +270,13 @@ pub fn validate_headers<'a>( Ok(()) } -fn normalized_header(headers: &HeaderMap, key: &str) -> Option { - if !headers.contains_key(key) { - None - } else { - Some( - headers - .get_all(key) - .iter() - .map(|hv| hv.to_str().unwrap()) - .collect::>() - .join(", "), - ) - } -} - pub fn forbid_headers( - headers: &HeaderMap, + headers: impl GetNormalizedHeader, forbidden_headers: &[&str], ) -> Result<(), ProtocolTestFailure> { for key in forbidden_headers { // Protocol tests store header lists as comma-delimited - if let Some(value) = normalized_header(headers, key) { + if let Some(value) = headers.get_header(key) { return Err(ProtocolTestFailure::ForbiddenHeader { forbidden: key.to_string(), found: format!("{}: {}", key, value), @@ -262,12 +287,12 @@ pub fn forbid_headers( } pub fn require_headers( - headers: &HeaderMap, + headers: impl GetNormalizedHeader, required_headers: &[&str], ) -> Result<(), ProtocolTestFailure> { for key in required_headers { // Protocol tests store header lists as comma-delimited - if normalized_header(headers, key).is_none() { + if headers.get_header(key).is_none() { return Err(ProtocolTestFailure::MissingHeader { expected: key.to_string(), }); @@ -388,21 +413,25 @@ mod tests { forbid_headers, forbid_query_params, require_headers, require_query_params, validate_body, validate_headers, validate_query_string, FloatEquals, MediaType, ProtocolTestFailure, }; - use http::{header::HeaderMap, Request}; + use aws_smithy_runtime_api::client::http::request::Headers; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + + fn make_request(uri: &str) -> HttpRequest { + let mut req = HttpRequest::empty(); + req.set_uri(uri).unwrap(); + req + } #[test] fn test_validate_empty_query_string() { - let request = Request::builder().uri("/foo").body(()).unwrap(); + let request = HttpRequest::empty(); validate_query_string(&request, &[]).expect("no required params should pass"); validate_query_string(&request, &["a"]).expect_err("no params provided"); } #[test] fn test_validate_query_string() { - let request = Request::builder() - .uri("/foo?a=b&c&d=efg&hello=a%20b") - .body(()) - .unwrap(); + let request = make_request("/foo?a=b&c&d=efg&hello=a%20b"); validate_query_string(&request, &["a=b"]).expect("a=b is in the query string"); validate_query_string(&request, &["c", "a=b"]) .expect("both params are in the query string"); @@ -418,10 +447,7 @@ mod tests { #[test] fn test_forbid_query_param() { - let request = Request::builder() - .uri("/foo?a=b&c&d=efg&hello=a%20b") - .body(()) - .unwrap(); + let request = make_request("/foo?a=b&c&d=efg&hello=a%20b"); forbid_query_params(&request, &["a"]).expect_err("a is a query param"); forbid_query_params(&request, &["not_included"]).expect("query param not included"); forbid_query_params(&request, &["a=b"]).expect_err("if there is an `=`, match against KV"); @@ -431,10 +457,7 @@ mod tests { #[test] fn test_require_query_param() { - let request = Request::builder() - .uri("/foo?a=b&c&d=efg&hello=a%20b") - .body(()) - .unwrap(); + let request = make_request("/foo?a=b&c&d=efg&hello=a%20b"); require_query_params(&request, &["a"]).expect("a is a query param"); require_query_params(&request, &["not_included"]).expect_err("query param not included"); require_query_params(&request, &["a=b"]).expect_err("should be matching against keys"); @@ -443,11 +466,11 @@ mod tests { #[test] fn test_validate_headers() { - let mut headers = HeaderMap::new(); - headers.append("X-Foo", "foo".parse().unwrap()); - headers.append("X-Foo-List", "foo".parse().unwrap()); - headers.append("X-Foo-List", "bar".parse().unwrap()); - headers.append("X-Inline", "inline, other".parse().unwrap()); + let mut headers = Headers::new(); + headers.append("x-foo", "foo"); + headers.append("x-foo-list", "foo"); + headers.append("x-foo-list", "bar"); + headers.append("x-inline", "inline, other"); validate_headers(&headers, [("X-Foo", "foo")]).expect("header present"); validate_headers(&headers, [("X-Foo", "Foo")]).expect_err("case sensitive"); @@ -466,30 +489,24 @@ mod tests { #[test] fn test_forbidden_headers() { - let request = Request::builder() - .uri("/") - .header("X-Foo", "foo") - .body(()) - .unwrap(); + let mut headers = Headers::new(); + headers.append("x-foo", "foo"); assert_eq!( - forbid_headers(request.headers(), &["X-Foo"]).expect_err("should be error"), + forbid_headers(&headers, &["X-Foo"]).expect_err("should be error"), ProtocolTestFailure::ForbiddenHeader { forbidden: "X-Foo".to_string(), found: "X-Foo: foo".to_string() } ); - forbid_headers(request.headers(), &["X-Bar"]).expect("header not present"); + forbid_headers(&headers, &["X-Bar"]).expect("header not present"); } #[test] fn test_required_headers() { - let request = Request::builder() - .uri("/") - .header("X-Foo", "foo") - .body(()) - .unwrap(); - require_headers(request.headers(), &["X-Foo"]).expect("header present"); - require_headers(request.headers(), &["X-Bar"]).expect_err("header not present"); + let mut headers = Headers::new(); + headers.append("x-foo", "foo"); + require_headers(&headers, &["X-Foo"]).expect("header present"); + require_headers(&headers, &["X-Bar"]).expect_err("header not present"); } #[test] @@ -528,6 +545,12 @@ mod tests { .expect("inputs matched exactly") } + #[test] + fn test_validate_headers_http0x() { + let request = http::Request::builder().header("a", "b").body(()).unwrap(); + validate_headers(request.headers(), [("a", "b")]).unwrap() + } + #[test] fn test_float_equals() { let a = f64::NAN; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs index 9a83d90e29e..caae96e18e1 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs @@ -7,7 +7,7 @@ use aws_smithy_http::body::SdkBody; use http as http0; -use http::header::{InvalidHeaderName, InvalidHeaderValue, ToStrError}; +use http::header::{InvalidHeaderName, InvalidHeaderValue}; use http::uri::InvalidUri; use http0::header::Iter; use http0::uri::PathAndQuery; @@ -15,7 +15,7 @@ use http0::{Extensions, HeaderMap, Method}; use std::borrow::Cow; use std::error::Error; use std::fmt::{Debug, Display, Formatter}; -use std::str::FromStr; +use std::str::{FromStr, Utf8Error}; #[derive(Debug)] /// An HTTP Request Type @@ -115,7 +115,7 @@ impl TryInto> for Request { type Error = HttpError; fn try_into(self) -> Result, Self::Error> { - self.into_http03x() + self.into_http02x() } } @@ -124,7 +124,7 @@ impl Request { /// /// Depending on the internal storage type, this operation may be free or it may have an internal /// cost. - pub fn into_http03x(self) -> Result, HttpError> { + pub fn into_http02x(self) -> Result, HttpError> { let mut req = http::Request::builder() .uri(self.uri.parsed) .method(self.method) @@ -135,13 +135,24 @@ impl Request { self.headers .headers .into_iter() - .map(|(k, v)| (k, v.into_http03x())), + .map(|(k, v)| (k, v.into_http02x())), ); *req.headers_mut() = headers; *req.extensions_mut() = self.extensions; Ok(req) } + /// Update the body of this request to be a new body. + pub fn map(self, f: impl Fn(B) -> U) -> Request { + Request { + body: f(self.body), + uri: self.uri, + method: self.method, + extensions: self.extensions, + headers: self.headers, + } + } + /// Returns a GET request with no URI pub fn new(body: B) -> Self { Self { @@ -223,6 +234,18 @@ impl Request { pub fn take_body(&mut self) -> SdkBody { std::mem::replace(self.body_mut(), SdkBody::taken()) } + + /// Create a GET request to `/` with an empty body + pub fn empty() -> Self { + Self::new(SdkBody::empty()) + } + + /// Creates a GET request to `uri` with an empty body + pub fn get(uri: impl AsRef) -> Result { + let mut req = Self::new(SdkBody::empty()); + req.set_uri(uri.as_ref())?; + Ok(req) + } } impl TryFrom> for Request { @@ -232,7 +255,7 @@ impl TryFrom> for Request { if let Some(e) = value .headers() .values() - .filter_map(|value| value.to_str().err()) + .filter_map(|value| std::str::from_utf8(value.as_bytes()).err()) .next() { Err(HttpError::header_was_not_a_string(e)) @@ -243,7 +266,7 @@ impl TryFrom> for Request { parts .headers .into_iter() - .map(|(k, v)| (k, HeaderValue::from_http03x(v).expect("validated above"))), + .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect("validated above"))), ); Ok(Self { body, @@ -289,6 +312,11 @@ impl<'a> Iterator for HeadersIter<'a> { } impl Headers { + /// Create an empty header map + pub fn new() -> Self { + Self::default() + } + /// Returns the value for a given key /// /// If multiple values are associated, the first value is returned @@ -297,6 +325,14 @@ impl Headers { self.headers.get(key.as_ref()).map(|v| v.as_ref()) } + /// Returns all values for a given key + pub fn get_all(&self, key: impl AsRef) -> impl Iterator { + self.headers + .get_all(key.as_ref()) + .iter() + .map(|v| v.as_ref()) + } + /// Returns an iterator over the headers pub fn iter(&self) -> HeadersIter<'_> { HeadersIter { @@ -391,8 +427,8 @@ mod sealed { /// If the component can be represented as a Cow<'static, str>, return it fn into_maybe_static(self) -> Result; - /// If a component is already internally represented as a `http03x::HeaderName`, return it - fn repr_as_http03x_header_name(self) -> Result + /// If a component is already internally represented as a `http02x::HeaderName`, return it + fn repr_as_http02x_header_name(self) -> Result where Self: Sized, { @@ -421,7 +457,7 @@ mod sealed { impl AsHeaderComponent for http0::HeaderValue { fn into_maybe_static(self) -> Result { Ok(Cow::Owned( - self.to_str() + std::str::from_utf8(self.as_bytes()) .map_err(HttpError::header_was_not_a_string)? .to_string(), )) @@ -433,7 +469,7 @@ mod sealed { Ok(self.to_string().into()) } - fn repr_as_http03x_header_name(self) -> Result + fn repr_as_http02x_header_name(self) -> Result where Self: Sized, { @@ -455,12 +491,12 @@ mod header_value { } impl HeaderValue { - pub(crate) fn from_http03x(value: http0::HeaderValue) -> Result { + pub(crate) fn from_http02x(value: http0::HeaderValue) -> Result { let _ = std::str::from_utf8(value.as_bytes())?; Ok(Self { _private: value }) } - pub(crate) fn into_http03x(self) -> http0::HeaderValue { + pub(crate) fn into_http02x(self) -> http0::HeaderValue { self._private } } @@ -501,7 +537,7 @@ impl TryFrom for HeaderValue { type Error = HttpError; fn try_from(value: String) -> Result { - Ok(HeaderValue::from_http03x( + Ok(HeaderValue::from_http02x( http0::HeaderValue::try_from(value).map_err(HttpError::invalid_header_value)?, ) .expect("input was a string")) @@ -526,7 +562,7 @@ impl HttpError { Self(err.into()) } - fn header_was_not_a_string(err: ToStrError) -> Self { + fn header_was_not_a_string(err: Utf8Error) -> Self { Self(err.into()) } @@ -552,10 +588,17 @@ impl Error for HttpError { } fn header_name(name: impl AsHeaderComponent) -> Result { - name.repr_as_http03x_header_name().or_else(|name| { - name.into_maybe_static().and_then(|cow| match cow { - Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), - Cow::Owned(s) => http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name), + name.repr_as_http02x_header_name().or_else(|name| { + name.into_maybe_static().and_then(|cow| { + if cow.chars().any(|c| c.is_uppercase()) { + return Err(HttpError::new("Header names must be all lower case")); + } + match cow { + Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), + Cow::Owned(s) => { + http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) + } + } }) }) } @@ -567,11 +610,12 @@ fn header_value(value: MaybeStatic) -> Result { http0::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)? } }; - HeaderValue::from_http03x(header).map_err(HttpError::new) + HeaderValue::from_http02x(header).map_err(HttpError::new) } #[cfg(test)] mod test { + use crate::client::orchestrator::HttpRequest; use aws_smithy_http::body::SdkBody; use http::header::{AUTHORIZATION, CONTENT_LENGTH}; use http::{HeaderValue, Uri}; @@ -585,6 +629,18 @@ mod test { .expect_err("cannot contain control characters"); } + #[test] + fn non_ascii_requests() { + let request = http::Request::builder() + .header("k", "😹") + .body(SdkBody::empty()) + .unwrap(); + let request: HttpRequest = request + .try_into() + .expect("failed to convert a non-string header"); + assert_eq!(request.headers().get("k"), Some("😹")) + } + #[test] fn request_can_be_created() { let req = http::Request::builder() @@ -596,7 +652,7 @@ mod test { assert_eq!(req.headers().get("a").unwrap(), "b"); req.headers_mut().append("a", "c"); assert_eq!(req.headers().get("a").unwrap(), "b"); - let http0 = req.into_http03x().unwrap(); + let http0 = req.into_http02x().unwrap(); assert_eq!(http0.uri(), "http://foo.com"); } @@ -610,7 +666,7 @@ mod test { assert_eq!(req.uri(), "http://foo.com/"); req.set_uri("http://bar.com").unwrap(); assert_eq!(req.uri(), "http://bar.com"); - let http0 = req.into_http03x().unwrap(); + let http0 = req.into_http02x().unwrap(); assert_eq!(http0.uri(), "http://bar.com"); } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index 63a54767d4a..8f976903c7a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -248,7 +248,7 @@ impl InterceptorContext { self.request.is_some(), "request must be set before calling enter_before_transmit_phase" ); - self.request_checkpoint = try_clone(self.request().expect("checked above")); + self.request_checkpoint = self.request().expect("checked above").try_clone(); self.phase = Phase::BeforeTransmit; } @@ -312,7 +312,7 @@ impl InterceptorContext { #[doc(hidden)] pub fn save_checkpoint(&mut self) { trace!("saving request checkpoint..."); - self.request_checkpoint = self.request().and_then(try_clone); + self.request_checkpoint = self.request().and_then(|r| r.try_clone()); match self.request_checkpoint.as_ref() { Some(_) => trace!("successfully saved request checkpoint"), None => trace!("failed to save request checkpoint: request body could not be cloned"), @@ -324,24 +324,21 @@ impl InterceptorContext { pub fn rewind(&mut self, _cfg: &mut ConfigBag) -> RewindResult { // If request_checkpoint was never set, but we've already made one attempt, // then this is not a retryable request - if self.request_checkpoint.is_none() && self.tainted { - return RewindResult::Impossible; - } - - if !self.tainted { - // The first call to rewind() happens before the request is ever touched, so we don't need - // to clone it then. However, the request must be marked as tainted so that subsequent calls - // to rewind() properly reload the saved request checkpoint. - self.tainted = true; - return RewindResult::Unnecessary; - } + let request_checkpoint = match (self.request_checkpoint.as_ref(), self.tainted) { + (None, true) => return RewindResult::Impossible, + (_, false) => { + self.tainted = true; + return RewindResult::Unnecessary; + } + (Some(req), _) => req.try_clone(), + }; // Otherwise, rewind to the saved request checkpoint self.phase = Phase::BeforeTransmit; - self.request = try_clone(self.request_checkpoint.as_ref().expect("checked above")); + self.request = request_checkpoint; assert!( self.request.is_some(), - "if the request wasn't cloneable, then we should have already return from this method." + "if the request wasn't cloneable, then we should have already returned from this method." ); self.response = None; self.output_or_error = None; @@ -428,21 +425,6 @@ impl fmt::Display for RewindResult { } } -fn try_clone(request: &HttpRequest) -> Option { - let cloned_body = request.body().try_clone()?; - let mut cloned_request = ::http::Request::builder() - .uri(request.uri().clone()) - .method(request.method()); - *cloned_request - .headers_mut() - .expect("builder has not been modified, headers must be valid") = request.headers().clone(); - Some( - cloned_request - .body(cloned_body) - .expect("a clone of a valid request should be a valid request"), - ) -} - #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; @@ -461,7 +443,7 @@ mod tests { context.enter_serialization_phase(); let _ = context.take_input(); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); context.enter_before_transmit_phase(); context.request(); @@ -506,6 +488,8 @@ mod tests { http::Request::builder() .header("test", "the-original-un-mutated-request") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(), ); context.enter_before_transmit_phase(); @@ -554,14 +538,16 @@ mod tests { #[test] fn try_clone_clones_all_data() { - let request = ::http::Request::builder() + let request: HttpRequest = http::Request::builder() .uri(Uri::from_static("https://www.amazon.com")) .method("POST") .header(CONTENT_LENGTH, 456) .header(AUTHORIZATION, "Token: hello") .body(SdkBody::from("hello world!")) - .expect("valid request"); - let cloned = try_clone(&request).expect("request is cloneable"); + .expect("valid request") + .try_into() + .unwrap(); + let cloned = request.try_clone().expect("request is cloneable"); assert_eq!(&Uri::from_static("https://www.amazon.com"), cloned.uri()); assert_eq!("POST", cloned.method()); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index bcafca33154..b59a69b0c97 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -28,7 +28,7 @@ use std::error::Error as StdError; use std::fmt; /// Type alias for the HTTP request type that the orchestrator uses. -pub type HttpRequest = http::Request; +pub type HttpRequest = crate::client::http::request::Request; /// Type alias for the HTTP response type that the orchestrator uses. pub type HttpResponse = http::Response; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 4260b6af816..07df586f7ae 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -446,13 +446,7 @@ mod tests { .http_client() .unwrap() .http_connector(&Default::default(), &fake_components) - .call( - http::Request::builder() - .method("GET") - .uri("/") - .body(SdkBody::empty()) - .unwrap(), - ) + .call(HttpRequest::empty()) .await .unwrap(); dbg!(&resp); diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 516c2e980a8..6850039a91c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -20,7 +20,6 @@ use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; use aws_smithy_types::base64::encode; use aws_smithy_types::config_bag::ConfigBag; -use http::header::HeaderName; use http::HeaderValue; /// Destination for the API key @@ -93,17 +92,22 @@ impl Sign for ApiKeySigner { .ok_or("HTTP ApiKey auth requires a `Token` identity")?; match self.location { ApiKeyLocation::Header => { - request.headers_mut().append( - HeaderName::try_from(&self.name).expect("valid API key header name"), - HeaderValue::try_from(format!("{} {}", self.scheme, api_key.token())).map_err( - |_| "API key contains characters that can't be included in a HTTP header", - )?, - ); + request + .headers_mut() + .try_append( + self.name.clone(), + format!("{} {}", self.scheme, api_key.token(),), + ) + .map_err(|_| { + "API key contains characters that can't be included in a HTTP header" + })?; } ApiKeyLocation::Query => { - let mut query = QueryWriter::new(request.uri()); + let mut query = QueryWriter::new_from_string(request.uri())?; query.insert(&self.name, api_key.token()); - *request.uri_mut() = query.build_uri(); + request + .set_uri(query.build_uri()) + .expect("query writer returns a valid URI") } } @@ -294,9 +298,11 @@ mod tests { let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Token::new("some-token", None), None); - let mut request = http::Request::builder() + let mut request: HttpRequest = http::Request::builder() .uri("http://example.com/Foobaz") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(); signer .sign_http_request( @@ -324,9 +330,11 @@ mod tests { let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Token::new("some-token", None), None); - let mut request = http::Request::builder() + let mut request: HttpRequest = http::Request::builder() .uri("http://example.com/Foobaz") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(); signer .sign_http_request( @@ -350,7 +358,11 @@ mod tests { let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Login::new("Aladdin", "open sesame", None), None); - let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); + let mut request = http::Request::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(); signer .sign_http_request( @@ -374,7 +386,11 @@ mod tests { let config_bag = ConfigBag::base(); let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let identity = Identity::new(Token::new("some-token", None), None); - let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); + let mut request = http::Request::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(); signer .sign_http_request( &mut request, diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index 3fa41fe3230..561ed7e6df3 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -57,8 +57,7 @@ impl Intercept for ConnectionPoisoningInterceptor { let capture_smithy_connection = CaptureSmithyConnection::new(); context .request_mut() - .extensions_mut() - .insert(capture_smithy_connection.clone()); + .add_extension(capture_smithy_connection.clone()); cfg.interceptor_state().store_put(capture_smithy_connection); Ok(()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 7d737352a99..541b11d6993 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -344,7 +344,10 @@ where C::Future: Unpin + Send + 'static, C::Error: Into, { - fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let mut request = request + .into_http02x() + .expect("TODO(httpRefactor): no panics"); let capture_connection = capture_connection(&mut request); if let Some(capture_smithy_connection) = request.extensions().get::() @@ -764,7 +767,6 @@ mod timeout_middleware { use aws_smithy_async::assert_elapsed; use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use hyper::client::connect::Connected; use std::time::Duration; @@ -875,12 +877,7 @@ mod timeout_middleware { let now = tokio::time::Instant::now(); tokio::time::pause(); let resp = hyper - .call( - http::Request::builder() - .uri("http://foo.com") - .body(SdkBody::empty()) - .unwrap(), - ) + .call(HttpRequest::get("https://static-uri.com").unwrap()) .await .unwrap_err(); assert!( @@ -913,12 +910,7 @@ mod timeout_middleware { let now = tokio::time::Instant::now(); tokio::time::pause(); let err = hyper - .call( - http::Request::builder() - .uri("http://foo.com") - .body(SdkBody::empty()) - .unwrap(), - ) + .call(HttpRequest::get("https://fake-uri.com").unwrap()) .await .unwrap_err(); assert!( @@ -940,7 +932,6 @@ mod timeout_middleware { mod test { use super::*; use crate::client::http::test_util::NeverTcpConnector; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use http::Uri; use hyper::client::connect::{Connected, Connection}; @@ -1011,12 +1002,7 @@ mod test { }; let adapter = HyperConnector::builder().build(connector).adapter; let err = adapter - .call( - http::Request::builder() - .uri("http://amazon.com") - .body(SdkBody::empty()) - .unwrap(), - ) + .call(HttpRequest::get("https://socket-hangup.com").unwrap()) .await .expect_err("socket hangup"); assert!(err.is_io(), "{:?}", err); diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index a4c5138dc5c..95a3b2be142 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -11,6 +11,7 @@ use aws_smithy_types::base64; use bytes::Bytes; +use http::HeaderMap; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -18,6 +19,8 @@ mod record; mod replay; pub use aws_smithy_protocol_test::MediaType; +use aws_smithy_runtime_api::client::http::request::Headers; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; pub use record::RecordingClient; pub use replay::ReplayingClient; @@ -93,10 +96,10 @@ impl From<&Request> for http::Request<()> { } } -impl<'a, B> From<&'a http::Request> for Request { - fn from(req: &'a http::Request) -> Self { +impl<'a> From<&'a HttpRequest> for Request { + fn from(req: &'a HttpRequest) -> Self { let uri = req.uri().to_string(); - let headers = headers_to_map(req.headers()); + let headers = headers_to_map_http(req.headers()); let method = req.method().to_string(); Self { uri, @@ -106,11 +109,24 @@ impl<'a, B> From<&'a http::Request> for Request { } } -fn headers_to_map(headers: &http::HeaderMap) -> HashMap> { +fn headers_to_map_http(headers: &Headers) -> HashMap> { let mut out: HashMap<_, Vec<_>> = HashMap::new(); for (header_name, header_value) in headers.iter() { let entry = out.entry(header_name.to_string()).or_default(); - entry.push(header_value.to_str().unwrap().to_string()); + entry.push(header_value.to_string()); + } + out +} + +fn headers_to_map_02x(headers: &HeaderMap) -> HashMap> { + let mut out: HashMap<_, Vec<_>> = HashMap::new(); + for (header_name, header_value) in headers.iter() { + let entry = out.entry(header_name.to_string()).or_default(); + entry.push( + std::str::from_utf8(header_value.as_ref()) + .unwrap() + .to_string(), + ); } out } @@ -119,7 +135,7 @@ impl<'a, B> From<&'a http::Response> for Response { fn from(resp: &'a http::Response) -> Self { let status = resp.status().as_u16(); let version = format!("{:?}", resp.version()); - let headers = headers_to_map(resp.headers()); + let headers = headers_to_map_02x(resp.headers()); Self { status, version, @@ -249,7 +265,7 @@ mod tests { let req = http::Request::post("https://www.example.com") .body(SdkBody::from("hello world")) .unwrap(); - let mut resp = connection.call(req).await.expect("ok"); + let mut resp = connection.call(req.try_into().unwrap()).await.expect("ok"); let body = std::mem::replace(resp.body_mut(), SdkBody::taken()); let data = ByteStream::new(body).collect().await.unwrap().into_bytes(); assert_eq!( diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index f9386e624d0..72c4d2d8618 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -126,8 +126,9 @@ impl ReplayingClient { ))? .take() .await; - aws_smithy_protocol_test::assert_uris_match(expected.uri(), actual.uri()); body_comparer(expected.body().as_ref(), actual.body().as_ref())?; + let actual: HttpRequest = actual.map(SdkBody::from).try_into()?; + aws_smithy_protocol_test::assert_uris_match(&expected.uri().to_string(), actual.uri()); let expected_headers = expected .headers() .keys() @@ -301,7 +302,10 @@ impl HttpConnector for ReplayingClient { data_read .extend_from_slice(data.expect("in memory request should not fail").as_ref()) } - request.map(|_| Bytes::from(data_read)) + request + .into_http02x() + .unwrap() + .map(|_body| Bytes::from(data_read)) }); let mut recorded_request = Waitable::Loading(recorded_request); let fut = async move { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs index 491f26c0e2f..3c4cea50653 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs @@ -60,7 +60,7 @@ impl InfallibleClientFn { impl HttpConnector for InfallibleClientFn { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { - HttpConnectorFuture::ready((self.response)(request)) + HttpConnectorFuture::ready((self.response)(request.into_http02x().unwrap())) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs index 6afff513d2d..979e911a4c1 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs @@ -146,7 +146,6 @@ async fn never_tcp_connector_plugs_into_hyper_014() { use super::*; use crate::client::http::hyper_014::HyperClientBuilder; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use std::time::Duration; @@ -164,12 +163,7 @@ async fn never_tcp_connector_plugs_into_hyper_014() { ); let err = http_connector - .call( - http::Request::builder() - .uri("https://example.com/") - .body(SdkBody::empty()) - .unwrap(), - ) + .call(HttpRequest::get("http://fakeuri.com").unwrap()) .await .expect_err("it should time out"); assert!(dbg!(err).is_timeout()); diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs index 55bd50434c6..0ad6623da5f 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs @@ -11,7 +11,7 @@ use aws_smithy_runtime_api::client::http::{ use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; -use http::header::{HeaderName, CONTENT_TYPE}; +use http::header::CONTENT_TYPE; use std::ops::Deref; use std::sync::{Arc, Mutex, MutexGuard}; @@ -29,8 +29,11 @@ pub struct ReplayEvent { impl ReplayEvent { /// Creates a new `ReplayEvent`. - pub fn new(request: HttpRequest, response: HttpResponse) -> Self { - Self { request, response } + pub fn new(request: impl TryInto, response: impl TryInto) -> Self { + Self { + request: request.try_into().ok().expect("invalid request"), + response: response.try_into().ok().expect("invalid response"), + } } /// Returns the test request. @@ -57,7 +60,7 @@ struct ValidateRequest { } impl ValidateRequest { - fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { + fn assert_matches(&self, index: usize, ignore_headers: &[&str]) { let (actual, expected) = (&self.actual, &self.expected); assert_eq!( actual.uri(), @@ -65,14 +68,13 @@ impl ValidateRequest { "Request #{index} - URI doesn't match expected value" ); for (name, value) in expected.headers() { - if !ignore_headers.contains(name) { + if !ignore_headers.contains(&name) { let actual_header = actual .headers() .get(name) .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); assert_eq!( - actual_header.to_str().unwrap(), - value.to_str().unwrap(), + actual_header, value, "Request #{index} - Header {name:?} doesn't match expected value", ); } @@ -82,7 +84,7 @@ impl ValidateRequest { let media_type = if actual .headers() .get(CONTENT_TYPE) - .map(|v| v.to_str().unwrap().contains("json")) + .map(|v| v.contains("json")) .unwrap_or(false) { MediaType::Json @@ -215,7 +217,7 @@ impl StaticReplayClient { /// A list of headers that should be ignored when comparing requests can be passed /// for cases where headers are non-deterministic or are irrelevant to the test. #[track_caller] - pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { + pub fn assert_requests_match(&self, ignore_headers: &[&str]) { for (i, req) in self.requests().iter().enumerate() { req.assert_matches(i, ignore_headers) } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 4be08b292ce..bc0fd973cc5 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -446,7 +446,7 @@ mod tests { use crate::client::test_util::{ deserializer::CannedResponseDeserializer, serializer::CannedRequestSerializer, }; - use ::http::{Request, Response, StatusCode}; + use ::http::{Response, StatusCode}; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ AuthSchemeOptionResolverParams, SharedAuthSchemeOptionResolver, @@ -477,11 +477,7 @@ mod tests { use tracing_test::traced_test; fn new_request_serializer() -> CannedRequestSerializer { - CannedRequestSerializer::success( - Request::builder() - .body(SdkBody::empty()) - .expect("request is valid"), - ) + CannedRequestSerializer::success(HttpRequest::empty()) } fn new_response_deserializer() -> CannedResponseDeserializer { diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 3575f659808..2aab26de849 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -138,7 +138,6 @@ fn extract_endpoint_auth_scheme_config( #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ AuthScheme, AuthSchemeId, AuthSchemeOptionResolverParams, SharedAuthScheme, @@ -179,7 +178,7 @@ mod tests { ) -> Result<(), BoxError> { request .headers_mut() - .insert(http::header::AUTHORIZATION, "success!".parse().unwrap()); + .insert(http::header::AUTHORIZATION, "success!"); Ok(()) } } @@ -209,7 +208,7 @@ mod tests { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); @@ -255,7 +254,7 @@ mod tests { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); @@ -304,7 +303,7 @@ mod tests { config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new("t", None)); let mut ctx = InterceptorContext::new(Input::erase("doesnt-matter")); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); orchestrate_auth(&mut ctx, &runtime_components, &cfg) diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 5fd1b2bae7a..30bbe3e9e38 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -4,10 +4,8 @@ */ use aws_smithy_http::endpoint::error::ResolveEndpointError; -use aws_smithy_http::endpoint::{ - apply_endpoint as apply_endpoint_to_request_uri, EndpointPrefix, ResolveEndpoint as _, - SharedEndpointResolver, -}; +use aws_smithy_http::endpoint::EndpointPrefix; +use aws_smithy_http::endpoint::SharedEndpointResolver; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::endpoint::{ EndpointFuture, EndpointResolverParams, ResolveEndpoint, @@ -18,7 +16,9 @@ use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; use http::header::HeaderName; +use http::uri::PathAndQuery; use http::{HeaderValue, Uri}; +use std::borrow::Cow; use std::fmt::Debug; use std::str::FromStr; use tracing::trace; @@ -102,6 +102,7 @@ where Params: Debug + Send + Sync + 'static, { fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> { + use aws_smithy_http::endpoint::ResolveEndpoint as _; let ep = match params.get::() { Some(params) => self.inner.resolve_endpoint(params).map_err(Box::new), None => Err(Box::new(ResolveEndpointError::message( @@ -144,17 +145,34 @@ fn apply_endpoint( endpoint: &Endpoint, endpoint_prefix: Option<&EndpointPrefix>, ) -> Result<(), BoxError> { - let uri: Uri = endpoint.url().parse().map_err(|err| { - ResolveEndpointError::from_source("endpoint did not have a valid uri", err) - })?; - - apply_endpoint_to_request_uri(request.uri_mut(), &uri, endpoint_prefix).map_err(|err| { - ResolveEndpointError::message(format!( - "failed to apply endpoint `{:?}` to request `{:?}`", - uri, request, - )) - .with_source(Some(err.into())) - })?; + let endpoint_url = match endpoint_prefix { + None => Cow::Borrowed(endpoint.url()), + Some(prefix) => { + let parsed = endpoint.url().parse::()?; + let scheme = parsed.scheme_str().unwrap_or_default(); + let prefix = prefix.as_str(); + let authority = parsed + .authority() + .map(|auth| auth.as_str()) + .unwrap_or_default(); + let path_and_query = parsed + .path_and_query() + .map(PathAndQuery::as_str) + .unwrap_or_default(); + Cow::Owned(format!("{scheme}://{prefix}{authority}{path_and_query}")) + } + }; + + request + .uri_mut() + .set_endpoint(&endpoint_url) + .map_err(|err| { + ResolveEndpointError::message(format!( + "failed to apply endpoint `{}` to request `{:?}`", + endpoint_url, request, + )) + .with_source(Some(err.into())) + })?; for (header_name, header_values) in endpoint.headers() { request.headers_mut().remove(header_name); @@ -173,3 +191,23 @@ fn apply_endpoint( } Ok(()) } + +#[cfg(test)] +mod test { + use aws_smithy_http::endpoint::EndpointPrefix; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_types::endpoint::Endpoint; + + #[test] + fn test_apply_endpoint() { + let mut req = HttpRequest::empty(); + req.set_uri("/foo?bar=1").unwrap(); + let endpoint = Endpoint::builder().url("https://s3.amazon.com").build(); + let prefix = EndpointPrefix::new("prefix.subdomain.").unwrap(); + super::apply_endpoint(&mut req, &endpoint, Some(&prefix)).expect("should succeed"); + assert_eq!( + req.uri(), + "https://prefix.subdomain.s3.amazon.com/foo?bar=1" + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index a90674ab433..b27ce9ff45e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -406,11 +406,7 @@ mod tests { .no_auth() .no_retry() .timeout_config(TimeoutConfig::disabled()) - .serializer(|input: String| { - Ok(http::Request::builder() - .body(SdkBody::from(input.as_bytes())) - .unwrap()) - }) + .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes())))) .deserializer::<_, Infallible>(|response| { assert_eq!(418, response.status()); Ok(std::str::from_utf8(response.body().bytes().unwrap()) @@ -426,7 +422,7 @@ mod tests { assert_eq!("I'm a teapot!", output); let request = request_rx.expect_request(); - assert_eq!("http://localhost:1234", request.uri()); + assert_eq!("http://localhost:1234/", request.uri()); assert_eq!(b"what are you?", request.body().bytes().unwrap()); } @@ -464,11 +460,7 @@ mod tests { .retry_classifier(HttpStatusCodeClassifier::default()) .timeout_config(TimeoutConfig::disabled()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .serializer(|input: String| { - Ok(http::Request::builder() - .body(SdkBody::from(input.as_bytes())) - .unwrap()) - }) + .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes())))) .deserializer::<_, Infallible>(|response| { if response.status() == 503 { Err(OrchestratorError::connector(ConnectorError::io( diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs index 2057690cc11..91cf73bdf71 100644 --- a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -151,6 +151,8 @@ async fn wire_level_test( .uri(endpoint_url.clone()) // Make the body non-replayable since we don't actually want to retry .body(SdkBody::from_dyn(BoxBody::new(SdkBody::from("body")))) + .unwrap() + .try_into() .unwrap(); tracing::info!("serializing request: {request:?}"); Ok(request) diff --git a/rust-runtime/inlineable/src/client_http_checksum_required.rs b/rust-runtime/inlineable/src/client_http_checksum_required.rs index 9336bd78898..7e65c65ebe3 100644 --- a/rust-runtime/inlineable/src/client_http_checksum_required.rs +++ b/rust-runtime/inlineable/src/client_http_checksum_required.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +use std::borrow::Cow; + use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; @@ -12,8 +14,6 @@ use aws_smithy_runtime_api::client::runtime_components::{ use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::base64; use aws_smithy_types::config_bag::ConfigBag; -use http::header::HeaderName; -use std::borrow::Cow; #[derive(Debug)] pub(crate) struct HttpChecksumRequiredRuntimePlugin { @@ -58,12 +58,9 @@ impl Intercept for HttpChecksumRequiredInterceptor { .bytes() .expect("checksum can only be computed for non-streaming operations"); let checksum = ::digest(body_bytes); - request.headers_mut().insert( - HeaderName::from_static("content-md5"), - base64::encode(&checksum[..]) - .parse() - .expect("checksum is a valid header value"), - ); + request + .headers_mut() + .insert("content-md5", base64::encode(&checksum[..])); Ok(()) } } diff --git a/tools/ci-scripts/check-aws-sdk-standalone-integration-tests b/tools/ci-scripts/check-aws-sdk-standalone-integration-tests index ad626ec1fa4..c331f9997b6 100755 --- a/tools/ci-scripts/check-aws-sdk-standalone-integration-tests +++ b/tools/ci-scripts/check-aws-sdk-standalone-integration-tests @@ -38,5 +38,5 @@ cp -r aws-sdk-smoketest "${tmp_dir}/aws/sdk/build/aws-sdk" find "${tmp_dir}" pushd "${tmp_dir}/aws/sdk/integration-tests" -cargo check --tests +cargo check --tests --all-features popd diff --git a/tools/ci-scripts/check-rust-runtimes b/tools/ci-scripts/check-rust-runtimes index 034fc35d8e1..68a47eba5d0 100755 --- a/tools/ci-scripts/check-rust-runtimes +++ b/tools/ci-scripts/check-rust-runtimes @@ -8,6 +8,9 @@ C_YELLOW='\033[1;33m' C_RESET='\033[0m' set -eux + +: "$RUST_NIGHTLY_VERSION" + cd smithy-rs for runtime_path in \ From 068ad03975312ff12f5cfb06e104f06ee6e0b966 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 16 Oct 2023 16:34:51 -0700 Subject: [PATCH 178/331] Implement `SsoTokenProvider` (#2917) This PR adds a `SsoTokenProvider` that loads session name cached SSO tokens, and automatically refreshes them when possible. The `SsoCredentialsProvider` is updated to use this new `SsoTokenProvider` so that it is now compatible with the latest AWS CLI. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci-tls.yml | 2 +- .github/workflows/pull-request-bot.yml | 2 +- CHANGELOG.next.toml | 18 + aws/rust-runtime/aws-config/Cargo.toml | 11 +- .../aws-config/external-types.toml | 1 + .../src/default_provider/credentials.rs | 12 +- .../aws-config/src/imds/client/token.rs | 6 +- aws/rust-runtime/aws-config/src/lib.rs | 2 +- .../src/profile/credentials/exec.rs | 12 +- aws/rust-runtime/aws-config/src/sso.rs | 442 +---- aws/rust-runtime/aws-config/src/sso/cache.rs | 594 ++++++ .../aws-config/src/sso/credentials.rs | 292 +++ aws/rust-runtime/aws-config/src/sso/token.rs | 865 +++++++++ aws/rust-runtime/aws-runtime/src/identity.rs | 7 +- aws/rust-runtime/aws-types/Cargo.toml | 3 +- .../aws-types/src/os_shim_internal.rs | 74 +- .../software/amazon/smithy/rustsdk/AwsDocs.kt | 3 +- aws/sdk/aws-models/sso-oidc.json | 1590 +++++++++++++++++ .../src/client/identity.rs | 15 +- .../src/client/identity/http.rs | 13 +- .../src/client/runtime_components.rs | 6 +- .../src/client/auth/http.rs | 28 + .../src/client/identity/no_auth.rs | 7 +- .../src/client/orchestrator/auth.rs | 12 +- 24 files changed, 3537 insertions(+), 480 deletions(-) create mode 100644 aws/rust-runtime/aws-config/src/sso/cache.rs create mode 100644 aws/rust-runtime/aws-config/src/sso/credentials.rs create mode 100644 aws/rust-runtime/aws-config/src/sso/token.rs create mode 100644 aws/sdk/aws-models/sso-oidc.json diff --git a/.github/workflows/ci-tls.yml b/.github/workflows/ci-tls.yml index 8c70d2b2e87..68a88674051 100644 --- a/.github/workflows/ci-tls.yml +++ b/.github/workflows/ci-tls.yml @@ -59,7 +59,7 @@ jobs: run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badssl - name: Build SDK working-directory: smithy-rs - run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso + run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso,+ssooidc - name: Build trytls shell: bash working-directory: trytls diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 19978590644..2f0bf5c33c9 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -106,7 +106,7 @@ jobs: # included since aws-config depends on them. Transcribe Streaming and DynamoDB (paginators/waiters) were chosen # below to stay small while still representing most features. Combined, they are about ~20MB at time of writing. run: | - ./gradlew -Paws.services=+sts,+sso,+transcribestreaming,+dynamodb :aws:sdk:assemble + ./gradlew -Paws.services=+sts,+sso,+ssooidc,+transcribestreaming,+dynamodb :aws:sdk:assemble # Copy the Server runtime crate(s) in cp -r rust-runtime/aws-smithy-http-server rust-runtime/aws-smithy-http-server-python rust-runtime/aws-smithy-http-server-typescript aws/sdk/build/aws-sdk/sdk diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 120add9bb88..b1a59c806c2 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,6 +11,18 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" +[[aws-sdk-rust]] +message = "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`." +references = ["smithy-rs#2917"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[aws-sdk-rust]] +message = "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses." +references = ["smithy-rs#2917", "aws-sdk-rust#703", "aws-sdk-rust#699"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "jdisanti" + [[smithy-rs]] message = "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details." references = ["smithy-rs#3011"] @@ -390,3 +402,9 @@ message = "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/pre references = ["smithy-rs#3059"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "rcoh" + +[[smithy-rs]] +message = "`RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function." +references = ["smithy-rs#2917"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 3c43472b1d3..8e40611d289 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -13,9 +13,9 @@ client-hyper = ["aws-smithy-runtime/connector-hyper-0-14-x"] rustls = ["aws-smithy-runtime/tls-rustls", "client-hyper"] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI rt-tokio = ["aws-smithy-async/rt-tokio", "aws-smithy-runtime/rt-tokio", "tokio/rt"] -credentials-sso = ["dep:aws-sdk-sso", "dep:ring", "dep:hex", "dep:zeroize"] +sso = ["dep:aws-sdk-sso", "dep:aws-sdk-ssooidc", "dep:ring", "dep:hex", "dep:zeroize", "aws-smithy-runtime-api/http-auth"] -default = ["client-hyper", "rustls", "rt-tokio", "credentials-sso"] +default = ["client-hyper", "rustls", "rt-tokio"] [dependencies] aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types" } @@ -46,8 +46,13 @@ ring = { version = "0.16", optional = true } hex = { version = "0.4.3", optional = true } zeroize = { version = "1", optional = true } +# implementation detail of SSO OIDC `CreateToken` for SSO token providers +aws-sdk-ssooidc = { path = "../../sdk/build/aws-sdk/sdk/ssooidc", default-features = false, optional = true } + [dev-dependencies] +aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x", "test-util"] } +aws-smithy-runtime-api = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } futures-util = { version = "0.3.16", default-features = false } tracing-test = "0.2.1" tracing-subscriber = { version = "0.3.16", features = ["fmt", "json"] } @@ -61,8 +66,6 @@ arbitrary = "1.3" serde = { version = "1", features = ["derive"] } serde_json = "1" -aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } - # used for a usage example hyper-rustls = { version = "0.24", features = ["webpki-tokio", "http2", "http1"] } aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async", features = ["rt-tokio", "test-util"] } diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index 95ccecc43ec..94002d550d6 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -20,6 +20,7 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::dns::SharedDnsResolver", "aws_smithy_runtime_api::client::http::HttpClient", "aws_smithy_runtime_api::client::http::SharedHttpClient", + "aws_smithy_runtime_api::client::identity::ResolveIdentity", "aws_smithy_types::retry", "aws_smithy_types::retry::*", "aws_smithy_types::timeout", diff --git a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs index 13636e7d14e..7c9aaa06e71 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs @@ -295,15 +295,15 @@ mod test { make_test!(ecs_credentials); make_test!(ecs_credentials_invalid_profile); - #[cfg(not(feature = "credentials-sso"))] - make_test!(sso_assume_role #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: credentials-sso")]); - #[cfg(not(feature = "credentials-sso"))] - make_test!(sso_no_token_file #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: credentials-sso")]); + #[cfg(not(feature = "sso"))] + make_test!(sso_assume_role #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: sso")]); + #[cfg(not(feature = "sso"))] + make_test!(sso_no_token_file #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: sso")]); - #[cfg(feature = "credentials-sso")] + #[cfg(feature = "sso")] make_test!(sso_assume_role); - #[cfg(feature = "credentials-sso")] + #[cfg(feature = "sso")] make_test!(sso_no_token_file); #[cfg(feature = "credentials-sso")] diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index f5b609b9413..76b286583d1 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -194,7 +194,11 @@ fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { IdentityFuture::new(async { let preloaded_token = self .inner diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index ba1cb953d84..a12dea2a3b0 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -121,7 +121,7 @@ pub mod meta; pub mod profile; pub mod provider_config; pub mod retry; -#[cfg(feature = "credentials-sso")] +#[cfg(feature = "sso")] pub mod sso; pub(crate) mod standard_property; pub mod sts; diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs index c6108a18f18..d393e946994 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs @@ -7,8 +7,6 @@ use super::repr::{self, BaseProvider}; use crate::credential_process::CredentialProcessProvider; use crate::profile::credentials::ProfileFileError; use crate::provider_config::ProviderConfig; -#[cfg(feature = "credentials-sso")] -use crate::sso::{SsoCredentialsProvider, SsoProviderConfig}; use crate::sts; use crate::web_identity_token::{StaticConfiguration, WebIdentityTokenCredentialsProvider}; use aws_credential_types::provider::{ @@ -119,21 +117,25 @@ impl ProviderChain { sso_role_name, sso_start_url, } => { - #[cfg(feature = "credentials-sso")] + #[cfg(feature = "sso")] { + use crate::sso::{credentials::SsoProviderConfig, SsoCredentialsProvider}; use aws_types::region::Region; + let sso_config = SsoProviderConfig { account_id: sso_account_id.to_string(), role_name: sso_role_name.to_string(), start_url: sso_start_url.to_string(), region: Region::new(sso_region.to_string()), + // TODO(https://github.com/awslabs/aws-sdk-rust/issues/703): Implement sso_session_name profile property + session_name: None, }; Arc::new(SsoCredentialsProvider::new(provider_config, sso_config)) } - #[cfg(not(feature = "credentials-sso"))] + #[cfg(not(feature = "sso"))] { Err(ProfileFileError::FeatureNotEnabled { - feature: "credentials-sso".into(), + feature: "sso".into(), })? } } diff --git a/aws/rust-runtime/aws-config/src/sso.rs b/aws/rust-runtime/aws-config/src/sso.rs index fae2248b35f..69ed37ed0fc 100644 --- a/aws/rust-runtime/aws-config/src/sso.rs +++ b/aws/rust-runtime/aws-config/src/sso.rs @@ -3,444 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! SSO Credentials Provider -//! -//! This credentials provider enables loading credentials from `~/.aws/sso/cache`. For more information, -//! see [Using AWS SSO Credentials](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/sso-credentials.html) -//! -//! This provider is included automatically when profiles are loaded. +//! SSO Credentials and Token providers -use crate::fs_util::{home_dir, Os}; -use crate::json_credentials::{json_parse_loop, InvalidJsonCredentials}; -use crate::provider_config::ProviderConfig; -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; -use aws_credential_types::Credentials; -use aws_sdk_sso::types::RoleCredentials; -use aws_sdk_sso::Client as SsoClient; -use aws_smithy_json::deserialize::Token; -use aws_smithy_types::date_time::Format; -use aws_smithy_types::DateTime; -use aws_types::os_shim_internal::{Env, Fs}; -use aws_types::region::Region; -use aws_types::SdkConfig; -use ring::digest; -use std::convert::TryInto; -use std::error::Error; -use std::fmt::{Display, Formatter}; -use std::io; -use std::path::PathBuf; -use zeroize::Zeroizing; +pub mod credentials; -/// SSO Credentials Provider -/// -/// _Note: This provider is part of the default credentials chain and is integrated with the profile-file provider._ -/// -/// This credentials provider will use cached SSO tokens stored in `~/.aws/sso/cache/.json`. -/// `` is computed based on the configured [`start_url`](Builder::start_url). -#[derive(Debug)] -pub struct SsoCredentialsProvider { - fs: Fs, - env: Env, - sso_provider_config: SsoProviderConfig, - sdk_config: SdkConfig, -} +pub use credentials::SsoCredentialsProvider; -impl SsoCredentialsProvider { - /// Creates a builder for [`SsoCredentialsProvider`] - pub fn builder() -> Builder { - Builder::new() - } +pub mod token; - pub(crate) fn new( - provider_config: &ProviderConfig, - sso_provider_config: SsoProviderConfig, - ) -> Self { - let fs = provider_config.fs(); - let env = provider_config.env(); +pub use token::SsoTokenProvider; - SsoCredentialsProvider { - fs, - env, - sso_provider_config, - sdk_config: provider_config.client_config(), - } - } - - async fn credentials(&self) -> provider::Result { - load_sso_credentials( - &self.sso_provider_config, - &self.sdk_config, - &self.env, - &self.fs, - ) - .await - } -} - -impl ProvideCredentials for SsoCredentialsProvider { - fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::new(self.credentials()) - } -} - -/// Builder for [`SsoCredentialsProvider`] -#[derive(Default, Debug, Clone)] -pub struct Builder { - provider_config: Option, - account_id: Option, - role_name: Option, - start_url: Option, - region: Option, -} - -impl Builder { - /// Create a new builder for [`SsoCredentialsProvider`] - pub fn new() -> Self { - Self::default() - } - - /// Override the configuration used for this provider - pub fn configure(mut self, provider_config: &ProviderConfig) -> Self { - self.provider_config = Some(provider_config.clone()); - self - } - - /// Set the account id used for SSO - pub fn account_id(mut self, account_id: impl Into) -> Self { - self.account_id = Some(account_id.into()); - self - } - - /// Set the role name used for SSO - pub fn role_name(mut self, role_name: impl Into) -> Self { - self.role_name = Some(role_name.into()); - self - } - - /// Set the start URL used for SSO - pub fn start_url(mut self, start_url: impl Into) -> Self { - self.start_url = Some(start_url.into()); - self - } - - /// Set the region used for SSO - pub fn region(mut self, region: Region) -> Self { - self.region = Some(region); - self - } - - /// Construct an SsoCredentialsProvider from the builder - /// - /// # Panics - /// This method will panic if the any of the following required fields are unset: - /// - [`start_url`](Self::start_url) - /// - [`role_name`](Self::role_name) - /// - [`account_id`](Self::account_id) - /// - [`region`](Self::region) - pub fn build(self) -> SsoCredentialsProvider { - let provider_config = self.provider_config.unwrap_or_default(); - let sso_config = SsoProviderConfig { - account_id: self.account_id.expect("account_id must be set"), - role_name: self.role_name.expect("role_name must be set"), - start_url: self.start_url.expect("start_url must be set"), - region: self.region.expect("region must be set"), - }; - SsoCredentialsProvider::new(&provider_config, sso_config) - } -} - -#[derive(Debug)] -pub(crate) enum LoadTokenError { - InvalidCredentials(InvalidJsonCredentials), - NoHomeDirectory, - IoError { err: io::Error, path: PathBuf }, -} - -impl Display for LoadTokenError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self { - LoadTokenError::InvalidCredentials(err) => { - write!(f, "SSO Token was invalid (expected JSON): {}", err) - } - LoadTokenError::NoHomeDirectory => write!(f, "Could not resolve a home directory"), - LoadTokenError::IoError { err, path } => { - write!(f, "failed to read `{}`: {}", path.display(), err) - } - } - } -} - -impl Error for LoadTokenError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - LoadTokenError::InvalidCredentials(err) => Some(err as _), - LoadTokenError::NoHomeDirectory => None, - LoadTokenError::IoError { err, .. } => Some(err as _), - } - } -} - -#[derive(Debug)] -pub(crate) struct SsoProviderConfig { - pub(crate) account_id: String, - pub(crate) role_name: String, - pub(crate) start_url: String, - pub(crate) region: Region, -} - -async fn load_sso_credentials( - sso_provider_config: &SsoProviderConfig, - sdk_config: &SdkConfig, - env: &Env, - fs: &Fs, -) -> provider::Result { - let token = load_token(&sso_provider_config.start_url, env, fs) - .await - .map_err(CredentialsError::provider_error)?; - let config = sdk_config - .to_builder() - .region(sso_provider_config.region.clone()) - .credentials_cache(CredentialsCache::no_caching()) - .build(); - // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed - let client = SsoClient::new(&config); - let resp = client - .get_role_credentials() - .role_name(&sso_provider_config.role_name) - .access_token(&*token.access_token) - .account_id(&sso_provider_config.account_id) - .send() - .await - .map_err(CredentialsError::provider_error)?; - let credentials: RoleCredentials = resp - .role_credentials - .ok_or_else(|| CredentialsError::unhandled("SSO did not return credentials"))?; - let akid = credentials - .access_key_id - .ok_or_else(|| CredentialsError::unhandled("no access key id in response"))?; - let secret_key = credentials - .secret_access_key - .ok_or_else(|| CredentialsError::unhandled("no secret key in response"))?; - let expiration = DateTime::from_millis(credentials.expiration) - .try_into() - .map_err(|err| { - CredentialsError::unhandled(format!( - "expiration could not be converted into a system time: {}", - err - )) - })?; - Ok(Credentials::new( - akid, - secret_key, - credentials.session_token, - Some(expiration), - "SSO", - )) -} - -/// Load the token for `start_url` from `~/.aws/sso/cache/.json` -async fn load_token(start_url: &str, env: &Env, fs: &Fs) -> Result { - let home = home_dir(env, Os::real()).ok_or(LoadTokenError::NoHomeDirectory)?; - let path = sso_token_path(start_url, &home); - let data = - Zeroizing::new( - fs.read_to_end(&path) - .await - .map_err(|err| LoadTokenError::IoError { - err, - path: path.to_path_buf(), - })?, - ); - let token = parse_token_json(&data).map_err(LoadTokenError::InvalidCredentials)?; - Ok(token) -} - -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct SsoToken { - access_token: Zeroizing, - expires_at: DateTime, - region: Option, -} - -/// Parse SSO token JSON from input -fn parse_token_json(input: &[u8]) -> Result { - /* - Example: - { - "accessToken": "base64string", - "expiresAt": "2019-11-14T04:05:45Z", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }*/ - let mut acccess_token = None; - let mut expires_at = None; - let mut region = None; - let mut start_url = None; - json_parse_loop(input, |key, value| { - match (key, value) { - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("accessToken") => { - acccess_token = Some(value.to_unescaped()?.to_string()) - } - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("expiresAt") => { - expires_at = Some(value.to_unescaped()?) - } - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("region") => { - region = Some(value.to_unescaped()?.to_string()) - } - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("startUrl") => { - start_url = Some(value.to_unescaped()?.to_string()) - } - _other => {} // ignored - }; - Ok(()) - })?; - let access_token = - Zeroizing::new(acccess_token.ok_or(InvalidJsonCredentials::MissingField("accessToken"))?); - let expires_at = expires_at.ok_or(InvalidJsonCredentials::MissingField("expiresAt"))?; - let expires_at = DateTime::from_str(expires_at.as_ref(), Format::DateTime).map_err(|e| { - InvalidJsonCredentials::InvalidField { - field: "expiresAt", - err: e.into(), - } - })?; - let region = region.map(Region::new); - Ok(SsoToken { - access_token, - expires_at, - region, - }) -} - -/// Determine the SSO token path for a given start_url -fn sso_token_path(start_url: &str, home: &str) -> PathBuf { - // hex::encode returns a lowercase string - let mut out = PathBuf::with_capacity(home.len() + "/.aws/sso/cache".len() + ".json".len() + 40); - out.push(home); - out.push(".aws/sso/cache"); - out.push(&hex::encode(digest::digest( - &digest::SHA1_FOR_LEGACY_USE_ONLY, - start_url.as_bytes(), - ))); - out.set_extension("json"); - out -} - -#[cfg(test)] -mod test { - use crate::json_credentials::InvalidJsonCredentials; - use crate::sso::{load_token, parse_token_json, sso_token_path, LoadTokenError, SsoToken}; - use aws_smithy_types::DateTime; - use aws_types::os_shim_internal::{Env, Fs}; - use aws_types::region::Region; - use zeroize::Zeroizing; - - #[test] - fn deserialize_valid_tokens() { - let token = br#" - { - "accessToken": "base64string", - "expiresAt": "2009-02-13T23:31:30Z", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - assert_eq!( - parse_token_json(token).expect("valid"), - SsoToken { - access_token: Zeroizing::new("base64string".into()), - expires_at: DateTime::from_secs(1234567890), - region: Some(Region::from_static("us-west-2")) - } - ); - - let no_region = br#"{ - "accessToken": "base64string", - "expiresAt": "2009-02-13T23:31:30Z" - }"#; - assert_eq!( - parse_token_json(no_region).expect("valid"), - SsoToken { - access_token: Zeroizing::new("base64string".into()), - expires_at: DateTime::from_secs(1234567890), - region: None - } - ); - } - - #[test] - fn invalid_timestamp() { - let token = br#" - { - "accessToken": "base64string", - "expiresAt": "notatimestamp", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - let err = parse_token_json(token).expect_err("invalid timestamp"); - assert!( - format!("{}", err).contains("Invalid field in response: `expiresAt`."), - "{}", - err - ); - } - - #[test] - fn missing_fields() { - let token = br#" - { - "expiresAt": "notatimestamp", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - let err = parse_token_json(token).expect_err("missing akid"); - assert!( - matches!(err, InvalidJsonCredentials::MissingField("accessToken")), - "incorrect error: {:?}", - err - ); - - let token = br#" - { - "accessToken": "akid", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - let err = parse_token_json(token).expect_err("missing expiry"); - assert!( - matches!(err, InvalidJsonCredentials::MissingField("expiresAt")), - "incorrect error: {:?}", - err - ); - } - - #[test] - fn determine_correct_cache_filenames() { - assert_eq!( - sso_token_path("https://d-92671207e4.awsapps.com/start", "/home/me").as_os_str(), - "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json" - ); - assert_eq!( - sso_token_path("https://d-92671207e4.awsapps.com/start", "/home/me/").as_os_str(), - "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json" - ); - } - - #[tokio::test] - async fn gracefully_handle_missing_files() { - let err = load_token( - "asdf", - &Env::from_slice(&[("HOME", "/home")]), - &Fs::from_slice(&[]), - ) - .await - .expect_err("should fail, file is missing"); - assert!( - matches!(err, LoadTokenError::IoError { .. }), - "should be io error, got {}", - err - ); - } -} +mod cache; diff --git a/aws/rust-runtime/aws-config/src/sso/cache.rs b/aws/rust-runtime/aws-config/src/sso/cache.rs new file mode 100644 index 00000000000..5d78798f87d --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sso/cache.rs @@ -0,0 +1,594 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::fs_util::{home_dir, Os}; +use aws_smithy_json::deserialize::token::skip_value; +use aws_smithy_json::deserialize::Token; +use aws_smithy_json::deserialize::{json_token_iter, EscapeError}; +use aws_smithy_json::serialize::JsonObjectWriter; +use aws_smithy_types::date_time::{DateTimeFormatError, Format}; +use aws_smithy_types::DateTime; +use aws_types::os_shim_internal::{Env, Fs}; +use ring::digest; +use std::borrow::Cow; +use std::error::Error as StdError; +use std::fmt; +use std::path::PathBuf; +use std::time::SystemTime; +use zeroize::Zeroizing; + +#[cfg_attr(test, derive(Eq, PartialEq))] +#[derive(Clone)] +pub(super) struct CachedSsoToken { + pub(super) access_token: Zeroizing, + pub(super) client_id: Option, + pub(super) client_secret: Option>, + pub(super) expires_at: SystemTime, + pub(super) refresh_token: Option>, + pub(super) region: Option, + pub(super) registration_expires_at: Option, + pub(super) start_url: Option, +} + +impl CachedSsoToken { + /// True if the information required to refresh this token is present. + /// + /// The expiration times are not considered by this function. + pub(super) fn refreshable(&self) -> bool { + self.client_id.is_some() + && self.client_secret.is_some() + && self.refresh_token.is_some() + && self.registration_expires_at.is_some() + } +} + +impl fmt::Debug for CachedSsoToken { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("CachedSsoToken") + .field("access_token", &"** redacted **") + .field("client_id", &self.client_id) + .field("client_secret", &"** redacted **") + .field("expires_at", &self.expires_at) + .field("refresh_token", &"** redacted **") + .field("region", &self.region) + .field("registration_expires_at", &self.registration_expires_at) + .field("start_url", &self.start_url) + .finish() + } +} + +#[derive(Debug)] +pub(super) enum CachedSsoTokenError { + FailedToFormatDateTime { + source: Box, + }, + InvalidField { + field: &'static str, + source: Box, + }, + IoError { + what: &'static str, + path: PathBuf, + source: std::io::Error, + }, + JsonError(Box), + MissingField(&'static str), + NoHomeDirectory, + Other(Cow<'static, str>), +} + +impl fmt::Display for CachedSsoTokenError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::FailedToFormatDateTime { .. } => write!(f, "failed to format date time"), + Self::InvalidField { field, .. } => write!( + f, + "invalid value for the `{field}` field in the cached SSO token file" + ), + Self::IoError { what, path, .. } => write!(f, "failed to {what} `{}`", path.display()), + Self::JsonError(_) => write!(f, "invalid JSON in cached SSO token file"), + Self::MissingField(field) => { + write!(f, "missing field `{field}` in cached SSO token file") + } + Self::NoHomeDirectory => write!(f, "couldn't resolve a home directory"), + Self::Other(message) => f.write_str(message), + } + } +} + +impl StdError for CachedSsoTokenError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + match self { + Self::FailedToFormatDateTime { source } => Some(source.as_ref()), + Self::InvalidField { source, .. } => Some(source.as_ref()), + Self::IoError { source, .. } => Some(source), + Self::JsonError(source) => Some(source.as_ref()), + Self::MissingField(_) => None, + Self::NoHomeDirectory => None, + Self::Other(_) => None, + } + } +} + +impl From for CachedSsoTokenError { + fn from(err: EscapeError) -> Self { + Self::JsonError(err.into()) + } +} + +impl From for CachedSsoTokenError { + fn from(err: aws_smithy_json::deserialize::error::DeserializeError) -> Self { + Self::JsonError(err.into()) + } +} + +impl From for CachedSsoTokenError { + fn from(value: DateTimeFormatError) -> Self { + Self::FailedToFormatDateTime { + source: value.into(), + } + } +} + +/// Determine the SSO cached token path for a given identifier. +/// +/// The `identifier` is the `sso_start_url` for credentials providers, and `sso_session_name` for token providers. +fn cached_token_path(identifier: &str, home: &str) -> PathBuf { + // hex::encode returns a lowercase string + let mut out = PathBuf::with_capacity(home.len() + "/.aws/sso/cache".len() + ".json".len() + 40); + out.push(home); + out.push(".aws/sso/cache"); + out.push(&hex::encode(digest::digest( + &digest::SHA1_FOR_LEGACY_USE_ONLY, + identifier.as_bytes(), + ))); + out.set_extension("json"); + out +} + +/// Load the token for `identifier` from `~/.aws/sso/cache/.json` +/// +/// The `identifier` is the `sso_start_url` for credentials providers, and `sso_session_name` for token providers. +pub(super) async fn load_cached_token( + env: &Env, + fs: &Fs, + identifier: &str, +) -> Result { + let home = home_dir(env, Os::real()).ok_or(CachedSsoTokenError::NoHomeDirectory)?; + let path = cached_token_path(identifier, &home); + let data = Zeroizing::new(fs.read_to_end(&path).await.map_err(|source| { + CachedSsoTokenError::IoError { + what: "read", + path, + source, + } + })?); + parse_cached_token(&data) +} + +/// Parse SSO token JSON from input +fn parse_cached_token( + cached_token_file_contents: &[u8], +) -> Result { + use CachedSsoTokenError as Error; + + let mut access_token = None; + let mut expires_at = None; + let mut client_id = None; + let mut client_secret = None; + let mut refresh_token = None; + let mut region = None; + let mut registration_expires_at = None; + let mut start_url = None; + json_parse_loop(cached_token_file_contents, |key, value| { + match (key, value) { + /* + // Required fields: + "accessToken": "string", + "expiresAt": "2019-11-14T04:05:45Z", + + // Optional fields: + "refreshToken": "string", + "clientId": "ABCDEFG323242423121312312312312312", + "clientSecret": "ABCDE123", + "registrationExpiresAt": "2022-03-06T19:53:17Z", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + */ + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("accessToken") => { + access_token = Some(Zeroizing::new(value.to_unescaped()?.into_owned())); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("expiresAt") => { + expires_at = Some(value.to_unescaped()?); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("clientId") => { + client_id = Some(value.to_unescaped()?); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("clientSecret") => { + client_secret = Some(Zeroizing::new(value.to_unescaped()?.into_owned())); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("refreshToken") => { + refresh_token = Some(Zeroizing::new(value.to_unescaped()?.into_owned())); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("region") => { + region = Some(value.to_unescaped()?.into_owned()); + } + (key, Token::ValueString { value, .. }) + if key.eq_ignore_ascii_case("registrationExpiresAt") => + { + registration_expires_at = Some(value.to_unescaped()?); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("startUrl") => { + start_url = Some(value.to_unescaped()?.into_owned()); + } + _ => {} + }; + Ok(()) + })?; + + Ok(CachedSsoToken { + access_token: access_token.ok_or(Error::MissingField("accessToken"))?, + expires_at: expires_at + .ok_or(Error::MissingField("expiresAt")) + .and_then(|expires_at| { + DateTime::from_str(expires_at.as_ref(), Format::DateTime) + .map_err(|err| Error::InvalidField { field: "expiresAt", source: err.into() }) + .and_then(|date_time| { + SystemTime::try_from(date_time).map_err(|_| { + Error::Other( + "SSO token expiration time cannot be represented by a SystemTime" + .into(), + ) + }) + }) + })?, + client_id: client_id.map(Cow::into_owned), + client_secret, + refresh_token, + region, + registration_expires_at: Ok(registration_expires_at).and_then(|maybe_expires_at| { + if let Some(expires_at) = maybe_expires_at { + Some( + DateTime::from_str(expires_at.as_ref(), Format::DateTime) + .map_err(|err| Error::InvalidField { field: "registrationExpiresAt", source: err.into()}) + .and_then(|date_time| { + SystemTime::try_from(date_time).map_err(|_| { + Error::Other( + "SSO registration expiration time cannot be represented by a SystemTime" + .into(), + ) + }) + }), + ) + .transpose() + } else { + Ok(None) + } + })?, + start_url, + }) +} + +fn json_parse_loop<'a>( + input: &'a [u8], + mut f: impl FnMut(Cow<'a, str>, &Token<'a>) -> Result<(), CachedSsoTokenError>, +) -> Result<(), CachedSsoTokenError> { + use CachedSsoTokenError as Error; + let mut tokens = json_token_iter(input).peekable(); + if !matches!(tokens.next().transpose()?, Some(Token::StartObject { .. })) { + return Err(Error::Other( + "expected a JSON document starting with `{`".into(), + )); + } + loop { + match tokens.next().transpose()? { + Some(Token::EndObject { .. }) => break, + Some(Token::ObjectKey { key, .. }) => { + if let Some(Ok(token)) = tokens.peek() { + let key = key.to_unescaped()?; + f(key, token)? + } + skip_value(&mut tokens)?; + } + other => { + return Err(Error::Other( + format!("expected object key, found: {:?}", other).into(), + )); + } + } + } + if tokens.next().is_some() { + return Err(Error::Other( + "found more JSON tokens after completing parsing".into(), + )); + } + Ok(()) +} + +pub(super) async fn save_cached_token( + env: &Env, + fs: &Fs, + identifier: &str, + token: &CachedSsoToken, +) -> Result<(), CachedSsoTokenError> { + let expires_at = DateTime::from(token.expires_at).fmt(Format::DateTime)?; + let registration_expires_at = token + .registration_expires_at + .map(|time| DateTime::from(time).fmt(Format::DateTime)) + .transpose()?; + + let mut out = Zeroizing::new(String::new()); + let mut writer = JsonObjectWriter::new(&mut out); + writer.key("accessToken").string(&token.access_token); + writer.key("expiresAt").string(&expires_at); + if let Some(refresh_token) = &token.refresh_token { + writer.key("refreshToken").string(refresh_token); + } + if let Some(client_id) = &token.client_id { + writer.key("clientId").string(client_id); + } + if let Some(client_secret) = &token.client_secret { + writer.key("clientSecret").string(client_secret); + } + if let Some(registration_expires_at) = registration_expires_at { + writer + .key("registrationExpiresAt") + .string(®istration_expires_at); + } + if let Some(region) = &token.region { + writer.key("region").string(region); + } + if let Some(start_url) = &token.start_url { + writer.key("startUrl").string(start_url); + } + writer.finish(); + + let home = home_dir(env, Os::real()).ok_or(CachedSsoTokenError::NoHomeDirectory)?; + let path = cached_token_path(identifier, &home); + fs.write(&path, out.as_bytes()) + .await + .map_err(|err| CachedSsoTokenError::IoError { + what: "write", + path, + source: err, + })?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + use std::time::Duration; + + #[test] + fn redact_fields_in_token_debug() { + let token = CachedSsoToken { + access_token: Zeroizing::new("!!SENSITIVE!!".into()), + client_id: Some("clientid".into()), + client_secret: Some(Zeroizing::new("!!SENSITIVE!!".into())), + expires_at: SystemTime::now(), + refresh_token: Some(Zeroizing::new("!!SENSITIVE!!".into())), + region: Some("region".into()), + registration_expires_at: Some(SystemTime::now()), + start_url: Some("starturl".into()), + }; + let debug_str = format!("{:?}", token); + assert!(!debug_str.contains("!!SENSITIVE!!"), "The `Debug` impl for `CachedSsoToken` isn't properly redacting sensitive fields: {debug_str}"); + } + + // Valid token with all fields + #[test] + fn parse_valid_token() { + let file_contents = r#" + { + "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T21:30:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" + } + "#; + let cached = parse_cached_token(file_contents.as_bytes()).expect("success"); + assert_eq!("cachedtoken", cached.access_token.as_str()); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800), + cached.expires_at + ); + assert_eq!("clientid", cached.client_id.expect("client id is present")); + assert_eq!( + "YSBzZWNyZXQ=", + cached + .client_secret + .expect("client secret is present") + .as_str() + ); + assert_eq!( + "cachedrefreshtoken", + cached + .refresh_token + .expect("refresh token is present") + .as_str() + ); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1671975000), + cached + .registration_expires_at + .expect("registration expiration is present") + ); + assert_eq!("us-west-2", cached.region.expect("region is present")); + assert_eq!( + "https://d-123.awsapps.com/start", + cached.start_url.expect("startUrl is present") + ); + } + + // Minimal valid cached token + #[test] + fn parse_valid_token_with_optional_fields_absent() { + let file_contents = r#" + { + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T21:30:00Z" + } + "#; + let cached = parse_cached_token(file_contents.as_bytes()).expect("success"); + assert_eq!("cachedtoken", cached.access_token.as_str()); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800), + cached.expires_at + ); + assert!(cached.client_id.is_none()); + assert!(cached.client_secret.is_none()); + assert!(cached.refresh_token.is_none()); + assert!(cached.registration_expires_at.is_none()); + } + + #[test] + fn parse_invalid_timestamp() { + let token = br#" + { + "accessToken": "base64string", + "expiresAt": "notatimestamp", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + }"#; + let err = parse_cached_token(token).expect_err("invalid timestamp"); + let expected = "invalid value for the `expiresAt` field in the cached SSO token file"; + let actual = format!("{err}"); + assert!( + actual.contains(expected), + "expected error to contain `{expected}`, but was `{actual}`", + ); + } + + #[test] + fn parse_missing_fields() { + // Token missing accessToken field + let token = br#" + { + "expiresAt": "notatimestamp", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + }"#; + let err = parse_cached_token(token).expect_err("missing akid"); + assert!( + matches!(err, CachedSsoTokenError::MissingField("accessToken")), + "incorrect error: {:?}", + err + ); + + // Token missing expiresAt field + let token = br#" + { + "accessToken": "akid", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + }"#; + let err = parse_cached_token(token).expect_err("missing expiry"); + assert!( + matches!(err, CachedSsoTokenError::MissingField("expiresAt")), + "incorrect error: {:?}", + err + ); + } + + #[tokio::test] + async fn gracefully_handle_missing_files() { + let err = load_cached_token( + &Env::from_slice(&[("HOME", "/home")]), + &Fs::from_slice(&[]), + "asdf", + ) + .await + .expect_err("should fail, file is missing"); + assert!( + matches!(err, CachedSsoTokenError::IoError { .. }), + "should be io error, got {}", + err + ); + } + + #[test] + fn determine_correct_cache_filenames() { + assert_eq!( + "/home/someuser/.aws/sso/cache/d033e22ae348aeb5660fc2140aec35850c4da997.json", + cached_token_path("admin", "/home/someuser").as_os_str() + ); + assert_eq!( + "/home/someuser/.aws/sso/cache/75e4d41276d8bd17f85986fc6cccef29fd725ce3.json", + cached_token_path("dev-scopes", "/home/someuser").as_os_str() + ); + assert_eq!( + "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json", + cached_token_path("https://d-92671207e4.awsapps.com/start", "/home/me").as_os_str(), + ); + assert_eq!( + "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json", + cached_token_path("https://d-92671207e4.awsapps.com/start", "/home/me/").as_os_str(), + ); + } + + #[tokio::test] + async fn save_cached_token() { + let expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(50_000_000); + let reg_expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000_000); + let token = CachedSsoToken { + access_token: Zeroizing::new("access-token".into()), + client_id: Some("client-id".into()), + client_secret: Some(Zeroizing::new("client-secret".into())), + expires_at, + refresh_token: Some(Zeroizing::new("refresh-token".into())), + region: Some("region".into()), + registration_expires_at: Some(reg_expires_at), + start_url: Some("start-url".into()), + }; + + let env = Env::from_slice(&[("HOME", "/home/user")]); + let fs = Fs::from_map(HashMap::<_, Vec>::new()); + super::save_cached_token(&env, &fs, "test", &token) + .await + .expect("success"); + + let contents = fs + .read_to_end("/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json") + .await + .expect("correct file written"); + let contents_str = String::from_utf8(contents).expect("valid utf8"); + assert_eq!( + r#"{"accessToken":"access-token","expiresAt":"1971-08-02T16:53:20Z","refreshToken":"refresh-token","clientId":"client-id","clientSecret":"client-secret","registrationExpiresAt":"1973-03-03T09:46:40Z","region":"region","startUrl":"start-url"}"#, + contents_str, + ); + } + + #[tokio::test] + async fn round_trip_token() { + let expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(50_000_000); + let reg_expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000_000); + let original = CachedSsoToken { + access_token: Zeroizing::new("access-token".into()), + client_id: Some("client-id".into()), + client_secret: Some(Zeroizing::new("client-secret".into())), + expires_at, + refresh_token: Some(Zeroizing::new("refresh-token".into())), + region: Some("region".into()), + registration_expires_at: Some(reg_expires_at), + start_url: Some("start-url".into()), + }; + + let env = Env::from_slice(&[("HOME", "/home/user")]); + let fs = Fs::from_map(HashMap::<_, Vec>::new()); + + super::save_cached_token(&env, &fs, "test", &original) + .await + .unwrap(); + + let roundtripped = load_cached_token(&env, &fs, "test").await.unwrap(); + assert_eq!(original, roundtripped) + } +} diff --git a/aws/rust-runtime/aws-config/src/sso/credentials.rs b/aws/rust-runtime/aws-config/src/sso/credentials.rs new file mode 100644 index 00000000000..15e57546c52 --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sso/credentials.rs @@ -0,0 +1,292 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! SSO Credentials Provider +//! +//! This credentials provider enables loading credentials from `~/.aws/sso/cache`. For more information, +//! see [Using AWS SSO Credentials](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/sso-credentials.html) +//! +//! This provider is included automatically when profiles are loaded. + +use super::cache::load_cached_token; +use crate::provider_config::ProviderConfig; +use crate::sso::SsoTokenProvider; +use aws_credential_types::cache::CredentialsCache; +use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; +use aws_credential_types::Credentials; +use aws_sdk_sso::types::RoleCredentials; +use aws_sdk_sso::Client as SsoClient; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_types::DateTime; +use aws_types::os_shim_internal::{Env, Fs}; +use aws_types::region::Region; +use aws_types::SdkConfig; +use std::convert::TryInto; + +/// SSO Credentials Provider +/// +/// _Note: This provider is part of the default credentials chain and is integrated with the profile-file provider._ +/// +/// This credentials provider will use cached SSO tokens stored in `~/.aws/sso/cache/.json`. +/// Two different values will be tried for `` in order: +/// 1. The configured [`session_name`](Builder::session_name). +/// 2. The configured [`start_url`](Builder::start_url). +#[derive(Debug)] +pub struct SsoCredentialsProvider { + fs: Fs, + env: Env, + sso_provider_config: SsoProviderConfig, + sdk_config: SdkConfig, + token_provider: Option, + time_source: SharedTimeSource, +} + +impl SsoCredentialsProvider { + /// Creates a builder for [`SsoCredentialsProvider`] + pub fn builder() -> Builder { + Builder::new() + } + + pub(crate) fn new( + provider_config: &ProviderConfig, + sso_provider_config: SsoProviderConfig, + ) -> Self { + let fs = provider_config.fs(); + let env = provider_config.env(); + + let token_provider = if let Some(session_name) = &sso_provider_config.session_name { + Some( + SsoTokenProvider::builder() + .configure(&provider_config.client_config()) + .start_url(&sso_provider_config.start_url) + .session_name(session_name) + .region(sso_provider_config.region.clone()) + .build_sync(), + ) + } else { + None + }; + + SsoCredentialsProvider { + fs, + env, + sso_provider_config, + sdk_config: provider_config.client_config(), + token_provider, + time_source: provider_config.time_source(), + } + } + + async fn credentials(&self) -> provider::Result { + load_sso_credentials( + &self.sso_provider_config, + &self.sdk_config, + self.token_provider.as_ref(), + &self.env, + &self.fs, + self.time_source.clone(), + ) + .await + } +} + +impl ProvideCredentials for SsoCredentialsProvider { + fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> + where + Self: 'a, + { + future::ProvideCredentials::new(self.credentials()) + } +} + +/// Builder for [`SsoCredentialsProvider`] +#[derive(Default, Debug, Clone)] +pub struct Builder { + provider_config: Option, + account_id: Option, + region: Option, + role_name: Option, + start_url: Option, + session_name: Option, +} + +impl Builder { + /// Create a new builder for [`SsoCredentialsProvider`] + pub fn new() -> Self { + Self::default() + } + + /// Override the configuration used for this provider + pub fn configure(mut self, provider_config: &ProviderConfig) -> Self { + self.provider_config = Some(provider_config.clone()); + self + } + + /// Set the account id used for SSO + /// + /// This is a required field. + pub fn account_id(mut self, account_id: impl Into) -> Self { + self.account_id = Some(account_id.into()); + self + } + + /// Set the account id used for SSO + /// + /// This is a required field. + pub fn set_account_id(&mut self, account_id: Option) -> &mut Self { + self.account_id = account_id; + self + } + + /// Set the region used for SSO + /// + /// This is a required field. + pub fn region(mut self, region: Region) -> Self { + self.region = Some(region); + self + } + + /// Set the region used for SSO + /// + /// This is a required field. + pub fn set_region(&mut self, region: Option) -> &mut Self { + self.region = region; + self + } + + /// Set the role name used for SSO + /// + /// This is a required field. + pub fn role_name(mut self, role_name: impl Into) -> Self { + self.role_name = Some(role_name.into()); + self + } + + /// Set the role name used for SSO + /// + /// This is a required field. + pub fn set_role_name(&mut self, role_name: Option) -> &mut Self { + self.role_name = role_name; + self + } + + /// Set the start URL used for SSO + /// + /// This is a required field. + pub fn start_url(mut self, start_url: impl Into) -> Self { + self.start_url = Some(start_url.into()); + self + } + + /// Set the start URL used for SSO + /// + /// This is a required field. + pub fn set_start_url(&mut self, start_url: Option) -> &mut Self { + self.start_url = start_url; + self + } + + /// Set the session name used for SSO + pub fn session_name(mut self, session_name: impl Into) -> Self { + self.session_name = Some(session_name.into()); + self + } + + /// Set the session name used for SSO + pub fn set_session_name(&mut self, session_name: Option) -> &mut Self { + self.session_name = session_name; + self + } + + /// Construct an SsoCredentialsProvider from the builder + /// + /// # Panics + /// This method will panic if the any of the following required fields are unset: + /// - [`start_url`](Self::start_url) + /// - [`role_name`](Self::role_name) + /// - [`account_id`](Self::account_id) + /// - [`region`](Self::region) + pub fn build(self) -> SsoCredentialsProvider { + let provider_config = self.provider_config.unwrap_or_default(); + let sso_config = SsoProviderConfig { + account_id: self.account_id.expect("account_id must be set"), + region: self.region.expect("region must be set"), + role_name: self.role_name.expect("role_name must be set"), + start_url: self.start_url.expect("start_url must be set"), + session_name: self.session_name, + }; + SsoCredentialsProvider::new(&provider_config, sso_config) + } +} + +#[derive(Debug)] +pub(crate) struct SsoProviderConfig { + pub(crate) account_id: String, + pub(crate) role_name: String, + pub(crate) start_url: String, + pub(crate) region: Region, + pub(crate) session_name: Option, +} + +async fn load_sso_credentials( + sso_provider_config: &SsoProviderConfig, + sdk_config: &SdkConfig, + token_provider: Option<&SsoTokenProvider>, + env: &Env, + fs: &Fs, + time_source: SharedTimeSource, +) -> provider::Result { + let token = if let Some(token_provider) = token_provider { + token_provider + .resolve_token(time_source) + .await + .map_err(CredentialsError::provider_error)? + } else { + // Backwards compatible token loading that uses `start_url` instead of `session_name` + load_cached_token(env, fs, &sso_provider_config.start_url) + .await + .map_err(CredentialsError::provider_error)? + }; + + let config = sdk_config + .to_builder() + .region(sso_provider_config.region.clone()) + .credentials_cache(CredentialsCache::no_caching()) + .build(); + // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed + let client = SsoClient::new(&config); + let resp = client + .get_role_credentials() + .role_name(&sso_provider_config.role_name) + .access_token(&*token.access_token) + .account_id(&sso_provider_config.account_id) + .send() + .await + .map_err(CredentialsError::provider_error)?; + let credentials: RoleCredentials = resp + .role_credentials + .ok_or_else(|| CredentialsError::unhandled("SSO did not return credentials"))?; + let akid = credentials + .access_key_id + .ok_or_else(|| CredentialsError::unhandled("no access key id in response"))?; + let secret_key = credentials + .secret_access_key + .ok_or_else(|| CredentialsError::unhandled("no secret key in response"))?; + let expiration = DateTime::from_millis(credentials.expiration) + .try_into() + .map_err(|err| { + CredentialsError::unhandled(format!( + "expiration could not be converted into a system time: {}", + err + )) + })?; + Ok(Credentials::new( + akid, + secret_key, + credentials.session_token, + Some(expiration), + "SSO", + )) +} diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs new file mode 100644 index 00000000000..d4e1cc8b79b --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -0,0 +1,865 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! SSO Token Provider +//! +//! This token provider enables loading an access token from `~/.aws/sso/cache`. For more information, +//! see [AWS Builder ID for developers](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/builder-id.html). +//! +//! This provider is included automatically when profiles are loaded. + +use crate::sso::cache::{ + load_cached_token, save_cached_token, CachedSsoToken, CachedSsoTokenError, +}; +use aws_credential_types::cache::{CredentialsCache, ExpiringCache}; +use aws_sdk_ssooidc::error::DisplayErrorContext; +use aws_sdk_ssooidc::operation::create_token::CreateTokenOutput; +use aws_sdk_ssooidc::Client as SsoOidcClient; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime_api::client::identity::http::Token; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::ConfigBag; +use aws_types::os_shim_internal::{Env, Fs}; +use aws_types::region::Region; +use aws_types::SdkConfig; +use std::error::Error as StdError; +use std::fmt; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, SystemTime}; +use zeroize::Zeroizing; + +const REFRESH_BUFFER_TIME: Duration = Duration::from_secs(5 * 60 /* 5 minutes */); +const MIN_TIME_BETWEEN_REFRESH: Duration = Duration::from_secs(30); + +/// SSO Token Provider +/// +/// This token provider will use cached SSO tokens stored in `~/.aws/sso/cache/.json`. +/// `` is computed based on the configured [`session_namej`](Builder::session_name). +/// +/// If possible, the cached token will be refreshed when it gets close to expiring. +#[derive(Debug)] +pub struct SsoTokenProvider { + inner: Arc, + token_cache: ExpiringCache, +} + +#[derive(Debug)] +struct Inner { + env: Env, + fs: Fs, + region: Region, + session_name: String, + start_url: String, + sdk_config: SdkConfig, + last_refresh_attempt: Mutex>, +} + +impl SsoTokenProvider { + /// Creates a `SsoTokenProvider` builder. + pub fn builder() -> Builder { + Default::default() + } + + async fn refresh_cached_token( + inner: &Inner, + cached_token: &CachedSsoToken, + identifier: &str, + now: SystemTime, + ) -> Result, SsoTokenProviderError> { + // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed + let config = inner + .sdk_config + .to_builder() + .region(Some(inner.region.clone())) + .credentials_cache(CredentialsCache::no_caching()) + .build(); + let client = SsoOidcClient::new(&config); + let resp = client + .create_token() + .grant_type("refresh_token") + .client_id( + cached_token + .client_id + .as_ref() + .expect("required for token refresh") + .clone(), + ) + .client_secret( + cached_token + .client_secret + .as_ref() + .expect("required for token refresh") + .as_str(), + ) + .refresh_token( + cached_token + .refresh_token + .as_ref() + .expect("required for token refresh") + .as_str(), + ) + .send() + .await; + match resp { + Ok(CreateTokenOutput { + access_token: Some(access_token), + refresh_token, + expires_in, + .. + }) => { + let refreshed_token = CachedSsoToken { + access_token: Zeroizing::new(access_token), + client_id: cached_token.client_id.clone(), + client_secret: cached_token.client_secret.clone(), + expires_at: now + + Duration::from_secs( + u64::try_from(expires_in) + .map_err(|_| SsoTokenProviderError::BadExpirationTimeFromSsoOidc)?, + ), + refresh_token: refresh_token + .map(Zeroizing::new) + .or_else(|| cached_token.refresh_token.clone()), + region: Some(inner.region.to_string()), + registration_expires_at: cached_token.registration_expires_at, + start_url: Some(inner.start_url.clone()), + }; + save_cached_token(&inner.env, &inner.fs, identifier, &refreshed_token).await?; + tracing::debug!("saved refreshed SSO token"); + Ok(Some(refreshed_token)) + } + Ok(_) => { + tracing::debug!("SSO OIDC CreateToken responded without an access token"); + Ok(None) + } + Err(err) => { + tracing::debug!( + "call to SSO OIDC CreateToken for SSO token refresh failed: {}", + DisplayErrorContext(&err) + ); + Ok(None) + } + } + } + + pub(super) fn resolve_token( + &self, + time_source: SharedTimeSource, + ) -> impl std::future::Future> + 'static + { + let token_cache = self.token_cache.clone(); + let inner = self.inner.clone(); + + async move { + if let Some(token) = token_cache + .yield_or_clear_if_expired(time_source.now()) + .await + { + tracing::debug!("using cached SSO token"); + return Ok(token); + } + let token = token_cache + .get_or_load(|| async move { + tracing::debug!("expiring cache asked for an updated SSO token"); + let mut token = + load_cached_token(&inner.env, &inner.fs, &inner.session_name).await?; + tracing::debug!("loaded cached SSO token"); + + let now = time_source.now(); + let expired = token.expires_at <= now; + let expires_soon = token.expires_at - REFRESH_BUFFER_TIME <= now; + let last_refresh = *inner.last_refresh_attempt.lock().unwrap(); + let min_time_passed = last_refresh + .map(|lr| { + now.duration_since(lr).expect("last_refresh is in the past") + >= MIN_TIME_BETWEEN_REFRESH + }) + .unwrap_or(true); + let registration_expired = token + .registration_expires_at + .map(|t| t <= now) + .unwrap_or(true); + let refreshable = + token.refreshable() && min_time_passed && !registration_expired; + + tracing::debug!( + expired = ?expired, + expires_soon = ?expires_soon, + min_time_passed = ?min_time_passed, + registration_expired = ?registration_expired, + refreshable = ?refreshable, + will_refresh = ?(expires_soon && refreshable), + "cached SSO token refresh decision" + ); + + // Fail fast if the token has expired and we can't refresh it + if expired && !refreshable { + tracing::debug!("cached SSO token is expired and cannot be refreshed"); + return Err(SsoTokenProviderError::ExpiredToken); + } + + // Refresh the token if it is going to expire soon + if expires_soon && refreshable { + tracing::debug!("attempting to refresh SSO token"); + if let Some(refreshed_token) = + Self::refresh_cached_token(&inner, &token, &inner.session_name, now) + .await? + { + token = refreshed_token; + } + *inner.last_refresh_attempt.lock().unwrap() = Some(now); + } + + let expires_at = token.expires_at; + Ok((token, expires_at)) + }) + .await?; + + Ok(token) + } + } +} + +impl ResolveIdentity for SsoTokenProvider { + fn resolve_identity<'a>( + &'a self, + runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let time_source = runtime_components + .time_source() + .expect("a time source required by SsoTokenProvider"); + let token_future = self.resolve_token(time_source); + IdentityFuture::new(Box::pin(async move { + let token = token_future.await?; + Ok(Identity::new( + Token::new(token.access_token.as_str(), Some(token.expires_at)), + Some(token.expires_at), + )) + })) + } +} + +/// Builder for [`SsoTokenProvider`]. +#[derive(Debug, Default)] +pub struct Builder { + sdk_config: Option, + region: Option, + session_name: Option, + start_url: Option, +} + +impl Builder { + /// Creates a new builder for [`SsoTokenProvider`]. + pub fn new() -> Self { + Default::default() + } + + /// Override the configuration used for this provider + pub fn configure(mut self, sdk_config: &SdkConfig) -> Self { + self.sdk_config = Some(sdk_config.clone()); + self + } + + /// Sets the SSO region. + /// + /// This is a required field. + pub fn region(mut self, region: impl Into) -> Self { + self.region = Some(region.into()); + self + } + + /// Sets the SSO region. + /// + /// This is a required field. + pub fn set_region(&mut self, region: Option) -> &mut Self { + self.region = region; + self + } + + /// Sets the SSO session name. + /// + /// This is a required field. + pub fn session_name(mut self, session_name: impl Into) -> Self { + self.session_name = Some(session_name.into()); + self + } + + /// Sets the SSO session name. + /// + /// This is a required field. + pub fn set_session_name(&mut self, session_name: Option) -> &mut Self { + self.session_name = session_name; + self + } + + /// Sets the SSO start URL. + /// + /// This is a required field. + pub fn start_url(mut self, start_url: impl Into) -> Self { + self.start_url = Some(start_url.into()); + self + } + + /// Sets the SSO start URL. + /// + /// This is a required field. + pub fn set_start_url(&mut self, start_url: Option) -> &mut Self { + self.start_url = start_url; + self + } + + /// Builds the [`SsoTokenProvider`]. + /// + /// # Panics + /// + /// This will panic if any of the required fields are not given. + pub async fn build(mut self) -> SsoTokenProvider { + if self.sdk_config.is_none() { + self.sdk_config = Some(crate::load_from_env().await); + } + self.build_with(Env::real(), Fs::real()) + } + + pub(crate) fn build_sync(self) -> SsoTokenProvider { + self.build_with(Env::real(), Fs::real()) + } + + fn build_with(self, env: Env, fs: Fs) -> SsoTokenProvider { + SsoTokenProvider { + inner: Arc::new(Inner { + env, + fs, + region: self.region.expect("region is required"), + session_name: self.session_name.expect("session_name is required"), + start_url: self.start_url.expect("start_url is required"), + sdk_config: self.sdk_config.expect("sdk_config is required"), + last_refresh_attempt: Mutex::new(None), + }), + token_cache: ExpiringCache::new(REFRESH_BUFFER_TIME), + } + } +} + +#[derive(Debug)] +pub(super) enum SsoTokenProviderError { + BadExpirationTimeFromSsoOidc, + FailedToLoadToken { + source: Box, + }, + ExpiredToken, +} + +impl fmt::Display for SsoTokenProviderError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::BadExpirationTimeFromSsoOidc => { + f.write_str("SSO OIDC responded with a negative expiration duration") + } + Self::ExpiredToken => f.write_str("the SSO token has expired and cannot be refreshed"), + Self::FailedToLoadToken { .. } => f.write_str("failed to load the cached SSO token"), + } + } +} + +impl StdError for SsoTokenProviderError { + fn cause(&self) -> Option<&dyn StdError> { + match self { + Self::BadExpirationTimeFromSsoOidc => None, + Self::ExpiredToken => None, + Self::FailedToLoadToken { source } => Some(source.as_ref()), + } + } +} + +impl From for SsoTokenProviderError { + fn from(source: CachedSsoTokenError) -> Self { + Self::FailedToLoadToken { + source: source.into(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use aws_sdk_sso::config::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::instant_time_and_sleep; + use aws_smithy_async::time::{StaticTimeSource, TimeSource}; + use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, + }; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::date_time::Format; + use aws_smithy_types::retry::RetryConfig; + use aws_smithy_types::DateTime; + + fn time(s: &str) -> SystemTime { + SystemTime::try_from(DateTime::from_str(s, Format::DateTime).unwrap()).unwrap() + } + + struct TestHarness { + time_source: SharedTimeSource, + token_provider: SsoTokenProvider, + env: Env, + fs: Fs, + } + + impl TestHarness { + fn new( + time_source: impl TimeSource + 'static, + sleep_impl: impl AsyncSleep + 'static, + http_client: impl HttpClient + 'static, + fs: Fs, + ) -> Self { + let env = Env::from_slice(&[("HOME", "/home/user")]); + let time_source = SharedTimeSource::new(time_source); + let config = SdkConfig::builder() + .http_client(http_client) + .time_source(time_source.clone()) + .sleep_impl(SharedAsyncSleep::new(sleep_impl)) + // disable retry to simplify testing + .retry_config(RetryConfig::disabled()) + .build(); + Self { + time_source, + token_provider: SsoTokenProvider::builder() + .configure(&config) + .session_name("test") + .region(Region::new("us-west-2")) + .start_url("https://d-123.awsapps.com/start") + .build_with(env.clone(), fs.clone()), + env, + fs, + } + } + + async fn expect_sso_token(&self, value: &str, expires_at: &str) -> CachedSsoToken { + let token = self + .token_provider + .resolve_token(self.time_source.clone()) + .await + .unwrap(); + assert_eq!(value, token.access_token.as_str()); + assert_eq!(time(expires_at), token.expires_at); + token + } + + async fn expect_token(&self, value: &str, expires_at: &str) { + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(self.time_source.clone())) + .build() + .unwrap(); + let config_bag = ConfigBag::base(); + let identity = self + .token_provider + .resolve_identity(&runtime_components, &config_bag) + .await + .unwrap(); + let token = identity.data::().unwrap().clone(); + assert_eq!(value, token.token()); + assert_eq!(time(expires_at), *identity.expiration().unwrap()); + } + + async fn expect_expired_token_err(&self) { + let err = self + .token_provider + .resolve_token(self.time_source.clone()) + .await + .expect_err("expected failure"); + assert!( + matches!(err, SsoTokenProviderError::ExpiredToken), + "expected {err:?} to be `ExpiredToken`" + ); + } + + fn last_refresh_attempt_time(&self) -> Option { + self.token_provider + .inner + .last_refresh_attempt + .lock() + .unwrap() + .map(|time| { + DateTime::try_from(time) + .unwrap() + .fmt(Format::DateTime) + .unwrap() + }) + } + } + + #[tokio::test] + async fn use_unexpired_cached_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "accessToken": "some-token", + "expiresAt": "1975-01-01T00:00:00Z" } + "#, + )]); + + let now = time("1974-12-25T00:00:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(None); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + harness + .expect_token("some-token", "1975-01-01T00:00:00Z") + .await; + // it can't refresh this token + req_rx.expect_no_request(); + } + + #[tokio::test] + async fn expired_cached_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "accessToken": "some-token", + "expiresAt": "1999-12-15T00:00:00Z" } + "#, + )]); + + let now = time("2023-01-01T00:00:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(None); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + harness.expect_expired_token_err().await; + // it can't refresh this token + req_rx.expect_no_request(); + } + + #[tokio::test] + async fn expired_token_and_expired_client_registration() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-10-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2021-11-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2023-08-11T04:11:17Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(None); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + // the registration has expired, so the token can't be refreshed + harness.expect_expired_token_err().await; + req_rx.expect_no_request(); + } + + #[tokio::test] + async fn expired_token_refresh_with_refresh_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2021-12-25T13:30:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(Some( + http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + { "tokenType": "Bearer", + "accessToken": "newtoken", + "expiresIn": 28800, + "refreshToken": "newrefreshtoken" } + "#, + )) + .unwrap(), + )); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + let returned_token = harness + .expect_sso_token("newtoken", "2021-12-25T21:30:00Z") + .await; + let cached_token = load_cached_token(&harness.env, &harness.fs, "test") + .await + .unwrap(); + assert_eq!(returned_token, cached_token); + assert_eq!( + "newrefreshtoken", + returned_token.refresh_token.unwrap().as_str() + ); + assert_eq!( + "https://d-123.awsapps.com/start", + returned_token.start_url.unwrap() + ); + assert_eq!("us-west-2", returned_token.region.unwrap().to_string()); + assert_eq!("clientid", returned_token.client_id.unwrap()); + assert_eq!( + "YSBzZWNyZXQ=", + returned_token.client_secret.unwrap().as_str() + ); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1_671_975_000), + returned_token.registration_expires_at.unwrap() + ); + + let refresh_req = req_rx.expect_request(); + let parsed_req: serde_json::Value = + serde_json::from_slice(refresh_req.body().bytes().unwrap()).unwrap(); + let parsed_req = parsed_req.as_object().unwrap(); + assert_eq!( + "clientid", + parsed_req.get("clientId").unwrap().as_str().unwrap() + ); + assert_eq!( + "YSBzZWNyZXQ=", + parsed_req.get("clientSecret").unwrap().as_str().unwrap() + ); + assert_eq!( + "refresh_token", + parsed_req.get("grantType").unwrap().as_str().unwrap() + ); + assert_eq!( + "cachedrefreshtoken", + parsed_req.get("refreshToken").unwrap().as_str().unwrap() + ); + } + + #[tokio::test] + async fn expired_token_refresh_fails() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2021-12-25T13:30:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(Some( + http::Response::builder() + .status(500) + .body(SdkBody::from("")) + .unwrap(), + )); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + // it should return the previous token since refresh failed and it hasn't expired yet + let returned_token = harness + .expect_sso_token("cachedtoken", "2021-12-25T13:00:00Z") + .await; + let cached_token = load_cached_token(&harness.env, &harness.fs, "test") + .await + .unwrap(); + assert_eq!(returned_token, cached_token); + + let _ = req_rx.expect_request(); + } + + // Expired token refresh without new refresh token + #[tokio::test] + async fn expired_token_refresh_without_new_refresh_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2021-12-25T13:30:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(Some( + http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + { "tokenType": "Bearer", + "accessToken": "newtoken", + "expiresIn": 28800 } + "#, + )) + .unwrap(), + )); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + let returned_token = harness + .expect_sso_token("newtoken", "2021-12-25T21:30:00Z") + .await; + let cached_token = load_cached_token(&harness.env, &harness.fs, "test") + .await + .unwrap(); + assert_eq!(returned_token, cached_token); + assert_eq!( + "cachedrefreshtoken", + returned_token.refresh_token.unwrap().as_str(), + "it should have kept the old refresh token" + ); + + let _ = req_rx.expect_request(); + } + + #[tokio::test] + async fn refresh_timings() { + let _logs = capture_test_logs(); + + let start_time = DateTime::from_str("2023-01-01T00:00:00Z", Format::DateTime).unwrap(); + let (time_source, sleep_impl) = instant_time_and_sleep(start_time.try_into().unwrap()); + let shared_time_source = SharedTimeSource::new(time_source.clone()); + + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "first_token", + "_comment_expiresAt": "-------- Ten minutes after the start time: ------", + "expiresAt": "2023-01-01T00:10:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2023-01-02T12:00:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let events = vec![ + // First refresh attempt should fail + ReplayEvent::new( + http::Request::new(SdkBody::from("")), // don't really care what the request looks like + http::Response::builder() + .status(500) + .body(SdkBody::from("")) + .unwrap(), + ), + // Second refresh attempt should also fail + ReplayEvent::new( + http::Request::new(SdkBody::from("")), // don't really care what the request looks like + http::Response::builder() + .status(500) + .body(SdkBody::from("")) + .unwrap(), + ), + // Third refresh attempt will succeed + ReplayEvent::new( + http::Request::new(SdkBody::from("")), // don't really care what the request looks like + http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + { "tokenType": "Bearer", + "accessToken": "second_token", + "expiresIn": 28800 } + "#, + )) + .unwrap(), + ), + ]; + let http_client = StaticReplayClient::new(events); + let harness = TestHarness::new(shared_time_source, sleep_impl, http_client, fs); + + tracing::info!("test: first token retrieval should return the cached token"); + assert!( + harness.last_refresh_attempt_time().is_none(), + "the last attempt time should start empty" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + assert!( + harness.last_refresh_attempt_time().is_none(), + "it shouldn't have tried to refresh, so the last refresh attempt time shouldn't be set" + ); + + tracing::info!("test: advance 3 minutes"); + time_source.advance(Duration::from_secs(3 * 60)); + + tracing::info!("test: the token shouldn't get refreshed since it's not in the 5 minute buffer time yet"); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + assert!( + harness.last_refresh_attempt_time().is_none(), + "it shouldn't have tried to refresh since the token isn't expiring soon" + ); + + tracing::info!("test: advance 2 minutes"); + time_source.advance(Duration::from_secs(2 * 60)); + + tracing::info!( + "test: the token will fail to refresh, and the old cached token will be returned" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + assert_eq!( + Some("2023-01-01T00:05:00Z"), + harness.last_refresh_attempt_time().as_deref(), + "it should update the last refresh attempt time since the expiration time is soon" + ); + + tracing::info!("test: advance 15 seconds"); + time_source.advance(Duration::from_secs(15)); + + tracing::info!( + "test: the token will not refresh because the minimum time hasn't passed between attempts" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + + tracing::info!("test: advance 15 seconds"); + time_source.advance(Duration::from_secs(15)); + + tracing::info!( + "test: the token will fail to refresh, and the old cached token will be returned" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + + tracing::info!("test: advance 30 seconds"); + time_source.advance(Duration::from_secs(30)); + + tracing::info!("test: the token will refresh successfully"); + harness + .expect_token("second_token", "2023-01-01T08:06:00Z") + .await; + } +} diff --git a/aws/rust-runtime/aws-runtime/src/identity.rs b/aws/rust-runtime/aws-runtime/src/identity.rs index d919a7d8a1b..3f2753cc16f 100644 --- a/aws/rust-runtime/aws-runtime/src/identity.rs +++ b/aws/rust-runtime/aws-runtime/src/identity.rs @@ -7,6 +7,7 @@ pub mod credentials { use aws_credential_types::cache::SharedCredentialsCache; use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; /// Smithy identity resolver for AWS credentials. @@ -23,7 +24,11 @@ pub mod credentials { } impl ResolveIdentity for CredentialsIdentityResolver { - fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { let cache = self.credentials_cache.clone(); IdentityFuture::new(async move { let credentials = cache.as_ref().provide_cached_credentials().await?; diff --git a/aws/rust-runtime/aws-types/Cargo.toml b/aws/rust-runtime/aws-types/Cargo.toml index 2570ccff73e..3c143291e03 100644 --- a/aws/rust-runtime/aws-types/Cargo.toml +++ b/aws/rust-runtime/aws-types/Cargo.toml @@ -26,9 +26,10 @@ http = "0.2.6" hyper-rustls = { version = "0.24", optional = true, features = ["rustls-native-certs", "http2", "webpki-roots"] } [dev-dependencies] -futures-util = { version = "0.3.16", default-features = false } http = "0.2.4" +tempfile = "3" tracing-test = "0.2.4" +tokio = { version = "1", features = ["rt", "macros"] } [build-dependencies] rustc_version = "0.4.0" diff --git a/aws/rust-runtime/aws-types/src/os_shim_internal.rs b/aws/rust-runtime/aws-types/src/os_shim_internal.rs index 85f67cd4c2a..53b26706f79 100644 --- a/aws/rust-runtime/aws-types/src/os_shim_internal.rs +++ b/aws/rust-runtime/aws-types/src/os_shim_internal.rs @@ -12,7 +12,7 @@ use std::env::VarError; use std::ffi::OsString; use std::fmt::Debug; use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use crate::os_shim_internal::fs::Fake; @@ -50,7 +50,7 @@ impl Fs { } pub fn from_raw_map(fs: HashMap>) -> Self { - Fs(fs::Inner::Fake(Arc::new(Fake::MapFs(fs)))) + Fs(fs::Inner::Fake(Arc::new(Fake::MapFs(Mutex::new(fs))))) } pub fn from_map(data: HashMap>>) -> Self { @@ -125,9 +125,12 @@ impl Fs { use fs::Inner; let path = path.as_ref(); match &self.0 { + // TODO(https://github.com/awslabs/aws-sdk-rust/issues/867): Use async IO below Inner::Real => std::fs::read(path), Inner::Fake(fake) => match fake.as_ref() { Fake::MapFs(fs) => fs + .lock() + .unwrap() .get(path.as_os_str()) .cloned() .ok_or_else(|| std::io::ErrorKind::NotFound.into()), @@ -143,13 +146,48 @@ impl Fs { }, } } + + /// Write a slice as the entire contents of a file. + /// + /// This is equivalent to `std::fs::write`. + pub async fn write( + &self, + path: impl AsRef, + contents: impl AsRef<[u8]>, + ) -> std::io::Result<()> { + use fs::Inner; + match &self.0 { + // TODO(https://github.com/awslabs/aws-sdk-rust/issues/867): Use async IO below + Inner::Real => { + std::fs::write(path, contents)?; + } + Inner::Fake(fake) => match fake.as_ref() { + Fake::MapFs(fs) => { + fs.lock() + .unwrap() + .insert(path.as_ref().as_os_str().into(), contents.as_ref().to_vec()); + } + Fake::NamespacedFs { + real_path, + namespaced_to, + } => { + let actual_path = path + .as_ref() + .strip_prefix(namespaced_to) + .map_err(|_| std::io::Error::from(std::io::ErrorKind::NotFound))?; + std::fs::write(real_path.join(actual_path), contents)?; + } + }, + } + Ok(()) + } } mod fs { use std::collections::HashMap; use std::ffi::OsString; use std::path::PathBuf; - use std::sync::Arc; + use std::sync::{Arc, Mutex}; #[derive(Clone, Debug)] pub(super) enum Inner { @@ -159,7 +197,7 @@ mod fs { #[derive(Debug)] pub(super) enum Fake { - MapFs(HashMap>), + MapFs(Mutex>>), NamespacedFs { real_path: PathBuf, namespaced_to: PathBuf, @@ -242,8 +280,6 @@ mod env { mod test { use std::env::VarError; - use futures_util::FutureExt; - use crate::os_shim_internal::{Env, Fs}; #[test] @@ -256,19 +292,33 @@ mod test { ) } - #[test] - fn fs_works() { + #[tokio::test] + async fn fs_from_test_dir_works() { let fs = Fs::from_test_dir(".", "/users/test-data"); let _ = fs .read_to_end("/users/test-data/Cargo.toml") - .now_or_never() - .expect("future should not poll") + .await .expect("file exists"); let _ = fs .read_to_end("doesntexist") - .now_or_never() - .expect("future should not poll") + .await .expect_err("file doesnt exists"); } + + #[tokio::test] + async fn fs_round_trip_file_with_real() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("test-file"); + + let fs = Fs::real(); + fs.read_to_end(&path) + .await + .expect_err("file doesn't exist yet"); + + fs.write(&path, b"test").await.expect("success"); + + let result = fs.read_to_end(&path).await.expect("success"); + assert_eq!(b"test", &result[..]); + } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt index e103e43ffc9..6263d54497d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt @@ -21,8 +21,9 @@ object AwsDocs { fun canRelyOnAwsConfig(codegenContext: ClientCodegenContext): Boolean = SdkSettings.from(codegenContext.settings).awsConfigVersion != null && !setOf( - ShapeId.from("com.amazonaws.sts#AWSSecurityTokenServiceV20110615"), ShapeId.from("com.amazonaws.sso#SWBPortalService"), + ShapeId.from("com.amazonaws.ssooidc#AWSSSOOIDCService"), + ShapeId.from("com.amazonaws.sts#AWSSecurityTokenServiceV20110615"), ).contains(codegenContext.serviceShape.id) fun constructClient(codegenContext: ClientCodegenContext, indent: String): Writable { diff --git a/aws/sdk/aws-models/sso-oidc.json b/aws/sdk/aws-models/sso-oidc.json new file mode 100644 index 00000000000..21fa139b314 --- /dev/null +++ b/aws/sdk/aws-models/sso-oidc.json @@ -0,0 +1,1590 @@ +{ + "smithy": "2.0", + "metadata": { + "suppressions": [ + { + "id": "HttpMethodSemantics", + "namespace": "*" + }, + { + "id": "HttpResponseCodeSemantics", + "namespace": "*" + }, + { + "id": "PaginatedTrait", + "namespace": "*" + }, + { + "id": "HttpHeaderTrait", + "namespace": "*" + }, + { + "id": "HttpUriConflict", + "namespace": "*" + }, + { + "id": "Service", + "namespace": "*" + } + ] + }, + "shapes": { + "com.amazonaws.ssooidc#AWSSSOOIDCService": { + "type": "service", + "version": "2019-06-10", + "operations": [ + { + "target": "com.amazonaws.ssooidc#CreateToken" + }, + { + "target": "com.amazonaws.ssooidc#RegisterClient" + }, + { + "target": "com.amazonaws.ssooidc#StartDeviceAuthorization" + } + ], + "traits": { + "aws.api#service": { + "sdkId": "SSO OIDC", + "arnNamespace": "awsssooidc", + "cloudFormationName": "SSOOIDC", + "cloudTrailEventSource": "ssooidc.amazonaws.com", + "endpointPrefix": "oidc" + }, + "aws.auth#sigv4": { + "name": "awsssooidc" + }, + "aws.protocols#restJson1": {}, + "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) OpenID Connect (OIDC) is a web service that enables a client (such as AWS CLI\n or a native application) to register with IAM Identity Center. The service also enables the client to\n fetch the user’s access token upon successful authentication and authorization with\n IAM Identity Center.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

\n Considerations for Using This Guide\n

\n

Before you begin using this guide, we recommend that you first review the following\n important information about how the IAM Identity Center OIDC service works.

\n
    \n
  • \n

    The IAM Identity Center OIDC service currently implements only the portions of the OAuth 2.0\n Device Authorization Grant standard (https://tools.ietf.org/html/rfc8628) that are necessary to enable single\n sign-on authentication with the AWS CLI. Support for other OIDC flows frequently needed\n for native applications, such as Authorization Code Flow (+ PKCE), will be addressed in\n future releases.

    \n
  • \n
  • \n

    The service emits only OIDC access tokens, such that obtaining a new token (For\n example, token refresh) requires explicit user re-authentication.

    \n
  • \n
  • \n

    The access tokens provided by this service grant access to all AWS account\n entitlements assigned to an IAM Identity Center user, not just a particular application.

    \n
  • \n
  • \n

    The documentation in this guide does not describe the mechanism to convert the access\n token into AWS Auth (“sigv4”) credentials for use with IAM-protected AWS service\n endpoints. For more information, see GetRoleCredentials in the IAM Identity Center Portal API Reference\n Guide.

    \n
  • \n
\n\n

For general information about IAM Identity Center, see What is\n IAM Identity Center? in the IAM Identity Center User Guide.

", + "smithy.api#title": "AWS SSO OIDC", + "smithy.rules#endpointRuleSet": { + "version": "1.0", + "parameters": { + "Region": { + "builtIn": "AWS::Region", + "required": false, + "documentation": "The AWS region used to dispatch the request.", + "type": "String" + }, + "UseDualStack": { + "builtIn": "AWS::UseDualStack", + "required": true, + "default": false, + "documentation": "When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.", + "type": "Boolean" + }, + "UseFIPS": { + "builtIn": "AWS::UseFIPS", + "required": true, + "default": false, + "documentation": "When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.", + "type": "Boolean" + }, + "Endpoint": { + "builtIn": "SDK::Endpoint", + "required": false, + "documentation": "Override the endpoint used to send this request", + "type": "String" + } + }, + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Invalid Configuration: FIPS and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "PartitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ] + }, + { + "conditions": [], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://oidc.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" + } + ] + } + ] + }, + "smithy.rules#endpointTests": { + "testCases": [ + { + "documentation": "For region ap-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-east-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-northeast-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-northeast-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-northeast-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-northeast-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-northeast-2.amazonaws.com" + } + }, + "params": { + "Region": "ap-northeast-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-northeast-3 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-northeast-3.amazonaws.com" + } + }, + "params": { + "Region": "ap-northeast-3", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-south-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-south-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-south-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-southeast-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-southeast-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-southeast-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-southeast-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-southeast-2.amazonaws.com" + } + }, + "params": { + "Region": "ap-southeast-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ca-central-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ca-central-1.amazonaws.com" + } + }, + "params": { + "Region": "ca-central-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-central-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-central-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-central-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-north-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-south-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-south-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-south-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-west-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-west-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-west-2.amazonaws.com" + } + }, + "params": { + "Region": "eu-west-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-west-3 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-west-3.amazonaws.com" + } + }, + "params": { + "Region": "eu-west-3", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region me-south-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.me-south-1.amazonaws.com" + } + }, + "params": { + "Region": "me-south-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region sa-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.sa-east-1.amazonaws.com" + } + }, + "params": { + "Region": "sa-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-east-2.amazonaws.com" + } + }, + "params": { + "Region": "us-east-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-west-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-west-2.amazonaws.com" + } + }, + "params": { + "Region": "us-west-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For custom endpoint with region set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with region not set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips enabled and dualstack disabled", + "expect": { + "error": "Invalid Configuration: FIPS and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips disabled and dualstack enabled", + "expect": { + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "Missing region", + "expect": { + "error": "Invalid Configuration: Missing Region" + } + } + ], + "version": "1.0" + } + } + }, + "com.amazonaws.ssooidc#AccessDeniedException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

You do not have sufficient access to perform this action.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#AccessToken": { + "type": "string" + }, + "com.amazonaws.ssooidc#AuthCode": { + "type": "string" + }, + "com.amazonaws.ssooidc#AuthorizationPendingException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that a request to authorize a client with an access user session token is\n pending.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#ClientId": { + "type": "string" + }, + "com.amazonaws.ssooidc#ClientName": { + "type": "string" + }, + "com.amazonaws.ssooidc#ClientSecret": { + "type": "string" + }, + "com.amazonaws.ssooidc#ClientType": { + "type": "string" + }, + "com.amazonaws.ssooidc#CreateToken": { + "type": "operation", + "input": { + "target": "com.amazonaws.ssooidc#CreateTokenRequest" + }, + "output": { + "target": "com.amazonaws.ssooidc#CreateTokenResponse" + }, + "errors": [ + { + "target": "com.amazonaws.ssooidc#AccessDeniedException" + }, + { + "target": "com.amazonaws.ssooidc#AuthorizationPendingException" + }, + { + "target": "com.amazonaws.ssooidc#ExpiredTokenException" + }, + { + "target": "com.amazonaws.ssooidc#InternalServerException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidClientException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidGrantException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidRequestException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidScopeException" + }, + { + "target": "com.amazonaws.ssooidc#SlowDownException" + }, + { + "target": "com.amazonaws.ssooidc#UnauthorizedClientException" + }, + { + "target": "com.amazonaws.ssooidc#UnsupportedGrantTypeException" + } + ], + "traits": { + "smithy.api#auth": [], + "smithy.api#documentation": "

Creates and returns an access token for the authorized client. The access token issued\n will be used to fetch short-term credentials for the assigned roles in the AWS\n account.

", + "smithy.api#http": { + "method": "POST", + "uri": "/token", + "code": 200 + }, + "smithy.api#optionalAuth": {} + } + }, + "com.amazonaws.ssooidc#CreateTokenRequest": { + "type": "structure", + "members": { + "clientId": { + "target": "com.amazonaws.ssooidc#ClientId", + "traits": { + "smithy.api#documentation": "

The unique identifier string for each client. This value should come from the persisted\n result of the RegisterClient API.

", + "smithy.api#required": {} + } + }, + "clientSecret": { + "target": "com.amazonaws.ssooidc#ClientSecret", + "traits": { + "smithy.api#documentation": "

A secret string generated for the client. This value should come from the persisted result\n of the RegisterClient API.

", + "smithy.api#required": {} + } + }, + "grantType": { + "target": "com.amazonaws.ssooidc#GrantType", + "traits": { + "smithy.api#documentation": "

Supports grant types for the authorization code, refresh token, and device code request.\n For device code requests, specify the following value:

\n\n

\n urn:ietf:params:oauth:grant-type:device_code\n \n

\n\n

For information about how to obtain the device code, see the StartDeviceAuthorization topic.

", + "smithy.api#required": {} + } + }, + "deviceCode": { + "target": "com.amazonaws.ssooidc#DeviceCode", + "traits": { + "smithy.api#documentation": "

Used only when calling this API for the device code grant type. This short-term code is\n used to identify this authentication attempt. This should come from an in-memory reference to\n the result of the StartDeviceAuthorization API.

" + } + }, + "code": { + "target": "com.amazonaws.ssooidc#AuthCode", + "traits": { + "smithy.api#documentation": "

The authorization code received from the authorization service. This parameter is required\n to perform an authorization grant request to get access to a token.

" + } + }, + "refreshToken": { + "target": "com.amazonaws.ssooidc#RefreshToken", + "traits": { + "smithy.api#documentation": "

Currently, refreshToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

The token used to obtain an access token in the event that the access token is invalid or\n expired.

" + } + }, + "scope": { + "target": "com.amazonaws.ssooidc#Scopes", + "traits": { + "smithy.api#documentation": "

The list of scopes that is defined by the client. Upon authorization, this list is used to\n restrict permissions when granting an access token.

" + } + }, + "redirectUri": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The location of the application that will receive the authorization code. Users authorize\n the service to send the request to this location.

" + } + } + } + }, + "com.amazonaws.ssooidc#CreateTokenResponse": { + "type": "structure", + "members": { + "accessToken": { + "target": "com.amazonaws.ssooidc#AccessToken", + "traits": { + "smithy.api#documentation": "

An opaque token to access IAM Identity Center resources assigned to a user.

" + } + }, + "tokenType": { + "target": "com.amazonaws.ssooidc#TokenType", + "traits": { + "smithy.api#documentation": "

Used to notify the client that the returned token is an access token. The supported type\n is BearerToken.

" + } + }, + "expiresIn": { + "target": "com.amazonaws.ssooidc#ExpirationInSeconds", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the time in seconds when an access token will expire.

" + } + }, + "refreshToken": { + "target": "com.amazonaws.ssooidc#RefreshToken", + "traits": { + "smithy.api#documentation": "

Currently, refreshToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

A token that, if present, can be used to refresh a previously issued access token that\n might have expired.

" + } + }, + "idToken": { + "target": "com.amazonaws.ssooidc#IdToken", + "traits": { + "smithy.api#documentation": "

Currently, idToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

The identifier of the user that associated with the access token, if present.

" + } + } + } + }, + "com.amazonaws.ssooidc#DeviceCode": { + "type": "string" + }, + "com.amazonaws.ssooidc#Error": { + "type": "string" + }, + "com.amazonaws.ssooidc#ErrorDescription": { + "type": "string" + }, + "com.amazonaws.ssooidc#ExpirationInSeconds": { + "type": "integer", + "traits": { + "smithy.api#default": 0 + } + }, + "com.amazonaws.ssooidc#ExpiredTokenException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the token issued by the service is expired and is no longer valid.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#GrantType": { + "type": "string" + }, + "com.amazonaws.ssooidc#IdToken": { + "type": "string" + }, + "com.amazonaws.ssooidc#InternalServerException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that an error from the service occurred while trying to process a\n request.

", + "smithy.api#error": "server", + "smithy.api#httpError": 500 + } + }, + "com.amazonaws.ssooidc#IntervalInSeconds": { + "type": "integer", + "traits": { + "smithy.api#default": 0 + } + }, + "com.amazonaws.ssooidc#InvalidClientException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the clientId or clientSecret in the request is\n invalid. For example, this can occur when a client sends an incorrect clientId or\n an expired clientSecret.

", + "smithy.api#error": "client", + "smithy.api#httpError": 401 + } + }, + "com.amazonaws.ssooidc#InvalidClientMetadataException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the client information sent in the request during registration is\n invalid.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#InvalidGrantException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that a request contains an invalid grant. This can occur if a client makes a\n CreateToken request with an invalid grant type.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#InvalidRequestException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that something is wrong with the input to the request. For example, a required\n parameter might be missing or out of range.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#InvalidScopeException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the scope provided in the request is invalid.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#LongTimeStampType": { + "type": "long", + "traits": { + "smithy.api#default": 0 + } + }, + "com.amazonaws.ssooidc#RefreshToken": { + "type": "string" + }, + "com.amazonaws.ssooidc#RegisterClient": { + "type": "operation", + "input": { + "target": "com.amazonaws.ssooidc#RegisterClientRequest" + }, + "output": { + "target": "com.amazonaws.ssooidc#RegisterClientResponse" + }, + "errors": [ + { + "target": "com.amazonaws.ssooidc#InternalServerException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidClientMetadataException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidRequestException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidScopeException" + } + ], + "traits": { + "smithy.api#auth": [], + "smithy.api#documentation": "

Registers a client with IAM Identity Center. This allows clients to initiate device authorization.\n The output should be persisted for reuse through many authentication requests.

", + "smithy.api#http": { + "method": "POST", + "uri": "/client/register", + "code": 200 + }, + "smithy.api#optionalAuth": {} + } + }, + "com.amazonaws.ssooidc#RegisterClientRequest": { + "type": "structure", + "members": { + "clientName": { + "target": "com.amazonaws.ssooidc#ClientName", + "traits": { + "smithy.api#documentation": "

The friendly name of the client.

", + "smithy.api#required": {} + } + }, + "clientType": { + "target": "com.amazonaws.ssooidc#ClientType", + "traits": { + "smithy.api#documentation": "

The type of client. The service supports only public as a client type.\n Anything other than public will be rejected by the service.

", + "smithy.api#required": {} + } + }, + "scopes": { + "target": "com.amazonaws.ssooidc#Scopes", + "traits": { + "smithy.api#documentation": "

The list of scopes that are defined by the client. Upon authorization, this list is used\n to restrict permissions when granting an access token.

" + } + } + } + }, + "com.amazonaws.ssooidc#RegisterClientResponse": { + "type": "structure", + "members": { + "clientId": { + "target": "com.amazonaws.ssooidc#ClientId", + "traits": { + "smithy.api#documentation": "

The unique identifier string for each client. This client uses this identifier to get\n authenticated by the service in subsequent calls.

" + } + }, + "clientSecret": { + "target": "com.amazonaws.ssooidc#ClientSecret", + "traits": { + "smithy.api#documentation": "

A secret string generated for the client. The client will use this string to get\n authenticated by the service in subsequent calls.

" + } + }, + "clientIdIssuedAt": { + "target": "com.amazonaws.ssooidc#LongTimeStampType", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the time at which the clientId and clientSecret were\n issued.

" + } + }, + "clientSecretExpiresAt": { + "target": "com.amazonaws.ssooidc#LongTimeStampType", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the time at which the clientId and clientSecret will\n become invalid.

" + } + }, + "authorizationEndpoint": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The endpoint where the client can request authorization.

" + } + }, + "tokenEndpoint": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The endpoint where the client can get an access token.

" + } + } + } + }, + "com.amazonaws.ssooidc#Scope": { + "type": "string" + }, + "com.amazonaws.ssooidc#Scopes": { + "type": "list", + "member": { + "target": "com.amazonaws.ssooidc#Scope" + } + }, + "com.amazonaws.ssooidc#SlowDownException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the client is making the request too frequently and is more than the\n service can handle.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#StartDeviceAuthorization": { + "type": "operation", + "input": { + "target": "com.amazonaws.ssooidc#StartDeviceAuthorizationRequest" + }, + "output": { + "target": "com.amazonaws.ssooidc#StartDeviceAuthorizationResponse" + }, + "errors": [ + { + "target": "com.amazonaws.ssooidc#InternalServerException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidClientException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidRequestException" + }, + { + "target": "com.amazonaws.ssooidc#SlowDownException" + }, + { + "target": "com.amazonaws.ssooidc#UnauthorizedClientException" + } + ], + "traits": { + "smithy.api#auth": [], + "smithy.api#documentation": "

Initiates device authorization by requesting a pair of verification codes from the\n authorization service.

", + "smithy.api#http": { + "method": "POST", + "uri": "/device_authorization", + "code": 200 + }, + "smithy.api#optionalAuth": {} + } + }, + "com.amazonaws.ssooidc#StartDeviceAuthorizationRequest": { + "type": "structure", + "members": { + "clientId": { + "target": "com.amazonaws.ssooidc#ClientId", + "traits": { + "smithy.api#documentation": "

The unique identifier string for the client that is registered with IAM Identity Center. This value\n should come from the persisted result of the RegisterClient API\n operation.

", + "smithy.api#required": {} + } + }, + "clientSecret": { + "target": "com.amazonaws.ssooidc#ClientSecret", + "traits": { + "smithy.api#documentation": "

A secret string that is generated for the client. This value should come from the\n persisted result of the RegisterClient API operation.

", + "smithy.api#required": {} + } + }, + "startUrl": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The URL for the AWS access portal. For more information, see Using\n the AWS access portal in the IAM Identity Center User Guide.

", + "smithy.api#required": {} + } + } + } + }, + "com.amazonaws.ssooidc#StartDeviceAuthorizationResponse": { + "type": "structure", + "members": { + "deviceCode": { + "target": "com.amazonaws.ssooidc#DeviceCode", + "traits": { + "smithy.api#documentation": "

The short-lived code that is used by the device when polling for a session token.

" + } + }, + "userCode": { + "target": "com.amazonaws.ssooidc#UserCode", + "traits": { + "smithy.api#documentation": "

A one-time user verification code. This is needed to authorize an in-use device.

" + } + }, + "verificationUri": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The URI of the verification page that takes the userCode to authorize the\n device.

" + } + }, + "verificationUriComplete": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

An alternate URL that the client can use to automatically launch a browser. This process\n skips the manual step in which the user visits the verification page and enters their\n code.

" + } + }, + "expiresIn": { + "target": "com.amazonaws.ssooidc#ExpirationInSeconds", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the number of seconds in which the verification code will become invalid.

" + } + }, + "interval": { + "target": "com.amazonaws.ssooidc#IntervalInSeconds", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the number of seconds the client must wait between attempts when polling for a\n session.

" + } + } + } + }, + "com.amazonaws.ssooidc#TokenType": { + "type": "string" + }, + "com.amazonaws.ssooidc#URI": { + "type": "string" + }, + "com.amazonaws.ssooidc#UnauthorizedClientException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the client is not currently authorized to make the request. This can happen\n when a clientId is not issued for a public client.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#UnsupportedGrantTypeException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the grant type in the request is not supported by the service.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#UserCode": { + "type": "string" + } + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index 828c15202c6..c9377f9c9f2 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -5,6 +5,7 @@ use crate::box_error::BoxError; use crate::client::auth::AuthSchemeId; +use crate::client::runtime_components::RuntimeComponents; use crate::impl_shared_conversions; use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; @@ -37,7 +38,11 @@ pub use ResolveIdentity as IdentityResolver; /// There is no fallback to other auth schemes in the absence of an identity. pub trait ResolveIdentity: Send + Sync + Debug { /// Asynchronously resolves an identity for a request using the given config. - fn resolve_identity<'a>(&'a self, config_bag: &'a ConfigBag) -> IdentityFuture<'a>; + fn resolve_identity<'a>( + &'a self, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a>; } /// Container for a shared identity resolver. @@ -52,8 +57,12 @@ impl SharedIdentityResolver { } impl ResolveIdentity for SharedIdentityResolver { - fn resolve_identity<'a>(&'a self, config_bag: &'a ConfigBag) -> IdentityFuture<'a> { - self.0.resolve_identity(config_bag) + fn resolve_identity<'a>( + &'a self, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + self.0.resolve_identity(runtime_components, config_bag) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs index 6f82e6e6ff5..5ec332cf3e3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs @@ -6,6 +6,7 @@ //! Identity types for HTTP auth use crate::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::fmt::Debug; use std::sync::Arc; @@ -64,7 +65,11 @@ impl From for Token { } impl ResolveIdentity for Token { - fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } @@ -123,7 +128,11 @@ impl Login { } impl ResolveIdentity for Login { - fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index e7e6ddf55ec..b98a45d5b62 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -606,7 +606,11 @@ impl RuntimeComponentsBuilder { #[derive(Debug)] struct FakeIdentityResolver; impl ResolveIdentity for FakeIdentityResolver { - fn resolve_identity<'a>(&'a self, _: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _: &RuntimeComponents, + _: &'a ConfigBag, + ) -> IdentityFuture<'a> { unreachable!("fake identity resolver must be overridden for this test") } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 6850039a91c..affff101d0d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -405,4 +405,32 @@ mod tests { request.headers().get("Authorization").unwrap() ); } + + #[test] + fn test_bearer_auth_overwrite_existing_header() { + let signer = BearerAuthSigner; + + let config_bag = ConfigBag::base(); + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let identity = Identity::new(Token::new("some-token", None), None); + let mut request = http::Request::builder() + .header("Authorization", "wrong") + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(); + signer + .sign_http_request( + &mut request, + &identity, + AuthSchemeEndpointConfig::empty(), + &runtime_components, + &config_bag, + ) + .expect("success"); + assert_eq!( + "Bearer some-token", + request.headers().get("Authorization").unwrap() + ); + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs index 0d4a7f4a6ba..eb96f57b3ef 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs @@ -4,6 +4,7 @@ */ use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; /// Identity for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. @@ -29,7 +30,11 @@ impl NoAuthIdentityResolver { } impl ResolveIdentity for NoAuthIdentityResolver { - fn resolve_identity<'a>(&'a self, _: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _: &'a ConfigBag, + ) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 2aab26de849..d5c685ead2b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -77,7 +77,9 @@ pub(super) async fn orchestrate_auth( Ok(auth_scheme_endpoint_config) => { trace!(auth_scheme_endpoint_config = ?auth_scheme_endpoint_config, "extracted auth scheme endpoint config"); - let identity = identity_resolver.resolve_identity(cfg).await?; + let identity = identity_resolver + .resolve_identity(runtime_components, cfg) + .await?; trace!(identity = ?identity, "resolved identity"); trace!("signing request"); @@ -149,7 +151,7 @@ mod tests { use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::{ - GetIdentityResolver, RuntimeComponentsBuilder, + GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, }; use aws_smithy_types::config_bag::Layer; use std::collections::HashMap; @@ -159,7 +161,11 @@ mod tests { #[derive(Debug)] struct TestIdentityResolver; impl ResolveIdentity for TestIdentityResolver { - fn resolve_identity<'a>(&'a self, _config_bag: &'a ConfigBag) -> IdentityFuture<'a> { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) } } From 3ab5a6926f414624c4d7c7351741ed18d3088a30 Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 17 Oct 2023 13:42:59 +0200 Subject: [PATCH 179/331] Showcase a minimal operation-agnostic server model plugin (#3060) Agnostic in that it's generic over the operation it's applied to. Figuring out how to write such a plugin can be fun but is not trivial. I'm mostly adding this as a reference to refresh my memory the next time I have to implement one of these. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- examples/pokemon-service/Cargo.toml | 1 + examples/pokemon-service/src/authz.rs | 219 ++++++++++++++++++ examples/pokemon-service/src/main.rs | 10 +- .../aws-smithy-http-server/src/plugin/mod.rs | 13 +- 4 files changed, 235 insertions(+), 8 deletions(-) create mode 100644 examples/pokemon-service/src/authz.rs diff --git a/examples/pokemon-service/Cargo.toml b/examples/pokemon-service/Cargo.toml index 1a2da1ce8f0..819a63437b3 100644 --- a/examples/pokemon-service/Cargo.toml +++ b/examples/pokemon-service/Cargo.toml @@ -8,6 +8,7 @@ description = "A smithy Rust service to retrieve information about Pokémon." [dependencies] clap = { version = "4.1.11", features = ["derive"] } +http = "0.2" hyper = { version = "0.14.26", features = ["server"] } tokio = "1.26.0" tower = "0.4" diff --git a/examples/pokemon-service/src/authz.rs b/examples/pokemon-service/src/authz.rs new file mode 100644 index 00000000000..348a22f47e8 --- /dev/null +++ b/examples/pokemon-service/src/authz.rs @@ -0,0 +1,219 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! This file showcases a rather minimal model plugin that is agnostic over the operation that it +//! is applied to. +//! +//! It is interesting because it is not trivial to figure out how to write one. As the +//! documentation for [`aws_smithy_http_server::plugin::ModelMarker`] calls out, most model +//! plugins' implementation are _operation-specific_, which are simpler. + +use std::{marker::PhantomData, pin::Pin}; + +use aws_smithy_http_server::{ + body::BoxBody, + operation::OperationShape, + plugin::{ModelMarker, Plugin}, +}; +use pokemon_service_server_sdk::server::response::IntoResponse; +use tower::Service; + +pub struct AuthorizationPlugin { + // Private so that users are forced to use the `new` constructor. + _private: (), +} + +impl AuthorizationPlugin { + pub fn new() -> Self { + Self { _private: () } + } +} + +/// `T` is the inner service this plugin is applied to. +/// See the documentation for [`Plugin`] for details. +impl Plugin for AuthorizationPlugin { + type Output = AuthorizeService; + + fn apply(&self, input: T) -> Self::Output { + AuthorizeService { + inner: input, + authorizer: Authorizer::new(), + } + } +} + +impl ModelMarker for AuthorizationPlugin {} + +pub struct AuthorizeService { + inner: S, + authorizer: Authorizer, +} + +/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require +/// `Op` to be cloneable. +impl Clone for AuthorizeService +where + S: Clone, +{ + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + authorizer: self.authorizer.clone(), + } + } +} + +/// The error returned by [`AuthorizeService`]. +pub enum AuthorizeServiceError { + /// Authorization was successful, but the inner service yielded an error. + InnerServiceError(E), + /// Authorization was not successful. + AuthorizeError { message: String }, +} + +// Only the _outermost_ model plugin needs to apply a `Service` whose error type implements +// `IntoResponse` for the protocol the service uses (this requirement comes from the `Service` +// implementation of [`aws_smithy_http_server::operation::Upgrade`]). So if the model plugin is +// meant to be applied in any position, and to any Smithy service, one should implement +// `IntoResponse` for all protocols. +// +// Having model plugins apply a `Service` that has a `Service::Response` type or a `Service::Error` +// type that is different from those returned by the inner service hence diminishes the reusability +// of the plugin because it makes the plugin less composable. Most plugins should instead work with +// the inner service's types, and _at most_ require that those be `Op::Input` and `Op::Error`, for +// maximum composability: +// +// ``` +// ... +// where +// S: Service<(Op::Input, ($($var,)*)), Error = Op::Error> +// ... +// { +// type Response = S::Response; +// type Error = S::Error; +// type Future = Pin> + Send>>; +// } +// +// ``` +// +// This plugin still exemplifies how changing a type can be done to make it more interesting. + +impl IntoResponse

for AuthorizeServiceError +where + E: IntoResponse

, +{ + fn into_response(self) -> http::Response { + match self { + AuthorizeServiceError::InnerServiceError(e) => e.into_response(), + AuthorizeServiceError::AuthorizeError { message } => http::Response::builder() + .status(http::StatusCode::UNAUTHORIZED) + .body(aws_smithy_http_server::body::to_boxed(message)) + .expect("attempted to build an invalid HTTP response; please file a bug report"), + } + } +} + +macro_rules! impl_service { + ($($var:ident),*) => { + impl Service<(Op::Input, ($($var,)*))> for AuthorizeService + where + S: Service<(Op::Input, ($($var,)*)), Error = Op::Error> + Clone + Send + 'static, + S::Future: Send, + Op: OperationShape + Send + Sync + 'static, + Op::Input: Send + Sync + 'static, + $($var: Send + 'static,)* + { + type Response = S::Response; + type Error = AuthorizeServiceError; + type Future = + Pin> + Send>>; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner + .poll_ready(cx) + .map_err(|e| Self::Error::InnerServiceError(e)) + } + + fn call(&mut self, req: (Op::Input, ($($var,)*))) -> Self::Future { + let (input, exts) = req; + + // Replacing the service is necessary to avoid readiness problems. + // https://docs.rs/tower/latest/tower/trait.Service.html#be-careful-when-cloning-inner-services + let service = self.inner.clone(); + let mut service = std::mem::replace(&mut self.inner, service); + + let authorizer = self.authorizer.clone(); + + let fut = async move { + let is_authorized = authorizer.authorize(&input).await; + if !is_authorized { + return Err(Self::Error::AuthorizeError { + message: "Not authorized!".to_owned(), + }); + } + + service + .call((input, exts)) + .await + .map_err(|e| Self::Error::InnerServiceError(e)) + }; + Box::pin(fut) + } + } + }; +} + +struct Authorizer { + operation: PhantomData, +} + +/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require +/// `Op` to be cloneable. +impl Clone for Authorizer { + fn clone(&self) -> Self { + Self { + operation: PhantomData, + } + } +} + +impl Authorizer { + fn new() -> Self { + Self { + operation: PhantomData, + } + } + + async fn authorize(&self, _input: &Op::Input) -> bool + where + Op: OperationShape, + { + // We'd perform the actual authorization here. + // We would likely need to add bounds on `Op::Input`, `Op::Error`, if we wanted to do + // anything useful. + true + } +} + +// If we want our plugin to be as reusable as possible, the service it applies should work with +// inner services (i.e. operation handlers) that take a variable number of parameters. A Rust macro +// is helpful in providing those implementations concisely. +// Each handler function registered must accept the operation's input type (if there is one). +// Additionally, it can take up to 7 different parameters, each of which must implement the +// `FromParts` trait. To ensure that this `AuthorizeService` works with any of those inner +// services, we must implement it to handle up to +// 7 different types. Therefore, we invoke the `impl_service` macro 8 times. + +impl_service!(); +impl_service!(T1); +impl_service!(T1, T2); +impl_service!(T1, T2, T3); +impl_service!(T1, T2, T3, T4); +impl_service!(T1, T2, T3, T4, T5); +impl_service!(T1, T2, T3, T4, T5, T6); +impl_service!(T1, T2, T3, T4, T5, T6, T7); diff --git a/examples/pokemon-service/src/main.rs b/examples/pokemon-service/src/main.rs index 227d778fc80..b4198fdf3d3 100644 --- a/examples/pokemon-service/src/main.rs +++ b/examples/pokemon-service/src/main.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +mod authz; mod plugin; use std::{net::SocketAddr, sync::Arc}; @@ -11,7 +12,7 @@ use aws_smithy_http_server::{ extension::OperationExtensionExt, instrumentation::InstrumentExt, layer::alb_health_check::AlbHealthCheckLayer, - plugin::{HttpPlugins, IdentityPlugin, Scoped}, + plugin::{HttpPlugins, ModelPlugins, Scoped}, request::request_id::ServerRequestIdProviderLayer, AddExtensionLayer, }; @@ -29,6 +30,8 @@ use pokemon_service_common::{ }; use pokemon_service_server_sdk::{scope, PokemonService}; +use crate::authz::AuthorizationPlugin; + #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] struct Args { @@ -64,7 +67,10 @@ pub async fn main() { // Adds `tracing` spans and events to the request lifecycle. .instrument(); - let app = PokemonService::builder_with_plugins(plugins, IdentityPlugin) + let authz_plugin = AuthorizationPlugin::new(); + let model_plugins = ModelPlugins::new().push(authz_plugin); + + let app = PokemonService::builder_with_plugins(plugins, model_plugins) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs index a5d5ec66ec1..5ff37163bff 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs @@ -264,12 +264,13 @@ impl<'a, Pl> HttpMarker for &'a Pl where Pl: HttpMarker {} /// /// # Example implementation of a model plugin /// -/// Model plugins are most useful when you really need to rely on the actual shape of your -/// modeled operation input, operation output, and/or operation errors. For this reason, most -/// model plugins' implementation are _operation-specific_: somewhere in the type signature -/// of their definition, they'll rely on a operation shape's types. It is therefore important -/// that you scope application of model plugins to the operations they are meant to work on, via -/// [`Scoped`](crate::plugin::Scoped) or [`filter_by_operation`](crate::plugin::filter_by_operation). +/// Model plugins are most useful when you really need to rely on the actual shape of your modeled +/// operation input, operation output, and/or operation errors. For this reason, most (but not all) +/// model plugins are _operation-specific_: somewhere in the type signature of their definition, +/// they'll rely on a particular operation shape's types. It is therefore important that you scope +/// application of model plugins to the operations they are meant to work on, via +/// [`Scoped`](crate::plugin::Scoped) or +/// [`filter_by_operation`](crate::plugin::filter_by_operation). /// /// Below is an example implementation of a model plugin that can only be applied to the /// `CheckHealth` operation: note how in the `Service` trait implementation, we require access to From 0f38daeaf68cf05f9375816afcd295ad2507d418 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 17 Oct 2023 12:07:45 -0500 Subject: [PATCH 180/331] Move `SdkBody` and `bytestream` into `aws-smithy-types` (#3026) ## Motivation and Context Takes care of the first part of https://github.com/awslabs/smithy-rs/issues/3053 (the remaining part is denoted as `TODO(runtimeCratesVersioningCleanup)` and until that and https://github.com/awslabs/smithy-rs/issues/3033 are done the issue will not be closed). ## Description This PR moves from `aws-smithy-http` to `aws-smithy-types`: - the `SdkBody` struct - the `byte_stream` module Within the origin crate, we leave "breadcrumbs" (i.e. reexports) for existing customers of the items above so they are not broken by the move. We have just moved `SdkBody` to `aws-smithy-types` without renaming it to see how it looks there. However, as [TODO(naming)](https://github.com/awslabs/smithy-rs/pull/3026/files#diff-090c503b779024fdadb8ac97465c80438635df82e62c42b0d85b588a303d9a95R28) says, we can choose to rename it to just `Body`. Curious to hear what the reviewers think. ## Testing Relied on the tests in CI. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- .../aws-config/external-types.toml | 2 +- aws/rust-runtime/aws-http/external-types.toml | 2 +- .../aws-sig-auth/external-types.toml | 1 + .../aws-smithy-checksums/external-types.toml | 2 +- rust-runtime/aws-smithy-http/Cargo.toml | 15 +---- .../aws-smithy-http/external-types.toml | 13 +--- .../src/event_stream/receiver.rs | 2 +- .../src/futures_stream_adapter.rs | 1 + rust-runtime/aws-smithy-http/src/lib.rs | 8 ++- rust-runtime/aws-smithy-types/Cargo.toml | 22 +++++++ .../aws-smithy-types/external-types.toml | 13 ++++ .../src/body.rs | 2 +- .../src/byte_stream.rs | 59 +++++++++++-------- .../src/byte_stream/bytestream_util.rs | 2 +- .../src/byte_stream/error.rs | 0 rust-runtime/aws-smithy-types/src/lib.rs | 2 + 16 files changed, 88 insertions(+), 58 deletions(-) rename rust-runtime/{aws-smithy-http => aws-smithy-types}/src/body.rs (99%) rename rust-runtime/{aws-smithy-http => aws-smithy-types}/src/byte_stream.rs (92%) rename rust-runtime/{aws-smithy-http => aws-smithy-types}/src/byte_stream/bytestream_util.rs (99%) rename rust-runtime/{aws-smithy-http => aws-smithy-types}/src/byte_stream/error.rs (100%) diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index 94002d550d6..c6328580b05 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -12,7 +12,7 @@ allowed_external_types = [ "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_http::body::SdkBody", + "aws_smithy_types::body::SdkBody", "aws_smithy_http::endpoint", "aws_smithy_http::endpoint::error::InvalidEndpointError", "aws_smithy_http::result::SdkError", diff --git a/aws/rust-runtime/aws-http/external-types.toml b/aws/rust-runtime/aws-http/external-types.toml index 88240dcad00..66b8c8e1fec 100644 --- a/aws/rust-runtime/aws-http/external-types.toml +++ b/aws/rust-runtime/aws-http/external-types.toml @@ -1,5 +1,5 @@ allowed_external_types = [ - "aws_smithy_http::body::Error", + "aws_smithy_types::body::Error", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_types::app_name::AppName", diff --git a/aws/rust-runtime/aws-sig-auth/external-types.toml b/aws/rust-runtime/aws-sig-auth/external-types.toml index b348644ac6e..8e4d29dcff1 100644 --- a/aws/rust-runtime/aws-sig-auth/external-types.toml +++ b/aws/rust-runtime/aws-sig-auth/external-types.toml @@ -3,6 +3,7 @@ allowed_external_types = [ "aws_sigv4::http_request::sign::SignableBody", "aws_sigv4::http_request::error::SigningError", "aws_smithy_http::*", + "aws_smithy_types::body::SdkBody", "aws_types::*", "http::request::Request", "aws_smithy_runtime_api::client::identity::Identity", diff --git a/rust-runtime/aws-smithy-checksums/external-types.toml b/rust-runtime/aws-smithy-checksums/external-types.toml index 4ef87d4af8b..dbd4b4eee20 100644 --- a/rust-runtime/aws-smithy-checksums/external-types.toml +++ b/rust-runtime/aws-smithy-checksums/external-types.toml @@ -1,5 +1,5 @@ allowed_external_types = [ - "aws_smithy_http::*", + "aws_smithy_types::body::SdkBody", "bytes::bytes::Bytes", "http::header::map::HeaderMap", "http::header::name::HeaderName", diff --git a/rust-runtime/aws-smithy-http/Cargo.toml b/rust-runtime/aws-smithy-http/Cargo.toml index 0238f5dfc6a..4f9641013e9 100644 --- a/rust-runtime/aws-smithy-http/Cargo.toml +++ b/rust-runtime/aws-smithy-http/Cargo.toml @@ -11,8 +11,8 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [features] -rt-tokio = ["dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] event-stream = ["aws-smithy-eventstream"] +rt-tokio = ["aws-smithy-types/rt-tokio"] [dependencies] aws-smithy-eventstream = { path = "../aws-smithy-eventstream", optional = true } @@ -27,30 +27,19 @@ pin-project-lite = "0.2.9" pin-utils = "0.1.0" tracing = "0.1" -# We are using hyper for our streaming body implementation, but this is an internal detail. -hyper = "0.14.26" - -# ByteStream internals +# For an adapter to enable the `Stream` trait for `aws_smithy_types::byte_stream::ByteStream` futures-core = "0.3.14" -tokio = { version = "1.23.1", optional = true } -tokio-util = { version = "0.7", optional = true } [dev-dependencies] async-stream = "0.3" futures-util = { version = "0.3.16", default-features = false } hyper = { version = "0.14.26", features = ["stream"] } -pretty_assertions = "1.3" proptest = "1" tokio = { version = "1.23.1", features = [ "macros", "rt", "rt-multi-thread", - "fs", - "io-util", ] } -tokio-stream = "0.1.5" -tempfile = "3.2.0" -tracing-test = "0.2.1" [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-http/external-types.toml b/rust-runtime/aws-smithy-http/external-types.toml index cf745485bb7..cec3ff8a306 100644 --- a/rust-runtime/aws-smithy-http/external-types.toml +++ b/rust-runtime/aws-smithy-http/external-types.toml @@ -1,6 +1,5 @@ allowed_external_types = [ "aws_smithy_types::*", - "bytes::buf::buf_impl::Buf", "bytes::bytes::Bytes", "http::error::Error", "http::header::map::HeaderMap", @@ -12,20 +11,10 @@ allowed_external_types = [ "http::response::Builder", "http::response::Response", "http::uri::Uri", - "http::version::Version", - "http_body::Body", - "http_body::combinators::box_body::BoxBody", - "hyper::body::body::Body", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate Tokio `AsyncRead` - "tokio::io::async_read::AsyncRead", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "futures_core::stream::Stream", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate references to Tokio `File` - "tokio::fs::file::File", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", ] diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index 3b38161f3bb..eb931900a56 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -11,7 +11,7 @@ use aws_smithy_eventstream::frame::{ use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; -use hyper::body::HttpBody; +use http_body::Body; use std::error::Error as StdError; use std::fmt; use std::marker::PhantomData; diff --git a/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs index 0e718df4932..65b5d5d0429 100644 --- a/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs +++ b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs @@ -17,6 +17,7 @@ use std::task::{Context, Poll}; /// new-type to enable the trait when it is required. /// /// This is meant to be used by codegen code, and users should not need to use it directly. +#[derive(Debug)] pub struct FuturesStreamCompatByteStream(ByteStream); impl FuturesStreamCompatByteStream { diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index 2601a8e7624..245a477fb4c 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -25,7 +25,11 @@ #![allow(clippy::derive_partial_eq_without_eq)] #![cfg_attr(docsrs, feature(doc_cfg))] -pub mod body; +//TODO(runtimeCratesVersioningCleanup): Re-point those who use the following reexports to +// directly depend on `aws_smithy_types` and remove the reexports below. +pub use aws_smithy_types::body; +pub use aws_smithy_types::byte_stream; + pub mod endpoint; // Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code // generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being @@ -45,7 +49,5 @@ pub mod result; #[cfg(feature = "event-stream")] pub mod event_stream; -pub mod byte_stream; - pub mod connection; mod urlencode; diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index 5a975278a9d..0b3796d9bd1 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -11,17 +11,30 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [features] +rt-tokio = ["dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] test-util = [] serde-serialize = [] serde-deserialize = [] [dependencies] base64-simd = "0.8" +bytes = "1" +bytes-utils = "0.1" +http = "0.2.3" +http-body = "0.4.4" +hyper = "0.14.26" itoa = "1.0.0" num-integer = "0.1.44" +pin-project-lite = "0.2.9" +pin-utils = "0.1.0" ryu = "1.0.5" time = { version = "0.3.4", features = ["parsing"] } +# ByteStream internals +futures-core = "0.3.14" +tokio = { version = "1.23.1", optional = true } +tokio-util = { version = "0.7", optional = true } + [dev-dependencies] base64 = "0.13.0" ciborium = { version = "0.2.1" } @@ -31,6 +44,15 @@ proptest = "1" rand = "0.8.4" serde = { version = "1", features = ["derive"] } serde_json = "1" +tokio = { version = "1.23.1", features = [ + "macros", + "rt", + "rt-multi-thread", + "fs", + "io-util", +] } +tokio-stream = "0.1.5" +tempfile = "3.2.0" [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-types/external-types.toml b/rust-runtime/aws-smithy-types/external-types.toml index ff30ccf5ad0..ad90d2a11be 100644 --- a/rust-runtime/aws-smithy-types/external-types.toml +++ b/rust-runtime/aws-smithy-types/external-types.toml @@ -1,2 +1,15 @@ allowed_external_types = [ + "bytes::bytes::Bytes", + "bytes::buf::buf_impl::Buf", + + # TODO(https://github.com/awslabs/smithy-rs/issues/3033): Feature gate based on unstable versions + "http_body::Body", + "http_body::combinators::box_body::BoxBody", + "hyper::body::body::Body", + + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate Tokio `AsyncRead` + "tokio::io::async_read::AsyncRead", + + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate references to Tokio `File` + "tokio::fs::file::File", ] diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-types/src/body.rs similarity index 99% rename from rust-runtime/aws-smithy-http/src/body.rs rename to rust-runtime/aws-smithy-types/src/body.rs index 5f8ac23a349..ae21207bfa9 100644 --- a/rust-runtime/aws-smithy-http/src/body.rs +++ b/rust-runtime/aws-smithy-types/src/body.rs @@ -197,7 +197,7 @@ impl SdkBody { } } - /// Update this `SdkBody` with `map`. **This function MUST NOT alert the data of the body.** + /// Update this `SdkBody` with `map`. **This function MUST NOT alter the data of the body.** /// /// This function is useful for adding metadata like progress tracking to an [`SdkBody`] that /// does not alter the actual byte data. If your mapper alters the contents of the body, use [`SdkBody::map`] diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs similarity index 92% rename from rust-runtime/aws-smithy-http/src/byte_stream.rs rename to rust-runtime/aws-smithy-types/src/byte_stream.rs index e6484317497..909bea34c0f 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -12,7 +12,7 @@ //! //! ### Writing a ByteStream into a file: //! ```no_run -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::error::Error; //! use tokio::fs::File; //! use tokio::io::AsyncWriteExt; @@ -34,7 +34,7 @@ //! ### Converting a ByteStream into Bytes //! ```no_run //! use bytes::Bytes; -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::error::Error; //! struct SynthesizeSpeechOutput { //! audio_stream: ByteStream, @@ -53,7 +53,7 @@ //! //! ```no_run //! use bytes::{Buf, Bytes}; -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::error::Error; //! use tokio::fs::File; //! use tokio::io::AsyncWriteExt; @@ -83,7 +83,7 @@ //! ```no_run //! # #[cfg(feature = "rt-tokio")] //! # { -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::path::Path; //! struct GetObjectInput { //! body: ByteStream @@ -104,7 +104,7 @@ //! ```no_run //! # #[cfg(feature = "rt-tokio")] //! # { -//! use aws_smithy_http::byte_stream::{ByteStream, Length}; +//! use aws_smithy_types::byte_stream::{ByteStream, Length}; //! use std::path::Path; //! struct GetObjectInput { //! body: ByteStream @@ -157,8 +157,8 @@ pin_project! { /// [`.collect()`](crate::byte_stream::ByteStream::collect) reads the complete ByteStream into memory and stores it in `AggregatedBytes`, /// a non-contiguous ByteBuffer. /// ```no_run - /// use aws_smithy_http::byte_stream::{ByteStream, AggregatedBytes}; - /// use aws_smithy_http::body::SdkBody; + /// use aws_smithy_types::byte_stream::{ByteStream, AggregatedBytes}; + /// use aws_smithy_types::body::SdkBody; /// use bytes::Buf; /// async fn example() { /// let stream = ByteStream::new(SdkBody::from("hello! This is some data")); @@ -181,8 +181,8 @@ pin_project! { /// # pub fn finish(&self) -> u64 { 6 } /// # } /// # } - /// use aws_smithy_http::byte_stream::{ByteStream, AggregatedBytes, error::Error}; - /// use aws_smithy_http::body::SdkBody; + /// use aws_smithy_types::byte_stream::{ByteStream, AggregatedBytes, error::Error}; + /// use aws_smithy_types::body::SdkBody; /// /// async fn example() -> Result<(), Error> { /// let mut stream = ByteStream::from(vec![1, 2, 3, 4, 5, 99]); @@ -202,8 +202,8 @@ pin_project! { /// It's possible to convert a `ByteStream` into a struct that implements [`tokio::io::AsyncRead`](tokio::io::AsyncRead). /// Then, you can use pre-existing tools like [`tokio::io::BufReader`](tokio::io::BufReader): /// ```no_run - /// use aws_smithy_http::byte_stream::ByteStream; - /// use aws_smithy_http::body::SdkBody; + /// use aws_smithy_types::byte_stream::ByteStream; + /// use aws_smithy_types::body::SdkBody; /// use tokio::io::{AsyncBufReadExt, BufReader}; /// #[cfg(feature = "rt-tokio")] /// async fn example() -> std::io::Result<()> { @@ -224,7 +224,7 @@ pin_project! { /// will be converted into `Bytes` enabling a cheap clone during retries. /// ```no_run /// use bytes::Bytes; - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// let stream = ByteStream::from(vec![1,2,3]); /// let stream = ByteStream::from(Bytes::from_static(b"hello!")); /// ``` @@ -233,7 +233,7 @@ pin_project! { /// ```no_run /// #[cfg(feature = "tokio-rt")] /// # { - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// let stream = ByteStream::from_path("big_file.csv"); /// # } /// ``` @@ -242,8 +242,8 @@ pin_project! { /// from an SdkBody. **When created from an SdkBody, care must be taken to ensure retriability.** An SdkBody is retryable /// when constructed from in-memory data or when using [`SdkBody::retryable`](crate::body::SdkBody::retryable). /// ```no_run - /// use aws_smithy_http::byte_stream::ByteStream; - /// use aws_smithy_http::body::SdkBody; + /// use aws_smithy_types::byte_stream::ByteStream; + /// use aws_smithy_types::body::SdkBody; /// use bytes::Bytes; /// let (mut tx, channel_body) = hyper::Body::channel(); /// // this will not be retryable because the SDK has no way to replay this stream @@ -322,9 +322,9 @@ impl ByteStream { /// over the network. If a contiguous slice is required, use `into_bytes()`. /// ```no_run /// use bytes::Bytes; - /// use aws_smithy_http::body; - /// use aws_smithy_http::body::SdkBody; - /// use aws_smithy_http::byte_stream::{ByteStream, error::Error}; + /// use aws_smithy_types::body; + /// use aws_smithy_types::body::SdkBody; + /// use aws_smithy_types::byte_stream::{ByteStream, error::Error}; /// async fn get_data() { /// let stream = ByteStream::new(SdkBody::from("hello!")); /// let data: Result = stream.collect().await.map(|data| data.into_bytes()); @@ -339,7 +339,7 @@ impl ByteStream { /// ```no_run /// # #[cfg(feature = "rt-tokio")] /// # { - /// use aws_smithy_http::byte_stream::{ByteStream, Length}; + /// use aws_smithy_types::byte_stream::{ByteStream, Length}; /// /// async fn bytestream_from_file() -> ByteStream { /// let bytestream = ByteStream::read_from() @@ -379,7 +379,7 @@ impl ByteStream { /// /// # Examples /// ```no_run - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// use std::path::Path; /// async fn make_bytestream() -> ByteStream { /// ByteStream::from_path("docs/rows.csv").await.expect("file should be readable") @@ -412,7 +412,7 @@ impl ByteStream { /// /// ```rust /// use tokio::io::{BufReader, AsyncBufReadExt}; - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// /// # async fn dox(my_bytestream: ByteStream) -> std::io::Result<()> { /// let mut lines = BufReader::new(my_bytestream.into_async_read()).lines(); @@ -423,9 +423,20 @@ impl ByteStream { /// # } /// ``` pub fn into_async_read(self) -> impl tokio::io::AsyncRead { - tokio_util::io::StreamReader::new( - crate::futures_stream_adapter::FuturesStreamCompatByteStream::new(self), - ) + // The `Stream` trait is currently unstable so we can only use it in private. + // Here, we create a local struct just to enable the trait for `ByteStream` and pass it + // to `StreamReader`. + struct FuturesStreamCompatByteStream(ByteStream); + impl futures_core::stream::Stream for FuturesStreamCompatByteStream { + type Item = Result; + fn poll_next( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll> { + Pin::new(&mut self.0).poll_next(cx) + } + } + tokio_util::io::StreamReader::new(FuturesStreamCompatByteStream(self)) } /// Given a function to modify an [`SdkBody`], run it on the `SdkBody` inside this `Bytestream`. diff --git a/rust-runtime/aws-smithy-http/src/byte_stream/bytestream_util.rs b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs similarity index 99% rename from rust-runtime/aws-smithy-http/src/byte_stream/bytestream_util.rs rename to rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs index 3768a57509b..91ad71e9174 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream/bytestream_util.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs @@ -64,7 +64,7 @@ impl PathBody { /// ```no_run /// # #[cfg(feature = "rt-tokio")] /// # { -/// use aws_smithy_http::byte_stream::{ByteStream, Length}; +/// use aws_smithy_types::byte_stream::{ByteStream, Length}; /// use std::path::Path; /// struct GetObjectInput { /// body: ByteStream diff --git a/rust-runtime/aws-smithy-http/src/byte_stream/error.rs b/rust-runtime/aws-smithy-types/src/byte_stream/error.rs similarity index 100% rename from rust-runtime/aws-smithy-http/src/byte_stream/error.rs rename to rust-runtime/aws-smithy-types/src/byte_stream/error.rs diff --git a/rust-runtime/aws-smithy-types/src/lib.rs b/rust-runtime/aws-smithy-types/src/lib.rs index 76fb9010c3d..7e805c310c9 100644 --- a/rust-runtime/aws-smithy-types/src/lib.rs +++ b/rust-runtime/aws-smithy-types/src/lib.rs @@ -14,6 +14,8 @@ unreachable_pub )] pub mod base64; +pub mod body; +pub mod byte_stream; /// A typemap for storing configuration. pub mod config_bag; pub mod date_time; From 6dceb8c0748853b44f93a5182164173333592e16 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 17 Oct 2023 15:41:25 -0400 Subject: [PATCH 181/331] Move default endpoint resolver into a runtime plugin (#3072) ## Motivation and Context In preparation for inlining the old endpoint traits, I'm cleaning up the endpoint resolver behavior. ## Description 1. The `Config` field of `service_runtime_plugin` was unused to I deleted it 2. Store the endpoint resolver in `RuntimeComponents` instead of in operation config. This allows a lot of complex logic around `ConfigOverride` to be removed. 3. Move the default endpoint resolver into a runtime plugin. 4. Don't have a fallback implementation for `EndpointResolver`, allow final construction of `RuntimeComponents` to fail 5. `ServiceRuntimePlugin` has been changed to `Defaults` so that it doesn't overwrite settings set by the service config ## Testing Well covered by existing UT / IT ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++ .../client/smithy/RustClientCodegenPlugin.kt | 2 + .../IdempotencyTokenDecorator.kt | 60 ++++++++++++++++ .../IdempotencyTokenGenerator.kt | 49 +++++-------- .../customize/RequiredCustomizations.kt | 2 - .../endpoint/EndpointConfigCustomization.kt | 72 +------------------ .../smithy/endpoint/EndpointsDecorator.kt | 50 +++++++++++++ .../ConfigOverrideRuntimePluginGenerator.kt | 1 + .../generators/OperationCustomization.kt | 4 +- .../ServiceRuntimePluginGenerator.kt | 9 +++ .../IdempotencyTokenProviderCustomization.kt | 26 ------- .../config/ServiceConfigGenerator.kt | 4 -- ...onfigOverrideRuntimePluginGeneratorTest.kt | 24 ++----- .../transformers/OperationNormalizer.kt | 7 ++ .../XmlBindingTraitSerializerGeneratorTest.kt | 1 + rust-runtime/aws-smithy-http/src/endpoint.rs | 4 -- .../src/client_idempotency_token.rs | 8 ++- .../inlineable/src/idempotency_token.rs | 2 +- 18 files changed, 172 insertions(+), 159 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b1a59c806c2..47b470967cd 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -408,3 +408,9 @@ message = "`RuntimeComponents` have been added as an argument to the `IdentityRe references = ["smithy-rs#2917"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} author = "jdisanti" + +[[smithy-rs]] +message = "The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor." +references = ["smithy-rs#3072"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt index 39bc4633f2c..08814fadac1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.customizations.ClientCustomizations import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpConnectorConfigDecorator +import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.SensitiveOutputDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator @@ -66,6 +67,7 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() { HttpAuthDecorator(), HttpConnectorConfigDecorator(), SensitiveOutputDecorator(), + IdempotencyTokenDecorator(), *decorator, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt new file mode 100644 index 00000000000..b33ee8fbbc2 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt @@ -0,0 +1,60 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.IdempotencyTokenProviderCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.needsIdempotencyToken +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.extendIf + +class IdempotencyTokenDecorator : ClientCodegenDecorator { + override val name: String = "IdempotencyToken" + override val order: Byte = 0 + + private fun enabled(ctx: ClientCodegenContext) = ctx.serviceShape.needsIdempotencyToken(ctx.model) + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = baseCustomizations.extendIf(enabled(codegenContext)) { + IdempotencyTokenProviderCustomization(codegenContext) + } + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List { + return baseCustomizations + IdempotencyTokenGenerator(codegenContext, operation) + } + + override fun serviceRuntimePluginCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations.extendIf(enabled(codegenContext)) { + object : ServiceRuntimePluginCustomization() { + override fun section(section: ServiceRuntimePluginSection) = writable { + if (section is ServiceRuntimePluginSection.AdditionalConfig) { + section.putConfigValue(this, defaultTokenProvider((codegenContext.runtimeConfig))) + } + } + } + } + } +} + +private fun defaultTokenProvider(runtimeConfig: RuntimeConfig) = + writable { rust("#T()", RuntimeType.idempotencyToken(runtimeConfig).resolve("default_provider")) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt index dd1bcfef08f..c07205bf624 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt @@ -20,12 +20,13 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.isOptional +import software.amazon.smithy.rust.codegen.core.util.UNREACHABLE import software.amazon.smithy.rust.codegen.core.util.findMemberWithTrait import software.amazon.smithy.rust.codegen.core.util.inputShape class IdempotencyTokenGenerator( codegenContext: CodegenContext, - operationShape: OperationShape, + private val operationShape: OperationShape, ) : OperationCustomization() { private val model = codegenContext.model private val runtimeConfig = codegenContext.runtimeConfig @@ -47,44 +48,32 @@ class IdempotencyTokenGenerator( "/inlineable/src/client_idempotency_token.rs", CargoDependency.smithyRuntimeApi(runtimeConfig), CargoDependency.smithyTypes(runtimeConfig), + InlineDependency.idempotencyToken(runtimeConfig), ).toType().resolve("IdempotencyTokenRuntimePlugin"), ) return when (section) { is OperationSection.AdditionalRuntimePlugins -> writable { section.addOperationRuntimePlugin(this) { - if (symbolProvider.toSymbol(idempotencyTokenMember).isOptional()) { - // An idempotency token is optional. If the user didn't specify a token - // then we'll generate one and set it. - rustTemplate( - """ - #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { - let input: &mut #{Input} = input.downcast_mut().expect("correct type"); - if input.$memberName.is_none() { - input.$memberName = #{Some}(token_provider.make_idempotency_token()); - } - }) - """, - *codegenScope, - ) - } else { - // An idempotency token is required, but it'll be set to an empty string if - // the user didn't specify one. If that's the case, then we'll generate one - // and set it. - rustTemplate( - """ - #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { - let input: &mut #{Input} = input.downcast_mut().expect("correct type"); - if input.$memberName.is_empty() { - input.$memberName = token_provider.make_idempotency_token(); - } - }) - """, - *codegenScope, - ) + if (!symbolProvider.toSymbol(idempotencyTokenMember).isOptional()) { + UNREACHABLE("top level input members are always optional. $operationShape") } + // An idempotency token is optional. If the user didn't specify a token + // then we'll generate one and set it. + rustTemplate( + """ + #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { + let input: &mut #{Input} = input.downcast_mut().expect("correct type"); + if input.$memberName.is_none() { + input.$memberName = #{Some}(token_provider.make_idempotency_token()); + } + }) + """, + *codegenScope, + ) } } + else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index a1f11cf4a26..2123d802868 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -10,7 +10,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customizations.ConnectionPoisoningRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpChecksumRequiredGenerator -import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenGenerator import software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization @@ -50,7 +49,6 @@ class RequiredCustomizations : ClientCodegenDecorator { ): List = baseCustomizations + MetadataCustomization(codegenContext, operation) + - IdempotencyTokenGenerator(codegenContext, operation) + HttpChecksumRequiredGenerator(codegenContext, operation) + RetryClassifierOperationCustomization(codegenContext, operation) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index cd363219ea5..84d30a44834 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -153,25 +154,12 @@ internal class EndpointConfigCustomization( rustTemplate( """ pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.config.store_or_unset(endpoint_resolver); + self.runtime_components.set_endpoint_resolver(endpoint_resolver.map(|r|#{wrap_resolver})); self } """, *codegenScope, - ) - } - - ServiceConfig.BuilderBuild -> { - rustTemplate( - "#{set_endpoint_resolver}(&mut resolver);", - "set_endpoint_resolver" to setEndpointResolverFn(), - ) - } - - is ServiceConfig.OperationConfigOverride -> { - rustTemplate( - "#{set_endpoint_resolver}(&mut resolver);", - "set_endpoint_resolver" to setEndpointResolverFn(), + "wrap_resolver" to codegenContext.wrapResolver { rust("r") }, ) } @@ -179,58 +167,4 @@ internal class EndpointConfigCustomization( } } } - - private fun defaultResolver(): RuntimeType { - // For now, fallback to a default endpoint resolver that always fails. In the future, - // the endpoint resolver will be required (so that it can be unwrapped). - return typesGenerator.defaultResolver() ?: RuntimeType.forInlineFun( - "MissingResolver", - ClientRustModule.Config.endpoint, - ) { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct MissingResolver; - impl MissingResolver { - pub(crate) fn new() -> Self { Self } - } - impl #{ResolveEndpoint} for MissingResolver { - fn resolve_endpoint(&self, _params: &T) -> #{Result} { - Err(#{ResolveEndpointError}::message("an endpoint resolver must be provided.")) - } - } - """, - "ResolveEndpoint" to types.resolveEndpoint, - "ResolveEndpointError" to types.resolveEndpointError, - "Result" to types.smithyHttpEndpointModule.resolve("Result"), - ) - } - } - - private fun setEndpointResolverFn(): RuntimeType = RuntimeType.forInlineFun("set_endpoint_resolver", ClientRustModule.config) { - // TODO(enableNewSmithyRuntimeCleanup): Simplify the endpoint resolvers - rustTemplate( - """ - fn set_endpoint_resolver(resolver: &mut #{Resolver}<'_>) { - let endpoint_resolver = if resolver.is_initial() { - Some(resolver.resolve_config::<#{OldSharedEndpointResolver}<#{Params}>>().cloned().unwrap_or_else(|| - #{OldSharedEndpointResolver}::new(#{DefaultResolver}::new()) - )) - } else if resolver.is_latest_set::<#{OldSharedEndpointResolver}<#{Params}>>() { - resolver.resolve_config::<#{OldSharedEndpointResolver}<#{Params}>>().cloned() - } else { - None - }; - if let Some(endpoint_resolver) = endpoint_resolver { - let shared = #{SharedEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new(endpoint_resolver) - ); - resolver.runtime_components_mut().set_endpoint_resolver(#{Some}(shared)); - } - } - """, - *codegenScope, - "DefaultResolver" to defaultResolver(), - ) - } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index c5579771dbe..a569d4f6f3e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -13,8 +13,14 @@ import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegen import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.endpointTestsModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.map +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate /** @@ -104,6 +110,24 @@ class EndpointsDecorator : ClientCodegenDecorator { EndpointConfigCustomization(codegenContext, EndpointTypesGenerator.fromContext(codegenContext)) } + override fun serviceRuntimePluginCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations + object : ServiceRuntimePluginCustomization() { + override fun section(section: ServiceRuntimePluginSection): Writable { + return when (section) { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> writable { + codegenContext.defaultEndpointResolver() + ?.let { resolver -> section.registerEndpointResolver(this, resolver) } + } + + else -> emptySection + } + } + } + } + override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val generator = EndpointTypesGenerator.fromContext(codegenContext) rustCrate.withModule(ClientRustModule.Config.endpoint) { @@ -113,3 +137,29 @@ class EndpointsDecorator : ClientCodegenDecorator { } } } + +private fun ClientCodegenContext.defaultEndpointResolver(): Writable? { + val generator = EndpointTypesGenerator.fromContext(this) + val defaultResolver = generator.defaultResolver() ?: return null + val ctx = arrayOf("DefaultResolver" to defaultResolver) + return wrapResolver { rustTemplate("#{DefaultResolver}::new()", *ctx) } +} + +fun ClientCodegenContext.wrapResolver(resolver: Writable): Writable { + val generator = EndpointTypesGenerator.fromContext(this) + return resolver.map { base -> + val types = Types(runtimeConfig) + val ctx = arrayOf( + "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig) + .resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), + "Params" to generator.paramsStruct(), + "OldSharedEndpointResolver" to types.sharedEndpointResolver, + ) + + rustTemplate( + "#{DefaultEndpointResolver}::<#{Params}>::new(#{OldSharedEndpointResolver}::new(#{base}))", + *ctx, + "base" to base, + ) + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index 3c203a20f86..e83ba1e0e87 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -56,6 +56,7 @@ class ConfigOverrideRuntimePluginGenerator( ) -> Self { let mut layer = config_override.config; let mut components = config_override.runtime_components; + ##[allow(unused_mut)] let mut resolver = #{Resolver}::overrid(initial_config, initial_components, &mut layer, &mut components); #{config} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index db534910ef5..176b85b1c8f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -95,8 +95,8 @@ sealed class OperationSection(name: String) : Section(name) { override val customizations: List, val operationShape: OperationShape, ) : OperationSection("AdditionalRuntimePlugins") { - fun addServiceRuntimePlugin(writer: RustWriter, plugin: Writable) { - writer.rustTemplate(".with_service_plugin(#{plugin})", "plugin" to plugin) + fun addClientPlugin(writer: RustWriter, plugin: Writable) { + writer.rustTemplate(".with_client_plugin(#{plugin})", "plugin" to plugin) } fun addOperationRuntimePlugin(writer: RustWriter, plugin: Writable) { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index dccbd924af9..60015d897cc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -47,6 +47,10 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { writer.rust("runtime_components.push_auth_scheme(#T);", authScheme) } + fun registerEndpointResolver(writer: RustWriter, resolver: Writable) { + writer.rust("runtime_components.set_endpoint_resolver(Some(#T));", resolver) + } + fun registerIdentityResolver(writer: RustWriter, identityResolver: Writable) { writer.rust("runtime_components.push_identity_resolver(#T);", identityResolver) } @@ -77,6 +81,7 @@ class ServiceRuntimePluginGenerator( "Layer" to smithyTypes.resolve("config_bag::Layer"), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), "RuntimePlugin" to RuntimeType.runtimePlugin(rc), + "Order" to runtimeApi.resolve("client::runtime_plugin::Order"), ) } @@ -109,6 +114,10 @@ class ServiceRuntimePluginGenerator( self.config.clone() } + fn order(&self) -> #{Order} { + #{Order}::Defaults + } + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { #{Cow}::Borrowed(&self.runtime_components) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt index 0408c72d8e6..fd04a062248 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt @@ -21,26 +21,11 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, - "default_provider" to RuntimeType.idempotencyToken(runtimeConfig).resolve("default_provider"), "IdempotencyTokenProvider" to RuntimeType.idempotencyToken(runtimeConfig).resolve("IdempotencyTokenProvider"), ) override fun section(section: ServiceConfig): Writable { return when (section) { - ServiceConfig.ConfigImpl -> writable { - rustTemplate( - """ - /// Returns a copy of the idempotency token provider. - /// If a random token provider was configured, - /// a newly-randomized token provider will be returned. - pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { - self.config.load::<#{IdempotencyTokenProvider}>().expect("the idempotency provider should be set").clone() - } - """, - *codegenScope, - ) - } - ServiceConfig.BuilderImpl -> writable { rustTemplate( """ @@ -65,17 +50,6 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext ) } - ServiceConfig.BuilderBuild -> writable { - rustTemplate( - """ - if !resolver.is_set::<#{IdempotencyTokenProvider}>() { - resolver.config_mut().store_put(#{default_provider}()); - } - """, - *codegenScope, - ) - } - is ServiceConfig.DefaultForTests -> writable { rust("""${section.configBuilderRef}.set_idempotency_token_provider(Some("00000000-0000-4000-8000-000000000000".into()));""") } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index a6379bb4b4a..bc3eea97622 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -257,9 +257,6 @@ class ServiceConfigGenerator( extraCustomizations: List, ): ServiceConfigGenerator { val baseFeatures = mutableListOf() - if (codegenContext.serviceShape.needsIdempotencyToken(codegenContext.model)) { - baseFeatures.add(IdempotencyTokenProviderCustomization(codegenContext)) - } return ServiceConfigGenerator(codegenContext, baseFeatures + extraCustomizations) } } @@ -419,7 +416,6 @@ class ServiceConfigGenerator( rustTemplate( """ let mut layer = self.config; - let mut resolver = #{Resolver}::initial(&mut layer, &mut self.runtime_components); """, *codegenScope, ) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index f167d357677..e8c51575d64 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -45,33 +45,21 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { .resolve("client::endpoint::EndpointResolverParams"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), + "capture_request" to RuntimeType.captureRequest(runtimeConfig), ) rustCrate.testModule { addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) tokioTest("test_operation_overrides_endpoint_resolver") { rustTemplate( """ - use #{RuntimePlugin}; - use ::aws_smithy_runtime_api::client::endpoint::EndpointResolver; - let expected_url = "http://localhost:1234/"; - let client_config = crate::config::Config::builder().build(); + let (http_client, req) = #{capture_request}(None); + let client_config = crate::config::Config::builder().http_client(http_client).build(); let config_override = crate::config::Config::builder().endpoint_resolver(expected_url); - let sut = crate::config::ConfigOverrideRuntimePlugin::new( - config_override, - client_config.config, - &client_config.runtime_components, - ); - let prev = #{RuntimeComponentsBuilder}::new("prev"); - let sut_components = sut.runtime_components(&prev); - let endpoint_resolver = sut_components.endpoint_resolver().unwrap(); - let endpoint = endpoint_resolver - .resolve_endpoint(&#{EndpointResolverParams}::new(crate::config::endpoint::Params {})) - .await - .unwrap(); - - assert_eq!(expected_url, endpoint.url()); + let client = crate::Client::from_conf(client_config); + let _ = dbg!(client.say_hello().customize().config_override(config_override).send().await); + assert_eq!("http://localhost:1234/", req.expect_request().uri()); """, *codegenScope, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt index 78a6852fd6b..eb19fd7fab1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt @@ -10,9 +10,11 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.traits.InputTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait +import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.rename import java.util.Optional @@ -106,6 +108,11 @@ object OperationNormalizer { val inputShapeBuilder = operation.input.map { shapeId -> model.expectShape(shapeId, StructureShape::class.java).toBuilder().rename(inputId) }.orElse(empty(inputId)) + // There are still shapes missing the input trait. If we don't apply this, we'll get bad results from the + // nullability index + if (!inputShapeBuilder.build().hasTrait()) { + inputShapeBuilder.addTrait(InputTrait()) + } return inputShapeBuilder.addTrait( SyntheticInputTrait( operation = operation.id, diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt index 4410c33910b..2aa24581b55 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt @@ -226,6 +226,7 @@ internal class XmlBindingTraitSerializerGeneratorTest { member: Top } + @input structure OpInput { @required @httpPayload diff --git a/rust-runtime/aws-smithy-http/src/endpoint.rs b/rust-runtime/aws-smithy-http/src/endpoint.rs index 03759cc5313..78ea5b2a349 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint.rs @@ -65,10 +65,6 @@ impl From>> for SharedEndpointResolver { } } -impl Storable for SharedEndpointResolver { - type Storer = StoreReplace>; -} - impl ResolveEndpoint for SharedEndpointResolver { fn resolve_endpoint(&self, params: &T) -> Result { self.0.resolve_endpoint(params) diff --git a/rust-runtime/inlineable/src/client_idempotency_token.rs b/rust-runtime/inlineable/src/client_idempotency_token.rs index 6d857471f75..40f361278d1 100644 --- a/rust-runtime/inlineable/src/client_idempotency_token.rs +++ b/rust-runtime/inlineable/src/client_idempotency_token.rs @@ -3,7 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::idempotency_token::IdempotencyTokenProvider; +use std::borrow::Cow; +use std::fmt; + use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, Input, @@ -14,8 +16,8 @@ use aws_smithy_runtime_api::client::runtime_components::{ }; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::config_bag::ConfigBag; -use std::borrow::Cow; -use std::fmt; + +use crate::idempotency_token::IdempotencyTokenProvider; #[derive(Debug)] pub(crate) struct IdempotencyTokenRuntimePlugin { diff --git a/rust-runtime/inlineable/src/idempotency_token.rs b/rust-runtime/inlineable/src/idempotency_token.rs index 12921f02af8..69425abc80b 100644 --- a/rust-runtime/inlineable/src/idempotency_token.rs +++ b/rust-runtime/inlineable/src/idempotency_token.rs @@ -31,7 +31,7 @@ pub(crate) fn uuid_v4(input: u128) -> String { out } -/// IdempotencyTokenProvider generates idempotency tokens for idempotency API requests +/// IdempotencyTokenProvider generates idempotency tokens for idempotent API requests /// /// Generally, customers will not need to interact with this at all. A sensible default will be /// provided automatically during config construction. However, if you need deterministic behavior From d48acae8a206814d7596c6bfbda871a9a17a9d25 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 17 Oct 2023 13:11:56 -0700 Subject: [PATCH 182/331] Implement an identity cache in aws-smithy-runtime (#3062) This PR adds a `ResolveCachedIdentity` trait, and adapts the existing LazyCredentialsCache implementation to it. It does NOT make this cache used yet, as that will be done as a separate PR to keep code review smaller. Notable differences from the credentials cache: - Supports multiple different identity types and identity resolvers - Applies cache partitioning to the `SharedIdentityResolver` so that operation config overrides of the identity resolver will result in the correct identity being resolved. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-config/src/sso/token.rs | 2 +- .../aws-runtime/src/auth/sigv4a.rs | 2 +- .../src/client/identity.rs | 105 ++- .../src/client/runtime_components.rs | 2 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 2 +- .../aws-smithy-runtime/src/client/identity.rs | 3 + .../src/client/identity/cache.rs | 95 +++ .../src/client/identity/cache/lazy.rs | 713 ++++++++++++++++++ .../aws-smithy-runtime/src/expiring_cache.rs | 164 ++++ rust-runtime/aws-smithy-runtime/src/lib.rs | 3 + 10 files changed, 1081 insertions(+), 10 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/expiring_cache.rs diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs index d4e1cc8b79b..b543fdc26f9 100644 --- a/aws/rust-runtime/aws-config/src/sso/token.rs +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -464,7 +464,7 @@ mod tests { .unwrap(); let token = identity.data::().unwrap().clone(); assert_eq!(value, token.token()); - assert_eq!(time(expires_at), *identity.expiration().unwrap()); + assert_eq!(time(expires_at), identity.expiration().unwrap()); } async fn expect_expired_token_err(&self) { diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs index e5fd8794740..e22d913ee62 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs @@ -81,7 +81,7 @@ impl SigV4aSigner { request_timestamp: SystemTime, ) -> Result, SigV4SigningError> { if let Some(expires_in) = settings.expires_in { - if let Some(&identity_expiration) = identity.expiration() { + if let Some(identity_expiration) = identity.expiration() { let presigned_expires_time = request_timestamp + expires_in; if presigned_expires_time > identity_expiration { tracing::warn!(EXPIRATION_WARNING); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index c9377f9c9f2..8ec6fb88511 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -11,6 +11,7 @@ use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; use std::fmt; use std::fmt::Debug; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::time::SystemTime; @@ -22,6 +23,72 @@ new_type_future! { pub struct IdentityFuture<'a, Identity, BoxError>; } +static NEXT_CACHE_PARTITION: AtomicUsize = AtomicUsize::new(0); + +/// Cache partition key for identity caching. +/// +/// Identities need cache partitioning because a single identity cache is used across +/// multiple identity providers across multiple auth schemes. In addition, a single auth scheme +/// may have many different identity providers due to operation-level config overrides. +/// +/// This partition _must_ be respected when retrieving from the identity cache and _should_ +/// be part of the cache key. +/// +/// Calling [`IdentityCachePartition::new`] will create a new globally unique cache partition key, +/// and the [`SharedIdentityResolver`] will automatically create and store a partion on construction. +/// Thus, every configured identity resolver will be assigned a unique partition. +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] +pub struct IdentityCachePartition(usize); + +impl IdentityCachePartition { + /// Create a new globally unique cache partition key. + pub fn new() -> Self { + Self(NEXT_CACHE_PARTITION.fetch_add(1, Ordering::Relaxed)) + } + + /// Helper for unit tests to create an identity cache partition with a known value. + #[cfg(feature = "test-util")] + pub fn new_for_tests(value: usize) -> IdentityCachePartition { + Self(value) + } +} + +/// Caching resolver for identities. +pub trait ResolveCachedIdentity: fmt::Debug + Send + Sync { + /// Returns a cached identity, or resolves an identity and caches it if its not already cached. + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a>; +} + +/// Shared identity cache. +#[derive(Clone, Debug)] +pub struct SharedIdentityCache(Arc); + +impl SharedIdentityCache { + /// Creates a new [`SharedIdentityCache`] from the given cache implementation. + pub fn new(cache: impl ResolveCachedIdentity + 'static) -> Self { + Self(Arc::new(cache)) + } +} + +impl ResolveCachedIdentity for SharedIdentityCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + self.0 + .resolve_cached_identity(resolver, runtime_components, config_bag) + } +} + +impl_shared_conversions!(convert SharedIdentityCache from ResolveCachedIdentity using SharedIdentityCache::new); + #[deprecated(note = "Renamed to ResolveIdentity.")] pub use ResolveIdentity as IdentityResolver; @@ -43,16 +110,42 @@ pub trait ResolveIdentity: Send + Sync + Debug { runtime_components: &'a RuntimeComponents, config_bag: &'a ConfigBag, ) -> IdentityFuture<'a>; + + /// Returns a fallback identity. + /// + /// This method should be used as a fallback plan, i.e., when a call to `resolve_identity` + /// is interrupted by a timeout and its future fails to complete. + /// + /// The fallback identity should be set aside and ready to be returned + /// immediately. Therefore, a new identity should NOT be fetched + /// within this method, which might cause a long-running operation. + fn fallback_on_interrupt(&self) -> Option { + None + } } /// Container for a shared identity resolver. #[derive(Clone, Debug)] -pub struct SharedIdentityResolver(Arc); +pub struct SharedIdentityResolver { + inner: Arc, + cache_partition: IdentityCachePartition, +} impl SharedIdentityResolver { /// Creates a new [`SharedIdentityResolver`] from the given resolver. pub fn new(resolver: impl ResolveIdentity + 'static) -> Self { - Self(Arc::new(resolver)) + Self { + inner: Arc::new(resolver), + cache_partition: IdentityCachePartition::new(), + } + } + + /// Returns the globally unique cache partition key for this identity resolver. + /// + /// See the [`IdentityCachePartition`] docs for more information on what this is used for + /// and why. + pub fn cache_partition(&self) -> IdentityCachePartition { + self.cache_partition } } @@ -62,7 +155,7 @@ impl ResolveIdentity for SharedIdentityResolver { runtime_components: &'a RuntimeComponents, config_bag: &'a ConfigBag, ) -> IdentityFuture<'a> { - self.0.resolve_identity(runtime_components, config_bag) + self.inner.resolve_identity(runtime_components, config_bag) } } @@ -136,8 +229,8 @@ impl Identity { } /// Returns the expiration time for this identity, if any. - pub fn expiration(&self) -> Option<&SystemTime> { - self.expiration.as_ref() + pub fn expiration(&self) -> Option { + self.expiration } } @@ -181,6 +274,6 @@ mod tests { assert_eq!("foo", identity.data::().unwrap().first); assert_eq!("bar", identity.data::().unwrap().last); - assert_eq!(Some(&expiration), identity.expiration()); + assert_eq!(Some(expiration), identity.expiration()); } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index b98a45d5b62..6871f59f22e 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -608,7 +608,7 @@ impl RuntimeComponentsBuilder { impl ResolveIdentity for FakeIdentityResolver { fn resolve_identity<'a>( &'a self, - _: &RuntimeComponents, + _: &'a RuntimeComponents, _: &'a ConfigBag, ) -> IdentityFuture<'a> { unreachable!("fake identity resolver must be overridden for this test") diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index 7b569d35c84..751758be8ea 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -47,7 +47,7 @@ approx = "0.5.1" aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio", "test-util"] } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["test-util"] } -tokio = { version = "1.25", features = ["macros", "rt", "test-util"] } +tokio = { version = "1.25", features = ["macros", "rt", "rt-multi-thread", "test-util"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } tracing-test = "0.2.1" diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity.rs b/rust-runtime/aws-smithy-runtime/src/client/identity.rs index 7aaef9c3caa..4b38155a8e4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity.rs @@ -3,5 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +mod cache; +pub use cache::{IdentityCache, LazyCacheBuilder}; + /// Identity resolver implementation for "no auth". pub mod no_auth; diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs new file mode 100644 index 00000000000..e18d9c0afc6 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs @@ -0,0 +1,95 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::identity::{ + IdentityFuture, IdentityResolver, ResolveCachedIdentity, SharedIdentityCache, + SharedIdentityResolver, +}; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::ConfigBag; + +mod lazy; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +pub use lazy::LazyCacheBuilder; + +/// Identity cache configuration. +/// +/// # Examples +/// +/// Disabling identity caching: +/// ```no_run +/// use aws_smithy_runtime::client::identity::IdentityCache; +/// +/// # /* +/// let config = some_service::Config::builder() +/// .identity_cache( +/// # */ +/// # drop( +/// IdentityCache::no_cache() +/// # ); +/// # /* +/// ) +/// // ... +/// .build(); +/// let client = some_service::Client::new(config); +/// # */ +/// ``` +/// +/// Customizing lazy caching: +/// ```no_run +/// use aws_smithy_runtime::client::identity::IdentityCache; +/// use std::time::Duration; +/// +/// # /* +/// let config = some_service::Config::builder() +/// .identity_cache( +/// # */ +/// # drop( +/// IdentityCache::lazy() +/// // change the load timeout to 10 seconds +/// .load_timeout(Duration::from_secs(10)) +/// .build() +/// # ); +/// # /* +/// ) +/// // ... +/// .build(); +/// let client = some_service::Client::new(config); +/// # */ +/// ``` +#[non_exhaustive] +pub struct IdentityCache; + +impl IdentityCache { + /// Create an identity cache that does not cache any resolved identities. + pub fn no_cache() -> SharedIdentityCache { + NoCache.into_shared() + } + + /// Configure a lazy identity cache. + /// + /// Identities are lazy loaded and then cached when a request is made. + pub fn lazy() -> LazyCacheBuilder { + LazyCacheBuilder::new() + } +} + +#[derive(Clone, Debug)] +struct NoCache; + +impl ResolveCachedIdentity for NoCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::new(async move { + resolver + .resolve_identity(runtime_components, config_bag) + .await + }) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs new file mode 100644 index 00000000000..36a5968b4c8 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs @@ -0,0 +1,713 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::expiring_cache::ExpiringCache; +use aws_smithy_async::future::timeout::Timeout; +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::identity::{ + Identity, IdentityCachePartition, IdentityFuture, IdentityResolver, ResolveCachedIdentity, + SharedIdentityCache, SharedIdentityResolver, +}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::ConfigBag; +use std::collections::HashMap; +use std::fmt; +use std::sync::RwLock; +use std::time::Duration; +use tracing::Instrument; + +const DEFAULT_LOAD_TIMEOUT: Duration = Duration::from_secs(5); +const DEFAULT_EXPIRATION: Duration = Duration::from_secs(15 * 60); +const DEFAULT_BUFFER_TIME: Duration = Duration::from_secs(10); +const DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = fastrand::f64; + +/// Builder for lazy identity caching. +#[derive(Default, Debug)] +pub struct LazyCacheBuilder { + time_source: Option, + sleep_impl: Option, + load_timeout: Option, + buffer_time: Option, + buffer_time_jitter_fraction: Option f64>, + default_expiration: Option, +} + +impl LazyCacheBuilder { + /// Create a new builder. + pub fn new() -> Self { + Default::default() + } + + /// Set the time source for this cache. + pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { + self.set_time_source(time_source.into_shared()); + self + } + /// Set the time source for this cache. + pub fn set_time_source(&mut self, time_source: SharedTimeSource) -> &mut Self { + self.time_source = Some(time_source.into_shared()); + self + } + + /// Set the async sleep implementation for this cache. + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.set_sleep_impl(sleep_impl.into_shared()); + self + } + /// Set the async sleep implementation for this cache. + pub fn set_sleep_impl(&mut self, sleep_impl: SharedAsyncSleep) -> &mut Self { + self.sleep_impl = Some(sleep_impl); + self + } + + /// Timeout for identity resolution. + /// + /// Defaults to 5 seconds. + pub fn load_timeout(mut self, timeout: Duration) -> Self { + self.set_load_timeout(Some(timeout)); + self + } + + /// Timeout for identity resolution. + /// + /// Defaults to 5 seconds. + pub fn set_load_timeout(&mut self, timeout: Option) -> &mut Self { + self.load_timeout = timeout; + self + } + + /// Amount of time before the actual identity expiration time where the identity is considered expired. + /// + /// For example, if the identity are expiring in 15 minutes, and the buffer time is 10 seconds, + /// then any requests made after 14 minutes and 50 seconds will load a new identity. + /// + /// Note: random jitter value between [0.0, 1.0] is multiplied to this buffer time. + /// + /// Defaults to 10 seconds. + pub fn buffer_time(mut self, buffer_time: Duration) -> Self { + self.set_buffer_time(Some(buffer_time)); + self + } + + /// Amount of time before the actual identity expiration time where the identity is considered expired. + /// + /// For example, if the identity are expiring in 15 minutes, and the buffer time is 10 seconds, + /// then any requests made after 14 minutes and 50 seconds will load a new identity. + /// + /// Note: random jitter value between [0.0, 1.0] is multiplied to this buffer time. + /// + /// Defaults to 10 seconds. + pub fn set_buffer_time(&mut self, buffer_time: Option) -> &mut Self { + self.buffer_time = buffer_time; + self + } + + /// A random percentage by which buffer time is jittered for randomization. + /// + /// For example, if the identity is expiring in 15 minutes, the buffer time is 10 seconds, + /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. + /// Therefore, any requests made after 14 minutes and 52 seconds will load a new identity. + /// + /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. + #[allow(unused)] + #[cfg(test)] + fn buffer_time_jitter_fraction(mut self, buffer_time_jitter_fraction: fn() -> f64) -> Self { + self.set_buffer_time_jitter_fraction(Some(buffer_time_jitter_fraction)); + self + } + + /// A random percentage by which buffer time is jittered for randomization. + /// + /// For example, if the identity is expiring in 15 minutes, the buffer time is 10 seconds, + /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. + /// Therefore, any requests made after 14 minutes and 52 seconds will load a new identity. + /// + /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. + #[allow(unused)] + #[cfg(test)] + fn set_buffer_time_jitter_fraction( + &mut self, + buffer_time_jitter_fraction: Option f64>, + ) -> &mut Self { + self.buffer_time_jitter_fraction = buffer_time_jitter_fraction; + self + } + + /// Default expiration time to set on an identity if it doesn't have an expiration time. + /// + /// This is only used if the resolved identity doesn't have an expiration time set. + /// This must be at least 15 minutes. + /// + /// Defaults to 15 minutes. + pub fn default_expiration(mut self, duration: Duration) -> Self { + self.set_default_expiration(Some(duration)); + self + } + + /// Default expiration time to set on an identity if it doesn't have an expiration time. + /// + /// This is only used if the resolved identity doesn't have an expiration time set. + /// This must be at least 15 minutes. + /// + /// Defaults to 15 minutes. + pub fn set_default_expiration(&mut self, duration: Option) -> &mut Self { + self.default_expiration = duration; + self + } + + /// Builds a [`SharedIdentityCache`] from this builder. + /// + /// # Panics + /// + /// This builder will panic if required fields are not given, or if given values are not valid. + pub fn build(self) -> SharedIdentityCache { + let default_expiration = self.default_expiration.unwrap_or(DEFAULT_EXPIRATION); + assert!( + default_expiration >= DEFAULT_EXPIRATION, + "default_expiration must be at least 15 minutes" + ); + LazyCache::new( + self.load_timeout.unwrap_or(DEFAULT_LOAD_TIMEOUT), + self.buffer_time.unwrap_or(DEFAULT_BUFFER_TIME), + self.buffer_time_jitter_fraction + .unwrap_or(DEFAULT_BUFFER_TIME_JITTER_FRACTION), + default_expiration, + ) + .into_shared() + } +} + +#[derive(Debug)] +struct CachePartitions { + partitions: RwLock>>, + buffer_time: Duration, +} + +impl CachePartitions { + fn new(buffer_time: Duration) -> Self { + Self { + partitions: RwLock::new(HashMap::new()), + buffer_time, + } + } + + fn partition(&self, key: IdentityCachePartition) -> ExpiringCache { + let mut partition = self.partitions.read().unwrap().get(&key).cloned(); + // Add the partition to the cache if it doesn't already exist. + // Partitions will never be removed. + if partition.is_none() { + let mut partitions = self.partitions.write().unwrap(); + // Another thread could have inserted the partition before we acquired the lock, + // so double check before inserting it. + partitions + .entry(key) + .or_insert_with(|| ExpiringCache::new(self.buffer_time)); + drop(partitions); + + partition = self.partitions.read().unwrap().get(&key).cloned(); + } + partition.expect("inserted above if not present") + } +} + +#[derive(Debug)] +struct LazyCache { + partitions: CachePartitions, + load_timeout: Duration, + buffer_time: Duration, + buffer_time_jitter_fraction: fn() -> f64, + default_expiration: Duration, +} + +impl LazyCache { + fn new( + load_timeout: Duration, + buffer_time: Duration, + buffer_time_jitter_fraction: fn() -> f64, + default_expiration: Duration, + ) -> Self { + Self { + partitions: CachePartitions::new(buffer_time), + load_timeout, + buffer_time, + buffer_time_jitter_fraction, + default_expiration, + } + } +} + +impl ResolveCachedIdentity for LazyCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let time_source = runtime_components + .time_source() + .expect("Identity caching requires a time source to be configured. If this isn't possible, then disable identity caching."); + let sleep_impl = runtime_components + .sleep_impl() + .expect("Identity caching requires a sleep impl to be configured. If this isn't possible, then disable identity caching."); + let now = time_source.now(); + let timeout_future = sleep_impl.sleep(self.load_timeout); + let load_timeout = self.load_timeout; + let cache = self.partitions.partition(resolver.cache_partition()); + let default_expiration = self.default_expiration; + + IdentityFuture::new(async move { + // Attempt to get cached identity, or clear the cache if they're expired + if let Some(identity) = cache.yield_or_clear_if_expired(now).await { + tracing::debug!("loaded identity from cache"); + Ok(identity) + } else { + // If we didn't get identity from the cache, then we need to try and load. + // There may be other threads also loading simultaneously, but this is OK + // since the futures are not eagerly executed, and the cache will only run one + // of them. + let start_time = time_source.now(); + let result = cache + .get_or_load(|| { + let span = tracing::info_span!("lazy_load_identity"); + async move { + let fut = Timeout::new( + resolver.resolve_identity(runtime_components, config_bag), + timeout_future, + ); + let identity = match fut.await { + Ok(result) => result?, + Err(_err) => match resolver.fallback_on_interrupt() { + Some(identity) => identity, + None => { + return Err(BoxError::from(TimedOutError(load_timeout))) + } + }, + }; + // If the identity don't have an expiration time, then create a default one + let expiration = + identity.expiration().unwrap_or(now + default_expiration); + + let jitter = self + .buffer_time + .mul_f64((self.buffer_time_jitter_fraction)()); + + // Logging for cache miss should be emitted here as opposed to after the call to + // `cache.get_or_load` above. In the case of multiple threads concurrently executing + // `cache.get_or_load`, logging inside `cache.get_or_load` ensures that it is emitted + // only once for the first thread that succeeds in populating a cache value. + tracing::info!( + "identity cache miss occurred; added new identity (took {:?})", + time_source.now().duration_since(start_time) + ); + + Ok((identity, expiration + jitter)) + } + // Only instrument the the actual load future so that no span + // is opened if the cache decides not to execute it. + .instrument(span) + }) + .await; + tracing::debug!("loaded identity"); + result + } + }) + } +} + +#[derive(Debug)] +struct TimedOutError(Duration); + +impl std::error::Error for TimedOutError {} + +impl fmt::Display for TimedOutError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "identity resolver timed out after {:?}", self.0) + } +} + +#[cfg(all(test, feature = "client", feature = "http-auth"))] +mod tests { + use super::*; + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::{instant_time_and_sleep, ManualTimeSource}; + use aws_smithy_async::time::TimeSource; + use aws_smithy_runtime_api::client::identity::http::Token; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::{Arc, Mutex}; + use std::time::{Duration, SystemTime, UNIX_EPOCH}; + use tracing::info; + + const BUFFER_TIME_NO_JITTER: fn() -> f64 = || 0_f64; + + struct ResolverFn(F); + impl fmt::Debug for ResolverFn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("ResolverFn") + } + } + impl IdentityResolver for ResolverFn + where + F: Fn() -> IdentityFuture<'static> + Send + Sync, + { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + (self.0)() + } + } + + fn resolver_fn(f: F) -> SharedIdentityResolver + where + F: Fn() -> IdentityFuture<'static> + Send + Sync + 'static, + { + SharedIdentityResolver::new(ResolverFn(f)) + } + + fn test_cache( + buffer_time_jitter_fraction: fn() -> f64, + load_list: Vec>, + ) -> (LazyCache, SharedIdentityResolver) { + #[derive(Debug)] + struct Resolver(Mutex>>); + impl IdentityResolver for Resolver { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let mut list = self.0.lock().unwrap(); + if list.len() > 0 { + let next = list.remove(0); + info!("refreshing the identity to {:?}", next); + IdentityFuture::ready(next) + } else { + drop(list); + panic!("no more identities") + } + } + } + + let identity_resolver = SharedIdentityResolver::new(Resolver(Mutex::new(load_list))); + let cache = LazyCache::new( + DEFAULT_LOAD_TIMEOUT, + DEFAULT_BUFFER_TIME, + buffer_time_jitter_fraction, + DEFAULT_EXPIRATION, + ); + (cache, identity_resolver) + } + + fn epoch_secs(secs: u64) -> SystemTime { + SystemTime::UNIX_EPOCH + Duration::from_secs(secs) + } + + fn test_identity(expired_secs: u64) -> Identity { + let expiration = Some(epoch_secs(expired_secs)); + Identity::new(Token::new("test", expiration), expiration) + } + + async fn expect_identity( + expired_secs: u64, + cache: &LazyCache, + components: &RuntimeComponents, + resolver: SharedIdentityResolver, + ) { + let config_bag = ConfigBag::base(); + let identity = cache + .resolve_cached_identity(resolver, components, &config_bag) + .await + .expect("expected identity"); + assert_eq!(Some(epoch_secs(expired_secs)), identity.expiration()); + } + + #[tokio::test] + async fn initial_populate_test_identity() { + let time = ManualTimeSource::new(UNIX_EPOCH); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let config_bag = ConfigBag::base(); + let resolver = SharedIdentityResolver::new(resolver_fn(|| { + info!("refreshing the test_identity"); + IdentityFuture::ready(Ok(test_identity(1000))) + })); + let cache = LazyCache::new( + DEFAULT_LOAD_TIMEOUT, + DEFAULT_BUFFER_TIME, + BUFFER_TIME_NO_JITTER, + DEFAULT_EXPIRATION, + ); + assert_eq!( + epoch_secs(1000), + cache + .resolve_cached_identity(resolver, &components, &config_bag) + .await + .unwrap() + .expiration() + .unwrap() + ); + } + + #[tokio::test] + async fn reload_expired_test_identity() { + let time = ManualTimeSource::new(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, resolver) = test_cache( + BUFFER_TIME_NO_JITTER, + vec![ + Ok(test_identity(1000)), + Ok(test_identity(2000)), + Ok(test_identity(3000)), + ], + ); + + expect_identity(1000, &cache, &components, resolver.clone()).await; + expect_identity(1000, &cache, &components, resolver.clone()).await; + time.set_time(epoch_secs(1500)); + expect_identity(2000, &cache, &components, resolver.clone()).await; + expect_identity(2000, &cache, &components, resolver.clone()).await; + time.set_time(epoch_secs(2500)); + expect_identity(3000, &cache, &components, resolver.clone()).await; + expect_identity(3000, &cache, &components, resolver.clone()).await; + } + + #[tokio::test] + async fn load_failed_error() { + let config_bag = ConfigBag::base(); + let time = ManualTimeSource::new(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, resolver) = test_cache( + BUFFER_TIME_NO_JITTER, + vec![Ok(test_identity(1000)), Err("failed".into())], + ); + + expect_identity(1000, &cache, &components, resolver.clone()).await; + time.set_time(epoch_secs(1500)); + assert!(cache + .resolve_cached_identity(resolver.clone(), &components, &config_bag) + .await + .is_err()); + } + + #[test] + fn load_contention() { + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_time() + .worker_threads(16) + .build() + .unwrap(); + + let time = ManualTimeSource::new(epoch_secs(0)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, resolver) = test_cache( + BUFFER_TIME_NO_JITTER, + vec![ + Ok(test_identity(500)), + Ok(test_identity(1500)), + Ok(test_identity(2500)), + Ok(test_identity(3500)), + Ok(test_identity(4500)), + ], + ); + let cache: SharedIdentityCache = cache.into_shared(); + + // test_identity are available up until 4500 seconds after the unix epoch + // 4*50 = 200 tasks are launched => we can advance time 4500/20 => 225 seconds per advance + for _ in 0..4 { + let mut tasks = Vec::new(); + for _ in 0..50 { + let resolver = resolver.clone(); + let cache = cache.clone(); + let time = time.clone(); + let components = components.clone(); + tasks.push(rt.spawn(async move { + let now = time.advance(Duration::from_secs(22)); + + let config_bag = ConfigBag::base(); + let identity = cache + .resolve_cached_identity(resolver, &components, &config_bag) + .await + .unwrap(); + assert!( + identity.expiration().unwrap() >= now, + "{:?} >= {:?}", + identity.expiration(), + now + ); + })); + } + for task in tasks { + rt.block_on(task).unwrap(); + } + } + } + + #[tokio::test] + async fn load_timeout() { + let config_bag = ConfigBag::base(); + let (time, sleep) = instant_time_and_sleep(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(sleep)) + .build() + .unwrap(); + let resolver = SharedIdentityResolver::new(resolver_fn(|| { + IdentityFuture::new(async { + aws_smithy_async::future::never::Never::new().await; + Ok(test_identity(1000)) + }) + })); + let cache = LazyCache::new( + Duration::from_secs(5), + DEFAULT_BUFFER_TIME, + BUFFER_TIME_NO_JITTER, + DEFAULT_EXPIRATION, + ); + + let err: BoxError = cache + .resolve_cached_identity(resolver, &components, &config_bag) + .await + .expect_err("it should return an error"); + let downcasted = err.downcast_ref::(); + assert!( + downcasted.is_some(), + "expected a BoxError of TimedOutError, but was {err:?}" + ); + assert_eq!(time.now(), epoch_secs(105)); + } + + #[tokio::test] + async fn buffer_time_jitter() { + let time = ManualTimeSource::new(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let buffer_time_jitter_fraction = || 0.5_f64; + let (cache, resolver) = test_cache( + buffer_time_jitter_fraction, + vec![Ok(test_identity(1000)), Ok(test_identity(2000))], + ); + + expect_identity(1000, &cache, &components, resolver.clone()).await; + let buffer_time_with_jitter = + (DEFAULT_BUFFER_TIME.as_secs_f64() * buffer_time_jitter_fraction()) as u64; + assert_eq!(buffer_time_with_jitter, 5); + // Advance time to the point where the first test_identity are about to expire (but haven't). + let almost_expired_secs = 1000 - buffer_time_with_jitter - 1; + time.set_time(epoch_secs(almost_expired_secs)); + // We should still use the first test_identity. + expect_identity(1000, &cache, &components, resolver.clone()).await; + // Now let the first test_identity expire. + let expired_secs = almost_expired_secs + 1; + time.set_time(epoch_secs(expired_secs)); + // Now that the first test_identity have been expired, the second test_identity will be retrieved. + expect_identity(2000, &cache, &components, resolver.clone()).await; + } + + #[tokio::test] + async fn cache_partitioning() { + let time = ManualTimeSource::new(epoch_secs(0)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, _) = test_cache(BUFFER_TIME_NO_JITTER, Vec::new()); + + let far_future = SystemTime::now() + Duration::from_secs(10_000); + + // Resolver A and B both return an identical identity type with different tokens with an expiration + // time that should NOT be hit within this test. They each have their own partition key. + let resolver_a_calls = Arc::new(AtomicUsize::new(0)); + let resolver_b_calls = Arc::new(AtomicUsize::new(0)); + let resolver_a = resolver_fn({ + let calls = resolver_a_calls.clone(); + move || { + calls.fetch_add(1, Ordering::Relaxed); + IdentityFuture::ready(Ok(Identity::new( + Token::new("A", Some(far_future)), + Some(far_future), + ))) + } + }); + let resolver_b = resolver_fn({ + let calls = resolver_b_calls.clone(); + move || { + calls.fetch_add(1, Ordering::Relaxed); + IdentityFuture::ready(Ok(Identity::new( + Token::new("B", Some(far_future)), + Some(far_future), + ))) + } + }); + assert_ne!( + resolver_a.cache_partition(), + resolver_b.cache_partition(), + "pre-condition: they should have different partition keys" + ); + + let config_bag = ConfigBag::base(); + + // Loading the identity twice with resolver A should result in a single call + // to the underlying identity resolver since the result gets cached. + let identity = cache + .resolve_cached_identity(resolver_a.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("A", identity.data::().unwrap().token()); + let identity = cache + .resolve_cached_identity(resolver_a.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("A", identity.data::().unwrap().token()); + assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed)); + + // Now, loading an identity from B will use a separate cache partition + // and return a different result. + let identity = cache + .resolve_cached_identity(resolver_b.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("B", identity.data::().unwrap().token()); + let identity = cache + .resolve_cached_identity(resolver_b.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("B", identity.data::().unwrap().token()); + assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed)); + assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed)); + + // Finally, loading with resolver A again should return the original cached A value + let identity = cache + .resolve_cached_identity(resolver_a.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("A", identity.data::().unwrap().token()); + assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed)); + assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed)); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/expiring_cache.rs b/rust-runtime/aws-smithy-runtime/src/expiring_cache.rs new file mode 100644 index 00000000000..efa75aae01c --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/expiring_cache.rs @@ -0,0 +1,164 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::future::Future; +use std::marker::PhantomData; +use std::sync::Arc; +use std::time::{Duration, SystemTime}; +use tokio::sync::{OnceCell, RwLock}; + +/// Expiry-aware cache +/// +/// [`ExpiringCache`] implements two important features: +/// 1. Respect expiry of contents +/// 2. Deduplicate load requests to prevent thundering herds when no value is present. +#[derive(Debug)] +pub struct ExpiringCache { + /// Amount of time before the actual expiration time + /// when the value is considered expired. + buffer_time: Duration, + value: Arc>>, + _phantom: PhantomData, +} + +impl Clone for ExpiringCache { + fn clone(&self) -> Self { + Self { + buffer_time: self.buffer_time, + value: self.value.clone(), + _phantom: Default::default(), + } + } +} + +impl ExpiringCache +where + T: Clone, +{ + /// Creates `ExpiringCache` with the given `buffer_time`. + pub fn new(buffer_time: Duration) -> Self { + ExpiringCache { + buffer_time, + value: Arc::new(RwLock::new(OnceCell::new())), + _phantom: Default::default(), + } + } + + #[cfg(all(test, feature = "client", feature = "http-auth"))] + async fn get(&self) -> Option + where + T: Clone, + { + self.value + .read() + .await + .get() + .cloned() + .map(|(creds, _expiry)| creds) + } + + /// Attempts to refresh the cached value with the given future. + /// If multiple threads attempt to refresh at the same time, one of them will win, + /// and the others will await that thread's result rather than multiple refreshes occurring. + /// The function given to acquire a value future, `f`, will not be called + /// if another thread is chosen to load the value. + pub async fn get_or_load(&self, f: F) -> Result + where + F: FnOnce() -> Fut, + Fut: Future>, + { + let lock = self.value.read().await; + let future = lock.get_or_try_init(f); + future.await.map(|(value, _expiry)| value.clone()) + } + + /// If the value is expired, clears the cache. Otherwise, yields the current value. + pub async fn yield_or_clear_if_expired(&self, now: SystemTime) -> Option { + // Short-circuit if the value is not expired + if let Some((value, expiry)) = self.value.read().await.get() { + if !expired(*expiry, self.buffer_time, now) { + return Some(value.clone()); + } + } + + // Acquire a write lock to clear the cache, but then once the lock is acquired, + // check again that the value is not already cleared. If it has been cleared, + // then another thread is refreshing the cache by the time the write lock was acquired. + let mut lock = self.value.write().await; + if let Some((_value, expiration)) = lock.get() { + // Also check that we're clearing the expired value and not a value + // that has been refreshed by another thread. + if expired(*expiration, self.buffer_time, now) { + *lock = OnceCell::new(); + } + } + None + } +} + +fn expired(expiration: SystemTime, buffer_time: Duration, now: SystemTime) -> bool { + now >= (expiration - buffer_time) +} + +#[cfg(all(test, feature = "client", feature = "http-auth"))] +mod tests { + use super::{expired, ExpiringCache}; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::identity::http::Token; + use aws_smithy_runtime_api::client::identity::Identity; + use std::time::{Duration, SystemTime}; + use tracing_test::traced_test; + + fn identity(expired_secs: u64) -> Result<(Identity, SystemTime), BoxError> { + let expiration = epoch_secs(expired_secs); + let identity = Identity::new(Token::new("test", Some(expiration)), Some(expiration)); + Ok((identity, expiration)) + } + + fn epoch_secs(secs: u64) -> SystemTime { + SystemTime::UNIX_EPOCH + Duration::from_secs(secs) + } + + #[test] + fn expired_check() { + let ts = epoch_secs(100); + assert!(expired(ts, Duration::from_secs(10), epoch_secs(1000))); + assert!(expired(ts, Duration::from_secs(10), epoch_secs(90))); + assert!(!expired(ts, Duration::from_secs(10), epoch_secs(10))); + } + + #[traced_test] + #[tokio::test] + async fn cache_clears_if_expired_only() { + let cache = ExpiringCache::new(Duration::from_secs(10)); + assert!(cache + .yield_or_clear_if_expired(epoch_secs(100)) + .await + .is_none()); + + cache.get_or_load(|| async { identity(100) }).await.unwrap(); + assert_eq!( + Some(epoch_secs(100)), + cache.get().await.unwrap().expiration() + ); + + // It should not clear the credentials if they're not expired + assert_eq!( + Some(epoch_secs(100)), + cache + .yield_or_clear_if_expired(epoch_secs(10)) + .await + .unwrap() + .expiration() + ); + + // It should clear the credentials if they're expired + assert!(cache + .yield_or_clear_if_expired(epoch_secs(500)) + .await + .is_none()); + assert!(cache.get().await.is_none()); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/lib.rs b/rust-runtime/aws-smithy-runtime/src/lib.rs index b40610a77cc..2fbb5966576 100644 --- a/rust-runtime/aws-smithy-runtime/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime/src/lib.rs @@ -22,6 +22,9 @@ #[cfg(feature = "client")] pub mod client; +/// Cache for entries that have an expiration time. +pub mod expiring_cache; + /// A data structure for persisting and sharing state between multiple clients. pub mod static_partition_map; From bcfc211277c9593037fc63ce42f52c50135eb4ef Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 17 Oct 2023 15:15:51 -0700 Subject: [PATCH 183/331] Simplify default config and add default async sleep (#3071) While implementing identity caching, I noticed we don't have a default async sleep impl wired up for generic clients, which was causing caching to panic in many tests since it needs a sleep impl for timeouts. I likely need to figure out what to do other than panic if there's no sleep impl, but that's a problem for a different PR. This PR adds a default sleep impl to generic clients, and also simplifies how default config works. Previously, the generated config `Builder::build` method set all the defaults with a series of "if not set, then set default" statements. In this PR, defaults are registered via default ordered runtime plugins. Additionally, I cleaned up the standard retry strategy: - The `TokenBucketPartition` didn't appear to be used at all, so I deleted it. - `StandardRetryStrategy` was taking retry config at construction, which means it isn't possible to config override the retry config unless the strategy is recreated. It now doesn't take any config at all during construction. - The adaptive retry client rate limiter was created at construction based on retry config at that point in time. This means config overrides wouldn't work with it, so it is also no longer set up at construction time. - Removed some unused runtime plugins. ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-config/src/imds/client.rs | 7 +- .../ResiliencyConfigCustomization.kt | 88 +----- .../customize/RequiredCustomizations.kt | 2 - .../client/FluentClientGenerator.kt | 39 ++- .../ResiliencyConfigCustomizationTest.kt | 2 +- .../SensitiveOutputDecoratorTest.kt | 8 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 10 +- .../rust/codegen/core/rustlang/RustType.kt | 1 - .../src/client/runtime_plugin.rs | 25 ++ rust-runtime/aws-smithy-runtime/src/client.rs | 2 + .../aws-smithy-runtime/src/client/defaults.rs | 104 +++++++ .../aws-smithy-runtime/src/client/http.rs | 20 -- .../src/client/orchestrator/operation.rs | 22 +- .../aws-smithy-runtime/src/client/retries.rs | 15 +- .../src/client/retries/client_rate_limiter.rs | 31 --- .../src/client/retries/strategy/standard.rs | 259 ++++++++++-------- .../src/client/retries/token_bucket.rs | 42 +-- rust-runtime/aws-smithy-types/src/retry.rs | 6 + 18 files changed, 352 insertions(+), 331 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/defaults.rs diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index e63908da3a1..823aa7c6369 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -238,13 +238,14 @@ impl ImdsCommonRuntimePlugin { fn new( config: &ProviderConfig, endpoint_resolver: ImdsEndpointResolver, - retry_config: &RetryConfig, + retry_config: RetryConfig, timeout_config: TimeoutConfig, ) -> Self { let mut layer = Layer::new("ImdsCommonRuntimePlugin"); layer.store_put(AuthSchemeOptionResolverParams::new(())); layer.store_put(EndpointResolverParams::new(())); layer.store_put(SensitiveOutput); + layer.store_put(retry_config); layer.store_put(timeout_config); layer.store_put(user_agent()); @@ -255,7 +256,7 @@ impl ImdsCommonRuntimePlugin { .with_endpoint_resolver(Some(endpoint_resolver)) .with_interceptor(UserAgentInterceptor::new()) .with_retry_classifier(SharedRetryClassifier::new(ImdsResponseRetryClassifier)) - .with_retry_strategy(Some(StandardRetryStrategy::new(retry_config))) + .with_retry_strategy(Some(StandardRetryStrategy::new())) .with_time_source(Some(config.time_source())) .with_sleep_impl(config.sleep_impl()), } @@ -423,7 +424,7 @@ impl Builder { let common_plugin = SharedRuntimePlugin::new(ImdsCommonRuntimePlugin::new( &config, endpoint_resolver, - &retry_config, + retry_config, timeout_config, )); let operation = Operation::builder() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index 364185b6020..e44fce767f3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -7,20 +7,16 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate -import software.amazon.smithy.rust.codegen.core.util.sdkId -class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { +class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val retryConfig = RuntimeType.smithyTypes(runtimeConfig).resolve("retry") private val sleepModule = RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep") @@ -44,8 +40,6 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon "StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"), "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), - "TokenBucket" to retries.resolve("TokenBucket"), - "TokenBucketPartition" to retries.resolve("TokenBucketPartition"), ) override fun section(section: ServiceConfig) = @@ -281,57 +275,6 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon ) } - is ServiceConfig.BuilderBuild -> { - rustTemplate( - """ - if layer.load::<#{RetryConfig}>().is_none() { - layer.store_put(#{RetryConfig}::disabled()); - } - let retry_config = layer.load::<#{RetryConfig}>().expect("set to default above").clone(); - - if layer.load::<#{RetryPartition}>().is_none() { - layer.store_put(#{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); - } - let retry_partition = layer.load::<#{RetryPartition}>().expect("set to default above").clone(); - - if retry_config.has_retry() { - #{debug}!("using retry strategy with partition '{}'", retry_partition); - } - - if retry_config.mode() == #{RetryMode}::Adaptive { - if let #{Some}(time_source) = self.runtime_components.time_source() { - let seconds_since_unix_epoch = time_source - .now() - .duration_since(#{SystemTime}::UNIX_EPOCH) - .expect("the present takes place after the UNIX_EPOCH") - .as_secs_f64(); - let client_rate_limiter_partition = #{ClientRateLimiterPartition}::new(retry_partition.clone()); - let client_rate_limiter = CLIENT_RATE_LIMITER.get_or_init(client_rate_limiter_partition, || { - #{ClientRateLimiter}::new(seconds_since_unix_epoch) - }); - layer.store_put(client_rate_limiter); - } - } - - // The token bucket is used for both standard AND adaptive retries. - let token_bucket_partition = #{TokenBucketPartition}::new(retry_partition); - let token_bucket = TOKEN_BUCKET.get_or_init(token_bucket_partition, #{TokenBucket}::default); - layer.store_put(token_bucket); - - // TODO(enableNewSmithyRuntimeCleanup): Should not need to provide a default once smithy-rs##2770 - // is resolved - if layer.load::<#{TimeoutConfig}>().is_none() { - layer.store_put(#{TimeoutConfig}::disabled()); - } - - self.runtime_components.set_retry_strategy(#{Some}( - #{SharedRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config))) - ); - """, - *codegenScope, - ) - } - else -> emptySection } } @@ -366,32 +309,3 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { } } } - -class ResiliencyServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) - private val retries = smithyRuntime.resolve("client::retries") - private val codegenScope = arrayOf( - "TokenBucket" to retries.resolve("TokenBucket"), - "TokenBucketPartition" to retries.resolve("TokenBucketPartition"), - "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), - "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), - "StaticPartitionMap" to smithyRuntime.resolve("static_partition_map::StaticPartitionMap"), - ) - - override fun section(section: ServiceRuntimePluginSection): Writable = writable { - when (section) { - is ServiceRuntimePluginSection.DeclareSingletons -> { - rustTemplate( - """ - static TOKEN_BUCKET: #{StaticPartitionMap}<#{TokenBucketPartition}, #{TokenBucket}> = #{StaticPartitionMap}::new(); - static CLIENT_RATE_LIMITER: #{StaticPartitionMap}<#{ClientRateLimiterPartition}, #{ClientRateLimiter}> = #{StaticPartitionMap}::new(); - """, - *codegenScope, - ) - } - - else -> emptySection - } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 2123d802868..d47ac45fd9a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -14,7 +14,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.Intercep import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyReExportCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierOperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierServiceRuntimePluginCustomization @@ -113,7 +112,6 @@ class RequiredCustomizations : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = baseCustomizations + - ResiliencyServiceRuntimePluginCustomization(codegenContext) + ConnectionPoisoningRuntimePluginCustomization(codegenContext) + RetryClassifierServiceRuntimePluginCustomization(codegenContext) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 9166ccd5986..dfd11ed295a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -40,7 +40,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate @@ -50,9 +49,11 @@ import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata import software.amazon.smithy.rust.codegen.core.smithy.generators.getterName import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName import software.amazon.smithy.rust.codegen.core.smithy.rustType +import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.outputShape +import software.amazon.smithy.rust.codegen.core.util.sdkId import software.amazon.smithy.rust.codegen.core.util.toSnakeCase class FluentClientGenerator( @@ -161,7 +162,7 @@ class FluentClientGenerator( } """, *clientScope, - "base_client_runtime_plugins" to baseClientRuntimePluginsFn(runtimeConfig), + "base_client_runtime_plugins" to baseClientRuntimePluginsFn(codegenContext), ) } @@ -446,8 +447,10 @@ class FluentClientGenerator( } } -private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeType = +private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): RuntimeType = codegenContext.runtimeConfig.let { rc -> RuntimeType.forInlineFun("base_client_runtime_plugins", ClientRustModule.config) { + val api = RuntimeType.smithyRuntimeApi(rc) + val rt = RuntimeType.smithyRuntime(rc) rustTemplate( """ pub(crate) fn base_client_runtime_plugins( @@ -455,13 +458,25 @@ private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeTyp ) -> #{RuntimePlugins} { let mut configured_plugins = #{Vec}::new(); ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); + + let defaults = [ + #{default_http_client_plugin}(), + #{default_retry_config_plugin}(${codegenContext.serviceShape.sdkId().dq()}), + #{default_sleep_impl_plugin}(), + #{default_time_source_plugin}(), + #{default_timeout_config_plugin}(), + ].into_iter().flatten(); + let mut plugins = #{RuntimePlugins}::new() - .with_client_plugin(#{default_http_client_plugin}()) + // defaults + .with_client_plugins(defaults) + // user config .with_client_plugin( #{StaticRuntimePlugin}::new() .with_config(config.config.clone()) .with_runtime_components(config.runtime_components.clone()) ) + // codegen config .with_client_plugin(crate::config::ServiceRuntimePlugin::new(config)) .with_client_plugin(#{NoAuthRuntimePlugin}::new()); for plugin in configured_plugins { @@ -471,15 +486,17 @@ private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeTyp } """, *preludeScope, - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "NoAuthRuntimePlugin" to RuntimeType.smithyRuntime(runtimeConfig) - .resolve("client::auth::no_auth::NoAuthRuntimePlugin"), - "StaticRuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::runtime_plugin::StaticRuntimePlugin"), - "default_http_client_plugin" to RuntimeType.smithyRuntime(runtimeConfig) - .resolve("client::http::default_http_client_plugin"), + "default_http_client_plugin" to rt.resolve("client::defaults::default_http_client_plugin"), + "default_retry_config_plugin" to rt.resolve("client::defaults::default_retry_config_plugin"), + "default_sleep_impl_plugin" to rt.resolve("client::defaults::default_sleep_impl_plugin"), + "default_timeout_config_plugin" to rt.resolve("client::defaults::default_timeout_config_plugin"), + "default_time_source_plugin" to rt.resolve("client::defaults::default_time_source_plugin"), + "NoAuthRuntimePlugin" to rt.resolve("client::auth::no_auth::NoAuthRuntimePlugin"), + "RuntimePlugins" to RuntimeType.runtimePlugins(rc), + "StaticRuntimePlugin" to api.resolve("client::runtime_plugin::StaticRuntimePlugin"), ) } +} /** * For a given `operation` shape, return a list of strings where each string describes the name and input type of one of diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt index b25e28c75ef..4a7a8607e13 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt @@ -45,7 +45,7 @@ internal class ResiliencyConfigCustomizationTest { project.withModule(ClientRustModule.config) { ServiceRuntimePluginGenerator(codegenContext).render( this, - listOf(ResiliencyServiceRuntimePluginCustomization(codegenContext)), + emptyList(), ) } ResiliencyReExportCustomization(codegenContext).extras(project) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt index bf634170ca0..66047aca477 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt @@ -8,6 +8,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -16,6 +17,8 @@ import software.amazon.smithy.rust.codegen.core.testutil.integrationTest class SensitiveOutputDecoratorTest { private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( + "capture_test_logs" to CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType() + .resolve("test_util::capture_test_logs::capture_test_logs"), "capture_request" to RuntimeType.captureRequest(runtimeConfig), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), ) @@ -48,10 +51,10 @@ class SensitiveOutputDecoratorTest { rustCrate.integrationTest("redacting_sensitive_response_body") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) - Attribute.TracedTest.render(this) rustTemplate( """ async fn redacting_sensitive_response_body() { + let (_logs, logs_rx) = #{capture_test_logs}(); let (http_client, _r) = #{capture_request}(Some( http::Response::builder() .status(200) @@ -69,7 +72,8 @@ class SensitiveOutputDecoratorTest { .await .expect("success"); - assert!(logs_contain("** REDACTED **")); + let log_contents = logs_rx.contents(); + assert!(log_contents.contains("** REDACTED **")); } """, *codegenScope(codegenContext.runtimeConfig), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index e8c51575d64..668f408d82e 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -142,7 +142,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { } @Test - fun `operation overrides retry strategy`() { + fun `operation overrides retry config`() { clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( @@ -164,11 +164,13 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { .resolve("client::retries::RetryClassifiers"), "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "StandardRetryStrategy" to RuntimeType.smithyRuntime(runtimeConfig) + .resolve("client::retries::strategy::StandardRetryStrategy"), "ShouldAttempt" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::ShouldAttempt"), ) rustCrate.testModule { - unitTest("test_operation_overrides_retry_strategy") { + unitTest("test_operation_overrides_retry_config") { rustTemplate( """ use #{RuntimePlugin}; @@ -193,6 +195,8 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { // Emulate the merging of runtime components from runtime plugins that the orchestrator does let runtime_components = #{RuntimeComponentsBuilder}::for_tests() + // emulate the default retry config plugin by setting a retry strategy + .with_retry_strategy(#{Some}(#{StandardRetryStrategy}::new())) .merge_from(&client_config.runtime_components) .merge_from(&retry_classifiers_component) .build() @@ -219,6 +223,8 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { // Emulate the merging of runtime components from runtime plugins that the orchestrator does let runtime_components = #{RuntimeComponentsBuilder}::for_tests() + // emulate the default retry config plugin by setting a retry strategy + .with_retry_strategy(#{Some}(#{StandardRetryStrategy}::new())) .merge_from(&client_config.runtime_components) .merge_from(&retry_classifiers_component) .merge_from(&config_override.runtime_components) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index a3d5d568d8b..5a46d9fa115 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -524,7 +524,6 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { val Test = Attribute("test") val TokioTest = Attribute(RuntimeType.Tokio.resolve("test").writable) - val TracedTest = Attribute(RuntimeType.TracingTest.resolve("traced_test").writable) val AwsSdkUnstableAttribute = Attribute(cfg("aws_sdk_unstable")) /** diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 07df586f7ae..f55cfa6e1f6 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -236,10 +236,22 @@ pub struct RuntimePlugins { } impl RuntimePlugins { + /// Create a new empty set of runtime plugins. pub fn new() -> Self { Default::default() } + /// Add several client-level runtime plugins from an iterator. + pub fn with_client_plugins( + mut self, + plugins: impl IntoIterator, + ) -> Self { + for plugin in plugins.into_iter() { + self = self.with_client_plugin(plugin); + } + self + } + /// Adds a client-level runtime plugin. pub fn with_client_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { insert_plugin!( @@ -249,6 +261,17 @@ impl RuntimePlugins { self } + /// Add several operation-level runtime plugins from an iterator. + pub fn with_operation_plugins( + mut self, + plugins: impl IntoIterator, + ) -> Self { + for plugin in plugins.into_iter() { + self = self.with_operation_plugin(plugin); + } + self + } + /// Adds an operation-level runtime plugin. pub fn with_operation_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { insert_plugin!( @@ -258,6 +281,7 @@ impl RuntimePlugins { self } + /// Apply the client-level runtime plugins' config to the given config bag. pub fn apply_client_configuration( &self, cfg: &mut ConfigBag, @@ -265,6 +289,7 @@ impl RuntimePlugins { apply_plugins!(client, self.client_plugins, cfg) } + /// Apply the operation-level runtime plugins' config to the given config bag. pub fn apply_operation_configuration( &self, cfg: &mut ConfigBag, diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index 392dc120232..4457ef2ac8d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -6,6 +6,8 @@ /// Smithy auth scheme implementations. pub mod auth; +pub mod defaults; + pub mod dns; /// Built-in Smithy HTTP clients and connectors. diff --git a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs new file mode 100644 index 00000000000..6bba117144c --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs @@ -0,0 +1,104 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Runtime plugins that provide defaults for clients. +//! +//! Note: these are the absolute base-level defaults. They may not be the defaults +//! for _your_ client, since many things can change these defaults on the way to +//! code generating and constructing a full client. + +use crate::client::retries::strategy::StandardRetryStrategy; +use crate::client::retries::RetryPartition; +use aws_smithy_async::rt::sleep::default_async_sleep; +use aws_smithy_async::time::SystemTimeSource; +use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{ + Order, SharedRuntimePlugin, StaticRuntimePlugin, +}; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::{FrozenLayer, Layer}; +use aws_smithy_types::retry::RetryConfig; +use aws_smithy_types::timeout::TimeoutConfig; +use std::borrow::Cow; + +fn default_plugin(name: &'static str, components_fn: CompFn) -> StaticRuntimePlugin +where + CompFn: FnOnce(RuntimeComponentsBuilder) -> RuntimeComponentsBuilder, +{ + StaticRuntimePlugin::new() + .with_order(Order::Defaults) + .with_runtime_components((components_fn)(RuntimeComponentsBuilder::new(name))) +} + +fn layer(name: &'static str, layer_fn: LayerFn) -> FrozenLayer +where + LayerFn: FnOnce(&mut Layer), +{ + let mut layer = Layer::new(name); + (layer_fn)(&mut layer); + layer.freeze() +} + +/// Runtime plugin that provides a default connector. +pub fn default_http_client_plugin() -> Option { + let _default: Option = None; + #[cfg(feature = "connector-hyper-0-14-x")] + let _default = crate::client::http::hyper_014::default_client(); + + _default.map(|default| { + default_plugin("default_http_client_plugin", |components| { + components.with_http_client(Some(default)) + }) + .into_shared() + }) +} + +/// Runtime plugin that provides a default async sleep implementation. +pub fn default_sleep_impl_plugin() -> Option { + default_async_sleep().map(|default| { + default_plugin("default_sleep_impl_plugin", |components| { + components.with_sleep_impl(Some(default)) + }) + .into_shared() + }) +} + +/// Runtime plugin that provides a default time source. +pub fn default_time_source_plugin() -> Option { + Some( + default_plugin("default_time_source_plugin", |components| { + components.with_time_source(Some(SystemTimeSource::new())) + }) + .into_shared(), + ) +} + +/// Runtime plugin that sets the default retry strategy, config (disabled), and partition. +pub fn default_retry_config_plugin( + default_partition_name: impl Into>, +) -> Option { + Some( + default_plugin("default_retry_config_plugin", |components| { + components.with_retry_strategy(Some(StandardRetryStrategy::new())) + }) + .with_config(layer("default_retry_config", |layer| { + layer.store_put(RetryConfig::disabled()); + layer.store_put(RetryPartition::new(default_partition_name)); + })) + .into_shared(), + ) +} + +/// Runtime plugin that sets the default timeout config (no timeouts). +pub fn default_timeout_config_plugin() -> Option { + Some( + default_plugin("default_timeout_config_plugin", |c| c) + .with_config(layer("default_timeout_config", |layer| { + layer.store_put(TimeoutConfig::disabled()); + })) + .into_shared(), + ) +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http.rs b/rust-runtime/aws-smithy-runtime/src/client/http.rs index 6f5960d0735..4f02c42870b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http.rs @@ -3,12 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime_api::client::http::SharedHttpClient; -use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; -use aws_smithy_runtime_api::client::runtime_plugin::{ - Order, SharedRuntimePlugin, StaticRuntimePlugin, -}; - /// Interceptor for connection poisoning. pub mod connection_poisoning; @@ -21,17 +15,3 @@ pub mod test_util; /// needing to provide equivalent functionality for hyper 1.x in the future. #[cfg(feature = "connector-hyper-0-14-x")] pub mod hyper_014; - -/// Runtime plugin that provides a default connector. Intended to be used by the generated code. -pub fn default_http_client_plugin() -> SharedRuntimePlugin { - let _default: Option = None; - #[cfg(feature = "connector-hyper-0-14-x")] - let _default = hyper_014::default_client(); - - let plugin = StaticRuntimePlugin::new() - .with_order(Order::Defaults) - .with_runtime_components( - RuntimeComponentsBuilder::new("default_http_client_plugin").with_http_client(_default), - ); - SharedRuntimePlugin::new(plugin) -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index b27ce9ff45e..4777f313a61 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -4,8 +4,11 @@ */ use crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID}; +use crate::client::defaults::{ + default_http_client_plugin, default_retry_config_plugin, default_sleep_impl_plugin, + default_time_source_plugin, default_timeout_config_plugin, +}; use crate::client::http::connection_poisoning::ConnectionPoisoningInterceptor; -use crate::client::http::default_http_client_plugin; use crate::client::identity::no_auth::NoAuthIdentityResolver; use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; @@ -222,9 +225,7 @@ impl OperationBuilder { pub fn standard_retry(mut self, retry_config: &RetryConfig) -> Self { self.config.store_put(retry_config.clone()); self.runtime_components - .set_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new( - retry_config, - )))); + .set_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new()))); self } @@ -323,8 +324,19 @@ impl OperationBuilder { pub fn build(self) -> Operation { let service_name = self.service_name.expect("service_name required"); let operation_name = self.operation_name.expect("operation_name required"); + + let defaults = [ + default_http_client_plugin(), + default_retry_config_plugin(service_name.clone()), + default_sleep_impl_plugin(), + default_time_source_plugin(), + default_timeout_config_plugin(), + ] + .into_iter() + .flatten(); + let mut runtime_plugins = RuntimePlugins::new() - .with_client_plugin(default_http_client_plugin()) + .with_client_plugins(defaults) .with_client_plugin( StaticRuntimePlugin::new() .with_config(self.config.freeze()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries.rs b/rust-runtime/aws-smithy-runtime/src/client/retries.rs index 46bc4332c6c..b275b235287 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries.rs @@ -15,30 +15,29 @@ mod token_bucket; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::fmt; -pub use client_rate_limiter::{ClientRateLimiter, ClientRateLimiterRuntimePlugin}; -pub use token_bucket::{TokenBucket, TokenBucketRuntimePlugin}; +pub use client_rate_limiter::ClientRateLimiter; +pub use token_bucket::TokenBucket; #[doc(hidden)] pub use client_rate_limiter::ClientRateLimiterPartition; -#[doc(hidden)] -pub use token_bucket::TokenBucketPartition; +use std::borrow::Cow; #[doc(hidden)] #[non_exhaustive] #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct RetryPartition { - inner: &'static str, + name: Cow<'static, str>, } impl RetryPartition { - pub fn new(name: &'static str) -> Self { - Self { inner: name } + pub fn new(name: impl Into>) -> Self { + Self { name: name.into() } } } impl fmt::Display for RetryPartition { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.inner) + f.write_str(&self.name) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs index 661f0f854c2..3e010b0c600 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs @@ -9,38 +9,11 @@ #![allow(dead_code)] use crate::client::retries::RetryPartition; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_runtime_api::{builder, builder_methods, builder_struct}; -use aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, StoreReplace}; use std::sync::{Arc, Mutex}; use std::time::Duration; use tracing::debug; -/// A [`RuntimePlugin`] to provide a client rate limiter, usable by a retry strategy. -#[non_exhaustive] -#[derive(Debug)] -pub struct ClientRateLimiterRuntimePlugin { - rate_limiter: ClientRateLimiter, -} - -impl ClientRateLimiterRuntimePlugin { - /// Create a new [`ClientRateLimiterRuntimePlugin`]. - pub fn new(seconds_since_unix_epoch: f64) -> Self { - Self { - rate_limiter: ClientRateLimiter::new(seconds_since_unix_epoch), - } - } -} - -impl RuntimePlugin for ClientRateLimiterRuntimePlugin { - fn config(&self) -> Option { - let mut cfg = Layer::new("client rate limiter"); - cfg.store_put(self.rate_limiter.clone()); - - Some(cfg.freeze()) - } -} - #[doc(hidden)] #[non_exhaustive] #[derive(Clone, Debug, Hash, PartialEq, Eq)] @@ -104,10 +77,6 @@ pub(crate) enum RequestReason { InitialRequest, } -impl Storable for ClientRateLimiter { - type Storer = StoreReplace; -} - impl ClientRateLimiter { /// Creates a new [`ClientRateLimiter`]. pub fn new(seconds_since_unix_epoch: f64) -> Self { diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index 70efea493ab..98d1308831a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -9,29 +9,26 @@ use crate::client::retries::strategy::standard::ReleaseResult::{ APermitWasReleased, NoPermitWasReleased, }; use crate::client::retries::token_bucket::TokenBucket; +use crate::client::retries::{ClientRateLimiterPartition, RetryPartition}; +use crate::static_partition_map::StaticPartitionMap; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::retries::classifiers::{RetryAction, RetryReason}; use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::retry::{ErrorKind, RetryConfig}; +use aws_smithy_types::retry::{ErrorKind, RetryConfig, RetryMode}; use std::sync::Mutex; use std::time::{Duration, SystemTime}; use tokio::sync::OwnedSemaphorePermit; use tracing::debug; -// The initial attempt, plus three retries. -const DEFAULT_MAX_ATTEMPTS: u32 = 4; +static CLIENT_RATE_LIMITER: StaticPartitionMap = + StaticPartitionMap::new(); /// Retry strategy with exponential backoff, max attempts, and a token bucket. -#[derive(Debug)] +#[derive(Debug, Default)] pub struct StandardRetryStrategy { - // Retry settings - base: fn() -> f64, - initial_backoff: Duration, - max_attempts: u32, - max_backoff: Duration, retry_permit: Mutex>, } @@ -41,41 +38,8 @@ impl Storable for StandardRetryStrategy { impl StandardRetryStrategy { /// Create a new standard retry strategy with the given config. - pub fn new(retry_config: &RetryConfig) -> Self { - let base = if retry_config.use_static_exponential_base() { - || 1.0 - } else { - fastrand::f64 - }; - Self::default() - .with_base(base) - .with_max_backoff(retry_config.max_backoff()) - .with_max_attempts(retry_config.max_attempts()) - .with_initial_backoff(retry_config.initial_backoff()) - } - - /// Changes the exponential backoff base. - pub fn with_base(mut self, base: fn() -> f64) -> Self { - self.base = base; - self - } - - /// Changes the max number of attempts. - pub fn with_max_attempts(mut self, max_attempts: u32) -> Self { - self.max_attempts = max_attempts; - self - } - - /// Changes the initial backoff time. - pub fn with_initial_backoff(mut self, initial_backoff: Duration) -> Self { - self.initial_backoff = initial_backoff; - self - } - - /// Changes the maximum backoff time. - pub fn with_max_backoff(mut self, max_backoff: Duration) -> Self { - self.max_backoff = max_backoff; - self + pub fn new() -> Self { + Default::default() } fn release_retry_permit(&self) -> ReleaseResult { @@ -98,10 +62,37 @@ impl StandardRetryStrategy { } } + /// Returns a [`ClientRateLimiter`] if adaptive retry is configured. + fn adaptive_retry_rate_limiter( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Option { + let retry_config = cfg.load::().expect("retry config is required"); + if retry_config.mode() == RetryMode::Adaptive { + if let Some(time_source) = runtime_components.time_source() { + let retry_partition = cfg.load::().expect("set in default config"); + let seconds_since_unix_epoch = time_source + .now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("the present takes place after the UNIX_EPOCH") + .as_secs_f64(); + let client_rate_limiter_partition = + ClientRateLimiterPartition::new(retry_partition.clone()); + let client_rate_limiter = CLIENT_RATE_LIMITER + .get_or_init(client_rate_limiter_partition, || { + ClientRateLimiter::new(seconds_since_unix_epoch) + }); + return Some(client_rate_limiter); + } + } + None + } + fn calculate_backoff( &self, runtime_components: &RuntimeComponents, cfg: &ConfigBag, + retry_cfg: &RetryConfig, retry_reason: &RetryAction, ) -> Result { let request_attempts = cfg @@ -119,13 +110,13 @@ impl StandardRetryStrategy { ); if let Some(delay) = *retry_after { - let delay = delay.min(self.max_backoff); + let delay = delay.min(retry_cfg.max_backoff()); debug!("explicit request from server to delay {delay:?} before retrying"); Ok(delay) } else if let Some(delay) = check_rate_limiter_for_delay(runtime_components, cfg, *kind) { - let delay = delay.min(self.max_backoff); + let delay = delay.min(retry_cfg.max_backoff()); debug!("rate limiter has requested a {delay:?} delay before retrying"); Ok(delay) } else { @@ -139,23 +130,28 @@ impl StandardRetryStrategy { } } + let base = if retry_cfg.use_static_exponential_base() { + 1.0 + } else { + fastrand::f64() + }; let backoff = calculate_exponential_backoff( // Generate a random base multiplier to create jitter - (self.base)(), + base, // Get the backoff time multiplier in seconds (with fractional seconds) - self.initial_backoff.as_secs_f64(), + retry_cfg.initial_backoff().as_secs_f64(), // `self.local.attempts` tracks number of requests made including the initial request // The initial attempt shouldn't count towards backoff calculations so we subtract it request_attempts - 1, ); - Ok(Duration::from_secs_f64(backoff).min(self.max_backoff)) + Ok(Duration::from_secs_f64(backoff).min(retry_cfg.max_backoff())) } } RetryAction::RetryForbidden | RetryAction::NoActionIndicated => { update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, - max_attempts = self.max_attempts, + max_attempts = retry_cfg.max_attempts(), "encountered unretryable error" ); Err(ShouldAttempt::No) @@ -170,26 +166,13 @@ enum ReleaseResult { NoPermitWasReleased, } -impl Default for StandardRetryStrategy { - fn default() -> Self { - Self { - max_attempts: DEFAULT_MAX_ATTEMPTS, - max_backoff: Duration::from_secs(20), - // by default, use a random base for exponential backoff - base: fastrand::f64, - initial_backoff: Duration::from_secs(1), - retry_permit: Mutex::new(None), - } - } -} - impl RetryStrategy for StandardRetryStrategy { fn should_attempt_initial_request( &self, runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { - if let Some(crl) = cfg.load::() { + if let Some(crl) = Self::adaptive_retry_rate_limiter(runtime_components, cfg) { let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components); if let Err(delay) = crl.acquire_permission_to_send_a_request( seconds_since_unix_epoch, @@ -210,6 +193,7 @@ impl RetryStrategy for StandardRetryStrategy { runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { + let retry_cfg = cfg.load::().expect("retry config is required"); // Look a the result. If it's OK then we're done; No retry required. Otherwise, we need to inspect it let output_or_error = ctx.output_or_error().expect( "This must never be called without reaching the point where the result exists.", @@ -237,12 +221,12 @@ impl RetryStrategy for StandardRetryStrategy { .load::() .expect("at least one request attempt is made before any retry is attempted") .attempts(); - if request_attempts >= self.max_attempts { + if request_attempts >= retry_cfg.max_attempts() { update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, - max_attempts = self.max_attempts, + max_attempts = retry_cfg.max_attempts(), "not retrying because we are out of attempts" ); return Ok(ShouldAttempt::No); @@ -253,11 +237,12 @@ impl RetryStrategy for StandardRetryStrategy { let classifier_result = run_classifiers_on_ctx(retry_classifiers, ctx); // Calculate the appropriate backoff time. - let backoff = match self.calculate_backoff(runtime_components, cfg, &classifier_result) { - Ok(value) => value, - // In some cases, backoff calculation will decide that we shouldn't retry at all. - Err(value) => return Ok(value), - }; + let backoff = + match self.calculate_backoff(runtime_components, cfg, retry_cfg, &classifier_result) { + Ok(value) => value, + // In some cases, backoff calculation will decide that we shouldn't retry at all. + Err(value) => return Ok(value), + }; debug!( "attempt #{request_attempts} failed with {:?}; retrying after {:?}", classifier_result, backoff, @@ -272,7 +257,7 @@ fn update_rate_limiter_if_exists( cfg: &ConfigBag, is_throttling_error: bool, ) { - if let Some(crl) = cfg.load::() { + if let Some(crl) = StandardRetryStrategy::adaptive_retry_rate_limiter(runtime_components, cfg) { let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components); crl.update_rate_limiter(seconds_since_unix_epoch, is_throttling_error); } @@ -283,7 +268,7 @@ fn check_rate_limiter_for_delay( cfg: &ConfigBag, kind: ErrorKind, ) -> Option { - if let Some(crl) = cfg.load::() { + if let Some(crl) = StandardRetryStrategy::adaptive_retry_rate_limiter(runtime_components, cfg) { let retry_reason = if kind == ErrorKind::ThrottlingError { RequestReason::RetryTimeout } else { @@ -336,7 +321,11 @@ mod tests { #[test] fn no_retry_necessary_for_ok_result() { - let cfg = ConfigBag::base(); + let cfg = ConfigBag::of_layers(vec![{ + let mut layer = Layer::new("test"); + layer.store_put(RetryConfig::standard()); + layer + }]); let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let strategy = StandardRetryStrategy::default(); @@ -350,6 +339,7 @@ mod tests { fn set_up_cfg_and_context( error_kind: ErrorKind, current_request_attempts: u32, + retry_config: RetryConfig, ) -> (InterceptorContext, RuntimeComponents, ConfigBag) { let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); @@ -359,6 +349,7 @@ mod tests { .unwrap(); let mut layer = Layer::new("test"); layer.store_put(RequestAttempts::new(current_request_attempts)); + layer.store_put(retry_config); let cfg = ConfigBag::of_layers(vec![layer]); (ctx, rc, cfg) @@ -367,8 +358,14 @@ mod tests { // Test that error kinds produce the correct "retry after X seconds" output. // All error kinds are handled in the same way for the standard strategy. fn test_should_retry_error_kind(error_kind: ErrorKind) { - let (ctx, rc, cfg) = set_up_cfg_and_context(error_kind, 3); - let strategy = StandardRetryStrategy::default().with_base(|| 1.0); + let (ctx, rc, cfg) = set_up_cfg_and_context( + error_kind, + 3, + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(4), + ); + let strategy = StandardRetryStrategy::new(); let actual = strategy .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); @@ -399,10 +396,14 @@ mod tests { fn dont_retry_when_out_of_attempts() { let current_attempts = 4; let max_attempts = current_attempts; - let (ctx, rc, cfg) = set_up_cfg_and_context(ErrorKind::TransientError, current_attempts); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(max_attempts); + let (ctx, rc, cfg) = set_up_cfg_and_context( + ErrorKind::TransientError, + current_attempts, + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(max_attempts), + ); + let strategy = StandardRetryStrategy::new(); let actual = strategy .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); @@ -471,6 +472,7 @@ mod tests { #[cfg(feature = "test-util")] fn setup_test( retry_reasons: Vec, + retry_config: RetryConfig, ) -> (ConfigBag, RuntimeComponents, InterceptorContext) { let rc = RuntimeComponentsBuilder::for_tests() .with_retry_classifier(SharedRetryClassifier::new( @@ -478,7 +480,9 @@ mod tests { )) .build() .unwrap(); - let cfg = ConfigBag::base(); + let mut layer = Layer::new("test"); + layer.store_put(retry_config); + let cfg = ConfigBag::of_layers(vec![layer]); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); // This type doesn't matter b/c the classifier will just return whatever we tell it to. ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); @@ -489,10 +493,13 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn eventual_success() { - let (mut cfg, rc, mut ctx) = setup_test(vec![RetryAction::server_error()]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, mut ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); @@ -519,10 +526,13 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_more_attempts() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(3); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(3), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); @@ -547,10 +557,13 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_quota() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::new(5)); let token_bucket = cfg.load::().unwrap().clone(); @@ -569,16 +582,19 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn quota_replenishes_on_success() { - let (mut cfg, rc, mut ctx) = setup_test(vec![ - RetryAction::transient_error(), - RetryAction::retryable_error_with_explicit_delay( - ErrorKind::TransientError, - Duration::from_secs(1), - ), - ]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, mut ctx) = setup_test( + vec![ + RetryAction::transient_error(), + RetryAction::retryable_error_with_explicit_delay( + ErrorKind::TransientError, + Duration::from_secs(1), + ), + ], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::new(100)); let token_bucket = cfg.load::().unwrap().clone(); @@ -607,10 +623,13 @@ mod tests { #[test] fn quota_replenishes_on_first_try_success() { const PERMIT_COUNT: usize = 20; - let (mut cfg, rc, mut ctx) = setup_test(vec![RetryAction::transient_error()]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(u32::MAX); + let (mut cfg, rc, mut ctx) = setup_test( + vec![RetryAction::transient_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(u32::MAX), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state() .store_put(TokenBucket::new(PERMIT_COUNT)); let token_bucket = cfg.load::().unwrap().clone(); @@ -657,10 +676,13 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn backoff_timing() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); @@ -697,12 +719,15 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn max_backoff_time() { - let (mut cfg, rc, ctx) = setup_test(vec![RetryAction::server_error()]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5) - .with_initial_backoff(Duration::from_secs(1)) - .with_max_backoff(Duration::from_secs(3)); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5) + .with_initial_backoff(Duration::from_secs(1)) + .with_max_backoff(Duration::from_secs(3)), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs index 686185b1d1a..c2c8ba8c646 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs @@ -3,52 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::client::retries::RetryPartition; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, StoreReplace}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::retry::ErrorKind; use std::sync::Arc; use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tracing::trace; -/// A [`RuntimePlugin`] to provide a token bucket, usable by a retry strategy. -#[non_exhaustive] -#[derive(Debug, Default)] -pub struct TokenBucketRuntimePlugin { - token_bucket: TokenBucket, -} - -impl TokenBucketRuntimePlugin { - /// Creates a new `TokenBucketRuntimePlugin` with the given initial quota. - pub fn new(initial_tokens: usize) -> Self { - Self { - token_bucket: TokenBucket::new(initial_tokens), - } - } -} - -impl RuntimePlugin for TokenBucketRuntimePlugin { - fn config(&self) -> Option { - let mut cfg = Layer::new("standard token bucket"); - cfg.store_put(self.token_bucket.clone()); - - Some(cfg.freeze()) - } -} - -#[doc(hidden)] -#[non_exhaustive] -#[derive(Clone, Debug, Hash, PartialEq, Eq)] -pub struct TokenBucketPartition { - retry_partition: RetryPartition, -} - -impl TokenBucketPartition { - pub fn new(retry_partition: RetryPartition) -> Self { - Self { retry_partition } - } -} - const DEFAULT_CAPACITY: usize = 500; const RETRY_COST: u32 = 5; const RETRY_TIMEOUT_COST: u32 = RETRY_COST * 2; diff --git a/rust-runtime/aws-smithy-types/src/retry.rs b/rust-runtime/aws-smithy-types/src/retry.rs index 911a37ca3a8..964dbbdc6ee 100644 --- a/rust-runtime/aws-smithy-types/src/retry.rs +++ b/rust-runtime/aws-smithy-types/src/retry.rs @@ -393,6 +393,12 @@ impl RetryConfig { self } + /// Set the maximum backoff time. + pub fn with_max_backoff(mut self, max_backoff: Duration) -> Self { + self.max_backoff = max_backoff; + self + } + /// Hint to the retry strategy whether to use a static exponential base. /// /// When a retry strategy uses exponential backoff, it calculates a random base. This causes the From 12fa4d3963eaee9105339971ff1e6e1e185c95fd Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 18 Oct 2023 16:57:56 -0400 Subject: [PATCH 184/331] Delete `aws_smithy_http::ResolveEndpoint` and point usages to service-specific trait (#3078) ## Motivation and Context - Fixes https://github.com/awslabs/smithy-rs/issues/3043 As a follow up to #3072 this removes the old endpoint resolver interfaces in favor of creating a per-service resolver trait. This trait defines a `into_shared_resolver()` method which converts the local trait into a global resolver that can be used with the orchestrator. ## Description ## Testing ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 + .../aws-inlineable/src/endpoint_discovery.rs | 59 ++-- .../timestream/TimestreamDecorator.kt | 22 +- .../codegen/client/smithy/ClientRustModule.kt | 2 +- .../endpoint/EndpointConfigCustomization.kt | 88 +++--- .../smithy/endpoint/EndpointTypesGenerator.kt | 1 - .../smithy/endpoint/EndpointsDecorator.kt | 36 +-- .../codegen/client/smithy/endpoint/Util.kt | 15 +- .../generators/EndpointResolverGenerator.kt | 64 +++- .../generators/EndpointTestGenerator.kt | 6 - .../ClientRuntimeTypesReExportGenerator.kt | 7 +- .../protocol/ProtocolTestGenerator.kt | 2 +- .../customizations/HttpAuthDecoratorTest.kt | 14 +- .../MetadataCustomizationTest.kt | 2 +- .../SensitiveOutputDecoratorTest.kt | 2 +- ...onfigOverrideRuntimePluginGeneratorTest.kt | 4 +- .../CustomizableOperationGeneratorTest.kt | 2 +- .../client/FluentClientGeneratorTest.kt | 4 +- rust-runtime/aws-smithy-http/src/endpoint.rs | 275 +----------------- .../src/client/orchestrator/endpoints.rs | 47 +-- 20 files changed, 206 insertions(+), 458 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 47b470967cd..c17e89a4cf9 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -414,3 +414,15 @@ message = "The `idempotency_provider` field has been removed from config as a pu references = ["smithy-rs#3072"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "rcoh" + +[[smithy-rs]] +message = "The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead." +references = ["smithy-rs#3078"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" + +[[smithy-rs]] +message = "**This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3079).**

The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added." +references = ["smithy-rs#3043", "smithy-rs#3078"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" diff --git a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs index 7e80f9ab222..68a5d161698 100644 --- a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs +++ b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs @@ -8,7 +8,10 @@ use aws_smithy_async::future::BoxFuture; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_http::endpoint::{ResolveEndpoint, ResolveEndpointError}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::endpoint::{ + EndpointFuture, EndpointResolverParams, ResolveEndpoint, +}; use aws_smithy_types::endpoint::Endpoint; use std::fmt::{Debug, Formatter}; use std::future::Future; @@ -20,11 +23,9 @@ use tokio::sync::oneshot::{Receiver, Sender}; /// Endpoint reloader #[must_use] pub struct ReloadEndpoint { - loader: Box< - dyn Fn() -> BoxFuture<'static, (Endpoint, SystemTime), ResolveEndpointError> + Send + Sync, - >, + loader: Box BoxFuture<'static, (Endpoint, SystemTime), BoxError> + Send + Sync>, endpoint: Arc>>, - error: Arc>>, + error: Arc>>, rx: Receiver<()>, sleep: SharedAsyncSleep, time: SharedTimeSource, @@ -79,14 +80,14 @@ impl ReloadEndpoint { #[derive(Debug, Clone)] pub(crate) struct EndpointCache { - error: Arc>>, + error: Arc>>, endpoint: Arc>>, // When the sender is dropped, this allows the reload loop to stop _drop_guard: Arc>, } -impl ResolveEndpoint for EndpointCache { - fn resolve_endpoint(&self, _params: &T) -> aws_smithy_http::endpoint::Result { +impl ResolveEndpoint for EndpointCache { + fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> { self.resolve_endpoint() } } @@ -111,9 +112,9 @@ pub(crate) async fn create_cache( loader_fn: impl Fn() -> F + Send + Sync + 'static, sleep: SharedAsyncSleep, time: SharedTimeSource, -) -> Result<(EndpointCache, ReloadEndpoint), ResolveEndpointError> +) -> Result<(EndpointCache, ReloadEndpoint), BoxError> where - F: Future> + Send + 'static, + F: Future> + Send + 'static, { let error_holder = Arc::new(Mutex::new(None)); let endpoint_holder = Arc::new(Mutex::new(None)); @@ -135,25 +136,24 @@ where reloader.reload_once().await; // if we didn't successfully get an endpoint, bail out so the client knows // configuration failed to work - cache.resolve_endpoint()?; + cache.resolve_endpoint().await?; Ok((cache, reloader)) } impl EndpointCache { - fn resolve_endpoint(&self) -> aws_smithy_http::endpoint::Result { + fn resolve_endpoint(&self) -> EndpointFuture<'_> { tracing::trace!("resolving endpoint from endpoint discovery cache"); - self.endpoint + let ep = self + .endpoint .lock() .unwrap() .as_ref() .map(|e| e.endpoint.clone()) .ok_or_else(|| { - self.error - .lock() - .unwrap() - .take() - .unwrap_or_else(|| ResolveEndpointError::message("no endpoint loaded")) - }) + let error: Option = self.error.lock().unwrap().take(); + error.unwrap_or_else(|| "Failed to resolve endpoint".into()) + }); + EndpointFuture::ready(ep) } } @@ -215,7 +215,7 @@ mod test { .await .expect("returns an endpoint"); assert_eq!( - cache.resolve_endpoint().expect("ok").url(), + cache.resolve_endpoint().await.expect("ok").url(), "http://foo.com/1" ); // 120 second buffer @@ -223,13 +223,13 @@ mod test { .reload_increment(expiry - Duration::from_secs(240)) .await; assert_eq!( - cache.resolve_endpoint().expect("ok").url(), + cache.resolve_endpoint().await.expect("ok").url(), "http://foo.com/1" ); reloader.reload_increment(expiry).await; assert_eq!( - cache.resolve_endpoint().expect("ok").url(), + cache.resolve_endpoint().await.expect("ok").url(), "http://foo.com/2" ); } @@ -266,18 +266,27 @@ mod test { gate.expect_sleep().await.duration(), Duration::from_secs(60) ); - assert_eq!(cache.resolve_endpoint().unwrap().url(), "http://foo.com/1"); + assert_eq!( + cache.resolve_endpoint().await.unwrap().url(), + "http://foo.com/1" + ); // t = 60 let sleep = gate.expect_sleep().await; // we're still holding the drop guard, so we haven't expired yet. - assert_eq!(cache.resolve_endpoint().unwrap().url(), "http://foo.com/1"); + assert_eq!( + cache.resolve_endpoint().await.unwrap().url(), + "http://foo.com/1" + ); assert_eq!(sleep.duration(), Duration::from_secs(60)); sleep.allow_progress(); // t = 120 let sleep = gate.expect_sleep().await; - assert_eq!(cache.resolve_endpoint().unwrap().url(), "http://foo.com/2"); + assert_eq!( + cache.resolve_endpoint().await.unwrap().url(), + "http://foo.com/2" + ); sleep.allow_progress(); let sleep = gate.expect_sleep().await; diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 74c19ea048d..eca18011871 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -55,11 +55,9 @@ class TimestreamDecorator : ClientCodegenDecorator { // helper function to resolve an endpoint given a base client rustTemplate( """ - async fn resolve_endpoint(client: &crate::Client) -> Result<(#{Endpoint}, #{SystemTime}), #{ResolveEndpointError}> { + async fn resolve_endpoint(client: &crate::Client) -> Result<(#{Endpoint}, #{SystemTime}), #{BoxError}> { let describe_endpoints = - client.describe_endpoints().send().await.map_err(|e| { - #{ResolveEndpointError}::from_source("failed to call describe_endpoints", e) - })?; + client.describe_endpoints().send().await?; let endpoint = describe_endpoints.endpoints().get(0).unwrap(); let expiry = client.config().time_source().expect("checked when ep discovery was enabled").now() + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); @@ -75,7 +73,7 @@ class TimestreamDecorator : ClientCodegenDecorator { /// Enable endpoint discovery for this client /// /// This method MUST be called to construct a working client. - pub async fn with_endpoint_discovery_enabled(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{ResolveEndpointError}> { + pub async fn with_endpoint_discovery_enabled(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{BoxError}> { let handle = self.handle.clone(); // The original client without endpoint discover gets moved into the endpoint discovery @@ -92,11 +90,11 @@ class TimestreamDecorator : ClientCodegenDecorator { .expect("endpoint discovery requires the client config to have a time source"), ).await?; - let client_with_discovery = crate::Client::from_conf( - handle.conf.to_builder() - .endpoint_resolver(#{SharedEndpointResolver}::new(resolver)) - .build() - ); + use #{IntoShared}; + let mut conf = handle.conf.to_builder(); + conf.set_endpoint_resolver(Some(resolver.into_shared())); + + let client_with_discovery = crate::Client::from_conf(conf.build()); Ok((client_with_discovery, reloader)) } } @@ -104,10 +102,10 @@ class TimestreamDecorator : ClientCodegenDecorator { *RuntimeType.preludeScope, "Arc" to RuntimeType.Arc, "Duration" to RuntimeType.std.resolve("time::Duration"), - "SharedEndpointResolver" to RuntimeType.smithyHttp(codegenContext.runtimeConfig) - .resolve("endpoint::SharedEndpointResolver"), "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), "endpoint_discovery" to endpointDiscovery.toType(), + "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), + "IntoShared" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("shared::IntoShared"), *Types(codegenContext.runtimeConfig).toArray(), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt index 7c882a3f4b3..ac39f8d3bc8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt @@ -104,7 +104,7 @@ class ClientModuleDocProvider( ClientRustModule.Config.endpoint -> strDoc("Types needed to configure endpoint resolution.") ClientRustModule.Config.retry -> strDoc("Retry configuration.") ClientRustModule.Config.timeout -> strDoc("Timeout configuration.") - ClientRustModule.Config.interceptors -> strDoc("Types needed to implement [`Interceptor`](crate::config::Interceptor).") + ClientRustModule.Config.interceptors -> strDoc("Types needed to implement [`Intercept`](crate::config::Intercept).") ClientRustModule.Error -> strDoc("Common errors and error handling utilities.") ClientRustModule.Operation -> strDoc("All operations that this crate can perform.") ClientRustModule.Meta -> strDoc("Information about this crate.") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index 84d30a44834..e565aeefa9b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -7,10 +7,10 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.serviceSpecificEndpointResolver import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -26,23 +26,21 @@ internal class EndpointConfigCustomization( ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val moduleUseName = codegenContext.moduleUseName() - private val types = Types(runtimeConfig) + private val epModule = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint") + private val epRuntimeModule = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints") private val codegenScope = arrayOf( *preludeScope, - "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), - "Endpoint" to RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint::Endpoint"), - "OldSharedEndpointResolver" to types.sharedEndpointResolver, "Params" to typesGenerator.paramsStruct(), + "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), - "SharedEndpointResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint::SharedEndpointResolver"), - "SmithyResolver" to types.resolveEndpoint, + "SharedEndpointResolver" to epModule.resolve("SharedEndpointResolver"), + "StaticUriEndpointResolver" to epRuntimeModule.resolve("StaticUriEndpointResolver"), + "ServiceSpecificResolver" to codegenContext.serviceSpecificEndpointResolver(), ) override fun section(section: ServiceConfig): Writable { return writable { - val sharedEndpointResolver = "#{OldSharedEndpointResolver}<#{Params}>" - val resolverTrait = "#{SmithyResolver}<#{Params}>" when (section) { is ServiceConfig.ConfigImpl -> { rustTemplate( @@ -57,44 +55,16 @@ internal class EndpointConfigCustomization( } ServiceConfig.BuilderImpl -> { + val endpointModule = ClientRustModule.Config.endpoint.fullyQualifiedPath() + .replace("crate::", "$moduleUseName::") // if there are no rules, we don't generate a default resolver—we need to also suppress those docs. val defaultResolverDocs = if (typesGenerator.defaultResolver() != null) { - val endpointModule = ClientRustModule.Config.endpoint.fullyQualifiedPath() - .replace("crate::", "$moduleUseName::") """ - /// /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution /// rules for `$moduleUseName`. - /// - /// ## Examples - /// ```no_run - /// use aws_smithy_http::endpoint; - /// use $endpointModule::{Params as EndpointParams, DefaultResolver}; - /// /// Endpoint resolver which adds a prefix to the generated endpoint - /// ##[derive(Debug)] - /// struct PrefixResolver { - /// base_resolver: DefaultResolver, - /// prefix: String - /// } - /// impl endpoint::ResolveEndpoint for PrefixResolver { - /// fn resolve_endpoint(&self, params: &EndpointParams) -> endpoint::Result { - /// self.base_resolver - /// .resolve_endpoint(params) - /// .map(|ep|{ - /// let url = ep.url().to_string(); - /// ep.into_builder().url(format!("{}.{}", &self.prefix, url)).build() - /// }) - /// } - /// } - /// let prefix_resolver = PrefixResolver { - /// base_resolver: DefaultResolver::new(), - /// prefix: "subdomain".to_string() - /// }; - /// let config = $moduleUseName::Config::builder().endpoint_resolver(prefix_resolver); - /// ``` """ } else { - "" + "/// This service does not define a default endpoint resolver." } if (codegenContext.settings.codegenConfig.includeEndpointUrlConfig) { rustTemplate( @@ -120,9 +90,8 @@ internal class EndpointConfigCustomization( ##[allow(deprecated)] self.set_endpoint_resolver( endpoint_url.map(|url| { - #{OldSharedEndpointResolver}::new( - #{Endpoint}::immutable(url).expect("invalid endpoint URL") - ) + use #{IntoShared}; + #{StaticUriEndpointResolver}::uri(url).into_shared() }) ); self @@ -135,31 +104,48 @@ internal class EndpointConfigCustomization( """ /// Sets the endpoint resolver to use when making requests. /// + $defaultResolverDocs + /// /// Note: setting an endpoint resolver will replace any endpoint URL that has been set. + /// This method accepts an endpoint resolver [specific to this service](#{ServiceSpecificResolver}). If you want to + /// provide a shared endpoint resolver, use [`Self::set_endpoint_resolver`]. /// - $defaultResolverDocs - pub fn endpoint_resolver(mut self, endpoint_resolver: impl $resolverTrait + 'static) -> Self { - self.set_endpoint_resolver(#{Some}(#{OldSharedEndpointResolver}::new(endpoint_resolver))); + /// ## Examples + /// Create a custom endpoint resolver that resolves a different endpoing per-stage, e.g. staging vs. production. + /// ```no_run + /// use $endpointModule::{ResolveEndpoint, EndpointFuture, Params, Endpoint}; + /// ##[derive(Debug)] + /// struct StageResolver { stage: String } + /// impl ResolveEndpoint for StageResolver { + /// fn resolve_endpoint(&self, params: &Params) -> EndpointFuture<'_> { + /// let stage = &self.stage; + /// EndpointFuture::ready(Ok(Endpoint::builder().url(format!("{stage}.myservice.com")).build())) + /// } + /// } + /// let resolver = StageResolver { stage: std::env::var("STAGE").unwrap() }; + /// let config = $moduleUseName::Config::builder().endpoint_resolver(resolver).build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + pub fn endpoint_resolver(mut self, endpoint_resolver: impl #{ServiceSpecificResolver} + 'static) -> Self { + self.set_endpoint_resolver(#{Some}(endpoint_resolver.into_shared_resolver())); self } /// Sets the endpoint resolver to use when making requests. /// - /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution - /// rules for `$moduleUseName`. + $defaultResolverDocs """, *codegenScope, ) rustTemplate( """ - pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.runtime_components.set_endpoint_resolver(endpoint_resolver.map(|r|#{wrap_resolver})); + pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<#{SharedEndpointResolver}>) -> &mut Self { + self.runtime_components.set_endpoint_resolver(endpoint_resolver); self } """, *codegenScope, - "wrap_resolver" to codegenContext.wrapResolver { rust("r") }, ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt index 889b741ebbc..d20e2d72b8f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt @@ -53,7 +53,6 @@ class EndpointTypesGenerator( it, params, codegenContext = codegenContext, - endpointCustomizations = codegenContext.rootDecorator.endpointCustomizations(codegenContext), ).generate() } ?: {} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index a569d4f6f3e..2e53a29dccf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -12,15 +12,14 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.endpointTestsModule +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.serviceSpecificEndpointResolver import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.map import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate /** @@ -118,8 +117,9 @@ class EndpointsDecorator : ClientCodegenDecorator { override fun section(section: ServiceRuntimePluginSection): Writable { return when (section) { is ServiceRuntimePluginSection.RegisterRuntimeComponents -> writable { - codegenContext.defaultEndpointResolver() - ?.let { resolver -> section.registerEndpointResolver(this, resolver) } + codegenContext.defaultEndpointResolver()?.also { resolver -> + section.registerEndpointResolver(this, resolver) + } } else -> emptySection @@ -138,28 +138,22 @@ class EndpointsDecorator : ClientCodegenDecorator { } } +/** + * Returns the rules-generated endpoint resolver for this service + * + * If no endpoint rules are provided, `null` will be returned. + */ private fun ClientCodegenContext.defaultEndpointResolver(): Writable? { val generator = EndpointTypesGenerator.fromContext(this) val defaultResolver = generator.defaultResolver() ?: return null - val ctx = arrayOf("DefaultResolver" to defaultResolver) - return wrapResolver { rustTemplate("#{DefaultResolver}::new()", *ctx) } -} - -fun ClientCodegenContext.wrapResolver(resolver: Writable): Writable { - val generator = EndpointTypesGenerator.fromContext(this) - return resolver.map { base -> - val types = Types(runtimeConfig) - val ctx = arrayOf( - "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig) - .resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), - "Params" to generator.paramsStruct(), - "OldSharedEndpointResolver" to types.sharedEndpointResolver, - ) - + val ctx = arrayOf("DefaultResolver" to defaultResolver, "ServiceSpecificResolver" to serviceSpecificEndpointResolver()) + return writable { rustTemplate( - "#{DefaultEndpointResolver}::<#{Params}>::new(#{OldSharedEndpointResolver}::new(#{base}))", + """{ + use #{ServiceSpecificResolver}; + #{DefaultResolver}::new().into_shared_resolver() + }""", *ctx, - "base" to base, ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt index c6b5ad282c5..9265a85d731 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt @@ -57,12 +57,18 @@ internal fun endpointsLib(name: String, vararg additionalDependency: RustDepende class Types(runtimeConfig: RuntimeConfig) { private val smithyTypesEndpointModule = RuntimeType.smithyTypes(runtimeConfig).resolve("endpoint") val smithyHttpEndpointModule = RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint") - val resolveEndpoint = smithyHttpEndpointModule.resolve("ResolveEndpoint") - val sharedEndpointResolver = smithyHttpEndpointModule.resolve("SharedEndpointResolver") val smithyEndpoint = smithyTypesEndpointModule.resolve("Endpoint") + val endpointFuture = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint::EndpointFuture") + private val endpointRtApi = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint") val resolveEndpointError = smithyHttpEndpointModule.resolve("ResolveEndpointError") - fun toArray() = arrayOf("ResolveEndpointError" to resolveEndpointError, "Endpoint" to smithyEndpoint) + fun toArray() = arrayOf( + "Endpoint" to smithyEndpoint, + "EndpointFuture" to endpointFuture, + "SharedEndpointResolver" to endpointRtApi.resolve("SharedEndpointResolver"), + "EndpointResolverParams" to endpointRtApi.resolve("EndpointResolverParams"), + "ResolveEndpoint" to endpointRtApi.resolve("ResolveEndpoint"), + ) } /** @@ -98,7 +104,8 @@ class AuthSchemeLister : RuleValueVisitor> { } override fun visitEndpointRule(endpoint: Endpoint): Set { - return endpoint.properties.getOrDefault(Identifier.of("authSchemes"), Literal.tupleLiteral(listOf())).asTupleLiteral() + return endpoint.properties.getOrDefault(Identifier.of("authSchemes"), Literal.tupleLiteral(listOf())) + .asTupleLiteral() .orNull()?.let { it.map { authScheme -> authScheme.asRecordLiteral().get()[Identifier.of("name")]!!.asStringLiteral().get().expectLiteral() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index 2009f82b4bd..8e2aa516226 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -18,6 +18,7 @@ import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.client.smithy.endpoint.endpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName @@ -36,8 +37,10 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.orNull +import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault abstract class CustomRuntimeFunction { abstract val id: String @@ -128,9 +131,13 @@ internal class EndpointResolverGenerator( private val registry: FunctionRegistry = FunctionRegistry(stdlib) private val types = Types(runtimeConfig) private val codegenScope = arrayOf( + "BoxError" to RuntimeType.boxError(runtimeConfig), "endpoint" to types.smithyHttpEndpointModule, "SmithyEndpoint" to types.smithyEndpoint, + "EndpointFuture" to types.endpointFuture, + "ResolveEndpointError" to types.resolveEndpointError, "EndpointError" to types.resolveEndpointError, + "ServiceSpecificEndpointResolver" to codegenContext.serviceSpecificEndpointResolver(), "DiagnosticCollector" to endpointsLib("diagnostic").toType().resolve("DiagnosticCollector"), ) @@ -183,13 +190,17 @@ internal class EndpointResolverGenerator( pub fn new() -> Self { Self { #{custom_fields_init:W} } } - } - impl #{endpoint}::ResolveEndpoint<#{Params}> for DefaultResolver { - fn resolve_endpoint(&self, params: &Params) -> #{endpoint}::Result { + fn resolve_endpoint(&self, params: &#{Params}) -> Result<#{SmithyEndpoint}, #{BoxError}> { let mut diagnostic_collector = #{DiagnosticCollector}::new(); - #{resolver_fn}(params, &mut diagnostic_collector, #{additional_args}) - .map_err(|err|err.with_source(diagnostic_collector.take_last_error())) + Ok(#{resolver_fn}(params, &mut diagnostic_collector, #{additional_args}) + .map_err(|err|err.with_source(diagnostic_collector.take_last_error()))?) + } + } + + impl #{ServiceSpecificEndpointResolver} for DefaultResolver { + fn resolve_endpoint(&self, params: &#{Params}) -> #{EndpointFuture} { + #{EndpointFuture}::ready(self.resolve_endpoint(params)) } } """, @@ -368,3 +379,46 @@ internal class EndpointResolverGenerator( } } } + +fun ClientCodegenContext.serviceSpecificEndpointResolver(): RuntimeType { + val generator = EndpointTypesGenerator.fromContext(this) + return RuntimeType.forInlineFun("ResolveEndpoint", ClientRustModule.Config.endpoint) { + val ctx = arrayOf(*preludeScope, "Params" to generator.paramsStruct(), *Types(runtimeConfig).toArray(), "Debug" to RuntimeType.Debug) + rustTemplate( + """ + /// Endpoint resolver trait specific to ${serviceShape.serviceNameOrDefault("this service")} + pub trait ResolveEndpoint: #{Send} + #{Sync} + #{Debug} { + /// Resolve an endpoint with the given parameters + fn resolve_endpoint<'a>(&'a self, params: &'a #{Params}) -> #{EndpointFuture}<'a>; + + /// Convert this service-specific resolver into a `SharedEndpointResolver` + /// + /// The resulting resolver will downcast `EndpointResolverParams` into `#{Params}`. + fn into_shared_resolver(self) -> #{SharedEndpointResolver} + where + Self: Sized + 'static, + { + #{SharedEndpointResolver}::new(DowncastParams(self)) + } + } + + ##[derive(Debug)] + struct DowncastParams(T); + impl #{ResolveEndpoint} for DowncastParams + where + T: ResolveEndpoint, + { + fn resolve_endpoint<'a>(&'a self, params: &'a #{EndpointResolverParams}) -> #{EndpointFuture}<'a> { + let ep = match params.get::<#{Params}>() { + Some(params) => self.0.resolve_endpoint(params), + None => #{EndpointFuture}::ready(Err("params of expected type was not present".into())), + }; + ep + } + } + + """, + *ctx, + ) + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt index 442adedf81d..d14c0f3d224 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt @@ -16,7 +16,6 @@ import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.ExpectedEndpoint import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator @@ -38,16 +37,12 @@ internal class EndpointTestGenerator( private val paramsType: RuntimeType, private val resolverType: RuntimeType, private val params: Parameters, - private val endpointCustomizations: List, codegenContext: ClientCodegenContext, ) { private val runtimeConfig = codegenContext.runtimeConfig - private val serviceShape = codegenContext.serviceShape - private val model = codegenContext.model private val types = Types(runtimeConfig) private val codegenScope = arrayOf( "Endpoint" to types.smithyEndpoint, - "ResolveEndpoint" to types.resolveEndpoint, "Error" to types.resolveEndpointError, "Document" to RuntimeType.document(runtimeConfig), "HashMap" to RuntimeType.HashMap, @@ -67,7 +62,6 @@ internal class EndpointTestGenerator( #{docs:W} ##[test] fn test_$id() { - use #{ResolveEndpoint}; let params = #{params:W}; let resolver = #{resolver}::new(); let endpoint = resolver.resolve_endpoint(¶ms); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 09b6bd5fec9..88e6bd2ffd4 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate @@ -49,11 +50,11 @@ class ClientRuntimeTypesReExportGenerator( rustCrate.withModule(ClientRustModule.Config.endpoint) { rustTemplate( """ - pub use #{ResolveEndpoint}; pub use #{SharedEndpointResolver}; + pub use #{EndpointFuture}; + pub use #{Endpoint}; """, - "ResolveEndpoint" to RuntimeType.smithyHttp(rc).resolve("endpoint::ResolveEndpoint"), - "SharedEndpointResolver" to RuntimeType.smithyHttp(rc).resolve("endpoint::SharedEndpointResolver"), + *Types(rc).toArray(), ) } rustCrate.withModule(ClientRustModule.Config.retry) { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index c1ec854befd..9b256bbfce2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -208,7 +208,7 @@ class DefaultProtocolTestGenerator( rustTemplate( """ let (http_client, request_receiver) = #{capture_request}(None); - let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_resolver($host); + let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_url($host); #{customParams} """, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index 56be3c37785..76bb3f90b44 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -49,7 +49,7 @@ class HttpAuthDecoratorTest { let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); @@ -81,7 +81,7 @@ class HttpAuthDecoratorTest { let config = $moduleName::Config::builder() .basic_auth_login(Login::new("some-user", "some-pass", None)) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); @@ -121,7 +121,7 @@ class HttpAuthDecoratorTest { let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); @@ -162,7 +162,7 @@ class HttpAuthDecoratorTest { let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); @@ -203,7 +203,7 @@ class HttpAuthDecoratorTest { let config = $moduleName::Config::builder() .basic_auth_login(Login::new("some-user", "some-pass", None)) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); @@ -244,7 +244,7 @@ class HttpAuthDecoratorTest { let config = $moduleName::Config::builder() .bearer_token(Token::new("some-token", None)) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); @@ -281,7 +281,7 @@ class HttpAuthDecoratorTest { ); let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 4bdb87dbdd1..0795df3cfb1 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -83,7 +83,7 @@ class MetadataCustomizationTest { let (http_client, _captured_request) = #{capture_request}(#{None}); let client_config = crate::config::Config::builder() - .endpoint_resolver("http://localhost:1234/") + .endpoint_url("http://localhost:1234/") .http_client(http_client) .build(); let client = crate::client::Client::from_conf(client_config); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt index 66047aca477..e97ad2921b9 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt @@ -63,7 +63,7 @@ class SensitiveOutputDecoratorTest { )); let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(http_client.clone()) .build(); let client = $moduleName::Client::from_conf(config); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index 668f408d82e..b60f99a67de 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -56,7 +56,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { let (http_client, req) = #{capture_request}(None); let client_config = crate::config::Config::builder().http_client(http_client).build(); let config_override = - crate::config::Config::builder().endpoint_resolver(expected_url); + crate::config::Config::builder().endpoint_url(expected_url); let client = crate::Client::from_conf(client_config); let _ = dbg!(client.say_hello().customize().config_override(config_override).send().await); assert_eq!("http://localhost:1234/", req.expect_request().uri()); @@ -86,7 +86,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { let (http_client, captured_request) = #{capture_request}(#{None}); let expected_url = "http://localhost:1234/"; let client_config = crate::config::Config::builder() - .endpoint_resolver(expected_url) + .endpoint_url(expected_url) .http_client(#{NeverClient}::new()) .build(); let client = crate::client::Client::from_conf(client_config.clone()); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt index 2abb4229c8c..c14d6b21fbe 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt @@ -45,7 +45,7 @@ class CustomizableOperationGeneratorTest { fn test() { let config = $moduleName::Config::builder() .http_client(#{NeverClient}::new()) - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .build(); let client = $moduleName::Client::from_conf(config); check_send_and_sync(client.say_hello().customize()); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index 048aa961a3c..1b9d76eb961 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -77,7 +77,7 @@ class FluentClientGeneratorTest { ##[test] fn test() { let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(#{NeverClient}::new()) .build(); let client = $moduleName::Client::from_conf(config); @@ -101,7 +101,7 @@ class FluentClientGeneratorTest { ##[test] fn test() { let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") + .endpoint_url("http://localhost:1234") .http_client(#{NeverClient}::new()) .build(); let client = $moduleName::Client::from_conf(config); diff --git a/rust-runtime/aws-smithy-http/src/endpoint.rs b/rust-runtime/aws-smithy-http/src/endpoint.rs index 78ea5b2a349..ce7c79900f3 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint.rs @@ -5,94 +5,22 @@ //! Code for resolving an endpoint (URI) that a request should be sent to -use crate::endpoint::error::InvalidEndpointError; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use http::uri::{Authority, Uri}; use std::borrow::Cow; -use std::fmt::{Debug, Formatter}; +use std::fmt::Debug; use std::result::Result as StdResult; use std::str::FromStr; -use std::sync::Arc; -pub mod error; +use http::uri::{Authority, Uri}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; pub use error::ResolveEndpointError; -/// An endpoint-resolution-specific Result. Contains either an [`Endpoint`](aws_smithy_types::endpoint::Endpoint) or a [`ResolveEndpointError`]. -pub type Result = std::result::Result; - -/// Implementors of this trait can resolve an endpoint that will be applied to a request. -pub trait ResolveEndpoint: Send + Sync { - /// Given some endpoint parameters, resolve an endpoint or return an error when resolution is - /// impossible. - fn resolve_endpoint(&self, params: &Params) -> Result; -} - -impl ResolveEndpoint for &'static str { - fn resolve_endpoint(&self, _params: &T) -> Result { - Ok(aws_smithy_types::endpoint::Endpoint::builder() - .url(*self) - .build()) - } -} - -/// Endpoint Resolver wrapper that may be shared -#[derive(Clone)] -pub struct SharedEndpointResolver(Arc>); - -impl Debug for SharedEndpointResolver { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("SharedEndpointResolver").finish() - } -} - -impl SharedEndpointResolver { - /// Create a new `SharedEndpointResolver` from `ResolveEndpoint` - pub fn new(resolve_endpoint: impl ResolveEndpoint + 'static) -> Self { - Self(Arc::new(resolve_endpoint)) - } -} - -impl AsRef> for SharedEndpointResolver { - fn as_ref(&self) -> &(dyn ResolveEndpoint + 'static) { - self.0.as_ref() - } -} - -impl From>> for SharedEndpointResolver { - fn from(resolve_endpoint: Arc>) -> Self { - SharedEndpointResolver(resolve_endpoint) - } -} - -impl ResolveEndpoint for SharedEndpointResolver { - fn resolve_endpoint(&self, params: &T) -> Result { - self.0.resolve_endpoint(params) - } -} - -/// API Endpoint -/// -/// This implements an API endpoint as specified in the -/// [Smithy Endpoint Specification](https://awslabs.github.io/smithy/1.0/spec/core/endpoint-traits.html) -#[derive(Clone, Debug)] -#[deprecated(note = "Use `.endpoint_url(...)` directly instead")] -pub struct Endpoint { - uri: http::Uri, +use crate::endpoint::error::InvalidEndpointError; - /// If true, endpointPrefix does ignored when setting the endpoint on a request - immutable: bool, -} +pub mod error; -#[allow(deprecated)] -/// This allows customers that use `Endpoint` to override the endpoint to continue to do so -impl ResolveEndpoint for Endpoint { - fn resolve_endpoint(&self, _params: &T) -> Result { - Ok(aws_smithy_types::endpoint::Endpoint::builder() - .url(self.uri.to_string()) - .build()) - } -} +/// An endpoint-resolution-specific Result. Contains either an [`Endpoint`](aws_smithy_types::endpoint::Endpoint) or a [`ResolveEndpointError`]. +pub type Result = std::result::Result; /// A special type that adds support for services that have special URL-prefixing rules. #[derive(Clone, Debug, Eq, PartialEq)] @@ -156,95 +84,6 @@ pub fn apply_endpoint( Ok(()) } -#[allow(deprecated)] -impl Endpoint { - /// Create a new endpoint from a URI - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. If your endpoint does not support this, - /// (for example, when communicating with localhost), use [`Endpoint::immutable`]. - pub fn mutable_uri(uri: Uri) -> StdResult { - Ok(Endpoint { - uri: Self::validate_endpoint(uri)?, - immutable: false, - }) - } - - /// Create a new endpoint from a URI string - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. If your endpoint does not support this, - /// (for example, when communicating with localhost), use [`Endpoint::immutable`]. - pub fn mutable(uri: impl AsRef) -> StdResult { - Self::mutable_uri( - Uri::try_from(uri.as_ref()).map_err(InvalidEndpointError::failed_to_construct_uri)?, - ) - } - - /// Returns the URI of this endpoint - pub fn uri(&self) -> &Uri { - &self.uri - } - - /// Create a new immutable endpoint from a URI - /// - /// ```rust - /// # use aws_smithy_http::endpoint::Endpoint; - /// use http::Uri; - /// let uri = Uri::from_static("http://localhost:8000"); - /// let endpoint = Endpoint::immutable_uri(uri); - /// ``` - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. This constructor creates an endpoint which will - /// ignore those mutations. If you want an endpoint which will obey mutation requests, use - /// [`Endpoint::mutable`] instead. - pub fn immutable_uri(uri: Uri) -> StdResult { - Ok(Endpoint { - uri: Self::validate_endpoint(uri)?, - immutable: true, - }) - } - - /// Create a new immutable endpoint from a URI string - /// - /// ```rust - /// # use aws_smithy_http::endpoint::Endpoint; - /// let endpoint = Endpoint::immutable("http://localhost:8000"); - /// ``` - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. This constructor creates an endpoint which will - /// ignore those mutations. If you want an endpoint which will obey mutation requests, use - /// [`Endpoint::mutable`] instead. - pub fn immutable(uri: impl AsRef) -> StdResult { - Self::immutable_uri( - Uri::try_from(uri.as_ref()).map_err(InvalidEndpointError::failed_to_construct_uri)?, - ) - } - - /// Sets the endpoint on `uri`, potentially applying the specified `prefix` in the process. - pub fn set_endpoint( - &self, - uri: &mut http::Uri, - prefix: Option<&EndpointPrefix>, - ) -> StdResult<(), InvalidEndpointError> { - let prefix = match self.immutable { - true => None, - false => prefix, - }; - apply_endpoint(uri, &self.uri, prefix) - } - - fn validate_endpoint(endpoint: Uri) -> StdResult { - if endpoint.scheme().is_none() { - Err(InvalidEndpointError::endpoint_must_have_scheme()) - } else { - Ok(endpoint) - } - } -} - fn merge_paths<'a>(endpoint: &'a Uri, uri: &'a Uri) -> Cow<'a, str> { if let Some(query) = endpoint.path_and_query().and_then(|pq| pq.query()) { tracing::warn!(query = %query, "query specified in endpoint will be ignored during endpoint resolution"); @@ -261,103 +100,3 @@ fn merge_paths<'a>(endpoint: &'a Uri, uri: &'a Uri) -> Cow<'a, str> { Cow::Owned(format!("{}/{}", ep_no_slash, uri_path_no_slash)) } } - -#[cfg(test)] -#[allow(deprecated)] -mod test { - use crate::endpoint::error::{InvalidEndpointError, InvalidEndpointErrorKind}; - use crate::endpoint::{Endpoint, EndpointPrefix}; - use http::Uri; - - #[test] - fn prefix_endpoint() { - let ep = Endpoint::mutable("https://us-east-1.dynamo.amazonaws.com").unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static("https://subregion.us-east-1.dynamo.amazonaws.com/list_tables?k=v") - ); - } - - #[test] - fn prefix_endpoint_custom_port() { - let ep = Endpoint::mutable("https://us-east-1.dynamo.amazonaws.com:6443").unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static( - "https://subregion.us-east-1.dynamo.amazonaws.com:6443/list_tables?k=v" - ) - ); - } - - #[test] - fn prefix_immutable_endpoint() { - let ep = Endpoint::immutable("https://us-east-1.dynamo.amazonaws.com").unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static("https://us-east-1.dynamo.amazonaws.com/list_tables?k=v") - ); - } - - #[test] - fn endpoint_with_path() { - for uri in &[ - // check that trailing slashes are properly normalized - "https://us-east-1.dynamo.amazonaws.com/private", - "https://us-east-1.dynamo.amazonaws.com/private/", - ] { - let ep = Endpoint::immutable(uri).unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static("https://us-east-1.dynamo.amazonaws.com/private/list_tables?k=v") - ); - } - } - - #[test] - fn set_endpoint_empty_path() { - let ep = Endpoint::immutable("http://localhost:8000").unwrap(); - let mut uri = Uri::from_static("/"); - ep.set_endpoint(&mut uri, None).unwrap(); - assert_eq!(uri, Uri::from_static("http://localhost:8000/")) - } - - #[test] - fn endpoint_construction_missing_scheme() { - assert!(matches!( - Endpoint::mutable("localhost:8000"), - Err(InvalidEndpointError { - kind: InvalidEndpointErrorKind::EndpointMustHaveScheme - }) - )); - assert!(matches!( - Endpoint::immutable("localhost:8000"), - Err(InvalidEndpointError { - kind: InvalidEndpointErrorKind::EndpointMustHaveScheme - }) - )); - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 30bbe3e9e38..11f7d873dff 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -5,7 +5,6 @@ use aws_smithy_http::endpoint::error::ResolveEndpointError; use aws_smithy_http::endpoint::EndpointPrefix; -use aws_smithy_http::endpoint::SharedEndpointResolver; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::endpoint::{ EndpointFuture, EndpointResolverParams, ResolveEndpoint, @@ -13,7 +12,7 @@ use aws_smithy_runtime_api::client::endpoint::{ use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::endpoint::Endpoint; use http::header::HeaderName; use http::uri::PathAndQuery; @@ -70,50 +69,6 @@ impl From for EndpointResolverParams { } } -/// Default implementation of [`ResolveEndpoint`]. -/// -/// This default endpoint resolver implements the `ResolveEndpoint` trait by -/// converting the type-erased [`EndpointResolverParams`] into the concrete -/// endpoint params for the service. It then delegates endpoint resolution -/// to an underlying resolver that is aware of the concrete type. -#[derive(Clone, Debug)] -pub struct DefaultEndpointResolver { - inner: SharedEndpointResolver, -} - -impl Storable for DefaultEndpointResolver -where - Params: Debug + Send + Sync + 'static, -{ - type Storer = StoreReplace; -} - -impl DefaultEndpointResolver { - /// Creates a new `DefaultEndpointResolver`. - pub fn new(resolve_endpoint: SharedEndpointResolver) -> Self { - Self { - inner: resolve_endpoint, - } - } -} - -impl ResolveEndpoint for DefaultEndpointResolver -where - Params: Debug + Send + Sync + 'static, -{ - fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> { - use aws_smithy_http::endpoint::ResolveEndpoint as _; - let ep = match params.get::() { - Some(params) => self.inner.resolve_endpoint(params).map_err(Box::new), - None => Err(Box::new(ResolveEndpointError::message( - "params of expected type was not present", - ))), - } - .map_err(|e| e as _); - EndpointFuture::ready(ep) - } -} - pub(super) async fn orchestrate_endpoint( ctx: &mut InterceptorContext, runtime_components: &RuntimeComponents, From 307f0ed11267c02854a69a58ce7cc19751c6131f Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 19 Oct 2023 10:15:25 -0400 Subject: [PATCH 185/331] Upgrade Smithy to 1.40 and ignore __type in unions (#3081) ## Motivation and Context > JSON object. A union is serialized identically as a ``structure`` shape, but only a single member can be set to a non-null value. Deserializers MUST ignore an unrecognized ``__type`` member if present. [source](https://github.com/smithy-lang/smithy/blob/main/docs/source-2.0/aws/protocols/aws-json.rst.template#L133-L135) ## Description - upgrade to smithy 1.40 - unignore protocol tests - fix JSON deserializers ## Testing - protocol tests + extra unit tests ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- codegen-client-test/model/rest-xml-extras.smithy | 3 --- .../generators/protocol/ProtocolTestGenerator.kt | 3 --- .../smithy/protocols/parse/JsonParserGenerator.kt | 7 ++++++- .../smithy/protocols/parse/JsonParserGeneratorTest.kt | 11 +++++++++++ gradle.properties | 2 +- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/codegen-client-test/model/rest-xml-extras.smithy b/codegen-client-test/model/rest-xml-extras.smithy index 76a6bbd9fa8..b518ad09c69 100644 --- a/codegen-client-test/model/rest-xml-extras.smithy +++ b/codegen-client-test/model/rest-xml-extras.smithy @@ -74,9 +74,6 @@ structure PrimitiveIntDocument { defaultedValue: PrimitiveInt } -@enum([{"value": "enumvalue", "name": "V"}]) -string StringEnum - integer PrimitiveInt structure AttributePartyInputOutput { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 9b256bbfce2..a188d3c9484 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -543,9 +543,6 @@ class DefaultProtocolTestGenerator( "SDKAppliedContentEncoding_ec2Query", "SDKAppliedContentEncoding_restJson1", "SDKAppliedContentEncoding_restXml", - "AwsJson11DeserializeIgnoreType", - "AwsJson10DeserializeIgnoreType", - "RestJsonDeserializeIgnoreType", ) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt index 0e3f531971f..6b0a7b507bd 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt @@ -551,13 +551,18 @@ class JsonParserGenerator( objectKeyLoop(hasMembers = shape.members().isNotEmpty()) { rustTemplate( """ + let key = key.to_unescaped()?; + if key == "__type" { + #{skip_value}(tokens)?; + continue + } if variant.is_some() { return Err(#{Error}::custom("encountered mixed variants in union")); } """, *codegenScope, ) - withBlock("variant = match key.to_unescaped()?.as_ref() {", "};") { + withBlock("variant = match key.as_ref() {", "};") { for (member in shape.members()) { val variantName = symbolProvider.toMemberName(member) rustBlock("${jsonName(member).dq()} =>") { diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt index 108207473ff..e5ca4d19aee 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt @@ -170,6 +170,17 @@ class JsonParserGeneratorTest { """, ) + unitTest( + "dunder_type_should_be_ignored", + """ + // __type field should be ignored during deserialization + let input = br#"{ "top": { "choice": { "int": 5, "__type": "value-should-be-ignored-anyway" } } }"#; + let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build(); + use test_model::Choice; + assert_eq!(Choice::Int(5), output.top.unwrap().choice); + """, + ) + unitTest( "empty_error", """ diff --git a/gradle.properties b/gradle.properties index 1db16fc661d..33e82bc2ca1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ kotlin.code.style=official # codegen smithyGradlePluginVersion=0.7.0 -smithyVersion=1.39.0 +smithyVersion=1.40.0 # kotlin kotlinVersion=1.7.21 From e447a22794d904d3b76567219c55e8a250f82a82 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 19 Oct 2023 13:38:25 -0500 Subject: [PATCH 186/331] Re-point those using `BuildError` from smithy-http to smithy-types (#3070) ## Motivation and Context Completes #3054 (a follow-up on #3032) ## Description #3032 moved `BuildError` from `aws_smithy_http::operation::error` to `aws_smithy_types::error::operation`. That PR also left "breadcrumbs", so that customers could still consume `BuldError` from `aws_smithy_http` after the move. This PR turns breadcrumbs into deprecation messages (via `#[deprecated(...)]`) and updates existing places that used to use moved types from `aws_smithy_http` to `aws_smithy_types`. ## Testing Relied on tests in CI. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 8 ++++++++ aws/rust-runtime/aws-inlineable/Cargo.toml | 4 ++-- .../aws-inlineable/src/http_request_checksum.rs | 2 +- .../s3/tests/required-query-params.rs | 2 +- .../core/smithy/generators/BuilderGenerator.kt | 4 ++-- .../src/protocol/aws_json/rejection.rs | 2 +- .../src/protocol/rest_json_1/rejection.rs | 4 ++-- .../src/protocol/rest_xml/rejection.rs | 4 ++-- rust-runtime/aws-smithy-http/src/operation.rs | 12 +++++++++--- 9 files changed, 28 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c17e89a4cf9..b91b0009aa7 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -426,3 +426,11 @@ message = "**This change has [detailed upgrade guidance](https://github.com/awsl references = ["smithy-rs#3043", "smithy-rs#3078"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "rcoh" + +[[smithy-rs]] +message = """ +`aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +""" +references = ["smithy-rs#3054", "smithy-rs#3070"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 56ccc8068e2..2e902d27760 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -16,12 +16,12 @@ aws-credential-types = { path = "../aws-credential-types" } aws-http = { path = "../aws-http" } aws-runtime = { path = "../aws-runtime" } aws-sigv4 = { path = "../aws-sigv4" } +aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } aws-smithy-checksums = { path = "../../../rust-runtime/aws-smithy-checksums" } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } bytes = "1" hex = "0.4.3" http = "0.2.9" diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index 3dc9cd449dd..b3a6f059b2d 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -13,7 +13,6 @@ use aws_sigv4::http_request::SignableBody; use aws_smithy_checksums::ChecksumAlgorithm; use aws_smithy_checksums::{body::calculate, http::HttpChecksum}; use aws_smithy_http::body::{BoxBody, SdkBody}; -use aws_smithy_http::operation::error::BuildError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Input, @@ -23,6 +22,7 @@ use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; +use aws_smithy_types::error::operation::BuildError; use http::HeaderValue; use http_body::Body; use std::{fmt, mem}; diff --git a/aws/sdk/integration-tests/s3/tests/required-query-params.rs b/aws/sdk/integration-tests/s3/tests/required-query-params.rs index 1df7f44e4e5..d9604260ea2 100644 --- a/aws/sdk/integration-tests/s3/tests/required-query-params.rs +++ b/aws/sdk/integration-tests/s3/tests/required-query-params.rs @@ -6,8 +6,8 @@ use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::error::DisplayErrorContext; use aws_sdk_s3::Client; -use aws_smithy_http::operation::error::BuildError; use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_types::error::operation::BuildError; #[tokio::test] async fn test_error_when_required_query_param_is_unset() { diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index 80b9329d636..9369423757b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -75,8 +75,8 @@ sealed class BuilderSection(name: String) : Section(name) { /** Customizations for BuilderGenerator */ abstract class BuilderCustomization : NamedCustomization() -fun RuntimeConfig.operationBuildError() = RuntimeType.operationModule(this).resolve("error::BuildError") -fun RuntimeConfig.serializationError() = RuntimeType.operationModule(this).resolve("error::SerializationError") +fun RuntimeConfig.operationBuildError() = RuntimeType.smithyTypes(this).resolve("error::operation::BuildError") +fun RuntimeConfig.serializationError() = RuntimeType.smithyTypes(this).resolve("error::operation::SerializationError") fun MemberShape.enforceRequired( field: Writable, diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs index 491e865dd6a..514b06da63b 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs @@ -9,7 +9,7 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum ResponseRejection { #[error("error serializing JSON-encoded body: {0}")] - Serialization(#[from] aws_smithy_http::operation::error::SerializationError), + Serialization(#[from] aws_smithy_types::error::operation::SerializationError), #[error("error building HTTP response: {0}")] HttpBuild(#[from] http::Error), } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs index 8577d4a5571..963b56c4c1a 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs @@ -67,7 +67,7 @@ pub enum ResponseRejection { /// `httpHeader` or `httpPrefixHeaders`. /// Used when failing to serialize an `httpPayload`-bound struct into an HTTP response body. #[error("error building HTTP response: {0}")] - Build(#[from] aws_smithy_http::operation::error::BuildError), + Build(#[from] aws_smithy_types::error::operation::BuildError), /// Used when failing to serialize a struct into a `String` for the JSON-encoded HTTP response /// body. @@ -76,7 +76,7 @@ pub enum ResponseRejection { /// supplied timestamp is outside of the valid range when formatting using RFC-3339, i.e. a /// date outside the `0001-01-01T00:00:00.000Z`-`9999-12-31T23:59:59.999Z` range is supplied. #[error("error serializing JSON-encoded body: {0}")] - Serialization(#[from] aws_smithy_http::operation::error::SerializationError), + Serialization(#[from] aws_smithy_types::error::operation::SerializationError), /// Used when consuming an [`http::response::Builder`] into the constructed [`http::Response`] /// when calling [`http::response::Builder::body`]. diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs index 3e1bed00ca3..6c44adaa283 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs @@ -16,9 +16,9 @@ pub enum ResponseRejection { #[error("invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}")] InvalidHttpStatusCode(TryFromIntError), #[error("error building HTTP response: {0}")] - Build(#[from] aws_smithy_http::operation::error::BuildError), + Build(#[from] aws_smithy_types::error::operation::BuildError), #[error("error serializing XML-encoded body: {0}")] - Serialization(#[from] aws_smithy_http::operation::error::SerializationError), + Serialization(#[from] aws_smithy_types::error::operation::SerializationError), #[error("error building HTTP response: {0}")] HttpBuild(#[from] http::Error), } diff --git a/rust-runtime/aws-smithy-http/src/operation.rs b/rust-runtime/aws-smithy-http/src/operation.rs index 0fed557b79b..7fad89f1e14 100644 --- a/rust-runtime/aws-smithy-http/src/operation.rs +++ b/rust-runtime/aws-smithy-http/src/operation.rs @@ -9,11 +9,17 @@ use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::borrow::Cow; -//TODO(runtimeCratesVersioningCleanup): Re-point those who use the following reexport to -// directly depend on `aws_smithy_types` and remove the reexport below. +//TODO(runtimeCratesVersioningCleanup): Re-point those who use the deprecated type aliases to +// directly depend on `aws_smithy_types` and remove the type aliases below. /// Errors for operations pub mod error { - pub use aws_smithy_types::error::operation::{BuildError, SerializationError}; + /// An error occurred attempting to build an `Operation` from an input. + #[deprecated(note = "Moved to `aws_smithy_types::error::operation::BuildError`.")] + pub type BuildError = aws_smithy_types::error::operation::BuildError; + + /// An error that occurs when serialization of an operation fails. + #[deprecated(note = "Moved to `aws_smithy_types::error::operation::SerializationError`.")] + pub type SerializationError = aws_smithy_types::error::operation::SerializationError; } /// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called. From ed8763e5df356d20b8b8df116c5e4a033f9b1b22 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 19 Oct 2023 15:15:32 -0500 Subject: [PATCH 187/331] Re-point those using `ByteStream` and `SdkBody` to smithy-types (#3076) # Motivation and Context A follow-up on #3026 ## Description #3026 moved - `aws_smithy_http::body::{BoxBody, Error, SdkBody}` to `aws_smithy_types::body::{BoxBody, Error, SdkBody}` - `aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error}` to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error}` and also left "breadcrumbs", so that customers could still consume updated types from `aws_smithy_http` after the move. This PR turns breadcrumbs into deprecation messages (via `#[deprecated(...)]`) and updates existing places that used to use moved types from `aws_smithy_http` to directly depend on `aws_smithy_types`. ## Testing Relied on tests in CI. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 16 ++++++++ aws/rust-runtime/aws-config/src/ecs.rs | 2 +- .../src/http_credential_provider.rs | 4 +- .../aws-config/src/imds/client.rs | 4 +- .../aws-config/src/imds/client/error.rs | 2 +- .../aws-config/src/imds/client/token.rs | 2 +- .../aws-config/src/imds/credentials.rs | 2 +- .../aws-config/src/imds/region.rs | 2 +- aws/rust-runtime/aws-config/src/sso/token.rs | 2 +- .../aws-config/src/sts/assume_role.rs | 2 +- .../aws-http/src/content_encoding.rs | 8 ++-- aws/rust-runtime/aws-http/src/request_id.rs | 2 +- .../src/glacier_interceptors.rs | 3 +- .../src/http_request_checksum.rs | 7 ++-- .../src/http_response_checksum.rs | 6 +-- .../aws-inlineable/src/s3_request_id.rs | 2 +- .../aws-runtime/src/recursion_detection.rs | 2 +- .../aws-runtime/src/retries/classifiers.rs | 2 +- .../benchmark/src/multipart_get.rs | 2 +- .../benchmark/src/multipart_put.rs | 2 +- .../dynamodb/benches/deserialization_bench.rs | 2 +- .../dynamodb/tests/movies.rs | 2 +- .../dynamodb/tests/paginators.rs | 2 +- .../retries-with-client-rate-limiting.rs | 2 +- aws/sdk/integration-tests/ec2/Cargo.toml | 2 +- .../integration-tests/ec2/tests/paginators.rs | 2 +- .../kms/tests/integration.rs | 2 +- .../qldbsession/tests/integration.rs | 2 +- .../integration-tests/s3/tests/checksums.rs | 4 +- .../s3/tests/ignore-invalid-xml-body-root.rs | 2 +- .../integration-tests/s3/tests/request_id.rs | 2 +- .../tests/retry-classifier-customization.rs | 2 +- .../integration-tests/s3/tests/signing-it.rs | 2 +- .../s3/tests/status-200-errors.rs | 2 +- .../integration-tests/s3control/Cargo.toml | 2 +- .../s3control/tests/signing-it.rs | 2 +- .../integration-tests/webassembly/src/http.rs | 2 +- .../StreamingShapeSymbolProviderTest.kt | 4 +- .../generators/EndpointTraitBindingsTest.kt | 2 +- .../protocols/AwsQueryCompatibleTest.kt | 4 +- .../rust/codegen/core/rustlang/Writable.kt | 4 +- .../rust/codegen/core/smithy/RuntimeType.kt | 4 +- .../customizations/SmithyTypesPubUseExtra.kt | 8 ++-- .../SmithyTypesPubUseExtraTest.kt | 2 +- .../ServerHttpBoundProtocolGenerator.kt | 6 +-- .../smithy/protocols/ServerProtocolLoader.kt | 2 +- examples/pokemon-service-common/Cargo.toml | 2 +- examples/pokemon-service-common/src/lib.rs | 2 +- .../src/body/calculate.rs | 6 +-- .../aws-smithy-checksums/src/body/validate.rs | 8 ++-- .../src/pytests/bytestream.rs | 2 +- .../src/types.rs | 38 +++++++++---------- rust-runtime/aws-smithy-http/src/body.rs | 21 ++++++++++ .../aws-smithy-http/src/byte_stream.rs | 24 ++++++++++++ .../src/event_stream/receiver.rs | 4 +- .../src/futures_stream_adapter.rs | 6 +-- rust-runtime/aws-smithy-http/src/lib.rs | 7 +--- rust-runtime/aws-smithy-http/src/result.rs | 2 +- .../src/client/http/request.rs | 4 +- .../src/client/interceptors/context.rs | 2 +- .../src/client/orchestrator.rs | 2 +- .../src/client/runtime_plugin.rs | 2 +- .../src/client/auth/http.rs | 2 +- .../src/client/http/hyper_014.rs | 2 +- .../client/http/test_util/capture_request.rs | 2 +- .../src/client/http/test_util/dvr.rs | 4 +- .../src/client/http/test_util/dvr/record.rs | 2 +- .../src/client/http/test_util/dvr/replay.rs | 2 +- .../src/client/http/test_util/infallible.rs | 2 +- .../src/client/http/test_util/replay.rs | 2 +- .../src/client/interceptors.rs | 2 +- .../src/client/orchestrator.rs | 4 +- .../src/client/orchestrator/http.rs | 2 +- .../src/client/orchestrator/operation.rs | 2 +- .../src/client/retries/classifiers.rs | 2 +- .../tests/reconnect_on_transient_error.rs | 2 +- 76 files changed, 183 insertions(+), 127 deletions(-) create mode 100644 rust-runtime/aws-smithy-http/src/body.rs create mode 100644 rust-runtime/aws-smithy-http/src/byte_stream.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b91b0009aa7..cfeb53879e5 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -434,3 +434,19 @@ message = """ references = ["smithy-rs#3054", "smithy-rs#3070"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "ysaito1001" + +[[smithy-rs]] +message = """ +`aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +""" +references = ["smithy-rs#3076"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "ysaito1001" + +[[smithy-rs]] +message = """ +`aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +""" +references = ["smithy-rs#3076"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-config/src/ecs.rs b/aws/rust-runtime/aws-config/src/ecs.rs index e8c709bf6d4..ed0125b69a2 100644 --- a/aws/rust-runtime/aws-config/src/ecs.rs +++ b/aws/rust-runtime/aws-config/src/ecs.rs @@ -442,11 +442,11 @@ mod test { use aws_credential_types::Credentials; use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_runtime_api::client::dns::DnsFuture; use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::shared::IntoShared; + use aws_smithy_types::body::SdkBody; use aws_types::os_shim_internal::Env; use futures_util::FutureExt; use http::header::AUTHORIZATION; diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index e6dc79bd247..87687590cdd 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -12,7 +12,6 @@ use crate::json_credentials::{parse_json_credentials, JsonCredentials, Refreshab use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError}; use aws_credential_types::Credentials; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::classifiers::{ @@ -26,6 +25,7 @@ use aws_smithy_runtime_api::client::orchestrator::{ use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; @@ -220,8 +220,8 @@ impl ClassifyRetry for HttpCredentialRetryClassifier { mod test { use super::*; use aws_credential_types::provider::error::CredentialsError; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_types::body::SdkBody; use http::{Request, Response, Uri}; use std::time::SystemTime; diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 823aa7c6369..e956193e384 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -13,7 +13,6 @@ use crate::provider_config::ProviderConfig; use crate::PKG_VERSION; use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_runtime::user_agent::UserAgentInterceptor; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; @@ -31,6 +30,7 @@ use aws_smithy_runtime_api::client::retries::classifiers::{ }; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{FrozenLayer, Layer}; use aws_smithy_types::endpoint::Endpoint; use aws_smithy_types::retry::RetryConfig; @@ -583,7 +583,6 @@ pub(crate) mod test { use crate::provider_config::ProviderConfig; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep}; - use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, @@ -596,6 +595,7 @@ pub(crate) mod test { HttpRequest, HttpResponse, OrchestratorError, }; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; use http::header::USER_AGENT; diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index a97c3961c72..4b5aacb8946 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -5,10 +5,10 @@ //! Error types for [`ImdsClient`](crate::imds::client::Client) -use aws_smithy_http::body::SdkBody; use aws_smithy_http::endpoint::error::InvalidEndpointError; use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_types::body::SdkBody; use std::error::Error; use std::fmt; diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index 76b286583d1..57c0aeddd14 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -17,7 +17,6 @@ use crate::imds::client::error::{ImdsError, TokenError, TokenErrorKind}; use aws_credential_types::cache::ExpiringCache; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; @@ -32,6 +31,7 @@ use aws_smithy_runtime_api::client::runtime_components::{ GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, }; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use http::{HeaderValue, Uri}; use std::borrow::Cow; diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index 52cf0bb6afb..845a53b8777 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -289,8 +289,8 @@ mod test { use crate::provider_config::ProviderConfig; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_types::body::SdkBody; use std::time::{Duration, UNIX_EPOCH}; use tracing_test::traced_test; diff --git a/aws/rust-runtime/aws-config/src/imds/region.rs b/aws/rust-runtime/aws-config/src/imds/region.rs index bc19642a642..213e4a5c36b 100644 --- a/aws/rust-runtime/aws-config/src/imds/region.rs +++ b/aws/rust-runtime/aws-config/src/imds/region.rs @@ -111,8 +111,8 @@ mod test { use crate::imds::region::ImdsRegionProvider; use crate::provider_config::ProviderConfig; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_types::body::SdkBody; use aws_types::region::Region; use tracing_test::traced_test; diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs index b543fdc26f9..11870a241fa 100644 --- a/aws/rust-runtime/aws-config/src/sso/token.rs +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -389,13 +389,13 @@ mod tests { use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::{StaticTimeSource, TimeSource}; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, }; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::body::SdkBody; use aws_smithy_types::date_time::Format; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::DateTime; diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 84c60c9a963..112358ec907 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -349,11 +349,11 @@ mod test { use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::StaticTimeSource; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, }; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_types::body::SdkBody; use aws_types::os_shim_internal::Env; use aws_types::region::Region; use aws_types::SdkConfig; diff --git a/aws/rust-runtime/aws-http/src/content_encoding.rs b/aws/rust-runtime/aws-http/src/content_encoding.rs index 6b900ab7506..dc9c62a1c7a 100644 --- a/aws/rust-runtime/aws-http/src/content_encoding.rs +++ b/aws/rust-runtime/aws-http/src/content_encoding.rs @@ -199,10 +199,10 @@ fn total_rendered_length_of_trailers(trailer_map: Option<&HeaderMap>) -> u64 { impl Body for AwsChunkedBody where - Inner: Body, + Inner: Body, { type Data = Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, @@ -354,7 +354,7 @@ mod tests { AwsChunkedBodyOptions, CHUNK_TERMINATOR, CRLF, }; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use bytes::{Buf, Bytes}; use bytes_utils::SegmentedBuf; use http::{HeaderMap, HeaderValue}; @@ -382,7 +382,7 @@ mod tests { impl Body for SputteringBody { type Data = Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, diff --git a/aws/rust-runtime/aws-http/src/request_id.rs b/aws/rust-runtime/aws-http/src/request_id.rs index 692e9cc86f5..a7b429169fb 100644 --- a/aws/rust-runtime/aws-http/src/request_id.rs +++ b/aws/rust-runtime/aws-http/src/request_id.rs @@ -94,7 +94,7 @@ fn extract_request_id(headers: &HeaderMap) -> Option<&str> { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use http::Response; #[test] diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 7cb27aaa1b6..845b2ef21fe 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -15,15 +15,14 @@ use ring::digest::{Context, Digest, SHA256}; use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; -use aws_smithy_http::byte_stream; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::Intercept; - use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, LoadedRequestBody}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::byte_stream; use aws_smithy_types::config_bag::ConfigBag; /// The default account ID when none is set on an input diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index b3a6f059b2d..846fbb52741 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -12,15 +12,14 @@ use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; use aws_smithy_checksums::ChecksumAlgorithm; use aws_smithy_checksums::{body::calculate, http::HttpChecksum}; -use aws_smithy_http::body::{BoxBody, SdkBody}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Input, }; use aws_smithy_runtime_api::client::interceptors::Intercept; - use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::body::{BoxBody, SdkBody}; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use aws_smithy_types::error::operation::BuildError; use http::HeaderValue; @@ -214,10 +213,10 @@ fn wrap_streaming_request_body_in_checksum_calculating_body( mod tests { use crate::http_request_checksum::wrap_streaming_request_body_in_checksum_calculating_body; use aws_smithy_checksums::ChecksumAlgorithm; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_types::base64; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::ByteStream; use bytes::BytesMut; use http_body::Body; use tempfile::NamedTempFile; diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index e9663b1deca..d770b44bf33 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -8,13 +8,13 @@ //! Interceptor for handling Smithy `@httpChecksum` response checksumming use aws_smithy_checksums::ChecksumAlgorithm; -use aws_smithy_http::body::{BoxBody, SdkBody}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeDeserializationInterceptorContextMut, BeforeSerializationInterceptorContextRef, Input, }; use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::body::{BoxBody, SdkBody}; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; use std::{fmt, mem}; @@ -219,8 +219,8 @@ fn is_part_level_checksum(checksum: &str) -> bool { #[cfg(test)] mod tests { use super::{is_part_level_checksum, wrap_body_with_checksum_validator}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::ByteStream; use aws_smithy_types::error::display::DisplayErrorContext; use bytes::Bytes; diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 226eed5f7a3..93d2d850fe5 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -94,8 +94,8 @@ fn extract_extended_request_id(headers: &HeaderMap) -> Option<&str> #[cfg(test)] mod test { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::SdkError; + use aws_smithy_types::body::SdkBody; use http::Response; #[test] diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index b37ad2f5d12..21239e9c3ba 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -78,10 +78,10 @@ fn encode_header(value: &[u8]) -> HeaderValue { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_headers}; use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::body::SdkBody; use aws_types::os_shim_internal::Env; use http::HeaderValue; use proptest::{prelude::*, proptest}; diff --git a/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs index 7dcb4f9a86a..11c4346bbad 100644 --- a/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs +++ b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs @@ -111,11 +111,11 @@ where #[cfg(test)] mod test { use crate::retries::classifiers::AwsErrorCodeClassifier; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input}; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::ErrorKind; diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs index ab8832816cd..10e209776e0 100644 --- a/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs @@ -8,7 +8,7 @@ use async_trait::async_trait; use aws_config::SdkConfig; use aws_sdk_s3 as s3; use aws_sdk_s3::Client; -use aws_smithy_http::byte_stream::AggregatedBytes; +use aws_smithy_types::byte_stream::AggregatedBytes; use std::fmt; use std::fs::File; use std::os::unix::fs::FileExt; diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs index 942c3d80208..d5bc8c8a974 100644 --- a/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs @@ -9,7 +9,7 @@ use async_trait::async_trait; use aws_config::SdkConfig; use aws_sdk_s3 as s3; use aws_sdk_s3::Client; -use aws_smithy_http::byte_stream::ByteStream; +use aws_smithy_types::byte_stream::ByteStream; use s3::types::CompletedMultipartUpload; use s3::types::CompletedPart; use std::io::SeekFrom; diff --git a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs index 58d3db07020..cf4b58e646c 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs @@ -4,9 +4,9 @@ */ use aws_sdk_dynamodb::operation::query::QueryOutput; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedResponseDeserializer}; +use aws_smithy_types::body::SdkBody; use criterion::{criterion_group, criterion_main, Criterion}; fn do_bench() { diff --git a/aws/sdk/integration-tests/dynamodb/tests/movies.rs b/aws/sdk/integration-tests/dynamodb/tests/movies.rs index 28801001065..6254dd6ece4 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/movies.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/movies.rs @@ -5,8 +5,8 @@ use aws_sdk_dynamodb as dynamodb; use aws_smithy_async::assert_elapsed; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use dynamodb::config::{Credentials, Region}; use dynamodb::operation::query::QueryOutput; use dynamodb::types::{ diff --git a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs index 711feb1e019..7cb07f07672 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs @@ -9,12 +9,12 @@ use std::iter::FromIterator; use aws_credential_types::Credentials; use aws_sdk_dynamodb::types::AttributeValue; use aws_sdk_dynamodb::{Client, Config}; -use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, }; use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_types::body::SdkBody; use aws_types::region::Region; fn stub_config(http_client: impl HttpClient + 'static) -> Config { diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index 225bbabebdd..bb87a2626ea 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -7,10 +7,10 @@ use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_runtime::client::retries::RetryPartition; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_types::body::SdkBody; use std::time::{Duration, SystemTime}; fn req() -> http::Request { diff --git a/aws/sdk/integration-tests/ec2/Cargo.toml b/aws/sdk/integration-tests/ec2/Cargo.toml index 9e2757bea22..a3a44d610c1 100644 --- a/aws/sdk/integration-tests/ec2/Cargo.toml +++ b/aws/sdk/integration-tests/ec2/Cargo.toml @@ -9,9 +9,9 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } -aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } +aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2" } tokio = { version = "1.23.1", features = ["full"]} http = "0.2.0" diff --git a/aws/sdk/integration-tests/ec2/tests/paginators.rs b/aws/sdk/integration-tests/ec2/tests/paginators.rs index a9ab25a4a1a..0ab3be626cb 100644 --- a/aws/sdk/integration-tests/ec2/tests/paginators.rs +++ b/aws/sdk/integration-tests/ec2/tests/paginators.rs @@ -4,9 +4,9 @@ */ use aws_sdk_ec2::{config::Credentials, config::Region, types::InstanceType, Client, Config}; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_types::body::SdkBody; fn stub_config(http_client: impl HttpClient + 'static) -> Config { Config::builder() diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index 624dfd9d396..1227eb24bc5 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -5,9 +5,9 @@ use aws_sdk_kms as kms; use aws_sdk_kms::operation::RequestId; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use http::header::AUTHORIZATION; use http::Uri; use kms::config::{Config, Credentials, Region}; diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 61f0a7e5395..6cdb32d1f17 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -8,8 +8,8 @@ use aws_sdk_qldbsession::config::{Config, Credentials, Region}; use aws_sdk_qldbsession::types::StartSessionRequest; use aws_sdk_qldbsession::Client; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use http::Uri; #[cfg(feature = "test-util")] diff --git a/aws/sdk/integration-tests/s3/tests/checksums.rs b/aws/sdk/integration-tests/s3/tests/checksums.rs index b7b3d5be8a3..37782182e01 100644 --- a/aws/sdk/integration-tests/s3/tests/checksums.rs +++ b/aws/sdk/integration-tests/s3/tests/checksums.rs @@ -11,10 +11,10 @@ use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::types::ChecksumMode; use aws_sdk_s3::{operation::get_object::GetObjectOutput, types::ChecksumAlgorithm}; use aws_sdk_s3::{Client, Config}; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, }; +use aws_smithy_types::body::SdkBody; use http::header::AUTHORIZATION; use http::{HeaderValue, Uri}; use std::time::{Duration, UNIX_EPOCH}; @@ -315,7 +315,7 @@ async fn test_sha256_checksum_on_streaming_request() { .await } -async fn collect_body_into_string(mut body: aws_smithy_http::body::SdkBody) -> String { +async fn collect_body_into_string(mut body: aws_smithy_types::body::SdkBody) -> String { use bytes::Buf; use bytes_utils::SegmentedBuf; use http_body::Body; diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index 3b8034a6739..89b15ba58c6 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -8,8 +8,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, types::ObjectAttributes, Client}; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use http::header::AUTHORIZATION; const RESPONSE_BODY_XML: &[u8] = b"\ne1AsOh9IyGCa4hLN+2Od7jlnP14="; diff --git a/aws/sdk/integration-tests/s3/tests/request_id.rs b/aws/sdk/integration-tests/s3/tests/request_id.rs index d46bfe66da1..1ea72044263 100644 --- a/aws/sdk/integration-tests/s3/tests/request_id.rs +++ b/aws/sdk/integration-tests/s3/tests/request_id.rs @@ -6,8 +6,8 @@ use aws_sdk_s3::operation::get_object::GetObjectError; use aws_sdk_s3::operation::{RequestId, RequestIdExt}; use aws_sdk_s3::{config::Credentials, config::Region, Client, Config}; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_types::body::SdkBody; #[tokio::test] async fn get_request_id_from_modeled_error() { diff --git a/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs index 15af1103694..cda97da3631 100644 --- a/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs +++ b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs @@ -7,8 +7,8 @@ use aws_sdk_s3::config::interceptors::InterceptorContext; use aws_sdk_s3::config::retry::{ClassifyRetry, RetryAction, RetryConfig}; use aws_sdk_s3::config::SharedAsyncSleep; use aws_smithy_async::rt::sleep::TokioSleep; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use std::sync::{Arc, Mutex}; #[derive(Debug, Clone)] diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index d690e31cf3f..450f4ba43ff 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -8,8 +8,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::{Client, Config}; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; #[tokio::test] async fn test_signer() { diff --git a/aws/sdk/integration-tests/s3/tests/status-200-errors.rs b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs index ad53f1fedbd..20217b2db20 100644 --- a/aws/sdk/integration-tests/s3/tests/status-200-errors.rs +++ b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs @@ -6,8 +6,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_sdk_s3::Client; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_types::region::Region; use aws_types::SdkConfig; diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index cf1fd7f23b4..9bd9484f9b2 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -20,7 +20,7 @@ aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } -aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index 242f2f2d783..7917b836ebb 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -6,8 +6,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3control::config::{Credentials, Region}; use aws_sdk_s3control::{Client, Config}; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; #[tokio::test] async fn test_signer() { diff --git a/aws/sdk/integration-tests/webassembly/src/http.rs b/aws/sdk/integration-tests/webassembly/src/http.rs index b13f4bf2b05..930ebaf5476 100644 --- a/aws/sdk/integration-tests/webassembly/src/http.rs +++ b/aws/sdk/integration-tests/webassembly/src/http.rs @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; pub(crate) fn make_request(_req: http::Request) -> Result, ()> { // Consumers here would pass the HTTP request to diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt index 61d97317f20..9846d9b0c00 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt @@ -43,13 +43,13 @@ internal class StreamingShapeSymbolProviderTest { modelWithOperationTraits.lookup("test.synthetic#GenerateSpeechOutput\$data").also { shape -> symbolProvider.toSymbol(shape).also { symbol -> symbol.name shouldBe "data" - symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_http::byte_stream") + symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_types::byte_stream") } } modelWithOperationTraits.lookup("test.synthetic#GenerateSpeechInput\$data").also { shape -> symbolProvider.toSymbol(shape).also { symbol -> symbol.name shouldBe "data" - symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_http::byte_stream") + symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_types::byte_stream") } } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index be5d38a0164..c645759040f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -159,10 +159,10 @@ internal class EndpointTraitBindingsTest { """ async fn test_endpoint_prefix() { use #{capture_request}; - use aws_smithy_http::body::SdkBody; use aws_smithy_http::endpoint::EndpointPrefix; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::{Arc, Mutex}; diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt index 64c7cae3ba8..706e7b81c01 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt @@ -58,7 +58,7 @@ class AwsQueryCompatibleTest { ##[cfg(test)] ##[#{tokio}::test] async fn should_parse_code_and_type_fields() { - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; let response = |_: http::Request| { http::Response::builder() @@ -138,7 +138,7 @@ class AwsQueryCompatibleTest { ##[cfg(test)] ##[#{tokio}::test] async fn should_parse_code_from_payload() { - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; let response = |_: http::Request| { http::Response::builder() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt index a0c2c2f2452..8ef68e9ef25 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt @@ -95,14 +95,14 @@ fun Array.join(separator: Writable) = asIterable().join(separator) * "type_params" to rustTypeParameters( * symbolProvider.toSymbol(operation), * RustType.Unit, - * runtimeConfig.smithyHttp().resolve("body::SdkBody"), + * runtimeConfig.smithyTypes().resolve("body::SdkBody"), * GenericsGenerator(GenericTypeArg("A"), GenericTypeArg("B")), * ) * ) * ``` * would write out something like: * ```rust - * some_fn::(); + * some_fn::(); * ``` */ fun rustTypeParameters( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index d583a7d163b..7ccf2e9479b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -394,7 +394,7 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextMut") fun blob(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("Blob") - fun byteStream(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("byte_stream::ByteStream") + fun byteStream(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("byte_stream::ByteStream") fun dateTime(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("DateTime") fun document(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("Document") fun format(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("date_time::Format") @@ -429,7 +429,7 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) smithyTypes(runtimeConfig).resolve("retry::ProvideErrorKind") fun queryFormat(runtimeConfig: RuntimeConfig, func: String) = smithyHttp(runtimeConfig).resolve("query::$func") - fun sdkBody(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("body::SdkBody") + fun sdkBody(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("body::SdkBody") fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("result::SdkError") fun sdkSuccess(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("result::SdkSuccess") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt index 14d081b2cb7..d59b4a96231 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt @@ -64,10 +64,10 @@ fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model): Writab pub use #{Error} as ByteStreamError; pub use #{SdkBody}; """, - "ByteStream" to RuntimeType.smithyHttp(rc).resolve("byte_stream::ByteStream"), - "AggregatedBytes" to RuntimeType.smithyHttp(rc).resolve("byte_stream::AggregatedBytes"), - "Error" to RuntimeType.smithyHttp(rc).resolve("byte_stream::error::Error"), - "SdkBody" to RuntimeType.smithyHttp(rc).resolve("body::SdkBody"), + "ByteStream" to RuntimeType.smithyTypes(rc).resolve("byte_stream::ByteStream"), + "AggregatedBytes" to RuntimeType.smithyTypes(rc).resolve("byte_stream::AggregatedBytes"), + "Error" to RuntimeType.smithyTypes(rc).resolve("byte_stream::error::Error"), + "SdkBody" to RuntimeType.smithyTypes(rc).resolve("body::SdkBody"), ) } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt index b02574e6a53..62a54905afe 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt @@ -105,7 +105,7 @@ class SmithyTypesPubUseExtraTest { @Test fun `it re-exports ByteStream and AggregatedBytes when a model has streaming`() { val streamingTypes = - listOf("::aws_smithy_http::byte_stream::ByteStream", "::aws_smithy_http::byte_stream::AggregatedBytes") + listOf("::aws_smithy_types::byte_stream::ByteStream", "::aws_smithy_types::byte_stream::AggregatedBytes") val streamingShape = "@streaming blob Streaming" this.assertDoesntHaveReexports(reexportsWithEmptyModel(), streamingTypes) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt index 11a9a9558ba..f8c18f39655 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt @@ -98,7 +98,7 @@ sealed class ServerHttpBoundProtocolSection(name: String) : Section(name) { * Represent a section for rendering the serialized stream payload. * * If the payload does not implement the `futures_core::stream::Stream`, which is the case for - * `aws_smithy_http::byte_stream::ByteStream`, the section needs to be overridden and renders a new-type wrapper + * `aws_smithy_types::byte_stream::ByteStream`, the section needs to be overridden and renders a new-type wrapper * around the payload to enable the `Stream` trait. */ data class WrapStreamPayload(val params: StreamPayloadSerializerParams) : @@ -189,8 +189,8 @@ class ServerHttpBoundProtocolTraitImplGenerator( "OnceCell" to RuntimeType.OnceCell, "PercentEncoding" to RuntimeType.PercentEncoding, "Regex" to RuntimeType.Regex, - "SmithyHttp" to RuntimeType.smithyHttp(runtimeConfig), "SmithyHttpServer" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(), + "SmithyTypes" to RuntimeType.smithyTypes(runtimeConfig), "RuntimeError" to protocol.runtimeError(runtimeConfig), "RequestRejection" to protocol.requestRejection(runtimeConfig), "ResponseRejection" to protocol.responseRejection(runtimeConfig), @@ -1269,7 +1269,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( private fun streamingBodyTraitBounds(operationShape: OperationShape) = if (operationShape.inputShape(model).hasStreamingMember(model)) { - "\n B: Into<#{SmithyHttp}::byte_stream::ByteStream>," + "\n B: Into<#{SmithyTypes}::byte_stream::ByteStream>," } else { "" } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt index 92dde3b2f6d..a72ad201c0d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt @@ -28,7 +28,7 @@ class StreamPayloadSerializerCustomization() : ServerHttpBoundProtocolCustomizat // implements the `Stream` trait, so no need to wrap it in the new-type. section.params.payloadGenerator.generatePayload(this, section.params.shapeName, section.params.shape) } else { - // Otherwise, the stream payload is `aws_smithy_http::byte_stream::ByteStream`. We wrap it in the + // Otherwise, the stream payload is `aws_smithy_types::byte_stream::ByteStream`. We wrap it in the // new-type to enable the `Stream` trait. withBlockTemplate( "#{FuturesStreamCompatByteStream}::new(", diff --git a/examples/pokemon-service-common/Cargo.toml b/examples/pokemon-service-common/Cargo.toml index 6a63045004f..e23a3c8dbf1 100644 --- a/examples/pokemon-service-common/Cargo.toml +++ b/examples/pokemon-service-common/Cargo.toml @@ -18,8 +18,8 @@ tower = "0.4" # Local paths aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-runtime-api = { path = "../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } -aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http" } aws-smithy-http-server = { path = "../../rust-runtime/aws-smithy-http-server" } +aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types" } pokemon-service-client = { path = "../pokemon-service-client" } pokemon-service-server-sdk = { path = "../pokemon-service-server-sdk" } diff --git a/examples/pokemon-service-common/src/lib.rs b/examples/pokemon-service-common/src/lib.rs index c4c8bc4e752..851a07865ba 100644 --- a/examples/pokemon-service-common/src/lib.rs +++ b/examples/pokemon-service-common/src/lib.rs @@ -15,10 +15,10 @@ use std::{ }; use async_stream::stream; -use aws_smithy_http::{body::SdkBody, byte_stream::ByteStream}; use aws_smithy_http_server::Extension; use aws_smithy_runtime::client::http::hyper_014::HyperConnector; use aws_smithy_runtime_api::client::http::HttpConnector; +use aws_smithy_types::{body::SdkBody, byte_stream::ByteStream}; use http::Uri; use pokemon_service_server_sdk::{ error, input, model, model::CapturingPayload, output, types::Blob, diff --git a/rust-runtime/aws-smithy-checksums/src/body/calculate.rs b/rust-runtime/aws-smithy-checksums/src/body/calculate.rs index 2ac3f09896a..8c9fcb368b0 100644 --- a/rust-runtime/aws-smithy-checksums/src/body/calculate.rs +++ b/rust-runtime/aws-smithy-checksums/src/body/calculate.rs @@ -7,8 +7,8 @@ use crate::http::HttpChecksum; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::header::append_merge_header_maps; +use aws_smithy_types::body::SdkBody; use http::HeaderMap; use http_body::SizeHint; @@ -38,7 +38,7 @@ impl ChecksumBody { impl http_body::Body for ChecksumBody { type Data = bytes::Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, @@ -99,8 +99,8 @@ impl http_body::Body for ChecksumBody { mod tests { use super::ChecksumBody; use crate::{http::CRC_32_HEADER_NAME, ChecksumAlgorithm, CRC_32_NAME}; - use aws_smithy_http::body::SdkBody; use aws_smithy_types::base64; + use aws_smithy_types::body::SdkBody; use bytes::Buf; use bytes_utils::SegmentedBuf; use http_body::Body; diff --git a/rust-runtime/aws-smithy-checksums/src/body/validate.rs b/rust-runtime/aws-smithy-checksums/src/body/validate.rs index 5af263bf02b..cf15815772e 100644 --- a/rust-runtime/aws-smithy-checksums/src/body/validate.rs +++ b/rust-runtime/aws-smithy-checksums/src/body/validate.rs @@ -8,7 +8,7 @@ use crate::http::HttpChecksum; -use aws_smithy_http::body::SdkBody; +use aws_smithy_types::body::SdkBody; use bytes::Bytes; use http::{HeaderMap, HeaderValue}; @@ -48,7 +48,7 @@ impl ChecksumBody { fn poll_inner( self: Pin<&mut Self>, cx: &mut Context<'_>, - ) -> Poll>> { + ) -> Poll>> { use http_body::Body; let this = self.project(); @@ -126,7 +126,7 @@ impl std::error::Error for Error {} impl http_body::Body for ChecksumBody { type Data = Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, @@ -155,7 +155,7 @@ impl http_body::Body for ChecksumBody { mod tests { use crate::body::validate::{ChecksumBody, Error}; use crate::ChecksumAlgorithm; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use bytes::{Buf, Bytes}; use bytes_utils::SegmentedBuf; use http_body::Body; diff --git a/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs b/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs index 30cc997e760..c82ffb233ba 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs @@ -10,8 +10,8 @@ use futures_util::stream; use hyper::Body; use pyo3::{prelude::*, py_run}; -use aws_smithy_http::body::SdkBody; use aws_smithy_http_server_python::types::ByteStream; +use aws_smithy_types::body::SdkBody; #[pyo3_asyncio::tokio::test] fn consuming_stream_on_python_synchronously() -> PyResult<()> { diff --git a/rust-runtime/aws-smithy-http-server-python/src/types.rs b/rust-runtime/aws-smithy-http-server-python/src/types.rs index a274efe086d..1af75dbd27d 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/types.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/types.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! Python wrapped types from aws-smithy-types and aws-smithy-http. +//! Python wrapped types from aws-smithy-types. //! //! ## `Deref` hacks for Json serializer //! [aws_smithy_json::serialize::JsonValueWriter] expects references to the types @@ -301,11 +301,11 @@ impl Deref for DateTime { } } -/// Python Wrapper for [aws_smithy_http::byte_stream::ByteStream]. +/// Python Wrapper for [aws_smithy_types::byte_stream::ByteStream]. /// /// ByteStream provides misuse-resistant primitives to make it easier to handle common patterns with streaming data. /// -/// On the Rust side, The Python implementation wraps the original [ByteStream](aws_smithy_http::byte_stream::ByteStream) +/// On the Rust side, The Python implementation wraps the original [ByteStream](aws_smithy_types::byte_stream::ByteStream) /// in a clonable structure and implements the [Stream](futures::stream::Stream) trait for it to /// allow Rust to handle the type transparently. /// @@ -332,17 +332,17 @@ impl Deref for DateTime { /// effectively maintaining the asyncronous behavior that Rust exposes, while the sync one is blocking the Tokio runtime to be able /// to await one chunk at a time. /// -/// The original Rust [ByteStream](aws_smithy_http::byte_stream::ByteStream) is wrapped inside a `Arc` to allow the type to be +/// The original Rust [ByteStream](aws_smithy_types::byte_stream::ByteStream) is wrapped inside a `Arc` to allow the type to be /// [Clone] (required by PyO3) and to allow internal mutability, required to fetch the next chunk of data. /// /// :param input bytes: /// :rtype None: #[pyclass] #[derive(Debug, Clone)] -pub struct ByteStream(Arc>); +pub struct ByteStream(Arc>); impl futures::stream::Stream for ByteStream { - type Item = Result; + type Item = Result; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { let stream = self.0.lock(); @@ -356,7 +356,7 @@ impl futures::stream::Stream for ByteStream { /// Return a new data chunk from the stream. async fn yield_data_chunk( - body: Arc>, + body: Arc>, ) -> PyResult> { let mut stream = body.lock().await; stream @@ -367,37 +367,37 @@ async fn yield_data_chunk( } impl ByteStream { - /// Construct a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a - /// [SdkBody](aws_smithy_http::body::SdkBody). + /// Construct a new [`ByteStream`](aws_smithy_types::byte_stream::ByteStream) from a + /// [`SdkBody`](aws_smithy_types::body::SdkBody). /// /// This method is available only to Rust and it is required to comply with the /// interface required by the code generator. - pub fn new(body: aws_smithy_http::body::SdkBody) -> Self { + pub fn new(body: aws_smithy_types::body::SdkBody) -> Self { Self(Arc::new(Mutex::new( - aws_smithy_http::byte_stream::ByteStream::new(body), + aws_smithy_types::byte_stream::ByteStream::new(body), ))) } } impl Default for ByteStream { fn default() -> Self { - Self::new(aws_smithy_http::body::SdkBody::from("")) + Self::new(aws_smithy_types::body::SdkBody::from("")) } } #[pymethods] impl ByteStream { - /// Create a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a slice of bytes. + /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a slice of bytes. #[new] pub fn newpy(input: &[u8]) -> Self { Self(Arc::new(Mutex::new( - aws_smithy_http::byte_stream::ByteStream::new(aws_smithy_http::body::SdkBody::from( + aws_smithy_types::byte_stream::ByteStream::new(aws_smithy_types::body::SdkBody::from( input, )), ))) } - /// Create a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a path, without + /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a path, without /// requiring Python to await this method. /// /// **NOTE:** This method will block the Rust event loop when it is running. @@ -407,7 +407,7 @@ impl ByteStream { #[staticmethod] pub fn from_path_blocking(py: Python, path: String) -> PyResult> { let byte_stream = Handle::current().block_on(async { - aws_smithy_http::byte_stream::ByteStream::from_path(path) + aws_smithy_types::byte_stream::ByteStream::from_path(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string())) })?; @@ -415,7 +415,7 @@ impl ByteStream { Ok(result.into_py(py)) } - /// Create a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a path, forcing + /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a path, forcing /// Python to await this coroutine. /// /// :param path str: @@ -423,7 +423,7 @@ impl ByteStream { #[staticmethod] pub fn from_path(py: Python, path: String) -> PyResult<&PyAny> { pyo3_asyncio::tokio::future_into_py(py, async move { - let byte_stream = aws_smithy_http::byte_stream::ByteStream::from_path(path) + let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string()))?; Ok(Self(Arc::new(Mutex::new(byte_stream)))) @@ -440,7 +440,7 @@ impl ByteStream { /// Return the next item from the iterator. If there are no further items, raise the StopIteration exception. /// PyO3 allows to raise the correct exception using the enum [IterNextOutput](pyo3::pyclass::IterNextOutput). /// - /// To get tnext value of the iterator, the `Arc` inner stream is cloned and the Rust call to `next()` is executed + /// To get the next value of the iterator, the `Arc` inner stream is cloned and the Rust call to `next()` is executed /// inside a call blocking the Tokio runtime. /// /// More info: `` diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-http/src/body.rs new file mode 100644 index 00000000000..bd961ce383e --- /dev/null +++ b/rust-runtime/aws-smithy-http/src/body.rs @@ -0,0 +1,21 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//TODO(runtimeCratesVersioningCleanup): Re-point those who use the deprecated type aliases to +// directly depend on `aws_smithy_types` and remove this module. + +//! Types for representing the body of an HTTP request or response + +/// A boxed generic HTTP body that, when consumed, will result in [`Bytes`](bytes::Bytes) or an [`Error`](aws_smithy_types::body::Error). +#[deprecated(note = "Moved to `aws_smithy_types::body::BoxBody`.")] +pub type BoxBody = aws_smithy_types::body::BoxBody; + +/// A generic, boxed error that's `Send` and `Sync` +#[deprecated(note = "`Moved to `aws_smithy_types::body::Error`.")] +pub type Error = aws_smithy_types::body::Error; + +/// SdkBody type +#[deprecated(note = "Moved to `aws_smithy_types::body::SdkBody`.")] +pub type SdkBody = aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-http/src/byte_stream.rs new file mode 100644 index 00000000000..e97a395b8e7 --- /dev/null +++ b/rust-runtime/aws-smithy-http/src/byte_stream.rs @@ -0,0 +1,24 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//TODO(runtimeCratesVersioningCleanup): Re-point those who use the deprecated type aliases to +// directly depend on `aws_smithy_types` and remove this module. + +//! ByteStream Abstractions + +/// Non-contiguous Binary Data Storage +#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::AggregatedBytes`.")] +pub type AggregatedBytes = aws_smithy_types::byte_stream::AggregatedBytes; + +/// Stream of binary data +#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::ByteStream`.")] +pub type ByteStream = aws_smithy_types::byte_stream::ByteStream; + +/// Errors related to bytestreams. +pub mod error { + /// An error occurred in the byte stream + #[deprecated(note = "Moved to `aws_smithy_types::byte_stream::error::Error`.")] + pub type Error = aws_smithy_types::byte_stream::error::Error; +} diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index eb931900a56..eb6e7544318 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::body::SdkBody; use crate::result::{ConnectorError, SdkError}; use aws_smithy_eventstream::frame::{ DecodedFrame, Message, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage, }; +use aws_smithy_types::body::SdkBody; use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; @@ -276,10 +276,10 @@ impl Receiver { #[cfg(test)] mod tests { use super::{Receiver, UnmarshallMessage}; - use crate::body::SdkBody; use crate::result::SdkError; use aws_smithy_eventstream::error::Error as EventStreamError; use aws_smithy_eventstream::frame::{Header, HeaderValue, Message, UnmarshalledMessage}; + use aws_smithy_types::body::SdkBody; use bytes::Bytes; use hyper::body::Body; use std::error::Error as StdError; diff --git a/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs index 65b5d5d0429..74b1adb144a 100644 --- a/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs +++ b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::body::SdkBody; -use crate::byte_stream::error::Error as ByteStreamError; -use crate::byte_stream::ByteStream; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::byte_stream::error::Error as ByteStreamError; +use aws_smithy_types::byte_stream::ByteStream; use bytes::Bytes; use futures_core::stream::Stream; use std::pin::Pin; diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index 245a477fb4c..6a77d080439 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -25,11 +25,8 @@ #![allow(clippy::derive_partial_eq_without_eq)] #![cfg_attr(docsrs, feature(doc_cfg))] -//TODO(runtimeCratesVersioningCleanup): Re-point those who use the following reexports to -// directly depend on `aws_smithy_types` and remove the reexports below. -pub use aws_smithy_types::body; -pub use aws_smithy_types::byte_stream; - +pub mod body; +pub mod byte_stream; pub mod endpoint; // Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code // generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being diff --git a/rust-runtime/aws-smithy-http/src/result.rs b/rust-runtime/aws-smithy-http/src/result.rs index 03119ef64f6..8ac6b1b613a 100644 --- a/rust-runtime/aws-smithy-http/src/result.rs +++ b/rust-runtime/aws-smithy-http/src/result.rs @@ -5,8 +5,8 @@ //! Types for [error](SdkError) responses. -use crate::body::SdkBody; use crate::connection::ConnectionMetadata; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA}; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::ErrorKind; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs index caae96e18e1..8619c2841ab 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs @@ -5,7 +5,7 @@ //! Http Request Types -use aws_smithy_http::body::SdkBody; +use aws_smithy_types::body::SdkBody; use http as http0; use http::header::{InvalidHeaderName, InvalidHeaderValue}; use http::uri::InvalidUri; @@ -616,7 +616,7 @@ fn header_value(value: MaybeStatic) -> Result { #[cfg(test)] mod test { use crate::client::orchestrator::HttpRequest; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use http::header::{AUTHORIZATION, CONTENT_LENGTH}; use http::{HeaderValue, Uri}; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index 8f976903c7a..051f3ebf588 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -428,7 +428,7 @@ impl fmt::Display for RewindResult { #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use http::header::{AUTHORIZATION, CONTENT_LENGTH}; use http::{HeaderValue, Uri}; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index b59a69b0c97..350c399e1ec 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -20,8 +20,8 @@ use crate::box_error::BoxError; use crate::client::interceptors::context::phase::Phase; use crate::client::interceptors::context::Error; use crate::client::interceptors::InterceptorError; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::{ConnectorError, SdkError}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use bytes::Bytes; use std::error::Error as StdError; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index f55cfa6e1f6..bae79b74d56 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -308,7 +308,7 @@ mod tests { use crate::client::runtime_components::RuntimeComponentsBuilder; use crate::client::runtime_plugin::{Order, SharedRuntimePlugin}; use crate::shared::IntoShared; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use http::HeaderValue; use std::borrow::Cow; diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index affff101d0d..3a6281373be 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -284,9 +284,9 @@ impl Sign for DigestAuthSigner { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::identity::http::Login; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::body::SdkBody; #[test] fn test_api_key_signing_headers() { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 541b11d6993..7bcdc13082a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -6,7 +6,6 @@ use crate::client::http::connection_poisoning::CaptureSmithyConnection; use aws_smithy_async::future::timeout::TimedOutError; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::connection::ConnectionMetadata; use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime_api::box_error::BoxError; @@ -17,6 +16,7 @@ use aws_smithy_runtime_api::client::http::{ use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::retry::ErrorKind; use http::{Extensions, Uri}; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs index 06915c942eb..f694840b616 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; use std::fmt::Debug; use std::sync::{Arc, Mutex}; use tokio::sync::oneshot; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index 95a3b2be142..5f50faaed7d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -246,9 +246,9 @@ impl From for BodyData { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; use aws_smithy_runtime_api::client::http::{HttpConnector, SharedHttpConnector}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::ByteStream; use bytes::Bytes; use http::Uri; use std::error::Error; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs index 1c682ad7ede..912a409b26b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs @@ -7,13 +7,13 @@ use super::{ Action, BodyData, ConnectionId, Direction, Error, Event, NetworkTraffic, Request, Response, Version, }; -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; use http_body::Body; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index 72c4d2d8618..d0f868a19c5 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -4,7 +4,6 @@ */ use super::{Action, ConnectionId, Direction, Event, NetworkTraffic}; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_protocol_test::MediaType; use aws_smithy_runtime_api::client::http::{ @@ -13,6 +12,7 @@ use aws_smithy_runtime_api::client::http::{ use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use bytes::{Bytes, BytesMut}; use http::{Request, Version}; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs index 3c4cea50653..2715b31c9e4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, @@ -12,6 +11,7 @@ use aws_smithy_runtime_api::client::http::{ use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; use std::fmt; use std::sync::Arc; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs index 0ad6623da5f..b34e0aa0fff 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs @@ -116,8 +116,8 @@ impl ValidateRequest { /// # Example /// /// ```no_run -/// use aws_smithy_http::body::SdkBody; /// use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +/// use aws_smithy_types::body::SdkBody; /// /// let http_client = StaticReplayClient::new(vec![ /// // Event that covers the first request/response diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index 0457f591225..8b2522bf959 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, @@ -17,6 +16,7 @@ use aws_smithy_runtime_api::client::interceptors::{ }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::error::display::DisplayErrorContext; use std::error::Error as StdError; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index bc0fd973cc5..ab328e53569 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -12,8 +12,6 @@ use crate::client::orchestrator::endpoints::orchestrate_endpoint; use crate::client::orchestrator::http::{log_response_body, read_body}; use crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind}; use aws_smithy_async::rt::sleep::AsyncSleep; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::byte_stream::ByteStream; use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings}; @@ -29,6 +27,8 @@ use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins; use aws_smithy_runtime_api::client::ser_de::{ DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer, }; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::byte_stream::ByteStream; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::timeout::TimeoutConfig; use std::mem; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs index 24baa8f414a..ca15aed5fb6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, SensitiveOutput}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use bytes::{Buf, Bytes}; use http_body::Body; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index 4777f313a61..569b5b0b132 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -398,8 +398,8 @@ mod tests { use crate::client::http::test_util::{capture_request, ReplayEvent, StaticReplayClient}; use crate::client::retries::classifiers::HttpStatusCodeClassifier; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::body::SdkBody; use aws_smithy_http::result::ConnectorError; + use aws_smithy_types::body::SdkBody; use std::convert::Infallible; #[tokio::test] diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs index a1abd092c96..9a093687ba7 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs @@ -218,10 +218,10 @@ mod test { use crate::client::retries::classifiers::{ HttpStatusCodeClassifier, ModeledAsRetryableClassifier, }; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::body::SdkBody; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; use std::fmt; diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs index 91cf73bdf71..9b4f4c2666e 100644 --- a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -13,7 +13,6 @@ use ::aws_smithy_runtime::client::retries::classifiers::{ HttpStatusCodeClassifier, TransientErrorClassifier, }; use aws_smithy_async::rt::sleep::TokioSleep; -use aws_smithy_http::body::{BoxBody, SdkBody}; use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use aws_smithy_runtime::client::http::test_util::wire::{ RecordedEvent, ReplayedEvent, WireMockServer, @@ -24,6 +23,7 @@ use aws_smithy_runtime::{ev, match_events}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; +use aws_smithy_types::body::{BoxBody, SdkBody}; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig}; use aws_smithy_types::timeout::TimeoutConfig; use hyper::client::Builder as HyperBuilder; From 1f7cc8e69ee1a7905c4c10aaf5720c71173684d8 Mon Sep 17 00:00:00 2001 From: david-perez Date: Fri, 20 Oct 2023 14:51:23 +0200 Subject: [PATCH 188/331] Update valid `Content-Type`s for example Python server (#2905) The service has a modeled event stream operation. It is exercised in the `event_stream_test`. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- examples/python/pokemon_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/python/pokemon_service.py b/examples/python/pokemon_service.py index 552d892ff32..8eb1255f877 100644 --- a/examples/python/pokemon_service.py +++ b/examples/python/pokemon_service.py @@ -176,8 +176,8 @@ def get_random_radio_stream(self) -> str: @app.middleware async def check_content_type_header(request: Request, next: Next) -> Response: content_type = request.headers.get("content-type") - if content_type == "application/json": - logging.debug("found valid `application/json` content type") + if content_type in ["application/json", "application/vnd.amazon.eventstream"]: + logging.debug("found valid `%s` content type", content_type) else: logging.warning( "invalid content type %s, dumping headers: %s", @@ -203,7 +203,7 @@ async def add_x_amzn_answer_header(request: Request, next: Next) -> Response: async def check_x_amzn_answer_header(request: Request, next: Next) -> Response: # Check that `x-amzn-answer` is 42. if request.headers.get("x-amzn-answer") != "42": - # Return an HTTP 401 Unauthorized if the content type is not JSON. + # Return an HTTP 401 Unauthorized. raise MiddlewareException("Invalid answer", 401) return await next(request) From 66a3acf5e0e1c8531301aeff346dca252080a7be Mon Sep 17 00:00:00 2001 From: Fahad Zubair Date: Fri, 20 Oct 2023 10:50:59 -0400 Subject: [PATCH 189/331] Client examples that use the generic client have been added (#2799) ## Motivation and Context Example code that demonstrates the usage of pokemon-service-client. ## Description Examples have been added that show how to add middleware, configure retries, timeouts, and handle errors when calling operations on the pokemon-service. _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Fahad Zubair --- examples/Cargo.toml | 1 + .../pokemon-service-client-usage/Cargo.toml | 37 ++++ .../pokemon-service-client-usage/README.md | 49 +++++ .../examples/client-connector.rs | 74 ++++++++ .../custom-header-using-interceptor.rs | 158 ++++++++++++++++ .../examples/custom-header.rs | 62 +++++++ .../examples/endpoint-resolver.rs | 102 +++++++++++ .../examples/handling-errors.rs | 135 ++++++++++++++ .../examples/mock-request.rs | 76 ++++++++ .../examples/response-header-interceptor.rs | 171 ++++++++++++++++++ .../examples/retry-classifier.rs | 112 ++++++++++++ .../examples/retry-customize.rs | 60 ++++++ .../examples/simple-client.rs | 53 ++++++ .../examples/timeout-config.rs | 64 +++++++ .../examples/trace-serialize.rs | 113 ++++++++++++ .../examples/use-config-bag.rs | 141 +++++++++++++++ .../pokemon-service-client-usage/src/lib.rs | 19 ++ 17 files changed, 1427 insertions(+) create mode 100644 examples/pokemon-service-client-usage/Cargo.toml create mode 100644 examples/pokemon-service-client-usage/README.md create mode 100644 examples/pokemon-service-client-usage/examples/client-connector.rs create mode 100644 examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs create mode 100644 examples/pokemon-service-client-usage/examples/custom-header.rs create mode 100644 examples/pokemon-service-client-usage/examples/endpoint-resolver.rs create mode 100644 examples/pokemon-service-client-usage/examples/handling-errors.rs create mode 100644 examples/pokemon-service-client-usage/examples/mock-request.rs create mode 100644 examples/pokemon-service-client-usage/examples/response-header-interceptor.rs create mode 100644 examples/pokemon-service-client-usage/examples/retry-classifier.rs create mode 100644 examples/pokemon-service-client-usage/examples/retry-customize.rs create mode 100644 examples/pokemon-service-client-usage/examples/simple-client.rs create mode 100644 examples/pokemon-service-client-usage/examples/timeout-config.rs create mode 100644 examples/pokemon-service-client-usage/examples/trace-serialize.rs create mode 100644 examples/pokemon-service-client-usage/examples/use-config-bag.rs create mode 100644 examples/pokemon-service-client-usage/src/lib.rs diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 453eee98e42..9d38f8d778c 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -7,6 +7,7 @@ members = [ "pokemon-service-lambda", "pokemon-service-server-sdk", "pokemon-service-client", + "pokemon-service-client-usage", ] diff --git a/examples/pokemon-service-client-usage/Cargo.toml b/examples/pokemon-service-client-usage/Cargo.toml new file mode 100644 index 00000000000..d3be7c83b10 --- /dev/null +++ b/examples/pokemon-service-client-usage/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "pokemon-service-client-usage" +version = "0.1.0" +edition = "2021" +publish = false + +[features] + + +[dependencies] +# The generated client utilizes types defined in other crates, such as `aws_smithy_types` +# and `aws_smithy_http`. However, most of these types are re-exported by the generated client, +# eliminating the need to directly depend on the crates that provide them. In rare instances, +# you may still need to include one of these crates as a dependency. Examples that require this +# are specifically noted in comments above the corresponding dependency in this file. +pokemon-service-client = { path = "../pokemon-service-client/" } + +# Required for getting the operation name from the `Metadata`. +aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } + +# Required for `Storable` and `StoreReplace` in `response-header-interceptor` example. +aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } + +# Required for `HyperClientBuilder` in `client-connector` example. +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime/", features=["test-util"] } + + + +hyper = { version = "0.14.25", features = ["client", "full"] } +tokio = {version = "1.26.0", features=["full"]} +tracing = "0.1.37" +tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } +rustls = "0.21.7" +hyper-rustls = "0.24.1" +http = "0.2.9" +uuid = {version="1.4.1", features = ["v4"]} +thiserror = "1.0.49" diff --git a/examples/pokemon-service-client-usage/README.md b/examples/pokemon-service-client-usage/README.md new file mode 100644 index 00000000000..f2b90eea952 --- /dev/null +++ b/examples/pokemon-service-client-usage/README.md @@ -0,0 +1,49 @@ +# smithy-rs Client Examples + +This package contains some examples on how to use the Smithy Client to communicate +with a Smithy-based service. + +## Pre-requisites + +1. Build the `pokemon-service-client` and `pokemon-service` by invoking `make` in the + [examples](https://github.com/awslabs/smithy-rs/tree/main/examples) folder. + +```console +make +``` + +2. Run the Pokemon service locally by issuing the following command from the + [examples](https://github.com/awslabs/smithy-rs/tree/main/examples) folder. This + will launch the Smithy-Rs based service on TCP port 13734. + +```console +cargo run --bin pokemon-service +``` + +## Running the examples + +You can view a list of examples by running `cargo run --example` from the +[pokemon-service-client-usage](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage) +folder. To run an example, pass its name to the `cargo run --example` command, e.g.: + +```console +cargo run --example simple-client +``` + +## List of examples + +| Rust Example | Description | +|--------------------------------|-------------------------------------------------------------------------| +| simple-client | Creates a Smithy Client and calls an operation on it. | +| endpoint-resolver | How to set a custom endpoint resolver. | +| handling-errors | How to send an input parameter to an operation, and to handle errors. | +| custom-header | How to add headers to a request. | +| custom-header-using-interceptor| How to access operation name being called in an interceptor. | +| response-header-interceptor | How to get operation name and access response before it is deserialized.| +| use-config-bag | How to use the property bag to pass data across interceptors. | +| retries-customize | Customize retry settings. | +| retries-disable | How to disable retries. | +| timeout-config | How to configure timeouts. | +| mock-request | Use a custom HttpConnector / Client to generate mock responses. | +| trace-serialize | Trace request and response as they are serialized / deserialized. | +| client-connector | Shows how to change TLS related configuration. | diff --git a/examples/pokemon-service-client-usage/examples/client-connector.rs b/examples/pokemon-service-client-usage/examples/client-connector.rs new file mode 100644 index 00000000000..61efcc0f69a --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/client-connector.rs @@ -0,0 +1,74 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to set connector settings. For example, how to set +/// trusted root certificates to use for HTTPs communication. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example client-connector`. +/// +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +use hyper_rustls::ConfigBuilderExt; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + let tls_config = rustls::ClientConfig::builder() + .with_safe_defaults() + // `with_native_roots()`: Load platform trusted root certificates. + // `with_webpki_roots()`: Load Mozilla’s set of trusted roots. + .with_native_roots() + // To use client side certificates, you can use + // `.with_client_auth_cert(client_cert, client_key)` instead of `.with_no_client_auth()` + .with_no_client_auth(); + + let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_tls_config(tls_config) + // This can be changed to `.https_only()` to ensure that the client always uses HTTPs + .https_or_http() + .enable_http1() + .enable_http2() + .build(); + + // Create a hyper-based HTTP client that uses this TLS connector. + let http_client = HyperClientBuilder::new().build(tls_connector); + + // Pass the smithy connector to the Client::ConfigBuilder + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .http_client(http_client) + .build(); + + // Instantiate a client by applying the configuration. + pokemon_service_client::Client::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(?response, "Response from service") +} diff --git a/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs b/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs new file mode 100644 index 00000000000..b01d1fe2bb8 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs @@ -0,0 +1,158 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// In this example, a custom header `x-amzn-client-ttl-seconds` is set for all outgoing requests. +/// It serves as a demonstration of how an operation name can be retrieved and utilized within +/// the interceptor. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example custom-header-using-interceptor`. +/// +use std::{collections::HashMap, time::Duration}; + +use pokemon_service_client::config::{ConfigBag, Intercept}; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client::{ + config::{interceptors::BeforeTransmitInterceptorContextMut, RuntimeComponents}, + error::BoxError, +}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +// The `TtlHeaderInterceptor` keeps a map of operation specific value to send +// in the header for each Request. +#[derive(Debug)] +pub struct TtlHeaderInterceptor { + /// Default time-to-live for an operation. + default_ttl: hyper::http::HeaderValue, + /// Operation specific time-to-live. + operation_ttl: HashMap<&'static str, hyper::http::HeaderValue>, +} + +// Helper function to format duration as fractional seconds. +fn format_ttl_value(ttl: Duration) -> String { + format!("{:.2}", ttl.as_secs_f64()) +} + +impl TtlHeaderInterceptor { + fn new(default_ttl: Duration) -> Self { + let duration_str = format_ttl_value(default_ttl); + let default_ttl_value = hyper::http::HeaderValue::from_str(duration_str.as_str()) + .expect("could not create a header value for the default ttl"); + + Self { + default_ttl: default_ttl_value, + operation_ttl: Default::default(), + } + } + + /// Adds an operation name specific timeout value that needs to be set in the header. + fn add_operation_ttl(&mut self, operation_name: &'static str, ttl: Duration) { + let duration_str = format_ttl_value(ttl); + + self.operation_ttl.insert( + operation_name, + hyper::http::HeaderValue::from_str(duration_str.as_str()) + .expect("cannot create header value for the given ttl duration"), + ); + } +} + +/// Appends the header `x-amzn-client-ttl-seconds` using either the default time-to-live value +/// or an operation-specific value if it was set earlier using `add_operation_ttl`. +//impl aws_smithy_runtime_api::client::interceptors::Interceptor for TtlHeaderInterceptor { +impl Intercept for TtlHeaderInterceptor { + fn name(&self) -> &'static str { + "TtlHeaderInterceptor" + } + + /// Before the request is signed, add the header to the outgoing request. + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // Metadata in the ConfigBag has the operation name. + let metadata = cfg + .load::() + .expect("metadata should exist"); + let operation_name = metadata.name(); + + // Get operation specific or default HeaderValue to set for the header key. + let ttl = self + .operation_ttl + .get(operation_name) + .unwrap_or(&self.default_ttl); + + context + .request_mut() + .headers_mut() + .insert("x-amzn-client-ttl-seconds", ttl.clone()); + + tracing::info!("{operation_name} header set to {ttl:?}"); + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // By default set the value of all operations to 6 seconds. + const DEFAULT_TTL: Duration = Duration::from_secs(6); + + // Set up the interceptor to add an operation specific value of 3.5 seconds to be added + // for GetStorage operation. + let mut ttl_headers_interceptor = TtlHeaderInterceptor::new(DEFAULT_TTL); + ttl_headers_interceptor.add_operation_ttl("GetStorage", Duration::from_millis(3500)); + + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(ttl_headers_interceptor) + .build(); + + pokemon_service_client::Client::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response for get_server_statistics()"); + + // Call the operation `get_storage` on the Pokémon service. The `TtlHeaderInterceptor` + // interceptor will add a specific header name / value pair for this operation. + let response = client + .get_storage() + .user("ash") + .passcode("pikachu123") + .send() + .await + .expect("operation failed"); + + // Print the response received from the service. + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/custom-header.rs b/examples/pokemon-service-client-usage/examples/custom-header.rs new file mode 100644 index 00000000000..98dc20e2d5b --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/custom-header.rs @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to create a `smithy-rs` client, and call an operation with custom +/// headers in the request. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example custom-header` +/// +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .build(); + + // Apply the configuration on the client, and return that. + pokemon_service_client::Client::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .customize() + .mutate_request(|req| { + // For demonstration purposes, add a header `x-ttl-seconds` to the outgoing request. + let headers = req.headers_mut(); + headers.insert( + hyper::header::HeaderName::from_static("x-ttl-seconds"), + hyper::header::HeaderValue::from(30), + ); + }) + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs b/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs new file mode 100644 index 00000000000..d37479fa6cb --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs @@ -0,0 +1,102 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how a custom `ResolveEndpoint` can be implemented for resolving +/// endpoint of a request. Additionally, it shows how a header can be added using the endpoint +/// builder. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example endpoint-resolver`. +/// +use pokemon_service_client::config::endpoint::{Endpoint, EndpointFuture, Params, ResolveEndpoint}; +use pokemon_service_client::primitives::{DateTime, DateTimeFormat}; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::setup_tracing_subscriber; + +use std::time::SystemTime; + +// This struct, provided as an example, constructs the URL that should be set on each request during initialization. +// It also implements the `ResolveEndpoint` trait, enabling it to be assigned as the endpoint_resolver in the `Config`. +#[derive(Debug)] +struct RegionalEndpoint { + url_to_use: String, +} + +impl RegionalEndpoint { + fn new(regional_url: &str, port: u16) -> Self { + let url_to_use = format!("{}:{}", regional_url, port); + RegionalEndpoint { url_to_use } + } +} + +impl ResolveEndpoint for RegionalEndpoint { + fn resolve_endpoint<'a>(&'a self, _params: &'a Params) -> EndpointFuture<'a> { + // Construct an endpoint using the Endpoint::Builder. Set the URL and, + // optionally, any headers to be sent with the request. For this example, + // we'll set the 'x-amz-date' header to the current date for all outgoing requests. + // `DateTime` can be used for formatting an RFC 3339 date time. + let now = SystemTime::now(); + let date_time = DateTime::from(now); + + let endpoint = Endpoint::builder() + .url(self.url_to_use.clone()) + .header( + "x-amz-date", + date_time + .fmt(DateTimeFormat::DateTimeWithOffset) + .expect("Could not create a date in UTC format"), + ) + .build(); + tracing::info!(?endpoint, "Resolving endpoint"); + EndpointFuture::ready(Ok(endpoint)) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + const DEFAULT_PORT: u16 = 13734; + + // Use the environment variable `REGIONAL_URL` for the URL. + let resolver = RegionalEndpoint::new( + std::env::var("REGIONAL_URL") + .as_deref() + .unwrap_or("http://localhost"), + DEFAULT_PORT, + ); + + let config = pokemon_service_client::Config::builder() + .endpoint_resolver(resolver) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/handling-errors.rs b/examples/pokemon-service-client-usage/examples/handling-errors.rs new file mode 100644 index 00000000000..ee1da30cbb8 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/handling-errors.rs @@ -0,0 +1,135 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// Copyright © 2023, Amazon, LLC. +/// +/// This example demonstrates how to handle service generated errors. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example handling-errors`. +/// +use pokemon_service_client::{error::SdkError, operation::get_storage::GetStorageError}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +use pokemon_service_client::Client as PokemonClient; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // The following example sends an incorrect passcode to the operation `get_storage`, + // which will return + // [StorageAccessNotAuthorized](https://github.com/awslabs/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy#L48) + let response_result = client + .get_storage() + .user("ash") + // Give a wrong password to generate a service error. + .passcode("pkachu123") + .send() + .await; + + // All errors are consolidated into an `SdkError` + match response_result { + Ok(response) => { + tracing::info!(?response, "Response from service") + } + Err(SdkError::ServiceError(se)) => { + // When an error response is received from the service, it is modeled + // as a `SdkError::ServiceError`. + match se.err() { + // Not authorized to access Pokémon storage. + GetStorageError::StorageAccessNotAuthorized(_) => { + tracing::error!("You do not have access to this resource."); + } + GetStorageError::ResourceNotFoundError(rnfe) => { + let message = rnfe.message(); + tracing::error!(error = %message, + "Given Pikachu does not exist on the server." + ) + } + GetStorageError::ValidationError(ve) => { + tracing::error!(error = %ve, "A required field has not been set."); + } + // An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). + GetStorageError::Unhandled(uh) => { + tracing::error!(error = %uh, "An unhandled error has occurred.") + } + // The SdkError is marked as `#[non_exhaustive]`. Therefore, a catch-all pattern is required to handle + // potential future variants introduced in SdkError. + _ => { + tracing::error!(error = %se.err(), "Some other error has occurred on the server") + } + } + } + Err(SdkError::TimeoutError(_)) => { + tracing::error!("The request timed out and could not be completed"); + } + Err(SdkError::ResponseError(re)) => { + // Raw response received from the service can be retrieved using + // the `raw()` method. + tracing::error!( + "An unparsable response was received. Raw response: {:?}", + re.raw() + ); + } + Err(sdk_error) => { + // To retrieve the `source()` of an error within the following match statements, + // we work with the parent `SdkError` type, as individual variants don't directly provide it. + // Converting the parent error to its source transfers ownership of the variable. + match sdk_error { + SdkError::DispatchFailure(ref failure) => { + if failure.is_io() { + tracing::error!("An I/O error occurred"); + } else if failure.is_timeout() { + tracing::error!("Request timed out"); + } else if failure.is_user() { + tracing::error!("An invalid HTTP request has been provided"); + } else { + tracing::error!("Some other dispatch error occurred."); + }; + + if let Ok(source) = sdk_error.into_source() { + tracing::error!(%source, "Error source"); + } + } + SdkError::ConstructionFailure(_) => { + if let Ok(source) = sdk_error.into_source() { + tracing::error!(%source, "Request could not be constructed."); + } else { + tracing::error!("Request could not be constructed for unknown reasons"); + } + } + _ => { + tracing::error!("An unknown error has occurred"); + } + } + } + } +} diff --git a/examples/pokemon-service-client-usage/examples/mock-request.rs b/examples/pokemon-service-client-usage/examples/mock-request.rs new file mode 100644 index 00000000000..64f21beb658 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/mock-request.rs @@ -0,0 +1,76 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to use a mock connector with `capture_request`. This allows for +/// responding with a static `Response` while capturing the incoming request. The captured request +/// can later be asserted to verify that the correct headers and body were sent to the server. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example mock-request`. +/// +use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_types::body::SdkBody; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Build a response that should be sent when the operation is called. + let response = http::Response::builder() + .status(200) + .body(SdkBody::from(r#"{"calls_count":100}"#)) + .expect("response could not be constructed"); + + // Call `capture_request` to obtain a HTTP connector and a request receiver. + // The request receiver captures the incoming request, while the connector can be passed + // to `Config::builder().http_client`. + let (http_client, captured_request) = capture_request(Some(response)); + + // Pass the `http_client` connector to `Config::builder`. The connector won't send + // the request over the network; instead, it will return the static response provided + // during its initialization. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .http_client(http_client) + .build(); + + // Instantiate a client by applying the configuration. + let client = PokemonClient::from_conf(config); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .customize() + .mutate_request(|req| { + // For demonstration, send an extra header that can be verified to confirm + // that the client actually sends it. + let headers = req.headers_mut(); + headers.insert( + hyper::header::HeaderName::from_static("user-agent"), + hyper::header::HeaderName::from_static("sample-client"), + ); + }) + .send() + .await + .expect("operation failed"); + + // Print the response received from the service. + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); + + // The captured request can be verified to have certain headers. + let req = captured_request.expect_request(); + assert_eq!(req.headers().get("user-agent"), Some("sample-client")); + + // As an example, you can verify the URL matches. + assert_eq!(req.uri(), "http://localhost:13734/stats"); + + // You can convert the captured body into a &str and use assert! + // on it if you want to verify the contents of the request body. + // let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap(); +} diff --git a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs new file mode 100644 index 00000000000..14928fe28c1 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs @@ -0,0 +1,171 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how response headers can be examined before they are deserialized +/// into the output type. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example response-header-interceptor`. +/// +//use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use pokemon_service_client::{ + config::{ + interceptors::{ + BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, + }, + ConfigBag, Intercept, RuntimeComponents, + }, + error::BoxError, + Client as PokemonClient, +}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use uuid::Uuid; + +#[derive(Debug, Clone)] +struct RequestId { + client_id: String, + server_id: Option, +} + +impl Storable for RequestId { + type Storer = StoreReplace; +} + +#[derive(Debug, thiserror::Error)] +enum RequestIdError { + /// The server-sent request ID cannot be converted into a string during parsing. + #[error("RequestID sent by the server cannot be parsed into a string. Error: {0}")] + NonParsableServerRequestId(String), + /// Client side + #[error("Client side request ID has not been set")] + ClientRequestIdMissing(), +} + +#[derive(Debug, Default)] +pub struct ResponseHeaderLoggingInterceptor; + +impl ResponseHeaderLoggingInterceptor { + /// Creates a new `ResponseHeaderLoggingInterceptor` + pub fn new() -> Self { + Self::default() + } +} + +impl Intercept for ResponseHeaderLoggingInterceptor { + fn name(&self) -> &'static str { + "ResponseHeaderLoggingInterceptor" + } + + /// Before the request is signed, add the header to the outgoing request. + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let client_id = Uuid::new_v4().to_string(); + + let request_id = hyper::header::HeaderValue::from_str(&client_id) + .expect("failed to construct a header value from UUID"); + context + .request_mut() + .headers_mut() + .insert("x-amzn-requestid", request_id); + + cfg.interceptor_state().store_put(RequestId { + client_id, + server_id: None, + }); + + Ok(()) + } + + fn read_before_deserialization( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // `Metadata` in the `ConfigBag` has the operation name in it. + let metadata = cfg + .load::() + .expect("metadata should exist"); + let operation_name = metadata.name().to_string(); + + // Get the server side request ID and set it in the RequestID data type + // that is in the ConfigBag. This way any other interceptor that requires the mapping + // can easily find it from the bag. + let response = context.response(); + let header_received = response + .headers() + .iter() + .find(|(header_name, _)| *header_name == "x-request-id"); + + if let Some((_, server_id)) = header_received { + let server_id = server_id + .to_str() + .map_err(|e| Box::new(RequestIdError::NonParsableServerRequestId(e.to_string())))?; + + let request_details = cfg + .get_mut::() + .ok_or_else(|| Box::new(RequestIdError::ClientRequestIdMissing()))?; + + tracing::info!(operation = %operation_name, + "RequestID Mapping: {} = {server_id}", + request_details.client_id, + ); + + request_details.server_id = Some(server_id.into()); + } else { + tracing::info!(operation = %operation_name, "Server RequestID missing in response"); + } + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(ResponseHeaderLoggingInterceptor) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + // If you need to access the `RequestIdError` raised by the interceptor, + // you can convert `SdkError::DispatchFailure` to a `ConnectorError` + // and then use `downcast_ref` on its source to get a `RequestIdError`. + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/retry-classifier.rs b/examples/pokemon-service-client-usage/examples/retry-classifier.rs new file mode 100644 index 00000000000..7ff17f0e668 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/retry-classifier.rs @@ -0,0 +1,112 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how a custom RetryClassifier can be written to decide +/// which error conditions should be retried. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example retry-classifier`. +/// +use http::StatusCode; +use pokemon_service_client::{ + config::{ + interceptors::InterceptorContext, + retry::{ClassifyRetry, RetryAction, RetryConfig}, + }, + operation::get_server_statistics::GetServerStatisticsError, +}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::time::Duration; + +use pokemon_service_client::Client as PokemonClient; + +#[derive(Debug)] +struct SampleRetryClassifier; + +// By default, the generated client uses the `aws_http::retry::AwsResponseRetryClassifier` +// to determine whether an error should be retried. To use a custom retry classifier, +// implement the `ClassifyRetry` trait and pass it to the retry_classifier method +// of the `Config::builder`. +impl ClassifyRetry for SampleRetryClassifier { + fn name(&self) -> &'static str { + "SampleRetryClassifier" + } + + // For this example, the classifier should retry in case the error is GetServerStatisticsError + // and the status code is 503. + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Get the output or error that has been deserialized from the response. + let output_or_error = ctx.output_or_error(); + + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + // Retry in case the error returned is GetServerStatisticsError and StatusCode is 503. + if let Some(_err) = error + .as_operation_error() + .and_then(|err| err.downcast_ref::()) + { + if let Some(response) = ctx.response() { + if response.status() == StatusCode::SERVICE_UNAVAILABLE { + return RetryAction::server_error(); + } + } + } + + // Let other classifiers run and decide if the request should be retried. + // Returning RetryAction::RetryForbidden will forbid any retries. + RetryAction::NoActionIndicated + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // By default the Smithy client uses RetryConfig::standard() strategy, with 3 retries, and + // an initial exponential back off of 1 second. To turn it off use RetryConfig::disabled(). + let retry_config = RetryConfig::standard() + .with_initial_backoff(Duration::from_secs(3)) + .with_max_attempts(5); + + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .retry_config(retry_config) + // Add the retry classifier. + .retry_classifier(SampleRetryClassifier {}) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/retry-customize.rs b/examples/pokemon-service-client-usage/examples/retry-customize.rs new file mode 100644 index 00000000000..5deb3af0ffa --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/retry-customize.rs @@ -0,0 +1,60 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to customize retry settings on a Smithy client. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example retry-customize`. +/// +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::time::Duration; + +use pokemon_service_client::{config::retry::RetryConfig, Client as PokemonClient}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // By default the Smithy client uses `RetryConfig::standard()` strategy, with 3 retries, and + // an initial exponential back off of 1 second. To turn it off use `RetryConfig::disabled()`. + let retry_config = RetryConfig::standard() + .with_initial_backoff(Duration::from_secs(3)) + .with_max_attempts(5); + + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .retry_config(retry_config) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/simple-client.rs b/examples/pokemon-service-client-usage/examples/simple-client.rs new file mode 100644 index 00000000000..e04e2345e82 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/simple-client.rs @@ -0,0 +1,53 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to create a `smithy-rs` Client and call an +/// [operation](https://smithy.io/2.0/spec/idl.html?highlight=operation#operation-shape). +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example simple-client`. +/// +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client contains a type `config::Builder` for constructing a `Config` instance. + // This enables configuration of endpoint resolvers, timeouts, retries, etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .build(); + + // Instantiate a client by applying the configuration. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + // Print the response received from the service. + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/timeout-config.rs b/examples/pokemon-service-client-usage/examples/timeout-config.rs new file mode 100644 index 00000000000..cbfbb8e7e45 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/timeout-config.rs @@ -0,0 +1,64 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to create a `smithy-rs` Client and set connection +/// and operation related timeouts on the client. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example timeout-config` +/// +use std::time::Duration; + +use pokemon_service_client::{config::timeout::TimeoutConfig, Client as PokemonClient}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // Different type of timeouts can be set on the client. These are: + // operation_attempt_timeout - If retries are enabled, this represents the timeout + // for each individual operation attempt. + // operation_timeout - Overall timeout for the operation to complete. + // connect timeout - The amount of time allowed for a connection to be established. + let timeout_config = TimeoutConfig::builder() + .operation_attempt_timeout(Duration::from_secs(1)) + .operation_timeout(Duration::from_secs(5)) + .connect_timeout(Duration::from_millis(500)) + .build(); + + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .timeout_config(timeout_config) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("Pokemon service does not seem to be running on localhost:13734"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/trace-serialize.rs b/examples/pokemon-service-client-usage/examples/trace-serialize.rs new file mode 100644 index 00000000000..7826679e2ed --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/trace-serialize.rs @@ -0,0 +1,113 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how an interceptor can be written to trace what is being +/// serialized / deserialized on the wire. +/// +/// Please beware that this may log sensitive information! This example is meant for pedagogical +/// purposes and may be useful in debugging scenarios. Please don't use this as-is in production. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example trace-serialize`. +/// +use http::StatusCode; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::str; + +use pokemon_service_client::{ + config::{ + interceptors::{ + BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextRef, + }, + ConfigBag, Intercept, RuntimeComponents, + }, + error::BoxError, + Client as PokemonClient, +}; + +/// An example interceptor that logs the request and response as they're sent and received. +#[derive(Debug, Default)] +pub struct WireFormatInterceptor; + +impl Intercept for WireFormatInterceptor { + fn name(&self) -> &'static str { + "WireFormatInterceptor" + } + + // Called after the operation input has been serialized but before it's dispatched over the wire. + fn read_after_serialization( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // Get the request type from the context. + let request = context.request(); + // Print the request to the debug tracing log. + tracing::debug!(?request); + + Ok(()) + } + + // Called after the operation's response has been received but before it's deserialized into the + // operation's output type. + fn read_before_deserialization( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // Get the response type from the context. + let response = context.response(); + // Print the response. + if response.status() == StatusCode::OK { + tracing::info!(?response, "Response received:"); + } else { + tracing::error!(?response); + } + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(WireFormatInterceptor {}) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/use-config-bag.rs b/examples/pokemon-service-client-usage/examples/use-config-bag.rs new file mode 100644 index 00000000000..6dd9cba3a50 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/use-config-bag.rs @@ -0,0 +1,141 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how different interceptor can use a property bag to pass +/// state from one interceptor to the next. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example use-config-bag`. +/// +//use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::time::Instant; + +use pokemon_service_client::{ + config::{ + interceptors::{ + BeforeDeserializationInterceptorContextRef, FinalizerInterceptorContextRef, + }, + ConfigBag, Intercept, RuntimeComponents, + }, + error::BoxError, + Client as PokemonClient, +}; + +#[derive(Debug)] +struct RequestTimestamp(Instant); + +impl Storable for RequestTimestamp { + type Storer = StoreReplace; +} + +#[derive(Debug, Default)] +pub struct SetTimeInterceptor; + +/// Note: This is merely an example demonstrating how state can +/// be shared between two different interceptors. In a practical +/// scenario, there wouldn't be a need to write two interceptors +/// merely to display the duration from the start of the lifecycle +/// to the receipt of the response. This task can be accomplished +/// within a single interceptor by overriding both +/// read_before_execution and read_before_deserialization. +impl Intercept for SetTimeInterceptor { + fn name(&self) -> &'static str { + "SetTimeInterceptor" + } + + fn read_before_execution( + &self, + _context: &pokemon_service_client::config::interceptors::BeforeSerializationInterceptorContextRef<'_>, + cfg: &mut aws_smithy_types::config_bag::ConfigBag, + ) -> Result<(), pokemon_service_client::error::BoxError> { + cfg.interceptor_state() + .store_put(RequestTimestamp(Instant::now())); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct GetTimeInterceptor; + +impl Intercept for GetTimeInterceptor { + fn name(&self) -> &'static str { + "GetTimeInterceptor" + } + + fn read_before_deserialization( + &self, + _context: &BeforeDeserializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let stop_watch = cfg + .load::() + .expect("StopWatch not found in the ConfigBag"); + + let time_taken = stop_watch.0.elapsed(); + tracing::info!(time_taken = %time_taken.as_micros(), "Microseconds:"); + + Ok(()) + } + + fn read_after_execution( + &self, + _context: &FinalizerInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), pokemon_service_client::error::BoxError> { + let timestamp = cfg + .load::() + .expect("RequestTimeStamp not found in the ConfigBag"); + + let time_taken = timestamp.0.elapsed(); + tracing::info!(time_taken = %time_taken.as_micros(), "Microseconds:"); + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(SetTimeInterceptor) + .interceptor(GetTimeInterceptor) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("Pokemon service does not seem to be running on localhost:13734"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/src/lib.rs b/examples/pokemon-service-client-usage/src/lib.rs new file mode 100644 index 00000000000..6612ddb4c4c --- /dev/null +++ b/examples/pokemon-service-client-usage/src/lib.rs @@ -0,0 +1,19 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +pub static POKEMON_SERVICE_URL: &str = "http://localhost:13734"; + +/// Sets up the tracing subscriber to print `tracing::info!` and `tracing::error!` messages on the console. +pub fn setup_tracing_subscriber() { + // Add a tracing subscriber that uses the environment variable RUST_LOG + // to figure out which log level should be emitted. By default use `tracing::info!` + // as the logging level. + let filter = tracing_subscriber::EnvFilter::builder() + .with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into()) + .from_env_lossy(); + + tracing_subscriber::fmt::fmt() + .with_env_filter(filter) + .init(); +} From 40f466213b038916f37528c1b51cc75cea11b02a Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 20 Oct 2023 16:37:16 -0700 Subject: [PATCH 190/331] Replace credentials cache with identity cache (#3077) This PR replaces the credentials cache with the new identity cache, and adds config validation via the `SharedConfigValidator` runtime component and `ValidateConfig` trait. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 18 + .../aws-config/external-types.toml | 5 +- .../aws-config/src/imds/client.rs | 5 +- .../aws-config/src/imds/client/token.rs | 84 +-- aws/rust-runtime/aws-config/src/lib.rs | 92 ++- .../aws-config/src/sso/credentials.rs | 4 +- aws/rust-runtime/aws-config/src/sso/token.rs | 5 +- .../aws-config/src/sts/assume_role.rs | 25 +- aws/rust-runtime/aws-config/src/test_case.rs | 82 +-- .../aws-credential-types/Cargo.toml | 11 +- .../aws-credential-types/external-types.toml | 1 + .../aws-credential-types/src/cache.rs | 133 ---- .../src/cache/expiring_cache.rs | 162 ----- .../src/cache/lazy_caching.rs | 586 ------------------ .../src/cache/no_caching.rs | 83 --- .../aws-credential-types/src/lib.rs | 1 - .../aws-credential-types/src/provider.rs | 18 +- aws/rust-runtime/aws-inlineable/src/lib.rs | 3 - .../aws-inlineable/src/no_credentials.rs | 23 - aws/rust-runtime/aws-runtime/src/identity.rs | 40 -- aws/rust-runtime/aws-runtime/src/lib.rs | 3 - .../aws-types/external-types.toml | 2 + aws/rust-runtime/aws-types/src/sdk_config.rs | 68 +- .../smithy/rustsdk/AwsCodegenDecorator.kt | 1 - .../amazon/smithy/rustsdk/CredentialCaches.kt | 158 ----- .../smithy/rustsdk/CredentialProviders.kt | 32 +- .../smithy/rustsdk/SdkConfigDecorator.kt | 4 + .../rustsdk/CredentialCacheConfigTest.kt | 191 ------ .../no-default-features/Cargo.toml | 1 + .../tests/client-construction.rs | 76 ++- .../s3/tests/client_construction.rs | 42 ++ .../s3/tests/sleep_impl_use_cases.rs | 199 ------ .../customizations/IdentityCacheDecorator.kt | 105 ++++ .../customize/RequiredCustomizations.kt | 2 + .../ClientRuntimeTypesReExportGenerator.kt | 2 + .../client/FluentClientGenerator.kt | 93 ++- .../aws-smithy-runtime-api/src/client/auth.rs | 3 + .../src/client/endpoint.rs | 3 + .../aws-smithy-runtime-api/src/client/http.rs | 3 + .../src/client/identity.rs | 54 +- .../src/client/interceptors.rs | 3 + .../src/client/retries.rs | 3 + .../src/client/retries/classifiers.rs | 3 + .../src/client/runtime_components.rs | 374 ++++++++++- .../src/client/auth/http.rs | 4 +- .../aws-smithy-runtime/src/client/defaults.rs | 119 +++- .../src/client/http/test_util/replay.rs | 12 +- .../src/client/identity/cache/lazy.rs | 65 +- .../src/client/interceptors.rs | 5 + .../src/client/orchestrator.rs | 9 +- .../src/client/orchestrator/auth.rs | 77 ++- .../src/client/orchestrator/operation.rs | 22 +- 52 files changed, 1157 insertions(+), 1962 deletions(-) delete mode 100644 aws/rust-runtime/aws-credential-types/src/cache.rs delete mode 100644 aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs delete mode 100644 aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs delete mode 100644 aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs delete mode 100644 aws/rust-runtime/aws-inlineable/src/no_credentials.rs delete mode 100644 aws/rust-runtime/aws-runtime/src/identity.rs delete mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt delete mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt create mode 100644 aws/sdk/integration-tests/s3/tests/client_construction.rs delete mode 100644 aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index cfeb53879e5..0faa2266e8a 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -450,3 +450,21 @@ message = """ references = ["smithy-rs#3076"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "ysaito1001" + +[[aws-sdk-rust]] +message = "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache." +references = ["smithy-rs#3077"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "**Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching." +references = ["smithy-rs#3077"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[smithy-rs]] +message = "Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio." +references = ["smithy-rs#3071"] +meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index c6328580b05..e1593172a64 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -12,15 +12,18 @@ allowed_external_types = [ "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_types::body::SdkBody", "aws_smithy_http::endpoint", "aws_smithy_http::endpoint::error::InvalidEndpointError", "aws_smithy_http::result::SdkError", + "aws_smithy_runtime::client::identity::cache::IdentityCache", + "aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder", "aws_smithy_runtime_api::client::dns::ResolveDns", "aws_smithy_runtime_api::client::dns::SharedDnsResolver", "aws_smithy_runtime_api::client::http::HttpClient", "aws_smithy_runtime_api::client::http::SharedHttpClient", + "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::ResolveIdentity", + "aws_smithy_types::body::SdkBody", "aws_smithy_types::retry", "aws_smithy_types::retry::*", "aws_smithy_types::timeout", diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index e956193e384..fd2315a3168 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -433,7 +433,6 @@ impl Builder { .runtime_plugin(common_plugin.clone()) .runtime_plugin(TokenRuntimePlugin::new( common_plugin, - config.time_source(), self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL), )) .with_connection_poisoning() @@ -748,6 +747,7 @@ pub(crate) mod test { /// Tokens are refreshed up to 120 seconds early to avoid using an expired token. #[tokio::test] async fn token_refresh_buffer() { + let _logs = capture_test_logs(); let (_, http_client) = mock_imds_client(vec![ ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), @@ -785,11 +785,14 @@ pub(crate) mod test { .token_ttl(Duration::from_secs(600)) .build(); + tracing::info!("resp1 -----------------------------------------------------------"); let resp1 = client.get("/latest/metadata").await.expect("success"); // now the cached credential has expired time_source.advance(Duration::from_secs(400)); + tracing::info!("resp2 -----------------------------------------------------------"); let resp2 = client.get("/latest/metadata").await.expect("success"); time_source.advance(Duration::from_secs(150)); + tracing::info!("resp3 -----------------------------------------------------------"); let resp3 = client.get("/latest/metadata").await.expect("success"); http_client.assert_requests_match(&[]); assert_eq!("test-imds-output1", resp1.as_ref()); diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index 57c0aeddd14..d91fa3b89f2 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -14,10 +14,11 @@ //! - Retry token loading when it fails //! - Attach the token to the request in the `x-aws-ec2-metadata-token` header +use crate::identity::IdentityCache; use crate::imds::client::error::{ImdsError, TokenError, TokenErrorKind}; -use aws_credential_types::cache::ExpiringCache; use aws_smithy_async::time::SharedTimeSource; use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::expiring_cache::ExpiringCache; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ @@ -50,6 +51,12 @@ const X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS: &str = "x-aws-ec2-metadata-token-ttl const X_AWS_EC2_METADATA_TOKEN: &str = "x-aws-ec2-metadata-token"; const IMDS_TOKEN_AUTH_SCHEME: AuthSchemeId = AuthSchemeId::new(X_AWS_EC2_METADATA_TOKEN); +#[derive(Debug)] +struct TtlToken { + value: HeaderValue, + ttl: Duration, +} + /// IMDS Token #[derive(Clone)] struct Token { @@ -76,20 +83,18 @@ pub(super) struct TokenRuntimePlugin { } impl TokenRuntimePlugin { - pub(super) fn new( - common_plugin: SharedRuntimePlugin, - time_source: SharedTimeSource, - token_ttl: Duration, - ) -> Self { + pub(super) fn new(common_plugin: SharedRuntimePlugin, token_ttl: Duration) -> Self { Self { components: RuntimeComponentsBuilder::new("TokenRuntimePlugin") .with_auth_scheme(TokenAuthScheme::new()) .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![ IMDS_TOKEN_AUTH_SCHEME, ]))) + // The TokenResolver has a cache of its own, so don't use identity caching + .with_identity_cache(Some(IdentityCache::no_cache())) .with_identity_resolver( IMDS_TOKEN_AUTH_SCHEME, - TokenResolver::new(common_plugin, time_source, token_ttl), + TokenResolver::new(common_plugin, token_ttl), ), } } @@ -107,8 +112,7 @@ impl RuntimePlugin for TokenRuntimePlugin { #[derive(Debug)] struct TokenResolverInner { cache: ExpiringCache, - refresh: Operation<(), Token, TokenError>, - time_source: SharedTimeSource, + refresh: Operation<(), TtlToken, TokenError>, } #[derive(Clone, Debug)] @@ -117,11 +121,7 @@ struct TokenResolver { } impl TokenResolver { - fn new( - common_plugin: SharedRuntimePlugin, - time_source: SharedTimeSource, - token_ttl: Duration, - ) -> Self { + fn new(common_plugin: SharedRuntimePlugin, token_ttl: Duration) -> Self { Self { inner: Arc::new(TokenResolverInner { cache: ExpiringCache::new(TOKEN_REFRESH_BUFFER), @@ -141,26 +141,26 @@ impl TokenResolver { .try_into() .unwrap()) }) - .deserializer({ - let time_source = time_source.clone(); - move |response| { - let now = time_source.now(); - parse_token_response(response, now) - .map_err(OrchestratorError::operation) - } + .deserializer(move |response| { + parse_token_response(response).map_err(OrchestratorError::operation) }) .build(), - time_source, }), } } - async fn get_token(&self) -> Result<(Token, SystemTime), ImdsError> { - self.inner - .refresh - .invoke(()) - .await + async fn get_token( + &self, + time_source: SharedTimeSource, + ) -> Result<(Token, SystemTime), ImdsError> { + let result = self.inner.refresh.invoke(()).await; + let now = time_source.now(); + result .map(|token| { + let token = Token { + value: token.value, + expiry: now + token.ttl, + }; let expiry = token.expiry; (token, expiry) }) @@ -168,7 +168,7 @@ impl TokenResolver { } } -fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result { +fn parse_token_response(response: &HttpResponse) -> Result { match response.status().as_u16() { 400 => return Err(TokenErrorKind::InvalidParameters.into()), 403 => return Err(TokenErrorKind::Forbidden.into()), @@ -187,30 +187,38 @@ fn parse_token_response(response: &HttpResponse, now: SystemTime) -> Result( &'a self, - _components: &'a RuntimeComponents, + components: &'a RuntimeComponents, _config_bag: &'a ConfigBag, ) -> IdentityFuture<'a> { + let time_source = components + .time_source() + .expect("time source required for IMDS token caching"); IdentityFuture::new(async { - let preloaded_token = self - .inner - .cache - .yield_or_clear_if_expired(self.inner.time_source.now()) - .await; + let now = time_source.now(); + let preloaded_token = self.inner.cache.yield_or_clear_if_expired(now).await; let token = match preloaded_token { - Some(token) => Ok(token), + Some(token) => { + tracing::trace!( + buffer_time=?TOKEN_REFRESH_BUFFER, + expiration=?token.expiry, + now=?now, + "loaded IMDS token from cache"); + Ok(token) + } None => { + tracing::debug!("IMDS token cache miss"); self.inner .cache - .get_or_load(|| async { self.get_token().await }) + .get_or_load(|| async { self.get_token(time_source).await }) .await } }?; diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index a12dea2a3b0..c0cec0cfcdf 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -102,6 +102,12 @@ pub use aws_types::{ /// Load default sources for all configuration with override support pub use loader::ConfigLoader; +/// Types for configuring identity caching. +pub mod identity { + pub use aws_smithy_runtime::client::identity::IdentityCache; + pub use aws_smithy_runtime::client::identity::LazyCacheBuilder; +} + #[allow(dead_code)] const PKG_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -155,11 +161,11 @@ mod loader { use crate::meta::region::ProvideRegion; use crate::profile::profile_file::ProfileFiles; use crate::provider_config::ProviderConfig; - use aws_credential_types::cache::CredentialsCache; use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; @@ -189,7 +195,7 @@ mod loader { #[derive(Default, Debug)] pub struct ConfigLoader { app_name: Option, - credentials_cache: Option, + identity_cache: Option, credentials_provider: CredentialsProviderOption, endpoint_url: Option, region: Option>, @@ -333,22 +339,45 @@ mod loader { self } - /// Override the credentials cache used to build [`SdkConfig`](aws_types::SdkConfig). + /// The credentials cache has been replaced. Use the identity_cache() method instead. See its rustdoc for an example. + #[deprecated( + note = "The credentials cache has been replaced. Use the identity_cache() method instead for equivalent functionality. See its rustdoc for an example." + )] + pub fn credentials_cache(self) -> Self { + self + } + + /// Override the identity cache used to build [`SdkConfig`](aws_types::SdkConfig). + /// + /// The identity cache caches AWS credentials and SSO tokens. By default, a lazy cache is used + /// that will load credentials upon first request, cache them, and then reload them during + /// another request when they are close to expiring. /// /// # Examples /// - /// Override the credentials cache but load the default value for region: + /// Change a setting on the default lazy caching implementation: /// ```no_run - /// # use aws_credential_types::cache::CredentialsCache; + /// use aws_config::identity::IdentityCache; + /// use std::time::Duration; + /// /// # async fn create_config() { /// let config = aws_config::from_env() - /// .credentials_cache(CredentialsCache::lazy()) + /// .identity_cache( + /// IdentityCache::lazy() + /// // Change the load timeout to 10 seconds. + /// // Note: there are other timeouts that could trigger if the load timeout is too long. + /// .load_timeout(Duration::from_secs(10)) + /// .build() + /// ) /// .load() /// .await; /// # } /// ``` - pub fn credentials_cache(mut self, credentials_cache: CredentialsCache) -> Self { - self.credentials_cache = Some(credentials_cache); + pub fn identity_cache( + mut self, + identity_cache: impl ResolveCachedIdentity + 'static, + ) -> Self { + self.identity_cache = Some(identity_cache.into_shared()); self } @@ -656,17 +685,6 @@ mod loader { CredentialsProviderOption::ExplicitlyUnset => None, }; - let credentials_cache = if credentials_provider.is_some() { - Some(self.credentials_cache.unwrap_or_else(|| { - let mut builder = - CredentialsCache::lazy_builder().time_source(conf.time_source()); - builder.set_sleep_impl(conf.sleep_impl()); - builder.into_credentials_cache() - })) - } else { - None - }; - let mut builder = SdkConfig::builder() .region(region) .retry_config(retry_config) @@ -675,7 +693,7 @@ mod loader { builder.set_http_client(self.http_client); builder.set_app_name(app_name); - builder.set_credentials_cache(credentials_cache); + builder.set_identity_cache(self.identity_cache); builder.set_credentials_provider(credentials_provider); builder.set_sleep_impl(sleep_impl); builder.set_endpoint_url(self.endpoint_url); @@ -705,13 +723,11 @@ mod loader { use crate::{from_env, ConfigLoader}; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_async::time::{StaticTimeSource, TimeSource}; use aws_smithy_runtime::client::http::test_util::{infallible_client_fn, NeverClient}; use aws_types::app_name::AppName; use aws_types::os_shim_internal::{Env, Fs}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; - use std::time::{SystemTime, UNIX_EPOCH}; use tracing_test::traced_test; #[tokio::test] @@ -800,7 +816,7 @@ mod loader { #[tokio::test] async fn disable_default_credentials() { let config = from_env().no_credentials().load().await; - assert!(config.credentials_cache().is_none()); + assert!(config.identity_cache().is_none()); assert!(config.credentials_provider().is_none()); } @@ -827,35 +843,5 @@ mod loader { let num_requests = num_requests.load(Ordering::Relaxed); assert!(num_requests > 0, "{}", num_requests); } - - #[tokio::test] - async fn time_source_is_passed() { - #[derive(Debug)] - struct PanicTs; - impl TimeSource for PanicTs { - fn now(&self) -> SystemTime { - panic!("timesource-was-used") - } - } - let config = from_env() - .sleep_impl(InstantSleep) - .time_source(StaticTimeSource::new(UNIX_EPOCH)) - .http_client(no_traffic_client()) - .load() - .await; - // assert that the innards contain the customized fields - for inner in ["InstantSleep", "StaticTimeSource"] { - assert!( - format!("{:#?}", config.credentials_cache()).contains(inner), - "{:#?}", - config.credentials_cache() - ); - assert!( - format!("{:#?}", config.credentials_provider()).contains(inner), - "{:#?}", - config.credentials_cache() - ); - } - } } } diff --git a/aws/rust-runtime/aws-config/src/sso/credentials.rs b/aws/rust-runtime/aws-config/src/sso/credentials.rs index 15e57546c52..fbf7ff45533 100644 --- a/aws/rust-runtime/aws-config/src/sso/credentials.rs +++ b/aws/rust-runtime/aws-config/src/sso/credentials.rs @@ -11,9 +11,9 @@ //! This provider is included automatically when profiles are loaded. use super::cache::load_cached_token; +use crate::identity::IdentityCache; use crate::provider_config::ProviderConfig; use crate::sso::SsoTokenProvider; -use aws_credential_types::cache::CredentialsCache; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; use aws_credential_types::Credentials; use aws_sdk_sso::types::RoleCredentials; @@ -253,7 +253,7 @@ async fn load_sso_credentials( let config = sdk_config .to_builder() .region(sso_provider_config.region.clone()) - .credentials_cache(CredentialsCache::no_caching()) + .identity_cache(IdentityCache::no_cache()) .build(); // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed let client = SsoClient::new(&config); diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs index 11870a241fa..b4546cd7696 100644 --- a/aws/rust-runtime/aws-config/src/sso/token.rs +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -10,14 +10,15 @@ //! //! This provider is included automatically when profiles are loaded. +use crate::identity::IdentityCache; use crate::sso::cache::{ load_cached_token, save_cached_token, CachedSsoToken, CachedSsoTokenError, }; -use aws_credential_types::cache::{CredentialsCache, ExpiringCache}; use aws_sdk_ssooidc::error::DisplayErrorContext; use aws_sdk_ssooidc::operation::create_token::CreateTokenOutput; use aws_sdk_ssooidc::Client as SsoOidcClient; use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime::expiring_cache::ExpiringCache; use aws_smithy_runtime_api::client::identity::http::Token; use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -74,7 +75,7 @@ impl SsoTokenProvider { .sdk_config .to_builder() .region(Some(inner.region.clone())) - .credentials_cache(CredentialsCache::no_caching()) + .identity_cache(IdentityCache::no_cache()) .build(); let client = SsoOidcClient::new(&config); let resp = client diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 112358ec907..293951b37b0 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -5,7 +5,6 @@ //! Assume credentials for a role through the AWS Security Token Service (STS). -use aws_credential_types::cache::CredentialsCache; use aws_credential_types::provider::{ self, error::CredentialsError, future, ProvideCredentials, SharedCredentialsProvider, }; @@ -14,6 +13,7 @@ use aws_sdk_sts::operation::assume_role::AssumeRoleError; use aws_sdk_sts::types::PolicyDescriptorType; use aws_sdk_sts::Client as StsClient; use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::identity::IdentityCache; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::region::Region; use aws_types::SdkConfig; @@ -100,10 +100,7 @@ pub struct AssumeRoleProviderBuilder { session_length: Option, policy: Option, policy_arns: Option>, - region_override: Option, - - credentials_cache: Option, sdk_config: Option, } @@ -118,7 +115,6 @@ impl AssumeRoleProviderBuilder { pub fn new(role: impl Into) -> Self { Self { role_arn: role.into(), - credentials_cache: None, external_id: None, session_name: None, session_length: None, @@ -196,18 +192,6 @@ impl AssumeRoleProviderBuilder { self } - #[deprecated( - note = "This should not be necessary as the default, no caching, is usually what you want." - )] - /// Set the [`CredentialsCache`] for credentials retrieved from STS. - /// - /// By default, an [`AssumeRoleProvider`] internally uses `NoCredentialsCache` because the - /// provider itself will be wrapped by `LazyCredentialsCache` when a service client is created. - pub fn credentials_cache(mut self, cache: CredentialsCache) -> Self { - self.credentials_cache = Some(cache); - self - } - /// Sets the configuration used for this provider /// /// This enables overriding the connection used to communicate with STS in addition to other internal @@ -239,13 +223,10 @@ impl AssumeRoleProviderBuilder { Some(conf) => conf, None => crate::load_from_env().await, }; - // ignore a credentials cache set from SdkConfig + // ignore a identity cache set from SdkConfig conf = conf .into_builder() - .credentials_cache( - self.credentials_cache - .unwrap_or(CredentialsCache::no_caching()), - ) + .identity_cache(IdentityCache::no_cache()) .build(); // set a region override if one exists diff --git a/aws/rust-runtime/aws-config/src/test_case.rs b/aws/rust-runtime/aws-config/src/test_case.rs index d567bae89eb..9a8af1ad6a3 100644 --- a/aws/rust-runtime/aws-config/src/test_case.rs +++ b/aws/rust-runtime/aws-config/src/test_case.rs @@ -11,23 +11,18 @@ use aws_smithy_async::rt::sleep::{AsyncSleep, Sleep, TokioSleep}; use aws_smithy_runtime::client::http::test_util::dvr::{ NetworkTraffic, RecordingClient, ReplayingClient, }; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; use aws_types::sdk_config::SharedHttpClient; use serde::Deserialize; use std::collections::HashMap; -use std::env; use std::error::Error; use std::fmt::Debug; use std::future::Future; -use std::io::Write; use std::path::{Path, PathBuf}; -use std::sync::{Arc, Mutex}; use std::time::{Duration, UNIX_EPOCH}; -use tracing::dispatcher::DefaultGuard; -use tracing::Level; -use tracing_subscriber::fmt::TestWriter; /// Test case credentials /// @@ -137,81 +132,6 @@ pub(crate) struct Metadata { name: String, } -// TODO(enableNewSmithyRuntimeCleanup): Replace Tee, capture_test_logs, and Rx with -// the implementations added to aws_smithy_runtime::test_util::capture_test_logs -struct Tee { - buf: Arc>>, - quiet: bool, - inner: W, -} - -/// Capture logs from this test. -/// -/// The logs will be captured until the `DefaultGuard` is dropped. -/// -/// *Why use this instead of traced_test?* -/// This captures _all_ logs, not just logs produced by the current crate. -fn capture_test_logs() -> (DefaultGuard, Rx) { - // it may be helpful to upstream this at some point - let (mut writer, rx) = Tee::stdout(); - if env::var("VERBOSE_TEST_LOGS").is_ok() { - writer.loud(); - } else { - eprintln!("To see full logs from this test set VERBOSE_TEST_LOGS=true"); - } - let subscriber = tracing_subscriber::fmt() - .with_max_level(Level::TRACE) - .with_writer(Mutex::new(writer)) - .finish(); - let guard = tracing::subscriber::set_default(subscriber); - (guard, rx) -} - -struct Rx(Arc>>); -impl Rx { - pub(crate) fn contents(&self) -> String { - String::from_utf8(self.0.lock().unwrap().clone()).unwrap() - } -} - -impl Tee { - fn stdout() -> (Self, Rx) { - let buf: Arc>> = Default::default(); - ( - Tee { - buf: buf.clone(), - quiet: true, - inner: TestWriter::new(), - }, - Rx(buf), - ) - } -} - -impl Tee { - fn loud(&mut self) { - self.quiet = false; - } -} - -impl Write for Tee -where - W: Write, -{ - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.buf.lock().unwrap().extend_from_slice(buf); - if !self.quiet { - self.inner.write(buf) - } else { - Ok(buf.len()) - } - } - - fn flush(&mut self) -> std::io::Result<()> { - self.inner.flush() - } -} - impl TestEnvironment { pub(crate) async fn from_dir(dir: impl AsRef) -> Result> { let dir = dir.as_ref(); diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index ac5886fa73d..ec4ebea5559 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -15,20 +15,11 @@ test-util = [] aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } -fastrand = "2.0.0" -tokio = { version = "1.23.1", features = ["sync"] } -tracing = "0.1" zeroize = "1" [dev-dependencies] -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio", "test-util"] } - -# used to test compatibility -async-trait = "0.1.51" -env_logger = "0.10.0" - +async-trait = "0.1.51" # used to test compatibility tokio = { version = "1.23.1", features = ["full", "test-util", "rt"] } -tracing-test = "0.2.4" [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-credential-types/external-types.toml b/aws/rust-runtime/aws-credential-types/external-types.toml index 88a5088190a..e1d82c7db46 100644 --- a/aws/rust-runtime/aws-credential-types/external-types.toml +++ b/aws/rust-runtime/aws-credential-types/external-types.toml @@ -1,6 +1,7 @@ allowed_external_types = [ "aws_smithy_async::rt::sleep::AsyncSleep", "aws_smithy_async::rt::sleep::SharedAsyncSleep", + "aws_smithy_runtime_api::client::identity::ResolveIdentity", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", diff --git a/aws/rust-runtime/aws-credential-types/src/cache.rs b/aws/rust-runtime/aws-credential-types/src/cache.rs deleted file mode 100644 index a1351d0f9ca..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache.rs +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types and traits for enabling caching - -mod expiring_cache; -mod lazy_caching; -mod no_caching; - -pub use expiring_cache::ExpiringCache; -pub use lazy_caching::Builder as LazyBuilder; -use no_caching::NoCredentialsCache; - -use crate::provider::{future, SharedCredentialsProvider}; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use std::sync::Arc; - -/// Asynchronous Cached Credentials Provider -pub trait ProvideCachedCredentials: Send + Sync + std::fmt::Debug { - /// Returns a future that provides cached credentials. - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a; -} - -/// Credentials cache wrapper that may be shared -/// -/// Newtype wrapper around `ProvideCachedCredentials` that implements `Clone` using an internal -/// `Arc`. -#[derive(Clone, Debug)] -pub struct SharedCredentialsCache(Arc); - -impl SharedCredentialsCache { - /// Create a new `SharedCredentialsCache` from `ProvideCachedCredentials` - /// - /// The given `cache` will be wrapped in an internal `Arc`. If your - /// cache is already in an `Arc`, use `SharedCredentialsCache::from(cache)` instead. - pub fn new(provider: impl ProvideCachedCredentials + 'static) -> Self { - Self(Arc::new(provider)) - } -} - -impl AsRef for SharedCredentialsCache { - fn as_ref(&self) -> &(dyn ProvideCachedCredentials + 'static) { - self.0.as_ref() - } -} - -impl From> for SharedCredentialsCache { - fn from(cache: Arc) -> Self { - SharedCredentialsCache(cache) - } -} - -impl ProvideCachedCredentials for SharedCredentialsCache { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - self.0.provide_cached_credentials() - } -} - -impl Storable for SharedCredentialsCache { - type Storer = StoreReplace; -} - -#[derive(Clone, Debug)] -pub(crate) enum Inner { - Lazy(lazy_caching::Builder), - NoCaching, -} - -/// `CredentialsCache` allows for configuring and creating a credentials cache. -/// -/// # Examples -/// -/// ```no_run -/// use aws_credential_types::Credentials; -/// use aws_credential_types::cache::CredentialsCache; -/// use aws_credential_types::credential_fn::provide_credentials_fn; -/// use aws_credential_types::provider::SharedCredentialsProvider; -/// -/// let credentials_cache = CredentialsCache::lazy_builder() -/// .into_credentials_cache() -/// .create_cache(SharedCredentialsProvider::new(provide_credentials_fn(|| async { -/// // An async process to retrieve credentials would go here: -/// Ok(Credentials::new( -/// "example", -/// "example", -/// None, -/// None, -/// "my_provider_name" -/// )) -/// }))); -/// ``` -#[derive(Clone, Debug)] -pub struct CredentialsCache { - pub(crate) inner: Inner, -} - -impl CredentialsCache { - /// Creates a [`CredentialsCache`] from the default [`LazyBuilder`]. - pub fn lazy() -> Self { - Self::lazy_builder().into_credentials_cache() - } - - /// Returns the default [`LazyBuilder`]. - pub fn lazy_builder() -> LazyBuilder { - lazy_caching::Builder::new() - } - - /// Creates a [`CredentialsCache`] that offers no caching ability. - pub fn no_caching() -> Self { - Self { - inner: Inner::NoCaching, - } - } - - /// Creates a [`SharedCredentialsCache`] wrapping a concrete caching implementation. - pub fn create_cache(self, provider: SharedCredentialsProvider) -> SharedCredentialsCache { - match self.inner { - Inner::Lazy(builder) => SharedCredentialsCache::new(builder.build(provider)), - Inner::NoCaching => SharedCredentialsCache::new(NoCredentialsCache::new(provider)), - } - } -} - -impl Storable for CredentialsCache { - type Storer = StoreReplace; -} diff --git a/aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs b/aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs deleted file mode 100644 index 67556aad9b3..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::future::Future; -use std::marker::PhantomData; -use std::sync::Arc; -use std::time::{Duration, SystemTime}; -use tokio::sync::{OnceCell, RwLock}; - -/// Expiry-aware cache -/// -/// [`ExpiringCache`] implements two important features: -/// 1. Respect expiry of contents -/// 2. Deduplicate load requests to prevent thundering herds when no value is present. -#[derive(Debug)] -pub struct ExpiringCache { - /// Amount of time before the actual expiration time - /// when the value is considered expired. - buffer_time: Duration, - value: Arc>>, - _phantom: PhantomData, -} - -impl Clone for ExpiringCache { - fn clone(&self) -> Self { - Self { - buffer_time: self.buffer_time, - value: self.value.clone(), - _phantom: Default::default(), - } - } -} - -impl ExpiringCache -where - T: Clone, -{ - /// Creates `ExpiringCache` with the given `buffer_time`. - pub fn new(buffer_time: Duration) -> Self { - ExpiringCache { - buffer_time, - value: Arc::new(RwLock::new(OnceCell::new())), - _phantom: Default::default(), - } - } - - #[cfg(test)] - async fn get(&self) -> Option - where - T: Clone, - { - self.value - .read() - .await - .get() - .cloned() - .map(|(creds, _expiry)| creds) - } - - /// Attempts to refresh the cached value with the given future. - /// If multiple threads attempt to refresh at the same time, one of them will win, - /// and the others will await that thread's result rather than multiple refreshes occurring. - /// The function given to acquire a value future, `f`, will not be called - /// if another thread is chosen to load the value. - pub async fn get_or_load(&self, f: F) -> Result - where - F: FnOnce() -> Fut, - Fut: Future>, - { - let lock = self.value.read().await; - let future = lock.get_or_try_init(f); - future.await.map(|(value, _expiry)| value.clone()) - } - - /// If the value is expired, clears the cache. Otherwise, yields the current value. - pub async fn yield_or_clear_if_expired(&self, now: SystemTime) -> Option { - // Short-circuit if the value is not expired - if let Some((value, expiry)) = self.value.read().await.get() { - if !expired(*expiry, self.buffer_time, now) { - return Some(value.clone()); - } - } - - // Acquire a write lock to clear the cache, but then once the lock is acquired, - // check again that the value is not already cleared. If it has been cleared, - // then another thread is refreshing the cache by the time the write lock was acquired. - let mut lock = self.value.write().await; - if let Some((_value, expiration)) = lock.get() { - // Also check that we're clearing the expired value and not a value - // that has been refreshed by another thread. - if expired(*expiration, self.buffer_time, now) { - *lock = OnceCell::new(); - } - } - None - } -} - -fn expired(expiration: SystemTime, buffer_time: Duration, now: SystemTime) -> bool { - now >= (expiration - buffer_time) -} - -#[cfg(test)] -mod tests { - use super::{expired, ExpiringCache}; - use crate::{provider::error::CredentialsError, Credentials}; - use std::time::{Duration, SystemTime}; - use tracing_test::traced_test; - - fn credentials(expired_secs: u64) -> Result<(Credentials, SystemTime), CredentialsError> { - let expiry = epoch_secs(expired_secs); - let creds = Credentials::new("test", "test", None, Some(expiry), "test"); - Ok((creds, expiry)) - } - - fn epoch_secs(secs: u64) -> SystemTime { - SystemTime::UNIX_EPOCH + Duration::from_secs(secs) - } - - #[test] - fn expired_check() { - let ts = epoch_secs(100); - assert!(expired(ts, Duration::from_secs(10), epoch_secs(1000))); - assert!(expired(ts, Duration::from_secs(10), epoch_secs(90))); - assert!(!expired(ts, Duration::from_secs(10), epoch_secs(10))); - } - - #[traced_test] - #[tokio::test] - async fn cache_clears_if_expired_only() { - let cache = ExpiringCache::new(Duration::from_secs(10)); - assert!(cache - .yield_or_clear_if_expired(epoch_secs(100)) - .await - .is_none()); - - cache - .get_or_load(|| async { credentials(100) }) - .await - .unwrap(); - assert_eq!(Some(epoch_secs(100)), cache.get().await.unwrap().expiry()); - - // It should not clear the credentials if they're not expired - assert_eq!( - Some(epoch_secs(100)), - cache - .yield_or_clear_if_expired(epoch_secs(10)) - .await - .unwrap() - .expiry() - ); - - // It should clear the credentials if they're expired - assert!(cache - .yield_or_clear_if_expired(epoch_secs(500)) - .await - .is_none()); - assert!(cache.get().await.is_none()); - } -} diff --git a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs b/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs deleted file mode 100644 index d919278db8d..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Lazy, credentials cache implementation - -use std::time::Duration; - -use aws_smithy_async::future::timeout::Timeout; -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; -use aws_smithy_async::time::SharedTimeSource; -use tracing::{debug, info, info_span, Instrument}; - -use crate::cache::{ExpiringCache, ProvideCachedCredentials}; -use crate::provider::SharedCredentialsProvider; -use crate::provider::{error::CredentialsError, future, ProvideCredentials}; - -const DEFAULT_LOAD_TIMEOUT: Duration = Duration::from_secs(5); -const DEFAULT_CREDENTIAL_EXPIRATION: Duration = Duration::from_secs(15 * 60); -const DEFAULT_BUFFER_TIME: Duration = Duration::from_secs(10); -const DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = fastrand::f64; - -#[derive(Debug)] -pub(crate) struct LazyCredentialsCache { - time: SharedTimeSource, - sleeper: SharedAsyncSleep, - cache: ExpiringCache, - provider: SharedCredentialsProvider, - load_timeout: Duration, - buffer_time: Duration, - buffer_time_jitter_fraction: fn() -> f64, - default_credential_expiration: Duration, -} - -impl LazyCredentialsCache { - fn new( - time: SharedTimeSource, - sleeper: SharedAsyncSleep, - provider: SharedCredentialsProvider, - load_timeout: Duration, - buffer_time: Duration, - buffer_time_jitter_fraction: fn() -> f64, - default_credential_expiration: Duration, - ) -> Self { - Self { - time, - sleeper, - cache: ExpiringCache::new(buffer_time), - provider, - load_timeout, - buffer_time, - buffer_time_jitter_fraction, - default_credential_expiration, - } - } -} - -impl ProvideCachedCredentials for LazyCredentialsCache { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'_> - where - Self: 'a, - { - let now = self.time.now(); - let provider = self.provider.clone(); - let timeout_future = self.sleeper.sleep(self.load_timeout); - let load_timeout = self.load_timeout; - let cache = self.cache.clone(); - let default_credential_expiration = self.default_credential_expiration; - - future::ProvideCredentials::new(async move { - // Attempt to get cached credentials, or clear the cache if they're expired - if let Some(credentials) = cache.yield_or_clear_if_expired(now).await { - debug!("loaded credentials from cache"); - Ok(credentials) - } else { - // If we didn't get credentials from the cache, then we need to try and load. - // There may be other threads also loading simultaneously, but this is OK - // since the futures are not eagerly executed, and the cache will only run one - // of them. - let future = Timeout::new(provider.provide_credentials(), timeout_future); - let start_time = self.time.now(); - let result = cache - .get_or_load(|| { - let span = info_span!("lazy_load_credentials"); - let provider = provider.clone(); - async move { - let credentials = match future.await { - Ok(creds) => creds?, - Err(_err) => match provider.fallback_on_interrupt() { - Some(creds) => creds, - None => { - return Err(CredentialsError::provider_timed_out( - load_timeout, - )) - } - }, - }; - // If the credentials don't have an expiration time, then create a default one - let expiry = credentials - .expiry() - .unwrap_or(now + default_credential_expiration); - - let jitter = self - .buffer_time - .mul_f64((self.buffer_time_jitter_fraction)()); - - // Logging for cache miss should be emitted here as opposed to after the call to - // `cache.get_or_load` above. In the case of multiple threads concurrently executing - // `cache.get_or_load`, logging inside `cache.get_or_load` ensures that it is emitted - // only once for the first thread that succeeds in populating a cache value. - info!( - "credentials cache miss occurred; added new AWS credentials (took {:?})", - self.time.now().duration_since(start_time) - ); - - Ok((credentials, expiry + jitter)) - } - // Only instrument the the actual load future so that no span - // is opened if the cache decides not to execute it. - .instrument(span) - }) - .await; - debug!("loaded credentials"); - result - } - }) - } -} - -use crate::Credentials; -pub use builder::Builder; - -mod builder { - use std::time::Duration; - - use crate::cache::{CredentialsCache, Inner}; - use crate::provider::SharedCredentialsProvider; - use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; - use aws_smithy_async::time::{SharedTimeSource, TimeSource}; - - use super::{ - LazyCredentialsCache, DEFAULT_BUFFER_TIME, DEFAULT_BUFFER_TIME_JITTER_FRACTION, - DEFAULT_CREDENTIAL_EXPIRATION, DEFAULT_LOAD_TIMEOUT, - }; - use aws_smithy_runtime_api::shared::IntoShared; - - /// Builder for constructing a `LazyCredentialsCache`. - /// - /// `LazyCredentialsCache` implements [`ProvideCachedCredentials`](crate::cache::ProvideCachedCredentials) by caching - /// credentials that it loads by calling a user-provided [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation. - /// - /// For example, you can provide a [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation that calls - /// AWS STS's AssumeRole operation to get temporary credentials, and `LazyCredentialsCache` - /// will cache those credentials until they expire. - /// - /// Callers outside of this crate cannot call `build` directly. They can instead call - /// `into_credentials_cache` to obtain a [`CredentialsCache`]. Its `create_cache` then calls - /// `build` to create a `LazyCredentialsCache`. - #[derive(Clone, Debug, Default)] - pub struct Builder { - sleep_impl: Option, - time_source: Option, - load_timeout: Option, - buffer_time: Option, - buffer_time_jitter_fraction: Option f64>, - default_credential_expiration: Option, - } - - impl Builder { - /// Creates a new builder - pub fn new() -> Self { - Default::default() - } - - /// Implementation of [`AsyncSleep`](aws_smithy_async::rt::sleep::AsyncSleep) to use for timeouts. - /// - /// This enables use of the `LazyCredentialsCache` with other async runtimes. - /// If using Tokio as the async runtime, this should be set to an instance of - /// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep). - pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { - self.set_sleep_impl(Some(sleep_impl.into_shared())); - self - } - - /// Implementation of [`AsyncSleep`](aws_smithy_async::rt::sleep::AsyncSleep) to use for timeouts. - /// - /// This enables use of the `LazyCredentialsCache` with other async runtimes. - /// If using Tokio as the async runtime, this should be set to an instance of - /// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep). - pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { - self.sleep_impl = sleep_impl; - self - } - - #[doc(hidden)] // because they only exist for tests - pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { - self.set_time_source(Some(time_source.into_shared())); - self - } - - #[doc(hidden)] // because they only exist for tests - pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { - self.time_source = time_source; - self - } - - /// Timeout for the given [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation. - /// - /// Defaults to 5 seconds. - pub fn load_timeout(mut self, timeout: Duration) -> Self { - self.set_load_timeout(Some(timeout)); - self - } - - /// Timeout for the given [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation. - /// - /// Defaults to 5 seconds. - pub fn set_load_timeout(&mut self, timeout: Option) -> &mut Self { - self.load_timeout = timeout; - self - } - - /// Amount of time before the actual credential expiration time - /// where credentials are considered expired. - /// - /// For example, if credentials are expiring in 15 minutes, and the buffer time is 10 seconds, - /// then any requests made after 14 minutes and 50 seconds will load new credentials. - /// - /// Defaults to 10 seconds. - pub fn buffer_time(mut self, buffer_time: Duration) -> Self { - self.set_buffer_time(Some(buffer_time)); - self - } - - /// Amount of time before the actual credential expiration time - /// where credentials are considered expired. - /// - /// For example, if credentials are expiring in 15 minutes, and the buffer time is 10 seconds, - /// then any requests made after 14 minutes and 50 seconds will load new credentials. - /// - /// Defaults to 10 seconds. - pub fn set_buffer_time(&mut self, buffer_time: Option) -> &mut Self { - self.buffer_time = buffer_time; - self - } - - /// A random percentage by which buffer time is jittered for randomization. - /// - /// For example, if credentials are expiring in 15 minutes, the buffer time is 10 seconds, - /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. - /// Therefore, any requests made after 14 minutes and 52 seconds will load new credentials. - /// - /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. - #[cfg(feature = "test-util")] - pub fn buffer_time_jitter_fraction( - mut self, - buffer_time_jitter_fraction: fn() -> f64, - ) -> Self { - self.set_buffer_time_jitter_fraction(Some(buffer_time_jitter_fraction)); - self - } - - /// A random percentage by which buffer time is jittered for randomization. - /// - /// For example, if credentials are expiring in 15 minutes, the buffer time is 10 seconds, - /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. - /// Therefore, any requests made after 14 minutes and 52 seconds will load new credentials. - /// - /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. - #[cfg(feature = "test-util")] - pub fn set_buffer_time_jitter_fraction( - &mut self, - buffer_time_jitter_fraction: Option f64>, - ) -> &mut Self { - self.buffer_time_jitter_fraction = buffer_time_jitter_fraction; - self - } - - /// Default expiration time to set on credentials if they don't have an expiration time. - /// - /// This is only used if the given [`ProvideCredentials`](crate::provider::ProvideCredentials) returns - /// [`Credentials`](crate::Credentials) that don't have their `expiry` set. - /// This must be at least 15 minutes. - /// - /// Defaults to 15 minutes. - pub fn default_credential_expiration(mut self, duration: Duration) -> Self { - self.set_default_credential_expiration(Some(duration)); - self - } - - /// Default expiration time to set on credentials if they don't have an expiration time. - /// - /// This is only used if the given [`ProvideCredentials`](crate::provider::ProvideCredentials) returns - /// [`Credentials`](crate::Credentials) that don't have their `expiry` set. - /// This must be at least 15 minutes. - /// - /// Defaults to 15 minutes. - pub fn set_default_credential_expiration( - &mut self, - duration: Option, - ) -> &mut Self { - self.default_credential_expiration = duration; - self - } - - /// Converts [`Builder`] into [`CredentialsCache`]. - pub fn into_credentials_cache(self) -> CredentialsCache { - CredentialsCache { - inner: Inner::Lazy(self), - } - } - - /// Creates the [`LazyCredentialsCache`] with the passed-in `provider`. - /// - /// # Panics - /// This will panic if no `sleep` implementation is given and if no default crate features - /// are used. By default, the [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep) - /// implementation will be set automatically. - pub(crate) fn build(self, provider: SharedCredentialsProvider) -> LazyCredentialsCache { - let default_credential_expiration = self - .default_credential_expiration - .unwrap_or(DEFAULT_CREDENTIAL_EXPIRATION); - assert!( - default_credential_expiration >= DEFAULT_CREDENTIAL_EXPIRATION, - "default_credential_expiration must be at least 15 minutes" - ); - LazyCredentialsCache::new( - self.time_source.unwrap_or_default(), - self.sleep_impl.unwrap_or_else(|| { - default_async_sleep().expect("no default sleep implementation available") - }), - provider, - self.load_timeout.unwrap_or(DEFAULT_LOAD_TIMEOUT), - self.buffer_time.unwrap_or(DEFAULT_BUFFER_TIME), - self.buffer_time_jitter_fraction - .unwrap_or(DEFAULT_BUFFER_TIME_JITTER_FRACTION), - default_credential_expiration, - ) - } - } -} - -#[cfg(test)] -mod tests { - use std::sync::{Arc, Mutex}; - use std::time::{Duration, SystemTime, UNIX_EPOCH}; - - use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_async::test_util::{instant_time_and_sleep, ManualTimeSource}; - use aws_smithy_async::time::{SharedTimeSource, TimeSource}; - use tracing::info; - use tracing_test::traced_test; - - use crate::provider::SharedCredentialsProvider; - use crate::{ - cache::ProvideCachedCredentials, credential_fn::provide_credentials_fn, - provider::error::CredentialsError, Credentials, - }; - - use super::{ - LazyCredentialsCache, DEFAULT_BUFFER_TIME, DEFAULT_CREDENTIAL_EXPIRATION, - DEFAULT_LOAD_TIMEOUT, - }; - - const BUFFER_TIME_NO_JITTER: fn() -> f64 = || 0_f64; - - fn test_provider( - time: impl TimeSource + 'static, - buffer_time_jitter_fraction: fn() -> f64, - load_list: Vec, - ) -> LazyCredentialsCache { - let load_list = Arc::new(Mutex::new(load_list)); - LazyCredentialsCache::new( - SharedTimeSource::new(time), - SharedAsyncSleep::new(TokioSleep::new()), - SharedCredentialsProvider::new(provide_credentials_fn(move || { - let list = load_list.clone(); - async move { - let mut list = list.lock().unwrap(); - if list.len() > 0 { - let next = list.remove(0); - info!("refreshing the credentials to {:?}", next); - next - } else { - drop(list); - panic!("no more credentials") - } - } - })), - DEFAULT_LOAD_TIMEOUT, - DEFAULT_BUFFER_TIME, - buffer_time_jitter_fraction, - DEFAULT_CREDENTIAL_EXPIRATION, - ) - } - - fn epoch_secs(secs: u64) -> SystemTime { - SystemTime::UNIX_EPOCH + Duration::from_secs(secs) - } - - fn credentials(expired_secs: u64) -> Credentials { - Credentials::new("test", "test", None, Some(epoch_secs(expired_secs)), "test") - } - - async fn expect_creds(expired_secs: u64, provider: &LazyCredentialsCache) { - let creds = provider - .provide_cached_credentials() - .await - .expect("expected credentials"); - assert_eq!(Some(epoch_secs(expired_secs)), creds.expiry()); - } - - #[traced_test] - #[tokio::test] - async fn initial_populate_credentials() { - let time = ManualTimeSource::new(UNIX_EPOCH); - let provider = SharedCredentialsProvider::new(provide_credentials_fn(|| async { - info!("refreshing the credentials"); - Ok(credentials(1000)) - })); - let credentials_cache = LazyCredentialsCache::new( - SharedTimeSource::new(time), - SharedAsyncSleep::new(TokioSleep::new()), - provider, - DEFAULT_LOAD_TIMEOUT, - DEFAULT_BUFFER_TIME, - BUFFER_TIME_NO_JITTER, - DEFAULT_CREDENTIAL_EXPIRATION, - ); - assert_eq!( - epoch_secs(1000), - credentials_cache - .provide_cached_credentials() - .await - .unwrap() - .expiry() - .unwrap() - ); - } - - #[traced_test] - #[tokio::test] - async fn reload_expired_credentials() { - let time = ManualTimeSource::new(epoch_secs(100)); - let credentials_cache = test_provider( - time.clone(), - BUFFER_TIME_NO_JITTER, - vec![ - Ok(credentials(1000)), - Ok(credentials(2000)), - Ok(credentials(3000)), - ], - ); - - expect_creds(1000, &credentials_cache).await; - expect_creds(1000, &credentials_cache).await; - time.set_time(epoch_secs(1500)); - expect_creds(2000, &credentials_cache).await; - expect_creds(2000, &credentials_cache).await; - time.set_time(epoch_secs(2500)); - expect_creds(3000, &credentials_cache).await; - expect_creds(3000, &credentials_cache).await; - } - - #[traced_test] - #[tokio::test] - async fn load_failed_error() { - let time = ManualTimeSource::new(epoch_secs(100)); - let credentials_cache = test_provider( - time.clone(), - BUFFER_TIME_NO_JITTER, - vec![ - Ok(credentials(1000)), - Err(CredentialsError::not_loaded("failed")), - ], - ); - - expect_creds(1000, &credentials_cache).await; - time.set_time(epoch_secs(1500)); - assert!(credentials_cache - .provide_cached_credentials() - .await - .is_err()); - } - - #[traced_test] - #[test] - fn load_contention() { - let rt = tokio::runtime::Builder::new_multi_thread() - .enable_time() - .worker_threads(16) - .build() - .unwrap(); - - let time = ManualTimeSource::new(epoch_secs(0)); - let credentials_cache = Arc::new(test_provider( - time.clone(), - BUFFER_TIME_NO_JITTER, - vec![ - Ok(credentials(500)), - Ok(credentials(1500)), - Ok(credentials(2500)), - Ok(credentials(3500)), - Ok(credentials(4500)), - ], - )); - - // credentials are available up until 4500 seconds after the unix epoch - // 4*50 = 200 tasks are launched => we can advance time 4500/20 => 225 seconds per advance - for _ in 0..4 { - let mut tasks = Vec::new(); - for _ in 0..50 { - let credentials_cache = credentials_cache.clone(); - let time = time.clone(); - tasks.push(rt.spawn(async move { - let now = time.advance(Duration::from_secs(22)); - - let creds = credentials_cache - .provide_cached_credentials() - .await - .unwrap(); - assert!( - creds.expiry().unwrap() >= now, - "{:?} >= {:?}", - creds.expiry(), - now - ); - })); - } - for task in tasks { - rt.block_on(task).unwrap(); - } - } - } - - #[tokio::test] - #[traced_test] - async fn load_timeout() { - let (time, sleep) = instant_time_and_sleep(epoch_secs(100)); - let credentials_cache = LazyCredentialsCache::new( - SharedTimeSource::new(time.clone()), - SharedAsyncSleep::new(sleep), - SharedCredentialsProvider::new(provide_credentials_fn(|| async { - aws_smithy_async::future::never::Never::new().await; - Ok(credentials(1000)) - })), - Duration::from_secs(5), - DEFAULT_BUFFER_TIME, - BUFFER_TIME_NO_JITTER, - DEFAULT_CREDENTIAL_EXPIRATION, - ); - - assert!(matches!( - credentials_cache.provide_cached_credentials().await, - Err(CredentialsError::ProviderTimedOut { .. }) - )); - assert_eq!(time.now(), epoch_secs(105)); - } - - #[tokio::test] - async fn buffer_time_jitter() { - let time = ManualTimeSource::new(epoch_secs(100)); - let buffer_time_jitter_fraction = || 0.5_f64; - let credentials_cache = test_provider( - time.clone(), - buffer_time_jitter_fraction, - vec![Ok(credentials(1000)), Ok(credentials(2000))], - ); - - expect_creds(1000, &credentials_cache).await; - let buffer_time_with_jitter = - (DEFAULT_BUFFER_TIME.as_secs_f64() * buffer_time_jitter_fraction()) as u64; - assert_eq!(buffer_time_with_jitter, 5); - // Advance time to the point where the first credentials are about to expire (but haven't). - let almost_expired_secs = 1000 - buffer_time_with_jitter - 1; - time.set_time(epoch_secs(almost_expired_secs)); - // We should still use the first credentials. - expect_creds(1000, &credentials_cache).await; - // Now let the first credentials expire. - let expired_secs = almost_expired_secs + 1; - time.set_time(epoch_secs(expired_secs)); - // Now that the first credentials have been expired, the second credentials will be retrieved. - expect_creds(2000, &credentials_cache).await; - } -} diff --git a/aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs b/aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs deleted file mode 100644 index 5827f5cea12..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Credentials cache that offers no caching ability - -use crate::cache::ProvideCachedCredentials; -use crate::provider::SharedCredentialsProvider; -use crate::provider::{future, ProvideCredentials}; -use tracing::debug; - -#[derive(Debug)] -pub(crate) struct NoCredentialsCache { - provider: SharedCredentialsProvider, -} - -impl NoCredentialsCache { - pub(crate) fn new(provider: SharedCredentialsProvider) -> Self { - Self { provider } - } -} - -impl ProvideCachedCredentials for NoCredentialsCache { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'_> - where - Self: 'a, - { - debug!("Delegating `provide_cached_credentials` to `provide_credentials` on the provider"); - self.provider.provide_credentials() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::credential_fn::provide_credentials_fn; - use crate::Credentials; - use std::sync::{Arc, Mutex}; - use std::time::{Duration, SystemTime}; - - fn test_provider(load_list: Vec) -> NoCredentialsCache { - let load_list = Arc::new(Mutex::new(load_list)); - NoCredentialsCache::new(SharedCredentialsProvider::new(provide_credentials_fn( - move || { - let list = load_list.clone(); - async move { - let next = list.lock().unwrap().remove(0); - next - } - }, - ))) - } - - fn epoch_secs(secs: u64) -> SystemTime { - SystemTime::UNIX_EPOCH + Duration::from_secs(secs) - } - - fn credentials(expired_secs: u64) -> Credentials { - Credentials::new("test", "test", None, Some(epoch_secs(expired_secs)), "test") - } - - async fn expect_creds(expired_secs: u64, provider: &NoCredentialsCache) { - let creds = provider - .provide_cached_credentials() - .await - .expect("expected credentials"); - assert_eq!(Some(epoch_secs(expired_secs)), creds.expiry()); - } - - #[tokio::test] - async fn no_caching() { - let credentials_cache = test_provider(vec![ - Ok(credentials(1000)), - Ok(credentials(2000)), - Ok(credentials(3000)), - ]); - - expect_creds(1000, &credentials_cache).await; - expect_creds(2000, &credentials_cache).await; - expect_creds(3000, &credentials_cache).await; - } -} diff --git a/aws/rust-runtime/aws-credential-types/src/lib.rs b/aws/rust-runtime/aws-credential-types/src/lib.rs index de662f6a50d..58a3148eb8e 100644 --- a/aws/rust-runtime/aws-credential-types/src/lib.rs +++ b/aws/rust-runtime/aws-credential-types/src/lib.rs @@ -17,7 +17,6 @@ unreachable_pub )] -pub mod cache; pub mod credential_fn; mod credentials_impl; pub mod provider; diff --git a/aws/rust-runtime/aws-credential-types/src/provider.rs b/aws/rust-runtime/aws-credential-types/src/provider.rs index 9be88b590fd..35c6f914482 100644 --- a/aws/rust-runtime/aws-credential-types/src/provider.rs +++ b/aws/rust-runtime/aws-credential-types/src/provider.rs @@ -72,7 +72,9 @@ construct credentials from hardcoded values. //! ``` use crate::Credentials; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::sync::Arc; /// Credentials provider errors @@ -355,3 +357,17 @@ impl ProvideCredentials for SharedCredentialsProvider { impl Storable for SharedCredentialsProvider { type Storer = StoreReplace; } + +impl ResolveIdentity for SharedCredentialsProvider { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::new(async move { Ok(self.provide_credentials().await?.into()) }) + } + + fn fallback_on_interrupt(&self) -> Option { + ProvideCredentials::fallback_on_interrupt(self).map(|creds| creds.into()) + } +} diff --git a/aws/rust-runtime/aws-inlineable/src/lib.rs b/aws/rust-runtime/aws-inlineable/src/lib.rs index 05679f1f294..71858b23249 100644 --- a/aws/rust-runtime/aws-inlineable/src/lib.rs +++ b/aws/rust-runtime/aws-inlineable/src/lib.rs @@ -22,9 +22,6 @@ /// Interceptors for API Gateway pub mod apigateway_interceptors; -/// Stub credentials provider for use when no credentials provider is used. -pub mod no_credentials; - /// Support types required for adding presigning to an operation in a generated service. pub mod presigning; diff --git a/aws/rust-runtime/aws-inlineable/src/no_credentials.rs b/aws/rust-runtime/aws-inlineable/src/no_credentials.rs deleted file mode 100644 index d58386b31b1..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/no_credentials.rs +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_credential_types::provider::{error::CredentialsError, future, ProvideCredentials}; - -/// Stub credentials provider for use when no credentials provider is used. -#[non_exhaustive] -#[derive(Debug)] -pub struct NoCredentials; - -impl ProvideCredentials for NoCredentials { - fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::ready(Err(CredentialsError::not_loaded( - "No credentials provider was enabled for the service. \ - hint: use aws-config to provide a credentials chain.", - ))) - } -} diff --git a/aws/rust-runtime/aws-runtime/src/identity.rs b/aws/rust-runtime/aws-runtime/src/identity.rs deleted file mode 100644 index 3f2753cc16f..00000000000 --- a/aws/rust-runtime/aws-runtime/src/identity.rs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -/// Credentials-based identity support. -pub mod credentials { - use aws_credential_types::cache::SharedCredentialsCache; - use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; - use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; - use aws_smithy_types::config_bag::ConfigBag; - - /// Smithy identity resolver for AWS credentials. - #[derive(Debug)] - pub struct CredentialsIdentityResolver { - credentials_cache: SharedCredentialsCache, - } - - impl CredentialsIdentityResolver { - /// Creates a new `CredentialsIdentityResolver`. - pub fn new(credentials_cache: SharedCredentialsCache) -> Self { - Self { credentials_cache } - } - } - - impl ResolveIdentity for CredentialsIdentityResolver { - fn resolve_identity<'a>( - &'a self, - _runtime_components: &'a RuntimeComponents, - _config_bag: &'a ConfigBag, - ) -> IdentityFuture<'a> { - let cache = self.credentials_cache.clone(); - IdentityFuture::new(async move { - let credentials = cache.as_ref().provide_cached_credentials().await?; - let expiration = credentials.expiry(); - Ok(Identity::new(credentials, expiration)) - }) - } - } -} diff --git a/aws/rust-runtime/aws-runtime/src/lib.rs b/aws/rust-runtime/aws-runtime/src/lib.rs index 6ad3cec3567..085ec4fc975 100644 --- a/aws/rust-runtime/aws-runtime/src/lib.rs +++ b/aws/rust-runtime/aws-runtime/src/lib.rs @@ -16,9 +16,6 @@ /// Supporting code for authentication in the AWS SDK. pub mod auth; -/// Supporting code for identity in the AWS SDK. -pub mod identity; - /// Supporting code for recursion detection in the AWS SDK. pub mod recursion_detection; diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index ca858840655..e5e613b5ae9 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -7,6 +7,8 @@ allowed_external_types = [ "aws_smithy_async::time::TimeSource", "aws_smithy_runtime_api::client::http::HttpClient", "aws_smithy_runtime_api::client::http::SharedHttpClient", + "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", + "aws_smithy_runtime_api::client::identity::SharedIdentityCache", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index e97a58cc3d1..4538a4bd311 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -13,13 +13,13 @@ use crate::app_name::AppName; use crate::docs_for; use crate::region::Region; -pub use aws_credential_types::cache::CredentialsCache; pub use aws_credential_types::provider::SharedCredentialsProvider; use aws_smithy_async::rt::sleep::AsyncSleep; pub use aws_smithy_async::rt::sleep::SharedAsyncSleep; pub use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use aws_smithy_runtime_api::client::http::HttpClient; pub use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; use aws_smithy_runtime_api::shared::IntoShared; pub use aws_smithy_types::retry::RetryConfig; pub use aws_smithy_types::timeout::TimeoutConfig; @@ -51,7 +51,7 @@ these services, this setting has no effect" #[derive(Debug, Clone)] pub struct SdkConfig { app_name: Option, - credentials_cache: Option, + identity_cache: Option, credentials_provider: Option, region: Option, endpoint_url: Option, @@ -72,7 +72,7 @@ pub struct SdkConfig { #[derive(Debug, Default)] pub struct Builder { app_name: Option, - credentials_cache: Option, + identity_cache: Option, credentials_provider: Option, region: Option, endpoint_url: Option, @@ -296,40 +296,64 @@ impl Builder { self } - /// Set the [`CredentialsCache`] for the builder + /// Set the identity cache for caching credentials and SSO tokens. + /// + /// The default identity cache will wait until the first request that requires authentication + /// to load an identity. Once the identity is loaded, it is cached until shortly before it + /// expires. /// /// # Examples + /// Disabling identity caching: /// ```rust - /// use aws_credential_types::cache::CredentialsCache; - /// use aws_types::SdkConfig; + /// # use aws_types::SdkConfig; + /// use aws_smithy_runtime::client::identity::IdentityCache; /// let config = SdkConfig::builder() - /// .credentials_cache(CredentialsCache::lazy()) + /// .identity_cache(IdentityCache::no_cache()) /// .build(); /// ``` - pub fn credentials_cache(mut self, cache: CredentialsCache) -> Self { - self.set_credentials_cache(Some(cache)); + /// Changing settings on the default cache implementation: + /// ```rust + /// # use aws_types::SdkConfig; + /// use aws_smithy_runtime::client::identity::IdentityCache; + /// use std::time::Duration; + /// + /// let config = SdkConfig::builder() + /// .identity_cache( + /// IdentityCache::lazy() + /// .load_timeout(Duration::from_secs(10)) + /// .build() + /// ) + /// .build(); + /// ``` + pub fn identity_cache(mut self, cache: impl ResolveCachedIdentity + 'static) -> Self { + self.set_identity_cache(Some(cache.into_shared())); self } - /// Set the [`CredentialsCache`] for the builder + /// Set the identity cache for caching credentials and SSO tokens. + /// + /// The default identity cache will wait until the first request that requires authentication + /// to load an identity. Once the identity is loaded, it is cached until shortly before it + /// expires. /// /// # Examples /// ```rust - /// use aws_credential_types::cache::CredentialsCache; - /// use aws_types::SdkConfig; - /// fn override_credentials_cache() -> bool { + /// # use aws_types::SdkConfig; + /// use aws_smithy_runtime::client::identity::IdentityCache; + /// + /// fn override_identity_cache() -> bool { /// // ... /// # true /// } /// /// let mut builder = SdkConfig::builder(); - /// if override_credentials_cache() { - /// builder.set_credentials_cache(Some(CredentialsCache::lazy())); + /// if override_identity_cache() { + /// builder.set_identity_cache(Some(IdentityCache::lazy().build())); /// } /// let config = builder.build(); /// ``` - pub fn set_credentials_cache(&mut self, cache: Option) -> &mut Self { - self.credentials_cache = cache; + pub fn set_identity_cache(&mut self, cache: Option) -> &mut Self { + self.identity_cache = cache; self } @@ -516,7 +540,7 @@ impl Builder { pub fn build(self) -> SdkConfig { SdkConfig { app_name: self.app_name, - credentials_cache: self.credentials_cache, + identity_cache: self.identity_cache, credentials_provider: self.credentials_provider, region: self.region, endpoint_url: self.endpoint_url, @@ -558,9 +582,9 @@ impl SdkConfig { self.sleep_impl.clone() } - /// Configured credentials cache - pub fn credentials_cache(&self) -> Option<&CredentialsCache> { - self.credentials_cache.as_ref() + /// Configured identity cache + pub fn identity_cache(&self) -> Option { + self.identity_cache.clone() } /// Configured credentials provider @@ -611,7 +635,7 @@ impl SdkConfig { pub fn into_builder(self) -> Builder { Builder { app_name: self.app_name, - credentials_cache: self.credentials_cache, + identity_cache: self.identity_cache, credentials_provider: self.credentials_provider, region: self.region, endpoint_url: self.endpoint_url, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt index 8a63872df17..59ef326a2fd 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt @@ -29,7 +29,6 @@ import software.amazon.smithy.rustsdk.endpoints.RequireEndpointRules val DECORATORS: List = listOf( // General AWS Decorators listOf( - CredentialsCacheDecorator(), CredentialsProviderDecorator(), RegionDecorator(), RequireEndpointRules(), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt deleted file mode 100644 index 51f88d2401a..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization -import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization - -class CredentialsCacheDecorator : ClientCodegenDecorator { - override val name: String = "CredentialsCache" - override val order: Byte = 0 - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List { - return baseCustomizations + CredentialCacheConfig(codegenContext) - } - - override fun extraSections(codegenContext: ClientCodegenContext): List = - listOf( - adhocCustomization { section -> - rust("${section.serviceConfigBuilder}.set_credentials_cache(${section.sdkConfig}.credentials_cache().cloned());") - }, - ) -} - -/** - * Add a `.credentials_cache` field and builder to the `Config` for a given service - */ -class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val codegenScope = arrayOf( - *preludeScope, - "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("cache::CredentialsCache"), - "CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("identity::credentials::CredentialsIdentityResolver"), - "DefaultProvider" to defaultProvider(), - "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve("auth::sigv4::SCHEME_ID"), - "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::SharedCredentialsCache"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::SharedCredentialsProvider"), - "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::identity::SharedIdentityResolver"), - ) - - override fun section(section: ServiceConfig) = writable { - when (section) { - ServiceConfig.ConfigImpl -> { - rustTemplate( - """ - /// Returns the credentials cache. - pub fn credentials_cache(&self) -> #{Option}<#{SharedCredentialsCache}> { - self.config.load::<#{SharedCredentialsCache}>().cloned() - } - """, - *codegenScope, - ) - } - - ServiceConfig.BuilderImpl -> { - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn credentials_cache(mut self, credentials_cache: #{CredentialsCache}) -> Self { - self.set_credentials_cache(#{Some}(credentials_cache)); - self - } - - """, - *codegenScope, - ) - - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn set_credentials_cache(&mut self, credentials_cache: #{Option}<#{CredentialsCache}>) -> &mut Self { - self.config.store_or_unset(credentials_cache); - self - } - """, - *codegenScope, - ) - } - - ServiceConfig.BuilderBuild -> { - rustTemplate( - """ - if let Some(credentials_provider) = layer.load::<#{SharedCredentialsProvider}>().cloned() { - let cache_config = layer.load::<#{CredentialsCache}>().cloned() - .unwrap_or_else({ - let sleep = self.runtime_components.sleep_impl(); - || match sleep { - Some(sleep) => { - #{CredentialsCache}::lazy_builder() - .sleep_impl(sleep) - .into_credentials_cache() - } - None => #{CredentialsCache}::lazy(), - } - }); - let shared_credentials_cache = cache_config.create_cache(credentials_provider); - layer.store_put(shared_credentials_cache); - } - """, - *codegenScope, - ) - } - - is ServiceConfig.OperationConfigOverride -> { - rustTemplate( - """ - match ( - resolver.config_mut().load::<#{CredentialsCache}>().cloned(), - resolver.config_mut().load::<#{SharedCredentialsProvider}>().cloned(), - ) { - (#{None}, #{None}) => {} - (#{None}, _) => { - panic!("also specify `.credentials_cache` when overriding credentials provider for the operation"); - } - (_, #{None}) => { - panic!("also specify `.credentials_provider` when overriding credentials cache for the operation"); - } - ( - #{Some}(credentials_cache), - #{Some}(credentials_provider), - ) => { - let credentials_cache = credentials_cache.create_cache(credentials_provider); - resolver.runtime_components_mut().push_identity_resolver( - #{SIGV4_SCHEME_ID}, - #{SharedIdentityResolver}::new( - #{CredentialsIdentityResolver}::new(credentials_cache), - ), - ); - } - } - """, - *codegenScope, - ) - } - - else -> emptySection - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index e62773aa9a8..46d8e42734a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -79,6 +79,18 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus override fun section(section: ServiceConfig) = writable { when (section) { + ServiceConfig.ConfigImpl -> { + rustTemplate( + """ + /// Returns the credentials provider for this service + pub fn credentials_provider(&self) -> Option<#{SharedCredentialsProvider}> { + self.config.load::<#{SharedCredentialsProvider}>().cloned() + } + """, + *codegenScope, + ) + } + ServiceConfig.BuilderImpl -> { rustTemplate( """ @@ -121,10 +133,8 @@ class CredentialsIdentityResolverRegistration( override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { - rustBlockTemplate("if let Some(credentials_cache) = ${section.serviceConfigName}.credentials_cache()") { + rustBlockTemplate("if let Some(creds_provider) = ${section.serviceConfigName}.credentials_provider()") { val codegenScope = arrayOf( - "CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("identity::credentials::CredentialsIdentityResolver"), "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::identity::SharedIdentityResolver"), "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) @@ -133,24 +143,15 @@ class CredentialsIdentityResolverRegistration( .resolve("auth::sigv4::SCHEME_ID"), ) - rustTemplate( - """ - let shared_identity_resolver = #{SharedIdentityResolver}::new( - #{CredentialsIdentityResolver}::new(credentials_cache) - ); - """, - *codegenScope, - ) - if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { featureGateBlock("sigv4a") { section.registerIdentityResolver(this) { - rustTemplate("#{SIGV4A_SCHEME_ID}, shared_identity_resolver.clone()", *codegenScope) + rustTemplate("#{SIGV4A_SCHEME_ID}, creds_provider.clone()", *codegenScope) } } } section.registerIdentityResolver(this) { - rustTemplate("#{SIGV4_SCHEME_ID}, shared_identity_resolver,", *codegenScope) + rustTemplate("#{SIGV4_SCHEME_ID}, creds_provider,", *codegenScope) } } } @@ -159,6 +160,3 @@ class CredentialsIdentityResolverRegistration( } } } - -fun defaultProvider() = - RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("no_credentials")).resolve("NoCredentials") diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index 7167910c08e..37a31fb615f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -78,6 +78,10 @@ class GenericSmithySdkConfigSettings : ClientCodegenDecorator { ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client()); ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source()); + + if let Some(cache) = ${section.sdkConfig}.identity_cache() { + ${section.serviceConfigBuilder}.set_identity_cache(cache); + } """, ) }, diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt deleted file mode 100644 index 6eaefa90e30..00000000000 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.testModule -import software.amazon.smithy.rust.codegen.core.testutil.tokioTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest - -internal class CredentialCacheConfigTest { - private val model = """ - namespace com.example - use aws.protocols#awsJson1_0 - use aws.api#service - use aws.auth#sigv4 - use smithy.rules#endpointRuleSet - - @service(sdkId: "Some Value") - @awsJson1_0 - @sigv4(name: "dontcare") - @auth([sigv4]) - @endpointRuleSet({ - "version": "1.0", - "rules": [{ - "type": "endpoint", - "conditions": [{"fn": "isSet", "argv": [{"ref": "Region"}]}], - "endpoint": { "url": "https://example.com" } - }], - "parameters": { - "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, - } - }) - service HelloService { - operations: [SayHello], - version: "1" - } - - operation SayHello { input: TestInput } - structure TestInput { - foo: String, - } - """.asSmithyModel() - - @Test - fun `config override for credentials`() { - awsSdkIntegrationTest(model) { clientCodegenContext, rustCrate -> - val runtimeConfig = clientCodegenContext.runtimeConfig - val codegenScope = arrayOf( - *RuntimeType.preludeScope, - "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig) - .resolve("Credentials"), - "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::CredentialsCache"), - "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), - "ReplayEvent" to CargoDependency.smithyRuntime(runtimeConfig) - .toDevDependency().withFeature("test-util").toType() - .resolve("client::http::test_util::ReplayEvent"), - "RuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::runtime_plugin::RuntimePlugin"), - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::SharedCredentialsCache"), - "StaticReplayClient" to CargoDependency.smithyRuntime(runtimeConfig) - .toDevDependency().withFeature("test-util").toType() - .resolve("client::http::test_util::StaticReplayClient"), - ) - rustCrate.testModule { - unitTest( - "test_overriding_only_credentials_provider_should_panic", - additionalAttributes = listOf(Attribute.shouldPanic("also specify `.credentials_cache` when overriding credentials provider for the operation")), - ) { - rustTemplate( - """ - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder().build(); - let config_override = - crate::config::Config::builder().credentials_provider(#{Credentials}::for_tests()); - let sut = crate::config::ConfigOverrideRuntimePlugin::new( - config_override, - client_config.config, - &client_config.runtime_components, - ); - - // this should cause `panic!` - let _ = sut.config().unwrap(); - """, - *codegenScope, - ) - } - - unitTest( - "test_overriding_only_credentials_cache_should_panic", - additionalAttributes = listOf(Attribute.shouldPanic("also specify `.credentials_provider` when overriding credentials cache for the operation")), - ) { - rustTemplate( - """ - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder().build(); - let config_override = crate::config::Config::builder() - .credentials_cache(#{CredentialsCache}::no_caching()); - let sut = crate::config::ConfigOverrideRuntimePlugin::new( - config_override, - client_config.config, - &client_config.runtime_components, - ); - - // this should cause `panic!` - let _ = sut.config().unwrap(); - """, - *codegenScope, - ) - } - - unitTest("test_not_overriding_cache_and_provider_leads_to_no_shared_credentials_cache_in_layer") { - rustTemplate( - """ - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder().build(); - let config_override = crate::config::Config::builder(); - let sut = crate::config::ConfigOverrideRuntimePlugin::new( - config_override, - client_config.config, - &client_config.runtime_components, - ); - let sut_layer = sut.config().unwrap(); - assert!(sut_layer - .load::<#{SharedCredentialsCache}>() - .is_none()); - """, - *codegenScope, - ) - } - - tokioTest("test_specifying_credentials_provider_only_at_operation_level_should_work") { - // per https://github.com/awslabs/aws-sdk-rust/issues/901 - rustTemplate( - """ - let http_client = #{StaticReplayClient}::new( - vec![#{ReplayEvent}::new( - http::Request::builder() - .body(#{SdkBody}::from("request body")) - .unwrap(), - http::Response::builder() - .status(200) - .body(#{SdkBody}::from("response")) - .unwrap(), - )], - ); - let client_config = crate::config::Config::builder() - .http_client(http_client) - .build(); - let client = crate::client::Client::from_conf(client_config); - - let credentials = #{Credentials}::new( - "test", - "test", - #{None}, - #{None}, - "test", - ); - let operation_config_override = crate::config::Config::builder() - .credentials_cache(#{CredentialsCache}::no_caching()) - .credentials_provider(credentials.clone()) - .region(#{Region}::new("us-west-2")); - - let _ = client - .say_hello() - .customize() - .config_override(operation_config_override) - .send() - .await - .expect("success"); - """, - *codegenScope, - ) - } - } - } - } -} diff --git a/aws/sdk/integration-tests/no-default-features/Cargo.toml b/aws/sdk/integration-tests/no-default-features/Cargo.toml index 8408ac66940..ec8f24bd89e 100644 --- a/aws/sdk/integration-tests/no-default-features/Cargo.toml +++ b/aws/sdk/integration-tests/no-default-features/Cargo.toml @@ -17,6 +17,7 @@ publish = false aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", default-features = false } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-runtime= { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } futures = "0.3.25" tokio = { version = "1.23.1", features = ["full", "test-util"] } diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index e7d11dbc31c..e1f80490554 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -3,9 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_s3::config::{Config, Credentials, SharedAsyncSleep, Sleep}; +use aws_sdk_s3::config::IdentityCache; +use aws_sdk_s3::config::{ + retry::RetryConfig, timeout::TimeoutConfig, Config, Credentials, Region, SharedAsyncSleep, + Sleep, +}; use aws_sdk_s3::error::DisplayErrorContext; use aws_smithy_async::rt::sleep::AsyncSleep; +use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use std::time::Duration; // This will fail due to lack of a connector when constructing the SDK Config @@ -51,3 +57,71 @@ async fn test_clients_from_service_config() { "expected '{msg}' to contain 'No HTTP client was available to send this request. Enable the `rustls` crate feature or set a HTTP client to fix this.'" ); } + +#[tokio::test] +#[should_panic( + expected = "Invalid client configuration: An async sleep implementation is required for retry to work." +)] +async fn test_missing_async_sleep_time_source_retries() { + let _logs = capture_test_logs(); + let (http_client, _) = capture_request(None); + + // Configure retry and timeouts without providing a sleep impl + let config = Config::builder() + .http_client(http_client) + .region(Region::new("us-east-1")) + .credentials_provider(Credentials::for_tests()) + .retry_config(RetryConfig::standard()) + .timeout_config(TimeoutConfig::disabled()) + .build(); + + // should panic with a validation error + let _client = aws_sdk_s3::Client::from_conf(config); +} + +#[tokio::test] +#[should_panic( + expected = "Invalid client configuration: An async sleep implementation is required for timeouts to work." +)] +async fn test_missing_async_sleep_time_source_timeouts() { + let _logs = capture_test_logs(); + let (http_client, _) = capture_request(None); + + // Configure retry and timeouts without providing a sleep impl + let config = Config::builder() + .http_client(http_client) + .region(Region::new("us-east-1")) + .credentials_provider(Credentials::for_tests()) + .retry_config(RetryConfig::disabled()) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(5)) + .build(), + ) + .build(); + + // should panic with a validation error + let _client = aws_sdk_s3::Client::from_conf(config); +} + +#[tokio::test] +#[should_panic( + expected = "Invalid client configuration: Lazy identity caching requires an async sleep implementation to be configured." +)] +async fn test_time_source_for_identity_cache() { + let _logs = capture_test_logs(); + let (http_client, _) = capture_request(None); + + // Configure an identity cache without providing a sleep impl or time source + let config = Config::builder() + .http_client(http_client) + .region(Region::new("us-east-1")) + .identity_cache(IdentityCache::lazy().build()) + .credentials_provider(Credentials::for_tests()) + .retry_config(RetryConfig::disabled()) + .timeout_config(TimeoutConfig::disabled()) + .build(); + + // should panic with a validation error + let _client = aws_sdk_s3::Client::from_conf(config); +} diff --git a/aws/sdk/integration-tests/s3/tests/client_construction.rs b/aws/sdk/integration-tests/s3/tests/client_construction.rs new file mode 100644 index 00000000000..e7dbc11ce6f --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/client_construction.rs @@ -0,0 +1,42 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +mod with_sdk_config { + use aws_config::SdkConfig; + use aws_sdk_s3 as s3; + + #[tokio::test] + async fn using_config_loader() { + // When using `aws_config::load_from_env`, things should just work + let config = aws_config::load_from_env().await; + assert!(config.timeout_config().unwrap().has_timeouts()); + assert!(config.retry_config().unwrap().has_retry()); + let _s3 = s3::Client::new(&config); + } + + #[test] + fn manual_config_construction_all_defaults() { + // When manually constructing `SdkConfig` with everything unset, + // it should work since there will be no timeouts or retries enabled, + // and thus, no sleep impl is required. + let config = SdkConfig::builder().build(); + assert!(config.timeout_config().is_none()); + assert!(config.retry_config().is_none()); + let _s3 = s3::Client::new(&config); + } +} + +mod with_service_config { + use aws_sdk_s3 as s3; + + #[test] + fn manual_config_construction_all_defaults() { + // When manually constructing `Config` with everything unset, + // it should work since there will be no timeouts or retries enabled, + // and thus, no sleep impl is required. + let config = s3::Config::builder().build(); + let _s3 = s3::Client::from_conf(config); + } +} diff --git a/aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs b/aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs deleted file mode 100644 index dfa82e96600..00000000000 --- a/aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod with_sdk_config { - use aws_config::retry::RetryConfig; - use aws_config::timeout::TimeoutConfig; - use aws_config::SdkConfig; - use aws_sdk_s3 as s3; - use aws_smithy_async::rt::sleep::SharedAsyncSleep; - use std::time::Duration; - - #[tokio::test] - async fn using_config_loader() { - // When using `aws_config::load_from_env`, things should just work - let config = aws_config::load_from_env().await; - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - fn manual_config_construction_all_defaults() { - // When manually constructing `SdkConfig` with everything unset, - // it should work since there will be no timeouts or retries enabled, - // and thus, no sleep impl is required. - let config = SdkConfig::builder().build(); - assert!(config.timeout_config().is_none()); - assert!(config.retry_config().is_none()); - let _s3 = s3::Client::new(&config); - } - - #[test] - fn no_sleep_no_timeouts_no_retries() { - // When explicitly setting timeouts and retries to their disabled - // states, it should work since no sleep impl is required. - let config = SdkConfig::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::disabled()) - .build(); - assert!(!config.timeout_config().unwrap().has_timeouts()); - assert!(!config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - #[should_panic] - fn no_sleep_no_timeouts_yes_retries() { - // When retries are enabled and a sleep impl isn't given, it should panic - let config = SdkConfig::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::standard()) - .build(); - assert!(!config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_no_retries() { - // When timeouts are enabled and a sleep impl isn't given, it should panic - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::disabled()) - .build(); - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(!config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_yes_retries() { - // When timeouts and retries are enabled but a sleep impl isn't given, it should panic - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .build(); - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - fn yes_sleep_yes_timeouts_yes_retries() { - // When a sleep impl is given, enabling timeouts/retries should work - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .sleep_impl(SharedAsyncSleep::new( - aws_smithy_async::rt::sleep::TokioSleep::new(), - )) - .build(); - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } -} - -mod with_service_config { - use aws_config::retry::RetryConfig; - use aws_config::timeout::TimeoutConfig; - use aws_config::SdkConfig; - use aws_sdk_s3 as s3; - use aws_smithy_async::rt::sleep::SharedAsyncSleep; - use std::time::Duration; - - #[test] - fn manual_config_construction_all_defaults() { - // When manually constructing `Config` with everything unset, - // it should work since there will be no timeouts or retries enabled, - // and thus, no sleep impl is required. - let config = s3::Config::builder().build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - fn no_sleep_no_timeouts_no_retries() { - // When explicitly setting timeouts and retries to their disabled - // states, it should work since no sleep impl is required. - let config = s3::Config::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::disabled()) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - #[should_panic] - fn no_sleep_no_timeouts_yes_retries() { - // When retries are enabled and a sleep impl isn't given, it should panic - let config = s3::Config::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::standard()) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_no_retries() { - // When timeouts are enabled and a sleep impl isn't given, it should panic - let config = s3::Config::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::disabled()) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_yes_retries() { - // When retries and timeouts are enabled and a sleep impl isn't given, it should panic - let config = s3::Config::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - fn yes_sleep_yes_timeouts_yes_retries() { - // When a sleep impl is given, enabling timeouts/retries should work - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .sleep_impl(SharedAsyncSleep::new( - aws_smithy_async::rt::sleep::TokioSleep::new(), - )) - .build(); - let _s3 = s3::Client::new(&config); - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt new file mode 100644 index 00000000000..d3015e76936 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt @@ -0,0 +1,105 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope + +class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { + private val moduleUseName = codegenContext.moduleUseName() + + private val codegenScope = codegenContext.runtimeConfig.let { rc -> + val api = RuntimeType.smithyRuntimeApi(rc) + arrayOf( + *preludeScope, + "ResolveCachedIdentity" to api.resolve("client::identity::ResolveCachedIdentity"), + "SharedIdentityCache" to api.resolve("client::identity::SharedIdentityCache"), + ) + } + + override fun section(section: ServiceConfig): Writable = writable { + when (section) { + is ServiceConfig.BuilderImpl -> { + val docs = """ + /// Set the identity cache for auth. + /// + /// The identity cache defaults to a lazy caching implementation that will resolve + /// an identity when it is requested, and place it in the cache thereafter. Subsequent + /// requests will take the value from the cache while it is still valid. Once it expires, + /// the next request will result in refreshing the identity. + /// + /// This configuration allows you to disable or change the default caching mechanism. + /// To use a custom caching mechanism, implement the [`ResolveCachedIdentity`](#{ResolveCachedIdentity}) + /// trait and pass that implementation into this function. + /// + /// ## Examples + /// + /// Disabling identity caching: + /// ```no_run + /// use $moduleUseName::config::IdentityCache; + /// + /// let config = $moduleUseName::Config::builder() + /// .identity_cache(IdentityCache::no_cache()) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + /// + /// Customizing lazy caching: + /// ```no_run + /// use $moduleUseName::config::IdentityCache; + /// use std::time::Duration; + /// + /// let config = $moduleUseName::Config::builder() + /// .identity_cache( + /// IdentityCache::lazy() + /// // change the load timeout to 10 seconds + /// .load_timeout(Duration::from_secs(10)) + /// .build() + /// ) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + """ + rustTemplate( + """ + $docs + pub fn identity_cache(mut self, identity_cache: impl #{ResolveCachedIdentity} + 'static) -> Self { + self.set_identity_cache(identity_cache); + self + } + + $docs + pub fn set_identity_cache(&mut self, identity_cache: impl #{ResolveCachedIdentity} + 'static) -> &mut Self { + self.runtime_components.set_identity_cache(#{Some}(identity_cache)); + self + } + """, + *codegenScope, + ) + } + is ServiceConfig.ConfigImpl -> { + rustTemplate( + """ + /// Returns the configured identity cache for auth. + pub fn identity_cache(&self) -> #{Option}<#{SharedIdentityCache}> { + self.runtime_components.identity_cache() + } + """, + *codegenScope, + ) + } + else -> { } + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index d47ac45fd9a..a1956f442e9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customizations.ConnectionPoisoningRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpChecksumRequiredGenerator +import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdentityCacheConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization @@ -56,6 +57,7 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations: List, ): List = baseCustomizations + ResiliencyConfigCustomization(codegenContext) + + IdentityCacheConfigCustomization(codegenContext) + InterceptorConfigCustomization(codegenContext) + TimeSourceCustomization(codegenContext) + RetryClassifierConfigCustomization(codegenContext) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 88e6bd2ffd4..690bf41a0be 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -27,11 +27,13 @@ class ClientRuntimeTypesReExportGenerator( pub use #{Intercept}; pub use #{RuntimeComponents}; pub use #{SharedInterceptor}; + pub use #{IdentityCache}; """, "ConfigBag" to RuntimeType.configBag(rc), "Intercept" to RuntimeType.intercept(rc), "RuntimeComponents" to RuntimeType.runtimeComponents(rc), "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), + "IdentityCache" to RuntimeType.smithyRuntime(rc).resolve("client::identity::IdentityCache"), ) if (codegenContext.enableUserConfigurableRuntimePlugins) { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index dfd11ed295a..9d2bc151e78 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -18,6 +18,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.PaginatorGen import software.amazon.smithy.rust.codegen.client.smithy.generators.isPaginated import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords @@ -94,23 +95,6 @@ class FluentClientGenerator( private fun renderFluentClient(crate: RustCrate) { crate.withModule(ClientRustModule.client) { - val clientScope = arrayOf( - *preludeScope, - "Arc" to RuntimeType.Arc, - "client_docs" to writable - { - customizations.forEach { - it.section( - FluentClientSection.FluentClientDocs( - serviceShape, - ), - )(this) - } - }, - "RetryConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryConfig"), - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), - ) rustTemplate( """ ##[derive(Debug)] @@ -131,27 +115,22 @@ class FluentClientGenerator( /// /// ## Panics /// - /// This method will panic if the `conf` has retry or timeouts enabled without a `sleep_impl`. - /// If you experience this panic, it can be fixed by setting the `sleep_impl`, or by disabling - /// retries and timeouts. + /// This method will panic in the following cases: + /// + /// - Retries or timeouts are enabled without a `sleep_impl` configured. + /// - Identity caching is enabled without a `sleep_impl` and `time_source` configured. + /// + /// The panic message for each of these will have instructions on how to resolve them. pub fn from_conf(conf: crate::Config) -> Self { - let has_retry_config = conf.retry_config().map(#{RetryConfig}::has_retry).unwrap_or_default(); - let has_timeout_config = conf.timeout_config().map(#{TimeoutConfig}::has_timeouts).unwrap_or_default(); - let sleep_impl = conf.sleep_impl(); - if (has_retry_config || has_timeout_config) && sleep_impl.is_none() { - panic!( - "An async sleep implementation is required for retries or timeouts to work. \ - Set the `sleep_impl` on the Config passed into this function to fix this panic." - ); + let handle = Handle { + conf: conf.clone(), + runtime_plugins: #{base_client_runtime_plugins}(conf), + }; + if let Err(err) = Self::validate_config(&handle) { + panic!("Invalid client configuration: {err}"); } - Self { - handle: #{Arc}::new( - Handle { - conf: conf.clone(), - runtime_plugins: #{base_client_runtime_plugins}(conf), - } - ) + handle: #{Arc}::new(handle) } } @@ -159,10 +138,32 @@ class FluentClientGenerator( pub fn config(&self) -> &crate::Config { &self.handle.conf } + + fn validate_config(handle: &Handle) -> Result<(), #{BoxError}> { + let mut cfg = #{ConfigBag}::base(); + handle.runtime_plugins + .apply_client_configuration(&mut cfg)? + .validate_base_client_config(&cfg)?; + Ok(()) + } } """, - *clientScope, + *preludeScope, + "Arc" to RuntimeType.Arc, "base_client_runtime_plugins" to baseClientRuntimePluginsFn(codegenContext), + "BoxError" to RuntimeType.boxError(runtimeConfig), + "client_docs" to writable { + customizations.forEach { + it.section( + FluentClientSection.FluentClientDocs( + serviceShape, + ), + )(this) + } + }, + "ConfigBag" to RuntimeType.configBag(runtimeConfig), + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + "tracing" to CargoDependency.Tracing.toType(), ) } @@ -459,17 +460,12 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru let mut configured_plugins = #{Vec}::new(); ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); - let defaults = [ - #{default_http_client_plugin}(), - #{default_retry_config_plugin}(${codegenContext.serviceShape.sdkId().dq()}), - #{default_sleep_impl_plugin}(), - #{default_time_source_plugin}(), - #{default_timeout_config_plugin}(), - ].into_iter().flatten(); - let mut plugins = #{RuntimePlugins}::new() // defaults - .with_client_plugins(defaults) + .with_client_plugins(#{default_plugins}( + #{DefaultPluginParams}::new() + .with_retry_partition_name(${codegenContext.serviceShape.sdkId().dq()}) + )) // user config .with_client_plugin( #{StaticRuntimePlugin}::new() @@ -486,11 +482,8 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru } """, *preludeScope, - "default_http_client_plugin" to rt.resolve("client::defaults::default_http_client_plugin"), - "default_retry_config_plugin" to rt.resolve("client::defaults::default_retry_config_plugin"), - "default_sleep_impl_plugin" to rt.resolve("client::defaults::default_sleep_impl_plugin"), - "default_timeout_config_plugin" to rt.resolve("client::defaults::default_timeout_config_plugin"), - "default_time_source_plugin" to rt.resolve("client::defaults::default_time_source_plugin"), + "DefaultPluginParams" to rt.resolve("client::defaults::DefaultPluginParams"), + "default_plugins" to rt.resolve("client::defaults::default_plugins"), "NoAuthRuntimePlugin" to rt.resolve("client::auth::no_auth::NoAuthRuntimePlugin"), "RuntimePlugins" to RuntimeType.runtimePlugins(rc), "StaticRuntimePlugin" to api.resolve("client::runtime_plugin::StaticRuntimePlugin"), diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index e6bb9c34405..8cc11806f9e 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -8,6 +8,7 @@ use crate::box_error::BoxError; use crate::client::identity::{Identity, SharedIdentityResolver}; use crate::client::orchestrator::HttpRequest; +use crate::client::runtime_components::sealed::ValidateConfig; use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; use crate::impl_shared_conversions; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; @@ -187,6 +188,8 @@ impl AuthScheme for SharedAuthScheme { } } +impl ValidateConfig for SharedAuthScheme {} + impl_shared_conversions!(convert SharedAuthScheme from AuthScheme using SharedAuthScheme::new); #[deprecated(note = "Renamed to Sign.")] diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index 8c138075fa0..a0818cf4ec4 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -6,6 +6,7 @@ //! APIs needed to configure endpoint resolution for clients. use crate::box_error::BoxError; +use crate::client::runtime_components::sealed::ValidateConfig; use crate::impl_shared_conversions; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::endpoint::Endpoint; @@ -70,4 +71,6 @@ impl ResolveEndpoint for SharedEndpointResolver { } } +impl ValidateConfig for SharedEndpointResolver {} + impl_shared_conversions!(convert SharedEndpointResolver from ResolveEndpoint using SharedEndpointResolver::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index f271540f11a..321e70198d8 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -54,6 +54,7 @@ pub mod request; pub mod response; use crate::client::orchestrator::{HttpRequest, HttpResponse}; +use crate::client::runtime_components::sealed::ValidateConfig; use crate::client::runtime_components::RuntimeComponents; use crate::impl_shared_conversions; use aws_smithy_http::result::ConnectorError; @@ -172,6 +173,8 @@ impl HttpClient for SharedHttpClient { } } +impl ValidateConfig for SharedHttpClient {} + impl_shared_conversions!(convert SharedHttpClient from HttpClient using SharedHttpClient::new); /// Builder for [`HttpConnectorSettings`]. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index 8ec6fb88511..fae5e860559 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -5,7 +5,8 @@ use crate::box_error::BoxError; use crate::client::auth::AuthSchemeId; -use crate::client::runtime_components::RuntimeComponents; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder}; use crate::impl_shared_conversions; use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; @@ -62,6 +63,37 @@ pub trait ResolveCachedIdentity: fmt::Debug + Send + Sync { runtime_components: &'a RuntimeComponents, config_bag: &'a ConfigBag, ) -> IdentityFuture<'a>; + + /// Validate the base client configuration for this implementation. + /// + /// This gets called upon client construction. The full config may not be available at + /// this time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather + /// than [`RuntimeComponents`]). Any error returned here will become a panic + /// in the client constructor. + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + + /// Validate the final client configuration for this implementation. + /// + /// This gets called immediately after the [`Intercept::read_before_execution`] trait hook + /// when the final configuration has been resolved. Any error returned here will + /// cause the operation to return that error. + /// + /// [`Intercept::read_before_execution`]: crate::client::interceptors::Intercept::read_before_execution + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } } /// Shared identity cache. @@ -87,6 +119,24 @@ impl ResolveCachedIdentity for SharedIdentityCache { } } +impl ValidateConfig for SharedIdentityCache { + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + self.0.validate_base_client_config(runtime_components, cfg) + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + self.0.validate_final_config(runtime_components, cfg) + } +} + impl_shared_conversions!(convert SharedIdentityCache from ResolveCachedIdentity using SharedIdentityCache::new); #[deprecated(note = "Renamed to ResolveIdentity.")] @@ -191,6 +241,8 @@ impl ConfiguredIdentityResolver { } } +impl ValidateConfig for ConfiguredIdentityResolver {} + /// An identity that can be used for authentication. /// /// The [`Identity`] is a container for any arbitrary identity data that may be used diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 2dc05f7bcf2..370742c249d 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -15,6 +15,7 @@ use crate::client::interceptors::context::{ BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, }; +use crate::client::runtime_components::sealed::ValidateConfig; use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; @@ -621,6 +622,8 @@ impl SharedInterceptor { } } +impl ValidateConfig for SharedInterceptor {} + impl Intercept for SharedInterceptor { fn name(&self) -> &'static str { self.interceptor.name() diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs index e3616e42b36..036371ddc18 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs @@ -12,6 +12,7 @@ pub mod classifiers; use crate::box_error::BoxError; use crate::client::interceptors::context::InterceptorContext; +use crate::client::runtime_components::sealed::ValidateConfig; use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; @@ -107,6 +108,8 @@ impl RetryStrategy for SharedRetryStrategy { } } +impl ValidateConfig for SharedRetryStrategy {} + /// A type to track the number of requests sent by the orchestrator for a given operation. /// /// `RequestAttempts` is added to the `ConfigBag` by the orchestrator, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs index 549b855956c..fc8544c7cb4 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs @@ -6,6 +6,7 @@ //! Classifier for determining if a retry is necessary and related code. use crate::client::interceptors::context::InterceptorContext; +use crate::client::runtime_components::sealed::ValidateConfig; use crate::impl_shared_conversions; use aws_smithy_types::retry::ErrorKind; use std::fmt; @@ -237,6 +238,8 @@ impl ClassifyRetry for SharedRetryClassifier { } } +impl ValidateConfig for SharedRetryClassifier {} + #[cfg(test)] mod tests { use super::RetryClassifierPriority; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 6871f59f22e..2a994d7e5a8 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -11,6 +11,7 @@ //! [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) instead of in //! [`RuntimeComponents`](RuntimeComponents). +use crate::box_error::BoxError; use crate::client::auth::{ AuthScheme, AuthSchemeId, ResolveAuthSchemeOptions, SharedAuthScheme, SharedAuthSchemeOptionResolver, @@ -18,19 +19,162 @@ use crate::client::auth::{ use crate::client::endpoint::{ResolveEndpoint, SharedEndpointResolver}; use crate::client::http::{HttpClient, SharedHttpClient}; use crate::client::identity::{ - ConfiguredIdentityResolver, ResolveIdentity, SharedIdentityResolver, + ConfiguredIdentityResolver, ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache, + SharedIdentityResolver, }; use crate::client::interceptors::{Intercept, SharedInterceptor}; use crate::client::retries::classifiers::{ClassifyRetry, SharedRetryClassifier}; use crate::client::retries::{RetryStrategy, SharedRetryStrategy}; +use crate::impl_shared_conversions; use crate::shared::IntoShared; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_types::config_bag::ConfigBag; use std::fmt; +use std::sync::Arc; pub(crate) static EMPTY_RUNTIME_COMPONENTS_BUILDER: RuntimeComponentsBuilder = RuntimeComponentsBuilder::new("empty"); +pub(crate) mod sealed { + use super::*; + + /// Validates client configuration. + /// + /// This trait can be used to validate that certain required components or config values + /// are available, and provide an error with helpful instructions if they are not. + pub trait ValidateConfig: fmt::Debug + Send + Sync { + /// Validate the base client configuration. + /// + /// This gets called upon client construction. The full config may not be available at + /// this time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather + /// than [`RuntimeComponents`]). Any error returned here will become a panic + /// in the client constructor. + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + + /// Validate the final client configuration. + /// + /// This gets called immediately after the [`Intercept::read_before_execution`] trait hook + /// when the final configuration has been resolved. Any error returned here will + /// cause the operation to return that error. + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + } +} +use sealed::ValidateConfig; + +#[derive(Clone)] +enum ValidatorInner { + BaseConfigStaticFn(fn(&RuntimeComponentsBuilder, &ConfigBag) -> Result<(), BoxError>), + Shared(Arc), +} + +impl fmt::Debug for ValidatorInner { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::BaseConfigStaticFn(_) => f.debug_tuple("StaticFn").finish(), + Self::Shared(_) => f.debug_tuple("Shared").finish(), + } + } +} + +/// A client config validator. +#[derive(Clone, Debug)] +pub struct SharedConfigValidator { + inner: ValidatorInner, +} + +impl SharedConfigValidator { + /// Creates a new shared config validator. + pub(crate) fn new(validator: impl ValidateConfig + 'static) -> Self { + Self { + inner: ValidatorInner::Shared(Arc::new(validator) as _), + } + } + + /// Creates a base client validator from a function. + /// + /// A base client validator gets called upon client construction. The full + /// config may not be available at this time (hence why it has + /// [`RuntimeComponentsBuilder`] as an argument rather than [`RuntimeComponents`]). + /// Any error returned from the validator function will become a panic in the + /// client constructor. + /// + /// # Examples + /// + /// Creating a validator function: + /// ```no_run + /// use aws_smithy_runtime_api::box_error::BoxError; + /// use aws_smithy_runtime_api::client::runtime_components::{ + /// RuntimeComponentsBuilder, + /// SharedConfigValidator + /// }; + /// use aws_smithy_types::config_bag::ConfigBag; + /// + /// fn my_validation( + /// components: &RuntimeComponentsBuilder, + /// config: &ConfigBag + /// ) -> Result<(), BoxError> { + /// if components.sleep_impl().is_none() { + /// return Err("I need a sleep_impl!".into()); + /// } + /// Ok(()) + /// } + /// + /// let validator = SharedConfigValidator::base_client_config_fn(my_validation); + /// ``` + pub fn base_client_config_fn( + validator: fn(&RuntimeComponentsBuilder, &ConfigBag) -> Result<(), BoxError>, + ) -> Self { + Self { + inner: ValidatorInner::BaseConfigStaticFn(validator), + } + } +} + +impl ValidateConfig for SharedConfigValidator { + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + match &self.inner { + ValidatorInner::BaseConfigStaticFn(validator) => (validator)(runtime_components, cfg), + ValidatorInner::Shared(validator) => { + validator.validate_base_client_config(runtime_components, cfg) + } + } + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + match &self.inner { + ValidatorInner::Shared(validator) => { + validator.validate_final_config(runtime_components, cfg) + } + _ => Ok(()), + } + } +} + +impl_shared_conversions!(convert SharedConfigValidator from ValidateConfig using SharedConfigValidator::new); + /// Internal to `declare_runtime_components!`. /// /// Merges a field from one builder into another. @@ -196,6 +340,9 @@ declare_runtime_components! { #[atLeastOneRequired] auth_schemes: Vec, + #[required] + identity_cache: Option, + #[atLeastOneRequired] identity_resolvers: Vec, @@ -209,6 +356,8 @@ declare_runtime_components! { time_source: Option, sleep_impl: Option, + + config_validators: Vec, } } @@ -241,6 +390,11 @@ impl RuntimeComponents { .map(|s| s.value.clone()) } + /// Returns the identity cache. + pub fn identity_cache(&self) -> SharedIdentityCache { + self.identity_cache.value.clone() + } + /// Returns an iterator over the interceptors. pub fn interceptors(&self) -> impl Iterator + '_ { self.interceptors.iter().map(|s| s.value.clone()) @@ -265,6 +419,45 @@ impl RuntimeComponents { pub fn time_source(&self) -> Option { self.time_source.as_ref().map(|s| s.value.clone()) } + + /// Returns the config validators. + pub fn config_validators(&self) -> impl Iterator + '_ { + self.config_validators.iter().map(|s| s.value.clone()) + } + + /// Validate the final client configuration. + /// + /// This is intended to be called internally by the client. + pub fn validate_final_config(&self, cfg: &ConfigBag) -> Result<(), BoxError> { + macro_rules! validate { + (Required: $field:expr) => { + ValidateConfig::validate_final_config(&$field.value, self, cfg)?; + }; + (Option: $field:expr) => { + if let Some(field) = $field.as_ref() { + ValidateConfig::validate_final_config(&field.value, self, cfg)?; + } + }; + (Vec: $field:expr) => { + for entry in &$field { + ValidateConfig::validate_final_config(&entry.value, self, cfg)?; + } + }; + } + + tracing::trace!(runtime_components=?self, cfg=?cfg, "validating final config"); + for validator in self.config_validators() { + validator.validate_final_config(self, cfg)?; + } + validate!(Option: self.http_client); + validate!(Required: self.endpoint_resolver); + validate!(Vec: self.auth_schemes); + validate!(Required: self.identity_cache); + validate!(Vec: self.identity_resolvers); + validate!(Vec: self.interceptors); + validate!(Required: self.retry_strategy); + Ok(()) + } } impl RuntimeComponentsBuilder { @@ -353,6 +546,30 @@ impl RuntimeComponentsBuilder { self } + /// Returns the identity cache. + pub fn identity_cache(&self) -> Option { + self.identity_cache.as_ref().map(|s| s.value.clone()) + } + + /// Sets the identity cache. + pub fn set_identity_cache( + &mut self, + identity_cache: Option, + ) -> &mut Self { + self.identity_cache = + identity_cache.map(|c| Tracked::new(self.builder_name, c.into_shared())); + self + } + + /// Sets the identity cache. + pub fn with_identity_cache( + mut self, + identity_cache: Option, + ) -> Self { + self.set_identity_cache(identity_cache); + self + } + /// Adds an identity resolver. pub fn push_identity_resolver( &mut self, @@ -429,7 +646,7 @@ impl RuntimeComponentsBuilder { self.retry_classifiers.iter().map(|s| s.value.clone()) } - /// Adds all the given retry_classifiers. + /// Adds all the given retry classifiers. pub fn extend_retry_classifiers( &mut self, retry_classifiers: impl Iterator, @@ -526,6 +743,68 @@ impl RuntimeComponentsBuilder { self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s.into_shared())); self } + + /// Returns the config validators. + pub fn config_validators(&self) -> impl Iterator + '_ { + self.config_validators.iter().map(|s| s.value.clone()) + } + + /// Adds all the given config validators. + pub fn extend_config_validators( + &mut self, + config_validators: impl Iterator, + ) -> &mut Self { + self.config_validators + .extend(config_validators.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Adds a config validator. + pub fn push_config_validator( + &mut self, + config_validator: impl ValidateConfig + 'static, + ) -> &mut Self { + self.config_validators.push(Tracked::new( + self.builder_name, + config_validator.into_shared(), + )); + self + } + + /// Adds a config validator. + pub fn with_config_validator( + mut self, + config_validator: impl ValidateConfig + 'static, + ) -> Self { + self.push_config_validator(config_validator); + self + } + + /// Validate the base client configuration. + /// + /// This is intended to be called internally by the client. + pub fn validate_base_client_config(&self, cfg: &ConfigBag) -> Result<(), BoxError> { + macro_rules! validate { + ($field:expr) => { + for entry in &$field { + ValidateConfig::validate_base_client_config(&entry.value, self, cfg)?; + } + }; + } + + tracing::trace!(runtime_components=?self, cfg=?cfg, "validating base client config"); + for validator in self.config_validators() { + validator.validate_base_client_config(self, cfg)?; + } + validate!(self.http_client); + validate!(self.endpoint_resolver); + validate!(self.auth_schemes); + validate!(self.identity_cache); + validate!(self.identity_resolvers); + validate!(self.interceptors); + validate!(self.retry_strategy); + Ok(()) + } } #[derive(Clone, Debug)] @@ -550,7 +829,6 @@ impl RuntimeComponentsBuilder { pub fn for_tests() -> Self { use crate::client::endpoint::{EndpointFuture, EndpointResolverParams}; use crate::client::identity::IdentityFuture; - use aws_smithy_types::config_bag::ConfigBag; #[derive(Debug)] struct FakeAuthSchemeOptionResolver; @@ -654,11 +932,27 @@ impl RuntimeComponentsBuilder { } } + #[derive(Debug)] + struct FakeIdentityCache; + impl ResolveCachedIdentity for FakeIdentityCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::new(async move { + resolver.resolve_identity(components, config_bag).await + }) + } + } + Self::new("aws_smithy_runtime_api::client::runtime_components::RuntimeComponentBuilder::for_tests") .with_auth_scheme(FakeAuthScheme) .with_auth_scheme_option_resolver(Some(FakeAuthSchemeOptionResolver)) .with_endpoint_resolver(Some(FakeEndpointResolver)) .with_http_client(Some(FakeClient)) + .with_identity_cache(Some(FakeIdentityCache)) .with_identity_resolver(AuthSchemeId::new("fake"), FakeIdentityResolver) .with_retry_strategy(Some(FakeRetryStrategy)) .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep))) @@ -699,6 +993,16 @@ impl GetIdentityResolver for RuntimeComponents { #[cfg(all(test, feature = "test-util"))] mod tests { use super::{BuildError, RuntimeComponentsBuilder, Tracked}; + use crate::client::runtime_components::ValidateConfig; + + #[derive(Clone, Debug, Eq, PartialEq)] + struct TestComponent(String); + impl ValidateConfig for TestComponent {} + impl From<&'static str> for TestComponent { + fn from(value: &'static str) -> Self { + TestComponent(value.into()) + } + } #[test] #[allow(unreachable_pub)] @@ -707,35 +1011,38 @@ mod tests { declare_runtime_components! { fields for TestRc and TestRcBuilder { #[required] - some_required_string: Option, + some_required_component: Option, - some_optional_string: Option, + some_optional_component: Option, #[atLeastOneRequired] - some_required_vec: Vec, + some_required_vec: Vec, - some_optional_vec: Vec, + some_optional_vec: Vec, } } let builder1 = TestRcBuilder { builder_name: "builder1", - some_required_string: Some(Tracked::new("builder1", "override_me".into())), - some_optional_string: Some(Tracked::new("builder1", "override_me optional".into())), + some_required_component: Some(Tracked::new("builder1", "override_me".into())), + some_optional_component: Some(Tracked::new("builder1", "override_me optional".into())), some_required_vec: vec![Tracked::new("builder1", "first".into())], some_optional_vec: vec![Tracked::new("builder1", "first optional".into())], }; let builder2 = TestRcBuilder { builder_name: "builder2", - some_required_string: Some(Tracked::new("builder2", "override_me_too".into())), - some_optional_string: Some(Tracked::new("builder2", "override_me_too optional".into())), + some_required_component: Some(Tracked::new("builder2", "override_me_too".into())), + some_optional_component: Some(Tracked::new( + "builder2", + "override_me_too optional".into(), + )), some_required_vec: vec![Tracked::new("builder2", "second".into())], some_optional_vec: vec![Tracked::new("builder2", "second optional".into())], }; let builder3 = TestRcBuilder { builder_name: "builder3", - some_required_string: Some(Tracked::new("builder3", "correct".into())), - some_optional_string: Some(Tracked::new("builder3", "correct optional".into())), + some_required_component: Some(Tracked::new("builder3", "correct".into())), + some_optional_component: Some(Tracked::new("builder3", "correct optional".into())), some_required_vec: vec![Tracked::new("builder3", "third".into())], some_optional_vec: vec![Tracked::new("builder3", "third optional".into())], }; @@ -746,26 +1053,29 @@ mod tests { .build() .expect("success"); assert_eq!( - Tracked::new("builder3", "correct".to_string()), - rc.some_required_string + Tracked::new("builder3", TestComponent::from("correct")), + rc.some_required_component ); assert_eq!( - Some(Tracked::new("builder3", "correct optional".to_string())), - rc.some_optional_string + Some(Tracked::new( + "builder3", + TestComponent::from("correct optional") + )), + rc.some_optional_component ); assert_eq!( vec![ - Tracked::new("builder1", "first".to_string()), - Tracked::new("builder2", "second".into()), - Tracked::new("builder3", "third".into()) + Tracked::new("builder1", TestComponent::from("first")), + Tracked::new("builder2", TestComponent::from("second")), + Tracked::new("builder3", TestComponent::from("third")) ], rc.some_required_vec ); assert_eq!( vec![ - Tracked::new("builder1", "first optional".to_string()), - Tracked::new("builder2", "second optional".into()), - Tracked::new("builder3", "third optional".into()) + Tracked::new("builder1", TestComponent::from("first optional")), + Tracked::new("builder2", TestComponent::from("second optional")), + Tracked::new("builder3", TestComponent::from("third optional")) ], rc.some_optional_vec ); @@ -774,19 +1084,19 @@ mod tests { #[test] #[allow(unreachable_pub)] #[allow(dead_code)] - #[should_panic(expected = "the `_some_string` runtime component is required")] + #[should_panic(expected = "the `_some_component` runtime component is required")] fn require_field_singular() { declare_runtime_components! { fields for TestRc and TestRcBuilder { #[required] - _some_string: Option, + _some_component: Option, } } let rc = TestRcBuilder::new("test").build().unwrap(); // Ensure the correct types were used - let _: Tracked = rc._some_string; + let _: Tracked = rc._some_component; } #[test] @@ -797,14 +1107,14 @@ mod tests { declare_runtime_components! { fields for TestRc and TestRcBuilder { #[atLeastOneRequired] - _some_vec: Vec, + _some_vec: Vec, } } let rc = TestRcBuilder::new("test").build().unwrap(); // Ensure the correct types were used - let _: Vec> = rc._some_vec; + let _: Vec> = rc._some_vec; } #[test] @@ -813,16 +1123,16 @@ mod tests { fn optional_fields_dont_panic() { declare_runtime_components! { fields for TestRc and TestRcBuilder { - _some_optional_string: Option, - _some_optional_vec: Vec, + _some_optional_component: Option, + _some_optional_vec: Vec, } } let rc = TestRcBuilder::new("test").build().unwrap(); // Ensure the correct types were used - let _: Option> = rc._some_optional_string; - let _: Vec> = rc._some_optional_vec; + let _: Option> = rc._some_optional_component; + let _: Vec> = rc._some_optional_vec; } #[test] diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 3a6281373be..9aa9589ef0e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -95,8 +95,8 @@ impl Sign for ApiKeySigner { request .headers_mut() .try_append( - self.name.clone(), - format!("{} {}", self.scheme, api_key.token(),), + self.name.to_ascii_lowercase(), + format!("{} {}", self.scheme, api_key.token()), ) .map_err(|_| { "API key contains characters that can't be included in a HTTP header" diff --git a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs index 6bba117144c..cc6de23d6ac 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs @@ -9,17 +9,21 @@ //! for _your_ client, since many things can change these defaults on the way to //! code generating and constructing a full client. +use crate::client::identity::IdentityCache; use crate::client::retries::strategy::StandardRetryStrategy; use crate::client::retries::RetryPartition; use aws_smithy_async::rt::sleep::default_async_sleep; use aws_smithy_async::time::SystemTimeSource; +use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::http::SharedHttpClient; -use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponentsBuilder, SharedConfigValidator, +}; use aws_smithy_runtime_api::client::runtime_plugin::{ Order, SharedRuntimePlugin, StaticRuntimePlugin, }; use aws_smithy_runtime_api::shared::IntoShared; -use aws_smithy_types::config_bag::{FrozenLayer, Layer}; +use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use std::borrow::Cow; @@ -82,7 +86,11 @@ pub fn default_retry_config_plugin( ) -> Option { Some( default_plugin("default_retry_config_plugin", |components| { - components.with_retry_strategy(Some(StandardRetryStrategy::new())) + components + .with_retry_strategy(Some(StandardRetryStrategy::new())) + .with_config_validator(SharedConfigValidator::base_client_config_fn( + validate_retry_config, + )) }) .with_config(layer("default_retry_config", |layer| { layer.store_put(RetryConfig::disabled()); @@ -92,13 +100,108 @@ pub fn default_retry_config_plugin( ) } +fn validate_retry_config( + components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, +) -> Result<(), BoxError> { + if let Some(retry_config) = cfg.load::() { + if retry_config.has_retry() && components.sleep_impl().is_none() { + Err("An async sleep implementation is required for retry to work. Please provide a `sleep_impl` on \ + the config, or disable timeouts.".into()) + } else { + Ok(()) + } + } else { + Err( + "The default retry config was removed, and no other config was put in its place." + .into(), + ) + } +} + /// Runtime plugin that sets the default timeout config (no timeouts). pub fn default_timeout_config_plugin() -> Option { Some( - default_plugin("default_timeout_config_plugin", |c| c) - .with_config(layer("default_timeout_config", |layer| { - layer.store_put(TimeoutConfig::disabled()); - })) - .into_shared(), + default_plugin("default_timeout_config_plugin", |components| { + components.with_config_validator(SharedConfigValidator::base_client_config_fn( + validate_timeout_config, + )) + }) + .with_config(layer("default_timeout_config", |layer| { + layer.store_put(TimeoutConfig::disabled()); + })) + .into_shared(), ) } + +fn validate_timeout_config( + components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, +) -> Result<(), BoxError> { + if let Some(timeout_config) = cfg.load::() { + if timeout_config.has_timeouts() && components.sleep_impl().is_none() { + Err("An async sleep implementation is required for timeouts to work. Please provide a `sleep_impl` on \ + the config, or disable timeouts.".into()) + } else { + Ok(()) + } + } else { + Err( + "The default timeout config was removed, and no other config was put in its place." + .into(), + ) + } +} + +/// Runtime plugin that registers the default identity cache implementation. +pub fn default_identity_cache_plugin() -> Option { + Some( + default_plugin("default_identity_cache_plugin", |components| { + components.with_identity_cache(Some(IdentityCache::lazy().build())) + }) + .into_shared(), + ) +} + +/// Arguments for the [`default_plugins`] method. +/// +/// This is a struct to enable adding new parameters in the future without breaking the API. +#[non_exhaustive] +#[derive(Debug, Default)] +pub struct DefaultPluginParams { + retry_partition_name: Option>, +} + +impl DefaultPluginParams { + /// Creates a new [`DefaultPluginParams`]. + pub fn new() -> Self { + Default::default() + } + + /// Sets the retry partition name. + pub fn with_retry_partition_name(mut self, name: impl Into>) -> Self { + self.retry_partition_name = Some(name.into()); + self + } +} + +/// All default plugins. +pub fn default_plugins( + params: DefaultPluginParams, +) -> impl IntoIterator { + [ + default_http_client_plugin(), + default_identity_cache_plugin(), + default_retry_config_plugin( + params + .retry_partition_name + .expect("retry_partition_name is required"), + ), + default_sleep_impl_plugin(), + default_time_source_plugin(), + default_timeout_config_plugin(), + ] + .into_iter() + .flatten() + .collect::>() +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs index b34e0aa0fff..e911237390b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs @@ -63,9 +63,9 @@ impl ValidateRequest { fn assert_matches(&self, index: usize, ignore_headers: &[&str]) { let (actual, expected) = (&self.actual, &self.expected); assert_eq!( - actual.uri(), expected.uri(), - "Request #{index} - URI doesn't match expected value" + actual.uri(), + "request[{index}] - URI doesn't match expected value" ); for (name, value) in expected.headers() { if !ignore_headers.contains(&name) { @@ -74,8 +74,8 @@ impl ValidateRequest { .get(name) .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); assert_eq!( - actual_header, value, - "Request #{index} - Header {name:?} doesn't match expected value", + value, actual_header, + "request[{index}] - Header {name:?} doesn't match expected value", ); } } @@ -94,9 +94,9 @@ impl ValidateRequest { match (actual_str, expected_str) { (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), _ => assert_eq!( - actual.body().bytes(), expected.body().bytes(), - "Request #{index} - Body contents didn't match expected value" + actual.body().bytes(), + "request[{index}] - Body contents didn't match expected value" ), }; } diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs index 36a5968b4c8..1ed06cba18a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs @@ -241,19 +241,65 @@ impl LazyCache { } } +macro_rules! required_err { + ($thing:literal, $how:literal) => { + BoxError::from(concat!( + "Lazy identity caching requires ", + $thing, + " to be configured. ", + $how, + " If this isn't possible, then disable identity caching by calling ", + "the `identity_cache` method on config with `IdentityCache::no_cache()`", + )) + }; +} +macro_rules! validate_components { + ($components:ident) => { + let _ = $components.time_source().ok_or_else(|| { + required_err!( + "a time source", + "Set a time source using the `time_source` method on config." + ) + })?; + let _ = $components.sleep_impl().ok_or_else(|| { + required_err!( + "an async sleep implementation", + "Set a sleep impl using the `sleep_impl` method on config." + ) + })?; + }; +} + impl ResolveCachedIdentity for LazyCache { + fn validate_base_client_config( + &self, + runtime_components: &aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder, + _cfg: &ConfigBag, + ) -> Result<(), BoxError> { + validate_components!(runtime_components); + Ok(()) + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + _cfg: &ConfigBag, + ) -> Result<(), BoxError> { + validate_components!(runtime_components); + Ok(()) + } + fn resolve_cached_identity<'a>( &'a self, resolver: SharedIdentityResolver, runtime_components: &'a RuntimeComponents, config_bag: &'a ConfigBag, ) -> IdentityFuture<'a> { - let time_source = runtime_components - .time_source() - .expect("Identity caching requires a time source to be configured. If this isn't possible, then disable identity caching."); - let sleep_impl = runtime_components - .sleep_impl() - .expect("Identity caching requires a sleep impl to be configured. If this isn't possible, then disable identity caching."); + let (time_source, sleep_impl) = ( + runtime_components.time_source().expect("validated"), + runtime_components.sleep_impl().expect("validated"), + ); + let now = time_source.now(); let timeout_future = sleep_impl.sleep(self.load_timeout); let load_timeout = self.load_timeout; @@ -263,7 +309,12 @@ impl ResolveCachedIdentity for LazyCache { IdentityFuture::new(async move { // Attempt to get cached identity, or clear the cache if they're expired if let Some(identity) = cache.yield_or_clear_if_expired(now).await { - tracing::debug!("loaded identity from cache"); + tracing::debug!( + buffer_time=?self.buffer_time, + cached_expiration=?identity.expiration(), + now=?now, + "loaded identity from cache" + ); Ok(identity) } else { // If we didn't get identity from the cache, then we need to try and load. diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index 8b2522bf959..54faa6ae0d6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -65,6 +65,11 @@ macro_rules! interceptor_impl_fn { runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), InterceptorError> { + tracing::trace!(concat!( + "running `", + stringify!($interceptor), + "` interceptors" + )); let mut result: Result<(), (&str, BoxError)> = Ok(()); let ctx = ctx.into(); for interceptor in self.into_iter() { diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index ab328e53569..61d3948605e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -182,10 +182,13 @@ fn apply_configuration( continue_on_err!([ctx] => Interceptors::new(operation_rc_builder.interceptors()).read_before_execution(true, ctx, cfg)); // The order below is important. Client interceptors must run before operation interceptors. - Ok(RuntimeComponents::builder("merged orchestrator components") + let components = RuntimeComponents::builder("merged orchestrator components") .merge_from(&client_rc_builder) .merge_from(&operation_rc_builder) - .build()?) + .build()?; + + components.validate_final_config(cfg)?; + Ok(components) } #[instrument(skip_all, level = "debug")] @@ -516,7 +519,7 @@ mod tests { impl TestOperationRuntimePlugin { fn new() -> Self { Self { - builder: RuntimeComponentsBuilder::new("TestOperationRuntimePlugin") + builder: RuntimeComponentsBuilder::for_tests() .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))) .with_endpoint_resolver(Some(SharedEndpointResolver::new( StaticUriEndpointResolver::http_localhost(8080), diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index d5c685ead2b..8c6f7000e48 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -9,7 +9,7 @@ use aws_smithy_runtime_api::client::auth::{ AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOptionResolverParams, ResolveAuthSchemeOptions, }; -use aws_smithy_runtime_api::client::identity::ResolveIdentity; +use aws_smithy_runtime_api::client::identity::ResolveCachedIdentity; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; @@ -65,20 +65,22 @@ pub(super) async fn orchestrate_auth( if let Some(auth_scheme) = runtime_components.auth_scheme(scheme_id) { // Use the resolved auth scheme to resolve an identity if let Some(identity_resolver) = auth_scheme.identity_resolver(runtime_components) { + let identity_cache = runtime_components.identity_cache(); let signer = auth_scheme.signer(); trace!( auth_scheme = ?auth_scheme, + identity_cache = ?identity_cache, identity_resolver = ?identity_resolver, signer = ?signer, - "resolved auth scheme, identity resolver, and signing implementation" + "resolved auth scheme, identity cache, identity resolver, and signing implementation" ); match extract_endpoint_auth_scheme_config(endpoint, scheme_id) { Ok(auth_scheme_endpoint_config) => { trace!(auth_scheme_endpoint_config = ?auth_scheme_endpoint_config, "extracted auth scheme endpoint config"); - let identity = identity_resolver - .resolve_identity(runtime_components, cfg) + let identity = identity_cache + .resolve_cached_identity(identity_resolver, runtime_components, cfg) .await?; trace!(identity = ?identity, "resolved identity"); @@ -412,4 +414,71 @@ mod tests { .expect("gimme the string, dammit!") ); } + + #[cfg(feature = "http-auth")] + #[tokio::test] + async fn use_identity_cache() { + use crate::client::auth::http::{ApiKeyAuthScheme, ApiKeyLocation}; + use aws_smithy_runtime_api::client::auth::http::HTTP_API_KEY_AUTH_SCHEME_ID; + use aws_smithy_runtime_api::client::identity::http::Token; + use aws_smithy_types::body::SdkBody; + + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.enter_serialization_phase(); + ctx.set_request( + http::Request::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); + let _ = ctx.take_input(); + ctx.enter_before_transmit_phase(); + + #[derive(Debug)] + struct Cache; + impl ResolveCachedIdentity for Cache { + fn resolve_cached_identity<'a>( + &'a self, + _resolver: SharedIdentityResolver, + _: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(Token::new("cached (pass)", None), None))) + } + } + + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_auth_scheme(SharedAuthScheme::new(ApiKeyAuthScheme::new( + "result:", + ApiKeyLocation::Header, + "Authorization", + ))) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![HTTP_API_KEY_AUTH_SCHEME_ID]), + ))) + .with_identity_cache(Some(Cache)) + .with_identity_resolver( + HTTP_API_KEY_AUTH_SCHEME_ID, + SharedIdentityResolver::new(Token::new("uncached (fail)", None)), + ) + .build() + .unwrap(); + let mut layer = Layer::new("test"); + layer.store_put(Endpoint::builder().url("dontcare").build()); + layer.store_put(AuthSchemeOptionResolverParams::new("doesntmatter")); + let config_bag = ConfigBag::of_layers(vec![layer]); + + orchestrate_auth(&mut ctx, &runtime_components, &config_bag) + .await + .expect("success"); + assert_eq!( + "result: cached (pass)", + ctx.request() + .expect("request is set") + .headers() + .get("Authorization") + .unwrap() + ); + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index 569b5b0b132..752de031106 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -4,12 +4,10 @@ */ use crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID}; -use crate::client::defaults::{ - default_http_client_plugin, default_retry_config_plugin, default_sleep_impl_plugin, - default_time_source_plugin, default_timeout_config_plugin, -}; +use crate::client::defaults::{default_plugins, DefaultPluginParams}; use crate::client::http::connection_poisoning::ConnectionPoisoningInterceptor; use crate::client::identity::no_auth::NoAuthIdentityResolver; +use crate::client::identity::IdentityCache; use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; use aws_smithy_async::rt::sleep::AsyncSleep; @@ -243,6 +241,8 @@ impl OperationBuilder { ))); self.runtime_components .push_auth_scheme(SharedAuthScheme::new(NoAuthScheme::default())); + self.runtime_components + .set_identity_cache(Some(IdentityCache::no_cache())); self.runtime_components.push_identity_resolver( NO_AUTH_SCHEME_ID, SharedIdentityResolver::new(NoAuthIdentityResolver::new()), @@ -325,18 +325,10 @@ impl OperationBuilder { let service_name = self.service_name.expect("service_name required"); let operation_name = self.operation_name.expect("operation_name required"); - let defaults = [ - default_http_client_plugin(), - default_retry_config_plugin(service_name.clone()), - default_sleep_impl_plugin(), - default_time_source_plugin(), - default_timeout_config_plugin(), - ] - .into_iter() - .flatten(); - let mut runtime_plugins = RuntimePlugins::new() - .with_client_plugins(defaults) + .with_client_plugins(default_plugins( + DefaultPluginParams::new().with_retry_partition_name(service_name.clone()), + )) .with_client_plugin( StaticRuntimePlugin::new() .with_config(self.config.freeze()) From 12bed905bbd68bfa062734573a8ec1b0bcf44467 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 24 Oct 2023 12:15:23 -0400 Subject: [PATCH 191/331] Fix bug where Custom Auth Schemes were not respected (#3087) ## Motivation and Context - Fixes #3034 ## Description Because AuthSchemeOptions were being registered at the operation level, there was no way for them to be overridden by customer-provided runtime plugins. This moves them into a separate plugin that is added at Client/Default priority. ## Testing - new unit test ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../smithy/rustsdk/SigV4AuthDecorator.kt | 31 ++- .../customizations/HttpAuthDecorator.kt | 8 +- .../smithy/customizations/NoAuthDecorator.kt | 18 +- .../customize/ClientCodegenDecorator.kt | 2 +- .../generators/AuthOptionsPluginGenerator.kt | 78 ++++++++ .../smithy/generators/OperationGenerator.kt | 20 +- .../OperationRuntimePluginGenerator.kt | 63 ------ .../customizations/HttpAuthDecoratorTest.kt | 189 ++++++++++++++++++ .../codegen/core/rustlang/CargoDependency.kt | 2 + .../rust/codegen/core/rustlang/RustWriter.kt | 6 + .../rust/codegen/core/smithy/RuntimeType.kt | 6 + .../core/testutil/CodegenIntegrationTest.kt | 5 +- .../smithy/rust/codegen/core/util/Exec.kt | 7 + rust-runtime/inlineable/src/auth_plugin.rs | 39 ++++ rust-runtime/inlineable/src/lib.rs | 4 + 16 files changed, 396 insertions(+), 88 deletions(-) create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt create mode 100644 rust-runtime/inlineable/src/auth_plugin.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 0faa2266e8a..7d66e72675f 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -468,3 +468,9 @@ message = "Clients now have a default async sleep implementation so that one doe references = ["smithy-rs#3071"] meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = "Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority." +references = ["smithy-rs#3034", "smithy-rs#3087"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "rcoh" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index ed66fa67fff..46f070e18e2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -35,24 +35,37 @@ import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.isInputEventStream +import software.amazon.smithy.rust.codegen.core.util.thenSingletonListOf class SigV4AuthDecorator : ClientCodegenDecorator { override val name: String get() = "SigV4AuthDecorator" override val order: Byte = 0 + private val sigv4a = "sigv4a" + + private fun sigv4(runtimeConfig: RuntimeConfig) = writable { + val awsRuntimeAuthModule = AwsRuntimeType.awsRuntime(runtimeConfig).resolve("auth") + rust("#T", awsRuntimeAuthModule.resolve("sigv4::SCHEME_ID")) + } + + private fun sigv4a(runtimeConfig: RuntimeConfig) = writable { + val awsRuntimeAuthModule = AwsRuntimeType.awsRuntime(runtimeConfig).resolve("auth") + featureGateBlock(sigv4a) { + rust("#T", awsRuntimeAuthModule.resolve("sigv4a::SCHEME_ID")) + } + } + override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, baseAuthSchemeOptions: List, - ): List = baseAuthSchemeOptions + AuthSchemeOption.StaticAuthSchemeOption(SigV4Trait.ID) { - val awsRuntimeAuthModule = AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig).resolve("auth") - rust("#T,", awsRuntimeAuthModule.resolve("sigv4::SCHEME_ID")) - if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { - featureGateBlock("sigv4a") { - rust("#T", awsRuntimeAuthModule.resolve("sigv4a::SCHEME_ID")) - } - rust(",") - } + ): List { + val supportsSigV4a = codegenContext.serviceShape.supportedAuthSchemes().contains(sigv4a) + .thenSingletonListOf { sigv4a(codegenContext.runtimeConfig) } + return baseAuthSchemeOptions + AuthSchemeOption.StaticAuthSchemeOption( + SigV4Trait.ID, + listOf(sigv4(codegenContext.runtimeConfig)) + supportsSigV4a, + ) } override fun serviceRuntimePluginCustomizations( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index 4f73d1d3767..bb2f0c17f0d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -97,9 +97,11 @@ class HttpAuthDecorator : ClientCodegenDecorator { options.add( StaticAuthSchemeOption( schemeShapeId, - writable { - rustTemplate("$name,", *codegenScope) - }, + listOf( + writable { + rustTemplate(name, *codegenScope) + }, + ), ), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt index 38582fabcde..bc68c958c88 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOpt import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType val noAuthSchemeShapeId: ShapeId = ShapeId.from("aws.smithy.rs#NoAuth") @@ -30,10 +31,15 @@ class NoAuthDecorator : ClientCodegenDecorator { operationShape: OperationShape, baseAuthSchemeOptions: List, ): List = baseAuthSchemeOptions + - AuthSchemeOption.StaticAuthSchemeOption(noAuthSchemeShapeId) { - rustTemplate( - "#{NO_AUTH_SCHEME_ID},", - "NO_AUTH_SCHEME_ID" to noAuthModule(codegenContext).resolve("NO_AUTH_SCHEME_ID"), - ) - } + AuthSchemeOption.StaticAuthSchemeOption( + noAuthSchemeShapeId, + listOf( + writable { + rustTemplate( + "#{NO_AUTH_SCHEME_ID}", + "NO_AUTH_SCHEME_ID" to noAuthModule(codegenContext).resolve("NO_AUTH_SCHEME_ID"), + ) + }, + ), + ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt index 36a517bb188..bfbbb056982 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt @@ -30,7 +30,7 @@ sealed interface AuthSchemeOption { /** Auth scheme for the `StaticAuthSchemeOptionResolver` */ data class StaticAuthSchemeOption( val schemeShapeId: ShapeId, - val constructor: Writable, + val constructor: List, ) : AuthSchemeOption class CustomResolver(/* unimplemented */) : AuthSchemeOption diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt new file mode 100644 index 00000000000..2fd61b38062 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt @@ -0,0 +1,78 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import software.amazon.smithy.model.knowledge.ServiceIndex +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.traits.OptionalAuthTrait +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customizations.noAuthSchemeShapeId +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.isEmpty +import software.amazon.smithy.rust.codegen.core.rustlang.join +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import java.util.logging.Logger + +class AuthOptionsPluginGenerator(private val codegenContext: ClientCodegenContext) { + private val runtimeConfig = codegenContext.runtimeConfig + + private val logger: Logger = Logger.getLogger(javaClass.name) + fun authPlugin(operationShape: OperationShape, authSchemeOptions: List) = writable { + rustTemplate( + """ + #{DefaultAuthOptionsPlugin}::new(vec![#{options}]) + + """, + "DefaultAuthOptionsPlugin" to RuntimeType.defaultAuthPlugin(runtimeConfig), + "options" to actualAuthSchemes(operationShape, authSchemeOptions).join(", "), + ) + } + + private fun actualAuthSchemes(operationShape: OperationShape, authSchemeOptions: List): List { + val out: MutableList = mutableListOf() + + var noSupportedAuthSchemes = true + val authSchemes = ServiceIndex.of(codegenContext.model) + .getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) + + for (schemeShapeId in authSchemes.keys) { + val optionsForScheme = authSchemeOptions.filter { + when (it) { + is AuthSchemeOption.CustomResolver -> false + is AuthSchemeOption.StaticAuthSchemeOption -> { + it.schemeShapeId == schemeShapeId + } + } + } + + if (optionsForScheme.isNotEmpty()) { + out.addAll(optionsForScheme.flatMap { (it as AuthSchemeOption.StaticAuthSchemeOption).constructor }) + noSupportedAuthSchemes = false + } else { + logger.warning( + "No auth scheme implementation available for $schemeShapeId. " + + "The generated client will not attempt to use this auth scheme.", + ) + } + } + if (operationShape.hasTrait() || noSupportedAuthSchemes) { + val authOption = authSchemeOptions.find { + it is AuthSchemeOption.StaticAuthSchemeOption && it.schemeShapeId == noAuthSchemeShapeId + } + ?: throw IllegalStateException("Missing 'no auth' implementation. This is a codegen bug.") + out += (authOption as AuthSchemeOption.StaticAuthSchemeOption).constructor + } + if (out.any { it.isEmpty() }) { + PANIC("Got an empty auth scheme constructor. This is a bug. $out") + } + return out + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 9a3793b7669..04e03f1af8e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -51,7 +51,8 @@ open class OperationGenerator( operationShape: OperationShape, codegenDecorator: ClientCodegenDecorator, ) { - val operationCustomizations = codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList()) + val operationCustomizations = + codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList()) renderOperationStruct( operationWriter, operationShape, @@ -94,7 +95,8 @@ open class OperationGenerator( "Operation" to symbolProvider.toSymbol(operationShape), "OperationError" to errorType, "OperationOutput" to outputType, - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), + "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) val additionalPlugins = writable { @@ -102,6 +104,13 @@ open class OperationGenerator( operationCustomizations, OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), ) + rustTemplate( + ".with_client_plugin(#{auth_plugin})", + "auth_plugin" to AuthOptionsPluginGenerator(codegenContext).authPlugin( + operationShape, + authSchemeOptions, + ), + ) } rustTemplate( """ @@ -157,11 +166,13 @@ open class OperationGenerator( *codegenScope, "Error" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Error"), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::error::OrchestratorError"), + "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::orchestrator::error::OrchestratorError"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), - "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::invoke_with_stop_point"), + "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig) + .resolve("client::orchestrator::invoke_with_stop_point"), "additional_runtime_plugins" to writable { if (additionalPlugins.isNotEmpty()) { rustTemplate( @@ -182,7 +193,6 @@ open class OperationGenerator( operationWriter, operationShape, operationName, - authSchemeOptions, operationCustomizations, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index 6782d2d8dcd..226334d7d0d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -5,23 +5,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators -import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customizations.noAuthSchemeShapeId -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.hasTrait -import java.util.logging.Logger /** * Generates operation-level runtime plugins @@ -29,7 +21,6 @@ import java.util.logging.Logger class OperationRuntimePluginGenerator( private val codegenContext: ClientCodegenContext, ) { - private val logger: Logger = Logger.getLogger(javaClass.name) private val codegenScope = codegenContext.runtimeConfig.let { rc -> val runtimeApi = RuntimeType.smithyRuntimeApi(rc) val smithyTypes = RuntimeType.smithyTypes(rc) @@ -57,7 +48,6 @@ class OperationRuntimePluginGenerator( writer: RustWriter, operationShape: OperationShape, operationStructName: String, - authSchemeOptions: List, customizations: List, ) { writer.rustTemplate( @@ -80,7 +70,6 @@ class OperationRuntimePluginGenerator( fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { #{Cow}::Owned( #{RuntimeComponentsBuilder}::new(${operationShape.id.name.dq()}) - #{auth_options} #{interceptors} #{retry_classifiers} ) @@ -91,7 +80,6 @@ class OperationRuntimePluginGenerator( """, *codegenScope, *preludeScope, - "auth_options" to generateAuthOptions(operationShape, authSchemeOptions), "additional_config" to writable { writeCustomizations( customizations, @@ -122,55 +110,4 @@ class OperationRuntimePluginGenerator( }, ) } - - private fun generateAuthOptions( - operationShape: OperationShape, - authSchemeOptions: List, - ): Writable = writable { - if (authSchemeOptions.any { it is AuthSchemeOption.CustomResolver }) { - throw IllegalStateException("AuthSchemeOption.CustomResolver is unimplemented") - } else { - withBlockTemplate( - """ - .with_auth_scheme_option_resolver(#{Some}( - #{SharedAuthSchemeOptionResolver}::new( - #{StaticAuthSchemeOptionResolver}::new(vec![ - """, - "]))))", - *codegenScope, - ) { - var noSupportedAuthSchemes = true - val authSchemes = ServiceIndex.of(codegenContext.model) - .getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) - - for (schemeShapeId in authSchemes.keys) { - val optionsForScheme = authSchemeOptions.filter { - when (it) { - is AuthSchemeOption.CustomResolver -> false - is AuthSchemeOption.StaticAuthSchemeOption -> { - it.schemeShapeId == schemeShapeId - } - } - } - - if (optionsForScheme.isNotEmpty()) { - optionsForScheme.forEach { (it as AuthSchemeOption.StaticAuthSchemeOption).constructor(this) } - noSupportedAuthSchemes = false - } else { - logger.warning( - "No auth scheme implementation available for $schemeShapeId. " + - "The generated client will not attempt to use this auth scheme.", - ) - } - } - if (operationShape.hasTrait() || noSupportedAuthSchemes) { - val authOption = authSchemeOptions.find { - it is AuthSchemeOption.StaticAuthSchemeOption && it.schemeShapeId == noAuthSchemeShapeId - } - ?: throw IllegalStateException("Missing 'no auth' implementation. This is a codegen bug.") - (authOption as AuthSchemeOption.StaticAuthSchemeOption).constructor(this) - } - } - } - } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index 76bb3f90b44..b2d7984b2d8 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rawRust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -98,6 +99,171 @@ class HttpAuthDecoratorTest { } } + @Test + fun noAuthCustomAuth() { + clientIntegrationTest(TestModels.noSchemes) { ctx, rustCrate -> + rustCrate.integrationTest("custom_auth_scheme_works") { + val moduleName = ctx.moduleUseName() + rawRust( + """ + use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; + use aws_smithy_runtime_api::client::auth::AuthScheme; + use aws_smithy_runtime_api::client::auth::{AuthSchemeId, Sign}; + use aws_smithy_runtime_api::client::identity::{ + IdentityFuture, ResolveIdentity, SharedIdentityResolver, + }; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::auth::Signer; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponentsBuilder, + }; + use aws_smithy_runtime_api::client::identity::Identity; + use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; + use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; + use aws_smithy_types::config_bag::ConfigBag; + use std::borrow::Cow; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + #[derive(Debug)] + struct CustomAuthRuntimePlugin { + components: RuntimeComponentsBuilder, + } + + impl RuntimePlugin for CustomAuthRuntimePlugin { + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.components) + } + } + + #[derive(Debug)] + struct TestAuthScheme { signer: CustomSigner } + + impl AuthScheme for TestAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + AuthSchemeId::new("customauth") + } + + fn identity_resolver( + &self, + identity_resolvers: &dyn GetIdentityResolver, + ) -> Option { + identity_resolvers.identity_resolver(self.scheme_id()) + } + + fn signer(&self) -> &dyn Sign { + &self.signer + } + } + + #[derive(Debug, Default)] + struct CustomSigner; + + #[derive(Debug)] + struct CustomIdentity(String); + + impl Signer for CustomSigner { + fn sign_http_request( + &self, + request: &mut HttpRequest, + identity: &Identity, + // In some advanced use cases, the Smithy `@endpointRuleSet` can + // provide additional context in this config: + _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, + _config_bag: &ConfigBag, + ) -> Result<(), BoxError> { + // Downcast the identity to our known `Login` type + let login = identity + .data::() + .ok_or("custom auth requires a `Login` identity")?; + // Use the login to add an authorization header to the request + request.headers_mut().try_append( + http::header::AUTHORIZATION, + login.0.to_string() + )?; + Ok(()) + } + } + + + #[derive(Debug)] + struct TestResolver; + impl ResolveIdentity for TestResolver { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(CustomIdentity("password".to_string()), None))) + } + } + + impl CustomAuthRuntimePlugin { + pub fn new() -> Self { + let scheme_id = AuthSchemeId::new("customauth"); + Self { + components: RuntimeComponentsBuilder::new("test-auth-scheme") + // Register our auth scheme + .with_auth_scheme(TestAuthScheme { signer: CustomSigner }) + // Register our identity resolver with our auth scheme ID + .with_identity_resolver( + // This scheme ID needs to match the scheme ID returned in the auth scheme implementation + scheme_id, + TestResolver, + ) + // Set the auth scheme option resolver to always use our basic auth auth scheme + .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![ + scheme_id, + ]))), + } + } + } + + #[test] + fn compile() {} + + """, + + ) + Attribute.TokioTest.render(this) + rustTemplate( + """ + async fn apply_custom_auth_scheme() { + let (_guard, _rx) = #{capture_test_logs}(); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "password") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); + let config = $moduleName::Config::builder() + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) + .runtime_plugin(CustomAuthRuntimePlugin::new()) + .build(); + let client = $moduleName::Client::from_conf(config); + let _req = dbg!(client.some_operation() + .send() + .await).expect("request should succeed"); + + http_client.assert_requests_match(&[]); + } + """, + "capture_test_logs" to CargoDependency.smithyRuntimeTestUtil(ctx.runtimeConfig).toType() + .resolve("test_util::capture_test_logs::capture_test_logs"), + *codegenScope(ctx.runtimeConfig), + ) + } + } + } + @Test fun apiKeyInQueryString() { clientIntegrationTest(TestModels.apiKeyInQueryString) { codegenContext, rustCrate -> @@ -329,6 +495,29 @@ private object TestModels { } """.asSmithyModel() + val noSchemes = """ + namespace test + + use aws.api#service + use aws.protocols#restJson1 + + @service(sdkId: "Test Api Key Auth") + @restJson1 + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + operation SomeOperation { + output: SomeOutput + }""".asSmithyModel() + val apiKeyInQueryString = """ namespace test diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 85bfc185930..56c9003b837 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -89,6 +89,8 @@ class InlineDependency( private fun forInlineableRustFile(name: String, vararg additionalDependencies: RustDependency) = forRustFile(RustModule.private(name), "/inlineable/src/$name.rs", *additionalDependencies) + fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = forInlineableRustFile("auth_plugin", CargoDependency.smithyRuntimeApi(runtimeConfig)) + fun jsonErrors(runtimeConfig: RuntimeConfig) = forInlineableRustFile( "json_errors", diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt index d9b54d35b05..764f3b08c3c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt @@ -169,6 +169,12 @@ fun > T.rust( this.write(contents.trim(), *args) } +fun > T.rawRust( + @Language("Rust", prefix = "macro_rules! foo { () => {{\n", suffix = "\n}}}") contents: String, +) { + this.write(escape(contents.trim())) +} + /** * Convenience wrapper that tells Intellij that the contents of this block are Rust */ diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 7ccf2e9479b..f728db76c5b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -401,8 +401,10 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun retryErrorKind(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("retry::ErrorKind") fun eventStreamReceiver(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::Receiver") + fun eventStreamSender(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::EventStreamSender") + fun futuresStreamCompatByteStream(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("futures_stream_adapter::FuturesStreamCompatByteStream") @@ -418,6 +420,10 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun awsQueryCompatibleErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.awsQueryCompatibleErrors(runtimeConfig)) + fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = + RuntimeType.forInlineDependency(InlineDependency.defaultAuthPlugin(runtimeConfig)) + .resolve("DefaultAuthOptionsPlugin") + fun labelFormat(runtimeConfig: RuntimeConfig, func: String) = smithyHttp(runtimeConfig).resolve("label::$func") fun operation(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("operation::Operation") fun operationModule(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("operation") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt index 4c1d4352048..6970b9c2846 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.util.runCommand import java.io.File import java.nio.file.Path +import java.util.logging.Logger /** * A helper class holding common data with defaults that is threaded through several functions, to make their @@ -41,6 +42,8 @@ fun codegenIntegrationTest(model: Model, params: IntegrationTestParams, invokePl ) invokePlugin(ctx) ctx.fileManifest.printGeneratedFiles() - params.command?.invoke(testDir) ?: (params.cargoCommand ?: "cargo test").runCommand(testDir, environment = mapOf("RUSTFLAGS" to "-D warnings")) + val logger = Logger.getLogger("CodegenIntegrationTest") + val out = params.command?.invoke(testDir) ?: (params.cargoCommand ?: "cargo test --lib --tests").runCommand(testDir, environment = mapOf("RUSTFLAGS" to "-D warnings")) + logger.fine(out.toString()) return testDir } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt index f7a08f62f3f..64223fe5500 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt @@ -8,10 +8,14 @@ package software.amazon.smithy.rust.codegen.core.util import java.io.IOException import java.nio.file.Path import java.util.concurrent.TimeUnit +import java.util.logging.Logger data class CommandError(val output: String) : Exception("Command Error\n$output") fun String.runCommand(workdir: Path? = null, environment: Map = mapOf(), timeout: Long = 3600): String { + val logger = Logger.getLogger("RunCommand") + logger.fine("Invoking comment $this in `$workdir` with env $environment") + val start = System.currentTimeMillis() val parts = this.split("\\s".toRegex()) val builder = ProcessBuilder(*parts.toTypedArray()) .redirectOutput(ProcessBuilder.Redirect.PIPE) @@ -38,5 +42,8 @@ fun String.runCommand(workdir: Path? = null, environment: Map = throw CommandError("$this was not a valid command.\n Hint: is everything installed?\n$err") } catch (other: Exception) { throw CommandError("Unexpected exception thrown when executing subprocess:\n$other") + } finally { + val end = System.currentTimeMillis() + logger.fine("command duration: ${end - start}ms") } } diff --git a/rust-runtime/inlineable/src/auth_plugin.rs b/rust-runtime/inlineable/src/auth_plugin.rs new file mode 100644 index 00000000000..068eaa3da28 --- /dev/null +++ b/rust-runtime/inlineable/src/auth_plugin.rs @@ -0,0 +1,39 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::borrow::Cow; + +use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; +use aws_smithy_runtime_api::client::auth::AuthSchemeId; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{Order, RuntimePlugin}; + +#[derive(Debug)] +pub(crate) struct DefaultAuthOptionsPlugin { + runtime_components: RuntimeComponentsBuilder, +} + +impl DefaultAuthOptionsPlugin { + pub(crate) fn new(auth_schemes: Vec) -> Self { + let runtime_components = RuntimeComponentsBuilder::new("default_auth_options") + .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new( + auth_schemes, + ))); + Self { runtime_components } + } +} + +impl RuntimePlugin for DefaultAuthOptionsPlugin { + fn order(&self) -> Order { + Order::Defaults + } + + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) + } +} diff --git a/rust-runtime/inlineable/src/lib.rs b/rust-runtime/inlineable/src/lib.rs index b672eeef9dd..01490bcee5b 100644 --- a/rust-runtime/inlineable/src/lib.rs +++ b/rust-runtime/inlineable/src/lib.rs @@ -26,6 +26,10 @@ mod serialization_settings; #[allow(unused)] mod endpoint_lib; + +#[allow(unused)] +mod auth_plugin; + // This test is outside of uuid.rs to enable copying the entirety of uuid.rs into the SDK without // requiring a proptest dependency #[cfg(test)] From 08a533ffd33c3e8c246c362e0bbeed055a5e93cf Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:06:17 +0100 Subject: [PATCH 192/331] RustType renders types with wrong syntax (#3090) The correct syntax is `HashMap::` instead of `HashMap` and so on. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../client/FluentClientGeneratorTest.kt | 4 +- .../rust/codegen/core/rustlang/RustType.kt | 52 +++++++++---------- .../codegen/core/rustlang/RustTypeTest.kt | 10 ++-- .../codegen/core/smithy/SymbolVisitorTest.kt | 6 +-- .../UnconstrainedShapeSymbolProviderTest.kt | 2 +- 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index 1b9d76eb961..f36c0dbfdcc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -55,8 +55,8 @@ class FluentClientGeneratorTest { fun `generate correct input docs`() { val expectations = mapOf( "listValue" to "list_value(impl Into)", - "doubleListValue" to "double_list_value(Vec)", - "mapValue" to "map_value(impl Into, Vec)", + "doubleListValue" to "double_list_value(Vec::)", + "mapValue" to "map_value(impl Into, Vec::)", "byteValue" to "byte_value(i8)", ) expectations.forEach { (name, expect) -> diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 5a46d9fa115..873ead1bc85 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -56,29 +56,29 @@ sealed class RustType { * * When formatted, the converted type will appear as such: * - * | Type | Formatted | - * | -------------------------------------------------- | ------------------------------------------------------------------- | - * | RustType.Unit | () | - * | RustType.Bool | bool | - * | RustType.Float(32) | f32 | - * | RustType.Float(64) | f64 | - * | RustType.Integer(8) | i8 | - * | RustType.Integer(16) | i16 | - * | RustType.Integer(32) | i32 | - * | RustType.Integer(64) | i64 | - * | RustType.String | std::string::String | - * | RustType.Vec(RustType.String) | std::vec::Vec | - * | RustType.Slice(RustType.String) | [std::string::String] | - * | RustType.HashMap(RustType.String, RustType.String) | std::collections::HashMap | - * | RustType.HashSet(RustType.String) | std::vec::Vec | - * | RustType.Reference("&", RustType.String) | &std::string::String | - * | RustType.Reference("&mut", RustType.String) | &mut std::string::String | - * | RustType.Reference("&'static", RustType.String) | &'static std::string::String | - * | RustType.Option(RustType.String) | std::option::Option | - * | RustType.Box(RustType.String) | std::boxed::Box | - * | RustType.Opaque("SoCool", "zelda_is") | zelda_is::SoCool | - * | RustType.Opaque("SoCool") | SoCool | - * | RustType.Dyn(RustType.Opaque("Foo", "foo")) | dyn foo::Foo | + * | Type | Formatted | + * | -------------------------------------------------- | ------------------------------------------------------------------- | + * | RustType.Unit | () | + * | RustType.Bool | bool | + * | RustType.Float(32) | f32 | + * | RustType.Float(64) | f64 | + * | RustType.Integer(8) | i8 | + * | RustType.Integer(16) | i16 | + * | RustType.Integer(32) | i32 | + * | RustType.Integer(64) | i64 | + * | RustType.String | std::string::String | + * | RustType.Vec(RustType.String) | std::vec::Vec:: | + * | RustType.Slice(RustType.String) | [std::string::String] | + * | RustType.HashMap(RustType.String, RustType.String) | std::collections::HashMap::| + * | RustType.HashSet(RustType.String) | std::vec::Vec:: | + * | RustType.Reference("&", RustType.String) | &std::string::String | + * | RustType.Reference("&mut", RustType.String) | &mut std::string::String | + * | RustType.Reference("&'static", RustType.String) | &'static std::string::String | + * | RustType.Option(RustType.String) | std::option::Option | + * | RustType.Box(RustType.String) | std::boxed::Box | + * | RustType.Opaque("SoCool", "zelda_is") | zelda_is::SoCool | + * | RustType.Opaque("SoCool") | SoCool | + * | RustType.Dyn(RustType.Opaque("Foo", "foo")) | dyn foo::Foo | */ val writable = writable { rustInlineTemplate("#{this}", "this" to this@RustType) } @@ -244,10 +244,10 @@ fun RustType.render(fullyQualified: Boolean = true): String { is RustType.Float -> this.name is RustType.Integer -> this.name is RustType.String -> this.name - is RustType.Vec -> "${this.name}<${this.member.render(fullyQualified)}>" + is RustType.Vec -> "${this.name}::<${this.member.render(fullyQualified)}>" is RustType.Slice -> "[${this.member.render(fullyQualified)}]" - is RustType.HashMap -> "${this.name}<${this.key.render(fullyQualified)}, ${this.member.render(fullyQualified)}>" - is RustType.HashSet -> "${this.name}<${this.member.render(fullyQualified)}>" + is RustType.HashMap -> "${this.name}::<${this.key.render(fullyQualified)}, ${this.member.render(fullyQualified)}>" + is RustType.HashSet -> "${this.name}::<${this.member.render(fullyQualified)}>" is RustType.Reference -> { if (this.lifetime == "&") { "&${this.member.render(fullyQualified)}" diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt index 1c89f39058a..c0443166f90 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt @@ -61,7 +61,7 @@ internal class RustTypesTest { fun `RustType_Vec_writable produces a template-compatible RuntimeType`() { forInputExpectOutput( RustType.Vec(RustType.String).writable, - "'::std::vec::Vec<::std::string::String>'", + "'::std::vec::Vec::<::std::string::String>'", ) } @@ -77,7 +77,7 @@ internal class RustTypesTest { fun `RustType_HashMap_writable produces a template-compatible RuntimeType`() { forInputExpectOutput( RustType.HashMap(RustType.String, RustType.String).writable, - "'::std::collections::HashMap<::std::string::String, ::std::string::String>'", + "'::std::collections::HashMap::<::std::string::String, ::std::string::String>'", ) } @@ -87,7 +87,7 @@ internal class RustTypesTest { RustType.HashSet(RustType.String).writable, // Rust doesn't guarantee that `HashSet`s are insertion ordered, so we use a `Vec` instead. // This is called out in a comment in the RustType.HashSet declaration - "'::std::vec::Vec<::std::string::String>'", + "'::std::vec::Vec::<::std::string::String>'", ) } @@ -146,8 +146,8 @@ internal class RustTypesTest { @Test fun `types render properly`() { val type = RustType.Box(RustType.Option(RustType.Reference("a", RustType.Vec(RustType.String)))) - type.render(false) shouldBe "Box>>" - type.render(true) shouldBe "::std::boxed::Box<::std::option::Option<&'a ::std::vec::Vec<::std::string::String>>>" + type.render(false) shouldBe "Box>>" + type.render(true) shouldBe "::std::boxed::Box<::std::option::Option<&'a ::std::vec::Vec::<::std::string::String>>>" } @Test diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt index 3c47ca4f672..06485823c69 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt @@ -153,7 +153,7 @@ class SymbolVisitorTest { val provider: SymbolProvider = testSymbolProvider(model) val setSymbol = provider.toSymbol(set) - setSymbol.rustType().render(false) shouldBe "${RustType.HashSet.Type}" + setSymbol.rustType().render(false) shouldBe "${RustType.HashSet.Type}::" setSymbol.referenceClosure().map { it.name } shouldBe listOf(RustType.HashSet.Type, "String") } @@ -172,7 +172,7 @@ class SymbolVisitorTest { val provider: SymbolProvider = testSymbolProvider(model) val setSymbol = provider.toSymbol(set) - setSymbol.rustType().render(false) shouldBe "Vec" + setSymbol.rustType().render(false) shouldBe "Vec::" setSymbol.referenceClosure().map { it.name } shouldBe listOf("Vec", "Record") } @@ -193,7 +193,7 @@ class SymbolVisitorTest { val provider: SymbolProvider = testSymbolProvider(model) val setSymbol = provider.toSymbol(set) - setSymbol.rustType().render(false) shouldBe "Vec>" + setSymbol.rustType().render(false) shouldBe "Vec::>" setSymbol.referenceClosure().map { it.name } shouldBe listOf("Vec", "Option", "Record") } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt index 5f47e10779a..edb4d9a6fc9 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt @@ -98,6 +98,6 @@ class UnconstrainedShapeSymbolProviderTest { val structureBShape = model.lookup("test#StructureB") unconstrainedShapeSymbolProvider.toSymbol(structureBShape).rustType().render() shouldBe "crate::model::StructureB" - unconstrainedShapeSymbolProvider.toSymbol(listAShape).rustType().render() shouldBe "::std::vec::Vec" + unconstrainedShapeSymbolProvider.toSymbol(listAShape).rustType().render() shouldBe "::std::vec::Vec::" } } From 2a51e0bceb57a99b13ff37e6afe90808f028f0eb Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 25 Oct 2023 11:45:22 -0500 Subject: [PATCH 193/331] Feature-gate public use of `http-body` and `hyper` within `aws-smithy-types` (#3088) ## Motivation and Context Implements https://github.com/awslabs/smithy-rs/issues/3033 ## Description This PR hides behind cargo features the third-party types from `http-body` and `hyper` crates that are used in`aws-smithy-types`' public API. Customers need to opt-in by enabling a cargo feature `http-body-0-4-x` in `aws-smithy-types` to create an `SdkBody` or `ByteStream` using those third-party types. For more details, please see [the upgrade guide](https://github.com/awslabs/smithy-rs/discussions/3089). As can been seen from code changes, to reduce the surface area where we need to feature-gate things, we have fused the `aws_smithy_types::body::Inner::Streaming` enum variant into `aws_smithy_types::body::Inner::Dyn` variant, thereby removing `SdkBody::from_dyn`. ## Testing Relied on existing tests in CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Zelda Hessler --- CHANGELOG.next.toml | 12 + aws/rust-runtime/aws-inlineable/Cargo.toml | 2 +- .../src/http_request_checksum.rs | 6 +- .../src/http_response_checksum.rs | 6 +- .../glacier/tests/custom-headers.rs | 6 +- .../integration-tests/s3/tests/checksums.rs | 2 +- .../customize/RequiredCustomizations.kt | 4 +- .../protocols/HttpBoundProtocolGenerator.kt | 6 +- .../ServerRequiredCustomizations.kt | 10 +- .../aws-smithy-http-server-python/Cargo.toml | 2 +- .../src/pytests/bytestream.rs | 2 +- .../src/types.rs | 4 +- .../aws-smithy-http-server/Cargo.toml | 2 +- rust-runtime/aws-smithy-http/Cargo.toml | 2 +- rust-runtime/aws-smithy-http/src/body.rs | 4 - .../src/event_stream/receiver.rs | 18 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 2 +- .../src/client/http/hyper_014.rs | 5 +- .../src/client/http/test_util/dvr/record.rs | 2 +- .../src/client/http/test_util/dvr/replay.rs | 2 +- .../tests/reconnect_on_transient_error.rs | 4 +- rust-runtime/aws-smithy-types/Cargo.toml | 7 +- .../aws-smithy-types/external-types.toml | 7 +- rust-runtime/aws-smithy-types/src/body.rs | 202 +++++++--------- .../src/body/http_body_0_4_x.rs | 91 ++++++++ .../aws-smithy-types/src/byte_stream.rs | 220 ++++-------------- .../src/byte_stream/bytestream_util.rs | 118 ++++++---- .../src/byte_stream/http_body_0_4_x.rs | 172 ++++++++++++++ 28 files changed, 537 insertions(+), 383 deletions(-) create mode 100644 rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs create mode 100644 rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 7d66e72675f..c5c9f7adff0 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -474,3 +474,15 @@ message = "Enable custom auth schemes to work by changing the code generated aut references = ["smithy-rs#3034", "smithy-rs#3087"] meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "rcoh" + +[[smithy-rs]] +message = "Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3089) for details." +references = ["smithy-rs#3033", "smithy-rs#3088"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "ysaito1001" + +[[smithy-rs]] +message = "`ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it." +references = ["smithy-rs#3033", "smithy-rs#3088"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 2e902d27760..0657b00e5db 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -21,7 +21,7 @@ aws-smithy-checksums = { path = "../../../rust-runtime/aws-smithy-checksums" } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } +aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types", features = ["http-body-0-4-x"] } bytes = "1" hex = "0.4.3" http = "0.2.9" diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index 846fbb52741..239133414e1 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -19,7 +19,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; -use aws_smithy_types::body::{BoxBody, SdkBody}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use aws_smithy_types::error::operation::BuildError; use http::HeaderValue; @@ -173,7 +173,7 @@ fn wrap_streaming_request_body_in_checksum_calculating_body( let body = AwsChunkedBody::new(body, aws_chunked_body_options); - SdkBody::from_dyn(BoxBody::new(body)) + SdkBody::from_body_0_4(body) }) }; @@ -269,7 +269,7 @@ mod tests { let crc32c_checksum = crc32c_checksum.finalize(); let mut request = HttpRequest::new( - ByteStream::read_from() + ByteStream::read_with_body_0_4_from() .path(&file) .buffer_size(1024) .build() diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index d770b44bf33..687790cffff 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -14,7 +14,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ }; use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; -use aws_smithy_types::body::{BoxBody, SdkBody}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; use http::HeaderValue; use std::{fmt, mem}; @@ -119,11 +119,11 @@ pub(crate) fn wrap_body_with_checksum_validator( use aws_smithy_checksums::body::validate; body.map(move |body| { - SdkBody::from_dyn(BoxBody::new(validate::ChecksumBody::new( + SdkBody::from_body_0_4(validate::ChecksumBody::new( body, checksum_algorithm.into_impl(), precalculated_checksum.clone(), - ))) + )) }) } diff --git a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs index 52194567cc5..46536dd2cdd 100644 --- a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs +++ b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs @@ -21,7 +21,11 @@ async fn set_correct_headers() { let _resp = client .upload_archive() .vault_name("vault") - .body(ByteStream::from_path("tests/test-file.txt").await.unwrap()) + .body( + ByteStream::from_path_body_0_4("tests/test-file.txt") + .await + .unwrap(), + ) .send() .await; let req = handler.expect_request(); diff --git a/aws/sdk/integration-tests/s3/tests/checksums.rs b/aws/sdk/integration-tests/s3/tests/checksums.rs index 37782182e01..97155bfc09d 100644 --- a/aws/sdk/integration-tests/s3/tests/checksums.rs +++ b/aws/sdk/integration-tests/s3/tests/checksums.rs @@ -177,7 +177,7 @@ async fn test_checksum_on_streaming_request<'a>( use std::io::Write; file.write_all(body).unwrap(); - let body = aws_sdk_s3::primitives::ByteStream::read_from() + let body = aws_sdk_s3::primitives::ByteStream::read_with_body_0_4_from() .path(file.path()) .buffer_size(1024) .build() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index a1956f442e9..22ec93e842e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -71,12 +71,12 @@ class RequiredCustomizations : ClientCodegenDecorator { override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val rc = codegenContext.runtimeConfig - // Add rt-tokio feature for `ByteStream::from_path` + // Add rt-tokio and http-body-0-4-x features for `ByteStream::from_path_0_4` rustCrate.mergeFeature( Feature( "rt-tokio", true, - listOf("aws-smithy-async/rt-tokio", "aws-smithy-http/rt-tokio"), + listOf("aws-smithy-async/rt-tokio", "aws-smithy-types/rt-tokio", "aws-smithy-types/http-body-0-4-x"), ), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt index 1f60c251acb..f3cc0abad08 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt @@ -29,12 +29,12 @@ class ClientHttpBoundProtocolPayloadGenerator( _cfg.interceptor_state().store_put(signer_sender); let adapter: #{aws_smithy_http}::event_stream::MessageStreamAdapter<_, _> = ${params.outerName}.${params.memberName}.into_body_stream(marshaller, error_marshaller, signer); - let body: #{SdkBody} = #{hyper}::Body::wrap_stream(adapter).into(); - body + #{SdkBody}::from_body_0_4(#{hyper}::Body::wrap_stream(adapter)) } """, "hyper" to CargoDependency.HyperWithStream.toType(), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "SdkBody" to CargoDependency.smithyTypes(codegenContext.runtimeConfig).withFeature("http-body-0-4-x") + .toType().resolve("body::SdkBody"), "aws_smithy_http" to RuntimeType.smithyHttp(codegenContext.runtimeConfig), "DeferredSigner" to RuntimeType.smithyEventStream(codegenContext.runtimeConfig).resolve("frame::DeferredSigner"), "marshallerConstructorFn" to params.marshallerConstructorFn, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index a353eb636b6..dde2e91baee 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -37,8 +37,14 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { override fun extras(codegenContext: ServerCodegenContext, rustCrate: RustCrate) { val rc = codegenContext.runtimeConfig - // Add rt-tokio feature for `ByteStream::from_path` - rustCrate.mergeFeature(Feature("rt-tokio", true, listOf("aws-smithy-http/rt-tokio"))) + // Add rt-tokio and http-body-0-4-x features for `ByteStream::from_path_body_0_4` + rustCrate.mergeFeature( + Feature( + "rt-tokio", + true, + listOf("aws-smithy-types/rt-tokio", "aws-smithy-types/http-body-0-4-x"), + ), + ) rustCrate.withModule(ServerRustModule.Types) { pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) diff --git a/rust-runtime/aws-smithy-http-server-python/Cargo.toml b/rust-runtime/aws-smithy-http-server-python/Cargo.toml index 61ce57d7a76..ebf17bd0658 100644 --- a/rust-runtime/aws-smithy-http-server-python/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server-python/Cargo.toml @@ -16,7 +16,7 @@ publish = true aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-http-server = { path = "../aws-smithy-http-server", features = ["aws-lambda"] } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-types = { path = "../aws-smithy-types", features = ["byte-stream-poll-next", "http-body-0-4-x"] } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1.2" futures = "0.3" diff --git a/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs b/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs index c82ffb233ba..0f15f5177e2 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs @@ -147,5 +147,5 @@ async def handler(bytestream): fn streaming_bytestream_from_vec(chunks: Vec<&'static str>) -> ByteStream { let stream = stream::iter(chunks.into_iter().map(Ok::<_, io::Error>)); let body = Body::wrap_stream(stream); - ByteStream::new(SdkBody::from(body)) + ByteStream::new(SdkBody::from_body_0_4(body)) } diff --git a/rust-runtime/aws-smithy-http-server-python/src/types.rs b/rust-runtime/aws-smithy-http-server-python/src/types.rs index 1af75dbd27d..a475f623512 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/types.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/types.rs @@ -407,7 +407,7 @@ impl ByteStream { #[staticmethod] pub fn from_path_blocking(py: Python, path: String) -> PyResult> { let byte_stream = Handle::current().block_on(async { - aws_smithy_types::byte_stream::ByteStream::from_path(path) + aws_smithy_types::byte_stream::ByteStream::from_path_body_0_4(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string())) })?; @@ -423,7 +423,7 @@ impl ByteStream { #[staticmethod] pub fn from_path(py: Python, path: String) -> PyResult<&PyAny> { pyo3_asyncio::tokio::future_into_py(py, async move { - let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path(path) + let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path_body_0_4(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string()))?; Ok(Self(Arc::new(Mutex::new(byte_stream)))) diff --git a/rust-runtime/aws-smithy-http-server/Cargo.toml b/rust-runtime/aws-smithy-http-server/Cargo.toml index f1cd62c2d46..3193b69e75b 100644 --- a/rust-runtime/aws-smithy-http-server/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server/Cargo.toml @@ -21,7 +21,7 @@ request-id = ["dep:uuid"] async-trait = "0.1" aws-smithy-http = { path = "../aws-smithy-http", features = ["rt-tokio"] } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x", "hyper-0-14-x"] } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1.1" futures-util = { version = "0.3.16", default-features = false } diff --git a/rust-runtime/aws-smithy-http/Cargo.toml b/rust-runtime/aws-smithy-http/Cargo.toml index 4f9641013e9..e8bbb1e61ff 100644 --- a/rust-runtime/aws-smithy-http/Cargo.toml +++ b/rust-runtime/aws-smithy-http/Cargo.toml @@ -16,7 +16,7 @@ rt-tokio = ["aws-smithy-types/rt-tokio"] [dependencies] aws-smithy-eventstream = { path = "../aws-smithy-eventstream", optional = true } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-types = { path = "../aws-smithy-types", features = ["byte-stream-poll-next", "http-body-0-4-x"] } bytes = "1" bytes-utils = "0.1" http = "0.2.3" diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-http/src/body.rs index bd961ce383e..05e9776ccce 100644 --- a/rust-runtime/aws-smithy-http/src/body.rs +++ b/rust-runtime/aws-smithy-http/src/body.rs @@ -8,10 +8,6 @@ //! Types for representing the body of an HTTP request or response -/// A boxed generic HTTP body that, when consumed, will result in [`Bytes`](bytes::Bytes) or an [`Error`](aws_smithy_types::body::Error). -#[deprecated(note = "Moved to `aws_smithy_types::body::BoxBody`.")] -pub type BoxBody = aws_smithy_types::body::BoxBody; - /// A generic, boxed error that's `Send` and `Sync` #[deprecated(note = "`Moved to `aws_smithy_types::body::Error`.")] pub type Error = aws_smithy_types::body::Error; diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index eb6e7544318..dd9b9cd021e 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -342,7 +342,7 @@ mod tests { let chunks: Vec> = vec![Ok(encode_message("one")), Ok(encode_message("two"))]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -363,7 +363,7 @@ mod tests { Ok(Bytes::from_static(&[])), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -384,7 +384,7 @@ mod tests { Ok(encode_message("three").split_to(10)), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -410,7 +410,7 @@ mod tests { )), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -463,7 +463,7 @@ mod tests { ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); for payload in &["one", "two", "three", "four", "five", "six", "seven", "eight"] { assert_eq!( @@ -483,7 +483,7 @@ mod tests { Err(IOError::new(ErrorKind::ConnectionReset, FakeError)), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -504,7 +504,7 @@ mod tests { Ok(Bytes::from_static(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -521,7 +521,7 @@ mod tests { let chunks: Vec> = vec![Ok(encode_initial_response()), Ok(encode_message("one"))]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert!(receiver.try_recv_initial().await.unwrap().is_some()); assert_eq!( @@ -535,7 +535,7 @@ mod tests { let chunks: Vec> = vec![Ok(encode_message("one")), Ok(encode_message("two"))]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert!(receiver.try_recv_initial().await.unwrap().is_none()); assert_eq!( diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index 751758be8ea..f0af47c00bc 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -25,7 +25,7 @@ aws-smithy-async = { path = "../aws-smithy-async" } aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-protocol-test = { path = "../aws-smithy-protocol-test", optional = true } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x"] } bytes = "1" fastrand = "2.0.0" http = "0.2.8" diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 7bcdc13082a..abb643ab89b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -358,7 +358,10 @@ where let mut client = self.client.clone(); let fut = client.call(request); HttpConnectorFuture::new(async move { - Ok(fut.await.map_err(downcast_error)?.map(SdkBody::from)) + Ok(fut + .await + .map_err(downcast_error)? + .map(SdkBody::from_body_0_4)) }) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs index 912a409b26b..3403ffcc0db 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs @@ -88,7 +88,7 @@ fn record_body( event_bus: Arc>>, ) -> JoinHandle<()> { let (sender, output_body) = hyper::Body::channel(); - let real_body = std::mem::replace(body, SdkBody::from(output_body)); + let real_body = std::mem::replace(body, SdkBody::from_body_0_4(output_body)); tokio::spawn(async move { let mut real_body = real_body; let mut sender = sender; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index d0f868a19c5..f24cb36fb2b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -294,7 +294,7 @@ impl HttpConnector for ReplayingClient { let _initial_request = events.pop_front().unwrap(); let (sender, response_body) = hyper::Body::channel(); - let body = SdkBody::from(response_body); + let body = SdkBody::from_body_0_4(response_body); let recording = self.recorded_requests.clone(); let recorded_request = tokio::spawn(async move { let mut data_read = vec![]; diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs index 9b4f4c2666e..c07ccab405a 100644 --- a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -23,7 +23,7 @@ use aws_smithy_runtime::{ev, match_events}; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; -use aws_smithy_types::body::{BoxBody, SdkBody}; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig}; use aws_smithy_types::timeout::TimeoutConfig; use hyper::client::Builder as HyperBuilder; @@ -150,7 +150,7 @@ async fn wire_level_test( let request = http::Request::builder() .uri(endpoint_url.clone()) // Make the body non-replayable since we don't actually want to retry - .body(SdkBody::from_dyn(BoxBody::new(SdkBody::from("body")))) + .body(SdkBody::from_body_0_4(SdkBody::from("body"))) .unwrap() .try_into() .unwrap(); diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index 0b3796d9bd1..42f50191a9e 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -11,6 +11,9 @@ license = "Apache-2.0" repository = "https://github.com/awslabs/smithy-rs" [features] +byte-stream-poll-next = [] +http-body-0-4-x = ["dep:http-body-0-4"] +hyper-0-14-x = ["dep:hyper-0-14"] rt-tokio = ["dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] test-util = [] serde-serialize = [] @@ -21,8 +24,8 @@ base64-simd = "0.8" bytes = "1" bytes-utils = "0.1" http = "0.2.3" -http-body = "0.4.4" -hyper = "0.14.26" +http-body-0-4 = { package = "http-body", version = "0.4.4", optional = true } +hyper-0-14 = { package = "hyper", version = "0.14.26", optional = true } itoa = "1.0.0" num-integer = "0.1.44" pin-project-lite = "0.2.9" diff --git a/rust-runtime/aws-smithy-types/external-types.toml b/rust-runtime/aws-smithy-types/external-types.toml index ad90d2a11be..4609bce1d19 100644 --- a/rust-runtime/aws-smithy-types/external-types.toml +++ b/rust-runtime/aws-smithy-types/external-types.toml @@ -2,14 +2,13 @@ allowed_external_types = [ "bytes::bytes::Bytes", "bytes::buf::buf_impl::Buf", - # TODO(https://github.com/awslabs/smithy-rs/issues/3033): Feature gate based on unstable versions + # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "http_body::Body", - "http_body::combinators::box_body::BoxBody", "hyper::body::body::Body", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate Tokio `AsyncRead` + # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "tokio::io::async_read::AsyncRead", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate references to Tokio `File` + # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "tokio::fs::file::File", ] diff --git a/rust-runtime/aws-smithy-types/src/body.rs b/rust-runtime/aws-smithy-types/src/body.rs index ae21207bfa9..043aa47df35 100644 --- a/rust-runtime/aws-smithy-types/src/body.rs +++ b/rust-runtime/aws-smithy-types/src/body.rs @@ -6,15 +6,20 @@ //! Types for representing the body of an HTTP request or response use bytes::Bytes; -use http::{HeaderMap, HeaderValue}; -use http_body::{Body, SizeHint}; use pin_project_lite::pin_project; use std::error::Error as StdError; use std::fmt::{self, Debug, Formatter}; +use std::future::poll_fn; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; +/// This module is named after the `http-body` version number since we anticipate +/// needing to provide equivalent functionality for 1.x of that crate in the future. +/// The name has a suffix `_x` to avoid name collision with a third-party `http-body-0-4`. +#[cfg(feature = "http-body-0-4-x")] +pub mod http_body_0_4_x; + /// A generic, boxed error that's `Send` and `Sync` pub type Error = Box; @@ -49,7 +54,10 @@ impl Debug for SdkBody { } /// A boxed generic HTTP body that, when consumed, will result in [`Bytes`] or an [`Error`]. -pub type BoxBody = http_body::combinators::BoxBody; +enum BoxBody { + #[cfg(feature = "http-body-0-4-x")] + HttpBody04(http_body_0_4::combinators::BoxBody), +} pin_project! { #[project = InnerProj] @@ -59,14 +67,9 @@ pin_project! { inner: Option }, // A streaming body - Streaming { - #[pin] - inner: hyper::Body - }, - // Also a streaming body Dyn { #[pin] - inner: BoxBody + inner: BoxBody, }, /// When a streaming body is transferred out to a stream parser, the body is replaced with @@ -80,33 +83,22 @@ impl Debug for Inner { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match &self { Inner::Once { inner: once } => f.debug_tuple("Once").field(once).finish(), - Inner::Streaming { inner: streaming } => { - f.debug_tuple("Streaming").field(streaming).finish() - } - Inner::Taken => f.debug_tuple("Taken").finish(), Inner::Dyn { .. } => write!(f, "BoxBody"), + Inner::Taken => f.debug_tuple("Taken").finish(), } } } impl SdkBody { - /// Construct an SdkBody from a Boxed implementation of http::Body - pub fn from_dyn(body: BoxBody) -> Self { - Self { - inner: Inner::Dyn { inner: body }, - rebuild: None, - bytes_contents: None, - } - } - /// Construct an explicitly retryable SDK body /// /// _Note: This is probably not what you want_ /// /// All bodies constructed from in-memory data (`String`, `Vec`, `Bytes`, etc.) will be - /// retryable out of the box. If you want to read data from a file, you should use - /// [`ByteStream::from_path`](crate::byte_stream::ByteStream::from_path). This function - /// is only necessary when you need to enable retries for your own streaming container. + /// retryable out of the box. If you want to read data from a file, you should turn on a feature + /// `http-body-0-4-x` and use `ByteStream::from_path_body_0_4`. + /// + /// This function is only necessary when you need to enable retries for your own streaming container. pub fn retryable(f: impl Fn() -> SdkBody + Send + Sync + 'static) -> Self { let initial = f(); SdkBody { @@ -135,9 +127,14 @@ impl SdkBody { } } - fn poll_inner( + pub(crate) async fn next(&mut self) -> Option> { + let mut me = Pin::new(self); + poll_fn(|cx| me.as_mut().poll_next(cx)).await + } + + pub(crate) fn poll_next( self: Pin<&mut Self>, - cx: &mut Context<'_>, + #[allow(unused)] cx: &mut Context<'_>, ) -> Poll>> { let this = self.project(); match this.inner.project() { @@ -149,8 +146,17 @@ impl SdkBody { None => Poll::Ready(None), } } - InnerProj::Streaming { inner: body } => body.poll_data(cx).map_err(|e| e.into()), - InnerProj::Dyn { inner: box_body } => box_body.poll_data(cx), + InnerProj::Dyn { inner: body } => match body.get_mut() { + #[cfg(feature = "http-body-0-4-x")] + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + Pin::new(box_body).poll_data(cx) + } + #[allow(unreachable_patterns)] + _ => unreachable!( + "enabling `http-body-0-4-x` is the only way to create the `Dyn` variant" + ), + }, InnerProj::Taken => { Poll::Ready(Some(Err("A `Taken` body should never be polled".into()))) } @@ -184,7 +190,53 @@ impl SdkBody { /// Return the length, in bytes, of this SdkBody. If this returns `None`, then the body does not /// have a known length. pub fn content_length(&self) -> Option { - http_body::Body::size_hint(self).exact() + match self.bounds_on_remaining_length() { + (lo, Some(hi)) if lo == hi => Some(lo), + _ => None, + } + } + + #[allow(dead_code)] // used by a feature-gated `http-body`'s trait method + pub(crate) fn is_end_stream(&self) -> bool { + match &self.inner { + Inner::Once { inner: None } => true, + Inner::Once { inner: Some(bytes) } => bytes.is_empty(), + Inner::Dyn { inner: box_body } => match box_body { + #[cfg(feature = "http-body-0-4-x")] + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + box_body.is_end_stream() + } + #[allow(unreachable_patterns)] + _ => unreachable!( + "enabling `http-body-0-4-x` is the only way to create the `Dyn` variant" + ), + }, + Inner::Taken => true, + } + } + + pub(crate) fn bounds_on_remaining_length(&self) -> (u64, Option) { + match &self.inner { + Inner::Once { inner: None } => (0, Some(0)), + Inner::Once { inner: Some(bytes) } => { + let len = bytes.len() as u64; + (len, Some(len)) + } + Inner::Dyn { inner: box_body } => match box_body { + #[cfg(feature = "http-body-0-4-x")] + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + let hint = box_body.size_hint(); + (hint.lower(), hint.upper()) + } + #[allow(unreachable_patterns)] + _ => unreachable!( + "enabling `http-body-0-4-x` is the only way to create the `Dyn` variant" + ), + }, + Inner::Taken => (0, Some(0)), + } } /// Given a function to modify an `SdkBody`, run that function against this `SdkBody` before @@ -238,16 +290,6 @@ impl From for SdkBody { } } -impl From for SdkBody { - fn from(body: hyper::Body) -> Self { - SdkBody { - inner: Inner::Streaming { inner: body }, - rebuild: None, - bytes_contents: None, - } - } -} - impl From> for SdkBody { fn from(data: Vec) -> Self { Self::from(Bytes::from(data)) @@ -266,64 +308,15 @@ impl From<&[u8]> for SdkBody { } } -impl http_body::Body for SdkBody { - type Data = Bytes; - type Error = Error; - - fn poll_data( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll>> { - self.poll_inner(cx) - } - - fn poll_trailers( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - ) -> Poll>, Self::Error>> { - Poll::Ready(Ok(None)) - } - - fn is_end_stream(&self) -> bool { - match &self.inner { - Inner::Once { inner: None } => true, - Inner::Once { inner: Some(bytes) } => bytes.is_empty(), - Inner::Streaming { inner: hyper_body } => hyper_body.is_end_stream(), - Inner::Dyn { inner: box_body } => box_body.is_end_stream(), - Inner::Taken => true, - } - } - - fn size_hint(&self) -> SizeHint { - match &self.inner { - Inner::Once { inner: None } => SizeHint::with_exact(0), - Inner::Once { inner: Some(bytes) } => SizeHint::with_exact(bytes.len() as u64), - Inner::Streaming { inner: hyper_body } => hyper_body.size_hint(), - Inner::Dyn { inner: box_body } => box_body.size_hint(), - Inner::Taken => SizeHint::new(), - } - } -} - #[cfg(test)] mod test { - use crate::body::{BoxBody, SdkBody}; - use http_body::Body; + use crate::body::SdkBody; use std::pin::Pin; #[test] fn valid_size_hint() { - assert_eq!(SdkBody::from("hello").size_hint().exact(), Some(5)); - assert_eq!(SdkBody::from("").size_hint().exact(), Some(0)); - } - - #[test] - fn map_preserve_preserves_bytes_hint() { - let initial = SdkBody::from("hello!"); - assert_eq!(initial.bytes(), Some(b"hello!".as_slice())); - - let new_body = initial.map_preserve_contents(|body| SdkBody::from_dyn(BoxBody::new(body))); - assert_eq!(new_body.bytes(), Some(b"hello!".as_slice())); + assert_eq!(SdkBody::from("hello").content_length(), Some(5)); + assert_eq!(SdkBody::from("").content_length(), Some(0)); } #[allow(clippy::bool_assert_comparison)] @@ -337,9 +330,9 @@ mod test { async fn http_body_consumes_data() { let mut body = SdkBody::from("hello!"); let mut body = Pin::new(&mut body); - let data = body.data().await; + let data = body.next().await; assert!(data.is_some()); - let data = body.data().await; + let data = body.next().await; assert!(data.is_none()); } @@ -348,31 +341,14 @@ mod test { // Its important to avoid sending empty chunks of data to avoid H2 data frame problems let mut body = SdkBody::from(""); let mut body = Pin::new(&mut body); - let data = body.data().await; + let data = body.next().await; assert!(data.is_none()); } #[test] fn sdkbody_debug_once() { let body = SdkBody::from("123"); - // actually don't really care what the debug impl is, just that it doesn't crash - let _ = format!("{:?}", body); - } - - #[test] - fn sdkbody_debug_dyn() { - let hyper_body = hyper::Body::channel().1; - let body = SdkBody::from_dyn(BoxBody::new(hyper_body.map_err(|e| e.into()))); - // actually don't really care what the debug impl is, just that it doesn't crash - let _ = format!("{:?}", body); - } - - #[test] - fn sdkbody_debug_hyper() { - let hyper_body = hyper::Body::channel().1; - let body = SdkBody::from(hyper_body); - // actually don't really care what the debug impl is, just that it doesn't crash - let _ = format!("{:?}", body); + assert!(format!("{:?}", body).contains("Once")); } #[test] diff --git a/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs b/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs new file mode 100644 index 00000000000..2c6a597c41c --- /dev/null +++ b/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs @@ -0,0 +1,91 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::body::{BoxBody, Error, Inner, SdkBody}; +use bytes::Bytes; +use std::pin::Pin; +use std::task::{Context, Poll}; + +impl SdkBody { + /// Construct an `SdkBody` from a type that implements [`http_body_0_4::Body`](http_body_0_4::Body). + /// + /// _Note: This is only available with `http-body-0-4-x` enabled._ + pub fn from_body_0_4(body: T) -> Self + where + T: http_body_0_4::Body + Send + Sync + 'static, + E: Into + 'static, + { + Self { + inner: Inner::Dyn { + inner: BoxBody::HttpBody04(http_body_0_4::combinators::BoxBody::new( + body.map_err(Into::into), + )), + }, + rebuild: None, + bytes_contents: None, + } + } +} + +#[cfg(feature = "hyper-0-14-x")] +impl From for SdkBody { + fn from(body: hyper_0_14::Body) -> Self { + SdkBody::from_body_0_4(body) + } +} + +impl http_body_0_4::Body for SdkBody { + type Data = Bytes; + type Error = Error; + + fn poll_data( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + self.poll_next(cx) + } + + fn poll_trailers( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll>, Self::Error>> { + Poll::Ready(Ok(None)) + } + + fn is_end_stream(&self) -> bool { + self.is_end_stream() + } + + fn size_hint(&self) -> http_body_0_4::SizeHint { + let mut result = http_body_0_4::SizeHint::default(); + let (lower, upper) = self.bounds_on_remaining_length(); + result.set_lower(lower); + if let Some(u) = upper { + result.set_upper(u) + } + result + } +} + +#[cfg(test)] +mod tests { + use crate::body::SdkBody; + + #[test] + fn map_preserve_preserves_bytes_hint() { + let initial = SdkBody::from("hello!"); + assert_eq!(initial.bytes(), Some(b"hello!".as_slice())); + + let new_body = initial.map_preserve_contents(|body| SdkBody::from_body_0_4(body)); + assert_eq!(new_body.bytes(), Some(b"hello!".as_slice())); + } + + #[test] + fn sdkbody_debug_dyn() { + let hyper_body = hyper_0_14::Body::channel().1; + let body = SdkBody::from_body_0_4(hyper_body); + assert!(format!("{:?}", body).contains("BoxBody")); + } +} diff --git a/rust-runtime/aws-smithy-types/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs index 909bea34c0f..0db39f4bd1f 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -78,10 +78,10 @@ //! //! ### Create a ByteStream from a file //! -//! _Note: This is only available with `rt-tokio` enabled._ +//! _Note: This is only available with `rt-tokio` and `http-body-0-4-x` enabled._ //! //! ```no_run -//! # #[cfg(feature = "rt-tokio")] +//! # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] //! # { //! use aws_smithy_types::byte_stream::ByteStream; //! use std::path::Path; @@ -90,7 +90,7 @@ //! } //! //! async fn bytestream_from_file() -> GetObjectInput { -//! let bytestream = ByteStream::from_path("docs/some-large-file.csv") +//! let bytestream = ByteStream::from_path_body_0_4("docs/some-large-file.csv") //! .await //! .expect("valid path"); //! GetObjectInput { body: bytestream } @@ -99,10 +99,10 @@ //! ``` //! //! If you want more control over how the file is read, such as specifying the size of the buffer used to read the file -//! or the length of the file, use an [`FsBuilder`](crate::byte_stream::FsBuilder). +//! or the length of the file, use an `FsBuilder`. //! //! ```no_run -//! # #[cfg(feature = "rt-tokio")] +//! # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] //! # { //! use aws_smithy_types::byte_stream::{ByteStream, Length}; //! use std::path::Path; @@ -111,7 +111,7 @@ //! } //! //! async fn bytestream_from_file() -> GetObjectInput { -//! let bytestream = ByteStream::read_from().path("docs/some-large-file.csv") +//! let bytestream = ByteStream::read_with_body_0_4_from().path("docs/some-large-file.csv") //! .buffer_size(32_784) //! .length(Length::Exact(123_456)) //! .build() @@ -127,7 +127,6 @@ use crate::byte_stream::error::Error; use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; -use http_body::Body; use pin_project_lite::pin_project; use std::future::poll_fn; use std::io::IoSlice; @@ -144,6 +143,12 @@ pub mod error; #[cfg(feature = "rt-tokio")] pub use self::bytestream_util::FsBuilder; +/// This module is named after the `http-body` version number since we anticipate +/// needing to provide equivalent functionality for 1.x of that crate in the future. +/// The name has a suffix `_x` to avoid name collision with a third-party `http-body-0-4`. +#[cfg(feature = "http-body-0-4-x")] +pub mod http_body_0_4_x; + pin_project! { /// Stream of binary data /// @@ -230,33 +235,43 @@ pin_project! { /// ``` /// /// 2. **From a file**: ByteStreams created from a path can be retried. A new file descriptor will be opened if a retry occurs. + /// + /// _Note: The `http-body-0-4-x` feature must be active to call `ByteStream::from_body_0_4`._ + /// /// ```no_run - /// #[cfg(feature = "tokio-rt")] + /// #[cfg(all(feature = "tokio-rt", feature = "http-body-0-4-x"))] /// # { /// use aws_smithy_types::byte_stream::ByteStream; - /// let stream = ByteStream::from_path("big_file.csv"); + /// let stream = ByteStream::from_path_body_0_4("big_file.csv"); /// # } /// ``` /// /// 3. **From an `SdkBody` directly**: For more advanced / custom use cases, a ByteStream can be created directly /// from an SdkBody. **When created from an SdkBody, care must be taken to ensure retriability.** An SdkBody is retryable /// when constructed from in-memory data or when using [`SdkBody::retryable`](crate::body::SdkBody::retryable). + /// + /// _Note: The `http-body-0-4-x` feature must be active to construct an `SdkBody` with `from_body_0_4`._ + /// /// ```no_run + /// # #[cfg(feature = "http-body-0-4-x")] + /// # { + /// # use hyper_0_14 as hyper; /// use aws_smithy_types::byte_stream::ByteStream; /// use aws_smithy_types::body::SdkBody; /// use bytes::Bytes; /// let (mut tx, channel_body) = hyper::Body::channel(); /// // this will not be retryable because the SDK has no way to replay this stream - /// let stream = ByteStream::new(SdkBody::from(channel_body)); + /// let stream = ByteStream::new(SdkBody::from_body_0_4(channel_body)); /// tx.send_data(Bytes::from_static(b"hello world!")); /// tx.send_data(Bytes::from_static(b"hello again!")); /// // NOTE! You must ensure that `tx` is dropped to ensure that EOF is sent + /// # } /// ``` /// #[derive(Debug)] pub struct ByteStream { #[pin] - inner: Inner + inner: Inner, } } @@ -291,8 +306,12 @@ impl ByteStream { Some(self.inner.next().await?.map_err(Error::streaming)) } + #[cfg(feature = "byte-stream-poll-next")] /// Attempt to pull out the next value of this stream, returning `None` if the stream is /// exhausted. + // This should only be used when one needs to implement a trait method like + // `futures_core::stream::Stream::poll_next` on a new-type wrapping a `ByteStream`. + // In general, use the `next` method instead. pub fn poll_next( self: Pin<&mut Self>, cx: &mut Context<'_>, @@ -334,77 +353,6 @@ impl ByteStream { self.inner.collect().await.map_err(Error::streaming) } - /// Returns a [`FsBuilder`](crate::byte_stream::FsBuilder), allowing you to build a `ByteStream` with - /// full control over how the file is read (eg. specifying the length of the file or the size of the buffer used to read the file). - /// ```no_run - /// # #[cfg(feature = "rt-tokio")] - /// # { - /// use aws_smithy_types::byte_stream::{ByteStream, Length}; - /// - /// async fn bytestream_from_file() -> ByteStream { - /// let bytestream = ByteStream::read_from() - /// .path("docs/some-large-file.csv") - /// // Specify the size of the buffer used to read the file (in bytes, default is 4096) - /// .buffer_size(32_784) - /// // Specify the length of the file used (skips an additional call to retrieve the size) - /// .length(Length::Exact(123_456)) - /// .build() - /// .await - /// .expect("valid path"); - /// bytestream - /// } - /// # } - /// ``` - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub fn read_from() -> FsBuilder { - FsBuilder::new() - } - - /// Create a ByteStream that streams data from the filesystem - /// - /// This function creates a retryable ByteStream for a given `path`. The returned ByteStream - /// will provide a size hint when used as an HTTP body. If the request fails, the read will - /// begin again by reloading the file handle. - /// - /// ## Warning - /// The contents of the file MUST not change during retries. The length & checksum of the file - /// will be cached. If the contents of the file change, the operation will almost certainly fail. - /// - /// Furthermore, a partial write MAY seek in the file and resume from the previous location. - /// - /// Note: If you want more control, such as specifying the size of the buffer used to read the file - /// or the length of the file, use a [`FsBuilder`](crate::byte_stream::FsBuilder) as returned - /// from `ByteStream::read_from` - /// - /// # Examples - /// ```no_run - /// use aws_smithy_types::byte_stream::ByteStream; - /// use std::path::Path; - /// async fn make_bytestream() -> ByteStream { - /// ByteStream::from_path("docs/rows.csv").await.expect("file should be readable") - /// } - /// ``` - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub async fn from_path(path: impl AsRef) -> Result { - FsBuilder::new().path(path).build().await - } - - /// Create a ByteStream from a file - /// - /// NOTE: This will NOT result in a retryable ByteStream. For a ByteStream that can be retried in the case of - /// upstream failures, use [`ByteStream::from_path`](ByteStream::from_path) - #[deprecated( - since = "0.40.0", - note = "Prefer the more extensible ByteStream::read_from() API" - )] - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub async fn from_file(file: tokio::fs::File) -> Result { - FsBuilder::new().file(file).build().await - } - #[cfg(feature = "rt-tokio")] /// Convert this `ByteStream` into a struct that implements [`AsyncRead`](tokio::io::AsyncRead). /// @@ -433,7 +381,9 @@ impl ByteStream { mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll> { - Pin::new(&mut self.0).poll_next(cx) + Pin::new(&mut self.0.inner) + .poll_next(cx) + .map_err(Error::streaming) } } tokio_util::io::StreamReader::new(FuturesStreamCompatByteStream(self)) @@ -479,12 +429,6 @@ impl From> for ByteStream { } } -impl From for ByteStream { - fn from(input: hyper::Body) -> Self { - ByteStream::new(SdkBody::from(input)) - } -} - /// Non-contiguous Binary Data Storage /// /// When data is read from the network, it is read in a sequence of chunks that are not in @@ -543,23 +487,19 @@ impl Buf for AggregatedBytes { } pin_project! { - #[derive(Debug, Clone, PartialEq, Eq)] - struct Inner { + #[derive(Debug)] + struct Inner { #[pin] - body: B, + body: SdkBody, } } -impl Inner { - fn new(body: B) -> Self { +impl Inner { + fn new(body: SdkBody) -> Self { Self { body } } - async fn next(&mut self) -> Option> - where - Self: Unpin, - B: http_body::Body, - { + async fn next(&mut self) -> Option> { let mut me = Pin::new(self); poll_fn(|cx| me.as_mut().poll_next(cx)).await } @@ -567,43 +507,34 @@ impl Inner { fn poll_next( self: Pin<&mut Self>, cx: &mut Context<'_>, - ) -> Poll>> - where - B: http_body::Body, - { - self.project().body.poll_data(cx) + ) -> Poll>> { + self.project().body.poll_next(cx) } - async fn collect(self) -> Result - where - B: http_body::Body, - { + async fn collect(self) -> Result { let mut output = SegmentedBuf::new(); let body = self.body; pin_utils::pin_mut!(body); - while let Some(buf) = body.data().await { + while let Some(buf) = body.next().await { output.push(buf?); } Ok(AggregatedBytes(output)) } - fn size_hint(&self) -> (u64, Option) - where - B: http_body::Body, - { - let size_hint = http_body::Body::size_hint(&self.body); - (size_hint.lower(), size_hint.upper()) + fn size_hint(&self) -> (u64, Option) { + self.body.bounds_on_remaining_length() } } #[cfg(test)] mod tests { + use crate::body::SdkBody; use crate::byte_stream::Inner; use bytes::Bytes; #[tokio::test] async fn read_from_string_body() { - let body = hyper::Body::from("a simple body"); + let body = SdkBody::from("a simple body"); assert_eq!( Inner::new(body) .collect() @@ -614,63 +545,6 @@ mod tests { ); } - #[tokio::test] - async fn read_from_channel_body() { - let (mut sender, body) = hyper::Body::channel(); - let byte_stream = Inner::new(body); - tokio::spawn(async move { - sender.send_data(Bytes::from("data 1")).await.unwrap(); - sender.send_data(Bytes::from("data 2")).await.unwrap(); - sender.send_data(Bytes::from("data 3")).await.unwrap(); - }); - assert_eq!( - byte_stream.collect().await.expect("no errors").into_bytes(), - Bytes::from("data 1data 2data 3") - ); - } - - #[cfg(feature = "rt-tokio")] - #[tokio::test] - async fn path_based_bytestreams() -> Result<(), Box> { - use super::ByteStream; - use bytes::Buf; - use http_body::Body; - use std::io::Write; - use tempfile::NamedTempFile; - let mut file = NamedTempFile::new()?; - - for i in 0..10000 { - writeln!(file, "Brian was here. Briefly. {}", i)?; - } - let body = ByteStream::from_path(&file).await?.into_inner(); - // assert that a valid size hint is immediately ready - assert_eq!(body.size_hint().exact(), Some(298890)); - let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); - // read a little bit from one of the clones - let some_data = body1 - .data() - .await - .expect("should have some data") - .expect("read should not fail"); - assert!(!some_data.is_empty()); - // make some more clones - let body2 = body.try_clone().expect("retryable bodies are cloneable"); - let body3 = body.try_clone().expect("retryable bodies are cloneable"); - let body2 = ByteStream::new(body2).collect().await?.into_bytes(); - let body3 = ByteStream::new(body3).collect().await?.into_bytes(); - assert_eq!(body2, body3); - assert!(body2.starts_with(b"Brian was here.")); - assert!(body2.ends_with(b"9999\n")); - assert_eq!(body2.len(), 298890); - - assert_eq!( - ByteStream::new(body1).collect().await?.remaining(), - 298890 - some_data.len() - ); - - Ok(()) - } - #[cfg(feature = "rt-tokio")] #[tokio::test] async fn bytestream_into_async_read() { diff --git a/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs index 91ad71e9174..467733b0022 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs @@ -5,14 +5,10 @@ use crate::body::SdkBody; use crate::byte_stream::{error::Error, error::ErrorKind, ByteStream}; -use bytes::Bytes; -use futures_core::ready; -use http::HeaderMap; -use http_body::{Body, SizeHint}; use std::future::Future; use std::path::PathBuf; use std::pin::Pin; -use std::task::{Context, Poll}; +use std::sync::Arc; use tokio::fs::File; use tokio::io::{self, AsyncReadExt, AsyncSeekExt}; use tokio_util::io::ReaderStream; @@ -60,9 +56,11 @@ impl PathBody { /// Builder for creating [`ByteStreams`](ByteStream) from a file/path, with full control over advanced options. /// +/// _Note: A cargo feature `http-body-0-4-x` should be active to call `ByteStream::read_with_body_0_4_from` in the following example._ +/// /// Example usage: /// ```no_run -/// # #[cfg(feature = "rt-tokio")] +/// # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] /// # { /// use aws_smithy_types::byte_stream::{ByteStream, Length}; /// use std::path::Path; @@ -71,7 +69,7 @@ impl PathBody { /// } /// /// async fn bytestream_from_file() -> GetObjectInput { -/// let bytestream = ByteStream::read_from() +/// let bytestream = ByteStream::read_with_body_0_4_from() /// .path("docs/some-large-file.csv") /// // Specify the size of the buffer used to read the file (in bytes, default is 4096) /// .buffer_size(32_784) @@ -91,12 +89,12 @@ pub struct FsBuilder { length: Option, buffer_size: usize, offset: Option, + sdk_body_creator: SdkBodyCreator, } -impl Default for FsBuilder { - fn default() -> Self { - Self::new() - } +enum SdkBodyCreator { + #[cfg(feature = "http-body-0-4-x")] + HttpBody04(Arc SdkBody + Send + Sync + 'static>), } /// The length (in bytes) to read. Determines whether or not a short read counts as an error. @@ -110,16 +108,22 @@ pub enum Length { } impl FsBuilder { + #[cfg(feature = "http-body-0-4-x")] /// Create a new [`FsBuilder`] (using a default read buffer of 4096 bytes). /// /// You must then call either [`file`](FsBuilder::file) or [`path`](FsBuilder::path) to specify what to read from. - pub fn new() -> Self { - FsBuilder { + /// + /// _Note: This is only available with `http-body-0-4-x` enabled._ + pub fn new_with_body_0_4() -> Self { + Self { buffer_size: DEFAULT_BUFFER_SIZE, file: None, length: None, offset: None, path: None, + sdk_body_creator: SdkBodyCreator::HttpBody04(Arc::new(|body: PathBody| { + SdkBody::from_body_0_4(body) + })), } } @@ -199,12 +203,19 @@ impl FsBuilder { let body_loader = move || { // If an offset was provided, seeking will be handled in `PathBody::poll_data` each // time the file is loaded. - SdkBody::from_dyn(http_body::combinators::BoxBody::new(PathBody::from_path( - path.clone(), - length, - buffer_size, - self.offset, - ))) + match &self.sdk_body_creator { + #[cfg(feature = "http-body-0-4-x")] + SdkBodyCreator::HttpBody04(f) => f(PathBody::from_path( + path.clone(), + length, + buffer_size, + self.offset, + )), + #[allow(unreachable_patterns)] + _ => unreachable!( + "`http-body-0-4-x` should've been enabled to create an `FsBuilder`" + ), + } }; Ok(ByteStream::new(SdkBody::retryable(body_loader))) @@ -214,9 +225,14 @@ impl FsBuilder { let _s = file.seek(io::SeekFrom::Start(offset)).await?; } - let body = SdkBody::from_dyn(http_body::combinators::BoxBody::new( - PathBody::from_file(file, length, buffer_size), - )); + let body = match self.sdk_body_creator { + #[cfg(feature = "http-body-0-4-x")] + SdkBodyCreator::HttpBody04(f) => f(PathBody::from_file(file, length, buffer_size)), + #[allow(unreachable_patterns)] + _ => unreachable!( + "`http-body-0-4-x` should've been enabled to create an `FsBuilder`" + ), + }; Ok(ByteStream::new(body)) } else { @@ -240,14 +256,16 @@ enum State { Loaded(ReaderStream>), } -impl Body for PathBody { - type Data = Bytes; +#[cfg(feature = "http-body-0-4-x")] +impl http_body_0_4::Body for PathBody { + type Data = bytes::Bytes; type Error = Box; fn poll_data( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll>> { + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll>> { + use std::task::Poll; let offset = self.offset.unwrap_or(DEFAULT_OFFSET); loop { match self.state { @@ -264,7 +282,7 @@ impl Body for PathBody { })); } State::Loading(ref mut future) => { - match ready!(Pin::new(future).poll(cx)) { + match futures_core::ready!(Pin::new(future).poll(cx)) { Ok(file) => { self.state = State::Loaded(ReaderStream::with_capacity( file.take(self.length), @@ -276,7 +294,7 @@ impl Body for PathBody { } State::Loaded(ref mut stream) => { use futures_core::Stream; - return match ready!(Pin::new(stream).poll_next(cx)) { + return match futures_core::ready!(std::pin::Pin::new(stream).poll_next(cx)) { Some(Ok(bytes)) => Poll::Ready(Some(Ok(bytes))), None => Poll::Ready(None), Some(Err(e)) => Poll::Ready(Some(Err(e.into()))), @@ -287,10 +305,10 @@ impl Body for PathBody { } fn poll_trailers( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - ) -> Poll, Self::Error>> { - Poll::Ready(Ok(None)) + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> std::task::Poll, Self::Error>> { + std::task::Poll::Ready(Ok(None)) } fn is_end_stream(&self) -> bool { @@ -298,17 +316,17 @@ impl Body for PathBody { self.length == 0 } - fn size_hint(&self) -> SizeHint { - SizeHint::with_exact(self.length) + fn size_hint(&self) -> http_body_0_4::SizeHint { + http_body_0_4::SizeHint::with_exact(self.length) } } +#[cfg(feature = "http-body-0-4-x")] #[cfg(test)] mod test { use super::FsBuilder; use crate::byte_stream::{ByteStream, Length}; use bytes::Buf; - use http_body::Body; use std::io::Write; use tempfile::NamedTempFile; @@ -325,7 +343,7 @@ mod test { .expect("file metadata is accessible") .len(); - let body = FsBuilder::new() + let body = FsBuilder::new_with_body_0_4() .path(&file) .buffer_size(16384) .length(Length::Exact(file_length)) @@ -335,12 +353,12 @@ mod test { .into_inner(); // assert that the specified length is used as size hint - assert_eq!(body.size_hint().exact(), Some(file_length)); + assert_eq!(body.content_length(), Some(file_length)); let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); // read a little bit from one of the clones let some_data = body1 - .data() + .next() .await .expect("should have some data") .expect("read should not fail"); @@ -364,7 +382,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new() + let body = FsBuilder::new_with_body_0_4() .path(&file) // The file is longer than 1 byte, let's see if this is used to generate the size hint .length(Length::Exact(1)) @@ -373,7 +391,7 @@ mod test { .unwrap() .into_inner(); - assert_eq!(body.size_hint().exact(), Some(1)); + assert_eq!(body.content_length(), Some(1)); } #[tokio::test] @@ -388,7 +406,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new() + let body = FsBuilder::new_with_body_0_4() .path(&file) // We're going to read line 0 only .length(Length::Exact(line_0.len() as u64)) @@ -412,7 +430,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - assert!(FsBuilder::new() + assert!(FsBuilder::new_with_body_0_4() .path(&file) // The file is 30 bytes so this is fine .length(Length::Exact(29)) @@ -420,7 +438,7 @@ mod test { .await .is_ok()); - assert!(FsBuilder::new() + assert!(FsBuilder::new_with_body_0_4() .path(&file) // The file is 30 bytes so this is fine .length(Length::Exact(30)) @@ -428,7 +446,7 @@ mod test { .await .is_ok()); - assert!(FsBuilder::new() + assert!(FsBuilder::new_with_body_0_4() .path(&file) // Larger than 30 bytes, this will cause an error .length(Length::Exact(31)) @@ -449,7 +467,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new() + let body = FsBuilder::new_with_body_0_4() .path(&file) // We're going to skip the first line by using offset .offset(line_0.len() as u64) @@ -477,7 +495,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new() + let body = FsBuilder::new_with_body_0_4() .path(&file) // We're going to skip line 0 by using offset .offset(line_0.len() as u64) @@ -506,7 +524,7 @@ mod test { file.flush().expect("flushing is OK"); assert_eq!( - FsBuilder::new() + FsBuilder::new_with_body_0_4() .path(&file) // We're going to skip all file contents by setting an offset // much larger than the file size @@ -531,7 +549,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new() + let body = FsBuilder::new_with_body_0_4() .path(&file) .length(Length::UpTo(9000)) .build() @@ -583,7 +601,7 @@ mod test { chunk_size }; - let byte_stream = FsBuilder::new() + let byte_stream = FsBuilder::new_with_body_0_4() .path(&file_path) .offset(i * chunk_size) .length(Length::Exact(length)) diff --git a/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs b/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs new file mode 100644 index 00000000000..5edbaaba878 --- /dev/null +++ b/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs @@ -0,0 +1,172 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::body::SdkBody; +use crate::byte_stream::ByteStream; +use bytes::Bytes; + +impl ByteStream { + /// Construct a `ByteStream` from a type that implements [`http_body_0_4::Body`](http_body_0_4::Body). + /// + /// _Note: This is only available with `http-body-0-4-x` enabled._ + pub fn from_body_0_4(body: T) -> Self + where + T: http_body_0_4::Body + Send + Sync + 'static, + E: Into + 'static, + { + ByteStream::new(SdkBody::from_body_0_4(body)) + } + + /// Returns a [`FsBuilder`](crate::byte_stream::FsBuilder), allowing you to build a `ByteStream` with + /// full control over how the file is read (eg. specifying the length of the file or the size of the buffer used to read the file). + /// ```no_run + /// # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] + /// # { + /// use aws_smithy_types::byte_stream::{ByteStream, Length}; + /// + /// async fn bytestream_from_file() -> ByteStream { + /// let bytestream = ByteStream::read_with_body_0_4_from() + /// .path("docs/some-large-file.csv") + /// // Specify the size of the buffer used to read the file (in bytes, default is 4096) + /// .buffer_size(32_784) + /// // Specify the length of the file used (skips an additional call to retrieve the size) + /// .length(Length::Exact(123_456)) + /// .build() + /// .await + /// .expect("valid path"); + /// bytestream + /// } + /// # } + /// ``` + #[cfg(feature = "rt-tokio")] + #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] + pub fn read_with_body_0_4_from() -> crate::byte_stream::FsBuilder { + crate::byte_stream::FsBuilder::new_with_body_0_4() + } + + /// Create a ByteStream that streams data from the filesystem + /// + /// This function creates a retryable ByteStream for a given `path`. The returned ByteStream + /// will provide a size hint when used as an HTTP body. If the request fails, the read will + /// begin again by reloading the file handle. + /// + /// ## Warning + /// The contents of the file MUST not change during retries. The length & checksum of the file + /// will be cached. If the contents of the file change, the operation will almost certainly fail. + /// + /// Furthermore, a partial write MAY seek in the file and resume from the previous location. + /// + /// Note: If you want more control, such as specifying the size of the buffer used to read the file + /// or the length of the file, use a [`FsBuilder`](crate::byte_stream::FsBuilder) as returned + /// from `ByteStream::read_with_body_0_4_from` + /// + /// # Examples + /// ```no_run + /// use aws_smithy_types::byte_stream::ByteStream; + /// use std::path::Path; + /// async fn make_bytestream() -> ByteStream { + /// ByteStream::from_path_body_0_4("docs/rows.csv").await.expect("file should be readable") + /// } + /// ``` + #[cfg(feature = "rt-tokio")] + #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] + pub async fn from_path_body_0_4( + path: impl AsRef, + ) -> Result { + crate::byte_stream::FsBuilder::new_with_body_0_4() + .path(path) + .build() + .await + } + + /// Create a ByteStream from a file + /// + /// NOTE: This will NOT result in a retryable ByteStream. For a ByteStream that can be retried in the case of + /// upstream failures, use [`ByteStream::from_path_body_0_4`](ByteStream::from_path_body_0_4) + #[deprecated( + since = "0.40.0", + note = "Prefer the more extensible ByteStream::read_from() API" + )] + #[cfg(feature = "rt-tokio")] + #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] + pub async fn from_file_body_0_4( + file: tokio::fs::File, + ) -> Result { + crate::byte_stream::FsBuilder::new_with_body_0_4() + .file(file) + .build() + .await + } +} + +#[cfg(feature = "hyper-0-14-x")] +impl From for ByteStream { + fn from(input: hyper_0_14::Body) -> Self { + ByteStream::new(SdkBody::from_body_0_4(input)) + } +} + +#[cfg(test)] +mod tests { + use crate::body::SdkBody; + use crate::byte_stream::Inner; + use bytes::Bytes; + + #[tokio::test] + async fn read_from_channel_body() { + let (mut sender, body) = hyper_0_14::Body::channel(); + let byte_stream = Inner::new(SdkBody::from_body_0_4(body)); + tokio::spawn(async move { + sender.send_data(Bytes::from("data 1")).await.unwrap(); + sender.send_data(Bytes::from("data 2")).await.unwrap(); + sender.send_data(Bytes::from("data 3")).await.unwrap(); + }); + assert_eq!( + byte_stream.collect().await.expect("no errors").into_bytes(), + Bytes::from("data 1data 2data 3") + ); + } + + #[cfg(feature = "rt-tokio")] + #[tokio::test] + async fn path_based_bytestreams() -> Result<(), Box> { + use super::ByteStream; + use bytes::Buf; + use std::io::Write; + use tempfile::NamedTempFile; + let mut file = NamedTempFile::new()?; + + for i in 0..10000 { + writeln!(file, "Brian was here. Briefly. {}", i)?; + } + let body = ByteStream::from_path_body_0_4(&file).await?.into_inner(); + // assert that a valid size hint is immediately ready + assert_eq!(body.content_length(), Some(298890)); + let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); + // read a little bit from one of the clones + let some_data = body1 + .next() + .await + .expect("should have some data") + .expect("read should not fail"); + assert!(!some_data.is_empty()); + // make some more clones + let body2 = body.try_clone().expect("retryable bodies are cloneable"); + let body3 = body.try_clone().expect("retryable bodies are cloneable"); + let body2 = ByteStream::new(body2).collect().await?.into_bytes(); + let body3 = ByteStream::new(body3).collect().await?.into_bytes(); + assert_eq!(body2, body3); + assert!(body2.starts_with(b"Brian was here.")); + assert!(body2.ends_with(b"9999\n")); + assert_eq!(body2.len(), 298890); + + assert_eq!( + ByteStream::new(body1).collect().await?.remaining(), + 298890 - some_data.len() + ); + + Ok(()) + } +} From 6ceabf8b24a5bfdab39f2670510ae895c72a8548 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 25 Oct 2023 14:27:58 -0400 Subject: [PATCH 194/331] Use tokio::process to allow timeouts to occur (#3052) ## Motivation and Context The existing credentials provider was a DOS risk and didn't obey timeout settings because it used `std::timeout::spawn` but relied on a async-based timeout mechanism. ## Description - Use `tokio::process` instead - introduce new cargo feature ## Testing - unit test ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 +++ aws/rust-runtime/aws-config/Cargo.toml | 3 +- .../aws-config/src/credential_process.rs | 80 +++++++------------ aws/rust-runtime/aws-config/src/lib.rs | 1 + .../aws-config/src/profile/credentials.rs | 10 ++- .../src/profile/credentials/exec.rs | 21 ++++- .../src/profile/credentials/repr.rs | 4 +- .../aws-config/src/sensitive_command.rs | 51 ++++++++++++ .../src/test_util/capture_test_logs.rs | 3 +- 9 files changed, 126 insertions(+), 59 deletions(-) create mode 100644 aws/rust-runtime/aws-config/src/sensitive_command.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c5c9f7adff0..f74058dd8dd 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -427,6 +427,18 @@ references = ["smithy-rs#3043", "smithy-rs#3078"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "rcoh" +[[aws-sdk-rust]] +message = "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime." +references = ["smithy-rs#3052"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "rcoh" + +[[aws-sdk-rust]] +message = "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`." +references = ["smithy-rs#3052"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" + [[smithy-rs]] message = """ `aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 8e40611d289..c008b7651c0 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -14,8 +14,9 @@ rustls = ["aws-smithy-runtime/tls-rustls", "client-hyper"] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI rt-tokio = ["aws-smithy-async/rt-tokio", "aws-smithy-runtime/rt-tokio", "tokio/rt"] sso = ["dep:aws-sdk-sso", "dep:aws-sdk-ssooidc", "dep:ring", "dep:hex", "dep:zeroize", "aws-smithy-runtime-api/http-auth"] +credentials-process = ["tokio/process"] -default = ["client-hyper", "rustls", "rt-tokio"] +default = ["client-hyper", "rustls", "rt-tokio", "credentials-process", "sso"] [dependencies] aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types" } diff --git a/aws/rust-runtime/aws-config/src/credential_process.rs b/aws/rust-runtime/aws-config/src/credential_process.rs index c91e6a7ec8c..a46c6298c6b 100644 --- a/aws/rust-runtime/aws-config/src/credential_process.rs +++ b/aws/rust-runtime/aws-config/src/credential_process.rs @@ -3,57 +3,20 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "credentials-process")] + //! Credentials Provider for external process use crate::json_credentials::{json_parse_loop, InvalidJsonCredentials, RefreshableCredentials}; +use crate::sensitive_command::CommandWithSensitiveArgs; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; use aws_credential_types::Credentials; use aws_smithy_json::deserialize::Token; -use std::fmt; use std::process::Command; use std::time::SystemTime; use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; -#[derive(Clone)] -pub(crate) struct CommandWithSensitiveArgs(T); - -impl CommandWithSensitiveArgs -where - T: AsRef, -{ - pub(crate) fn new(value: T) -> Self { - Self(value) - } - - pub(crate) fn unredacted(&self) -> &str { - self.0.as_ref() - } -} - -impl fmt::Display for CommandWithSensitiveArgs -where - T: AsRef, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - // Security: The arguments for command must be redacted since they can be sensitive - let command = self.0.as_ref(); - match command.find(char::is_whitespace) { - Some(index) => write!(f, "{} ** arguments redacted **", &command[0..index]), - None => write!(f, "{}", command), - } - } -} - -impl fmt::Debug for CommandWithSensitiveArgs -where - T: AsRef, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", format!("{}", self)) - } -} - /// External process credentials provider /// /// This credentials provider runs a configured external process and parses @@ -109,11 +72,17 @@ impl CredentialProcessProvider { } } + pub(crate) fn from_command(command: &CommandWithSensitiveArgs<&str>) -> Self { + Self { + command: command.to_owned_string(), + } + } + async fn credentials(&self) -> provider::Result { // Security: command arguments must be redacted at debug level tracing::debug!(command = %self.command, "loading credentials from external process"); - let mut command = if cfg!(windows) { + let command = if cfg!(windows) { let mut command = Command::new("cmd.exe"); command.args(["/C", self.command.unredacted()]); command @@ -122,16 +91,18 @@ impl CredentialProcessProvider { command.args(["-c", self.command.unredacted()]); command }; - - let output = command.output().map_err(|e| { - CredentialsError::provider_error(format!( - "Error retrieving credentials from external process: {}", - e - )) - })?; + let output = tokio::process::Command::from(command) + .output() + .await + .map_err(|e| { + CredentialsError::provider_error(format!( + "Error retrieving credentials from external process: {}", + e + )) + })?; // Security: command arguments can be logged at trace level - tracing::trace!(command = ?command, status = ?output.status, "executed command (unredacted)"); + tracing::trace!(command = ?self.command, status = ?output.status, "executed command (unredacted)"); if !output.status.success() { let reason = @@ -261,9 +232,10 @@ pub(crate) fn parse_credential_process_json_credentials( mod test { use crate::credential_process::CredentialProcessProvider; use aws_credential_types::provider::ProvideCredentials; - use std::time::SystemTime; + use std::time::{Duration, SystemTime}; use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; + use tokio::time::timeout; #[tokio::test] async fn test_credential_process() { @@ -285,4 +257,12 @@ mod test { ) ); } + + #[tokio::test] + async fn credentials_process_timeouts() { + let provider = CredentialProcessProvider::new(String::from("sleep 1000")); + let _creds = timeout(Duration::from_millis(1), provider.provide_credentials()) + .await + .expect_err("timeout forced"); + } } diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index c0cec0cfcdf..59e3a06a142 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -127,6 +127,7 @@ pub mod meta; pub mod profile; pub mod provider_config; pub mod retry; +mod sensitive_command; #[cfg(feature = "sso")] pub mod sso; pub(crate) mod standard_property; diff --git a/aws/rust-runtime/aws-config/src/profile/credentials.rs b/aws/rust-runtime/aws-config/src/profile/credentials.rs index 6469ececbcd..e050f2d9628 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials.rs @@ -262,6 +262,8 @@ pub enum ProfileFileError { FeatureNotEnabled { /// The feature or comma delimited list of features that must be enabled feature: Cow<'static, str>, + /// Additional information about the missing feature + message: Option>, }, } @@ -315,10 +317,11 @@ impl Display for ProfileFileError { "profile `{}` did not contain credential information", profile ), - ProfileFileError::FeatureNotEnabled { feature: message } => { + ProfileFileError::FeatureNotEnabled { feature, message } => { + let message = message.as_deref().unwrap_or_default(); write!( f, - "This behavior requires following cargo feature(s) enabled: {message}", + "This behavior requires following cargo feature(s) enabled: {feature}. {message}", ) } } @@ -488,7 +491,10 @@ mod test { make_test!(retry_on_error); make_test!(invalid_config); make_test!(region_override); + #[cfg(feature = "credentials-process")] make_test!(credential_process); + #[cfg(feature = "credentials-process")] make_test!(credential_process_failure); + #[cfg(feature = "credentials-process")] make_test!(credential_process_invalid); } diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs index d393e946994..6a84c6d7d3d 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs @@ -4,6 +4,7 @@ */ use super::repr::{self, BaseProvider}; +#[cfg(feature = "credentials-process")] use crate::credential_process::CredentialProcessProvider; use crate::profile::credentials::ProfileFileError; use crate::provider_config::ProviderConfig; @@ -85,9 +86,22 @@ impl ProviderChain { })? } BaseProvider::AccessKey(key) => Arc::new(key.clone()), - BaseProvider::CredentialProcess(credential_process) => Arc::new( - CredentialProcessProvider::new(credential_process.unredacted().into()), - ), + BaseProvider::CredentialProcess(_credential_process) => { + #[cfg(feature = "credentials-process")] + { + Arc::new(CredentialProcessProvider::from_command(_credential_process)) + } + #[cfg(not(feature = "credentials-process"))] + { + Err(ProfileFileError::FeatureNotEnabled { + feature: "credentials-process".into(), + message: Some( + "In order to spawn a subprocess, the `credentials-process` feature must be enabled." + .into(), + ), + })? + } + } BaseProvider::WebIdentityTokenRole { role_arn, web_identity_token_file, @@ -136,6 +150,7 @@ impl ProviderChain { { Err(ProfileFileError::FeatureNotEnabled { feature: "sso".into(), + message: None, })? } } diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs b/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs index 666d74ff437..4bd044b3d35 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs @@ -12,9 +12,9 @@ //! 1-credential-per row (as opposed to a direct profile file representation which can combine //! multiple actions into the same profile). -use crate::credential_process::CommandWithSensitiveArgs; use crate::profile::credentials::ProfileFileError; use crate::profile::{Profile, ProfileSet}; +use crate::sensitive_command::CommandWithSensitiveArgs; use aws_credential_types::Credentials; /// Chain of Profile Providers @@ -408,9 +408,9 @@ fn credential_process_from_profile( #[cfg(test)] mod tests { - use crate::credential_process::CommandWithSensitiveArgs; use crate::profile::credentials::repr::{resolve_chain, BaseProvider, ProfileChain}; use crate::profile::ProfileSet; + use crate::sensitive_command::CommandWithSensitiveArgs; use serde::Deserialize; use std::collections::HashMap; use std::error::Error; diff --git a/aws/rust-runtime/aws-config/src/sensitive_command.rs b/aws/rust-runtime/aws-config/src/sensitive_command.rs new file mode 100644 index 00000000000..84f87584a3c --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sensitive_command.rs @@ -0,0 +1,51 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::fmt; + +#[derive(Clone)] +pub(crate) struct CommandWithSensitiveArgs(T); + +impl CommandWithSensitiveArgs +where + T: AsRef, +{ + pub(crate) fn new(value: T) -> Self { + Self(value) + } + + #[allow(dead_code)] + pub(crate) fn to_owned_string(&self) -> CommandWithSensitiveArgs { + CommandWithSensitiveArgs(self.0.as_ref().to_string()) + } + + #[allow(dead_code)] + pub(crate) fn unredacted(&self) -> &str { + self.0.as_ref() + } +} + +impl fmt::Display for CommandWithSensitiveArgs +where + T: AsRef, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // Security: The arguments for command must be redacted since they can be sensitive + let command = self.0.as_ref(); + match command.find(char::is_whitespace) { + Some(index) => write!(f, "{} ** arguments redacted **", &command[0..index]), + None => write!(f, "{}", command), + } + } +} + +impl fmt::Debug for CommandWithSensitiveArgs +where + T: AsRef, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", format!("{}", self)) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs b/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs index 85730d00bc5..86d31d43bbc 100644 --- a/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs +++ b/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs @@ -83,7 +83,8 @@ where fn write(&mut self, buf: &[u8]) -> std::io::Result { self.buf.lock().unwrap().extend_from_slice(buf); if !self.quiet { - self.inner.write(buf) + self.inner.write_all(buf)?; + Ok(buf.len()) } else { Ok(buf.len()) } From 118151e286ac0732718364071e5e2b6a39f498e3 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 25 Oct 2023 16:02:35 -0400 Subject: [PATCH 195/331] Add Clone impl to PresignedRequest (#3084) ## Motivation and Context This makes it easier to convert presigned request into an HTTP request ## Description - add clone impl - add `make_presigned_request` that borrows from self ## Testing CI ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-inlineable/src/presigning.rs | 56 +++++++++++++++---- .../smithy/rustsdk/AwsPresigningDecorator.kt | 2 +- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index b4569ce3407..cae1dd0ae5c 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -14,6 +14,7 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_types::body::SdkBody; use std::fmt; use std::time::{Duration, SystemTime}; @@ -170,37 +171,70 @@ impl PresigningConfigBuilder { /// /// **This struct has conversion convenience functions:** /// -/// - [`PresignedRequest::to_http_02x_request`][Self::to_http_02x_request] returns an [`http::Request`](https://docs.rs/http/0.2.6/http/request/struct.Request.html) +/// - [`PresignedRequest::make_http_02x_request`][Self::make_http_02x_request] returns an [`http::Request`](https://docs.rs/http/0.2.6/http/request/struct.Request.html) /// - [`PresignedRequest::into`](#impl-From) returns an [`http::request::Builder`](https://docs.rs/http/0.2.6/http/request/struct.Builder.html) #[non_exhaustive] -pub struct PresignedRequest(HttpRequest); +pub struct PresignedRequest { + http_request: HttpRequest, +} + +impl Clone for PresignedRequest { + fn clone(&self) -> Self { + Self { + http_request: match self.http_request.try_clone() { + Some(body) => body, + None => { + unreachable!( + "during construction, we replaced the body with `SdkBody::empty()`" + ) + } + }, + } + } +} impl PresignedRequest { #[allow(dead_code)] - pub(crate) fn new(inner: HttpRequest) -> Self { - Self(inner) + pub(crate) fn new(inner: HttpRequest) -> Result { + // throw out the body so we're sure it's cloneable + let http_request = inner.map(|_body| SdkBody::empty()); + // this should never fail, a presigned request should always be convertible, but better to + // protect against this potential panic + let _ = http_request + .try_clone() + .expect("must be cloneable, body is empty") + .into_http02x()?; + Ok(Self { http_request }) } /// Returns the HTTP request method. pub fn method(&self) -> &str { - self.0.method() + self.http_request.method() } /// Returns the HTTP request URI. pub fn uri(&self) -> &str { - self.0.uri() + self.http_request.uri() } /// Returns any HTTP headers that need to go along with the request, except for `Host`, /// which should be sent based on the endpoint in the URI by the HTTP client rather than /// added directly. pub fn headers(&self) -> impl Iterator { - self.0.headers().iter() + self.http_request.headers().iter() + } + + /// Given a body, produce an `http::Request` from this `PresignedRequest` + pub fn make_http_02x_request(&self, body: B) -> http::Request { + self.clone().into_http_02x_request(body) } - /// Given a body, convert this `PresignedRequest` into an `http::Request` - pub fn to_http_02x_request(self, body: B) -> Result, BoxError> { - Ok(self.0.into_http02x()?.map(|_req| body)) + /// Converts this `PresignedRequest` directly into an `http` request. + pub fn into_http_02x_request(self, body: B) -> http::Request { + self.http_request + .into_http02x() + .expect("constructor validated convertibility") + .map(|_req| body) } } @@ -209,7 +243,7 @@ impl fmt::Debug for PresignedRequest { f.debug_struct("PresignedRequest") .field("method", &self.method()) .field("uri", &self.uri()) - .field("headers", self.0.headers()) + .field("headers", self.http_request.headers()) .finish() } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index c870ebe5bfa..fa255a512f3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -185,7 +185,7 @@ class AwsPresignedFluentBuilderMethod( }) })?; let request = context.take_request().expect("request set before transmit"); - Ok(#{PresignedRequest}::new(request)) + #{PresignedRequest}::new(request).map_err(#{SdkError}::construction_failure) """, *codegenScope, "Operation" to codegenContext.symbolProvider.toSymbol(section.operationShape), From 222155022ec329659f0d7568086cb2fe5f57871c Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 25 Oct 2023 16:23:15 -0500 Subject: [PATCH 196/331] Add more type aliases for types moved to the `aws-smithy-types` crate (#3091) ## Motivation and Context https://github.com/awslabs/smithy-rs/pull/3076 missed type alias for some types we moved to `aws-smithy-types`. This small PR will fix that. ## Testing Relied on the existing tests in CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 4 ++-- rust-runtime/aws-smithy-http/src/byte_stream.rs | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index f74058dd8dd..7f9f7ff2123 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -457,9 +457,9 @@ author = "ysaito1001" [[smithy-rs]] message = """ -`aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +`aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. """ -references = ["smithy-rs#3076"] +references = ["smithy-rs#3076", "smithy-rs#3091"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "ysaito1001" diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-http/src/byte_stream.rs index e97a395b8e7..4067ec517dc 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-http/src/byte_stream.rs @@ -22,3 +22,13 @@ pub mod error { #[deprecated(note = "Moved to `aws_smithy_types::byte_stream::error::Error`.")] pub type Error = aws_smithy_types::byte_stream::error::Error; } + +/// Builder for creating [`ByteStreams`](aws_smithy_types::byte_stream::ByteStream) from a file/path, with full control over advanced options. +#[cfg(feature = "rt-tokio")] +#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::FsBuilder`.")] +pub type FsBuilder = aws_smithy_types::byte_stream::FsBuilder; + +/// The length (in bytes) to read. Determines whether or not a short read counts as an error. +#[cfg(feature = "rt-tokio")] +#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::Length`.")] +pub type Length = aws_smithy_types::byte_stream::Length; From f528c523ffae4da65d4b22bbd0da4aabec7bca34 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:32:02 +0100 Subject: [PATCH 197/331] ServerInstantiator without builder (#3094) Build structures without the builder ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../core/smithy/generators/Instantiator.kt | 57 ++++++++++++++++--- .../smithy/generators/ServerInstantiator.kt | 18 +++--- .../protocol/ServerProtocolTestGenerator.kt | 4 +- .../ConstrainedCollectionGeneratorTest.kt | 2 +- .../generators/ConstrainedMapGeneratorTest.kt | 2 +- .../generators/ServerInstantiatorTest.kt | 23 ++++++-- 6 files changed, 80 insertions(+), 26 deletions(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt index a01ad09545c..8a36d8ecbc6 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt @@ -46,6 +46,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock +import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -89,6 +90,7 @@ open class Instantiator( /** Fill out required fields with a default value. **/ private val defaultsForRequiredFields: Boolean = false, private val customizations: List = listOf(), + private val constructPattern: InstantiatorConstructPattern = InstantiatorConstructPattern.BUILDER, ) { data class Ctx( // The `http` crate requires that headers be lowercase, but Smithy protocol tests @@ -96,6 +98,16 @@ open class Instantiator( val lowercaseMapKeys: Boolean = false, ) + /** + * A struct can be built by: + * * direct instantiation: A { field_1: value_1, field_2: value_2 } + * * its associated builder: A::builder().field_1(value_1).field_2(value_2).build() + */ + enum class InstantiatorConstructPattern { + DIRECT, + BUILDER, + } + /** * Client and server structures have different builder types. `Instantiator` needs to know how the builder * type behaves to generate code for it. @@ -274,13 +286,21 @@ open class Instantiator( headers: Map, ctx: Ctx, ) { - writer.rust("#T::builder()", symbolProvider.toSymbol(shape)) + when (constructPattern) { + InstantiatorConstructPattern.DIRECT -> + writer.withBlockTemplate("#{T} {", "}", "T" to symbolProvider.toSymbol(shape)) { + renderStructureMembers(writer, shape, data, headers, ctx) + } + InstantiatorConstructPattern.BUILDER -> { + writer.rust("#T::builder()", symbolProvider.toSymbol(shape)) - renderStructureMembers(writer, shape, data, headers, ctx) + renderStructureMembers(writer, shape, data, headers, ctx) - writer.rust(".build()") - if (builderKindBehavior.hasFallibleBuilder(shape)) { - writer.rust(".unwrap()") + writer.rust(".build()") + if (builderKindBehavior.hasFallibleBuilder(shape)) { + writer.rust(".unwrap()") + } + } } } @@ -291,10 +311,22 @@ open class Instantiator( headers: Map, ctx: Ctx, ) { + val renderedMembers = mutableSetOf() fun renderMemberHelper(memberShape: MemberShape, value: Node) { - val setterName = builderKindBehavior.setterName(memberShape) - writer.withBlock(".$setterName(", ")") { - renderMember(this, memberShape, value, ctx) + renderedMembers.add(memberShape) + when (constructPattern) { + InstantiatorConstructPattern.DIRECT -> { + val fieldName = symbolProvider.toMemberName(memberShape) + writer.withBlock("$fieldName:", ",") { + renderMember(this, memberShape, value, ctx) + } + } + InstantiatorConstructPattern.BUILDER -> { + val setterName = builderKindBehavior.setterName(memberShape) + writer.withBlock(".$setterName(", ")") { + renderMember(this, memberShape, value, ctx) + } + } } } @@ -313,7 +345,7 @@ open class Instantiator( .filter { it.value.hasTrait() } .forEach { (_, value) -> val trait = value.expectTrait().value - headers.get(trait)?.let { renderMemberHelper(value, Node.from(it)) } + headers[trait]?.let { renderMemberHelper(value, Node.from(it)) } } } @@ -331,6 +363,13 @@ open class Instantiator( ?.let { renderMemberHelper(it.value, fillDefaultValue(model.expectShape(it.value.target))) } + + if (constructPattern == InstantiatorConstructPattern.DIRECT) { + val membersToRender = shape.allMembers.values.minus(renderedMembers) + check(membersToRender.all { it.isOptional }) + membersToRender + .forEach { renderMemberHelper(it, Node.nullNode()) } + } } /** diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt index 7020f388962..77a96c816ea 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt @@ -68,15 +68,15 @@ class ServerBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiat codegenContext.symbolProvider.toSymbol(memberShape).isOptional() } -fun serverInstantiator(codegenContext: CodegenContext) = - Instantiator( - codegenContext.symbolProvider, - codegenContext.model, - codegenContext.runtimeConfig, - ServerBuilderKindBehavior(codegenContext), - defaultsForRequiredFields = true, - customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), - ) +class ServerInstantiator(codegenContext: CodegenContext) : Instantiator( + codegenContext.symbolProvider, + codegenContext.model, + codegenContext.runtimeConfig, + ServerBuilderKindBehavior(codegenContext), + defaultsForRequiredFields = true, + customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), + constructPattern = InstantiatorConstructPattern.DIRECT, +) class ServerBuilderInstantiator( private val symbolProvider: RustSymbolProvider, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index c1831aac7bc..4327c8de20a 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -54,7 +54,7 @@ import software.amazon.smithy.rust.codegen.core.util.toPascalCase import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType -import software.amazon.smithy.rust.codegen.server.smithy.generators.serverInstantiator +import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerInstantiator import java.util.logging.Logger import kotlin.reflect.KFunction1 @@ -94,7 +94,7 @@ class ServerProtocolTestGenerator( inputT to outputT } - private val instantiator = serverInstantiator(codegenContext) + private val instantiator = ServerInstantiator(codegenContext) private val codegenScope = arrayOf( "Bytes" to RuntimeType.Bytes, diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt index 3b9e0d4a7bf..444d75d2ad5 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt @@ -179,7 +179,7 @@ class ConstrainedCollectionGeneratorTest { project.withModule(ServerRustModule.Model) { render(codegenContext, this, shape) - val instantiator = serverInstantiator(codegenContext) + val instantiator = ServerInstantiator(codegenContext) for ((idx, validList) in testCase.validLists.withIndex()) { val shapeNameIdx = "${shapeName}_$idx" val buildValidFnName = "build_valid_$shapeNameIdx" diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt index cd833361242..d475ccbd37e 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt @@ -81,7 +81,7 @@ class ConstrainedMapGeneratorTest { project.withModule(ServerRustModule.Model) { render(codegenContext, this, constrainedMapShape) - val instantiator = serverInstantiator(codegenContext) + val instantiator = ServerInstantiator(codegenContext) rustBlock("##[cfg(test)] fn build_valid_map() -> std::collections::HashMap") { instantiator.render(this, constrainedMapShape, testCase.validMap) } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt index 03555df93e4..cfb4d00bb04 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt @@ -5,12 +5,14 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators +import io.kotest.matchers.string.shouldNotContain import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.rustlang.RustModule +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -78,11 +80,13 @@ class ServerInstantiatorTest { int: Integer } + integer MyInteger + structure NestedStruct { @required str: String, @required - num: Integer + num: MyInteger } structure MyStructRequired { @@ -136,7 +140,7 @@ class ServerInstantiatorTest { val inner = model.lookup("com.test#Inner") val nestedStruct = model.lookup("com.test#NestedStruct") val union = model.lookup("com.test#NestedUnion") - val sut = serverInstantiator(codegenContext) + val sut = ServerInstantiator(codegenContext) val data = Node.parse("{}") val project = TestWorkspace.testProject() @@ -191,7 +195,7 @@ class ServerInstantiatorTest { @Test fun `generate named enums`() { val shape = model.lookup("com.test#NamedEnum") - val sut = serverInstantiator(codegenContext) + val sut = ServerInstantiator(codegenContext) val data = Node.parse("t2.nano".dq()) val project = TestWorkspace.testProject() @@ -214,7 +218,7 @@ class ServerInstantiatorTest { @Test fun `generate unnamed enums`() { val shape = model.lookup("com.test#UnnamedEnum") - val sut = serverInstantiator(codegenContext) + val sut = ServerInstantiator(codegenContext) val data = Node.parse("t2.nano".dq()) val project = TestWorkspace.testProject() @@ -233,4 +237,15 @@ class ServerInstantiatorTest { } project.compileAndTest() } + + @Test + fun `use direct instantiation and not the builder`() { + val shape = model.lookup("com.test#MyStruct") + val sut = ServerInstantiator(codegenContext) + val data = Node.parse("""{ "foo": "hello", "bar": 1, "baz": 42, "ts": 0, "byteValue": 0 }""") + + val writer = RustWriter.forModule(ServerRustModule.Model.name) + sut.render(writer, shape, data) + writer.toString() shouldNotContain "builder()" + } } From 0f1f1a677ac65fa77addd1d222921265d33e9277 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 26 Oct 2023 15:10:24 -0500 Subject: [PATCH 198/331] Minimum throughput body timeouts Pt.1 (#3068) ## Motivation and Context https://github.com/awslabs/smithy-rs/issues/1562 ## Description This change adds a new body wrapper: The minimum throughput limit wrapper. It tracks the rate that data is being streamed from itself. If that rate falls below some configurable limit, it emits an error instead of the next chunk. This protects users from requests that start quickly but then slow down considerably. I'd like to get this merged and then figure out the codegen/docs/examples/config part in a separate PR. ## Testing Tests are included. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/integration-tests/s3/Cargo.toml | 3 +- rust-runtime/Cargo.toml | 2 - .../src/future/pagination_stream.rs | 4 +- rust-runtime/aws-smithy-async/src/rt/sleep.rs | 4 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 12 +- .../aws-smithy-runtime/external-types.toml | 3 + .../aws-smithy-runtime/src/client/http.rs | 3 + .../src/client/http/body.rs | 6 + .../client/http/body/minimum_throughput.rs | 91 +++++ .../minimum_throughput/http_body_0_4_x.rs | 321 ++++++++++++++++++ .../body/minimum_throughput/throughput.rs | 221 ++++++++++++ .../src/client/http/hyper_014.rs | 66 ++-- .../src/client/http/test_util/dvr/record.rs | 4 +- .../src/client/http/test_util/dvr/replay.rs | 6 +- .../src/client/http/test_util/never.rs | 4 +- .../src/client/http/test_util/wire.rs | 16 +- .../src/client/orchestrator.rs | 3 + .../src/client/orchestrator/http.rs | 2 +- .../tests/reconnect_on_transient_error.rs | 6 +- rust-runtime/aws-smithy-types/src/body.rs | 20 ++ .../src/body/http_body_0_4_x.rs | 6 +- 21 files changed, 736 insertions(+), 67 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/body.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 97c70e29de7..a0cde52e429 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -36,7 +36,8 @@ futures-util = { version = "0.3.16", default-features = false } hdrhistogram = "7.5.2" http = "0.2.3" http-body = "0.4.5" -hyper = "0.14.26" +hyper = { version = "0.14.26", features = ["stream"] } +once_cell = "1.18.0" pretty_assertions = "1.3" serde_json = "1" smol = "1.2" diff --git a/rust-runtime/Cargo.toml b/rust-runtime/Cargo.toml index 4f1555345ac..52cf0a5ed25 100644 --- a/rust-runtime/Cargo.toml +++ b/rust-runtime/Cargo.toml @@ -1,6 +1,4 @@ [workspace] - - members = [ "inlineable", "aws-smithy-async", diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs index f263685b49a..a5454108af7 100644 --- a/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs @@ -184,11 +184,11 @@ mod test { // `tokio_test::task::Spawn::poll_next` can only be invoked when the wrapped // type implements the `Stream` trait. Here, `FnStream` does not implement it, // so we work around it by using the `enter` method. - let _ = test_stream.enter(|ctx, pin| { + test_stream.enter(|ctx, pin| { let polled = pin.poll_next(ctx); assert!(polled.is_pending()); }); - let _ = test_stream.enter(|ctx, pin| { + test_stream.enter(|ctx, pin| { let polled = pin.poll_next(ctx); assert!(polled.is_pending()); }); diff --git a/rust-runtime/aws-smithy-async/src/rt/sleep.rs b/rust-runtime/aws-smithy-async/src/rt/sleep.rs index 076db95c971..b71c90a4e69 100644 --- a/rust-runtime/aws-smithy-async/src/rt/sleep.rs +++ b/rust-runtime/aws-smithy-async/src/rt/sleep.rs @@ -83,7 +83,7 @@ pub fn default_async_sleep() -> Option { /// Future returned by [`AsyncSleep`]. #[non_exhaustive] #[must_use] -pub struct Sleep(Pin + Send + 'static>>); +pub struct Sleep(Pin + Send + Sync + 'static>>); impl Debug for Sleep { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { @@ -95,7 +95,7 @@ impl Sleep { /// Create a new [`Sleep`] future /// /// The provided future will be Boxed. - pub fn new(future: impl Future + Send + 'static) -> Sleep { + pub fn new(future: impl Future + Send + Sync + 'static) -> Sleep { Sleep(Box::pin(future)) } } diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index f0af47c00bc..b92f3360da8 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -12,13 +12,13 @@ repository = "https://github.com/awslabs/smithy-rs" [features] client = ["aws-smithy-runtime-api/client"] http-auth = ["aws-smithy-runtime-api/http-auth"] -connector-hyper-0-14-x = ["dep:hyper", "hyper?/client", "hyper?/http2", "hyper?/http1", "hyper?/tcp"] +connector-hyper-0-14-x = ["dep:hyper-0-14", "hyper-0-14?/client", "hyper-0-14?/http2", "hyper-0-14?/http1", "hyper-0-14?/tcp", "hyper-0-14?/stream"] tls-rustls = ["dep:hyper-rustls", "dep:rustls", "connector-hyper-0-14-x"] rt-tokio = ["tokio/rt"] # Features for testing test-util = ["aws-smithy-runtime-api/test-util", "dep:aws-smithy-protocol-test", "dep:tracing-subscriber", "dep:serde", "dep:serde_json"] -wire-mock = ["test-util", "connector-hyper-0-14-x", "hyper?/server"] +wire-mock = ["test-util", "connector-hyper-0-14-x", "hyper-0-14?/server"] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } @@ -28,9 +28,9 @@ aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x"] } bytes = "1" fastrand = "2.0.0" -http = "0.2.8" -http-body = "0.4.5" -hyper = { version = "0.14.26", default-features = false, optional = true } +http = { version = "0.2.8" } +http-body-0-4 = { package = "http-body", version = "0.4.4" } +hyper-0-14 = { package = "hyper", version = "0.14.26", default-features = false, optional = true } hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"], optional = true } once_cell = "1.18.0" pin-project-lite = "0.2.7" @@ -47,6 +47,8 @@ approx = "0.5.1" aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio", "test-util"] } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["test-util"] } +futures-util = "0.3.28" +pretty_assertions = "1.4.0" tokio = { version = "1.25", features = ["macros", "rt", "rt-multi-thread", "test-util"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } tracing-test = "0.2.1" diff --git a/rust-runtime/aws-smithy-runtime/external-types.toml b/rust-runtime/aws-smithy-runtime/external-types.toml index fe24b1a1b04..35ba98d12c7 100644 --- a/rust-runtime/aws-smithy-runtime/external-types.toml +++ b/rust-runtime/aws-smithy-runtime/external-types.toml @@ -25,4 +25,7 @@ allowed_external_types = [ "hyper::client::connect::Connection", "tokio::io::async_read::AsyncRead", "tokio::io::async_write::AsyncWrite", + + # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http-0-x` feature + "http_body::Body" ] diff --git a/rust-runtime/aws-smithy-runtime/src/client/http.rs b/rust-runtime/aws-smithy-runtime/src/client/http.rs index 4f02c42870b..d4fcc998d60 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http.rs @@ -15,3 +15,6 @@ pub mod test_util; /// needing to provide equivalent functionality for hyper 1.x in the future. #[cfg(feature = "connector-hyper-0-14-x")] pub mod hyper_014; + +/// HTTP body and body-wrapper types +pub mod body; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body.rs new file mode 100644 index 00000000000..dcbd9291c19 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body.rs @@ -0,0 +1,6 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +pub mod minimum_throughput; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs new file mode 100644 index 00000000000..2ddcc6c3f7d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs @@ -0,0 +1,91 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! A body-wrapping type that ensures data is being streamed faster than some lower limit. +//! +//! If data is being streamed too slowly, this body type will emit an error next time it's polled. + +use aws_smithy_async::rt::sleep::Sleep; +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::shared::IntoShared; +use std::fmt; +use std::time::Duration; +use throughput::{Throughput, ThroughputLogs}; + +/// An implementation of v0.4 `http_body::Body` for `MinimumThroughputBody` and related code. +pub mod http_body_0_4_x; + +mod throughput; + +pin_project_lite::pin_project! { + /// A body-wrapping type that ensures data is being streamed faster than some lower limit. + /// + /// If data is being streamed too slowly, this body type will emit an error next time it's polled. + pub struct MinimumThroughputBody { + async_sleep: SharedAsyncSleep, + time_source: SharedTimeSource, + minimum_throughput: Throughput, + throughput_logs: ThroughputLogs, + #[pin] + sleep_fut: Option, + #[pin] + inner: B, + } +} + +const SIZE_OF_ONE_LOG: usize = std::mem::size_of::<(std::time::SystemTime, u64)>(); // 24 bytes per log +const NUMBER_OF_LOGS_IN_ONE_KB: f64 = 1024.0 / SIZE_OF_ONE_LOG as f64; + +impl MinimumThroughputBody { + /// Create a new minimum throughput body. + pub fn new( + time_source: impl TimeSource + 'static, + async_sleep: impl AsyncSleep + 'static, + body: B, + (bytes_read, per_time_elapsed): (u64, Duration), + ) -> Self { + let minimum_throughput = Throughput::new(bytes_read as f64, per_time_elapsed); + Self { + throughput_logs: ThroughputLogs::new( + // Never keep more than 10KB of logs in memory. This currently + // equates to 426 logs. + (NUMBER_OF_LOGS_IN_ONE_KB * 10.0) as usize, + minimum_throughput.per_time_elapsed(), + ), + async_sleep: async_sleep.into_shared(), + time_source: time_source.into_shared(), + minimum_throughput, + inner: body, + sleep_fut: None, + } + } +} + +#[derive(Debug)] +enum Error { + ThroughputBelowMinimum { + expected: Throughput, + actual: Throughput, + }, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::ThroughputBelowMinimum { expected, actual } => { + write!( + f, + "minimum throughput was specified at {expected}, but throughput of {actual} was observed", + ) + } + } + } +} + +impl std::error::Error for Error {} + +// Tests are implemented per HTTP body type. diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs new file mode 100644 index 00000000000..46b401a305c --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs @@ -0,0 +1,321 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use super::{BoxError, Error, MinimumThroughputBody}; +use aws_smithy_async::rt::sleep::AsyncSleep; +use http_body_0_4::Body; +use std::future::Future; +use std::pin::{pin, Pin}; +use std::task::{Context, Poll}; + +impl Body for MinimumThroughputBody +where + B: Body, +{ + type Data = bytes::Bytes; + type Error = BoxError; + + fn poll_data( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + let now = self.time_source.now(); + // Attempt to read the data from the inner body, then update the + // throughput logs. + let mut this = self.as_mut().project(); + // Push a start log if we haven't already done so. + if this.throughput_logs.is_empty() { + this.throughput_logs.push((now, 0)); + } + let poll_res = match this.inner.poll_data(cx) { + Poll::Ready(Some(Ok(bytes))) => { + this.throughput_logs.push((now, bytes.len() as u64)); + Poll::Ready(Some(Ok(bytes))) + } + Poll::Pending => Poll::Pending, + // If we've read all the data or an error occurred, then return that result. + res => return res, + }; + + // Check the sleep future to see if it needs refreshing. + let mut sleep_fut = this.sleep_fut.take().unwrap_or_else(|| { + this.async_sleep + .sleep(this.minimum_throughput.per_time_elapsed()) + }); + if let Poll::Ready(()) = pin!(&mut sleep_fut).poll(cx) { + // Whenever the sleep future expires, we replace it. + sleep_fut = this + .async_sleep + .sleep(this.minimum_throughput.per_time_elapsed()); + + // We also schedule a wake up for current task to ensure that + // it gets polled at least one more time. + cx.waker().wake_by_ref(); + }; + this.sleep_fut.replace(sleep_fut); + + // Calculate the current throughput and emit an error if it's too low. + let actual_throughput = this.throughput_logs.calculate_throughput(now); + let is_below_minimum_throughput = actual_throughput + .map(|t| t < self.minimum_throughput) + .unwrap_or_default(); + if is_below_minimum_throughput { + Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum { + expected: self.minimum_throughput, + actual: actual_throughput.unwrap(), + })))) + } else { + poll_res + } + } + + fn poll_trailers( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll, Self::Error>> { + let this = self.as_mut().project(); + this.inner.poll_trailers(cx) + } +} + +// These tests use `hyper::body::Body::wrap_stream` +#[cfg(all(test, feature = "connector-hyper-0-14-x"))] +mod test { + use super::{super::Throughput, Error, MinimumThroughputBody}; + use aws_smithy_async::rt::sleep::AsyncSleep; + use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep, ManualTimeSource}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream}; + use aws_smithy_types::error::display::DisplayErrorContext; + use bytes::{BufMut, Bytes, BytesMut}; + use http::HeaderMap; + use http_body_0_4::Body; + use once_cell::sync::Lazy; + use pretty_assertions::assert_eq; + use std::convert::Infallible; + use std::error::Error as StdError; + use std::future::Future; + use std::pin::Pin; + use std::task::{Context, Poll}; + use std::time::{Duration, UNIX_EPOCH}; + + struct NeverBody; + + impl Body for NeverBody { + type Data = Bytes; + type Error = Box<(dyn StdError + Send + Sync + 'static)>; + + fn poll_data( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll>> { + Poll::Pending + } + + fn poll_trailers( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll, Self::Error>> { + unreachable!("body can't be read, so this won't be called") + } + } + + #[tokio::test()] + async fn test_self_waking() { + let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); + let mut body = MinimumThroughputBody::new( + time_source.clone(), + async_sleep.clone(), + NeverBody, + (1, Duration::from_secs(1)), + ); + time_source.advance(Duration::from_secs(1)); + let actual_err = body.data().await.expect("next chunk exists").unwrap_err(); + let expected_err = Error::ThroughputBelowMinimum { + expected: (1, Duration::from_secs(1)).into(), + actual: (0, Duration::from_secs(1)).into(), + }; + + assert_eq!(expected_err.to_string(), actual_err.to_string()); + } + + fn create_test_stream( + async_sleep: impl AsyncSleep + Clone, + ) -> impl futures_util::Stream> { + futures_util::stream::unfold(1, move |state| { + let async_sleep = async_sleep.clone(); + async move { + if state > 255 { + None + } else { + async_sleep.sleep(Duration::from_secs(1)).await; + Some(( + Result::<_, Infallible>::Ok(Bytes::from_static(b"00000000")), + state + 1, + )) + } + } + }) + } + + static EXPECTED_BYTES: Lazy> = + Lazy::new(|| (1..=255).flat_map(|_| b"00000000").copied().collect()); + + fn eight_byte_per_second_stream_with_minimum_throughput_timeout( + minimum_throughput: (u64, Duration), + ) -> ( + impl Future>, + ManualTimeSource, + InstantSleep, + ) { + let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); + let time_clone = time_source.clone(); + + // Will send ~8 bytes per second. + let stream = create_test_stream(async_sleep.clone()); + let body = ByteStream::new(SdkBody::from_body_0_4(hyper_0_14::body::Body::wrap_stream( + stream, + ))); + let body = body.map(move |body| { + let time_source = time_clone.clone(); + // We don't want to log these sleeps because it would duplicate + // the `sleep` calls being logged by the MTB + let async_sleep = InstantSleep::unlogged(); + SdkBody::from_body_0_4(MinimumThroughputBody::new( + time_source, + async_sleep, + body, + minimum_throughput, + )) + }); + + (body.collect(), time_source, async_sleep) + } + + async fn expect_error(minimum_throughput: (u64, Duration)) { + let (res, ..) = + eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); + let expected_err = Error::ThroughputBelowMinimum { + expected: minimum_throughput.into(), + actual: Throughput::new(8.889, Duration::from_secs(1)), + }; + match res.await { + Ok(_) => { + panic!( + "response succeeded instead of returning the expected error '{expected_err}'" + ) + } + Err(actual_err) => { + assert_eq!( + expected_err.to_string(), + // We need to source this so that we don't get the streaming error it's wrapped in. + actual_err.source().unwrap().to_string() + ); + } + } + } + + #[tokio::test] + async fn test_throughput_timeout_less_than() { + let minimum_throughput = (9, Duration::from_secs(1)); + expect_error(minimum_throughput).await; + } + + async fn expect_success(minimum_throughput: (u64, Duration)) { + let (res, time_source, async_sleep) = + eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); + match res.await { + Ok(res) => { + assert_eq!(255.0, time_source.seconds_since_unix_epoch()); + assert_eq!(Duration::from_secs(255), async_sleep.total_duration()); + assert_eq!(*EXPECTED_BYTES, res.to_vec()); + } + Err(err) => panic!("{}", DisplayErrorContext(err.source().unwrap())), + } + } + + #[tokio::test] + async fn test_throughput_timeout_equal_to() { + let minimum_throughput = (32, Duration::from_secs(4)); + expect_success(minimum_throughput).await; + } + + #[tokio::test] + async fn test_throughput_timeout_greater_than() { + let minimum_throughput = (20, Duration::from_secs(3)); + expect_success(minimum_throughput).await; + } + + // A multiplier for the sine wave amplitude; Chosen arbitrarily. + const BYTE_COUNT_UPPER_LIMIT: f64 = 100.0; + + fn create_shrinking_sine_wave_stream( + async_sleep: impl AsyncSleep + Clone, + ) -> impl futures_util::Stream> { + futures_util::stream::unfold(1, move |i| { + let async_sleep = async_sleep.clone(); + async move { + if i > 255 { + None + } else { + let byte_count = (i as f64).sin().floor().abs() + 1.0 / (i as f64 + 1.0); + let byte_count = (byte_count * BYTE_COUNT_UPPER_LIMIT) as u64; + let mut bytes = BytesMut::new(); + bytes.put_u8(i as u8); + if byte_count > 0 { + for _ in 0..byte_count { + bytes.put_u8(0) + } + } + + async_sleep.sleep(Duration::from_secs(1)).await; + Some((Result::::Ok(bytes.into()), i + 1)) + } + } + }) + } + + #[tokio::test] + async fn test_throughput_timeout_shrinking_sine_wave() { + // Minimum throughput per second will be approx. half of the BYTE_COUNT_UPPER_LIMIT. + let minimum_throughput = ( + BYTE_COUNT_UPPER_LIMIT as u64 / 2 + 2, + Duration::from_secs(1), + ); + let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); + let time_clone = time_source.clone(); + + let stream = create_shrinking_sine_wave_stream(async_sleep.clone()); + let body = ByteStream::new(SdkBody::from_body_0_4(hyper_0_14::body::Body::wrap_stream( + stream, + ))); + let res = body + .map(move |body| { + let time_source = time_clone.clone(); + // We don't want to log these sleeps because it would duplicate + // the `sleep` calls being logged by the MTB + let async_sleep = InstantSleep::unlogged(); + SdkBody::from_body_0_4(MinimumThroughputBody::new( + time_source, + async_sleep, + body, + minimum_throughput, + )) + }) + .collect(); + + match res.await { + Ok(_res) => { + assert_eq!(255.0, time_source.seconds_since_unix_epoch()); + assert_eq!(Duration::from_secs(255), async_sleep.total_duration()); + } + Err(err) => panic!( + "test stopped after {:?} due to {}", + async_sleep.total_duration(), + DisplayErrorContext(err.source().unwrap()) + ), + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs new file mode 100644 index 00000000000..3b610f857e1 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs @@ -0,0 +1,221 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::collections::VecDeque; +use std::fmt; +use std::time::{Duration, SystemTime}; + +#[derive(Debug, Clone, Copy)] +pub(super) struct Throughput { + bytes_read: f64, + per_time_elapsed: Duration, +} + +impl Throughput { + pub(super) fn new(bytes_read: f64, per_time_elapsed: Duration) -> Self { + debug_assert!( + !bytes_read.is_nan(), + "cannot create a throughput if bytes_read == NaN" + ); + debug_assert!( + bytes_read.is_finite(), + "cannot create a throughput if bytes_read == Inf" + ); + debug_assert!( + !per_time_elapsed.is_zero(), + "cannot create a throughput if per_time_elapsed == 0" + ); + + Self { + bytes_read, + per_time_elapsed, + } + } + + pub(super) fn per_time_elapsed(&self) -> Duration { + self.per_time_elapsed + } + + pub(super) fn bytes_per_second(&self) -> f64 { + let per_time_elapsed_secs = self.per_time_elapsed.as_secs_f64(); + if per_time_elapsed_secs == 0.0 { + return 0.0; // Avoid dividing by zero. + }; + + self.bytes_read / per_time_elapsed_secs + } +} + +impl PartialEq for Throughput { + fn eq(&self, other: &Self) -> bool { + self.bytes_per_second() == other.bytes_per_second() + } +} + +impl PartialOrd for Throughput { + fn partial_cmp(&self, other: &Self) -> Option { + self.bytes_per_second() + .partial_cmp(&other.bytes_per_second()) + } +} + +impl fmt::Display for Throughput { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // The default float formatting behavior will ensure the a number like 2.000 is rendered as 2 + // while a number like 0.9982107441748642 will be rendered as 0.9982107441748642. This + // multiplication and division will truncate a float to have a precision of no greater than 3. + // For example, 0.9982107441748642 would become 0.999. This will fail for very large floats + // but should suffice for the numbers we're dealing with. + let pretty_bytes_per_second = (self.bytes_per_second() * 1000.0).round() / 1000.0; + + write!(f, "{pretty_bytes_per_second} B/s") + } +} + +impl From<(u64, Duration)> for Throughput { + fn from(value: (u64, Duration)) -> Self { + Self { + bytes_read: value.0 as f64, + per_time_elapsed: value.1, + } + } +} + +#[derive(Clone)] +pub(super) struct ThroughputLogs { + max_length: usize, + min_elapsed_time: Duration, + inner: VecDeque<(SystemTime, u64)>, +} + +impl ThroughputLogs { + pub(super) fn new(max_length: usize, min_elapsed_time: Duration) -> Self { + Self { + inner: VecDeque::new(), + min_elapsed_time, + max_length, + } + } + + pub(super) fn is_empty(&self) -> bool { + self.inner.is_empty() + } + + pub(super) fn push(&mut self, throughput: (SystemTime, u64)) { + self.inner.push_back(throughput); + + // When the number of logs exceeds the max length, toss the oldest log. + if self.inner.len() > self.max_length { + self.inner.pop_front(); + } + } + + pub(super) fn front(&self) -> Option<&(SystemTime, u64)> { + self.inner.front() + } + + pub(super) fn calculate_throughput(&self, now: SystemTime) -> Option { + match self.front() { + Some((front_t, _)) => { + // Ensure that enough time has passed between the first and last logs. + // If not, we can't calculate throughput so we return `None`. + // In the case that `now` is earlier than the first log time, we also return `None`. + let time_elapsed = now.duration_since(*front_t).unwrap_or_default(); + if time_elapsed < self.min_elapsed_time { + return None; + } + + // Floating back never contains bytes, so we don't care that + // it's missed in this calculation. + let total_bytes_logged = self + .inner + .iter() + .fold(0, |acc, (_, bytes_read)| acc + bytes_read) + as f64; + + Some(Throughput { + bytes_read: total_bytes_logged, + per_time_elapsed: time_elapsed, + }) + } + _ => None, + } + } +} + +#[cfg(test)] +mod test { + use super::{Throughput, ThroughputLogs}; + use std::time::{Duration, SystemTime, UNIX_EPOCH}; + + #[test] + fn test_throughput_eq() { + let t1 = Throughput::new(1.0, Duration::from_secs(1)); + let t2 = Throughput::new(25.0, Duration::from_secs(25)); + let t3 = Throughput::new(100.0, Duration::from_secs(100)); + + assert_eq!(t1, t2); + assert_eq!(t2, t3); + } + + fn build_throughput_log( + length: u32, + tick_duration: Duration, + rate: u64, + ) -> (ThroughputLogs, SystemTime) { + let mut throughput_logs = ThroughputLogs::new(length as usize, Duration::from_secs(1)); + for i in 1..=length { + throughput_logs.push((UNIX_EPOCH + (tick_duration * i), rate)); + } + + assert_eq!(length as usize, throughput_logs.inner.len()); + (throughput_logs, UNIX_EPOCH + (tick_duration * length)) + } + + #[test] + fn test_throughput_log_calculate_throughput_1() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_secs(1), 1); + + let throughput = throughput_logs.calculate_throughput(now).unwrap(); + // Floats being what they are + assert_eq!(1.001001001001001, throughput.bytes_per_second()); + } + + #[test] + fn test_throughput_log_calculate_throughput_2() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_secs(5), 5); + + let throughput = throughput_logs.calculate_throughput(now).unwrap(); + // Floats being what they are + assert_eq!(1.001001001001001, throughput.bytes_per_second()); + } + + #[test] + fn test_throughput_log_calculate_throughput_3() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_millis(200), 1024); + + let throughput = throughput_logs.calculate_throughput(now).unwrap(); + let expected_throughput = 1024.0 * 5.0; + // Floats being what they are + assert_eq!( + expected_throughput + 5.125125125125, + throughput.bytes_per_second() + ); + } + + #[test] + fn test_throughput_log_calculate_throughput_4() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_millis(100), 12); + + let throughput = throughput_logs.calculate_throughput(now).unwrap(); + let expected_throughput = 12.0 * 10.0; + + // Floats being what they are + assert_eq!( + expected_throughput + 0.12012012012012, + throughput.bytes_per_second() + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index abb643ab89b..c9a59e26ec8 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -20,8 +20,8 @@ use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::retry::ErrorKind; use http::{Extensions, Uri}; -use hyper::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo}; -use hyper::service::Service; +use hyper_0_14::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo}; +use hyper_0_14::service::Service; use std::collections::HashMap; use std::error::Error; use std::fmt; @@ -38,7 +38,7 @@ mod default_connector { // Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we // don't need to repeatedly incur that cost. static HTTPS_NATIVE_ROOTS: once_cell::sync::Lazy< - hyper_rustls::HttpsConnector, + hyper_rustls::HttpsConnector, > = once_cell::sync::Lazy::new(|| { use hyper_rustls::ConfigBuilderExt; hyper_rustls::HttpsConnectorBuilder::new() @@ -82,7 +82,7 @@ mod default_connector { /// /// It requires a minimum TLS version of 1.2. /// It allows you to connect to both `http` and `https` URLs. - pub(super) fn https() -> hyper_rustls::HttpsConnector { + pub(super) fn https() -> hyper_rustls::HttpsConnector { HTTPS_NATIVE_ROOTS.clone() } } @@ -119,7 +119,7 @@ pub fn default_client() -> Option { } } -/// [`HttpConnector`] that uses [`hyper`] to make HTTP requests. +/// [`HttpConnector`] that uses [`hyper_0_14`] to make HTTP requests. /// /// This connector also implements socket connect and read timeouts. /// @@ -193,7 +193,7 @@ impl HttpConnector for HyperConnector { pub struct HyperConnectorBuilder { connector_settings: Option, sleep_impl: Option, - client_builder: Option, + client_builder: Option, } impl HyperConnectorBuilder { @@ -278,32 +278,32 @@ impl HyperConnectorBuilder { self } - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. /// /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. - pub fn hyper_builder(mut self, hyper_builder: hyper::client::Builder) -> Self { + pub fn hyper_builder(mut self, hyper_builder: hyper_0_14::client::Builder) -> Self { self.client_builder = Some(hyper_builder); self } - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. /// /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. pub fn set_hyper_builder( &mut self, - hyper_builder: Option, + hyper_builder: Option, ) -> &mut Self { self.client_builder = hyper_builder; self } } -/// Adapter from a [`hyper::Client`](hyper::Client) to [`HttpConnector`]. +/// Adapter from a [`hyper_0_14::Client`] to [`HttpConnector`]. /// /// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`HyperConnector::builder`]. struct Adapter { client: timeout_middleware::HttpReadTimeout< - hyper::Client, SdkBody>, + hyper_0_14::Client, SdkBody>, >, } @@ -339,7 +339,7 @@ fn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option HttpConnector for Adapter where C: Clone + Send + Sync + 'static, - C: hyper::service::Service, + C: hyper_0_14::service::Service, C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, C::Future: Unpin + Send + 'static, C::Error: Into, @@ -379,7 +379,7 @@ fn downcast_error(err: BoxError) -> ConnectorError { }; // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific // error classifications - let err = match err.downcast::() { + let err = match err.downcast::() { Ok(hyper_error) => return to_connector_error(*hyper_error), Err(box_error) => box_error, }; @@ -388,8 +388,8 @@ fn downcast_error(err: BoxError) -> ConnectorError { ConnectorError::other(err, None) } -/// Convert a [`hyper::Error`] into a [`ConnectorError`] -fn to_connector_error(err: hyper::Error) -> ConnectorError { +/// Convert a [`hyper_0_14::Error`] into a [`ConnectorError`] +fn to_connector_error(err: hyper_0_14::Error) -> ConnectorError { if err.is_timeout() || find_source::(&err).is_some() { ConnectorError::timeout(err.into()) } else if err.is_user() { @@ -435,7 +435,7 @@ impl From<&HttpConnectorSettings> for CacheKey { struct HyperClient { connector_cache: RwLock>, - client_builder: hyper::client::Builder, + client_builder: hyper_0_14::client::Builder, tcp_connector_fn: F, } @@ -490,7 +490,7 @@ where /// hyper client configuration. #[derive(Clone, Default, Debug)] pub struct HyperClientBuilder { - client_builder: Option, + client_builder: Option, } impl HyperClientBuilder { @@ -499,20 +499,20 @@ impl HyperClientBuilder { Self::default() } - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. /// /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. - pub fn hyper_builder(mut self, hyper_builder: hyper::client::Builder) -> Self { + pub fn hyper_builder(mut self, hyper_builder: hyper_0_14::client::Builder) -> Self { self.client_builder = Some(hyper_builder); self } - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. /// /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. pub fn set_hyper_builder( &mut self, - hyper_builder: Option, + hyper_builder: Option, ) -> &mut Self { self.client_builder = hyper_builder; self @@ -615,7 +615,7 @@ mod timeout_middleware { impl ConnectTimeout { /// Create a new `ConnectTimeout` around `inner`. /// - /// Typically, `I` will implement [`hyper::client::connect::Connect`]. + /// Typically, `I` will implement [`hyper_0_14::client::connect::Connect`]. pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { Self { inner, @@ -640,7 +640,7 @@ mod timeout_middleware { impl HttpReadTimeout { /// Create a new `HttpReadTimeout` around `inner`. /// - /// Typically, `I` will implement [`hyper::service::Service>`]. + /// Typically, `I` will implement [`hyper_0_14::service::Service>`]. pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { Self { inner, @@ -704,9 +704,9 @@ mod timeout_middleware { } } - impl hyper::service::Service for ConnectTimeout + impl hyper_0_14::service::Service for ConnectTimeout where - I: hyper::service::Service, + I: hyper_0_14::service::Service, I::Error: Into, { type Response = I::Response; @@ -734,9 +734,9 @@ mod timeout_middleware { } } - impl hyper::service::Service> for HttpReadTimeout + impl hyper_0_14::service::Service> for HttpReadTimeout where - I: hyper::service::Service, Error = hyper::Error>, + I: hyper_0_14::service::Service, Error = hyper_0_14::Error>, { type Response = I::Response; type Error = BoxError; @@ -771,7 +771,7 @@ mod timeout_middleware { use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_types::error::display::DisplayErrorContext; - use hyper::client::connect::Connected; + use hyper_0_14::client::connect::Connected; use std::time::Duration; use tokio::io::ReadBuf; use tokio::net::TcpStream; @@ -790,7 +790,7 @@ mod timeout_middleware { #[non_exhaustive] #[derive(Clone, Default, Debug)] struct NeverConnects; - impl hyper::service::Service for NeverConnects { + impl hyper_0_14::service::Service for NeverConnects { type Response = TcpStream; type Error = ConnectorError; type Future = Pin> + Send>>; @@ -810,7 +810,7 @@ mod timeout_middleware { /// A service that will connect but never send any data #[derive(Clone, Debug, Default)] struct NeverReplies; - impl hyper::service::Service for NeverReplies { + impl hyper_0_14::service::Service for NeverReplies { type Response = EmptyStream; type Error = BoxError; type Future = std::future::Ready>; @@ -937,7 +937,7 @@ mod test { use crate::client::http::test_util::NeverTcpConnector; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use http::Uri; - use hyper::client::connect::{Connected, Connection}; + use hyper_0_14::client::connect::{Connected, Connection}; use std::io::{Error, ErrorKind}; use std::pin::Pin; use std::sync::atomic::{AtomicU32, Ordering}; @@ -1057,7 +1057,7 @@ mod test { inner: T, } - impl hyper::service::Service for TestConnection + impl hyper_0_14::service::Service for TestConnection where T: Clone + Connection, { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs index 3403ffcc0db..7d03163a1c3 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs @@ -14,7 +14,7 @@ use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; -use http_body::Body; +use http_body_0_4::Body; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex, MutexGuard}; @@ -87,7 +87,7 @@ fn record_body( direction: Direction, event_bus: Arc>>, ) -> JoinHandle<()> { - let (sender, output_body) = hyper::Body::channel(); + let (sender, output_body) = hyper_0_14::Body::channel(); let real_body = std::mem::replace(body, SdkBody::from_body_0_4(output_body)); tokio::spawn(async move { let mut real_body = real_body; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index f24cb36fb2b..415f01735b1 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -16,7 +16,7 @@ use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use bytes::{Bytes, BytesMut}; use http::{Request, Version}; -use http_body::Body; +use http_body_0_4::Body; use std::collections::{HashMap, VecDeque}; use std::error::Error; use std::fmt; @@ -228,7 +228,7 @@ impl ReplayingClient { } } -async fn replay_body(events: VecDeque, mut sender: hyper::body::Sender) { +async fn replay_body(events: VecDeque, mut sender: hyper_0_14::body::Sender) { for event in events { match event.action { Action::Request { .. } => panic!(), @@ -293,7 +293,7 @@ impl HttpConnector for ReplayingClient { }; let _initial_request = events.pop_front().unwrap(); - let (sender, response_body) = hyper::Body::channel(); + let (sender, response_body) = hyper_0_14::Body::channel(); let body = SdkBody::from_body_0_4(response_body); let recording = self.recorded_requests.clone(); let recorded_request = tokio::spawn(async move { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs index 979e911a4c1..d61608cbeb2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs @@ -70,7 +70,7 @@ impl NeverTcpConnector { } #[cfg(feature = "connector-hyper-0-14-x")] -impl hyper::service::Service for NeverTcpConnector { +impl hyper_0_14::service::Service for NeverTcpConnector { type Response = connection::NeverTcpConnection; type Error = aws_smithy_runtime_api::box_error::BoxError; type Future = std::pin::Pin< @@ -94,7 +94,7 @@ impl hyper::service::Service for NeverTcpConnector { #[cfg(feature = "connector-hyper-0-14-x")] mod connection { - use hyper::client::connect::{Connected, Connection}; + use hyper_0_14::client::connect::{Connected, Connection}; use std::io::Error; use std::pin::Pin; use std::task::{Context, Poll}; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs index 4165c0237d5..e152c9b11c0 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs @@ -46,10 +46,10 @@ use aws_smithy_runtime_api::client::http::SharedHttpClient; use aws_smithy_runtime_api::shared::IntoShared; use bytes::Bytes; use http::{Request, Response}; -use hyper::client::connect::dns::Name; -use hyper::server::conn::AddrStream; -use hyper::service::{make_service_fn, service_fn, Service}; -use hyper::{Body, Server}; +use hyper_0_14::client::connect::dns::Name; +use hyper_0_14::server::conn::AddrStream; +use hyper_0_14::service::{make_service_fn, service_fn, Service}; +use hyper_0_14::{Body, Server}; use std::collections::HashSet; use std::convert::Infallible; use std::error::Error; @@ -169,7 +169,7 @@ impl ReplayedEvent { } } - pub fn with_body(body: &str) -> Self { + pub fn with_body(body: impl AsRef<[u8]>) -> Self { Self::HttpResponse { status: 200, body: Bytes::copy_from_slice(body.as_ref()), @@ -221,7 +221,7 @@ impl WireMockServer { tracing::info!("established connection: {:?}", connection); wire_log.lock().unwrap().push(RecordedEvent::NewConnection); async move { - Ok::<_, Infallible>(service_fn(move |_: Request| { + Ok::<_, Infallible>(service_fn(move |_: Request| { if poisoned_conns.lock().unwrap().contains(&remote_addr) { tracing::error!("poisoned connection {:?} was reused!", &remote_addr); panic!("poisoned connection was reused!"); @@ -285,7 +285,7 @@ impl WireMockServer { /// **Note**: This must be used in tandem with [`Self::dns_resolver`] pub fn http_client(&self) -> SharedHttpClient { HyperClientBuilder::new() - .build(hyper::client::HttpConnector::new_with_resolver( + .build(hyper_0_14::client::HttpConnector::new_with_resolver( self.dns_resolver(), )) .into_shared() @@ -311,7 +311,7 @@ async fn generate_response_event(event: ReplayedEvent) -> Result, let resp = match event { ReplayedEvent::HttpResponse { status, body } => http::Response::builder() .status(status) - .body(hyper::Body::from(body)) + .body(hyper_0_14::Body::from(body)) .unwrap(), ReplayedEvent::Timeout => { Never::new().await; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 61d3948605e..a09e014a612 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -35,10 +35,13 @@ use std::mem; use tracing::{debug, debug_span, instrument, trace, Instrument}; mod auth; + /// Defines types that implement a trait for endpoint resolution pub mod endpoints; + /// Defines types that work with HTTP types mod http; + /// Utility for making one-off unmodeled requests with the orchestrator. #[doc(hidden)] pub mod operation; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs index ca15aed5fb6..a34bb3d2324 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs @@ -7,7 +7,7 @@ use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, SensitiveOutput use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; use bytes::{Buf, Bytes}; -use http_body::Body; +use http_body_0_4::Body; use pin_utils::pin_mut; use tracing::trace; diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs index c07ccab405a..ca2a3c77ce0 100644 --- a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -26,7 +26,7 @@ use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryA use aws_smithy_types::body::SdkBody; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig}; use aws_smithy_types::timeout::TimeoutConfig; -use hyper::client::Builder as HyperBuilder; +use hyper_0_14::client::Builder as HyperBuilder; use std::fmt; use std::time::Duration; @@ -119,13 +119,13 @@ async fn wire_level_test( reconnect_mode: ReconnectMode, match_clause: impl Fn(&[RecordedEvent]), ) { - let mut hyper_builder = hyper::Client::builder(); + let mut hyper_builder = hyper_0_14::Client::builder(); hyper_builder_settings(&mut hyper_builder); let mock = WireMockServer::start(events).await; let http_client = HyperClientBuilder::new() .hyper_builder(hyper_builder) - .build(hyper::client::HttpConnector::new_with_resolver( + .build(hyper_0_14::client::HttpConnector::new_with_resolver( mock.dns_resolver(), )); diff --git a/rust-runtime/aws-smithy-types/src/body.rs b/rust-runtime/aws-smithy-types/src/body.rs index 043aa47df35..563be145fbf 100644 --- a/rust-runtime/aws-smithy-types/src/body.rs +++ b/rust-runtime/aws-smithy-types/src/body.rs @@ -163,6 +163,26 @@ impl SdkBody { } } + #[cfg(feature = "http-body-0-4-x")] + pub(crate) fn poll_next_trailers( + self: Pin<&mut Self>, + #[allow(unused)] cx: &mut Context<'_>, + ) -> Poll>, Error>> { + let this = self.project(); + match this.inner.project() { + InnerProj::Once { .. } => Poll::Ready(Ok(None)), + InnerProj::Dyn { inner } => match inner.get_mut() { + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + Pin::new(box_body).poll_trailers(cx) + } + }, + InnerProj::Taken => Poll::Ready(Err( + "A `Taken` body should never be polled for trailers".into(), + )), + } + } + /// If possible, return a reference to this body as `&[u8]` /// /// If this SdkBody is NOT streaming, this will return the byte slab diff --git a/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs b/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs index 2c6a597c41c..a6719d1fa2d 100644 --- a/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs +++ b/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs @@ -49,9 +49,9 @@ impl http_body_0_4::Body for SdkBody { fn poll_trailers( self: Pin<&mut Self>, - _cx: &mut Context<'_>, + cx: &mut Context<'_>, ) -> Poll>, Self::Error>> { - Poll::Ready(Ok(None)) + self.poll_next_trailers(cx) } fn is_end_stream(&self) -> bool { @@ -78,7 +78,7 @@ mod tests { let initial = SdkBody::from("hello!"); assert_eq!(initial.bytes(), Some(b"hello!".as_slice())); - let new_body = initial.map_preserve_contents(|body| SdkBody::from_body_0_4(body)); + let new_body = initial.map_preserve_contents(SdkBody::from_body_0_4); assert_eq!(new_body.bytes(), Some(b"hello!".as_slice())); } From 78c23de8b27f63979e793a10cc9da83294ade03e Mon Sep 17 00:00:00 2001 From: Fahad Zubair Date: Fri, 27 Oct 2023 11:36:24 +0100 Subject: [PATCH 199/331] Use re-exported types in examples instead of aws-smithy-types (#3105) Some of the examples were using types from `aws-smithy-types` instead of the re-exported ones from the generated SDKs. As a guideline, it is preferred to use re-exported types rather than directly depending on underlying crates. Co-authored-by: Fahad Zubair --- .../pokemon-service-client-usage/examples/mock-request.rs | 2 +- .../examples/response-header-interceptor.rs | 1 - .../pokemon-service-client-usage/examples/use-config-bag.rs | 1 - examples/pokemon-service-common/Cargo.toml | 1 - examples/pokemon-service-common/src/lib.rs | 6 ++++-- examples/pokemon-service/Cargo.toml | 1 - 6 files changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/pokemon-service-client-usage/examples/mock-request.rs b/examples/pokemon-service-client-usage/examples/mock-request.rs index 64f21beb658..1206f3e66f7 100644 --- a/examples/pokemon-service-client-usage/examples/mock-request.rs +++ b/examples/pokemon-service-client-usage/examples/mock-request.rs @@ -13,7 +13,7 @@ /// The example can be run using `cargo run --example mock-request`. /// use aws_smithy_runtime::client::http::test_util::capture_request; -use aws_smithy_types::body::SdkBody; +use pokemon_service_client::primitives::SdkBody; use pokemon_service_client::Client as PokemonClient; use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; diff --git a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs index 14928fe28c1..d226ce4a3dd 100644 --- a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs +++ b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs @@ -11,7 +11,6 @@ /// /// The example can be run using `cargo run --example response-header-interceptor`. /// -//use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use pokemon_service_client::{ config::{ diff --git a/examples/pokemon-service-client-usage/examples/use-config-bag.rs b/examples/pokemon-service-client-usage/examples/use-config-bag.rs index 6dd9cba3a50..32fc40723fd 100644 --- a/examples/pokemon-service-client-usage/examples/use-config-bag.rs +++ b/examples/pokemon-service-client-usage/examples/use-config-bag.rs @@ -11,7 +11,6 @@ /// /// The example can be run using `cargo run --example use-config-bag`. /// -//use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; use std::time::Instant; diff --git a/examples/pokemon-service-common/Cargo.toml b/examples/pokemon-service-common/Cargo.toml index e23a3c8dbf1..3121fcb11ad 100644 --- a/examples/pokemon-service-common/Cargo.toml +++ b/examples/pokemon-service-common/Cargo.toml @@ -19,7 +19,6 @@ tower = "0.4" aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-runtime-api = { path = "../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-http-server = { path = "../../rust-runtime/aws-smithy-http-server" } -aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types" } pokemon-service-client = { path = "../pokemon-service-client" } pokemon-service-server-sdk = { path = "../pokemon-service-server-sdk" } diff --git a/examples/pokemon-service-common/src/lib.rs b/examples/pokemon-service-common/src/lib.rs index 851a07865ba..72f18605498 100644 --- a/examples/pokemon-service-common/src/lib.rs +++ b/examples/pokemon-service-common/src/lib.rs @@ -18,10 +18,12 @@ use async_stream::stream; use aws_smithy_http_server::Extension; use aws_smithy_runtime::client::http::hyper_014::HyperConnector; use aws_smithy_runtime_api::client::http::HttpConnector; -use aws_smithy_types::{body::SdkBody, byte_stream::ByteStream}; use http::Uri; use pokemon_service_server_sdk::{ - error, input, model, model::CapturingPayload, output, types::Blob, + error, input, model, + model::CapturingPayload, + output, + types::{Blob, ByteStream, SdkBody}, }; use rand::{seq::SliceRandom, Rng}; use tracing_subscriber::{prelude::*, EnvFilter}; diff --git a/examples/pokemon-service/Cargo.toml b/examples/pokemon-service/Cargo.toml index 819a63437b3..8af48fa141d 100644 --- a/examples/pokemon-service/Cargo.toml +++ b/examples/pokemon-service/Cargo.toml @@ -33,5 +33,4 @@ hyper-rustls = { version = "0.24", features = ["http2"] } # Local paths aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } -aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } pokemon-service-client = { path = "../pokemon-service-client/" } From 882ebaf7e058504d2a125e83c07269f09a9088d4 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 27 Oct 2023 16:04:39 -0500 Subject: [PATCH 200/331] Avoid making `FsBuilder` aware of http-body version at interface level (#3101) ## Motivation and Context Follow up on #3088 ## Description This PR reverts `ByteStream::read_with_body_0_4_from`, `ByteStream::from_path_body_0_4`, and `ByteStream::from_file_body_0_4` to the old names since from a customers' point of view, `FsBuilder` should not mention anything about an `http-body` version at the API level. `FsBuilder` is currently an opt-in feature (with `rt-tokio` enabled) and we make it tied to `http-body-0-4-x` by requiring `rt-tokio` including a dependency on `http-body` version 0.4.x. ## Testing Relied on the existing tests in CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 2 +- .../src/http_request_checksum.rs | 2 +- .../glacier/tests/custom-headers.rs | 6 +- .../integration-tests/s3/tests/checksums.rs | 2 +- .../customize/RequiredCustomizations.kt | 4 +- .../ServerRequiredCustomizations.kt | 4 +- .../src/types.rs | 4 +- rust-runtime/aws-smithy-types/Cargo.toml | 2 +- rust-runtime/aws-smithy-types/src/body.rs | 7 +- .../aws-smithy-types/src/byte_stream.rs | 104 +++++++++++++++--- .../src/byte_stream/bytestream_util.rs | 75 +++++-------- .../src/byte_stream/http_body_0_4_x.rs | 83 +------------- 12 files changed, 128 insertions(+), 167 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 7f9f7ff2123..29a71b5528f 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -489,7 +489,7 @@ author = "rcoh" [[smithy-rs]] message = "Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3089) for details." -references = ["smithy-rs#3033", "smithy-rs#3088"] +references = ["smithy-rs#3033", "smithy-rs#3088", "smithy-rs#3101"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "ysaito1001" diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index 239133414e1..ef07f2c34bb 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -269,7 +269,7 @@ mod tests { let crc32c_checksum = crc32c_checksum.finalize(); let mut request = HttpRequest::new( - ByteStream::read_with_body_0_4_from() + ByteStream::read_from() .path(&file) .buffer_size(1024) .build() diff --git a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs index 46536dd2cdd..52194567cc5 100644 --- a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs +++ b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs @@ -21,11 +21,7 @@ async fn set_correct_headers() { let _resp = client .upload_archive() .vault_name("vault") - .body( - ByteStream::from_path_body_0_4("tests/test-file.txt") - .await - .unwrap(), - ) + .body(ByteStream::from_path("tests/test-file.txt").await.unwrap()) .send() .await; let req = handler.expect_request(); diff --git a/aws/sdk/integration-tests/s3/tests/checksums.rs b/aws/sdk/integration-tests/s3/tests/checksums.rs index 97155bfc09d..37782182e01 100644 --- a/aws/sdk/integration-tests/s3/tests/checksums.rs +++ b/aws/sdk/integration-tests/s3/tests/checksums.rs @@ -177,7 +177,7 @@ async fn test_checksum_on_streaming_request<'a>( use std::io::Write; file.write_all(body).unwrap(); - let body = aws_sdk_s3::primitives::ByteStream::read_with_body_0_4_from() + let body = aws_sdk_s3::primitives::ByteStream::read_from() .path(file.path()) .buffer_size(1024) .build() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 22ec93e842e..0c2bc8ef936 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -71,12 +71,12 @@ class RequiredCustomizations : ClientCodegenDecorator { override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val rc = codegenContext.runtimeConfig - // Add rt-tokio and http-body-0-4-x features for `ByteStream::from_path_0_4` + // Add rt-tokio feature for `ByteStream::from_path` rustCrate.mergeFeature( Feature( "rt-tokio", true, - listOf("aws-smithy-async/rt-tokio", "aws-smithy-types/rt-tokio", "aws-smithy-types/http-body-0-4-x"), + listOf("aws-smithy-async/rt-tokio", "aws-smithy-types/rt-tokio"), ), ) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index dde2e91baee..1117cd1d163 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -37,12 +37,12 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { override fun extras(codegenContext: ServerCodegenContext, rustCrate: RustCrate) { val rc = codegenContext.runtimeConfig - // Add rt-tokio and http-body-0-4-x features for `ByteStream::from_path_body_0_4` + // Add rt-tokio feature for `ByteStream::from_path` rustCrate.mergeFeature( Feature( "rt-tokio", true, - listOf("aws-smithy-types/rt-tokio", "aws-smithy-types/http-body-0-4-x"), + listOf("aws-smithy-types/rt-tokio"), ), ) diff --git a/rust-runtime/aws-smithy-http-server-python/src/types.rs b/rust-runtime/aws-smithy-http-server-python/src/types.rs index a475f623512..1af75dbd27d 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/types.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/types.rs @@ -407,7 +407,7 @@ impl ByteStream { #[staticmethod] pub fn from_path_blocking(py: Python, path: String) -> PyResult> { let byte_stream = Handle::current().block_on(async { - aws_smithy_types::byte_stream::ByteStream::from_path_body_0_4(path) + aws_smithy_types::byte_stream::ByteStream::from_path(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string())) })?; @@ -423,7 +423,7 @@ impl ByteStream { #[staticmethod] pub fn from_path(py: Python, path: String) -> PyResult<&PyAny> { pyo3_asyncio::tokio::future_into_py(py, async move { - let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path_body_0_4(path) + let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string()))?; Ok(Self(Arc::new(Mutex::new(byte_stream)))) diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index 42f50191a9e..a4e0d39fcd2 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -14,7 +14,7 @@ repository = "https://github.com/awslabs/smithy-rs" byte-stream-poll-next = [] http-body-0-4-x = ["dep:http-body-0-4"] hyper-0-14-x = ["dep:hyper-0-14"] -rt-tokio = ["dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] +rt-tokio = ["dep:http-body-0-4", "dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] test-util = [] serde-serialize = [] serde-deserialize = [] diff --git a/rust-runtime/aws-smithy-types/src/body.rs b/rust-runtime/aws-smithy-types/src/body.rs index 563be145fbf..33e5912a935 100644 --- a/rust-runtime/aws-smithy-types/src/body.rs +++ b/rust-runtime/aws-smithy-types/src/body.rs @@ -95,10 +95,9 @@ impl SdkBody { /// _Note: This is probably not what you want_ /// /// All bodies constructed from in-memory data (`String`, `Vec`, `Bytes`, etc.) will be - /// retryable out of the box. If you want to read data from a file, you should turn on a feature - /// `http-body-0-4-x` and use `ByteStream::from_path_body_0_4`. - /// - /// This function is only necessary when you need to enable retries for your own streaming container. + /// retryable out of the box. If you want to read data from a file, you should use + /// [`ByteStream::from_path`](crate::byte_stream::ByteStream::from_path). This function + /// is only necessary when you need to enable retries for your own streaming container. pub fn retryable(f: impl Fn() -> SdkBody + Send + Sync + 'static) -> Self { let initial = f(); SdkBody { diff --git a/rust-runtime/aws-smithy-types/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs index 0db39f4bd1f..1018518d5c0 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -78,10 +78,10 @@ //! //! ### Create a ByteStream from a file //! -//! _Note: This is only available with `rt-tokio` and `http-body-0-4-x` enabled._ +//! _Note: This is only available with `rt-tokio` enabled._ //! //! ```no_run -//! # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] +//! # #[cfg(feature = "rt-tokio")] //! # { //! use aws_smithy_types::byte_stream::ByteStream; //! use std::path::Path; @@ -90,7 +90,7 @@ //! } //! //! async fn bytestream_from_file() -> GetObjectInput { -//! let bytestream = ByteStream::from_path_body_0_4("docs/some-large-file.csv") +//! let bytestream = ByteStream::from_path("docs/some-large-file.csv") //! .await //! .expect("valid path"); //! GetObjectInput { body: bytestream } @@ -102,7 +102,7 @@ //! or the length of the file, use an `FsBuilder`. //! //! ```no_run -//! # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] +//! # #[cfg(feature = "rt-tokio")] //! # { //! use aws_smithy_types::byte_stream::{ByteStream, Length}; //! use std::path::Path; @@ -111,7 +111,7 @@ //! } //! //! async fn bytestream_from_file() -> GetObjectInput { -//! let bytestream = ByteStream::read_with_body_0_4_from().path("docs/some-large-file.csv") +//! let bytestream = ByteStream::read_from().path("docs/some-large-file.csv") //! .buffer_size(32_784) //! .length(Length::Exact(123_456)) //! .build() @@ -235,26 +235,18 @@ pin_project! { /// ``` /// /// 2. **From a file**: ByteStreams created from a path can be retried. A new file descriptor will be opened if a retry occurs. - /// - /// _Note: The `http-body-0-4-x` feature must be active to call `ByteStream::from_body_0_4`._ - /// /// ```no_run - /// #[cfg(all(feature = "tokio-rt", feature = "http-body-0-4-x"))] + /// #[cfg(feature = "tokio-rt")] /// # { /// use aws_smithy_types::byte_stream::ByteStream; - /// let stream = ByteStream::from_path_body_0_4("big_file.csv"); + /// let stream = ByteStream::from_path("big_file.csv"); /// # } /// ``` /// /// 3. **From an `SdkBody` directly**: For more advanced / custom use cases, a ByteStream can be created directly /// from an SdkBody. **When created from an SdkBody, care must be taken to ensure retriability.** An SdkBody is retryable /// when constructed from in-memory data or when using [`SdkBody::retryable`](crate::body::SdkBody::retryable). - /// - /// _Note: The `http-body-0-4-x` feature must be active to construct an `SdkBody` with `from_body_0_4`._ - /// /// ```no_run - /// # #[cfg(feature = "http-body-0-4-x")] - /// # { /// # use hyper_0_14 as hyper; /// use aws_smithy_types::byte_stream::ByteStream; /// use aws_smithy_types::body::SdkBody; @@ -265,7 +257,6 @@ pin_project! { /// tx.send_data(Bytes::from_static(b"hello world!")); /// tx.send_data(Bytes::from_static(b"hello again!")); /// // NOTE! You must ensure that `tx` is dropped to ensure that EOF is sent - /// # } /// ``` /// #[derive(Debug)] @@ -353,6 +344,87 @@ impl ByteStream { self.inner.collect().await.map_err(Error::streaming) } + /// Returns a [`FsBuilder`](crate::byte_stream::FsBuilder), allowing you to build a `ByteStream` with + /// full control over how the file is read (eg. specifying the length of the file or the size of the buffer used to read the file). + /// ```no_run + /// # #[cfg(feature = "rt-tokio")] + /// # { + /// use aws_smithy_types::byte_stream::{ByteStream, Length}; + /// + /// async fn bytestream_from_file() -> ByteStream { + /// let bytestream = ByteStream::read_from() + /// .path("docs/some-large-file.csv") + /// // Specify the size of the buffer used to read the file (in bytes, default is 4096) + /// .buffer_size(32_784) + /// // Specify the length of the file used (skips an additional call to retrieve the size) + /// .length(Length::Exact(123_456)) + /// .build() + /// .await + /// .expect("valid path"); + /// bytestream + /// } + /// # } + /// ``` + #[cfg(feature = "rt-tokio")] + #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] + pub fn read_from() -> crate::byte_stream::FsBuilder { + crate::byte_stream::FsBuilder::new() + } + + /// Create a ByteStream that streams data from the filesystem + /// + /// This function creates a retryable ByteStream for a given `path`. The returned ByteStream + /// will provide a size hint when used as an HTTP body. If the request fails, the read will + /// begin again by reloading the file handle. + /// + /// ## Warning + /// The contents of the file MUST not change during retries. The length & checksum of the file + /// will be cached. If the contents of the file change, the operation will almost certainly fail. + /// + /// Furthermore, a partial write MAY seek in the file and resume from the previous location. + /// + /// Note: If you want more control, such as specifying the size of the buffer used to read the file + /// or the length of the file, use a [`FsBuilder`](crate::byte_stream::FsBuilder) as returned + /// from `ByteStream::read_from` + /// + /// # Examples + /// ```no_run + /// use aws_smithy_types::byte_stream::ByteStream; + /// use std::path::Path; + /// async fn make_bytestream() -> ByteStream { + /// ByteStream::from_path("docs/rows.csv").await.expect("file should be readable") + /// } + /// ``` + #[cfg(feature = "rt-tokio")] + #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] + pub async fn from_path( + path: impl AsRef, + ) -> Result { + crate::byte_stream::FsBuilder::new() + .path(path) + .build() + .await + } + + /// Create a ByteStream from a file + /// + /// NOTE: This will NOT result in a retryable ByteStream. For a ByteStream that can be retried in the case of + /// upstream failures, use [`ByteStream::from_path`](ByteStream::from_path) + #[deprecated( + since = "0.40.0", + note = "Prefer the more extensible ByteStream::read_from() API" + )] + #[cfg(feature = "rt-tokio")] + #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] + pub async fn from_file( + file: tokio::fs::File, + ) -> Result { + crate::byte_stream::FsBuilder::new() + .file(file) + .build() + .await + } + #[cfg(feature = "rt-tokio")] /// Convert this `ByteStream` into a struct that implements [`AsyncRead`](tokio::io::AsyncRead). /// diff --git a/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs index 467733b0022..39965c90c56 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs @@ -8,7 +8,6 @@ use crate::byte_stream::{error::Error, error::ErrorKind, ByteStream}; use std::future::Future; use std::path::PathBuf; use std::pin::Pin; -use std::sync::Arc; use tokio::fs::File; use tokio::io::{self, AsyncReadExt, AsyncSeekExt}; use tokio_util::io::ReaderStream; @@ -56,11 +55,8 @@ impl PathBody { /// Builder for creating [`ByteStreams`](ByteStream) from a file/path, with full control over advanced options. /// -/// _Note: A cargo feature `http-body-0-4-x` should be active to call `ByteStream::read_with_body_0_4_from` in the following example._ -/// -/// Example usage: /// ```no_run -/// # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] +/// # #[cfg(feature = "rt-tokio")] /// # { /// use aws_smithy_types::byte_stream::{ByteStream, Length}; /// use std::path::Path; @@ -69,7 +65,7 @@ impl PathBody { /// } /// /// async fn bytestream_from_file() -> GetObjectInput { -/// let bytestream = ByteStream::read_with_body_0_4_from() +/// let bytestream = ByteStream::read_from() /// .path("docs/some-large-file.csv") /// // Specify the size of the buffer used to read the file (in bytes, default is 4096) /// .buffer_size(32_784) @@ -89,12 +85,12 @@ pub struct FsBuilder { length: Option, buffer_size: usize, offset: Option, - sdk_body_creator: SdkBodyCreator, } -enum SdkBodyCreator { - #[cfg(feature = "http-body-0-4-x")] - HttpBody04(Arc SdkBody + Send + Sync + 'static>), +impl Default for FsBuilder { + fn default() -> Self { + Self::new() + } } /// The length (in bytes) to read. Determines whether or not a short read counts as an error. @@ -108,22 +104,16 @@ pub enum Length { } impl FsBuilder { - #[cfg(feature = "http-body-0-4-x")] /// Create a new [`FsBuilder`] (using a default read buffer of 4096 bytes). /// /// You must then call either [`file`](FsBuilder::file) or [`path`](FsBuilder::path) to specify what to read from. - /// - /// _Note: This is only available with `http-body-0-4-x` enabled._ - pub fn new_with_body_0_4() -> Self { + pub fn new() -> Self { Self { buffer_size: DEFAULT_BUFFER_SIZE, file: None, length: None, offset: None, path: None, - sdk_body_creator: SdkBodyCreator::HttpBody04(Arc::new(|body: PathBody| { - SdkBody::from_body_0_4(body) - })), } } @@ -203,19 +193,12 @@ impl FsBuilder { let body_loader = move || { // If an offset was provided, seeking will be handled in `PathBody::poll_data` each // time the file is loaded. - match &self.sdk_body_creator { - #[cfg(feature = "http-body-0-4-x")] - SdkBodyCreator::HttpBody04(f) => f(PathBody::from_path( - path.clone(), - length, - buffer_size, - self.offset, - )), - #[allow(unreachable_patterns)] - _ => unreachable!( - "`http-body-0-4-x` should've been enabled to create an `FsBuilder`" - ), - } + SdkBody::from_body_0_4(PathBody::from_path( + path.clone(), + length, + buffer_size, + self.offset, + )) }; Ok(ByteStream::new(SdkBody::retryable(body_loader))) @@ -225,14 +208,7 @@ impl FsBuilder { let _s = file.seek(io::SeekFrom::Start(offset)).await?; } - let body = match self.sdk_body_creator { - #[cfg(feature = "http-body-0-4-x")] - SdkBodyCreator::HttpBody04(f) => f(PathBody::from_file(file, length, buffer_size)), - #[allow(unreachable_patterns)] - _ => unreachable!( - "`http-body-0-4-x` should've been enabled to create an `FsBuilder`" - ), - }; + let body = SdkBody::from_body_0_4(PathBody::from_file(file, length, buffer_size)); Ok(ByteStream::new(body)) } else { @@ -256,7 +232,6 @@ enum State { Loaded(ReaderStream>), } -#[cfg(feature = "http-body-0-4-x")] impl http_body_0_4::Body for PathBody { type Data = bytes::Bytes; type Error = Box; @@ -343,7 +318,7 @@ mod test { .expect("file metadata is accessible") .len(); - let body = FsBuilder::new_with_body_0_4() + let body = FsBuilder::new() .path(&file) .buffer_size(16384) .length(Length::Exact(file_length)) @@ -382,7 +357,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new_with_body_0_4() + let body = FsBuilder::new() .path(&file) // The file is longer than 1 byte, let's see if this is used to generate the size hint .length(Length::Exact(1)) @@ -406,7 +381,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new_with_body_0_4() + let body = FsBuilder::new() .path(&file) // We're going to read line 0 only .length(Length::Exact(line_0.len() as u64)) @@ -430,7 +405,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - assert!(FsBuilder::new_with_body_0_4() + assert!(FsBuilder::new() .path(&file) // The file is 30 bytes so this is fine .length(Length::Exact(29)) @@ -438,7 +413,7 @@ mod test { .await .is_ok()); - assert!(FsBuilder::new_with_body_0_4() + assert!(FsBuilder::new() .path(&file) // The file is 30 bytes so this is fine .length(Length::Exact(30)) @@ -446,7 +421,7 @@ mod test { .await .is_ok()); - assert!(FsBuilder::new_with_body_0_4() + assert!(FsBuilder::new() .path(&file) // Larger than 30 bytes, this will cause an error .length(Length::Exact(31)) @@ -467,7 +442,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new_with_body_0_4() + let body = FsBuilder::new() .path(&file) // We're going to skip the first line by using offset .offset(line_0.len() as u64) @@ -495,7 +470,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new_with_body_0_4() + let body = FsBuilder::new() .path(&file) // We're going to skip line 0 by using offset .offset(line_0.len() as u64) @@ -524,7 +499,7 @@ mod test { file.flush().expect("flushing is OK"); assert_eq!( - FsBuilder::new_with_body_0_4() + FsBuilder::new() .path(&file) // We're going to skip all file contents by setting an offset // much larger than the file size @@ -549,7 +524,7 @@ mod test { // Ensure that the file was written to file.flush().expect("flushing is OK"); - let body = FsBuilder::new_with_body_0_4() + let body = FsBuilder::new() .path(&file) .length(Length::UpTo(9000)) .build() @@ -601,7 +576,7 @@ mod test { chunk_size }; - let byte_stream = FsBuilder::new_with_body_0_4() + let byte_stream = FsBuilder::new() .path(&file_path) .offset(i * chunk_size) .length(Length::Exact(length)) diff --git a/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs b/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs index 5edbaaba878..8bdae026f66 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs @@ -18,87 +18,6 @@ impl ByteStream { { ByteStream::new(SdkBody::from_body_0_4(body)) } - - /// Returns a [`FsBuilder`](crate::byte_stream::FsBuilder), allowing you to build a `ByteStream` with - /// full control over how the file is read (eg. specifying the length of the file or the size of the buffer used to read the file). - /// ```no_run - /// # #[cfg(all(feature = "rt-tokio", feature = "http-body-0-4-x"))] - /// # { - /// use aws_smithy_types::byte_stream::{ByteStream, Length}; - /// - /// async fn bytestream_from_file() -> ByteStream { - /// let bytestream = ByteStream::read_with_body_0_4_from() - /// .path("docs/some-large-file.csv") - /// // Specify the size of the buffer used to read the file (in bytes, default is 4096) - /// .buffer_size(32_784) - /// // Specify the length of the file used (skips an additional call to retrieve the size) - /// .length(Length::Exact(123_456)) - /// .build() - /// .await - /// .expect("valid path"); - /// bytestream - /// } - /// # } - /// ``` - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub fn read_with_body_0_4_from() -> crate::byte_stream::FsBuilder { - crate::byte_stream::FsBuilder::new_with_body_0_4() - } - - /// Create a ByteStream that streams data from the filesystem - /// - /// This function creates a retryable ByteStream for a given `path`. The returned ByteStream - /// will provide a size hint when used as an HTTP body. If the request fails, the read will - /// begin again by reloading the file handle. - /// - /// ## Warning - /// The contents of the file MUST not change during retries. The length & checksum of the file - /// will be cached. If the contents of the file change, the operation will almost certainly fail. - /// - /// Furthermore, a partial write MAY seek in the file and resume from the previous location. - /// - /// Note: If you want more control, such as specifying the size of the buffer used to read the file - /// or the length of the file, use a [`FsBuilder`](crate::byte_stream::FsBuilder) as returned - /// from `ByteStream::read_with_body_0_4_from` - /// - /// # Examples - /// ```no_run - /// use aws_smithy_types::byte_stream::ByteStream; - /// use std::path::Path; - /// async fn make_bytestream() -> ByteStream { - /// ByteStream::from_path_body_0_4("docs/rows.csv").await.expect("file should be readable") - /// } - /// ``` - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub async fn from_path_body_0_4( - path: impl AsRef, - ) -> Result { - crate::byte_stream::FsBuilder::new_with_body_0_4() - .path(path) - .build() - .await - } - - /// Create a ByteStream from a file - /// - /// NOTE: This will NOT result in a retryable ByteStream. For a ByteStream that can be retried in the case of - /// upstream failures, use [`ByteStream::from_path_body_0_4`](ByteStream::from_path_body_0_4) - #[deprecated( - since = "0.40.0", - note = "Prefer the more extensible ByteStream::read_from() API" - )] - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub async fn from_file_body_0_4( - file: tokio::fs::File, - ) -> Result { - crate::byte_stream::FsBuilder::new_with_body_0_4() - .file(file) - .build() - .await - } } #[cfg(feature = "hyper-0-14-x")] @@ -141,7 +60,7 @@ mod tests { for i in 0..10000 { writeln!(file, "Brian was here. Briefly. {}", i)?; } - let body = ByteStream::from_path_body_0_4(&file).await?.into_inner(); + let body = ByteStream::from_path(&file).await?.into_inner(); // assert that a valid size hint is immediately ready assert_eq!(body.content_length(), Some(298890)); let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); From cae35b7d058f0fcab68beefba3aab976d73ab5b1 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 27 Oct 2023 16:16:45 -0500 Subject: [PATCH 201/331] Move `result` and `connection` from `aws-smithy-http` to `aws-smithy-runtime-api` (#3103) ## Motivation and Context Implements #3092 ## Description This PR moves the `connection` and `result` modules from `aws-smithy-http` to `aws_smithy_runtime_api`. `SdkError` is primarily used within the context of the orchestrator, hence `aws_smithy_runtime_api` instead of `aws-smithy-types`. Like the previous sibling PRs, type aliases for affected pub items are left in `aws_smithy_http` for backwards compatibility. However, due to lack of trait aliases, a trait `CreateUnhandledError` needs to be consumed from `aws_smithy_runtime_api`. This PR also updates existing places that consumed those moved types so they now depend on `aws-smithy-runtime-api` to do so. ## Testing Relied on the existing tests, which ensured no deprecated warnings of using moved types from the old place were issued. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 + .../aws-config/external-types.toml | 2 +- .../src/http_credential_provider.rs | 2 +- .../aws-config/src/imds/client.rs | 6 +- .../aws-config/src/imds/client/error.rs | 2 +- .../aws-config/src/sts/assume_role.rs | 2 +- aws/rust-runtime/aws-http/Cargo.toml | 1 + aws/rust-runtime/aws-http/src/request_id.rs | 2 +- .../aws-inlineable/src/s3_request_id.rs | 4 +- aws/rust-runtime/aws-types/Cargo.toml | 1 - .../kms/tests/integration.rs | 2 +- .../kms/tests/retryable_errors.rs | 2 +- .../s3/tests/alternative-async-runtime.rs | 2 +- .../query-strings-are-correctly-encoded.rs | 2 +- .../s3/tests/service_timeout_overrides.rs | 2 +- .../customize/RequiredCustomizations.kt | 3 +- .../client/FluentClientGenerator.kt | 1 - .../error/OperationErrorGenerator.kt | 2 +- .../rust/codegen/core/smithy/RuntimeType.kt | 6 +- rust-runtime/aws-smithy-http/Cargo.toml | 1 + .../aws-smithy-http/external-types.toml | 1 + rust-runtime/aws-smithy-http/src/body.rs | 4 +- .../aws-smithy-http/src/byte_stream.rs | 4 +- .../aws-smithy-http/src/connection.rs | 50 +- .../src/event_stream/receiver.rs | 4 +- .../src/event_stream/sender.rs | 7 +- rust-runtime/aws-smithy-http/src/result.rs | 705 ++---------------- .../aws-smithy-runtime-api/Cargo.toml | 1 - .../external-types.toml | 1 - .../aws-smithy-runtime-api/src/client.rs | 12 +- .../src/client/connection.rs | 53 ++ .../aws-smithy-runtime-api/src/client/http.rs | 2 +- .../src/client/interceptors/context.rs | 2 +- .../src/client/orchestrator.rs | 2 +- .../src/client/result.rs | 657 ++++++++++++++++ .../src/client/http/connection_poisoning.rs | 2 +- .../src/client/http/hyper_014.rs | 4 +- .../src/client/http/test_util/dvr/replay.rs | 2 +- .../src/client/http/test_util/infallible.rs | 2 +- .../src/client/http/test_util/replay.rs | 2 +- .../src/client/orchestrator.rs | 2 +- .../src/client/orchestrator/operation.rs | 4 +- .../aws-smithy-runtime/src/client/timeout.rs | 4 +- 43 files changed, 840 insertions(+), 740 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/connection.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/result.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 29a71b5528f..fbf7652d2d2 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -498,3 +498,11 @@ message = "`ByteStream::poll_next` is now feature-gated. You can turn on a cargo references = ["smithy-rs#3033", "smithy-rs#3088"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "ysaito1001" + +[[smithy-rs]] +message = """ +The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`. +""" +references = ["smithy-rs#3092", "smithy-rs#3093"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index e1593172a64..69273215edb 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -14,7 +14,7 @@ allowed_external_types = [ "aws_smithy_async::time::TimeSource", "aws_smithy_http::endpoint", "aws_smithy_http::endpoint::error::InvalidEndpointError", - "aws_smithy_http::result::SdkError", + "aws_smithy_runtime_api::client::result::SdkError", "aws_smithy_runtime::client::identity::cache::IdentityCache", "aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder", "aws_smithy_runtime_api::client::dns::ResolveDns", diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index 87687590cdd..01cb6666174 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -12,7 +12,6 @@ use crate::json_credentials::{parse_json_credentials, JsonCredentials, Refreshab use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError}; use aws_credential_types::Credentials; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::classifiers::{ HttpStatusCodeClassifier, TransientErrorClassifier, @@ -22,6 +21,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{Error, InterceptorCo use aws_smithy_runtime_api::client::orchestrator::{ HttpResponse, OrchestratorError, SensitiveOutput, }; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index fd2315a3168..4e37fe4b7df 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -13,8 +13,6 @@ use crate::provider_config::ProviderConfig; use crate::PKG_VERSION; use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_runtime::user_agent::UserAgentInterceptor; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; @@ -25,6 +23,8 @@ use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::{ HttpRequest, OrchestratorError, SensitiveOutput, }; +use aws_smithy_runtime_api::client::result::ConnectorError; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::retries::classifiers::{ ClassifyRetry, RetryAction, SharedRetryClassifier, }; @@ -582,7 +582,6 @@ pub(crate) mod test { use crate::provider_config::ProviderConfig; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep}; - use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime::client::http::test_util::{ capture_request, ReplayEvent, StaticReplayClient, }; @@ -593,6 +592,7 @@ pub(crate) mod test { use aws_smithy_runtime_api::client::orchestrator::{ HttpRequest, HttpResponse, OrchestratorError, }; + use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index 4b5aacb8946..8d2863a6aed 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -6,8 +6,8 @@ //! Error types for [`ImdsClient`](crate::imds::client::Client) use aws_smithy_http::endpoint::error::InvalidEndpointError; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::body::SdkBody; use std::error::Error; use std::fmt; diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 293951b37b0..e2449481113 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -12,8 +12,8 @@ use aws_sdk_sts::operation::assume_role::builders::AssumeRoleFluentBuilder; use aws_sdk_sts::operation::assume_role::AssumeRoleError; use aws_sdk_sts::types::PolicyDescriptorType; use aws_sdk_sts::Client as StsClient; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::identity::IdentityCache; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::region::Region; use aws_types::SdkConfig; diff --git a/aws/rust-runtime/aws-http/Cargo.toml b/aws/rust-runtime/aws-http/Cargo.toml index 9c6e1eb37e8..86f37c72f01 100644 --- a/aws/rust-runtime/aws-http/Cargo.toml +++ b/aws/rust-runtime/aws-http/Cargo.toml @@ -9,6 +9,7 @@ repository = "https://github.com/awslabs/smithy-rs" [dependencies] aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-types = { path = "../aws-types" } bytes = "1.1" diff --git a/aws/rust-runtime/aws-http/src/request_id.rs b/aws/rust-runtime/aws-http/src/request_id.rs index a7b429169fb..2f337fa6958 100644 --- a/aws/rust-runtime/aws-http/src/request_id.rs +++ b/aws/rust-runtime/aws-http/src/request_id.rs @@ -4,7 +4,7 @@ */ use aws_smithy_http::http::HttpHeaders; -use aws_smithy_http::result::SdkError; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 93d2d850fe5..2d6c31ad94e 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -4,7 +4,7 @@ */ use aws_smithy_http::http::HttpHeaders; -use aws_smithy_http::result::SdkError; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; @@ -94,7 +94,7 @@ fn extract_extended_request_id(headers: &HeaderMap) -> Option<&str> #[cfg(test)] mod test { use super::*; - use aws_smithy_http::result::SdkError; + use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::body::SdkBody; use http::Response; diff --git a/aws/rust-runtime/aws-types/Cargo.toml b/aws/rust-runtime/aws-types/Cargo.toml index 3c143291e03..0f303280834 100644 --- a/aws/rust-runtime/aws-types/Cargo.toml +++ b/aws/rust-runtime/aws-types/Cargo.toml @@ -17,7 +17,6 @@ aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", optional = true } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } -aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } tracing = "0.1" http = "0.2.6" # cargo does not support optional test dependencies, so to completely disable rustls diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index 1227eb24bc5..ed534f61bdd 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -5,8 +5,8 @@ use aws_sdk_kms as kms; use aws_sdk_kms::operation::RequestId; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::body::SdkBody; use http::header::AUTHORIZATION; use http::Uri; diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index 5e603d28275..dc1a633a84f 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -6,10 +6,10 @@ use aws_credential_types::Credentials; use aws_runtime::retries::classifiers::AwsErrorCodeClassifier; use aws_sdk_kms as kms; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::http::test_util::infallible_client_fn; use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; use bytes::Bytes; use kms::operation::create_alias::CreateAliasError; diff --git a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs index 7aee8af9045..08f3765928e 100644 --- a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs +++ b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs @@ -13,9 +13,9 @@ use aws_sdk_s3::types::{ use aws_sdk_s3::{Client, Config}; use aws_smithy_async::assert_elapsed; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime::client::http::test_util::NeverClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::timeout::TimeoutConfig; use std::fmt::Debug; diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 528f9f1bbdf..2e9f8bcaffd 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -60,7 +60,7 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { #[ignore] async fn test_query_strings_are_correctly_encoded() { use aws_sdk_s3::operation::list_objects_v2::ListObjectsV2Error; - use aws_smithy_http::result::SdkError; + use aws_smithy_runtime_api::client::result::SdkError; tracing_subscriber::fmt::init(); let config = aws_config::load_from_env().await; diff --git a/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs index ba014b0d7f9..9e4808118cb 100644 --- a/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs +++ b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs @@ -6,7 +6,7 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; -use aws_smithy_http::result::SdkError; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; use aws_types::SdkConfig; diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 0c2bc8ef936..63c87b39ec9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -92,13 +92,14 @@ class RequiredCustomizations : ClientCodegenDecorator { rustTemplate( """ /// Error type returned by the client. - pub use #{SdkError}; + pub type SdkError = #{SdkError}; pub use #{DisplayErrorContext}; pub use #{ProvideErrorMetadata}; """, "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(rc), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 9d2bc151e78..07c58e0ec3d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -264,7 +264,6 @@ class FluentClientGenerator( "OperationError" to errorType, "OperationOutput" to outputType, "SdkError" to RuntimeType.sdkError(runtimeConfig), - "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt index 8e17d5bd9d8..e00195a6cc8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt @@ -54,7 +54,7 @@ class OperationErrorGenerator( private val runtimeConfig = symbolProvider.config.runtimeConfig private val errorMetadata = errorMetadata(symbolProvider.config.runtimeConfig) private val createUnhandledError = - RuntimeType.smithyHttp(runtimeConfig).resolve("result::CreateUnhandledError") + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::result::CreateUnhandledError") private fun operationErrors(): List = (operationOrEventStream as OperationShape).operationErrors(model).map { it.asStructureShape().get() } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index f728db76c5b..8f33e70753b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -357,6 +357,9 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun boxError(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("box_error::BoxError") + fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType = + smithyRuntimeApi(runtimeConfig).resolve("client::result::SdkError") + fun intercept(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::Intercept") @@ -436,9 +439,6 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun queryFormat(runtimeConfig: RuntimeConfig, func: String) = smithyHttp(runtimeConfig).resolve("query::$func") fun sdkBody(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("body::SdkBody") - fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("result::SdkError") - fun sdkSuccess(runtimeConfig: RuntimeConfig): RuntimeType = - smithyHttp(runtimeConfig).resolve("result::SdkSuccess") fun parseTimestampFormat( codegenTarget: CodegenTarget, diff --git a/rust-runtime/aws-smithy-http/Cargo.toml b/rust-runtime/aws-smithy-http/Cargo.toml index e8bbb1e61ff..5aeb1c18e54 100644 --- a/rust-runtime/aws-smithy-http/Cargo.toml +++ b/rust-runtime/aws-smithy-http/Cargo.toml @@ -16,6 +16,7 @@ rt-tokio = ["aws-smithy-types/rt-tokio"] [dependencies] aws-smithy-eventstream = { path = "../aws-smithy-eventstream", optional = true } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["byte-stream-poll-next", "http-body-0-4-x"] } bytes = "1" bytes-utils = "0.1" diff --git a/rust-runtime/aws-smithy-http/external-types.toml b/rust-runtime/aws-smithy-http/external-types.toml index cec3ff8a306..06c1e82b0f9 100644 --- a/rust-runtime/aws-smithy-http/external-types.toml +++ b/rust-runtime/aws-smithy-http/external-types.toml @@ -1,4 +1,5 @@ allowed_external_types = [ + "aws_smithy_runtime_api::*", "aws_smithy_types::*", "bytes::bytes::Bytes", "http::error::Error", diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-http/src/body.rs index 05e9776ccce..efcc29b7125 100644 --- a/rust-runtime/aws-smithy-http/src/body.rs +++ b/rust-runtime/aws-smithy-http/src/body.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -//TODO(runtimeCratesVersioningCleanup): Re-point those who use the deprecated type aliases to -// directly depend on `aws_smithy_types` and remove this module. +//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type aliases for at least +// one release since 0.56.1 and then remove this module. //! Types for representing the body of an HTTP request or response diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-http/src/byte_stream.rs index 4067ec517dc..06da29636b2 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-http/src/byte_stream.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -//TODO(runtimeCratesVersioningCleanup): Re-point those who use the deprecated type aliases to -// directly depend on `aws_smithy_types` and remove this module. +//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type aliases for at least +// one release since 0.56.1 and then remove this module. //! ByteStream Abstractions diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs index 99ae574232b..e8219a0b60c 100644 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ b/rust-runtime/aws-smithy-http/src/connection.rs @@ -3,51 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! Types related to connection monitoring and management. +//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type alias for at least +// one release since 0.56.1 and then remove this module. -use std::fmt::{Debug, Formatter}; -use std::net::SocketAddr; -use std::sync::Arc; +//! Types related to connection monitoring and management. /// Metadata that tracks the state of an active connection. -#[derive(Clone)] -pub struct ConnectionMetadata { - is_proxied: bool, - remote_addr: Option, - poison_fn: Arc, -} - -impl ConnectionMetadata { - /// Poison this connection, ensuring that it won't be reused. - pub fn poison(&self) { - tracing::info!("smithy connection was poisoned"); - (self.poison_fn)() - } - - /// Create a new [`ConnectionMetadata`]. - pub fn new( - is_proxied: bool, - remote_addr: Option, - poison: impl Fn() + Send + Sync + 'static, - ) -> Self { - Self { - is_proxied, - remote_addr, - poison_fn: Arc::new(poison), - } - } - - /// Get the remote address for this connection, if one is set. - pub fn remote_addr(&self) -> Option { - self.remote_addr - } -} - -impl Debug for ConnectionMetadata { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("SmithyConnection") - .field("is_proxied", &self.is_proxied) - .field("remote_addr", &self.remote_addr) - .finish() - } -} +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::connection::ConnectionMetadata`.")] +pub type ConnectionMetadata = aws_smithy_runtime_api::client::connection::ConnectionMetadata; diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index dd9b9cd021e..823ac6f516a 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::result::{ConnectorError, SdkError}; use aws_smithy_eventstream::frame::{ DecodedFrame, Message, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage, }; +use aws_smithy_runtime_api::client::result::{ConnectorError, SdkError}; use aws_smithy_types::body::SdkBody; use bytes::Buf; use bytes::Bytes; @@ -276,9 +276,9 @@ impl Receiver { #[cfg(test)] mod tests { use super::{Receiver, UnmarshallMessage}; - use crate::result::SdkError; use aws_smithy_eventstream::error::Error as EventStreamError; use aws_smithy_eventstream::frame::{Header, HeaderValue, Message, UnmarshalledMessage}; + use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::body::SdkBody; use bytes::Bytes; use hyper::body::Body; diff --git a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs index d19690e7272..aa35b6cdee0 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::result::SdkError; use aws_smithy_eventstream::frame::{MarshallMessage, SignMessage}; +use aws_smithy_runtime_api::client::result::SdkError; use bytes::Bytes; use futures_core::Stream; use std::error::Error as StdError; @@ -140,7 +140,8 @@ impl MessageStreamAdapter { } impl Stream for MessageStreamAdapter { - type Item = Result>; + type Item = + Result>; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { match self.stream.as_mut().poll_next(cx) { @@ -195,12 +196,12 @@ impl Stream for MessageStreamAdapter; +//! Types for [`error`](aws_smithy_runtime_api::client::result::SdkError) responses. /// Builders for `SdkError` variant context. pub mod builders { - use super::*; - - macro_rules! source_only_error_builder { - ($errorName:ident, $builderName:ident, $sourceType:ident) => { - #[doc = concat!("Builder for [`", stringify!($errorName), "`](super::", stringify!($errorName), ").")] - #[derive(Debug, Default)] - pub struct $builderName { - source: Option<$sourceType>, - } - - impl $builderName { - #[doc = "Creates a new builder."] - pub fn new() -> Self { Default::default() } - - #[doc = "Sets the error source."] - pub fn source(mut self, source: impl Into<$sourceType>) -> Self { - self.source = Some(source.into()); - self - } - - #[doc = "Sets the error source."] - pub fn set_source(&mut self, source: Option<$sourceType>) -> &mut Self { - self.source = source; - self - } - - #[doc = "Builds the error context."] - pub fn build(self) -> $errorName { - $errorName { source: self.source.expect("source is required") } - } - } - }; - } - - source_only_error_builder!(ConstructionFailure, ConstructionFailureBuilder, BoxError); - source_only_error_builder!(TimeoutError, TimeoutErrorBuilder, BoxError); - source_only_error_builder!(DispatchFailure, DispatchFailureBuilder, ConnectorError); - - /// Builder for [`ResponseError`](super::ResponseError). - #[derive(Debug)] - pub struct ResponseErrorBuilder { - source: Option, - raw: Option, - } - - impl Default for ResponseErrorBuilder { - fn default() -> Self { - Self { - source: None, - raw: None, - } - } - } - - impl ResponseErrorBuilder { - /// Creates a new builder. - pub fn new() -> Self { - Default::default() - } - - /// Sets the error source. - pub fn source(mut self, source: impl Into) -> Self { - self.source = Some(source.into()); - self - } - - /// Sets the error source. - pub fn set_source(&mut self, source: Option) -> &mut Self { - self.source = source; - self - } - - /// Sets the raw response. - pub fn raw(mut self, raw: R) -> Self { - self.raw = Some(raw); - self - } - - /// Sets the raw response. - pub fn set_raw(&mut self, raw: Option) -> &mut Self { - self.raw = raw; - self - } - - /// Builds the error context. - pub fn build(self) -> ResponseError { - ResponseError { - source: self.source.expect("source is required"), - raw: self.raw.expect("a raw response is required"), - } - } - } - - /// Builder for [`ServiceError`](super::ServiceError). - #[derive(Debug)] - pub struct ServiceErrorBuilder { - source: Option, - raw: Option, - } - - impl Default for ServiceErrorBuilder { - fn default() -> Self { - Self { - source: None, - raw: None, - } - } - } - - impl ServiceErrorBuilder { - /// Creates a new builder. - pub fn new() -> Self { - Default::default() - } - - /// Sets the error source. - pub fn source(mut self, source: impl Into) -> Self { - self.source = Some(source.into()); - self - } - - /// Sets the error source. - pub fn set_source(&mut self, source: Option) -> &mut Self { - self.source = source; - self - } - - /// Sets the raw response. - pub fn raw(mut self, raw: R) -> Self { - self.raw = Some(raw); - self - } - - /// Sets the raw response. - pub fn set_raw(&mut self, raw: Option) -> &mut Self { - self.raw = raw; - self - } - - /// Builds the error context. - pub fn build(self) -> ServiceError { - ServiceError { - source: self.source.expect("source is required"), - raw: self.raw.expect("a raw response is required"), - } - } - } -} - -/// Error context for [`SdkError::ConstructionFailure`] -#[derive(Debug)] -pub struct ConstructionFailure { - source: BoxError, -} - -impl ConstructionFailure { - /// Creates a builder for this error context type. - pub fn builder() -> builders::ConstructionFailureBuilder { - builders::ConstructionFailureBuilder::new() - } -} - -/// Error context for [`SdkError::TimeoutError`] -#[derive(Debug)] -pub struct TimeoutError { - source: BoxError, -} - -impl TimeoutError { - /// Creates a builder for this error context type. - pub fn builder() -> builders::TimeoutErrorBuilder { - builders::TimeoutErrorBuilder::new() - } -} - -/// Error context for [`SdkError::DispatchFailure`] -#[derive(Debug)] -pub struct DispatchFailure { - source: ConnectorError, -} - -impl DispatchFailure { - /// Creates a builder for this error context type. - pub fn builder() -> builders::DispatchFailureBuilder { - builders::DispatchFailureBuilder::new() - } - - /// Returns true if the error is an IO error - pub fn is_io(&self) -> bool { - self.source.is_io() - } - - /// Returns true if the error is an timeout error - pub fn is_timeout(&self) -> bool { - self.source.is_timeout() - } - - /// Returns true if the error is a user-caused error (e.g., invalid HTTP request) - pub fn is_user(&self) -> bool { - self.source.is_user() - } - - /// Returns true if the error is an unclassified error. - pub fn is_other(&self) -> bool { - self.source.is_other() - } - - /// Returns the optional error kind associated with an unclassified error - pub fn as_other(&self) -> Option { - self.source.as_other() - } - - /// Returns the inner error if it is a connector error - pub fn as_connector_error(&self) -> Option<&ConnectorError> { - Some(&self.source) - } -} - -/// Error context for [`SdkError::ResponseError`] -#[derive(Debug)] -pub struct ResponseError { - /// Error encountered while parsing the response - source: BoxError, - /// Raw response that was available - raw: R, -} - -impl ResponseError { - /// Creates a builder for this error context type. - pub fn builder() -> builders::ResponseErrorBuilder { - builders::ResponseErrorBuilder::new() - } - - /// Returns a reference to the raw response - pub fn raw(&self) -> &R { - &self.raw - } - - /// Converts this error context into the raw response - pub fn into_raw(self) -> R { - self.raw - } -} - -/// Error context for [`SdkError::ServiceError`] -#[derive(Debug)] -pub struct ServiceError { - /// Modeled service error - source: E, - /// Raw response from the service - raw: R, -} - -impl ServiceError { - /// Creates a builder for this error context type. - pub fn builder() -> builders::ServiceErrorBuilder { - builders::ServiceErrorBuilder::new() - } - - /// Returns the underlying error of type `E` - pub fn err(&self) -> &E { - &self.source - } - - /// Converts this error context into the underlying error `E` - pub fn into_err(self) -> E { - self.source - } - - /// Returns a reference to the raw response - pub fn raw(&self) -> &R { - &self.raw - } - - /// Converts this error context into the raw response - pub fn into_raw(self) -> R { - self.raw - } -} - -/// Constructs the unhandled variant of a code generated error. -/// -/// This trait exists so that [`SdkError::into_service_error`] can be infallible. -pub trait CreateUnhandledError { - /// Creates an unhandled error variant with the given `source` and error metadata. - fn create_unhandled_error( - source: Box, - meta: Option, - ) -> Self; -} + /// Builder for [`ConstructionFailure`](aws_smithy_runtime_api::client::result::ConstructionFailure). + #[deprecated( + note = "Moved to `aws_smithy_runtime_api::client::result::builders::ConstructionFailureBuilder`." + )] + pub type ConstructionFailureBuilder = + aws_smithy_runtime_api::client::result::builders::ConstructionFailureBuilder; + + /// Builder for [`TimeoutError`](aws_smithy_runtime_api::client::result::TimeoutError). + #[deprecated( + note = "Moved to `aws_smithy_runtime_api::client::result::builders::TimeoutErrorBuilder`." + )] + pub type TimeoutErrorBuilder = + aws_smithy_runtime_api::client::result::builders::TimeoutErrorBuilder; + + /// Builder for [`DispatchFailure`](aws_smithy_runtime_api::client::result::DispatchFailure). + #[deprecated( + note = "Moved to `aws_smithy_runtime_api::client::result::builders::DispatchFailureBuilder`." + )] + pub type DispatchFailureBuilder = + aws_smithy_runtime_api::client::result::builders::DispatchFailureBuilder; + + /// Builder for [`ResponseError`](aws_smithy_runtime_api::client::result::ResponseError). + #[deprecated( + note = "Moved to `aws_smithy_runtime_api::client::result::builders::ResponseErrorBuilder`." + )] + pub type ResponseErrorBuilder = + aws_smithy_runtime_api::client::result::builders::ResponseErrorBuilder; + + /// Builder for [`ServiceError`](aws_smithy_runtime_api::client::result::ServiceError). + #[deprecated( + note = "Moved to `aws_smithy_runtime_api::client::result::builders::ServiceErrorBuilder`." + )] + pub type ServiceErrorBuilder = + aws_smithy_runtime_api::client::result::builders::ServiceErrorBuilder; +} + +/// Error context for [`aws_smithy_runtime_api::client::result::ConstructionFailure`] +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ConstructionFailure`.")] +pub type ConstructionFailure = aws_smithy_runtime_api::client::result::ConstructionFailure; + +/// Error context for [`aws_smithy_runtime_api::client::result::TimeoutError`] +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::TimeoutError`.")] +pub type TimeoutError = aws_smithy_runtime_api::client::result::TimeoutError; + +/// Error context for [`aws_smithy_runtime_api::client::result::DispatchFailure`] +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::DispatchFailure`.")] +pub type DispatchFailure = aws_smithy_runtime_api::client::result::DispatchFailure; + +/// Error context for [`aws_smithy_runtime_api::client::result::ResponseError`] +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ResponseError`.")] +pub type ResponseError = aws_smithy_runtime_api::client::result::ResponseError; /// Failed SDK Result -/// -/// When logging an error from the SDK, it is recommended that you either wrap the error in -/// [`DisplayErrorContext`](aws_smithy_types::error::display::DisplayErrorContext), use another -/// error reporter library that visits the error's cause/source chain, or call -/// [`Error::source`](std::error::Error::source) for more details about the underlying cause. -#[non_exhaustive] -#[derive(Debug)] -pub enum SdkError> { - /// The request failed during construction. It was not dispatched over the network. - ConstructionFailure(ConstructionFailure), - - /// The request failed due to a timeout. The request MAY have been sent and received. - TimeoutError(TimeoutError), - - /// The request failed during dispatch. An HTTP response was not received. The request MAY - /// have been sent. - DispatchFailure(DispatchFailure), - - /// A response was received but it was not parseable according the the protocol (for example - /// the server hung up without sending a complete response) - ResponseError(ResponseError), - - /// An error response was received from the service - ServiceError(ServiceError), -} - -impl SdkError { - /// Construct a `SdkError` for a construction failure - pub fn construction_failure(source: impl Into) -> Self { - Self::ConstructionFailure(ConstructionFailure { - source: source.into(), - }) - } - - /// Construct a `SdkError` for a timeout - pub fn timeout_error(source: impl Into) -> Self { - Self::TimeoutError(TimeoutError { - source: source.into(), - }) - } - - /// Construct a `SdkError` for a dispatch failure with a [`ConnectorError`] - pub fn dispatch_failure(source: ConnectorError) -> Self { - Self::DispatchFailure(DispatchFailure { source }) - } - - /// Construct a `SdkError` for a response error - pub fn response_error(source: impl Into, raw: R) -> Self { - Self::ResponseError(ResponseError { - source: source.into(), - raw, - }) - } - - /// Construct a `SdkError` for a service failure - pub fn service_error(source: E, raw: R) -> Self { - Self::ServiceError(ServiceError { source, raw }) - } - - /// Returns the underlying service error `E` if there is one - /// - /// If the `SdkError` is not a `ServiceError` (for example, the error is a network timeout), - /// then it will be converted into an unhandled variant of `E`. This makes it easy to match - /// on the service's error response while simultaneously bubbling up transient failures. - /// For example, handling the `NoSuchKey` error for S3's `GetObject` operation may look as - /// follows: - /// - /// ```no_run - /// # use aws_smithy_http::result::{SdkError, CreateUnhandledError}; - /// # #[derive(Debug)] enum GetObjectError { NoSuchKey(()), Other(()) } - /// # impl std::fmt::Display for GetObjectError { - /// # fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { unimplemented!() } - /// # } - /// # impl std::error::Error for GetObjectError {} - /// # impl CreateUnhandledError for GetObjectError { - /// # fn create_unhandled_error( - /// # _: Box, - /// # _: Option, - /// # ) -> Self { unimplemented!() } - /// # } - /// # fn example() -> Result<(), GetObjectError> { - /// # let sdk_err = SdkError::service_error(GetObjectError::NoSuchKey(()), ()); - /// match sdk_err.into_service_error() { - /// GetObjectError::NoSuchKey(_) => { - /// // handle NoSuchKey - /// } - /// err @ _ => return Err(err), - /// } - /// # Ok(()) - /// # } - /// ``` - pub fn into_service_error(self) -> E - where - E: std::error::Error + Send + Sync + CreateUnhandledError + 'static, - R: Debug + Send + Sync + 'static, - { - match self { - Self::ServiceError(context) => context.source, - _ => E::create_unhandled_error(self.into(), None), - } - } - - /// Converts this error into its error source. - /// - /// If there is no error source, then `Err(Self)` is returned. - pub fn into_source(self) -> Result, Self> - where - E: std::error::Error + Send + Sync + 'static, - { - use SdkError::*; - match self { - ConstructionFailure(context) => Ok(context.source), - TimeoutError(context) => Ok(context.source), - ResponseError(context) => Ok(context.source), - DispatchFailure(context) => Ok(context.source.into()), - ServiceError(context) => Ok(context.source.into()), - } - } - - /// Return a reference to this error's raw response, if it contains one. Otherwise, return `None`. - pub fn raw_response(&self) -> Option<&R> { - match self { - Self::ServiceError(inner) => Some(inner.raw()), - Self::ResponseError(inner) => Some(inner.raw()), - _ => None, - } - } - - /// Maps the service error type in `SdkError::ServiceError` - #[doc(hidden)] - pub fn map_service_error(self, map: impl FnOnce(E) -> E2) -> SdkError { - match self { - Self::ServiceError(context) => SdkError::::ServiceError(ServiceError { - source: map(context.source), - raw: context.raw, - }), - Self::ConstructionFailure(context) => SdkError::::ConstructionFailure(context), - Self::DispatchFailure(context) => SdkError::::DispatchFailure(context), - Self::ResponseError(context) => SdkError::::ResponseError(context), - Self::TimeoutError(context) => SdkError::::TimeoutError(context), - } - } -} - -impl Display for SdkError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - SdkError::ConstructionFailure(_) => write!(f, "failed to construct request"), - SdkError::TimeoutError(_) => write!(f, "request has timed out"), - SdkError::DispatchFailure(_) => write!(f, "dispatch failure"), - SdkError::ResponseError(_) => write!(f, "response error"), - SdkError::ServiceError(_) => write!(f, "service error"), - } - } -} - -impl Error for SdkError -where - E: Error + 'static, - R: Debug, -{ - fn source(&self) -> Option<&(dyn Error + 'static)> { - use SdkError::*; - match self { - ConstructionFailure(context) => Some(context.source.as_ref()), - TimeoutError(context) => Some(context.source.as_ref()), - ResponseError(context) => Some(context.source.as_ref()), - DispatchFailure(context) => Some(&context.source), - ServiceError(context) => Some(&context.source), - } - } -} - -impl ProvideErrorMetadata for SdkError -where - E: ProvideErrorMetadata, -{ - fn meta(&self) -> &aws_smithy_types::Error { - match self { - Self::ConstructionFailure(_) => &EMPTY_ERROR_METADATA, - Self::TimeoutError(_) => &EMPTY_ERROR_METADATA, - Self::DispatchFailure(_) => &EMPTY_ERROR_METADATA, - Self::ResponseError(_) => &EMPTY_ERROR_METADATA, - Self::ServiceError(err) => err.source.meta(), - } - } -} - -#[derive(Debug)] -enum ConnectorErrorKind { - /// A timeout occurred while processing the request - Timeout, - - /// A user-caused error (e.g., invalid HTTP request) - User, +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ServiceError`.")] +pub type ServiceError = aws_smithy_runtime_api::client::result::ServiceError; - /// Socket/IO error - Io, - - /// An unclassified Error with an explicit error kind - Other(Option), -} +/// Failed SDK Result +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::SdkError`.")] +pub type SdkError = aws_smithy_runtime_api::client::result::SdkError; /// Error from the underlying Connector -/// -/// Connector exists to attach a `ConnectorErrorKind` to what would otherwise be an opaque `Box` -/// that comes off a potentially generic or dynamic connector. -/// The attached `kind` is used to determine what retry behavior should occur (if any) based on the -/// connector error. -#[derive(Debug)] -pub struct ConnectorError { - kind: ConnectorErrorKind, - source: BoxError, - connection: ConnectionStatus, -} - -#[non_exhaustive] -#[derive(Debug)] -pub(crate) enum ConnectionStatus { - /// This request was never connected to the remote - /// - /// This indicates the failure was during connection establishment - NeverConnected, - - /// It is unknown whether a connection was established - Unknown, - - /// The request connected to the remote prior to failure - Connected(ConnectionMetadata), -} - -impl Display for ConnectorError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self.kind { - ConnectorErrorKind::Timeout => write!(f, "timeout"), - ConnectorErrorKind::User => write!(f, "user error"), - ConnectorErrorKind::Io => write!(f, "io error"), - ConnectorErrorKind::Other(_) => write!(f, "other"), - } - } -} - -impl Error for ConnectorError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - Some(self.source.as_ref()) - } -} - -impl ConnectorError { - /// Construct a [`ConnectorError`] from an error caused by a timeout - /// - /// Timeout errors are typically retried on a new connection. - pub fn timeout(source: BoxError) -> Self { - Self { - kind: ConnectorErrorKind::Timeout, - source, - connection: ConnectionStatus::Unknown, - } - } - - /// Include connection information along with this error - pub fn with_connection(mut self, info: ConnectionMetadata) -> Self { - self.connection = ConnectionStatus::Connected(info); - self - } - - /// Set the connection status on this error to report that a connection was never established - pub fn never_connected(mut self) -> Self { - self.connection = ConnectionStatus::NeverConnected; - self - } - - /// Construct a [`ConnectorError`] from an error caused by the user (e.g. invalid HTTP request) - pub fn user(source: BoxError) -> Self { - Self { - kind: ConnectorErrorKind::User, - source, - connection: ConnectionStatus::Unknown, - } - } - - /// Construct a [`ConnectorError`] from an IO related error (e.g. socket hangup) - pub fn io(source: BoxError) -> Self { - Self { - kind: ConnectorErrorKind::Io, - source, - connection: ConnectionStatus::Unknown, - } - } - - /// Construct a [`ConnectorError`] from an different unclassified error. - /// - /// Optionally, an explicit `Kind` may be passed. - pub fn other(source: BoxError, kind: Option) -> Self { - Self { - source, - kind: ConnectorErrorKind::Other(kind), - connection: ConnectionStatus::Unknown, - } - } - - /// Returns true if the error is an IO error - pub fn is_io(&self) -> bool { - matches!(self.kind, ConnectorErrorKind::Io) - } - - /// Returns true if the error is an timeout error - pub fn is_timeout(&self) -> bool { - matches!(self.kind, ConnectorErrorKind::Timeout) - } - - /// Returns true if the error is a user-caused error (e.g., invalid HTTP request) - pub fn is_user(&self) -> bool { - matches!(self.kind, ConnectorErrorKind::User) - } - - /// Returns true if the error is an unclassified error. - pub fn is_other(&self) -> bool { - matches!(self.kind, ConnectorErrorKind::Other(..)) - } - - /// Returns the optional error kind associated with an unclassified error - pub fn as_other(&self) -> Option { - match &self.kind { - ConnectorErrorKind::Other(ek) => *ek, - _ => None, - } - } - - /// Grants ownership of this error's source. - pub fn into_source(self) -> BoxError { - self.source - } - - /// Returns metadata about the connection - /// - /// If a connection was established and provided by the internal connector, a connection will - /// be returned. - pub fn connection_metadata(&self) -> Option<&ConnectionMetadata> { - match &self.connection { - ConnectionStatus::NeverConnected => None, - ConnectionStatus::Unknown => None, - ConnectionStatus::Connected(conn) => Some(conn), - } - } -} +#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ConnectorError`.")] +pub type ConnectorError = aws_smithy_runtime_api::client::result::ConnectorError; diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 58ae350e687..51326dda6ea 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -17,7 +17,6 @@ test-util = ["aws-smithy-types/test-util"] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } -aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-types = { path = "../aws-smithy-types" } bytes = "1" http = "0.2.9" diff --git a/rust-runtime/aws-smithy-runtime-api/external-types.toml b/rust-runtime/aws-smithy-runtime-api/external-types.toml index 91e6e35f0c3..347dff86de5 100644 --- a/rust-runtime/aws-smithy-runtime-api/external-types.toml +++ b/rust-runtime/aws-smithy-runtime-api/external-types.toml @@ -1,7 +1,6 @@ allowed_external_types = [ "aws_smithy_async::*", "aws_smithy_types::*", - "aws_smithy_http::*", "bytes::bytes::Bytes", diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index e5151b84d6b..bb4c4d1957a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -91,10 +91,16 @@ macro_rules! new_type_future { }; } +pub mod auth; + +pub mod connection; + pub mod dns; pub mod endpoint; +pub mod http; + /// Smithy identity used by auth and signing. pub mod identity; @@ -102,14 +108,12 @@ pub mod interceptors; pub mod orchestrator; +pub mod result; + pub mod retries; pub mod runtime_components; pub mod runtime_plugin; -pub mod auth; - -pub mod http; - pub mod ser_de; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs new file mode 100644 index 00000000000..99ae574232b --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs @@ -0,0 +1,53 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types related to connection monitoring and management. + +use std::fmt::{Debug, Formatter}; +use std::net::SocketAddr; +use std::sync::Arc; + +/// Metadata that tracks the state of an active connection. +#[derive(Clone)] +pub struct ConnectionMetadata { + is_proxied: bool, + remote_addr: Option, + poison_fn: Arc, +} + +impl ConnectionMetadata { + /// Poison this connection, ensuring that it won't be reused. + pub fn poison(&self) { + tracing::info!("smithy connection was poisoned"); + (self.poison_fn)() + } + + /// Create a new [`ConnectionMetadata`]. + pub fn new( + is_proxied: bool, + remote_addr: Option, + poison: impl Fn() + Send + Sync + 'static, + ) -> Self { + Self { + is_proxied, + remote_addr, + poison_fn: Arc::new(poison), + } + } + + /// Get the remote address for this connection, if one is set. + pub fn remote_addr(&self) -> Option { + self.remote_addr + } +} + +impl Debug for ConnectionMetadata { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SmithyConnection") + .field("is_proxied", &self.is_proxied) + .field("remote_addr", &self.remote_addr) + .finish() + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index 321e70198d8..f6e3f03c804 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -54,10 +54,10 @@ pub mod request; pub mod response; use crate::client::orchestrator::{HttpRequest, HttpResponse}; +use crate::client::result::ConnectorError; use crate::client::runtime_components::sealed::ValidateConfig; use crate::client::runtime_components::RuntimeComponents; use crate::impl_shared_conversions; -use aws_smithy_http::result::ConnectorError; use std::fmt; use std::sync::Arc; use std::time::Duration; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index 051f3ebf588..c0599818d9a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -28,7 +28,7 @@ //! Use the [`ConfigBag`] instead. use crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; -use aws_smithy_http::result::SdkError; +use crate::client::result::SdkError; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; use phase::Phase; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 350c399e1ec..4282534a4c8 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -20,7 +20,7 @@ use crate::box_error::BoxError; use crate::client::interceptors::context::phase::Phase; use crate::client::interceptors::context::Error; use crate::client::interceptors::InterceptorError; -use aws_smithy_http::result::{ConnectorError, SdkError}; +use crate::client::result::{ConnectorError, SdkError}; use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use bytes::Bytes; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs new file mode 100644 index 00000000000..4d9182a073e --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs @@ -0,0 +1,657 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types for [error](SdkError) responses. + +use crate::client::connection::ConnectionMetadata; +use aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA}; +use aws_smithy_types::error::ErrorMetadata; +use aws_smithy_types::retry::ErrorKind; +use std::error::Error; +use std::fmt; +use std::fmt::{Debug, Display, Formatter}; + +type BoxError = Box; + +/// Builders for `SdkError` variant context. +pub mod builders { + use super::*; + + macro_rules! source_only_error_builder { + ($errorName:ident, $builderName:ident, $sourceType:ident) => { + #[doc = concat!("Builder for [`", stringify!($errorName), "`](super::", stringify!($errorName), ").")] + #[derive(Debug, Default)] + pub struct $builderName { + source: Option<$sourceType>, + } + + impl $builderName { + #[doc = "Creates a new builder."] + pub fn new() -> Self { Default::default() } + + #[doc = "Sets the error source."] + pub fn source(mut self, source: impl Into<$sourceType>) -> Self { + self.source = Some(source.into()); + self + } + + #[doc = "Sets the error source."] + pub fn set_source(&mut self, source: Option<$sourceType>) -> &mut Self { + self.source = source; + self + } + + #[doc = "Builds the error context."] + pub fn build(self) -> $errorName { + $errorName { source: self.source.expect("source is required") } + } + } + }; + } + + source_only_error_builder!(ConstructionFailure, ConstructionFailureBuilder, BoxError); + source_only_error_builder!(TimeoutError, TimeoutErrorBuilder, BoxError); + source_only_error_builder!(DispatchFailure, DispatchFailureBuilder, ConnectorError); + + /// Builder for [`ResponseError`](super::ResponseError). + #[derive(Debug)] + pub struct ResponseErrorBuilder { + source: Option, + raw: Option, + } + + impl Default for ResponseErrorBuilder { + fn default() -> Self { + Self { + source: None, + raw: None, + } + } + } + + impl ResponseErrorBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Default::default() + } + + /// Sets the error source. + pub fn source(mut self, source: impl Into) -> Self { + self.source = Some(source.into()); + self + } + + /// Sets the error source. + pub fn set_source(&mut self, source: Option) -> &mut Self { + self.source = source; + self + } + + /// Sets the raw response. + pub fn raw(mut self, raw: R) -> Self { + self.raw = Some(raw); + self + } + + /// Sets the raw response. + pub fn set_raw(&mut self, raw: Option) -> &mut Self { + self.raw = raw; + self + } + + /// Builds the error context. + pub fn build(self) -> ResponseError { + ResponseError { + source: self.source.expect("source is required"), + raw: self.raw.expect("a raw response is required"), + } + } + } + + /// Builder for [`ServiceError`](super::ServiceError). + #[derive(Debug)] + pub struct ServiceErrorBuilder { + source: Option, + raw: Option, + } + + impl Default for ServiceErrorBuilder { + fn default() -> Self { + Self { + source: None, + raw: None, + } + } + } + + impl ServiceErrorBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Default::default() + } + + /// Sets the error source. + pub fn source(mut self, source: impl Into) -> Self { + self.source = Some(source.into()); + self + } + + /// Sets the error source. + pub fn set_source(&mut self, source: Option) -> &mut Self { + self.source = source; + self + } + + /// Sets the raw response. + pub fn raw(mut self, raw: R) -> Self { + self.raw = Some(raw); + self + } + + /// Sets the raw response. + pub fn set_raw(&mut self, raw: Option) -> &mut Self { + self.raw = raw; + self + } + + /// Builds the error context. + pub fn build(self) -> ServiceError { + ServiceError { + source: self.source.expect("source is required"), + raw: self.raw.expect("a raw response is required"), + } + } + } +} + +/// Error context for [`SdkError::ConstructionFailure`] +#[derive(Debug)] +pub struct ConstructionFailure { + source: BoxError, +} + +impl ConstructionFailure { + /// Creates a builder for this error context type. + pub fn builder() -> builders::ConstructionFailureBuilder { + builders::ConstructionFailureBuilder::new() + } +} + +/// Error context for [`SdkError::TimeoutError`] +#[derive(Debug)] +pub struct TimeoutError { + source: BoxError, +} + +impl TimeoutError { + /// Creates a builder for this error context type. + pub fn builder() -> builders::TimeoutErrorBuilder { + builders::TimeoutErrorBuilder::new() + } +} + +/// Error context for [`SdkError::DispatchFailure`] +#[derive(Debug)] +pub struct DispatchFailure { + source: ConnectorError, +} + +impl DispatchFailure { + /// Creates a builder for this error context type. + pub fn builder() -> builders::DispatchFailureBuilder { + builders::DispatchFailureBuilder::new() + } + + /// Returns true if the error is an IO error + pub fn is_io(&self) -> bool { + self.source.is_io() + } + + /// Returns true if the error is an timeout error + pub fn is_timeout(&self) -> bool { + self.source.is_timeout() + } + + /// Returns true if the error is a user-caused error (e.g., invalid HTTP request) + pub fn is_user(&self) -> bool { + self.source.is_user() + } + + /// Returns true if the error is an unclassified error. + pub fn is_other(&self) -> bool { + self.source.is_other() + } + + /// Returns the optional error kind associated with an unclassified error + pub fn as_other(&self) -> Option { + self.source.as_other() + } + + /// Returns the inner error if it is a connector error + pub fn as_connector_error(&self) -> Option<&ConnectorError> { + Some(&self.source) + } +} + +/// Error context for [`SdkError::ResponseError`] +#[derive(Debug)] +pub struct ResponseError { + /// Error encountered while parsing the response + source: BoxError, + /// Raw response that was available + raw: R, +} + +impl ResponseError { + /// Creates a builder for this error context type. + pub fn builder() -> builders::ResponseErrorBuilder { + builders::ResponseErrorBuilder::new() + } + + /// Returns a reference to the raw response + pub fn raw(&self) -> &R { + &self.raw + } + + /// Converts this error context into the raw response + pub fn into_raw(self) -> R { + self.raw + } +} + +/// Error context for [`SdkError::ServiceError`] +#[derive(Debug)] +pub struct ServiceError { + /// Modeled service error + source: E, + /// Raw response from the service + raw: R, +} + +impl ServiceError { + /// Creates a builder for this error context type. + pub fn builder() -> builders::ServiceErrorBuilder { + builders::ServiceErrorBuilder::new() + } + + /// Returns the underlying error of type `E` + pub fn err(&self) -> &E { + &self.source + } + + /// Converts this error context into the underlying error `E` + pub fn into_err(self) -> E { + self.source + } + + /// Returns a reference to the raw response + pub fn raw(&self) -> &R { + &self.raw + } + + /// Converts this error context into the raw response + pub fn into_raw(self) -> R { + self.raw + } +} + +/// Constructs the unhandled variant of a code generated error. +/// +/// This trait exists so that [`SdkError::into_service_error`] can be infallible. +pub trait CreateUnhandledError { + /// Creates an unhandled error variant with the given `source` and error metadata. + fn create_unhandled_error( + source: Box, + meta: Option, + ) -> Self; +} + +/// Failed SDK Result +/// +/// When logging an error from the SDK, it is recommended that you either wrap the error in +/// [`DisplayErrorContext`](aws_smithy_types::error::display::DisplayErrorContext), use another +/// error reporter library that visits the error's cause/source chain, or call +/// [`Error::source`](std::error::Error::source) for more details about the underlying cause. +#[non_exhaustive] +#[derive(Debug)] +pub enum SdkError { + /// The request failed during construction. It was not dispatched over the network. + ConstructionFailure(ConstructionFailure), + + /// The request failed due to a timeout. The request MAY have been sent and received. + TimeoutError(TimeoutError), + + /// The request failed during dispatch. An HTTP response was not received. The request MAY + /// have been sent. + DispatchFailure(DispatchFailure), + + /// A response was received but it was not parseable according the the protocol (for example + /// the server hung up without sending a complete response) + ResponseError(ResponseError), + + /// An error response was received from the service + ServiceError(ServiceError), +} + +impl SdkError { + /// Construct a `SdkError` for a construction failure + pub fn construction_failure(source: impl Into) -> Self { + Self::ConstructionFailure(ConstructionFailure { + source: source.into(), + }) + } + + /// Construct a `SdkError` for a timeout + pub fn timeout_error(source: impl Into) -> Self { + Self::TimeoutError(TimeoutError { + source: source.into(), + }) + } + + /// Construct a `SdkError` for a dispatch failure with a [`ConnectorError`] + pub fn dispatch_failure(source: ConnectorError) -> Self { + Self::DispatchFailure(DispatchFailure { source }) + } + + /// Construct a `SdkError` for a response error + pub fn response_error(source: impl Into, raw: R) -> Self { + Self::ResponseError(ResponseError { + source: source.into(), + raw, + }) + } + + /// Construct a `SdkError` for a service failure + pub fn service_error(source: E, raw: R) -> Self { + Self::ServiceError(ServiceError { source, raw }) + } + + /// Returns the underlying service error `E` if there is one + /// + /// If the `SdkError` is not a `ServiceError` (for example, the error is a network timeout), + /// then it will be converted into an unhandled variant of `E`. This makes it easy to match + /// on the service's error response while simultaneously bubbling up transient failures. + /// For example, handling the `NoSuchKey` error for S3's `GetObject` operation may look as + /// follows: + /// + /// ```no_run + /// # use aws_smithy_runtime_api::client::result::{SdkError, CreateUnhandledError}; + /// # #[derive(Debug)] enum GetObjectError { NoSuchKey(()), Other(()) } + /// # impl std::fmt::Display for GetObjectError { + /// # fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { unimplemented!() } + /// # } + /// # impl std::error::Error for GetObjectError {} + /// # impl CreateUnhandledError for GetObjectError { + /// # fn create_unhandled_error( + /// # _: Box, + /// # _: Option, + /// # ) -> Self { unimplemented!() } + /// # } + /// # fn example() -> Result<(), GetObjectError> { + /// # let sdk_err = SdkError::service_error(GetObjectError::NoSuchKey(()), ()); + /// match sdk_err.into_service_error() { + /// GetObjectError::NoSuchKey(_) => { + /// // handle NoSuchKey + /// } + /// err @ _ => return Err(err), + /// } + /// # Ok(()) + /// # } + /// ``` + pub fn into_service_error(self) -> E + where + E: std::error::Error + Send + Sync + CreateUnhandledError + 'static, + R: Debug + Send + Sync + 'static, + { + match self { + Self::ServiceError(context) => context.source, + _ => E::create_unhandled_error(self.into(), None), + } + } + + /// Converts this error into its error source. + /// + /// If there is no error source, then `Err(Self)` is returned. + pub fn into_source(self) -> Result, Self> + where + E: std::error::Error + Send + Sync + 'static, + { + match self { + SdkError::ConstructionFailure(context) => Ok(context.source), + SdkError::TimeoutError(context) => Ok(context.source), + SdkError::ResponseError(context) => Ok(context.source), + SdkError::DispatchFailure(context) => Ok(context.source.into()), + SdkError::ServiceError(context) => Ok(context.source.into()), + } + } + + /// Return a reference to this error's raw response, if it contains one. Otherwise, return `None`. + pub fn raw_response(&self) -> Option<&R> { + match self { + SdkError::ServiceError(inner) => Some(inner.raw()), + SdkError::ResponseError(inner) => Some(inner.raw()), + _ => None, + } + } + + /// Maps the service error type in `SdkError::ServiceError` + #[doc(hidden)] + pub fn map_service_error(self, map: impl FnOnce(E) -> E2) -> SdkError { + match self { + SdkError::ServiceError(context) => SdkError::::ServiceError(ServiceError { + source: map(context.source), + raw: context.raw, + }), + SdkError::ConstructionFailure(context) => { + SdkError::::ConstructionFailure(context) + } + SdkError::DispatchFailure(context) => SdkError::::DispatchFailure(context), + SdkError::ResponseError(context) => SdkError::::ResponseError(context), + SdkError::TimeoutError(context) => SdkError::::TimeoutError(context), + } + } +} + +impl Display for SdkError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + SdkError::ConstructionFailure(_) => write!(f, "failed to construct request"), + SdkError::TimeoutError(_) => write!(f, "request has timed out"), + SdkError::DispatchFailure(_) => write!(f, "dispatch failure"), + SdkError::ResponseError(_) => write!(f, "response error"), + SdkError::ServiceError(_) => write!(f, "service error"), + } + } +} + +impl Error for SdkError +where + E: Error + 'static, + R: Debug, +{ + fn source(&self) -> Option<&(dyn Error + 'static)> { + match self { + SdkError::ConstructionFailure(context) => Some(context.source.as_ref()), + SdkError::TimeoutError(context) => Some(context.source.as_ref()), + SdkError::ResponseError(context) => Some(context.source.as_ref()), + SdkError::DispatchFailure(context) => Some(&context.source), + SdkError::ServiceError(context) => Some(&context.source), + } + } +} + +impl ProvideErrorMetadata for SdkError +where + E: ProvideErrorMetadata, +{ + fn meta(&self) -> &aws_smithy_types::Error { + match self { + SdkError::ConstructionFailure(_) => &EMPTY_ERROR_METADATA, + SdkError::TimeoutError(_) => &EMPTY_ERROR_METADATA, + SdkError::DispatchFailure(_) => &EMPTY_ERROR_METADATA, + SdkError::ResponseError(_) => &EMPTY_ERROR_METADATA, + SdkError::ServiceError(err) => err.source.meta(), + } + } +} + +#[derive(Debug)] +enum ConnectorErrorKind { + /// A timeout occurred while processing the request + Timeout, + + /// A user-caused error (e.g., invalid HTTP request) + User, + + /// Socket/IO error + Io, + + /// An unclassified Error with an explicit error kind + Other(Option), +} + +/// Error from the underlying Connector +/// +/// Connector exists to attach a `ConnectorErrorKind` to what would otherwise be an opaque `Box` +/// that comes off a potentially generic or dynamic connector. +/// The attached `kind` is used to determine what retry behavior should occur (if any) based on the +/// connector error. +#[derive(Debug)] +pub struct ConnectorError { + kind: ConnectorErrorKind, + source: BoxError, + connection: ConnectionStatus, +} + +#[non_exhaustive] +#[derive(Debug)] +pub(crate) enum ConnectionStatus { + /// This request was never connected to the remote + /// + /// This indicates the failure was during connection establishment + NeverConnected, + + /// It is unknown whether a connection was established + Unknown, + + /// The request connected to the remote prior to failure + Connected(ConnectionMetadata), +} + +impl Display for ConnectorError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self.kind { + ConnectorErrorKind::Timeout => write!(f, "timeout"), + ConnectorErrorKind::User => write!(f, "user error"), + ConnectorErrorKind::Io => write!(f, "io error"), + ConnectorErrorKind::Other(_) => write!(f, "other"), + } + } +} + +impl Error for ConnectorError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(self.source.as_ref()) + } +} + +impl ConnectorError { + /// Construct a [`ConnectorError`] from an error caused by a timeout + /// + /// Timeout errors are typically retried on a new connection. + pub fn timeout(source: BoxError) -> Self { + Self { + kind: ConnectorErrorKind::Timeout, + source, + connection: ConnectionStatus::Unknown, + } + } + + /// Include connection information along with this error + pub fn with_connection(mut self, info: ConnectionMetadata) -> Self { + self.connection = ConnectionStatus::Connected(info); + self + } + + /// Set the connection status on this error to report that a connection was never established + pub fn never_connected(mut self) -> Self { + self.connection = ConnectionStatus::NeverConnected; + self + } + + /// Construct a [`ConnectorError`] from an error caused by the user (e.g. invalid HTTP request) + pub fn user(source: BoxError) -> Self { + Self { + kind: ConnectorErrorKind::User, + source, + connection: ConnectionStatus::Unknown, + } + } + + /// Construct a [`ConnectorError`] from an IO related error (e.g. socket hangup) + pub fn io(source: BoxError) -> Self { + Self { + kind: ConnectorErrorKind::Io, + source, + connection: ConnectionStatus::Unknown, + } + } + + /// Construct a [`ConnectorError`] from an different unclassified error. + /// + /// Optionally, an explicit `Kind` may be passed. + pub fn other(source: BoxError, kind: Option) -> Self { + Self { + source, + kind: ConnectorErrorKind::Other(kind), + connection: ConnectionStatus::Unknown, + } + } + + /// Returns true if the error is an IO error + pub fn is_io(&self) -> bool { + matches!(self.kind, ConnectorErrorKind::Io) + } + + /// Returns true if the error is an timeout error + pub fn is_timeout(&self) -> bool { + matches!(self.kind, ConnectorErrorKind::Timeout) + } + + /// Returns true if the error is a user-caused error (e.g., invalid HTTP request) + pub fn is_user(&self) -> bool { + matches!(self.kind, ConnectorErrorKind::User) + } + + /// Returns true if the error is an unclassified error. + pub fn is_other(&self) -> bool { + matches!(self.kind, ConnectorErrorKind::Other(..)) + } + + /// Returns the optional error kind associated with an unclassified error + pub fn as_other(&self) -> Option { + match &self.kind { + ConnectorErrorKind::Other(ek) => *ek, + _ => None, + } + } + + /// Grants ownership of this error's source. + pub fn into_source(self) -> BoxError { + self.source + } + + /// Returns metadata about the connection + /// + /// If a connection was established and provided by the internal connector, a connection will + /// be returned. + pub fn connection_metadata(&self) -> Option<&ConnectionMetadata> { + match &self.connection { + ConnectionStatus::NeverConnected => None, + ConnectionStatus::Unknown => None, + ConnectionStatus::Connected(conn) => Some(conn), + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index 561ed7e6df3..094da91889a 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -4,8 +4,8 @@ */ use crate::client::retries::classifiers::run_classifiers_on_ctx; -use aws_smithy_http::connection::ConnectionMetadata; use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::connection::ConnectionMetadata; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, }; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index c9a59e26ec8..d1393e446b2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -6,14 +6,14 @@ use crate::client::http::connection_poisoning::CaptureSmithyConnection; use aws_smithy_async::future::timeout::TimedOutError; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; -use aws_smithy_http::connection::ConnectionMetadata; -use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::connection::ConnectionMetadata; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index 415f01735b1..b6462f1c812 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -4,12 +4,12 @@ */ use super::{Action, ConnectionId, Direction, Event, NetworkTraffic}; -use aws_smithy_http::result::ConnectorError; use aws_smithy_protocol_test::MediaType; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs index 2715b31c9e4..25b639084fc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::result::ConnectorError; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs index e911237390b..2809f428ace 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::result::ConnectorError; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use http::header::CONTENT_TYPE; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index a09e014a612..1e6cfb863b2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -12,7 +12,6 @@ use crate::client::orchestrator::endpoints::orchestrate_endpoint; use crate::client::orchestrator::http::{log_response_body, read_body}; use crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind}; use aws_smithy_async::rt::sleep::AsyncSleep; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings}; use aws_smithy_runtime_api::client::interceptors::context::{ @@ -21,6 +20,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{ use aws_smithy_runtime_api::client::orchestrator::{ HttpResponse, LoadedRequestBody, OrchestratorError, }; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index 752de031106..ba77165023d 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -12,7 +12,6 @@ use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::time::TimeSource; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ @@ -25,6 +24,7 @@ use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError}; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; @@ -390,7 +390,7 @@ mod tests { use crate::client::http::test_util::{capture_request, ReplayEvent, StaticReplayClient}; use crate::client::retries::classifiers::HttpStatusCodeClassifier; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::result::ConnectorError; + use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_types::body::SdkBody; use std::convert::Infallible; diff --git a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs index e2e26418ebb..14e3fa91898 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs @@ -5,8 +5,8 @@ use aws_smithy_async::future::timeout::Timeout; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::timeout::TimeoutConfig; @@ -171,8 +171,8 @@ mod tests { use aws_smithy_async::assert_elapsed; use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; + use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{CloneableLayer, ConfigBag}; use aws_smithy_types::timeout::TimeoutConfig; From 7fb78bb640a7c6d4e862b30d685f2e2176c97cce Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:34:31 +0000 Subject: [PATCH 202/331] Add lifetimes in structure impl (#3106) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Signed-off-by: Daniele Ahmed --- .../rust/codegen/core/smithy/generators/StructureGenerator.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt index cd18547094b..5c9635c5a8c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt @@ -133,7 +133,8 @@ open class StructureGenerator( if (accessorMembers.isEmpty()) { return } - writer.rustBlock("impl $name") { + val lifetimes = lifetimeDeclaration() + writer.rustBlock("impl $lifetimes $name $lifetimes") { // Render field accessor methods forEachMember(accessorMembers) { member, memberName, memberSymbol -> val memberType = memberSymbol.rustType() From a5f1653c0fc9f010b9026f5ea52c4cacbecee4e2 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:39:07 +0000 Subject: [PATCH 203/331] Allow custom writables in Instantiator (#3104) `Instantiator` currently renders only static data. This PR allows it to customize this behavior to allow non-static data (e.g. data taken from other structs). ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../core/smithy/generators/Instantiator.kt | 244 ++++++++++-------- .../smithy/generators/ServerInstantiator.kt | 20 +- .../generators/ServerInstantiatorTest.kt | 92 +++++++ 3 files changed, 244 insertions(+), 112 deletions(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt index 8a36d8ecbc6..795a6b5a1dc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt @@ -91,6 +91,7 @@ open class Instantiator( private val defaultsForRequiredFields: Boolean = false, private val customizations: List = listOf(), private val constructPattern: InstantiatorConstructPattern = InstantiatorConstructPattern.BUILDER, + private val customWritable: CustomWritable = NoCustomWritable(), ) { data class Ctx( // The `http` crate requires that headers be lowercase, but Smithy protocol tests @@ -122,28 +123,54 @@ open class Instantiator( fun doesSetterTakeInOption(memberShape: MemberShape): Boolean } - fun generate(shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) = writable { - render(this, shape, data, headers, ctx) + /** + * Customize how each shape is rendered, instead of relying on static `Node` data. + */ + interface CustomWritable { + // Return `null` to rely on the default behavior, which uses the static `Node` data. + fun generate(shape: Shape): Writable? } - fun render(writer: RustWriter, shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) { - when (shape) { - // Compound Shapes - is StructureShape -> renderStructure(writer, shape, data as ObjectNode, headers, ctx) - is UnionShape -> renderUnion(writer, shape, data as ObjectNode, ctx) - - // Collections - is ListShape -> renderList(writer, shape, data as ArrayNode, ctx) - is MapShape -> renderMap(writer, shape, data as ObjectNode, ctx) - is SetShape -> renderSet(writer, shape, data as ArrayNode, ctx) + class NoCustomWritable : CustomWritable { + override fun generate(shape: Shape): Writable? = null + } - // Members, supporting potentially optional members - is MemberShape -> renderMember(writer, shape, data, ctx) + fun generate(shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) = writable { + render(this, shape, data, headers, ctx) + } - is SimpleShape -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate(shape, data)(writer) + open fun render( + writer: RustWriter, + shape: Shape, + data: Node, + headers: Map = mapOf(), + ctx: Ctx = Ctx(), + ) { + customWritable.generate(shape) + ?.let { it(writer) } + ?: run { + when (shape) { + // Compound Shapes + is StructureShape -> renderStructure(writer, shape, data as ObjectNode, headers, ctx) + is UnionShape -> renderUnion(writer, shape, data as ObjectNode, ctx) + + // Collections + is ListShape -> renderList(writer, shape, data as ArrayNode, ctx) + is MapShape -> renderMap(writer, shape, data as ObjectNode, ctx) + is SetShape -> renderSet(writer, shape, data as ArrayNode, ctx) + + // Members, supporting potentially optional members + is MemberShape -> renderMember(writer, shape, data, ctx) + + is SimpleShape -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate( + shape, + data, + customWritable, + )(writer) - else -> writer.writeWithNoFormatting("todo!() /* $shape $data */") - } + else -> writer.writeWithNoFormatting("todo!() /* $shape $data */") + } + } } /** @@ -153,45 +180,49 @@ open class Instantiator( private fun renderMember(writer: RustWriter, memberShape: MemberShape, data: Node, ctx: Ctx) { val targetShape = model.expectShape(memberShape.target) val symbol = symbolProvider.toSymbol(memberShape) - if (data is NullNode && !targetShape.isDocumentShape) { - check(symbol.isOptional()) { - "A null node was provided for $memberShape but the symbol was not optional. This is invalid input data." - } - writer.rustTemplate("#{None}", *preludeScope) - } else { - // Structure builder setters for structure shape members _always_ take in `Option`. - // Other aggregate shapes' members are optional only when their symbol is. - writer.conditionalBlockTemplate( - "#{Some}(", - ")", - // The conditions are not commutative: note client builders always take in `Option`. - conditional = symbol.isOptional() || - ( - model.expectShape(memberShape.container) is StructureShape && builderKindBehavior.doesSetterTakeInOption( - memberShape, - ) - ), - *preludeScope, - ) { - writer.conditionalBlockTemplate( - "#{Box}::new(", - ")", - conditional = symbol.rustType().stripOuter() is RustType.Box, - *preludeScope, - ) { - render( - this, - targetShape, - data, - mapOf(), - ctx.copy() - .letIf(memberShape.hasTrait()) { - it.copy(lowercaseMapKeys = true) - }, - ) + customWritable.generate(memberShape) + ?.let { it(writer) } + ?: run { + if (data is NullNode && !targetShape.isDocumentShape) { + check(symbol.isOptional()) { + "A null node was provided for $memberShape but the symbol was not optional. This is invalid input data." + } + writer.rustTemplate("#{None}", *preludeScope) + } else { + // Structure builder setters for structure shape members _always_ take in `Option`. + // Other aggregate shapes' members are optional only when their symbol is. + writer.conditionalBlockTemplate( + "#{Some}(", + ")", + // The conditions are not commutative: note client builders always take in `Option`. + conditional = symbol.isOptional() || + ( + model.expectShape(memberShape.container) is StructureShape && builderKindBehavior.doesSetterTakeInOption( + memberShape, + ) + ), + *preludeScope, + ) { + writer.conditionalBlockTemplate( + "#{Box}::new(", + ")", + conditional = symbol.rustType().stripOuter() is RustType.Box, + *preludeScope, + ) { + render( + this, + targetShape, + data, + mapOf(), + ctx.copy() + .letIf(memberShape.hasTrait()) { + it.copy(lowercaseMapKeys = true) + }, + ) + } + } } } - } } private fun renderSet(writer: RustWriter, shape: SetShape, data: ArrayNode, ctx: Ctx) = @@ -291,6 +322,7 @@ open class Instantiator( writer.withBlockTemplate("#{T} {", "}", "T" to symbolProvider.toSymbol(shape)) { renderStructureMembers(writer, shape, data, headers, ctx) } + InstantiatorConstructPattern.BUILDER -> { writer.rust("#T::builder()", symbolProvider.toSymbol(shape)) @@ -321,6 +353,7 @@ open class Instantiator( renderMember(this, memberShape, value, ctx) } } + InstantiatorConstructPattern.BUILDER -> { val setterName = builderKindBehavior.setterName(memberShape) writer.withBlock(".$setterName(", ")") { @@ -398,67 +431,72 @@ open class Instantiator( } class PrimitiveInstantiator(private val runtimeConfig: RuntimeConfig, private val symbolProvider: SymbolProvider) { - fun instantiate(shape: SimpleShape, data: Node): Writable = writable { - when (shape) { - // Simple Shapes - is TimestampShape -> { - val node = (data as NumberNode) - val num = BigDecimal(node.toString()) - val wholePart = num.toInt() - val fractionalPart = num.remainder(BigDecimal.ONE) - rust( - "#T::from_fractional_secs($wholePart, ${fractionalPart}_f64)", - RuntimeType.dateTime(runtimeConfig), - ) - } - - /** - * ```rust - * Blob::new("arg") - * ``` - */ - is BlobShape -> if (shape.hasTrait()) { - rust( - "#T::from_static(b${(data as StringNode).value.dq()})", - RuntimeType.byteStream(runtimeConfig), - ) - } else { - rust( - "#T::new(${(data as StringNode).value.dq()})", - RuntimeType.blob(runtimeConfig), - ) - } + fun instantiate( + shape: SimpleShape, + data: Node, + customWritable: Instantiator.CustomWritable = Instantiator.NoCustomWritable(), + ): Writable = + customWritable.generate(shape) ?: writable { + when (shape) { + // Simple Shapes + is TimestampShape -> { + val node = (data as NumberNode) + val num = BigDecimal(node.toString()) + val wholePart = num.toInt() + val fractionalPart = num.remainder(BigDecimal.ONE) + rust( + "#T::from_fractional_secs($wholePart, ${fractionalPart}_f64)", + RuntimeType.dateTime(runtimeConfig), + ) + } - is StringShape -> renderString(shape, data as StringNode)(this) - is NumberShape -> when (data) { - is StringNode -> { - val numberSymbol = symbolProvider.toSymbol(shape) - // support Smithy custom values, such as Infinity + /** + * ```rust + * Blob::new("arg") + * ``` + */ + is BlobShape -> if (shape.hasTrait()) { rust( - """<#T as #T>::parse_smithy_primitive(${data.value.dq()}).expect("invalid string for number")""", - numberSymbol, - RuntimeType.smithyTypes(runtimeConfig).resolve("primitive::Parse"), + "#T::from_static(b${(data as StringNode).value.dq()})", + RuntimeType.byteStream(runtimeConfig), + ) + } else { + rust( + "#T::new(${(data as StringNode).value.dq()})", + RuntimeType.blob(runtimeConfig), ) } - is NumberNode -> write(data.value) - } + is StringShape -> renderString(shape, data as StringNode)(this) + is NumberShape -> when (data) { + is StringNode -> { + val numberSymbol = symbolProvider.toSymbol(shape) + // support Smithy custom values, such as Infinity + rust( + """<#T as #T>::parse_smithy_primitive(${data.value.dq()}).expect("invalid string for number")""", + numberSymbol, + RuntimeType.smithyTypes(runtimeConfig).resolve("primitive::Parse"), + ) + } - is BooleanShape -> rust(data.asBooleanNode().get().toString()) - is DocumentShape -> rustBlock("") { - val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() - rustTemplate( - """ + is NumberNode -> write(data.value) + } + + is BooleanShape -> rust(data.asBooleanNode().get().toString()) + is DocumentShape -> rustBlock("") { + val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() + rustTemplate( + """ let json_bytes = br##"${Node.prettyPrintJson(data)}"##; let mut tokens = #{json_token_iter}(json_bytes).peekable(); #{expect_document}(&mut tokens).expect("well formed json") """, - "expect_document" to smithyJson.resolve("deserialize::token::expect_document"), - "json_token_iter" to smithyJson.resolve("deserialize::json_token_iter"), - ) + "expect_document" to smithyJson.resolve("deserialize::token::expect_document"), + "json_token_iter" to smithyJson.resolve("deserialize::json_token_iter"), + ) + } } } - } private fun renderString(shape: StringShape, arg: StringNode): Writable = { val data = escape(arg.value).dq() diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt index 77a96c816ea..fade448863b 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt @@ -68,15 +68,17 @@ class ServerBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiat codegenContext.symbolProvider.toSymbol(memberShape).isOptional() } -class ServerInstantiator(codegenContext: CodegenContext) : Instantiator( - codegenContext.symbolProvider, - codegenContext.model, - codegenContext.runtimeConfig, - ServerBuilderKindBehavior(codegenContext), - defaultsForRequiredFields = true, - customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), - constructPattern = InstantiatorConstructPattern.DIRECT, -) +class ServerInstantiator(codegenContext: CodegenContext, customWritable: CustomWritable = NoCustomWritable()) : + Instantiator( + codegenContext.symbolProvider, + codegenContext.model, + codegenContext.runtimeConfig, + ServerBuilderKindBehavior(codegenContext), + defaultsForRequiredFields = true, + customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), + constructPattern = InstantiatorConstructPattern.DIRECT, + customWritable = customWritable, + ) class ServerBuilderInstantiator( private val symbolProvider: RustSymbolProvider, diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt index cfb4d00bb04..5a6f9791518 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt @@ -8,18 +8,25 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators import io.kotest.matchers.string.shouldNotContain import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.node.ObjectNode +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.withBlock +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest +import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.lookup @@ -248,4 +255,89 @@ class ServerInstantiatorTest { sut.render(writer, shape, data) writer.toString() shouldNotContain "builder()" } + + @Test + fun `uses writable for shapes`() { + val nestedStruct = model.lookup("com.test#NestedStruct") + val inner = model.lookup("com.test#Inner") + + val project = TestWorkspace.testProject(model) + nestedStruct.renderWithModelBuilder(model, symbolProvider, project) + inner.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(nestedStruct) { + val nestedUnion = model.lookup("com.test#NestedUnion") + UnionGenerator(model, symbolProvider, this, nestedUnion).render() + + unitTest("writable_for_shapes") { + val sut = ServerInstantiator( + codegenContext, + customWritable = object : Instantiator.CustomWritable { + override fun generate(shape: Shape): Writable? = + if (model.lookup("com.test#NestedStruct\$num") == shape) { + writable("40 + 2") + } else { + null + } + }, + ) + val data = Node.parse("""{ "str": "hello", "num": 1 }""") + withBlock("let result = ", ";") { + sut.render(this, model.lookup("com.test#NestedStruct"), data as ObjectNode) + } + rust( + """ + assert_eq!(result.num, 42); + assert_eq!(result.str, "hello"); + """, + ) + } + + unitTest("writable_for_nested_inner_members") { + val map = model.lookup("com.test#Inner\$map") + val sut = ServerInstantiator( + codegenContext, + customWritable = object : Instantiator.CustomWritable { + private var n: Int = 0 + override fun generate(shape: Shape): Writable? = + if (shape != map) { + null + } else if (n != 2) { + n += 1 + null + } else { + n += 1 + writable("None") + } + }, + ) + val data = Node.parse( + """ + { + "map": { + "k1": { + "map": { + "k2": { + "map": { + "never": {} + } + } + } + } + } + } + """, + ) + + withBlock("let result = ", ";") { + sut.render(this, inner, data as ObjectNode) + } + rust( + """ + assert_eq!(result.map().unwrap().get("k1").unwrap().map().unwrap().get("k2").unwrap().map(), None); + """, + ) + } + } + project.compileAndTest(runClippy = true) + } } From 7768e03e5c0903b39a9a73d8b93e950a7701d0f8 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 30 Oct 2023 09:51:49 -0400 Subject: [PATCH 204/331] Upgrade semver checks to 0.24.1 (#3102) ## Motivation and Context ## Description ## Testing ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/Dockerfile | 6 +-- .../ci-scripts/codegen-diff/semver-checks.py | 42 +++++++++++++++---- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 5bba3040f1e..1136c537f82 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -35,6 +35,7 @@ RUN yum -y install --allowerasing \ automake \ binutils \ ca-certificates \ + cmake \ curl \ gcc \ gcc-c++ \ @@ -132,9 +133,8 @@ ARG cargo_wasi_version=0.1.27 RUN cargo install cargo-wasi --locked --version ${cargo_wasi_version} FROM install_rust AS cargo_semver_checks -ARG cargo_semver_checks_version=0.20.0 -ARG rust_nightly_version -RUN cargo +${rust_nightly_version} -Z sparse-registry install cargo-semver-checks --locked --version ${cargo_semver_checks_version} +ARG cargo_semver_checks_version=0.24.1 +RUN cargo install cargo-semver-checks --locked --version ${cargo_semver_checks_version} FROM install_rust AS cargo_mdbook ARG cargo_mdbook_version=0.4.30 diff --git a/tools/ci-scripts/codegen-diff/semver-checks.py b/tools/ci-scripts/codegen-diff/semver-checks.py index 24f6785c81d..be3e4317273 100755 --- a/tools/ci-scripts/codegen-diff/semver-checks.py +++ b/tools/ci-scripts/codegen-diff/semver-checks.py @@ -33,35 +33,63 @@ def main(skip_generation=False): sdk_directory = os.path.join(OUTPUT_PATH, 'aws-sdk', 'sdk') os.chdir(sdk_directory) - failed = False + failures = [] deny_list = [ # add crate names here to exclude them from the semver checks ] - for path in os.listdir(): + for path in list(os.listdir())[:10]: eprint(f'checking {path}...', end='') if path not in deny_list and get_cmd_status(f'git cat-file -e base:{sdk_directory}/{path}/Cargo.toml') == 0: + get_cmd_output('cargo generate-lockfile', quiet=True) + (_, out, _) = get_cmd_output('cargo pkgid', cwd=path, quiet=True) + pkgid = parse_package_id(out) (status, out, err) = get_cmd_output(f'cargo semver-checks check-release ' f'--baseline-rev {BASE_BRANCH} ' # in order to get semver-checks to work with publish-false crates, need to specify # package and manifest path explicitly f'--manifest-path {path}/Cargo.toml ' - f'-p {path} ' + '-v ' + f'-p {pkgid} ' f'--release-type minor', check=False, quiet=True) if status == 0: eprint('ok!') else: - failed = True + failures.append(f"{out}{err}") eprint('failed!') if out: eprint(out) eprint(err) else: eprint(f'skipping {path} because it does not exist in base') - if failed: + if failures: eprint('One or more crates failed semver checks!') + eprint("\n".join(failures)) exit(1) +def parse_package_id(id): + if '#' in id and '@' in id: + return id.split('#')[1].split('@')[0] + elif '#' in id: + return id.split('/')[-1].split('#')[0] + else: + eprint(id) + raise Exception("unknown format") + + +import unittest + + +class SelfTest(unittest.TestCase): + def test_foo(self): + self.assertEqual(parse_package_id("file:///Users/rcoh/code/smithy-rs-ci/smithy-rs/tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime-api#0.56.1"), "aws-smithy-runtime-api") + self.assertEqual(parse_package_id("file:///Users/rcoh/code/smithy-rs-ci/smithy-rs/tmp-codegen-diff/aws-sdk/sdk/s3#aws-sdk-s3@0.0.0-local"), "aws-sdk-s3") + + if __name__ == "__main__": - skip_generation = bool(os.environ.get('SKIP_GENERATION') or False) - main(skip_generation=skip_generation) + if len(sys.argv) > 1 and sys.argv[1] == "--self-test": + sys.argv.pop() + unittest.main() + else: + skip_generation = bool(os.environ.get('SKIP_GENERATION') or False) + main(skip_generation=skip_generation) From 5a8b07c6b564a755333ced6ff229d35baf8db138 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 30 Oct 2023 09:57:49 -0400 Subject: [PATCH 205/331] Small tweaks to the HTTP wrapper (#3099) ## Motivation and Context - small improvements / consistency updates to http wrapper - fix bug where `.insert` was called but it should have been `append` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../src/client/http/request.rs | 31 +++++++++++++++++-- .../src/client/orchestrator/endpoints.rs | 2 +- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs index 8619c2841ab..5b4172160df 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs @@ -380,7 +380,7 @@ impl Headers { key: impl AsHeaderComponent, value: impl AsHeaderComponent, ) -> Result, HttpError> { - let key = header_name(key.into_maybe_static()?)?; + let key = header_name(key)?; let value = header_value(value.into_maybe_static()?)?; Ok(self .headers @@ -404,8 +404,10 @@ impl Headers { /// Removes all headers with a given key /// /// If there are multiple entries for this key, the first entry is returned - pub fn remove(&mut self, key: &str) -> Option { - self.headers.remove(key) + pub fn remove(&mut self, key: impl AsRef) -> Option { + self.headers + .remove(key.as_ref()) + .map(|h| h.as_str().to_string()) } /// Appends a value to a given key @@ -427,6 +429,9 @@ mod sealed { /// If the component can be represented as a Cow<'static, str>, return it fn into_maybe_static(self) -> Result; + /// Return a string reference to this header + fn as_str(&self) -> Result<&str, HttpError>; + /// If a component is already internally represented as a `http02x::HeaderName`, return it fn repr_as_http02x_header_name(self) -> Result where @@ -440,18 +445,30 @@ mod sealed { fn into_maybe_static(self) -> Result { Ok(Cow::Borrowed(self)) } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self) + } } impl AsHeaderComponent for String { fn into_maybe_static(self) -> Result { Ok(Cow::Owned(self)) } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self) + } } impl AsHeaderComponent for Cow<'static, str> { fn into_maybe_static(self) -> Result { Ok(self) } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self.as_ref()) + } } impl AsHeaderComponent for http0::HeaderValue { @@ -462,6 +479,10 @@ mod sealed { .to_string(), )) } + + fn as_str(&self) -> Result<&str, HttpError> { + std::str::from_utf8(self.as_bytes()).map_err(HttpError::header_was_not_a_string) + } } impl AsHeaderComponent for http0::HeaderName { @@ -469,6 +490,10 @@ mod sealed { Ok(self.to_string().into()) } + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self.as_ref()) + } + fn repr_as_http02x_header_name(self) -> Result where Self: Sized, diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 11f7d873dff..85b70ac5c49 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -132,7 +132,7 @@ fn apply_endpoint( for (header_name, header_values) in endpoint.headers() { request.headers_mut().remove(header_name); for value in header_values { - request.headers_mut().insert( + request.headers_mut().append( HeaderName::from_str(header_name).map_err(|err| { ResolveEndpointError::message("invalid header name") .with_source(Some(err.into())) From 06e265dfd3e4f23ae92c4ee2b2c7037b8568c05b Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 30 Oct 2023 09:58:46 -0400 Subject: [PATCH 206/331] Update SDK external types (#3080) ## Motivation and Context - https://github.com/awslabs/smithy-rs/issues/3019 ## Description Prune / split out allow external types ## Testing - CI ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/sdk-external-types.toml | 35 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index 4705c4e2952..b4f1806f459 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -1,22 +1,31 @@ # These are the allowed external types in the `aws-sdk-*` generated crates, checked by CI. allowed_external_types = [ - "aws_credential_types::*", - "aws_http::*", - "aws_runtime::*", - "aws_smithy_async::*", - "aws_smithy_http::*", - "aws_smithy_runtime::*", - "aws_smithy_runtime_api::*", "aws_smithy_types::*", + "aws_credential_types::*", "aws_types::*", - - "http::header::map::HeaderMap", - "http::header::value::HeaderValue", + "aws_smithy_runtime_api::*", + "aws_smithy_async::rt::sleep::*", + "aws_smithy_async::time::*", + "aws_smithy_async::future::pagination_stream::PaginationStream", + # only allowed in from impl for presigned request "http::request::Request", - "http::error::Error", - "http::uri::Uri", - "http::method::Method", # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", + + # Consider moving making this crate 1.0 + "aws_smithy_runtime::client::identity::cache::IdentityCache", + + ### All below this line need to be fixed: + # The following are not OK + "aws_http::request_id::RequestId", # move to aws-types + # `set_invocation_id_generator` — consider make pub(crate) or moving trait to AwsTypes + "aws_runtime::invocation_id::SharedInvocationIdGenerator", + "aws_runtime::invocation_id::InvocationIdGenerator", + + # Pending fix in open PRs: + "aws_smithy_http::result::*", + + # Pending future fix + "aws_smithy_http::event_stream::*", ] From 53dcff3ff058835322bba59c3e4d1e529aeabd60 Mon Sep 17 00:00:00 2001 From: david-perez Date: Mon, 30 Oct 2023 17:25:04 +0100 Subject: [PATCH 207/331] Build services with a derived configuration object (#3095) This is a pared-down version of #2809. This is the code-generated version of the david-perez/smithy-rs-service-config#2 POC. This introduces a code-generated `PokemonServiceConfig` object which is provided to the service builder constructor via `PokemonService::builder(config: PokemonServiceConfig)`. This will displace the current `builder_without_plugins` and `builder_with_plugins`, deprecating them. We will eventually remove them. The motivation is to have a single place where to register plugins and layers. Smithy traits can leverage this object to inject methods that can apply plugins and layers. For example, an `@authorization` trait implementer could vend a smithy-rs decorator that pre-applied an authorization plugin inside the `${serviceName}Config` object, possibly exposing a method to pass in any runtime arguments needed to configure the middleware. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../rust/codegen/core/rustlang/RustWriter.kt | 5 +- .../server/smithy/ServerCodegenVisitor.kt | 11 +- .../smithy/generators/ServerRootGenerator.kt | 33 ++- .../generators/ServerServiceGenerator.kt | 208 +++++++++++++----- .../generators/ServiceConfigGenerator.kt | 144 ++++++++++++ .../protocol/ServerProtocolTestGenerator.kt | 3 +- design/src/server/anatomy.md | 19 +- design/src/server/instrumentation.md | 9 +- design/src/server/middleware.md | 64 ++++-- .../tests/plugins_execution_order.rs | 17 +- examples/pokemon-service-lambda/src/main.rs | 12 +- examples/pokemon-service-tls/src/main.rs | 12 +- examples/pokemon-service/src/main.rs | 33 +-- .../src/plugin/http_plugins.rs | 2 - .../src/request/request_id.rs | 9 +- 16 files changed, 430 insertions(+), 157 deletions(-) create mode 100644 codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fbf7652d2d2..267d530fd59 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -506,3 +506,9 @@ The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connec references = ["smithy-rs#3092", "smithy-rs#3093"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "ysaito1001" + +[[smithy-rs]] +message = "Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3096) for more details." +references = ["smithy-rs#3095", "smithy-rs#3096"] +meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "server" } +author = "david-perez" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt index 764f3b08c3c..8965e3eb9d0 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt @@ -551,10 +551,7 @@ class RustWriter private constructor( if (this.className.contains("AbstractCodeWriter") || this.className.startsWith("java.lang")) { return false } - if (this.fileName == "RustWriter.kt") { - return false - } - return true + return this.fileName != "RustWriter.kt" } private val preamble = mutableListOf() diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index c27cba8ae55..6f66c72166d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -73,6 +73,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerRootGe import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerRuntimeTypesReExportsGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerServiceGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerStructureConstrainedTraitImpl +import software.amazon.smithy.rust.codegen.server.smithy.generators.ServiceConfigGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedCollectionGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedMapGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedUnionGenerator @@ -590,7 +591,7 @@ open class ServerCodegenVisitor( logger.info("[rust-server-codegen] Generating a service $shape") val serverProtocol = protocolGeneratorFactory.protocol(codegenContext) as ServerProtocol - // Generate root + // Generate root. rustCrate.lib { ServerRootGenerator( serverProtocol, @@ -598,21 +599,23 @@ open class ServerCodegenVisitor( ).render(this) } - // Generate server re-exports + // Generate server re-exports. rustCrate.withModule(ServerRustModule.Server) { ServerRuntimeTypesReExportsGenerator(codegenContext).render(this) } - // Generate protocol tests + // Generate protocol tests. protocolTests() - // Generate service module + // Generate service module. rustCrate.withModule(ServerRustModule.Service) { ServerServiceGenerator( codegenContext, serverProtocol, ).render(this) + ServiceConfigGenerator(codegenContext).render(this) + ScopeMacroGenerator(codegenContext).render(this) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt index fbf938265e2..a1ea4b90f64 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt @@ -73,9 +73,9 @@ open class ServerRootGenerator( //! ```rust,no_run //! ## use std::net::SocketAddr; //! ## async fn dummy() { - //! use $crateName::$serviceName; + //! use $crateName::{$serviceName, ${serviceName}Config}; //! - //! ## let app = $serviceName::builder_without_plugins().build_unchecked(); + //! ## let app = $serviceName::builder(${serviceName}Config::builder().build()).build_unchecked(); //! let server = app.into_make_service(); //! let bind: SocketAddr = "127.0.0.1:6969".parse() //! .expect("unable to parse the server bind address and port"); @@ -92,7 +92,7 @@ open class ServerRootGenerator( //! use $crateName::$serviceName; //! //! ## async fn dummy() { - //! ## let app = $serviceName::builder_without_plugins().build_unchecked(); + //! ## let app = $serviceName::builder(${serviceName}Config::builder().build()).build_unchecked(); //! let handler = LambdaHandler::new(app); //! lambda_http::run(handler).await.unwrap(); //! ## } @@ -100,28 +100,26 @@ open class ServerRootGenerator( //! //! ## Building the $serviceName //! - //! To construct [`$serviceName`] we use [`$builderName`] returned by [`$serviceName::builder_without_plugins`] - //! or [`$serviceName::builder_with_plugins`]. + //! To construct [`$serviceName`] we use [`$builderName`] returned by [`$serviceName::builder`]. //! //! #### Plugins //! - //! The [`$serviceName::builder_with_plugins`] method, returning [`$builderName`], - //! accepts a plugin marked with [`HttpMarker`](aws_smithy_http_server::plugin::HttpMarker) and a - //! plugin marked with [`ModelMarker`](aws_smithy_http_server::plugin::ModelMarker). + //! The [`$serviceName::builder`] method, returning [`$builderName`], + //! accepts a config object on which plugins can be registered. //! Plugins allow you to build middleware which is aware of the operation it is being applied to. //! - //! ```rust - //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin; + //! ```rust,no_run //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin as LoggingPlugin; //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin as MetricsPlugin; //! ## use #{Hyper}::Body; //! use #{SmithyHttpServer}::plugin::HttpPlugins; - //! use $crateName::{$serviceName, $builderName}; + //! use $crateName::{$serviceName, ${serviceName}Config, $builderName}; //! //! let http_plugins = HttpPlugins::new() //! .push(LoggingPlugin) //! .push(MetricsPlugin); - //! let builder: $builderName = $serviceName::builder_with_plugins(http_plugins, IdentityPlugin); + //! let config = ${serviceName}Config::builder().build(); + //! let builder: $builderName = $serviceName::builder(config); //! ``` //! //! Check out [`#{SmithyHttpServer}::plugin`] to learn more about plugins. @@ -136,7 +134,7 @@ open class ServerRootGenerator( //! * A `Result` if your operation has modeled errors, or //! * An `Output` otherwise. //! - //! ```rust + //! ```rust,no_run //! ## struct Input; //! ## struct Output; //! ## struct Error; @@ -147,7 +145,7 @@ open class ServerRootGenerator( //! //! Handlers can accept up to 8 extractors: //! - //! ```rust + //! ```rust,no_run //! ## struct Input; //! ## struct Output; //! ## struct Error; @@ -187,11 +185,12 @@ open class ServerRootGenerator( //! //! ```rust //! ## use std::net::SocketAddr; - //! use $crateName::$serviceName; + //! use $crateName::{$serviceName, ${serviceName}Config}; //! //! ##[#{Tokio}::main] //! pub async fn main() { - //! let app = $serviceName::builder_without_plugins() + //! let config = ${serviceName}Config::builder().build(); + //! let app = $serviceName::builder(config) ${builderFieldNames.values.joinToString("\n") { "//! .$it($it)" }} //! .build() //! .expect("failed to build an instance of $serviceName"); @@ -237,6 +236,6 @@ open class ServerRootGenerator( fun render(rustWriter: RustWriter) { documentation(rustWriter) - rustWriter.rust("pub use crate::service::{$serviceName, ${serviceName}Builder, MissingOperationsError};") + rustWriter.rust("pub use crate::service::{$serviceName, ${serviceName}Config, ${serviceName}ConfigBuilder, ${serviceName}Builder, MissingOperationsError};") } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index 2b4e2ee2e98..97963cbb40a 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -53,7 +53,6 @@ class ServerServiceGenerator( private val serviceId = service.id private val serviceName = serviceId.name.toPascalCase() private val builderName = "${serviceName}Builder" - private val builderBodyGenericTypeName = "Body" /** Calculate all `operationShape`s contained within the `ServiceShape`. */ private val index = TopDownIndex.of(codegenContext.model) @@ -118,18 +117,19 @@ class ServerServiceGenerator( /// ## Example /// /// ```no_run - /// use $crateName::$serviceName; + /// use $crateName::{$serviceName, ${serviceName}Config}; /// #{HandlerImports:W} /// #{Handler:W} /// - /// let app = $serviceName::builder_without_plugins() + /// let config = ${serviceName}Config::builder().build(); + /// let app = $serviceName::builder(config) /// .$fieldName(handler) /// /* Set other handlers */ /// .build() /// .unwrap(); - /// ## let app: $serviceName<#{SmithyHttpServer}::routing::Route<#{SmithyHttp}::body::SdkBody>> = app; + /// ## let app: $serviceName<#{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}>> = app; /// ``` /// pub fn $fieldName(self, handler: HandlerType) -> Self @@ -137,22 +137,22 @@ class ServerServiceGenerator( HandlerType: #{SmithyHttpServer}::operation::Handler, ModelPl: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, #{SmithyHttpServer}::operation::IntoService >, #{SmithyHttpServer}::operation::UpgradePlugin::: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, ModelPl::Output >, HttpPl: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, < #{SmithyHttpServer}::operation::UpgradePlugin:: as #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, ModelPl::Output > @@ -180,19 +180,20 @@ class ServerServiceGenerator( /// ## Example /// /// ```no_run - /// use $crateName::$serviceName; + /// use $crateName::{$serviceName, ${serviceName}Config}; /// #{HandlerImports:W} /// #{HandlerFixed:W} /// + /// let config = ${serviceName}Config::builder().build(); /// let svc = #{Tower}::util::service_fn(handler); - /// let app = $serviceName::builder_without_plugins() + /// let app = $serviceName::builder(config) /// .${fieldName}_service(svc) /// /* Set other handlers */ /// .build() /// .unwrap(); - /// ## let app: $serviceName<#{SmithyHttpServer}::routing::Route<#{SmithyHttp}::body::SdkBody>> = app; + /// ## let app: $serviceName<#{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}>> = app; /// ``` /// pub fn ${fieldName}_service(self, service: S) -> Self @@ -200,22 +201,22 @@ class ServerServiceGenerator( S: #{SmithyHttpServer}::operation::OperationService, ModelPl: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, #{SmithyHttpServer}::operation::Normalize >, #{SmithyHttpServer}::operation::UpgradePlugin::: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, ModelPl::Output >, HttpPl: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, < #{SmithyHttpServer}::operation::UpgradePlugin:: as #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, ModelPl::Output > @@ -246,6 +247,7 @@ class ServerServiceGenerator( self } """, + "Router" to protocol.routerType(), "Protocol" to protocol.markerStruct(), "Handler" to handler, "HandlerFixed" to handlerFixed, @@ -294,8 +296,18 @@ class ServerServiceGenerator( /// Forgetting to register a handler for one or more operations will result in an error. /// /// Check out [`$builderName::build_unchecked`] if you'd prefer the service to return status code 500 when an - /// unspecified route requested. - pub fn build(self) -> Result<$serviceName<#{SmithyHttpServer}::routing::Route<$builderBodyGenericTypeName>>, MissingOperationsError> + /// unspecified route is requested. + pub fn build(self) -> Result< + $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}, + #{Protocol}, + >, + >, + MissingOperationsError, + > + where + L: #{Tower}::Layer<#{SmithyHttpServer}::routing::Route>, { let router = { use #{SmithyHttpServer}::operation::OperationShape; @@ -312,15 +324,16 @@ class ServerServiceGenerator( #{Router}::from_iter([#{RoutesArrayElements:W}]) }; - Ok($serviceName { - router: #{SmithyHttpServer}::routing::RoutingService::new(router), - }) + let svc = #{SmithyHttpServer}::routing::RoutingService::new(router); + let svc = svc.map(|s| s.layer(self.layer)); + Ok($serviceName { svc }) } """, + *codegenScope, + "Protocol" to protocol.markerStruct(), "Router" to protocol.routerType(), "NullabilityChecks" to nullabilityChecks, "RoutesArrayElements" to routesArrayElements, - "SmithyHttpServer" to smithyHttpServer, "PatternInitializations" to patternInitializations(), ) } @@ -376,32 +389,38 @@ class ServerServiceGenerator( /// /// Check out [`$builderName::build`] if you'd prefer the builder to fail if one or more operations do /// not have a registered handler. - pub fn build_unchecked(self) -> $serviceName<#{SmithyHttpServer}::routing::Route<$builderBodyGenericTypeName>> + pub fn build_unchecked(self) -> $serviceName where - $builderBodyGenericTypeName: Send + 'static + Body: Send + 'static, + L: #{Tower}::Layer< + #{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}> + > { let router = #{Router}::from_iter([#{Pairs:W}]); - $serviceName { - router: #{SmithyHttpServer}::routing::RoutingService::new(router), - } + let svc = self + .layer + .layer(#{SmithyHttpServer}::routing::RoutingService::new(router)); + $serviceName { svc } } """, + *codegenScope, + "Protocol" to protocol.markerStruct(), "Router" to protocol.routerType(), "Pairs" to pairs, - "SmithyHttpServer" to smithyHttpServer, ) } /** Returns a `Writable` containing the builder struct definition and its implementations. */ private fun builder(): Writable = writable { - val builderGenerics = listOf(builderBodyGenericTypeName, "HttpPl", "ModelPl").joinToString(", ") + val builderGenerics = listOf("Body", "L", "HttpPl", "ModelPl").joinToString(", ") rustTemplate( """ /// The service builder for [`$serviceName`]. /// - /// Constructed via [`$serviceName::builder_with_plugins`] or [`$serviceName::builder_without_plugins`]. + /// Constructed via [`$serviceName::builder`]. pub struct $builderName<$builderGenerics> { ${builderFields.joinToString(", ")}, + layer: L, http_plugin: HttpPl, model_plugin: ModelPl } @@ -445,14 +464,14 @@ class ServerServiceGenerator( } /** Returns a `Writable` comma delimited sequence of `builder_field: None`. */ - private val notSetFields = builderFieldNames.values.map { + private fun notSetFields(): Writable = builderFieldNames.values.map { writable { rustTemplate( "$it: None", *codegenScope, ) } - } + }.join(", ") /** Returns a `Writable` containing the service struct definition and its implementations. */ private fun serviceStruct(): Writable = writable { @@ -463,11 +482,31 @@ class ServerServiceGenerator( /// /// See the [root](crate) documentation for more information. ##[derive(Clone)] - pub struct $serviceName { - router: #{SmithyHttpServer}::routing::RoutingService<#{Router}, #{Protocol}>, + pub struct $serviceName { + // This is the router wrapped by layers. + svc: S, } - + impl $serviceName<()> { + /// Constructs a builder for [`$serviceName`]. + /// You must specify a configuration object holding any plugins and layers that should be applied + /// to the operations in this service. + pub fn builder< + Body, + L, + HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, + ModelPl: #{SmithyHttpServer}::plugin::ModelMarker, + >( + config: ${serviceName}Config, + ) -> $builderName { + $builderName { + #{NotSetFields1:W}, + layer: config.layers, + http_plugin: config.http_plugins, + model_plugin: config.model_plugins, + } + } + /// Constructs a builder for [`$serviceName`]. /// You must specify what plugins should be applied to the operations in this service. /// @@ -476,9 +515,21 @@ class ServerServiceGenerator( /// Check out [`HttpPlugins`](#{SmithyHttpServer}::plugin::HttpPlugins) and /// [`ModelPlugins`](#{SmithyHttpServer}::plugin::ModelPlugins) if you need to apply /// multiple plugins. - pub fn builder_with_plugins(http_plugin: HttpPl, model_plugin: ModelPl) -> $builderName { + ##[deprecated( + since = "0.57.0", + note = "please use the `builder` constructor and register plugins on the `${serviceName}Config` object instead; see https://github.com/awslabs/smithy-rs/discussions/3096" + )] + pub fn builder_with_plugins< + Body, + HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, + ModelPl: #{SmithyHttpServer}::plugin::ModelMarker + >( + http_plugin: HttpPl, + model_plugin: ModelPl + ) -> $builderName { $builderName { - #{NotSetFields:W}, + #{NotSetFields2:W}, + layer: #{Tower}::layer::util::Identity::new(), http_plugin, model_plugin } @@ -487,7 +538,16 @@ class ServerServiceGenerator( /// Constructs a builder for [`$serviceName`]. /// /// Use [`$serviceName::builder_with_plugins`] if you need to specify plugins. - pub fn builder_without_plugins() -> $builderName { + ##[deprecated( + since = "0.57.0", + note = "please use the `builder` constructor instead; see https://github.com/awslabs/smithy-rs/discussions/3096" + )] + pub fn builder_without_plugins() -> $builderName< + Body, + #{Tower}::layer::util::Identity, + #{SmithyHttpServer}::plugin::IdentityPlugin, + #{SmithyHttpServer}::plugin::IdentityPlugin + > { Self::builder_with_plugins(#{SmithyHttpServer}::plugin::IdentityPlugin, #{SmithyHttpServer}::plugin::IdentityPlugin) } } @@ -503,53 +563,85 @@ class ServerServiceGenerator( pub fn into_make_service_with_connect_info(self) -> #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo { #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo::new(self) } - + } + + impl + $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}, + #{Protocol}, + >, + > + { /// Applies a [`Layer`](#{Tower}::Layer) uniformly to all routes. - pub fn layer(self, layer: &L) -> $serviceName + ##[deprecated( + since = "0.57.0", + note = "please add layers to the `${serviceName}Config` object instead; see https://github.com/awslabs/smithy-rs/discussions/3096" + )] + pub fn layer( + self, + layer: &L, + ) -> $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}, + #{Protocol}, + >, + > where - L: #{Tower}::Layer + L: #{Tower}::Layer, { $serviceName { - router: self.router.map(|s| s.layer(layer)) + svc: self.svc.map(|s| s.layer(layer)), } } /// Applies [`Route::new`](#{SmithyHttpServer}::routing::Route::new) to all routes. /// - /// This has the effect of erasing all types accumulated via [`layer`]($serviceName::layer). - pub fn boxed(self) -> $serviceName<#{SmithyHttpServer}::routing::Route> + /// This has the effect of erasing all types accumulated via layers. + pub fn boxed( + self, + ) -> $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}< + #{SmithyHttpServer}::routing::Route, + >, + #{Protocol}, + >, + > where S: #{Tower}::Service< #{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, - Error = std::convert::Infallible>, + Error = std::convert::Infallible, + >, S: Clone + Send + 'static, S::Future: Send + 'static, { - self.layer(&#{Tower}::layer::layer_fn(#{SmithyHttpServer}::routing::Route::new)) + self.layer(&::tower::layer::layer_fn( + #{SmithyHttpServer}::routing::Route::new, + )) } } - impl #{Tower}::Service<#{Http}::Request> for $serviceName + impl #{Tower}::Service for $serviceName where - S: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response> + Clone, - RespB: #{HttpBody}::Body + Send + 'static, - RespB::Error: Into> + S: #{Tower}::Service, { - type Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>; + type Response = S::Response; type Error = S::Error; - type Future = #{SmithyHttpServer}::routing::RoutingFuture; + type Future = S::Future; fn poll_ready(&mut self, cx: &mut std::task::Context) -> std::task::Poll> { - self.router.poll_ready(cx) + self.svc.poll_ready(cx) } - fn call(&mut self, request: #{Http}::Request) -> Self::Future { - self.router.call(request) + fn call(&mut self, request: R) -> Self::Future { + self.svc.call(request) } } """, - "NotSetFields" to notSetFields.join(", "), + "NotSetFields1" to notSetFields(), + "NotSetFields2" to notSetFields(), "Router" to protocol.routerType(), "Protocol" to protocol.markerStruct(), *codegenScope, @@ -598,7 +690,7 @@ class ServerServiceGenerator( val version = codegenContext.serviceShape.version?.let { "Some(\"$it\")" } ?: "None" rustTemplate( """ - impl #{SmithyHttpServer}::service::ServiceShape for $serviceName { + impl #{SmithyHttpServer}::service::ServiceShape for $serviceName { const ID: #{SmithyHttpServer}::shape_id::ShapeId = #{SmithyHttpServer}::shape_id::ShapeId::new("$absolute", "$namespace", "$name"); const VERSION: Option<&'static str> = $version; @@ -651,7 +743,9 @@ class ServerServiceGenerator( for ((_, value) in operationStructNames) { rustTemplate( """ - impl #{SmithyHttpServer}::service::ContainsOperation for $serviceName { + impl #{SmithyHttpServer}::service::ContainsOperation + for $serviceName + { const VALUE: Operation = Operation::$value; } """, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt new file mode 100644 index 00000000000..960f9d0df75 --- /dev/null +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt @@ -0,0 +1,144 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.toPascalCase +import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency +import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext + +class ServiceConfigGenerator( + codegenContext: ServerCodegenContext, +) { + private val crateName = codegenContext.moduleUseName() + private val codegenScope = codegenContext.runtimeConfig.let { runtimeConfig -> + val smithyHttpServer = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType() + arrayOf( + "Debug" to RuntimeType.Debug, + "SmithyHttpServer" to smithyHttpServer, + "PluginStack" to smithyHttpServer.resolve("plugin::PluginStack"), + "ModelMarker" to smithyHttpServer.resolve("plugin::ModelMarker"), + "HttpMarker" to smithyHttpServer.resolve("plugin::HttpMarker"), + "Tower" to RuntimeType.Tower, + "Stack" to RuntimeType.Tower.resolve("layer::util::Stack"), + ) + } + private val serviceName = codegenContext.serviceShape.id.name.toPascalCase() + + fun render(writer: RustWriter) { + writer.rustTemplate( + """ + /// Configuration for the [`$serviceName`]. This is the central place where to register and + /// configure [`#{Tower}::Layer`]s, HTTP plugins, and model plugins. + /// + /// ```rust,no_run + /// ## use $crateName::${serviceName}Config; + /// ## use #{SmithyHttpServer}::plugin::IdentityPlugin; + /// ## use #{Tower}::layer::util::Identity; + /// ## let authentication_plugin = IdentityPlugin; + /// ## let authorization_plugin = IdentityPlugin; + /// ## let server_request_id_provider_layer = Identity::new(); + /// let config = ${serviceName}Config::builder() + /// // Layers get executed first... + /// .layer(server_request_id_provider_layer) + /// // ...then HTTP plugins... + /// .http_plugin(authentication_plugin) + /// // ...and right after deserialization, model plugins. + /// .model_plugin(authorization_plugin) + /// .build(); + /// ``` + /// + /// See the [`plugin`] system for details. + /// + /// [`plugin`]: #{SmithyHttpServer}::plugin + ##[derive(#{Debug})] + pub struct ${serviceName}Config { + layers: L, + http_plugins: H, + model_plugins: M, + } + + impl ${serviceName}Config<(), (), ()> { + /// Returns a builder to construct the configuration. + pub fn builder() -> ${serviceName}ConfigBuilder< + #{Tower}::layer::util::Identity, + #{SmithyHttpServer}::plugin::IdentityPlugin, + #{SmithyHttpServer}::plugin::IdentityPlugin, + > { + ${serviceName}ConfigBuilder { + layers: #{Tower}::layer::util::Identity::new(), + http_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin, + model_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin, + } + } + } + + /// Builder returned by [`${serviceName}Config::builder()`]. + ##[derive(#{Debug})] + pub struct ${serviceName}ConfigBuilder { + pub(crate) layers: L, + pub(crate) http_plugins: H, + pub(crate) model_plugins: M, + } + + impl ${serviceName}ConfigBuilder { + /// Add a [`#{Tower}::Layer`] to the service. + pub fn layer(self, layer: NewLayer) -> ${serviceName}ConfigBuilder<#{Stack}, H, M> { + ${serviceName}ConfigBuilder { + layers: #{Stack}::new(layer, self.layers), + http_plugins: self.http_plugins, + model_plugins: self.model_plugins, + } + } + + /// Add a HTTP [plugin] to the service. + /// + /// [plugin]: #{SmithyHttpServer}::plugin + // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn http_plugin( + self, + http_plugin: NewPlugin, + ) -> ${serviceName}ConfigBuilder, M> { + ${serviceName}ConfigBuilder { + layers: self.layers, + http_plugins: #{PluginStack}::new(http_plugin, self.http_plugins), + model_plugins: self.model_plugins, + } + } + + /// Add a model [plugin] to the service. + /// + /// [plugin]: #{SmithyHttpServer}::plugin + // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn model_plugin( + self, + model_plugin: NewPlugin, + ) -> ${serviceName}ConfigBuilder> { + ${serviceName}ConfigBuilder { + layers: self.layers, + http_plugins: self.http_plugins, + model_plugins: #{PluginStack}::new(model_plugin, self.model_plugins), + } + } + + /// Build the configuration. + pub fn build(self) -> super::${serviceName}Config { + super::${serviceName}Config { + layers: self.layers, + http_plugins: self.http_plugins, + model_plugins: self.model_plugins, + } + } + } + """, + *codegenScope, + ) + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index 4327c8de20a..c72b99575ac 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -467,7 +467,8 @@ class ServerProtocolTestGenerator( """ ##[allow(unused_mut)] let (sender, mut receiver) = #{Tokio}::sync::mpsc::channel(1); - let service = crate::service::$serviceName::builder_without_plugins::<#{Hyper}::body::Body>() + let config = crate::service::${serviceName}Config::builder().build(); + let service = crate::service::$serviceName::builder::<#{Hyper}::body::Body, _, _, _>(config) .$operationName(move |input: $inputT| { let sender = sender.clone(); async move { diff --git a/design/src/server/anatomy.md b/design/src/server/anatomy.md index d15f4fbcc04..51462028779 100644 --- a/design/src/server/anatomy.md +++ b/design/src/server/anatomy.md @@ -41,24 +41,27 @@ service PokemonService { Smithy Rust will use this model to produce the following API: -```rust +```rust,no_run # extern crate pokemon_service_server_sdk; # extern crate aws_smithy_http_server; -# use pokemon_service_server_sdk::{input::*, output::*, error::*, operation_shape::*, PokemonService}; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +# use pokemon_service_server_sdk::{input::*, output::*, error::*, operation_shape::*, PokemonServiceConfig, PokemonService}; // A handler for the `GetPokemonSpecies` operation (the `PokemonSpecies` resource). async fn get_pokemon_species(input: GetPokemonSpeciesInput) -> Result { todo!() } +let config = PokemonServiceConfig::builder().build(); + // Use the service builder to create `PokemonService`. -let pokemon_service = PokemonService::builder_without_plugins() +let pokemon_service = PokemonService::builder(config) // Pass the handler directly to the service builder... .get_pokemon_species(get_pokemon_species) /* other operation setters */ .build() - # ; Result::<(), ()>::Ok(()) .expect("failed to create an instance of the Pokémon service"); -# let pokemon_service: Result, _> = pokemon_service; +# let pokemon_service: PokemonService, RestJson1>> = pokemon_service; ``` ## Operations @@ -463,7 +466,9 @@ stateDiagram-v2 S --> [*]: HTTP Response ``` -The service builder API requires plugins to be specified upfront - they must be passed as an argument to `builder_with_plugins` and cannot be modified afterwards. +The service builder API requires plugins to be specified upfront - they must be +registered in the config object, which is passed as an argument to `builder`. +Plugins cannot be modified afterwards. You might find yourself wanting to apply _multiple_ plugins to your service. This can be accommodated via [`HttpPlugins`] and [`ModelPlugins`]. @@ -510,7 +515,7 @@ let http_plugins = HttpPlugins::new() The service builder is the primary public API, generated for every [Smithy Service](https://awslabs.github.io/smithy/2.0/spec/service-types.html). At a high-level, the service builder takes as input a function for each Smithy Operation and returns a single HTTP service. The signature of each function, also known as _handlers_, must match the constraints of the corresponding Smithy model. -You can create an instance of a service builder by calling either `builder_without_plugins` or `builder_with_plugins` on the corresponding service struct. +You can create an instance of a service builder by calling `builder` on the corresponding service struct. ```rust # extern crate aws_smithy_http_server; diff --git a/design/src/server/instrumentation.md b/design/src/server/instrumentation.md index 08c72a20980..ac5c2c56a44 100644 --- a/design/src/server/instrumentation.md +++ b/design/src/server/instrumentation.md @@ -68,15 +68,18 @@ use aws_smithy_http_server::{ instrumentation::InstrumentExt, plugin::{IdentityPlugin, HttpPlugins} }; -use pokemon_service_server_sdk::PokemonService; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +use pokemon_service_server_sdk::{PokemonServiceConfig, PokemonService}; let http_plugins = HttpPlugins::new().instrument(); -let app = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) +let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build(); +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` diff --git a/design/src/server/middleware.md b/design/src/server/middleware.md index af394b1bcaa..589fb0770ca 100644 --- a/design/src/server/middleware.md +++ b/design/src/server/middleware.md @@ -147,16 +147,20 @@ The output of the Smithy service builder provides the user with a `Service Layer for TimeoutLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } # use pokemon_service_server_sdk::{input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; -use pokemon_service_server_sdk::PokemonService; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +use pokemon_service_server_sdk::{PokemonServiceConfig, PokemonService}; use tower::Layer; +let config = PokemonServiceConfig::builder().build(); + // This is a HTTP `Service`. -let app /* : PokemonService> */ = PokemonService::builder_without_plugins() +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; // Construct `TimeoutLayer`. let timeout_layer = TimeoutLayer::new(Duration::from_secs(3)); @@ -167,7 +171,9 @@ let app = timeout_layer.layer(app); ### B. Route Middleware -A _single_ layer can be applied to _all_ routes inside the `Router`. This exists as a method on the output of the service builder. +A _single_ layer can be applied to _all_ routes inside the `Router`. This +exists as a method on the `PokemonServiceConfig` builder object, which is passed into the +service builder. ```rust,no_run # extern crate tower; @@ -175,25 +181,26 @@ A _single_ layer can be applied to _all_ routes inside the `Router`. This exists # extern crate aws_smithy_http_server; # use tower::{util::service_fn, Layer}; # use std::time::Duration; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; # use pokemon_service_server_sdk::{input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; # struct MetricsLayer; # impl MetricsLayer { pub fn new() -> Self { Self } } # impl Layer for MetricsLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; // Construct `MetricsLayer`. let metrics_layer = MetricsLayer::new(); -let app /* : PokemonService> */ = PokemonService::builder_without_plugins() +let config = PokemonServiceConfig::builder().layer(metrics_layer).build(); + +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() - .unwrap() - # ; let app: PokemonService = app; - # app - // Apply HTTP logging after routing. - .layer(&metrics_layer); + .unwrap(); +# let app: PokemonService, RestJson1>> = app; ``` Note that requests pass through this middleware immediately _after_ routing succeeds and therefore will _not_ be encountered if routing fails. This means that the [TraceLayer](https://docs.rs/tower-http/latest/tower_http/trace/struct.TraceLayer.html) in the example above does _not_ provide logs unless routing has completed. This contrasts to [middleware A](#a-outer-middleware), which _all_ requests/responses pass through when entering/leaving the service. @@ -209,12 +216,14 @@ A "HTTP layer" can be applied to specific operations. # use tower::{util::service_fn, Layer}; # use std::time::Duration; # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; # use aws_smithy_http_server::{operation::OperationShapeExt, plugin::*, operation::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; # struct LoggingLayer; # impl LoggingLayer { pub fn new() -> Self { Self } } # impl Layer for LoggingLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } -use pokemon_service_server_sdk::{PokemonService, scope}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig, scope}; scope! { /// Only log on `GetPokemonSpecies` and `GetStorage` @@ -228,12 +237,14 @@ let logging_plugin = LayerPlugin(LoggingLayer::new()); let logging_plugin = Scoped::new::(logging_plugin); let http_plugins = HttpPlugins::new().push(logging_plugin); -let app /* : PokemonService> */ = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) +let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build(); + +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` This middleware transforms the operations HTTP requests and responses. @@ -250,10 +261,12 @@ A "model layer" can be applied to specific operations. # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; # use aws_smithy_http_server::{operation::*, plugin::*}; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; # struct BufferLayer; # impl BufferLayer { pub fn new(size: usize) -> Self { Self } } # impl Layer for BufferLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } -use pokemon_service_server_sdk::{PokemonService, scope}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig, scope}; scope! { /// Only buffer on `GetPokemonSpecies` and `GetStorage` @@ -265,14 +278,14 @@ scope! { // Construct `BufferLayer`. let buffer_plugin = LayerPlugin(BufferLayer::new(3)); let buffer_plugin = Scoped::new::(buffer_plugin); -let model_plugins = ModelPlugins::new().push(buffer_plugin); +let config = PokemonServiceConfig::builder().model_plugin(buffer_plugin).build(); -let app /* : PokemonService> */ = PokemonService::builder_with_plugins(IdentityPlugin, model_plugins) +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` In contrast to [position C](#c-operation-specific-http-middleware), this middleware transforms the operations modelled inputs to modelled outputs. @@ -283,7 +296,7 @@ Suppose we want to apply a different `Layer` to every operation. In this case, p Consider the following middleware: -```rust +```rust,no_run # extern crate aws_smithy_http_server; # extern crate tower; use aws_smithy_http_server::shape_id::ShapeId; @@ -320,7 +333,7 @@ The plugin system provides a way to construct then apply `Layer`s in position [C An example of a `PrintPlugin` which prints the operation name: -```rust +```rust,no_run # extern crate aws_smithy_http_server; # use aws_smithy_http_server::shape_id::ShapeId; # pub struct PrintService { inner: S, operation_id: ShapeId, service_id: ShapeId } @@ -349,7 +362,7 @@ where You can provide a custom method to add your plugin to a collection of `HttpPlugins` or `ModelPlugins` via an extension trait. For example, for `HttpPlugins`: -```rust +```rust,no_run # extern crate aws_smithy_http_server; # pub struct PrintPlugin; # impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { } @@ -383,19 +396,22 @@ This allows for: # impl PrintExt for HttpPlugins { fn print(self) -> HttpPlugins> { self.push(PrintPlugin) }} # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; use aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins}; -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; let http_plugins = HttpPlugins::new() // [..other plugins..] // The custom method! .print(); -let app /* : PokemonService> */ = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) +let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build(); +let app /* : PokemonService> */ = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` The custom `print` method hides the details of the `Plugin` trait from the average consumer. diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index bf09387d375..4a7bb037511 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -10,7 +10,8 @@ use std::{ task::{Context, Poll}, }; -use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, IdentityPlugin, Plugin}; +use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, Plugin}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; use tower::{Layer, Service}; use aws_smithy_runtime::client::http::test_util::capture_request; @@ -26,12 +27,12 @@ async fn plugin_layers_are_executed_in_registration_order() { let http_plugins = HttpPlugins::new() .push(SentinelPlugin::new("first", output.clone())) .push(SentinelPlugin::new("second", output.clone())); - let mut app = pokemon_service_server_sdk::PokemonService::builder_with_plugins( - http_plugins, - IdentityPlugin, - ) - .do_nothing(do_nothing) - .build_unchecked(); + let config = PokemonServiceConfig::builder() + .http_plugin(http_plugins) + .build(); + let mut app = PokemonService::builder(config) + .do_nothing(do_nothing) + .build_unchecked(); let request = { let (http_client, rcvr) = capture_request(None); @@ -74,7 +75,6 @@ impl Plugin for SentinelPlugin { impl HttpMarker for SentinelPlugin {} -/// A [`Service`] that adds a print log. #[derive(Clone, Debug)] pub struct SentinelService { inner: S, @@ -100,7 +100,6 @@ where } } -/// A [`Layer`] which constructs the [`PrintService`]. #[derive(Debug)] pub struct SentinelLayer { name: &'static str, diff --git a/examples/pokemon-service-lambda/src/main.rs b/examples/pokemon-service-lambda/src/main.rs index 2f08e072b56..6f581158660 100644 --- a/examples/pokemon-service-lambda/src/main.rs +++ b/examples/pokemon-service-lambda/src/main.rs @@ -12,13 +12,17 @@ use pokemon_service_common::{ setup_tracing, stream_pokemon_radio, State, }; use pokemon_service_lambda::get_storage_lambda; -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; #[tokio::main] pub async fn main() { setup_tracing(); - let app = PokemonService::builder_without_plugins() + let config = PokemonServiceConfig::builder() + // Set up shared state and middlewares. + .layer(AddExtensionLayer::new(Arc::new(State::default()))) + .build(); + let app = PokemonService::builder(config) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. @@ -30,9 +34,7 @@ pub async fn main() { .check_health(check_health) .stream_pokemon_radio(stream_pokemon_radio) .build() - .expect("failed to build an instance of PokemonService") - // Set up shared state and middlewares. - .layer(&AddExtensionLayer::new(Arc::new(State::default()))); + .expect("failed to build an instance of PokemonService"); let handler = LambdaHandler::new(app); let lambda = lambda_http::run(handler); diff --git a/examples/pokemon-service-tls/src/main.rs b/examples/pokemon-service-tls/src/main.rs index a67d1450422..45d6964686b 100644 --- a/examples/pokemon-service-tls/src/main.rs +++ b/examples/pokemon-service-tls/src/main.rs @@ -36,7 +36,7 @@ use pokemon_service_common::{ capture_pokemon, check_health, do_nothing, get_pokemon_species, get_server_statistics, get_storage, setup_tracing, stream_pokemon_radio, State, }; -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; use pokemon_service_tls::{DEFAULT_ADDRESS, DEFAULT_PORT, DEFAULT_TEST_CERT, DEFAULT_TEST_KEY}; #[derive(Parser, Debug)] @@ -61,7 +61,11 @@ pub async fn main() { let args = Args::parse(); setup_tracing(); - let app = PokemonService::builder_without_plugins() + let config = PokemonServiceConfig::builder() + // Set up shared state and middlewares. + .layer(AddExtensionLayer::new(Arc::new(State::default()))) + .build(); + let app = PokemonService::builder(config) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. @@ -73,9 +77,7 @@ pub async fn main() { .check_health(check_health) .stream_pokemon_radio(stream_pokemon_radio) .build() - .expect("failed to build an instance of PokemonService") - // Set up shared state and middlewares. - .layer(&AddExtensionLayer::new(Arc::new(State::default()))); + .expect("failed to build an instance of PokemonService"); let addr: SocketAddr = format!("{}:{}", args.address, args.port) .parse() diff --git a/examples/pokemon-service/src/main.rs b/examples/pokemon-service/src/main.rs index b4198fdf3d3..97d93378ff1 100644 --- a/examples/pokemon-service/src/main.rs +++ b/examples/pokemon-service/src/main.rs @@ -28,7 +28,7 @@ use pokemon_service_common::{ capture_pokemon, check_health, get_pokemon_species, get_server_statistics, setup_tracing, stream_pokemon_radio, State, }; -use pokemon_service_server_sdk::{scope, PokemonService}; +use pokemon_service_server_sdk::{scope, PokemonService, PokemonServiceConfig}; use crate::authz::AuthorizationPlugin; @@ -49,15 +49,15 @@ pub async fn main() { setup_tracing(); scope! { - /// A scope containing `GetPokemonSpecies` and `GetStorage` + /// A scope containing `GetPokemonSpecies` and `GetStorage`. struct PrintScope { includes: [GetPokemonSpecies, GetStorage] } } - // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope` + // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope`. let print_plugin = Scoped::new::(HttpPlugins::new().print()); - let plugins = HttpPlugins::new() + let http_plugins = HttpPlugins::new() // Apply the scoped `PrintPlugin` .push(print_plugin) // Apply the `OperationExtensionPlugin` defined in `aws_smithy_http_server::extension`. This allows other @@ -70,7 +70,20 @@ pub async fn main() { let authz_plugin = AuthorizationPlugin::new(); let model_plugins = ModelPlugins::new().push(authz_plugin); - let app = PokemonService::builder_with_plugins(plugins, model_plugins) + let config = PokemonServiceConfig::builder() + // Set up shared state and middlewares. + .layer(AddExtensionLayer::new(Arc::new(State::default()))) + // Handle `/ping` health check requests. + .layer(AlbHealthCheckLayer::from_handler("/ping", |_req| async { + StatusCode::OK + })) + // Add server request IDs. + .layer(ServerRequestIdProviderLayer::new()) + .http_plugin(http_plugins) + .model_plugin(model_plugins) + .build(); + + let app = PokemonService::builder(config) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. @@ -84,16 +97,6 @@ pub async fn main() { .build() .expect("failed to build an instance of PokemonService"); - let app = app - // Setup shared state and middlewares. - .layer(&AddExtensionLayer::new(Arc::new(State::default()))) - // Handle `/ping` health check requests. - .layer(&AlbHealthCheckLayer::from_handler("/ping", |_req| async { - StatusCode::OK - })) - // Add server request IDs. - .layer(&ServerRequestIdProviderLayer::new()); - // Using `into_make_service_with_connect_info`, rather than `into_make_service`, to adjoin the `SocketAddr` // connection info. let make_app = app.into_make_service_with_connect_info::(); diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs b/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs index 63aece88a62..c8369a66bf4 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs @@ -11,8 +11,6 @@ use crate::plugin::{IdentityPlugin, Plugin, PluginStack}; use super::{HttpMarker, LayerPlugin}; /// A wrapper struct for composing HTTP plugins. -/// It can be used as input for the `builder_with_plugins` method on the generated service struct -/// (e.g. `PokemonService::builder_with_plugins`). /// /// ## Applying plugins in a sequence /// diff --git a/rust-runtime/aws-smithy-http-server/src/request/request_id.rs b/rust-runtime/aws-smithy-http-server/src/request/request_id.rs index 7d6ee70ab71..a97288841cc 100644 --- a/rust-runtime/aws-smithy-http-server/src/request/request_id.rs +++ b/rust-runtime/aws-smithy-http-server/src/request/request_id.rs @@ -32,13 +32,14 @@ //! todo!() //! } //! -//! let app = Service::builder_without_plugins() +//! let config = ServiceConfig::builder() +//! // Generate a server request ID and add it to the response header. +//! .layer(ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static("x-request-id"))) +//! .build(); +//! let app = Service::builder(config) //! .operation(handler) //! .build().unwrap(); //! -//! let app = app -//! .layer(&ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static("x-request-id"))); /* Generate a server request ID and add it to the response header */ -//! //! let bind: std::net::SocketAddr = format!("{}:{}", args.address, args.port) //! .parse() //! .expect("unable to parse the server bind address and port"); From 22de9706f0e61fa897a49e213219746edeb46a80 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 30 Oct 2023 14:10:08 -0400 Subject: [PATCH 208/331] Update publisher (#3110) ## Motivation and Context The publisher failed because a dependency was yanked. Update to use newer version of dep & support workspace-level settings in the future. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/publisher/Cargo.lock | 93 ++++++++++++++++++++++--- tools/ci-build/publisher/Cargo.toml | 2 +- tools/ci-build/publisher/src/package.rs | 8 ++- 3 files changed, 89 insertions(+), 14 deletions(-) diff --git a/tools/ci-build/publisher/Cargo.lock b/tools/ci-build/publisher/Cargo.lock index 4ac8cf16e6d..e77a1dfb263 100644 --- a/tools/ci-build/publisher/Cargo.lock +++ b/tools/ci-build/publisher/Cargo.lock @@ -133,13 +133,12 @@ checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cargo_toml" -version = "0.10.3" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "363c7cfaa15f101415c4ac9e68706ca4a2277773932828b33f96e59d28c68e62" +checksum = "e3f9629bc6c4388ea699781dc988c2b99766d7679b151c81990b4fa1208fafd3" dependencies = [ "serde", - "serde_derive", - "toml", + "toml 0.8.6", ] [[package]] @@ -175,7 +174,7 @@ dependencies = [ "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "lazy_static", "strsim", "termcolor", @@ -314,6 +313,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.1" @@ -494,7 +499,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -521,6 +526,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" + [[package]] name = "heck" version = "0.4.1" @@ -636,7 +647,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +dependencies = [ + "equivalent", + "hashbrown 0.14.2", ] [[package]] @@ -1011,7 +1032,7 @@ dependencies = [ "tempfile", "thiserror", "tokio", - "toml", + "toml 0.5.11", "tracing", "tracing-subscriber", ] @@ -1215,6 +1236,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1297,7 +1327,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "toml", + "toml 0.5.11", "tracing", ] @@ -1483,10 +1513,44 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap", + "indexmap 1.9.3", "serde", ] +[[package]] +name = "toml" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.0.2", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -1817,6 +1881,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winnow" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" diff --git a/tools/ci-build/publisher/Cargo.toml b/tools/ci-build/publisher/Cargo.toml index 772b80ae0d5..a1ccf3bb94a 100644 --- a/tools/ci-build/publisher/Cargo.toml +++ b/tools/ci-build/publisher/Cargo.toml @@ -17,7 +17,7 @@ opt-level = 0 anyhow = "1.0" async-recursion = "0.3.2" async-trait = "0.1.51" -cargo_toml = "0.10.1" +cargo_toml = "0.16.3" clap = { version = "~3.1.18", features = ["derive"] } crates_io_api = "0.7.3" dialoguer = "0.8" diff --git a/tools/ci-build/publisher/src/package.rs b/tools/ci-build/publisher/src/package.rs index a19f8eee64e..88fa04d6cfe 100644 --- a/tools/ci-build/publisher/src/package.rs +++ b/tools/ci-build/publisher/src/package.rs @@ -289,6 +289,7 @@ fn read_dependencies( result.push(PackageHandle::new(name, version)); } } + Dependency::Inherited(_) => panic!("workspace deps are unsupported"), } } Ok(result) @@ -299,13 +300,14 @@ fn read_package( path: &Path, manifest_bytes: &[u8], ) -> Result> { - let manifest = Manifest::from_slice(manifest_bytes) + let mut manifest = Manifest::from_slice(manifest_bytes) .with_context(|| format!("failed to load package manifest for {:?}", path))?; + manifest.complete_from_path(path)?; if let Some(package) = manifest.package { let name = package.name; - let version = parse_version::

(path, &package.version)?; + let version = parse_version::

(path, &package.version.unwrap())?; let handle = PackageHandle::new(name, version); - let publish = match package.publish { + let publish = match package.publish.unwrap() { cargo_toml::Publish::Flag(true) => Publish::Allowed, _ => Publish::NotAllowed, }; From b6841826af9d15a934dec637cd102cb8863f9e57 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 30 Oct 2023 17:41:12 -0400 Subject: [PATCH 209/331] Enable the tokio-rt feature for generated crates when bytestream is used (#3113) ## Motivation and Context Fix issue where `ByteStream::from_path` was unusable by without enabling features ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 --- .../s3/tests/client_construction.rs | 5 ++++ .../customize/RequiredCustomizations.kt | 2 +- .../customizations/SmithyTypesPubUseExtra.kt | 11 +++++++- .../SmithyTypesPubUseExtraTest.kt | 25 ++++++++++++++++++- .../ServerRequiredCustomizations.kt | 2 +- 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/aws/sdk/integration-tests/s3/tests/client_construction.rs b/aws/sdk/integration-tests/s3/tests/client_construction.rs index e7dbc11ce6f..4f0608a3d78 100644 --- a/aws/sdk/integration-tests/s3/tests/client_construction.rs +++ b/aws/sdk/integration-tests/s3/tests/client_construction.rs @@ -26,6 +26,11 @@ mod with_sdk_config { assert!(config.retry_config().is_none()); let _s3 = s3::Client::new(&config); } + + #[test] + fn bytestream_from_path_exists() { + let _ = aws_sdk_s3::primitives::ByteStream::from_path("a/b.txt"); + } } mod with_service_config { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 63c87b39ec9..aa3e39ad4ec 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -86,7 +86,7 @@ class RequiredCustomizations : ClientCodegenDecorator { ResiliencyReExportCustomization(codegenContext).extras(rustCrate) rustCrate.withModule(ClientRustModule.Primitives) { - pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) + pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this) } rustCrate.withModule(ClientRustModule.Error) { rustTemplate( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt index d59b4a96231..1d013a645a8 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt @@ -8,11 +8,13 @@ package software.amazon.smithy.rust.codegen.core.smithy.customizations import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember @@ -41,7 +43,7 @@ private fun hasBlobs(model: Model): Boolean = structUnionMembersMatchPredicate(m private fun hasDateTimes(model: Model): Boolean = structUnionMembersMatchPredicate(model, Shape::isTimestampShape) /** Adds re-export statements for Smithy primitives */ -fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model): Writable = writable { +fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model, rustCrate: RustCrate): Writable = writable { val rc = codegenContext.runtimeConfig if (hasBlobs(model)) { rustTemplate("pub use #{Blob};", "Blob" to RuntimeType.blob(rc)) @@ -57,6 +59,13 @@ fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model): Writab ) } if (hasStreamingOperations(model)) { + rustCrate.mergeFeature( + Feature( + "rt-tokio", + true, + listOf("aws-smithy-types/rt-tokio"), + ), + ) rustTemplate( """ pub use #{ByteStream}; diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt index 62a54905afe..f9eda03a43f 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt @@ -8,8 +8,11 @@ package software.amazon.smithy.rust.codegen.core.smithy.customizations import org.junit.jupiter.api.Test import software.amazon.smithy.model.Model import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGeneratorTest.Companion.model import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext import software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext class SmithyTypesPubUseExtraTest { @@ -43,6 +46,22 @@ class SmithyTypesPubUseExtraTest { """.asSmithyModel() } + private val rustCrate: RustCrate + private val codegenContext: CodegenContext = testCodegenContext(model) + + init { + val (context, _) = generatePluginContext( + model, + runtimeConfig = codegenContext.runtimeConfig, + ) + rustCrate = RustCrate( + context.fileManifest, + codegenContext.symbolProvider, + codegenContext.settings.codegenConfig, + codegenContext.expectModuleDocProvider(), + ) + } + private fun reexportsWithEmptyModel() = reexportsWithMember() private fun reexportsWithMember( inputMember: String = "", @@ -50,7 +69,11 @@ class SmithyTypesPubUseExtraTest { unionMember: String = "", additionalShape: String = "", ) = RustWriter.root().let { writer -> - pubUseSmithyPrimitives(testCodegenContext(model), modelWithMember(inputMember, outputMember, unionMember, additionalShape))(writer) + pubUseSmithyPrimitives( + codegenContext, + modelWithMember(inputMember, outputMember, unionMember, additionalShape), + rustCrate, + )(writer) writer.toString() } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index 1117cd1d163..7823c53326d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -47,7 +47,7 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { ) rustCrate.withModule(ServerRustModule.Types) { - pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) + pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this) rustTemplate( """ pub use #{DisplayErrorContext}; From a9b9cbab718c45a1f481acbb14ef7723836283b4 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Mon, 30 Oct 2023 19:35:23 -0500 Subject: [PATCH 210/331] Add new MRAP test to S3 canary (#3109) This PR also replaces the `2023_09_25` canary with current release *(`2023_10_26`)* ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-cdk/canary-lambda/README.md | 1 + tools/ci-cdk/canary-lambda/src/canary.rs | 6 + .../src/latest/paginator_canary.rs | 4 +- .../canary-lambda/src/latest/s3_canary.rs | 126 ++++++++++++++---- tools/ci-cdk/canary-lambda/src/main.rs | 10 +- ...se_2023_09_25.rs => release_2023_10_26.rs} | 0 .../paginator_canary.rs | 5 +- .../s3_canary.rs | 0 .../transcribe_canary.rs | 0 .../ci-cdk/canary-runner/src/build_bundle.rs | 12 +- tools/ci-cdk/canary-runner/src/run.rs | 25 +++- tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts | 27 +++- tools/ci-cdk/package-lock.json | 90 ++++++------- tools/ci-cdk/package.json | 7 +- 14 files changed, 221 insertions(+), 92 deletions(-) rename tools/ci-cdk/canary-lambda/src/{release_2023_09_25.rs => release_2023_10_26.rs} (100%) rename tools/ci-cdk/canary-lambda/src/{release_2023_09_25 => release_2023_10_26}/paginator_canary.rs (93%) rename tools/ci-cdk/canary-lambda/src/{release_2023_09_25 => release_2023_10_26}/s3_canary.rs (100%) rename tools/ci-cdk/canary-lambda/src/{release_2023_09_25 => release_2023_10_26}/transcribe_canary.rs (100%) diff --git a/tools/ci-cdk/canary-lambda/README.md b/tools/ci-cdk/canary-lambda/README.md index f99c2c14345..a89b6556928 100644 --- a/tools/ci-cdk/canary-lambda/README.md +++ b/tools/ci-cdk/canary-lambda/README.md @@ -34,6 +34,7 @@ invoke the canary: ```bash export CANARY_S3_BUCKET_NAME= +export CANARY_S3_MRAP_BUCKET_ARN= # run with `--all-features` so you run all canaries (including canaries that don't work against older versions) cargo run --all-features -- --local ``` diff --git a/tools/ci-cdk/canary-lambda/src/canary.rs b/tools/ci-cdk/canary-lambda/src/canary.rs index abb37ee6e2f..137b8f64a91 100644 --- a/tools/ci-cdk/canary-lambda/src/canary.rs +++ b/tools/ci-cdk/canary-lambda/src/canary.rs @@ -50,6 +50,7 @@ pub fn get_canaries_to_run( pub struct CanaryEnv { pub(crate) s3_bucket_name: String, + pub(crate) s3_mrap_bucket_arn: String, pub(crate) expected_transcribe_result: String, #[allow(dead_code)] pub(crate) page_size: usize, @@ -59,6 +60,7 @@ impl fmt::Debug for CanaryEnv { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("CanaryEnv") .field("s3_bucket_name", &"*** redacted ***") + .field("s3_mrap_bucket_arn", &"*** redacted ***") .field( "expected_transcribe_result", &self.expected_transcribe_result, @@ -72,6 +74,9 @@ impl CanaryEnv { // S3 bucket name to test against let s3_bucket_name = env::var("CANARY_S3_BUCKET_NAME").expect("CANARY_S3_BUCKET_NAME must be set"); + // S3 MRAP bucket name to test against + let s3_mrap_bucket_arn = + env::var("CANARY_S3_MRAP_BUCKET_ARN").expect("CANARY_S3_MRAP_BUCKET_ARN must be set"); // Expected transcription from Amazon Transcribe from the embedded audio file. // This is an environment variable so that the code doesn't need to be changed if @@ -89,6 +94,7 @@ impl CanaryEnv { Self { s3_bucket_name, + s3_mrap_bucket_arn, expected_transcribe_result, page_size, } diff --git a/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs index 11914660ada..744b6614654 100644 --- a/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs @@ -38,7 +38,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: } num_pages += 1; } - if dbg!(num_pages) < 2 { + if num_pages < 2 { bail!( "expected 3+ pages containing ~60 results but got {} pages", num_pages @@ -59,7 +59,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: #[cfg(test)] mod test { - use crate::latest::paginator_canary::paginator_canary; + use super::paginator_canary; #[tokio::test] async fn test_paginator() { diff --git a/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs index fbcba976d86..ac5d92d82d4 100644 --- a/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs @@ -8,6 +8,7 @@ use crate::{mk_canary, CanaryEnv}; use anyhow::Context; use aws_config::SdkConfig; use aws_sdk_s3 as s3; +use s3::config::Region; use s3::presigning::PresigningConfig; use s3::primitives::ByteStream; use std::time::Duration; @@ -17,10 +18,15 @@ const METADATA_TEST_VALUE: &str = "some value"; mk_canary!("s3", |sdk_config: &SdkConfig, env: &CanaryEnv| s3_canary( s3::Client::new(sdk_config), - env.s3_bucket_name.clone() + env.s3_bucket_name.clone(), + env.s3_mrap_bucket_arn.clone() )); -pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Result<()> { +pub async fn s3_canary( + client: s3::Client, + s3_bucket_name: String, + s3_mrap_bucket_arn: String, +) -> anyhow::Result<()> { let test_key = Uuid::new_v4().as_u128().to_string(); // Look for the test object and expect that it doesn't exist @@ -82,39 +88,104 @@ pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Re return Err(CanaryError(format!("presigned URL returned bad data: {:?}", response)).into()); } - let mut result = Ok(()); - match output.metadata() { - Some(map) => { - // Option::as_deref doesn't work here since the deref of &String is String - let value = map.get("something").map(|s| s.as_str()).unwrap_or(""); - if value != METADATA_TEST_VALUE { - result = Err(CanaryError(format!( + let metadata_value = output + .metadata() + .and_then(|m| m.get("something")) + .map(String::as_str); + let result: anyhow::Result<()> = match metadata_value { + Some(value) => { + if value == METADATA_TEST_VALUE { + let payload = output + .body + .collect() + .await + .context("download s3::GetObject[2] body")? + .into_bytes(); + if std::str::from_utf8(payload.as_ref()).context("s3 payload")? == "test" { + Ok(()) + } else { + Err(CanaryError("S3 object body didn't match what was put there".into()).into()) + } + } else { + Err(CanaryError(format!( "S3 metadata was incorrect. Expected `{}` but got `{}`.", METADATA_TEST_VALUE, value )) - .into()); + .into()) } } - None => { - result = Err(CanaryError("S3 metadata was missing".into()).into()); - } - } + None => Err(CanaryError("S3 metadata was missing".into()).into()), + }; - let payload = output - .body - .collect() + // Delete the test object + client + .delete_object() + .bucket(&s3_bucket_name) + .key(&test_key) + .send() .await - .context("download s3::GetObject[2] body")? - .into_bytes(); - if std::str::from_utf8(payload.as_ref()).context("s3 payload")? != "test" { - result = Err(CanaryError("S3 object body didn't match what was put there".into()).into()); - } + .context("s3::DeleteObject")?; + + // Return early if the result is an error + result?; + + // We deliberately use a region that doesn't exist here so that we can + // ensure these requests are SigV4a requests. Because the current endpoint + // resolver always resolves the wildcard region ('*') for SigV4a requests, + // setting a fictitious region ensures that the request would fail if it was + // a SigV4 request. Therefore, because the request doesn't fail, we can be + // sure it's a successful Sigv4a request. + let config_override = s3::Config::builder().region(Region::new("parts-unknown")); + // Put the test object + client + .put_object() + .bucket(&s3_mrap_bucket_arn) + .key(&test_key) + .body(ByteStream::from_static(b"test")) + .metadata("something", METADATA_TEST_VALUE) + .customize() + .config_override(config_override.clone()) + .send() + .await + .context("s3::PutObject[MRAP]")?; + + // Get the test object and verify it looks correct + let output = client + .get_object() + .bucket(&s3_mrap_bucket_arn) + .key(&test_key) + .customize() + .config_override(config_override.clone()) + .send() + .await + .context("s3::GetObject[MRAP]")?; + + let metadata_value = output + .metadata() + .and_then(|m| m.get("something")) + .map(String::as_str); + let result = match metadata_value { + Some(value) => { + if value == METADATA_TEST_VALUE { + Ok(()) + } else { + Err(CanaryError(format!( + "S3 metadata was incorrect. Expected `{}` but got `{}`.", + METADATA_TEST_VALUE, value + )) + .into()) + } + } + None => Err(CanaryError("S3 metadata was missing".into()).into()), + }; // Delete the test object client .delete_object() - .bucket(&s3_bucket_name) + .bucket(&s3_mrap_bucket_arn) .key(&test_key) + .customize() + .config_override(config_override) .send() .await .context("s3::DeleteObject")?; @@ -123,8 +194,12 @@ pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Re } // This test runs against an actual AWS account. Comment out the `ignore` to run it. -// Be sure to set the `TEST_S3_BUCKET` environment variable to the S3 bucket to use, -// and also make sure the credential profile sets the region (or set `AWS_DEFAULT_PROFILE`). +// Be sure the following environment variables are set: +// +// - `TEST_S3_BUCKET`: The S3 bucket to use +// - `TEST_S3_MRAP_BUCKET_ARN`: The MRAP bucket ARN to use +// +// Also, make sure the correct region (likely `us-west-2`) by the credentials or explictly. #[ignore] #[cfg(test)] #[tokio::test] @@ -134,6 +209,7 @@ async fn test_s3_canary() { s3_canary( client, std::env::var("TEST_S3_BUCKET").expect("TEST_S3_BUCKET must be set"), + std::env::var("TEST_S3_MRAP_BUCKET_ARN").expect("TEST_S3_MRAP_BUCKET_ARN must be set"), ) .await .expect("success"); diff --git a/tools/ci-cdk/canary-lambda/src/main.rs b/tools/ci-cdk/canary-lambda/src/main.rs index 644d7ce7954..9a3d3f40d7b 100644 --- a/tools/ci-cdk/canary-lambda/src/main.rs +++ b/tools/ci-cdk/canary-lambda/src/main.rs @@ -26,11 +26,11 @@ mod latest; #[cfg(feature = "latest")] pub(crate) use latest as current_canary; -// NOTE: This module can be deleted 3 releases after release-2023-09-25 -#[cfg(feature = "release-2023-09-25")] -mod release_2023_09_25; -#[cfg(feature = "release-2023-09-25")] -pub(crate) use release_2023_09_25 as current_canary; +// NOTE: This module can be deleted 3 releases after release-2023-10-26 +#[cfg(feature = "release-2023-10-26")] +mod release_2023_10_26; +#[cfg(feature = "release-2023-10-26")] +pub(crate) use release_2023_10_26 as current_canary; #[tokio::main] async fn main() -> Result<(), Error> { diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_09_25.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_09_25.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_09_25/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs similarity index 93% rename from tools/ci-cdk/canary-lambda/src/release_2023_09_25/paginator_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs index 66df5a03e4e..744b6614654 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_09_25/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs @@ -10,7 +10,6 @@ use aws_sdk_ec2 as ec2; use aws_sdk_ec2::types::InstanceType; use crate::CanaryEnv; -use tokio_stream::StreamExt; mk_canary!( "ec2_paginator", @@ -39,7 +38,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: } num_pages += 1; } - if dbg!(num_pages) < 2 { + if num_pages < 2 { bail!( "expected 3+ pages containing ~60 results but got {} pages", num_pages @@ -60,7 +59,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: #[cfg(test)] mod test { - use crate::current_canary::paginator_canary::paginator_canary; + use super::paginator_canary; #[tokio::test] async fn test_paginator() { diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_09_25/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_09_25/s3_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_09_25/transcribe_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/transcribe_canary.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_09_25/transcribe_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26/transcribe_canary.rs diff --git a/tools/ci-cdk/canary-runner/src/build_bundle.rs b/tools/ci-cdk/canary-runner/src/build_bundle.rs index 6a6408b39ec..00b628f9685 100644 --- a/tools/ci-cdk/canary-runner/src/build_bundle.rs +++ b/tools/ci-cdk/canary-runner/src/build_bundle.rs @@ -66,7 +66,7 @@ const REQUIRED_SDK_CRATES: &[&str] = &[ // The elements in this `Vec` should be sorted in an ascending order by the release date. lazy_static! { static ref NOTABLE_SDK_RELEASE_TAGS: Vec = vec![ - ReleaseTag::from_str("release-2023-09-25").unwrap(), // last version before `Stream` trait removal + ReleaseTag::from_str("release-2023-10-26").unwrap(), // last version before addition of Sigv4a MRAP test ]; } @@ -442,7 +442,7 @@ aws-sdk-transcribestreaming = { path = "some/sdk/path/transcribestreaming" } [features] latest = [] -"release-2023-09-25" = [] +"release-2023-10-26" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::Path("some/sdk/path".into())).expect("success") @@ -506,7 +506,7 @@ aws-sdk-transcribestreaming = "0.16.0" [features] latest = [] -"release-2023-09-25" = [] +"release-2023-10-26" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::VersionsManifest { @@ -585,14 +585,14 @@ default = ["latest"] }), ); assert_eq!( - "release-2023-09-25".to_string(), + "release-2023-10-26".to_string(), enabled_feature(&CrateSource::VersionsManifest { versions: versions.clone(), - release_tag: "release-2023-09-25".parse().unwrap(), + release_tag: "release-2023-10-26".parse().unwrap(), }), ); assert_eq!( - "release-2023-09-25".to_string(), + "release-2023-10-26".to_string(), enabled_feature(&CrateSource::VersionsManifest { versions, release_tag: "release-2023-01-13".parse().unwrap(), diff --git a/tools/ci-cdk/canary-runner/src/run.rs b/tools/ci-cdk/canary-runner/src/run.rs index 4c05938eb20..9521db6cae8 100644 --- a/tools/ci-cdk/canary-runner/src/run.rs +++ b/tools/ci-cdk/canary-runner/src/run.rs @@ -102,6 +102,10 @@ pub struct RunArgs { #[clap(long, required_unless_present = "cdk-output")] lambda_test_s3_bucket_name: Option, + /// The name of the S3 bucket for the canary Lambda to interact with + #[clap(long, required_unless_present = "cdk-output")] + lambda_test_s3_mrap_bucket_arn: Option, + /// The ARN of the role that the Lambda will execute as #[clap(long, required_unless_present = "cdk-output")] lambda_execution_role_arn: Option, @@ -116,6 +120,7 @@ struct Options { expected_speech_text_by_transcribe: Option, lambda_code_s3_bucket_name: String, lambda_test_s3_bucket_name: String, + lambda_test_s3_mrap_bucket_arn: String, lambda_execution_role_arn: String, } @@ -128,6 +133,8 @@ impl Options { lambda_code_s3_bucket_name: String, #[serde(rename = "canarytestbucketname")] lambda_test_s3_bucket_name: String, + #[serde(rename = "canarytestmrapbucketarn")] + lambda_test_s3_mrap_bucket_arn: String, #[serde(rename = "lambdaexecutionrolearn")] lambda_execution_role_arn: String, } @@ -149,6 +156,7 @@ impl Options { expected_speech_text_by_transcribe: run_opt.expected_speech_text_by_transcribe, lambda_code_s3_bucket_name: value.inner.lambda_code_s3_bucket_name, lambda_test_s3_bucket_name: value.inner.lambda_test_s3_bucket_name, + lambda_test_s3_mrap_bucket_arn: value.inner.lambda_test_s3_mrap_bucket_arn, lambda_execution_role_arn: value.inner.lambda_execution_role_arn, }) } else { @@ -160,6 +168,9 @@ impl Options { expected_speech_text_by_transcribe: run_opt.expected_speech_text_by_transcribe, lambda_code_s3_bucket_name: run_opt.lambda_code_s3_bucket_name.expect("required"), lambda_test_s3_bucket_name: run_opt.lambda_test_s3_bucket_name.expect("required"), + lambda_test_s3_mrap_bucket_arn: run_opt + .lambda_test_s3_mrap_bucket_arn + .expect("required"), lambda_execution_role_arn: run_opt.lambda_execution_role_arn.expect("required"), }) } @@ -265,6 +276,7 @@ async fn run_canary(options: &Options, config: &aws_config::SdkConfig) -> Result options.expected_speech_text_by_transcribe.as_ref(), &options.lambda_code_s3_bucket_name, &options.lambda_test_s3_bucket_name, + &options.lambda_test_s3_mrap_bucket_arn, ) .await .context(here!())?; @@ -332,6 +344,7 @@ async fn upload_bundle( Ok(()) } +#[allow(clippy::too_many_arguments)] async fn create_lambda_fn( lambda_client: lambda::Client, bundle_name: &str, @@ -340,6 +353,7 @@ async fn create_lambda_fn( expected_speech_text_by_transcribe: Option<&String>, code_s3_bucket: &str, test_s3_bucket: &str, + test_s3_mrap_bucket_arn: &str, ) -> Result<()> { use lambda::types::*; @@ -348,6 +362,7 @@ async fn create_lambda_fn( .variables("RUST_BACKTRACE", "1") .variables("RUST_LOG", "info") .variables("CANARY_S3_BUCKET_NAME", test_s3_bucket) + .variables("CANARY_S3_MRAP_BUCKET_ARN", test_s3_mrap_bucket_arn) .variables( "CANARY_EXPECTED_TRANSCRIBE_RESULT", expected_speech_text_by_transcribe, @@ -355,7 +370,8 @@ async fn create_lambda_fn( None => Environment::builder() .variables("RUST_BACKTRACE", "1") .variables("RUST_LOG", "info") - .variables("CANARY_S3_BUCKET_NAME", test_s3_bucket), + .variables("CANARY_S3_BUCKET_NAME", test_s3_bucket) + .variables("CANARY_S3_MRAP_BUCKET_ARN", test_s3_mrap_bucket_arn), }; lambda_client @@ -487,7 +503,8 @@ mod tests { cdk_output: Some("../cdk-outputs.json".into()), lambda_code_s3_bucket_name: None, lambda_test_s3_bucket_name: None, - lambda_execution_role_arn: None + lambda_execution_role_arn: None, + lambda_test_s3_mrap_bucket_arn: None }, RunArgs::try_parse_from([ "run", @@ -516,6 +533,8 @@ mod tests { "bucket-for-test", "--lambda-execution-role-arn", "arn:aws:lambda::role/exe-role", + "--lambda-test-s3-mrap-bucket-arn", + "arn:aws:s3::000000000000:accesspoint/example.mrap", ]) .unwrap(); assert_eq!( @@ -528,6 +547,8 @@ mod tests { lambda_code_s3_bucket_name: "bucket-for-code".to_owned(), lambda_test_s3_bucket_name: "bucket-for-test".to_owned(), lambda_execution_role_arn: "arn:aws:lambda::role/exe-role".to_owned(), + lambda_test_s3_mrap_bucket_arn: "arn:aws:s3::000000000000:accesspoint/example.mrap" + .to_owned(), }, Options::load_from(run_args).unwrap(), ); diff --git a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts index 1edf4395e8c..5a8e9ac6cec 100644 --- a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts +++ b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts @@ -10,7 +10,12 @@ import { Role, ServicePrincipal, } from "aws-cdk-lib/aws-iam"; -import { BlockPublicAccess, Bucket, BucketEncryption } from "aws-cdk-lib/aws-s3"; +import { + BlockPublicAccess, + Bucket, + BucketEncryption, + CfnMultiRegionAccessPoint, +} from "aws-cdk-lib/aws-s3"; import { StackProps, Stack, Tags, RemovalPolicy, Duration, CfnOutput } from "aws-cdk-lib"; import { Construct } from "constructs"; import { GitHubOidcRole } from "../constructs/github-oidc-role"; @@ -24,10 +29,12 @@ export class CanaryStack extends Stack { public readonly lambdaExecutionRole: Role; public readonly canaryCodeBucket: Bucket; public readonly canaryTestBucket: Bucket; + public readonly canaryTestMrap: CfnMultiRegionAccessPoint; public readonly lambdaExecutionRoleArn: CfnOutput; public readonly canaryCodeBucketName: CfnOutput; public readonly canaryTestBucketName: CfnOutput; + public readonly canaryTestMrapBucketArn: CfnOutput; constructor(scope: Construct, id: string, props: Properties) { super(scope, id, props); @@ -118,6 +125,24 @@ export class CanaryStack extends Stack { exportName: "canaryTestBucket", }); + // Create a MultiRegionAccessPoint for the canary test bucket + this.canaryTestMrap = new CfnMultiRegionAccessPoint(this, "canary-test-mrap-bucket", { + regions: [{ bucket: this.canaryTestBucket.bucketName }], + name: "canary-test-mrap-bucket", + }); + + const accountId = this.canaryTestMrap.stack.account; + const alias = this.canaryTestMrap.attrAlias; + const canaryTestMrapBucketArn = `arn:aws:s3::${accountId}:accesspoint/${alias}`; + if (canaryTestMrapBucketArn) { + // Output the bucket name to make it easier to invoke the canary runner + this.canaryTestMrapBucketArn = new CfnOutput(this, "canary-test-mrap-bucket-arn", { + value: canaryTestMrapBucketArn, + description: "ARN of the canary test MRAP bucket", + exportName: "canaryTestMrapBucketArn", + }); + } + // Create a role for the canary Lambdas to assume this.lambdaExecutionRole = new Role(this, "lambda-execution-role", { roleName: "aws-sdk-rust-canary-lambda-exec-role", diff --git a/tools/ci-cdk/package-lock.json b/tools/ci-cdk/package-lock.json index a4be8025096..8da1026934b 100644 --- a/tools/ci-cdk/package-lock.json +++ b/tools/ci-cdk/package-lock.json @@ -69,12 +69,12 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -201,12 +201,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -241,22 +241,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -348,9 +348,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -380,12 +380,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -465,9 +465,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -639,33 +639,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -683,13 +683,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/tools/ci-cdk/package.json b/tools/ci-cdk/package.json index 887e593c5ca..89d87d31221 100644 --- a/tools/ci-cdk/package.json +++ b/tools/ci-cdk/package.json @@ -6,12 +6,13 @@ "rust-sdk-ci-cdk": "bin/ci-cdk.js" }, "scripts": { + "build": "tsc && cdk --app \"node build/bin/canary-only.js\" synth", + "cdk": "cdk", + "deploy": "cdk --app \"node build/bin/canary-only.js\" deploy --outputs-file cdk-outputs.json", "format": "prettier --write '**/*.ts'", "lint": "eslint --ext .ts lib", - "build": "tsc", - "watch": "tsc -w", "test": "jest", - "cdk": "cdk" + "watch": "tsc -w" }, "devDependencies": { "@types/jest": "^27.0.0", From 7a307666c005a120b9f6b8913dc00bfda0bbc3b0 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Tue, 31 Oct 2023 10:08:07 +0000 Subject: [PATCH 211/331] Test decorators in server tests (#3107) This change allows to test decorators by adding them to the CodegenContext. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../server/smithy/testutil/ServerTestHelpers.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt index 60978c65eef..f161282242a 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt @@ -28,6 +28,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider import software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings import software.amazon.smithy.rust.codegen.server.smithy.ServerSymbolProviders import software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator +import software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator import software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol @@ -47,15 +48,11 @@ private fun testServiceShapeFor(model: Model) = fun serverTestSymbolProvider(model: Model, serviceShape: ServiceShape? = null) = serverTestSymbolProviders(model, serviceShape).symbolProvider -private class ServerTestCodegenDecorator : ServerCodegenDecorator { - override val name = "test" - override val order: Byte = 0 -} - fun serverTestSymbolProviders( model: Model, serviceShape: ServiceShape? = null, settings: ServerRustSettings? = null, + decorators: List = emptyList(), ) = ServerSymbolProviders.from( serverTestRustSettings(), @@ -67,7 +64,7 @@ fun serverTestSymbolProviders( (serviceShape ?: testServiceShapeFor(model)).id, ) ).codegenConfig.publicConstrainedTypes, - ServerTestCodegenDecorator(), + CombinedServerCodegenDecorator(decorators), RustServerCodegenPlugin::baseSymbolProvider, ) @@ -102,6 +99,7 @@ fun serverTestCodegenContext( serviceShape: ServiceShape? = null, settings: ServerRustSettings = serverTestRustSettings(), protocolShapeId: ShapeId? = null, + decorators: List = emptyList(), ): ServerCodegenContext { val service = serviceShape ?: testServiceShapeFor(model) val protocol = protocolShapeId ?: ShapeId.from("test#Protocol") @@ -111,7 +109,7 @@ fun serverTestCodegenContext( service, ServerTestRustSymbolProviderConfig, settings.codegenConfig.publicConstrainedTypes, - ServerTestCodegenDecorator(), + CombinedServerCodegenDecorator(decorators), RustServerCodegenPlugin::baseSymbolProvider, ) From cc303ab1a07693ab02d5ec4f06101b628d1dbabe Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 31 Oct 2023 10:36:53 -0400 Subject: [PATCH 212/331] fix Publisher Workflow to successfully create new branches (#3117) The publisher tool was unable to create new branches because it attempted to determine if the current commit was on main. However, this didn't work! Since main was never checked out (ever) in the repo, there was no ref to look for. This fixes the issue in (perhaps not the best) way by simply checking out main first. The logic was also refactored to have dry run and non-dry run behave in a way that is closer to identical. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../scripts/get-or-create-release-branch.sh | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/.github/scripts/get-or-create-release-branch.sh b/.github/scripts/get-or-create-release-branch.sh index 7dcc87676d0..a0f48b60981 100755 --- a/.github/scripts/get-or-create-release-branch.sh +++ b/.github/scripts/get-or-create-release-branch.sh @@ -14,15 +14,15 @@ set -eux # is the beginning of a new release series. if [ -z "$SEMANTIC_VERSION" ]; then - echo "'SEMANTIC_VERSION' must be populated." - exit 1 + echo "'SEMANTIC_VERSION' must be populated." + exit 1 fi if [ -z "$1" ]; then - echo "You need to specify the path of the file where you want to collect the output" - exit 1 + echo "You need to specify the path of the file where you want to collect the output" + exit 1 else - output_file="$1" + output_file="$1" fi # Split on the dots @@ -31,41 +31,50 @@ major=${version_array[0]} minor=${version_array[1]} patch=${version_array[2]} if [[ "${major}" == "" || "${minor}" == "" || "${patch}" == "" ]]; then - echo "'${SEMANTIC_VERSION}' is not a valid semver tag" - exit 1 + echo "'${SEMANTIC_VERSION}' is not a valid semver tag" + exit 1 fi if [[ $major == 0 ]]; then - branch_name="smithy-rs-release-${major}.${minor}.x" - if [[ $patch == 0 ]]; then - echo "new_release_series=true" >"${output_file}" - fi + branch_name="smithy-rs-release-${major}.${minor}.x" + if [[ $patch == 0 ]]; then + echo "new_release_series=true" >"${output_file}" + fi else - branch_name="smithy-rs-release-${major}.x.y" - if [[ $minor == 0 && $patch == 0 ]]; then - echo "new_release_series=true" >"${output_file}" - fi + branch_name="smithy-rs-release-${major}.x.y" + if [[ $minor == 0 && $patch == 0 ]]; then + echo "new_release_series=true" >"${output_file}" + fi fi if [[ "${DRY_RUN}" == "true" ]]; then - branch_name="${branch_name}-preview" + branch_name="${branch_name}-preview" fi echo "release_branch=${branch_name}" >"${output_file}" -if [[ "${DRY_RUN}" == "true" ]]; then - git push --force origin "HEAD:refs/heads/${branch_name}" -else - commit_sha=$(git rev-parse --short HEAD) - if ! git ls-remote --exit-code --heads origin "${branch_name}"; then - # The release branch does not exist. - # We need to make sure that the commit SHA that we are releasing is on `main`. - git fetch origin main - if git branch --contains "${commit_sha}" | grep main; then - # We can then create the release branch and set the current commit as its tip - git checkout -b "${branch_name}" - git push origin "${branch_name}" - else - echo "You must choose a commit from main to create a new release branch!" - exit 1 - fi +commit_sha=$(git rev-parse --short HEAD) +# the git repo is in a weird state because **main has never been checked out**! +# This prevents the `git branch --contains` from working because there is no _local_ ref for main +git checkout main +git checkout "${commit_sha}" +if ! git ls-remote --exit-code --heads origin "${branch_name}"; then + # The release branch does not exist. + # We need to make sure that the commit SHA that we are releasing is on `main`. + git fetch origin main + echo "Branches: " + git branch --contains "${commit_sha}" + git show origin/main | head -n 1 + if git branch --contains "${commit_sha}" | grep main; then + # We can then create the release branch and set the current commit as its tip + if [[ "${DRY_RUN}" == "true" ]]; then + git push --force origin "HEAD:refs/heads/${branch_name}" + else + git checkout -b "${branch_name}" + git push origin "${branch_name}" fi + else + echo "You must choose a commit from main to create a new release branch!" + exit 1 + fi +else + echo "Patch release ${branch_name} already exists" fi From b56d34847591494a15b8fabcce55f730400ebea9 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 31 Oct 2023 15:42:15 +0000 Subject: [PATCH 213/331] Upgrade the smithy-rs runtime crates version to 0.57.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 33e82bc2ca1..9d7b1d61871 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.56.1 +smithy.rs.runtime.crate.version=0.57.0 kotlin.code.style=official From 20a89c21cab153b92cd3d3492a8d7316556c4220 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 31 Oct 2023 15:46:23 +0000 Subject: [PATCH 214/331] Update changelog --- CHANGELOG.md | 71 ++++ CHANGELOG.next.toml | 504 +------------------------ aws/SDK_CHANGELOG.next.json | 716 +++++++++++++++++++++++------------- 3 files changed, 527 insertions(+), 764 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f3a70d70c6..70a6a34b809 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,75 @@ +October 31st, 2023 +================== +**Breaking Changes:** +- :warning::tada: (client, [smithy-rs#2417](https://github.com/awslabs/smithy-rs/issues/2417), [smithy-rs#3018](https://github.com/awslabs/smithy-rs/issues/3018)) Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. + + For more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050). +- :warning: (client, [smithy-rs#3011](https://github.com/awslabs/smithy-rs/issues/3011)) HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details. +- :warning: (client, [smithy-rs#3038](https://github.com/awslabs/smithy-rs/issues/3038)) The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/awslabs/smithy-rs/discussions/2887). +- :warning: (client, [smithy-rs#2909](https://github.com/awslabs/smithy-rs/issues/2909)) It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method. +- :warning: (all, [smithy-rs#2948](https://github.com/awslabs/smithy-rs/issues/2948)) Update MSRV to Rust 1.70.0 +- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) `aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`. +- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature. +- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively. +- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) TestConnection was renamed to EventConnector. +- :warning: (all, [smithy-rs#2973](https://github.com/awslabs/smithy-rs/issues/2973)) Remove `once_cell` from public API. +- :warning: (all, [smithy-rs#2995](https://github.com/awslabs/smithy-rs/issues/2995)) Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting: + ```json + { + "codegen": { + "flattenCollectionAccessors": false, + ... + } + } + ``` +- :warning: (client, [smithy-rs#2978](https://github.com/awslabs/smithy-rs/issues/2978)) The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`. +- :warning: (client, [smithy-rs#2983](https://github.com/awslabs/smithy-rs/issues/2983)) The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. +- :warning: (client, [smithy-rs#2997](https://github.com/awslabs/smithy-rs/issues/2997)) `StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`. +- :warning: (server, [smithy-rs#3038](https://github.com/awslabs/smithy-rs/issues/3038)) `SdkError` is no longer re-exported in generated server crates. +- :warning: (client, [smithy-rs#3039](https://github.com/awslabs/smithy-rs/issues/3039)) The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again. +- :bug::warning: (all, [smithy-rs#3037](https://github.com/awslabs/smithy-rs/issues/3037), [aws-sdk-rust#756](https://github.com/awslabs/aws-sdk-rust/issues/756)) Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`. +- :warning: (client, [smithy-rs#3055](https://github.com/awslabs/smithy-rs/issues/3055)) The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively. +- :warning: (client, [smithy-rs#3032](https://github.com/awslabs/smithy-rs/issues/3032)) [`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html). +- :warning: (client, [smithy-rs#3061](https://github.com/awslabs/smithy-rs/issues/3061)) Lifetimes have been added to the `EndpointResolver` trait. +- :warning: (client, [smithy-rs#3065](https://github.com/awslabs/smithy-rs/issues/3065)) Several traits have been renamed from noun form to verb form to be more idiomatic: + - `AuthSchemeOptionResolver` -> `ResolveAuthSchemeOptions` + - `EndpointResolver` -> `ResolveEndpoint` + - `IdentityResolver` -> `ResolveIdentity` + - `Signer` -> `Sign` + - `RequestSerializer` -> `SerializeRequest` + - `ResponseDeserializer` -> `DeserializeResponse` + - `Interceptor` -> `Intercept` +- :warning: (client, [smithy-rs#3059](https://github.com/awslabs/smithy-rs/issues/3059)) **This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3067)**. A summary is below.

The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`. +- :warning: (client, [smithy-rs#2917](https://github.com/awslabs/smithy-rs/issues/2917)) `RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function. +- :warning: (client, [smithy-rs#3072](https://github.com/awslabs/smithy-rs/issues/3072)) The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor. +- :warning: (client, [smithy-rs#3078](https://github.com/awslabs/smithy-rs/issues/3078)) The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead. +- :warning: (client, [smithy-rs#3043](https://github.com/awslabs/smithy-rs/issues/3043), [smithy-rs#3078](https://github.com/awslabs/smithy-rs/issues/3078)) **This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3079).**

The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added. +- :warning: (all, [smithy-rs#3054](https://github.com/awslabs/smithy-rs/issues/3054), [smithy-rs#3070](https://github.com/awslabs/smithy-rs/issues/3070)) `aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (all, [smithy-rs#3076](https://github.com/awslabs/smithy-rs/issues/3076)) `aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (all, [smithy-rs#3076](https://github.com/awslabs/smithy-rs/issues/3076), [smithy-rs#3091](https://github.com/awslabs/smithy-rs/issues/3091)) `aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (client, [smithy-rs#3077](https://github.com/awslabs/smithy-rs/issues/3077)) **Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching. +- :warning: (all, [smithy-rs#3033](https://github.com/awslabs/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/awslabs/smithy-rs/issues/3088), [smithy-rs#3101](https://github.com/awslabs/smithy-rs/issues/3101)) Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3089) for details. +- :warning: (all, [smithy-rs#3033](https://github.com/awslabs/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/awslabs/smithy-rs/issues/3088)) `ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it. +- :warning: (client, [smithy-rs#3092](https://github.com/awslabs/smithy-rs/issues/3092), [smithy-rs#3093](https://github.com/awslabs/smithy-rs/issues/3093)) The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`. +- :bug::warning: (server, [smithy-rs#3095](https://github.com/awslabs/smithy-rs/issues/3095), [smithy-rs#3096](https://github.com/awslabs/smithy-rs/issues/3096)) Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3096) for more details. + +**New this release:** +- :tada: (client, [smithy-rs#2916](https://github.com/awslabs/smithy-rs/issues/2916), [smithy-rs#1767](https://github.com/awslabs/smithy-rs/issues/1767)) Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: "CLIENT_ZERO_VALUE_V1" in your codegen config. + For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929). +- :tada: (server, [smithy-rs#3005](https://github.com/awslabs/smithy-rs/issues/3005)) Python middleware can set URI. This can be used to route a request to a different handler. +- :tada: (client, [smithy-rs#3071](https://github.com/awslabs/smithy-rs/issues/3071)) Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio. +- :bug: (client, [smithy-rs#2944](https://github.com/awslabs/smithy-rs/issues/2944), [smithy-rs#2951](https://github.com/awslabs/smithy-rs/issues/2951)) `CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again. +- :bug: (client, [smithy-rs#2960](https://github.com/awslabs/smithy-rs/issues/2960)) Generate a region setter when a model uses SigV4. +- :bug: (all, [smithy-rs#2969](https://github.com/awslabs/smithy-rs/issues/2969), [smithy-rs#1896](https://github.com/awslabs/smithy-rs/issues/1896)) Fix code generation for union members with the `@httpPayload` trait. +- (client, [smithy-rs#2964](https://github.com/awslabs/smithy-rs/issues/2964)) Required members with @contextParam are now treated as client-side required. +- :bug: (client, [smithy-rs#2926](https://github.com/awslabs/smithy-rs/issues/2926), [smithy-rs#2972](https://github.com/awslabs/smithy-rs/issues/2972)) Fix regression with redacting sensitive HTTP response bodies. +- :bug: (all, [smithy-rs#2831](https://github.com/awslabs/smithy-rs/issues/2831), [aws-sdk-rust#818](https://github.com/awslabs/aws-sdk-rust/issues/818)) Omit fractional seconds from `http-date` format. +- :bug: (client, [smithy-rs#2985](https://github.com/awslabs/smithy-rs/issues/2985)) Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code. +- (client, [smithy-rs#2996](https://github.com/awslabs/smithy-rs/issues/2996)) Produce better docs when items are marked @required +- :bug: (client, [smithy-rs#3034](https://github.com/awslabs/smithy-rs/issues/3034), [smithy-rs#3087](https://github.com/awslabs/smithy-rs/issues/3087)) Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority. + + August 22nd, 2023 ================= **Breaking Changes:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 267d530fd59..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,506 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`." -references = ["smithy-rs#2917"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses." -references = ["smithy-rs#2917", "aws-sdk-rust#703", "aws-sdk-rust#699"] -meta = { "breaking" = false, "tada" = true, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details." -references = ["smithy-rs#3011"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/awslabs/smithy-rs/discussions/2887)." -references = ["smithy-rs#3038"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details." -references = ["smithy-rs#3011"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method." -references = ["smithy-rs#2909"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = """Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency: -- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead -- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate -- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release. -- Several public accessors were removed from `SigningInstructions`. -""" -references = ["smithy-rs#2921"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[aws-sdk-rust]] -message = "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver." -references = ["smithy-rs#2911"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "Velfi" - -[[aws-sdk-rust]] -message = "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929)." -references = ["smithy-rs#2916", "aws-sdk-rust#536"] -meta = { "breaking" = true, "tada" = true, "bug" = false } -author = "Velfi" - -[[smithy-rs]] -message = """ -Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: "CLIENT_ZERO_VALUE_V1" in your codegen config. -For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929). -""" -references = ["smithy-rs#2916", "smithy-rs#1767"] -meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } -author = "Velfi" - -[[aws-sdk-rust]] -message = """ -All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html) -as opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868). -""" -references = ["smithy-rs#2913"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "Velfi" - -[[aws-sdk-rust]] -message = "Update MSRV to Rust 1.70.0" -references = ["smithy-rs#2948"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "Velfi" - -[[smithy-rs]] -message = "Update MSRV to Rust 1.70.0" -references = ["smithy-rs#2948"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "Velfi" - -[[aws-sdk-rust]] -message = "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases." -references = ["smithy-rs#2958", "aws-sdk-rust#873"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Allow `no_credentials` to be used with all S3 operations." -references = ["smithy-rs#2955", "aws-sdk-rust#878"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again." -references = ["smithy-rs#2944", "smithy-rs#2951"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[smithy-rs]] -message = "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again." -references = ["smithy-rs#2944", "smithy-rs#2951"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "Generate a region setter when a model uses SigV4." -references = ["smithy-rs#2960"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "Fix code generation for union members with the `@httpPayload` trait." -references = ["smithy-rs#2969", "smithy-rs#1896"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered." -references = ["smithy-rs#1668", "aws-sdk-rust#873", "smithy-rs#2964"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[smithy-rs]] -message = "Required members with @contextParam are now treated as client-side required." -references = ["smithy-rs#2964"] -meta = { "breaking" = false, "tada" = false, "bug" = false, target = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "`aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`." -references = ["smithy-rs#2970"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature." -references = ["smithy-rs#2970"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively." -references = ["smithy-rs#2970"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "TestConnection was renamed to EventConnector." -references = ["smithy-rs#2970"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "Remove `once_cell` from public API." -references = ["smithy-rs#2973"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "Remove `once_cell` from public API." -references = ["smithy-rs#2973"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Fix regression with redacting sensitive HTTP response bodies." -references = ["smithy-rs#2926", "smithy-rs#2972"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[smithy-rs]] -message = "Fix regression with redacting sensitive HTTP response bodies." -references = ["smithy-rs#2926", "smithy-rs#2972"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "Omit fractional seconds from `http-date` format." -references = ["smithy-rs#2831", "aws-sdk-rust#818"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" } -author = "rschmitt" - -[[smithy-rs]] -message = "Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code." -references = ["smithy-rs#2985"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = """ -Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting: -```json -{ - "codegen": { - "flattenCollectionAccessors": false, - ... - } -} -``` -""" -references = ["smithy-rs#2995"] -author = "rcoh" -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } - -[[aws-sdk-rust]] -message = "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`." -references = ["smithy-rs#2995"] -author = "rcoh" -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Produce better docs when items are marked @required" -references = ["smithy-rs#2996"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`." -references = ["smithy-rs#2978"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`." -references = ["smithy-rs#2978"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "Python middleware can set URI. This can be used to route a request to a different handler." -references = ["smithy-rs#3005"] -meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "server" } -author = "drganjoo" - -[[aws-sdk-rust]] -message = "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge." -references = ["smithy-rs#1797"] -meta = { "breaking" = true, "tada" = true, "bug" = false } -author = "Velfi" - -[[aws-sdk-rust]] -message = "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner." -references = ["smithy-rs#2983"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner." -references = ["smithy-rs#2983"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "`StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`." -references = ["smithy-rs#2997"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "The IMDS Client builder's `build()` method is no longer async." -references = ["smithy-rs#2997"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[aws-sdk-rust]] -message = """The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`. - -For more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)""" -meta = { "breaking" = true, "tada" = false, "bug" = false } -references = ["smithy-rs#3014"] -author = "rcoh" - -[[aws-sdk-rust]] -message = "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile." -references = ["aws-sdk-rust#882", "smithy-rs#3007"] -meta = { "breaking" = true, "tada" = true, "bug" = true } -author = "Velfi" - -[[smithy-rs]] -message = "`SdkError` is no longer re-exported in generated server crates." -references = ["smithy-rs#3038"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "jdisanti" - -[[smithy-rs]] -message = "The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again." -references = ["smithy-rs#3039"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`." -references = ["smithy-rs#3037", "aws-sdk-rust#756"] -meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "all" } -author = "rcoh" - -[[smithy-rs]] -message = """ -Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. - -For more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050). -""" -references = ["smithy-rs#2417", "smithy-rs#3018"] -meta = { "breaking" = true, "tada" = true, "bug" = false, "target" = "client" } -author = "Velfi" - -[[aws-sdk-rust]] -message = """ -Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. - -For more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050). -""" -references = ["smithy-rs#2417", "smithy-rs#3018"] -meta = { "breaking" = true, "tada" = true, "bug" = false } -author = "Velfi" - -[[aws-sdk-rust]] -message = "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively." -references = ["smithy-rs#3055"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively." -references = ["smithy-rs#3055"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = """ -[`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html). -""" -references = ["smithy-rs#3032"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits." -references = ["smithy-rs#3061"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "Lifetimes have been added to the `EndpointResolver` trait." -references = ["smithy-rs#3061"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = """Several traits have been renamed from noun form to verb form to be more idiomatic: -- `EndpointResolver` -> `ResolveEndpoint` -- `Interceptor` -> `Intercept` -""" -references = ["smithy-rs#3065"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = """Several traits have been renamed from noun form to verb form to be more idiomatic: -- `AuthSchemeOptionResolver` -> `ResolveAuthSchemeOptions` -- `EndpointResolver` -> `ResolveEndpoint` -- `IdentityResolver` -> `ResolveIdentity` -- `Signer` -> `Sign` -- `RequestSerializer` -> `SerializeRequest` -- `ResponseDeserializer` -> `DeserializeResponse` -- `Interceptor` -> `Intercept` -""" -references = ["smithy-rs#3065"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "**This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3067)**. A summary is below.

The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`." -references = ["smithy-rs#3059"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`." -references = ["smithy-rs#3059"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = "`RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function." -references = ["smithy-rs#2917"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} -author = "jdisanti" - -[[smithy-rs]] -message = "The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor." -references = ["smithy-rs#3072"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead." -references = ["smithy-rs#3078"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "**This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3079).**

The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added." -references = ["smithy-rs#3043", "smithy-rs#3078"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime." -references = ["smithy-rs#3052"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[aws-sdk-rust]] -message = "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`." -references = ["smithy-rs#3052"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = """ -`aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. -""" -references = ["smithy-rs#3054", "smithy-rs#3070"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "ysaito1001" - -[[smithy-rs]] -message = """ -`aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. -""" -references = ["smithy-rs#3076"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "ysaito1001" - -[[smithy-rs]] -message = """ -`aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. -""" -references = ["smithy-rs#3076", "smithy-rs#3091"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache." -references = ["smithy-rs#3077"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "**Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching." -references = ["smithy-rs#3077"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio." -references = ["smithy-rs#3071"] -meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[smithy-rs]] -message = "Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority." -references = ["smithy-rs#3034", "smithy-rs#3087"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3089) for details." -references = ["smithy-rs#3033", "smithy-rs#3088", "smithy-rs#3101"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "ysaito1001" - -[[smithy-rs]] -message = "`ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it." -references = ["smithy-rs#3033", "smithy-rs#3088"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "ysaito1001" - -[[smithy-rs]] -message = """ -The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`. -""" -references = ["smithy-rs#3092", "smithy-rs#3093"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3096) for more details." -references = ["smithy-rs#3095", "smithy-rs#3096"] -meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "server" } -author = "david-perez" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 496c4aaa7e8..13b0a59f7c3 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,229 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Request IDs can now be easily retrieved on successful responses. For example, with S3:\n```rust\n// Import the trait to get the `request_id` method on outputs\nuse aws_sdk_s3::types::RequestId;\nlet output = client.list_buckets().send().await?;\nprintln!(\"Request ID: {:?}\", output.request_id());\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Retrieving a request ID from errors now requires importing the `RequestId` trait. For example, with S3:\n```rust\nuse aws_sdk_s3::types::RequestId;\nprintln!(\"Request ID: {:?}\", error.request_id());\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.\n

\nExample with S3\n**Before:**\n```rust\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError { kind, .. } => match kind {\n GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n }\n err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n**After:**\n```rust\n// Needed to access the `.code()` function on the error type:\nuse aws_sdk_s3::types::ProvideErrorMetadata;\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError::InvalidObjectState(value) => {\n println!(\"invalid object state: {:?}\", value);\n }\n GetObjectError::NoSuchKey(_) => {\n println!(\"object didn't exist\");\n }\n err if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n
\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129", - "smithy-rs#2075" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated.", - "meta": { - "bug": true, - "breaking": false, - "tada": true - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#740" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "`SdkError` variants can now be constructed for easier unit testing.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2428", - "smithy-rs#2208" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2437", - "aws-sdk-rust#600" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Enable presigning for S3's `HeadObject` operation.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#753", - "smithy-rs#2451" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "The modules in the SDK crates have been reorganized. See the [SDK Crate Reorganization Upgrade Guidance](https://github.com/awslabs/aws-sdk-rust/discussions/752) to see how to fix your code after this change.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2433" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Reconnect on transient errors.\n\nIf a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not\nbe reused. This is enabled by default for all AWS services. It can be disabled by setting `RetryConfig::with_reconnect_mode`\n\nAlthough there is no API breakage from this change, it alters the client behavior in a way that may cause breakage for customers.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "aws-sdk-rust#160", - "smithy-rs#2445" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Update MSRV to 1.66.1", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#2467" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Default connector provided by `aws-config` now respects `ConnectorSettings`.\n\nPreviously, it used the timeout settings provided by aws-config. A test from @Oliboy50 has been incorporated to verify this behavior.\n\n**Behavior Change**: Prior to this change, the Hyper client would be shared between all service clients. After this change, each service client will use its own Hyper Client.\nTo revert to the previous behavior, set `HttpConnector::Prebuilt` on `SdkConfig::http_connector`.\n", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2471", - "smithy-rs#2333", - "smithy-rs#2151" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Remove deprecated `ResolveAwsEndpoint` interfaces.\n[For details see the longform changelog entry](https://github.com/awslabs/aws-sdk-rust/discussions/755).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2390", - "smithy-rs#1784" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, - { - "message": "Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001)", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2474" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 5 - }, { "message": "Implement std::error::Error#source() properly for the service meta Error enum.", "meta": { @@ -240,7 +17,7 @@ "aws-sdk-rust#784" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "The outputs for event stream operations (for example, S3's SelectObjectContent) now implement the `Sync` auto-trait.", @@ -254,7 +31,7 @@ "smithy-rs#2496" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "The AWS SDK now compiles for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!", @@ -268,7 +45,7 @@ "smithy-rs#2254" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "S3's `GetObject` will no longer panic when checksum validation is enabled and the target object was uploaded as a multi-part upload.\nHowever, these objects cannot be checksum validated by the SDK due to the way checksums are calculated for multipart uploads.\nFor more information, see [this page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums).\n", @@ -282,7 +59,7 @@ "aws-sdk-rust#764" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "`AppName` is now configurable from within `ConfigLoader`.", @@ -296,7 +73,7 @@ "smithy-rs#2513" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Add support for omitting session token in canonical requests for SigV4 signing.", @@ -310,7 +87,7 @@ "smithy-rs#2473" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions.", @@ -324,7 +101,7 @@ "smithy-rs#2525" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Fix bug where an incorrect endpoint was produced for `WriteGetObjectResponse`", @@ -339,7 +116,7 @@ "aws-sdk-rust#781" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Update the `std::fmt::Debug` implementation for `aws-sigv4::SigningParams` so that it will no longer print sensitive information.", @@ -353,7 +130,7 @@ "smithy-rs#2562" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "`aws_smithy_types::date_time::Format` has been re-exported in SDK crates.", @@ -367,7 +144,7 @@ "smithy-rs#2534" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Reduce several instances of credential exposure in the SDK logs:\n- IMDS now suppresses the body of the response from logs\n- `aws-sigv4` marks the `x-amz-session-token` header as sensitive\n- STS & SSO credentials have been manually marked as sensitive which suppresses logging of response bodies for relevant operations\n", @@ -381,7 +158,7 @@ "smithy-rs#2603" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Update MSRV to Rust 1.67.1", @@ -395,7 +172,7 @@ "smithy-rs#2611" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 4 + "age": 5 }, { "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", @@ -410,7 +187,7 @@ "smithy-rs#2694" ], "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", - "age": 3 + "age": 4 }, { "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", @@ -424,7 +201,7 @@ "smithy-rs#2815" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Add accessors to Builders", @@ -438,7 +215,7 @@ "smithy-rs#2791" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Remove native-tls and add a migration guide.", @@ -452,7 +229,7 @@ "smithy-rs#2675" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", @@ -467,7 +244,7 @@ "aws-sdk-rust#703" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", @@ -481,7 +258,7 @@ "smithy-rs#2720" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", @@ -495,7 +272,7 @@ "smithy-rs#2673" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", @@ -509,7 +286,7 @@ "smithy-rs#2730" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", @@ -525,7 +302,7 @@ "aws-sdk-rust#2087" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", @@ -541,7 +318,7 @@ "smithy-rs#2846" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", @@ -555,7 +332,7 @@ "smithy-rs#2742" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Update MSRV to Rust 1.69.0", @@ -569,7 +346,7 @@ "smithy-rs#2893" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", @@ -586,7 +363,7 @@ "smithy-rs#2616" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", @@ -600,7 +377,7 @@ "smithy-rs#2652" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", @@ -614,7 +391,7 @@ "smithy-rs#2783" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", @@ -628,7 +405,7 @@ "smithy-rs#2845" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", @@ -642,7 +419,7 @@ "smithy-rs#2724" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", @@ -657,7 +434,7 @@ "aws-sdk-rust#338" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", @@ -671,7 +448,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", @@ -685,7 +462,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", @@ -697,7 +474,7 @@ "author": "jdisanti", "references": [], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 2 + "age": 3 }, { "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", @@ -712,7 +489,7 @@ "aws-sdk-rust#862" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 1 + "age": 2 }, { "message": "Fix requests to S3 with `no_credentials` set.", @@ -727,7 +504,7 @@ "aws-sdk-rust#864" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 1 + "age": 2 }, { "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", @@ -742,7 +519,7 @@ "aws-sdk-rust#875" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 1 + "age": 2 }, { "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", @@ -757,7 +534,7 @@ "aws-sdk-rust#872" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 1 + "age": 2 }, { "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", @@ -771,8 +548,425 @@ "smithy-rs#2935" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", + "age": 2 + }, + { + "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2917" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2917", + "aws-sdk-rust#703", + "aws-sdk-rust#699" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3011" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2921" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "Velfi", + "references": [ + "smithy-rs#2911" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929).", + "meta": { + "bug": false, + "breaking": true, + "tada": true + }, + "author": "Velfi", + "references": [ + "smithy-rs#2916", + "aws-sdk-rust#536" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "Velfi", + "references": [ + "smithy-rs#2913" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Update MSRV to Rust 1.70.0", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "Velfi", + "references": [ + "smithy-rs#2948" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2958", + "aws-sdk-rust#873" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Allow `no_credentials` to be used with all S3 operations.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2955", + "aws-sdk-rust#878" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2944", + "smithy-rs#2951" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#1668", + "aws-sdk-rust#873", + "smithy-rs#2964" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Remove `once_cell` from public API.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2973" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Fix regression with redacting sensitive HTTP response bodies.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2926", + "smithy-rs#2972" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2995" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2978" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", + "meta": { + "bug": false, + "breaking": true, + "tada": true + }, + "author": "Velfi", + "references": [ + "smithy-rs#1797" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2983" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The IMDS Client builder's `build()` method is no longer async.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2997" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3014" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", + "meta": { + "bug": true, + "breaking": true, + "tada": true + }, + "author": "Velfi", + "references": [ + "aws-sdk-rust#882", + "smithy-rs#3007" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050).\n", + "meta": { + "bug": false, + "breaking": true, + "tada": true + }, + "author": "Velfi", + "references": [ + "smithy-rs#2417", + "smithy-rs#3018" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3055" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3061" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3065" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3059" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3052" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3052" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", + "age": 1 + }, + { + "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3077" + ], + "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", "age": 1 } ], "aws-sdk-model": [] -} +} \ No newline at end of file From f0929e74ba5859759c8cdf7b95e27d0b8b244f6e Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 31 Oct 2023 17:10:09 +0100 Subject: [PATCH 215/331] Allow server decorators to inject methods on config (#3111) PR #3095 added a code-generated `${serviceName}Config` object on which users can register layers and plugins. For example: ```rust let config = PokemonServiceConfig::builder() .layer(layers) .http_plugin(authn_plugin) .model_plugin(authz_plugin) .build(); ``` This PR makes it so that server decorators can inject methods on this config builder object. These methods can apply arbitrary layers, HTTP plugins, and/or model plugins. Moreover, the decorator can configure whether invoking such method is required or not. For example, a decorator can inject an `aws_auth` method that configures some plugins using its input arguments. Missing invocation of this method will result in the config failing to build: ```rust let _: SimpleServiceConfig< // No layers have been applied. tower::layer::util::Identity, // One HTTP plugin has been applied. PluginStack, // One model plugin has been applied. PluginStack, > = SimpleServiceConfig::builder() // This method has been injected in the config builder! .aws_auth("a".repeat(69).to_owned(), 69) // The method will apply one HTTP plugin and one model plugin, // configuring them with the input arguments. Configuration can be // declared to be fallible, in which case we get a `Result` we unwrap // here. .expect("failed to configure aws_auth") .build() // Since `aws_auth` has been marked as required, if the user misses // invoking it, this would panic here. .unwrap(); ``` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy/rust/codegen/core/testutil/Rust.kt | 2 +- .../server/smithy/ServerCargoDependency.kt | 1 + .../server/smithy/ServerCodegenVisitor.kt | 8 +- .../customize/ServerCodegenDecorator.kt | 16 +- .../smithy/generators/ServerRootGenerator.kt | 38 +- .../generators/ServerServiceGenerator.kt | 10 +- .../generators/ServiceConfigGenerator.kt | 339 +++++++++++++++++- .../generators/ServiceConfigGeneratorTest.kt | 231 ++++++++++++ .../src/plugin/stack.rs | 2 + 9 files changed, 614 insertions(+), 33 deletions(-) create mode 100644 codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index c443110805b..9fdab3965de 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -294,7 +294,7 @@ class TestWriterDelegator( } /** - * Generate a newtest module + * Generate a new test module * * This should only be used in test code—the generated module name will be something like `tests_123` */ diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt index 956a88ecf2a..779fcb16863 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt @@ -22,6 +22,7 @@ object ServerCargoDependency { val Nom: CargoDependency = CargoDependency("nom", CratesIo("7")) val OnceCell: CargoDependency = CargoDependency("once_cell", CratesIo("1.13")) val PinProjectLite: CargoDependency = CargoDependency("pin-project-lite", CratesIo("0.2")) + val ThisError: CargoDependency = CargoDependency("thiserror", CratesIo("1.0")) val Tower: CargoDependency = CargoDependency("tower", CratesIo("0.4")) val TokioDev: CargoDependency = CargoDependency("tokio", CratesIo("1.23.1"), scope = DependencyScope.Dev) val Regex: CargoDependency = CargoDependency("regex", CratesIo("1.5.5")) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index 6f66c72166d..adfa4662578 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -78,6 +78,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.Unconstraine import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedMapGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedUnionGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator +import software.amazon.smithy.rust.codegen.server.smithy.generators.isBuilderFallible import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolTestGenerator @@ -591,11 +592,15 @@ open class ServerCodegenVisitor( logger.info("[rust-server-codegen] Generating a service $shape") val serverProtocol = protocolGeneratorFactory.protocol(codegenContext) as ServerProtocol + val configMethods = codegenDecorator.configMethods(codegenContext) + val isConfigBuilderFallible = configMethods.isBuilderFallible() + // Generate root. rustCrate.lib { ServerRootGenerator( serverProtocol, codegenContext, + isConfigBuilderFallible, ).render(this) } @@ -612,9 +617,10 @@ open class ServerCodegenVisitor( ServerServiceGenerator( codegenContext, serverProtocol, + isConfigBuilderFallible, ).render(this) - ServiceConfigGenerator(codegenContext).render(this) + ServiceConfigGenerator(codegenContext, configMethods).render(this) ScopeMacroGenerator(codegenContext).render(this) } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt index 06f9c3c09be..5470c0902c9 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt @@ -15,6 +15,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings import software.amazon.smithy.rust.codegen.server.smithy.ValidationResult +import software.amazon.smithy.rust.codegen.server.smithy.generators.ConfigMethod import software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator import java.util.logging.Logger @@ -41,6 +42,12 @@ interface ServerCodegenDecorator : CoreCodegenDecorator = emptyList() + + /** + * Configuration methods that should be injected into the `${serviceName}Config` struct to allow users to configure + * pre-applied layers and plugins. + */ + fun configMethods(codegenContext: ServerCodegenContext): List = emptyList() } /** @@ -74,10 +81,11 @@ class CombinedServerCodegenDecorator(decorators: List) : decorator.postprocessValidationExceptionNotAttachedErrorMessage(accumulated) } - override fun postprocessGenerateAdditionalStructures(operationShape: OperationShape): List { - return orderedDecorators.map { decorator -> decorator.postprocessGenerateAdditionalStructures(operationShape) } - .flatten() - } + override fun postprocessGenerateAdditionalStructures(operationShape: OperationShape): List = + orderedDecorators.flatMap { it.postprocessGenerateAdditionalStructures(operationShape) } + + override fun configMethods(codegenContext: ServerCodegenContext): List = + orderedDecorators.flatMap { it.configMethods(codegenContext) } companion object { fun fromClasspath( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt index a1ea4b90f64..63f55954da2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output open class ServerRootGenerator( val protocol: ServerProtocol, private val codegenContext: ServerCodegenContext, + private val isConfigBuilderFallible: Boolean, ) { private val index = TopDownIndex.of(codegenContext.model) private val operations = index.getContainedOperations(codegenContext.serviceShape).toSortedSet( @@ -57,6 +58,8 @@ open class ServerRootGenerator( } .join("//!\n") + val unwrapConfigBuilder = if (isConfigBuilderFallible) ".expect(\"config failed to build\")" else "" + writer.rustTemplate( """ //! A fast and customizable Rust implementation of the $serviceName Smithy service. @@ -75,7 +78,10 @@ open class ServerRootGenerator( //! ## async fn dummy() { //! use $crateName::{$serviceName, ${serviceName}Config}; //! - //! ## let app = $serviceName::builder(${serviceName}Config::builder().build()).build_unchecked(); + //! ## let app = $serviceName::builder( + //! ## ${serviceName}Config::builder() + //! ## .build()$unwrapConfigBuilder + //! ## ).build_unchecked(); //! let server = app.into_make_service(); //! let bind: SocketAddr = "127.0.0.1:6969".parse() //! .expect("unable to parse the server bind address and port"); @@ -92,7 +98,10 @@ open class ServerRootGenerator( //! use $crateName::$serviceName; //! //! ## async fn dummy() { - //! ## let app = $serviceName::builder(${serviceName}Config::builder().build()).build_unchecked(); + //! ## let app = $serviceName::builder( + //! ## ${serviceName}Config::builder() + //! ## .build()$unwrapConfigBuilder + //! ## ).build_unchecked(); //! let handler = LambdaHandler::new(app); //! lambda_http::run(handler).await.unwrap(); //! ## } @@ -118,7 +127,7 @@ open class ServerRootGenerator( //! let http_plugins = HttpPlugins::new() //! .push(LoggingPlugin) //! .push(MetricsPlugin); - //! let config = ${serviceName}Config::builder().build(); + //! let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; //! let builder: $builderName = $serviceName::builder(config); //! ``` //! @@ -183,13 +192,13 @@ open class ServerRootGenerator( //! //! ## Example //! - //! ```rust + //! ```rust,no_run //! ## use std::net::SocketAddr; //! use $crateName::{$serviceName, ${serviceName}Config}; //! //! ##[#{Tokio}::main] //! pub async fn main() { - //! let config = ${serviceName}Config::builder().build(); + //! let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; //! let app = $serviceName::builder(config) ${builderFieldNames.values.joinToString("\n") { "//! .$it($it)" }} //! .build() @@ -236,6 +245,23 @@ open class ServerRootGenerator( fun render(rustWriter: RustWriter) { documentation(rustWriter) - rustWriter.rust("pub use crate::service::{$serviceName, ${serviceName}Config, ${serviceName}ConfigBuilder, ${serviceName}Builder, MissingOperationsError};") + // Only export config builder error if fallible. + val configErrorReExport = if (isConfigBuilderFallible) { + "${serviceName}ConfigError," + } else { + "" + } + rustWriter.rust( + """ + pub use crate::service::{ + $serviceName, + ${serviceName}Config, + ${serviceName}ConfigBuilder, + $configErrorReExport + ${serviceName}Builder, + MissingOperationsError + }; + """, + ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index 97963cbb40a..e1da585d054 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -33,6 +33,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output class ServerServiceGenerator( private val codegenContext: ServerCodegenContext, private val protocol: ServerProtocol, + private val isConfigBuilderFallible: Boolean, ) { private val runtimeConfig = codegenContext.runtimeConfig private val smithyHttpServer = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType() @@ -107,6 +108,11 @@ class ServerServiceGenerator( val docHandler = DocHandlerGenerator(codegenContext, operationShape, "handler", "///") val handler = docHandler.docSignature() val handlerFixed = docHandler.docFixedSignature() + val unwrapConfigBuilder = if (isConfigBuilderFallible) { + ".expect(\"config failed to build\")" + } else { + "" + } rustTemplate( """ /// Sets the [`$structName`](crate::operation_shape::$structName) operation. @@ -123,7 +129,7 @@ class ServerServiceGenerator( /// #{Handler:W} /// - /// let config = ${serviceName}Config::builder().build(); + /// let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; /// let app = $serviceName::builder(config) /// .$fieldName(handler) /// /* Set other handlers */ @@ -186,7 +192,7 @@ class ServerServiceGenerator( /// #{HandlerFixed:W} /// - /// let config = ${serviceName}Config::builder().build(); + /// let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; /// let svc = #{Tower}::util::service_fn(handler); /// let app = $serviceName::builder(config) /// .${fieldName}_service(svc) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt index 960f9d0df75..525487968fa 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt @@ -6,31 +6,141 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock +import software.amazon.smithy.rust.codegen.core.rustlang.docs +import software.amazon.smithy.rust.codegen.core.rustlang.join +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.util.toPascalCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext +fun List.isBuilderFallible() = this.any { it.isRequired } + +/** + * Contains all data necessary to render a method on the config builder object to apply arbitrary layers, HTTP plugins, + * and model plugins. + */ +data class ConfigMethod( + /** The name of the method. **/ + val name: String, + /** The Rust docs for the method. **/ + val docs: String, + /** The parameters of the method. **/ + val params: List, + /** In case the method is fallible, the error type it returns. **/ + val errorType: RuntimeType?, + /** The code block inside the method. **/ + val initializer: Initializer, + /** Whether the user must invoke the method or not. **/ + val isRequired: Boolean, +) { + /** The name of the flag on the config builder object that tracks whether the _required_ method has already been invoked or not. **/ + fun requiredBuilderFlagName(): String { + check(isRequired) { + "Config method is not required so it shouldn't need a field in the builder tracking whether it has been configured" + } + return "${name}_configured" + } + + /** The name of the enum variant on the config builder's error struct for a _required_ method. **/ + fun requiredErrorVariant(): String { + check(isRequired) { + "Config method is not required so it shouldn't need an error variant" + } + return "${name.toPascalCase()}NotConfigured" + } +} + +/** + * Represents the code block inside the method that initializes and configures a set of layers, HTTP plugins, and/or model + * plugins. + */ +data class Initializer( + /** + * The code itself that initializes and configures the layers, HTTP plugins, and/or model plugins. This should be + * a set of [Rust statements] that, after execution, defines one variable binding per layer/HTTP plugin/model plugin + * that it has configured and wants to apply. The code may use the method's input arguments (see [params] in + * [ConfigMethod]) to perform checks and initialize the bindings. + * + * For example, the following code performs checks on the `authorizer` and `auth_spec` input arguments, returning + * an error (see [errorType] in [ConfigMethod]) in case these checks fail, and leaves two plugins defined in two + * variable bindings, `authn_plugin` and `authz_plugin`. + * + * ```rust + * if authorizer != 69 { + * return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 1")); + * } + + * if auth_spec.len() != 69 { + * return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 2")); + * } + * let authn_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + * let authz_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + * ``` + * + * [Rust statements]: https://doc.rust-lang.org/reference/statements.html + */ + val code: Writable, + /** Ordered list of layers that should be applied. Layers are executed in the order they appear in the list. **/ + val layerBindings: List, + /** Ordered list of HTTP plugins that should be applied. Http plugins are executed in the order they appear in the list. **/ + val httpPluginBindings: List, + /** Ordered list of model plugins that should be applied. Model plugins are executed in the order they appear in the list. **/ + val modelPluginBindings: List, +) + +/** + * Represents a variable binding. For example, the following Rust code: + * + * ```rust + * fn foo(bar: String) { + * let baz: u64 = 69; + * } + * + * has two variable bindings. The `bar` name is bound to a `String` variable and the `baz` name is bound to a + * `u64` variable. + * ``` + */ +data class Binding( + /** The name of the variable. */ + val name: String, + /** The type of the variable. */ + val ty: RuntimeType, +) + class ServiceConfigGenerator( codegenContext: ServerCodegenContext, + private val configMethods: List, ) { private val crateName = codegenContext.moduleUseName() - private val codegenScope = codegenContext.runtimeConfig.let { runtimeConfig -> - val smithyHttpServer = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType() - arrayOf( - "Debug" to RuntimeType.Debug, - "SmithyHttpServer" to smithyHttpServer, - "PluginStack" to smithyHttpServer.resolve("plugin::PluginStack"), - "ModelMarker" to smithyHttpServer.resolve("plugin::ModelMarker"), - "HttpMarker" to smithyHttpServer.resolve("plugin::HttpMarker"), - "Tower" to RuntimeType.Tower, - "Stack" to RuntimeType.Tower.resolve("layer::util::Stack"), - ) - } + private val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType() + private val codegenScope = arrayOf( + *preludeScope, + "Debug" to RuntimeType.Debug, + "SmithyHttpServer" to smithyHttpServer, + "PluginStack" to smithyHttpServer.resolve("plugin::PluginStack"), + "ModelMarker" to smithyHttpServer.resolve("plugin::ModelMarker"), + "HttpMarker" to smithyHttpServer.resolve("plugin::HttpMarker"), + "Tower" to RuntimeType.Tower, + "Stack" to RuntimeType.Tower.resolve("layer::util::Stack"), + ) private val serviceName = codegenContext.serviceShape.id.name.toPascalCase() fun render(writer: RustWriter) { + val unwrapConfigBuilder = if (isBuilderFallible) { + """ + /// .expect("config failed to build"); + """ + } else { + ";" + } + writer.rustTemplate( """ /// Configuration for the [`$serviceName`]. This is the central place where to register and @@ -50,7 +160,7 @@ class ServiceConfigGenerator( /// .http_plugin(authentication_plugin) /// // ...and right after deserialization, model plugins. /// .model_plugin(authorization_plugin) - /// .build(); + /// .build()$unwrapConfigBuilder /// ``` /// /// See the [`plugin`] system for details. @@ -74,6 +184,7 @@ class ServiceConfigGenerator( layers: #{Tower}::layer::util::Identity::new(), http_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin, model_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin, + #{BuilderRequiredMethodFlagsInit:W} } } } @@ -84,15 +195,21 @@ class ServiceConfigGenerator( pub(crate) layers: L, pub(crate) http_plugins: H, pub(crate) model_plugins: M, + #{BuilderRequiredMethodFlagDefinitions:W} } + + #{BuilderRequiredMethodError:W} impl ${serviceName}ConfigBuilder { + #{InjectedMethods:W} + /// Add a [`#{Tower}::Layer`] to the service. pub fn layer(self, layer: NewLayer) -> ${serviceName}ConfigBuilder<#{Stack}, H, M> { ${serviceName}ConfigBuilder { layers: #{Stack}::new(layer, self.layers), http_plugins: self.http_plugins, model_plugins: self.model_plugins, + #{BuilderRequiredMethodFlagsMove1:W} } } @@ -109,6 +226,7 @@ class ServiceConfigGenerator( layers: self.layers, http_plugins: #{PluginStack}::new(http_plugin, self.http_plugins), model_plugins: self.model_plugins, + #{BuilderRequiredMethodFlagsMove2:W} } } @@ -125,20 +243,203 @@ class ServiceConfigGenerator( layers: self.layers, http_plugins: self.http_plugins, model_plugins: #{PluginStack}::new(model_plugin, self.model_plugins), + #{BuilderRequiredMethodFlagsMove3:W} } } + + #{BuilderBuildMethod:W} + } + """, + *codegenScope, + "BuilderRequiredMethodFlagsInit" to builderRequiredMethodFlagsInit(), + "BuilderRequiredMethodFlagDefinitions" to builderRequiredMethodFlagsDefinitions(), + "BuilderRequiredMethodError" to builderRequiredMethodError(), + "InjectedMethods" to injectedMethods(), + "BuilderRequiredMethodFlagsMove1" to builderRequiredMethodFlagsMove(), + "BuilderRequiredMethodFlagsMove2" to builderRequiredMethodFlagsMove(), + "BuilderRequiredMethodFlagsMove3" to builderRequiredMethodFlagsMove(), + "BuilderBuildMethod" to builderBuildMethod(), + ) + } + + private val isBuilderFallible = configMethods.isBuilderFallible() - /// Build the configuration. - pub fn build(self) -> super::${serviceName}Config { + private fun builderBuildRequiredMethodChecks() = configMethods.filter { it.isRequired }.map { + writable { + rustTemplate( + """ + if !self.${it.requiredBuilderFlagName()} { + return #{Err}(${serviceName}ConfigError::${it.requiredErrorVariant()}); + } + """, + *codegenScope, + ) + } + }.join("\n") + + private fun builderRequiredMethodFlagsDefinitions() = configMethods.filter { it.isRequired }.map { + writable { rust("pub(crate) ${it.requiredBuilderFlagName()}: bool,") } + }.join("\n") + + private fun builderRequiredMethodFlagsInit() = configMethods.filter { it.isRequired }.map { + writable { rust("${it.requiredBuilderFlagName()}: false,") } + }.join("\n") + + private fun builderRequiredMethodFlagsMove() = configMethods.filter { it.isRequired }.map { + writable { rust("${it.requiredBuilderFlagName()}: self.${it.requiredBuilderFlagName()},") } + }.join("\n") + + private fun builderRequiredMethodError() = writable { + if (isBuilderFallible) { + val variants = configMethods.filter { it.isRequired }.map { + writable { + rust( + """ + ##[error("service is not fully configured; invoke `${it.name}` on the config builder")] + ${it.requiredErrorVariant()}, + """, + ) + } + } + rustTemplate( + """ + ##[derive(Debug, #{ThisError}::Error)] + pub enum ${serviceName}ConfigError { + #{Variants:W} + } + """, + "ThisError" to ServerCargoDependency.ThisError.toType(), + "Variants" to variants.join("\n"), + ) + } + } + + private fun injectedMethods() = configMethods.map { + writable { + val paramBindings = it.params.map { binding -> + writable { rustTemplate("${binding.name}: #{BindingTy},", "BindingTy" to binding.ty) } + }.join("\n") + + // This produces a nested type like: "S>", where + // - "S" denotes a "stack type" with two generic type parameters: the first is the "inner" part of the stack + // and the second is the "outer" part of the stack. The outer part gets executed first. For an example, + // see `aws_smithy_http_server::plugin::PluginStack`. + // - "A", "B" are the types of the "things" that are added. + // - "T" is the generic type variable name used in the enclosing impl block. + fun List.stackReturnType(genericTypeVarName: String, stackType: RuntimeType): Writable = + this.fold(writable { rust(genericTypeVarName) }) { acc, next -> + writable { + rustTemplate( + "#{StackType}<#{Ty}, #{Acc:W}>", + "StackType" to stackType, + "Ty" to next.ty, + "Acc" to acc, + ) + } + } + + val layersReturnTy = + it.initializer.layerBindings.stackReturnType("L", RuntimeType.Tower.resolve("layer::util::Stack")) + val httpPluginsReturnTy = + it.initializer.httpPluginBindings.stackReturnType("H", smithyHttpServer.resolve("plugin::PluginStack")) + val modelPluginsReturnTy = + it.initializer.modelPluginBindings.stackReturnType("M", smithyHttpServer.resolve("plugin::PluginStack")) + + val configBuilderReturnTy = writable { + rustTemplate( + """ + ${serviceName}ConfigBuilder< + #{LayersReturnTy:W}, + #{HttpPluginsReturnTy:W}, + #{ModelPluginsReturnTy:W}, + > + """, + "LayersReturnTy" to layersReturnTy, + "HttpPluginsReturnTy" to httpPluginsReturnTy, + "ModelPluginsReturnTy" to modelPluginsReturnTy, + ) + } + + val returnTy = if (it.errorType != null) { + writable { + rustTemplate( + "#{Result}<#{T:W}, #{E}>", + "T" to configBuilderReturnTy, + "E" to it.errorType, + *codegenScope, + ) + } + } else { + configBuilderReturnTy + } + + docs(it.docs) + rustBlockTemplate( + """ + pub fn ${it.name}( + ##[allow(unused_mut)] + mut self, + #{ParamBindings:W} + ) -> #{ReturnTy:W} + """, + "ReturnTy" to returnTy, + "ParamBindings" to paramBindings, + ) { + rustTemplate("#{InitializerCode:W}", "InitializerCode" to it.initializer.code) + + check(it.initializer.layerBindings.size + it.initializer.httpPluginBindings.size + it.initializer.modelPluginBindings.size > 0) { + "This method's initializer does not register any layers, HTTP plugins, or model plugins. It must register at least something!" + } + + if (it.isRequired) { + rust("self.${it.requiredBuilderFlagName()} = true;") + } + conditionalBlock("Ok(", ")", conditional = it.errorType != null) { + val registrations = ( + it.initializer.layerBindings.map { ".layer(${it.name})" } + + it.initializer.httpPluginBindings.map { ".http_plugin(${it.name})" } + + it.initializer.modelPluginBindings.map { ".model_plugin(${it.name})" } + ).joinToString("") + rust("self$registrations") + } + } + } + }.join("\n\n") + + private fun builderBuildReturnType() = writable { + val t = "super::${serviceName}Config" + + if (isBuilderFallible) { + rustTemplate("#{Result}<$t, ${serviceName}ConfigError>", *codegenScope) + } else { + rust(t) + } + } + + private fun builderBuildMethod() = writable { + rustBlockTemplate( + """ + /// Build the configuration. + pub fn build(self) -> #{BuilderBuildReturnTy:W} + """, + "BuilderBuildReturnTy" to builderBuildReturnType(), + ) { + rustTemplate( + "#{BuilderBuildRequiredMethodChecks:W}", + "BuilderBuildRequiredMethodChecks" to builderBuildRequiredMethodChecks(), + ) + + conditionalBlock("Ok(", ")", isBuilderFallible) { + rust( + """ super::${serviceName}Config { layers: self.layers, http_plugins: self.http_plugins, model_plugins: self.model_plugins, } - } + """, + ) } - """, - *codegenScope, - ) + } } } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt new file mode 100644 index 00000000000..c2c568b291c --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt @@ -0,0 +1,231 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.core.testutil.unitTest +import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency +import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext +import software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest +import java.io.File + +internal class ServiceConfigGeneratorTest { + @Test + fun `it should inject an aws_auth method that configures an HTTP plugin and a model plugin`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + val decorator = object : ServerCodegenDecorator { + override val name: String + get() = "AWSAuth pre-applied middleware decorator" + override val order: Byte + get() = -69 + + override fun configMethods(codegenContext: ServerCodegenContext): List { + val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType() + val codegenScope = arrayOf( + "SmithyHttpServer" to smithyHttpServer, + ) + return listOf( + ConfigMethod( + name = "aws_auth", + docs = "Docs", + params = listOf( + Binding("auth_spec", RuntimeType.String), + Binding("authorizer", RuntimeType.U64), + ), + errorType = RuntimeType.std.resolve("io::Error"), + initializer = Initializer( + code = writable { + rustTemplate( + """ + if authorizer != 69 { + return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 1")); + } + + if auth_spec.len() != 69 { + return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 2")); + } + let authn_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + let authz_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + """, + *codegenScope, + ) + }, + layerBindings = emptyList(), + httpPluginBindings = listOf( + Binding( + "authn_plugin", + smithyHttpServer.resolve("plugin::IdentityPlugin"), + ), + ), + modelPluginBindings = listOf( + Binding( + "authz_plugin", + smithyHttpServer.resolve("plugin::IdentityPlugin"), + ), + ), + ), + isRequired = true, + ), + ) + } + } + + serverIntegrationTest(model, additionalDecorators = listOf(decorator)) { _, rustCrate -> + rustCrate.testModule { + rust( + """ + use crate::{SimpleServiceConfig, SimpleServiceConfigError}; + use aws_smithy_http_server::plugin::IdentityPlugin; + use crate::server::plugin::PluginStack; + """, + ) + + unitTest("successful_config_initialization") { + rust( + """ + let _: SimpleServiceConfig< + tower::layer::util::Identity, + // One HTTP plugin has been applied. + PluginStack, + // One model plugin has been applied. + PluginStack, + > = SimpleServiceConfig::builder() + .aws_auth("a".repeat(69).to_owned(), 69) + .expect("failed to configure aws_auth") + .build() + .unwrap(); + """, + ) + } + + unitTest("wrong_aws_auth_auth_spec") { + rust( + """ + let actual_err = SimpleServiceConfig::builder() + .aws_auth("a".to_owned(), 69) + .unwrap_err(); + let expected = std::io::Error::new(std::io::ErrorKind::Other, "failure 2").to_string(); + assert_eq!(actual_err.to_string(), expected); + """, + ) + } + + unitTest("wrong_aws_auth_authorizer") { + rust( + """ + let actual_err = SimpleServiceConfig::builder() + .aws_auth("a".repeat(69).to_owned(), 6969) + .unwrap_err(); + let expected = std::io::Error::new(std::io::ErrorKind::Other, "failure 1").to_string(); + assert_eq!(actual_err.to_string(), expected); + """, + ) + } + + unitTest("aws_auth_not_configured") { + rust( + """ + let actual_err = SimpleServiceConfig::builder().build().unwrap_err(); + let expected = SimpleServiceConfigError::AwsAuthNotConfigured.to_string(); + assert_eq!(actual_err.to_string(), expected); + """, + ) + } + } + } + } + + @Test + fun `it should inject an method that applies three non-required layers`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + val decorator = object : ServerCodegenDecorator { + override val name: String + get() = "ApplyThreeNonRequiredLayers" + override val order: Byte + get() = 69 + + override fun configMethods(codegenContext: ServerCodegenContext): List { + val identityLayer = RuntimeType.Tower.resolve("layer::util::Identity") + val codegenScope = arrayOf( + "Identity" to identityLayer, + ) + return listOf( + ConfigMethod( + name = "three_non_required_layers", + docs = "Docs", + params = emptyList(), + errorType = null, + initializer = Initializer( + code = writable { + rustTemplate( + """ + let layer1 = #{Identity}::new(); + let layer2 = #{Identity}::new(); + let layer3 = #{Identity}::new(); + """, + *codegenScope, + ) + }, + layerBindings = listOf( + Binding("layer1", identityLayer), + Binding("layer2", identityLayer), + Binding("layer3", identityLayer), + ), + httpPluginBindings = emptyList(), + modelPluginBindings = emptyList(), + ), + isRequired = false, + ), + ) + } + } + + serverIntegrationTest(model, additionalDecorators = listOf(decorator)) { _, rustCrate -> + rustCrate.testModule { + unitTest("successful_config_initialization_applying_the_three_layers") { + rust( + """ + let _: crate::SimpleServiceConfig< + // Three Tower layers have been applied. + tower::layer::util::Stack< + tower::layer::util::Identity, + tower::layer::util::Stack< + tower::layer::util::Identity, + tower::layer::util::Stack< + tower::layer::util::Identity, + tower::layer::util::Identity, + >, + >, + >, + aws_smithy_http_server::plugin::IdentityPlugin, + aws_smithy_http_server::plugin::IdentityPlugin, + > = crate::SimpleServiceConfig::builder() + .three_non_required_layers() + .build(); + """, + ) + } + + unitTest("successful_config_initialization_without_applying_the_three_layers") { + rust( + """ + crate::SimpleServiceConfig::builder().build(); + """, + ) + } + } + } + } +} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs b/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs index 6c96ebaca00..c42462ec52f 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs @@ -4,6 +4,7 @@ */ use super::{HttpMarker, ModelMarker, Plugin}; +use std::fmt::Debug; /// A wrapper struct which composes an `Inner` and an `Outer` [`Plugin`]. /// @@ -13,6 +14,7 @@ use super::{HttpMarker, ModelMarker, Plugin}; /// [`HttpPlugins`](crate::plugin::HttpPlugins), and the primary tool for composing HTTP plugins is /// [`ModelPlugins`](crate::plugin::ModelPlugins); if you are an application writer, you should /// prefer composing plugins using these. +#[derive(Debug)] pub struct PluginStack { inner: Inner, outer: Outer, From 1ae4d194cf68ee43617956821a744c3d26bf5cf6 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 31 Oct 2023 10:03:39 -0700 Subject: [PATCH 216/331] Upgrade ring to 0.17.5 (#3116) Fixes #3112. I opted to upgrade to the latest 0.17.5 in spite of the guidance in [RFC-21](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0021_dependency_versions.md) since this is a security critical dependency, and the maintainer has aggressively yanked old versions in the past. Note: ring 0.16 is still pulled in by rcgen as a dev dependency in aws-smithy-http-server-python after these changes. The rcgen crate hasn't upgraded yet. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++++++ aws/rust-runtime/aws-config/Cargo.toml | 2 +- aws/rust-runtime/aws-inlineable/Cargo.toml | 2 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 4 ++-- .../smithy/rust/codegen/core/rustlang/CargoDependency.kt | 2 +- examples/pokemon-service-client-usage/Cargo.toml | 2 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 2 +- tools/ci-resources/tls-stub/Cargo.toml | 2 +- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 267d530fd59..22cad69c346 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -512,3 +512,9 @@ message = "Service builder initialization now takes in a `${serviceName}Config` references = ["smithy-rs#3095", "smithy-rs#3096"] meta = { "breaking" = true, "tada" = false, "bug" = true, "target" = "server" } author = "david-perez" + +[[smithy-rs]] +message = "Upgrade `ring` to 0.17.5." +references = ["smithy-rs#3112", "smithy-rs#3116"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index c008b7651c0..b7c5e4bd589 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -43,7 +43,7 @@ http = "0.2.4" # implementation detail of SSO credential caching aws-sdk-sso = { path = "../../sdk/build/aws-sdk/sdk/sso", default-features = false, optional = true } -ring = { version = "0.16", optional = true } +ring = { version = "0.17.5", optional = true } hex = { version = "0.4.3", optional = true } zeroize = { version = "1", optional = true } diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index 0657b00e5db..c79039da4a9 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -26,7 +26,7 @@ bytes = "1" hex = "0.4.3" http = "0.2.9" http-body = "0.4.5" -ring = "0.16" +ring = "0.17.5" tokio = "1.23.1" tracing = "0.1" diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index d358e566203..ea98d34f881 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -30,7 +30,7 @@ once_cell = "1.8" p256 = { version = "0.11", features = ["ecdsa"], optional = true } percent-encoding = { version = "2.1", optional = true } regex = "1.5" -ring = { version = "0.16", optional = true } +ring = { version = "0.17.5", optional = true } sha2 = "0.10" time = "0.3.5" tracing = "0.1" @@ -52,7 +52,7 @@ serde_json = "1.0.104" time = { version = "0.3.5", features = ["parsing"] } [target.'cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))'.dev-dependencies] -ring = "0.16" +ring = "0.17.5" [[bench]] name = "hmac" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 56c9003b837..1ff88da814f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -238,7 +238,7 @@ data class CargoDependency( val Md5: CargoDependency = CargoDependency("md-5", CratesIo("0.10.0"), rustName = "md5") val PercentEncoding: CargoDependency = CargoDependency("percent-encoding", CratesIo("2.0.0")) val Regex: CargoDependency = CargoDependency("regex", CratesIo("1.5.5")) - val Ring: CargoDependency = CargoDependency("ring", CratesIo("0.16.0")) + val Ring: CargoDependency = CargoDependency("ring", CratesIo("0.17.5")) val TokioStream: CargoDependency = CargoDependency("tokio-stream", CratesIo("0.1.7")) val Tower: CargoDependency = CargoDependency("tower", CratesIo("0.4")) val Tracing: CargoDependency = CargoDependency("tracing", CratesIo("0.1")) diff --git a/examples/pokemon-service-client-usage/Cargo.toml b/examples/pokemon-service-client-usage/Cargo.toml index d3be7c83b10..77059a39f99 100644 --- a/examples/pokemon-service-client-usage/Cargo.toml +++ b/examples/pokemon-service-client-usage/Cargo.toml @@ -30,7 +30,7 @@ hyper = { version = "0.14.25", features = ["client", "full"] } tokio = {version = "1.26.0", features=["full"]} tracing = "0.1.37" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -rustls = "0.21.7" +rustls = "0.21.8" hyper-rustls = "0.24.1" http = "0.2.9" uuid = {version="1.4.1", features = ["v4"]} diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index b92f3360da8..c0dbfa5c407 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -35,7 +35,7 @@ hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"], once_cell = "1.18.0" pin-project-lite = "0.2.7" pin-utils = "0.1.0" -rustls = { version = "0.21.1", optional = true } +rustls = { version = "0.21.8", optional = true } serde = { version = "1", features = ["derive"], optional = true } serde_json = { version = "1", optional = true } tokio = { version = "1.25", features = [] } diff --git a/tools/ci-resources/tls-stub/Cargo.toml b/tools/ci-resources/tls-stub/Cargo.toml index a70780c482d..e0aff352ac2 100644 --- a/tools/ci-resources/tls-stub/Cargo.toml +++ b/tools/ci-resources/tls-stub/Cargo.toml @@ -16,7 +16,7 @@ aws-sdk-sts = { path = "../../../aws/sdk/build/aws-sdk/sdk/sts" } aws-smithy-runtime = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } exitcode = "1" hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"] } -rustls = "0.21" +rustls = "0.21.8" rustls-native-certs = "0.6" rustls-pemfile = "1" tokio = { version = "1", features = ["full"] } From 53d9bbc03cf5e287ff1fc9aa88f521ea4eaed410 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 31 Oct 2023 13:58:09 -0400 Subject: [PATCH 217/331] Update smoketest models (#3119) ## Motivation and Context ## Description ## Testing ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/sdk/aws-models/bedrock-runtime.json | 64 +- aws/sdk/aws-models/config.json | 195 +- aws/sdk/aws-models/dynamodb.json | 146 +- aws/sdk/aws-models/ec2.json | 3708 ++++-------------- aws/sdk/aws-models/ecs.json | 88 +- aws/sdk/aws-models/glacier.json | 933 ++++- aws/sdk/aws-models/iam.json | 100 +- aws/sdk/aws-models/kms.json | 40 +- aws/sdk/aws-models/lambda.json | 65 +- aws/sdk/aws-models/polly.json | 40 +- aws/sdk/aws-models/qldb-session.json | 40 +- aws/sdk/aws-models/route53.json | 78 +- aws/sdk/aws-models/s3.json | 82 +- aws/sdk/aws-models/s3control.json | 152 +- aws/sdk/aws-models/sso-oidc.json | 385 +- aws/sdk/aws-models/sso.json | 67 +- aws/sdk/aws-models/sts.json | 205 +- aws/sdk/aws-models/timestream-query.json | 40 +- aws/sdk/aws-models/timestream-write.json | 48 +- aws/sdk/aws-models/transcribe-streaming.json | 40 +- 20 files changed, 2509 insertions(+), 4007 deletions(-) diff --git a/aws/sdk/aws-models/bedrock-runtime.json b/aws/sdk/aws-models/bedrock-runtime.json index 238bd562b85..571e87e4eb4 100644 --- a/aws/sdk/aws-models/bedrock-runtime.json +++ b/aws/sdk/aws-models/bedrock-runtime.json @@ -76,7 +76,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -95,7 +94,6 @@ }, { "conditions": [], - "type": "tree", "rules": [ { "conditions": [ @@ -123,13 +121,14 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], - "type": "tree", "rules": [ { "conditions": [ @@ -142,7 +141,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -156,7 +154,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -179,7 +176,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -214,11 +210,9 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], - "type": "tree", "rules": [ { "conditions": [], @@ -229,16 +223,19 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -252,14 +249,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -268,15 +263,14 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], - "type": "tree", "rules": [ { "conditions": [], @@ -287,16 +281,19 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -310,7 +307,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -330,11 +326,9 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], - "type": "tree", "rules": [ { "conditions": [], @@ -345,20 +339,22 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "type": "tree", "rules": [ { "conditions": [], @@ -369,18 +365,22 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid Configuration: Missing Region", "type": "error" } - ] + ], + "type": "tree" } ] }, diff --git a/aws/sdk/aws-models/config.json b/aws/sdk/aws-models/config.json index d98e34a8d6b..386955ec097 100644 --- a/aws/sdk/aws-models/config.json +++ b/aws/sdk/aws-models/config.json @@ -675,7 +675,7 @@ "configurationItemStatus": { "target": "com.amazonaws.configservice#ConfigurationItemStatus", "traits": { - "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
\n \n

The CIs do not incur any cost.

\n
" + "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
" } }, "configurationStateId": { @@ -1631,7 +1631,7 @@ "configurationItemStatus": { "target": "com.amazonaws.configservice#ConfigurationItemStatus", "traits": { - "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
\n \n

The CIs do not incur any cost.

\n
" + "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
" } }, "configurationStateId": { @@ -5271,7 +5271,7 @@ } }, "traits": { - "smithy.api#documentation": "

The configuration object for Config rule evaluation mode. The Supported valid values are Detective or Proactive.

" + "smithy.api#documentation": "

The configuration object for Config rule evaluation mode. The supported valid values are Detective or Proactive.

" } }, "com.amazonaws.configservice#EvaluationModes": { @@ -5465,7 +5465,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies whether the configuration recorder excludes resource types from being recorded.\n\t\t\tUse the resourceTypes field to enter a comma-separated list of resource types to exclude as exemptions.

" + "smithy.api#documentation": "

Specifies whether the configuration recorder excludes certain resource types from being recorded.\n\t\t\tUse the resourceTypes field to enter a comma-separated list of resource types you want to exclude from recording.

\n

By default, when Config adds support for a new resource type in the Region where you set up the configuration recorder,\n\t\t\tincluding global resource types, Config starts recording resources of that type automatically.

\n \n

\n How to use\n

\n

To use this option, you must set the useOnly\n\t\t\t\tfield of RecordingStrategy\n\t\t\t\tto EXCLUSION_BY_RESOURCE_TYPES.

\n

Config will then record configuration changes for all supported resource types, except the resource types that you specify to exclude from being recorded.

\n

\n Globally recorded resources\n

\n

Unless specifically listed as exclusions,\n\t\t\t\tAWS::RDS::GlobalCluster will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.\n\t\t\t\tIAM users, groups, roles, and customer managed policies will be recorded automatically in all enabled Config Regions where Config was available before February 2022.\n\t\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n
" } }, "com.amazonaws.configservice#ExecutionControls": { @@ -6902,7 +6902,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a list of ConfigurationItems for the specified resource.\n\t\t\tThe list contains details about each state of the resource\n\t\t\tduring the specified time interval. If you specified a retention\n\t\t\tperiod to retain your ConfigurationItems between a\n\t\t\tminimum of 30 days and a maximum of 7 years (2557 days), Config\n\t\t\treturns the ConfigurationItems for the specified\n\t\t\tretention period.

\n

The response is paginated. By default, Config returns a\n\t\t\tlimit of 10 configuration items per page. You can customize this\n\t\t\tnumber with the limit parameter. The response includes\n\t\t\ta nextToken string. To get the next page of results,\n\t\t\trun the request again and specify the string for the\n\t\t\t\tnextToken parameter.

\n \n

Each call to the API is limited to span a duration of seven\n\t\t\t\tdays. It is likely that the number of records returned is\n\t\t\t\tsmaller than the specified limit. In such cases,\n\t\t\t\tyou can make another call, using the\n\t\t\t\tnextToken.

\n
", + "smithy.api#documentation": "\n

For accurate reporting on the compliance status, you must record the AWS::Config::ResourceCompliance resource type.\n\t\t\tFor more information, see Selecting Which Resources Config Records.

\n
\n

Returns a list of ConfigurationItems for the specified resource.\n\t\t\tThe list contains details about each state of the resource\n\t\t\tduring the specified time interval. If you specified a retention\n\t\t\tperiod to retain your ConfigurationItems between a\n\t\t\tminimum of 30 days and a maximum of 7 years (2557 days), Config\n\t\t\treturns the ConfigurationItems for the specified\n\t\t\tretention period.

\n

The response is paginated. By default, Config returns a\n\t\t\tlimit of 10 configuration items per page. You can customize this\n\t\t\tnumber with the limit parameter. The response includes\n\t\t\ta nextToken string. To get the next page of results,\n\t\t\trun the request again and specify the string for the\n\t\t\t\tnextToken parameter.

\n \n

Each call to the API is limited to span a duration of seven\n\t\t\t\tdays. It is likely that the number of records returned is\n\t\t\t\tsmaller than the specified limit. In such cases,\n\t\t\t\tyou can make another call, using the\n\t\t\t\tnextToken.

\n
", "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6931,13 +6931,13 @@ "laterTime": { "target": "com.amazonaws.configservice#LaterTime", "traits": { - "smithy.api#documentation": "

The time stamp that indicates a later time. If not specified,\n\t\t\tcurrent time is taken.

" + "smithy.api#documentation": "

The chronologically latest time in the time range for which the history requested. If not specified,\n\t\t\tcurrent time is taken.

" } }, "earlierTime": { "target": "com.amazonaws.configservice#EarlierTime", "traits": { - "smithy.api#documentation": "

The time stamp that indicates an earlier time. If not\n\t\t\tspecified, the action returns paginated results that contain\n\t\t\tconfiguration items that start when the first configuration item was\n\t\t\trecorded.

" + "smithy.api#documentation": "

The chronologically earliest time in the time range for which the history requested. If not\n\t\t\tspecified, the action returns paginated results that contain\n\t\t\tconfiguration items that start when the first configuration item was\n\t\t\trecorded.

" } }, "chronologicalOrder": { @@ -9153,7 +9153,7 @@ } }, "traits": { - "smithy.api#documentation": "

organization custom rule metadata such as resource type, resource ID of Amazon Web Services resource, Lambda function ARN, \n\t\t\tand organization trigger types that trigger Config to evaluate your Amazon Web Services resources against a rule. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" + "smithy.api#documentation": "

An object that specifies organization custom rule metadata such as resource type, resource ID of Amazon Web Services resource, Lambda function ARN, \n\t\t\tand organization trigger types that trigger Config to evaluate your Amazon Web Services resources against a rule. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" } }, "com.amazonaws.configservice#OrganizationManagedRuleMetadata": { @@ -9210,7 +9210,7 @@ } }, "traits": { - "smithy.api#documentation": "

organization managed rule metadata such as resource type and ID of Amazon Web Services resource along with the rule identifier. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" + "smithy.api#documentation": "

An object that specifies organization managed rule metadata such as resource type and ID of Amazon Web Services resource along with the rule identifier. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" } }, "com.amazonaws.configservice#OrganizationResourceDetailedStatus": { @@ -9802,7 +9802,7 @@ "TemplateS3Uri": { "target": "com.amazonaws.configservice#TemplateS3Uri", "traits": { - "smithy.api#documentation": "

The location of the file containing the template body (s3://bucketname/prefix). The uri must point to a conformance pack template (max size: 300 KB) that is located in an Amazon S3 bucket in the same Region as the conformance pack.

\n \n

You must have access to read Amazon S3 bucket.

\n
" + "smithy.api#documentation": "

The location of the file containing the template body (s3://bucketname/prefix). The uri must point to a conformance pack template (max size: 300 KB) that is located in an Amazon S3 bucket in the same Region as the conformance pack.

\n \n

You must have access to read Amazon S3 bucket.\n\t\t\tIn addition, in order to ensure a successful deployment, the template object must not be in an archived storage class if this parameter is passed.

\n
" } }, "TemplateBody": { @@ -9889,7 +9889,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a delivery channel object to deliver configuration\n\t\t\tinformation to an Amazon S3 bucket and Amazon SNS topic.

\n

Before you can create a delivery channel, you must create a\n\t\t\tconfiguration recorder.

\n

You can use this action to change the Amazon S3 bucket or an\n\t\t\tAmazon SNS topic of the existing delivery channel. To change the\n\t\t\tAmazon S3 bucket or an Amazon SNS topic, call this action and\n\t\t\tspecify the changed values for the S3 bucket and the SNS topic. If\n\t\t\tyou specify a different value for either the S3 bucket or the SNS\n\t\t\ttopic, this action will keep the existing value for the parameter\n\t\t\tthat is not changed.

\n \n

You can have only one delivery channel per region in your\n\t\t\t\taccount.

\n
" + "smithy.api#documentation": "

Creates a delivery channel object to deliver configuration\n\t\t\tinformation and other compliance information to an Amazon S3 bucket and Amazon SNS topic.\n\t\t\tFor more information,\n\t\t\tsee Notifications that Config Sends to an Amazon SNS topic.

\n

Before you can create a delivery channel, you must create a\n\t\t\tconfiguration recorder.

\n

You can use this action to change the Amazon S3 bucket or an\n\t\t\tAmazon SNS topic of the existing delivery channel. To change the\n\t\t\tAmazon S3 bucket or an Amazon SNS topic, call this action and\n\t\t\tspecify the changed values for the S3 bucket and the SNS topic. If\n\t\t\tyou specify a different value for either the S3 bucket or the SNS\n\t\t\ttopic, this action will keep the existing value for the parameter\n\t\t\tthat is not changed.

\n \n

You can have only one delivery channel per region in your\n\t\t\t\taccount.

\n
" } }, "com.amazonaws.configservice#PutDeliveryChannelRequest": { @@ -10166,7 +10166,7 @@ "TemplateS3Uri": { "target": "com.amazonaws.configservice#TemplateS3Uri", "traits": { - "smithy.api#documentation": "

Location of file containing the template body. The uri must point to the conformance pack template\n\t\t\t(max size: 300 KB).

\n \n

You must have access to read Amazon S3 bucket.

\n
" + "smithy.api#documentation": "

Location of file containing the template body. The uri must point to the conformance pack template\n\t\t\t(max size: 300 KB).

\n \n

You must have access to read Amazon S3 bucket.\n\t\t\tIn addition, in order to ensure a successful deployment, the template object must not be in an archived storage class if this parameter is passed.

\n
" } }, "TemplateBody": { @@ -10435,7 +10435,6 @@ "RetentionPeriodInDays": { "target": "com.amazonaws.configservice#RetentionPeriodInDays", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

Number of days Config stores your historical\n\t\t\tinformation.

\n \n

Currently, only applicable to the configuration item\n\t\t\t\thistory.

\n
", "smithy.api#required": {} } @@ -10620,14 +10619,14 @@ "target": "com.amazonaws.configservice#AllSupported", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether Config records configuration changes for all supported regional resource types.

\n

If you set this field to true, when Config\n\t\t\tadds support for a new type of regional resource, Config starts recording resources of that type automatically.

\n

If you set this field to true,\n\t\t\tyou cannot enumerate specific resource types to record in the resourceTypes field of RecordingGroup, or to exclude in the resourceTypes field of ExclusionByResourceTypes.

" + "smithy.api#documentation": "

Specifies whether Config records configuration changes for all supported regionally recorded resource types.

\n

If you set this field to true, when Config\n\t\t\tadds support for a new regionally recorded resource type, Config starts recording resources of that type automatically.

\n

If you set this field to true,\n\t\t\tyou cannot enumerate specific resource types to record in the resourceTypes field of RecordingGroup, or to exclude in the resourceTypes field of ExclusionByResourceTypes.

\n \n

\n Region Availability\n

\n

Check Resource Coverage by Region Availability\n\t\t\t\tto see if a resource type is supported in the Amazon Web Services Region where you set up Config.

\n
" } }, "includeGlobalResourceTypes": { "target": "com.amazonaws.configservice#IncludeGlobalResourceTypes", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether Config records configuration changes for all supported global resources.

\n

Before you set this field to true,\n\t\t\tset the allSupported field of RecordingGroup to\n\t\t\ttrue. Optionally, you can set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES.

\n

If you set this field to true, when Config\n\t\t\tadds support for a new type of global resource in the Region where you set up the configuration recorder, Config starts recording\n\t\t\tresources of that type automatically.

\n \n

If you set this field to false but list global resource types in the resourceTypes field of RecordingGroup,\n\t\t\tConfig will still record configuration changes for those specified resource types regardless of if you set the includeGlobalResourceTypes field to false.

\n

If you do not want to record configuration changes to global resource types, make sure to not list them in the resourceTypes field\n\t\t\tin addition to setting the includeGlobalResourceTypes field to false.

\n
" + "smithy.api#documentation": "

A legacy field which only applies to the globally recorded IAM resource types: IAM users, groups, roles, and customer managed policies.\n\t\t\tIf you select this option, these resource types will be recorded in all enabled Config regions where Config was available before February 2022.\n\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n \n

\n Aurora global clusters are automatically globally recorded\n

\n

The AWS::RDS::GlobalCluster resource type will be recorded in all supported Config Regions where the configuration recorder is enabled, even if includeGlobalResourceTypes is not set to true.\n\t\t\t\tincludeGlobalResourceTypes is a legacy field which only applies to IAM users, groups, roles, and customer managed policies.\n\t\t\t

\n

If you do not want to record AWS::RDS::GlobalCluster in all enabled Regions, use one of the following recording strategies:

\n
    \n
  1. \n

    \n Record all current and future resource types with exclusions (EXCLUSION_BY_RESOURCE_TYPES), or

    \n
  2. \n
  3. \n

    \n Record specific resource types (INCLUSION_BY_RESOURCE_TYPES).

    \n
  4. \n
\n

For more information, see Selecting Which Resources are Recorded in the Config developer guide.

\n
\n \n

\n Required and optional fields\n

\n

Before you set this field to true,\n\t\t\tset the allSupported field of RecordingGroup to\n\t\t\ttrue. Optionally, you can set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES.

\n
\n \n

\n Overriding fields\n

\n

If you set this field to false but list globally recorded IAM resource types in the resourceTypes field of RecordingGroup,\n\t\t\tConfig will still record configuration changes for those specified resource types regardless of if you set the includeGlobalResourceTypes field to false.

\n

If you do not want to record configuration changes to the globally recorded IAM resource types (IAM users, groups, roles, and customer managed policies), make sure to not list them in the resourceTypes field\n\t\t\tin addition to setting the includeGlobalResourceTypes field to false.

\n
" } }, "resourceTypes": { @@ -10645,12 +10644,12 @@ "recordingStrategy": { "target": "com.amazonaws.configservice#RecordingStrategy", "traits": { - "smithy.api#documentation": "

An object that specifies the recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regional resource types. You also must set the allSupported field of RecordingGroup to true. When Config adds support for a new type of regional resource, Config automatically starts recording resources of that type.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to INCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for only the resource types you specify in the resourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to EXCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for all supported resource types\n\t\t\t\texcept the resource types that you specify as exemptions to exclude from being recorded in the resourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, global resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exemptions in the resourceTypes field of exclusionByResourceTypes.

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\t\tConfig starts recording resources of that type automatically.

\n
" + "smithy.api#documentation": "

An object that specifies the recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regionally recorded resource types. You also must set the allSupported field of RecordingGroup to true. When Config adds support for a new regionally recorded resource type, Config automatically starts recording resources of that type.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to INCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for only the resource types you specify in the resourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to EXCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for all supported resource types\n\t\t\t\texcept the resource types that you specify to exclude from being recorded in the resourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

\n Required and optional fields\n

\n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

\n Overriding fields\n

\n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, globally recorded IAM resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exclusions in the resourceTypes field of exclusionByResourceTypes.

\n
\n \n

\n Global resources types and the resource exclusion recording strategy\n

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\tConfig starts recording resources of that type automatically.

\n

In addition, unless specifically listed as exclusions,\n\t\t\t\tAWS::RDS::GlobalCluster will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.\n\t\t\t\tIAM users, groups, roles, and customer managed policies will be recorded automatically in all enabled Config Regions where Config was available before February 2022.\n\t\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n
" } } }, "traits": { - "smithy.api#documentation": "

Specifies which resource types Config\n\t\t\trecords for configuration changes.\n\t\t\tIn the recording group, you specify whether you want to record all supported resource types or to include or exclude specific types of resources.

\n

By default, Config records configuration changes for all supported types of\n\t\t\t\tRegional resources that Config discovers in the\n\t\t\t\tAmazon Web Services Region in which it is running. Regional resources are tied to a\n\t\t\tRegion and can be used only in that Region. Examples of Regional resources are Amazon EC2 instances and Amazon EBS volumes.

\n

You can also have Config record supported types of global resources.\n\t\t\t\tGlobal resources are not tied to a specific Region and can be used in all Regions. The global\n\t\t\t\tresource types that Config supports include IAM users, groups, roles, and customer managed\n\t\t\t\tpolicies.

\n \n

Global resource types onboarded to Config recording after February 2022 will\n\t\t\t\tbe recorded only in the service's home Region for the commercial partition and\n\t\t\t\tAmazon Web Services GovCloud (US-West) for the Amazon Web Services GovCloud (US) partition. You can view the\n\t\t\t\tConfiguration Items for these new global resource types only in their home Region\n\t\t\t\tand Amazon Web Services GovCloud (US-West).

\n
\n

If you don't want Config to record all resources, you can specify which types of resources Config records with the resourceTypes parameter.

\n

For a list of supported resource types, see Supported Resource Types in the Config developer guide.

\n

For more information and a table of the Home Regions for Global Resource Types Onboarded after February 2022, see Selecting Which Resources Config Records in the Config developer guide.

" + "smithy.api#documentation": "

Specifies which resource types Config\n\t\t\trecords for configuration changes. By default, Config records configuration changes for all current and future supported resource types in the Amazon Web Services Region where you have enabled Config\n\t\t\t(excluding the globally recorded IAM resource types: IAM users, groups, roles, and customer managed policies).

\n

In the recording group, you specify whether you want to record all supported current and future supported resource types or to include or exclude specific resources types.\n\t\t\tFor a list of supported resource types, see Supported Resource Types in the Config developer guide.

\n

If you don't want Config to record all current and future supported resource types, use one of the following recording strategies:

\n
    \n
  1. \n

    \n Record all current and future resource types with exclusions (EXCLUSION_BY_RESOURCE_TYPES), or

    \n
  2. \n
  3. \n

    \n Record specific resource types (INCLUSION_BY_RESOURCE_TYPES).

    \n
  4. \n
\n \n

\n Aurora global clusters are automatically globally recorded\n

\n

The AWS::RDS::GlobalCluster resource type\n\t\t\t\twill be recorded in all supported Config Regions where the configuration recorder is enabled.

\n

If you do not want to record AWS::RDS::GlobalCluster in all enabled Regions, use the EXCLUSION_BY_RESOURCE_TYPES or INCLUSION_BY_RESOURCE_TYPES recording strategy.

\n
" } }, "com.amazonaws.configservice#RecordingStrategy": { @@ -10659,7 +10658,7 @@ "useOnly": { "target": "com.amazonaws.configservice#RecordingStrategyType", "traits": { - "smithy.api#documentation": "

The recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set this option to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regional resource types. You also must set the allSupported field of RecordingGroup to true.

    \n

    When Config adds support for a new type of regional resource, Config automatically starts recording resources of that type. For a list of supported resource types,\n\t\t\t\tsee Supported Resource Types in the Config developer guide.

    \n
  • \n
  • \n

    If you set this option to INCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for only the resource types that you specify in the\n\t\t\t\t\t\tresourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set this option to EXCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for all supported resource types, except the resource\n\t\t\t\t\ttypes that you specify as exemptions to exclude from being recorded in the\n\t\t\t\t\t\tresourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, global resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exemptions in the resourceTypes field of exclusionByResourceTypes.

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\t\tConfig starts recording resources of that type automatically.

\n
" + "smithy.api#documentation": "

The recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set this option to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regionally recorded resource types.\n\t\t\t\tYou also must set the allSupported field of RecordingGroup to true.\n\t\t\t\tWhen Config adds support for a new regionally recorded resource type, Config automatically starts recording resources of that type. For a list of supported resource types,\n\t\t\t\tsee Supported Resource Types in the Config developer guide.

    \n
  • \n
  • \n

    If you set this option to INCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for only the resource types that you specify in the\n\t\t\t\t\t\tresourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set this option to EXCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for all supported resource types, except the resource\n\t\t\t\t\ttypes that you specify to exclude from being recorded in the\n\t\t\t\t\t\tresourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

\n Required and optional fields\n

\n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

\n Overriding fields\n

\n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, globally recorded IAM resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exclusions in the resourceTypes field of exclusionByResourceTypes.

\n
\n \n

\n Global resource types and the exclusion recording strategy\n

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\t\tConfig starts recording resources of that type automatically.

\n

In addition, unless specifically listed as exclusions,\n\t\t\t\tAWS::RDS::GlobalCluster will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.\n\t\t\t\tIAM users, groups, roles, and customer managed policies will be recorded automatically in all enabled Config Regions where Config was available before February 2022.\n\t\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n
" } } }, @@ -13669,6 +13668,120 @@ "traits": { "smithy.api#enumValue": "AWS::NetworkManager::LinkAssociation" } + }, + "IoTWirelessMulticastGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoTWireless::MulticastGroup" + } + }, + "PersonalizeDatasetGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::DatasetGroup" + } + }, + "IoTTwinMakerComponentType": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoTTwinMaker::ComponentType" + } + }, + "CodeBuildReportGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CodeBuild::ReportGroup" + } + }, + "SageMakerFeatureGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::SageMaker::FeatureGroup" + } + }, + "MSKBatchScramSecret": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MSK::BatchScramSecret" + } + }, + "AppStreamStack": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppStream::Stack" + } + }, + "IoTJobTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoT::JobTemplate" + } + }, + "IoTWirelessFuotaTask": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoTWireless::FuotaTask" + } + }, + "IoTProvisioningTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoT::ProvisioningTemplate" + } + }, + "InspectorV2Filter": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::InspectorV2::Filter" + } + }, + "Route53ResolverResolverQueryLoggingConfigAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation" + } + }, + "ServiceDiscoveryInstance": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ServiceDiscovery::Instance" + } + }, + "TransferCertificate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Certificate" + } + }, + "MediaConnectFlowSource": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowSource" + } + }, + "APSRuleGroupsNamespace": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::APS::RuleGroupsNamespace" + } + }, + "CodeGuruProfilerProfilingGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CodeGuruProfiler::ProfilingGroup" + } + }, + "Route53ResolverResolverQueryLoggingConfig": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Route53Resolver::ResolverQueryLoggingConfig" + } + }, + "BatchSchedulingPolicy": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Batch::SchedulingPolicy" + } } } }, @@ -13756,7 +13869,6 @@ "RetentionPeriodInDays": { "target": "com.amazonaws.configservice#RetentionPeriodInDays", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

Number of days Config stores your historical information.

\n \n

Currently, only applicable to the configuration item history.

\n
", "smithy.api#required": {} } @@ -13797,7 +13909,6 @@ "com.amazonaws.configservice#RetentionPeriodInDays": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 30, "max": 2557 @@ -14517,7 +14628,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -14560,7 +14670,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -14573,7 +14684,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -14587,7 +14697,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -14610,7 +14719,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -14645,7 +14753,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -14656,14 +14763,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -14677,14 +14786,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -14693,18 +14800,17 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "stringEquals", "argv": [ - "aws-us-gov", { "fn": "getAttr", "argv": [ @@ -14713,7 +14819,8 @@ }, "name" ] - } + }, + "aws-us-gov" ] } ], @@ -14733,14 +14840,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -14754,7 +14863,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -14774,7 +14882,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -14785,14 +14892,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -14803,9 +14912,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], diff --git a/aws/sdk/aws-models/dynamodb.json b/aws/sdk/aws-models/dynamodb.json index c4e51dc02fb..c47b042f527 100644 --- a/aws/sdk/aws-models/dynamodb.json +++ b/aws/sdk/aws-models/dynamodb.json @@ -3752,7 +3752,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3795,7 +3794,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -3808,7 +3808,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3822,7 +3821,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3845,7 +3843,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3880,7 +3877,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -3891,14 +3887,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -3912,14 +3910,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -3928,18 +3924,17 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "stringEquals", "argv": [ - "aws-us-gov", { "fn": "getAttr", "argv": [ @@ -3948,7 +3943,8 @@ }, "name" ] - } + }, + "aws-us-gov" ] } ], @@ -3968,14 +3964,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -3989,7 +3987,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -4009,7 +4006,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -4020,14 +4016,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -4065,9 +4063,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -5246,6 +5246,18 @@ "traits": { "smithy.api#documentation": "

The number of items exported.

" } + }, + "ExportType": { + "target": "com.amazonaws.dynamodb#ExportType", + "traits": { + "smithy.api#documentation": "

The type of export that was performed. Valid values are FULL_EXPORT or INCREMENTAL_EXPORT.

" + } + }, + "IncrementalExportSpecification": { + "target": "com.amazonaws.dynamodb#IncrementalExportSpecification", + "traits": { + "smithy.api#documentation": "

Optional object containing the parameters specific to an incremental export.

" + } } }, "traits": { @@ -5272,6 +5284,9 @@ } } }, + "com.amazonaws.dynamodb#ExportFromTime": { + "type": "timestamp" + }, "com.amazonaws.dynamodb#ExportManifest": { "type": "string" }, @@ -5336,6 +5351,12 @@ "traits": { "smithy.api#documentation": "

Export can be in one of the following states: IN_PROGRESS, COMPLETED, or\n FAILED.

" } + }, + "ExportType": { + "target": "com.amazonaws.dynamodb#ExportType", + "traits": { + "smithy.api#documentation": "

The type of export that was performed. Valid values are FULL_EXPORT or INCREMENTAL_EXPORT.

" + } } }, "traits": { @@ -5433,6 +5454,18 @@ "traits": { "smithy.api#documentation": "

The format for the exported data. Valid values for ExportFormat are\n DYNAMODB_JSON or ION.

" } + }, + "ExportType": { + "target": "com.amazonaws.dynamodb#ExportType", + "traits": { + "smithy.api#documentation": "

Choice of whether to execute as a full export or incremental export. Valid values are FULL_EXPORT or INCREMENTAL_EXPORT. The default value is FULL_EXPORT. If INCREMENTAL_EXPORT is provided, the IncrementalExportSpecification must also be used.

" + } + }, + "IncrementalExportSpecification": { + "target": "com.amazonaws.dynamodb#IncrementalExportSpecification", + "traits": { + "smithy.api#documentation": "

Optional object containing the parameters specific to an incremental export.

" + } } }, "traits": { @@ -5456,6 +5489,43 @@ "com.amazonaws.dynamodb#ExportTime": { "type": "timestamp" }, + "com.amazonaws.dynamodb#ExportToTime": { + "type": "timestamp" + }, + "com.amazonaws.dynamodb#ExportType": { + "type": "enum", + "members": { + "FULL_EXPORT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "FULL_EXPORT" + } + }, + "INCREMENTAL_EXPORT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INCREMENTAL_EXPORT" + } + } + } + }, + "com.amazonaws.dynamodb#ExportViewType": { + "type": "enum", + "members": { + "NEW_IMAGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "NEW_IMAGE" + } + }, + "NEW_AND_OLD_IMAGES": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "NEW_AND_OLD_IMAGES" + } + } + } + }, "com.amazonaws.dynamodb#ExpressionAttributeNameMap": { "type": "map", "key": { @@ -6426,6 +6496,32 @@ } } }, + "com.amazonaws.dynamodb#IncrementalExportSpecification": { + "type": "structure", + "members": { + "ExportFromTime": { + "target": "com.amazonaws.dynamodb#ExportFromTime", + "traits": { + "smithy.api#documentation": "

Time in the past which provides the inclusive start range for the export table's data, counted in seconds from the start of the Unix epoch. The incremental export will reflect the table's state including and after this point in time.

" + } + }, + "ExportToTime": { + "target": "com.amazonaws.dynamodb#ExportToTime", + "traits": { + "smithy.api#documentation": "

Time in the past which provides the exclusive end range for the export table's data, counted in seconds from the start of the Unix epoch. The incremental export will reflect the table's state just prior to this point in time. If this is not provided, the latest time with data available will be used.

" + } + }, + "ExportViewType": { + "target": "com.amazonaws.dynamodb#ExportViewType", + "traits": { + "smithy.api#documentation": "

The view type that was chosen for the export. Valid values are NEW_AND_OLD_IMAGES and NEW_IMAGES. The default value is NEW_AND_OLD_IMAGES.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Optional object containing the parameters specific to an incremental export.

" + } + }, "com.amazonaws.dynamodb#IndexName": { "type": "string", "traits": { @@ -6961,7 +7057,7 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

List backups associated with an Amazon Web Services account. To list backups for a\n given table, specify TableName. ListBackups returns a\n paginated list of results with at most 1 MB worth of items in a page. You can also\n specify a maximum number of entries to be returned in a page.

\n

In the request, start time is inclusive, but end time is exclusive. Note that these\n boundaries are for the time at which the original backup was requested.

\n

You can call ListBackups a maximum of five times per second.

" + "smithy.api#documentation": "

List DynamoDB backups that are associated with an Amazon Web Services account and weren't made with Amazon Web Services Backup. \n To list these backups for a given table, specify TableName. ListBackups returns a\n paginated list of results with at most 1 MB worth of items in a page. You can also\n specify a maximum number of entries to be returned in a page.

\n

In the request, start time is inclusive, but end time is exclusive. Note that these\n boundaries are for the time at which the original backup was requested.

\n

You can call ListBackups a maximum of five times per second.

\n

If you want to retrieve the complete list of backups made with Amazon Web Services Backup, use the \n Amazon Web Services Backup list API.\n

" } }, "com.amazonaws.dynamodb#ListBackupsInput": { @@ -9855,7 +9951,7 @@ "FilterExpression": { "target": "com.amazonaws.dynamodb#ConditionExpression", "traits": { - "smithy.api#documentation": "

A string that contains conditions that DynamoDB applies after the Scan\n operation, but before the data is returned to you. Items that do not satisfy the\n FilterExpression criteria are not returned.

\n \n

A FilterExpression is applied after the items have already been read;\n the process of filtering does not consume any additional read capacity units.

\n
\n

For more information, see Filter Expressions in the Amazon DynamoDB Developer\n Guide.

" + "smithy.api#documentation": "

A string that contains conditions that DynamoDB applies after the Scan\n operation, but before the data is returned to you. Items that do not satisfy the\n FilterExpression criteria are not returned.

\n \n

A FilterExpression is applied after the items have already been read;\n the process of filtering does not consume any additional read capacity units.

\n
\n

For more information, see Filter Expressions in the Amazon DynamoDB Developer\n Guide.

" } }, "ExpressionAttributeNames": { @@ -10973,7 +11069,7 @@ } }, "traits": { - "smithy.api#documentation": "

The entire transaction request was canceled.

\n

DynamoDB cancels a TransactWriteItems request under the following\n circumstances:

\n
    \n
  • \n

    A condition in one of the condition expressions is not met.

    \n
  • \n
  • \n

    A table in the TransactWriteItems request is in a different\n account or region.

    \n
  • \n
  • \n

    More than one action in the TransactWriteItems operation\n targets the same item.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    An item size becomes too large (larger than 400 KB), or a local secondary\n index (LSI) becomes too large, or a similar validation error occurs because of\n changes made by the transaction.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
\n

DynamoDB cancels a TransactGetItems request under the\n following circumstances:

\n
    \n
  • \n

    There is an ongoing TransactGetItems operation that conflicts\n with a concurrent PutItem, UpdateItem,\n DeleteItem or TransactWriteItems request. In this\n case the TransactGetItems operation fails with a\n TransactionCanceledException.

    \n
  • \n
  • \n

    A table in the TransactGetItems request is in a different\n account or region.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
\n \n

If using Java, DynamoDB lists the cancellation reasons on the\n CancellationReasons property. This property is not set for other\n languages. Transaction cancellation reasons are ordered in the order of requested\n items, if an item has no error it will have None code and\n Null message.

\n
\n

Cancellation reason codes and possible error messages:

\n
    \n
  • \n

    No Errors:

    \n
      \n
    • \n

      Code: None\n

      \n
    • \n
    • \n

      Message: null\n

      \n
    • \n
    \n
  • \n
  • \n

    Conditional Check Failed:

    \n
      \n
    • \n

      Code: ConditionalCheckFailed\n

      \n
    • \n
    • \n

      Message: The conditional request failed.

      \n
    • \n
    \n
  • \n
  • \n

    Item Collection Size Limit Exceeded:

    \n
      \n
    • \n

      Code: ItemCollectionSizeLimitExceeded\n

      \n
    • \n
    • \n

      Message: Collection size exceeded.

      \n
    • \n
    \n
  • \n
  • \n

    Transaction Conflict:

    \n
      \n
    • \n

      Code: TransactionConflict\n

      \n
    • \n
    • \n

      Message: Transaction is ongoing for the item.

      \n
    • \n
    \n
  • \n
  • \n

    Provisioned Throughput Exceeded:

    \n
      \n
    • \n

      Code: ProvisionedThroughputExceeded\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        The level of configured provisioned throughput for the\n table was exceeded. Consider increasing your provisioning level\n with the UpdateTable API.

        \n \n

        This Message is received when provisioned throughput is\n exceeded is on a provisioned DynamoDB\n table.

        \n
        \n
      • \n
      • \n

        The level of configured provisioned throughput for one or\n more global secondary indexes of the table was exceeded.\n Consider increasing your provisioning level for the\n under-provisioned global secondary indexes with the UpdateTable\n API.

        \n \n

        This message is returned when provisioned throughput is\n exceeded is on a provisioned GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Throttling Error:

    \n
      \n
    • \n

      Code: ThrottlingError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        Throughput exceeds the current capacity of your table or\n index. DynamoDB is automatically scaling your table or\n index so please try again shortly. If exceptions persist, check\n if you have a hot key:\n https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.

        \n \n

        This message is returned when writes get throttled on an\n On-Demand table as DynamoDB is automatically\n scaling the table.

        \n
        \n
      • \n
      • \n

        Throughput exceeds the current capacity for one or more\n global secondary indexes. DynamoDB is automatically\n scaling your index so please try again shortly.

        \n \n

        This message is returned when writes get throttled on\n an On-Demand GSI as DynamoDB is automatically\n scaling the GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Validation Error:

    \n
      \n
    • \n

      Code: ValidationError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        One or more parameter values were invalid.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key beyond allowed size limits.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key to unsupported type.

        \n
      • \n
      • \n

        An operand in the update expression has an incorrect data\n type.

        \n
      • \n
      • \n

        Item size to update has exceeded the maximum allowed\n size.

        \n
      • \n
      • \n

        Number overflow. Attempting to store a number with\n magnitude larger than supported range.

        \n
      • \n
      • \n

        Type mismatch for attribute to update.

        \n
      • \n
      • \n

        Nesting Levels have exceeded supported limits.

        \n
      • \n
      • \n

        The document path provided in the update expression is\n invalid for update.

        \n
      • \n
      • \n

        The provided expression refers to an attribute that does\n not exist in the item.

        \n
      • \n
      \n
    • \n
    \n
  • \n
", + "smithy.api#documentation": "

The entire transaction request was canceled.

\n

DynamoDB cancels a TransactWriteItems request under the following\n circumstances:

\n
    \n
  • \n

    A condition in one of the condition expressions is not met.

    \n
  • \n
  • \n

    A table in the TransactWriteItems request is in a different\n account or region.

    \n
  • \n
  • \n

    More than one action in the TransactWriteItems operation\n targets the same item.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    An item size becomes too large (larger than 400 KB), or a local secondary\n index (LSI) becomes too large, or a similar validation error occurs because of\n changes made by the transaction.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
  • \n

    \n There is an ongoing TransactWriteItems operation that conflicts with a concurrent \n TransactWriteItems request. In this case the TransactWriteItems operation \n fails with a TransactionCanceledException.\n

    \n
  • \n
\n

DynamoDB cancels a TransactGetItems request under the\n following circumstances:

\n
    \n
  • \n

    There is an ongoing TransactGetItems operation that conflicts\n with a concurrent PutItem, UpdateItem,\n DeleteItem or TransactWriteItems request. In this\n case the TransactGetItems operation fails with a\n TransactionCanceledException.

    \n
  • \n
  • \n

    A table in the TransactGetItems request is in a different\n account or region.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
\n \n

If using Java, DynamoDB lists the cancellation reasons on the\n CancellationReasons property. This property is not set for other\n languages. Transaction cancellation reasons are ordered in the order of requested\n items, if an item has no error it will have None code and\n Null message.

\n
\n

Cancellation reason codes and possible error messages:

\n
    \n
  • \n

    No Errors:

    \n
      \n
    • \n

      Code: None\n

      \n
    • \n
    • \n

      Message: null\n

      \n
    • \n
    \n
  • \n
  • \n

    Conditional Check Failed:

    \n
      \n
    • \n

      Code: ConditionalCheckFailed\n

      \n
    • \n
    • \n

      Message: The conditional request failed.

      \n
    • \n
    \n
  • \n
  • \n

    Item Collection Size Limit Exceeded:

    \n
      \n
    • \n

      Code: ItemCollectionSizeLimitExceeded\n

      \n
    • \n
    • \n

      Message: Collection size exceeded.

      \n
    • \n
    \n
  • \n
  • \n

    Transaction Conflict:

    \n
      \n
    • \n

      Code: TransactionConflict\n

      \n
    • \n
    • \n

      Message: Transaction is ongoing for the item.

      \n
    • \n
    \n
  • \n
  • \n

    Provisioned Throughput Exceeded:

    \n
      \n
    • \n

      Code: ProvisionedThroughputExceeded\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        The level of configured provisioned throughput for the\n table was exceeded. Consider increasing your provisioning level\n with the UpdateTable API.

        \n \n

        This Message is received when provisioned throughput is\n exceeded is on a provisioned DynamoDB\n table.

        \n
        \n
      • \n
      • \n

        The level of configured provisioned throughput for one or\n more global secondary indexes of the table was exceeded.\n Consider increasing your provisioning level for the\n under-provisioned global secondary indexes with the UpdateTable\n API.

        \n \n

        This message is returned when provisioned throughput is\n exceeded is on a provisioned GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Throttling Error:

    \n
      \n
    • \n

      Code: ThrottlingError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        Throughput exceeds the current capacity of your table or\n index. DynamoDB is automatically scaling your table or\n index so please try again shortly. If exceptions persist, check\n if you have a hot key:\n https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.

        \n \n

        This message is returned when writes get throttled on an\n On-Demand table as DynamoDB is automatically\n scaling the table.

        \n
        \n
      • \n
      • \n

        Throughput exceeds the current capacity for one or more\n global secondary indexes. DynamoDB is automatically\n scaling your index so please try again shortly.

        \n \n

        This message is returned when writes get throttled on\n an On-Demand GSI as DynamoDB is automatically\n scaling the GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Validation Error:

    \n
      \n
    • \n

      Code: ValidationError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        One or more parameter values were invalid.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key beyond allowed size limits.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key to unsupported type.

        \n
      • \n
      • \n

        An operand in the update expression has an incorrect data\n type.

        \n
      • \n
      • \n

        Item size to update has exceeded the maximum allowed\n size.

        \n
      • \n
      • \n

        Number overflow. Attempting to store a number with\n magnitude larger than supported range.

        \n
      • \n
      • \n

        Type mismatch for attribute to update.

        \n
      • \n
      • \n

        Nesting Levels have exceeded supported limits.

        \n
      • \n
      • \n

        The document path provided in the update expression is\n invalid for update.

        \n
      • \n
      • \n

        The provided expression refers to an attribute that does\n not exist in the item.

        \n
      • \n
      \n
    • \n
    \n
  • \n
", "smithy.api#error": "client" } }, diff --git a/aws/sdk/aws-models/ec2.json b/aws/sdk/aws-models/ec2.json index ee7045e56bf..6afa836ebbf 100644 --- a/aws/sdk/aws-models/ec2.json +++ b/aws/sdk/aws-models/ec2.json @@ -36,8 +36,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of accelerators. If this parameter is not specified, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -46,8 +44,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of accelerators. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -63,16 +59,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of accelerators. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of accelerators. To specify no maximum limit, omit this\n parameter. To exclude accelerator-enabled instance types, set Max to\n 0.

" } } @@ -194,8 +186,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of accelerator memory, in MiB. If this parameter is not specified,\n there is no minimum limit.

", "smithy.api#xmlName": "min" } @@ -204,8 +194,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of accelerator memory, in MiB. If this parameter is not specified,\n there is no maximum limit.

", "smithy.api#xmlName": "max" } @@ -221,16 +209,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of accelerator memory, in MiB. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of accelerator memory, in MiB. To specify no maximum limit, omit this\n parameter.

" } } @@ -304,8 +288,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -348,8 +330,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -428,8 +408,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -480,8 +458,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -532,8 +508,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -576,8 +550,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -638,8 +610,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -1353,7 +1323,6 @@ "com.amazonaws.ec2#AddressMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -1483,8 +1452,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -1575,7 +1542,7 @@ "NetworkBorderGroup": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

A unique set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services\n advertises IP addresses. Use this parameter to limit the IP address to this location. IP\n addresses cannot move between network border groups.

\n

Use DescribeAvailabilityZones to view the network border groups.

\n

You cannot use a network border group with EC2 Classic. If you attempt this operation on EC2 Classic, \n you receive an InvalidParameterCombination error.

" + "smithy.api#documentation": "

A unique set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services\n advertises IP addresses. Use this parameter to limit the IP address to this location. IP\n addresses cannot move between network border groups.

\n

Use DescribeAvailabilityZones to view the network border groups.

" } }, "CustomerOwnedIpv4Pool": { @@ -1588,8 +1555,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -1737,8 +1702,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Quantity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these parameters. If you are \n allocating the Dedicated Hosts on an Outpost, and you specify AssetIds, \n you can omit this parameter. In this case, Amazon EC2 allocates a Dedicated Host on each \n specified hardware asset. If you specify both AssetIds and \n Quantity, then the value that you specify for \n Quantity must be equal to the number of asset IDs specified.

", "smithy.api#xmlName": "quantity" } @@ -1815,8 +1778,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -1837,8 +1798,6 @@ "NetmaskLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you would like to allocate from the IPAM pool. Note the following:

\n
    \n
  • \n

    If there is no DefaultNetmaskLength allocation rule set on the pool, you must specify either the NetmaskLength or the CIDR.

    \n
  • \n
  • \n

    If the DefaultNetmaskLength allocation rule is set on the pool, you can specify either the NetmaskLength or the CIDR and the DefaultNetmaskLength allocation rule will be ignored.

    \n
  • \n
\n

Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

" } }, @@ -1858,8 +1817,6 @@ "PreviewNextCidr": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A preview of the next available CIDR in a pool.

" } }, @@ -3254,6 +3211,9 @@ { "target": "com.amazonaws.ec2#DisableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#DisableImage" + }, { "target": "com.amazonaws.ec2#DisableImageBlockPublicAccess" }, @@ -3335,6 +3295,9 @@ { "target": "com.amazonaws.ec2#EnableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#EnableImage" + }, { "target": "com.amazonaws.ec2#EnableImageBlockPublicAccess" }, @@ -3464,6 +3427,9 @@ { "target": "com.amazonaws.ec2#GetReservedInstancesExchangeQuote" }, + { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpc" + }, { "target": "com.amazonaws.ec2#GetSerialConsoleAccessStatus" }, @@ -3986,7 +3952,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -4029,7 +3994,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -4042,7 +4008,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -4056,7 +4021,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -4079,7 +4043,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -4114,7 +4077,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -4125,14 +4087,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -4146,14 +4110,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -4162,18 +4124,17 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "stringEquals", "argv": [ - "aws-us-gov", { "fn": "getAttr", "argv": [ @@ -4182,7 +4143,8 @@ }, "name" ] - } + }, + "aws-us-gov" ] } ], @@ -4202,14 +4164,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -4223,7 +4187,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -4243,7 +4206,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -4254,14 +4216,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -4272,9 +4236,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -5060,8 +5026,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Egress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the rule is an outbound rule.

", "smithy.api#xmlName": "egress" } @@ -5094,8 +5058,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RuleNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number.

", "smithy.api#xmlName": "ruleNumber" } @@ -5153,8 +5115,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "LoadBalancerPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port on which the load balancer is listening.

", "smithy.api#xmlName": "loadBalancerPort" } @@ -5163,8 +5123,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "InstancePort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

[Classic Load Balancers] The back-end port for the listener.

", "smithy.api#xmlName": "instancePort" } @@ -5205,8 +5163,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port on which the target is listening.

", "smithy.api#xmlName": "port" } @@ -5523,8 +5479,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -5680,8 +5634,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of additional IPv6 addresses to assign to the network interface. \n \t\tThe specified number of IPv6 addresses are assigned in addition to the \n \t\texisting IPv6 addresses that are already assigned to the network interface. \n \t\tAmazon EC2 automatically selects the IPv6 addresses from the subnet range. You \n \t\tcan't use this option if specifying specific IPv6 addresses.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -5697,8 +5649,6 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigns to the\n network interface. You cannot use this option if you use the Ipv6Prefixes\n option.

" } }, @@ -5787,8 +5737,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowReassignment", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to allow an IP address that is already assigned to another network interface or instance to be reassigned to the specified network interface.

", "smithy.api#xmlName": "allowReassignment" } @@ -5815,8 +5763,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary IP addresses to assign to the network interface. You can't specify this parameter when also specifying private IP addresses.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -5831,8 +5777,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes that Amazon Web Services automatically assigns to the network interface. You cannot use this option if you use the Ipv4 Prefixes option.

" } } @@ -5907,16 +5851,12 @@ "PrivateIpAddressCount": { "target": "com.amazonaws.ec2#PrivateIpAddressCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of private IP addresses to assign to the NAT gateway. You can't specify this parameter when also specifying private IP addresses.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6024,8 +5964,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowReassociation", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Reassociation is automatic, but you can specify false to ensure the operation fails if the Elastic IP address is already associated with another resource.

", "smithy.api#xmlName": "allowReassociation" } @@ -6034,8 +5972,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -6118,8 +6054,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -6197,8 +6131,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -6242,8 +6174,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -6377,8 +6307,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -6437,8 +6365,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -6502,7 +6428,7 @@ "target": "com.amazonaws.ec2#AssociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, \n see Work with NAT gateways in the Amazon VPC User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon VPC User Guide.

" + "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, \n see Work with NAT gateways in the Amazon VPC User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon VPC User Guide.

\n \n

When you associate an EIP or secondary EIPs with a public NAT gateway, the network border group of the EIPs must match the network border group of the Availability Zone (AZ) that the public NAT gateway is in. If it's not the same, the EIP will fail to associate. You can see the network border group for the subnet's AZ by viewing the details of the subnet. Similarly, you can view the network border group of an EIP by viewing the details of the EIP address. For more information about network border groups and EIPs, see Allocate an Elastic IP address in the Amazon VPC User Guide. \n

\n
" } }, "com.amazonaws.ec2#AssociateNatGatewayAddressRequest": { @@ -6535,8 +6461,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6601,8 +6525,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -6766,8 +6688,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6826,8 +6746,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6886,8 +6804,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6946,16 +6862,12 @@ "VlanId": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ID of the VLAN. This applies to the VLAN protocol.

" } }, "GreKey": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The application key. This applies to the GRE protocol.

" } }, @@ -6969,8 +6881,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -7022,8 +6932,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AmazonProvidedIpv6CidrBlock", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IPv6 addresses, or the size of the CIDR block.

", "smithy.api#xmlName": "amazonProvidedIpv6CidrBlock" } @@ -7354,8 +7262,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7401,8 +7307,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -7441,8 +7345,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7506,7 +7408,6 @@ "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the device for the network interface attachment.

", "smithy.api#required": {}, "smithy.api#xmlName": "deviceIndex" @@ -7516,8 +7417,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7545,8 +7444,6 @@ "NetworkCardIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card. Some instance types support multiple network cards. \n The primary network interface must be assigned to network card index 0. \n The default is network card index 0.

" } }, @@ -7577,8 +7474,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -7630,8 +7525,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -7725,8 +7618,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7771,8 +7662,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7807,8 +7696,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSrdEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether ENA Express is enabled for the network interface that's attached to the\n\t\t\tinstance.

", "smithy.api#xmlName": "enaSrdEnabled" } @@ -7833,8 +7720,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSrdUdpEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether UDP traffic to and from the instance uses ENA Express. To specify this setting, \n\t\t\tyou must first enable ENA Express.

", "smithy.api#xmlName": "enaSrdUdpEnabled" } @@ -7880,8 +7765,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The attribute value. The valid values are true or false.

", "smithy.api#xmlName": "value" } @@ -7938,8 +7821,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AccessAll", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the authorization rule grants access to all clients.

", "smithy.api#xmlName": "accessAll" } @@ -8014,8 +7895,6 @@ "AuthorizeAllGroups": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to grant access to all clients. Specify true to grant all\n clients who successfully establish a VPN connection access to the network. Must be set\n to true if AccessGroupId is not specified.

" } }, @@ -8035,8 +7914,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -8102,8 +7979,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -8145,8 +8020,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "fromPort" } @@ -8163,8 +8036,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "toPort" } @@ -8197,8 +8068,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -8263,8 +8132,6 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP, this is the type number. A value of -1 indicates all ICMP types. \n If you specify all ICMP types, you must specify all ICMP codes.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, @@ -8307,8 +8174,6 @@ "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP, this is the code. A value of -1 indicates all ICMP codes. \n If you specify all ICMP types, you must specify all ICMP codes.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, @@ -8316,8 +8181,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -8341,8 +8204,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -8626,8 +8487,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableVCpus", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of vCPUs available for launching instances onto the Dedicated Host.

", "smithy.api#xmlName": "availableVCpus" } @@ -8685,8 +8544,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum baseline bandwidth, in Mbps. If this parameter is not specified, there is no\n minimum limit.

", "smithy.api#xmlName": "min" } @@ -8695,8 +8552,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum baseline bandwidth, in Mbps. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -8712,16 +8567,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum baseline bandwidth, in Mbps. To specify no minimum limit, omit\n this parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum baseline bandwidth, in Mbps. To specify no maximum limit, omit\n this parameter.

" } } @@ -8883,10 +8734,7 @@ } }, "com.amazonaws.ec2#Boolean": { - "type": "boolean", - "traits": { - "smithy.api#default": false - } + "type": "boolean" }, "com.amazonaws.ec2#BootModeType": { "type": "enum", @@ -8987,8 +8835,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9352,8 +9198,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9441,8 +9285,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -9498,8 +9340,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -9515,8 +9355,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -9543,8 +9381,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9594,7 +9430,7 @@ "traits": { "aws.protocols#ec2QueryName": "ExportTaskId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of the export task. This is the ID returned by CreateInstanceExportTask.

", + "smithy.api#documentation": "

The ID of the export task. This is the ID returned by the\n CreateInstanceExportTask and ExportImage operations.

", "smithy.api#required": {}, "smithy.api#xmlName": "exportTaskId" } @@ -9630,8 +9466,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -9647,8 +9481,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -9682,8 +9514,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -9875,8 +9705,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9896,7 +9724,6 @@ "traits": { "aws.protocols#ec2QueryName": "TerminateInstances", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to terminate the associated instances when the Spot Fleet request is canceled. \n The default is to terminate the instances.

\n

To let the instances continue to run after the Spot Fleet request is canceled, specify\n no-terminate-instances.

", "smithy.api#required": {}, "smithy.api#xmlName": "terminateInstances" @@ -10047,8 +9874,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -10133,8 +9958,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of instance capacity associated with the usage. For example a value of \n\t\t\t4 indicates that instance capacity for 4 instances is currently in use.

", "smithy.api#xmlName": "count" } @@ -10224,8 +10047,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of instances for which the Capacity Reservation reserves capacity.

", "smithy.api#xmlName": "totalInstanceCount" } @@ -10234,8 +10055,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The remaining capacity. Indicates the number of instances that can be launched in the Capacity Reservation.

", "smithy.api#xmlName": "availableInstanceCount" } @@ -10244,8 +10063,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation supports EBS-optimized instances. This optimization provides\n\t\t\tdedicated throughput to Amazon EBS and an optimized configuration stack to provide\n\t\t\toptimal I/O performance. This optimization isn't available with all instance types.\n\t\t\tAdditional usage charges apply when using an EBS- optimized instance.

", "smithy.api#xmlName": "ebsOptimized" } @@ -10254,8 +10071,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EphemeralStorage", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

\n Deprecated.\n

", "smithy.api#xmlName": "ephemeralStorage" } @@ -10384,8 +10199,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units for which the Capacity Reservation Fleet reserves capacity. \n\t\t\tFor more information, see Total target capacity \n\t\t\tin the Amazon EC2 User Guide.

", "smithy.api#xmlName": "totalTargetCapacity" } @@ -10394,8 +10207,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "TotalFulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The capacity units that have been fulfilled.

", "smithy.api#xmlName": "totalFulfilledCapacity" } @@ -10731,6 +10542,12 @@ "traits": { "smithy.api#enumValue": "RHEL with HA and SQL Server Enterprise" } + }, + "UBUNTU_PRO_LINUX": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Ubuntu Pro" + } } } }, @@ -10990,7 +10807,6 @@ "com.amazonaws.ec2#CarrierGatewayMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -11127,8 +10943,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ClassicLinkDnsSupported", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether ClassicLink DNS support is enabled for the VPC.

", "smithy.api#xmlName": "classicLinkDnsSupported" } @@ -11298,8 +11112,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether client connect options are enabled. The default is false (not enabled).

" } }, @@ -11321,8 +11133,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether client connect options are enabled.

", "smithy.api#xmlName": "enabled" } @@ -11366,8 +11176,6 @@ "UploadSize": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the uploaded disk image, in GiB.

" } }, @@ -11388,8 +11196,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enable or disable a customizable text banner that will be displayed on\n\t\t\tAmazon Web Services provided clients when a VPN session is established.

\n

Valid values: true | false\n

\n

Default value: false\n

" } }, @@ -11411,8 +11217,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Current state of text banner feature.

\n

Valid values: true | false\n

", "smithy.api#xmlName": "enabled" } @@ -11855,8 +11659,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SplitTunnel", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether split-tunnel is enabled in the Client VPN endpoint.

\n

For information about split-tunnel VPN endpoints, see Split-Tunnel Client VPN endpoint \n\t\t\tin the Client VPN Administrator Guide.

", "smithy.api#xmlName": "splitTunnel" } @@ -11881,8 +11683,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VpnPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port number for the Client VPN endpoint.

", "smithy.api#xmlName": "vpnPort" } @@ -11966,8 +11766,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SessionTimeoutHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum VPN session duration time in hours.

\n

Valid values: 8 | 10 | 12 | 24\n

\n

Default value: 24\n

", "smithy.api#xmlName": "sessionTimeoutHours" } @@ -12236,8 +12034,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "LogEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Status of VPN tunnel logging feature. Default value is False.

\n

Valid values: True | False\n

", "smithy.api#xmlName": "logEnabled" } @@ -12269,8 +12065,6 @@ "LogEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enable or disable VPN tunnel logging feature. Default value is False.

\n

Valid values: True | False\n

" } }, @@ -12435,7 +12229,6 @@ "com.amazonaws.ec2#CoipPoolMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -12511,8 +12304,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -12537,8 +12328,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The return value of the request. Returns true if the specified product\n code is owned by the requester and associated with the specified instance.

", "smithy.api#xmlName": "return" } @@ -12554,8 +12343,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether connection logging is enabled.

" } }, @@ -12582,8 +12369,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether client connection logging is enabled for the Client VPN endpoint.

" } }, @@ -12868,8 +12653,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -12974,8 +12757,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether the destination snapshots of the copied image should be encrypted. You\n can encrypt a copy of an unencrypted snapshot, but you cannot create an unencrypted copy of an\n encrypted snapshot. The default KMS key for Amazon EBS is used unless you specify a non-default\n Key Management Service (KMS) KMS key using KmsKeyId. For more information, see Amazon EBS encryption in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "encrypted" } @@ -13022,8 +12803,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -13031,8 +12810,6 @@ "CopyImageTags": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to include your user-defined AMI tags when copying the AMI.

\n

The following tags will not be copied:

\n
    \n
  • \n

    System tags (prefixed with aws:)

    \n
  • \n
  • \n

    For public and shared AMIs, user-defined tags that are attached by other Amazon Web Services \n accounts

    \n
  • \n
\n

Default: Your user-defined AMI tags are not copied.

" } } @@ -13113,8 +12890,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

To encrypt a copy of an unencrypted snapshot if encryption by default is not enabled, \n enable encryption using this parameter. Otherwise, omit this parameter. Encrypted snapshots \n are encrypted, even if you omit this parameter and encryption by default is not enabled. You \n cannot set this parameter to false. For more information, see Amazon EBS encryption in the \n Amazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "encrypted" } @@ -13162,8 +12937,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -13268,8 +13041,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "CoreCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

", "smithy.api#xmlName": "coreCount" } @@ -13278,8 +13049,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ThreadsPerCore", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core.

", "smithy.api#xmlName": "threadsPerCore" } @@ -13303,16 +13072,12 @@ "CoreCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

" } }, "ThreadsPerCore": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core. To disable multithreading for the instance,\n specify a value of 1. Otherwise, specify the default value of\n 2.

" } }, @@ -13386,7 +13151,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units to be reserved by the Capacity Reservation Fleet. This \n\t\t\tvalue, together with the instance type weights that you assign to each instance type used by \n\t\t\tthe Fleet determine the number of instances for which the Fleet reserves capacity. Both values \n\t\t\tare based on units that make sense for your workload. For more information, see \n\t\t\t\tTotal target capacity in the Amazon EC2 User Guide.

", "smithy.api#required": {} } @@ -13413,8 +13177,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -13446,8 +13208,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units for which the Capacity Reservation Fleet reserves capacity.

", "smithy.api#xmlName": "totalTargetCapacity" } @@ -13456,8 +13216,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "TotalFulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The requested capacity units that have been successfully reserved.

", "smithy.api#xmlName": "totalFulfilledCapacity" } @@ -13570,7 +13328,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances for which to reserve capacity.

\n

Valid range: 1 - 1000

", "smithy.api#required": {} } @@ -13578,16 +13335,12 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation supports EBS-optimized instances. This optimization provides\n\t\t\tdedicated throughput to Amazon EBS and an optimized configuration stack to provide\n\t\t\toptimal I/O performance. This optimization isn't available with all instance types.\n\t\t\tAdditional usage charges apply when using an EBS- optimized instance.

" } }, "EphemeralStorage": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

\n Deprecated.\n

" } }, @@ -13618,8 +13371,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -13689,8 +13440,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -13785,8 +13534,6 @@ "VpnPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port number to assign to the Client VPN endpoint for TCP and UDP traffic.

\n

Valid Values: 443 | 1194\n

\n

Default Value: 443\n

" } }, @@ -13799,16 +13546,12 @@ "SplitTunnel": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether split-tunnel is enabled on the Client VPN endpoint.

\n

By default, split-tunnel on a VPN endpoint is disabled.

\n

For information about split-tunnel VPN endpoints, see Split-tunnel Client VPN endpoint in the \n\t\t\tClient VPN Administrator Guide.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -13854,8 +13597,6 @@ "SessionTimeoutHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum VPN session duration time in hours.

\n

Valid values: 8 | 10 | 12 | 24\n

\n

Default value: 24\n

" } }, @@ -13957,8 +13698,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -14017,8 +13756,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -14076,8 +13813,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -14140,8 +13875,6 @@ "BgpAsn": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

For devices that support BGP, the customer gateway's BGP ASN.

\n

Default: 65000

" } }, @@ -14188,8 +13921,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -14233,7 +13964,7 @@ "type": "structure", "members": { "AvailabilityZone": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#clientOptional": {}, "smithy.api#documentation": "

The Availability Zone in which to create the default subnet.

", @@ -14243,16 +13974,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Ipv6Native": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to create an IPv6 only subnet. If you already have a default subnet\n for this Availability Zone, you must delete it before you can create an IPv6 only subnet.

" } } @@ -14295,8 +14022,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -14392,8 +14117,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -14443,8 +14166,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14616,8 +14337,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14664,8 +14383,6 @@ "TerminateInstancesWithExpiration": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether running instances should be terminated when the EC2 Fleet expires.

" } }, @@ -14690,15 +14407,13 @@ "ReplaceUnhealthyInstances": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for\n fleets of type maintain. For more information, see EC2 Fleet\n health checks in the Amazon EC2 User Guide.

" } }, "TagSpecifications": { "target": "com.amazonaws.ec2#TagSpecificationList", "traits": { - "smithy.api#documentation": "

The key-value pair for tagging the EC2 Fleet request on creation. For more information, see \n Tagging your resources.

\n

If the fleet type is instant, specify a resource type of fleet \n to tag the fleet or instance to tag the instances at launch.

\n

If the fleet type is maintain or request, specify a resource\n type of fleet to tag the fleet. You cannot specify a resource type of\n instance. To tag instances at launch, specify the tags in a launch template.

", + "smithy.api#documentation": "

The key-value pair for tagging the EC2 Fleet request on creation. For more information, see \n Tag your resources.

\n

If the fleet type is instant, specify a resource type of fleet \n to tag the fleet or instance to tag the instances at launch.

\n

If the fleet type is maintain or request, specify a resource\n type of fleet to tag the fleet. You cannot specify a resource type of\n instance. To tag instances at launch, specify the tags in a launch template.

", "smithy.api#xmlName": "TagSpecification" } }, @@ -14763,8 +14478,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14843,8 +14556,6 @@ "MaxAggregationInterval": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. \n The possible values are 60 seconds (1 minute) or 600 seconds (10 minutes).\n This parameter must be 60 seconds for transit gateway resource types.

\n

When a network interface is attached to a Nitro-based\n instance, the aggregation interval is always 60 seconds or less, regardless\n of the value that you specify.

\n

Default: 600

" } }, @@ -14909,8 +14620,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15017,8 +14726,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -15047,8 +14754,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "NoReboot", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether or not the instance should be automatically rebooted before creating \n the image. Specify one of the following values:

\n
    \n
  • \n

    \n true - The instance is not rebooted before creating the image. This \n creates crash-consistent snapshots that include only the data that has been written \n to the volumes at the time the snapshots are created. Buffered data and data in \n memory that has not yet been written to the volumes is not included in the snapshots.

    \n
  • \n
  • \n

    \n false - The instance is rebooted before creating the image. This \n ensures that all buffered data and data in memory is written to the volumes before the \n snapshots are created.

    \n
  • \n
\n

Default: false\n

", "smithy.api#xmlName": "noReboot" } @@ -15099,8 +14804,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15122,8 +14825,6 @@ "PreserveClientIp": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether your client's IP address is preserved as the source. The value is true or false.

\n
    \n
  • \n

    If true, your client's IP address is used when you connect to a resource.

    \n
  • \n
  • \n

    If false, the elastic network interface IP address is used when you connect to a resource.

    \n
  • \n
\n

Default: true\n

" } }, @@ -15188,8 +14889,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15360,8 +15059,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -15417,8 +15114,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15459,40 +15154,30 @@ "AutoImport": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If selected, IPAM will continuously look for resources within the CIDR range of this pool \n and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\n these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \n a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \n marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \n discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\n

\n

A locale must be set on the pool for this feature to work.

" } }, "PubliclyAdvertisable": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if the pool is publicly advertisable. This option is not available for pools with AddressFamily set to ipv4.

" } }, "AllocationMinNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be \n less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

" } }, "AllocationMaxNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be \n greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

" } }, "AllocationDefaultNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, \n new allocations will default to 10.0.0.0/16.

" } }, @@ -15556,8 +15241,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15611,8 +15294,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15698,8 +15379,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15788,8 +15467,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -15879,8 +15556,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -16007,8 +15682,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -16053,8 +15726,6 @@ "ResolveAlias": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, and if a Systems Manager parameter is specified for ImageId,\n the AMI ID is displayed in the response for imageID. For more information, see Use a Systems \n Manager parameter instead of an AMI ID in the Amazon Elastic Compute Cloud User Guide.

\n

Default: false\n

" } } @@ -16125,8 +15796,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16202,8 +15871,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -16269,8 +15936,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -16336,8 +16001,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -16380,8 +16043,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16404,7 +16065,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of entries for the prefix list.

", "smithy.api#required": {} } @@ -16461,7 +16121,7 @@ "target": "com.amazonaws.ec2#CreateNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon VPC User Guide.

", + "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon VPC User Guide.

\n \n

When you create a public NAT gateway and assign it an EIP or secondary EIPs, the network border group of the EIPs must match the network border group of the Availability Zone (AZ) that the public NAT gateway is in. If it's not the same, the NAT gateway will fail to launch. You can see the network border group for the subnet's AZ by viewing the details of the subnet. Similarly, you can view the network border group of an EIP by viewing the details of the EIP address. For more information about network border groups and EIPs, see Allocate an Elastic IP address in the Amazon VPC User Guide. \n

\n
", "smithy.api#examples": [ { "title": "To create a NAT gateway", @@ -16507,8 +16167,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16556,8 +16214,6 @@ "SecondaryPrivateIpAddressCount": { "target": "com.amazonaws.ec2#PrivateIpAddressCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. \n For more information about secondary addresses, see Create a NAT gateway \n in the Amazon VPC User Guide.

" } } @@ -16681,8 +16337,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -16692,7 +16346,6 @@ "traits": { "aws.protocols#ec2QueryName": "Egress", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is an egress rule (rule is applied to traffic leaving the subnet).

", "smithy.api#required": {}, "smithy.api#xmlName": "egress" @@ -16756,7 +16409,6 @@ "traits": { "aws.protocols#ec2QueryName": "RuleNumber", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number for the entry (for example, 100). ACL entries are processed in ascending order by rule number.

\n

Constraints: Positive integer from 1 to 32766. The range 32767 to 65535 is reserved for internal use.

", "smithy.api#required": {}, "smithy.api#xmlName": "ruleNumber" @@ -16774,8 +16426,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -16866,8 +16516,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -16952,8 +16600,6 @@ "DestinationPort": { "target": "com.amazonaws.ec2#Port", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The destination port.

" } }, @@ -16967,8 +16613,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -17072,8 +16716,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is DryRunOperation. \n\t\t\tOtherwise, it is UnauthorizedOperation.

" } } @@ -17115,8 +16757,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17132,8 +16772,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to assign to a network interface. Amazon EC2\n automatically selects the IPv6 addresses from the subnet range.

\n

You can't specify a count of IPv6 addresses using this parameter if you've specified \n one of the following: specific IPv6 addresses, specific IPv6 prefixes, or a count of IPv6 prefixes.

\n

If your subnet has the AssignIpv6AddressOnCreation attribute set, you can\n override that setting by specifying 0 as the IPv6 address count.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -17166,8 +16804,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses to assign to a network interface. When\n you specify a number of secondary IPv4 addresses, Amazon EC2 selects these IP addresses\n within the subnet's IPv4 CIDR range. You can't specify this option and specify more than\n one private IP address using privateIpAddresses.

\n

You can't specify a count of private IPv4 addresses if you've specified one of the following:\n specific private IPv4 addresses, specific IPv4 prefixes, or a count of IPv4 prefixes.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -17182,8 +16818,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes that Amazon Web Services automatically assigns to the network interface.

\n

You can't specify a count of IPv4 prefixes if you've specified one of the following:\n specific IPv4 prefixes, specific private IPv4 addresses, or a count of private IPv4\n addresses.

" } }, @@ -17197,8 +16831,6 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigns to the network interface.

\n

You can't specify a count of IPv6 prefixes if you've specified one of the following:\n specific IPv6 prefixes, specific IPv6 addresses, or a count of IPv6 addresses.

" } }, @@ -17235,8 +16867,6 @@ "EnablePrimaryIpv6": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you’re creating a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use this option if the instance that\n this ENI will be attached to relies on its IPv6 address not changing. Amazon Web Services\n will automatically assign an IPv6 address associated with the ENI attached to your\n instance to be the primary IPv6 address. Once you enable an IPv6 GUA address to be a\n primary IPv6, you cannot disable it. When you enable an IPv6 GUA address to be a primary\n IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is\n terminated or the network interface is detached. If you have multiple IPv6 addresses\n associated with an ENI attached to your instance and you enable a primary IPv6 address,\n the first IPv6 GUA address associated with the ENI becomes the primary IPv6\n address.

" } } @@ -17299,8 +16929,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17324,8 +16952,6 @@ "PartitionCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of partitions. Valid only when Strategy is\n set to partition.

" } }, @@ -17381,8 +17007,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -17453,8 +17077,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -17474,8 +17096,6 @@ "DeleteReplacedRootVolume": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to automatically delete the original root volume after the root volume \n replacement task completes. To delete the original root volume, specify true. \n If you choose to keep the original root volume after the replacement task completes, you must \n manually delete it when you no longer need it.

" } } @@ -17530,7 +17150,6 @@ "traits": { "aws.protocols#ec2QueryName": "InstanceCount", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances that are a part of a Reserved Instance account to be listed in the Reserved Instance Marketplace. This number should be less than or equal to the instance count associated with the Reserved Instance ID specified in this call.

", "smithy.api#required": {}, "smithy.api#xmlName": "instanceCount" @@ -17626,8 +17245,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -17704,8 +17321,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17810,8 +17425,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -17865,8 +17478,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17972,8 +17583,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -18073,8 +17682,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -18129,8 +17736,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18208,8 +17813,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -18286,8 +17889,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -18392,8 +17993,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18477,8 +18076,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -18486,8 +18083,6 @@ "Ipv6Native": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to create an IPv6 only subnet.

" } } @@ -18548,8 +18143,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -18608,8 +18201,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18684,7 +18275,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given\n direction. The rules are processed in ascending order by rule number.

", "smithy.api#required": {} } @@ -18712,8 +18302,6 @@ "Protocol": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The protocol, for example UDP, to assign to the Traffic Mirror rule.

\n

For information about the protocol value, see Protocol Numbers on the Internet Assigned Numbers Authority (IANA) website.

" } }, @@ -18742,8 +18330,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18825,8 +18411,6 @@ "PacketLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

\n

For sessions with Network Load Balancer (NLB) Traffic Mirror targets the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, @@ -18834,7 +18418,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.

\n

Valid values are 1-32766.

", "smithy.api#required": {} } @@ -18842,8 +18425,6 @@ "VirtualNetworkId": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The VXLAN ID for the Traffic Mirror session. For more information about the VXLAN\n protocol, see RFC 7348. If you do\n not specify a VirtualNetworkId, an account-wide unique id is chosen at\n random.

" } }, @@ -18863,8 +18444,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18947,8 +18526,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -19079,8 +18656,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19134,8 +18709,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19215,8 +18788,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19330,8 +18901,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19402,8 +18971,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19468,16 +19035,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to drop traffic that matches this route.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19527,8 +19090,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19593,16 +19154,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to drop traffic that matches this route.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19680,8 +19237,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19726,8 +19281,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19806,8 +19359,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19888,8 +19439,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } } @@ -19910,8 +19459,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } }, @@ -20032,10 +19579,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -20119,10 +19670,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -20183,10 +19738,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "FIPSEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Enable or disable support for Federal Information Processing Standards (FIPS) on the instance.

" + } } }, "traits": { @@ -20351,10 +19910,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -20479,8 +20042,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume should be encrypted. \n The effect of setting the encryption state to true depends on \nthe volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. \n For more information, see Encryption by default\n in the Amazon Elastic Compute Cloud User Guide.

\n

Encrypted Amazon EBS volumes must be attached to instances that support Amazon EBS encryption. \n For more information, see Supported\n instance types.

", "smithy.api#xmlName": "encrypted" } @@ -20488,8 +20049,6 @@ "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3, io1, and io2 volumes, this represents \n the number of IOPS that are provisioned for the volume. For gp2 volumes, this represents the baseline \n performance of the volume and the rate at which the volume accumulates I/O credits for bursting.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

\n io1 and io2 volumes support up to 64,000 IOPS only on \n Instances built on the Nitro System. Other instance families support performance \n up to 32,000 IOPS.

\n

This parameter is required for io1 and io2 volumes.\n The default for gp3 volumes is 3,000 IOPS.\n This parameter is not supported for gp2, st1, sc1, or standard volumes.

" } }, @@ -20508,8 +20067,6 @@ "Size": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size.\n If you specify a snapshot, the default is the snapshot size. You can specify a volume \n size that is equal to or larger than the snapshot size.

\n

The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3: 1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
" } }, @@ -20529,8 +20086,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -20545,16 +20100,12 @@ "MultiAttachEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable Amazon EBS Multi-Attach. If you enable Multi-Attach, you can attach the \n \tvolume to up to 16 Instances built on the Nitro System in the same Availability Zone. This parameter is \n \tsupported with io1 and io2 volumes only. For more information, \n \tsee \n \t\tAmazon EBS Multi-Attach in the Amazon Elastic Compute Cloud User Guide.

" } }, "Throughput": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput to provision for a volume, with a maximum of 1,000 MiB/s.

\n

This parameter is valid only for gp3 volumes.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

" } }, @@ -20630,8 +20181,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -20704,8 +20253,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -20779,8 +20326,6 @@ "PrivateDnsEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint) Indicates whether to associate a private hosted zone with the\n specified VPC. The private hosted zone contains a record set for the default public DNS\n name for the service for the Region (for example,\n kinesis.us-east-1.amazonaws.com), which resolves to the private IP\n addresses of the endpoint network interfaces in the VPC. This enables you to make\n requests to the default public DNS name for the service instead of the public DNS names\n that are automatically generated by the VPC endpoint service.

\n

To use a private hosted zone, you must set the following VPC attributes to\n true: enableDnsHostnames and\n enableDnsSupport. Use ModifyVpcAttribute to set the VPC\n attributes.

\n

Default: true\n

" } }, @@ -20845,16 +20390,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "AcceptanceRequired": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether requests from service consumers to create an endpoint to your service must\n be accepted manually.

" } }, @@ -20946,8 +20487,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21025,8 +20564,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AmazonProvidedIpv6CidrBlock", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC.\n You cannot specify the range of IP addresses, or the size of the CIDR block.

", "smithy.api#xmlName": "amazonProvidedIpv6CidrBlock" } @@ -21071,8 +20608,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21166,8 +20701,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21286,8 +20819,6 @@ "AmazonSideAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. If\n you're using a 16-bit ASN, it must be in the 64512 to 65534 range. If you're using a\n 32-bit ASN, it must be in the 4200000000 to 4294967294 range.

\n

Default: 64512

" } }, @@ -21295,8 +20826,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21722,8 +21251,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -21774,8 +21301,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -21840,8 +21365,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -21900,8 +21423,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -21952,8 +21473,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -22014,8 +21533,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22062,8 +21579,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22091,8 +21606,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22116,8 +21629,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReturnCode", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "returnCode" } @@ -22272,8 +21783,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22290,7 +21799,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to terminate the associated instances when the EC2 Fleet is deleted. The default is to\n terminate the instances.

\n

To let the instances continue to run after the EC2 Fleet is deleted, specify\n no-terminate-instances. Supported only for fleets of type\n maintain and request.

\n

For instant fleets, you cannot specify NoTerminateInstances. A\n deleted instant fleet with running instances is not supported.

", "smithy.api#required": {} } @@ -22342,8 +21850,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22395,8 +21901,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22420,8 +21924,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -22449,8 +21951,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22501,16 +22001,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "ForceDelete": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true to force delete the event window. Use the force delete parameter\n if the event window is currently associated with targets.

" } }, @@ -22572,8 +22068,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22623,8 +22117,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22663,8 +22155,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22679,8 +22169,6 @@ "Cascade": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enables you to quickly delete an IPAM, private scopes, pools in private scopes, and\n any allocations in the pools in private scopes. You cannot delete the IPAM with this option if there is a pool in your public scope. If you use this option, IPAM does the following:

\n
    \n
  • \n

    Deallocates any CIDRs allocated to VPC resources (such as VPCs) in pools in private scopes.

    \n \n

    No VPC resources are deleted as a result of enabling this option. The CIDR associated with the resource will no longer be allocated from an IPAM pool, but the CIDR itself will remain unchanged.

    \n
    \n
  • \n
  • \n

    Deprovisions all IPv4 CIDRs provisioned to IPAM pools in private scopes.

    \n
  • \n
  • \n

    Deletes all IPAM pools in private scopes.

    \n
  • \n
  • \n

    Deletes all non-default private scopes in the IPAM.

    \n
  • \n
  • \n

    Deletes the default public and private scopes and the IPAM.

    \n
  • \n
" } } @@ -22707,8 +22195,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22775,8 +22261,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22849,8 +22333,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22867,8 +22349,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -22923,8 +22403,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -23001,8 +22479,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -23055,8 +22531,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "VersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the launch template.

", "smithy.api#xmlName": "versionNumber" } @@ -23106,8 +22580,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "VersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the launch template.

", "smithy.api#xmlName": "versionNumber" } @@ -23182,8 +22654,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23240,8 +22710,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23292,8 +22760,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23344,8 +22810,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23388,8 +22852,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23452,8 +22914,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23538,8 +22998,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23549,7 +23007,6 @@ "traits": { "aws.protocols#ec2QueryName": "Egress", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the rule is an egress rule.

", "smithy.api#required": {}, "smithy.api#xmlName": "egress" @@ -23570,7 +23027,6 @@ "traits": { "aws.protocols#ec2QueryName": "RuleNumber", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number of the entry to delete.

", "smithy.api#required": {}, "smithy.api#xmlName": "ruleNumber" @@ -23588,8 +23044,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23647,8 +23101,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23679,8 +23131,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23731,8 +23181,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23783,8 +23231,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23864,16 +23310,12 @@ "Force": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true to remove the permission even if the network interface is\n\t\t\tattached to an instance.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is DryRunOperation. \n\t\t\tOtherwise, it is UnauthorizedOperation.

" } } @@ -23890,8 +23332,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds, otherwise returns an error.

", "smithy.api#xmlName": "return" } @@ -23909,8 +23349,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23960,8 +23398,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23999,8 +23435,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24024,8 +23458,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReturnValue", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Information about the result of deleting the public IPv4 pool.

", "smithy.api#xmlName": "returnValue" } @@ -24115,8 +23547,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24209,8 +23639,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24258,8 +23686,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24320,8 +23746,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24368,8 +23792,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24404,8 +23826,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24463,8 +23883,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24504,8 +23922,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24551,8 +23967,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24606,8 +24020,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24658,8 +24070,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24710,8 +24120,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24762,8 +24170,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24838,8 +24244,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24878,8 +24282,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24930,8 +24332,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24982,8 +24382,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25034,8 +24432,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25094,8 +24490,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25134,8 +24528,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25194,8 +24586,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25258,8 +24648,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25298,8 +24686,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25350,8 +24736,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25409,8 +24793,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25468,8 +24850,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25520,8 +24900,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25579,8 +24957,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25649,8 +25025,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25669,7 +25043,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on.

", + "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on. When you delete the VPC, it deletes the VPC's default security group, network ACL, and route table.

", "smithy.api#examples": [ { "title": "To delete a VPC", @@ -25699,8 +25073,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25752,8 +25124,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25805,8 +25175,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25859,8 +25227,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25887,8 +25253,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -25913,8 +25277,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25951,8 +25313,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26027,8 +25387,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26065,8 +25423,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26109,8 +25465,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -26167,8 +25521,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -26253,8 +25605,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26283,8 +25633,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -26323,8 +25671,6 @@ "IncludeAllTagsOfInstance": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to deregister all tag keys in the current Region. Specify false \n \t\tto deregister all tag keys.

" } }, @@ -26376,8 +25722,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26438,8 +25782,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26517,8 +25859,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26565,7 +25905,6 @@ "com.amazonaws.ec2#DescribeAddressTransfersMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -26591,16 +25930,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeAddressTransfersMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of address transfers to return in one page of results.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26713,16 +26048,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#AddressMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call. To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26783,8 +26114,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26828,8 +26157,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26845,8 +26172,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "UseLongIdsAggregated", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether all resource types in the Region are configured to use longer IDs.\n This value is only true if all users are configured to use longer IDs for\n all resources types in the Region.

", "smithy.api#xmlName": "useLongIdsAggregated" } @@ -26937,8 +26262,6 @@ "AllAvailabilityZones": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Include all Availability Zones, Local Zones, and Wavelength Zones regardless of your\n opt-in status.

\n

If you do not use this parameter, the results include only the zones for the Regions where you have chosen the option to opt in.

" } }, @@ -26946,8 +26269,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26997,8 +26318,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#MaxResultsParam", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -27018,8 +26337,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -27112,8 +26429,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -27160,7 +26475,6 @@ "com.amazonaws.ec2#DescribeByoipCidrsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -27173,8 +26487,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -27182,7 +26494,6 @@ "target": "com.amazonaws.ec2#DescribeByoipCidrsMaxResults", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

", "smithy.api#required": {} } @@ -27243,7 +26554,6 @@ "com.amazonaws.ec2#DescribeCapacityReservationFleetsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -27269,8 +26579,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeCapacityReservationFleetsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, @@ -27284,8 +26592,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -27339,7 +26645,6 @@ "com.amazonaws.ec2#DescribeCapacityReservationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -27365,8 +26670,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeCapacityReservationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, @@ -27380,8 +26683,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -27452,8 +26753,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#CarrierGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -27466,8 +26765,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -27521,7 +26818,6 @@ "com.amazonaws.ec2#DescribeClassicLinkInstancesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27542,8 +26838,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -27559,8 +26853,6 @@ "target": "com.amazonaws.ec2#DescribeClassicLinkInstancesMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

\n

Constraint: If the value is greater than 1000, we return only 1000 items.

", "smithy.api#xmlName": "maxResults" } @@ -27623,7 +26915,6 @@ "com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27644,8 +26935,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -27665,8 +26954,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } } @@ -27720,7 +27007,6 @@ "com.amazonaws.ec2#DescribeClientVpnConnectionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27754,16 +27040,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnConnectionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -27799,7 +27081,6 @@ "com.amazonaws.ec2#DescribeClientVpnEndpointMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27837,8 +27118,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnEndpointMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, @@ -27858,8 +27137,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -27913,7 +27190,6 @@ "com.amazonaws.ec2#DescribeClientVpnRoutesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27941,8 +27217,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnRoutesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, @@ -27955,8 +27229,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -28010,7 +27282,6 @@ "com.amazonaws.ec2#DescribeClientVpnTargetNetworksMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -28037,8 +27308,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnTargetNetworksMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, @@ -28058,8 +27327,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -28130,8 +27397,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#CoipPoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -28144,8 +27409,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -28281,8 +27544,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -28400,8 +27661,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -28481,7 +27740,6 @@ "com.amazonaws.ec2#DescribeDhcpOptionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -28509,8 +27767,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -28524,8 +27780,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeDhcpOptionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -28579,7 +27833,6 @@ "com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -28592,8 +27845,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28607,8 +27858,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } }, @@ -28669,7 +27918,6 @@ "com.amazonaws.ec2#DescribeElasticGpusMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 10, "max": 1000 @@ -28689,8 +27937,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28704,8 +27950,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeElasticGpusMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value\n can be between 5 and 1000.

" } }, @@ -28735,8 +27979,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of items to return. If the total number of items available is more\n than the value specified in max-items then a Next-Token will be provided in the output\n that you can use to resume pagination.

", "smithy.api#xmlName": "maxResults" } @@ -28775,7 +28017,6 @@ "com.amazonaws.ec2#DescribeExportImageTasksMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 500 @@ -28788,8 +28029,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28810,8 +28049,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeExportImageTasksMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call.

" } }, @@ -28983,8 +28220,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -29065,8 +28300,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxParallelLaunches", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to create \n\t\t\tpre-provisioned snapshots for Windows faster launching.

", "smithy.api#xmlName": "maxParallelLaunches" } @@ -29274,8 +28507,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -29366,8 +28597,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29380,8 +28609,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -29478,16 +28705,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -29639,16 +28862,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -29725,8 +28944,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29746,8 +28963,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } }, @@ -29804,8 +29019,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29867,7 +29080,6 @@ "com.amazonaws.ec2#DescribeFpgaImagesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -29880,8 +29092,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29915,8 +29125,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeFpgaImagesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call.

" } } @@ -29979,24 +29187,18 @@ "MaxDuration": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

This is the maximum duration of the reservation to purchase, specified in seconds.\n Reservations are available in one-year and three-year terms. The number of seconds\n specified must be the number of seconds in a year (365x24x60x60) times one of the\n supported durations (1 or 3). For example, specify 94608000 for three years.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#DescribeHostReservationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, "MinDuration": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

This is the minimum duration of the reservation you'd like to purchase, specified in\n seconds. Reservations are available in one-year and three-year terms. The number of\n seconds specified must be the number of seconds in a year (365x24x60x60) times one of\n the supported durations (1 or 3). For example, specify 31536000 for one year.

" } }, @@ -30062,7 +29264,6 @@ "com.amazonaws.ec2#DescribeHostReservationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 500 @@ -30087,8 +29288,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, @@ -30168,8 +29367,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

\n

You cannot specify this parameter and the host IDs parameter in the same\n request.

", "smithy.api#xmlName": "maxResults" } @@ -30256,7 +29453,6 @@ "com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -30283,8 +29479,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of\n items, make another request with the token returned in the output. For more information, \n see Pagination.

" } }, @@ -30472,8 +29666,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -30608,7 +29800,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 | x86_64 | \n arm64 | x86_64_mac | arm64_mac).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 | x86_64 | \n arm64 | x86_64_mac | arm64_mac).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n source-instance-id - The ID of the instance that the AMI was created from\n if the AMI was created using CreateImage. This filter is applicable only if the AMI was\n created using CreateImage.

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30629,17 +29821,19 @@ "IncludeDeprecated": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to include deprecated AMIs.

\n

Default: No deprecated AMIs are included in the response.

\n \n

If you are the AMI owner, all deprecated AMIs appear in the response regardless of what\n you specify for this parameter.

\n
" } }, + "IncludeDisabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Specifies whether to include disabled AMIs.

\n

Default: No disabled AMIs are included in the response.

" + } + }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -30647,8 +29841,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -30711,8 +29903,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -30733,8 +29923,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call.

" } }, @@ -30824,8 +30012,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -30846,8 +30032,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining results, make another call\n with the returned NextToken value.

" } }, @@ -30931,8 +30115,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -30976,16 +30158,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#InstanceConnectEndpointMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -31059,7 +30237,6 @@ "com.amazonaws.ec2#DescribeInstanceCreditSpecificationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -31072,8 +30249,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -31094,8 +30269,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeInstanceCreditSpecificationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the instance IDs\n parameter in the same call.

" } }, @@ -31152,8 +30325,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -31202,8 +30373,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -31224,8 +30393,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#ResultRange", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value can\n be between 20 and 500. You cannot specify this parameter and the event window IDs parameter\n in the same call.

" } }, @@ -31385,8 +30552,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the instance IDs parameter in the same request.

" } }, @@ -31400,8 +30565,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -31410,8 +30573,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IncludeAllInstances", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

When true, includes the health status for all instances. When\n false, includes the health status for running instances only.

\n

Default: false\n

", "smithy.api#xmlName": "includeAllInstances" } @@ -31469,8 +30630,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request,\n and provides an error response. If you have the required permissions, the error response is\n DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -31552,8 +30711,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request,\n and provides an error response. If you have the required permissions, the error response is\n DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -31795,7 +30952,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in\n the block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n boot-mode - The boot mode that was specified by the AMI\n (legacy-bios | uefi |\n uefi-preferred).

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-preference\n - The instance's Capacity Reservation preference (open | none).

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id\n - The ID of the targeted Capacity Reservation.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn\n - The ARN of the targeted Capacity Reservation group.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you\n launched the instance.

    \n
  • \n
  • \n

    \n current-instance-boot-mode - The boot mode that is used to launch\n the instance at launch or start (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n ebs-optimized - A Boolean that indicates whether the instance is\n optimized for Amazon EBS I/O.

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether the instance is\n enabled for enhanced networking with ENA.

    \n
  • \n
  • \n

    \n enclave-options.enabled - A Boolean that indicates whether the\n instance is enabled for Amazon Web Services Nitro Enclaves.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n iam-instance-profile.id - The instance profile associated with\n the instance. Specified as an ID.

    \n
  • \n
  • \n

    \n iam-instance-profile.name - The instance profile associated with\n the instance. Specified as an name.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n ipv6-address - The IPv6 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n license-pool -

    \n
  • \n
  • \n

    \n maintenance-options.auto-recovery - The current automatic\n recovery behavior of the instance (disabled | default).

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv4 - Indicates whether the IPv4\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv6 - Indicates whether the IPv6\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.state - The state of the metadata option changes\n (pending | applied).

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n platform-details - The platform (Linux/UNIX |\n Red Hat BYOL Linux | Red Hat Enterprise Linux |\n Red Hat Enterprise Linux with HA | Red Hat Enterprise\n Linux with SQL Server Standard and HA | Red Hat Enterprise\n Linux with SQL Server Enterprise and HA | Red Hat Enterprise\n Linux with SQL Server Standard | Red Hat Enterprise Linux with\n SQL Server Web | Red Hat Enterprise Linux with SQL Server\n Enterprise | SQL Server Enterprise | SQL Server\n Standard | SQL Server Web | SUSE Linux |\n Ubuntu Pro | Windows | Windows BYOL |\n Windows with SQL Server Enterprise | Windows with SQL\n Server Standard | Windows with SQL Server Web).

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-a-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS A records.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-aaaa-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS AAAA records.

    \n
  • \n
  • \n

    \n private-dns-name-options.hostname-type - The type of hostname\n (ip-name | resource-name).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay\n | marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n tpm-support - Indicates if the instance is configured for\n NitroTPM support (v2.0).

    \n
  • \n
  • \n

    \n usage-operation - The usage operation value for the instance\n (RunInstances | RunInstances:00g0 |\n RunInstances:0010 | RunInstances:1010 |\n RunInstances:1014 | RunInstances:1110 |\n RunInstances:0014 | RunInstances:0210 |\n RunInstances:0110 | RunInstances:0100 |\n RunInstances:0004 | RunInstances:0200 |\n RunInstances:000g | RunInstances:0g00 |\n RunInstances:0002 | RunInstances:0800 |\n RunInstances:0102 | RunInstances:0006 |\n RunInstances:0202).

    \n
  • \n
  • \n

    \n usage-operation-update-time - The time that the usage operation\n was last updated, for example, 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in\n the block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n boot-mode - The boot mode that was specified by the AMI\n (legacy-bios | uefi |\n uefi-preferred).

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-preference\n - The instance's Capacity Reservation preference (open | none).

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id\n - The ID of the targeted Capacity Reservation.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn\n - The ARN of the targeted Capacity Reservation group.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you\n launched the instance.

    \n
  • \n
  • \n

    \n current-instance-boot-mode - The boot mode that is used to launch\n the instance at launch or start (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n ebs-optimized - A Boolean that indicates whether the instance is\n optimized for Amazon EBS I/O.

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether the instance is\n enabled for enhanced networking with ENA.

    \n
  • \n
  • \n

    \n enclave-options.enabled - A Boolean that indicates whether the\n instance is enabled for Amazon Web Services Nitro Enclaves.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n iam-instance-profile.id - The instance profile associated with\n the instance. Specified as an ID.

    \n
  • \n
  • \n

    \n iam-instance-profile.name - The instance profile associated with\n the instance. Specified as an name.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n ipv6-address - The IPv6 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n maintenance-options.auto-recovery - The current automatic\n recovery behavior of the instance (disabled | default).

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv4 - Indicates whether the IPv4\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv6 - Indicates whether the IPv6\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.state - The state of the metadata option changes\n (pending | applied).

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.association.allocation-id - The allocation ID.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.association-id - The association ID.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.carrier-ip - The carrier IP address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.customer-owned-ip - The customer-owned IP address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-dns-name - The public DNS name.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-dns-name - The private DNS name.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.association.carrier-ip - The customer-owned IP address.

    \n
  • \n
  • \n

    \n network-interface.association.customer-owned-ip - The customer-owned IP address.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-dns-name - The public DNS name.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.network-card-index - The index of the network card.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.deny-all-igw-traffic - A Boolean that indicates whether \n a network interface with an IPv6 address is unreachable from the public internet.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv4-prefixes.ipv4-prefix - The IPv4 prefixes that are assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-address - The IPv6 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.is-primary-ipv6 - A Boolean that indicates whether this\n is the primary IPv6 address.

    \n
  • \n
  • \n

    \n network-interface.ipv6-native - A Boolean that indicates whether this is\n an IPv6 only network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-prefixes.ipv6-prefix - The IPv6 prefix assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.outpost-arn - The ARN of the Outpost.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.private-ip-address - The private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.public-dns-name - The public DNS name.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.tag-key - The key of a tag assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.tag-value - The value of a tag assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n platform-details - The platform (Linux/UNIX |\n Red Hat BYOL Linux | Red Hat Enterprise Linux |\n Red Hat Enterprise Linux with HA | Red Hat Enterprise\n Linux with SQL Server Standard and HA | Red Hat Enterprise\n Linux with SQL Server Enterprise and HA | Red Hat Enterprise\n Linux with SQL Server Standard | Red Hat Enterprise Linux with\n SQL Server Web | Red Hat Enterprise Linux with SQL Server\n Enterprise | SQL Server Enterprise | SQL Server\n Standard | SQL Server Web | SUSE Linux |\n Ubuntu Pro | Windows | Windows BYOL |\n Windows with SQL Server Enterprise | Windows with SQL\n Server Standard | Windows with SQL Server Web).

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-a-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS A records.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-aaaa-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS AAAA records.

    \n
  • \n
  • \n

    \n private-dns-name-options.hostname-type - The type of hostname\n (ip-name | resource-name).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay\n | marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n tpm-support - Indicates if the instance is configured for\n NitroTPM support (v2.0).

    \n
  • \n
  • \n

    \n usage-operation - The usage operation value for the instance\n (RunInstances | RunInstances:00g0 |\n RunInstances:0010 | RunInstances:1010 |\n RunInstances:1014 | RunInstances:1110 |\n RunInstances:0014 | RunInstances:0210 |\n RunInstances:0110 | RunInstances:0100 |\n RunInstances:0004 | RunInstances:0200 |\n RunInstances:000g | RunInstances:0g00 |\n RunInstances:0002 | RunInstances:0800 |\n RunInstances:0102 | RunInstances:0006 |\n RunInstances:0202).

    \n
  • \n
  • \n

    \n usage-operation-update-time - The time that the usage operation\n was last updated, for example, 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -31810,8 +30967,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -31820,8 +30975,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the instance IDs parameter in the same request.

", "smithy.api#xmlName": "maxResults" } @@ -31940,7 +31093,6 @@ "com.amazonaws.ec2#DescribeInternetGatewaysMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -31961,8 +31113,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -31984,8 +31134,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeInternetGatewaysMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -32042,8 +31190,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32057,8 +31203,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -32128,8 +31272,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32149,8 +31291,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of resource discoveries to return in one page of results.

" } }, @@ -32214,8 +31354,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32235,8 +31373,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of resource discovery associations to return in one page of results.

" } }, @@ -32300,8 +31436,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32315,8 +31449,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -32386,8 +31518,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32401,8 +31531,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -32485,16 +31613,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#Ipv6PoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32619,8 +31743,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -32628,8 +31750,6 @@ "IncludePublicKey": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, the public key material is included in the response.

\n

Default: false\n

" } } @@ -32738,8 +31858,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -32783,8 +31901,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value\n can be between 1 and 200.

" } }, @@ -32798,8 +31914,6 @@ "ResolveAlias": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, and if a Systems Manager parameter is specified for ImageId,\n the AMI ID is displayed in the response for imageId.

\n

If false, and if a Systems Manager parameter is specified for ImageId,\n the parameter is displayed in the response for imageId.

\n

For more information, see Use a Systems \n Manager parameter instead of an AMI ID in the Amazon Elastic Compute Cloud User Guide.

\n

Default: false\n

" } } @@ -32876,7 +31990,6 @@ "com.amazonaws.ec2#DescribeLaunchTemplatesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 200 @@ -32889,8 +32002,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -32924,8 +32035,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeLaunchTemplatesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value\n can be between 1 and 200.

" } } @@ -32996,8 +32105,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33010,8 +32117,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33082,8 +32187,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33096,8 +32199,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33168,8 +32269,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33182,8 +32281,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33254,8 +32351,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33268,8 +32363,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33340,8 +32433,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33354,8 +32445,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33426,8 +32515,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33440,8 +32527,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33498,8 +32583,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -33513,8 +32596,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#PrefixListMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33595,7 +32676,6 @@ "com.amazonaws.ec2#DescribeMovingAddressesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -33617,8 +32697,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -33627,8 +32705,6 @@ "target": "com.amazonaws.ec2#DescribeMovingAddressesMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1000; if\n MaxResults is given a value outside of this range, an error is returned.

\n

Default: If no value is provided, the default is 1000.

", "smithy.api#xmlName": "maxResults" } @@ -33811,7 +32887,6 @@ "com.amazonaws.ec2#DescribeNatGatewaysMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -33824,8 +32899,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -33838,8 +32911,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNatGatewaysMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } }, @@ -33950,7 +33021,6 @@ "com.amazonaws.ec2#DescribeNetworkAclsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -33971,8 +33041,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -33993,8 +33061,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNetworkAclsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -34083,16 +33149,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34169,16 +33231,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34273,16 +33331,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34359,16 +33413,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34456,8 +33506,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34548,7 +33596,6 @@ "com.amazonaws.ec2#DescribeNetworkInterfacePermissionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -34581,8 +33628,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNetworkInterfacePermissionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n\t\t\tmake another request with the token returned in the output. If this parameter is not specified, \n\t\t\tup to 50 results are returned by default. For more information, see\n\t\t\tPagination.

" } } @@ -34626,7 +33671,7 @@ "target": "com.amazonaws.ec2#DescribeNetworkInterfacesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your network interfaces.

", + "smithy.api#documentation": "

Describes one or more of your network interfaces.

\n

If you have a large number of network interfaces, the operation fails unless \n you use pagination or one of the following filters: group-id, \n mac-address, private-dns-name, private-ip-address, \n private-dns-name, subnet-id, or vpc-id.

", "smithy.api#examples": [ { "title": "To describe a network interface", @@ -34728,7 +33773,6 @@ "com.amazonaws.ec2#DescribeNetworkInterfacesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -34742,7 +33786,7 @@ "target": "com.amazonaws.ec2#FilterList", "traits": { "aws.protocols#ec2QueryName": "Filter", - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n addresses.private-ip-address - The private IPv4 addresses\n associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.primary - Whether the private IPv4 address is the primary\n IP address associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.association.public-ip - The association ID returned when\n the network interface was associated with the Elastic IP address\n (IPv4).

    \n
  • \n
  • \n

    \n addresses.association.owner-id - The owner ID of the addresses associated with the network interface.

    \n
  • \n
  • \n

    \n association.association-id - The association ID returned when the\n network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n association.allocation-id - The allocation ID returned when you\n allocated the Elastic IP address (IPv4) for your network interface.

    \n
  • \n
  • \n

    \n association.ip-owner-id - The owner of the Elastic IP address\n (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n association.public-ip - The address of the Elastic IP address\n (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n association.public-dns-name - The public DNS name for the network\n interface (IPv4).

    \n
  • \n
  • \n

    \n attachment.attachment-id - The ID of the interface attachment.

    \n
  • \n
  • \n

    \n attachment.attach-time - The time that the network interface was attached to an instance.

    \n
  • \n
  • \n

    \n attachment.delete-on-termination - Indicates whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n attachment.device-index - The device index to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-id - The ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-owner-id - The owner ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.status - The status of the attachment (attaching | attached | detaching | detached).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the network interface.

    \n
  • \n
  • \n

    \n description - The description of the network interface.

    \n
  • \n
  • \n

    \n group-id - The ID of a security group associated with the network interface.

    \n
  • \n
  • \n

    \n group-name - The name of a security group associated with the network interface.

    \n
  • \n
  • \n

    \n ipv6-addresses.ipv6-address - An IPv6 address associated with\n the network interface.

    \n
  • \n
  • \n

    \n interface-type - The type of network interface (api_gateway_managed | \n\t\t aws_codestar_connections_managed | branch | efa | \n\t\t gateway_load_balancer | gateway_load_balancer_endpoint | global_accelerator_managed | \n\t\t interface | iot_rules_managed | lambda | load_balancer | \n\t\t nat_gateway | network_load_balancer | quicksight | \n\t\t transit_gateway | trunk | vpc_endpoint).

    \n
  • \n
  • \n

    \n mac-address - The MAC address of the network interface.

    \n
  • \n
  • \n

    \n network-interface-id - The ID of the network interface.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the network interface owner.

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address or addresses of the\n network interface.

    \n
  • \n
  • \n

    \n private-dns-name - The private DNS name of the network interface (IPv4).

    \n
  • \n
  • \n

    \n requester-id - The alias or Amazon Web Services account ID of the principal or service that created the network interface.

    \n
  • \n
  • \n

    \n requester-managed - Indicates whether the network interface is being managed by an Amazon Web Service \n\t\t (for example, Amazon Web Services Management Console, Auto Scaling, and so on).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the network interface performs source/destination checking. \n\t\t A value of true means checking is enabled, and false means checking is disabled. \n\t\t The value must be false for the network interface to perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n status - The status of the network interface. If the network interface is not attached to an instance, the status is available; \n\t\t if a network interface is attached to an instance the status is in-use.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the network interface.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network interface.

    \n
  • \n
", + "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.allocation-id - The allocation ID returned when you\n\t\t allocated the Elastic IP address (IPv4) for your network interface.

    \n
  • \n
  • \n

    \n association.association-id - The association ID returned when the\n\t\t network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n addresses.association.owner-id - The owner ID of the addresses associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.association.public-ip - The association ID returned when\n\t\t the network interface was associated with the Elastic IP address\n\t\t (IPv4).

    \n
  • \n
  • \n

    \n addresses.primary - Whether the private IPv4 address is the primary\n IP address associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.private-ip-address - The private IPv4 addresses\n\t\t associated with the network interface.

    \n
  • \n
  • \n

    \n association.ip-owner-id - The owner of the Elastic IP address\n (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n association.public-ip - The address of the Elastic IP address\n (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n association.public-dns-name - The public DNS name for the network\n interface (IPv4).

    \n
  • \n
  • \n

    \n attachment.attach-time - The time that the network interface was attached to an instance.

    \n
  • \n
  • \n

    \n attachment.attachment-id - The ID of the interface attachment.

    \n
  • \n
  • \n

    \n attachment.delete-on-termination - Indicates whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n attachment.device-index - The device index to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-id - The ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-owner-id - The owner ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.status - The status of the attachment (attaching | attached | detaching | detached).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the network interface.

    \n
  • \n
  • \n

    \n description - The description of the network interface.

    \n
  • \n
  • \n

    \n group-id - The ID of a security group associated with the network interface.

    \n
  • \n
  • \n

    \n ipv6-addresses.ipv6-address - An IPv6 address associated with\n the network interface.

    \n
  • \n
  • \n

    \n interface-type - The type of network interface (api_gateway_managed | \n\t\t aws_codestar_connections_managed | branch | \n\t\t ec2_instance_connect_endpoint | efa | efs | \n\t\t gateway_load_balancer | gateway_load_balancer_endpoint | \n\t\t global_accelerator_managed | \n\t\t interface | iot_rules_managed | \n\t\t lambda | load_balancer | \n\t\t nat_gateway | network_load_balancer | \n\t\t quicksight | \n\t\t transit_gateway | trunk | \n\t\t vpc_endpoint).

    \n
  • \n
  • \n

    \n mac-address - The MAC address of the network interface.

    \n
  • \n
  • \n

    \n network-interface-id - The ID of the network interface.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the network interface owner.

    \n
  • \n
  • \n

    \n private-dns-name - The private DNS name of the network interface (IPv4).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address or addresses of the\n network interface.

    \n
  • \n
  • \n

    \n requester-id - The alias or Amazon Web Services account ID of the principal or service that created the network interface.

    \n
  • \n
  • \n

    \n requester-managed - Indicates whether the network interface is being managed by an Amazon Web Service \n\t\t (for example, Amazon Web Services Management Console, Auto Scaling, and so on).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the network interface performs source/destination checking. \n\t\t A value of true means checking is enabled, and false means checking is disabled. \n\t\t The value must be false for the network interface to perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n status - The status of the network interface. If the network interface is not attached to an instance, the status is available; \n\t\t if a network interface is attached to an instance the status is in-use.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the network interface.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network interface.

    \n
  • \n
", "smithy.api#xmlName": "filter" } }, @@ -34750,8 +33794,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34772,8 +33814,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNetworkInterfacesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n\t\t make another request with the token returned in the output. You cannot specify this\n\t\t parameter and the network interface IDs parameter in the same request. For more information, \n\t\t see Pagination.

" } } @@ -34833,8 +33873,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34899,8 +33937,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34914,8 +33950,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -34982,7 +34016,6 @@ "com.amazonaws.ec2#DescribePrincipalIdFormatMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -34995,8 +34028,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -35010,8 +34041,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribePrincipalIdFormatMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value.

" } }, @@ -35087,8 +34116,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#PoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -35215,8 +34242,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35224,8 +34249,6 @@ "AllRegions": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to display all Regions, including Regions that are disabled for your account.

" } } @@ -35271,7 +34294,6 @@ "com.amazonaws.ec2#DescribeReplaceRootVolumeTasksMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 50 @@ -35298,8 +34320,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeReplaceRootVolumeTasksMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output. \n\tFor more information, see Pagination.

" } }, @@ -35312,8 +34332,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -35529,8 +34547,6 @@ "IncludeMarketplace": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Include Reserved Instance Marketplace offerings in the response.

" } }, @@ -35543,24 +34559,18 @@ "MaxDuration": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum duration (in seconds) to filter when searching for offerings.

\n

Default: 94608000 (3 years)

" } }, "MaxInstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances to filter when searching for offerings.

\n

Default: 20

" } }, "MinDuration": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum duration (in seconds) to filter when searching for offerings.

\n

Default: 2592000 (1 month)

" } }, @@ -35587,8 +34597,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35605,8 +34613,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n\t\t\tresults of the initial request can be seen by sending another request with the returned\n\t\t\t\tNextToken value. The maximum is 100.

\n

Default: 100

", "smithy.api#xmlName": "maxResults" } @@ -35685,8 +34691,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35778,7 +34782,6 @@ "com.amazonaws.ec2#DescribeRouteTablesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 100 @@ -35799,8 +34802,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35821,8 +34822,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeRouteTablesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -35877,7 +34876,6 @@ "com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 300 @@ -35890,8 +34888,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -35913,24 +34909,18 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. \n This value can be between 5 and 300. The default value is 300.\n To retrieve the remaining results, make another call with the returned\n NextToken value.

" } }, "MaxSlotDurationInHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum available duration, in hours. This value must be greater than MinSlotDurationInHours\n and less than 1,720.

" } }, "MinSlotDurationInHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum available duration, in hours. The minimum required duration is 1,200 hours per year. For example, the minimum daily schedule is 4 hours, the minimum weekly schedule is 24 hours, and the minimum monthly schedule is 100 hours.

" } }, @@ -36003,8 +34993,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36018,8 +35006,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. \n This value can be between 5 and 300. The default value is 100.\n To retrieve the remaining results, make another call with the returned\n NextToken value.

" } }, @@ -36111,8 +35097,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36166,7 +35150,6 @@ "com.amazonaws.ec2#DescribeSecurityGroupRulesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -36193,8 +35176,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36207,8 +35188,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeSecurityGroupRulesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of \n items, make another request with the token returned in the output. This value\n can be between 5 and 1000. If this parameter is not specified, then all items are\n returned. For more information, see Pagination.

" } } @@ -36300,7 +35279,6 @@ "com.amazonaws.ec2#DescribeSecurityGroupsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -36335,8 +35313,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36350,8 +35326,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeSecurityGroupsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n make another request with the token returned in the output. This value can be between 5 and 1000. \n If this parameter is not specified, then all items are returned. For more information, see \n Pagination.

" } } @@ -36433,8 +35407,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36510,8 +35482,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36640,8 +35610,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of snapshots to return for this request.\n This value can be between 5 and 1,000; if this value is larger than 1,000, only 1,000 results are returned. \n If this parameter is not used, then the request returns all snapshots. \n You cannot specify this parameter and the snapshot IDs parameter in the same request. For more information, \n see Pagination.

" } }, @@ -36676,8 +35644,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36744,8 +35710,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36807,7 +35771,6 @@ "com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -36821,8 +35784,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36831,8 +35792,6 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -36956,7 +35915,6 @@ "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -36970,8 +35928,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36988,8 +35944,6 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -37156,8 +36110,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -37166,8 +36118,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -37379,8 +36329,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -37401,8 +36349,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } } @@ -37495,7 +36441,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for which prices should\n be returned.

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n m3.medium).

    \n
  • \n
  • \n

    \n product-description - The product description for the Spot price\n (Linux/UNIX | Red Hat Enterprise Linux |\n SUSE Linux | Windows | Linux/UNIX (Amazon\n VPC) | Red Hat Enterprise Linux (Amazon VPC) |\n SUSE Linux (Amazon VPC) | Windows (Amazon\n VPC)).

    \n
  • \n
  • \n

    \n spot-price - The Spot price. The value must match exactly (or use\n wildcards; greater than or less than comparison is not supported).

    \n
  • \n
  • \n

    \n timestamp - The time stamp of the Spot price history, in UTC format\n (for example,\n YYYY-MM-DDTHH:MM:SSZ).\n You can use wildcards (* and ?). Greater than or less than comparison is not\n supported.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for which prices should\n be returned.

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n m3.medium).

    \n
  • \n
  • \n

    \n product-description - The product description for the Spot price\n (Linux/UNIX | Red Hat Enterprise Linux |\n SUSE Linux | Windows | Linux/UNIX (Amazon\n VPC) | Red Hat Enterprise Linux (Amazon VPC) |\n SUSE Linux (Amazon VPC) | Windows (Amazon\n VPC)).

    \n
  • \n
  • \n

    \n spot-price - The Spot price. The value must match exactly (or use\n wildcards; greater than or less than comparison is not supported).

    \n
  • \n
  • \n

    \n timestamp - The time stamp of the Spot price history, in UTC format\n (for example, ddd MMM dd\n HH:mm:ss UTC\n YYYY). You can use wildcards (* and\n ?). Greater than or less than comparison is not\n supported.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -37511,8 +36457,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -37536,8 +36480,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -37617,7 +36559,6 @@ "com.amazonaws.ec2#DescribeStaleSecurityGroupsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -37639,16 +36580,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#DescribeStaleSecurityGroupsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n make another request with the token returned in the output. For more information, \n see Pagination.

" } }, @@ -37763,15 +36700,13 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n task-state - Returns tasks in a certain state (InProgress |\n Completed | Failed)

    \n
  • \n
  • \n

    \n bucket - Returns task information for tasks that targeted a specific\n bucket. For the filter value, specify the bucket name.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n task-state - Returns tasks in a certain state (InProgress |\n Completed | Failed)

    \n
  • \n
  • \n

    \n bucket - Returns task information for tasks that targeted a specific\n bucket. For the filter value, specify the bucket name.

    \n
  • \n
\n \n

When you specify the ImageIds parameter, any filters that you specify are\n ignored. To use the filters, you must remove the ImageIds parameter.

\n
", "smithy.api#xmlName": "Filter" } }, @@ -37784,9 +36719,7 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeStoreImageTasksRequestMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, - "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the ImageIDs parameter\n in the same call.

" + "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the ImageIds parameter in the same\n call.

" } } }, @@ -37797,7 +36730,6 @@ "com.amazonaws.ec2#DescribeStoreImageTasksRequestMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 200 @@ -37896,7 +36828,6 @@ "com.amazonaws.ec2#DescribeSubnetsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -37924,8 +36855,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -37939,8 +36868,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeSubnetsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -38030,8 +36957,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -38047,8 +36972,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. This value can be between 5 and 1000. \n To get the next page of items, make another request with the token returned in the output.\n For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -38121,8 +37044,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38136,8 +37057,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TrafficMirroringMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38207,8 +37126,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38222,8 +37139,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TrafficMirroringMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38293,8 +37208,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38308,8 +37221,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TrafficMirroringMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38385,8 +37296,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38399,8 +37308,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38470,8 +37377,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38484,8 +37389,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38555,8 +37458,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38569,8 +37470,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38640,8 +37539,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38654,8 +37551,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38725,8 +37620,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38739,8 +37632,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38810,8 +37701,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38824,8 +37713,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38895,8 +37782,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38909,8 +37794,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -38980,8 +37863,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -38994,8 +37875,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39065,8 +37944,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39079,8 +37956,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39150,8 +38025,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39164,8 +38037,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39219,7 +38090,6 @@ "com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -39239,8 +38109,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -39260,8 +38128,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } } @@ -39315,7 +38181,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessEndpointsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -39347,8 +38212,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessEndpointsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39368,8 +38231,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39405,7 +38266,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessGroupMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -39449,8 +38309,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessGroupMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39470,8 +38328,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39525,7 +38381,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 10 @@ -39545,8 +38400,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39566,8 +38419,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39621,7 +38472,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessInstancesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 200 @@ -39641,8 +38491,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessInstancesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39662,8 +38510,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39717,7 +38563,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 200 @@ -39737,8 +38582,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -39758,8 +38601,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39843,8 +38684,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39951,8 +38790,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n make another request with the token returned in the output. This value can be between 5 and 1,000;\n if the value is larger than 1,000, only 1,000 results are returned. If this parameter is not used, \n then all items are returned. You cannot specify this parameter and the volume IDs parameter in the \n same request. For more information, see Pagination.

" } }, @@ -39973,8 +38810,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -40156,8 +38991,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40184,8 +39017,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results (up to a limit of 500) to be returned in a paginated\n request. For more information, see Pagination.

" } } @@ -40239,8 +39070,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -40249,8 +39078,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of volumes to return for this request. \n This value can be between 5 and 500; if you specify a value larger than 500, only 500 items are returned. \n If this parameter is not used, then all items are returned. You cannot specify this parameter and the\n volume IDs parameter in the same request. For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -40343,8 +39170,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -40427,7 +39252,6 @@ "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -40450,8 +39274,6 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -40514,8 +39336,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -40572,8 +39392,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40593,8 +39411,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another request with the returned NextToken value.

" } }, @@ -40657,8 +39473,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40672,8 +39486,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1,000; if\n MaxResults is given a value larger than 1,000, only 1,000 results are\n returned.

" } }, @@ -40736,8 +39548,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40758,8 +39568,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1,000; if\n MaxResults is given a value larger than 1,000, only 1,000 results are\n returned.

" } }, @@ -40822,8 +39630,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40845,8 +39651,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1,000; if\n MaxResults is given a value larger than 1,000, only 1,000 results are\n returned.

" } }, @@ -40903,8 +39707,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40925,8 +39727,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. The request returns a token that you can specify in a subsequent call to get the next set of results.

\n

Constraint: If the value is greater than 1,000, we return only 1,000 items.

" } }, @@ -40997,8 +39797,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -41019,8 +39817,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. The request returns a token that you can specify in a subsequent call to get the next set of results.

\n

Constraint: If the value is greater than 1,000, we return only 1,000 items.

" } }, @@ -41123,7 +39919,6 @@ "com.amazonaws.ec2#DescribeVpcPeeringConnectionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -41144,8 +39939,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41166,8 +39959,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVpcPeeringConnectionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -41287,7 +40078,6 @@ "com.amazonaws.ec2#DescribeVpcsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -41315,8 +40105,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41330,8 +40118,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVpcsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -41459,8 +40245,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41521,8 +40305,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41579,16 +40361,12 @@ "HiveCompatiblePartitions": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3.\n The default is false.

" } }, "PerHourPartition": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to partition the flow log per hour. This reduces the cost and response \n time for queries. The default is false.

" } } @@ -41612,8 +40390,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "HiveCompatiblePartitions", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3.

", "smithy.api#xmlName": "hiveCompatiblePartitions" } @@ -41622,8 +40398,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PerHourPartition", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to partition the flow log per hour.

", "smithy.api#xmlName": "perHourPartition" } @@ -41652,8 +40426,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41690,8 +40462,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -41730,8 +40500,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41799,8 +40567,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41809,8 +40575,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Force", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to force a detachment.

\n \n
    \n
  • \n

    Use the Force parameter only as a last resort to detach a network interface from a failed instance.

    \n
  • \n
  • \n

    If you use the Force parameter to detach a network interface, you might not be able to attach a different network interface to the same index on the instance without first stopping and starting the instance.

    \n
  • \n
  • \n

    If you force the detachment of a network interface, the instance metadata\n might not get updated. This means that the attributes associated\n with the detached network interface might still be visible. The\n instance metadata will get updated when you stop and start the\n instance.

    \n
  • \n
\n
", "smithy.api#xmlName": "force" } @@ -41862,8 +40626,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -41936,8 +40698,6 @@ "Force": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Forces detachment if the previous detachment attempt did not occur cleanly (for example,\n logging into an instance, unmounting the volume, and detaching normally). This option can lead\n to data loss or a corrupted file system. Use this option only as a last resort to detach a\n volume from a failed instance. The instance won't have an opportunity to flush file system\n caches or file system metadata. If you use this option, you must perform file system check and\n repair procedures.

" } }, @@ -41959,8 +40719,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -42005,8 +40763,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -42226,8 +40982,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -42294,8 +41048,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -42311,8 +41063,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Output", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the unsubscribe action was successful.

", "smithy.api#xmlName": "output" } @@ -42340,8 +41090,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -42357,8 +41105,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsEncryptionByDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The updated status of encryption by default.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } @@ -42394,16 +41140,12 @@ "Force": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Forces the image settings to turn off faster launching for your Windows AMI. This parameter overrides \n\t\t\tany errors that are encountered while cleaning up resources in your account.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -42451,8 +41193,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxParallelLaunches", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to \n\t\t\tcreate pre-provisioned snapshots for Windows faster launching.

", "smithy.api#xmlName": "maxParallelLaunches" } @@ -42725,8 +41465,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -42759,6 +41497,18 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#DisableImage": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#DisableImageRequest" + }, + "output": { + "target": "com.amazonaws.ec2#DisableImageResult" + }, + "traits": { + "smithy.api#documentation": "

Sets the AMI state to disabled and removes all launch permissions from the\n AMI. A disabled AMI can't be used for instance launches.

\n

A disabled AMI can't be shared. If a public or shared AMI was previously shared, it is\n made private. If an AMI was shared with an Amazon Web Services account, organization, or Organizational\n Unit, they lose access to the disabled AMI.

\n

A disabled AMI does not appear in DescribeImages API calls by\n default.

\n

Only the AMI owner can disable an AMI.

\n

You can re-enable a disabled AMI using EnableImage.

\n

For more information, see Disable an AMI in the\n Amazon EC2 User Guide.

" + } + }, "com.amazonaws.ec2#DisableImageBlockPublicAccess": { "type": "operation", "input": { @@ -42777,8 +41527,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -42829,8 +41577,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -42846,8 +41592,44 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", + "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", + "smithy.api#xmlName": "return" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ec2#DisableImageRequest": { + "type": "structure", + "members": { + "ImageId": { + "target": "com.amazonaws.ec2#ImageId", + "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, + "smithy.api#documentation": "

The ID of the AMI.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#DisableImageResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -42875,8 +41657,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -42900,8 +41680,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Success", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The result of disabling the IPAM account.

", "smithy.api#xmlName": "success" } @@ -42929,8 +41707,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -42946,8 +41722,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SerialConsoleAccessEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, access to the EC2 serial console of all instances is enabled for\n\t\t\tyour account. If false, access to the EC2 serial console of all instances\n\t\t\tis disabled for your account.

", "smithy.api#xmlName": "serialConsoleAccessEnabled" } @@ -42989,8 +41763,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -43065,8 +41837,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -43122,8 +41892,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -43140,8 +41908,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -43168,8 +41934,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -43219,8 +41983,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -43264,8 +42026,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -43332,8 +42092,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -43349,8 +42107,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -43442,8 +42198,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -43502,8 +42256,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -43571,16 +42323,12 @@ "MaxDrainDurationSeconds": { "target": "com.amazonaws.ec2#DrainSeconds", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43651,8 +42399,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -43758,8 +42504,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43818,8 +42562,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43878,8 +42620,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43937,8 +42677,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43954,8 +42692,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -44095,8 +42831,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Size", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk image, in GiB.

", "smithy.api#xmlName": "size" } @@ -44114,7 +42848,6 @@ "traits": { "aws.protocols#ec2QueryName": "Bytes", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk image, in GiB.

", "smithy.api#required": {}, "smithy.api#xmlName": "bytes" @@ -44189,8 +42922,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Size", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "size" } @@ -44332,8 +43063,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PrivateDnsOnlyForInboundResolverEndpoint", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable private DNS only for inbound endpoints.

", "smithy.api#xmlName": "privateDnsOnlyForInboundResolverEndpoint" } @@ -44355,8 +43084,6 @@ "PrivateDnsOnlyForInboundResolverEndpoint": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable private DNS only for inbound endpoints. This option is\n available only for services that support both gateway and interface endpoints. It routes\n traffic that originates from the VPC to the gateway endpoint and traffic that originates\n from on-premises to the interface endpoint.

" } } @@ -44406,8 +43133,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether DNS servers should be used. Specify False to delete the existing DNS \n\t\t\tservers.

" } } @@ -44451,10 +43176,7 @@ } }, "com.amazonaws.ec2#Double": { - "type": "double", - "traits": { - "smithy.api#default": 0 - } + "type": "double" }, "com.amazonaws.ec2#DoubleWithConstraints": { "type": "double", @@ -44468,7 +43190,6 @@ "com.amazonaws.ec2#DrainSeconds": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 4000 @@ -44499,8 +43220,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination. For more\n information, see Preserving Amazon EBS volumes on instance termination in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -44509,8 +43228,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Iops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3, io1, and io2 volumes,\n this represents the number of IOPS that are provisioned for the volume. For gp2\n volumes, this represents the baseline performance of the volume and the rate at which\n the volume accumulates I/O credits for bursting.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

For io1 and io2 volumes, we guarantee 64,000 IOPS only for\n Instances built on the\n Nitro System. Other instance families guarantee performance up to\n 32,000 IOPS.

\n

This parameter is required for io1 and io2 volumes. The default for gp3 volumes\n is 3,000 IOPS. This parameter is not supported for gp2, st1, sc1, or standard\n volumes.

", "smithy.api#xmlName": "iops" } @@ -44527,8 +43244,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\n size. If you specify a snapshot, the default is the snapshot size. You can specify a\n volume size that is equal to or larger than the snapshot size.

\n

The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3:1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
", "smithy.api#xmlName": "volumeSize" } @@ -44553,8 +43268,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Throughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

\n

This parameter is valid only for gp3 volumes.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

", "smithy.api#xmlName": "throughput" } @@ -44571,8 +43284,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the encryption state of an EBS volume is changed while being\n restored from a backing snapshot. The effect of setting the encryption state to true depends on \nthe volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. For more information, see Amazon EBS encryption in the Amazon EC2 User Guide.

\n

In no case can you remove encryption from an encrypted volume.

\n

Encrypted volumes can only be attached to instances that support Amazon EBS encryption. For\n more information, see Supported instance types.

\n

This parameter is not returned by DescribeImageAttribute.

\n

For CreateImage and RegisterImage, whether you can \n include this parameter, and the allowed values differ depending on the type of block \n device mapping you are creating.

\n
    \n
  • \n

    If you are creating a block device mapping for a new (empty) \n volume, you can include this parameter, and specify either true \n for an encrypted volume, or false for an unencrypted volume. If you omit \n this parameter, it defaults to false (unencrypted).

    \n
  • \n
  • \n

    If you are creating a block device mapping from an existing \n encrypted or unencrypted snapshot, you must omit this parameter. If you \n include this parameter, the request will fail, regardless of the value that you \n specify.

    \n
  • \n
  • \n

    If you are creating a block device mapping from an existing \n unencrypted volume, you can include this parameter, but you must specify \n false. If you specify true, the request will fail. In this \n case, we recommend that you omit the parameter.

    \n
  • \n
  • \n

    If you are creating a block device mapping from an existing \n encrypted volume, you can include this parameter, and specify either \n true or false. However, if you specify false, \n the parameter is ignored and the block device mapping is always encrypted. In this \n case, we recommend that you omit the parameter.

    \n
  • \n
", "smithy.api#xmlName": "encrypted" } @@ -44654,8 +43365,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -44688,8 +43397,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -44912,8 +43619,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PreserveClientIp", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether your client's IP address is preserved as the source. The value is true or false.

\n
    \n
  • \n

    If true, your client's IP address is used when you connect to a resource.

    \n
  • \n
  • \n

    If false, the elastic network interface IP address is used when you connect to a resource.

    \n
  • \n
\n

Default: true\n

", "smithy.api#xmlName": "preserveClientIp" } @@ -45315,8 +44020,6 @@ "Count": { "target": "com.amazonaws.ec2#ElasticInferenceAcceleratorCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

\n The number of elastic inference accelerators to attach to the instance. \n

\n

Default: 1

" } } @@ -45377,7 +44080,6 @@ "com.amazonaws.ec2#ElasticInferenceAcceleratorCount": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1 } @@ -45401,8 +44103,6 @@ "EnaSrdEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether ENA Express is enabled for the network interface.

" } }, @@ -45426,8 +44126,6 @@ "EnaSrdUdpEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether UDP traffic uses ENA Express. To specify this setting, you must first enable ENA Express.

" } } @@ -45493,8 +44191,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -45561,8 +44257,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -45578,8 +44272,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Output", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the subscribe action was successful.

", "smithy.api#xmlName": "output" } @@ -45607,8 +44299,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -45624,8 +44314,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsEncryptionByDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The updated status of encryption by default.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } @@ -45679,16 +44367,12 @@ "MaxParallelLaunches": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to create \n\t\t\tpre-provisioned snapshots for Windows faster launching. Value must be \n\t\t\t6 or greater.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -45736,8 +44420,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxParallelLaunches", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to \n\t\t\tcreate pre-provisioned snapshots for Windows faster launching.

", "smithy.api#xmlName": "maxParallelLaunches" } @@ -46010,8 +44692,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -46044,6 +44724,18 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#EnableImage": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#EnableImageRequest" + }, + "output": { + "target": "com.amazonaws.ec2#EnableImageResult" + }, + "traits": { + "smithy.api#documentation": "

Re-enables a disabled AMI. The re-enabled AMI is marked as available and can\n be used for instance launches, appears in describe operations, and can be shared. Amazon Web Services\n accounts, organizations, and Organizational Units that lost access to the AMI when it was\n disabled do not regain access automatically. Once the AMI is available, it can be shared with\n them again.

\n

Only the AMI owner can re-enable a disabled AMI.

\n

For more information, see Disable an AMI in the\n Amazon EC2 User Guide.

" + } + }, "com.amazonaws.ec2#EnableImageBlockPublicAccess": { "type": "operation", "input": { @@ -46070,8 +44762,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -46130,8 +44820,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -46147,8 +44835,44 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", + "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", + "smithy.api#xmlName": "return" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ec2#EnableImageRequest": { + "type": "structure", + "members": { + "ImageId": { + "target": "com.amazonaws.ec2#ImageId", + "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, + "smithy.api#documentation": "

The ID of the AMI.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#EnableImageResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -46176,8 +44900,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -46201,8 +44923,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Success", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The result of enabling the IPAM account.

", "smithy.api#xmlName": "success" } @@ -46230,8 +44950,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -46247,8 +44965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReturnValue", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "returnValue" } @@ -46276,8 +44992,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -46293,8 +45007,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SerialConsoleAccessEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, access to the EC2 serial console of all instances is enabled for\n\t\t\tyour account. If false, access to the EC2 serial console of all instances\n\t\t\tis disabled for your account.

", "smithy.api#xmlName": "serialConsoleAccessEnabled" } @@ -46336,8 +45048,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -46412,8 +45122,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -46451,8 +45159,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -46518,8 +45224,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -46536,8 +45240,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -46564,8 +45266,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -46582,8 +45282,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If this parameter is set to true, the instance is enabled for Amazon Web Services Nitro Enclaves; otherwise, it is not enabled for Amazon Web Services Nitro\n Enclaves.

", "smithy.api#xmlName": "enabled" } @@ -46599,8 +45297,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

To enable the instance for Amazon Web Services Nitro Enclaves, set this parameter to\n true.

" } } @@ -46960,8 +45656,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "LoadBalancerListenerPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The listener port of the load balancer.

", "smithy.api#xmlName": "loadBalancerListenerPort" } @@ -46994,8 +45688,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "LoadBalancerTargetPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target port.

", "smithy.api#xmlName": "loadBalancerTargetPort" } @@ -47052,8 +45744,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port.

", "smithy.api#xmlName": "port" } @@ -47290,8 +45980,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -47350,8 +46038,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -47438,8 +46124,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -47939,8 +46623,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -48120,8 +46802,6 @@ "TargetResourceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of pre-provisioned snapshots to keep on hand for a fast-launch enabled Windows AMI.

" } } @@ -48137,8 +46817,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetResourceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of pre-provisioned snapshots requested to keep on hand for a fast-launch enabled Windows AMI.

", "smithy.api#xmlName": "targetResourceCount" } @@ -48305,8 +46983,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the range.

", "smithy.api#xmlName": "fromPort" } @@ -48315,8 +46991,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the range.

", "smithy.api#xmlName": "toPort" } @@ -48484,8 +47158,6 @@ "target": "com.amazonaws.ec2#Priority", "traits": { "aws.protocols#ec2QueryName": "Priority", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule priority.

", "smithy.api#xmlName": "priority" } @@ -48571,8 +47243,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of instances for which the Capacity Reservation reserves capacity.

", "smithy.api#xmlName": "totalInstanceCount" } @@ -48581,8 +47251,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of capacity units fulfilled by the Capacity Reservation. For more information, see \n\t\t\t\n\t\t\t\tTotal target capacity in the Amazon EC2 User Guide.

", "smithy.api#xmlName": "fulfilledCapacity" } @@ -48591,8 +47259,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation reserves capacity for EBS-optimized instance types.

", "smithy.api#xmlName": "ebsOptimized" } @@ -48712,8 +47378,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units fulfilled by this request compared to the set target\n capacity.

", "smithy.api#xmlName": "fulfilledCapacity" } @@ -48722,8 +47386,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledOnDemandCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units fulfilled by this request compared to the set target On-Demand\n capacity.

", "smithy.api#xmlName": "fulfilledOnDemandCapacity" } @@ -48748,8 +47410,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "TerminateInstancesWithExpiration", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether running instances should be terminated when the EC2 Fleet expires.

", "smithy.api#xmlName": "terminateInstancesWithExpiration" } @@ -48782,8 +47442,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReplaceUnhealthyInstances", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for\n fleets of type maintain. For more information, see EC2 Fleet\n health checks in the Amazon EC2 User Guide.

", "smithy.api#xmlName": "replaceUnhealthyInstances" } @@ -48816,7 +47474,7 @@ "target": "com.amazonaws.ec2#DescribeFleetsErrorSet", "traits": { "aws.protocols#ec2QueryName": "ErrorSet", - "smithy.api#documentation": "

Information about the instances that could not be launched by the fleet. Valid only when\n Type is set to instant.

", + "smithy.api#documentation": "

Information about the instances that could not be launched by the fleet. Valid only when\n Type is set to instant.

", "smithy.api#xmlName": "errorSet" } }, @@ -48824,7 +47482,7 @@ "target": "com.amazonaws.ec2#DescribeFleetsInstancesSet", "traits": { "aws.protocols#ec2QueryName": "FleetInstanceSet", - "smithy.api#documentation": "

Information about the instances that were launched by the fleet. Valid only when\n Type is set to instant.

", + "smithy.api#documentation": "

Information about the instances that were launched by the fleet. Valid only when\n Type is set to instant.

", "smithy.api#xmlName": "fleetInstanceSet" } }, @@ -49008,8 +47666,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "WeightedCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type.

", "smithy.api#xmlName": "weightedCapacity" } @@ -49018,8 +47674,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Priority", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The priority for the launch template override. The highest priority is launched\n first.

\n

If the On-Demand AllocationStrategy is set to prioritized,\n EC2 Fleet uses priority to determine which launch template override to use first in fulfilling\n On-Demand capacity.

\n

If the Spot AllocationStrategy is set to\n capacity-optimized-prioritized, EC2 Fleet uses priority on a best-effort basis\n to determine which launch template override to use in fulfilling Spot capacity, but\n optimizes for capacity first.

\n

Valid values are whole numbers starting at 0. The lower the number, the\n higher the priority. If no number is set, the override has the lowest priority. You can set\n the same priority for different launch template overrides.

", "smithy.api#xmlName": "priority" } @@ -49101,16 +47755,12 @@ "WeightedCapacity": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type.

" } }, "Priority": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The priority for the launch template override. The highest priority is launched\n first.

\n

If the On-Demand AllocationStrategy is set to prioritized,\n EC2 Fleet uses priority to determine which launch template override to use first in fulfilling\n On-Demand capacity.

\n

If the Spot AllocationStrategy is set to\n capacity-optimized-prioritized, EC2 Fleet uses priority on a best-effort basis\n to determine which launch template override to use in fulfilling Spot capacity, but\n optimizes for capacity first.

\n

Valid values are whole numbers starting at 0. The lower the number, the\n higher the priority. If no number is set, the launch template override has the lowest\n priority. You can set the same priority for different launch template overrides.

" } }, @@ -49253,8 +47903,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TerminationDelay", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\n Instance after launching a new replacement Spot Instance.

\n

Required when ReplacementStrategy is set to launch-before-terminate.

\n

Not valid when ReplacementStrategy is set to launch.

\n

Valid values: Minimum value of 120 seconds. Maximum value of 7200 seconds.

", "smithy.api#xmlName": "terminationDelay" } @@ -49276,8 +47924,6 @@ "TerminationDelay": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\n Instance after launching a new replacement Spot Instance.

\n

Required when ReplacementStrategy is set to launch-before-terminate.

\n

Not valid when ReplacementStrategy is set to launch.

\n

Valid values: Minimum value of 120 seconds. Maximum value of 7200 seconds.

" } } @@ -49387,10 +48033,7 @@ } }, "com.amazonaws.ec2#Float": { - "type": "float", - "traits": { - "smithy.api#default": 0 - } + "type": "float" }, "com.amazonaws.ec2#FlowLog": { "type": "structure", @@ -49511,8 +48154,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxAggregationInterval", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum interval of time, in seconds, during which a flow of packets is captured and aggregated into a flow log record.

\n

When a network interface is attached to a Nitro-based\n instance, the aggregation interval is always 60 seconds (1 minute) or less,\n regardless of the specified value.

\n

Valid Values: 60 | 600\n

", "smithy.api#xmlName": "maxAggregationInterval" } @@ -49783,8 +48424,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Public", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the AFI is public.

", "smithy.api#xmlName": "public" } @@ -49793,8 +48432,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DataRetentionSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether data retention support is enabled for the AFI.

", "smithy.api#xmlName": "dataRetentionSupport" } @@ -50065,8 +48702,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -50129,16 +48764,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#Ipv6PoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50214,8 +48845,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50228,8 +48857,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50294,16 +48921,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetCapacityReservationUsageRequestMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

\n

Valid range: Minimum value of 1. Maximum value of 1000.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -50315,7 +48938,6 @@ "com.amazonaws.ec2#GetCapacityReservationUsageRequestMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -50353,8 +48975,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances for which the Capacity Reservation reserves capacity.

", "smithy.api#xmlName": "totalInstanceCount" } @@ -50363,8 +48983,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The remaining capacity. Indicates the number of instances that can be launched in the Capacity Reservation.

", "smithy.api#xmlName": "availableInstanceCount" } @@ -50423,8 +49041,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#CoipPoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50437,8 +49053,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50520,8 +49134,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -50529,8 +49141,6 @@ "Latest": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

When enabled, retrieves the latest console output for the instance.

\n

Default: disabled (false)

" } } @@ -50589,8 +49199,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -50605,8 +49213,6 @@ "WakeUp": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

When set to true, acts as keystroke input and wakes up an instance that's\n in standby or \"sleep\" mode.

" } } @@ -50657,8 +49263,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -50709,8 +49313,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50753,8 +49355,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50770,8 +49370,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsEncryptionByDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether encryption by default is enabled.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } @@ -50807,8 +49405,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -50896,16 +49492,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetGroupsForCapacityReservationRequestMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -50917,7 +49509,6 @@ "com.amazonaws.ec2#GetGroupsForCapacityReservationRequestMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -51042,8 +49633,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -51092,8 +49681,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51126,8 +49713,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -51193,8 +49778,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -51251,8 +49834,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51293,8 +49874,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamAddressHistoryMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of historical results you would like returned per page. Defaults to 100.

" } }, @@ -51357,8 +49936,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51394,8 +49971,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of discovered accounts to return in one page of results.

" } } @@ -51452,8 +50027,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51489,8 +50062,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of discovered resource CIDRs to return in one page of results.

" } } @@ -51544,7 +50115,6 @@ "com.amazonaws.ec2#GetIpamPoolAllocationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1000, "max": 100000 @@ -51557,8 +50127,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51586,8 +50154,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetIpamPoolAllocationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results you would like returned per page.

" } }, @@ -51650,8 +50216,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51673,8 +50237,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -51737,8 +50299,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51752,8 +50312,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -51907,8 +50465,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -51962,7 +50518,6 @@ "com.amazonaws.ec2#GetManagedPrefixListAssociationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -51975,8 +50530,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -51991,8 +50544,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetManagedPrefixListAssociationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -52055,8 +50606,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -52071,16 +50620,12 @@ "TargetVersion": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version of the prefix list for which to return the entries. The default is the current version.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#PrefixListMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -52151,8 +50696,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -52165,8 +50708,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -52241,8 +50782,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -52311,8 +50850,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -52372,8 +50909,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -52414,8 +50949,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsValidExchange", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, the exchange is valid. If false, the exchange cannot be completed.

", "smithy.api#xmlName": "isValidExchange" } @@ -52482,6 +51015,98 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#GetSecurityGroupsForVpc": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpcRequest" + }, + "output": { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpcResult" + }, + "traits": { + "smithy.api#documentation": "

Gets security groups that can be associated by the Amazon Web Services account making the request with network interfaces in the specified VPC.

", + "smithy.api#paginated": { + "inputToken": "NextToken", + "outputToken": "NextToken", + "items": "SecurityGroupForVpcs", + "pageSize": "MaxResults" + } + } + }, + "com.amazonaws.ec2#GetSecurityGroupsForVpcRequest": { + "type": "structure", + "members": { + "VpcId": { + "target": "com.amazonaws.ec2#VpcId", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#documentation": "

The VPC ID where the security group can be used.

", + "smithy.api#required": {} + } + }, + "NextToken": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.

" + } + }, + "MaxResults": { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpcRequestMaxResults", + "traits": { + "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" + } + }, + "Filters": { + "target": "com.amazonaws.ec2#FilterList", + "traits": { + "smithy.api#documentation": "

The filters. If using multiple filters, the results include security groups which match all filters.

\n
    \n
  • \n

    \n group-id: The security group ID.

    \n
  • \n
  • \n

    \n description: The security group's description.

    \n
  • \n
  • \n

    \n group-name: The security group name.

    \n
  • \n
  • \n

    \n owner-id: The security group owner ID.

    \n
  • \n
  • \n

    \n primary-vpc-id: The VPC ID in which the security group was created.

    \n
  • \n
", + "smithy.api#xmlName": "Filter" + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#GetSecurityGroupsForVpcRequestMaxResults": { + "type": "integer", + "traits": { + "smithy.api#range": { + "min": 5, + "max": 1000 + } + } + }, + "com.amazonaws.ec2#GetSecurityGroupsForVpcResult": { + "type": "structure", + "members": { + "NextToken": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "NextToken", + "smithy.api#documentation": "

The token to include in another request to get the next page of items. This value is null when there are no more items to return.

", + "smithy.api#xmlName": "nextToken" + } + }, + "SecurityGroupForVpcs": { + "target": "com.amazonaws.ec2#SecurityGroupForVpcList", + "traits": { + "aws.protocols#ec2QueryName": "SecurityGroupForVpcSet", + "smithy.api#documentation": "

The security group that can be used by interfaces in the VPC.

", + "smithy.api#xmlName": "securityGroupForVpcSet" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#GetSerialConsoleAccessStatus": { "type": "operation", "input": { @@ -52500,8 +51125,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -52517,8 +51140,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SerialConsoleAccessEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, access to the EC2 serial console of all instances is enabled for\n\t\t\tyour account. If false, access to the EC2 serial console of all instances\n\t\t\tis disabled for your account.

", "smithy.api#xmlName": "serialConsoleAccessEnabled" } @@ -52560,7 +51181,6 @@ "target": "com.amazonaws.ec2#SpotPlacementScoresTargetCapacity", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target capacity.

", "smithy.api#required": {} } @@ -52574,8 +51194,6 @@ "SingleAvailabilityZone": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true so that the response returns a list of scored Availability Zones.\n Otherwise, the response returns a list of scored Regions.

\n

A list of scored Availability Zones is useful if you want to launch all of your Spot\n capacity into a single Availability Zone.

" } }, @@ -52595,16 +51213,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#SpotPlacementScoresMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -52658,7 +51272,6 @@ "com.amazonaws.ec2#GetSubnetCidrReservationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -52686,8 +51299,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -52700,8 +51311,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetSubnetCidrReservationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } } @@ -52781,8 +51390,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -52795,8 +51402,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -52868,8 +51473,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -52882,8 +51485,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -52955,8 +51556,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -52969,8 +51568,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53036,8 +51633,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -53050,8 +51645,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53115,8 +51708,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -53129,8 +51720,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53202,8 +51791,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -53216,8 +51803,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53289,8 +51874,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -53303,8 +51886,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53363,8 +51944,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53380,8 +51959,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -53425,8 +52002,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -53442,8 +52017,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -53501,8 +52074,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -53563,8 +52134,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -53631,8 +52200,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -53877,8 +52444,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Configured", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, your instance is enabled for hibernation; otherwise, it is not\n enabled for hibernation.

", "smithy.api#xmlName": "configured" } @@ -53894,9 +52459,7 @@ "Configured": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

Set to true to enable your instance for hibernation.

\n

Default: false\n

" + "smithy.api#documentation": "

Set to true to enable your instance for hibernation.

\n

For Spot Instances, if you set Configured to true, either\n omit the InstanceInterruptionBehavior parameter (for \n SpotMarketOptions\n ), or set it to\n hibernate. When Configured is true:

\n
    \n
  • \n

    If you omit InstanceInterruptionBehavior, it defaults to\n hibernate.

    \n
  • \n
  • \n

    If you set InstanceInterruptionBehavior to a value other than\n hibernate, you'll get an error.

    \n
  • \n
\n

Default: false\n

" } } }, @@ -54121,8 +52684,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MemberOfServiceLinkedResourceGroup", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Dedicated Host is in a host resource group. If memberOfServiceLinkedResourceGroup is true, the\n host is in a host resource group; otherwise, it is not.

", "smithy.api#xmlName": "memberOfServiceLinkedResourceGroup" } @@ -54238,8 +52799,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the offering (in seconds).

", "smithy.api#xmlName": "duration" } @@ -54305,8 +52864,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Cores", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of cores on the Dedicated Host.

", "smithy.api#xmlName": "cores" } @@ -54331,8 +52888,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Sockets", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of sockets on the Dedicated Host.

", "smithy.api#xmlName": "sockets" } @@ -54341,8 +52896,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalVCpus", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of vCPUs on the Dedicated Host.

", "smithy.api#xmlName": "totalVCpus" } @@ -54376,8 +52929,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Dedicated Hosts the reservation is associated with.

", "smithy.api#xmlName": "count" } @@ -54394,8 +52945,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The length of the reservation's term, specified in seconds. Can be 31536000 (1\n year) | 94608000 (3 years).

", "smithy.api#xmlName": "duration" } @@ -54551,7 +53100,6 @@ "com.amazonaws.ec2#Hour": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 23 @@ -54784,8 +53332,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Code", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ICMP code. A value of -1 means all codes for the specified ICMP type.

", "smithy.api#xmlName": "code" } @@ -54794,8 +53340,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Type", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ICMP type. A value of -1 means all types.

", "smithy.api#xmlName": "type" } @@ -54828,8 +53372,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "UseLongIds", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether longer IDs (17-character IDs) are enabled for the resource.

", "smithy.api#xmlName": "useLongIds" } @@ -54912,8 +53454,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPublic", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the image has public launch permissions. The value is true if\n\t\t\t\tthis image has public launch permissions or false\n\t\t\t\tif it has only implicit and explicit launch permissions.

", "smithy.api#xmlName": "isPublic" } @@ -55002,8 +53542,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether enhanced networking with ENA is enabled.

", "smithy.api#xmlName": "enaSupport" } @@ -55012,7 +53550,7 @@ "target": "com.amazonaws.ec2#HypervisorType", "traits": { "aws.protocols#ec2QueryName": "Hypervisor", - "smithy.api#documentation": "

The hypervisor type of the image.

", + "smithy.api#documentation": "

The hypervisor type of the image. Only xen is supported. ovm is\n not supported.

", "smithy.api#xmlName": "hypervisor" } }, @@ -55111,6 +53649,14 @@ "smithy.api#documentation": "

If v2.0, it indicates that IMDSv2 is specified in the AMI. Instances launched\n from this AMI will have HttpTokens automatically set to required so\n that, by default, the instance requires that IMDSv2 is used when requesting instance metadata.\n In addition, HttpPutResponseHopLimit is set to 2. For more\n information, see Configure\n the AMI in the Amazon EC2 User Guide.

", "smithy.api#xmlName": "imdsSupport" } + }, + "SourceInstanceId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "SourceInstanceId", + "smithy.api#documentation": "

The ID of the instance that the AMI was created from if the AMI was created using CreateImage. This field only appears if the AMI was created using\n CreateImage.

", + "smithy.api#xmlName": "sourceInstanceId" + } } }, "traits": { @@ -55512,6 +54058,12 @@ "traits": { "smithy.api#enumValue": "error" } + }, + "disabled": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "disabled" + } } } }, @@ -55583,8 +54135,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -55600,8 +54150,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -55708,16 +54256,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether the destination AMI of the imported image should be encrypted. The default KMS key for EBS is used\n unless you specify a non-default KMS key using KmsKeyId. For more information, see Amazon EBS Encryption in the\n Amazon Elastic Compute Cloud User Guide.

" } }, @@ -55773,7 +54317,7 @@ "BootMode": { "target": "com.amazonaws.ec2#BootModeValues", "traits": { - "smithy.api#documentation": "

The boot mode of the virtual machine.

" + "smithy.api#documentation": "

The boot mode of the virtual machine.

\n \n

The uefi-preferred boot mode isn't supported for importing images. For more\n information, see Boot modes in\n the VM Import/Export User Guide.

\n
" } } }, @@ -55804,8 +54348,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the AMI is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -55942,8 +54484,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the image is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -56142,8 +54682,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Monitoring", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether monitoring is enabled.

", "smithy.api#xmlName": "monitoring" } @@ -56208,8 +54746,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -56308,8 +54844,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "BytesConverted", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes converted so far.

", "smithy.api#xmlName": "bytesConverted" } @@ -56387,8 +54921,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -56513,16 +55045,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether the destination snapshot of the imported image should be encrypted. The default KMS key for EBS is\n used unless you specify a non-default KMS key using KmsKeyId. For more information, see Amazon EBS Encryption in the\n Amazon Elastic Compute Cloud User Guide.

" } }, @@ -56700,8 +55228,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -56762,8 +55288,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "BytesConverted", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes converted so far.

", "smithy.api#xmlName": "bytesConverted" } @@ -56911,8 +55435,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AmiLaunchIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The AMI launch index, which can be used to find this instance in the launch\n group.

", "smithy.api#xmlName": "amiLaunchIndex" } @@ -57097,8 +55619,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\n provides dedicated throughput to Amazon EBS and an optimized configuration stack to\n provide optimal I/O performance. This optimization isn't available with all instance\n types. Additional usage charges apply when using an EBS Optimized instance.

", "smithy.api#xmlName": "ebsOptimized" } @@ -57107,8 +55627,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether enhanced networking with ENA is enabled.

", "smithy.api#xmlName": "enaSupport" } @@ -57197,8 +55715,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SourceDestCheck", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether source/destination checking is enabled.

", "smithy.api#xmlName": "sourceDestCheck" } @@ -57744,8 +56260,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances that can be launched onto the Dedicated Host based on the\n host's available capacity.

", "smithy.api#xmlName": "availableCapacity" } @@ -57762,8 +56276,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of instances that can be launched onto the Dedicated Host if there\n are no instances running on it.

", "smithy.api#xmlName": "totalCapacity" } @@ -57779,7 +56291,6 @@ "com.amazonaws.ec2#InstanceConnectEndpointMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 50 @@ -57802,8 +56313,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of listed Reserved Instances in the state specified by the state.

", "smithy.api#xmlName": "instanceCount" } @@ -58143,8 +56652,6 @@ "target": "com.amazonaws.ec2#Hour", "traits": { "aws.protocols#ec2QueryName": "StartHour", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range begins.

", "smithy.api#xmlName": "startHour" } @@ -58161,8 +56668,6 @@ "target": "com.amazonaws.ec2#Hour", "traits": { "aws.protocols#ec2QueryName": "EndHour", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range ends.

", "smithy.api#xmlName": "endHour" } @@ -58193,8 +56698,6 @@ "StartHour": { "target": "com.amazonaws.ec2#Hour", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range begins.

" } }, @@ -58207,8 +56710,6 @@ "EndHour": { "target": "com.amazonaws.ec2#Hour", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range ends.

" } } @@ -58422,8 +56923,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPrimaryIpv6", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. \n For more information, see RunInstances.

", "smithy.api#xmlName": "isPrimaryIpv6" } @@ -58629,8 +57128,6 @@ "HttpPutResponseHopLimit": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1

\n

Possible values: Integers from 1 to 64

" } }, @@ -58680,8 +57177,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "HttpPutResponseHopLimit", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1

\n

Possible values: Integers from 1 to 64

", "smithy.api#xmlName": "httpPutResponseHopLimit" } @@ -58894,8 +57389,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SourceDestCheck", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether source/destination checking is enabled.

", "smithy.api#xmlName": "sourceDestCheck" } @@ -59024,8 +57517,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -59034,8 +57525,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the device on the instance for the network interface attachment.

", "smithy.api#xmlName": "deviceIndex" } @@ -59052,8 +57541,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -59079,8 +57566,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssociatePublicIpAddress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to assign a public IPv4 address to an instance you launch in a VPC. The\n public IP address can only be assigned to a network interface for eth0, and can only be\n assigned to a new network interface, not an existing one. You cannot specify more than one\n network interface in the request. If launching into a default subnet, the default value is\n true.

", "smithy.api#xmlName": "associatePublicIpAddress" } @@ -59089,8 +57574,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If set to true, the interface is deleted when the instance is terminated. You can\n specify true only if creating a new network interface when launching an\n instance.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -59107,8 +57590,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The position of the network interface in the attachment order. \n A primary network interface has a device index of 0.

\n

If you specify a network interface when launching an instance, \n you must specify the device index.

", "smithy.api#xmlName": "deviceIndex" } @@ -59124,8 +57605,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A number of IPv6 addresses to assign to the network interface. Amazon EC2 chooses\n the IPv6 addresses from the range of the subnet. You cannot specify this option and the\n option to assign specific IPv6 addresses in the same request. You can specify this\n option if you've specified a minimum number of instances to launch.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -59166,8 +57645,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses. You can't specify this option and specify more than one private IP address using the private IP addresses option. You cannot specify this option if you're\n \tlaunching more than one instance in a RunInstances request.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -59183,8 +57660,6 @@ "AssociateCarrierIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to assign a carrier IP address to the network interface.

\n

You can only assign a carrier IP address to a network interface that is in a subnet in\n a Wavelength Zone. For more information about carrier IP addresses, see Carrier IP address in the Amazon Web Services Wavelength Developer\n Guide.

" } }, @@ -59197,8 +57672,6 @@ "NetworkCardIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card. Some instance types support multiple network cards. \n The primary network interface must be assigned to network card index 0. \n The default is network card index 0.

\n

If you are using RequestSpotInstances to create Spot Instances, omit this parameter because\n you can’t specify the network card index when using this API. To specify the network\n card index, use RunInstances.

" } }, @@ -59212,8 +57685,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 delegated prefixes to be automatically assigned to the network interface. \n You cannot use this option if you use the Ipv4Prefix option.

" } }, @@ -59227,16 +57698,12 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 delegated prefixes to be automatically assigned to the network interface. \n You cannot use this option if you use the Ipv6Prefix option.

" } }, "PrimaryIpv6": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" } } @@ -59269,8 +57736,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Primary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this IPv4 address is the primary private IP address of the network interface.

", "smithy.api#xmlName": "primary" } @@ -59360,8 +57825,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SpotMaxPricePercentageOverLowestPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for Spot Instances. This is the maximum you’ll pay for a Spot Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 100\n

", "smithy.api#xmlName": "spotMaxPricePercentageOverLowestPrice" } @@ -59370,8 +57833,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OnDemandMaxPricePercentageOverLowestPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 20\n

", "smithy.api#xmlName": "onDemandMaxPricePercentageOverLowestPrice" } @@ -59396,8 +57857,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "RequireHibernateSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether instance types must support hibernation for On-Demand\n Instances.

\n

This parameter is not supported for GetSpotPlacementScores.

\n

Default: false\n

", "smithy.api#xmlName": "requireHibernateSupport" } @@ -59552,16 +58011,12 @@ "SpotMaxPricePercentageOverLowestPrice": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for Spot Instance. This is the maximum you’ll pay for an Spot Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 100\n

" } }, "OnDemandMaxPricePercentageOverLowestPrice": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 20\n

" } }, @@ -59580,8 +58035,6 @@ "RequireHibernateSupport": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether instance types must support hibernation for On-Demand Instances.

\n

This parameter is not supported for GetSpotPlacementScores.

\n

Default: false\n

" } }, @@ -59709,8 +58162,6 @@ "ExcludeBootVolume": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Excludes the root volume from being snapshotted.

" } }, @@ -59733,8 +58184,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Code", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The state of the instance as a 16-bit unsigned integer.

\n

The high byte is all of the bits between 2^8 and (2^16)-1, which equals decimal values\n between 256 and 65,535. These numerical values are used for internal purposes and should\n be ignored.

\n

The low byte is all of the bits between 2^0 and (2^8)-1, which equals decimal values\n between 0 and 255.

\n

The valid values for instance-state-code will all be in the range of the low byte and\n they are:

\n
    \n
  • \n

    \n 0 : pending\n

    \n
  • \n
  • \n

    \n 16 : running\n

    \n
  • \n
  • \n

    \n 32 : shutting-down\n

    \n
  • \n
  • \n

    \n 48 : terminated\n

    \n
  • \n
  • \n

    \n 64 : stopping\n

    \n
  • \n
  • \n

    \n 80 : stopped\n

    \n
  • \n
\n

You can ignore the high byte value by zeroing out all of the bits above 2^8 or 256 in\n decimal.

", "smithy.api#xmlName": "code" } @@ -60121,8 +58570,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IncludeAllTagsOfInstance", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates wheter all tag keys in the current Region are registered to appear in scheduled event notifications. \n \ttrue indicates that all tag keys in the current Region are registered.

", "smithy.api#xmlName": "includeAllTagsOfInstance" } @@ -64580,6 +63027,186 @@ "traits": { "smithy.api#enumValue": "mac2-m2pro.metal" } + }, + "r7iz_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.large" + } + }, + "r7iz_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.xlarge" + } + }, + "r7iz_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.2xlarge" + } + }, + "r7iz_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.4xlarge" + } + }, + "r7iz_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.8xlarge" + } + }, + "r7iz_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.12xlarge" + } + }, + "r7iz_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.16xlarge" + } + }, + "r7iz_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.32xlarge" + } + }, + "c7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.medium" + } + }, + "c7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.large" + } + }, + "c7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.xlarge" + } + }, + "c7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.2xlarge" + } + }, + "c7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.4xlarge" + } + }, + "c7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.8xlarge" + } + }, + "c7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.12xlarge" + } + }, + "c7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.16xlarge" + } + }, + "c7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.24xlarge" + } + }, + "c7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.32xlarge" + } + }, + "c7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.48xlarge" + } + }, + "c7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.metal-48xl" + } + }, + "r7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.metal-48xl" + } + }, + "r7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.large" + } + }, + "r7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.xlarge" + } + }, + "r7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.2xlarge" + } + }, + "r7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.4xlarge" + } + }, + "r7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.8xlarge" + } + }, + "r7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.12xlarge" + } + }, + "r7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.16xlarge" + } + }, + "r7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.24xlarge" + } + }, + "r7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.48xlarge" + } } } }, @@ -64941,8 +63568,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "UsedInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances the Amazon Web Services account currently has in the Capacity Reservation.

", "smithy.api#xmlName": "usedInstanceCount" } @@ -64962,10 +63587,7 @@ } }, "com.amazonaws.ec2#Integer": { - "type": "integer", - "traits": { - "smithy.api#default": 0 - } + "type": "integer" }, "com.amazonaws.ec2#IntegerWithConstraints": { "type": "integer", @@ -65176,8 +63798,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "fromPort" } @@ -65218,8 +63838,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "toPort" } @@ -65352,8 +63970,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ScopeCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of scopes in the IPAM. The scope quota is 5. For more information on quotas, see Quotas in IPAM in the Amazon VPC IPAM User Guide.\n

", "smithy.api#xmlName": "scopeCount" } @@ -65410,8 +64026,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ResourceDiscoveryAssociationCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IPAM's resource discovery association count.

", "smithy.api#xmlName": "resourceDiscoveryAssociationCount" } @@ -65424,7 +64038,6 @@ "com.amazonaws.ec2#IpamAddressHistoryMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -65867,7 +64480,6 @@ "com.amazonaws.ec2#IpamMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -65877,7 +64489,6 @@ "com.amazonaws.ec2#IpamNetmaskLength": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 128 @@ -66011,8 +64622,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PoolDepth", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The depth of pools in your IPAM pool. The pool depth quota is 10. For more information, see Quotas in IPAM in the Amazon VPC IPAM User Guide.\n

", "smithy.api#xmlName": "poolDepth" } @@ -66045,8 +64654,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AutoImport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If selected, IPAM will continuously look for resources within the CIDR range of this pool \n and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\n these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \n a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \n marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \n discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\n

\n

A locale must be set on the pool for this feature to work.

", "smithy.api#xmlName": "autoImport" } @@ -66055,8 +64662,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PubliclyAdvertisable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if a pool is publicly advertisable. This option is not available for pools with AddressFamily set to ipv4.

", "smithy.api#xmlName": "publiclyAdvertisable" } @@ -66073,8 +64678,6 @@ "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { "aws.protocols#ec2QueryName": "AllocationMinNetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

", "smithy.api#xmlName": "allocationMinNetmaskLength" } @@ -66083,8 +64686,6 @@ "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { "aws.protocols#ec2QueryName": "AllocationMaxNetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

", "smithy.api#xmlName": "allocationMaxNetmaskLength" } @@ -66093,8 +64694,6 @@ "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { "aws.protocols#ec2QueryName": "AllocationDefaultNetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and \n you enter 16 here, new allocations will default to 10.0.0.0/16.

", "smithy.api#xmlName": "allocationDefaultNetmaskLength" } @@ -66300,8 +64899,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you'd like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. \"NetmaskLength\" or \"Cidr\" is required.

", "smithy.api#xmlName": "netmaskLength" } @@ -66715,8 +65312,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the resource discovery is the default. The default resource discovery is the resource discovery automatically created when you create an IPAM.

", "smithy.api#xmlName": "isDefault" } @@ -66805,8 +65400,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the resource discovery is the default. When you create an IPAM, a default resource discovery is created for your IPAM and it's associated with your IPAM.

", "smithy.api#xmlName": "isDefault" } @@ -67123,8 +65716,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the scope is the default scope or not.

", "smithy.api#xmlName": "isDefault" } @@ -67141,8 +65732,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PoolCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of pools in the scope.

", "smithy.api#xmlName": "poolCount" } @@ -67567,7 +66156,6 @@ "com.amazonaws.ec2#Ipv6PoolMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -67888,6 +66476,9 @@ } } }, + "com.amazonaws.ec2#KmsKeyArn": { + "type": "string" + }, "com.amazonaws.ec2#KmsKeyId": { "type": "string" }, @@ -68023,8 +66614,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -68161,8 +66750,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "DefaultVersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the default version of the launch template.

", "smithy.api#xmlName": "defaultVersionNumber" } @@ -68171,8 +66758,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "LatestVersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the latest version of the launch template.

", "smithy.api#xmlName": "latestVersionNumber" } @@ -68405,8 +66990,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "CoreCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

", "smithy.api#xmlName": "coreCount" } @@ -68415,8 +66998,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ThreadsPerCore", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core.

", "smithy.api#xmlName": "threadsPerCore" } @@ -68440,16 +67021,12 @@ "CoreCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

" } }, "ThreadsPerCore": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core. To disable multithreading for the instance,\n specify a value of 1. Otherwise, specify the default value of\n 2.

" } }, @@ -68471,8 +67048,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -68481,8 +67056,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -68491,8 +67064,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Iops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS) that the volume supports.

", "smithy.api#xmlName": "iops" } @@ -68517,8 +67088,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } @@ -68535,8 +67104,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Throughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

", "smithy.api#xmlName": "throughput" } @@ -68552,24 +67119,18 @@ "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is encrypted. Encrypted volumes can only be attached\n to instances that support Amazon EBS encryption. If you are creating a volume from a\n snapshot, you can't specify an encryption value.

" } }, "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination.

" } }, "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3,\n io1, and io2 volumes, this represents the number of IOPS that\n are provisioned for the volume. For gp2 volumes, this represents the\n baseline performance of the volume and the rate at which the volume accumulates I/O\n credits for bursting.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

For io1 and io2 volumes, we guarantee\n 64,000 IOPS only for Instances built on the\n Nitro System. Other instance families guarantee performance up to\n 32,000 IOPS.

\n

This parameter is supported for io1, io2, and gp3 volumes only. This parameter\n is not supported for gp2, st1, sc1, or standard volumes.

" } }, @@ -68588,8 +67149,6 @@ "VolumeSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\n size. The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3: 1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
" } }, @@ -68602,8 +67161,6 @@ "Throughput": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput to provision for a gp3 volume, with a maximum of 1,000\n MiB/s.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

" } } @@ -68626,8 +67183,6 @@ "Count": { "target": "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of elastic inference accelerators to attach to the instance.

\n

Default: 1

" } } @@ -68639,7 +67194,6 @@ "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorCount": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1 } @@ -68669,8 +67223,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of elastic inference accelerators to attach to the instance.

\n

Default: 1

", "smithy.api#xmlName": "count" } @@ -68696,8 +67248,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If this parameter is set to true, the instance is enabled for Amazon Web Services Nitro\n Enclaves; otherwise, it is not enabled for Amazon Web Services Nitro Enclaves.

", "smithy.api#xmlName": "enabled" } @@ -68713,8 +67263,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

To enable the instance for Amazon Web Services Nitro Enclaves, set this parameter to\n true.

" } } @@ -68771,8 +67319,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Configured", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If this parameter is set to true, the instance is enabled for\n hibernation; otherwise, it is not enabled for hibernation.

", "smithy.api#xmlName": "configured" } @@ -68788,8 +67334,6 @@ "Configured": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you set this parameter to true, the instance is enabled for\n hibernation.

\n

Default: false\n

" } } @@ -68985,8 +67529,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "HttpPutResponseHopLimit", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1

\n

Possible values: Integers from 1 to 64

", "smithy.api#xmlName": "httpPutResponseHopLimit" } @@ -69032,8 +67574,6 @@ "HttpPutResponseHopLimit": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1\n

\n

Possible values: Integers from 1 to 64

" } }, @@ -69118,8 +67658,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssociateCarrierIpAddress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to associate a Carrier IP address with eth0 for a new network\n interface.

\n

Use this option when you launch an instance in a Wavelength Zone and want to associate\n a Carrier IP address with the network interface. For more information about Carrier IP\n addresses, see Carrier IP addresses in the Wavelength Developer\n Guide.

", "smithy.api#xmlName": "associateCarrierIpAddress" } @@ -69128,8 +67666,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssociatePublicIpAddress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to associate a public IPv4 address with eth0 for a new network\n interface.

", "smithy.api#xmlName": "associatePublicIpAddress" } @@ -69138,8 +67674,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is\n terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -69156,8 +67690,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The device index for the network interface attachment.

", "smithy.api#xmlName": "deviceIndex" } @@ -69182,8 +67714,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses for the network interface.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -69224,8 +67754,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses for the network interface.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -69242,8 +67770,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -69260,8 +67786,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv4PrefixCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes that Amazon Web Services automatically assigned to the network\n interface.

", "smithy.api#xmlName": "ipv4PrefixCount" } @@ -69278,8 +67802,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6PrefixCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigned to the network\n interface.

", "smithy.api#xmlName": "ipv6PrefixCount" } @@ -69288,8 +67810,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PrimaryIpv6", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

", "smithy.api#xmlName": "primaryIpv6" } @@ -69314,24 +67834,18 @@ "AssociateCarrierIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Associates a Carrier IP address with eth0 for a new network interface.

\n

Use this option when you launch an instance in a Wavelength Zone and want to associate\n a Carrier IP address with the network interface. For more information about Carrier IP\n addresses, see Carrier IP addresses in the Wavelength Developer\n Guide.

" } }, "AssociatePublicIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Associates a public IPv4 address with eth0 for a new network interface.

" } }, "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is\n terminated.

" } }, @@ -69344,8 +67858,6 @@ "DeviceIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The device index for the network interface attachment.

" } }, @@ -69365,8 +67877,6 @@ "Ipv6AddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to assign to a network interface. Amazon EC2\n automatically selects the IPv6 addresses from the subnet range. You can't use this\n option if specifying specific IPv6 addresses.

" } }, @@ -69397,8 +67907,6 @@ "SecondaryPrivateIpAddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses to assign to a network\n interface.

" } }, @@ -69411,8 +67919,6 @@ "NetworkCardIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card. Some instance types support multiple network cards. The\n primary network interface must be assigned to network card index 0. The default is\n network card index 0.

" } }, @@ -69426,8 +67932,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes to be automatically assigned to the network interface. You\n cannot use this option if you use the Ipv4Prefix option.

" } }, @@ -69441,16 +67945,12 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes to be automatically assigned to the network interface. You\n cannot use this option if you use the Ipv6Prefix option.

" } }, "PrimaryIpv6": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" } } @@ -69574,8 +68074,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "WeightedCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type.

", "smithy.api#xmlName": "weightedCapacity" } @@ -69584,8 +68082,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Priority", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The priority for the launch template override. The highest priority is launched\n first.

\n

If OnDemandAllocationStrategy is set to prioritized, Spot Fleet\n uses priority to determine which launch template override to use first in fulfilling\n On-Demand capacity.

\n

If the Spot AllocationStrategy is set to\n capacityOptimizedPrioritized, Spot Fleet uses priority on a best-effort basis\n to determine which launch template override to use in fulfilling Spot capacity, but\n optimizes for capacity first.

\n

Valid values are whole numbers starting at 0. The lower the number, the\n higher the priority. If no number is set, the launch template override has the lowest\n priority. You can set the same priority for different launch template overrides.

", "smithy.api#xmlName": "priority" } @@ -69675,8 +68171,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PartitionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition the instance should launch in. Valid only if the placement\n group strategy is set to partition.

", "smithy.api#xmlName": "partitionNumber" } @@ -69742,8 +68236,6 @@ "PartitionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition the instance should launch in. Valid only if the placement\n group strategy is set to partition.

" } }, @@ -69773,8 +68265,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

", "smithy.api#xmlName": "enableResourceNameDnsARecord" } @@ -69783,8 +68273,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsAAAARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

", "smithy.api#xmlName": "enableResourceNameDnsAAAARecord" } @@ -69806,16 +68294,12 @@ "EnableResourceNameDnsARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

" } }, "EnableResourceNameDnsAAAARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

" } } @@ -69882,8 +68366,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "BlockDurationMinutes", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The required duration for the Spot Instances (also known as Spot blocks), in minutes.\n This value must be a multiple of 60 (60, 120, 180, 240, 300, or 360).

", "smithy.api#xmlName": "blockDurationMinutes" } @@ -69927,8 +68409,6 @@ "BlockDurationMinutes": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

" } }, @@ -69988,7 +68468,7 @@ "ResourceType": { "target": "com.amazonaws.ec2#ResourceType", "traits": { - "smithy.api#documentation": "

The type of resource to tag.

\n

The Valid Values are all the resource types that can be tagged. However,\n when creating a launch template, you can specify tags for the following resource types\n only: instance | volume | elastic-gpu |\n network-interface | spot-instances-request\n

\n

To tag a resource after it has been created, see CreateTags.

" + "smithy.api#documentation": "

The type of resource to tag.

\n

Valid Values lists all resource types for Amazon EC2 that can be tagged. When\n you create a launch template, you can specify tags for the following resource types\n only: instance | volume | elastic-gpu |\n network-interface | spot-instances-request.\n If the instance does include the resource type that you specify, the instance \n launch fails. For example, not all instance types include an Elastic GPU.

\n

To tag a resource after it has been created, see CreateTags.

" } }, "Tags": { @@ -70035,8 +68515,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "VersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number.

", "smithy.api#xmlName": "versionNumber" } @@ -70069,8 +68547,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultVersion", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the version is the default version.

", "smithy.api#xmlName": "defaultVersion" } @@ -70104,8 +68580,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\n enabled.

", "smithy.api#xmlName": "enabled" } @@ -70121,8 +68595,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true to enable detailed monitoring. Otherwise, basic monitoring\n is enabled.

" } } @@ -70231,8 +68703,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -70317,8 +68787,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -70581,7 +69049,6 @@ "com.amazonaws.ec2#LocalGatewayMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -71081,8 +69548,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Vlan", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ID of the VLAN.

", "smithy.api#xmlName": "vlan" } @@ -71107,8 +69572,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "LocalBgpAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Border Gateway Protocol (BGP) Autonomous System Number (ASN) of the local gateway.

", "smithy.api#xmlName": "localBgpAsn" } @@ -71117,8 +69580,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PeerBgpAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The peer BGP ASN.

", "smithy.api#xmlName": "peerBgpAsn" } @@ -71339,10 +69800,7 @@ } }, "com.amazonaws.ec2#Long": { - "type": "long", - "traits": { - "smithy.api#default": 0 - } + "type": "long" }, "com.amazonaws.ec2#MaintenanceDetails": { "type": "structure", @@ -71431,8 +69889,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxEntries", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of entries for the prefix list.

", "smithy.api#xmlName": "maxEntries" } @@ -71441,8 +69897,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Version", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version of the prefix list.

", "smithy.api#xmlName": "version" } @@ -71503,7 +69957,6 @@ "com.amazonaws.ec2#MaxResultsParam": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 100 @@ -71549,8 +70002,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory per vCPU, in GiB. If this parameter is not specified, there is\n no minimum limit.

", "smithy.api#xmlName": "min" } @@ -71559,8 +70010,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory per vCPU, in GiB. If this parameter is not specified, there is\n no maximum limit.

", "smithy.api#xmlName": "max" } @@ -71576,16 +70025,12 @@ "Min": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory per vCPU, in GiB. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory per vCPU, in GiB. To specify no maximum limit, omit this\n parameter.

" } } @@ -71617,8 +70062,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory, in MiB. If this parameter is not specified, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -71627,8 +70070,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory, in MiB. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -71645,7 +70086,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory, in MiB. To specify no minimum limit, specify\n 0.

", "smithy.api#required": {} } @@ -71653,8 +70093,6 @@ "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory, in MiB. To specify no maximum limit, omit this\n parameter.

" } } @@ -71689,8 +70127,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#xmlName": "value" } }, @@ -71762,8 +70198,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71822,8 +70256,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71839,8 +70271,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -71905,8 +70335,6 @@ "TotalTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units to be reserved by the Capacity Reservation Fleet. This value, \n\t\t\ttogether with the instance type weights that you assign to each instance type used by the Fleet \n\t\t\tdetermine the number of instances for which the Fleet reserves capacity. Both values are based on \n\t\t\tunits that make sense for your workload. For more information, see Total target capacity \n\t\t\tin the Amazon EC2 User Guide.

" } }, @@ -71919,16 +70347,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, "RemoveEndDate": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to remove the end date from the Capacity Reservation Fleet. If you remove the \n\t\t\tend date, the Capacity Reservation Fleet does not expire and it remains active until you explicitly \n\t\t\tcancel it using the CancelCapacityReservationFleet action.

\n

You can't specify RemoveEndDate and \n\t\t\tEndDate in the same request.

" } } @@ -71944,8 +70368,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -71969,8 +70391,6 @@ "InstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances for which to reserve capacity. The number of instances can't be increased or \n\t\t \tdecreased by more than 1000 in a single request.

" } }, @@ -71989,16 +70409,12 @@ "Accept": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Reserved. Capacity Reservations you have created are accepted by default.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -72020,8 +70436,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -72075,8 +70489,6 @@ "VpnPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port number to assign to the Client VPN endpoint for TCP and UDP traffic.

\n

Valid Values: 443 | 1194\n

\n

Default Value: 443\n

" } }, @@ -72089,16 +70501,12 @@ "SplitTunnel": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPN is split-tunnel.

\n

For information about split-tunnel VPN endpoints, see Split-tunnel Client VPN endpoint in the \n \tClient VPN Administrator Guide.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -72130,8 +70538,6 @@ "SessionTimeoutHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum VPN session duration time in hours.

\n

Valid values: 8 | 10 | 12 | 24\n

\n

Default value: 24\n

" } }, @@ -72153,8 +70559,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -72182,8 +70586,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72250,8 +70652,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -72294,8 +70694,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72344,8 +70742,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If the request succeeds, the response returns true. If the request fails,\n no response is returned, and instead an error message is returned.

", "smithy.api#xmlName": "return" } @@ -72373,8 +70769,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72571,7 +70965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicate whether the resource should use longer IDs (17-character IDs).

", "smithy.api#required": {} } @@ -72621,7 +71014,6 @@ "traits": { "aws.protocols#ec2QueryName": "UseLongIds", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the resource should use longer IDs (17-character IDs)

", "smithy.api#required": {}, "smithy.api#xmlName": "useLongIds" @@ -72727,8 +71119,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -72821,8 +71211,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -72961,8 +71349,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -72978,8 +71364,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -73007,8 +71391,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73074,8 +71456,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73142,8 +71522,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73227,8 +71605,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -73293,8 +71669,6 @@ "HttpPutResponseHopLimit": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel. If no parameter is specified,\n the existing state is maintained.

\n

Possible values: Integers from 1 to 64

" } }, @@ -73307,8 +71681,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -73411,8 +71783,6 @@ "PartitionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition in which to place the instance. Valid only if the\n placement group strategy is set to partition.

" } }, @@ -73440,8 +71810,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -73481,8 +71849,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73503,40 +71869,30 @@ "AutoImport": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, IPAM will continuously look for resources within the CIDR range of this pool \n and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\n these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \n a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \n marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \n discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\n

\n

A locale must be set on the pool for this feature to work.

" } }, "AllocationMinNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. Possible \n netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128. The minimum netmask \n length must be less than the maximum netmask length.

" } }, "AllocationMaxNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. Possible \n netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.The maximum netmask \n length must be greater than the minimum netmask length.

" } }, "AllocationDefaultNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, new allocations will default to 10.0.0.0/16.

" } }, "ClearAllocationDefaultNetmaskLength": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Clear the default netmask length allocation rule for this pool.

" } }, @@ -73581,8 +71937,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73637,8 +71991,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73684,7 +72036,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if the resource is monitored by IPAM. If a resource is monitored, the resource is discovered by IPAM and you can view details about the resource’s CIDR.

", "smithy.api#required": {} } @@ -73728,8 +72079,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73816,8 +72165,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73894,8 +72241,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -73989,8 +72334,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -74039,8 +72382,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -74055,8 +72396,6 @@ "CurrentVersion": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The current version of the prefix list.

" } }, @@ -74083,8 +72422,6 @@ "MaxEntries": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of entries for the prefix list. You cannot modify the entries \n of a prefix list and modify the size of a prefix list at the same time.

\n

If any of the resources that reference the prefix list cannot support the new\n maximum size, the modify operation fails. Check the state message for the IDs of \n the first ten resources that do not support the new maximum size.

" } } @@ -74157,8 +72494,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -74197,8 +72532,6 @@ "EnablePrimaryIpv6": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you’re modifying a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use\n this option if the instance that this ENI will be attached to relies on its IPv6 address\n not changing. Amazon Web Services will automatically assign an IPv6 address associated\n with the ENI attached to your instance to be the primary IPv6 address. Once you enable\n an IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" } } @@ -74226,8 +72559,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -74248,16 +72579,12 @@ "EnableResourceNameDnsARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

" } }, "EnableResourceNameDnsAAAARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

" } } @@ -74273,8 +72600,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an\n error.

", "smithy.api#xmlName": "return" } @@ -74383,8 +72708,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -74400,8 +72723,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -74485,8 +72806,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -74528,8 +72847,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -74619,8 +72936,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the fleet.

", "smithy.api#xmlName": "targetCapacity" } @@ -74628,8 +72943,6 @@ "OnDemandTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand Instances in the fleet.

" } }, @@ -74652,8 +72965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If the request succeeds, the response returns true. If the request fails,\n no response is returned, and instead an error message is returned.

", "smithy.api#xmlName": "return" } @@ -74752,8 +73063,6 @@ "EnableLniAtDeviceIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

\n Indicates the device position for local network interfaces in this subnet. For example, \n 1 indicates local network interfaces in this subnet are the secondary \n network interface (eth1). A local network interface cannot be the primary network\n interface (eth0).\n

" } }, @@ -74808,8 +73117,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -74866,8 +73173,6 @@ "RuleNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given\n direction. The rules are processed in ascending order by rule number.

" } }, @@ -74892,8 +73197,6 @@ "Protocol": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The protocol, for example TCP, to assign to the Traffic Mirror rule.

" } }, @@ -74925,8 +73228,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -74989,24 +73290,18 @@ "PacketLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

\n

For sessions with Network Load Balancer (NLB) traffic mirror targets, the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.

\n

Valid values are 1-32766.

" } }, "VirtualNetworkId": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The virtual network ID of the Traffic Mirror session.

" } }, @@ -75026,8 +73321,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -75124,8 +73417,6 @@ "AmazonSideAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \n The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs.

\n

The modify ASN operation is not allowed on a transit gateway with active BGP sessions. You must first delete all transit gateway attachments that have BGP configured prior to modifying the ASN on the transit gateway.

" } } @@ -75174,16 +73465,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to drop traffic that matches this route.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -75234,8 +73521,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -75304,8 +73589,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -75380,8 +73663,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } } @@ -75409,8 +73690,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } } @@ -75445,10 +73724,7 @@ "PolicyEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

The status of the Verified Access policy.

", - "smithy.api#required": {} + "smithy.api#documentation": "

The status of the Verified Access policy.

" } }, "PolicyDocument": { @@ -75467,10 +73743,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -75484,8 +73764,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -75497,6 +73775,14 @@ "smithy.api#documentation": "

The Verified Access policy document.

", "smithy.api#xmlName": "policyDocument" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -75548,8 +73834,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -75621,10 +73905,7 @@ "PolicyEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

The status of the Verified Access policy.

", - "smithy.api#required": {} + "smithy.api#documentation": "

The status of the Verified Access policy.

" } }, "PolicyDocument": { @@ -75643,10 +73924,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -75660,8 +73945,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -75673,6 +73956,14 @@ "smithy.api#documentation": "

The Verified Access policy document.

", "smithy.api#xmlName": "policyDocument" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -75712,8 +74003,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -75784,8 +74073,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -75837,8 +74124,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -75958,8 +74243,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -75969,6 +74252,12 @@ "smithy.api#documentation": "

A unique, case-sensitive token that you provide to ensure idempotency of your\n modification request. For more information, see Ensuring Idempotency.

", "smithy.api#idempotencyToken": {} } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -76050,8 +74339,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -76067,8 +74354,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76083,8 +74368,6 @@ "Size": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target size of the volume, in GiB. The target volume size must be greater than or\n equal to the existing size of the volume.

\n

The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3: 1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
\n

Default: The existing size is retained.

" } }, @@ -76097,24 +74380,18 @@ "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target IOPS rate of the volume. This parameter is valid only for gp3, io1, and io2 volumes.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

Default: The existing value is retained if you keep the same volume type. If you change\n the volume type to io1, io2, or gp3, the default is 3,000.

" } }, "Throughput": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target throughput of the volume, in MiB/s. This parameter is valid only for gp3 volumes. \n The maximum value is 1,000.

\n

Default: The existing value is retained if the source and target volume type is gp3.\n Otherwise, the default value is 125.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

" } }, "MultiAttachEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to enable Amazon EBS Multi-Attach. If you enable Multi-Attach, you can attach the \n\t\tvolume to up to 16 \n\t\t\tNitro-based instances in the same Availability Zone. This parameter is \n\t\tsupported with io1 and io2 volumes only. For more information, see \n\t\t\n\t\t\tAmazon EBS Multi-Attach in the Amazon Elastic Compute Cloud User Guide.

" } } @@ -76229,8 +74506,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76266,8 +74541,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -76283,8 +74556,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76299,8 +74570,6 @@ "ResetPolicy": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Gateway endpoint) Specify true to reset the policy document to the\n default policy. The default policy allows full access to the service.

" } }, @@ -76367,8 +74636,6 @@ "PrivateDnsEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the VPC.

" } }, @@ -76391,8 +74658,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -76420,8 +74685,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76442,16 +74705,12 @@ "RemovePrivateDnsName": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint configuration) Removes the private DNS name of the endpoint service.

" } }, "AcceptanceRequired": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether requests to create an endpoint to your service must be accepted.

" } }, @@ -76509,8 +74768,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -76538,8 +74795,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76571,8 +74826,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -76600,8 +74853,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76645,8 +74896,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -76680,8 +74929,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -76762,8 +75009,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -76779,8 +75024,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an\n error.

", "smithy.api#xmlName": "return" } @@ -76852,8 +75095,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -76910,8 +75151,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -76970,8 +75209,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -77038,16 +75275,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, "SkipTunnelReplacement": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Choose whether or not to trigger immediate tunnel replacement.

\n

Valid values: True | False\n

" } } @@ -77096,48 +75329,36 @@ "Phase1LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 1 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 28,800.

\n

Default: 28800\n

" } }, "Phase2LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 2 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 3,600. The value must be less than the value for\n Phase1LifetimeSeconds.

\n

Default: 3600\n

" } }, "RekeyMarginTimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The margin time, in seconds, before the phase 2 lifetime expires, during which the\n Amazon Web Services side of the VPN connection performs an IKE rekey. The exact time\n of the rekey is randomly selected based on the value for\n RekeyFuzzPercentage.

\n

Constraints: A value between 60 and half of Phase2LifetimeSeconds.

\n

Default: 540\n

" } }, "RekeyFuzzPercentage": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The percentage of the rekey window (determined by RekeyMarginTimeSeconds)\n during which the rekey time is randomly selected.

\n

Constraints: A value between 0 and 100.

\n

Default: 100\n

" } }, "ReplayWindowSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of packets in an IKE replay window.

\n

Constraints: A value between 64 and 2048.

\n

Default: 1024\n

" } }, "DPDTimeoutSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of seconds after which a DPD timeout occurs.

\n

Constraints: A value greater than or equal to 30.

\n

Default: 30\n

" } }, @@ -77211,8 +75432,6 @@ "EnableTunnelLifecycleControl": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Turn on or off tunnel endpoint lifecycle control feature.

" } } @@ -77250,8 +75469,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -77353,8 +75570,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -77416,8 +75631,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -77684,8 +75897,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPrimary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the IP address is the primary address.

", "smithy.api#xmlName": "isPrimary" } @@ -77843,8 +76054,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Default", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default network ACL for the VPC.

", "smithy.api#xmlName": "default" } @@ -77945,8 +76154,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Egress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the rule is an egress rule (applied to traffic leaving the subnet).

", "smithy.api#xmlName": "egress" } @@ -77995,8 +76202,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RuleNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number for the entry. ACL entries are processed in ascending order by rule number.

", "smithy.api#xmlName": "ruleNumber" } @@ -78043,8 +76248,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -78053,8 +76256,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -78070,16 +76271,12 @@ "Min": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of network bandwidth, in Gbps. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of network bandwidth, in Gbps. To specify no maximum limit, omit this\n parameter.

" } } @@ -78387,8 +76584,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AnalyzedEniCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of network interfaces analyzed.

", "smithy.api#xmlName": "analyzedEniCount" } @@ -78559,8 +76754,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "NetworkPathFound", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the destination is reachable from the source.

", "smithy.api#xmlName": "networkPathFound" } @@ -78642,7 +76835,6 @@ "com.amazonaws.ec2#NetworkInsightsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -78736,8 +76928,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DestinationPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The destination port.

", "smithy.api#xmlName": "destinationPort" } @@ -78938,8 +77128,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "RequesterManaged", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is being managed by Amazon Web Services.

", "smithy.api#xmlName": "requesterManaged" } @@ -78948,8 +77136,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SourceDestCheck", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether source/destination checking is enabled.

", "smithy.api#xmlName": "sourceDestCheck" } @@ -78990,8 +77176,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DenyAllIgwTraffic", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a network interface with an IPv6 address is unreachable from the \n public internet. If the value is true, inbound traffic from the internet \n is dropped and you cannot assign an elastic IP address to the network interface. The \n network interface is reachable from peered VPCs and resources connected through a \n transit gateway, including on-premises networks.

", "smithy.api#xmlName": "denyAllIgwTraffic" } @@ -79000,8 +77184,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Ipv6Native", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is an IPv6 only network interface.

", "smithy.api#xmlName": "ipv6Native" } @@ -79106,8 +77288,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -79116,8 +77296,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The device index of the network interface attachment on the instance.

", "smithy.api#xmlName": "deviceIndex" } @@ -79126,8 +77304,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -79184,8 +77360,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -79234,8 +77408,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of network interfaces. If this parameter is not specified, there is no\n minimum limit.

", "smithy.api#xmlName": "min" } @@ -79244,8 +77416,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of network interfaces. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -79261,16 +77431,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of network interfaces. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of network interfaces. To specify no maximum limit, omit this\n parameter.

" } } @@ -79338,8 +77504,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPrimaryIpv6", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information, see ModifyNetworkInterfaceAttribute.

", "smithy.api#xmlName": "isPrimaryIpv6" } @@ -79509,8 +77673,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Primary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this IPv4 address is the primary private IPv4 address of the network interface.

", "smithy.api#xmlName": "primary" } @@ -79970,8 +78132,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleInstanceType", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the\n fleet.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleInstanceType" } @@ -79980,8 +78140,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleAvailabilityZone", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleAvailabilityZone" } @@ -79990,8 +78148,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MinTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for On-Demand Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

", "smithy.api#xmlName": "minTargetCapacity" } @@ -80000,7 +78156,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "MaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

", + "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The maxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for maxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "maxTotalPrice" } } @@ -80027,31 +78183,25 @@ "SingleInstanceType": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the\n fleet.

\n

Supported only for fleets of type instant.

" } }, "SingleAvailabilityZone": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

" } }, "MinTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for On-Demand Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

" } }, "MaxTotalPrice": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

" + "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The MaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for MaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
" } } }, @@ -80272,8 +78422,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SequenceNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The sequence number.

", "smithy.api#xmlName": "sequenceNumber" } @@ -80660,8 +78808,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowDnsResolutionFromRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, the public DNS hostnames of instances in the specified VPC resolve to private\n IP addresses when queried from instances in the peer VPC.

", "smithy.api#xmlName": "allowDnsResolutionFromRemoteVpc" } @@ -80670,8 +78816,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } @@ -80680,8 +78824,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } @@ -80697,24 +78839,18 @@ "AllowDnsResolutionFromRemoteVpc": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses \n when queried from instances in the peer VPC.

" } }, "AllowEgressFromLocalClassicLinkToRemoteVpc": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Deprecated.

" } }, "AllowEgressFromLocalVpcToRemoteClassicLink": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Deprecated.

" } } @@ -80831,8 +78967,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

", "smithy.api#xmlName": "value" } @@ -80857,8 +78991,6 @@ "Value": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

" } } @@ -80979,8 +79111,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

", "smithy.api#xmlName": "value" } @@ -81005,8 +79135,6 @@ "Value": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

" } } @@ -81142,8 +79270,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PartitionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition that the instance is in. Valid only if the placement group\n strategy is set to partition.

\n

This parameter is not supported for CreateFleet.

", "smithy.api#xmlName": "partitionNumber" } @@ -81224,8 +79350,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PartitionCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of partitions. Valid only if strategy is\n set to partition.

", "smithy.api#xmlName": "partitionCount" } @@ -81458,7 +79582,6 @@ "com.amazonaws.ec2#PoolMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 10 @@ -81468,7 +79591,6 @@ "com.amazonaws.ec2#Port": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 65535 @@ -81482,8 +79604,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "From", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the range.

", "smithy.api#xmlName": "from" } @@ -81492,8 +79612,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "To", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the range.

", "smithy.api#xmlName": "to" } @@ -81655,7 +79773,6 @@ "com.amazonaws.ec2#PrefixListMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -81767,8 +79884,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Active", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The current price schedule, as determined by the term remaining for the Reserved Instance in the listing.

\n

A specific price schedule is always in effect, but only one price schedule can be active at any time. Take, for example, a Reserved Instance listing that has five months remaining in its term. When you specify price schedules for five months and two months, this means that schedule 1, covering the first three months of the remaining term, will be active during months 5, 4, and 3. Then schedule 2, covering the last two months of the term, will be active for months 2 and 1.

", "smithy.api#xmlName": "active" } @@ -81785,8 +79900,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Price", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The fixed price for the term.

", "smithy.api#xmlName": "price" } @@ -81795,8 +79908,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Term", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of months remaining in the reservation. For example, 2 is the second to the last month before the capacity reservation expires.

", "smithy.api#xmlName": "term" } @@ -81830,8 +79941,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Price", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The fixed price for the term.

", "smithy.api#xmlName": "price" } @@ -81840,8 +79949,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Term", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of months remaining in the reservation. For example, 2 is the second to the last month before the capacity reservation expires.

", "smithy.api#xmlName": "term" } @@ -81867,8 +79974,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of reservations available for the price.

", "smithy.api#xmlName": "count" } @@ -81877,8 +79982,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Price", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price per instance.

", "smithy.api#xmlName": "price" } @@ -81974,7 +80077,6 @@ "com.amazonaws.ec2#Priority": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": -1, "max": 65535 @@ -82061,8 +80163,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

", "smithy.api#xmlName": "enableResourceNameDnsARecord" } @@ -82071,8 +80171,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsAAAARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostname with DNS AAAA\n records.

", "smithy.api#xmlName": "enableResourceNameDnsAAAARecord" } @@ -82094,16 +80192,12 @@ "EnableResourceNameDnsARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

" } }, "EnableResourceNameDnsAAAARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

" } } @@ -82127,8 +80221,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

", "smithy.api#xmlName": "enableResourceNameDnsARecord" } @@ -82137,8 +80229,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsAAAARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

", "smithy.api#xmlName": "enableResourceNameDnsAAAARecord" } @@ -82160,7 +80250,6 @@ "com.amazonaws.ec2#PrivateIpAddressCount": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 31 @@ -82174,8 +80263,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Primary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the private IPv4 address is the primary private IPv4 address. Only\n one IPv4 address can be designated as primary.

", "smithy.api#xmlName": "primary" } @@ -82356,7 +80443,6 @@ "com.amazonaws.ec2#ProtocolInt": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 255 @@ -82424,8 +80510,6 @@ "PubliclyAdvertisable": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(IPv6 only) Indicate whether the address range will be publicly advertised to the\n internet.

\n

Default: true

" } }, @@ -82438,8 +80522,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -82453,8 +80535,6 @@ "MultiRegion": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Reserved.

" } } @@ -82497,8 +80577,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -82525,8 +80603,6 @@ "NetmaskLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you'd like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. Either \"NetmaskLength\" or \"Cidr\" is required.

" } }, @@ -82576,8 +80652,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -82601,7 +80675,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you would like to allocate to the public IPv4 pool.

", "smithy.api#required": {} } @@ -82758,8 +80831,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of addresses.

", "smithy.api#xmlName": "totalAddressCount" } @@ -82768,8 +80839,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalAvailableAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of available addresses.

", "smithy.api#xmlName": "totalAvailableAddressCount" } @@ -82827,8 +80896,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of addresses in the range.

", "smithy.api#xmlName": "addressCount" } @@ -82837,8 +80904,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of available addresses in the range.

", "smithy.api#xmlName": "availableAddressCount" } @@ -82881,8 +80946,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the reservation's term in seconds.

", "smithy.api#xmlName": "duration" } @@ -83056,7 +81119,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances.

", "smithy.api#required": {} } @@ -83107,7 +81169,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Reserved Instances to purchase.

", "smithy.api#required": {} } @@ -83124,8 +81185,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -83192,8 +81251,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -83328,8 +81385,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -83346,8 +81401,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Amount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of the recurring charge.

", "smithy.api#xmlName": "amount" } @@ -83543,8 +81596,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -83553,8 +81604,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Set to true to enable enhanced networking with ENA for the AMI and any instances that you launch from the AMI.

\n

This option is supported only for HVM AMIs. Specifying this option with a PV AMI can make instances launched from the AMI unreachable.

", "smithy.api#xmlName": "enaSupport" } @@ -83681,8 +81730,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -83721,8 +81768,6 @@ "IncludeAllTagsOfInstance": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to register all tag keys in the current Region. Specify true \n \tto register all tag keys.

" } }, @@ -83778,8 +81823,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -83844,8 +81887,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -83906,8 +81947,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -83958,8 +81997,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -84010,8 +82047,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -84054,8 +82089,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -84116,8 +82149,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84144,8 +82175,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -84194,15 +82223,13 @@ "NetworkBorderGroup": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services advertises\n IP addresses.

\n

If you provide an incorrect network border group, you receive an InvalidAddress.NotFound error.

\n

You cannot use a network border group with EC2 Classic. If you attempt this operation on EC2 classic, you \n receive an InvalidParameterCombination error.

" + "smithy.api#documentation": "

The set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services advertises\n IP addresses.

\n

If you provide an incorrect network border group, you receive an InvalidAddress.NotFound error.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84284,8 +82311,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -84325,8 +82350,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Success", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates if the release was successful.

", "smithy.api#xmlName": "success" } @@ -84484,8 +82507,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84566,8 +82587,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84577,7 +82596,6 @@ "traits": { "aws.protocols#ec2QueryName": "Egress", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to replace the egress rule.

\n

Default: If no value is specified, we replace the ingress rule.

", "smithy.api#required": {}, "smithy.api#xmlName": "egress" @@ -84641,7 +82659,6 @@ "traits": { "aws.protocols#ec2QueryName": "RuleNumber", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number of the entry to replace.

", "smithy.api#required": {}, "smithy.api#xmlName": "ruleNumber" @@ -84723,8 +82740,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteReplacedRootVolume", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the original root volume is to be deleted after the root volume \n replacement task completes.

", "smithy.api#xmlName": "deleteReplacedRootVolume" } @@ -84848,8 +82863,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84887,8 +82900,6 @@ "LocalTarget": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to reset the local route to its default target (local).

" } }, @@ -84997,8 +83008,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -85082,16 +83091,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether traffic matching this route is to be dropped.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -85150,16 +83155,12 @@ "ApplyPendingMaintenance": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Trigger pending tunnel endpoint maintenance.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -85175,8 +83176,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Confirmation of replace tunnel operation.

", "smithy.api#xmlName": "return" } @@ -85289,8 +83288,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -85369,16 +83366,12 @@ "FromPort": { "target": "com.amazonaws.ec2#Port", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the range.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Port", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the range.

" } } @@ -85458,8 +83451,6 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\n provides dedicated throughput to Amazon EBS and an optimized configuration stack to\n provide optimal Amazon EBS I/O performance. This optimization isn't available with all\n instance types. Additional usage charges apply when using an EBS-optimized\n instance.

" } }, @@ -85522,8 +83513,6 @@ "DisableApiTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you set this parameter to true, you can't terminate the instance using\n the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute after\n launch, use ModifyInstanceAttribute. Alternatively, if you set\n InstanceInitiatedShutdownBehavior to terminate, you can\n terminate the instance by running the shutdown command from the instance.

" } }, @@ -85556,7 +83545,7 @@ "ElasticInferenceAccelerators": { "target": "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorList", "traits": { - "smithy.api#documentation": "

The elastic inference accelerator for the instance.

", + "smithy.api#documentation": "

An elastic inference accelerator to associate with the instance. Elastic inference\n accelerators are a resource you can attach to your Amazon EC2 instances to accelerate\n your Deep Learning (DL) inference workloads.

\n

You cannot specify accelerators from different generations in the same request.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon\n Elastic Inference (EI), and will help current customers migrate their workloads to\n options that offer better price and performance. After April 15, 2023, new customers\n will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker,\n Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during\n the past 30-day period are considered current customers and will be able to continue\n using the service.

\n
", "smithy.api#xmlName": "ElasticInferenceAccelerator" } }, @@ -85644,8 +83633,6 @@ "DisableApiStop": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable the instance for stop protection. For more information,\n see Stop\n protection in the Amazon Elastic Compute Cloud User Guide.

" } } @@ -85705,8 +83692,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -85796,8 +83781,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "BlockDurationMinutes", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "blockDurationMinutes" } @@ -85814,8 +83797,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -85824,8 +83805,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of Spot Instances to launch.

\n

Default: 1

", "smithy.api#xmlName": "instanceCount" } @@ -85949,8 +83928,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -86149,8 +84126,6 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation Fleet supports EBS-optimized instances types. This \n\t\t\toptimization provides dedicated throughput to Amazon EBS and an optimized configuration stack \n\t\t\tto provide optimal I/O performance. This optimization isn't available with all instance types. Additional \n\t\t\tusage charges apply when using EBS-optimized instance types.

" } }, @@ -86260,8 +84235,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Amount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Used for Reserved Instance Marketplace offerings. Specifies the limit price on the total order (instanceCount * price).

", "smithy.api#xmlName": "amount" } @@ -86368,8 +84341,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the Reserved Instance, in seconds.

", "smithy.api#xmlName": "duration" } @@ -86386,8 +84357,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "FixedPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The purchase price of the Reserved Instance.

", "smithy.api#xmlName": "fixedPrice" } @@ -86396,8 +84365,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of reservations purchased.

", "smithy.api#xmlName": "instanceCount" } @@ -86446,8 +84413,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "UsagePrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The usage price of the Reserved Instance, per hour.

", "smithy.api#xmlName": "usagePrice" } @@ -86528,8 +84493,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of modified Reserved Instances.

\n \n

This is a required field for a request.

\n
", "smithy.api#xmlName": "instanceCount" } @@ -86855,8 +84818,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the Reserved Instance, in seconds.

", "smithy.api#xmlName": "duration" } @@ -86865,8 +84826,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "FixedPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The purchase price of the Reserved Instance.

", "smithy.api#xmlName": "fixedPrice" } @@ -86899,8 +84858,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "UsagePrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The usage price of the Reserved Instance, per hour.

", "smithy.api#xmlName": "usagePrice" } @@ -86925,8 +84882,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Marketplace", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the offering is available through the Reserved Instance Marketplace (resale) or Amazon Web Services. \n If it's a Reserved Instance Marketplace offering, this is true.

", "smithy.api#xmlName": "marketplace" } @@ -87037,8 +84992,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -87081,8 +85034,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -87136,8 +85087,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -87167,8 +85116,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -87235,8 +85182,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -87287,8 +85232,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -87327,8 +85270,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -87403,8 +85344,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -88062,8 +86001,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O.

", "smithy.api#xmlName": "ebsOptimized" } @@ -88144,8 +86081,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DisableApiTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If set to true, indicates that the instance cannot be terminated using\n the Amazon EC2 console, command line tool, or API.

", "smithy.api#xmlName": "disableApiTermination" } @@ -88186,7 +86121,7 @@ "target": "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorResponseList", "traits": { "aws.protocols#ec2QueryName": "ElasticInferenceAcceleratorSet", - "smithy.api#documentation": "

The elastic inference accelerator for the instance.

", + "smithy.api#documentation": "

An elastic inference accelerator to associate with the instance. Elastic inference\n accelerators are a resource you can attach to your Amazon EC2 instances to accelerate\n your Deep Learning (DL) inference workloads.

\n

You cannot specify accelerators from different generations in the same request.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon\n Elastic Inference (EI), and will help current customers migrate their workloads to\n options that offer better price and performance. After April 15, 2023, new customers\n will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker,\n Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during\n the past 30-day period are considered current customers and will be able to continue\n using the service.

\n
", "smithy.api#xmlName": "elasticInferenceAcceleratorSet" } }, @@ -88298,8 +86233,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DisableApiStop", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is enabled for stop protection. For more information,\n see Stop\n protection in the Amazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "disableApiStop" } @@ -88334,8 +86267,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -88405,8 +86336,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -88422,8 +86351,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -88451,8 +86378,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -88468,7 +86393,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version to restore.

", "smithy.api#required": {} } @@ -88477,7 +86401,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The current version number for the prefix list.

", "smithy.api#required": {} } @@ -88529,8 +86452,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -88570,8 +86491,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -88620,8 +86539,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } @@ -88671,16 +86588,12 @@ "PermanentRestore": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to permanently restore an archived snapshot. To permanently restore \n an archived snapshot, specify true and omit the \n RestoreSnapshotTierRequest$TemporaryRestoreDays parameter.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -88715,8 +86628,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RestoreDuration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

For temporary restores only. The number of days for which the archived snapshot \n is temporarily restored.

", "smithy.api#xmlName": "restoreDuration" } @@ -88725,8 +86636,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPermanentRestore", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is permanently restored. true indicates a permanent \n restore. false indicates a temporary restore.

", "smithy.api#xmlName": "isPermanentRestore" } @@ -88739,7 +86648,6 @@ "com.amazonaws.ec2#ResultRange": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 20, "max": 500 @@ -88786,16 +86694,12 @@ "RevokeAllGroups": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether access should be revoked for all clients.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -88839,8 +86743,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -88882,8 +86784,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "fromPort" } @@ -88900,8 +86800,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "toPort" } @@ -88934,8 +86832,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -88962,7 +86858,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

" + "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values,\n no error is returned, and the output describes the security group rules that were not\n revoked.

\n

For a non-default VPC, if the values you specify do not match the existing rule's\n values, an InvalidPermission.NotFound client error is returned, and no\n rules are revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupIngressRequest": { @@ -88977,8 +86873,6 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP, this is the type number. A value of -1 indicates all ICMP types.

" } }, @@ -89021,8 +86915,6 @@ "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP, this is the code. A value of -1 indicates all ICMP codes.

" } }, @@ -89030,8 +86922,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -89055,8 +86945,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -89362,8 +87250,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Main", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the main route table.

", "smithy.api#xmlName": "main" } @@ -89678,7 +87564,6 @@ "traits": { "aws.protocols#ec2QueryName": "Enabled", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\n enabled.

", "smithy.api#required": {}, "smithy.api#xmlName": "enabled" @@ -89714,8 +87599,6 @@ "Ipv6AddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to associate with the primary network\n interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet. You\n cannot specify this option and the option to assign specific IPv6 addresses in the same\n request. You can specify this option if you've specified a minimum number of instances\n to launch.

\n

You cannot specify this option and the network interfaces option in the same\n request.

" } }, @@ -89742,7 +87625,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances to launch. If you specify more instances than Amazon\n EC2 can launch in the target Availability Zone, Amazon EC2 launches the largest possible\n number of instances above MinCount.

\n

Constraints: Between 1 and the maximum number you're allowed for the specified\n instance type. For more information about the default limits, and how to request an\n increase, see How many instances can I\n run in Amazon EC2 in the Amazon EC2 FAQ.

", "smithy.api#required": {} } @@ -89751,7 +87633,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of instances to launch. If you specify a minimum that is more\n instances than Amazon EC2 can launch in the target Availability Zone, Amazon EC2\n launches no instances.

\n

Constraints: Between 1 and the maximum number you're allowed for the specified\n instance type. For more information about the default limits, and how to request an\n increase, see How many instances can I\n run in Amazon EC2 in the Amazon EC2 General FAQ.

", "smithy.api#required": {} } @@ -89821,8 +87702,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DisableApiTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you set this parameter to true, you can't terminate the instance using\n the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute after\n launch, use ModifyInstanceAttribute. Alternatively, if you set\n InstanceInitiatedShutdownBehavior to terminate, you can\n terminate the instance by running the shutdown command from the instance.

\n

Default: false\n

", "smithy.api#xmlName": "disableApiTermination" } @@ -89831,8 +87710,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -89841,8 +87718,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\n provides dedicated throughput to Amazon EBS and an optimized configuration stack to\n provide optimal Amazon EBS I/O performance. This optimization isn't available with all\n instance types. Additional usage charges apply when using an EBS-optimized\n instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -89969,16 +87844,12 @@ "DisableApiStop": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether an instance is enabled for stop protection. For more information,\n see Stop\n protection.

" } }, "EnablePrimaryIpv6": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you’re launching an instance into a dual-stack or IPv6-only subnet, you can enable\n assigning a primary IPv6 address. A primary IPv6 address is an IPv6 GUA address\n associated with an ENI that you have enabled to use a primary IPv6 address. Use this\n option if an instance relies on its IPv6 address not changing. When you launch the\n instance, Amazon Web Services will automatically assign an IPv6 address associated with\n the ENI attached to your instance to be the primary IPv6 address. Once you enable an\n IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" } } @@ -90018,16 +87889,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "InstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances.

\n

Default: 1

" } }, @@ -90205,8 +88072,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances.

", "smithy.api#xmlName": "instanceCount" } @@ -90271,8 +88136,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SlotDurationInHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of hours in the schedule.

", "smithy.api#xmlName": "slotDurationInHours" } @@ -90297,8 +88160,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalScheduledInstanceHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of hours for a single instance for the entire term.

", "smithy.api#xmlName": "totalScheduledInstanceHours" } @@ -90323,8 +88184,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of available instances.

", "smithy.api#xmlName": "availableInstanceCount" } @@ -90357,8 +88216,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxTermDurationInDays", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum term. The only possible value is 365 days.

", "smithy.api#xmlName": "maxTermDurationInDays" } @@ -90367,8 +88224,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MinTermDurationInDays", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum term. The only possible value is 365 days.

", "smithy.api#xmlName": "minTermDurationInDays" } @@ -90409,8 +88264,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SlotDurationInHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of hours in the schedule.

", "smithy.api#xmlName": "slotDurationInHours" } @@ -90419,8 +88272,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalScheduledInstanceHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of hours for a single instance for the entire term.

", "smithy.api#xmlName": "totalScheduledInstanceHours" } @@ -90466,8 +88317,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Interval", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The interval quantity. The interval unit depends on the value of frequency. For example, every 2\n weeks or every 2 months.

", "smithy.api#xmlName": "interval" } @@ -90484,8 +88333,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "OccurrenceRelativeToEnd", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the occurrence is relative to the end of the specified week or month.

", "smithy.api#xmlName": "occurrenceRelativeToEnd" } @@ -90515,8 +88362,6 @@ "Interval": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The interval quantity. The interval unit depends on the value of Frequency. For example, every 2 \n weeks or every 2 months.

" } }, @@ -90530,8 +88375,6 @@ "OccurrenceRelativeToEnd": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the occurrence is relative to the end of the specified week or month. You can't specify this value with a daily schedule.

" } }, @@ -90602,24 +88445,18 @@ "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is deleted on instance termination.

" } }, "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is encrypted. You can attached encrypted volumes only to instances that support them.

" } }, "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS) to provision for an io1 or io2 volume, with a maximum\n \t\tratio of 50 IOPS/GiB for io1, and 500 IOPS/GiB for io2. Range is 100 to 64,000 IOPS for\n \t\tvolumes in most Regions. Maximum IOPS of 64,000 is guaranteed only on\n \t\tinstances built on the Nitro System. Other instance families guarantee performance up to\n \t\t32,000 IOPS. For more information, see Amazon EBS volume types in the\n \t\tAmazon EC2 User Guide.

\n

This parameter is valid only for Provisioned IOPS SSD (io1 and io2) volumes.

" } }, @@ -90632,8 +88469,6 @@ "VolumeSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

\n

Default: If you're creating the volume from a snapshot and don't specify a volume size, the default is the snapshot size.

" } }, @@ -90704,8 +88539,6 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS-optimized instance.

\n

Default: false\n

" } }, @@ -90797,8 +88630,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether monitoring is enabled.

" } } @@ -90813,16 +88644,12 @@ "AssociatePublicIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to assign a public IPv4 address to instances launched in a VPC. The\n public IPv4 address can only be assigned to a network interface for eth0, and can only be\n assigned to a new network interface, not an existing one. You cannot specify more than one\n network interface in the request. If launching into a default subnet, the default value is\n true.

" } }, "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to delete the interface when the instance is terminated.

" } }, @@ -90835,8 +88662,6 @@ "DeviceIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the device for the network interface attachment.

" } }, @@ -90850,8 +88675,6 @@ "Ipv6AddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to assign to the network interface. The IPv6 addresses are automatically selected from the subnet range.

" } }, @@ -90884,8 +88707,6 @@ "SecondaryPrivateIpAddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses.

" } }, @@ -90935,8 +88756,6 @@ "Primary": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is a primary IPv4 address. Otherwise, this is a secondary IPv4 address.

" } }, @@ -91011,8 +88830,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -91084,8 +88901,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -91098,8 +88913,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -91167,16 +88980,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of routes to return.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -91200,8 +89009,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AdditionalRoutesAvailable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether there are additional routes available.

", "smithy.api#xmlName": "additionalRoutesAvailable" } @@ -91283,6 +89090,71 @@ "smithy.api#documentation": "

Describes a security group.

" } }, + "com.amazonaws.ec2#SecurityGroupForVpc": { + "type": "structure", + "members": { + "Description": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "Description", + "smithy.api#documentation": "

The security group's description.

", + "smithy.api#xmlName": "description" + } + }, + "GroupName": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "GroupName", + "smithy.api#documentation": "

The security group name.

", + "smithy.api#xmlName": "groupName" + } + }, + "OwnerId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "OwnerId", + "smithy.api#documentation": "

The security group owner ID.

", + "smithy.api#xmlName": "ownerId" + } + }, + "GroupId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "GroupId", + "smithy.api#documentation": "

The security group ID.

", + "smithy.api#xmlName": "groupId" + } + }, + "Tags": { + "target": "com.amazonaws.ec2#TagList", + "traits": { + "aws.protocols#ec2QueryName": "TagSet", + "smithy.api#documentation": "

The security group tags.

", + "smithy.api#xmlName": "tagSet" + } + }, + "PrimaryVpcId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "PrimaryVpcId", + "smithy.api#documentation": "

The VPC ID in which the security group was created.

", + "smithy.api#xmlName": "primaryVpcId" + } + } + }, + "traits": { + "smithy.api#documentation": "

A security group that can be used by interfaces in the VPC.

" + } + }, + "com.amazonaws.ec2#SecurityGroupForVpcList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#SecurityGroupForVpc", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#SecurityGroupId": { "type": "string" }, @@ -91436,8 +89308,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsEgress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the security group rule is an outbound rule.

", "smithy.api#xmlName": "isEgress" } @@ -91454,8 +89324,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "fromPort" } @@ -91464,8 +89332,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 codes. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "toPort" } @@ -91585,16 +89451,12 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

" } }, @@ -91716,8 +89578,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -91785,8 +89645,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AcceptanceRequired", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether requests from other Amazon Web Services accounts to create an endpoint to the service must first be accepted.

", "smithy.api#xmlName": "acceptanceRequired" } @@ -91795,8 +89653,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ManagesVpcEndpoints", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the service manages its VPC endpoints. Management of the service VPC\n endpoints using the VPC endpoint API is restricted.

", "smithy.api#xmlName": "managesVpcEndpoints" } @@ -91967,8 +89823,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "VpcEndpointPolicySupported", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the service supports endpoint policies.

", "smithy.api#xmlName": "vpcEndpointPolicySupported" } @@ -91977,8 +89831,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AcceptanceRequired", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether VPC endpoint connection requests to the service must be accepted by the service owner.

", "smithy.api#xmlName": "acceptanceRequired" } @@ -91987,8 +89839,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ManagesVpcEndpoints", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the service manages its VPC endpoints. Management of the service VPC\n endpoints using the VPC endpoint API is restricted.

", "smithy.api#xmlName": "managesVpcEndpoints" } @@ -92206,8 +90056,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -92280,8 +90128,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } @@ -92379,8 +90225,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "DiskImageSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk in the snapshot, in GiB.

", "smithy.api#xmlName": "diskImageSize" } @@ -92522,8 +90366,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -92548,8 +90390,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Size of the volume from which this snapshot was created.

", "smithy.api#xmlName": "volumeSize" } @@ -92732,8 +90572,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "DiskImageSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk in the snapshot, in GiB.

", "smithy.api#xmlName": "diskImageSize" } @@ -92742,8 +90580,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -92880,8 +90716,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "LastTieringProgress", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The progress of the last archive or restore process, as a percentage.

", "smithy.api#xmlName": "lastTieringProgress" } @@ -92973,8 +90807,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TerminationDelay", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\n Instance after launching a new replacement Spot Instance.

\n

Required when ReplacementStrategy is set to launch-before-terminate.

\n

Not valid when ReplacementStrategy is set to launch.

\n

Valid values: Minimum value of 120 seconds. Maximum value of 7200 seconds.

", "smithy.api#xmlName": "terminationDelay" } @@ -93063,8 +90895,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -93169,8 +90999,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "WeightedCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type. These are the same units that you chose to set the target capacity in terms of instances, or a performance characteristic such as vCPUs, memory, or I/O.

\n

If the target capacity divided by this value is not a whole number, Amazon EC2 rounds the number of instances to the next whole number. If this value is not specified, the default is 1.

", "smithy.api#xmlName": "weightedCapacity" } @@ -93203,8 +91031,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enables monitoring for the instance.

\n

Default: false\n

", "smithy.api#xmlName": "enabled" } @@ -93317,8 +91143,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units fulfilled by this request compared to the set target capacity. You\n cannot set this value.

", "smithy.api#xmlName": "fulfilledCapacity" } @@ -93327,8 +91151,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "OnDemandFulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units fulfilled by this request compared to the set target\n On-Demand capacity.

", "smithy.api#xmlName": "onDemandFulfilledCapacity" } @@ -93372,7 +91194,6 @@ "traits": { "aws.protocols#ec2QueryName": "TargetCapacity", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units to request for the Spot Fleet. You can choose to set the target\n capacity in terms of instances or a performance characteristic that is important to your\n application workload, such as vCPUs, memory, or I/O. If the request type is\n maintain, you can specify a target capacity of 0 and add capacity\n later.

", "smithy.api#required": {}, "smithy.api#xmlName": "targetCapacity" @@ -93382,8 +91203,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OnDemandTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units to request. You can choose to set the target capacity in\n terms of instances or a performance characteristic that is important to your application\n workload, such as vCPUs, memory, or I/O. If the request type is maintain,\n you can specify a target capacity of 0 and add capacity later.

", "smithy.api#xmlName": "onDemandTargetCapacity" } @@ -93392,7 +91211,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "OnDemandMaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay. You\n can use the onDemandMaxTotalPrice parameter, the\n spotMaxTotalPrice parameter, or both parameters to ensure that your\n fleet cost does not exceed your budget. If you set a maximum price per hour for the\n On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the\n maximum amount you're willing to pay. When the maximum amount you're willing to pay is\n reached, the fleet stops launching instances even if it hasn’t met the target\n capacity.

", + "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay. You\n can use the onDemandMaxTotalPrice parameter, the\n spotMaxTotalPrice parameter, or both parameters to ensure that your\n fleet cost does not exceed your budget. If you set a maximum price per hour for the\n On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the\n maximum amount you're willing to pay. When the maximum amount you're willing to pay is\n reached, the fleet stops launching instances even if it hasn’t met the target\n capacity.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The onDemandMaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for onDemandMaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "onDemandMaxTotalPrice" } }, @@ -93400,7 +91219,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "SpotMaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. You can use\n the spotdMaxTotalPrice parameter, the onDemandMaxTotalPrice\n parameter, or both parameters to ensure that your fleet cost does not exceed your\n budget. If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request,\n Spot Fleet will launch instances until it reaches the maximum amount you're willing to pay.\n When the maximum amount you're willing to pay is reached, the fleet stops launching\n instances even if it hasn’t met the target capacity.

", + "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. You can use\n the spotMaxTotalPrice parameter, the onDemandMaxTotalPrice\n parameter, or both parameters to ensure that your fleet cost does not exceed your budget.\n If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request, Spot Fleet will\n launch instances until it reaches the maximum amount you're willing to pay. When the\n maximum amount you're willing to pay is reached, the fleet stops launching instances even\n if it hasn’t met the target capacity.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The spotMaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for spotMaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "spotMaxTotalPrice" } }, @@ -93408,8 +91227,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "TerminateInstancesWithExpiration", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether running Spot Instances are terminated when the Spot Fleet request\n expires.

", "smithy.api#xmlName": "terminateInstancesWithExpiration" } @@ -93442,8 +91259,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReplaceUnhealthyInstances", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether Spot Fleet should replace unhealthy instances.

", "smithy.api#xmlName": "replaceUnhealthyInstances" } @@ -93468,8 +91283,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstancePoolsToUseCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot pools across which to allocate your target Spot capacity. Valid\n only when Spot AllocationStrategy is set to\n lowest-price. Spot Fleet selects the cheapest Spot pools and evenly\n allocates your target Spot capacity across the number of Spot pools that you\n specify.

\n

Note that Spot Fleet attempts to draw Spot Instances from the number of pools that you specify on a\n best effort basis. If a pool runs out of Spot capacity before fulfilling your target\n capacity, Spot Fleet will continue to fulfill your request by drawing from the next cheapest\n pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\n the number of pools that you specified. Similarly, if most of the pools have no Spot\n capacity, you might receive your full target capacity from fewer than the number of\n pools that you specified.

", "smithy.api#xmlName": "instancePoolsToUseCount" } @@ -93493,7 +91306,7 @@ "TagSpecifications": { "target": "com.amazonaws.ec2#TagSpecificationList", "traits": { - "smithy.api#documentation": "

The key-value pair for tagging the Spot Fleet request on creation. The value for\n ResourceType must be spot-fleet-request, otherwise the\n Spot Fleet request fails. To tag instances at launch, specify the tags in the launch\n template (valid only if you use LaunchTemplateConfigs) or in\n the \n SpotFleetTagSpecification\n (valid only if you use\n LaunchSpecifications). For information about tagging after launch, see\n Tagging Your Resources.

", + "smithy.api#documentation": "

The key-value pair for tagging the Spot Fleet request on creation. The value for\n ResourceType must be spot-fleet-request, otherwise the\n Spot Fleet request fails. To tag instances at launch, specify the tags in the launch\n template (valid only if you use LaunchTemplateConfigs) or in\n the \n SpotFleetTagSpecification\n (valid only if you use\n LaunchSpecifications). For information about tagging after launch, see\n Tag your resources.

", "smithy.api#xmlName": "TagSpecification" } } @@ -93602,8 +91415,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "BlockDurationMinutes", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "blockDurationMinutes" } @@ -93910,8 +91721,6 @@ "BlockDurationMinutes": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

" } }, @@ -93924,7 +91733,7 @@ "InstanceInterruptionBehavior": { "target": "com.amazonaws.ec2#InstanceInterruptionBehavior", "traits": { - "smithy.api#documentation": "

The behavior when a Spot Instance is interrupted. The default is\n terminate.

" + "smithy.api#documentation": "

The behavior when a Spot Instance is interrupted.

\n

If Configured (for \n HibernationOptions\n ) is set to true, the\n InstanceInterruptionBehavior parameter is automatically set to\n hibernate. If you set it to stop or\n terminate, you'll get an error.

\n

If Configured (for \n HibernationOptions\n ) is set to false or\n null, the InstanceInterruptionBehavior parameter is\n automatically set to terminate. You can also set it to stop or\n hibernate.

\n

For more information, see Interruption\n behavior in the Amazon EC2 User Guide.

" } } }, @@ -93963,8 +91772,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstancePoolsToUseCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot pools across which to allocate your target Spot capacity. Supported\n only when AllocationStrategy is set to lowest-price. EC2 Fleet selects\n the cheapest Spot pools and evenly allocates your target Spot capacity across the number of\n Spot pools that you specify.

\n

Note that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a\n best effort basis. If a pool runs out of Spot capacity before fulfilling your target\n capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest\n pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\n the number of pools that you specified. Similarly, if most of the pools have no Spot\n capacity, you might receive your full target capacity from fewer than the number of pools\n that you specified.

", "smithy.api#xmlName": "instancePoolsToUseCount" } @@ -93973,8 +91780,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleInstanceType", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all Spot Instances in the\n fleet.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleInstanceType" } @@ -93983,8 +91788,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleAvailabilityZone", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all Spot Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleAvailabilityZone" } @@ -93993,8 +91796,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MinTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for Spot Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

", "smithy.api#xmlName": "minTargetCapacity" } @@ -94003,7 +91804,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "MaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
", + "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The maxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for maxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "maxTotalPrice" } } @@ -94036,39 +91837,31 @@ "InstancePoolsToUseCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot pools across which to allocate your target Spot capacity. Supported\n only when Spot AllocationStrategy is set to lowest-price. EC2 Fleet\n selects the cheapest Spot pools and evenly allocates your target Spot capacity across the\n number of Spot pools that you specify.

\n

Note that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a\n best effort basis. If a pool runs out of Spot capacity before fulfilling your target\n capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest\n pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\n the number of pools that you specified. Similarly, if most of the pools have no Spot\n capacity, you might receive your full target capacity from fewer than the number of pools\n that you specified.

" } }, "SingleInstanceType": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all Spot Instances in the\n fleet.

\n

Supported only for fleets of type instant.

" } }, "SingleAvailabilityZone": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all Spot Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

" } }, "MinTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for Spot Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

" } }, "MaxTotalPrice": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
" + "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The MaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for MaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
" } } }, @@ -94131,8 +91924,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Score", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The placement score, on a scale from 1 to 10. A score of\n 10 indicates that your Spot request is highly likely to succeed in this\n Region or Availability Zone. A score of 1 indicates that your Spot request is\n not likely to succeed.

", "smithy.api#xmlName": "score" } @@ -94154,7 +91945,6 @@ "com.amazonaws.ec2#SpotPlacementScoresMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 10, "max": 1000 @@ -94164,7 +91954,6 @@ "com.amazonaws.ec2#SpotPlacementScoresTargetCapacity": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 2000000000 @@ -94252,8 +92041,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The start of the port range for the TCP and UDP protocols, or an ICMP type number. A value of\n -1 indicates all ICMP types.

", "smithy.api#xmlName": "fromPort" } @@ -94286,8 +92073,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The end of the port range for the TCP and UDP protocols, or an ICMP type number. A value of\n -1 indicates all ICMP types.

", "smithy.api#xmlName": "toPort" } @@ -94441,8 +92226,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -94494,8 +92277,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -94576,8 +92357,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -94636,8 +92415,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -94661,8 +92438,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -94893,8 +92668,6 @@ "Hibernate": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Hibernates the instance if the instance was enabled for hibernation at launch. If the\n instance cannot hibernate successfully, a normal shutdown occurs. For more information,\n see Hibernate\n your instance in the Amazon EC2 User Guide.

\n

Default: false\n

" } }, @@ -94902,8 +92675,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -94912,8 +92683,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Force", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Forces the instances to stop. The instances do not have an opportunity to flush file\n system caches or file system metadata. If you use this option, you must perform file\n system check and repair procedures. This option is not recommended for Windows\n instances.

\n

Default: false\n

", "smithy.api#xmlName": "force" } @@ -95030,8 +92799,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ProgressPercentage", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The progress of the task as a percentage.

", "smithy.api#xmlName": "progressPercentage" } @@ -95110,8 +92877,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of unused private IPv4 addresses in the subnet. The IPv4 addresses for any\n\t\t\tstopped instances are considered unavailable.

", "smithy.api#xmlName": "availableIpAddressCount" } @@ -95128,8 +92893,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultForAz", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default subnet for the Availability Zone.

", "smithy.api#xmlName": "defaultForAz" } @@ -95138,8 +92901,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "EnableLniAtDeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

\n Indicates the device position for local network interfaces in this subnet. For example, \n 1 indicates local network interfaces in this subnet are the secondary \n network interface (eth1). \n

", "smithy.api#xmlName": "enableLniAtDeviceIndex" } @@ -95148,8 +92909,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MapPublicIpOnLaunch", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether instances launched in this subnet receive a public IPv4 address.

", "smithy.api#xmlName": "mapPublicIpOnLaunch" } @@ -95158,8 +92917,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MapCustomerOwnedIpOnLaunch", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a network interface created in this subnet (including a network\n interface created by RunInstances) receives a customer-owned IPv4 address.

", "smithy.api#xmlName": "mapCustomerOwnedIpOnLaunch" } @@ -95208,8 +92965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssignIpv6AddressOnCreation", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a network interface created in this subnet (including a network\n interface created by RunInstances) receives an IPv6 address.

", "smithy.api#xmlName": "assignIpv6AddressOnCreation" } @@ -95250,8 +93005,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableDns64", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether DNS queries made to the Amazon-provided DNS Resolver in this subnet \n should return synthetic IPv6 addresses for IPv4-only destinations.

", "smithy.api#xmlName": "enableDns64" } @@ -95260,8 +93013,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Ipv6Native", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is an IPv6 only subnet.

", "smithy.api#xmlName": "ipv6Native" } @@ -95888,8 +93639,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units to request, filled using\n DefaultTargetCapacityType.

", "smithy.api#xmlName": "totalTargetCapacity" } @@ -95898,8 +93647,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OnDemandTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units to request. If you specify a target capacity for Spot units, you cannot specify a target capacity for On-Demand units.

", "smithy.api#xmlName": "onDemandTargetCapacity" } @@ -95908,8 +93655,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SpotTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of Spot units to launch. If you specify a target capacity for On-Demand units, you cannot specify a target capacity for Spot units.

", "smithy.api#xmlName": "spotTargetCapacity" } @@ -95942,7 +93687,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units to request, filled using\n DefaultTargetCapacityType.

", "smithy.api#required": {} } @@ -95950,16 +93694,12 @@ "OnDemandTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units to request.

" } }, "SpotTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot units to request.

" } }, @@ -96010,8 +93750,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances the Convertible Reserved Instance offering can be applied to. This parameter is \n reserved and cannot be specified in a request

", "smithy.api#xmlName": "instanceCount" } @@ -96035,8 +93773,6 @@ "InstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances the Convertible Reserved Instance offering can be applied to. This parameter is reserved and cannot \n be specified in a request

" } }, @@ -96296,8 +94032,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -96433,8 +94167,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -96586,8 +94318,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of total local storage, in GB. If this parameter is not specified, there is\n no minimum limit.

", "smithy.api#xmlName": "min" } @@ -96596,8 +94326,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of total local storage, in GB. If this parameter is not specified, there is\n no maximum limit.

", "smithy.api#xmlName": "max" } @@ -96613,16 +94341,12 @@ "Min": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of total local storage, in GB. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of total local storage, in GB. To specify no maximum limit, omit this\n parameter.

" } } @@ -96758,8 +94482,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RuleNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number of the Traffic Mirror rule.

", "smithy.api#xmlName": "ruleNumber" } @@ -96776,8 +94498,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Protocol", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The protocol assigned to the Traffic Mirror rule.

", "smithy.api#xmlName": "protocol" } @@ -96910,8 +94630,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The start of the Traffic Mirror port range. This applies to the TCP and UDP protocols.

", "smithy.api#xmlName": "fromPort" } @@ -96920,8 +94638,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The end of the Traffic Mirror port range. This applies to the TCP and UDP protocols.

", "smithy.api#xmlName": "toPort" } @@ -96937,16 +94653,12 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the Traffic Mirror port range. This applies to the TCP and UDP protocols.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the Traffic Mirror port range. This applies to the TCP and UDP protocols.

" } } @@ -97019,8 +94731,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PacketLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are the bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet

", "smithy.api#xmlName": "packetLength" } @@ -97029,8 +94739,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SessionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.

\n

Valid values are 1-32766.

", "smithy.api#xmlName": "sessionNumber" } @@ -97039,8 +94747,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VirtualNetworkId", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The virtual network ID associated with the Traffic Mirror session.

", "smithy.api#xmlName": "virtualNetworkId" } @@ -97235,7 +94941,6 @@ "com.amazonaws.ec2#TrafficMirroringMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -97536,8 +95241,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "TransitGatewayAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The transit gateway Autonomous System Number (ASN).

", "smithy.api#xmlName": "transitGatewayAsn" } @@ -97546,8 +95249,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "PeerAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The peer Autonomous System Number (ASN).

", "smithy.api#xmlName": "peerAsn" } @@ -98023,8 +95724,6 @@ "PeerAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The peer Autonomous System Number (ASN).

" } } @@ -98057,7 +95756,6 @@ "com.amazonaws.ec2#TransitGatewayMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -98505,8 +96203,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "GroupMember", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the resource is a transit gateway multicast group member.

", "smithy.api#xmlName": "groupMember" } @@ -98515,8 +96211,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "GroupSource", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the resource is a transit gateway multicast group member.

", "smithy.api#xmlName": "groupSource" } @@ -98631,8 +96325,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "AmazonSideAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \n The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs.

", "smithy.api#xmlName": "amazonSideAsn" } @@ -99166,8 +96858,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Blackhole", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether traffic that matches this route is dropped.

", "smithy.api#xmlName": "blackhole" } @@ -99314,8 +97004,6 @@ "AmazonSideAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \n The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs. The default is 64512.

" } }, @@ -99538,8 +97226,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultAssociationRouteTable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default association route table for the transit gateway.

", "smithy.api#xmlName": "defaultAssociationRouteTable" } @@ -99548,8 +97234,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultPropagationRouteTable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default propagation route table for the transit gateway.

", "smithy.api#xmlName": "defaultPropagationRouteTable" } @@ -100208,8 +97892,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VlanId", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ID of the VLAN when you use the VLAN protocol.

", "smithy.api#xmlName": "vlanId" } @@ -100218,8 +97900,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "GreKey", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The application key when you use the GRE protocol.

", "smithy.api#xmlName": "greKey" } @@ -100331,8 +98011,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Phase1LifetimeSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 1 of the IKE negotiation, in seconds.

", "smithy.api#xmlName": "phase1LifetimeSeconds" } @@ -100341,8 +98019,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Phase2LifetimeSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 2 of the IKE negotiation, in seconds.

", "smithy.api#xmlName": "phase2LifetimeSeconds" } @@ -100351,8 +98027,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RekeyMarginTimeSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The margin time, in seconds, before the phase 2 lifetime expires, during which the\n Amazon Web Services side of the VPN connection performs an IKE rekey.

", "smithy.api#xmlName": "rekeyMarginTimeSeconds" } @@ -100361,8 +98035,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RekeyFuzzPercentage", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The percentage of the rekey window determined by RekeyMarginTimeSeconds\n during which the rekey time is randomly selected.

", "smithy.api#xmlName": "rekeyFuzzPercentage" } @@ -100371,8 +98043,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ReplayWindowSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of packets in an IKE replay window.

", "smithy.api#xmlName": "replayWindowSize" } @@ -100381,8 +98051,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DpdTimeoutSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of seconds after which a DPD timeout occurs.

", "smithy.api#xmlName": "dpdTimeoutSeconds" } @@ -100471,8 +98139,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableTunnelLifecycleControl", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Status of tunnel endpoint lifecycle control feature.

", "smithy.api#xmlName": "enableTunnelLifecycleControl" } @@ -100661,16 +98327,12 @@ "MaxDrainDurationSeconds": { "target": "com.amazonaws.ec2#DrainSeconds", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -100760,8 +98422,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -100980,8 +98640,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -101022,8 +98680,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -101074,8 +98730,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -101116,8 +98770,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -101341,8 +98993,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of vCPUs. If the value is 0, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -101351,8 +99001,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of vCPUs. If this parameter is not specified, there is no maximum\n limit.

", "smithy.api#xmlName": "max" } @@ -101369,7 +99017,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of vCPUs. To specify no minimum limit, specify 0.

", "smithy.api#required": {} } @@ -101377,8 +99024,6 @@ "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of vCPUs. To specify no maximum limit, omit this parameter.

" } } @@ -101630,6 +99275,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -101670,8 +99323,6 @@ "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

", "smithy.api#xmlName": "port" } @@ -101717,8 +99368,6 @@ "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

", "smithy.api#xmlName": "port" } @@ -101747,7 +99396,6 @@ "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 65535 @@ -101930,6 +99578,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -102007,6 +99663,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "FipsEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "FipsEnabled", + "smithy.api#documentation": "

Describes whether support for Federal Information Processing Standards (FIPS) is enabled on the instance.

", + "smithy.api#xmlName": "fipsEnabled" + } } }, "traits": { @@ -102074,8 +99738,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#xmlName": "enabled" } @@ -102108,7 +99770,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#required": {} } @@ -102172,8 +99833,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#xmlName": "enabled" } @@ -102206,7 +99865,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#required": {} } @@ -102252,8 +99910,6 @@ "IncludeTrustContext": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

\n\t\t Include trust data sent by trust providers into the logs. \n\t

" } } @@ -102269,8 +99925,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#xmlName": "enabled" } @@ -102319,7 +99973,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#required": {} } @@ -102386,8 +100039,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IncludeTrustContext", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

\n\t\t Describes current setting for including trust data into the logs.\n\t

", "smithy.api#xmlName": "includeTrustContext" } @@ -102397,6 +100048,50 @@ "smithy.api#documentation": "

Describes the options for Verified Access logs.

" } }, + "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest": { + "type": "structure", + "members": { + "CustomerManagedKeyEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

\n Enable or disable the use of customer managed KMS keys for server side encryption.\n

\n

Valid values: True | False\n

" + } + }, + "KmsKeyArn": { + "target": "com.amazonaws.ec2#KmsKeyArn", + "traits": { + "smithy.api#documentation": "

\n The ARN of the KMS key.\n

" + } + } + }, + "traits": { + "smithy.api#documentation": "

\n Verified Access provides server side encryption by default to data at rest using Amazon Web Services-owned KMS keys. You also have the option of using customer managed KMS keys, which can be specified using the options below. \n

" + } + }, + "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse": { + "type": "structure", + "members": { + "CustomerManagedKeyEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "CustomerManagedKeyEnabled", + "smithy.api#documentation": "

\n Describes the use of customer managed KMS keys for server side encryption.\n

\n

Valid values: True | False\n

", + "smithy.api#xmlName": "customerManagedKeyEnabled" + } + }, + "KmsKeyArn": { + "target": "com.amazonaws.ec2#KmsKeyArn", + "traits": { + "aws.protocols#ec2QueryName": "KmsKeyArn", + "smithy.api#documentation": "

\n Describes the ARN of the KMS key.\n

", + "smithy.api#xmlName": "kmsKeyArn" + } + } + }, + "traits": { + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

" + } + }, "com.amazonaws.ec2#VerifiedAccessTrustProvider": { "type": "structure", "members": { @@ -102487,6 +100182,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -102596,8 +100299,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AcceptedRouteCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of accepted routes.

", "smithy.api#xmlName": "acceptedRouteCount" } @@ -102728,8 +100429,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -102754,8 +100453,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Size", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs.

", "smithy.api#xmlName": "size" } @@ -102788,8 +100485,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Iops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3, io1, and io2 volumes, this represents \n the number of IOPS that are provisioned for the volume. For gp2 volumes, this represents the baseline \n performance of the volume and the rate at which the volume accumulates I/O credits for bursting.

", "smithy.api#xmlName": "iops" } @@ -102814,8 +100509,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "FastRestored", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume was created using fast snapshot restore.

", "smithy.api#xmlName": "fastRestored" } @@ -102824,8 +100517,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MultiAttachEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether Amazon EBS Multi-Attach is enabled.

", "smithy.api#xmlName": "multiAttachEnabled" } @@ -102834,8 +100525,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Throughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

", "smithy.api#xmlName": "throughput" } @@ -102900,8 +100589,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -102980,7 +100667,6 @@ "traits": { "aws.protocols#ec2QueryName": "Size", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#required": {}, "smithy.api#xmlName": "size" @@ -103046,8 +100732,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target size of the volume, in GiB.

", "smithy.api#xmlName": "targetSize" } @@ -103056,8 +100740,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetIops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target IOPS rate of the volume.

", "smithy.api#xmlName": "targetIops" } @@ -103074,8 +100756,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetThroughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target throughput of the volume, in MiB/s.

", "smithy.api#xmlName": "targetThroughput" } @@ -103084,8 +100764,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "TargetMultiAttachEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The target setting for Amazon EBS Multi-Attach.

", "smithy.api#xmlName": "targetMultiAttachEnabled" } @@ -103094,8 +100772,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OriginalSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The original size of the volume, in GiB.

", "smithy.api#xmlName": "originalSize" } @@ -103104,8 +100780,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OriginalIops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The original IOPS rate of the volume.

", "smithy.api#xmlName": "originalIops" } @@ -103122,8 +100796,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OriginalThroughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The original throughput of the volume, in MiB/s.

", "smithy.api#xmlName": "originalThroughput" } @@ -103132,8 +100804,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "OriginalMultiAttachEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The original setting for Amazon EBS Multi-Attach.

", "smithy.api#xmlName": "originalMultiAttachEnabled" } @@ -103142,8 +100812,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Progress", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The modification progress, from 0 to 100 percent complete.

", "smithy.api#xmlName": "progress" } @@ -103683,8 +101351,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPC is the default VPC.

", "smithy.api#xmlName": "isDefault" } @@ -103874,8 +101540,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ClassicLinkEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPC is enabled for ClassicLink.

", "smithy.api#xmlName": "classicLinkEnabled" } @@ -104014,8 +101678,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PrivateDnsEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint) Indicates whether the VPC is associated with a private hosted zone.

", "smithy.api#xmlName": "privateDnsEnabled" } @@ -104024,8 +101686,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "RequesterManaged", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the endpoint is being managed by its service.

", "smithy.api#xmlName": "requesterManaged" } @@ -104439,8 +102099,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowDnsResolutionFromRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses \n when queried from instances in a peer VPC.

", "smithy.api#xmlName": "allowDnsResolutionFromRemoteVpc" } @@ -104449,8 +102107,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } @@ -104459,8 +102115,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } @@ -104859,8 +102513,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableAcceleration", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether acceleration is enabled for the VPN connection.

", "smithy.api#xmlName": "enableAcceleration" } @@ -104869,8 +102521,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "StaticRoutesOnly", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPN connection uses static routes only. Static routes must be\n used for devices that don't support BGP.

", "smithy.api#xmlName": "staticRoutesOnly" } @@ -104950,8 +102600,6 @@ "EnableAcceleration": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicate whether to enable acceleration for the VPN connection.

\n

Default: false\n

" } }, @@ -104959,8 +102607,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "StaticRoutesOnly", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicate whether the VPN connection uses static routes only. If you are creating a VPN\n connection for a device that does not support BGP, you must specify true.\n Use CreateVpnConnectionRoute to create a static route.

\n

Default: false\n

", "smithy.api#xmlName": "staticRoutesOnly" } @@ -105082,8 +102728,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "AmazonSideAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The private Autonomous System Number (ASN) for the Amazon side of a BGP\n session.

", "smithy.api#xmlName": "amazonSideAsn" } @@ -105268,48 +102912,36 @@ "Phase1LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 1 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 28,800.

\n

Default: 28800\n

" } }, "Phase2LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 2 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 3,600. The value must be less than the value for\n Phase1LifetimeSeconds.

\n

Default: 3600\n

" } }, "RekeyMarginTimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The margin time, in seconds, before the phase 2 lifetime expires, during which the\n Amazon Web Services side of the VPN connection performs an IKE rekey. The exact time\n of the rekey is randomly selected based on the value for\n RekeyFuzzPercentage.

\n

Constraints: A value between 60 and half of Phase2LifetimeSeconds.

\n

Default: 540\n

" } }, "RekeyFuzzPercentage": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The percentage of the rekey window (determined by RekeyMarginTimeSeconds)\n during which the rekey time is randomly selected.

\n

Constraints: A value between 0 and 100.

\n

Default: 100\n

" } }, "ReplayWindowSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of packets in an IKE replay window.

\n

Constraints: A value between 64 and 2048.

\n

Default: 1024\n

" } }, "DPDTimeoutSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of seconds after which a DPD timeout occurs.

\n

Constraints: A value greater than or equal to 30.

\n

Default: 30\n

" } }, @@ -105383,8 +103015,6 @@ "EnableTunnelLifecycleControl": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Turn on or off tunnel endpoint lifecycle control feature.

" } } @@ -105472,8 +103102,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } diff --git a/aws/sdk/aws-models/ecs.json b/aws/sdk/aws-models/ecs.json index e575905c962..37cb034e6c8 100644 --- a/aws/sdk/aws-models/ecs.json +++ b/aws/sdk/aws-models/ecs.json @@ -314,7 +314,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -357,7 +356,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -370,7 +370,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -384,7 +383,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -407,7 +405,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -442,7 +439,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -453,14 +449,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -474,14 +472,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -490,11 +486,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -505,14 +501,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -526,7 +524,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -546,7 +543,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -557,14 +553,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -575,9 +573,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1973,7 +1973,7 @@ "namespace": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace that's used when you create a service and don't specify\n\t\t\ta Service Connect configuration. The namespace name can include up to 1024 characters.\n\t\t\tThe name is case-sensitive. The name can't include hyphens (-), tilde (~), greater than\n\t\t\t(>), less than (<), or slash (/).

\n

If you enter an existing namespace name or ARN, then that namespace will be used.\n\t\t\tAny namespace type is supported. The namespace must be in this account and this Amazon Web Services\n\t\t\tRegion.

\n

If you enter a new name, a Cloud Map namespace will be created. Amazon ECS creates a\n\t\t\tCloud Map namespace with the \"API calls\" method of instance discovery only. This instance\n\t\t\tdiscovery method is the \"HTTP\" namespace type in the Command Line Interface. Other types of instance\n\t\t\tdiscovery aren't used by Service Connect.

\n

If you update the service with an empty string \"\" for the namespace name,\n\t\t\tthe cluster configuration for Service Connect is removed. Note that the namespace will\n\t\t\tremain in Cloud Map and must be deleted separately.

\n

For more information about Cloud Map, see Working\n\t\t\t\twith Services in the Cloud Map Developer Guide.

", + "smithy.api#documentation": "

The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace that's used when you create a service and don't specify\n\t\t\ta Service Connect configuration. The namespace name can include up to 1024 characters.\n\t\t\tThe name is case-sensitive. The name can't include hyphens (-), tilde (~), greater than\n\t\t\t(>), less than (<), or slash (/).

\n

If you enter an existing namespace name or ARN, then that namespace will be used.\n\t\t\tAny namespace type is supported. The namespace must be in this account and this Amazon Web Services\n\t\t\tRegion.

\n

If you enter a new name, a Cloud Map namespace will be created. Amazon ECS creates a\n\t\t\tCloud Map namespace with the \"API calls\" method of instance discovery only. This instance\n\t\t\tdiscovery method is the \"HTTP\" namespace type in the Command Line Interface. Other types of instance\n\t\t\tdiscovery aren't used by Service Connect.

\n

If you update the cluster with an empty string \"\" for the namespace name,\n\t\t\tthe cluster configuration for Service Connect is removed. Note that the namespace will\n\t\t\tremain in Cloud Map and must be deleted separately.

\n

For more information about Cloud Map, see Working\n\t\t\t\twith Services in the Cloud Map Developer Guide.

", "smithy.api#required": {} } } @@ -3085,10 +3085,10 @@ "loadBalancers": [], "pendingCount": 0, "runningCount": 0, - "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service", + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service", "serviceName": "ecs-simple-service", "status": "ACTIVE", - "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6" + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/default/hello_world:6" } } } @@ -4550,7 +4550,7 @@ ], "ec2InstanceId": "i-807f3249", "agentConnected": true, - "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/f2756532-8f13-4d53-87c9-aed50dc94cd7", + "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/default/f2756532-8f13-4d53-87c9-aed50dc94cd7", "pendingTasksCount": 0, "remainingResources": [ { @@ -4703,10 +4703,10 @@ "loadBalancers": [], "pendingCount": 0, "runningCount": 0, - "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service", + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service", "serviceName": "ecs-simple-service", "status": "ACTIVE", - "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6" + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/default/hello_world:6" } ] } @@ -5080,7 +5080,7 @@ "failures": [], "tasks": [ { - "taskArn": "arn:aws:ecs:::task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "taskArn": "arn:aws:ecs:::task/default/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", "overrides": { "containerOverrides": [ { @@ -5089,7 +5089,7 @@ ] }, "lastStatus": "RUNNING", - "containerInstanceArn": "arn:aws:ecs:::container-instance/18f9eda5-27d7-4c19-b133-45adc516e8fb", + "containerInstanceArn": "arn:aws:ecs:::container-instance/default/18f9eda5-27d7-4c19-b133-45adc516e8fb", "clusterArn": "arn:aws:ecs:::cluster/default", "desiredStatus": "RUNNING", "taskDefinitionArn": "arn:aws:ecs:::task-definition/amazon-ecs-sample:1", @@ -5097,7 +5097,7 @@ "containers": [ { "containerArn": "arn:aws:ecs:::container/7c01765b-c588-45b3-8290-4ba38bd6c5a6", - "taskArn": "arn:aws:ecs:::task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "taskArn": "arn:aws:ecs:::task/default/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", "lastStatus": "RUNNING", "name": "ecs-demo", "networkBindings": [ @@ -5531,7 +5531,7 @@ } }, "traits": { - "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can\n\t\t\tspecify up to ten environment files. The file must have a .env file\n\t\t\textension. Each line in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored. For more information about the environment variable file\n\t\t\tsyntax, see Declare default\n\t\t\t\tenvironment variables in file.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

You must use the following platforms for the Fargate launch type:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
" + "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can specify\n\t\t\tup to ten environment files. The file must have a .env file extension. Each\n\t\t\tline in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

You must use the following platforms for the Fargate launch type:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

Consider the following when using the Fargate launch type:

\n
    \n
  • \n

    The file is handled like a native Docker env-file.

    \n
  • \n
  • \n

    There is no support for shell escape handling.

    \n
  • \n
  • \n

    The container entry point interperts the VARIABLE values.

    \n
  • \n
" } }, "com.amazonaws.ecs#EnvironmentFileType": { @@ -5957,7 +5957,7 @@ "output": { "protectedTasks": [ { - "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/b8b1cf532d0e46ba8d44a40d1de16772", + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772", "protectionEnabled": true, "expirationDate": "2022-11-02T06:56:32.553Z" } @@ -6051,7 +6051,7 @@ } }, "traits": { - "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The health check is designed to make sure that your containers survive\n\t\t\tagent restarts, upgrades, or temporary unavailability.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated or\n\t\t\t\t\tthere's no container health check defined.

    \n
  • \n
\n

The following describes the possible healthStatus values for a task. The\n\t\t\tcontainer health check status of\n\t\t\tnon-essential containers don't have an effect on the health status of a task.

\n
    \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-The essential containers within the task are still\n\t\t\t\t\thaving their health checks evaluated, there are only nonessential containers\n\t\t\t\t\twith health checks defined, or there are no container health checks\n\t\t\t\t\tdefined.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    When the Amazon ECS agent cannot connect to the Amazon ECS service, the\n\t\t\t\t\tservice reports the container as UNHEALTHY.

    \n
  • \n
  • \n

    The health check statuses are the \"last heard from\" response from the Amazon ECS agent. There\n\t\t\t\t\tare no assumptions made about the status of the container health checks.

    \n
  • \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" + "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The health check is designed to make sure that your containers survive agent restarts,\n\t\t\tupgrades, or temporary unavailability.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated,\n\t\t\t\t\tthere's no container health check defined, or Amazon ECS doesn't have the health\n\t\t\t\t\tstatus of the container.

    \n
  • \n
\n

The following describes the possible healthStatus values based on the\n\t\t\tcontainer health checker status of essential containers in the task with the following\n\t\t\tpriority order (high to low):

\n
    \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-Any essential container running within the task is\n\t\t\t\t\tin an UNKNOWN state and no other essential containers have an\n\t\t\t\t\t\tUNHEALTHY state.

    \n
  • \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
\n

Consider the following task health example with 2 containers.

\n
    \n
  • \n

    If Container1 is UNHEALTHY and Container2 is\n\t\t\t\t\tUNKNOWN, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is UNHEALTHY and Container2 is\n\t\t\t\t\tHEALTHY, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is UNKNOWN,\n\t\t\t\t\tthe task health is UNKNOWN.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is HEALTHY,\n\t\t\t\t\tthe task health is HEALTHY.

    \n
  • \n
\n

Consider the following task health example with 3 containers.

\n
    \n
  • \n

    If Container1 is UNHEALTHY and Container2 is UNKNOWN, and Container3\n\t\t\t\t\tis UNKNOWN, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is UNHEALTHY and Container2 is UNKNOWN, and Container3\n\t\t\t\t\tis HEALTHY, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is UNHEALTHY and Container2 is HEALTHY, and Container3\n\t\t\t\t\tis HEALTHY, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is UNKNOWN, and Container3\n\t\t\t\t\tis HEALTHY, the task health is UNKNOWN.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is UNKNOWN,\n\t\t\t\t\tand Container3 is UNKNOWN, the task health is\n\t\t\t\t\tUNKNOWN.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is HEALTHY,\n\t\t\t\t\tand Container3 is HEALTHY, the task health is\n\t\t\t\t\tHEALTHY.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    When the Amazon ECS agent cannot connect to the Amazon ECS service, the service reports\n\t\t\t\t\tthe container as UNHEALTHY.

    \n
  • \n
  • \n

    The health check statuses are the \"last heard from\" response from the Amazon ECS\n\t\t\t\t\tagent. There are no assumptions made about the status of the container health\n\t\t\t\t\tchecks.

    \n
  • \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" } }, "com.amazonaws.ecs#HealthStatus": { @@ -6745,8 +6745,8 @@ }, "output": { "containerInstanceArns": [ - "arn:aws:ecs:us-east-1::container-instance/f6bbb147-5370-4ace-8c73-c7181ded911f", - "arn:aws:ecs:us-east-1::container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb" + "arn:aws:ecs:us-east-1::container-instance/default/f6bbb147-5370-4ace-8c73-c7181ded911f", + "arn:aws:ecs:us-east-1::container-instance/default/ffe3d344-77e2-476c-a4d0-bf560ad50acb" ] } } @@ -6847,7 +6847,7 @@ "documentation": "This example lists the services running in the default cluster for an account.", "output": { "serviceArns": [ - "arn:aws:ecs:us-east-1:012345678910:service/my-http-service" + "arn:aws:ecs:us-east-1:012345678910:service/default/my-http-service" ] } } @@ -7303,8 +7303,8 @@ }, "output": { "taskArns": [ - "arn:aws:ecs:us-east-1:012345678910:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84", - "arn:aws:ecs:us-east-1:012345678910:task/6b809ef6-c67e-4467-921f-ee261c15a0a1" + "arn:aws:ecs:us-east-1:012345678910:task/default/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84", + "arn:aws:ecs:us-east-1:012345678910:task/default/6b809ef6-c67e-4467-921f-ee261c15a0a1" ] } } @@ -7807,7 +7807,7 @@ "containerPortRange": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPort is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPort. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" + "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPortRange is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPortRange. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" } }, "hostPortRange": { @@ -8175,7 +8175,7 @@ "containerPortRange": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPort is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPort. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" + "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPortRange is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPortRange. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" } } }, @@ -9088,7 +9088,7 @@ "output": { "tasks": [ { - "taskArn": "arn:aws:ecs:us-east-1::task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "taskArn": "arn:aws:ecs:us-east-1::task/default/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", "overrides": { "containerOverrides": [ { @@ -9097,13 +9097,13 @@ ] }, "lastStatus": "PENDING", - "containerInstanceArn": "arn:aws:ecs:us-east-1::container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb", + "containerInstanceArn": "arn:aws:ecs:us-east-1::container-instance/default/ffe3d344-77e2-476c-a4d0-bf560ad50acb", "desiredStatus": "RUNNING", "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:1", "containers": [ { - "containerArn": "arn:aws:ecs:us-east-1::container/58591c8e-be29-4ddf-95aa-ee459d4c59fd", - "taskArn": "arn:aws:ecs:us-east-1::task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "containerArn": "arn:aws:ecs:us-east-1::container/default/58591c8e-be29-4ddf-95aa-ee459d4c59fd", + "taskArn": "arn:aws:ecs:us-east-1::task/default/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", "lastStatus": "PENDING", "name": "sleep" } @@ -12371,7 +12371,7 @@ "output": { "protectedTasks": [ { - "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/b8b1cf532d0e46ba8d44a40d1de16772", + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772", "protectionEnabled": true, "expirationDate": "2022-11-02T06:56:32.553Z" } diff --git a/aws/sdk/aws-models/glacier.json b/aws/sdk/aws-models/glacier.json index 32cb84212f4..c98fd0342eb 100644 --- a/aws/sdk/aws-models/glacier.json +++ b/aws/sdk/aws-models/glacier.json @@ -53,6 +53,17 @@ ], "traits": { "smithy.api#documentation": "

This operation aborts a multipart upload identified by the upload ID.

\n\n\n

After the Abort Multipart Upload request succeeds, you cannot upload any more parts\n to the multipart upload or complete the multipart upload. Aborting a completed upload\n fails. However, aborting an already-aborted upload will succeed, for a short time. For more\n information about uploading a part and completing a multipart upload, see UploadMultipartPart and CompleteMultipartUpload.

\n\n

This operation is idempotent.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Working with Archives in\n Amazon S3 Glacier and Abort Multipart\n Upload in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To abort a multipart upload identified by the upload ID", + "documentation": "The example deletes an in-progress multipart upload to a vault named my-vault:", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", @@ -117,6 +128,16 @@ ], "traits": { "smithy.api#documentation": "

This operation aborts the vault locking process if the vault lock is not in the\n Locked state. If the vault lock is in the Locked state when\n this operation is requested, the operation returns an AccessDeniedException\n error. Aborting the vault locking process removes the vault lock policy from the specified\n vault.

\n

A vault lock is put into the InProgress state by calling InitiateVaultLock. A vault lock is put into the Locked state by\n calling CompleteVaultLock. You can get the state of a vault lock by\n calling GetVaultLock. For more information about the vault locking\n process, see Amazon Glacier Vault Lock. For more information about vault lock policies, see\n Amazon\n Glacier Access Control with Vault Lock Policies.

\n

This operation is idempotent. You can successfully invoke this operation multiple\n times, if the vault lock is in the InProgress state or if there is no policy\n associated with the vault.

", + "smithy.api#examples": [ + { + "title": "To abort a vault lock", + "documentation": "The example aborts the vault locking process if the vault lock is not in the Locked state for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/lock-policy", @@ -205,6 +226,20 @@ ], "traits": { "smithy.api#documentation": "

This operation adds the specified tags to a vault. Each tag is composed of a key and\n a value. Each vault can have up to 10 tags. If your request would cause the tag limit for\n the vault to be exceeded, the operation throws the LimitExceededException\n error. If a tag already exists on the vault under a specified key, the existing key value\n will be overwritten. For more information about tags, see Tagging Amazon S3 Glacier Resources.\n

", + "smithy.api#examples": [ + { + "title": "To add tags to a vault", + "documentation": "The example adds two tags to a my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "Tags": { + "examplekey1": "examplevalue1", + "examplekey2": "examplevalue2" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/tags?operation=add", @@ -425,6 +460,24 @@ ], "traits": { "smithy.api#documentation": "

You call this operation to inform Amazon S3 Glacier (Glacier) that all the archive parts have been\n uploaded and that Glacier can now assemble the archive from the uploaded parts.\n After assembling and saving the archive to the vault, Glacier returns the URI path\n of the newly created archive resource. Using the URI path, you can then access the archive.\n After you upload an archive, you should save the archive ID returned to retrieve the\n archive at a later point. You can also get the vault inventory to obtain a list of archive\n IDs in a vault. For more information, see InitiateJob.

\n\n

In the request, you must include the computed SHA256 tree hash of the entire archive\n you have uploaded. For information about computing a SHA256 tree hash, see Computing\n Checksums. On the server side, Glacier also constructs the SHA256 tree\n hash of the assembled archive. If the values match, Glacier saves the archive to the\n vault; otherwise, it returns an error, and the operation fails. The ListParts operation returns a list of parts uploaded for a specific\n multipart upload. It includes checksum information for each uploaded part that can be used\n to debug a bad checksum issue.

\n\n

Additionally, Glacier also checks for any missing content ranges when\n assembling the archive, if missing content ranges are found, Glacier returns an\n error and the operation fails.

\n\n

Complete Multipart Upload is an idempotent operation. After your first successful\n complete multipart upload, if you call the operation again within a short period, the\n operation will succeed and return the same archive ID. This is useful in the event you\n experience a network issue that causes an aborted connection or receive a 500 server error,\n in which case you can repeat your Complete Multipart Upload request and get the same\n archive ID without creating duplicate archives. Note, however, that after the multipart\n upload completes, you cannot call the List Parts operation and the multipart upload will\n not appear in List Multipart Uploads response, even if idempotent complete is\n possible.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading Large Archives in\n Parts (Multipart Upload) and Complete Multipart\n Upload in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To complete a multipart upload", + "documentation": "The example completes a multipart upload for a 3 MiB archive.", + "input": { + "checksum": "9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "vaultName": "my-vault", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", + "archiveSize": "3145728", + "accountId": "-" + }, + "output": { + "location": "/111122223333/vaults/my-vault/archives/NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId", + "checksum": "9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "archiveId": "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", @@ -503,6 +556,17 @@ ], "traits": { "smithy.api#documentation": "

This operation completes the vault locking process by transitioning the vault lock\n from the InProgress state to the Locked state, which causes the\n vault lock policy to become unchangeable. A vault lock is put into the\n InProgress state by calling InitiateVaultLock. You can\n obtain the state of the vault lock by calling GetVaultLock. For more\n information about the vault locking process, Amazon Glacier Vault Lock.

\n

This operation is idempotent. This request is always successful if the vault lock is\n in the Locked state and the provided lock ID matches the lock ID originally\n used to lock the vault.

\n

If an invalid lock ID is passed in the request when the vault lock is in the\n Locked state, the operation returns an AccessDeniedException\n error. If an invalid lock ID is passed in the request when the vault lock is in the\n InProgress state, the operation throws an InvalidParameter\n error.

", + "smithy.api#examples": [ + { + "title": "To complete a vault lock", + "documentation": "The example completes the vault locking process by transitioning the vault lock from the InProgress state to the Locked state.", + "input": { + "accountId": "-", + "vaultName": "example-vault", + "lockId": "AE863rKkWZU53SLW5be4DUcW" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/lock-policy/{lockId}", @@ -567,6 +631,19 @@ ], "traits": { "smithy.api#documentation": "

This operation creates a new vault with the specified name. The name of the vault\n must be unique within a region for an AWS account. You can create up to 1,000 vaults per\n account. If you need to create more vaults, contact Amazon S3 Glacier.

\n

You must use the following guidelines when naming a vault.

\n
    \n
  • \n

    Names can be between 1 and 255 characters long.

    \n
  • \n
  • \n

    Allowed characters are a-z, A-Z, 0-9, '_' (underscore), '-' (hyphen), and '.'\n (period).

    \n
  • \n
\n\n

This operation is idempotent.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Creating a Vault in Amazon\n Glacier and Create Vault in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new vault", + "documentation": "The following example creates a new vault named my-vault.", + "input": { + "vaultName": "my-vault", + "accountId": "-" + }, + "output": { + "location": "/111122223333/vaults/my-vault" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}", @@ -682,6 +759,17 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes an archive from a vault. Subsequent requests to initiate a\n retrieval of this archive will fail. Archive retrievals that are in progress for this\n archive ID may or may not succeed according to the following scenarios:

\n
    \n
  • \n

    If the archive retrieval job is actively preparing the data for download when\n Amazon S3 Glacier receives the delete archive request, the archival retrieval operation\n might fail.

    \n
  • \n
  • \n

    If the archive retrieval job has successfully prepared the archive for download\n when Amazon S3 Glacier receives the delete archive request, you will be able to download\n the output.

    \n
  • \n
\n\n

This operation is idempotent. Attempting to delete an already-deleted archive does\n not result in an error.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Deleting an Archive in Amazon\n Glacier and Delete Archive in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an archive", + "documentation": "The example deletes the archive specified by the archive ID.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "archiveId": "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/archives/{archiveId}", @@ -746,6 +834,16 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes a vault. Amazon S3 Glacier will delete a vault only if there are\n no archives in the vault as of the last inventory and there have been no writes to the\n vault since the last inventory. If either of these conditions is not satisfied, the vault\n deletion fails (that is, the vault is not removed) and Amazon S3 Glacier returns an error. You\n can use DescribeVault to return the number of archives in a vault, and\n you can use Initiate a Job (POST\n jobs) to initiate a new inventory retrieval for a vault. The inventory contains\n the archive IDs you use to delete archives using Delete Archive (DELETE\n archive).

\n\n

This operation is idempotent.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Deleting a Vault in Amazon\n Glacier and Delete Vault in the\n Amazon S3 Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a vault", + "documentation": "The example deletes a vault named my-vault:", + "input": { + "vaultName": "my-vault", + "accountId": "-" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}", @@ -777,6 +875,16 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes the access policy associated with the specified vault. The\n operation is eventually consistent; that is, it might take some time for Amazon S3 Glacier to\n completely remove the access policy, and you might still see the effect of the policy for a\n short time after you send the delete request.

\n

This operation is idempotent. You can invoke delete multiple times, even if there is\n no policy associated with the vault. For more information about vault access policies, see\n Amazon Glacier Access Control with Vault Access Policies.

", + "smithy.api#examples": [ + { + "title": "To delete the vault access policy", + "documentation": "The example deletes the access policy associated with the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/access-policy", @@ -858,6 +966,16 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes the notification configuration set for a vault. The operation\n is eventually consistent; that is, it might take some time for Amazon S3 Glacier to completely\n disable the notifications and you might still receive some notifications for a short time\n after you send the delete request.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access\n Control Using AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Configuring Vault\n Notifications in Amazon S3 Glacier and Delete Vault\n Notification Configuration in the Amazon S3 Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To delete the notification configuration set for a vault", + "documentation": "The example deletes the notification configuration set for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/notification-configuration", @@ -914,6 +1032,28 @@ ], "traits": { "smithy.api#documentation": "

This operation returns information about a job you previously initiated, including\n the job initiation date, the user who initiated the job, the job status code/message and\n the Amazon SNS topic to notify after Amazon S3 Glacier (Glacier) completes the job. For more information\n about initiating a job, see InitiateJob.

\n\n \n

This operation enables you to check the status of your job. However, it is\n strongly recommended that you set up an Amazon SNS topic and specify it in your initiate\n job request so that Glacier can notify the topic after it completes the\n job.

\n
\n\n

A job ID will not expire for at least 24 hours after Glacier completes the\n job.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n\n

For more information about using this operation, \n see the documentation for the underlying REST API Describe Job \n in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about a previously initiated job", + "documentation": "The example returns information about the previously initiated job specified by the job ID.", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "jobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4Cn" + }, + "output": { + "InventoryRetrievalParameters": { + "Format": "JSON" + }, + "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault", + "Completed": false, + "JobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW", + "Action": "InventoryRetrieval", + "CreationDate": "2015-07-17T20:23:41.616Z", + "StatusCode": "InProgress" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/jobs/{jobId}", @@ -978,6 +1118,23 @@ ], "traits": { "smithy.api#documentation": "

This operation returns information about a vault, including the vault's Amazon\n Resource Name (ARN), the date the vault was created, the number of archives it contains,\n and the total size of all the archives in the vault. The number of archives and their total\n size are as of the last inventory generation. This means that if you add or remove an\n archive from a vault, and then immediately use Describe Vault, the change in contents will\n not be immediately reflected. If you want to retrieve the latest inventory of the vault,\n use InitiateJob. Amazon S3 Glacier generates vault inventories approximately\n daily. For more information, see Downloading a Vault Inventory in\n Amazon S3 Glacier.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Retrieving Vault Metadata in\n Amazon S3 Glacier and Describe Vault in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To retrieve information about a vault", + "documentation": "The example retrieves data about a vault named my-vault.", + "input": { + "vaultName": "my-vault", + "accountId": "-" + }, + "output": { + "SizeInBytes": 0, + "VaultARN": "arn:aws:glacier:us-west-2:111122223333:vaults/my-vault", + "NumberOfArchives": 0, + "CreationDate": "2016-09-23T19:27:18.665Z", + "VaultName": "my-vault" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}", @@ -1190,6 +1347,25 @@ ], "traits": { "smithy.api#documentation": "

This operation returns the current data retrieval policy for the account and region\n specified in the GET request. For more information about data retrieval policies, see\n Amazon Glacier Data Retrieval Policies.

", + "smithy.api#examples": [ + { + "title": "To get the current data retrieval policy for an account", + "documentation": "The example returns the current data retrieval policy for the account.", + "input": { + "accountId": "-" + }, + "output": { + "Policy": { + "Rules": [ + { + "BytesPerHour": 10737418240, + "Strategy": "BytesPerHour" + } + ] + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/policies/data-retrieval", @@ -1253,6 +1429,24 @@ ], "traits": { "smithy.api#documentation": "

This operation downloads the output of the job you initiated using InitiateJob. Depending on the job type you specified when you initiated the\n job, the output will be either the content of an archive or a vault inventory.

\n\n

You can download all the job output or download a portion of the output by specifying\n a byte range. In the case of an archive retrieval job, depending on the byte range you\n specify, Amazon S3 Glacier (Glacier) returns the checksum for the portion of the data. You can compute the\n checksum on the client and verify that the values match to ensure the portion you downloaded\n is the correct data.

\n

A job ID will not expire for at least 24 hours after Glacier completes the job. That\n a byte range. For both archive and inventory retrieval jobs, you should verify the downloaded \n size against the size returned in the headers from the \n Get Job Output response.

\n

For archive retrieval jobs, you should also verify that the size is what you expected. If\n you download a portion of the output, the expected size is based on the range of bytes\n you specified. For example, if you specify a range of bytes=0-1048575, you should\n verify your download size is 1,048,576 bytes. If you download an entire archive, the\n expected size is the size of the archive when you uploaded it to Amazon S3 Glacier\n The expected size is also returned in the headers from the \n Get Job Output response.

\n

In the case of an archive retrieval job, depending on the byte range you\n specify, Glacier returns the checksum for the portion of the data. To ensure the portion you downloaded \n is the correct data, compute the checksum on the client, verify that the values match, \n and verify that the size is what you expected.

\n \n

A job ID does not expire for at least 24 hours after Glacier completes the\n job. That is, you can download the job output within the 24 hours period after Amazon\n Glacier completes the job.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and the underlying REST API, see Downloading a\n Vault Inventory, Downloading an\n Archive, and Get Job Output \n

", + "smithy.api#examples": [ + { + "title": "To get the output of a previously initiated job", + "documentation": "The example downloads the output of a previously initiated inventory retrieval job that is identified by the job ID.", + "input": { + "accountId": "-", + "vaultName": "my-vaul", + "jobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW", + "range": "" + }, + "output": { + "status": 200, + "acceptRanges": "bytes", + "contentType": "application/json", + "body": "inventory-data" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/jobs/{jobId}/output", @@ -1384,6 +1578,21 @@ ], "traits": { "smithy.api#documentation": "

This operation retrieves the access-policy subresource set on the vault;\n for more information on setting this subresource, see Set Vault Access Policy\n (PUT access-policy). If there is no access policy set on the vault, the\n operation returns a 404 Not found error. For more information about vault\n access policies, see Amazon Glacier Access Control\n with Vault Access Policies.

", + "smithy.api#examples": [ + { + "title": "To get the access-policy set on the vault", + "documentation": "The example retrieves the access-policy set on the vault named example-vault.", + "input": { + "accountId": "-", + "vaultName": "example-vault" + }, + "output": { + "policy": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-owner-access-rights\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\"}]}" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/access-policy", @@ -1456,6 +1665,22 @@ ], "traits": { "smithy.api#documentation": "

This operation retrieves the following attributes from the lock-policy\n subresource set on the specified vault:

\n
    \n
  • \n

    The vault lock policy set on the vault.

    \n
  • \n
  • \n

    The state of the vault lock, which is either InProgess or\n Locked.

    \n
  • \n
  • \n

    When the lock ID expires. The lock ID is used to complete the vault locking\n process.

    \n
  • \n
  • \n

    When the vault lock was initiated and put into the InProgress\n state.

    \n
  • \n
\n\n

A vault lock is put into the InProgress state by calling InitiateVaultLock. A vault lock is put into the Locked state by\n calling CompleteVaultLock. You can abort the vault locking process by\n calling AbortVaultLock. For more information about the vault locking\n process, Amazon\n Glacier Vault Lock.

\n

If there is no vault lock policy set on the vault, the operation returns a 404\n Not found error. For more information about vault lock policies, Amazon\n Glacier Access Control with Vault Lock Policies.

", + "smithy.api#examples": [ + { + "title": "To retrieve vault lock-policy related attributes that are set on a vault", + "documentation": "The example retrieves the attributes from the lock-policy subresource set on the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + }, + "output": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-vault-lock\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\",\"Condition\":{\"NumericLessThanEquals\":{\"glacier:ArchiveAgeinDays\":\"365\"}}}]}", + "State": "InProgress", + "ExpirationDate": "exampledate", + "CreationDate": "exampledate" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/lock-policy", @@ -1545,6 +1770,25 @@ ], "traits": { "smithy.api#documentation": "

This operation retrieves the notification-configuration subresource of\n the specified vault.

\n\n

For information about setting a notification configuration on a vault, see SetVaultNotifications. If a notification configuration for a vault is not\n set, the operation returns a 404 Not Found error. For more information about\n vault notifications, see Configuring Vault\n Notifications in Amazon S3 Glacier.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Configuring Vault\n Notifications in Amazon S3 Glacier and Get Vault Notification\n Configuration in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To get the notification-configuration for the specified vault", + "documentation": "The example retrieves the notification-configuration for the vault named my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault" + }, + "output": { + "vaultNotificationConfig": { + "Events": [ + "InventoryRetrievalCompleted", + "ArchiveRetrievalCompleted" + ], + "SNSTopic": "arn:aws:sns:us-west-2:0123456789012:my-vault" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/notification-configuration", @@ -1756,7 +2000,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1774,318 +2017,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://glacier-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://glacier-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://glacier.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" }, - { - "conditions": [], - "endpoint": { - "url": "https://glacier-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "aws-us-gov" ] } - ] + ], + "endpoint": { + "url": "https://glacier.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://glacier-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://glacier.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://glacier.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://glacier.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://glacier.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3006,6 +3214,26 @@ ], "traits": { "smithy.api#documentation": "

This operation initiates a job of the specified type, which can be a select, an archival retrieval,\n or a vault retrieval. For more information about using this operation, \n see the documentation for the underlying REST API Initiate\n a Job.\n

", + "smithy.api#examples": [ + { + "title": "To initiate an inventory-retrieval job", + "documentation": "The example initiates an inventory-retrieval job for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "jobParameters": { + "Type": "inventory-retrieval", + "Description": "My inventory job", + "Format": "CSV", + "SNSTopic": "arn:aws:sns:us-west-2:111111111111:Glacier-InventoryRetrieval-topic-Example" + } + }, + "output": { + "location": "/111122223333/vaults/examplevault/jobs/HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID", + "jobId": " HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/jobs", @@ -3099,6 +3327,21 @@ ], "traits": { "smithy.api#documentation": "

This operation initiates a multipart upload. Amazon S3 Glacier creates a multipart\n upload resource and returns its ID in the response. The multipart upload ID is used in\n subsequent requests to upload parts of an archive (see UploadMultipartPart).

\n\n

When you initiate a multipart upload, you specify the part size in number of bytes.\n The part size must be a megabyte (1024 KB) multiplied by a power of 2-for example, 1048576\n (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 (8 MB), and so on. The minimum allowable\n part size is 1 MB, and the maximum is 4 GB.

\n\n

Every part you upload to this resource (see UploadMultipartPart),\n except the last one, must have the same size. The last one can be the same size or smaller.\n For example, suppose you want to upload a 16.2 MB file. If you initiate the multipart\n upload with a part size of 4 MB, you will upload four parts of 4 MB each and one part of\n 0.2 MB.

\n\n \n

You don't need to know the size of the archive when you start a multipart upload\n because Amazon S3 Glacier does not require you to specify the overall archive\n size.

\n
\n\n

After you complete the multipart upload, Amazon S3 Glacier (Glacier) removes the multipart upload\n resource referenced by the ID. Glacier also removes the multipart upload resource if\n you cancel the multipart upload or it may be removed if there is no activity for a period\n of 24 hours.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading Large Archives in\n Parts (Multipart Upload) and Initiate Multipart\n Upload in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To initiate a multipart upload", + "documentation": "The example initiates a multipart upload to a vault named my-vault with a part size of 1 MiB (1024 x 1024 bytes) per file.", + "input": { + "accountId": "-", + "partSize": "1048576", + "vaultName": "my-vault" + }, + "output": { + "location": "/111122223333/vaults/my-vault/multipart-uploads/19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads", @@ -3192,6 +3435,22 @@ ], "traits": { "smithy.api#documentation": "

This operation initiates the vault locking process by doing the following:

\n
    \n
  • \n

    Installing a vault lock policy on the specified vault.

    \n
  • \n
  • \n

    Setting the lock state of vault lock to InProgress.

    \n
  • \n
  • \n

    Returning a lock ID, which is used to complete the vault locking\n process.

    \n
  • \n
\n\n

You can set one vault lock policy for each vault and this policy can be up to 20 KB\n in size. For more information about vault lock policies, see Amazon Glacier Access Control with\n Vault Lock Policies.

\n

You must complete the vault locking process within 24 hours after the vault lock\n enters the InProgress state. After the 24 hour window ends, the lock ID\n expires, the vault automatically exits the InProgress state, and the vault\n lock policy is removed from the vault. You call CompleteVaultLock to\n complete the vault locking process by setting the state of the vault lock to\n Locked.

\n

After a vault lock is in the Locked state, you cannot initiate a new\n vault lock for the vault.

\n\n

You can abort the vault locking process by calling AbortVaultLock.\n You can get the state of the vault lock by calling GetVaultLock. For more\n information about the vault locking process, Amazon Glacier Vault\n Lock.

\n\n

If this operation is called when the vault lock is in the InProgress\n state, the operation returns an AccessDeniedException error. When the vault\n lock is in the InProgress state you must call AbortVaultLock\n before you can initiate a new vault lock policy.

", + "smithy.api#examples": [ + { + "title": "To initiate the vault locking process", + "documentation": "The example initiates the vault locking process for the vault named my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "policy": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-vault-lock\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\",\"Condition\":{\"NumericLessThanEquals\":{\"glacier:ArchiveAgeinDays\":\"365\"}}}]}" + } + }, + "output": { + "lockId": "AE863rKkWZU53SLW5be4DUcW" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/lock-policy", @@ -3504,6 +3763,46 @@ ], "traits": { "smithy.api#documentation": "

This operation lists jobs for a vault, including jobs that are in-progress and jobs\n that have recently finished. The List Job operation returns a list of these jobs sorted by job initiation\n time.

\n\n \n

Amazon Glacier retains recently completed jobs for a period before deleting them;\n however, it eventually removes completed jobs. The output of completed jobs can be\n retrieved. Retaining completed jobs for a period of time after they have completed\n enables you to get a job output in the event you miss the job completion notification or\n your first attempt to download it fails. For example, suppose you start an archive\n retrieval job to download an archive. After the job completes, you start to download the\n archive but encounter a network error. In this scenario, you can retry and download the\n archive while the job exists.

\n
\n\n

The List Jobs operation supports pagination. You should always check the response Marker field. \n If there are no more jobs to list, the Marker field is set to null. If there are more jobs to list, \n the Marker field is set to a non-null value, which you can use to continue the pagination of the list. \n To return a list of jobs that begins at a specific job, \n set the marker request parameter to the Marker value for that job that you obtained from a previous List Jobs request.

\n \n

You can set a maximum limit for the number of jobs returned in the response by\n specifying the limit parameter in the request. The default limit is 50. The\n number of jobs returned might be fewer than the limit, but the number of returned jobs\n never exceeds the limit.

\n\n

Additionally, you can filter the jobs list returned by specifying the optional\n statuscode parameter or completed parameter, or both. Using\n the statuscode parameter, you can specify to return only jobs that match\n either the InProgress, Succeeded, or Failed status.\n Using the completed parameter, you can specify to return only jobs that were\n completed (true) or jobs that were not completed\n (false).

\n\n

For more information about using this operation, \n see the documentation for the underlying REST API List Jobs.

", + "smithy.api#examples": [ + { + "title": "To list jobs for a vault", + "documentation": "The example lists jobs for the vault named my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault" + }, + "output": { + "JobList": [ + { + "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault", + "RetrievalByteRange": "0-3145727", + "SNSTopic": "arn:aws:sns:us-west-2:0123456789012:my-vault", + "Completed": false, + "SHA256TreeHash": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "JobId": "l7IL5-EkXyEY9Ws95fClzIbk2O5uLYaFdAYOi-azsX_Z8V6NH4yERHzars8wTKYQMX6nBDI9cMNHzyZJO59-8N9aHWav", + "ArchiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw", + "JobDescription": "Retrieve archive on 2015-07-17", + "ArchiveSizeInBytes": 3145728, + "Action": "ArchiveRetrieval", + "ArchiveSHA256TreeHash": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "CreationDate": "2015-07-17T21:16:13.840Z", + "StatusCode": "InProgress" + }, + { + "InventoryRetrievalParameters": { + "Format": "JSON" + }, + "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault", + "Completed": false, + "JobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW", + "Action": "InventoryRetrieval", + "CreationDate": "2015-07-17T20:23:41.616Z", + "StatusCode": "InProgress" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/jobs", @@ -3615,6 +3914,42 @@ ], "traits": { "smithy.api#documentation": "

This operation lists in-progress multipart uploads for the specified vault. An\n in-progress multipart upload is a multipart upload that has been initiated by an InitiateMultipartUpload request, but has not yet been completed or aborted.\n The list returned in the List Multipart Upload response has no guaranteed order.

\n\n

The List Multipart Uploads operation supports pagination. By default, this operation\n returns up to 50 multipart uploads in the response. You should always check the response\n for a marker at which to continue the list; if there are no more items the\n marker is null. To return a list of multipart uploads that\n begins at a specific upload, set the marker request parameter to the value you\n obtained from a previous List Multipart Upload request. You can also limit the number of\n uploads returned in the response by specifying the limit parameter in the\n request.

\n\n

Note the difference between this operation and listing parts (ListParts). The List Multipart Uploads operation lists all multipart uploads\n for a vault and does not require a multipart upload ID. The List Parts operation requires a\n multipart upload ID since parts are associated with a single upload.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n\n

For conceptual information and the underlying REST API, see Working\n with Archives in Amazon S3 Glacier and List Multipart Uploads\n in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list all the in-progress multipart uploads for a vault", + "documentation": "The example lists all the in-progress multipart uploads for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + }, + "output": { + "Marker": "null", + "UploadsList": [ + { + "ArchiveDescription": "archive 1", + "CreationDate": "2012-03-19T23:20:59.130Z", + "MultipartUploadId": "xsQdFIRsfJr20CW2AbZBKpRZAFTZSJIMtL2hYf8mvp8dM0m4RUzlaqoEye6g3h3ecqB_zqwB7zLDMeSWhwo65re4C4Ev", + "PartSizeInBytes": 4194304, + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault" + }, + { + "ArchiveDescription": "archive 2", + "CreationDate": "2012-04-01T15:00:00.000Z", + "MultipartUploadId": "nPyGOnyFcx67qqX7E-0tSGiRi88hHMOwOxR-_jNyM6RjVMFfV29lFqZ3rNsSaWBugg6OP92pRtufeHdQH7ClIpSF6uJc", + "PartSizeInBytes": 4194304, + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault" + }, + { + "ArchiveDescription": "archive 3", + "CreationDate": "2012-03-20T17:03:43.221Z", + "MultipartUploadId": "qt-RBst_7yO8gVIonIBsAxr2t-db0pE4s8MNeGjKjGdNpuU-cdSAcqG62guwV9r5jh5mLyFPzFEitTpNE7iQfHiu1XoV", + "PartSizeInBytes": 4194304, + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads", @@ -3712,6 +4047,35 @@ ], "traits": { "smithy.api#documentation": "

This operation lists the parts of an archive that have been uploaded in a specific\n multipart upload. You can make this request at any time during an in-progress multipart\n upload before you complete the upload (see CompleteMultipartUpload. List\n Parts returns an error for completed uploads. The list returned in the List Parts response\n is sorted by part range.

\n\n

The List Parts operation supports pagination. By default, this operation returns up\n to 50 uploaded parts in the response. You should always check the response for a\n marker at which to continue the list; if there are no more items the\n marker is null. To return a list of parts that begins at a\n specific part, set the marker request parameter to the value you obtained from\n a previous List Parts request. You can also limit the number of parts returned in the\n response by specifying the limit parameter in the request.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and the underlying REST API, see Working\n with Archives in Amazon S3 Glacier and List Parts in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list the parts of an archive that have been uploaded in a multipart upload", + "documentation": "The example lists all the parts of a multipart upload.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "uploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE" + }, + "output": { + "ArchiveDescription": "archive description", + "CreationDate": "2012-03-20T17:03:43.221Z", + "Marker": "null", + "MultipartUploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE", + "PartSizeInBytes": 4194304, + "Parts": [ + { + "RangeInBytes": "0-4194303", + "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4" + }, + { + "RangeInBytes": "4194304-8388607", + "SHA256TreeHash": "0195875365afda349fc21c84c099987164" + } + ], + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/demo1-vault" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", @@ -3845,6 +4209,29 @@ ], "traits": { "smithy.api#documentation": "

This operation lists the provisioned capacity units for the specified AWS\n account.

", + "smithy.api#examples": [ + { + "title": "To list the provisioned capacity units for an account", + "documentation": "The example lists the provisioned capacity units for an account.", + "input": { + "accountId": "-" + }, + "output": { + "ProvisionedCapacityList": [ + { + "CapacityId": "zSaq7NzHFQDANTfQkDen4V7z", + "StartDate": "2016-11-11T20:11:51.095Z", + "ExpirationDate": "2016-12-12T00:00:00.000Z" + }, + { + "CapacityId": "yXaq7NzHFQNADTfQkDen4V7z", + "StartDate": "2016-12-13T20:11:51.095Z", + "ExpirationDate": "2017-01-15T00:00:00.000Z" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/provisioned-capacity", @@ -3906,6 +4293,22 @@ ], "traits": { "smithy.api#documentation": "

This operation lists all the tags attached to a vault. The operation returns an empty\n map if there are no tags. For more information about tags, see Tagging Amazon S3 Glacier\n Resources.

", + "smithy.api#examples": [ + { + "title": "To list the tags for a vault", + "documentation": "The example lists all the tags attached to the vault examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + }, + "output": { + "Tags": { + "date": "july2015", + "id": "1234" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/tags", @@ -4252,6 +4655,18 @@ ], "traits": { "smithy.api#documentation": "

This operation purchases a provisioned capacity unit for an AWS account.

", + "smithy.api#examples": [ + { + "title": "To purchases a provisioned capacity unit for an AWS account", + "documentation": "The example purchases provisioned capacity unit for an AWS account.", + "input": { + "accountId": "-" + }, + "output": { + "capacityId": "zSaq7NzHFQDANTfQkDen4V7z" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/provisioned-capacity", @@ -4331,6 +4746,20 @@ ], "traits": { "smithy.api#documentation": "

This operation removes one or more tags from the set of tags attached to a vault. For\n more information about tags, see Tagging Amazon S3 Glacier Resources.\n This operation is idempotent. The operation will be successful, even if there are no tags\n attached to the vault.

", + "smithy.api#examples": [ + { + "title": "To remove tags from a vault", + "documentation": "The example removes two tags from the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "TagKeys": [ + "examplekey1", + "examplekey2" + ] + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/tags?operation=remove", @@ -4562,6 +4991,23 @@ ], "traits": { "smithy.api#documentation": "

This operation sets and then enacts a data retrieval policy in the region specified\n in the PUT request. You can set one policy per region for an AWS account. The policy is\n enacted within a few minutes of a successful PUT operation.

\n

The set policy operation does not affect retrieval jobs that were in progress before\n the policy was enacted. For more information about data retrieval policies, see Amazon\n Glacier Data Retrieval Policies.

", + "smithy.api#examples": [ + { + "title": "To set and then enact a data retrieval policy ", + "documentation": "The example sets and then enacts a data retrieval policy.", + "input": { + "accountId": "-", + "Policy": { + "Rules": [ + { + "Strategy": "BytesPerHour", + "BytesPerHour": 10737418240 + } + ] + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/policies/data-retrieval", @@ -4616,6 +5062,19 @@ ], "traits": { "smithy.api#documentation": "

This operation configures an access policy for a vault and will overwrite an existing\n policy. To configure a vault access policy, send a PUT request to the\n access-policy subresource of the vault. An access policy is specific to a\n vault and is also called a vault subresource. You can set one access policy per vault and\n the policy can be up to 20 KB in size. For more information about vault access policies,\n see Amazon Glacier Access Control with Vault Access Policies.

", + "smithy.api#examples": [ + { + "title": "To set the access-policy on a vault", + "documentation": "The example configures an access policy for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "policy": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-owner-access-rights\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\"}]}" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}/access-policy", @@ -4679,6 +5138,23 @@ ], "traits": { "smithy.api#documentation": "

This operation configures notifications that will be sent when specific events happen\n to a vault. By default, you don't get any notifications.

\n\n

To configure vault notifications, send a PUT request to the\n notification-configuration subresource of the vault. The request should\n include a JSON document that provides an Amazon SNS topic and specific events for which you\n want Amazon S3 Glacier to send notifications to the topic.

\n\n

Amazon SNS topics must grant permission to the vault to be allowed to publish\n notifications to the topic. You can configure a vault to publish a notification for the\n following vault events:

\n\n
    \n
  • \n

    \n ArchiveRetrievalCompleted This event occurs when a\n job that was initiated for an archive retrieval is completed (InitiateJob). The status of the completed job can be \"Succeeded\" or\n \"Failed\". The notification sent to the SNS topic is the same output as returned from\n DescribeJob.

    \n
  • \n
  • \n\n

    \n InventoryRetrievalCompleted This event occurs when a\n job that was initiated for an inventory retrieval is completed (InitiateJob). The status of the completed job can be \"Succeeded\" or\n \"Failed\". The notification sent to the SNS topic is the same output as returned from\n DescribeJob.

    \n
  • \n
\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Configuring Vault\n Notifications in Amazon S3 Glacier and Set Vault Notification\n Configuration in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To configure a vault to post a message to an Amazon SNS topic when jobs complete", + "documentation": "The example sets the examplevault notification configuration.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "vaultNotificationConfig": { + "Events": [ + "ArchiveRetrievalCompleted", + "InventoryRetrievalCompleted" + ], + "SNSTopic": "arn:aws:sns:us-west-2:012345678901:mytopic" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}/notification-configuration", @@ -4844,6 +5320,24 @@ ], "traits": { "smithy.api#documentation": "

This operation adds an archive to a vault. This is a synchronous operation, and for a\n successful upload, your data is durably persisted. Amazon S3 Glacier returns the archive ID in\n the x-amz-archive-id header of the response.

\n\n

You must use the archive ID to access your data in Amazon S3 Glacier. After you upload\n an archive, you should save the archive ID returned so that you can retrieve or delete the\n archive later. Besides saving the archive ID, you can also index it and give it a friendly\n name to allow for better searching. You can also use the optional archive description field\n to specify how the archive is referred to in an external index of archives, such as you\n might create in Amazon DynamoDB. You can also get the vault inventory to obtain a list of\n archive IDs in a vault. For more information, see InitiateJob.

\n\n

You must provide a SHA256 tree hash of the data you are uploading. For information\n about computing a SHA256 tree hash, see Computing Checksums.

\n\n

You can optionally specify an archive description of up to 1,024 printable ASCII\n characters. You can get the archive description when you either retrieve the archive or get\n the vault inventory. For more information, see InitiateJob. Amazon\n Glacier does not interpret the description in any way. An archive description does not need\n to be unique. You cannot use the description to retrieve or sort the archive list.

\n\n

Archives are immutable. After you upload an archive, you cannot edit the archive or\n its description.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading an Archive in Amazon\n Glacier and Upload Archive in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To upload an archive", + "documentation": "The example adds an archive to a vault.", + "input": { + "vaultName": "my-vault", + "accountId": "-", + "archiveDescription": "", + "checksum": "", + "body": "example-data-to-upload" + }, + "output": { + "archiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw", + "checksum": "969fb39823836d81f0cc028195fcdbcbbe76cdde932d4646fa7de5f21e18aa67", + "location": "/0123456789012/vaults/my-vault/archives/kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/archives", @@ -4964,6 +5458,23 @@ ], "traits": { "smithy.api#documentation": "

This operation uploads a part of an archive. You can upload archive parts in any\n order. You can also upload them in parallel. You can upload up to 10,000 parts for a\n multipart upload.

\n\n

Amazon Glacier rejects your upload part request if any of the following conditions is\n true:

\n\n
    \n
  • \n

    \n SHA256 tree hash does not matchTo ensure that part\n data is not corrupted in transmission, you compute a SHA256 tree hash of the part and\n include it in your request. Upon receiving the part data, Amazon S3 Glacier also\n computes a SHA256 tree hash. If these hash values don't match, the operation fails.\n For information about computing a SHA256 tree hash, see Computing\n Checksums.

    \n
  • \n
  • \n

    \n Part size does not matchThe size of each part except\n the last must match the size specified in the corresponding InitiateMultipartUpload request. The size of the last part must be the\n same size as, or smaller than, the specified size.

    \n \n

    If you upload a part whose size is smaller than the part size you specified\n in your initiate multipart upload request and that part is not the last part, then\n the upload part request will succeed. However, the subsequent Complete Multipart\n Upload request will fail.

    \n
    \n
  • \n
  • \n

    \n Range does not alignThe byte range value in the\n request does not align with the part size specified in the corresponding initiate\n request. For example, if you specify a part size of 4194304 bytes (4 MB), then 0 to\n 4194303 bytes (4 MB - 1) and 4194304 (4 MB) to 8388607 (8 MB - 1) are valid part\n ranges. However, if you set a range value of 2 MB to 6 MB, the range does not align\n with the part size and the upload will fail.

    \n
  • \n
\n\n

This operation is idempotent. If you upload the same part multiple times, the data\n included in the most recent request overwrites the previously uploaded data.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading Large Archives in\n Parts (Multipart Upload) and Upload Part in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To upload the first part of an archive", + "documentation": "The example uploads the first 1 MiB (1024 x 1024 bytes) part of an archive.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", + "checksum": "c06f7cd4baacb087002a99a5f48bf953", + "range": "bytes 0-1048575/*", + "body": "part1" + }, + "output": { + "checksum": "c06f7cd4baacb087002a99a5f48bf953" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", diff --git a/aws/sdk/aws-models/iam.json b/aws/sdk/aws-models/iam.json index 8ad03eb5281..21fb32cfd9b 100644 --- a/aws/sdk/aws-models/iam.json +++ b/aws/sdk/aws-models/iam.json @@ -570,7 +570,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -613,7 +612,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -626,7 +626,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -640,7 +639,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -999,6 +997,57 @@ }, "type": "endpoint" }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "name" + ] + }, + "aws-iso-f" + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-isof-south-1.csp.hci.ic.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-isof-south-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, { "conditions": [ { @@ -1020,7 +1069,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1055,7 +1103,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -1066,14 +1113,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1087,14 +1136,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -1103,11 +1150,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -1118,14 +1165,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1139,7 +1188,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1159,7 +1207,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -1170,14 +1217,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1188,9 +1237,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -5593,7 +5644,7 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked. For more information about services and\n actions for which action last accessed information is displayed, see IAM\n action last accessed information services and actions.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", "smithy.api#examples": [ { "title": "To generate a service last accessed data report for a policy", @@ -5651,11 +5702,6 @@ "output": { "target": "com.amazonaws.iam#GetAccessKeyLastUsedResponse" }, - "errors": [ - { - "target": "com.amazonaws.iam#NoSuchEntityException" - } - ], "traits": { "smithy.api#documentation": "

Retrieves information about when the specified access key was last used. The\n information includes the date and time of last use, along with the Amazon Web Services service and\n Region that were specified in the last request made with that key.

" } @@ -7964,7 +8010,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns information about the access key IDs associated with the specified IAM user.\n If there is none, the operation returns an empty list.

\n

Although each user is limited to a small number of keys, you can still paginate the\n results using the MaxItems and Marker parameters.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation.

\n
", + "smithy.api#documentation": "

Returns information about the access key IDs associated with the specified IAM user.\n If there is none, the operation returns an empty list.

\n

Although each user is limited to a small number of keys, you can still paginate the\n results using the MaxItems and Marker parameters.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required.

\n

This operation works for access keys under the Amazon Web Services account. If the Amazon Web Services account has\n no associated users, the root user returns it's own access key IDs by running this\n command.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation.

\n
", "smithy.api#examples": [ { "title": "To list the access key IDs for an IAM user", diff --git a/aws/sdk/aws-models/kms.json b/aws/sdk/aws-models/kms.json index 3a8eb8f9747..638331470fe 100644 --- a/aws/sdk/aws-models/kms.json +++ b/aws/sdk/aws-models/kms.json @@ -6707,7 +6707,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -6750,7 +6749,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -6763,7 +6763,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -6777,7 +6776,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -6800,7 +6798,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -6835,7 +6832,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -6846,14 +6842,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -6867,14 +6865,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -6883,11 +6879,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -6898,14 +6894,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -6919,7 +6917,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -6939,7 +6936,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -6950,14 +6946,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -6968,9 +6966,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], diff --git a/aws/sdk/aws-models/lambda.json b/aws/sdk/aws-models/lambda.json index 9f2a524dd9c..794f4079a77 100644 --- a/aws/sdk/aws-models/lambda.json +++ b/aws/sdk/aws-models/lambda.json @@ -288,7 +288,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -331,7 +330,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -344,7 +344,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -358,7 +357,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -381,7 +379,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -416,7 +413,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -427,14 +423,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -448,14 +446,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -464,11 +460,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -479,14 +475,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -500,7 +498,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -520,7 +517,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -531,14 +527,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -549,9 +547,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1650,7 +1650,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -3448,7 +3448,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -5630,7 +5630,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -5675,7 +5675,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -8546,6 +8546,9 @@ } } }, + "com.amazonaws.lambda#NullableBoolean": { + "type": "boolean" + }, "com.amazonaws.lambda#OnFailure": { "type": "structure", "members": { @@ -9528,7 +9531,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -11735,6 +11738,12 @@ "traits": { "smithy.api#documentation": "

A list of VPC security group IDs.

" } + }, + "Ipv6AllowedForDualStack": { + "target": "com.amazonaws.lambda#NullableBoolean", + "traits": { + "smithy.api#documentation": "

Allows outbound IPv6 traffic on VPC functions that are connected to dual-stack subnets.

" + } } }, "traits": { @@ -11761,6 +11770,12 @@ "traits": { "smithy.api#documentation": "

The ID of the VPC.

" } + }, + "Ipv6AllowedForDualStack": { + "target": "com.amazonaws.lambda#NullableBoolean", + "traits": { + "smithy.api#documentation": "

Allows outbound IPv6 traffic on VPC functions that are connected to dual-stack subnets.

" + } } }, "traits": { diff --git a/aws/sdk/aws-models/polly.json b/aws/sdk/aws-models/polly.json index 55c468f5aea..0f702c1fdee 100644 --- a/aws/sdk/aws-models/polly.json +++ b/aws/sdk/aws-models/polly.json @@ -1270,7 +1270,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1313,7 +1312,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1326,7 +1326,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1340,7 +1339,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1363,7 +1361,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1398,7 +1395,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -1409,14 +1405,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1430,14 +1428,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -1446,11 +1442,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -1461,14 +1457,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1482,7 +1480,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1502,7 +1499,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -1513,14 +1509,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1531,9 +1529,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], diff --git a/aws/sdk/aws-models/qldb-session.json b/aws/sdk/aws-models/qldb-session.json index df4974f8c5d..ce7bbdaedba 100644 --- a/aws/sdk/aws-models/qldb-session.json +++ b/aws/sdk/aws-models/qldb-session.json @@ -453,7 +453,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -496,7 +495,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -509,7 +509,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -523,7 +522,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -546,7 +544,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -581,7 +578,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -592,14 +588,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -613,14 +611,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -629,11 +625,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -644,14 +640,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -665,7 +663,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -685,7 +682,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -696,14 +692,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -714,9 +712,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], diff --git a/aws/sdk/aws-models/route53.json b/aws/sdk/aws-models/route53.json index cb171eb7c42..85d222c1b78 100644 --- a/aws/sdk/aws-models/route53.json +++ b/aws/sdk/aws-models/route53.json @@ -317,7 +317,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -360,7 +359,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -373,7 +373,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -387,7 +386,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -767,7 +765,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -802,7 +799,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -813,14 +809,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -834,14 +832,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -850,11 +846,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -865,14 +861,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -886,7 +884,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -906,7 +903,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -917,14 +913,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -935,9 +933,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1492,7 +1492,6 @@ "Value": { "target": "com.amazonaws.route53#LimitValue", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The current value for the limit that is specified by Type.

", "smithy.api#required": {} } @@ -2010,7 +2009,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates your\n\t\t\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\n\t\t\tyour changes are propagating, GetChange returns a status of\n\t\t\t\tPENDING. When propagation is complete, GetChange returns a\n\t\t\tstatus of INSYNC. Changes generally propagate to all Route 53 name servers\n\t\t\tmanaging the hosted zone within 60 seconds. For more information, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set doesn't exist, Route 53 creates it. If a resource\n\t\t\t\t\tset exists Route 53 updates it with the values in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates your\n\t\t\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\n\t\t\tyour changes are propagating, GetChange returns a status of\n\t\t\t\tPENDING. When propagation is complete, GetChange returns a\n\t\t\tstatus of INSYNC. Changes generally propagate to all Route 53 name servers\n\t\t\tmanaging the hosted zone within 60 seconds. For more information, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", "smithy.api#examples": [ { "title": "To create a basic resource record set", @@ -3016,7 +3015,7 @@ "CallerReference": { "target": "com.amazonaws.route53#HealthCheckNonce", "traits": { - "smithy.api#documentation": "

A unique string that identifies the request and that allows you to retry a failed\n\t\t\t\tCreateHealthCheck request without the risk of creating two identical\n\t\t\thealth checks:

\n
    \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference and settings as a previous request, and if the\n\t\t\t\t\thealth check doesn't exist, Amazon Route 53 creates the health check. If the\n\t\t\t\t\thealth check does exist, Route 53 returns the settings for the existing health\n\t\t\t\t\tcheck.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as a deleted health check, regardless of the\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as an existing health check but with different\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with a unique\n\t\t\t\t\t\tCallerReference but settings identical to an existing health\n\t\t\t\t\tcheck, Route 53 creates the health check.

    \n
  • \n
", + "smithy.api#documentation": "

A unique string that identifies the request and that allows you to retry a failed\n\t\t\t\tCreateHealthCheck request without the risk of creating two identical\n\t\t\thealth checks:

\n
    \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference and settings as a previous request, and if the\n\t\t\t\t\thealth check doesn't exist, Amazon Route 53 creates the health check. If the\n\t\t\t\t\thealth check does exist, Route 53 returns the settings for the existing health\n\t\t\t\t\tcheck.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as a deleted health check, regardless of the\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as an existing health check but with different\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with a unique\n\t\t\t\t\t\tCallerReference but settings identical to an existing health\n\t\t\t\t\tcheck, Route 53 creates the health check.

    \n
  • \n
\n

Route 53 does not store the CallerReference for a deleted health check indefinitely. \n\t\t\tThe CallerReference for a deleted health check will be deleted after a number of days.

", "smithy.api#required": {} } }, @@ -3532,7 +3531,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates resource record sets in a specified hosted zone based on the settings in a\n\t\t\tspecified traffic policy version. In addition, CreateTrafficPolicyInstance\n\t\t\tassociates the resource record sets with a specified domain name (such as example.com)\n\t\t\tor subdomain name (such as www.example.com). Amazon Route 53 responds to DNS queries for\n\t\t\tthe domain or subdomain name by using the resource record sets that\n\t\t\t\tCreateTrafficPolicyInstance created.

", + "smithy.api#documentation": "

Creates resource record sets in a specified hosted zone based on the settings in a\n\t\t\tspecified traffic policy version. In addition, CreateTrafficPolicyInstance\n\t\t\tassociates the resource record sets with a specified domain name (such as example.com)\n\t\t\tor subdomain name (such as www.example.com). Amazon Route 53 responds to DNS queries for\n\t\t\tthe domain or subdomain name by using the resource record sets that\n\t\t\t\tCreateTrafficPolicyInstance created.

\n \n

After you submit an CreateTrafficPolicyInstance request, there's a\n\t\t\t\tbrief delay while Amazon Route 53 creates the resource record sets that are\n\t\t\t\tspecified in the traffic policy definition. \n\t\t\t\tUse GetTrafficPolicyInstance with the id of new traffic policy instance to confirm that the CreateTrafficPolicyInstance\n\t\t\t\trequest completed successfully. For more information, see the\n\t\t\t\tState response element.

\n
", "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/trafficpolicyinstance", @@ -4951,7 +4950,7 @@ "CountryCode": { "target": "com.amazonaws.route53#GeoLocationCountryCode", "traits": { - "smithy.api#documentation": "

For geolocation resource record sets, the two-letter code for a country.

\n

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

" + "smithy.api#documentation": "

For geolocation resource record sets, the two-letter code for a country.

\n

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

\n

Route 53 also supports the contry code UA forr Ukraine.

" } }, "SubdivisionCode": { @@ -5355,7 +5354,7 @@ "CountryCode": { "target": "com.amazonaws.route53#GeoLocationCountryCode", "traits": { - "smithy.api#documentation": "

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

", + "smithy.api#documentation": "

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

\n

Route 53 also supports the contry code UA forr Ukraine.

", "smithy.api#httpQuery": "countrycode" } }, @@ -6060,7 +6059,7 @@ } ], "traits": { - "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

\n \n

After you submit a CreateTrafficPolicyInstance or an\n\t\t\t\t\tUpdateTrafficPolicyInstance request, there's a brief delay while\n\t\t\t\tAmazon Route 53 creates the resource record sets that are specified in the traffic\n\t\t\t\tpolicy definition. For more information, see the State response\n\t\t\t\telement.

\n
\n \n

In the Route 53 console, traffic policy instances are known as policy\n\t\t\t\trecords.

\n
", + "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

\n \n

\n\t\t\t\tUse GetTrafficPolicyInstance with the id of new traffic policy instance to confirm that the \n\t\t\t\tCreateTrafficPolicyInstance or an UpdateTrafficPolicyInstance request completed successfully. \n\t\t\t\tFor more information, see the State response\n\t\t\t\telement.

\n
\n \n

In the Route 53 console, traffic policy instances are known as policy\n\t\t\t\trecords.

\n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/trafficpolicyinstance/{Id}", @@ -6703,7 +6702,6 @@ "Value": { "target": "com.amazonaws.route53#LimitValue", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The current value for the limit that is specified by Type.

", "smithy.api#required": {} } @@ -6858,6 +6856,17 @@ "smithy.api#documentation": "

In the response to a ListHostedZonesByVPC request, the\n\t\t\t\tHostedZoneSummaries element contains one HostedZoneSummary\n\t\t\telement for each hosted zone that the specified Amazon VPC is associated with. Each\n\t\t\t\tHostedZoneSummary element contains the hosted zone name and ID, and\n\t\t\tinformation about who owns the hosted zone.

" } }, + "com.amazonaws.route53#HostedZoneType": { + "type": "enum", + "members": { + "PRIVATE_HOSTED_ZONE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "PrivateHostedZone" + } + } + } + }, "com.amazonaws.route53#HostedZones": { "type": "list", "member": { @@ -7281,7 +7290,6 @@ "com.amazonaws.route53#LimitValue": { "type": "long", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1 } @@ -7716,7 +7724,7 @@ "MaxItems": { "target": "smithy.api#Integer", "traits": { - "smithy.api#documentation": "

The maximum number of health checks that you want ListHealthChecks to\n\t\t\treturn in response to the current request. Amazon Route 53 returns a maximum of 100\n\t\t\titems. If you set MaxItems to a value greater than 100, Route 53 returns\n\t\t\tonly the first 100 health checks.

", + "smithy.api#documentation": "

The maximum number of health checks that you want ListHealthChecks to\n\t\t\treturn in response to the current request. Amazon Route 53 returns a maximum of 1000\n\t\t\titems. If you set MaxItems to a value greater than 1000, Route 53 returns\n\t\t\tonly the first 1000 health checks.

", "smithy.api#httpQuery": "maxitems" } } @@ -8029,6 +8037,13 @@ "smithy.api#documentation": "

If you're using reusable delegation sets and you want to list all of the hosted zones\n\t\t\tthat are associated with a reusable delegation set, specify the ID of that reusable\n\t\t\tdelegation set.

", "smithy.api#httpQuery": "delegationsetid" } + }, + "HostedZoneType": { + "target": "com.amazonaws.route53#HostedZoneType", + "traits": { + "smithy.api#documentation": "

\n\t\t\t(Optional) Specifies if the hosted zone is private.\n\t\t

", + "smithy.api#httpQuery": "hostedzonetype" + } } }, "traits": { @@ -10134,7 +10149,6 @@ "Value": { "target": "com.amazonaws.route53#LimitValue", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The current value for the MAX_ZONES_BY_REUSABLE_DELEGATION_SET\n\t\t\tlimit.

", "smithy.api#required": {} } @@ -11317,7 +11331,7 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the resource record sets in a specified hosted zone that were created based on\n\t\t\tthe settings in a specified traffic policy version.

\n

When you update a traffic policy instance, Amazon Route 53 continues to respond to DNS\n\t\t\tqueries for the root resource record set name (such as example.com) while it replaces\n\t\t\tone group of resource record sets with another. Route 53 performs the following\n\t\t\toperations:

\n
    \n
  1. \n

    Route 53 creates a new group of resource record sets based on the specified\n\t\t\t\t\ttraffic policy. This is true regardless of how significant the differences are\n\t\t\t\t\tbetween the existing resource record sets and the new resource record sets.\n\t\t\t\t

    \n
  2. \n
  3. \n

    When all of the new resource record sets have been created, Route 53 starts to\n\t\t\t\t\trespond to DNS queries for the root resource record set name (such as\n\t\t\t\t\texample.com) by using the new resource record sets.

    \n
  4. \n
  5. \n

    Route 53 deletes the old group of resource record sets that are associated\n\t\t\t\t\twith the root resource record set name.

    \n
  6. \n
", + "smithy.api#documentation": "\n

After you submit a UpdateTrafficPolicyInstance request, there's a brief delay while Route 53 creates the resource record sets \n\t\t\tthat are specified in the traffic policy definition. Use GetTrafficPolicyInstance with the id of updated traffic policy instance confirm \n\t\t\tthat the \n\t\t\tUpdateTrafficPolicyInstance request completed successfully. For more information, see the State response element.

\n
\n

Updates the resource record sets in a specified hosted zone that were created based on\n\t\t\tthe settings in a specified traffic policy version.

\n

When you update a traffic policy instance, Amazon Route 53 continues to respond to DNS\n\t\t\tqueries for the root resource record set name (such as example.com) while it replaces\n\t\t\tone group of resource record sets with another. Route 53 performs the following\n\t\t\toperations:

\n
    \n
  1. \n

    Route 53 creates a new group of resource record sets based on the specified\n\t\t\t\t\ttraffic policy. This is true regardless of how significant the differences are\n\t\t\t\t\tbetween the existing resource record sets and the new resource record sets.\n\t\t\t\t

    \n
  2. \n
  3. \n

    When all of the new resource record sets have been created, Route 53 starts to\n\t\t\t\t\trespond to DNS queries for the root resource record set name (such as\n\t\t\t\t\texample.com) by using the new resource record sets.

    \n
  4. \n
  5. \n

    Route 53 deletes the old group of resource record sets that are associated\n\t\t\t\t\twith the root resource record set name.

    \n
  6. \n
", "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/trafficpolicyinstance/{Id}", diff --git a/aws/sdk/aws-models/s3.json b/aws/sdk/aws-models/s3.json index d63436f320d..f119125dd9e 100644 --- a/aws/sdk/aws-models/s3.json +++ b/aws/sdk/aws-models/s3.json @@ -17285,16 +17285,13 @@ "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. To constrain the bucket creation to a\n specific Region, you can use \n LocationConstraint\n condition key. You might choose a Region to\n optimize latency, minimize costs, or address regulatory requirements. For example, if you\n reside in Europe, you will probably find it advantageous to create buckets in the Europe\n (Ireland) Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature\n calculations in Signature Version 4 must use us-east-1 as the Region, even\n if the location constraint in the request specifies another Region where the bucket is\n to be created. If you create a bucket in a Region other than US East (N. Virginia), your\n application must be able to handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are\n required when your CreateBucket request includes specific\n headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your\n CreateBucket request specifies access control list (ACL)\n permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through\n any other ACL, both s3:CreateBucket and\n s3:PutBucketAcl permissions are needed. If the ACL for the\n CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.\n

    \n
  • \n
  • \n

    \n Object Lock - If\n ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your\n CreateBucket request includes the\n x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By\n default, ObjectOwnership is set to\n BucketOWnerEnforced and ACLs are disabled. We recommend\n keeping ACLs disabled, except in uncommon use cases where you must control\n access for each object individually. If you want to change the\n ObjectOwnership setting, you can use the\n x-amz-object-ownership header in your\n CreateBucket request to set the ObjectOwnership\n setting of your choice. For more information about S3 Object Ownership, see\n Controlling\n object ownership in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your\n specific use case requires granting public access to your S3 resources, you\n can disable Block Public Access. You can create a new bucket with Block\n Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all\n Block Public Access settings are enabled for new buckets. To avoid\n inadvertent exposure of your resources, we recommend keeping the S3 Block\n Public Access settings enabled. For more information about S3 Block Public\n Access, see Blocking\n public access to your Amazon S3 storage in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for\n Amazon S3 Object Ownership and specifies a bucket ACL that provides access to an external\n Amazon Web Services account, your request fails with a 400 error and returns the\n InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.\n

\n
\n

The following operations are related to CreateBucket:

\n ", "smithy.api#examples": [ { - "title": "To create a bucket in a specific region", - "documentation": "The following example creates a bucket. The request specifies an AWS region where to create the bucket.", + "title": "To create a bucket ", + "documentation": "The following example creates a bucket.", "input": { - "Bucket": "examplebucket", - "CreateBucketConfiguration": { - "LocationConstraint": "eu-west-1" - } + "Bucket": "examplebucket" }, "output": { - "Location": "http://examplebucket..s3.amazonaws.com/" + "Location": "/examplebucket" } } ], @@ -18710,14 +18707,15 @@ "smithy.api#documentation": "

Removes the entire tag set from the specified object. For more information about\n managing object tags, see Object Tagging.

\n

To use this operation, you must have permission to perform the\n s3:DeleteObjectTagging action.

\n

To delete tags of a specific object version, add the versionId query\n parameter in the request. You will need permission for the\n s3:DeleteObjectVersionTagging action.

\n

The following operations are related to DeleteObjectTagging:

\n ", "smithy.api#examples": [ { - "title": "To remove tag set from an object", - "documentation": "The following example removes tag set associated with the specified object. If the bucket is versioning enabled, the operation removes tag set from the latest object version.", + "title": "To remove tag set from an object version", + "documentation": "The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.", "input": { "Bucket": "examplebucket", - "Key": "HappyFace.jpg" + "Key": "HappyFace.jpg", + "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" }, "output": { - "VersionId": "null" + "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI" } } ], @@ -24147,6 +24145,47 @@ }, "traits": { "smithy.api#documentation": "

This action lists in-progress multipart uploads. An in-progress multipart upload is a\n multipart upload that has been initiated using the Initiate Multipart Upload request, but\n has not yet been completed or aborted.

\n

This action returns at most 1,000 multipart uploads in the response. 1,000 multipart\n uploads is the maximum number of uploads a response can include, which is also the default\n value. You can further limit the number of uploads in a response by specifying the\n max-uploads parameter in the response. If additional multipart uploads\n satisfy the list criteria, the response will contain an IsTruncated element\n with the value true. To list the additional multipart uploads, use the\n key-marker and upload-id-marker request parameters.

\n

In the response, the uploads are sorted by key. If your application has initiated more\n than one multipart upload using the same object key, then uploads in the response are first\n sorted by key. Additionally, uploads are sorted in ascending order within each key by the\n upload initiation time.

\n

For more information on multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information on permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

The following operations are related to ListMultipartUploads:

\n ", + "smithy.api#examples": [ + { + "title": "To list in-progress multipart uploads on a bucket", + "documentation": "The following example lists in-progress multipart uploads on a specific bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Uploads": [ + { + "Initiator": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Initiated": "2014-05-01T05:40:58.000Z", + "UploadId": "examplelUa.CInXklLQtSMJITdUnoZ1Y5GACB5UckOtspm5zbDMCkPF_qkfZzMiFZ6dksmcnqxJyIBvQMG9X9Q--", + "StorageClass": "STANDARD", + "Key": "JavaFile", + "Owner": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + } + }, + { + "Initiator": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Initiated": "2014-05-01T05:41:27.000Z", + "UploadId": "examplelo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--", + "StorageClass": "STANDARD", + "Key": "JavaFile", + "Owner": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + } + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?uploads", @@ -28133,16 +28172,19 @@ "smithy.api#documentation": "

Adds an object to a bucket. You must have WRITE permissions on a bucket to add an object\n to it.

\n \n

Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the\n entire object to the bucket. You cannot use PutObject to only update a\n single piece of metadata for an existing object. You must put the entire object with\n updated metadata if you want to update some values.

\n
\n

Amazon S3 is a distributed system. If it receives multiple write requests for the same object\n simultaneously, it overwrites all but the last object written. To prevent objects from\n being deleted or overwritten, you can use Amazon S3 Object\n Lock.

\n

To ensure that data is not corrupted traversing the network, use the\n Content-MD5 header. When you use this header, Amazon S3 checks the object\n against the provided MD5 value and, if they do not match, returns an error. Additionally,\n you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to\n the calculated MD5 value.

\n \n
    \n
  • \n

    To successfully complete the PutObject request, you must have the\n s3:PutObject in your IAM permissions.

    \n
  • \n
  • \n

    To successfully change the objects acl of your PutObject request,\n you must have the s3:PutObjectAcl in your IAM permissions.

    \n
  • \n
  • \n

    To successfully set the tag-set with your PutObject request, you\n must have the s3:PutObjectTagging in your IAM permissions.

    \n
  • \n
  • \n

    The Content-MD5 header is required for any request to upload an\n object with a retention period configured using Amazon S3 Object Lock. For more\n information about Amazon S3 Object Lock, see Amazon S3 Object Lock\n Overview in the Amazon S3 User Guide.

    \n
  • \n
\n
\n

You have four mutually exclusive options to protect data using server-side encryption in\n Amazon S3, depending on how you choose to manage the encryption keys. Specifically, the\n encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with server-side\n encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to\n encrypt data at rest by using server-side encryption with other key options. For more\n information, see Using Server-Side\n Encryption.

\n

When adding a new object, you can use headers to grant ACL-based permissions to\n individual Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are\n then added to the ACL on the object. By default, all objects are private. Only the owner\n has full access control. For more information, see Access Control List (ACL) Overview\n and Managing\n ACLs Using the REST API.

\n

If the bucket that you're uploading objects to uses the bucket owner enforced setting\n for S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that\n use this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format. PUT requests that\n contain other ACLs (for example, custom grants to certain Amazon Web Services accounts) fail and return a\n 400 error with the error code AccessControlListNotSupported.\n For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID\n for the object being stored. Amazon S3 returns this ID in the response. When you enable\n versioning for a bucket, if Amazon S3 receives multiple write requests for the same object\n simultaneously, it stores all of the objects. For more information about versioning, see\n Adding Objects to\n Versioning-Enabled Buckets. For information about returning the versioning state\n of a bucket, see GetBucketVersioning.

\n

For more information about related Amazon S3 APIs, see the following:

\n ", "smithy.api#examples": [ { - "title": "To upload an object", - "documentation": "The following example uploads an object to a versioning-enabled bucket. The source file is specified using Windows file syntax. S3 returns VersionId of the newly created object.", + "title": "To upload an object and specify server-side encryption and object tags", + "documentation": "The following example uploads an object. The request specifies the optional server-side encryption option. The request also specifies optional object tags. If the bucket is versioning enabled, S3 returns version ID in response.", "input": { - "Body": "HappyFace.jpg", + "Body": "filetoupload", "Bucket": "examplebucket", - "Key": "HappyFace.jpg" + "Key": "exampleobject", + "ServerSideEncryption": "AES256", + "Tagging": "key1=value1&key2=value2" }, "output": { - "VersionId": "tpf3zF08nBplQK1XLOefGskR7mGDwcDk", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" + "VersionId": "Ri.vC6qVlA4dEnjgRV4ZHsHoFIjqEMNt", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", + "ServerSideEncryption": "AES256" } } ], @@ -29582,6 +29624,12 @@ "traits": { "smithy.api#enumValue": "REPLICA" } + }, + "COMPLETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "COMPLETED" + } } } }, diff --git a/aws/sdk/aws-models/s3control.json b/aws/sdk/aws-models/s3control.json index 7b83470c3f3..44b0018d490 100644 --- a/aws/sdk/aws-models/s3control.json +++ b/aws/sdk/aws-models/s3control.json @@ -323,7 +323,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -354,7 +353,6 @@ "assign": "url" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -368,7 +366,6 @@ "assign": "partitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -418,9 +415,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -433,7 +432,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -447,7 +445,6 @@ "assign": "partitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -575,7 +572,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -674,16 +670,19 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid region: region was not a valid DNS name.", "type": "error" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -705,7 +704,6 @@ "assign": "accessPointArn" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -734,7 +732,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -754,7 +751,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -784,7 +780,6 @@ "assign": "outpostId" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -798,7 +793,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -855,7 +849,6 @@ "assign": "partitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -875,7 +868,6 @@ "assign": "arnPartition" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -903,7 +895,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -923,7 +914,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -948,7 +938,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -968,7 +957,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1011,7 +999,6 @@ "assign": "outpostType" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1026,7 +1013,6 @@ "assign": "accessPointName" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1040,7 +1026,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1145,83 +1130,97 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: expected an access point name", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: Expected a 4-component resource", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: missing account ID", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", "type": "error" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: No ARN type specified", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1243,7 +1242,6 @@ "assign": "bucketArn" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1272,7 +1270,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1292,7 +1289,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1322,7 +1318,6 @@ "assign": "outpostId" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1336,7 +1331,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1399,7 +1393,6 @@ "assign": "arnPartition" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1413,7 +1406,6 @@ "assign": "partitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1441,7 +1433,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1461,7 +1452,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1486,7 +1476,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1506,7 +1495,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1549,7 +1537,6 @@ "assign": "outpostType" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1564,7 +1551,6 @@ "assign": "bucketName" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1578,7 +1564,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1683,83 +1668,97 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: expected a bucket name", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: Expected a 4-component resource", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: missing account ID", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", "type": "error" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid ARN: No ARN type specified", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -1773,7 +1772,6 @@ "assign": "partitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1787,7 +1785,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1903,7 +1900,6 @@ "assign": "url" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1982,7 +1978,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2380,16 +2377,19 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "Invalid region: region was not a valid DNS name.", "type": "error" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -11744,7 +11744,6 @@ "com.amazonaws.s3control#MinStorageBytesPercentage": { "type": "double", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0.1, "max": 100 @@ -15081,14 +15080,12 @@ "MaxDepth": { "target": "com.amazonaws.s3control#StorageLensPrefixLevelMaxDepth", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The max depth of the selection criteria

" } }, "MinStorageBytesPercentage": { "target": "com.amazonaws.s3control#MinStorageBytesPercentage", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of storage bytes percentage whose metrics will be selected.

\n \n

You must choose a value greater than or equal to 1.0.

\n
" } } @@ -15303,7 +15300,6 @@ "com.amazonaws.s3control#StorageLensPrefixLevelMaxDepth": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 10 diff --git a/aws/sdk/aws-models/sso-oidc.json b/aws/sdk/aws-models/sso-oidc.json index 21fa139b314..83a497aca3b 100644 --- a/aws/sdk/aws-models/sso-oidc.json +++ b/aws/sdk/aws-models/sso-oidc.json @@ -55,7 +55,7 @@ "name": "awsssooidc" }, "aws.protocols#restJson1": {}, - "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) OpenID Connect (OIDC) is a web service that enables a client (such as AWS CLI\n or a native application) to register with IAM Identity Center. The service also enables the client to\n fetch the user’s access token upon successful authentication and authorization with\n IAM Identity Center.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

\n Considerations for Using This Guide\n

\n

Before you begin using this guide, we recommend that you first review the following\n important information about how the IAM Identity Center OIDC service works.

\n
    \n
  • \n

    The IAM Identity Center OIDC service currently implements only the portions of the OAuth 2.0\n Device Authorization Grant standard (https://tools.ietf.org/html/rfc8628) that are necessary to enable single\n sign-on authentication with the AWS CLI. Support for other OIDC flows frequently needed\n for native applications, such as Authorization Code Flow (+ PKCE), will be addressed in\n future releases.

    \n
  • \n
  • \n

    The service emits only OIDC access tokens, such that obtaining a new token (For\n example, token refresh) requires explicit user re-authentication.

    \n
  • \n
  • \n

    The access tokens provided by this service grant access to all AWS account\n entitlements assigned to an IAM Identity Center user, not just a particular application.

    \n
  • \n
  • \n

    The documentation in this guide does not describe the mechanism to convert the access\n token into AWS Auth (“sigv4”) credentials for use with IAM-protected AWS service\n endpoints. For more information, see GetRoleCredentials in the IAM Identity Center Portal API Reference\n Guide.

    \n
  • \n
\n\n

For general information about IAM Identity Center, see What is\n IAM Identity Center? in the IAM Identity Center User Guide.

", + "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) OpenID Connect (OIDC) is a web service that enables a client (such as AWS CLI\n or a native application) to register with IAM Identity Center. The service also enables the client to\n fetch the user’s access token upon successful authentication and authorization with\n IAM Identity Center.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

\n Considerations for Using This Guide\n

\n

Before you begin using this guide, we recommend that you first review the following\n important information about how the IAM Identity Center OIDC service works.

\n
    \n
  • \n

    The IAM Identity Center OIDC service currently implements only the portions of the OAuth 2.0\n Device Authorization Grant standard (https://tools.ietf.org/html/rfc8628) that are necessary to enable single\n sign-on authentication with the AWS CLI. Support for other OIDC flows frequently needed\n for native applications, such as Authorization Code Flow (+ PKCE), will be addressed in\n future releases.

    \n
  • \n
  • \n

    The service emits only OIDC access tokens, such that obtaining a new token (For\n example, token refresh) requires explicit user re-authentication.

    \n
  • \n
  • \n

    The access tokens provided by this service grant access to all AWS account\n entitlements assigned to an IAM Identity Center user, not just a particular application.

    \n
  • \n
  • \n

    The documentation in this guide does not describe the mechanism to convert the access\n token into AWS Auth (“sigv4”) credentials for use with IAM-protected AWS service\n endpoints. For more information, see GetRoleCredentials in the IAM Identity Center Portal API Reference\n Guide.

    \n
  • \n
\n

For general information about IAM Identity Center, see What is\n IAM Identity Center? in the IAM Identity Center User Guide.

", "smithy.api#title": "AWS SSO OIDC", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -99,7 +99,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -117,293 +116,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } + }, + "aws-us-gov" ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://oidc.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://oidc.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://oidc.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -790,7 +779,7 @@ "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", "expect": { "endpoint": { - "url": "https://oidc-fips.us-gov-east-1.amazonaws.com" + "url": "https://oidc.us-gov-east-1.amazonaws.com" } }, "params": { @@ -1094,7 +1083,7 @@ "grantType": { "target": "com.amazonaws.ssooidc#GrantType", "traits": { - "smithy.api#documentation": "

Supports grant types for the authorization code, refresh token, and device code request.\n For device code requests, specify the following value:

\n\n

\n urn:ietf:params:oauth:grant-type:device_code\n \n

\n\n

For information about how to obtain the device code, see the StartDeviceAuthorization topic.

", + "smithy.api#documentation": "

Supports grant types for the authorization code, refresh token, and device code request.\n For device code requests, specify the following value:

\n

\n urn:ietf:params:oauth:grant-type:device_code\n \n

\n

For information about how to obtain the device code, see the StartDeviceAuthorization topic.

", "smithy.api#required": {} } }, @@ -1128,6 +1117,9 @@ "smithy.api#documentation": "

The location of the application that will receive the authorization code. Users authorize\n the service to send the request to this location.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.ssooidc#CreateTokenResponse": { @@ -1164,6 +1156,9 @@ "smithy.api#documentation": "

Currently, idToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

The identifier of the user that associated with the access token, if present.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.ssooidc#DeviceCode": { @@ -1370,6 +1365,9 @@ "smithy.api#documentation": "

The list of scopes that are defined by the client. Upon authorization, this list is used\n to restrict permissions when granting an access token.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.ssooidc#RegisterClientResponse": { @@ -1413,6 +1411,9 @@ "smithy.api#documentation": "

The endpoint where the client can get an access token.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.ssooidc#Scope": { @@ -1500,6 +1501,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.ssooidc#StartDeviceAuthorizationResponse": { @@ -1543,6 +1547,9 @@ "smithy.api#documentation": "

Indicates the number of seconds the client must wait between attempts when polling for a\n session.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.ssooidc#TokenType": { diff --git a/aws/sdk/aws-models/sso.json b/aws/sdk/aws-models/sso.json index 9804c216731..ab26fa26700 100644 --- a/aws/sdk/aws-models/sso.json +++ b/aws/sdk/aws-models/sso.json @@ -578,7 +578,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -621,7 +620,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -634,7 +634,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -648,7 +647,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -671,7 +669,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -706,7 +703,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -717,14 +713,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -738,14 +736,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -754,12 +750,37 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "name" + ] + }, + "aws-us-gov" + ] + } + ], + "endpoint": { + "url": "https://portal.sso.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + }, { "conditions": [], "endpoint": { @@ -769,14 +790,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -790,7 +813,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -810,7 +832,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -821,14 +842,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -839,9 +862,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1233,7 +1258,7 @@ "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", "expect": { "endpoint": { - "url": "https://portal.sso-fips.us-gov-east-1.amazonaws.com" + "url": "https://portal.sso.us-gov-east-1.amazonaws.com" } }, "params": { diff --git a/aws/sdk/aws-models/sts.json b/aws/sdk/aws-models/sts.json index d49956a1f71..c9648e8cb23 100644 --- a/aws/sdk/aws-models/sts.json +++ b/aws/sdk/aws-models/sts.json @@ -173,7 +173,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -624,7 +623,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -637,7 +637,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -680,7 +679,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -693,7 +693,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -707,7 +706,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -730,7 +728,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -765,7 +762,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -776,14 +772,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -797,14 +795,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -813,18 +809,17 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "stringEquals", "argv": [ - "aws-us-gov", { "fn": "getAttr", "argv": [ @@ -833,7 +828,8 @@ }, "name" ] - } + }, + "aws-us-gov" ] } ], @@ -853,14 +849,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -874,7 +872,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -894,7 +891,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -905,14 +901,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -950,9 +948,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -1666,8 +1666,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1684,9 +1684,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "ap-northeast-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1698,8 +1698,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1716,9 +1716,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "ap-south-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1730,8 +1730,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1748,9 +1748,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "ap-southeast-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1762,8 +1762,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1780,9 +1780,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "ap-southeast-2", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1794,8 +1794,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1812,9 +1812,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "aws-global", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1826,8 +1826,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1844,9 +1844,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "ca-central-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1858,8 +1858,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1876,9 +1876,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "eu-central-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1890,8 +1890,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1908,9 +1908,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "eu-north-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1922,8 +1922,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1940,9 +1940,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "eu-west-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1954,8 +1954,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -1972,9 +1972,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "eu-west-2", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -1986,8 +1986,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -2004,9 +2004,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "eu-west-3", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2018,8 +2018,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -2036,9 +2036,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "sa-east-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2050,8 +2050,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -2068,9 +2068,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2082,8 +2082,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -2100,9 +2100,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "us-east-2", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2114,8 +2114,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -2132,9 +2132,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "us-west-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2146,8 +2146,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-1", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-1" } ] }, @@ -2164,9 +2164,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "us-west-2", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2178,8 +2178,8 @@ "authSchemes": [ { "name": "sigv4", - "signingRegion": "us-east-3", - "signingName": "sts" + "signingName": "sts", + "signingRegion": "us-east-3" } ] }, @@ -2196,9 +2196,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "us-east-3", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true } }, @@ -2220,9 +2220,9 @@ } ], "params": { - "UseDualStack": false, - "UseFIPS": false, "Region": "us-west-1", + "UseFIPS": false, + "UseDualStack": false, "UseGlobalEndpoint": true, "Endpoint": "https://example.com" } @@ -2235,10 +2235,10 @@ } }, "params": { - "UseDualStack": false, "UseFIPS": false, - "Endpoint": "https://example.com", - "UseGlobalEndpoint": false + "UseDualStack": false, + "UseGlobalEndpoint": false, + "Endpoint": "https://example.com" } } ], @@ -2339,7 +2339,7 @@ } }, "Policy": { - "target": "com.amazonaws.sts#sessionPolicyDocumentType", + "target": "com.amazonaws.sts#unrestrictedSessionPolicyDocumentType", "traits": { "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

This parameter is optional. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } @@ -3683,6 +3683,15 @@ "com.amazonaws.sts#tokenType": { "type": "string" }, + "com.amazonaws.sts#unrestrictedSessionPolicyDocumentType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1 + }, + "smithy.api#pattern": "^[\\u0009\\u000A\\u000D\\u0020-\\u00FF]+$" + } + }, "com.amazonaws.sts#urlType": { "type": "string", "traits": { diff --git a/aws/sdk/aws-models/timestream-query.json b/aws/sdk/aws-models/timestream-query.json index 13e1aea96af..b7ed9535506 100644 --- a/aws/sdk/aws-models/timestream-query.json +++ b/aws/sdk/aws-models/timestream-query.json @@ -2426,7 +2426,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2469,7 +2468,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2482,7 +2482,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2496,7 +2495,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2519,7 +2517,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2554,7 +2551,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -2565,14 +2561,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2586,14 +2584,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -2602,11 +2598,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -2617,14 +2613,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2638,7 +2636,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2658,7 +2655,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -2669,14 +2665,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -2687,9 +2685,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], diff --git a/aws/sdk/aws-models/timestream-write.json b/aws/sdk/aws-models/timestream-write.json index 7c2da01499a..72221496311 100644 --- a/aws/sdk/aws-models/timestream-write.json +++ b/aws/sdk/aws-models/timestream-write.json @@ -1674,7 +1674,6 @@ "com.amazonaws.timestreamwrite#MagneticStoreRetentionPeriodInDays": { "type": "long", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 73000 @@ -1781,7 +1780,6 @@ "com.amazonaws.timestreamwrite#MemoryStoreRetentionPeriodInHours": { "type": "long", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 8766 @@ -2282,7 +2280,6 @@ "MemoryStoreRetentionPeriodInHours": { "target": "com.amazonaws.timestreamwrite#MemoryStoreRetentionPeriodInHours", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The duration for which data must be stored in the memory store.

", "smithy.api#required": {} } @@ -2290,7 +2287,6 @@ "MagneticStoreRetentionPeriodInDays": { "target": "com.amazonaws.timestreamwrite#MagneticStoreRetentionPeriodInDays", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The duration for which data must be stored in the magnetic store.

", "smithy.api#required": {} } @@ -2865,7 +2861,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2908,7 +2903,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2921,7 +2917,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2935,7 +2930,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2958,7 +2952,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2993,7 +2986,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -3004,14 +2996,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -3025,14 +3019,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -3041,18 +3033,17 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "stringEquals", "argv": [ - "aws-us-gov", { "fn": "getAttr", "argv": [ @@ -3061,7 +3052,8 @@ }, "name" ] - } + }, + "aws-us-gov" ] } ], @@ -3081,14 +3073,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -3102,7 +3096,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3122,7 +3115,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -3133,14 +3125,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -3151,9 +3145,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], diff --git a/aws/sdk/aws-models/transcribe-streaming.json b/aws/sdk/aws-models/transcribe-streaming.json index 49bde387a53..d8b9be6cf8c 100644 --- a/aws/sdk/aws-models/transcribe-streaming.json +++ b/aws/sdk/aws-models/transcribe-streaming.json @@ -2353,7 +2353,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2396,7 +2395,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2409,7 +2409,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2423,7 +2422,6 @@ "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2446,7 +2444,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2481,7 +2478,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -2492,14 +2488,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS and DualStack are enabled, but this partition does not support one or both", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2513,14 +2511,12 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ @@ -2529,11 +2525,11 @@ }, "supportsFIPS" ] - } + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -2544,14 +2540,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "FIPS is enabled but this partition does not support FIPS", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -2565,7 +2563,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2585,7 +2582,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [], @@ -2596,14 +2592,16 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], "error": "DualStack is enabled but this partition does not support DualStack", "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], @@ -2614,9 +2612,11 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" }, { "conditions": [], From 299f6ae1aa38a03e36a36b6180700f9a75ba51d4 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 1 Nov 2023 09:51:12 -0500 Subject: [PATCH 218/331] Revert tilde version requirements for runtime crates (#3122) ## Motivation and Context Now that we have adopted the approach of distinguishing between stable and unstable runtime crates, the tilde version requirements introduced earlier is no longer necessary. ## Description Reverts the following PRs: https://github.com/awslabs/smithy-rs/pull/3009 https://github.com/awslabs/smithy-rs/pull/3025 ## Testing Relied on the existing tests (if we can generate SDKs in CI, we should be good to go) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/publisher/src/package.rs | 178 ++++-------------- tools/ci-build/publisher/src/sort.rs | 27 ++- .../src/subcommand/claim_crate_names.rs | 7 +- .../publisher/src/subcommand/fix_manifests.rs | 136 ++----------- .../src/subcommand/fix_manifests/validate.rs | 5 +- .../subcommand/generate_version_manifest.rs | 9 +- .../publisher/src/subcommand/publish.rs | 10 +- 7 files changed, 82 insertions(+), 290 deletions(-) diff --git a/tools/ci-build/publisher/src/package.rs b/tools/ci-build/publisher/src/package.rs index 88fa04d6cfe..7efff2725ec 100644 --- a/tools/ci-build/publisher/src/package.rs +++ b/tools/ci-build/publisher/src/package.rs @@ -10,77 +10,14 @@ use crate::sort::dependency_order; use crate::RUST_SDK_CI_OWNER; use anyhow::{Context, Result}; use cargo_toml::{Dependency, DepsSet, Manifest}; +use semver::Version; use smithy_rs_tool_common::package::PackageCategory; use std::collections::{BTreeMap, BTreeSet, HashSet}; use std::error::Error as StdError; use std::fmt; -use std::fmt::Formatter; use std::path::{Path, PathBuf}; -use std::str::FromStr; use tokio::fs; -use tracing::{error, warn}; - -/// A trait that marks a type that can be created from `&str` and turned into -/// [`Version`] -/// -/// This trait is purely for convenience to reduce the number of generic parameters for functions, -/// that is, the functions only need to have a single generic parameter that implements this trait -/// instead of having to specify `ParsedT` and `Err` separately. -pub trait ParseIntoVersion { - type ParsedT: FromStr + Into; - type Err: Into; -} - -/// A type that indicates the `SemVer` variant of [`Version`] will be created as a result of parsing -pub struct SemVer; -impl ParseIntoVersion for SemVer { - type ParsedT = semver::Version; - type Err = semver::Error; -} - -/// A type that indicates the `Lenient` variant of [`Version`] will be created as a result of parsing -pub struct VersionRequirement; -impl ParseIntoVersion for VersionRequirement { - type ParsedT = String; - type Err = std::convert::Infallible; -} - -/// An enum that handles both semver as well as string values that do not adhere to the semver -/// specification. -/// -/// Most of the time, the `SemVer` variant will be used when manifest files are parsed into an -/// in-memory data structure. Those version strings can appear under the `[package]` section as -/// well as the dependency table within a manifest file. -/// The `VersionRequirement` variant is used when the `fix_manifests` subcommand and the -/// `generate_version_manifest` subcommand are executed, allowing version strings to be parsed into -/// tilde version requirements. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] -pub enum Version { - SemVer(semver::Version), - VersionRequirement(String), -} - -impl From for Version { - fn from(version: semver::Version) -> Self { - Version::SemVer(version) - } -} - -impl From for Version { - fn from(s: String) -> Self { - Version::VersionRequirement(s) - } -} - -impl fmt::Display for Version { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - let version = match self { - Version::SemVer(v) => v.to_string(), - Version::VersionRequirement(s) => s.clone(), - }; - write!(f, "{}", version) - } -} +use tracing::warn; /// Information required to identify a package (crate). #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] @@ -90,10 +27,10 @@ pub struct PackageHandle { } impl PackageHandle { - pub fn new(name: impl Into, version: impl Into) -> Self { + pub fn new(name: impl Into, version: Version) -> Self { Self { name: name.into(), - version: version.into(), + version, } } } @@ -208,7 +145,7 @@ pub async fn discover_and_validate_package_batches( fs: Fs, path: impl AsRef, ) -> Result<(Vec, PackageStats)> { - let packages = discover_packages::(fs, path.as_ref().into()) + let packages = discover_packages(fs, path.as_ref().into()) .await? .into_iter() .filter(|package| package.publish == Publish::Allowed) @@ -234,8 +171,6 @@ pub enum Error { MissingVersion(PathBuf, String), #[error("crate {0} has multiple versions: {1} and {2}")] MultipleVersions(String, Version, Version), - #[error("multiple version requirements have been specified for crate {0}: {1} and {2}")] - MultipleVersionRequirements(String, Version, Version), } /// Discovers all Cargo.toml files under the given path recursively @@ -257,24 +192,18 @@ pub async fn discover_manifests(path: PathBuf) -> Result> { } /// Discovers and parses all Cargo.toml files that are packages (as opposed to being exclusively workspaces) -pub async fn discover_packages(fs: Fs, path: PathBuf) -> Result> { +pub async fn discover_packages(fs: Fs, path: PathBuf) -> Result> { let manifest_paths = discover_manifests(path).await?; - read_packages::

(fs, manifest_paths).await + read_packages(fs, manifest_paths).await } -/// Parses `version` into [`Version`] and adds additional error context when parsing fails. -pub fn parse_version( - manifest_path: &Path, - version: &str, -) -> Result { - P::ParsedT::from_str(version) +/// Parses a semver version number and adds additional error context when parsing fails. +pub fn parse_version(manifest_path: &Path, version: &str) -> Result { + Version::parse(version) .map_err(|err| Error::InvalidCrateVersion(manifest_path.into(), version.into(), err.into())) } -fn read_dependencies( - path: &Path, - dependencies: &DepsSet, -) -> Result> { +fn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result> { let mut result = Vec::new(); for (name, metadata) in dependencies { match metadata { @@ -284,7 +213,7 @@ fn read_dependencies( let version = detailed .version .as_ref() - .map(|version| parse_version::

(path, version)) + .map(|version| parse_version(path, version)) .ok_or_else(|| Error::MissingVersion(path.into(), name.into()))??; result.push(PackageHandle::new(name, version)); } @@ -296,29 +225,24 @@ fn read_dependencies( } /// Returns `Ok(None)` when the Cargo.toml is a workspace rather than a package -fn read_package( - path: &Path, - manifest_bytes: &[u8], -) -> Result> { +fn read_package(path: &Path, manifest_bytes: &[u8]) -> Result> { let mut manifest = Manifest::from_slice(manifest_bytes) .with_context(|| format!("failed to load package manifest for {:?}", path))?; manifest.complete_from_path(path)?; if let Some(package) = manifest.package { let name = package.name; - let version = parse_version::

(path, &package.version.unwrap())?; - let handle = PackageHandle::new(name, version); + let version = parse_version(path, &package.version.unwrap())?; + let handle = PackageHandle { name, version }; let publish = match package.publish.unwrap() { cargo_toml::Publish::Flag(true) => Publish::Allowed, _ => Publish::NotAllowed, }; let mut local_dependencies = BTreeSet::new(); + local_dependencies.extend(read_dependencies(path, &manifest.dependencies)?.into_iter()); + local_dependencies.extend(read_dependencies(path, &manifest.dev_dependencies)?.into_iter()); local_dependencies - .extend(read_dependencies::

(path, &manifest.dependencies)?.into_iter()); - local_dependencies - .extend(read_dependencies::

(path, &manifest.dev_dependencies)?.into_iter()); - local_dependencies - .extend(read_dependencies::

(path, &manifest.build_dependencies)?.into_iter()); + .extend(read_dependencies(path, &manifest.build_dependencies)?.into_iter()); Ok(Some(Package::new( handle, path, @@ -333,63 +257,38 @@ fn read_package( /// Validates that all of the publishable crates use consistent version numbers /// across all of their local dependencies. fn validate_packages(packages: &[Package]) -> Result<()> { - fn track_version( - handle: &PackageHandle, - map: &mut BTreeMap, - error_generator: F, - ) -> Result<(), Error> - where - F: FnOnce(String, Version, Version) -> Result<(), Error>, - { - if let Some(version) = map.get(&handle.name) { + let mut versions: BTreeMap = BTreeMap::new(); + let track_version = &mut |handle: &PackageHandle| -> Result<(), Error> { + if let Some(version) = versions.get(&handle.name) { if *version != handle.version { - error_generator( + Err(Error::MultipleVersions( (&handle.name).into(), - map[&handle.name].clone(), + versions[&handle.name].clone(), handle.version.clone(), - ) + )) } else { Ok(()) } } else { - map.insert(handle.name.clone(), handle.version.clone()); + versions.insert(handle.name.clone(), handle.version.clone()); Ok(()) } - } - let mut versions: BTreeMap = BTreeMap::new(); - let mut version_requirements: BTreeMap = BTreeMap::new(); + }; for package in packages { - track_version( - &package.handle, - &mut versions, - |crate_name, version_a, version_b| { - Err(Error::MultipleVersions(crate_name, version_a, version_b)) - }, - )?; + track_version(&package.handle)?; for dependency in &package.local_dependencies { - track_version( - dependency, - &mut version_requirements, - |crate_name, version_a, version_b| { - Err(Error::MultipleVersionRequirements( - crate_name, version_a, version_b, - )) - }, - )?; + track_version(dependency)?; } } Ok(()) } -pub async fn read_packages( - fs: Fs, - manifest_paths: Vec, -) -> Result> { +pub async fn read_packages(fs: Fs, manifest_paths: Vec) -> Result> { let mut result = Vec::new(); for path in &manifest_paths { let contents: Vec = fs.read_file(path).await?; - if let Some(package) = read_package::

(path, &contents)? { + if let Some(package) = read_package(path, &contents)? { result.push(package); } } @@ -438,10 +337,11 @@ fn batch_packages(packages: Vec) -> Result> { #[cfg(test)] mod tests { use super::*; + use semver::Version; use std::path::PathBuf; fn version(version: &str) -> Version { - semver::Version::parse(version).unwrap().into() + Version::parse(version).unwrap() } #[test] @@ -465,7 +365,7 @@ mod tests { "#; let path: PathBuf = "test/Cargo.toml".into(); - let package = read_package::(&path, manifest) + let package = read_package(&path, manifest) .expect("parse success") .expect("is a package"); assert_eq!("test", package.handle.name); @@ -495,7 +395,7 @@ mod tests { let error = format!( "{}", - read_package::(&path, manifest).expect_err("should fail") + read_package(&path, manifest).expect_err("should fail") ); assert!( error.contains("Invalid crate version"), @@ -506,11 +406,11 @@ mod tests { fn package(name: &str, dependencies: &[&str]) -> Package { Package::new( - PackageHandle::new(name, semver::Version::parse("1.0.0").unwrap()), + PackageHandle::new(name, Version::parse("1.0.0").unwrap()), format!("{}/Cargo.toml", name), dependencies .iter() - .map(|d| PackageHandle::new(*d, semver::Version::parse("1.0.0").unwrap())) + .map(|d| PackageHandle::new(*d, Version::parse("1.0.0").unwrap())) .collect(), Publish::Allowed, ) @@ -588,11 +488,11 @@ mod tests { fn pkg_ver(name: &str, version: &str, dependencies: &[(&str, &str)]) -> Package { Package::new( - PackageHandle::new(name, semver::Version::parse(version).unwrap()), + PackageHandle::new(name, Version::parse(version).unwrap()), format!("{}/Cargo.toml", name), dependencies .iter() - .map(|p| PackageHandle::new(p.0, semver::Version::parse(p.1).unwrap())) + .map(|p| PackageHandle::new(p.0, Version::parse(p.1).unwrap())) .collect(), Publish::Allowed, ) @@ -628,7 +528,7 @@ mod tests { ]) .expect_err("fail"); assert_eq!( - "multiple version requirements have been specified for crate A: 1.1.0 and 1.0.0", + "crate A has multiple versions: 1.1.0 and 1.0.0", format!("{}", error) ); } diff --git a/tools/ci-build/publisher/src/sort.rs b/tools/ci-build/publisher/src/sort.rs index 2666e0fce95..6362e9c43da 100644 --- a/tools/ci-build/publisher/src/sort.rs +++ b/tools/ci-build/publisher/src/sort.rs @@ -12,9 +12,9 @@ use std::collections::{BTreeMap, BTreeSet}; /// Determines the dependency order of the given packages. pub fn dependency_order(packages: Vec) -> Result> { let mut order = Vec::new(); - let mut packages: BTreeMap = packages + let mut packages: BTreeMap = packages .into_iter() - .map(|p| (p.handle.name.clone(), p)) + .map(|p| (p.handle.clone(), p)) .collect(); let mut visited = BTreeSet::new(); @@ -22,7 +22,7 @@ pub fn dependency_order(packages: Vec) -> Result> { to_visit.sort_by(|a, b| a.local_dependencies.len().cmp(&b.local_dependencies.len())); // Depth-first search topological sort - while let Some(package) = to_visit.iter().find(|e| !visited.contains(&e.handle.name)) { + while let Some(package) = to_visit.iter().find(|e| !visited.contains(&e.handle)) { dependency_order_visit( &package.handle, &packages, @@ -34,28 +34,27 @@ pub fn dependency_order(packages: Vec) -> Result> { Ok(order .into_iter() - .map(&mut |handle: PackageHandle| packages.remove(&handle.name).unwrap()) + .map(&mut |handle: PackageHandle| packages.remove(&handle).unwrap()) .collect()) } fn dependency_order_visit( package_handle: &PackageHandle, - packages: &BTreeMap, - stack: &mut BTreeSet, - visited: &mut BTreeSet, + packages: &BTreeMap, + stack: &mut BTreeSet, + visited: &mut BTreeSet, result: &mut Vec, ) -> Result<()> { - let crate_name = &package_handle.name; - if visited.contains(crate_name) { + if visited.contains(package_handle) { return Ok(()); } - if stack.contains(crate_name) { + if stack.contains(package_handle) { tracing::error!(stack = ?stack, handle = ?package_handle, "dependency cycle!"); bail!("dependency cycle detected"); } - stack.insert(crate_name.clone()); + stack.insert(package_handle.clone()); let local_dependencies = &packages - .get(crate_name) + .get(package_handle) .ok_or_else(|| { dbg!(packages); anyhow!("packages to publish doesn't contain {:?}", package_handle) @@ -64,8 +63,8 @@ fn dependency_order_visit( for dependency in local_dependencies { dependency_order_visit(dependency, packages, stack, visited, result)?; } - stack.remove(crate_name); - visited.insert(crate_name.clone()); + stack.remove(package_handle); + visited.insert(package_handle.clone()); result.push(package_handle.clone()); Ok(()) } diff --git a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs index 123b5ad5d53..ae7a41b3045 100644 --- a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs +++ b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs @@ -3,12 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ use crate::fs::Fs; -use crate::package::{discover_packages, PackageHandle, Publish, SemVer}; +use crate::package::{discover_packages, PackageHandle, Publish}; use crate::publish::{has_been_published_on_crates_io, publish}; use crate::subcommand::publish::correct_owner; use crate::{cargo, SDK_REPO_NAME}; use clap::Parser; use dialoguer::Confirm; +use semver::Version; use smithy_rs_tool_common::git; use smithy_rs_tool_common::package::PackageCategory; use std::collections::HashSet; @@ -61,7 +62,7 @@ async fn claim_crate_name(name: &str) -> anyhow::Result<()> { create_dummy_lib_crate(Fs::Real, name, crate_dir_path.to_path_buf()).await?; let category = PackageCategory::from_package_name(name); - let package_handle = PackageHandle::new(name, semver::Version::new(0, 0, 1)); + let package_handle = PackageHandle::new(name, Version::new(0, 0, 1)); publish(&package_handle, crate_dir_path).await?; // Keep things slow to avoid getting throttled by crates.io tokio::time::sleep(Duration::from_secs(2)).await; @@ -76,7 +77,7 @@ async fn discover_publishable_crate_names(repository_root: &Path) -> anyhow::Res fs: Fs, path: PathBuf, ) -> anyhow::Result> { - let packages = discover_packages::(fs, path).await?; + let packages = discover_packages(fs, path).await?; let mut publishable_package_names = HashSet::new(); for package in packages { if let Publish::Allowed = package.publish { diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index d3c02a364d5..aa591692d46 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -10,12 +10,12 @@ //! version numbers in addition to the dependency path. use crate::fs::Fs; -use crate::package::{discover_manifests, parse_version, SemVer}; +use crate::package::{discover_manifests, parse_version}; use crate::SDK_REPO_NAME; use anyhow::{bail, Context, Result}; use clap::Parser; +use semver::Version; use smithy_rs_tool_common::ci::running_in_ci; -use smithy_rs_tool_common::package::PackageCategory; use std::collections::BTreeMap; use std::ffi::OsStr; use std::path::{Path, PathBuf}; @@ -93,7 +93,7 @@ enum FilterType { } struct VersionView<'a>(&'a Versions, FilterType); impl VersionView<'_> { - fn get(&self, crate_name: &str) -> Option<&semver::Version> { + fn get(&self, crate_name: &str) -> Option<&Version> { let version = match (self.1, self.0 .0.get(crate_name)) { (FilterType::AllCrates, version) => version, (FilterType::PublishedOnly, v @ Some(VersionWithMetadata { publish: true, .. })) => v, @@ -112,20 +112,20 @@ impl Versions { VersionView(self, FilterType::PublishedOnly) } - fn published_crates(&self) -> impl Iterator + '_ { + fn published_crates(&self) -> impl Iterator + '_ { self.0 .iter() .filter(|(_, v)| v.publish) .map(|(k, v)| (k.as_str(), &v.version)) } - fn get(&self, crate_name: &str) -> Option<&semver::Version> { + fn get(&self, crate_name: &str) -> Option<&Version> { self.0.get(crate_name).map(|v| &v.version) } } struct VersionWithMetadata { - version: semver::Version, + version: Version, publish: bool, } @@ -162,7 +162,7 @@ fn package_versions(manifests: &[Manifest]) -> Result { .ok_or_else(|| { anyhow::Error::msg(format!("{:?} is missing a package version", manifest.path)) })?; - let version = parse_version::(&manifest.path, version)?; + let version = parse_version(&manifest.path, version)?; versions.insert(name.into(), VersionWithMetadata { version, publish }); } Ok(Versions(versions)) @@ -189,35 +189,21 @@ fn fix_dep_set(versions: &VersionView, key: &str, metadata: &mut Value) -> Resul } // Update a version of `dep_name` that has a path dependency to be that appearing in `versions`. -// -// While doing so, we will use the tilde version requirement so customers can update patch versions -// automatically. Specifically, we use tilde versions of the form `~major.minor` (e.g. `~1.2`) so -// it can support the range of versions `>=1.2.0, <1.3.0`. See -// https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#tilde-requirements fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Result { if !table.contains_key("path") { return Ok(0); } - let package_version = versions - .get(dep_name) - .ok_or_else(|| anyhow::Error::msg(format!("version not found for crate {dep_name}")))?; - let package_version = if PackageCategory::from_package_name(dep_name) == PackageCategory::AwsSdk - { - // For a crate that depends on an SDK crate (e.g. `aws-config` depending on `aws-sdk-sts`), - // we do _not_ want to turn the version of the SDK crate into a tilde version because - // customers may depend on that SDK crate by themselves, causing multiple versions of it - // to be brought in to their crate graph. - package_version.to_string() - } else { - convert_to_tilde_requirement(package_version)? + let package_version = match versions.get(dep_name) { + Some(version) => version.to_string(), + None => bail!("version not found for crate {}", dep_name), }; let previous_version = table.insert( "version".into(), - toml::Value::String(package_version.clone()), + toml::Value::String(package_version.to_string()), ); match previous_version { None => Ok(1), - Some(prev_version) if versions_match(&prev_version, &package_version) => Ok(0), + Some(prev_version) if prev_version.as_str() == Some(&package_version) => Ok(0), Some(mismatched_version) => { tracing::warn!(expected = ?package_version, actual = ?mismatched_version, "version was set but it did not match"); Ok(1) @@ -225,49 +211,6 @@ fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Resu } } -// Convert `package_version` into a tilde version requirement -// -// For instance, given `package_version` like `0.12.3`, the function returns `~0.12`. -// The fact that this function takes a `semver::Version` means one can only convert a complete -// semver `x.y.z` into a tilde version requirement, but not those like `0.21.0-alpha.1`. -fn convert_to_tilde_requirement(package_version: &semver::Version) -> Result { - // `package_version` is from the `semver` crate which requires versions to have 3 components, - // major, minor, and patch. So it is safe to assume its string value follows that format. - let package_version = package_version.to_string(); - let package_version = match package_version.rfind('.') { - // Here, we're interested in the `major.minor` part. - Some(index) => { - assert_eq!( - 2, - package_version.chars().filter(|&c| c == '.').count(), - "The number of `.` in {} is not 2", - package_version - ); - &package_version[0..index] - } - None => bail!("{} did not have any dots in it", package_version), - }; - - Ok("~".to_string() + package_version) -} - -// Determines if `prev_version` and `current_version` are considered a match -// -// Each input can be either a semver-compliant version or a tilde version requirement. -fn versions_match(prev_version: &Value, current_version: &str) -> bool { - match prev_version.as_str() { - Some(prev_version) => { - if prev_version == current_version { - return true; - } - let prev_version = prev_version.strip_prefix('~').unwrap_or(prev_version); - let current_version = current_version.strip_prefix('~').unwrap_or(current_version); - prev_version.starts_with(current_version) || current_version.starts_with(prev_version) - } - _ => false, - } -} - fn fix_dep_sets(versions: &VersionView, metadata: &mut toml::Value) -> Result { let mut changed = fix_dep_set(versions, "dependencies", metadata)?; // allow dev dependencies to be unpublished @@ -384,7 +327,7 @@ mod tests { ( name.to_string(), VersionWithMetadata { - version: semver::Version::parse(&version).unwrap(), + version: Version::parse(&version).unwrap(), publish, }, ) @@ -470,7 +413,7 @@ mod tests { \n\ [local_something]\n\ path = \"../local_something\"\n\ - version = \"~1.1\"\n\ + version = \"1.1.3\"\n\ ", actual_deps.to_string() ); @@ -482,7 +425,7 @@ mod tests { \n\ [local_dev_something]\n\ path = \"../local_dev_something\"\n\ - version = \"~0.1\"\n\ + version = \"0.1.0\"\n\ ", actual_dev_deps.to_string() ); @@ -494,40 +437,9 @@ mod tests { \n\ [local_build_something]\n\ path = \"../local_build_something\"\n\ - version = \"~0.2\"\n\ - ", - actual_build_deps.to_string() - ); - } - - #[test] - fn sdk_crate_version_should_not_be_turned_into_tilde_requirement() { - let manifest = br#" - [package] - name = "test" - version = "1.2.0-preview" - - [dependencies] - aws-sdk-example = { path = "../aws/sdk/example" } - "#; - let metadata = toml::from_slice(manifest).unwrap(); - let mut manifest = Manifest { - path: "test".into(), - metadata, - }; - let versions = &[("aws-sdk-example", "0.2.0", true)]; - let versions = make_versions(versions.iter()); - - fix_dep_sets(&versions.published(), &mut manifest.metadata).expect("success"); - - let actual_deps = &manifest.metadata["dependencies"]; - assert_eq!( - "\ - [aws-sdk-example]\n\ - path = \"../aws/sdk/example\"\n\ version = \"0.2.0\"\n\ ", - actual_deps.to_string() + actual_build_deps.to_string() ); } @@ -547,20 +459,4 @@ mod tests { "aws-sdk-rust/examples/foo/bar/Cargo.toml" )); } - - #[test] - fn test_versions_match() { - assert!(versions_match(&Value::String("0.56.1".to_owned()), "~0.56")); - assert!(versions_match(&Value::String("~0.56".to_owned()), "0.56.1")); - assert!(!versions_match(&Value::String("~0.56".to_owned()), "~0.57")); - assert!(!versions_match(&Value::String("~0.57".to_owned()), "~0.56")); - assert!(!versions_match( - &Value::String("0.56.1".to_owned()), - "0.56.2" - )); - assert!(!versions_match( - &Value::String("0.56.1".to_owned()), - "0.57.1" - )); - } } diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs index 4a3424d32db..40aa8f609ac 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs @@ -7,6 +7,7 @@ use crate::fs::Fs; use crate::package::discover_and_validate_package_batches; use crate::subcommand::fix_manifests::Versions; use anyhow::{anyhow, bail, Result}; +use semver::Version; use smithy_rs_tool_common::package::PackageCategory; use std::path::Path; use tracing::info; @@ -38,7 +39,7 @@ pub(super) fn validate_before_fixes( Ok(()) } -fn confirm_version(name: &str, expected: &semver::Version, actual: &semver::Version) -> Result<()> { +fn confirm_version(name: &str, expected: &Version, actual: &Version) -> Result<()> { if expected != actual { bail!( "Crate named `{}` should be at version `{}` but is at `{}`", @@ -72,7 +73,7 @@ mod test { map.insert( (*name).into(), VersionWithMetadata { - version: semver::Version::from_str(version).unwrap(), + version: Version::from_str(version).unwrap(), publish: true, }, ); diff --git a/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs b/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs index 46636a5ef28..6b9ac35397b 100644 --- a/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs +++ b/tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs @@ -4,9 +4,10 @@ */ use crate::fs::Fs; -use crate::package::{discover_packages, VersionRequirement}; +use crate::package::discover_packages; use anyhow::{bail, Context, Result}; use clap::Parser; +use semver::Version; use serde::Deserialize; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::package::PackageCategory; @@ -69,7 +70,7 @@ pub async fn subcommand_generate_version_manifest( (None, Some(output_location)) => output_location, _ => bail!("Only one of `--location` or `--output-location` should be provided"), }; - let packages = discover_packages::(Fs::Real, input_location.into()) + let packages = discover_packages(Fs::Real, input_location.into()) .await .context("read packages")?; @@ -134,8 +135,8 @@ fn generate_release_metadata( } } -fn parse_version(name: &str, value: &str) -> Result { - match semver::Version::parse(value) { +fn parse_version(name: &str, value: &str) -> Result { + match Version::parse(value) { Ok(version) => Ok(version), Err(err) => bail!( "Failed to parse version number `{}` from `{}`: {}", diff --git a/tools/ci-build/publisher/src/subcommand/publish.rs b/tools/ci-build/publisher/src/subcommand/publish.rs index 45701214123..dfa2c7af543 100644 --- a/tools/ci-build/publisher/src/subcommand/publish.rs +++ b/tools/ci-build/publisher/src/subcommand/publish.rs @@ -249,16 +249,10 @@ mod test { #[ignore] #[tokio::test] async fn crate_published_works() { - let handle = PackageHandle::new( - "aws-smithy-http", - "0.27.0-alpha.1".parse::().unwrap(), - ); + let handle = PackageHandle::new("aws-smithy-http", "0.27.0-alpha.1".parse().unwrap()); assert!(is_published(&handle).await.expect("failed")); // we will never publish this version - let handle = PackageHandle::new( - "aws-smithy-http", - "0.21.0-alpha.1".parse::().unwrap(), - ); + let handle = PackageHandle::new("aws-smithy-http", "0.21.0-alpha.1".parse().unwrap()); assert!(!is_published(&handle).await.expect("failed")); } } From 09d83d2b9d75302f2ccf2a268d0844d4cb433597 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 1 Nov 2023 11:37:05 -0400 Subject: [PATCH 219/331] Grant the lambda execution role access to the MRAP bucket (#3123) ## Motivation and Context Canary is failing because the lambda execution role can't access the bucket. ## Description - Grant the lambda role access to the bucket ## Testing - ran policy engine in my account to verify access - [x] ran canary in my account --- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts index 5a8e9ac6cec..42e7e33fdbc 100644 --- a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts +++ b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts @@ -168,6 +168,12 @@ export class CanaryStack extends Stack { // Allow canaries to talk to their test bucket this.canaryTestBucket.grantReadWrite(this.lambdaExecutionRole); + this.lambdaExecutionRole.addToPolicy(new PolicyStatement({ + actions: ['s3:GetObject', 's3:PutObject', 's3:DeleteObject'], + effect: Effect.ALLOW, + resources: [`${canaryTestMrapBucketArn}`, `${canaryTestMrapBucketArn}/object/*`], + })); + // Allow canaries to call Transcribe's StartStreamTranscription this.lambdaExecutionRole.addToPolicy( new PolicyStatement({ From 722c141f6463fcb46fdb1d19edd88b16b9ad9b7a Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 1 Nov 2023 12:57:30 -0400 Subject: [PATCH 220/331] Fix smithy types docs (#3120) ## Motivation and Context https://docs.rs/crate/aws-smithy-types/0.57.0/builds/954806 Smithy-types docs failed to build. 1. Update CI to run a command more like docs.rs 2. Use auto_doc instead ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/pull-request-bot.yml | 6 +++--- rust-runtime/aws-smithy-types/src/byte_stream.rs | 3 --- rust-runtime/aws-smithy-types/src/lib.rs | 1 + tools/ci-scripts/check-only-aws-sdk-services | 1 + tools/ci-scripts/check-rust-runtimes | 4 +++- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 2f0bf5c33c9..ca679a3d2c7 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -28,7 +28,6 @@ concurrency: env: java_version: 11 - rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt apt_dependencies: libssl-dev gnuplot jq jobs: @@ -99,7 +98,7 @@ jobs: java-version: ${{ env.java_version }} - uses: dtolnay/rust-toolchain@master with: - toolchain: ${{ env.rust_version }} + toolchain: nightly - name: Generate doc preview id: generate-preview # Only generate three of the smallest services since the doc build can be very large. STS and SSO must be @@ -119,7 +118,8 @@ jobs: # Add server runtime crates to the workspace sed -i 's/"sdk\/sts",/"sdk\/sts","sdk\/aws-smithy-http-server","sdk\/aws-smithy-http-server-python","sdk\/aws-smithy-http-server-typescript",/' Cargo.toml - cargo doc --no-deps --all-features + RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --no-deps + popd ./tools/ci-scripts/generate-doc-preview-index.sh ${{ inputs.base_revision }} diff --git a/rust-runtime/aws-smithy-types/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs index 1018518d5c0..ac4329b3edc 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -366,7 +366,6 @@ impl ByteStream { /// # } /// ``` #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] pub fn read_from() -> crate::byte_stream::FsBuilder { crate::byte_stream::FsBuilder::new() } @@ -396,7 +395,6 @@ impl ByteStream { /// } /// ``` #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] pub async fn from_path( path: impl AsRef, ) -> Result { @@ -415,7 +413,6 @@ impl ByteStream { note = "Prefer the more extensible ByteStream::read_from() API" )] #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] pub async fn from_file( file: tokio::fs::File, ) -> Result { diff --git a/rust-runtime/aws-smithy-types/src/lib.rs b/rust-runtime/aws-smithy-types/src/lib.rs index 7e805c310c9..7c28d181740 100644 --- a/rust-runtime/aws-smithy-types/src/lib.rs +++ b/rust-runtime/aws-smithy-types/src/lib.rs @@ -13,6 +13,7 @@ rust_2018_idioms, unreachable_pub )] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] pub mod base64; pub mod body; pub mod byte_stream; diff --git a/tools/ci-scripts/check-only-aws-sdk-services b/tools/ci-scripts/check-only-aws-sdk-services index b15c4133b3d..d1e0ea754ee 100755 --- a/tools/ci-scripts/check-only-aws-sdk-services +++ b/tools/ci-scripts/check-only-aws-sdk-services @@ -13,6 +13,7 @@ cd aws-sdk sed -i '/"examples\//d' Cargo.toml cargo check --all-targets --all-features +RUSTDOCFLAGS="--cfg docsrs" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features for test_dir in tests/*; do if [ -f "${test_dir}/Cargo.toml" ]; then diff --git a/tools/ci-scripts/check-rust-runtimes b/tools/ci-scripts/check-rust-runtimes index 68a47eba5d0..78b6221b5a4 100755 --- a/tools/ci-scripts/check-rust-runtimes +++ b/tools/ci-scripts/check-rust-runtimes @@ -27,7 +27,9 @@ do cargo test --all-features echo -e "## ${C_YELLOW}Running 'cargo doc' on ${runtime_path}...${C_RESET}" - cargo doc --no-deps --document-private-items --all-features + + RUSTDOCFLAGS="--cfg docsrs -Dwarnings" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features + echo -e "## ${C_YELLOW}Running 'cargo minimal-versions check' on ${runtime_path}...${C_RESET}" cargo +"${RUST_NIGHTLY_VERSION}" minimal-versions check --all-features From 426e77f073239b9510cc4e77315284074272aee6 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 1 Nov 2023 14:34:40 -0400 Subject: [PATCH 221/331] Fix aws-sdk-rust#930 (PutSnapshotBlock) (#3126) ## Motivation and Context A regression in 0.56 caused `X-Amz-Content-sha256` to be omitted when the `UnsignedPayload` trait was present. This re-enables the old behavior and fixes this operation. ## Description Enable the `x-amz-content-sha256` header whenever the unsigned payload trait is present. Old code: https://github.com/awslabs/smithy-rs/blob/smithy-rs-release-0.54.x/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt#L168 ## Testing - [x] Manual integration test - [x] Modeled protocol test that ensures that header is set ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++ .../smithy/rustsdk/SigV4AuthDecorator.kt | 2 +- .../smithy/rustsdk/SigV4AuthDecoratorTest.kt | 64 +++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index f06188ef369..902d641bb51 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -16,3 +16,9 @@ message = "Upgrade `ring` to 0.17.5." references = ["smithy-rs#3112", "smithy-rs#3116"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Fix aws-sdk-rust#930 (PutSnapshotBlock)" +references = ["smithy-rs#3126", "aws-sdk-rust#930"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "rcoh" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 46f070e18e2..b56fa513bb4 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -226,7 +226,7 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg if (authSchemes.containsKey(SigV4Trait.ID)) { val unsignedPayload = section.operationShape.hasTrait() val doubleUriEncode = unsignedPayload || !disableDoubleEncode(codegenContext.serviceShape) - val contentSha256Header = needsAmzSha256(codegenContext.serviceShape) + val contentSha256Header = needsAmzSha256(codegenContext.serviceShape) || unsignedPayload val normalizeUrlPath = !disableUriPathNormalization(codegenContext.serviceShape) rustTemplate( """ diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt new file mode 100644 index 00000000000..64f35d197fa --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt @@ -0,0 +1,64 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel + +class SigV4AuthDecoratorTest { + private val modelWithSigV4AuthScheme = """ + namespace test + + use aws.auth#sigv4 + use aws.api#service + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + use aws.auth#unsignedPayload + use smithy.test#httpRequestTests + + @auth([sigv4]) + @sigv4(name: "dontcare") + @restJson1 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "endpoint": { "required": true, "type": "string", "builtIn": "SDK::Endpoint" }, + } + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + + structure SomeInput { + @httpPayload + something: Bytestream + } + + @streaming + blob Bytestream + + @httpRequestTests([{ + id: "unsignedPayload", + protocol: restJson1, + method: "POST", + uri: "/", + params: { + something: "hello" + }, + headers: { + "x-amz-content-sha256": "UNSIGNED-PAYLOAD", + }, + }]) + @unsignedPayload + @http(uri: "/", method: "POST") + operation SomeOperation { input: SomeInput, output: SomeOutput } + """.asSmithyModel() + + @Test + fun unsignedPayloadSetsCorrectHeader() { + awsSdkIntegrationTest(modelWithSigV4AuthScheme) { _, _ -> } + } +} From bb91840f4504ade6b59d44a1c331fdd01b49b3ad Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Wed, 1 Nov 2023 18:51:46 +0000 Subject: [PATCH 222/331] Upgrade the smithy-rs runtime crates version to 0.57.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9d7b1d61871..0343d116bd6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.57.0 +smithy.rs.runtime.crate.version=0.57.1 kotlin.code.style=official From a23cf9800fb5887f8b04bde7ab3dd938d5b945fd Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Wed, 1 Nov 2023 18:54:07 +0000 Subject: [PATCH 223/331] Update changelog --- CHANGELOG.md | 6 + CHANGELOG.next.toml | 8 +- aws/SDK_CHANGELOG.next.json | 279 +++++++----------------------------- 3 files changed, 62 insertions(+), 231 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70a6a34b809..ded725b1e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ +November 1st, 2023 +================== +**New this release:** +- (client, [smithy-rs#3112](https://github.com/awslabs/smithy-rs/issues/3112), [smithy-rs#3116](https://github.com/awslabs/smithy-rs/issues/3116)) Upgrade `ring` to 0.17.5. + + October 31st, 2023 ================== **Breaking Changes:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index f06188ef369..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,10 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[smithy-rs]] -message = "Upgrade `ring` to 0.17.5." -references = ["smithy-rs#3112", "smithy-rs#3116"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 13b0a59f7c3..dafa5764858 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,175 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Implement std::error::Error#source() properly for the service meta Error enum.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "abusch", - "references": [ - "aws-sdk-rust#784" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "The outputs for event stream operations (for example, S3's SelectObjectContent) now implement the `Sync` auto-trait.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2496" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "The AWS SDK now compiles for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "eduardomourar", - "references": [ - "smithy-rs#2254" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "S3's `GetObject` will no longer panic when checksum validation is enabled and the target object was uploaded as a multi-part upload.\nHowever, these objects cannot be checksum validated by the SDK due to the way checksums are calculated for multipart uploads.\nFor more information, see [this page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums).\n", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#764" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "`AppName` is now configurable from within `ConfigLoader`.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2513" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "Add support for omitting session token in canonical requests for SigV4 signing.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "martinjlowm", - "references": [ - "smithy-rs#2473" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "parker-timmerman", - "references": [ - "smithy-rs#2525" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "Fix bug where an incorrect endpoint was produced for `WriteGetObjectResponse`", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#781", - "aws-sdk-rust#781" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "Update the `std::fmt::Debug` implementation for `aws-sigv4::SigningParams` so that it will no longer print sensitive information.", - "meta": { - "bug": true, - "breaking": false, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#2562" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "`aws_smithy_types::date_time::Format` has been re-exported in SDK crates.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2534" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "Reduce several instances of credential exposure in the SDK logs:\n- IMDS now suppresses the body of the response from logs\n- `aws-sigv4` marks the `x-amz-session-token` header as sensitive\n- STS & SSO credentials have been manually marked as sensitive which suppresses logging of response bodies for relevant operations\n", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2603" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, - { - "message": "Update MSRV to Rust 1.67.1", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2611" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 5 - }, { "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", "meta": { @@ -187,7 +18,7 @@ "smithy-rs#2694" ], "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", - "age": 4 + "age": 5 }, { "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", @@ -201,7 +32,7 @@ "smithy-rs#2815" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Add accessors to Builders", @@ -215,7 +46,7 @@ "smithy-rs#2791" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Remove native-tls and add a migration guide.", @@ -229,7 +60,7 @@ "smithy-rs#2675" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", @@ -244,7 +75,7 @@ "aws-sdk-rust#703" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", @@ -258,7 +89,7 @@ "smithy-rs#2720" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", @@ -272,7 +103,7 @@ "smithy-rs#2673" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", @@ -286,7 +117,7 @@ "smithy-rs#2730" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", @@ -302,7 +133,7 @@ "aws-sdk-rust#2087" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", @@ -318,7 +149,7 @@ "smithy-rs#2846" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", @@ -332,7 +163,7 @@ "smithy-rs#2742" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Update MSRV to Rust 1.69.0", @@ -346,7 +177,7 @@ "smithy-rs#2893" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", @@ -363,7 +194,7 @@ "smithy-rs#2616" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", @@ -377,7 +208,7 @@ "smithy-rs#2652" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", @@ -391,7 +222,7 @@ "smithy-rs#2783" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", @@ -405,7 +236,7 @@ "smithy-rs#2845" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", @@ -419,7 +250,7 @@ "smithy-rs#2724" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", @@ -434,7 +265,7 @@ "aws-sdk-rust#338" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", @@ -448,7 +279,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", @@ -462,7 +293,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", @@ -474,7 +305,7 @@ "author": "jdisanti", "references": [], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 3 + "age": 4 }, { "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", @@ -489,7 +320,7 @@ "aws-sdk-rust#862" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 2 + "age": 3 }, { "message": "Fix requests to S3 with `no_credentials` set.", @@ -504,7 +335,7 @@ "aws-sdk-rust#864" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 2 + "age": 3 }, { "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", @@ -519,7 +350,7 @@ "aws-sdk-rust#875" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 2 + "age": 3 }, { "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", @@ -534,7 +365,7 @@ "aws-sdk-rust#872" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 2 + "age": 3 }, { "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", @@ -548,7 +379,7 @@ "smithy-rs#2935" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 2 + "age": 3 }, { "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", @@ -562,7 +393,7 @@ "smithy-rs#2917" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", @@ -578,7 +409,7 @@ "aws-sdk-rust#699" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details.", @@ -592,7 +423,7 @@ "smithy-rs#3011" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", @@ -606,7 +437,7 @@ "smithy-rs#2921" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", @@ -620,7 +451,7 @@ "smithy-rs#2911" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929).", @@ -635,7 +466,7 @@ "aws-sdk-rust#536" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", @@ -649,7 +480,7 @@ "smithy-rs#2913" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Update MSRV to Rust 1.70.0", @@ -663,7 +494,7 @@ "smithy-rs#2948" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", @@ -678,7 +509,7 @@ "aws-sdk-rust#873" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Allow `no_credentials` to be used with all S3 operations.", @@ -693,7 +524,7 @@ "aws-sdk-rust#878" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", @@ -708,7 +539,7 @@ "smithy-rs#2951" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", @@ -724,7 +555,7 @@ "smithy-rs#2964" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Remove `once_cell` from public API.", @@ -738,7 +569,7 @@ "smithy-rs#2973" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Fix regression with redacting sensitive HTTP response bodies.", @@ -753,7 +584,7 @@ "smithy-rs#2972" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", @@ -767,7 +598,7 @@ "smithy-rs#2995" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", @@ -781,7 +612,7 @@ "smithy-rs#2978" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", @@ -795,7 +626,7 @@ "smithy-rs#1797" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", @@ -809,7 +640,7 @@ "smithy-rs#2983" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The IMDS Client builder's `build()` method is no longer async.", @@ -823,7 +654,7 @@ "smithy-rs#2997" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", @@ -837,7 +668,7 @@ "smithy-rs#3014" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", @@ -852,7 +683,7 @@ "smithy-rs#3007" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050).\n", @@ -867,7 +698,7 @@ "smithy-rs#3018" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", @@ -881,7 +712,7 @@ "smithy-rs#3055" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", @@ -895,7 +726,7 @@ "smithy-rs#3061" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", @@ -909,7 +740,7 @@ "smithy-rs#3065" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", @@ -923,7 +754,7 @@ "smithy-rs#3059" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", @@ -937,7 +768,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", @@ -951,7 +782,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 }, { "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", @@ -965,7 +796,7 @@ "smithy-rs#3077" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 1 + "age": 2 } ], "aws-sdk-model": [] From c8edefee9b8b08e84eb6b5fdc3ee7a0ad9c25d80 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 2 Nov 2023 11:41:09 -0400 Subject: [PATCH 224/331] Fix dry run credentials check (#3137) ## Motivation and Context - #3134 we should make this a publisher subcommand as well --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 670b68a2e63..101ebbc7c5c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -232,9 +232,9 @@ jobs: echo "Crates to publish not found!" exit 1 fi - # The following owner list command fails without a valid crates.io auth token echo "Checking cargo auth token..." - cargo owner --list aws-smithy-types + # This version has already been yanked. This command succeeds if we have a token with permission to yank the crate. + cargo yank aws-sigv4 --version 0.55.0 else publisher publish -y --location . fi From 59a4783330e8f76279f202a8ccef86b2e944f736 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 2 Nov 2023 12:10:28 -0400 Subject: [PATCH 225/331] First pass at optimizing SplitOnWordBoundaries (#3140) ## Motivation and Context @Velfi observed this function consuming a significant amount of codegen time. ## Description Optimize split on word boundaries, primarily by avoiding recomputation of `isStartOfWord` when we already know it isn't the start of a word. ## Testing - Original: 3.4s. Updated: 688ms - Existing tests are exhaustive On a `:aws:sdk:assemble` for the smoke test services, this improved from 53 seconds to 42 seconds ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy/rust/codegen/core/util/Strings.kt | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt index 244eace3613..3ef27312930 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt @@ -19,13 +19,16 @@ fun String.doubleQuote(): String = fun String.dq(): String = this.doubleQuote() private val completeWords: List = listOf("ipv4", "ipv6", "sigv4", "mib", "gib", "kib", "ttl") + private fun String.splitOnWordBoundaries(): List { val out = mutableListOf() // These are whole words but cased differently, e.g. `IPv4`, `MiB`, `GiB`, `TtL` var currentWord = "" + var completeWordInProgress = true // emit the current word and update from the next character val emit = { next: Char -> + completeWordInProgress = true if (currentWord.isNotEmpty()) { out += currentWord.lowercase() } @@ -37,13 +40,17 @@ private fun String.splitOnWordBoundaries(): List { } val allLowerCase = this.lowercase() == this this.forEachIndexed { index, nextCharacter -> - val peek = this.getOrNull(index + 1) - val doublePeek = this.getOrNull(index + 2) - val completeWordInProgress = completeWords.any { - (currentWord + this.substring(index)).lowercase().startsWith( - it, - ) - } && !completeWords.contains(currentWord.lowercase()) + val computeWordInProgress = { + val result = completeWordInProgress && currentWord.isNotEmpty() && completeWords.any { + it.startsWith(currentWord, ignoreCase = true) && (currentWord + this.substring(index)).startsWith( + it, + ignoreCase = true, + ) && !it.equals(currentWord, ignoreCase = true) + } + + completeWordInProgress = result + result + } when { // [C] in these docs indicates the value of nextCharacter // A[_]B @@ -53,15 +60,15 @@ private fun String.splitOnWordBoundaries(): List { currentWord.isEmpty() -> currentWord += nextCharacter.toString() // Abc[D]ef or Ab2[D]ef - !completeWordInProgress && loweredFollowedByUpper(currentWord, nextCharacter) -> emit(nextCharacter) + !computeWordInProgress() && loweredFollowedByUpper(currentWord, nextCharacter) -> emit(nextCharacter) // s3[k]ey - !completeWordInProgress && allLowerCase && digitFollowedByLower(currentWord, nextCharacter) -> emit( + !computeWordInProgress() && allLowerCase && digitFollowedByLower(currentWord, nextCharacter) -> emit( nextCharacter, ) // DB[P]roxy, or `IAM[U]ser` but not AC[L]s - endOfAcronym(currentWord, nextCharacter, peek, doublePeek) -> emit(nextCharacter) + endOfAcronym(currentWord, nextCharacter, this.getOrNull(index + 1), this.getOrNull(index + 2)) -> emit(nextCharacter) // If we haven't found a word boundary, push it and keep going else -> currentWord += nextCharacter.toString() From 8abeb04f5e3457a280ba022c7b9ee716aa677909 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 2 Nov 2023 10:48:31 -0700 Subject: [PATCH 226/331] Move http types out of client and split headers out of request (#3138) This PR moves the HTTP types into the root of aws-smithy-runtime-api since they're not client-specific, and the serializers/deserializers will need to rely on them. It also refactors the headers and errors out of the request module. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 + .../aws-smithy-protocol-test/src/lib.rs | 4 +- .../aws-smithy-runtime-api/src/client/http.rs | 22 +- .../src/client/http/response.rs | 6 - .../src/client/orchestrator.rs | 2 +- .../aws-smithy-runtime-api/src/http.rs | 14 + .../aws-smithy-runtime-api/src/http/error.rs | 54 +++ .../src/http/headers.rs | 343 ++++++++++++++++ .../src/{client => }/http/request.rs | 382 +----------------- .../aws-smithy-runtime-api/src/lib.rs | 2 + .../src/client/http/test_util/dvr.rs | 4 +- 11 files changed, 449 insertions(+), 390 deletions(-) delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/http.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/http/error.rs create mode 100644 rust-runtime/aws-smithy-runtime-api/src/http/headers.rs rename rust-runtime/aws-smithy-runtime-api/src/{client => }/http/request.rs (50%) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b4f5b3b8b6c..79f95dc7184 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -16,3 +16,9 @@ message = "Fix aws-sdk-rust#930 (PutSnapshotBlock)" references = ["smithy-rs#3126", "aws-sdk-rust#930"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "rcoh" + +[[smithy-rs]] +message = "The HTTP `Request`, `Response`, `Headers`, and `HeaderValue` types have been moved from `aws_smithy_runtime_api::client::http::*` into `aws_smithy_runtime_api::http`" +references = ["smithy-rs#3138"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/rust-runtime/aws-smithy-protocol-test/src/lib.rs b/rust-runtime/aws-smithy-protocol-test/src/lib.rs index e1b2f6adfc9..92d9f5c4f3d 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/lib.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/lib.rs @@ -16,8 +16,8 @@ mod xml; use crate::sealed::GetNormalizedHeader; use crate::xml::try_xml_equivalent; use assert_json_diff::assert_json_eq_no_panic; -use aws_smithy_runtime_api::client::http::request::Headers; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::http::Headers; use http::{HeaderMap, Uri}; use pretty_assertions::Comparison; use std::collections::HashSet; @@ -413,8 +413,8 @@ mod tests { forbid_headers, forbid_query_params, require_headers, require_query_params, validate_body, validate_headers, validate_query_string, FloatEquals, MediaType, ProtocolTestFailure, }; - use aws_smithy_runtime_api::client::http::request::Headers; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::http::Headers; fn make_request(uri: &str) -> HttpRequest { let mut req = HttpRequest::empty(); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index f6e3f03c804..480f74208e4 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -50,9 +50,6 @@ //! [`tower`]: https://crates.io/crates/tower //! [`aws-smithy-runtime`]: https://crates.io/crates/aws-smithy-runtime -pub mod request; -pub mod response; - use crate::client::orchestrator::{HttpRequest, HttpResponse}; use crate::client::result::ConnectorError; use crate::client::runtime_components::sealed::ValidateConfig; @@ -62,6 +59,25 @@ use std::fmt; use std::sync::Arc; use std::time::Duration; +/// Http Request Types +pub mod request { + /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HttpError`. + #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HttpError`.")] + pub type HttpError = crate::http::HttpError; + /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HeaderValue`. + #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HeaderValue`.")] + pub type HeaderValue = crate::http::HeaderValue; + /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::Headers`. + #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Headers`.")] + pub type Headers = crate::http::Headers; + /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HeadersIter`. + #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HeadersIter`.")] + pub type HeadersIter<'a> = crate::http::HeadersIter<'a>; + /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::Request`. + #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Request`.")] + pub type Request = crate::http::Request; +} + new_type_future! { #[doc = "Future for [`HttpConnector::call`]."] pub struct HttpConnectorFuture<'static, HttpResponse, ConnectorError>; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs deleted file mode 100644 index 518961d6d1a..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http/response.rs +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Http Response Types diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 4282534a4c8..b718bb9116d 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -28,7 +28,7 @@ use std::error::Error as StdError; use std::fmt; /// Type alias for the HTTP request type that the orchestrator uses. -pub type HttpRequest = crate::client::http::request::Request; +pub type HttpRequest = crate::http::Request; /// Type alias for the HTTP response type that the orchestrator uses. pub type HttpResponse = http::Response; diff --git a/rust-runtime/aws-smithy-runtime-api/src/http.rs b/rust-runtime/aws-smithy-runtime-api/src/http.rs new file mode 100644 index 00000000000..8d76dc7434d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http.rs @@ -0,0 +1,14 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! HTTP request and response types + +mod error; +mod headers; +mod request; + +pub use error::HttpError; +pub use headers::{HeaderValue, Headers, HeadersIter}; +pub use request::Request; diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/error.rs b/rust-runtime/aws-smithy-runtime-api/src/http/error.rs new file mode 100644 index 00000000000..8c47334960f --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/error.rs @@ -0,0 +1,54 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Error types for HTTP requests/responses. + +use crate::box_error::BoxError; +use http::header::{InvalidHeaderName, InvalidHeaderValue}; +use http::uri::InvalidUri; +use std::error::Error; +use std::fmt::{Debug, Display, Formatter}; +use std::str::Utf8Error; + +#[derive(Debug)] +/// An error occurred constructing an Http Request. +/// +/// This is normally due to configuration issues, internal SDK bugs, or other user error. +pub struct HttpError(BoxError); + +impl HttpError { + // TODO(httpRefactor): Add better error internals + pub(super) fn new>>(err: E) -> Self { + HttpError(err.into()) + } + + pub(super) fn invalid_header_value(err: InvalidHeaderValue) -> Self { + Self(err.into()) + } + + pub(super) fn header_was_not_a_string(err: Utf8Error) -> Self { + Self(err.into()) + } + + pub(super) fn invalid_header_name(err: InvalidHeaderName) -> Self { + Self(err.into()) + } + + pub(super) fn invalid_uri(err: InvalidUri) -> Self { + Self(err.into()) + } +} + +impl Display for HttpError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "an error occurred creating an HTTP Request") + } +} + +impl Error for HttpError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(self.0.as_ref()) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs new file mode 100644 index 00000000000..e0e1457c7a0 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs @@ -0,0 +1,343 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types for HTTP headers + +use crate::http::error::HttpError; +use http as http0; +use http0::header::Iter; +use http0::HeaderMap; +use std::borrow::Cow; +use std::fmt::Debug; +use std::str::FromStr; + +/// An immutable view of headers +#[derive(Clone, Default, Debug)] +pub struct Headers { + pub(super) headers: HeaderMap, +} + +impl<'a> IntoIterator for &'a Headers { + type Item = (&'a str, &'a str); + type IntoIter = HeadersIter<'a>; + + fn into_iter(self) -> Self::IntoIter { + HeadersIter { + inner: self.headers.iter(), + } + } +} + +/// An Iterator over headers +pub struct HeadersIter<'a> { + inner: Iter<'a, HeaderValue>, +} + +impl<'a> Iterator for HeadersIter<'a> { + type Item = (&'a str, &'a str); + + fn next(&mut self) -> Option { + self.inner.next().map(|(k, v)| (k.as_str(), v.as_ref())) + } +} + +impl Headers { + /// Create an empty header map + pub fn new() -> Self { + Self::default() + } + + /// Returns the value for a given key + /// + /// If multiple values are associated, the first value is returned + /// See [HeaderMap::get] + pub fn get(&self, key: impl AsRef) -> Option<&str> { + self.headers.get(key.as_ref()).map(|v| v.as_ref()) + } + + /// Returns all values for a given key + pub fn get_all(&self, key: impl AsRef) -> impl Iterator { + self.headers + .get_all(key.as_ref()) + .iter() + .map(|v| v.as_ref()) + } + + /// Returns an iterator over the headers + pub fn iter(&self) -> HeadersIter<'_> { + HeadersIter { + inner: self.headers.iter(), + } + } + + /// Returns the total number of **values** stored in the map + pub fn len(&self) -> usize { + self.headers.len() + } + + /// Returns true if there are no headers + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Returns true if this header is present + pub fn contains_key(&self, key: &str) -> bool { + self.headers.contains_key(key) + } + + /// Insert a value into the headers structure. + /// + /// This will *replace* any existing value for this key. Returns the previous associated value if any. + /// + /// # Panics + /// If the key or value are not valid ascii, this function will panic. + pub fn insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Option { + self.try_insert(key, value) + .expect("HeaderName or HeaderValue was invalid") + } + + /// Insert a value into the headers structure. + /// + /// This will *replace* any existing value for this key. Returns the previous associated value if any. + /// + /// If the key or value are not valid ascii, an error is returned + pub fn try_insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result, HttpError> { + let key = header_name(key)?; + let value = header_value(value.into_maybe_static()?)?; + Ok(self + .headers + .insert(key, value) + .map(|old_value| old_value.into())) + } + + /// Appends a value to a given key + /// + /// If the key or value are NOT valid ascii, an error is returned + pub fn try_append( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result { + let key = header_name(key.into_maybe_static()?)?; + let value = header_value(value.into_maybe_static()?)?; + Ok(self.headers.append(key, value)) + } + + /// Removes all headers with a given key + /// + /// If there are multiple entries for this key, the first entry is returned + pub fn remove(&mut self, key: impl AsRef) -> Option { + self.headers + .remove(key.as_ref()) + .map(|h| h.as_str().to_string()) + } + + /// Appends a value to a given key + /// + /// # Panics + /// If the key or value are NOT valid ascii, this function will panic + pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool { + self.try_append(key, value) + .expect("HeaderName or HeaderValue was invalid") + } +} + +use sealed::AsHeaderComponent; + +mod sealed { + use super::*; + /// Trait defining things that may be converted into a header component (name or value) + pub trait AsHeaderComponent { + /// If the component can be represented as a Cow<'static, str>, return it + fn into_maybe_static(self) -> Result; + + /// Return a string reference to this header + fn as_str(&self) -> Result<&str, HttpError>; + + /// If a component is already internally represented as a `http02x::HeaderName`, return it + fn repr_as_http02x_header_name(self) -> Result + where + Self: Sized, + { + Err(self) + } + } + + impl AsHeaderComponent for &'static str { + fn into_maybe_static(self) -> Result { + Ok(Cow::Borrowed(self)) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self) + } + } + + impl AsHeaderComponent for String { + fn into_maybe_static(self) -> Result { + Ok(Cow::Owned(self)) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self) + } + } + + impl AsHeaderComponent for Cow<'static, str> { + fn into_maybe_static(self) -> Result { + Ok(self) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self.as_ref()) + } + } + + impl AsHeaderComponent for http0::HeaderValue { + fn into_maybe_static(self) -> Result { + Ok(Cow::Owned( + std::str::from_utf8(self.as_bytes()) + .map_err(HttpError::header_was_not_a_string)? + .to_string(), + )) + } + + fn as_str(&self) -> Result<&str, HttpError> { + std::str::from_utf8(self.as_bytes()).map_err(HttpError::header_was_not_a_string) + } + } + + impl AsHeaderComponent for http0::HeaderName { + fn into_maybe_static(self) -> Result { + Ok(self.to_string().into()) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self.as_ref()) + } + + fn repr_as_http02x_header_name(self) -> Result + where + Self: Sized, + { + Ok(self) + } + } +} + +mod header_value { + use super::*; + use std::str::Utf8Error; + + /// HeaderValue type + /// + /// **Note**: Unlike `HeaderValue` in `http`, this only supports UTF-8 header values + #[derive(Debug, Clone)] + pub struct HeaderValue { + _private: http0::HeaderValue, + } + + impl HeaderValue { + pub(crate) fn from_http02x(value: http0::HeaderValue) -> Result { + let _ = std::str::from_utf8(value.as_bytes())?; + Ok(Self { _private: value }) + } + + pub(crate) fn into_http02x(self) -> http0::HeaderValue { + self._private + } + } + + impl AsRef for HeaderValue { + fn as_ref(&self) -> &str { + std::str::from_utf8(self._private.as_bytes()) + .expect("unreachable—only strings may be stored") + } + } + + impl From for String { + fn from(value: HeaderValue) -> Self { + value.as_ref().to_string() + } + } + + impl HeaderValue { + /// Returns the string representation of this header value + pub fn as_str(&self) -> &str { + self.as_ref() + } + } + + impl FromStr for HeaderValue { + type Err = HttpError; + + fn from_str(s: &str) -> Result { + HeaderValue::try_from(s.to_string()) + } + } + + impl TryFrom for HeaderValue { + type Error = HttpError; + + fn try_from(value: String) -> Result { + Ok(HeaderValue::from_http02x( + http0::HeaderValue::try_from(value).map_err(HttpError::invalid_header_value)?, + ) + .expect("input was a string")) + } + } +} + +pub use header_value::HeaderValue; + +type MaybeStatic = Cow<'static, str>; + +fn header_name(name: impl AsHeaderComponent) -> Result { + name.repr_as_http02x_header_name().or_else(|name| { + name.into_maybe_static().and_then(|cow| { + if cow.chars().any(|c| c.is_uppercase()) { + return Err(HttpError::new("Header names must be all lower case")); + } + match cow { + Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), + Cow::Owned(s) => { + http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) + } + } + }) + }) +} + +fn header_value(value: MaybeStatic) -> Result { + let header = match value { + Cow::Borrowed(b) => http0::HeaderValue::from_static(b), + Cow::Owned(s) => { + http0::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)? + } + }; + HeaderValue::from_http02x(header).map_err(HttpError::new) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn headers_can_be_any_string() { + let _: HeaderValue = "😹".parse().expect("can be any string"); + let _: HeaderValue = "abcd".parse().expect("can be any string"); + let _ = "a\nb" + .parse::() + .expect_err("cannot contain control characters"); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs similarity index 50% rename from rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs rename to rust-runtime/aws-smithy-runtime-api/src/http/request.rs index 5b4172160df..b75ea583b7d 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs @@ -5,17 +5,13 @@ //! Http Request Types +use crate::http::error::HttpError; +use crate::http::headers::{HeaderValue, Headers}; use aws_smithy_types::body::SdkBody; use http as http0; -use http::header::{InvalidHeaderName, InvalidHeaderValue}; -use http::uri::InvalidUri; -use http0::header::Iter; use http0::uri::PathAndQuery; use http0::{Extensions, HeaderMap, Method}; use std::borrow::Cow; -use std::error::Error; -use std::fmt::{Debug, Display, Formatter}; -use std::str::{FromStr, Utf8Error}; #[derive(Debug)] /// An HTTP Request Type @@ -230,7 +226,7 @@ impl Request { }) } - /// Replaces this requests body with [`SdkBody::taken()`] + /// Replaces this request's body with [`SdkBody::taken()`] pub fn take_body(&mut self) -> SdkBody { std::mem::replace(self.body_mut(), SdkBody::taken()) } @@ -281,378 +277,12 @@ impl TryFrom> for Request { } } -/// An immutable view of request headers -#[derive(Clone, Default, Debug)] -pub struct Headers { - headers: HeaderMap, -} - -impl<'a> IntoIterator for &'a Headers { - type Item = (&'a str, &'a str); - type IntoIter = HeadersIter<'a>; - - fn into_iter(self) -> Self::IntoIter { - HeadersIter { - inner: self.headers.iter(), - } - } -} - -/// An Iterator over headers -pub struct HeadersIter<'a> { - inner: Iter<'a, HeaderValue>, -} - -impl<'a> Iterator for HeadersIter<'a> { - type Item = (&'a str, &'a str); - - fn next(&mut self) -> Option { - self.inner.next().map(|(k, v)| (k.as_str(), v.as_ref())) - } -} - -impl Headers { - /// Create an empty header map - pub fn new() -> Self { - Self::default() - } - - /// Returns the value for a given key - /// - /// If multiple values are associated, the first value is returned - /// See [HeaderMap::get] - pub fn get(&self, key: impl AsRef) -> Option<&str> { - self.headers.get(key.as_ref()).map(|v| v.as_ref()) - } - - /// Returns all values for a given key - pub fn get_all(&self, key: impl AsRef) -> impl Iterator { - self.headers - .get_all(key.as_ref()) - .iter() - .map(|v| v.as_ref()) - } - - /// Returns an iterator over the headers - pub fn iter(&self) -> HeadersIter<'_> { - HeadersIter { - inner: self.headers.iter(), - } - } - - /// Returns the total number of **values** stored in the map - pub fn len(&self) -> usize { - self.headers.len() - } - - /// Returns true if there are no headers - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Returns true if this header is present - pub fn contains_key(&self, key: &str) -> bool { - self.headers.contains_key(key) - } - - /// Insert a value into the headers structure. - /// - /// This will *replace* any existing value for this key. Returns the previous associated value if any. - /// - /// # Panics - /// If the key or value are not valid ascii, this function will panic. - pub fn insert( - &mut self, - key: impl AsHeaderComponent, - value: impl AsHeaderComponent, - ) -> Option { - self.try_insert(key, value) - .expect("HeaderName or HeaderValue was invalid") - } - - /// Insert a value into the headers structure. - /// - /// This will *replace* any existing value for this key. Returns the previous associated value if any. - /// - /// If the key or value are not valid ascii, an error is returned - pub fn try_insert( - &mut self, - key: impl AsHeaderComponent, - value: impl AsHeaderComponent, - ) -> Result, HttpError> { - let key = header_name(key)?; - let value = header_value(value.into_maybe_static()?)?; - Ok(self - .headers - .insert(key, value) - .map(|old_value| old_value.into())) - } - - /// Appends a value to a given key - /// - /// If the key or value are NOT valid ascii, an error is returned - pub fn try_append( - &mut self, - key: impl AsHeaderComponent, - value: impl AsHeaderComponent, - ) -> Result { - let key = header_name(key.into_maybe_static()?)?; - let value = header_value(value.into_maybe_static()?)?; - Ok(self.headers.append(key, value)) - } - - /// Removes all headers with a given key - /// - /// If there are multiple entries for this key, the first entry is returned - pub fn remove(&mut self, key: impl AsRef) -> Option { - self.headers - .remove(key.as_ref()) - .map(|h| h.as_str().to_string()) - } - - /// Appends a value to a given key - /// - /// # Panics - /// If the key or value are NOT valid ascii, this function will panic - pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool { - self.try_append(key, value) - .expect("HeaderName or HeaderValue was invalid") - } -} - -use sealed::AsHeaderComponent; - -mod sealed { - use super::*; - /// Trait defining things that may be converted into a header component (name or value) - pub trait AsHeaderComponent { - /// If the component can be represented as a Cow<'static, str>, return it - fn into_maybe_static(self) -> Result; - - /// Return a string reference to this header - fn as_str(&self) -> Result<&str, HttpError>; - - /// If a component is already internally represented as a `http02x::HeaderName`, return it - fn repr_as_http02x_header_name(self) -> Result - where - Self: Sized, - { - Err(self) - } - } - - impl AsHeaderComponent for &'static str { - fn into_maybe_static(self) -> Result { - Ok(Cow::Borrowed(self)) - } - - fn as_str(&self) -> Result<&str, HttpError> { - Ok(self) - } - } - - impl AsHeaderComponent for String { - fn into_maybe_static(self) -> Result { - Ok(Cow::Owned(self)) - } - - fn as_str(&self) -> Result<&str, HttpError> { - Ok(self) - } - } - - impl AsHeaderComponent for Cow<'static, str> { - fn into_maybe_static(self) -> Result { - Ok(self) - } - - fn as_str(&self) -> Result<&str, HttpError> { - Ok(self.as_ref()) - } - } - - impl AsHeaderComponent for http0::HeaderValue { - fn into_maybe_static(self) -> Result { - Ok(Cow::Owned( - std::str::from_utf8(self.as_bytes()) - .map_err(HttpError::header_was_not_a_string)? - .to_string(), - )) - } - - fn as_str(&self) -> Result<&str, HttpError> { - std::str::from_utf8(self.as_bytes()).map_err(HttpError::header_was_not_a_string) - } - } - - impl AsHeaderComponent for http0::HeaderName { - fn into_maybe_static(self) -> Result { - Ok(self.to_string().into()) - } - - fn as_str(&self) -> Result<&str, HttpError> { - Ok(self.as_ref()) - } - - fn repr_as_http02x_header_name(self) -> Result - where - Self: Sized, - { - Ok(self) - } - } -} - -mod header_value { - use super::http0; - use std::str::Utf8Error; - - /// HeaderValue type - /// - /// **Note**: Unlike `HeaderValue` in `http`, this only supports UTF-8 header values - #[derive(Debug, Clone)] - pub struct HeaderValue { - _private: http0::HeaderValue, - } - - impl HeaderValue { - pub(crate) fn from_http02x(value: http0::HeaderValue) -> Result { - let _ = std::str::from_utf8(value.as_bytes())?; - Ok(Self { _private: value }) - } - - pub(crate) fn into_http02x(self) -> http0::HeaderValue { - self._private - } - } - - impl AsRef for HeaderValue { - fn as_ref(&self) -> &str { - std::str::from_utf8(self._private.as_bytes()) - .expect("unreachable—only strings may be stored") - } - } - - impl From for String { - fn from(value: HeaderValue) -> Self { - value.as_ref().to_string() - } - } -} - -use crate::box_error::BoxError; -pub use header_value::HeaderValue; - -impl HeaderValue { - /// Returns the string representation of this header value - pub fn as_str(&self) -> &str { - self.as_ref() - } -} - -impl FromStr for HeaderValue { - type Err = HttpError; - - fn from_str(s: &str) -> Result { - HeaderValue::try_from(s.to_string()) - } -} - -impl TryFrom for HeaderValue { - type Error = HttpError; - - fn try_from(value: String) -> Result { - Ok(HeaderValue::from_http02x( - http0::HeaderValue::try_from(value).map_err(HttpError::invalid_header_value)?, - ) - .expect("input was a string")) - } -} - -type MaybeStatic = Cow<'static, str>; - -#[derive(Debug)] -/// An error occurred constructing an Http Request. -/// -/// This is normally due to configuration issues, internal SDK bugs, or other user error. -pub struct HttpError(BoxError); - -impl HttpError { - // TODO(httpRefactor): Add better error internals - fn new>>(err: E) -> Self { - HttpError(err.into()) - } - - fn invalid_header_value(err: InvalidHeaderValue) -> Self { - Self(err.into()) - } - - fn header_was_not_a_string(err: Utf8Error) -> Self { - Self(err.into()) - } - - fn invalid_header_name(err: InvalidHeaderName) -> Self { - Self(err.into()) - } - - fn invalid_uri(err: InvalidUri) -> Self { - Self(err.into()) - } -} - -impl Display for HttpError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "an error occurred creating an HTTP Request") - } -} - -impl Error for HttpError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - Some(self.0.as_ref()) - } -} - -fn header_name(name: impl AsHeaderComponent) -> Result { - name.repr_as_http02x_header_name().or_else(|name| { - name.into_maybe_static().and_then(|cow| { - if cow.chars().any(|c| c.is_uppercase()) { - return Err(HttpError::new("Header names must be all lower case")); - } - match cow { - Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), - Cow::Owned(s) => { - http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) - } - } - }) - }) -} - -fn header_value(value: MaybeStatic) -> Result { - let header = match value { - Cow::Borrowed(b) => http0::HeaderValue::from_static(b), - Cow::Owned(s) => { - http0::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)? - } - }; - HeaderValue::from_http02x(header).map_err(HttpError::new) -} - #[cfg(test)] mod test { - use crate::client::orchestrator::HttpRequest; + use super::*; use aws_smithy_types::body::SdkBody; use http::header::{AUTHORIZATION, CONTENT_LENGTH}; - use http::{HeaderValue, Uri}; - - #[test] - fn headers_can_be_any_string() { - let _: HeaderValue = "😹".parse().expect("can be any string"); - let _: HeaderValue = "abcd".parse().expect("can be any string"); - let _ = "a\nb" - .parse::() - .expect_err("cannot contain control characters"); - } + use http::Uri; #[test] fn non_ascii_requests() { @@ -660,7 +290,7 @@ mod test { .header("k", "😹") .body(SdkBody::empty()) .unwrap(); - let request: HttpRequest = request + let request: Request = request .try_into() .expect("failed to convert a non-string header"); assert_eq!(request.headers().get("k"), Some("😹")) diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index 56b65f209a1..9a7897d6dcf 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -31,6 +31,8 @@ pub mod box_error; #[cfg(feature = "client")] pub mod client; +pub mod http; + /// Internal builder macros. Not intended to be used outside of the aws-smithy-runtime crates. #[doc(hidden)] pub mod macros; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index 5f50faaed7d..1fdf61ac4d2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -9,6 +9,8 @@ //! //! DVR is an extremely experimental record & replay framework that supports multi-frame HTTP request / response traffic. +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::http::Headers; use aws_smithy_types::base64; use bytes::Bytes; use http::HeaderMap; @@ -19,8 +21,6 @@ mod record; mod replay; pub use aws_smithy_protocol_test::MediaType; -use aws_smithy_runtime_api::client::http::request::Headers; -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; pub use record::RecordingClient; pub use replay::ReplayingClient; From b694ee2ae118504fc6a78def1c4d6af2d64ff917 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 2 Nov 2023 13:08:30 -0500 Subject: [PATCH 227/331] Update Canary OIDC provider, NPM commands, and previous version pagination test (#3142) The OIDC provider no longer needs to specify the thumbprints now; In the IAM Identity Provider console it says that those are now sourced automatically. I also updated the npm commands to build and deploy everything instead of just the canary and I added a trait import to the previous version canary in the hope of getting past that warning that only appears in CI. If that doesn't fix it, then Yuki will when he takes a look next week. - update canary npm commands - update canary OIDC provider stack - add missing trait to previous version canary ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../release_2023_10_26/paginator_canary.rs | 5 ++--- .../src/release_2023_10_26/s3_canary.rs | 14 ++++++++++++-- tools/ci-cdk/lib/oidc-provider-stack.ts | 19 ------------------- tools/ci-cdk/package.json | 4 ++-- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs index 744b6614654..199dfeea910 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs @@ -4,12 +4,11 @@ */ use crate::mk_canary; +use crate::CanaryEnv; use anyhow::bail; - use aws_sdk_ec2 as ec2; use aws_sdk_ec2::types::InstanceType; - -use crate::CanaryEnv; +use tokio_stream::StreamExt; mk_canary!( "ec2_paginator", diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs index fbcba976d86..03b435086fe 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs @@ -17,10 +17,15 @@ const METADATA_TEST_VALUE: &str = "some value"; mk_canary!("s3", |sdk_config: &SdkConfig, env: &CanaryEnv| s3_canary( s3::Client::new(sdk_config), - env.s3_bucket_name.clone() + env.s3_bucket_name.clone(), + env.s3_mrap_bucket_arn.clone() )); -pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Result<()> { +pub async fn s3_canary( + client: s3::Client, + s3_bucket_name: String, + _s3_mrap_bucket_arn: String, +) -> anyhow::Result<()> { let test_key = Uuid::new_v4().as_u128().to_string(); // Look for the test object and expect that it doesn't exist @@ -110,6 +115,10 @@ pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Re result = Err(CanaryError("S3 object body didn't match what was put there".into()).into()); } + { + println!("skipping MRAP tests because they're unsupported in this version.") + } + // Delete the test object client .delete_object() @@ -134,6 +143,7 @@ async fn test_s3_canary() { s3_canary( client, std::env::var("TEST_S3_BUCKET").expect("TEST_S3_BUCKET must be set"), + "MRAP bucket ARN is unused in this version.".to_owned(), ) .await .expect("success"); diff --git a/tools/ci-cdk/lib/oidc-provider-stack.ts b/tools/ci-cdk/lib/oidc-provider-stack.ts index 45a0d40cee0..8b5118ab195 100644 --- a/tools/ci-cdk/lib/oidc-provider-stack.ts +++ b/tools/ci-cdk/lib/oidc-provider-stack.ts @@ -7,24 +7,6 @@ import { OpenIdConnectProvider } from "aws-cdk-lib/aws-iam"; import { StackProps, Stack, Tags } from "aws-cdk-lib"; import { Construct } from "constructs"; -/// This thumbprint is used to validate GitHub's identity to AWS. This is -/// just a SHA-1 hash of the top intermediate certificate authority's certificate. -/// It may need to be updated when GitHub's certificate renews and this -/// thumbprint changes. -/// -/// It was obtained by following instructions at: -/// https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html -/// -/// This was done with the initial Idp URL of: -/// https://token.actions.githubusercontent.com/.well-known/openid-configuration -/// -/// Note: as of June 27, 2023, there are now two possible thumbprints from GitHub: -/// https://github.blog/changelog/2023-06-27-github-actions-update-on-oidc-integration-with-aws/ -export const GITHUB_CERTIFICATE_THUMBPRINTS = [ - "6938FD4D98BAB03FAADB97B34396831E3780AEA1", - "1C58A3A8518E8759BF075B76B750D4F2DF264FCD", -]; - // There can only be one OIDC provider for a given URL per AWS account, // so put these in their own stack to be shared with other stacks. export class OidcProviderStack extends Stack { @@ -38,7 +20,6 @@ export class OidcProviderStack extends Stack { this.githubActionsOidcProvider = new OpenIdConnectProvider(this, "oidc-provider", { url: "https://token.actions.githubusercontent.com", - thumbprints: GITHUB_CERTIFICATE_THUMBPRINTS, clientIds: ["sts.amazonaws.com"], }); } diff --git a/tools/ci-cdk/package.json b/tools/ci-cdk/package.json index 89d87d31221..dd991ee413d 100644 --- a/tools/ci-cdk/package.json +++ b/tools/ci-cdk/package.json @@ -6,9 +6,9 @@ "rust-sdk-ci-cdk": "bin/ci-cdk.js" }, "scripts": { - "build": "tsc && cdk --app \"node build/bin/canary-only.js\" synth", + "build": "tsc && cdk --app \"node build/bin/ci-cdk.js\" synth", "cdk": "cdk", - "deploy": "cdk --app \"node build/bin/canary-only.js\" deploy --outputs-file cdk-outputs.json", + "deploy": "cdk --app \"node build/bin/ci-cdk.js\" deploy --outputs-file cdk-outputs.json --all", "format": "prettier --write '**/*.ts'", "lint": "eslint --ext .ts lib", "test": "jest", From cfdec948dca5fa6717e6abc9a2f18297dc512120 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 2 Nov 2023 16:32:01 -0400 Subject: [PATCH 228/331] Re-export generic default (#3144) ## Motivation and Context Fix examples ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-runtime-api/src/client/http.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index 480f74208e4..2ea777175cf 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -61,6 +61,7 @@ use std::time::Duration; /// Http Request Types pub mod request { + use aws_smithy_types::body::SdkBody; /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HttpError`. #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HttpError`.")] pub type HttpError = crate::http::HttpError; @@ -75,7 +76,7 @@ pub mod request { pub type HeadersIter<'a> = crate::http::HeadersIter<'a>; /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::Request`. #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Request`.")] - pub type Request = crate::http::Request; + pub type Request = crate::http::Request; } new_type_future! { @@ -279,3 +280,19 @@ impl HttpConnectorSettings { self.read_timeout } } + +#[cfg(test)] +mod test { + #[test] + #[allow(deprecated)] + fn re_export_has_default_generic() { + let req1 = super::request::Request::empty(); + let req2 = super::request::Request::<()>::new(()); + fn takes_req(_req: &super::request::Request) {} + fn takes_generic_req(_req: &super::request::Request) {} + + takes_req(&req1); + takes_generic_req(&req1); + takes_generic_req(&req2); + } +} From 315d88b6d43832284f48700f6d71d8d402578c23 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Thu, 2 Nov 2023 20:32:26 +0000 Subject: [PATCH 229/331] Lifetimes of inner references (#3141) We weren't computing inner lifetimes, e.g. `Option(&'a ...)` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../amazon/smithy/rust/codegen/core/rustlang/RustType.kt | 7 +++++++ .../codegen/core/smithy/generators/StructureGenerator.kt | 3 ++- .../smithy/rust/codegen/core/rustlang/RustTypeTest.kt | 9 +++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 873ead1bc85..f20572bbd3c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -284,6 +284,13 @@ inline fun RustType.stripOuter(): RustType = wh else -> this } +/** Extracts the inner Reference type */ +fun RustType.innerReference(): RustType? = when (this) { + is RustType.Reference -> this + is RustType.Container -> this.member.innerReference() + else -> null +} + /** Wraps a type in Option if it isn't already */ fun RustType.asOptional(): RustType = when (this) { is RustType.Option -> this diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt index 5c9635c5a8c..d30365bba4c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt @@ -18,6 +18,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.asRef import software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape +import software.amazon.smithy.rust.codegen.core.rustlang.innerReference import software.amazon.smithy.rust.codegen.core.rustlang.isCopy import software.amazon.smithy.rust.codegen.core.rustlang.isDeref import software.amazon.smithy.rust.codegen.core.rustlang.render @@ -93,7 +94,7 @@ open class StructureGenerator( */ private fun lifetimeDeclaration(): String { val lifetimes = members - .map { symbolProvider.toSymbol(it).rustType() } + .map { symbolProvider.toSymbol(it).rustType().innerReference() } .mapNotNull { when (it) { is RustType.Reference -> it.lifetime diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt index c0443166f90..fcd9583d497 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt @@ -220,4 +220,13 @@ internal class RustTypesTest { val attributeMacro = Attribute(derive()) forInputExpectOutput(writable { attributeMacro.render(this) }, "") } + + @Test + fun `finds inner reference type`() { + val innerReference = RustType.Reference("a", RustType.Bool) + val type = RustType.Box(RustType.Option(innerReference)) + + type.innerReference() shouldBe innerReference + RustType.Bool.innerReference() shouldBe null + } } From c296e8e999b10e381d7a4e58ee21023c6c38bb7a Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Mon, 6 Nov 2023 14:00:31 -0600 Subject: [PATCH 230/331] Move `Message`, `Header`, `HeaderValue`, and `StrBytes` from `aws-smithy-eventstream` to `aws-smithy-types` (#3139) ## Motivation and Context Fixes the following statement in https://github.com/awslabs/smithy-rs/pull/3114 > A notable breaking change is the error type of the new recv method. Previously, it was [SdkError>](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv) but it is now a BoxError. This means that upon an event receive error, customers can only show what the error is, but not match on it and take some actions. so that the `recv` method on a new-type wrapper `aws_smithy_http::event_stream::Receiver` can expose `SdkError>` in public API. It is the responsibility of the above PR to move [RawMessage](https://github.com/awslabs/smithy-rs/blob/c7f0d5dc33937d65841d74b5b828cc77ed1d2db4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L92-L98) from `aws-smithy-http` to `aws-smithy-types` but doing so first requires `Message` to be moved to `aws-smithy-types`, hence this PR. ## Description Moving `Message` to `aws-smithy-types` also requires moving the types it depends upon, namely `Header`, `HederValue`, and `StrBytes`. However, their serialization/deserialization methods (`read_from` and `write_to`) remain in `aws-smithy-eventstream` and they are converted to free functions, with the aim of moving things as minimally as possible. `aws-smithy-eventstream` has fuzz testing. It previously implemented the `Arbitrary` trait for moved types, but since they are now in `aws-smithy-types`, we need to have newtypes for them to enable the trait due to the orphan rules. A newly added module `aws-smithy-eventstream::arbitrary` is exactly for that purpose. ## Testing Relied on the existing tests. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 + .../aws-runtime/src/auth/sigv4.rs | 6 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 1 + .../aws-sigv4/external-types.toml | 2 +- .../aws-sigv4/src/event_stream.rs | 12 +- .../transcribestreaming/tests/test.rs | 5 +- .../codegen/client/smithy/ClientRustModule.kt | 14 +- .../customize/RequiredCustomizations.kt | 6 +- .../smithy/generators/ClientEnumGenerator.kt | 2 +- .../customizations/SmithyTypesPubUseExtra.kt | 20 + .../parse/EventStreamUnmarshallerGenerator.kt | 7 +- .../EventStreamErrorMarshallerGenerator.kt | 7 +- .../EventStreamMarshallerGenerator.kt | 7 +- .../testutil/EventStreamMarshallTestCases.kt | 3 +- .../EventStreamUnmarshallTestCases.kt | 3 +- .../fuzz_targets/corrected_prelude_crc.rs | 4 +- .../fuzz/fuzz_targets/mutated_headers.rs | 9 +- .../fuzz/fuzz_targets/prelude.rs | 7 +- .../fuzz/fuzz_targets/raw_bytes.rs | 4 +- .../fuzz/fuzz_targets/round_trip.rs | 24 +- .../aws-smithy-eventstream/src/arbitrary.rs | 97 +++ .../aws-smithy-eventstream/src/error.rs | 14 + .../aws-smithy-eventstream/src/frame.rs | 636 ++++++------------ .../aws-smithy-eventstream/src/lib.rs | 3 +- .../aws-smithy-eventstream/src/smithy.rs | 6 +- .../src/event_stream/receiver.rs | 18 +- .../src/event_stream/sender.rs | 22 +- .../aws-smithy-types/src/event_stream.rs | 185 +++++ rust-runtime/aws-smithy-types/src/lib.rs | 2 + .../src/str_bytes.rs | 11 +- 30 files changed, 648 insertions(+), 497 deletions(-) create mode 100644 rust-runtime/aws-smithy-eventstream/src/arbitrary.rs create mode 100644 rust-runtime/aws-smithy-types/src/event_stream.rs rename rust-runtime/{aws-smithy-eventstream => aws-smithy-types}/src/str_bytes.rs (92%) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 79f95dc7184..c500943e451 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -22,3 +22,11 @@ message = "The HTTP `Request`, `Response`, `Headers`, and `HeaderValue` types ha references = ["smithy-rs#3138"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = """ +`Message`, `Header`, `HeaderValue`, and `StrBytes` have been moved to `aws-smithy-types` from `aws-smithy-eventstream`. `Message::read_from` and `Message::write_to` remain in `aws-smithy-eventstream` but they are converted to free functions with the names `read_message_from` and `write_message_to` respectively. +""" +references = ["smithy-rs#3139"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all"} +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index 4c6b7d6bec5..1e3dc5ad39d 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -223,8 +223,9 @@ mod event_stream { use aws_sigv4::event_stream::{sign_empty_message, sign_message}; use aws_sigv4::sign::v4; use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; + use aws_smithy_eventstream::frame::{SignMessage, SignMessageError}; use aws_smithy_runtime_api::client::identity::Identity; + use aws_smithy_types::event_stream::Message; use aws_types::region::SigningRegion; use aws_types::SigningName; @@ -293,7 +294,8 @@ mod event_stream { use crate::auth::sigv4::event_stream::SigV4MessageSigner; use aws_credential_types::Credentials; use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; + use aws_smithy_eventstream::frame::SignMessage; + use aws_smithy_types::event_stream::{HeaderValue, Message}; use aws_types::region::Region; use aws_types::region::SigningRegion; diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index ea98d34f881..07766f202a1 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -20,6 +20,7 @@ aws-credential-types = { path = "../aws-credential-types" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } +aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } bytes = "1" form_urlencoded = { version = "1.0", optional = true } hex = "0.4" diff --git a/aws/rust-runtime/aws-sigv4/external-types.toml b/aws/rust-runtime/aws-sigv4/external-types.toml index f0c4b533a31..37e06db2360 100644 --- a/aws/rust-runtime/aws-sigv4/external-types.toml +++ b/aws/rust-runtime/aws-sigv4/external-types.toml @@ -2,6 +2,6 @@ allowed_external_types = [ # TODO(refactorHttp): Remove this and remove the signing helpers "http::request::Request", # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature - "aws_smithy_eventstream::frame::Message", + "aws_smithy_types::event_stream::Message", "aws_smithy_runtime_api::client::identity::Identity" ] diff --git a/aws/rust-runtime/aws-sigv4/src/event_stream.rs b/aws/rust-runtime/aws-sigv4/src/event_stream.rs index 03cdc61303d..03f8b367d24 100644 --- a/aws/rust-runtime/aws-sigv4/src/event_stream.rs +++ b/aws/rust-runtime/aws-sigv4/src/event_stream.rs @@ -9,7 +9,7 @@ //! //! ```rust //! use aws_sigv4::event_stream::sign_message; -//! use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; +//! use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; //! use std::time::SystemTime; //! use aws_credential_types::Credentials; //! use aws_smithy_runtime_api::client::identity::Identity; @@ -51,7 +51,8 @@ use crate::http_request::SigningError; use crate::sign::v4::{calculate_signature, generate_signing_key, sha256_hex_string}; use crate::SigningOutput; use aws_credential_types::Credentials; -use aws_smithy_eventstream::frame::{write_headers_to, Header, HeaderValue, Message}; +use aws_smithy_eventstream::frame::{write_headers_to, write_message_to}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::Bytes; use std::io::Write; use std::time::SystemTime; @@ -102,7 +103,7 @@ pub fn sign_message<'a>( ) -> Result, SigningError> { let message_payload = { let mut payload = Vec::new(); - message.write_to(&mut payload).unwrap(); + write_message_to(message, &mut payload).unwrap(); payload }; sign_payload(Some(message_payload), last_signature, params) @@ -161,7 +162,8 @@ mod tests { use crate::event_stream::{calculate_string_to_sign, sign_message, SigningParams}; use crate::sign::v4::sha256_hex_string; use aws_credential_types::Credentials; - use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; + use aws_smithy_eventstream::frame::write_message_to; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use std::time::{Duration, UNIX_EPOCH}; #[test] @@ -171,7 +173,7 @@ mod tests { HeaderValue::String("value".into()), )); let mut message_payload = Vec::new(); - message_to_sign.write_to(&mut message_payload).unwrap(); + write_message_to(&message_to_sign, &mut message_payload).unwrap(); let params = SigningParams { identity: &Credentials::for_tests().into(), diff --git a/aws/sdk/integration-tests/transcribestreaming/tests/test.rs b/aws/sdk/integration-tests/transcribestreaming/tests/test.rs index fce762d82be..5178bd2ae95 100644 --- a/aws/sdk/integration-tests/transcribestreaming/tests/test.rs +++ b/aws/sdk/integration-tests/transcribestreaming/tests/test.rs @@ -7,13 +7,14 @@ use async_stream::stream; use aws_sdk_transcribestreaming::config::{Credentials, Region}; use aws_sdk_transcribestreaming::error::SdkError; use aws_sdk_transcribestreaming::operation::start_stream_transcription::StartStreamTranscriptionOutput; +use aws_sdk_transcribestreaming::primitives::event_stream::{HeaderValue, Message}; use aws_sdk_transcribestreaming::primitives::Blob; use aws_sdk_transcribestreaming::types::error::{AudioStreamError, TranscriptResultStreamError}; use aws_sdk_transcribestreaming::types::{ AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream, }; use aws_sdk_transcribestreaming::{Client, Config}; -use aws_smithy_eventstream::frame::{DecodedFrame, HeaderValue, Message, MessageFrameDecoder}; +use aws_smithy_eventstream::frame::{read_message_from, DecodedFrame, MessageFrameDecoder}; use aws_smithy_runtime::client::http::test_util::dvr::{Event, ReplayingClient}; use bytes::BufMut; use futures_core::Stream; @@ -132,7 +133,7 @@ fn decode_frames(mut body: &[u8]) -> Vec<(Message, Option)> { let inner_msg = if msg.payload().is_empty() { None } else { - Some(Message::read_from(msg.payload().as_ref()).unwrap()) + Some(read_message_from(msg.payload().as_ref()).unwrap()) }; result.push((msg, inner_msg)); } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt index ac39f8d3bc8..0216b2618cc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt @@ -78,7 +78,16 @@ object ClientRustModule { val Meta = RustModule.public("meta") val Input = RustModule.public("input") val Output = RustModule.public("output") - val Primitives = RustModule.public("primitives") + + /** crate::primitives */ + val primitives = Primitives.self + object Primitives { + /** crate::primitives */ + val self = RustModule.public("primitives") + + /** crate::primitives::event_stream */ + val EventStream = RustModule.public("event_stream", parent = self) + } /** crate::types */ val types = Types.self @@ -110,7 +119,8 @@ class ClientModuleDocProvider( ClientRustModule.Meta -> strDoc("Information about this crate.") ClientRustModule.Input -> PANIC("this module shouldn't exist in the new scheme") ClientRustModule.Output -> PANIC("this module shouldn't exist in the new scheme") - ClientRustModule.Primitives -> strDoc("Primitives such as `Blob` or `DateTime` used by other types.") + ClientRustModule.primitives -> strDoc("Primitives such as `Blob` or `DateTime` used by other types.") + ClientRustModule.Primitives.EventStream -> strDoc("Event stream related primitives such as `Message` or `Header`.") ClientRustModule.types -> strDoc("Data structures used by operation inputs/outputs.") ClientRustModule.Types.Error -> strDoc("Error types that $serviceName can respond with.") else -> TODO("Document this module: $module") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index aa3e39ad4ec..dca3fcc5c75 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -29,6 +29,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives +import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitivesEventStream import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization val TestUtilFeature = Feature("test-util", false, listOf()) @@ -85,9 +86,12 @@ class RequiredCustomizations : ClientCodegenDecorator { // Re-export resiliency types ResiliencyReExportCustomization(codegenContext).extras(rustCrate) - rustCrate.withModule(ClientRustModule.Primitives) { + rustCrate.withModule(ClientRustModule.primitives) { pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this) } + rustCrate.withModule(ClientRustModule.Primitives.EventStream) { + pubUseSmithyPrimitivesEventStream(codegenContext, codegenContext.model)(this) + } rustCrate.withModule(ClientRustModule.Error) { rustTemplate( """ diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt index 64f6d9446ba..db298141f06 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt @@ -174,5 +174,5 @@ class ClientEnumGenerator(codegenContext: ClientCodegenContext, shape: StringSha codegenContext.model, codegenContext.symbolProvider, shape, - InfallibleEnumType(ClientRustModule.Primitives), + InfallibleEnumType(ClientRustModule.primitives), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt index 1d013a645a8..d37ffde29a4 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt @@ -16,6 +16,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember +import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember /** Returns true if the model has normal streaming operations (excluding event streams) */ @@ -80,3 +81,22 @@ fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model, rustCra ) } } + +/** Adds re-export statements for event-stream-related Smithy primitives */ +fun pubUseSmithyPrimitivesEventStream(codegenContext: CodegenContext, model: Model): Writable = writable { + val rc = codegenContext.runtimeConfig + if (codegenContext.serviceShape.hasEventStreamOperations(model)) { + rustTemplate( + """ + pub use #{Header}; + pub use #{HeaderValue}; + pub use #{Message}; + pub use #{StrBytes}; + """, + "Header" to RuntimeType.smithyTypes(rc).resolve("event_stream::Header"), + "HeaderValue" to RuntimeType.smithyTypes(rc).resolve("event_stream::HeaderValue"), + "Message" to RuntimeType.smithyTypes(rc).resolve("event_stream::Message"), + "StrBytes" to RuntimeType.smithyTypes(rc).resolve("str_bytes::StrBytes"), + ) + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt index 457bf5a53b9..03b4f14f4f0 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt @@ -64,14 +64,15 @@ class EventStreamUnmarshallerGenerator( symbolProvider.symbolForEventStreamError(unionShape) } private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig) + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule() private val codegenScope = arrayOf( "Blob" to RuntimeType.blob(runtimeConfig), "expect_fns" to smithyEventStream.resolve("smithy"), "MarshallMessage" to smithyEventStream.resolve("frame::MarshallMessage"), - "Message" to smithyEventStream.resolve("frame::Message"), - "Header" to smithyEventStream.resolve("frame::Header"), - "HeaderValue" to smithyEventStream.resolve("frame::HeaderValue"), + "Message" to smithyTypes.resolve("event_stream::Message"), + "Header" to smithyTypes.resolve("event_stream::Header"), + "HeaderValue" to smithyTypes.resolve("event_stream::HeaderValue"), "Error" to smithyEventStream.resolve("error::Error"), "OpError" to errorSymbol, "SmithyError" to RuntimeType.smithyTypes(runtimeConfig).resolve("Error"), diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt index 3a0c5c1b30b..b9491f29e8c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt @@ -44,6 +44,7 @@ class EventStreamErrorMarshallerGenerator( payloadContentType: String, ) : EventStreamMarshallerGenerator(model, target, runtimeConfig, symbolProvider, unionShape, serializerGenerator, payloadContentType) { private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig) + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) private val operationErrorSymbol = if (target == CodegenTarget.SERVER && unionShape.eventStreamErrors().isEmpty()) { RuntimeType.smithyHttp(runtimeConfig).resolve("event_stream::MessageStreamError").toSymbol() @@ -54,9 +55,9 @@ class EventStreamErrorMarshallerGenerator( private val errorsShape = unionShape.expectTrait() private val codegenScope = arrayOf( "MarshallMessage" to smithyEventStream.resolve("frame::MarshallMessage"), - "Message" to smithyEventStream.resolve("frame::Message"), - "Header" to smithyEventStream.resolve("frame::Header"), - "HeaderValue" to smithyEventStream.resolve("frame::HeaderValue"), + "Message" to smithyTypes.resolve("event_stream::Message"), + "Header" to smithyTypes.resolve("event_stream::Header"), + "HeaderValue" to smithyTypes.resolve("event_stream::HeaderValue"), "Error" to smithyEventStream.resolve("error::Error"), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt index 201cd82ed5d..ac6cf88ccc2 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt @@ -54,12 +54,13 @@ open class EventStreamMarshallerGenerator( private val payloadContentType: String, ) { private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig) + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule() private val codegenScope = arrayOf( "MarshallMessage" to smithyEventStream.resolve("frame::MarshallMessage"), - "Message" to smithyEventStream.resolve("frame::Message"), - "Header" to smithyEventStream.resolve("frame::Header"), - "HeaderValue" to smithyEventStream.resolve("frame::HeaderValue"), + "Message" to smithyTypes.resolve("event_stream::Message"), + "Header" to smithyTypes.resolve("event_stream::Header"), + "HeaderValue" to smithyTypes.resolve("event_stream::HeaderValue"), "Error" to smithyEventStream.resolve("error::Error"), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt index 896e3c01025..2850f51c721 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt @@ -35,7 +35,8 @@ object EventStreamMarshallTestCases { val typesModule = codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup("test#TestStruct")) rustTemplate( """ - use aws_smithy_eventstream::frame::{Message, Header, HeaderValue, MarshallMessage}; + use aws_smithy_eventstream::frame::MarshallMessage; + use aws_smithy_types::event_stream::{Message, Header, HeaderValue}; use std::collections::HashMap; use aws_smithy_types::{Blob, DateTime}; use ${typesModule.fullyQualifiedPath()}::*; diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt index 215e7ad9de7..3adc813546a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt @@ -28,7 +28,8 @@ object EventStreamUnmarshallTestCases { val typesModule = codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup("test#TestStruct")) rust( """ - use aws_smithy_eventstream::frame::{Header, HeaderValue, Message, UnmarshallMessage, UnmarshalledMessage}; + use aws_smithy_eventstream::frame::{UnmarshallMessage, UnmarshalledMessage}; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use aws_smithy_types::{Blob, DateTime}; use $testStreamError; use ${typesModule.fullyQualifiedPath()}::*; diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs index 56ffed401bc..4a29be7ecf8 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs @@ -5,7 +5,7 @@ #![no_main] -use aws_smithy_eventstream::frame::Message; +use aws_smithy_eventstream::frame::read_message_from; use bytes::BufMut; use crc32fast::Hasher as Crc; use libfuzzer_sys::fuzz_target; @@ -30,7 +30,7 @@ fuzz_target!(|input: Input| { message.put_u32(crc(&message)); let mut data = &mut &message[..]; - let _ = Message::read_from(&mut data); + let _ = read_message_from(&mut data); }); fn crc(input: &[u8]) -> u32 { diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs index a39f1697ab6..c688da2c2df 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs @@ -5,7 +5,8 @@ #![no_main] -use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; +use aws_smithy_eventstream::frame::{read_message_from, write_message_to}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use aws_smithy_types::DateTime; use bytes::{Buf, BufMut}; use crc32fast::Hasher as Crc; @@ -18,7 +19,7 @@ use libfuzzer_sys::{fuzz_mutator, fuzz_target}; // so that the fuzzer can actually explore the header parsing logic. fn mutate(data: &mut [u8], size: usize, max_size: usize) -> usize { let input = &mut &data[..size]; - let message = if let Ok(message) = Message::read_from(input) { + let message = if let Ok(message) = read_message_from(input) { message } else { Message::new(&b"some payload"[..]) @@ -44,7 +45,7 @@ fn mutate(data: &mut [u8], size: usize, max_size: usize) -> usize { }; let mut bytes = Vec::new(); - message.write_to(&mut bytes).unwrap(); + write_message_to(&message, &mut bytes).unwrap(); let headers_len = (&bytes[4..8]).get_u32(); let non_header_len = bytes.len() - headers_len as usize; @@ -72,7 +73,7 @@ fuzz_mutator!( fuzz_target!(|data: &[u8]| { let mut message = data; - let _ = Message::read_from(&mut message); + let _ = read_message_from(&mut message); }); fn crc(input: &[u8]) -> u32 { diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs index fde6f224d79..9c6810f2022 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs @@ -5,7 +5,8 @@ #![no_main] -use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; +use aws_smithy_eventstream::frame::{read_message_from, write_message_to}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::{Buf, BufMut}; use crc32fast::Hasher as Crc; use libfuzzer_sys::fuzz_target; @@ -22,7 +23,7 @@ fuzz_target!(|input: Input| { .add_header(Header::new("str", HeaderValue::String("some str".into()))); let mut bytes = Vec::new(); - message.write_to(&mut bytes).unwrap(); + write_message_to(&message, &mut bytes).unwrap(); let headers_len = (&bytes[4..8]).get_u32(); let headers = &bytes[12..(12 + headers_len as usize)]; @@ -35,7 +36,7 @@ fuzz_target!(|input: Input| { mutated.put_slice(message.payload()); mutated.put_u32(crc(&mutated)); - let _ = Message::read_from(&mut &mutated[..]); + let _ = read_message_from(&mut &mutated[..]); }); fn crc(input: &[u8]) -> u32 { diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs index 3db2ca7d378..83979e9d109 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs @@ -5,10 +5,10 @@ #![no_main] -use aws_smithy_eventstream::frame::Message; +use aws_smithy_eventstream::frame::read_message_from; use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &[u8]| { let mut message = data; - let _ = Message::read_from(&mut message); + let _ = read_message_from(&mut message); }); diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs index 2294985a0ac..9b754addbb0 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs @@ -4,25 +4,23 @@ */ #![no_main] -use aws_smithy_eventstream::error::Error; -use aws_smithy_eventstream::frame::Message; +use aws_smithy_eventstream::arbitrary::ArbMessage; +use aws_smithy_eventstream::frame::{read_message_from, write_message_to}; use libfuzzer_sys::fuzz_target; -fuzz_target!(|message: Message| { +fuzz_target!(|message: ArbMessage| { + let message = message.into(); let mut buffer = Vec::new(); - match message.write_to(&mut buffer) { - Err( - Error::HeadersTooLong - | Error::PayloadTooLong - | Error::MessageTooLong - | Error::InvalidHeaderNameLength - | Error::TimestampValueTooLarge(_), - ) => {} - Err(err) => panic!("unexpected error on write: {}", err), + match write_message_to(&message, &mut buffer) { Ok(_) => { let mut data = &buffer[..]; - let parsed = Message::read_from(&mut data).unwrap(); + let parsed = read_message_from(&mut data).unwrap(); assert_eq!(message, parsed); } + Err(err) => { + if !err.is_invalid_message() { + panic!("unexpected error on write: {}", err), + } + } } }); diff --git a/rust-runtime/aws-smithy-eventstream/src/arbitrary.rs b/rust-runtime/aws-smithy-eventstream/src/arbitrary.rs new file mode 100644 index 00000000000..604c032c25d --- /dev/null +++ b/rust-runtime/aws-smithy-eventstream/src/arbitrary.rs @@ -0,0 +1,97 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Defines new-types wrapping inner types from `aws_smithy_types` to enable the `Arbitrary` trait +//! for fuzz testing. + +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; +use aws_smithy_types::str_bytes::StrBytes; +use aws_smithy_types::DateTime; +use bytes::Bytes; + +#[derive(Clone, Debug, PartialEq)] +pub struct ArbHeaderValue(HeaderValue); + +impl<'a> arbitrary::Arbitrary<'a> for ArbHeaderValue { + fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { + let value_type: u8 = unstruct.int_in_range(0..=9)?; + let header_value = match value_type { + crate::frame::TYPE_TRUE => HeaderValue::Bool(true), + crate::frame::TYPE_FALSE => HeaderValue::Bool(false), + crate::frame::TYPE_BYTE => HeaderValue::Byte(i8::arbitrary(unstruct)?), + crate::frame::TYPE_INT16 => HeaderValue::Int16(i16::arbitrary(unstruct)?), + crate::frame::TYPE_INT32 => HeaderValue::Int32(i32::arbitrary(unstruct)?), + crate::frame::TYPE_INT64 => HeaderValue::Int64(i64::arbitrary(unstruct)?), + crate::frame::TYPE_BYTE_ARRAY => { + HeaderValue::ByteArray(Bytes::from(Vec::::arbitrary(unstruct)?)) + } + crate::frame::TYPE_STRING => { + HeaderValue::String(StrBytes::from(String::arbitrary(unstruct)?)) + } + crate::frame::TYPE_TIMESTAMP => { + HeaderValue::Timestamp(DateTime::from_secs(i64::arbitrary(unstruct)?)) + } + crate::frame::TYPE_UUID => HeaderValue::Uuid(u128::arbitrary(unstruct)?), + _ => unreachable!(), + }; + Ok(ArbHeaderValue(header_value)) + } +} + +impl From for HeaderValue { + fn from(header_value: ArbHeaderValue) -> Self { + header_value.0 + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct ArbStrBytes(StrBytes); + +#[cfg(feature = "derive-arbitrary")] +impl<'a> arbitrary::Arbitrary<'a> for ArbStrBytes { + fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { + Ok(ArbStrBytes(String::arbitrary(unstruct)?.into())) + } +} + +impl From for StrBytes { + fn from(str_bytes: ArbStrBytes) -> Self { + str_bytes.0 + } +} + +#[derive(Clone, Debug, PartialEq, derive_arbitrary::Arbitrary)] +pub struct ArbHeader { + name: ArbStrBytes, + value: ArbHeaderValue, +} + +impl From for Header { + fn from(header: ArbHeader) -> Self { + Self::new(header.name, header.value) + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct ArbMessage(Message); + +impl<'a> arbitrary::Arbitrary<'a> for ArbMessage { + fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { + let headers: Vec = unstruct + .arbitrary_iter()? + .collect::>()?; + let message = Message::new_from_parts( + headers.into_iter().map(Into::into).collect(), + Bytes::from(Vec::::arbitrary(unstruct)?), + ); + Ok(ArbMessage(message)) + } +} + +impl From for Message { + fn from(message: ArbMessage) -> Self { + message.0 + } +} diff --git a/rust-runtime/aws-smithy-eventstream/src/error.rs b/rust-runtime/aws-smithy-eventstream/src/error.rs index bda5ff900d7..99cb4ba759f 100644 --- a/rust-runtime/aws-smithy-eventstream/src/error.rs +++ b/rust-runtime/aws-smithy-eventstream/src/error.rs @@ -51,6 +51,20 @@ impl Error { kind: ErrorKind::Unmarshalling(message.into()), } } + + /// Returns true if the error is one generated during serialization + pub fn is_invalid_message(&self) -> bool { + use ErrorKind::*; + matches!( + self.kind, + HeadersTooLong + | PayloadTooLong + | MessageTooLong + | InvalidHeaderNameLength + | TimestampValueTooLarge(_) + | Marshalling(_) + ) + } } impl From for Error { diff --git a/rust-runtime/aws-smithy-eventstream/src/frame.rs b/rust-runtime/aws-smithy-eventstream/src/frame.rs index 202e410827a..eb2bb1707c5 100644 --- a/rust-runtime/aws-smithy-eventstream/src/frame.rs +++ b/rust-runtime/aws-smithy-eventstream/src/frame.rs @@ -8,8 +8,11 @@ use crate::buf::count::CountBuf; use crate::buf::crc::{CrcBuf, CrcBufMut}; use crate::error::{Error, ErrorKind}; -use crate::str_bytes::StrBytes; -use bytes::{Buf, BufMut, Bytes}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; +use aws_smithy_types::str_bytes::StrBytes; +use aws_smithy_types::DateTime; +use bytes::{Buf, BufMut}; use std::convert::{TryFrom, TryInto}; use std::error::Error as StdError; use std::fmt; @@ -22,6 +25,17 @@ const MESSAGE_CRC_LENGTH_BYTES: u32 = size_of::() as u32; const MAX_HEADER_NAME_LEN: usize = 255; const MIN_HEADER_LEN: usize = 2; +pub(crate) const TYPE_TRUE: u8 = 0; +pub(crate) const TYPE_FALSE: u8 = 1; +pub(crate) const TYPE_BYTE: u8 = 2; +pub(crate) const TYPE_INT16: u8 = 3; +pub(crate) const TYPE_INT32: u8 = 4; +pub(crate) const TYPE_INT64: u8 = 5; +pub(crate) const TYPE_BYTE_ARRAY: u8 = 6; +pub(crate) const TYPE_STRING: u8 = 7; +pub(crate) const TYPE_TIMESTAMP: u8 = 8; +pub(crate) const TYPE_UUID: u8 = 9; + pub type SignMessageError = Box; /// Signs an Event Stream message. @@ -168,451 +182,242 @@ pub trait UnmarshallMessage: fmt::Debug { ) -> Result, Error>; } -mod value { - use crate::error::{Error, ErrorKind}; - use crate::frame::checked; - use crate::str_bytes::StrBytes; - use aws_smithy_types::DateTime; - use bytes::{Buf, BufMut, Bytes}; - use std::convert::TryInto; - use std::mem::size_of; - - const TYPE_TRUE: u8 = 0; - const TYPE_FALSE: u8 = 1; - const TYPE_BYTE: u8 = 2; - const TYPE_INT16: u8 = 3; - const TYPE_INT32: u8 = 4; - const TYPE_INT64: u8 = 5; - const TYPE_BYTE_ARRAY: u8 = 6; - const TYPE_STRING: u8 = 7; - const TYPE_TIMESTAMP: u8 = 8; - const TYPE_UUID: u8 = 9; - - /// Event Stream frame header value. - #[non_exhaustive] - #[derive(Clone, Debug, PartialEq)] - pub enum HeaderValue { - Bool(bool), - Byte(i8), - Int16(i16), - Int32(i32), - Int64(i64), - ByteArray(Bytes), - String(StrBytes), - Timestamp(DateTime), - Uuid(u128), - } - - impl HeaderValue { - pub fn as_bool(&self) -> Result { - match self { - HeaderValue::Bool(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_byte(&self) -> Result { - match self { - HeaderValue::Byte(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_int16(&self) -> Result { - match self { - HeaderValue::Int16(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_int32(&self) -> Result { - match self { - HeaderValue::Int32(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_int64(&self) -> Result { - match self { - HeaderValue::Int64(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_byte_array(&self) -> Result<&Bytes, &Self> { - match self { - HeaderValue::ByteArray(value) => Ok(value), - _ => Err(self), - } - } - - pub fn as_string(&self) -> Result<&StrBytes, &Self> { - match self { - HeaderValue::String(value) => Ok(value), - _ => Err(self), - } - } - - pub fn as_timestamp(&self) -> Result { - match self { - HeaderValue::Timestamp(value) => Ok(*value), - _ => Err(self), - } +macro_rules! read_value { + ($buf:ident, $typ:ident, $size_typ:ident, $read_fn:ident) => { + if $buf.remaining() >= size_of::<$size_typ>() { + Ok(HeaderValue::$typ($buf.$read_fn())) + } else { + Err(ErrorKind::InvalidHeaderValue.into()) } + }; +} - pub fn as_uuid(&self) -> Result { - match self { - HeaderValue::Uuid(value) => Ok(*value), - _ => Err(self), +fn read_header_value_from(mut buffer: B) -> Result { + let value_type = buffer.get_u8(); + match value_type { + TYPE_TRUE => Ok(HeaderValue::Bool(true)), + TYPE_FALSE => Ok(HeaderValue::Bool(false)), + TYPE_BYTE => read_value!(buffer, Byte, i8, get_i8), + TYPE_INT16 => read_value!(buffer, Int16, i16, get_i16), + TYPE_INT32 => read_value!(buffer, Int32, i32, get_i32), + TYPE_INT64 => read_value!(buffer, Int64, i64, get_i64), + TYPE_BYTE_ARRAY | TYPE_STRING => { + if buffer.remaining() > size_of::() { + let len = buffer.get_u16() as usize; + if buffer.remaining() < len { + return Err(ErrorKind::InvalidHeaderValue.into()); + } + let bytes = buffer.copy_to_bytes(len); + if value_type == TYPE_STRING { + Ok(HeaderValue::String( + bytes.try_into().map_err(|_| ErrorKind::InvalidUtf8String)?, + )) + } else { + Ok(HeaderValue::ByteArray(bytes)) + } + } else { + Err(ErrorKind::InvalidHeaderValue.into()) } } - } - - macro_rules! read_value { - ($buf:ident, $typ:ident, $size_typ:ident, $read_fn:ident) => { - if $buf.remaining() >= size_of::<$size_typ>() { - Ok(HeaderValue::$typ($buf.$read_fn())) + TYPE_TIMESTAMP => { + if buffer.remaining() >= size_of::() { + let epoch_millis = buffer.get_i64(); + Ok(HeaderValue::Timestamp(DateTime::from_millis(epoch_millis))) } else { Err(ErrorKind::InvalidHeaderValue.into()) } - }; + } + TYPE_UUID => read_value!(buffer, Uuid, u128, get_u128), + _ => Err(ErrorKind::InvalidHeaderValueType(value_type).into()), } +} - impl HeaderValue { - pub(super) fn read_from(mut buffer: B) -> Result { - let value_type = buffer.get_u8(); - match value_type { - TYPE_TRUE => Ok(HeaderValue::Bool(true)), - TYPE_FALSE => Ok(HeaderValue::Bool(false)), - TYPE_BYTE => read_value!(buffer, Byte, i8, get_i8), - TYPE_INT16 => read_value!(buffer, Int16, i16, get_i16), - TYPE_INT32 => read_value!(buffer, Int32, i32, get_i32), - TYPE_INT64 => read_value!(buffer, Int64, i64, get_i64), - TYPE_BYTE_ARRAY | TYPE_STRING => { - if buffer.remaining() > size_of::() { - let len = buffer.get_u16() as usize; - if buffer.remaining() < len { - return Err(ErrorKind::InvalidHeaderValue.into()); - } - let bytes = buffer.copy_to_bytes(len); - if value_type == TYPE_STRING { - Ok(HeaderValue::String( - bytes.try_into().map_err(|_| ErrorKind::InvalidUtf8String)?, - )) - } else { - Ok(HeaderValue::ByteArray(bytes)) - } - } else { - Err(ErrorKind::InvalidHeaderValue.into()) - } - } - TYPE_TIMESTAMP => { - if buffer.remaining() >= size_of::() { - let epoch_millis = buffer.get_i64(); - Ok(HeaderValue::Timestamp(DateTime::from_millis(epoch_millis))) - } else { - Err(ErrorKind::InvalidHeaderValue.into()) - } - } - TYPE_UUID => read_value!(buffer, Uuid, u128, get_u128), - _ => Err(ErrorKind::InvalidHeaderValueType(value_type).into()), - } +fn write_header_value_to(value: &HeaderValue, mut buffer: B) -> Result<(), Error> { + use HeaderValue::*; + match value { + Bool(val) => buffer.put_u8(if *val { TYPE_TRUE } else { TYPE_FALSE }), + Byte(val) => { + buffer.put_u8(TYPE_BYTE); + buffer.put_i8(*val); + } + Int16(val) => { + buffer.put_u8(TYPE_INT16); + buffer.put_i16(*val); + } + Int32(val) => { + buffer.put_u8(TYPE_INT32); + buffer.put_i32(*val); + } + Int64(val) => { + buffer.put_u8(TYPE_INT64); + buffer.put_i64(*val); + } + ByteArray(val) => { + buffer.put_u8(TYPE_BYTE_ARRAY); + buffer.put_u16(checked(val.len(), ErrorKind::HeaderValueTooLong.into())?); + buffer.put_slice(&val[..]); + } + String(val) => { + buffer.put_u8(TYPE_STRING); + buffer.put_u16(checked( + val.as_bytes().len(), + ErrorKind::HeaderValueTooLong.into(), + )?); + buffer.put_slice(&val.as_bytes()[..]); + } + Timestamp(time) => { + buffer.put_u8(TYPE_TIMESTAMP); + buffer.put_i64( + time.to_millis() + .map_err(|_| ErrorKind::TimestampValueTooLarge(*time))?, + ); } - - pub(super) fn write_to(&self, mut buffer: B) -> Result<(), Error> { - use HeaderValue::*; - match self { - Bool(val) => buffer.put_u8(if *val { TYPE_TRUE } else { TYPE_FALSE }), - Byte(val) => { - buffer.put_u8(TYPE_BYTE); - buffer.put_i8(*val); - } - Int16(val) => { - buffer.put_u8(TYPE_INT16); - buffer.put_i16(*val); - } - Int32(val) => { - buffer.put_u8(TYPE_INT32); - buffer.put_i32(*val); - } - Int64(val) => { - buffer.put_u8(TYPE_INT64); - buffer.put_i64(*val); - } - ByteArray(val) => { - buffer.put_u8(TYPE_BYTE_ARRAY); - buffer.put_u16(checked(val.len(), ErrorKind::HeaderValueTooLong.into())?); - buffer.put_slice(&val[..]); - } - String(val) => { - buffer.put_u8(TYPE_STRING); - buffer.put_u16(checked( - val.as_bytes().len(), - ErrorKind::HeaderValueTooLong.into(), - )?); - buffer.put_slice(&val.as_bytes()[..]); - } - Timestamp(time) => { - buffer.put_u8(TYPE_TIMESTAMP); - buffer.put_i64( - time.to_millis() - .map_err(|_| ErrorKind::TimestampValueTooLarge(*time))?, - ); - } - Uuid(val) => { - buffer.put_u8(TYPE_UUID); - buffer.put_u128(*val); - } - } - Ok(()) + Uuid(val) => { + buffer.put_u8(TYPE_UUID); + buffer.put_u128(*val); } - } - - #[cfg(feature = "derive-arbitrary")] - impl<'a> arbitrary::Arbitrary<'a> for HeaderValue { - fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - let value_type: u8 = unstruct.int_in_range(0..=9)?; - Ok(match value_type { - TYPE_TRUE => HeaderValue::Bool(true), - TYPE_FALSE => HeaderValue::Bool(false), - TYPE_BYTE => HeaderValue::Byte(i8::arbitrary(unstruct)?), - TYPE_INT16 => HeaderValue::Int16(i16::arbitrary(unstruct)?), - TYPE_INT32 => HeaderValue::Int32(i32::arbitrary(unstruct)?), - TYPE_INT64 => HeaderValue::Int64(i64::arbitrary(unstruct)?), - TYPE_BYTE_ARRAY => { - HeaderValue::ByteArray(Bytes::from(Vec::::arbitrary(unstruct)?)) - } - TYPE_STRING => HeaderValue::String(StrBytes::from(String::arbitrary(unstruct)?)), - TYPE_TIMESTAMP => { - HeaderValue::Timestamp(DateTime::from_secs(i64::arbitrary(unstruct)?)) - } - TYPE_UUID => HeaderValue::Uuid(u128::arbitrary(unstruct)?), - _ => unreachable!(), - }) + _ => { + panic!("matched on unexpected variant in `aws_smithy_types::event_stream::HeaderValue`") } } + Ok(()) } -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -pub use value::HeaderValue; - -/// Event Stream header. -#[non_exhaustive] -#[derive(Clone, Debug, PartialEq)] -#[cfg_attr(feature = "derive-arbitrary", derive(derive_arbitrary::Arbitrary))] -pub struct Header { - name: StrBytes, - value: HeaderValue, -} - -impl Header { - /// Creates a new header with the given `name` and `value`. - pub fn new(name: impl Into, value: HeaderValue) -> Header { - Header { - name: name.into(), - value, - } - } - - /// Returns the header name. - pub fn name(&self) -> &StrBytes { - &self.name +/// Reads a header from the given `buffer`. +fn read_header_from(mut buffer: B) -> Result<(Header, usize), Error> { + if buffer.remaining() < MIN_HEADER_LEN { + return Err(ErrorKind::InvalidHeadersLength.into()); } - /// Returns the header value. - pub fn value(&self) -> &HeaderValue { - &self.value + let mut counting_buf = CountBuf::new(&mut buffer); + let name_len = counting_buf.get_u8(); + if name_len as usize >= counting_buf.remaining() { + return Err(ErrorKind::InvalidHeaderNameLength.into()); } - /// Reads a header from the given `buffer`. - fn read_from(mut buffer: B) -> Result<(Header, usize), Error> { - if buffer.remaining() < MIN_HEADER_LEN { - return Err(ErrorKind::InvalidHeadersLength.into()); - } - - let mut counting_buf = CountBuf::new(&mut buffer); - let name_len = counting_buf.get_u8(); - if name_len as usize >= counting_buf.remaining() { - return Err(ErrorKind::InvalidHeaderNameLength.into()); - } + let name: StrBytes = counting_buf + .copy_to_bytes(name_len as usize) + .try_into() + .map_err(|_| ErrorKind::InvalidUtf8String)?; + let value = read_header_value_from(&mut counting_buf)?; + Ok((Header::new(name, value), counting_buf.into_count())) +} - let name: StrBytes = counting_buf - .copy_to_bytes(name_len as usize) - .try_into() - .map_err(|_| ErrorKind::InvalidUtf8String)?; - let value = HeaderValue::read_from(&mut counting_buf)?; - Ok((Header::new(name, value), counting_buf.into_count())) +/// Writes the header to the given `buffer`. +fn write_header_to(header: &Header, mut buffer: B) -> Result<(), Error> { + if header.name().as_bytes().len() > MAX_HEADER_NAME_LEN { + return Err(ErrorKind::InvalidHeaderNameLength.into()); } - /// Writes the header to the given `buffer`. - fn write_to(&self, mut buffer: B) -> Result<(), Error> { - if self.name.as_bytes().len() > MAX_HEADER_NAME_LEN { - return Err(ErrorKind::InvalidHeaderNameLength.into()); - } - - buffer.put_u8(u8::try_from(self.name.as_bytes().len()).expect("bounds check above")); - buffer.put_slice(&self.name.as_bytes()[..]); - self.value.write_to(buffer) - } + buffer.put_u8(u8::try_from(header.name().as_bytes().len()).expect("bounds check above")); + buffer.put_slice(&header.name().as_bytes()[..]); + write_header_value_to(header.value(), buffer) } /// Writes the given `headers` to a `buffer`. pub fn write_headers_to(headers: &[Header], mut buffer: B) -> Result<(), Error> { for header in headers { - header.write_to(&mut buffer)?; + write_header_to(header, &mut buffer)?; } Ok(()) } -/// Event Stream message. -#[non_exhaustive] -#[derive(Clone, Debug, PartialEq)] -pub struct Message { - headers: Vec

, - payload: Bytes, -} - -impl Message { - /// Creates a new message with the given `payload`. Headers can be added later. - pub fn new(payload: impl Into) -> Message { - Message { - headers: Vec::new(), - payload: payload.into(), - } - } +// Returns (total_len, header_len) +fn read_prelude_from(mut buffer: B) -> Result<(u32, u32), Error> { + let mut crc_buffer = CrcBuf::new(&mut buffer); - /// Creates a message with the given `headers` and `payload`. - pub fn new_from_parts(headers: Vec
, payload: impl Into) -> Self { - Self { - headers, - payload: payload.into(), - } + // If the buffer doesn't have the entire, then error + let total_len = crc_buffer.get_u32(); + if crc_buffer.remaining() + size_of::() < total_len as usize { + return Err(ErrorKind::InvalidMessageLength.into()); } - /// Adds a header to the message. - pub fn add_header(mut self, header: Header) -> Self { - self.headers.push(header); - self + // Validate the prelude + let header_len = crc_buffer.get_u32(); + let (expected_crc, prelude_crc) = (crc_buffer.into_crc(), buffer.get_u32()); + if expected_crc != prelude_crc { + return Err(ErrorKind::PreludeChecksumMismatch(expected_crc, prelude_crc).into()); } - - /// Returns all headers. - pub fn headers(&self) -> &[Header] { - &self.headers + // The header length can be 0 or >= 2, but must fit within the frame size + if header_len == 1 || header_len > max_header_len(total_len)? { + return Err(ErrorKind::InvalidHeadersLength.into()); } + Ok((total_len, header_len)) +} - /// Returns the payload bytes. - pub fn payload(&self) -> &Bytes { - &self.payload +/// Reads a message from the given `buffer`. For streaming use cases, use +/// the [`MessageFrameDecoder`] instead of this. +pub fn read_message_from(mut buffer: B) -> Result { + if buffer.remaining() < PRELUDE_LENGTH_BYTES_USIZE { + return Err(ErrorKind::InvalidMessageLength.into()); } - // Returns (total_len, header_len) - fn read_prelude_from(mut buffer: B) -> Result<(u32, u32), Error> { - let mut crc_buffer = CrcBuf::new(&mut buffer); + // Calculate a CRC as we go and read the prelude + let mut crc_buffer = CrcBuf::new(&mut buffer); + let (total_len, header_len) = read_prelude_from(&mut crc_buffer)?; - // If the buffer doesn't have the entire, then error - let total_len = crc_buffer.get_u32(); - if crc_buffer.remaining() + size_of::() < total_len as usize { - return Err(ErrorKind::InvalidMessageLength.into()); - } - - // Validate the prelude - let header_len = crc_buffer.get_u32(); - let (expected_crc, prelude_crc) = (crc_buffer.into_crc(), buffer.get_u32()); - if expected_crc != prelude_crc { - return Err(ErrorKind::PreludeChecksumMismatch(expected_crc, prelude_crc).into()); - } - // The header length can be 0 or >= 2, but must fit within the frame size - if header_len == 1 || header_len > max_header_len(total_len)? { - return Err(ErrorKind::InvalidHeadersLength.into()); - } - Ok((total_len, header_len)) + // Verify we have the full frame before continuing + let remaining_len = total_len + .checked_sub(PRELUDE_LENGTH_BYTES) + .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))?; + if crc_buffer.remaining() < remaining_len as usize { + return Err(ErrorKind::InvalidMessageLength.into()); } - /// Reads a message from the given `buffer`. For streaming use cases, use - /// the [`MessageFrameDecoder`] instead of this. - pub fn read_from(mut buffer: B) -> Result { - if buffer.remaining() < PRELUDE_LENGTH_BYTES_USIZE { - return Err(ErrorKind::InvalidMessageLength.into()); - } - - // Calculate a CRC as we go and read the prelude - let mut crc_buffer = CrcBuf::new(&mut buffer); - let (total_len, header_len) = Self::read_prelude_from(&mut crc_buffer)?; - - // Verify we have the full frame before continuing - let remaining_len = total_len - .checked_sub(PRELUDE_LENGTH_BYTES) - .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))?; - if crc_buffer.remaining() < remaining_len as usize { - return Err(ErrorKind::InvalidMessageLength.into()); - } - - // Read headers - let mut header_bytes_read = 0; - let mut headers = Vec::new(); - while header_bytes_read < header_len as usize { - let (header, bytes_read) = Header::read_from(&mut crc_buffer)?; - header_bytes_read += bytes_read; - if header_bytes_read > header_len as usize { - return Err(ErrorKind::InvalidHeaderValue.into()); - } - headers.push(header); - } - - // Read payload - let payload_len = payload_len(total_len, header_len)?; - let payload = crc_buffer.copy_to_bytes(payload_len as usize); - - let expected_crc = crc_buffer.into_crc(); - let message_crc = buffer.get_u32(); - if expected_crc != message_crc { - return Err(ErrorKind::MessageChecksumMismatch(expected_crc, message_crc).into()); + // Read headers + let mut header_bytes_read = 0; + let mut headers = Vec::new(); + while header_bytes_read < header_len as usize { + let (header, bytes_read) = read_header_from(&mut crc_buffer)?; + header_bytes_read += bytes_read; + if header_bytes_read > header_len as usize { + return Err(ErrorKind::InvalidHeaderValue.into()); } - - Ok(Message { headers, payload }) + headers.push(header); } - /// Writes the message to the given `buffer`. - pub fn write_to(&self, buffer: &mut dyn BufMut) -> Result<(), Error> { - let mut headers = Vec::new(); - for header in &self.headers { - header.write_to(&mut headers)?; - } + // Read payload + let payload_len = payload_len(total_len, header_len)?; + let payload = crc_buffer.copy_to_bytes(payload_len as usize); - let headers_len = checked(headers.len(), ErrorKind::HeadersTooLong.into())?; - let payload_len = checked(self.payload.len(), ErrorKind::PayloadTooLong.into())?; - let message_len = [ - PRELUDE_LENGTH_BYTES, - headers_len, - payload_len, - MESSAGE_CRC_LENGTH_BYTES, - ] - .iter() - .try_fold(0u32, |acc, v| { - acc.checked_add(*v) - .ok_or_else(|| Error::from(ErrorKind::MessageTooLong)) - })?; - - let mut crc_buffer = CrcBufMut::new(buffer); - crc_buffer.put_u32(message_len); - crc_buffer.put_u32(headers_len); - crc_buffer.put_crc(); - crc_buffer.put(&headers[..]); - crc_buffer.put(&self.payload[..]); - crc_buffer.put_crc(); - Ok(()) + let expected_crc = crc_buffer.into_crc(); + let message_crc = buffer.get_u32(); + if expected_crc != message_crc { + return Err(ErrorKind::MessageChecksumMismatch(expected_crc, message_crc).into()); } + + Ok(Message::new_from_parts(headers, payload)) } -#[cfg(feature = "derive-arbitrary")] -impl<'a> arbitrary::Arbitrary<'a> for Message { - fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - let headers: arbitrary::Result> = unstruct.arbitrary_iter()?.collect(); - Ok(Message { - headers: headers?, - payload: Bytes::from(Vec::::arbitrary(unstruct)?), - }) - } +/// Writes the `message` to the given `buffer`. +pub fn write_message_to(message: &Message, buffer: &mut dyn BufMut) -> Result<(), Error> { + let mut headers = Vec::new(); + for header in message.headers() { + write_header_to(header, &mut headers)?; + } + + let headers_len = checked(headers.len(), ErrorKind::HeadersTooLong.into())?; + let payload_len = checked(message.payload().len(), ErrorKind::PayloadTooLong.into())?; + let message_len = [ + PRELUDE_LENGTH_BYTES, + headers_len, + payload_len, + MESSAGE_CRC_LENGTH_BYTES, + ] + .iter() + .try_fold(0u32, |acc, v| { + acc.checked_add(*v) + .ok_or_else(|| Error::from(ErrorKind::MessageTooLong)) + })?; + + let mut crc_buffer = CrcBufMut::new(buffer); + crc_buffer.put_u32(message_len); + crc_buffer.put_u32(headers_len); + crc_buffer.put_crc(); + crc_buffer.put(&headers[..]); + crc_buffer.put(&message.payload()[..]); + crc_buffer.put_crc(); + Ok(()) } fn checked, U>(from: U, err: Error) -> Result { @@ -637,14 +442,15 @@ fn payload_len(total_len: u32, header_len: u32) -> Result { #[cfg(test)] mod message_tests { + use super::read_message_from; use crate::error::ErrorKind; - use crate::frame::{Header, HeaderValue, Message}; + use crate::frame::{write_message_to, Header, HeaderValue, Message}; use aws_smithy_types::DateTime; use bytes::Bytes; macro_rules! read_message_expect_err { ($bytes:expr, $err:pat) => { - let result = Message::read_from(&mut Bytes::from_static($bytes)); + let result = read_message_from(&mut Bytes::from_static($bytes)); let result = result.as_ref(); assert!(result.is_err(), "Expected error, got {:?}", result); assert!( @@ -702,11 +508,11 @@ mod message_tests { 0x36, ]; - let result = Message::read_from(&mut Bytes::from_static(data)).unwrap(); + let result = read_message_from(&mut Bytes::from_static(data)).unwrap(); assert_eq!(result.headers(), Vec::new()); let expected_payload = b"{'foo':'bar'}"; - assert_eq!(expected_payload, result.payload.as_ref()); + assert_eq!(expected_payload, result.payload().as_ref()); } #[test] @@ -721,7 +527,7 @@ mod message_tests { 0x7d, 0x8D, 0x9C, 0x08, 0xB1, ]; - let result = Message::read_from(&mut Bytes::from_static(data)).unwrap(); + let result = read_message_from(&mut Bytes::from_static(data)).unwrap(); assert_eq!( result.headers(), vec![Header::new( @@ -731,13 +537,13 @@ mod message_tests { ); let expected_payload = b"{'foo':'bar'}"; - assert_eq!(expected_payload, result.payload.as_ref()); + assert_eq!(expected_payload, result.payload().as_ref()); } #[test] fn read_all_headers_and_payload() { let message = include_bytes!("../test_data/valid_with_all_headers_and_payload"); - let result = Message::read_from(&mut Bytes::from_static(message)).unwrap(); + let result = read_message_from(&mut Bytes::from_static(message)).unwrap(); assert_eq!( result.headers(), vec![ @@ -763,7 +569,7 @@ mod message_tests { ] ); - assert_eq!(b"some payload", result.payload.as_ref()); + assert_eq!(b"some payload", result.payload().as_ref()); } #[test] @@ -790,14 +596,14 @@ mod message_tests { )); let mut actual = Vec::new(); - message.write_to(&mut actual).unwrap(); + write_message_to(&message, &mut actual).unwrap(); let expected = include_bytes!("../test_data/valid_with_all_headers_and_payload").to_vec(); assert_eq!(expected, actual); - let result = Message::read_from(&mut Bytes::from(actual)).unwrap(); + let result = read_message_from(&mut Bytes::from(actual)).unwrap(); assert_eq!(message.headers(), result.headers()); - assert_eq!(message.payload().as_ref(), result.payload.as_ref()); + assert_eq!(message.payload().as_ref(), result.payload().as_ref()); } } @@ -866,7 +672,7 @@ impl MessageFrameDecoder { if let Some(remaining_len) = self.remaining_bytes_if_frame_available(&buffer)? { let mut message_buf = (&self.prelude[..]).chain(buffer.take(remaining_len)); - let result = Message::read_from(&mut message_buf).map(DecodedFrame::Complete); + let result = read_message_from(&mut message_buf).map(DecodedFrame::Complete); self.reset(); return result; } @@ -878,7 +684,7 @@ impl MessageFrameDecoder { #[cfg(test)] mod message_frame_decoder_tests { use super::{DecodedFrame, MessageFrameDecoder}; - use crate::frame::Message; + use crate::frame::read_message_from; use bytes::Bytes; use bytes_utils::SegmentedBuf; @@ -899,7 +705,7 @@ mod message_frame_decoder_tests { match decoder.decode_frame(&mut segmented).unwrap() { DecodedFrame::Incomplete => panic!("frame should be complete now"), DecodedFrame::Complete(actual) => { - let expected = Message::read_from(&mut Bytes::from_static(message)).unwrap(); + let expected = read_message_from(&mut Bytes::from_static(message)).unwrap(); assert_eq!(expected, actual); } } @@ -926,9 +732,9 @@ mod message_frame_decoder_tests { } } - let expected1 = Message::read_from(&mut Bytes::from_static(message1)).unwrap(); - let expected2 = Message::read_from(&mut Bytes::from_static(message2)).unwrap(); - let expected3 = Message::read_from(&mut Bytes::from_static(message3)).unwrap(); + let expected1 = read_message_from(&mut Bytes::from_static(message1)).unwrap(); + let expected2 = read_message_from(&mut Bytes::from_static(message2)).unwrap(); + let expected3 = read_message_from(&mut Bytes::from_static(message3)).unwrap(); assert_eq!(3, decoded.len()); assert_eq!(expected1, decoded[0]); assert_eq!(expected2, decoded[1]); diff --git a/rust-runtime/aws-smithy-eventstream/src/lib.rs b/rust-runtime/aws-smithy-eventstream/src/lib.rs index 0d060b914e3..5171471d2f2 100644 --- a/rust-runtime/aws-smithy-eventstream/src/lib.rs +++ b/rust-runtime/aws-smithy-eventstream/src/lib.rs @@ -13,8 +13,9 @@ //! AWS Event Stream frame serialization/deserialization implementation. +#[cfg(feature = "derive-arbitrary")] +pub mod arbitrary; mod buf; pub mod error; pub mod frame; pub mod smithy; -pub mod str_bytes; diff --git a/rust-runtime/aws-smithy-eventstream/src/smithy.rs b/rust-runtime/aws-smithy-eventstream/src/smithy.rs index 3a076d7eb20..d939602533c 100644 --- a/rust-runtime/aws-smithy-eventstream/src/smithy.rs +++ b/rust-runtime/aws-smithy-eventstream/src/smithy.rs @@ -4,8 +4,8 @@ */ use crate::error::{Error, ErrorKind}; -use crate::frame::{Header, HeaderValue, Message}; -use crate::str_bytes::StrBytes; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; +use aws_smithy_types::str_bytes::StrBytes; use aws_smithy_types::{Blob, DateTime}; macro_rules! expect_shape_fn { @@ -125,7 +125,7 @@ pub fn parse_response_headers(message: &Message) -> Result, #[cfg(test)] mod tests { use super::parse_response_headers; - use crate::frame::{Header, HeaderValue, Message}; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; #[test] fn normal_message() { diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index 823ac6f516a..69e1c4381ba 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -4,10 +4,11 @@ */ use aws_smithy_eventstream::frame::{ - DecodedFrame, Message, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage, + DecodedFrame, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage, }; use aws_smithy_runtime_api::client::result::{ConnectorError, SdkError}; use aws_smithy_types::body::SdkBody; +use aws_smithy_types::event_stream::Message; use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; @@ -277,9 +278,10 @@ impl Receiver { mod tests { use super::{Receiver, UnmarshallMessage}; use aws_smithy_eventstream::error::Error as EventStreamError; - use aws_smithy_eventstream::frame::{Header, HeaderValue, Message, UnmarshalledMessage}; + use aws_smithy_eventstream::frame::{write_message_to, UnmarshalledMessage}; use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::body::SdkBody; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::Bytes; use hyper::body::Body; use std::error::Error as StdError; @@ -287,7 +289,7 @@ mod tests { fn encode_initial_response() -> Bytes { let mut buffer = Vec::new(); - Message::new(Bytes::new()) + let message = Message::new(Bytes::new()) .add_header(Header::new( ":message-type", HeaderValue::String("event".into()), @@ -295,17 +297,15 @@ mod tests { .add_header(Header::new( ":event-type", HeaderValue::String("initial-response".into()), - )) - .write_to(&mut buffer) - .unwrap(); + )); + write_message_to(&message, &mut buffer).unwrap(); buffer.into() } fn encode_message(message: &str) -> Bytes { let mut buffer = Vec::new(); - Message::new(Bytes::copy_from_slice(message.as_bytes())) - .write_to(&mut buffer) - .unwrap(); + let message = Message::new(Bytes::copy_from_slice(message.as_bytes())); + write_message_to(&message, &mut buffer).unwrap(); buffer.into() } diff --git a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs index aa35b6cdee0..f0dc00fa978 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_eventstream::frame::{MarshallMessage, SignMessage}; +use aws_smithy_eventstream::frame::{write_message_to, MarshallMessage, SignMessage}; use aws_smithy_runtime_api::client::result::SdkError; use bytes::Bytes; use futures_core::Stream; @@ -165,8 +165,7 @@ impl Stream for MessageStreamAdapter Stream for MessageStreamAdapter { - sign.map_err(SdkError::construction_failure)? - .write_to(&mut buffer) + let message = sign.map_err(SdkError::construction_failure)?; + write_message_to(&message, &mut buffer) .map_err(SdkError::construction_failure)?; trace!(signed_message = ?buffer, "sending signed empty message to terminate the event stream"); Poll::Ready(Some(Ok(Bytes::from(buffer)))) @@ -199,9 +198,10 @@ mod tests { use async_stream::stream; use aws_smithy_eventstream::error::Error as EventStreamError; use aws_smithy_eventstream::frame::{ - Header, HeaderValue, Message, NoOpSigner, SignMessage, SignMessageError, + read_message_from, write_message_to, NoOpSigner, SignMessage, SignMessageError, }; use aws_smithy_runtime_api::client::result::SdkError; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::Bytes; use futures_core::Stream; use futures_util::stream::StreamExt; @@ -234,7 +234,7 @@ mod tests { type Input = TestServiceError; fn marshall(&self, _input: Self::Input) -> Result { - Err(Message::read_from(&b""[..]).expect_err("this should always fail")) + Err(read_message_from(&b""[..]).expect_err("this should always fail")) } } @@ -252,7 +252,7 @@ mod tests { impl SignMessage for TestSigner { fn sign(&mut self, message: Message) -> Result { let mut buffer = Vec::new(); - message.write_to(&mut buffer).unwrap(); + write_message_to(&message, &mut buffer).unwrap(); Ok(Message::new(buffer).add_header(Header::new("signed", HeaderValue::Bool(true)))) } @@ -299,14 +299,14 @@ mod tests { )); let mut sent_bytes = adapter.next().await.unwrap().unwrap(); - let sent = Message::read_from(&mut sent_bytes).unwrap(); + let sent = read_message_from(&mut sent_bytes).unwrap(); assert_eq!("signed", sent.headers()[0].name().as_str()); assert_eq!(&HeaderValue::Bool(true), sent.headers()[0].value()); - let inner = Message::read_from(&mut (&sent.payload()[..])).unwrap(); + let inner = read_message_from(&mut (&sent.payload()[..])).unwrap(); assert_eq!(&b"test"[..], &inner.payload()[..]); let mut end_signal_bytes = adapter.next().await.unwrap().unwrap(); - let end_signal = Message::read_from(&mut end_signal_bytes).unwrap(); + let end_signal = read_message_from(&mut end_signal_bytes).unwrap(); assert_eq!("signed", end_signal.headers()[0].name().as_str()); assert_eq!(&HeaderValue::Bool(true), end_signal.headers()[0].value()); assert_eq!(0, end_signal.payload().len()); diff --git a/rust-runtime/aws-smithy-types/src/event_stream.rs b/rust-runtime/aws-smithy-types/src/event_stream.rs new file mode 100644 index 00000000000..a63c44e8edd --- /dev/null +++ b/rust-runtime/aws-smithy-types/src/event_stream.rs @@ -0,0 +1,185 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types relevant to event stream serialization/deserialization + +use crate::str_bytes::StrBytes; +use bytes::Bytes; + +mod value { + use crate::str_bytes::StrBytes; + use crate::DateTime; + use bytes::Bytes; + + /// Event Stream frame header value. + #[non_exhaustive] + #[derive(Clone, Debug, PartialEq)] + pub enum HeaderValue { + /// Represents a boolean value. + Bool(bool), + /// Represents a byte value. + Byte(i8), + /// Represents an int16 value. + Int16(i16), + /// Represents an int32 value. + Int32(i32), + /// Represents an int64 value. + Int64(i64), + /// Represents a byte array value. + ByteArray(Bytes), + /// Represents a string value. + String(StrBytes), + /// Represents a timestamp value. + Timestamp(DateTime), + /// Represents a uuid value. + Uuid(u128), + } + + impl HeaderValue { + /// If the `HeaderValue` is a `Bool`, returns the associated `bool`. Returns `Err` otherwise. + pub fn as_bool(&self) -> Result { + match self { + HeaderValue::Bool(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `Byte`, returns the associated `i8`. Returns `Err` otherwise. + pub fn as_byte(&self) -> Result { + match self { + HeaderValue::Byte(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is an `Int16`, returns the associated `i16`. Returns `Err` otherwise. + pub fn as_int16(&self) -> Result { + match self { + HeaderValue::Int16(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is an `Int32`, returns the associated `i32`. Returns `Err` otherwise. + pub fn as_int32(&self) -> Result { + match self { + HeaderValue::Int32(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is an `Int64`, returns the associated `i64`. Returns `Err` otherwise. + pub fn as_int64(&self) -> Result { + match self { + HeaderValue::Int64(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `ByteArray`, returns the associated [`Bytes`]. Returns `Err` otherwise. + pub fn as_byte_array(&self) -> Result<&Bytes, &Self> { + match self { + HeaderValue::ByteArray(value) => Ok(value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `String`, returns the associated [`StrBytes`]. Returns `Err` otherwise. + pub fn as_string(&self) -> Result<&StrBytes, &Self> { + match self { + HeaderValue::String(value) => Ok(value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `Timestamp`, returns the associated [`DateTime`]. Returns `Err` otherwise. + pub fn as_timestamp(&self) -> Result { + match self { + HeaderValue::Timestamp(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `Uuid`, returns the associated `u128`. Returns `Err` otherwise. + pub fn as_uuid(&self) -> Result { + match self { + HeaderValue::Uuid(value) => Ok(*value), + _ => Err(self), + } + } + } +} + +pub use value::HeaderValue; + +/// Event Stream header. +#[non_exhaustive] +#[derive(Clone, Debug, PartialEq)] +pub struct Header { + name: StrBytes, + value: HeaderValue, +} + +impl Header { + /// Creates a new header with the given `name` and `value`. + pub fn new(name: impl Into, value: impl Into) -> Header { + Header { + name: name.into(), + value: value.into(), + } + } + + /// Returns the header name. + pub fn name(&self) -> &StrBytes { + &self.name + } + + /// Returns the header value. + pub fn value(&self) -> &HeaderValue { + &self.value + } +} + +/// Event Stream message. +#[non_exhaustive] +#[derive(Clone, Debug, PartialEq)] +pub struct Message { + headers: Vec
, + payload: Bytes, +} + +impl Message { + /// Creates a new message with the given `payload`. Headers can be added later. + pub fn new(payload: impl Into) -> Message { + Message { + headers: Vec::new(), + payload: payload.into(), + } + } + + /// Creates a message with the given `headers` and `payload`. + pub fn new_from_parts(headers: Vec
, payload: impl Into) -> Self { + Self { + headers, + payload: payload.into(), + } + } + + /// Adds a header to the message. + pub fn add_header(mut self, header: Header) -> Self { + self.headers.push(header); + self + } + + /// Returns all headers. + pub fn headers(&self) -> &[Header] { + &self.headers + } + + /// Returns the payload bytes. + pub fn payload(&self) -> &Bytes { + &self.payload + } +} diff --git a/rust-runtime/aws-smithy-types/src/lib.rs b/rust-runtime/aws-smithy-types/src/lib.rs index 7c28d181740..386c9057337 100644 --- a/rust-runtime/aws-smithy-types/src/lib.rs +++ b/rust-runtime/aws-smithy-types/src/lib.rs @@ -22,6 +22,7 @@ pub mod config_bag; pub mod date_time; pub mod endpoint; pub mod error; +pub mod event_stream; pub mod primitive; pub mod retry; pub mod timeout; @@ -32,6 +33,7 @@ pub mod type_erasure; mod blob; mod document; mod number; +pub mod str_bytes; pub use blob::Blob; pub use date_time::DateTime; diff --git a/rust-runtime/aws-smithy-eventstream/src/str_bytes.rs b/rust-runtime/aws-smithy-types/src/str_bytes.rs similarity index 92% rename from rust-runtime/aws-smithy-eventstream/src/str_bytes.rs rename to rust-runtime/aws-smithy-types/src/str_bytes.rs index aa76e48c319..96661e77975 100644 --- a/rust-runtime/aws-smithy-eventstream/src/str_bytes.rs +++ b/rust-runtime/aws-smithy-types/src/str_bytes.rs @@ -16,7 +16,7 @@ use std::str::Utf8Error; /// /// Example construction from a `&str`: /// ```rust -/// use aws_smithy_eventstream::str_bytes::StrBytes; +/// use aws_smithy_types::str_bytes::StrBytes; /// /// let value: StrBytes = "example".into(); /// assert_eq!("example", value.as_str()); @@ -26,7 +26,7 @@ use std::str::Utf8Error; /// Example construction from `Bytes`: /// ```rust /// use bytes::Bytes; -/// use aws_smithy_eventstream::str_bytes::StrBytes; +/// use aws_smithy_types::str_bytes::StrBytes; /// use std::convert::TryInto; /// /// let bytes = Bytes::from_static(b"example"); @@ -71,13 +71,6 @@ impl StrBytes { } } -#[cfg(feature = "derive-arbitrary")] -impl<'a> arbitrary::Arbitrary<'a> for StrBytes { - fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - Ok(String::arbitrary(unstruct)?.into()) - } -} - impl From for StrBytes { fn from(value: String) -> Self { StrBytes::new(Bytes::from(value)) From f9c05262e0cb7fc8d13ce709cda57dc770f9b464 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Mon, 6 Nov 2023 20:33:01 -0600 Subject: [PATCH 231/331] Avoid exposing `aws_smithy_http::event_stream::receiver::Receiver` in SDK's public API (#3114) ## Motivation and Context Implements #3100 ## Description Currently, we expose `aws_smithy_http::event_stream::Receiver` in generated SDKs, as shown in the following S3's example (see[ a generated diff](https://d2luzm2xt3nokh.cloudfront.net/codegen-diff/cc303ab1a07693ab02d5ec4f06101b628d1dbabe/1aa6a8da7d2b7669ba3ab7179a1fd72aadc03162/aws-sdk-ignore-whitespace/index.html) for `tmp-codegen-diff/aws-sdk/sdk/s3/src/operation/select_object_content/_select_object_content_output.rs`): ``` pub struct SelectObjectContentOutput {

The array of results.

pub payload: ::aws_smithy_http::event_stream::Receiver< crate::types::SelectObjectContentEventStream, crate::types::error::SelectObjectContentEventStreamError, >, ... ``` This PR wraps `Receiver` in a new-type, called `EventReceiver`, which then supports `pub async fn recv` method whose signature is the same as `aws_smithy_http::event_stream::Receiver::recv`. ## Testing Relied on existing tests (e.g. `s3` and `transcribestreaming` integration tests cover uses cases affected by this change). ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 16 +++++++++++ .../smithy/EventStreamSymbolProviderTest.kt | 2 +- .../codegen/core/rustlang/CargoDependency.kt | 8 ++++++ .../core/smithy/EventStreamSymbolProvider.kt | 8 +++++- .../rust/codegen/core/smithy/RuntimeType.kt | 3 ++ .../generators/http/HttpBindingGenerator.kt | 15 ++++++++-- .../aws-smithy-http/src/event_stream.rs | 2 +- .../src/event_stream/receiver.rs | 22 ++------------- .../aws-smithy-types/src/event_stream.rs | 18 ++++++++++++ rust-runtime/inlineable/Cargo.toml | 2 +- rust-runtime/inlineable/src/event_receiver.rs | 28 +++++++++++++++++++ rust-runtime/inlineable/src/lib.rs | 2 ++ .../ci-cdk/canary-runner/src/build_bundle.rs | 3 +- 13 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 rust-runtime/inlineable/src/event_receiver.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c500943e451..540d5cac804 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -30,3 +30,19 @@ message = """ references = ["smithy-rs#3139"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all"} author = "ysaito1001" + +[[smithy-rs]] +message = """ +An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv). +""" +references = ["smithy-rs#3100", "smithy-rs#3114"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" + +[[aws-sdk-rust]] +message = """ +An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv). +""" +references = ["smithy-rs#3100", "smithy-rs#3114"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "ysaito1001" diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt index e9e26724d9c..6b8c28826cc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt @@ -69,7 +69,7 @@ class EventStreamSymbolProviderTest { listOf(someStream, someStreamError), ) outputType shouldBe RustType.Application( - RuntimeType.eventStreamReceiver(TestRuntimeConfig).toSymbol().rustType(), + RuntimeType.eventReceiver(TestRuntimeConfig).toSymbol().rustType(), listOf(someStream, someStreamError), ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 1ff88da814f..79c215009a4 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -89,6 +89,14 @@ class InlineDependency( private fun forInlineableRustFile(name: String, vararg additionalDependencies: RustDependency) = forRustFile(RustModule.private(name), "/inlineable/src/$name.rs", *additionalDependencies) + fun eventReceiver(runtimeConfig: RuntimeConfig) = + forInlineableRustFile( + "event_receiver", + CargoDependency.smithyHttp(runtimeConfig), + CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyTypes(runtimeConfig), + ) + fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = forInlineableRustFile("auth_plugin", CargoDependency.smithyRuntimeApi(runtimeConfig)) fun jsonErrors(runtimeConfig: RuntimeConfig) = diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt index fdb6e35a833..97ef843fe7a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt @@ -53,7 +53,13 @@ class EventStreamSymbolProvider( (shape.isOutputEventStream(model) && target == CodegenTarget.SERVER) val outer = when (isSender) { true -> RuntimeType.eventStreamSender(runtimeConfig).toSymbol().rustType() - else -> RuntimeType.eventStreamReceiver(runtimeConfig).toSymbol().rustType() + else -> { + if (target == CodegenTarget.SERVER) { + RuntimeType.eventStreamReceiver(runtimeConfig).toSymbol().rustType() + } else { + RuntimeType.eventReceiver(runtimeConfig).toSymbol().rustType() + } + } } val rustType = RustType.Application(outer, listOf(innerT, errorT)) return initial.toBuilder() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 8f33e70753b..ba6bcb618cd 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -405,6 +405,9 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun eventStreamReceiver(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::Receiver") + fun eventReceiver(runtimeConfig: RuntimeConfig) = + forInlineDependency(InlineDependency.eventReceiver(runtimeConfig)).resolve("EventReceiver") + fun eventStreamSender(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::EventStreamSender") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt index 7268dfd12a2..2491d07c0e7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt @@ -38,6 +38,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -254,15 +255,25 @@ class HttpBindingGenerator( operationShape, targetShape, ).render() - val receiver = outputT.rustType().qualifiedName() rustTemplate( """ let unmarshaller = #{unmarshallerConstructorFn}(); let body = std::mem::replace(body, #{SdkBody}::taken()); - Ok($receiver::new(unmarshaller, body)) + Ok(#{receiver:W}) """, "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "unmarshallerConstructorFn" to unmarshallerConstructorFn, + "receiver" to writable { + if (codegenTarget == CodegenTarget.SERVER) { + rust("${outputT.rustType().qualifiedName()}::new(unmarshaller, body)") + } else { + rustTemplate( + "#{EventReceiver}::new(#{Receiver}::new(unmarshaller, body))", + "EventReceiver" to RuntimeType.eventReceiver(runtimeConfig), + "Receiver" to RuntimeType.eventStreamReceiver(runtimeConfig), + ) + } + }, ) } diff --git a/rust-runtime/aws-smithy-http/src/event_stream.rs b/rust-runtime/aws-smithy-http/src/event_stream.rs index 0b95bb2d1ec..3d4bab78ff1 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream.rs @@ -17,4 +17,4 @@ pub type BoxError = Box; pub use sender::{EventStreamSender, MessageStreamAdapter, MessageStreamError}; #[doc(inline)] -pub use receiver::{RawMessage, Receiver, ReceiverError}; +pub use receiver::{Receiver, ReceiverError}; diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index 69e1c4381ba..6d94194511e 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -8,7 +8,7 @@ use aws_smithy_eventstream::frame::{ }; use aws_smithy_runtime_api::client::result::{ConnectorError, SdkError}; use aws_smithy_types::body::SdkBody; -use aws_smithy_types::event_stream::Message; +use aws_smithy_types::event_stream::{Message, RawMessage}; use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; @@ -87,23 +87,6 @@ impl RecvBuf { } } -/// Raw message from a [`Receiver`] when a [`SdkError::ResponseError`] is returned. -#[derive(Debug)] -#[non_exhaustive] -pub enum RawMessage { - /// Message was decoded into a valid frame, but failed to unmarshall into a modeled type. - Decoded(Message), - /// Message failed to be decoded into a valid frame. The raw bytes may not be available in the - /// case where decoding consumed the buffer. - Invalid(Option), -} - -impl RawMessage { - pub(crate) fn invalid(buf: &mut SegmentedBuf) -> Self { - Self::Invalid(Some(buf.copy_to_bytes(buf.remaining()))) - } -} - #[derive(Debug)] enum ReceiverErrorKind { /// The stream ended before a complete message frame was received. @@ -210,11 +193,12 @@ impl Receiver { } if self.buffer.has_data() { trace!(remaining_data = ?self.buffer, "data left over in the event stream response stream"); + let buf = self.buffer.buffered(); return Err(SdkError::response_error( ReceiverError { kind: ReceiverErrorKind::UnexpectedEndOfStream, }, - RawMessage::invalid(self.buffer.buffered()), + RawMessage::invalid(Some(buf.copy_to_bytes(buf.remaining()))), )); } Ok(None) diff --git a/rust-runtime/aws-smithy-types/src/event_stream.rs b/rust-runtime/aws-smithy-types/src/event_stream.rs index a63c44e8edd..0d98dabd991 100644 --- a/rust-runtime/aws-smithy-types/src/event_stream.rs +++ b/rust-runtime/aws-smithy-types/src/event_stream.rs @@ -183,3 +183,21 @@ impl Message { &self.payload } } + +/// Raw message from an event stream receiver when a response error is encountered. +#[derive(Debug)] +#[non_exhaustive] +pub enum RawMessage { + /// Message was decoded into a valid frame, but failed to unmarshall into a modeled type. + Decoded(Message), + /// Message failed to be decoded into a valid frame. The raw bytes may not be available in the + /// case where decoding consumed the buffer. + Invalid(Option), +} + +impl RawMessage { + /// Creates a `RawMessage` for failure to decode a message into a valid frame. + pub fn invalid(bytes: Option) -> Self { + Self::Invalid(bytes) + } +} diff --git a/rust-runtime/inlineable/Cargo.toml b/rust-runtime/inlineable/Cargo.toml index 6d0c099429e..fd460dc08f5 100644 --- a/rust-runtime/inlineable/Cargo.toml +++ b/rust-runtime/inlineable/Cargo.toml @@ -19,7 +19,7 @@ default = ["gated-tests"] [dependencies] async-trait = "0.1" -aws-smithy-http = { path = "../aws-smithy-http" } +aws-smithy-http = { path = "../aws-smithy-http", features = ["event-stream"] } aws-smithy-http-server = { path = "../aws-smithy-http-server" } aws-smithy-json = { path = "../aws-smithy-json" } aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client"] } diff --git a/rust-runtime/inlineable/src/event_receiver.rs b/rust-runtime/inlineable/src/event_receiver.rs new file mode 100644 index 00000000000..50b78f7aa37 --- /dev/null +++ b/rust-runtime/inlineable/src/event_receiver.rs @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_http::event_stream::Receiver; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_types::event_stream::RawMessage; + +#[derive(Debug)] +/// Receives unmarshalled events at a time out of an Event Stream. +pub struct EventReceiver { + inner: Receiver, +} + +impl EventReceiver { + pub(crate) fn new(inner: Receiver) -> Self { + Self { inner } + } + + /// Asynchronously tries to receive an event from the stream. If the stream has ended, it + /// returns an `Ok(None)`. If there is a transport layer error, it will return + /// `Err(SdkError::DispatchFailure)`. Service-modeled errors will be a part of the returned + /// messages. + pub async fn recv(&mut self) -> Result, SdkError> { + self.inner.recv().await + } +} diff --git a/rust-runtime/inlineable/src/lib.rs b/rust-runtime/inlineable/src/lib.rs index 01490bcee5b..10f9ed7c2ee 100644 --- a/rust-runtime/inlineable/src/lib.rs +++ b/rust-runtime/inlineable/src/lib.rs @@ -13,6 +13,8 @@ mod client_idempotency_token; mod constrained; #[allow(dead_code)] mod ec2_query_errors; +#[allow(unused)] +mod event_receiver; #[allow(dead_code)] mod idempotency_token; #[allow(dead_code)] diff --git a/tools/ci-cdk/canary-runner/src/build_bundle.rs b/tools/ci-cdk/canary-runner/src/build_bundle.rs index 00b628f9685..4da1e0b4c98 100644 --- a/tools/ci-cdk/canary-runner/src/build_bundle.rs +++ b/tools/ci-cdk/canary-runner/src/build_bundle.rs @@ -66,7 +66,8 @@ const REQUIRED_SDK_CRATES: &[&str] = &[ // The elements in this `Vec` should be sorted in an ascending order by the release date. lazy_static! { static ref NOTABLE_SDK_RELEASE_TAGS: Vec = vec![ - ReleaseTag::from_str("release-2023-10-26").unwrap(), // last version before addition of Sigv4a MRAP test + // last version before addition of Sigv4a MRAP test + ReleaseTag::from_str("release-2023-10-26").unwrap(), ]; } From a42c818b4af8d20b94c53486f952f255ff0e4dff Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 7 Nov 2023 11:09:39 -0800 Subject: [PATCH 232/331] Allow SDK examples to rename from `rust_dev_preview` to `rust` (#3115) The examples currently reside in aws-doc-sdk-examples/rust_dev_preview, but this name will need to change when the SDK goes GA. This PR modifies the SDK generator to look for `rust/` before `rust_dev_preview/`. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/sdk-versioner/README.md | 4 ++-- tools/ci-scripts/generate-aws-sdk | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tools/ci-build/sdk-versioner/README.md b/tools/ci-build/sdk-versioner/README.md index 866ed5cb2f8..1d430544669 100644 --- a/tools/ci-build/sdk-versioner/README.md +++ b/tools/ci-build/sdk-versioner/README.md @@ -12,12 +12,12 @@ Example updating SDK examples to use SDK version 0.5.0 with Smithy version 0.35. $ sdk-versioner \ --sdk-version 0.5.0 \ --smithy-version 0.35.0 \ - path/to/aws-doc-sdk-examples/rust_dev_preview + path/to/aws-doc-sdk-examples/rust ``` Example updating SDK examples to refer to local generated code: ```bash $ sdk-versioner \ --sdk-path path/to/smithy-rs/aws/sdk/build/aws-sdk/sdk \ - path/to/aws-doc-sdk-examples/rust_dev_preview + path/to/aws-doc-sdk-examples/rust ``` diff --git a/tools/ci-scripts/generate-aws-sdk b/tools/ci-scripts/generate-aws-sdk index d2bf30ec85c..36db805639a 100755 --- a/tools/ci-scripts/generate-aws-sdk +++ b/tools/ci-scripts/generate-aws-sdk @@ -23,7 +23,12 @@ fi echo -e "${C_YELLOW}Taking examples from 'awsdocs/aws-doc-sdk-examples'...${C_RESET}" examples_revision=$(cd aws-doc-sdk-examples; git rev-parse HEAD) -mv aws-doc-sdk-examples/rust_dev_preview smithy-rs/aws/sdk/examples +# TODO(removeSdkExamplesDevPreview): One release after `rust_dev_preview` is renamed to `rust`, this check can be cleaned up +if [[ -d "aws-doc-sdk-examples/rust" ]]; then + mv aws-doc-sdk-examples/rust smithy-rs/aws/sdk/examples +else + mv aws-doc-sdk-examples/rust_dev_preview smithy-rs/aws/sdk/examples +fi rm -rf smithy-rs/aws/sdk/examples/.cargo echo -e "${C_YELLOW}Creating empty model metadata file since we don't have model update information...${C_RESET}" From cc2b9474f3ef2de93fcce7b0f6c4b5db2be91559 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 7 Nov 2023 22:03:46 -0600 Subject: [PATCH 233/331] Update release tooling to handle both stable and unstable crates (#3082) ## Motivation and Context This PR updates our smithy-rs release tooling to prepare for handling both stable and unstable crates. Merging this PR to `main` does not make any of the runtime crates stable, instead we will just have a supporting mechanism in place, ready to be turned on by implementing `TODO(GA)`. ## Description At a high level, this PR will - update the `Release smithy-rs` workflow UI to have an additional input `Stable semantic version`: ![Screenshot 2023-10-24 at 10 19 07 PM](https://github.com/awslabs/smithy-rs/assets/15333866/097502e6-3193-43f6-b39b-dd231c2d14d7) - split an existing gradle property `smithy.rs.runtime.crate.version` into `smithy.rs.runtime.crate.stable.version` and `smithy.rs.runtime.crate.unstable.version`. - make `publisher upgrade-runtime-crates-version` take a new, optional (for backwards compatibility) command line argument `--stable-version` to use the said gradle property `smithy.rs.runtime.crate.stable.version`. This will allow the `publisher` to set a value passed via a workflow input `Stable semantic version` to `smithy.rs.runtime.crate.stable.version` in `gradle.properties` (and the same goes for unstable crates). - update `fixRuntimeCrateVersions` so that it fixes up runtime crate versions based on properties `smithy.rs.runtime.crate.stable.version` and `smithy.rs.runtime.crate.unstable.version`. **NOTE** There is a guard in place. When this PR gets merged and then we enter a stable crate version in the `Stable semantic version` text box, it will be overwritten by a version in `Unstable semantic version`, so that 1.x.y version will NOT be published to `crates.io` before GA and that also replicates today's release workflow's behavior (only publishing unstable crates). Just make sure we specify a 0.x.y in the `Untable semantic version` text box because that does get shipped. ### What happens once `TODO(GA)` has been implemented? Roughly, it will look like this. When we run the `Release smithy-rs` workflow (not a dry-run), providing a stable version (say 1.0.0) and a unstable version (say 0.57.0) in the workflow text boxes, 1. the workflow will create a new release branch `smithy-rs-release-1.x.y`. 2. the workflow will set 1.0.0 to `smithy.rs.runtime.crate.stable.version` and 0.57.0 to `smithy.rs.runtime.crate.unstable.version` in `gradle.properties`. 3. for whatever smithy runtime crates whose package metadata says ``` [package.metadata.smithy-rs-release-tooling] stable = true ``` their `Cargo.toml` will include `version = 1.0.0` (and `version = 0.57.0` if `smithy-rs-release-tooling` is not specified or if its value is `stable = false`). 4. the workflow will publish smithy runtime crates accordingly to `crates.io`. 5. releasing `aws-sdk-rust` subsequently will render `version = 1.0.0` in `Cargo.toml` for stable AWS runtime crates (again as specified by `smithy-rs-release-tooling`), will render `version = 1.1.0` for SDK crates (we will not go into details here as to why it's not `1.0.0`), and will publish those crates to `crates.io`. ## Testing In a [separate branch](https://github.com/awslabs/smithy-rs/tree/ysaito/stable-and-unstable-crates) that implemented `TODO(GA)`, I verified that - our internal release pipeline was executed without errors - a generated AWS SDK had following manifests (showing excerpts from arbitrary crates) ``` [package] name = "aws-sdk-s3" version = "1.1.0" ``` ``` [package] name = "aws-smithy-types" version = "1.0.0" ``` ``` [package] name = "aws-smithy-http" version = "0.57.0" ``` ``` [package] name = "aws-types" version = "1.0.0" ``` ``` [package] name = "aws-config" version = "1.0.0" ``` ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- .github/workflows/release.yml | 25 ++-- aws/rust-runtime/aws-config/Cargo.toml | 6 + aws/rust-runtime/aws-runtime-api/Cargo.toml | 6 + aws/rust-runtime/aws-types/Cargo.toml | 6 + .../aws-types/src/build_metadata.rs | 4 +- aws/sdk-codegen/build.gradle.kts | 15 --- aws/sdk/build.gradle.kts | 20 +-- buildSrc/src/main/kotlin/CrateSet.kt | 72 ++++++----- buildSrc/src/main/kotlin/ManifestPatcher.kt | 4 +- .../src/main/kotlin/aws/sdk/CrateVersioner.kt | 2 +- .../src/main/kotlin/aws/sdk/ServiceLoader.kt | 4 +- buildSrc/src/test/kotlin/CrateSetTest.kt | 72 +++++++++++ gradle.properties | 10 +- rust-runtime/aws-smithy-async/Cargo.toml | 6 + .../aws-smithy-runtime-api/Cargo.toml | 6 + rust-runtime/aws-smithy-types/Cargo.toml | 6 + rust-runtime/build.gradle.kts | 8 +- tools/ci-build/publisher/Cargo.lock | 2 +- tools/ci-build/publisher/Cargo.toml | 2 +- tools/ci-build/publisher/src/publish.rs | 12 +- .../publisher/src/subcommand/fix_manifests.rs | 85 +++++++++++-- .../src/subcommand/fix_manifests/validate.rs | 82 +++++++----- .../upgrade_runtime_crates_version.rs | 120 +++++++++++++++--- .../smithy-rs-tool-common/src/package.rs | 11 ++ tools/ci-scripts/upgrade-gradle-properties | 6 +- 25 files changed, 445 insertions(+), 147 deletions(-) create mode 100644 buildSrc/src/test/kotlin/CrateSetTest.kt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 101ebbc7c5c..0429e31e52f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,22 +13,29 @@ env: rust_version: 1.70.0 name: Release smithy-rs -run-name: ${{ github.workflow }} ${{ inputs.semantic_version }} (${{ inputs.commit_sha }}) - ${{ inputs.dry_run && 'Dry run' || 'Production run' }} +run-name: ${{ inputs.dry_run && 'Dry run' || 'Prod run' }} - ${{ github.workflow }} ${{ inputs.stable_semantic_version }}/${{ inputs.unstable_semantic_version }} (${{ inputs.commit_sha }}) on: workflow_dispatch: inputs: commit_sha: description: | - The SHA of the git commit that you want to release. + Commit SHA: The SHA of the git commit that you want to release. You must use the non-abbreviated SHA (e.g. b2318b0 won't work!). required: true type: string - semantic_version: - description: The semver tag that you want to release (e.g. 0.52.1) + stable_semantic_version: + description: | + Stable semantic version: The semver tag that you want to release for stable crates (e.g. 1.0.2) + required: true + type: string + unstable_semantic_version: + description: | + Unstable semantic version: The semver tag that you want to release for unstable crates (e.g. 0.52.1) required: true type: string dry_run: - description: Dry runs will only produce release artifacts, but they will not cut a release tag in GitHub nor publish to crates.io + description: | + Dry run: When selected, it only produces release artifacts, but will not cut a release tag in GitHub or publish to crates.io required: true type: boolean default: true @@ -92,7 +99,8 @@ jobs: id: branch-push shell: bash env: - SEMANTIC_VERSION: ${{ inputs.semantic_version }} + # TODO(GA): specify ${{ inputs.stable_semantic_version }} + SEMANTIC_VERSION: ${{ inputs.unstable_semantic_version }} DRY_RUN: ${{ inputs.dry_run }} run: | set -e @@ -125,7 +133,7 @@ jobs: uses: ./smithy-rs/.github/actions/docker-build with: action: upgrade-gradle-properties - action-arguments: ${{ inputs.semantic_version }} + action-arguments: ${{ inputs.stable_semantic_version }} ${{ inputs.unstable_semantic_version }} - name: Download all artifacts uses: ./smithy-rs/.github/actions/download-all-artifacts - name: Push gradle.properties changes @@ -133,7 +141,8 @@ jobs: working-directory: upgrade-gradle-properties/smithy-rs shell: bash env: - SEMANTIC_VERSION: ${{ inputs.semantic_version }} + # TODO(GA): specify ${{ inputs.stable_semantic_version }} + SEMANTIC_VERSION: ${{ inputs.unstable_semantic_version }} RELEASE_COMMIT_SHA: ${{ inputs.commit_sha }} RELEASE_BRANCH_NAME: ${{ needs.get-or-create-release-branch.outputs.release_branch }} DRY_RUN: ${{ inputs.dry_run }} diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index b7c5e4bd589..db31f6b4454 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -76,3 +76,9 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-config", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-runtime-api/Cargo.toml b/aws/rust-runtime/aws-runtime-api/Cargo.toml index 49353b7d081..4c353537f54 100644 --- a/aws/rust-runtime/aws-runtime-api/Cargo.toml +++ b/aws/rust-runtime/aws-runtime-api/Cargo.toml @@ -14,3 +14,9 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-runtime-api", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-types/Cargo.toml b/aws/rust-runtime/aws-types/Cargo.toml index 0f303280834..b4002ca5e0f 100644 --- a/aws/rust-runtime/aws-types/Cargo.toml +++ b/aws/rust-runtime/aws-types/Cargo.toml @@ -38,3 +38,9 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-types", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-types/src/build_metadata.rs b/aws/rust-runtime/aws-types/src/build_metadata.rs index 959f728411b..31ece276f12 100644 --- a/aws/rust-runtime/aws-types/src/build_metadata.rs +++ b/aws/rust-runtime/aws-types/src/build_metadata.rs @@ -93,7 +93,9 @@ mod test { let meta = &BUILD_METADATA; // obviously a slightly brittle test. Will be a small update for Rust 2.0 and GA :-) assert!(meta.rust_version.starts_with("1.")); - assert!(meta.core_pkg_version.starts_with("0.")); + // In our release process towards GA, the package version could either be 0. or 1. + // so we need to make this `assert!` more flexible. + assert!(meta.core_pkg_version.starts_with("0.") || meta.core_pkg_version.starts_with("1.")); // quick sanity check that we're parsing common platforms correctly if cfg!(target_os = "linux") { assert_eq!(meta.os_family, OsFamily::Linux); diff --git a/aws/sdk-codegen/build.gradle.kts b/aws/sdk-codegen/build.gradle.kts index 6eba2aed648..fc52936daed 100644 --- a/aws/sdk-codegen/build.gradle.kts +++ b/aws/sdk-codegen/build.gradle.kts @@ -30,23 +30,8 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-endpoints:$smithyVersion") } -val generateAwsRuntimeCrateVersion by tasks.registering { - // generate the version of the runtime to use as a resource. - // this keeps us from having to manually change version numbers in multiple places - val resourcesDir = "$buildDir/resources/main/software/amazon/smithy/rustsdk" - val versionFile = file("$resourcesDir/sdk-crate-version.txt") - outputs.file(versionFile) - val crateVersion = project.properties["smithy.rs.runtime.crate.version"]?.toString()!! - inputs.property("crateVersion", crateVersion) - sourceSets.main.get().output.dir(resourcesDir) - doLast { - versionFile.writeText(crateVersion) - } -} - tasks.compileKotlin { kotlinOptions.jvmTarget = "1.8" - dependsOn(generateAwsRuntimeCrateVersion) } // Reusable license copySpec diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 0ea9ab01fbd..21a8f130d40 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -76,8 +76,8 @@ fun eventStreamAllowList(): Set { } fun generateSmithyBuild(services: AwsServices): String { - val awsConfigVersion = properties.get("smithy.rs.runtime.crate.version") - ?: throw IllegalStateException("missing smithy.rs.runtime.crate.version for aws-config version") + val awsConfigVersion = properties.get(CrateSet.STABLE_VERSION_PROP_NAME) + ?: throw IllegalStateException("missing ${CrateSet.STABLE_VERSION_PROP_NAME} for aws-config version") val debugMode = properties.get("debugMode").toBoolean() val serviceProjections = services.services.map { service -> val files = service.modelFiles().map { extraFile -> @@ -270,10 +270,10 @@ fun rewritePathDependency(line: String): String { tasks.register("copyAllRuntimes") { dependsOn("smithyBuildJar") from("$rootDir/aws/rust-runtime") { - CrateSet.AWS_SDK_RUNTIME.forEach { include("$it/**") } + CrateSet.AWS_SDK_RUNTIME.forEach { include("${it.name}/**") } } from("$rootDir/rust-runtime") { - CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { include("$it/**") } + CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { include("${it.name}/**") } } exclude("**/target") exclude("**/Cargo.lock") @@ -285,9 +285,9 @@ tasks.register("relocateAwsRuntime") { dependsOn("copyAllRuntimes") doLast { // Patch the Cargo.toml files - CrateSet.AWS_SDK_RUNTIME.forEach { moduleName -> - patchFile(sdkOutputDir.resolve("$moduleName/Cargo.toml")) { line -> - rewriteRuntimeCrateVersion(properties, line.let(::rewritePathDependency)) + CrateSet.AWS_SDK_RUNTIME.forEach { module -> + patchFile(sdkOutputDir.resolve("${module.name}/Cargo.toml")) { line -> + rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line.let(::rewritePathDependency)) } } } @@ -296,9 +296,9 @@ tasks.register("relocateRuntime") { dependsOn("copyAllRuntimes") doLast { // Patch the Cargo.toml files - CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { moduleName -> - patchFile(sdkOutputDir.resolve("$moduleName/Cargo.toml")) { line -> - rewriteRuntimeCrateVersion(properties, line) + CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { module -> + patchFile(sdkOutputDir.resolve("${module.name}/Cargo.toml")) { line -> + rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line) } } } diff --git a/buildSrc/src/main/kotlin/CrateSet.kt b/buildSrc/src/main/kotlin/CrateSet.kt index 132246cf39e..d8a95838e60 100644 --- a/buildSrc/src/main/kotlin/CrateSet.kt +++ b/buildSrc/src/main/kotlin/CrateSet.kt @@ -3,45 +3,57 @@ * SPDX-License-Identifier: Apache-2.0 */ +data class Crate(val name: String, val versionPropertyName: String) + object CrateSet { + const val STABLE_VERSION_PROP_NAME = "smithy.rs.runtime.crate.stable.version" + const val UNSTABLE_VERSION_PROP_NAME = "smithy.rs.runtime.crate.unstable.version" + + /* + * Crates marked as `STABLE_VERSION_PROP_NAME` should have the following package metadata in their `Cargo.toml` + * + * [package.metadata.smithy-rs-release-tooling] + * stable = true + */ + val AWS_SDK_RUNTIME = listOf( - "aws-config", - "aws-credential-types", - "aws-endpoint", - "aws-http", - "aws-hyper", - "aws-runtime", - "aws-runtime-api", - "aws-sig-auth", - "aws-sigv4", - "aws-types", + Crate("aws-config", STABLE_VERSION_PROP_NAME), + Crate("aws-credential-types", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-endpoint", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-http", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-hyper", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-runtime", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-runtime-api", STABLE_VERSION_PROP_NAME), + Crate("aws-sig-auth", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-sigv4", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-types", STABLE_VERSION_PROP_NAME), ) - private val SMITHY_RUNTIME_COMMON = listOf( - "aws-smithy-async", - "aws-smithy-checksums", - "aws-smithy-client", - "aws-smithy-eventstream", - "aws-smithy-http", - "aws-smithy-http-auth", - "aws-smithy-http-tower", - "aws-smithy-json", - "aws-smithy-protocol-test", - "aws-smithy-query", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-smithy-types-convert", - "aws-smithy-xml", + val SMITHY_RUNTIME_COMMON = listOf( + Crate("aws-smithy-async", STABLE_VERSION_PROP_NAME), + Crate("aws-smithy-checksums", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-client", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-eventstream", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http-auth", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http-tower", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-json", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-protocol-test", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-query", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-runtime", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-runtime-api", STABLE_VERSION_PROP_NAME), + Crate("aws-smithy-types", STABLE_VERSION_PROP_NAME), + Crate("aws-smithy-types-convert", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-xml", UNSTABLE_VERSION_PROP_NAME), ) val AWS_SDK_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON val SERVER_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON + listOf( - "aws-smithy-http-server", - "aws-smithy-http-server-python", - "aws-smithy-http-server-typescript", + Crate("aws-smithy-http-server", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http-server-python", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http-server-typescript", UNSTABLE_VERSION_PROP_NAME), ) - val ENTIRE_SMITHY_RUNTIME = (AWS_SDK_SMITHY_RUNTIME + SERVER_SMITHY_RUNTIME).toSortedSet() + val ENTIRE_SMITHY_RUNTIME = (AWS_SDK_SMITHY_RUNTIME + SERVER_SMITHY_RUNTIME).toSortedSet(compareBy { it.name }) } diff --git a/buildSrc/src/main/kotlin/ManifestPatcher.kt b/buildSrc/src/main/kotlin/ManifestPatcher.kt index 9a9d6fbff54..aabe25a3db8 100644 --- a/buildSrc/src/main/kotlin/ManifestPatcher.kt +++ b/buildSrc/src/main/kotlin/ManifestPatcher.kt @@ -14,8 +14,8 @@ fun rewriteCrateVersion(line: String, version: String): String = line.replace( * Smithy runtime crate versions in smithy-rs are all `0.0.0-smithy-rs-head`. When copying over to the AWS SDK, * these should be changed to the smithy-rs version. */ -fun rewriteRuntimeCrateVersion(properties: PropertyRetriever, line: String): String = - rewriteCrateVersion(line, properties.get("smithy.rs.runtime.crate.version")!!) +fun rewriteRuntimeCrateVersion(version: String, line: String): String = + rewriteCrateVersion(line, version) /** Patches a file with the result of the given `operation` being run on each line */ fun patchFile(path: File, operation: (String) -> String) { diff --git a/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt b/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt index 927a4244e26..7d2119ef07b 100644 --- a/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt +++ b/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt @@ -39,7 +39,7 @@ interface VersionCrate { class SynchronizedCrateVersioner( properties: PropertyRetriever, - private val sdkVersion: String = properties.get("smithy.rs.runtime.crate.version") + private val sdkVersion: String = properties.get(CrateSet.STABLE_VERSION_PROP_NAME) ?: throw Exception("SDK runtime crate version missing"), ) : VersionCrate { init { diff --git a/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt b/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt index 9871741ad51..f31211f4db0 100644 --- a/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt +++ b/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt @@ -35,8 +35,8 @@ class AwsServices( val allModules: Set by lazy { ( services.map(AwsService::module).map { "sdk/$it" } + - CrateSet.AWS_SDK_SMITHY_RUNTIME.map { "sdk/$it" } + - CrateSet.AWS_SDK_RUNTIME.map { "sdk/$it" } + CrateSet.AWS_SDK_SMITHY_RUNTIME.map { "sdk/${it.name}" } + + CrateSet.AWS_SDK_RUNTIME.map { "sdk/${it.name}" } // Root tests should not be included since they can't be part of the root Cargo workspace // in order to test differences in Cargo features. Examples should not be included either // because each example itself is a workspace. diff --git a/buildSrc/src/test/kotlin/CrateSetTest.kt b/buildSrc/src/test/kotlin/CrateSetTest.kt new file mode 100644 index 00000000000..59b1c825518 --- /dev/null +++ b/buildSrc/src/test/kotlin/CrateSetTest.kt @@ -0,0 +1,72 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import CrateSet.AWS_SDK_RUNTIME +import CrateSet.SERVER_SMITHY_RUNTIME +import CrateSet.SMITHY_RUNTIME_COMMON +import CrateSet.STABLE_VERSION_PROP_NAME +import CrateSet.UNSTABLE_VERSION_PROP_NAME +import com.moandjiezana.toml.Toml +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.io.File +import java.util.logging.Logger + +class CrateSetTest { + private val logger: Logger = Logger.getLogger("CrateSetTest") + + /* + * Checks whether `versionPropertyName` for a system under test, i.e. `Crate` in `CrateSet.kt`, + * matches what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml` + * for the corresponding crate. + */ + private fun sutStabilityMatchesManifestStability(versionPropertyName: String, stabilityInManifest: Boolean) { + when (stabilityInManifest) { + true -> assertEquals(STABLE_VERSION_PROP_NAME, versionPropertyName) + false -> assertEquals(UNSTABLE_VERSION_PROP_NAME, versionPropertyName) + } + } + + /* + * Checks whether each element in `crateSet` specifies the correct `versionPropertyName` according to + * what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml` for the corresponding crate, + * located at `relativePathToRustRuntime`. + * + * If `package.metadata.smithy-rs-release-tooling` does not exist in a `Cargo.toml`, the implementation + * will treat that crate as unstable. + */ + private fun crateSetStabilitiesMatchManifestStabilities(crateSet: List, relativePathToRustRuntime: String) { + crateSet.forEach { + val path = "$relativePathToRustRuntime/${it.name}/Cargo.toml" + val contents = File(path).readText() + val manifest = try { + Toml().read(contents) + } catch (e: java.lang.IllegalStateException) { + // Currently, `aws-sigv4` cannot be read as a `TOML` because of the following error: + // Invalid table definition on line 54: [target.'cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))'.dev-dependencies]] + logger.info("failed to read ${it.name} as TOML: $e") + Toml() + } + manifest.getTable("package.metadata.smithy-rs-release-tooling")?.entrySet()?.map { entry -> + sutStabilityMatchesManifestStability(it.versionPropertyName, entry.value as Boolean) + } ?: sutStabilityMatchesManifestStability(it.versionPropertyName, false) + } + } + + @Test + fun `aws runtime stabilities should match those in manifest files`() { + crateSetStabilitiesMatchManifestStabilities(AWS_SDK_RUNTIME, "../aws/rust-runtime") + } + + @Test + fun `common smithy runtime stabilities should match those in manifest files`() { + crateSetStabilitiesMatchManifestStabilities(SMITHY_RUNTIME_COMMON, "../rust-runtime") + } + + @Test + fun `server smithy runtime stabilities should match those in manifest files`() { + crateSetStabilitiesMatchManifestStabilities(SERVER_SMITHY_RUNTIME, "../rust-runtime") + } +} diff --git a/gradle.properties b/gradle.properties index 0343d116bd6..738cafd150f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,8 +11,14 @@ rust.msrv=1.70.0 # org.gradle.jvmargs=-Xmx1024M -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5006 org.gradle.jvmargs=-Xmx1024M -# Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.57.1 +# Version number to use for the generated stable runtime crates +# +# TODO(GA): This is currently a placeholder for crates we are going to stabilize at the time of GA. +# Until then, a value of this key can contain 0 for the major version. +smithy.rs.runtime.crate.stable.version=0.57.1 + +# Version number to use for the generated unstable runtime crates +smithy.rs.runtime.crate.unstable.version=0.57.1 kotlin.code.style=official diff --git a/rust-runtime/aws-smithy-async/Cargo.toml b/rust-runtime/aws-smithy-async/Cargo.toml index 12e72c4fea4..9b2535dd12d 100644 --- a/rust-runtime/aws-smithy-async/Cargo.toml +++ b/rust-runtime/aws-smithy-async/Cargo.toml @@ -31,3 +31,9 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-smithy-async", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 51326dda6ea..b936ccdbc0d 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -33,3 +33,9 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-smithy-runtime-api", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index a4e0d39fcd2..8c8f2900056 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -63,6 +63,12 @@ targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-smithy-types", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true + [[bench]] name = "base64" harness = false diff --git a/rust-runtime/build.gradle.kts b/rust-runtime/build.gradle.kts index f600fec9dd0..ff41f1cd859 100644 --- a/rust-runtime/build.gradle.kts +++ b/rust-runtime/build.gradle.kts @@ -32,7 +32,7 @@ tasks["assemble"].apply { tasks.register("copyRuntimeCrates") { from("$rootDir/rust-runtime") { - CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { include("$it/**") } + CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { include("${it.name}/**") } } exclude("**/target") exclude("**/Cargo.lock") @@ -43,9 +43,9 @@ tasks.register("copyRuntimeCrates") { tasks.register("fixRuntimeCrateVersions") { dependsOn("copyRuntimeCrates") doLast { - CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { moduleName -> - patchFile(runtimeOutputDir.resolve("$moduleName/Cargo.toml")) { line -> - rewriteRuntimeCrateVersion(properties, line) + CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { module -> + patchFile(runtimeOutputDir.resolve("${module.name}/Cargo.toml")) { line -> + rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line) } } } diff --git a/tools/ci-build/publisher/Cargo.lock b/tools/ci-build/publisher/Cargo.lock index e77a1dfb263..7acedde3b8a 100644 --- a/tools/ci-build/publisher/Cargo.lock +++ b/tools/ci-build/publisher/Cargo.lock @@ -1021,7 +1021,7 @@ dependencies = [ "dialoguer", "fs-err", "handlebars", - "lazy_static", + "once_cell", "pretty_assertions", "regex", "semver", diff --git a/tools/ci-build/publisher/Cargo.toml b/tools/ci-build/publisher/Cargo.toml index a1ccf3bb94a..9aa5909980e 100644 --- a/tools/ci-build/publisher/Cargo.toml +++ b/tools/ci-build/publisher/Cargo.toml @@ -23,7 +23,7 @@ crates_io_api = "0.7.3" dialoguer = "0.8" fs-err = "2" handlebars = "4.2" -lazy_static = "1" +once_cell = "1.16.0" regex = "1.5.4" semver = "1.0" serde = { version = "1", features = ["derive"] } diff --git a/tools/ci-build/publisher/src/publish.rs b/tools/ci-build/publisher/src/publish.rs index 1a835a7a49d..59d4d48b565 100644 --- a/tools/ci-build/publisher/src/publish.rs +++ b/tools/ci-build/publisher/src/publish.rs @@ -7,19 +7,19 @@ use crate::cargo; use crate::package::PackageHandle; use crate::retry::{run_with_retry, BoxError, ErrorClass}; use crates_io_api::{AsyncClient, Error}; -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use smithy_rs_tool_common::shell::ShellOperation; use std::path::Path; use std::time::Duration; use tracing::info; -lazy_static! { - pub static ref CRATES_IO_CLIENT: AsyncClient = AsyncClient::new( +pub static CRATES_IO_CLIENT: Lazy = Lazy::new(|| { + AsyncClient::new( "AWS_RUST_SDK_PUBLISHER (aws-sdk-rust@amazon.com)", - Duration::from_secs(1) + Duration::from_secs(1), ) - .expect("valid client"); -} + .expect("valid client") +}); /// Return `true` if there is at least one version published on crates.io associated with /// the specified crate name. diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index aa591692d46..6a5ddb425c3 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -16,6 +16,7 @@ use anyhow::{bail, Context, Result}; use clap::Parser; use semver::Version; use smithy_rs_tool_common::ci::running_in_ci; +use smithy_rs_tool_common::package::PackageStability; use std::collections::BTreeMap; use std::ffi::OsStr; use std::path::{Path, PathBuf}; @@ -78,9 +79,28 @@ impl Manifest { let value = self.metadata.get("package").and_then(|v| v.get("publish")); match value { None => Ok(true), - Some(value) => value - .as_bool() - .ok_or(anyhow::Error::msg("unexpected publish setting")), + Some(value) => value.as_bool().ok_or(anyhow::Error::msg(format!( + "unexpected publish setting: {value}" + ))), + } + } + + fn stability(&self) -> Result { + let value = self + .metadata + .get("package.metadata.smithy-rs-release-tooling") + .and_then(|v| v.get("stable")); + match value { + None => Ok(PackageStability::Unstable), + Some(value) => { + if value.as_bool().ok_or(anyhow::Error::msg(format!( + "unexpected stable setting: {value}" + )))? { + Ok(PackageStability::Stable) + } else { + Ok(PackageStability::Unstable) + } + } } } } @@ -122,11 +142,21 @@ impl Versions { fn get(&self, crate_name: &str) -> Option<&Version> { self.0.get(crate_name).map(|v| &v.version) } + + fn stable(&self, crate_name: &str) -> Option { + match self.0.get(crate_name) { + Some(VersionWithMetadata { stability, .. }) => { + Some(*stability == PackageStability::Stable) + } + _ => None, + } + } } struct VersionWithMetadata { version: Version, publish: bool, + stability: PackageStability, } async fn read_manifests(fs: Fs, manifest_paths: Vec) -> Result> { @@ -150,6 +180,7 @@ fn package_versions(manifests: &[Manifest]) -> Result { None => continue, }; let publish = manifest.publish()?; + let stability = manifest.stability()?; let name = package .get("name") .and_then(|name| name.as_str()) @@ -163,7 +194,14 @@ fn package_versions(manifests: &[Manifest]) -> Result { anyhow::Error::msg(format!("{:?} is missing a package version", manifest.path)) })?; let version = parse_version(&manifest.path, version)?; - versions.insert(name.into(), VersionWithMetadata { version, publish }); + versions.insert( + name.into(), + VersionWithMetadata { + version, + publish, + stability, + }, + ); } Ok(Versions(versions)) } @@ -319,16 +357,19 @@ fn fix_manifest(versions: &Versions, manifest: &mut Manifest) -> Result { mod tests { use super::*; - fn make_versions<'a>(versions: impl Iterator) -> Versions { + fn make_versions<'a>( + versions: impl Iterator, + ) -> Versions { let map = versions .into_iter() - .map(|(name, version, publish)| { + .map(|(name, version, publish, stability)| { let publish = *publish; ( name.to_string(), VersionWithMetadata { version: Version::parse(&version).unwrap(), publish, + stability: *stability, }, ) }) @@ -362,9 +403,19 @@ mod tests { metadata, }; let versions = &[ - ("local_build_something", "0.2.0", true), - ("local_dev_something", "0.1.0", false), - ("local_something", "1.1.3", false), + ( + "local_build_something", + "0.2.0", + true, + PackageStability::Unstable, + ), + ( + "local_dev_something", + "0.1.0", + false, + PackageStability::Unstable, + ), + ("local_something", "1.1.3", false, PackageStability::Stable), ]; let versions = make_versions(versions.iter()); fix_manifest(&versions, &mut manifest).expect_err("depends on unpublished local something"); @@ -398,9 +449,19 @@ mod tests { metadata, }; let versions = &[ - ("local_build_something", "0.2.0", true), - ("local_dev_something", "0.1.0", false), - ("local_something", "1.1.3", true), + ( + "local_build_something", + "0.2.0", + true, + PackageStability::Unstable, + ), + ( + "local_dev_something", + "0.1.0", + false, + PackageStability::Unstable, + ), + ("local_something", "1.1.3", true, PackageStability::Stable), ]; let versions = make_versions(versions.iter()); diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs index 40aa8f609ac..e9924124597 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs @@ -26,13 +26,23 @@ pub(super) fn validate_before_fixes( } info!("Pre-validation manifests..."); - let expected_runtime_version = versions + + let expected_stable_runtime_version = versions .get("aws-smithy-types") .ok_or_else(|| anyhow!("`aws-smithy-types` crate missing"))?; + let expected_unstable_runtime_version = versions + .get("aws-smithy-http") + .ok_or_else(|| anyhow!("`aws-smithy-http` crate missing"))?; + for (name, version) in versions.published_crates() { let category = PackageCategory::from_package_name(name); if category == PackageCategory::SmithyRuntime || category == PackageCategory::AwsRuntime { + let expected_runtime_version = if let Some(true) = versions.stable(name) { + expected_stable_runtime_version + } else { + expected_unstable_runtime_version + }; confirm_version(name, expected_runtime_version, version)?; } } @@ -64,17 +74,19 @@ pub(super) async fn validate_after_fixes(location: &Path) -> Result<()> { mod test { use super::*; use crate::subcommand::fix_manifests::VersionWithMetadata; + use smithy_rs_tool_common::package::PackageStability; use std::collections::BTreeMap; use std::str::FromStr; - fn versions(versions: &[(&'static str, &'static str)]) -> Versions { + fn versions(versions: &[(&'static str, &'static str, PackageStability)]) -> Versions { let mut map = BTreeMap::new(); - for (name, version) in versions { + for (name, version, stability) in versions { map.insert( (*name).into(), VersionWithMetadata { version: Version::from_str(version).unwrap(), publish: true, + stability: *stability, }, ); } @@ -82,12 +94,15 @@ mod test { } #[track_caller] - fn expect_success(version_tuples: &[(&'static str, &'static str)]) { + fn expect_success(version_tuples: &[(&'static str, &'static str, PackageStability)]) { validate_before_fixes(&versions(version_tuples), false).expect("success"); } #[track_caller] - fn expect_failure(message: &str, version_tuples: &[(&'static str, &'static str)]) { + fn expect_failure( + message: &str, + version_tuples: &[(&'static str, &'static str, PackageStability)], + ) { if let Err(err) = validate_before_fixes(&versions(version_tuples), false) { assert_eq!(message, format!("{}", err)); } else { @@ -98,52 +113,51 @@ mod test { #[test] fn pre_validate() { expect_success(&[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.1"), - ("aws-smithy-types", "0.35.1"), - ("aws-types", "0.35.1"), + ("aws-config", "1.5.2", PackageStability::Stable), + ("aws-smithy-http", "0.35.1", PackageStability::Unstable), + ("aws-sdk-s3", "1.5.2", PackageStability::Stable), + ("aws-smithy-types", "1.5.2", PackageStability::Stable), + ("aws-types", "1.5.2", PackageStability::Stable), ]); expect_success(&[ - ("aws-smithy-types", "0.35.1"), - ("aws-smithy-http", "0.35.1"), - ("aws-smithy-client", "0.35.1"), + ("aws-smithy-types", "1.5.2", PackageStability::Stable), + ("aws-smithy-http", "0.35.1", PackageStability::Unstable), ]); expect_failure( - "Crate named `aws-smithy-http` should be at version `0.35.1` but is at `0.35.0`", + "Crate named `aws-smithy-runtime-api` should be at version `1.5.3` but is at `1.5.2`", &[ - ("aws-smithy-types", "0.35.1"), - ("aws-smithy-http", "0.35.0"), - ("aws-smithy-client", "0.35.1"), + ("aws-smithy-runtime-api", "1.5.2", PackageStability::Stable), + ("aws-smithy-types", "1.5.3", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), ], ); expect_success(&[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.0"), - ("aws-smithy-types", "0.35.1"), - ("aws-types", "0.35.1"), + ("aws-config", "1.5.2", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), + ("aws-sdk-s3", "1.5.2", PackageStability::Stable), + ("aws-smithy-types", "1.5.2", PackageStability::Stable), + ("aws-types", "1.5.2", PackageStability::Stable), ]); expect_failure( - "Crate named `aws-types` should be at version `0.35.1` but is at `0.35.0`", + "Crate named `aws-types` should be at version `1.5.3` but is at `1.5.2`", &[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.1"), - ("aws-smithy-types", "0.35.1"), - ("aws-types", "0.35.0"), + ("aws-config", "1.5.3", PackageStability::Stable), + ("aws-sdk-s3", "1.5.3", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), + ("aws-smithy-types", "1.5.3", PackageStability::Stable), + ("aws-types", "1.5.2", PackageStability::Stable), ], ); - expect_failure( - "Crate named `aws-smithy-http` should be at version `0.35.1` but is at `0.35.0`", - &[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.1"), - ("aws-smithy-types", "0.35.1"), - ("aws-smithy-http", "0.35.0"), - ], - ); + expect_success(&[ + ("aws-config", "1.5.3", PackageStability::Stable), + ("aws-sdk-s3", "1.5.3", PackageStability::Stable), + ("aws-smithy-types", "1.5.3", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), + ]); } } diff --git a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs index 8132e1fa66e..d0a4a9749bd 100644 --- a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs +++ b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs @@ -6,13 +6,31 @@ use crate::fs::Fs; use anyhow::{anyhow, bail, Context}; use clap::Parser; +use once_cell::sync::Lazy; use regex::Regex; +use smithy_rs_tool_common::package::PackageStability; use std::borrow::Cow; use std::path::{Path, PathBuf}; +static STABLE_VERSION_REGEX: Lazy = Lazy::new(|| { + Regex::new( + r"(?Psmithy\.rs\.runtime\.crate\.stable\.version=)(?P\d+\.\d+\.\d+.*)", + ) + .unwrap() +}); +static UNSTABLE_VERSION_REGEX: Lazy = Lazy::new(|| { + Regex::new( + r"(?Psmithy\.rs\.runtime\.crate\.unstable\.version=)(?P\d+\.\d+\.\d+.*)", + ) + .unwrap() +}); + #[derive(Parser, Debug)] pub struct UpgradeRuntimeCratesVersionArgs { - /// The version of runtime crates you want the code generator to use (e.g. `0.52.0`). + /// The version of stable runtime crates you want the code generator to use (e.g. `1.0.2`). + #[clap(long)] + stable_version: Option, + /// The version of unstable runtime crates you want the code generator to use (e.g. `0.52.0`). #[clap(long)] version: String, /// The path to the `gradle.properties` file. It will default to `gradle.properties` if @@ -24,17 +42,40 @@ pub struct UpgradeRuntimeCratesVersionArgs { pub async fn subcommand_upgrade_runtime_crates_version( args: &UpgradeRuntimeCratesVersionArgs, ) -> Result<(), anyhow::Error> { - let upgraded_version = semver::Version::parse(args.version.as_str()) + let upgraded_unstable_version = semver::Version::parse(args.version.as_str()) .with_context(|| format!("{} is not a valid semver version", &args.version))?; let fs = Fs::Real; let gradle_properties = read_gradle_properties(fs, &args.gradle_properties_path).await?; - let updated_gradle_properties = update_gradle_properties(&gradle_properties, &upgraded_version) + let updated_gradle_properties = update_gradle_properties( + &gradle_properties, + &upgraded_unstable_version, + PackageStability::Unstable, + ) + .with_context(|| { + format!( + "Failed to extract the expected runtime crates version from `{:?}`", + &args.gradle_properties_path + ) + })?; + // TODO(GA): Error out if args.stable_version starts with "0." + // https://github.com/awslabs/smithy-rs/pull/3082#discussion_r1378637315 + let updated_gradle_properties = if let Some(stable_version) = &args.stable_version { + let upgraded_stable_version = semver::Version::parse(stable_version.as_str()) + .with_context(|| format!("{} is not a valid semver version", &stable_version))?; + update_gradle_properties( + &updated_gradle_properties, + &upgraded_stable_version, + PackageStability::Stable, + ) .with_context(|| { format!( "Failed to extract the expected runtime crates version from `{:?}`", &args.gradle_properties_path ) - })?; + })? + } else { + updated_gradle_properties + }; update_gradle_properties_file( fs, &args.gradle_properties_path, @@ -46,11 +87,13 @@ pub async fn subcommand_upgrade_runtime_crates_version( fn update_gradle_properties<'a>( gradle_properties: &'a str, - upgraded_version: &'a semver::Version, + upgraded_version: &semver::Version, + package_stability: PackageStability, ) -> Result, anyhow::Error> { - let version_regex = - Regex::new(r"(?Psmithy\.rs\.runtime\.crate\.version=)(?P\d+\.\d+\.\d+.*)") - .unwrap(); + let version_regex = match package_stability { + PackageStability::Stable => &STABLE_VERSION_REGEX, + PackageStability::Unstable => &UNSTABLE_VERSION_REGEX, + }; let current_version = version_regex .captures(gradle_properties) .ok_or_else(|| anyhow!("Failed to extract the expected runtime crates version"))?; @@ -85,20 +128,65 @@ async fn update_gradle_properties_file( #[cfg(test)] mod tests { use crate::subcommand::upgrade_runtime_crates_version::update_gradle_properties; + use smithy_rs_tool_common::package::PackageStability; #[test] - fn upgrading_works_with_actual_version() { - let gradle_properties = "smithy.rs.runtime.crate.version=0.54.2"; + fn upgrading_works_with_actual_unstable_version() { + let gradle_properties = "smithy.rs.runtime.crate.unstable.version=0.54.2"; let version = semver::Version::new(0, 54, 3); - let updated = update_gradle_properties(gradle_properties, &version).unwrap(); - assert_eq!("smithy.rs.runtime.crate.version=0.54.3", updated); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Unstable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.unstable.version=0.54.3", updated); } #[test] - fn upgrading_works_with_dummy_version() { - let gradle_properties = "smithy.rs.runtime.crate.version=0.0.0-smithy-rs-head"; + fn upgrading_works_with_dummy_unstable_version() { + let gradle_properties = "smithy.rs.runtime.crate.unstable.version=0.0.0-smithy-rs-head"; let version = semver::Version::new(0, 54, 3); - let updated = update_gradle_properties(gradle_properties, &version).unwrap(); - assert_eq!("smithy.rs.runtime.crate.version=0.54.3", updated); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Unstable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.unstable.version=0.54.3", updated); + } + + #[test] + fn upgrading_works_with_actual_stable_version() { + let gradle_properties = "smithy.rs.runtime.crate.stable.version=1.0.2"; + let version = semver::Version::new(1, 0, 3); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Stable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.stable.version=1.0.3", updated); + } + + #[test] + fn upgrading_works_with_dummy_stable_version() { + let gradle_properties = "smithy.rs.runtime.crate.stable.version=0.0.0-smithy-rs-head"; + let version = semver::Version::new(1, 0, 3); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Stable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.stable.version=1.0.3", updated); + } + + #[test] + fn downgrading_stable_crate_should_be_caught_as_err() { + let gradle_properties = "smithy.rs.runtime.crate.stable.version=1.0.2"; + let version = semver::Version::new(1, 0, 1); + let result = + update_gradle_properties(gradle_properties, &version, PackageStability::Stable); + assert!(result.is_err()); + assert!(format!("{:?}", result).contains("downgrade")); + } + + #[test] + fn downgrading_unstable_crate_should_be_caught_as_err() { + let gradle_properties = "smithy.rs.runtime.crate.unstable.version=0.57.1"; + let version = semver::Version::new(0, 57, 0); + let result = + update_gradle_properties(gradle_properties, &version, PackageStability::Unstable); + assert!(result.is_err()); + assert!(format!("{:?}", result).contains("downgrade")); } } diff --git a/tools/ci-build/smithy-rs-tool-common/src/package.rs b/tools/ci-build/smithy-rs-tool-common/src/package.rs index c5543bebfb1..4197099b9ba 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/package.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/package.rs @@ -35,3 +35,14 @@ impl PackageCategory { } } } + +/// Enum to denote whether a package we have control over publishing is stable or not +/// +/// If a package is a third-party one and we cannot publish it, then it is considered as `Unstable`. +/// In general, tooling cares about crates that we have control over publishing, so the third-party +/// crates being marked as `Unstable` does not affect the integrity of tooling. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum PackageStability { + Stable, + Unstable, +} diff --git a/tools/ci-scripts/upgrade-gradle-properties b/tools/ci-scripts/upgrade-gradle-properties index 174b74ac3f7..77fac20c5b4 100755 --- a/tools/ci-scripts/upgrade-gradle-properties +++ b/tools/ci-scripts/upgrade-gradle-properties @@ -6,7 +6,8 @@ set -eux -SEMANTIC_VERSION="${1}" +STABLE_SEMANTIC_VERSION="${1}" +UNSTABLE_SEMANTIC_VERSION="${2}" SMITHY_RS_DIR="$(pwd)/smithy-rs" ARTIFACTS_DIR="$(pwd)/artifacts/upgrade-gradle-properties" mkdir -p "${ARTIFACTS_DIR}" @@ -14,7 +15,8 @@ mkdir -p "${ARTIFACTS_DIR}" pushd "${SMITHY_RS_DIR}" echo "gradle.properties BEFORE the upgrade" cat gradle.properties -publisher upgrade-runtime-crates-version --version "${SEMANTIC_VERSION}" +# TODO(GA): pass ${STABLE_SEMANTIC_VERSION} to --stable-version +publisher upgrade-runtime-crates-version --stable-version "${UNSTABLE_SEMANTIC_VERSION}" --version "${UNSTABLE_SEMANTIC_VERSION}" echo "gradle.properties AFTER the upgrade" cat gradle.properties git status From 79a0e72f2d39f3ae77887f27ce371b8176117947 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Wed, 8 Nov 2023 08:21:26 +0000 Subject: [PATCH 234/331] Add injection hook for structures from a ServiceShape (#3147) Analogous to https://github.com/awslabs/smithy-rs/pull/3001, for `ServiceShape`s ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Signed-off-by: Daniele Ahmed --- .../server/smithy/ServerCodegenVisitor.kt | 5 ++++- .../smithy/customize/ServerCodegenDecorator.kt | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index adfa4662578..dda5660037b 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -624,6 +624,9 @@ open class ServerCodegenVisitor( ScopeMacroGenerator(codegenContext).render(this) } + + codegenDecorator.postprocessServiceGenerateAdditionalStructures(shape) + .forEach { structureShape -> this.structureShape(structureShape) } } /** @@ -649,7 +652,7 @@ open class ServerCodegenVisitor( protocolGenerator.renderOperation(this, shape) } - codegenDecorator.postprocessGenerateAdditionalStructures(shape) + codegenDecorator.postprocessOperationGenerateAdditionalStructures(shape) .forEach { structureShape -> this.structureShape(structureShape) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt index 5470c0902c9..22df729e5ae 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.server.smithy.customize import software.amazon.smithy.build.PluginContext import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.smithy.customize.CombinedCoreCodegenDecorator @@ -41,7 +42,15 @@ interface ServerCodegenDecorator : CoreCodegenDecorator = emptyList() + fun postprocessOperationGenerateAdditionalStructures(operationShape: OperationShape): List = emptyList() + + /** + * For each service, this hook allows decorators to return a collection of structure shapes that will additionally be generated. + * If a structure shape is in the service's closure, note that returning it here will cause for it to be generated more than once, + * making the resulting crate not compile (since it will contain more than one struct with the same name). + * Therefore, ensure that all the structure shapes returned by this method are not in the service's closure. + */ + fun postprocessServiceGenerateAdditionalStructures(serviceShape: ServiceShape): List = emptyList() /** * Configuration methods that should be injected into the `${serviceName}Config` struct to allow users to configure @@ -81,8 +90,11 @@ class CombinedServerCodegenDecorator(decorators: List) : decorator.postprocessValidationExceptionNotAttachedErrorMessage(accumulated) } - override fun postprocessGenerateAdditionalStructures(operationShape: OperationShape): List = - orderedDecorators.flatMap { it.postprocessGenerateAdditionalStructures(operationShape) } + override fun postprocessOperationGenerateAdditionalStructures(operationShape: OperationShape): List = + orderedDecorators.flatMap { it.postprocessOperationGenerateAdditionalStructures(operationShape) } + + override fun postprocessServiceGenerateAdditionalStructures(serviceShape: ServiceShape): List = + orderedDecorators.flatMap { it.postprocessServiceGenerateAdditionalStructures(serviceShape) } override fun configMethods(codegenContext: ServerCodegenContext): List = orderedDecorators.flatMap { it.configMethods(codegenContext) } From a69c346001adad00d689a65487c500acd8e85d2a Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 9 Nov 2023 10:00:19 -0500 Subject: [PATCH 235/331] Update crate guidance to match top-level guidance (#3153) ## Motivation and Context Currently the guidance on the root repo doesn't match the guidance in the crates themselves. Screenshot 2023-11-09 at 9 59 58 AM ## Description Update docs to match ## Testing - [x] post screenshot of docs once they're generated ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt index f167015ac23..047443d803b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt @@ -119,11 +119,12 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon if (includeHeader) { template(asComments, escape("# $moduleName\n")) } + // NOTE: when you change this, you must also change SDK_README.md.hb template( asComments, """ - **Please Note: The SDK is currently in Developer Preview and is intended strictly for - feedback purposes only. Do not use this SDK for production workloads.**${"\n"} + **Please Note: The SDK is currently released as a developer preview, without support or assistance for use + on production workloads. Any use in production is at your own risk.**${"\n"} """.trimIndent(), ) From c869e869ac5aa7bfdfad4d1aef17b76212da167a Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 9 Nov 2023 09:37:22 -0800 Subject: [PATCH 236/331] Add benchmark that compares current with previous release (#3159) This PR adds a new benchmark that compares a previous release with the current generated SDK in smithy-rs main. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../previous-release-comparison/Cargo.lock | 2606 +++++++++++++++++ .../previous-release-comparison/Cargo.toml | 24 + .../benches/README.md | 6 + .../benches/previous_release_comparison.rs | 99 + 4 files changed, 2735 insertions(+) create mode 100644 aws/sdk/benchmarks/previous-release-comparison/Cargo.lock create mode 100644 aws/sdk/benchmarks/previous-release-comparison/Cargo.toml create mode 100644 aws/sdk/benchmarks/previous-release-comparison/benches/README.md create mode 100644 aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs diff --git a/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock b/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock new file mode 100644 index 00000000000..1519750b80f --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock @@ -0,0 +1,2606 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "assert-json-diff" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4259cbe96513d2f1073027a259fc2ca917feb3026a5a8d984e3628e490255cc0" +dependencies = [ + "extend", + "serde", + "serde_json", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "aws-config" +version = "0.57.1" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-http 0.57.1", + "aws-runtime 0.57.1", + "aws-sdk-sso", + "aws-sdk-ssooidc", + "aws-sdk-sts", + "aws-smithy-async 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-json 0.57.1", + "aws-smithy-runtime 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-types 0.57.1", + "bytes", + "fastrand", + "hex", + "http", + "hyper", + "ring", + "time", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "0.57.1" +dependencies = [ + "aws-smithy-async 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80009846d61a0a4f9070d789cf0e64db284cba6984fae3871050d044e6569cd2" +dependencies = [ + "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize", +] + +[[package]] +name = "aws-http" +version = "0.57.1" +dependencies = [ + "aws-smithy-http 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-types 0.57.1", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-http" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e65730b741a5f6422fd338bf6f76b7956b090affeaa045e78fca8c4186e0fd5" +dependencies = [ + "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-runtime" +version = "0.57.1" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-http 0.57.1", + "aws-sigv4 0.57.1", + "aws-smithy-async 0.57.1", + "aws-smithy-eventstream 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-types 0.57.1", + "fastrand", + "http", + "percent-encoding", + "tracing", + "uuid", +] + +[[package]] +name = "aws-runtime" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2414b96071ae840b97c0cc1d44b248d5607d648593cdf474f3fb5465572898" +dependencies = [ + "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sigv4 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fastrand", + "http", + "percent-encoding", + "tracing", + "uuid", +] + +[[package]] +name = "aws-sdk-s3" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-http 0.57.1", + "aws-runtime 0.57.1", + "aws-sigv4 0.57.1", + "aws-smithy-async 0.57.1", + "aws-smithy-checksums 0.57.1", + "aws-smithy-eventstream 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-json 0.57.1", + "aws-smithy-runtime 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-smithy-xml 0.57.1", + "aws-types 0.57.1", + "bytes", + "http", + "http-body", + "once_cell", + "percent-encoding", + "regex", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-s3" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84022763485483ea17d417f9832d5da198bc36829b59f086c0d35ecd2ce59991" +dependencies = [ + "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-runtime 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sigv4 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-checksums 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-json 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-xml 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "http", + "http-body", + "once_cell", + "percent-encoding", + "regex", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-sso" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-http 0.57.1", + "aws-runtime 0.57.1", + "aws-smithy-async 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-json 0.57.1", + "aws-smithy-runtime 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-types 0.57.1", + "bytes", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-sdk-ssooidc" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-http 0.57.1", + "aws-runtime 0.57.1", + "aws-smithy-async 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-json 0.57.1", + "aws-smithy-runtime 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-types 0.57.1", + "bytes", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-sdk-sts" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-http 0.57.1", + "aws-runtime 0.57.1", + "aws-smithy-async 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-json 0.57.1", + "aws-smithy-query", + "aws-smithy-runtime 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "aws-smithy-xml 0.57.1", + "aws-types 0.57.1", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "0.57.1" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-smithy-eventstream 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "bytes", + "form_urlencoded", + "hex", + "hmac", + "http", + "num-bigint", + "once_cell", + "p256", + "percent-encoding", + "regex", + "ring", + "sha2", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-sigv4" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3347c738e0a8449020877d319cda56da74d6e8aba9fff210720fac66cae3c7f4" +dependencies = [ + "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "form_urlencoded", + "hex", + "hmac", + "http", + "num-bigint", + "once_cell", + "p256", + "percent-encoding", + "regex", + "ring", + "sha2", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-async" +version = "0.57.1" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-async" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b65a284265d3eec6cc9f1daef2d0cc3b78684b712cb6c7f1d0f665456b7604" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.57.1" +dependencies = [ + "aws-smithy-http 0.57.1", + "aws-smithy-types 0.57.1", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40f1d5a222ba11ac7d6b20f3668ae282970e50615fa5ee1dd8ac8180c0c1803" +dependencies = [ + "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.57.1" +dependencies = [ + "aws-smithy-types 0.57.1", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16e7ecebc2b083a1b138868a46a343204a6097f343c4830a8b22b3a0d30013e" +dependencies = [ + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.57.1" +dependencies = [ + "aws-smithy-eventstream 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715aeb61fb743848d5d398ce6fb1259f5eba5e13dceec5d5064cada1a181d38d" +dependencies = [ + "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.57.1" +dependencies = [ + "aws-smithy-types 0.57.1", +] + +[[package]] +name = "aws-smithy-json" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de21d368dcd5cab17033406ea6e7351b091164b208381de837510bd7558c0f30" +dependencies = [ + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "aws-smithy-protocol-test" +version = "0.57.1" +dependencies = [ + "assert-json-diff", + "aws-smithy-runtime-api 0.57.1", + "http", + "pretty_assertions", + "regex", + "roxmltree", + "serde_json", + "thiserror", +] + +[[package]] +name = "aws-smithy-protocol-test" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed394939694a0ade77eaff154393e1f7f97e0e73533381e1003384e3173b50" +dependencies = [ + "assert-json-diff", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "http", + "pretty_assertions", + "regex", + "roxmltree", + "serde_json", + "thiserror", +] + +[[package]] +name = "aws-smithy-query" +version = "0.57.1" +dependencies = [ + "aws-smithy-types 0.57.1", + "urlencoding", +] + +[[package]] +name = "aws-smithy-runtime" +version = "0.57.1" +dependencies = [ + "aws-smithy-async 0.57.1", + "aws-smithy-http 0.57.1", + "aws-smithy-protocol-test 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "bytes", + "fastrand", + "http", + "http-body", + "hyper", + "hyper-rustls", + "once_cell", + "pin-project-lite", + "pin-utils", + "rustls", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "aws-smithy-runtime" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4395310662d10f1847324af5fe43e621922cba03b1aa6d26c21096e18a4e79" +dependencies = [ + "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-protocol-test 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "fastrand", + "http", + "http-body", + "hyper", + "hyper-rustls", + "once_cell", + "pin-project-lite", + "pin-utils", + "rustls", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "0.57.1" +dependencies = [ + "aws-smithy-async 0.57.1", + "aws-smithy-types 0.57.1", + "bytes", + "http", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e27594c06f5b36e97d18ef26ed693f1d4c7167b9bbb544b3a9bb653f9f7035" +dependencies = [ + "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "http", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-types" +version = "0.57.1" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util", +] + +[[package]] +name = "aws-smithy-types" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d36f1723ed61e82094498e7283510fe21484b73c215c33874c81a84411b5bdc" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.57.1" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68225c8d3e3e6c565a3cf764aa82440837ef15c33d1dd7205e15715444e4b4ad" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "0.57.1" +dependencies = [ + "aws-credential-types 0.57.1", + "aws-smithy-async 0.57.1", + "aws-smithy-runtime-api 0.57.1", + "aws-smithy-types 0.57.1", + "http", + "rustc_version", + "tracing", +] + +[[package]] +name = "aws-types" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdc27aac60f715bab25f5d758ba5651b80aae791c48e9871ffe298683f00a2b" +dependencies = [ + "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "http", + "rustc_version", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "bytes-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32c" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "futures", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "tokio", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "errno" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "extend" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47da3a72ec598d9c8937a7ebca8962a5c7a1f28444e38c2b33c771ba3f55f05" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "linux-raw-sys" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "previous-release-comparison" +version = "0.1.0" +dependencies = [ + "aws-config", + "aws-credential-types 0.57.1", + "aws-sdk-s3 0.0.0-local", + "aws-sdk-s3 0.35.0", + "aws-smithy-runtime 0.57.1", + "aws-smithy-runtime 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion", + "http", + "tokio", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "ring" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys", +] + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustls" +version = "0.21.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "serde" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.5", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "nu-ansi-term", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "uuid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" + +[[package]] +name = "web-sys" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml b/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml new file mode 100644 index 00000000000..2f591e2eaad --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "previous-release-comparison" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } +aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } +aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } +criterion = { version = "0.5", features = ["async_tokio"] } +http = "0.2.3" +previous-s3 = { version = "0.35", package = "aws-sdk-s3", features = ["test-util"] } +previous-runtime = { version = "0.57.1", package = "aws-smithy-runtime", features = ["test-util"] } +tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } + +[profile.release] +debug = 1 + +[[bench]] +name = "previous_release_comparison" +harness = false diff --git a/aws/sdk/benchmarks/previous-release-comparison/benches/README.md b/aws/sdk/benchmarks/previous-release-comparison/benches/README.md new file mode 100644 index 00000000000..8dd8c49e5a9 --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/benches/README.md @@ -0,0 +1,6 @@ +### Middleware vs. Orchestrator Benchmark + +To run the benchmark: +```bash +./gradlew :aws:sdk:assemble && (cd aws/sdk/benchmarks/previous-release-comparison && cargo bench) +``` diff --git a/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs b/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs new file mode 100644 index 00000000000..29b7acd2fde --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs @@ -0,0 +1,99 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[macro_use] +extern crate criterion; +use criterion::{BenchmarkId, Criterion}; + +macro_rules! test_client { + (previous) => { + test_client!(@internal previous_runtime) + }; + (main) => { + test_client!(@internal aws_smithy_runtime) + }; + (@internal $runtime_crate:ident) => { + $runtime_crate::client::http::test_util::infallible_client_fn(|req| { + assert_eq!( + "https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~", + req.uri().to_string() + ); + http::Response::builder() + .status(200) + .body( + r#" + + test-bucket + prefix~ + 1 + 1000 + false + + some-file.file + 2009-10-12T17:50:30.000Z + 434234 + STANDARD + + + "#, + ) + .unwrap() + }) + }; +} + +macro_rules! test { + (previous, $client:ident) => { + test!(@internal, $client) + }; + (main, $client:ident) => { + test!(@internal, $client) + }; + (@internal, $client:ident) => { + $client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .send() + .await + .expect("successful execution") + }; +} + +fn bench(c: &mut Criterion) { + let main_client = { + let http_client = test_client!(main); + let config = aws_sdk_s3::Config::builder() + .credentials_provider(aws_sdk_s3::config::Credentials::for_tests()) + .region(aws_sdk_s3::config::Region::new("us-east-1")) + .http_client(http_client) + .build(); + aws_sdk_s3::Client::from_conf(config) + }; + let previous_client = { + let http_client = test_client!(previous); + let config = previous_s3::Config::builder() + .credentials_provider(previous_s3::config::Credentials::for_tests()) + .region(previous_s3::config::Region::new("us-east-1")) + .http_client(http_client) + .build(); + previous_s3::Client::from_conf(config) + }; + + let mut group = c.benchmark_group("compare"); + let param = "S3 ListObjectsV2"; + group.bench_with_input(BenchmarkId::new("previous", param), param, |b, _| { + b.to_async(tokio::runtime::Runtime::new().unwrap()) + .iter(|| async { test!(previous, previous_client) }) + }); + group.bench_with_input(BenchmarkId::new("main", param), param, |b, _| { + b.to_async(tokio::runtime::Runtime::new().unwrap()) + .iter(|| async { test!(main, main_client) }) + }); + group.finish(); +} + +criterion_group!(benches, bench); +criterion_main!(benches); From 950d855a88493944d711951532d34bd0893f5bd4 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 9 Nov 2023 16:40:49 -0800 Subject: [PATCH 237/331] Delete the orchestrator vs. middleware benchmark (#3158) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../orchestrator-vs-middleware/Cargo.lock | 2500 ----------------- .../orchestrator-vs-middleware/Cargo.toml | 24 - .../benches/README.md | 6 - .../benches/middleware_vs_orchestrator.rs | 101 - 4 files changed, 2631 deletions(-) delete mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock delete mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml delete mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md delete mode 100644 aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock deleted file mode 100644 index c9e64af1af6..00000000000 --- a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.lock +++ /dev/null @@ -1,2500 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aho-corasick" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" -dependencies = [ - "memchr", -] - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "assert-json-diff" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4259cbe96513d2f1073027a259fc2ca917feb3026a5a8d984e3628e490255cc0" -dependencies = [ - "extend", - "serde", - "serde_json", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "aws-config" -version = "0.56.1" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-http 0.56.1", - "aws-sdk-sso", - "aws-sdk-sts", - "aws-smithy-async 0.56.1", - "aws-smithy-client 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-http-tower 0.56.1", - "aws-smithy-json 0.56.1", - "aws-smithy-types 0.56.1", - "aws-types 0.56.1", - "bytes", - "fastrand 2.0.0", - "hex", - "http", - "hyper", - "ring", - "time", - "tokio", - "tower", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-credential-types" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae" -dependencies = [ - "aws-smithy-async 0.55.3", - "aws-smithy-types 0.55.3", - "fastrand 1.9.0", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-credential-types" -version = "0.56.1" -dependencies = [ - "aws-smithy-async 0.56.1", - "aws-smithy-types 0.56.1", - "fastrand 2.0.0", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-endpoint" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04" -dependencies = [ - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", - "aws-types 0.55.3", - "http", - "regex", - "tracing", -] - -[[package]] -name = "aws-http" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" -dependencies = [ - "aws-credential-types 0.55.3", - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", - "aws-types 0.55.3", - "bytes", - "http", - "http-body", - "lazy_static", - "percent-encoding", - "pin-project-lite", - "tracing", -] - -[[package]] -name = "aws-http" -version = "0.56.1" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-types 0.56.1", - "aws-types 0.56.1", - "bytes", - "http", - "http-body", - "lazy_static", - "percent-encoding", - "pin-project-lite", - "tracing", -] - -[[package]] -name = "aws-runtime" -version = "0.56.1" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-http 0.56.1", - "aws-sigv4 0.56.1", - "aws-smithy-async 0.56.1", - "aws-smithy-eventstream 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-runtime-api", - "aws-smithy-types 0.56.1", - "aws-types 0.56.1", - "fastrand 2.0.0", - "http", - "percent-encoding", - "tracing", - "uuid", -] - -[[package]] -name = "aws-sdk-s3" -version = "0.0.0-local" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-http 0.56.1", - "aws-runtime", - "aws-sigv4 0.56.1", - "aws-smithy-async 0.56.1", - "aws-smithy-checksums 0.56.1", - "aws-smithy-client 0.56.1", - "aws-smithy-eventstream 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-json 0.56.1", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types 0.56.1", - "aws-smithy-xml 0.56.1", - "aws-types 0.56.1", - "bytes", - "http", - "http-body", - "once_cell", - "percent-encoding", - "regex", - "tokio-stream", - "tracing", - "url", -] - -[[package]] -name = "aws-sdk-s3" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f" -dependencies = [ - "aws-credential-types 0.55.3", - "aws-endpoint", - "aws-http 0.55.3", - "aws-sig-auth", - "aws-sigv4 0.55.3", - "aws-smithy-async 0.55.3", - "aws-smithy-checksums 0.55.3", - "aws-smithy-client 0.55.3", - "aws-smithy-eventstream 0.55.3", - "aws-smithy-http 0.55.3", - "aws-smithy-http-tower 0.55.3", - "aws-smithy-json 0.55.3", - "aws-smithy-types 0.55.3", - "aws-smithy-xml 0.55.3", - "aws-types 0.55.3", - "bytes", - "http", - "http-body", - "once_cell", - "percent-encoding", - "regex", - "tokio-stream", - "tower", - "tracing", - "url", -] - -[[package]] -name = "aws-sdk-sso" -version = "0.0.0-local" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-http 0.56.1", - "aws-runtime", - "aws-smithy-async 0.56.1", - "aws-smithy-client 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-json 0.56.1", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types 0.56.1", - "aws-types 0.56.1", - "bytes", - "http", - "regex", - "tokio-stream", - "tracing", -] - -[[package]] -name = "aws-sdk-sts" -version = "0.0.0-local" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-http 0.56.1", - "aws-runtime", - "aws-smithy-async 0.56.1", - "aws-smithy-client 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-json 0.56.1", - "aws-smithy-query", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types 0.56.1", - "aws-smithy-xml 0.56.1", - "aws-types 0.56.1", - "http", - "regex", - "tracing", -] - -[[package]] -name = "aws-sig-auth" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61" -dependencies = [ - "aws-credential-types 0.55.3", - "aws-sigv4 0.55.3", - "aws-smithy-eventstream 0.55.3", - "aws-smithy-http 0.55.3", - "aws-types 0.55.3", - "http", - "tracing", -] - -[[package]] -name = "aws-sigv4" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" -dependencies = [ - "aws-smithy-eventstream 0.55.3", - "aws-smithy-http 0.55.3", - "bytes", - "form_urlencoded", - "hex", - "hmac", - "http", - "once_cell", - "percent-encoding", - "regex", - "sha2", - "time", - "tracing", -] - -[[package]] -name = "aws-sigv4" -version = "0.56.1" -dependencies = [ - "aws-smithy-eventstream 0.56.1", - "aws-smithy-http 0.56.1", - "bytes", - "form_urlencoded", - "hex", - "hmac", - "http", - "once_cell", - "percent-encoding", - "regex", - "sha2", - "time", - "tracing", -] - -[[package]] -name = "aws-smithy-async" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", - "tokio-stream", -] - -[[package]] -name = "aws-smithy-async" -version = "0.56.1" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", - "tokio-stream", -] - -[[package]] -name = "aws-smithy-checksums" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" -dependencies = [ - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", - "bytes", - "crc32c", - "crc32fast", - "hex", - "http", - "http-body", - "md-5", - "pin-project-lite", - "sha1", - "sha2", - "tracing", -] - -[[package]] -name = "aws-smithy-checksums" -version = "0.56.1" -dependencies = [ - "aws-smithy-http 0.56.1", - "aws-smithy-types 0.56.1", - "bytes", - "crc32c", - "crc32fast", - "hex", - "http", - "http-body", - "md-5", - "pin-project-lite", - "sha1", - "sha2", - "tracing", -] - -[[package]] -name = "aws-smithy-client" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" -dependencies = [ - "aws-smithy-async 0.55.3", - "aws-smithy-http 0.55.3", - "aws-smithy-http-tower 0.55.3", - "aws-smithy-protocol-test 0.55.3", - "aws-smithy-types 0.55.3", - "bytes", - "fastrand 1.9.0", - "http", - "http-body", - "hyper", - "hyper-rustls 0.23.2", - "lazy_static", - "pin-project-lite", - "rustls 0.20.9", - "serde", - "serde_json", - "tokio", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-client" -version = "0.56.1" -dependencies = [ - "aws-smithy-async 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-http-tower 0.56.1", - "aws-smithy-protocol-test 0.56.1", - "aws-smithy-types 0.56.1", - "bytes", - "fastrand 2.0.0", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls 0.24.1", - "lazy_static", - "pin-project-lite", - "rustls 0.21.7", - "serde", - "serde_json", - "tokio", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-eventstream" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" -dependencies = [ - "aws-smithy-types 0.55.3", - "bytes", - "crc32fast", -] - -[[package]] -name = "aws-smithy-eventstream" -version = "0.56.1" -dependencies = [ - "aws-smithy-types 0.56.1", - "bytes", - "crc32fast", -] - -[[package]] -name = "aws-smithy-http" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" -dependencies = [ - "aws-smithy-eventstream 0.55.3", - "aws-smithy-types 0.55.3", - "bytes", - "bytes-utils", - "futures-core", - "http", - "http-body", - "hyper", - "once_cell", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "aws-smithy-http" -version = "0.56.1" -dependencies = [ - "aws-smithy-eventstream 0.56.1", - "aws-smithy-types 0.56.1", - "bytes", - "bytes-utils", - "futures-core", - "http", - "http-body", - "hyper", - "once_cell", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "aws-smithy-http-tower" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" -dependencies = [ - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", - "bytes", - "http", - "http-body", - "pin-project-lite", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-http-tower" -version = "0.56.1" -dependencies = [ - "aws-smithy-http 0.56.1", - "aws-smithy-types 0.56.1", - "bytes", - "http", - "http-body", - "pin-project-lite", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-json" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" -dependencies = [ - "aws-smithy-types 0.55.3", -] - -[[package]] -name = "aws-smithy-json" -version = "0.56.1" -dependencies = [ - "aws-smithy-types 0.56.1", -] - -[[package]] -name = "aws-smithy-protocol-test" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabbf8d2bfefa4870ba497c1ae3b40e5e26be18af1cb8c871856b0a393a15ffa" -dependencies = [ - "assert-json-diff", - "http", - "pretty_assertions", - "regex", - "roxmltree", - "serde_json", - "thiserror", -] - -[[package]] -name = "aws-smithy-protocol-test" -version = "0.56.1" -dependencies = [ - "assert-json-diff", - "http", - "pretty_assertions", - "regex", - "roxmltree", - "serde_json", - "thiserror", -] - -[[package]] -name = "aws-smithy-query" -version = "0.56.1" -dependencies = [ - "aws-smithy-types 0.56.1", - "urlencoding", -] - -[[package]] -name = "aws-smithy-runtime" -version = "0.56.1" -dependencies = [ - "aws-smithy-async 0.56.1", - "aws-smithy-client 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-runtime-api", - "aws-smithy-types 0.56.1", - "bytes", - "fastrand 2.0.0", - "http", - "http-body", - "once_cell", - "pin-project-lite", - "pin-utils", - "tokio", - "tracing", -] - -[[package]] -name = "aws-smithy-runtime-api" -version = "0.56.1" -dependencies = [ - "aws-smithy-async 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-types 0.56.1", - "bytes", - "http", - "tokio", - "tracing", -] - -[[package]] -name = "aws-smithy-types" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8" -dependencies = [ - "base64-simd", - "itoa", - "num-integer", - "ryu", - "time", -] - -[[package]] -name = "aws-smithy-types" -version = "0.56.1" -dependencies = [ - "base64-simd", - "itoa", - "num-integer", - "ryu", - "serde", - "time", -] - -[[package]] -name = "aws-smithy-xml" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "aws-smithy-xml" -version = "0.56.1" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "aws-types" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829" -dependencies = [ - "aws-credential-types 0.55.3", - "aws-smithy-async 0.55.3", - "aws-smithy-client 0.55.3", - "aws-smithy-http 0.55.3", - "aws-smithy-types 0.55.3", - "http", - "rustc_version", - "tracing", -] - -[[package]] -name = "aws-types" -version = "0.56.1" -dependencies = [ - "aws-credential-types 0.56.1", - "aws-smithy-async 0.56.1", - "aws-smithy-client 0.56.1", - "aws-smithy-http 0.56.1", - "aws-smithy-types 0.56.1", - "http", - "rustc_version", - "tracing", -] - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" - -[[package]] -name = "base64-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "bytes-utils" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" -dependencies = [ - "bytes", - "either", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "ciborium" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" - -[[package]] -name = "ciborium-ll" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "bitflags", - "clap_lex", - "indexmap", - "textwrap", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32c" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "criterion" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" -dependencies = [ - "anes", - "atty", - "cast", - "ciborium", - "clap", - "criterion-plot", - "futures", - "itertools", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "tokio", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "deranged" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "extend" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47da3a72ec598d9c8937a7ebca8962a5c7a1f28444e38c2b33c771ba3f55f05" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-core", - "futures-macro", - "futures-sink", - "futures-task", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[package]] -name = "h2" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.4.9", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http", - "hyper", - "log", - "rustls 0.20.9", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.23.4", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" -dependencies = [ - "futures-util", - "http", - "hyper", - "log", - "rustls 0.21.7", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest", -] - -[[package]] -name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "orchestrator-vs-middleware" -version = "0.1.0" -dependencies = [ - "aws-config", - "aws-credential-types 0.56.1", - "aws-sdk-s3 0.0.0-local", - "aws-sdk-s3 0.28.0", - "aws-smithy-client 0.55.3", - "aws-smithy-client 0.56.1", - "criterion", - "http", - "tokio", -] - -[[package]] -name = "os_str_bytes" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" - -[[package]] -name = "outref" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "plotters" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" - -[[package]] -name = "plotters-svg" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "pretty_assertions" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" -dependencies = [ - "diff", - "yansi", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "roxmltree" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" -dependencies = [ - "log", - "ring", - "rustls-webpki", - "sct", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "serde_json" -version = "1.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - -[[package]] -name = "thiserror" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "time" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" -dependencies = [ - "deranged", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.5.3", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.7", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "uuid" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - -[[package]] -name = "walkdir" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.31", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "xmlparser" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml b/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml deleted file mode 100644 index e5190ecb92e..00000000000 --- a/aws/sdk/benchmarks/orchestrator-vs-middleware/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "orchestrator-vs-middleware" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } -aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "wiremock"] } -criterion = { version = "0.5", features = ["async_tokio"] } -http = "0.2.3" -middleware-s3 = { version = "0.28", package = "aws-sdk-s3", features = ["test-util"] } -middleware-smithy-client = { version = "0.55.3", package = "aws-smithy-client", features = ["test-util", "rustls"] } -tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } - -[profile.release] -debug = 1 - -[[bench]] -name = "middleware_vs_orchestrator" -harness = false diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md b/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md deleted file mode 100644 index 0f2e81f4328..00000000000 --- a/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/README.md +++ /dev/null @@ -1,6 +0,0 @@ -### Middleware vs. Orchestrator Benchmark - -To run the benchmark: -```bash -./gradlew :aws:sdk:assemble && (cd aws/sdk/integration-tests/s3 && cargo bench) -``` diff --git a/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs b/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs deleted file mode 100644 index 6920f80fe0b..00000000000 --- a/aws/sdk/benchmarks/orchestrator-vs-middleware/benches/middleware_vs_orchestrator.rs +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#[macro_use] -extern crate criterion; -use aws_sdk_s3 as s3; -use criterion::{BenchmarkId, Criterion}; - -macro_rules! test_connection { - ($package:ident) => { - $package::test_connection::infallible_connection_fn(|req| { - assert_eq!( - "https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~", - req.uri().to_string() - ); - assert!(req.headers().contains_key("authorization")); - http::Response::builder() - .status(200) - .body( - r#" - - test-bucket - prefix~ - 1 - 1000 - false - - some-file.file - 2009-10-12T17:50:30.000Z - 434234 - STANDARD - - -"#, - ) - .unwrap() - }) - }; -} - -async fn orchestrator(client: &s3::Client) { - let _output = client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send() - .await - .expect("successful execution"); -} - -async fn middleware(client: &middleware_s3::Client) { - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send() - .await - .expect("successful execution"); -} - -fn bench(c: &mut Criterion) { - let orchestrator_client = { - let conn = test_connection!(aws_smithy_client); - let config = aws_sdk_s3::Config::builder() - .credentials_provider(aws_sdk_s3::config::Credentials::for_tests()) - .region(aws_sdk_s3::config::Region::new("us-east-1")) - .http_connector(conn.clone()) - .build(); - aws_sdk_s3::Client::from_conf(config) - }; - let middleware_client = { - let conn = test_connection!(middleware_smithy_client); - let config = middleware_s3::Config::builder() - .credentials_provider(middleware_s3::config::Credentials::for_tests()) - .region(middleware_s3::config::Region::new("us-east-1")) - .http_connector(conn.clone()) - .build(); - middleware_s3::Client::from_conf(config) - }; - - let mut group = c.benchmark_group("compare"); - let param = "S3 ListObjectsV2"; - group.bench_with_input( - BenchmarkId::new("middleware (last_release)", param), - param, - |b, _| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { middleware(&middleware_client).await }) - }, - ); - group.bench_with_input(BenchmarkId::new("orchestrator", param), param, |b, _| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { orchestrator(&orchestrator_client).await }) - }); - group.finish(); -} - -criterion_group!(benches, bench); -criterion_main!(benches); From 9a82b4448877945748f480f153bbc724106d180f Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 9 Nov 2023 23:20:22 -0600 Subject: [PATCH 238/331] Ensure identity resolver is set when a credentials provider is given only at operation level (#3156) ## Motivation and Context Fixes https://github.com/awslabs/aws-sdk-rust/issues/901 ## Description This PR is a rework of https://github.com/awslabs/smithy-rs/pull/3021 whose fix was inadvertently discarded during https://github.com/awslabs/smithy-rs/pull/3077. The way we fix the issue is slightly different. In this PR, we add an identity resolver to runtime components within `set_credentials_provider`, instead of using `ServiceConfig.OperationConfigOverride`. ## Testing Added a Kotlin integration test to `CredentialProviderConfigTest.kt` based on the customer reported issue. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++ .../smithy/rustsdk/CredentialProviders.kt | 82 +++++++------------ .../rustsdk/CredentialProviderConfigTest.kt | 54 ++++++++++++ .../kms/tests/integration.rs | 2 +- .../qldbsession/tests/integration.rs | 2 +- .../s3/tests/naughty-string-metadata.rs | 2 +- .../s3/tests/normalize-uri-path.rs | 2 +- .../query-strings-are-correctly-encoded.rs | 2 +- .../integration-tests/s3/tests/signing-it.rs | 2 +- .../s3control/tests/signing-it.rs | 4 +- .../ServiceRuntimePluginGenerator.kt | 4 - 11 files changed, 97 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 540d5cac804..d5c139994a1 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -46,3 +46,9 @@ An operation output that supports receiving events from stream now provides a ne references = ["smithy-rs#3100", "smithy-rs#3114"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "ysaito1001" + +[[aws-sdk-rust]] +message = "Fix exclusively setting the credentials provider at operation config-override time. It's now possible to set the credentials when an operation is sent (via `.config_override()`), rather than at client-creation time." +references = ["smithy-rs#3156", "aws-sdk-rust#901"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 46d8e42734a..6a34967a8e3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -10,17 +10,13 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization @@ -30,12 +26,6 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { override val name: String = "CredentialsProvider" override val order: Byte = 0 - override fun serviceRuntimePluginCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List = - baseCustomizations + listOf(CredentialsIdentityResolverRegistration(codegenContext)) - override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, @@ -65,7 +55,7 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { /** * Add a `.credentials_provider` field and builder to the `Config` for a given service */ -class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { +class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, @@ -74,6 +64,10 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus .resolve("provider::ProvideCredentials"), "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) .resolve("provider::SharedCredentialsProvider"), + "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4a::SCHEME_ID"), + "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4::SCHEME_ID"), "TestCredentials" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig).resolve("Credentials"), ) @@ -103,16 +97,34 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus *codegenScope, ) - rustTemplate( + rustBlockTemplate( """ /// Sets the credentials provider for this service - pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.config.store_or_unset(credentials_provider); - self - } + pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self """, *codegenScope, - ) + ) { + rustBlockTemplate( + """ + if let Some(credentials_provider) = credentials_provider + """, + *codegenScope, + ) { + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + rustTemplate( + "self.runtime_components.push_identity_resolver(#{SIGV4A_SCHEME_ID}, credentials_provider.clone());", + *codegenScope, + ) + } + } + rustTemplate( + "self.runtime_components.push_identity_resolver(#{SIGV4_SCHEME_ID}, credentials_provider);", + *codegenScope, + ) + } + rust("self") + } } is ServiceConfig.DefaultForTests -> rustTemplate( @@ -124,39 +136,3 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus } } } - -class CredentialsIdentityResolverRegistration( - private val codegenContext: ClientCodegenContext, -) : ServiceRuntimePluginCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - - override fun section(section: ServiceRuntimePluginSection): Writable = writable { - when (section) { - is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { - rustBlockTemplate("if let Some(creds_provider) = ${section.serviceConfigName}.credentials_provider()") { - val codegenScope = arrayOf( - "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::identity::SharedIdentityResolver"), - "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("auth::sigv4a::SCHEME_ID"), - "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - ) - - if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { - featureGateBlock("sigv4a") { - section.registerIdentityResolver(this) { - rustTemplate("#{SIGV4A_SCHEME_ID}, creds_provider.clone()", *codegenScope) - } - } - } - section.registerIdentityResolver(this) { - rustTemplate("#{SIGV4_SCHEME_ID}, creds_provider,", *codegenScope) - } - } - } - - else -> {} - } - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt index 87f832cc7ef..5b6a81f0690 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt @@ -7,6 +7,10 @@ package software.amazon.smithy.rustsdk import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.testutil.tokioTest internal class CredentialProviderConfigTest { @Test @@ -14,4 +18,54 @@ internal class CredentialProviderConfigTest { val codegenContext = awsTestCodegenContext() validateConfigCustomizations(codegenContext, CredentialProviderConfig(codegenContext)) } + + @Test + fun `configuring credentials provider at operation level should work`() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> + val rc = ctx.runtimeConfig + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "capture_request" to RuntimeType.captureRequest(rc), + "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(rc) + .resolve("Credentials"), + "Region" to AwsRuntimeType.awsTypes(rc).resolve("region::Region"), + ) + rustCrate.integrationTest("credentials_provider") { + // per https://github.com/awslabs/aws-sdk-rust/issues/901 + tokioTest("configuring_credentials_provider_at_operation_level_should_work") { + val moduleName = ctx.moduleUseName() + rustTemplate( + """ + let (http_client, _rx) = #{capture_request}(None); + let client_config = $moduleName::Config::builder() + .http_client(http_client) + .build(); + + let client = $moduleName::Client::from_conf(client_config); + + let credentials = #{Credentials}::new( + "test", + "test", + #{None}, + #{None}, + "test", + ); + let operation_config_override = $moduleName::Config::builder() + .credentials_provider(credentials.clone()) + .region(#{Region}::new("us-west-2")); + + let _ = client + .some_operation() + .customize() + .config_override(operation_config_override) + .send() + .await + .expect("success"); + """, + *codegenScope, + ) + } + } + } + } } diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index ed534f61bdd..6cba0de93dc 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -52,7 +52,7 @@ async fn generate_random() { .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "20") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=53dcf70f6f852cb576185dcabef5aaa3d068704cf1b7ea7dc644efeaa46674d7") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=703f72fe50c310e3ee1a7a106df947b980cb91bc8bad7a4a603b057096603aed") .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 6cdb32d1f17..fbc8b0a00f6 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -20,7 +20,7 @@ async fn signv4_use_correct_service_name() { .header("content-type", "application/x-amz-json-1.0") .header("x-amz-target", "QLDBSession.SendCommand") .header("content-length", "49") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=9a07c60550504d015fb9a2b0f1b175a4d906651f9dd4ee44bebb32a802d03815") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=e8d50282fa369adf05f33a5b32e3ce2a7582edc902312c59de311001a97426d9") // qldbsession uses the signing name 'qldb' in signature _________________________^^^^ .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 3b6bd970029..f139a28b0f6 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -88,7 +88,7 @@ async fn test_s3_signer_with_naughty_string_metadata() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=a5115604df66219874a9e5a8eab4c9f7a28c992ab2d918037a285756c019f3b2"; + "Signature=733dba2f1ca3c9a39f4eef3a6750a71eff00297cd765408ad3cef5dcdc44d642"; assert!( auth_header .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index 11ee0f7b092..367aa19682f 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -41,7 +41,7 @@ async fn test_operation_should_not_normalize_uri_path() { let expected_uri = "https://test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1.s3.us-east-1.amazonaws.com/a/.././b.txt?x-id=PutObject"; assert_eq!(actual_uri, expected_uri); - let expected_sig = "Signature=2ac540538c84dc2616d92fb51d4fc6146ccd9ccc1ee85f518a1a686c5ef97b86"; + let expected_sig = "Signature=404fb9502378c8f46fb83544848c42d29d55610a14b4bed9577542e49e549d08"; assert!( actual_auth.contains(expected_sig), "authorization header signature did not match expected signature: expected {} but not found in {}", diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 2e9f8bcaffd..902d07933b2 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -44,7 +44,7 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=9a931d20606f93fa4e5553602866a9b5ccac2cd42b54ae5a4b17e4614fb443ce"; + "Signature=740feb1de3968a643e68fb1a17c415d98dd6a1cc28782fb1ef6157586548c747"; assert!( auth_header .contains(snapshot_signature), diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index 450f4ba43ff..d0106aaded2 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -15,7 +15,7 @@ use aws_smithy_types::body::SdkBody; async fn test_signer() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=27e3f59ec3cffaa10e4f1c92112e8fb62d468a04cd32be39e68215f830404dbb") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=d8ea22461a59cc1cbeb01fa093423ffafcb7695197ba2409b477216a4be2c104") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~") .body(SdkBody::empty()) .unwrap(), diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index 7917b836ebb..7b06289a1c4 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -15,8 +15,8 @@ async fn test_signer() { http::Request::builder() .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, \ - SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-user-agent, \ - Signature=0102a74cb220f8445c4efada17660572ff813e07b524032ec831e8c2514be903") + SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, \ + Signature=01a71226e959c7b0b998adf26fa266f9c3612df57a60b187d549822e86d90667") .uri("https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint") .body(SdkBody::empty()) .unwrap(), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index 60015d897cc..875e8ef73ee 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -51,10 +51,6 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { writer.rust("runtime_components.set_endpoint_resolver(Some(#T));", resolver) } - fun registerIdentityResolver(writer: RustWriter, identityResolver: Writable) { - writer.rust("runtime_components.push_identity_resolver(#T);", identityResolver) - } - fun registerRetryClassifier(writer: RustWriter, classifier: Writable) { writer.rust("runtime_components.push_retry_classifier(#T);", classifier) } From 7f8fef2626ae48e3f736346a06f65636ffb148c4 Mon Sep 17 00:00:00 2001 From: Utkarsh Gupta <5155100+utkarshgupta137@users.noreply.github.com> Date: Fri, 10 Nov 2023 16:42:44 +0000 Subject: [PATCH 239/331] Return impl AsyncBufRead from into_async_read (#3164) ## Motivation and Context The tokio `StreamReader` implements `AsyncBufRead`, but we're returning `AsyncRead` currently. If a user needs an `AsyncBufRead`, then they've to wrap the returned value in tokio `BufReader` for no reason. Since `ByteStream` doesn't implement `Stream` anymore, one has to either wrap the returned value unnecessarily or write a wrapper similar to this function. See https://github.com/smithy-lang/smithy-rs/pull/2983#discussion_r1380822997. ## Description Simply changed the return type to say `impl AsyncBufRead`. Since `AsyncBufRead` is a super-set of `AsyncRead`, this is not a breaking change. ## Testing The code example tests it. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 6 ++++++ .../aws-smithy-types/external-types.toml | 2 +- .../aws-smithy-types/src/byte_stream.rs | 17 ++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index d5c139994a1..638b7c6319c 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -17,6 +17,12 @@ references = ["smithy-rs#3126", "aws-sdk-rust#930"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "rcoh" +[[aws-sdk-rust]] +message = "Change `ByteStream::into_async_read` to return `AsyncBufRead`" +references = ["smithy-rs#3164"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "utkarshgupta137" + [[smithy-rs]] message = "The HTTP `Request`, `Response`, `Headers`, and `HeaderValue` types have been moved from `aws_smithy_runtime_api::client::http::*` into `aws_smithy_runtime_api::http`" references = ["smithy-rs#3138"] diff --git a/rust-runtime/aws-smithy-types/external-types.toml b/rust-runtime/aws-smithy-types/external-types.toml index 4609bce1d19..d8051f92d01 100644 --- a/rust-runtime/aws-smithy-types/external-types.toml +++ b/rust-runtime/aws-smithy-types/external-types.toml @@ -7,7 +7,7 @@ allowed_external_types = [ "hyper::body::body::Body", # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types - "tokio::io::async_read::AsyncRead", + "tokio::io::async_buf_read::AsyncBufRead", # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "tokio::fs::file::File", diff --git a/rust-runtime/aws-smithy-types/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs index ac4329b3edc..8a36a9ba1ef 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -204,17 +204,16 @@ pin_project! { /// /// _Note: The `rt-tokio` feature must be active to use `.into_async_read()`._ /// - /// It's possible to convert a `ByteStream` into a struct that implements [`tokio::io::AsyncRead`](tokio::io::AsyncRead). - /// Then, you can use pre-existing tools like [`tokio::io::BufReader`](tokio::io::BufReader): + /// It's possible to convert a `ByteStream` into a struct that implements [`tokio::io::AsyncBufRead`](tokio::io::AsyncBufRead). /// ```no_run /// use aws_smithy_types::byte_stream::ByteStream; /// use aws_smithy_types::body::SdkBody; - /// use tokio::io::{AsyncBufReadExt, BufReader}; + /// use tokio::io::AsyncBufReadExt; /// #[cfg(feature = "rt-tokio")] /// async fn example() -> std::io::Result<()> { /// let stream = ByteStream::new(SdkBody::from("hello!\nThis is some data")); - /// // Wrap the stream in a BufReader - /// let buf_reader = BufReader::new(stream.into_async_read()); + /// // Convert the stream to a BufReader + /// let buf_reader = stream.into_async_read(); /// let mut lines = buf_reader.lines(); /// assert_eq!(lines.next_line().await?, Some("hello!".to_owned())); /// assert_eq!(lines.next_line().await?, Some("This is some data".to_owned())); @@ -423,23 +422,23 @@ impl ByteStream { } #[cfg(feature = "rt-tokio")] - /// Convert this `ByteStream` into a struct that implements [`AsyncRead`](tokio::io::AsyncRead). + /// Convert this `ByteStream` into a struct that implements [`AsyncBufRead`](tokio::io::AsyncBufRead). /// /// # Example /// /// ```rust - /// use tokio::io::{BufReader, AsyncBufReadExt}; + /// use tokio::io::AsyncBufReadExt; /// use aws_smithy_types::byte_stream::ByteStream; /// /// # async fn dox(my_bytestream: ByteStream) -> std::io::Result<()> { - /// let mut lines = BufReader::new(my_bytestream.into_async_read()).lines(); + /// let mut lines = my_bytestream.into_async_read().lines(); /// while let Some(line) = lines.next_line().await? { /// // Do something line by line /// } /// # Ok(()) /// # } /// ``` - pub fn into_async_read(self) -> impl tokio::io::AsyncRead { + pub fn into_async_read(self) -> impl tokio::io::AsyncBufRead { // The `Stream` trait is currently unstable so we can only use it in private. // Here, we create a local struct just to enable the trait for `ByteStream` and pass it // to `StreamReader`. From 6438a09bef34051b7ca4ac7bfded29f32cc6566f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 10 Nov 2023 10:51:04 -0800 Subject: [PATCH 240/331] Fix repo org move issues (#3166) This PR fixes issues introduced by moving the repository from awslabs/smithy-rs to smithy-lang/smithy-rs. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci-merge-queue.yml | 2 +- .github/workflows/ci-pr-forks.yml | 4 +- .github/workflows/ci-pr.yml | 8 +- .github/workflows/update-sdk-next.yml | 2 +- CHANGELOG.md | 590 +++++++++--------- CODEOWNERS | 64 +- README.md | 2 +- aws/SDK_CHANGELOG.next.json | 8 +- aws/SDK_README.md.hb | 8 +- aws/rust-runtime/aws-config/Cargo.toml | 2 +- aws/rust-runtime/aws-config/README.md | 2 +- .../aws-config/external-types.toml | 2 +- .../src/default_provider/timeout_config.rs | 2 +- aws/rust-runtime/aws-config/src/lib.rs | 2 +- .../aws-config/src/provider_config.rs | 2 +- .../aws-credential-types/Cargo.toml | 2 +- .../aws-credential-types/README.md | 2 +- aws/rust-runtime/aws-endpoint/Cargo.toml | 2 +- aws/rust-runtime/aws-endpoint/README.md | 2 +- aws/rust-runtime/aws-http/Cargo.toml | 2 +- aws/rust-runtime/aws-http/README.md | 2 +- aws/rust-runtime/aws-hyper/Cargo.toml | 2 +- aws/rust-runtime/aws-hyper/README.md | 2 +- aws/rust-runtime/aws-inlineable/Cargo.toml | 2 +- aws/rust-runtime/aws-inlineable/README.md | 2 +- .../aws-inlineable/src/presigning.rs | 2 +- aws/rust-runtime/aws-runtime-api/Cargo.toml | 2 +- aws/rust-runtime/aws-runtime-api/README.md | 2 +- aws/rust-runtime/aws-runtime/Cargo.toml | 2 +- aws/rust-runtime/aws-runtime/README.md | 2 +- aws/rust-runtime/aws-sig-auth/Cargo.toml | 2 +- aws/rust-runtime/aws-sig-auth/README.md | 2 +- .../aws-sig-auth/external-types.toml | 2 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 2 +- aws/rust-runtime/aws-sigv4/README.md | 2 +- .../aws-sigv4/external-types.toml | 2 +- aws/rust-runtime/aws-sigv4/src/date_time.rs | 6 +- aws/rust-runtime/aws-types/Cargo.toml | 2 +- aws/rust-runtime/aws-types/README.md | 2 +- .../rustsdk/HttpRequestChecksumDecorator.kt | 2 +- .../endpoints/OperationInputTestGenerator.kt | 2 +- aws/sdk/aws-models/s3-tests.smithy | 2 +- .../s3-throughput/benchmark/Cargo.toml | 2 +- .../s3-throughput/infrastructure/package.json | 6 +- aws/sdk/integration-tests/dynamodb/Cargo.toml | 2 +- aws/sdk/integration-tests/ec2/Cargo.toml | 2 +- aws/sdk/integration-tests/glacier/Cargo.toml | 2 +- aws/sdk/integration-tests/iam/Cargo.toml | 2 +- aws/sdk/integration-tests/kms/Cargo.toml | 2 +- aws/sdk/integration-tests/lambda/Cargo.toml | 2 +- .../no-default-features/Cargo.toml | 2 +- aws/sdk/integration-tests/polly/Cargo.toml | 2 +- .../integration-tests/qldbsession/Cargo.toml | 2 +- aws/sdk/integration-tests/s3/Cargo.toml | 2 +- .../integration-tests/s3control/Cargo.toml | 2 +- aws/sdk/integration-tests/sts/Cargo.toml | 2 +- .../timestreamquery/Cargo.toml | 2 +- .../transcribestreaming/Cargo.toml | 2 +- .../integration-tests/webassembly/Cargo.toml | 2 +- aws/sdk/sdk-external-types.toml | 2 +- buildSrc/src/main/kotlin/CodegenTestCommon.kt | 2 +- .../HttpConnectorConfigDecorator.kt | 6 +- .../smithy/generators/PaginatorGenerator.kt | 2 +- .../protocol/ProtocolTestGenerator.kt | 2 +- .../common-test-models/constraints.smithy | 10 +- codegen-core/common-test-models/misc.smithy | 2 +- .../naming-obstacle-course-casing.smithy | 2 +- .../common-test-models/pokemon-awsjson.smithy | 2 +- .../rest-json-extras.smithy | 4 +- .../rust/codegen/core/rustlang/RustType.kt | 2 +- .../codegen/core/smithy/CodegenDelegator.kt | 2 +- .../core/smithy/SymbolMetadataProvider.kt | 2 +- .../rust/codegen/core/smithy/SymbolVisitor.kt | 4 +- .../customizations/SmithyTypesPubUseExtra.kt | 2 +- .../smithy/customize/CoreCodegenDecorator.kt | 2 +- .../smithy/generators/BuilderGenerator.kt | 6 +- .../core/smithy/generators/EnumGenerator.kt | 2 +- .../core/smithy/generators/LibRsGenerator.kt | 2 +- .../generators/http/HttpBindingGenerator.kt | 2 +- .../codegen/core/smithy/protocols/AwsJson.kt | 4 +- .../codegen/core/smithy/protocols/RestJson.kt | 2 +- .../parse/EventStreamUnmarshallerGenerator.kt | 2 +- .../protocols/serialize/SerializerUtil.kt | 2 +- .../smithy/rust/codegen/core/testutil/Rust.kt | 2 +- .../smithy/rust/codegen/core/util/Strings.kt | 2 +- codegen-server-test/build.gradle.kts | 2 +- codegen-server-test/python/build.gradle.kts | 4 +- .../typescript/model/pokemon.smithy | 2 +- .../generators/PythonApplicationGenerator.kt | 2 +- .../PythonServerOperationHandlerGenerator.kt | 2 +- .../ConstrainedShapeSymbolMetadataProvider.kt | 2 +- .../smithy/ConstrainedShapeSymbolProvider.kt | 2 +- .../rust/codegen/server/smithy/Constraints.kt | 4 +- ...atternTraitEscapedSpecialCharsValidator.kt | 2 +- .../server/smithy/ServerCodegenVisitor.kt | 4 +- .../server/smithy/ServerRustSettings.kt | 2 +- .../UnconstrainedShapeSymbolProvider.kt | 2 +- .../smithy/ValidateUnsupportedConstraints.kt | 10 +- ...mValidationExceptionWithReasonDecorator.kt | 4 +- .../SmithyValidationExceptionDecorator.kt | 4 +- .../CollectionConstraintViolationGenerator.kt | 2 +- .../generators/ConstrainedStringGenerator.kt | 2 +- .../MapConstraintViolationGenerator.kt | 2 +- .../PubCrateConstrainedCollectionGenerator.kt | 2 +- .../ServerBuilderConstraintViolations.kt | 6 +- .../generators/ServerBuilderGenerator.kt | 4 +- .../ServerBuilderGeneratorCommon.kt | 8 +- .../smithy/generators/ServerBuilderSymbol.kt | 6 +- .../ServerHttpSensitivityGenerator.kt | 2 +- .../generators/ServerServiceGenerator.kt | 32 +- .../http/RestRequestSpecGenerator.kt | 2 +- .../protocol/ServerProtocolTestGenerator.kt | 18 +- .../ServerHttpBoundProtocolGenerator.kt | 10 +- ...ToConstrainedOperationInputsInAllowList.kt | 4 +- .../RecursiveConstraintViolationBoxer.kt | 2 +- .../RemoveEbsModelValidationException.kt | 6 +- ...rnTraitEscapedSpecialCharsValidatorTest.kt | 4 +- .../ServerBuilderConstraintViolationsTest.kt | 2 +- .../ServerBuilderDefaultValuesTest.kt | 4 +- ...verEventStreamUnmarshallerGeneratorTest.kt | 2 +- .../TsServerCodegenDecorator.kt | 2 +- .../TsServerOperationErrorGenerator.kt | 2 +- design/README.md | 2 +- design/src/client/orchestrator.md | 6 +- design/src/rfcs/rfc0003_presigning_api.md | 2 +- design/src/rfcs/rfc0004_retry_behavior.md | 2 +- .../rfc0006_service_specific_middleware.md | 2 +- .../src/rfcs/rfc0007_split_release_process.md | 2 +- .../src/rfcs/rfc0009_example_consolidation.md | 2 +- design/src/rfcs/rfc0010_waiters.md | 2 +- .../rfc0011_crates_io_alpha_publishing.md | 4 +- .../rfc0012_independent_crate_versioning.md | 2 +- design/src/rfcs/rfc0013_body_callback_apis.md | 4 +- design/src/rfcs/rfc0014_timeout_config.md | 14 +- .../rfc0015_using_features_responsibly.md | 8 +- design/src/rfcs/rfc0018_logging_sensitive.md | 20 +- .../src/rfcs/rfc0019_event_streams_errors.md | 16 +- design/src/rfcs/rfc0020_service_builder.md | 28 +- design/src/rfcs/rfc0023_refine_builder.md | 8 +- design/src/rfcs/rfc0025_constraint_traits.md | 10 +- ...fc0028_sdk_credential_cache_type_safety.md | 2 +- .../rfcs/rfc0029_new_home_for_cred_types.md | 4 +- ...oviding_fallback_credentials_on_timeout.md | 2 +- .../rfc0032_better_constraint_violations.md | 20 +- .../rfc0033_improve_sdk_request_id_access.md | 2 +- design/src/server/anatomy.md | 8 +- design/src/server/code_generation.md | 42 +- design/src/server/middleware.md | 2 +- design/src/smithy/aggregate_shapes.md | 4 +- design/src/smithy/event_streams.md | 24 +- design/src/smithy/overview.md | 4 +- design/src/smithy/recursive_shapes.md | 2 +- design/src/smithy/simple_shapes.md | 6 +- examples/BENCHMARKS.md | 2 +- .../pokemon-service-client-usage/README.md | 6 +- .../examples/client-connector.rs | 2 +- .../custom-header-using-interceptor.rs | 2 +- .../examples/custom-header.rs | 2 +- .../examples/endpoint-resolver.rs | 2 +- .../examples/handling-errors.rs | 4 +- .../examples/mock-request.rs | 2 +- .../examples/response-header-interceptor.rs | 2 +- .../examples/retry-classifier.rs | 2 +- .../examples/retry-customize.rs | 2 +- .../examples/simple-client.rs | 2 +- .../examples/timeout-config.rs | 2 +- .../examples/trace-serialize.rs | 2 +- .../examples/use-config-bag.rs | 2 +- gradle.properties | 2 +- rust-runtime/aws-smithy-async/Cargo.toml | 2 +- rust-runtime/aws-smithy-async/README.md | 2 +- rust-runtime/aws-smithy-checksums/Cargo.toml | 2 +- rust-runtime/aws-smithy-checksums/README.md | 4 +- rust-runtime/aws-smithy-checksums/src/lib.rs | 2 +- rust-runtime/aws-smithy-client/Cargo.toml | 2 +- rust-runtime/aws-smithy-client/README.md | 2 +- .../aws-smithy-eventstream/Cargo.toml | 2 +- rust-runtime/aws-smithy-eventstream/README.md | 2 +- .../external-types.toml | 2 +- rust-runtime/aws-smithy-http-auth/Cargo.toml | 2 +- rust-runtime/aws-smithy-http-auth/README.md | 2 +- .../aws-smithy-http-server-python/Cargo.toml | 2 +- .../aws-smithy-http-server-python/README.md | 2 +- .../src/error.rs | 8 +- .../Cargo.toml | 2 +- .../README.md | 2 +- .../aws-smithy-http-server/Cargo.toml | 2 +- rust-runtime/aws-smithy-http-server/README.md | 2 +- .../src/plugin/either.rs | 2 +- .../src/protocol/aws_json/router.rs | 2 +- .../src/protocol/aws_json_10/router.rs | 2 +- .../src/protocol/aws_json_11/router.rs | 2 +- .../src/protocol/mod.rs | 2 +- .../src/protocol/rest_json_1/router.rs | 2 +- .../src/protocol/rest_xml/router.rs | 2 +- .../src/request/connect_info.rs | 2 +- .../aws-smithy-http-server/src/request/mod.rs | 2 +- .../src/routing/lambda_handler.rs | 2 +- .../src/routing/request_spec.rs | 6 +- .../src/runtime_error.rs | 2 +- rust-runtime/aws-smithy-http-tower/Cargo.toml | 2 +- rust-runtime/aws-smithy-http-tower/README.md | 2 +- rust-runtime/aws-smithy-http/Cargo.toml | 2 +- rust-runtime/aws-smithy-http/README.md | 4 +- .../aws-smithy-http/external-types.toml | 4 +- rust-runtime/aws-smithy-http/src/lib.rs | 2 +- rust-runtime/aws-smithy-json/Cargo.toml | 2 +- rust-runtime/aws-smithy-json/README.md | 4 +- .../aws-smithy-protocol-test/Cargo.toml | 2 +- .../aws-smithy-protocol-test/README.md | 2 +- rust-runtime/aws-smithy-query/Cargo.toml | 2 +- rust-runtime/aws-smithy-query/README.md | 2 +- .../aws-smithy-runtime-api/Cargo.toml | 2 +- rust-runtime/aws-smithy-runtime-api/README.md | 4 +- .../aws-smithy-runtime-api/src/lib.rs | 2 +- .../aws-smithy-runtime-api/src/shared.rs | 2 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 2 +- rust-runtime/aws-smithy-runtime/README.md | 2 +- .../aws-smithy-runtime/external-types.toml | 6 +- .../src/client/http/connection_poisoning.rs | 2 +- .../src/client/http/hyper_014.rs | 2 +- .../aws-smithy-types-convert/Cargo.toml | 2 +- .../aws-smithy-types-convert/README.md | 2 +- rust-runtime/aws-smithy-types/Cargo.toml | 2 +- rust-runtime/aws-smithy-types/README.md | 4 +- .../aws-smithy-types/external-types.toml | 6 +- .../aws-smithy-types/src/date_time/mod.rs | 2 +- rust-runtime/aws-smithy-xml/Cargo.toml | 2 +- rust-runtime/aws-smithy-xml/README.md | 4 +- rust-runtime/inlineable/Cargo.toml | 2 +- rust-runtime/inlineable/README.md | 2 +- tools/ci-build/Dockerfile | 4 +- tools/ci-build/README.md | 2 +- tools/ci-build/changelogger/src/render.rs | 25 +- tools/ci-build/changelogger/tests/e2e_test.rs | 30 +- .../src/subcommand/claim_crate_names.rs | 2 +- .../upgrade_runtime_crates_version.rs | 2 +- tools/ci-build/sdk-lints/src/readmes.rs | 2 +- tools/ci-build/sdk-lints/src/todos.rs | 2 +- tools/ci-build/sdk-versioner/src/main.rs | 2 +- tools/ci-cdk/README.md | 2 +- tools/ci-cdk/canary-runner/src/run.rs | 6 +- .../lib/smithy-rs/pull-request-cdn-stack.ts | 2 +- tools/ci-cdk/test/oidc-provider-stack.test.ts | 3 +- tools/ci-scripts/check-aws-config | 2 +- 245 files changed, 791 insertions(+), 787 deletions(-) diff --git a/.github/workflows/ci-merge-queue.yml b/.github/workflows/ci-merge-queue.yml index cfad5aab2fa..53a754d5890 100644 --- a/.github/workflows/ci-merge-queue.yml +++ b/.github/workflows/ci-merge-queue.yml @@ -84,7 +84,7 @@ jobs: needs: - save-docker-login-token - acquire-base-image - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' || toJSON(github.event.merge_group) != '{}' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' || toJSON(github.event.merge_group) != '{}' }} uses: ./.github/workflows/ci.yml with: run_sdk_examples: true diff --git a/.github/workflows/ci-pr-forks.yml b/.github/workflows/ci-pr-forks.yml index ad1d291f9a1..719f1c9eabc 100644 --- a/.github/workflows/ci-pr-forks.yml +++ b/.github/workflows/ci-pr-forks.yml @@ -18,7 +18,7 @@ jobs: # it uploads the image as a build artifact for other jobs to download and use. acquire-base-image: name: Acquire Base Image - if: ${{ github.event.pull_request.head.repo.full_name != 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs' }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -39,7 +39,7 @@ jobs: # Run shared CI after the Docker build image has either been rebuilt or found in ECR ci: needs: acquire-base-image - if: ${{ github.event.pull_request.head.repo.full_name != 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs' }} uses: ./.github/workflows/ci.yml with: run_sdk_examples: true diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 1b440018990..6e7b00603fd 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -21,7 +21,7 @@ jobs: # The login password is encrypted with the repo secret DOCKER_LOGIN_TOKEN_PASSPHRASE save-docker-login-token: name: Save a docker login token - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} outputs: docker-login-password: ${{ steps.set-token.outputs.docker-login-password }} permissions: @@ -51,7 +51,7 @@ jobs: acquire-base-image: name: Acquire Base Image needs: save-docker-login-token - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} runs-on: smithy_ubuntu-latest_8-core env: ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }} @@ -86,7 +86,7 @@ jobs: needs: - save-docker-login-token - acquire-base-image - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} uses: ./.github/workflows/ci.yml with: run_sdk_examples: true @@ -97,7 +97,7 @@ jobs: # The PR bot requires a Docker build image, so make it depend on the `acquire-base-image` job. pr_bot: name: PR Bot - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} needs: acquire-base-image uses: ./.github/workflows/pull-request-bot.yml with: diff --git a/.github/workflows/update-sdk-next.yml b/.github/workflows/update-sdk-next.yml index 01432266695..5de480ab41a 100644 --- a/.github/workflows/update-sdk-next.yml +++ b/.github/workflows/update-sdk-next.yml @@ -25,7 +25,7 @@ jobs: - name: Check out `smithy-rs` uses: actions/checkout@v3 with: - repository: awslabs/smithy-rs + repository: smithy-lang/smithy-rs ref: ${{ inputs.generate_ref }} path: smithy-rs - name: Check out `aws-sdk-rust` diff --git a/CHANGELOG.md b/CHANGELOG.md index ded725b1e71..e113222c6d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,25 +2,25 @@ November 1st, 2023 ================== **New this release:** -- (client, [smithy-rs#3112](https://github.com/awslabs/smithy-rs/issues/3112), [smithy-rs#3116](https://github.com/awslabs/smithy-rs/issues/3116)) Upgrade `ring` to 0.17.5. +- (client, [smithy-rs#3112](https://github.com/smithy-lang/smithy-rs/issues/3112), [smithy-rs#3116](https://github.com/smithy-lang/smithy-rs/issues/3116)) Upgrade `ring` to 0.17.5. October 31st, 2023 ================== **Breaking Changes:** -- :warning::tada: (client, [smithy-rs#2417](https://github.com/awslabs/smithy-rs/issues/2417), [smithy-rs#3018](https://github.com/awslabs/smithy-rs/issues/3018)) Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. - - For more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050). -- :warning: (client, [smithy-rs#3011](https://github.com/awslabs/smithy-rs/issues/3011)) HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details. -- :warning: (client, [smithy-rs#3038](https://github.com/awslabs/smithy-rs/issues/3038)) The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/awslabs/smithy-rs/discussions/2887). -- :warning: (client, [smithy-rs#2909](https://github.com/awslabs/smithy-rs/issues/2909)) It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method. -- :warning: (all, [smithy-rs#2948](https://github.com/awslabs/smithy-rs/issues/2948)) Update MSRV to Rust 1.70.0 -- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) `aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`. -- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature. -- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively. -- :warning: (client, [smithy-rs#2970](https://github.com/awslabs/smithy-rs/issues/2970)) TestConnection was renamed to EventConnector. -- :warning: (all, [smithy-rs#2973](https://github.com/awslabs/smithy-rs/issues/2973)) Remove `once_cell` from public API. -- :warning: (all, [smithy-rs#2995](https://github.com/awslabs/smithy-rs/issues/2995)) Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting: +- :warning::tada: (client, [smithy-rs#2417](https://github.com/smithy-lang/smithy-rs/issues/2417), [smithy-rs#3018](https://github.com/smithy-lang/smithy-rs/issues/3018)) Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. + + For more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050). +- :warning: (client, [smithy-rs#3011](https://github.com/smithy-lang/smithy-rs/issues/3011)) HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details. +- :warning: (client, [smithy-rs#3038](https://github.com/smithy-lang/smithy-rs/issues/3038)) The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/smithy-lang/smithy-rs/discussions/2887). +- :warning: (client, [smithy-rs#2909](https://github.com/smithy-lang/smithy-rs/issues/2909)) It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method. +- :warning: (all, [smithy-rs#2948](https://github.com/smithy-lang/smithy-rs/issues/2948)) Update MSRV to Rust 1.70.0 +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) `aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`. +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature. +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively. +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) TestConnection was renamed to EventConnector. +- :warning: (all, [smithy-rs#2973](https://github.com/smithy-lang/smithy-rs/issues/2973)) Remove `once_cell` from public API. +- :warning: (all, [smithy-rs#2995](https://github.com/smithy-lang/smithy-rs/issues/2995)) Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting: ```json { "codegen": { @@ -29,16 +29,16 @@ October 31st, 2023 } } ``` -- :warning: (client, [smithy-rs#2978](https://github.com/awslabs/smithy-rs/issues/2978)) The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`. -- :warning: (client, [smithy-rs#2983](https://github.com/awslabs/smithy-rs/issues/2983)) The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. -- :warning: (client, [smithy-rs#2997](https://github.com/awslabs/smithy-rs/issues/2997)) `StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`. -- :warning: (server, [smithy-rs#3038](https://github.com/awslabs/smithy-rs/issues/3038)) `SdkError` is no longer re-exported in generated server crates. -- :warning: (client, [smithy-rs#3039](https://github.com/awslabs/smithy-rs/issues/3039)) The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again. -- :bug::warning: (all, [smithy-rs#3037](https://github.com/awslabs/smithy-rs/issues/3037), [aws-sdk-rust#756](https://github.com/awslabs/aws-sdk-rust/issues/756)) Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`. -- :warning: (client, [smithy-rs#3055](https://github.com/awslabs/smithy-rs/issues/3055)) The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively. -- :warning: (client, [smithy-rs#3032](https://github.com/awslabs/smithy-rs/issues/3032)) [`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html). -- :warning: (client, [smithy-rs#3061](https://github.com/awslabs/smithy-rs/issues/3061)) Lifetimes have been added to the `EndpointResolver` trait. -- :warning: (client, [smithy-rs#3065](https://github.com/awslabs/smithy-rs/issues/3065)) Several traits have been renamed from noun form to verb form to be more idiomatic: +- :warning: (client, [smithy-rs#2978](https://github.com/smithy-lang/smithy-rs/issues/2978)) The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`. +- :warning: (client, [smithy-rs#2983](https://github.com/smithy-lang/smithy-rs/issues/2983)) The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. +- :warning: (client, [smithy-rs#2997](https://github.com/smithy-lang/smithy-rs/issues/2997)) `StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`. +- :warning: (server, [smithy-rs#3038](https://github.com/smithy-lang/smithy-rs/issues/3038)) `SdkError` is no longer re-exported in generated server crates. +- :warning: (client, [smithy-rs#3039](https://github.com/smithy-lang/smithy-rs/issues/3039)) The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again. +- :bug::warning: (all, [smithy-rs#3037](https://github.com/smithy-lang/smithy-rs/issues/3037), [aws-sdk-rust#756](https://github.com/awslabs/aws-sdk-rust/issues/756)) Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`. +- :warning: (client, [smithy-rs#3055](https://github.com/smithy-lang/smithy-rs/issues/3055)) The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively. +- :warning: (client, [smithy-rs#3032](https://github.com/smithy-lang/smithy-rs/issues/3032)) [`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html). +- :warning: (client, [smithy-rs#3061](https://github.com/smithy-lang/smithy-rs/issues/3061)) Lifetimes have been added to the `EndpointResolver` trait. +- :warning: (client, [smithy-rs#3065](https://github.com/smithy-lang/smithy-rs/issues/3065)) Several traits have been renamed from noun form to verb form to be more idiomatic: - `AuthSchemeOptionResolver` -> `ResolveAuthSchemeOptions` - `EndpointResolver` -> `ResolveEndpoint` - `IdentityResolver` -> `ResolveIdentity` @@ -46,52 +46,52 @@ October 31st, 2023 - `RequestSerializer` -> `SerializeRequest` - `ResponseDeserializer` -> `DeserializeResponse` - `Interceptor` -> `Intercept` -- :warning: (client, [smithy-rs#3059](https://github.com/awslabs/smithy-rs/issues/3059)) **This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3067)**. A summary is below.

The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`. -- :warning: (client, [smithy-rs#2917](https://github.com/awslabs/smithy-rs/issues/2917)) `RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function. -- :warning: (client, [smithy-rs#3072](https://github.com/awslabs/smithy-rs/issues/3072)) The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor. -- :warning: (client, [smithy-rs#3078](https://github.com/awslabs/smithy-rs/issues/3078)) The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead. -- :warning: (client, [smithy-rs#3043](https://github.com/awslabs/smithy-rs/issues/3043), [smithy-rs#3078](https://github.com/awslabs/smithy-rs/issues/3078)) **This change has [detailed upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3079).**

The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added. -- :warning: (all, [smithy-rs#3054](https://github.com/awslabs/smithy-rs/issues/3054), [smithy-rs#3070](https://github.com/awslabs/smithy-rs/issues/3070)) `aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. -- :warning: (all, [smithy-rs#3076](https://github.com/awslabs/smithy-rs/issues/3076)) `aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. -- :warning: (all, [smithy-rs#3076](https://github.com/awslabs/smithy-rs/issues/3076), [smithy-rs#3091](https://github.com/awslabs/smithy-rs/issues/3091)) `aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. -- :warning: (client, [smithy-rs#3077](https://github.com/awslabs/smithy-rs/issues/3077)) **Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching. -- :warning: (all, [smithy-rs#3033](https://github.com/awslabs/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/awslabs/smithy-rs/issues/3088), [smithy-rs#3101](https://github.com/awslabs/smithy-rs/issues/3101)) Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3089) for details. -- :warning: (all, [smithy-rs#3033](https://github.com/awslabs/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/awslabs/smithy-rs/issues/3088)) `ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it. -- :warning: (client, [smithy-rs#3092](https://github.com/awslabs/smithy-rs/issues/3092), [smithy-rs#3093](https://github.com/awslabs/smithy-rs/issues/3093)) The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`. -- :bug::warning: (server, [smithy-rs#3095](https://github.com/awslabs/smithy-rs/issues/3095), [smithy-rs#3096](https://github.com/awslabs/smithy-rs/issues/3096)) Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3096) for more details. +- :warning: (client, [smithy-rs#3059](https://github.com/smithy-lang/smithy-rs/issues/3059)) **This change has [detailed upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3067)**. A summary is below.

The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`. +- :warning: (client, [smithy-rs#2917](https://github.com/smithy-lang/smithy-rs/issues/2917)) `RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function. +- :warning: (client, [smithy-rs#3072](https://github.com/smithy-lang/smithy-rs/issues/3072)) The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor. +- :warning: (client, [smithy-rs#3078](https://github.com/smithy-lang/smithy-rs/issues/3078)) The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead. +- :warning: (client, [smithy-rs#3043](https://github.com/smithy-lang/smithy-rs/issues/3043), [smithy-rs#3078](https://github.com/smithy-lang/smithy-rs/issues/3078)) **This change has [detailed upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3079).**

The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added. +- :warning: (all, [smithy-rs#3054](https://github.com/smithy-lang/smithy-rs/issues/3054), [smithy-rs#3070](https://github.com/smithy-lang/smithy-rs/issues/3070)) `aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (all, [smithy-rs#3076](https://github.com/smithy-lang/smithy-rs/issues/3076)) `aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (all, [smithy-rs#3076](https://github.com/smithy-lang/smithy-rs/issues/3076), [smithy-rs#3091](https://github.com/smithy-lang/smithy-rs/issues/3091)) `aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (client, [smithy-rs#3077](https://github.com/smithy-lang/smithy-rs/issues/3077)) **Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching. +- :warning: (all, [smithy-rs#3033](https://github.com/smithy-lang/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/smithy-lang/smithy-rs/issues/3088), [smithy-rs#3101](https://github.com/smithy-lang/smithy-rs/issues/3101)) Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3089) for details. +- :warning: (all, [smithy-rs#3033](https://github.com/smithy-lang/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/smithy-lang/smithy-rs/issues/3088)) `ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it. +- :warning: (client, [smithy-rs#3092](https://github.com/smithy-lang/smithy-rs/issues/3092), [smithy-rs#3093](https://github.com/smithy-lang/smithy-rs/issues/3093)) The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`. +- :bug::warning: (server, [smithy-rs#3095](https://github.com/smithy-lang/smithy-rs/issues/3095), [smithy-rs#3096](https://github.com/smithy-lang/smithy-rs/issues/3096)) Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3096) for more details. **New this release:** -- :tada: (client, [smithy-rs#2916](https://github.com/awslabs/smithy-rs/issues/2916), [smithy-rs#1767](https://github.com/awslabs/smithy-rs/issues/1767)) Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: "CLIENT_ZERO_VALUE_V1" in your codegen config. - For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929). -- :tada: (server, [smithy-rs#3005](https://github.com/awslabs/smithy-rs/issues/3005)) Python middleware can set URI. This can be used to route a request to a different handler. -- :tada: (client, [smithy-rs#3071](https://github.com/awslabs/smithy-rs/issues/3071)) Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio. -- :bug: (client, [smithy-rs#2944](https://github.com/awslabs/smithy-rs/issues/2944), [smithy-rs#2951](https://github.com/awslabs/smithy-rs/issues/2951)) `CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again. -- :bug: (client, [smithy-rs#2960](https://github.com/awslabs/smithy-rs/issues/2960)) Generate a region setter when a model uses SigV4. -- :bug: (all, [smithy-rs#2969](https://github.com/awslabs/smithy-rs/issues/2969), [smithy-rs#1896](https://github.com/awslabs/smithy-rs/issues/1896)) Fix code generation for union members with the `@httpPayload` trait. -- (client, [smithy-rs#2964](https://github.com/awslabs/smithy-rs/issues/2964)) Required members with @contextParam are now treated as client-side required. -- :bug: (client, [smithy-rs#2926](https://github.com/awslabs/smithy-rs/issues/2926), [smithy-rs#2972](https://github.com/awslabs/smithy-rs/issues/2972)) Fix regression with redacting sensitive HTTP response bodies. -- :bug: (all, [smithy-rs#2831](https://github.com/awslabs/smithy-rs/issues/2831), [aws-sdk-rust#818](https://github.com/awslabs/aws-sdk-rust/issues/818)) Omit fractional seconds from `http-date` format. -- :bug: (client, [smithy-rs#2985](https://github.com/awslabs/smithy-rs/issues/2985)) Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code. -- (client, [smithy-rs#2996](https://github.com/awslabs/smithy-rs/issues/2996)) Produce better docs when items are marked @required -- :bug: (client, [smithy-rs#3034](https://github.com/awslabs/smithy-rs/issues/3034), [smithy-rs#3087](https://github.com/awslabs/smithy-rs/issues/3087)) Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority. +- :tada: (client, [smithy-rs#2916](https://github.com/smithy-lang/smithy-rs/issues/2916), [smithy-rs#1767](https://github.com/smithy-lang/smithy-rs/issues/1767)) Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: "CLIENT_ZERO_VALUE_V1" in your codegen config. + For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929). +- :tada: (server, [smithy-rs#3005](https://github.com/smithy-lang/smithy-rs/issues/3005)) Python middleware can set URI. This can be used to route a request to a different handler. +- :tada: (client, [smithy-rs#3071](https://github.com/smithy-lang/smithy-rs/issues/3071)) Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio. +- :bug: (client, [smithy-rs#2944](https://github.com/smithy-lang/smithy-rs/issues/2944), [smithy-rs#2951](https://github.com/smithy-lang/smithy-rs/issues/2951)) `CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again. +- :bug: (client, [smithy-rs#2960](https://github.com/smithy-lang/smithy-rs/issues/2960)) Generate a region setter when a model uses SigV4. +- :bug: (all, [smithy-rs#2969](https://github.com/smithy-lang/smithy-rs/issues/2969), [smithy-rs#1896](https://github.com/smithy-lang/smithy-rs/issues/1896)) Fix code generation for union members with the `@httpPayload` trait. +- (client, [smithy-rs#2964](https://github.com/smithy-lang/smithy-rs/issues/2964)) Required members with @contextParam are now treated as client-side required. +- :bug: (client, [smithy-rs#2926](https://github.com/smithy-lang/smithy-rs/issues/2926), [smithy-rs#2972](https://github.com/smithy-lang/smithy-rs/issues/2972)) Fix regression with redacting sensitive HTTP response bodies. +- :bug: (all, [smithy-rs#2831](https://github.com/smithy-lang/smithy-rs/issues/2831), [aws-sdk-rust#818](https://github.com/awslabs/aws-sdk-rust/issues/818)) Omit fractional seconds from `http-date` format. +- :bug: (client, [smithy-rs#2985](https://github.com/smithy-lang/smithy-rs/issues/2985)) Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code. +- (client, [smithy-rs#2996](https://github.com/smithy-lang/smithy-rs/issues/2996)) Produce better docs when items are marked @required +- :bug: (client, [smithy-rs#3034](https://github.com/smithy-lang/smithy-rs/issues/3034), [smithy-rs#3087](https://github.com/smithy-lang/smithy-rs/issues/3087)) Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority. August 22nd, 2023 ================= **Breaking Changes:** -- :bug::warning: (client, [smithy-rs#2931](https://github.com/awslabs/smithy-rs/issues/2931), [aws-sdk-rust#875](https://github.com/awslabs/aws-sdk-rust/issues/875)) Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading. +- :bug::warning: (client, [smithy-rs#2931](https://github.com/smithy-lang/smithy-rs/issues/2931), [aws-sdk-rust#875](https://github.com/awslabs/aws-sdk-rust/issues/875)) Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading. **New this release:** -- (client, [smithy-rs#2904](https://github.com/awslabs/smithy-rs/issues/2904)) `RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`. -- :bug: (client, [smithy-rs#2914](https://github.com/awslabs/smithy-rs/issues/2914), [aws-sdk-rust#825](https://github.com/awslabs/aws-sdk-rust/issues/825)) Fix incorrect summary docs for builders -- :bug: (client, [smithy-rs#2934](https://github.com/awslabs/smithy-rs/issues/2934), [aws-sdk-rust#872](https://github.com/awslabs/aws-sdk-rust/issues/872)) Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level. -- :bug: (client, [smithy-rs#2935](https://github.com/awslabs/smithy-rs/issues/2935)) Fix `SDK::Endpoint` built-in for `@endpointRuleSet`. +- (client, [smithy-rs#2904](https://github.com/smithy-lang/smithy-rs/issues/2904)) `RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`. +- :bug: (client, [smithy-rs#2914](https://github.com/smithy-lang/smithy-rs/issues/2914), [aws-sdk-rust#825](https://github.com/awslabs/aws-sdk-rust/issues/825)) Fix incorrect summary docs for builders +- :bug: (client, [smithy-rs#2934](https://github.com/smithy-lang/smithy-rs/issues/2934), [aws-sdk-rust#872](https://github.com/awslabs/aws-sdk-rust/issues/872)) Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level. +- :bug: (client, [smithy-rs#2935](https://github.com/smithy-lang/smithy-rs/issues/2935)) Fix `SDK::Endpoint` built-in for `@endpointRuleSet`. August 1st, 2023 ================ **Breaking Changes:** -- ⚠🎉 (server, [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/awslabs/smithy-rs/issues/2827), @hlbarber) The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: +- ⚠🎉 (server, [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/smithy-lang/smithy-rs/issues/2827), @hlbarber) The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: - A `ServiceShape` trait has been added. - The `Plugin` trait has been simplified. @@ -103,7 +103,7 @@ August 1st, 2023 ## Addition of `ServiceShape` - Since the [0.52 release](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. + Since the [0.52 release](https://github.com/smithy-lang/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. ```rust /// Models the [Smithy Operation shape]. @@ -123,7 +123,7 @@ August 1st, 2023 } ``` - This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. + This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. We continue with this approach and introduce the following trait: @@ -177,7 +177,7 @@ August 1st, 2023 maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. - Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/awslabs/smithy-rs/issues/2777) for more context. + Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/smithy-lang/smithy-rs/issues/2777) for more context. The following middleware setup @@ -415,28 +415,28 @@ August 1st, 2023 let scoped_plugin = Scoped::new::(plugin); ``` -- ⚠ (all, [smithy-rs#2675](https://github.com/awslabs/smithy-rs/issues/2675)) Remove native-tls and add a migration guide. -- ⚠ (client, [smithy-rs#2671](https://github.com/awslabs/smithy-rs/issues/2671))
+- ⚠ (all, [smithy-rs#2675](https://github.com/smithy-lang/smithy-rs/issues/2675)) Remove native-tls and add a migration guide. +- ⚠ (client, [smithy-rs#2671](https://github.com/smithy-lang/smithy-rs/issues/2671))
Breaking change in how event stream signing works (click to expand more details) This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. - See the changes in https://github.com/awslabs/smithy-rs/pull/2671 for an example of how this was done for SigV4. + See the changes in https://github.com/smithy-lang/smithy-rs/pull/2671 for an example of how this was done for SigV4.
-- ⚠ (all, [smithy-rs#2673](https://github.com/awslabs/smithy-rs/issues/2673)) For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`. -- ⚠ (server, [smithy-rs#2539](https://github.com/awslabs/smithy-rs/issues/2539)) Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case. -- ⚠ (client, [smithy-rs#2728](https://github.com/awslabs/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/awslabs/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`. -- ⚠ (server, [smithy-rs#2676](https://github.com/awslabs/smithy-rs/issues/2676), [smithy-rs#2685](https://github.com/awslabs/smithy-rs/issues/2685)) Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration -- ⚠ (server, [smithy-rs#2457](https://github.com/awslabs/smithy-rs/issues/2457), @hlbarber) Remove `PollError` from an operations `Service::Error`. +- ⚠ (all, [smithy-rs#2673](https://github.com/smithy-lang/smithy-rs/issues/2673)) For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`. +- ⚠ (server, [smithy-rs#2539](https://github.com/smithy-lang/smithy-rs/issues/2539)) Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case. +- ⚠ (client, [smithy-rs#2728](https://github.com/smithy-lang/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/smithy-lang/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`. +- ⚠ (server, [smithy-rs#2676](https://github.com/smithy-lang/smithy-rs/issues/2676), [smithy-rs#2685](https://github.com/smithy-lang/smithy-rs/issues/2685)) Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration +- ⚠ (server, [smithy-rs#2457](https://github.com/smithy-lang/smithy-rs/issues/2457), @hlbarber) Remove `PollError` from an operations `Service::Error`. Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to [`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. -- ⚠ (client, [smithy-rs#2742](https://github.com/awslabs/smithy-rs/issues/2742)) A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it. -- ⚠ (all, [smithy-rs#2893](https://github.com/awslabs/smithy-rs/issues/2893)) Update MSRV to Rust 1.69.0 -- ⚠ (server, [smithy-rs#2678](https://github.com/awslabs/smithy-rs/issues/2678)) `ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. +- ⚠ (client, [smithy-rs#2742](https://github.com/smithy-lang/smithy-rs/issues/2742)) A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it. +- ⚠ (all, [smithy-rs#2893](https://github.com/smithy-lang/smithy-rs/issues/2893)) Update MSRV to Rust 1.69.0 +- ⚠ (server, [smithy-rs#2678](https://github.com/smithy-lang/smithy-rs/issues/2678)) `ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. `OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: @@ -459,8 +459,8 @@ August 1st, 2023 filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); ``` -- ⚠ (client, [smithy-rs#2758](https://github.com/awslabs/smithy-rs/issues/2758)) The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs. -- ⚠ (server, [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), @hlbarber) Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. +- ⚠ (client, [smithy-rs#2758](https://github.com/smithy-lang/smithy-rs/issues/2758)) The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs. +- ⚠ (server, [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), @hlbarber) Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. @@ -496,23 +496,23 @@ August 1st, 2023 let plugin = plugin_from_operation_fn(map); ``` -- ⚠ (client, [smithy-rs#2783](https://github.com/awslabs/smithy-rs/issues/2783)) The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`. -- ⚠ (client, [smithy-rs#2845](https://github.com/awslabs/smithy-rs/issues/2845)) `aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`. -- ⚠ (client, [smithy-rs#2848](https://github.com/awslabs/smithy-rs/issues/2848)) The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed. -- ⚠ (server, [smithy-rs#2865](https://github.com/awslabs/smithy-rs/issues/2865)) The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer. -- ⚠ (client, [smithy-rs#2873](https://github.com/awslabs/smithy-rs/issues/2873)) The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets. -- ⚠ (client) The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/awslabs/smithy-rs/discussions/2887) to get your code working again. +- ⚠ (client, [smithy-rs#2783](https://github.com/smithy-lang/smithy-rs/issues/2783)) The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`. +- ⚠ (client, [smithy-rs#2845](https://github.com/smithy-lang/smithy-rs/issues/2845)) `aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`. +- ⚠ (client, [smithy-rs#2848](https://github.com/smithy-lang/smithy-rs/issues/2848)) The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed. +- ⚠ (server, [smithy-rs#2865](https://github.com/smithy-lang/smithy-rs/issues/2865)) The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer. +- ⚠ (client, [smithy-rs#2873](https://github.com/smithy-lang/smithy-rs/issues/2873)) The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets. +- ⚠ (client) The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/smithy-lang/smithy-rs/discussions/2887) to get your code working again. **New this release:** -- 🎉 (all, [smithy-rs#2647](https://github.com/awslabs/smithy-rs/issues/2647), [smithy-rs#2645](https://github.com/awslabs/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/awslabs/smithy-rs/issues/2646), [smithy-rs#2616](https://github.com/awslabs/smithy-rs/issues/2616), @thomas-k-cameron) Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives -- 🎉 (client, [smithy-rs#2652](https://github.com/awslabs/smithy-rs/issues/2652), @thomas-k-cameron) Add a `send_with` function on `-Input` types for sending requests without fluent builders -- (client, [smithy-rs#2791](https://github.com/awslabs/smithy-rs/issues/2791), @davidsouther) Add accessors to Builders -- (all, [smithy-rs#2786](https://github.com/awslabs/smithy-rs/issues/2786), @yotamofek) Avoid intermediate vec allocations in AggregatedBytes::to_vec. -- 🐛 (server, [smithy-rs#2733](https://github.com/awslabs/smithy-rs/issues/2733), @thor-bjorgvinsson) Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation. -- (client, [smithy-rs#2728](https://github.com/awslabs/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/awslabs/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported. -- 🐛 (client, [smithy-rs#2767](https://github.com/awslabs/smithy-rs/issues/2767), @mcmasn-amzn) Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces. -- (client, [smithy-rs#2854](https://github.com/awslabs/smithy-rs/issues/2854)) Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible. -- (server, [smithy-rs#2866](https://github.com/awslabs/smithy-rs/issues/2866)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. +- 🎉 (all, [smithy-rs#2647](https://github.com/smithy-lang/smithy-rs/issues/2647), [smithy-rs#2645](https://github.com/smithy-lang/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/smithy-lang/smithy-rs/issues/2646), [smithy-rs#2616](https://github.com/smithy-lang/smithy-rs/issues/2616), @thomas-k-cameron) Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives +- 🎉 (client, [smithy-rs#2652](https://github.com/smithy-lang/smithy-rs/issues/2652), @thomas-k-cameron) Add a `send_with` function on `-Input` types for sending requests without fluent builders +- (client, [smithy-rs#2791](https://github.com/smithy-lang/smithy-rs/issues/2791), @davidsouther) Add accessors to Builders +- (all, [smithy-rs#2786](https://github.com/smithy-lang/smithy-rs/issues/2786), @yotamofek) Avoid intermediate vec allocations in AggregatedBytes::to_vec. +- 🐛 (server, [smithy-rs#2733](https://github.com/smithy-lang/smithy-rs/issues/2733), @thor-bjorgvinsson) Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation. +- (client, [smithy-rs#2728](https://github.com/smithy-lang/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/smithy-lang/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported. +- 🐛 (client, [smithy-rs#2767](https://github.com/smithy-lang/smithy-rs/issues/2767), @mcmasn-amzn) Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces. +- (client, [smithy-rs#2854](https://github.com/smithy-lang/smithy-rs/issues/2854)) Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible. +- (server, [smithy-rs#2866](https://github.com/smithy-lang/smithy-rs/issues/2866)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: ``` HTTP/1.1 400 Bad Request @@ -530,50 +530,50 @@ August 1st, 2023 **Contributors** Thank you for your contributions! ❤ -- @davidsouther ([smithy-rs#2791](https://github.com/awslabs/smithy-rs/issues/2791)) -- @hlbarber ([smithy-rs#2457](https://github.com/awslabs/smithy-rs/issues/2457), [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/awslabs/smithy-rs/issues/2827)) -- @mcmasn-amzn ([smithy-rs#2767](https://github.com/awslabs/smithy-rs/issues/2767)) -- @thomas-k-cameron ([smithy-rs#2616](https://github.com/awslabs/smithy-rs/issues/2616), [smithy-rs#2645](https://github.com/awslabs/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/awslabs/smithy-rs/issues/2646), [smithy-rs#2647](https://github.com/awslabs/smithy-rs/issues/2647), [smithy-rs#2652](https://github.com/awslabs/smithy-rs/issues/2652)) -- @thor-bjorgvinsson ([smithy-rs#2733](https://github.com/awslabs/smithy-rs/issues/2733)) -- @yotamofek ([smithy-rs#2786](https://github.com/awslabs/smithy-rs/issues/2786)) +- @davidsouther ([smithy-rs#2791](https://github.com/smithy-lang/smithy-rs/issues/2791)) +- @hlbarber ([smithy-rs#2457](https://github.com/smithy-lang/smithy-rs/issues/2457), [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/smithy-lang/smithy-rs/issues/2827)) +- @mcmasn-amzn ([smithy-rs#2767](https://github.com/smithy-lang/smithy-rs/issues/2767)) +- @thomas-k-cameron ([smithy-rs#2616](https://github.com/smithy-lang/smithy-rs/issues/2616), [smithy-rs#2645](https://github.com/smithy-lang/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/smithy-lang/smithy-rs/issues/2646), [smithy-rs#2647](https://github.com/smithy-lang/smithy-rs/issues/2647), [smithy-rs#2652](https://github.com/smithy-lang/smithy-rs/issues/2652)) +- @thor-bjorgvinsson ([smithy-rs#2733](https://github.com/smithy-lang/smithy-rs/issues/2733)) +- @yotamofek ([smithy-rs#2786](https://github.com/smithy-lang/smithy-rs/issues/2786)) May 23rd, 2023 ============== **New this release:** -- (all, [smithy-rs#2612](https://github.com/awslabs/smithy-rs/issues/2612)) The `Debug` implementation for `PropertyBag` now prints a list of the types it contains. This significantly improves debuggability. -- (all, [smithy-rs#2653](https://github.com/awslabs/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/awslabs/smithy-rs/issues/2656), @henriiik) Implement `Ord` and `PartialOrd` for `DateTime`. -- 🐛 (client, [smithy-rs#2696](https://github.com/awslabs/smithy-rs/issues/2696)) Fix compiler errors in generated code when naming shapes after types in the Rust standard library prelude. +- (all, [smithy-rs#2612](https://github.com/smithy-lang/smithy-rs/issues/2612)) The `Debug` implementation for `PropertyBag` now prints a list of the types it contains. This significantly improves debuggability. +- (all, [smithy-rs#2653](https://github.com/smithy-lang/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/smithy-lang/smithy-rs/issues/2656), @henriiik) Implement `Ord` and `PartialOrd` for `DateTime`. +- 🐛 (client, [smithy-rs#2696](https://github.com/smithy-lang/smithy-rs/issues/2696)) Fix compiler errors in generated code when naming shapes after types in the Rust standard library prelude. **Contributors** Thank you for your contributions! ❤ -- @henriiik ([smithy-rs#2653](https://github.com/awslabs/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/awslabs/smithy-rs/issues/2656)) +- @henriiik ([smithy-rs#2653](https://github.com/smithy-lang/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/smithy-lang/smithy-rs/issues/2656)) April 26th, 2023 ================ **Breaking Changes:** -- ⚠ (all, [smithy-rs#2611](https://github.com/awslabs/smithy-rs/issues/2611)) Update MSRV to Rust 1.67.1 +- ⚠ (all, [smithy-rs#2611](https://github.com/smithy-lang/smithy-rs/issues/2611)) Update MSRV to Rust 1.67.1 **New this release:** -- 🎉 (server, [smithy-rs#2540](https://github.com/awslabs/smithy-rs/issues/2540)) Implement layer for servers to handle [ALB health checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html). +- 🎉 (server, [smithy-rs#2540](https://github.com/smithy-lang/smithy-rs/issues/2540)) Implement layer for servers to handle [ALB health checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html). Take a look at `aws_smithy_http_server::plugin::alb_health_check` to learn about it. -- 🎉 (client, [smithy-rs#2254](https://github.com/awslabs/smithy-rs/issues/2254), @eduardomourar) Clients now compile for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it! -- (server, [smithy-rs#2540](https://github.com/awslabs/smithy-rs/issues/2540)) Implement `PluginPipeline::http_layer` which allows you to apply a `tower::Layer` to all operations. +- 🎉 (client, [smithy-rs#2254](https://github.com/smithy-lang/smithy-rs/issues/2254), @eduardomourar) Clients now compile for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it! +- (server, [smithy-rs#2540](https://github.com/smithy-lang/smithy-rs/issues/2540)) Implement `PluginPipeline::http_layer` which allows you to apply a `tower::Layer` to all operations. - (client, [aws-sdk-rust#784](https://github.com/awslabs/aws-sdk-rust/issues/784), @abusch) Implement std::error::Error#source() properly for the service meta Error enum. -- 🐛 (all, [smithy-rs#2496](https://github.com/awslabs/smithy-rs/issues/2496)) The outputs for event stream operations now implement the `Sync` auto-trait. -- 🐛 (all, [smithy-rs#2495](https://github.com/awslabs/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. -- 🐛 (client, [smithy-rs#2495](https://github.com/awslabs/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. -- (client, [smithy-rs#2507](https://github.com/awslabs/smithy-rs/issues/2507)) The `enableNewCrateOrganizationScheme` codegen flag has been removed. If you opted out of the new crate organization scheme, it must be adopted now in order to upgrade (see [the upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/2449) from March 23rd's release). -- (client, [smithy-rs#2534](https://github.com/awslabs/smithy-rs/issues/2534)) `aws_smithy_types::date_time::Format` has been re-exported in service client crates. -- 🐛 (server, [smithy-rs#2582](https://github.com/awslabs/smithy-rs/issues/2582), [smithy-rs#2585](https://github.com/awslabs/smithy-rs/issues/2585)) Fix generation of constrained shapes reaching `@sensitive` shapes -- 🐛 (server, [smithy-rs#2583](https://github.com/awslabs/smithy-rs/issues/2583), [smithy-rs#2584](https://github.com/awslabs/smithy-rs/issues/2584)) Fix server code generation bug affecting constrained shapes bound with `@httpPayload` -- (client, [smithy-rs#2603](https://github.com/awslabs/smithy-rs/issues/2603)) Add a sensitive method to `ParseHttpResponse`. When this returns true, logging of the HTTP response body will be suppressed. +- 🐛 (all, [smithy-rs#2496](https://github.com/smithy-lang/smithy-rs/issues/2496)) The outputs for event stream operations now implement the `Sync` auto-trait. +- 🐛 (all, [smithy-rs#2495](https://github.com/smithy-lang/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. +- 🐛 (client, [smithy-rs#2495](https://github.com/smithy-lang/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. +- (client, [smithy-rs#2507](https://github.com/smithy-lang/smithy-rs/issues/2507)) The `enableNewCrateOrganizationScheme` codegen flag has been removed. If you opted out of the new crate organization scheme, it must be adopted now in order to upgrade (see [the upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/2449) from March 23rd's release). +- (client, [smithy-rs#2534](https://github.com/smithy-lang/smithy-rs/issues/2534)) `aws_smithy_types::date_time::Format` has been re-exported in service client crates. +- 🐛 (server, [smithy-rs#2582](https://github.com/smithy-lang/smithy-rs/issues/2582), [smithy-rs#2585](https://github.com/smithy-lang/smithy-rs/issues/2585)) Fix generation of constrained shapes reaching `@sensitive` shapes +- 🐛 (server, [smithy-rs#2583](https://github.com/smithy-lang/smithy-rs/issues/2583), [smithy-rs#2584](https://github.com/smithy-lang/smithy-rs/issues/2584)) Fix server code generation bug affecting constrained shapes bound with `@httpPayload` +- (client, [smithy-rs#2603](https://github.com/smithy-lang/smithy-rs/issues/2603)) Add a sensitive method to `ParseHttpResponse`. When this returns true, logging of the HTTP response body will be suppressed. **Contributors** Thank you for your contributions! ❤ - @abusch ([aws-sdk-rust#784](https://github.com/awslabs/aws-sdk-rust/issues/784)) -- @eduardomourar ([smithy-rs#2254](https://github.com/awslabs/smithy-rs/issues/2254)) +- @eduardomourar ([smithy-rs#2254](https://github.com/smithy-lang/smithy-rs/issues/2254)) April 11th, 2023 @@ -583,10 +583,10 @@ April 11th, 2023 March 23rd, 2023 ================ **Breaking Changes:** -- ⚠🎉 (all, [smithy-rs#2467](https://github.com/awslabs/smithy-rs/issues/2467)) Update MSRV to 1.66.1 -- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129)) Generic clients no longer expose a `request_id()` function on errors. To get request ID functionality, use the SDK code generator. -- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129)) The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these. -- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129), [smithy-rs#2075](https://github.com/awslabs/smithy-rs/issues/2075)) The `*Error` and `*ErrorKind` types have been combined to make error matching simpler. +- ⚠🎉 (all, [smithy-rs#2467](https://github.com/smithy-lang/smithy-rs/issues/2467)) Update MSRV to 1.66.1 +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) Generic clients no longer expose a `request_id()` function on errors. To get request ID functionality, use the SDK code generator. +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these. +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129), [smithy-rs#2075](https://github.com/smithy-lang/smithy-rs/issues/2075)) The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.
Example with S3 **Before:** @@ -634,11 +634,11 @@ March 23rd, 2023 } ```
-- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129)) `aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`. -- ⚠ (server, [smithy-rs#2436](https://github.com/awslabs/smithy-rs/issues/2436)) Remove unnecessary type parameter `B` from `Upgrade` service. -- 🐛⚠ (server, [smithy-rs#2382](https://github.com/awslabs/smithy-rs/issues/2382)) Smithy members named `send` were previously renamed to `send_value` at codegen time. These will now be called `send` in the generated code. -- ⚠ (client, [smithy-rs#2448](https://github.com/awslabs/smithy-rs/issues/2448)) The modules in generated client crates have been reorganized. See the [Client Crate Reorganization Upgrade Guidance](https://github.com/awslabs/smithy-rs/discussions/2449) to see how to fix your code after this change. -- ⚠ (server, [smithy-rs#2438](https://github.com/awslabs/smithy-rs/issues/2438)) Servers can send the `ServerRequestId` in the response headers. +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) `aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`. +- ⚠ (server, [smithy-rs#2436](https://github.com/smithy-lang/smithy-rs/issues/2436)) Remove unnecessary type parameter `B` from `Upgrade` service. +- 🐛⚠ (server, [smithy-rs#2382](https://github.com/smithy-lang/smithy-rs/issues/2382)) Smithy members named `send` were previously renamed to `send_value` at codegen time. These will now be called `send` in the generated code. +- ⚠ (client, [smithy-rs#2448](https://github.com/smithy-lang/smithy-rs/issues/2448)) The modules in generated client crates have been reorganized. See the [Client Crate Reorganization Upgrade Guidance](https://github.com/smithy-lang/smithy-rs/discussions/2449) to see how to fix your code after this change. +- ⚠ (server, [smithy-rs#2438](https://github.com/smithy-lang/smithy-rs/issues/2438)) Servers can send the `ServerRequestId` in the response headers. Servers need to create their service using the new layer builder `ServerRequestIdProviderLayer::new_with_response_header`: ``` let app = app @@ -647,7 +647,7 @@ March 23rd, 2023 **New this release:** - 🐛🎉 (client, [aws-sdk-rust#740](https://github.com/awslabs/aws-sdk-rust/issues/740)) Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated. -- 🎉 (all, [smithy-rs#2398](https://github.com/awslabs/smithy-rs/issues/2398)) Add support for the `awsQueryCompatible` trait. This allows services to continue supporting a custom error code (via the `awsQueryError` trait) when the services migrate their protocol from `awsQuery` to `awsJson1_0` annotated with `awsQueryCompatible`. +- 🎉 (all, [smithy-rs#2398](https://github.com/smithy-lang/smithy-rs/issues/2398)) Add support for the `awsQueryCompatible` trait. This allows services to continue supporting a custom error code (via the `awsQueryError` trait) when the services migrate their protocol from `awsQuery` to `awsJson1_0` annotated with `awsQueryCompatible`.
Click to expand for more details... @@ -681,31 +681,31 @@ March 23rd, 2023 }
``` -- 🎉 (client, [smithy-rs#2428](https://github.com/awslabs/smithy-rs/issues/2428), [smithy-rs#2208](https://github.com/awslabs/smithy-rs/issues/2208)) `SdkError` variants can now be constructed for easier unit testing. -- 🐛 (server, [smithy-rs#2441](https://github.com/awslabs/smithy-rs/issues/2441)) Fix `FilterByOperationName` plugin. This previous caused services with this applied to fail to compile due to mismatched bounds. -- (client, [smithy-rs#2437](https://github.com/awslabs/smithy-rs/issues/2437), [aws-sdk-rust#600](https://github.com/awslabs/aws-sdk-rust/issues/600)) Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`. -- 🐛 (all, [smithy-rs#2226](https://github.com/awslabs/smithy-rs/issues/2226)) Fix bug in timestamp format resolution. Prior to this fix, the timestamp format may have been incorrect if set on the target instead of on the member. -- (all, [smithy-rs#2226](https://github.com/awslabs/smithy-rs/issues/2226)) Add support for offsets when parsing datetimes. RFC3339 date times now support offsets like `-0200` -- (client, [aws-sdk-rust#160](https://github.com/awslabs/aws-sdk-rust/issues/160), [smithy-rs#2445](https://github.com/awslabs/smithy-rs/issues/2445)) Reconnect on transient errors. +- 🎉 (client, [smithy-rs#2428](https://github.com/smithy-lang/smithy-rs/issues/2428), [smithy-rs#2208](https://github.com/smithy-lang/smithy-rs/issues/2208)) `SdkError` variants can now be constructed for easier unit testing. +- 🐛 (server, [smithy-rs#2441](https://github.com/smithy-lang/smithy-rs/issues/2441)) Fix `FilterByOperationName` plugin. This previous caused services with this applied to fail to compile due to mismatched bounds. +- (client, [smithy-rs#2437](https://github.com/smithy-lang/smithy-rs/issues/2437), [aws-sdk-rust#600](https://github.com/awslabs/aws-sdk-rust/issues/600)) Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`. +- 🐛 (all, [smithy-rs#2226](https://github.com/smithy-lang/smithy-rs/issues/2226)) Fix bug in timestamp format resolution. Prior to this fix, the timestamp format may have been incorrect if set on the target instead of on the member. +- (all, [smithy-rs#2226](https://github.com/smithy-lang/smithy-rs/issues/2226)) Add support for offsets when parsing datetimes. RFC3339 date times now support offsets like `-0200` +- (client, [aws-sdk-rust#160](https://github.com/awslabs/aws-sdk-rust/issues/160), [smithy-rs#2445](https://github.com/smithy-lang/smithy-rs/issues/2445)) Reconnect on transient errors. Note: **this behavior is disabled by default for generic clients**. It can be enabled with `aws_smithy_client::Builder::reconnect_on_transient_errors` If a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not be reused. -- (all, [smithy-rs#2474](https://github.com/awslabs/smithy-rs/issues/2474)) Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001) +- (all, [smithy-rs#2474](https://github.com/smithy-lang/smithy-rs/issues/2474)) Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001) January 25th, 2023 ================== **New this release:** -- 🐛 (server, [smithy-rs#920](https://github.com/awslabs/smithy-rs/issues/920)) Fix bug in `OperationExtensionFuture`s `Future::poll` implementation +- 🐛 (server, [smithy-rs#920](https://github.com/smithy-lang/smithy-rs/issues/920)) Fix bug in `OperationExtensionFuture`s `Future::poll` implementation January 24th, 2023 ================== **Breaking Changes:** -- ⚠ (server, [smithy-rs#2161](https://github.com/awslabs/smithy-rs/issues/2161)) Remove deprecated service builder, this includes: +- ⚠ (server, [smithy-rs#2161](https://github.com/smithy-lang/smithy-rs/issues/2161)) Remove deprecated service builder, this includes: - Remove `aws_smithy_http_server::routing::Router` and `aws_smithy_http_server::request::RequestParts`. - Move the `aws_smithy_http_server::routers::Router` trait and `aws_smithy_http_server::routing::RoutingService` into `aws_smithy_http_server::routing`. @@ -714,42 +714,42 @@ January 24th, 2023 - `operation_handler.rs` - `server_operation_handler_trait.rs` - If migration to the new service builder API has not already been completed a brief summary of required changes can be seen in [previous release notes](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) and in API documentation of the root crate. + If migration to the new service builder API has not already been completed a brief summary of required changes can be seen in [previous release notes](https://github.com/smithy-lang/smithy-rs/releases/tag/release-2022-12-12) and in API documentation of the root crate. **New this release:** -- 🐛 (server, [smithy-rs#2213](https://github.com/awslabs/smithy-rs/issues/2213)) `@sparse` list shapes and map shapes with constraint traits and with constrained members are now supported -- 🐛 (server, [smithy-rs#2200](https://github.com/awslabs/smithy-rs/pull/2200)) Event streams no longer generate empty error enums when their operations don’t have modeled errors -- (all, [smithy-rs#2223](https://github.com/awslabs/smithy-rs/issues/2223)) `aws_smithy_types::date_time::DateTime`, `aws_smithy_types::Blob` now implement the `Eq` and `Hash` traits -- (server, [smithy-rs#2223](https://github.com/awslabs/smithy-rs/issues/2223)) Code-generated types for server SDKs now implement the `Eq` and `Hash` traits when possible +- 🐛 (server, [smithy-rs#2213](https://github.com/smithy-lang/smithy-rs/issues/2213)) `@sparse` list shapes and map shapes with constraint traits and with constrained members are now supported +- 🐛 (server, [smithy-rs#2200](https://github.com/smithy-lang/smithy-rs/pull/2200)) Event streams no longer generate empty error enums when their operations don’t have modeled errors +- (all, [smithy-rs#2223](https://github.com/smithy-lang/smithy-rs/issues/2223)) `aws_smithy_types::date_time::DateTime`, `aws_smithy_types::Blob` now implement the `Eq` and `Hash` traits +- (server, [smithy-rs#2223](https://github.com/smithy-lang/smithy-rs/issues/2223)) Code-generated types for server SDKs now implement the `Eq` and `Hash` traits when possible January 12th, 2023 ================== **New this release:** -- 🐛 (server, [smithy-rs#2201](https://github.com/awslabs/smithy-rs/issues/2201)) Fix severe bug where a router fails to deserialize percent-encoded query strings, reporting no operation match when there could be one. If your Smithy model uses an operation with a request URI spec containing [query string literals](https://smithy.io/2.0/spec/http-bindings.html#query-string-literals), you are affected. This fix was released in `aws-smithy-http-server` v0.53.1. +- 🐛 (server, [smithy-rs#2201](https://github.com/smithy-lang/smithy-rs/issues/2201)) Fix severe bug where a router fails to deserialize percent-encoded query strings, reporting no operation match when there could be one. If your Smithy model uses an operation with a request URI spec containing [query string literals](https://smithy.io/2.0/spec/http-bindings.html#query-string-literals), you are affected. This fix was released in `aws-smithy-http-server` v0.53.1. January 11th, 2023 ================== **Breaking Changes:** -- ⚠ (client, [smithy-rs#2099](https://github.com/awslabs/smithy-rs/issues/2099)) The Rust client codegen plugin is now called `rust-client-codegen` instead of `rust-codegen`. Be sure to update your `smithy-build.json` files to refer to the correct plugin name. -- ⚠ (client, [smithy-rs#2099](https://github.com/awslabs/smithy-rs/issues/2099)) Client codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). -- ⚠ (server, [smithy-rs#2099](https://github.com/awslabs/smithy-rs/issues/2099)) Server codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). +- ⚠ (client, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) The Rust client codegen plugin is now called `rust-client-codegen` instead of `rust-codegen`. Be sure to update your `smithy-build.json` files to refer to the correct plugin name. +- ⚠ (client, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) Client codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). +- ⚠ (server, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) Server codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). **New this release:** -- 🐛 (server, [smithy-rs#2103](https://github.com/awslabs/smithy-rs/issues/2103)) In 0.52, `@length`-constrained collection shapes whose members are not constrained made the server code generator crash. This has been fixed. -- (server, [smithy-rs#1879](https://github.com/awslabs/smithy-rs/issues/1879)) Servers support the `@default` trait: models can specify default values. Default values will be automatically supplied when not manually set. -- (server, [smithy-rs#2131](https://github.com/awslabs/smithy-rs/issues/2131)) The constraint `@length` on non-streaming blob shapes is supported. -- 🐛 (client, [smithy-rs#2150](https://github.com/awslabs/smithy-rs/issues/2150)) Fix bug where string default values were not supported for endpoint parameters -- 🐛 (all, [smithy-rs#2170](https://github.com/awslabs/smithy-rs/issues/2170), [aws-sdk-rust#706](https://github.com/awslabs/aws-sdk-rust/issues/706)) Remove the webpki-roots feature from `hyper-rustls` -- 🐛 (server, [smithy-rs#2054](https://github.com/awslabs/smithy-rs/issues/2054)) Servers can generate a unique request ID and use it in their handlers. +- 🐛 (server, [smithy-rs#2103](https://github.com/smithy-lang/smithy-rs/issues/2103)) In 0.52, `@length`-constrained collection shapes whose members are not constrained made the server code generator crash. This has been fixed. +- (server, [smithy-rs#1879](https://github.com/smithy-lang/smithy-rs/issues/1879)) Servers support the `@default` trait: models can specify default values. Default values will be automatically supplied when not manually set. +- (server, [smithy-rs#2131](https://github.com/smithy-lang/smithy-rs/issues/2131)) The constraint `@length` on non-streaming blob shapes is supported. +- 🐛 (client, [smithy-rs#2150](https://github.com/smithy-lang/smithy-rs/issues/2150)) Fix bug where string default values were not supported for endpoint parameters +- 🐛 (all, [smithy-rs#2170](https://github.com/smithy-lang/smithy-rs/issues/2170), [aws-sdk-rust#706](https://github.com/awslabs/aws-sdk-rust/issues/706)) Remove the webpki-roots feature from `hyper-rustls` +- 🐛 (server, [smithy-rs#2054](https://github.com/smithy-lang/smithy-rs/issues/2054)) Servers can generate a unique request ID and use it in their handlers. December 12th, 2022 =================== **Breaking Changes:** -- ⚠🎉 (all, [smithy-rs#1938](https://github.com/awslabs/smithy-rs/issues/1938), @jjantdev) Upgrade Rust MSRV to 1.62.1 -- ⚠🎉 (server, [smithy-rs#1199](https://github.com/awslabs/smithy-rs/issues/1199), [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342), [smithy-rs#1401](https://github.com/awslabs/smithy-rs/issues/1401), [smithy-rs#1998](https://github.com/awslabs/smithy-rs/issues/1998), [smithy-rs#2005](https://github.com/awslabs/smithy-rs/issues/2005), [smithy-rs#2028](https://github.com/awslabs/smithy-rs/issues/2028), [smithy-rs#2034](https://github.com/awslabs/smithy-rs/issues/2034), [smithy-rs#2036](https://github.com/awslabs/smithy-rs/issues/2036)) [Constraint traits](https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html) in server SDKs are beginning to be supported. The following are now supported: +- ⚠🎉 (all, [smithy-rs#1938](https://github.com/smithy-lang/smithy-rs/issues/1938), @jjantdev) Upgrade Rust MSRV to 1.62.1 +- ⚠🎉 (server, [smithy-rs#1199](https://github.com/smithy-lang/smithy-rs/issues/1199), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1401](https://github.com/smithy-lang/smithy-rs/issues/1401), [smithy-rs#1998](https://github.com/smithy-lang/smithy-rs/issues/1998), [smithy-rs#2005](https://github.com/smithy-lang/smithy-rs/issues/2005), [smithy-rs#2028](https://github.com/smithy-lang/smithy-rs/issues/2028), [smithy-rs#2034](https://github.com/smithy-lang/smithy-rs/issues/2034), [smithy-rs#2036](https://github.com/smithy-lang/smithy-rs/issues/2036)) [Constraint traits](https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html) in server SDKs are beginning to be supported. The following are now supported: * The `length` trait on `string` shapes. * The `length` trait on `map` shapes. @@ -775,7 +775,7 @@ December 12th, 2022 } } ``` -- ⚠🎉 (server, [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342), [smithy-rs#1119](https://github.com/awslabs/smithy-rs/issues/1119)) Server SDKs now generate "constrained types" for constrained shapes. Constrained types are [newtypes](https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html) that encapsulate the modeled constraints. They constitute a [widespread pattern to guarantee domain invariants](https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/) and promote correctness in your business logic. So, for example, the model: +- ⚠🎉 (server, [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1119](https://github.com/smithy-lang/smithy-rs/issues/1119)) Server SDKs now generate "constrained types" for constrained shapes. Constrained types are [newtypes](https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html) that encapsulate the modeled constraints. They constitute a [widespread pattern to guarantee domain invariants](https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/) and promote correctness in your business logic. So, for example, the model: ```smithy @length(min: 1, max: 69) @@ -791,7 +791,7 @@ December 12th, 2022 A failed attempt to instantiate a constrained type will yield a `ConstraintViolation` error type you may want to handle. This type's API is subject to change. - Constrained types _guarantee_, by virtue of the type system, that your service's operation outputs adhere to the modeled constraints. To learn more about the motivation for constrained types and how they work, see [the RFC](https://github.com/awslabs/smithy-rs/pull/1199). + Constrained types _guarantee_, by virtue of the type system, that your service's operation outputs adhere to the modeled constraints. To learn more about the motivation for constrained types and how they work, see [the RFC](https://github.com/smithy-lang/smithy-rs/pull/1199). If you'd like to opt-out of generating constrained types, you can set `codegen.publicConstrainedTypes` to `false`. Note that if you do, the generated server SDK will still honor your operation input's modeled constraints upon receiving a request, but will not help you in writing business logic code that adheres to the constraints, and _will not prevent you from returning responses containing operation outputs that violate said constraints_. @@ -806,7 +806,7 @@ December 12th, 2022 } } ``` -- 🐛⚠🎉 (server, [smithy-rs#1714](https://github.com/awslabs/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342)) Structure builders in server SDKs have undergone significant changes. +- 🐛⚠🎉 (server, [smithy-rs#1714](https://github.com/smithy-lang/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342)) Structure builders in server SDKs have undergone significant changes. The API surface has been reduced. It is now simpler and closely follows what you would get when using the [`derive_builder`](https://docs.rs/derive_builder/latest/derive_builder/) crate: @@ -875,7 +875,7 @@ December 12th, 2022 // (5) Builder type can be fallibly converted to the structure using `TryFrom` or `TryInto`. let _error = Pokemon::try_from(eevee_builder).expect_err("name was not provided"); ``` -- ⚠🎉 (server, [smithy-rs#1620](https://github.com/awslabs/smithy-rs/issues/1620), [smithy-rs#1666](https://github.com/awslabs/smithy-rs/issues/1666), [smithy-rs#1731](https://github.com/awslabs/smithy-rs/issues/1731), [smithy-rs#1736](https://github.com/awslabs/smithy-rs/issues/1736), [smithy-rs#1753](https://github.com/awslabs/smithy-rs/issues/1753), [smithy-rs#1738](https://github.com/awslabs/smithy-rs/issues/1738), [smithy-rs#1782](https://github.com/awslabs/smithy-rs/issues/1782), [smithy-rs#1829](https://github.com/awslabs/smithy-rs/issues/1829), [smithy-rs#1837](https://github.com/awslabs/smithy-rs/issues/1837), [smithy-rs#1891](https://github.com/awslabs/smithy-rs/issues/1891), [smithy-rs#1840](https://github.com/awslabs/smithy-rs/issues/1840), [smithy-rs#1844](https://github.com/awslabs/smithy-rs/issues/1844), [smithy-rs#1858](https://github.com/awslabs/smithy-rs/issues/1858), [smithy-rs#1930](https://github.com/awslabs/smithy-rs/issues/1930), [smithy-rs#1999](https://github.com/awslabs/smithy-rs/issues/1999), [smithy-rs#2003](https://github.com/awslabs/smithy-rs/issues/2003), [smithy-rs#2008](https://github.com/awslabs/smithy-rs/issues/2008), [smithy-rs#2010](https://github.com/awslabs/smithy-rs/issues/2010), [smithy-rs#2019](https://github.com/awslabs/smithy-rs/issues/2019), [smithy-rs#2020](https://github.com/awslabs/smithy-rs/issues/2020), [smithy-rs#2021](https://github.com/awslabs/smithy-rs/issues/2021), [smithy-rs#2038](https://github.com/awslabs/smithy-rs/issues/2038), [smithy-rs#2039](https://github.com/awslabs/smithy-rs/issues/2039), [smithy-rs#2041](https://github.com/awslabs/smithy-rs/issues/2041)) ### Plugins/New Service Builder API +- ⚠🎉 (server, [smithy-rs#1620](https://github.com/smithy-lang/smithy-rs/issues/1620), [smithy-rs#1666](https://github.com/smithy-lang/smithy-rs/issues/1666), [smithy-rs#1731](https://github.com/smithy-lang/smithy-rs/issues/1731), [smithy-rs#1736](https://github.com/smithy-lang/smithy-rs/issues/1736), [smithy-rs#1753](https://github.com/smithy-lang/smithy-rs/issues/1753), [smithy-rs#1738](https://github.com/smithy-lang/smithy-rs/issues/1738), [smithy-rs#1782](https://github.com/smithy-lang/smithy-rs/issues/1782), [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829), [smithy-rs#1837](https://github.com/smithy-lang/smithy-rs/issues/1837), [smithy-rs#1891](https://github.com/smithy-lang/smithy-rs/issues/1891), [smithy-rs#1840](https://github.com/smithy-lang/smithy-rs/issues/1840), [smithy-rs#1844](https://github.com/smithy-lang/smithy-rs/issues/1844), [smithy-rs#1858](https://github.com/smithy-lang/smithy-rs/issues/1858), [smithy-rs#1930](https://github.com/smithy-lang/smithy-rs/issues/1930), [smithy-rs#1999](https://github.com/smithy-lang/smithy-rs/issues/1999), [smithy-rs#2003](https://github.com/smithy-lang/smithy-rs/issues/2003), [smithy-rs#2008](https://github.com/smithy-lang/smithy-rs/issues/2008), [smithy-rs#2010](https://github.com/smithy-lang/smithy-rs/issues/2010), [smithy-rs#2019](https://github.com/smithy-lang/smithy-rs/issues/2019), [smithy-rs#2020](https://github.com/smithy-lang/smithy-rs/issues/2020), [smithy-rs#2021](https://github.com/smithy-lang/smithy-rs/issues/2021), [smithy-rs#2038](https://github.com/smithy-lang/smithy-rs/issues/2038), [smithy-rs#2039](https://github.com/smithy-lang/smithy-rs/issues/2039), [smithy-rs#2041](https://github.com/smithy-lang/smithy-rs/issues/2041)) ### Plugins/New Service Builder API The `Router` struct has been replaced by a new `Service` located at the root of the generated crate. Its name coincides with the same name as the Smithy service you are generating. @@ -883,7 +883,7 @@ December 12th, 2022 use pokemon_service_server_sdk::PokemonService; ``` - The new service builder infrastructure comes with a `Plugin` system which supports middleware on `smithy-rs`. See the [mididleware documentation](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/middleware.md) and the [API documentation](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/plugin/index.html) for more details. + The new service builder infrastructure comes with a `Plugin` system which supports middleware on `smithy-rs`. See the [mididleware documentation](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/middleware.md) and the [API documentation](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/plugin/index.html) for more details. Usage of the new service builder API: @@ -931,28 +931,28 @@ December 12th, 2022 In addition to the [`ConnectInfo`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/connect_info/struct.ConnectInfo.html) extractor, we also have added [lambda extractors](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/lambda/index.html) which are feature gated with `aws-lambda`. - [`FromParts` documentation](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/from_parts.md) has been added. + [`FromParts` documentation](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) has been added. ### New Documentation - New sections to have been added to the [server side of the book](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/overview.md). + New sections to have been added to the [server side of the book](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/overview.md). These include: - - [Middleware](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/middleware.md) - - [Accessing Un-modelled Data](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/from_parts.md) - - [Anatomy of a Service](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/anatomy.md) + - [Middleware](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/middleware.md) + - [Accessing Un-modelled Data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) + - [Anatomy of a Service](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/anatomy.md) This release also introduces extensive documentation at the root of the generated crate. For best results compile documentation with `cargo +nightly doc --open`. ### Deprecations The existing service builder infrastructure, `OperationRegistryBuilder`/`OperationRegistry`/`Router`, is now deprecated. Customers should migrate to the newer scheme described above. The deprecated types will be removed in a future release. -- ⚠ (client, [smithy-rs#1875](https://github.com/awslabs/smithy-rs/issues/1875)) Replace bool with enum for a function parameter of `label::fmt_string`. -- ⚠ (all, [smithy-rs#1980](https://github.com/awslabs/smithy-rs/issues/1980)) aws_smithy_types_convert::date_time::DateTimeExt::to_chrono_utc returns a Result<> -- ⚠ (client, [smithy-rs#1926](https://github.com/awslabs/smithy-rs/issues/1926), [smithy-rs#1819](https://github.com/awslabs/smithy-rs/issues/1819)) Several breaking changes have been made to errors. See [the upgrade guide](https://github.com/awslabs/smithy-rs/issues/1950) for more information. -- 🐛⚠ (server, [smithy-rs#1714](https://github.com/awslabs/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342), [smithy-rs#1860](https://github.com/awslabs/smithy-rs/issues/1860)) Server SDKs now correctly reject operation inputs that don't set values for `required` structure members. Previously, in some scenarios, server SDKs would accept the request and set a default value for the member (e.g. `""` for a `String`), even when the member shape did not have [Smithy IDL v2's `default` trait](https://awslabs.github.io/smithy/2.0/spec/type-refinement-traits.html#smithy-api-default-trait) attached. The `default` trait is [still unsupported](https://github.com/awslabs/smithy-rs/issues/1860). -- ⚠ (client, [smithy-rs#1945](https://github.com/awslabs/smithy-rs/issues/1945)) Generate enums that guide the users to write match expressions in a forward-compatible way. +- ⚠ (client, [smithy-rs#1875](https://github.com/smithy-lang/smithy-rs/issues/1875)) Replace bool with enum for a function parameter of `label::fmt_string`. +- ⚠ (all, [smithy-rs#1980](https://github.com/smithy-lang/smithy-rs/issues/1980)) aws_smithy_types_convert::date_time::DateTimeExt::to_chrono_utc returns a Result<> +- ⚠ (client, [smithy-rs#1926](https://github.com/smithy-lang/smithy-rs/issues/1926), [smithy-rs#1819](https://github.com/smithy-lang/smithy-rs/issues/1819)) Several breaking changes have been made to errors. See [the upgrade guide](https://github.com/smithy-lang/smithy-rs/issues/1950) for more information. +- 🐛⚠ (server, [smithy-rs#1714](https://github.com/smithy-lang/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1860](https://github.com/smithy-lang/smithy-rs/issues/1860)) Server SDKs now correctly reject operation inputs that don't set values for `required` structure members. Previously, in some scenarios, server SDKs would accept the request and set a default value for the member (e.g. `""` for a `String`), even when the member shape did not have [Smithy IDL v2's `default` trait](https://awslabs.github.io/smithy/2.0/spec/type-refinement-traits.html#smithy-api-default-trait) attached. The `default` trait is [still unsupported](https://github.com/smithy-lang/smithy-rs/issues/1860). +- ⚠ (client, [smithy-rs#1945](https://github.com/smithy-lang/smithy-rs/issues/1945)) Generate enums that guide the users to write match expressions in a forward-compatible way. Before this change, users could write a match expression against an enum in a non-forward-compatible way: ```rust match some_enum { @@ -973,10 +973,10 @@ December 12th, 2022 } ``` This is forward-compatible because the execution will hit the second last match arm regardless of whether the enum defines `SomeEnum::NewVariant` or not. -- ⚠ (client, [smithy-rs#1984](https://github.com/awslabs/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/awslabs/smithy-rs/issues/1496)) Functions on `aws_smithy_http::endpoint::Endpoint` now return a `Result` instead of panicking. -- ⚠ (client, [smithy-rs#1984](https://github.com/awslabs/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/awslabs/smithy-rs/issues/1496)) `Endpoint::mutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::mutable_uri`. -- ⚠ (client, [smithy-rs#1984](https://github.com/awslabs/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/awslabs/smithy-rs/issues/1496)) `Endpoint::immutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::immutable_uri`. -- ⚠ (server, [smithy-rs#1982](https://github.com/awslabs/smithy-rs/issues/1982)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize the [full shape ID](https://smithy.io/2.0/spec/model.html#shape-id) (including namespace) in operation error responses. +- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) Functions on `aws_smithy_http::endpoint::Endpoint` now return a `Result` instead of panicking. +- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) `Endpoint::mutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::mutable_uri`. +- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) `Endpoint::immutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::immutable_uri`. +- ⚠ (server, [smithy-rs#1982](https://github.com/smithy-lang/smithy-rs/issues/1982)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize the [full shape ID](https://smithy.io/2.0/spec/model.html#shape-id) (including namespace) in operation error responses. Example server error response before: @@ -995,90 +995,90 @@ December 12th, 2022 x-amzn-errortype: com.example.service#InvalidRequestException ... ``` -- ⚠ (server, [smithy-rs#2035](https://github.com/awslabs/smithy-rs/issues/2035)) All types that are exclusively relevant within the context of an AWS Lambda function are now gated behind the +- ⚠ (server, [smithy-rs#2035](https://github.com/smithy-lang/smithy-rs/issues/2035)) All types that are exclusively relevant within the context of an AWS Lambda function are now gated behind the `aws-lambda` feature flag. This will reduce the number of dependencies (and improve build times) for users that are running their Smithy services in non-serverless environments (e.g. via `hyper`). -- ⚠ (all, [smithy-rs#1983](https://github.com/awslabs/smithy-rs/issues/1983), [smithy-rs#2029](https://github.com/awslabs/smithy-rs/issues/2029)) Implementation of the Debug trait for container shapes now redacts what is printed per the sensitive trait. -- ⚠ (client, [smithy-rs#2065](https://github.com/awslabs/smithy-rs/issues/2065)) `SdkBody` callbacks have been removed. If you were using these, please [file an issue](https://github.com/awslabs/smithy-rs/issues/new) so that we can better understand your use-case and provide the support you need. -- ⚠ (client, [smithy-rs#2063](https://github.com/awslabs/smithy-rs/issues/2063)) Added SmithyEndpointStage which can be used to set an endpoint for smithy-native clients -- ⚠ (all, [smithy-rs#1989](https://github.com/awslabs/smithy-rs/issues/1989)) The Unit type for a Union member is no longer rendered. The serializers and parsers generated now function accordingly in the absence of the inner data associated with the Unit type. +- ⚠ (all, [smithy-rs#1983](https://github.com/smithy-lang/smithy-rs/issues/1983), [smithy-rs#2029](https://github.com/smithy-lang/smithy-rs/issues/2029)) Implementation of the Debug trait for container shapes now redacts what is printed per the sensitive trait. +- ⚠ (client, [smithy-rs#2065](https://github.com/smithy-lang/smithy-rs/issues/2065)) `SdkBody` callbacks have been removed. If you were using these, please [file an issue](https://github.com/smithy-lang/smithy-rs/issues/new) so that we can better understand your use-case and provide the support you need. +- ⚠ (client, [smithy-rs#2063](https://github.com/smithy-lang/smithy-rs/issues/2063)) Added SmithyEndpointStage which can be used to set an endpoint for smithy-native clients +- ⚠ (all, [smithy-rs#1989](https://github.com/smithy-lang/smithy-rs/issues/1989)) The Unit type for a Union member is no longer rendered. The serializers and parsers generated now function accordingly in the absence of the inner data associated with the Unit type. **New this release:** -- 🎉 (all, [smithy-rs#1929](https://github.com/awslabs/smithy-rs/issues/1929)) Upgrade Smithy to v1.26 -- 🎉 (client, [smithy-rs#2044](https://github.com/awslabs/smithy-rs/issues/2044), [smithy-rs#371](https://github.com/awslabs/smithy-rs/issues/371)) Fixed and improved the request `tracing` span hierarchy to improve log messages, profiling, and debuggability. -- 🐛 (all, [smithy-rs#1847](https://github.com/awslabs/smithy-rs/issues/1847)) Support Sigv4 signature generation on PowerPC 32 and 64 bit. This architecture cannot compile `ring`, so the implementation has been updated to rely on `hamc` + `sha2` to achive the same result with broader platform compatibility and higher performance. We also updated the CI which is now running as many tests as possible against i686 and PowerPC 32 and 64 bit. -- 🐛 (server, [smithy-rs#1910](https://github.com/awslabs/smithy-rs/issues/1910)) `aws_smithy_http_server::routing::Router` is exported from the crate root again. This reverts unintentional breakage that was introduced in `aws-smithy-http-server` v0.51.0 only. -- 🐛 (client, [smithy-rs#1903](https://github.com/awslabs/smithy-rs/issues/1903), [smithy-rs#1902](https://github.com/awslabs/smithy-rs/issues/1902)) Fix bug that can cause panics in paginators -- (client, [smithy-rs#1919](https://github.com/awslabs/smithy-rs/issues/1919)) Operation metadata is now added to the property bag before sending requests allowing middlewares to behave +- 🎉 (all, [smithy-rs#1929](https://github.com/smithy-lang/smithy-rs/issues/1929)) Upgrade Smithy to v1.26 +- 🎉 (client, [smithy-rs#2044](https://github.com/smithy-lang/smithy-rs/issues/2044), [smithy-rs#371](https://github.com/smithy-lang/smithy-rs/issues/371)) Fixed and improved the request `tracing` span hierarchy to improve log messages, profiling, and debuggability. +- 🐛 (all, [smithy-rs#1847](https://github.com/smithy-lang/smithy-rs/issues/1847)) Support Sigv4 signature generation on PowerPC 32 and 64 bit. This architecture cannot compile `ring`, so the implementation has been updated to rely on `hamc` + `sha2` to achive the same result with broader platform compatibility and higher performance. We also updated the CI which is now running as many tests as possible against i686 and PowerPC 32 and 64 bit. +- 🐛 (server, [smithy-rs#1910](https://github.com/smithy-lang/smithy-rs/issues/1910)) `aws_smithy_http_server::routing::Router` is exported from the crate root again. This reverts unintentional breakage that was introduced in `aws-smithy-http-server` v0.51.0 only. +- 🐛 (client, [smithy-rs#1903](https://github.com/smithy-lang/smithy-rs/issues/1903), [smithy-rs#1902](https://github.com/smithy-lang/smithy-rs/issues/1902)) Fix bug that can cause panics in paginators +- (client, [smithy-rs#1919](https://github.com/smithy-lang/smithy-rs/issues/1919)) Operation metadata is now added to the property bag before sending requests allowing middlewares to behave differently depending on the operation being sent. -- (all, [smithy-rs#1907](https://github.com/awslabs/smithy-rs/issues/1907)) Fix cargo audit issue on chrono. -- 🐛 (client, [smithy-rs#1957](https://github.com/awslabs/smithy-rs/issues/1957)) It was previously possible to send requests without setting query parameters modeled as required. Doing this may cause a +- (all, [smithy-rs#1907](https://github.com/smithy-lang/smithy-rs/issues/1907)) Fix cargo audit issue on chrono. +- 🐛 (client, [smithy-rs#1957](https://github.com/smithy-lang/smithy-rs/issues/1957)) It was previously possible to send requests without setting query parameters modeled as required. Doing this may cause a service to interpret a request incorrectly instead of just sending back a 400 error. Now, when an operation has query parameters that are marked as required, the omission of those query parameters will cause a BuildError, preventing the invalid operation from being sent. -- (all, [smithy-rs#1972](https://github.com/awslabs/smithy-rs/issues/1972)) Upgrade to Smithy 1.26.2 -- (all, [smithy-rs#2011](https://github.com/awslabs/smithy-rs/issues/2011), @lsr0) Make generated enum `values()` functions callable in const contexts. -- (client, [smithy-rs#2064](https://github.com/awslabs/smithy-rs/issues/2064), [aws-sdk-rust#632](https://github.com/awslabs/aws-sdk-rust/issues/632)) Clients now default max idle connections to 70 (previously unlimited) to reduce the likelihood of hitting max file handles in AWS Lambda. -- (client, [smithy-rs#2057](https://github.com/awslabs/smithy-rs/issues/2057), [smithy-rs#371](https://github.com/awslabs/smithy-rs/issues/371)) Add more `tracing` events to signing and event streams +- (all, [smithy-rs#1972](https://github.com/smithy-lang/smithy-rs/issues/1972)) Upgrade to Smithy 1.26.2 +- (all, [smithy-rs#2011](https://github.com/smithy-lang/smithy-rs/issues/2011), @lsr0) Make generated enum `values()` functions callable in const contexts. +- (client, [smithy-rs#2064](https://github.com/smithy-lang/smithy-rs/issues/2064), [aws-sdk-rust#632](https://github.com/awslabs/aws-sdk-rust/issues/632)) Clients now default max idle connections to 70 (previously unlimited) to reduce the likelihood of hitting max file handles in AWS Lambda. +- (client, [smithy-rs#2057](https://github.com/smithy-lang/smithy-rs/issues/2057), [smithy-rs#371](https://github.com/smithy-lang/smithy-rs/issues/371)) Add more `tracing` events to signing and event streams **Contributors** Thank you for your contributions! ❤ -- @jjantdev ([smithy-rs#1938](https://github.com/awslabs/smithy-rs/issues/1938)) -- @lsr0 ([smithy-rs#2011](https://github.com/awslabs/smithy-rs/issues/2011)) +- @jjantdev ([smithy-rs#1938](https://github.com/smithy-lang/smithy-rs/issues/1938)) +- @lsr0 ([smithy-rs#2011](https://github.com/smithy-lang/smithy-rs/issues/2011)) October 24th, 2022 ================== **Breaking Changes:** -- ⚠ (all, [smithy-rs#1825](https://github.com/awslabs/smithy-rs/issues/1825)) Bump MSRV to be 1.62.0. -- ⚠ (server, [smithy-rs#1825](https://github.com/awslabs/smithy-rs/issues/1825)) Bump pyo3 and pyo3-asyncio from 0.16.x to 0.17.0 for aws-smithy-http-server-python. -- ⚠ (client, [smithy-rs#1811](https://github.com/awslabs/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. -- ⚠ (server, [smithy-rs#1803](https://github.com/awslabs/smithy-rs/issues/1803)) Mark `operation` and `operation_handler` modules as private in the generated server crate. +- ⚠ (all, [smithy-rs#1825](https://github.com/smithy-lang/smithy-rs/issues/1825)) Bump MSRV to be 1.62.0. +- ⚠ (server, [smithy-rs#1825](https://github.com/smithy-lang/smithy-rs/issues/1825)) Bump pyo3 and pyo3-asyncio from 0.16.x to 0.17.0 for aws-smithy-http-server-python. +- ⚠ (client, [smithy-rs#1811](https://github.com/smithy-lang/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. +- ⚠ (server, [smithy-rs#1803](https://github.com/smithy-lang/smithy-rs/issues/1803)) Mark `operation` and `operation_handler` modules as private in the generated server crate. Both modules did not contain any public types, therefore there should be no actual breakage when updating. -- ⚠ (client, [smithy-rs#1740](https://github.com/awslabs/smithy-rs/issues/1740), [smithy-rs#256](https://github.com/awslabs/smithy-rs/issues/256)) A large list of breaking changes were made to accomodate default timeouts in the AWS SDK. - See [the smithy-rs upgrade guide](https://github.com/awslabs/smithy-rs/issues/1760) for a full list +- ⚠ (client, [smithy-rs#1740](https://github.com/smithy-lang/smithy-rs/issues/1740), [smithy-rs#256](https://github.com/smithy-lang/smithy-rs/issues/256)) A large list of breaking changes were made to accomodate default timeouts in the AWS SDK. + See [the smithy-rs upgrade guide](https://github.com/smithy-lang/smithy-rs/issues/1760) for a full list of breaking changes and how to resolve them. -- ⚠ (server, [smithy-rs#1829](https://github.com/awslabs/smithy-rs/issues/1829)) Remove `Protocol` enum, removing an obstruction to extending smithy to third-party protocols. -- ⚠ (server, [smithy-rs#1829](https://github.com/awslabs/smithy-rs/issues/1829)) Convert the `protocol` argument on `PyMiddlewares::new` constructor to a type parameter. -- ⚠ (server, [smithy-rs#1753](https://github.com/awslabs/smithy-rs/issues/1753)) `aws_smithy_http_server::routing::Router` is no longer exported from the crate root. This was unintentional breakage that will be reverted in the next release. +- ⚠ (server, [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829)) Remove `Protocol` enum, removing an obstruction to extending smithy to third-party protocols. +- ⚠ (server, [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829)) Convert the `protocol` argument on `PyMiddlewares::new` constructor to a type parameter. +- ⚠ (server, [smithy-rs#1753](https://github.com/smithy-lang/smithy-rs/issues/1753)) `aws_smithy_http_server::routing::Router` is no longer exported from the crate root. This was unintentional breakage that will be reverted in the next release. **New this release:** -- (server, [smithy-rs#1811](https://github.com/awslabs/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. -- 🐛 (all, [smithy-rs#1802](https://github.com/awslabs/smithy-rs/issues/1802)) Sensitive fields in errors now respect @sensitive trait and are properly redacted. -- (server, [smithy-rs#1727](https://github.com/awslabs/smithy-rs/issues/1727), @GeneralSwiss) Pokémon Service example code now runs clippy during build. -- (server, [smithy-rs#1734](https://github.com/awslabs/smithy-rs/issues/1734)) Implement support for pure Python request middleware. Improve idiomatic logging support over tracing. -- 🐛 (client, [aws-sdk-rust#620](https://github.com/awslabs/aws-sdk-rust/issues/620), [smithy-rs#1748](https://github.com/awslabs/smithy-rs/issues/1748)) Paginators now stop on encountering a duplicate token by default rather than panic. This behavior can be customized by toggling the `stop_on_duplicate_token` property on the paginator before calling `send`. -- 🐛 (all, [smithy-rs#1817](https://github.com/awslabs/smithy-rs/issues/1817), @ethyi) Update aws-types zeroize to flexible version to prevent downstream version conflicts. -- (all, [smithy-rs#1852](https://github.com/awslabs/smithy-rs/issues/1852), @ogudavid) Enable local maven repo dependency override. +- (server, [smithy-rs#1811](https://github.com/smithy-lang/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. +- 🐛 (all, [smithy-rs#1802](https://github.com/smithy-lang/smithy-rs/issues/1802)) Sensitive fields in errors now respect @sensitive trait and are properly redacted. +- (server, [smithy-rs#1727](https://github.com/smithy-lang/smithy-rs/issues/1727), @GeneralSwiss) Pokémon Service example code now runs clippy during build. +- (server, [smithy-rs#1734](https://github.com/smithy-lang/smithy-rs/issues/1734)) Implement support for pure Python request middleware. Improve idiomatic logging support over tracing. +- 🐛 (client, [aws-sdk-rust#620](https://github.com/awslabs/aws-sdk-rust/issues/620), [smithy-rs#1748](https://github.com/smithy-lang/smithy-rs/issues/1748)) Paginators now stop on encountering a duplicate token by default rather than panic. This behavior can be customized by toggling the `stop_on_duplicate_token` property on the paginator before calling `send`. +- 🐛 (all, [smithy-rs#1817](https://github.com/smithy-lang/smithy-rs/issues/1817), @ethyi) Update aws-types zeroize to flexible version to prevent downstream version conflicts. +- (all, [smithy-rs#1852](https://github.com/smithy-lang/smithy-rs/issues/1852), @ogudavid) Enable local maven repo dependency override. **Contributors** Thank you for your contributions! ❤ -- @GeneralSwiss ([smithy-rs#1727](https://github.com/awslabs/smithy-rs/issues/1727)) -- @ethyi ([smithy-rs#1817](https://github.com/awslabs/smithy-rs/issues/1817)) -- @ogudavid ([smithy-rs#1852](https://github.com/awslabs/smithy-rs/issues/1852)) +- @GeneralSwiss ([smithy-rs#1727](https://github.com/smithy-lang/smithy-rs/issues/1727)) +- @ethyi ([smithy-rs#1817](https://github.com/smithy-lang/smithy-rs/issues/1817)) +- @ogudavid ([smithy-rs#1852](https://github.com/smithy-lang/smithy-rs/issues/1852)) September 20th, 2022 ==================== **Breaking Changes:** -- ⚠ (client, [smithy-rs#1603](https://github.com/awslabs/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) `aws_smithy_types::RetryConfig` no longer implements `Default`, and its `new` function has been replaced with `standard`. -- ⚠ (client, [smithy-rs#1603](https://github.com/awslabs/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) Client creation now panics if retries or timeouts are enabled without an async sleep implementation. +- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) `aws_smithy_types::RetryConfig` no longer implements `Default`, and its `new` function has been replaced with `standard`. +- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) Client creation now panics if retries or timeouts are enabled without an async sleep implementation. If you're using the Tokio runtime and have the `rt-tokio` feature enabled (which is enabled by default), then you shouldn't notice this change at all. Otherwise, if using something other than Tokio as the async runtime, the `AsyncSleep` trait must be implemented, and that implementation given to the config builder via the `sleep_impl` method. Alternatively, retry can be explicitly turned off by setting `max_attempts` to 1, which will result in successful client creation without an async sleep implementation. -- ⚠ (client, [smithy-rs#1603](https://github.com/awslabs/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) The `default_async_sleep` method on the `Client` builder has been removed. The default async sleep is +- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) The `default_async_sleep` method on the `Client` builder has been removed. The default async sleep is wired up by default if none is provided. -- ⚠ (client, [smithy-rs#976](https://github.com/awslabs/smithy-rs/issues/976), [smithy-rs#1710](https://github.com/awslabs/smithy-rs/issues/1710)) Removed the need to generate operation output and retry aliases in codegen. -- ⚠ (client, [smithy-rs#1715](https://github.com/awslabs/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/awslabs/smithy-rs/issues/1717)) `ClassifyResponse` was renamed to `ClassifyRetry` and is no longer implemented for the unit type. -- ⚠ (client, [smithy-rs#1715](https://github.com/awslabs/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/awslabs/smithy-rs/issues/1717)) The `with_retry_policy` and `retry_policy` functions on `aws_smithy_http::operation::Operation` have been +- ⚠ (client, [smithy-rs#976](https://github.com/smithy-lang/smithy-rs/issues/976), [smithy-rs#1710](https://github.com/smithy-lang/smithy-rs/issues/1710)) Removed the need to generate operation output and retry aliases in codegen. +- ⚠ (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) `ClassifyResponse` was renamed to `ClassifyRetry` and is no longer implemented for the unit type. +- ⚠ (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) The `with_retry_policy` and `retry_policy` functions on `aws_smithy_http::operation::Operation` have been renamed to `with_retry_classifier` and `retry_classifier` respectively. Public member `retry_policy` on `aws_smithy_http::operation::Parts` has been renamed to `retry_classifier`. **New this release:** -- 🎉 (client, [smithy-rs#1647](https://github.com/awslabs/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/awslabs/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://awslabs.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html). +- 🎉 (client, [smithy-rs#1647](https://github.com/smithy-lang/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/smithy-lang/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://awslabs.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html). Before this change, modifying operations before sending them required using lower-level APIs: @@ -1119,22 +1119,22 @@ September 20th, 2022 .send() .await?; ``` -- (client, [smithy-rs#1735](https://github.com/awslabs/smithy-rs/issues/1735), @vojtechkral) Lower log level of two info-level log messages. -- (all, [smithy-rs#1710](https://github.com/awslabs/smithy-rs/issues/1710)) Added `writable` property to `RustType` and `RuntimeType` that returns them in `Writable` form -- (all, [smithy-rs#1680](https://github.com/awslabs/smithy-rs/issues/1680), @ogudavid) Smithy IDL v2 mixins are now supported -- 🐛 (client, [smithy-rs#1715](https://github.com/awslabs/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/awslabs/smithy-rs/issues/1717)) Generated clients now retry transient errors without replacing the retry policy. -- 🐛 (all, [smithy-rs#1725](https://github.com/awslabs/smithy-rs/issues/1725), @sugmanue) Correctly determine nullability of members in IDLv2 models +- (client, [smithy-rs#1735](https://github.com/smithy-lang/smithy-rs/issues/1735), @vojtechkral) Lower log level of two info-level log messages. +- (all, [smithy-rs#1710](https://github.com/smithy-lang/smithy-rs/issues/1710)) Added `writable` property to `RustType` and `RuntimeType` that returns them in `Writable` form +- (all, [smithy-rs#1680](https://github.com/smithy-lang/smithy-rs/issues/1680), @ogudavid) Smithy IDL v2 mixins are now supported +- 🐛 (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) Generated clients now retry transient errors without replacing the retry policy. +- 🐛 (all, [smithy-rs#1725](https://github.com/smithy-lang/smithy-rs/issues/1725), @sugmanue) Correctly determine nullability of members in IDLv2 models **Contributors** Thank you for your contributions! ❤ -- @ogudavid ([smithy-rs#1680](https://github.com/awslabs/smithy-rs/issues/1680)) -- @sugmanue ([smithy-rs#1725](https://github.com/awslabs/smithy-rs/issues/1725)) -- @vojtechkral ([smithy-rs#1735](https://github.com/awslabs/smithy-rs/issues/1735)) +- @ogudavid ([smithy-rs#1680](https://github.com/smithy-lang/smithy-rs/issues/1680)) +- @sugmanue ([smithy-rs#1725](https://github.com/smithy-lang/smithy-rs/issues/1725)) +- @vojtechkral ([smithy-rs#1735](https://github.com/smithy-lang/smithy-rs/issues/1735)) August 31st, 2022 ================= **Breaking Changes:** -- ⚠🎉 (client, [smithy-rs#1598](https://github.com/awslabs/smithy-rs/issues/1598)) Previously, the config customizations that added functionality related to retry configs, timeout configs, and the +- ⚠🎉 (client, [smithy-rs#1598](https://github.com/smithy-lang/smithy-rs/issues/1598)) Previously, the config customizations that added functionality related to retry configs, timeout configs, and the async sleep impl were defined in the smithy codegen module but were being loaded in the AWS codegen module. They have now been updated to be loaded during smithy codegen. The affected classes are all defined in the `software.amazon.smithy.rust.codegen.smithy.customizations` module of smithy codegen.` This change does not affect @@ -1150,7 +1150,7 @@ August 31st, 2022 - `PubUseRetryConfig` is now `PubUseRetryConfigGenerator` - `SleepImplProviderConfig` is now `SleepImplProviderCustomization` - `TimeoutConfigProviderConfig` is now `TimeoutConfigProviderCustomization` -- ⚠🎉 (all, [smithy-rs#1635](https://github.com/awslabs/smithy-rs/issues/1635), [smithy-rs#1416](https://github.com/awslabs/smithy-rs/issues/1416), @weihanglo) Support granular control of specifying runtime crate versions. +- ⚠🎉 (all, [smithy-rs#1635](https://github.com/smithy-lang/smithy-rs/issues/1635), [smithy-rs#1416](https://github.com/smithy-lang/smithy-rs/issues/1416), @weihanglo) Support granular control of specifying runtime crate versions. For code generation, the field `runtimeConfig.version` in smithy-build.json has been removed. The new field `runtimeConfig.versions` is an object whose keys are runtime crate names (e.g. `aws-smithy-http`), @@ -1187,12 +1187,12 @@ August 31st, 2022 ``` implies that we're using `aws-smithy-http` 0.47.1 specifically. For the rest of the crates, it will default to 0.47.0. -- ⚠ (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Remove @sensitive trait tests which applied trait to member. The ability to mark members with @sensitive was removed in Smithy 1.22. -- ⚠ (server, [smithy-rs#1544](https://github.com/awslabs/smithy-rs/issues/1544)) Servers now allow requests' ACCEPT header values to be: +- ⚠ (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Remove @sensitive trait tests which applied trait to member. The ability to mark members with @sensitive was removed in Smithy 1.22. +- ⚠ (server, [smithy-rs#1544](https://github.com/smithy-lang/smithy-rs/issues/1544)) Servers now allow requests' ACCEPT header values to be: - `*/*` - `type/*` - `type/subtype` -- 🐛⚠ (all, [smithy-rs#1274](https://github.com/awslabs/smithy-rs/issues/1274)) Lossy converters into integer types for `aws_smithy_types::Number` have been +- 🐛⚠ (all, [smithy-rs#1274](https://github.com/smithy-lang/smithy-rs/issues/1274)) Lossy converters into integer types for `aws_smithy_types::Number` have been removed. Lossy converters into floating point types for `aws_smithy_types::Number` have been suffixed with `_lossy`. If you were directly using the integer lossy converters, we recommend you use the safe @@ -1215,33 +1215,33 @@ August 31st, 2022 let bar: u32 = n as u32; // Lossy conversion! } ``` -- ⚠ (all, [smithy-rs#1699](https://github.com/awslabs/smithy-rs/issues/1699)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.58.1 to 1.61.0 per our policy. +- ⚠ (all, [smithy-rs#1699](https://github.com/smithy-lang/smithy-rs/issues/1699)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.58.1 to 1.61.0 per our policy. **New this release:** -- 🎉 (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Update Smithy dependency to 1.23.1. Models using version 2.0 of the IDL are now supported. -- 🎉 (server, [smithy-rs#1551](https://github.com/awslabs/smithy-rs/issues/1551), @hugobast) There is a canonical and easier way to run smithy-rs on Lambda [see example]. - - [see example]: https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/lambda.rs -- 🐛 (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Fix detecting sensitive members through their target shape having the @sensitive trait applied. -- (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Fix SetShape matching needing to occur before ListShape since it is now a subclass. Sets were deprecated in Smithy 1.22. -- (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Fix Union shape test data having an invalid empty union. Break fixed from Smithy 1.21 to Smithy 1.22. -- (all, [smithy-rs#1612](https://github.com/awslabs/smithy-rs/issues/1612), @unexge) Add codegen version to generated package metadata +- 🎉 (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Update Smithy dependency to 1.23.1. Models using version 2.0 of the IDL are now supported. +- 🎉 (server, [smithy-rs#1551](https://github.com/smithy-lang/smithy-rs/issues/1551), @hugobast) There is a canonical and easier way to run smithy-rs on Lambda [see example]. + + [see example]: https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/lambda.rs +- 🐛 (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix detecting sensitive members through their target shape having the @sensitive trait applied. +- (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix SetShape matching needing to occur before ListShape since it is now a subclass. Sets were deprecated in Smithy 1.22. +- (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix Union shape test data having an invalid empty union. Break fixed from Smithy 1.21 to Smithy 1.22. +- (all, [smithy-rs#1612](https://github.com/smithy-lang/smithy-rs/issues/1612), @unexge) Add codegen version to generated package metadata - (client, [aws-sdk-rust#609](https://github.com/awslabs/aws-sdk-rust/issues/609)) It is now possible to exempt specific operations from XML body root checking. To do this, add the `AllowInvalidXmlRoot` trait to the output struct of the operation you want to exempt. **Contributors** Thank you for your contributions! ❤ -- @hugobast ([smithy-rs#1551](https://github.com/awslabs/smithy-rs/issues/1551)) -- @ogudavid ([smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623)) -- @unexge ([smithy-rs#1612](https://github.com/awslabs/smithy-rs/issues/1612)) -- @weihanglo ([smithy-rs#1416](https://github.com/awslabs/smithy-rs/issues/1416), [smithy-rs#1635](https://github.com/awslabs/smithy-rs/issues/1635)) +- @hugobast ([smithy-rs#1551](https://github.com/smithy-lang/smithy-rs/issues/1551)) +- @ogudavid ([smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623)) +- @unexge ([smithy-rs#1612](https://github.com/smithy-lang/smithy-rs/issues/1612)) +- @weihanglo ([smithy-rs#1416](https://github.com/smithy-lang/smithy-rs/issues/1416), [smithy-rs#1635](https://github.com/smithy-lang/smithy-rs/issues/1635)) August 4th, 2022 ================ **Breaking Changes:** -- ⚠🎉 (all, [smithy-rs#1570](https://github.com/awslabs/smithy-rs/issues/1570), @weihanglo) Support @deprecated trait for aggregate shapes -- ⚠ (all, [smithy-rs#1157](https://github.com/awslabs/smithy-rs/issues/1157)) Rename EventStreamInput to EventStreamSender -- ⚠ (all, [smithy-rs#1157](https://github.com/awslabs/smithy-rs/issues/1157)) The type of streaming unions that contain errors is generated without those errors. +- ⚠🎉 (all, [smithy-rs#1570](https://github.com/smithy-lang/smithy-rs/issues/1570), @weihanglo) Support @deprecated trait for aggregate shapes +- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) Rename EventStreamInput to EventStreamSender +- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) The type of streaming unions that contain errors is generated without those errors. Errors in a streaming union `Union` are generated as members of the type `UnionError`. Taking Transcribe as an example, the `AudioStream` streaming union generates, in the client, both the `AudioStream` type: ```rust @@ -1268,7 +1268,7 @@ August 4th, 2022 Unknown, } ``` -- ⚠ (all, [smithy-rs#1157](https://github.com/awslabs/smithy-rs/issues/1157)) `aws_smithy_http::event_stream::EventStreamSender` and `aws_smithy_http::event_stream::Receiver` are now generic over ``, +- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) `aws_smithy_http::event_stream::EventStreamSender` and `aws_smithy_http::event_stream::Receiver` are now generic over ``, where `T` is a streaming union and `E` the union's errors. This means that event stream errors are now sent as `Err` of the union's error type. With this example model: @@ -1286,18 +1286,18 @@ August 4th, 2022 ```rust stream! { yield Err(EventError::ThrottlingError ...) } ``` - An example from the SDK is in [transcribe streaming](https://github.com/awslabs/smithy-rs/blob/4f51dd450ea3234a7faf481c6025597f22f03805/aws/sdk/integration-tests/transcribestreaming/tests/test.rs#L80). + An example from the SDK is in [transcribe streaming](https://github.com/smithy-lang/smithy-rs/blob/4f51dd450ea3234a7faf481c6025597f22f03805/aws/sdk/integration-tests/transcribestreaming/tests/test.rs#L80). **New this release:** -- 🎉 (all, [smithy-rs#1482](https://github.com/awslabs/smithy-rs/issues/1482)) Update codegen to generate support for flexible checksums. -- (all, [smithy-rs#1520](https://github.com/awslabs/smithy-rs/issues/1520)) Add explicit cast during JSON deserialization in case of custom Symbol providers. -- (all, [smithy-rs#1578](https://github.com/awslabs/smithy-rs/issues/1578), @lkts) Change detailed logs in CredentialsProviderChain from info to debug -- (all, [smithy-rs#1573](https://github.com/awslabs/smithy-rs/issues/1573), [smithy-rs#1569](https://github.com/awslabs/smithy-rs/issues/1569)) Non-streaming struct members are now marked `#[doc(hidden)]` since they will be removed in the future +- 🎉 (all, [smithy-rs#1482](https://github.com/smithy-lang/smithy-rs/issues/1482)) Update codegen to generate support for flexible checksums. +- (all, [smithy-rs#1520](https://github.com/smithy-lang/smithy-rs/issues/1520)) Add explicit cast during JSON deserialization in case of custom Symbol providers. +- (all, [smithy-rs#1578](https://github.com/smithy-lang/smithy-rs/issues/1578), @lkts) Change detailed logs in CredentialsProviderChain from info to debug +- (all, [smithy-rs#1573](https://github.com/smithy-lang/smithy-rs/issues/1573), [smithy-rs#1569](https://github.com/smithy-lang/smithy-rs/issues/1569)) Non-streaming struct members are now marked `#[doc(hidden)]` since they will be removed in the future **Contributors** Thank you for your contributions! ❤ -- @lkts ([smithy-rs#1578](https://github.com/awslabs/smithy-rs/issues/1578)) -- @weihanglo ([smithy-rs#1570](https://github.com/awslabs/smithy-rs/issues/1570)) +- @lkts ([smithy-rs#1578](https://github.com/smithy-lang/smithy-rs/issues/1578)) +- @weihanglo ([smithy-rs#1570](https://github.com/smithy-lang/smithy-rs/issues/1570)) July 20th, 2022 =============== @@ -1305,14 +1305,14 @@ July 20th, 2022 - 🎉 (all, [aws-sdk-rust#567](https://github.com/awslabs/aws-sdk-rust/issues/567)) Updated the smithy client's retry behavior to allow for a configurable initial backoff. Previously, the initial backoff (named `r` in the code) was set to 2 seconds. This is not an ideal default for services that expect clients to quickly retry failed request attempts. Now, users can set quicker (or slower) backoffs according to their needs. -- (all, [smithy-rs#1263](https://github.com/awslabs/smithy-rs/issues/1263)) Add checksum calculation and validation wrappers for HTTP bodies. -- (all, [smithy-rs#1263](https://github.com/awslabs/smithy-rs/issues/1263)) `aws_smithy_http::header::append_merge_header_maps`, a function for merging two `HeaderMap`s, is now public. +- (all, [smithy-rs#1263](https://github.com/smithy-lang/smithy-rs/issues/1263)) Add checksum calculation and validation wrappers for HTTP bodies. +- (all, [smithy-rs#1263](https://github.com/smithy-lang/smithy-rs/issues/1263)) `aws_smithy_http::header::append_merge_header_maps`, a function for merging two `HeaderMap`s, is now public. v0.45.0 (June 28th, 2022) ========================= **Breaking Changes:** -- ⚠ ([smithy-rs#932](https://github.com/awslabs/smithy-rs/issues/932)) Replaced use of `pin-project` with equivalent `pin-project-lite`. For pinned enum tuple variants and tuple structs, this +- ⚠ ([smithy-rs#932](https://github.com/smithy-lang/smithy-rs/issues/932)) Replaced use of `pin-project` with equivalent `pin-project-lite`. For pinned enum tuple variants and tuple structs, this change requires that we switch to using enum struct variants and regular structs. Most of the structs and enums that were updated had only private fields/variants and so have the same public API. However, this change does affect the public API of `aws_smithy_http_tower::map_request::MapRequestFuture`. The `Inner` and `Ready` variants contained a @@ -1320,19 +1320,19 @@ v0.45.0 (June 28th, 2022) instead of the `0` field. **New this release:** -- 🎉 ([smithy-rs#1411](https://github.com/awslabs/smithy-rs/issues/1411), [smithy-rs#1167](https://github.com/awslabs/smithy-rs/issues/1167)) Upgrade to Gradle 7. This change is not a breaking change, however, users of smithy-rs will need to switch to JDK 17 -- 🐛 ([smithy-rs#1505](https://github.com/awslabs/smithy-rs/issues/1505), @kiiadi) Fix issue with codegen on Windows where module names were incorrectly determined from filenames +- 🎉 ([smithy-rs#1411](https://github.com/smithy-lang/smithy-rs/issues/1411), [smithy-rs#1167](https://github.com/smithy-lang/smithy-rs/issues/1167)) Upgrade to Gradle 7. This change is not a breaking change, however, users of smithy-rs will need to switch to JDK 17 +- 🐛 ([smithy-rs#1505](https://github.com/smithy-lang/smithy-rs/issues/1505), @kiiadi) Fix issue with codegen on Windows where module names were incorrectly determined from filenames **Contributors** Thank you for your contributions! ❤ -- @kiiadi ([smithy-rs#1505](https://github.com/awslabs/smithy-rs/issues/1505)) +- @kiiadi ([smithy-rs#1505](https://github.com/smithy-lang/smithy-rs/issues/1505)) v0.44.0 (June 22nd, 2022) ========================= **New this release:** -- ([smithy-rs#1460](https://github.com/awslabs/smithy-rs/issues/1460)) Fix a potential bug with `ByteStream`'s implementation of `futures_core::stream::Stream` and add helpful error messages +- ([smithy-rs#1460](https://github.com/smithy-lang/smithy-rs/issues/1460)) Fix a potential bug with `ByteStream`'s implementation of `futures_core::stream::Stream` and add helpful error messages for users on 32-bit systems that try to stream HTTP bodies larger than 4.29Gb. -- 🐛 ([smithy-rs#1427](https://github.com/awslabs/smithy-rs/issues/1427), [smithy-rs#1465](https://github.com/awslabs/smithy-rs/issues/1465), [smithy-rs#1459](https://github.com/awslabs/smithy-rs/issues/1459)) Fix RustWriter bugs for `rustTemplate` and `docs` utility methods +- 🐛 ([smithy-rs#1427](https://github.com/smithy-lang/smithy-rs/issues/1427), [smithy-rs#1465](https://github.com/smithy-lang/smithy-rs/issues/1465), [smithy-rs#1459](https://github.com/smithy-lang/smithy-rs/issues/1459)) Fix RustWriter bugs for `rustTemplate` and `docs` utility methods - 🐛 ([aws-sdk-rust#554](https://github.com/awslabs/aws-sdk-rust/issues/554)) Requests to Route53 that return `ResourceId`s often come with a prefix. When passing those IDs directly into another request, the request would fail unless they manually stripped the prefix. Now, when making a request with a prefixed ID, the prefix will be stripped automatically. @@ -1341,15 +1341,15 @@ v0.44.0 (June 22nd, 2022) v0.43.0 (June 9th, 2022) ======================== **New this release:** -- 🎉 ([smithy-rs#1381](https://github.com/awslabs/smithy-rs/issues/1381), @alonlud) Add ability to sign a request with all headers, or to change which headers are excluded from signing -- 🎉 ([smithy-rs#1390](https://github.com/awslabs/smithy-rs/issues/1390)) Add method `ByteStream::into_async_read`. This makes it easy to convert `ByteStream`s into a struct implementing `tokio:io::AsyncRead`. Available on **crate feature** `rt-tokio` only. -- ([smithy-rs#1404](https://github.com/awslabs/smithy-rs/issues/1404), @petrosagg) Add ability to specify a different rust crate name than the one derived from the package name -- ([smithy-rs#1404](https://github.com/awslabs/smithy-rs/issues/1404), @petrosagg) Switch to [RustCrypto](https://github.com/RustCrypto)'s implementation of MD5. +- 🎉 ([smithy-rs#1381](https://github.com/smithy-lang/smithy-rs/issues/1381), @alonlud) Add ability to sign a request with all headers, or to change which headers are excluded from signing +- 🎉 ([smithy-rs#1390](https://github.com/smithy-lang/smithy-rs/issues/1390)) Add method `ByteStream::into_async_read`. This makes it easy to convert `ByteStream`s into a struct implementing `tokio:io::AsyncRead`. Available on **crate feature** `rt-tokio` only. +- ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404), @petrosagg) Add ability to specify a different rust crate name than the one derived from the package name +- ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404), @petrosagg) Switch to [RustCrypto](https://github.com/RustCrypto)'s implementation of MD5. **Contributors** Thank you for your contributions! ❤ -- @alonlud ([smithy-rs#1381](https://github.com/awslabs/smithy-rs/issues/1381)) -- @petrosagg ([smithy-rs#1404](https://github.com/awslabs/smithy-rs/issues/1404)) +- @alonlud ([smithy-rs#1381](https://github.com/smithy-lang/smithy-rs/issues/1381)) +- @petrosagg ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404)) v0.42.0 (May 13th, 2022) ======================== @@ -1396,21 +1396,21 @@ v0.42.0 (May 13th, 2022) ``` **New this release:** -- ([smithy-rs#1352](https://github.com/awslabs/smithy-rs/issues/1352)) Log a debug event when a retry is going to be peformed -- ([smithy-rs#1332](https://github.com/awslabs/smithy-rs/issues/1332), @82marbag) Update generated crates to Rust 2021 +- ([smithy-rs#1352](https://github.com/smithy-lang/smithy-rs/issues/1352)) Log a debug event when a retry is going to be peformed +- ([smithy-rs#1332](https://github.com/smithy-lang/smithy-rs/issues/1332), @82marbag) Update generated crates to Rust 2021 **Contributors** Thank you for your contributions! ❤ -- @82marbag ([smithy-rs#1332](https://github.com/awslabs/smithy-rs/issues/1332)) +- @82marbag ([smithy-rs#1332](https://github.com/smithy-lang/smithy-rs/issues/1332)) 0.41.0 (April 28th, 2022) ========================= **Breaking Changes:** -- ⚠ ([smithy-rs#1318](https://github.com/awslabs/smithy-rs/issues/1318)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.56.1 to 1.58.1 per our "two versions behind" policy. +- ⚠ ([smithy-rs#1318](https://github.com/smithy-lang/smithy-rs/issues/1318)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.56.1 to 1.58.1 per our "two versions behind" policy. **New this release:** -- ([smithy-rs#1307](https://github.com/awslabs/smithy-rs/issues/1307)) Add new trait for HTTP body callbacks. This is the first step to enabling us to implement optional checksum verification of requests and responses. -- ([smithy-rs#1330](https://github.com/awslabs/smithy-rs/issues/1330)) Upgrade to Smithy 1.21.0 +- ([smithy-rs#1307](https://github.com/smithy-lang/smithy-rs/issues/1307)) Add new trait for HTTP body callbacks. This is the first step to enabling us to implement optional checksum verification of requests and responses. +- ([smithy-rs#1330](https://github.com/smithy-lang/smithy-rs/issues/1330)) Upgrade to Smithy 1.21.0 0.40.2 (April 14th, 2022) @@ -1420,13 +1420,13 @@ Thank you for your contributions! ❤ - ⚠ ([aws-sdk-rust#490](https://github.com/awslabs/aws-sdk-rust/issues/490)) Update all runtime crates to [edition 2021](https://blog.rust-lang.org/2021/10/21/Rust-1.56.0.html) **New this release:** -- ([smithy-rs#1262](https://github.com/awslabs/smithy-rs/issues/1262), @liubin) Fix link to Developer Guide in crate's README.md -- ([smithy-rs#1301](https://github.com/awslabs/smithy-rs/issues/1301), @benesch) Update urlencoding crate to v2.1.0 +- ([smithy-rs#1262](https://github.com/smithy-lang/smithy-rs/issues/1262), @liubin) Fix link to Developer Guide in crate's README.md +- ([smithy-rs#1301](https://github.com/smithy-lang/smithy-rs/issues/1301), @benesch) Update urlencoding crate to v2.1.0 **Contributors** Thank you for your contributions! ❤ -- @benesch ([smithy-rs#1301](https://github.com/awslabs/smithy-rs/issues/1301)) -- @liubin ([smithy-rs#1262](https://github.com/awslabs/smithy-rs/issues/1262)) +- @benesch ([smithy-rs#1301](https://github.com/smithy-lang/smithy-rs/issues/1301)) +- @liubin ([smithy-rs#1262](https://github.com/smithy-lang/smithy-rs/issues/1262)) 0.39.0 (March 17, 2022) ======================= @@ -1459,7 +1459,7 @@ Thank you for your contributions! ❤ .await; } ``` -- ⚠ ([smithy-rs#724](https://github.com/awslabs/smithy-rs/issues/724)) Timeout configuration has been refactored a bit. If you were setting timeouts through environment variables or an AWS +- ⚠ ([smithy-rs#724](https://github.com/smithy-lang/smithy-rs/issues/724)) Timeout configuration has been refactored a bit. If you were setting timeouts through environment variables or an AWS profile, then you shouldn't need to change anything. Take note, however, that we don't currently support HTTP connect, read, write, or TLS negotiation timeouts. If you try to set any of those timeouts in your profile or environment, we'll log a warning explaining that those timeouts don't currently do anything. @@ -1474,25 +1474,25 @@ Thank you for your contributions! ❤ functional in a future update. **New this release:** -- ([smithy-rs#1225](https://github.com/awslabs/smithy-rs/issues/1225)) `DynMiddleware` is now `clone`able -- ([smithy-rs#1257](https://github.com/awslabs/smithy-rs/issues/1257)) HTTP request property bag now contains list of desired HTTP versions to use when making requests. This list is not currently used but will be in an upcoming update. +- ([smithy-rs#1225](https://github.com/smithy-lang/smithy-rs/issues/1225)) `DynMiddleware` is now `clone`able +- ([smithy-rs#1257](https://github.com/smithy-lang/smithy-rs/issues/1257)) HTTP request property bag now contains list of desired HTTP versions to use when making requests. This list is not currently used but will be in an upcoming update. 0.38.0 (Februrary 24, 2022) =========================== **Breaking Changes:** -- ⚠ ([smithy-rs#1197](https://github.com/awslabs/smithy-rs/issues/1197)) `aws_smithy_types::retry::RetryKind` had its `NotRetryable` variant split into `UnretryableFailure` and `Unnecessary`. If you implement the `ClassifyResponse`, then successful responses need to return `Unnecessary`, and failures that shouldn't be retried need to return `UnretryableFailure`. -- ⚠ ([smithy-rs#1209](https://github.com/awslabs/smithy-rs/issues/1209)) `aws_smithy_types::primitive::Encoder` is now a struct rather than an enum, but its usage remains the same. -- ⚠ ([smithy-rs#1217](https://github.com/awslabs/smithy-rs/issues/1217)) `ClientBuilder` helpers `rustls()` and `native_tls()` now return `DynConnector` and use dynamic dispatch rather than returning their concrete connector type that would allow static dispatch. If static dispatch is desired, then manually construct a connector to give to the builder. For example, for rustls: `builder.connector(Adapter::builder().build(aws_smithy_client::conns::https()))` (where `Adapter` is in `aws_smithy_client::hyper_ext`). +- ⚠ ([smithy-rs#1197](https://github.com/smithy-lang/smithy-rs/issues/1197)) `aws_smithy_types::retry::RetryKind` had its `NotRetryable` variant split into `UnretryableFailure` and `Unnecessary`. If you implement the `ClassifyResponse`, then successful responses need to return `Unnecessary`, and failures that shouldn't be retried need to return `UnretryableFailure`. +- ⚠ ([smithy-rs#1209](https://github.com/smithy-lang/smithy-rs/issues/1209)) `aws_smithy_types::primitive::Encoder` is now a struct rather than an enum, but its usage remains the same. +- ⚠ ([smithy-rs#1217](https://github.com/smithy-lang/smithy-rs/issues/1217)) `ClientBuilder` helpers `rustls()` and `native_tls()` now return `DynConnector` and use dynamic dispatch rather than returning their concrete connector type that would allow static dispatch. If static dispatch is desired, then manually construct a connector to give to the builder. For example, for rustls: `builder.connector(Adapter::builder().build(aws_smithy_client::conns::https()))` (where `Adapter` is in `aws_smithy_client::hyper_ext`). **New this release:** -- 🐛 ([smithy-rs#1197](https://github.com/awslabs/smithy-rs/issues/1197)) Fixed a bug that caused clients to eventually stop retrying. The cross-request retry allowance wasn't being reimbursed upon receiving a successful response, so once this allowance reached zero, no further retries would ever be attempted. +- 🐛 ([smithy-rs#1197](https://github.com/smithy-lang/smithy-rs/issues/1197)) Fixed a bug that caused clients to eventually stop retrying. The cross-request retry allowance wasn't being reimbursed upon receiving a successful response, so once this allowance reached zero, no further retries would ever be attempted. 0.37.0 (February 18th, 2022) ============================ **Breaking Changes:** -- ⚠ ([smithy-rs#1144](https://github.com/awslabs/smithy-rs/issues/1144)) Some APIs required that timeout configuration be specified with an `aws_smithy_client::timeout::Settings` struct while +- ⚠ ([smithy-rs#1144](https://github.com/smithy-lang/smithy-rs/issues/1144)) Some APIs required that timeout configuration be specified with an `aws_smithy_client::timeout::Settings` struct while others required an `aws_smithy_types::timeout::TimeoutConfig` struct. Both were equivalent. Now `aws_smithy_types::timeout::TimeoutConfig` is used everywhere and `aws_smithy_client::timeout::Settings` has been removed. Here's how to migrate code your code that depended on `timeout::Settings`: @@ -1511,34 +1511,34 @@ Thank you for your contributions! ❤ .with_connect_timeout(Some(Duration::from_secs(1))) .with_read_timeout(Some(Duration::from_secs(2))); ``` -- ⚠ ([smithy-rs#1085](https://github.com/awslabs/smithy-rs/issues/1085)) Moved the following re-exports into a `types` module for all services: +- ⚠ ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) Moved the following re-exports into a `types` module for all services: - `::AggregatedBytes` -> `::types::AggregatedBytes` - `::Blob` -> `::types::Blob` - `::ByteStream` -> `::types::ByteStream` - `::DateTime` -> `::types::DateTime` - `::SdkError` -> `::types::SdkError` -- ⚠ ([smithy-rs#1085](https://github.com/awslabs/smithy-rs/issues/1085)) `AggregatedBytes` and `ByteStream` are now only re-exported if the service has streaming operations, +- ⚠ ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) `AggregatedBytes` and `ByteStream` are now only re-exported if the service has streaming operations, and `Blob`/`DateTime` are only re-exported if the service uses them. -- ⚠ ([smithy-rs#1130](https://github.com/awslabs/smithy-rs/issues/1130)) MSRV increased from `1.54` to `1.56.1` per our 2-behind MSRV policy. +- ⚠ ([smithy-rs#1130](https://github.com/smithy-lang/smithy-rs/issues/1130)) MSRV increased from `1.54` to `1.56.1` per our 2-behind MSRV policy. **New this release:** -- ([smithy-rs#1144](https://github.com/awslabs/smithy-rs/issues/1144)) `MakeConnectorFn`, `HttpConnector`, and `HttpSettings` have been moved from `aws_config::provider_config` to +- ([smithy-rs#1144](https://github.com/smithy-lang/smithy-rs/issues/1144)) `MakeConnectorFn`, `HttpConnector`, and `HttpSettings` have been moved from `aws_config::provider_config` to `aws_smithy_client::http_connector`. This is in preparation for a later update that will change how connectors are created and configured. -- ([smithy-rs#1123](https://github.com/awslabs/smithy-rs/issues/1123)) Refactor `Document` shape parser generation -- ([smithy-rs#1085](https://github.com/awslabs/smithy-rs/issues/1085)) The `Client` and `Config` re-exports now have their documentation inlined in the service docs +- ([smithy-rs#1123](https://github.com/smithy-lang/smithy-rs/issues/1123)) Refactor `Document` shape parser generation +- ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) The `Client` and `Config` re-exports now have their documentation inlined in the service docs 0.36.0 (January 26, 2022) ========================= **New this release:** -- ([smithy-rs#1087](https://github.com/awslabs/smithy-rs/issues/1087)) Improve docs on `Endpoint::{mutable, immutable}` -- ([smithy-rs#1118](https://github.com/awslabs/smithy-rs/issues/1118)) SDK examples now come from [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples) rather than from `smithy-rs` -- ([smithy-rs#1114](https://github.com/awslabs/smithy-rs/issues/1114), @mchoicpe-amazon) Provide SigningService creation via owned String +- ([smithy-rs#1087](https://github.com/smithy-lang/smithy-rs/issues/1087)) Improve docs on `Endpoint::{mutable, immutable}` +- ([smithy-rs#1118](https://github.com/smithy-lang/smithy-rs/issues/1118)) SDK examples now come from [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples) rather than from `smithy-rs` +- ([smithy-rs#1114](https://github.com/smithy-lang/smithy-rs/issues/1114), @mchoicpe-amazon) Provide SigningService creation via owned String **Contributors** Thank you for your contributions! ❤ -- @mchoicpe-amazon ([smithy-rs#1114](https://github.com/awslabs/smithy-rs/issues/1114)) +- @mchoicpe-amazon ([smithy-rs#1114](https://github.com/smithy-lang/smithy-rs/issues/1114)) 0.35.2 (January 20th, 2022) @@ -1553,11 +1553,11 @@ _Changes only impact generated AWS SDK_ 0.35.0 (January 19, 2022) ========================= **New this release:** -- ([smithy-rs#1053](https://github.com/awslabs/smithy-rs/issues/1053)) Upgraded Smithy to 1.16.1 -- 🐛 ([smithy-rs#1069](https://github.com/awslabs/smithy-rs/issues/1069)) Fix broken link to `RetryMode` in client docs -- 🐛 ([smithy-rs#1069](https://github.com/awslabs/smithy-rs/issues/1069)) Fix several doc links to raw identifiers (identifiers excaped with `r#`) -- 🐛 ([smithy-rs#1069](https://github.com/awslabs/smithy-rs/issues/1069)) Reduce dependency recompilation in local dev -- 🐛 ([aws-sdk-rust#405](https://github.com/awslabs/aws-sdk-rust/issues/405), [smithy-rs#1083](https://github.com/awslabs/smithy-rs/issues/1083)) Fixed paginator bug impacting EC2 describe VPCs (and others) +- ([smithy-rs#1053](https://github.com/smithy-lang/smithy-rs/issues/1053)) Upgraded Smithy to 1.16.1 +- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Fix broken link to `RetryMode` in client docs +- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Fix several doc links to raw identifiers (identifiers excaped with `r#`) +- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Reduce dependency recompilation in local dev +- 🐛 ([aws-sdk-rust#405](https://github.com/awslabs/aws-sdk-rust/issues/405), [smithy-rs#1083](https://github.com/smithy-lang/smithy-rs/issues/1083)) Fixed paginator bug impacting EC2 describe VPCs (and others) @@ -2081,7 +2081,7 @@ v0.19 (August 3rd, 2021) IoT Data Plane is now available! If you discover it isn't functioning as expected, please let us know! This week also sees the addition of a robust async caching credentials provider. Take a look at the -[STS example](https://github.com/awslabs/smithy-rs/blob/7fa4af4a9367aeca6d55e26fc4d4ba93093b90c4/aws/sdk/examples/sts/src/bin/credentials-provider.rs) +[STS example](https://github.com/smithy-lang/smithy-rs/blob/7fa4af4a9367aeca6d55e26fc4d4ba93093b90c4/aws/sdk/examples/sts/src/bin/credentials-provider.rs) to see how to use it. **New This Week** diff --git a/CODEOWNERS b/CODEOWNERS index b830b172158..fb8968d43bc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,40 +1,40 @@ -* @awslabs/rust-sdk-owners +* @smithy-lang/aws-sdk-rust # Server -/codegen-server-test/ @awslabs/smithy-rs-server -/codegen-server/ @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http-server/ @awslabs/smithy-rs-server +/codegen-server-test/ @smithy-lang/smithy-rs-server +/codegen-server/ @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http-server/ @smithy-lang/smithy-rs-server # Python Server -/codegen-server-test/python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server -/codegen-server/python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http-server-python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server +/codegen-server-test/python/ @smithy-lang/smithy-rs-server +/codegen-server/python/ @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http-server-python/ @smithy-lang/smithy-rs-server # Typescript Server -/codegen-server-test/typescript/ @awslabs/smithy-rs-typescript-server @awslabs/smithy-rs-server -/codegen-server/typescript/ @awslabs/smithy-rs-typescript-server @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http-server-typescript/ @awslabs/smithy-rs-typescript-server @awslabs/smithy-rs-server +/codegen-server-test/typescript/ @smithy-lang/smithy-rs-server +/codegen-server/typescript/ @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http-server-typescript/ @smithy-lang/smithy-rs-server # Shared ownership -/.github/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/CHANGELOG.md @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/CHANGELOG.next.toml @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/README.md @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/build.gradle.kts @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/buildSrc/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/codegen-core/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/design/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/examples/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/gradle.properties @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/tools/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-async/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-eventstream/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-json/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-protocol-test/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-types/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-types-convert/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-xml/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/inlineable/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/build.gradle.kts @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/Cargo.toml @awslabs/rust-sdk-owners @awslabs/smithy-rs-server +/.github/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/CHANGELOG.md @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/CHANGELOG.next.toml @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/README.md @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/build.gradle.kts @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/buildSrc/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/codegen-core/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/design/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/examples/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/gradle.properties @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/tools/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-async/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-eventstream/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-json/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-protocol-test/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-types/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-types-convert/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-xml/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/inlineable/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/build.gradle.kts @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/Cargo.toml @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server diff --git a/README.md b/README.md index 3fabab8897d..4c0937cc9de 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Smithy Rust [![CI on Branch `main`](https://github.com/awslabs/smithy-rs/actions/workflows/ci-main.yml/badge.svg)](https://github.com/awslabs/smithy-rs/actions/workflows/ci-main.yml) +Smithy Rust [![CI on Branch `main`](https://github.com/smithy-lang/smithy-rs/actions/workflows/ci-main.yml/badge.svg)](https://github.com/smithy-lang/smithy-rs/actions/workflows/ci-main.yml) ================================================================================== Smithy code generators for Rust that generate clients, servers, and the entire AWS SDK. diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index dafa5764858..28b5124b11f 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -412,7 +412,7 @@ "age": 2 }, { - "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details.", + "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details.", "meta": { "bug": false, "breaking": true, @@ -454,7 +454,7 @@ "age": 2 }, { - "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929).", + "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929).", "meta": { "bug": false, "breaking": true, @@ -686,7 +686,7 @@ "age": 2 }, { - "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050).\n", + "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050).\n", "meta": { "bug": false, "breaking": true, @@ -800,4 +800,4 @@ } ], "aws-sdk-model": [] -} \ No newline at end of file +} diff --git a/aws/SDK_README.md.hb b/aws/SDK_README.md.hb index 18f6ef8c1fa..f82049c9c42 100644 --- a/aws/SDK_README.md.hb +++ b/aws/SDK_README.md.hb @@ -8,7 +8,7 @@ Available template arguments: --}} @@ -18,7 +18,7 @@ This repo contains the new AWS SDK for Rust (the SDK) and its [public roadmap](h **Please Note**: The SDK is currently released as a developer preview, without support or assistance for use on production workloads. Any use in production is at your own risk. -The SDK is code generated from [Smithy models](https://awslabs.github.io/smithy/) that represent each AWS service. The code used to generate the SDK can be found in [smithy-rs](https://github.com/awslabs/smithy-rs). +The SDK is code generated from [Smithy models](https://awslabs.github.io/smithy/) that represent each AWS service. The code used to generate the SDK can be found in [smithy-rs](https://github.com/smithy-lang/smithy-rs). ## Getting Started with the SDK @@ -94,8 +94,8 @@ The SDK currently requires a minimum of Rust {{msrv}}, and is not guaranteed to ## Additional Resources -- Design docs - Design documentation for the SDK lives in the [design folder of smithy-rs](https://github.com/awslabs/smithy-rs/tree/main/design). -- Runtime / Handwritten code: The Rust Runtime code that underpins the SDK can be accessed [here](https://github.com/awslabs/smithy-rs/tree/main/rust-runtime) and [here](https://github.com/awslabs/smithy-rs/tree/main/aws/rust-runtime). This code is copied into this repo as part of code generation. +- Design docs - Design documentation for the SDK lives in the [design folder of smithy-rs](https://github.com/smithy-lang/smithy-rs/tree/main/design). +- Runtime / Handwritten code: The Rust Runtime code that underpins the SDK can be accessed [here](https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime) and [here](https://github.com/smithy-lang/smithy-rs/tree/main/aws/rust-runtime). This code is copied into this repo as part of code generation. - [Code Examples](./examples) - [API reference documentation (rustdoc)](https://awslabs.github.io/aws-sdk-rust/) diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index db31f6b4454..7fd53ee0d3b 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -6,7 +6,7 @@ description = "AWS SDK config and credential provider implementations." edition = "2021" exclude = ["test-data/*", "integration-tests/*"] license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] client-hyper = ["aws-smithy-runtime/connector-hyper-0-14-x"] diff --git a/aws/rust-runtime/aws-config/README.md b/aws/rust-runtime/aws-config/README.md index 91f68420f02..7f523063d66 100644 --- a/aws/rust-runtime/aws-config/README.md +++ b/aws/rust-runtime/aws-config/README.md @@ -68,5 +68,5 @@ This project is licensed under the Apache-2.0 License. [Usage examples]: https://github.com/awslabs/aws-sdk-rust/tree/main/examples -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index 69273215edb..f3f0f823109 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -35,7 +35,7 @@ allowed_external_types = [ "http::uri::Uri", "tower_service::Service", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if the following should be exposed + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Decide if the following should be exposed "hyper::client::connect::Connection", "tokio::io::async_read::AsyncRead", "tokio::io::async_write::AsyncWrite", diff --git a/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs b/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs index 1a173682c3d..064b80e2ebc 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs @@ -33,7 +33,7 @@ impl Builder { /// Resolve default timeout configuration pub async fn timeout_config(self) -> TimeoutConfig { - // TODO(https://github.com/awslabs/smithy-rs/issues/1732): Implement complete timeout defaults specification + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1732): Implement complete timeout defaults specification TimeoutConfig::builder() .connect_timeout(SDK_DEFAULT_CONNECT_TIMEOUT) .build() diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 59e3a06a142..0ae39ed3b63 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -298,7 +298,7 @@ mod loader { /// Deprecated. Don't use. #[deprecated( - note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." )] pub fn http_connector(self, http_client: impl HttpClient + 'static) -> Self { self.http_client(http_client) diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index dd13270bbce..73999c6bf32 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -348,7 +348,7 @@ impl ProviderConfig { /// Deprecated. Don't use. #[deprecated( - note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." )] pub fn with_tcp_connector(self, http_client: impl HttpClient + 'static) -> Self { self.with_http_client(http_client) diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index ec4ebea5559..33c1b2a91e2 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Types for AWS SDK credentials." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] hardcoded-credentials = [] diff --git a/aws/rust-runtime/aws-credential-types/README.md b/aws/rust-runtime/aws-credential-types/README.md index e77385e1a01..d6480cc0c0a 100644 --- a/aws/rust-runtime/aws-credential-types/README.md +++ b/aws/rust-runtime/aws-credential-types/README.md @@ -6,5 +6,5 @@ This crate provides types concerned with AWS SDK credentials including: * Concrete implementations of credentials caching -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-endpoint/Cargo.toml b/aws/rust-runtime/aws-endpoint/Cargo.toml index 75d1f7a1c1e..9c2cc01257d 100644 --- a/aws/rust-runtime/aws-endpoint/Cargo.toml +++ b/aws/rust-runtime/aws-endpoint/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-http/Cargo.toml b/aws/rust-runtime/aws-http/Cargo.toml index 86f37c72f01..d22e473a7c4 100644 --- a/aws/rust-runtime/aws-http/Cargo.toml +++ b/aws/rust-runtime/aws-http/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-hyper/Cargo.toml b/aws/rust-runtime/aws-hyper/Cargo.toml index e7eb87f3ded..3e52efb0c33 100644 --- a/aws/rust-runtime/aws-hyper/Cargo.toml +++ b/aws/rust-runtime/aws-hyper/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index c79039da4a9..bb684af7616 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -9,7 +9,7 @@ are to allow this crate to be compilable and testable in isolation, no client co edition = "2021" license = "Apache-2.0" publish = false -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] aws-credential-types = { path = "../aws-credential-types" } diff --git a/aws/rust-runtime/aws-inlineable/README.md b/aws/rust-runtime/aws-inlineable/README.md index b14c2d9bfd7..14bc80dbbdb 100644 --- a/aws/rust-runtime/aws-inlineable/README.md +++ b/aws/rust-runtime/aws-inlineable/README.md @@ -5,5 +5,5 @@ SDKs. This exists to facilitate writing complex snippets of code that can be tes without needing to create and publish an entire additional crate. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index cae1dd0ae5c..f0a49daa273 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -// TODO(https://github.com/awslabs/smithy-rs/issues/2902): Code generate this documentation so that service-specific examples can be added. +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2902): Code generate this documentation so that service-specific examples can be added. //! Presigned request types and configuration. //! //! The [`Client`](crate::Client) is used to create presigned requests. They are made diff --git a/aws/rust-runtime/aws-runtime-api/Cargo.toml b/aws/rust-runtime/aws-runtime-api/Cargo.toml index 4c353537f54..920384f5548 100644 --- a/aws/rust-runtime/aws-runtime-api/Cargo.toml +++ b/aws/rust-runtime/aws-runtime-api/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Runtime support code for the AWS SDK. This isn't intended to be used directly." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] diff --git a/aws/rust-runtime/aws-runtime-api/README.md b/aws/rust-runtime/aws-runtime-api/README.md index 3eb3bd41939..7de9a62bd4f 100644 --- a/aws/rust-runtime/aws-runtime-api/README.md +++ b/aws/rust-runtime/aws-runtime-api/README.md @@ -4,5 +4,5 @@ aws-runtime-api Runtime support code for the AWS SDK. This crate isn't intended to be used directly. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index 5542d05f1a9..b28a0638817 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Runtime support code for the AWS SDK. This crate isn't intended to be used directly." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] event-stream = ["dep:aws-smithy-eventstream", "aws-sigv4/sign-eventstream"] diff --git a/aws/rust-runtime/aws-runtime/README.md b/aws/rust-runtime/aws-runtime/README.md index 65b01de9e25..f1ddb369ad6 100644 --- a/aws/rust-runtime/aws-runtime/README.md +++ b/aws/rust-runtime/aws-runtime/README.md @@ -4,5 +4,5 @@ aws-runtime Runtime support code for the AWS SDK. This crate isn't intended to be used directly. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-sig-auth/Cargo.toml b/aws/rust-runtime/aws-sig-auth/Cargo.toml index 6d796a290b1..56909a48113 100644 --- a/aws/rust-runtime/aws-sig-auth/Cargo.toml +++ b/aws/rust-runtime/aws-sig-auth/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-sig-auth/external-types.toml b/aws/rust-runtime/aws-sig-auth/external-types.toml index 8e4d29dcff1..d6bdad471f1 100644 --- a/aws/rust-runtime/aws-sig-auth/external-types.toml +++ b/aws/rust-runtime/aws-sig-auth/external-types.toml @@ -8,6 +8,6 @@ allowed_external_types = [ "http::request::Request", "aws_smithy_runtime_api::client::identity::Identity", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::frame::SignMessage", ] diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index 07766f202a1..ce91ae52090 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -6,7 +6,7 @@ description = "SigV4 signer for HTTP requests and Event Stream messages." edition = "2021" exclude = ["aws-sig-v4-test-suite/*"] license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] default = ["sign-http"] diff --git a/aws/rust-runtime/aws-sigv4/README.md b/aws/rust-runtime/aws-sigv4/README.md index 5159a9f01a7..497144afcf6 100644 --- a/aws/rust-runtime/aws-sigv4/README.md +++ b/aws/rust-runtime/aws-sigv4/README.md @@ -3,5 +3,5 @@ Low-level SigV4 request signing implementations. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-sigv4/external-types.toml b/aws/rust-runtime/aws-sigv4/external-types.toml index 37e06db2360..6c80133e45d 100644 --- a/aws/rust-runtime/aws-sigv4/external-types.toml +++ b/aws/rust-runtime/aws-sigv4/external-types.toml @@ -1,7 +1,7 @@ allowed_external_types = [ # TODO(refactorHttp): Remove this and remove the signing helpers "http::request::Request", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_types::event_stream::Message", "aws_smithy_runtime_api::client::identity::Identity" ] diff --git a/aws/rust-runtime/aws-sigv4/src/date_time.rs b/aws/rust-runtime/aws-sigv4/src/date_time.rs index 5ddd7056076..f27a265e0e8 100644 --- a/aws/rust-runtime/aws-sigv4/src/date_time.rs +++ b/aws/rust-runtime/aws-sigv4/src/date_time.rs @@ -95,7 +95,7 @@ mod tests { use crate::date_time::test_parsers::{parse_date, parse_date_time}; use time::format_description::well_known::Rfc3339; - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn date_format() { @@ -109,7 +109,7 @@ mod tests { assert_eq!("01000102", format_date(time)); } - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn date_time_format() { @@ -135,7 +135,7 @@ mod tests { assert_eq!("20150830", format_date(time)); } - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn test_truncate_subsecs() { diff --git a/aws/rust-runtime/aws-types/Cargo.toml b/aws/rust-runtime/aws-types/Cargo.toml index b4002ca5e0f..1259261cac8 100644 --- a/aws/rust-runtime/aws-types/Cargo.toml +++ b/aws/rust-runtime/aws-types/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt index e5d105d4a73..6c05747183b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt @@ -105,7 +105,7 @@ private fun HttpChecksumTrait.checksumAlgorithmToStr( } // This generator was implemented based on this spec: -// https://awslabs.github.io/smithy/1.0/spec/aws/aws-core.html#http-request-checksums +// https://smithy-lang.github.io/smithy/1.0/spec/aws/aws-core.html#http-request-checksums class HttpRequestChecksumCustomization( private val codegenContext: ClientCodegenContext, private val operationShape: OperationShape, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index 7408f5b76cc..b11236dfd14 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -109,7 +109,7 @@ fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Bool * ``` * * Eventually, we need to pull this test into generic smithy. However, this relies on generic smithy clients - * supporting middleware and being instantiable from config (https://github.com/awslabs/smithy-rs/issues/2194) + * supporting middleware and being instantiable from config (https://github.com/smithy-lang/smithy-rs/issues/2194) * * Doing this in AWS codegen allows us to actually integration test generated clients. */ diff --git a/aws/sdk/aws-models/s3-tests.smithy b/aws/sdk/aws-models/s3-tests.smithy index 437e37491a7..5a1bfaccca7 100644 --- a/aws/sdk/aws-models/s3-tests.smithy +++ b/aws/sdk/aws-models/s3-tests.smithy @@ -8,7 +8,7 @@ use smithy.test#httpRequestTests apply NotFound @httpResponseTests([ { id: "HeadObjectEmptyBody", - documentation: "This test case validates https://github.com/awslabs/smithy-rs/issues/456", + documentation: "This test case validates https://github.com/smithy-lang/smithy-rs/issues/456", params: { }, bodyMediaType: "application/xml", diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml index 5ac77a1f814..eeee431cec4 100644 --- a/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti ", "Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/ec2/Cargo.toml b/aws/sdk/integration-tests/ec2/Cargo.toml index a3a44d610c1..ff011454b16 100644 --- a/aws/sdk/integration-tests/ec2/Cargo.toml +++ b/aws/sdk/integration-tests/ec2/Cargo.toml @@ -3,7 +3,7 @@ name = "ec2-tests" version = "0.1.0" edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [dev-dependencies] diff --git a/aws/sdk/integration-tests/glacier/Cargo.toml b/aws/sdk/integration-tests/glacier/Cargo.toml index ca08a6e3498..a94977fc771 100644 --- a/aws/sdk/integration-tests/glacier/Cargo.toml +++ b/aws/sdk/integration-tests/glacier/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/iam/Cargo.toml b/aws/sdk/integration-tests/iam/Cargo.toml index 296e9167d16..4c834ced572 100644 --- a/aws/sdk/integration-tests/iam/Cargo.toml +++ b/aws/sdk/integration-tests/iam/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/kms/Cargo.toml b/aws/sdk/integration-tests/kms/Cargo.toml index 0e84f1a0ecd..0ab843341de 100644 --- a/aws/sdk/integration-tests/kms/Cargo.toml +++ b/aws/sdk/integration-tests/kms/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/lambda/Cargo.toml b/aws/sdk/integration-tests/lambda/Cargo.toml index 5f6cc8acbd4..1562f98351c 100644 --- a/aws/sdk/integration-tests/lambda/Cargo.toml +++ b/aws/sdk/integration-tests/lambda/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team ", "Zelda Hessler "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [dev-dependencies] diff --git a/aws/sdk/integration-tests/no-default-features/Cargo.toml b/aws/sdk/integration-tests/no-default-features/Cargo.toml index ec8f24bd89e..32c7fe2b5a4 100644 --- a/aws/sdk/integration-tests/no-default-features/Cargo.toml +++ b/aws/sdk/integration-tests/no-default-features/Cargo.toml @@ -8,7 +8,7 @@ when default features are disabled for all SDK and runtime crates. """ edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/polly/Cargo.toml b/aws/sdk/integration-tests/polly/Cargo.toml index 444c65beaf3..880e023f201 100644 --- a/aws/sdk/integration-tests/polly/Cargo.toml +++ b/aws/sdk/integration-tests/polly/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["John DiSanti "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/qldbsession/Cargo.toml b/aws/sdk/integration-tests/qldbsession/Cargo.toml index fecc6e14959..c46dfa0e921 100644 --- a/aws/sdk/integration-tests/qldbsession/Cargo.toml +++ b/aws/sdk/integration-tests/qldbsession/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["Russell Cohen ", "Shing Lyu "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index 9bd9484f9b2..fdb4cfd762e 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/sts/Cargo.toml b/aws/sdk/integration-tests/sts/Cargo.toml index b9e50af6e09..eb478817f99 100644 --- a/aws/sdk/integration-tests/sts/Cargo.toml +++ b/aws/sdk/integration-tests/sts/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/timestreamquery/Cargo.toml b/aws/sdk/integration-tests/timestreamquery/Cargo.toml index b8c6a497acb..535935320a3 100644 --- a/aws/sdk/integration-tests/timestreamquery/Cargo.toml +++ b/aws/sdk/integration-tests/timestreamquery/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml index 45a26fb836f..ba1596d88b3 100644 --- a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml +++ b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team ", "John DiSanti "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [dev-dependencies] diff --git a/aws/sdk/integration-tests/webassembly/Cargo.toml b/aws/sdk/integration-tests/webassembly/Cargo.toml index 159fb4b8676..5d47bccd1d2 100644 --- a/aws/sdk/integration-tests/webassembly/Cargo.toml +++ b/aws/sdk/integration-tests/webassembly/Cargo.toml @@ -9,7 +9,7 @@ when target is set to wasm32-wasi for all SDK and runtime crates. """ edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [lib] diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index b4f1806f459..a58f912dff7 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -10,7 +10,7 @@ allowed_external_types = [ # only allowed in from impl for presigned request "http::request::Request", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", # Consider moving making this crate 1.0 diff --git a/buildSrc/src/main/kotlin/CodegenTestCommon.kt b/buildSrc/src/main/kotlin/CodegenTestCommon.kt index cc996eae82d..12b3a543c1e 100644 --- a/buildSrc/src/main/kotlin/CodegenTestCommon.kt +++ b/buildSrc/src/main/kotlin/CodegenTestCommon.kt @@ -204,7 +204,7 @@ fun Project.registerModifyMtimeTask() { // hashes coincide. // Debugging tip: it is useful to run with `CARGO_LOG=cargo::core::compiler::fingerprint=trace` to learn why Cargo // determines a compilation unit needs a rebuild. - // For more information see https://github.com/awslabs/smithy-rs/issues/1412. + // For more information see https://github.com/smithy-lang/smithy-rs/issues/1412. this.tasks.register("modifyMtime") { description = "modify Rust files' `mtime` if the contents did not change" dependsOn("generateSmithyBuild") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 0feb667fe08..b57b51bf2c8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -48,7 +48,7 @@ private class HttpConnectorConfigCustomization( """ /// Deprecated. Don't use. ##[deprecated( - note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." )] pub fn http_connector(&self) -> Option<#{SharedHttpClient}> { self.runtime_components.http_client() @@ -68,7 +68,7 @@ private class HttpConnectorConfigCustomization( """ /// Deprecated. Don't use. ##[deprecated( - note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." )] pub fn http_connector(self, http_client: impl #{HttpClient} + 'static) -> Self { self.http_client(http_client) @@ -76,7 +76,7 @@ private class HttpConnectorConfigCustomization( /// Deprecated. Don't use. ##[deprecated( - note = "HTTP connector configuration changed. See https://github.com/awslabs/smithy-rs/discussions/3022 for upgrade guidance." + note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." )] pub fn set_http_connector(&mut self, http_client: Option<#{SharedHttpClient}>) -> &mut Self { self.set_http_client(http_client) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index 2f47ffba7a6..84508e104dc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -29,7 +29,7 @@ import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.outputShape import software.amazon.smithy.rust.codegen.core.util.toPascalCase -// TODO(https://github.com/awslabs/smithy-rs/issues/1013) Support pagination when the idempotency trait is present +// TODO(https://github.com/smithy-lang/smithy-rs/issues/1013) Support pagination when the idempotency trait is present fun OperationShape.isPaginated(model: Model) = hasTrait() && inputShape(model) .findMemberWithTrait(model) == null diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index a188d3c9484..4c4cfcd796e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -530,7 +530,7 @@ class DefaultProtocolTestGenerator( // These tests are not even attempted to be generated, either because they will not compile // or because they are flaky private val DisableTests = setOf( - // TODO(https://github.com/awslabs/smithy-rs/issues/2891): Implement support for `@requestCompression` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2891): Implement support for `@requestCompression` "SDKAppendedGzipAfterProvidedEncoding_restJson1", "SDKAppendedGzipAfterProvidedEncoding_restXml", "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", diff --git a/codegen-core/common-test-models/constraints.smithy b/codegen-core/common-test-models/constraints.smithy index c30c669b160..18bbdc252a2 100644 --- a/codegen-core/common-test-models/constraints.smithy +++ b/codegen-core/common-test-models/constraints.smithy @@ -11,7 +11,7 @@ use smithy.framework#ValidationException service ConstraintsService { operations: [ ConstrainedShapesOperation, - // See https://github.com/awslabs/smithy-rs/issues/2760 for why testing operations reaching + // See https://github.com/smithy-lang/smithy-rs/issues/2760 for why testing operations reaching // constrained shapes that only lie in the output is important. ConstrainedShapesOnlyInOutputOperation, ConstrainedHttpBoundShapesOperation, @@ -37,7 +37,7 @@ service ConstraintsService { QueryParamsTargetingMapOfEnumStringOperation, QueryParamsTargetingMapOfListOfEnumStringOperation, - // TODO(https://github.com/awslabs/smithy-rs/issues/1431) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1431) // HttpPrefixHeadersTargetingMapOfEnumStringOperation, NonStreamingBlobOperation, @@ -274,7 +274,7 @@ structure ConstrainedHttpBoundShapesOperationInputOutput { @httpHeader("X-Range-Long-List") rangeLongListHeader: ListOfRangeLong, - // TODO(https://github.com/awslabs/smithy-rs/issues/1431) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1431) // @httpHeader("X-Enum") //enumStringHeader: EnumString, @@ -498,7 +498,7 @@ structure ConA { mapOfLengthString: MapOfLengthString, listOfLengthBlob: ListOfLengthBlob, - // TODO(https://github.com/awslabs/smithy-rs/issues/1401): a `set` shape is + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): a `set` shape is // just a `list` shape with `uniqueItems`, which hasn't been implemented yet. // setOfLengthBlob: SetOfLengthBlob, mapOfLengthBlob: MapOfLengthBlob, @@ -948,7 +948,7 @@ structure ConstrainedShapesOnlyInOutputOperationOutput { list: ConstrainedListInOutput map: ConstrainedMapInOutput // Unions were not affected by - // https://github.com/awslabs/smithy-rs/issues/2760, but testing anyway for + // https://github.com/smithy-lang/smithy-rs/issues/2760, but testing anyway for // good measure. union: ConstrainedUnionInOutput } diff --git a/codegen-core/common-test-models/misc.smithy b/codegen-core/common-test-models/misc.smithy index f78bb6db7cd..10072543c9f 100644 --- a/codegen-core/common-test-models/misc.smithy +++ b/codegen-core/common-test-models/misc.smithy @@ -95,7 +95,7 @@ structure InnermostShape { @required aDouble: Double, - // TODO(https://github.com/awslabs/smithy-rs/issues/312) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/312) // @required // aBigInteger: BigInteger, diff --git a/codegen-core/common-test-models/naming-obstacle-course-casing.smithy b/codegen-core/common-test-models/naming-obstacle-course-casing.smithy index fb80a46d48b..cef9f58e727 100644 --- a/codegen-core/common-test-models/naming-obstacle-course-casing.smithy +++ b/codegen-core/common-test-models/naming-obstacle-course-casing.smithy @@ -3,7 +3,7 @@ namespace casing use aws.protocols#awsJson1_1 -// TODO(https://github.com/awslabs/smithy-rs/issues/2340): The commented part of the model breaks the generator in a +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2340): The commented part of the model breaks the generator in a // miriad of ways. Any solution to the linked issue must address this. /// Confounds model generation machinery with lots of problematic casing diff --git a/codegen-core/common-test-models/pokemon-awsjson.smithy b/codegen-core/common-test-models/pokemon-awsjson.smithy index 12e455ecdd0..3d074f1e88c 100644 --- a/codegen-core/common-test-models/pokemon-awsjson.smithy +++ b/codegen-core/common-test-models/pokemon-awsjson.smithy @@ -1,6 +1,6 @@ $version: "1.0" -// TODO(https://github.com/awslabs/smithy-rs/issues/2215) +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2215) // This is a temporary model to test AwsJson 1.0 with @streaming. // This model will be removed when protocol tests support @streaming. diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index 7002e305e41..2633fe00a83 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -65,7 +65,7 @@ service RestJsonExtras { NullInNonSparse, CaseInsensitiveErrorOperation, EmptyStructWithContentOnWireOp, - // TODO(https://github.com/awslabs/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy // They're being added in https://github.com/smithy-lang/smithy/pull/1908 HttpPayloadWithUnion, ], @@ -317,7 +317,7 @@ operation CaseInsensitiveErrorOperation { @httpResponseTests([ { - documentation: "Upper case error modeled lower case. See: https://github.com/awslabs/smithy-rs/blob/6c21fb0eb377c7120a8179f4537ba99a4b50ba96/rust-runtime/inlineable/src/json_errors.rs#L51-L51", + documentation: "Upper case error modeled lower case. See: https://github.com/smithy-lang/smithy-rs/blob/6c21fb0eb377c7120a8179f4537ba99a4b50ba96/rust-runtime/inlineable/src/json_errors.rs#L51-L51", id: "UpperErrorModeledLower", protocol: "aws.protocols#restJson1", code: 500, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index f20572bbd3c..75d97a2721b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -485,7 +485,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { // These were supposed to be a part of companion object but we decided to move it out to here to avoid NPE // You can find the discussion here. - // https://github.com/awslabs/smithy-rs/discussions/2248 + // https://github.com/smithy-lang/smithy-rs/discussions/2248 public fun SerdeSerialize(): Attribute { return Attribute(cfgAttr(all(writable("aws_sdk_unstable"), feature("serde-serialize")), derive(RuntimeType.SerdeSerialize))) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt index 5ae40c3574d..d52359d6c40 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt @@ -237,7 +237,7 @@ open class RustCrate( } } -// TODO(https://github.com/awslabs/smithy-rs/issues/2341): Remove unconstrained/constrained from codegen-core +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2341): Remove unconstrained/constrained from codegen-core val UnconstrainedModule = RustModule.private("unconstrained") val ConstrainedModule = RustModule.private("constrained") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt index 964f2046dd7..6476dd538e3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt @@ -103,7 +103,7 @@ class BaseSymbolMetadataProvider( is UnionShape, is CollectionShape, is MapShape -> RustMetadata(visibility = Visibility.PUBLIC) // This covers strings with the enum trait for now, and can be removed once we're fully on EnumShape - // TODO(https://github.com/awslabs/smithy-rs/issues/1700): Remove this `is StringShape` match arm + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1700): Remove this `is StringShape` match arm is StringShape -> RustMetadata(visibility = Visibility.PUBLIC) else -> TODO("Unrecognized container type: $container") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt index 9deff45ccc6..af74c80d9f6 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt @@ -226,11 +226,11 @@ open class SymbolVisitor( } override fun bigIntegerShape(shape: BigIntegerShape?): Symbol { - TODO("Not yet implemented: https://github.com/awslabs/smithy-rs/issues/312") + TODO("Not yet implemented: https://github.com/smithy-lang/smithy-rs/issues/312") } override fun bigDecimalShape(shape: BigDecimalShape?): Symbol { - TODO("Not yet implemented: https://github.com/awslabs/smithy-rs/issues/312") + TODO("Not yet implemented: https://github.com/smithy-lang/smithy-rs/issues/312") } override fun operationShape(shape: OperationShape): Symbol { diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt index d37ffde29a4..2a285ca13f3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt @@ -29,7 +29,7 @@ private fun hasStreamingOperations(model: Model): Boolean { } } -// TODO(https://github.com/awslabs/smithy-rs/issues/2111): Fix this logic to consider collection/map shapes +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2111): Fix this logic to consider collection/map shapes private fun structUnionMembersMatchPredicate(model: Model, predicate: (Shape) -> Boolean): Boolean = model.structureShapes.any { structure -> structure.members().any { member -> predicate(model.expectShape(member.target)) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt index c91d705ac39..923f4fce554 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt @@ -83,7 +83,7 @@ interface CoreCodegenDecorator { baseCustomizations: List, ): List = baseCustomizations - // TODO(https://github.com/awslabs/smithy-rs/issues/1401): Move builder customizations into `ClientCodegenDecorator` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): Move builder customizations into `ClientCodegenDecorator` /** * Hook to customize generated builders. */ diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index 9369423757b..76c8caf4efa 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -51,7 +51,7 @@ import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.redactIfNecessary import software.amazon.smithy.rust.codegen.core.util.toSnakeCase -// TODO(https://github.com/awslabs/smithy-rs/issues/1401) This builder generator is only used by the client. +// TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) This builder generator is only used by the client. // Move this entire file, and its tests, to `codegen-client`. /** BuilderGenerator customization sections */ @@ -244,7 +244,7 @@ class BuilderGenerator( member: MemberShape, memberName: String, ) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in // the case where the shape is a `@streaming` blob, because [StreamingTraitSymbolProvider] always generates // a non `Option`al target type: in all other cases the client generates `Option`al types. val inputType = outerType.asOptional() @@ -266,7 +266,7 @@ class BuilderGenerator( member: MemberShape, memberName: String, ) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in // the case where the shape is a `@streaming` blob, because [StreamingTraitSymbolProvider] always generates // a non `Option`al target type: in all other cases the client generates `Option`al types. val inputType = outerType.asOptional() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt index b2732c9d5c8..9c614c7c6e4 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt @@ -88,7 +88,7 @@ class EnumMemberModel( * * Ordinarily, the symbol provider would determine this name, but the enum trait doesn't allow for this. * - * TODO(https://github.com/awslabs/smithy-rs/issues/1700): Remove this function when refactoring to EnumShape. + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1700): Remove this function when refactoring to EnumShape. */ @Deprecated("This function will go away when we handle EnumShape instead of EnumTrait") fun toEnumVariantName( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt index 1da954f0860..ed05e0c1f07 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt @@ -80,7 +80,7 @@ class LibRsGenerator( writeTo(this) } - // TODO(https://github.com/awslabs/smithy-rs/issues/69): Generate a basic example for all crates (eg. select first operation and render an example of usage) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/69): Generate a basic example for all crates (eg. select first operation and render an example of usage) settings.examplesUri?.also { uri -> containerDocs("Examples can be found [here]($uri).") } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt index 2491d07c0e7..4a9839d295e 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt @@ -187,7 +187,7 @@ class HttpBindingGenerator( let out: std::result::Result<_, _> = headers.map(|(key, header_name)| { let values = header_map.get_all(header_name); #T(values.iter()).map(|v| (key.to_string(), v.expect( - "we have checked there is at least one value for this header name; please file a bug report under https://github.com/awslabs/smithy-rs/issues" + "we have checked there is at least one value for this header name; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues" ))) }).collect(); """, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt index 0a534225522..40f8f22934d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt @@ -50,11 +50,11 @@ class AwsJsonHttpBindingResolver( private fun bindings(shape: ToShapeId): List { val members = shape.let { model.expectShape(it.toShapeId()) }.members() - // TODO(https://github.com/awslabs/smithy-rs/issues/2237): support non-streaming members too + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2237): support non-streaming members too if (members.size > 1 && members.any { it.isStreaming(model) }) { throw CodegenException( "We only support one payload member if that payload contains a streaming member." + - "Tracking issue to relax this constraint: https://github.com/awslabs/smithy-rs/issues/2237", + "Tracking issue to relax this constraint: https://github.com/smithy-lang/smithy-rs/issues/2237", ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt index ba526d0c873..6b28820935c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt @@ -87,7 +87,7 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { * * But it's a SHOULD; we could strip the namespace if we wanted to. In fact, we did so in smithy-rs versions * 0.52.0 to 0.55.4; see: - * - https://github.com/awslabs/smithy-rs/pull/1982 + * - https://github.com/smithy-lang/smithy-rs/pull/1982 * - https://github.com/awslabs/smithy/pull/1493 * - https://github.com/awslabs/smithy/issues/1494 */ diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt index 03b4f14f4f0..47aadd368d3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt @@ -341,7 +341,7 @@ class EventStreamUnmarshallerGenerator( // TODO(EventStream): Errors on the operation can be disjoint with errors in the union, // so we need to generate a new top-level Error type for each event stream union. when (codegenTarget) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1970) It should be possible to unify these branches now + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1970) It should be possible to unify these branches now CodegenTarget.CLIENT -> { val target = model.expectShape(member.target, StructureShape::class.java) val parser = protocol.structuredDataParser().errorParser(target) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt index 78012b1d6d4..27293e43039 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt @@ -15,7 +15,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock class SerializerUtil(private val model: Model) { fun RustWriter.ignoreZeroValues(shape: MemberShape, value: ValueExpression, inner: Writable) { // Required shapes should always be serialized - // See https://github.com/awslabs/smithy-rs/issues/230 and https://github.com/aws/aws-sdk-go-v2/pull/1129 + // See https://github.com/smithy-lang/smithy-rs/issues/230 and https://github.com/aws/aws-sdk-go-v2/pull/1129 if ( shape.isRequired || // Zero values are always serialized in lists and collections, this only applies to structures diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index 9fdab3965de..a087089dd3e 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -109,7 +109,7 @@ object TestWorkspace { ) newProject.resolve("rust-toolchain.toml").writeText( // help rust select the right version when we run cargo test - // TODO(https://github.com/awslabs/smithy-rs/issues/2048): load this from the msrv property using a + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2048): load this from the msrv property using a // method as we do for runtime crate versions "[toolchain]\nchannel = \"1.70.0\"\n", ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt index 3ef27312930..d6668500280 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt @@ -125,6 +125,6 @@ fun String.toSnakeCase(): String { } fun String.toPascalCase(): String { - // TODO(https://github.com/awslabs/smithy-rs/issues/3047): consider using our updated toSnakeCase (but need to audit diff) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/3047): consider using our updated toSnakeCase (but need to audit diff) return CaseUtils.toSnakeCase(this).let { CaseUtils.toPascalCase(it) } } diff --git a/codegen-server-test/build.gradle.kts b/codegen-server-test/build.gradle.kts index c4b2f00dbad..2585c988602 100644 --- a/codegen-server-test/build.gradle.kts +++ b/codegen-server-test/build.gradle.kts @@ -71,7 +71,7 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels -> "aws.protocoltests.restjson.validation#RestJsonValidation", "rest_json_validation", // `@range` trait is used on floating point shapes, which we deliberately don't want to support. - // See https://github.com/awslabs/smithy-rs/issues/1401. + // See https://github.com/smithy-lang/smithy-rs/issues/1401. extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """, ), CodegenTest("aws.protocoltests.json10#JsonRpc10", "json_rpc10"), diff --git a/codegen-server-test/python/build.gradle.kts b/codegen-server-test/python/build.gradle.kts index 469e0e6bd7c..11bc96ac67a 100644 --- a/codegen-server-test/python/build.gradle.kts +++ b/codegen-server-test/python/build.gradle.kts @@ -67,12 +67,12 @@ val allCodegenTests = "../../codegen-core/common-test-models".let { commonModels "rest_json_extras", imports = listOf("$commonModels/rest-json-extras.smithy"), ), - // TODO(https://github.com/awslabs/smithy-rs/issues/2477) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2477) // CodegenTest( // "aws.protocoltests.restjson.validation#RestJsonValidation", // "rest_json_validation", // // `@range` trait is used on floating point shapes, which we deliberately don't want to support. - // // See https://github.com/awslabs/smithy-rs/issues/1401. + // // See https://github.com/smithy-lang/smithy-rs/issues/1401. // extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """, // ), CodegenTest( diff --git a/codegen-server-test/typescript/model/pokemon.smithy b/codegen-server-test/typescript/model/pokemon.smithy index 06e46906e71..7874a4f3225 100644 --- a/codegen-server-test/typescript/model/pokemon.smithy +++ b/codegen-server-test/typescript/model/pokemon.smithy @@ -1,4 +1,4 @@ -/// TODO(https://github.com/awslabs/smithy-rs/issues/1508) +/// TODO(https://github.com/smithy-lang/smithy-rs/issues/1508) /// reconcile this model with the main one living inside codegen-server-test/model/pokemon.smithy /// once the Typescript implementation supports Streaming and Union shapes. $version: "1.0" diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt index 96ecbfe75cc..9b05d22434a 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt @@ -218,7 +218,7 @@ class PythonApplicationGenerator( } rustTemplate( """ - let mut service = #{tower}::util::BoxCloneService::new(builder.build().expect("one or more operations do not have a registered handler; this is a bug in the Python code generator, please file a bug report under https://github.com/awslabs/smithy-rs/issues")); + let mut service = #{tower}::util::BoxCloneService::new(builder.build().expect("one or more operations do not have a registered handler; this is a bug in the Python code generator, please file a bug report under https://github.com/smithy-lang/smithy-rs/issues")); { use #{tower}::Layer; diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt index d9ab006b0d5..53b82c2d293 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt @@ -54,7 +54,7 @@ class PythonServerOperationHandlerGenerator( val operationName = symbolProvider.toSymbol(operation).name val input = "crate::input::${operationName.toPascalCase()}Input" val output = "crate::output::${operationName.toPascalCase()}Output" - // TODO(https://github.com/awslabs/smithy-rs/issues/2552) - Use to pascalCase for error shapes. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2552) - Use to pascalCase for error shapes. val error = "crate::error::${operationName}Error" val fnName = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operation).name.toSnakeCase()) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt index 2c7b4f1fc5a..df933eb657d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt @@ -50,7 +50,7 @@ class ConstrainedShapeSymbolMetadataProvider( // We should _always_ be able to `#[derive(Debug)]`: all constrained shapes' types are simply tuple newtypes // wrapping a single type which always implements `Debug`. - // The wrapped type may not _derive_ `Debug` though, hence why this line is required; see https://github.com/awslabs/smithy-rs/issues/2582. + // The wrapped type may not _derive_ `Debug` though, hence why this line is required; see https://github.com/smithy-lang/smithy-rs/issues/2582. derives += RuntimeType.Debug val visibility = Visibility.publicIf(constrainedTypes, Visibility.PUBCRATE) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt index fb1a1acac7c..0dfda68d1eb 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt @@ -77,7 +77,7 @@ open class ConstrainedShapeSymbolProvider( override fun toSymbol(shape: Shape): Symbol { return when (shape) { is MemberShape -> { - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Member shapes can have constraint traits + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Member shapes can have constraint traits // (constraint trait precedence). val target = model.expectShape(shape.target) val targetSymbol = this.toSymbol(target) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt index 8152272a1c3..5d0313e132c 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt @@ -88,7 +88,7 @@ val supportedCollectionConstraintTraits = setOf( */ fun Shape.isDirectlyConstrained(symbolProvider: SymbolProvider): Boolean = when (this) { is StructureShape -> { - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): // The only reason why the functions in this file have // to take in a `SymbolProvider` is because non-`required` blob streaming members are interpreted as // `required`, so we can't use `member.isOptional` here. @@ -111,7 +111,7 @@ fun Shape.isTransitivelyButNotDirectlyConstrained(model: Model, symbolProvider: fun Shape.canReachConstrainedShape(model: Model, symbolProvider: SymbolProvider): Boolean = if (this is MemberShape) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Constraint traits on member shapes are not implemented + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not implemented // yet. Also, note that a walker over a member shape can, perhaps counterintuitively, reach the _containing_ shape, // so we can't simply delegate to the `else` branch when we implement them. this.targetCanReachConstrainedShape(model, symbolProvider) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt index 7b54ff48b00..a26dff9e36c 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt @@ -42,7 +42,7 @@ class PatternTraitEscapedSpecialCharsValidator : AbstractValidator() { """ Non-escaped special characters used inside `@pattern`. You must escape them: `@pattern($replacement)`. - See https://github.com/awslabs/smithy-rs/issues/2508 for more details. + See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details. """.trimIndent() return error(shape, pattern, message) } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index dda5660037b..5e5f7681b58 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -239,7 +239,7 @@ open class ServerCodegenVisitor( validateUnsupportedConstraints(model, service, codegenContext.settings.codegenConfig), )) { for (logMessage in validationResult.messages) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1756): These are getting duplicated. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1756): These are getting duplicated. logger.log(logMessage.level, logMessage.message) } if (validationResult.shouldAbort) { @@ -260,7 +260,7 @@ open class ServerCodegenVisitor( model, codegenDecorator.crateManifestCustomizations(codegenContext), codegenDecorator.libRsCustomizations(codegenContext, listOf()), - // TODO(https://github.com/awslabs/smithy-rs/issues/1287): Remove once the server codegen is far enough along. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1287): Remove once the server codegen is far enough along. requireDocs = false, ) try { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt index 67fbea91cd6..7b0ba87e611 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt @@ -86,7 +86,7 @@ data class ServerCodegenConfig( /** * A flag to enable _experimental_ support for custom validation exceptions via the * [CustomValidationExceptionWithReasonDecorator] decorator. - * TODO(https://github.com/awslabs/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be + * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be * able to define the converters in their Rust application code. */ val experimentalCustomValidationExceptionWithReasonPleaseDoNotUse: String? = defaultExperimentalCustomValidationExceptionWithReasonPleaseDoNotUse, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt index 711f35e462f..488c9347a20 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt @@ -171,7 +171,7 @@ class UnconstrainedShapeSymbolProvider( } else { base.toSymbol(shape) } - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Constraint traits on member shapes are not + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not // implemented yet. } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt index 4dfa97644ed..abee410b5b0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt @@ -34,7 +34,7 @@ import software.amazon.smithy.rust.codegen.core.util.orNull import java.util.logging.Level private sealed class UnsupportedConstraintMessageKind { - private val constraintTraitsUberIssue = "https://github.com/awslabs/smithy-rs/issues/1401" + private val constraintTraitsUberIssue = "https://github.com/smithy-lang/smithy-rs/issues/1401" fun intoLogMessage(ignoreUnsupportedConstraints: Boolean): LogMessage { fun buildMessage(intro: String, willSupport: Boolean, trackingIssue: String? = null, canBeIgnored: Boolean = true): String { @@ -109,7 +109,7 @@ private sealed class UnsupportedConstraintMessageKind { shape, rangeTrait, willSupport = false, - trackingIssue = "https://github.com/awslabs/smithy-rs/issues/2007", + trackingIssue = "https://github.com/smithy-lang/smithy-rs/issues/2007", ), ) @@ -172,8 +172,8 @@ fun validateOperationsWithConstrainedInputHaveValidationExceptionAttached( validationExceptionShapeId: ShapeId, ): ValidationResult { // Traverse the model and error out if an operation uses constrained input, but it does not have - // `ValidationException` attached in `errors`. https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809424783 - // TODO(https://github.com/awslabs/smithy-rs/issues/1401): This check will go away once we add support for + // `ValidationException` attached in `errors`. https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783 + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This check will go away once we add support for // `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors. val walker = DirectedWalker(model) val operationsWithConstrainedInputWithoutValidationExceptionSet = walker.walkShapes(service) @@ -256,7 +256,7 @@ fun validateUnsupportedConstraints( unsupportedConstraintOnNonErrorShapeReachableViaAnEventStreamSet + unsupportedConstraintErrorShapeReachableViaAnEventStreamSet // 3. Range trait used on unsupported shapes. - // TODO(https://github.com/awslabs/smithy-rs/issues/2007) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2007) val unsupportedRangeTraitOnShapeSet = walker .walkShapes(service) .asSequence() diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt index 9a0778b41a2..b2b2aa0b992 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt @@ -44,7 +44,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage * The shape definition is in [CustomValidationExceptionWithReasonDecoratorTest]. * * This is just an example to showcase experimental support for custom validation exceptions. - * TODO(https://github.com/awslabs/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be + * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be * able to define the converters in their Rust application code. */ class CustomValidationExceptionWithReasonDecorator : ServerCodegenDecorator { @@ -80,7 +80,7 @@ class ValidationExceptionWithReasonConversionGenerator(private val codegenContex }; Self::ConstraintViolation( crate::protocol_serde::shape_validation_exception::ser_validation_exception_error(&validation_exception) - .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt index e30c537c7c2..f9124f7f778 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt @@ -44,7 +44,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage * * [0]: https://github.com/awslabs/smithy/tree/main/smithy-validation-model * - * TODO(https://github.com/awslabs/smithy-rs/pull/2053): once the RFC is implemented, consider moving this back into the + * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): once the RFC is implemented, consider moving this back into the * generators. */ class SmithyValidationExceptionDecorator : ServerCodegenDecorator { @@ -78,7 +78,7 @@ class SmithyValidationExceptionConversionGenerator(private val codegenContext: S }; Self::ConstraintViolation( crate::protocol_serde::shape_validation_exception::ser_validation_exception_error(&validation_exception) - .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt index b04eaa2f93b..77ebf832ee2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt @@ -69,7 +69,7 @@ class CollectionConstraintViolationGenerator( } } - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) We should really have two `ConstraintViolation` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) We should really have two `ConstraintViolation` // types here. One will just have variants for each constraint trait on the collection shape, for use by the user. // The other one will have variants if the shape's member is directly or transitively constrained, // and is for use by the framework. diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt index 3e61ab6804f..7ab164b39bf 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt @@ -285,7 +285,7 @@ data class Pattern(val symbol: Symbol, val patternTrait: PatternTrait, val isSen private fun renderValidationFunction(constraintViolation: Symbol, unconstrainedTypeName: String): Writable { val pattern = patternTrait.pattern val errorMessageForUnsupportedRegex = - """The regular expression $pattern is not supported by the `regex` crate; feel free to file an issue under https://github.com/awslabs/smithy-rs/issues for support""" + """The regular expression $pattern is not supported by the `regex` crate; feel free to file an issue under https://github.com/smithy-lang/smithy-rs/issues for support""" return { rustTemplate( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt index 4c1025a0d2a..38917b14776 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt @@ -70,7 +70,7 @@ class MapConstraintViolationGenerator( } inlineModuleCreator(constraintViolationSymbol) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) We should really have two `ConstraintViolation` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) We should really have two `ConstraintViolation` // types here. One will just have variants for each constraint trait on the map shape, for use by the user. // The other one will have variants if the shape's key or value is directly or transitively constrained, // and is for use by the framework. diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt index 1a563c25b98..016da351773 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt @@ -34,7 +34,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.typeNameContainsNonPubl * traits' enforcement, this type is converted into the regular `Vec` the user * sees via the generated converters. * - * TODO(https://github.com/awslabs/smithy-rs/issues/1401) If the collection + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) If the collection * shape is _directly_ constrained, use [ConstrainedCollectionGenerator] * instead. */ diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt index 1ecb71d8785..d91176c0f8f 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt @@ -102,7 +102,7 @@ class ServerBuilderConstraintViolations( */ fun forMember(member: MemberShape): ConstraintViolation? { check(members.contains(member)) - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. return if (symbolProvider.toSymbol(member).isOptional() || member.hasNonNullDefault()) { null } else { @@ -110,7 +110,7 @@ class ServerBuilderConstraintViolations( } } - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) This impl does not take into account the `sensitive` trait. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) This impl does not take into account the `sensitive` trait. // When constraint violation error messages are adjusted to match protocol tests, we should ensure it's honored. private fun renderImplDisplayConstraintViolation(writer: RustWriter) { writer.rustBlock("impl #T for ConstraintViolation", RuntimeType.Display) { @@ -210,7 +210,7 @@ data class ConstraintViolation(val forMember: MemberShape, val kind: ConstraintV val structureSymbol = symbolProvider.toSymbol(model.expectShape(forMember.container)) return when (kind) { ConstraintViolationKind.MISSING_MEMBER -> "`$memberName` was not provided but it is required when building `${structureSymbol.name}`" - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Nest errors. Adjust message following protocol tests. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Nest errors. Adjust message following protocol tests. ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE -> "constraint violation occurred building member `$memberName` when building `${structureSymbol.name}`" } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt index e35f2389bb2..041e71b34bb 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt @@ -383,7 +383,7 @@ class ServerBuilderGenerator( val builderMemberSymbol = builderMemberSymbol(member) val inputType = builderMemberSymbol.rustType().stripOuter().implInto() .letIf( - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): // The only reason why this condition can't simply be `member.isOptional` // is because non-`required` blob streaming members are interpreted as // `required`, so we can't use `member.isOptional` here. @@ -397,7 +397,7 @@ class ServerBuilderGenerator( rust( """ self.$memberName = ${ - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. if (symbolProvider.toSymbol(member).isOptional()) { "input.map(|v| v.into())" } else { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt index 389f0dc173e..d10887678b5 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt @@ -84,7 +84,7 @@ fun generateFallbackCodeToDefaultValue( if (member.isStreaming(model)) { writer.rust(".unwrap_or_default()") } else if (targetShape.hasPublicConstrainedWrapperTupleType(model, publicConstrainedTypes)) { - // TODO(https://github.com/awslabs/smithy-rs/issues/2134): Instead of panicking here, which will ungracefully + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2134): Instead of panicking here, which will ungracefully // shut down the service, perform the `try_into()` check _once_ at service startup time, perhaps // storing the result in a `OnceCell` that could be reused. writer.rustTemplate( @@ -92,7 +92,7 @@ fun generateFallbackCodeToDefaultValue( .unwrap_or_else(|| #{DefaultValue:W} .try_into() - .expect("this check should have failed at generation time; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("this check should have failed at generation time; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") ) """, "DefaultValue" to defaultValue, @@ -125,7 +125,7 @@ fun defaultValue( val types = ServerCargoDependency.smithyTypes(runtimeConfig).toType() // Define the exception once for DRYness. val unsupportedDefaultValueException = - CodegenException("Default value $node for member shape ${member.id} is unsupported or cannot exist; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + CodegenException("Default value $node for member shape ${member.id} is unsupported or cannot exist; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") when (val target = model.expectShape(member.target)) { is EnumShape, is IntEnumShape -> { val value = when (target) { @@ -169,7 +169,7 @@ fun defaultValue( rustTemplate( """ #{SmithyTypes}::DateTime::from_str("$value", #{SmithyTypes}::date_time::Format::DateTime) - .expect("default value `$value` cannot be parsed into a valid date time; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("default value `$value` cannot be parsed into a valid date time; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") """, "SmithyTypes" to types, ) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt index 64d35e0a8fc..f0ca507db16 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt @@ -16,14 +16,14 @@ import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext -// TODO(https://github.com/awslabs/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` fun StructureShape.serverBuilderSymbol(codegenContext: ServerCodegenContext): Symbol = this.serverBuilderSymbol( codegenContext.symbolProvider, !codegenContext.settings.codegenConfig.publicConstrainedTypes, ) -// TODO(https://github.com/awslabs/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.moduleForBuilder` +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.moduleForBuilder` fun StructureShape.serverBuilderModule(symbolProvider: SymbolProvider, pubCrate: Boolean): RustModule.LeafModule { val structureSymbol = symbolProvider.toSymbol(this) val builderNamespace = RustReservedWords.escapeIfNeeded(structureSymbol.name.toSnakeCase()) + @@ -45,7 +45,7 @@ fun StructureShape.serverBuilderModule(symbolProvider: SymbolProvider, pubCrate: ) } -// TODO(https://github.com/awslabs/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` fun StructureShape.serverBuilderSymbol(symbolProvider: SymbolProvider, pubCrate: Boolean): Symbol { val builderModule = serverBuilderModule(symbolProvider, pubCrate) val rustType = RustType.Opaque("Builder", builderModule.fullyQualifiedPath()) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt index 0163f094f5f..0347013de5c 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt @@ -314,7 +314,7 @@ data class MakeFmt( * These closures are provided to `RequestFmt` and `ResponseFmt` constructors, which in turn are provided to * `InstrumentedOperation` to configure logging. These structures can be found in `aws_smithy_http_server::instrumentation`. * - * See [Logging in the Presence of Sensitive Data](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0018_logging_sensitive.md) + * See [Logging in the Presence of Sensitive Data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0018_logging_sensitive.md) * for more details. */ class ServerHttpSensitivityGenerator( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index e1da585d054..79b087ee14d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -324,7 +324,7 @@ class ServerServiceGenerator( operation_names2setter_methods: $missingOperationsVariableName, }); } - let $expectMessageVariableName = "this should never panic since we are supposed to check beforehand that a handler has been registered for this operation; please file a bug report under https://github.com/awslabs/smithy-rs/issues"; + let $expectMessageVariableName = "this should never panic since we are supposed to check beforehand that a handler has been registered for this operation; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"; #{PatternInitializations:W} @@ -492,13 +492,13 @@ class ServerServiceGenerator( // This is the router wrapped by layers. svc: S, } - + impl $serviceName<()> { /// Constructs a builder for [`$serviceName`]. - /// You must specify a configuration object holding any plugins and layers that should be applied + /// You must specify a configuration object holding any plugins and layers that should be applied /// to the operations in this service. pub fn builder< - Body, + Body, L, HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, ModelPl: #{SmithyHttpServer}::plugin::ModelMarker, @@ -512,7 +512,7 @@ class ServerServiceGenerator( model_plugin: config.model_plugins, } } - + /// Constructs a builder for [`$serviceName`]. /// You must specify what plugins should be applied to the operations in this service. /// @@ -523,14 +523,14 @@ class ServerServiceGenerator( /// multiple plugins. ##[deprecated( since = "0.57.0", - note = "please use the `builder` constructor and register plugins on the `${serviceName}Config` object instead; see https://github.com/awslabs/smithy-rs/discussions/3096" + note = "please use the `builder` constructor and register plugins on the `${serviceName}Config` object instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096" )] pub fn builder_with_plugins< - Body, - HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, + Body, + HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, ModelPl: #{SmithyHttpServer}::plugin::ModelMarker >( - http_plugin: HttpPl, + http_plugin: HttpPl, model_plugin: ModelPl ) -> $builderName { $builderName { @@ -546,12 +546,12 @@ class ServerServiceGenerator( /// Use [`$serviceName::builder_with_plugins`] if you need to specify plugins. ##[deprecated( since = "0.57.0", - note = "please use the `builder` constructor instead; see https://github.com/awslabs/smithy-rs/discussions/3096" + note = "please use the `builder` constructor instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096" )] pub fn builder_without_plugins() -> $builderName< - Body, + Body, #{Tower}::layer::util::Identity, - #{SmithyHttpServer}::plugin::IdentityPlugin, + #{SmithyHttpServer}::plugin::IdentityPlugin, #{SmithyHttpServer}::plugin::IdentityPlugin > { Self::builder_with_plugins(#{SmithyHttpServer}::plugin::IdentityPlugin, #{SmithyHttpServer}::plugin::IdentityPlugin) @@ -570,7 +570,7 @@ class ServerServiceGenerator( #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo::new(self) } } - + impl $serviceName< #{SmithyHttpServer}::routing::RoutingService< @@ -582,7 +582,7 @@ class ServerServiceGenerator( /// Applies a [`Layer`](#{Tower}::Layer) uniformly to all routes. ##[deprecated( since = "0.57.0", - note = "please add layers to the `${serviceName}Config` object instead; see https://github.com/awslabs/smithy-rs/discussions/3096" + note = "please add layers to the `${serviceName}Config` object instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096" )] pub fn layer( self, @@ -749,8 +749,8 @@ class ServerServiceGenerator( for ((_, value) in operationStructNames) { rustTemplate( """ - impl #{SmithyHttpServer}::service::ContainsOperation - for $serviceName + impl #{SmithyHttpServer}::service::ContainsOperation + for $serviceName { const VALUE: Operation = Operation::$value; } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt index b5c0cd052b8..b43eb582e60 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt @@ -35,7 +35,7 @@ class RestRequestSpecGenerator( it to requestSpecModule.resolve(it) }.toTypedArray() - // TODO(https://github.com/awslabs/smithy-rs/issues/950): Support the `endpoint` trait. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): Support the `endpoint` trait. val pathSegmentsVec = writable { withBlock("vec![", "]") { for (segment in httpTrait.uri.segments) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index c72b99575ac..968f87ea3a0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -526,7 +526,7 @@ class ServerProtocolTestGenerator( (target is DoubleShape) || (target is FloatShape) } - // TODO(https://github.com/awslabs/smithy-rs/issues/1147) Handle the case of nested floating point members. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1147) Handle the case of nested floating point members. if (hasFloatingPointMembers) { for (member in inputShape.members()) { val memberName = codegenContext.symbolProvider.toMemberName(member) @@ -569,7 +569,7 @@ class ServerProtocolTestGenerator( // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to // invoke it with (like in the case of an `httpResponseTest` test case). - // In https://github.com/awslabs/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` + // In https://github.com/smithy-lang/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` // the operation handler trait implementation instead of directly calling `from_request()`. // If no request body is defined, then no assertions are made about the body of the message. @@ -585,7 +585,7 @@ class ServerProtocolTestGenerator( // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to // invoke it with (like in the case of an `httpResponseTest` test case). - // In https://github.com/awslabs/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` + // In https://github.com/smithy-lang/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` // the operation handler trait implementation instead of directly calling `from_request()`. // If no request body is defined, then no assertions are made about the body of the message. @@ -744,19 +744,19 @@ class ServerProtocolTestGenerator( private const val RestJson = "aws.protocoltests.restjson#RestJson" private const val RestJsonValidation = "aws.protocoltests.restjson.validation#RestJsonValidation" private val ExpectFail: Set = setOf( - // Endpoint trait is not implemented yet, see https://github.com/awslabs/smithy-rs/issues/950. + // Endpoint trait is not implemented yet, see https://github.com/smithy-lang/smithy-rs/issues/950. FailingTest(RestJson, "RestJsonEndpointTrait", TestType.Request), FailingTest(RestJson, "RestJsonEndpointTraitWithHostLabel", TestType.Request), FailingTest(RestJson, "RestJsonOmitsEmptyListQueryValues", TestType.Request), // Tests involving `@range` on floats. - // Pending resolution from the Smithy team, see https://github.com/awslabs/smithy-rs/issues/2007. + // Pending resolution from the Smithy team, see https://github.com/smithy-lang/smithy-rs/issues/2007. FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloat_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloat_case1", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeMaxFloat", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeMinFloat", TestType.MalformedRequest), - // Tests involving floating point shapes and the `@range` trait; see https://github.com/awslabs/smithy-rs/issues/2007 + // Tests involving floating point shapes and the `@range` trait; see https://github.com/smithy-lang/smithy-rs/issues/2007 FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloatOverride_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloatOverride_case1", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeMaxFloatOverride", TestType.MalformedRequest), @@ -810,7 +810,7 @@ class ServerProtocolTestGenerator( FailingTest(RestJsonValidation, "RestJsonMalformedUniqueItemsUnionList_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedUniqueItemsUnionList_case1", TestType.MalformedRequest), - // TODO(https://github.com/awslabs/smithy-rs/issues/2472): We don't respect the `@internal` trait + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2472): We don't respect the `@internal` trait FailingTest(RestJsonValidation, "RestJsonMalformedEnumList_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedEnumList_case1", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedEnumMapKey_case0", TestType.MalformedRequest), @@ -831,7 +831,7 @@ class ServerProtocolTestGenerator( // These tests are not even attempted to be generated, either because they will not compile // or because they are flaky private val DisableTests = setOf( - // TODO(https://github.com/awslabs/smithy-rs/issues/2891): Implement support for `@requestCompression` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2891): Implement support for `@requestCompression` "SDKAppendedGzipAfterProvidedEncoding_restJson1", "SDKAppendedGzipAfterProvidedEncoding_restXml", "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", @@ -925,7 +925,7 @@ class ServerProtocolTestGenerator( .build() } - // TODO(https://github.com/awslabs/smithy-rs/issues/1288): Move the fixed versions into + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1288): Move the fixed versions into // `rest-json-extras.smithy` and put the unfixed ones in `ExpectFail`: this has the // advantage that once our upstream PRs get merged and we upgrade to the next Smithy release, our build will // fail and we will take notice to remove the fixes from `rest-json-extras.smithy`. This is exactly what the diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt index f8c18f39655..c13ac7f9981 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt @@ -281,7 +281,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( // Implement `from_request` trait for input types. val inputFuture = "${inputSymbol.name}Future" - // TODO(https://github.com/awslabs/smithy-rs/issues/2238): Remove the `Pin>` and replace with thin wrapper around `Collect`. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2238): Remove the `Pin>` and replace with thin wrapper around `Collect`. rustTemplate( """ #{verifyAcceptHeaderStaticContentTypeInit:W} @@ -886,7 +886,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( } } .joinToString( - // TODO(https://github.com/awslabs/smithy-rs/issues/1289): Note we're limited to 21 labels because of `tuple`. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1289): Note we're limited to 21 labels because of `tuple`. prefix = if (segments.size > 1) "#{Nom}::sequence::tuple::<_, _, #{Nom}::error::Error<&str>, _>((" else "", postfix = if (segments.size > 1) "))" else "", transform = { parser -> @@ -990,7 +990,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( if (queryParamsBinding != null) { val target = model.expectShape(queryParamsBinding.member.target, MapShape::class.java) val hasConstrainedTarget = target.canReachConstrainedShape(model, symbolProvider) - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Here we only check the target shape; + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Here we only check the target shape; // constraint traits on member shapes are not implemented yet. val targetSymbol = unconstrainedShapeSymbolProvider.toSymbol(target) withBlock("let mut query_params: #T = ", ";", targetSymbol) { @@ -1075,7 +1075,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( if (queryParamsBinding != null) { val target = model.expectShape(queryParamsBinding.member.target, MapShape::class.java) - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Here we only check the target shape; + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Here we only check the target shape; // constraint traits on member shapes are not implemented yet. val hasConstrainedTarget = target.canReachConstrainedShape(model, symbolProvider) when (queryParamsBinding.queryParamsBindingTargetMapValueType()) { @@ -1116,7 +1116,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( } } queryBindingsTargetingCollection.forEach { binding -> - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Constraint traits on member shapes are not + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not // implemented yet. val hasConstrainedTarget = model.expectShape(binding.member.target, CollectionShape::class.java).canReachConstrainedShape(model, symbolProvider) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt index 68840bde201..93bc55df128 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt @@ -26,9 +26,9 @@ import software.amazon.smithy.rust.codegen.server.smithy.hasConstraintTrait * Until we implement said mode, we manually attach the error to build these models, since we don't own them (they're * either actual AWS service model excerpts, or they come from the `awslabs/smithy` library. * - * [1]: https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809424783 + * [1]: https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783 * - * TODO(https://github.com/awslabs/smithy-rs/issues/1401): This transformer will go away once we add support for + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This transformer will go away once we add support for * `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors. */ object AttachValidationExceptionToConstrainedOperationInputsInAllowList { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt index d2e41ead36a..fc938aab7a1 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt @@ -63,7 +63,7 @@ object RecursiveConstraintViolationBoxer { * Places where constraint violations are handled (like where unconstrained types are converted to constrained * types) must account for the scenario where they now are or need to be boxed. * - * [0] https://github.com/awslabs/smithy-rs/pull/2040 + * [0] https://github.com/smithy-lang/smithy-rs/pull/2040 */ fun transform(model: Model): Model = RecursiveShapeBoxer( containsIndirectionPredicate = ::constraintViolationLoopContainsIndirection, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt index d4c6feaed64..114ffceae05 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt @@ -24,10 +24,10 @@ import software.amazon.smithy.rust.codegen.core.util.orNull * [AttachValidationExceptionToConstrainedOperationInputsInAllowList], ensures that it is replaced by * `smithy.framework#ValidationException`. * - * [0]: https://github.com/awslabs/smithy-rs/blob/274adf155042cde49251a0e6b8842d6f56cd5b6d/codegen-core/common-test-models/ebs.json#L1270-L1288 - * [1]: https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809424783 + * [0]: https://github.com/smithy-lang/smithy-rs/blob/274adf155042cde49251a0e6b8842d6f56cd5b6d/codegen-core/common-test-models/ebs.json#L1270-L1288 + * [1]: https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783 * - * TODO(https://github.com/awslabs/smithy-rs/issues/1401): This transformer will go away once we implement + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This transformer will go away once we implement * `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors. */ object RemoveEbsModelValidationException { diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt index fdb0cc72b48..7a54849c208 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt @@ -32,7 +32,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { events[0].message shouldBe """ Non-escaped special characters used inside `@pattern`. You must escape them: `@pattern("\\t")`. - See https://github.com/awslabs/smithy-rs/issues/2508 for more details. + See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details. """.trimIndent() } @@ -53,7 +53,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { events[0].message shouldBe """ Non-escaped special characters used inside `@pattern`. You must escape them: `@pattern("[.\\n\\r]+")`. - See https://github.com/awslabs/smithy-rs/issues/2508 for more details. + See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details. """.trimIndent() } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt index 1f685909f38..f36976e715e 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt @@ -11,7 +11,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrat class ServerBuilderConstraintViolationsTest { - // This test exists not to regress on [this](https://github.com/awslabs/smithy-rs/issues/2343) issue. + // This test exists not to regress on [this](https://github.com/smithy-lang/smithy-rs/issues/2343) issue. // We generated constraint violation variants, pointing to a structure (StructWithInnerDefault below), // but the structure was not constrained, because the structure's member have a default value // and default values are validated at generation time from the model. diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt index 172ad5f4d98..966426f948d 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt @@ -53,7 +53,7 @@ class ServerBuilderDefaultValuesTest { "Float" to "0.5", "Double" to "0.55", "Timestamp" to "1985-04-12T23:20:50.52Z".dq(), - // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/awslabs/smithy-rs/issues/312) + // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/smithy-lang/smithy-rs/issues/312) "StringList" to "[]", "IntegerMap" to "{}", "Language" to "en".dq(), @@ -77,7 +77,7 @@ class ServerBuilderDefaultValuesTest { "Float" to "0.6", "Double" to "0.66", "Timestamp" to "2022-11-25T17:30:50.00Z".dq(), - // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/awslabs/smithy-rs/issues/312) + // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/smithy-lang/smithy-rs/issues/312) "StringList" to "[]", "IntegerMap" to "{}", "Language" to "fr".dq(), diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt index 26f76db187f..d870d8c1b04 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt @@ -16,7 +16,7 @@ class ServerEventStreamUnmarshallerGeneratorTest { @ParameterizedTest @ArgumentsSource(TestCasesProvider::class) fun test(testCase: TestCase) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1442): Enable tests for `publicConstrainedTypes = false` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1442): Enable tests for `publicConstrainedTypes = false` // by deleting this if/return if (!testCase.publicConstrainedTypes) { return diff --git a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt index 850af7b51af..885bac4a9a0 100644 --- a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt +++ b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt @@ -62,7 +62,7 @@ class NapiPackageJsonDecorator : ServerCodegenDecorator { val name = codegenContext.settings.moduleName.toSnakeCase() val version = codegenContext.settings.moduleVersion - // TODO(https://github.com/awslabs/smithy-rs/issues/2317): we should probably use a real JSON writer, but I did not want to add + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2317): we should probably use a real JSON writer, but I did not want to add // other external libraries at this stage. rustCrate.withFile("package.json") { val content = """{ diff --git a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt index 6384c5c07c3..88974f76d28 100644 --- a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt +++ b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt @@ -29,7 +29,7 @@ class TsServerOperationErrorGenerator( renderFromTsErr(writer) } - // TODO(https://github.com/awslabs/smithy-rs/issues/2317): match the Ts error type and return the right one. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2317): match the Ts error type and return the right one. private fun renderFromTsErr(writer: RustWriter) { writer.rustTemplate( """ diff --git a/design/README.md b/design/README.md index 16778f2c90e..92940811eb5 100644 --- a/design/README.md +++ b/design/README.md @@ -1,4 +1,4 @@ -Design docs are hosted [here](https://awslabs.github.io/smithy-rs/design/). +Design docs are hosted [here](https://smithy-lang.github.io/smithy-rs/design/). To render design docs locally: ``` diff --git a/design/src/client/orchestrator.md b/design/src/client/orchestrator.md index d0330905bd6..a6f8cb1b8c0 100644 --- a/design/src/client/orchestrator.md +++ b/design/src/client/orchestrator.md @@ -206,6 +206,6 @@ Because RFCs become outdated as designs evolve. It is our intention to keep this [dynamic dispatch]: https://doc.rust-lang.org/book/ch17-02-trait-objects.html#trait-objects-perform-dynamic-dispatch [TypeId]: https://doc.rust-lang.org/stable/std/any/struct.TypeId.html [downcast]: https://en.wikipedia.org/wiki/Downcasting -[orchestrate-impl]: https://github.com/awslabs/smithy-rs/blob/8bc93fc04dd8c8d7447bfe3f5196a75cba0b10ba/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs#L23 -[aws-smithy-runtime]: https://github.com/awslabs/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime -[aws-smithy-runtime-api]: https://github.com/awslabs/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime-api +[orchestrate-impl]: https://github.com/smithy-lang/smithy-rs/blob/8bc93fc04dd8c8d7447bfe3f5196a75cba0b10ba/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs#L23 +[aws-smithy-runtime]: https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime +[aws-smithy-runtime-api]: https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime-api diff --git a/design/src/rfcs/rfc0003_presigning_api.md b/design/src/rfcs/rfc0003_presigning_api.md index c75230751c9..707c317c3aa 100644 --- a/design/src/rfcs/rfc0003_presigning_api.md +++ b/design/src/rfcs/rfc0003_presigning_api.md @@ -193,7 +193,7 @@ look for this synthetic trait when creating the fluent builders and inputs to kn If a presignable operation input has a member named `presigned`, then there will be a name collision with the function to generate a presigned URL. To mitigate this, `RustReservedWords` will be updated to rename the `presigned` member to `presigned_value` -[similar to how `send` is renamed](https://github.com/awslabs/smithy-rs/blob/3d61226b5d446f4cc20bf4969f0e56d106cf478b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L28). +[similar to how `send` is renamed](https://github.com/smithy-lang/smithy-rs/blob/3d61226b5d446f4cc20bf4969f0e56d106cf478b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L28). Changes Checklist ----------------- diff --git a/design/src/rfcs/rfc0004_retry_behavior.md b/design/src/rfcs/rfc0004_retry_behavior.md index 3da28afdc79..82f1914c017 100644 --- a/design/src/rfcs/rfc0004_retry_behavior.md +++ b/design/src/rfcs/rfc0004_retry_behavior.md @@ -174,7 +174,7 @@ Changes checklist ----------------- - [x] Create new Kotlin decorator `RetryConfigDecorator` - - Based on [RegionDecorator.kt](https://github.com/awslabs/smithy-rs/blob/main/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt) + - Based on [RegionDecorator.kt](https://github.com/smithy-lang/smithy-rs/blob/main/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt) - This decorator will live in the `codegen` project because it has relevance outside the SDK - [x] **Breaking changes:** - [x] Rename `aws_smithy_client::retry::Config` to `StandardRetryConfig` diff --git a/design/src/rfcs/rfc0006_service_specific_middleware.md b/design/src/rfcs/rfc0006_service_specific_middleware.md index a9c2a98c4d6..7f7670d5a7b 100644 --- a/design/src/rfcs/rfc0006_service_specific_middleware.md +++ b/design/src/rfcs/rfc0006_service_specific_middleware.md @@ -1,7 +1,7 @@ RFC: Service-specific middleware ================================ -> Status: [Implemented](https://github.com/awslabs/smithy-rs/pull/959) +> Status: [Implemented](https://github.com/smithy-lang/smithy-rs/pull/959) For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. diff --git a/design/src/rfcs/rfc0007_split_release_process.md b/design/src/rfcs/rfc0007_split_release_process.md index 368ed34e6fe..dfffe848cf7 100644 --- a/design/src/rfcs/rfc0007_split_release_process.md +++ b/design/src/rfcs/rfc0007_split_release_process.md @@ -1,7 +1,7 @@ RFC: Split Release Process ========================== -> Status: Implemented in [smithy-rs#986](https://github.com/awslabs/smithy-rs/pull/986) and [aws-sdk-rust#351](https://github.com/awslabs/aws-sdk-rust/pull/351) +> Status: Implemented in [smithy-rs#986](https://github.com/smithy-lang/smithy-rs/pull/986) and [aws-sdk-rust#351](https://github.com/awslabs/aws-sdk-rust/pull/351) At the time of writing, the `aws-sdk-rust` repository is used exclusively for the entire release process of both the Rust runtime crates from `smithy-rs` as diff --git a/design/src/rfcs/rfc0009_example_consolidation.md b/design/src/rfcs/rfc0009_example_consolidation.md index 296151b4041..207265e763c 100644 --- a/design/src/rfcs/rfc0009_example_consolidation.md +++ b/design/src/rfcs/rfc0009_example_consolidation.md @@ -5,7 +5,7 @@ RFC: Examples Consolidation Currently, the AWS Rust SDK's examples are duplicated across [`awslabs/aws-sdk-rust`](https://github.com/awslabs/aws-sdk-rust), -[`awslabs/smithy-rs`](https://github.com/awslabs/smithy-rs), +[`smithy-lang/smithy-rs`](https://github.com/smithy-lang/smithy-rs), and [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples). The `smithy-rs` repository was formerly the source of truth for examples, with the examples being copied over to `aws-sdk-rust` as part of the release diff --git a/design/src/rfcs/rfc0010_waiters.md b/design/src/rfcs/rfc0010_waiters.md index 3d0f80b2918..24886d52de5 100644 --- a/design/src/rfcs/rfc0010_waiters.md +++ b/design/src/rfcs/rfc0010_waiters.md @@ -184,4 +184,4 @@ Changes Checklist - [ ] Codegen `classify_result()` functions based on JMESPath expressions in Smithy model [Smithy waiter specification]: https://awslabs.github.io/smithy/1.0/spec/waiters.html -[default `RetryHandler` uses in `aws-smithy-client`]: https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-client/src/retry.rs#L252-L292 +[default `RetryHandler` uses in `aws-smithy-client`]: https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-client/src/retry.rs#L252-L292 diff --git a/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md b/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md index 967d19f1e39..b5e9e73eea2 100644 --- a/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md +++ b/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md @@ -114,8 +114,8 @@ The new release process would be: ### Short-term Changes Checklist -- [x] Prepare runtime crate manifests for publication to crates.io (https://github.com/awslabs/smithy-rs/pull/755) -- [x] Update SDK generator to set correct crate versions (https://github.com/awslabs/smithy-rs/pull/755) +- [x] Prepare runtime crate manifests for publication to crates.io (https://github.com/smithy-lang/smithy-rs/pull/755) +- [x] Update SDK generator to set correct crate versions (https://github.com/smithy-lang/smithy-rs/pull/755) - [x] Write bulk publish script - [x] Write bulk yank script - [x] Write automation to sync smithy-rs to aws-sdk-rust diff --git a/design/src/rfcs/rfc0012_independent_crate_versioning.md b/design/src/rfcs/rfc0012_independent_crate_versioning.md index b64dc2b88ac..d0c0241714b 100644 --- a/design/src/rfcs/rfc0012_independent_crate_versioning.md +++ b/design/src/rfcs/rfc0012_independent_crate_versioning.md @@ -222,4 +222,4 @@ per semver. At that point, no further API breaking changes can be made without a [aws-sdk-rust]: https://github.com/awslabs/aws-sdk-rust [rust-semverver]: https://github.com/rust-lang/rust-semverver [semver]: https://semver.org/ -[smithy-rs]: https://github.com/awslabs/smithy-rs +[smithy-rs]: https://github.com/smithy-lang/smithy-rs diff --git a/design/src/rfcs/rfc0013_body_callback_apis.md b/design/src/rfcs/rfc0013_body_callback_apis.md index ea9b024c1d6..93eedb3f7b7 100644 --- a/design/src/rfcs/rfc0013_body_callback_apis.md +++ b/design/src/rfcs/rfc0013_body_callback_apis.md @@ -292,5 +292,5 @@ In order to use this in a request, we'd modify codegen for that request's servic - (if streaming) we'd set the checksum callback on the request body object - (if non-streaming) we'd immediately read the body and call `BodyCallback::update` manually. Once all data was read, we'd get the checksum by calling `trailers` and insert that data as a request header. -[ByteStream impls]: https://github.com/awslabs/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/byte_stream.rs#L205 -[SdkBody impls]: https://github.com/awslabs/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/body.rs#L71 +[ByteStream impls]: https://github.com/smithy-lang/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/byte_stream.rs#L205 +[SdkBody impls]: https://github.com/smithy-lang/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/body.rs#L71 diff --git a/design/src/rfcs/rfc0014_timeout_config.md b/design/src/rfcs/rfc0014_timeout_config.md index 52b1496ec0f..776c60104a3 100644 --- a/design/src/rfcs/rfc0014_timeout_config.md +++ b/design/src/rfcs/rfc0014_timeout_config.md @@ -261,12 +261,12 @@ Changes are broken into to sections: [hjr3/hyper-timeout]: https://github.com/hjr3/hyper-timeout [sfackler/tokio-io-timeout]: https://github.com/sfackler/tokio-io-timeout [tower_service::Service]: https://docs.rs/tower-service/0.3.1/tower_service/trait.Service.html -[AwsMiddleware]: https://github.com/awslabs/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/aws/rust-runtime/aws-hyper/src/lib.rs#L29 -[MapRequest]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L122 -[AsyncMapRequest]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L42 -[ParseResponse]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/parse_response.rs#L27 -[DynConnect]: https://github.com/awslabs/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/rust-runtime/aws-smithy-client/src/erase.rs#L139 +[AwsMiddleware]: https://github.com/smithy-lang/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/aws/rust-runtime/aws-hyper/src/lib.rs#L29 +[MapRequest]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L122 +[AsyncMapRequest]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L42 +[ParseResponse]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/parse_response.rs#L27 +[DynConnect]: https://github.com/smithy-lang/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/rust-runtime/aws-smithy-client/src/erase.rs#L139 [Connect]: https://docs.rs/hyper/0.14.14/hyper/client/connect/trait.Connect.html [tower::layer::util::Stack]: https://docs.rs/tower/0.4.10/tower/layer/util/struct.Stack.html -[aws_smithy_client::Client::call_raw]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-client/src/lib.rs#L175 -[Layers can produce compiler errors]: https://github.com/awslabs/smithy-rs/issues/634 +[aws_smithy_client::Client::call_raw]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-client/src/lib.rs#L175 +[Layers can produce compiler errors]: https://github.com/smithy-lang/smithy-rs/issues/634 diff --git a/design/src/rfcs/rfc0015_using_features_responsibly.md b/design/src/rfcs/rfc0015_using_features_responsibly.md index 336b25ca80f..3afd19e4e71 100644 --- a/design/src/rfcs/rfc0015_using_features_responsibly.md +++ b/design/src/rfcs/rfc0015_using_features_responsibly.md @@ -80,7 +80,7 @@ impl ClientBuilder<(), M, R> { Both features can now be enabled at once without creating a conflict. Since both methods have different names, it's now Ok for them to have different return types. -[*This is real code, see it in context*](https://github.com/awslabs/smithy-rs/blob/2e7ed943513203f1472f2490866dc4fb8a392bd3/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L303) +[*This is real code, see it in context*](https://github.com/smithy-lang/smithy-rs/blob/2e7ed943513203f1472f2490866dc4fb8a392bd3/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L303) ### We should avoid using `#[cfg(not(feature = "some-feature"))]` @@ -130,12 +130,12 @@ For an example: Say you have a crate with features `a`, `b`, `c` that all provid - [Mutually exclusive features are present in profiling-procmacros][profiling#32] - [Clang-sys features not additive][clang-sys#128] -[aws-sigv4]: https://github.com/awslabs/smithy-rs/blob/5a1990791d727652587df51b77df4d1df9058252/aws/rust-runtime/aws-sigv4/Cargo.toml +[aws-sigv4]: https://github.com/smithy-lang/smithy-rs/blob/5a1990791d727652587df51b77df4d1df9058252/aws/rust-runtime/aws-sigv4/Cargo.toml [aws-sdk-s3]: https://github.com/awslabs/aws-sdk-rust/blob/f2b4361b004ee822960ea9791f566fd4eb6d1aba/sdk/s3/Cargo.toml [Cargo Book section on features]: https://doc.rust-lang.org/cargo/reference/features.html [SemVer-incompatible change]: https://doc.rust-lang.org/cargo/reference/features.html#semver-compatibility [remove rustls from crate graph]: https://github.com/awslabs/aws-sdk-rust/issues/304 -[remove default features from runtime crates]: https://github.com/awslabs/smithy-rs/pull/935 +[remove default features from runtime crates]: https://github.com/smithy-lang/smithy-rs/pull/935 [cfg! macro]: https://doc.rust-lang.org/rust-by-example/attribute/cfg.html [How to tell what "features" are available per crate?]: https://stackoverflow.com/questions/59761045/how-to-tell-what-features-are-available-per-crate [How do I 'pass down' feature flags to subdependencies in Cargo?]: https://stackoverflow.com/questions/40021555/how-do-i-pass-down-feature-flags-to-subdependencies-in-cargo @@ -144,4 +144,4 @@ For an example: Say you have a crate with features `a`, `b`, `c` that all provid [profiling#32]: https://github.com/aclysma/profiling/issues/32 [clang-sys#128]: https://github.com/KyleMayes/clang-sys/issues/128 [compile-time errors]: https://doc.rust-lang.org/stable/std/macro.compile_error.html -[native-tls example]: https://github.com/awslabs/smithy-rs/tree/bc316a0b81b75a00c389f6281a66eb0f5357172a/aws/sdk/examples/using_native_tls_instead_of_rustls +[native-tls example]: https://github.com/smithy-lang/smithy-rs/tree/bc316a0b81b75a00c389f6281a66eb0f5357172a/aws/sdk/examples/using_native_tls_instead_of_rustls diff --git a/design/src/rfcs/rfc0018_logging_sensitive.md b/design/src/rfcs/rfc0018_logging_sensitive.md index 9598c823c4a..27f94f1a1da 100644 --- a/design/src/rfcs/rfc0018_logging_sensitive.md +++ b/design/src/rfcs/rfc0018_logging_sensitive.md @@ -8,7 +8,7 @@ Smithy provides a [sensitive trait](https://awslabs.github.io/smithy/1.0/spec/co This RFC is concerned with solving the problem of honouring this specification in the context of logging. -Progress has been made towards this goal in the form of the [Sensitive Trait PR](https://github.com/awslabs/smithy-rs/pull/229), which uses code generation to remove sensitive fields from `Debug` implementations. +Progress has been made towards this goal in the form of the [Sensitive Trait PR](https://github.com/smithy-lang/smithy-rs/pull/229), which uses code generation to remove sensitive fields from `Debug` implementations. The problem remains open due to the existence of HTTP binding traits and a lack of clearly defined user guidelines which customers may follow to honour the specification. @@ -222,7 +222,7 @@ These wrappers should be provided alongside the `Sensitive` struct described in ### Middleware Position -This logging middleware should be applied outside of the [OperationHandler](https://github.com/awslabs/smithy-rs/blob/cd0563020abcde866a741fa123e3f2e18e1be1c9/rust-runtime/inlineable/src/server_operation_handler_trait.rs#L17-L21) after its construction in the (generated) `operation_registry.rs` file. The middleware should preserve the associated types of the `OperationHandler` (`Response = Response`, `Error = Infallible`) to cause minimal disruption. +This logging middleware should be applied outside of the [OperationHandler](https://github.com/smithy-lang/smithy-rs/blob/cd0563020abcde866a741fa123e3f2e18e1be1c9/rust-runtime/inlineable/src/server_operation_handler_trait.rs#L17-L21) after its construction in the (generated) `operation_registry.rs` file. The middleware should preserve the associated types of the `OperationHandler` (`Response = Response`, `Error = Infallible`) to cause minimal disruption. An easy position to apply the logging middleware is illustrated below in the form of `Logging{Operation}::new`: @@ -238,7 +238,7 @@ let routes = vec![ let router = aws_smithy_http_server::routing::Router::new_rest_json_router(routes); ``` -Although an acceptable first step, putting logging middleware here is suboptimal - the `Router` allows a `tower::Layer` to be applied to the operation by using the [Router::layer](https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L146) method. This middleware will be applied _outside_ of the logging middleware and, as a result, will not be subject to the span of any middleware. Therefore, the `Router` must be changed to allow for middleware to be applied within the logging middleware rather than outside of it. +Although an acceptable first step, putting logging middleware here is suboptimal - the `Router` allows a `tower::Layer` to be applied to the operation by using the [Router::layer](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L146) method. This middleware will be applied _outside_ of the logging middleware and, as a result, will not be subject to the span of any middleware. Therefore, the `Router` must be changed to allow for middleware to be applied within the logging middleware rather than outside of it. This is a general problem, not specific to this proposal. For example, [Use Request Extensions](#use-request-extensions) must also solve this problem. @@ -255,7 +255,7 @@ In the case of AWS JSON 1.0 and 1.1 protocols, the request URI is always `/`, pu A guideline should be made available, which includes: - The [HTTP bindings traits](#http-binding-traits) and why they are of concern in the presence of `@sensitive`. -- The [Debug implementation](https://github.com/awslabs/smithy-rs/pull/229) on structures. +- The [Debug implementation](https://github.com/smithy-lang/smithy-rs/pull/229) on structures. - How to use the `Sensitive` struct, HTTP wrappers, and the `unredacted-logging` feature flag described in [Debug Logging](#debug-logging) and [HTTP Debug/Display Wrappers](#http-debugdisplay-wrappers). - A warning against the two potential leaks described in [Scope and Guidelines](#scope-and-guidelines): - Sensitive data leaking from third-party dependencies. @@ -395,12 +395,12 @@ Code generation would be need to be used in order to produce the filtering crite ## Changes Checklist - [x] Implement and integrate code generated logging middleware. - - + - - [x] Add logging to `Router` implementation. - - + - - [x] Write developer guideline. - - + - - [x] Refactor `Router` to allow for better positioning described in [Middleware Position](#middleware-position). - - - - - - + - + - + - diff --git a/design/src/rfcs/rfc0019_event_streams_errors.md b/design/src/rfcs/rfc0019_event_streams_errors.md index 83311d902e7..78fd98228e4 100644 --- a/design/src/rfcs/rfc0019_event_streams_errors.md +++ b/design/src/rfcs/rfc0019_event_streams_errors.md @@ -46,7 +46,7 @@ In order to implement this feature: * Errors need to be marshalled and unmarshalled * `Receiver` must treat any error coming from the other end as terminal -The code examples below have been generated using the [following model](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server-test/model/pokemon.smithy#L27): +The code examples below have been generated using the [following model](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server-test/model/pokemon.smithy#L27): ```smithy @http(uri: "/capture-pokemon-event/{region}", method: "POST") operation CapturePokemonOperation { @@ -148,18 +148,18 @@ pub enum AttemptCapturingPokemonEventError { } ``` -Both are modeled as normal errors, where the [name](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) comes from `Error` with a prefix of the union's name. -In fact, both the [client](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L71) and [server](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L46) +Both are modeled as normal errors, where the [name](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) comes from `Error` with a prefix of the union's name. +In fact, both the [client](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L71) and [server](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L46) generate operation errors and event stream errors the same way. -Event stream errors have their own [marshaller](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt#L39). +Event stream errors have their own [marshaller](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt#L39). To make it work for users to stream errors, `EventStreamSender<>`, in addition to the union type `T`, takes an error type `E`; that is, the `AttemptCapturingPokemonEventError` in the example. -This means that an error from the stream is [marshalled and sent](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L137) as a data structure similarly to the union's non-error members. +This means that an error from the stream is [marshalled and sent](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L137) as a data structure similarly to the union's non-error members. -On the other side, the `Receiver<>` needs to terminate the stream upon [receiving any error](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L249). -A terminated stream has [no more data](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L38) and will always be a [bug](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L54) to use it. +On the other side, the `Receiver<>` needs to terminate the stream upon [receiving any error](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L249). +A terminated stream has [no more data](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L38) and will always be a [bug](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L54) to use it. -An example of how errors can be used on clients, extracted from [this test](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http-server/examples/pokemon_service/tests/simple_integration_test.rs#L100): +An example of how errors can be used on clients, extracted from [this test](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http-server/examples/pokemon_service/tests/simple_integration_test.rs#L100): ```rust,ignore yield Err(AttemptCapturingPokemonEventError::new( AttemptCapturingPokemonEventErrorKind::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()), diff --git a/design/src/rfcs/rfc0020_service_builder.md b/design/src/rfcs/rfc0020_service_builder.md index c6e18b9c102..fb9cad79cbb 100644 --- a/design/src/rfcs/rfc0020_service_builder.md +++ b/design/src/rfcs/rfc0020_service_builder.md @@ -79,7 +79,7 @@ pub trait Handler { Its purpose is to provide an even interface over closures of the form `FnOnce({Operation}Input) -> impl Future` and `FnOnce({Operation}Input, State) -> impl Future`. It's this abstraction which allows the customers to supply both `async fn handler(input: {Operation}Input) -> {Operation}Output` and `async fn handler(input: {Operation}Input, state: Extension) -> {Operation}Output` to the service builder. -We generate `Handler` implementations for said closures in [ServerOperationHandlerGenerator.kt](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt): +We generate `Handler` implementations for said closures in [ServerOperationHandlerGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt): ```rust,ignore impl Handler<(), Operation0Input> for Fun @@ -116,7 +116,7 @@ where } ``` -Creating `{Operation}Input` from a `http::Request` and `http::Response` from a `{Operation}Output` involves protocol aware serialization/deserialization, for example, it can involve the [HTTP binding traits](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html). The [RuntimeError](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/runtime_error.rs#L53-L5) enumerates error cases such as serialization/deserialization failures, `extensions().get::()` failures, etc. We omit error handling in the snippet above, but, in full, it also involves protocol aware conversions from the `RuntimeError` to `http::Response`. The reader should make note of the influence of the model on the different sections of this procedure. +Creating `{Operation}Input` from a `http::Request` and `http::Response` from a `{Operation}Output` involves protocol aware serialization/deserialization, for example, it can involve the [HTTP binding traits](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html). The [RuntimeError](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/runtime_error.rs#L53-L5) enumerates error cases such as serialization/deserialization failures, `extensions().get::()` failures, etc. We omit error handling in the snippet above, but, in full, it also involves protocol aware conversions from the `RuntimeError` to `http::Response`. The reader should make note of the influence of the model on the different sections of this procedure. The `request.extensions().get::()` present in the `Fun: FnOnce(Operation0Input, Extension) -> Fut` implementation is the current approach to injecting state into handlers. The customer is required to apply a [AddExtensionLayer](https://docs.rs/tower-http/latest/tower_http/add_extension/struct.AddExtensionLayer.html) to the output of the service builder so that, when the request reaches the handler, the `extensions().get::()` will succeed. @@ -147,7 +147,7 @@ where ### Builder -The service builder we provide to the customer is the `OperationRegistryBuilder`, generated from [ServerOperationRegistryGenerator.kt](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt). +The service builder we provide to the customer is the `OperationRegistryBuilder`, generated from [ServerOperationRegistryGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt). Currently, the reference model would generate the following `OperationRegistryBuilder` and `OperationRegistry`: @@ -221,7 +221,7 @@ where ### Router -The [aws_smithy_http::routing::Router](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L58-L60) provides the protocol aware routing of requests to their target , it exists as +The [aws_smithy_http::routing::Router](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L58-L60) provides the protocol aware routing of requests to their target , it exists as ```rust,ignore pub struct Route { @@ -739,7 +739,7 @@ Recall the form of the `Service::call` method, given in [Router](#router), which Two downsides of modelling `Router` in this way are: - `Router` is larger and has more branches than a protocol specific implementation. -- If a third-party wanted to extend `smithy-rs` to additional protocols `Routes` would have to be extended. A synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/awslabs/smithy-rs/issues/1606) issue. +- If a third-party wanted to extend `smithy-rs` to additional protocols `Routes` would have to be extended. A synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/smithy-lang/smithy-rs/issues/1606) issue. After taking the [Switch `From for Router` to an `OperationRegistry::build` method](#switch-fromoperationregistry-for-router-to-an-operationregistrybuild-method) transform, code generation is free to switch between return types based on the model. This allows for a scenario where a `@restJson1` causes the service builder to output a specific `RestJson1Router`. @@ -747,17 +747,17 @@ After taking the [Switch `From for Router` to an `OperationRe Currently, protocol specific routing errors are either: -- Converted to `RuntimeError`s and then `http::Response` (see [unknown_operation](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L106-L118)). -- Converted directly to a `http::Response` (see [method_not_allowed](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L121-L127)). This is an outlier to the common pattern. +- Converted to `RuntimeError`s and then `http::Response` (see [unknown_operation](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L106-L118)). +- Converted directly to a `http::Response` (see [method_not_allowed](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L121-L127)). This is an outlier to the common pattern. -The `from_request` functions yield protocol specific errors which are converted to `RequestRejection`s then `RuntimeError`s (see [ServerHttpBoundProtocolGenerator.kt](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L194-L210)). +The `from_request` functions yield protocol specific errors which are converted to `RequestRejection`s then `RuntimeError`s (see [ServerHttpBoundProtocolGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L194-L210)). In these scenarios protocol specific errors are converted into `RuntimeError` before being converted to a `http::Response` via `into_response` method. Two downsides of this are: - `RuntimeError` enumerates all possible errors across all existing protocols, so is larger than modelling the errors for a specific protocol. -- If a third-party wanted to extend `smithy-rs` to additional protocols with differing failure modes `RuntimeError` would have to be extended. As in [Protocol specific Errors](#protocol-specific-errors), a synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/awslabs/smithy-rs/issues/1606) issue. +- If a third-party wanted to extend `smithy-rs` to additional protocols with differing failure modes `RuntimeError` would have to be extended. As in [Protocol specific Errors](#protocol-specific-errors), a synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/smithy-lang/smithy-rs/issues/1606) issue. Switching from using `RuntimeError` to protocol specific errors which satisfy a common interface, `IntoResponse`, would resolve these problem. @@ -857,11 +857,11 @@ A toy implementation of the combined proposal is presented in [this PR](https:// ## Changes Checklist - [x] Add protocol specific routers to `rust-runtime/aws-smithy-http-server`. - - + - - [x] Add middleware primitives and error types to `rust-runtime/aws-smithy-http-server`. - - + - - [x] Add code generation which outputs new service builder. - - + - - [x] Deprecate `OperationRegistryBuilder`, `OperationRegistry` and `Router`. - - - - + - + - diff --git a/design/src/rfcs/rfc0023_refine_builder.md b/design/src/rfcs/rfc0023_refine_builder.md index 1c0b6f9786d..59e2808352c 100644 --- a/design/src/rfcs/rfc0023_refine_builder.md +++ b/design/src/rfcs/rfc0023_refine_builder.md @@ -782,13 +782,13 @@ The API proposed in this RFC has been manually implemented for the Pokemon servi ## Changes checklist - [x] Update `codegen-server` to generate the proposed service builder API - - + - - [x] Implement `Pluggable` for `PluginStack` - - + - - [x] Evaluate the introduction of a `PluginBuilder` as the primary API to compose multiple plugins (instead of `PluginStack::new(IdentityPlugin, IdentityPlugin).apply(...)`) - - + - [RFC 20]: rfc0020_service_builder.md -[Pokemon service]: https://github.com/awslabs/smithy-rs/blob/c7ddb164b28b920313432789cfe05d8112a035cc/codegen-core/common-test-models/pokemon.smithy +[Pokemon service]: https://github.com/smithy-lang/smithy-rs/blob/c7ddb164b28b920313432789cfe05d8112a035cc/codegen-core/common-test-models/pokemon.smithy [typestate builder pattern]: https://www.greyblake.com/blog/builder-with-typestate-in-rust/ [^further-dev-productivity-improvements]: The impact of a runtime error on developer productivity can be further minimised by encouraging adoption of integration testing; this can be achieved, among other options, by authoring guides that highlight its benefits and provide implementation guidance. diff --git a/design/src/rfcs/rfc0025_constraint_traits.md b/design/src/rfcs/rfc0025_constraint_traits.md index e3aaa323190..f6b446c0f46 100644 --- a/design/src/rfcs/rfc0025_constraint_traits.md +++ b/design/src/rfcs/rfc0025_constraint_traits.md @@ -10,8 +10,8 @@ RFC: Constraint traits > > See the uber [tracking issue] for pending work. -[builders-of-builders]: https://github.com/awslabs/smithy-rs/pull/1342 -[tracking issue]: https://github.com/awslabs/smithy-rs/issues/1401 +[builders-of-builders]: https://github.com/smithy-lang/smithy-rs/pull/1342 +[tracking issue]: https://github.com/smithy-lang/smithy-rs/issues/1401 [Constraint traits] are used to constrain the values that can be provided for a shape. @@ -74,7 +74,7 @@ The only constraint trait enforcement that is generated by smithy-rs clients should be and is the `enum` trait, which renders Rust `enum`s. The `required` trait is already and only enforced by smithy-rs servers since -[#1148](https://github.com/awslabs/smithy-rs/pull/1148). +[#1148](https://github.com/smithy-lang/smithy-rs/pull/1148). That leaves 4 traits: `length`, `pattern`, `range`, and `uniqueItems`. @@ -293,7 +293,7 @@ We will enforce this by copying _references_ to the `Vec`'s elements into a [`aws_smithy_types::Blob`]: https://docs.rs/aws-smithy-types/latest/aws_smithy_types/struct.Blob.html [`aws_smithy_http_server::rejection::SmithyRejection`]: https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/rejection/enum.SmithyRejection.html [`aws_smithy_http_server::rejection::Deserialize`]: https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/rejection/struct.Deserialize.html -[#1187]: https://github.com/awslabs/smithy-rs/issues/1187 +[#1187]: https://github.com/smithy-lang/smithy-rs/issues/1187 [`once_cell`]: https://docs.rs/once_cell/latest/once_cell/ Trait precedence and naming of the tuple struct @@ -359,7 +359,7 @@ Unresolved questions - UPDATE: We decided to punt on this until users express interest. [`NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html -[Better Constraint Violations]: https://github.com/awslabs/smithy-rs/pull/2040 +[Better Constraint Violations]: https://github.com/smithy-lang/smithy-rs/pull/2040 Alternative design ------------------ diff --git a/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md b/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md index 719f2ef9fd3..d197d8bac74 100644 --- a/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md +++ b/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md @@ -1,7 +1,7 @@ RFC: SDK Credential Cache Type Safety ===================================== -> Status: Implemented in [smithy-rs#2122](https://github.com/awslabs/smithy-rs/pull/2122) +> Status: Implemented in [smithy-rs#2122](https://github.com/smithy-lang/smithy-rs/pull/2122) > > Applies to: AWS SDK for Rust diff --git a/design/src/rfcs/rfc0029_new_home_for_cred_types.md b/design/src/rfcs/rfc0029_new_home_for_cred_types.md index e864bd7d5bc..ab0b638b3a1 100644 --- a/design/src/rfcs/rfc0029_new_home_for_cred_types.md +++ b/design/src/rfcs/rfc0029_new_home_for_cred_types.md @@ -1,11 +1,11 @@ RFC: Finding New Home for Credential Types =================================================== -> Status: Implemented in [smithy-rs#2108](https://github.com/awslabs/smithy-rs/pull/2108) +> Status: Implemented in [smithy-rs#2108](https://github.com/smithy-lang/smithy-rs/pull/2108) > > Applies to: clients -This RFC supplements [RFC 28](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md) and discusses for the selected design where to place the types for credentials providers, credentials caching, and everything else that comes with them. +This RFC supplements [RFC 28](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md) and discusses for the selected design where to place the types for credentials providers, credentials caching, and everything else that comes with them. It is assumed that the primary motivation behind the introduction of type safe credentials caching remains the same as the preceding RFC. diff --git a/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md b/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md index f6e76e87a8e..a02aa68b502 100644 --- a/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md +++ b/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md @@ -1,6 +1,6 @@ RFC: Providing fallback credentials on external timeout ======================================================= -> Status: Implemented in [smithy-rs#2246](https://github.com/awslabs/smithy-rs/pull/2246) +> Status: Implemented in [smithy-rs#2246](https://github.com/smithy-lang/smithy-rs/pull/2246) > > Applies to: client diff --git a/design/src/rfcs/rfc0032_better_constraint_violations.md b/design/src/rfcs/rfc0032_better_constraint_violations.md index 6b44d27835c..4c7b777541d 100644 --- a/design/src/rfcs/rfc0032_better_constraint_violations.md +++ b/design/src/rfcs/rfc0032_better_constraint_violations.md @@ -21,9 +21,9 @@ Note: code snippets from generated SDKs in this document are abridged so as to be didactic and relevant to the point being made. They are accurate with regards to commit [`2226fe`]. -[constraint-traits-rfc]: https://github.com/awslabs/smithy-rs/pull/1199 -[builders-of-builders-pr]: https://github.com/awslabs/smithy-rs/pull/1342 -[`2226fe`]: https://github.com/awslabs/smithy-rs/tree/2226feff8f7fa884204f81a50d7e016386912acc +[constraint-traits-rfc]: https://github.com/smithy-lang/smithy-rs/pull/1199 +[builders-of-builders-pr]: https://github.com/smithy-lang/smithy-rs/pull/1342 +[`2226fe`]: https://github.com/smithy-lang/smithy-rs/tree/2226feff8f7fa884204f81a50d7e016386912acc [constraint traits]: https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html Terminology @@ -244,7 +244,7 @@ docs, nor have to `match` on these variants when handling errors. Note: [this comment] alludes to the problem described above. -[this comment]: https://github.com/awslabs/smithy-rs/blob/27020be3421fb93e35692803f9a795f92feb1d19/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt#L66-L69 +[this comment]: https://github.com/smithy-lang/smithy-rs/blob/27020be3421fb93e35692803f9a795f92feb1d19/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt#L66-L69 ### Solution proposal @@ -276,7 +276,7 @@ pub mod length_map { ``` Note that, to some extent, the spirit of this approach is [already currently -present](https://github.com/awslabs/smithy-rs/blob/9a4c1f304f6f5237d480cfb56dad2951d927d424/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt#L78-L81) +present](https://github.com/smithy-lang/smithy-rs/blob/9a4c1f304f6f5237d480cfb56dad2951d927d424/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt#L78-L81) in the case of builder types when `publicConstrainedTypes` is set to `false`: 1. [`ServerBuilderGenerator.kt`] renders the usual builder type that enforces @@ -286,8 +286,8 @@ in the case of builder types when `publicConstrainedTypes` is set to `false`: builder type the user is exposed to: this builder does not take in constrained types and does not enforce all modeled constraints. -[`ServerBuilderGenerator.kt`]: https://github.com/awslabs/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt -[`ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt`]: https://github.com/awslabs/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt +[`ServerBuilderGenerator.kt`]: https://github.com/smithy-lang/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt +[`ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt`]: https://github.com/smithy-lang/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt Collecting constraint violations -------------------------------- @@ -342,7 +342,7 @@ list ValidationExceptionFieldList { ``` It was mentioned in the [constraint traits -RFC](https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809300673), and +RFC](https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809300673), and implicit in the definition of Smithy's [`smithy.framework.ValidationException`](https://github.com/awslabs/smithy/blob/main/smithy-validation-model/model/smithy.framework.validation.smithy) shape, that server frameworks should respond with a _complete_ collection of @@ -392,7 +392,7 @@ impl LengthPatternString { pub fn compile_regex() -> &'static regex::Regex { static REGEX: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| { - regex::Regex::new(r#"[a-f0-5]*"#).expect(r#"The regular expression [a-f0-5]* is not supported by the `regex` crate; feel free to file an issue under https://github.com/awslabs/smithy-rs/issues for support"#) + regex::Regex::new(r#"[a-f0-5]*"#).expect(r#"The regular expression [a-f0-5]* is not supported by the `regex` crate; feel free to file an issue under https://github.com/smithy-lang/smithy-rs/issues for support"#) }); ®EX @@ -518,7 +518,7 @@ due to performance concerns. This RFC advocates for implementing the first option, arguing that [it's fair to say that the framework should return an error that is as informative as possible, but it doesn't necessarily have to be -complete](https://github.com/awslabs/smithy-rs/pull/2040#discussion_r1036226762). +complete](https://github.com/smithy-lang/smithy-rs/pull/2040#discussion_r1036226762). However, we will also write a layer, applied by default to all server SDKs, that bounds a request body's size to a reasonable (yet high) default. Relying on users to manually apply the layer is dangerous, since such a configuration diff --git a/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md b/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md index 9ec673248c5..488b5f324de 100644 --- a/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md +++ b/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md @@ -1,7 +1,7 @@ RFC: Improving access to request IDs in SDK clients =================================================== -> Status: Implemented in [#2129](https://github.com/awslabs/smithy-rs/pull/2129) +> Status: Implemented in [#2129](https://github.com/smithy-lang/smithy-rs/pull/2129) > > Applies to: AWS SDK clients diff --git a/design/src/server/anatomy.md b/design/src/server/anatomy.md index 51462028779..47ace208270 100644 --- a/design/src/server/anatomy.md +++ b/design/src/server/anatomy.md @@ -4,7 +4,7 @@ What is [Smithy](https://awslabs.github.io/smithy/2.0/index.html)? At a high-lev This survey is disinterested in the actual Kotlin implementation of the code generator, and instead focuses on the structure of the generated Rust code and how it relates to the Smithy model. The intended audience is new contributors and users interested in internal details. -During the survey we will use the [`pokemon.smithy`](https://github.com/awslabs/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) model as a reference: +During the survey we will use the [`pokemon.smithy`](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) model as a reference: ```smithy /// A Pokémon species forms the basis for at least one Pokémon. @@ -228,7 +228,7 @@ To summarize a _model service_ constructed can be constructed from a `Handler` o ## Serialization and Deserialization -A [Smithy protocol](https://awslabs.github.io/smithy/2.0/spec/protocol-traits.html#serialization-and-protocol-traits) specifies the serialization/deserialization scheme - how a HTTP request is transformed into a modelled input and a modelled output to a HTTP response. The is formalized using the [`FromRequest`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromRequest.html) and [`IntoResponse`](https://github.com/awslabs/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/response.rs#L40-L44) traits: +A [Smithy protocol](https://awslabs.github.io/smithy/2.0/spec/protocol-traits.html#serialization-and-protocol-traits) specifies the serialization/deserialization scheme - how a HTTP request is transformed into a modelled input and a modelled output to a HTTP response. The is formalized using the [`FromRequest`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromRequest.html) and [`IntoResponse`](https://github.com/smithy-lang/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/response.rs#L40-L44) traits: ```rust # extern crate aws_smithy_http_server; @@ -445,7 +445,7 @@ pub trait Plugin { # } ``` -An example `Plugin` implementation can be found in [/examples/pokemon-service/src/plugin.rs](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs). +An example `Plugin` implementation can be found in [/examples/pokemon-service/src/plugin.rs](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs). Plugins can be applied in two places: @@ -602,7 +602,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g } ``` -Handlers and operations are upgraded to a [`Route`](https://github.com/awslabs/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/routing/route.rs#L49-L52) as soon as they are registered against the service builder. You can think of `Route` as a boxing layer in disguise. +Handlers and operations are upgraded to a [`Route`](https://github.com/smithy-lang/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/routing/route.rs#L49-L52) as soon as they are registered against the service builder. You can think of `Route` as a boxing layer in disguise. You can transform a builder instance into a complete service (`PokemonService`) using one of the following methods: diff --git a/design/src/server/code_generation.md b/design/src/server/code_generation.md index f65c08d2f1d..e1f0f2dfd39 100644 --- a/design/src/server/code_generation.md +++ b/design/src/server/code_generation.md @@ -72,29 +72,29 @@ in which all dependencies are written into their modules and `lib.rs` is generat `execute()` ends by running [cargo fmt][26], to avoid having to format correctly Rust in `Writer`s and to be sure the generated code follows the styling rules. -[1]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/CargoDependency.kt#L95-L95 +[1]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/CargoDependency.kt#L95-L95 [2]: https://docs.rs/aws-smithy-eventstream -[3]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L34 +[3]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L34 [4]: https://github.com/awslabs/smithy/tree/main/smithy-build [5]: https://github.com/awslabs/smithy [6]: https://awslabs.github.io/smithy/1.0/guides/building-models/gradle-plugin.html -[7]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt#L45 -[8]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L115-L115 -[9]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L44 -[10]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt#L363-L363 -[11]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustTypes.kt#L25-L25 -[12]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RuntimeTypes.kt#L113-L113 +[7]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt#L45 +[8]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L115-L115 +[9]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L44 +[10]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt#L363-L363 +[11]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustTypes.kt#L25-L25 +[12]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RuntimeTypes.kt#L113-L113 [13]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#shape-id -[14]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L65-L65 -[15]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/StreamingTraitSymbolProvider.kt#L26-L26 -[16]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L62-L62 -[17]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L26-L26 -[18]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L38-L38 -[19]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/OperationNormalizer.kt#L52-L52 -[20]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L119-L119 -[21]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L150-L150 -[22]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L172-L172 -[23]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L119-L126 -[24]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L42-L42 -[25]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L96-L107 -[26]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L133-L133 +[14]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L65-L65 +[15]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/StreamingTraitSymbolProvider.kt#L26-L26 +[16]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L62-L62 +[17]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L26-L26 +[18]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L38-L38 +[19]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/OperationNormalizer.kt#L52-L52 +[20]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L119-L119 +[21]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L150-L150 +[22]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L172-L172 +[23]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L119-L126 +[24]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L42-L42 +[25]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L96-L107 +[26]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L133-L133 diff --git a/design/src/server/middleware.md b/design/src/server/middleware.md index 589fb0770ca..67802317bcf 100644 --- a/design/src/server/middleware.md +++ b/design/src/server/middleware.md @@ -2,7 +2,7 @@ The following document provides a brief survey of the various positions middleware can be inserted in Smithy Rust. -We use the [Pokémon service](https://github.com/awslabs/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) as a reference model throughout. +We use the [Pokémon service](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) as a reference model throughout. ```smithy /// A Pokémon species forms the basis for at least one Pokémon. diff --git a/design/src/smithy/aggregate_shapes.md b/design/src/smithy/aggregate_shapes.md index 0dafac77f9e..41569107dc7 100644 --- a/design/src/smithy/aggregate_shapes.md +++ b/design/src/smithy/aggregate_shapes.md @@ -8,7 +8,7 @@ | [Structure](#structure) | `struct` | | [Union](#union) | `enum` | -Most generated types are controlled by [SymbolVisitor](https://github.com/awslabs/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). +Most generated types are controlled by [SymbolVisitor](https://github.com/smithy-lang/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). ## List List objects in Smithy are transformed into vectors in Rust. Based on the output of the [NullableIndex](https://awslabs.github.io/smithy/javadoc/1.5.1/software/amazon/smithy/model/knowledge/NullableIndex.html), the generated list may be `Vec` or `Vec>`. @@ -121,7 +121,7 @@ impl IoUsage { Smithy `Union` is modeled as `enum` in Rust. 1. Generated `enum`s must be marked `#[non_exhaustive]`. -2. Generated `enum`s must provide an `Unknown` variant. If parsing receives an unknown input that doesn't match any of the given union variants, `Unknown` should be constructed. [Tracking Issue](https://github.com/awslabs/smithy-rs/issues/185). +2. Generated `enum`s must provide an `Unknown` variant. If parsing receives an unknown input that doesn't match any of the given union variants, `Unknown` should be constructed. [Tracking Issue](https://github.com/smithy-lang/smithy-rs/issues/185). 3. Union members (enum variants) are **not** nullable, because Smithy union members cannot contain null values. 4. When union members contain references to other shapes, we generate a wrapping variant (see below). 5. Union members do not require `#[non_exhaustive]`, because changing the shape targeted by a union member is not backwards compatible. diff --git a/design/src/smithy/event_streams.md b/design/src/smithy/event_streams.md index 47d08d6836e..c2b77d98fb1 100644 --- a/design/src/smithy/event_streams.md +++ b/design/src/smithy/event_streams.md @@ -14,7 +14,7 @@ This document describes: The user experience ---------------------------------------------- -Let us take [the following model](https://github.com/awslabs/smithy-rs/pull/1479/files#diff-ae332acd4a848e840d018d3b8616e40031f9e8f96ed89777dea69eb1f51a89a4R25) as an example: +Let us take [the following model](https://github.com/smithy-lang/smithy-rs/pull/1479/files#diff-ae332acd4a848e840d018d3b8616e40031f9e8f96ed89777dea69eb1f51a89a4R25) as an example: ```smithy @http(uri: "/capture-pokemon-event/{region}", method: "POST") operation CapturePokemonOperation { @@ -197,7 +197,7 @@ pub struct CapturePokemonOperationInput { } ``` Note they are similar, but the client uses an `EventStreamSender` (this is an input structure) and the server a `Receiver` (the server receives the input). -Sender is [chosen according](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L58) to if the +Sender is [chosen according](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L58) to if the generation target is the client and the union is in an input structure; or if this is a server sending from an operation's output. The error structs are generated as any operation error, where the union shape is treated as an operation: @@ -216,7 +216,7 @@ pub enum AttemptCapturingPokemonEventError { MasterBallUnsuccessful(crate::error::MasterBallUnsuccessful), } ``` -The errors are similar to any operation error, but their [name](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) is `Error` prefixed by the name of the union. +The errors are similar to any operation error, but their [name](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) is `Error` prefixed by the name of the union. The reason for splitting up errors and non-errors in the event stream union is to give a more Rust-like experience to customers, where they can `yield` and `match` on errors `Err(UnionError::Variant)` as a result of the event stream communication, rather than matching on the specific variant, `Ok(Union::Variant) => /* handle error */`. @@ -238,8 +238,8 @@ aws_smithy_http::event_stream::Receiver< ``` and errors propagated as such to terminate the stream. -An [EventStreamSender](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L18) wraps an input stream -into a [MessageStreamAdapter](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L132), which implements +An [EventStreamSender](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L18) wraps an input stream +into a [MessageStreamAdapter](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L132), which implements the [Stream](https://docs.rs/futures-core/0.3.21/futures_core/stream/trait.Stream.html) trait. At a high level, `poll_next` works by: 1. Polling the customer stream 2. If there is an event: @@ -248,13 +248,13 @@ the [Stream](https://docs.rs/futures-core/0.3.21/futures_core/stream/trait.Strea 3. Sign the marshalled data and return it 3. Otherwise, signal to poll back later -Similarly, the [Receiver](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L125) handles the receiving side of the stream. +Similarly, the [Receiver](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L125) handles the receiving side of the stream. The `Receiver` has more logic to handle buffering data and possibly errors. Server and client serialize similarly. Serializing for `CapturePokemonOperation` on the server, with `serialize_capture_pokemon_operation_response`: 1. Sets the `content-type` HTTP header to `application/vnd.amazon.eventstream` 2. Converts the `EventStreamSender` in the event stream structure into a `MessageStreamAdapter` with a marshaller for the error and data types - 1. [This](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L511) is where it is generated + 1. [This](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L511) is where it is generated 3. Gives the body back to hyper ```rust let body = @@ -269,13 +269,13 @@ let body = adapter })); ``` -The signer signs the message to be sent. [NoOpSigner](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L37) returns the message as is, `SigV4Signer` signs using the AWS SigV4 protocol. SigV4 requires an empty-payload signed message to be sent before effectively terminating the stream; to keep the same interface, `SignMessage::sign_empty` returns an `Option` to signal whether signing this last empty message is required. +The signer signs the message to be sent. [NoOpSigner](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L37) returns the message as is, `SigV4Signer` signs using the AWS SigV4 protocol. SigV4 requires an empty-payload signed message to be sent before effectively terminating the stream; to keep the same interface, `SignMessage::sign_empty` returns an `Option` to signal whether signing this last empty message is required. -The marshallers set header and payload in a [Message](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L368) structure: `Message` is a structure with a vector, the headers; and bytes, the payload. +The marshallers set header and payload in a [Message](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L368) structure: `Message` is a structure with a vector, the headers; and bytes, the payload. The headers are the values targeted by the `@eventHeader` trait and the payload by `@eventPayload`. At the end of the marshalling and signing processes, `MessageStreamAdapter` takes the `Message` built by the marshaller and signer -and [writes](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L224) it as bytes into a `Vec`, +and [writes](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L224) it as bytes into a `Vec`, in a format of a sequence of bytes: `` where `type` indicates if the `data` is a bool, integer and so on for all types. Headers that are sent are: @@ -288,10 +288,10 @@ The way errors are marshalled, unmarshalled and signed is the same as above. #### Generating errors Event stream errors in unions are generated in the same way for operation errors: -In fact, the implementation uses the same [render](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L47) functions; +In fact, the implementation uses the same [render](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L47) functions; the only difference between client and server is that the server does not generate anything unless the structure has errors, while the client always generates a structure for forward compatibility with at least a `Unhandled` error kind. -This is also the reason for the default [MessageStreamError](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L52) for servers. +This is also the reason for the default [MessageStreamError](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L52) for servers. The main differences between the EventStreamErrorMarshallerGenerator and EventStreamMarshallerGenerator are that the former: * takes into account the differences between client and server in how error symbols are laid out (with a `kind` member or `Kind` suffix) diff --git a/design/src/smithy/overview.md b/design/src/smithy/overview.md index 128ce256267..f894c7e9d01 100644 --- a/design/src/smithy/overview.md +++ b/design/src/smithy/overview.md @@ -7,8 +7,8 @@ Design documentation here covers both our implementation of Smithy Primitives (e Smithy introduces a few concepts that are defined here: 1. Shape: The core Smithy primitive. A smithy model is composed of nested shapes defining an API. -2. `Symbol`: A Representation of a type including namespaces and any dependencies required to use a type. A shape can be converted into a symbol by a `SymbolVisitor`. A `SymbolVisitor` maps shapes to types in your programming language (e.g. Rust). In the Rust SDK, see [SymbolVisitor.kt](https://github.com/awslabs/smithy-rs/blob/c049a37f8cba5f9bec2e96c28db83e7efb2edc53/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). Symbol visitors are composable—many specific behaviors are mixed in via small & focused symbol providers, e.g. support for the streaming trait is mixed in separately. -3. `Writer`: Writers are code generation primitives that collect code prior to being written to a file. Writers enable language specific helpers to be added to simplify codegen for a given language. For example, `smithy-rs` adds `rustBlock` to [`RustWriter`](https://github.com/awslabs/smithy-rs/blob/908dec558e26bbae6fe4b7d9d1c221dd81699b59/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustWriter.kt) to create a "Rust block" of code. +2. `Symbol`: A Representation of a type including namespaces and any dependencies required to use a type. A shape can be converted into a symbol by a `SymbolVisitor`. A `SymbolVisitor` maps shapes to types in your programming language (e.g. Rust). In the Rust SDK, see [SymbolVisitor.kt](https://github.com/smithy-lang/smithy-rs/blob/c049a37f8cba5f9bec2e96c28db83e7efb2edc53/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). Symbol visitors are composable—many specific behaviors are mixed in via small & focused symbol providers, e.g. support for the streaming trait is mixed in separately. +3. `Writer`: Writers are code generation primitives that collect code prior to being written to a file. Writers enable language specific helpers to be added to simplify codegen for a given language. For example, `smithy-rs` adds `rustBlock` to [`RustWriter`](https://github.com/smithy-lang/smithy-rs/blob/908dec558e26bbae6fe4b7d9d1c221dd81699b59/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustWriter.kt) to create a "Rust block" of code. ```kotlin writer.rustBlock("struct Model") { model.fields.forEach { diff --git a/design/src/smithy/recursive_shapes.md b/design/src/smithy/recursive_shapes.md index 1697fb0ddbe..8dfac6d23dd 100644 --- a/design/src/smithy/recursive_shapes.md +++ b/design/src/smithy/recursive_shapes.md @@ -23,7 +23,7 @@ struct IntermediateStructure { = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `main::TopStructure` representable ``` -This occurs because Rust types must be a size known at compile time. The way around this, as the message suggests, is to Box the offending type. `smithy-rs` implements this design in [RecursiveShapeBoxer.kt](https://github.com/awslabs/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/RecursiveShapeBoxer.kt) +This occurs because Rust types must be a size known at compile time. The way around this, as the message suggests, is to Box the offending type. `smithy-rs` implements this design in [RecursiveShapeBoxer.kt](https://github.com/smithy-lang/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/RecursiveShapeBoxer.kt) To support this, as the message suggests, we must "`Box`" the offending type. There is a touch of trickiness—only one element in the cycle needs to be boxed, but we need to select it deterministically such that we always pick the same element between multiple codegen runs. To do this the Rust SDK will: diff --git a/design/src/smithy/simple_shapes.md b/design/src/smithy/simple_shapes.md index 9e2c99b434d..45177c4021e 100644 --- a/design/src/smithy/simple_shapes.md +++ b/design/src/smithy/simple_shapes.md @@ -12,8 +12,8 @@ | double | `f64` | | [bigInteger](#big-numbers) | `BigInteger` (Not implemented yet) | | [bigDecimal](#big-numbers) | `BigDecimal` (Not implemented yet) | -| [timestamp](#timestamps) | [`DateTime`](https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-types/src/date_time/mod.rs) | -| [document](#documents) | [`Document`](https://github.com/awslabs/smithy-rs/blob/v0.14/rust-runtime/aws-smithy-types/src/lib.rs#L38-L52) | +| [timestamp](#timestamps) | [`DateTime`](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-types/src/date_time/mod.rs) | +| [document](#documents) | [`Document`](https://github.com/smithy-lang/smithy-rs/blob/v0.14/rust-runtime/aws-smithy-types/src/lib.rs#L38-L52) | ### Big Numbers Rust currently has no standard library or universally accepted large-number crate. Until one is stabilized, a string representation is a reasonable compromise: @@ -25,7 +25,7 @@ pub struct BigDecimal(String); This will enable us to add helpers over time as requested. Users will also be able to define their own conversions into their preferred large-number libraries. -As of 5/23/2021 BigInteger / BigDecimal are not included in AWS models. Implementation is tracked [here](https://github.com/awslabs/smithy-rs/issues/312). +As of 5/23/2021 BigInteger / BigDecimal are not included in AWS models. Implementation is tracked [here](https://github.com/smithy-lang/smithy-rs/issues/312). ### Timestamps [chrono](https://github.com/chronotope/chrono) is the current de facto library for datetime in Rust, but it is pre-1.0. DateTimes are represented by an SDK defined structure modeled on `std::time::Duration` from the Rust standard library. diff --git a/examples/BENCHMARKS.md b/examples/BENCHMARKS.md index bbc33c7b976..8caf3a74b06 100644 --- a/examples/BENCHMARKS.md +++ b/examples/BENCHMARKS.md @@ -14,7 +14,7 @@ using [wrk](https://github.com/wg/wrk). -## [2022-03-04](https://github.com/awslabs/smithy-rs/commit/d823f61156577ab42590709627906d1dc35a5f49) +## [2022-03-04](https://github.com/smithy-lang/smithy-rs/commit/d823f61156577ab42590709627906d1dc35a5f49) The benchmark runs against the `empty_operation()` operation, which is just returning an empty output and can be used to stress test the framework overhead. diff --git a/examples/pokemon-service-client-usage/README.md b/examples/pokemon-service-client-usage/README.md index f2b90eea952..08021c37e82 100644 --- a/examples/pokemon-service-client-usage/README.md +++ b/examples/pokemon-service-client-usage/README.md @@ -6,14 +6,14 @@ with a Smithy-based service. ## Pre-requisites 1. Build the `pokemon-service-client` and `pokemon-service` by invoking `make` in the - [examples](https://github.com/awslabs/smithy-rs/tree/main/examples) folder. + [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder. ```console make ``` 2. Run the Pokemon service locally by issuing the following command from the - [examples](https://github.com/awslabs/smithy-rs/tree/main/examples) folder. This + [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder. This will launch the Smithy-Rs based service on TCP port 13734. ```console @@ -23,7 +23,7 @@ cargo run --bin pokemon-service ## Running the examples You can view a list of examples by running `cargo run --example` from the -[pokemon-service-client-usage](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage) +[pokemon-service-client-usage](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage) folder. To run an example, pass its name to the `cargo run --example` command, e.g.: ```console diff --git a/examples/pokemon-service-client-usage/examples/client-connector.rs b/examples/pokemon-service-client-usage/examples/client-connector.rs index 61efcc0f69a..b1a7ecef846 100644 --- a/examples/pokemon-service-client-usage/examples/client-connector.rs +++ b/examples/pokemon-service-client-usage/examples/client-connector.rs @@ -6,7 +6,7 @@ /// trusted root certificates to use for HTTPs communication. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example client-connector`. diff --git a/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs b/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs index b01d1fe2bb8..997cce306e3 100644 --- a/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs +++ b/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs @@ -7,7 +7,7 @@ /// the interceptor. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example custom-header-using-interceptor`. diff --git a/examples/pokemon-service-client-usage/examples/custom-header.rs b/examples/pokemon-service-client-usage/examples/custom-header.rs index 98dc20e2d5b..d84432f68c2 100644 --- a/examples/pokemon-service-client-usage/examples/custom-header.rs +++ b/examples/pokemon-service-client-usage/examples/custom-header.rs @@ -6,7 +6,7 @@ /// headers in the request. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example custom-header` diff --git a/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs b/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs index d37479fa6cb..565efb18acd 100644 --- a/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs +++ b/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs @@ -7,7 +7,7 @@ /// builder. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example endpoint-resolver`. diff --git a/examples/pokemon-service-client-usage/examples/handling-errors.rs b/examples/pokemon-service-client-usage/examples/handling-errors.rs index ee1da30cbb8..af1c230cdcd 100644 --- a/examples/pokemon-service-client-usage/examples/handling-errors.rs +++ b/examples/pokemon-service-client-usage/examples/handling-errors.rs @@ -7,7 +7,7 @@ /// This example demonstrates how to handle service generated errors. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example handling-errors`. @@ -46,7 +46,7 @@ async fn main() { // The following example sends an incorrect passcode to the operation `get_storage`, // which will return - // [StorageAccessNotAuthorized](https://github.com/awslabs/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy#L48) + // [StorageAccessNotAuthorized](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy#L48) let response_result = client .get_storage() .user("ash") diff --git a/examples/pokemon-service-client-usage/examples/mock-request.rs b/examples/pokemon-service-client-usage/examples/mock-request.rs index 1206f3e66f7..5afafdaee14 100644 --- a/examples/pokemon-service-client-usage/examples/mock-request.rs +++ b/examples/pokemon-service-client-usage/examples/mock-request.rs @@ -7,7 +7,7 @@ /// can later be asserted to verify that the correct headers and body were sent to the server. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example mock-request`. diff --git a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs index d226ce4a3dd..9776d5186b8 100644 --- a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs +++ b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs @@ -6,7 +6,7 @@ /// into the output type. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example response-header-interceptor`. diff --git a/examples/pokemon-service-client-usage/examples/retry-classifier.rs b/examples/pokemon-service-client-usage/examples/retry-classifier.rs index 7ff17f0e668..c979bcc5bd4 100644 --- a/examples/pokemon-service-client-usage/examples/retry-classifier.rs +++ b/examples/pokemon-service-client-usage/examples/retry-classifier.rs @@ -6,7 +6,7 @@ /// which error conditions should be retried. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example retry-classifier`. diff --git a/examples/pokemon-service-client-usage/examples/retry-customize.rs b/examples/pokemon-service-client-usage/examples/retry-customize.rs index 5deb3af0ffa..13c67af4655 100644 --- a/examples/pokemon-service-client-usage/examples/retry-customize.rs +++ b/examples/pokemon-service-client-usage/examples/retry-customize.rs @@ -5,7 +5,7 @@ /// This example demonstrates how to customize retry settings on a Smithy client. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example retry-customize`. diff --git a/examples/pokemon-service-client-usage/examples/simple-client.rs b/examples/pokemon-service-client-usage/examples/simple-client.rs index e04e2345e82..dbc7303386a 100644 --- a/examples/pokemon-service-client-usage/examples/simple-client.rs +++ b/examples/pokemon-service-client-usage/examples/simple-client.rs @@ -6,7 +6,7 @@ /// [operation](https://smithy.io/2.0/spec/idl.html?highlight=operation#operation-shape). /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example simple-client`. diff --git a/examples/pokemon-service-client-usage/examples/timeout-config.rs b/examples/pokemon-service-client-usage/examples/timeout-config.rs index cbfbb8e7e45..717961fb96a 100644 --- a/examples/pokemon-service-client-usage/examples/timeout-config.rs +++ b/examples/pokemon-service-client-usage/examples/timeout-config.rs @@ -6,7 +6,7 @@ /// and operation related timeouts on the client. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example timeout-config` diff --git a/examples/pokemon-service-client-usage/examples/trace-serialize.rs b/examples/pokemon-service-client-usage/examples/trace-serialize.rs index 7826679e2ed..069aebe831e 100644 --- a/examples/pokemon-service-client-usage/examples/trace-serialize.rs +++ b/examples/pokemon-service-client-usage/examples/trace-serialize.rs @@ -9,7 +9,7 @@ /// purposes and may be useful in debugging scenarios. Please don't use this as-is in production. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example trace-serialize`. diff --git a/examples/pokemon-service-client-usage/examples/use-config-bag.rs b/examples/pokemon-service-client-usage/examples/use-config-bag.rs index 32fc40723fd..9452051a6da 100644 --- a/examples/pokemon-service-client-usage/examples/use-config-bag.rs +++ b/examples/pokemon-service-client-usage/examples/use-config-bag.rs @@ -6,7 +6,7 @@ /// state from one interceptor to the next. /// /// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/awslabs/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) /// file for instructions on how to launch the service locally. /// /// The example can be run using `cargo run --example use-config-bag`. diff --git a/gradle.properties b/gradle.properties index 738cafd150f..edbcde3ad7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,7 +35,7 @@ kotestVersion=5.2.3 # Avoid registering dependencies/plugins/tasks that are only used for testing purposes isTestingEnabled=true -# TODO(https://github.com/awslabs/smithy-rs/issues/1068): Once doc normalization +# TODO(https://github.com/smithy-lang/smithy-rs/issues/1068): Once doc normalization # is completed, warnings can be prohibited in rustdoc. # # defaultRustDocFlags=-D warnings diff --git a/rust-runtime/aws-smithy-async/Cargo.toml b/rust-runtime/aws-smithy-async/Cargo.toml index 9b2535dd12d..6e1a5f3c436 100644 --- a/rust-runtime/aws-smithy-async/Cargo.toml +++ b/rust-runtime/aws-smithy-async/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-checksums/Cargo.toml b/rust-runtime/aws-smithy-checksums/Cargo.toml index b02b34cc092..2485412d72d 100644 --- a/rust-runtime/aws-smithy-checksums/Cargo.toml +++ b/rust-runtime/aws-smithy-checksums/Cargo.toml @@ -8,7 +8,7 @@ authors = [ description = "Checksum calculation and verification callbacks" edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/rust-runtime/aws-smithy-checksums/README.md b/rust-runtime/aws-smithy-checksums/README.md index 3ad53131f6c..94909aa8bef 100644 --- a/rust-runtime/aws-smithy-checksums/README.md +++ b/rust-runtime/aws-smithy-checksums/README.md @@ -1,7 +1,7 @@ # aws-smithy-checksum-callbacks -Checksum calculation and verification callbacks for HTTP request and response bodies sent by service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs). +Checksum calculation and verification callbacks for HTTP request and response bodies sent by service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs). -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-checksums/src/lib.rs b/rust-runtime/aws-smithy-checksums/src/lib.rs index 9207cc3ee6f..372bc467e43 100644 --- a/rust-runtime/aws-smithy-checksums/src/lib.rs +++ b/rust-runtime/aws-smithy-checksums/src/lib.rs @@ -328,7 +328,7 @@ mod tests { } // TODO(https://github.com/zowens/crc32c/issues/34) - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))] #[test] fn test_crc32c_checksum() { diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index 0eb190b56dc..a480618b617 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-eventstream/Cargo.toml b/rust-runtime/aws-smithy-eventstream/Cargo.toml index c6a3e6782f1..6923fb9d7a1 100644 --- a/rust-runtime/aws-smithy-eventstream/Cargo.toml +++ b/rust-runtime/aws-smithy-eventstream/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-eventstream/external-types.toml b/rust-runtime/aws-smithy-eventstream/external-types.toml index 2e54673ff5d..b6185a2ebf0 100644 --- a/rust-runtime/aws-smithy-eventstream/external-types.toml +++ b/rust-runtime/aws-smithy-eventstream/external-types.toml @@ -4,6 +4,6 @@ allowed_external_types = [ "bytes::buf::buf_mut::BufMut", "bytes::bytes::Bytes", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `derive-arbitrary` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `derive-arbitrary` feature "arbitrary::Arbitrary", ] diff --git a/rust-runtime/aws-smithy-http-auth/Cargo.toml b/rust-runtime/aws-smithy-http-auth/Cargo.toml index 4fef70bc0d6..67de7ed7e1e 100644 --- a/rust-runtime/aws-smithy-http-auth/Cargo.toml +++ b/rust-runtime/aws-smithy-http-auth/Cargo.toml @@ -8,7 +8,7 @@ authors = [ description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] diff --git a/rust-runtime/aws-smithy-http-auth/README.md b/rust-runtime/aws-smithy-http-auth/README.md index 38d5d2dc0b1..719b5202d37 100644 --- a/rust-runtime/aws-smithy-http-auth/README.md +++ b/rust-runtime/aws-smithy-http-auth/README.md @@ -3,5 +3,5 @@ This crate is no longer used by smithy-rs and is deprecated. Its equivalent logic is now in aws-smithy-runtime-api and aws-smithy-runtime. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server-python/Cargo.toml b/rust-runtime/aws-smithy-http-server-python/Cargo.toml index ebf17bd0658..188d5f5af2d 100644 --- a/rust-runtime/aws-smithy-http-server-python/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server-python/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0-smithy-rs-head" authors = ["Smithy Rust Server "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" keywords = ["smithy", "framework", "web", "api", "aws"] categories = ["asynchronous", "web-programming", "api-bindings"] description = """ diff --git a/rust-runtime/aws-smithy-http-server-python/README.md b/rust-runtime/aws-smithy-http-server-python/README.md index da3dc2c1316..723a1b38aad 100644 --- a/rust-runtime/aws-smithy-http-server-python/README.md +++ b/rust-runtime/aws-smithy-http-server-python/README.md @@ -3,5 +3,5 @@ Server libraries for smithy-rs generated servers, targeting pure Python business logic. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server-python/src/error.rs b/rust-runtime/aws-smithy-http-server-python/src/error.rs index 2cc308fea57..020bee15c19 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/error.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/error.rs @@ -86,7 +86,7 @@ impl IntoResponse for PyMiddlewareException { .header("Content-Type", "application/json") .header("X-Amzn-Errortype", "MiddlewareException") .body(to_boxed(self.json_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -96,7 +96,7 @@ impl IntoResponse for PyMiddlewareException { .status(self.status_code) .header("Content-Type", "application/xml") .body(to_boxed(self.xml_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -107,7 +107,7 @@ impl IntoResponse for PyMiddlewareException { .header("Content-Type", "application/x-amz-json-1.0") // See https://awslabs.github.io/smithy/1.0/spec/aws/aws-json-1_0-protocol.html#empty-body-serialization .body(to_boxed(self.json_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -118,7 +118,7 @@ impl IntoResponse for PyMiddlewareException { .header("Content-Type", "application/x-amz-json-1.1") // See https://awslabs.github.io/smithy/1.0/spec/aws/aws-json-1_1-protocol.html#empty-body-serialization .body(to_boxed(self.json_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } diff --git a/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml b/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml index 1147d0da983..ba1fa436df2 100644 --- a/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0-smithy-rs-head" authors = ["Smithy Rust Server "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" keywords = ["smithy", "framework", "web", "api", "aws", "typescript"] categories = ["asynchronous", "web-programming", "api-bindings"] description = """ diff --git a/rust-runtime/aws-smithy-http-server-typescript/README.md b/rust-runtime/aws-smithy-http-server-typescript/README.md index b5d516d1c2b..aa2fe18f6a3 100644 --- a/rust-runtime/aws-smithy-http-server-typescript/README.md +++ b/rust-runtime/aws-smithy-http-server-typescript/README.md @@ -3,5 +3,5 @@ Server libraries for smithy-rs generated servers, targeting pure Typescript business logic. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server/Cargo.toml b/rust-runtime/aws-smithy-http-server/Cargo.toml index 3193b69e75b..bfaa7fb3141 100644 --- a/rust-runtime/aws-smithy-http-server/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0-smithy-rs-head" authors = ["Smithy Rust Server "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" keywords = ["smithy", "framework", "web", "api", "aws"] categories = ["asynchronous", "web-programming", "api-bindings"] description = """ diff --git a/rust-runtime/aws-smithy-http-server/README.md b/rust-runtime/aws-smithy-http-server/README.md index 2e0ddc8860c..eaed6915b3b 100644 --- a/rust-runtime/aws-smithy-http-server/README.md +++ b/rust-runtime/aws-smithy-http-server/README.md @@ -3,5 +3,5 @@ Server libraries for smithy-rs generated servers. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/either.rs b/rust-runtime/aws-smithy-http-server/src/plugin/either.rs index d0b6192ba08..d0c2da70953 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/either.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/either.rs @@ -15,7 +15,7 @@ use tower::{Layer, Service}; use super::Plugin; -// TODO(https://github.com/awslabs/smithy-rs/pull/2441#pullrequestreview-1331345692): Seems like +// TODO(https://github.com/smithy-lang/smithy-rs/pull/2441#pullrequestreview-1331345692): Seems like // this type should land in `tower-0.5`. pin_project! { /// Combine two different [`Futures`](std::future::Future)/[`Services`](tower::Service)/ diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs index 2cd48f8e612..cba990ffbf3 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs @@ -38,7 +38,7 @@ pub enum Error { // This constant determines when the `TinyMap` implementation switches from being a `Vec` to a // `HashMap`. This is chosen to be 15 as a result of the discussion around -// https://github.com/awslabs/smithy-rs/pull/1429#issuecomment-1147516546 +// https://github.com/smithy-lang/smithy-rs/pull/1429#issuecomment-1147516546 const ROUTE_CUTOFF: usize = 15; /// A [`Router`] supporting [`AWS JSON 1.0`] and [`AWS JSON 1.1`] protocols. diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs index f3093685e2e..30a28d6255a 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs @@ -23,7 +23,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(empty()) - .expect("invalid HTTP response for AWS JSON 1.0 routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for AWS JSON 1.0 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), } } } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs index 898d8c29af0..5ebd1002f28 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs @@ -23,7 +23,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(empty()) - .expect("invalid HTTP response for AWS JSON 1.1 routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for AWS JSON 1.1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), } } } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs b/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs index 004d32a38b9..9b3f8a1996a 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs @@ -79,7 +79,7 @@ pub fn content_type_header_classifier( let expected_mime = expected_content_type .parse::() // `expected_content_type` comes from the codegen. - .expect("BUG: MIME parsing failed, `expected_content_type` is not valid. Please file a bug report under https://github.com/awslabs/smithy-rs/issues"); + .expect("BUG: MIME parsing failed, `expected_content_type` is not valid. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"); if expected_content_type != found_mime { return Err(MissingContentTypeReason::UnexpectedMimeType { expected_mime: Some(expected_mime), diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs index 76d3d692778..023b43031c8 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs @@ -23,7 +23,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(crate::body::to_boxed("{}")) - .expect("invalid HTTP response for REST JSON 1 routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for REST JSON 1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), Error::MethodNotAllowed => method_disallowed(), } } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs index d8a0905a7f7..529a3d19a2a 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs @@ -24,7 +24,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(empty()) - .expect("invalid HTTP response for REST XML routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for REST XML routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), Error::MethodNotAllowed => method_disallowed(), } } diff --git a/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs b/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs index 7a48e704216..92a35e40173 100644 --- a/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs +++ b/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs @@ -7,7 +7,7 @@ //! [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) is used. [`ConnectInfo`]'s //! [`FromParts`] implementation allows it to be extracted from the [`http::Request`]. //! -//! The [`example service`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/main.rs) +//! The [`example service`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/main.rs) //! illustrates the use of [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) //! and [`ConnectInfo`] with a service builder. diff --git a/rust-runtime/aws-smithy-http-server/src/request/mod.rs b/rust-runtime/aws-smithy-http-server/src/request/mod.rs index be507b804fc..c33b151ef9a 100644 --- a/rust-runtime/aws-smithy-http-server/src/request/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/request/mod.rs @@ -34,7 +34,7 @@ //! Types and traits for extracting data from requests. //! -//! See [Accessing Un-modelled data](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/from_parts.md) +//! See [Accessing Un-modelled data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) //! a comprehensive overview. //! //! The following implementations exist: diff --git a/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs b/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs index 44704e2dd14..5c44b01ebd4 100644 --- a/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs +++ b/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs @@ -51,7 +51,7 @@ where } /// Converts a `lambda_http::Request` into a `http::Request` -/// Issue: +/// Issue: /// /// While converting the event the [API Gateway Stage] portion of the URI /// is removed from the uri that gets returned as a new `http::Request`. diff --git a/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs b/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs index 3ae722f5fd6..472f66873fe 100644 --- a/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs +++ b/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs @@ -67,7 +67,7 @@ pub struct UriSpec { } impl UriSpec { - // TODO(https://github.com/awslabs/smithy-rs/issues/950): When we add support for the endpoint + // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): When we add support for the endpoint // trait, this constructor will take in a first argument `host_prefix`. pub fn new(path_and_query: PathAndQuerySpec) -> Self { UriSpec { @@ -115,7 +115,7 @@ impl From<&PathSpec> for Regex { .fold(String::new(), |a, b| a + sep + &b) }; - Regex::new(&format!("^{}$", re)).expect("invalid `Regex` from `PathSpec`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + Regex::new(&format!("^{}$", re)).expect("invalid `Regex` from `PathSpec`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -150,7 +150,7 @@ impl RequestSpec { /// kind of conflicts. However, the Smithy CLI does allow _other_ conflicting patterns to /// coexist, e.g. `/` and `/{label}`. We therefore have to take a stance on (1), since if we /// route arbitrarily [we render basic usage - /// impossible](https://github.com/awslabs/smithy-rs/issues/1009). + /// impossible](https://github.com/smithy-lang/smithy-rs/issues/1009). /// So this ranking of routes implements some basic pattern conflict disambiguation with some /// common sense. It's also the same behavior that [the TypeScript sSDK is implementing]. /// diff --git a/rust-runtime/aws-smithy-http-server/src/runtime_error.rs b/rust-runtime/aws-smithy-http-server/src/runtime_error.rs index 7348f5d628f..86350fe4c90 100644 --- a/rust-runtime/aws-smithy-http-server/src/runtime_error.rs +++ b/rust-runtime/aws-smithy-http-server/src/runtime_error.rs @@ -10,4 +10,4 @@ /// [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`] variant. pub struct InternalFailureException; -pub const INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE: &str = "invalid HTTP response for `RuntimeError`; please file a bug report under https://github.com/awslabs/smithy-rs/issues"; +pub const INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE: &str = "invalid HTTP response for `RuntimeError`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"; diff --git a/rust-runtime/aws-smithy-http-tower/Cargo.toml b/rust-runtime/aws-smithy-http-tower/Cargo.toml index 51d1d9accae..f661b1283b5 100644 --- a/rust-runtime/aws-smithy-http-tower/Cargo.toml +++ b/rust-runtime/aws-smithy-http-tower/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http/Cargo.toml b/rust-runtime/aws-smithy-http/Cargo.toml index 5aeb1c18e54..a5bc6f4d647 100644 --- a/rust-runtime/aws-smithy-http/Cargo.toml +++ b/rust-runtime/aws-smithy-http/Cargo.toml @@ -8,7 +8,7 @@ authors = [ description = "Smithy HTTP logic for smithy-rs." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] event-stream = ["aws-smithy-eventstream"] diff --git a/rust-runtime/aws-smithy-http/README.md b/rust-runtime/aws-smithy-http/README.md index 43b690a7993..0631f8a788c 100644 --- a/rust-runtime/aws-smithy-http/README.md +++ b/rust-runtime/aws-smithy-http/README.md @@ -1,6 +1,6 @@ # aws-smithy-http -Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs) including: +Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including: - HTTP Body implementation - Endpoint support - HTTP header deserialization @@ -8,5 +8,5 @@ Core HTTP primitives for service clients generated by [smithy-rs](https://github - `ByteStream`: _(supported on crate feature `rt-tokio` only)_ a misuse-resistant abstraction for streaming binary data -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http/external-types.toml b/rust-runtime/aws-smithy-http/external-types.toml index 06c1e82b0f9..1e95ac80514 100644 --- a/rust-runtime/aws-smithy-http/external-types.toml +++ b/rust-runtime/aws-smithy-http/external-types.toml @@ -13,9 +13,9 @@ allowed_external_types = [ "http::response::Response", "http::uri::Uri", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "futures_core::stream::Stream", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", ] diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index 6a77d080439..13318a5e996 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -10,7 +10,7 @@ rust_2018_idioms )] -//! Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs) including: +//! Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including: //! - HTTP Body implementation //! - Endpoint support //! - HTTP header deserialization diff --git a/rust-runtime/aws-smithy-json/Cargo.toml b/rust-runtime/aws-smithy-json/Cargo.toml index 3ad4d2225f6..44745d6c44a 100644 --- a/rust-runtime/aws-smithy-json/Cargo.toml +++ b/rust-runtime/aws-smithy-json/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-protocol-test/Cargo.toml b/rust-runtime/aws-smithy-protocol-test/Cargo.toml index e32a2434b79..7d16494e061 100644 --- a/rust-runtime/aws-smithy-protocol-test/Cargo.toml +++ b/rust-runtime/aws-smithy-protocol-test/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-query/Cargo.toml b/rust-runtime/aws-smithy-query/Cargo.toml index a4f517ae2a2..552c024feb3 100644 --- a/rust-runtime/aws-smithy-query/Cargo.toml +++ b/rust-runtime/aws-smithy-query/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index b936ccdbc0d..4b7963e2495 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Zelda Hessler -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index 9a7897d6dcf..3a96c8d07a7 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -18,7 +18,7 @@ //! for anyone writing a library for others to use with their generated clients. //! //! If you're needing to depend on this and you're not writing a library for Smithy -//! generated clients, then please file an issue on [smithy-rs](https://github.com/awslabs/smithy-rs) +//! generated clients, then please file an issue on [smithy-rs](https://github.com/smithy-lang/smithy-rs) //! as we likely missed re-exporting one of the APIs. //! //! All client-specific code is in the [`client`](crate::client) root level module diff --git a/rust-runtime/aws-smithy-runtime-api/src/shared.rs b/rust-runtime/aws-smithy-runtime-api/src/shared.rs index 80b4f68ebeb..cd15a135062 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/shared.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/shared.rs @@ -181,7 +181,7 @@ macro_rules! impl_shared_conversions { }; } -// TODO(https://github.com/awslabs/smithy-rs/issues/3016): Move these impls once aws-smithy-async is merged into aws-smithy-runtime-api +// TODO(https://github.com/smithy-lang/smithy-rs/issues/3016): Move these impls once aws-smithy-async is merged into aws-smithy-runtime-api mod async_impls { use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index c0dbfa5c407..e33b334d77b 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Zelda Hessler -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime/external-types.toml b/rust-runtime/aws-smithy-runtime/external-types.toml index 35ba98d12c7..0c0d03c3057 100644 --- a/rust-runtime/aws-smithy-runtime/external-types.toml +++ b/rust-runtime/aws-smithy-runtime/external-types.toml @@ -13,19 +13,19 @@ allowed_external_types = [ # Used for creating hyper connectors "tower_service::Service", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature "aws_smithy_protocol_test::MediaType", "bytes::bytes::Bytes", "serde::ser::Serialize", "serde::de::Deserialize", "hyper::client::connect::dns::Name", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper-0-14-x` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper-0-14-x` feature "hyper::client::client::Builder", "hyper::client::connect::Connection", "tokio::io::async_read::AsyncRead", "tokio::io::async_write::AsyncWrite", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http-0-x` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http-0-x` feature "http_body::Body" ] diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index 094da91889a..6c3891a0db1 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -31,7 +31,7 @@ use tracing::{debug, error}; /// will call a `.poison` method on it, signalling that the connection should be dropped. It is /// up to the connection implementer to handle this. /// -/// [`HyperConnector`]: https://github.com/awslabs/smithy-rs/blob/26a914ece072bba2dd9b5b49003204b70e7666ac/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs#L347 +/// [`HyperConnector`]: https://github.com/smithy-lang/smithy-rs/blob/26a914ece072bba2dd9b5b49003204b70e7666ac/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs#L347 #[non_exhaustive] #[derive(Debug, Default)] pub struct ConnectionPoisoningInterceptor {} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index d1393e446b2..0eb03ae474b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -57,7 +57,7 @@ mod default_connector { ]) .with_safe_default_kx_groups() .with_safe_default_protocol_versions() - .expect("Error with the TLS configuration. Please file a bug report under https://github.com/awslabs/smithy-rs/issues.") + .expect("Error with the TLS configuration. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues.") .with_native_roots() .with_no_client_auth() ) diff --git a/rust-runtime/aws-smithy-types-convert/Cargo.toml b/rust-runtime/aws-smithy-types-convert/Cargo.toml index 4fa2b9d1073..e205cf446ff 100644 --- a/rust-runtime/aws-smithy-types-convert/Cargo.toml +++ b/rust-runtime/aws-smithy-types-convert/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Conversion of types from aws-smithy-types to other libraries." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] convert-chrono = ["aws-smithy-types", "chrono"] diff --git a/rust-runtime/aws-smithy-types-convert/README.md b/rust-runtime/aws-smithy-types-convert/README.md index de0d5614c60..8fa07cac82e 100644 --- a/rust-runtime/aws-smithy-types-convert/README.md +++ b/rust-runtime/aws-smithy-types-convert/README.md @@ -21,5 +21,5 @@ _Note:_ Conversions to and from [`SystemTime`](https://doc.rust-lang.org/std/tim into [`aws-smithy-types`](https://docs.rs/aws-smithy-types/0.30.0-alpha/aws_smithy_types/date_time/struct.DateTime.html#impl-From%3CSystemTime%3E). -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index 8c8f2900056..1f2fae96765 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -8,7 +8,7 @@ authors = [ description = "Types for smithy-rs codegen." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] byte-stream-poll-next = [] diff --git a/rust-runtime/aws-smithy-types/README.md b/rust-runtime/aws-smithy-types/README.md index f38b39d2f08..11a58366ab6 100644 --- a/rust-runtime/aws-smithy-types/README.md +++ b/rust-runtime/aws-smithy-types/README.md @@ -1,9 +1,9 @@ # Fundamental Types for Smithy Services This crate implements fundamental types shared across all service clients generated -by [smithy-rs](https://github.com/awslabs/smithy-rs). Generally, you should not need to take a direct dependency on this +by [smithy-rs](https://github.com/smithy-lang/smithy-rs). Generally, you should not need to take a direct dependency on this crate as service clients should publicly re-export the types when used. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-types/external-types.toml b/rust-runtime/aws-smithy-types/external-types.toml index d8051f92d01..0492777b52b 100644 --- a/rust-runtime/aws-smithy-types/external-types.toml +++ b/rust-runtime/aws-smithy-types/external-types.toml @@ -2,13 +2,13 @@ allowed_external_types = [ "bytes::bytes::Bytes", "bytes::buf::buf_impl::Buf", - # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types + # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "http_body::Body", "hyper::body::body::Body", - # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types + # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "tokio::io::async_buf_read::AsyncBufRead", - # TODO(https://github.com/awslabs/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types + # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types "tokio::fs::file::File", ] diff --git a/rust-runtime/aws-smithy-types/src/date_time/mod.rs b/rust-runtime/aws-smithy-types/src/date_time/mod.rs index c412be065e6..19736dc86a9 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/mod.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/mod.rs @@ -566,7 +566,7 @@ mod test { assert!(DateTime::from_nanos(10_000_000_000_000_000_000_999_999_999_i128).is_err()); } - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn system_time_conversions() { diff --git a/rust-runtime/aws-smithy-xml/Cargo.toml b/rust-runtime/aws-smithy-xml/Cargo.toml index 1563fa0ed76..49d86196c24 100644 --- a/rust-runtime/aws-smithy-xml/Cargo.toml +++ b/rust-runtime/aws-smithy-xml/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/inlineable/Cargo.toml b/rust-runtime/inlineable/Cargo.toml index fd460dc08f5..c706a2539db 100644 --- a/rust-runtime/inlineable/Cargo.toml +++ b/rust-runtime/inlineable/Cargo.toml @@ -9,7 +9,7 @@ are to allow this crate to be compilable and testable in isolation, no client co """ license = "Apache-2.0" publish = false -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] # this allows the tests to be excluded from downstream crates to keep dependencies / test times reasonable (e.g. no proptests) diff --git a/rust-runtime/inlineable/README.md b/rust-runtime/inlineable/README.md index b14c2d9bfd7..14bc80dbbdb 100644 --- a/rust-runtime/inlineable/README.md +++ b/rust-runtime/inlineable/README.md @@ -5,5 +5,5 @@ SDKs. This exists to facilitate writing complex snippets of code that can be tes without needing to create and publish an entire additional crate. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 1136c537f82..746a12ec7ce 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -74,11 +74,11 @@ COPY . tools/ci-build # when `checkout_smithy_rs_tools` is set to true, this commit will be checked out ARG smithy_rs_commit_hash=main # If the `checkout_smithy_rs_tools` arg is set to true, then the Dockerfile will acquire the tools -# source code by checking out awslabs/smithy-rs/main rather than copying them from the local directory. +# source code by checking out smithy-lang/smithy-rs/main rather than copying them from the local directory. ARG checkout_smithy_rs_tools=false RUN set -eux; \ if [[ "${checkout_smithy_rs_tools}" == "true" ]]; then \ - git clone https://github.com/awslabs/smithy-rs.git; \ + git clone https://github.com/smithy-lang/smithy-rs.git; \ cd smithy-rs; \ git checkout ${smithy_rs_commit_hash}; \ fi; \ diff --git a/tools/ci-build/README.md b/tools/ci-build/README.md index d7b9204770e..d6e03a861d3 100644 --- a/tools/ci-build/README.md +++ b/tools/ci-build/README.md @@ -21,7 +21,7 @@ To create the starting space, do the following: ```bash cd /path/to/my/starting-space -git clone https://github.com/awslabs/smithy-rs.git +git clone https://github.com/smithy-lang/smithy-rs.git # Optionally check out the revision you want to work with in the checked out smithy-rs. # Just make sure you are in /path/to/my/starting-space (or whatever you called it) after. ``` diff --git a/tools/ci-build/changelogger/src/render.rs b/tools/ci-build/changelogger/src/render.rs index b8d9c3efeea..7292855ee02 100644 --- a/tools/ci-build/changelogger/src/render.rs +++ b/tools/ci-build/changelogger/src/render.rs @@ -161,8 +161,13 @@ fn render_model_entry(entry: &SdkModelEntry, out: &mut String) { } fn to_md_link(reference: &Reference) -> String { + let org_name = match reference.repo.as_str() { + "smithy-rs" => "smithy-lang", + "aws-sdk-rust" => "awslabs", + repo => panic!("unrecognized repo named {repo}"), + }; format!( - "[{repo}#{number}](https://github.com/awslabs/{repo}/issues/{number})", + "[{repo}#{number}](https://github.com/{org_name}/{repo}/issues/{number})", repo = reference.repo, number = reference.number ) @@ -562,20 +567,20 @@ message = "Some API change" v0.3.0 (January 4th, 2022) ========================== **Breaking Changes:** -- :warning: (all, [smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the code generator +- :warning: (all, [smithy-rs#445](https://github.com/smithy-lang/smithy-rs/issues/445)) I made a major change to update the code generator **New this release:** -- :tada: (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator -- :tada: (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: (all, [smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: (all, [smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator **Update guide:** blah blah -- (all, [smithy-rs#200](https://github.com/awslabs/smithy-rs/issues/200), @another-contrib) I made a minor change +- (all, [smithy-rs#200](https://github.com/smithy-lang/smithy-rs/issues/200), @another-contrib) I made a minor change **Contributors** Thank you for your contributions! ❤ -- @another-contrib ([smithy-rs#200](https://github.com/awslabs/smithy-rs/issues/200)) -- @external-contrib ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446)) +- @another-contrib ([smithy-rs#200](https://github.com/smithy-lang/smithy-rs/issues/200)) +- @external-contrib ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446)) "# .trim_start(); @@ -586,10 +591,10 @@ Thank you for your contributions! ❤ v0.1.0 (January 4th, 2022) ========================== **Breaking Changes:** -- :warning: ([smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the AWS SDK +- :warning: ([smithy-rs#445](https://github.com/smithy-lang/smithy-rs/issues/445)) I made a major change to update the AWS SDK **New this release:** -- :tada: ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator **Service Features:** - `aws-sdk-ec2` (0.12.0): Some API change @@ -600,7 +605,7 @@ v0.1.0 (January 4th, 2022) **Contributors** Thank you for your contributions! ❤ -- @external-contrib ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446)) +- @external-contrib ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446)) "# .trim_start(); diff --git a/tools/ci-build/changelogger/tests/e2e_test.rs b/tools/ci-build/changelogger/tests/e2e_test.rs index 302607704a7..87862af3415 100644 --- a/tools/ci-build/changelogger/tests/e2e_test.rs +++ b/tools/ci-build/changelogger/tests/e2e_test.rs @@ -300,11 +300,11 @@ fn render_smithy_rs() { January 1st, 1970 ================= **New this release:** -- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change +- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change **Contributors** Thank you for your contributions! ❤ -- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234)) +- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234)) v0.41.0 (Some date in the past) @@ -318,7 +318,7 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234))\n\n", + "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n", "prerelease": true }"#, release_manifest @@ -393,14 +393,14 @@ fn render_aws_sdk() { January 1st, 1970 ================= **New this release:** -- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change +- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change **Service Features:** - `aws-sdk-ec2` (0.12.0): Some API change **Contributors** Thank you for your contributions! ❤ -- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567)) +- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567)) v0.41.0 (Some date in the past) @@ -414,7 +414,7 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567))\n\n", + "body": "**New this release:**\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567))\n\n", "prerelease": true }"#, release_manifest @@ -511,17 +511,17 @@ author = "rcoh" January 1st, 1970 ================= **Breaking Changes:** -- :warning: (all, [smithy-rs#3](https://github.com/awslabs/smithy-rs/issues/3)) Third change - empty +- :warning: (all, [smithy-rs#3](https://github.com/smithy-lang/smithy-rs/issues/3)) Third change - empty **New this release:** -- (server, [smithy-rs#1](https://github.com/awslabs/smithy-rs/issues/1), @server-dev) First change - server -- (all, [smithy-rs#2](https://github.com/awslabs/smithy-rs/issues/2), @another-dev) Second change - should be all -- (client, [smithy-rs#4](https://github.com/awslabs/smithy-rs/issues/4)) Fourth change - client +- (server, [smithy-rs#1](https://github.com/smithy-lang/smithy-rs/issues/1), @server-dev) First change - server +- (all, [smithy-rs#2](https://github.com/smithy-lang/smithy-rs/issues/2), @another-dev) Second change - should be all +- (client, [smithy-rs#4](https://github.com/smithy-lang/smithy-rs/issues/4)) Fourth change - client **Contributors** Thank you for your contributions! ❤ -- @another-dev ([smithy-rs#2](https://github.com/awslabs/smithy-rs/issues/2)) -- @server-dev ([smithy-rs#1](https://github.com/awslabs/smithy-rs/issues/1)) +- @another-dev ([smithy-rs#2](https://github.com/smithy-lang/smithy-rs/issues/2)) +- @server-dev ([smithy-rs#1](https://github.com/smithy-lang/smithy-rs/issues/1)) v0.41.0 (Some date in the past) @@ -668,11 +668,11 @@ fn render_crate_versions() { January 1st, 1970 ================= **New this release:** -- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change +- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change **Contributors** Thank you for your contributions! ❤ -- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234)) +- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234)) **Crate Versions**
@@ -697,7 +697,7 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234))\n\n**Crate Versions**\n
\nClick to expand to view crate versions...\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n
\n\n", + "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n**Crate Versions**\n
\nClick to expand to view crate versions...\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n
\n\n", "prerelease": true }"#, release_manifest diff --git a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs index ae7a41b3045..7e6bb52572e 100644 --- a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs +++ b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs @@ -119,7 +119,7 @@ version = "0.0.1" edition = "2021" description = "Placeholder ahead of the next smithy-rs release" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs""#, +repository = "https://github.com/smithy-lang/smithy-rs""#, package_name ); fs.write_file(directory_path.join("Cargo.toml"), cargo_toml.as_bytes()) diff --git a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs index d0a4a9749bd..c79cc5d021d 100644 --- a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs +++ b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs @@ -58,7 +58,7 @@ pub async fn subcommand_upgrade_runtime_crates_version( ) })?; // TODO(GA): Error out if args.stable_version starts with "0." - // https://github.com/awslabs/smithy-rs/pull/3082#discussion_r1378637315 + // https://github.com/smithy-lang/smithy-rs/pull/3082#discussion_r1378637315 let updated_gradle_properties = if let Some(stable_version) = &args.stable_version { let upgraded_stable_version = semver::Version::parse(stable_version.as_str()) .with_context(|| format!("{} is not a valid semver version", &stable_version))?; diff --git a/tools/ci-build/sdk-lints/src/readmes.rs b/tools/ci-build/sdk-lints/src/readmes.rs index 392a4d63dfc..9259197cc1b 100644 --- a/tools/ci-build/sdk-lints/src/readmes.rs +++ b/tools/ci-build/sdk-lints/src/readmes.rs @@ -66,7 +66,7 @@ impl Fix for ReadmesHaveFooters { const README_FOOTER: &str = "\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) \ -and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator."; +and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator."; const NOT_TO_BE_USED_DIRECTLY: &str = " In most cases, it should not be used directly."; fn fix_readme(path: impl AsRef, to_be_used_directly: bool) -> Result<(bool, String)> { diff --git a/tools/ci-build/sdk-lints/src/todos.rs b/tools/ci-build/sdk-lints/src/todos.rs index 06cc50db3fe..c6f9affa8fc 100644 --- a/tools/ci-build/sdk-lints/src/todos.rs +++ b/tools/ci-build/sdk-lints/src/todos.rs @@ -25,7 +25,7 @@ impl Lint for TodosHaveContext { ext.eq_ignore_ascii_case("rs") || ext.eq_ignore_ascii_case("toml") || ext.eq_ignore_ascii_case("txt") - // TODO(https://github.com/awslabs/smithy-rs/issues/2077) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2077) // || ext.eq_ignore_ascii_case("md") || ext.eq_ignore_ascii_case("sh") || ext.eq_ignore_ascii_case("py") diff --git a/tools/ci-build/sdk-versioner/src/main.rs b/tools/ci-build/sdk-versioner/src/main.rs index df148894d1b..39d81722f39 100644 --- a/tools/ci-build/sdk-versioner/src/main.rs +++ b/tools/ci-build/sdk-versioner/src/main.rs @@ -70,7 +70,7 @@ impl Args { } } -// TODO(https://github.com/awslabs/smithy-rs/issues/2810): Remove `SdkPath` and just use a `PathBuf` with the new logic +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2810): Remove `SdkPath` and just use a `PathBuf` with the new logic // This is only around for backwards compatibility for the next release's sync process0 enum SdkPath { /// Don't even attempt to resolve the correct relative path to dependencies diff --git a/tools/ci-cdk/README.md b/tools/ci-cdk/README.md index 31c4a2fc6ef..691489eeebf 100644 --- a/tools/ci-cdk/README.md +++ b/tools/ci-cdk/README.md @@ -1,6 +1,6 @@ # CI CDK -This is the CDK infrastructure as code for awslabs/smithy-rs and awslabs/aws-sdk-rust +This is the CDK infrastructure as code for smithy-lang/smithy-rs and awslabs/aws-sdk-rust continuous integration. The `cdk.json` file tells the CDK Toolkit how to synthesize the infrastructure. diff --git a/tools/ci-cdk/canary-runner/src/run.rs b/tools/ci-cdk/canary-runner/src/run.rs index 9521db6cae8..8fd8cb40641 100644 --- a/tools/ci-cdk/canary-runner/src/run.rs +++ b/tools/ci-cdk/canary-runner/src/run.rs @@ -5,7 +5,7 @@ // This is the code used by CI to run the canary Lambda. // -// If running this locally, you'll need to make a clone of awslabs/smithy-rs in +// If running this locally, you'll need to make a clone of smithy-lang/smithy-rs in // the aws-sdk-rust project root. // // Also consider using the `AWS_PROFILE` and `AWS_REGION` environment variables @@ -47,10 +47,10 @@ lazy_static::lazy_static! { static ref PINNED_SMITHY_RS_VERSIONS: Vec<(ReleaseTag, &'static str)> = { let mut pinned = vec![ // Versions <= 0.6.0 no longer compile against the canary after this commit in smithy-rs - // due to the breaking change in https://github.com/awslabs/smithy-rs/pull/1085 + // due to the breaking change in https://github.com/smithy-lang/smithy-rs/pull/1085 (ReleaseTag::from_str("v0.6.0").unwrap(), "d48c234796a16d518ca9e1dda5c7a1da4904318c"), // Versions <= release-2022-10-26 no longer compile against the canary after this commit in smithy-rs - // due to the s3 canary update in https://github.com/awslabs/smithy-rs/pull/1974 + // due to the s3 canary update in https://github.com/smithy-lang/smithy-rs/pull/1974 (ReleaseTag::from_str("release-2022-10-26").unwrap(), "3e24477ae7a0a2b3853962a064bc8333a016af54") ]; pinned.sort(); diff --git a/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts b/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts index 3cb6e651d26..92e9bd34450 100644 --- a/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts +++ b/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts @@ -25,7 +25,7 @@ export class PullRequestCdnStack extends Stack { this.smithyRsOidcRole = new GitHubOidcRole(this, "smithy-rs", { name: "smithy-rs-pull-request", - githubOrg: "awslabs", + githubOrg: "smithy-lang", githubRepo: "smithy-rs", oidcProvider: props.githubActionsOidcProvider, }); diff --git a/tools/ci-cdk/test/oidc-provider-stack.test.ts b/tools/ci-cdk/test/oidc-provider-stack.test.ts index f776fd843ed..addc642696b 100644 --- a/tools/ci-cdk/test/oidc-provider-stack.test.ts +++ b/tools/ci-cdk/test/oidc-provider-stack.test.ts @@ -5,7 +5,7 @@ import { App } from "aws-cdk-lib"; import { Template } from "aws-cdk-lib/assertions"; -import { GITHUB_CERTIFICATE_THUMBPRINTS, OidcProviderStack } from "../lib/oidc-provider-stack"; +import { OidcProviderStack } from "../lib/oidc-provider-stack"; test("it should have an OIDC provider", () => { const app = new App(); @@ -15,7 +15,6 @@ test("it should have an OIDC provider", () => { // Verify the OIDC provider template.hasResourceProperties("Custom::AWSCDKOpenIdConnectProvider", { ClientIDList: ["sts.amazonaws.com"], - ThumbprintList: GITHUB_CERTIFICATE_THUMBPRINTS, Url: "https://token.actions.githubusercontent.com", }); }); diff --git a/tools/ci-scripts/check-aws-config b/tools/ci-scripts/check-aws-config index 5c6d910fe2f..6a6d2cfc29d 100755 --- a/tools/ci-scripts/check-aws-config +++ b/tools/ci-scripts/check-aws-config @@ -42,7 +42,7 @@ echo "${C_YELLOW}## Checking the wasm32-unknown-unknown and wasm32-wasi targets$ cargo check --target wasm32-unknown-unknown --no-default-features cargo check --target wasm32-wasi --no-default-features -# TODO(https://github.com/awslabs/smithy-rs/issues/2499): Uncomment the following once aws-config tests compile for WASM +# TODO(https://github.com/smithy-lang/smithy-rs/issues/2499): Uncomment the following once aws-config tests compile for WASM # echo "${C_YELLOW}## Testing the wasm32-unknown-unknown and wasm32-wasi targets${C_RESET}" # wasm-pack test --node -- --no-default-features # cargo wasi test --no-default-features From acbe8ce65fea7b5076cf451900f858bb7b26b98b Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 10 Nov 2023 16:15:11 -0500 Subject: [PATCH 241/331] Clean up re-exports and improve 'BuildError' conversions (#3173) ## Motivation and Context - Fixes #3171 - Fixes #3155 - Fixes #3172 ## Description - Add `configReExport` to make it easy and consistent to re-export types into the config module when they are used! - Add this for a bunch of types and clean up some (now) dead code - Re export `BuildError` - Enable converting from `BuildError` into `SdkError` There are probably more places this can be used, but I'd like to keep this change small to facilitate easy backport to 0.57. ## Testing CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 49 +++++++++++++++++++ .../rustsdk/AwsFluentClientDecorator.kt | 3 -- .../smithy/rustsdk/CredentialProviders.kt | 15 ++++-- .../amazon/smithy/rustsdk/RegionDecorator.kt | 13 +---- .../dynamodb/tests/build-errors.rs | 41 ++++++++++++++++ .../codegen/client/smithy/ClientReExports.kt | 17 +++++++ .../customizations/HttpAuthDecorator.kt | 28 +++-------- .../HttpConnectorConfigDecorator.kt | 15 +++--- .../customizations/IdentityCacheDecorator.kt | 9 ++-- .../InterceptorConfigCustomization.kt | 5 +- .../ResiliencyConfigCustomization.kt | 12 +++-- .../customize/RequiredCustomizations.kt | 6 +++ .../endpoint/EndpointConfigCustomization.kt | 2 - .../ClientRuntimeTypesReExportGenerator.kt | 15 ------ .../config/ServiceConfigGenerator.kt | 11 +++-- .../generators/error/ServiceErrorGenerator.kt | 17 +++++++ .../src/client/result.rs | 7 +++ 17 files changed, 186 insertions(+), 79 deletions(-) create mode 100644 aws/sdk/integration-tests/dynamodb/tests/build-errors.rs create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 638b7c6319c..ba31b8f127a 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -58,3 +58,52 @@ message = "Fix exclusively setting the credentials provider at operation config- references = ["smithy-rs#3156", "aws-sdk-rust#901"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "ysaito1001" + +[[smithy-rs]] +message = """Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: +```rust +async fn do_a_thing(client: &Client) -> Result> { + client.run_operation().complex_field(ComplexField::builder() + .a("a") + .b("b") + .build()? + ).send().await?; +} +``` + +Previously, `?` could not be used in this position. +""" +references = ["smithy-rs#3173", "smithy-rs#3171"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "rcoh" + +[[aws-sdk-rust]] +message = """Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: +```rust +async fn create_table(dynamo_client: &Client) -> Result<(), SdkError> { + dynamo_client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, // Previously, `?` could not be used here + ) + .send() + .await?; + Ok(()) +} +``` + +Previously, `?` could not be used in this position. +""" +references = ["smithy-rs#3173", "smithy-rs#3171"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "rcoh" + +[[aws-sdk-rust]] +message = "ProvideCredentials and SharedCredentialsProvider are now re-exported." +references = ["smithy-rs#3173", "smithy-rs#3155"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 93fb926ffee..caf995854f5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -30,11 +30,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault private class Types(runtimeConfig: RuntimeConfig) { - private val smithyHttp = RuntimeType.smithyHttp(runtimeConfig) private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig) - val connectorError = smithyHttp.resolve("result::ConnectorError") val retryConfig = smithyTypes.resolve("retry::RetryConfig") val timeoutConfig = smithyTypes.resolve("timeout::TimeoutConfig") } @@ -102,7 +100,6 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { private class AwsFluentClientExtensions(private val codegenContext: ClientCodegenContext, private val types: Types) { private val codegenScope = arrayOf( "Arc" to RuntimeType.Arc, - "ConnectorError" to types.connectorError, "RetryConfig" to types.retryConfig, "TimeoutConfig" to types.timeoutConfig, "aws_types" to types.awsTypes, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 6a34967a8e3..9405f8a2fe0 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes @@ -59,11 +60,15 @@ class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, - "Credentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials"), - "ProvideCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::ProvideCredentials"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::SharedCredentialsProvider"), + "Credentials" to configReexport(AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials")), + "ProvideCredentials" to configReexport( + AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::ProvideCredentials"), + ), + "SharedCredentialsProvider" to configReexport( + AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::SharedCredentialsProvider"), + ), "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) .resolve("auth::sigv4a::SCHEME_ID"), "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index e7bf13e747a..4e77e1c49b6 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -11,7 +11,7 @@ import software.amazon.smithy.model.node.Node import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization @@ -22,7 +22,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization import software.amazon.smithy.rust.codegen.core.util.dq @@ -109,14 +108,6 @@ class RegionDecorator : ClientCodegenDecorator { } } - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - if (usesRegion(codegenContext)) { - rustCrate.withModule(ClientRustModule.config) { - rust("pub use #T::Region;", region(codegenContext.runtimeConfig)) - } - } - } - override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { if (!usesRegion(codegenContext)) { return listOf() @@ -157,7 +148,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "Region" to region.resolve("Region"), + "Region" to configReexport(region.resolve("Region")), ) override fun section(section: ServiceConfig) = writable { diff --git a/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs b/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs new file mode 100644 index 00000000000..00fc07e7162 --- /dev/null +++ b/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_dynamodb::error::SdkError; +use aws_sdk_dynamodb::operation::create_table::CreateTableError; +use aws_sdk_dynamodb::types::{KeySchemaElement, KeyType}; +use aws_sdk_dynamodb::Client; + +#[allow(dead_code)] +async fn create_table_test(client: &Client) -> Result<(), SdkError> { + let _just_checking_compilation = client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, + ) + .send() + .await; + Ok(()) +} + +#[allow(dead_code)] +async fn create_table_test_super_error(client: &Client) -> Result<(), aws_sdk_dynamodb::Error> { + let _just_checking_compilation = client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, + ) + .send() + .await; + Ok(()) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt new file mode 100644 index 00000000000..6aaf638680c --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt @@ -0,0 +1,17 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy + +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +/** Returns a symbol for a type re-exported into crate::config + * Although it is not always possible to use this, this is the preferred method for using types in config customizations + * and ensures that your type will be re-exported if it is used. + */ +fun configReexport(type: RuntimeType): RuntimeType = RuntimeType.forInlineFun(type.name, module = ClientRustModule.config) { + rustTemplate("pub use #{type};", "type" to type) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index bb2f0c17f0d..b573dbaab25 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -13,7 +13,7 @@ import software.amazon.smithy.model.traits.HttpBasicAuthTrait import software.amazon.smithy.model.traits.HttpBearerAuthTrait import software.amazon.smithy.model.traits.HttpDigestAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption.StaticAuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator @@ -26,7 +26,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf @@ -38,6 +37,10 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> val authHttp = smithyRuntime.resolve("client::auth::http") val authHttpApi = smithyRuntimeApi.resolve("client::auth::http") return arrayOf( + "Token" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Token")), + "Login" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Login")), + "ResolveIdentity" to configReexport(smithyRuntimeApi.resolve("client::identity::ResolveIdentity")), + "AuthSchemeId" to smithyRuntimeApi.resolve("client::auth::AuthSchemeId"), "ApiKeyAuthScheme" to authHttp.resolve("ApiKeyAuthScheme"), "ApiKeyLocation" to authHttp.resolve("ApiKeyLocation"), @@ -48,11 +51,8 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> "HTTP_BASIC_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BASIC_AUTH_SCHEME_ID"), "HTTP_BEARER_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BEARER_AUTH_SCHEME_ID"), "HTTP_DIGEST_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_DIGEST_AUTH_SCHEME_ID"), - "ResolveIdentity" to smithyRuntimeApi.resolve("client::identity::ResolveIdentity"), - "Login" to smithyRuntimeApi.resolve("client::identity::http::Login"), "SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"), "SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"), - "Token" to smithyRuntimeApi.resolve("client::identity::http::Token"), ) } @@ -135,25 +135,10 @@ class HttpAuthDecorator : ClientCodegenDecorator { it + HttpAuthServiceRuntimePluginCustomization(codegenContext, authSchemes) } } - - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - val authSchemes = HttpAuthSchemes.from(codegenContext) - if (authSchemes.anyEnabled()) { - rustCrate.withModule(ClientRustModule.config) { - val codegenScope = codegenScope(codegenContext.runtimeConfig) - if (authSchemes.isTokenBased()) { - rustTemplate("pub use #{Token};", *codegenScope) - } - if (authSchemes.isLoginBased()) { - rustTemplate("pub use #{Login};", *codegenScope) - } - } - } - } } private class HttpAuthServiceRuntimePluginCustomization( - private val codegenContext: ClientCodegenContext, + codegenContext: ClientCodegenContext, private val authSchemes: HttpAuthSchemes, ) : ServiceRuntimePluginCustomization() { private val serviceShape = codegenContext.serviceShape @@ -167,6 +152,7 @@ private class HttpAuthServiceRuntimePluginCustomization( rustTemplate("#{SharedAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) } } + fun registerNamedAuthScheme(name: String) { registerAuthScheme { rustTemplate("#{$name}::new()", *codegenScope) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index b57b51bf2c8..c204a17b641 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig @@ -32,13 +33,13 @@ private class HttpConnectorConfigCustomization( private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), - "HttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), - "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), - "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), - "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedHttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"), - "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), + "HttpClient" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), + ), + "IntoShared" to configReexport(RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared")), + "SharedHttpClient" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"), + ), ) override fun section(section: ServiceConfig): Writable { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt index d3015e76936..f66fd6f288f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -21,8 +22,8 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C val api = RuntimeType.smithyRuntimeApi(rc) arrayOf( *preludeScope, - "ResolveCachedIdentity" to api.resolve("client::identity::ResolveCachedIdentity"), - "SharedIdentityCache" to api.resolve("client::identity::SharedIdentityCache"), + "ResolveCachedIdentity" to configReexport(api.resolve("client::identity::ResolveCachedIdentity")), + "SharedIdentityCache" to configReexport(api.resolve("client::identity::SharedIdentityCache")), ) } @@ -88,6 +89,7 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C *codegenScope, ) } + is ServiceConfig.ConfigImpl -> { rustTemplate( """ @@ -99,7 +101,8 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C *codegenScope, ) } - else -> { } + + else -> {} } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index e6d48030f12..eecd7bb4a6b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -17,8 +18,8 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( - "Intercept" to RuntimeType.intercept(runtimeConfig), - "SharedInterceptor" to RuntimeType.sharedInterceptor(runtimeConfig), + "Intercept" to configReexport(RuntimeType.intercept(runtimeConfig)), + "SharedInterceptor" to configReexport(RuntimeType.sharedInterceptor(runtimeConfig)), ) override fun section(section: ServiceConfig) = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index e44fce767f3..ec09d34659c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -25,7 +26,9 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "AsyncSleep" to sleepModule.resolve("AsyncSleep"), + "AsyncSleep" to configReexport(sleepModule.resolve("AsyncSleep")), + "SharedAsyncSleep" to configReexport(sleepModule.resolve("SharedAsyncSleep")), + "Sleep" to configReexport(sleepModule.resolve("Sleep")), "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), "debug" to RuntimeType.Tracing.resolve("debug"), @@ -33,10 +36,9 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf "RetryConfig" to retryConfig.resolve("RetryConfig"), "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), "RetryPartition" to retries.resolve("RetryPartition"), - "SharedAsyncSleep" to sleepModule.resolve("SharedAsyncSleep"), - "SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries::SharedRetryStrategy"), + "SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::retries::SharedRetryStrategy"), "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"), - "Sleep" to sleepModule.resolve("Sleep"), "StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"), "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), @@ -286,7 +288,7 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { fun extras(rustCrate: RustCrate) { rustCrate.withModule(ClientRustModule.config) { rustTemplate( - "pub use #{sleep}::{AsyncSleep, SharedAsyncSleep, Sleep};", + "pub use #{sleep}::{Sleep};", "sleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index dca3fcc5c75..2c174047bfa 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersi import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitivesEventStream import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization +import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError val TestUtilFeature = Feature("test-util", false, listOf()) @@ -97,6 +98,8 @@ class RequiredCustomizations : ClientCodegenDecorator { """ /// Error type returned by the client. pub type SdkError = #{SdkError}; + pub use #{BuildError}; + pub use #{ConnectorError}; pub use #{DisplayErrorContext}; pub use #{ProvideErrorMetadata}; @@ -105,6 +108,9 @@ class RequiredCustomizations : ClientCodegenDecorator { "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(rc), + // this can't use the auto-rexport because the builder generator is defined in codegen core + "BuildError" to rc.operationBuildError(), + "ConnectorError" to RuntimeType.smithyRuntimeApi(rc).resolve("client::result::ConnectorError"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index e565aeefa9b..f40f46284df 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -32,7 +32,6 @@ internal class EndpointConfigCustomization( private val codegenScope = arrayOf( *preludeScope, "Params" to typesGenerator.paramsStruct(), - "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), "SharedEndpointResolver" to epModule.resolve("SharedEndpointResolver"), "StaticUriEndpointResolver" to epRuntimeModule.resolve("StaticUriEndpointResolver"), @@ -90,7 +89,6 @@ internal class EndpointConfigCustomization( ##[allow(deprecated)] self.set_endpoint_resolver( endpoint_url.map(|url| { - use #{IntoShared}; #{StaticUriEndpointResolver}::uri(url).into_shared() }) ); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 690bf41a0be..12bc55c8dcf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -24,9 +24,7 @@ class ClientRuntimeTypesReExportGenerator( rustTemplate( """ pub use #{ConfigBag}; - pub use #{Intercept}; pub use #{RuntimeComponents}; - pub use #{SharedInterceptor}; pub use #{IdentityCache}; """, "ConfigBag" to RuntimeType.configBag(rc), @@ -35,19 +33,6 @@ class ClientRuntimeTypesReExportGenerator( "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), "IdentityCache" to RuntimeType.smithyRuntime(rc).resolve("client::identity::IdentityCache"), ) - - if (codegenContext.enableUserConfigurableRuntimePlugins) { - rustTemplate( - """ - pub use #{runtime_plugin}::{RuntimePlugin, SharedRuntimePlugin}; - pub use #{config_bag}::FrozenLayer; - pub use #{RuntimeComponentsBuilder}; - """, - "runtime_plugin" to RuntimeType.smithyRuntimeApi(rc).resolve("client::runtime_plugin"), - "config_bag" to RuntimeType.smithyTypes(rc).resolve("config_bag"), - "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), - ) - } } rustCrate.withModule(ClientRustModule.Config.endpoint) { rustTemplate( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index bc3eea97622..347c731b20b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.traits.IdempotencyTokenTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter @@ -271,12 +272,12 @@ class ServiceConfigGenerator( "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "Cow" to RuntimeType.Cow, - "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "Layer" to smithyTypes.resolve("config_bag::Layer"), + "FrozenLayer" to configReexport(smithyTypes.resolve("config_bag::FrozenLayer")), + "Layer" to configReexport(smithyTypes.resolve("config_bag::Layer")), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), - "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), - "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), - "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(runtimeConfig), + "RuntimeComponentsBuilder" to configReexport(RuntimeType.runtimeComponentsBuilder(runtimeConfig)), + "RuntimePlugin" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)), + "SharedRuntimePlugin" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)), "runtime_plugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin"), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt index c11fbfecf86..1c70bf639d0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt @@ -27,6 +27,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations +import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.smithy.transformers.allErrors import software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors @@ -65,6 +66,7 @@ class ServiceErrorGenerator( crate.withModule(RustModule.private("error_meta")) { renderDefinition() renderImplDisplay() + renderImplFromBuildError() // Every operation error can be converted into service::Error operations.forEach { operationShape -> // operation errors @@ -108,6 +110,21 @@ class ServiceErrorGenerator( } } + private fun RustWriter.renderImplFromBuildError() { + rustTemplate( + """ + impl From<#{BuildError}> for Error { + fn from(value: #{BuildError}) -> Self { + Error::Unhandled(#{Unhandled}::builder().source(value).build()) + } + } + + """, + "BuildError" to codegenContext.runtimeConfig.operationBuildError(), + "Unhandled" to unhandledError(codegenContext.runtimeConfig), + ) + } + private fun RustWriter.renderImplFrom(errorSymbol: Symbol, errors: List) { if (errors.isNotEmpty() || CodegenTarget.CLIENT == codegenContext.target) { val operationErrors = errors.map { model.expectShape(it) } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs index 4d9182a073e..93013abdd81 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs @@ -7,6 +7,7 @@ use crate::client::connection::ConnectionMetadata; use aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA}; +use aws_smithy_types::error::operation::BuildError; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::ErrorKind; use std::error::Error; @@ -482,6 +483,12 @@ where } } +impl From for SdkError { + fn from(value: BuildError) -> Self { + SdkError::ConstructionFailure(ConstructionFailure::builder().source(value).build()) + } +} + impl ProvideErrorMetadata for SdkError where E: ProvideErrorMetadata, From 4a6b06ac5489c6f770286f06138e966cb307e21f Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 10 Nov 2023 17:30:31 -0500 Subject: [PATCH 242/331] Remove cargo doc from all-services check to speed up CI (#3179) ## Motivation and Context Running this check on all services significantly slows down CI ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps | 2 +- tools/ci-scripts/check-only-aws-sdk-services | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps b/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps index 38942ef0678..b3b0ade515d 100755 --- a/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps +++ b/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps @@ -10,7 +10,7 @@ set -eux pushd aws-sdk-smoketest &>/dev/null # Override "fail on warning" for smoke test docs since DynamoDB's modeled docs cause rustdoc warnings -RUSTDOCFLAGS="" cargo doc --no-deps --document-private-items --all-features +RUSTDOCFLAGS="--cfg docsrs" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features cargo clippy --all-features cargo +"${RUST_NIGHTLY_VERSION}" udeps diff --git a/tools/ci-scripts/check-only-aws-sdk-services b/tools/ci-scripts/check-only-aws-sdk-services index d1e0ea754ee..b15c4133b3d 100755 --- a/tools/ci-scripts/check-only-aws-sdk-services +++ b/tools/ci-scripts/check-only-aws-sdk-services @@ -13,7 +13,6 @@ cd aws-sdk sed -i '/"examples\//d' Cargo.toml cargo check --all-targets --all-features -RUSTDOCFLAGS="--cfg docsrs" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features for test_dir in tests/*; do if [ -f "${test_dir}/Cargo.toml" ]; then From 7eb008c4f7d852700e8c468fc1691e3cf880f2e7 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 10 Nov 2023 16:56:04 -0800 Subject: [PATCH 243/331] Create the HTTP `Response` wrapper types (#3148) For the same reason that the request wrapper types were created in #3059, this PR establishes the response wrapper types and refactors existing code to use them. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 +- .../aws-config/external-types.toml | 3 +- .../src/http_credential_provider.rs | 4 +- .../aws-config/src/imds/client.rs | 24 +- .../aws-config/src/imds/client/error.rs | 7 +- .../aws-config/src/imds/client/token.rs | 2 - aws/rust-runtime/aws-http/external-types.toml | 2 + aws/rust-runtime/aws-http/src/request_id.rs | 66 +++-- .../src/http_response_checksum.rs | 10 +- .../aws-inlineable/src/presigning.rs | 4 +- .../aws-inlineable/src/s3_request_id.rs | 59 ++-- .../aws-runtime/src/retries/classifiers.rs | 8 +- .../aws-runtime/src/service_clock_skew.rs | 3 +- .../smithy/rustsdk/AwsPresigningDecorator.kt | 6 +- .../amazon/smithy/rustsdk/AwsRuntimeType.kt | 2 +- .../rustsdk/HttpRequestChecksumDecorator.kt | 4 +- .../rustsdk/HttpResponseChecksumDecorator.kt | 4 +- .../rustsdk/IntegrationTestDependencies.kt | 5 +- .../smithy/rustsdk/SigV4AuthDecorator.kt | 2 +- .../apigateway/ApiGatewayDecorator.kt | 2 +- .../customize/glacier/GlacierDecorator.kt | 2 +- .../customize/route53/Route53Decorator.kt | 2 +- .../rustsdk/customize/s3/S3Decorator.kt | 5 +- .../dynamodb/benches/deserialization_bench.rs | 5 +- .../retries-with-client-rate-limiting.rs | 7 +- aws/sdk/integration-tests/s3/Cargo.toml | 2 +- .../integration-tests/s3/tests/concurrency.rs | 12 +- .../tests/retry-classifier-customization.rs | 2 +- .../integration-tests/webassembly/src/http.rs | 8 +- .../customizations/HttpAuthDecorator.kt | 2 +- .../HttpChecksumRequiredGenerator.kt | 2 +- .../HttpConnectorConfigDecorator.kt | 4 +- .../IdempotencyTokenGenerator.kt | 2 +- .../customizations/IdentityCacheDecorator.kt | 2 +- .../ResiliencyConfigCustomization.kt | 8 +- .../SensitiveOutputDecorator.kt | 2 +- .../customize/RequiredCustomizations.kt | 2 +- .../endpoint/EndpointConfigCustomization.kt | 2 +- .../codegen/client/smithy/endpoint/Util.kt | 4 +- .../EndpointParamsInterceptorGenerator.kt | 2 +- .../ClientRuntimeTypesReExportGenerator.kt | 2 +- .../ConfigOverrideRuntimePluginGenerator.kt | 2 +- .../smithy/generators/OperationGenerator.kt | 8 +- .../OperationRuntimePluginGenerator.kt | 2 +- .../smithy/generators/PaginatorGenerator.kt | 2 +- .../ServiceRuntimePluginGenerator.kt | 2 +- .../client/CustomizableOperationGenerator.kt | 8 +- .../client/FluentClientGenerator.kt | 6 +- .../config/ServiceConfigGenerator.kt | 2 +- .../error/OperationErrorGenerator.kt | 2 +- .../protocol/ProtocolParserGenerator.kt | 10 +- .../protocol/ProtocolTestGenerator.kt | 13 +- .../protocol/RequestSerializerGenerator.kt | 2 +- .../protocol/ResponseDeserializerGenerator.kt | 6 +- .../MetadataCustomizationTest.kt | 2 +- .../http/ResponseBindingGeneratorTest.kt | 36 ++- .../codegen/core/rustlang/CargoDependency.kt | 4 +- .../rust/codegen/core/smithy/RuntimeType.kt | 40 +-- .../generators/http/HttpBindingGenerator.kt | 42 +-- .../codegen/core/smithy/protocols/AwsJson.kt | 6 +- .../codegen/core/smithy/protocols/AwsQuery.kt | 5 +- .../smithy/protocols/AwsQueryCompatible.kt | 4 +- .../codegen/core/smithy/protocols/Ec2Query.kt | 5 +- .../codegen/core/smithy/protocols/RestJson.kt | 7 +- .../codegen/core/smithy/protocols/RestXml.kt | 5 +- .../ServerHttpBoundProtocolGenerator.kt | 27 +- .../examples/response-header-interceptor.rs | 7 - .../examples/retry-classifier.rs | 2 +- .../examples/trace-serialize.rs | 2 +- .../tests/plugins_execution_order.rs | 2 +- .../aws-smithy-http-server/Cargo.toml | 1 + .../src/protocol/aws_json/rejection.rs | 5 + .../src/protocol/mod.rs | 119 ++++++--- .../src/protocol/rest_json_1/rejection.rs | 7 +- .../src/protocol/rest_xml/rejection.rs | 5 + rust-runtime/aws-smithy-http/src/header.rs | 204 ++++++++++---- rust-runtime/aws-smithy-http/src/http.rs | 13 +- .../external-types.toml | 2 + .../src/client/interceptors/context.rs | 24 +- .../src/client/orchestrator.rs | 3 +- .../src/client/runtime_plugin.rs | 2 + .../aws-smithy-runtime-api/src/http.rs | 4 +- .../aws-smithy-runtime-api/src/http/error.rs | 4 + .../src/http/headers.rs | 28 +- .../src/http/request.rs | 82 +++--- .../src/http/response.rs | 251 ++++++++++++++++++ .../src/client/http/hyper_014.rs | 19 +- .../client/http/test_util/capture_request.rs | 4 +- .../src/client/http/test_util/dvr.rs | 28 +- .../src/client/http/test_util/dvr/replay.rs | 23 +- .../src/client/http/test_util/infallible.rs | 7 +- .../src/client/orchestrator.rs | 88 +++--- .../src/client/orchestrator/operation.rs | 6 +- .../src/client/retries/classifiers.rs | 6 +- .../src/aws_query_compatible_errors.rs | 43 +-- rust-runtime/inlineable/src/json_errors.rs | 52 ++-- 96 files changed, 1039 insertions(+), 560 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime-api/src/http/response.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b32403cc2e5..952501eebaa 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -17,10 +17,16 @@ references = ["smithy-rs#3164"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "utkarshgupta137" +[[aws-sdk-rust]] +message = "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added." +references = ["smithy-rs#3138", "smithy-rs#3148"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + [[smithy-rs]] -message = "The HTTP `Request`, `Response`, `Headers`, and `HeaderValue` types have been moved from `aws_smithy_runtime_api::client::http::*` into `aws_smithy_runtime_api::http`" -references = ["smithy-rs#3138"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +message = "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/smithy-rs/discussions/3154). HTTP request types moved, and a new HTTP response type was added." +references = ["smithy-rs#3138", "smithy-rs#3148"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } author = "jdisanti" [[smithy-rs]] diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index f3f0f823109..d672e6f2b07 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -14,7 +14,6 @@ allowed_external_types = [ "aws_smithy_async::time::TimeSource", "aws_smithy_http::endpoint", "aws_smithy_http::endpoint::error::InvalidEndpointError", - "aws_smithy_runtime_api::client::result::SdkError", "aws_smithy_runtime::client::identity::cache::IdentityCache", "aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder", "aws_smithy_runtime_api::client::dns::ResolveDns", @@ -23,6 +22,8 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::ResolveIdentity", + "aws_smithy_runtime_api::client::orchestrator::HttpResponse", + "aws_smithy_runtime_api::client::result::SdkError", "aws_smithy_types::body::SdkBody", "aws_smithy_types::retry", "aws_smithy_types::retry::*", diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index 01cb6666174..41911e16f04 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -30,7 +30,7 @@ use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use http::header::{ACCEPT, AUTHORIZATION}; -use http::{HeaderValue, Response}; +use http::HeaderValue; use std::time::Duration; const DEFAULT_READ_TIMEOUT: Duration = Duration::from_secs(5); @@ -149,7 +149,7 @@ impl Builder { fn parse_response( provider_name: &'static str, - response: &Response, + response: &HttpResponse, ) -> Result> { if !response.status().is_success() { return Err(OrchestratorError::operation( diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 4e37fe4b7df..1e4d7f02faa 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -636,11 +636,14 @@ pub(crate) mod test { } pub(crate) fn token_response(ttl: u32, token: &'static str) -> HttpResponse { - http::Response::builder() - .status(200) - .header("X-aws-ec2-metadata-token-ttl-seconds", ttl) - .body(SdkBody::from(token)) - .unwrap() + HttpResponse::try_from( + http::Response::builder() + .status(200) + .header("X-aws-ec2-metadata-token-ttl-seconds", ttl) + .body(SdkBody::from(token)) + .unwrap(), + ) + .unwrap() } pub(crate) fn imds_request(path: &'static str, token: &str) -> HttpRequest { @@ -655,10 +658,13 @@ pub(crate) mod test { } pub(crate) fn imds_response(body: &'static str) -> HttpResponse { - http::Response::builder() - .status(200) - .body(SdkBody::from(body)) - .unwrap() + HttpResponse::try_from( + http::Response::builder() + .status(200) + .body(SdkBody::from(body)) + .unwrap(), + ) + .unwrap() } pub(crate) fn make_imds_client(http_client: &StaticReplayClient) -> super::Client { diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index 8d2863a6aed..05412d75ea0 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -8,7 +8,6 @@ use aws_smithy_http::endpoint::error::InvalidEndpointError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::result::SdkError; -use aws_smithy_types::body::SdkBody; use std::error::Error; use std::fmt; @@ -32,12 +31,12 @@ impl FailedToLoadToken { /// Error context for [`ImdsError::ErrorResponse`] #[derive(Debug)] pub struct ErrorResponse { - raw: http::Response, + raw: HttpResponse, } impl ErrorResponse { /// Returns the raw response from IMDS - pub fn response(&self) -> &http::Response { + pub fn response(&self) -> &HttpResponse { &self.raw } } @@ -81,7 +80,7 @@ impl ImdsError { Self::FailedToLoadToken(FailedToLoadToken { source }) } - pub(super) fn error_response(raw: http::Response) -> Self { + pub(super) fn error_response(raw: HttpResponse) -> Self { Self::ErrorResponse(ErrorResponse { raw }) } diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index d91fa3b89f2..8ec3e8914cc 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -183,8 +183,6 @@ fn parse_token_response(response: &HttpResponse) -> Result .headers() .get(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS) .ok_or(TokenErrorKind::NoTtl)? - .to_str() - .map_err(|_| TokenErrorKind::InvalidTtl)? .parse() .map_err(|_parse_error| TokenErrorKind::InvalidTtl)?; Ok(TtlToken { diff --git a/aws/rust-runtime/aws-http/external-types.toml b/aws/rust-runtime/aws-http/external-types.toml index 66b8c8e1fec..429bf1a9098 100644 --- a/aws/rust-runtime/aws-http/external-types.toml +++ b/aws/rust-runtime/aws-http/external-types.toml @@ -1,7 +1,9 @@ allowed_external_types = [ + "aws_smithy_runtime_api::http::headers::Headers", "aws_smithy_types::body::Error", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", + "aws_smithy_types::error::metadata::Builder", "aws_types::app_name::AppName", "aws_types::os_shim_internal::Env", "bytes::bytes::Bytes", diff --git a/aws/rust-runtime/aws-http/src/request_id.rs b/aws/rust-runtime/aws-http/src/request_id.rs index 2f337fa6958..ac9e5ac7d97 100644 --- a/aws/rust-runtime/aws-http/src/request_id.rs +++ b/aws/rust-runtime/aws-http/src/request_id.rs @@ -4,12 +4,13 @@ */ use aws_smithy_http::http::HttpHeaders; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::http::Headers; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; use aws_smithy_types::error::Unhandled; -use http::{HeaderMap, HeaderValue}; /// Constant for the [`ErrorMetadata`] extra field that contains the request ID const AWS_REQUEST_ID: &str = "aws_request_id"; @@ -26,8 +27,8 @@ where { fn request_id(&self) -> Option<&str> { match self { - Self::ResponseError(err) => extract_request_id(err.raw().http_headers()), - Self::ServiceError(err) => extract_request_id(err.raw().http_headers()), + Self::ResponseError(err) => err.raw().http_headers().request_id(), + Self::ServiceError(err) => err.raw().http_headers().request_id(), _ => None, } } @@ -45,15 +46,16 @@ impl RequestId for Unhandled { } } -impl RequestId for http::Response { +impl RequestId for HttpResponse { fn request_id(&self) -> Option<&str> { - extract_request_id(self.headers()) + self.headers().request_id() } } -impl RequestId for HeaderMap { +impl RequestId for Headers { fn request_id(&self) -> Option<&str> { - extract_request_id(self) + self.get("x-amzn-requestid") + .or(self.get("x-amz-request-id")) } } @@ -71,43 +73,35 @@ where } /// Applies a request ID to a generic error builder -#[doc(hidden)] -pub fn apply_request_id( - builder: ErrorMetadataBuilder, - headers: &HeaderMap, -) -> ErrorMetadataBuilder { - if let Some(request_id) = extract_request_id(headers) { +pub fn apply_request_id(builder: ErrorMetadataBuilder, headers: &Headers) -> ErrorMetadataBuilder { + if let Some(request_id) = headers.request_id() { builder.custom(AWS_REQUEST_ID, request_id) } else { builder } } -/// Extracts a request ID from HTTP response headers -fn extract_request_id(headers: &HeaderMap) -> Option<&str> { - headers - .get("x-amzn-requestid") - .or_else(|| headers.get("x-amz-request-id")) - .and_then(|value| value.to_str().ok()) -} - #[cfg(test)] mod tests { use super::*; use aws_smithy_types::body::SdkBody; - use http::Response; + use http::{HeaderValue, Response}; #[test] fn test_request_id_sdk_error() { - let without_request_id = || Response::builder().body(SdkBody::empty()).unwrap(); + let without_request_id = + || HttpResponse::try_from(Response::builder().body(SdkBody::empty()).unwrap()).unwrap(); let with_request_id = || { - Response::builder() - .header( - "x-amzn-requestid", - HeaderValue::from_static("some-request-id"), - ) - .body(SdkBody::empty()) - .unwrap() + HttpResponse::try_from( + Response::builder() + .header( + "x-amzn-requestid", + HeaderValue::from_static("some-request-id"), + ) + .body(SdkBody::empty()) + .unwrap(), + ) + .unwrap() }; assert_eq!( None, @@ -129,28 +123,28 @@ mod tests { #[test] fn test_extract_request_id() { - let mut headers = HeaderMap::new(); - assert_eq!(None, extract_request_id(&headers)); + let mut headers = Headers::new(); + assert_eq!(None, headers.request_id()); headers.append( "x-amzn-requestid", HeaderValue::from_static("some-request-id"), ); - assert_eq!(Some("some-request-id"), extract_request_id(&headers)); + assert_eq!(Some("some-request-id"), headers.request_id()); headers.append( "x-amz-request-id", HeaderValue::from_static("other-request-id"), ); - assert_eq!(Some("some-request-id"), extract_request_id(&headers)); + assert_eq!(Some("some-request-id"), headers.request_id()); headers.remove("x-amzn-requestid"); - assert_eq!(Some("other-request-id"), extract_request_id(&headers)); + assert_eq!(Some("other-request-id"), headers.request_id()); } #[test] fn test_apply_request_id() { - let mut headers = HeaderMap::new(); + let mut headers = Headers::new(); assert_eq!( ErrorMetadata::builder().build(), apply_request_id(ErrorMetadata::builder(), &headers).build(), diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index 687790cffff..1236c9fe500 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -14,9 +14,9 @@ use aws_smithy_runtime_api::client::interceptors::context::{ }; use aws_smithy_runtime_api::client::interceptors::Intercept; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::http::Headers; use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; -use http::HeaderValue; use std::{fmt, mem}; #[derive(Debug)] @@ -131,7 +131,7 @@ pub(crate) fn wrap_body_with_checksum_validator( /// If no checksum header is set, return `None`. If multiple checksum headers are set, the one that /// is fastest to compute will be chosen. pub(crate) fn check_headers_for_precalculated_checksum( - headers: &http::HeaderMap, + headers: &Headers, response_algorithms: &[&str], ) -> Option<(ChecksumAlgorithm, bytes::Bytes)> { let checksum_algorithms_to_check = @@ -154,13 +154,9 @@ pub(crate) fn check_headers_for_precalculated_checksum( let checksum_algorithm: ChecksumAlgorithm = checksum_algorithm.parse().expect( "CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER only contains valid checksum algorithm names", ); - if let Some(precalculated_checksum) = + if let Some(base64_encoded_precalculated_checksum) = headers.get(checksum_algorithm.into_impl().header_name()) { - let base64_encoded_precalculated_checksum = precalculated_checksum - .to_str() - .expect("base64 uses ASCII characters"); - // S3 needs special handling for checksums of objects uploaded with `MultiPartUpload`. if is_part_level_checksum(base64_encoded_precalculated_checksum) { tracing::warn!( diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index f0a49daa273..7ed167e3cfa 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -203,7 +203,7 @@ impl PresignedRequest { let _ = http_request .try_clone() .expect("must be cloneable, body is empty") - .into_http02x()?; + .try_into_http02x()?; Ok(Self { http_request }) } @@ -232,7 +232,7 @@ impl PresignedRequest { /// Converts this `PresignedRequest` directly into an `http` request. pub fn into_http_02x_request(self, body: B) -> http::Request { self.http_request - .into_http02x() + .try_into_http02x() .expect("constructor validated convertibility") .map(|_req| body) } diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 2d6c31ad94e..63e368d9ad1 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -5,11 +5,11 @@ use aws_smithy_http::http::HttpHeaders; use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::http::{Headers, Response}; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; use aws_smithy_types::error::Unhandled; -use http::{HeaderMap, HeaderValue}; const EXTENDED_REQUEST_ID: &str = "s3_extended_request_id"; @@ -27,8 +27,8 @@ where { fn extended_request_id(&self) -> Option<&str> { match self { - Self::ResponseError(err) => extract_extended_request_id(err.raw().http_headers()), - Self::ServiceError(err) => extract_extended_request_id(err.raw().http_headers()), + Self::ResponseError(err) => err.raw().http_headers().extended_request_id(), + Self::ServiceError(err) => err.raw().http_headers().extended_request_id(), _ => None, } } @@ -46,15 +46,15 @@ impl RequestIdExt for Unhandled { } } -impl RequestIdExt for http::Response { +impl RequestIdExt for Response { fn extended_request_id(&self) -> Option<&str> { - extract_extended_request_id(self.headers()) + self.headers().extended_request_id() } } -impl RequestIdExt for HeaderMap { +impl RequestIdExt for Headers { fn extended_request_id(&self) -> Option<&str> { - extract_extended_request_id(self) + self.get("x-amz-id-2") } } @@ -75,32 +75,25 @@ where #[doc(hidden)] pub fn apply_extended_request_id( builder: ErrorMetadataBuilder, - headers: &HeaderMap, + headers: &Headers, ) -> ErrorMetadataBuilder { - if let Some(extended_request_id) = extract_extended_request_id(headers) { + if let Some(extended_request_id) = headers.extended_request_id() { builder.custom(EXTENDED_REQUEST_ID, extended_request_id) } else { builder } } -/// Extracts the S3 Extended Request ID from HTTP response headers -fn extract_extended_request_id(headers: &HeaderMap) -> Option<&str> { - headers - .get("x-amz-id-2") - .and_then(|value| value.to_str().ok()) -} - #[cfg(test)] mod test { use super::*; use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::body::SdkBody; - use http::Response; #[test] fn handle_missing_header() { - let resp = http::Response::builder().status(400).body("").unwrap(); + let resp = + Response::try_from(http::Response::builder().status(400).body("").unwrap()).unwrap(); let mut builder = aws_smithy_types::Error::builder().message("123"); builder = apply_extended_request_id(builder, resp.headers()); assert_eq!(builder.build().extended_request_id(), None); @@ -108,12 +101,17 @@ mod test { #[test] fn test_extended_request_id_sdk_error() { - let without_extended_request_id = || Response::builder().body(SdkBody::empty()).unwrap(); + let without_extended_request_id = || { + Response::try_from(http::Response::builder().body(SdkBody::empty()).unwrap()).unwrap() + }; let with_extended_request_id = || { - Response::builder() - .header("x-amz-id-2", HeaderValue::from_static("some-request-id")) - .body(SdkBody::empty()) - .unwrap() + Response::try_from( + http::Response::builder() + .header("x-amz-id-2", "some-request-id") + .body(SdkBody::empty()) + .unwrap(), + ) + .unwrap() }; assert_eq!( None, @@ -137,25 +135,22 @@ mod test { #[test] fn test_extract_extended_request_id() { - let mut headers = HeaderMap::new(); - assert_eq!(None, extract_extended_request_id(&headers)); + let mut headers = Headers::new(); + assert_eq!(None, headers.extended_request_id()); - headers.append("x-amz-id-2", HeaderValue::from_static("some-request-id")); - assert_eq!( - Some("some-request-id"), - extract_extended_request_id(&headers) - ); + headers.append("x-amz-id-2", "some-request-id"); + assert_eq!(Some("some-request-id"), headers.extended_request_id()); } #[test] fn test_apply_extended_request_id() { - let mut headers = HeaderMap::new(); + let mut headers = Headers::new(); assert_eq!( ErrorMetadata::builder().build(), apply_extended_request_id(ErrorMetadata::builder(), &headers).build(), ); - headers.append("x-amz-id-2", HeaderValue::from_static("some-request-id")); + headers.append("x-amz-id-2", "some-request-id"); assert_eq!( ErrorMetadata::builder() .custom(EXTENDED_REQUEST_ID, "some-request-id") diff --git a/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs index 11c4346bbad..89e5923c1ef 100644 --- a/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs +++ b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::http::HttpHeaders; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; use aws_smithy_runtime_api::client::retries::classifiers::{ @@ -65,8 +64,7 @@ where let retry_after = ctx .response() - .and_then(|res| res.http_headers().get("x-amz-retry-after")) - .and_then(|header| header.to_str().ok()) + .and_then(|res| res.headers().get("x-amz-retry-after")) .and_then(|header| header.parse::().ok()) .map(std::time::Duration::from_millis); @@ -173,7 +171,7 @@ mod test { let test_response = http::Response::new("OK").map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); - ctx.set_response(test_response); + ctx.set_response(test_response.try_into().unwrap()); ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error()); @@ -189,7 +187,7 @@ mod test { .unwrap() .map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); - ctx.set_response(res); + ctx.set_response(res.try_into().unwrap()); ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); assert_eq!( diff --git a/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs index 16f138edb1f..45a4f22e2af 100644 --- a/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs +++ b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs @@ -59,8 +59,7 @@ fn extract_time_sent_from_response( .response() .headers() .get("date") - .ok_or("Response from server does not include a `date` header")? - .to_str()?; + .ok_or("Response from server does not include a `date` header")?; DateTime::from_str(date_header, Format::HttpDate).map_err(Into::into) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index fa255a512f3..4d7e3d8bdec 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -149,7 +149,7 @@ class AwsPresignedFluentBuilderMethod( *codegenScope, "OpError" to section.operationErrorType, "RawResponseType" to - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::orchestrator::HttpResponse"), ) { renderPresignedMethodBody(section) } @@ -191,7 +191,7 @@ class AwsPresignedFluentBuilderMethod( "Operation" to codegenContext.symbolProvider.toSymbol(section.operationShape), "OperationError" to section.operationErrorType, "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors") + "SharedInterceptor" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors") .resolve("SharedInterceptor"), "SigV4PresigningRuntimePlugin" to AwsRuntimeType.presigningInterceptor(runtimeConfig) .resolve("SigV4PresigningRuntimePlugin"), @@ -217,7 +217,7 @@ class AwsPresignedFluentBuilderMethod( "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), - "SharedRequestSerializer" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + "SharedRequestSerializer" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) .resolve("client::ser_de::SharedRequestSerializer"), ) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt index d77cc0a29c4..9fea90bf893 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt @@ -38,7 +38,7 @@ object AwsRuntimeType { "presigning_interceptors", visibility = Visibility.PUBCRATE, AwsCargoDependency.awsSigv4(runtimeConfig), - CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyRuntimeApiClient(runtimeConfig), ), ) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt index 6c05747183b..f2648ee914c 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt @@ -35,7 +35,7 @@ private fun RuntimeConfig.awsInlineableHttpRequestChecksum() = RuntimeType.forIn CargoDependency.Tracing, CargoDependency.smithyChecksums(this), CargoDependency.smithyHttp(this), - CargoDependency.smithyRuntimeApi(this), + CargoDependency.smithyRuntimeApiClient(this), CargoDependency.smithyTypes(this), ), ) @@ -122,7 +122,7 @@ class HttpRequestChecksumCustomization( is OperationSection.AdditionalInterceptors -> { if (requestAlgorithmMember != null) { section.registerInterceptor(runtimeConfig, this) { - val runtimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(runtimeConfig) rustTemplate( """ #{RequestChecksumInterceptor}::new(|input: &#{Input}| { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt index 5b35198f8a5..e49e834ddd7 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt @@ -36,7 +36,7 @@ private fun RuntimeConfig.awsInlineableHttpResponseChecksum() = RuntimeType.forI CargoDependency.Tracing, CargoDependency.smithyChecksums(this), CargoDependency.smithyHttp(this), - CargoDependency.smithyRuntimeApi(this), + CargoDependency.smithyRuntimeApiClient(this), CargoDependency.smithyTypes(this), ), ) @@ -89,7 +89,7 @@ class HttpResponseChecksumCustomization( // CRC32, CRC32C, SHA256, SHA1 -> "crc32", "crc32c", "sha256", "sha1" val responseAlgorithms = checksumTrait.responseAlgorithms .map { algorithm -> algorithm.lowercase() }.joinToString(", ") { algorithm -> "\"$algorithm\"" } - val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) rustTemplate( """ #{ResponseChecksumInterceptor}::new( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index e6d4a3f442d..ad1224546aa 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -29,7 +29,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Compani import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingTest import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyProtocolTestHelpers import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntime -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApi +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApiTestUtil import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.writable @@ -92,7 +92,7 @@ class IntegrationTestDependencies( addDependency(smithyAsync) addDependency(smithyProtocolTestHelpers(codegenContext.runtimeConfig)) addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util", "wire-mock"), scope = DependencyScope.Dev)) - addDependency(smithyRuntimeApi(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) + addDependency(smithyRuntimeApiTestUtil(runtimeConfig)) addDependency(smithyTypes) addDependency(Tokio) addDependency(Tracing.toDevDependency()) @@ -139,6 +139,7 @@ class S3TestDependencies(private val codegenContext: ClientCodegenContext) : Lib addDependency(AsyncStd) addDependency(BytesUtils.toDevDependency()) addDependency(FastRand.toDevDependency()) + addDependency(FuturesUtil.toDevDependency()) addDependency(HdrHistogram) addDependency(HttpBody.toDevDependency()) addDependency(Smol) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index b56fa513bb4..a6a0bc7b80e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -157,7 +157,7 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: arrayOf( "SigV4AuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4AuthScheme"), "SigV4aAuthScheme" to awsRuntime.resolve("auth::sigv4a::SigV4aAuthScheme"), - "SharedAuthScheme" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::auth::SharedAuthScheme"), + "SharedAuthScheme" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::auth::SharedAuthScheme"), ) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt index 9c64a26d8ad..4b9cc3616aa 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt @@ -38,7 +38,7 @@ private class ApiGatewayAcceptHeaderInterceptorCustomization(private val codegen InlineAwsDependency.forRustFile( "apigateway_interceptors", additionalDependency = arrayOf( - CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig), + CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig), ), ), ).resolve("AcceptHeaderInterceptor"), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt index 713280ceaac..364faa8c6a5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt @@ -152,5 +152,5 @@ private fun glacierInterceptorDependencies(runtimeConfig: RuntimeConfig) = listO CargoDependency.Hex, CargoDependency.Ring, CargoDependency.smithyHttp(runtimeConfig), - CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyRuntimeApiClient(runtimeConfig), ) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt index bf1b3862496..d4aa5bf78e2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt @@ -75,7 +75,7 @@ class TrimResourceIdCustomization( when (section) { is OperationSection.AdditionalInterceptors -> { section.registerInterceptor(codegenContext.runtimeConfig, this) { - val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) val interceptor = RuntimeType.forInlineDependency( InlineAwsDependency.forRustFile("route53_resource_id_preprocessor"), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt index a5610f0ef01..0cf1c196ff2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt @@ -184,8 +184,7 @@ class S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContex "Bytes" to RuntimeType.Bytes, "ErrorMetadata" to RuntimeType.errorMetadata(runtimeConfig), "ErrorBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), "base_errors" to restXmlErrors, ) @@ -193,7 +192,7 @@ class S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContex override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType { return ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> #{Result}<#{ErrorBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorBuilder}, #{XmlDecodeError}>", *errorScope, ) { rustTemplate( diff --git a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs index cf4b58e646c..570809842a4 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs @@ -4,6 +4,7 @@ */ use aws_sdk_dynamodb::operation::query::QueryOutput; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedResponseDeserializer}; use aws_smithy_types::body::SdkBody; @@ -13,7 +14,7 @@ fn do_bench() { use aws_sdk_dynamodb::operation::query::Query; use bytes::Bytes; - let response = http::Response::builder() + let response = HttpResponse::try_from(http::Response::builder() .header("server", "Server") .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") .header("content-type", "application/x-amz-json-1.0") @@ -23,7 +24,7 @@ fn do_bench() { .header("x-amz-crc32", "624725176") .status(http::StatusCode::from_u16(200).unwrap()) .body(SdkBody::from(Bytes::copy_from_slice(br#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#))) - .unwrap(); + .unwrap()).unwrap(); let operation = Query::new(); let config = operation.config().expect("operation should have config"); diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index bb87a2626ea..f565e887c5d 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -9,7 +9,6 @@ use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::SharedTimeSource; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_runtime::client::retries::RetryPartition; -use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_types::body::SdkBody; use std::time::{Duration, SystemTime}; @@ -19,7 +18,7 @@ fn req() -> http::Request { .unwrap() } -fn ok() -> HttpResponse { +fn ok() -> http::Response { http::Response::builder() .status(200) .header("server", "Server") @@ -31,14 +30,14 @@ fn ok() -> HttpResponse { .unwrap() } -fn err() -> HttpResponse { +fn err() -> http::Response { http::Response::builder() .status(500) .body(SdkBody::from("{ \"message\": \"The request has failed because of an unknown error, exception or failure.\", \"code\": \"InternalServerError\" }")) .unwrap() } -fn throttling_err() -> HttpResponse { +fn throttling_err() -> http::Response { http::Response::builder() .status(400) .body(SdkBody::from("{ \"message\": \"The request was denied due to request throttling.\", \"code\": \"ThrottlingException\" }")) diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 4f51e713c88..25d0be81e7d 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -32,7 +32,7 @@ aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1" bytes-utils = "0.1.2" fastrand = "2.0.1" -futures-util = { version = "0.3.16", default-features = false } +futures-util = { version = "0.3.16" } hdrhistogram = "7.5.2" http = "0.2.3" http-body = "0.4.5" diff --git a/aws/sdk/integration-tests/s3/tests/concurrency.rs b/aws/sdk/integration-tests/s3/tests/concurrency.rs index c54d303d4bf..ab4a7f8dd1c 100644 --- a/aws/sdk/integration-tests/s3/tests/concurrency.rs +++ b/aws/sdk/integration-tests/s3/tests/concurrency.rs @@ -3,11 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::future::Future; -use std::iter::repeat_with; -use std::net::SocketAddr; -use std::sync::Arc; - use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_sdk_s3::Client; @@ -15,9 +10,12 @@ use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; use aws_types::SdkConfig; use bytes::BytesMut; -use futures_util::future; use hdrhistogram::sync::SyncHistogram; use hdrhistogram::Histogram; +use std::future::Future; +use std::iter::repeat_with; +use std::net::SocketAddr; +use std::sync::Arc; use tokio::sync::Semaphore; use tokio::time::{Duration, Instant}; use tracing::debug; @@ -218,7 +216,7 @@ async fn test_concurrency(sdk_config: SdkConfig) { }); debug!("joining futures"); - let res: Vec<_> = future::join_all(futures).await; + let res: Vec<_> = ::futures_util::future::join_all(futures).await; // Assert we ran all the tasks assert_eq!(TASK_COUNT, res.len()); diff --git a/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs index cda97da3631..3035c7091ea 100644 --- a/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs +++ b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs @@ -36,8 +36,8 @@ impl ClassifyRetry for CustomizationTestClassifier { // ensure that it has the expected status code. if let Some(res) = ctx.response() { assert_eq!( - res.status(), 500, + res.status().as_u16(), "expected a 500 response from test connection" ); } diff --git a/aws/sdk/integration-tests/webassembly/src/http.rs b/aws/sdk/integration-tests/webassembly/src/http.rs index 930ebaf5476..19354d06069 100644 --- a/aws/sdk/integration-tests/webassembly/src/http.rs +++ b/aws/sdk/integration-tests/webassembly/src/http.rs @@ -6,12 +6,12 @@ use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; -pub(crate) fn make_request(_req: http::Request) -> Result, ()> { +pub(crate) fn make_request(_req: HttpRequest) -> Result { // Consumers here would pass the HTTP request to // the Wasm host in order to get the response back let body = " @@ -31,7 +31,7 @@ pub(crate) fn make_request(_req: http::Request) -> Resulta3a42310-42d0-46d1-9745-0cee9f4fb851 "; - Ok(http::Response::new(SdkBody::from(body))) + Ok(HttpResponse::try_from(http::Response::new(SdkBody::from(body))).unwrap()) } #[derive(Default, Debug, Clone)] @@ -45,7 +45,7 @@ impl WasmHttpConnector { impl HttpConnector for WasmHttpConnector { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { println!("Adapter: sending request..."); - let res = make_request(request.into_http02x().unwrap()).unwrap(); + let res = make_request(request).unwrap(); println!("{:?}", res); HttpConnectorFuture::new(async move { Ok(res) }) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index b573dbaab25..ca526b8650f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -33,7 +33,7 @@ import software.amazon.smithy.rust.codegen.core.util.letIf private fun codegenScope(runtimeConfig: RuntimeConfig): Array> { val smithyRuntime = CargoDependency.smithyRuntime(runtimeConfig).withFeature("http-auth").toType() - val smithyRuntimeApi = CargoDependency.smithyRuntimeApi(runtimeConfig).withFeature("http-auth").toType() + val smithyRuntimeApi = CargoDependency.smithyRuntimeApiClient(runtimeConfig).withFeature("http-auth").toType() val authHttp = smithyRuntime.resolve("client::auth::http") val authHttpApi = smithyRuntimeApi.resolve("client::auth::http") return arrayOf( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt index 94c37d0d732..aba470973da 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt @@ -43,7 +43,7 @@ class HttpChecksumRequiredGenerator( InlineDependency.forRustFile( RustModule.pubCrate("client_http_checksum_required", parent = ClientRustModule.root), "/inlineable/src/client_http_checksum_required.rs", - CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig), + CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig), CargoDependency.smithyTypes(codegenContext.runtimeConfig), CargoDependency.Http, CargoDependency.Md5, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index c204a17b641..9fcf05e0e72 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -34,11 +34,11 @@ private class HttpConnectorConfigCustomization( private val codegenScope = arrayOf( *preludeScope, "HttpClient" to configReexport( - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::http::HttpClient"), ), "IntoShared" to configReexport(RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared")), "SharedHttpClient" to configReexport( - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"), + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::http::SharedHttpClient"), ), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt index c07205bf624..af2e21294ca 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt @@ -46,7 +46,7 @@ class IdempotencyTokenGenerator( InlineDependency.forRustFile( RustModule.pubCrate("client_idempotency_token", parent = ClientRustModule.root), "/inlineable/src/client_idempotency_token.rs", - CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyRuntimeApiClient(runtimeConfig), CargoDependency.smithyTypes(runtimeConfig), InlineDependency.idempotencyToken(runtimeConfig), ).toType().resolve("IdempotencyTokenRuntimePlugin"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt index f66fd6f288f..bdd3e267f6a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt @@ -19,7 +19,7 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val api = RuntimeType.smithyRuntimeApi(rc) + val api = RuntimeType.smithyRuntimeApiClient(rc) arrayOf( *preludeScope, "ResolveCachedIdentity" to configReexport(api.resolve("client::identity::ResolveCachedIdentity")), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index ec09d34659c..a945ae2fc11 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -36,10 +36,10 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf "RetryConfig" to retryConfig.resolve("RetryConfig"), "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), "RetryPartition" to retries.resolve("RetryPartition"), - "SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::retries::SharedRetryStrategy"), - "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"), - "StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"), + "SharedAsyncSleep" to configReexport(sleepModule.resolve("SharedAsyncSleep")), + "SharedRetryStrategy" to configReexport(RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::retries::SharedRetryStrategy")), + "SharedTimeSource" to configReexport(RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource")), + "StandardRetryStrategy" to configReexport(retries.resolve("strategy::StandardRetryStrategy")), "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt index 88a1a77c930..5e484d4c861 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt @@ -39,7 +39,7 @@ private class SensitiveOutputCustomization( """ ${section.newLayerName}.store_put(#{SensitiveOutput}); """, - "SensitiveOutput" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + "SensitiveOutput" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) .resolve("client::orchestrator::SensitiveOutput"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 2c174047bfa..78f1439c3c8 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -106,7 +106,7 @@ class RequiredCustomizations : ClientCodegenDecorator { """, "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), - "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), + "R" to RuntimeType.smithyRuntimeApiClient(rc).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(rc), // this can't use the auto-rexport because the builder generator is defined in codegen core "BuildError" to rc.operationBuildError(), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index f40f46284df..37c6b863b3c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -26,7 +26,7 @@ internal class EndpointConfigCustomization( ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val moduleUseName = codegenContext.moduleUseName() - private val epModule = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint") + private val epModule = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::endpoint") private val epRuntimeModule = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints") private val codegenScope = arrayOf( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt index 9265a85d731..248e3792429 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt @@ -58,8 +58,8 @@ class Types(runtimeConfig: RuntimeConfig) { private val smithyTypesEndpointModule = RuntimeType.smithyTypes(runtimeConfig).resolve("endpoint") val smithyHttpEndpointModule = RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint") val smithyEndpoint = smithyTypesEndpointModule.resolve("Endpoint") - val endpointFuture = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint::EndpointFuture") - private val endpointRtApi = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::endpoint") + val endpointFuture = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::endpoint::EndpointFuture") + private val endpointRtApi = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::endpoint") val resolveEndpointError = smithyHttpEndpointModule.resolve("ResolveEndpointError") fun toArray() = arrayOf( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index 17e47c6570d..ec3b21417a1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -43,7 +43,7 @@ class EndpointParamsInterceptorGenerator( private val endpointTypesGenerator = EndpointTypesGenerator.fromContext(codegenContext) private val codegenScope = codegenContext.runtimeConfig.let { rc -> val endpointTypesGenerator = EndpointTypesGenerator.fromContext(codegenContext) - val runtimeApi = CargoDependency.smithyRuntimeApi(rc).toType() + val runtimeApi = CargoDependency.smithyRuntimeApiClient(rc).toType() val interceptors = runtimeApi.resolve("client::interceptors") val orchestrator = runtimeApi.resolve("client::orchestrator") arrayOf( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 12bc55c8dcf..0951ce1d714 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -18,7 +18,7 @@ class ClientRuntimeTypesReExportGenerator( ) { fun render() { val rc = codegenContext.runtimeConfig - val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(rc) + val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(rc) rustCrate.withModule(ClientRustModule.config) { rustTemplate( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index e83ba1e0e87..1c92575ea42 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -19,7 +19,7 @@ class ConfigOverrideRuntimePluginGenerator( ) { private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val runtimeApi = RuntimeType.smithyRuntimeApi(rc) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *RuntimeType.preludeScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 04e03f1af8e..842a427f5e4 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -91,11 +91,11 @@ open class OperationGenerator( *preludeScope, "Arc" to RuntimeType.Arc, "ConcreteInput" to symbolProvider.toSymbol(operationShape.inputShape(model)), - "Input" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Input"), + "Input" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::Input"), "Operation" to symbolProvider.toSymbol(operationShape), "OperationError" to errorType, "OperationOutput" to outputType, - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) @@ -164,9 +164,9 @@ open class OperationGenerator( } """, *codegenScope, - "Error" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Error"), + "Error" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::Error"), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "OrchestratorError" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::error::OrchestratorError"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index 226334d7d0d..501e4c7dd42 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -22,7 +22,7 @@ class OperationRuntimePluginGenerator( private val codegenContext: ClientCodegenContext, ) { private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val runtimeApi = RuntimeType.smithyRuntimeApi(rc) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *preludeScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index 84508e104dc..c9c342a2a31 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -87,7 +87,7 @@ class PaginatorGenerator private constructor( "Builder" to symbolProvider.symbolForBuilder(operation.inputShape(model)), // SDK Types - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), "pagination_stream" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::pagination_stream"), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index 875e8ef73ee..b58b8e97641 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -65,7 +65,7 @@ class ServiceRuntimePluginGenerator( private val codegenContext: ClientCodegenContext, ) { private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val runtimeApi = RuntimeType.smithyRuntimeApi(rc) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *preludeScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index 2d1a086035f..68ed17a95b7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -34,9 +34,9 @@ class CustomizableOperationGenerator( .resolve("CustomizableOperation"), "CustomizableSend" to ClientRustModule.Client.customize.toType() .resolve("internal::CustomizableSend"), - "HttpRequest" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpRequest" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpRequest"), - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), "Intercept" to RuntimeType.intercept(runtimeConfig), "MapRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) @@ -50,7 +50,7 @@ class CustomizableOperationGenerator( .resolve("internal::SendResult"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "SharedInterceptor" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::interceptors::SharedInterceptor"), ) @@ -206,7 +206,7 @@ class CustomizableOperationGenerator( } """, *preludeScope, - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 07c58e0ec3d..2c48584d48a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -259,7 +259,7 @@ class FluentClientGenerator( """, *preludeScope, "RawResponseType" to - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "Operation" to operationSymbol, "OperationError" to errorType, "OperationOutput" to outputType, @@ -344,7 +344,7 @@ class FluentClientGenerator( *preludeScope, "CustomizableOperation" to ClientRustModule.Client.customize.toType() .resolve("CustomizableOperation"), - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), "Operation" to operationSymbol, "OperationError" to errorType, @@ -449,7 +449,7 @@ class FluentClientGenerator( private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): RuntimeType = codegenContext.runtimeConfig.let { rc -> RuntimeType.forInlineFun("base_client_runtime_plugins", ClientRustModule.config) { - val api = RuntimeType.smithyRuntimeApi(rc) + val api = RuntimeType.smithyRuntimeApiClient(rc) val rt = RuntimeType.smithyRuntime(rc) rustTemplate( """ diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index 347c731b20b..d1446a3b32b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -278,7 +278,7 @@ class ServiceConfigGenerator( "RuntimeComponentsBuilder" to configReexport(RuntimeType.runtimeComponentsBuilder(runtimeConfig)), "RuntimePlugin" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)), "SharedRuntimePlugin" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)), - "runtime_plugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin"), + "runtime_plugin" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin"), ) fun render(writer: RustWriter) { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt index e00195a6cc8..c6f29c15508 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt @@ -54,7 +54,7 @@ class OperationErrorGenerator( private val runtimeConfig = symbolProvider.config.runtimeConfig private val errorMetadata = errorMetadata(symbolProvider.config.runtimeConfig) private val createUnhandledError = - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::result::CreateUnhandledError") + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::result::CreateUnhandledError") private fun operationErrors(): List = (operationOrEventStream as OperationShape).operationErrors(model).map { it.asStructureShape().get() } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt index 17632df46f5..3e19c350b9e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt @@ -50,9 +50,11 @@ class ProtocolParserGenerator( private val symbolProvider: RustSymbolProvider = codegenContext.symbolProvider private val codegenScope = arrayOf( + "Bytes" to RuntimeType.Bytes, + "Headers" to RuntimeType.headers(codegenContext.runtimeConfig), + "Response" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("http::Response"), "http" to RuntimeType.Http, "operation" to RuntimeType.operationModule(codegenContext.runtimeConfig), - "Bytes" to RuntimeType.Bytes, "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), ) @@ -66,7 +68,7 @@ class ProtocolParserGenerator( return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_response") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{http}::header::HeaderMap, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, @@ -94,7 +96,7 @@ class ProtocolParserGenerator( return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_error") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{http}::header::HeaderMap, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, @@ -193,7 +195,7 @@ class ProtocolParserGenerator( return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_response") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) rustBlockTemplate( - "pub fn $fnName(response: &mut #{http}::Response<#{SdkBody}>) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(response: &mut #{Response}) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 4c4cfcd796e..f3ae7e782b2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -277,7 +277,11 @@ class DefaultProtocolTestGenerator( writeInline("let expected_output =") instantiator.render(this, expectedShape, testCase.params) write(";") - write("let mut http_response = #T::new()", RT.HttpResponseBuilder) + rustTemplate( + "let mut http_response = #{Response}::try_from(#{HttpResponseBuilder}::new()", + "Response" to RT.smithyRuntimeApi(rc).resolve("http::Response"), + "HttpResponseBuilder" to RT.HttpResponseBuilder, + ) testCase.headers.forEach { (key, value) -> writeWithNoFormatting(".header(${key.dq()}, ${value.dq()})") } @@ -285,7 +289,8 @@ class DefaultProtocolTestGenerator( """ .status(${testCase.code}) .body(#T::from(${testCase.body.orNull()?.dq()?.replace("#", "##") ?: "vec![]"})) - .unwrap(); + .unwrap() + ).unwrap(); """, RT.sdkBody(runtimeConfig = rc), ) @@ -307,10 +312,10 @@ class DefaultProtocolTestGenerator( }); """, "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), - "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc) + "SharedResponseDeserializer" to RT.smithyRuntimeApiClient(rc) .resolve("client::ser_de::SharedResponseDeserializer"), "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), - "DeserializeResponse" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::DeserializeResponse"), + "DeserializeResponse" to RT.smithyRuntimeApiClient(rc).resolve("client::ser_de::DeserializeResponse"), "RuntimePlugin" to RT.runtimePlugin(rc), "SdkBody" to RT.sdkBody(rc), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index dc2b287b507..f079cf1026a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -34,7 +34,7 @@ class RequestSerializerGenerator( private val httpBindingResolver = protocol.httpBindingResolver private val symbolProvider = codegenContext.symbolProvider private val codegenScope by lazy { - val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) val interceptorContext = runtimeApi.resolve("client::interceptors::context") arrayOf( *preludeScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index 84c5debffcb..2f183c3444e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -33,9 +33,9 @@ class ResponseDeserializerGenerator( private val codegenScope by lazy { val interceptorContext = - CargoDependency.smithyRuntimeApi(runtimeConfig).toType().resolve("client::interceptors::context") + CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType().resolve("client::interceptors::context") val orchestrator = - CargoDependency.smithyRuntimeApi(runtimeConfig).toType().resolve("client::orchestrator") + CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType().resolve("client::orchestrator") arrayOf( *preludeScope, "Error" to interceptorContext.resolve("Error"), @@ -44,7 +44,7 @@ class ResponseDeserializerGenerator( "Output" to interceptorContext.resolve("Output"), "OutputOrError" to interceptorContext.resolve("OutputOrError"), "OrchestratorError" to orchestrator.resolve("OrchestratorError"), - "DeserializeResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::ser_de::DeserializeResponse"), + "DeserializeResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::ser_de::DeserializeResponse"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), "debug_span" to RuntimeType.Tracing.resolve("debug_span"), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 0795df3cfb1..81998723823 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -43,7 +43,7 @@ class MetadataCustomizationTest { "Intercept" to RuntimeType.intercept(runtimeConfig), "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), "capture_request" to RuntimeType.captureRequest(runtimeConfig), - "RuntimeComponents" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "RuntimeComponents" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::runtime_components::RuntimeComponents"), ) rustCrate.testModule { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt index a4b9f6e8b72..b02e6879b6d 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt @@ -11,6 +11,8 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver @@ -21,7 +23,6 @@ import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder -import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.lookup import software.amazon.smithy.rust.codegen.core.util.outputShape @@ -95,21 +96,28 @@ class ResponseBindingGeneratorTest { val testProject = TestWorkspace.testProject(symbolProvider) testProject.renderOperation() testProject.withModule(symbolProvider.moduleForShape(outputShape)) { - unitTest( - "http_header_deser", + rustTemplate( """ - use crate::protocol_serde::shape_put_object_output::*; - let resp = http::Response::builder() - .header("X-Ints", "1,2,3") - .header("X-Ints", "4,5,6") - .header("X-MediaType", "c21pdGh5LXJz") - .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT") - .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT,Tue, 17 Dec 2019 23:48:18 GMT") - .body(()).expect("valid request"); - assert_eq!(de_int_list_header(resp.headers()).unwrap(), Some(vec![1,2,3,4,5,6])); - assert_eq!(de_media_type_header(resp.headers()).expect("valid").unwrap(), "smithy-rs"); - assert_eq!(de_date_header_list_header(resp.headers()).unwrap().unwrap().len(), 3); + ##[test] + fn http_header_deser() { + use crate::protocol_serde::shape_put_object_output::*; + let resp = #{Response}::try_from( + #{http}::Response::builder() + .header("X-Ints", "1,2,3") + .header("X-Ints", "4,5,6") + .header("X-MediaType", "c21pdGh5LXJz") + .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT") + .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT,Tue, 17 Dec 2019 23:48:18 GMT") + .body(()) + .expect("valid request") + ).unwrap(); + assert_eq!(de_int_list_header(resp.headers()).unwrap(), Some(vec![1,2,3,4,5,6])); + assert_eq!(de_media_type_header(resp.headers()).expect("valid").unwrap(), "smithy-rs"); + assert_eq!(de_date_header_list_header(resp.headers()).unwrap().unwrap().len(), 3); + } """, + "Response" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("http::Response"), + "http" to RuntimeType.Http, ) } testProject.compileAndTest() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 79c215009a4..08e0e024a1e 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -97,7 +97,7 @@ class InlineDependency( CargoDependency.smithyTypes(runtimeConfig), ) - fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = forInlineableRustFile("auth_plugin", CargoDependency.smithyRuntimeApi(runtimeConfig)) + fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = forInlineableRustFile("auth_plugin", CargoDependency.smithyRuntimeApiClient(runtimeConfig)) fun jsonErrors(runtimeConfig: RuntimeConfig) = forInlineableRustFile( @@ -305,7 +305,7 @@ data class CargoDependency( .withFeature("client") fun smithyRuntimeTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntime(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime-api") - .withFeature("client") + fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).withFeature("client") fun smithyRuntimeApiTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-types") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index ba6bcb618cd..5e552d7cd5d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -324,6 +324,7 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun smithyQuery(runtimeConfig: RuntimeConfig) = CargoDependency.smithyQuery(runtimeConfig).toType() fun smithyRuntime(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntime(runtimeConfig).toType() fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeApi(runtimeConfig).toType() + fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType() fun smithyTypes(runtimeConfig: RuntimeConfig) = CargoDependency.smithyTypes(runtimeConfig).toType() fun smithyXml(runtimeConfig: RuntimeConfig) = CargoDependency.smithyXml(runtimeConfig).toType() private fun smithyProtocolTest(runtimeConfig: RuntimeConfig) = @@ -340,61 +341,64 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag") fun runtimeComponents(runtimeConfig: RuntimeConfig) = - smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponents") + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_components::RuntimeComponents") fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) = - smithyRuntimeApi(runtimeConfig).resolve("client::runtime_components::RuntimeComponentsBuilder") + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_components::RuntimeComponentsBuilder") fun runtimePlugins(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugins") + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugins") fun runtimePlugin(runtimeConfig: RuntimeConfig) = - smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") fun sharedRuntimePlugin(runtimeConfig: RuntimeConfig) = - smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::SharedRuntimePlugin") + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin::SharedRuntimePlugin") fun boxError(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("box_error::BoxError") fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::result::SdkError") + smithyRuntimeApiClient(runtimeConfig).resolve("client::result::SdkError") fun intercept(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::Intercept") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::Intercept") fun interceptorContext(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::InterceptorContext") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::InterceptorContext") fun sharedInterceptor(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::SharedInterceptor") fun afterDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::AfterDeserializationInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::AfterDeserializationInterceptorContextRef") fun beforeSerializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextRef") fun beforeSerializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextMut") fun beforeDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextRef") fun beforeDeserializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextMut") fun beforeTransmitInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextRef") fun beforeTransmitInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextMut") fun finalizerInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextRef") fun finalizerInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextMut") + + fun headers(runtimeConfig: RuntimeConfig): RuntimeType = + smithyRuntimeApi(runtimeConfig).resolve("http::Headers") fun blob(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("Blob") fun byteStream(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("byte_stream::ByteStream") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt index 4a9839d295e..8ebf6082c86 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt @@ -42,6 +42,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.generators.OperationBuildError @@ -127,7 +128,6 @@ class HttpBindingGenerator( private val index = HttpBindingIndex.of(model) private val headerUtil = RuntimeType.smithyHttp(runtimeConfig).resolve("header") private val defaultTimestampFormat = TimestampFormatTrait.Format.EPOCH_SECONDS - private val dateTime = RuntimeType.dateTime(runtimeConfig).toSymbol().rustType() private val protocolFunctions = ProtocolFunctions(codegenContext) /** @@ -146,13 +146,14 @@ class HttpBindingGenerator( check(binding.location == HttpLocation.HEADER) val outputT = symbolProvider.toSymbol(binding.member).makeOptional() return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = "header") { fnName -> - rustBlock( - "pub(crate) fn $fnName(header_map: &#T::HeaderMap) -> std::result::Result<#T, #T::ParseError>", - RuntimeType.Http, - outputT, - headerUtil, + rustBlockTemplate( + "pub(crate) fn $fnName(header_map: &#{Headers}) -> #{Result}<#{Output}, #{header_util}::ParseError>", + *preludeScope, + "Headers" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("http::Headers"), + "Output" to outputT, + "header_util" to headerUtil, ) { - rust("let headers = header_map.get_all(${binding.locationName.dq()}).iter();") + rust("let headers = header_map.get_all(${binding.locationName.dq()});") deserializeFromHeader(model.expectShape(binding.member.target), binding.member) } } @@ -164,29 +165,32 @@ class HttpBindingGenerator( val target = model.expectShape(binding.member.target) check(target is MapShape) val inner = protocolFunctions.deserializeFn(binding.member, fnNameSuffix = "inner") { fnName -> - rustBlock( - "pub fn $fnName(headers: #T::header::ValueIter) -> std::result::Result, #T::ParseError>", - RuntimeType.Http, - symbolProvider.toSymbol(model.expectShape(target.value.target)), - headerUtil, + rustBlockTemplate( + "pub fn $fnName<'a>(headers: impl #{Iterator}) -> std::result::Result, #{header_util}::ParseError>", + *preludeScope, + "Value" to symbolProvider.toSymbol(model.expectShape(target.value.target)), + "header_util" to headerUtil, ) { deserializeFromHeader(model.expectShape(target.value.target), binding.member) } } val returnTypeSymbol = outputSymbol.mapRustType { it.asOptional() } return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = "prefix_header") { fnName -> - rustBlock( - "pub(crate) fn $fnName(header_map: &#T::HeaderMap) -> std::result::Result<#T, #T::ParseError>", - RuntimeType.Http, - returnTypeSymbol, - headerUtil, + rustBlockTemplate( + "pub(crate) fn $fnName(header_map: &#{Headers}) -> std::result::Result<#{Value}, #{header_util}::ParseError>", + "Headers" to RuntimeType.headers(runtimeConfig), + "Value" to returnTypeSymbol, + "header_util" to headerUtil, ) { rust( """ - let headers = #T::headers_for_prefix(header_map, ${binding.locationName.dq()}); + let headers = #T::headers_for_prefix( + header_map.iter().map(|(k, _)| k), + ${binding.locationName.dq()} + ); let out: std::result::Result<_, _> = headers.map(|(key, header_name)| { let values = header_map.get_all(header_name); - #T(values.iter()).map(|v| (key.to_string(), v.expect( + #T(values).map(|v| (key.to_string(), v.expect( "we have checked there is at least one value for this header name; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues" ))) }).collect(); diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt index 40f8f22934d..06b479506c1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt @@ -127,7 +127,7 @@ open class AwsJson( private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.Http.resolve("HeaderMap"), + "Headers" to RuntimeType.headers(runtimeConfig), "JsonError" to CargoDependency.smithyJson(runtimeConfig).toType() .resolve("deserialize::error::DeserializeError"), "json_errors" to RuntimeType.jsonErrors(runtimeConfig), @@ -157,7 +157,7 @@ open class AwsJson( ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustTemplate( """ - pub fn $fnName(_response_status: u16, response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { + pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { #{json_errors}::parse_error_metadata(response_body, response_headers) } """, @@ -171,7 +171,7 @@ open class AwsJson( """ pub fn $fnName(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { // Note: HeaderMap::new() doesn't allocate - #{json_errors}::parse_error_metadata(payload, &#{HeaderMap}::new()) + #{json_errors}::parse_error_metadata(payload, &#{Headers}::new()) } """, *errorScope, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt index 934b703ebae..da7ccd1ad12 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt @@ -42,8 +42,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), ) @@ -60,7 +59,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol { override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType = ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, ) { rust("#T::parse_error_metadata(response_body)", awsQueryErrors) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt index 489f1de5827..b37a0b57251 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt @@ -49,7 +49,7 @@ class AwsQueryCompatible( private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, + "Headers" to RuntimeType.headers(runtimeConfig), "JsonError" to CargoDependency.smithyJson(runtimeConfig).toType() .resolve("deserialize::error::DeserializeError"), "aws_query_compatible_errors" to RuntimeType.awsQueryCompatibleErrors(runtimeConfig), @@ -74,7 +74,7 @@ class AwsQueryCompatible( ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustTemplate( """ - pub fn $fnName(_response_status: u16, response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { + pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { let mut builder = #{json_errors}::parse_error_metadata(response_body, response_headers)?; if let Some((error_code, error_type)) = diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt index 11424033a41..691736780b9 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt @@ -24,8 +24,7 @@ class Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), ) @@ -51,7 +50,7 @@ class Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol { override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType = ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, ) { rust("#T::parse_error_metadata(response_body)", ec2QueryErrors) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt index 6b28820935c..3e08ceca8e2 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt @@ -64,10 +64,9 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.Http.resolve("HeaderMap"), + "Headers" to RuntimeType.headers(runtimeConfig), "JsonError" to CargoDependency.smithyJson(runtimeConfig).toType() .resolve("deserialize::error::DeserializeError"), - "Response" to RuntimeType.Http.resolve("Response"), "json_errors" to RuntimeType.jsonErrors(runtimeConfig), ) @@ -104,7 +103,7 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustTemplate( """ - pub fn $fnName(_response_status: u16, response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { + pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { #{json_errors}::parse_error_metadata(response_body, response_headers) } """, @@ -118,7 +117,7 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { """ pub fn $fnName(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { // Note: HeaderMap::new() doesn't allocate - #{json_errors}::parse_error_metadata(payload, &#{HeaderMap}::new()) + #{json_errors}::parse_error_metadata(payload, &#{Headers}::new()) } """, *errorScope, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt index 41df9fd52d6..15d294c0356 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt @@ -24,8 +24,7 @@ open class RestXml(val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), ) @@ -49,7 +48,7 @@ open class RestXml(val codegenContext: CodegenContext) : Protocol { override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType = ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, ) { rust("#T::parse_error_metadata(response_body)", restXmlErrors) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt index c13ac7f9981..49ddcb03349 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt @@ -44,6 +44,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization @@ -268,7 +269,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape)!! rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_classifier( + #{SmithyHttpServer}::protocol::content_type_header_classifier_http( request.headers(), Some("$expectedRequestContentType"), )?; @@ -722,7 +723,15 @@ class ServerHttpBoundProtocolTraitImplGenerator( inputShape.serverBuilderSymbol(codegenContext), ) Attribute.AllowUnusedVariables.render(this) - rust("let (parts, body) = request.into_parts();") + rustTemplate( + """ + let #{RequestParts} { uri, headers, body, .. } = #{Request}::try_from(request)?.into_parts(); + """, + *preludeScope, + "ParseError" to RuntimeType.smithyHttp(runtimeConfig).resolve("header::ParseError"), + "Request" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("http::Request"), + "RequestParts" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("http::RequestParts"), + ) val parser = structuredDataParser.serverInputParser(operationShape) val noInputs = model.expectShape(operationShape.inputShape).expectTrait().originalId == null @@ -734,8 +743,8 @@ class ServerHttpBoundProtocolTraitImplGenerator( rustBlock("if !bytes.is_empty()") { rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_classifier( - &parts.headers, + #{SmithyHttpServer}::protocol::content_type_header_classifier_smithy( + &headers, Some("$expectedRequestContentType"), )?; input = #{parser}(bytes.as_ref(), input)?; @@ -773,7 +782,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( conditionalBlock("if body.is_empty() {", "}", conditional = parser != null) { rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_empty_body_no_modeled_input(&parts.headers)?; + #{SmithyHttpServer}::protocol::content_type_header_empty_body_no_modeled_input(&headers)?; """, *codegenScope, ) @@ -896,7 +905,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( }, ) with(writer) { - rustTemplate("let input_string = parts.uri.path();") + rustTemplate("let input_string = uri.path();") if (greedyLabelIndex >= 0 && greedyLabelIndex + 1 < httpTrait.uri.segments.size) { rustTemplate( """ @@ -981,7 +990,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( with(writer) { rustTemplate( """ - let query_string = parts.uri.query().unwrap_or(""); + let query_string = uri.query().unwrap_or(""); let pairs = #{FormUrlEncoded}::parse(query_string.as_bytes()); """.trimIndent(), *codegenScope, @@ -1152,7 +1161,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( val deserializer = httpBindingGenerator.generateDeserializeHeaderFn(binding) writer.rustTemplate( """ - #{deserializer}(&parts.headers)? + #{deserializer}(&headers)? """.trimIndent(), "deserializer" to deserializer, *codegenScope, @@ -1166,7 +1175,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( val deserializer = httpBindingGenerator.generateDeserializePrefixHeadersFn(binding) writer.rustTemplate( """ - #{deserializer}(&parts.headers)? + #{deserializer}(&headers)? """.trimIndent(), "deserializer" to deserializer, *codegenScope, diff --git a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs index 9776d5186b8..a1ec2501979 100644 --- a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs +++ b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs @@ -37,9 +37,6 @@ impl Storable for RequestId { #[derive(Debug, thiserror::Error)] enum RequestIdError { - /// The server-sent request ID cannot be converted into a string during parsing. - #[error("RequestID sent by the server cannot be parsed into a string. Error: {0}")] - NonParsableServerRequestId(String), /// Client side #[error("Client side request ID has not been set")] ClientRequestIdMissing(), @@ -106,10 +103,6 @@ impl Intercept for ResponseHeaderLoggingInterceptor { .find(|(header_name, _)| *header_name == "x-request-id"); if let Some((_, server_id)) = header_received { - let server_id = server_id - .to_str() - .map_err(|e| Box::new(RequestIdError::NonParsableServerRequestId(e.to_string())))?; - let request_details = cfg .get_mut::() .ok_or_else(|| Box::new(RequestIdError::ClientRequestIdMissing()))?; diff --git a/examples/pokemon-service-client-usage/examples/retry-classifier.rs b/examples/pokemon-service-client-usage/examples/retry-classifier.rs index c979bcc5bd4..b5754a5fba1 100644 --- a/examples/pokemon-service-client-usage/examples/retry-classifier.rs +++ b/examples/pokemon-service-client-usage/examples/retry-classifier.rs @@ -53,7 +53,7 @@ impl ClassifyRetry for SampleRetryClassifier { .and_then(|err| err.downcast_ref::()) { if let Some(response) = ctx.response() { - if response.status() == StatusCode::SERVICE_UNAVAILABLE { + if response.status() == StatusCode::SERVICE_UNAVAILABLE.into() { return RetryAction::server_error(); } } diff --git a/examples/pokemon-service-client-usage/examples/trace-serialize.rs b/examples/pokemon-service-client-usage/examples/trace-serialize.rs index 069aebe831e..39cb53c4f1b 100644 --- a/examples/pokemon-service-client-usage/examples/trace-serialize.rs +++ b/examples/pokemon-service-client-usage/examples/trace-serialize.rs @@ -64,7 +64,7 @@ impl Intercept for WireFormatInterceptor { // Get the response type from the context. let response = context.response(); // Print the response. - if response.status() == StatusCode::OK { + if response.status().as_u16() == StatusCode::OK.as_u16() { tracing::info!(?response, "Response received:"); } else { tracing::error!(?response); diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index 4a7bb037511..be50b50a045 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -44,7 +44,7 @@ async fn plugin_layers_are_executed_in_registration_order() { rcvr.expect_request() }; - app.call(request.into_http02x().unwrap()).await.unwrap(); + app.call(request.try_into_http02x().unwrap()).await.unwrap(); let output_guard = output.lock().unwrap(); assert_eq!(output_guard.deref(), &vec!["first", "second"]); diff --git a/rust-runtime/aws-smithy-http-server/Cargo.toml b/rust-runtime/aws-smithy-http-server/Cargo.toml index bfaa7fb3141..b686cb615aa 100644 --- a/rust-runtime/aws-smithy-http-server/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server/Cargo.toml @@ -21,6 +21,7 @@ request-id = ["dep:uuid"] async-trait = "0.1" aws-smithy-http = { path = "../aws-smithy-http", features = ["rt-tokio"] } aws-smithy-json = { path = "../aws-smithy-json" } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x", "hyper-0-14-x"] } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1.1" diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs index 514b06da63b..b3bc24fae25 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs @@ -4,6 +4,7 @@ */ use crate::rejection::MissingContentTypeReason; +use aws_smithy_runtime_api::http::HttpError; use thiserror::Error; #[derive(Debug, Error)] @@ -26,6 +27,10 @@ pub enum RequestRejection { JsonDeserialize(#[from] aws_smithy_json::deserialize::error::DeserializeError), #[error("request does not adhere to modeled constraints: {0}")] ConstraintViolation(String), + + /// Typically happens when the request has headers that are not valid UTF-8. + #[error("failed to convert request: {0}")] + HttpConversion(#[from] HttpError), } impl From for RequestRejection { diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs b/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs index 9b3f8a1996a..0b3faf0136e 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs @@ -11,7 +11,9 @@ pub mod rest_json_1; pub mod rest_xml; use crate::rejection::MissingContentTypeReason; -use http::HeaderMap; +use aws_smithy_runtime_api::http::Headers as SmithyHeaders; +use http::header::CONTENT_TYPE; +use http::{HeaderMap, HeaderValue}; #[cfg(test)] pub mod test_helpers { @@ -37,12 +39,25 @@ pub mod test_helpers { } } +#[allow(clippy::result_large_err)] +fn parse_mime(content_type: &str) -> Result { + content_type + .parse::() + .map_err(MissingContentTypeReason::MimeParseError) +} + /// When there are no modeled inputs, /// a request body is empty and the content-type request header must not be set #[allow(clippy::result_large_err)] -pub fn content_type_header_empty_body_no_modeled_input(headers: &HeaderMap) -> Result<(), MissingContentTypeReason> { +pub fn content_type_header_empty_body_no_modeled_input( + headers: &SmithyHeaders, +) -> Result<(), MissingContentTypeReason> { if headers.contains_key(http::header::CONTENT_TYPE) { - let found_mime = parse_content_type(headers)?; + let found_mime = headers + .get(http::header::CONTENT_TYPE) + .unwrap() // The header is present, `unwrap` will not panic. + .parse::() + .map_err(MissingContentTypeReason::MimeParseError)?; Err(MissingContentTypeReason::UnexpectedMimeType { expected_mime: None, found_mime: Some(found_mime), @@ -52,27 +67,39 @@ pub fn content_type_header_empty_body_no_modeled_input(headers: &HeaderMap) -> R } } +/// Checks that the `content-type` header is valid from a Smithy `Headers`. #[allow(clippy::result_large_err)] -fn parse_content_type(headers: &HeaderMap) -> Result { - headers - .get(http::header::CONTENT_TYPE) - .unwrap() // The header is present, `unwrap` will not panic. - .to_str() - .map_err(MissingContentTypeReason::ToStrError)? - .parse::() - .map_err(MissingContentTypeReason::MimeParseError) +pub fn content_type_header_classifier_smithy( + headers: &SmithyHeaders, + expected_content_type: Option<&'static str>, +) -> Result<(), MissingContentTypeReason> { + match headers.get(CONTENT_TYPE) { + Some(content_type) => content_type_header_classifier(content_type, expected_content_type), + None => Ok(()), + } } -/// Checks that the `content-type` header is valid. +/// Checks that the `content-type` header is valid from a `http::HeaderMap`. #[allow(clippy::result_large_err)] -pub fn content_type_header_classifier( - headers: &HeaderMap, +pub fn content_type_header_classifier_http( + headers: &HeaderMap, expected_content_type: Option<&'static str>, ) -> Result<(), MissingContentTypeReason> { - if !headers.contains_key(http::header::CONTENT_TYPE) { - return Ok(()); + if let Some(content_type) = headers.get(http::header::CONTENT_TYPE) { + let content_type = content_type.to_str().map_err(MissingContentTypeReason::ToStrError)?; + content_type_header_classifier(content_type, expected_content_type) + } else { + Ok(()) } - let found_mime = parse_content_type(headers)?; +} + +/// Checks that the `content-type` header is valid. +#[allow(clippy::result_large_err)] +fn content_type_header_classifier( + content_type: &str, + expected_content_type: Option<&'static str>, +) -> Result<(), MissingContentTypeReason> { + let found_mime = parse_mime(content_type)?; // There is a `content-type` header. // If there is an implied content type, they must match. if let Some(expected_content_type) = expected_content_type { @@ -133,6 +160,7 @@ pub fn accept_header_classifier(headers: &HeaderMap, content_type: &mime::Mime) #[cfg(test)] mod tests { use super::*; + use aws_smithy_runtime_api::http::Headers; use http::header::{HeaderValue, ACCEPT, CONTENT_TYPE}; fn req_content_type(content_type: &'static str) -> HeaderMap { @@ -151,13 +179,14 @@ mod tests { #[test] fn check_content_type_header_empty_body_no_modeled_input() { - assert!(content_type_header_empty_body_no_modeled_input(&HeaderMap::new()).is_ok()); + assert!(content_type_header_empty_body_no_modeled_input(&Headers::new()).is_ok()); } #[test] fn check_invalid_content_type_header_empty_body_no_modeled_input() { - let valid_request = req_content_type("application/json"); - let result = content_type_header_empty_body_no_modeled_input(&valid_request).unwrap_err(); + let mut valid = Headers::new(); + valid.insert(CONTENT_TYPE, "application/json"); + let result = content_type_header_empty_body_no_modeled_input(&valid).unwrap_err(); assert!(matches!( result, MissingContentTypeReason::UnexpectedMimeType { @@ -171,40 +200,50 @@ mod tests { fn check_invalid_content_type() { let invalid = vec!["application/jason", "text/xml"]; for invalid_mime in invalid { - let request = req_content_type(invalid_mime); - let result = content_type_header_classifier(&request, EXPECTED_MIME_APPLICATION_JSON); + let headers = req_content_type(invalid_mime); + let mut results = Vec::new(); + results.push(content_type_header_classifier_http( + &headers, + EXPECTED_MIME_APPLICATION_JSON, + )); + results.push(content_type_header_classifier_smithy( + &Headers::try_from(headers).unwrap(), + EXPECTED_MIME_APPLICATION_JSON, + )); // Validates the rejection type since we cannot implement `PartialEq` // for `MissingContentTypeReason`. - match result { - Ok(()) => panic!("Content-type validation is expected to fail"), - Err(e) => match e { - MissingContentTypeReason::UnexpectedMimeType { - expected_mime, - found_mime, - } => { - assert_eq!( - expected_mime.unwrap(), - "application/json".parse::().unwrap() - ); - assert_eq!(found_mime, invalid_mime.parse::().ok()); - } - _ => panic!("Unexpected `MissingContentTypeReason`: {}", e), - }, + for result in results { + match result { + Ok(()) => panic!("Content-type validation is expected to fail"), + Err(e) => match e { + MissingContentTypeReason::UnexpectedMimeType { + expected_mime, + found_mime, + } => { + assert_eq!( + expected_mime.unwrap(), + "application/json".parse::().unwrap() + ); + assert_eq!(found_mime, invalid_mime.parse::().ok()); + } + _ => panic!("Unexpected `MissingContentTypeReason`: {}", e), + }, + } } } } #[test] fn check_missing_content_type_is_allowed() { - let result = content_type_header_classifier(&HeaderMap::new(), EXPECTED_MIME_APPLICATION_JSON); + let result = content_type_header_classifier_http(&HeaderMap::new(), EXPECTED_MIME_APPLICATION_JSON); assert!(result.is_ok()); } #[test] fn check_not_parsable_content_type() { let request = req_content_type("123"); - let result = content_type_header_classifier(&request, EXPECTED_MIME_APPLICATION_JSON); + let result = content_type_header_classifier_http(&request, EXPECTED_MIME_APPLICATION_JSON); assert!(matches!( result.unwrap_err(), MissingContentTypeReason::MimeParseError(_) @@ -214,7 +253,7 @@ mod tests { #[test] fn check_non_ascii_visible_characters_content_type() { let request = req_content_type("application/💩"); - let result = content_type_header_classifier(&request, EXPECTED_MIME_APPLICATION_JSON); + let result = content_type_header_classifier_http(&request, EXPECTED_MIME_APPLICATION_JSON); assert!(matches!(result.unwrap_err(), MissingContentTypeReason::ToStrError(_))); } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs index 963b56c4c1a..f843c6209fd 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs @@ -48,6 +48,7 @@ //! Consult `crate::protocol::$protocolName::rejection` for rejection types for other protocols. use crate::rejection::MissingContentTypeReason; +use aws_smithy_runtime_api::http::HttpError; use std::num::TryFromIntError; use thiserror::Error; @@ -116,7 +117,7 @@ pub enum RequestRejection { /// Used when checking the `Content-Type` header. /// This is bubbled up in the generated SDK when calling - /// [`crate::protocol::content_type_header_classifier`] in `from_request`. + /// [`crate::protocol::content_type_header_classifier_smithy`] in `from_request`. #[error("expected `Content-Type` header not found: {0}")] MissingContentType(#[from] MissingContentTypeReason), @@ -163,6 +164,10 @@ pub enum RequestRejection { // This rejection is constructed directly in the code-generated SDK instead of in this crate. #[error("request does not adhere to modeled constraints: {0}")] ConstraintViolation(String), + + /// Typically happens when the request has headers that are not valid UTF-8. + #[error("failed to convert request: {0}")] + HttpConversion(#[from] HttpError), } // Consider a conversion between `T` and `U` followed by a bubbling up of the conversion error diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs index 6c44adaa283..75af5c76916 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs @@ -8,6 +8,7 @@ //! [`RequestRejection::XmlDeserialize`]. use crate::rejection::MissingContentTypeReason; +use aws_smithy_runtime_api::http::HttpError; use std::num::TryFromIntError; use thiserror::Error; @@ -58,6 +59,10 @@ pub enum RequestRejection { #[error("request does not adhere to modeled constraints: {0}")] ConstraintViolation(String), + + /// Typically happens when the request has headers that are not valid UTF-8. + #[error("failed to convert request: {0}")] + HttpConversion(#[from] HttpError), } impl From for RequestRejection { diff --git a/rust-runtime/aws-smithy-http/src/header.rs b/rust-runtime/aws-smithy-http/src/header.rs index b77edbdce0b..558fe13e014 100644 --- a/rust-runtime/aws-smithy-http/src/header.rs +++ b/rust-runtime/aws-smithy-http/src/header.rs @@ -8,7 +8,7 @@ use aws_smithy_types::date_time::Format; use aws_smithy_types::primitive::Parse; use aws_smithy_types::DateTime; -use http::header::{HeaderMap, HeaderName, HeaderValue, ValueIter}; +use http::header::{HeaderMap, HeaderName, HeaderValue}; use std::borrow::Cow; use std::convert::TryFrom; use std::error::Error; @@ -31,7 +31,8 @@ impl ParseError { } } - fn with_source(self, source: impl Into>) -> Self { + /// Attach a source to this error. + pub fn with_source(self, source: impl Into>) -> Self { Self { source: Some(source.into()), ..self @@ -55,15 +56,13 @@ impl Error for ParseError { /// /// This is separate from `read_many` below because we need to invoke `DateTime::read` to take advantage /// of comma-aware parsing -pub fn many_dates( - values: ValueIter<'_, HeaderValue>, +pub fn many_dates<'a>( + values: impl Iterator, format: Format, ) -> Result, ParseError> { let mut out = vec![]; for header in values { - let mut header = header - .to_str() - .map_err(|_| ParseError::new("header was not valid utf-8 string"))?; + let mut header = header; while !header.is_empty() { let (v, next) = DateTime::read(header, format, ',').map_err(|err| { ParseError::new(format!("header could not be parsed as date: {}", err)) @@ -78,19 +77,18 @@ pub fn many_dates( /// Returns an iterator over pairs where the first element is the unprefixed header name that /// starts with the input `key` prefix, and the second element is the full header name. pub fn headers_for_prefix<'a>( - headers: &'a http::HeaderMap, + header_names: impl Iterator, key: &'a str, -) -> impl Iterator { +) -> impl Iterator { let lower_key = key.to_ascii_lowercase(); - headers - .keys() - .filter(move |k| k.as_str().starts_with(&lower_key)) - .map(move |h| (&h.as_str()[key.len()..], h)) + header_names + .filter(move |k| k.starts_with(&lower_key)) + .map(move |k| (&k[key.len()..], k)) } /// Convert a `HeaderValue` into a `Vec` where `T: FromStr` -pub fn read_many_from_str( - values: ValueIter<'_, HeaderValue>, +pub fn read_many_from_str<'a, T: FromStr>( + values: impl Iterator, ) -> Result, ParseError> where T::Err: Error + Send + Sync + 'static, @@ -103,8 +101,8 @@ where } /// Convert a `HeaderValue` into a `Vec` where `T: Parse` -pub fn read_many_primitive( - values: ValueIter<'_, HeaderValue>, +pub fn read_many_primitive<'a, T: Parse>( + values: impl Iterator, ) -> Result, ParseError> { read_many(values, |v: &str| { T::parse_smithy_primitive(v) @@ -113,8 +111,8 @@ pub fn read_many_primitive( } /// Read many comma / header delimited values from HTTP headers for `FromStr` types -fn read_many( - values: ValueIter<'_, HeaderValue>, +fn read_many<'a, T>( + values: impl Iterator, f: impl Fn(&str) -> Result, ) -> Result, ParseError> { let mut out = vec![]; @@ -132,8 +130,8 @@ fn read_many( /// Read exactly one or none from a headers iterator /// /// This function does not perform comma splitting like `read_many` -pub fn one_or_none( - mut values: ValueIter<'_, HeaderValue>, +pub fn one_or_none<'a, T: FromStr>( + mut values: impl Iterator, ) -> Result, ParseError> where T::Err: Error + Send + Sync + 'static, @@ -142,10 +140,8 @@ where Some(v) => v, None => return Ok(None), }; - let value = - std::str::from_utf8(first.as_bytes()).map_err(|_| ParseError::new("invalid utf-8"))?; match values.next() { - None => T::from_str(value.trim()) + None => T::from_str(first.trim()) .map_err(|err| ParseError::new("failed to parse string").with_source(err)) .map(Some), Some(_) => Err(ParseError::new( @@ -348,6 +344,7 @@ mod test { }; use super::quote_header_value; + use aws_smithy_runtime_api::http::Request; use aws_smithy_types::error::display::DisplayErrorContext; #[test] @@ -396,15 +393,27 @@ mod test { .body(()) .unwrap(); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Float-Multi").iter()) - .expect("valid"), + read_many_primitive::( + test_request + .headers() + .get_all("X-Float-Multi") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect("valid"), vec![0.0, f32::INFINITY, f32::NEG_INFINITY, 5555.5] ); let message = format!( "{}", DisplayErrorContext( - read_many_primitive::(test_request.headers().get_all("X-Float-Error").iter()) - .expect_err("invalid") + read_many_primitive::( + test_request + .headers() + .get_all("X-Float-Error") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect_err("invalid") ) ); let expected = "output failed to parse in headers: failed reading a list of primitives: failed to parse input as f32"; @@ -428,7 +437,14 @@ mod test { .body(()) .unwrap(); let read = |name: &str, format: Format| { - many_dates(test_request.headers().get_all(name).iter(), format) + many_dates( + test_request + .headers() + .get_all(name) + .iter() + .map(|v| v.to_str().unwrap()), + format, + ) }; let read_valid = |name: &str, format: Format| read(name, format).expect("valid"); assert_eq!( @@ -478,8 +494,15 @@ mod test { .header("EscapedSlashesInQuotes", "foo, \"(foo\\\\bar)\"") .body(()) .unwrap(); - let read = - |name: &str| read_many_from_str::(test_request.headers().get_all(name).iter()); + let read = |name: &str| { + read_many_from_str::( + test_request + .headers() + .get_all(name) + .iter() + .map(|v| v.to_str().unwrap()), + ) + }; let read_valid = |name: &str| read(name).expect("valid"); assert_eq!(read_valid("Empty"), Vec::::new()); assert_eq!(read_valid("Foo"), vec!["foo"]); @@ -515,27 +538,58 @@ mod test { .body(()) .unwrap(); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool-Multi").iter()) - .expect("valid"), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Multi") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect("valid"), vec![true, false, true] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool").iter()).unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![true] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool-Single").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Single") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![true, false, true, true] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool-Quoted").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Quoted") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![true, false, true, true] ); - read_many_primitive::(test_request.headers().get_all("X-Bool-Invalid").iter()) - .expect_err("invalid"); + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Invalid") + .iter() + .map(|v| v.to_str().unwrap()), + ) + .expect_err("invalid"); } #[test] @@ -550,43 +604,77 @@ mod test { .body(()) .unwrap(); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Multi").iter()) - .expect("valid"), + read_many_primitive::( + test_request + .headers() + .get_all("X-Multi") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect("valid"), vec![123, 456, 789] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Num").iter()).unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Num") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![777] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Num-Single").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Num-Single") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![1, 2, 3, -4, 5] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Num-Quoted").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Num-Quoted") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![1, 2, 3, -4, 5] ); - read_many_primitive::(test_request.headers().get_all("X-Num-Invalid").iter()) - .expect_err("invalid"); + read_many_primitive::( + test_request + .headers() + .get_all("X-Num-Invalid") + .iter() + .map(|v| v.to_str().unwrap()), + ) + .expect_err("invalid"); } #[test] fn test_prefix_headers() { - let test_request = http::Request::builder() - .header("X-Prefix-A", "123,456") - .header("X-Prefix-B", "789") - .header("X-Prefix-C", "777") - .header("X-Prefix-C", "777") - .body(()) - .unwrap(); + let test_request = Request::try_from( + http::Request::builder() + .header("X-Prefix-A", "123,456") + .header("X-Prefix-B", "789") + .header("X-Prefix-C", "777") + .header("X-Prefix-C", "777") + .body(()) + .unwrap(), + ) + .unwrap(); let resp: Result>, ParseError> = - headers_for_prefix(test_request.headers(), "X-Prefix-") + headers_for_prefix(test_request.headers().iter().map(|h| h.0), "X-Prefix-") .map(|(key, header_name)| { let values = test_request.headers().get_all(header_name); - read_many_primitive(values.iter()).map(|v| (key.to_string(), v)) + read_many_primitive(values).map(|v| (key.to_string(), v)) }) .collect(); let resp = resp.expect("valid"); diff --git a/rust-runtime/aws-smithy-http/src/http.rs b/rust-runtime/aws-smithy-http/src/http.rs index 2a988f00f2b..257a250e011 100644 --- a/rust-runtime/aws-smithy-http/src/http.rs +++ b/rust-runtime/aws-smithy-http/src/http.rs @@ -5,25 +5,26 @@ //! Types for abstracting over HTTP requests and responses. -use http::{HeaderMap, HeaderValue}; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::http::Headers; /// Trait for accessing HTTP headers. /// /// Useful for generic impls so that they can access headers via trait bounds. pub trait HttpHeaders { /// Returns a reference to the associated header map. - fn http_headers(&self) -> &HeaderMap; + fn http_headers(&self) -> &Headers; /// Returns a mutable reference to the associated header map. - fn http_headers_mut(&mut self) -> &mut HeaderMap; + fn http_headers_mut(&mut self) -> &mut Headers; } -impl HttpHeaders for http::Response { - fn http_headers(&self) -> &HeaderMap { +impl HttpHeaders for HttpResponse { + fn http_headers(&self) -> &Headers { self.headers() } - fn http_headers_mut(&mut self) -> &mut HeaderMap { + fn http_headers_mut(&mut self) -> &mut Headers { self.headers_mut() } } diff --git a/rust-runtime/aws-smithy-runtime-api/external-types.toml b/rust-runtime/aws-smithy-runtime-api/external-types.toml index 347dff86de5..904961adb23 100644 --- a/rust-runtime/aws-smithy-runtime-api/external-types.toml +++ b/rust-runtime/aws-smithy-runtime-api/external-types.toml @@ -4,6 +4,8 @@ allowed_external_types = [ "bytes::bytes::Bytes", + "http::header::map::HeaderMap", + "http::header::value::HeaderValue", "http::request::Request", "http::response::Response", "http::uri::Uri", diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index c0599818d9a..b3844f0bf53 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -451,7 +451,13 @@ mod tests { context.enter_transmit_phase(); let _ = context.take_request(); - context.set_response(http::Response::builder().body(SdkBody::empty()).unwrap()); + context.set_response( + http::Response::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); context.enter_before_deserialization_phase(); context.response(); @@ -508,7 +514,13 @@ mod tests { "request-modified-after-signing", request.headers().get("test").unwrap() ); - context.set_response(http::Response::builder().body(SdkBody::empty()).unwrap()); + context.set_response( + http::Response::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); context.enter_before_deserialization_phase(); context.enter_deserialization_phase(); @@ -524,7 +536,13 @@ mod tests { context.enter_transmit_phase(); let _ = context.take_request(); - context.set_response(http::Response::builder().body(SdkBody::empty()).unwrap()); + context.set_response( + http::Response::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); context.enter_before_deserialization_phase(); context.enter_deserialization_phase(); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index b718bb9116d..de49383e211 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -21,7 +21,6 @@ use crate::client::interceptors::context::phase::Phase; use crate::client::interceptors::context::Error; use crate::client::interceptors::InterceptorError; use crate::client::result::{ConnectorError, SdkError}; -use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use bytes::Bytes; use std::error::Error as StdError; @@ -31,7 +30,7 @@ use std::fmt; pub type HttpRequest = crate::http::Request; /// Type alias for the HTTP response type that the orchestrator uses. -pub type HttpResponse = http::Response; +pub type HttpResponse = crate::http::Response; /// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. /// diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index bae79b74d56..fa243211fe4 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -394,6 +394,8 @@ mod tests { .status(200) .header("rp1", "1") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap()) }) } diff --git a/rust-runtime/aws-smithy-runtime-api/src/http.rs b/rust-runtime/aws-smithy-runtime-api/src/http.rs index 8d76dc7434d..a133e23db79 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http.rs @@ -8,7 +8,9 @@ mod error; mod headers; mod request; +mod response; pub use error::HttpError; pub use headers::{HeaderValue, Headers, HeadersIter}; -pub use request::Request; +pub use request::{Request, RequestParts}; +pub use response::Response; diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/error.rs b/rust-runtime/aws-smithy-runtime-api/src/http/error.rs index 8c47334960f..4a0963cbb32 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/error.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/error.rs @@ -39,6 +39,10 @@ impl HttpError { pub(super) fn invalid_uri(err: InvalidUri) -> Self { Self(err.into()) } + + pub(super) fn invalid_status_code() -> Self { + Self("invalid HTTP status code".into()) + } } impl Display for HttpError { diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs index e0e1457c7a0..97436d20e15 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs @@ -83,8 +83,8 @@ impl Headers { } /// Returns true if this header is present - pub fn contains_key(&self, key: &str) -> bool { - self.headers.contains_key(key) + pub fn contains_key(&self, key: impl AsRef) -> bool { + self.headers.contains_key(key.as_ref()) } /// Insert a value into the headers structure. @@ -152,6 +152,30 @@ impl Headers { } } +impl TryFrom for Headers { + type Error = HttpError; + + fn try_from(value: HeaderMap) -> Result { + if let Some(e) = value + .values() + .filter_map(|value| std::str::from_utf8(value.as_bytes()).err()) + .next() + { + Err(HttpError::header_was_not_a_string(e)) + } else { + let mut string_safe_headers: HeaderMap = Default::default(); + string_safe_headers.extend( + value + .into_iter() + .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect("validated above"))), + ); + Ok(Headers { + headers: string_safe_headers, + }) + } + } +} + use sealed::AsHeaderComponent; mod sealed { diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs index b75ea583b7d..e36f0bf28a5 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/request.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs @@ -5,14 +5,25 @@ //! Http Request Types -use crate::http::error::HttpError; -use crate::http::headers::{HeaderValue, Headers}; +use crate::http::Headers; +use crate::http::HttpError; use aws_smithy_types::body::SdkBody; use http as http0; use http0::uri::PathAndQuery; use http0::{Extensions, HeaderMap, Method}; use std::borrow::Cow; +/// Parts struct useful for structural decomposition that the [`Request`] type can be converted into. +#[non_exhaustive] +pub struct RequestParts { + /// Request URI. + pub uri: Uri, + /// Request headers. + pub headers: Headers, + /// Request body. + pub body: B, +} + #[derive(Debug)] /// An HTTP Request Type pub struct Request { @@ -56,6 +67,16 @@ impl Uri { self.parsed = new_uri; Ok(()) } + + /// Returns the URI path. + pub fn path(&self) -> &str { + self.parsed.path() + } + + /// Returns the URI query string. + pub fn query(&self) -> Option<&str> { + self.parsed.query() + } } fn merge_paths(endpoint_path: Option, uri: &http0::Uri) -> Cow<'_, str> { @@ -111,7 +132,7 @@ impl TryInto> for Request { type Error = HttpError; fn try_into(self) -> Result, Self::Error> { - self.into_http02x() + self.try_into_http02x() } } @@ -120,7 +141,7 @@ impl Request { /// /// Depending on the internal storage type, this operation may be free or it may have an internal /// cost. - pub fn into_http02x(self) -> Result, HttpError> { + pub fn try_into_http02x(self) -> Result, HttpError> { let mut req = http::Request::builder() .uri(self.uri.parsed) .method(self.method) @@ -160,6 +181,15 @@ impl Request { } } + /// Convert this request into its parts. + pub fn into_parts(self) -> RequestParts { + RequestParts { + uri: self.uri, + headers: self.headers, + body: self.body, + } + } + /// Returns a reference to the header map pub fn headers(&self) -> &Headers { &self.headers @@ -180,6 +210,11 @@ impl Request { &mut self.body } + /// Converts this request into the request body. + pub fn into_body(self) -> B { + self.body + } + /// Returns the method associated with this request pub fn method(&self) -> &str { self.method.as_str() @@ -248,32 +283,15 @@ impl TryFrom> for Request { type Error = HttpError; fn try_from(value: http::Request) -> Result { - if let Some(e) = value - .headers() - .values() - .filter_map(|value| std::str::from_utf8(value.as_bytes()).err()) - .next() - { - Err(HttpError::header_was_not_a_string(e)) - } else { - let (parts, body) = value.into_parts(); - let mut string_safe_headers: HeaderMap = Default::default(); - string_safe_headers.extend( - parts - .headers - .into_iter() - .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect("validated above"))), - ); - Ok(Self { - body, - uri: parts.uri.into(), - method: parts.method.clone(), - extensions: parts.extensions, - headers: Headers { - headers: string_safe_headers, - }, - }) - } + let (parts, body) = value.into_parts(); + let headers = Headers::try_from(parts.headers)?; + Ok(Self { + body, + uri: parts.uri.into(), + method: parts.method.clone(), + extensions: parts.extensions, + headers, + }) } } @@ -307,7 +325,7 @@ mod test { assert_eq!(req.headers().get("a").unwrap(), "b"); req.headers_mut().append("a", "c"); assert_eq!(req.headers().get("a").unwrap(), "b"); - let http0 = req.into_http02x().unwrap(); + let http0 = req.try_into_http02x().unwrap(); assert_eq!(http0.uri(), "http://foo.com"); } @@ -321,7 +339,7 @@ mod test { assert_eq!(req.uri(), "http://foo.com/"); req.set_uri("http://bar.com").unwrap(); assert_eq!(req.uri(), "http://bar.com"); - let http0 = req.into_http02x().unwrap(); + let http0 = req.try_into_http02x().unwrap(); assert_eq!(http0.uri(), "http://bar.com"); } diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/response.rs b/rust-runtime/aws-smithy-runtime-api/src/http/response.rs new file mode 100644 index 00000000000..a32b3ee415f --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/response.rs @@ -0,0 +1,251 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Http Response Types + +use crate::http::{HeaderValue, Headers, HttpError}; +use aws_smithy_types::body::SdkBody; +use http as http0; +use http0::{Extensions, HeaderMap}; +use std::fmt; + +/// HTTP response status code +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub struct StatusCode(u16); + +impl StatusCode { + /// True if this is a successful response code (200, 201, etc) + pub fn is_success(self) -> bool { + (200..300).contains(&self.0) + } + + /// True if this response code is a client error (4xx) + pub fn is_client_error(self) -> bool { + (400..500).contains(&self.0) + } + + /// True if this response code is a server error (5xx) + pub fn is_server_error(self) -> bool { + (500..600).contains(&self.0) + } + + /// Return the value of this status code as a `u16`. + pub fn as_u16(self) -> u16 { + self.0 + } +} + +impl TryFrom for StatusCode { + type Error = HttpError; + + fn try_from(value: u16) -> Result { + if (100..1000).contains(&value) { + Ok(StatusCode(value)) + } else { + Err(HttpError::invalid_status_code()) + } + } +} + +impl From for StatusCode { + fn from(value: http0::StatusCode) -> Self { + Self(value.as_u16()) + } +} + +impl From for u16 { + fn from(value: StatusCode) -> Self { + value.0 + } +} + +impl fmt::Display for StatusCode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} + +/// An HTTP Response Type +#[derive(Debug)] +pub struct Response { + status: StatusCode, + headers: Headers, + body: B, + extensions: Extensions, +} + +impl Response { + /// Converts this response into an http 0.x response. + /// + /// Depending on the internal storage type, this operation may be free or it may have an internal + /// cost. + pub fn try_into_http02x(self) -> Result, HttpError> { + let mut res = http::Response::builder() + .status( + http0::StatusCode::from_u16(self.status.into()) + .expect("validated upon construction"), + ) + .body(self.body) + .expect("known valid"); + let mut headers = HeaderMap::new(); + headers.extend( + self.headers + .headers + .into_iter() + .map(|(k, v)| (k, v.into_http02x())), + ); + *res.headers_mut() = headers; + *res.extensions_mut() = self.extensions; + Ok(res) + } + + /// Update the body of this response to be a new body. + pub fn map(self, f: impl Fn(B) -> U) -> Response { + Response { + status: self.status, + body: f(self.body), + extensions: self.extensions, + headers: self.headers, + } + } + + /// Returns a response with the given status and body + pub fn new(status: StatusCode, body: B) -> Self { + Self { + status, + body, + extensions: Default::default(), + headers: Default::default(), + } + } + + /// Returns the status code + pub fn status(&self) -> StatusCode { + self.status + } + + /// Returns a mutable reference to the status code + pub fn status_mut(&mut self) -> &mut StatusCode { + &mut self.status + } + + /// Returns a reference to the header map + pub fn headers(&self) -> &Headers { + &self.headers + } + + /// Returns a mutable reference to the header map + pub fn headers_mut(&mut self) -> &mut Headers { + &mut self.headers + } + + /// Returns the body associated with the request + pub fn body(&self) -> &B { + &self.body + } + + /// Returns a mutable reference to the body + pub fn body_mut(&mut self) -> &mut B { + &mut self.body + } + + /// Converts this response into the response body. + pub fn into_body(self) -> B { + self.body + } + + /// Adds an extension to the response extensions + pub fn add_extension(&mut self, extension: T) { + self.extensions.insert(extension); + } +} + +impl Response { + /// Replaces this response's body with [`SdkBody::taken()`] + pub fn take_body(&mut self) -> SdkBody { + std::mem::replace(self.body_mut(), SdkBody::taken()) + } +} + +impl TryFrom> for Response { + type Error = HttpError; + + fn try_from(value: http0::Response) -> Result { + if let Some(e) = value + .headers() + .values() + .filter_map(|value| std::str::from_utf8(value.as_bytes()).err()) + .next() + { + Err(HttpError::header_was_not_a_string(e)) + } else { + let (parts, body) = value.into_parts(); + let mut string_safe_headers: HeaderMap = Default::default(); + string_safe_headers.extend( + parts + .headers + .into_iter() + .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect("validated above"))), + ); + Ok(Self { + status: StatusCode::try_from(parts.status.as_u16()).expect("validated by http 0.x"), + body, + extensions: parts.extensions, + headers: Headers { + headers: string_safe_headers, + }, + }) + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use aws_smithy_types::body::SdkBody; + + #[test] + fn non_ascii_responses() { + let response = http::Response::builder() + .status(200) + .header("k", "😹") + .body(SdkBody::empty()) + .unwrap(); + let response: Response = response + .try_into() + .expect("failed to convert a non-string header"); + assert_eq!(response.headers().get("k"), Some("😹")) + } + + #[test] + fn response_can_be_created() { + let req = http::Response::builder() + .status(200) + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Response::try_from(req).unwrap(); + req.headers_mut().insert("a", "b"); + assert_eq!("b", req.headers().get("a").unwrap()); + req.headers_mut().append("a", "c"); + assert_eq!("b", req.headers().get("a").unwrap()); + let http0 = req.try_into_http02x().unwrap(); + assert_eq!(200, http0.status().as_u16()); + } + + #[test] + #[should_panic] + fn header_panics() { + let res = http::Response::builder() + .status(200) + .body(SdkBody::from("hello")) + .unwrap(); + let mut res = Response::try_from(res).unwrap(); + let _ = res + .headers_mut() + .try_insert("a\nb", "a\nb") + .expect_err("invalid header"); + let _ = res.headers_mut().insert("a\nb", "a\nb"); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 0eb03ae474b..0b5e6f056a7 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -12,7 +12,7 @@ use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, SharedHttpConnector, }; -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; @@ -345,9 +345,12 @@ where C::Error: Into, { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { - let mut request = request - .into_http02x() - .expect("TODO(httpRefactor): no panics"); + let mut request = match request.try_into_http02x() { + Ok(request) => request, + Err(err) => { + return HttpConnectorFuture::ready(Err(ConnectorError::other(err.into(), None))); + } + }; let capture_connection = capture_connection(&mut request); if let Some(capture_smithy_connection) = request.extensions().get::() @@ -358,10 +361,14 @@ where let mut client = self.client.clone(); let fut = client.call(request); HttpConnectorFuture::new(async move { - Ok(fut + let response = fut .await .map_err(downcast_error)? - .map(SdkBody::from_body_0_4)) + .map(SdkBody::from_body_0_4); + match HttpResponse::try_from(response) { + Ok(response) => Ok(response), + Err(err) => Err(ConnectorError::other(err.into(), None)), + } }) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs index f694840b616..8818df28da4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs @@ -36,7 +36,9 @@ impl HttpConnector for CaptureRequestHandler { HttpConnectorFuture::ready(Ok(inner .response .take() - .expect("could not handle second request"))) + .expect("could not handle second request") + .try_into() + .unwrap())) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index 1fdf61ac4d2..c23d711ae6b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -9,7 +9,7 @@ //! //! DVR is an extremely experimental record & replay framework that supports multi-frame HTTP request / response traffic. -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::http::Headers; use aws_smithy_types::base64; use bytes::Bytes; @@ -80,7 +80,6 @@ pub struct Request { #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] pub struct Response { status: u16, - version: String, headers: HashMap>, } @@ -131,15 +130,32 @@ fn headers_to_map_02x(headers: &HeaderMap) -> HashMap> { out } +fn headers_to_map(headers: &Headers) -> HashMap> { + let mut out: HashMap<_, Vec<_>> = HashMap::new(); + for (header_name, header_value) in headers.iter() { + let entry = out.entry(header_name.to_string()).or_default(); + entry.push( + std::str::from_utf8(header_value.as_ref()) + .unwrap() + .to_string(), + ); + } + out +} + impl<'a, B> From<&'a http::Response> for Response { fn from(resp: &'a http::Response) -> Self { let status = resp.status().as_u16(); - let version = format!("{:?}", resp.version()); let headers = headers_to_map_02x(resp.headers()); + Self { status, headers } + } +} + +impl From<&HttpResponse> for Response { + fn from(resp: &HttpResponse) -> Self { Self { - status, - version, - headers, + status: resp.status().into(), + headers: headers_to_map(resp.headers()), } } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index b6462f1c812..7607b53c08b 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -8,14 +8,14 @@ use aws_smithy_protocol_test::MediaType; use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, }; -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use bytes::{Bytes, BytesMut}; -use http::{Request, Version}; +use http::Request; use http_body_0_4::Body; use std::collections::{HashMap, VecDeque}; use std::error::Error; @@ -270,14 +270,6 @@ async fn replay_body(events: VecDeque, mut sender: hyper_0_14::body::Send } } -fn convert_version(version: &str) -> Version { - match version { - "HTTP/1.1" => Version::HTTP_11, - "HTTP/2.0" => Version::HTTP_2, - _ => panic!("unsupported: {}", version), - } -} - impl HttpConnector for ReplayingClient { fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { let event_id = self.next_id(); @@ -303,7 +295,7 @@ impl HttpConnector for ReplayingClient { .extend_from_slice(data.expect("in memory request should not fail").as_ref()) } request - .into_http02x() + .try_into_http02x() .unwrap() .map(|_body| Bytes::from(data_read)) }); @@ -329,9 +321,7 @@ impl HttpConnector for ReplayingClient { Action::Response { response: Ok(response), } => { - let mut builder = http::Response::builder() - .status(response.status) - .version(convert_version(&response.version)); + let mut builder = http::Response::builder().status(response.status); for (name, values) in response.headers { for value in values { builder = builder.header(&name, &value); @@ -341,7 +331,10 @@ impl HttpConnector for ReplayingClient { replay_body(events, sender).await; // insert the finalized body into }); - break Ok(builder.body(body).expect("valid builder")); + break Ok(HttpResponse::try_from( + builder.body(body).expect("valid builder"), + ) + .unwrap()); } Action::Data { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs index 25b639084fc..61b83e3e7fd 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs @@ -7,7 +7,7 @@ use aws_smithy_runtime_api::client::http::{ HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, SharedHttpConnector, }; -use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::client::result::ConnectorError; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::shared::IntoShared; @@ -60,7 +60,10 @@ impl InfallibleClientFn { impl HttpConnector for InfallibleClientFn { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { - HttpConnectorFuture::ready((self.response)(request.into_http02x().unwrap())) + HttpConnectorFuture::ready( + (self.response)(request.try_into_http02x().unwrap()) + .map(|res| HttpResponse::try_from(res).unwrap()), + ) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 1e6cfb863b2..bfff5480720 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -510,7 +510,9 @@ mod tests { HttpConnectorFuture::ready(Ok(::http::Response::builder() .status(200) .body(SdkBody::empty()) - .expect("OK response is valid"))) + .expect("OK response is valid") + .try_into() + .unwrap())) } } @@ -652,7 +654,11 @@ mod tests { .await .expect_err("should error"); let actual = format!("{:?}", actual); - assert_eq!($expected, format!("{:?}", actual)); + assert!( + actual.starts_with(&$expected), + "\nActual error: {actual}\nShould start with: {}\n", + $expected + ); assert!(logs_contain("FailingInterceptorA called!")); assert!(logs_contain("FailingInterceptorB called!")); @@ -663,7 +669,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_execution_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, interceptor_name: Some("FailingInterceptorC"), source: Some("FailingInterceptorC") } })"#.to_string(); interceptor_error_handling_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, @@ -674,7 +680,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_serialization_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, interceptor_name: Some("FailingInterceptorC"), source: Some("FailingInterceptorC") } })"#.to_string(); interceptor_error_handling_test!( modify_before_serialization, &mut BeforeSerializationInterceptorContextMut<'_>, @@ -685,7 +691,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_serialization_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, interceptor_name: Some("FailingInterceptorC"), source: Some("FailingInterceptorC") } })"#.to_string(); interceptor_error_handling_test!( read_before_serialization, &BeforeSerializationInterceptorContextRef<'_>, @@ -696,7 +702,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_serialization_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, interceptor_name: Some("FailingInterceptorC")"#.to_string(); interceptor_error_handling_test!( read_after_serialization, &BeforeTransmitInterceptorContextRef<'_>, @@ -707,7 +713,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_retry_loop_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, interceptor_name: Some("FailingInterceptorC")"#.to_string(); interceptor_error_handling_test!( modify_before_retry_loop, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -718,7 +724,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_attempt_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_attempt, &BeforeTransmitInterceptorContextRef<'_>, @@ -729,7 +735,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_signing, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -740,7 +746,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -751,7 +757,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -762,7 +768,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_transmit_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_transmit, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -773,7 +779,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_transmit_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_transmit, &BeforeTransmitInterceptorContextRef<'_>, @@ -784,7 +790,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_transmit_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_transmit, &BeforeDeserializationInterceptorContextRef<'_>, @@ -795,7 +801,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_deserialization, &mut BeforeDeserializationInterceptorContextMut<'_>, @@ -806,7 +812,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_deserialization, &BeforeDeserializationInterceptorContextRef<'_>, @@ -817,7 +823,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_deserialization, &AfterDeserializationInterceptorContextRef<'_>, @@ -828,7 +834,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_attempt_completion_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_attempt_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -839,7 +845,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_attempt_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_attempt, &FinalizerInterceptorContextRef<'_>, @@ -850,7 +856,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -861,7 +867,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_execution_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_execution, &FinalizerInterceptorContextRef<'_>, @@ -935,7 +941,11 @@ mod tests { .await .expect_err("should error"); let actual = format!("{:?}", actual); - assert_eq!($expected, format!("{:?}", actual)); + assert!( + actual.starts_with(&$expected), + "\nActual error: {actual}\nShould start with: {}\n", + $expected + ); assert!(logs_contain("OriginInterceptor called!")); assert!(logs_contain("DestinationInterceptor called!")); @@ -945,7 +955,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_execution_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, @@ -958,7 +968,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_serialization, &mut BeforeSerializationInterceptorContextMut<'_>, @@ -971,7 +981,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_serialization, &BeforeSerializationInterceptorContextRef<'_>, @@ -984,7 +994,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_serialization, &BeforeTransmitInterceptorContextRef<'_>, @@ -997,7 +1007,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_retry_loop_error_causes_jump_to_modify_before_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_retry_loop, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -1010,7 +1020,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_attempt_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_attempt, &BeforeTransmitInterceptorContextRef<'_>, @@ -1023,7 +1033,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_signing, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -1036,7 +1046,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -1049,7 +1059,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -1062,7 +1072,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_transmit, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -1075,7 +1085,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_transmit, &BeforeTransmitInterceptorContextRef<'_>, @@ -1088,7 +1098,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_transmit, &BeforeDeserializationInterceptorContextRef<'_>, @@ -1102,7 +1112,7 @@ mod tests { #[traced_test] async fn test_modify_before_deserialization_error_causes_jump_to_modify_before_attempt_completion( ) { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_deserialization, &mut BeforeDeserializationInterceptorContextMut<'_>, @@ -1116,7 +1126,7 @@ mod tests { #[traced_test] async fn test_read_before_deserialization_error_causes_jump_to_modify_before_attempt_completion( ) { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_deserialization, &BeforeDeserializationInterceptorContextRef<'_>, @@ -1130,7 +1140,7 @@ mod tests { #[traced_test] async fn test_read_after_deserialization_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_deserialization, &AfterDeserializationInterceptorContextRef<'_>, @@ -1143,7 +1153,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_attempt_completion_error_causes_jump_to_read_after_attempt() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_attempt_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -1156,7 +1166,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_causes_jump_to_read_after_execution() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some(\"DestinationInterceptor\"), source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_completion, &mut FinalizerInterceptorContextMut<'_>, diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index ba77165023d..bff3cd1f4bd 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -412,7 +412,7 @@ mod tests { .timeout_config(TimeoutConfig::disabled()) .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes())))) .deserializer::<_, Infallible>(|response| { - assert_eq!(418, response.status()); + assert_eq!(418, u16::from(response.status())); Ok(std::str::from_utf8(response.body().bytes().unwrap()) .unwrap() .to_string()) @@ -466,12 +466,12 @@ mod tests { .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes())))) .deserializer::<_, Infallible>(|response| { - if response.status() == 503 { + if u16::from(response.status()) == 503 { Err(OrchestratorError::connector(ConnectorError::io( "test".into(), ))) } else { - assert_eq!(418, response.status()); + assert_eq!(418, u16::from(response.status())); Ok(std::str::from_utf8(response.body().bytes().unwrap()) .unwrap() .to_string()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs index 9a093687ba7..1fe826ec305 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs @@ -156,7 +156,7 @@ impl ClassifyRetry for HttpStatusCodeClassifier { fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { let is_retryable = ctx .response() - .map(|res| res.status().as_u16()) + .map(|res| res.status().into()) .map(|status| self.retryable_status_codes.contains(&status)) .unwrap_or_default(); @@ -247,7 +247,7 @@ mod test { .unwrap() .map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); - ctx.set_response(res); + ctx.set_response(res.try_into().unwrap()); assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error()); } @@ -260,7 +260,7 @@ mod test { .unwrap() .map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); - ctx.set_response(res); + ctx.set_response(res.try_into().unwrap()); assert_eq!(policy.classify_retry(&ctx), RetryAction::NoActionIndicated); } diff --git a/rust-runtime/inlineable/src/aws_query_compatible_errors.rs b/rust-runtime/inlineable/src/aws_query_compatible_errors.rs index 7a94064d717..a2e851040e8 100644 --- a/rust-runtime/inlineable/src/aws_query_compatible_errors.rs +++ b/rust-runtime/inlineable/src/aws_query_compatible_errors.rs @@ -3,21 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -use http::header::ToStrError; -use http::{HeaderMap, HeaderValue}; +use aws_smithy_runtime_api::http::Headers; const X_AMZN_QUERY_ERROR: &str = "x-amzn-query-error"; const QUERY_COMPATIBLE_ERRORCODE_DELIMITER: char = ';'; -fn aws_query_compatible_error_from_header( - headers: &HeaderMap, -) -> Result, ToStrError> { - headers - .get(X_AMZN_QUERY_ERROR) - .map(|v| v.to_str()) - .transpose() -} - /// Obtains custom error code and error type from the given `headers`. /// /// Looks up a value for the `X_AMZN_QUERY_ERROR` header and if found, the value should be in the @@ -25,12 +15,8 @@ fn aws_query_compatible_error_from_header( /// a (error code, error type) as a tuple. /// /// Any execution path besides the above happy path will yield a `None`. -pub fn parse_aws_query_compatible_error(headers: &HeaderMap) -> Option<(&str, &str)> { - let header_value = match aws_query_compatible_error_from_header(headers) { - Ok(error) => error?, - _ => return None, - }; - +pub fn parse_aws_query_compatible_error(headers: &Headers) -> Option<(&str, &str)> { + let header_value = headers.get(X_AMZN_QUERY_ERROR)?; header_value .find(QUERY_COMPATIBLE_ERRORCODE_DELIMITER) .map(|idx| (&header_value[..idx], &header_value[idx + 1..])) @@ -39,25 +25,9 @@ pub fn parse_aws_query_compatible_error(headers: &HeaderMap) -> Opt #[cfg(test)] mod test { use crate::aws_query_compatible_errors::{ - aws_query_compatible_error_from_header, parse_aws_query_compatible_error, - X_AMZN_QUERY_ERROR, + parse_aws_query_compatible_error, X_AMZN_QUERY_ERROR, }; - - #[test] - fn aws_query_compatible_error_from_header_should_provide_value_for_custom_header() { - let mut response: http::Response<()> = http::Response::default(); - response.headers_mut().insert( - X_AMZN_QUERY_ERROR, - http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), - ); - - let actual = aws_query_compatible_error_from_header(response.headers()).unwrap(); - - assert_eq!( - Some("AWS.SimpleQueueService.NonExistentQueue;Sender"), - actual, - ); - } + use aws_smithy_runtime_api::http::Response; #[test] fn parse_aws_query_compatible_error_should_parse_code_and_type_fields() { @@ -66,6 +36,7 @@ mod test { X_AMZN_QUERY_ERROR, http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), ); + let response = Response::try_from(response).unwrap(); let actual = parse_aws_query_compatible_error(response.headers()); @@ -82,6 +53,7 @@ mod test { X_AMZN_QUERY_ERROR, http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue"), ); + let response = Response::try_from(response).unwrap(); let actual = parse_aws_query_compatible_error(response.headers()); @@ -95,6 +67,7 @@ mod test { "x-amzn-requestid", http::HeaderValue::from_static("a918fbf2-457a-4fe1-99ba-5685ce220fc1"), ); + let response = Response::try_from(response).unwrap(); let actual = parse_aws_query_compatible_error(response.headers()); diff --git a/rust-runtime/inlineable/src/json_errors.rs b/rust-runtime/inlineable/src/json_errors.rs index c2669a795dd..4106762051d 100644 --- a/rust-runtime/inlineable/src/json_errors.rs +++ b/rust-runtime/inlineable/src/json_errors.rs @@ -5,9 +5,8 @@ use aws_smithy_json::deserialize::token::skip_value; use aws_smithy_json::deserialize::{error::DeserializeError, json_token_iter, Token}; +use aws_smithy_runtime_api::http::Headers; use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata}; -use http::header::ToStrError; -use http::{HeaderMap, HeaderValue}; use std::borrow::Cow; // currently only used by AwsJson @@ -74,22 +73,15 @@ fn parse_error_body(bytes: &[u8]) -> Result { }) } -fn error_type_from_header(headers: &HeaderMap) -> Result, ToStrError> { - headers - .get("X-Amzn-Errortype") - .map(|v| v.to_str()) - .transpose() -} - pub fn parse_error_metadata( payload: &[u8], - headers: &HeaderMap, + headers: &Headers, ) -> Result { let ErrorBody { code, message } = parse_error_body(payload)?; let mut err_builder = ErrorMetadata::builder(); - if let Some(code) = error_type_from_header(headers) - .map_err(|_| DeserializeError::custom("X-Amzn-Errortype header was not valid UTF-8"))? + if let Some(code) = headers + .get("x-amzn-errortype") .or(code.as_deref()) .map(sanitize_error_code) { @@ -104,19 +96,22 @@ pub fn parse_error_metadata( #[cfg(test)] mod test { use crate::json_errors::{parse_error_body, parse_error_metadata, sanitize_error_code}; - use aws_smithy_types::Error; - use bytes::Bytes; + use aws_smithy_runtime_api::client::orchestrator::HttpResponse; + use aws_smithy_types::{body::SdkBody, Error}; use std::borrow::Cow; #[test] fn error_metadata() { - let response = http::Response::builder() - .body(Bytes::from_static( - br#"{ "__type": "FooError", "message": "Go to foo" }"#, - )) - .unwrap(); + let response = HttpResponse::try_from( + http::Response::builder() + .body(SdkBody::from( + r#"{ "__type": "FooError", "message": "Go to foo" }"#, + )) + .unwrap(), + ) + .unwrap(); assert_eq!( - parse_error_metadata(response.body(), response.headers()) + parse_error_metadata(response.body().bytes().unwrap(), response.headers()) .unwrap() .build(), Error::builder() @@ -189,17 +184,20 @@ mod test { // services like lambda use an alternate `Message` instead of `message` #[test] fn alternative_error_message_names() { - let response = http::Response::builder() - .header("x-amzn-errortype", "ResourceNotFoundException") - .body(Bytes::from_static( - br#"{ + let response = HttpResponse::try_from( + http::Response::builder() + .header("x-amzn-errortype", "ResourceNotFoundException") + .body(SdkBody::from( + r#"{ "Type": "User", "Message": "Functions from 'us-west-2' are not reachable from us-east-1" }"#, - )) - .unwrap(); + )) + .unwrap(), + ) + .unwrap(); assert_eq!( - parse_error_metadata(response.body(), response.headers()) + parse_error_metadata(response.body().bytes().unwrap(), response.headers()) .unwrap() .build(), Error::builder() From a94a5e086e2325e735660805cd12da2bfc31f619 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 10 Nov 2023 17:45:25 -0800 Subject: [PATCH 244/331] Fix panics in `Headers::try_insert` and `Headers::try_append` (#3157) The `try_insert` and `try_append` methods on `Headers` would panic when passing a non-ASCII value for the key, or an invalid UTF-8 value for the value. This was due to them using the http crate's `from_static` method, which panics on these invalid values. This PR makes them always use `try_from` instead. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-runtime-api/Cargo.toml | 1 + .../src/http/headers.rs | 142 +++++++++++++++--- 2 files changed, 120 insertions(+), 23 deletions(-) diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 4b7963e2495..3f6a96b5180 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -26,6 +26,7 @@ tracing = "0.1" zeroize = { version = "1", optional = true } [dev-dependencies] +proptest = "1" tokio = { version = "1.25", features = ["rt", "macros"] } [package.metadata.docs.rs] diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs index 97436d20e15..70361a1d860 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs @@ -92,28 +92,31 @@ impl Headers { /// This will *replace* any existing value for this key. Returns the previous associated value if any. /// /// # Panics - /// If the key or value are not valid ascii, this function will panic. + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will panic. pub fn insert( &mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent, ) -> Option { - self.try_insert(key, value) - .expect("HeaderName or HeaderValue was invalid") + let key = header_name(key, false).unwrap(); + let value = header_value(value.into_maybe_static().unwrap(), false).unwrap(); + self.headers + .insert(key, value) + .map(|old_value| old_value.into()) } /// Insert a value into the headers structure. /// /// This will *replace* any existing value for this key. Returns the previous associated value if any. /// - /// If the key or value are not valid ascii, an error is returned + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will return an error. pub fn try_insert( &mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent, ) -> Result, HttpError> { - let key = header_name(key)?; - let value = header_value(value.into_maybe_static()?)?; + let key = header_name(key, true)?; + let value = header_value(value.into_maybe_static()?, true)?; Ok(self .headers .insert(key, value) @@ -122,14 +125,24 @@ impl Headers { /// Appends a value to a given key /// - /// If the key or value are NOT valid ascii, an error is returned + /// # Panics + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will panic. + pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool { + let key = header_name(key.into_maybe_static().unwrap(), false).unwrap(); + let value = header_value(value.into_maybe_static().unwrap(), false).unwrap(); + self.headers.append(key, value) + } + + /// Appends a value to a given key + /// + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will return an error. pub fn try_append( &mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent, ) -> Result { - let key = header_name(key.into_maybe_static()?)?; - let value = header_value(value.into_maybe_static()?)?; + let key = header_name(key.into_maybe_static()?, true)?; + let value = header_value(value.into_maybe_static()?, true)?; Ok(self.headers.append(key, value)) } @@ -141,15 +154,6 @@ impl Headers { .remove(key.as_ref()) .map(|h| h.as_str().to_string()) } - - /// Appends a value to a given key - /// - /// # Panics - /// If the key or value are NOT valid ascii, this function will panic - pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool { - self.try_append(key, value) - .expect("HeaderName or HeaderValue was invalid") - } } impl TryFrom for Headers { @@ -326,13 +330,19 @@ pub use header_value::HeaderValue; type MaybeStatic = Cow<'static, str>; -fn header_name(name: impl AsHeaderComponent) -> Result { +fn header_name( + name: impl AsHeaderComponent, + panic_safe: bool, +) -> Result { name.repr_as_http02x_header_name().or_else(|name| { - name.into_maybe_static().and_then(|cow| { - if cow.chars().any(|c| c.is_uppercase()) { - return Err(HttpError::new("Header names must be all lower case")); + name.into_maybe_static().and_then(|mut cow| { + if cow.chars().any(|c| c.is_ascii_uppercase()) { + cow = Cow::Owned(cow.to_ascii_uppercase()); } match cow { + Cow::Borrowed(s) if panic_safe => { + http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) + } Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), Cow::Owned(s) => { http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) @@ -342,8 +352,11 @@ fn header_name(name: impl AsHeaderComponent) -> Result Result { +fn header_value(value: MaybeStatic, panic_safe: bool) -> Result { let header = match value { + Cow::Borrowed(b) if panic_safe => { + http0::HeaderValue::try_from(b).map_err(HttpError::invalid_header_value)? + } Cow::Borrowed(b) => http0::HeaderValue::from_static(b), Cow::Owned(s) => { http0::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)? @@ -364,4 +377,87 @@ mod tests { .parse::() .expect_err("cannot contain control characters"); } + + #[test] + fn no_panic_insert_upper_case_header_name() { + let mut headers = Headers::new(); + headers.insert("I-Have-Upper-Case", "foo"); + } + #[test] + fn no_panic_append_upper_case_header_name() { + let mut headers = Headers::new(); + headers.append("I-Have-Upper-Case", "foo"); + } + + #[test] + #[should_panic] + fn panic_insert_invalid_ascii_key() { + let mut headers = Headers::new(); + headers.insert("💩", "foo"); + } + #[test] + #[should_panic] + fn panic_insert_invalid_header_value() { + let mut headers = Headers::new(); + headers.insert("foo", "💩"); + } + #[test] + #[should_panic] + fn panic_append_invalid_ascii_key() { + let mut headers = Headers::new(); + headers.append("💩", "foo"); + } + #[test] + #[should_panic] + fn panic_append_invalid_header_value() { + let mut headers = Headers::new(); + headers.append("foo", "💩"); + } + + #[test] + fn no_panic_try_insert_invalid_ascii_key() { + let mut headers = Headers::new(); + assert!(headers.try_insert("💩", "foo").is_err()); + } + #[test] + fn no_panic_try_insert_invalid_header_value() { + let mut headers = Headers::new(); + assert!(headers + .try_insert( + "foo", + // Valid header value with invalid UTF-8 + http0::HeaderValue::from_bytes(&[0xC0, 0x80]).unwrap() + ) + .is_err()); + } + #[test] + fn no_panic_try_append_invalid_ascii_key() { + let mut headers = Headers::new(); + assert!(headers.try_append("💩", "foo").is_err()); + } + #[test] + fn no_panic_try_append_invalid_header_value() { + let mut headers = Headers::new(); + assert!(headers + .try_insert( + "foo", + // Valid header value with invalid UTF-8 + http0::HeaderValue::from_bytes(&[0xC0, 0x80]).unwrap() + ) + .is_err()); + } + + proptest::proptest! { + #[test] + fn insert_header_prop_test(input in ".*") { + let mut headers = Headers::new(); + let _ = headers.try_insert(input.clone(), input); + } + + #[test] + fn append_header_prop_test(input in ".*") { + let mut headers = Headers::new(); + let _ = headers.try_append(input.clone(), input); + } + } } From d4e2745cfc36a5b1da1bfe9a8a772419fe780958 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 10 Nov 2023 18:18:17 -0800 Subject: [PATCH 245/331] Move `RequestId` to aws-types (#3160) This PR moves `RequestId` into the aws-types stable crate. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++++ aws/rust-runtime/aws-http/Cargo.toml | 3 +- aws/rust-runtime/aws-http/src/lib.rs | 3 -- .../aws-inlineable/src/s3_request_id.rs | 10 ++----- .../aws-types/external-types.toml | 2 ++ aws/rust-runtime/aws-types/src/lib.rs | 1 + .../{aws-http => aws-types}/src/request_id.rs | 17 +++++------ .../smithy/rustsdk/AwsRequestIdDecorator.kt | 2 +- rust-runtime/aws-smithy-http/src/http.rs | 30 ------------------- rust-runtime/aws-smithy-http/src/lib.rs | 1 - 10 files changed, 22 insertions(+), 53 deletions(-) rename aws/rust-runtime/{aws-http => aws-types}/src/request_id.rs (92%) delete mode 100644 rust-runtime/aws-smithy-http/src/http.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 952501eebaa..dcf5cf917e4 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -107,3 +107,9 @@ message = "ProvideCredentials and SharedCredentialsProvider are now re-exported. references = ["smithy-rs#3173", "smithy-rs#3155"] meta = { "breaking" = false, "tada" = false, "bug" = false } author = "rcoh" + +[[aws-sdk-rust]] +message = "The `RequestId` trait has moved from the aws-http crate into aws-types." +references = ["smithy-rs#3160"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-http/Cargo.toml b/aws/rust-runtime/aws-http/Cargo.toml index d22e473a7c4..a6303982f65 100644 --- a/aws/rust-runtime/aws-http/Cargo.toml +++ b/aws/rust-runtime/aws-http/Cargo.toml @@ -8,9 +8,8 @@ license = "Apache-2.0" repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] -aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } +aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types", features = ["http-body-0-4-x"] } aws-types = { path = "../aws-types" } bytes = "1.1" http = "0.2.3" diff --git a/aws/rust-runtime/aws-http/src/lib.rs b/aws/rust-runtime/aws-http/src/lib.rs index 4c0f72080f3..a5a670988c4 100644 --- a/aws/rust-runtime/aws-http/src/lib.rs +++ b/aws/rust-runtime/aws-http/src/lib.rs @@ -19,6 +19,3 @@ pub mod user_agent; /// AWS-specific content-encoding tools pub mod content_encoding; - -/// AWS-specific request ID support -pub mod request_id; diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 63e368d9ad1..20962244b01 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::http::HttpHeaders; use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::http::{Headers, Response}; use aws_smithy_types::error::metadata::{ @@ -21,14 +20,11 @@ pub trait RequestIdExt { fn extended_request_id(&self) -> Option<&str>; } -impl RequestIdExt for SdkError -where - R: HttpHeaders, -{ +impl RequestIdExt for SdkError { fn extended_request_id(&self) -> Option<&str> { match self { - Self::ResponseError(err) => err.raw().http_headers().extended_request_id(), - Self::ServiceError(err) => err.raw().http_headers().extended_request_id(), + Self::ResponseError(err) => err.raw().headers().extended_request_id(), + Self::ServiceError(err) => err.raw().headers().extended_request_id(), _ => None, } } diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index e5e613b5ae9..6afb663dfd7 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -9,9 +9,11 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::SharedIdentityCache", + "aws_smithy_runtime_api::http::headers::Headers", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", + "aws_smithy_types::error::metadata::Builder", "aws_smithy_types::retry::RetryConfig", "aws_smithy_types::timeout::TimeoutConfig", ] diff --git a/aws/rust-runtime/aws-types/src/lib.rs b/aws/rust-runtime/aws-types/src/lib.rs index e6a0a69dcdb..b3fbda83f34 100644 --- a/aws/rust-runtime/aws-types/src/lib.rs +++ b/aws/rust-runtime/aws-types/src/lib.rs @@ -20,6 +20,7 @@ pub mod endpoint_config; #[doc(hidden)] pub mod os_shim_internal; pub mod region; +pub mod request_id; pub mod sdk_config; pub use sdk_config::SdkConfig; diff --git a/aws/rust-runtime/aws-http/src/request_id.rs b/aws/rust-runtime/aws-types/src/request_id.rs similarity index 92% rename from aws/rust-runtime/aws-http/src/request_id.rs rename to aws/rust-runtime/aws-types/src/request_id.rs index ac9e5ac7d97..ed56612984e 100644 --- a/aws/rust-runtime/aws-http/src/request_id.rs +++ b/aws/rust-runtime/aws-types/src/request_id.rs @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::http::HttpHeaders; -use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +//! AWS-specific request ID support + use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::http::Headers; +use aws_smithy_runtime_api::http::Response; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; @@ -21,14 +22,11 @@ pub trait RequestId { fn request_id(&self) -> Option<&str>; } -impl RequestId for SdkError -where - R: HttpHeaders, -{ +impl RequestId for SdkError { fn request_id(&self) -> Option<&str> { match self { - Self::ResponseError(err) => err.raw().http_headers().request_id(), - Self::ServiceError(err) => err.raw().http_headers().request_id(), + Self::ResponseError(err) => err.raw().headers().request_id(), + Self::ServiceError(err) => err.raw().headers().request_id(), _ => None, } } @@ -46,7 +44,7 @@ impl RequestId for Unhandled { } } -impl RequestId for HttpResponse { +impl RequestId for Response { fn request_id(&self) -> Option<&str> { self.headers().request_id() } @@ -84,6 +82,7 @@ pub fn apply_request_id(builder: ErrorMetadataBuilder, headers: &Headers) -> Err #[cfg(test)] mod tests { use super::*; + use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_types::body::SdkBody; use http::{HeaderValue, Response}; diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt index 0b496ce2c9b..b08e8e495e3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt @@ -19,7 +19,7 @@ class AwsRequestIdDecorator : BaseRequestIdDecorator() { override val accessorFunctionName: String = "request_id" private fun requestIdModule(codegenContext: ClientCodegenContext): RuntimeType = - AwsRuntimeType.awsHttp(codegenContext.runtimeConfig).resolve("request_id") + AwsRuntimeType.awsTypes(codegenContext.runtimeConfig).resolve("request_id") override fun accessorTrait(codegenContext: ClientCodegenContext): RuntimeType = requestIdModule(codegenContext).resolve("RequestId") diff --git a/rust-runtime/aws-smithy-http/src/http.rs b/rust-runtime/aws-smithy-http/src/http.rs deleted file mode 100644 index 257a250e011..00000000000 --- a/rust-runtime/aws-smithy-http/src/http.rs +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types for abstracting over HTTP requests and responses. - -use aws_smithy_runtime_api::client::orchestrator::HttpResponse; -use aws_smithy_runtime_api::http::Headers; - -/// Trait for accessing HTTP headers. -/// -/// Useful for generic impls so that they can access headers via trait bounds. -pub trait HttpHeaders { - /// Returns a reference to the associated header map. - fn http_headers(&self) -> &Headers; - - /// Returns a mutable reference to the associated header map. - fn http_headers_mut(&mut self) -> &mut Headers; -} - -impl HttpHeaders for HttpResponse { - fn http_headers(&self) -> &Headers { - self.headers() - } - - fn http_headers_mut(&mut self) -> &mut Headers { - self.headers_mut() - } -} diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index 13318a5e996..3b6113037c4 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -35,7 +35,6 @@ pub mod endpoint; #[doc(hidden)] pub mod futures_stream_adapter; pub mod header; -pub mod http; pub mod label; pub mod operation; pub mod query; From fb3758aaa1a2559b2b598499c048a9742ca30966 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 13 Nov 2023 12:52:48 -0500 Subject: [PATCH 246/331] Fix compilation error in generate code caused by name collision (#3175) ## Motivation and Context If you had a model like this: ```smithy @http(uri: "/SomeOperation2", method: "GET") operation GetThing { // input: GetThingInput, output: GetThingOutput } ``` But then nested in some other API you did something like this: ```smithy list GetThings { member: GetThingOutput } ``` Code would fail to compile because we generated the same method signature for two different types. ## Description ## Testing - [x] fixes minimal reproducer ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../client/smithy/NamingObstacleCourseTest.kt | 13 +++++ .../smithy/protocols/ProtocolFunctions.kt | 9 ++- .../NamingObstacleCourseTestModels.kt | 58 +++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt index aba0edc1a57..addc4d8f1e8 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt @@ -6,7 +6,10 @@ package software.amazon.smithy.rust.codegen.client.smithy import org.junit.jupiter.api.Test +import software.amazon.smithy.aws.traits.protocols.RestJson1Trait +import software.amazon.smithy.aws.traits.protocols.RestXmlTrait import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.reusedInputOutputShapesModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumsModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeOperationsModel @@ -32,4 +35,14 @@ class NamingObstacleCourseTest { fun `test Rust prelude enum variant names compile`() { clientIntegrationTest(rustPreludeEnumVariantsModel()) { _, _ -> } } + + @Test + fun `test reuse of input and output shapes json`() { + clientIntegrationTest(reusedInputOutputShapesModel(RestJson1Trait.builder().build())) + } + + @Test + fun `test reuse of input and output shapes xml`() { + clientIntegrationTest(reusedInputOutputShapesModel(RestXmlTrait.builder().build())) + } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt index 53bdfc009f1..c468fdca0bc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt @@ -18,6 +18,10 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.contextName +import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait +import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.toSnakeCase /** @@ -139,10 +143,13 @@ internal fun RustSymbolProvider.shapeModuleName(serviceShape: ServiceShape?, sha /** Creates a unique name for a ser/de function. */ fun RustSymbolProvider.shapeFunctionName(serviceShape: ServiceShape?, shape: Shape): String { + val extras = "".letIf(shape.hasTrait()) { + it + "_output" + }.letIf(shape.hasTrait()) { it + "_input" } val containerName = when (shape) { is MemberShape -> model.expectShape(shape.container).contextName(serviceShape).toSnakeCase() else -> shape.contextName(serviceShape).toSnakeCase() - } + } + extras return when (shape) { is MemberShape -> shape.memberName.toSnakeCase() is DocumentShape -> "document" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt index c45a7d09925..72979545b94 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.testutil import software.amazon.smithy.model.Model +import software.amazon.smithy.model.traits.Trait import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope object NamingObstacleCourseTestModels { @@ -169,4 +170,61 @@ object NamingObstacleCourseTestModels { """, ) }.toString().asSmithyModel() + + /** + * This targets two bug classes: + * - operation inputs used as nested outputs + * - operation outputs used as nested outputs + */ + fun reusedInputOutputShapesModel(protocol: Trait) = """ + namespace test + use ${protocol.toShapeId()} + use aws.api#service + @${protocol.toShapeId().name} + @service(sdkId: "test") + service Service { + version: "2006-03-01", + operations: [GetThing, ReuseGetThingIO] + } + + // re-use get thing output in a list & in an operation + @http(uri: "/SomeOperation2", method: "POST") + operation GetThing { + output: GetThingOutput + input: GetThingInput + } + + // an operation that re-uses the input and output shapes from `GetThing` above. this has caused issues in the + // past with operation/input shape confusion during function signature generation + @http(uri: "/SomeOperation3", method: "POST") + operation ReuseGetThingIO { + input: GetThingNested + output: GetThingNested + } + + structure GetThingOutput { + @required + meta: String + } + + structure GetThingInput { + @required + meta: String + } + + // nested structure which reuses input and output shapes internally + structure GetThingNested { + thingsOut: GetThingOutputList, + thingsIn: GetThingInputList, + thingOut: GetThingOutput, + thingIn: GetThingInput + } + + list GetThingOutputList { + member: GetThingOutput + } + list GetThingInputList { + member: GetThingInput + } + """.asSmithyModel() } From 52e592ed7f0a4a01a7f8c24de69052fff67c2b12 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 10 Nov 2023 17:30:31 -0500 Subject: [PATCH 247/331] Remove cargo doc from all-services check to speed up CI (#3179) ## Motivation and Context Running this check on all services significantly slows down CI ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps | 2 +- tools/ci-scripts/check-only-aws-sdk-services | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps b/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps index 38942ef0678..b3b0ade515d 100755 --- a/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps +++ b/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps @@ -10,7 +10,7 @@ set -eux pushd aws-sdk-smoketest &>/dev/null # Override "fail on warning" for smoke test docs since DynamoDB's modeled docs cause rustdoc warnings -RUSTDOCFLAGS="" cargo doc --no-deps --document-private-items --all-features +RUSTDOCFLAGS="--cfg docsrs" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features cargo clippy --all-features cargo +"${RUST_NIGHTLY_VERSION}" udeps diff --git a/tools/ci-scripts/check-only-aws-sdk-services b/tools/ci-scripts/check-only-aws-sdk-services index d1e0ea754ee..b15c4133b3d 100755 --- a/tools/ci-scripts/check-only-aws-sdk-services +++ b/tools/ci-scripts/check-only-aws-sdk-services @@ -13,7 +13,6 @@ cd aws-sdk sed -i '/"examples\//d' Cargo.toml cargo check --all-targets --all-features -RUSTDOCFLAGS="--cfg docsrs" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features for test_dir in tests/*; do if [ -f "${test_dir}/Cargo.toml" ]; then From adb4b1126efc62f0b55ba311edaee5fb3cb680e9 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 9 Nov 2023 10:00:19 -0500 Subject: [PATCH 248/331] Update crate guidance to match top-level guidance (#3153) ## Motivation and Context Currently the guidance on the root repo doesn't match the guidance in the crates themselves. Screenshot 2023-11-09 at 9 59 58 AM ## Description Update docs to match ## Testing - [x] post screenshot of docs once they're generated ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt index f167015ac23..047443d803b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt @@ -119,11 +119,12 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon if (includeHeader) { template(asComments, escape("# $moduleName\n")) } + // NOTE: when you change this, you must also change SDK_README.md.hb template( asComments, """ - **Please Note: The SDK is currently in Developer Preview and is intended strictly for - feedback purposes only. Do not use this SDK for production workloads.**${"\n"} + **Please Note: The SDK is currently released as a developer preview, without support or assistance for use + on production workloads. Any use in production is at your own risk.**${"\n"} """.trimIndent(), ) From 3af97de96e3162e9e9afa8d3a4c8965bf2a1afd5 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 9 Nov 2023 23:20:22 -0600 Subject: [PATCH 249/331] Ensure identity resolver is set when a credentials provider is given only at operation level (#3156) Fixes https://github.com/awslabs/aws-sdk-rust/issues/901 This PR is a rework of https://github.com/awslabs/smithy-rs/pull/3021 whose fix was inadvertently discarded during https://github.com/awslabs/smithy-rs/pull/3077. The way we fix the issue is slightly different. In this PR, we add an identity resolver to runtime components within `set_credentials_provider`, instead of using `ServiceConfig.OperationConfigOverride`. Added a Kotlin integration test to `CredentialProviderConfigTest.kt` based on the customer reported issue. - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 ++ .../smithy/rustsdk/CredentialProviders.kt | 82 +++++++------------ .../rustsdk/CredentialProviderConfigTest.kt | 54 ++++++++++++ .../kms/tests/integration.rs | 2 +- .../qldbsession/tests/integration.rs | 2 +- .../s3/tests/naughty-string-metadata.rs | 2 +- .../s3/tests/normalize-uri-path.rs | 2 +- .../query-strings-are-correctly-encoded.rs | 2 +- .../integration-tests/s3/tests/signing-it.rs | 2 +- .../s3control/tests/signing-it.rs | 4 +- .../ServiceRuntimePluginGenerator.kt | 4 - 11 files changed, 97 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index b4f5b3b8b6c..100e71a5339 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -16,3 +16,9 @@ message = "Fix aws-sdk-rust#930 (PutSnapshotBlock)" references = ["smithy-rs#3126", "aws-sdk-rust#930"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "rcoh" + +[[aws-sdk-rust]] +message = "Fix exclusively setting the credentials provider at operation config-override time. It's now possible to set the credentials when an operation is sent (via `.config_override()`), rather than at client-creation time." +references = ["smithy-rs#3156", "aws-sdk-rust#901"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 46d8e42734a..6a34967a8e3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -10,17 +10,13 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization @@ -30,12 +26,6 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { override val name: String = "CredentialsProvider" override val order: Byte = 0 - override fun serviceRuntimePluginCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List = - baseCustomizations + listOf(CredentialsIdentityResolverRegistration(codegenContext)) - override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, @@ -65,7 +55,7 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { /** * Add a `.credentials_provider` field and builder to the `Config` for a given service */ -class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { +class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, @@ -74,6 +64,10 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus .resolve("provider::ProvideCredentials"), "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) .resolve("provider::SharedCredentialsProvider"), + "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4a::SCHEME_ID"), + "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4::SCHEME_ID"), "TestCredentials" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig).resolve("Credentials"), ) @@ -103,16 +97,34 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus *codegenScope, ) - rustTemplate( + rustBlockTemplate( """ /// Sets the credentials provider for this service - pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.config.store_or_unset(credentials_provider); - self - } + pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self """, *codegenScope, - ) + ) { + rustBlockTemplate( + """ + if let Some(credentials_provider) = credentials_provider + """, + *codegenScope, + ) { + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + rustTemplate( + "self.runtime_components.push_identity_resolver(#{SIGV4A_SCHEME_ID}, credentials_provider.clone());", + *codegenScope, + ) + } + } + rustTemplate( + "self.runtime_components.push_identity_resolver(#{SIGV4_SCHEME_ID}, credentials_provider);", + *codegenScope, + ) + } + rust("self") + } } is ServiceConfig.DefaultForTests -> rustTemplate( @@ -124,39 +136,3 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus } } } - -class CredentialsIdentityResolverRegistration( - private val codegenContext: ClientCodegenContext, -) : ServiceRuntimePluginCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - - override fun section(section: ServiceRuntimePluginSection): Writable = writable { - when (section) { - is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { - rustBlockTemplate("if let Some(creds_provider) = ${section.serviceConfigName}.credentials_provider()") { - val codegenScope = arrayOf( - "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::identity::SharedIdentityResolver"), - "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("auth::sigv4a::SCHEME_ID"), - "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - ) - - if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { - featureGateBlock("sigv4a") { - section.registerIdentityResolver(this) { - rustTemplate("#{SIGV4A_SCHEME_ID}, creds_provider.clone()", *codegenScope) - } - } - } - section.registerIdentityResolver(this) { - rustTemplate("#{SIGV4_SCHEME_ID}, creds_provider,", *codegenScope) - } - } - } - - else -> {} - } - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt index 87f832cc7ef..5b6a81f0690 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt @@ -7,6 +7,10 @@ package software.amazon.smithy.rustsdk import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.testutil.tokioTest internal class CredentialProviderConfigTest { @Test @@ -14,4 +18,54 @@ internal class CredentialProviderConfigTest { val codegenContext = awsTestCodegenContext() validateConfigCustomizations(codegenContext, CredentialProviderConfig(codegenContext)) } + + @Test + fun `configuring credentials provider at operation level should work`() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> + val rc = ctx.runtimeConfig + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "capture_request" to RuntimeType.captureRequest(rc), + "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(rc) + .resolve("Credentials"), + "Region" to AwsRuntimeType.awsTypes(rc).resolve("region::Region"), + ) + rustCrate.integrationTest("credentials_provider") { + // per https://github.com/awslabs/aws-sdk-rust/issues/901 + tokioTest("configuring_credentials_provider_at_operation_level_should_work") { + val moduleName = ctx.moduleUseName() + rustTemplate( + """ + let (http_client, _rx) = #{capture_request}(None); + let client_config = $moduleName::Config::builder() + .http_client(http_client) + .build(); + + let client = $moduleName::Client::from_conf(client_config); + + let credentials = #{Credentials}::new( + "test", + "test", + #{None}, + #{None}, + "test", + ); + let operation_config_override = $moduleName::Config::builder() + .credentials_provider(credentials.clone()) + .region(#{Region}::new("us-west-2")); + + let _ = client + .some_operation() + .customize() + .config_override(operation_config_override) + .send() + .await + .expect("success"); + """, + *codegenScope, + ) + } + } + } + } } diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index ed534f61bdd..6cba0de93dc 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -52,7 +52,7 @@ async fn generate_random() { .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "20") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=53dcf70f6f852cb576185dcabef5aaa3d068704cf1b7ea7dc644efeaa46674d7") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=703f72fe50c310e3ee1a7a106df947b980cb91bc8bad7a4a603b057096603aed") .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index 6cdb32d1f17..fbc8b0a00f6 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -20,7 +20,7 @@ async fn signv4_use_correct_service_name() { .header("content-type", "application/x-amz-json-1.0") .header("x-amz-target", "QLDBSession.SendCommand") .header("content-length", "49") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=9a07c60550504d015fb9a2b0f1b175a4d906651f9dd4ee44bebb32a802d03815") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=e8d50282fa369adf05f33a5b32e3ce2a7582edc902312c59de311001a97426d9") // qldbsession uses the signing name 'qldb' in signature _________________________^^^^ .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 3b6bd970029..f139a28b0f6 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -88,7 +88,7 @@ async fn test_s3_signer_with_naughty_string_metadata() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=a5115604df66219874a9e5a8eab4c9f7a28c992ab2d918037a285756c019f3b2"; + "Signature=733dba2f1ca3c9a39f4eef3a6750a71eff00297cd765408ad3cef5dcdc44d642"; assert!( auth_header .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index 11ee0f7b092..367aa19682f 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -41,7 +41,7 @@ async fn test_operation_should_not_normalize_uri_path() { let expected_uri = "https://test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1.s3.us-east-1.amazonaws.com/a/.././b.txt?x-id=PutObject"; assert_eq!(actual_uri, expected_uri); - let expected_sig = "Signature=2ac540538c84dc2616d92fb51d4fc6146ccd9ccc1ee85f518a1a686c5ef97b86"; + let expected_sig = "Signature=404fb9502378c8f46fb83544848c42d29d55610a14b4bed9577542e49e549d08"; assert!( actual_auth.contains(expected_sig), "authorization header signature did not match expected signature: expected {} but not found in {}", diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 2e9f8bcaffd..902d07933b2 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -44,7 +44,7 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=9a931d20606f93fa4e5553602866a9b5ccac2cd42b54ae5a4b17e4614fb443ce"; + "Signature=740feb1de3968a643e68fb1a17c415d98dd6a1cc28782fb1ef6157586548c747"; assert!( auth_header .contains(snapshot_signature), diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index 450f4ba43ff..d0106aaded2 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -15,7 +15,7 @@ use aws_smithy_types::body::SdkBody; async fn test_signer() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=27e3f59ec3cffaa10e4f1c92112e8fb62d468a04cd32be39e68215f830404dbb") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=d8ea22461a59cc1cbeb01fa093423ffafcb7695197ba2409b477216a4be2c104") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~") .body(SdkBody::empty()) .unwrap(), diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index 7917b836ebb..7b06289a1c4 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -15,8 +15,8 @@ async fn test_signer() { http::Request::builder() .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, \ - SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-user-agent, \ - Signature=0102a74cb220f8445c4efada17660572ff813e07b524032ec831e8c2514be903") + SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, \ + Signature=01a71226e959c7b0b998adf26fa266f9c3612df57a60b187d549822e86d90667") .uri("https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint") .body(SdkBody::empty()) .unwrap(), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index 60015d897cc..875e8ef73ee 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -51,10 +51,6 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { writer.rust("runtime_components.set_endpoint_resolver(Some(#T));", resolver) } - fun registerIdentityResolver(writer: RustWriter, identityResolver: Writable) { - writer.rust("runtime_components.push_identity_resolver(#T);", identityResolver) - } - fun registerRetryClassifier(writer: RustWriter, classifier: Writable) { writer.rust("runtime_components.push_retry_classifier(#T);", classifier) } From ccab4b69bdf9f9a850731d706210bb5c5e6a5e78 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 10 Nov 2023 16:15:11 -0500 Subject: [PATCH 250/331] Clean up re-exports and improve 'BuildError' conversions (#3173) ## Motivation and Context - Fixes #3171 - Fixes #3155 - Fixes #3172 ## Description - Add `configReExport` to make it easy and consistent to re-export types into the config module when they are used! - Add this for a bunch of types and clean up some (now) dead code - Re export `BuildError` - Enable converting from `BuildError` into `SdkError` There are probably more places this can be used, but I'd like to keep this change small to facilitate easy backport to 0.57. ## Testing CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 49 +++++++++++++++++++ .../rustsdk/AwsFluentClientDecorator.kt | 3 -- .../smithy/rustsdk/CredentialProviders.kt | 15 ++++-- .../amazon/smithy/rustsdk/RegionDecorator.kt | 13 +---- .../dynamodb/tests/build-errors.rs | 41 ++++++++++++++++ .../codegen/client/smithy/ClientReExports.kt | 17 +++++++ .../customizations/HttpAuthDecorator.kt | 28 +++-------- .../HttpConnectorConfigDecorator.kt | 15 +++--- .../customizations/IdentityCacheDecorator.kt | 9 ++-- .../InterceptorConfigCustomization.kt | 5 +- .../ResiliencyConfigCustomization.kt | 12 +++-- .../customize/RequiredCustomizations.kt | 6 +++ .../endpoint/EndpointConfigCustomization.kt | 2 - .../ClientRuntimeTypesReExportGenerator.kt | 15 ------ .../config/ServiceConfigGenerator.kt | 11 +++-- .../generators/error/ServiceErrorGenerator.kt | 17 +++++++ .../src/client/result.rs | 7 +++ 17 files changed, 186 insertions(+), 79 deletions(-) create mode 100644 aws/sdk/integration-tests/dynamodb/tests/build-errors.rs create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 100e71a5339..a22d670ba9d 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -22,3 +22,52 @@ message = "Fix exclusively setting the credentials provider at operation config- references = ["smithy-rs#3156", "aws-sdk-rust#901"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "ysaito1001" + +[[smithy-rs]] +message = """Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: +```rust +async fn do_a_thing(client: &Client) -> Result> { + client.run_operation().complex_field(ComplexField::builder() + .a("a") + .b("b") + .build()? + ).send().await?; +} +``` + +Previously, `?` could not be used in this position. +""" +references = ["smithy-rs#3173", "smithy-rs#3171"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "rcoh" + +[[aws-sdk-rust]] +message = """Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: +```rust +async fn create_table(dynamo_client: &Client) -> Result<(), SdkError> { + dynamo_client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, // Previously, `?` could not be used here + ) + .send() + .await?; + Ok(()) +} +``` + +Previously, `?` could not be used in this position. +""" +references = ["smithy-rs#3173", "smithy-rs#3171"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "rcoh" + +[[aws-sdk-rust]] +message = "ProvideCredentials and SharedCredentialsProvider are now re-exported." +references = ["smithy-rs#3173", "smithy-rs#3155"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 93fb926ffee..caf995854f5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -30,11 +30,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault private class Types(runtimeConfig: RuntimeConfig) { - private val smithyHttp = RuntimeType.smithyHttp(runtimeConfig) private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig) - val connectorError = smithyHttp.resolve("result::ConnectorError") val retryConfig = smithyTypes.resolve("retry::RetryConfig") val timeoutConfig = smithyTypes.resolve("timeout::TimeoutConfig") } @@ -102,7 +100,6 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { private class AwsFluentClientExtensions(private val codegenContext: ClientCodegenContext, private val types: Types) { private val codegenScope = arrayOf( "Arc" to RuntimeType.Arc, - "ConnectorError" to types.connectorError, "RetryConfig" to types.retryConfig, "TimeoutConfig" to types.timeoutConfig, "aws_types" to types.awsTypes, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 6a34967a8e3..9405f8a2fe0 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes @@ -59,11 +60,15 @@ class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, - "Credentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials"), - "ProvideCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::ProvideCredentials"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::SharedCredentialsProvider"), + "Credentials" to configReexport(AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials")), + "ProvideCredentials" to configReexport( + AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::ProvideCredentials"), + ), + "SharedCredentialsProvider" to configReexport( + AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::SharedCredentialsProvider"), + ), "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) .resolve("auth::sigv4a::SCHEME_ID"), "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index e7bf13e747a..4e77e1c49b6 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -11,7 +11,7 @@ import software.amazon.smithy.model.node.Node import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization @@ -22,7 +22,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization import software.amazon.smithy.rust.codegen.core.util.dq @@ -109,14 +108,6 @@ class RegionDecorator : ClientCodegenDecorator { } } - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - if (usesRegion(codegenContext)) { - rustCrate.withModule(ClientRustModule.config) { - rust("pub use #T::Region;", region(codegenContext.runtimeConfig)) - } - } - } - override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { if (!usesRegion(codegenContext)) { return listOf() @@ -157,7 +148,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "Region" to region.resolve("Region"), + "Region" to configReexport(region.resolve("Region")), ) override fun section(section: ServiceConfig) = writable { diff --git a/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs b/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs new file mode 100644 index 00000000000..00fc07e7162 --- /dev/null +++ b/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_dynamodb::error::SdkError; +use aws_sdk_dynamodb::operation::create_table::CreateTableError; +use aws_sdk_dynamodb::types::{KeySchemaElement, KeyType}; +use aws_sdk_dynamodb::Client; + +#[allow(dead_code)] +async fn create_table_test(client: &Client) -> Result<(), SdkError> { + let _just_checking_compilation = client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, + ) + .send() + .await; + Ok(()) +} + +#[allow(dead_code)] +async fn create_table_test_super_error(client: &Client) -> Result<(), aws_sdk_dynamodb::Error> { + let _just_checking_compilation = client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, + ) + .send() + .await; + Ok(()) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt new file mode 100644 index 00000000000..6aaf638680c --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt @@ -0,0 +1,17 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy + +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +/** Returns a symbol for a type re-exported into crate::config + * Although it is not always possible to use this, this is the preferred method for using types in config customizations + * and ensures that your type will be re-exported if it is used. + */ +fun configReexport(type: RuntimeType): RuntimeType = RuntimeType.forInlineFun(type.name, module = ClientRustModule.config) { + rustTemplate("pub use #{type};", "type" to type) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index bb2f0c17f0d..b573dbaab25 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -13,7 +13,7 @@ import software.amazon.smithy.model.traits.HttpBasicAuthTrait import software.amazon.smithy.model.traits.HttpBearerAuthTrait import software.amazon.smithy.model.traits.HttpDigestAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption.StaticAuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator @@ -26,7 +26,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf @@ -38,6 +37,10 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> val authHttp = smithyRuntime.resolve("client::auth::http") val authHttpApi = smithyRuntimeApi.resolve("client::auth::http") return arrayOf( + "Token" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Token")), + "Login" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Login")), + "ResolveIdentity" to configReexport(smithyRuntimeApi.resolve("client::identity::ResolveIdentity")), + "AuthSchemeId" to smithyRuntimeApi.resolve("client::auth::AuthSchemeId"), "ApiKeyAuthScheme" to authHttp.resolve("ApiKeyAuthScheme"), "ApiKeyLocation" to authHttp.resolve("ApiKeyLocation"), @@ -48,11 +51,8 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array> "HTTP_BASIC_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BASIC_AUTH_SCHEME_ID"), "HTTP_BEARER_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BEARER_AUTH_SCHEME_ID"), "HTTP_DIGEST_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_DIGEST_AUTH_SCHEME_ID"), - "ResolveIdentity" to smithyRuntimeApi.resolve("client::identity::ResolveIdentity"), - "Login" to smithyRuntimeApi.resolve("client::identity::http::Login"), "SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"), "SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"), - "Token" to smithyRuntimeApi.resolve("client::identity::http::Token"), ) } @@ -135,25 +135,10 @@ class HttpAuthDecorator : ClientCodegenDecorator { it + HttpAuthServiceRuntimePluginCustomization(codegenContext, authSchemes) } } - - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - val authSchemes = HttpAuthSchemes.from(codegenContext) - if (authSchemes.anyEnabled()) { - rustCrate.withModule(ClientRustModule.config) { - val codegenScope = codegenScope(codegenContext.runtimeConfig) - if (authSchemes.isTokenBased()) { - rustTemplate("pub use #{Token};", *codegenScope) - } - if (authSchemes.isLoginBased()) { - rustTemplate("pub use #{Login};", *codegenScope) - } - } - } - } } private class HttpAuthServiceRuntimePluginCustomization( - private val codegenContext: ClientCodegenContext, + codegenContext: ClientCodegenContext, private val authSchemes: HttpAuthSchemes, ) : ServiceRuntimePluginCustomization() { private val serviceShape = codegenContext.serviceShape @@ -167,6 +152,7 @@ private class HttpAuthServiceRuntimePluginCustomization( rustTemplate("#{SharedAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) } } + fun registerNamedAuthScheme(name: String) { registerAuthScheme { rustTemplate("#{$name}::new()", *codegenScope) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 0feb667fe08..b53c2b2c2ff 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig @@ -32,13 +33,13 @@ private class HttpConnectorConfigCustomization( private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), - "HttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), - "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), - "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), - "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedHttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"), - "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), + "HttpClient" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"), + ), + "IntoShared" to configReexport(RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared")), + "SharedHttpClient" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"), + ), ) override fun section(section: ServiceConfig): Writable { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt index d3015e76936..f66fd6f288f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -21,8 +22,8 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C val api = RuntimeType.smithyRuntimeApi(rc) arrayOf( *preludeScope, - "ResolveCachedIdentity" to api.resolve("client::identity::ResolveCachedIdentity"), - "SharedIdentityCache" to api.resolve("client::identity::SharedIdentityCache"), + "ResolveCachedIdentity" to configReexport(api.resolve("client::identity::ResolveCachedIdentity")), + "SharedIdentityCache" to configReexport(api.resolve("client::identity::SharedIdentityCache")), ) } @@ -88,6 +89,7 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C *codegenScope, ) } + is ServiceConfig.ConfigImpl -> { rustTemplate( """ @@ -99,7 +101,8 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C *codegenScope, ) } - else -> { } + + else -> {} } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index e6d48030f12..eecd7bb4a6b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -17,8 +18,8 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( - "Intercept" to RuntimeType.intercept(runtimeConfig), - "SharedInterceptor" to RuntimeType.sharedInterceptor(runtimeConfig), + "Intercept" to configReexport(RuntimeType.intercept(runtimeConfig)), + "SharedInterceptor" to configReexport(RuntimeType.sharedInterceptor(runtimeConfig)), ) override fun section(section: ServiceConfig) = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index e44fce767f3..ec09d34659c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -25,7 +26,9 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "AsyncSleep" to sleepModule.resolve("AsyncSleep"), + "AsyncSleep" to configReexport(sleepModule.resolve("AsyncSleep")), + "SharedAsyncSleep" to configReexport(sleepModule.resolve("SharedAsyncSleep")), + "Sleep" to configReexport(sleepModule.resolve("Sleep")), "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), "debug" to RuntimeType.Tracing.resolve("debug"), @@ -33,10 +36,9 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf "RetryConfig" to retryConfig.resolve("RetryConfig"), "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), "RetryPartition" to retries.resolve("RetryPartition"), - "SharedAsyncSleep" to sleepModule.resolve("SharedAsyncSleep"), - "SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries::SharedRetryStrategy"), + "SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig) + .resolve("client::retries::SharedRetryStrategy"), "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"), - "Sleep" to sleepModule.resolve("Sleep"), "StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"), "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), @@ -286,7 +288,7 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { fun extras(rustCrate: RustCrate) { rustCrate.withModule(ClientRustModule.config) { rustTemplate( - "pub use #{sleep}::{AsyncSleep, SharedAsyncSleep, Sleep};", + "pub use #{sleep}::{Sleep};", "sleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index aa3e39ad4ec..9ef7c06e715 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -30,6 +30,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLints import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization +import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError val TestUtilFeature = Feature("test-util", false, listOf()) @@ -93,6 +94,8 @@ class RequiredCustomizations : ClientCodegenDecorator { """ /// Error type returned by the client. pub type SdkError = #{SdkError}; + pub use #{BuildError}; + pub use #{ConnectorError}; pub use #{DisplayErrorContext}; pub use #{ProvideErrorMetadata}; @@ -101,6 +104,9 @@ class RequiredCustomizations : ClientCodegenDecorator { "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), "R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(rc), + // this can't use the auto-rexport because the builder generator is defined in codegen core + "BuildError" to rc.operationBuildError(), + "ConnectorError" to RuntimeType.smithyRuntimeApi(rc).resolve("client::result::ConnectorError"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index e565aeefa9b..f40f46284df 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -32,7 +32,6 @@ internal class EndpointConfigCustomization( private val codegenScope = arrayOf( *preludeScope, "Params" to typesGenerator.paramsStruct(), - "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), "SharedEndpointResolver" to epModule.resolve("SharedEndpointResolver"), "StaticUriEndpointResolver" to epRuntimeModule.resolve("StaticUriEndpointResolver"), @@ -90,7 +89,6 @@ internal class EndpointConfigCustomization( ##[allow(deprecated)] self.set_endpoint_resolver( endpoint_url.map(|url| { - use #{IntoShared}; #{StaticUriEndpointResolver}::uri(url).into_shared() }) ); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 690bf41a0be..12bc55c8dcf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -24,9 +24,7 @@ class ClientRuntimeTypesReExportGenerator( rustTemplate( """ pub use #{ConfigBag}; - pub use #{Intercept}; pub use #{RuntimeComponents}; - pub use #{SharedInterceptor}; pub use #{IdentityCache}; """, "ConfigBag" to RuntimeType.configBag(rc), @@ -35,19 +33,6 @@ class ClientRuntimeTypesReExportGenerator( "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), "IdentityCache" to RuntimeType.smithyRuntime(rc).resolve("client::identity::IdentityCache"), ) - - if (codegenContext.enableUserConfigurableRuntimePlugins) { - rustTemplate( - """ - pub use #{runtime_plugin}::{RuntimePlugin, SharedRuntimePlugin}; - pub use #{config_bag}::FrozenLayer; - pub use #{RuntimeComponentsBuilder}; - """, - "runtime_plugin" to RuntimeType.smithyRuntimeApi(rc).resolve("client::runtime_plugin"), - "config_bag" to RuntimeType.smithyTypes(rc).resolve("config_bag"), - "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), - ) - } } rustCrate.withModule(ClientRustModule.Config.endpoint) { rustTemplate( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index bc3eea97622..347c731b20b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.traits.IdempotencyTokenTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter @@ -271,12 +272,12 @@ class ServiceConfigGenerator( "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "Cow" to RuntimeType.Cow, - "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "Layer" to smithyTypes.resolve("config_bag::Layer"), + "FrozenLayer" to configReexport(smithyTypes.resolve("config_bag::FrozenLayer")), + "Layer" to configReexport(smithyTypes.resolve("config_bag::Layer")), "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), - "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), - "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), - "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(runtimeConfig), + "RuntimeComponentsBuilder" to configReexport(RuntimeType.runtimeComponentsBuilder(runtimeConfig)), + "RuntimePlugin" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)), + "SharedRuntimePlugin" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)), "runtime_plugin" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin"), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt index c11fbfecf86..1c70bf639d0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt @@ -27,6 +27,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations +import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.smithy.transformers.allErrors import software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors @@ -65,6 +66,7 @@ class ServiceErrorGenerator( crate.withModule(RustModule.private("error_meta")) { renderDefinition() renderImplDisplay() + renderImplFromBuildError() // Every operation error can be converted into service::Error operations.forEach { operationShape -> // operation errors @@ -108,6 +110,21 @@ class ServiceErrorGenerator( } } + private fun RustWriter.renderImplFromBuildError() { + rustTemplate( + """ + impl From<#{BuildError}> for Error { + fn from(value: #{BuildError}) -> Self { + Error::Unhandled(#{Unhandled}::builder().source(value).build()) + } + } + + """, + "BuildError" to codegenContext.runtimeConfig.operationBuildError(), + "Unhandled" to unhandledError(codegenContext.runtimeConfig), + ) + } + private fun RustWriter.renderImplFrom(errorSymbol: Symbol, errors: List) { if (errors.isNotEmpty() || CodegenTarget.CLIENT == codegenContext.target) { val operationErrors = errors.map { model.expectShape(it) } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs index 4d9182a073e..93013abdd81 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs @@ -7,6 +7,7 @@ use crate::client::connection::ConnectionMetadata; use aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA}; +use aws_smithy_types::error::operation::BuildError; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::ErrorKind; use std::error::Error; @@ -482,6 +483,12 @@ where } } +impl From for SdkError { + fn from(value: BuildError) -> Self { + SdkError::ConstructionFailure(ConstructionFailure::builder().source(value).build()) + } +} + impl ProvideErrorMetadata for SdkError where E: ProvideErrorMetadata, From 7cc3a6eae62ae477647ebd021bda8e66352179c2 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 13 Nov 2023 12:52:48 -0500 Subject: [PATCH 251/331] Fix compilation error in generate code caused by name collision (#3175) ## Motivation and Context If you had a model like this: ```smithy @http(uri: "/SomeOperation2", method: "GET") operation GetThing { // input: GetThingInput, output: GetThingOutput } ``` But then nested in some other API you did something like this: ```smithy list GetThings { member: GetThingOutput } ``` Code would fail to compile because we generated the same method signature for two different types. ## Description ## Testing - [x] fixes minimal reproducer ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../client/smithy/NamingObstacleCourseTest.kt | 13 +++++ .../smithy/protocols/ProtocolFunctions.kt | 9 ++- .../NamingObstacleCourseTestModels.kt | 58 +++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt index aba0edc1a57..addc4d8f1e8 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt @@ -6,7 +6,10 @@ package software.amazon.smithy.rust.codegen.client.smithy import org.junit.jupiter.api.Test +import software.amazon.smithy.aws.traits.protocols.RestJson1Trait +import software.amazon.smithy.aws.traits.protocols.RestXmlTrait import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.reusedInputOutputShapesModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumsModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeOperationsModel @@ -32,4 +35,14 @@ class NamingObstacleCourseTest { fun `test Rust prelude enum variant names compile`() { clientIntegrationTest(rustPreludeEnumVariantsModel()) { _, _ -> } } + + @Test + fun `test reuse of input and output shapes json`() { + clientIntegrationTest(reusedInputOutputShapesModel(RestJson1Trait.builder().build())) + } + + @Test + fun `test reuse of input and output shapes xml`() { + clientIntegrationTest(reusedInputOutputShapesModel(RestXmlTrait.builder().build())) + } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt index 53bdfc009f1..c468fdca0bc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt @@ -18,6 +18,10 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.contextName +import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait +import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.toSnakeCase /** @@ -139,10 +143,13 @@ internal fun RustSymbolProvider.shapeModuleName(serviceShape: ServiceShape?, sha /** Creates a unique name for a ser/de function. */ fun RustSymbolProvider.shapeFunctionName(serviceShape: ServiceShape?, shape: Shape): String { + val extras = "".letIf(shape.hasTrait()) { + it + "_output" + }.letIf(shape.hasTrait()) { it + "_input" } val containerName = when (shape) { is MemberShape -> model.expectShape(shape.container).contextName(serviceShape).toSnakeCase() else -> shape.contextName(serviceShape).toSnakeCase() - } + } + extras return when (shape) { is MemberShape -> shape.memberName.toSnakeCase() is DocumentShape -> "document" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt index c45a7d09925..72979545b94 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.testutil import software.amazon.smithy.model.Model +import software.amazon.smithy.model.traits.Trait import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope object NamingObstacleCourseTestModels { @@ -169,4 +170,61 @@ object NamingObstacleCourseTestModels { """, ) }.toString().asSmithyModel() + + /** + * This targets two bug classes: + * - operation inputs used as nested outputs + * - operation outputs used as nested outputs + */ + fun reusedInputOutputShapesModel(protocol: Trait) = """ + namespace test + use ${protocol.toShapeId()} + use aws.api#service + @${protocol.toShapeId().name} + @service(sdkId: "test") + service Service { + version: "2006-03-01", + operations: [GetThing, ReuseGetThingIO] + } + + // re-use get thing output in a list & in an operation + @http(uri: "/SomeOperation2", method: "POST") + operation GetThing { + output: GetThingOutput + input: GetThingInput + } + + // an operation that re-uses the input and output shapes from `GetThing` above. this has caused issues in the + // past with operation/input shape confusion during function signature generation + @http(uri: "/SomeOperation3", method: "POST") + operation ReuseGetThingIO { + input: GetThingNested + output: GetThingNested + } + + structure GetThingOutput { + @required + meta: String + } + + structure GetThingInput { + @required + meta: String + } + + // nested structure which reuses input and output shapes internally + structure GetThingNested { + thingsOut: GetThingOutputList, + thingsIn: GetThingInputList, + thingOut: GetThingOutput, + thingIn: GetThingInput + } + + list GetThingOutputList { + member: GetThingOutput + } + list GetThingInputList { + member: GetThingInput + } + """.asSmithyModel() } From 0f9ada693d7dbafef6a34400399821a6a27e9e68 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 13 Nov 2023 15:01:05 -0500 Subject: [PATCH 252/331] RFC for forwards compatible errors (#3108) ## Motivation and Context This RFC describes a way to allow services to add model previously unmodeled variants in the future without breaking customers. ## Description [Rendered](https://github.com/awslabs/smithy-rs/blob/errors-forward-compat-rfc/design/src/rfcs/rfc0039_forward_compatible_errors.md) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- design/src/SUMMARY.md | 1 + design/src/rfcs/overview.md | 4 +- .../rfcs/rfc0039_forward_compatible_errors.md | 131 ++++++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 design/src/rfcs/rfc0039_forward_compatible_errors.md diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index bc46926208a..0fe352ca1f6 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -65,6 +65,7 @@ - [RFC-0036: HTTP Dependency Exposure](./rfcs/rfc0036_http_dep_elimination.md) - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md) - [RFC-0038: User-configurable retry classification](./rfcs/rfc0038_retry_classifier_customization.md) + - [RFC-0039: Forward Compatible Errors](./rfcs/rfc0039_forward_compatible_errors.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/rfcs/overview.md b/design/src/rfcs/overview.md index c957b532f08..de8a5496aea 100644 --- a/design/src/rfcs/overview.md +++ b/design/src/rfcs/overview.md @@ -46,4 +46,6 @@ - [RFC-0034: The Orchestrator Architecture](./rfc0034_smithy_orchestrator.md) - [RFC-0035: Sensible Defaults for Collection Values](./rfc0035_collection_defaults.md) - [RFC-0036: Enabling HTTP crate upgrades in the future](./rfc0036_http_dep_elimination.md) -- [RFC-0037: The HTTP wrapper type](./rfc0037_http_wrapper_type.md) +- [RFC-0037: The HTTP wrapper type](./rfc0037_http_wrapper.md) +- [RFC-0038: Retry Classifier Customization](./rfc0038_retry_classifier_customization.md) +- [RFC-0039: Forward Compatible Errors](./rfc0039_forward_compatible_errors.md) diff --git a/design/src/rfcs/rfc0039_forward_compatible_errors.md b/design/src/rfcs/rfc0039_forward_compatible_errors.md new file mode 100644 index 00000000000..9b69b6d7b30 --- /dev/null +++ b/design/src/rfcs/rfc0039_forward_compatible_errors.md @@ -0,0 +1,131 @@ + +RFC: Forward Compatible Errors +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC defines an approach for making it forwards-compatible to convert **unmodeled** `Unhandled` errors into modeled ones. This occurs as servers update their models to include errors that were previously unmodeled. + +Currently, SDK errors are **not** forward compatible in this way. If a customer matches `Unhandled` in addition to the `_` branch and a new variant is added, **they will fail to match the new variant**. We currently handle this issue with enums by prevent useful information from being readable from the `Unknown` variant. + +This is related to ongoing work on the [`non_exhaustive_omitted_patterns` lint](https://github.com/rust-lang/rust/issues/89554) which would produce a compiler warning when a new variant was added even when `_` was used. + + +Terminology +----------- + +For purposes of discussion, consider the following error: +```rust,ignore +#[non_exhaustive] +pub enum AbortMultipartUploadError { + NoSuchUpload(NoSuchUpload), + Unhandled(Unhandled), +} +``` + +- **Modeled Error**: An error with an named variant, e.g. `NoSuchUpload` above +- **Unmodeled Error**: Any other error, e.g. if the server returned `ValidationException` for the above operation. +- **Error code**: All errors across all protocols provide a `code`, a unique method to identify an error across the service closure. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, users match the `Unhandled` variant. They can then read the code from the `Unhandled` variant because [`Unhandled`](https://docs.rs/aws-smithy-types/0.56.1/aws_smithy_types/error/struct.Unhandled.html) implements the `ProvideErrorMetadata` trait as well as the standard-library `std::error::Error` trait. + +> Note: It's possible to write correct code today because the operation-level and service-level errors already expose `code()` via `ProvideErrorMetadata`. This RFC describes mechanisms to guide customers to write forward-compatible code. + +```rust,ignore +# fn docs() { + match client.get_object().send().await { + Ok(obj) => { ... }, + Err(e) => match e.into_service_error() { + GetObjectError::NotFound => { ... }, + GetObjectError::Unhandled(err) if err.code() == "ValidationException" => { ... } + other => { /** do something with this variant */ } + } + } +# } +``` + +We must instead guide customers into the following pattern: +```rust,ignore +# fn docs() { + match client.get_object().send().await { + Ok(obj) => { ... }, + Err(e) => match e.into_service_error() { + GetObjectError::NotFound => { ... }, + err if err.code() == "ValidationException" => { ... }, + err => warn!("{}", err.code()), + } + } +# } +``` + +In this example, because customers are _not_ matching on the `Unhandled` variant explicitly this code is forward compatible for `ValidationException` being introduced in the future. + +**Guiding Customers to this Pattern** +There are two areas we need to handle: +1. Prevent customers from extracting useful information from `Unhandled` +2. Alert customers _currently_ using unhandled what to use instead. For example, the following code is still problematic: + ```rust,ignore + match err { + GetObjectError::NotFound => { ... }, + err @ GetObject::Unhandled(_) if err.code() == Some("ValidationException") => { ... } + } + ``` + +For `1`, we need to remove the `ProvideErrorMetadata` trait implementation from `Unhandled`. We would expose this isntead through a layer of indirection to enable code generated to code to still read the data. + +For `2`, we would deprecate the `Unhandled` variants with a message clearly indicating how this code should be written. + +How to actually implement this RFC +---------------------------------- + +### Locking down `Unhandled` +In order to prevent accidental matching on `Unhandled`, we need to make it hard to extract useful information from `Unhandled` itself. We will do this by removing the `ProvideErrorMetadata` trait implementation and exposing the following method: + +```rust,ignore +#[doc(hidden)] +/// Introspect the error metadata of this error. +/// +/// This method should NOT be used from external code because matching on `Unhandled` directly is a backwards-compatibility +/// hazard. See `RFC-0039` for more information. +pub fn introspect(&self) -> impl ProvideErrorMetadata + '_ { + struct Introspected<'a>(&'a Unhandled); + impl ProvideErrorMetadata for Introspected { ... } + Introspected(self) +} +``` + +Generated code would this use `introspect` when supporting **top-level** `ErrorMetadata` (e.g. for [`aws_sdk_s3::Error`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/enum.Error.html)). + +### Deprecating the Variant +The `Unhandled` variant will be deprecated to prevent users from matching on it inadvertently. + +```rust,ignore +enum GetObjectError { + NotFound(NotFound), + #[deprecated("Matching on `Unhandled` directly is a backwards compatibility hazard. Use `err if err.error_code() == ...` instead. See [here]() for more information.")] + Unhandled(Unhandled) +} +``` + +### + + +Changes checklist +----------------- + +- [ ] Generate code to deprecate unhandled variants. Determine the best way to allow `Unhandled` to continue to be constructed in client code +- [ ] Generate code to deprecate the `Unhandled` variant for the service meta-error. Consider how this interacts with non-service errors. +- [ ] Update `Unhandled` to make it useless on its own and expose information via an `Introspect` doc hidden struct. +- [ ] Update developer guide to address this issue. +- [ ] Changelog & Upgrade Guidance From f9241adb2007fb6fc69e3d3a229e53ac99c7434e Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 14 Nov 2023 17:43:29 +0100 Subject: [PATCH 253/331] Re-introduce default generic for server service struct (#3197) This was accidentally removed in #3095. Fixes #3177. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../generators/ServerServiceGenerator.kt | 11 +++++- .../generators/ServerServiceGeneratorTest.kt | 39 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index 79b087ee14d..8eaec006a71 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -488,7 +488,16 @@ class ServerServiceGenerator( /// /// See the [root](crate) documentation for more information. ##[derive(Clone)] - pub struct $serviceName { + pub struct $serviceName< + S = #{SmithyHttpServer}::routing::RoutingService< + #{Router}< + #{SmithyHttpServer}::routing::Route< + #{SmithyHttpServer}::body::BoxBody + >, + >, + #{Protocol}, + > + > { // This is the router wrapped by layers. svc: S, } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt new file mode 100644 index 00000000000..6e110f96416 --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest +import java.io.File + +internal class ServerServiceGeneratorTest { + /** + * See . + */ + @Test + fun `one should be able to return a built service from a function`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + serverIntegrationTest(model) { _, rustCrate -> + rustCrate.testModule { + // No actual tests: we just want to check that this compiles. + rust( + """ + fn _build_service() -> crate::SimpleService { + let config = crate::SimpleServiceConfig::builder().build(); + let service = crate::SimpleService::builder(config).build_unchecked(); + + service.boxed() + } + """, + ) + } + } + } +} From 9c088788019d5eff96ae65287dcbd226a9613331 Mon Sep 17 00:00:00 2001 From: david-perez Date: Tue, 14 Nov 2023 17:07:14 +0100 Subject: [PATCH 254/331] Re-introduce default generic for server service struct This was accidentally removed in #3095. Fixes #3177. --- .../generators/ServerServiceGenerator.kt | 11 +++++- .../generators/ServerServiceGeneratorTest.kt | 39 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index e1da585d054..d9dabb880ed 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -488,7 +488,16 @@ class ServerServiceGenerator( /// /// See the [root](crate) documentation for more information. ##[derive(Clone)] - pub struct $serviceName { + pub struct $serviceName< + S = #{SmithyHttpServer}::routing::RoutingService< + #{Router}< + #{SmithyHttpServer}::routing::Route< + #{SmithyHttpServer}::body::BoxBody + >, + >, + #{Protocol}, + > + > { // This is the router wrapped by layers. svc: S, } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt new file mode 100644 index 00000000000..6e110f96416 --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest +import java.io.File + +internal class ServerServiceGeneratorTest { + /** + * See . + */ + @Test + fun `one should be able to return a built service from a function`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + serverIntegrationTest(model) { _, rustCrate -> + rustCrate.testModule { + // No actual tests: we just want to check that this compiles. + rust( + """ + fn _build_service() -> crate::SimpleService { + let config = crate::SimpleServiceConfig::builder().build(); + let service = crate::SimpleService::builder(config).build_unchecked(); + + service.boxed() + } + """, + ) + } + } + } +} From cbcbed95d90a178ba20072d9aab76669ce03c708 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 14 Nov 2023 11:14:30 -0800 Subject: [PATCH 255/331] Implement ProvideErrorMetadata for service errors (#3189) This PR implements the `ProvideErrorMetadata` trait for service errors as a prerequisite for implementing [RFC-39](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0039_forward_compatible_errors.md). Related SDK issue: https://github.com/awslabs/aws-sdk-rust/issues/780 ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 24 +++++++ .../customize/RequiredCustomizations.kt | 2 + .../error/OperationErrorGenerator.kt | 63 ++++++++++--------- .../generators/error/ServiceErrorGenerator.kt | 29 +++++++++ .../error/ServiceErrorGeneratorTest.kt | 26 ++++++++ 5 files changed, 114 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index dcf5cf917e4..f88655c9baa 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -113,3 +113,27 @@ message = "The `RequestId` trait has moved from the aws-http crate into aws-type references = ["smithy-rs#3160"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Add `ProvideErrorMetadata` impl for service `Error` type." +references = ["aws-sdk-rust#780", "smithy-rs#3189"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "Add `ProvideErrorMetadata` impl for service `Error` type." +references = ["aws-sdk-rust#780", "smithy-rs#3189"] +meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[aws-sdk-rust]] +message = "Remove deprecated error kind type aliases." +references = ["smithy-rs#3189"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "Remove deprecated error kind type aliases." +references = ["smithy-rs#3189"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index 78f1439c3c8..70e9d67c2ad 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -103,9 +103,11 @@ class RequiredCustomizations : ClientCodegenDecorator { pub use #{DisplayErrorContext}; pub use #{ProvideErrorMetadata}; + pub use #{ErrorMetadata}; """, "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + "ErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ErrorMetadata"), "R" to RuntimeType.smithyRuntimeApiClient(rc).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(rc), // this can't use the auto-rexport because the builder generator is defined in codegen core diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt index c6f29c15508..dfa0c1b60e9 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt @@ -35,7 +35,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizat import software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors import software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors import software.amazon.smithy.rust.codegen.core.util.UNREACHABLE -import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.toSnakeCase @@ -75,22 +74,6 @@ class OperationErrorGenerator( visibility = Visibility.PUBLIC, ) - // TODO(deprecated): Remove this temporary alias. This was added so that the compiler - // points customers in the right direction when they are upgrading. Unfortunately there's no - // way to provide better backwards compatibility on this change. - val kindDeprecationMessage = "Operation `*Error/*ErrorKind` types were combined into a single `*Error` enum. " + - "The `.kind` field on `*Error` no longer exists and isn't needed anymore (you can just match on the " + - "error directly since it's an enum now)." - writer.rust( - """ - /// Do not use this. - /// - /// $kindDeprecationMessage - ##[deprecated(note = ${kindDeprecationMessage.dq()})] - pub type ${errorSymbol.name}Kind = ${errorSymbol.name}; - """, - ) - writer.rust("/// Error type for the `${errorSymbol.name}` operation.") meta.render(writer) writer.rustBlock("enum ${errorSymbol.name}") { @@ -108,7 +91,18 @@ class OperationErrorGenerator( unhandledError(runtimeConfig), ) } - writer.rustBlock("impl #T for ${errorSymbol.name}", createUnhandledError) { + + writer.renderImpl(errorSymbol, errors) + writer.renderImplStdError(errorSymbol, errors) + writer.renderImplDisplay(errorSymbol, errors) + writer.renderImplProvideErrorKind(errorSymbol, errors) + writer.renderImplProvideErrorMetadata(errorSymbol, errors) + writer.renderImplCreateUnhandledError(errorSymbol) + writer.writeCustomizations(customizations, ErrorSection.OperationErrorAdditionalTraitImpls(errorSymbol, errors)) + } + + private fun RustWriter.renderImplCreateUnhandledError(errorSymbol: Symbol) { + rustBlock("impl #T for ${errorSymbol.name}", createUnhandledError) { rustBlockTemplate( """ fn create_unhandled_error( @@ -132,27 +126,32 @@ class OperationErrorGenerator( ) } } - writer.rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.Display) { + } + + private fun RustWriter.renderImplDisplay(errorSymbol: Symbol, errors: List) { + rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.Display) { rustBlock("fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result") { delegateToVariants(errors) { writable { rust("_inner.fmt(f)") } } } } + } + private fun RustWriter.renderImplProvideErrorMetadata(errorSymbol: Symbol, errors: List) { val errorMetadataTrait = RuntimeType.provideErrorMetadataTrait(runtimeConfig) - writer.rustBlock("impl #T for ${errorSymbol.name}", errorMetadataTrait) { + rustBlock("impl #T for ${errorSymbol.name}", errorMetadataTrait) { rustBlock("fn meta(&self) -> &#T", errorMetadata(runtimeConfig)) { delegateToVariants(errors) { writable { rust("#T::meta(_inner)", errorMetadataTrait) } } } } + } - writer.writeCustomizations(customizations, ErrorSection.OperationErrorAdditionalTraitImpls(errorSymbol, errors)) - + private fun RustWriter.renderImplProvideErrorKind(errorSymbol: Symbol, errors: List) { val retryErrorKindT = RuntimeType.retryErrorKind(symbolProvider.config.runtimeConfig) - writer.rustBlock( + rustBlock( "impl #T for ${errorSymbol.name}", RuntimeType.provideErrorKind(symbolProvider.config.runtimeConfig), ) { @@ -182,9 +181,11 @@ class OperationErrorGenerator( } } } + } - writer.rustBlock("impl ${errorSymbol.name}") { - writer.rustTemplate( + private fun RustWriter.renderImpl(errorSymbol: Symbol, errors: List) { + rustBlock("impl ${errorSymbol.name}") { + rustTemplate( """ /// Creates the `${errorSymbol.name}::Unhandled` variant from any error type. pub fn unhandled(err: impl #{Into}<#{Box}>) -> Self { @@ -201,13 +202,13 @@ class OperationErrorGenerator( "StdError" to RuntimeType.StdError, "Unhandled" to unhandledError(runtimeConfig), ) - writer.docs( + docs( """ Returns error metadata, which includes the error code, message, request ID, and potentially additional information. """, ) - writer.rustBlock("pub fn meta(&self) -> &#T", errorMetadata) { + rustBlock("pub fn meta(&self) -> &#T", errorMetadata) { rust("use #T;", RuntimeType.provideErrorMetadataTrait(runtimeConfig)) rustBlock("match self") { errors.forEach { error -> @@ -220,14 +221,16 @@ class OperationErrorGenerator( errors.forEach { error -> val errorVariantSymbol = symbolProvider.toSymbol(error) val fnName = errorVariantSymbol.name.toSnakeCase() - writer.rust("/// Returns `true` if the error kind is `${errorSymbol.name}::${errorVariantSymbol.name}`.") - writer.rustBlock("pub fn is_$fnName(&self) -> bool") { + rust("/// Returns `true` if the error kind is `${errorSymbol.name}::${errorVariantSymbol.name}`.") + rustBlock("pub fn is_$fnName(&self) -> bool") { rust("matches!(self, Self::${errorVariantSymbol.name}(_))") } } } + } - writer.rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.StdError) { + private fun RustWriter.renderImplStdError(errorSymbol: Symbol, errors: List) { + rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.StdError) { rustBlockTemplate( "fn source(&self) -> #{Option}<&(dyn #{StdError} + 'static)>", *preludeScope, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt index 1c70bf639d0..f6fc9ed166c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt @@ -21,9 +21,11 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations @@ -67,6 +69,7 @@ class ServiceErrorGenerator( renderDefinition() renderImplDisplay() renderImplFromBuildError() + renderImplProvideErrorMetadata() // Every operation error can be converted into service::Error operations.forEach { operationShape -> // operation errors @@ -177,6 +180,32 @@ class ServiceErrorGenerator( } } + private fun RustWriter.renderImplProvideErrorMetadata() { + rustTemplate( + """ + impl #{ProvideErrorMetadata} for Error { + fn meta(&self) -> &#{ErrorMetadata} { + match self { + #{matchers} + Self::Unhandled(inner) => inner.meta(), + } + } + } + """, + *preludeScope, + "ErrorMetadata" to RuntimeType.smithyTypes(codegenContext.runtimeConfig) + .resolve("error::metadata::ErrorMetadata"), + "ProvideErrorMetadata" to RuntimeType.smithyTypes(codegenContext.runtimeConfig) + .resolve("error::metadata::ProvideErrorMetadata"), + "matchers" to writable { + allErrors.forEach { errorShape -> + val errSymbol = symbolProvider.toSymbol(errorShape) + rust("Self::${errSymbol.name}(inner) => inner.meta(),") + } + }, + ) + } + private fun RustWriter.renderDefinition() { rust("/// All possible error types for this service.") RustMetadata( diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt index 0f26fc7b42b..a8ce5b832a0 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt @@ -84,4 +84,30 @@ internal class ServiceErrorGeneratorTest { } } } + + @Test + fun `provides error metadata`() { + clientIntegrationTest(model) { _, rustCrate -> + rustCrate.moduleFor(model.lookup("com.example#CanYouRepeatThat")) { + unitTest( + name = "generates_combined_error_enums", + test = """ + use crate::Error; + use crate::error::{ErrorMetadata, ProvideErrorMetadata}; + use crate::operation::say_hello::SayHelloError; + use crate::types::error::*; + + // Unhandled variants properly delegate source. + let error = Error::from(SayHelloError::SorryBusy( + SorryBusy::builder() + .meta(ErrorMetadata::builder().code("some code").message("some message").build()) + .build() + )); + assert_eq!("some code", error.code().expect("code field")); + assert_eq!("some message", error.message().expect("message field")); + """, + ) + } + } + } } From da19a7073cc87dfdf8f8df0ab557383cce4e29ba Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 14 Nov 2023 19:21:03 +0000 Subject: [PATCH 256/331] Upgrade the smithy-rs runtime crates version to 0.57.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0343d116bd6..d1aefa6d607 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.57.1 +smithy.rs.runtime.crate.version=0.57.2 kotlin.code.style=official From e7cd72a19386fbdb2af8352210919a6dc5eadc9a Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 14 Nov 2023 19:22:56 +0000 Subject: [PATCH 257/331] Update changelog --- CHANGELOG.md | 17 ++++ CHANGELOG.next.toml | 63 +------------ aws/SDK_CHANGELOG.next.json | 183 ++++++++++++++++++++++-------------- 3 files changed, 132 insertions(+), 131 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ded725b1e71..63cff7a1cb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,21 @@ +November 14th, 2023 +=================== +**New this release:** +- :tada: (all, [smithy-rs#3173](https://github.com/awslabs/smithy-rs/issues/3173), [smithy-rs#3171](https://github.com/awslabs/smithy-rs/issues/3171)) Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: + ```rust + async fn do_a_thing(client: &Client) -> Result> { + client.run_operation().complex_field(ComplexField::builder() + .a("a") + .b("b") + .build()? + ).send().await?; + } + ``` + + Previously, `?` could not be used in this position. + + November 1st, 2023 ================== **New this release:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index a22d670ba9d..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,65 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = "Fix aws-sdk-rust#930 (PutSnapshotBlock)" -references = ["smithy-rs#3126", "aws-sdk-rust#930"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Fix exclusively setting the credentials provider at operation config-override time. It's now possible to set the credentials when an operation is sent (via `.config_override()`), rather than at client-creation time." -references = ["smithy-rs#3156", "aws-sdk-rust#901"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[smithy-rs]] -message = """Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: -```rust -async fn do_a_thing(client: &Client) -> Result> { - client.run_operation().complex_field(ComplexField::builder() - .a("a") - .b("b") - .build()? - ).send().await?; -} -``` - -Previously, `?` could not be used in this position. -""" -references = ["smithy-rs#3173", "smithy-rs#3171"] -meta = { "breaking" = false, "tada" = true, "bug" = false } -author = "rcoh" - -[[aws-sdk-rust]] -message = """Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code: -```rust -async fn create_table(dynamo_client: &Client) -> Result<(), SdkError> { - dynamo_client - .create_table() - .table_name("test") - .key_schema( - KeySchemaElement::builder() - .attribute_name("year") - .key_type(KeyType::Hash) - .build()?, // Previously, `?` could not be used here - ) - .send() - .await?; - Ok(()) -} -``` - -Previously, `?` could not be used in this position. -""" -references = ["smithy-rs#3173", "smithy-rs#3171"] -meta = { "breaking" = false, "tada" = true, "bug" = false } -author = "rcoh" - -[[aws-sdk-rust]] -message = "ProvideCredentials and SharedCredentialsProvider are now re-exported." -references = ["smithy-rs#3173", "smithy-rs#3155"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index dafa5764858..8888de5d7eb 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,21 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2687", - "smithy-rs#2694" - ], - "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", - "age": 5 - }, { "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", "meta": { @@ -32,7 +17,7 @@ "smithy-rs#2815" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Add accessors to Builders", @@ -46,7 +31,7 @@ "smithy-rs#2791" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Remove native-tls and add a migration guide.", @@ -60,7 +45,7 @@ "smithy-rs#2675" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", @@ -75,7 +60,7 @@ "aws-sdk-rust#703" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", @@ -89,7 +74,7 @@ "smithy-rs#2720" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", @@ -103,7 +88,7 @@ "smithy-rs#2673" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", @@ -117,7 +102,7 @@ "smithy-rs#2730" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", @@ -133,7 +118,7 @@ "aws-sdk-rust#2087" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", @@ -149,7 +134,7 @@ "smithy-rs#2846" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", @@ -163,7 +148,7 @@ "smithy-rs#2742" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Update MSRV to Rust 1.69.0", @@ -177,7 +162,7 @@ "smithy-rs#2893" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", @@ -194,7 +179,7 @@ "smithy-rs#2616" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", @@ -208,7 +193,7 @@ "smithy-rs#2652" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", @@ -222,7 +207,7 @@ "smithy-rs#2783" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", @@ -236,7 +221,7 @@ "smithy-rs#2845" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", @@ -250,7 +235,7 @@ "smithy-rs#2724" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", @@ -265,7 +250,7 @@ "aws-sdk-rust#338" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", @@ -279,7 +264,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", @@ -293,7 +278,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", @@ -305,7 +290,7 @@ "author": "jdisanti", "references": [], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", @@ -320,7 +305,7 @@ "aws-sdk-rust#862" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Fix requests to S3 with `no_credentials` set.", @@ -335,7 +320,7 @@ "aws-sdk-rust#864" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", @@ -350,7 +335,7 @@ "aws-sdk-rust#875" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", @@ -365,7 +350,7 @@ "aws-sdk-rust#872" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", @@ -379,7 +364,7 @@ "smithy-rs#2935" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", @@ -393,7 +378,7 @@ "smithy-rs#2917" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", @@ -409,7 +394,7 @@ "aws-sdk-rust#699" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/3022) for details.", @@ -423,7 +408,7 @@ "smithy-rs#3011" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", @@ -437,7 +422,7 @@ "smithy-rs#2921" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", @@ -451,7 +436,7 @@ "smithy-rs#2911" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/awslabs/smithy-rs/discussions/2929).", @@ -466,7 +451,7 @@ "aws-sdk-rust#536" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", @@ -480,7 +465,7 @@ "smithy-rs#2913" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Update MSRV to Rust 1.70.0", @@ -494,7 +479,7 @@ "smithy-rs#2948" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", @@ -509,7 +494,7 @@ "aws-sdk-rust#873" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Allow `no_credentials` to be used with all S3 operations.", @@ -524,7 +509,7 @@ "aws-sdk-rust#878" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", @@ -539,7 +524,7 @@ "smithy-rs#2951" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", @@ -555,7 +540,7 @@ "smithy-rs#2964" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Remove `once_cell` from public API.", @@ -569,7 +554,7 @@ "smithy-rs#2973" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Fix regression with redacting sensitive HTTP response bodies.", @@ -584,7 +569,7 @@ "smithy-rs#2972" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", @@ -598,7 +583,7 @@ "smithy-rs#2995" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", @@ -612,7 +597,7 @@ "smithy-rs#2978" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", @@ -626,7 +611,7 @@ "smithy-rs#1797" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", @@ -640,7 +625,7 @@ "smithy-rs#2983" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The IMDS Client builder's `build()` method is no longer async.", @@ -654,7 +639,7 @@ "smithy-rs#2997" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", @@ -668,7 +653,7 @@ "smithy-rs#3014" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", @@ -683,7 +668,7 @@ "smithy-rs#3007" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/awslabs/smithy-rs/discussions/3050).\n", @@ -698,7 +683,7 @@ "smithy-rs#3018" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", @@ -712,7 +697,7 @@ "smithy-rs#3055" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", @@ -726,7 +711,7 @@ "smithy-rs#3061" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", @@ -740,7 +725,7 @@ "smithy-rs#3065" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", @@ -754,7 +739,7 @@ "smithy-rs#3059" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", @@ -768,7 +753,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", @@ -782,7 +767,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", @@ -796,7 +781,67 @@ "smithy-rs#3077" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 + }, + { + "message": "Fix aws-sdk-rust#930 (PutSnapshotBlock)", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3126", + "aws-sdk-rust#930" + ], + "since-commit": "da19a7073cc87dfdf8f8df0ab557383cce4e29ba", + "age": 1 + }, + { + "message": "Fix exclusively setting the credentials provider at operation config-override time. It's now possible to set the credentials when an operation is sent (via `.config_override()`), rather than at client-creation time.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#3156", + "aws-sdk-rust#901" + ], + "since-commit": "da19a7073cc87dfdf8f8df0ab557383cce4e29ba", + "age": 1 + }, + { + "message": "Enable conversion from `BuildError` into `SdkError` & `::Error`. This allows customers to write the following code:\n```rust\nasync fn create_table(dynamo_client: &Client) -> Result<(), SdkError> {\n dynamo_client\n .create_table()\n .table_name(\"test\")\n .key_schema(\n KeySchemaElement::builder()\n .attribute_name(\"year\")\n .key_type(KeyType::Hash)\n .build()?, // Previously, `?` could not be used here\n )\n .send()\n .await?;\n Ok(())\n}\n```\n\nPreviously, `?` could not be used in this position.\n", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "rcoh", + "references": [ + "smithy-rs#3173", + "smithy-rs#3171" + ], + "since-commit": "da19a7073cc87dfdf8f8df0ab557383cce4e29ba", + "age": 1 + }, + { + "message": "ProvideCredentials and SharedCredentialsProvider are now re-exported.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3173", + "smithy-rs#3155" + ], + "since-commit": "da19a7073cc87dfdf8f8df0ab557383cce4e29ba", + "age": 1 } ], "aws-sdk-model": [] From 412866293654923777bb85519b6ec52ed1b549b1 Mon Sep 17 00:00:00 2001 From: codypenta <86309192+codypenta@users.noreply.github.com> Date: Tue, 14 Nov 2023 16:21:18 -0500 Subject: [PATCH 258/331] Fix error struct with default impl (#3190) ## Motivation and Context When an error member has a default value, it will generate errors (specifically is_none not found on type String) with smithy-rs client unless you manually specify @required More Here: #3182 ## Description Adds recomendation change to address error structures with a default implementation like so: ```kotlin if (errorMessageMember != null) { val symbol = symbolProvider.toSymbol(errorMessageMember) if (symbol.isOptional()) { rust( """ if tmp.message.is_none() { tmp.message = _error_message; } """, ) } } ..... ``` ```smithy @error("client") structure Error { @required requestId: String @required message: String code: String = "400" context: String } ``` ## Testing Added the above and ran `./gradlew codegen-client-test:build` with a build successful ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 8 +++ .../protocol/ProtocolParserGenerator.kt | 4 +- .../protocol/ProtocolParserGeneratorTest.kt | 71 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 0113a7eba7b..0d38fd54fc0 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,6 +11,14 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" +[[smithy-rs]] +message = """ +Fix rendering of @error structs when fields have default values +""" +references = ["smithy-rs#3182"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client"} +author = "codypenta" + [[aws-sdk-rust]] message = "Change `ByteStream::into_async_read` to return `AsyncBufRead`" references = ["smithy-rs#3164"] diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt index 3e19c350b9e..8ce713b457d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt @@ -27,6 +27,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol @@ -163,7 +164,8 @@ class ProtocolParserGenerator( val errorMessageMember = errorShape.errorMessageMember() // If the message member is optional and wasn't set, we set a generic error message. if (errorMessageMember != null) { - if (errorMessageMember.isOptional) { + val symbol = symbolProvider.toSymbol(errorMessageMember) + if (symbol.isOptional()) { rust( """ if tmp.message.is_none() { diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt new file mode 100644 index 00000000000..760eced3874 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel + +class ProtocolParserGeneratorTest { + private val model = """ + ${'$'}version: "2.0" + namespace test + + use aws.protocols#restJson1 + + @restJson1 + service TestService { + version: "2019-12-16", + operations: [SomeOperation] + errors: [SomeTopLevelError] + } + + @http(uri: "/SomeOperation", method: "POST") + operation SomeOperation { + input: SomeOperationInputOutput, + output: SomeOperationInputOutput, + errors: [SomeOperationError] + } + + structure SomeOperationInputOutput { + payload: String, + a: String, + b: Integer + } + + @error("server") + structure SomeTopLevelError { + @required + requestId: String + + @required + message: String + + code: String = "400" + + context: String + } + + @error("client") + structure SomeOperationError { + @required + requestId: String + + @required + message: String + + code: String = "400" + + context: String + } + """ + .asSmithyModel() + + @Test + fun `generate an complex error structure that compiles`() { + clientIntegrationTest(model) { _, _ -> } + } +} From 446326c537d1c96fa307e6bff9beb55e91eba213 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 14 Nov 2023 17:06:10 -0500 Subject: [PATCH 259/331] Add support for BehaviorMajorVersions (#3151) ## Motivation and Context See [rendered RFC](https://github.com/awslabs/smithy-rs/blob/df518bfb59c7498ab533fac4256ec0b977cee42c/design/src/rfcs/rfc0039_behavior_major_versions.md) ## Description This add `BehaviorMajorVersions` to the SDK and wires them in up and down the stack. ## Testing - [x] lots of ITs / UTs ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 29 ++++ aws/SDK_README.md.hb | 2 +- aws/rust-runtime/aws-config/Cargo.toml | 2 + .../aws-config/external-types.toml | 1 + .../src/default_provider/app_name.rs | 3 +- aws/rust-runtime/aws-config/src/lib.rs | 89 ++++++++++-- .../aws-config/src/provider_config.rs | 3 +- aws/rust-runtime/aws-config/src/sso/token.rs | 5 +- .../aws-config/src/sts/assume_role.rs | 12 +- .../aws-types/external-types.toml | 1 + aws/rust-runtime/aws-types/src/sdk_config.rs | 25 ++++ .../smithy/rustsdk/AwsCrateDocsDecorator.kt | 2 +- .../rustsdk/AwsFluentClientDecorator.kt | 2 + .../smithy/rustsdk/SdkConfigDecorator.kt | 1 + .../rustsdk/CredentialProviderConfigTest.kt | 8 +- .../rustsdk/RegionProviderConfigTest.kt | 20 ++- .../amazon/smithy/rustsdk/TestUtil.kt | 46 +++--- aws/sdk/integration-tests/dynamodb/Cargo.toml | 2 +- aws/sdk/integration-tests/ec2/Cargo.toml | 2 +- aws/sdk/integration-tests/glacier/Cargo.toml | 2 +- aws/sdk/integration-tests/iam/Cargo.toml | 2 +- .../iam/tests/resolve-global-endpoint.rs | 8 +- aws/sdk/integration-tests/kms/Cargo.toml | 2 +- aws/sdk/integration-tests/lambda/Cargo.toml | 2 +- .../no-default-features/Cargo.toml | 1 + .../tests/client-construction.rs | 82 ++++++++++- aws/sdk/integration-tests/polly/Cargo.toml | 2 +- .../integration-tests/qldbsession/Cargo.toml | 2 +- aws/sdk/integration-tests/s3/Cargo.toml | 8 +- .../integration-tests/s3/tests/endpoints.rs | 1 + .../integration-tests/s3control/Cargo.toml | 2 +- aws/sdk/integration-tests/sts/Cargo.toml | 2 +- aws/sdk/integration-tests/test.sh | 2 +- .../timestreamquery/Cargo.toml | 2 +- .../transcribestreaming/Cargo.toml | 2 +- .../integration-tests/webassembly/Cargo.toml | 2 +- .../endpoint/EndpointConfigCustomization.kt | 3 +- .../client/FluentClientGenerator.kt | 26 ++++ .../config/ServiceConfigGenerator.kt | 134 ++++++++++++++---- .../testutil/ClientCodegenIntegrationTest.kt | 2 +- .../testutil/TestConfigCustomization.kt | 100 ------------- .../codegen/client/testutil/TestHelpers.kt | 2 + .../MetadataCustomizationTest.kt | 18 +-- .../ResiliencyConfigCustomizationTest.kt | 52 ++----- .../ClientContextConfigCustomizationTest.kt | 96 ++++++------- .../smithy/endpoint/EndpointsDecoratorTest.kt | 2 +- .../smithy/generators/ErrorCorrectionTest.kt | 2 +- ...empotencyTokenProviderCustomizationTest.kt | 23 --- .../config/ServiceConfigGeneratorTest.kt | 86 +++++------ .../rust/codegen/core/rustlang/RustWriter.kt | 19 ++- .../codegen/core/testutil/BasicTestModels.kt | 23 +++ .../rust/codegen/core/testutil/TestHelpers.kt | 14 +- design/src/SUMMARY.md | 1 + .../rfcs/rfc0040_behavior_major_versions.md | 86 +++++++++++ .../pokemon-service-client-usage/Cargo.toml | 2 +- .../python/pokemon-service-test/Cargo.toml | 2 +- .../aws-smithy-runtime-api/src/client.rs | 1 + .../src/client/behavior_version.rs | 42 ++++++ .../src/client/runtime_components.rs | 17 ++- .../aws-smithy-runtime/src/client/defaults.rs | 8 ++ .../client/http/test_util/capture_request.rs | 9 +- tools/ci-cdk/canary-lambda/src/main.rs | 1 + 62 files changed, 743 insertions(+), 407 deletions(-) delete mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt delete mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt create mode 100644 codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt create mode 100644 design/src/rfcs/rfc0040_behavior_major_versions.md create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 0d38fd54fc0..f8499b99561 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -67,6 +67,35 @@ references = ["smithy-rs#3160"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" +[[aws-sdk-rust]] +message = """Clients now require a `BehaviorMajorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. + +```rust +async fn example() { + // with aws-config + let conf = aws_config::from_env_with_version(aws_config::BehaviorMajorVersion::v2023_11_09()); + + // when creating a client + let client = my_service::Client::from_conf(my_service::Config::builder().behavior_major_version(..)..build()); +} +```""" +references = ["smithy-rs#3151"] +author = "rcoh" +meta = { "breaking" = true, "tada" = false, "bug" = false } + +[[smithy-rs]] +message = """Clients now require a `BehaviorMajorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. + +```rust +async fn example() { + // when creating a client + let client = my_service::Client::from_conf(my_service::Config::builder().behavior_major_version(..)..build()); +} +```""" +references = ["smithy-rs#3151"] +author = "rcoh" +meta = { "breaking" = true, "tada" = false, "bug" = false } + [[aws-sdk-rust]] message = "Add `ProvideErrorMetadata` impl for service `Error` type." references = ["aws-sdk-rust#780", "smithy-rs#3189"] diff --git a/aws/SDK_README.md.hb b/aws/SDK_README.md.hb index f82049c9c42..cf0897c35b4 100644 --- a/aws/SDK_README.md.hb +++ b/aws/SDK_README.md.hb @@ -33,7 +33,7 @@ The SDK provides one crate per AWS service. You must add [Tokio](https://crates. ```toml [dependencies] - aws-config = "{{sdk_version_aws_config}}" + aws-config = { version= "{{sdk_version_aws_config}}", features = ["behavior-version-latest"] } aws-sdk-dynamodb = "{{sdk_version_aws_sdk_dynamodb}}" tokio = { version = "1", features = ["full"] } ``` diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 7fd53ee0d3b..4c51dbaa40e 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -9,6 +9,7 @@ license = "Apache-2.0" repository = "https://github.com/smithy-lang/smithy-rs" [features] +behavior-version-latest = [] client-hyper = ["aws-smithy-runtime/connector-hyper-0-14-x"] rustls = ["aws-smithy-runtime/tls-rustls", "client-hyper"] allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI @@ -71,6 +72,7 @@ serde_json = "1" hyper-rustls = { version = "0.24", features = ["webpki-tokio", "http2", "http1"] } aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async", features = ["rt-tokio", "test-util"] } + [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index d672e6f2b07..caea8cb21a2 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -22,6 +22,7 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::ResolveIdentity", + "aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion", "aws_smithy_runtime_api::client::orchestrator::HttpResponse", "aws_smithy_runtime_api::client::result::SdkError", "aws_smithy_types::body::SdkBody", diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index 55e87f82bc1..8f368a5d044 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -91,6 +91,7 @@ mod tests { use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; use crate::provider_config::ProviderConfig; use crate::test_case::{no_traffic_client, InstantSleep}; + use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; use aws_types::os_shim_internal::{Env, Fs}; #[tokio::test] @@ -117,7 +118,7 @@ mod tests { #[tokio::test] async fn profile_name_override() { let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk_ua_app_id = correct")]); - let conf = crate::from_env() + let conf = crate::from_env_with_version(BehaviorMajorVersion::latest()) .sleep_impl(InstantSleep) .fs(fs) .http_client(no_traffic_client()) diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 0ae39ed3b63..544a394acd8 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -11,6 +11,7 @@ rustdoc::missing_crate_level_docs, unreachable_pub )] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] //! `aws-config` provides implementations of region and credential resolution. //! @@ -25,14 +26,15 @@ //! //! Load default SDK configuration: //! ```no_run -//! # mod aws_sdk_dynamodb { +//! use aws_config::BehaviorMajorVersion; +//! mod aws_sdk_dynamodb { //! # pub struct Client; //! # impl Client { //! # pub fn new(config: &aws_types::SdkConfig) -> Self { Client } //! # } //! # } //! # async fn docs() { -//! let config = aws_config::load_from_env().await; +//! let config = aws_config::load_from_env_with_version(BehaviorMajorVersion::v2023_11_09()).await; //! let client = aws_sdk_dynamodb::Client::new(&config); //! # } //! ``` @@ -48,6 +50,7 @@ //! # async fn docs() { //! # use aws_config::meta::region::RegionProviderChain; //! let region_provider = RegionProviderChain::default_provider().or_else("us-east-1"); +//! // Note: requires the `behavior-version-latest` feature enabled //! let config = aws_config::from_env().region(region_provider).load().await; //! let client = aws_sdk_dynamodb::Client::new(&config); //! # } @@ -84,7 +87,7 @@ //! # fn custom_provider(base: &SdkConfig) -> impl ProvideCredentials { //! # base.credentials_provider().unwrap().clone() //! # } -//! let sdk_config = aws_config::load_from_env().await; +//! let sdk_config = aws_config::load_from_env_with_version(aws_config::BehaviorMajorVersion::latest()).await; //! let custom_credentials_provider = custom_provider(&sdk_config); //! let dynamo_config = aws_sdk_dynamodb::config::Builder::from(&sdk_config) //! .credentials_provider(custom_credentials_provider) @@ -94,9 +97,11 @@ //! ``` pub use aws_smithy_http::endpoint; +pub use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; // Re-export types from aws-types pub use aws_types::{ app_name::{AppName, InvalidAppName}, + region::Region, SdkConfig, }; /// Load default sources for all configuration with override support @@ -137,24 +142,68 @@ pub mod web_identity_token; /// Create an environment loader for AWS Configuration /// +/// This loader will always set [`BehaviorMajorVersion::latest`]. +/// /// # Examples /// ```no_run /// # async fn create_config() { -/// use aws_types::region::Region; /// let config = aws_config::from_env().region("us-east-1").load().await; /// # } /// ``` +#[cfg(feature = "behavior-version-latest")] +pub fn from_env() -> ConfigLoader { + ConfigLoader::default().behavior_major_version(BehaviorMajorVersion::latest()) +} + +/// Load configuration from the environment +#[cfg(not(feature = "behavior-version-latest"))] +#[deprecated( + note = "To enable the default behavior version, enable the `behavior-version-latest` feature. Alternatively, you can use [`from_env_with_version`]. This function will be removed in the next release." +)] pub fn from_env() -> ConfigLoader { - ConfigLoader::default() + ConfigLoader::default().behavior_major_version(BehaviorMajorVersion::latest()) +} + +/// Load configuration from the environment +#[cfg(not(feature = "behavior-version-latest"))] +#[deprecated( + note = "To enable the default behavior version, enable the `behavior-version-latest` feature. Alternatively, you can use [`load_from_env_with_version`]. This function will be removed in the next release." +)] +pub async fn load_from_env() -> SdkConfig { + load_from_env_with_version(BehaviorMajorVersion::latest()).await +} + +/// Create an environment loader for AWS Configuration +/// +/// # Examples +/// ```no_run +/// # async fn create_config() { +/// use aws_config::BehaviorMajorVersion; +/// let config = aws_config::from_env_with_version(BehaviorMajorVersion::v2023_11_09()) +/// .region("us-east-1") +/// .load() +/// .await; +/// # } +/// ``` +pub fn from_env_with_version(version: BehaviorMajorVersion) -> ConfigLoader { + ConfigLoader::default().behavior_major_version(version) } /// Load a default configuration from the environment /// /// Convenience wrapper equivalent to `aws_config::from_env().load().await` -pub async fn load_from_env() -> aws_types::SdkConfig { +#[cfg(feature = "behavior-version-latest")] +pub async fn load_from_env() -> SdkConfig { from_env().load().await } +/// Load a default configuration from the environment +/// +/// Convenience wrapper equivalent to `aws_config::from_env_with_version(BehaviorMajorVersion::latest()).load().await` +pub async fn load_from_env_with_version(version: BehaviorMajorVersion) -> SdkConfig { + from_env_with_version(version).load().await +} + mod loader { use crate::default_provider::use_dual_stack::use_dual_stack_provider; use crate::default_provider::use_fips::use_fips_provider; @@ -165,6 +214,7 @@ mod loader { use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; + use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; use aws_smithy_runtime_api::shared::IntoShared; @@ -212,9 +262,19 @@ mod loader { time_source: Option, env: Option, fs: Option, + behavior_major_version: Option, } impl ConfigLoader { + /// Sets the [`BehaviorMajorVersion`] used to build [`SdkConfig`](aws_types::SdkConfig). + pub fn behavior_major_version( + mut self, + behavior_major_version: BehaviorMajorVersion, + ) -> Self { + self.behavior_major_version = Some(behavior_major_version); + self + } + /// Override the region used to build [`SdkConfig`](aws_types::SdkConfig). /// /// # Examples @@ -571,7 +631,7 @@ mod loader { /// .enable_http1() /// .build(); /// let provider_config = ProviderConfig::default().with_tcp_connector(custom_https_connector); - /// let shared_config = aws_config::from_env().configure(provider_config).load().await; + /// let shared_config = aws_config::from_env_with_version(BehaviorVersion::latest()).configure(provider_config).load().await; /// # } /// ``` #[deprecated( @@ -692,6 +752,7 @@ mod loader { .timeout_config(timeout_config) .time_source(time_source); + builder.set_behavior_major_version(self.behavior_major_version); builder.set_http_client(self.http_client); builder.set_app_name(app_name); builder.set_identity_cache(self.identity_cache); @@ -721,7 +782,8 @@ mod loader { mod test { use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; use crate::test_case::{no_traffic_client, InstantSleep}; - use crate::{from_env, ConfigLoader}; + use crate::BehaviorMajorVersion; + use crate::{from_env_with_version, ConfigLoader}; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_runtime::client::http::test_util::{infallible_client_fn, NeverClient}; @@ -742,7 +804,7 @@ mod loader { ]); let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk-ua-app-id = correct")]); - let loader = from_env() + let loader = from_env_with_version(BehaviorMajorVersion::latest()) .sleep_impl(TokioSleep::new()) .env(env) .fs(fs) @@ -786,7 +848,7 @@ mod loader { } fn base_conf() -> ConfigLoader { - from_env() + from_env_with_version(BehaviorMajorVersion::latest()) .sleep_impl(InstantSleep) .http_client(no_traffic_client()) } @@ -816,7 +878,10 @@ mod loader { #[cfg(feature = "rustls")] #[tokio::test] async fn disable_default_credentials() { - let config = from_env().no_credentials().load().await; + let config = from_env_with_version(BehaviorMajorVersion::latest()) + .no_credentials() + .load() + .await; assert!(config.identity_cache().is_none()); assert!(config.credentials_provider().is_none()); } @@ -829,7 +894,7 @@ mod loader { movable.fetch_add(1, Ordering::Relaxed); http::Response::new("ok!") }); - let config = from_env() + let config = from_env_with_version(BehaviorMajorVersion::latest()) .fs(Fs::from_slice(&[])) .env(Env::from_slice(&[])) .http_client(http_client.clone()) diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index 73999c6bf32..cc46bca9857 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -196,7 +196,8 @@ impl ProviderConfig { .region(self.region()) .time_source(self.time_source()) .use_fips(self.use_fips().unwrap_or_default()) - .use_dual_stack(self.use_dual_stack().unwrap_or_default()); + .use_dual_stack(self.use_dual_stack().unwrap_or_default()) + .behavior_major_version(crate::BehaviorMajorVersion::latest()); builder.set_http_client(self.http_client.clone()); builder.set_sleep_impl(self.sleep_impl.clone()); builder.build() diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs index b4546cd7696..7642cdd7dd3 100644 --- a/aws/rust-runtime/aws-config/src/sso/token.rs +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -319,7 +319,9 @@ impl Builder { /// This will panic if any of the required fields are not given. pub async fn build(mut self) -> SsoTokenProvider { if self.sdk_config.is_none() { - self.sdk_config = Some(crate::load_from_env().await); + self.sdk_config = Some( + crate::load_from_env_with_version(crate::BehaviorMajorVersion::latest()).await, + ); } self.build_with(Env::real(), Fs::real()) } @@ -427,6 +429,7 @@ mod tests { .sleep_impl(SharedAsyncSleep::new(sleep_impl)) // disable retry to simplify testing .retry_config(RetryConfig::disabled()) + .behavior_major_version(crate::BehaviorMajorVersion::latest()) .build(); Self { time_source, diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index e2449481113..dfaff54d4a6 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -221,7 +221,7 @@ impl AssumeRoleProviderBuilder { pub async fn build(self) -> AssumeRoleProvider { let mut conf = match self.sdk_config { Some(conf) => conf, - None => crate::load_from_env().await, + None => crate::load_from_env_with_version(crate::BehaviorMajorVersion::latest()).await, }; // ignore a identity cache set from SdkConfig conf = conf @@ -264,7 +264,7 @@ impl AssumeRoleProviderBuilder { ) -> AssumeRoleProvider { let conf = match self.sdk_config { Some(conf) => conf, - None => crate::load_from_env().await, + None => crate::load_from_env_with_version(crate::BehaviorMajorVersion::latest()).await, }; let conf = conf .into_builder() @@ -334,6 +334,7 @@ mod test { capture_request, ReplayEvent, StaticReplayClient, }; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; use aws_smithy_types::body::SdkBody; use aws_types::os_shim_internal::Env; use aws_types::region::Region; @@ -351,6 +352,7 @@ mod test { )) .http_client(http_client) .region(Region::from_static("this-will-be-overridden")) + .behavior_major_version(crate::BehaviorMajorVersion::latest()) .build(); let provider = AssumeRoleProvider::builder("myrole") .configure(&sdk_config) @@ -371,6 +373,7 @@ mod test { async fn loads_region_from_sdk_config() { let (http_client, request) = capture_request(None); let sdk_config = SdkConfig::builder() + .behavior_major_version(crate::BehaviorMajorVersion::latest()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), @@ -405,7 +408,7 @@ mod test { .body(SdkBody::from("")) .unwrap(), )); - let conf = crate::from_env() + let conf = crate::from_env_with_version(BehaviorMajorVersion::latest()) .env(Env::from_slice(&[ ("AWS_ACCESS_KEY_ID", "123-key"), ("AWS_SECRET_ACCESS_KEY", "456"), @@ -421,7 +424,7 @@ mod test { .configure(&conf) .build() .await; - let _ = provider.provide_credentials().await; + let _ = dbg!(provider.provide_credentials().await); let req = request.expect_request(); let auth_header = req.headers().get(AUTHORIZATION).unwrap().to_string(); let expect = "Credential=123-key/20090213/us-west-17/sts/aws4_request"; @@ -454,6 +457,7 @@ mod test { .sleep_impl(SharedAsyncSleep::new(sleep)) .time_source(testing_time_source.clone()) .http_client(http_client) + .behavior_major_version(crate::BehaviorMajorVersion::latest()) .build(); let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![ Credentials::new( diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index 6afb663dfd7..9fd24dc9d9c 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -9,6 +9,7 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::SharedIdentityCache", + "aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion", "aws_smithy_runtime_api::http::headers::Headers", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 4538a4bd311..1edcfffe293 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -17,6 +17,7 @@ pub use aws_credential_types::provider::SharedCredentialsProvider; use aws_smithy_async::rt::sleep::AsyncSleep; pub use aws_smithy_async::rt::sleep::SharedAsyncSleep; pub use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; use aws_smithy_runtime_api::client::http::HttpClient; pub use aws_smithy_runtime_api::client::http::SharedHttpClient; use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; @@ -62,6 +63,7 @@ pub struct SdkConfig { http_client: Option, use_fips: Option, use_dual_stack: Option, + behavior_major_version: Option, } /// Builder for AWS Shared Configuration @@ -83,6 +85,7 @@ pub struct Builder { http_client: Option, use_fips: Option, use_dual_stack: Option, + behavior_major_version: Option, } impl Builder { @@ -536,6 +539,21 @@ impl Builder { self } + /// Sets the [`BehaviorMajorVersion`] for the [`SdkConfig`] + pub fn behavior_major_version(mut self, behavior_major_version: BehaviorMajorVersion) -> Self { + self.set_behavior_major_version(Some(behavior_major_version)); + self + } + + /// Sets the [`BehaviorMajorVersion`] for the [`SdkConfig`] + pub fn set_behavior_major_version( + &mut self, + behavior_major_version: Option, + ) -> &mut Self { + self.behavior_major_version = behavior_major_version; + self + } + /// Build a [`SdkConfig`](SdkConfig) from this builder pub fn build(self) -> SdkConfig { SdkConfig { @@ -551,6 +569,7 @@ impl Builder { use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, time_source: self.time_source, + behavior_major_version: self.behavior_major_version, } } } @@ -617,6 +636,11 @@ impl SdkConfig { self.use_dual_stack } + /// Behavior major version configured for this client + pub fn behavior_major_version(&self) -> Option { + self.behavior_major_version.clone() + } + /// Config builder /// /// _Important:_ Using the `aws-config` crate to configure the SDK is preferred to invoking this @@ -646,6 +670,7 @@ impl SdkConfig { http_client: self.http_client, use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, + behavior_major_version: self.behavior_major_version, } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt index 047443d803b..90cf4d6e02c 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt @@ -148,7 +148,7 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon ```toml [dependencies] - aws-config = "$awsConfigVersion" + aws-config = { version = "$awsConfigVersion", features = ["behavior-version-latest"] } $moduleName = "${codegenContext.settings.moduleVersion}" tokio = { version = "1", features = ["full"] } ``` diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index caf995854f5..7291b29937f 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -117,6 +117,8 @@ private class AwsFluentClientExtensions(private val codegenContext: ClientCodege /// the `sleep_impl` on the Config passed into this function to fix it. /// - This method will panic if the `sdk_config` is missing an HTTP connector. If you experience this panic, set the /// `http_connector` on the Config passed into this function to fix it. + /// - This method will panic if no `BehaviorMajorVersion` is provided. If you experience this panic, set `behavior_major_version` on the Config or enable the `behavior-version-latest` Cargo feature. + ##[track_caller] pub fn new(sdk_config: &#{aws_types}::sdk_config::SdkConfig) -> Self { Self::from_conf(sdk_config.into()) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index 37a31fb615f..529ae27ae0b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -78,6 +78,7 @@ class GenericSmithySdkConfigSettings : ClientCodegenDecorator { ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client()); ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source()); + ${section.serviceConfigBuilder}.set_behavior_major_version(${section.sdkConfig}.behavior_major_version()); if let Some(cache) = ${section.sdkConfig}.identity_cache() { ${section.serviceConfigBuilder}.set_identity_cache(cache); diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt index 5b6a81f0690..63a4f820ba4 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt @@ -5,20 +5,14 @@ package software.amazon.smithy.rustsdk +import SdkCodegenIntegrationTest import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.testutil.tokioTest internal class CredentialProviderConfigTest { - @Test - fun `generates a valid config`() { - val codegenContext = awsTestCodegenContext() - validateConfigCustomizations(codegenContext, CredentialProviderConfig(codegenContext)) - } - @Test fun `configuring credentials provider at operation level should work`() { awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt index b071b89945e..62312b3ae01 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt @@ -5,22 +5,18 @@ package software.amazon.smithy.rustsdk +import SdkCodegenIntegrationTest import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.rustSettings +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class RegionProviderConfigTest { @Test fun `generates a valid config`() { - val project = TestWorkspace.testProject() - val codegenContext = awsTestCodegenContext( - settings = testClientRustSettings( - moduleName = project.rustSettings().moduleName, - runtimeConfig = AwsTestRuntimeConfig, - ), - ) - validateConfigCustomizations(codegenContext, RegionProviderConfig(codegenContext), project) + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { _ctx, crate -> + crate.unitTest { + rustTemplate("let conf: Option = None; let _reg: Option = conf.and_then(|c|c.region().cloned());") + } + } } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 4277650a84b..4ea54ceafc4 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -41,27 +41,29 @@ fun awsSdkIntegrationTest( ) = clientIntegrationTest( model, - IntegrationTestParams( - cargoCommand = "cargo test --features test-util", - runtimeConfig = AwsTestRuntimeConfig, - additionalSettings = ObjectNode.builder().withMember( - "customizationConfig", - ObjectNode.builder() - .withMember( - "awsSdk", - ObjectNode.builder() - .withMember("generateReadme", false) - .withMember("integrationTestPath", "../sdk/integration-tests") - .build(), - ).build(), - ) - .withMember( - "codegen", - ObjectNode.builder() - .withMember("includeFluentClient", false) - .withMember("includeEndpointUrlConfig", false) - .build(), - ).build(), - ), + awsIntegrationTestParams(), test = test, ) + +fun awsIntegrationTestParams() = IntegrationTestParams( + cargoCommand = "cargo test --features test-util behavior-version-latest", + runtimeConfig = AwsTestRuntimeConfig, + additionalSettings = ObjectNode.builder().withMember( + "customizationConfig", + ObjectNode.builder() + .withMember( + "awsSdk", + ObjectNode.builder() + .withMember("generateReadme", false) + .withMember("integrationTestPath", "../sdk/integration-tests") + .build(), + ).build(), + ) + .withMember( + "codegen", + ObjectNode.builder() + .withMember("includeFluentClient", false) + .withMember("includeEndpointUrlConfig", false) + .build(), + ).build(), +) diff --git a/aws/sdk/integration-tests/dynamodb/Cargo.toml b/aws/sdk/integration-tests/dynamodb/Cargo.toml index 1b6dcca0b65..3283676a42c 100644 --- a/aws/sdk/integration-tests/dynamodb/Cargo.toml +++ b/aws/sdk/integration-tests/dynamodb/Cargo.toml @@ -15,7 +15,7 @@ approx = "0.5.1" aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-dynamodb = { path = "../../build/aws-sdk/sdk/dynamodb" } +aws-sdk-dynamodb = { path = "../../build/aws-sdk/sdk/dynamodb", features = ["behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } diff --git a/aws/sdk/integration-tests/ec2/Cargo.toml b/aws/sdk/integration-tests/ec2/Cargo.toml index ff011454b16..7db6addb074 100644 --- a/aws/sdk/integration-tests/ec2/Cargo.toml +++ b/aws/sdk/integration-tests/ec2/Cargo.toml @@ -12,7 +12,7 @@ aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } -aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2" } +aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2", features = ["behavior-version-latest"] } tokio = { version = "1.23.1", features = ["full"]} http = "0.2.0" tokio-stream = "0.1.5" diff --git a/aws/sdk/integration-tests/glacier/Cargo.toml b/aws/sdk/integration-tests/glacier/Cargo.toml index a94977fc771..418cbb6bae8 100644 --- a/aws/sdk/integration-tests/glacier/Cargo.toml +++ b/aws/sdk/integration-tests/glacier/Cargo.toml @@ -13,7 +13,7 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} -aws-sdk-glacier = { path = "../../build/aws-sdk/sdk/glacier" } +aws-sdk-glacier = { path = "../../build/aws-sdk/sdk/glacier", features = ["behavior-version-latest"] } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test"} aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } bytes = "1.0.0" diff --git a/aws/sdk/integration-tests/iam/Cargo.toml b/aws/sdk/integration-tests/iam/Cargo.toml index 4c834ced572..45235fa71aa 100644 --- a/aws/sdk/integration-tests/iam/Cargo.toml +++ b/aws/sdk/integration-tests/iam/Cargo.toml @@ -13,7 +13,7 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} -aws-sdk-iam = { path = "../../build/aws-sdk/sdk/iam" } +aws-sdk-iam = { path = "../../build/aws-sdk/sdk/iam", features = ["behavior-version-latest"] } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } bytes = "1.0.0" diff --git a/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs b/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs index 6ef167ba0ae..70932827b8b 100644 --- a/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs +++ b/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs @@ -6,19 +6,17 @@ use aws_sdk_iam::config::{Credentials, Region}; use aws_smithy_runtime::client::http::test_util::capture_request; -// this test is ignored because pseudoregions have been removed. This test should be re-enabled -// once FIPS support is added in aws-config #[tokio::test] -#[ignore] async fn correct_endpoint_resolver() { let (http_client, request) = capture_request(None); let conf = aws_sdk_iam::Config::builder() - .region(Region::from_static("iam-fips")) .credentials_provider(Credentials::for_tests()) + .use_fips(true) + .region(Region::new("us-east-1")) .http_client(http_client) .build(); let client = aws_sdk_iam::Client::from_conf(conf); - let _ = client.list_roles().send().await; + let _ = dbg!(client.list_roles().send().await); let req = request.expect_request(); assert_eq!(&req.uri().to_string(), "https://iam-fips.amazonaws.com/"); } diff --git a/aws/sdk/integration-tests/kms/Cargo.toml b/aws/sdk/integration-tests/kms/Cargo.toml index 0ab843341de..d29e5b2158e 100644 --- a/aws/sdk/integration-tests/kms/Cargo.toml +++ b/aws/sdk/integration-tests/kms/Cargo.toml @@ -18,7 +18,7 @@ test-util = [] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime" } -aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms", features = ["test-util"] } +aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms", features = ["test-util", "behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } diff --git a/aws/sdk/integration-tests/lambda/Cargo.toml b/aws/sdk/integration-tests/lambda/Cargo.toml index 1562f98351c..7e53411d4c9 100644 --- a/aws/sdk/integration-tests/lambda/Cargo.toml +++ b/aws/sdk/integration-tests/lambda/Cargo.toml @@ -11,7 +11,7 @@ publish = false async-stream = "0.3.0" aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-lambda = { path = "../../build/aws-sdk/sdk/lambda" } +aws-sdk-lambda = { path = "../../build/aws-sdk/sdk/lambda", features = ["behavior-version-latest"] } aws-smithy-eventstream = { path = "../../build/aws-sdk/sdk/aws-smithy-eventstream" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } diff --git a/aws/sdk/integration-tests/no-default-features/Cargo.toml b/aws/sdk/integration-tests/no-default-features/Cargo.toml index 32c7fe2b5a4..9ed56d6c09a 100644 --- a/aws/sdk/integration-tests/no-default-features/Cargo.toml +++ b/aws/sdk/integration-tests/no-default-features/Cargo.toml @@ -22,3 +22,4 @@ aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", futures = "0.3.25" tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } +http = "0.2.9" diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index e1f80490554..91978925444 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -4,10 +4,14 @@ */ use aws_sdk_s3::config::IdentityCache; + use aws_sdk_s3::config::{ - retry::RetryConfig, timeout::TimeoutConfig, Config, Credentials, Region, SharedAsyncSleep, - Sleep, + retry::RetryConfig, timeout::TimeoutConfig, BehaviorMajorVersion, Config, Credentials, Region, + SharedAsyncSleep, Sleep, }; +use aws_sdk_s3::primitives::SdkBody; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; + use aws_sdk_s3::error::DisplayErrorContext; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_runtime::client::http::test_util::capture_request; @@ -22,7 +26,7 @@ use std::time::Duration; expected = "Enable the `rustls` crate feature or configure a HTTP client to fix this." )] async fn test_clients_from_sdk_config() { - aws_config::load_from_env().await; + aws_config::load_from_env_with_version(BehaviorMajorVersion::latest()).await; } // This will fail due to lack of a connector when constructing the service client @@ -42,6 +46,7 @@ async fn test_clients_from_service_config() { .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) .sleep_impl(SharedAsyncSleep::new(StubSleep)) + .behavior_major_version(BehaviorMajorVersion::latest()) .build(); // Creating the client shouldn't panic or error since presigning doesn't require a connector let client = aws_sdk_s3::Client::from_conf(config); @@ -58,6 +63,23 @@ async fn test_clients_from_service_config() { ); } +#[tokio::test] +#[should_panic(expected = "Invalid client configuration: A behavior major version must be set")] +async fn test_missing_behavior_major_version() { + use aws_sdk_s3::config::Region; + let http_client = + infallible_client_fn(|_req| http::Response::builder().body(SdkBody::empty()).unwrap()); + + let config = Config::builder() + .region(Region::new("us-east-1")) + .identity_cache(IdentityCache::no_cache()) + .credentials_provider(Credentials::for_tests()) + .http_client(http_client) + .build(); + // This line panics + let _client = aws_sdk_s3::Client::from_conf(config); +} + #[tokio::test] #[should_panic( expected = "Invalid client configuration: An async sleep implementation is required for retry to work." @@ -73,6 +95,7 @@ async fn test_missing_async_sleep_time_source_retries() { .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::standard()) .timeout_config(TimeoutConfig::disabled()) + .behavior_major_version(BehaviorMajorVersion::latest()) .build(); // should panic with a validation error @@ -93,6 +116,7 @@ async fn test_missing_async_sleep_time_source_timeouts() { .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::disabled()) + .behavior_major_version(BehaviorMajorVersion::latest()) .timeout_config( TimeoutConfig::builder() .operation_timeout(Duration::from_secs(5)) @@ -120,8 +144,60 @@ async fn test_time_source_for_identity_cache() { .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::disabled()) .timeout_config(TimeoutConfig::disabled()) + .behavior_major_version(BehaviorMajorVersion::latest()) .build(); // should panic with a validation error let _client = aws_sdk_s3::Client::from_conf(config); } + +#[tokio::test] +async fn behavior_mv_from_aws_config() { + let (http_client, req) = capture_request(None); + let cfg = aws_config::from_env_with_version(BehaviorMajorVersion::v2023_11_09()) + .http_client(http_client) + .retry_config(RetryConfig::disabled()) + .credentials_provider(Credentials::for_tests()) + .identity_cache(IdentityCache::no_cache()) + .timeout_config(TimeoutConfig::disabled()) + .region(Region::new("us-west-2")) + .load() + .await; + let s3_client = aws_sdk_s3::Client::new(&cfg); + let _err = s3_client + .list_buckets() + .send() + .await + .expect_err("it should fail to send a request because there is no HTTP client"); + assert_eq!( + req.expect_request().uri(), + "https://s3.us-west-2.amazonaws.com/" + ); +} + +#[tokio::test] +async fn behavior_mv_from_client_construction() { + let (http_client, req) = capture_request(None); + let cfg = aws_config::SdkConfig::builder() + .http_client(http_client) + .retry_config(RetryConfig::disabled()) + .identity_cache(IdentityCache::no_cache()) + .timeout_config(TimeoutConfig::disabled()) + .region(Region::new("us-west-2")) + .build(); + let s3_client = aws_sdk_s3::Client::from_conf( + aws_sdk_s3::config::Builder::from(&cfg) + .credentials_provider(Credentials::for_tests()) + .behavior_major_version(aws_sdk_s3::config::BehaviorMajorVersion::v2023_11_09()) + .build(), + ); + let _err = dbg!(s3_client + .list_buckets() + .send() + .await + .expect_err("it should fail to send a request because there is no HTTP client")); + assert_eq!( + req.expect_request().uri(), + "https://s3.us-west-2.amazonaws.com/" + ); +} diff --git a/aws/sdk/integration-tests/polly/Cargo.toml b/aws/sdk/integration-tests/polly/Cargo.toml index 880e023f201..9e7e83a51ce 100644 --- a/aws/sdk/integration-tests/polly/Cargo.toml +++ b/aws/sdk/integration-tests/polly/Cargo.toml @@ -13,7 +13,7 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} -aws-sdk-polly = { path = "../../build/aws-sdk/sdk/polly" } +aws-sdk-polly = { path = "../../build/aws-sdk/sdk/polly", features = ["behavior-version-latest"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/qldbsession/Cargo.toml b/aws/sdk/integration-tests/qldbsession/Cargo.toml index c46dfa0e921..06673d84338 100644 --- a/aws/sdk/integration-tests/qldbsession/Cargo.toml +++ b/aws/sdk/integration-tests/qldbsession/Cargo.toml @@ -17,7 +17,7 @@ test-util = [] [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-qldbsession = { path = "../../build/aws-sdk/sdk/qldbsession", features = ["test-util"] } +aws-sdk-qldbsession = { path = "../../build/aws-sdk/sdk/qldbsession", features = ["test-util", "behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 25d0be81e7d..19602531be8 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -16,12 +16,12 @@ test-util = [] [dev-dependencies] async-std = "1.12.0" -aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } +aws-config = { path = "../../build/aws-sdk/sdk/aws-config", features = ["behavior-version-latest"] } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime", features = ["test-util"] } -aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", features = ["test-util"] } -aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } +aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", features = ["test-util", "behavior-version-latest"] } +# aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } @@ -32,7 +32,7 @@ aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1" bytes-utils = "0.1.2" fastrand = "2.0.1" -futures-util = { version = "0.3.16" } +futures-util = { version = "0.3.16", default-features = false, features = ["alloc"] } hdrhistogram = "7.5.2" http = "0.2.3" http-body = "0.4.5" diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index 3e9eb79b06c..eccbe5af968 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -17,6 +17,7 @@ fn test_client(update_builder: fn(Builder) -> Builder) -> (CaptureRequestReceive .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-4")) .http_client(http_client) + .behavior_major_version(aws_sdk_s3::config::BehaviorMajorVersion::latest()) .with_test_defaults(); let client = Client::from_conf(update_builder(config).build()); (captured_request, client) diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index fdb4cfd762e..9cad807f122 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -17,7 +17,7 @@ test-util = [] [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control", features = ["test-util"] } +aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control", features = ["test-util", "behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } diff --git a/aws/sdk/integration-tests/sts/Cargo.toml b/aws/sdk/integration-tests/sts/Cargo.toml index eb478817f99..c629b2d3168 100644 --- a/aws/sdk/integration-tests/sts/Cargo.toml +++ b/aws/sdk/integration-tests/sts/Cargo.toml @@ -12,7 +12,7 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } +aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts", features = ["behavior-version-latest"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } diff --git a/aws/sdk/integration-tests/test.sh b/aws/sdk/integration-tests/test.sh index f22bf3f6e71..d26a34a1168 100755 --- a/aws/sdk/integration-tests/test.sh +++ b/aws/sdk/integration-tests/test.sh @@ -11,6 +11,6 @@ for f in *; do echo echo "Testing ${f}..." echo "###############" - cargo test --manifest-path "${f}/Cargo.toml" + cargo test --manifest-path "${f}/Cargo.toml" --all-features fi done diff --git a/aws/sdk/integration-tests/timestreamquery/Cargo.toml b/aws/sdk/integration-tests/timestreamquery/Cargo.toml index 535935320a3..ea94cf9bc92 100644 --- a/aws/sdk/integration-tests/timestreamquery/Cargo.toml +++ b/aws/sdk/integration-tests/timestreamquery/Cargo.toml @@ -12,7 +12,7 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-timestreamquery = { path = "../../build/aws-sdk/sdk/timestreamquery" } +aws-sdk-timestreamquery = { path = "../../build/aws-sdk/sdk/timestreamquery", features = ["behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } diff --git a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml index ba1596d88b3..54138bf894f 100644 --- a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml +++ b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml @@ -12,7 +12,7 @@ publish = false async-stream = "0.3.0" aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-transcribestreaming = { path = "../../build/aws-sdk/sdk/transcribestreaming" } +aws-sdk-transcribestreaming = { path = "../../build/aws-sdk/sdk/transcribestreaming", features = ["behavior-version-latest"] } aws-smithy-eventstream = { path = "../../build/aws-sdk/sdk/aws-smithy-eventstream" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } diff --git a/aws/sdk/integration-tests/webassembly/Cargo.toml b/aws/sdk/integration-tests/webassembly/Cargo.toml index 5d47bccd1d2..379f3d8e7d5 100644 --- a/aws/sdk/integration-tests/webassembly/Cargo.toml +++ b/aws/sdk/integration-tests/webassembly/Cargo.toml @@ -18,7 +18,7 @@ crate-type = ["cdylib"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false, features = ["rt-tokio"]} +aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false, features = ["rt-tokio", "behavior-version-latest"]} aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["hardcoded-credentials"] } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", default-features = false } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index 37c6b863b3c..1131c201d3a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -36,6 +36,7 @@ internal class EndpointConfigCustomization( "SharedEndpointResolver" to epModule.resolve("SharedEndpointResolver"), "StaticUriEndpointResolver" to epRuntimeModule.resolve("StaticUriEndpointResolver"), "ServiceSpecificResolver" to codegenContext.serviceSpecificEndpointResolver(), + "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), ) override fun section(section: ServiceConfig): Writable { @@ -89,7 +90,7 @@ internal class EndpointConfigCustomization( ##[allow(deprecated)] self.set_endpoint_resolver( endpoint_url.map(|url| { - #{StaticUriEndpointResolver}::uri(url).into_shared() + #{IntoShared}::into_shared(#{StaticUriEndpointResolver}::uri(url)) }) ); self diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 2c48584d48a..ada9cc44a80 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -20,6 +20,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor +import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords import software.amazon.smithy.rust.codegen.core.rustlang.RustType @@ -31,6 +32,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.docLink import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape import software.amazon.smithy.rust.codegen.core.rustlang.escape +import software.amazon.smithy.rust.codegen.core.rustlang.featureGatedBlock import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.normalizeHtml import software.amazon.smithy.rust.codegen.core.rustlang.qualifiedName @@ -57,10 +59,12 @@ import software.amazon.smithy.rust.codegen.core.util.outputShape import software.amazon.smithy.rust.codegen.core.util.sdkId import software.amazon.smithy.rust.codegen.core.util.toSnakeCase +private val BehaviorVersionLatest = Feature("behavior-version-latest", false, listOf()) class FluentClientGenerator( private val codegenContext: ClientCodegenContext, private val customizations: List = emptyList(), ) { + companion object { fun clientOperationFnName(operationShape: OperationShape, symbolProvider: RustSymbolProvider): String = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operationShape).name.toSnakeCase()) @@ -94,6 +98,7 @@ class FluentClientGenerator( } private fun renderFluentClient(crate: RustCrate) { + crate.mergeFeature(BehaviorVersionLatest) crate.withModule(ClientRustModule.client) { rustTemplate( """ @@ -119,8 +124,10 @@ class FluentClientGenerator( /// /// - Retries or timeouts are enabled without a `sleep_impl` configured. /// - Identity caching is enabled without a `sleep_impl` and `time_source` configured. + /// - No `behavior_major_version` is provided. /// /// The panic message for each of these will have instructions on how to resolve them. + ##[track_caller] pub fn from_conf(conf: crate::Config) -> Self { let handle = Handle { conf: conf.clone(), @@ -451,6 +458,9 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru RuntimeType.forInlineFun("base_client_runtime_plugins", ClientRustModule.config) { val api = RuntimeType.smithyRuntimeApiClient(rc) val rt = RuntimeType.smithyRuntime(rc) + val behaviorVersionError = "Invalid client configuration: A behavior major version must be set when sending a " + + "request or constructing a client. You must set it during client construction or by enabling the " + + "`${BehaviorVersionLatest.name}` cargo feature." rustTemplate( """ pub(crate) fn base_client_runtime_plugins( @@ -458,12 +468,16 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru ) -> #{RuntimePlugins} { let mut configured_plugins = #{Vec}::new(); ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); + ##[allow(unused_mut)] + let mut behavior_major_version = config.behavior_major_version.clone(); + #{update_bmv} let mut plugins = #{RuntimePlugins}::new() // defaults .with_client_plugins(#{default_plugins}( #{DefaultPluginParams}::new() .with_retry_partition_name(${codegenContext.serviceShape.sdkId().dq()}) + .with_behavior_major_version(behavior_major_version.expect(${behaviorVersionError.dq()})) )) // user config .with_client_plugin( @@ -474,6 +488,7 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru // codegen config .with_client_plugin(crate::config::ServiceRuntimePlugin::new(config)) .with_client_plugin(#{NoAuthRuntimePlugin}::new()); + for plugin in configured_plugins { plugins = plugins.with_client_plugin(plugin); } @@ -486,6 +501,17 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru "NoAuthRuntimePlugin" to rt.resolve("client::auth::no_auth::NoAuthRuntimePlugin"), "RuntimePlugins" to RuntimeType.runtimePlugins(rc), "StaticRuntimePlugin" to api.resolve("client::runtime_plugin::StaticRuntimePlugin"), + "update_bmv" to featureGatedBlock(BehaviorVersionLatest) { + rustTemplate( + """ + if behavior_major_version.is_none() { + behavior_major_version = Some(#{BehaviorMajorVersion}::latest()); + } + + """, + "BehaviorMajorVersion" to api.resolve("client::behavior_version::BehaviorMajorVersion"), + ) + }, ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index d1446a3b32b..fdd57966895 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -189,37 +189,38 @@ fun loadFromConfigBag(innerTypeName: String, newtype: RuntimeType): Writable = w * 2. convenience setter (non-optional) * 3. standard setter (&mut self) */ -fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext): ConfigCustomization = object : ConfigCustomization() { - override fun section(section: ServiceConfig): Writable { - return when (section) { - ServiceConfig.BuilderImpl -> writable { - docsOrFallback(param.setterDocs) - rust( - """ - pub fn ${param.name}(mut self, ${param.name}: impl Into<#T>) -> Self { - self.set_${param.name}(Some(${param.name}.into())); - self +fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext): ConfigCustomization = + object : ConfigCustomization() { + override fun section(section: ServiceConfig): Writable { + return when (section) { + ServiceConfig.BuilderImpl -> writable { + docsOrFallback(param.setterDocs) + rust( + """ + pub fn ${param.name}(mut self, ${param.name}: impl Into<#T>) -> Self { + self.set_${param.name}(Some(${param.name}.into())); + self }""", - param.type, - ) + param.type, + ) - docsOrFallback(param.setterDocs) - rustTemplate( - """ - pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { - self.config.store_or_unset(${param.name}.map(#{newtype})); - self - } - """, - "T" to param.type, - "newtype" to param.newtype!!, - ) - } + docsOrFallback(param.setterDocs) + rustTemplate( + """ + pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { + self.config.store_or_unset(${param.name}.map(#{newtype})); + self + } + """, + "T" to param.type, + "newtype" to param.newtype!!, + ) + } - else -> emptySection + else -> emptySection + } } } -} fun ServiceShape.needsIdempotencyToken(model: Model): Boolean { val operationIndex = OperationIndex.of(model) @@ -279,8 +280,69 @@ class ServiceConfigGenerator( "RuntimePlugin" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)), "SharedRuntimePlugin" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)), "runtime_plugin" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin"), + "BehaviorMajorVersion" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::behavior_version::BehaviorMajorVersion"), + ), ) + private fun behaviorMv() = writable { + val docs = """ + /// Sets the [`behavior major version`](crate::config::BehaviorMajorVersion). + /// + /// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards + /// compatible. For example, a change which introduces new default timeouts or a new retry-mode for + /// all operations might be the ideal behavior but could break existing applications. + /// + /// ## Examples + /// + /// Set the behavior major version to `latest`. This is equivalent to enabling the `behavior-version-latest` cargo feature. + /// ```no_run + /// use $moduleUseName::config::BehaviorMajorVersion; + /// + /// let config = $moduleUseName::Config::builder() + /// .behavior_major_version(BehaviorMajorVersion::latest()) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + /// + /// Customizing behavior major version: + /// ```no_run + /// use $moduleUseName::config::BehaviorMajorVersion; + /// + /// let config = $moduleUseName::Config::builder() + /// .behavior_major_version(BehaviorMajorVersion::v2023_11_09()) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + """ + rustTemplate( + """ + $docs + pub fn behavior_major_version(mut self, behavior_major_version: crate::config::BehaviorMajorVersion) -> Self { + self.set_behavior_major_version(Some(behavior_major_version)); + self + } + + $docs + pub fn set_behavior_major_version(&mut self, behavior_major_version: Option) -> &mut Self { + self.behavior_major_version = behavior_major_version; + self + } + + /// Convenience method to set the latest behavior major version + /// + /// This is equivalent to enabling the `behavior-version-latest` Cargo feature + pub fn behavior_major_version_latest(mut self) -> Self { + self.set_behavior_major_version(Some(crate::config::BehaviorMajorVersion::latest())); + self + } + """, + *codegenScope, + ) + } + fun render(writer: RustWriter) { writer.docs("Configuration for a $moduleUseName service client.\n") customizations.forEach { @@ -297,6 +359,7 @@ class ServiceConfigGenerator( cloneable: #{CloneableLayer}, pub(crate) runtime_components: #{RuntimeComponentsBuilder}, pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + behavior_major_version: #{Option}<#{BehaviorMajorVersion}>, """, *codegenScope, ) @@ -320,6 +383,7 @@ class ServiceConfigGenerator( config: self.cloneable.clone(), runtime_components: self.runtime_components.clone(), runtime_plugins: self.runtime_plugins.clone(), + behavior_major_version: self.behavior_major_version.clone(), } } """, @@ -337,6 +401,7 @@ class ServiceConfigGenerator( pub(crate) config: #{CloneableLayer}, pub(crate) runtime_components: #{RuntimeComponentsBuilder}, pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + pub(crate) behavior_major_version: #{Option}<#{BehaviorMajorVersion}>, """, *codegenScope, ) @@ -354,6 +419,7 @@ class ServiceConfigGenerator( config: #{Default}::default(), runtime_components: #{RuntimeComponentsBuilder}::new("service config"), runtime_plugins: #{Default}::default(), + behavior_major_version: #{Default}::default(), } } """, @@ -367,11 +433,18 @@ class ServiceConfigGenerator( customizations.forEach { it.section(ServiceConfig.BuilderImpl)(this) } + behaviorMv()(this) - val visibility = if (enableUserConfigurableRuntimePlugins) { "pub" } else { "pub(crate)" } + val visibility = if (enableUserConfigurableRuntimePlugins) { + "pub" + } else { + "pub(crate)" + } docs("Adds a runtime plugin to the config.") - if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } + if (!enableUserConfigurableRuntimePlugins) { + Attribute.AllowUnused.render(this) + } rustTemplate( """ $visibility fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { @@ -382,7 +455,9 @@ class ServiceConfigGenerator( *codegenScope, ) docs("Adds a runtime plugin to the config.") - if (!enableUserConfigurableRuntimePlugins) { Attribute.AllowUnused.render(this) } + if (!enableUserConfigurableRuntimePlugins) { + Attribute.AllowUnused.render(this) + } rustTemplate( """ $visibility fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { @@ -433,6 +508,7 @@ class ServiceConfigGenerator( cloneable: layer, runtime_components: self.runtime_components, runtime_plugins: self.runtime_plugins, + behavior_major_version: self.behavior_major_version, """, *codegenScope, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt index 138f43cd264..5d6de735b99 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt @@ -18,7 +18,7 @@ import java.nio.file.Path fun clientIntegrationTest( model: Model, - params: IntegrationTestParams = IntegrationTestParams(), + params: IntegrationTestParams = IntegrationTestParams(cargoCommand = "cargo test --features behavior-version-latest"), additionalDecorators: List = listOf(), test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> }, ): Path { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt deleted file mode 100644 index 0c889318f99..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.testutil - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfigGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.configParamNewtype -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.TestWriterDelegator -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import software.amazon.smithy.rust.codegen.core.util.toPascalCase - -/** - * Test helper to produce a valid config customization to test that a [ConfigCustomization] can be used in conjunction - * with other [ConfigCustomization]s. - */ -fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): ConfigCustomization { - return object : ConfigCustomization() { - override fun section(section: ServiceConfig): Writable = writable { - when (section) { - ServiceConfig.ConfigImpl -> { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn $name(&self) -> u64 { - self.config.load::<#{T}>().map(|u| u.0).unwrap() - } - """, - "T" to configParamNewtype( - "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } - ServiceConfig.BuilderImpl -> { - rustTemplate( - """ - /// docs! - pub fn $name(mut self, $name: u64) -> Self { - self.config.store_put(#{T}($name)); - self - } - """, - "T" to configParamNewtype( - "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } - else -> emptySection - } - } - } -} - -/** Basic validation of [ConfigCustomization]s - * - * This test is not comprehensive, but it ensures that your customization generates Rust code that compiles and correctly - * composes with other customizations. - * */ -@Suppress("NAME_SHADOWING") -fun validateConfigCustomizations( - codegenContext: ClientCodegenContext, - customization: ConfigCustomization, - project: TestWriterDelegator? = null, -): TestWriterDelegator { - val project = project ?: TestWorkspace.testProject() - stubConfigProject(codegenContext, customization, project) - project.compileAndTest() - return project -} - -fun stubConfigProject(codegenContext: ClientCodegenContext, customization: ConfigCustomization, project: TestWriterDelegator): TestWriterDelegator { - val customizations = listOf(stubConfigCustomization("a", codegenContext)) + customization + stubConfigCustomization("b", codegenContext) - val generator = ServiceConfigGenerator(codegenContext, customizations = customizations.toList()) - project.withModule(ClientRustModule.config) { - generator.render(this) - unitTest( - "config_send_sync", - """ - fn assert_send_sync() {} - assert_send_sync::(); - """, - ) - } - project.lib { rust("pub use config::Config;") } - return project -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt index 72cffe2d131..a65d734085d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt @@ -99,3 +99,5 @@ fun TestWriterDelegator.clientRustSettings() = moduleName = "test_${baseDir.toFile().nameWithoutExtension}", codegenConfig = codegenConfig as ClientCodegenConfig, ) + +fun TestWriterDelegator.clientCodegenContext(model: Model) = testClientCodegenContext(model, settings = clientRustSettings()) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt index 81998723823..cac24f5b962 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -11,29 +11,15 @@ import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels import software.amazon.smithy.rust.codegen.core.testutil.testModule import software.amazon.smithy.rust.codegen.core.testutil.tokioTest class MetadataCustomizationTest { - private val model = """ - namespace com.example - use aws.protocols#awsJson1_0 - @awsJson1_0 - service HelloService { - operations: [SayHello], - version: "1" - } - @optionalAuth - operation SayHello { input: TestInput } - structure TestInput { - foo: String, - } - """.asSmithyModel() @Test fun `extract metadata via customizable operation`() { - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> + clientIntegrationTest(BasicTestModels.AwsJson10TestModel) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt index 4a7a8607e13..30d046ff635 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt @@ -6,49 +6,25 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenConfig -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginGenerator -import software.amazon.smithy.rust.codegen.client.testutil.clientRustSettings -import software.amazon.smithy.rust.codegen.client.testutil.stubConfigProject -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer -import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels +import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class ResiliencyConfigCustomizationTest { - private val baseModel = """ - namespace test - use aws.protocols#awsQuery - - structure SomeOutput { - @xmlAttribute - someAttribute: Long, - - someVal: String - } - - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() @Test fun `generates a valid config`() { - val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val project = TestWorkspace.testProject(model, ClientCodegenConfig()) - val codegenContext = testClientCodegenContext(model, settings = project.clientRustSettings()) - - stubConfigProject(codegenContext, ResiliencyConfigCustomization(codegenContext), project) - project.withModule(ClientRustModule.config) { - ServiceRuntimePluginGenerator(codegenContext).render( - this, - emptyList(), - ) + clientIntegrationTest(BasicTestModels.AwsJson10TestModel) { _, crate -> + crate.unitTest("resiliency_fields") { + rustTemplate( + """ + let mut conf = crate::Config::builder(); + conf.set_sleep_impl(None); + conf.set_retry_config(None); + """, + ) + } } - ResiliencyReExportCustomization(codegenContext).extras(project) - project.compileAndTest() } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt index 92c4179607f..15b6f0e5953 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt @@ -6,11 +6,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.unitTest @@ -18,6 +15,7 @@ class ClientContextConfigCustomizationTest { val model = """ namespace test use smithy.rules#clientContextParams + use aws.protocols#awsJson1_0 @clientContextParams(aStringParam: { documentation: "string docs", @@ -27,58 +25,54 @@ class ClientContextConfigCustomizationTest { documentation: "bool docs", type: "boolean" }) + @awsJson1_0 service TestService { operations: [] } """.asSmithyModel() @Test fun `client params generate a valid customization`() { - val project = TestWorkspace.testProject() - val context = testClientCodegenContext(model) - project.unitTest { - rustTemplate( - """ - use #{RuntimePlugin}; - let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); - assert_eq!( - conf.config - .load::() - .map(|u| u.0.clone()) - .unwrap(), - "hello!" - ); - assert_eq!( - conf.config - .load::() - .map(|u| u.0), - Some(true) - ); - """, - "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), - ) - } - // unset fields - project.unitTest { - rustTemplate( - """ - use #{RuntimePlugin}; - let conf = crate::Config::builder().a_string_param("hello!").build(); - assert_eq!( - conf.config - .load::() - .map(|u| u.0.clone()) - .unwrap(), - "hello!" - ); - assert_eq!( - conf.config - .load::() - .map(|u| u.0), - None, - ); - """, - "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), - ) + clientIntegrationTest(model) { _, crate -> + crate.unitTest { + rustTemplate( + """ + let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); + assert_eq!( + conf.config + .load::() + .map(|u| u.0.clone()) + .unwrap(), + "hello!" + ); + assert_eq!( + conf.config + .load::() + .map(|u| u.0), + Some(true) + ); + """, + ) + } + + crate.unitTest("unset_fields") { + rustTemplate( + """ + let conf = crate::Config::builder().a_string_param("hello!").build(); + assert_eq!( + conf.config + .load::() + .map(|u| u.0.clone()) + .unwrap(), + "hello!" + ); + assert_eq!( + conf.config + .load::() + .map(|u| u.0), + None, + ); + """, + ) + } } - validateConfigCustomizations(context, ClientContextConfigCustomization(context), project) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 3ba4256577c..d048e3a735b 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -128,7 +128,7 @@ class EndpointsDecoratorTest { val testDir = clientIntegrationTest( model, // Just run integration tests. - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), + IntegrationTestParams(command = { "cargo test --all-features --test *".runWithWarnings(it) }), ) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("endpoint_params_test") { val moduleName = clientCodegenContext.moduleUseName() diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt index 3cdc523d9cc..69691b476e5 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt @@ -106,7 +106,7 @@ class ErrorCorrectionTest { assert_eq!(shape.not_required(), None); // set defaults for everything else - assert_eq!(shape.blob().as_ref(), &[]); + assert_eq!(shape.blob().as_ref(), b""); assert!(shape.list_value().is_empty()); assert!(shape.map_value().is_empty()); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt deleted file mode 100644 index 920c0c21e96..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.config - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel - -class IdempotencyTokenProviderCustomizationTest { - @Test - fun `generates a valid config`() { - val model = "namespace test".asSmithyModel() - val codegenContext = testClientCodegenContext(model) - validateConfigCustomizations( - codegenContext, - IdempotencyTokenProviderCustomization(codegenContext), - ) - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index c92c44db7c5..7cdd0f7b890 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -10,16 +10,15 @@ import org.junit.jupiter.api.Test import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.withEnableUserConfigurableRuntimePlugins +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace +import software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.lookup import software.amazon.smithy.rust.codegen.core.util.toPascalCase @@ -125,45 +124,50 @@ internal class ServiceConfigGeneratorTest { } } - val model = "namespace empty".asSmithyModel() - val codegenContext = testClientCodegenContext(model) - .withEnableUserConfigurableRuntimePlugins(true) - val sut = ServiceConfigGenerator(codegenContext, listOf(ServiceCustomizer(codegenContext))) - val symbolProvider = codegenContext.symbolProvider - val project = TestWorkspace.testProject(symbolProvider) - project.withModule(ClientRustModule.config) { - sut.render(this) - unitTest( - "set_config_fields", - """ - let builder = Config::builder().config_field(99); - let config = builder.build(); - assert_eq!(config.config_field(), 99); - """, - ) - - unitTest( - "set_runtime_plugin", - """ - use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; - use aws_smithy_types::config_bag::FrozenLayer; - - #[derive(Debug)] - struct TestRuntimePlugin; - - impl RuntimePlugin for TestRuntimePlugin { - fn config(&self) -> Option { - todo!("ExampleRuntimePlugin.config") + val serviceDecorator = object : ClientCodegenDecorator { + override val name: String = "Add service plugin" + override val order: Byte = 0 + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations + ServiceCustomizer(codegenContext) + } + } + + clientIntegrationTest(BasicTestModels.AwsJson10TestModel, additionalDecorators = listOf(serviceDecorator)) { ctx, rustCrate -> + rustCrate.withModule(ClientRustModule.config) { + unitTest( + "set_config_fields", + """ + let builder = Config::builder().config_field(99); + let config = builder.build(); + assert_eq!(config.config_field(), 99); + """, + ) + + unitTest( + "set_runtime_plugin", + """ + use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; + use aws_smithy_types::config_bag::FrozenLayer; + + #[derive(Debug)] + struct TestRuntimePlugin; + + impl RuntimePlugin for TestRuntimePlugin { + fn config(&self) -> Option { + todo!("ExampleRuntimePlugin.config") + } } - } - let config = Config::builder() - .runtime_plugin(TestRuntimePlugin) - .build(); - assert_eq!(config.runtime_plugins.len(), 1); - """, - ) + let config = Config::builder() + .runtime_plugin(TestRuntimePlugin) + .build(); + assert_eq!(config.runtime_plugins.len(), 1); + """, + ) + } } - project.compileAndTest() } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt index 8965e3eb9d0..e8bf22ff7c7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt @@ -449,8 +449,23 @@ fun RustWriter.implBlock(symbol: Symbol, block: Writable) { /** Write a `#[cfg(feature = "...")]` block for the given feature */ fun RustWriter.featureGateBlock(feature: String, block: Writable) { - rustBlock("##[cfg(feature = ${feature.dq()})]") { - block() + featureGatedBlock(feature, block)(this) +} + +/** Write a `#[cfg(feature = "...")]` block for the given feature */ +fun featureGatedBlock(feature: String, block: Writable): Writable { + return writable { + rustBlock("##[cfg(feature = ${feature.dq()})]") { + block() + } + } +} + +fun featureGatedBlock(feature: Feature, block: Writable): Writable { + return writable { + rustBlock("##[cfg(feature = ${feature.name.dq()})]") { + block() + } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt new file mode 100644 index 00000000000..eb4829702ee --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt @@ -0,0 +1,23 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.testutil + +object BasicTestModels { + val AwsJson10TestModel = """ + namespace com.example + use aws.protocols#awsJson1_0 + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + @optionalAuth + operation SayHello { input: TestInput } + structure TestInput { + foo: String, + } + """.asSmithyModel() +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index c641f895733..cbd29d33d46 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -21,6 +21,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords import software.amazon.smithy.rust.codegen.core.rustlang.Visibility +import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext @@ -138,7 +139,11 @@ fun testRustSettings( ) private const val SmithyVersion = "1.0" -fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = SmithyVersion, disableValidation: Boolean = false): Model { +fun String.asSmithyModel( + sourceLocation: String? = null, + smithyVersion: String = SmithyVersion, + disableValidation: Boolean = false, +): Model { val processed = letIf(!this.trimStart().startsWith("\$version")) { "\$version: ${smithyVersion.dq()}\n$it" } val assembler = Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed) if (disableValidation) { @@ -208,3 +213,10 @@ fun StructureShape.renderWithModelBuilder( BuilderGenerator(model, symbolProvider, struct, emptyList()).render(this) } } + +fun RustCrate.unitTest(name: String? = null, test: Writable) { + lib { + val testName = name ?: safeName("test") + unitTest(testName, block = test) + } +} diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index 0fe352ca1f6..039a43fa92e 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -66,6 +66,7 @@ - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md) - [RFC-0038: User-configurable retry classification](./rfcs/rfc0038_retry_classifier_customization.md) - [RFC-0039: Forward Compatible Errors](./rfcs/rfc0039_forward_compatible_errors.md) + - [RFC-0040: Behavior Major Versions](./rfcs/rfc0040_behavior_major_versions.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/rfcs/rfc0040_behavior_major_versions.md b/design/src/rfcs/rfc0040_behavior_major_versions.md new file mode 100644 index 00000000000..2da4e7fa4a5 --- /dev/null +++ b/design/src/rfcs/rfc0040_behavior_major_versions.md @@ -0,0 +1,86 @@ + +RFC: Behavior Major Versions +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC describes "Behavior Major Versions," a mechanism to allow SDKs to ship breaking behavioral changes like a new retry strategy, while allowing customers who rely on extremely consistent behavior to evolve at their own pace. + +By adding behavior major versions (BMV) to the Rust SDK, we will make it possible to ship new secure/recommended defaults to new customers without impacting legacy customers. + +The fundamental issue stems around our inability to communicate and decouple releases of service updates and behavior within a single major version. + +Both legacy and new SDKs have the need to alter their SDKs default. Historically, this caused new customers on legacy SDKs to be subject to legacy defaults, even when a better alternative existed. + +For new SDKs, a GA cutline presents difficult choices around timeline and features that can’t be added later without altering behavior. + +Both of these use cases are addressed by Behavior Major Versions. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, users can construct clients without indicating any sort of behavior major version. +Once this RFC is implemented, there will be two ways to set a behavior major version: + +1. In code via `aws_config::from_env_with_version(BehaviorMajorVersion::latest())` and `::Config::builder().behavior_major_version(...)`. This will also work for `config_override`. +2. By enabling `behavior-version-latest` in either `aws-config` (which brings back `from_env`) OR a specific generated SDK crate + +```toml +# Cargo.toml +[dependencies] +aws-config = { version = "1", features = ["behavior-version-latest"] } +# OR +aws-sdk-s3 = { version = "1", features = ["behavior-version-latest"] } +``` + +If no `BehaviorMajorVersion` is set, the client will panic during construction. + +`BehaviorMajorVersion` is an opaque struct with initializers like `::latest()`, `::v2023_11_09()`. Downstream code can check the version by calling methods like `::supports_v1()` + +When new BMV are added, the previous version constructor will be marked as `deprecated`. This serves as a mechanism to alert customers that a new BMV exists to allow them to upgrade. + +How to actually implement this RFC +---------------------------------- + +In order to implement this feature, we need to create a `BehaviorMajorVersion` struct, add config options to `SdkConfig` and `aws-config`, and wire it throughout the stack. +```rust +/// Behavior major-version of the client +/// +/// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards +/// compatible. For example, a change which introduces new default timeouts or a new retry-mode for +/// all operations might be the ideal behavior but could break existing applications. +#[derive(Debug, Clone)] +pub struct BehaviorMajorVersion { + // currently there is only 1 MV so we don't actually need anything in here. +} +``` + +To help customers migrate, we are including `from_env` hooks that set `behavior-version-latest` that are _deprecated_. This allows customers to see that they are missing the required cargo feature and add it to remove the deprecation warning. + +Internally, `BehaviorMajorVersion` will become an additional field on `::Config`. It is _not_ ever stored in the `ConfigBag` or in `RuntimePlugins`. + +When constructing the set of "default runtime plugins," the default runtime plugin parameters will be passed the `BehaviorMajorVersion`. This will select the correct runtime plugin. Logging will clearly indicate which plugin was selected. + +Design Alternatives Considered +------------------------------ + +An original design was also considered that made BMV optional and relied on documentation to steer customers in the right direction. This was +deemed too weak of a mechanism to ensure that customers aren't broken by unexpected changes. + +Changes checklist +----------------- + +- [x] Create `BehaviorMajorVersion` and the BMV runtime plugin +- [x] Add BMV as a required runtime component +- [x] Wire up setters throughout the stack +- [x] Add tests of BMV (set via aws-config, cargo features & code params) +- [x] ~Remove `aws_config::from_env` deprecation stand-ins~ We decided to persist these deprecations +- [x] Update generated usage examples diff --git a/examples/pokemon-service-client-usage/Cargo.toml b/examples/pokemon-service-client-usage/Cargo.toml index 77059a39f99..dc1acaeaf42 100644 --- a/examples/pokemon-service-client-usage/Cargo.toml +++ b/examples/pokemon-service-client-usage/Cargo.toml @@ -13,7 +13,7 @@ publish = false # eliminating the need to directly depend on the crates that provide them. In rare instances, # you may still need to include one of these crates as a dependency. Examples that require this # are specifically noted in comments above the corresponding dependency in this file. -pokemon-service-client = { path = "../pokemon-service-client/" } +pokemon-service-client = { path = "../pokemon-service-client/", features = ["behavior-version-latest"] } # Required for getting the operation name from the `Metadata`. aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } diff --git a/examples/python/pokemon-service-test/Cargo.toml b/examples/python/pokemon-service-test/Cargo.toml index a7960c24e48..74d87864ba5 100644 --- a/examples/python/pokemon-service-test/Cargo.toml +++ b/examples/python/pokemon-service-test/Cargo.toml @@ -20,4 +20,4 @@ hyper-rustls = { version = "0.24", features = ["http2"] } aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime/", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http/" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types/" } -pokemon-service-client = { path = "../pokemon-service-client/" } +pokemon-service-client = { path = "../pokemon-service-client/", features = ["behavior-version-latest"] } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index bb4c4d1957a..ce011bd98a0 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -116,4 +116,5 @@ pub mod runtime_components; pub mod runtime_plugin; +pub mod behavior_version; pub mod ser_de; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs new file mode 100644 index 00000000000..f8432d31ddf --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs @@ -0,0 +1,42 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Behavior Major version of the client + +/// Behavior major-version of the client +/// +/// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards +/// compatible. For example, a change which introduces new default timeouts or a new retry-mode for +/// all operations might be the ideal behavior but could break existing applications. +#[derive(Debug, Clone)] +pub struct BehaviorMajorVersion {} + +impl BehaviorMajorVersion { + /// This method will always return the latest major version. + /// + /// This is the recommend choice for customers who aren't reliant on extremely specific behavior + /// characteristics. For example, if you are writing a CLI app, the latest behavior major version + /// is probably the best setting for you. + /// + /// If, however, you're writing a service that is very latency sensitive, or that has written + /// code to tune Rust SDK behaviors, consider pinning to a specific major version. + /// + /// The latest version is currently [`BehaviorMajorVersion::v2023_11_09`] + pub fn latest() -> Self { + Self {} + } + + /// This method returns the behavior configuration for November 9th, 2023 + /// + /// When a new behavior major version is released, this method will be deprecated. + pub fn v2023_11_09() -> Self { + Self {} + } + + /// Returns whether the current version is `v2023_11_09` + pub fn supports_v2023_11_09(&self) -> bool { + true + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 2a994d7e5a8..0b0c58c321f 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -474,7 +474,7 @@ impl RuntimeComponentsBuilder { auth_scheme_option_resolver: Option, ) -> &mut Self { self.auth_scheme_option_resolver = - auth_scheme_option_resolver.map(|r| Tracked::new(self.builder_name, r.into_shared())); + self.tracked(auth_scheme_option_resolver.map(IntoShared::into_shared)); self } @@ -494,7 +494,7 @@ impl RuntimeComponentsBuilder { /// Sets the HTTP client. pub fn set_http_client(&mut self, connector: Option) -> &mut Self { - self.http_client = connector.map(|c| Tracked::new(self.builder_name, c.into_shared())); + self.http_client = self.tracked(connector.map(IntoShared::into_shared)); self } @@ -717,13 +717,13 @@ impl RuntimeComponentsBuilder { /// Sets the async sleep implementation. pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { - self.sleep_impl = sleep_impl.map(|s| Tracked::new(self.builder_name, s)); + self.sleep_impl = self.tracked(sleep_impl); self } /// Sets the async sleep implementation. pub fn with_sleep_impl(mut self, sleep_impl: Option) -> Self { - self.sleep_impl = sleep_impl.map(|s| Tracked::new(self.builder_name, s.into_shared())); + self.set_sleep_impl(sleep_impl.map(IntoShared::into_shared)); self } @@ -734,13 +734,13 @@ impl RuntimeComponentsBuilder { /// Sets the time source. pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { - self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s)); + self.time_source = self.tracked(time_source); self } /// Sets the time source. pub fn with_time_source(mut self, time_source: Option) -> Self { - self.time_source = time_source.map(|s| Tracked::new(self.builder_name, s.into_shared())); + self.set_time_source(time_source.map(IntoShared::into_shared)); self } @@ -805,6 +805,11 @@ impl RuntimeComponentsBuilder { validate!(self.retry_strategy); Ok(()) } + + /// Wraps `v` in tracking associated with this builder + fn tracked(&self, v: Option) -> Option> { + v.map(|v| Tracked::new(self.builder_name, v)) + } } #[derive(Clone, Debug)] diff --git a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs index cc6de23d6ac..4230b79c2bc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs @@ -15,6 +15,7 @@ use crate::client::retries::RetryPartition; use aws_smithy_async::rt::sleep::default_async_sleep; use aws_smithy_async::time::SystemTimeSource; use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; use aws_smithy_runtime_api::client::http::SharedHttpClient; use aws_smithy_runtime_api::client::runtime_components::{ RuntimeComponentsBuilder, SharedConfigValidator, @@ -170,6 +171,7 @@ pub fn default_identity_cache_plugin() -> Option { #[derive(Debug, Default)] pub struct DefaultPluginParams { retry_partition_name: Option>, + behavior_major_version: Option, } impl DefaultPluginParams { @@ -183,6 +185,12 @@ impl DefaultPluginParams { self.retry_partition_name = Some(name.into()); self } + + /// Sets the behavior major version. + pub fn with_behavior_major_version(mut self, version: BehaviorMajorVersion) -> Self { + self.behavior_major_version = Some(version); + self + } } /// All default plugins. diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs index 8818df28da4..43d54152dba 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs @@ -27,12 +27,9 @@ pub struct CaptureRequestHandler(Arc>); impl HttpConnector for CaptureRequestHandler { fn call(&self, request: HttpRequest) -> HttpConnectorFuture { let mut inner = self.0.lock().unwrap(); - inner - .sender - .take() - .expect("already sent") - .send(request) - .expect("channel not ready"); + if let Err(_e) = inner.sender.take().expect("already sent").send(request) { + tracing::trace!("The receiver was already dropped"); + } HttpConnectorFuture::ready(Ok(inner .response .take() diff --git a/tools/ci-cdk/canary-lambda/src/main.rs b/tools/ci-cdk/canary-lambda/src/main.rs index 9a3d3f40d7b..df0b36c45ae 100644 --- a/tools/ci-cdk/canary-lambda/src/main.rs +++ b/tools/ci-cdk/canary-lambda/src/main.rs @@ -76,6 +76,7 @@ struct LambdaMain { } impl LambdaMain { + #[allow(deprecated)] async fn new() -> Self { Self { sdk_config: aws_config::load_from_env().await, From b3ca5bfdd585856e03e9afd54192010adee6ba85 Mon Sep 17 00:00:00 2001 From: david-perez Date: Wed, 15 Nov 2023 14:18:47 +0100 Subject: [PATCH 260/331] Remove `CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse` in CI (#3196) This should have been done as part of #2766. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-build/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 746a12ec7ce..bf776eeac3d 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -190,7 +190,6 @@ COPY --chown=build:build --from=cargo_mdbook /opt/cargo/bin/mdbook /opt/cargo/bi COPY --chown=build:build --from=cargo_mdbook_mermaid /opt/cargo/bin/mdbook-mermaid /opt/cargo/bin/mdbook-mermaid COPY --chown=build:build --from=musl_toolchain /usr/local/musl/ /usr/local/musl/ ENV PATH=$PATH:/usr/local/musl/bin/ -# TODO(Rust 1.70): The sparse registry config (`CARGO_REGISTRIES_CRATES_IO_PROTOCOL`) can be removed when upgrading to Rust 1.70 ENV PATH=/opt/cargo/bin:$PATH \ CARGO_HOME=/opt/cargo \ RUSTUP_HOME=/opt/rustup \ @@ -198,7 +197,6 @@ ENV PATH=/opt/cargo/bin:$PATH \ GRADLE_USER_HOME=/home/build/.gradle \ RUST_STABLE_VERSION=${rust_stable_version} \ RUST_NIGHTLY_VERSION=${rust_nightly_version} \ - CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse \ CARGO_INCREMENTAL=0 \ RUSTDOCFLAGS="-D warnings" \ RUSTFLAGS="-D warnings" \ From 8a453134ab7c4daed26a2a08066f196b147c6f74 Mon Sep 17 00:00:00 2001 From: david-perez Date: Wed, 15 Nov 2023 14:59:18 +0100 Subject: [PATCH 261/331] Rely on `.cargo/config.toml` instead of `RUSTFLAGS` in tests' generated crates (#3192) This is PR is similar to #1422. When generating a crate (either via `Project.compileAndTest` or `{client,server}IntegrationTest`), we're setting `RUSTFLAGS`. When developing, a common thing to do after generating a crate is to open its contents in an editor, make modifications, and run `cargo` again. - the editor will kick off `rust-analyzer`, which will build the code again without the `RUSTFLAGS`; and - the developer is unlikely to use the same `RUSTFLAGS` when running manual `cargo` commands; in fact, they'll most likely use none. Indeed, using `CARGO_LOG=cargo::core::compiler::fingerprint=trace` on the generated crate reveals that `cargo` is claiming it has to rebuild the entire dependency closure because a different set of flags was used. This causes unnecessary crate rebuilds during which the developer has to wait. Instead of relying on `RUSTFLAGS` in the command line invocation, we can leverage `.cargo/config.toml`'s `[build.rustflags]` to persist the settings in a file, like we did in #1422. That way, any plain `cargo` command that runs on the same project will reuse the previous compilation artifacts. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../endpoint/EndpointResolverGeneratorTest.kt | 4 +--- .../smithy/endpoint/EndpointsDecoratorTest.kt | 3 ++- .../core/testutil/CodegenIntegrationTest.kt | 5 +++- .../smithy/rust/codegen/core/testutil/Rust.kt | 23 ++++++++++++++++++- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt index 6df462940d3..aaa8cfa284f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt @@ -11,8 +11,6 @@ import org.junit.jupiter.params.provider.MethodSource import software.amazon.smithy.model.Model import software.amazon.smithy.rust.codegen.client.testutil.EndpointTestDiscovery import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams -import software.amazon.smithy.rust.codegen.core.util.runCommand class EndpointResolverGeneratorTest { companion object { @@ -55,7 +53,7 @@ class EndpointResolverGeneratorTest { // if (!suite.toString().contains("hostable")) { // return // } - clientIntegrationTest(suite, params = IntegrationTestParams(command = { it -> "cargo test".runCommand(it, mapOf("RUSTFLAGS" to "")) })) + clientIntegrationTest(suite) } /* diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index d048e3a735b..789315e2189 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -17,6 +17,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings import software.amazon.smithy.rust.codegen.core.util.CommandError +import software.amazon.smithy.rust.codegen.core.util.runCommand /** * End-to-end test of endpoint resolvers, attaching a real resolver to a fully generated service @@ -128,7 +129,7 @@ class EndpointsDecoratorTest { val testDir = clientIntegrationTest( model, // Just run integration tests. - IntegrationTestParams(command = { "cargo test --all-features --test *".runWithWarnings(it) }), + IntegrationTestParams(command = { "cargo test --all-features --test *".runCommand(it) }), ) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("endpoint_params_test") { val moduleName = clientCodegenContext.moduleUseName() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt index 6970b9c2846..5aa33a1ea42 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt @@ -40,10 +40,13 @@ fun codegenIntegrationTest(model: Model, params: IntegrationTestParams, invokePl params.runtimeConfig, params.overrideTestDir, ) + + testDir.writeDotCargoConfigToml(listOf("--deny", "warnings")) + invokePlugin(ctx) ctx.fileManifest.printGeneratedFiles() val logger = Logger.getLogger("CodegenIntegrationTest") - val out = params.command?.invoke(testDir) ?: (params.cargoCommand ?: "cargo test --lib --tests").runCommand(testDir, environment = mapOf("RUSTFLAGS" to "-D warnings")) + val out = params.command?.invoke(testDir) ?: (params.cargoCommand ?: "cargo test --lib --tests").runCommand(testDir) logger.fine(out.toString()) return testDir } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index a087089dd3e..4739061cd32 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -40,9 +40,11 @@ import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.orNullIfEmpty import software.amazon.smithy.rust.codegen.core.util.runCommand import java.io.File +import java.nio.file.Files import java.nio.file.Files.createTempDirectory import java.nio.file.Path import kotlin.io.path.absolutePathString +import kotlin.io.path.writeText val TestModuleDocProvider = object : ModuleDocProvider { override fun docsWriter(module: RustModule.LeafModule): Writable = writable { @@ -340,7 +342,13 @@ fun TestWriterDelegator.compileAndTest( } catch (e: Exception) { // cargo fmt errors are useless, ignore } - val env = mapOf("RUSTFLAGS" to "-A dead_code") + + // Clean `RUSTFLAGS` because in CI we pass in `--deny warnings` and + // we still generate test code with warnings. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/3194) + val env = mapOf("RUSTFLAGS" to "") + baseDir.writeDotCargoConfigToml(listOf("--allow", "dead_code")) + val testOutput = "cargo test".runCommand(baseDir, env) if (runClippy) { "cargo clippy --all-features".runCommand(baseDir, env) @@ -348,6 +356,19 @@ fun TestWriterDelegator.compileAndTest( return testOutput } +fun Path.writeDotCargoConfigToml(rustFlags: List) { + val dotCargoDir = this.resolve(".cargo") + Files.createDirectory(dotCargoDir) + + dotCargoDir.resolve("config.toml") + .writeText( + """ + [build] + rustflags = [${rustFlags.joinToString(",") { "\"$it\"" }}] + """.trimIndent(), + ) +} + fun TestWriterDelegator.rustSettings() = testRustSettings( service = ShapeId.from("fake#Fake"), From c0f72fbfe83f8ebe32b39678a2bbc03447eef533 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 15 Nov 2023 11:05:43 -0600 Subject: [PATCH 262/331] Enable stable & unstable versions in release workflow (#3201) ## Motivation and Context Addresses `TODO(GA)` from https://github.com/smithy-lang/smithy-rs/pull/3082 ## Description This small PR will remove a guard so we can truly specify different versions for stable crates and unstable crates. Previously, whatever that's entered in `Stable semantic version` in the release workflow textbox (see a screenshot in the above PR) is overwritten by what's entered in `Unstable semantic version`. With this PR, whatever that's entered in `Stable semantic version` will make its way to `smithy.rs.runtime.crate.stable.version` in `gradle.properties`. In addition, with this PR, the name of a release branch is derived from what we enter in `Stable semantic version` in the release workflow textbox. ## Testing ~~It has been tested in the above PR.~~ EDIT: Found a bug I introduced in the above PR where `publisher` was not reading a metadata `package.metadata.smithy-rs-release-tooling` correctly in a manifest file. Fixed it in c477d2f, confirmed that a [dry-run](https://github.com/smithy-lang/smithy-rs/actions/runs/6872502257) passed, and verified the release artifact contained both stable crate versions & unstable versions as expected. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/release.yml | 14 +++-- .../publisher/src/subcommand/fix_manifests.rs | 52 ++++++++++++++++++- tools/ci-scripts/upgrade-gradle-properties | 3 +- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0429e31e52f..a76a41ec1c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -99,8 +99,7 @@ jobs: id: branch-push shell: bash env: - # TODO(GA): specify ${{ inputs.stable_semantic_version }} - SEMANTIC_VERSION: ${{ inputs.unstable_semantic_version }} + SEMANTIC_VERSION: ${{ inputs.stable_semantic_version }} DRY_RUN: ${{ inputs.dry_run }} run: | set -e @@ -141,8 +140,7 @@ jobs: working-directory: upgrade-gradle-properties/smithy-rs shell: bash env: - # TODO(GA): specify ${{ inputs.stable_semantic_version }} - SEMANTIC_VERSION: ${{ inputs.unstable_semantic_version }} + SEMANTIC_VERSION: ${{ inputs.stable_semantic_version }} RELEASE_COMMIT_SHA: ${{ inputs.commit_sha }} RELEASE_BRANCH_NAME: ${{ needs.get-or-create-release-branch.outputs.release_branch }} DRY_RUN: ${{ inputs.dry_run }} @@ -161,7 +159,13 @@ jobs: # to retry a release action execution that failed due to a transient issue. # In that case, we expect the commit to be releasable as-is, i.e. the runtime crate version in gradle.properties # should already be the expected one. - git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + if [[ "${DRY_RUN}" == "true" ]]; then + # During dry-runs, "git push" without "--force" can fail if smithy-rs-release-x.y.z-preview is behind + # smithy-rs-release-x.y.z, but that does not matter much during dry-runs. + git push --force origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + else + git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + fi echo "commit_sha=$(git rev-parse HEAD)" > $GITHUB_OUTPUT else diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index 6a5ddb425c3..a22c47f5901 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -88,7 +88,9 @@ impl Manifest { fn stability(&self) -> Result { let value = self .metadata - .get("package.metadata.smithy-rs-release-tooling") + .get("package") + .and_then(|v| v.get("metadata")) + .and_then(|v| v.get("smithy-rs-release-tooling")) .and_then(|v| v.get("stable")); match value { None => Ok(PackageStability::Unstable), @@ -520,4 +522,52 @@ mod tests { "aws-sdk-rust/examples/foo/bar/Cargo.toml" )); } + + #[test] + fn test_package_stability_from_manifest() { + fn verify_package_stability_for_manifest( + manifest: &[u8], + expected_stability: PackageStability, + ) { + let metadata = toml::from_slice(manifest).unwrap(); + let manifest = Manifest { + path: "test".into(), + metadata, + }; + assert_eq!(expected_stability, manifest.stability().unwrap()); + } + + let stable_manifest = br#" + [package] + name = "test" + version = "1.0.0" + + [package.metadata.smithy-rs-release-tooling] + stable = true + "#; + verify_package_stability_for_manifest(stable_manifest, PackageStability::Stable); + + let explicitly_unstable_manifest = br#" + [package] + name = "test" + version = "0.1.0" + + [package.metadata.smithy-rs-release-tooling] + stable = false + "#; + verify_package_stability_for_manifest( + explicitly_unstable_manifest, + PackageStability::Unstable, + ); + + let implicitly_unstable_manifest = br#" + [package] + name = "test" + version = "0.1.0" + "#; + verify_package_stability_for_manifest( + implicitly_unstable_manifest, + PackageStability::Unstable, + ); + } } diff --git a/tools/ci-scripts/upgrade-gradle-properties b/tools/ci-scripts/upgrade-gradle-properties index 77fac20c5b4..e37a46ef742 100755 --- a/tools/ci-scripts/upgrade-gradle-properties +++ b/tools/ci-scripts/upgrade-gradle-properties @@ -15,8 +15,7 @@ mkdir -p "${ARTIFACTS_DIR}" pushd "${SMITHY_RS_DIR}" echo "gradle.properties BEFORE the upgrade" cat gradle.properties -# TODO(GA): pass ${STABLE_SEMANTIC_VERSION} to --stable-version -publisher upgrade-runtime-crates-version --stable-version "${UNSTABLE_SEMANTIC_VERSION}" --version "${UNSTABLE_SEMANTIC_VERSION}" +publisher upgrade-runtime-crates-version --stable-version "${STABLE_SEMANTIC_VERSION}" --version "${UNSTABLE_SEMANTIC_VERSION}" echo "gradle.properties AFTER the upgrade" cat gradle.properties git status From c830caa281ec2f89c33053af4318ec6884008f95 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 15 Nov 2023 10:12:13 -0800 Subject: [PATCH 263/331] Revise unhandled error variant according to RFC-39 (#3191) This PR implements [RFC-39](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0039_forward_compatible_errors.md) with a couple slight deviations: - No `introspect` method is added since `Error` already implements `ProvideErrorMetadata`. - The same opaqueness and deprecation pointer is applied to the enum unknown variant for consistency. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 58 ++++++++++++++ .../aws-inlineable/src/s3_request_id.rs | 2 + aws/rust-runtime/aws-types/src/request_id.rs | 3 + .../smithy/rustsdk/BaseRequestIdDecorator.kt | 2 +- .../lambda/tests/request_id.rs | 1 + .../query-strings-are-correctly-encoded.rs | 32 ++++---- .../integration-tests/s3/tests/request_id.rs | 1 + .../smithy/generators/ClientEnumGenerator.kt | 65 ++++++++++++++- .../error/OperationErrorGenerator.kt | 78 +++++++++++------- .../generators/error/ServiceErrorGenerator.kt | 80 ++++++++++++++++--- .../generators/ClientEnumGeneratorTest.kt | 10 ++- ...entEventStreamUnmarshallerGeneratorTest.kt | 2 +- .../rust/codegen/core/smithy/RuntimeType.kt | 1 - .../examples/handling-errors.rs | 29 +++---- .../external-types.toml | 1 + .../aws-smithy-runtime-api/src/http.rs | 2 +- rust-runtime/aws-smithy-types/src/error.rs | 2 + .../aws-smithy-types/src/error/unhandled.rs | 4 + 18 files changed, 292 insertions(+), 81 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index f8499b99561..739891c16fc 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -119,3 +119,61 @@ message = "Remove deprecated error kind type aliases." references = ["smithy-rs#3189"] meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[aws-sdk-rust]] +message = """ +Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you +might have: +```rust +match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + GetStorageError::Unhandled(unhandled) if unhandled.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } +} +``` +It should now look as follows: +```rust +match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + err if err.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } +} +``` +The `Unhandled` variant should never be referenced directly. +""" +references = ["smithy-rs#3191"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = """ +Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you +might have: +```rust +match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + GetStorageError::Unhandled(unhandled) if unhandled.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } +} +``` +It should now look as follows: +```rust +match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + err if err.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } +} +``` +The `Unhandled` variant should never be referenced directly. +""" +references = ["smithy-rs#3191"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 20962244b01..53b23c3cf21 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -8,6 +8,7 @@ use aws_smithy_runtime_api::http::{Headers, Response}; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; +#[allow(deprecated)] use aws_smithy_types::error::Unhandled; const EXTENDED_REQUEST_ID: &str = "s3_extended_request_id"; @@ -36,6 +37,7 @@ impl RequestIdExt for ErrorMetadata { } } +#[allow(deprecated)] impl RequestIdExt for Unhandled { fn extended_request_id(&self) -> Option<&str> { self.meta().extended_request_id() diff --git a/aws/rust-runtime/aws-types/src/request_id.rs b/aws/rust-runtime/aws-types/src/request_id.rs index ed56612984e..97dff4b110a 100644 --- a/aws/rust-runtime/aws-types/src/request_id.rs +++ b/aws/rust-runtime/aws-types/src/request_id.rs @@ -11,6 +11,8 @@ use aws_smithy_runtime_api::http::Response; use aws_smithy_types::error::metadata::{ Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, }; + +#[allow(deprecated)] use aws_smithy_types::error::Unhandled; /// Constant for the [`ErrorMetadata`] extra field that contains the request ID @@ -38,6 +40,7 @@ impl RequestId for ErrorMetadata { } } +#[allow(deprecated)] impl RequestId for Unhandled { fn request_id(&self) -> Option<&str> { self.meta().request_id() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt index 5025ffedab1..96d61b4f9f3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt @@ -146,7 +146,7 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { val sym = codegenContext.symbolProvider.toSymbol(error) rust("Self::${sym.name}(e) => #T,", wrapped) } - rust("Self::Unhandled(e) => e.$accessorFunctionName(),") + rust("Self::Unhandled(e) => e.meta.$accessorFunctionName(),") } } } diff --git a/aws/sdk/integration-tests/lambda/tests/request_id.rs b/aws/sdk/integration-tests/lambda/tests/request_id.rs index 6a6e1384ae3..4517f05bc9e 100644 --- a/aws/sdk/integration-tests/lambda/tests/request_id.rs +++ b/aws/sdk/integration-tests/lambda/tests/request_id.rs @@ -9,6 +9,7 @@ use aws_sdk_lambda::operation::RequestId; use aws_sdk_lambda::{Client, Config}; use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +#[allow(deprecated)] async fn run_test( response: impl Fn() -> http::Response<&'static str> + Send + Sync + 'static, expect_error: bool, diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 902d07933b2..563ba7076d2 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -7,6 +7,7 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::operation::list_objects_v2::ListObjectsV2Error; use aws_sdk_s3::{Client, Config}; use aws_smithy_runtime::client::http::test_util::capture_request; @@ -58,8 +59,8 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // test must be run against an actual bucket so we `ignore` it unless the runner specifically requests it #[tokio::test] #[ignore] +#[allow(deprecated)] async fn test_query_strings_are_correctly_encoded() { - use aws_sdk_s3::operation::list_objects_v2::ListObjectsV2Error; use aws_smithy_runtime_api::client::result::SdkError; tracing_subscriber::fmt::init(); @@ -80,22 +81,19 @@ async fn test_query_strings_are_correctly_encoded() { .send() .await; if let Err(SdkError::ServiceError(context)) = res { - match context.err() { - ListObjectsV2Error::Unhandled(e) - if e.to_string().contains("SignatureDoesNotMatch") => - { - chars_that_break_signing.push(byte); - } - ListObjectsV2Error::Unhandled(e) if e.to_string().contains("InvalidUri") => { - chars_that_break_uri_parsing.push(byte); - } - ListObjectsV2Error::Unhandled(e) if e.to_string().contains("InvalidArgument") => { - chars_that_are_invalid_arguments.push(byte); - } - ListObjectsV2Error::Unhandled(e) if e.to_string().contains("InvalidToken") => { - panic!("refresh your credentials and run this test again"); - } - e => todo!("unexpected error: {:?}", e), + let err = context.err(); + let msg = err.to_string(); + let unhandled = matches!(err, ListObjectsV2Error::Unhandled(_)); + if unhandled && msg.contains("SignatureDoesNotMatch") { + chars_that_break_signing.push(byte); + } else if unhandled && msg.to_string().contains("InvalidUri") { + chars_that_break_uri_parsing.push(byte); + } else if unhandled && msg.to_string().contains("InvalidArgument") { + chars_that_are_invalid_arguments.push(byte); + } else if unhandled && msg.to_string().contains("InvalidToken") { + panic!("refresh your credentials and run this test again"); + } else { + todo!("unexpected error: {:?}", err); } } } diff --git a/aws/sdk/integration-tests/s3/tests/request_id.rs b/aws/sdk/integration-tests/s3/tests/request_id.rs index 1ea72044263..886b2d5bafb 100644 --- a/aws/sdk/integration-tests/s3/tests/request_id.rs +++ b/aws/sdk/integration-tests/s3/tests/request_id.rs @@ -59,6 +59,7 @@ async fn get_request_id_from_modeled_error() { } #[tokio::test] +#[allow(deprecated)] async fn get_request_id_from_unmodeled_error() { let (http_client, request) = capture_request(Some( http::Response::builder() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt index db298141f06..c665144c23a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.Visibility import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -75,12 +76,39 @@ data class InfallibleEnumType( ) } + override fun additionalEnumImpls(context: EnumGeneratorContext): Writable = writable { + // `try_parse` isn't needed for unnamed enums + if (context.enumTrait.hasNames()) { + rustTemplate( + """ + impl ${context.enumName} { + /// Parses the enum value while disallowing unknown variants. + /// + /// Unknown variants will result in an error. + pub fn try_parse(value: &str) -> #{Result} { + match Self::from(value) { + ##[allow(deprecated)] + Self::Unknown(_) => #{Err}(#{UnknownVariantError}::new(value)), + known => Ok(known), + } + } + } + """, + *preludeScope, + "UnknownVariantError" to unknownVariantError(), + ) + } + } + override fun additionalDocs(context: EnumGeneratorContext): Writable = writable { renderForwardCompatibilityNote(context.enumName, context.sortedMembers, UnknownVariant, UnknownVariantValue) } override fun additionalEnumMembers(context: EnumGeneratorContext): Writable = writable { docs("`$UnknownVariant` contains new variants that have been added since this code was generated.") + rust( + """##[deprecated(note = "Don't directly match on `$UnknownVariant`. See the docs on this enum for the correct way to handle unknown variants.")]""", + ) rust("$UnknownVariant(#T)", unknownVariantValue(context)) } @@ -93,10 +121,9 @@ data class InfallibleEnumType( docs( """ Opaque struct used as inner data for the `Unknown` variant defined in enums in - the crate + the crate. - While this is not intended to be used directly, it is marked as `pub` because it is - part of the enums that are public interface. + This is not intended to be used directly. """.trimIndent(), ) context.enumMeta.render(this) @@ -174,5 +201,35 @@ class ClientEnumGenerator(codegenContext: ClientCodegenContext, shape: StringSha codegenContext.model, codegenContext.symbolProvider, shape, - InfallibleEnumType(ClientRustModule.primitives), + InfallibleEnumType( + RustModule.new( + "sealed_enum_unknown", + visibility = Visibility.PUBCRATE, + parent = ClientRustModule.primitives, + ), + ), ) + +private fun unknownVariantError(): RuntimeType = RuntimeType.forInlineFun("UnknownVariantError", ClientRustModule.Error) { + rustTemplate( + """ + /// The given enum value failed to parse since it is not a known value. + ##[derive(Debug)] + pub struct UnknownVariantError { + value: #{String}, + } + impl UnknownVariantError { + pub(crate) fn new(value: impl #{Into}<#{String}>) -> Self { + Self { value: value.into() } + } + } + impl ::std::fmt::Display for UnknownVariantError { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> #{Result}<(), ::std::fmt::Error> { + write!(f, "unknown enum variant: '{}'", self.value) + } + } + impl ::std::error::Error for UnknownVariantError {} + """, + *preludeScope, + ) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt index dfa0c1b60e9..280b06c2cac 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt @@ -28,7 +28,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.errorMetadata import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations @@ -83,12 +82,14 @@ class OperationErrorGenerator( val errorVariantSymbol = symbolProvider.toSymbol(errorVariant) write("${errorVariantSymbol.name}(#T),", errorVariantSymbol) } - rust( + rustTemplate( """ /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). - Unhandled(#T), + #{deprecation} + Unhandled(#{Unhandled}), """, - unhandledError(runtimeConfig), + "deprecation" to writable { renderUnhandledErrorDeprecation(runtimeConfig, errorSymbol.name) }, + "Unhandled" to unhandledError(runtimeConfig), ) } @@ -114,15 +115,9 @@ class OperationErrorGenerator( "StdError" to RuntimeType.StdError, "ErrorMeta" to errorMetadata, ) { - rust( - """ - Self::Unhandled({ - let mut builder = #T::builder().source(source); - builder.set_meta(meta); - builder.build() - }) - """, - unhandledError(runtimeConfig), + rustTemplate( + """Self::Unhandled(#{Unhandled} { source, meta: meta.unwrap_or_default() })""", + "Unhandled" to unhandledError(runtimeConfig), ) } } @@ -131,8 +126,23 @@ class OperationErrorGenerator( private fun RustWriter.renderImplDisplay(errorSymbol: Symbol, errors: List) { rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.Display) { rustBlock("fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result") { - delegateToVariants(errors) { - writable { rust("_inner.fmt(f)") } + delegateToVariants(errors) { variantMatch -> + when (variantMatch) { + is VariantMatch.Unhandled -> writable { + rustTemplate( + """ + if let #{Some}(code) = #{ProvideErrorMetadata}::code(self) { + write!(f, "unhandled error ({code})") + } else { + f.write_str("unhandled error") + } + """, + *preludeScope, + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(runtimeConfig), + ) + } + is VariantMatch.Modeled -> writable { rust("_inner.fmt(f)") } + } } } } @@ -142,8 +152,13 @@ class OperationErrorGenerator( val errorMetadataTrait = RuntimeType.provideErrorMetadataTrait(runtimeConfig) rustBlock("impl #T for ${errorSymbol.name}", errorMetadataTrait) { rustBlock("fn meta(&self) -> &#T", errorMetadata(runtimeConfig)) { - delegateToVariants(errors) { - writable { rust("#T::meta(_inner)", errorMetadataTrait) } + delegateToVariants(errors) { variantMatch -> + writable { + when (variantMatch) { + is VariantMatch.Unhandled -> rust("&_inner.meta") + is VariantMatch.Modeled -> rust("#T::meta(_inner)", errorMetadataTrait) + } + } } } } @@ -189,16 +204,16 @@ class OperationErrorGenerator( """ /// Creates the `${errorSymbol.name}::Unhandled` variant from any error type. pub fn unhandled(err: impl #{Into}<#{Box}>) -> Self { - Self::Unhandled(#{Unhandled}::builder().source(err).build()) + Self::Unhandled(#{Unhandled} { source: err.into(), meta: #{Default}::default() }) } - /// Creates the `${errorSymbol.name}::Unhandled` variant from a `#{error_metadata}`. - pub fn generic(err: #{error_metadata}) -> Self { - Self::Unhandled(#{Unhandled}::builder().source(err.clone()).meta(err).build()) + /// Creates the `${errorSymbol.name}::Unhandled` variant from an [`ErrorMetadata`](#{ErrorMetadata}). + pub fn generic(err: #{ErrorMetadata}) -> Self { + Self::Unhandled(#{Unhandled} { source: err.clone().into(), meta: err }) } """, *preludeScope, - "error_metadata" to errorMetadata, + "ErrorMetadata" to errorMetadata, "StdError" to RuntimeType.StdError, "Unhandled" to unhandledError(runtimeConfig), ) @@ -209,13 +224,15 @@ class OperationErrorGenerator( """, ) rustBlock("pub fn meta(&self) -> &#T", errorMetadata) { - rust("use #T;", RuntimeType.provideErrorMetadataTrait(runtimeConfig)) rustBlock("match self") { errors.forEach { error -> val errorVariantSymbol = symbolProvider.toSymbol(error) - rust("Self::${errorVariantSymbol.name}(e) => e.meta(),") + rustTemplate( + "Self::${errorVariantSymbol.name}(e) => #{ProvideErrorMetadata}::meta(e),", + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(runtimeConfig), + ) } - rust("Self::Unhandled(e) => e.meta(),") + rust("Self::Unhandled(e) => &e.meta,") } } errors.forEach { error -> @@ -236,9 +253,14 @@ class OperationErrorGenerator( *preludeScope, "StdError" to RuntimeType.StdError, ) { - delegateToVariants(errors) { - writable { - rustTemplate("#{Some}(_inner)", *preludeScope) + delegateToVariants(errors) { variantMatch -> + when (variantMatch) { + is VariantMatch.Unhandled -> writable { + rustTemplate("#{Some}(&*_inner.source)", *preludeScope) + } + is VariantMatch.Modeled -> writable { + rustTemplate("#{Some}(_inner)", *preludeScope) + } } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt index f6fc9ed166c..5a33941845b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata import software.amazon.smithy.rust.codegen.core.rustlang.RustModule @@ -24,9 +25,9 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError @@ -91,7 +92,7 @@ class ServiceErrorGenerator( allErrors.forEach { rust("Error::${symbolProvider.toSymbol(it).name}(inner) => inner.source(),") } - rust("Error::Unhandled(inner) => inner.source()") + rustTemplate("Error::Unhandled(inner) => #{Some}(&*inner.source)", *preludeScope) } } } @@ -107,7 +108,17 @@ class ServiceErrorGenerator( allErrors.forEach { rust("Error::${symbolProvider.toSymbol(it).name}(inner) => inner.fmt(f),") } - rust("Error::Unhandled(inner) => inner.fmt(f)") + rustTemplate( + """ + Error::Unhandled(_) => if let #{Some}(code) = #{ProvideErrorMetadata}::code(self) { + write!(f, "unhandled error ({code})") + } else { + f.write_str("unhandled error") + } + """, + *preludeScope, + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(codegenContext.runtimeConfig), + ) } } } @@ -118,11 +129,12 @@ class ServiceErrorGenerator( """ impl From<#{BuildError}> for Error { fn from(value: #{BuildError}) -> Self { - Error::Unhandled(#{Unhandled}::builder().source(value).build()) + Error::Unhandled(#{Unhandled} { source: value.into(), meta: #{Default}::default() }) } } """, + *preludeScope, "BuildError" to codegenContext.runtimeConfig.operationBuildError(), "Unhandled" to unhandledError(codegenContext.runtimeConfig), ) @@ -146,10 +158,10 @@ class ServiceErrorGenerator( rustTemplate( """ _ => Error::Unhandled( - #{Unhandled}::builder() - .meta(#{ProvideErrorMetadata}::meta(&err).clone()) - .source(err) - .build() + #{Unhandled} { + meta: #{ProvideErrorMetadata}::meta(&err).clone(), + source: err.into(), + } ), """, "Unhandled" to unhandledError(codegenContext.runtimeConfig), @@ -187,7 +199,7 @@ class ServiceErrorGenerator( fn meta(&self) -> &#{ErrorMetadata} { match self { #{matchers} - Self::Unhandled(inner) => inner.meta(), + Self::Unhandled(inner) => &inner.meta, } } } @@ -220,7 +232,57 @@ class ServiceErrorGenerator( rust("${sym.name}(#T),", sym) } docs("An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).") + renderUnhandledErrorDeprecation(codegenContext.runtimeConfig, "Error") rust("Unhandled(#T)", unhandledError(codegenContext.runtimeConfig)) } } } + +fun unhandledError(rc: RuntimeConfig): RuntimeType = RuntimeType.forInlineFun( + "Unhandled", + // Place in a sealed module so that it can't be referenced at all + RustModule.pubCrate("sealed_unhandled", ClientRustModule.Error), +) { + rustTemplate( + """ + /// This struct is not intended to be used. + /// + /// This struct holds information about an unhandled error, + /// but that information should be obtained by using the + /// [`ProvideErrorMetadata`](#{ProvideErrorMetadata}) trait + /// on the error type. + /// + /// This struct intentionally doesn't yield any useful information itself. + #{deprecation} + ##[derive(Debug)] + pub struct Unhandled { + pub(crate) source: #{BoxError}, + pub(crate) meta: #{ErrorMetadata}, + } + """, + "BoxError" to RuntimeType.smithyRuntimeApi(rc).resolve("box_error::BoxError"), + "deprecation" to writable { renderUnhandledErrorDeprecation(rc) }, + "ErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ErrorMetadata"), + "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + ) +} + +fun RustWriter.renderUnhandledErrorDeprecation(rc: RuntimeConfig, errorName: String? = null) { + val link = if (errorName != null) { + "##impl-ProvideErrorMetadata-for-$errorName" + } else { + "#{ProvideErrorMetadata}" + } + val message = """ + Matching `Unhandled` directly is not forwards compatible. Instead, match using a + variable wildcard pattern and check `.code()`:
+    `err if err.code() == Some("SpecificExceptionCode") => { /* handle the error */ }`
+ See [`ProvideErrorMetadata`]($link) for what information is available for the error. + """.trimIndent() + // `.dq()` doesn't quite do what we want here since we actually want a Rust multi-line string + val messageEscaped = message.replace("\"", "\\\"").replace("\n", " \\\n").replace("
", "\n") + rustTemplate( + """##[deprecated(note = "$messageEscaped")]""", + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(rc), + ) +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt index 43540334852..9c0817e5c55 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt @@ -119,7 +119,10 @@ class ClientEnumGeneratorTest { """ assert_eq!(SomeEnum::from("Unknown"), SomeEnum::UnknownValue); assert_eq!(SomeEnum::from("UnknownValue"), SomeEnum::UnknownValue_); - assert_eq!(SomeEnum::from("SomethingNew"), SomeEnum::Unknown(crate::primitives::UnknownVariantValue("SomethingNew".to_owned()))); + assert_eq!( + SomeEnum::from("SomethingNew"), + SomeEnum::Unknown(crate::primitives::sealed_enum_unknown::UnknownVariantValue("SomethingNew".to_owned())) + ); """, ) } @@ -150,7 +153,10 @@ class ClientEnumGeneratorTest { assert_eq!(instance.as_str(), "t2.micro"); assert_eq!(InstanceType::from("t2.nano"), InstanceType::T2Nano); // round trip unknown variants: - assert_eq!(InstanceType::from("other"), InstanceType::Unknown(crate::primitives::UnknownVariantValue("other".to_owned()))); + assert_eq!( + InstanceType::from("other"), + InstanceType::Unknown(crate::primitives::sealed_enum_unknown::UnknownVariantValue("other".to_owned())) + ); assert_eq!(InstanceType::from("other").as_str(), "other"); """, ) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt index d0118d1f84c..92d0b3663c3 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt @@ -51,7 +51,7 @@ class ClientEventStreamUnmarshallerGeneratorTest { let result = $generator::new().unmarshall(&message); assert!(result.is_ok(), "expected ok, got: {:?}", result); match expect_error(result.unwrap()) { - TestStreamError::Unhandled(err) => { + err @ TestStreamError::Unhandled(_) => { let message = format!("{}", crate::error::DisplayErrorContext(&err)); let expected = "message: \"unmodeled error\""; assert!(message.contains(expected), "Expected '{message}' to contain '{expected}'"); diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 5e552d7cd5d..3a12fbec76f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -425,7 +425,6 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun provideErrorMetadataTrait(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::metadata::ProvideErrorMetadata") - fun unhandledError(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::Unhandled") fun jsonErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.jsonErrors(runtimeConfig)) fun awsQueryCompatibleErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.awsQueryCompatibleErrors(runtimeConfig)) diff --git a/examples/pokemon-service-client-usage/examples/handling-errors.rs b/examples/pokemon-service-client-usage/examples/handling-errors.rs index af1c230cdcd..dfcebda6109 100644 --- a/examples/pokemon-service-client-usage/examples/handling-errors.rs +++ b/examples/pokemon-service-client-usage/examples/handling-errors.rs @@ -2,20 +2,19 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -/// Copyright © 2023, Amazon, LLC. -/// -/// This example demonstrates how to handle service generated errors. -/// -/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. -/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) -/// file for instructions on how to launch the service locally. -/// -/// The example can be run using `cargo run --example handling-errors`. -/// -use pokemon_service_client::{error::SdkError, operation::get_storage::GetStorageError}; -use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +//! This example demonstrates how to handle service generated errors. +//! +//! The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +//! Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +//! file for instructions on how to launch the service locally. +//! +//! The example can be run using `cargo run --example handling-errors`. + +use pokemon_service_client::error::DisplayErrorContext; use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client::{error::SdkError, operation::get_storage::GetStorageError}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; /// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. /// @@ -77,14 +76,10 @@ async fn main() { GetStorageError::ValidationError(ve) => { tracing::error!(error = %ve, "A required field has not been set."); } - // An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). - GetStorageError::Unhandled(uh) => { - tracing::error!(error = %uh, "An unhandled error has occurred.") - } // The SdkError is marked as `#[non_exhaustive]`. Therefore, a catch-all pattern is required to handle // potential future variants introduced in SdkError. _ => { - tracing::error!(error = %se.err(), "Some other error has occurred on the server") + tracing::error!(error = %DisplayErrorContext(se.err()), "Some other error has occurred on the server") } } } diff --git a/rust-runtime/aws-smithy-runtime-api/external-types.toml b/rust-runtime/aws-smithy-runtime-api/external-types.toml index 904961adb23..8d49ecdb570 100644 --- a/rust-runtime/aws-smithy-runtime-api/external-types.toml +++ b/rust-runtime/aws-smithy-runtime-api/external-types.toml @@ -8,5 +8,6 @@ allowed_external_types = [ "http::header::value::HeaderValue", "http::request::Request", "http::response::Response", + "http::status::StatusCode", "http::uri::Uri", ] diff --git a/rust-runtime/aws-smithy-runtime-api/src/http.rs b/rust-runtime/aws-smithy-runtime-api/src/http.rs index a133e23db79..f295b8ac364 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http.rs @@ -13,4 +13,4 @@ mod response; pub use error::HttpError; pub use headers::{HeaderValue, Headers, HeadersIter}; pub use request::{Request, RequestParts}; -pub use response::Response; +pub use response::{Response, StatusCode}; diff --git a/rust-runtime/aws-smithy-types/src/error.rs b/rust-runtime/aws-smithy-types/src/error.rs index 96a48441e0d..28838e4b762 100644 --- a/rust-runtime/aws-smithy-types/src/error.rs +++ b/rust-runtime/aws-smithy-types/src/error.rs @@ -13,6 +13,8 @@ pub mod operation; mod unhandled; pub use metadata::ErrorMetadata; + +#[allow(deprecated)] pub use unhandled::Unhandled; #[derive(Debug)] diff --git a/rust-runtime/aws-smithy-types/src/error/unhandled.rs b/rust-runtime/aws-smithy-types/src/error/unhandled.rs index 2397d700ffc..f0cce422fcc 100644 --- a/rust-runtime/aws-smithy-types/src/error/unhandled.rs +++ b/rust-runtime/aws-smithy-types/src/error/unhandled.rs @@ -3,11 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![allow(deprecated)] + //! Unhandled error type. use crate::error::{metadata::ProvideErrorMetadata, ErrorMetadata}; use std::error::Error as StdError; +#[deprecated(note = "The `Unhandled` type is no longer used by errors.")] /// Builder for [`Unhandled`] #[derive(Default, Debug)] pub struct Builder { @@ -58,6 +61,7 @@ impl Builder { /// [`DisplayErrorContext`](crate::error::display::DisplayErrorContext), use another /// error reporter library that visits the error's cause/source chain, or call /// [`Error::source`](std::error::Error::source) for more details about the underlying cause. +#[deprecated(note = "This type is no longer used by errors.")] #[derive(Debug)] pub struct Unhandled { source: Box, From 572c5d7650fba40b232516e51ca8dde5952a22df Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 15 Nov 2023 11:35:22 -0800 Subject: [PATCH 264/331] Rename behavior versions and associated functions (#3204) The previous names are just too verbose. This PR shortens them and tries to make things clearer. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 10 +-- .../aws-config/external-types.toml | 2 +- .../src/default_provider/app_name.rs | 4 +- aws/rust-runtime/aws-config/src/lib.rs | 89 +++++++++---------- .../aws-config/src/provider_config.rs | 2 +- aws/rust-runtime/aws-config/src/sso/token.rs | 6 +- .../aws-config/src/sts/assume_role.rs | 14 +-- .../aws-types/external-types.toml | 2 +- aws/rust-runtime/aws-types/src/sdk_config.rs | 29 +++--- .../rustsdk/AwsFluentClientDecorator.kt | 2 +- .../smithy/rustsdk/SdkConfigDecorator.kt | 2 +- .../tests/client-construction.rs | 18 ++-- .../integration-tests/s3/tests/endpoints.rs | 2 +- .../client/FluentClientGenerator.kt | 12 +-- .../config/ServiceConfigGenerator.kt | 36 ++++---- design/src/SUMMARY.md | 2 +- design/src/rfcs/overview.md | 1 + ...rsions.md => rfc0040_behavior_versions.md} | 22 ++--- .../src/client/behavior_version.rs | 6 +- .../aws-smithy-runtime/src/client/defaults.rs | 8 +- 20 files changed, 131 insertions(+), 138 deletions(-) rename design/src/rfcs/{rfc0040_behavior_major_versions.md => rfc0040_behavior_versions.md} (73%) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 739891c16fc..c344eda28d6 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -68,15 +68,15 @@ meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" [[aws-sdk-rust]] -message = """Clients now require a `BehaviorMajorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. +message = """Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. ```rust async fn example() { // with aws-config - let conf = aws_config::from_env_with_version(aws_config::BehaviorMajorVersion::v2023_11_09()); + let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09()); // when creating a client - let client = my_service::Client::from_conf(my_service::Config::builder().behavior_major_version(..)..build()); + let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build()); } ```""" references = ["smithy-rs#3151"] @@ -84,12 +84,12 @@ author = "rcoh" meta = { "breaking" = true, "tada" = false, "bug" = false } [[smithy-rs]] -message = """Clients now require a `BehaviorMajorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. +message = """Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. ```rust async fn example() { // when creating a client - let client = my_service::Client::from_conf(my_service::Config::builder().behavior_major_version(..)..build()); + let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build()); } ```""" references = ["smithy-rs#3151"] diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index caea8cb21a2..bd0ada24610 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -22,7 +22,7 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::ResolveIdentity", - "aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion", + "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", "aws_smithy_runtime_api::client::orchestrator::HttpResponse", "aws_smithy_runtime_api::client::result::SdkError", "aws_smithy_types::body::SdkBody", diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index 8f368a5d044..184a1897eec 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -91,7 +91,7 @@ mod tests { use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; use crate::provider_config::ProviderConfig; use crate::test_case::{no_traffic_client, InstantSleep}; - use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; + use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_types::os_shim_internal::{Env, Fs}; #[tokio::test] @@ -118,7 +118,7 @@ mod tests { #[tokio::test] async fn profile_name_override() { let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk_ua_app_id = correct")]); - let conf = crate::from_env_with_version(BehaviorMajorVersion::latest()) + let conf = crate::defaults(BehaviorVersion::latest()) .sleep_impl(InstantSleep) .fs(fs) .http_client(no_traffic_client()) diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 544a394acd8..76fa855538b 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -26,7 +26,7 @@ //! //! Load default SDK configuration: //! ```no_run -//! use aws_config::BehaviorMajorVersion; +//! use aws_config::BehaviorVersion; //! mod aws_sdk_dynamodb { //! # pub struct Client; //! # impl Client { @@ -34,7 +34,7 @@ //! # } //! # } //! # async fn docs() { -//! let config = aws_config::load_from_env_with_version(BehaviorMajorVersion::v2023_11_09()).await; +//! let config = aws_config::load_defaults(BehaviorVersion::v2023_11_09()).await; //! let client = aws_sdk_dynamodb::Client::new(&config); //! # } //! ``` @@ -87,7 +87,7 @@ //! # fn custom_provider(base: &SdkConfig) -> impl ProvideCredentials { //! # base.credentials_provider().unwrap().clone() //! # } -//! let sdk_config = aws_config::load_from_env_with_version(aws_config::BehaviorMajorVersion::latest()).await; +//! let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await; //! let custom_credentials_provider = custom_provider(&sdk_config); //! let dynamo_config = aws_sdk_dynamodb::config::Builder::from(&sdk_config) //! .credentials_provider(custom_credentials_provider) @@ -97,7 +97,7 @@ //! ``` pub use aws_smithy_http::endpoint; -pub use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; +pub use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; // Re-export types from aws-types pub use aws_types::{ app_name::{AppName, InvalidAppName}, @@ -140,9 +140,9 @@ pub mod sts; pub mod timeout; pub mod web_identity_token; -/// Create an environment loader for AWS Configuration +/// Create a config loader with the _latest_ defaults. /// -/// This loader will always set [`BehaviorMajorVersion::latest`]. +/// This loader will always set [`BehaviorVersion::latest`]. /// /// # Examples /// ```no_run @@ -152,56 +152,56 @@ pub mod web_identity_token; /// ``` #[cfg(feature = "behavior-version-latest")] pub fn from_env() -> ConfigLoader { - ConfigLoader::default().behavior_major_version(BehaviorMajorVersion::latest()) + ConfigLoader::default().behavior_version(BehaviorVersion::latest()) } -/// Load configuration from the environment +/// Load default configuration with the _latest_ defaults. +/// +/// Convenience wrapper equivalent to `aws_config::load_defaults(BehaviorVersion::latest()).await` +#[cfg(feature = "behavior-version-latest")] +pub async fn load_from_env() -> SdkConfig { + from_env().load().await +} + +/// Create a config loader with the _latest_ defaults. #[cfg(not(feature = "behavior-version-latest"))] #[deprecated( - note = "To enable the default behavior version, enable the `behavior-version-latest` feature. Alternatively, you can use [`from_env_with_version`]. This function will be removed in the next release." + note = "Use the `aws_config::defaults` function. If you don't care about future default behavior changes, you can continue to use this function by enabling the `behavior-version-latest` feature. Doing so will make this deprecation notice go away." )] pub fn from_env() -> ConfigLoader { - ConfigLoader::default().behavior_major_version(BehaviorMajorVersion::latest()) + ConfigLoader::default().behavior_version(BehaviorVersion::latest()) } -/// Load configuration from the environment +/// Load default configuration with the _latest_ defaults. #[cfg(not(feature = "behavior-version-latest"))] #[deprecated( - note = "To enable the default behavior version, enable the `behavior-version-latest` feature. Alternatively, you can use [`load_from_env_with_version`]. This function will be removed in the next release." + note = "Use the `aws_config::load_defaults` function. If you don't care about future default behavior changes, you can continue to use this function by enabling the `behavior-version-latest` feature. Doing so will make this deprecation notice go away." )] pub async fn load_from_env() -> SdkConfig { - load_from_env_with_version(BehaviorMajorVersion::latest()).await + load_defaults(BehaviorVersion::latest()).await } -/// Create an environment loader for AWS Configuration +/// Create a config loader with the defaults for the given behavior version. /// /// # Examples /// ```no_run /// # async fn create_config() { -/// use aws_config::BehaviorMajorVersion; -/// let config = aws_config::from_env_with_version(BehaviorMajorVersion::v2023_11_09()) +/// use aws_config::BehaviorVersion; +/// let config = aws_config::defaults(BehaviorVersion::v2023_11_09()) /// .region("us-east-1") /// .load() /// .await; /// # } /// ``` -pub fn from_env_with_version(version: BehaviorMajorVersion) -> ConfigLoader { - ConfigLoader::default().behavior_major_version(version) -} - -/// Load a default configuration from the environment -/// -/// Convenience wrapper equivalent to `aws_config::from_env().load().await` -#[cfg(feature = "behavior-version-latest")] -pub async fn load_from_env() -> SdkConfig { - from_env().load().await +pub fn defaults(version: BehaviorVersion) -> ConfigLoader { + ConfigLoader::default().behavior_version(version) } -/// Load a default configuration from the environment +/// Load default configuration with the given behavior version. /// -/// Convenience wrapper equivalent to `aws_config::from_env_with_version(BehaviorMajorVersion::latest()).load().await` -pub async fn load_from_env_with_version(version: BehaviorMajorVersion) -> SdkConfig { - from_env_with_version(version).load().await +/// Convenience wrapper equivalent to `aws_config::defaults(behavior_version).load().await` +pub async fn load_defaults(version: BehaviorVersion) -> SdkConfig { + defaults(version).load().await } mod loader { @@ -214,7 +214,7 @@ mod loader { use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; - use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; + use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; use aws_smithy_runtime_api::shared::IntoShared; @@ -262,16 +262,13 @@ mod loader { time_source: Option, env: Option, fs: Option, - behavior_major_version: Option, + behavior_version: Option, } impl ConfigLoader { - /// Sets the [`BehaviorMajorVersion`] used to build [`SdkConfig`](aws_types::SdkConfig). - pub fn behavior_major_version( - mut self, - behavior_major_version: BehaviorMajorVersion, - ) -> Self { - self.behavior_major_version = Some(behavior_major_version); + /// Sets the [`BehaviorVersion`] used to build [`SdkConfig`](aws_types::SdkConfig). + pub fn behavior_version(mut self, behavior_version: BehaviorVersion) -> Self { + self.behavior_version = Some(behavior_version); self } @@ -631,7 +628,7 @@ mod loader { /// .enable_http1() /// .build(); /// let provider_config = ProviderConfig::default().with_tcp_connector(custom_https_connector); - /// let shared_config = aws_config::from_env_with_version(BehaviorVersion::latest()).configure(provider_config).load().await; + /// let shared_config = aws_config::defaults(BehaviorVersion::latest()).configure(provider_config).load().await; /// # } /// ``` #[deprecated( @@ -752,7 +749,7 @@ mod loader { .timeout_config(timeout_config) .time_source(time_source); - builder.set_behavior_major_version(self.behavior_major_version); + builder.set_behavior_version(self.behavior_version); builder.set_http_client(self.http_client); builder.set_app_name(app_name); builder.set_identity_cache(self.identity_cache); @@ -782,8 +779,8 @@ mod loader { mod test { use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; use crate::test_case::{no_traffic_client, InstantSleep}; - use crate::BehaviorMajorVersion; - use crate::{from_env_with_version, ConfigLoader}; + use crate::BehaviorVersion; + use crate::{defaults, ConfigLoader}; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_runtime::client::http::test_util::{infallible_client_fn, NeverClient}; @@ -804,7 +801,7 @@ mod loader { ]); let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk-ua-app-id = correct")]); - let loader = from_env_with_version(BehaviorMajorVersion::latest()) + let loader = defaults(BehaviorVersion::latest()) .sleep_impl(TokioSleep::new()) .env(env) .fs(fs) @@ -848,7 +845,7 @@ mod loader { } fn base_conf() -> ConfigLoader { - from_env_with_version(BehaviorMajorVersion::latest()) + defaults(BehaviorVersion::latest()) .sleep_impl(InstantSleep) .http_client(no_traffic_client()) } @@ -878,7 +875,7 @@ mod loader { #[cfg(feature = "rustls")] #[tokio::test] async fn disable_default_credentials() { - let config = from_env_with_version(BehaviorMajorVersion::latest()) + let config = defaults(BehaviorVersion::latest()) .no_credentials() .load() .await; @@ -894,7 +891,7 @@ mod loader { movable.fetch_add(1, Ordering::Relaxed); http::Response::new("ok!") }); - let config = from_env_with_version(BehaviorMajorVersion::latest()) + let config = defaults(BehaviorVersion::latest()) .fs(Fs::from_slice(&[])) .env(Env::from_slice(&[])) .http_client(http_client.clone()) diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index cc46bca9857..788cdb546f4 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -197,7 +197,7 @@ impl ProviderConfig { .time_source(self.time_source()) .use_fips(self.use_fips().unwrap_or_default()) .use_dual_stack(self.use_dual_stack().unwrap_or_default()) - .behavior_major_version(crate::BehaviorMajorVersion::latest()); + .behavior_version(crate::BehaviorVersion::latest()); builder.set_http_client(self.http_client.clone()); builder.set_sleep_impl(self.sleep_impl.clone()); builder.build() diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs index 7642cdd7dd3..a805f3f6b90 100644 --- a/aws/rust-runtime/aws-config/src/sso/token.rs +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -319,9 +319,7 @@ impl Builder { /// This will panic if any of the required fields are not given. pub async fn build(mut self) -> SsoTokenProvider { if self.sdk_config.is_none() { - self.sdk_config = Some( - crate::load_from_env_with_version(crate::BehaviorMajorVersion::latest()).await, - ); + self.sdk_config = Some(crate::load_defaults(crate::BehaviorVersion::latest()).await); } self.build_with(Env::real(), Fs::real()) } @@ -429,7 +427,7 @@ mod tests { .sleep_impl(SharedAsyncSleep::new(sleep_impl)) // disable retry to simplify testing .retry_config(RetryConfig::disabled()) - .behavior_major_version(crate::BehaviorMajorVersion::latest()) + .behavior_version(crate::BehaviorVersion::latest()) .build(); Self { time_source, diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index dfaff54d4a6..6b827a8b7e3 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -221,7 +221,7 @@ impl AssumeRoleProviderBuilder { pub async fn build(self) -> AssumeRoleProvider { let mut conf = match self.sdk_config { Some(conf) => conf, - None => crate::load_from_env_with_version(crate::BehaviorMajorVersion::latest()).await, + None => crate::load_defaults(crate::BehaviorVersion::latest()).await, }; // ignore a identity cache set from SdkConfig conf = conf @@ -264,7 +264,7 @@ impl AssumeRoleProviderBuilder { ) -> AssumeRoleProvider { let conf = match self.sdk_config { Some(conf) => conf, - None => crate::load_from_env_with_version(crate::BehaviorMajorVersion::latest()).await, + None => crate::load_defaults(crate::BehaviorVersion::latest()).await, }; let conf = conf .into_builder() @@ -334,7 +334,7 @@ mod test { capture_request, ReplayEvent, StaticReplayClient, }; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; - use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; + use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_smithy_types::body::SdkBody; use aws_types::os_shim_internal::Env; use aws_types::region::Region; @@ -352,7 +352,7 @@ mod test { )) .http_client(http_client) .region(Region::from_static("this-will-be-overridden")) - .behavior_major_version(crate::BehaviorMajorVersion::latest()) + .behavior_version(crate::BehaviorVersion::latest()) .build(); let provider = AssumeRoleProvider::builder("myrole") .configure(&sdk_config) @@ -373,7 +373,7 @@ mod test { async fn loads_region_from_sdk_config() { let (http_client, request) = capture_request(None); let sdk_config = SdkConfig::builder() - .behavior_major_version(crate::BehaviorMajorVersion::latest()) + .behavior_version(crate::BehaviorVersion::latest()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), @@ -408,7 +408,7 @@ mod test { .body(SdkBody::from("")) .unwrap(), )); - let conf = crate::from_env_with_version(BehaviorMajorVersion::latest()) + let conf = crate::defaults(BehaviorVersion::latest()) .env(Env::from_slice(&[ ("AWS_ACCESS_KEY_ID", "123-key"), ("AWS_SECRET_ACCESS_KEY", "456"), @@ -457,7 +457,7 @@ mod test { .sleep_impl(SharedAsyncSleep::new(sleep)) .time_source(testing_time_source.clone()) .http_client(http_client) - .behavior_major_version(crate::BehaviorMajorVersion::latest()) + .behavior_version(crate::BehaviorVersion::latest()) .build(); let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![ Credentials::new( diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index 9fd24dc9d9c..9e0184826b4 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -9,7 +9,7 @@ allowed_external_types = [ "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::SharedIdentityCache", - "aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion", + "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", "aws_smithy_runtime_api::http::headers::Headers", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 1edcfffe293..6ea10806f16 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -17,7 +17,7 @@ pub use aws_credential_types::provider::SharedCredentialsProvider; use aws_smithy_async::rt::sleep::AsyncSleep; pub use aws_smithy_async::rt::sleep::SharedAsyncSleep; pub use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; +use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_smithy_runtime_api::client::http::HttpClient; pub use aws_smithy_runtime_api::client::http::SharedHttpClient; use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; @@ -63,7 +63,7 @@ pub struct SdkConfig { http_client: Option, use_fips: Option, use_dual_stack: Option, - behavior_major_version: Option, + behavior_version: Option, } /// Builder for AWS Shared Configuration @@ -85,7 +85,7 @@ pub struct Builder { http_client: Option, use_fips: Option, use_dual_stack: Option, - behavior_major_version: Option, + behavior_version: Option, } impl Builder { @@ -539,18 +539,15 @@ impl Builder { self } - /// Sets the [`BehaviorMajorVersion`] for the [`SdkConfig`] - pub fn behavior_major_version(mut self, behavior_major_version: BehaviorMajorVersion) -> Self { - self.set_behavior_major_version(Some(behavior_major_version)); + /// Sets the [`BehaviorVersion`] for the [`SdkConfig`] + pub fn behavior_version(mut self, behavior_version: BehaviorVersion) -> Self { + self.set_behavior_version(Some(behavior_version)); self } - /// Sets the [`BehaviorMajorVersion`] for the [`SdkConfig`] - pub fn set_behavior_major_version( - &mut self, - behavior_major_version: Option, - ) -> &mut Self { - self.behavior_major_version = behavior_major_version; + /// Sets the [`BehaviorVersion`] for the [`SdkConfig`] + pub fn set_behavior_version(&mut self, behavior_version: Option) -> &mut Self { + self.behavior_version = behavior_version; self } @@ -569,7 +566,7 @@ impl Builder { use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, time_source: self.time_source, - behavior_major_version: self.behavior_major_version, + behavior_version: self.behavior_version, } } } @@ -637,8 +634,8 @@ impl SdkConfig { } /// Behavior major version configured for this client - pub fn behavior_major_version(&self) -> Option { - self.behavior_major_version.clone() + pub fn behavior_version(&self) -> Option { + self.behavior_version.clone() } /// Config builder @@ -670,7 +667,7 @@ impl SdkConfig { http_client: self.http_client, use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, - behavior_major_version: self.behavior_major_version, + behavior_version: self.behavior_version, } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 7291b29937f..a118823e725 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -117,7 +117,7 @@ private class AwsFluentClientExtensions(private val codegenContext: ClientCodege /// the `sleep_impl` on the Config passed into this function to fix it. /// - This method will panic if the `sdk_config` is missing an HTTP connector. If you experience this panic, set the /// `http_connector` on the Config passed into this function to fix it. - /// - This method will panic if no `BehaviorMajorVersion` is provided. If you experience this panic, set `behavior_major_version` on the Config or enable the `behavior-version-latest` Cargo feature. + /// - This method will panic if no `BehaviorVersion` is provided. If you experience this panic, set `behavior_version` on the Config or enable the `behavior-version-latest` Cargo feature. ##[track_caller] pub fn new(sdk_config: &#{aws_types}::sdk_config::SdkConfig) -> Self { Self::from_conf(sdk_config.into()) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index 529ae27ae0b..bce62f58aa7 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -78,7 +78,7 @@ class GenericSmithySdkConfigSettings : ClientCodegenDecorator { ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client()); ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source()); - ${section.serviceConfigBuilder}.set_behavior_major_version(${section.sdkConfig}.behavior_major_version()); + ${section.serviceConfigBuilder}.set_behavior_version(${section.sdkConfig}.behavior_version()); if let Some(cache) = ${section.sdkConfig}.identity_cache() { ${section.serviceConfigBuilder}.set_identity_cache(cache); diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index 91978925444..68c59b43680 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -6,7 +6,7 @@ use aws_sdk_s3::config::IdentityCache; use aws_sdk_s3::config::{ - retry::RetryConfig, timeout::TimeoutConfig, BehaviorMajorVersion, Config, Credentials, Region, + retry::RetryConfig, timeout::TimeoutConfig, BehaviorVersion, Config, Credentials, Region, SharedAsyncSleep, Sleep, }; use aws_sdk_s3::primitives::SdkBody; @@ -26,7 +26,7 @@ use std::time::Duration; expected = "Enable the `rustls` crate feature or configure a HTTP client to fix this." )] async fn test_clients_from_sdk_config() { - aws_config::load_from_env_with_version(BehaviorMajorVersion::latest()).await; + aws_config::load_defaults(BehaviorVersion::latest()).await; } // This will fail due to lack of a connector when constructing the service client @@ -46,7 +46,7 @@ async fn test_clients_from_service_config() { .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) .sleep_impl(SharedAsyncSleep::new(StubSleep)) - .behavior_major_version(BehaviorMajorVersion::latest()) + .behavior_version(BehaviorVersion::latest()) .build(); // Creating the client shouldn't panic or error since presigning doesn't require a connector let client = aws_sdk_s3::Client::from_conf(config); @@ -65,7 +65,7 @@ async fn test_clients_from_service_config() { #[tokio::test] #[should_panic(expected = "Invalid client configuration: A behavior major version must be set")] -async fn test_missing_behavior_major_version() { +async fn test_missing_behavior_version() { use aws_sdk_s3::config::Region; let http_client = infallible_client_fn(|_req| http::Response::builder().body(SdkBody::empty()).unwrap()); @@ -95,7 +95,7 @@ async fn test_missing_async_sleep_time_source_retries() { .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::standard()) .timeout_config(TimeoutConfig::disabled()) - .behavior_major_version(BehaviorMajorVersion::latest()) + .behavior_version(BehaviorVersion::latest()) .build(); // should panic with a validation error @@ -116,7 +116,7 @@ async fn test_missing_async_sleep_time_source_timeouts() { .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::disabled()) - .behavior_major_version(BehaviorMajorVersion::latest()) + .behavior_version(BehaviorVersion::latest()) .timeout_config( TimeoutConfig::builder() .operation_timeout(Duration::from_secs(5)) @@ -144,7 +144,7 @@ async fn test_time_source_for_identity_cache() { .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::disabled()) .timeout_config(TimeoutConfig::disabled()) - .behavior_major_version(BehaviorMajorVersion::latest()) + .behavior_version(BehaviorVersion::latest()) .build(); // should panic with a validation error @@ -154,7 +154,7 @@ async fn test_time_source_for_identity_cache() { #[tokio::test] async fn behavior_mv_from_aws_config() { let (http_client, req) = capture_request(None); - let cfg = aws_config::from_env_with_version(BehaviorMajorVersion::v2023_11_09()) + let cfg = aws_config::defaults(BehaviorVersion::v2023_11_09()) .http_client(http_client) .retry_config(RetryConfig::disabled()) .credentials_provider(Credentials::for_tests()) @@ -188,7 +188,7 @@ async fn behavior_mv_from_client_construction() { let s3_client = aws_sdk_s3::Client::from_conf( aws_sdk_s3::config::Builder::from(&cfg) .credentials_provider(Credentials::for_tests()) - .behavior_major_version(aws_sdk_s3::config::BehaviorMajorVersion::v2023_11_09()) + .behavior_version(aws_sdk_s3::config::BehaviorVersion::v2023_11_09()) .build(), ); let _err = dbg!(s3_client diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index eccbe5af968..3bd3e27fe4d 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -17,7 +17,7 @@ fn test_client(update_builder: fn(Builder) -> Builder) -> (CaptureRequestReceive .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-4")) .http_client(http_client) - .behavior_major_version(aws_sdk_s3::config::BehaviorMajorVersion::latest()) + .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest()) .with_test_defaults(); let client = Client::from_conf(update_builder(config).build()); (captured_request, client) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index ada9cc44a80..3865d5a0ab2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -124,7 +124,7 @@ class FluentClientGenerator( /// /// - Retries or timeouts are enabled without a `sleep_impl` configured. /// - Identity caching is enabled without a `sleep_impl` and `time_source` configured. - /// - No `behavior_major_version` is provided. + /// - No `behavior_version` is provided. /// /// The panic message for each of these will have instructions on how to resolve them. ##[track_caller] @@ -469,7 +469,7 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru let mut configured_plugins = #{Vec}::new(); ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); ##[allow(unused_mut)] - let mut behavior_major_version = config.behavior_major_version.clone(); + let mut behavior_version = config.behavior_version.clone(); #{update_bmv} let mut plugins = #{RuntimePlugins}::new() @@ -477,7 +477,7 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru .with_client_plugins(#{default_plugins}( #{DefaultPluginParams}::new() .with_retry_partition_name(${codegenContext.serviceShape.sdkId().dq()}) - .with_behavior_major_version(behavior_major_version.expect(${behaviorVersionError.dq()})) + .with_behavior_version(behavior_version.expect(${behaviorVersionError.dq()})) )) // user config .with_client_plugin( @@ -504,12 +504,12 @@ private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): Ru "update_bmv" to featureGatedBlock(BehaviorVersionLatest) { rustTemplate( """ - if behavior_major_version.is_none() { - behavior_major_version = Some(#{BehaviorMajorVersion}::latest()); + if behavior_version.is_none() { + behavior_version = Some(#{BehaviorVersion}::latest()); } """, - "BehaviorMajorVersion" to api.resolve("client::behavior_version::BehaviorMajorVersion"), + "BehaviorVersion" to api.resolve("client::behavior_version::BehaviorVersion"), ) }, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index fdd57966895..e94480e05a0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -280,14 +280,14 @@ class ServiceConfigGenerator( "RuntimePlugin" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)), "SharedRuntimePlugin" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)), "runtime_plugin" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin"), - "BehaviorMajorVersion" to configReexport( - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::behavior_version::BehaviorMajorVersion"), + "BehaviorVersion" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::behavior_version::BehaviorVersion"), ), ) private fun behaviorMv() = writable { val docs = """ - /// Sets the [`behavior major version`](crate::config::BehaviorMajorVersion). + /// Sets the [`behavior major version`](crate::config::BehaviorVersion). /// /// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards /// compatible. For example, a change which introduces new default timeouts or a new retry-mode for @@ -297,10 +297,10 @@ class ServiceConfigGenerator( /// /// Set the behavior major version to `latest`. This is equivalent to enabling the `behavior-version-latest` cargo feature. /// ```no_run - /// use $moduleUseName::config::BehaviorMajorVersion; + /// use $moduleUseName::config::BehaviorVersion; /// /// let config = $moduleUseName::Config::builder() - /// .behavior_major_version(BehaviorMajorVersion::latest()) + /// .behavior_version(BehaviorVersion::latest()) /// // ... /// .build(); /// let client = $moduleUseName::Client::from_conf(config); @@ -308,10 +308,10 @@ class ServiceConfigGenerator( /// /// Customizing behavior major version: /// ```no_run - /// use $moduleUseName::config::BehaviorMajorVersion; + /// use $moduleUseName::config::BehaviorVersion; /// /// let config = $moduleUseName::Config::builder() - /// .behavior_major_version(BehaviorMajorVersion::v2023_11_09()) + /// .behavior_version(BehaviorVersion::v2023_11_09()) /// // ... /// .build(); /// let client = $moduleUseName::Client::from_conf(config); @@ -320,22 +320,22 @@ class ServiceConfigGenerator( rustTemplate( """ $docs - pub fn behavior_major_version(mut self, behavior_major_version: crate::config::BehaviorMajorVersion) -> Self { - self.set_behavior_major_version(Some(behavior_major_version)); + pub fn behavior_version(mut self, behavior_version: crate::config::BehaviorVersion) -> Self { + self.set_behavior_version(Some(behavior_version)); self } $docs - pub fn set_behavior_major_version(&mut self, behavior_major_version: Option) -> &mut Self { - self.behavior_major_version = behavior_major_version; + pub fn set_behavior_version(&mut self, behavior_version: Option) -> &mut Self { + self.behavior_version = behavior_version; self } /// Convenience method to set the latest behavior major version /// /// This is equivalent to enabling the `behavior-version-latest` Cargo feature - pub fn behavior_major_version_latest(mut self) -> Self { - self.set_behavior_major_version(Some(crate::config::BehaviorMajorVersion::latest())); + pub fn behavior_version_latest(mut self) -> Self { + self.set_behavior_version(Some(crate::config::BehaviorVersion::latest())); self } """, @@ -359,7 +359,7 @@ class ServiceConfigGenerator( cloneable: #{CloneableLayer}, pub(crate) runtime_components: #{RuntimeComponentsBuilder}, pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, - behavior_major_version: #{Option}<#{BehaviorMajorVersion}>, + behavior_version: #{Option}<#{BehaviorVersion}>, """, *codegenScope, ) @@ -383,7 +383,7 @@ class ServiceConfigGenerator( config: self.cloneable.clone(), runtime_components: self.runtime_components.clone(), runtime_plugins: self.runtime_plugins.clone(), - behavior_major_version: self.behavior_major_version.clone(), + behavior_version: self.behavior_version.clone(), } } """, @@ -401,7 +401,7 @@ class ServiceConfigGenerator( pub(crate) config: #{CloneableLayer}, pub(crate) runtime_components: #{RuntimeComponentsBuilder}, pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, - pub(crate) behavior_major_version: #{Option}<#{BehaviorMajorVersion}>, + pub(crate) behavior_version: #{Option}<#{BehaviorVersion}>, """, *codegenScope, ) @@ -419,7 +419,7 @@ class ServiceConfigGenerator( config: #{Default}::default(), runtime_components: #{RuntimeComponentsBuilder}::new("service config"), runtime_plugins: #{Default}::default(), - behavior_major_version: #{Default}::default(), + behavior_version: #{Default}::default(), } } """, @@ -508,7 +508,7 @@ class ServiceConfigGenerator( cloneable: layer, runtime_components: self.runtime_components, runtime_plugins: self.runtime_plugins, - behavior_major_version: self.behavior_major_version, + behavior_version: self.behavior_version, """, *codegenScope, ) diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index 039a43fa92e..5022659593f 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -66,7 +66,7 @@ - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md) - [RFC-0038: User-configurable retry classification](./rfcs/rfc0038_retry_classifier_customization.md) - [RFC-0039: Forward Compatible Errors](./rfcs/rfc0039_forward_compatible_errors.md) - - [RFC-0040: Behavior Major Versions](./rfcs/rfc0040_behavior_major_versions.md) + - [RFC-0040: Behavior Versions](./rfcs/rfc0040_behavior_versions.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/rfcs/overview.md b/design/src/rfcs/overview.md index de8a5496aea..11d036d5354 100644 --- a/design/src/rfcs/overview.md +++ b/design/src/rfcs/overview.md @@ -49,3 +49,4 @@ - [RFC-0037: The HTTP wrapper type](./rfc0037_http_wrapper.md) - [RFC-0038: Retry Classifier Customization](./rfc0038_retry_classifier_customization.md) - [RFC-0039: Forward Compatible Errors](./rfc0039_forward_compatible_errors.md) +- [RFC-0040: Behavior Versions](./rfc0040_behavior_versions.md) diff --git a/design/src/rfcs/rfc0040_behavior_major_versions.md b/design/src/rfcs/rfc0040_behavior_versions.md similarity index 73% rename from design/src/rfcs/rfc0040_behavior_major_versions.md rename to design/src/rfcs/rfc0040_behavior_versions.md index 2da4e7fa4a5..599540673f1 100644 --- a/design/src/rfcs/rfc0040_behavior_major_versions.md +++ b/design/src/rfcs/rfc0040_behavior_versions.md @@ -1,5 +1,5 @@ -RFC: Behavior Major Versions +RFC: Behavior Versions ============= @@ -11,7 +11,7 @@ RFC: Behavior Major Versions For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. -This RFC describes "Behavior Major Versions," a mechanism to allow SDKs to ship breaking behavioral changes like a new retry strategy, while allowing customers who rely on extremely consistent behavior to evolve at their own pace. +This RFC describes "Behavior Versions," a mechanism to allow SDKs to ship breaking behavioral changes like a new retry strategy, while allowing customers who rely on extremely consistent behavior to evolve at their own pace. By adding behavior major versions (BMV) to the Rust SDK, we will make it possible to ship new secure/recommended defaults to new customers without impacting legacy customers. @@ -21,7 +21,7 @@ Both legacy and new SDKs have the need to alter their SDKs default. Historically For new SDKs, a GA cutline presents difficult choices around timeline and features that can’t be added later without altering behavior. -Both of these use cases are addressed by Behavior Major Versions. +Both of these use cases are addressed by Behavior Versions. The user experience if this RFC is implemented @@ -30,7 +30,7 @@ The user experience if this RFC is implemented In the current version of the SDK, users can construct clients without indicating any sort of behavior major version. Once this RFC is implemented, there will be two ways to set a behavior major version: -1. In code via `aws_config::from_env_with_version(BehaviorMajorVersion::latest())` and `::Config::builder().behavior_major_version(...)`. This will also work for `config_override`. +1. In code via `aws_config::defaults(BehaviorVersion::latest())` and `::Config::builder().behavior_version(...)`. This will also work for `config_override`. 2. By enabling `behavior-version-latest` in either `aws-config` (which brings back `from_env`) OR a specific generated SDK crate ```toml @@ -41,16 +41,16 @@ aws-config = { version = "1", features = ["behavior-version-latest"] } aws-sdk-s3 = { version = "1", features = ["behavior-version-latest"] } ``` -If no `BehaviorMajorVersion` is set, the client will panic during construction. +If no `BehaviorVersion` is set, the client will panic during construction. -`BehaviorMajorVersion` is an opaque struct with initializers like `::latest()`, `::v2023_11_09()`. Downstream code can check the version by calling methods like `::supports_v1()` +`BehaviorVersion` is an opaque struct with initializers like `::latest()`, `::v2023_11_09()`. Downstream code can check the version by calling methods like `::supports_v1()` When new BMV are added, the previous version constructor will be marked as `deprecated`. This serves as a mechanism to alert customers that a new BMV exists to allow them to upgrade. How to actually implement this RFC ---------------------------------- -In order to implement this feature, we need to create a `BehaviorMajorVersion` struct, add config options to `SdkConfig` and `aws-config`, and wire it throughout the stack. +In order to implement this feature, we need to create a `BehaviorVersion` struct, add config options to `SdkConfig` and `aws-config`, and wire it throughout the stack. ```rust /// Behavior major-version of the client /// @@ -58,16 +58,16 @@ In order to implement this feature, we need to create a `BehaviorMajorVersion` s /// compatible. For example, a change which introduces new default timeouts or a new retry-mode for /// all operations might be the ideal behavior but could break existing applications. #[derive(Debug, Clone)] -pub struct BehaviorMajorVersion { +pub struct BehaviorVersion { // currently there is only 1 MV so we don't actually need anything in here. } ``` To help customers migrate, we are including `from_env` hooks that set `behavior-version-latest` that are _deprecated_. This allows customers to see that they are missing the required cargo feature and add it to remove the deprecation warning. -Internally, `BehaviorMajorVersion` will become an additional field on `::Config`. It is _not_ ever stored in the `ConfigBag` or in `RuntimePlugins`. +Internally, `BehaviorVersion` will become an additional field on `::Config`. It is _not_ ever stored in the `ConfigBag` or in `RuntimePlugins`. -When constructing the set of "default runtime plugins," the default runtime plugin parameters will be passed the `BehaviorMajorVersion`. This will select the correct runtime plugin. Logging will clearly indicate which plugin was selected. +When constructing the set of "default runtime plugins," the default runtime plugin parameters will be passed the `BehaviorVersion`. This will select the correct runtime plugin. Logging will clearly indicate which plugin was selected. Design Alternatives Considered ------------------------------ @@ -78,7 +78,7 @@ deemed too weak of a mechanism to ensure that customers aren't broken by unexpec Changes checklist ----------------- -- [x] Create `BehaviorMajorVersion` and the BMV runtime plugin +- [x] Create `BehaviorVersion` and the BMV runtime plugin - [x] Add BMV as a required runtime component - [x] Wire up setters throughout the stack - [x] Add tests of BMV (set via aws-config, cargo features & code params) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs index f8432d31ddf..e64a394edf9 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs @@ -11,9 +11,9 @@ /// compatible. For example, a change which introduces new default timeouts or a new retry-mode for /// all operations might be the ideal behavior but could break existing applications. #[derive(Debug, Clone)] -pub struct BehaviorMajorVersion {} +pub struct BehaviorVersion {} -impl BehaviorMajorVersion { +impl BehaviorVersion { /// This method will always return the latest major version. /// /// This is the recommend choice for customers who aren't reliant on extremely specific behavior @@ -23,7 +23,7 @@ impl BehaviorMajorVersion { /// If, however, you're writing a service that is very latency sensitive, or that has written /// code to tune Rust SDK behaviors, consider pinning to a specific major version. /// - /// The latest version is currently [`BehaviorMajorVersion::v2023_11_09`] + /// The latest version is currently [`BehaviorVersion::v2023_11_09`] pub fn latest() -> Self { Self {} } diff --git a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs index 4230b79c2bc..6e78d00cc5c 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs @@ -15,7 +15,7 @@ use crate::client::retries::RetryPartition; use aws_smithy_async::rt::sleep::default_async_sleep; use aws_smithy_async::time::SystemTimeSource; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::behavior_version::BehaviorMajorVersion; +use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_smithy_runtime_api::client::http::SharedHttpClient; use aws_smithy_runtime_api::client::runtime_components::{ RuntimeComponentsBuilder, SharedConfigValidator, @@ -171,7 +171,7 @@ pub fn default_identity_cache_plugin() -> Option { #[derive(Debug, Default)] pub struct DefaultPluginParams { retry_partition_name: Option>, - behavior_major_version: Option, + behavior_version: Option, } impl DefaultPluginParams { @@ -187,8 +187,8 @@ impl DefaultPluginParams { } /// Sets the behavior major version. - pub fn with_behavior_major_version(mut self, version: BehaviorMajorVersion) -> Self { - self.behavior_major_version = Some(version); + pub fn with_behavior_version(mut self, version: BehaviorVersion) -> Self { + self.behavior_version = Some(version); self } } From f78ee50d9b28c1d2337ca6236e592dfc243ae1c9 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Wed, 15 Nov 2023 23:12:47 +0000 Subject: [PATCH 265/331] Upgrade the smithy-rs runtime crates version to 0.100.0 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index edbcde3ad7b..dfb4d8f4faa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,10 +15,10 @@ org.gradle.jvmargs=-Xmx1024M # # TODO(GA): This is currently a placeholder for crates we are going to stabilize at the time of GA. # Until then, a value of this key can contain 0 for the major version. -smithy.rs.runtime.crate.stable.version=0.57.1 +smithy.rs.runtime.crate.stable.version=0.100.0 # Version number to use for the generated unstable runtime crates -smithy.rs.runtime.crate.unstable.version=0.57.1 +smithy.rs.runtime.crate.unstable.version=0.58.0 kotlin.code.style=official From 3cac667f7f8140cd546cdc0d49b359795bb654de Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Wed, 15 Nov 2023 23:14:58 +0000 Subject: [PATCH 266/331] Update changelog --- CHANGELOG.md | 47 +++++++ CHANGELOG.next.toml | 169 +------------------------ aws/SDK_CHANGELOG.next.json | 240 +++++++++++++++++++++++++----------- 3 files changed, 218 insertions(+), 238 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e113222c6d5..1f7f8f88259 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,51 @@ +November 15th, 2023 +=================== +**Breaking Changes:** +- :warning: (all, [smithy-rs#3138](https://github.com/smithy-lang/smithy-rs/issues/3138), [smithy-rs#3148](https://github.com/smithy-lang/smithy-rs/issues/3148)) [Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/smithy-rs/discussions/3154). HTTP request types moved, and a new HTTP response type was added. +- :warning: (all, [smithy-rs#3139](https://github.com/smithy-lang/smithy-rs/issues/3139)) `Message`, `Header`, `HeaderValue`, and `StrBytes` have been moved to `aws-smithy-types` from `aws-smithy-eventstream`. `Message::read_from` and `Message::write_to` remain in `aws-smithy-eventstream` but they are converted to free functions with the names `read_message_from` and `write_message_to` respectively. +- :warning: (client, [smithy-rs#3100](https://github.com/smithy-lang/smithy-rs/issues/3100), [smithy-rs#3114](https://github.com/smithy-lang/smithy-rs/issues/3114)) An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv). +- :warning: (all, [smithy-rs#3151](https://github.com/smithy-lang/smithy-rs/issues/3151)) Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. + + ```rust + async fn example() { + // when creating a client + let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build()); + } + ``` +- :warning: (client, [smithy-rs#3189](https://github.com/smithy-lang/smithy-rs/issues/3189)) Remove deprecated error kind type aliases. +- :warning: (client, [smithy-rs#3191](https://github.com/smithy-lang/smithy-rs/issues/3191)) Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you + might have: + ```rust + match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + GetStorageError::Unhandled(unhandled) if unhandled.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } + } + ``` + It should now look as follows: + ```rust + match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + err if err.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } + } + ``` + The `Unhandled` variant should never be referenced directly. + +**New this release:** +- :tada: (client, [aws-sdk-rust#780](https://github.com/awslabs/aws-sdk-rust/issues/780), [smithy-rs#3189](https://github.com/smithy-lang/smithy-rs/issues/3189)) Add `ProvideErrorMetadata` impl for service `Error` type. +- :bug: (client, [smithy-rs#3182](https://github.com/smithy-lang/smithy-rs/issues/3182), @codypenta) Fix rendering of @error structs when fields have default values + +**Contributors** +Thank you for your contributions! ❤ +- @codypenta ([smithy-rs#3182](https://github.com/smithy-lang/smithy-rs/issues/3182)) + + November 1st, 2023 ================== **New this release:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c344eda28d6..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,171 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[smithy-rs]] -message = """ -Fix rendering of @error structs when fields have default values -""" -references = ["smithy-rs#3182"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client"} -author = "codypenta" - -[[aws-sdk-rust]] -message = "Change `ByteStream::into_async_read` to return `AsyncBufRead`" -references = ["smithy-rs#3164"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "utkarshgupta137" - -[[aws-sdk-rust]] -message = "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added." -references = ["smithy-rs#3138", "smithy-rs#3148"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/smithy-rs/discussions/3154). HTTP request types moved, and a new HTTP response type was added." -references = ["smithy-rs#3138", "smithy-rs#3148"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "jdisanti" - -[[smithy-rs]] -message = """ -`Message`, `Header`, `HeaderValue`, and `StrBytes` have been moved to `aws-smithy-types` from `aws-smithy-eventstream`. `Message::read_from` and `Message::write_to` remain in `aws-smithy-eventstream` but they are converted to free functions with the names `read_message_from` and `write_message_to` respectively. -""" -references = ["smithy-rs#3139"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all"} -author = "ysaito1001" - -[[smithy-rs]] -message = """ -An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv). -""" -references = ["smithy-rs#3100", "smithy-rs#3114"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = """ -An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv). -""" -references = ["smithy-rs#3100", "smithy-rs#3114"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The `RequestId` trait has moved from the aws-http crate into aws-types." -references = ["smithy-rs#3160"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[aws-sdk-rust]] -message = """Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. - -```rust -async fn example() { - // with aws-config - let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09()); - - // when creating a client - let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build()); -} -```""" -references = ["smithy-rs#3151"] -author = "rcoh" -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = """Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. - -```rust -async fn example() { - // when creating a client - let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build()); -} -```""" -references = ["smithy-rs#3151"] -author = "rcoh" -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[aws-sdk-rust]] -message = "Add `ProvideErrorMetadata` impl for service `Error` type." -references = ["aws-sdk-rust#780", "smithy-rs#3189"] -meta = { "breaking" = false, "tada" = true, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "Add `ProvideErrorMetadata` impl for service `Error` type." -references = ["aws-sdk-rust#780", "smithy-rs#3189"] -meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "Remove deprecated error kind type aliases." -references = ["smithy-rs#3189"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "Remove deprecated error kind type aliases." -references = ["smithy-rs#3189"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = """ -Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you -might have: -```rust -match service_error.err() { - GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } - GetStorageError::Unhandled(unhandled) if unhandled.code() == Some("SomeUnmodeledErrorCode") { - // unhandled error handling - } - _ => { /* ... */ } -} -``` -It should now look as follows: -```rust -match service_error.err() { - GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } - err if err.code() == Some("SomeUnmodeledErrorCode") { - // unhandled error handling - } - _ => { /* ... */ } -} -``` -The `Unhandled` variant should never be referenced directly. -""" -references = ["smithy-rs#3191"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = """ -Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you -might have: -```rust -match service_error.err() { - GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } - GetStorageError::Unhandled(unhandled) if unhandled.code() == Some("SomeUnmodeledErrorCode") { - // unhandled error handling - } - _ => { /* ... */ } -} -``` -It should now look as follows: -```rust -match service_error.err() { - GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } - err if err.code() == Some("SomeUnmodeledErrorCode") { - // unhandled error handling - } - _ => { /* ... */ } -} -``` -The `Unhandled` variant should never be referenced directly. -""" -references = ["smithy-rs#3191"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 28b5124b11f..bb89534435c 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,21 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2687", - "smithy-rs#2694" - ], - "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", - "age": 5 - }, { "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", "meta": { @@ -32,7 +17,7 @@ "smithy-rs#2815" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Add accessors to Builders", @@ -46,7 +31,7 @@ "smithy-rs#2791" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Remove native-tls and add a migration guide.", @@ -60,7 +45,7 @@ "smithy-rs#2675" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", @@ -75,7 +60,7 @@ "aws-sdk-rust#703" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", @@ -89,7 +74,7 @@ "smithy-rs#2720" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", @@ -103,7 +88,7 @@ "smithy-rs#2673" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", @@ -117,7 +102,7 @@ "smithy-rs#2730" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", @@ -133,7 +118,7 @@ "aws-sdk-rust#2087" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", @@ -149,7 +134,7 @@ "smithy-rs#2846" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", @@ -163,7 +148,7 @@ "smithy-rs#2742" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Update MSRV to Rust 1.69.0", @@ -177,7 +162,7 @@ "smithy-rs#2893" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", @@ -194,7 +179,7 @@ "smithy-rs#2616" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", @@ -208,7 +193,7 @@ "smithy-rs#2652" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", @@ -222,7 +207,7 @@ "smithy-rs#2783" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", @@ -236,7 +221,7 @@ "smithy-rs#2845" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", @@ -250,7 +235,7 @@ "smithy-rs#2724" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", @@ -265,7 +250,7 @@ "aws-sdk-rust#338" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", @@ -279,7 +264,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", @@ -293,7 +278,7 @@ "smithy-rs#2877" ], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", @@ -305,7 +290,7 @@ "author": "jdisanti", "references": [], "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 4 + "age": 5 }, { "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", @@ -320,7 +305,7 @@ "aws-sdk-rust#862" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Fix requests to S3 with `no_credentials` set.", @@ -335,7 +320,7 @@ "aws-sdk-rust#864" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", @@ -350,7 +335,7 @@ "aws-sdk-rust#875" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", @@ -365,7 +350,7 @@ "aws-sdk-rust#872" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", @@ -379,7 +364,7 @@ "smithy-rs#2935" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 3 + "age": 4 }, { "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", @@ -393,7 +378,7 @@ "smithy-rs#2917" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", @@ -409,7 +394,7 @@ "aws-sdk-rust#699" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details.", @@ -423,7 +408,7 @@ "smithy-rs#3011" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", @@ -437,7 +422,7 @@ "smithy-rs#2921" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", @@ -451,7 +436,7 @@ "smithy-rs#2911" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929).", @@ -466,7 +451,7 @@ "aws-sdk-rust#536" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", @@ -480,7 +465,7 @@ "smithy-rs#2913" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Update MSRV to Rust 1.70.0", @@ -494,7 +479,7 @@ "smithy-rs#2948" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", @@ -509,7 +494,7 @@ "aws-sdk-rust#873" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Allow `no_credentials` to be used with all S3 operations.", @@ -524,7 +509,7 @@ "aws-sdk-rust#878" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", @@ -539,7 +524,7 @@ "smithy-rs#2951" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", @@ -555,7 +540,7 @@ "smithy-rs#2964" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Remove `once_cell` from public API.", @@ -569,7 +554,7 @@ "smithy-rs#2973" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Fix regression with redacting sensitive HTTP response bodies.", @@ -584,7 +569,7 @@ "smithy-rs#2972" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", @@ -598,7 +583,7 @@ "smithy-rs#2995" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", @@ -612,7 +597,7 @@ "smithy-rs#2978" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", @@ -626,7 +611,7 @@ "smithy-rs#1797" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", @@ -640,7 +625,7 @@ "smithy-rs#2983" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The IMDS Client builder's `build()` method is no longer async.", @@ -654,7 +639,7 @@ "smithy-rs#2997" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", @@ -668,7 +653,7 @@ "smithy-rs#3014" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", @@ -683,7 +668,7 @@ "smithy-rs#3007" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050).\n", @@ -698,7 +683,7 @@ "smithy-rs#3018" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", @@ -712,7 +697,7 @@ "smithy-rs#3055" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", @@ -726,7 +711,7 @@ "smithy-rs#3061" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", @@ -740,7 +725,7 @@ "smithy-rs#3065" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", @@ -754,7 +739,7 @@ "smithy-rs#3059" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", @@ -768,7 +753,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", @@ -782,7 +767,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 }, { "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", @@ -796,8 +781,123 @@ "smithy-rs#3077" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 2 + "age": 3 + }, + { + "message": "Change `ByteStream::into_async_read` to return `AsyncBufRead`", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "utkarshgupta137", + "references": [ + "smithy-rs#3164" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3138", + "smithy-rs#3148" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#3100", + "smithy-rs#3114" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "The `RequestId` trait has moved from the aws-http crate into aws-types.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3160" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n```rust\nasync fn example() {\n // with aws-config\n let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09());\n\n // when creating a client\n let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build());\n}\n```", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3151" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "Add `ProvideErrorMetadata` impl for service `Error` type.", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "jdisanti", + "references": [ + "aws-sdk-rust#780", + "smithy-rs#3189" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "Remove deprecated error kind type aliases.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3189" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 + }, + { + "message": "Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\nmight have:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nIt should now look as follows:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nThe `Unhandled` variant should never be referenced directly.\n", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3191" + ], + "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 1 } ], "aws-sdk-model": [] -} +} \ No newline at end of file From f63980cda330c2d76384d465692110f04d517092 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 16 Nov 2023 10:50:53 -0500 Subject: [PATCH 267/331] Fix AwsQuery target serialization (#3210) ## Motivation and Context - aws-sdk-rust#957 ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 +++- buildSrc/src/main/kotlin/CodegenTestCommon.kt | 17 ++++++--- codegen-client-test/build.gradle.kts | 9 ++++- .../aws-json-query-compat.smithy | 38 +++++++++++++++++++ .../smithy/protocols/AwsQueryCompatible.kt | 3 ++ 5 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 codegen-core/common-test-models/aws-json-query-compat.smithy diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..3d55ebc164c 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,10 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Fix broken serialization for SQS" +references = ["smithy-rs#3210", "aws-sdk-rust#957"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/buildSrc/src/main/kotlin/CodegenTestCommon.kt b/buildSrc/src/main/kotlin/CodegenTestCommon.kt index 12b3a543c1e..3a7008f8970 100644 --- a/buildSrc/src/main/kotlin/CodegenTestCommon.kt +++ b/buildSrc/src/main/kotlin/CodegenTestCommon.kt @@ -90,9 +90,11 @@ private fun codegenTests(properties: PropertyRetriever, allTests: List { AllCargoCommands } require(ret.isNotEmpty()) { - "None of the provided cargo commands (`$cargoCommandsOverride`) are valid cargo commands (`${AllCargoCommands.map { - it.toString - }}`)" + "None of the provided cargo commands (`$cargoCommandsOverride`) are valid cargo commands (`${ + AllCargoCommands.map { + it.toString + } + }`)" } return ret } @@ -137,6 +141,7 @@ fun Project.registerGenerateSmithyBuildTask( this.tasks.register("generateSmithyBuild") { description = "generate smithy-build.json" outputs.file(project.projectDir.resolve("smithy-build.json")) + // NOTE: This is not working. allCodegenTests.flatMap { it.imports }.forEach { inputs.file(project.projectDir.resolve(it)) } doFirst { diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index ae84542a3eb..606d868ccff 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -73,7 +73,11 @@ val allCodegenTests = listOf( ClientTest("aws.protocoltests.restxml#RestXml", "rest_xml", addMessageToErrors = false), ClientTest("aws.protocoltests.query#AwsQuery", "aws_query", addMessageToErrors = false), ClientTest("aws.protocoltests.ec2#AwsEc2", "ec2_query", addMessageToErrors = false), - ClientTest("aws.protocoltests.restxml.xmlns#RestXmlWithNamespace", "rest_xml_namespace", addMessageToErrors = false), + ClientTest( + "aws.protocoltests.restxml.xmlns#RestXmlWithNamespace", + "rest_xml_namespace", + addMessageToErrors = false, + ), ClientTest("aws.protocoltests.restxml#RestXmlExtras", "rest_xml_extras", addMessageToErrors = false), ClientTest( "aws.protocoltests.restxmlunwrapped#RestXmlExtrasUnwrappedErrors", @@ -108,7 +112,10 @@ val allCodegenTests = listOf( "pokemon-service-awsjson-client", dependsOn = listOf("pokemon-awsjson.smithy", "pokemon-common.smithy"), ), + ClientTest("aws.protocoltests.misc#QueryCompatService", "query-compat-test", dependsOn = listOf("aws-json-query-compat.smithy")), ).map(ClientTest::toCodegenTest) +// use this line to run just one test +// .filter { it.module == "query-compat-test" } project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) diff --git a/codegen-core/common-test-models/aws-json-query-compat.smithy b/codegen-core/common-test-models/aws-json-query-compat.smithy new file mode 100644 index 00000000000..4a98f70906a --- /dev/null +++ b/codegen-core/common-test-models/aws-json-query-compat.smithy @@ -0,0 +1,38 @@ +$version: "1.0" + +namespace aws.protocoltests.misc + +use aws.protocols#awsQueryCompatible +use aws.protocols#awsJson1_0 +use aws.protocols#awsQueryError +use smithy.test#httpRequestTests +@awsQueryCompatible +@awsJson1_0 +service QueryCompatService { + operations: [ + Operation + ] +} + +@httpRequestTests([{ + id: "BasicQueryCompatTest" + protocol: awsJson1_0, + method: "POST", + uri: "https://foo.com", + body: "{\"message\":\"hello!\"}", + bodyMedaType: "application/json", + params: { + message: "hello!" + }, + headers: { "x-amz-target": "QueryCompatService.Operation"} + + } +]) +operation Operation { + input: OperationInputOutput + output: OperationInputOutput +} + +structure OperationInputOutput { + message: String +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt index b37a0b57251..61861a369a7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt @@ -92,4 +92,7 @@ class AwsQueryCompatible( override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType = awsJson.parseEventStreamErrorMetadata(operationShape) + + override fun additionalRequestHeaders(operationShape: OperationShape): List> = + listOf("x-amz-target" to "${codegenContext.serviceShape.id.name}.${operationShape.id.name}") } From 84b8db34d5b4dfcbfc7d0e50d1e2c264ef91da36 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 16 Nov 2023 11:58:54 -0500 Subject: [PATCH 268/331] Fix a bug where we aren't checking the URL (#3211) ## Motivation and Context In #3059 there was an accidental deletion of a test ## Description Re-introduce checking the URL in protocol tests ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../protocol/ProtocolTestGenerator.kt | 17 +++++++++++++++++ .../protocol/ProtocolTestGeneratorTest.kt | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index f3ae7e782b2..133b0dddf72 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -233,6 +233,7 @@ class DefaultProtocolTestGenerator( checkHeaders(this, "http_request.headers()", httpRequestTestCase.headers) checkForbidHeaders(this, "http_request.headers()", httpRequestTestCase.forbidHeaders) checkRequiredHeaders(this, "http_request.headers()", httpRequestTestCase.requireHeaders) + if (protocolSupport.requestBodySerialization) { // "If no request body is defined, then no assertions are made about the body of the message." httpRequestTestCase.body.orNull()?.also { body -> @@ -248,6 +249,22 @@ class DefaultProtocolTestGenerator( if (!httpRequestTestCase.vendorParams.isEmpty) { logger.warning("Test case provided vendorParams but these were ignored") } + + rustTemplate( + """ + let uri: #{Uri} = http_request.uri().parse().expect("invalid URI sent"); + #{AssertEq}(http_request.method(), ${method.dq()}, "method was incorrect"); + #{AssertEq}(uri.path(), ${uri.dq()}, "path was incorrect"); + """, + *codegenScope, + ) + + resolvedHost.orNull()?.also { host -> + rustTemplate( + """#{AssertEq}(uri.host().expect("host should be set"), ${host.dq()});""", + *codegenScope, + ) + } } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index a9714a8a987..401e7b8007f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -327,6 +327,23 @@ class ProtocolTestGeneratorTest { err.message shouldContain "required query param missing" } + @Test + fun `test invalid path`() { + val err = assertThrows { + testService( + """ + .uri("/incorrect-path?required&Hi=Hello%20there") + .header("X-Greeting", "Hi") + .method("POST") + """, + ) + } + + // Verify the test actually ran + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "path was incorrect" + } + @Test fun `invalid header`() { val err = assertThrows { From bab31ab317ab49fd298e1633b2a5e0b413160af6 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Thu, 16 Nov 2023 12:22:46 -0600 Subject: [PATCH 269/331] update S3 timeout integration tests (#3214) This modernizes the timeouts tests a teeny bit and adds a non-event-stream upload timeout test. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../integration-tests/s3/tests/timeouts.rs | 76 +++++++++++++------ 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/aws/sdk/integration-tests/s3/tests/timeouts.rs b/aws/sdk/integration-tests/s3/tests/timeouts.rs index da324e80fae..7f0f509f00d 100644 --- a/aws/sdk/integration-tests/s3/tests/timeouts.rs +++ b/aws/sdk/integration-tests/s3/tests/timeouts.rs @@ -3,19 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::config::{timeout::TimeoutConfig, Region}; +use aws_sdk_s3::error::DisplayErrorContext; +use aws_sdk_s3::primitives::ByteStream; use aws_sdk_s3::types::{ CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization, OutputSerialization, }; -use aws_sdk_s3::Client; +use aws_sdk_s3::{Client, Config}; use aws_smithy_async::assert_elapsed; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep, TokioSleep}; use aws_smithy_runtime::client::http::test_util::NeverClient; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::timeout::TimeoutConfig; use std::future::Future; use std::net::SocketAddr; use std::time::Duration; @@ -23,19 +20,18 @@ use tokio::net::TcpListener; use tokio::time::timeout; #[tokio::test(start_paused = true)] -async fn test_timeout_service_ends_request_that_never_completes() { - let sdk_config = SdkConfig::builder() - .region(Region::from_static("us-east-2")) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) +async fn test_event_stream_request_times_out_if_server_is_unresponsive() { + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-2")) .http_client(NeverClient::new()) .timeout_config( TimeoutConfig::builder() - .operation_timeout(Duration::from_secs_f32(0.5)) + .operation_timeout(Duration::from_millis(500)) .build(), ) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let now = tokio::time::Instant::now(); @@ -64,6 +60,40 @@ async fn test_timeout_service_ends_request_that_never_completes() { .await .unwrap_err(); + let expected = "operation timeout (all attempts including retries) occurred after 500ms"; + let message = format!("{}", DisplayErrorContext(err)); + assert!( + message.contains(expected), + "expected '{message}' to contain '{expected}'" + ); + assert_elapsed!(now, Duration::from_millis(500)); +} + +#[tokio::test(start_paused = true)] +async fn test_upload_request_times_out_if_server_is_unresponsive() { + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-2")) + .http_client(NeverClient::new()) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_millis(500)) + .build(), + ) + .build(); + let client = Client::from_conf(config); + + let now = tokio::time::Instant::now(); + + let err = client + .put_object() + .bucket("aws-rust-sdk") + .key("sample_data.csv") + .body(ByteStream::from_static(b"Hello world!")) + .send() + .await + .unwrap_err(); + let expected = "operation timeout (all attempts including retries) occurred after 500ms"; let message = format!("{}", DisplayErrorContext(err)); assert!( @@ -99,18 +129,17 @@ async fn test_read_timeout() { let server_handle = tokio::spawn(server_fut); tokio::time::sleep(Duration::from_millis(100)).await; - let config = SdkConfig::builder() - .sleep_impl(default_async_sleep().unwrap()) + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-1")) .timeout_config( TimeoutConfig::builder() .read_timeout(Duration::from_millis(300)) .build(), ) .endpoint_url(format!("http://{server_addr}")) - .region(Some(Region::from_static("us-east-1"))) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .build(); - let client = Client::new(&config); + let client = Client::from_conf(config); if let Ok(result) = timeout( Duration::from_millis(1000), @@ -139,8 +168,9 @@ async fn test_read_timeout() { #[tokio::test] async fn test_connect_timeout() { - let config = SdkConfig::builder() - .sleep_impl(default_async_sleep().unwrap()) + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-1")) .timeout_config( TimeoutConfig::builder() .connect_timeout(Duration::from_millis(300)) @@ -150,10 +180,8 @@ async fn test_connect_timeout() { // Emulate a connect timeout error by hitting an unroutable IP "http://172.255.255.0:18104", ) - .region(Some(Region::from_static("us-east-1"))) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .build(); - let client = Client::new(&config); + let client = Client::from_conf(config); if let Ok(result) = timeout( Duration::from_millis(1000), From 31625f5bacce3d687b48f8de4323254b7e0dda8f Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 16 Nov 2023 13:33:42 -0500 Subject: [PATCH 270/331] Assorted cleanups of stable runtime crates (#3205) ## Motivation and Context Stable crates MUST only expose other stable crates. ## Description This: - fixes the remaining issues - adds a lint tool to be sure we don't expose unstable crates by accident in the future ## Testing CI run ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 20 +- .../aws-config/external-types.toml | 12 +- .../aws-config/src/imds/client.rs | 18 +- .../aws-config/src/imds/client/error.rs | 9 - .../aws-config/src/imds/credentials.rs | 9 +- aws/rust-runtime/aws-config/src/lib.rs | 1 - .../aws-config/src/sts/assume_role.rs | 9 +- .../aws-credential-types/Cargo.toml | 3 + aws/rust-runtime/aws-runtime/Cargo.toml | 3 + .../aws-runtime/external-types.toml | 8 - .../aws-runtime/src/request_info.rs | 8 +- aws/rust-runtime/aws-sigv4/Cargo.toml | 3 + .../aws-sigv4/external-types.toml | 2 +- .../aws-sigv4/src/http_request.rs | 2 +- .../aws-sigv4/src/http_request/sign.rs | 21 +- aws/sdk/integration-tests/s3/tests/no_auth.rs | 9 +- .../s3/tests/request_information_headers.rs | 3 +- .../timestreamquery/tests/endpoint_disco.rs | 4 +- aws/sdk/sdk-external-types.toml | 12 +- buildSrc/src/main/kotlin/CrateSet.kt | 77 +++++--- buildSrc/src/test/kotlin/CrateSetTest.kt | 20 +- rust-runtime/aws-smithy-runtime/Cargo.toml | 3 + .../aws-smithy-runtime/external-types.toml | 16 +- .../src/client/http/test_util/dvr.rs | 1 - .../src/client/http/test_util/dvr/replay.rs | 6 +- rust-runtime/aws-smithy-runtime/src/lib.rs | 1 + .../ci-build/sdk-lints/src/lint_cargo_toml.rs | 182 +++++++++++++++++- tools/ci-build/sdk-lints/src/main.rs | 7 +- 28 files changed, 333 insertions(+), 136 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..a99b8c59a8e 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,22 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[smithy-rs]] +message = "SignableRequest::apply_to_request in aws_sigv4 has been renamed `apply_to_request_http0x`" +references = ["smithy-rs#3205"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" + +[[aws-sdk-rust]] +message = "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead." +references = ["smithy-rs#3205"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" + +[[aws-sdk-rust]] +message = "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type" +references = ["smithy-rs#3205"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index bd0ada24610..19c1f6aab8f 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -7,13 +7,11 @@ allowed_external_types = [ "aws_credential_types::provider::ProvideCredentials", "aws_credential_types::provider::Result", "aws_credential_types::provider::SharedCredentialsProvider", - "aws_sdk_sts::types::_policy_descriptor_type::PolicyDescriptorType", "aws_smithy_async::rt::sleep::AsyncSleep", "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_http::endpoint", - "aws_smithy_http::endpoint::error::InvalidEndpointError", + "aws_smithy_runtime_api::box_error::BoxError", "aws_smithy_runtime::client::identity::cache::IdentityCache", "aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder", "aws_smithy_runtime_api::client::dns::ResolveDns", @@ -33,12 +31,4 @@ allowed_external_types = [ "aws_smithy_types::timeout::TimeoutConfig", "aws_smithy_types::timeout::TimeoutConfigBuilder", "aws_types::*", - "http::response::Response", - "http::uri::Uri", - "tower_service::Service", - - # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Decide if the following should be exposed - "hyper::client::connect::Connection", - "tokio::io::async_read::AsyncRead", - "tokio::io::async_write::AsyncWrite", ] diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index 1e4d7f02faa..154225b29e8 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -15,6 +15,7 @@ use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_runtime::user_agent::UserAgentInterceptor; use aws_smithy_runtime::client::orchestrator::operation::Operation; use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; +use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; use aws_smithy_runtime_api::client::endpoint::{ EndpointFuture, EndpointResolverParams, ResolveEndpoint, @@ -87,10 +88,9 @@ fn user_agent() -> AwsUserAgent { /// 1. Explicit configuration of `Endpoint` via the [builder](Builder): /// ```no_run /// use aws_config::imds::client::Client; -/// use http::Uri; /// # async fn docs() { /// let client = Client::builder() -/// .endpoint(Uri::from_static("http://customidms:456/")) +/// .endpoint("http://customidms:456/").expect("valid URI") /// .build(); /// # } /// ``` @@ -358,9 +358,10 @@ impl Builder { /// By default, the client will resolve an endpoint from the environment, AWS config, and endpoint mode. /// /// See [`Client`] for more information. - pub fn endpoint(mut self, endpoint: impl Into) -> Self { - self.endpoint = Some(EndpointSource::Explicit(endpoint.into())); - self + pub fn endpoint(mut self, endpoint: impl AsRef) -> Result { + let uri: Uri = endpoint.as_ref().parse()?; + self.endpoint = Some(EndpointSource::Explicit(uri)); + Ok(self) } /// Override the endpoint mode for [`Client`] @@ -992,7 +993,8 @@ pub(crate) mod test { let client = Client::builder() // 240.* can never be resolved - .endpoint(Uri::from_static("http://240.0.0.0")) + .endpoint("http://240.0.0.0") + .expect("valid uri") .build(); let now = SystemTime::now(); let resp = client @@ -1057,7 +1059,9 @@ pub(crate) mod test { .with_http_client(http_client); let mut imds_client = Client::builder().configure(&provider_config); if let Some(endpoint_override) = test_case.endpoint_override { - imds_client = imds_client.endpoint(endpoint_override.parse::().unwrap()); + imds_client = imds_client + .endpoint(endpoint_override) + .expect("invalid URI"); } if let Some(mode_override) = test_case.mode_override { diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index 05412d75ea0..7e418c28f8e 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -5,7 +5,6 @@ //! Error types for [`ImdsClient`](crate::imds::client::Client) -use aws_smithy_http::endpoint::error::InvalidEndpointError; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::result::SdkError; use std::error::Error; @@ -224,14 +223,6 @@ impl Error for BuildError { } } -impl From for BuildError { - fn from(err: InvalidEndpointError) -> Self { - Self { - kind: BuildErrorKind::InvalidEndpointUri(err.into()), - } - } -} - #[derive(Debug)] pub(super) enum TokenErrorKind { /// The token was invalid diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index 845a53b8777..896e66d6df2 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -421,7 +421,8 @@ mod test { async fn read_timeout_during_credentials_refresh_should_yield_last_retrieved_credentials() { let client = crate::imds::Client::builder() // 240.* can never be resolved - .endpoint(http::Uri::from_static("http://240.0.0.0")) + .endpoint("http://240.0.0.0") + .unwrap() .build(); let expected = aws_credential_types::Credentials::for_tests(); let provider = ImdsCredentialsProvider::builder() @@ -439,7 +440,8 @@ mod test { ) { let client = crate::imds::Client::builder() // 240.* can never be resolved - .endpoint(http::Uri::from_static("http://240.0.0.0")) + .endpoint("http://240.0.0.0") + .unwrap() .build(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) @@ -458,7 +460,8 @@ mod test { use aws_smithy_async::rt::sleep::AsyncSleep; let client = crate::imds::Client::builder() // 240.* can never be resolved - .endpoint(http::Uri::from_static("http://240.0.0.0")) + .endpoint("http://240.0.0.0") + .unwrap() .build(); let expected = aws_credential_types::Credentials::for_tests(); let provider = ImdsCredentialsProvider::builder() diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 76fa855538b..73d5106e9d2 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -96,7 +96,6 @@ //! # } //! ``` -pub use aws_smithy_http::endpoint; pub use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; // Re-export types from aws-types pub use aws_types::{ diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 6b827a8b7e3..9605cb0e075 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -161,8 +161,13 @@ impl AssumeRoleProviderBuilder { /// This parameter is optional. /// For more information, see /// [policy_arns](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::policy_arns) - pub fn policy_arns(mut self, policy_arns: Vec) -> Self { - self.policy_arns = Some(policy_arns); + pub fn policy_arns(mut self, policy_arns: Vec) -> Self { + self.policy_arns = Some( + policy_arns + .into_iter() + .map(|arn| PolicyDescriptorType::builder().arn(arn).build()) + .collect::>(), + ); self } diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index 33c1b2a91e2..865542ca0e1 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -26,3 +26,6 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index b28a0638817..b255e8b8421 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -45,3 +45,6 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-runtime/external-types.toml b/aws/rust-runtime/aws-runtime/external-types.toml index 0449ba09bbd..941f09767bf 100644 --- a/aws/rust-runtime/aws-runtime/external-types.toml +++ b/aws/rust-runtime/aws-runtime/external-types.toml @@ -1,14 +1,6 @@ allowed_external_types = [ - "aws_credential_types::*", "aws_sigv4::*", - "aws_smithy_http::*", "aws_smithy_types::*", "aws_smithy_runtime_api::*", "aws_types::*", - # TODO(audit-external-type-usage) We should newtype these or otherwise avoid exposing them - "http::header::name::HeaderName", - "http::header::value::HeaderValue", - "http::request::Request", - "http::response::Response", - "http::uri::Uri", ] diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index 1a2e066b49e..b07c3479d70 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -129,19 +129,19 @@ impl Intercept for RequestInfoInterceptor { /// retry information header that is sent with every request. The information conveyed by this /// header allows services to anticipate whether a client will time out or retry a request. #[derive(Default, Debug)] -pub struct RequestPairs { +struct RequestPairs { inner: Vec<(Cow<'static, str>, Cow<'static, str>)>, } impl RequestPairs { /// Creates a new `RequestPairs` builder. - pub fn new() -> Self { + fn new() -> Self { Default::default() } /// Adds a pair to the `RequestPairs` builder. /// Only strings that can be converted to header values are considered valid. - pub fn with_pair( + fn with_pair( mut self, pair: (impl Into>, impl Into>), ) -> Self { @@ -151,7 +151,7 @@ impl RequestPairs { } /// Converts the `RequestPairs` builder into a `HeaderValue`. - pub fn try_into_header_value(self) -> Result { + fn try_into_header_value(self) -> Result { self.try_into() } } diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index ce91ae52090..8a428c29241 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -69,3 +69,6 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-sigv4/external-types.toml b/aws/rust-runtime/aws-sigv4/external-types.toml index 6c80133e45d..94701a5285b 100644 --- a/aws/rust-runtime/aws-sigv4/external-types.toml +++ b/aws/rust-runtime/aws-sigv4/external-types.toml @@ -1,5 +1,5 @@ allowed_external_types = [ - # TODO(refactorHttp): Remove this and remove the signing helpers + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http0-compat` feature "http::request::Request", # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_types::event_stream::Message", diff --git a/aws/rust-runtime/aws-sigv4/src/http_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request.rs index 5616509eaf2..6bb6b9235c2 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request.rs @@ -49,7 +49,7 @@ //! let mut my_req = http::Request::new("..."); //! // Sign and then apply the signature to the request //! let (signing_instructions, _signature) = sign(signable_request, &signing_params)?.into_parts(); -//! signing_instructions.apply_to_request(&mut my_req); +//! signing_instructions.apply_to_request_http0x(&mut my_req); //! # Ok(()) //! # } //! ``` diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index 12d1e6cb522..2cef0dbd3ce 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -162,7 +162,7 @@ impl SigningInstructions { #[cfg(any(feature = "http0-compat", test))] /// Applies the instructions to the given `request`. - pub fn apply_to_request(self, request: &mut http::Request) { + pub fn apply_to_request_http0x(self, request: &mut http::Request) { let (new_headers, new_query) = self.into_parts(); for header in new_headers.into_iter() { let mut value = http::HeaderValue::from_str(&header.value).unwrap(); @@ -492,7 +492,7 @@ mod tests { ); let mut signed = original.as_http_request(); - out.output.apply_to_request(&mut signed); + out.output.apply_to_request_http0x(&mut signed); let expected = test::v4::test_signed_request("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); @@ -547,7 +547,8 @@ mod tests { let out = sign(signable_req, ¶ms).unwrap(); // Sigv4a signatures are non-deterministic, so we can't compare the signature directly. - out.output.apply_to_request(&mut req.as_http_request()); + out.output + .apply_to_request_http0x(&mut req.as_http_request()); let creds = params.credentials().unwrap(); let signing_key = @@ -777,7 +778,7 @@ mod tests { ); let mut signed = original.as_http_request(); - out.output.apply_to_request(&mut signed); + out.output.apply_to_request_http0x(&mut signed); let expected = test::v4::test_signed_request(test); assert_req_eq!(expected, signed); @@ -809,7 +810,7 @@ mod tests { ); let mut signed = original.as_http_request(); - out.output.apply_to_request(&mut signed); + out.output.apply_to_request_http0x(&mut signed); let expected = test::v4::test_signed_request_query_params("get-vanilla-query-order-key-case"); @@ -843,7 +844,7 @@ mod tests { ); let mut signed = original.as_http_request(); - out.output.apply_to_request(&mut signed); + out.output.apply_to_request_http0x(&mut signed); let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") @@ -904,7 +905,7 @@ mod tests { let mut signed = original.as_http_request(); out_with_session_token_but_excluded .output - .apply_to_request(&mut signed); + .apply_to_request_http0x(&mut signed); let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") @@ -961,7 +962,7 @@ mod tests { ); let mut signed = original.as_http_request(); - out.output.apply_to_request(&mut signed); + out.output.apply_to_request_http0x(&mut signed); let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") @@ -1031,7 +1032,7 @@ mod tests { .body("") .unwrap(); - instructions.apply_to_request(&mut request); + instructions.apply_to_request_http0x(&mut request); let get_header = |n: &str| request.headers().get(n).unwrap().to_str().unwrap(); assert_eq!("foo", get_header("some-header")); @@ -1051,7 +1052,7 @@ mod tests { .body("") .unwrap(); - instructions.apply_to_request(&mut request); + instructions.apply_to_request_http0x(&mut request); assert_eq!( "/some/path?some-param=f%26o%3Fo&some-other-param%3F=bar", diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs index f3029e4a1db..170332d00d6 100644 --- a/aws/sdk/integration-tests/s3/tests/no_auth.rs +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -4,7 +4,6 @@ */ use aws_sdk_s3::{Client, Config}; -use aws_smithy_protocol_test::MediaType; use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; @@ -34,7 +33,7 @@ async fn list_objects() { dbg!(result).expect("success"); http_client - .validate_body_and_headers(None, MediaType::Xml) + .validate_body_and_headers(None, "application/xml") .await .unwrap(); } @@ -66,7 +65,7 @@ async fn list_objects_v2() { dbg!(result).expect("success"); http_client - .validate_body_and_headers(None, MediaType::Xml) + .validate_body_and_headers(None, "application/xml") .await .unwrap(); } @@ -97,7 +96,7 @@ async fn head_object() { dbg!(result).expect("success"); http_client - .validate_body_and_headers(None, MediaType::Xml) + .validate_body_and_headers(None, "application/xml") .await .unwrap(); } @@ -128,7 +127,7 @@ async fn get_object() { dbg!(result).expect("success"); http_client - .validate_body_and_headers(None, MediaType::Xml) + .validate_body_and_headers(None, "application/xml") .await .unwrap(); } diff --git a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs index c0203093773..e12a4317a95 100644 --- a/aws/sdk/integration-tests/s3/tests/request_information_headers.rs +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -15,7 +15,6 @@ use aws_sdk_s3::Client; use aws_smithy_async::test_util::InstantSleep; use aws_smithy_async::test_util::ManualTimeSource; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_protocol_test::MediaType; use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime_api::box_error::BoxError; @@ -104,7 +103,7 @@ async fn three_retries_and_then_success() { let resp = resp.expect("valid e2e test"); assert_eq!(resp.name(), Some("test-bucket")); http_client - .full_validate(MediaType::Xml) + .full_validate("application/xml") .await .expect("failed") } diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index 42d54619711..c5a22c5d1bb 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime::client::http::test_util::dvr::{MediaType, ReplayingClient}; +use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; #[tokio::test] async fn do_endpoint_discovery() { @@ -75,7 +75,7 @@ async fn do_endpoint_discovery() { "content-type", "x-amz-target", ]), - MediaType::Json, + "application/json", ) .await .unwrap(); diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index a58f912dff7..0fa9bbc3a21 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -13,19 +13,11 @@ allowed_external_types = [ # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", - # Consider moving making this crate 1.0 "aws_smithy_runtime::client::identity::cache::IdentityCache", - ### All below this line need to be fixed: - # The following are not OK - "aws_http::request_id::RequestId", # move to aws-types - # `set_invocation_id_generator` — consider make pub(crate) or moving trait to AwsTypes "aws_runtime::invocation_id::SharedInvocationIdGenerator", "aws_runtime::invocation_id::InvocationIdGenerator", - # Pending fix in open PRs: - "aws_smithy_http::result::*", - - # Pending future fix - "aws_smithy_http::event_stream::*", + # Only exposed in transcribestreaming. This crate will be major version bumped if we MV aws_smithy_http + "aws_smithy_http::event_stream::sender::EventStreamSender", ] diff --git a/buildSrc/src/main/kotlin/CrateSet.kt b/buildSrc/src/main/kotlin/CrateSet.kt index d8a95838e60..72eb37d3fb2 100644 --- a/buildSrc/src/main/kotlin/CrateSet.kt +++ b/buildSrc/src/main/kotlin/CrateSet.kt @@ -16,36 +16,59 @@ object CrateSet { * stable = true */ - val AWS_SDK_RUNTIME = listOf( - Crate("aws-config", STABLE_VERSION_PROP_NAME), - Crate("aws-credential-types", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-endpoint", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-http", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-hyper", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-runtime", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-runtime-api", STABLE_VERSION_PROP_NAME), - Crate("aws-sig-auth", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-sigv4", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-types", STABLE_VERSION_PROP_NAME), + val StableCrates = setOf( + // AWS crates + "aws-config", + "aws-credential-types", + "aws-runtime", + "aws-runtime-api", + "aws-sigv4", + "aws-types", + + // smithy crates + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-runtime", + "aws-smithy-types", ) + val version = { name: String -> + when { + StableCrates.contains(name) -> STABLE_VERSION_PROP_NAME + else -> UNSTABLE_VERSION_PROP_NAME + } + } + + val AWS_SDK_RUNTIME = listOf( + "aws-config", + "aws-credential-types", + "aws-endpoint", + "aws-http", + "aws-hyper", + "aws-runtime", + "aws-runtime-api", + "aws-sig-auth", + "aws-sigv4", + "aws-types", + ).map { Crate(it, version(it)) } + val SMITHY_RUNTIME_COMMON = listOf( - Crate("aws-smithy-async", STABLE_VERSION_PROP_NAME), - Crate("aws-smithy-checksums", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-client", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-eventstream", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-http", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-http-auth", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-http-tower", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-json", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-protocol-test", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-query", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-runtime", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-runtime-api", STABLE_VERSION_PROP_NAME), - Crate("aws-smithy-types", STABLE_VERSION_PROP_NAME), - Crate("aws-smithy-types-convert", UNSTABLE_VERSION_PROP_NAME), - Crate("aws-smithy-xml", UNSTABLE_VERSION_PROP_NAME), - ) + "aws-smithy-async", + "aws-smithy-checksums", + "aws-smithy-client", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-http-auth", + "aws-smithy-http-tower", + "aws-smithy-json", + "aws-smithy-protocol-test", + "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-types-convert", + "aws-smithy-xml", + ).map { Crate(it, version(it)) } val AWS_SDK_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON diff --git a/buildSrc/src/test/kotlin/CrateSetTest.kt b/buildSrc/src/test/kotlin/CrateSetTest.kt index 59b1c825518..dacc75cc329 100644 --- a/buildSrc/src/test/kotlin/CrateSetTest.kt +++ b/buildSrc/src/test/kotlin/CrateSetTest.kt @@ -22,10 +22,10 @@ class CrateSetTest { * matches what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml` * for the corresponding crate. */ - private fun sutStabilityMatchesManifestStability(versionPropertyName: String, stabilityInManifest: Boolean) { + private fun sutStabilityMatchesManifestStability(versionPropertyName: String, stabilityInManifest: Boolean, crate: String) { when (stabilityInManifest) { - true -> assertEquals(STABLE_VERSION_PROP_NAME, versionPropertyName) - false -> assertEquals(UNSTABLE_VERSION_PROP_NAME, versionPropertyName) + true -> assertEquals(STABLE_VERSION_PROP_NAME, versionPropertyName, "Crate: $crate") + false -> assertEquals(UNSTABLE_VERSION_PROP_NAME, versionPropertyName, "Crate: $crate") } } @@ -41,17 +41,13 @@ class CrateSetTest { crateSet.forEach { val path = "$relativePathToRustRuntime/${it.name}/Cargo.toml" val contents = File(path).readText() - val manifest = try { - Toml().read(contents) + val isStable = try { + Toml().read(contents).getTable("package.metadata.smithy-rs-release-tooling")?.getBoolean("stable") ?: false } catch (e: java.lang.IllegalStateException) { - // Currently, `aws-sigv4` cannot be read as a `TOML` because of the following error: - // Invalid table definition on line 54: [target.'cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))'.dev-dependencies]] - logger.info("failed to read ${it.name} as TOML: $e") - Toml() + // sigv4 doesn't parse but it's stable now, hax hax hax + contents.trim().endsWith("[package.metadata.smithy-rs-release-tooling]\nstable = true") } - manifest.getTable("package.metadata.smithy-rs-release-tooling")?.entrySet()?.map { entry -> - sutStabilityMatchesManifestStability(it.versionPropertyName, entry.value as Boolean) - } ?: sutStabilityMatchesManifestStability(it.versionPropertyName, false) + sutStabilityMatchesManifestStability(it.versionPropertyName, isStable, it.name) } } diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index e33b334d77b..5ac41f45bd9 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -58,3 +58,6 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/rust-runtime/aws-smithy-runtime/external-types.toml b/rust-runtime/aws-smithy-runtime/external-types.toml index 0c0d03c3057..ef336fec784 100644 --- a/rust-runtime/aws-smithy-runtime/external-types.toml +++ b/rust-runtime/aws-smithy-runtime/external-types.toml @@ -1,24 +1,22 @@ allowed_external_types = [ "aws_smithy_runtime_api::*", "aws_smithy_async::*", - "aws_smithy_http::*", "aws_smithy_types::*", - # TODO(audit-external-type-usage) We should newtype these or otherwise avoid exposing them - "http::header::name::HeaderName", - "http::request::Request", - "http::response::Response", - "http::uri::Uri", - - # Used for creating hyper connectors + # Used for creating hyper connectors in the hyper feature and test-util features "tower_service::Service", # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature - "aws_smithy_protocol_test::MediaType", "bytes::bytes::Bytes", "serde::ser::Serialize", "serde::de::Deserialize", "hyper::client::connect::dns::Name", + # used by dvr + "http::request::Request", + "http::response::Response", + "http::uri::Uri", + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper-0-14-x` feature "hyper::client::client::Builder", diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index c23d711ae6b..c5f10961db2 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -20,7 +20,6 @@ use std::collections::HashMap; mod record; mod replay; -pub use aws_smithy_protocol_test::MediaType; pub use record::RecordingClient; pub use replay::ReplayingClient; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index 7607b53c08b..df06eab87bd 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -75,7 +75,7 @@ impl ReplayingClient { } /// Validate all headers and bodies - pub async fn full_validate(self, media_type: MediaType) -> Result<(), Box> { + pub async fn full_validate(self, media_type: &str) -> Result<(), Box> { self.validate_body_and_headers(None, media_type).await } @@ -95,13 +95,13 @@ impl ReplayingClient { pub async fn validate_body_and_headers( self, checked_headers: Option<&[&str]>, - media_type: MediaType, + media_type: &str, ) -> Result<(), Box> { self.validate_base(checked_headers, |b1, b2| { aws_smithy_protocol_test::validate_body( b1, std::str::from_utf8(b2).unwrap(), - media_type.clone(), + MediaType::from(media_type), ) .map_err(|e| Box::new(e) as _) }) diff --git a/rust-runtime/aws-smithy-runtime/src/lib.rs b/rust-runtime/aws-smithy-runtime/src/lib.rs index 2fbb5966576..3a7974e9b5d 100644 --- a/rust-runtime/aws-smithy-runtime/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime/src/lib.rs @@ -17,6 +17,7 @@ unreachable_pub, rust_2018_idioms )] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] /// Runtime support logic for generated clients. #[cfg(feature = "client")] diff --git a/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs b/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs index 2bb7610c5a7..c7dee81ed27 100644 --- a/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs +++ b/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs @@ -3,16 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::anchor::replace_anchor; -use crate::lint::LintError; -use crate::{all_cargo_tomls, Check, Fix, Lint}; +use std::collections::HashSet; +use std::fs::read_to_string; +use std::ops::Deref; +use std::path::{Path, PathBuf}; + use anyhow::{Context, Result}; use cargo_toml::{Manifest, Package}; use serde::de::DeserializeOwned; use serde::Deserialize; -use std::fs::read_to_string; -use std::ops::Deref; -use std::path::{Path, PathBuf}; + +use crate::anchor::replace_anchor; +use crate::lint::LintError; +use crate::{all_cargo_tomls, repo_root, Check, Fix, Lint}; macro_rules! return_errors { ($errs: expr) => { @@ -224,3 +227,170 @@ fn fix_docs_rs(contents: &str) -> Result { )?; Ok(new) } + +#[derive(Deserialize)] +struct SmithyRsMetadata { + #[serde(rename = "smithy-rs-release-tooling")] + smithy_rs_release_tooling: ToolingMetadata, +} + +#[derive(Deserialize)] +struct ToolingMetadata { + stable: bool, +} + +pub(crate) struct StableCratesExposeStableCrates { + stable_crates: HashSet, +} + +impl StableCratesExposeStableCrates { + pub(crate) fn new() -> Result { + let mut stable_crates = all_cargo_tomls()? + .flat_map(crate_is_stable) + .map(|c| c.replace('-', "_")) + .collect::>(); + for crte in [ + "tokio", + "hyper", + "http", + "bytes", + "http-body", + "aws-smithy-eventstream", + ] { + stable_crates.insert(crte.replace('-', "_")); + } + + Ok(Self { stable_crates }) + } +} +impl Lint for StableCratesExposeStableCrates { + fn name(&self) -> &str { + "StableCratesExposeStableCrates" + } + + fn files_to_check(&self) -> Result> { + Ok(all_cargo_tomls()?.collect()) + } +} + +pub(crate) struct SdkExternalLintsExposesStableCrates { + checker: StableCratesExposeStableCrates, +} + +impl SdkExternalLintsExposesStableCrates { + pub(crate) fn new() -> Result { + Ok(Self { + checker: StableCratesExposeStableCrates::new()?, + }) + } +} + +impl Lint for SdkExternalLintsExposesStableCrates { + fn name(&self) -> &str { + "sdk-external-types exposes stable types" + } + + fn files_to_check(&self) -> Result> { + Ok(vec![repo_root().join("aws/sdk/sdk-external-types.toml")]) + } +} + +impl Check for SdkExternalLintsExposesStableCrates { + fn check(&self, path: impl AsRef) -> Result> { + Ok(self + .checker + .check_external_types(path)? + .iter() + .filter(|it| it != &"aws_smithy_http") // currently exposed for transcribe streaming + .map(|crte| { + LintError::new(format!( + "the list of allowed SDK external types contained unstable crate {crte}" + )) + }) + .collect()) + } +} + +impl Check for StableCratesExposeStableCrates { + fn check(&self, path: impl AsRef) -> Result> { + let parsed = match package(path.as_ref()) { + // if the package doesn't parse, someone else figured that out + Err(_) => return Ok(vec![]), + // if there is something wrong, someone figured that out too + Ok(Err(_errs)) => return Ok(vec![]), + Ok(Ok(pkg)) => pkg, + }; + self.check_stable_crates_only_expose_stable_crates(parsed, path) + } +} + +#[derive(Deserialize)] +struct ExternalTypes { + allowed_external_types: Vec, +} + +impl StableCratesExposeStableCrates { + /// returns a list of unstable types exposed by this list + fn check_external_types(&self, external_types: impl AsRef) -> Result> { + let external_types = + toml::from_str::(&read_to_string(external_types.as_ref())?) + .context("invalid external types format")?; + let mut errs = vec![]; + for tpe in external_types.allowed_external_types { + let referenced_crate = tpe.split_once("::").map(|(pkg, _r)| pkg).unwrap_or(&tpe); + if !self.stable_crates.contains(referenced_crate) { + errs.push(referenced_crate.to_string()) + } + } + Ok(errs) + } + fn check_stable_crates_only_expose_stable_crates( + &self, + package: Package, + path: impl AsRef, + ) -> Result> { + // [package.metadata.smithy-rs-release-tooling] + if package + .metadata + .map(|meta| meta.smithy_rs_release_tooling.stable) + == Some(true) + { + let name = package.name; + Ok(self + .check_external_types(path.as_ref().parent().unwrap().join("external-types.toml"))? + .iter() + // TODO(tooling): When tooling allows, specify this at the crate level. These + // are gated in test-util + .filter(|tpe| { + !(name == "aws-smithy-runtime" + && ["tower_service", "serde"].contains(&tpe.as_str())) + }) + .map(|crte| { + LintError::new(format!( + "stable crate {name} exposed {crte} which is unstable" + )) + }) + .collect::>()) + } else { + Ok(vec![]) + } + } +} + +/// if the crate is stable, returns the name of the crate +fn crate_is_stable(path: impl AsRef) -> Option { + let parsed: Package = match package(path.as_ref()) { + // if the package doesn't parse, someone else figured that out + Err(_) => return None, + // if there is something wrong, someone figured that out too + Ok(Err(_errs)) => return None, + Ok(Ok(pkg)) => pkg, + }; + match parsed + .metadata + .map(|meta| meta.smithy_rs_release_tooling.stable) + { + Some(true) => Some(parsed.name), + _ => None, + } +} diff --git a/tools/ci-build/sdk-lints/src/main.rs b/tools/ci-build/sdk-lints/src/main.rs index 501b4852183..d05788387fd 100644 --- a/tools/ci-build/sdk-lints/src/main.rs +++ b/tools/ci-build/sdk-lints/src/main.rs @@ -6,7 +6,10 @@ use crate::changelog::ChangelogNext; use crate::copyright::CopyrightHeader; use crate::lint::{Check, Fix, Lint, LintError, Mode}; -use crate::lint_cargo_toml::{CrateAuthor, CrateLicense, DocsRs}; +use crate::lint_cargo_toml::{ + CrateAuthor, CrateLicense, DocsRs, SdkExternalLintsExposesStableCrates, + StableCratesExposeStableCrates, +}; use crate::readmes::{ReadmesExist, ReadmesHaveFooters}; use crate::todos::TodosHaveContext; use anyhow::{bail, Context, Result}; @@ -135,6 +138,8 @@ fn main() -> Result<()> { if todos || all { errs.extend(TodosHaveContext.check_all()?); } + errs.extend(StableCratesExposeStableCrates::new()?.check_all()?); + errs.extend(SdkExternalLintsExposesStableCrates::new()?.check_all()?); ok(errs)? } Args::Fix { From 4411131197db7018b2937cafd90638477bf7435e Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Thu, 16 Nov 2023 20:07:33 +0000 Subject: [PATCH 271/331] Constant time comparison for SigV4a (#3174) Closes #3162 ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed Co-authored-by: Russell Cohen --- aws/rust-runtime/aws-sigv4/Cargo.toml | 4 +++- aws/rust-runtime/aws-sigv4/src/sign/v4a.rs | 23 +++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index 8a428c29241..1746c03b1eb 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -13,7 +13,7 @@ default = ["sign-http"] http0-compat = ["dep:http"] sign-http = ["dep:http", "dep:percent-encoding", "dep:form_urlencoded"] sign-eventstream = ["dep:aws-smithy-eventstream"] -sigv4a = ["dep:p256", "dep:num-bigint", "dep:zeroize", "dep:ring"] +sigv4a = ["dep:p256", "dep:crypto-bigint", "dep:subtle", "dep:zeroize", "dep:ring"] [dependencies] aws-credential-types = { path = "../aws-credential-types" } @@ -33,6 +33,8 @@ percent-encoding = { version = "2.1", optional = true } regex = "1.5" ring = { version = "0.17.5", optional = true } sha2 = "0.10" +crypto-bigint = { version = "0.5.4", optional = true } +subtle = { version = "2.5.0", optional = true } time = "0.3.5" tracing = "0.1" zeroize = { version = "^1", optional = true } diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs index 9c2b8cb9802..a8cb3f9538f 100644 --- a/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs @@ -5,7 +5,7 @@ use aws_smithy_runtime_api::client::identity::Identity; use bytes::{BufMut, BytesMut}; -use num_bigint::BigInt; +use crypto_bigint::{CheckedAdd, CheckedSub, Encoding, U256}; use once_cell::sync::Lazy; use p256::ecdsa::signature::Signer; use p256::ecdsa::{Signature, SigningKey}; @@ -14,16 +14,13 @@ use std::time::SystemTime; use zeroize::Zeroizing; const ALGORITHM: &[u8] = b"AWS4-ECDSA-P256-SHA256"; -static BIG_N_MINUS_2: Lazy = Lazy::new(|| { +static BIG_N_MINUS_2: Lazy = Lazy::new(|| { // The N value from section 3.2.1.3 of https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf // Used as the N value for the algorithm described in section A.2.2 of https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf // *(Basically a prime number blessed by the NSA for use in p256)* - const ORDER: &[u32] = &[ - 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xBCE6FAAD, 0xA7179E84, 0xF3B9CAC2, - 0xFC632551, - ]; - let big_n = BigInt::from_slice(num_bigint::Sign::Plus, ORDER); - big_n - BigInt::from(2i32) + const ORDER: U256 = + U256::from_be_hex("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551"); + ORDER.checked_sub(&U256::from(2u32)).unwrap() }); /// Calculates a Sigv4a signature @@ -64,14 +61,16 @@ pub fn generate_signing_key(access_key: &str, secret_access_key: &str) -> impl A let tag = ring::hmac::sign(&key, &buf); let tag = &tag.as_ref()[0..32]; - let k0 = BigInt::from_bytes_be(num_bigint::Sign::Plus, tag); + let k0 = U256::from_be_bytes(tag.try_into().expect("convert to [u8; 32]")); // It would be more secure for this to be a constant time comparison, but because this // is for client usage, that's not as big a deal. if k0 <= *BIG_N_MINUS_2 { - let pk = k0 + BigInt::from(1i32); - let d = Zeroizing::new(pk.to_bytes_be().1); - break SigningKey::from_bytes(&d).unwrap(); + let pk = k0 + .checked_add(&U256::ONE) + .expect("k0 is always less than U256::MAX"); + let d = Zeroizing::new(pk.to_be_bytes()); + break SigningKey::from_bytes(d.as_ref()).unwrap(); } *counter = counter From 68eade9f6b8d8185c4a9b64669a4d5847c5df69c Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 16 Nov 2023 14:19:50 -0600 Subject: [PATCH 272/331] Add a job to release workflow that checks the current actor for prod run (#3207) ## Motivation and Context In our GitHub [release workflow](https://github.com/smithy-lang/smithy-rs/actions/workflows/release.yml), we require production runs to be triggered by the bot user `aws-sdk-rust-ci`, which has special permissions. There are times we have triggered a production run by our own actors and later realized it wasn't the bot user. Although there is a way to recover from that (logging in as the bot user and rerunning the failed step), it's so much easier to add the initial check to the workflow, especially when that's cheap to add. This PR, therefore, adds a job `check-actor-for-prod-run` to the workflow. Note that if it's a dry-run, `check-actor-for-prod-run` will be skipped and the rest of the jobs in the workflow will be executed normally. ## Testing Tested the following scenarios using the release workflow: - making sure that `check-actor-for-prod-run` will be skipped in a dry-run and the dry-run should succeed ([link](https://github.com/smithy-lang/smithy-rs/actions/runs/6886643811)) - making sure that `check-actor-for-prod-run` will kick in for a prod run and let the prod run fail if run by me ([link](https://github.com/smithy-lang/smithy-rs/actions/runs/6886709963/job/18732793128)) - making sure that `check-actor-for-prod-run` will kick in for a prod run and let the prod run proceed if run by the bot user ([link](https://github.com/smithy-lang/smithy-rs/actions/runs/6886738756/job/18732857316) - I canceled the run as soon as I conformed the check worked) ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/release.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a76a41ec1c1..600e4179099 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,12 +41,37 @@ on: default: true jobs: + check-actor-for-prod-run: + name: Check actor for prod run + if: inputs.dry_run == false + runs-on: ubuntu-latest + env: + ACTOR: ${{ github.actor }} + steps: + - name: Check actor for prod run + run: | + set -e + + if [ "${ACTOR}" != "aws-sdk-rust-ci" ]; then + echo "Error: The current actor is '${ACTOR}' but only 'aws-sdk-rust-ci' is allowed to run a prod release workflow." + exit 1 + fi + + echo "The current actor is 'aws-sdk-rust-ci', continuing with the workflow." + # We'll need to build a base image to work against if: # - a release was kicked off before the image build step triggered by a push to the release branch/main completed # - a dry-run release was kicked off against a feature branch to test automation changes # This job will be a no-op if an image had already been built. acquire-base-image: name: Acquire Base Image + needs: + - check-actor-for-prod-run + # We need `always` here otherwise this job won't run if the previous job has been skipped + # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867 + if: | + always() && + (needs.check-actor-for-prod-run.result == 'success' || needs.check-actor-for-prod-run.result == 'skipped') runs-on: smithy_ubuntu-latest_16-core steps: - uses: actions/checkout@v3 From e6369509ed85f0debfa0c8873afe9eba6d40d207 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 16 Nov 2023 16:04:20 -0500 Subject: [PATCH 273/331] Pre-emptively update the S3 model with transform (#3213) ## Motivation and Context S3 models is being updated but this creates issues with examples-compilation. This fixes that issue by pre-emptively updating the model so we can synchronize codegen and examples updates ## Testing - [x] generated S3, verified the same compilation errors ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 +++ .../s3/MakeS3BoolsAndNumbersOptional.kt | 38 +++++++++++++++++++ .../rustsdk/customize/s3/S3Decorator.kt | 1 + .../s3/tests/select-object-content.rs | 4 +- .../integration-tests/s3/tests/size-type.rs | 2 +- 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index a99b8c59a8e..789c340c3ba 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -28,3 +28,9 @@ message = "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of a references = ["smithy-rs#3205"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "rcoh" + +[[aws-sdk-rust]] +message = "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues." +references = ["smithy-rs#3213"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt new file mode 100644 index 00000000000..b8bd4056aa6 --- /dev/null +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt @@ -0,0 +1,38 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize.s3 + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.AbstractShapeBuilder +import software.amazon.smithy.model.shapes.BooleanShape +import software.amazon.smithy.model.shapes.NumberShape +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.traits.DefaultTrait +import software.amazon.smithy.model.transform.ModelTransformer + +/** + * The s3 model is being updated but if we consume that model update, then we'll run into an issue with examples compilation + * + * This "pre-updates" the model so we can fix examples without requiring complex coordination + */ +class MakeS3BoolsAndNumbersOptional { + fun processModel(model: Model): Model { + val updates = arrayListOf() + for (struct in model.structureShapes) { + for (member in struct.allMembers.values) { + val target = model.expectShape(member.target) + val boolTarget = target as? BooleanShape + val numberTarget = target as? NumberShape + if (boolTarget != null || numberTarget != null) { + updates.add(member.toBuilder().removeTrait(DefaultTrait.ID).build()) + val builder: AbstractShapeBuilder<*, *> = Shape.shapeToBuilder(target) + updates.add(builder.removeTrait(DefaultTrait.ID).build()) + } + } + } + return ModelTransformer.create().replaceShapes(model, updates) + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt index 0cf1c196ff2..3a003398111 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt @@ -88,6 +88,7 @@ class S3Decorator : ClientCodegenDecorator { ) // enable optional auth for operations commonly used with public buckets .let(AddOptionalAuth()::transform) + .let(MakeS3BoolsAndNumbersOptional()::processModel) override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { return listOf( diff --git a/aws/sdk/integration-tests/s3/tests/select-object-content.rs b/aws/sdk/integration-tests/s3/tests/select-object-content.rs index 4ba1e491636..d9eb6d6df4c 100644 --- a/aws/sdk/integration-tests/s3/tests/select-object-content.rs +++ b/aws/sdk/integration-tests/s3/tests/select-object-content.rs @@ -67,7 +67,9 @@ async fn test_success() { let stats = stats.details.unwrap(); received.push(format!( "scanned:{},processed:{},returned:{}", - stats.bytes_scanned, stats.bytes_processed, stats.bytes_returned + stats.bytes_scanned.unwrap(), + stats.bytes_processed.unwrap(), + stats.bytes_returned.unwrap() )) } SelectObjectContentEventStream::End(_) => {} diff --git a/aws/sdk/integration-tests/s3/tests/size-type.rs b/aws/sdk/integration-tests/s3/tests/size-type.rs index d790b0a6229..5179fb0387b 100644 --- a/aws/sdk/integration-tests/s3/tests/size-type.rs +++ b/aws/sdk/integration-tests/s3/tests/size-type.rs @@ -12,5 +12,5 @@ fn size_type() { // Should only compile if the type is correctly customized let object = Object::builder().size(size).build(); - assert_eq!(size, object.size); + assert_eq!(Some(size), object.size); } From 2415f0f3a9a6a05aae615215ffe6f22443ee384d Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Thu, 16 Nov 2023 15:05:35 -0600 Subject: [PATCH 274/331] Update URI in `aws-json-query-compat.smithy` to pass the failed test --- codegen-core/common-test-models/aws-json-query-compat.smithy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen-core/common-test-models/aws-json-query-compat.smithy b/codegen-core/common-test-models/aws-json-query-compat.smithy index 4a98f70906a..b3e1cf03750 100644 --- a/codegen-core/common-test-models/aws-json-query-compat.smithy +++ b/codegen-core/common-test-models/aws-json-query-compat.smithy @@ -18,7 +18,7 @@ service QueryCompatService { id: "BasicQueryCompatTest" protocol: awsJson1_0, method: "POST", - uri: "https://foo.com", + uri: "/", body: "{\"message\":\"hello!\"}", bodyMedaType: "application/json", params: { From 681bf77733a242e01458e87381a0700616c918da Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Thu, 16 Nov 2023 23:30:37 +0000 Subject: [PATCH 275/331] Upgrade the smithy-rs runtime crates version to 0.101.0 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index dfb4d8f4faa..0be6e40b934 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,10 +15,10 @@ org.gradle.jvmargs=-Xmx1024M # # TODO(GA): This is currently a placeholder for crates we are going to stabilize at the time of GA. # Until then, a value of this key can contain 0 for the major version. -smithy.rs.runtime.crate.stable.version=0.100.0 +smithy.rs.runtime.crate.stable.version=0.101.0 # Version number to use for the generated unstable runtime crates -smithy.rs.runtime.crate.unstable.version=0.58.0 +smithy.rs.runtime.crate.unstable.version=0.59.0 kotlin.code.style=official From 77227c8ad52c3638f177eae9246b4622707e7325 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Thu, 16 Nov 2023 23:32:31 +0000 Subject: [PATCH 276/331] Update changelog --- CHANGELOG.md | 6 + CHANGELOG.next.toml | 26 +-- aws/SDK_CHANGELOG.next.json | 411 ++++++++---------------------------- 3 files changed, 90 insertions(+), 353 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f7f8f88259..84914d97302 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ +November 16th, 2023 +=================== +**Breaking Changes:** +- :warning: (client, [smithy-rs#3205](https://github.com/smithy-lang/smithy-rs/issues/3205)) SignableRequest::apply_to_request in aws_sigv4 has been renamed `apply_to_request_http0x` + + November 15th, 2023 =================== **Breaking Changes:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 789c340c3ba..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,28 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[smithy-rs]] -message = "SignableRequest::apply_to_request in aws_sigv4 has been renamed `apply_to_request_http0x`" -references = ["smithy-rs#3205"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead." -references = ["smithy-rs#3205"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[aws-sdk-rust]] -message = "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type" -references = ["smithy-rs#3205"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues." -references = ["smithy-rs#3213"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index bb89534435c..32bac5a9237 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,293 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "relevantsam", - "references": [ - "smithy-rs#2815" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Add accessors to Builders", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "davidsouther", - "references": [ - "smithy-rs#2791" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Remove native-tls and add a migration guide.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "82marbag", - "references": [ - "smithy-rs#2675" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2722", - "aws-sdk-rust#703" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2720" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2673" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "cholcombe973", - "references": [ - "smithy-rs#2730" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2728", - "smithy-rs#2262", - "aws-sdk-rust#2087" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#2707", - "aws-sdk-rust#114", - "smithy-rs#2846" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2742" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Update MSRV to Rust 1.69.0", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "Velfi", - "references": [ - "smithy-rs#2893" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "thomas-k-cameron", - "references": [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "thomas-k-cameron", - "references": [ - "smithy-rs#2652" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2783" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2845" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2724" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "aws-sdk-rust#579", - "aws-sdk-rust#338" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2877" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2877" - ], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, - { - "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [], - "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", - "age": 5 - }, { "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", "meta": { @@ -305,7 +18,7 @@ "aws-sdk-rust#862" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 4 + "age": 5 }, { "message": "Fix requests to S3 with `no_credentials` set.", @@ -320,7 +33,7 @@ "aws-sdk-rust#864" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 4 + "age": 5 }, { "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", @@ -335,7 +48,7 @@ "aws-sdk-rust#875" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 4 + "age": 5 }, { "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", @@ -350,7 +63,7 @@ "aws-sdk-rust#872" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 4 + "age": 5 }, { "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", @@ -364,7 +77,7 @@ "smithy-rs#2935" ], "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 4 + "age": 5 }, { "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", @@ -378,7 +91,7 @@ "smithy-rs#2917" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", @@ -394,7 +107,7 @@ "aws-sdk-rust#699" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details.", @@ -408,7 +121,7 @@ "smithy-rs#3011" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", @@ -422,7 +135,7 @@ "smithy-rs#2921" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", @@ -436,7 +149,7 @@ "smithy-rs#2911" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929).", @@ -451,7 +164,7 @@ "aws-sdk-rust#536" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", @@ -465,7 +178,7 @@ "smithy-rs#2913" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Update MSRV to Rust 1.70.0", @@ -479,7 +192,7 @@ "smithy-rs#2948" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", @@ -494,7 +207,7 @@ "aws-sdk-rust#873" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Allow `no_credentials` to be used with all S3 operations.", @@ -509,7 +222,7 @@ "aws-sdk-rust#878" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", @@ -524,7 +237,7 @@ "smithy-rs#2951" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", @@ -540,7 +253,7 @@ "smithy-rs#2964" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Remove `once_cell` from public API.", @@ -554,7 +267,7 @@ "smithy-rs#2973" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Fix regression with redacting sensitive HTTP response bodies.", @@ -569,7 +282,7 @@ "smithy-rs#2972" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", @@ -583,7 +296,7 @@ "smithy-rs#2995" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", @@ -597,7 +310,7 @@ "smithy-rs#2978" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", @@ -611,7 +324,7 @@ "smithy-rs#1797" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", @@ -625,7 +338,7 @@ "smithy-rs#2983" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The IMDS Client builder's `build()` method is no longer async.", @@ -639,7 +352,7 @@ "smithy-rs#2997" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", @@ -653,7 +366,7 @@ "smithy-rs#3014" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", @@ -668,7 +381,7 @@ "smithy-rs#3007" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050).\n", @@ -683,7 +396,7 @@ "smithy-rs#3018" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", @@ -697,7 +410,7 @@ "smithy-rs#3055" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", @@ -711,7 +424,7 @@ "smithy-rs#3061" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", @@ -725,7 +438,7 @@ "smithy-rs#3065" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", @@ -739,7 +452,7 @@ "smithy-rs#3059" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", @@ -753,7 +466,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", @@ -767,7 +480,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", @@ -781,7 +494,7 @@ "smithy-rs#3077" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 3 + "age": 4 }, { "message": "Change `ByteStream::into_async_read` to return `AsyncBufRead`", @@ -795,7 +508,7 @@ "smithy-rs#3164" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added.", @@ -810,7 +523,7 @@ "smithy-rs#3148" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n", @@ -825,7 +538,7 @@ "smithy-rs#3114" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "The `RequestId` trait has moved from the aws-http crate into aws-types.", @@ -839,7 +552,7 @@ "smithy-rs#3160" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n```rust\nasync fn example() {\n // with aws-config\n let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09());\n\n // when creating a client\n let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build());\n}\n```", @@ -853,7 +566,7 @@ "smithy-rs#3151" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "Add `ProvideErrorMetadata` impl for service `Error` type.", @@ -868,7 +581,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "Remove deprecated error kind type aliases.", @@ -882,7 +595,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 1 + "age": 2 }, { "message": "Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\nmight have:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nIt should now look as follows:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nThe `Unhandled` variant should never be referenced directly.\n", @@ -896,6 +609,48 @@ "smithy-rs#3191" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", + "age": 2 + }, + { + "message": "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3205" + ], + "since-commit": "681bf77733a242e01458e87381a0700616c918da", + "age": 1 + }, + { + "message": "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3205" + ], + "since-commit": "681bf77733a242e01458e87381a0700616c918da", + "age": 1 + }, + { + "message": "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3213" + ], + "since-commit": "681bf77733a242e01458e87381a0700616c918da", "age": 1 } ], From 7d1e321148c5ebb33b70097933a2b4ccb40f0aaa Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 16 Nov 2023 17:11:42 -0800 Subject: [PATCH 277/331] Only output dev preview warning messages for 0.x versions (#3219) _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/SDK_README.md.hb | 15 +- aws/rust-runtime/aws-config/README.md | 5 +- .../smithy/rustsdk/AwsCrateDocsDecorator.kt | 26 ++- .../test/kotlin/AwsCrateDocsDecoratorTest.kt | 53 ++++++ .../test/kotlin/SdkCodegenIntegrationTest.kt | 53 ++++++ .../amazon/smithy/rustsdk/TestUtil.kt | 1 + .../core/testutil/CodegenIntegrationTest.kt | 2 + .../smithy/rust/codegen/core/testutil/Rust.kt | 3 +- .../src/subcommand/hydrate_readme.rs | 168 +++++++++++++++++- 9 files changed, 300 insertions(+), 26 deletions(-) diff --git a/aws/SDK_README.md.hb b/aws/SDK_README.md.hb index cf0897c35b4..f9aea16f0bf 100644 --- a/aws/SDK_README.md.hb +++ b/aws/SDK_README.md.hb @@ -5,6 +5,7 @@ It gets instantiated and copied into the build artifacts by the `aws:sdk:assembl Available template arguments: - `{{sdk_version_}}` (e.g., `{{sdk_version_aws_config}}` for the `aws-config` crate): the version number of the given crate (just the number, no `v` prefix) - `{{msrv}}`: The MSRV Rust compiler version (just the number, no `v` prefix) +- `{{warning_banner}}`: Show the production warning banner --}} Some services have generated types with properties that have a default value of zero. This can cause invalid requests if the service expects a value > 0. ## Description Adds a customization that removes the default value for services with this issue. ## Testing - Added a test for the customization to make sure defaults were removed. - Generated clients for the impacted services and verified the expected types had the default value removed. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 8 ++- .../smithy/rustsdk/AwsCodegenDecorator.kt | 2 + .../rustsdk/customize/RemoveDefaults.kt | 58 +++++++++++++++++++ .../customize/RemoveDefaultsDecorator.kt | 44 ++++++++++++++ .../rustsdk/customize/RemoveDefaultsTest.kt | 41 +++++++++++++ 5 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt create mode 100644 aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt create mode 100644 aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..cbc9f1f0ed0 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,10 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests." +references = ["smithy-rs#3217"] +meta = { "breaking" = true, "tada" = false, "bug" = true } +author = "milesziemer" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt index 59ef326a2fd..5e694c1cead 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.DocsRsMe import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator import software.amazon.smithy.rustsdk.customize.DisabledAuthDecorator +import software.amazon.smithy.rustsdk.customize.RemoveDefaultsDecorator import software.amazon.smithy.rustsdk.customize.apigateway.ApiGatewayDecorator import software.amazon.smithy.rustsdk.customize.applyDecorators import software.amazon.smithy.rustsdk.customize.ec2.Ec2Decorator @@ -53,6 +54,7 @@ val DECORATORS: List = listOf( RecursionDetectionDecorator(), InvocationIdDecorator(), RetryInformationHeaderDecorator(), + RemoveDefaultsDecorator(), ), // Service specific decorators diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt new file mode 100644 index 00000000000..bebfd639b23 --- /dev/null +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt @@ -0,0 +1,58 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.AbstractShapeBuilder +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.traits.DefaultTrait +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.utils.ToSmithyBuilder +import java.util.logging.Logger + +/** + * Removes default values from specified root shapes, and any members that target those + * root shapes. + */ +object RemoveDefaults { + private val logger: Logger = Logger.getLogger(javaClass.name) + + fun processModel(model: Model, removeDefaultsFrom: Set): Model { + val removedRootDefaults: MutableSet = HashSet() + val removedRootDefaultsModel = ModelTransformer.create().mapShapes(model) { shape -> + shape.letIf(shouldRemoveRootDefault(shape, removeDefaultsFrom)) { + logger.info("Removing default trait from root $shape") + removedRootDefaults.add(shape.id) + removeDefault(shape) + } + } + + return ModelTransformer.create().mapShapes(removedRootDefaultsModel) { shape -> + shape.letIf(shouldRemoveMemberDefault(shape, removedRootDefaults)) { + logger.info("Removing default trait from member $shape") + removeDefault(shape) + } + } + } + + private fun shouldRemoveRootDefault(shape: Shape, removeDefaultsFrom: Set): Boolean { + return shape !is MemberShape && removeDefaultsFrom.contains(shape.id) && shape.hasTrait() + } + + private fun shouldRemoveMemberDefault(shape: Shape, removeDefaultsFrom: Set): Boolean { + return shape is MemberShape && removeDefaultsFrom.contains(shape.target) && shape.hasTrait() + } + + private fun removeDefault(shape: Shape): Shape { + return ((shape as ToSmithyBuilder<*>).toBuilder() as AbstractShapeBuilder<*, *>) + .removeTrait(DefaultTrait.ID) + .build() + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt new file mode 100644 index 00000000000..2bae9dd1f9f --- /dev/null +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt @@ -0,0 +1,44 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.core.util.shapeId +import java.util.logging.Logger + +/** + * Removes default values from certain shapes, and any member that targets those shapes, + * for some services where the default value causes serialization issues, validation + * issues, or other unexpected behavior. + */ +class RemoveDefaultsDecorator : ClientCodegenDecorator { + override val name: String = "RemoveDefaults" + override val order: Byte = 0 + private val logger: Logger = Logger.getLogger(javaClass.name) + + // Service shape id -> Shape id of each root shape to remove the default from. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/3220): Remove this customization after model updates. + private val removeDefaults = mapOf( + "com.amazonaws.emrserverless#AwsToledoWebService".shapeId() to setOf( + // Service expects this to have a min value > 0 + "com.amazonaws.emrserverless#WorkerCounts".shapeId(), + ), + ) + + private fun applies(service: ServiceShape) = + removeDefaults.containsKey(service.id) + + override fun transformModel(service: ServiceShape, model: Model, settings: ClientRustSettings): Model { + if (!applies(service)) { + return model + } + logger.info("Removing invalid defaults from ${service.id}") + return RemoveDefaults.processModel(model, removeDefaults[service.id]!!) + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt new file mode 100644 index 00000000000..266c3d6be3b --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize + +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.IntegerShape +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.traits.DefaultTrait +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.lookup +import software.amazon.smithy.rust.codegen.core.util.shapeId + +internal class RemoveDefaultsTest { + @Test + fun `defaults should be removed`() { + val removeDefaults = setOf( + "test#Bar".shapeId(), + ) + val baseModel = """ + namespace test + + structure Foo { + bar: Bar = 0 + } + + @default(0) + integer Bar + + """.asSmithyModel(smithyVersion = "2.0") + val model = RemoveDefaults.processModel(baseModel, removeDefaults) + val member = model.lookup("test#Foo\$bar") + member.hasTrait() shouldBe false + val root = model.lookup("test#Bar") + root.hasTrait() shouldBe false + } +} From 768237a539feafa01a31c9686760334b401f5c7d Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Fri, 17 Nov 2023 09:01:18 -0600 Subject: [PATCH 279/331] Feature: Stalled stream protection (#3202) [See the upgrade guide for this feature to learn more.](https://github.com/awslabs/aws-sdk-rust/discussions/956) The breaking change is to the `MinimumThroughputBody::new` method. ## Motivation and Context #1562 ## Description https://github.com/awslabs/aws-sdk-rust/discussions/956 ## Testing I added several tests ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 38 +++ .../aws-config/external-types.toml | 3 +- aws/rust-runtime/aws-config/src/lib.rs | 37 ++ .../src/stalled_stream_protection.rs | 9 + .../aws-types/external-types.toml | 3 +- aws/rust-runtime/aws-types/src/sdk_config.rs | 81 +++++ .../smithy/rustsdk/SdkConfigDecorator.kt | 4 + .../dynamodb/tests/endpoints.rs | 3 + .../retries-with-client-rate-limiting.rs | 6 +- .../dynamodb/tests/shared-config.rs | 3 +- .../dynamodb/tests/timeouts.rs | 7 +- .../tests/client-construction.rs | 5 +- aws/sdk/integration-tests/s3/Cargo.toml | 1 - .../s3/tests/alternative-async-runtime.rs | 3 +- .../s3/tests/bucket-required.rs | 3 +- .../integration-tests/s3/tests/checksums.rs | 4 +- .../s3/tests/client_construction.rs | 5 +- .../s3/tests/stalled-stream-protection.rs | 318 ++++++++++++++++++ .../timestreamquery/tests/endpoint_disco.rs | 3 +- .../client/smithy/RustClientCodegenPlugin.kt | 2 + .../OperationRuntimePluginGenerator.kt | 12 +- ...lledStreamProtectionConfigCustomization.kt | 126 +++++++ .../aws-smithy-runtime-api/src/client.rs | 3 + .../src/client/stalled_stream_protection.rs | 109 ++++++ rust-runtime/aws-smithy-runtime/src/client.rs | 3 + .../aws-smithy-runtime/src/client/defaults.rs | 56 +++ .../client/http/body/minimum_throughput.rs | 28 +- .../minimum_throughput/http_body_0_4_x.rs | 74 ++-- .../http/body/minimum_throughput/options.rs | 161 +++++++++ .../body/minimum_throughput/throughput.rs | 33 +- .../src/client/identity/cache/lazy.rs | 1 + .../src/client/stalled_stream_protection.rs | 138 ++++++++ 32 files changed, 1219 insertions(+), 63 deletions(-) create mode 100644 aws/rust-runtime/aws-config/src/stalled_stream_protection.rs create mode 100644 aws/sdk/integration-tests/s3/tests/stalled-stream-protection.rs create mode 100644 codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt create mode 100644 rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index cbc9f1f0ed0..c1936e7a7d3 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,6 +11,44 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" +[[aws-sdk-rust]] +message = """ +Add configurable stalled-stream protection for downloads. + +When making HTTP calls, +it's possible for a connection to 'stall out' and emit no more data due to server-side issues. +In the event this happens, it's desirable for the stream to error out as quickly as possible. +While timeouts can protect you from this issue, they aren't adaptive to the amount of data +being sent and so must be configured specifically for each use case. When enabled, stalled-stream +protection will ensure that bad streams error out quickly, regardless of the amount of data being +downloaded. + +Protection is enabled by default for all clients but can be configured or disabled. +See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details. +""" +references = ["smithy-rs#3202"] +meta = { "breaking" = true, "tada" = true, "bug" = false } +author = "Velfi" + +[[smithy-rs]] +message = """ +Add configurable stalled-stream protection for downloads. + +When making HTTP calls, +it's possible for a connection to 'stall out' and emit no more data due to server-side issues. +In the event this happens, it's desirable for the stream to error out as quickly as possible. +While timeouts can protect you from this issue, they aren't adaptive to the amount of data +being sent and so must be configured specifically for each use case. When enabled, stalled-stream +protection will ensure that bad streams error out quickly, regardless of the amount of data being +downloaded. + +Protection is enabled by default for all clients but can be configured or disabled. +See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details. +""" +references = ["smithy-rs#3202"] +meta = { "breaking" = true, "tada" = true, "bug" = false, "target" = "client" } +author = "Velfi" + [[aws-sdk-rust]] message = "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests." references = ["smithy-rs#3217"] diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index 19c1f6aab8f..38a34bd7864 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -14,15 +14,16 @@ allowed_external_types = [ "aws_smithy_runtime_api::box_error::BoxError", "aws_smithy_runtime::client::identity::cache::IdentityCache", "aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder", + "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", "aws_smithy_runtime_api::client::dns::ResolveDns", "aws_smithy_runtime_api::client::dns::SharedDnsResolver", "aws_smithy_runtime_api::client::http::HttpClient", "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::ResolveIdentity", - "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", "aws_smithy_runtime_api::client::orchestrator::HttpResponse", "aws_smithy_runtime_api::client::result::SdkError", + "aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig", "aws_smithy_types::body::SdkBody", "aws_smithy_types::retry", "aws_smithy_types::retry::*", diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 73d5106e9d2..e9b2d1890fb 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -134,6 +134,7 @@ pub mod retry; mod sensitive_command; #[cfg(feature = "sso")] pub mod sso; +pub mod stalled_stream_protection; pub(crate) mod standard_property; pub mod sts; pub mod timeout; @@ -216,6 +217,7 @@ mod loader { use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_smithy_runtime_api::client::http::HttpClient; use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; + use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; @@ -259,6 +261,7 @@ mod loader { use_fips: Option, use_dual_stack: Option, time_source: Option, + stalled_stream_protection_config: Option, env: Option, fs: Option, behavior_version: Option, @@ -611,6 +614,39 @@ mod loader { self } + /// Override the [`StalledStreamProtectionConfig`] used to build [`SdkConfig`](aws_types::SdkConfig). + /// + /// This configures stalled stream protection. When enabled, download streams + /// that stop (stream no data) for longer than a configured grace period will return an error. + /// + /// By default, streams that transmit less than one byte per-second for five seconds will + /// be cancelled. + /// + /// _Note_: When an override is provided, the default implementation is replaced. + /// + /// # Examples + /// ```no_run + /// # async fn create_config() { + /// use aws_config::stalled_stream_protection::StalledStreamProtectionConfig; + /// use std::time::Duration; + /// let config = aws_config::from_env() + /// .stalled_stream_protection( + /// StalledStreamProtectionConfig::enabled() + /// .grace_period(Duration::from_secs(1)) + /// .build() + /// ) + /// .load() + /// .await; + /// # } + /// ``` + pub fn stalled_stream_protection( + mut self, + stalled_stream_protection_config: StalledStreamProtectionConfig, + ) -> Self { + self.stalled_stream_protection_config = Some(stalled_stream_protection_config); + self + } + /// Set configuration for all sub-loaders (credentials, region etc.) /// /// Update the `ProviderConfig` used for all nested loaders. This can be used to override @@ -757,6 +793,7 @@ mod loader { builder.set_endpoint_url(self.endpoint_url); builder.set_use_fips(use_fips); builder.set_use_dual_stack(use_dual_stack); + builder.set_stalled_stream_protection(self.stalled_stream_protection_config); builder.build() } } diff --git a/aws/rust-runtime/aws-config/src/stalled_stream_protection.rs b/aws/rust-runtime/aws-config/src/stalled_stream_protection.rs new file mode 100644 index 00000000000..1e47905305c --- /dev/null +++ b/aws/rust-runtime/aws-config/src/stalled_stream_protection.rs @@ -0,0 +1,9 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Stalled stream protection configuration + +// Re-export from aws-smithy-types +pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index 9e0184826b4..1e4e0c863de 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -5,11 +5,12 @@ allowed_external_types = [ "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", + "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", "aws_smithy_runtime_api::client::http::HttpClient", "aws_smithy_runtime_api::client::http::SharedHttpClient", "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", "aws_smithy_runtime_api::client::identity::SharedIdentityCache", - "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", + "aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig", "aws_smithy_runtime_api::http::headers::Headers", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 6ea10806f16..1da2bfe6574 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -21,6 +21,7 @@ use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_smithy_runtime_api::client::http::HttpClient; pub use aws_smithy_runtime_api::client::http::SharedHttpClient; use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; +pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; use aws_smithy_runtime_api::shared::IntoShared; pub use aws_smithy_types::retry::RetryConfig; pub use aws_smithy_types::timeout::TimeoutConfig; @@ -60,6 +61,7 @@ pub struct SdkConfig { sleep_impl: Option, time_source: Option, timeout_config: Option, + stalled_stream_protection_config: Option, http_client: Option, use_fips: Option, use_dual_stack: Option, @@ -82,6 +84,7 @@ pub struct Builder { sleep_impl: Option, time_source: Option, timeout_config: Option, + stalled_stream_protection_config: Option, http_client: Option, use_fips: Option, use_dual_stack: Option, @@ -567,10 +570,82 @@ impl Builder { use_dual_stack: self.use_dual_stack, time_source: self.time_source, behavior_version: self.behavior_version, + stalled_stream_protection_config: self.stalled_stream_protection_config, } } } +impl Builder { + /// Set the [`StalledStreamProtectionConfig`] to configure protection for stalled streams. + /// + /// This configures stalled stream protection. When enabled, download streams + /// that stall (stream no data) for longer than a configured grace period will return an error. + /// + /// _Note:_ Stalled stream protection requires both a sleep implementation and a time source + /// in order to work. When enabling stalled stream protection, make sure to set + /// - A sleep impl with [Self::sleep_impl] or [Self::set_sleep_impl]. + /// - A time source with [Self::time_source] or [Self::set_time_source]. + /// + /// # Examples + /// ```rust + /// use std::time::Duration; + /// use aws_types::SdkConfig; + /// pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; + /// + /// let stalled_stream_protection_config = StalledStreamProtectionConfig::enabled() + /// .grace_period(Duration::from_secs(1)) + /// .build(); + /// let config = SdkConfig::builder() + /// .stalled_stream_protection(stalled_stream_protection_config) + /// .build(); + /// ``` + pub fn stalled_stream_protection( + mut self, + stalled_stream_protection_config: StalledStreamProtectionConfig, + ) -> Self { + self.set_stalled_stream_protection(Some(stalled_stream_protection_config)); + self + } + + /// Set the [`StalledStreamProtectionConfig`] to configure protection for stalled streams. + /// + /// This configures stalled stream protection. When enabled, download streams + /// that stall (stream no data) for longer than a configured grace period will return an error. + /// + /// By default, streams that transmit less than one byte per-second for five seconds will + /// be cancelled. + /// + /// _Note:_ Stalled stream protection requires both a sleep implementation and a time source + /// in order to work. When enabling stalled stream protection, make sure to set + /// - A sleep impl with [Self::sleep_impl] or [Self::set_sleep_impl]. + /// - A time source with [Self::time_source] or [Self::set_time_source]. + /// + /// # Examples + /// ```rust + /// use std::time::Duration; + /// use aws_types::sdk_config::{SdkConfig, Builder}; + /// pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; + /// + /// fn set_stalled_stream_protection(builder: &mut Builder) { + /// let stalled_stream_protection_config = StalledStreamProtectionConfig::enabled() + /// .grace_period(Duration::from_secs(1)) + /// .build(); + /// builder.set_stalled_stream_protection(Some(stalled_stream_protection_config)); + /// } + /// + /// let mut builder = SdkConfig::builder(); + /// set_stalled_stream_protection(&mut builder); + /// let config = builder.build(); + /// ``` + pub fn set_stalled_stream_protection( + &mut self, + stalled_stream_protection_config: Option, + ) -> &mut Self { + self.stalled_stream_protection_config = stalled_stream_protection_config; + self + } +} + impl SdkConfig { /// Configured region pub fn region(&self) -> Option<&Region> { @@ -633,6 +708,11 @@ impl SdkConfig { self.use_dual_stack } + /// Configured stalled stream protection + pub fn stalled_stream_protection(&self) -> Option { + self.stalled_stream_protection_config.clone() + } + /// Behavior major version configured for this client pub fn behavior_version(&self) -> Option { self.behavior_version.clone() @@ -668,6 +748,7 @@ impl SdkConfig { use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, behavior_version: self.behavior_version, + stalled_stream_protection_config: self.stalled_stream_protection_config, } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index bce62f58aa7..69a1299d738 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -79,6 +79,10 @@ class GenericSmithySdkConfigSettings : ClientCodegenDecorator { ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client()); ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source()); ${section.serviceConfigBuilder}.set_behavior_version(${section.sdkConfig}.behavior_version()); + // setting `None` here removes the default + if let Some(config) = ${section.sdkConfig}.stalled_stream_protection() { + ${section.serviceConfigBuilder}.set_stalled_stream_protection(Some(config)); + } if let Some(cache) = ${section.sdkConfig}.identity_cache() { ${section.serviceConfigBuilder}.set_identity_cache(cache); diff --git a/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs b/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs index 2f0180b4494..e430d60d437 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs @@ -17,6 +17,9 @@ async fn expect_uri( let conf = customize( aws_sdk_dynamodb::config::Builder::from(&conf) .credentials_provider(Credentials::for_tests()) + .stalled_stream_protection( + aws_sdk_dynamodb::config::StalledStreamProtectionConfig::disabled(), + ) .http_client(http_client), ) .build(); diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index f565e887c5d..834ec850f2d 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -3,7 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; +use aws_sdk_dynamodb::config::{ + Credentials, Region, SharedAsyncSleep, StalledStreamProtectionConfig, +}; use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; use aws_smithy_async::test_util::instant_time_and_sleep; use aws_smithy_async::time::SharedTimeSource; @@ -65,6 +67,7 @@ async fn test_adaptive_retries_with_no_throttling_errors() { let http_client = StaticReplayClient::new(events); let config = aws_sdk_dynamodb::Config::builder() + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .retry_config( @@ -120,6 +123,7 @@ async fn test_adaptive_retries_with_throttling_errors() { let http_client = StaticReplayClient::new(events); let config = aws_sdk_dynamodb::Config::builder() + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .retry_config( diff --git a/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs b/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs index 0ce9d0c9deb..02786fe0afb 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_dynamodb::config::{Credentials, Region}; +use aws_sdk_dynamodb::config::{Credentials, Region, StalledStreamProtectionConfig}; use aws_smithy_runtime::client::http::test_util::capture_request; use http::Uri; @@ -12,6 +12,7 @@ use http::Uri; async fn shared_config_testbed() { let shared_config = aws_types::SdkConfig::builder() .region(Region::new("us-east-4")) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .build(); let (http_client, request) = capture_request(None); let conf = aws_sdk_dynamodb::config::Builder::from(&shared_config) diff --git a/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs b/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs index abd63673a5f..d7a41750dc8 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs @@ -6,13 +6,12 @@ use std::time::Duration; use aws_credential_types::provider::SharedCredentialsProvider; -use aws_credential_types::Credentials; +use aws_sdk_dynamodb::config::{Credentials, Region, StalledStreamProtectionConfig}; use aws_sdk_dynamodb::error::SdkError; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; use aws_smithy_runtime::client::http::test_util::NeverClient; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; -use aws_types::region::Region; use aws_types::SdkConfig; #[derive(Debug, Clone)] @@ -36,9 +35,10 @@ async fn api_call_timeout_retries() { .build(), ) .retry_config(RetryConfig::standard()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .sleep_impl(SharedAsyncSleep::new(InstantSleep)) .build(); - let client = aws_sdk_dynamodb::Client::from_conf(aws_sdk_dynamodb::Config::new(&conf)); + let client = aws_sdk_dynamodb::Client::new(&conf); let resp = client .list_tables() .send() @@ -68,6 +68,7 @@ async fn no_retries_on_operation_timeout() { .operation_timeout(Duration::new(123, 0)) .build(), ) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .retry_config(RetryConfig::standard()) .sleep_impl(SharedAsyncSleep::new(InstantSleep)) .build(); diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index 68c59b43680..481077d429c 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -7,7 +7,7 @@ use aws_sdk_s3::config::IdentityCache; use aws_sdk_s3::config::{ retry::RetryConfig, timeout::TimeoutConfig, BehaviorVersion, Config, Credentials, Region, - SharedAsyncSleep, Sleep, + SharedAsyncSleep, Sleep, StalledStreamProtectionConfig, }; use aws_sdk_s3::primitives::SdkBody; use aws_smithy_runtime::client::http::test_util::infallible_client_fn; @@ -143,6 +143,7 @@ async fn test_time_source_for_identity_cache() { .identity_cache(IdentityCache::lazy().build()) .credentials_provider(Credentials::for_tests()) .retry_config(RetryConfig::disabled()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .timeout_config(TimeoutConfig::disabled()) .behavior_version(BehaviorVersion::latest()) .build(); @@ -160,6 +161,7 @@ async fn behavior_mv_from_aws_config() { .credentials_provider(Credentials::for_tests()) .identity_cache(IdentityCache::no_cache()) .timeout_config(TimeoutConfig::disabled()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .region(Region::new("us-west-2")) .load() .await; @@ -183,6 +185,7 @@ async fn behavior_mv_from_client_construction() { .retry_config(RetryConfig::disabled()) .identity_cache(IdentityCache::no_cache()) .timeout_config(TimeoutConfig::disabled()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .region(Region::new("us-west-2")) .build(); let s3_client = aws_sdk_s3::Client::from_conf( diff --git a/aws/sdk/integration-tests/s3/Cargo.toml b/aws/sdk/integration-tests/s3/Cargo.toml index 19602531be8..80ba48df858 100644 --- a/aws/sdk/integration-tests/s3/Cargo.toml +++ b/aws/sdk/integration-tests/s3/Cargo.toml @@ -21,7 +21,6 @@ aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime", features = ["test-util"] } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", features = ["test-util", "behavior-version-latest"] } -# aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } diff --git a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs index 08f3765928e..2c8c4f4b0a9 100644 --- a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs +++ b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs @@ -5,7 +5,7 @@ use aws_config::retry::RetryConfig; use aws_credential_types::provider::SharedCredentialsProvider; -use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::config::{Credentials, Region, StalledStreamProtectionConfig}; use aws_sdk_s3::types::{ CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization, OutputSerialization, @@ -147,6 +147,7 @@ async fn retry_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box (impl Future, SocketAddr) { + use tokio::net::{TcpListener, TcpStream}; + use tokio::time::sleep; + + let listener = TcpListener::bind("0.0.0.0:0") + .await + .expect("socket is free"); + let bind_addr = listener.local_addr().unwrap(); + + async fn process_socket(socket: TcpStream) { + let mut buf = BytesMut::new(); + let mut time_to_stall = false; + + loop { + if time_to_stall { + debug!("faulty server has read partial request, now getting stuck"); + break; + } + + match socket.try_read_buf(&mut buf) { + Ok(0) => { + unreachable!( + "The connection will be closed before this branch is ever reached" + ); + } + Ok(n) => { + debug!("read {n} bytes from the socket"); + + // Check to see if we've received some headers + if buf.len() >= 128 { + let s = String::from_utf8_lossy(&buf); + debug!("{s}"); + + time_to_stall = true; + } + } + Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => { + debug!("reading would block, sleeping for 1ms and then trying again"); + sleep(Duration::from_millis(1)).await; + } + Err(e) => { + panic!("{e}") + } + } + } + + loop { + tokio::task::yield_now().await + } + } + + let fut = async move { + loop { + let (socket, addr) = listener + .accept() + .await + .expect("listener can accept new connections"); + debug!("server received new connection from {addr:?}"); + let start = std::time::Instant::now(); + process_socket(socket).await; + debug!( + "connection to {addr:?} closed after {:.02?}", + start.elapsed() + ); + } + }; + + (fut, bind_addr) +} + +#[tokio::test] +async fn test_explicitly_configured_stalled_stream_protection_for_downloads() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_download_server().await; + let _ = tokio::spawn(server); + + let conf = Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + .stalled_stream_protection( + StalledStreamProtectionConfig::enabled() + // Fail stalled streams immediately + .grace_period(Duration::from_secs(0)) + .build(), + ) + .build(); + let client = Client::from_conf(conf); + + let res = client + .get_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .send() + .await + .unwrap(); + + let err = res + .body + .collect() + .await + .expect_err("download stream stalled out"); + let err = err.source().expect("inner error exists"); + assert_eq!( + err.to_string(), + "minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed" + ); +} + +#[tokio::test] +async fn test_stalled_stream_protection_for_downloads_can_be_disabled() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_download_server().await; + let _ = tokio::spawn(server); + + let conf = Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .build(); + let client = Client::from_conf(conf); + + let res = client + .get_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .send() + .await + .unwrap(); + + let timeout_duration = Duration::from_secs(2); + match tokio::time::timeout(timeout_duration, res.body.collect()).await { + Ok(_) => panic!("stalled stream protection kicked in but it shouldn't have"), + // If timeout elapses, then stalled stream protection didn't end the stream early. + Err(elapsed) => assert_eq!("deadline has elapsed".to_owned(), elapsed.to_string()), + } +} + +// This test will always take as long as whatever grace period is set by default. +#[tokio::test] +async fn test_stalled_stream_protection_for_downloads_is_enabled_by_default() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_download_server().await; + let _ = tokio::spawn(server); + + // Stalled stream protection should be enabled by default. + let sdk_config = aws_config::from_env() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + .load() + .await; + let client = Client::new(&sdk_config); + + let res = client + .get_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .send() + .await + .unwrap(); + + let start = std::time::Instant::now(); + let err = res + .body + .collect() + .await + .expect_err("download stream stalled out"); + let err = err.source().expect("inner error exists"); + assert_eq!( + err.to_string(), + "minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed" + ); + // 1s check interval + 5s grace period + assert_eq!(start.elapsed().as_secs(), 6); +} + +async fn start_faulty_download_server() -> (impl Future, SocketAddr) { + use tokio::net::{TcpListener, TcpStream}; + use tokio::time::sleep; + + let listener = TcpListener::bind("0.0.0.0:0") + .await + .expect("socket is free"); + let bind_addr = listener.local_addr().unwrap(); + + async fn process_socket(socket: TcpStream) { + let mut buf = BytesMut::new(); + let response: &[u8] = br#"HTTP/1.1 200 OK +x-amz-request-id: 4B4NGF0EAWN0GE63 +content-length: 12 +etag: 3e25960a79dbc69b674cd4ec67a72c62 +content-type: application/octet-stream +server: AmazonS3 +content-encoding: +last-modified: Tue, 21 Jun 2022 16:29:14 GMT +date: Tue, 21 Jun 2022 16:29:23 GMT +x-amz-id-2: kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM= +accept-ranges: bytes + +"#; + let mut time_to_respond = false; + + loop { + match socket.try_read_buf(&mut buf) { + Ok(0) => { + unreachable!( + "The connection will be closed before this branch is ever reached" + ); + } + Ok(n) => { + debug!("read {n} bytes from the socket"); + + // Check for CRLF to see if we've received the entire HTTP request. + if buf.ends_with(b"\r\n\r\n") { + time_to_respond = true; + } + } + Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => { + debug!("reading would block, sleeping for 1ms and then trying again"); + sleep(Duration::from_millis(1)).await; + } + Err(e) => { + panic!("{e}") + } + } + + if socket.writable().await.is_ok() && time_to_respond { + // The content length is 12 but we'll only write 5 bytes + socket.try_write(response).unwrap(); + // We break from the R/W loop after sending a partial response in order to + // close the connection early. + debug!("faulty server has written partial response, now getting stuck"); + break; + } + } + + loop { + tokio::task::yield_now().await + } + } + + let fut = async move { + loop { + let (socket, addr) = listener + .accept() + .await + .expect("listener can accept new connections"); + debug!("server received new connection from {addr:?}"); + let start = std::time::Instant::now(); + process_socket(socket).await; + debug!( + "connection to {addr:?} closed after {:.02?}", + start.elapsed() + ); + } + }; + + (fut, bind_addr) +} diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index c5a22c5d1bb..d78ca76266f 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -9,7 +9,7 @@ use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; async fn do_endpoint_discovery() { use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_timestreamquery as query; - use aws_sdk_timestreamquery::config::Credentials; + use aws_sdk_timestreamquery::config::{Credentials, StalledStreamProtectionConfig}; use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_async::test_util::controlled_time_and_sleep; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; @@ -31,6 +31,7 @@ async fn do_endpoint_discovery() { .credentials_provider(SharedCredentialsProvider::new( Credentials::for_tests_with_session_token(), )) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .time_source(SharedTimeSource::new(ts.clone())) .build(); let conf = query::config::Builder::from(&config) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt index 08814fadac1..9f75a10ddcd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt @@ -21,6 +21,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customize.RequiredCusto import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointParamsDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.StalledStreamProtectionDecorator import software.amazon.smithy.rust.codegen.client.testutil.ClientDecoratableBuildPlugin import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.NonExhaustive import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider @@ -68,6 +69,7 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() { HttpConnectorConfigDecorator(), SensitiveOutputDecorator(), IdempotencyTokenDecorator(), + StalledStreamProtectionDecorator(), *decorator, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index 501e4c7dd42..4d4d32a8dd2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -50,11 +50,12 @@ class OperationRuntimePluginGenerator( operationStructName: String, customizations: List, ) { + val layerName = operationShape.id.name.dq() writer.rustTemplate( """ impl #{RuntimePlugin} for $operationStructName { fn config(&self) -> #{Option}<#{FrozenLayer}> { - let mut cfg = #{Layer}::new(${operationShape.id.name.dq()}); + let mut cfg = #{Layer}::new($layerName); cfg.store_put(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); cfg.store_put(#{SharedResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); @@ -68,11 +69,12 @@ class OperationRuntimePluginGenerator( } fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { - #{Cow}::Owned( - #{RuntimeComponentsBuilder}::new(${operationShape.id.name.dq()}) + ##[allow(unused_mut)] + let mut rcb = #{RuntimeComponentsBuilder}::new($layerName) #{interceptors} - #{retry_classifiers} - ) + #{retry_classifiers}; + + #{Cow}::Owned(rcb) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt new file mode 100644 index 00000000000..03164cbfab1 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt @@ -0,0 +1,126 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.config + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization + +class StalledStreamProtectionDecorator : ClientCodegenDecorator { + override val name: String = "StalledStreamProtection" + override val order: Byte = 0 + + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations + StalledStreamProtectionConfigCustomization(codegenContext) + } + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List { + return baseCustomizations + StalledStreamProtectionOperationCustomization(codegenContext) + } +} + +/** + * Add a `stalled_stream_protection` field to Service config. + */ +class StalledStreamProtectionConfigCustomization(codegenContext: ClientCodegenContext) : NamedCustomization() { + private val rc = codegenContext.runtimeConfig + private val codegenScope = arrayOf( + *preludeScope, + "StalledStreamProtectionConfig" to configReexport(RuntimeType.smithyRuntimeApi(rc).resolve("client::stalled_stream_protection::StalledStreamProtectionConfig")), + ) + + override fun section(section: ServiceConfig): Writable { + return when (section) { + ServiceConfig.ConfigImpl -> writable { + rustTemplate( + """ + /// Return a reference to the stalled stream protection configuration contained in this config, if any. + pub fn stalled_stream_protection(&self) -> #{Option}<&#{StalledStreamProtectionConfig}> { + self.config.load::<#{StalledStreamProtectionConfig}>() + } + """, + *codegenScope, + ) + } + ServiceConfig.BuilderImpl -> writable { + rustTemplate( + """ + /// Set the [`StalledStreamProtectionConfig`](#{StalledStreamProtectionConfig}) + /// to configure protection for stalled streams. + pub fn stalled_stream_protection( + mut self, + stalled_stream_protection_config: #{StalledStreamProtectionConfig} + ) -> Self { + self.set_stalled_stream_protection(#{Some}(stalled_stream_protection_config)); + self + } + """, + *codegenScope, + ) + + rustTemplate( + """ + /// Set the [`StalledStreamProtectionConfig`](#{StalledStreamProtectionConfig}) + /// to configure protection for stalled streams. + pub fn set_stalled_stream_protection( + &mut self, + stalled_stream_protection_config: #{Option}<#{StalledStreamProtectionConfig}> + ) -> &mut Self { + self.config.store_or_unset(stalled_stream_protection_config); + self + } + """, + *codegenScope, + ) + } + + else -> emptySection + } + } +} + +class StalledStreamProtectionOperationCustomization( + codegenContext: ClientCodegenContext, +) : OperationCustomization() { + private val rc = codegenContext.runtimeConfig + + override fun section(section: OperationSection): Writable = writable { + when (section) { + is OperationSection.AdditionalInterceptors -> { + val stalledStreamProtectionModule = RuntimeType.smithyRuntime(rc).resolve("client::stalled_stream_protection") + section.registerInterceptor(rc, this) { + // Currently, only response bodies are protected/supported because + // we can't count on hyper to poll a request body on wake. + rustTemplate( + """ + #{StalledStreamProtectionInterceptor}::new(#{Kind}::ResponseBody) + """, + *preludeScope, + "StalledStreamProtectionInterceptor" to stalledStreamProtectionModule.resolve("StalledStreamProtectionInterceptor"), + "Kind" to stalledStreamProtectionModule.resolve("StalledStreamProtectionInterceptorKind"), + ) + } + } + else -> { } + } + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index ce011bd98a0..cb5a4395229 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -117,4 +117,7 @@ pub mod runtime_components; pub mod runtime_plugin; pub mod behavior_version; + pub mod ser_de; + +pub mod stalled_stream_protection; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs b/rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs new file mode 100644 index 00000000000..25c9c5c67df --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs @@ -0,0 +1,109 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#![allow(missing_docs)] + +//! Stalled stream protection. +//! +//! When enabled, upload and download streams that stall (stream no data) for +//! longer than a configured grace period will return an error. + +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use std::time::Duration; + +const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(5); + +/// Configuration for stalled stream protection. +/// +/// When enabled, download streams that stall out will be cancelled. +#[derive(Clone, Debug)] +pub struct StalledStreamProtectionConfig { + is_enabled: bool, + grace_period: Duration, +} + +impl StalledStreamProtectionConfig { + /// Create a new config that enables stalled stream protection. + pub fn enabled() -> Builder { + Builder { + is_enabled: Some(true), + grace_period: None, + } + } + + /// Create a new config that disables stalled stream protection. + pub fn disabled() -> Self { + Self { + is_enabled: false, + grace_period: DEFAULT_GRACE_PERIOD, + } + } + + /// Return whether stalled stream protection is enabled. + pub fn is_enabled(&self) -> bool { + self.is_enabled + } + + /// Return the grace period for stalled stream protection. + /// + /// When a stream stalls for longer than this grace period, the stream will + /// return an error. + pub fn grace_period(&self) -> Duration { + self.grace_period + } +} + +#[derive(Clone, Debug)] +pub struct Builder { + is_enabled: Option, + grace_period: Option, +} + +impl Builder { + /// Set the grace period for stalled stream protection. + pub fn grace_period(mut self, grace_period: Duration) -> Self { + self.grace_period = Some(grace_period); + self + } + + /// Set the grace period for stalled stream protection. + pub fn set_grace_period(&mut self, grace_period: Option) -> &mut Self { + self.grace_period = grace_period; + self + } + + /// Set whether stalled stream protection is enabled. + pub fn is_enabled(mut self, is_enabled: bool) -> Self { + self.is_enabled = Some(is_enabled); + self + } + + /// Set whether stalled stream protection is enabled. + pub fn set_is_enabled(&mut self, is_enabled: Option) -> &mut Self { + self.is_enabled = is_enabled; + self + } + + /// Build the config. + pub fn build(self) -> StalledStreamProtectionConfig { + StalledStreamProtectionConfig { + is_enabled: self.is_enabled.unwrap_or_default(), + grace_period: self.grace_period.unwrap_or(DEFAULT_GRACE_PERIOD), + } + } +} + +impl From for Builder { + fn from(config: StalledStreamProtectionConfig) -> Self { + Builder { + is_enabled: Some(config.is_enabled), + grace_period: Some(config.grace_period), + } + } +} + +impl Storable for StalledStreamProtectionConfig { + type Storer = StoreReplace; +} diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index 4457ef2ac8d..10591578fce 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -41,3 +41,6 @@ pub mod identity; /// Interceptors for Smithy clients. pub mod interceptors; + +/// Stalled stream protection for clients +pub mod stalled_stream_protection; diff --git a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs index 6e78d00cc5c..ca2d06a387f 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs @@ -23,11 +23,13 @@ use aws_smithy_runtime_api::client::runtime_components::{ use aws_smithy_runtime_api::client::runtime_plugin::{ Order, SharedRuntimePlugin, StaticRuntimePlugin, }; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use std::borrow::Cow; +use std::time::Duration; fn default_plugin(name: &'static str, components_fn: CompFn) -> StaticRuntimePlugin where @@ -164,6 +166,59 @@ pub fn default_identity_cache_plugin() -> Option { ) } +/// Runtime plugin that sets the default stalled stream protection config. +/// +/// By default, when throughput falls below 1/Bs for more than 5 seconds, the +/// stream is cancelled. +pub fn default_stalled_stream_protection_config_plugin() -> Option { + Some( + default_plugin( + "default_stalled_stream_protection_config_plugin", + |components| { + components.with_config_validator(SharedConfigValidator::base_client_config_fn( + validate_stalled_stream_protection_config, + )) + }, + ) + .with_config(layer("default_stalled_stream_protection_config", |layer| { + layer.store_put( + StalledStreamProtectionConfig::enabled() + .grace_period(Duration::from_secs(5)) + .build(), + ); + })) + .into_shared(), + ) +} + +fn validate_stalled_stream_protection_config( + components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, +) -> Result<(), BoxError> { + if let Some(stalled_stream_protection_config) = cfg.load::() { + if stalled_stream_protection_config.is_enabled() { + if components.sleep_impl().is_none() { + return Err( + "An async sleep implementation is required for stalled stream protection to work. \ + Please provide a `sleep_impl` on the config, or disable stalled stream protection.".into()); + } + + if components.time_source().is_none() { + return Err( + "A time source is required for stalled stream protection to work.\ + Please provide a `time_source` on the config, or disable stalled stream protection.".into()); + } + } + + Ok(()) + } else { + Err( + "The default stalled stream protection config was removed, and no other config was put in its place." + .into(), + ) + } +} + /// Arguments for the [`default_plugins`] method. /// /// This is a struct to enable adding new parameters in the future without breaking the API. @@ -208,6 +263,7 @@ pub fn default_plugins( default_sleep_impl_plugin(), default_time_source_plugin(), default_timeout_config_plugin(), + default_stalled_stream_protection_config_plugin(), ] .into_iter() .flatten() diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs index 2ddcc6c3f7d..006de72cfd6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs @@ -7,20 +7,22 @@ //! //! If data is being streamed too slowly, this body type will emit an error next time it's polled. +/// An implementation of v0.4 `http_body::Body` for `MinimumThroughputBody` and related code. +pub mod http_body_0_4_x; + +/// Options for a [`MinimumThroughputBody`]. +pub mod options; +mod throughput; + use aws_smithy_async::rt::sleep::Sleep; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::shared::IntoShared; +use options::MinimumThroughputBodyOptions; use std::fmt; -use std::time::Duration; use throughput::{Throughput, ThroughputLogs}; -/// An implementation of v0.4 `http_body::Body` for `MinimumThroughputBody` and related code. -pub mod http_body_0_4_x; - -mod throughput; - pin_project_lite::pin_project! { /// A body-wrapping type that ensures data is being streamed faster than some lower limit. /// @@ -28,11 +30,13 @@ pin_project_lite::pin_project! { pub struct MinimumThroughputBody { async_sleep: SharedAsyncSleep, time_source: SharedTimeSource, - minimum_throughput: Throughput, + options: MinimumThroughputBodyOptions, throughput_logs: ThroughputLogs, #[pin] sleep_fut: Option, #[pin] + grace_period_fut: Option, + #[pin] inner: B, } } @@ -46,26 +50,26 @@ impl MinimumThroughputBody { time_source: impl TimeSource + 'static, async_sleep: impl AsyncSleep + 'static, body: B, - (bytes_read, per_time_elapsed): (u64, Duration), + options: MinimumThroughputBodyOptions, ) -> Self { - let minimum_throughput = Throughput::new(bytes_read as f64, per_time_elapsed); Self { throughput_logs: ThroughputLogs::new( // Never keep more than 10KB of logs in memory. This currently // equates to 426 logs. (NUMBER_OF_LOGS_IN_ONE_KB * 10.0) as usize, - minimum_throughput.per_time_elapsed(), + options.minimum_throughput().per_time_elapsed(), ), async_sleep: async_sleep.into_shared(), time_source: time_source.into_shared(), - minimum_throughput, inner: body, sleep_fut: None, + grace_period_fut: None, + options, } } } -#[derive(Debug)] +#[derive(Debug, PartialEq)] enum Error { ThroughputBelowMinimum { expected: Throughput, diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs index 46b401a305c..b8f2ffd3ecc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs @@ -25,10 +25,6 @@ where // Attempt to read the data from the inner body, then update the // throughput logs. let mut this = self.as_mut().project(); - // Push a start log if we haven't already done so. - if this.throughput_logs.is_empty() { - this.throughput_logs.push((now, 0)); - } let poll_res = match this.inner.poll_data(cx) { Poll::Ready(Some(Ok(bytes))) => { this.throughput_logs.push((now, bytes.len() as u64)); @@ -38,17 +34,21 @@ where // If we've read all the data or an error occurred, then return that result. res => return res, }; + // Push a start log if we haven't already done so. + if this.throughput_logs.is_empty() { + this.throughput_logs.push((now, 0)); + } // Check the sleep future to see if it needs refreshing. let mut sleep_fut = this.sleep_fut.take().unwrap_or_else(|| { this.async_sleep - .sleep(this.minimum_throughput.per_time_elapsed()) + .sleep(this.options.minimum_throughput().per_time_elapsed()) }); if let Poll::Ready(()) = pin!(&mut sleep_fut).poll(cx) { // Whenever the sleep future expires, we replace it. sleep_fut = this .async_sleep - .sleep(this.minimum_throughput.per_time_elapsed()); + .sleep(this.options.minimum_throughput().per_time_elapsed()); // We also schedule a wake up for current task to ensure that // it gets polled at least one more time. @@ -56,19 +56,33 @@ where }; this.sleep_fut.replace(sleep_fut); - // Calculate the current throughput and emit an error if it's too low. + // Calculate the current throughput and emit an error if it's too low and + // the grace period has elapsed. let actual_throughput = this.throughput_logs.calculate_throughput(now); let is_below_minimum_throughput = actual_throughput - .map(|t| t < self.minimum_throughput) + .map(|t| t < this.options.minimum_throughput()) .unwrap_or_default(); if is_below_minimum_throughput { - Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum { - expected: self.minimum_throughput, - actual: actual_throughput.unwrap(), - })))) + // Check the grace period future to see if it needs creating. + let mut grace_period_fut = this + .grace_period_fut + .take() + .unwrap_or_else(|| this.async_sleep.sleep(this.options.grace_period())); + if let Poll::Ready(()) = pin!(&mut grace_period_fut).poll(cx) { + // The grace period has ended! + return Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum { + expected: self.options.minimum_throughput(), + actual: actual_throughput.unwrap(), + })))); + }; + this.grace_period_fut.replace(grace_period_fut); } else { - poll_res + // Ensure we don't have an active grace period future if we're not + // currently below the minimum throughput. + let _ = this.grace_period_fut.take(); } + + poll_res } fn poll_trailers( @@ -84,6 +98,7 @@ where #[cfg(all(test, feature = "connector-hyper-0-14-x"))] mod test { use super::{super::Throughput, Error, MinimumThroughputBody}; + use crate::client::http::body::minimum_throughput::options::MinimumThroughputBodyOptions; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep, ManualTimeSource}; use aws_smithy_types::body::SdkBody; @@ -129,7 +144,7 @@ mod test { time_source.clone(), async_sleep.clone(), NeverBody, - (1, Duration::from_secs(1)), + Default::default(), ); time_source.advance(Duration::from_secs(1)); let actual_err = body.data().await.expect("next chunk exists").unwrap_err(); @@ -164,7 +179,7 @@ mod test { Lazy::new(|| (1..=255).flat_map(|_| b"00000000").copied().collect()); fn eight_byte_per_second_stream_with_minimum_throughput_timeout( - minimum_throughput: (u64, Duration), + minimum_throughput: Throughput, ) -> ( impl Future>, ManualTimeSource, @@ -187,18 +202,20 @@ mod test { time_source, async_sleep, body, - minimum_throughput, + MinimumThroughputBodyOptions::builder() + .minimum_throughput(minimum_throughput) + .build(), )) }); (body.collect(), time_source, async_sleep) } - async fn expect_error(minimum_throughput: (u64, Duration)) { + async fn expect_error(minimum_throughput: Throughput) { let (res, ..) = eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); let expected_err = Error::ThroughputBelowMinimum { - expected: minimum_throughput.into(), + expected: minimum_throughput, actual: Throughput::new(8.889, Duration::from_secs(1)), }; match res.await { @@ -219,11 +236,11 @@ mod test { #[tokio::test] async fn test_throughput_timeout_less_than() { - let minimum_throughput = (9, Duration::from_secs(1)); + let minimum_throughput = Throughput::new_bytes_per_second(9.0); expect_error(minimum_throughput).await; } - async fn expect_success(minimum_throughput: (u64, Duration)) { + async fn expect_success(minimum_throughput: Throughput) { let (res, time_source, async_sleep) = eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); match res.await { @@ -238,13 +255,13 @@ mod test { #[tokio::test] async fn test_throughput_timeout_equal_to() { - let minimum_throughput = (32, Duration::from_secs(4)); + let minimum_throughput = Throughput::new(32.0, Duration::from_secs(4)); expect_success(minimum_throughput).await; } #[tokio::test] async fn test_throughput_timeout_greater_than() { - let minimum_throughput = (20, Duration::from_secs(3)); + let minimum_throughput = Throughput::new(20.0, Duration::from_secs(3)); expect_success(minimum_throughput).await; } @@ -279,11 +296,12 @@ mod test { #[tokio::test] async fn test_throughput_timeout_shrinking_sine_wave() { - // Minimum throughput per second will be approx. half of the BYTE_COUNT_UPPER_LIMIT. - let minimum_throughput = ( - BYTE_COUNT_UPPER_LIMIT as u64 / 2 + 2, - Duration::from_secs(1), - ); + let options = MinimumThroughputBodyOptions::builder() + // Minimum throughput per second will be approx. half of the BYTE_COUNT_UPPER_LIMIT. + .minimum_throughput(Throughput::new_bytes_per_second( + BYTE_COUNT_UPPER_LIMIT / 2.0 + 2.0, + )) + .build(); let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); let time_clone = time_source.clone(); @@ -301,7 +319,7 @@ mod test { time_source, async_sleep, body, - minimum_throughput, + options.clone(), )) }) .collect(); diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs new file mode 100644 index 00000000000..8618707f734 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs @@ -0,0 +1,161 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use super::Throughput; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use std::time::Duration; + +/// A collection of options for configuring a [`MinimumThroughputBody`](super::MinimumThroughputBody). +#[derive(Debug, Clone)] +pub struct MinimumThroughputBodyOptions { + /// The minimum throughput that is acceptable. + minimum_throughput: Throughput, + /// The 'grace period' after which the minimum throughput will be enforced. + /// + /// If this is set to 0, the minimum throughput will be enforced immediately. + /// + /// If this is set to a positive value, whenever throughput is below the minimum throughput, + /// a timer is started. If the timer expires before throughput rises above the minimum, + /// an error is emitted. + grace_period: Duration, + /// The interval at which the throughput is checked. + check_interval: Duration, +} + +impl MinimumThroughputBodyOptions { + /// Create a new builder. + pub fn builder() -> MinimumThroughputBodyOptionsBuilder { + Default::default() + } + + /// Convert this struct into a builder. + pub fn to_builder(self) -> MinimumThroughputBodyOptionsBuilder { + MinimumThroughputBodyOptionsBuilder::new() + .minimum_throughput(self.minimum_throughput) + .grace_period(self.grace_period) + .check_interval(self.check_interval) + } + + /// The throughput check grace period. + /// + /// If throughput is below the minimum for longer than this period, an error is emitted. + /// + /// If this is set to 0, the minimum throughput will be enforced immediately. + pub fn grace_period(&self) -> Duration { + self.grace_period + } + + /// The minimum acceptable throughput + pub fn minimum_throughput(&self) -> Throughput { + self.minimum_throughput + } + + /// The rate at which the throughput is checked. + /// + /// The actual rate throughput is checked may be higher than this value, + /// but it will never be lower. + pub fn check_interval(&self) -> Duration { + self.check_interval + } +} + +impl Default for MinimumThroughputBodyOptions { + fn default() -> Self { + Self { + minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT, + grace_period: DEFAULT_GRACE_PERIOD, + check_interval: DEFAULT_CHECK_INTERVAL, + } + } +} + +/// A builder for [`MinimumThroughputBodyOptions`] +#[derive(Debug, Default, Clone)] +pub struct MinimumThroughputBodyOptionsBuilder { + minimum_throughput: Option, + check_interval: Option, + grace_period: Option, +} + +const DEFAULT_CHECK_INTERVAL: Duration = Duration::from_secs(1); +const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(0); +const DEFAULT_MINIMUM_THROUGHPUT: Throughput = Throughput { + bytes_read: 1.0, + per_time_elapsed: Duration::from_secs(1), +}; + +impl MinimumThroughputBodyOptionsBuilder { + /// Create a new `MinimumThroughputBodyOptionsBuilder`. + pub fn new() -> Self { + Default::default() + } + + /// Set the amount of time that throughput my fall below minimum before an error is emitted. + /// + /// If throughput rises above the minimum, the timer is reset. + pub fn grace_period(mut self, grace_period: Duration) -> Self { + self.set_grace_period(Some(grace_period)); + self + } + + /// Set the amount of time that throughput my fall below minimum before an error is emitted. + /// + /// If throughput rises above the minimum, the timer is reset. + pub fn set_grace_period(&mut self, grace_period: Option) -> &mut Self { + self.grace_period = grace_period; + self + } + + /// Set the minimum allowable throughput. + pub fn minimum_throughput(mut self, minimum_throughput: Throughput) -> Self { + self.set_minimum_throughput(Some(minimum_throughput)); + self + } + + /// Set the minimum allowable throughput. + pub fn set_minimum_throughput(&mut self, minimum_throughput: Option) -> &mut Self { + self.minimum_throughput = minimum_throughput; + self + } + + /// Set the rate at which throughput is checked. + /// + /// Defaults to 1 second. + pub fn check_interval(mut self, check_interval: Duration) -> Self { + self.set_check_interval(Some(check_interval)); + self + } + + /// Set the rate at which throughput is checked. + /// + /// Defaults to 1 second. + pub fn set_check_interval(&mut self, check_interval: Option) -> &mut Self { + self.check_interval = check_interval; + self + } + + /// Build this builder, producing a [`MinimumThroughputBodyOptions`]. + /// + /// Unset fields will be set with defaults. + pub fn build(self) -> MinimumThroughputBodyOptions { + MinimumThroughputBodyOptions { + grace_period: self.grace_period.unwrap_or(DEFAULT_GRACE_PERIOD), + minimum_throughput: self + .minimum_throughput + .unwrap_or(DEFAULT_MINIMUM_THROUGHPUT), + check_interval: self.check_interval.unwrap_or(DEFAULT_CHECK_INTERVAL), + } + } +} + +impl From for MinimumThroughputBodyOptions { + fn from(value: StalledStreamProtectionConfig) -> Self { + MinimumThroughputBodyOptions { + grace_period: value.grace_period(), + minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT, + check_interval: DEFAULT_CHECK_INTERVAL, + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs index 3b610f857e1..6186f8c9ccd 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs @@ -8,13 +8,14 @@ use std::fmt; use std::time::{Duration, SystemTime}; #[derive(Debug, Clone, Copy)] -pub(super) struct Throughput { - bytes_read: f64, - per_time_elapsed: Duration, +pub struct Throughput { + pub(super) bytes_read: f64, + pub(super) per_time_elapsed: Duration, } impl Throughput { - pub(super) fn new(bytes_read: f64, per_time_elapsed: Duration) -> Self { + /// Create a new throughput with the given bytes read and time elapsed. + pub fn new(bytes_read: f64, per_time_elapsed: Duration) -> Self { debug_assert!( !bytes_read.is_nan(), "cannot create a throughput if bytes_read == NaN" @@ -34,6 +35,30 @@ impl Throughput { } } + /// Create a new throughput in bytes per second. + pub fn new_bytes_per_second(bytes: f64) -> Self { + Self { + bytes_read: bytes, + per_time_elapsed: Duration::from_secs(1), + } + } + + /// Create a new throughput in kilobytes per second. + pub fn new_kilobytes_per_second(kilobytes: f64) -> Self { + Self { + bytes_read: kilobytes * 1000.0, + per_time_elapsed: Duration::from_secs(1), + } + } + + /// Create a new throughput in megabytes per second. + pub fn new_megabytes_per_second(megabytes: f64) -> Self { + Self { + bytes_read: megabytes * 1000.0 * 1000.0, + per_time_elapsed: Duration::from_secs(1), + } + } + pub(super) fn per_time_elapsed(&self) -> Duration { self.per_time_elapsed } diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs index 1ed06cba18a..bd1d2840176 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs @@ -689,6 +689,7 @@ mod tests { .unwrap(); let (cache, _) = test_cache(BUFFER_TIME_NO_JITTER, Vec::new()); + #[allow(clippy::disallowed_methods)] let far_future = SystemTime::now() + Duration::from_secs(10_000); // Resolver A and B both return an identical identity type with different tokens with an expiration diff --git a/rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs b/rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs new file mode 100644 index 00000000000..3e07b3f0b8d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs @@ -0,0 +1,138 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::http::body::minimum_throughput::MinimumThroughputBody; +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::interceptors::context::{ + BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, +}; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::ConfigBag; +use std::mem; + +/// Adds stalled stream protection when sending requests and/or receiving responses. +#[derive(Debug)] +pub struct StalledStreamProtectionInterceptor { + enable_for_request_body: bool, + enable_for_response_body: bool, +} + +/// Stalled stream protection can be enable for request bodies, response bodies, +/// or both. +pub enum StalledStreamProtectionInterceptorKind { + /// Enable stalled stream protection for request bodies. + RequestBody, + /// Enable stalled stream protection for response bodies. + ResponseBody, + /// Enable stalled stream protection for both request and response bodies. + RequestAndResponseBody, +} + +impl StalledStreamProtectionInterceptor { + /// Create a new stalled stream protection interceptor. + pub fn new(kind: StalledStreamProtectionInterceptorKind) -> Self { + use StalledStreamProtectionInterceptorKind::*; + let (enable_for_request_body, enable_for_response_body) = match kind { + RequestBody => (true, false), + ResponseBody => (false, true), + RequestAndResponseBody => (true, true), + }; + + Self { + enable_for_request_body, + enable_for_response_body, + } + } +} + +impl Intercept for StalledStreamProtectionInterceptor { + fn name(&self) -> &'static str { + "StalledStreamProtectionInterceptor" + } + + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + if self.enable_for_request_body { + if let Some(cfg) = cfg.load::() { + if cfg.is_enabled() { + let (async_sleep, time_source) = + get_runtime_component_deps(runtime_components)?; + tracing::trace!("adding stalled stream protection to request body"); + add_stalled_stream_protection_to_body( + context.request_mut().body_mut(), + cfg, + async_sleep, + time_source, + ); + } + } + } + + Ok(()) + } + + fn modify_before_deserialization( + &self, + context: &mut BeforeDeserializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + if self.enable_for_response_body { + if let Some(cfg) = cfg.load::() { + if cfg.is_enabled() { + let (async_sleep, time_source) = + get_runtime_component_deps(runtime_components)?; + tracing::trace!("adding stalled stream protection to response body"); + add_stalled_stream_protection_to_body( + context.response_mut().body_mut(), + cfg, + async_sleep, + time_source, + ); + } + } + } + Ok(()) + } +} + +fn get_runtime_component_deps( + runtime_components: &RuntimeComponents, +) -> Result<(SharedAsyncSleep, SharedTimeSource), BoxError> { + let async_sleep = runtime_components.sleep_impl().ok_or( + "An async sleep implementation is required when stalled stream protection is enabled", + )?; + let time_source = runtime_components + .time_source() + .ok_or("A time source is required when stalled stream protection is enabled")?; + Ok((async_sleep, time_source)) +} + +fn add_stalled_stream_protection_to_body( + body: &mut SdkBody, + cfg: &StalledStreamProtectionConfig, + async_sleep: SharedAsyncSleep, + time_source: SharedTimeSource, +) { + let cfg = cfg.clone(); + let it = mem::replace(body, SdkBody::taken()); + let it = it.map_preserve_contents(move |body| { + let cfg = cfg.clone(); + let async_sleep = async_sleep.clone(); + let time_source = time_source.clone(); + let mtb = MinimumThroughputBody::new(time_source, async_sleep, body, cfg.into()); + SdkBody::from_body_0_4(mtb) + }); + let _ = mem::replace(body, it); +} From 95945b0b29e493184b3d73d2090a65bd7305683f Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 17 Nov 2023 08:52:52 -0800 Subject: [PATCH 280/331] Remove `supports_v2023_11_09` from behavior versions (#3231) This function isn't useful. --- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../aws-smithy-runtime-api/src/client/behavior_version.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs index e64a394edf9..c44043fe739 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs @@ -34,9 +34,4 @@ impl BehaviorVersion { pub fn v2023_11_09() -> Self { Self {} } - - /// Returns whether the current version is `v2023_11_09` - pub fn supports_v2023_11_09(&self) -> bool { - true - } } From e3a57c88e82e5b3f3f63b91f8e19f22d5b74a10e Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 17 Nov 2023 11:32:01 -0500 Subject: [PATCH 281/331] Fix issue with futures dependency (#3224) ## Motivation and Context S3 doesn't compile in the Rust repo because nothing is enabling the alloc feature Codegen diff verified ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 08e0e024a1e..1a858be1984 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -258,7 +258,7 @@ data class CargoDependency( val Criterion: CargoDependency = CargoDependency("criterion", CratesIo("0.5.0"), DependencyScope.Dev) val FuturesCore: CargoDependency = CargoDependency("futures-core", CratesIo("0.3.25"), DependencyScope.Dev) val FuturesUtil: CargoDependency = - CargoDependency("futures-util", CratesIo("0.3.25"), DependencyScope.Dev, defaultFeatures = false) + CargoDependency("futures-util", CratesIo("0.3.25"), DependencyScope.Dev, defaultFeatures = false, features = setOf("alloc")) val HdrHistogram: CargoDependency = CargoDependency("hdrhistogram", CratesIo("7.5.2"), DependencyScope.Dev) val Hound: CargoDependency = CargoDependency("hound", CratesIo("3.4.0"), DependencyScope.Dev) val PrettyAssertions: CargoDependency = From 0d80212a3238dc0e2c9664cd2cd0295bfd54062a Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 17 Nov 2023 12:45:50 -0500 Subject: [PATCH 282/331] Avoid overflow in exponential backoff computation (#3229) ## Motivation and Context aws-sdk-rust#960 ## Description Use checked_pow to avoid overflow in backoff computation ## Testing - unit test ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 ++++++++++++ .../src/client/retries/strategy/standard.rs | 14 +++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c1936e7a7d3..8978fda08db 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -54,3 +54,15 @@ message = "Make certain types for EMR Serverless optional. Previously, they defa references = ["smithy-rs#3217"] meta = { "breaking" = true, "tada" = false, "bug" = true } author = "milesziemer" + +[[smithy-rs]] +message = "Prevent multiplication overflow in backoff computation" +references = ["smithy-rs#3229", "aws-sdk-rust#960"] +meta = { "breaking" = false, "tada" = false, "bug" = true, target = "client" } +author = "rcoh" + +[[aws-sdk-rust]] +message = "Prevent multiplication overflow in backoff computation" +references = ["smithy-rs#3229", "aws-sdk-rust#960"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "rcoh" diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index 98d1308831a..de74b31c2b7 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -286,7 +286,10 @@ fn check_rate_limiter_for_delay( } fn calculate_exponential_backoff(base: f64, initial_backoff: f64, retry_attempts: u32) -> f64 { - base * initial_backoff * 2_u32.pow(retry_attempts) as f64 + 2_u32 + .checked_pow(retry_attempts) + .map(|backoff| (backoff as f64) * base * initial_backoff) + .unwrap_or(f64::MAX) } fn get_seconds_since_unix_epoch(runtime_components: &RuntimeComponents) -> f64 { @@ -793,4 +796,13 @@ mod tests { assert_eq!(expected_backoff, actual_backoff); } } + + #[test] + fn calculate_backoff_overflow() { + // avoid overflow for a silly large amount of retry attempts + assert_eq!( + calculate_exponential_backoff(1_f64, 10_f64, 100000), + f64::MAX + ); + } } From 3d34cb7c40053bf71cb9aa1499adfca608887473 Mon Sep 17 00:00:00 2001 From: Adam Steinberg <43798340+AdamSteinberg1@users.noreply.github.com> Date: Fri, 17 Nov 2023 12:46:13 -0500 Subject: [PATCH 283/331] Fix broken link in README.md (#3227) ## Motivation and Context The link to the design documentation in the root-level README is broken. It produces a 404 error. ## Description I changed the link in the README from `https://awslabs.github.io/smithy-rs/design` to `https://smithy-lang.github.io/smithy-rs/design/` ## Testing I clicked the new link and it worked :) ## Checklist N/A ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c0937cc9de..2d9f2b119f0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Smithy Rust [![CI on Branch `main`](https://github.com/smithy-lang/smithy-rs/act Smithy code generators for Rust that generate clients, servers, and the entire AWS SDK. The latest unreleased SDK build can be found in [aws-sdk-rust/next](https://github.com/awslabs/aws-sdk-rust/tree/next). -[Design documentation](https://awslabs.github.io/smithy-rs/design) +[Design documentation](https://smithy-lang.github.io/smithy-rs/design/) **All internal and external interfaces are considered unstable and subject to change without notice.** From a055471ead2e8e4738808db6dd80c12f29573c57 Mon Sep 17 00:00:00 2001 From: Miles Ziemer <45497130+milesziemer@users.noreply.github.com> Date: Fri, 17 Nov 2023 13:45:09 -0500 Subject: [PATCH 284/331] Remove defaults for more services (#3228) ## Motivation and Context Removing defaults from these shapes may not have a codegen impact since these are in top level input, but doing this just to be safe from future changes. ## Description Adds more services/shapes to RemoveDefaultsDecorator, which will have their models changed in the future. Also updates RemoveDefaults to allow for members to be present in the list. ## Testing - Updated unit test for RemoveDefaults - Generated clients and looked at the output code ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 +++++ .../rustsdk/customize/RemoveDefaults.kt | 13 +++++++--- .../customize/RemoveDefaultsDecorator.kt | 26 +++++++++++++++++++ .../rustsdk/customize/RemoveDefaultsTest.kt | 8 ++++-- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 8978fda08db..1ba6b2967da 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -66,3 +66,9 @@ message = "Prevent multiplication overflow in backoff computation" references = ["smithy-rs#3229", "aws-sdk-rust#960"] meta = { "breaking" = false, "tada" = false, "bug" = true } author = "rcoh" + +[[aws-sdk-rust]] +message = "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests." +references = ["smithy-rs#3228"] +meta = { "breaking" = true, "tada" = false, "bug" = true } +author = "milesziemer" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt index bebfd639b23..45bf8bc1987 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt @@ -35,7 +35,7 @@ object RemoveDefaults { } return ModelTransformer.create().mapShapes(removedRootDefaultsModel) { shape -> - shape.letIf(shouldRemoveMemberDefault(shape, removedRootDefaults)) { + shape.letIf(shouldRemoveMemberDefault(shape, removedRootDefaults, removeDefaultsFrom)) { logger.info("Removing default trait from member $shape") removeDefault(shape) } @@ -46,8 +46,15 @@ object RemoveDefaults { return shape !is MemberShape && removeDefaultsFrom.contains(shape.id) && shape.hasTrait() } - private fun shouldRemoveMemberDefault(shape: Shape, removeDefaultsFrom: Set): Boolean { - return shape is MemberShape && removeDefaultsFrom.contains(shape.target) && shape.hasTrait() + private fun shouldRemoveMemberDefault( + shape: Shape, + removedRootDefaults: Set, + removeDefaultsFrom: Set, + ): Boolean { + return shape is MemberShape && + // Check the original set of shapes to remove for this shape id, to remove members that were in that set. + (removedRootDefaults.contains(shape.target) || removeDefaultsFrom.contains(shape.id)) && + shape.hasTrait() } private fun removeDefault(shape: Shape): Shape { diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt index 2bae9dd1f9f..aa7f67a89d5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt @@ -25,6 +25,32 @@ class RemoveDefaultsDecorator : ClientCodegenDecorator { // Service shape id -> Shape id of each root shape to remove the default from. // TODO(https://github.com/smithy-lang/smithy-rs/issues/3220): Remove this customization after model updates. private val removeDefaults = mapOf( + "com.amazonaws.amplifyuibuilder#AmplifyUIBuilder".shapeId() to setOf( + "com.amazonaws.amplifyuibuilder#ListComponentsLimit".shapeId(), + "com.amazonaws.amplifyuibuilder#ListFormsLimit".shapeId(), + "com.amazonaws.amplifyuibuilder#ListThemesLimit".shapeId(), + ), + "com.amazonaws.drs#ElasticDisasterRecoveryService".shapeId() to setOf( + "com.amazonaws.drs#Validity".shapeId(), + "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceThreshold".shapeId(), + "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceDeltaThreshold".shapeId(), + "com.amazonaws.drs#ListStagingAccountsRequest\$maxResults".shapeId(), + "com.amazonaws.drs#StrictlyPositiveInteger".shapeId(), + "com.amazonaws.drs#MaxResultsType".shapeId(), + "com.amazonaws.drs#MaxResultsReplicatingSourceServers".shapeId(), + "com.amazonaws.drs#LaunchActionOrder".shapeId(), + ), + "com.amazonaws.evidently#Evidently".shapeId() to setOf( + "com.amazonaws.evidently#ResultsPeriod".shapeId(), + ), + "com.amazonaws.location#LocationService".shapeId() to setOf( + "com.amazonaws.location#ListPlaceIndexesRequest\$MaxResults".shapeId(), + "com.amazonaws.location#SearchPlaceIndexForSuggestionsRequest\$MaxResults".shapeId(), + "com.amazonaws.location#PlaceIndexSearchResultLimit".shapeId(), + ), + "com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane".shapeId() to setOf( + "com.amazonaws.paymentcryptographydata#IntegerRangeBetween4And12".shapeId(), + ), "com.amazonaws.emrserverless#AwsToledoWebService".shapeId() to setOf( // Service expects this to have a min value > 0 "com.amazonaws.emrserverless#WorkerCounts".shapeId(), diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt index 266c3d6be3b..1ecc0e650e2 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt @@ -20,12 +20,14 @@ internal class RemoveDefaultsTest { fun `defaults should be removed`() { val removeDefaults = setOf( "test#Bar".shapeId(), + "test#Foo\$baz".shapeId(), ) val baseModel = """ namespace test structure Foo { bar: Bar = 0 + baz: Integer = 0 } @default(0) @@ -33,8 +35,10 @@ internal class RemoveDefaultsTest { """.asSmithyModel(smithyVersion = "2.0") val model = RemoveDefaults.processModel(baseModel, removeDefaults) - val member = model.lookup("test#Foo\$bar") - member.hasTrait() shouldBe false + val barMember = model.lookup("test#Foo\$bar") + barMember.hasTrait() shouldBe false + val bazMember = model.lookup("test#Foo\$baz") + bazMember.hasTrait() shouldBe false val root = model.lookup("test#Bar") root.hasTrait() shouldBe false } From 04ede19216b2b52f792282c08d7c3a0f4d037ea7 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 17 Nov 2023 10:47:16 -0800 Subject: [PATCH 285/331] Remove deprecations from rust-runtime (#3222) This PR removes deprecations throughout smithy-rs client and the SDK. Some of these deprecations were ignored by the compiler (in the case where `#[deprecated]` was used with `pub use`), so these will need to be explicitly called out in the changelog. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 20 ++++ .../aws-config/src/environment/app_name.rs | 46 -------- .../aws-config/src/environment/mod.rs | 3 - aws/rust-runtime/aws-config/src/lib.rs | 43 ------- .../aws-config/src/profile/app_name.rs | 106 ------------------ .../aws-config/src/profile/mod.rs | 1 - .../aws-config/src/provider_config.rs | 8 -- .../aws-inlineable/src/s3_request_id.rs | 15 +-- .../aws-runtime/src/retries/classifiers.rs | 4 +- aws/rust-runtime/aws-types/src/config.rs | 14 --- aws/rust-runtime/aws-types/src/request_id.rs | 14 +-- .../dynamodb/benches/deserialization_bench.rs | 2 +- .../dynamodb/benches/serialization_bench.rs | 2 +- .../HttpConnectorConfigDecorator.kt | 24 ---- .../customizations/HttpAuthDecoratorTest.kt | 3 +- .../error/OperationErrorGeneratorTest.kt | 5 +- ...PythonServerEventStreamWrapperGenerator.kt | 3 +- rust-runtime/aws-smithy-http/src/body.rs | 17 --- .../aws-smithy-http/src/byte_stream.rs | 34 ------ .../aws-smithy-http/src/connection.rs | 13 --- .../src/event_stream/sender.rs | 9 +- rust-runtime/aws-smithy-http/src/lib.rs | 5 - rust-runtime/aws-smithy-http/src/operation.rs | 13 --- rust-runtime/aws-smithy-http/src/result.rs | 75 ------------- .../aws-smithy-runtime-api/src/client/auth.rs | 6 - .../src/client/endpoint.rs | 3 - .../aws-smithy-runtime-api/src/client/http.rs | 36 ------ .../src/client/identity.rs | 3 - .../src/client/interceptors.rs | 3 - .../src/client/result.rs | 2 +- .../src/client/ser_de.rs | 6 - .../src/client/identity/cache.rs | 2 +- .../src/client/identity/cache/lazy.rs | 6 +- .../aws-smithy-types/src/byte_stream.rs | 18 --- rust-runtime/aws-smithy-types/src/error.rs | 4 - .../aws-smithy-types/src/error/metadata.rs | 6 +- .../aws-smithy-types/src/error/unhandled.rs | 94 ---------------- rust-runtime/aws-smithy-types/src/lib.rs | 6 - rust-runtime/inlineable/src/json_errors.rs | 6 +- 39 files changed, 49 insertions(+), 631 deletions(-) delete mode 100644 aws/rust-runtime/aws-config/src/environment/app_name.rs delete mode 100644 aws/rust-runtime/aws-config/src/profile/app_name.rs delete mode 100644 aws/rust-runtime/aws-types/src/config.rs delete mode 100644 rust-runtime/aws-smithy-http/src/body.rs delete mode 100644 rust-runtime/aws-smithy-http/src/byte_stream.rs delete mode 100644 rust-runtime/aws-smithy-http/src/connection.rs delete mode 100644 rust-runtime/aws-smithy-http/src/result.rs delete mode 100644 rust-runtime/aws-smithy-types/src/error/unhandled.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 1ba6b2967da..546c671ee3a 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -72,3 +72,23 @@ message = "Make some types for various services optional. Previously, they defau references = ["smithy-rs#3228"] meta = { "breaking" = true, "tada" = false, "bug" = true } author = "milesziemer" + +[[smithy-rs]] +message = """ +Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations +were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See +the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details. +""" +references = ["smithy-rs#3222"] +meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" + +[[aws-sdk-rust]] +message = """ +Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations +were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See +the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details. +""" +references = ["smithy-rs#3222"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-config/src/environment/app_name.rs b/aws/rust-runtime/aws-config/src/environment/app_name.rs deleted file mode 100644 index 3abf0fdedb9..00000000000 --- a/aws/rust-runtime/aws-config/src/environment/app_name.rs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_types::app_name::AppName; -use aws_types::os_shim_internal::Env; - -/// Load an app name from the `AWS_SDK_UA_APP_ID` environment variable. -#[derive(Debug, Default)] -#[deprecated(note = "This is unused and will be removed in a future release.")] -pub struct EnvironmentVariableAppNameProvider { - env: Env, -} - -#[allow(deprecated)] -impl EnvironmentVariableAppNameProvider { - /// Create a new `EnvironmentVariableAppNameProvider` - pub fn new() -> Self { - Self { env: Env::real() } - } - - #[doc(hidden)] - /// Create an region provider from a given `Env` - /// - /// This method is used for tests that need to override environment variables. - pub fn new_with_env(env: Env) -> Self { - Self { env } - } - - /// Attempts to create an `AppName` from the `AWS_SDK_UA_APP_ID` environment variable. - pub fn app_name(&self) -> Option { - if let Ok(name) = self.env.get("AWS_SDK_UA_APP_ID") { - match AppName::new(name) { - Ok(name) => Some(name), - Err(err) => { - tracing::warn!(err = %DisplayErrorContext(&err), "`AWS_SDK_UA_APP_ID` environment variable value was invalid"); - None - } - } - } else { - None - } - } -} diff --git a/aws/rust-runtime/aws-config/src/environment/mod.rs b/aws/rust-runtime/aws-config/src/environment/mod.rs index dd2c7cba3b9..8a3f658732d 100644 --- a/aws/rust-runtime/aws-config/src/environment/mod.rs +++ b/aws/rust-runtime/aws-config/src/environment/mod.rs @@ -5,9 +5,6 @@ //! Providers that load configuration from environment variables -/// Load app name from the environment -pub mod app_name; - use std::error::Error; use std::fmt::{Display, Formatter}; diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index e9b2d1890fb..5fb0f5592c9 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -355,14 +355,6 @@ mod loader { self } - /// Deprecated. Don't use. - #[deprecated( - note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." - )] - pub fn http_connector(self, http_client: impl HttpClient + 'static) -> Self { - self.http_client(http_client) - } - /// Override the [`HttpClient`](aws_smithy_runtime_api::client::http::HttpClient) for this [`ConfigLoader`]. /// /// The HTTP client will be used for both AWS services and credentials providers. @@ -399,14 +391,6 @@ mod loader { self } - /// The credentials cache has been replaced. Use the identity_cache() method instead. See its rustdoc for an example. - #[deprecated( - note = "The credentials cache has been replaced. Use the identity_cache() method instead for equivalent functionality. See its rustdoc for an example." - )] - pub fn credentials_cache(self) -> Self { - self - } - /// Override the identity cache used to build [`SdkConfig`](aws_types::SdkConfig). /// /// The identity cache caches AWS credentials and SSO tokens. By default, a lazy cache is used @@ -647,33 +631,6 @@ mod loader { self } - /// Set configuration for all sub-loaders (credentials, region etc.) - /// - /// Update the `ProviderConfig` used for all nested loaders. This can be used to override - /// the HTTPs connector used by providers or to stub in an in memory `Env` or `Fs` for testing. - /// - /// # Examples - /// ```no_run - /// # #[cfg(feature = "hyper-client")] - /// # async fn create_config() { - /// use aws_config::provider_config::ProviderConfig; - /// let custom_https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .build(); - /// let provider_config = ProviderConfig::default().with_tcp_connector(custom_https_connector); - /// let shared_config = aws_config::defaults(BehaviorVersion::latest()).configure(provider_config).load().await; - /// # } - /// ``` - #[deprecated( - note = "Use setters on this builder instead. configure is very hard to use correctly." - )] - pub fn configure(mut self, provider_config: ProviderConfig) -> Self { - self.provider_config = Some(provider_config); - self - } - /// Load the default configuration chain /// /// If fields have been overridden during builder construction, the override values will be used. diff --git a/aws/rust-runtime/aws-config/src/profile/app_name.rs b/aws/rust-runtime/aws-config/src/profile/app_name.rs deleted file mode 100644 index 715681dadfc..00000000000 --- a/aws/rust-runtime/aws-config/src/profile/app_name.rs +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Load an app name from an AWS profile - -use super::profile_file::ProfileFiles; -use crate::provider_config::ProviderConfig; -use aws_types::app_name::AppName; - -/// Loads an app name from a profile file -/// -/// This provider will attempt to shared AWS shared configuration and then read the -/// `sdk-ua-app-id` property from the active profile. -/// -#[doc = include_str!("location_of_profile_files.md")] -/// -/// # Examples -/// -/// **Loads "my-app" as the app name** -/// ```ini -/// [default] -/// sdk-ua-app-id = my-app -/// ``` -/// -/// **Loads "my-app" as the app name _if and only if_ the `AWS_PROFILE` environment variable -/// is set to `other`.** -/// ```ini -/// [profile other] -/// sdk-ua-app-id = my-app -/// ``` -/// -/// This provider is part of the [default app name provider chain](crate::default_provider::app_name). -#[derive(Debug, Default)] -#[deprecated( - note = "This is unused and is deprecated for backwards compatibility. It will be removed in a future release." -)] -pub struct ProfileFileAppNameProvider { - provider_config: ProviderConfig, -} - -#[allow(deprecated)] -impl ProfileFileAppNameProvider { - /// Create a new [ProfileFileAppNameProvider} - /// - /// To override the selected profile, set the `AWS_PROFILE` environment variable or use the [`Builder`]. - pub fn new() -> Self { - Self { - provider_config: ProviderConfig::default(), - } - } - - /// [`Builder`] to construct a [`ProfileFileAppNameProvider`] - pub fn builder() -> Builder { - Builder::default() - } - - /// Parses the profile config and attempts to find an app name. - pub async fn app_name(&self) -> Option { - let app_id = self.provider_config.profile().await?.get("sdk-ua-app-id")?; - match AppName::new(app_id.to_owned()) { - Ok(app_name) => Some(app_name), - Err(err) => { - tracing::warn!(err = %err, "`sdk-ua-app-id` property `{}` was invalid", app_id); - None - } - } - } -} - -/// Builder for [ProfileFileAppNameProvider] -#[derive(Debug, Default)] -#[allow(deprecated)] -pub struct Builder { - config: Option, - profile_override: Option, - profile_files: Option, -} - -#[allow(deprecated)] -impl Builder { - /// Override the configuration for this provider - pub fn configure(mut self, config: &ProviderConfig) -> Self { - self.config = Some(config.clone()); - self - } - - /// Override the profile name used by the [ProfileFileAppNameProvider] - pub fn profile_name(mut self, profile_name: impl Into) -> Self { - self.profile_override = Some(profile_name.into()); - self - } - - /// Build a [ProfileFileAppNameProvider] from this builder - #[allow(deprecated)] - pub fn build(self) -> ProfileFileAppNameProvider { - let conf = self - .config - .unwrap_or_default() - .with_profile_config(self.profile_files, self.profile_override); - ProfileFileAppNameProvider { - provider_config: conf, - } - } -} diff --git a/aws/rust-runtime/aws-config/src/profile/mod.rs b/aws/rust-runtime/aws-config/src/profile/mod.rs index bae8db5ee4d..56490f33352 100644 --- a/aws/rust-runtime/aws-config/src/profile/mod.rs +++ b/aws/rust-runtime/aws-config/src/profile/mod.rs @@ -18,7 +18,6 @@ pub use parser::ProfileParseError; #[doc(inline)] pub use parser::{load, Profile, ProfileFileLoadError, ProfileSet, Property}; -pub mod app_name; pub mod credentials; pub mod profile_file; pub mod region; diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index 788cdb546f4..f7865a3d7a5 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -347,14 +347,6 @@ impl ProviderConfig { } } - /// Deprecated. Don't use. - #[deprecated( - note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." - )] - pub fn with_tcp_connector(self, http_client: impl HttpClient + 'static) -> Self { - self.with_http_client(http_client) - } - /// Override the HTTP client for this configuration pub fn with_http_client(self, http_client: impl HttpClient + 'static) -> Self { ProviderConfig { diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 53b23c3cf21..07aa060d310 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -5,11 +5,7 @@ use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::http::{Headers, Response}; -use aws_smithy_types::error::metadata::{ - Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, -}; -#[allow(deprecated)] -use aws_smithy_types::error::Unhandled; +use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata}; const EXTENDED_REQUEST_ID: &str = "s3_extended_request_id"; @@ -37,13 +33,6 @@ impl RequestIdExt for ErrorMetadata { } } -#[allow(deprecated)] -impl RequestIdExt for Unhandled { - fn extended_request_id(&self) -> Option<&str> { - self.meta().extended_request_id() - } -} - impl RequestIdExt for Response { fn extended_request_id(&self) -> Option<&str> { self.headers().extended_request_id() @@ -92,7 +81,7 @@ mod test { fn handle_missing_header() { let resp = Response::try_from(http::Response::builder().status(400).body("").unwrap()).unwrap(); - let mut builder = aws_smithy_types::Error::builder().message("123"); + let mut builder = ErrorMetadata::builder().message("123"); builder = apply_extended_request_id(builder, resp.headers()); assert_eq!(builder.build().extended_request_id(), None); } diff --git a/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs index 89e5923c1ef..9655bec82b3 100644 --- a/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs +++ b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs @@ -167,7 +167,7 @@ mod test { #[test] fn classify_generic() { let policy = AwsErrorCodeClassifier::::new(); - let err = aws_smithy_types::Error::builder().code("SlowDown").build(); + let err = ErrorMetadata::builder().code("SlowDown").build(); let test_response = http::Response::new("OK").map(SdkBody::from); let mut ctx = InterceptorContext::new(Input::doesnt_matter()); @@ -180,7 +180,7 @@ mod test { #[test] fn test_retry_after_header() { let policy = AwsErrorCodeClassifier::::new(); - let err = aws_smithy_types::Error::builder().code("SlowDown").build(); + let err = ErrorMetadata::builder().code("SlowDown").build(); let res = http::Response::builder() .header("x-amz-retry-after", "5000") .body("retry later") diff --git a/aws/rust-runtime/aws-types/src/config.rs b/aws/rust-runtime/aws-types/src/config.rs deleted file mode 100644 index f2fe3da3a2d..00000000000 --- a/aws/rust-runtime/aws-types/src/config.rs +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![deny(missing_docs)] - -//! AWS Shared Config _(deprecated, replaced with [`sdk_config`](crate::sdk_config))_ -//! -//! This module contains an shared configuration representation that is agnostic from a specific service. - -#[deprecated(since = "0.9.0", note = "renamed to crate::SdkConfig")] -/// AWS Shared Configuration -pub type Config = super::SdkConfig; diff --git a/aws/rust-runtime/aws-types/src/request_id.rs b/aws/rust-runtime/aws-types/src/request_id.rs index 97dff4b110a..2d5be5a094d 100644 --- a/aws/rust-runtime/aws-types/src/request_id.rs +++ b/aws/rust-runtime/aws-types/src/request_id.rs @@ -8,12 +8,7 @@ use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_runtime_api::http::Headers; use aws_smithy_runtime_api::http::Response; -use aws_smithy_types::error::metadata::{ - Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, -}; - -#[allow(deprecated)] -use aws_smithy_types::error::Unhandled; +use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata}; /// Constant for the [`ErrorMetadata`] extra field that contains the request ID const AWS_REQUEST_ID: &str = "aws_request_id"; @@ -40,13 +35,6 @@ impl RequestId for ErrorMetadata { } } -#[allow(deprecated)] -impl RequestId for Unhandled { - fn request_id(&self) -> Option<&str> { - self.meta().request_id() - } -} - impl RequestId for Response { fn request_id(&self) -> Option<&str> { self.headers().request_id() diff --git a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs index 570809842a4..1928a49ecb5 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs @@ -6,7 +6,7 @@ use aws_sdk_dynamodb::operation::query::QueryOutput; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_runtime_api::client::ser_de::{ResponseDeserializer, SharedResponseDeserializer}; +use aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer}; use aws_smithy_types::body::SdkBody; use criterion::{criterion_group, criterion_main, Criterion}; diff --git a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs index 6bc0b8a273b..bd510b4aa55 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs @@ -7,7 +7,7 @@ use aws_sdk_dynamodb::operation::put_item::{PutItem, PutItemInput}; use aws_sdk_dynamodb::types::AttributeValue; use aws_smithy_runtime_api::client::interceptors::context::Input; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_runtime_api::client::ser_de::{RequestSerializer, SharedRequestSerializer}; +use aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer}; use aws_smithy_types::config_bag::ConfigBag; use criterion::{criterion_group, criterion_main, Criterion}; diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 9fcf05e0e72..343292055f3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -47,14 +47,6 @@ private class HttpConnectorConfigCustomization( is ServiceConfig.ConfigImpl -> writable { rustTemplate( """ - /// Deprecated. Don't use. - ##[deprecated( - note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." - )] - pub fn http_connector(&self) -> Option<#{SharedHttpClient}> { - self.runtime_components.http_client() - } - /// Return the [`SharedHttpClient`](#{SharedHttpClient}) to use when making requests, if any. pub fn http_client(&self) -> Option<#{SharedHttpClient}> { self.runtime_components.http_client() @@ -67,22 +59,6 @@ private class HttpConnectorConfigCustomization( ServiceConfig.BuilderImpl -> writable { rustTemplate( """ - /// Deprecated. Don't use. - ##[deprecated( - note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." - )] - pub fn http_connector(self, http_client: impl #{HttpClient} + 'static) -> Self { - self.http_client(http_client) - } - - /// Deprecated. Don't use. - ##[deprecated( - note = "HTTP connector configuration changed. See https://github.com/smithy-lang/smithy-rs/discussions/3022 for upgrade guidance." - )] - pub fn set_http_connector(&mut self, http_client: Option<#{SharedHttpClient}>) -> &mut Self { - self.set_http_client(http_client) - } - /// Sets the HTTP client to use when making requests. /// /// ## Examples diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index b2d7984b2d8..e235144f2d7 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -113,7 +113,6 @@ class HttpAuthDecoratorTest { IdentityFuture, ResolveIdentity, SharedIdentityResolver, }; use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::auth::Signer; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::client::runtime_components::{ GetIdentityResolver, RuntimeComponentsBuilder, @@ -164,7 +163,7 @@ class HttpAuthDecoratorTest { #[derive(Debug)] struct CustomIdentity(String); - impl Signer for CustomSigner { + impl Sign for CustomSigner { fn sign_http_request( &self, request: &mut HttpRequest, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt index 590b7acb9c4..1f1b7032411 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt @@ -53,11 +53,12 @@ class OperationErrorGeneratorTest { name = "generates_combined_error_enums", test = """ use crate::operation::greeting::GreetingError; + use aws_smithy_types::error::ErrorMetadata; let error = GreetingError::InvalidGreeting( InvalidGreeting::builder() .message("an error") - .meta(aws_smithy_types::Error::builder().code("InvalidGreeting").message("an error").build()) + .meta(ErrorMetadata::builder().code("InvalidGreeting").message("an error").build()) .build() ); assert_eq!(format!("{}", error), "InvalidGreeting: an error"); @@ -71,7 +72,7 @@ class OperationErrorGeneratorTest { assert_eq!(error.is_complex_error(), false); // Unhandled variants properly delegate message. - let error = GreetingError::generic(aws_smithy_types::Error::builder().message("hello").build()); + let error = GreetingError::generic(ErrorMetadata::builder().message("hello").build()); assert_eq!(error.meta().message(), Some("hello")); let error = GreetingError::unhandled("some other error"); diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt index 8594d703c11..d6d7c5bbf99 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt @@ -85,6 +85,7 @@ class PythonServerEventStreamWrapperGenerator( "MarshallMessage" to RuntimeType.smithyEventStream(runtimeConfig).resolve("frame::MarshallMessage"), "SignMessage" to RuntimeType.smithyEventStream(runtimeConfig).resolve("frame::SignMessage"), "MessageStreamAdapter" to RuntimeType.smithyHttp(runtimeConfig).resolve("event_stream::MessageStreamAdapter"), + "SdkError" to RuntimeType.sdkError(runtimeConfig), ) fun render(writer: RustWriter) { @@ -227,7 +228,7 @@ class PythonServerEventStreamWrapperGenerator( match next { Ok(Some(data)) => Ok(#{PyO3}::Python::with_gil(|py| #{PyO3}::IntoPy::into_py(data, py))), Ok(None) => Err(#{PyO3}::exceptions::PyStopAsyncIteration::new_err("stream exhausted")), - Err(#{SmithyHttp}::result::SdkError::ServiceError(service_err)) => Err(service_err.into_err().into()), + Err(#{SdkError}::ServiceError(service_err)) => Err(service_err.into_err().into()), Err(err) => Err(#{PyO3}::exceptions::PyRuntimeError::new_err(err.to_string())), } })?; diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-http/src/body.rs deleted file mode 100644 index efcc29b7125..00000000000 --- a/rust-runtime/aws-smithy-http/src/body.rs +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type aliases for at least -// one release since 0.56.1 and then remove this module. - -//! Types for representing the body of an HTTP request or response - -/// A generic, boxed error that's `Send` and `Sync` -#[deprecated(note = "`Moved to `aws_smithy_types::body::Error`.")] -pub type Error = aws_smithy_types::body::Error; - -/// SdkBody type -#[deprecated(note = "Moved to `aws_smithy_types::body::SdkBody`.")] -pub type SdkBody = aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-http/src/byte_stream.rs deleted file mode 100644 index 06da29636b2..00000000000 --- a/rust-runtime/aws-smithy-http/src/byte_stream.rs +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type aliases for at least -// one release since 0.56.1 and then remove this module. - -//! ByteStream Abstractions - -/// Non-contiguous Binary Data Storage -#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::AggregatedBytes`.")] -pub type AggregatedBytes = aws_smithy_types::byte_stream::AggregatedBytes; - -/// Stream of binary data -#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::ByteStream`.")] -pub type ByteStream = aws_smithy_types::byte_stream::ByteStream; - -/// Errors related to bytestreams. -pub mod error { - /// An error occurred in the byte stream - #[deprecated(note = "Moved to `aws_smithy_types::byte_stream::error::Error`.")] - pub type Error = aws_smithy_types::byte_stream::error::Error; -} - -/// Builder for creating [`ByteStreams`](aws_smithy_types::byte_stream::ByteStream) from a file/path, with full control over advanced options. -#[cfg(feature = "rt-tokio")] -#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::FsBuilder`.")] -pub type FsBuilder = aws_smithy_types::byte_stream::FsBuilder; - -/// The length (in bytes) to read. Determines whether or not a short read counts as an error. -#[cfg(feature = "rt-tokio")] -#[deprecated(note = "Moved to `aws_smithy_types::byte_stream::Length`.")] -pub type Length = aws_smithy_types::byte_stream::Length; diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs deleted file mode 100644 index e8219a0b60c..00000000000 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type alias for at least -// one release since 0.56.1 and then remove this module. - -//! Types related to connection monitoring and management. - -/// Metadata that tracks the state of an active connection. -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::connection::ConnectionMetadata`.")] -pub type ConnectionMetadata = aws_smithy_runtime_api::client::connection::ConnectionMetadata; diff --git a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs index f0dc00fa978..c822da96e1b 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs @@ -5,6 +5,7 @@ use aws_smithy_eventstream::frame::{write_message_to, MarshallMessage, SignMessage}; use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_types::error::ErrorMetadata; use bytes::Bytes; use futures_core::Stream; use std::error::Error as StdError; @@ -55,7 +56,7 @@ where #[derive(Debug)] pub struct MessageStreamError { kind: MessageStreamErrorKind, - pub(crate) meta: aws_smithy_types::Error, + pub(crate) meta: ErrorMetadata, } #[derive(Debug)] @@ -72,8 +73,8 @@ impl MessageStreamError { } } - /// Creates the `MessageStreamError::Unhandled` variant from a `aws_smithy_types::Error`. - pub fn generic(err: aws_smithy_types::Error) -> Self { + /// Creates the `MessageStreamError::Unhandled` variant from an [`ErrorMetadata`]. + pub fn generic(err: ErrorMetadata) -> Self { Self { meta: err.clone(), kind: MessageStreamErrorKind::Unhandled(err.into()), @@ -82,7 +83,7 @@ impl MessageStreamError { /// Returns error metadata, which includes the error code, message, /// request ID, and potentially additional information. - pub fn meta(&self) -> &aws_smithy_types::Error { + pub fn meta(&self) -> &ErrorMetadata { &self.meta } } diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index 3b6113037c4..618f51ed315 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -15,7 +15,6 @@ //! - Endpoint support //! - HTTP header deserialization //! - Event streams -//! - [`ByteStream`](byte_stream::ByteStream): a misuse-resistant abstraction for streaming binary data //! //! | Feature | Description | //! |----------------|-------------| @@ -25,8 +24,6 @@ #![allow(clippy::derive_partial_eq_without_eq)] #![cfg_attr(docsrs, feature(doc_cfg))] -pub mod body; -pub mod byte_stream; pub mod endpoint; // Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code // generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being @@ -40,10 +37,8 @@ pub mod operation; pub mod query; #[doc(hidden)] pub mod query_writer; -pub mod result; #[cfg(feature = "event-stream")] pub mod event_stream; -pub mod connection; mod urlencode; diff --git a/rust-runtime/aws-smithy-http/src/operation.rs b/rust-runtime/aws-smithy-http/src/operation.rs index 7fad89f1e14..cba50828712 100644 --- a/rust-runtime/aws-smithy-http/src/operation.rs +++ b/rust-runtime/aws-smithy-http/src/operation.rs @@ -9,19 +9,6 @@ use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::borrow::Cow; -//TODO(runtimeCratesVersioningCleanup): Re-point those who use the deprecated type aliases to -// directly depend on `aws_smithy_types` and remove the type aliases below. -/// Errors for operations -pub mod error { - /// An error occurred attempting to build an `Operation` from an input. - #[deprecated(note = "Moved to `aws_smithy_types::error::operation::BuildError`.")] - pub type BuildError = aws_smithy_types::error::operation::BuildError; - - /// An error that occurs when serialization of an operation fails. - #[deprecated(note = "Moved to `aws_smithy_types::error::operation::SerializationError`.")] - pub type SerializationError = aws_smithy_types::error::operation::SerializationError; -} - /// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called. #[derive(Clone, Debug)] pub struct Metadata { diff --git a/rust-runtime/aws-smithy-http/src/result.rs b/rust-runtime/aws-smithy-http/src/result.rs deleted file mode 100644 index c7e5458845a..00000000000 --- a/rust-runtime/aws-smithy-http/src/result.rs +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//TODO(runtimeCratesVersioningCleanup): Keep the following deprecated type aliases for at least -// one release since 0.56.1 and then remove this module. - -//! Types for [`error`](aws_smithy_runtime_api::client::result::SdkError) responses. - -/// Builders for `SdkError` variant context. -pub mod builders { - /// Builder for [`ConstructionFailure`](aws_smithy_runtime_api::client::result::ConstructionFailure). - #[deprecated( - note = "Moved to `aws_smithy_runtime_api::client::result::builders::ConstructionFailureBuilder`." - )] - pub type ConstructionFailureBuilder = - aws_smithy_runtime_api::client::result::builders::ConstructionFailureBuilder; - - /// Builder for [`TimeoutError`](aws_smithy_runtime_api::client::result::TimeoutError). - #[deprecated( - note = "Moved to `aws_smithy_runtime_api::client::result::builders::TimeoutErrorBuilder`." - )] - pub type TimeoutErrorBuilder = - aws_smithy_runtime_api::client::result::builders::TimeoutErrorBuilder; - - /// Builder for [`DispatchFailure`](aws_smithy_runtime_api::client::result::DispatchFailure). - #[deprecated( - note = "Moved to `aws_smithy_runtime_api::client::result::builders::DispatchFailureBuilder`." - )] - pub type DispatchFailureBuilder = - aws_smithy_runtime_api::client::result::builders::DispatchFailureBuilder; - - /// Builder for [`ResponseError`](aws_smithy_runtime_api::client::result::ResponseError). - #[deprecated( - note = "Moved to `aws_smithy_runtime_api::client::result::builders::ResponseErrorBuilder`." - )] - pub type ResponseErrorBuilder = - aws_smithy_runtime_api::client::result::builders::ResponseErrorBuilder; - - /// Builder for [`ServiceError`](aws_smithy_runtime_api::client::result::ServiceError). - #[deprecated( - note = "Moved to `aws_smithy_runtime_api::client::result::builders::ServiceErrorBuilder`." - )] - pub type ServiceErrorBuilder = - aws_smithy_runtime_api::client::result::builders::ServiceErrorBuilder; -} - -/// Error context for [`aws_smithy_runtime_api::client::result::ConstructionFailure`] -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ConstructionFailure`.")] -pub type ConstructionFailure = aws_smithy_runtime_api::client::result::ConstructionFailure; - -/// Error context for [`aws_smithy_runtime_api::client::result::TimeoutError`] -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::TimeoutError`.")] -pub type TimeoutError = aws_smithy_runtime_api::client::result::TimeoutError; - -/// Error context for [`aws_smithy_runtime_api::client::result::DispatchFailure`] -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::DispatchFailure`.")] -pub type DispatchFailure = aws_smithy_runtime_api::client::result::DispatchFailure; - -/// Error context for [`aws_smithy_runtime_api::client::result::ResponseError`] -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ResponseError`.")] -pub type ResponseError = aws_smithy_runtime_api::client::result::ResponseError; - -/// Failed SDK Result -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ServiceError`.")] -pub type ServiceError = aws_smithy_runtime_api::client::result::ServiceError; - -/// Failed SDK Result -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::SdkError`.")] -pub type SdkError = aws_smithy_runtime_api::client::result::SdkError; - -/// Error from the underlying Connector -#[deprecated(note = "Moved to `aws_smithy_runtime_api::client::result::ConnectorError`.")] -pub type ConnectorError = aws_smithy_runtime_api::client::result::ConnectorError; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index 8cc11806f9e..3c435ae7e4b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -81,9 +81,6 @@ impl Storable for AuthSchemeOptionResolverParams { type Storer = StoreReplace; } -#[deprecated(note = "Renamed to ResolveAuthSchemeOptions.")] -pub use ResolveAuthSchemeOptions as AuthSchemeOptionResolver; - /// Resolver for auth scheme options. /// /// The orchestrator needs to select an auth scheme to sign requests with, and potentially @@ -192,9 +189,6 @@ impl ValidateConfig for SharedAuthScheme {} impl_shared_conversions!(convert SharedAuthScheme from AuthScheme using SharedAuthScheme::new); -#[deprecated(note = "Renamed to Sign.")] -pub use Sign as Signer; - /// Signing implementation for an auth scheme. pub trait Sign: Send + Sync + fmt::Debug { /// Sign the given request with the given identity, components, and config. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs index a0818cf4ec4..13e9880a4a5 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -43,9 +43,6 @@ impl Storable for EndpointResolverParams { type Storer = StoreReplace; } -#[deprecated(note = "Renamed to ResolveEndpoint.")] -pub use ResolveEndpoint as EndpointResolver; - /// Configurable endpoint resolver implementation. pub trait ResolveEndpoint: Send + Sync + fmt::Debug { /// Asynchronously resolves an endpoint to use from the given endpoint parameters. diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index 2ea777175cf..1e90d40fb17 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -59,26 +59,6 @@ use std::fmt; use std::sync::Arc; use std::time::Duration; -/// Http Request Types -pub mod request { - use aws_smithy_types::body::SdkBody; - /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HttpError`. - #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HttpError`.")] - pub type HttpError = crate::http::HttpError; - /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HeaderValue`. - #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HeaderValue`.")] - pub type HeaderValue = crate::http::HeaderValue; - /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::Headers`. - #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Headers`.")] - pub type Headers = crate::http::Headers; - /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::HeadersIter`. - #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HeadersIter`.")] - pub type HeadersIter<'a> = crate::http::HeadersIter<'a>; - /// Deprecated: This type has moved to `aws_smithy_runtime_api::http::Request`. - #[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Request`.")] - pub type Request = crate::http::Request; -} - new_type_future! { #[doc = "Future for [`HttpConnector::call`]."] pub struct HttpConnectorFuture<'static, HttpResponse, ConnectorError>; @@ -280,19 +260,3 @@ impl HttpConnectorSettings { self.read_timeout } } - -#[cfg(test)] -mod test { - #[test] - #[allow(deprecated)] - fn re_export_has_default_generic() { - let req1 = super::request::Request::empty(); - let req2 = super::request::Request::<()>::new(()); - fn takes_req(_req: &super::request::Request) {} - fn takes_generic_req(_req: &super::request::Request) {} - - takes_req(&req1); - takes_generic_req(&req1); - takes_generic_req(&req2); - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index fae5e860559..669c4490ab2 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -139,9 +139,6 @@ impl ValidateConfig for SharedIdentityCache { impl_shared_conversions!(convert SharedIdentityCache from ResolveCachedIdentity using SharedIdentityCache::new); -#[deprecated(note = "Renamed to ResolveIdentity.")] -pub use ResolveIdentity as IdentityResolver; - /// Resolver for identities. /// /// Every [`AuthScheme`](crate::client::auth::AuthScheme) has one or more compatible diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 370742c249d..e4fde15ad47 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -55,9 +55,6 @@ macro_rules! interceptor_trait_fn { }; } -#[deprecated(note = "Renamed to Intercept.")] -pub use Intercept as Interceptor; - /// An interceptor allows injecting code into the SDK ’s request execution pipeline. /// /// ## Terminology: diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs index 93013abdd81..080940840f7 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs @@ -493,7 +493,7 @@ impl ProvideErrorMetadata for SdkError where E: ProvideErrorMetadata, { - fn meta(&self) -> &aws_smithy_types::Error { + fn meta(&self) -> &aws_smithy_types::error::ErrorMetadata { match self { SdkError::ConstructionFailure(_) => &EMPTY_ERROR_METADATA, SdkError::TimeoutError(_) => &EMPTY_ERROR_METADATA, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs index 913113c4669..5ca288cbbaf 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs @@ -13,9 +13,6 @@ use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; use std::sync::Arc; -#[deprecated(note = "Renamed to SerializeRequest.")] -pub use SerializeRequest as RequestSerializer; - /// Serialization implementation that converts an [`Input`] into an [`HttpRequest`]. pub trait SerializeRequest: Send + Sync + fmt::Debug { /// Serializes the input into an HTTP request. @@ -54,9 +51,6 @@ impl Storable for SharedRequestSerializer { impl_shared_conversions!(convert SharedRequestSerializer from SerializeRequest using SharedRequestSerializer::new); -#[deprecated(note = "Renamed to DeserializeResponse.")] -pub use DeserializeResponse as ResponseDeserializer; - /// Deserialization implementation that converts an [`HttpResponse`] into an [`Output`] or [`Error`]. pub trait DeserializeResponse: Send + Sync + fmt::Debug { /// For streaming requests, deserializes the response headers. diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs index e18d9c0afc6..7e349c78ec1 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs @@ -4,7 +4,7 @@ */ use aws_smithy_runtime_api::client::identity::{ - IdentityFuture, IdentityResolver, ResolveCachedIdentity, SharedIdentityCache, + IdentityFuture, ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache, SharedIdentityResolver, }; use aws_smithy_runtime_api::shared::IntoShared; diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs index bd1d2840176..8581d7c12cc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs @@ -9,7 +9,7 @@ use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityCachePartition, IdentityFuture, IdentityResolver, ResolveCachedIdentity, + Identity, IdentityCachePartition, IdentityFuture, ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache, SharedIdentityResolver, }; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; @@ -402,7 +402,7 @@ mod tests { f.write_str("ResolverFn") } } - impl IdentityResolver for ResolverFn + impl ResolveIdentity for ResolverFn where F: Fn() -> IdentityFuture<'static> + Send + Sync, { @@ -428,7 +428,7 @@ mod tests { ) -> (LazyCache, SharedIdentityResolver) { #[derive(Debug)] struct Resolver(Mutex>>); - impl IdentityResolver for Resolver { + impl ResolveIdentity for Resolver { fn resolve_identity<'a>( &'a self, _: &'a RuntimeComponents, diff --git a/rust-runtime/aws-smithy-types/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs index 8a36a9ba1ef..2721b1b6b21 100644 --- a/rust-runtime/aws-smithy-types/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -403,24 +403,6 @@ impl ByteStream { .await } - /// Create a ByteStream from a file - /// - /// NOTE: This will NOT result in a retryable ByteStream. For a ByteStream that can be retried in the case of - /// upstream failures, use [`ByteStream::from_path`](ByteStream::from_path) - #[deprecated( - since = "0.40.0", - note = "Prefer the more extensible ByteStream::read_from() API" - )] - #[cfg(feature = "rt-tokio")] - pub async fn from_file( - file: tokio::fs::File, - ) -> Result { - crate::byte_stream::FsBuilder::new() - .file(file) - .build() - .await - } - #[cfg(feature = "rt-tokio")] /// Convert this `ByteStream` into a struct that implements [`AsyncBufRead`](tokio::io::AsyncBufRead). /// diff --git a/rust-runtime/aws-smithy-types/src/error.rs b/rust-runtime/aws-smithy-types/src/error.rs index 28838e4b762..e2375ddf3f5 100644 --- a/rust-runtime/aws-smithy-types/src/error.rs +++ b/rust-runtime/aws-smithy-types/src/error.rs @@ -10,13 +10,9 @@ use std::fmt; pub mod display; pub mod metadata; pub mod operation; -mod unhandled; pub use metadata::ErrorMetadata; -#[allow(deprecated)] -pub use unhandled::Unhandled; - #[derive(Debug)] pub(super) enum TryFromNumberErrorKind { /// Used when the conversion from an integer type into a smaller integer type would be lossy. diff --git a/rust-runtime/aws-smithy-types/src/error/metadata.rs b/rust-runtime/aws-smithy-types/src/error/metadata.rs index 6629753733d..4855b6c3ee8 100644 --- a/rust-runtime/aws-smithy-types/src/error/metadata.rs +++ b/rust-runtime/aws-smithy-types/src/error/metadata.rs @@ -75,13 +75,13 @@ impl Builder { /// /// Typically, these will be accessed with an extension trait: /// ```rust - /// use aws_smithy_types::Error; + /// use aws_smithy_types::error::ErrorMetadata; /// const HOST_ID: &str = "host_id"; /// trait S3ErrorExt { /// fn extended_request_id(&self) -> Option<&str>; /// } /// - /// impl S3ErrorExt for Error { + /// impl S3ErrorExt for ErrorMetadata { /// fn extended_request_id(&self) -> Option<&str> { /// self.extra(HOST_ID) /// } @@ -90,7 +90,7 @@ impl Builder { /// fn main() { /// // Extension trait must be brought into scope /// use S3ErrorExt; - /// let sdk_response: Result<(), Error> = Err(Error::builder().custom(HOST_ID, "x-1234").build()); + /// let sdk_response: Result<(), ErrorMetadata> = Err(ErrorMetadata::builder().custom(HOST_ID, "x-1234").build()); /// if let Err(err) = sdk_response { /// println!("extended request id: {:?}", err.extended_request_id()); /// } diff --git a/rust-runtime/aws-smithy-types/src/error/unhandled.rs b/rust-runtime/aws-smithy-types/src/error/unhandled.rs deleted file mode 100644 index f0cce422fcc..00000000000 --- a/rust-runtime/aws-smithy-types/src/error/unhandled.rs +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![allow(deprecated)] - -//! Unhandled error type. - -use crate::error::{metadata::ProvideErrorMetadata, ErrorMetadata}; -use std::error::Error as StdError; - -#[deprecated(note = "The `Unhandled` type is no longer used by errors.")] -/// Builder for [`Unhandled`] -#[derive(Default, Debug)] -pub struct Builder { - source: Option>, - meta: Option, -} - -impl Builder { - /// Sets the error source - pub fn source(mut self, source: impl Into>) -> Self { - self.source = Some(source.into()); - self - } - - /// Sets the error source - pub fn set_source( - &mut self, - source: Option>, - ) -> &mut Self { - self.source = source; - self - } - - /// Sets the error metadata - pub fn meta(mut self, meta: ErrorMetadata) -> Self { - self.meta = Some(meta); - self - } - - /// Sets the error metadata - pub fn set_meta(&mut self, meta: Option) -> &mut Self { - self.meta = meta; - self - } - - /// Builds the unhandled error - pub fn build(self) -> Unhandled { - Unhandled { - source: self.source.expect("unhandled errors must have a source"), - meta: self.meta.unwrap_or_default(), - } - } -} - -/// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). -/// -/// When logging an error from the SDK, it is recommended that you either wrap the error in -/// [`DisplayErrorContext`](crate::error::display::DisplayErrorContext), use another -/// error reporter library that visits the error's cause/source chain, or call -/// [`Error::source`](std::error::Error::source) for more details about the underlying cause. -#[deprecated(note = "This type is no longer used by errors.")] -#[derive(Debug)] -pub struct Unhandled { - source: Box, - meta: ErrorMetadata, -} - -impl Unhandled { - /// Returns a builder to construct an unhandled error. - pub fn builder() -> Builder { - Default::default() - } -} - -impl std::fmt::Display for Unhandled { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - write!(f, "unhandled error") - } -} - -impl StdError for Unhandled { - fn source(&self) -> Option<&(dyn StdError + 'static)> { - Some(self.source.as_ref() as _) - } -} - -impl ProvideErrorMetadata for Unhandled { - fn meta(&self) -> &ErrorMetadata { - &self.meta - } -} diff --git a/rust-runtime/aws-smithy-types/src/lib.rs b/rust-runtime/aws-smithy-types/src/lib.rs index 386c9057337..79c0a13f5b6 100644 --- a/rust-runtime/aws-smithy-types/src/lib.rs +++ b/rust-runtime/aws-smithy-types/src/lib.rs @@ -38,10 +38,4 @@ pub mod str_bytes; pub use blob::Blob; pub use date_time::DateTime; pub use document::Document; -// TODO(deprecated): Remove deprecated re-export -/// Use [error::ErrorMetadata] instead. -#[deprecated( - note = "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`" -)] -pub use error::ErrorMetadata as Error; pub use number::Number; diff --git a/rust-runtime/inlineable/src/json_errors.rs b/rust-runtime/inlineable/src/json_errors.rs index 4106762051d..b785bbe63bb 100644 --- a/rust-runtime/inlineable/src/json_errors.rs +++ b/rust-runtime/inlineable/src/json_errors.rs @@ -97,7 +97,7 @@ pub fn parse_error_metadata( mod test { use crate::json_errors::{parse_error_body, parse_error_metadata, sanitize_error_code}; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; - use aws_smithy_types::{body::SdkBody, Error}; + use aws_smithy_types::{body::SdkBody, error::ErrorMetadata}; use std::borrow::Cow; #[test] @@ -114,7 +114,7 @@ mod test { parse_error_metadata(response.body().bytes().unwrap(), response.headers()) .unwrap() .build(), - Error::builder() + ErrorMetadata::builder() .code("FooError") .message("Go to foo") .build() @@ -200,7 +200,7 @@ mod test { parse_error_metadata(response.body().bytes().unwrap(), response.headers()) .unwrap() .build(), - Error::builder() + ErrorMetadata::builder() .code("ResourceNotFoundException") .message("Functions from 'us-west-2' are not reachable from us-east-1") .build() From caf86d3f989566ec258075b1d7ec4076495103d8 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 17 Nov 2023 13:59:49 -0500 Subject: [PATCH 286/331] Add Display impl for DateTime (#3235) ## Motivation and Context It implements Display trait For DateTime https://github.com/smithy-lang/smithy-rs/issues/3161 ## Description I implemented Display trait for DateTime ## Testing I used this test ```rust fn test_display_formatting() { // Create a DateTime instance for testing let datetime = DateTime { seconds: 1636761600, // Example timestamp (replace with your actual timestamp) subsecond_nanos: 123456789, // Example subsecond nanos (replace with your actual value) }; // Expected RFC-3339 formatted string let expected = "2021-11-13T00:00:00.123456789Z"; // Format the DateTime using Display trait let formatted = format!("{}", datetime); // Assert that the formatted string matches the expected result assert_eq!(formatted, expected); } ``` ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Hakan Vardar --- CHANGELOG.next.toml | 12 ++++++++++ rust-runtime/aws-smithy-types/Cargo.toml | 10 ++++++++- .../aws-smithy-types/src/date_time/mod.rs | 22 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 546c671ee3a..c0105879ffe 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -92,3 +92,15 @@ the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discuss references = ["smithy-rs#3222"] meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Add `Display` impl for `DateTime`." +references = ["smithy-rs#3183"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "HakanVardarr" + +[[smithy-rs]] +message = "Add `Display` impl for `DateTime`." +references = ["smithy-rs#3183"] +meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "all" } +author = "HakanVardarr" diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index 1f2fae96765..a46f9924fa4 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -14,7 +14,15 @@ repository = "https://github.com/smithy-lang/smithy-rs" byte-stream-poll-next = [] http-body-0-4-x = ["dep:http-body-0-4"] hyper-0-14-x = ["dep:hyper-0-14"] -rt-tokio = ["dep:http-body-0-4", "dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] +rt-tokio = [ + "dep:http-body-0-4", + "dep:tokio-util", + "dep:tokio", + "tokio?/rt", + "tokio?/fs", + "tokio?/io-util", + "tokio-util?/io", +] test-util = [] serde-serialize = [] serde-deserialize = [] diff --git a/rust-runtime/aws-smithy-types/src/date_time/mod.rs b/rust-runtime/aws-smithy-types/src/date_time/mod.rs index 19736dc86a9..9466036bfac 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/mod.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/mod.rs @@ -13,6 +13,7 @@ use std::cmp::Ordering; use std::convert::TryFrom; use std::error::Error as StdError; use std::fmt; +use std::fmt::Display; use std::time::Duration; use std::time::SystemTime; use std::time::UNIX_EPOCH; @@ -329,6 +330,12 @@ impl Ord for DateTime { } } +impl Display for DateTime { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let date = self.fmt(Format::DateTime).map_err(|_| fmt::Error)?; + write!(f, "{}", date) + } +} /// Failure to convert a `DateTime` to or from another type. #[derive(Debug)] #[non_exhaustive] @@ -372,6 +379,21 @@ mod test { use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; + #[test] + fn test_display_date_time() { + let date_time = DateTime::from_secs(1576540098); + assert_eq!(format!("{}", date_time), "2019-12-16T23:48:18Z"); + + let date_time = DateTime::from_fractional_secs(1576540098, 0.52); + assert_eq!(format!("{}", date_time), "2019-12-16T23:48:18.52Z"); + + let date_time = DateTime::from_secs(1699942527); + assert_eq!(format!("{}", date_time), "2023-11-14T06:15:27Z"); + + let date_time = DateTime::from_secs(16995123); + assert_eq!(format!("{}", date_time), "1970-07-16T16:52:03Z"); + } + #[test] fn test_fmt() { let date_time = DateTime::from_secs(1576540098); From f17aeb4d53f49726641d3c73accb966ae289690c Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 17 Nov 2023 13:05:25 -0600 Subject: [PATCH 287/331] Remove #[doc(hidden)] from stable crates (#3226) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR removes `#[doc(hidden)]` from types/functions in stable crates (as defined in [CrateSet.kt](https://github.com/smithy-lang/smithy-rs/blob/ad520b080aa0a3e8239ab2857dafb519c3458088/buildSrc/src/main/kotlin/CrateSet.kt#L19-L33)). They are now `pub`, however, for those that are not intended to be used directly, we preserve the original docs to be explicit about it. After this PR, stable crates contain neither
#[doc(hidden)] ``` ➜ smithy-rs git:(ysaito/remove-doc-hidden) rg -l '#\[doc\(hidden\)\]' aws/rust-runtime/aws-http/src/user_agent.rs CHANGELOG.next.toml CHANGELOG.md rust-runtime/aws-smithy-http/src/lib.rs rust-runtime/aws-smithy-http/src/event_stream/sender.rs rust-runtime/aws-smithy-http/src/event_stream/receiver.rs codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/error/ErrorImplGenerator.kt (this is only for CodegenTarget.SERVER) codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt design/src/server/instrumentation.md design/src/rfcs/rfc0039_forward_compatible_errors.md design/src/rfcs/rfc0032_better_constraint_violations.md design/src/rfcs/rfc0026_client_crate_organization.md rust-runtime/aws-smithy-http-server/src/macros.rs rust-runtime/aws-smithy-http-server/src/routing/mod.rs rust-runtime/aws-smithy-http-server/src/shape_id.rs rust-runtime/aws-smithy-http-server/src/body.rs rust-runtime/aws-smithy-http-server/src/lib.rs rust-runtime/aws-smithy-http-server/src/plugin/mod.rs codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt ```
nor
DocHidden ``` ➜ smithy-rs git:(ysaito/remove-doc-hidden) rg -l 'DocHidden' codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt ```
- [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 12 ++ .../src/default_provider/app_name.rs | 3 +- .../aws-config/src/default_provider/region.rs | 3 +- .../aws-config/src/environment/credentials.rs | 3 +- .../aws-config/src/environment/region.rs | 3 +- .../aws-config/src/profile/parser.rs | 2 +- aws/rust-runtime/aws-inlineable/src/lib.rs | 1 + .../aws-inlineable/src/s3_request_id.rs | 3 +- aws/rust-runtime/aws-sigv4/src/sign.rs | 21 +++ aws/rust-runtime/aws-sigv4/src/sign/v4.rs | 1 - aws/rust-runtime/aws-sigv4/src/sign/v4a.rs | 1 - aws/rust-runtime/aws-types/src/lib.rs | 1 - .../aws-types/src/os_shim_internal.rs | 4 + aws/rust-runtime/aws-types/src/sdk_config.rs | 3 +- aws/sdk/sdk-external-types.toml | 1 + .../ResiliencyConfigCustomization.kt | 4 - .../smithy/generators/OperationGenerator.kt | 4 +- .../src/future/pagination_stream/collect.rs | 1 - .../src/client/interceptors/context.rs | 64 +++++-- .../src/client/orchestrator.rs | 1 - .../src/client/result.rs | 1 - .../src/client/runtime_plugin.rs | 1 - .../aws-smithy-runtime-api/src/lib.rs | 4 - .../aws-smithy-runtime-api/src/macros.rs | 168 ------------------ .../src/client/http/test_util/wire.rs | 1 - .../src/client/orchestrator.rs | 1 - .../src/client/orchestrator/operation.rs | 23 ++- .../aws-smithy-runtime/src/client/retries.rs | 4 +- .../src/client/retries/client_rate_limiter.rs | 156 ++++++++++++++-- .../aws-smithy-types/src/error/metadata.rs | 1 - 30 files changed, 265 insertions(+), 231 deletions(-) delete mode 100644 rust-runtime/aws-smithy-runtime-api/src/macros.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index c0105879ffe..864e324bdfc 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -104,3 +104,15 @@ message = "Add `Display` impl for `DateTime`." references = ["smithy-rs#3183"] meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "all" } author = "HakanVardarr" + +[[smithy-rs]] +message = "Types/functions that were previously `#[doc(hidden)]` in `aws-smithy-async`, `aws-smithy-runtime-api`, `aws-smithy-runtime`, `aws-smithy-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such." +references = ["smithy-rs#3226"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" + +[[aws-sdk-rust]] +message = "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such." +references = ["smithy-rs#3226"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "ysaito1001" diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index 184a1897eec..4507248a41a 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -41,11 +41,10 @@ pub struct Builder { } impl Builder { - #[doc(hidden)] /// Configure the default chain /// /// Exposed for overriding the environment when unit-testing providers - pub fn configure(self, configuration: &ProviderConfig) -> Self { + pub(crate) fn configure(self, configuration: &ProviderConfig) -> Self { Self { provider_config: configuration.clone(), } diff --git a/aws/rust-runtime/aws-config/src/default_provider/region.rs b/aws/rust-runtime/aws-config/src/default_provider/region.rs index f7b882446e8..db82b720b98 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/region.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/region.rs @@ -45,11 +45,10 @@ pub struct Builder { } impl Builder { - #[doc(hidden)] /// Configure the default chain /// /// Exposed for overriding the environment when unit-testing providers - pub fn configure(mut self, configuration: &ProviderConfig) -> Self { + pub(crate) fn configure(mut self, configuration: &ProviderConfig) -> Self { self.env_provider = EnvironmentVariableRegionProvider::new_with_env(configuration.env()); self.profile_file = self.profile_file.configure(configuration); self.imds = self.imds.configure(configuration); diff --git a/aws/rust-runtime/aws-config/src/environment/credentials.rs b/aws/rust-runtime/aws-config/src/environment/credentials.rs index fa015df41ea..f7e7c0888b4 100644 --- a/aws/rust-runtime/aws-config/src/environment/credentials.rs +++ b/aws/rust-runtime/aws-config/src/environment/credentials.rs @@ -58,11 +58,10 @@ impl EnvironmentVariableCredentialsProvider { Self::new_with_env(Env::real()) } - #[doc(hidden)] /// Create a new `EnvironmentVariableCredentialsProvider` with `Env` overridden /// /// This function is intended for tests that mock out the process environment. - pub fn new_with_env(env: Env) -> Self { + pub(crate) fn new_with_env(env: Env) -> Self { Self { env } } } diff --git a/aws/rust-runtime/aws-config/src/environment/region.rs b/aws/rust-runtime/aws-config/src/environment/region.rs index 48859cbe4c7..2f389bb479d 100644 --- a/aws/rust-runtime/aws-config/src/environment/region.rs +++ b/aws/rust-runtime/aws-config/src/environment/region.rs @@ -22,11 +22,10 @@ impl EnvironmentVariableRegionProvider { EnvironmentVariableRegionProvider { env: Env::real() } } - #[doc(hidden)] /// Create an region provider from a given `Env` /// /// This method is used for tests that need to override environment variables. - pub fn new_with_env(env: Env) -> Self { + pub(crate) fn new_with_env(env: Env) -> Self { EnvironmentVariableRegionProvider { env } } } diff --git a/aws/rust-runtime/aws-config/src/profile/parser.rs b/aws/rust-runtime/aws-config/src/profile/parser.rs index 6d6dc204a33..ef291e264ba 100644 --- a/aws/rust-runtime/aws-config/src/profile/parser.rs +++ b/aws/rust-runtime/aws-config/src/profile/parser.rs @@ -237,7 +237,7 @@ impl From for ProfileFileLoadError { } } -#[doc(hidden)] +/// An error encountered while reading the AWS config file #[derive(Debug, Clone)] pub struct CouldNotReadProfileFile { pub(crate) path: PathBuf, diff --git a/aws/rust-runtime/aws-inlineable/src/lib.rs b/aws/rust-runtime/aws-inlineable/src/lib.rs index 71858b23249..3ff04ff755c 100644 --- a/aws/rust-runtime/aws-inlineable/src/lib.rs +++ b/aws/rust-runtime/aws-inlineable/src/lib.rs @@ -29,6 +29,7 @@ pub mod presigning; pub mod presigning_interceptors; /// Special logic for extracting request IDs from S3's responses. +#[allow(dead_code)] pub mod s3_request_id; /// Glacier-specific behavior diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index 07aa060d310..26cfa745e3b 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -59,8 +59,7 @@ where } /// Applies the extended request ID to a generic error builder -#[doc(hidden)] -pub fn apply_extended_request_id( +pub(crate) fn apply_extended_request_id( builder: ErrorMetadataBuilder, headers: &Headers, ) -> ErrorMetadataBuilder { diff --git a/aws/rust-runtime/aws-sigv4/src/sign.rs b/aws/rust-runtime/aws-sigv4/src/sign.rs index 8f02ee57ad4..fa220a7f496 100644 --- a/aws/rust-runtime/aws-sigv4/src/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/sign.rs @@ -5,6 +5,27 @@ //! Functions to create signing keys and calculate signatures. +// macro lifted from aws-smithy-runtime-api—eventually just inline these and delete macro. +macro_rules! builder_methods { + ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal, $($tail:tt)+) => { + builder_methods!($fn_name, $arg_name, $ty, $doc); + builder_methods!($($tail)+); + }; + ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal) => { + #[doc = $doc] + pub fn $fn_name(&mut self, $arg_name: Option<$ty>) -> &mut Self { + self.$arg_name = $arg_name; + self + } + + #[doc = $doc] + pub fn $arg_name(mut self, $arg_name: $ty) -> Self { + self.$arg_name = Some($arg_name); + self + } + }; +} + /// Support for Sigv4 signing pub mod v4; diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4.rs index ee1d961e075..2a1159fe185 100644 --- a/aws/rust-runtime/aws-sigv4/src/sign/v4.rs +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4.rs @@ -109,7 +109,6 @@ impl<'a, S: Default> SigningParams<'a, S> { /// Builder and error for creating [`SigningParams`] pub mod signing_params { use super::SigningParams; - use aws_smithy_runtime_api::builder_methods; use aws_smithy_runtime_api::client::identity::Identity; use std::error::Error; use std::fmt; diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs index a8cb3f9538f..502190ffa1a 100644 --- a/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs @@ -130,7 +130,6 @@ impl<'a, S: Default> SigningParams<'a, S> { /// Builder and error for creating [`SigningParams`] pub mod signing_params { use super::SigningParams; - use aws_smithy_runtime_api::builder_methods; use aws_smithy_runtime_api::client::identity::Identity; use std::error::Error; use std::fmt; diff --git a/aws/rust-runtime/aws-types/src/lib.rs b/aws/rust-runtime/aws-types/src/lib.rs index b3fbda83f34..d9f76ecd7ce 100644 --- a/aws/rust-runtime/aws-types/src/lib.rs +++ b/aws/rust-runtime/aws-types/src/lib.rs @@ -17,7 +17,6 @@ pub mod app_name; pub mod build_metadata; pub mod endpoint_config; -#[doc(hidden)] pub mod os_shim_internal; pub mod region; pub mod request_id; diff --git a/aws/rust-runtime/aws-types/src/os_shim_internal.rs b/aws/rust-runtime/aws-types/src/os_shim_internal.rs index 53b26706f79..ad806bd6f2c 100644 --- a/aws/rust-runtime/aws-types/src/os_shim_internal.rs +++ b/aws/rust-runtime/aws-types/src/os_shim_internal.rs @@ -45,14 +45,17 @@ impl Default for Fs { } impl Fs { + /// Create `Fs` representing a real file system. pub fn real() -> Self { Fs(fs::Inner::Real) } + /// Create `Fs` from a map of `OsString` to `Vec`. pub fn from_raw_map(fs: HashMap>) -> Self { Fs(fs::Inner::Fake(Arc::new(Fake::MapFs(Mutex::new(fs))))) } + /// Create `Fs` from a map of `String` to `Vec`. pub fn from_map(data: HashMap>>) -> Self { let fs = data .into_iter() @@ -224,6 +227,7 @@ impl Default for Env { } impl Env { + /// Retrieve a value for the given `k` and return `VarError` is that key is not present. pub fn get(&self, k: &str) -> Result { use env::Inner; match &self.0 { diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 1da2bfe6574..4371f1d4a3a 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -26,9 +26,9 @@ use aws_smithy_runtime_api::shared::IntoShared; pub use aws_smithy_types::retry::RetryConfig; pub use aws_smithy_types::timeout::TimeoutConfig; -#[doc(hidden)] /// Unified docstrings to keep crates in sync. Not intended for public use pub mod unified_docs { + /// A macro that generates docs for selected fields of `SdkConfig`. #[macro_export] macro_rules! docs_for { (use_fips) => { @@ -667,7 +667,6 @@ impl SdkConfig { self.timeout_config.as_ref() } - #[doc(hidden)] /// Configured sleep implementation pub fn sleep_impl(&self) -> Option { self.sleep_impl.clone() diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index 0fa9bbc3a21..2de1ff7c41a 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -14,6 +14,7 @@ allowed_external_types = [ "aws_smithy_eventstream::*", "aws_smithy_runtime::client::identity::cache::IdentityCache", + "aws_smithy_runtime::client::retries::RetryPartition", "aws_runtime::invocation_id::SharedInvocationIdGenerator", "aws_runtime::invocation_id::InvocationIdGenerator", diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index a945ae2fc11..0f64fa0ccf7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -10,7 +10,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -65,7 +64,6 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf self.config.load::<#{TimeoutConfig}>() } - ##[doc(hidden)] /// Returns a reference to the retry partition contained in this config, if any. /// /// WARNING: This method is unstable and may be removed at any time. Do not rely on this @@ -248,7 +246,6 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf *codegenScope, ) - Attribute.DocHidden.render(this) rustTemplate( """ /// Set the partition for retry-related state. When clients share a retry partition, they will @@ -262,7 +259,6 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf *codegenScope, ) - Attribute.DocHidden.render(this) rustTemplate( """ /// Set the partition for retry-related state. When clients share a retry partition, they will diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index 842a427f5e4..f96534ed9db 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -16,6 +16,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientHttpBou import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -77,10 +78,9 @@ open class OperationGenerator( ) Attribute(derive(RuntimeType.Clone, RuntimeType.Default, RuntimeType.Debug)).render(operationWriter) Attribute.NonExhaustive.render(operationWriter) - Attribute.DocHidden.render(operationWriter) operationWriter.rust("pub struct $operationName;") operationWriter.implBlock(symbolProvider.toSymbol(operationShape)) { - Attribute.DocHidden.render(operationWriter) + docs("Creates a new `$operationName`") rustBlock("pub fn new() -> Self") { rust("Self") } diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs index 1a6fcfbf9ad..b74e08f7356 100644 --- a/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs @@ -14,7 +14,6 @@ pub(crate) mod sealed { /// /// Currently the trait may not be implemented by clients so we can make changes in the future /// without breaking code depending on it. - #[doc(hidden)] pub trait Collectable { type Collection; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index b3844f0bf53..c7054c11c73 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -147,73 +147,101 @@ impl InterceptorContext { impl InterceptorContext { /// Retrieve the input for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn input(&self) -> Option<&I> { self.input.as_ref() } /// Retrieve the input for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn input_mut(&mut self) -> Option<&mut I> { self.input.as_mut() } /// Takes ownership of the input. + /// + /// Note: This method is intended for internal use only. pub fn take_input(&mut self) -> Option { self.input.take() } /// Set the request for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn set_request(&mut self, request: Request) { self.request = Some(request); } /// Retrieve the transmittable request for the operation being invoked. /// This will only be available once request marshalling has completed. + /// + /// Note: This method is intended for internal use only. pub fn request(&self) -> Option<&Request> { self.request.as_ref() } /// Retrieve the transmittable request for the operation being invoked. /// This will only be available once request marshalling has completed. + /// + /// Note: This method is intended for internal use only. pub fn request_mut(&mut self) -> Option<&mut Request> { self.request.as_mut() } /// Takes ownership of the request. + /// + /// Note: This method is intended for internal use only. pub fn take_request(&mut self) -> Option { self.request.take() } /// Set the response for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn set_response(&mut self, response: Response) { self.response = Some(response); } /// Returns the response. + /// + /// Note: This method is intended for internal use only. pub fn response(&self) -> Option<&Response> { self.response.as_ref() } /// Returns a mutable reference to the response. + /// + /// Note: This method is intended for internal use only. pub fn response_mut(&mut self) -> Option<&mut Response> { self.response.as_mut() } /// Set the output or error for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn set_output_or_error(&mut self, output: Result>) { self.output_or_error = Some(output); } /// Returns the deserialized output or error. + /// + /// Note: This method is intended for internal use only. pub fn output_or_error(&self) -> Option>> { self.output_or_error.as_ref().map(Result::as_ref) } /// Returns the mutable reference to the deserialized output or error. + /// + /// Note: This method is intended for internal use only. pub fn output_or_error_mut(&mut self) -> Option<&mut Result>> { self.output_or_error.as_mut() } /// Return `true` if this context's `output_or_error` is an error. Otherwise, return `false`. + /// + /// Note: This method is intended for internal use only. pub fn is_failed(&self) -> bool { self.output_or_error .as_ref() @@ -222,7 +250,8 @@ impl InterceptorContext { } /// Advance to the Serialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_serialization_phase(&mut self) { debug!("entering \'serialization\' phase"); debug_assert!( @@ -233,7 +262,8 @@ impl InterceptorContext { } /// Advance to the BeforeTransmit phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_before_transmit_phase(&mut self) { debug!("entering \'before transmit\' phase"); debug_assert!( @@ -253,7 +283,8 @@ impl InterceptorContext { } /// Advance to the Transmit phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_transmit_phase(&mut self) { debug!("entering \'transmit\' phase"); debug_assert!( @@ -264,7 +295,8 @@ impl InterceptorContext { } /// Advance to the BeforeDeserialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_before_deserialization_phase(&mut self) { debug!("entering \'before deserialization\' phase"); debug_assert!( @@ -283,7 +315,8 @@ impl InterceptorContext { } /// Advance to the Deserialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_deserialization_phase(&mut self) { debug!("entering \'deserialization\' phase"); debug_assert!( @@ -294,7 +327,8 @@ impl InterceptorContext { } /// Advance to the AfterDeserialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_after_deserialization_phase(&mut self) { debug!("entering \'after deserialization\' phase"); debug_assert!( @@ -309,7 +343,8 @@ impl InterceptorContext { } /// Set the request checkpoint. This should only be called once, right before entering the retry loop. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn save_checkpoint(&mut self) { trace!("saving request checkpoint..."); self.request_checkpoint = self.request().and_then(|r| r.try_clone()); @@ -320,7 +355,8 @@ impl InterceptorContext { } /// Returns false if rewinding isn't possible - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn rewind(&mut self, _cfg: &mut ConfigBag) -> RewindResult { // If request_checkpoint was never set, but we've already made one attempt, // then this is not a retryable request @@ -351,7 +387,8 @@ where E: Debug, { /// Decomposes the context into its constituent parts. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. #[allow(clippy::type_complexity)] pub fn into_parts( self, @@ -370,7 +407,8 @@ where } /// Convert this context into the final operation result that is returned in client's the public API. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn finalize(self) -> Result> { let Self { output_or_error, @@ -385,6 +423,8 @@ where /// Mark this context as failed due to errors during the operation. Any errors already contained /// by the context will be replaced by the given error. + /// + /// Note: This method is intended for internal use only. pub fn fail(&mut self, error: OrchestratorError) { if !self.is_failed() { trace!( @@ -399,8 +439,10 @@ where } /// The result of attempting to rewind a request. +/// +/// Note: This is intended for internal use only. +#[non_exhaustive] #[derive(Debug, PartialEq, Eq, Clone, Copy)] -#[doc(hidden)] pub enum RewindResult { /// The request couldn't be rewound because it wasn't cloneable. Impossible, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index de49383e211..873b8a1cc3b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -215,7 +215,6 @@ impl OrchestratorError { } /// Maps the error type in `ErrorKind::Operation` - #[doc(hidden)] pub fn map_operation_error(self, map: impl FnOnce(E) -> E2) -> OrchestratorError { let kind = match self.kind { ErrorKind::Connector { source } => ErrorKind::Connector { source }, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs index 080940840f7..09797c21b9a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/result.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs @@ -438,7 +438,6 @@ impl SdkError { } /// Maps the service error type in `SdkError::ServiceError` - #[doc(hidden)] pub fn map_service_error(self, map: impl FnOnce(E) -> E2) -> SdkError { match self { SdkError::ServiceError(context) => SdkError::::ServiceError(ServiceError { diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index fa243211fe4..757224051df 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -228,7 +228,6 @@ macro_rules! apply_plugins { } /// Used internally in the orchestrator implementation and in the generated code. Not intended to be used elsewhere. -#[doc(hidden)] #[derive(Default, Clone, Debug)] pub struct RuntimePlugins { client_plugins: Vec, diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index 3a96c8d07a7..be0ca84d613 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -33,8 +33,4 @@ pub mod client; pub mod http; -/// Internal builder macros. Not intended to be used outside of the aws-smithy-runtime crates. -#[doc(hidden)] -pub mod macros; - pub mod shared; diff --git a/rust-runtime/aws-smithy-runtime-api/src/macros.rs b/rust-runtime/aws-smithy-runtime-api/src/macros.rs deleted file mode 100644 index 759d1b8452a..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/macros.rs +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Various utility macros to aid runtime crate writers. - -/// Define a new builder struct, along with a method to create it, and setters. -/// -/// ## Examples -/// -/// The builder macro takes a list of field definitions, each with four elements: -/// ```txt -/// set_optional_field, optional_field, String, "An optional field which may or may not be set when `.build()` is called.", -/// ^ The setter name, ^ The field name, ^ The type, ^ The documentation for the field and setter methods. -/// ``` -/// -/// The following example creates a new builder struct, along with a method to create it, and setters -/// for a struct `MyConfig` with three fields: -/// -/// ``` -/// use std::collections::HashMap; -/// use std::sync::{Arc, Mutex}; -/// use aws_smithy_runtime_api::{builder, builder_methods, builder_struct}; -/// -/// struct MyConfig { -/// optional_field: Option, -/// optional_field_with_a_default: f64, -/// required_field_with_no_default: Arc>>, -/// } -/// -/// impl MyConfig { -/// pub fn builder() -> Builder { -/// Builder::new() -/// } -/// } -/// -/// builder!( -/// set_optional_field, optional_field, String, "An optional field which may or may not be set when `.build()` is called.", -/// set_optional_field_with_a_default, optional_field_with_a_default, f64, "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called.", -/// set_required_field_with_no_default, required_field_with_no_default, HashMap, "A required field that will cause the builder to panic if it's unset when `.build()` is called." -/// ); -/// -/// impl Builder { -/// fn build(self) -> MyConfig { -/// MyConfig { -/// optional_field: self.optional_field, -/// optional_field_with_a_default: self.optional_field_with_a_default.unwrap_or(f64::MAX), -/// required_field_with_no_default: Arc::new(Mutex::new( -/// self.required_field_with_no_default.expect("'required_field_with_no_default' is required") -/// )), -/// } -/// } -/// } -/// ``` -/// -/// In this example, the result of macro expansion would look like this: -/// -/// ``` -/// # use std::collections::HashMap; -/// # use std::sync::{Arc, Mutex}; -/// #[derive(Clone, Debug, Default)] -/// pub struct Builder { -/// #[doc = "An optional field which may or may not be set when `.build()` is called."] -/// optional_field: Option, -/// #[doc = "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called."] -/// optional_field_with_a_default: Option, -/// #[doc = "A required field that will cause the builder to panic if it's unset when `.build()` is called."] -/// required_field_with_no_default: Option>, -/// } -/// -/// impl Builder { -/// pub fn new() -> Self { -/// Builder::default() -/// } -/// -/// #[doc = "An optional field which may or may not be set when `.build()` is called."] -/// pub fn set_optional_field(&mut self, optional_field: Option) -> &mut Self { -/// self.optional_field = optional_field; -/// self -/// } -/// -/// #[doc = "An optional field which may or may not be set when `.build()` is called."] -/// pub fn optional_field(mut self, optional_field: String) -> Self { -/// self.optional_field = Some(optional_field); -/// self -/// } -/// -/// #[doc = "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called."] -/// pub fn set_optional_field_with_a_default(&mut self, optional_field_with_a_default: Option) -> &mut Self { -/// self.optional_field_with_a_default = optional_field_with_a_default; -/// self -/// } -/// -/// #[doc = "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called."] -/// pub fn optional_field_with_a_default(mut self, optional_field_with_a_default: f64) -> Self { -/// self.optional_field_with_a_default = Some(optional_field_with_a_default); -/// self -/// } -/// -/// #[doc = "A required field that will cause the builder to panic if it's unset when `.build()` is called."] -/// pub fn set_required_field_with_no_default(&mut self, required_field_with_no_default: Option>) -> &mut Self { -/// self.required_field_with_no_default = required_field_with_no_default; -/// self -/// } -/// -/// #[doc = "A required field that will cause the builder to panic if it's unset when `.build()` is called."] -/// pub fn required_field_with_no_default(mut self, required_field_with_no_default: HashMap) -> Self { -/// self.required_field_with_no_default = Some(required_field_with_no_default); -/// self -/// } -/// } -/// ``` -#[doc(hidden)] -#[macro_export] -macro_rules! builder { - ($($tt:tt)+) => { - builder_struct!($($tt)+); - - impl Builder { - pub fn new() -> Self { - Builder::default() - } - - builder_methods!($($tt)+); - } - } -} - -/// Define a new builder struct, its fields, and their docs. This macro is intended to be called -/// by the `builder!` macro and should not be called directly. -#[doc(hidden)] -#[macro_export] -macro_rules! builder_struct { - ($($_setter_name:ident, $field_name:ident, $ty:ty, $doc:literal $(,)?)+) => { - #[derive(Clone, Debug, Default)] - pub struct Builder { - $( - #[doc = $doc] - $field_name: Option<$ty>, - )+ - } - } -} - -/// Define setter methods for a builder struct. Must be called from within an `impl` block. This -/// macro is intended to be called by the `builder!` macro and should not be called directly. -#[doc(hidden)] -#[macro_export] -macro_rules! builder_methods { - ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal, $($tail:tt)+) => { - builder_methods!($fn_name, $arg_name, $ty, $doc); - builder_methods!($($tail)+); - }; - ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal) => { - #[doc = $doc] - pub fn $fn_name(&mut self, $arg_name: Option<$ty>) -> &mut Self { - self.$arg_name = $arg_name; - self - } - - #[doc = $doc] - pub fn $arg_name(mut self, $arg_name: $ty) -> Self { - self.$arg_name = Some($arg_name); - self - } - }; -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs index e152c9b11c0..6c0a6191173 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs @@ -75,7 +75,6 @@ type Matcher = ( ); /// This method should only be used by the macro -#[doc(hidden)] pub fn check_matches(events: &[RecordedEvent], matchers: &[Matcher]) { let mut events_iter = events.iter(); let mut matcher_iter = matchers.iter(); diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index bfff5480720..e9fcb661535 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -43,7 +43,6 @@ pub mod endpoints; mod http; /// Utility for making one-off unmodeled requests with the orchestrator. -#[doc(hidden)] pub mod operation; macro_rules! halt { diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index bff3cd1f4bd..5ae8ab04d80 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -104,7 +104,6 @@ impl fmt::Debug for FnDeserializer { } /// Orchestrates execution of a HTTP request without any modeled input or output. -#[doc(hidden)] #[derive(Debug)] pub struct Operation { service_name: Cow<'static, str>, @@ -126,6 +125,7 @@ impl Clone for Operation { } impl Operation<(), (), ()> { + /// Returns a new `OperationBuilder` for the `Operation`. pub fn builder() -> OperationBuilder { OperationBuilder::new() } @@ -137,6 +137,8 @@ where O: fmt::Debug + Send + Sync + 'static, E: std::error::Error + fmt::Debug + Send + Sync + 'static, { + /// Invokes this `Operation` with the given `input` and returns either an output for success + /// or an [`SdkError`] for failure pub async fn invoke(&self, input: I) -> Result> { let input = Input::erase(input); @@ -153,7 +155,7 @@ where } } -#[doc(hidden)] +/// Builder for [`Operation`]. #[derive(Debug)] pub struct OperationBuilder { service_name: Option>, @@ -171,6 +173,7 @@ impl Default for OperationBuilder<(), (), ()> { } impl OperationBuilder<(), (), ()> { + /// Creates a new [`OperationBuilder`]. pub fn new() -> Self { Self { service_name: None, @@ -184,21 +187,25 @@ impl OperationBuilder<(), (), ()> { } impl OperationBuilder { + /// Configures the service name for the builder. pub fn service_name(mut self, service_name: impl Into>) -> Self { self.service_name = Some(service_name.into()); self } + /// Configures the operation name for the builder. pub fn operation_name(mut self, operation_name: impl Into>) -> Self { self.operation_name = Some(operation_name.into()); self } + /// Configures the http client for the builder. pub fn http_client(mut self, connector: impl HttpClient + 'static) -> Self { self.runtime_components.set_http_client(Some(connector)); self } + /// Configures the endpoint URL for the builder. pub fn endpoint_url(mut self, url: &str) -> Self { self.config.store_put(EndpointResolverParams::new(())); self.runtime_components @@ -208,18 +215,21 @@ impl OperationBuilder { self } + /// Configures the retry classifier for the builder. pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { self.runtime_components .push_retry_classifier(retry_classifier); self } + /// Disables the retry for the operation. pub fn no_retry(mut self) -> Self { self.runtime_components .set_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))); self } + /// Configures the standard retry for the builder. pub fn standard_retry(mut self, retry_config: &RetryConfig) -> Self { self.config.store_put(retry_config.clone()); self.runtime_components @@ -227,11 +237,13 @@ impl OperationBuilder { self } + /// Configures the timeout configuration for the builder. pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self { self.config.store_put(timeout_config); self } + /// Disables auth for the operation. pub fn no_auth(mut self) -> Self { self.config .store_put(AuthSchemeOptionResolverParams::new(())); @@ -250,18 +262,21 @@ impl OperationBuilder { self } + /// Configures the sleep for the builder. pub fn sleep_impl(mut self, async_sleep: impl AsyncSleep + 'static) -> Self { self.runtime_components .set_sleep_impl(Some(async_sleep.into_shared())); self } + /// Configures the time source for the builder. pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { self.runtime_components .set_time_source(Some(time_source.into_shared())); self } + /// Configures the interceptor for the builder. pub fn interceptor(mut self, interceptor: impl Intercept + 'static) -> Self { self.runtime_components.push_interceptor(interceptor); self @@ -272,11 +287,13 @@ impl OperationBuilder { self.interceptor(ConnectionPoisoningInterceptor::new()) } + /// Configures the runtime plugin for the builder. pub fn runtime_plugin(mut self, runtime_plugin: impl RuntimePlugin + 'static) -> Self { self.runtime_plugins.push(runtime_plugin.into_shared()); self } + /// Configures the serializer for the builder. pub fn serializer( mut self, serializer: impl Fn(I2) -> Result + Send + Sync + 'static, @@ -296,6 +313,7 @@ impl OperationBuilder { } } + /// Configures the deserializer for the builder. pub fn deserializer( mut self, deserializer: impl Fn(&HttpResponse) -> Result> @@ -321,6 +339,7 @@ impl OperationBuilder { } } + /// Creates an `Operation` from the builder. pub fn build(self) -> Operation { let service_name = self.service_name.expect("service_name required"); let operation_name = self.operation_name.expect("operation_name required"); diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries.rs b/rust-runtime/aws-smithy-runtime/src/client/retries.rs index b275b235287..95a901a1275 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries.rs @@ -18,11 +18,10 @@ use std::fmt; pub use client_rate_limiter::ClientRateLimiter; pub use token_bucket::TokenBucket; -#[doc(hidden)] pub use client_rate_limiter::ClientRateLimiterPartition; use std::borrow::Cow; -#[doc(hidden)] +/// Represents the retry partition, e.g. an endpoint, a region #[non_exhaustive] #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct RetryPartition { @@ -30,6 +29,7 @@ pub struct RetryPartition { } impl RetryPartition { + /// Creates a new `RetryPartition` from the given `name`. pub fn new(name: impl Into>) -> Self { Self { name: name.into() } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs index 3e010b0c600..80efa6a81db 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs @@ -9,12 +9,11 @@ #![allow(dead_code)] use crate::client::retries::RetryPartition; -use aws_smithy_runtime_api::{builder, builder_methods, builder_struct}; use std::sync::{Arc, Mutex}; use std::time::Duration; use tracing::debug; -#[doc(hidden)] +/// Represents a partition for the rate limiter, e.g. an endpoint, a region #[non_exhaustive] #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct ClientRateLimiterPartition { @@ -22,6 +21,7 @@ pub struct ClientRateLimiterPartition { } impl ClientRateLimiterPartition { + /// Creates a `ClientRateLimiterPartition` from the given [`RetryPartition`] pub fn new(retry_partition: RetryPartition) -> Self { Self { retry_partition } } @@ -78,7 +78,7 @@ pub(crate) enum RequestReason { } impl ClientRateLimiter { - /// Creates a new [`ClientRateLimiter`]. + /// Creates a new `ClientRateLimiter` pub fn new(seconds_since_unix_epoch: f64) -> Self { Self::builder() .tokens_retrieved_per_second(MIN_FILL_RATE) @@ -231,20 +231,146 @@ fn cubic_throttle(rate_to_use: f64) -> f64 { rate_to_use * BETA } -builder!( - set_token_refill_rate, token_refill_rate, f64, "The rate at which token are replenished.", - set_maximum_bucket_capacity, maximum_bucket_capacity, f64, "The maximum capacity allowed in the token bucket.", - set_current_bucket_capacity, current_bucket_capacity, f64, "The current capacity of the token bucket. The minimum this can be is 1.0", - set_time_of_last_refill, time_of_last_refill, f64, "The last time the token bucket was refilled.", - set_tokens_retrieved_per_second, tokens_retrieved_per_second, f64, "The smoothed rate which tokens are being retrieved.", - set_previous_time_bucket, previous_time_bucket, f64, "The last half second time bucket used.", - set_request_count, request_count, u64, "The number of requests seen within the current time bucket.", - set_enable_throttling, enable_throttling, bool, "Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled.", - set_tokens_retrieved_per_second_at_time_of_last_throttle, tokens_retrieved_per_second_at_time_of_last_throttle, f64, "The maximum rate when the client was last throttled.", - set_time_of_last_throttle, time_of_last_throttle, f64, "The last time when the client was throttled." -); +#[derive(Clone, Debug, Default)] +struct Builder { + ///The rate at which token are replenished. + token_refill_rate: Option, + ///The maximum capacity allowed in the token bucket. + maximum_bucket_capacity: Option, + ///The current capacity of the token bucket. The minimum this can be is 1.0 + current_bucket_capacity: Option, + ///The last time the token bucket was refilled. + time_of_last_refill: Option, + ///The smoothed rate which tokens are being retrieved. + tokens_retrieved_per_second: Option, + ///The last half second time bucket used. + previous_time_bucket: Option, + ///The number of requests seen within the current time bucket. + request_count: Option, + ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled. + enable_throttling: Option, + ///The maximum rate when the client was last throttled. + tokens_retrieved_per_second_at_time_of_last_throttle: Option, + ///The last time when the client was throttled. + time_of_last_throttle: Option, +} impl Builder { + fn new() -> Self { + Builder::default() + } + ///The rate at which token are replenished. + fn set_token_refill_rate(&mut self, token_refill_rate: Option) -> &mut Self { + self.token_refill_rate = token_refill_rate; + self + } + ///The rate at which token are replenished. + fn token_refill_rate(mut self, token_refill_rate: f64) -> Self { + self.token_refill_rate = Some(token_refill_rate); + self + } + ///The maximum capacity allowed in the token bucket. + fn set_maximum_bucket_capacity(&mut self, maximum_bucket_capacity: Option) -> &mut Self { + self.maximum_bucket_capacity = maximum_bucket_capacity; + self + } + ///The maximum capacity allowed in the token bucket. + fn maximum_bucket_capacity(mut self, maximum_bucket_capacity: f64) -> Self { + self.maximum_bucket_capacity = Some(maximum_bucket_capacity); + self + } + ///The current capacity of the token bucket. The minimum this can be is 1.0 + fn set_current_bucket_capacity(&mut self, current_bucket_capacity: Option) -> &mut Self { + self.current_bucket_capacity = current_bucket_capacity; + self + } + ///The current capacity of the token bucket. The minimum this can be is 1.0 + fn current_bucket_capacity(mut self, current_bucket_capacity: f64) -> Self { + self.current_bucket_capacity = Some(current_bucket_capacity); + self + } + ///The last time the token bucket was refilled. + fn set_time_of_last_refill(&mut self, time_of_last_refill: Option) -> &mut Self { + self.time_of_last_refill = time_of_last_refill; + self + } + ///The last time the token bucket was refilled. + fn time_of_last_refill(mut self, time_of_last_refill: f64) -> Self { + self.time_of_last_refill = Some(time_of_last_refill); + self + } + ///The smoothed rate which tokens are being retrieved. + fn set_tokens_retrieved_per_second( + &mut self, + tokens_retrieved_per_second: Option, + ) -> &mut Self { + self.tokens_retrieved_per_second = tokens_retrieved_per_second; + self + } + ///The smoothed rate which tokens are being retrieved. + fn tokens_retrieved_per_second(mut self, tokens_retrieved_per_second: f64) -> Self { + self.tokens_retrieved_per_second = Some(tokens_retrieved_per_second); + self + } + ///The last half second time bucket used. + fn set_previous_time_bucket(&mut self, previous_time_bucket: Option) -> &mut Self { + self.previous_time_bucket = previous_time_bucket; + self + } + ///The last half second time bucket used. + fn previous_time_bucket(mut self, previous_time_bucket: f64) -> Self { + self.previous_time_bucket = Some(previous_time_bucket); + self + } + ///The number of requests seen within the current time bucket. + fn set_request_count(&mut self, request_count: Option) -> &mut Self { + self.request_count = request_count; + self + } + ///The number of requests seen within the current time bucket. + fn request_count(mut self, request_count: u64) -> Self { + self.request_count = Some(request_count); + self + } + ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled. + fn set_enable_throttling(&mut self, enable_throttling: Option) -> &mut Self { + self.enable_throttling = enable_throttling; + self + } + ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled. + fn enable_throttling(mut self, enable_throttling: bool) -> Self { + self.enable_throttling = Some(enable_throttling); + self + } + ///The maximum rate when the client was last throttled. + fn set_tokens_retrieved_per_second_at_time_of_last_throttle( + &mut self, + tokens_retrieved_per_second_at_time_of_last_throttle: Option, + ) -> &mut Self { + self.tokens_retrieved_per_second_at_time_of_last_throttle = + tokens_retrieved_per_second_at_time_of_last_throttle; + self + } + ///The maximum rate when the client was last throttled. + fn tokens_retrieved_per_second_at_time_of_last_throttle( + mut self, + tokens_retrieved_per_second_at_time_of_last_throttle: f64, + ) -> Self { + self.tokens_retrieved_per_second_at_time_of_last_throttle = + Some(tokens_retrieved_per_second_at_time_of_last_throttle); + self + } + ///The last time when the client was throttled. + fn set_time_of_last_throttle(&mut self, time_of_last_throttle: Option) -> &mut Self { + self.time_of_last_throttle = time_of_last_throttle; + self + } + ///The last time when the client was throttled. + fn time_of_last_throttle(mut self, time_of_last_throttle: f64) -> Self { + self.time_of_last_throttle = Some(time_of_last_throttle); + self + } + fn build(self) -> ClientRateLimiter { ClientRateLimiter { inner: Arc::new(Mutex::new(Inner { diff --git a/rust-runtime/aws-smithy-types/src/error/metadata.rs b/rust-runtime/aws-smithy-types/src/error/metadata.rs index 4855b6c3ee8..70c06c7e75b 100644 --- a/rust-runtime/aws-smithy-types/src/error/metadata.rs +++ b/rust-runtime/aws-smithy-types/src/error/metadata.rs @@ -27,7 +27,6 @@ pub trait ProvideErrorMetadata { } /// Empty error metadata -#[doc(hidden)] pub const EMPTY_ERROR_METADATA: ErrorMetadata = ErrorMetadata { code: None, message: None, From 404f402e59456c222d9c51b6d978ee04e1499778 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 17 Nov 2023 18:00:56 -0500 Subject: [PATCH 288/331] Feature-gate http versions in aws-smithy-runtime-api (#3236) ## Motivation and Context Without this, we will have http = 0.2 permanently in-tree. ## Description - Add feature gate for http 02x. - ~Add http 1x as an experiment.~ ## Testing CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 6 +++ aws/sdk/integration-tests/ec2/Cargo.toml | 2 +- .../codegen/core/rustlang/CargoDependency.kt | 2 +- .../aws-smithy-http-server/Cargo.toml | 2 +- rust-runtime/aws-smithy-http/Cargo.toml | 2 +- .../aws-smithy-runtime-api/Cargo.toml | 1 + .../aws-smithy-runtime-api/additional-ci | 5 ++ .../external-types-no-http.toml | 6 +++ .../src/client/interceptors/context.rs | 2 +- .../src/client/runtime_plugin.rs | 2 +- .../src/http/headers.rs | 2 + .../src/http/request.rs | 49 +++++++++++++------ .../src/http/response.rs | 14 ++++-- 13 files changed, 68 insertions(+), 27 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 864e324bdfc..3e0bec7c414 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -116,3 +116,9 @@ message = "Types/functions that were previously `#[doc(hidden)]` in `aws-config` references = ["smithy-rs#3226"] meta = { "breaking" = false, "tada" = false, "bug" = false } author = "ysaito1001" + +[[smithy-rs]] +message = "Conversions for HTTP request in aws-smithy-runtime-api are now feature gated behind the `http-02x` feature" +references = ["smithy-rs#3236"] +meta = { "breaking" = true, "tada" = false, "bug" = false } +author = "rcoh" diff --git a/aws/sdk/integration-tests/ec2/Cargo.toml b/aws/sdk/integration-tests/ec2/Cargo.toml index 7db6addb074..b019cd50147 100644 --- a/aws/sdk/integration-tests/ec2/Cargo.toml +++ b/aws/sdk/integration-tests/ec2/Cargo.toml @@ -10,7 +10,7 @@ publish = false aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } -aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client", "http-02x"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2", features = ["behavior-version-latest"] } tokio = { version = "1.23.1", features = ["full"]} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 1a858be1984..76f368fa8fc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -305,7 +305,7 @@ data class CargoDependency( .withFeature("client") fun smithyRuntimeTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntime(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime-api") - fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).withFeature("client") + fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).withFeature("client").withFeature("http-02x") fun smithyRuntimeApiTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-types") diff --git a/rust-runtime/aws-smithy-http-server/Cargo.toml b/rust-runtime/aws-smithy-http-server/Cargo.toml index b686cb615aa..fbfcd899989 100644 --- a/rust-runtime/aws-smithy-http-server/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server/Cargo.toml @@ -21,7 +21,7 @@ request-id = ["dep:uuid"] async-trait = "0.1" aws-smithy-http = { path = "../aws-smithy-http", features = ["rt-tokio"] } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["http-02x"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x", "hyper-0-14-x"] } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1.1" diff --git a/rust-runtime/aws-smithy-http/Cargo.toml b/rust-runtime/aws-smithy-http/Cargo.toml index a5bc6f4d647..2517342b794 100644 --- a/rust-runtime/aws-smithy-http/Cargo.toml +++ b/rust-runtime/aws-smithy-http/Cargo.toml @@ -16,7 +16,7 @@ rt-tokio = ["aws-smithy-types/rt-tokio"] [dependencies] aws-smithy-eventstream = { path = "../aws-smithy-eventstream", optional = true } -aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client"] } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client", "http-02x"] } aws-smithy-types = { path = "../aws-smithy-types", features = ["byte-stream-poll-next", "http-body-0-4-x"] } bytes = "1" bytes-utils = "0.1" diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 3f6a96b5180..3e7415448b6 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -14,6 +14,7 @@ default = [] client = [] http-auth = ["dep:zeroize"] test-util = ["aws-smithy-types/test-util"] +http-02x = [] [dependencies] aws-smithy-async = { path = "../aws-smithy-async" } diff --git a/rust-runtime/aws-smithy-runtime-api/additional-ci b/rust-runtime/aws-smithy-runtime-api/additional-ci index b44c6c05be7..c27a031c393 100755 --- a/rust-runtime/aws-smithy-runtime-api/additional-ci +++ b/rust-runtime/aws-smithy-runtime-api/additional-ci @@ -8,5 +8,10 @@ set -e +# NOTE: (rcoh) This seems to be pulling in workspace settings that pull in this dependency, but it passes if +# no other crates enable this dependency +# echo "### Checking external types w/ HTTP feature disabled" +# RUSTDOCFLAGS="" cargo +"${RUST_NIGHTLY_VERSION}" check-external-types --config external-types-no-http.toml --no-default-features + echo "### Testing every combination of features (excluding --all-features)" cargo hack test --feature-powerset --exclude-all-features diff --git a/rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml b/rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml new file mode 100644 index 00000000000..a58f0caeda0 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml @@ -0,0 +1,6 @@ +allowed_external_types = [ + "aws_smithy_async::*", + "aws_smithy_types::*", + + "bytes::bytes::Bytes", +] diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index c7054c11c73..5d406bf846c 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -467,7 +467,7 @@ impl fmt::Display for RewindResult { } } -#[cfg(all(test, feature = "test-util"))] +#[cfg(all(test, feature = "test-util", feature = "http-02x"))] mod tests { use super::*; use aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index 757224051df..53812097f7a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -297,7 +297,7 @@ impl RuntimePlugins { } } -#[cfg(all(test, feature = "test-util"))] +#[cfg(all(test, feature = "test-util", feature = "http-02x"))] mod tests { use super::{RuntimePlugin, RuntimePlugins}; use crate::client::http::{ diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs index 70361a1d860..0a2dfd617ef 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs @@ -156,6 +156,7 @@ impl Headers { } } +#[cfg(feature = "http-02x")] impl TryFrom for Headers { type Error = HttpError; @@ -281,6 +282,7 @@ mod header_value { Ok(Self { _private: value }) } + #[allow(dead_code)] pub(crate) fn into_http02x(self) -> http0::HeaderValue { self._private } diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs index e36f0bf28a5..ee87e57f1d7 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/request.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs @@ -10,7 +10,7 @@ use crate::http::HttpError; use aws_smithy_types::body::SdkBody; use http as http0; use http0::uri::PathAndQuery; -use http0::{Extensions, HeaderMap, Method}; +use http0::{Extensions, Method}; use std::borrow::Cow; /// Parts struct useful for structural decomposition that the [`Request`] type can be converted into. @@ -30,7 +30,7 @@ pub struct Request { body: B, uri: Uri, method: Method, - extensions: Extensions, + extensions_02x: Extensions, headers: Headers, } @@ -77,6 +77,13 @@ impl Uri { pub fn query(&self) -> Option<&str> { self.parsed.query() } + + fn from_http0x_uri(uri: http0::Uri) -> Self { + Self { + as_string: uri.to_string(), + parsed: uri, + } + } } fn merge_paths(endpoint_path: Option, uri: &http0::Uri) -> Cow<'_, str> { @@ -119,15 +126,14 @@ impl<'a> TryFrom<&'a str> for Uri { } } +#[cfg(feature = "http-02x")] impl From for Uri { fn from(value: http::Uri) -> Self { - Self { - as_string: value.to_string(), - parsed: value, - } + Uri::from_http0x_uri(value) } } +#[cfg(feature = "http-02x")] impl TryInto> for Request { type Error = HttpError; @@ -141,13 +147,15 @@ impl Request { /// /// Depending on the internal storage type, this operation may be free or it may have an internal /// cost. + #[cfg(feature = "http-02x")] pub fn try_into_http02x(self) -> Result, HttpError> { let mut req = http::Request::builder() .uri(self.uri.parsed) .method(self.method) .body(self.body) .expect("known valid"); - let mut headers = HeaderMap::new(); + let mut headers = http0::HeaderMap::new(); + headers.reserve(self.headers.headers.len()); headers.extend( self.headers .headers @@ -155,7 +163,7 @@ impl Request { .map(|(k, v)| (k, v.into_http02x())), ); *req.headers_mut() = headers; - *req.extensions_mut() = self.extensions; + *req.extensions_mut() = self.extensions_02x; Ok(req) } @@ -165,7 +173,7 @@ impl Request { body: f(self.body), uri: self.uri, method: self.method, - extensions: self.extensions, + extensions_02x: self.extensions_02x, headers: self.headers, } } @@ -174,9 +182,9 @@ impl Request { pub fn new(body: B) -> Self { Self { body, - uri: Uri::from(http0::Uri::from_static("/")), + uri: Uri::from_http0x_uri(http0::Uri::from_static("/")), method: Method::GET, - extensions: Default::default(), + extensions_02x: Default::default(), headers: Default::default(), } } @@ -242,13 +250,15 @@ impl Request { /// Adds an extension to the request extensions pub fn add_extension(&mut self, extension: T) { - self.extensions.insert(extension); + self.extensions_02x.insert(extension); } } impl Request { /// Attempts to clone this request /// + /// On clone, any extensions will be cleared. + /// /// If the body is cloneable, this will clone the request. Otherwise `None` will be returned pub fn try_clone(&self) -> Option { let body = self.body().try_clone()?; @@ -256,7 +266,7 @@ impl Request { body, uri: self.uri.clone(), method: self.method.clone(), - extensions: Extensions::new(), + extensions_02x: Extensions::new(), headers: self.headers.clone(), }) } @@ -279,23 +289,30 @@ impl Request { } } +#[cfg(feature = "http-02x")] impl TryFrom> for Request { type Error = HttpError; fn try_from(value: http::Request) -> Result { let (parts, body) = value.into_parts(); let headers = Headers::try_from(parts.headers)?; + // we need to do this eventually. + /*if !parts.extensions.is_empty() { + return Err(HttpError::new( + "Cannot convert non-empty extensions. Clear extensions before converting", + )); + }*/ Ok(Self { body, uri: parts.uri.into(), - method: parts.method.clone(), - extensions: parts.extensions, + method: parts.method, + extensions_02x: http::Extensions::new(), headers, }) } } -#[cfg(test)] +#[cfg(all(test, feature = "http-02x"))] mod test { use super::*; use aws_smithy_types::body::SdkBody; diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/response.rs b/rust-runtime/aws-smithy-runtime-api/src/http/response.rs index a32b3ee415f..84ad832758b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/http/response.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/http/response.rs @@ -5,10 +5,9 @@ //! Http Response Types -use crate::http::{HeaderValue, Headers, HttpError}; +use crate::http::{Headers, HttpError}; use aws_smithy_types::body::SdkBody; use http as http0; -use http0::{Extensions, HeaderMap}; use std::fmt; /// HTTP response status code @@ -49,6 +48,7 @@ impl TryFrom for StatusCode { } } +#[cfg(feature = "http-02x")] impl From for StatusCode { fn from(value: http0::StatusCode) -> Self { Self(value.as_u16()) @@ -73,7 +73,7 @@ pub struct Response { status: StatusCode, headers: Headers, body: B, - extensions: Extensions, + extensions: http0::Extensions, } impl Response { @@ -81,6 +81,7 @@ impl Response { /// /// Depending on the internal storage type, this operation may be free or it may have an internal /// cost. + #[cfg(feature = "http-02x")] pub fn try_into_http02x(self) -> Result, HttpError> { let mut res = http::Response::builder() .status( @@ -89,7 +90,7 @@ impl Response { ) .body(self.body) .expect("known valid"); - let mut headers = HeaderMap::new(); + let mut headers = http0::HeaderMap::new(); headers.extend( self.headers .headers @@ -169,10 +170,13 @@ impl Response { } } +#[cfg(feature = "http-02x")] impl TryFrom> for Response { type Error = HttpError; fn try_from(value: http0::Response) -> Result { + use crate::http::headers::HeaderValue; + use http0::HeaderMap; if let Some(e) = value .headers() .values() @@ -201,7 +205,7 @@ impl TryFrom> for Response { } } -#[cfg(test)] +#[cfg(all(test, feature = "http-02x"))] mod test { use super::*; use aws_smithy_types::body::SdkBody; From f66f9246bccc376462ef47aec5707569fca214f5 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Fri, 17 Nov 2023 23:54:55 +0000 Subject: [PATCH 289/331] Upgrade the smithy-rs runtime crates version to 1.0.0 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0be6e40b934..eb87e1a8f48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,10 +15,10 @@ org.gradle.jvmargs=-Xmx1024M # # TODO(GA): This is currently a placeholder for crates we are going to stabilize at the time of GA. # Until then, a value of this key can contain 0 for the major version. -smithy.rs.runtime.crate.stable.version=0.101.0 +smithy.rs.runtime.crate.stable.version=1.0.0 # Version number to use for the generated unstable runtime crates -smithy.rs.runtime.crate.unstable.version=0.59.0 +smithy.rs.runtime.crate.unstable.version=0.60.0 kotlin.code.style=official From 9a66e88ca559b7818fcb39435271b246ae441a81 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Fri, 17 Nov 2023 23:56:42 +0000 Subject: [PATCH 290/331] Update changelog --- CHANGELOG.md | 30 +++++ CHANGELOG.next.toml | 114 +--------------- aws/SDK_CHANGELOG.next.json | 251 ++++++++++++++++++++---------------- 3 files changed, 169 insertions(+), 226 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84914d97302..94d6147517a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,34 @@ +November 17th, 2023 +=================== +**Breaking Changes:** +- :warning::tada: (client, [smithy-rs#3202](https://github.com/smithy-lang/smithy-rs/issues/3202)) Add configurable stalled-stream protection for downloads. + + When making HTTP calls, + it's possible for a connection to 'stall out' and emit no more data due to server-side issues. + In the event this happens, it's desirable for the stream to error out as quickly as possible. + While timeouts can protect you from this issue, they aren't adaptive to the amount of data + being sent and so must be configured specifically for each use case. When enabled, stalled-stream + protection will ensure that bad streams error out quickly, regardless of the amount of data being + downloaded. + + Protection is enabled by default for all clients but can be configured or disabled. + See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details. +- :warning: (client, [smithy-rs#3222](https://github.com/smithy-lang/smithy-rs/issues/3222)) Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations + were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See + the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details. +- :warning: (all, [smithy-rs#3236](https://github.com/smithy-lang/smithy-rs/issues/3236)) Conversions for HTTP request in aws-smithy-runtime-api are now feature gated behind the `http-02x` feature + +**New this release:** +- :tada: (all, [smithy-rs#3183](https://github.com/smithy-lang/smithy-rs/issues/3183), @HakanVardarr) Add `Display` impl for `DateTime`. +- :bug: (client, [smithy-rs#3229](https://github.com/smithy-lang/smithy-rs/issues/3229), [aws-sdk-rust#960](https://github.com/awslabs/aws-sdk-rust/issues/960)) Prevent multiplication overflow in backoff computation +- (client, [smithy-rs#3226](https://github.com/smithy-lang/smithy-rs/issues/3226)) Types/functions that were previously `#[doc(hidden)]` in `aws-smithy-async`, `aws-smithy-runtime-api`, `aws-smithy-runtime`, `aws-smithy-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such. + +**Contributors** +Thank you for your contributions! ❤ +- @HakanVardarr ([smithy-rs#3183](https://github.com/smithy-lang/smithy-rs/issues/3183)) + + November 16th, 2023 =================== **Breaking Changes:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 3e0bec7c414..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,116 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = """ -Add configurable stalled-stream protection for downloads. - -When making HTTP calls, -it's possible for a connection to 'stall out' and emit no more data due to server-side issues. -In the event this happens, it's desirable for the stream to error out as quickly as possible. -While timeouts can protect you from this issue, they aren't adaptive to the amount of data -being sent and so must be configured specifically for each use case. When enabled, stalled-stream -protection will ensure that bad streams error out quickly, regardless of the amount of data being -downloaded. - -Protection is enabled by default for all clients but can be configured or disabled. -See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details. -""" -references = ["smithy-rs#3202"] -meta = { "breaking" = true, "tada" = true, "bug" = false } -author = "Velfi" - -[[smithy-rs]] -message = """ -Add configurable stalled-stream protection for downloads. - -When making HTTP calls, -it's possible for a connection to 'stall out' and emit no more data due to server-side issues. -In the event this happens, it's desirable for the stream to error out as quickly as possible. -While timeouts can protect you from this issue, they aren't adaptive to the amount of data -being sent and so must be configured specifically for each use case. When enabled, stalled-stream -protection will ensure that bad streams error out quickly, regardless of the amount of data being -downloaded. - -Protection is enabled by default for all clients but can be configured or disabled. -See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details. -""" -references = ["smithy-rs#3202"] -meta = { "breaking" = true, "tada" = true, "bug" = false, "target" = "client" } -author = "Velfi" - -[[aws-sdk-rust]] -message = "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests." -references = ["smithy-rs#3217"] -meta = { "breaking" = true, "tada" = false, "bug" = true } -author = "milesziemer" - -[[smithy-rs]] -message = "Prevent multiplication overflow in backoff computation" -references = ["smithy-rs#3229", "aws-sdk-rust#960"] -meta = { "breaking" = false, "tada" = false, "bug" = true, target = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Prevent multiplication overflow in backoff computation" -references = ["smithy-rs#3229", "aws-sdk-rust#960"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests." -references = ["smithy-rs#3228"] -meta = { "breaking" = true, "tada" = false, "bug" = true } -author = "milesziemer" - -[[smithy-rs]] -message = """ -Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations -were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See -the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details. -""" -references = ["smithy-rs#3222"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = """ -Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations -were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See -the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details. -""" -references = ["smithy-rs#3222"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "Add `Display` impl for `DateTime`." -references = ["smithy-rs#3183"] -meta = { "breaking" = false, "tada" = true, "bug" = false } -author = "HakanVardarr" - -[[smithy-rs]] -message = "Add `Display` impl for `DateTime`." -references = ["smithy-rs#3183"] -meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "all" } -author = "HakanVardarr" - -[[smithy-rs]] -message = "Types/functions that were previously `#[doc(hidden)]` in `aws-smithy-async`, `aws-smithy-runtime-api`, `aws-smithy-runtime`, `aws-smithy-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such." -references = ["smithy-rs#3226"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such." -references = ["smithy-rs#3226"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "Conversions for HTTP request in aws-smithy-runtime-api are now feature gated behind the `http-02x` feature" -references = ["smithy-rs#3236"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 32bac5a9237..de68481d5a2 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,80 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "`RuntimeComponents` are now re-exported so that implementing a custom interceptor doens't require directly depending on `aws-smithy-runtime-api`.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2904", - "aws-sdk-rust#862" - ], - "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 5 - }, - { - "message": "Fix requests to S3 with `no_credentials` set.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2907", - "aws-sdk-rust#864" - ], - "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 5 - }, - { - "message": "Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError`, which caused projects to fail to compile when upgrading.", - "meta": { - "bug": true, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2931", - "aws-sdk-rust#875" - ], - "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 5 - }, - { - "message": "Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2934", - "aws-sdk-rust#872" - ], - "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 5 - }, - { - "message": "Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2935" - ], - "since-commit": "3d7587def9a26afc8e7b306f92c755a980ac9504", - "age": 5 - }, { "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", "meta": { @@ -91,7 +17,7 @@ "smithy-rs#2917" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", @@ -107,7 +33,7 @@ "aws-sdk-rust#699" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details.", @@ -121,7 +47,7 @@ "smithy-rs#3011" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", @@ -135,7 +61,7 @@ "smithy-rs#2921" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", @@ -149,7 +75,7 @@ "smithy-rs#2911" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929).", @@ -164,7 +90,7 @@ "aws-sdk-rust#536" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", @@ -178,7 +104,7 @@ "smithy-rs#2913" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Update MSRV to Rust 1.70.0", @@ -192,7 +118,7 @@ "smithy-rs#2948" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", @@ -207,7 +133,7 @@ "aws-sdk-rust#873" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Allow `no_credentials` to be used with all S3 operations.", @@ -222,7 +148,7 @@ "aws-sdk-rust#878" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", @@ -237,7 +163,7 @@ "smithy-rs#2951" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", @@ -253,7 +179,7 @@ "smithy-rs#2964" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Remove `once_cell` from public API.", @@ -267,7 +193,7 @@ "smithy-rs#2973" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Fix regression with redacting sensitive HTTP response bodies.", @@ -282,7 +208,7 @@ "smithy-rs#2972" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", @@ -296,7 +222,7 @@ "smithy-rs#2995" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", @@ -310,7 +236,7 @@ "smithy-rs#2978" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", @@ -324,7 +250,7 @@ "smithy-rs#1797" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", @@ -338,7 +264,7 @@ "smithy-rs#2983" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The IMDS Client builder's `build()` method is no longer async.", @@ -352,7 +278,7 @@ "smithy-rs#2997" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", @@ -366,7 +292,7 @@ "smithy-rs#3014" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", @@ -381,7 +307,7 @@ "smithy-rs#3007" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050).\n", @@ -396,7 +322,7 @@ "smithy-rs#3018" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", @@ -410,7 +336,7 @@ "smithy-rs#3055" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", @@ -424,7 +350,7 @@ "smithy-rs#3061" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", @@ -438,7 +364,7 @@ "smithy-rs#3065" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", @@ -452,7 +378,7 @@ "smithy-rs#3059" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", @@ -466,7 +392,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", @@ -480,7 +406,7 @@ "smithy-rs#3052" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", @@ -494,7 +420,7 @@ "smithy-rs#3077" ], "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 4 + "age": 5 }, { "message": "Change `ByteStream::into_async_read` to return `AsyncBufRead`", @@ -508,7 +434,7 @@ "smithy-rs#3164" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added.", @@ -523,7 +449,7 @@ "smithy-rs#3148" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n", @@ -538,7 +464,7 @@ "smithy-rs#3114" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "The `RequestId` trait has moved from the aws-http crate into aws-types.", @@ -552,7 +478,7 @@ "smithy-rs#3160" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n```rust\nasync fn example() {\n // with aws-config\n let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09());\n\n // when creating a client\n let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build());\n}\n```", @@ -566,7 +492,7 @@ "smithy-rs#3151" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "Add `ProvideErrorMetadata` impl for service `Error` type.", @@ -581,7 +507,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "Remove deprecated error kind type aliases.", @@ -595,7 +521,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\nmight have:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nIt should now look as follows:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nThe `Unhandled` variant should never be referenced directly.\n", @@ -609,7 +535,7 @@ "smithy-rs#3191" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 2 + "age": 3 }, { "message": "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead.", @@ -623,7 +549,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 1 + "age": 2 }, { "message": "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type", @@ -637,7 +563,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 1 + "age": 2 }, { "message": "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues.", @@ -651,6 +577,105 @@ "smithy-rs#3213" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", + "age": 2 + }, + { + "message": "Add configurable stalled-stream protection for downloads.\n\nWhen making HTTP calls,\nit's possible for a connection to 'stall out' and emit no more data due to server-side issues.\nIn the event this happens, it's desirable for the stream to error out as quickly as possible.\nWhile timeouts can protect you from this issue, they aren't adaptive to the amount of data\nbeing sent and so must be configured specifically for each use case. When enabled, stalled-stream\nprotection will ensure that bad streams error out quickly, regardless of the amount of data being\ndownloaded.\n\nProtection is enabled by default for all clients but can be configured or disabled.\nSee [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n", + "meta": { + "bug": false, + "breaking": true, + "tada": true + }, + "author": "Velfi", + "references": [ + "smithy-rs#3202" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 1 + }, + { + "message": "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests.", + "meta": { + "bug": true, + "breaking": true, + "tada": false + }, + "author": "milesziemer", + "references": [ + "smithy-rs#3217" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 1 + }, + { + "message": "Prevent multiplication overflow in backoff computation", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3229", + "aws-sdk-rust#960" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 1 + }, + { + "message": "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests.", + "meta": { + "bug": true, + "breaking": true, + "tada": false + }, + "author": "milesziemer", + "references": [ + "smithy-rs#3228" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 1 + }, + { + "message": "Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\nwere ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\nthe [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#3222" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 1 + }, + { + "message": "Add `Display` impl for `DateTime`.", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "HakanVardarr", + "references": [ + "smithy-rs#3183" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 1 + }, + { + "message": "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#3226" + ], + "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", "age": 1 } ], From 05dea1ad303b727a1e17d285fb3da911cb82c6a0 Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Mon, 20 Nov 2023 08:48:46 +0000 Subject: [PATCH 291/331] Symbol provider to inject custom symbols (#3209) ## Description Add a SymbolProvider that uses a custom trait to return the symbol. ## Testing Unit tests. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../smithy/CustomShapeSymbolProvider.kt | 26 ++++++++ .../server/smithy/RustServerCodegenPlugin.kt | 2 + .../smithy/CustomShapeSymbolProviderTest.kt | 63 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt create mode 100644 codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt new file mode 100644 index 00000000000..74fc48ce5e0 --- /dev/null +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt @@ -0,0 +1,26 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy + +import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.traits.AnnotationTrait +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider +import software.amazon.smithy.rust.codegen.core.util.getTrait + +class SyntheticCustomShapeTrait(val ID: ShapeId, val symbol: Symbol) : AnnotationTrait(ID, Node.objectNode()) + +/** + * This SymbolProvider honors [`SyntheticCustomShapeTrait`] and returns this trait's symbol when available. + */ +class CustomShapeSymbolProvider(private val base: RustSymbolProvider) : WrappingSymbolProvider(base) { + override fun toSymbol(shape: Shape): Symbol { + return shape.getTrait()?.symbol ?: base.toSymbol(shape) + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt index aa310ccc710..2672bbe9f3d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt @@ -93,5 +93,7 @@ class RustServerCodegenPlugin : ServerDecoratableBuildPlugin() { .let { RustReservedWordSymbolProvider(it, ServerReservedWords) } // Allows decorators to inject a custom symbol provider .let { codegenDecorator.symbolProvider(it) } + // Inject custom symbols. + .let { CustomShapeSymbolProvider(it) } } } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt new file mode 100644 index 00000000000..ea5d63ab2c0 --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt @@ -0,0 +1,63 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy + +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.rustlang.RustType +import software.amazon.smithy.rust.codegen.core.smithy.rustType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.util.lookup +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider + +class CustomShapeSymbolProviderTest { + private val baseModel = + """ + namespace test + + service TestService { + version: "1" + operations: [TestOperation] + } + + operation TestOperation { + input: TestInputOutput + output: TestInputOutput + } + + structure TestInputOutput { + myString: String, + } + """.asSmithyModel(smithyVersion = "2.0") + private val serviceShape = baseModel.lookup("test#TestService") + private val rustType = RustType.Opaque("fake-type") + private val symbol = Symbol.builder() + .name("fake-symbol") + .rustType(rustType) + .build() + private val model = ModelTransformer.create() + .mapShapes(baseModel) { + if (it is MemberShape) { + it.toBuilder().addTrait(SyntheticCustomShapeTrait(ShapeId.from("some#id"), symbol)).build() + } else { + it + } + } + private val symbolProvider = serverTestSymbolProvider(baseModel, serviceShape) + .let { CustomShapeSymbolProvider(it) } + + @Test + fun `override with custom symbol`() { + val shape = model.lookup("test#TestInputOutput\$myString") + symbolProvider.toSymbol(shape) shouldBe symbol + } +} From 505c0dbfd2e9142eac9c1611c1d664ab1401b788 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 20 Nov 2023 21:30:19 -0500 Subject: [PATCH 292/331] Use the `rust-launch` from the the docs repo (#3240) ## Motivation and Context ## Description ## Testing ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c56ec564cfd..68205ac234c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,6 +65,7 @@ jobs: with: repository: awsdocs/aws-doc-sdk-examples path: aws-doc-sdk-examples + ref: rust-launch - name: Run ${{ matrix.actions.action }} uses: ./smithy-rs/.github/actions/docker-build with: From 115638bebb30ec82d911b93b06cb4c2b01b6dc2e Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 20 Nov 2023 21:32:08 -0500 Subject: [PATCH 293/331] Fix stalled stream detection (#3238) A number of small issues in StalledStreamDetection came together to make it ineffective in practice: 1. We didn't push a throughput `0` on `Poll::Pending`. This means that if the stream goes to poll pending, the calculate throughput can never get to 0. 2. Because we always considered the _entire_ throughput log, an actually stalled stream creates a pathological case where most of the log is full of fast moving data, but we are very slow to evict it and detect slowness. With a 426 length log, it would effectively take 7 minutes for it to actually get to 0. For these two issues, I introduced a check-window (default 1 second) in the throughput log. We only consider this much data when making the calculation. To avoid undeseriable interactions with the check interval, I reduced the check interval to 500ms. I think this is likely to be better in practice at detecting stalled streams. As a coincidence, this makes all the math exact so the tests are now precise without floating epsilons. Finally, in an unrelated issue, the `check_interval` wasn't actually being used in the call to sleep, I fixed that as well and added a test. In doing this, I tried to also simplify sine wave test into a test that could be logically reasoned about. The previous test was producing nonsense data (integer input to `sine` which is in radians as one example). I replaced it with several tests that send data at one rate, then suddenly stop sending data, simulating a stalled stream. These have the nice property that it's easy to determine mathematically when the stream should stall. Side note: It's possible these bugs are what was making it not work for request bodies? Needs more investigation. I didn't rerun that test. After those issues were resolved, I was a little concerned about performance when maxing out the network connection. A quick benchmark showed there was a small regression. When data is flowing normally, the 426 item buffer is usually shorter than our default check window of 1 second. This allows for an optimization where we track the current total amount of data in the buffer, allowing us to return the calculated throughput in constant time. During writing of the test, I discovered that we didn't actually expose `Throughput` so I took that as an opportunity to change it to use `u64` instead of `f64` for it's byte count representation. ## Testing - [x] Manual test of downloading a file then turning off the wifi. Verify that the connection is aborted within the grace period. ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- rust-runtime/aws-smithy-runtime/Cargo.toml | 3 +- .../client/http/body/minimum_throughput.rs | 7 +- .../minimum_throughput/http_body_0_4_x.rs | 158 +++++++++----- .../http/body/minimum_throughput/options.rs | 22 +- .../body/minimum_throughput/throughput.rs | 197 +++++++++++------- .../tests/stalled_stream_performance.rs | 115 ++++++++++ 6 files changed, 368 insertions(+), 134 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index 5ac41f45bd9..6a3e1e40a1d 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -49,9 +49,10 @@ aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["test aws-smithy-types = { path = "../aws-smithy-types", features = ["test-util"] } futures-util = "0.3.28" pretty_assertions = "1.4.0" -tokio = { version = "1.25", features = ["macros", "rt", "rt-multi-thread", "test-util"] } +tokio = { version = "1.25", features = ["macros", "rt", "rt-multi-thread", "test-util", "full"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } tracing-test = "0.2.1" +hyper_0_14 = { package = "hyper", version = "0.14.27",features = ["client", "server", "tcp", "http1", "http2"] } [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs index 006de72cfd6..c576a34afa3 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs @@ -12,6 +12,7 @@ pub mod http_body_0_4_x; /// Options for a [`MinimumThroughputBody`]. pub mod options; +pub use throughput::Throughput; mod throughput; use aws_smithy_async::rt::sleep::Sleep; @@ -21,7 +22,8 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::shared::IntoShared; use options::MinimumThroughputBodyOptions; use std::fmt; -use throughput::{Throughput, ThroughputLogs}; +use std::time::SystemTime; +use throughput::ThroughputLogs; pin_project_lite::pin_project! { /// A body-wrapping type that ensures data is being streamed faster than some lower limit. @@ -41,7 +43,7 @@ pin_project_lite::pin_project! { } } -const SIZE_OF_ONE_LOG: usize = std::mem::size_of::<(std::time::SystemTime, u64)>(); // 24 bytes per log +const SIZE_OF_ONE_LOG: usize = std::mem::size_of::<(SystemTime, u64)>(); // 24 bytes per log const NUMBER_OF_LOGS_IN_ONE_KB: f64 = 1024.0 / SIZE_OF_ONE_LOG as f64; impl MinimumThroughputBody { @@ -57,7 +59,6 @@ impl MinimumThroughputBody { // Never keep more than 10KB of logs in memory. This currently // equates to 426 logs. (NUMBER_OF_LOGS_IN_ONE_KB * 10.0) as usize, - options.minimum_throughput().per_time_elapsed(), ), async_sleep: async_sleep.into_shared(), time_source: time_source.into_shared(), diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs index b8f2ffd3ecc..075ef39d639 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs @@ -21,49 +21,69 @@ where mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll>> { + // this code is called quite frequently in production—one every millisecond or so when downloading + // a stream. However, SystemTime::now is on the order of nanoseconds let now = self.time_source.now(); // Attempt to read the data from the inner body, then update the // throughput logs. let mut this = self.as_mut().project(); let poll_res = match this.inner.poll_data(cx) { Poll::Ready(Some(Ok(bytes))) => { + tracing::trace!("received data: {}", bytes.len()); this.throughput_logs.push((now, bytes.len() as u64)); Poll::Ready(Some(Ok(bytes))) } - Poll::Pending => Poll::Pending, + Poll::Pending => { + tracing::trace!("received poll pending"); + this.throughput_logs.push((now, 0)); + Poll::Pending + } // If we've read all the data or an error occurred, then return that result. res => return res, }; - // Push a start log if we haven't already done so. - if this.throughput_logs.is_empty() { - this.throughput_logs.push((now, 0)); - } // Check the sleep future to see if it needs refreshing. - let mut sleep_fut = this.sleep_fut.take().unwrap_or_else(|| { - this.async_sleep - .sleep(this.options.minimum_throughput().per_time_elapsed()) - }); + let mut sleep_fut = this + .sleep_fut + .take() + .unwrap_or_else(|| this.async_sleep.sleep(this.options.check_interval())); if let Poll::Ready(()) = pin!(&mut sleep_fut).poll(cx) { + tracing::trace!("sleep future triggered—triggering a wakeup"); // Whenever the sleep future expires, we replace it. - sleep_fut = this - .async_sleep - .sleep(this.options.minimum_throughput().per_time_elapsed()); + sleep_fut = this.async_sleep.sleep(this.options.check_interval()); // We also schedule a wake up for current task to ensure that // it gets polled at least one more time. cx.waker().wake_by_ref(); }; this.sleep_fut.replace(sleep_fut); + let calculated_tpt = match this + .throughput_logs + .calculate_throughput(now, this.options.check_window()) + { + Some(tpt) => tpt, + None => { + tracing::trace!("calculated throughput is None!"); + return poll_res; + } + }; + tracing::trace!( + "calculated throughput {:?} (window: {:?})", + calculated_tpt, + this.options.check_window() + ); // Calculate the current throughput and emit an error if it's too low and // the grace period has elapsed. - let actual_throughput = this.throughput_logs.calculate_throughput(now); - let is_below_minimum_throughput = actual_throughput - .map(|t| t < this.options.minimum_throughput()) - .unwrap_or_default(); + let is_below_minimum_throughput = calculated_tpt <= this.options.minimum_throughput(); if is_below_minimum_throughput { // Check the grace period future to see if it needs creating. + tracing::trace!( + in_grace_period = this.grace_period_fut.is_some(), + observed_throughput = ?calculated_tpt, + minimum_throughput = ?this.options.minimum_throughput(), + "below minimum throughput" + ); let mut grace_period_fut = this .grace_period_fut .take() @@ -72,7 +92,7 @@ where // The grace period has ended! return Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum { expected: self.options.minimum_throughput(), - actual: actual_throughput.unwrap(), + actual: calculated_tpt, })))); }; this.grace_period_fut.replace(grace_period_fut); @@ -95,10 +115,11 @@ where } // These tests use `hyper::body::Body::wrap_stream` -#[cfg(all(test, feature = "connector-hyper-0-14-x"))] +#[cfg(all(test, feature = "connector-hyper-0-14-x", feature = "test-util"))] mod test { use super::{super::Throughput, Error, MinimumThroughputBody}; use crate::client::http::body::minimum_throughput::options::MinimumThroughputBodyOptions; + use crate::test_util::capture_test_logs::capture_test_logs; use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep, ManualTimeSource}; use aws_smithy_types::body::SdkBody; @@ -111,8 +132,8 @@ mod test { use pretty_assertions::assert_eq; use std::convert::Infallible; use std::error::Error as StdError; - use std::future::Future; - use std::pin::Pin; + use std::future::{poll_fn, Future}; + use std::pin::{pin, Pin}; use std::task::{Context, Poll}; use std::time::{Duration, UNIX_EPOCH}; @@ -216,7 +237,7 @@ mod test { eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); let expected_err = Error::ThroughputBelowMinimum { expected: minimum_throughput, - actual: Throughput::new(8.889, Duration::from_secs(1)), + actual: Throughput::new(8, Duration::from_secs(1)), }; match res.await { Ok(_) => { @@ -236,7 +257,7 @@ mod test { #[tokio::test] async fn test_throughput_timeout_less_than() { - let minimum_throughput = Throughput::new_bytes_per_second(9.0); + let minimum_throughput = Throughput::new_bytes_per_second(9); expect_error(minimum_throughput).await; } @@ -255,39 +276,42 @@ mod test { #[tokio::test] async fn test_throughput_timeout_equal_to() { - let minimum_throughput = Throughput::new(32.0, Duration::from_secs(4)); + let (_guard, _) = capture_test_logs(); + // a tiny bit less. To capture 0-throughput properly, we need to allow 0 to be 0 + let minimum_throughput = Throughput::new(31, Duration::from_secs(4)); expect_success(minimum_throughput).await; } #[tokio::test] async fn test_throughput_timeout_greater_than() { - let minimum_throughput = Throughput::new(20.0, Duration::from_secs(3)); + let minimum_throughput = Throughput::new(20, Duration::from_secs(3)); expect_success(minimum_throughput).await; } // A multiplier for the sine wave amplitude; Chosen arbitrarily. - const BYTE_COUNT_UPPER_LIMIT: f64 = 100.0; + const BYTE_COUNT_UPPER_LIMIT: u64 = 1000; - fn create_shrinking_sine_wave_stream( + /// emits 1000B/S for 5 seconds then suddenly stops + fn sudden_stop( async_sleep: impl AsyncSleep + Clone, ) -> impl futures_util::Stream> { + let sleep_dur = Duration::from_millis(50); + fastrand::seed(0); futures_util::stream::unfold(1, move |i| { let async_sleep = async_sleep.clone(); async move { - if i > 255 { - None + let number_seconds = (i * sleep_dur).as_secs_f64(); + async_sleep.sleep(sleep_dur).await; + if number_seconds > 5.0 { + Some((Result::::Ok(Bytes::new()), i + 1)) } else { - let byte_count = (i as f64).sin().floor().abs() + 1.0 / (i as f64 + 1.0); - let byte_count = (byte_count * BYTE_COUNT_UPPER_LIMIT) as u64; let mut bytes = BytesMut::new(); - bytes.put_u8(i as u8); - if byte_count > 0 { - for _ in 0..byte_count { - bytes.put_u8(0) - } + let bytes_per_segment = + (BYTE_COUNT_UPPER_LIMIT as f64) * sleep_dur.as_secs_f64(); + for _ in 0..bytes_per_segment as usize { + bytes.put_u8(0) } - async_sleep.sleep(Duration::from_secs(1)).await; Some((Result::::Ok(bytes.into()), i + 1)) } } @@ -295,17 +319,52 @@ mod test { } #[tokio::test] - async fn test_throughput_timeout_shrinking_sine_wave() { + async fn test_stalled_stream_detection() { + test_suddenly_stopping_stream(0, Duration::from_secs(6)).await + } + + #[tokio::test] + async fn test_slow_stream_detection() { + test_suddenly_stopping_stream(BYTE_COUNT_UPPER_LIMIT / 2, Duration::from_secs_f64(5.50)) + .await + } + + #[tokio::test] + async fn test_check_interval() { + let (_guard, _) = capture_test_logs(); + let (ts, sleep) = instant_time_and_sleep(UNIX_EPOCH); + let mut body = MinimumThroughputBody::new( + ts, + sleep.clone(), + NeverBody, + MinimumThroughputBodyOptions::builder() + .check_interval(Duration::from_millis(1234)) + .grace_period(Duration::from_millis(456)) + .build(), + ); + let mut body = pin!(body); + let _ = poll_fn(|cx| body.as_mut().poll_data(cx)).await; + assert_eq!( + sleep.logs(), + vec![ + // sleep, by second sleep we know we have no data, then the grace period + Duration::from_millis(1234), + Duration::from_millis(1234), + Duration::from_millis(456) + ] + ); + } + + async fn test_suddenly_stopping_stream(throughput_limit: u64, time_until_timeout: Duration) { + let (_guard, _) = capture_test_logs(); let options = MinimumThroughputBodyOptions::builder() // Minimum throughput per second will be approx. half of the BYTE_COUNT_UPPER_LIMIT. - .minimum_throughput(Throughput::new_bytes_per_second( - BYTE_COUNT_UPPER_LIMIT / 2.0 + 2.0, - )) + .minimum_throughput(Throughput::new_bytes_per_second(throughput_limit)) .build(); let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); let time_clone = time_source.clone(); - let stream = create_shrinking_sine_wave_stream(async_sleep.clone()); + let stream = sudden_stop(async_sleep.clone()); let body = ByteStream::new(SdkBody::from_body_0_4(hyper_0_14::body::Body::wrap_stream( stream, ))); @@ -326,14 +385,17 @@ mod test { match res.await { Ok(_res) => { - assert_eq!(255.0, time_source.seconds_since_unix_epoch()); - assert_eq!(Duration::from_secs(255), async_sleep.total_duration()); + panic!("stream should have timed out"); + } + Err(err) => { + dbg!(err); + assert_eq!( + async_sleep.total_duration(), + time_until_timeout, + "With throughput limit {:?} expected timeout after {:?} (stream starts sending 0's at 5 seconds.", + throughput_limit, time_until_timeout + ); } - Err(err) => panic!( - "test stopped after {:?} due to {}", - async_sleep.total_duration(), - DisplayErrorContext(err.source().unwrap()) - ), } } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs index 8618707f734..4c8fc1177b3 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs @@ -19,9 +19,18 @@ pub struct MinimumThroughputBodyOptions { /// If this is set to a positive value, whenever throughput is below the minimum throughput, /// a timer is started. If the timer expires before throughput rises above the minimum, /// an error is emitted. + /// + /// It is recommended to set this to a small value (e.g. 200ms) to avoid issues during + /// stream-startup. grace_period: Duration, + /// The interval at which the throughput is checked. check_interval: Duration, + + /// The period of time to consider when computing the throughput + /// + /// This SHOULD be longer than the check interval, or stuck-streams may evade detection. + check_window: Duration, } impl MinimumThroughputBodyOptions { @@ -52,6 +61,10 @@ impl MinimumThroughputBodyOptions { self.minimum_throughput } + pub(crate) fn check_window(&self) -> Duration { + self.check_window + } + /// The rate at which the throughput is checked. /// /// The actual rate throughput is checked may be higher than this value, @@ -67,6 +80,7 @@ impl Default for MinimumThroughputBodyOptions { minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT, grace_period: DEFAULT_GRACE_PERIOD, check_interval: DEFAULT_CHECK_INTERVAL, + check_window: DEFAULT_CHECK_WINDOW, } } } @@ -79,13 +93,15 @@ pub struct MinimumThroughputBodyOptionsBuilder { grace_period: Option, } -const DEFAULT_CHECK_INTERVAL: Duration = Duration::from_secs(1); +const DEFAULT_CHECK_INTERVAL: Duration = Duration::from_millis(500); const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(0); const DEFAULT_MINIMUM_THROUGHPUT: Throughput = Throughput { - bytes_read: 1.0, + bytes_read: 1, per_time_elapsed: Duration::from_secs(1), }; +const DEFAULT_CHECK_WINDOW: Duration = Duration::from_secs(1); + impl MinimumThroughputBodyOptionsBuilder { /// Create a new `MinimumThroughputBodyOptionsBuilder`. pub fn new() -> Self { @@ -146,6 +162,7 @@ impl MinimumThroughputBodyOptionsBuilder { .minimum_throughput .unwrap_or(DEFAULT_MINIMUM_THROUGHPUT), check_interval: self.check_interval.unwrap_or(DEFAULT_CHECK_INTERVAL), + check_window: DEFAULT_CHECK_WINDOW, } } } @@ -156,6 +173,7 @@ impl From for MinimumThroughputBodyOptions { grace_period: value.grace_period(), minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT, check_interval: DEFAULT_CHECK_INTERVAL, + check_window: DEFAULT_CHECK_WINDOW, } } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs index 6186f8c9ccd..c4d9223b212 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs @@ -7,23 +7,16 @@ use std::collections::VecDeque; use std::fmt; use std::time::{Duration, SystemTime}; +/// Throughput representation for use when configuring [`super::MinimumThroughputBody`] #[derive(Debug, Clone, Copy)] pub struct Throughput { - pub(super) bytes_read: f64, + pub(super) bytes_read: u64, pub(super) per_time_elapsed: Duration, } impl Throughput { /// Create a new throughput with the given bytes read and time elapsed. - pub fn new(bytes_read: f64, per_time_elapsed: Duration) -> Self { - debug_assert!( - !bytes_read.is_nan(), - "cannot create a throughput if bytes_read == NaN" - ); - debug_assert!( - bytes_read.is_finite(), - "cannot create a throughput if bytes_read == Inf" - ); + pub fn new(bytes_read: u64, per_time_elapsed: Duration) -> Self { debug_assert!( !per_time_elapsed.is_zero(), "cannot create a throughput if per_time_elapsed == 0" @@ -36,7 +29,7 @@ impl Throughput { } /// Create a new throughput in bytes per second. - pub fn new_bytes_per_second(bytes: f64) -> Self { + pub fn new_bytes_per_second(bytes: u64) -> Self { Self { bytes_read: bytes, per_time_elapsed: Duration::from_secs(1), @@ -44,32 +37,28 @@ impl Throughput { } /// Create a new throughput in kilobytes per second. - pub fn new_kilobytes_per_second(kilobytes: f64) -> Self { + pub fn new_kilobytes_per_second(kilobytes: u64) -> Self { Self { - bytes_read: kilobytes * 1000.0, + bytes_read: kilobytes * 1000, per_time_elapsed: Duration::from_secs(1), } } /// Create a new throughput in megabytes per second. - pub fn new_megabytes_per_second(megabytes: f64) -> Self { + pub fn new_megabytes_per_second(megabytes: u64) -> Self { Self { - bytes_read: megabytes * 1000.0 * 1000.0, + bytes_read: megabytes * 1000 * 1000, per_time_elapsed: Duration::from_secs(1), } } - pub(super) fn per_time_elapsed(&self) -> Duration { - self.per_time_elapsed - } - pub(super) fn bytes_per_second(&self) -> f64 { let per_time_elapsed_secs = self.per_time_elapsed.as_secs_f64(); if per_time_elapsed_secs == 0.0 { return 0.0; // Avoid dividing by zero. }; - self.bytes_read / per_time_elapsed_secs + self.bytes_read as f64 / per_time_elapsed_secs } } @@ -102,7 +91,7 @@ impl fmt::Display for Throughput { impl From<(u64, Duration)> for Throughput { fn from(value: (u64, Duration)) -> Self { Self { - bytes_read: value.0 as f64, + bytes_read: value.0, per_time_elapsed: value.1, } } @@ -111,62 +100,80 @@ impl From<(u64, Duration)> for Throughput { #[derive(Clone)] pub(super) struct ThroughputLogs { max_length: usize, - min_elapsed_time: Duration, inner: VecDeque<(SystemTime, u64)>, + bytes_processed: u64, } impl ThroughputLogs { - pub(super) fn new(max_length: usize, min_elapsed_time: Duration) -> Self { + pub(super) fn new(max_length: usize) -> Self { Self { - inner: VecDeque::new(), - min_elapsed_time, + inner: VecDeque::with_capacity(max_length), max_length, + bytes_processed: 0, } } - pub(super) fn is_empty(&self) -> bool { - self.inner.is_empty() - } - pub(super) fn push(&mut self, throughput: (SystemTime, u64)) { - self.inner.push_back(throughput); - // When the number of logs exceeds the max length, toss the oldest log. - if self.inner.len() > self.max_length { - self.inner.pop_front(); + if self.inner.len() == self.max_length { + self.bytes_processed -= self.inner.pop_front().map(|(_, sz)| sz).unwrap_or_default(); } - } - pub(super) fn front(&self) -> Option<&(SystemTime, u64)> { - self.inner.front() + debug_assert!(self.inner.capacity() > self.inner.len()); + self.bytes_processed += throughput.1; + self.inner.push_back(throughput); } - pub(super) fn calculate_throughput(&self, now: SystemTime) -> Option { - match self.front() { - Some((front_t, _)) => { - // Ensure that enough time has passed between the first and last logs. - // If not, we can't calculate throughput so we return `None`. - // In the case that `now` is earlier than the first log time, we also return `None`. - let time_elapsed = now.duration_since(*front_t).unwrap_or_default(); - if time_elapsed < self.min_elapsed_time { - return None; - } - - // Floating back never contains bytes, so we don't care that - // it's missed in this calculation. - let total_bytes_logged = self - .inner - .iter() - .fold(0, |acc, (_, bytes_read)| acc + bytes_read) - as f64; + fn buffer_full(&self) -> bool { + self.inner.len() == self.max_length + } + pub(super) fn calculate_throughput( + &self, + now: SystemTime, + time_window: Duration, + ) -> Option { + // There are a lot of pathological cases that are 0 throughput. These cases largely shouldn't + // happen, because the check interval MUST be less than the check window + let total_length = self + .inner + .iter() + .last()? + .0 + .duration_since(self.inner.get(0)?.0) + .ok()?; + // during a "healthy" request we'll only have a few milliseconds of logs (shorter than the check window) + if total_length < time_window { + // if we haven't hit our requested time window & the buffer still isn't full, then + // return `None` — this is the "startup grace period" + return if !self.buffer_full() { + None + } else { + // Otherwise, if the entire buffer fits in the timewindow, we can the shortcut to + // avoid recomputing all the data Some(Throughput { - bytes_read: total_bytes_logged, - per_time_elapsed: time_elapsed, + bytes_read: self.bytes_processed, + per_time_elapsed: total_length, }) - } - _ => None, + }; } + let minimum_ts = now - time_window; + let first_item = self.inner.iter().find(|(ts, _)| *ts >= minimum_ts)?.0; + + let time_elapsed = now.duration_since(first_item).unwrap_or_default(); + + let total_bytes_logged = self + .inner + .iter() + .rev() + .take_while(|(ts, _)| *ts > minimum_ts) + .map(|t| t.1) + .sum::(); + + Some(Throughput { + bytes_read: total_bytes_logged, + per_time_elapsed: time_elapsed, + }) } } @@ -177,9 +184,9 @@ mod test { #[test] fn test_throughput_eq() { - let t1 = Throughput::new(1.0, Duration::from_secs(1)); - let t2 = Throughput::new(25.0, Duration::from_secs(25)); - let t3 = Throughput::new(100.0, Duration::from_secs(100)); + let t1 = Throughput::new(1, Duration::from_secs(1)); + let t2 = Throughput::new(25, Duration::from_secs(25)); + let t3 = Throughput::new(100, Duration::from_secs(100)); assert_eq!(t1, t2); assert_eq!(t2, t3); @@ -190,7 +197,7 @@ mod test { tick_duration: Duration, rate: u64, ) -> (ThroughputLogs, SystemTime) { - let mut throughput_logs = ThroughputLogs::new(length as usize, Duration::from_secs(1)); + let mut throughput_logs = ThroughputLogs::new(length as usize); for i in 1..=length { throughput_logs.push((UNIX_EPOCH + (tick_duration * i), rate)); } @@ -199,48 +206,78 @@ mod test { (throughput_logs, UNIX_EPOCH + (tick_duration * length)) } + const EPSILON: f64 = 0.001; + macro_rules! assert_delta { + ($x:expr, $y:expr, $d:expr) => { + if !(($x as f64) - $y < $d || $y - ($x as f64) < $d) { + panic!(); + } + }; + } + #[test] fn test_throughput_log_calculate_throughput_1() { let (throughput_logs, now) = build_throughput_log(1000, Duration::from_secs(1), 1); - let throughput = throughput_logs.calculate_throughput(now).unwrap(); - // Floats being what they are - assert_eq!(1.001001001001001, throughput.bytes_per_second()); + for dur in [10, 100, 100] { + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(dur)) + .unwrap(); + assert_eq!(1.0, throughput.bytes_per_second()); + } + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs_f64(101.5)) + .unwrap(); + assert_delta!(1, throughput.bytes_per_second(), EPSILON); } #[test] fn test_throughput_log_calculate_throughput_2() { let (throughput_logs, now) = build_throughput_log(1000, Duration::from_secs(5), 5); - let throughput = throughput_logs.calculate_throughput(now).unwrap(); - // Floats being what they are - assert_eq!(1.001001001001001, throughput.bytes_per_second()); + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(1000)) + .unwrap(); + assert_eq!(1.0, throughput.bytes_per_second()); } #[test] fn test_throughput_log_calculate_throughput_3() { let (throughput_logs, now) = build_throughput_log(1000, Duration::from_millis(200), 1024); - let throughput = throughput_logs.calculate_throughput(now).unwrap(); + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(5)) + .unwrap(); let expected_throughput = 1024.0 * 5.0; - // Floats being what they are - assert_eq!( - expected_throughput + 5.125125125125, - throughput.bytes_per_second() - ); + assert_eq!(expected_throughput, throughput.bytes_per_second()); } #[test] fn test_throughput_log_calculate_throughput_4() { let (throughput_logs, now) = build_throughput_log(1000, Duration::from_millis(100), 12); - let throughput = throughput_logs.calculate_throughput(now).unwrap(); + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(1)) + .unwrap(); let expected_throughput = 12.0 * 10.0; - // Floats being what they are - assert_eq!( - expected_throughput + 0.12012012012012, - throughput.bytes_per_second() - ); + assert_eq!(expected_throughput, throughput.bytes_per_second()); + } + + #[test] + fn test_throughput_followed_by_0() { + let tick = Duration::from_millis(100); + let (mut throughput_logs, now) = build_throughput_log(1000, tick, 12); + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(1)) + .unwrap(); + let expected_throughput = 12.0 * 10.0; + + assert_eq!(expected_throughput, throughput.bytes_per_second()); + throughput_logs.push((now + tick, 0)); + let throughput = throughput_logs + .calculate_throughput(now + tick, Duration::from_secs(1)) + .unwrap(); + assert_eq!(108.0, throughput.bytes_per_second()); } } diff --git a/rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs b/rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs new file mode 100644 index 00000000000..70211cfe527 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs @@ -0,0 +1,115 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#![cfg(all(feature = "client", feature = "test-util"))] + +use aws_smithy_async::rt::sleep::TokioSleep; +use aws_smithy_async::time::{SystemTimeSource, TimeSource}; +use aws_smithy_runtime::client::http::body::minimum_throughput::MinimumThroughputBody; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::byte_stream::ByteStream; +use bytes::{BufMut, Bytes, BytesMut}; +use hyper_0_14::server::conn::AddrStream; +use hyper_0_14::service::{make_service_fn, service_fn, Service}; +use hyper_0_14::{Body, Server}; +use std::convert::Infallible; +use std::net::TcpListener; +use std::time::Duration; + +fn make_block(sz: usize) -> Bytes { + let mut b = BytesMut::with_capacity(sz); + b.put_bytes(1, sz); + b.freeze() +} + +// TODO(postGA): convert this to an actual benchmark +// This test evaluates streaming 1GB of data over the loopback with and without the body wrapper +// enabled. After optimizations, the body wrapper seems to make minimal differences +// NOTE: make sure you run this test in release mode to get a sensible result +#[tokio::test] +#[ignore] +async fn stalled_stream_performance() { + // 1GB + let data_size = 1_000_000_000; + // observed block size during actual HTTP requests + let block_size = 16384; + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let make_service = make_service_fn(move |_connection: &AddrStream| async move { + Ok::<_, Infallible>(service_fn( + move |_: http::Request| async move { + let (mut sender, body) = hyper_0_14::Body::channel(); + tokio::task::spawn(async move { + for _i in 0..(data_size / block_size) { + sender + .send_data(make_block(block_size)) + .await + .expect("failed to write data"); + } + }); + Ok::<_, Infallible>(http::Response::new(body)) + }, + )) + }); + let addr = format!("http://localhost:{}", listener.local_addr().unwrap().port()); + let server = Server::from_tcp(listener).unwrap().serve(make_service); + tokio::spawn(server); + + let mut no_wrapping = vec![]; + let mut wrapping = vec![]; + let runs = 10; + for _i in 0..runs { + no_wrapping.push(make_request(&addr, false).await); + wrapping.push(make_request(&addr, true).await); + } + println!( + "Average w/ wrapping: {}", + wrapping.iter().map(|it| it.as_millis() as f64).sum::() / runs as f64 + ); + println!( + "Average w/o wrapping: {}", + no_wrapping + .iter() + .map(|it: &Duration| it.as_millis() as f64) + .sum::() + / runs as f64 + ) +} + +async fn make_request(address: &str, wrap_body: bool) -> Duration { + let mut client = hyper_0_14::Client::new(); + let req = ::http::Request::builder() + .uri(address) + .body(Body::empty()) + .unwrap(); + let resp = client.call(req).await; + let body = resp.unwrap().into_body(); + let mut body = SdkBody::from_body_0_4(body); + if wrap_body { + body = body.map_preserve_contents(|body| { + let time_source = SystemTimeSource::new(); + let sleep = TokioSleep::new(); + let opts = StalledStreamProtectionConfig::enabled().build(); + let mtb = MinimumThroughputBody::new(time_source, sleep, body, opts.into()); + SdkBody::from_body_0_4(mtb) + }); + } + + let sdk_body = ByteStream::new(body); + let ts = SystemTimeSource::new(); + let start = ts.now(); + // this a slow way to count total bytes, but we need to actually read the bytes into segments + // otherwise some of our code seems to be optimized away + let total_bytes = sdk_body + .collect() + .await + .unwrap() + .into_segments() + .map(|seg| seg.len()) + .sum::(); + println!("total: {:?}", total_bytes); + let end = ts.now(); + end.duration_since(start).unwrap() +} From 2e0102672c93dfac94c9849471a43ad85b5c3644 Mon Sep 17 00:00:00 2001 From: Miles Ziemer <45497130+milesziemer@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:42:36 -0500 Subject: [PATCH 294/331] Remove some defaults for s3 control (#3246) ## Motivation and Context S3 Control's PublicAccessBlockConfiguration is incorrectly modeled, and all the members should be nullable. These members are not meant to have a default, as you are meant to be able to configure one member at a time - if you're just trying to turn BlockPublicAcls on, you don't want to accidentally turn off IgnorePublicAcls. This change makes these members nullable and is a break-fix. ## Description Adds the members of PublicAccessBlockConfiguration to the RemoveDefaults customization. Also refactors the map of shapes to remove defaults from to avoid having to call .shapeId everywhere. ## Testing - [x] Generated the client and looked at it ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 ++- .../customize/RemoveDefaultsDecorator.kt | 58 ++++++++++--------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..944384e4718 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,10 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests." +references = ["smithy-rs#3246"] +meta = { "breaking" = true, "tada" = false, "bug" = true } +author = "milesziemer" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt index aa7f67a89d5..a613f812b3b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk.customize import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.util.shapeId @@ -24,38 +25,43 @@ class RemoveDefaultsDecorator : ClientCodegenDecorator { // Service shape id -> Shape id of each root shape to remove the default from. // TODO(https://github.com/smithy-lang/smithy-rs/issues/3220): Remove this customization after model updates. - private val removeDefaults = mapOf( - "com.amazonaws.amplifyuibuilder#AmplifyUIBuilder".shapeId() to setOf( - "com.amazonaws.amplifyuibuilder#ListComponentsLimit".shapeId(), - "com.amazonaws.amplifyuibuilder#ListFormsLimit".shapeId(), - "com.amazonaws.amplifyuibuilder#ListThemesLimit".shapeId(), + private val removeDefaults: Map> = mapOf( + "com.amazonaws.amplifyuibuilder#AmplifyUIBuilder" to setOf( + "com.amazonaws.amplifyuibuilder#ListComponentsLimit", + "com.amazonaws.amplifyuibuilder#ListFormsLimit", + "com.amazonaws.amplifyuibuilder#ListThemesLimit", ), - "com.amazonaws.drs#ElasticDisasterRecoveryService".shapeId() to setOf( - "com.amazonaws.drs#Validity".shapeId(), - "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceThreshold".shapeId(), - "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceDeltaThreshold".shapeId(), - "com.amazonaws.drs#ListStagingAccountsRequest\$maxResults".shapeId(), - "com.amazonaws.drs#StrictlyPositiveInteger".shapeId(), - "com.amazonaws.drs#MaxResultsType".shapeId(), - "com.amazonaws.drs#MaxResultsReplicatingSourceServers".shapeId(), - "com.amazonaws.drs#LaunchActionOrder".shapeId(), + "com.amazonaws.drs#ElasticDisasterRecoveryService" to setOf( + "com.amazonaws.drs#Validity", + "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceThreshold", + "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceDeltaThreshold", + "com.amazonaws.drs#ListStagingAccountsRequest\$maxResults", + "com.amazonaws.drs#StrictlyPositiveInteger", + "com.amazonaws.drs#MaxResultsType", + "com.amazonaws.drs#MaxResultsReplicatingSourceServers", + "com.amazonaws.drs#LaunchActionOrder", ), - "com.amazonaws.evidently#Evidently".shapeId() to setOf( - "com.amazonaws.evidently#ResultsPeriod".shapeId(), + "com.amazonaws.evidently#Evidently" to setOf( + "com.amazonaws.evidently#ResultsPeriod", ), - "com.amazonaws.location#LocationService".shapeId() to setOf( - "com.amazonaws.location#ListPlaceIndexesRequest\$MaxResults".shapeId(), - "com.amazonaws.location#SearchPlaceIndexForSuggestionsRequest\$MaxResults".shapeId(), - "com.amazonaws.location#PlaceIndexSearchResultLimit".shapeId(), + "com.amazonaws.location#LocationService" to setOf( + "com.amazonaws.location#ListPlaceIndexesRequest\$MaxResults", + "com.amazonaws.location#SearchPlaceIndexForSuggestionsRequest\$MaxResults", + "com.amazonaws.location#PlaceIndexSearchResultLimit", ), - "com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane".shapeId() to setOf( - "com.amazonaws.paymentcryptographydata#IntegerRangeBetween4And12".shapeId(), + "com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane" to setOf( + "com.amazonaws.paymentcryptographydata#IntegerRangeBetween4And12", ), - "com.amazonaws.emrserverless#AwsToledoWebService".shapeId() to setOf( - // Service expects this to have a min value > 0 - "com.amazonaws.emrserverless#WorkerCounts".shapeId(), + "com.amazonaws.emrserverless#AwsToledoWebService" to setOf( + "com.amazonaws.emrserverless#WorkerCounts", ), - ) + "com.amazonaws.s3control#AWSS3ControlServiceV20180820" to setOf( + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$BlockPublicAcls", + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$IgnorePublicAcls", + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$BlockPublicPolicy", + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$RestrictPublicBuckets", + ), + ).map { (k, v) -> k.shapeId() to v.map { it.shapeId() }.toSet() }.toMap() private fun applies(service: ServiceShape) = removeDefaults.containsKey(service.id) From 9a4de2bef7a13030ceb2bb9492581615c04e6101 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 21 Nov 2023 10:44:11 -0500 Subject: [PATCH 295/331] Update ci.yml (#3247) updates main to use rust-launch (needed to unbreak CI) until we change to use rustv1 in the examples folder ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c56ec564cfd..68205ac234c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,6 +65,7 @@ jobs: with: repository: awsdocs/aws-doc-sdk-examples path: aws-doc-sdk-examples + ref: rust-launch - name: Run ${{ matrix.actions.action }} uses: ./smithy-rs/.github/actions/docker-build with: From e8f771b141a6fd0624ba3f080b251eef3c25cac5 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 21 Nov 2023 10:24:30 -0600 Subject: [PATCH 296/331] Clean up remaining `TODO(GA)` from PR#3082 (#3245) ## Motivation and Context This small PR cleans up remaining two `TODO(GA)` in #3082. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- gradle.properties | 3 -- .../upgrade_runtime_crates_version.rs | 34 +++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index eb87e1a8f48..547cb789043 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,9 +12,6 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated stable runtime crates -# -# TODO(GA): This is currently a placeholder for crates we are going to stabilize at the time of GA. -# Until then, a value of this key can contain 0 for the major version. smithy.rs.runtime.crate.stable.version=1.0.0 # Version number to use for the generated unstable runtime crates diff --git a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs index c79cc5d021d..f9df685bfbe 100644 --- a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs +++ b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs @@ -42,6 +42,7 @@ pub struct UpgradeRuntimeCratesVersionArgs { pub async fn subcommand_upgrade_runtime_crates_version( args: &UpgradeRuntimeCratesVersionArgs, ) -> Result<(), anyhow::Error> { + check_crate_ver_against_stability(&args.version, PackageStability::Unstable)?; let upgraded_unstable_version = semver::Version::parse(args.version.as_str()) .with_context(|| format!("{} is not a valid semver version", &args.version))?; let fs = Fs::Real; @@ -57,9 +58,8 @@ pub async fn subcommand_upgrade_runtime_crates_version( &args.gradle_properties_path ) })?; - // TODO(GA): Error out if args.stable_version starts with "0." - // https://github.com/smithy-lang/smithy-rs/pull/3082#discussion_r1378637315 let updated_gradle_properties = if let Some(stable_version) = &args.stable_version { + check_crate_ver_against_stability(stable_version, PackageStability::Stable)?; let upgraded_stable_version = semver::Version::parse(stable_version.as_str()) .with_context(|| format!("{} is not a valid semver version", &stable_version))?; update_gradle_properties( @@ -125,9 +125,26 @@ async fn update_gradle_properties_file( Ok(()) } +fn check_crate_ver_against_stability( + crate_ver: &str, + package_stability: PackageStability, +) -> Result<(), anyhow::Error> { + match package_stability { + PackageStability::Stable if crate_ver.starts_with("0.") => Err(anyhow::Error::msg( + format!("{} is an invalid stable crate version", &crate_ver), + )), + PackageStability::Unstable if !crate_ver.starts_with("0.") => Err(anyhow::Error::msg( + format!("{} is an invalid unstable crate version", &crate_ver), + )), + _ => Ok(()), + } +} + #[cfg(test)] mod tests { - use crate::subcommand::upgrade_runtime_crates_version::update_gradle_properties; + use crate::subcommand::upgrade_runtime_crates_version::{ + check_crate_ver_against_stability, update_gradle_properties, + }; use smithy_rs_tool_common::package::PackageStability; #[test] @@ -189,4 +206,15 @@ mod tests { assert!(result.is_err()); assert!(format!("{:?}", result).contains("downgrade")); } + + #[test] + fn test_check_crate_ver_against_stability() { + assert!(check_crate_ver_against_stability("0.60.0", PackageStability::Stable).is_err()); + assert!(check_crate_ver_against_stability("1.0.0", PackageStability::Stable).is_ok()); + assert!(check_crate_ver_against_stability("2.0.0", PackageStability::Stable).is_ok()); + + assert!(check_crate_ver_against_stability("0.60.0", PackageStability::Unstable).is_ok()); + assert!(check_crate_ver_against_stability("1.0.0", PackageStability::Unstable).is_err()); + assert!(check_crate_ver_against_stability("2.0.0", PackageStability::Unstable).is_err()); + } } From 09e46f47d4e1025cf96078242d5c55b95273fa8c Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 21 Nov 2023 10:24:58 -0600 Subject: [PATCH 297/331] Disable dev preview for `CrateVersioner` (#3241) ## Motivation and Context In this stable release branch, `CrateVersioner` needs to start versioning SDK crates in a way they are stable. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt b/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt index 7d2119ef07b..08145202032 100644 --- a/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt +++ b/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt @@ -24,7 +24,7 @@ object CrateVersioner { IndependentCrateVersioner( VersionsManifest.fromFile(versionsManifestPath), ModelMetadata.fromFile(modelMetadataPath), - devPreview = true, + devPreview = false, smithyRsVersion = getSmithyRsVersion(rootProject), ) } From e155c3048b9989fe406ef575d461ea01dfaf294c Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 21 Nov 2023 19:02:48 +0000 Subject: [PATCH 298/331] Upgrade the smithy-rs runtime crates version to 1.0.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 547cb789043..b513aaa0a81 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated stable runtime crates -smithy.rs.runtime.crate.stable.version=1.0.0 +smithy.rs.runtime.crate.stable.version=1.0.1 # Version number to use for the generated unstable runtime crates smithy.rs.runtime.crate.unstable.version=0.60.0 From 2d35dfd4ace067cd2c18188c4534bf37ca810187 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Tue, 21 Nov 2023 19:04:50 +0000 Subject: [PATCH 299/331] Update changelog --- CHANGELOG.md | 3 + CHANGELOG.next.toml | 8 +- aws/SDK_CHANGELOG.next.json | 465 +++--------------------------------- 3 files changed, 35 insertions(+), 441 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94d6147517a..e67ec7b5cbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ +November 21st, 2023 +=================== + November 17th, 2023 =================== **Breaking Changes:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 944384e4718..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,10 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests." -references = ["smithy-rs#3246"] -meta = { "breaking" = true, "tada" = false, "bug" = true } -author = "milesziemer" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index de68481d5a2..77f6a412228 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,423 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "(Behavior Break!) The SSO credentials provider is no longer enabled by default in `aws-config`, and so SSO profile config will no longer work out of box. The `credentials-sso` feature in `aws-config` was removed from the default features, and renamed to `sso`. If you need credentials from SSO, then enable the `sso` feature in `aws-config`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2917" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The `SsoCredentialsProvider` now supports token refresh and is compatible with the token cache file paths the latest AWS CLI uses.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2917", - "aws-sdk-rust#703", - "aws-sdk-rust#699" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3011" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Several breaking changes were made to the aws-sigv4 API to remove the direct HTTP dependency:\n- The `take_parameters` and `take_headers` APIs were removed from `SigningInstructions`. Use `into_parts()` instead\n- The arguments of `SignableRequest::new` were changed to accept string types instead of types from the HTTP crate\n- `SigningInstructions::apply_to_request` was gated beyond an `http0-compat` feature flag for backwards compatibility. This API MAY be removed in a future release.\n- Several public accessors were removed from `SigningInstructions`.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2921" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "In sigV4-related code, rename 'signing service' to 'signing name'. This aligns with the terminology used by the endpoint resolver.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "Velfi", - "references": [ - "smithy-rs#2911" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Struct members modeled as required are no longer wrapped in `Option`s [when possible](https://smithy.io/2.0/spec/aggregate-types.html#structure-member-optionality). For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929).", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#2916", - "aws-sdk-rust#536" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "All versions of SigningParams have been updated to contain an [`Identity`](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/identity/struct.Identity.html)\nas opposed to AWS credentials in `&str` form. [Read more](https://github.com/awslabs/aws-sdk-rust/discussions/868).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "Velfi", - "references": [ - "smithy-rs#2913" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Update MSRV to Rust 1.70.0", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "Velfi", - "references": [ - "smithy-rs#2948" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Correctly identify HTTP 200 responses from S3 with `` as the root Element as errors. **Note**: This a behavior change and will change the error type returned by the SDK in some cases.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2958", - "aws-sdk-rust#873" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Allow `no_credentials` to be used with all S3 operations.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2955", - "aws-sdk-rust#878" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "`CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2944", - "smithy-rs#2951" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#1668", - "aws-sdk-rust#873", - "smithy-rs#2964" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Remove `once_cell` from public API.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2973" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Fix regression with redacting sensitive HTTP response bodies.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2926", - "smithy-rs#2972" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. To determine if the field was actually set use `..is_some()`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2995" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The `futures_core::stream::Stream` trait has been removed from public API. It should not affect usual SDK use cases. If your code uses paginators, you do not need to use the `Stream` trait or its exntension traits, but only the `next`, `try_next`, `collect`, and `try_collect` methods are supported on `PaginationStream`. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2978" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Add support for Sigv4A request signing. Sigv4a signing will be used automatically when appropriate for a given operation. Currently, it's used for S3 and EventBridge.", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#1797" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2983" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The IMDS Client builder's `build()` method is no longer async.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2997" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The API for [`AssumeRoleProvider`](https://docs.rs/aws-config/latest/aws_config/sts/struct.AssumeRoleProvider.html) has been updated to derive configuration from [`SdkConfig`](https://docs.rs/aws-config/latest/aws_config/struct.SdkConfig.html) instead of `ProviderConfig`.\n\nFor more information, see the [Change Log Discussion](https://github.com/awslabs/aws-sdk-rust/discussions/906)", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3014" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "STS and SSO-based credential providers will now respect both `use_fips` and `use_dual_stack` when those settings are configured in a user's environment or profile.", - "meta": { - "bug": true, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#882", - "smithy-rs#3007" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\nFor more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#2417", - "smithy-rs#3018" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3055" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Lifetimes have been added to `EndpointResolver` and `IdentityResolver` traits.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3061" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "Several traits have been renamed from noun form to verb form to be more idiomatic:\n- `EndpointResolver` -> `ResolveEndpoint`\n- `Interceptor` -> `Intercept`\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3065" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "[`PresignedRequest`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/presigning/struct.PresignedRequest.html) now returns standard-library types instead of types from the `http` crate. `to_http_request` has been renamed `to_http_02x_request`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3059" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "A bug was fixed where the credentials-process provider was executing the subprocess in the worker thread, potentially stalling the runtime.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3052" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "The `credentials-process` feature was added to `aws-config`. If you currently use `no-default-features` for `aws-config`, you MUST enable this feature to use the [`CredentialProcessProvider`](https://docs.rs/aws-config/latest/aws_config/credential_process/struct.CredentialProcessProvider.html) provider directly or via `~/.aws/config`.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3052" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, - { - "message": "**This change has [detailed upgrade guidance](https://github.com/awslabs/aws-sdk-rust/discussions/923).**

The AWS credentials cache has been replaced with a more generic identity cache.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3077" - ], - "since-commit": "b56d34847591494a15b8fabcce55f730400ebea9", - "age": 5 - }, { "message": "Change `ByteStream::into_async_read` to return `AsyncBufRead`", "meta": { @@ -434,7 +17,7 @@ "smithy-rs#3164" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added.", @@ -449,7 +32,7 @@ "smithy-rs#3148" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n", @@ -464,7 +47,7 @@ "smithy-rs#3114" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "The `RequestId` trait has moved from the aws-http crate into aws-types.", @@ -478,7 +61,7 @@ "smithy-rs#3160" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n```rust\nasync fn example() {\n // with aws-config\n let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09());\n\n // when creating a client\n let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build());\n}\n```", @@ -492,7 +75,7 @@ "smithy-rs#3151" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "Add `ProvideErrorMetadata` impl for service `Error` type.", @@ -507,7 +90,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "Remove deprecated error kind type aliases.", @@ -521,7 +104,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\nmight have:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nIt should now look as follows:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nThe `Unhandled` variant should never be referenced directly.\n", @@ -535,7 +118,7 @@ "smithy-rs#3191" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 3 + "age": 4 }, { "message": "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead.", @@ -549,7 +132,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 2 + "age": 3 }, { "message": "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type", @@ -563,7 +146,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 2 + "age": 3 }, { "message": "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues.", @@ -577,7 +160,7 @@ "smithy-rs#3213" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 2 + "age": 3 }, { "message": "Add configurable stalled-stream protection for downloads.\n\nWhen making HTTP calls,\nit's possible for a connection to 'stall out' and emit no more data due to server-side issues.\nIn the event this happens, it's desirable for the stream to error out as quickly as possible.\nWhile timeouts can protect you from this issue, they aren't adaptive to the amount of data\nbeing sent and so must be configured specifically for each use case. When enabled, stalled-stream\nprotection will ensure that bad streams error out quickly, regardless of the amount of data being\ndownloaded.\n\nProtection is enabled by default for all clients but can be configured or disabled.\nSee [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n", @@ -591,7 +174,7 @@ "smithy-rs#3202" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 1 + "age": 2 }, { "message": "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -605,7 +188,7 @@ "smithy-rs#3217" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 1 + "age": 2 }, { "message": "Prevent multiplication overflow in backoff computation", @@ -620,7 +203,7 @@ "aws-sdk-rust#960" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 1 + "age": 2 }, { "message": "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -634,7 +217,7 @@ "smithy-rs#3228" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 1 + "age": 2 }, { "message": "Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\nwere ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\nthe [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n", @@ -648,7 +231,7 @@ "smithy-rs#3222" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 1 + "age": 2 }, { "message": "Add `Display` impl for `DateTime`.", @@ -662,7 +245,7 @@ "smithy-rs#3183" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 1 + "age": 2 }, { "message": "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.", @@ -676,6 +259,20 @@ "smithy-rs#3226" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "age": 2 + }, + { + "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", + "meta": { + "bug": true, + "breaking": true, + "tada": false + }, + "author": "milesziemer", + "references": [ + "smithy-rs#3246" + ], + "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", "age": 1 } ], From bab0341337771af492fbebfc5cdc06104bc23980 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 22 Nov 2023 10:55:01 -0600 Subject: [PATCH 300/331] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e67ec7b5cbf..64e3bbf9cfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ November 21st, 2023 =================== +**Internal changes only with this release** + November 17th, 2023 =================== From a9ef40b95ccdf7355e5fe0beb628d383b43b5caa Mon Sep 17 00:00:00 2001 From: 82marbag <69267416+82marbag@users.noreply.github.com> Date: Fri, 24 Nov 2023 09:57:46 +0000 Subject: [PATCH 301/331] Lifetimes in builders (#3249) ## Motivation and Context We're not handling lifetimes in builders of structures. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Signed-off-by: Daniele Ahmed --- .../core/rustlang/RustReservedWords.kt | 2 +- .../smithy/generators/StructureGenerator.kt | 54 ++++++++++--------- .../transformers/OperationNormalizer.kt | 2 +- .../server/smithy/ServerCodegenVisitor.kt | 38 ++++++++++--- .../generators/ServerBuilderGenerator.kt | 18 ++++--- .../ServerBuilderGeneratorCommon.kt | 6 +-- ...rGeneratorWithoutPublicConstrainedTypes.kt | 16 +++--- 7 files changed, 85 insertions(+), 51 deletions(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt index c9fdbafb13b..260cb62295a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt @@ -69,7 +69,7 @@ class RustReservedWordSymbolProvider( "RustReservedWordSymbolProvider should only run once" } - var renamedSymbol = internal.toSymbol(shape) + val renamedSymbol = internal.toSymbol(shape) return when (shape) { is MemberShape -> { val container = model.expectShape(shape.container) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt index d30365bba4c..64b7f55702d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt @@ -88,32 +88,16 @@ open class StructureGenerator( renderStructure() } - /** - * Search for lifetimes used by the members of the struct and generate a declaration. - * e.g. `<'a, 'b>` - */ - private fun lifetimeDeclaration(): String { - val lifetimes = members - .map { symbolProvider.toSymbol(it).rustType().innerReference() } - .mapNotNull { - when (it) { - is RustType.Reference -> it.lifetime - else -> null - } - }.toSet().sorted() - return if (lifetimes.isNotEmpty()) { - "<${lifetimes.joinToString { "'$it" }}>" - } else { - "" - } - } - /** * Render a custom debug implementation * When [SensitiveTrait] support is required, render a custom debug implementation to redact sensitive data */ private fun renderDebugImpl() { - writer.rustBlock("impl ${lifetimeDeclaration()} #T for $name ${lifetimeDeclaration()}", RuntimeType.Debug) { + val lifetime = shape.lifetimeDeclaration(symbolProvider) + writer.rustBlock( + "impl ${shape.lifetimeDeclaration(symbolProvider)} #T for $name $lifetime", + RuntimeType.Debug, + ) { writer.rustBlock("fn fmt(&self, f: &mut #1T::Formatter<'_>) -> #1T::Result", RuntimeType.stdFmt) { rust("""let mut formatter = f.debug_struct(${name.dq()});""") members.forEach { member -> @@ -134,8 +118,13 @@ open class StructureGenerator( if (accessorMembers.isEmpty()) { return } - val lifetimes = lifetimeDeclaration() - writer.rustBlock("impl $lifetimes $name $lifetimes") { + writer.rustBlock( + "impl ${shape.lifetimeDeclaration(symbolProvider)} $name ${ + shape.lifetimeDeclaration( + symbolProvider, + ) + }", + ) { // Render field accessor methods forEachMember(accessorMembers) { member, memberName, memberSymbol -> val memberType = memberSymbol.rustType() @@ -146,6 +135,7 @@ open class StructureGenerator( unwrapOrDefault = true memberType.stripOuter().asDeref().asRef() } + memberType.isCopy() -> memberType memberType is RustType.Option && memberType.member.isDeref() -> memberType.asDeref() memberType.isDeref() -> memberType.asDeref().asRef() @@ -188,7 +178,7 @@ open class StructureGenerator( writer.deprecatedShape(shape) containerMeta.render(writer) - writer.rustBlock("struct $name ${lifetimeDeclaration()}") { + writer.rustBlock("struct $name ${shape.lifetimeDeclaration(symbolProvider)}") { writer.forEachMember(members) { member, memberName, memberSymbol -> renderStructureMember(writer, member, memberName, memberSymbol) } @@ -223,3 +213,19 @@ open class StructureGenerator( ) } } + +/** + * Search for lifetimes used by the members of the struct and generate a declaration. + * e.g. `<'a, 'b>` + */ +fun StructureShape.lifetimeDeclaration(symbolProvider: RustSymbolProvider): String { + val lifetimes = this.members() + .mapNotNull { symbolProvider.toSymbol(it).rustType().innerReference()?.let { it as RustType.Reference } } + .mapNotNull { it.lifetime } + .toSet().sorted() + return if (lifetimes.isNotEmpty()) { + "<${lifetimes.joinToString { "'$it" }}>" + } else { + "" + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt index eb19fd7fab1..241e0d44d14 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt @@ -62,7 +62,7 @@ object OperationNormalizer { check( shapeConflict == null, ) { - "shape $shapeConflict conflicted with an existing shape in the model (${model.getShape(shapeConflict!!.id)}. This is a bug." + "shape $shapeConflict conflicted with an existing shape in the model (${model.expectShape(shapeConflict!!.id)}). This is a bug." } val modelWithOperationInputs = model.toBuilder().addShapes(newShapes).build() return transformer.mapShapes(modelWithOperationInputs) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index 5e5f7681b58..9e9ce5c598d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -32,6 +32,7 @@ import software.amazon.smithy.model.traits.LengthTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.implBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings import software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker @@ -41,6 +42,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory import software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer @@ -243,7 +245,10 @@ open class ServerCodegenVisitor( logger.log(logMessage.level, logMessage.message) } if (validationResult.shouldAbort) { - throw CodegenException("Unsupported constraints feature used; see error messages above for resolution", validationResult) + throw CodegenException( + "Unsupported constraints feature used; see error messages above for resolution", + validationResult, + ) } } @@ -328,7 +333,8 @@ open class ServerCodegenVisitor( serverBuilderGenerator.render(rustCrate, writer) if (codegenContext.settings.codegenConfig.publicConstrainedTypes) { - writer.implBlock(codegenContext.symbolProvider.toSymbol(shape)) { + val lifetimes = shape.lifetimeDeclaration(codegenContext.symbolProvider) + writer.rustBlock("impl $lifetimes ${codegenContext.symbolProvider.toSymbol(shape).name} $lifetimes") { serverBuilderGenerator.renderConvenienceMethod(this) } } @@ -372,7 +378,11 @@ open class ServerCodegenVisitor( if (renderUnconstrainedList) { logger.info("[rust-server-codegen] Generating an unconstrained type for collection shape $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.UnconstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.UnconstrainedModule, + shape, + codegenContext, + ) { UnconstrainedCollectionGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -382,7 +392,11 @@ open class ServerCodegenVisitor( if (!isDirectlyConstrained) { logger.info("[rust-server-codegen] Generating a constrained type for collection shape $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.ConstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.ConstrainedModule, + shape, + codegenContext, + ) { PubCrateConstrainedCollectionGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -427,7 +441,11 @@ open class ServerCodegenVisitor( if (renderUnconstrainedMap) { logger.info("[rust-server-codegen] Generating an unconstrained type for map $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.UnconstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.UnconstrainedModule, + shape, + codegenContext, + ) { UnconstrainedMapGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -437,7 +455,11 @@ open class ServerCodegenVisitor( if (!isDirectlyConstrained) { logger.info("[rust-server-codegen] Generating a constrained type for map $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.ConstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.ConstrainedModule, + shape, + codegenContext, + ) { PubCrateConstrainedMapGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -575,7 +597,9 @@ open class ServerCodegenVisitor( */ open fun protocolTests() { rustCrate.withModule(ServerRustModule.Operation) { - ServerProtocolTestGenerator(codegenContext, protocolGeneratorFactory.support(), protocolGenerator).render(this) + ServerProtocolTestGenerator(codegenContext, protocolGeneratorFactory.support(), protocolGenerator).render( + this, + ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt index 041e71b34bb..b8c74b9c5c1 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata +import software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed import software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained @@ -147,6 +148,7 @@ class ServerBuilderGenerator( private val isBuilderFallible = hasFallibleBuilder(shape, model, symbolProvider, takeInUnconstrainedTypes) private val serverBuilderConstraintViolations = ServerBuilderConstraintViolations(codegenContext, shape, takeInUnconstrainedTypes, customValidationExceptionWithReasonConversionGenerator) + private val lifetime = shape.lifetimeDeclaration(symbolProvider) private val codegenScope = arrayOf( "RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig), @@ -196,11 +198,11 @@ class ServerBuilderGenerator( it == RuntimeType.Debug || it == RuntimeType.Clone } + RuntimeType.Default Attribute(derive(builderDerives)).render(writer) - writer.rustBlock("${visibility.toRustQualifier()} struct Builder") { + writer.rustBlock("${visibility.toRustQualifier()} struct Builder$lifetime") { members.forEach { renderBuilderMember(this, it) } } - writer.rustBlock("impl Builder") { + writer.rustBlock("impl $lifetime Builder $lifetime") { for (member in members) { if (publicConstrainedTypes) { renderBuilderMemberFn(this, member) @@ -262,7 +264,7 @@ class ServerBuilderGenerator( self.build_enforcing_all_constraints() } """, - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) renderBuildEnforcingAllConstraintsFn(implBlockWriter) } @@ -270,7 +272,7 @@ class ServerBuilderGenerator( private fun renderBuildEnforcingAllConstraintsFn(implBlockWriter: RustWriter) { implBlockWriter.rustBlockTemplate( "fn build_enforcing_all_constraints(self) -> #{ReturnType:W}", - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) { conditionalBlock("Ok(", ")", conditional = isBuilderFallible) { coreBuilder(this) @@ -280,7 +282,7 @@ class ServerBuilderGenerator( fun renderConvenienceMethod(implBlock: RustWriter) { implBlock.docs("Creates a new builder-style object to manufacture #D.", structureSymbol) - implBlock.rustBlock("pub fn builder() -> #T", builderSymbol) { + implBlock.rustBlock("pub fn builder() -> #T $lifetime", builderSymbol) { write("#T::default()", builderSymbol) } } @@ -413,10 +415,10 @@ class ServerBuilderGenerator( private fun renderTryFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{TryFrom} for #{Structure} { + impl #{TryFrom} for #{Structure}$lifetime { type Error = ConstraintViolation; - fn try_from(builder: Builder) -> Result { + fn try_from(builder: Builder $lifetime) -> Result { builder.build() } } @@ -428,7 +430,7 @@ class ServerBuilderGenerator( private fun renderFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{From} for #{Structure} { + impl #{From} for #{Structure} $lifetime { fn from(builder: Builder) -> Self { builder.build() } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt index d10887678b5..4912d9eb314 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt @@ -57,11 +57,11 @@ import software.amazon.smithy.rust.codegen.server.smithy.hasPublicConstrainedWra /** * Returns a writable to render the return type of the server builders' `build()` method. */ -fun buildFnReturnType(isBuilderFallible: Boolean, structureSymbol: Symbol) = writable { +fun buildFnReturnType(isBuilderFallible: Boolean, structureSymbol: Symbol, lifetime: String) = writable { if (isBuilderFallible) { - rust("Result<#T, ConstraintViolation>", structureSymbol) + rust("Result<#T $lifetime, ConstraintViolation>", structureSymbol) } else { - rust("#T", structureSymbol) + rust("#T $lifetime", structureSymbol) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt index 013034921b5..7589a761c08 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt @@ -25,6 +25,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata +import software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.smithy.module @@ -84,6 +85,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private val isBuilderFallible = hasFallibleBuilder(shape, symbolProvider) private val serverBuilderConstraintViolations = ServerBuilderConstraintViolations(codegenContext, shape, builderTakesInUnconstrainedTypes = false, validationExceptionConversionGenerator) + private val lifetime = shape.lifetimeDeclaration(symbolProvider) private val codegenScope = arrayOf( "RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig), @@ -152,7 +154,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( self.build_enforcing_required_and_enum_traits() } """, - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) renderBuildEnforcingRequiredAndEnumTraitsFn(implBlockWriter) } @@ -160,7 +162,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private fun renderBuildEnforcingRequiredAndEnumTraitsFn(implBlockWriter: RustWriter) { implBlockWriter.rustBlockTemplate( "fn build_enforcing_required_and_enum_traits(self) -> #{ReturnType:W}", - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) { conditionalBlock("Ok(", ")", conditional = isBuilderFallible) { coreBuilder(this) @@ -199,7 +201,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( fun renderConvenienceMethod(implBlock: RustWriter) { implBlock.docs("Creates a new builder-style object to manufacture #D.", structureSymbol) - implBlock.rustBlock("pub fn builder() -> #T", builderSymbol) { + implBlock.rustBlock("pub fn builder() -> #T $lifetime", builderSymbol) { write("#T::default()", builderSymbol) } } @@ -237,10 +239,10 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private fun renderTryFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{TryFrom} for #{Structure} { + impl #{TryFrom} for #{Structure}$lifetime { type Error = ConstraintViolation; - fn try_from(builder: Builder) -> Result { + fn try_from(builder: Builder $lifetime) -> Result { builder.build() } } @@ -252,8 +254,8 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private fun renderFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{From} for #{Structure} { - fn from(builder: Builder) -> Self { + impl #{From} for #{Structure}$lifetime { + fn from(builder: Builder $lifetime) -> Self { builder.build() } } From 3d0cb5c3b179d5ed1d14531882657b481c4469f0 Mon Sep 17 00:00:00 2001 From: Miles Ziemer <45497130+milesziemer@users.noreply.github.com> Date: Fri, 24 Nov 2023 09:15:05 -0500 Subject: [PATCH 302/331] Update formatter pre-commit hooks to 2.11 (#3244) Was running into https://github.com/macisamuele/language-formatters-pre-commit-hooks/issues/181 trying to run pre-commit. It was fixed in 2.11. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: Russell Cohen --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c6e004a8a70..16924be2112 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: exclude: ^aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/ - id: trailing-whitespace - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - rev: v2.10.0 + rev: v2.11.0 hooks: - id: pretty-format-kotlin args: [--autofix, --ktlint-version, 0.48.2] From 48e3c95a3f10eebd5a637f8e7670c4232cdabbe4 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Sat, 25 Nov 2023 08:18:50 -0500 Subject: [PATCH 303/331] Fix bug in is_virtual_hostable_s3_bucket (#3253) An incorrect regex prevented `--` from being used in a bucket name ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 +++++++- .../inlineable/src/endpoint_lib/s3.rs | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..aa5a0569eea 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,10 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Allow `--` to be used in bucket names for S3" +references = ["smithy-rs#3253"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "rcoh" diff --git a/rust-runtime/inlineable/src/endpoint_lib/s3.rs b/rust-runtime/inlineable/src/endpoint_lib/s3.rs index 4c103d13252..0c5d76efa57 100644 --- a/rust-runtime/inlineable/src/endpoint_lib/s3.rs +++ b/rust-runtime/inlineable/src/endpoint_lib/s3.rs @@ -13,7 +13,7 @@ static VIRTUAL_HOSTABLE_SEGMENT: Lazy = static IPV4: Lazy = Lazy::new(|| Regex::new("^(\\d+\\.){3}\\d+$").unwrap()); -static DOTS_AND_DASHES: Lazy = Lazy::new(|| Regex::new("^.*[.-]{2}.*$").unwrap()); +static DOTS_AND_DASHES: Lazy = Lazy::new(|| Regex::new(r#"^.*((\.-)|(-\.)).*$"#).unwrap()); /// Evaluates whether a string is a DNS-compatible bucket name that can be used with virtual hosted-style addressing. pub(crate) fn is_virtual_hostable_s3_bucket( @@ -35,3 +35,20 @@ fn is_virtual_hostable_segment(host_label: &str) -> bool { && !IPV4.is_match(host_label) // don't allow ip address && !DOTS_AND_DASHES.is_match(host_label) // don't allow names like bucket-.name or bucket.-name } + +#[test] +fn check_s3_bucket() { + // check that double dashses are valid + let bucket = "a--b--x-s3"; + assert!(is_virtual_hostable_s3_bucket( + bucket, + false, + &mut DiagnosticCollector::new() + )); + + assert!(!is_virtual_hostable_s3_bucket( + "a-.b-.c", + true, + &mut DiagnosticCollector::new() + )) +} From 1061a3b0031b051ebbe8ac37f0cadda770c4b969 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Sat, 25 Nov 2023 14:19:17 +0000 Subject: [PATCH 304/331] Update changelog --- CHANGELOG.md | 3 +++ CHANGELOG.next.toml | 8 +----- aws/SDK_CHANGELOG.next.json | 50 ++++++++++++++++++++++++------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e67ec7b5cbf..de77fd318e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ +November 25th, 2023 +=================== + November 21st, 2023 =================== diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index aa5a0569eea..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,10 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = "Allow `--` to be used in bucket names for S3" -references = ["smithy-rs#3253"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 77f6a412228..2fd0ce69dfa 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -17,7 +17,7 @@ "smithy-rs#3164" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added.", @@ -32,7 +32,7 @@ "smithy-rs#3148" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n", @@ -47,7 +47,7 @@ "smithy-rs#3114" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "The `RequestId` trait has moved from the aws-http crate into aws-types.", @@ -61,7 +61,7 @@ "smithy-rs#3160" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n```rust\nasync fn example() {\n // with aws-config\n let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09());\n\n // when creating a client\n let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build());\n}\n```", @@ -75,7 +75,7 @@ "smithy-rs#3151" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "Add `ProvideErrorMetadata` impl for service `Error` type.", @@ -90,7 +90,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "Remove deprecated error kind type aliases.", @@ -104,7 +104,7 @@ "smithy-rs#3189" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\nmight have:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nIt should now look as follows:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nThe `Unhandled` variant should never be referenced directly.\n", @@ -118,7 +118,7 @@ "smithy-rs#3191" ], "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 4 + "age": 5 }, { "message": "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead.", @@ -132,7 +132,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 3 + "age": 4 }, { "message": "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type", @@ -146,7 +146,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 3 + "age": 4 }, { "message": "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues.", @@ -160,7 +160,7 @@ "smithy-rs#3213" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 3 + "age": 4 }, { "message": "Add configurable stalled-stream protection for downloads.\n\nWhen making HTTP calls,\nit's possible for a connection to 'stall out' and emit no more data due to server-side issues.\nIn the event this happens, it's desirable for the stream to error out as quickly as possible.\nWhile timeouts can protect you from this issue, they aren't adaptive to the amount of data\nbeing sent and so must be configured specifically for each use case. When enabled, stalled-stream\nprotection will ensure that bad streams error out quickly, regardless of the amount of data being\ndownloaded.\n\nProtection is enabled by default for all clients but can be configured or disabled.\nSee [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n", @@ -174,7 +174,7 @@ "smithy-rs#3202" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -188,7 +188,7 @@ "smithy-rs#3217" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Prevent multiplication overflow in backoff computation", @@ -203,7 +203,7 @@ "aws-sdk-rust#960" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -217,7 +217,7 @@ "smithy-rs#3228" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\nwere ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\nthe [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n", @@ -231,7 +231,7 @@ "smithy-rs#3222" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Add `Display` impl for `DateTime`.", @@ -245,7 +245,7 @@ "smithy-rs#3183" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.", @@ -259,7 +259,7 @@ "smithy-rs#3226" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 2 + "age": 3 }, { "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", @@ -273,6 +273,20 @@ "smithy-rs#3246" ], "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", + "age": 2 + }, + { + "message": "Allow `--` to be used in bucket names for S3", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#3253" + ], + "since-commit": "48e3c95a3f10eebd5a637f8e7670c4232cdabbe4", "age": 1 } ], From fd0034ec44cab3187d08766b7608b5142c694f63 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Sun, 26 Nov 2023 17:40:07 -0500 Subject: [PATCH 305/331] Fix s3 tests (#3257) ## Motivation and Context Fix issue where S3 tests asserted on entire URI. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../tests/client-construction.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index 481077d429c..c5c3c842c25 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -171,10 +171,10 @@ async fn behavior_mv_from_aws_config() { .send() .await .expect_err("it should fail to send a request because there is no HTTP client"); - assert_eq!( - req.expect_request().uri(), - "https://s3.us-west-2.amazonaws.com/" - ); + assert!(req + .expect_request() + .uri() + .starts_with("https://s3.us-west-2.amazonaws.com/")); } #[tokio::test] @@ -199,8 +199,8 @@ async fn behavior_mv_from_client_construction() { .send() .await .expect_err("it should fail to send a request because there is no HTTP client")); - assert_eq!( - req.expect_request().uri(), - "https://s3.us-west-2.amazonaws.com/" - ); + assert!(req + .expect_request() + .uri() + .starts_with("https://s3.us-west-2.amazonaws.com/")); } From 57c3d63716d2ccc88a3c942706cb30bd4b30b3d4 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Sun, 26 Nov 2023 23:22:20 +0000 Subject: [PATCH 306/331] Update changelog --- CHANGELOG.md | 3 + aws/SDK_CHANGELOG.next.json | 139 ++++-------------------------------- 2 files changed, 15 insertions(+), 127 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de77fd318e2..9663cb251c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ +November 26th, 2023 +=================== + November 25th, 2023 =================== diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 2fd0ce69dfa..03e44ac4b62 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,121 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Change `ByteStream::into_async_read` to return `AsyncBufRead`", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "utkarshgupta137", - "references": [ - "smithy-rs#3164" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "[Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/aws-sdk-rust/discussions/950). HTTP request types moved, and a new HTTP response type was added.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3138", - "smithy-rs#3148" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#3100", - "smithy-rs#3114" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "The `RequestId` trait has moved from the aws-http crate into aws-types.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3160" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n```rust\nasync fn example() {\n // with aws-config\n let conf = aws_config::defaults(aws_config::BehaviorVersion::v2023_11_09());\n\n // when creating a client\n let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build());\n}\n```", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3151" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "Add `ProvideErrorMetadata` impl for service `Error` type.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "jdisanti", - "references": [ - "aws-sdk-rust#780", - "smithy-rs#3189" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "Remove deprecated error kind type aliases.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3189" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, - { - "message": "Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\nmight have:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nIt should now look as follows:\n```rust\nmatch service_error.err() {\n GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n // unhandled error handling\n }\n _ => { /* ... */ }\n}\n```\nThe `Unhandled` variant should never be referenced directly.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3191" - ], - "since-commit": "f78ee50d9b28c1d2337ca6236e592dfc243ae1c9", - "age": 5 - }, { "message": "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead.", "meta": { @@ -132,7 +17,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 4 + "age": 5 }, { "message": "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type", @@ -146,7 +31,7 @@ "smithy-rs#3205" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 4 + "age": 5 }, { "message": "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues.", @@ -160,7 +45,7 @@ "smithy-rs#3213" ], "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 4 + "age": 5 }, { "message": "Add configurable stalled-stream protection for downloads.\n\nWhen making HTTP calls,\nit's possible for a connection to 'stall out' and emit no more data due to server-side issues.\nIn the event this happens, it's desirable for the stream to error out as quickly as possible.\nWhile timeouts can protect you from this issue, they aren't adaptive to the amount of data\nbeing sent and so must be configured specifically for each use case. When enabled, stalled-stream\nprotection will ensure that bad streams error out quickly, regardless of the amount of data being\ndownloaded.\n\nProtection is enabled by default for all clients but can be configured or disabled.\nSee [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n", @@ -174,7 +59,7 @@ "smithy-rs#3202" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -188,7 +73,7 @@ "smithy-rs#3217" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Prevent multiplication overflow in backoff computation", @@ -203,7 +88,7 @@ "aws-sdk-rust#960" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -217,7 +102,7 @@ "smithy-rs#3228" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\nwere ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\nthe [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n", @@ -231,7 +116,7 @@ "smithy-rs#3222" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Add `Display` impl for `DateTime`.", @@ -245,7 +130,7 @@ "smithy-rs#3183" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.", @@ -259,7 +144,7 @@ "smithy-rs#3226" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 3 + "age": 4 }, { "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", @@ -273,7 +158,7 @@ "smithy-rs#3246" ], "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", - "age": 2 + "age": 3 }, { "message": "Allow `--` to be used in bucket names for S3", @@ -287,7 +172,7 @@ "smithy-rs#3253" ], "since-commit": "48e3c95a3f10eebd5a637f8e7670c4232cdabbe4", - "age": 1 + "age": 2 } ], "aws-sdk-model": [] From c62c9fba652bbf67fe27a1d11edc061076be61fe Mon Sep 17 00:00:00 2001 From: Miles Ziemer <45497130+milesziemer@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:10:36 -0500 Subject: [PATCH 307/331] Remove incorrect defaults for iot (#3256) ## Motivation and Context The IoT Smithy model we have is incorrect, resulting in some types being generated as non-optional when they should be optional. ## Description Removes the defaults of a few shapes for iot, which are meant to be nullable. Can remove this when the model is fixed upstream. Also changed some of the other shapes in RemoveDefaultsDecorator to use the synthetic shape id, but this didn't impact generated code - just for consistency. ## Testing - [x] Generated IoT SDK and verified diff is expected ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 8 +++++++- .../rustsdk/customize/RemoveDefaultsDecorator.kt | 14 +++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..23396d96ffb 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,10 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works." +references = ["smithy-rs#3256"] +meta = { "breaking" = true, "tada" = false, "bug" = true } +author = "milesziemer" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt index a613f812b3b..1e1e205f45e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt @@ -35,7 +35,7 @@ class RemoveDefaultsDecorator : ClientCodegenDecorator { "com.amazonaws.drs#Validity", "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceThreshold", "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceDeltaThreshold", - "com.amazonaws.drs#ListStagingAccountsRequest\$maxResults", + "com.amazonaws.drs.synthetic#ListStagingAccountsInput\$maxResults", "com.amazonaws.drs#StrictlyPositiveInteger", "com.amazonaws.drs#MaxResultsType", "com.amazonaws.drs#MaxResultsReplicatingSourceServers", @@ -45,8 +45,8 @@ class RemoveDefaultsDecorator : ClientCodegenDecorator { "com.amazonaws.evidently#ResultsPeriod", ), "com.amazonaws.location#LocationService" to setOf( - "com.amazonaws.location#ListPlaceIndexesRequest\$MaxResults", - "com.amazonaws.location#SearchPlaceIndexForSuggestionsRequest\$MaxResults", + "com.amazonaws.location.synthetic#ListPlaceIndexesInput\$MaxResults", + "com.amazonaws.location.synthetic#SearchPlaceIndexForSuggestionsInput\$MaxResults", "com.amazonaws.location#PlaceIndexSearchResultLimit", ), "com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane" to setOf( @@ -61,6 +61,14 @@ class RemoveDefaultsDecorator : ClientCodegenDecorator { "com.amazonaws.s3control#PublicAccessBlockConfiguration\$BlockPublicPolicy", "com.amazonaws.s3control#PublicAccessBlockConfiguration\$RestrictPublicBuckets", ), + "com.amazonaws.iot#AWSIotService" to setOf( + "com.amazonaws.iot#ThingConnectivity\$connected", + "com.amazonaws.iot.synthetic#UpdateProvisioningTemplateInput\$enabled", + "com.amazonaws.iot.synthetic#CreateProvisioningTemplateInput\$enabled", + "com.amazonaws.iot.synthetic#DescribeProvisioningTemplateOutput\$enabled", + "com.amazonaws.iot.synthetic#DescribeProvisioningTemplateOutput\$enabled", + "com.amazonaws.iot#ProvisioningTemplateSummary\$enabled", + ), ).map { (k, v) -> k.shapeId() to v.map { it.shapeId() }.toSet() }.toMap() private fun applies(service: ServiceShape) = From 35afb0a521452325d87ad7c042b9a40404d40612 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 27 Nov 2023 13:38:22 -0500 Subject: [PATCH 308/331] Retry additional classes of H2 errors (#3250) ## Motivation and Context The original PR was accidentally removed in a bad merge. ## Testing - Exact changes from original PR ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 14 +++++++- rust-runtime/aws-smithy-runtime/Cargo.toml | 3 +- .../src/client/http/hyper_014.rs | 34 ++++++++++++------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 23396d96ffb..4e577e3fcfc 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,8 +11,20 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" +[[smithy-rs]] +message = "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)" +references = ["aws-sdk-rust#738", "aws-sdk-rust#858"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "rcoh" + +[[aws-sdk-rust]] +message = "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)" +references = ["aws-sdk-rust#738", "aws-sdk-rust#858"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "rcoh" + [[aws-sdk-rust]] message = "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works." references = ["smithy-rs#3256"] meta = { "breaking" = true, "tada" = false, "bug" = true } -author = "milesziemer" +author = "milesziemer" \ No newline at end of file diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index 6a3e1e40a1d..d9ebaea92b0 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -12,7 +12,7 @@ repository = "https://github.com/smithy-lang/smithy-rs" [features] client = ["aws-smithy-runtime-api/client"] http-auth = ["aws-smithy-runtime-api/http-auth"] -connector-hyper-0-14-x = ["dep:hyper-0-14", "hyper-0-14?/client", "hyper-0-14?/http2", "hyper-0-14?/http1", "hyper-0-14?/tcp", "hyper-0-14?/stream"] +connector-hyper-0-14-x = ["dep:hyper-0-14", "hyper-0-14?/client", "hyper-0-14?/http2", "hyper-0-14?/http1", "hyper-0-14?/tcp", "hyper-0-14?/stream", "dep:h2"] tls-rustls = ["dep:hyper-rustls", "dep:rustls", "connector-hyper-0-14-x"] rt-tokio = ["tokio/rt"] @@ -28,6 +28,7 @@ aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x"] } bytes = "1" fastrand = "2.0.0" +h2 = { version = "0.3", default-features = false, optional = true } http = { version = "0.2.8" } http-body-0-4 = { package = "http-body", version = "0.4.4" } hyper-0-14 = { package = "hyper", version = "0.14.26", default-features = false, optional = true } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 0b5e6f056a7..344c60714a1 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -4,6 +4,7 @@ */ use crate::client::http::connection_poisoning::CaptureSmithyConnection; +use crate::client::http::hyper_014::timeout_middleware::HttpTimeoutError; use aws_smithy_async::future::timeout::TimedOutError; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_runtime_api::box_error::BoxError; @@ -19,6 +20,7 @@ use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::retry::ErrorKind; +use h2::Reason; use http::{Extensions, Uri}; use hyper_0_14::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo}; use hyper_0_14::service::Service; @@ -397,21 +399,29 @@ fn downcast_error(err: BoxError) -> ConnectorError { /// Convert a [`hyper_0_14::Error`] into a [`ConnectorError`] fn to_connector_error(err: hyper_0_14::Error) -> ConnectorError { - if err.is_timeout() || find_source::(&err).is_some() { - ConnectorError::timeout(err.into()) - } else if err.is_user() { - ConnectorError::user(err.into()) - } else if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() - { - ConnectorError::io(err.into()) + if err.is_timeout() || find_source::(&err).is_some() { + return ConnectorError::timeout(err.into()); + } + if err.is_user() { + return ConnectorError::user(err.into()); + } + if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() { + return ConnectorError::io(err.into()); } // We sometimes receive this from S3: hyper::Error(IncompleteMessage) - else if err.is_incomplete_message() { - ConnectorError::other(err.into(), Some(ErrorKind::TransientError)) - } else { - tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); - ConnectorError::other(err.into(), None) + if err.is_incomplete_message() { + return ConnectorError::other(err.into(), Some(ErrorKind::TransientError)); } + if let Some(h2_err) = find_source::(&err) { + if h2_err.is_go_away() + || (h2_err.is_reset() && h2_err.reason() == Some(Reason::REFUSED_STREAM)) + { + return ConnectorError::io(err.into()); + } + } + + tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); + ConnectorError::other(err.into(), None) } fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> { From 28da3c5fde31c5c04e75a19f85071ccf74e70edf Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Mon, 27 Nov 2023 15:14:53 -0600 Subject: [PATCH 309/331] Stop tagging releases as prereleases (#3259) ## Motivation and Context Now that we have started [stable releases](https://github.com/smithy-lang/smithy-rs/releases) since `release-2023-11-21`, we shouldn't set those as pre-releases. (this PR also includes a small fix to the `Release` job in our release workflow to avoid `git push` failing during dry-runs, which [a previous dry-run](https://github.com/smithy-lang/smithy-rs/actions/runs/6989359794) ran into) ## Description The fix is in `changelogger`, and this should remove pre-releases from releases in `smithy-rs` as well as those in `aws-sdk-rust`. ## Testing Ran a [dry-run](https://github.com/smithy-lang/smithy-rs/actions/runs/7007835035) and checked the release artifacts as follows: ``` { "tagName": "release-2023-11-27", "name": "November 27th, 2023", "body": "", "prerelease": false } ``` Have not verified what a release manifest looks like in `aws-sdk-rust`, but I suspect `prerelease: false` should be applied there as well given the same `changelogger` is used. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/release.yml | 9 ++++++++- tools/ci-build/changelogger/src/render.rs | 4 ++-- tools/ci-build/changelogger/tests/e2e_test.rs | 6 +++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 600e4179099..914ed8b5449 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -231,6 +231,7 @@ jobs: id: push-changelog env: RELEASE_BRANCH_NAME: ${{ needs.upgrade-gradle-properties.outputs.release_branch }} + DRY_RUN: ${{ inputs.dry_run }} run: | if ! git diff-index --quiet HEAD; then echo "Pushing release commits..." @@ -239,7 +240,13 @@ jobs: # to retry a release action execution that failed due to a transient issue. # In that case, we expect the commit to be releasable as-is, i.e. the changelog should have already # been processed. - git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + if [[ "${DRY_RUN}" == "true" ]]; then + # During dry-runs, "git push" without "--force" can fail if smithy-rs-release-x.y.z-preview is behind + # smithy-rs-release-x.y.z, but that does not matter much during dry-runs. + git push --force origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + else + git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + fi fi echo "commit_sha=$(git rev-parse HEAD)" > $GITHUB_OUTPUT - name: Tag release diff --git a/tools/ci-build/changelogger/src/render.rs b/tools/ci-build/changelogger/src/render.rs index 7292855ee02..5b72a253bbf 100644 --- a/tools/ci-build/changelogger/src/render.rs +++ b/tools/ci-build/changelogger/src/render.rs @@ -295,8 +295,8 @@ fn update_changelogs( tag_name: release_metadata.tag.clone(), name: release_metadata.title.clone(), body: release_notes.clone(), - // All releases are pre-releases for now - prerelease: true, + // stable as of release-2023-11-21 + prerelease: false, }; std::fs::write( output_path.join(&release_metadata.manifest_name), diff --git a/tools/ci-build/changelogger/tests/e2e_test.rs b/tools/ci-build/changelogger/tests/e2e_test.rs index 87862af3415..cbf4d9ceea7 100644 --- a/tools/ci-build/changelogger/tests/e2e_test.rs +++ b/tools/ci-build/changelogger/tests/e2e_test.rs @@ -319,7 +319,7 @@ Old entry contents "tagName": "release-1970-01-01", "name": "January 1st, 1970", "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n", - "prerelease": true + "prerelease": false }"#, release_manifest ); @@ -415,7 +415,7 @@ Old entry contents "tagName": "release-1970-01-01", "name": "January 1st, 1970", "body": "**New this release:**\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567))\n\n", - "prerelease": true + "prerelease": false }"#, release_manifest ); @@ -698,7 +698,7 @@ Old entry contents "tagName": "release-1970-01-01", "name": "January 1st, 1970", "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n**Crate Versions**\n
\nClick to expand to view crate versions...\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n
\n\n", - "prerelease": true + "prerelease": false }"#, release_manifest ); From 88970ba88ef45266aade152c7c1da8e90b24c0d7 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Mon, 27 Nov 2023 23:33:24 +0000 Subject: [PATCH 310/331] Upgrade the smithy-rs runtime crates version to 1.0.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b513aaa0a81..f62062154b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated stable runtime crates -smithy.rs.runtime.crate.stable.version=1.0.1 +smithy.rs.runtime.crate.stable.version=1.0.2 # Version number to use for the generated unstable runtime crates smithy.rs.runtime.crate.unstable.version=0.60.0 From cb227b598a6333c73e3e9d70cbfc3a5e0d6518e0 Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Mon, 27 Nov 2023 23:35:50 +0000 Subject: [PATCH 311/331] Update changelog --- CHANGELOG.md | 6 +++ CHANGELOG.next.toml | 20 +-------- aws/SDK_CHANGELOG.next.json | 89 ++++++++++++++++--------------------- 3 files changed, 45 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9663cb251c6..f5512c0f7a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ +November 27th, 2023 +=================== +**New this release:** +- (client, [aws-sdk-rust#738](https://github.com/awslabs/aws-sdk-rust/issues/738), [aws-sdk-rust#858](https://github.com/awslabs/aws-sdk-rust/issues/858)) Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream) + + November 26th, 2023 =================== diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 4e577e3fcfc..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,22 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[smithy-rs]] -message = "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)" -references = ["aws-sdk-rust#738", "aws-sdk-rust#858"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)" -references = ["aws-sdk-rust#738", "aws-sdk-rust#858"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works." -references = ["smithy-rs#3256"] -meta = { "breaking" = true, "tada" = false, "bug" = true } -author = "milesziemer" \ No newline at end of file +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 03e44ac4b62..7b3cbbdd852 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,48 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "imds::client::Builder::endpoint has been updated to accept a string instead of a URI. The method now returns a result instead.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3205" - ], - "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 5 - }, - { - "message": "The `AssumeRoleBuilder::policy_arns` now accepts strings instead of an STS specific type", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3205" - ], - "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 5 - }, - { - "message": "Fix optional types in S3. Many types in S3 were modeled as non-optional but this causes serialization issues.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#3213" - ], - "since-commit": "681bf77733a242e01458e87381a0700616c918da", - "age": 5 - }, { "message": "Add configurable stalled-stream protection for downloads.\n\nWhen making HTTP calls,\nit's possible for a connection to 'stall out' and emit no more data due to server-side issues.\nIn the event this happens, it's desirable for the stream to error out as quickly as possible.\nWhile timeouts can protect you from this issue, they aren't adaptive to the amount of data\nbeing sent and so must be configured specifically for each use case. When enabled, stalled-stream\nprotection will ensure that bad streams error out quickly, regardless of the amount of data being\ndownloaded.\n\nProtection is enabled by default for all clients but can be configured or disabled.\nSee [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n", "meta": { @@ -59,7 +17,7 @@ "smithy-rs#3202" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -73,7 +31,7 @@ "smithy-rs#3217" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Prevent multiplication overflow in backoff computation", @@ -88,7 +46,7 @@ "aws-sdk-rust#960" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests.", @@ -102,7 +60,7 @@ "smithy-rs#3228" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\nwere ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\nthe [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n", @@ -116,7 +74,7 @@ "smithy-rs#3222" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Add `Display` impl for `DateTime`.", @@ -130,7 +88,7 @@ "smithy-rs#3183" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.", @@ -144,7 +102,7 @@ "smithy-rs#3226" ], "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 4 + "age": 5 }, { "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", @@ -158,7 +116,7 @@ "smithy-rs#3246" ], "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", - "age": 3 + "age": 4 }, { "message": "Allow `--` to be used in bucket names for S3", @@ -172,7 +130,36 @@ "smithy-rs#3253" ], "since-commit": "48e3c95a3f10eebd5a637f8e7670c4232cdabbe4", - "age": 2 + "age": 3 + }, + { + "message": "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "aws-sdk-rust#738", + "aws-sdk-rust#858" + ], + "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", + "age": 1 + }, + { + "message": "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works.", + "meta": { + "bug": true, + "breaking": true, + "tada": false + }, + "author": "milesziemer", + "references": [ + "smithy-rs#3256" + ], + "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", + "age": 1 } ], "aws-sdk-model": [] From 167e3b587e0678cb99ce3e85d6e4af53d2847eea Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 27 Nov 2023 17:01:08 -0800 Subject: [PATCH 312/331] Add suffix support to release tags in tooling (#3261) This will fix the yank tool and canary in the event there are multiple SDK releases in a day. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy-rs-tool-common/src/release_tag.rs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs b/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs index fe1d2be5a2f..371923d76ed 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs @@ -13,7 +13,7 @@ use std::str::FromStr; lazy_static! { static ref VERSION_TAG: Regex = Regex::new(r"^v(\d+)\.(\d+)\.(\d+)$").unwrap(); - static ref DATE_TAG: Regex = Regex::new(r"^release-(\d{4}-\d{2}-\d{2})$").unwrap(); + static ref DATE_TAG: Regex = Regex::new(r"^release-(\d{4}-\d{2}-\d{2})(.(\d+))?$").unwrap(); } #[derive(Clone, Debug, Eq, PartialEq)] @@ -25,6 +25,7 @@ pub struct VersionReleaseTag { #[derive(Clone, Debug, Eq, PartialEq)] pub struct DateReleaseTag { date: String, + suffix: Option, original: String, } @@ -66,6 +67,7 @@ impl FromStr for ReleaseTag { } else if let Some(caps) = DATE_TAG.captures(value) { Ok(ReleaseTag::Date(DateReleaseTag { date: caps.get(1).expect("validated by regex").as_str().into(), + suffix: caps.get(3).map(|s| usize::from_str(s.as_str()).unwrap()), original: value.into(), })) } else { @@ -95,7 +97,9 @@ impl PartialOrd for ReleaseTag { match (self, other) { (ReleaseTag::Date(_), ReleaseTag::Version(_)) => Some(Ordering::Greater), (ReleaseTag::Version(_), ReleaseTag::Date(_)) => Some(Ordering::Less), - (ReleaseTag::Date(lhs), ReleaseTag::Date(rhs)) => Some(lhs.date.cmp(&rhs.date)), + (ReleaseTag::Date(lhs), ReleaseTag::Date(rhs)) => { + Some(lhs.date.cmp(&rhs.date).then(lhs.suffix.cmp(&rhs.suffix))) + } (ReleaseTag::Version(lhs), ReleaseTag::Version(rhs)) => { Some(lhs.version.cmp(&rhs.version)) } @@ -125,10 +129,20 @@ mod tests { ReleaseTag::Date(DateReleaseTag { date: "2022-07-26".into(), original: "release-2022-07-26".into(), + suffix: None }), tag("release-2022-07-26") ); + assert_eq!( + ReleaseTag::Date(DateReleaseTag { + date: "2022-07-26".into(), + original: "release-2022-07-26.2".into(), + suffix: Some(2) + }), + tag("release-2022-07-26.2") + ); + assert!(ReleaseTag::from_str("foo").is_err()); } @@ -140,6 +154,10 @@ mod tests { assert!(tag("release-2022-07-20") < tag("release-2022-07-26")); assert!(tag("release-2022-06-20") < tag("release-2022-07-01")); assert!(tag("release-2021-06-20") < tag("release-2022-06-20")); + assert!(tag("release-2022-06-20") < tag("release-2022-06-20.2")); + assert!(tag("release-2022-06-20.2") < tag("release-2022-06-20.3")); + assert!(tag("release-2022-06-20.1") < tag("release-2022-06-20.10")); + assert!(tag("release-2022-06-20.10") < tag("release-2022-06-20.11")); } #[test] @@ -149,5 +167,9 @@ mod tests { "release-2022-07-26", format!("{}", tag("release-2022-07-26")) ); + assert_eq!( + "release-2022-07-26.2", + format!("{}", tag("release-2022-07-26.2")) + ); } } From eb61ae359ec657e32937bcca6364bfca9ddfdb86 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Tue, 28 Nov 2023 13:22:40 -0600 Subject: [PATCH 313/331] Add `aws-config` to semver-checks deny list (#3267) ## Motivation and Context Skip running `semver-checks` on `aws-config` to enable clean runs for CI while #3265 is investigated. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-scripts/codegen-diff/semver-checks.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/ci-scripts/codegen-diff/semver-checks.py b/tools/ci-scripts/codegen-diff/semver-checks.py index be3e4317273..25d36ffb34d 100755 --- a/tools/ci-scripts/codegen-diff/semver-checks.py +++ b/tools/ci-scripts/codegen-diff/semver-checks.py @@ -36,10 +36,16 @@ def main(skip_generation=False): failures = [] deny_list = [ # add crate names here to exclude them from the semver checks + # TODO(https://github.com/smithy-lang/smithy-rs/issues/3265) + 'aws-config' ] for path in list(os.listdir())[:10]: eprint(f'checking {path}...', end='') - if path not in deny_list and get_cmd_status(f'git cat-file -e base:{sdk_directory}/{path}/Cargo.toml') == 0: + if path in deny_list: + eprint(f"skipping {path} because it is in 'deny_list'") + elif get_cmd_status(f'git cat-file -e base:{sdk_directory}/{path}/Cargo.toml') != 0: + eprint(f'skipping {path} because it does not exist in base') + else: get_cmd_output('cargo generate-lockfile', quiet=True) (_, out, _) = get_cmd_output('cargo pkgid', cwd=path, quiet=True) pkgid = parse_package_id(out) @@ -59,8 +65,6 @@ def main(skip_generation=False): if out: eprint(out) eprint(err) - else: - eprint(f'skipping {path} because it does not exist in base') if failures: eprint('One or more crates failed semver checks!') eprint("\n".join(failures)) From edab8cfb4913979374e461c96d31a3c939f66ebc Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Wed, 29 Nov 2023 10:01:51 -0500 Subject: [PATCH 314/331] Fix runtime crate versions (#3260) ## Motivation and Context When the stable/unstable crate versions were split, this caused a regression in determining the crate version during codegen. This enhances our crate-version forwarding code to publish all the crate versions. For impact, see codegen-client-test. ## Description - Change the build artifact to be a JSON blob will all required versions. ## Testing - [ ] Audit diff ## Checklist - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [ ] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../smithy/rustsdk/AwsCargoDependency.kt | 2 +- buildSrc/src/main/kotlin/CrateSet.kt | 2 + .../config/ServiceConfigGenerator.kt | 1 + codegen-core/build.gradle.kts | 37 +++++- .../smithy/rust/codegen/core/Version.kt | 38 ++++-- .../rust/codegen/core/smithy/RuntimeType.kt | 20 +-- .../smithy/rust/codegen/core/VersionTest.kt | 25 +--- .../codegen/core/smithy/RuntimeTypeTest.kt | 118 ++---------------- .../generators/PythonServerModuleGenerator.kt | 2 +- 9 files changed, 94 insertions(+), 151 deletions(-) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt index 4141c7e0b1e..c803040f7d8 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt @@ -10,7 +10,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.crateLocation fun RuntimeConfig.awsRuntimeCrate(name: String, features: Set = setOf()): CargoDependency = - CargoDependency(name, awsRoot().crateLocation(null), features = features) + CargoDependency(name, awsRoot().crateLocation(name), features = features) object AwsCargoDependency { fun awsConfig(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-config") diff --git a/buildSrc/src/main/kotlin/CrateSet.kt b/buildSrc/src/main/kotlin/CrateSet.kt index 72eb37d3fb2..765503e5a16 100644 --- a/buildSrc/src/main/kotlin/CrateSet.kt +++ b/buildSrc/src/main/kotlin/CrateSet.kt @@ -79,4 +79,6 @@ object CrateSet { ) val ENTIRE_SMITHY_RUNTIME = (AWS_SDK_SMITHY_RUNTIME + SERVER_SMITHY_RUNTIME).toSortedSet(compareBy { it.name }) + + val ALL_CRATES = AWS_SDK_RUNTIME + ENTIRE_SMITHY_RUNTIME } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index e94480e05a0..26f4cd7a634 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -476,6 +476,7 @@ class ServiceConfigGenerator( docs("Apply test defaults to the builder") rustBlock("pub fn apply_test_defaults(&mut self) -> &mut Self") { customizations.forEach { it.section(ServiceConfig.DefaultForTests("self"))(this) } + rustTemplate("self.behavior_version = #{Some}(crate::config::BehaviorVersion::latest());", *preludeScope) rust("self") } diff --git a/codegen-core/build.gradle.kts b/codegen-core/build.gradle.kts index 556088f8a09..0213e423a50 100644 --- a/codegen-core/build.gradle.kts +++ b/codegen-core/build.gradle.kts @@ -53,18 +53,47 @@ fun gitCommitHash(): String { } val generateSmithyRuntimeCrateVersion by tasks.registering { + fun kv(key: String, value: String) = "\"$key\": \"$value\"" // generate the version of the runtime to use as a resource. // this keeps us from having to manually change version numbers in multiple places val resourcesDir = "$buildDir/resources/main/software/amazon/smithy/rust/codegen/core" val versionFile = file("$resourcesDir/runtime-crate-version.txt") outputs.file(versionFile) - val crateVersion = project.properties["smithy.rs.runtime.crate.version"].toString() - inputs.property("crateVersion", crateVersion) + val stableCrateVersion = project.properties["smithy.rs.runtime.crate.stable.version"].toString() + val unstableCrateVersion = project.properties["smithy.rs.runtime.crate.unstable.version"].toString() + inputs.property("crateVersion", stableCrateVersion) // version format must be in sync with `software.amazon.smithy.rust.codegen.core.Version` - val version = "$crateVersion\n${gitCommitHash()}" + val version = StringBuilder().append("{") + version.append(kv("githash", gitCommitHash())).append(",") + version.append(kv("stableVersion", stableCrateVersion)).append(",") + version.append(kv("unstableVersion", unstableCrateVersion)).append(",") + // hack for internal build + val smithyStableCrates = listOf( + // AWS crates + "aws-config", + "aws-credential-types", + "aws-runtime", + "aws-runtime-api", + "aws-sigv4", + "aws-types", + + // smithy crates + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-runtime", + "aws-smithy-types", + ) + + val runtimeCrates = + smithyStableCrates.joinToString(separator = ",", prefix = "{", postfix = "}") { crate -> + kv(crate, stableCrateVersion) + } + + version.append(""""runtimeCrates": $runtimeCrates""").append("}") + sourceSets.main.get().output.dir(resourcesDir) doLast { - versionFile.writeText(version) + versionFile.writeText(version.toString()) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt index 633d92c2279..071f0a2089b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt @@ -6,29 +6,49 @@ package software.amazon.smithy.rust.codegen.core import software.amazon.smithy.codegen.core.CodegenException +import software.amazon.smithy.model.node.Node // generated as part of the build, see codegen-core/build.gradle.kts private const val VERSION_FILENAME = "runtime-crate-version.txt" -data class Version(val fullVersion: String, val crateVersion: String) { +data class Version( + val fullVersion: String, + val stableCrateVersion: String, + val unstableCrateVersion: String, + val crates: Map, +) { companion object { // Version must be in the "{smithy_rs_version}\n{git_commit_hash}" format fun parse(content: String): Version { - val lines = content.lines() - if (lines.size != 2) { - throw IllegalArgumentException("Invalid version format, it should contain `2` lines but contains `${lines.size}` line(s)") - } - return Version(lines.joinToString("-"), lines.first()) + val node = Node.parse(content).expectObjectNode() + val githash = node.expectStringMember("githash").value + val stableVersion = node.expectStringMember("stableVersion").value + val unstableVersion = node.expectStringMember("unstableVersion").value + return Version( + "$stableVersion-$githash", + stableCrateVersion = stableVersion, + unstableCrateVersion = unstableVersion, + node.expectObjectMember("runtimeCrates").members.map { + it.key.value to it.value.expectStringNode().value + }.toMap(), + ) } // Returns full version in the "{smithy_rs_version}-{git_commit_hash}" format fun fullVersion(): String = fromDefaultResource().fullVersion - fun crateVersion(): String = - fromDefaultResource().crateVersion + fun stableCrateVersion(): String = + fromDefaultResource().stableCrateVersion - private fun fromDefaultResource(): Version = parse( + fun unstableCrateVersion(): String = + fromDefaultResource().unstableCrateVersion + + fun crateVersion(crate: String): String { + val version = fromDefaultResource() + return version.crates[crate] ?: version.unstableCrateVersion + } + fun fromDefaultResource(): Version = parse( Version::class.java.getResource(VERSION_FILENAME)?.readText() ?: throw CodegenException("$VERSION_FILENAME does not exist"), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 3a12fbec76f..ea8cbc9db13 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -40,19 +40,21 @@ data class RuntimeCrateLocation(val path: String?, val versions: CrateVersionMap } } -fun RuntimeCrateLocation.crateLocation(crateName: String?): DependencyLocation { - val version = crateName.let { versions.map[crateName] } ?: versions.map[DEFAULT_KEY] +fun RuntimeCrateLocation.crateLocation(crateName: String): DependencyLocation { + val version = crateName.let { + versions.map[crateName] + } ?: Version.crateVersion(crateName) return when (this.path) { // CratesIo needs an exact version. However, for local runtime crates we do not // provide a detected version unless the user explicitly sets one via the `versions` map. - null -> CratesIo(version ?: defaultRuntimeCrateVersion()) - else -> Local(this.path, version) + null -> CratesIo(version) + else -> Local(this.path) } } fun defaultRuntimeCrateVersion(): String { try { - return Version.crateVersion() + return Version.stableCrateVersion() } catch (ex: Exception) { throw CodegenException("failed to get crate version which sets the default client-runtime version", ex) } @@ -94,10 +96,6 @@ data class RuntimeConfig( } } - val crateSrcPrefix: String = cratePrefix.replace("-", "_") - - fun runtimeCratesPath(): String? = runtimeCrateLocation.path - fun smithyRuntimeCrate( runtimeCrateName: String, optional: Boolean = false, @@ -324,7 +322,9 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun smithyQuery(runtimeConfig: RuntimeConfig) = CargoDependency.smithyQuery(runtimeConfig).toType() fun smithyRuntime(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntime(runtimeConfig).toType() fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeApi(runtimeConfig).toType() - fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType() + fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = + CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType() + fun smithyTypes(runtimeConfig: RuntimeConfig) = CargoDependency.smithyTypes(runtimeConfig).toType() fun smithyXml(runtimeConfig: RuntimeConfig) = CargoDependency.smithyXml(runtimeConfig).toType() private fun smithyProtocolTest(runtimeConfig: RuntimeConfig) = diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt index 9c4cde5f5c6..2147dc857ce 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt @@ -21,7 +21,7 @@ class VersionTest { ) { val version = Version.parse(content) version.fullVersion shouldBe fullVersion - version.crateVersion shouldBe crateVersion + version.stableCrateVersion shouldBe crateVersion } @ParameterizedTest() @@ -36,30 +36,15 @@ class VersionTest { @JvmStatic fun versionProvider() = listOf( Arguments.of( - "0.47.0\n0198d26096eb1af510ce24766c921ffc5e4c191e", - "0.47.0-0198d26096eb1af510ce24766c921ffc5e4c191e", - "0.47.0", + """{ "stableVersion": "1.0.1", "unstableVersion": "0.60.1","githash": "0198d26096eb1af510ce24766c921ffc5e4c191e", "runtimeCrates": {} }""", + "1.0.1-0198d26096eb1af510ce24766c921ffc5e4c191e", + "1.0.1", ), Arguments.of( - "release-2022-08-04\ndb48039065bec890ef387385773b37154b555b14", + """{ "unstableVersion": "0.60.1", "stableVersion": "release-2022-08-04", "githash": "db48039065bec890ef387385773b37154b555b14", "runtimeCrates": {} }""", "release-2022-08-04-db48039065bec890ef387385773b37154b555b14", "release-2022-08-04", ), - Arguments.of( - "0.30.0-alpha\na1dbbe2947de3c8bbbef9446eb442e298f83f200", - "0.30.0-alpha-a1dbbe2947de3c8bbbef9446eb442e298f83f200", - "0.30.0-alpha", - ), - Arguments.of( - "0.6-rc1.cargo\nc281800a185b34600b05f8b501a0322074184123", - "0.6-rc1.cargo-c281800a185b34600b05f8b501a0322074184123", - "0.6-rc1.cargo", - ), - Arguments.of( - "0.27.0-alpha.1\n643f2ee", - "0.27.0-alpha.1-643f2ee", - "0.27.0-alpha.1", - ), ) @JvmStatic diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt index 1ae310088d9..b3dec08b7c4 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt @@ -11,8 +11,8 @@ import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource import software.amazon.smithy.model.node.Node +import software.amazon.smithy.rust.codegen.core.Version import software.amazon.smithy.rust.codegen.core.rustlang.CratesIo -import software.amazon.smithy.rust.codegen.core.rustlang.DependencyLocation import software.amazon.smithy.rust.codegen.core.rustlang.Local import java.util.Optional @@ -35,22 +35,20 @@ class RuntimeTypesTest { cfg.runtimeCrateLocation shouldBe RuntimeCrateLocation(null, CrateVersionMap(mapOf())) } - @ParameterizedTest - @MethodSource("runtimeCrateLocationProvider") - fun `runtimeCrateLocation provides dependency location`( - path: String?, - versions: CrateVersionMap, - crateName: String?, - expectedDependencyLocation: DependencyLocation, - ) { - val crateLoc = RuntimeCrateLocation(path, versions) - val depLoc = crateLoc.crateLocation(crateName) - depLoc shouldBe expectedDependencyLocation + @Test + fun `runtimeCrateLocation provides dependency location`() { + val crateLoc = RuntimeCrateLocation("/foo", CrateVersionMap(mapOf("aws-smithy-runtime-api" to "999.999"))) + crateLoc.crateLocation("aws-smithy-runtime") shouldBe Local("/foo", null) + crateLoc.crateLocation("aws-smithy-runtime-api") shouldBe Local("/foo", null) + crateLoc.crateLocation("aws-smithy-http") shouldBe Local("/foo", null) + + val crateLocVersioned = RuntimeCrateLocation(null, CrateVersionMap(mapOf("aws-smithy-runtime-api" to "999.999"))) + crateLocVersioned.crateLocation("aws-smithy-runtime") shouldBe CratesIo(Version.stableCrateVersion()) + crateLocVersioned.crateLocation("aws-smithy-runtime-api") shouldBe CratesIo("999.999") + crateLocVersioned.crateLocation("aws-smithy-http") shouldBe CratesIo(Version.unstableCrateVersion()) } companion object { - @JvmStatic - private val defaultVersion = defaultRuntimeCrateVersion() @JvmStatic fun runtimeConfigProvider() = listOf( @@ -90,97 +88,5 @@ class RuntimeTypesTest { RuntimeCrateLocation("/path", CrateVersionMap(mapOf("a" to "1.0", "b" to "2.0"))), ), ) - - @JvmStatic - fun runtimeCrateLocationProvider() = listOf( - // If user specifies `relativePath` in `runtimeConfig`, then that always takes precedence over versions. - Arguments.of( - "/path", - mapOf(), - null, - Local("/path"), - ), - Arguments.of( - "/path", - mapOf("a" to "1.0", "b" to "2.0"), - null, - Local("/path"), - ), - Arguments.of( - "/path", - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - null, - Local("/path", "0.1"), - ), - - // User does not specify the versions object. - // The version number of the code-generator should be used as the version for all runtime crates. - Arguments.of( - null, - mapOf(), - null, - CratesIo(defaultVersion), - ), - Arguments.of( - null, - mapOf(), - "a", - CratesIo(defaultVersion), - ), - - // User specifies versions object, setting explicit version numbers for some runtime crates. - // Then the rest of the runtime crates use the code-generator's version as their version. - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - null, - CratesIo(defaultVersion), - ), - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - "a", - CratesIo("1.0"), - ), - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - "b", - CratesIo("2.0"), - ), - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - "c", - CratesIo(defaultVersion), - ), - - // User specifies versions object, setting DEFAULT and setting version numbers for some runtime crates. - // Then the specified version in DEFAULT is used for all runtime crates, except for those where the user specified a value for in the map. - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - null, - CratesIo("0.1"), - ), - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - "a", - CratesIo("1.0"), - ), - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - "b", - CratesIo("2.0"), - ), - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - "c", - CratesIo("0.1"), - ), - ) } } diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt index 577999a7242..cbec0b8551c 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt @@ -237,7 +237,7 @@ class PythonServerModuleGenerator( // Render the codegeneration version as module attribute. private fun RustWriter.renderCodegenVersion() { - rust("""m.add("CODEGEN_VERSION", "${Version.crateVersion()}")?;""") + rust("""m.add("CODEGEN_VERSION", "${Version.stableCrateVersion()}")?;""") } // Convert to symbol and check the namespace to figure out where they should be imported from. From 6420816bf5272ef626dac96dae6e6603c04f25bb Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 29 Nov 2023 10:57:47 -0800 Subject: [PATCH 315/331] Fix the previous release benchmark (#3270) The benchmark was broken by the behavior major versions change. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .../previous-release-comparison/Cargo.lock | 707 ++++++++++-------- .../previous-release-comparison/Cargo.toml | 4 +- .../benches/previous_release_comparison.rs | 2 + 3 files changed, 398 insertions(+), 315 deletions(-) diff --git a/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock b/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock index 1519750b80f..d606888f0d6 100644 --- a/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock +++ b/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock @@ -57,21 +57,21 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.57.1" +version = "1.0.1" dependencies = [ - "aws-credential-types 0.57.1", - "aws-http 0.57.1", - "aws-runtime 0.57.1", + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", "aws-sdk-sso", "aws-sdk-ssooidc", "aws-sdk-sts", - "aws-smithy-async 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-json 0.57.1", - "aws-smithy-runtime 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-types 0.57.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", "bytes", "fastrand", "hex", @@ -86,34 +86,33 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "0.57.1" +version = "1.0.1" dependencies = [ - "aws-smithy-async 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", + "aws-smithy-async 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", "zeroize", ] [[package]] name = "aws-credential-types" -version = "0.57.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80009846d61a0a4f9070d789cf0e64db284cba6984fae3871050d044e6569cd2" +checksum = "8c1317e1a3514b103cf7d5828bbab3b4d30f56bd22d684f8568bc51b6cfbbb1c" dependencies = [ - "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", "zeroize", ] [[package]] name = "aws-http" -version = "0.57.1" +version = "0.60.0" dependencies = [ - "aws-smithy-http 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-types 0.57.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", "bytes", "http", "http-body", @@ -123,14 +122,13 @@ dependencies = [ [[package]] name = "aws-http" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e65730b741a5f6422fd338bf6f76b7956b090affeaa045e78fca8c4186e0fd5" +checksum = "361c4310fdce94328cc2d1ca0c8a48c13f43009c61d3367585685a50ca8c66b6" dependencies = [ - "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "aws-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes", "http", "http-body", @@ -140,17 +138,17 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "0.57.1" -dependencies = [ - "aws-credential-types 0.57.1", - "aws-http 0.57.1", - "aws-sigv4 0.57.1", - "aws-smithy-async 0.57.1", - "aws-smithy-eventstream 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-types 0.57.1", +version = "1.0.1" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-sigv4 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-http 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", "fastrand", "http", "percent-encoding", @@ -160,19 +158,19 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2414b96071ae840b97c0cc1d44b248d5607d648593cdf474f3fb5465572898" -dependencies = [ - "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-sigv4 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed7ef604a15fd0d4d9e43701295161ea6b504b63c44990ead352afea2bc15e9" +dependencies = [ + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sigv4 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "aws-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "fastrand", "http", "percent-encoding", @@ -184,50 +182,50 @@ dependencies = [ name = "aws-sdk-s3" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.57.1", - "aws-http 0.57.1", - "aws-runtime 0.57.1", - "aws-sigv4 0.57.1", - "aws-smithy-async 0.57.1", - "aws-smithy-checksums 0.57.1", - "aws-smithy-eventstream 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-json 0.57.1", - "aws-smithy-runtime 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-smithy-xml 0.57.1", - "aws-types 0.57.1", + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-sigv4 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-checksums 0.60.0", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-smithy-xml 0.60.0", + "aws-types 1.0.1", "bytes", "http", "http-body", "once_cell", "percent-encoding", - "regex", + "regex-lite", "tracing", "url", ] [[package]] name = "aws-sdk-s3" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84022763485483ea17d417f9832d5da198bc36829b59f086c0d35ecd2ce59991" -dependencies = [ - "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-runtime 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-sigv4 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-checksums 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-json 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-xml 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dcafc2fe52cc30b2d56685e2fa6a879ba50d79704594852112337a472ddbd24" +dependencies = [ + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-runtime 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sigv4 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-checksums 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-json 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime 1.0.2", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "aws-smithy-xml 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes", "http", "http-body", @@ -242,19 +240,20 @@ dependencies = [ name = "aws-sdk-sso" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.57.1", - "aws-http 0.57.1", - "aws-runtime 0.57.1", - "aws-smithy-async 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-json 0.57.1", - "aws-smithy-runtime 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-types 0.57.1", + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", "bytes", "http", - "regex", + "once_cell", + "regex-lite", "tracing", ] @@ -262,19 +261,20 @@ dependencies = [ name = "aws-sdk-ssooidc" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.57.1", - "aws-http 0.57.1", - "aws-runtime 0.57.1", - "aws-smithy-async 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-json 0.57.1", - "aws-smithy-runtime 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-types 0.57.1", + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", "bytes", "http", - "regex", + "once_cell", + "regex-lite", "tracing", ] @@ -282,44 +282,45 @@ dependencies = [ name = "aws-sdk-sts" version = "0.0.0-local" dependencies = [ - "aws-credential-types 0.57.1", - "aws-http 0.57.1", - "aws-runtime 0.57.1", - "aws-smithy-async 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-json 0.57.1", + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", "aws-smithy-query", - "aws-smithy-runtime 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", - "aws-smithy-xml 0.57.1", - "aws-types 0.57.1", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-smithy-xml 0.60.0", + "aws-types 1.0.1", "http", - "regex", + "once_cell", + "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "0.57.1" +version = "1.0.1" dependencies = [ - "aws-credential-types 0.57.1", - "aws-smithy-eventstream 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", + "aws-credential-types 1.0.1", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-http 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", "bytes", + "crypto-bigint 0.5.5", "form_urlencoded", "hex", "hmac", "http", - "num-bigint", "once_cell", "p256", "percent-encoding", - "regex", "ring", "sha2", + "subtle", "time", "tracing", "zeroize", @@ -327,26 +328,28 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.57.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3347c738e0a8449020877d319cda56da74d6e8aba9fff210720fac66cae3c7f4" +checksum = "380adcc8134ad8bbdfeb2ace7626a869914ee266322965276cbc54066186d236" dependencies = [ - "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", "bytes", + "crypto-bigint 0.5.5", "form_urlencoded", "hex", "hmac", "http", - "num-bigint", "once_cell", "p256", "percent-encoding", "regex", "ring", "sha2", + "subtle", "time", "tracing", "zeroize", @@ -354,7 +357,7 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.57.1" +version = "1.0.1" dependencies = [ "futures-util", "pin-project-lite", @@ -363,9 +366,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.57.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b65a284265d3eec6cc9f1daef2d0cc3b78684b712cb6c7f1d0f665456b7604" +checksum = "3e37ca17d25fe1e210b6d4bdf59b81caebfe99f986201a1228cb5061233b4b13" dependencies = [ "futures-util", "pin-project-lite", @@ -374,10 +377,10 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.57.1" +version = "0.60.0" dependencies = [ - "aws-smithy-http 0.57.1", - "aws-smithy-types 0.57.1", + "aws-smithy-http 0.60.0", + "aws-smithy-types 1.0.1", "bytes", "crc32c", "crc32fast", @@ -393,12 +396,12 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40f1d5a222ba11ac7d6b20f3668ae282970e50615fa5ee1dd8ac8180c0c1803" +checksum = "c5a373ec01aede3dd066ec018c1bc4e8f5dd11b2c11c59c8eef1a5c68101f397" dependencies = [ - "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 1.0.2", "bytes", "crc32c", "crc32fast", @@ -414,31 +417,31 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.57.1" +version = "0.60.0" dependencies = [ - "aws-smithy-types 0.57.1", + "aws-smithy-types 1.0.1", "bytes", "crc32fast", ] [[package]] name = "aws-smithy-eventstream" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16e7ecebc2b083a1b138868a46a343204a6097f343c4830a8b22b3a0d30013e" +checksum = "1c669e1e5fc0d79561bf7a122b118bd50c898758354fe2c53eb8f2d31507cbc3" dependencies = [ - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 1.0.2", "bytes", "crc32fast", ] [[package]] name = "aws-smithy-http" -version = "0.57.1" +version = "0.60.0" dependencies = [ - "aws-smithy-eventstream 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", "bytes", "bytes-utils", "futures-core", @@ -453,13 +456,13 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715aeb61fb743848d5d398ce6fb1259f5eba5e13dceec5d5064cada1a181d38d" +checksum = "5b1de8aee22f67de467b2e3d0dd0fb30859dc53f579a63bd5381766b987db644" dependencies = [ - "aws-smithy-eventstream 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", "bytes", "bytes-utils", "futures-core", @@ -474,29 +477,29 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.57.1" +version = "0.60.0" dependencies = [ - "aws-smithy-types 0.57.1", + "aws-smithy-types 1.0.1", ] [[package]] name = "aws-smithy-json" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de21d368dcd5cab17033406ea6e7351b091164b208381de837510bd7558c0f30" +checksum = "6a46dd338dc9576d6a6a5b5a19bd678dcad018ececee11cf28ecd7588bd1a55c" dependencies = [ - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 1.0.2", ] [[package]] name = "aws-smithy-protocol-test" -version = "0.57.1" +version = "0.60.0" dependencies = [ "assert-json-diff", - "aws-smithy-runtime-api 0.57.1", + "aws-smithy-runtime-api 1.0.1", "http", "pretty_assertions", - "regex", + "regex-lite", "roxmltree", "serde_json", "thiserror", @@ -504,12 +507,12 @@ dependencies = [ [[package]] name = "aws-smithy-protocol-test" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ed394939694a0ade77eaff154393e1f7f97e0e73533381e1003384e3173b50" +checksum = "c3ad76ca454230a5540a47e44ba903a910ae09f2c39a86cd249f2f8c87da83eb" dependencies = [ "assert-json-diff", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", "http", "pretty_assertions", "regex", @@ -520,21 +523,21 @@ dependencies = [ [[package]] name = "aws-smithy-query" -version = "0.57.1" +version = "0.60.0" dependencies = [ - "aws-smithy-types 0.57.1", + "aws-smithy-types 1.0.1", "urlencoding", ] [[package]] name = "aws-smithy-runtime" -version = "0.57.1" +version = "1.0.1" dependencies = [ - "aws-smithy-async 0.57.1", - "aws-smithy-http 0.57.1", - "aws-smithy-protocol-test 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-protocol-test 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", "bytes", "fastrand", "http", @@ -554,17 +557,18 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "0.57.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4395310662d10f1847324af5fe43e621922cba03b1aa6d26c21096e18a4e79" +checksum = "273479291efc55e7b0bce985b139d86b6031adb8e50f65c1f712f20ba38f6388" dependencies = [ - "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-http 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-protocol-test 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-protocol-test 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", "bytes", "fastrand", + "h2", "http", "http-body", "hyper", @@ -582,10 +586,10 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "0.57.1" +version = "1.0.1" dependencies = [ - "aws-smithy-async 0.57.1", - "aws-smithy-types 0.57.1", + "aws-smithy-async 1.0.1", + "aws-smithy-types 1.0.1", "bytes", "http", "pin-project-lite", @@ -596,12 +600,12 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "0.57.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27594c06f5b36e97d18ef26ed693f1d4c7167b9bbb544b3a9bb653f9f7035" +checksum = "c6cebff0d977b6b6feed2fd07db52aac58ba3ccaf26cdd49f1af4add5061bef9" dependencies = [ - "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-types 1.0.2", "bytes", "http", "pin-project-lite", @@ -611,7 +615,7 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "0.57.1" +version = "1.0.1" dependencies = [ "base64-simd", "bytes", @@ -632,9 +636,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "0.57.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d36f1723ed61e82094498e7283510fe21484b73c215c33874c81a84411b5bdc" +checksum = "d7f48b3f27ddb40ab19892a5abda331f403e3cb877965e4e51171447807104af" dependencies = [ "base64-simd", "bytes", @@ -655,28 +659,28 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.57.1" +version = "0.60.0" dependencies = [ "xmlparser", ] [[package]] name = "aws-smithy-xml" -version = "0.57.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68225c8d3e3e6c565a3cf764aa82440837ef15c33d1dd7205e15715444e4b4ad" +checksum = "0ec40d74a67fd395bc3f6b4ccbdf1543672622d905ef3f979689aea5b730cb95" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.57.1" +version = "1.0.1" dependencies = [ - "aws-credential-types 0.57.1", - "aws-smithy-async 0.57.1", - "aws-smithy-runtime-api 0.57.1", - "aws-smithy-types 0.57.1", + "aws-credential-types 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", "http", "rustc_version", "tracing", @@ -684,14 +688,14 @@ dependencies = [ [[package]] name = "aws-types" -version = "0.57.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc27aac60f715bab25f5d758ba5651b80aae791c48e9871ffe298683f00a2b" +checksum = "8403fc56b1f3761e8efe45771ddc1165e47ec3417c68e68a4519b5cb030159ca" dependencies = [ - "aws-credential-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-async 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-runtime-api 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", - "aws-smithy-types 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", "http", "rustc_version", "tracing", @@ -775,9 +779,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytes-utils" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" dependencies = [ "bytes", "either", @@ -833,18 +837,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.7" +version = "4.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" dependencies = [ "anstyle", "clap_lex", @@ -988,6 +992,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "rand_core", + "subtle", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -1059,7 +1073,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ "base16ct", - "crypto-bigint", + "crypto-bigint 0.4.9", "der", "digest", "ff", @@ -1072,14 +1086,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1118,9 +1138,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1209,9 +1229,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "group" @@ -1226,9 +1246,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1251,9 +1271,9 @@ checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hermit-abi" @@ -1278,9 +1298,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1352,9 +1372,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1362,11 +1382,11 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "autocfg", + "equivalent", "hashbrown", ] @@ -1378,7 +1398,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1398,9 +1418,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1471,7 +1491,7 @@ checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1484,17 +1504,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.45" @@ -1576,9 +1585,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" @@ -1651,11 +1660,11 @@ name = "previous-release-comparison" version = "0.1.0" dependencies = [ "aws-config", - "aws-credential-types 0.57.1", + "aws-credential-types 1.0.1", "aws-sdk-s3 0.0.0-local", - "aws-sdk-s3 0.35.0", - "aws-smithy-runtime 0.57.1", - "aws-smithy-runtime 0.57.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sdk-s3 1.4.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime 1.0.2", "criterion", "http", "tokio", @@ -1687,9 +1696,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -1755,6 +1764,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -1767,23 +1782,23 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ - "crypto-bigint", + "crypto-bigint 0.4.9", "hmac", "zeroize", ] [[package]] name = "ring" -version = "0.17.5" +version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" dependencies = [ "cc", "getrandom", "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1812,22 +1827,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", "ring", @@ -1849,9 +1864,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ "base64", ] @@ -1887,7 +1902,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1951,18 +1966,18 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -2041,9 +2056,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" @@ -2062,7 +2077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2194,9 +2209,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2207,14 +2222,14 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", @@ -2285,9 +2300,9 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", @@ -2306,9 +2321,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "nu-ansi-term", "serde", @@ -2362,9 +2377,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -2379,9 +2394,9 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uuid" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" [[package]] name = "valuable" @@ -2428,9 +2443,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2438,9 +2453,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", @@ -2453,9 +2468,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2463,9 +2478,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", @@ -2476,15 +2491,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -2527,7 +2542,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -2536,13 +2560,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -2551,42 +2590,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "xmlparser" version = "0.13.6" @@ -2601,6 +2682,6 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml b/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml index 2f591e2eaad..b8edbb891f2 100644 --- a/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml +++ b/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml @@ -12,8 +12,8 @@ aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } criterion = { version = "0.5", features = ["async_tokio"] } http = "0.2.3" -previous-s3 = { version = "0.35", package = "aws-sdk-s3", features = ["test-util"] } -previous-runtime = { version = "0.57.1", package = "aws-smithy-runtime", features = ["test-util"] } +previous-s3 = { version = "1", package = "aws-sdk-s3", features = ["test-util"] } +previous-runtime = { version = "1", package = "aws-smithy-runtime", features = ["test-util"] } tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } [profile.release] diff --git a/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs b/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs index 29b7acd2fde..d0e6c338507 100644 --- a/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs +++ b/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs @@ -66,6 +66,7 @@ fn bench(c: &mut Criterion) { let main_client = { let http_client = test_client!(main); let config = aws_sdk_s3::Config::builder() + .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest()) .credentials_provider(aws_sdk_s3::config::Credentials::for_tests()) .region(aws_sdk_s3::config::Region::new("us-east-1")) .http_client(http_client) @@ -75,6 +76,7 @@ fn bench(c: &mut Criterion) { let previous_client = { let http_client = test_client!(previous); let config = previous_s3::Config::builder() + .behavior_version(previous_s3::config::BehaviorVersion::latest()) .credentials_provider(previous_s3::config::Credentials::for_tests()) .region(previous_s3::config::Region::new("us-east-1")) .http_client(http_client) From 76ae89ae0bf8fd54629e31b1fbd8bba2510bdead Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 29 Nov 2023 18:08:50 -0600 Subject: [PATCH 316/331] Fix running semver-checks on `aws-config` (#3272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context Fixes https://github.com/smithy-lang/smithy-rs/issues/3265 ## Description To check semver, `semver checks` needs to compile two versions of a crate, i.e. baseline and current. Our CI failed to compile `aws-config` for a baseline version. The following diagram shows what was missing to cause compilation failure: ``` ┌───────────┐ │ smithy-rs │ └─────┬─────┘ │ │ │ ┌────────┐ └─────┤ target │ └───┬────┘ │ ┌───────────────┐ └────────┤ semver_checks │ └───────┬───────┘ │ │ │ ┌──────────┐ └───────┤ git-base │ └────┬─────┘ │ │ ┌──────────────┐ ├────────┤ │ │ └──────┬───────┘ │ │ │ │ │ │ ┌───────┐ │ ├───────┤ aws │ │ │ └───┬───┘ │ │ │ │ │ │ ┌──────────────┐ │ │ ├───────┤ rust-runtime │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ │ ┌────────────┐ │ │ │ └───────┤ aws-config │ ◄*************** │ │ │ └────────────┘ * │ │ │ * * │ │ │ * * │ │ │ *****depends*on**** * │ │ │ ▼ * │ │ │ * │ │ │ ┌─────┐ * │ │ └───────┤ sdk │ (with no "build" directory) * │ │ └─────┘ * │ │ * │ │ * │ │ ┌────────────────────┐ depends on │ └──────┤ tmp-codegen-diff │ * │ └─────────┬──────────┘ * │ │ * │ │ ┌─────────┐ * │ └───────┤ aws-sdk │ * │ └────┬────┘ * │ │ ┌─────┐ * │ └─────┤ sdk │ * │ └─────┘ * │ * │ * │ ┌───────────────────────────────────────┐ * └───────────┤ local-aws_config-0_0_0_smithy_rs_head │***************************** └───────────────────────────────────────┘ ``` `local-aws_config-0_0_0_smithy_rs_head` under the `git-base` directory is a special crate created by `semver-checks` for a baseline version of `aws-config` and its `Cargo.toml` depends on `target/semver_checks/git-base//aws/rust-runtime/aws-config`. However, that `aws-config` in turn depends upon crates in `target/semver_checks/git-base//aws/sdk/build/` (as shown [here](https://github.com/smithy-lang/smithy-rs/blob/main/aws/rust-runtime/aws-config/Cargo.toml#L23-L33)), which does not exist in a baseline branch. When `semver-checks.py` [creates a baseline branch](https://github.com/smithy-lang/smithy-rs/blob/3d0cb5c3b179d5ed1d14531882657b481c4469f0/tools/ci-scripts/codegen-diff/semver-checks.py#L31) to prepare for running `cargo semver-checks`, it [moves aws/sdk/build to tmp-codegen-diff](https://github.com/smithy-lang/smithy-rs/blob/3d0cb5c3b179d5ed1d14531882657b481c4469f0/tools/ci-scripts/codegen-diff/diff_lib.py#L59), leaving nothing behind in `aws/sdk/build/`. The fix, therefore, is to `cp -r aws/sdk/build/aws-sdk` instead of `mv aws/sdk/build/aws-sdk` when preparing a baseline branch. The issue is specific to `aws-config`, probably because that's the only runtime crate that depends on those in `aws/sdk/build`. ## Testing Verified a clean run for `cargo semver-checks` in [an investigation branch](https://github.com/smithy-lang/smithy-rs/actions/runs/7035082815/job/19144676499#step:4:1101). ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-scripts/codegen-diff/diff_lib.py | 15 +++++++++++---- tools/ci-scripts/codegen-diff/semver-checks.py | 4 +--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tools/ci-scripts/codegen-diff/diff_lib.py b/tools/ci-scripts/codegen-diff/diff_lib.py index d39bbaba179..6d632c15a35 100644 --- a/tools/ci-scripts/codegen-diff/diff_lib.py +++ b/tools/ci-scripts/codegen-diff/diff_lib.py @@ -26,7 +26,7 @@ def running_in_docker_build(): return os.environ.get("SMITHY_RS_DOCKER_BUILD_IMAGE") == "1" -def checkout_commit_and_generate(revision_sha, branch_name, targets=None): +def checkout_commit_and_generate(revision_sha, branch_name, targets=None, preserve_aws_sdk_build=False): if running_in_docker_build(): eprint(f"Fetching base revision {revision_sha} from GitHub...") run(f"git fetch --no-tags --progress --no-recurse-submodules --depth=1 origin {revision_sha}") @@ -34,10 +34,10 @@ def checkout_commit_and_generate(revision_sha, branch_name, targets=None): # Generate code for HEAD eprint(f"Creating temporary branch {branch_name} with generated code for {revision_sha}") run(f"git checkout {revision_sha} -B {branch_name}") - generate_and_commit_generated_code(revision_sha, targets) + generate_and_commit_generated_code(revision_sha, targets, preserve_aws_sdk_build) -def generate_and_commit_generated_code(revision_sha, targets=None): +def generate_and_commit_generated_code(revision_sha, targets=None, preserve_aws_sdk_build=False): targets = targets or [ target_codegen_client, target_codegen_server, @@ -56,7 +56,11 @@ def generate_and_commit_generated_code(revision_sha, targets=None): get_cmd_output(f"rm -rf {OUTPUT_PATH}") get_cmd_output(f"mkdir {OUTPUT_PATH}") if target_aws_sdk in targets: - get_cmd_output(f"mv aws/sdk/build/aws-sdk {OUTPUT_PATH}/") + # Compiling aws-config for semver checks baseline requires build artifacts to exist under aws/sdk/build + if preserve_aws_sdk_build: + get_cmd_output(f"cp -r aws/sdk/build/aws-sdk {OUTPUT_PATH}/") + else: + get_cmd_output(f"mv aws/sdk/build/aws-sdk {OUTPUT_PATH}/") for target in [target_codegen_client, target_codegen_server]: if target in targets: get_cmd_output(f"mv {target}/build/smithyprojections/{target} {OUTPUT_PATH}/") @@ -89,6 +93,9 @@ def generate_and_commit_generated_code(revision_sha, targets=None): f"xargs rm -f", shell=True) get_cmd_output(f"git add -f {OUTPUT_PATH}") + if preserve_aws_sdk_build: + get_cmd_output(f"git add -f aws/sdk/build") + get_cmd_output(f"git -c 'user.name=GitHub Action (generated code preview)' " f"-c 'user.name={COMMIT_AUTHOR_NAME}' " f"-c 'user.email={COMMIT_AUTHOR_EMAIL}' " diff --git a/tools/ci-scripts/codegen-diff/semver-checks.py b/tools/ci-scripts/codegen-diff/semver-checks.py index 25d36ffb34d..1632242fc0f 100755 --- a/tools/ci-scripts/codegen-diff/semver-checks.py +++ b/tools/ci-scripts/codegen-diff/semver-checks.py @@ -28,7 +28,7 @@ def main(skip_generation=False): if not skip_generation: checkout_commit_and_generate(head_commit_sha, CURRENT_BRANCH, targets=['aws:sdk']) - checkout_commit_and_generate(base_commit_sha, BASE_BRANCH, targets=['aws:sdk']) + checkout_commit_and_generate(base_commit_sha, BASE_BRANCH, targets=['aws:sdk'], preserve_aws_sdk_build=True) get_cmd_output(f'git checkout {CURRENT_BRANCH}') sdk_directory = os.path.join(OUTPUT_PATH, 'aws-sdk', 'sdk') os.chdir(sdk_directory) @@ -36,8 +36,6 @@ def main(skip_generation=False): failures = [] deny_list = [ # add crate names here to exclude them from the semver checks - # TODO(https://github.com/smithy-lang/smithy-rs/issues/3265) - 'aws-config' ] for path in list(os.listdir())[:10]: eprint(f'checking {path}...', end='') From 5b93fd2f4a043e53d4f1de0d05ddede8b7aa7ff3 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 30 Nov 2023 11:28:07 -0800 Subject: [PATCH 317/331] Improve client init time by switching to regex-lite (#3269) Each client initialization was taking between 1 and 2 milliseconds, regardless if the client had been constructed before or not. For example, if a customer wants five clients with different credentials providers, that could be 10 milliseconds of time spent in `Client::from_conf`. Approximately 98% of this time was spent compiling regular expressions for the endpoint partition resolver. This change switches everything over to the regex-lite crate, which has faster regex compile times, and shouldn't have much of an impact on performance for our specific use-cases (small strings, only evaluated at client initialization). The use of regex was entirely removed in aws-sigv4 since it was overkill for what it was being used for. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 ++- aws/rust-runtime/aws-sigv4/Cargo.toml | 1 - .../src/http_request/canonical_request.rs | 75 ++++++++++--------- .../aws-sigv4/src/http_request/error.rs | 10 --- .../codegen/client/smithy/endpoint/Util.kt | 37 ++++++--- .../generators/EndpointResolverGenerator.kt | 5 +- .../client/smithy/endpoint/rulesgen/StdLib.kt | 56 ++++++-------- .../codegen/core/rustlang/CargoDependency.kt | 1 + .../rust/codegen/core/smithy/RuntimeType.kt | 1 + .../aws-smithy-protocol-test/Cargo.toml | 2 +- .../src/urlencoded.rs | 2 +- rust-runtime/inlineable/Cargo.toml | 2 +- .../inlineable/src/endpoint_lib/partition.rs | 14 ++-- .../inlineable/src/endpoint_lib/s3.rs | 2 +- rust-runtime/inlineable/src/lib.rs | 2 +- 15 files changed, 116 insertions(+), 106 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..27abec50c75 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,14 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = """Client creation now takes microseconds instead of milliseconds. +Previously, it would take 2-3 milliseconds for each client instantiation due to time spent compiling regexes. +For applications that used several clients, this would increase start-up time in cases where it really matters, +such as for AWS Lambda cold starts. This time was improved by both changing regex implementation and caching the +result of the compilation.""" +references = ["aws-sdk-rust#975", "smithy-rs#3269"] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "jdisanti" diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index 1746c03b1eb..6fe06159cab 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -30,7 +30,6 @@ num-bigint = { version = "0.4", optional = true } once_cell = "1.8" p256 = { version = "0.11", features = ["ecdsa"], optional = true } percent-encoding = { version = "2.1", optional = true } -regex = "1.5" ring = { version = "0.17.5", optional = true } sha2 = "0.10" crypto-bigint = { version = "0.5.4", optional = true } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index 10d23338f89..32b6cfe4f3d 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -425,39 +425,37 @@ impl<'a> fmt::Display for CanonicalRequest<'a> { } } -/// A regex for matching on 2 or more spaces that acts on bytes. -static MULTIPLE_SPACES: once_cell::sync::Lazy = - once_cell::sync::Lazy::new(|| regex::bytes::Regex::new(r" {2,}").unwrap()); - /// Removes excess spaces before and after a given byte string, and converts multiple sequential /// spaces to a single space e.g. " Some example text " -> "Some example text". /// /// This function ONLY affects spaces and not other kinds of whitespace. -fn trim_all(text: &[u8]) -> Cow<'_, [u8]> { - // The normal trim function will trim non-breaking spaces and other various whitespace chars. - // S3 ONLY trims spaces so we use trim_matches to trim spaces only - let text = trim_spaces_from_byte_string(text); - MULTIPLE_SPACES.replace_all(text, " ".as_bytes()) -} - -/// Removes excess spaces before and after a given byte string by returning a subset of those bytes. -/// Will return an empty slice if a string is composed entirely of whitespace. -fn trim_spaces_from_byte_string(bytes: &[u8]) -> &[u8] { - let starting_index = bytes.iter().position(|b| *b != b' ').unwrap_or(0); - let ending_offset = bytes.iter().rev().position(|b| *b != b' ').unwrap_or(0); - let ending_index = bytes.len() - ending_offset; - &bytes[starting_index..ending_index] +fn trim_all(text: &str) -> Cow<'_, str> { + let text = text.trim_matches(' '); + let requires_filter = text + .chars() + .zip(text.chars().skip(1)) + .any(|(a, b)| a == ' ' && b == ' '); + if !requires_filter { + Cow::Borrowed(text) + } else { + // The normal trim function will trim non-breaking spaces and other various whitespace chars. + // S3 ONLY trims spaces so we use trim_matches to trim spaces only + Cow::Owned( + text.chars() + // Filter out consecutive spaces + .zip(text.chars().skip(1).chain(std::iter::once('!'))) + .filter(|(a, b)| *a != ' ' || *b != ' ') + .map(|(a, _)| a) + .collect(), + ) + } } /// Works just like [trim_all] but acts on HeaderValues instead of bytes. /// Will ensure that the underlying bytes are valid UTF-8. fn normalize_header_value(header_value: &str) -> Result { - let trimmed_value = trim_all(header_value.as_bytes()); - HeaderValue::from_str( - std::str::from_utf8(&trimmed_value) - .map_err(CanonicalRequestError::invalid_utf8_in_header_value)?, - ) - .map_err(CanonicalRequestError::from) + let trimmed_value = trim_all(header_value); + HeaderValue::from_str(&trimmed_value).map_err(CanonicalRequestError::from) } #[derive(Debug, PartialEq, Default)] @@ -631,6 +629,7 @@ mod tests { use http::{HeaderValue, Uri}; use pretty_assertions::assert_eq; use proptest::{prelude::*, proptest}; + use std::borrow::Cow; use std::time::Duration; fn signing_params(identity: &Identity, settings: SigningSettings) -> SigningParams<'_> { @@ -982,32 +981,34 @@ mod tests { #[test] fn test_trim_all_handles_spaces_correctly() { - // Can't compare a byte array to a Cow so we convert both to slices before comparing - let expected = &b"Some example text"[..]; - let actual = &trim_all(b" Some example text ")[..]; - - assert_eq!(expected, actual); + assert_eq!(Cow::Borrowed("don't touch me"), trim_all("don't touch me")); + assert_eq!("trim left", trim_all(" trim left")); + assert_eq!("trim right", trim_all("trim right ")); + assert_eq!("trim both", trim_all(" trim both ")); + assert_eq!("", trim_all(" ")); + assert_eq!("", trim_all(" ")); + assert_eq!("a b", trim_all(" a b ")); + assert_eq!("Some example text", trim_all(" Some example text ")); } #[test] fn test_trim_all_ignores_other_forms_of_whitespace() { - // Can't compare a byte array to a Cow so we convert both to slices before comparing - let expected = &b"\t\xA0Some\xA0 example \xA0text\xA0\n"[..]; // \xA0 is a non-breaking space character - let actual = &trim_all(b"\t\xA0Some\xA0 example \xA0text\xA0\n")[..]; - - assert_eq!(expected, actual); + assert_eq!( + "\t\u{A0}Some\u{A0} example \u{A0}text\u{A0}\n", + trim_all("\t\u{A0}Some\u{A0} example \u{A0}text\u{A0}\n") + ); } #[test] fn trim_spaces_works_on_single_characters() { - assert_eq!(trim_all(b"2").as_ref(), b"2"); + assert_eq!(trim_all("2").as_ref(), "2"); } proptest! { #[test] fn test_trim_all_doesnt_elongate_strings(s in ".*") { - assert!(trim_all(s.as_bytes()).len() <= s.len()) + assert!(trim_all(&s).len() <= s.len()) } #[test] @@ -1018,7 +1019,7 @@ mod tests { #[test] fn test_trim_all_does_nothing_when_there_are_no_spaces(s in "[^ ]*") { - assert_eq!(trim_all(s.as_bytes()).as_ref(), s.as_bytes()); + assert_eq!(trim_all(&s).as_ref(), s); } } } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs index 6909b7db50b..39f57dffa5d 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs @@ -7,7 +7,6 @@ use http::header::{InvalidHeaderName, InvalidHeaderValue}; use http::uri::InvalidUri; use std::error::Error; use std::fmt; -use std::str::Utf8Error; #[derive(Debug)] enum SigningErrorKind { @@ -63,7 +62,6 @@ impl From for SigningError { enum CanonicalRequestErrorKind { InvalidHeaderName { source: InvalidHeaderName }, InvalidHeaderValue { source: InvalidHeaderValue }, - InvalidUtf8InHeaderValue { source: Utf8Error }, InvalidUri { source: InvalidUri }, UnsupportedIdentityType, } @@ -79,7 +77,6 @@ impl fmt::Display for CanonicalRequestError { match self.kind { InvalidHeaderName { .. } => write!(f, "invalid header name"), InvalidHeaderValue { .. } => write!(f, "invalid header value"), - InvalidUtf8InHeaderValue { .. } => write!(f, "invalid UTF-8 in header value"), InvalidUri { .. } => write!(f, "the uri was invalid"), UnsupportedIdentityType => { write!(f, "only AWS credentials are supported for signing") @@ -94,7 +91,6 @@ impl Error for CanonicalRequestError { match &self.kind { InvalidHeaderName { source } => Some(source), InvalidHeaderValue { source } => Some(source), - InvalidUtf8InHeaderValue { source } => Some(source), InvalidUri { source } => Some(source), UnsupportedIdentityType => None, } @@ -102,12 +98,6 @@ impl Error for CanonicalRequestError { } impl CanonicalRequestError { - pub(crate) fn invalid_utf8_in_header_value(source: Utf8Error) -> Self { - Self { - kind: CanonicalRequestErrorKind::InvalidUtf8InHeaderValue { source }, - } - } - pub(crate) fn unsupported_identity_type() -> Self { Self { kind: CanonicalRequestErrorKind::UnsupportedIdentityType, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt index 248e3792429..7d88408b738 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt @@ -20,10 +20,12 @@ import software.amazon.smithy.rulesengine.traits.ContextParamTrait import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType +import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.makeOptional @@ -43,16 +45,33 @@ fun Identifier.rustName(): String { } /** - * Endpoints standard library file + * Endpoints standard library */ -internal fun endpointsLib(name: String, vararg additionalDependency: RustDependency) = InlineDependency.forRustFile( - RustModule.pubCrate( - name, - parent = EndpointStdLib, - ), - "/inlineable/src/endpoint_lib/$name.rs", - *additionalDependency, -) +object EndpointsLib { + val DiagnosticCollector = endpointsLib("diagnostic").toType().resolve("DiagnosticCollector") + fun PartitionResolver(runtimeConfig: RuntimeConfig) = + endpointsLib("partition", CargoDependency.smithyJson(runtimeConfig), CargoDependency.RegexLite).toType() + .resolve("PartitionResolver") + + val substring = endpointsLib("substring").toType().resolve("substring") + val isValidHostLabel = endpointsLib("host").toType().resolve("is_valid_host_label") + val parseUrl = endpointsLib("parse_url", CargoDependency.Http, CargoDependency.Url).toType().resolve("parse_url") + val uriEncode = endpointsLib("uri_encode", CargoDependency.PercentEncoding).toType().resolve("uri_encode") + + val awsParseArn = endpointsLib("arn").toType().resolve("parse_arn") + val awsIsVirtualHostableS3Bucket = + endpointsLib("s3", endpointsLib("host"), CargoDependency.OnceCell, CargoDependency.RegexLite).toType() + .resolve("is_virtual_hostable_s3_bucket") + + private fun endpointsLib(name: String, vararg additionalDependency: RustDependency) = InlineDependency.forRustFile( + RustModule.pubCrate( + name, + parent = EndpointStdLib, + ), + "/inlineable/src/endpoint_lib/$name.rs", + *additionalDependency, + ) +} class Types(runtimeConfig: RuntimeConfig) { private val smithyTypesEndpointModule = RuntimeType.smithyTypes(runtimeConfig).resolve("endpoint") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index 8e2aa516226..174bf8f5861 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -19,8 +19,8 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.endpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.ExpressionGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.Ownership @@ -34,7 +34,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.escape import software.amazon.smithy.rust.codegen.core.rustlang.join import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope @@ -138,7 +137,7 @@ internal class EndpointResolverGenerator( "ResolveEndpointError" to types.resolveEndpointError, "EndpointError" to types.resolveEndpointError, "ServiceSpecificEndpointResolver" to codegenContext.serviceSpecificEndpointResolver(), - "DiagnosticCollector" to endpointsLib("diagnostic").toType().resolve("DiagnosticCollector"), + "DiagnosticCollector" to EndpointsLib.DiagnosticCollector, ) private val allowLintsForResolver = listOf( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt index 2c16a51bb72..8bbb3cd9629 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt @@ -6,13 +6,13 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.endpointsLib +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -22,16 +22,10 @@ import software.amazon.smithy.rust.codegen.core.util.dq * Standard library functions available to all generated crates (e.g. not `aws.` specific / prefixed) */ internal val SmithyEndpointsStdLib: List = listOf( - SimpleRuntimeFunction("substring", endpointsLib("substring").toType().resolve("substring")), - SimpleRuntimeFunction("isValidHostLabel", endpointsLib("host").toType().resolve("is_valid_host_label")), - SimpleRuntimeFunction( - "parseURL", - endpointsLib("parse_url", CargoDependency.Http, CargoDependency.Url).toType().resolve("parse_url"), - ), - SimpleRuntimeFunction( - "uriEncode", - endpointsLib("uri_encode", CargoDependency.PercentEncoding).toType().resolve("uri_encode"), - ), + SimpleRuntimeFunction("substring", EndpointsLib.substring), + SimpleRuntimeFunction("isValidHostLabel", EndpointsLib.isValidHostLabel), + SimpleRuntimeFunction("parseURL", EndpointsLib.parseUrl), + SimpleRuntimeFunction("uriEncode", EndpointsLib.uriEncode), ) /** @@ -40,20 +34,9 @@ internal val SmithyEndpointsStdLib: List = listOf( * This is defined in client-codegen to support running tests—it is not used when generating smithy-native services. */ fun awsStandardLib(runtimeConfig: RuntimeConfig, partitionsDotJson: Node) = listOf( - SimpleRuntimeFunction("aws.parseArn", endpointsLib("arn").toType().resolve("parse_arn")), - SimpleRuntimeFunction( - "aws.isVirtualHostableS3Bucket", - endpointsLib( - "s3", - endpointsLib("host"), - CargoDependency.OnceCell, - CargoDependency.Regex, - ).toType().resolve("is_virtual_hostable_s3_bucket"), - ), - AwsPartitionResolver( - runtimeConfig, - partitionsDotJson, - ), + SimpleRuntimeFunction("aws.parseArn", EndpointsLib.awsParseArn), + SimpleRuntimeFunction("aws.isVirtualHostableS3Bucket", EndpointsLib.awsIsVirtualHostableS3Bucket), + AwsPartitionResolver(runtimeConfig, partitionsDotJson), ) /** @@ -65,19 +48,26 @@ class AwsPartitionResolver(runtimeConfig: RuntimeConfig, private val partitionsD CustomRuntimeFunction() { override val id: String = "aws.partition" private val codegenScope = arrayOf( - "PartitionResolver" to endpointsLib( - "partition", - CargoDependency.smithyJson(runtimeConfig), - CargoDependency.Regex, - ).toType() - .resolve("PartitionResolver"), + "PartitionResolver" to EndpointsLib.PartitionResolver(runtimeConfig), + "Lazy" to CargoDependency.OnceCell.toType().resolve("sync::Lazy"), ) override fun structFieldInit() = writable { val json = Node.printJson(partitionsDotJson).dq() rustTemplate( - """partition_resolver: #{PartitionResolver}::new_from_json(b$json).expect("valid JSON")""", + """partition_resolver: #{DEFAULT_PARTITION_RESOLVER}.clone()""", *codegenScope, + "DEFAULT_PARTITION_RESOLVER" to RuntimeType.forInlineFun("DEFAULT_PARTITION_RESOLVER", EndpointStdLib) { + rustTemplate( + """ + // Loading the partition JSON is expensive since it involves many regex compilations, + // so cache the result so that it only need to be paid for the first constructed client. + pub(crate) static DEFAULT_PARTITION_RESOLVER: #{Lazy}<#{PartitionResolver}> = + #{Lazy}::new(|| #{PartitionResolver}::new_from_json(b$json).expect("valid JSON")); + """, + *codegenScope, + ) + }, ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index 76f368fa8fc..88416e45c45 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -246,6 +246,7 @@ data class CargoDependency( val Md5: CargoDependency = CargoDependency("md-5", CratesIo("0.10.0"), rustName = "md5") val PercentEncoding: CargoDependency = CargoDependency("percent-encoding", CratesIo("2.0.0")) val Regex: CargoDependency = CargoDependency("regex", CratesIo("1.5.5")) + val RegexLite: CargoDependency = CargoDependency("regex-lite", CratesIo("0.1.5")) val Ring: CargoDependency = CargoDependency("ring", CratesIo("0.17.5")) val TokioStream: CargoDependency = CargoDependency("tokio-stream", CratesIo("0.1.7")) val Tower: CargoDependency = CargoDependency("tower", CratesIo("0.4")) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 3a12fbec76f..5871ffa315e 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -299,6 +299,7 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) val PercentEncoding = CargoDependency.PercentEncoding.toType() val PrettyAssertions = CargoDependency.PrettyAssertions.toType() val Regex = CargoDependency.Regex.toType() + val RegexLite = CargoDependency.RegexLite.toType() val Tokio = CargoDependency.Tokio.toType() val TokioStream = CargoDependency.TokioStream.toType() val Tower = CargoDependency.Tower.toType() diff --git a/rust-runtime/aws-smithy-protocol-test/Cargo.toml b/rust-runtime/aws-smithy-protocol-test/Cargo.toml index 7d16494e061..ad120f78775 100644 --- a/rust-runtime/aws-smithy-protocol-test/Cargo.toml +++ b/rust-runtime/aws-smithy-protocol-test/Cargo.toml @@ -12,7 +12,7 @@ repository = "https://github.com/smithy-lang/smithy-rs" assert-json-diff = "1.1" http = "0.2.1" pretty_assertions = "1.3" -regex = "1.5" +regex-lite = "0.1.5" roxmltree = "0.14.1" serde_json = "1" thiserror = "1.0.40" diff --git a/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs b/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs index e3c66bef434..d1ab5f5f4e5 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs @@ -4,7 +4,7 @@ */ use crate::{pretty_comparison, ProtocolTestFailure}; -use regex::Regex; +use regex_lite::Regex; fn rewrite_url_encoded_map_keys(input: &str) -> (String, String) { let mut itr = input.split('='); diff --git a/rust-runtime/inlineable/Cargo.toml b/rust-runtime/inlineable/Cargo.toml index c706a2539db..a32e8da5c87 100644 --- a/rust-runtime/inlineable/Cargo.toml +++ b/rust-runtime/inlineable/Cargo.toml @@ -33,7 +33,7 @@ md-5 = "0.10.0" once_cell = "1.16.0" percent-encoding = "2.2.0" pin-project-lite = "0.2" -regex = "1.5.5" +regex-lite = "0.1.5" tower = { version = "0.4.11", default-features = false } url = "2.2.2" diff --git a/rust-runtime/inlineable/src/endpoint_lib/partition.rs b/rust-runtime/inlineable/src/endpoint_lib/partition.rs index 02088d0f93b..1e58fffe80c 100644 --- a/rust-runtime/inlineable/src/endpoint_lib/partition.rs +++ b/rust-runtime/inlineable/src/endpoint_lib/partition.rs @@ -12,12 +12,12 @@ use crate::endpoint_lib::diagnostic::DiagnosticCollector; use crate::endpoint_lib::partition::deser::deserialize_partitions; use aws_smithy_json::deserialize::error::DeserializeError; -use regex::Regex; +use regex_lite::Regex; use std::borrow::Cow; use std::collections::HashMap; /// Determine the AWS partition metadata for a given region -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub(crate) struct PartitionResolver { partitions: Vec, } @@ -151,7 +151,7 @@ impl PartitionResolver { type Str = Cow<'static, str>; -#[derive(Debug)] +#[derive(Clone, Debug)] pub(crate) struct PartitionMetadata { id: Str, region_regex: Regex, @@ -204,7 +204,7 @@ impl PartitionMetadata { } } -#[derive(Debug)] +#[derive(Clone, Debug)] pub(crate) struct PartitionOutput { name: Str, dns_suffix: Str, @@ -213,7 +213,7 @@ pub(crate) struct PartitionOutput { supports_dual_stack: bool, } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub(crate) struct PartitionOutputOverride { name: Option, dns_suffix: Option, @@ -251,7 +251,7 @@ mod deser { expect_bool_or_null, expect_start_object, expect_string_or_null, skip_value, }; use aws_smithy_json::deserialize::{error::DeserializeError, json_token_iter, Token}; - use regex::Regex; + use regex_lite::Regex; use std::borrow::Cow; use std::collections::HashMap; @@ -455,7 +455,7 @@ mod test { use crate::endpoint_lib::partition::{ Partition, PartitionMetadata, PartitionOutput, PartitionOutputOverride, PartitionResolver, }; - use regex::Regex; + use regex_lite::Regex; use std::collections::HashMap; fn resolve<'a>(resolver: &'a PartitionResolver, region: &str) -> Partition<'a> { diff --git a/rust-runtime/inlineable/src/endpoint_lib/s3.rs b/rust-runtime/inlineable/src/endpoint_lib/s3.rs index 0c5d76efa57..3bf692c6b7d 100644 --- a/rust-runtime/inlineable/src/endpoint_lib/s3.rs +++ b/rust-runtime/inlineable/src/endpoint_lib/s3.rs @@ -6,7 +6,7 @@ use crate::endpoint_lib::diagnostic::DiagnosticCollector; use crate::endpoint_lib::host::is_valid_host_label; use once_cell::sync::Lazy; -use regex::Regex; +use regex_lite::Regex; static VIRTUAL_HOSTABLE_SEGMENT: Lazy = Lazy::new(|| Regex::new("^[a-z\\d][a-z\\d\\-.]{1,61}[a-z\\d]$").unwrap()); diff --git a/rust-runtime/inlineable/src/lib.rs b/rust-runtime/inlineable/src/lib.rs index 10f9ed7c2ee..ab322f36ab4 100644 --- a/rust-runtime/inlineable/src/lib.rs +++ b/rust-runtime/inlineable/src/lib.rs @@ -39,7 +39,7 @@ mod test { use crate::idempotency_token; use crate::idempotency_token::{uuid_v4, IdempotencyTokenProvider}; use proptest::prelude::*; - use regex::Regex; + use regex_lite::Regex; #[test] fn test_uuid() { From 9587dbc0611983cab56c1c33b479a59a9065f752 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Thu, 30 Nov 2023 15:03:42 -0800 Subject: [PATCH 318/331] Lazy initialize the default HTTP client (#3262) This change initializes the TLS trust certs at base client validation time rather than upon creation of the default HTTP client runtime plugin so that if the default is overridden, that initialization doesn't need to take place. This is especially helpful on MacOS where that initialization takes approximately 100 milliseconds. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Russell Cohen --- CHANGELOG.next.toml | 12 +++ .../s3/tests/service_timeout_overrides.rs | 12 ++- .../rustdoc/validate_base_client_config.md | 9 ++ .../rustdoc/validate_final_config.md | 7 ++ .../aws-smithy-runtime-api/src/client/http.rs | 43 +++++++- .../src/client/identity.rs | 15 +-- .../src/client/runtime_components.rs | 13 +-- .../src/client/http/hyper_014.rs | 102 +++++++++++------- .../src/client/http/test_util/never.rs | 2 + 9 files changed, 149 insertions(+), 66 deletions(-) create mode 100644 rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md create mode 100644 rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 27abec50c75..fb9213af120 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,6 +11,18 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" +[[aws-sdk-rust]] +message = "Loading native TLS trusted certs for the default HTTP client now only occurs if the default HTTP client is not overridden in config." +references = ["smithy-rs#3262"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "jdisanti" + +[[smithy-rs]] +message = "Loading native TLS trusted certs for the default HTTP client now only occurs if the default HTTP client is not overridden in config." +references = ["smithy-rs#3262"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } +author = "jdisanti" + [[aws-sdk-rust]] message = """Client creation now takes microseconds instead of milliseconds. Previously, it would take 2-3 milliseconds for each client instantiation due to time spent compiling regexes. diff --git a/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs index 9e4808118cb..40a4fb0578c 100644 --- a/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs +++ b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs @@ -6,6 +6,8 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; +use aws_smithy_runtime::client::http::test_util::NeverClient; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; @@ -13,9 +15,10 @@ use aws_types::SdkConfig; use std::time::Duration; use tokio::time::Instant; -/// Use a 5 second operation timeout on SdkConfig and a 0ms connect timeout on the service config +/// Use a 5 second operation timeout on SdkConfig and a 0ms operation timeout on the service config #[tokio::test] async fn timeouts_can_be_set_by_service() { + let (_guard, _) = capture_test_logs(); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::from_static("us-east-1")) @@ -25,6 +28,7 @@ async fn timeouts_can_be_set_by_service() { .operation_timeout(Duration::from_secs(5)) .build(), ) + .http_client(NeverClient::new()) // ip that .endpoint_url( // Emulate a connect timeout error by hitting an unroutable IP @@ -34,7 +38,7 @@ async fn timeouts_can_be_set_by_service() { let config = aws_sdk_s3::config::Builder::from(&sdk_config) .timeout_config( TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(0)) + .operation_timeout(Duration::from_secs(0)) .build(), ) .build(); @@ -48,8 +52,8 @@ async fn timeouts_can_be_set_by_service() { .await .expect_err("unroutable IP should timeout"); match err { - SdkError::DispatchFailure(err) => assert!(err.is_timeout()), - // if the connect timeout is not respected, this times out after 1 second because of the operation timeout with `SdkError::Timeout` + SdkError::TimeoutError(_err) => { /* ok */ } + // if the connect timeout is not respected, this times out after 5 seconds because of the operation timeout with `SdkError::Timeout` _other => panic!("unexpected error: {:?}", _other), } // there should be a 0ms timeout, we gotta set some stuff up. Just want to make sure diff --git a/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md new file mode 100644 index 00000000000..4ac61d51b02 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md @@ -0,0 +1,9 @@ +Validate the base client configuration. + +This gets called upon client construction. The full config may not be available at +this time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather +than [`RuntimeComponents`]). Any error returned here will become a panic +in the client constructor. + +[`RuntimeComponentsBuilder`]: crate::client::runtime_components::RuntimeComponentsBuilder +[`RuntimeComponents`]: crate::client::runtime_components::RuntimeComponents diff --git a/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md new file mode 100644 index 00000000000..768bda5dd59 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md @@ -0,0 +1,7 @@ +Validate the final client configuration. + +This gets called immediately after the [`Intercept::read_before_execution`] trait hook +when the final configuration has been resolved. Any error returned here will +cause the operation to return that error. + +[`Intercept::read_before_execution`]: crate::client::interceptors::Intercept::read_before_execution diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs index 1e90d40fb17..aa66f796992 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -50,11 +50,13 @@ //! [`tower`]: https://crates.io/crates/tower //! [`aws-smithy-runtime`]: https://crates.io/crates/aws-smithy-runtime +use crate::box_error::BoxError; use crate::client::orchestrator::{HttpRequest, HttpResponse}; use crate::client::result::ConnectorError; use crate::client::runtime_components::sealed::ValidateConfig; -use crate::client::runtime_components::RuntimeComponents; +use crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder}; use crate::impl_shared_conversions; +use aws_smithy_types::config_bag::ConfigBag; use std::fmt; use std::sync::Arc; use std::time::Duration; @@ -143,6 +145,26 @@ pub trait HttpClient: Send + Sync + fmt::Debug { settings: &HttpConnectorSettings, components: &RuntimeComponents, ) -> SharedHttpConnector; + + #[doc = include_str!("../../rustdoc/validate_base_client_config.md")] + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + + #[doc = include_str!("../../rustdoc/validate_final_config.md")] + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } } /// Shared HTTP client for use across multiple clients and requests. @@ -170,7 +192,24 @@ impl HttpClient for SharedHttpClient { } } -impl ValidateConfig for SharedHttpClient {} +impl ValidateConfig for SharedHttpClient { + fn validate_base_client_config( + &self, + runtime_components: &super::runtime_components::RuntimeComponentsBuilder, + cfg: &aws_smithy_types::config_bag::ConfigBag, + ) -> Result<(), crate::box_error::BoxError> { + self.selector + .validate_base_client_config(runtime_components, cfg) + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &aws_smithy_types::config_bag::ConfigBag, + ) -> Result<(), crate::box_error::BoxError> { + self.selector.validate_final_config(runtime_components, cfg) + } +} impl_shared_conversions!(convert SharedHttpClient from HttpClient using SharedHttpClient::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index 669c4490ab2..3632029e7b1 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -64,12 +64,7 @@ pub trait ResolveCachedIdentity: fmt::Debug + Send + Sync { config_bag: &'a ConfigBag, ) -> IdentityFuture<'a>; - /// Validate the base client configuration for this implementation. - /// - /// This gets called upon client construction. The full config may not be available at - /// this time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather - /// than [`RuntimeComponents`]). Any error returned here will become a panic - /// in the client constructor. + #[doc = include_str!("../../rustdoc/validate_base_client_config.md")] fn validate_base_client_config( &self, runtime_components: &RuntimeComponentsBuilder, @@ -79,13 +74,7 @@ pub trait ResolveCachedIdentity: fmt::Debug + Send + Sync { Ok(()) } - /// Validate the final client configuration for this implementation. - /// - /// This gets called immediately after the [`Intercept::read_before_execution`] trait hook - /// when the final configuration has been resolved. Any error returned here will - /// cause the operation to return that error. - /// - /// [`Intercept::read_before_execution`]: crate::client::interceptors::Intercept::read_before_execution + #[doc = include_str!("../../rustdoc/validate_final_config.md")] fn validate_final_config( &self, runtime_components: &RuntimeComponents, diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 0b0c58c321f..19471ddf6b4 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -44,12 +44,7 @@ pub(crate) mod sealed { /// This trait can be used to validate that certain required components or config values /// are available, and provide an error with helpful instructions if they are not. pub trait ValidateConfig: fmt::Debug + Send + Sync { - /// Validate the base client configuration. - /// - /// This gets called upon client construction. The full config may not be available at - /// this time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather - /// than [`RuntimeComponents`]). Any error returned here will become a panic - /// in the client constructor. + #[doc = include_str!("../../rustdoc/validate_base_client_config.md")] fn validate_base_client_config( &self, runtime_components: &RuntimeComponentsBuilder, @@ -59,11 +54,7 @@ pub(crate) mod sealed { Ok(()) } - /// Validate the final client configuration. - /// - /// This gets called immediately after the [`Intercept::read_before_execution`] trait hook - /// when the final configuration has been resolved. Any error returned here will - /// cause the operation to return that error. + #[doc = include_str!("../../rustdoc/validate_final_config.md")] fn validate_final_config( &self, runtime_components: &RuntimeComponents, diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 344c60714a1..1359beb4a38 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -15,9 +15,12 @@ use aws_smithy_runtime_api::client::http::{ }; use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; use aws_smithy_runtime_api::client::result::ConnectorError; -use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, +}; use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::retry::ErrorKind; use h2::Reason; @@ -36,38 +39,42 @@ use tokio::io::{AsyncRead, AsyncWrite}; mod default_connector { use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_runtime_api::client::http::HttpConnectorSettings; + use hyper_0_14::client::HttpConnector; + use hyper_rustls::HttpsConnector; // Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we // don't need to repeatedly incur that cost. - static HTTPS_NATIVE_ROOTS: once_cell::sync::Lazy< + pub(crate) static HTTPS_NATIVE_ROOTS: once_cell::sync::Lazy< hyper_rustls::HttpsConnector, - > = once_cell::sync::Lazy::new(|| { + > = once_cell::sync::Lazy::new(default_tls); + + fn default_tls() -> HttpsConnector { use hyper_rustls::ConfigBuilderExt; hyper_rustls::HttpsConnectorBuilder::new() - .with_tls_config( - rustls::ClientConfig::builder() - .with_cipher_suites(&[ - // TLS1.3 suites - rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - // TLS1.2 suites - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - ]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .expect("Error with the TLS configuration. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues.") - .with_native_roots() - .with_no_client_auth() - ) - .https_or_http() - .enable_http1() - .enable_http2() - .build() - }); + .with_tls_config( + rustls::ClientConfig::builder() + .with_cipher_suites(&[ + // TLS1.3 suites + rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, + // TLS1.2 suites + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + ]) + .with_safe_default_kx_groups() + .with_safe_default_protocol_versions() + .expect("Error with the TLS configuration. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues.") + .with_native_roots() + .with_no_client_auth() + ) + .https_or_http() + .enable_http1() + .enable_http2() + .build() + } pub(super) fn base( settings: &HttpConnectorSettings, @@ -474,6 +481,20 @@ where C::Future: Unpin + Send + 'static, C::Error: Into, { + fn validate_base_client_config( + &self, + _: &RuntimeComponentsBuilder, + _: &ConfigBag, + ) -> Result<(), BoxError> { + // Initialize the TCP connector at this point so that native certs load + // at client initialization time instead of upon first request. We do it + // here rather than at construction so that it won't run if this is not + // the selected HTTP client for the base config (for example, if this was + // the default HTTP client, and it was overridden by a later plugin). + let _ = (self.tcp_connector_fn)(); + Ok(()) + } + fn http_connector( &self, settings: &HttpConnectorSettings, @@ -490,7 +511,14 @@ where .connector_settings(settings.clone()); builder.set_sleep_impl(components.sleep_impl()); + let start = components.time_source().map(|ts| ts.now()); let tcp_connector = (self.tcp_connector_fn)(); + let end = components.time_source().map(|ts| ts.now()); + if let (Some(start), Some(end)) = (start, end) { + if let Ok(elapsed) = end.duration_since(start) { + tracing::debug!("new TCP connector created in {:?}", elapsed); + } + } let connector = SharedHttpConnector::new(builder.build(tcp_connector)); cache.insert(key.clone(), connector); } @@ -535,10 +563,13 @@ impl HyperClientBuilder { self } - /// Create a [`HyperConnector`] with the default rustls HTTPS implementation. + /// Create a hyper client with the default rustls HTTPS implementation. + /// + /// The trusted certificates will be loaded later when this becomes the selected + /// HTTP client for a Smithy client. #[cfg(feature = "tls-rustls")] pub fn build_https(self) -> SharedHttpClient { - self.build(default_connector::https()) + self.build_with_fn(default_connector::https) } /// Create a [`SharedHttpClient`] from this builder and a given connector. @@ -555,14 +586,9 @@ impl HyperClientBuilder { C::Future: Unpin + Send + 'static, C::Error: Into, { - SharedHttpClient::new(HyperClient { - connector_cache: RwLock::new(HashMap::new()), - client_builder: self.client_builder.unwrap_or_default(), - tcp_connector_fn: move || tcp_connector.clone(), - }) + self.build_with_fn(move || tcp_connector.clone()) } - #[cfg(all(test, feature = "test-util"))] fn build_with_fn(self, tcp_connector_fn: F) -> SharedHttpClient where F: Fn() -> C + Send + Sync + 'static, @@ -952,6 +978,7 @@ mod timeout_middleware { mod test { use super::*; use crate::client::http::test_util::NeverTcpConnector; + use aws_smithy_async::time::SystemTimeSource; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use http::Uri; use hyper_0_14::client::connect::{Connected, Connection}; @@ -993,7 +1020,10 @@ mod test { ]; // Kick off thousands of parallel tasks that will try to create a connector - let components = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(SystemTimeSource::new())) + .build() + .unwrap(); let mut handles = Vec::new(); for setting in &settings { for _ in 0..1000 { diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs index d61608cbeb2..128579e3849 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs @@ -146,6 +146,7 @@ async fn never_tcp_connector_plugs_into_hyper_014() { use super::*; use crate::client::http::hyper_014::HyperClientBuilder; use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::time::SystemTimeSource; use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use std::time::Duration; @@ -153,6 +154,7 @@ async fn never_tcp_connector_plugs_into_hyper_014() { let client = HyperClientBuilder::new().build(NeverTcpConnector::new()); let components = RuntimeComponentsBuilder::for_tests() .with_sleep_impl(Some(TokioSleep::new())) + .with_time_source(Some(SystemTimeSource::new())) .build() .unwrap(); let http_connector = client.http_connector( From 81fc83ee6ea1b98fcfa6b1bccaf2dd8db0748adb Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Fri, 1 Dec 2023 11:20:45 -0600 Subject: [PATCH 319/331] Fix `config::Builder::set_credentials_provider` to override what's previsouly set (#3278) ## Motivation and Context Fixes https://github.com/awslabs/aws-sdk-rust/issues/973 ## Description Prior to the PR, if a customer explicitly passed a credentials provider to a client's config `Builder::set_credentials_provider`, what's passed did not override a credentials provider previously set ([actual use case](https://github.com/awslabs/aws-sdk-rust/issues/973#issuecomment-1827224049)). While in general, we recommend customers single-source a credentials provider through [aws_config::ConfigLoader::credentials_provider](https://docs.rs/aws-config/1.0.1/aws_config/struct.ConfigLoader.html#method.credentials_provider), we should eliminate the said footgun in case they directly pass a credentials provider to a client's config `Builder`. The PR reverts test signature updates in https://github.com/smithy-lang/smithy-rs/pull/3156 (in hindsight, having to update test signatures in that PR was a sign of regression). ## Testing Added a Kotlin test to `CredentialProviderConfigTest.kt` to verify the fix ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 20 ++++- .../smithy/rustsdk/CredentialProviders.kt | 9 ++- .../rustsdk/CredentialProviderConfigTest.kt | 69 ++++++++++++++++- .../kms/tests/integration.rs | 2 +- .../qldbsession/tests/integration.rs | 2 +- .../s3/tests/naughty-string-metadata.rs | 2 +- .../s3/tests/normalize-uri-path.rs | 2 +- .../query-strings-are-correctly-encoded.rs | 2 +- .../integration-tests/s3/tests/signing-it.rs | 2 +- .../s3control/tests/signing-it.rs | 6 +- .../customizations/HttpAuthDecorator.kt | 8 +- .../aws-smithy-runtime-api/Cargo.toml | 2 +- .../src/client/runtime_components.rs | 76 ++++++++++++++++++- .../src/client/orchestrator/operation.rs | 2 +- 14 files changed, 181 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fc4c4c2578b..6f90ff174bd 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,4 +9,22 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" \ No newline at end of file +# author = "rcoh" + +[[aws-sdk-rust]] +message = "Fix `config::Builder::set_credentials_provider` to override a credentials provider previously set." +references = ["aws-sdk-rust#973", "smithy-rs#3278"] +meta = { "breaking" = false, "tada" = false, "bug" = true } +author = "ysaito1001" + +[[aws-sdk-rust]] +message = "`config::Config::credentials_provider` has been broken since `release-2023-11-15` and is now marked as `deprecated` explicitly." +references = ["smithy-rs#3251", "smithy-rs#3278"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "ysaito1001" + +[[smithy-rs]] +message = "`RuntimeComponentsBuilder::push_identity_resolver` is now deprecated since it does not replace the existing identity resolver of a given auth scheme ID. Use `RuntimeComponentsBuilder::set_identity_resolver` instead." +references = ["smithy-rs#3278"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "ysaito1001" diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index 9405f8a2fe0..331babe611a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -81,9 +81,10 @@ class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) ServiceConfig.ConfigImpl -> { rustTemplate( """ - /// Returns the credentials provider for this service + /// This function was intended to be removed, and has been broken since release-2023-11-15 as it always returns a `None`. Do not use. + ##[deprecated(note = "This function was intended to be removed, and has been broken since release-2023-11-15 as it always returns a `None`. Do not use.")] pub fn credentials_provider(&self) -> Option<#{SharedCredentialsProvider}> { - self.config.load::<#{SharedCredentialsProvider}>().cloned() + #{None} } """, *codegenScope, @@ -118,13 +119,13 @@ class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { featureGateBlock("sigv4a") { rustTemplate( - "self.runtime_components.push_identity_resolver(#{SIGV4A_SCHEME_ID}, credentials_provider.clone());", + "self.runtime_components.set_identity_resolver(#{SIGV4A_SCHEME_ID}, credentials_provider.clone());", *codegenScope, ) } } rustTemplate( - "self.runtime_components.push_identity_resolver(#{SIGV4_SCHEME_ID}, credentials_provider);", + "self.runtime_components.set_identity_resolver(#{SIGV4_SCHEME_ID}, credentials_provider);", *codegenScope, ) } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt index 63a4f820ba4..aec0806d06f 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt @@ -30,7 +30,7 @@ internal class CredentialProviderConfigTest { val moduleName = ctx.moduleUseName() rustTemplate( """ - let (http_client, _rx) = #{capture_request}(None); + let (http_client, _rx) = #{capture_request}(#{None}); let client_config = $moduleName::Config::builder() .http_client(http_client) .build(); @@ -62,4 +62,71 @@ internal class CredentialProviderConfigTest { } } } + + @Test + fun `configuring credentials provider on builder should replace what was previously set`() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> + val rc = ctx.runtimeConfig + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "capture_request" to RuntimeType.captureRequest(rc), + "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(rc) + .resolve("Credentials"), + "Region" to AwsRuntimeType.awsTypes(rc).resolve("region::Region"), + "SdkConfig" to AwsRuntimeType.awsTypes(rc).resolve("sdk_config::SdkConfig"), + "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(rc) + .resolve("provider::SharedCredentialsProvider"), + ) + rustCrate.integrationTest("credentials_provider") { + // per https://github.com/awslabs/aws-sdk-rust/issues/973 + tokioTest("configuring_credentials_provider_on_builder_should_replace_what_was_previously_set") { + val moduleName = ctx.moduleUseName() + rustTemplate( + """ + let (http_client, rx) = #{capture_request}(#{None}); + + let replace_me = #{Credentials}::new( + "replace_me", + "replace_me", + #{None}, + #{None}, + "replace_me", + ); + let sdk_config = #{SdkConfig}::builder() + .credentials_provider( + #{SharedCredentialsProvider}::new(replace_me), + ) + .region(#{Region}::new("us-west-2")) + .build(); + + let expected = #{Credentials}::new( + "expected_credential", + "expected_credential", + #{None}, + #{None}, + "expected_credential", + ); + let conf = $moduleName::config::Builder::from(&sdk_config) + .http_client(http_client) + .credentials_provider(expected) + .build(); + + let client = $moduleName::Client::from_conf(conf); + + let _ = client + .some_operation() + .send() + .await + .expect("success"); + + let req = rx.expect_request(); + let auth_header = req.headers().get("AUTHORIZATION").unwrap(); + assert!(auth_header.contains("expected_credential"), "{auth_header}"); + """, + *codegenScope, + ) + } + } + } + } } diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index 6cba0de93dc..ed534f61bdd 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -52,7 +52,7 @@ async fn generate_random() { .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "20") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=703f72fe50c310e3ee1a7a106df947b980cb91bc8bad7a4a603b057096603aed") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=53dcf70f6f852cb576185dcabef5aaa3d068704cf1b7ea7dc644efeaa46674d7") .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") diff --git a/aws/sdk/integration-tests/qldbsession/tests/integration.rs b/aws/sdk/integration-tests/qldbsession/tests/integration.rs index fbc8b0a00f6..6cdb32d1f17 100644 --- a/aws/sdk/integration-tests/qldbsession/tests/integration.rs +++ b/aws/sdk/integration-tests/qldbsession/tests/integration.rs @@ -20,7 +20,7 @@ async fn signv4_use_correct_service_name() { .header("content-type", "application/x-amz-json-1.0") .header("x-amz-target", "QLDBSession.SendCommand") .header("content-length", "49") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=e8d50282fa369adf05f33a5b32e3ce2a7582edc902312c59de311001a97426d9") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/qldb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=9a07c60550504d015fb9a2b0f1b175a4d906651f9dd4ee44bebb32a802d03815") // qldbsession uses the signing name 'qldb' in signature _________________________^^^^ .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index f139a28b0f6..3b6bd970029 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -88,7 +88,7 @@ async fn test_s3_signer_with_naughty_string_metadata() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=733dba2f1ca3c9a39f4eef3a6750a71eff00297cd765408ad3cef5dcdc44d642"; + "Signature=a5115604df66219874a9e5a8eab4c9f7a28c992ab2d918037a285756c019f3b2"; assert!( auth_header .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index 367aa19682f..11ee0f7b092 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -41,7 +41,7 @@ async fn test_operation_should_not_normalize_uri_path() { let expected_uri = "https://test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1.s3.us-east-1.amazonaws.com/a/.././b.txt?x-id=PutObject"; assert_eq!(actual_uri, expected_uri); - let expected_sig = "Signature=404fb9502378c8f46fb83544848c42d29d55610a14b4bed9577542e49e549d08"; + let expected_sig = "Signature=2ac540538c84dc2616d92fb51d4fc6146ccd9ccc1ee85f518a1a686c5ef97b86"; assert!( actual_auth.contains(expected_sig), "authorization header signature did not match expected signature: expected {} but not found in {}", diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 563ba7076d2..53560e3bebc 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -45,7 +45,7 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=740feb1de3968a643e68fb1a17c415d98dd6a1cc28782fb1ef6157586548c747"; + "Signature=9a931d20606f93fa4e5553602866a9b5ccac2cd42b54ae5a4b17e4614fb443ce"; assert!( auth_header .contains(snapshot_signature), diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index d0106aaded2..450f4ba43ff 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -15,7 +15,7 @@ use aws_smithy_types::body::SdkBody; async fn test_signer() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=d8ea22461a59cc1cbeb01fa093423ffafcb7695197ba2409b477216a4be2c104") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=27e3f59ec3cffaa10e4f1c92112e8fb62d468a04cd32be39e68215f830404dbb") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~") .body(SdkBody::empty()) .unwrap(), diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index 7b06289a1c4..6d258496b1f 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -13,10 +13,10 @@ use aws_smithy_types::body::SdkBody; async fn test_signer() { let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, \ - SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, \ - Signature=01a71226e959c7b0b998adf26fa266f9c3612df57a60b187d549822e86d90667") + SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-user-agent, \ + Signature=0102a74cb220f8445c4efada17660572ff813e07b524032ec831e8c2514be903") .uri("https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint") .body(SdkBody::empty()) .unwrap(), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index ca526b8650f..1f11f991643 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -220,7 +220,7 @@ private class HttpAuthConfigCustomization( /// Sets an API key resolver will be used for authentication. pub fn api_key_resolver(mut self, api_key_resolver: impl #{ResolveIdentity} + 'static) -> Self { - self.runtime_components.push_identity_resolver( + self.runtime_components.set_identity_resolver( #{HTTP_API_KEY_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(api_key_resolver) ); @@ -240,7 +240,7 @@ private class HttpAuthConfigCustomization( /// Sets a bearer token provider that will be used for HTTP bearer auth. pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{ResolveIdentity} + 'static) -> Self { - self.runtime_components.push_identity_resolver( + self.runtime_components.set_identity_resolver( #{HTTP_BEARER_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(bearer_token_resolver) ); @@ -260,7 +260,7 @@ private class HttpAuthConfigCustomization( /// Sets a login resolver that will be used for HTTP basic auth. pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self { - self.runtime_components.push_identity_resolver( + self.runtime_components.set_identity_resolver( #{HTTP_BASIC_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(basic_auth_resolver) ); @@ -280,7 +280,7 @@ private class HttpAuthConfigCustomization( /// Sets a login resolver that will be used for HTTP digest auth. pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self { - self.runtime_components.push_identity_resolver( + self.runtime_components.set_identity_resolver( #{HTTP_DIGEST_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(digest_auth_resolver) ); diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index 3e7415448b6..93f88c0cd68 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -28,7 +28,7 @@ zeroize = { version = "1", optional = true } [dev-dependencies] proptest = "1" -tokio = { version = "1.25", features = ["rt", "macros"] } +tokio = { version = "1.25", features = ["macros", "rt", "rt-multi-thread"] } [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs index 0b0c58c321f..2f94c585437 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -570,7 +570,11 @@ impl RuntimeComponentsBuilder { self } - /// Adds an identity resolver. + /// This method is broken since it does not replace an existing identity resolver of the given auth scheme ID. + /// Use `set_identity_resolver` instead. + #[deprecated( + note = "This method is broken since it does not replace an existing identity resolver of the given auth scheme ID. Use `set_identity_resolver` instead." + )] pub fn push_identity_resolver( &mut self, scheme_id: AuthSchemeId, @@ -583,13 +587,40 @@ impl RuntimeComponentsBuilder { self } + /// Sets the identity resolver for a given `scheme_id`. + /// + /// If there is already an identity resolver for that `scheme_id`, this method will replace + /// the existing one with the passed-in `identity_resolver`. + pub fn set_identity_resolver( + &mut self, + scheme_id: AuthSchemeId, + identity_resolver: impl ResolveIdentity + 'static, + ) -> &mut Self { + let tracked = Tracked::new( + self.builder_name, + ConfiguredIdentityResolver::new(scheme_id, identity_resolver.into_shared()), + ); + + if let Some(s) = self + .identity_resolvers + .iter_mut() + .find(|s| s.value.scheme_id() == scheme_id) + { + *s = tracked; + } else { + self.identity_resolvers.push(tracked); + } + + self + } + /// Adds an identity resolver. pub fn with_identity_resolver( mut self, scheme_id: AuthSchemeId, identity_resolver: impl ResolveIdentity + 'static, ) -> Self { - self.push_identity_resolver(scheme_id, identity_resolver); + self.set_identity_resolver(scheme_id, identity_resolver); self } @@ -1144,4 +1175,45 @@ mod tests { fn building_test_builder_should_not_panic() { let _ = RuntimeComponentsBuilder::for_tests().build(); // should not panic } + + #[test] + fn set_identity_resolver_should_replace_existing_resolver_for_given_auth_scheme() { + use crate::client::auth::AuthSchemeId; + use crate::client::identity::{Identity, IdentityFuture, ResolveIdentity}; + use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; + use aws_smithy_types::config_bag::ConfigBag; + use tokio::runtime::Runtime; + + #[derive(Debug)] + struct AnotherFakeIdentityResolver; + impl ResolveIdentity for AnotherFakeIdentityResolver { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) + } + } + + // Set a different `IdentityResolver` for the `fake` auth scheme already configured in + // a test runtime components builder + let rc = RuntimeComponentsBuilder::for_tests() + .with_identity_resolver(AuthSchemeId::new("fake"), AnotherFakeIdentityResolver) + .build() + .expect("should build RuntimeComponents"); + + let resolver = rc + .identity_resolver(AuthSchemeId::new("fake")) + .expect("identity resolver should be found"); + + let identity = Runtime::new().unwrap().block_on(async { + resolver + .resolve_identity(&rc, &ConfigBag::base()) + .await + .expect("identity should be resolved") + }); + + assert_eq!(Some(&"doesntmatter"), identity.data::<&str>()); + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs index 5ae8ab04d80..bd875c72e69 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -255,7 +255,7 @@ impl OperationBuilder { .push_auth_scheme(SharedAuthScheme::new(NoAuthScheme::default())); self.runtime_components .set_identity_cache(Some(IdentityCache::no_cache())); - self.runtime_components.push_identity_resolver( + self.runtime_components.set_identity_resolver( NO_AUTH_SCHEME_ID, SharedIdentityResolver::new(NoAuthIdentityResolver::new()), ); From 529b3f03e2b945ea2e5e879183ccfd8e74b7377c Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Fri, 1 Dec 2023 18:50:52 +0000 Subject: [PATCH 320/331] Upgrade the smithy-rs runtime crates version to 1.0.3 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f62062154b3..ed4fedc5e4a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ rust.msrv=1.70.0 org.gradle.jvmargs=-Xmx1024M # Version number to use for the generated stable runtime crates -smithy.rs.runtime.crate.stable.version=1.0.2 +smithy.rs.runtime.crate.stable.version=1.0.3 # Version number to use for the generated unstable runtime crates smithy.rs.runtime.crate.unstable.version=0.60.0 From cd6baa940c2bd00a11c378891136c73238c02a0b Mon Sep 17 00:00:00 2001 From: AWS SDK Rust Bot Date: Fri, 1 Dec 2023 18:53:05 +0000 Subject: [PATCH 321/331] Update changelog --- CHANGELOG.md | 6 ++ CHANGELOG.next.toml | 20 +----- aws/SDK_CHANGELOG.next.json | 125 ++++++++---------------------------- 3 files changed, 35 insertions(+), 116 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5512c0f7a2..cd4fe2a3b22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ +December 1st, 2023 +================== +**New this release:** +- (client, [smithy-rs#3278](https://github.com/smithy-lang/smithy-rs/issues/3278)) `RuntimeComponentsBuilder::push_identity_resolver` is now deprecated since it does not replace the existing identity resolver of a given auth scheme ID. Use `RuntimeComponentsBuilder::set_identity_resolver` instead. + + November 27th, 2023 =================== **New this release:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 6f90ff174bd..fc4c4c2578b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,22 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - -[[aws-sdk-rust]] -message = "Fix `config::Builder::set_credentials_provider` to override a credentials provider previously set." -references = ["aws-sdk-rust#973", "smithy-rs#3278"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "`config::Config::credentials_provider` has been broken since `release-2023-11-15` and is now marked as `deprecated` explicitly." -references = ["smithy-rs#3251", "smithy-rs#3278"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "`RuntimeComponentsBuilder::push_identity_resolver` is now deprecated since it does not replace the existing identity resolver of a given auth scheme ID. Use `RuntimeComponentsBuilder::set_identity_resolver` instead." -references = ["smithy-rs#3278"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 7b3cbbdd852..8823e0a91ab 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -6,21 +6,7 @@ "smithy-rs": [], "aws-sdk-rust": [ { - "message": "Add configurable stalled-stream protection for downloads.\n\nWhen making HTTP calls,\nit's possible for a connection to 'stall out' and emit no more data due to server-side issues.\nIn the event this happens, it's desirable for the stream to error out as quickly as possible.\nWhile timeouts can protect you from this issue, they aren't adaptive to the amount of data\nbeing sent and so must be configured specifically for each use case. When enabled, stalled-stream\nprotection will ensure that bad streams error out quickly, regardless of the amount of data being\ndownloaded.\n\nProtection is enabled by default for all clients but can be configured or disabled.\nSee [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#3202" - ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 5 - }, - { - "message": "Make certain types for EMR Serverless optional. Previously, they defaulted to 0, but this created invalid requests.", + "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", "meta": { "bug": true, "breaking": true, @@ -28,13 +14,13 @@ }, "author": "milesziemer", "references": [ - "smithy-rs#3217" + "smithy-rs#3246" ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", + "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", "age": 5 }, { - "message": "Prevent multiplication overflow in backoff computation", + "message": "Allow `--` to be used in bucket names for S3", "meta": { "bug": true, "breaking": false, @@ -42,70 +28,28 @@ }, "author": "rcoh", "references": [ - "smithy-rs#3229", - "aws-sdk-rust#960" - ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 5 - }, - { - "message": "Make some types for various services optional. Previously, they defaulted to 0, but this created invalid requests.", - "meta": { - "bug": true, - "breaking": true, - "tada": false - }, - "author": "milesziemer", - "references": [ - "smithy-rs#3228" - ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 5 - }, - { - "message": "Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\nwere ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\nthe [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#3222" - ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 5 - }, - { - "message": "Add `Display` impl for `DateTime`.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "HakanVardarr", - "references": [ - "smithy-rs#3183" + "smithy-rs#3253" ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 5 + "since-commit": "48e3c95a3f10eebd5a637f8e7670c4232cdabbe4", + "age": 4 }, { - "message": "Types/functions that were previously `#[doc(hidden)]` in `aws-config`, `aws-inlineable`, `aws-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.", + "message": "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)", "meta": { "bug": false, "breaking": false, "tada": false }, - "author": "ysaito1001", + "author": "rcoh", "references": [ - "smithy-rs#3226" + "aws-sdk-rust#738", + "aws-sdk-rust#858" ], - "since-commit": "f66f9246bccc376462ef47aec5707569fca214f5", - "age": 5 + "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", + "age": 2 }, { - "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", + "message": "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works.", "meta": { "bug": true, "breaking": true, @@ -113,52 +57,39 @@ }, "author": "milesziemer", "references": [ - "smithy-rs#3246" + "smithy-rs#3256" ], - "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", - "age": 4 + "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", + "age": 2 }, { - "message": "Allow `--` to be used in bucket names for S3", + "message": "Fix `config::Builder::set_credentials_provider` to override a credentials provider previously set.", "meta": { "bug": true, "breaking": false, "tada": false }, - "author": "rcoh", + "author": "ysaito1001", "references": [ - "smithy-rs#3253" + "aws-sdk-rust#973", + "smithy-rs#3278" ], - "since-commit": "48e3c95a3f10eebd5a637f8e7670c4232cdabbe4", - "age": 3 + "since-commit": "529b3f03e2b945ea2e5e879183ccfd8e74b7377c", + "age": 1 }, { - "message": "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)", + "message": "`config::Config::credentials_provider` has been broken since `release-2023-11-15` and is now marked as `deprecated` explicitly.", "meta": { "bug": false, "breaking": false, "tada": false }, - "author": "rcoh", - "references": [ - "aws-sdk-rust#738", - "aws-sdk-rust#858" - ], - "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", - "age": 1 - }, - { - "message": "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works.", - "meta": { - "bug": true, - "breaking": true, - "tada": false - }, - "author": "milesziemer", + "author": "ysaito1001", "references": [ - "smithy-rs#3256" + "smithy-rs#3251", + "smithy-rs#3278" ], - "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", + "since-commit": "529b3f03e2b945ea2e5e879183ccfd8e74b7377c", "age": 1 } ], From 2cac4d7f56ef60ee079d206bde7a383f56a83737 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 1 Dec 2023 16:15:13 -0500 Subject: [PATCH 322/331] Improve docs no credentials (#3279) ## Motivation and Context - aws-sdk-rust#971 ## Description Add documentation to `no_credentials` and add `test_credentials()` method ## Testing CI ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: John DiSanti --- CHANGELOG.next.toml | 17 +++++++++++++++++ aws/rust-runtime/aws-config/Cargo.toml | 3 +-- aws/rust-runtime/aws-config/src/lib.rs | 10 ++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index fb9213af120..1d3cad3a750 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -32,3 +32,20 @@ result of the compilation.""" references = ["aws-sdk-rust#975", "smithy-rs#3269"] meta = { "breaking" = false, "tada" = true, "bug" = false } author = "jdisanti" + +[[aws-sdk-rust]] +message = """Add `test_credentials` to `ConfigLoader` in `aws_config`. This allows the following pattern during tests: + +```rust +async fn main() { + let conf = aws_config::defaults(BehaviorVersion::latest()) + .test_credentials() + .await; +} +``` + +This is designed for unit tests and using local mocks like DynamoDB Local and LocalStack with the SDK. +""" +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "rcoh" +references = ["smithy-rs#3279", "aws-sdk-rust#971"] diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 4c51dbaa40e..627a00fd1c3 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -20,7 +20,7 @@ credentials-process = ["tokio/process"] default = ["client-hyper", "rustls", "rt-tokio", "credentials-process", "sso"] [dependencies] -aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types" } +aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../sdk/build/aws-sdk/sdk/aws-http" } aws-sdk-sts = { path = "../../sdk/build/aws-sdk/sdk/sts", default-features = false } aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async" } @@ -52,7 +52,6 @@ zeroize = { version = "1", optional = true } aws-sdk-ssooidc = { path = "../../sdk/build/aws-sdk/sdk/ssooidc", default-features = false, optional = true } [dev-dependencies] -aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x", "test-util"] } aws-smithy-runtime-api = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } futures-util = { version = "0.3.16", default-features = false } diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index 5fb0f5592c9..3feb455382f 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -212,6 +212,7 @@ mod loader { use crate::profile::profile_file::ProfileFiles; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; + use aws_credential_types::Credentials; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; @@ -458,6 +459,10 @@ mod loader { /// anonymous auth for S3, calling operations in STS that don't require a signature, /// or using token-based auth. /// + /// **Note**: For tests, e.g. with a service like DynamoDB Local, this is **not** what you + /// want. If credentials are disabled, requests cannot be signed. For these use cases, use + /// [`test_credentials`](Self::test_credentials). + /// /// # Examples /// /// Turn off credentials in order to call a service without signing: @@ -474,6 +479,11 @@ mod loader { self } + /// Set test credentials for use when signing requests + pub fn test_credentials(self) -> Self { + self.credentials_provider(Credentials::for_tests()) + } + /// Override the name of the app used to build [`SdkConfig`](aws_types::SdkConfig). /// /// This _optional_ name is used to identify the application in the user agent that From 75b4c351add4e28cf0324615b756e3ace7f37780 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Fri, 1 Dec 2023 17:36:44 -0500 Subject: [PATCH 323/331] Fix aws-config CI time regression (#3271) ## Motivation and Context This reduces checking aws-config to 6 minutes, down from 28 ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-config/Cargo.toml | 4 +++- tools/ci-scripts/check-aws-config | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 627a00fd1c3..b124e10dd4f 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -12,13 +12,15 @@ repository = "https://github.com/smithy-lang/smithy-rs" behavior-version-latest = [] client-hyper = ["aws-smithy-runtime/connector-hyper-0-14-x"] rustls = ["aws-smithy-runtime/tls-rustls", "client-hyper"] -allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI rt-tokio = ["aws-smithy-async/rt-tokio", "aws-smithy-runtime/rt-tokio", "tokio/rt"] sso = ["dep:aws-sdk-sso", "dep:aws-sdk-ssooidc", "dep:ring", "dep:hex", "dep:zeroize", "aws-smithy-runtime-api/http-auth"] credentials-process = ["tokio/process"] default = ["client-hyper", "rustls", "rt-tokio", "credentials-process", "sso"] +# deprecated: this feature does nothing +allow-compilation = [] + [dependencies] aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../sdk/build/aws-sdk/sdk/aws-http" } diff --git a/tools/ci-scripts/check-aws-config b/tools/ci-scripts/check-aws-config index 6a6d2cfc29d..135ab38eb14 100755 --- a/tools/ci-scripts/check-aws-config +++ b/tools/ci-scripts/check-aws-config @@ -35,8 +35,18 @@ cargo "+${RUST_NIGHTLY_VERSION:-nightly}" check-external-types --all-features -- echo "${C_YELLOW}## Checking for duplicate dependency versions in the normal dependency graph with all features enabled${C_RESET}" cargo tree -d --edges normal --all-features -echo "${C_YELLOW}## Testing every combination of features${C_RESET}" -cargo hack test --feature-powerset --exclude-all-features --exclude-features native-tls +# the crate has `allow-compilation` which needs to be deprecated + +echo "${C_YELLOW}## Checking every combination of features${C_RESET}" +cargo hack check --feature-powerset --exclude-all-features --exclude-features allow-compilation + +echo "${C_YELLOW}## Testing each feature in isolation${C_RESET}" +# these features are missed by the following check because they are grouped +cargo hack test --each-feature --include-features rt-tokio,client-hyper,rustls --exclude-no-default-features + +# This check will check other individual features and no-default-features +# grouping these features because they don't interact +cargo hack test --feature-powerset --exclude-all-features --exclude-features allow-compilation --group-features rt-tokio,client-hyper,rustls echo "${C_YELLOW}## Checking the wasm32-unknown-unknown and wasm32-wasi targets${C_RESET}" cargo check --target wasm32-unknown-unknown --no-default-features From 85d2621b7c1b5445044ef190a4a5051e6be8df3d Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Mon, 4 Dec 2023 11:27:39 -0800 Subject: [PATCH 324/331] Improve error messaging for auth scheme selection (#3277) This patch adds a stack-allocated list of explored auth schemes and the reason each didn't work to the auth orchestrator so that its error message is much easier to decipher. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 + .../dynamodb/tests/auth_scheme_error.rs | 32 +++ .../src/client/orchestrator/auth.rs | 227 +++++++++++++++++- .../aws-smithy-runtime/src/test_util.rs | 2 + .../src/test_util/assertions.rs | 57 +++++ 5 files changed, 323 insertions(+), 7 deletions(-) create mode 100644 aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs create mode 100644 rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 1d3cad3a750..2c2289e1d4b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -49,3 +49,15 @@ This is designed for unit tests and using local mocks like DynamoDB Local and Lo meta = { "breaking" = false, "tada" = true, "bug" = false } author = "rcoh" references = ["smithy-rs#3279", "aws-sdk-rust#971"] + +[[aws-sdk-rust]] +message = "Improve the error messages for when auth fails to select an auth scheme for a request." +references = ["aws-sdk-rust#979", "smithy-rs#3277"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "Improve the error messages for when auth fails to select an auth scheme for a request." +references = ["smithy-rs#3277"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs b/aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs new file mode 100644 index 00000000000..702a3fd933d --- /dev/null +++ b/aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_dynamodb::config::Region; +use aws_sdk_dynamodb::error::DisplayErrorContext; +use aws_sdk_dynamodb::{Client, Config}; +use aws_smithy_runtime::assert_str_contains; +use aws_smithy_runtime::client::http::test_util::capture_request; + +#[tokio::test] +async fn auth_scheme_error() { + let (http_client, _) = capture_request(None); + let config = Config::builder() + .behavior_version_latest() + .http_client(http_client) + .region(Region::new("us-west-2")) + // intentionally omitting credentials_provider + .build(); + let client = Client::from_conf(config); + + let err = client + .list_tables() + .send() + .await + .expect_err("there is no credential provider, so this must fail"); + assert_str_contains!( + DisplayErrorContext(&err).to_string(), + "\"sigv4\" wasn't a valid option because there was no identity resolver for it. Be sure to set an identity" + ); +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index 8c6f7000e48..98a39a9a439 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -20,18 +20,86 @@ use std::error::Error as StdError; use std::fmt; use tracing::trace; +#[derive(Debug)] +struct NoMatchingAuthSchemeError(ExploredList); + +impl fmt::Display for NoMatchingAuthSchemeError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let explored = &self.0; + + // Use the information we have about the auth options that were explored to construct + // as helpful of an error message as possible. + if explored.items().count() == 0 { + return f.write_str( + "no auth options are available. This can happen if there's \ + a problem with the service model, or if there is a codegen bug.", + ); + } + if explored + .items() + .all(|explored| matches!(explored.result, ExploreResult::NoAuthScheme)) + { + return f.write_str( + "no auth schemes are registered. This can happen if there's \ + a problem with the service model, or if there is a codegen bug.", + ); + } + + let mut try_add_identity = false; + let mut likely_bug = false; + f.write_str("failed to select an auth scheme to sign the request with.")?; + for item in explored.items() { + write!( + f, + " \"{}\" wasn't a valid option because ", + item.scheme_id.as_str() + )?; + f.write_str(match item.result { + ExploreResult::NoAuthScheme => { + likely_bug = true; + "no auth scheme was registered for it." + } + ExploreResult::NoIdentityResolver => { + try_add_identity = true; + "there was no identity resolver for it." + } + ExploreResult::MissingEndpointConfig => { + likely_bug = true; + "there is auth config in the endpoint config, but this scheme wasn't listed in it \ + (see https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details)." + } + ExploreResult::NotExplored => { + debug_assert!(false, "this should be unreachable"); + "" + } + })?; + } + if try_add_identity { + f.write_str(" Be sure to set an identity, such as credentials, auth token, or other identity type that is required for this service.")?; + } else if likely_bug { + f.write_str(" This is likely a bug.")?; + } + if explored.truncated { + f.write_str(" Note: there were other auth schemes that were evaluated that weren't listed here.")?; + } + + Ok(()) + } +} + +impl StdError for NoMatchingAuthSchemeError {} + #[derive(Debug)] enum AuthOrchestrationError { - NoMatchingAuthScheme, + MissingEndpointConfig, BadAuthSchemeEndpointConfig(Cow<'static, str>), } impl fmt::Display for AuthOrchestrationError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::NoMatchingAuthScheme => f.write_str( - "no auth scheme matched auth scheme options. This is a bug. Please file an issue.", - ), + // This error is never bubbled up + Self::MissingEndpointConfig => f.write_str("missing endpoint config"), Self::BadAuthSchemeEndpointConfig(message) => f.write_str(message), } } @@ -59,6 +127,8 @@ pub(super) async fn orchestrate_auth( "orchestrating auth", ); + let mut explored = ExploredList::default(); + // Iterate over IDs of possibly-supported auth schemes for &scheme_id in options.as_ref() { // For each ID, try to resolve the corresponding auth scheme. @@ -95,16 +165,21 @@ pub(super) async fn orchestrate_auth( )?; return Ok(()); } - Err(AuthOrchestrationError::NoMatchingAuthScheme) => { + Err(AuthOrchestrationError::MissingEndpointConfig) => { + explored.push(scheme_id, ExploreResult::MissingEndpointConfig); continue; } Err(other_err) => return Err(other_err.into()), } + } else { + explored.push(scheme_id, ExploreResult::NoIdentityResolver); } + } else { + explored.push(scheme_id, ExploreResult::NoAuthScheme); } } - Err(AuthOrchestrationError::NoMatchingAuthScheme.into()) + Err(NoMatchingAuthSchemeError(explored).into()) } fn extract_endpoint_auth_scheme_config( @@ -135,10 +210,66 @@ fn extract_endpoint_auth_scheme_config( .and_then(Document::as_string); config_scheme_id == Some(scheme_id.as_str()) }) - .ok_or(AuthOrchestrationError::NoMatchingAuthScheme)?; + .ok_or(AuthOrchestrationError::MissingEndpointConfig)?; Ok(AuthSchemeEndpointConfig::from(Some(auth_scheme_config))) } +#[derive(Debug)] +enum ExploreResult { + NotExplored, + NoAuthScheme, + NoIdentityResolver, + MissingEndpointConfig, +} + +/// Information about an evaluated auth option. +/// This should be kept small so it can fit in an array on the stack. +#[derive(Debug)] +struct ExploredAuthOption { + scheme_id: AuthSchemeId, + result: ExploreResult, +} +impl Default for ExploredAuthOption { + fn default() -> Self { + Self { + scheme_id: AuthSchemeId::new(""), + result: ExploreResult::NotExplored, + } + } +} + +const MAX_EXPLORED_LIST_LEN: usize = 8; + +/// Stack allocated list of explored auth options for error messaging +#[derive(Default)] +struct ExploredList { + items: [ExploredAuthOption; MAX_EXPLORED_LIST_LEN], + len: usize, + truncated: bool, +} +impl ExploredList { + fn items(&self) -> impl Iterator { + self.items.iter().take(self.len) + } + + fn push(&mut self, scheme_id: AuthSchemeId, result: ExploreResult) { + if self.len + 1 >= self.items.len() { + self.truncated = true; + } else { + self.items[self.len] = ExploredAuthOption { scheme_id, result }; + self.len += 1; + } + } +} +impl fmt::Debug for ExploredList { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("ExploredList") + .field("items", &&self.items[0..self.len]) + .field("truncated", &self.truncated) + .finish() + } +} + #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; @@ -481,4 +612,86 @@ mod tests { .unwrap() ); } + + #[test] + fn friendly_error_messages() { + let err = NoMatchingAuthSchemeError(ExploredList::default()); + assert_eq!( + "no auth options are available. This can happen if there's a problem with \ + the service model, or if there is a codegen bug.", + err.to_string() + ); + + let mut list = ExploredList::default(); + list.push( + AuthSchemeId::new("SigV4"), + ExploreResult::NoIdentityResolver, + ); + list.push( + AuthSchemeId::new("SigV4a"), + ExploreResult::NoIdentityResolver, + ); + let err = NoMatchingAuthSchemeError(list); + assert_eq!( + "failed to select an auth scheme to sign the request with. \ + \"SigV4\" wasn't a valid option because there was no identity resolver for it. \ + \"SigV4a\" wasn't a valid option because there was no identity resolver for it. \ + Be sure to set an identity, such as credentials, auth token, or other identity \ + type that is required for this service.", + err.to_string() + ); + + // It should prioritize the suggestion to try an identity before saying it's a bug + let mut list = ExploredList::default(); + list.push( + AuthSchemeId::new("SigV4"), + ExploreResult::NoIdentityResolver, + ); + list.push( + AuthSchemeId::new("SigV4a"), + ExploreResult::MissingEndpointConfig, + ); + let err = NoMatchingAuthSchemeError(list); + assert_eq!( + "failed to select an auth scheme to sign the request with. \ + \"SigV4\" wasn't a valid option because there was no identity resolver for it. \ + \"SigV4a\" wasn't a valid option because there is auth config in the endpoint \ + config, but this scheme wasn't listed in it (see \ + https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details). \ + Be sure to set an identity, such as credentials, auth token, or other identity \ + type that is required for this service.", + err.to_string() + ); + + // Otherwise, it should suggest it's a bug + let mut list = ExploredList::default(); + list.push( + AuthSchemeId::new("SigV4a"), + ExploreResult::MissingEndpointConfig, + ); + let err = NoMatchingAuthSchemeError(list); + assert_eq!( + "failed to select an auth scheme to sign the request with. \ + \"SigV4a\" wasn't a valid option because there is auth config in the endpoint \ + config, but this scheme wasn't listed in it (see \ + https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details). \ + This is likely a bug.", + err.to_string() + ); + + // Truncation should be indicated + let mut list = ExploredList::default(); + for _ in 0..=MAX_EXPLORED_LIST_LEN { + list.push( + AuthSchemeId::new("dontcare"), + ExploreResult::MissingEndpointConfig, + ); + } + let err = NoMatchingAuthSchemeError(list).to_string(); + if !err.contains( + "Note: there were other auth schemes that were evaluated that weren't listed here", + ) { + panic!("The error should indicate that the explored list was truncated."); + } + } } diff --git a/rust-runtime/aws-smithy-runtime/src/test_util.rs b/rust-runtime/aws-smithy-runtime/src/test_util.rs index b3ec5e5dfb3..5edd1dfcbe5 100644 --- a/rust-runtime/aws-smithy-runtime/src/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/test_util.rs @@ -5,3 +5,5 @@ /// Utility for capturing and displaying logs during a unit test. pub mod capture_test_logs; + +mod assertions; diff --git a/rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs b/rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs new file mode 100644 index 00000000000..de35c053b4f --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs @@ -0,0 +1,57 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/// Asserts that a given string value `$str` contains a substring `$expected`. +/// +/// This macro can also take a custom panic message with formatting. +#[macro_export] +macro_rules! assert_str_contains { + ($str:expr, $expected:expr) => { + assert_str_contains!($str, $expected, "") + }; + ($str:expr, $expected:expr, $($fmt_args:tt)+) => {{ + let s = $str; + let expected = $expected; + if !s.contains(&expected) { + panic!( + "assertion failed: `str.contains(expected)`\n{:>8}: {expected}\n{:>8}: {s}\n{}", + "expected", + "str", + ::std::fmt::format(::std::format_args!($($fmt_args)+)), + ); + } + }}; +} + +#[cfg(test)] +mod tests { + use std::panic::{catch_unwind, UnwindSafe}; + + fn expect_panic(f: impl FnOnce() -> () + UnwindSafe) -> String { + *catch_unwind(f) + .expect_err("it should fail") + .downcast::() + .expect("it should be a string") + } + + #[test] + fn assert_str_contains() { + assert_str_contains!("foobar", "bar"); + assert_str_contains!("foobar", "o"); + + assert_eq!( + "assertion failed: `str.contains(expected)`\nexpected: not-in-it\n str: foobar\n", + expect_panic(|| assert_str_contains!("foobar", "not-in-it")) + ); + assert_eq!( + "assertion failed: `str.contains(expected)`\nexpected: not-in-it\n str: foobar\nsome custom message", + expect_panic(|| assert_str_contains!("foobar", "not-in-it", "some custom message")) + ); + assert_eq!( + "assertion failed: `str.contains(expected)`\nexpected: not-in-it\n str: foobar\nsome custom message with formatting", + expect_panic(|| assert_str_contains!("foobar", "not-in-it", "some custom message with {}", "formatting")) + ); + } +} From 04aa4c815bf028af84fa9fdc676d1f564722916d Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 5 Dec 2023 09:59:23 -0800 Subject: [PATCH 325/331] Fix docs in hyper_014 module (#3282) Moves the doc comments from HyperConnector to HyperClientBuilder where they're more relevant, and fixes the examples. This fix is for https://github.com/awslabs/aws-sdk-rust/issues/986. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.next.toml | 12 +++ .../src/client/http/hyper_014.rs | 99 ++++++++++--------- 2 files changed, 64 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 2c2289e1d4b..5b27ca8c541 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -61,3 +61,15 @@ message = "Improve the error messages for when auth fails to select an auth sche references = ["smithy-rs#3277"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[aws-sdk-rust]] +message = "Fix documentation and examples on HyperConnector and HyperClientBuilder." +references = ["aws-sdk-rust#986", "smithy-rs#3282"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "jdisanti" + +[[smithy-rs]] +message = "Fix documentation and examples on HyperConnector and HyperClientBuilder." +references = ["smithy-rs#3282"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index 1359beb4a38..ed29d067af5 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -132,53 +132,9 @@ pub fn default_client() -> Option { /// /// This connector also implements socket connect and read timeouts. /// -/// # Examples -/// -/// Construct a `HyperConnector` with the default TLS implementation (rustls). -/// This can be useful when you want to share a Hyper connector between multiple -/// generated Smithy clients. -/// -/// ```no_run,ignore -/// use aws_smithy_runtime::client::connectors::hyper_connector::{DefaultHttpsTcpConnector, HyperConnector}; -/// -/// let hyper_connector = HyperConnector::builder().build(DefaultHttpsTcpConnector::new()); -/// -/// // This connector can then be given to a generated service Config -/// let config = my_service_client::Config::builder() -/// .endpoint_url("http://localhost:1234") -/// .http_connector(hyper_connector) -/// .build(); -/// let client = my_service_client::Client::from_conf(config); -/// ``` -/// -/// ## Use a Hyper client with WebPKI roots -/// -/// A use case for where you may want to use the [`HyperConnector`] is when setting Hyper client settings -/// that aren't otherwise exposed by the `Config` builder interface. Some examples include changing: -/// -/// - Hyper client settings -/// - Allowed TLS cipher suites -/// - Using an alternative TLS connector library (not the default, rustls) -/// - CA trust root certificates (illustrated using WebPKI below) -/// -/// ```no_run,ignore -/// use aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector; -/// -/// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() -/// .with_webpki_roots() -/// .https_only() -/// .enable_http1() -/// .enable_http2() -/// .build(); -/// let hyper_connector = HyperConnector::builder().build(https_connector); -/// -/// // This connector can then be given to a generated service Config -/// let config = my_service_client::Config::builder() -/// .endpoint_url("https://example.com") -/// .http_connector(hyper_connector) -/// .build(); -/// let client = my_service_client::Client::from_conf(config); -/// ``` +/// This shouldn't be used directly in most cases. +/// See the docs on [`HyperClientBuilder`] for examples of how +/// to customize the Hyper client. #[derive(Debug)] pub struct HyperConnector { adapter: Box, @@ -533,6 +489,55 @@ where /// /// This builder can be used to customize the underlying TCP connector used, as well as /// hyper client configuration. +/// +/// # Examples +/// +/// Construct a Hyper client with the default TLS implementation (rustls). +/// This can be useful when you want to share a Hyper connector between multiple +/// generated Smithy clients. +/// +/// ```no_run,ignore +/// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +/// +/// let http_client = HyperClientBuilder::new().build_https(); +/// +/// // This connector can then be given to a generated service Config +/// let config = my_service_client::Config::builder() +/// .endpoint_url("http://localhost:1234") +/// .http_client(http_client) +/// .build(); +/// let client = my_service_client::Client::from_conf(config); +/// ``` +/// +/// ## Use a Hyper client with WebPKI roots +/// +/// A use case for where you may want to use the [`HyperClientBuilder`] is when +/// setting Hyper client settings that aren't otherwise exposed by the `Config` +/// builder interface. Some examples include changing: +/// +/// - Hyper client settings +/// - Allowed TLS cipher suites +/// - Using an alternative TLS connector library (not the default, rustls) +/// - CA trust root certificates (illustrated using WebPKI below) +/// +/// ```no_run,ignore +/// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +/// +/// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() +/// .with_webpki_roots() +/// .https_only() +/// .enable_http1() +/// .enable_http2() +/// .build(); +/// let http_client = HyperClientBuilder::new().build(https_connector); +/// +/// // This connector can then be given to a generated service Config +/// let config = my_service_client::Config::builder() +/// .endpoint_url("https://example.com") +/// .http_client(http_client) +/// .build(); +/// let client = my_service_client::Client::from_conf(config); +/// ``` #[derive(Clone, Default, Debug)] pub struct HyperClientBuilder { client_builder: Option, From 9af2b21e930b155b7f710a106dadd9643c0e6fe2 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Tue, 5 Dec 2023 13:36:59 -0800 Subject: [PATCH 326/331] Add compile-time env var to add additional info to user agent header (#3285) This PR adds a `AWS_SDK_RUST_BUILD_UA_METADATA` environment variable to allow additional metadata to be added to the SDK user agent header at compile time. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- aws/rust-runtime/aws-http/src/user_agent.rs | 85 ++++++++++++++------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/aws/rust-runtime/aws-http/src/user_agent.rs b/aws/rust-runtime/aws-http/src/user_agent.rs index 1e26da4d4e6..9d92723720c 100644 --- a/aws/rust-runtime/aws-http/src/user_agent.rs +++ b/aws/rust-runtime/aws-http/src/user_agent.rs @@ -27,6 +27,7 @@ pub struct AwsUserAgent { config_metadata: Vec, framework_metadata: Vec, app_name: Option, + build_env_additional_metadata: Option, } impl AwsUserAgent { @@ -49,6 +50,11 @@ impl AwsUserAgent { .get("AWS_EXECUTION_ENV") .ok() .map(|name| ExecEnvMetadata { name }); + + // Retrieve additional metadata at compile-time from the AWS_SDK_RUST_BUILD_UA_METADATA env var + let build_env_additional_metadata = option_env!("AWS_SDK_RUST_BUILD_UA_METADATA") + .and_then(|value| AdditionalMetadata::new(value).ok()); + AwsUserAgent { sdk_metadata, api_metadata, @@ -63,6 +69,7 @@ impl AwsUserAgent { config_metadata: Default::default(), framework_metadata: Default::default(), app_name: Default::default(), + build_env_additional_metadata, } } @@ -93,6 +100,7 @@ impl AwsUserAgent { config_metadata: Vec::new(), framework_metadata: Vec::new(), app_name: None, + build_env_additional_metadata: None, } } @@ -188,6 +196,9 @@ impl AwsUserAgent { if let Some(app_name) = &self.app_name { write!(ua_value, "app/{}", app_name).unwrap(); } + if let Some(additional_metadata) = &self.build_env_additional_metadata { + write!(ua_value, "{}", additional_metadata).unwrap(); + } if ua_value.ends_with(' ') { ua_value.truncate(ua_value.len() - 1); } @@ -662,39 +673,55 @@ mod test { "aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0" ); } + + #[test] + fn generate_a_valid_ua_with_build_env_additional_metadata() { + let mut ua = AwsUserAgent::for_tests(); + ua.build_env_additional_metadata = Some(AdditionalMetadata::new("asdf").unwrap()); + assert_eq!( + ua.aws_ua_header(), + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 md/asdf" + ); + assert_eq!( + ua.ua_header(), + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ); + } } /* Appendix: User Agent ABNF -sdk-ua-header = "x-amz-user-agent:" OWS ua-string OWS -ua-pair = ua-name ["/" ua-value] -ua-name = token -ua-value = token -version = token -name = token -service-id = token -sdk-name = java / ruby / php / dotnet / python / cli / kotlin / rust / js / cpp / go / go-v2 -os-family = windows / linux / macos / android / ios / other -config = retry-mode -additional-metadata = "md/" ua-pair -sdk-metadata = "aws-sdk-" sdk-name "/" version -api-metadata = "api/" service-id "/" version -os-metadata = "os/" os-family ["/" version] -language-metadata = "lang/" language "/" version *(RWS additional-metadata) -env-metadata = "exec-env/" name -feat-metadata = "ft/" name ["/" version] *(RWS additional-metadata) -config-metadata = "cfg/" config ["/" value] -framework-metadata = "lib/" name ["/" version] *(RWS additional-metadata) -appId = "app/" name -ua-string = sdk-metadata RWS - [api-metadata RWS] - os-metadata RWS - language-metadata RWS - [env-metadata RWS] - *(feat-metadata RWS) - *(config-metadata RWS) - *(framework-metadata RWS) - [appId] +sdk-ua-header = "x-amz-user-agent:" OWS ua-string OWS +ua-pair = ua-name ["/" ua-value] +ua-name = token +ua-value = token +version = token +name = token +service-id = token +sdk-name = java / ruby / php / dotnet / python / cli / kotlin / rust / js / cpp / go / go-v2 +os-family = windows / linux / macos / android / ios / other +config = retry-mode +additional-metadata = "md/" ua-pair +sdk-metadata = "aws-sdk-" sdk-name "/" version +api-metadata = "api/" service-id "/" version +os-metadata = "os/" os-family ["/" version] +language-metadata = "lang/" language "/" version *(RWS additional-metadata) +env-metadata = "exec-env/" name +feat-metadata = "ft/" name ["/" version] *(RWS additional-metadata) +config-metadata = "cfg/" config ["/" value] +framework-metadata = "lib/" name ["/" version] *(RWS additional-metadata) +app-id = "app/" name +build-env-additional-metadata = "md/" value +ua-string = sdk-metadata RWS + [api-metadata RWS] + os-metadata RWS + language-metadata RWS + [env-metadata RWS] + *(feat-metadata RWS) + *(config-metadata RWS) + *(framework-metadata RWS) + [app-id] + [build-env-additional-metadata] # New metadata field might be added in the future and they must follow this format prefix = token From 8df5ac8545165b160d6cf2dbc02c04dcb45ccb4c Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Tue, 5 Dec 2023 20:22:54 -0500 Subject: [PATCH 327/331] Update links (these don't redirect) (#3218) Fix broken links as a result of repo movement ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- CHANGELOG.md | 4 ++-- codegen-server/README.md | 2 +- design/src/rfcs/rfc0030_serialization_and_deserialization.md | 2 +- examples/README.md | 4 ++-- rust-runtime/aws-smithy-http-server/src/plugin/mod.rs | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80a1f2831a4..86150e6ba43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -382,7 +382,7 @@ August 1st, 2023 } ``` - A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://awslabs.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://awslabs.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: + A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://smithy-lang.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://smithy-lang.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: ```rust let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) @@ -1184,7 +1184,7 @@ September 20th, 2022 `aws_smithy_http::operation::Parts` has been renamed to `retry_classifier`. **New this release:** -- 🎉 (client, [smithy-rs#1647](https://github.com/smithy-lang/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/smithy-lang/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://awslabs.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html). +- 🎉 (client, [smithy-rs#1647](https://github.com/smithy-lang/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/smithy-lang/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://smithy-lang.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html). Before this change, modifying operations before sending them required using lower-level APIs: diff --git a/codegen-server/README.md b/codegen-server/README.md index 952ac21307d..1fbb21886ab 100644 --- a/codegen-server/README.md +++ b/codegen-server/README.md @@ -4,7 +4,7 @@ Server-side Smithy code generator ** This is a work in progress and generates serialization/de-serialization code that is probably unusable for the time being. ** -[Design documentation (WIP)](https://awslabs.github.io/smithy-rs/) +[Design documentation (WIP)](https://smithy-lang.github.io/smithy-rs/) ## Project Layout diff --git a/design/src/rfcs/rfc0030_serialization_and_deserialization.md b/design/src/rfcs/rfc0030_serialization_and_deserialization.md index 46ad1a4cb6f..58aeaaf38ab 100644 --- a/design/src/rfcs/rfc0030_serialization_and_deserialization.md +++ b/design/src/rfcs/rfc0030_serialization_and_deserialization.md @@ -38,7 +38,7 @@ Lastly, we emphasize that this RFC does NOT aim to serialize the entire response Users have requested `serde` traits to be implemented on data types implemented in rust SDK. We have created this RFC with the following use cases in mind. 1. [[request]: Serialize/Deserialize of models for Lambda events #269](https://github.com/awslabs/aws-sdk-rust/issues/269) -2. [Tests](https://awslabs.github.io/smithy-rs/design/faq.html#why-dont-the-sdk-service-crates-implement-serdeserialize-or-serdedeserialize-for-any-types) as suggested in the design FAQ. +2. [Tests](https://smithy-lang.github.io/smithy-rs/design/faq.html#why-dont-the-sdk-service-crates-implement-serdeserialize-or-serdedeserialize-for-any-types) as suggested in the design FAQ. 3. Building tools # Feature Gate diff --git a/examples/README.md b/examples/README.md index f179bc1a443..37ea375b7a9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -14,8 +14,8 @@ These servers, and their clients, are generated using smithy-rs. You're invited to benchmark the performance of these servers to see whether smithy-rs might be a suitable choice for implementing your web service. -[middleware]: https://awslabs.github.io/smithy-rs/design/server/middleware.html -[extractors]: https://awslabs.github.io/smithy-rs/design/server/from_parts.html +[middleware]: https://smithy-lang.github.io/smithy-rs/design/server/middleware.html +[extractors]: https://smithy-lang.github.io/smithy-rs/design/server/from_parts.html ## Pre-requisites diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs index 5ff37163bff..533dbee00ed 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs @@ -34,7 +34,7 @@ //! you absolutely require your middleware to run after deserialization, or to act on particular //! fields of your deserialized operation's input/output/errors. //! -//! [the book]: https://awslabs.github.io/smithy-rs/design/server/anatomy.html +//! [the book]: https://smithy-lang.github.io/smithy-rs/design/server/anatomy.html //! //! # Filtered application of a HTTP [`Layer`](tower::Layer) //! From b78367cbe08b9b8655f87ebd9ee4eecaf4db3c12 Mon Sep 17 00:00:00 2001 From: Declan Kelly Date: Wed, 6 Dec 2023 11:05:47 -0800 Subject: [PATCH 328/331] Record TCP connection local socket address in metadata (#3286) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation and Context I want to use this field to uniquely identify TCP connection based on their `local_addr` + `remote_addr`. See https://github.com/awslabs/aws-sdk-rust/issues/990 for additional motivation for this change. ## Description - Add a new optional `local_addr` field in the `ConnectionMetadata` struct. - Transfer the `local_addr` `SocketAddress` from the `hyper::HttpInfo` to the `ConnectionMetadata` field. - Add to the `trace-serialize` example program so that it will print out the capture connection values. ## Testing `cargo test` in `rust-runtime/aws-smithy-runtime-api` and `aws-smithy-runtime`. Also ran: ``` thedeck@c889f3b04fb0 examples % cargo run --example trace-serialize Finished dev [unoptimized + debuginfo] target(s) in 0.13s Running `/Users/thedeck/repos/github/declanvk/smithy-rs/target/debug/examples/trace-serialize` 2023-12-06T00:13:15.605555Z INFO lazy_load_identity: aws_smithy_runtime::client::identity::cache::lazy: identity cache miss occurred; added new identity (took Ok(296µs)) 2023-12-06T00:13:15.608344Z INFO trace_serialize: Response received: response=Response { status: StatusCode(200), headers: Headers { headers: {"content-type": HeaderValue { _private: "application/json" }, "content-length": HeaderValue { _private: "17" }, "date": HeaderValue { _private: "Wed, 06 Dec 2023 00:13:15 GMT" }} }, body: SdkBody { inner: BoxBody, retryable: false }, extensions: Extensions } 2023-12-06T00:13:15.608388Z INFO trace_serialize: Captured connection info remote_addr=Some(127.0.0.1:13734) local_addr=Some(127.0.0.1:50199) 2023-12-06T00:13:15.608511Z INFO trace_serialize: Response received POKEMON_SERVICE_URL=http://localhost:13734 response=GetServerStatisticsOutput { calls_count: 0 } ``` You can see the log line with "Captured connection info" contains the `remote_addr` and the `local_addr` fields. ## Checklist - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ Co-authored-by: Declan Kelly --- CHANGELOG.next.toml | 6 + .../examples/trace-serialize.rs | 15 +- .../src/client/connection.rs | 204 ++++++++++++++++++ .../src/client/http/connection_poisoning.rs | 10 +- .../src/client/http/hyper_014.rs | 17 +- 5 files changed, 243 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 5b27ca8c541..58811865e2b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -73,3 +73,9 @@ message = "Fix documentation and examples on HyperConnector and HyperClientBuild references = ["smithy-rs#3282"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } author = "jdisanti" + +[[smithy-rs]] +message = "Expose local socket address from ConnectionMetadata." +references = ["aws-sdk-rust#990"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "declanvk" diff --git a/examples/pokemon-service-client-usage/examples/trace-serialize.rs b/examples/pokemon-service-client-usage/examples/trace-serialize.rs index 39cb53c4f1b..c5dc8f206f1 100644 --- a/examples/pokemon-service-client-usage/examples/trace-serialize.rs +++ b/examples/pokemon-service-client-usage/examples/trace-serialize.rs @@ -2,6 +2,7 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +use aws_smithy_runtime::client::http::connection_poisoning::CaptureSmithyConnection; /// This example demonstrates how an interceptor can be written to trace what is being /// serialized / deserialized on the wire. /// @@ -59,7 +60,7 @@ impl Intercept for WireFormatInterceptor { &self, context: &BeforeDeserializationInterceptorContextRef<'_>, _runtime_components: &RuntimeComponents, - _cfg: &mut ConfigBag, + cfg: &mut ConfigBag, ) -> Result<(), BoxError> { // Get the response type from the context. let response = context.response(); @@ -70,6 +71,18 @@ impl Intercept for WireFormatInterceptor { tracing::error!(?response); } + // Print the connection information + let captured_connection = cfg.load::().cloned(); + if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) { + tracing::info!( + remote_addr = ?captured_connection.remote_addr(), + local_addr = ?captured_connection.local_addr(), + "Captured connection info" + ); + } else { + tracing::warn!("Connection info is missing!"); + } + Ok(()) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs index 99ae574232b..293e27dcb80 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs @@ -14,6 +14,7 @@ use std::sync::Arc; pub struct ConnectionMetadata { is_proxied: bool, remote_addr: Option, + local_addr: Option, poison_fn: Arc, } @@ -25,6 +26,10 @@ impl ConnectionMetadata { } /// Create a new [`ConnectionMetadata`]. + #[deprecated( + since = "1.1.0", + note = "`ConnectionMetadata::new` is deprecated in favour of `ConnectionMetadata::builder`." + )] pub fn new( is_proxied: bool, remote_addr: Option, @@ -33,14 +38,26 @@ impl ConnectionMetadata { Self { is_proxied, remote_addr, + // need to use builder to set this field + local_addr: None, poison_fn: Arc::new(poison), } } + /// Builder for this connection metadata + pub fn builder() -> ConnectionMetadataBuilder { + ConnectionMetadataBuilder::new() + } + /// Get the remote address for this connection, if one is set. pub fn remote_addr(&self) -> Option { self.remote_addr } + + /// Get the local address for this connection, if one is set. + pub fn local_addr(&self) -> Option { + self.local_addr + } } impl Debug for ConnectionMetadata { @@ -48,6 +65,193 @@ impl Debug for ConnectionMetadata { f.debug_struct("SmithyConnection") .field("is_proxied", &self.is_proxied) .field("remote_addr", &self.remote_addr) + .field("local_addr", &self.local_addr) + .finish() + } +} + +/// Builder type that is used to construct a [`ConnectionMetadata`] value. +#[derive(Default)] +pub struct ConnectionMetadataBuilder { + is_proxied: Option, + remote_addr: Option, + local_addr: Option, + poison_fn: Option>, +} + +impl Debug for ConnectionMetadataBuilder { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ConnectionMetadataBuilder") + .field("is_proxied", &self.is_proxied) + .field("remote_addr", &self.remote_addr) + .field("local_addr", &self.local_addr) .finish() } } + +impl ConnectionMetadataBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Self::default() + } + + /// Set whether or not the associated connection is to an HTTP proxy. + pub fn proxied(mut self, proxied: bool) -> Self { + self.set_proxied(Some(proxied)); + self + } + + /// Set whether or not the associated connection is to an HTTP proxy. + pub fn set_proxied(&mut self, proxied: Option) -> &mut Self { + self.is_proxied = proxied; + self + } + + /// Set the remote address of the connection used. + pub fn remote_addr(mut self, remote_addr: SocketAddr) -> Self { + self.set_remote_addr(Some(remote_addr)); + self + } + + /// Set the remote address of the connection used. + pub fn set_remote_addr(&mut self, remote_addr: Option) -> &mut Self { + self.remote_addr = remote_addr; + self + } + + /// Set the local address of the connection used. + pub fn local_addr(mut self, local_addr: SocketAddr) -> Self { + self.set_local_addr(Some(local_addr)); + self + } + + /// Set the local address of the connection used. + pub fn set_local_addr(&mut self, local_addr: Option) -> &mut Self { + self.local_addr = local_addr; + self + } + + /// Set a closure which will poison the associated connection. + /// + /// A poisoned connection will not be reused for subsequent requests by the pool + pub fn poison_fn(mut self, poison_fn: impl Fn() + Send + Sync + 'static) -> Self { + self.set_poison_fn(Some(poison_fn)); + self + } + + /// Set a closure which will poison the associated connection. + /// + /// A poisoned connection will not be reused for subsequent requests by the pool + pub fn set_poison_fn( + &mut self, + poison_fn: Option, + ) -> &mut Self { + self.poison_fn = + poison_fn.map(|poison_fn| Arc::new(poison_fn) as Arc); + self + } + + /// Build a [`ConnectionMetadata`] value. + /// + /// # Panics + /// + /// If either the `is_proxied` or `poison_fn` has not been set, then this method will panic + pub fn build(self) -> ConnectionMetadata { + ConnectionMetadata { + is_proxied: self + .is_proxied + .expect("is_proxied should be set for ConnectionMetadata"), + remote_addr: self.remote_addr, + local_addr: self.local_addr, + poison_fn: self + .poison_fn + .expect("poison_fn should be set for ConnectionMetadata"), + } + } +} + +#[cfg(test)] +mod tests { + use std::{ + net::{IpAddr, Ipv6Addr}, + sync::Mutex, + }; + + use super::*; + + const TEST_SOCKET_ADDR: SocketAddr = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 100); + + #[test] + #[should_panic] + fn builder_panic_missing_proxied() { + ConnectionMetadataBuilder::new() + .poison_fn(|| {}) + .local_addr(TEST_SOCKET_ADDR) + .remote_addr(TEST_SOCKET_ADDR) + .build(); + } + + #[test] + #[should_panic] + fn builder_panic_missing_poison_fn() { + ConnectionMetadataBuilder::new() + .proxied(true) + .local_addr(TEST_SOCKET_ADDR) + .remote_addr(TEST_SOCKET_ADDR) + .build(); + } + + #[test] + fn builder_all_fields_successful() { + let mutable_flag = Arc::new(Mutex::new(false)); + + let connection_metadata = ConnectionMetadataBuilder::new() + .proxied(true) + .local_addr(TEST_SOCKET_ADDR) + .remote_addr(TEST_SOCKET_ADDR) + .poison_fn({ + let mutable_flag = Arc::clone(&mutable_flag); + move || { + let mut guard = mutable_flag.lock().unwrap(); + *guard = !*guard; + } + }) + .build(); + + assert_eq!(connection_metadata.is_proxied, true); + assert_eq!(connection_metadata.remote_addr(), Some(TEST_SOCKET_ADDR)); + assert_eq!(connection_metadata.local_addr(), Some(TEST_SOCKET_ADDR)); + assert_eq!(*mutable_flag.lock().unwrap(), false); + connection_metadata.poison(); + assert_eq!(*mutable_flag.lock().unwrap(), true); + } + + #[test] + fn builder_optional_fields_translate() { + let metadata1 = ConnectionMetadataBuilder::new() + .proxied(true) + .poison_fn(|| {}) + .build(); + + assert_eq!(metadata1.local_addr(), None); + assert_eq!(metadata1.remote_addr(), None); + + let metadata2 = ConnectionMetadataBuilder::new() + .proxied(true) + .poison_fn(|| {}) + .local_addr(TEST_SOCKET_ADDR) + .build(); + + assert_eq!(metadata2.local_addr(), Some(TEST_SOCKET_ADDR)); + assert_eq!(metadata2.remote_addr(), None); + + let metadata3 = ConnectionMetadataBuilder::new() + .proxied(true) + .poison_fn(|| {}) + .remote_addr(TEST_SOCKET_ADDR) + .build(); + + assert_eq!(metadata3.local_addr(), None); + assert_eq!(metadata3.remote_addr(), Some(TEST_SOCKET_ADDR)); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs index 6c3891a0db1..a82d242ebe3 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -100,7 +100,6 @@ impl Intercept for ConnectionPoisoningInterceptor { type LoaderFn = dyn Fn() -> Option + Send + Sync; /// State for a middleware that will monitor and manage connections. -#[allow(missing_debug_implementations)] #[derive(Clone, Default)] pub struct CaptureSmithyConnection { loader: Arc>>>, @@ -154,7 +153,14 @@ mod test { let retriever = CaptureSmithyConnection::new(); let retriever_clone = retriever.clone(); assert!(retriever.get().is_none()); - retriever.set_connection_retriever(|| Some(ConnectionMetadata::new(true, None, || {}))); + retriever.set_connection_retriever(|| { + Some( + ConnectionMetadata::builder() + .proxied(true) + .poison_fn(|| {}) + .build(), + ) + }); assert!(retriever.get().is_some()); assert!(retriever_clone.get().is_some()); diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs index ed29d067af5..e5aabaf81d0 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -287,14 +287,19 @@ fn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option(); - let smithy_connection = ConnectionMetadata::new( - conn.is_proxied(), - http_info.map(|info| info.remote_addr()), - move || match capture_conn.connection_metadata().as_ref() { + let mut builder = ConnectionMetadata::builder() + .proxied(conn.is_proxied()) + .poison_fn(move || match capture_conn.connection_metadata().as_ref() { Some(conn) => conn.poison(), None => tracing::trace!("no connection existed to poison"), - }, - ); + }); + + builder + .set_local_addr(http_info.map(|info| info.local_addr())) + .set_remote_addr(http_info.map(|info| info.remote_addr())); + + let smithy_connection = builder.build(); + Some(smithy_connection) } else { None From 48d1c559b81224b5ffb2120b5bc75533c872a284 Mon Sep 17 00:00:00 2001 From: Zelda Hessler Date: Wed, 6 Dec 2023 16:05:21 -0600 Subject: [PATCH 329/331] Gradle deprecation warning fixes (#3242) Fix deprecation warnings in the gradle build scripts, and upgrade jsoup and gson. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: ysaito1001 Co-authored-by: John DiSanti --- aws/sdk-adhoc-test/build.gradle.kts | 6 +- aws/sdk-codegen/build.gradle.kts | 6 +- .../smithy/rustsdk/AwsCrateDocsDecorator.kt | 2 +- aws/sdk/build.gradle.kts | 60 +++++++++---------- buildSrc/build.gradle.kts | 8 ++- codegen-client-test/build.gradle.kts | 4 +- codegen-client/build.gradle.kts | 4 +- codegen-core/build.gradle.kts | 12 ++-- codegen-server-test/build.gradle.kts | 4 +- codegen-server-test/python/build.gradle.kts | 5 +- .../typescript/build.gradle.kts | 3 +- codegen-server/build.gradle.kts | 2 +- codegen-server/python/build.gradle.kts | 2 +- codegen-server/typescript/build.gradle.kts | 2 +- rust-runtime/build.gradle.kts | 10 ++-- 15 files changed, 69 insertions(+), 61 deletions(-) diff --git a/aws/sdk-adhoc-test/build.gradle.kts b/aws/sdk-adhoc-test/build.gradle.kts index eb6c8cb76a3..53460ba9ceb 100644 --- a/aws/sdk-adhoc-test/build.gradle.kts +++ b/aws/sdk-adhoc-test/build.gradle.kts @@ -20,7 +20,7 @@ val pluginName = "rust-client-codegen" val workingDirUnderBuildDir = "smithyprojections/sdk-adhoc-test/" configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") + outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile } buildscript { @@ -80,13 +80,13 @@ val allCodegenTests = listOf( project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +project.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) +project.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile, defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/aws/sdk-codegen/build.gradle.kts b/aws/sdk-codegen/build.gradle.kts index fc52936daed..f2eb5b44929 100644 --- a/aws/sdk-codegen/build.gradle.kts +++ b/aws/sdk-codegen/build.gradle.kts @@ -23,7 +23,7 @@ val smithyVersion: String by project dependencies { implementation(project(":codegen-core")) implementation(project(":codegen-client")) - implementation("org.jsoup:jsoup:1.14.3") + implementation("org.jsoup:jsoup:1.15.3") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-rules-engine:$smithyVersion") @@ -86,7 +86,7 @@ if (isTestingEnabled.toBoolean()) { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } @@ -101,5 +101,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt index 60fa405adc1..bce5c6f0ef5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt @@ -322,7 +322,7 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon private fun Element.normalizeList(indent: Int = 1) { // First, replace nested lists - for (child in children().filter { it.tagName() == "li" }) { + for (child in children().filter { tag -> tag.tagName() == "li" }) { for (itemChild in child.children()) { if (itemChild.isList()) { itemChild.normalizeList(indent + 1) diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 21a8f130d40..e4eee8fd524 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -30,9 +30,9 @@ val properties = PropertyRetriever(rootProject, project) val crateHasherToolPath = rootProject.projectDir.resolve("tools/ci-build/crate-hasher") val publisherToolPath = rootProject.projectDir.resolve("tools/ci-build/publisher") val sdkVersionerToolPath = rootProject.projectDir.resolve("tools/ci-build/sdk-versioner") -val outputDir = buildDir.resolve("aws-sdk") -val sdkOutputDir = outputDir.resolve("sdk") -val examplesOutputDir = outputDir.resolve("examples") +val outputDir = layout.buildDirectory.dir("aws-sdk").get() +val sdkOutputDir = outputDir.dir("sdk") +val examplesOutputDir = outputDir.dir("examples") buildscript { val smithyVersion: String by project @@ -147,7 +147,7 @@ tasks.register("generateSmithyBuild") { outputs.file(layout.buildDirectory.file("smithy-build.json")) doFirst { - buildDir.resolve("smithy-build.json").writeText(generateSmithyBuild(awsServices)) + layout.buildDirectory.file("smithy-build.json").get().asFile.writeText(generateSmithyBuild(awsServices)) } outputs.upToDateWhen { false } } @@ -156,7 +156,7 @@ tasks.register("generateIndexMd") { dependsOn("smithyBuildJar") inputs.property("servicelist", awsServices.services.toString()) - val indexMd = outputDir.resolve("index.md") + val indexMd = outputDir.file("index.md").asFile outputs.file(indexMd) doLast { project.docsLandingPage(awsServices, indexMd) @@ -171,22 +171,22 @@ tasks.register("relocateServices") { awsServices.services.forEach { logger.info("Relocating ${it.module}...") copy { - from("$buildDir/smithyprojections/sdk/${it.module}/rust-client-codegen") - into(sdkOutputDir.resolve(it.module)) + from(layout.buildDirectory.dir("smithyprojections/sdk/${it.module}/rust-client-codegen")) + into(sdkOutputDir.dir(it.module)) } copy { from(projectDir.resolve("integration-tests/${it.module}/tests")) - into(sdkOutputDir.resolve(it.module).resolve("tests")) + into(sdkOutputDir.dir(it.module).dir("tests")) } copy { from(projectDir.resolve("integration-tests/${it.module}/benches")) - into(sdkOutputDir.resolve(it.module).resolve("benches")) + into(sdkOutputDir.dir(it.module).dir("benches")) } } } - inputs.dir(layout.buildDirectory.dir("smithyprojections/sdk/")) + inputs.dir(layout.buildDirectory.dir("smithyprojections/sdk")) outputs.dir(sdkOutputDir) } @@ -226,7 +226,7 @@ tasks.register("relocateTests") { awsServices.rootTests.forEach { test -> include(test.path.toRelativeString(testDir) + "/**") } - into(outputDir.resolve("tests")) + into(outputDir.dir("tests")) exclude("**/target") filter { line -> line.replace("build/aws-sdk/sdk/", "sdk/") } } @@ -247,9 +247,9 @@ tasks.register("fixExampleManifests") { binaryName = "sdk-versioner" arguments = listOf( "use-path-and-version-dependencies", - "--sdk-path", sdkOutputDir.absolutePath, - "--versions-toml", outputDir.resolve("versions.toml").absolutePath, - outputDir.resolve("examples").absolutePath, + "--sdk-path", sdkOutputDir.asFile.absolutePath, + "--versions-toml", outputDir.file("versions.toml").asFile.absolutePath, + outputDir.dir("examples").asFile.absolutePath, ) outputs.dir(outputDir) @@ -286,7 +286,7 @@ tasks.register("relocateAwsRuntime") { doLast { // Patch the Cargo.toml files CrateSet.AWS_SDK_RUNTIME.forEach { module -> - patchFile(sdkOutputDir.resolve("${module.name}/Cargo.toml")) { line -> + patchFile(sdkOutputDir.file("${module.name}/Cargo.toml").asFile) { line -> rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line.let(::rewritePathDependency)) } } @@ -297,7 +297,7 @@ tasks.register("relocateRuntime") { doLast { // Patch the Cargo.toml files CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { module -> - patchFile(sdkOutputDir.resolve("${module.name}/Cargo.toml")) { line -> + patchFile(sdkOutputDir.file("${module.name}/Cargo.toml").asFile) { line -> rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line) } } @@ -325,9 +325,9 @@ fun generateCargoWorkspace(services: AwsServices): String { tasks.register("generateCargoWorkspace") { description = "generate Cargo.toml workspace file" doFirst { - outputDir.mkdirs() - outputDir.resolve("Cargo.toml").writeText(generateCargoWorkspace(awsServices)) - rootProject.rootDir.resolve("clippy-root.toml").copyTo(outputDir.resolve("clippy.toml"), overwrite = true) + outputDir.asFile.mkdirs() + outputDir.file("Cargo.toml").asFile.writeText(generateCargoWorkspace(awsServices)) + rootProject.rootDir.resolve("clippy-root.toml").copyTo(outputDir.file("clippy.toml").asFile, overwrite = true) } inputs.property("servicelist", awsServices.moduleNames.toString()) if (awsServices.examples.isNotEmpty()) { @@ -336,8 +336,8 @@ tasks.register("generateCargoWorkspace") { for (test in awsServices.rootTests) { inputs.dir(test.path) } - outputs.file(outputDir.resolve("Cargo.toml")) - outputs.file(outputDir.resolve("clippy.toml")) + outputs.file(outputDir.file("Cargo.toml")) + outputs.file(outputDir.file("clippy.toml")) outputs.upToDateWhen { false } } @@ -354,7 +354,7 @@ tasks.register("fixManifests") { toolPath = publisherToolPath binaryName = "publisher" - arguments = mutableListOf("fix-manifests", "--location", outputDir.absolutePath).apply { + arguments = mutableListOf("fix-manifests", "--location", outputDir.asFile.absolutePath).apply { if (crateVersioner.independentVersioningEnabled()) { add("--disable-version-number-validation") } @@ -367,16 +367,16 @@ tasks.register("hydrateReadme") { inputs.dir(publisherToolPath) inputs.file(rootProject.projectDir.resolve("aws/SDK_README.md.hb")) - outputs.file(outputDir.resolve("README.md").absolutePath) + outputs.file(outputDir.file("README.md").asFile.absolutePath) toolPath = publisherToolPath binaryName = "publisher" arguments = listOf( "hydrate-readme", - "--versions-manifest", outputDir.resolve("versions.toml").toString(), + "--versions-manifest", outputDir.file("versions.toml").toString(), "--msrv", getRustMSRV(), "--input", rootProject.projectDir.resolve("aws/SDK_README.md.hb").toString(), - "--output", outputDir.resolve("README.md").absolutePath, + "--output", outputDir.file("README.md").asFile.absolutePath, ) } @@ -398,11 +398,11 @@ tasks.register("generateVersionManifest") { arguments = mutableListOf( "generate-version-manifest", "--input-location", - sdkOutputDir.absolutePath, + sdkOutputDir.asFile.absolutePath, "--output-location", - outputDir.absolutePath, + outputDir.asFile.absolutePath, "--smithy-build", - buildDir.resolve("smithy-build.json").normalize().absolutePath, + layout.buildDirectory.file("smithy-build.json").get().asFile.normalize().absolutePath, "--examples-revision", properties.get("aws.sdk.examples.revision") ?: "missing", ).apply { @@ -439,8 +439,8 @@ tasks["assemble"].apply { outputs.upToDateWhen { false } } -project.registerCargoCommandsTasks(outputDir, defaultRustDocFlags) -project.registerGenerateCargoConfigTomlTask(outputDir) +project.registerCargoCommandsTasks(outputDir.asFile, defaultRustDocFlags) +project.registerGenerateCargoConfigTomlTask(outputDir.asFile) tasks["test"].dependsOn("assemble") tasks["test"].finalizedBy(Cargo.CLIPPY.toString, Cargo.TEST.toString, Cargo.DOCS.toString) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 7dd86dd69eb..956afdc1a10 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -33,6 +33,12 @@ dependencies { implementation(gradleApi()) implementation("com.moandjiezana.toml:toml4j:0.7.2") testImplementation("org.junit.jupiter:junit-jupiter:5.6.1") + + constraints { + implementation("com.google.code.gson:gson:2.8.9") { + because("transitive dependency of toml4j has vulnerabilities; this upgrades it to the patched version") + } + } } tasks.test { @@ -52,7 +58,7 @@ tasks.jacocoTestReport { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index 606d868ccff..56d7a49763a 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -119,7 +119,7 @@ val allCodegenTests = listOf( project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +project.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile) tasks["generateSmithyBuild"].inputs.property("smithy.runtime.mode", getSmithyRuntimeMode()) @@ -127,7 +127,7 @@ tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) +project.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile, defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/codegen-client/build.gradle.kts b/codegen-client/build.gradle.kts index 919c1fe9bbc..baed9a9b914 100644 --- a/codegen-client/build.gradle.kts +++ b/codegen-client/build.gradle.kts @@ -90,7 +90,7 @@ if (isTestingEnabled.toBoolean()) { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } @@ -105,5 +105,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-core/build.gradle.kts b/codegen-core/build.gradle.kts index 0213e423a50..c4b32832896 100644 --- a/codegen-core/build.gradle.kts +++ b/codegen-core/build.gradle.kts @@ -23,7 +23,7 @@ val smithyVersion: String by project dependencies { implementation(kotlin("stdlib-jdk8")) - implementation("org.jsoup:jsoup:1.14.3") + implementation("org.jsoup:jsoup:1.15.3") api("software.amazon.smithy:smithy-codegen-core:$smithyVersion") api("com.moandjiezana.toml:toml4j:0.7.2") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") @@ -56,8 +56,8 @@ val generateSmithyRuntimeCrateVersion by tasks.registering { fun kv(key: String, value: String) = "\"$key\": \"$value\"" // generate the version of the runtime to use as a resource. // this keeps us from having to manually change version numbers in multiple places - val resourcesDir = "$buildDir/resources/main/software/amazon/smithy/rust/codegen/core" - val versionFile = file("$resourcesDir/runtime-crate-version.txt") + val resourcesDir = layout.buildDirectory.dir("resources/main/software/amazon/smithy/rust/codegen/core") + val versionFile = resourcesDir.get().file("runtime-crate-version.txt") outputs.file(versionFile) val stableCrateVersion = project.properties["smithy.rs.runtime.crate.stable.version"].toString() val unstableCrateVersion = project.properties["smithy.rs.runtime.crate.unstable.version"].toString() @@ -93,7 +93,7 @@ val generateSmithyRuntimeCrateVersion by tasks.registering { sourceSets.main.get().output.dir(resourcesDir) doLast { - versionFile.writeText(version.toString()) + versionFile.asFile.writeText(version.toString()) } } @@ -154,7 +154,7 @@ if (isTestingEnabled.toBoolean()) { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } @@ -169,5 +169,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-server-test/build.gradle.kts b/codegen-server-test/build.gradle.kts index 2585c988602..c0bd373b4ed 100644 --- a/codegen-server-test/build.gradle.kts +++ b/codegen-server-test/build.gradle.kts @@ -98,13 +98,13 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels -> project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +project.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace", "generateCargoConfigToml") project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) +project.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile, defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/codegen-server-test/python/build.gradle.kts b/codegen-server-test/python/build.gradle.kts index 11bc96ac67a..52f55a8dfe8 100644 --- a/codegen-server-test/python/build.gradle.kts +++ b/codegen-server-test/python/build.gradle.kts @@ -16,12 +16,13 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) +val buildDir = layout.buildDirectory.get().asFile val pluginName = "rust-server-codegen-python" val workingDirUnderBuildDir = "smithyprojections/codegen-server-test-python/" configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") + outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile } buildscript { @@ -111,7 +112,7 @@ tasks.register("stubs") { doLast { allCodegenTests.forEach { test -> - val crateDir = "$buildDir/$workingDirUnderBuildDir/${test.module}/$pluginName" + val crateDir = layout.buildDirectory.dir("$workingDirUnderBuildDir/${test.module}/$pluginName").get().asFile.path val moduleName = test.module.replace("-", "_") exec { commandLine("bash", "$crateDir/stubgen.sh", moduleName, "$crateDir/Cargo.toml", "$crateDir/python/$moduleName") diff --git a/codegen-server-test/typescript/build.gradle.kts b/codegen-server-test/typescript/build.gradle.kts index 8b65d53239b..6ccc03fb508 100644 --- a/codegen-server-test/typescript/build.gradle.kts +++ b/codegen-server-test/typescript/build.gradle.kts @@ -16,12 +16,13 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) +val buildDir = layout.buildDirectory.get().asFile val pluginName = "rust-server-codegen-typescript" val workingDirUnderBuildDir = "smithyprojections/codegen-server-test-typescript/" configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") + outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile } buildscript { diff --git a/codegen-server/build.gradle.kts b/codegen-server/build.gradle.kts index f5b2f5bc29a..be9709471ed 100644 --- a/codegen-server/build.gradle.kts +++ b/codegen-server/build.gradle.kts @@ -85,5 +85,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-server/python/build.gradle.kts b/codegen-server/python/build.gradle.kts index ac792966a92..337d099bccb 100644 --- a/codegen-server/python/build.gradle.kts +++ b/codegen-server/python/build.gradle.kts @@ -85,5 +85,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-server/typescript/build.gradle.kts b/codegen-server/typescript/build.gradle.kts index b6dfa39a8f1..81f543c2220 100644 --- a/codegen-server/typescript/build.gradle.kts +++ b/codegen-server/typescript/build.gradle.kts @@ -82,5 +82,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/rust-runtime/build.gradle.kts b/rust-runtime/build.gradle.kts index ff41f1cd859..8c2fd8c054b 100644 --- a/rust-runtime/build.gradle.kts +++ b/rust-runtime/build.gradle.kts @@ -21,8 +21,8 @@ tasks.jar { } val properties = PropertyRetriever(rootProject, project) -val outputDir = buildDir.resolve("smithy-rs") -val runtimeOutputDir = outputDir.resolve("rust-runtime") +val outputDir = layout.buildDirectory.dir("smithy-rs") +val runtimeOutputDir = outputDir.get().dir("rust-runtime") tasks["assemble"].apply { dependsOn("copyRuntimeCrates") @@ -44,7 +44,7 @@ tasks.register("fixRuntimeCrateVersions") { dependsOn("copyRuntimeCrates") doLast { CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { module -> - patchFile(runtimeOutputDir.resolve("${module.name}/Cargo.toml")) { line -> + patchFile(runtimeOutputDir.file("${module.name}/Cargo.toml").asFile) { line -> rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line) } } @@ -55,7 +55,7 @@ tasks.register("fixManifests") { description = "Run the publisher tool's `fix-manifests` sub-command on the runtime crates" toolPath = rootProject.projectDir.resolve("tools/ci-build/publisher") binaryName = "publisher" - arguments = listOf("fix-manifests", "--location", runtimeOutputDir.absolutePath) + arguments = listOf("fix-manifests", "--location", runtimeOutputDir.asFile.absolutePath) dependsOn("fixRuntimeCrateVersions") } @@ -65,5 +65,5 @@ publishing { from(components["java"]) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } From 1c445774d00df7a049e05eae9af21cd01b95a990 Mon Sep 17 00:00:00 2001 From: ysaito1001 Date: Wed, 6 Dec 2023 17:00:41 -0600 Subject: [PATCH 330/331] Use a `rustv1` directory from `aws-doc-sdk-examples` (#3287) ## Motivation and Context This PR is a cleanup after https://github.com/smithy-lang/smithy-rs/pull/3115, fully switching to `rustv1` for the rust example directory in [aws-doc-sdk-examples](https://github.com/awsdocs/aws-doc-sdk-examples). ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- .github/workflows/ci.yml | 1 - tools/ci-build/sdk-versioner/README.md | 4 ++-- tools/ci-scripts/generate-aws-sdk | 7 +------ 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68205ac234c..c56ec564cfd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,7 +65,6 @@ jobs: with: repository: awsdocs/aws-doc-sdk-examples path: aws-doc-sdk-examples - ref: rust-launch - name: Run ${{ matrix.actions.action }} uses: ./smithy-rs/.github/actions/docker-build with: diff --git a/tools/ci-build/sdk-versioner/README.md b/tools/ci-build/sdk-versioner/README.md index 1d430544669..45247fd4c58 100644 --- a/tools/ci-build/sdk-versioner/README.md +++ b/tools/ci-build/sdk-versioner/README.md @@ -12,12 +12,12 @@ Example updating SDK examples to use SDK version 0.5.0 with Smithy version 0.35. $ sdk-versioner \ --sdk-version 0.5.0 \ --smithy-version 0.35.0 \ - path/to/aws-doc-sdk-examples/rust + path/to/aws-doc-sdk-examples/rustv1 ``` Example updating SDK examples to refer to local generated code: ```bash $ sdk-versioner \ --sdk-path path/to/smithy-rs/aws/sdk/build/aws-sdk/sdk \ - path/to/aws-doc-sdk-examples/rust + path/to/aws-doc-sdk-examples/rustv1 ``` diff --git a/tools/ci-scripts/generate-aws-sdk b/tools/ci-scripts/generate-aws-sdk index 36db805639a..b9766cec27a 100755 --- a/tools/ci-scripts/generate-aws-sdk +++ b/tools/ci-scripts/generate-aws-sdk @@ -23,12 +23,7 @@ fi echo -e "${C_YELLOW}Taking examples from 'awsdocs/aws-doc-sdk-examples'...${C_RESET}" examples_revision=$(cd aws-doc-sdk-examples; git rev-parse HEAD) -# TODO(removeSdkExamplesDevPreview): One release after `rust_dev_preview` is renamed to `rust`, this check can be cleaned up -if [[ -d "aws-doc-sdk-examples/rust" ]]; then - mv aws-doc-sdk-examples/rust smithy-rs/aws/sdk/examples -else - mv aws-doc-sdk-examples/rust_dev_preview smithy-rs/aws/sdk/examples -fi +mv aws-doc-sdk-examples/rustv1 smithy-rs/aws/sdk/examples rm -rf smithy-rs/aws/sdk/examples/.cargo echo -e "${C_YELLOW}Creating empty model metadata file since we don't have model update information...${C_RESET}" From 82b190cd246ee32652222e4f114c7f4840c6f802 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Wed, 6 Dec 2023 15:28:03 -0800 Subject: [PATCH 331/331] Upgrade canary-runner to 1.x and fix bundle naming issue (#3289) The SDK canary was failing due to the `.N` suffix on release tags (see https://github.com/awslabs/aws-sdk-rust/issues/993). This change upgrades the canary to the 1.x SDK and also fixes the bundle naming issue by removing periods. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --- tools/ci-cdk/canary-runner/Cargo.lock | 1146 ++++++++++------- tools/ci-cdk/canary-runner/Cargo.toml | 8 +- .../ci-cdk/canary-runner/src/build_bundle.rs | 11 +- 3 files changed, 705 insertions(+), 460 deletions(-) diff --git a/tools/ci-cdk/canary-runner/Cargo.lock b/tools/ci-cdk/canary-runner/Cargo.lock index 9ec158de434..4af4fa079b4 100644 --- a/tools/ci-cdk/canary-runner/Cargo.lock +++ b/tools/ci-cdk/canary-runner/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -49,24 +49,24 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "async-recursion" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" +checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] @@ -88,19 +88,21 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.56.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3d533e0263bf453cc80af4c8bcc4d64e2aca293bd16f81633a36f1bf4a97cb" +checksum = "004dc45f6b869e6a70725df448004a720b7f52f6607d55d8815cbd5448f86def" dependencies = [ "aws-credential-types", "aws-http", + "aws-runtime", "aws-sdk-sso", + "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", @@ -108,52 +110,46 @@ dependencies = [ "hex", "http", "hyper", - "ring", + "ring 0.17.7", "time", "tokio", - "tower", "tracing", "zeroize", ] [[package]] name = "aws-credential-types" -version = "0.56.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4834ba01c5ad1ed9740aa222de62190e3c565d11ab7e72cc68314a258994567" +checksum = "cfa51c87f10211f37cd78e6d01d6f18b3f96a086906ed361d11e04ac53e29508" dependencies = [ "aws-smithy-async", + "aws-smithy-runtime-api", "aws-smithy-types", - "fastrand", - "tokio", - "tracing", "zeroize", ] [[package]] name = "aws-http" -version = "0.56.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72badf9de83cc7d66b21b004f09241836823b8302afb25a24708769e576a8d8f" +checksum = "361c4310fdce94328cc2d1ca0c8a48c13f43009c61d3367585685a50ca8c66b6" dependencies = [ - "aws-credential-types", - "aws-smithy-http", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "http", "http-body", - "lazy_static", - "percent-encoding", "pin-project-lite", "tracing", ] [[package]] name = "aws-runtime" -version = "0.56.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf832f522111225c02547e1e1c28137e840e4b082399d93a236e4b29193a4667" +checksum = "ce0953f7fc1c4428511345e28ea3e98c8b59c9e91eafae30bf76d71d70642693" dependencies = [ "aws-credential-types", "aws-http", @@ -173,15 +169,14 @@ dependencies = [ [[package]] name = "aws-sdk-cloudwatch" -version = "0.29.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "babb00ade826c2e4f25ab1872ed04b8d1f3ffd83e4d1220103f4d1281f9b7991" +checksum = "b7b55285ad9dde6bcb462e444cc98bd1918a566e035c35b8269d4e6b976f9994" dependencies = [ "aws-credential-types", "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", "aws-smithy-json", "aws-smithy-query", @@ -192,21 +187,19 @@ dependencies = [ "aws-types", "http", "regex", - "tokio-stream", "tracing", ] [[package]] name = "aws-sdk-lambda" -version = "0.29.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2261df7dfd05837950109a0aa35be7d5f905afad20015a89d1fb14c7e662c9b" +checksum = "66f1a1b5fdd170f38b740c88e955d7e1bb18b6a2f09487da0fbae0b5918d017b" dependencies = [ "aws-credential-types", "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", @@ -216,15 +209,14 @@ dependencies = [ "bytes", "http", "regex", - "tokio-stream", "tracing", ] [[package]] name = "aws-sdk-s3" -version = "0.29.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e30370b61599168d38190ad272bb91842cd81870a6ca035c05dd5726d22832c" +checksum = "959a7325827d882819a2ac77e27e26626b9713b9cfec44686785e0db6e73388f" dependencies = [ "aws-credential-types", "aws-http", @@ -232,7 +224,6 @@ dependencies = [ "aws-sigv4", "aws-smithy-async", "aws-smithy-checksums", - "aws-smithy-client", "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-json", @@ -247,22 +238,42 @@ dependencies = [ "once_cell", "percent-encoding", "regex", - "tokio-stream", "tracing", "url", ] [[package]] name = "aws-sdk-sso" -version = "0.29.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41bf2c28d32dbb9894a8fcfcb148265d034d3f4a170552a47553a09de890895" +checksum = "8e0b81eaef9eb951061b5a58f660815430e3f04eacaa4b2318e7474b0b7cbf17" +dependencies = [ + "aws-credential-types", + "aws-http", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-sdk-ssooidc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e322a916694038a7972a3bb12181151c1645914443a2c3be6379b27533bbb99" dependencies = [ "aws-credential-types", "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", @@ -272,21 +283,19 @@ dependencies = [ "bytes", "http", "regex", - "tokio-stream", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "0.29.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e21aa1a5b0853969a1ef96ccfaa8ff5d57c761549786a4d5f86c1902b2586a" +checksum = "bbee86e8d9b1be709bd0f38b9ab3f196e39b0b6f3262a0a919a9d30f25debd94" dependencies = [ "aws-credential-types", "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", "aws-smithy-json", "aws-smithy-query", @@ -302,42 +311,49 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.56.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb40a93429794065f41f0581734fc56a345f6a38d8e2e3c25c7448d930cd132" +checksum = "b6bcbad6e0f130232b22e4b4e28834348ce5b79c23b5059b387c08fd0dc8f876" dependencies = [ + "aws-credential-types", "aws-smithy-eventstream", "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", "bytes", + "crypto-bigint 0.5.5", "form_urlencoded", "hex", "hmac", "http", "once_cell", + "p256", "percent-encoding", "regex", + "ring 0.17.7", "sha2", + "subtle", "time", "tracing", + "zeroize", ] [[package]] name = "aws-smithy-async" -version = "0.56.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cdb73f85528b9d19c23a496034ac53703955a59323d581c06aa27b4e4e247af" +checksum = "573441a5a0219e436e86a7f9a20b0f2505c5ae6fe7fe3eba6e3950991c9ad914" dependencies = [ "futures-util", "pin-project-lite", "tokio", - "tokio-stream", ] [[package]] name = "aws-smithy-checksums" -version = "0.56.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb15946af1b8d3beeff53ad991d9bff68ac22426b6d40372b958a75fa61eaed" +checksum = "c5a373ec01aede3dd066ec018c1bc4e8f5dd11b2c11c59c8eef1a5c68101f397" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -354,35 +370,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-smithy-client" -version = "0.56.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27b2756264c82f830a91cb4d2d485b2d19ad5bea476d9a966e03d27f27ba59a" -dependencies = [ - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-types", - "bytes", - "fastrand", - "http", - "http-body", - "hyper", - "hyper-rustls", - "lazy_static", - "pin-project-lite", - "rustls", - "tokio", - "tower", - "tracing", -] - [[package]] name = "aws-smithy-eventstream" -version = "0.56.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850233feab37b591b7377fd52063aa37af615687f5896807abe7f49bd4e1d25b" +checksum = "1c669e1e5fc0d79561bf7a122b118bd50c898758354fe2c53eb8f2d31507cbc3" dependencies = [ "aws-smithy-types", "bytes", @@ -391,57 +383,39 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.56.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cdcf365d8eee60686885f750a34c190e513677db58bbc466c44c588abf4199" +checksum = "5b1de8aee22f67de467b2e3d0dd0fb30859dc53f579a63bd5381766b987db644" dependencies = [ "aws-smithy-eventstream", + "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "bytes-utils", "futures-core", "http", "http-body", - "hyper", "once_cell", "percent-encoding", "pin-project-lite", "pin-utils", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "aws-smithy-http-tower" -version = "0.56.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822de399d0ce62829a69dfa8c5cd08efdbe61a7426b953e2268f8b8b52a607bd" -dependencies = [ - "aws-smithy-http", - "aws-smithy-types", - "bytes", - "http", - "http-body", - "pin-project-lite", - "tower", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.56.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1e7ab8fa7ad10c193af7ae56d2420989e9f4758bf03601a342573333ea34f" +checksum = "6a46dd338dc9576d6a6a5b5a19bd678dcad018ececee11cf28ecd7588bd1a55c" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-query" -version = "0.56.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28556a3902091c1f768a34f6c998028921bdab8d47d92586f363f14a4a32d047" +checksum = "feb5b8c7a86d4b6399169670723b7e6f21a39fc833a30f5c5a2f997608178129" dependencies = [ "aws-smithy-types", "urlencoding", @@ -449,74 +423,86 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "0.56.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745e096b3553e7e0f40622aa04971ce52765af82bebdeeac53aa6fc82fe801e6" +checksum = "c0c628feae802ab1589936e2aaef6f8ab2b8fc1ee1f947c276dd8a7c3cda1904" dependencies = [ "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "fastrand", + "h2", "http", "http-body", + "hyper", + "hyper-rustls", "once_cell", "pin-project-lite", "pin-utils", + "rustls", "tokio", "tracing", ] [[package]] name = "aws-smithy-runtime-api" -version = "0.56.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d0ae0c9cfd57944e9711ea610b48a963fb174a53aabacc08c5794a594b1d02" +checksum = "7460e5cc8e6eb0749608535854352f6e121433960ba05daf4dbde0e42c1199a5" dependencies = [ "aws-smithy-async", - "aws-smithy-http", "aws-smithy-types", "bytes", "http", + "pin-project-lite", "tokio", "tracing", + "zeroize", ] [[package]] name = "aws-smithy-types" -version = "0.56.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90dbc8da2f6be461fa3c1906b20af8f79d14968fe47f2b7d29d086f62a51728" +checksum = "8ba838f43d0d72d76918895a93c3ad647f75a058541a60e85beefb6bb0a9bd40" dependencies = [ "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", "itoa", "num-integer", + "pin-project-lite", + "pin-utils", "ryu", "serde", "time", + "tokio", + "tokio-util", ] [[package]] name = "aws-smithy-xml" -version = "0.56.1" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01d2dedcdd8023043716cfeeb3c6c59f2d447fce365d8e194838891794b23b6" +checksum = "0ec40d74a67fd395bc3f6b4ccbdf1543672622d905ef3f979689aea5b730cb95" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.56.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bceb8cf724ad057ad7f327d0d256d7147b3eac777b39849a26189e003dc9782" +checksum = "faa59f6f26a3472ca2ce7e7802d037a0a9a7ac23de5761eadd9b68f31ac4fd21" dependencies = [ "aws-credential-types", "aws-smithy-async", - "aws-smithy-client", - "aws-smithy-http", + "aws-smithy-runtime-api", "aws-smithy-types", "http", "rustc_version", @@ -538,6 +524,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base64" version = "0.13.1" @@ -546,9 +538,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.2" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64-simd" @@ -560,6 +552,12 @@ dependencies = [ "vsimd", ] +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -568,9 +566,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block-buffer" @@ -583,30 +581,30 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] [[package]] name = "bytes-utils" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" dependencies = [ "bytes", "either", @@ -657,15 +655,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -678,7 +676,7 @@ dependencies = [ "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "once_cell", "strsim", "termcolor", @@ -707,11 +705,17 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -719,15 +723,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -759,6 +763,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "rand_core", + "subtle", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -769,11 +795,24 @@ dependencies = [ "typenum", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] [[package]] name = "diff" @@ -794,9 +833,21 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] [[package]] name = "either" @@ -804,6 +855,26 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint 0.4.9", + "der", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.33" @@ -814,37 +885,42 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.2" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "ff" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core", + "subtle", +] [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -873,18 +949,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -897,9 +973,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -907,15 +983,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -924,38 +1000,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -981,9 +1057,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "js-sys", @@ -994,15 +1070,26 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core", + "subtle", +] [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1010,7 +1097,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1023,6 +1110,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" @@ -1040,9 +1133,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -1061,9 +1154,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1110,7 +1203,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1119,9 +1212,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", @@ -1148,16 +1241,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1171,9 +1264,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1186,7 +1279,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", ] [[package]] @@ -1203,9 +1306,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itoa" @@ -1215,9 +1318,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1228,9 +1331,9 @@ version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ - "base64 0.21.2", + "base64 0.21.5", "pem", - "ring", + "ring 0.16.20", "serde", "serde_json", "simple_asn1", @@ -1244,21 +1347,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1284,24 +1387,25 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "mime" @@ -1330,13 +1434,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1390,9 +1494,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -1403,15 +1507,15 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.3.3", "libc", ] [[package]] name = "object" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -1438,7 +1542,7 @@ dependencies = [ "reqwest-middleware", "reqwest-retry", "reqwest-tracing", - "ring", + "ring 0.16.20", "schemars", "serde", "serde_json", @@ -1457,11 +1561,11 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.56" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -1478,7 +1582,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] @@ -1489,9 +1593,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -1501,9 +1605,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "outref" @@ -1517,6 +1621,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -1535,7 +1650,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", + "parking_lot_core 0.9.9", ] [[package]] @@ -1554,15 +1669,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1587,35 +1702,15 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1623,12 +1718,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1671,9 +1782,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -1728,23 +1839,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -1758,13 +1869,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.8.2", ] [[package]] @@ -1775,17 +1886,17 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.19" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b9b67e2ca7dd9e9f9285b759de30ff538aab981abaaf7bc9bd90b84a0126c3" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.2", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -1810,6 +1921,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -1836,9 +1948,9 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff44108c7925d082f2861e683a88618b68235ad9cdc60d64d9d1188efc951cdb" +checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690" dependencies = [ "anyhow", "async-trait", @@ -1851,9 +1963,9 @@ dependencies = [ [[package]] name = "reqwest-retry" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d0fd6ef4c6d23790399fe15efc8d12cd9f3d4133958f9bd7801ee5cbaec6c4" +checksum = "5c6a11c05102e5bec712c0619b8c7b7eda8b21a558a0bd981ceee15c38df8be4" dependencies = [ "anyhow", "async-trait", @@ -1899,6 +2011,17 @@ dependencies = [ "rand", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "ring" version = "0.16.20" @@ -1908,12 +2031,26 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1931,25 +2068,25 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.8" +version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.6" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring", + "ring 0.17.7", "rustls-webpki", "sct", ] @@ -1968,21 +2105,21 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.2", + "base64 0.21.5", ] [[package]] name = "rustls-webpki" -version = "0.101.4" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] @@ -1997,14 +2134,14 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "schemars" -version = "0.8.12" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "bytes", "chrono", @@ -2018,9 +2155,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.12" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -2036,12 +2173,26 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", ] [[package]] @@ -2069,28 +2220,28 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.185" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.185" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] @@ -2106,9 +2257,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -2129,9 +2280,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -2140,9 +2291,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -2151,9 +2302,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -2167,6 +2318,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "simple_asn1" version = "0.6.2" @@ -2190,9 +2351,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smithy-rs-tool-common" @@ -2213,9 +2374,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -2223,12 +2384,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2237,6 +2398,22 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "strsim" version = "0.10.0" @@ -2262,15 +2439,36 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "task-local-extensions" version = "0.1.4" @@ -2282,22 +2480,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] @@ -2310,22 +2508,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] @@ -2340,12 +2538,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -2353,15 +2552,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -2383,9 +2582,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2395,20 +2594,20 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.3", + "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] @@ -2431,22 +2630,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -2462,32 +2650,10 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap", + "indexmap 1.9.3", "serde", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -2496,12 +2662,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2509,20 +2673,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -2530,20 +2694,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -2565,9 +2729,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" @@ -2580,15 +2744,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -2605,11 +2769,17 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -2625,9 +2795,9 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uuid" -version = "1.4.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", "serde", @@ -2674,9 +2844,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2684,24 +2854,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -2711,9 +2881,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2721,22 +2891,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-timer" @@ -2755,9 +2925,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -2765,9 +2935,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "winapi" @@ -2787,9 +2957,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -2801,12 +2971,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2815,7 +2985,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -2824,13 +3003,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -2839,42 +3033,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winreg" version = "0.50.0" @@ -2882,14 +3118,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "xmlparser" -version = "0.13.5" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "yansi" @@ -2899,9 +3135,9 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] name = "zip" diff --git a/tools/ci-cdk/canary-runner/Cargo.toml b/tools/ci-cdk/canary-runner/Cargo.toml index 27d4983685b..d0d6cef2b7e 100644 --- a/tools/ci-cdk/canary-runner/Cargo.toml +++ b/tools/ci-cdk/canary-runner/Cargo.toml @@ -12,10 +12,10 @@ publish = false [dependencies] anyhow = "1" async-trait = "0.1.56" -aws-config = "0.56.0" -aws-sdk-cloudwatch = "0.29.0" -aws-sdk-lambda = "0.29.0" -aws-sdk-s3 = "0.29.0" +aws-config = { version = "1", features = ["behavior-version-latest"] } +aws-sdk-cloudwatch = "1" +aws-sdk-lambda = "1" +aws-sdk-s3 = "1" base64 = "0.13" clap = { version = "3.2.17", features = ["derive"] } hex = "0.4.3" diff --git a/tools/ci-cdk/canary-runner/src/build_bundle.rs b/tools/ci-cdk/canary-runner/src/build_bundle.rs index 4da1e0b4c98..237740991d1 100644 --- a/tools/ci-cdk/canary-runner/src/build_bundle.rs +++ b/tools/ci-cdk/canary-runner/src/build_bundle.rs @@ -215,7 +215,7 @@ fn name_hashed_bundle( // Lambda function names can't have periods in them let rust_version = rust_version.map(|s| s.replace('.', "")); let rust_version = rust_version.as_deref().unwrap_or("unknown"); - let sdk_release_tag = sdk_release_tag.map(|s| s.to_string().replace('-', "")); + let sdk_release_tag = sdk_release_tag.map(|s| s.to_string().replace(['-', '.'], "")); let sdk_release_tag = sdk_release_tag.as_deref().unwrap_or("untagged"); Ok(format!( "canary-{sdk_release_tag}-{rust_version}-{bin_hash}.zip" @@ -549,6 +549,15 @@ default = ["latest"] ) .unwrap(), ); + check( + "canary-release202212162-1621-7ae6085d2105d5d1e13b10f8.zip", + &name_hashed_bundle( + "7ae6085d2105d5d1e13b10f882c6cb072ff5bbf8", + Some("1.62.1"), + Some(&ReleaseTag::from_str("release-2022-12-16.2").unwrap()), + ) + .unwrap(), + ); check( "canary-untagged-1621-7ae6085d2105d5d1e13b10f8.zip", &name_hashed_bundle(